From 0d8df43d97079d38206cb56cfe15668a137c7d5a Mon Sep 17 00:00:00 2001 From: Stephen Paul Weber Date: Fri, 15 Nov 2024 11:23:22 -0500 Subject: [PATCH 001/193] Add fastlane metadata For #954 --- fastlane/Appfile | 1 + .../metadata/android/en-US/changelogs/.gitkeep | 0 .../metadata/android/en-US/full_description.txt | 11 +++++++++++ fastlane/metadata/android/en-US/images/icon.png | Bin 0 -> 26869 bytes ...a4636ea21eac6172836117bc05b5446c25008abe.png | Bin 0 -> 63716 bytes ...7776245b125d92235b3d0190f92c44616dc8a509.png | Bin 0 -> 58144 bytes ...528c01b3c8bd329b85e1de1e1cc9467a1885bd26.png | Bin 0 -> 47432 bytes ...ace7f3d72455acbe8a200995789c8e1c6d1a1c38.png | Bin 0 -> 44487 bytes ...9caa35b44799fde6ae444b93f9d1d4eaa656ea82.png | Bin 0 -> 66543 bytes ...b86653308f97b95e602b7080df0138a3973a971a.png | Bin 0 -> 55585 bytes ...6ec909a7bf3077c54bacc5e20631edcc3e2435db.png | Bin 0 -> 46879 bytes .../android/en-US/short_description.txt | 1 + 12 files changed, 13 insertions(+) create mode 100644 fastlane/Appfile create mode 100644 fastlane/metadata/android/en-US/changelogs/.gitkeep create mode 100644 fastlane/metadata/android/en-US/full_description.txt create mode 100644 fastlane/metadata/android/en-US/images/icon.png create mode 100644 fastlane/metadata/android/en-US/images/phoneScreenshots/05a1aa12278525211a470eb8a4636ea21eac6172836117bc05b5446c25008abe.png create mode 100644 fastlane/metadata/android/en-US/images/phoneScreenshots/1f346858134354959f6d0c4c7776245b125d92235b3d0190f92c44616dc8a509.png create mode 100644 fastlane/metadata/android/en-US/images/phoneScreenshots/29bb7d3c55248043cdcb1db7528c01b3c8bd329b85e1de1e1cc9467a1885bd26.png create mode 100644 fastlane/metadata/android/en-US/images/phoneScreenshots/337c2f1ca500347ade5d2b42ace7f3d72455acbe8a200995789c8e1c6d1a1c38.png create mode 100644 fastlane/metadata/android/en-US/images/phoneScreenshots/6e64d5cfe73fc22c796f621e9caa35b44799fde6ae444b93f9d1d4eaa656ea82.png create mode 100644 fastlane/metadata/android/en-US/images/phoneScreenshots/990f447807ee10406e8992b6b86653308f97b95e602b7080df0138a3973a971a.png create mode 100644 fastlane/metadata/android/en-US/images/phoneScreenshots/9bf57ffd707362f7780534786ec909a7bf3077c54bacc5e20631edcc3e2435db.png create mode 100644 fastlane/metadata/android/en-US/short_description.txt diff --git a/fastlane/Appfile b/fastlane/Appfile new file mode 100644 index 000000000..899a0343b --- /dev/null +++ b/fastlane/Appfile @@ -0,0 +1 @@ +package_name("com.cypherstack.stackwallet") diff --git a/fastlane/metadata/android/en-US/changelogs/.gitkeep b/fastlane/metadata/android/en-US/changelogs/.gitkeep new file mode 100644 index 000000000..e69de29bb diff --git a/fastlane/metadata/android/en-US/full_description.txt b/fastlane/metadata/android/en-US/full_description.txt new file mode 100644 index 000000000..1f7ac4b00 --- /dev/null +++ b/fastlane/metadata/android/en-US/full_description.txt @@ -0,0 +1,11 @@ +Stack Wallet is a fully open source cryptocurrency wallet. With an easy to use user interface and quick and speedy transactions, this wallet is ideal for anyone no matter how much they know about the cryptocurrency space. The app is actively maintained to provide new user friendly features. + +Highlights include: +- 10 Different cryptocurrencies +- All private keys and seeds stay on device and are never shared. +- Easy backup and restore feature to save all the information that's important to you. +- Trading cryptocurrencies through our partners. +- Custom address book +- Favorite wallets with fast syncing +- Custom Nodes. +- Open source software. diff --git a/fastlane/metadata/android/en-US/images/icon.png b/fastlane/metadata/android/en-US/images/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..f3597e4f6229fc8252cf42571a60a746f654284a GIT binary patch literal 26869 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 literal 0 HcmV?d00001 diff --git a/fastlane/metadata/android/en-US/images/phoneScreenshots/05a1aa12278525211a470eb8a4636ea21eac6172836117bc05b5446c25008abe.png b/fastlane/metadata/android/en-US/images/phoneScreenshots/05a1aa12278525211a470eb8a4636ea21eac6172836117bc05b5446c25008abe.png new file mode 100644 index 0000000000000000000000000000000000000000..b06b0c5da084ded6f97d8d7370ceac528e392be6 GIT binary patch literal 63716 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 v=9pAuS)0=4y0hhA8x?H)8W!V1!&Vdcn literal 0 HcmV?d00001 diff --git a/fastlane/metadata/android/en-US/images/phoneScreenshots/1f346858134354959f6d0c4c7776245b125d92235b3d0190f92c44616dc8a509.png b/fastlane/metadata/android/en-US/images/phoneScreenshots/1f346858134354959f6d0c4c7776245b125d92235b3d0190f92c44616dc8a509.png new file mode 100644 index 0000000000000000000000000000000000000000..e83eac3e2363d59e003504f1a8b9ec2b23054175 GIT binary patch literal 58144 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¨9=5UUh!H371?^aQS= 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 literal 0 HcmV?d00001 diff --git a/fastlane/metadata/android/en-US/images/phoneScreenshots/337c2f1ca500347ade5d2b42ace7f3d72455acbe8a200995789c8e1c6d1a1c38.png b/fastlane/metadata/android/en-US/images/phoneScreenshots/337c2f1ca500347ade5d2b42ace7f3d72455acbe8a200995789c8e1c6d1a1c38.png new file mode 100644 index 0000000000000000000000000000000000000000..3aa7b86ce2ce071a695a73c3982cfbc0d65b0819 GIT binary patch literal 44487 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 literal 0 HcmV?d00001 diff --git a/fastlane/metadata/android/en-US/images/phoneScreenshots/6e64d5cfe73fc22c796f621e9caa35b44799fde6ae444b93f9d1d4eaa656ea82.png b/fastlane/metadata/android/en-US/images/phoneScreenshots/6e64d5cfe73fc22c796f621e9caa35b44799fde6ae444b93f9d1d4eaa656ea82.png new file mode 100644 index 0000000000000000000000000000000000000000..5acd5e8dbaa757776cf7a1230f81caec75a6378c GIT binary patch literal 66543 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 literal 0 HcmV?d00001 diff --git a/fastlane/metadata/android/en-US/images/phoneScreenshots/990f447807ee10406e8992b6b86653308f97b95e602b7080df0138a3973a971a.png b/fastlane/metadata/android/en-US/images/phoneScreenshots/990f447807ee10406e8992b6b86653308f97b95e602b7080df0138a3973a971a.png new file mode 100644 index 0000000000000000000000000000000000000000..b00ab681dcc22618947fe8e8aaa4b5652dd55bf6 GIT binary patch literal 55585 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 literal 0 HcmV?d00001 diff --git a/fastlane/metadata/android/en-US/images/phoneScreenshots/9bf57ffd707362f7780534786ec909a7bf3077c54bacc5e20631edcc3e2435db.png b/fastlane/metadata/android/en-US/images/phoneScreenshots/9bf57ffd707362f7780534786ec909a7bf3077c54bacc5e20631edcc3e2435db.png new file mode 100644 index 0000000000000000000000000000000000000000..d96bd3e97510d019bb3185f6e1ccfc7100c2ee53 GIT binary patch literal 46879 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 literal 0 HcmV?d00001 diff --git a/fastlane/metadata/android/en-US/short_description.txt b/fastlane/metadata/android/en-US/short_description.txt new file mode 100644 index 000000000..fa838d5bd --- /dev/null +++ b/fastlane/metadata/android/en-US/short_description.txt @@ -0,0 +1 @@ +An open source, non-custodial cryptocurrency wallet. From 925b58be506874e043098c12497df61929f0b8c0 Mon Sep 17 00:00:00 2001 From: julian Date: Fri, 29 Nov 2024 17:05:35 -0600 Subject: [PATCH 002/193] fix frost wallet init address error --- .../wallet/impl/bitcoin_frost_wallet.dart | 26 ++++++++++++++----- 1 file changed, 20 insertions(+), 6 deletions(-) diff --git a/lib/wallets/wallet/impl/bitcoin_frost_wallet.dart b/lib/wallets/wallet/impl/bitcoin_frost_wallet.dart index 313f1afb6..c1701d8b7 100644 --- a/lib/wallets/wallet/impl/bitcoin_frost_wallet.dart +++ b/lib/wallets/wallet/impl/bitcoin_frost_wallet.dart @@ -85,12 +85,26 @@ class BitcoinFrostWallet extends Wallet await mainDB.isar.frostWalletInfo.put(frostWalletInfo); }); - final address = await _generateAddress( - change: 0, - index: kFrostSecureStartingIndex, - serializedKeys: serializedKeys, - secure: true, - ); + Address? address; + int index = kFrostSecureStartingIndex; + while (address == null) { + try { + address = await _generateAddress( + change: 0, + index: index, + serializedKeys: serializedKeys, + secure: true, + ); + } on FrostdartException catch (e) { + if (e.errorCode == 72) { + // rust doesn't like the addressDerivationData + index++; + continue; + } else { + rethrow; + } + } + } await mainDB.putAddresses([address]); } catch (e, s) { From 840b6f9c99a6f5b3b42827c1aaca8008cedee8d9 Mon Sep 17 00:00:00 2001 From: julian Date: Tue, 3 Dec 2024 14:41:56 -0600 Subject: [PATCH 003/193] fix mnemonic blank on mobile back up screen --- .../wallet_settings_view/wallet_settings_view.dart | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/lib/pages/settings_views/wallet_settings_view/wallet_settings_view.dart b/lib/pages/settings_views/wallet_settings_view/wallet_settings_view.dart index 4948876bd..8e889ed7c 100644 --- a/lib/pages/settings_views/wallet_settings_view/wallet_settings_view.dart +++ b/lib/pages/settings_views/wallet_settings_view/wallet_settings_view.dart @@ -316,9 +316,10 @@ class _WalletSettingsViewState extends ConsumerState { if (wallet is MnemonicInterface) { if (wallet is ViewOnlyOptionInterface && - !(wallet - as ViewOnlyOptionInterface) + (wallet as ViewOnlyOptionInterface) .isViewOnly) { + // TODO: is something needed here? + } else { mnemonic = await wallet .getMnemonicAsWords(); } From 86e3bf03497ddd5ad7c00f0a7dedbe510cfaabe8 Mon Sep 17 00:00:00 2001 From: julian Date: Tue, 3 Dec 2024 15:00:25 -0600 Subject: [PATCH 004/193] improve SWB restore performance when a large number of wallets is involved --- .../helpers/restore_create_backup.dart | 6 ++++-- lib/wallets/wallet/impl/epiccash_wallet.dart | 14 ++++++++------ 2 files changed, 12 insertions(+), 8 deletions(-) diff --git a/lib/pages/settings_views/global_settings_view/stack_backup_views/helpers/restore_create_backup.dart b/lib/pages/settings_views/global_settings_view/stack_backup_views/helpers/restore_create_backup.dart index d20faf66b..0ffa6bcf9 100644 --- a/lib/pages/settings_views/global_settings_view/stack_backup_views/helpers/restore_create_backup.dart +++ b/lib/pages/settings_views/global_settings_view/stack_backup_views/helpers/restore_create_backup.dart @@ -458,7 +458,7 @@ abstract class SWB { mnemonic: mnemonic, mnemonicPassphrase: mnemonicPassphrase, ); - + Wallet? wallet; try { String? serializedKeys; String? multisigConfig; @@ -491,7 +491,7 @@ abstract class SWB { }); } - final wallet = await Wallet.create( + wallet = await Wallet.create( walletInfo: info, mainDB: MainDB.instance, secureStorageInterface: secureStorageInterface, @@ -614,6 +614,8 @@ abstract class SWB { mnemonicPassphrase: mnemonicPassphrase, ); return false; + } finally { + await wallet?.exit(); } return true; } diff --git a/lib/wallets/wallet/impl/epiccash_wallet.dart b/lib/wallets/wallet/impl/epiccash_wallet.dart index 96d6b112e..7533925c8 100644 --- a/lib/wallets/wallet/impl/epiccash_wallet.dart +++ b/lib/wallets/wallet/impl/epiccash_wallet.dart @@ -701,7 +701,7 @@ class EpiccashWallet extends Bip39Wallet { isar: mainDB.isar, ); - unawaited(_startScans()); + unawaited(refresh(doScan: true)); } else { await updateNode(); final String password = generatePassword(); @@ -759,9 +759,8 @@ class EpiccashWallet extends Bip39Wallet { epicData.receivingIndex, ); } + unawaited(refresh(doScan: false)); }); - - unawaited(refresh()); } catch (e, s) { Logging.instance.log( "Exception rethrown from electrumx_mixin recover(): $e\n$s", @@ -773,7 +772,7 @@ class EpiccashWallet extends Bip39Wallet { } @override - Future refresh() async { + Future refresh({bool doScan = true}) async { // Awaiting this lock could be dangerous. // Since refresh is periodic (generally) if (refreshMutex.isLocked) { @@ -803,9 +802,11 @@ class EpiccashWallet extends Bip39Wallet { final int curAdd = await _getCurrentIndex(); await _generateAndStoreReceivingAddressForIndex(curAdd); - await _startScans(); + if (doScan) { + await _startScans(); - unawaited(_startSync()); + unawaited(_startSync()); + } GlobalEventBus.instance.fire(RefreshPercentChangedEvent(0.0, walletId)); await updateChainHeight(); @@ -1157,6 +1158,7 @@ class EpiccashWallet extends Bip39Wallet { @override Future exit() async { + epiccash.LibEpiccash.stopEpicboxListener(); timer?.cancel(); timer = null; await super.exit(); From 64dd830e58ef30b7a398a30001424656a3c67747 Mon Sep 17 00:00:00 2001 From: julian Date: Tue, 3 Dec 2024 16:19:09 -0600 Subject: [PATCH 005/193] fix new xmr/wow wallet creation when specifying mnemonic length --- ...w_wallet_recovery_phrase_warning_view.dart | 436 +++++++++--------- lib/wallets/wallet/impl/monero_wallet.dart | 29 +- lib/wallets/wallet/impl/wownero_wallet.dart | 35 +- .../intermediate/lib_monero_wallet.dart | 12 +- 4 files changed, 278 insertions(+), 234 deletions(-) diff --git a/lib/pages/add_wallet_views/new_wallet_recovery_phrase_warning_view/new_wallet_recovery_phrase_warning_view.dart b/lib/pages/add_wallet_views/new_wallet_recovery_phrase_warning_view/new_wallet_recovery_phrase_warning_view.dart index 73acccb9d..aa49a9038 100644 --- a/lib/pages/add_wallet_views/new_wallet_recovery_phrase_warning_view/new_wallet_recovery_phrase_warning_view.dart +++ b/lib/pages/add_wallet_views/new_wallet_recovery_phrase_warning_view/new_wallet_recovery_phrase_warning_view.dart @@ -26,18 +26,20 @@ import '../../../services/transaction_notification_tracker.dart'; import '../../../themes/stack_colors.dart'; import '../../../utilities/assets.dart'; import '../../../utilities/logger.dart'; +import '../../../utilities/show_loading.dart'; import '../../../utilities/text_styles.dart'; import '../../../utilities/util.dart'; import '../../../wallets/crypto_currency/crypto_currency.dart'; import '../../../wallets/isar/models/wallet_info.dart'; +import '../../../wallets/wallet/intermediate/lib_monero_wallet.dart'; import '../../../wallets/wallet/wallet.dart'; import '../../../wallets/wallet/wallet_mixin_interfaces/mnemonic_interface.dart'; import '../../../widgets/custom_buttons/app_bar_icon_button.dart'; import '../../../widgets/desktop/desktop_app_bar.dart'; import '../../../widgets/desktop/desktop_scaffold.dart'; -import '../../../widgets/loading_indicator.dart'; import '../../../widgets/rounded_container.dart'; import '../../../widgets/rounded_white_container.dart'; +import '../../../widgets/stack_dialog.dart'; import '../new_wallet_options/new_wallet_options_view.dart'; import '../new_wallet_recovery_phrase_view/new_wallet_recovery_phrase_view.dart'; import 'recovery_phrase_explanation_dialog.dart'; @@ -65,6 +67,221 @@ class _NewWalletRecoveryPhraseWarningViewState late final String walletName; late final bool isDesktop; + Future _initNewWallet() async { + Exception? ex; + final result = await showLoading( + whileFuture: _initNewFuture(), + context: context, + message: "Generating...", + onException: (e) => ex = e, + ); + + // on failure show error message + if (result == null) { + if (mounted) { + await showDialog( + context: context, + builder: (_) => StackOkDialog( + title: "Create Wallet Error", + message: ex?.toString() ?? "Unknown error", + maxWidth: 600, + ), + ); + } + return; + } else { + if (mounted) { + final nav = Navigator.of(context); + unawaited( + nav.pushNamed( + NewWalletRecoveryPhraseView.routeName, + arguments: Tuple2( + result.$1, + result.$2, + ), + ), + ); + } + } + } + + Future<(Wallet, List)> _initNewFuture() async { + try { + String? otherDataJsonString; + if (widget.coin is Tezos) { + otherDataJsonString = jsonEncode({ + WalletInfoKeys.tezosDerivationPath: + Tezos.standardDerivationPath.value, + }); + // }//todo: probably not needed (broken anyways) + // else if (widget.coin is Epiccash) { + // final int secondsSinceEpoch = + // DateTime.now().millisecondsSinceEpoch ~/ 1000; + // const int epicCashFirstBlock = 1565370278; + // const double overestimateSecondsPerBlock = 61; + // int chosenSeconds = secondsSinceEpoch - epicCashFirstBlock; + // int approximateHeight = chosenSeconds ~/ overestimateSecondsPerBlock; + // / + // // debugPrint( + // // "approximate height: $approximateHeight chosen_seconds: $chosenSeconds"); + // height = approximateHeight; + // if (height < 0) { + // height = 0; + // } + // + // otherDataJsonString = jsonEncode( + // { + // WalletInfoKeys.epiccashData: jsonEncode( + // ExtraEpiccashWalletInfo( + // receivingIndex: 0, + // changeIndex: 0, + // slatesToAddresses: {}, + // slatesToCommits: {}, + // lastScannedBlock: epicCashFirstBlock, + // restoreHeight: height, + // creationHeight: height, + // ).toMap(), + // ), + // }, + // ); + } else if (widget.coin is Firo) { + otherDataJsonString = jsonEncode( + { + WalletInfoKeys.lelantusCoinIsarRescanRequired: false, + }, + ); + } + + final info = WalletInfo.createNew( + coin: widget.coin, + name: widget.walletName, + otherDataJsonString: otherDataJsonString, + ); + + var node = ref + .read( + nodeServiceChangeNotifierProvider, + ) + .getPrimaryNodeFor( + currency: coin, + ); + + if (node == null) { + node = coin.defaultNode; + await ref + .read( + nodeServiceChangeNotifierProvider, + ) + .setPrimaryNodeFor( + coin: coin, + node: node, + ); + } + + final txTracker = TransactionNotificationTracker( + walletId: info.walletId, + ); + + String? mnemonicPassphrase; + String? mnemonic; + String? privateKey; + + // set some sane default + int wordCount = info.coin.defaultSeedPhraseLength; + + // TODO: Refactor these to generate each coin in their respective classes + // This code should not be in a random view page file + if (coin is Monero || coin is Wownero) { + // currently a special case due to the + // xmr/wow libraries handling their + // own mnemonic generation + wordCount = ref.read(pNewWalletOptions)?.mnemonicWordsCount ?? + info.coin.defaultSeedPhraseLength; + } else if (wordCount > 0) { + if (ref + .read( + pNewWalletOptions.state, + ) + .state != + null) { + if (coin.hasMnemonicPassphraseSupport) { + mnemonicPassphrase = ref + .read( + pNewWalletOptions.state, + ) + .state! + .mnemonicPassphrase; + } else { + // this may not be epiccash specific? + if (coin is Epiccash) { + mnemonicPassphrase = ""; + } + } + + wordCount = ref + .read( + pNewWalletOptions.state, + ) + .state! + .mnemonicWordsCount; + } else { + mnemonicPassphrase = ""; + } + + if (wordCount < 12 || 24 < wordCount || wordCount % 3 != 0) { + throw Exception( + "Invalid word count", + ); + } + + final strength = (wordCount ~/ 3) * 32; + + mnemonic = bip39.generateMnemonic( + strength: strength, + ); + } + + final wallet = await Wallet.create( + walletInfo: info, + mainDB: ref.read(mainDBProvider), + secureStorageInterface: ref.read(secureStoreProvider), + nodeService: ref.read( + nodeServiceChangeNotifierProvider, + ), + prefs: ref.read( + prefsChangeNotifierProvider, + ), + mnemonicPassphrase: mnemonicPassphrase, + mnemonic: mnemonic, + privateKey: privateKey, + ); + + if (wallet is LibMoneroWallet) { + await wallet.init(wordCount: wordCount); + } else { + await wallet.init(); + } + + // set checkbox back to unchecked to annoy users to agree again :P + ref + .read( + checkBoxStateProvider.state, + ) + .state = false; + + final fetchedMnemonic = + await (wallet as MnemonicInterface).getMnemonicAsWords(); + + return (wallet, fetchedMnemonic); + } catch (e, s) { + Logging.instance.log( + "$e\n$s", + level: LogLevel.Fatal, + ); + rethrow; + } + } + @override void initState() { coin = widget.coin; @@ -454,222 +671,7 @@ class _NewWalletRecoveryPhraseWarningViewState onPressed: ref .read(checkBoxStateProvider.state) .state - ? () async { - try { - unawaited( - showDialog( - context: context, - barrierDismissible: false, - useSafeArea: true, - builder: (ctx) { - return const Center( - child: LoadingIndicator( - width: 50, - height: 50, - ), - ); - }, - ), - ); - String? otherDataJsonString; - if (widget.coin is Tezos) { - otherDataJsonString = jsonEncode({ - WalletInfoKeys - .tezosDerivationPath: - Tezos.standardDerivationPath - .value, - }); - // }//todo: probably not needed (broken anyways) - // else if (widget.coin is Epiccash) { - // final int secondsSinceEpoch = - // DateTime.now().millisecondsSinceEpoch ~/ 1000; - // const int epicCashFirstBlock = 1565370278; - // const double overestimateSecondsPerBlock = 61; - // int chosenSeconds = secondsSinceEpoch - epicCashFirstBlock; - // int approximateHeight = chosenSeconds ~/ overestimateSecondsPerBlock; - // / - // // debugPrint( - // // "approximate height: $approximateHeight chosen_seconds: $chosenSeconds"); - // height = approximateHeight; - // if (height < 0) { - // height = 0; - // } - // - // otherDataJsonString = jsonEncode( - // { - // WalletInfoKeys.epiccashData: jsonEncode( - // ExtraEpiccashWalletInfo( - // receivingIndex: 0, - // changeIndex: 0, - // slatesToAddresses: {}, - // slatesToCommits: {}, - // lastScannedBlock: epicCashFirstBlock, - // restoreHeight: height, - // creationHeight: height, - // ).toMap(), - // ), - // }, - // ); - } else if (widget.coin is Firo) { - otherDataJsonString = jsonEncode( - { - WalletInfoKeys - .lelantusCoinIsarRescanRequired: - false, - }, - ); - } - - final info = WalletInfo.createNew( - coin: widget.coin, - name: widget.walletName, - otherDataJsonString: - otherDataJsonString, - ); - - var node = ref - .read( - nodeServiceChangeNotifierProvider, - ) - .getPrimaryNodeFor( - currency: coin, - ); - - if (node == null) { - node = coin.defaultNode; - await ref - .read( - nodeServiceChangeNotifierProvider, - ) - .setPrimaryNodeFor( - coin: coin, - node: node, - ); - } - - final txTracker = - TransactionNotificationTracker( - walletId: info.walletId, - ); - - int? wordCount; - String? mnemonicPassphrase; - String? mnemonic; - String? privateKey; - - wordCount = info - .coin.defaultSeedPhraseLength; - - // TODO: Refactor these to generate each coin in their respective classes - // This code should not be in a random view page file - if (coin is Monero || - coin is Wownero) { - // currently a special case due to the - // xmr/wow libraries handling their - // own mnemonic generation - } else if (wordCount > 0) { - if (ref - .read( - pNewWalletOptions.state, - ) - .state != - null) { - if (coin - .hasMnemonicPassphraseSupport) { - mnemonicPassphrase = ref - .read( - pNewWalletOptions.state, - ) - .state! - .mnemonicPassphrase; - } else { - // this may not be epiccash specific? - if (coin is Epiccash) { - mnemonicPassphrase = ""; - } - } - - wordCount = ref - .read( - pNewWalletOptions.state, - ) - .state! - .mnemonicWordsCount; - } else { - mnemonicPassphrase = ""; - } - - if (wordCount < 12 || - 24 < wordCount || - wordCount % 3 != 0) { - throw Exception( - "Invalid word count", - ); - } - - final strength = - (wordCount ~/ 3) * 32; - - mnemonic = bip39.generateMnemonic( - strength: strength, - ); - } - - final wallet = await Wallet.create( - walletInfo: info, - mainDB: ref.read(mainDBProvider), - secureStorageInterface: - ref.read(secureStoreProvider), - nodeService: ref.read( - nodeServiceChangeNotifierProvider, - ), - prefs: ref.read( - prefsChangeNotifierProvider, - ), - mnemonicPassphrase: - mnemonicPassphrase, - mnemonic: mnemonic, - privateKey: privateKey, - ); - - await wallet.init(); - - // pop progress dialog - if (context.mounted) { - Navigator.pop(context); - } - // set checkbox back to unchecked to annoy users to agree again :P - ref - .read( - checkBoxStateProvider.state, - ) - .state = false; - - if (context.mounted) { - final nav = Navigator.of(context); - unawaited( - nav.pushNamed( - NewWalletRecoveryPhraseView - .routeName, - arguments: Tuple2( - wallet, - await (wallet - as MnemonicInterface) - .getMnemonicAsWords(), - ), - ), - ); - } - } catch (e, s) { - Logging.instance.log( - "$e\n$s", - level: LogLevel.Fatal, - ); - // TODO: handle gracefully - // any network/socket exception here will break new wallet creation - rethrow; - } - } + ? _initNewWallet : null, style: ref .read(checkBoxStateProvider.state) diff --git a/lib/wallets/wallet/impl/monero_wallet.dart b/lib/wallets/wallet/impl/monero_wallet.dart index bcec63851..d890e06e1 100644 --- a/lib/wallets/wallet/impl/monero_wallet.dart +++ b/lib/wallets/wallet/impl/monero_wallet.dart @@ -75,13 +75,28 @@ class MoneroWallet extends LibMoneroWallet { Future getCreatedWallet({ required String path, required String password, - }) async => - await lib_monero.MoneroWallet.create( - path: path, - password: password, - seedType: lib_monero.MoneroSeedType - .sixteen, // TODO: check we want to actually use 16 here - ); + required int wordCount, + }) async { + final lib_monero.MoneroSeedType type; + switch (wordCount) { + case 16: + type = lib_monero.MoneroSeedType.sixteen; + break; + + case 25: + type = lib_monero.MoneroSeedType.twentyFive; + break; + + default: + throw Exception("Invalid mnemonic word count: $wordCount"); + } + + return await lib_monero.MoneroWallet.create( + path: path, + password: password, + seedType: type, + ); + } @override Future getRestoredWallet({ diff --git a/lib/wallets/wallet/impl/wownero_wallet.dart b/lib/wallets/wallet/impl/wownero_wallet.dart index a33bd2da7..8df6de1d0 100644 --- a/lib/wallets/wallet/impl/wownero_wallet.dart +++ b/lib/wallets/wallet/impl/wownero_wallet.dart @@ -111,14 +111,33 @@ class WowneroWallet extends LibMoneroWallet { Future getCreatedWallet({ required String path, required String password, - }) async => - await lib_monero.WowneroWallet.create( - path: path, - password: password, - seedType: lib_monero.WowneroSeedType - .fourteen, // TODO: check we want to actually use 14 here - overrideDeprecated14WordSeedException: true, - ); + required int wordCount, + }) async { + final lib_monero.WowneroSeedType type; + switch (wordCount) { + case 14: + type = lib_monero.WowneroSeedType.fourteen; + break; + + case 16: + type = lib_monero.WowneroSeedType.sixteen; + break; + + case 25: + type = lib_monero.WowneroSeedType.twentyFive; + break; + + default: + throw Exception("Invalid mnemonic word count: $wordCount"); + } + + return await lib_monero.WowneroWallet.create( + path: path, + password: password, + seedType: type, + overrideDeprecated14WordSeedException: true, + ); + } @override Future getRestoredWallet({ diff --git a/lib/wallets/wallet/intermediate/lib_monero_wallet.dart b/lib/wallets/wallet/intermediate/lib_monero_wallet.dart index 597853a62..76009f729 100644 --- a/lib/wallets/wallet/intermediate/lib_monero_wallet.dart +++ b/lib/wallets/wallet/intermediate/lib_monero_wallet.dart @@ -142,6 +142,7 @@ abstract class LibMoneroWallet Future getCreatedWallet({ required String path, required String password, + required int wordCount, }); Future getRestoredWallet({ @@ -313,19 +314,26 @@ abstract class LibMoneroWallet } @override - Future init({bool? isRestore}) async { + Future init({bool? isRestore, int? wordCount}) async { final path = await pathForWallet( name: walletId, type: compatType, ); if (!(walletExists(path)) && isRestore != true) { + if (wordCount == null) { + throw Exception("Missing word count for new xmr/wow wallet!"); + } try { final password = generatePassword(); await secureStorageInterface.write( key: lib_monero_compat.libMoneroWalletPasswordKey(walletId), value: password, ); - final wallet = await getCreatedWallet(path: path, password: password); + final wallet = await getCreatedWallet( + path: path, + password: password, + wordCount: wordCount, + ); final height = wallet.getRefreshFromBlockHeight(); From c3a64b154bc00106035dfbe894ab57a41b8217df Mon Sep 17 00:00:00 2001 From: julian Date: Tue, 3 Dec 2024 16:19:40 -0600 Subject: [PATCH 006/193] No idea why this was changed but it causes problems so I am reverting it --- .../templates/android/app/src/main/AndroidManifest.xml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/scripts/app_config/templates/android/app/src/main/AndroidManifest.xml b/scripts/app_config/templates/android/app/src/main/AndroidManifest.xml index 78a92aa5c..204663635 100644 --- a/scripts/app_config/templates/android/app/src/main/AndroidManifest.xml +++ b/scripts/app_config/templates/android/app/src/main/AndroidManifest.xml @@ -23,8 +23,7 @@ android:requestLegacyExternalStorage="true" android:icon="@mipmap/ic_launcher" android:allowBackup="false" - android:fullBackupContent="false" - android:extractNativeLibs="true"> + android:fullBackupContent="false"> Date: Wed, 4 Dec 2024 11:00:22 -0600 Subject: [PATCH 007/193] xmr/wow show tx spend key option --- .../tx_v2/transaction_v2_details_view.dart | 22 +++- .../intermediate/lib_monero_wallet.dart | 7 ++ lib/widgets/tx_key_widget.dart | 102 ++++++++++++++++++ 3 files changed, 130 insertions(+), 1 deletion(-) create mode 100644 lib/widgets/tx_key_widget.dart diff --git a/lib/pages/wallet_view/transaction_views/tx_v2/transaction_v2_details_view.dart b/lib/pages/wallet_view/transaction_views/tx_v2/transaction_v2_details_view.dart index a1d4bb3fd..7081f5929 100644 --- a/lib/pages/wallet_view/transaction_views/tx_v2/transaction_v2_details_view.dart +++ b/lib/pages/wallet_view/transaction_views/tx_v2/transaction_v2_details_view.dart @@ -42,6 +42,7 @@ import '../../../../wallets/crypto_currency/intermediate/nano_currency.dart'; import '../../../../wallets/isar/models/spark_coin.dart'; import '../../../../wallets/isar/providers/wallet_info_provider.dart'; import '../../../../wallets/wallet/impl/epiccash_wallet.dart'; +import '../../../../wallets/wallet/intermediate/lib_monero_wallet.dart'; import '../../../../wallets/wallet/wallet_mixin_interfaces/rbf_interface.dart'; import '../../../../wallets/wallet/wallet_mixin_interfaces/spark_interface.dart'; import '../../../../widgets/background.dart'; @@ -57,6 +58,7 @@ import '../../../../widgets/icon_widgets/copy_icon.dart'; import '../../../../widgets/icon_widgets/pencil_icon.dart'; import '../../../../widgets/rounded_white_container.dart'; import '../../../../widgets/stack_dialog.dart'; +import '../../../../widgets/tx_key_widget.dart'; import '../../sub_widgets/tx_icon.dart'; import '../../wallet_view.dart'; import '../dialogs/cancelling_transaction_progress_dialog.dart'; @@ -96,6 +98,7 @@ class _TransactionV2DetailsViewState late final int minConfirms; late final EthContract? ethContract; late final bool supportsRbf; + late final bool hasTxKeyProbably; bool get isTokenTx => ethContract != null; @@ -180,10 +183,16 @@ class _TransactionV2DetailsViewState _transaction = widget.transaction; walletId = widget.walletId; + final wallet = ref.read(pWallets).getWallet(walletId); + + hasTxKeyProbably = wallet is LibMoneroWallet && + (_transaction.type == TransactionType.outgoing || + _transaction.type == TransactionType.sentToSelf); + if (_transaction.type case TransactionType.sentToSelf || TransactionType.outgoing) { supportsRbf = _transaction.subType == TransactionSubType.none && - ref.read(pWallets).getWallet(walletId) is RbfInterface; + wallet is RbfInterface; } else { supportsRbf = false; } @@ -1704,6 +1713,17 @@ class _TransactionV2DetailsViewState ], ), ), + if (hasTxKeyProbably) + isDesktop + ? const _Divider() + : const SizedBox( + height: 12, + ), + if (hasTxKeyProbably) + TxKeyWidget( + walletId: walletId, + txid: _transaction.txid, + ), isDesktop ? const _Divider() : const SizedBox( diff --git a/lib/wallets/wallet/intermediate/lib_monero_wallet.dart b/lib/wallets/wallet/intermediate/lib_monero_wallet.dart index 76009f729..e515a570f 100644 --- a/lib/wallets/wallet/intermediate/lib_monero_wallet.dart +++ b/lib/wallets/wallet/intermediate/lib_monero_wallet.dart @@ -164,6 +164,13 @@ abstract class LibMoneroWallet bool walletExists(String path); + String getTxKeyFor({required String txid}) { + if (libMoneroWallet == null) { + throw Exception("Cannot get tx key in uninitialized libMoneroWallet"); + } + return libMoneroWallet!.getTxKey(txid); + } + void _setListener() { if (libMoneroWallet != null && libMoneroWallet!.getListeners().isEmpty) { libMoneroWallet?.addListener( diff --git a/lib/widgets/tx_key_widget.dart b/lib/widgets/tx_key_widget.dart new file mode 100644 index 000000000..ba8e9b33c --- /dev/null +++ b/lib/widgets/tx_key_widget.dart @@ -0,0 +1,102 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; + +import '../pages/pinpad_views/pinpad_dialog.dart'; +import '../pages/wallet_view/transaction_views/tx_v2/transaction_v2_details_view.dart'; +import '../pages_desktop_specific/password/request_desktop_auth_dialog.dart'; +import '../providers/global/wallets_provider.dart'; +import '../utilities/text_styles.dart'; +import '../utilities/util.dart'; +import '../wallets/wallet/intermediate/lib_monero_wallet.dart'; +import 'custom_buttons/blue_text_button.dart'; +import 'custom_buttons/simple_copy_button.dart'; +import 'detail_item.dart'; + +class TxKeyWidget extends ConsumerStatefulWidget { + /// The [walletId] MUST be the id of a [LibMoneroWallet]! + const TxKeyWidget({ + super.key, + required this.walletId, + required this.txid, + }); + + final String walletId; + final String txid; + + @override + ConsumerState createState() => _TxKeyWidgetState(); +} + +class _TxKeyWidgetState extends ConsumerState { + String? _private; + + bool _lock = false; + + Future _loadTxKey() async { + if (_lock) { + return; + } + _lock = true; + + try { + final verified = await showDialog( + context: context, + builder: (context) => Util.isDesktop + ? const RequestDesktopAuthDialog(title: "Show private view key") + : const PinpadDialog( + biometricsAuthenticationTitle: "Show private view key", + biometricsLocalizedReason: + "Authenticate to show private view key", + biometricsCancelButtonString: "CANCEL", + ), + barrierDismissible: !Util.isDesktop, + ); + + if (verified == "verified success" && mounted) { + final wallet = + ref.read(pWallets).getWallet(widget.walletId) as LibMoneroWallet; + + _private = wallet.getTxKeyFor(txid: widget.txid); + if (_private!.isEmpty) { + _private = "Unavailable"; + } + + if (context.mounted) { + setState(() {}); + } else { + _private == null; + } + } + } finally { + _lock = false; + } + } + + @override + Widget build(BuildContext context) { + return DetailItemBase( + button: _private == null + ? CustomTextButton( + text: "Show", + onTap: _loadTxKey, + enabled: _private == null, + ) + : Util.isDesktop + ? IconCopyButton( + data: _private!, + ) + : SimpleCopyButton( + data: _private!, + ), + title: Text( + "Private view key", + style: STextStyles.itemSubtitle(context), + ), + detail: SelectableText( + // TODO + _private ?? "*" * 52, // 52 is approx length + style: STextStyles.w500_14(context), + ), + ); + } +} From 3f8cf2583c03b3eab833d241196adcea7e955d48 Mon Sep 17 00:00:00 2001 From: julian Date: Thu, 5 Dec 2024 00:28:59 -0600 Subject: [PATCH 008/193] disable wownero 14 word seeds --- .../restore_wallet_view/restore_wallet_view.dart | 5 +++++ lib/wallets/crypto_currency/coins/wownero.dart | 4 ++-- lib/wallets/wallet/impl/wownero_wallet.dart | 6 +----- pubspec.lock | 4 ++-- scripts/app_config/templates/pubspec.template | 2 +- 5 files changed, 11 insertions(+), 10 deletions(-) diff --git a/lib/pages/add_wallet_views/restore_wallet_view/restore_wallet_view.dart b/lib/pages/add_wallet_views/restore_wallet_view/restore_wallet_view.dart index 2fae2352c..58e51b34e 100644 --- a/lib/pages/add_wallet_views/restore_wallet_view/restore_wallet_view.dart +++ b/lib/pages/add_wallet_views/restore_wallet_view/restore_wallet_view.dart @@ -48,6 +48,7 @@ import '../../../wallets/isar/models/wallet_info.dart'; import '../../../wallets/wallet/impl/epiccash_wallet.dart'; import '../../../wallets/wallet/impl/monero_wallet.dart'; import '../../../wallets/wallet/impl/wownero_wallet.dart'; +import '../../../wallets/wallet/intermediate/lib_monero_wallet.dart'; import '../../../wallets/wallet/supporting/epiccash_wallet_info_extension.dart'; import '../../../wallets/wallet/wallet.dart'; import '../../../widgets/custom_buttons/app_bar_icon_button.dart'; @@ -369,6 +370,10 @@ class _RestoreWalletViewState extends ConsumerState { await wallet.recover(isRescan: false); + if (wallet is LibMoneroWallet) { + await wallet.exit(); + } + // check if state is still active before continuing if (mounted) { await wallet.info.setMnemonicVerified( diff --git a/lib/wallets/crypto_currency/coins/wownero.dart b/lib/wallets/crypto_currency/coins/wownero.dart index e043fdd7b..095d40a57 100644 --- a/lib/wallets/crypto_currency/coins/wownero.dart +++ b/lib/wallets/crypto_currency/coins/wownero.dart @@ -82,7 +82,7 @@ class Wownero extends CryptonoteCurrency { } @override - int get defaultSeedPhraseLength => 14; + int get defaultSeedPhraseLength => 16; //14; @override int get fractionDigits => 11; @@ -94,7 +94,7 @@ class Wownero extends CryptonoteCurrency { bool get hasMnemonicPassphraseSupport => false; @override - List get possibleMnemonicLengths => [defaultSeedPhraseLength, 16, 25]; + List get possibleMnemonicLengths => [defaultSeedPhraseLength, 25]; @override BigInt get satsPerCoin => BigInt.from(100000000000); diff --git a/lib/wallets/wallet/impl/wownero_wallet.dart b/lib/wallets/wallet/impl/wownero_wallet.dart index 8df6de1d0..09a9d4c5d 100644 --- a/lib/wallets/wallet/impl/wownero_wallet.dart +++ b/lib/wallets/wallet/impl/wownero_wallet.dart @@ -115,10 +115,6 @@ class WowneroWallet extends LibMoneroWallet { }) async { final lib_monero.WowneroSeedType type; switch (wordCount) { - case 14: - type = lib_monero.WowneroSeedType.fourteen; - break; - case 16: type = lib_monero.WowneroSeedType.sixteen; break; @@ -171,7 +167,7 @@ class WowneroWallet extends LibMoneroWallet { @override void invalidSeedLengthCheck(int length) { - if (!(length == 14 || length == 16 || length == 25)) { + if (!(length == 16 || length == 25)) { throw Exception("Invalid wownero mnemonic length found: $length"); } } diff --git a/pubspec.lock b/pubspec.lock index a973ef92f..9b55c770b 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -435,10 +435,10 @@ packages: dependency: "direct main" description: name: cs_monero - sha256: b9b9db6602361587b1ce512002f174fd833818ff2a63787c3058e0532fc0d9d8 + sha256: "8b2c1451d8eb09fc2a1248ecd652f2332343946a1d622b2f623b74d5f999c8d5" url: "https://pub.dev" source: hosted - version: "1.0.0-pre" + version: "1.0.0-pre.1" cs_monero_flutter_libs: dependency: "direct main" description: diff --git a/scripts/app_config/templates/pubspec.template b/scripts/app_config/templates/pubspec.template index 862731c6e..9b4541240 100644 --- a/scripts/app_config/templates/pubspec.template +++ b/scripts/app_config/templates/pubspec.template @@ -195,7 +195,7 @@ dependencies: blockchain_utils: ^3.3.0 on_chain: ^4.0.1 cbor: ^6.3.3 - cs_monero: 1.0.0-pre + cs_monero: 1.0.0-pre.1 cs_monero_flutter_libs: 1.0.0-pre.0 dev_dependencies: From 4a59505c30bc33a0e4024bc9c8942abbb85dafd6 Mon Sep 17 00:00:00 2001 From: julian Date: Thu, 5 Dec 2024 00:38:10 -0600 Subject: [PATCH 009/193] fuzzy logic. Better safe than sorry --- lib/wallets/crypto_currency/coins/monero.dart | 3 +++ lib/wallets/crypto_currency/coins/wownero.dart | 3 +++ lib/wallets/wallet/intermediate/lib_monero_wallet.dart | 4 ++++ 3 files changed, 10 insertions(+) diff --git a/lib/wallets/crypto_currency/coins/monero.dart b/lib/wallets/crypto_currency/coins/monero.dart index 7e0347775..4cbeeeb68 100644 --- a/lib/wallets/crypto_currency/coins/monero.dart +++ b/lib/wallets/crypto_currency/coins/monero.dart @@ -49,6 +49,9 @@ class Monero extends CryptonoteCurrency { @override bool validateAddress(String address) { + if (address.contains("111")) { + return false; + } switch (network) { case CryptoCurrencyNetwork.main: return xmr_wallet_ffi.validateAddress(address, 0); diff --git a/lib/wallets/crypto_currency/coins/wownero.dart b/lib/wallets/crypto_currency/coins/wownero.dart index 095d40a57..2aea90aa8 100644 --- a/lib/wallets/crypto_currency/coins/wownero.dart +++ b/lib/wallets/crypto_currency/coins/wownero.dart @@ -49,6 +49,9 @@ class Wownero extends CryptonoteCurrency { @override bool validateAddress(String address) { + if (address.contains("111")) { + return false; + } switch (network) { case CryptoCurrencyNetwork.main: return wow_wallet_ffi.validateAddress(address, 0); diff --git a/lib/wallets/wallet/intermediate/lib_monero_wallet.dart b/lib/wallets/wallet/intermediate/lib_monero_wallet.dart index e515a570f..4301de24c 100644 --- a/lib/wallets/wallet/intermediate/lib_monero_wallet.dart +++ b/lib/wallets/wallet/intermediate/lib_monero_wallet.dart @@ -272,6 +272,10 @@ abstract class LibMoneroWallet addressIndex: index, ); + if (address.value.contains("111")) { + throw Exception("111 address found!"); + } + final newReceivingAddress = Address( walletId: walletId, derivationIndex: index, From ec1b5d7d2b2253d54b02772233cdc305ace762f7 Mon Sep 17 00:00:00 2001 From: julian Date: Mon, 9 Dec 2024 10:36:22 -0600 Subject: [PATCH 010/193] fix: propagate restore errors correctly. Should fix https://github.com/cypherstack/stack_wallet/issues/1047 --- lib/wallets/wallet/intermediate/lib_monero_wallet.dart | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/wallets/wallet/intermediate/lib_monero_wallet.dart b/lib/wallets/wallet/intermediate/lib_monero_wallet.dart index 4301de24c..0abd93969 100644 --- a/lib/wallets/wallet/intermediate/lib_monero_wallet.dart +++ b/lib/wallets/wallet/intermediate/lib_monero_wallet.dart @@ -453,6 +453,7 @@ abstract class LibMoneroWallet ); } catch (e, s) { Logging.instance.log("$e\n$s", level: LogLevel.Fatal); + rethrow; } await updateNode(); _setListener(); From e9252a4d46f13c2926c651572d5e6c225892b820 Mon Sep 17 00:00:00 2001 From: julian Date: Mon, 9 Dec 2024 13:06:05 -0600 Subject: [PATCH 011/193] fix: ensure xmr/wow transactions updated on balance changed --- .../wallet/intermediate/lib_monero_wallet.dart | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/lib/wallets/wallet/intermediate/lib_monero_wallet.dart b/lib/wallets/wallet/intermediate/lib_monero_wallet.dart index 0abd93969..0c4ec0760 100644 --- a/lib/wallets/wallet/intermediate/lib_monero_wallet.dart +++ b/lib/wallets/wallet/intermediate/lib_monero_wallet.dart @@ -767,8 +767,16 @@ abstract class LibMoneroWallet void onBalancesChanged({ required BigInt newBalance, required BigInt newUnlockedBalance, - }) { - // do something? + }) async { + try { + await updateBalance(); + await updateTransactions(); + } catch (e, s) { + Logging.instance.log( + "onBalancesChanged(): $e\n$s", + level: LogLevel.Warning, + ); + } } void onNewBlock(int nodeHeight) { From fed7ae91d9171d428c164eb409faad64bbf5dafb Mon Sep 17 00:00:00 2001 From: julian Date: Mon, 9 Dec 2024 14:30:22 -0600 Subject: [PATCH 012/193] fix: frost reshare issue when initiator is a new participant of a 1/2 config --- .../frost_ms/reshare/frost_reshare_step_2abd.dart | 2 +- .../add_wallet_views/frost_ms/reshare/frost_reshare_step_4.dart | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/pages/add_wallet_views/frost_ms/reshare/frost_reshare_step_2abd.dart b/lib/pages/add_wallet_views/frost_ms/reshare/frost_reshare_step_2abd.dart index a95d8ec47..65c22e2f6 100644 --- a/lib/pages/add_wallet_views/frost_ms/reshare/frost_reshare_step_2abd.dart +++ b/lib/pages/add_wallet_views/frost_ms/reshare/frost_reshare_step_2abd.dart @@ -208,7 +208,7 @@ class _FrostReshareStep2abdState extends ConsumerState { label: "Continue", enabled: _userVerifyContinue && (amOutgoingParticipant || - !fieldIsEmptyFlags.reduce((v, e) => v |= e)), + !fieldIsEmptyFlags.fold(false, (v, e) => v || e)), onPressed: _onPressed, ), ], diff --git a/lib/pages/add_wallet_views/frost_ms/reshare/frost_reshare_step_4.dart b/lib/pages/add_wallet_views/frost_ms/reshare/frost_reshare_step_4.dart index f476c9096..41d94cdd1 100644 --- a/lib/pages/add_wallet_views/frost_ms/reshare/frost_reshare_step_4.dart +++ b/lib/pages/add_wallet_views/frost_ms/reshare/frost_reshare_step_4.dart @@ -238,7 +238,7 @@ class _FrostReshareStep4State extends ConsumerState { label: amOutgoingParticipant ? "Done" : "Complete", enabled: (amNewParticipant || _userVerifyContinue) && (amOutgoingParticipant || - !fieldIsEmptyFlags.reduce((v, e) => v |= e)), + !fieldIsEmptyFlags.fold(false, (v, e) => v || e)), onPressed: _onPressed, ), ], From 937550cb041482565d504c087fe3435471cae092 Mon Sep 17 00:00:00 2001 From: julian Date: Mon, 9 Dec 2024 16:26:53 -0600 Subject: [PATCH 013/193] fix: xmr/wow node connection was replacing onion addresses with an empty string --- lib/wallets/wallet/intermediate/lib_monero_wallet.dart | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/lib/wallets/wallet/intermediate/lib_monero_wallet.dart b/lib/wallets/wallet/intermediate/lib_monero_wallet.dart index 0c4ec0760..ffcaa1560 100644 --- a/lib/wallets/wallet/intermediate/lib_monero_wallet.dart +++ b/lib/wallets/wallet/intermediate/lib_monero_wallet.dart @@ -484,7 +484,8 @@ abstract class LibMoneroWallet Future updateNode() async { final node = getCurrentNode(); - final host = Uri.parse(node.host).host; + final host = + node.host.endsWith(".onion") ? node.host : Uri.parse(node.host).host; ({InternetAddress host, int port})? proxy; if (prefs.useTor) { if (node.clearnetEnabled && !node.torEnabled) { From 71609c34b0d9c106444e1ec8627903432fd3ca95 Mon Sep 17 00:00:00 2001 From: julian Date: Tue, 10 Dec 2024 14:51:19 -0600 Subject: [PATCH 014/193] feat: allow setting the restore/refresh height in xmr/wow wallets --- .../edit_refresh_height_view.dart | 238 ++++++++++++++++++ .../wallet_settings_wallet_settings_view.dart | 38 +++ .../sub_widgets/wallet_options_button.dart | 70 +++++- lib/route_generator.dart | 15 ++ 4 files changed, 360 insertions(+), 1 deletion(-) create mode 100644 lib/pages/settings_views/wallet_settings_view/wallet_settings_wallet_settings/edit_refresh_height_view.dart diff --git a/lib/pages/settings_views/wallet_settings_view/wallet_settings_wallet_settings/edit_refresh_height_view.dart b/lib/pages/settings_views/wallet_settings_view/wallet_settings_wallet_settings/edit_refresh_height_view.dart new file mode 100644 index 000000000..61d497452 --- /dev/null +++ b/lib/pages/settings_views/wallet_settings_view/wallet_settings_wallet_settings/edit_refresh_height_view.dart @@ -0,0 +1,238 @@ +import 'dart:async'; + +import 'package:flutter/material.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; + +import '../../../../notifications/show_flush_bar.dart'; +import '../../../../providers/db/main_db_provider.dart'; +import '../../../../providers/global/wallets_provider.dart'; +import '../../../../themes/stack_colors.dart'; +import '../../../../utilities/constants.dart'; +import '../../../../utilities/text_styles.dart'; +import '../../../../utilities/util.dart'; +import '../../../../wallets/wallet/intermediate/lib_monero_wallet.dart'; +import '../../../../widgets/background.dart'; +import '../../../../widgets/conditional_parent.dart'; +import '../../../../widgets/custom_buttons/app_bar_icon_button.dart'; +import '../../../../widgets/desktop/desktop_dialog.dart'; +import '../../../../widgets/desktop/desktop_dialog_close_button.dart'; +import '../../../../widgets/desktop/primary_button.dart'; +import '../../../../widgets/icon_widgets/x_icon.dart'; +import '../../../../widgets/stack_text_field.dart'; +import '../../../../widgets/textfield_icon_button.dart'; + +class EditRefreshHeightView extends ConsumerStatefulWidget { + const EditRefreshHeightView({ + super.key, + required this.walletId, + }); + + static const String routeName = "/editRefreshHeightView"; + + final String walletId; + + @override + ConsumerState createState() => + _EditRefreshHeightViewState(); +} + +class _EditRefreshHeightViewState extends ConsumerState { + late final LibMoneroWallet _wallet; + late final TextEditingController _controller; + final _focusNode = FocusNode(); + + bool _saveLock = false; + + void _save() async { + if (_saveLock) return; + _saveLock = true; + try { + String? errMessage; + try { + final newHeight = int.tryParse(_controller.text); + if (newHeight != null && newHeight >= 0) { + await _wallet.info.updateRestoreHeight( + newRestoreHeight: newHeight, + isar: ref.read(mainDBProvider).isar, + ); + _wallet.libMoneroWallet!.setRefreshFromBlockHeight(newHeight); + } else { + errMessage = "Invalid height: ${_controller.text}"; + } + } catch (e) { + errMessage = e.toString(); + } + + if (mounted) { + if (errMessage == null) { + Navigator.of(context).pop(); + unawaited( + showFloatingFlushBar( + type: FlushBarType.success, + message: "Refresh height updated", + context: context, + ), + ); + } else { + unawaited( + showFloatingFlushBar( + type: FlushBarType.warning, + message: errMessage, + context: context, + ), + ); + } + } + } finally { + _saveLock = false; + } + } + + @override + void initState() { + super.initState(); + _wallet = ref.read(pWallets).getWallet(widget.walletId) as LibMoneroWallet; + _controller = TextEditingController() + ..text = _wallet.libMoneroWallet!.getRefreshFromBlockHeight().toString(); + } + + @override + void dispose() { + _controller.dispose(); + _focusNode.dispose(); + super.dispose(); + } + + @override + Widget build(BuildContext context) { + return ConditionalParent( + condition: Util.isDesktop, + builder: (child) { + return DesktopDialog( + maxWidth: 500, + maxHeight: double.infinity, + child: Column( + mainAxisSize: MainAxisSize.min, + crossAxisAlignment: CrossAxisAlignment.stretch, + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.end, + children: [ + DesktopDialogCloseButton( + onPressedOverride: Navigator.of( + context, + rootNavigator: true, + ).pop, + ), + ], + ), + Padding( + padding: const EdgeInsets.symmetric(horizontal: 32), + child: child, + ), + const SizedBox( + height: 32, + ), + ], + ), + ); + }, + child: ConditionalParent( + condition: !Util.isDesktop, + builder: (child) { + return Background( + child: Scaffold( + backgroundColor: + Theme.of(context).extension()!.background, + appBar: AppBar( + leading: AppBarBackButton( + onPressed: () { + Navigator.of(context).pop(); + }, + ), + title: Text( + "Restore height", + style: STextStyles.navBarTitle(context), + ), + ), + body: Padding( + padding: const EdgeInsets.all(16), + child: child, + ), + ), + ); + }, + child: Column( + crossAxisAlignment: CrossAxisAlignment.stretch, + children: [ + ClipRRect( + borderRadius: BorderRadius.circular( + Constants.size.circularBorderRadius, + ), + child: TextField( + key: const Key("restoreHeightFieldKey"), + controller: _controller, + focusNode: _focusNode, + style: Util.isDesktop + ? STextStyles.desktopTextMedium(context).copyWith( + height: 2, + ) + : STextStyles.field(context), + enableSuggestions: false, + autocorrect: false, + autofocus: true, + onSubmitted: (_) => _save(), + onChanged: (_) => setState(() {}), + decoration: standardInputDecoration( + "Restore height", + _focusNode, + context, + ).copyWith( + suffixIcon: _controller.text.isNotEmpty + ? Padding( + padding: const EdgeInsets.only(right: 0), + child: UnconstrainedBox( + child: ConditionalParent( + condition: Util.isDesktop, + builder: (child) => SizedBox( + height: 70, + child: child, + ), + child: Row( + children: [ + TextFieldIconButton( + child: const XIcon(), + onTap: () async { + setState(() { + _controller.text = ""; + }); + }, + ), + ], + ), + ), + ), + ) + : Util.isDesktop + ? const SizedBox( + height: 70, + ) + : null, + ), + ), + ), + Util.isDesktop + ? const SizedBox( + height: 32, + ) + : const Spacer(), + PrimaryButton( + label: "Save", + onPressed: _save, + ), + ], + ), + ), + ); + } +} diff --git a/lib/pages/settings_views/wallet_settings_view/wallet_settings_wallet_settings/wallet_settings_wallet_settings_view.dart b/lib/pages/settings_views/wallet_settings_view/wallet_settings_wallet_settings/wallet_settings_wallet_settings_view.dart index bf41d6261..c689baf30 100644 --- a/lib/pages/settings_views/wallet_settings_view/wallet_settings_wallet_settings/wallet_settings_wallet_settings_view.dart +++ b/lib/pages/settings_views/wallet_settings_view/wallet_settings_wallet_settings/wallet_settings_wallet_settings_view.dart @@ -20,6 +20,7 @@ import '../../../../utilities/constants.dart'; import '../../../../utilities/text_styles.dart'; import '../../../../wallets/isar/models/wallet_info.dart'; import '../../../../wallets/isar/providers/wallet_info_provider.dart'; +import '../../../../wallets/wallet/intermediate/lib_monero_wallet.dart'; import '../../../../wallets/wallet/wallet_mixin_interfaces/lelantus_interface.dart'; import '../../../../wallets/wallet/wallet_mixin_interfaces/multi_address_interface.dart'; import '../../../../wallets/wallet/wallet_mixin_interfaces/rbf_interface.dart'; @@ -32,6 +33,7 @@ import '../../../../widgets/rounded_white_container.dart'; import '../../../../widgets/stack_dialog.dart'; import '../../../pinpad_views/lock_screen_view.dart'; import 'delete_wallet_warning_view.dart'; +import 'edit_refresh_height_view.dart'; import 'lelantus_settings_view.dart'; import 'rbf_settings_view.dart'; import 'rename_wallet_view.dart'; @@ -354,6 +356,42 @@ class _WalletSettingsWalletSettingsViewState ), ), ), + if (wallet is LibMoneroWallet) + const SizedBox( + height: 8, + ), + if (wallet is LibMoneroWallet) + RoundedWhiteContainer( + padding: const EdgeInsets.all(0), + child: RawMaterialButton( + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular( + Constants.size.circularBorderRadius, + ), + ), + materialTapTargetSize: MaterialTapTargetSize.shrinkWrap, + onPressed: () { + Navigator.of(context).pushNamed( + EditRefreshHeightView.routeName, + arguments: widget.walletId, + ); + }, + child: Padding( + padding: const EdgeInsets.symmetric( + horizontal: 12.0, + vertical: 20, + ), + child: Row( + children: [ + Text( + "Restore height", + style: STextStyles.titleBold12(context), + ), + ], + ), + ), + ), + ), const SizedBox( height: 8, ), diff --git a/lib/pages_desktop_specific/my_stack_view/wallet_view/sub_widgets/wallet_options_button.dart b/lib/pages_desktop_specific/my_stack_view/wallet_view/sub_widgets/wallet_options_button.dart index e0da6d5e9..f0756370f 100644 --- a/lib/pages_desktop_specific/my_stack_view/wallet_view/sub_widgets/wallet_options_button.dart +++ b/lib/pages_desktop_specific/my_stack_view/wallet_view/sub_widgets/wallet_options_button.dart @@ -17,6 +17,7 @@ import 'package:flutter_svg/svg.dart'; import '../../../../pages/settings_views/wallet_settings_view/frost_ms/frost_ms_options_view.dart'; import '../../../../pages/settings_views/wallet_settings_view/wallet_settings_wallet_settings/change_representative_view.dart'; +import '../../../../pages/settings_views/wallet_settings_view/wallet_settings_wallet_settings/edit_refresh_height_view.dart'; import '../../../../pages/settings_views/wallet_settings_view/wallet_settings_wallet_settings/xpub_view.dart'; import '../../../../providers/global/wallets_provider.dart'; import '../../../../route_generator.dart'; @@ -30,6 +31,7 @@ import '../../../../wallets/crypto_currency/coins/firo.dart'; import '../../../../wallets/crypto_currency/intermediate/frost_currency.dart'; import '../../../../wallets/crypto_currency/intermediate/nano_currency.dart'; import '../../../../wallets/isar/providers/wallet_info_provider.dart'; +import '../../../../wallets/wallet/intermediate/lib_monero_wallet.dart'; import '../../../../wallets/wallet/wallet_mixin_interfaces/extended_keys_interface.dart'; import '../../../../wallets/wallet/wallet_mixin_interfaces/view_only_option_interface.dart'; import '../../../addresses/desktop_wallet_addresses_view.dart'; @@ -44,7 +46,8 @@ enum _WalletOptions { showXpub, lelantusCoins, sparkCoins, - frostOptions; + frostOptions, + refreshFromHeight; String get prettyName { switch (this) { @@ -62,6 +65,8 @@ enum _WalletOptions { return "Spark Coins"; case _WalletOptions.frostOptions: return "FROST settings"; + case _WalletOptions.refreshFromHeight: + return "Refresh height"; } } } @@ -111,6 +116,9 @@ class WalletOptionsButton extends ConsumerWidget { onFrostMSWalletOptionsPressed: () async { Navigator.of(context).pop(_WalletOptions.frostOptions); }, + onRefreshHeightPressed: () async { + Navigator.of(context).pop(_WalletOptions.refreshFromHeight); + }, walletId: walletId, ); }, @@ -243,6 +251,26 @@ class WalletOptionsButton extends ConsumerWidget { ), ); break; + + case _WalletOptions.refreshFromHeight: + if (Util.isDesktop) { + unawaited( + showDialog( + context: context, + builder: (context) => EditRefreshHeightView( + walletId: walletId, + ), + ), + ); + } else { + unawaited( + Navigator.of(context).pushNamed( + EditRefreshHeightView.routeName, + arguments: walletId, + ), + ); + } + break; } } }, @@ -278,6 +306,7 @@ class WalletOptionsPopupMenu extends ConsumerWidget { required this.onFiroShowLelantusCoins, required this.onFiroShowSparkCoins, required this.onFrostMSWalletOptionsPressed, + required this.onRefreshHeightPressed, required this.walletId, }); @@ -288,6 +317,7 @@ class WalletOptionsPopupMenu extends ConsumerWidget { final VoidCallback onFiroShowLelantusCoins; final VoidCallback onFiroShowSparkCoins; final VoidCallback onFrostMSWalletOptionsPressed; + final VoidCallback onRefreshHeightPressed; final String walletId; @override @@ -307,6 +337,7 @@ class WalletOptionsPopupMenu extends ConsumerWidget { final bool canChangeRep = coin is NanoCurrency; final bool isFrost = coin is FrostCurrency; + final bool isMoneroWow = wallet is LibMoneroWallet; return Stack( children: [ @@ -509,6 +540,43 @@ class WalletOptionsPopupMenu extends ConsumerWidget { ), ), ), + if (isMoneroWow) + const SizedBox( + height: 8, + ), + if (isMoneroWow) + TransparentButton( + onPressed: onRefreshHeightPressed, + child: Padding( + padding: const EdgeInsets.all(8), + child: Row( + mainAxisAlignment: MainAxisAlignment.start, + children: [ + SvgPicture.asset( + Assets.svg.addressBookDesktop, + width: 20, + height: 20, + color: Theme.of(context) + .extension()! + .textFieldActiveSearchIconLeft, + ), + const SizedBox(width: 14), + Expanded( + child: Text( + _WalletOptions.refreshFromHeight.prettyName, + style: STextStyles.desktopTextExtraExtraSmall( + context, + ).copyWith( + color: Theme.of(context) + .extension()! + .textDark, + ), + ), + ), + ], + ), + ), + ), if (xpubEnabled) const SizedBox( height: 8, diff --git a/lib/route_generator.dart b/lib/route_generator.dart index 52454fb29..bcfffa8cd 100644 --- a/lib/route_generator.dart +++ b/lib/route_generator.dart @@ -135,6 +135,7 @@ import 'pages/settings_views/wallet_settings_view/wallet_settings_wallet_setting import 'pages/settings_views/wallet_settings_view/wallet_settings_wallet_settings/delete_view_only_wallet_keys_view.dart'; import 'pages/settings_views/wallet_settings_view/wallet_settings_wallet_settings/delete_wallet_recovery_phrase_view.dart'; import 'pages/settings_views/wallet_settings_view/wallet_settings_wallet_settings/delete_wallet_warning_view.dart'; +import 'pages/settings_views/wallet_settings_view/wallet_settings_wallet_settings/edit_refresh_height_view.dart'; import 'pages/settings_views/wallet_settings_view/wallet_settings_wallet_settings/lelantus_settings_view.dart'; import 'pages/settings_views/wallet_settings_view/wallet_settings_wallet_settings/rbf_settings_view.dart'; import 'pages/settings_views/wallet_settings_view/wallet_settings_wallet_settings/rename_wallet_view.dart'; @@ -2140,6 +2141,20 @@ class RouteGenerator { } return _routeError("${settings.name} invalid args: ${args.toString()}"); + case EditRefreshHeightView.routeName: + if (args is String) { + return getRoute( + shouldUseMaterialRoute: useMaterialPageRoute, + builder: (_) => EditRefreshHeightView( + walletId: args, + ), + settings: RouteSettings( + name: settings.name, + ), + ); + } + return _routeError("${settings.name} invalid args: ${args.toString()}"); + // == Desktop specific routes ============================================ case CreatePasswordView.routeName: if (args is bool) { From 2873595e40f34abe168ae940a954285f1c753868 Mon Sep 17 00:00:00 2001 From: julian Date: Wed, 11 Dec 2024 09:24:42 -0600 Subject: [PATCH 015/193] chore: use libsecret mirror due to instability of gitlab.gnome.org --- scripts/linux/build_secure_storage_deps.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/linux/build_secure_storage_deps.sh b/scripts/linux/build_secure_storage_deps.sh index 9956d286c..737508ab0 100755 --- a/scripts/linux/build_secure_storage_deps.sh +++ b/scripts/linux/build_secure_storage_deps.sh @@ -25,7 +25,7 @@ cd "$LINUX_DIRECTORY" || exit 1 #pip3 install --user meson markdown tomli --upgrade # pip3 install --user gi-docgen cd build || exit 1 -git -C libsecret pull origin $LIBSECRET_TAG || git clone https://gitlab.gnome.org/GNOME/libsecret.git libsecret +git -C libsecret pull origin $LIBSECRET_TAG || git clone https://git.cypherstack.com/Cypher_Stack/libsecret.git libsecret cd libsecret || exit 1 git checkout $LIBSECRET_TAG if ! [ -x "$(command -v meson)" ]; then From 4af7243265fcf2d116a207efd9a14b7cd1752c5c Mon Sep 17 00:00:00 2001 From: julian Date: Wed, 11 Dec 2024 11:54:14 -0600 Subject: [PATCH 016/193] feat: xmrrpc (and wowrpc) uri parsing + tests --- lib/utilities/node_uri_util.dart | 132 +++++++++++++++++++++++++ test/utilities/node_uri_util_test.dart | 104 +++++++++++++++++++ 2 files changed, 236 insertions(+) create mode 100644 lib/utilities/node_uri_util.dart create mode 100644 test/utilities/node_uri_util_test.dart diff --git a/lib/utilities/node_uri_util.dart b/lib/utilities/node_uri_util.dart new file mode 100644 index 000000000..73876949e --- /dev/null +++ b/lib/utilities/node_uri_util.dart @@ -0,0 +1,132 @@ +abstract interface class NodeQrData { + final String host; + final int port; + final String? label; + + NodeQrData({required this.host, required this.port, this.label}); + + String encode(); + String get scheme; +} + +abstract class LibMoneroNodeQrData extends NodeQrData { + final String user; + final String password; + + LibMoneroNodeQrData({ + required super.host, + required super.port, + super.label, + required this.user, + required this.password, + }); + + @override + String encode() { + String? userInfo; + if (user.isNotEmpty) { + userInfo = user; + if (password.isNotEmpty) { + userInfo += ":$password"; + } + } + + final uri = Uri( + scheme: scheme, + userInfo: userInfo, + port: port, + host: host, + queryParameters: {"label": label}, + ); + + return uri.toString(); + } + + @override + String toString() { + return "$runtimeType {" + "scheme: $scheme, " + "host: $host, " + "port: $port, " + "user: $user, " + "password: $password, " + "label: $label" + "}"; + } +} + +class MoneroNodeQrData extends LibMoneroNodeQrData { + MoneroNodeQrData({ + required super.host, + required super.port, + required super.user, + required super.password, + super.label, + }); + + @override + String get scheme => "xmrrpc"; +} + +class WowneroNodeQrData extends LibMoneroNodeQrData { + WowneroNodeQrData({ + required super.host, + required super.port, + required super.user, + required super.password, + super.label, + }); + + @override + String get scheme => "wowrpc"; +} + +abstract final class NodeQrUtil { + static ({String? user, String? password}) _parseUserInfo(String? userInfo) { + if (userInfo == null || userInfo.isEmpty) { + return (user: null, password: null); + } + + final splitIndex = userInfo.indexOf(":"); + if (splitIndex == -1) { + return (user: userInfo, password: null); + } + + return ( + user: userInfo.substring(0, splitIndex), + password: userInfo.substring(splitIndex + 1), + ); + } + + static NodeQrData decodeUri(String uriString) { + final uri = Uri.tryParse(uriString); + if (uri == null) throw Exception("Invalid uri string."); + if (!uri.hasAuthority) throw Exception("Uri has no authority."); + + final userInfo = _parseUserInfo(uri.userInfo); + + final query = uri.queryParameters; + + switch (uri.scheme) { + case "xmrrpc": + return MoneroNodeQrData( + host: uri.host, + port: uri.port, + user: userInfo.user ?? "", + password: userInfo.password ?? "", + label: query["label"], + ); + case "wowrpc": + return WowneroNodeQrData( + host: uri.host, + port: uri.port, + user: userInfo.user ?? "", + password: userInfo.password ?? "", + label: query["label"], + ); + + default: + throw Exception("Unknown node uri scheme \"${uri.scheme}\" found."); + } + } +} diff --git a/test/utilities/node_uri_util_test.dart b/test/utilities/node_uri_util_test.dart new file mode 100644 index 000000000..42d8474a0 --- /dev/null +++ b/test/utilities/node_uri_util_test.dart @@ -0,0 +1,104 @@ +import 'package:flutter_test/flutter_test.dart'; +import 'package:stackwallet/utilities/node_uri_util.dart'; + +void main() { + test("Valid xmrrpc scheme node uri", () { + expect( + NodeQrUtil.decodeUri( + "xmrrpc://nodo:password@bob.onion:18083?label=Nodo Tor Node", + ), + isA(), + ); + }); + + test("Valid wowrpc scheme node uri", () { + expect( + NodeQrUtil.decodeUri( + "wowrpc://nodo:password@10.0.0.10:18083", + ), + isA(), + ); + }); + + test("Invalid authority node uri", () { + String? message; + try { + NodeQrUtil.decodeUri( + "nodo:password@bob.onion:18083?label=Nodo Tor Node", + ); + } catch (e) { + message = e.toString(); + } + expect(message, "Exception: Uri has no authority."); + }); + + test("Empty uri string", () { + String? message; + try { + NodeQrUtil.decodeUri(""); + } catch (e) { + message = e.toString(); + } + expect(message, "Exception: Uri has no authority."); + }); + + test("Invalid uri string", () { + String? message; + try { + NodeQrUtil.decodeUri("::invalid@@@.ok"); + } catch (e) { + message = e.toString(); + } + expect(message, "Exception: Invalid uri string."); + }); + + test("Unknown uri string", () { + String? message; + try { + NodeQrUtil.decodeUri("http://u:p@host.com:80/lol?hmm=42"); + } catch (e) { + message = e.toString(); + } + expect(message, "Exception: Unknown node uri scheme \"http\" found."); + }); + + test("decoding to model", () { + final data = NodeQrUtil.decodeUri( + "xmrrpc://nodo:password@bob.onion:18083?label=Nodo+Tor+Node", + ); + expect(data.scheme, "xmrrpc"); + expect(data.host, "bob.onion"); + expect(data.port, 18083); + expect(data.label, "Nodo Tor Node"); + expect((data as MoneroNodeQrData?)?.user, "nodo"); + expect((data as MoneroNodeQrData?)?.password, "password"); + }); + + test("encoding to string", () { + const validString = + "xmrrpc://nodo:password@bob.onion:18083?label=Nodo+Tor+Node"; + final data = NodeQrUtil.decodeUri( + validString, + ); + expect(data.encode(), validString); + }); + + test("normal to string", () { + const validString = + "xmrrpc://nodo:password@bob.onion:18083?label=Nodo+Tor+Node"; + final data = NodeQrUtil.decodeUri( + validString, + ); + expect( + data.toString(), + "MoneroNodeQrData {" + "scheme: xmrrpc, " + "host: bob.onion, " + "port: 18083, " + "user: nodo, " + "password: password, " + "label: Nodo Tor Node" + "}", + ); + }); +} From cdf2dd88199b33e998923fb322cb6c0554a1ab05 Mon Sep 17 00:00:00 2001 From: julian Date: Wed, 11 Dec 2024 15:26:12 -0600 Subject: [PATCH 017/193] feat: xmrrpc (and wowrpc) node uri scanning ui for adding new nodes --- .../add_edit_node_view.dart | 177 ++++++++++++++++-- 1 file changed, 159 insertions(+), 18 deletions(-) diff --git a/lib/pages/settings_views/global_settings_view/manage_nodes_views/add_edit_node_view.dart b/lib/pages/settings_views/global_settings_view/manage_nodes_views/add_edit_node_view.dart index ccf4bf2ba..324a3d02a 100644 --- a/lib/pages/settings_views/global_settings_view/manage_nodes_views/add_edit_node_view.dart +++ b/lib/pages/settings_views/global_settings_view/manage_nodes_views/add_edit_node_view.dart @@ -10,6 +10,7 @@ import 'dart:async'; +import 'package:barcode_scan2/barcode_scan2.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; @@ -26,6 +27,8 @@ import '../../../../utilities/assets.dart'; import '../../../../utilities/constants.dart'; import '../../../../utilities/enums/sync_type_enum.dart'; import '../../../../utilities/flutter_secure_storage_interface.dart'; +import '../../../../utilities/logger.dart'; +import '../../../../utilities/node_uri_util.dart'; import '../../../../utilities/test_node_connection.dart'; import '../../../../utilities/text_styles.dart'; import '../../../../utilities/tor_plain_net_option_enum.dart'; @@ -38,7 +41,9 @@ import '../../../../widgets/conditional_parent.dart'; import '../../../../widgets/custom_buttons/app_bar_icon_button.dart'; import '../../../../widgets/desktop/desktop_dialog.dart'; import '../../../../widgets/desktop/primary_button.dart'; +import '../../../../widgets/desktop/qr_code_scanner_dialog.dart'; import '../../../../widgets/desktop/secondary_button.dart'; +import '../../../../widgets/icon_widgets/qrcode_icon.dart'; import '../../../../widgets/icon_widgets/x_icon.dart'; import '../../../../widgets/stack_dialog.dart'; import '../../../../widgets/stack_text_field.dart'; @@ -73,6 +78,8 @@ class _AddEditNodeViewState extends ConsumerState { late final String? nodeId; late final bool isDesktop; + (NodeModel, String)? _scannedResult; + late bool saveEnabled; late bool testConnectionEnabled; @@ -330,6 +337,77 @@ class _AddEditNodeViewState extends ConsumerState { } } + void _scanQr() async { + if (Util.isDesktop) { + try { + await showDialog( + context: context, + builder: (context) { + return QrCodeScannerDialog( + onQrCodeDetected: (qrCodeData) { + try { + _processQrData(qrCodeData); + } catch (e, s) { + Logging.instance.log( + "Error processing QR code data: $e\n$s", + level: LogLevel.Error, + ); + } + }, + ); + }, + ); + } catch (e, s) { + Logging.instance.log( + "Error opening QR code scanner dialog: $e\n$s", + level: LogLevel.Error, + ); + } + } else { + try { + final result = await BarcodeScanner.scan(); + await _processQrData(result.rawContent); + } catch (e, s) { + Logging.instance.log( + "$e\n$s", + level: LogLevel.Warning, + ); + } + } + } + + Future _processQrData(String data) async { + try { + final nodeQrData = NodeQrUtil.decodeUri(data); + if (mounted) { + setState(() { + _scannedResult = ( + NodeModel( + host: nodeQrData.host, + port: nodeQrData.port, + name: nodeQrData.label ?? "", + id: const Uuid().v1(), + useSSL: nodeQrData.scheme == "https", + enabled: true, + coinName: coin.identifier, + isFailover: true, + isDown: false, + torEnabled: true, + clearnetEnabled: !nodeQrData.host.endsWith(".onion"), + loginName: (nodeQrData as LibMoneroNodeQrData?)?.user, + ), + (nodeQrData as LibMoneroNodeQrData?)?.password ?? "" + ); + }); + } + } catch (e, s) { + Logging.instance.log( + "$e\n$s", + level: LogLevel.Warning, + ); + } + } + @override void initState() { isDesktop = Util.isDesktop; @@ -390,6 +468,35 @@ class _AddEditNodeViewState extends ConsumerState { style: STextStyles.navBarTitle(context), ), actions: [ + if (viewType == AddEditNodeViewType.add && + coin + is CryptonoteCurrency) // TODO: [prio=low] do something other than `coin is CryptonoteCurrency` in the future + Padding( + padding: const EdgeInsets.only( + top: 10, + bottom: 10, + right: 10, + ), + child: AspectRatio( + aspectRatio: 1, + child: AppBarIconButton( + key: const Key("qrNodeAppBarButtonKey"), + size: 36, + shadows: const [], + color: Theme.of(context) + .extension()! + .background, + icon: QrCodeIcon( + width: 20, + height: 20, + color: Theme.of(context) + .extension()! + .accentColorDark, + ), + onPressed: _scanQr, + ), + ), + ), if (viewType == AddEditNodeViewType.edit && ref .watch( @@ -473,19 +580,47 @@ class _AddEditNodeViewState extends ConsumerState { child: Column( mainAxisSize: MainAxisSize.min, children: [ + const SizedBox( + height: 8, + ), Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ - const SizedBox( - width: 8, - ), - const AppBarBackButton( - iconSize: 24, - size: 40, - ), - Text( - "Add new node", - style: STextStyles.desktopH3(context), + Row( + children: [ + const SizedBox( + width: 8, + ), + const AppBarBackButton( + iconSize: 24, + size: 40, + ), + Text( + "Add new node", + style: STextStyles.desktopH3(context), + ), + ], ), + if (coin + is CryptonoteCurrency) // TODO: [prio=low] do something other than `coin is CryptonoteCurrency` in the future + Padding( + padding: const EdgeInsets.only(right: 32), + child: AppBarIconButton( + size: 40, + color: isDesktop + ? Theme.of(context) + .extension()! + .textFieldDefaultBG + : Theme.of(context) + .extension()! + .background, + icon: const QrCodeIcon( + width: 21, + height: 21, + ), + onPressed: _scanQr, + ), + ), ], ), Padding( @@ -504,7 +639,9 @@ class _AddEditNodeViewState extends ConsumerState { crossAxisAlignment: CrossAxisAlignment.stretch, children: [ NodeForm( - node: node, + key: Key((node ?? _scannedResult?.$1)?.id ?? "none"), + node: node ?? _scannedResult?.$1, + scannedPw: _scannedResult?.$2, secureStore: ref.read(secureStoreProvider), readOnly: false, coin: widget.coin, @@ -629,6 +766,7 @@ class NodeForm extends ConsumerStatefulWidget { const NodeForm({ super.key, this.node, + this.scannedPw, required this.secureStore, required this.readOnly, required this.coin, @@ -636,6 +774,7 @@ class NodeForm extends ConsumerStatefulWidget { }); final NodeModel? node; + final String? scannedPw; final SecureStorageInterface secureStore; final bool readOnly; final CryptoCurrency coin; @@ -738,13 +877,15 @@ class _NodeFormState extends ConsumerState { if (widget.node != null) { final node = widget.node!; if (enableAuthFields) { - node.getPassword(widget.secureStore).then((value) { - if (value is String) { - _passwordController.text = value; - } - }); - - _usernameController.text = node.loginName ?? ""; + if (widget.scannedPw == null) { + node.getPassword(widget.secureStore).then((value) { + if (value is String) { + _passwordController.text = value; + } + }); + } else { + _passwordController.text = widget.scannedPw!; + } } _nameController.text = node.name; From e749c62ccd7760d62541bc33f2f47afa259a9586 Mon Sep 17 00:00:00 2001 From: julian Date: Wed, 11 Dec 2024 16:41:00 -0600 Subject: [PATCH 018/193] chore: satisfy linter --- .../desktop/qr_code_scanner_dialog.dart | 149 ++++++++++-------- 1 file changed, 83 insertions(+), 66 deletions(-) diff --git a/lib/widgets/desktop/qr_code_scanner_dialog.dart b/lib/widgets/desktop/qr_code_scanner_dialog.dart index edb6a074a..260ce61c9 100644 --- a/lib/widgets/desktop/qr_code_scanner_dialog.dart +++ b/lib/widgets/desktop/qr_code_scanner_dialog.dart @@ -23,14 +23,15 @@ import 'primary_button.dart'; import 'secondary_button.dart'; class QrCodeScannerDialog extends StatefulWidget { - final Function(String) onQrCodeDetected; + final void Function(String) onQrCodeDetected; - QrCodeScannerDialog({ + const QrCodeScannerDialog({ + super.key, required this.onQrCodeDetected, }); @override - _QrCodeScannerDialogState createState() => _QrCodeScannerDialogState(); + State createState() => _QrCodeScannerDialogState(); } class _QrCodeScannerDialogState extends State { @@ -66,16 +67,16 @@ class _QrCodeScannerDialogState extends State { }); if (Platform.isLinux && _cameraLinuxPlugin != null) { - await _cameraLinuxPlugin!.initializeCamera(); + await _cameraLinuxPlugin.initializeCamera(); Logging.instance.log("Linux Camera initialized", level: LogLevel.Info); } else if (Platform.isWindows && _cameraWindowsPlugin != null) { final List cameras = - await _cameraWindowsPlugin!.availableCameras(); + await _cameraWindowsPlugin.availableCameras(); if (cameras.isEmpty) { throw CameraException('No cameras available', 'No cameras found.'); } final CameraDescription camera = cameras[0]; // Could be user-selected. - _cameraId = await _cameraWindowsPlugin!.createCameraWithSettings( + _cameraId = await _cameraWindowsPlugin.createCameraWithSettings( camera, const MediaSettings( resolutionPreset: ResolutionPreset.low, @@ -84,11 +85,13 @@ class _QrCodeScannerDialogState extends State { enableAudio: false, ), ); - await _cameraWindowsPlugin!.initializeCamera(_cameraId); + await _cameraWindowsPlugin.initializeCamera(_cameraId); // await _cameraWindowsPlugin!.onCameraInitialized(_cameraId).first; // TODO [prio=low]: Make this work. ^^^ - Logging.instance.log("Windows Camera initialized with ID: $_cameraId", - level: LogLevel.Info); + Logging.instance.log( + "Windows Camera initialized with ID: $_cameraId", + level: LogLevel.Info, + ); } else if (Platform.isMacOS) { final List videoDevices = await CameraMacOS.instance .listDevices(deviceType: CameraMacOSDeviceType.video); @@ -104,8 +107,9 @@ class _QrCodeScannerDialogState extends State { }); Logging.instance.log( - "macOS Camera initialized with ID: $_macOSDeviceId", - level: LogLevel.Info); + "macOS Camera initialized with ID: $_macOSDeviceId", + level: LogLevel.Info, + ); } if (mounted) { setState(() { @@ -129,13 +133,15 @@ class _QrCodeScannerDialogState extends State { Future _stopCamera() async { try { if (Platform.isLinux && _cameraLinuxPlugin != null) { - _cameraLinuxPlugin!.stopCamera(); + _cameraLinuxPlugin.stopCamera(); Logging.instance.log("Linux Camera stopped", level: LogLevel.Info); } else if (Platform.isWindows && _cameraWindowsPlugin != null) { // if (_cameraId >= 0) { - await _cameraWindowsPlugin!.dispose(_cameraId); - Logging.instance.log("Windows Camera stopped with ID: $_cameraId", - level: LogLevel.Info); + await _cameraWindowsPlugin.dispose(_cameraId); + Logging.instance.log( + "Windows Camera stopped with ID: $_cameraId", + level: LogLevel.Info, + ); // } else { // Logging.instance.log("Windows Camera ID is null. Cannot dispose.", // level: LogLevel.Error); @@ -143,8 +149,10 @@ class _QrCodeScannerDialogState extends State { } else if (Platform.isMacOS) { // if (_macOSDeviceId != null) { await CameraMacOS.instance.stopImageStream(); - Logging.instance.log("macOS Camera stopped with ID: $_macOSDeviceId", - level: LogLevel.Info); + Logging.instance.log( + "macOS Camera stopped with ID: $_macOSDeviceId", + level: LogLevel.Info, + ); // } else { // Logging.instance.log("macOS Camera ID is null. Cannot stop.", // level: LogLevel.Error); @@ -168,7 +176,7 @@ class _QrCodeScannerDialogState extends State { try { String? base64Image; if (Platform.isLinux && _cameraLinuxPlugin != null) { - base64Image = await _cameraLinuxPlugin!.captureImage(); + base64Image = await _cameraLinuxPlugin.captureImage(); } else if (Platform.isWindows) { final XFile xfile = await _cameraWindowsPlugin!.takePicture(_cameraId); @@ -180,14 +188,14 @@ class _QrCodeScannerDialogState extends State { if (macOSimg == null) { Logging.instance .log("Failed to capture image", level: LogLevel.Error); - await Future.delayed(Duration(milliseconds: _imageDelayInMs)); + await Future.delayed(Duration(milliseconds: _imageDelayInMs)); continue; } final img.Image? image = img.decodeImage(macOSimg.bytes!); if (image == null) { Logging.instance .log("Failed to capture image", level: LogLevel.Error); - await Future.delayed(Duration(milliseconds: _imageDelayInMs)); + await Future.delayed(Duration(milliseconds: _imageDelayInMs)); continue; } base64Image = base64Encode(img.encodePng(image)); @@ -196,7 +204,7 @@ class _QrCodeScannerDialogState extends State { // Logging.instance // .log("Failed to capture image", level: LogLevel.Error); // Spammy. - await Future.delayed(Duration(milliseconds: _imageDelayInMs)); + await Future.delayed(Duration(milliseconds: _imageDelayInMs)); continue; } final img.Image? image = img.decodeImage(base64Decode(base64Image)); @@ -205,7 +213,7 @@ class _QrCodeScannerDialogState extends State { // > decoders, it is much slower than using an explicit decoder if (image == null) { Logging.instance.log("Failed to decode image", level: LogLevel.Error); - await Future.delayed(Duration(milliseconds: _imageDelayInMs)); + await Future.delayed(Duration(milliseconds: _imageDelayInMs)); continue; } @@ -233,8 +241,8 @@ class _QrCodeScannerDialogState extends State { // Spammy. } - await Future.delayed(Duration(milliseconds: _imageDelayInMs)); - } catch (e, s) { + await Future.delayed(Duration(milliseconds: _imageDelayInMs)); + } catch (e) { // Logging.instance.log("Failed to capture and scan image: $e\n$s", level: LogLevel.Error); // Spammy. @@ -266,7 +274,7 @@ class _QrCodeScannerDialogState extends State { return null; } return qrDecode.text; - } catch (e, s) { + } catch (e) { // Logging.instance.log("Failed to decode QR code: $e\n$s", level: LogLevel.Error); // Spammy. return null; @@ -322,61 +330,70 @@ class _QrCodeScannerDialogState extends State { allowedExtensions: ["png", "jpg", "jpeg"], ); - if (result == null || result.files.single.path == null) { - await showFloatingFlushBar( - type: FlushBarType.info, - message: "No file selected", - iconAsset: Assets.svg.file, - context: context, - ); - return; - } - - final filePath = result?.files.single.path!; - if (filePath == null) { - await showFloatingFlushBar( - type: FlushBarType.info, - message: "Error selecting file.", - iconAsset: Assets.svg.file, - context: context, - ); - return; - } - try { - final img.Image? image = - img.decodeImage(File(filePath!).readAsBytesSync()); - if (image == null) { + if (context.mounted) { + if (result == null || result.files.single.path == null) { await showFloatingFlushBar( type: FlushBarType.info, - message: "Failed to decode image.", + message: "No file selected", iconAsset: Assets.svg.file, context: context, ); return; } - final String? scanResult = await _scanImage(image); - if (scanResult != null && scanResult.isNotEmpty) { - widget.onQrCodeDetected(scanResult); - Navigator.of(context).pop(); - } else { + final filePath = result.files.single.path; + if (filePath == null) { await showFloatingFlushBar( type: FlushBarType.info, - message: "No QR code found in the image.", + message: "Error selecting file.", iconAsset: Assets.svg.file, context: context, ); + return; + } + + try { + final img.Image? image = + img.decodeImage(File(filePath).readAsBytesSync()); + if (image == null) { + await showFloatingFlushBar( + type: FlushBarType.info, + message: "Failed to decode image.", + iconAsset: Assets.svg.file, + context: context, + ); + return; + } + + final String? scanResult = await _scanImage(image); + if (context.mounted) { + if (scanResult != null && scanResult.isNotEmpty) { + widget.onQrCodeDetected(scanResult); + Navigator.of(context).pop(); + } else { + await showFloatingFlushBar( + type: FlushBarType.info, + message: "No QR code found in the image.", + iconAsset: Assets.svg.file, + context: context, + ); + } + } + } catch (e, s) { + Logging.instance.log( + "Failed to decode image: $e\n$s", + level: LogLevel.Error, + ); + if (context.mounted) { + await showFloatingFlushBar( + type: FlushBarType.info, + message: + "Error processing the image. Please try again.", + iconAsset: Assets.svg.file, + context: context, + ); + } } - } catch (e, s) { - Logging.instance.log("Failed to decode image: $e\n$s", - level: LogLevel.Error); - await showFloatingFlushBar( - type: FlushBarType.info, - message: - "Error processing the image. Please try again.", - iconAsset: Assets.svg.file, - context: context, - ); } }, ), From 3adddc2368627226a2d2e6ccd3c654aca27489d2 Mon Sep 17 00:00:00 2001 From: julian Date: Wed, 11 Dec 2024 17:40:22 -0600 Subject: [PATCH 019/193] fix: possible race condition when processing desktop qr data by returning the result on pop rather than using a callback, clean up some linter stuff, and prevent calling setState in dispose --- .../restore/restore_frost_ms_wallet_view.dart | 34 +- .../add_edit_node_view.dart | 77 +++-- .../wallet_view/sub_widgets/desktop_send.dart | 32 +- .../desktop/qr_code_scanner_dialog.dart | 290 ++++++++---------- lib/widgets/textfields/frost_step_field.dart | 30 +- 5 files changed, 226 insertions(+), 237 deletions(-) diff --git a/lib/pages/add_wallet_views/frost_ms/restore/restore_frost_ms_wallet_view.dart b/lib/pages/add_wallet_views/frost_ms/restore/restore_frost_ms_wallet_view.dart index 75c5cbc7d..14e1d45e5 100644 --- a/lib/pages/add_wallet_views/frost_ms/restore/restore_frost_ms_wallet_view.dart +++ b/lib/pages/add_wallet_views/frost_ms/restore/restore_frost_ms_wallet_view.dart @@ -228,26 +228,24 @@ class _RestoreFrostMsWalletViewState }); } else { // Platform.isLinux, Platform.isWindows, or Platform.isMacOS. - await showDialog( + final qrResult = await showDialog( context: context, - builder: (context) { - return QrCodeScannerDialog( - onQrCodeDetected: (qrCodeData) { - try { - // TODO [prio=low]: Validate QR code data. - configFieldController.text = qrCodeData; - - setState(() { - _configEmpty = configFieldController.text.isEmpty; - }); - } catch (e, s) { - Logging.instance.log("Error processing QR code data: $e\n$s", - level: LogLevel.Error); - } - }, - ); - }, + builder: (context) => const QrCodeScannerDialog(), ); + + if (qrResult == null) { + Logging.instance.log( + "Qr scanning cancelled", + level: LogLevel.Info, + ); + } else { + // TODO [prio=low]: Validate QR code data. + configFieldController.text = qrResult; + + setState(() { + _configEmpty = configFieldController.text.isEmpty; + }); + } } } on PlatformException catch (e, s) { Logging.instance.log( diff --git a/lib/pages/settings_views/global_settings_view/manage_nodes_views/add_edit_node_view.dart b/lib/pages/settings_views/global_settings_view/manage_nodes_views/add_edit_node_view.dart index 324a3d02a..fb18a4716 100644 --- a/lib/pages/settings_views/global_settings_view/manage_nodes_views/add_edit_node_view.dart +++ b/lib/pages/settings_views/global_settings_view/manage_nodes_views/add_edit_node_view.dart @@ -337,42 +337,53 @@ class _AddEditNodeViewState extends ConsumerState { } } + bool _scanLock = false; + void _scanQr() async { - if (Util.isDesktop) { - try { - await showDialog( - context: context, - builder: (context) { - return QrCodeScannerDialog( - onQrCodeDetected: (qrCodeData) { - try { - _processQrData(qrCodeData); - } catch (e, s) { - Logging.instance.log( - "Error processing QR code data: $e\n$s", - level: LogLevel.Error, - ); - } - }, + if (_scanLock) return; + _scanLock = true; + try { + if (Util.isDesktop) { + try { + final qrResult = await showDialog( + context: context, + builder: (context) => const QrCodeScannerDialog(), + ); + + if (qrResult == null) { + Logging.instance.log( + "Qr scanning cancelled", + level: LogLevel.Info, ); - }, - ); - } catch (e, s) { - Logging.instance.log( - "Error opening QR code scanner dialog: $e\n$s", - level: LogLevel.Error, - ); - } - } else { - try { - final result = await BarcodeScanner.scan(); - await _processQrData(result.rawContent); - } catch (e, s) { - Logging.instance.log( - "$e\n$s", - level: LogLevel.Warning, - ); + } else { + try { + await _processQrData(qrResult); + } catch (e, s) { + Logging.instance.log( + "Error processing QR code data: $e\n$s", + level: LogLevel.Error, + ); + } + } + } catch (e, s) { + Logging.instance.log( + "Error opening QR code scanner dialog: $e\n$s", + level: LogLevel.Error, + ); + } + } else { + try { + final result = await BarcodeScanner.scan(); + await _processQrData(result.rawContent); + } catch (e, s) { + Logging.instance.log( + "$e\n$s", + level: LogLevel.Warning, + ); + } } + } finally { + _scanLock = false; } } diff --git a/lib/pages_desktop_specific/my_stack_view/wallet_view/sub_widgets/desktop_send.dart b/lib/pages_desktop_specific/my_stack_view/wallet_view/sub_widgets/desktop_send.dart index 7fb764cfa..0fb65c635 100644 --- a/lib/pages_desktop_specific/my_stack_view/wallet_view/sub_widgets/desktop_send.dart +++ b/lib/pages_desktop_specific/my_stack_view/wallet_view/sub_widgets/desktop_send.dart @@ -145,23 +145,25 @@ class _DesktopSendState extends ConsumerState { Future scanWebcam() async { try { - await showDialog( + final qrResult = await showDialog( context: context, - builder: (context) { - return QrCodeScannerDialog( - onQrCodeDetected: (qrCodeData) { - try { - _processQrCodeData(qrCodeData); - } catch (e, s) { - Logging.instance.log( - "Error processing QR code data: $e\n$s", - level: LogLevel.Error, - ); - } - }, - ); - }, + builder: (context) => const QrCodeScannerDialog(), ); + if (qrResult == null) { + Logging.instance.log( + "Qr scanning cancelled", + level: LogLevel.Info, + ); + } else { + try { + _processQrCodeData(qrResult); + } catch (e, s) { + Logging.instance.log( + "Error processing QR code data: $e\n$s", + level: LogLevel.Error, + ); + } + } } catch (e, s) { Logging.instance.log( "Error opening QR code scanner dialog: $e\n$s", diff --git a/lib/widgets/desktop/qr_code_scanner_dialog.dart b/lib/widgets/desktop/qr_code_scanner_dialog.dart index 260ce61c9..b9a583f46 100644 --- a/lib/widgets/desktop/qr_code_scanner_dialog.dart +++ b/lib/widgets/desktop/qr_code_scanner_dialog.dart @@ -23,12 +23,7 @@ import 'primary_button.dart'; import 'secondary_button.dart'; class QrCodeScannerDialog extends StatefulWidget { - final void Function(String) onQrCodeDetected; - - const QrCodeScannerDialog({ - super.key, - required this.onQrCodeDetected, - }); + const QrCodeScannerDialog({super.key}); @override State createState() => _QrCodeScannerDialogState(); @@ -44,28 +39,26 @@ class _QrCodeScannerDialogState extends State { bool _isScanning = false; int _cameraId = -1; String? _macOSDeviceId; - final int _imageDelayInMs = 250; + final int _imageDelayInMs = Platform.isLinux ? 500 : 250; @override void initState() { super.initState(); - _isCameraOpen = false; - _isScanning = false; - _initializeCamera(); - } - @override - void dispose() { - _stopCamera(); - super.dispose(); + _initializeCamera().then((camOpen) { + WidgetsBinding.instance.addPostFrameCallback((_) { + if (mounted && camOpen) { + setState(() { + _isCameraOpen = true; + }); + unawaited(_captureAndScanImage()); + } + }); + }); } - Future _initializeCamera() async { + Future _initializeCamera() async { try { - setState(() { - _isScanning = true; // Show the progress indicator - }); - if (Platform.isLinux && _cameraLinuxPlugin != null) { await _cameraLinuxPlugin.initializeCamera(); Logging.instance.log("Linux Camera initialized", level: LogLevel.Info); @@ -102,35 +95,23 @@ class _QrCodeScannerDialogState extends State { await CameraMacOS.instance .initialize(cameraMacOSMode: CameraMacOSMode.photo); - setState(() { - _isCameraOpen = true; - }); - Logging.instance.log( "macOS Camera initialized with ID: $_macOSDeviceId", level: LogLevel.Info, ); } - if (mounted) { - setState(() { - _isCameraOpen = true; - _isScanning = true; - }); - } - unawaited(_captureAndScanImage()); // Could be awaited. + + return true; } catch (e, s) { Logging.instance .log("Failed to initialize camera: $e\n$s", level: LogLevel.Error); - if (mounted) { - // widget.onSnackbar("Failed to initialize camera. Please try again."); - setState(() { - _isScanning = false; - }); - } + return false; } } Future _stopCamera() async { + _isScanning = false; + try { if (Platform.isLinux && _cameraLinuxPlugin != null) { _cameraLinuxPlugin.stopCamera(); @@ -161,18 +142,12 @@ class _QrCodeScannerDialogState extends State { } catch (e, s) { Logging.instance .log("Failed to stop camera: $e\n$s", level: LogLevel.Error); - } finally { - if (mounted) { - setState(() { - _isScanning = false; - _isCameraOpen = false; - }); - } } } Future _captureAndScanImage() async { - while (_isCameraOpen && _isScanning) { + _isScanning = true; + while (_isScanning) { try { String? base64Image; if (Platform.isLinux && _cameraLinuxPlugin != null) { @@ -228,9 +203,10 @@ class _QrCodeScannerDialogState extends State { final String? scanResult = await _scanImage(image); if (scanResult != null && scanResult.isNotEmpty) { - widget.onQrCodeDetected(scanResult); + await _stopCamera(); + if (mounted) { - Navigator.of(context).pop(); + Navigator.of(context).pop(scanResult); } break; } else { @@ -283,135 +259,139 @@ class _QrCodeScannerDialogState extends State { @override Widget build(BuildContext context) { - return DesktopDialog( - maxWidth: 696, - maxHeight: 600, - child: Column( - mainAxisSize: MainAxisSize.min, - children: [ - Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - Padding( - padding: const EdgeInsets.only(left: 32), - child: Text( - "Scan QR code", - style: STextStyles.desktopH3(context), - ), - ), - const DesktopDialogCloseButton(), - ], - ), - Expanded( - child: _isCameraOpen - ? _image != null - ? _image! - : const Center( - child: CircularProgressIndicator(), - ) - : const Center( - child: - CircularProgressIndicator(), // Show progress indicator immediately - ), - ), - Padding( - padding: const EdgeInsets.all(16), - child: Row( + return PopScope( + onPopInvokedWithResult: (_, __) { + _stopCamera(); + }, + child: DesktopDialog( + maxWidth: 696, + maxHeight: 600, + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ - Expanded(child: Container()), - // "Select file" button. - SecondaryButton( - buttonHeight: ButtonHeight.l, - label: "Select file", - width: 200, - onPressed: () async { - final result = await FilePicker.platform.pickFiles( - type: FileType.custom, - allowedExtensions: ["png", "jpg", "jpeg"], - ); - - if (context.mounted) { - if (result == null || result.files.single.path == null) { - await showFloatingFlushBar( - type: FlushBarType.info, - message: "No file selected", - iconAsset: Assets.svg.file, - context: context, - ); - return; - } + Padding( + padding: const EdgeInsets.only(left: 32), + child: Text( + "Scan QR code", + style: STextStyles.desktopH3(context), + ), + ), + const DesktopDialogCloseButton(), + ], + ), + Expanded( + child: _isCameraOpen + ? _image != null + ? _image! + : const Center( + child: CircularProgressIndicator(), + ) + : const Center( + child: + CircularProgressIndicator(), // Show progress indicator immediately + ), + ), + Padding( + padding: const EdgeInsets.all(16), + child: Row( + children: [ + Expanded(child: Container()), + // "Select file" button. + SecondaryButton( + buttonHeight: ButtonHeight.l, + label: "Select file", + width: 200, + onPressed: () async { + final result = await FilePicker.platform.pickFiles( + type: FileType.custom, + allowedExtensions: ["png", "jpg", "jpeg"], + ); - final filePath = result.files.single.path; - if (filePath == null) { - await showFloatingFlushBar( - type: FlushBarType.info, - message: "Error selecting file.", - iconAsset: Assets.svg.file, - context: context, - ); - return; - } + if (context.mounted) { + if (result == null || + result.files.single.path == null) { + await showFloatingFlushBar( + type: FlushBarType.info, + message: "No file selected", + iconAsset: Assets.svg.file, + context: context, + ); + return; + } - try { - final img.Image? image = - img.decodeImage(File(filePath).readAsBytesSync()); - if (image == null) { + final filePath = result.files.single.path; + if (filePath == null) { await showFloatingFlushBar( type: FlushBarType.info, - message: "Failed to decode image.", + message: "Error selecting file.", iconAsset: Assets.svg.file, context: context, ); return; } - final String? scanResult = await _scanImage(image); - if (context.mounted) { - if (scanResult != null && scanResult.isNotEmpty) { - widget.onQrCodeDetected(scanResult); - Navigator.of(context).pop(); - } else { + try { + final img.Image? image = + img.decodeImage(File(filePath).readAsBytesSync()); + if (image == null) { await showFloatingFlushBar( type: FlushBarType.info, - message: "No QR code found in the image.", + message: "Failed to decode image.", iconAsset: Assets.svg.file, context: context, ); + return; } - } - } catch (e, s) { - Logging.instance.log( - "Failed to decode image: $e\n$s", - level: LogLevel.Error, - ); - if (context.mounted) { - await showFloatingFlushBar( - type: FlushBarType.info, - message: - "Error processing the image. Please try again.", - iconAsset: Assets.svg.file, - context: context, + + final String? scanResult = await _scanImage(image); + if (context.mounted) { + if (scanResult != null && scanResult.isNotEmpty) { + Navigator.of(context).pop(scanResult); + } else { + await showFloatingFlushBar( + type: FlushBarType.info, + message: "No QR code found in the image.", + iconAsset: Assets.svg.file, + context: context, + ); + } + } + } catch (e, s) { + Logging.instance.log( + "Failed to decode image: $e\n$s", + level: LogLevel.Error, ); + if (context.mounted) { + await showFloatingFlushBar( + type: FlushBarType.info, + message: + "Error processing the image. Please try again.", + iconAsset: Assets.svg.file, + context: context, + ); + } } } - } - }, - ), - const SizedBox(width: 16), - // Close button. - PrimaryButton( - buttonHeight: ButtonHeight.l, - label: "Close", - width: 272.5, - onPressed: () { - _stopCamera(); - Navigator.of(context).pop(); - }, - ), - ], + }, + ), + const SizedBox(width: 16), + // Close button. + PrimaryButton( + buttonHeight: ButtonHeight.l, + label: "Close", + width: 272.5, + onPressed: () { + Navigator.of(context).pop(); + }, + ), + ], + ), ), - ), - ], + ], + ), ), ); } diff --git a/lib/widgets/textfields/frost_step_field.dart b/lib/widgets/textfields/frost_step_field.dart index d6e6b0cb8..f7563080f 100644 --- a/lib/widgets/textfields/frost_step_field.dart +++ b/lib/widgets/textfields/frost_step_field.dart @@ -91,24 +91,22 @@ class _FrostStepFieldState extends State { _changed(widget.controller.text); } else { // Platform.isLinux, Platform.isWindows, or Platform.isMacOS. - await showDialog( + final qrResult = await showDialog( context: context, - builder: (context) { - return QrCodeScannerDialog( - onQrCodeDetected: (qrCodeData) { - try { - // TODO [prio=low]: Validate QR code data. - widget.controller.text = qrCodeData; - - _changed(widget.controller.text); - } catch (e, s) { - Logging.instance.log("Error processing QR code data: $e\n$s", - level: LogLevel.Error); - } - }, - ); - }, + builder: (context) => const QrCodeScannerDialog(), ); + + if (qrResult == null) { + Logging.instance.log( + "Qr scanning cancelled", + level: LogLevel.Info, + ); + } else { + // TODO [prio=low]: Validate QR code data. + widget.controller.text = qrResult; + + _changed(widget.controller.text); + } } } on PlatformException catch (e, s) { Logging.instance.log( From 120952156f76277f287ca7716bb8a18c25564bb3 Mon Sep 17 00:00:00 2001 From: julian Date: Wed, 11 Dec 2024 18:20:44 -0600 Subject: [PATCH 020/193] fix: Linux qr scan would previously load the last scanned data if it exists --- pubspec.lock | 9 +++++---- scripts/app_config/templates/pubspec.template | 6 +++++- 2 files changed, 10 insertions(+), 5 deletions(-) diff --git a/pubspec.lock b/pubspec.lock index 9b55c770b..812d1c1d6 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -254,10 +254,11 @@ packages: camera_linux: dependency: "direct main" description: - name: camera_linux - sha256: "6ea08c23f643364e650e8fad73653747c049cbd00803a7c317132379ee3653ac" - url: "https://pub.dev" - source: hosted + path: "." + ref: ecb412474c5d240347b04ac1eb9f019802ff7034 + resolved-ref: ecb412474c5d240347b04ac1eb9f019802ff7034 + url: "https://github.com/cypherstack/camera-linux" + source: git version: "0.0.8" camera_macos: dependency: "direct main" diff --git a/scripts/app_config/templates/pubspec.template b/scripts/app_config/templates/pubspec.template index 9b4541240..6e31b1405 100644 --- a/scripts/app_config/templates/pubspec.template +++ b/scripts/app_config/templates/pubspec.template @@ -184,7 +184,11 @@ dependencies: calendar_date_picker2: ^1.0.2 sqlite3: 2.4.3 sqlite3_flutter_libs: 0.5.22 - camera_linux: ^0.0.8 +# camera_linux: ^0.0.8 + camera_linux: + git: + url: https://github.com/cypherstack/camera-linux + ref: ecb412474c5d240347b04ac1eb9f019802ff7034 zxing2: ^0.2.3 camera_windows: git: # TODO [prio=low]: Revert to official after https://github.com/flutter/packages/pull/7067. From 9c64ed63163f9f5c39f78d187b3fc72a91a1a967 Mon Sep 17 00:00:00 2001 From: julian Date: Thu, 12 Dec 2024 16:53:21 -0600 Subject: [PATCH 021/193] chore: update deps --- pubspec.lock | 8 ++++---- scripts/app_config/templates/pubspec.template | 10 ++-------- 2 files changed, 6 insertions(+), 12 deletions(-) diff --git a/pubspec.lock b/pubspec.lock index 812d1c1d6..13ac9db0a 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -684,8 +684,8 @@ packages: dependency: "direct main" description: path: "." - ref: "6bf385b2e1e18c8aa23783cb8afeabace299cf68" - resolved-ref: "6bf385b2e1e18c8aa23783cb8afeabace299cf68" + ref: f0b1300140d45c13e7722f8f8d20308efeba8449 + resolved-ref: f0b1300140d45c13e7722f8f8d20308efeba8449 url: "https://github.com/cypherstack/electrum_adapter.git" source: git version: "3.0.0" @@ -1980,8 +1980,8 @@ packages: dependency: "direct main" description: path: "." - ref: "534ec251b339199446b723c01a25d324ae7bb974" - resolved-ref: "534ec251b339199446b723c01a25d324ae7bb974" + ref: "752f054b65c500adb9cad578bf183a978e012502" + resolved-ref: "752f054b65c500adb9cad578bf183a978e012502" url: "https://github.com/cypherstack/tor.git" source: git version: "0.0.1" diff --git a/scripts/app_config/templates/pubspec.template b/scripts/app_config/templates/pubspec.template index 6e31b1405..7626f030b 100644 --- a/scripts/app_config/templates/pubspec.template +++ b/scripts/app_config/templates/pubspec.template @@ -63,7 +63,7 @@ dependencies: tor_ffi_plugin: git: url: https://github.com/cypherstack/tor.git - ref: 647cadc3c82c276dc07915b02d24538fd610f220 + ref: 752f054b65c500adb9cad578bf183a978e012502 fusiondart: git: @@ -174,7 +174,7 @@ dependencies: electrum_adapter: git: url: https://github.com/cypherstack/electrum_adapter.git - ref: 6bf385b2e1e18c8aa23783cb8afeabace299cf68 + ref: f0b1300140d45c13e7722f8f8d20308efeba8449 stream_channel: ^2.1.0 solana: git: # TODO [prio=low]: Revert to official package once Tor support is merged upstream. @@ -245,12 +245,6 @@ dependency_overrides: ref: 0acacfd17eacf72135c693a7b862bd9b7cc56739 path: coinlib_flutter - # adding here due to pure laziness - tor_ffi_plugin: - git: - url: https://github.com/cypherstack/tor.git - ref: 534ec251b339199446b723c01a25d324ae7bb974 - bip47: git: url: https://github.com/cypherstack/bip47.git From c56038cadfd794678fd4f6a1fb25a0a246bc5d8d Mon Sep 17 00:00:00 2001 From: julian Date: Thu, 12 Dec 2024 16:54:55 -0600 Subject: [PATCH 022/193] fix: Prevent failed keys fetch from disabling display of mnemonic --- .../wallet_backup_views/cn_wallet_keys.dart | 12 +- .../unlock_wallet_keys_desktop.dart | 103 +----------------- .../intermediate/lib_monero_wallet.dart | 26 +++-- 3 files changed, 26 insertions(+), 115 deletions(-) diff --git a/lib/pages/settings_views/wallet_settings_view/wallet_backup_views/cn_wallet_keys.dart b/lib/pages/settings_views/wallet_settings_view/wallet_backup_views/cn_wallet_keys.dart index 14cae2ee0..ffe541b21 100644 --- a/lib/pages/settings_views/wallet_settings_view/wallet_backup_views/cn_wallet_keys.dart +++ b/lib/pages/settings_views/wallet_settings_view/wallet_backup_views/cn_wallet_keys.dart @@ -156,11 +156,13 @@ class _CNWalletKeysState extends State { SizedBox( height: Util.isDesktop ? 12 : 16, ), - QR( - data: _current(_currentDropDownValue), - size: - Util.isDesktop ? 256 : MediaQuery.of(context).size.width / 1.5, - ), + if (_current(_currentDropDownValue) != "ERROR") + QR( + data: _current(_currentDropDownValue), + size: Util.isDesktop + ? 256 + : MediaQuery.of(context).size.width / 1.5, + ), SizedBox( height: Util.isDesktop ? 12 : 16, ), diff --git a/lib/pages_desktop_specific/my_stack_view/wallet_view/sub_widgets/unlock_wallet_keys_desktop.dart b/lib/pages_desktop_specific/my_stack_view/wallet_view/sub_widgets/unlock_wallet_keys_desktop.dart index f2357448c..938e9568a 100644 --- a/lib/pages_desktop_specific/my_stack_view/wallet_view/sub_widgets/unlock_wallet_keys_desktop.dart +++ b/lib/pages_desktop_specific/my_stack_view/wallet_view/sub_widgets/unlock_wallet_keys_desktop.dart @@ -313,108 +313,7 @@ class _UnlockWalletKeysDesktopState child: PrimaryButton( label: "Continue", enabled: continueEnabled, - onPressed: continueEnabled - ? () async { - unawaited( - showDialog( - context: context, - builder: (context) => const Column( - mainAxisAlignment: MainAxisAlignment.center, - crossAxisAlignment: CrossAxisAlignment.center, - children: [ - LoadingIndicator( - width: 200, - height: 200, - ), - ], - ), - ), - ); - - await Future.delayed( - const Duration(seconds: 1), - ); - - final verified = await ref - .read(storageCryptoHandlerProvider) - .verifyPassphrase(passwordController.text); - - if (verified) { - if (context.mounted) { - Navigator.of(context, rootNavigator: true) - .pop(); - } - - ({String keys, String config})? frostData; - List? words; - - final wallet = - ref.read(pWallets).getWallet(widget.walletId); - - // TODO: [prio=low] handle wallets that don't have a mnemonic - // All wallets currently are mnemonic based - if (wallet is! MnemonicInterface) { - if (wallet is BitcoinFrostWallet) { - frostData = ( - keys: (await wallet.getSerializedKeys())!, - config: (await wallet.getMultisigConfig())!, - ); - } else { - throw Exception("FIXME ~= see todo in code"); - } - } else { - if (wallet is ViewOnlyOptionInterface && - (wallet as ViewOnlyOptionInterface) - .isViewOnly) { - // TODO: is something needed here? - } else { - words = await wallet.getMnemonicAsWords(); - } - } - - KeyDataInterface? keyData; - if (wallet is ViewOnlyOptionInterface && - wallet.isViewOnly) { - keyData = await wallet.getViewOnlyWalletData(); - } else if (wallet is ExtendedKeysInterface) { - keyData = await wallet.getXPrivs(); - } else if (wallet is LibMoneroWallet) { - keyData = await wallet.getKeys(); - } - - if (context.mounted) { - await Navigator.of(context) - .pushReplacementNamed( - WalletKeysDesktopPopup.routeName, - arguments: ( - mnemonic: words ?? [], - walletId: widget.walletId, - frostData: frostData, - keyData: keyData, - ), - ); - } - } else { - if (context.mounted) { - Navigator.of(context, rootNavigator: true) - .pop(); - } - - await Future.delayed( - const Duration(milliseconds: 300), - ); - if (context.mounted) { - unawaited( - showFloatingFlushBar( - type: FlushBarType.warning, - message: "Invalid passphrase!", - context: context, - ), - ); - } - } - } - : null, + onPressed: continueEnabled ? enterPassphrase : null, ), ), ], diff --git a/lib/wallets/wallet/intermediate/lib_monero_wallet.dart b/lib/wallets/wallet/intermediate/lib_monero_wallet.dart index ffcaa1560..3c3c34a6d 100644 --- a/lib/wallets/wallet/intermediate/lib_monero_wallet.dart +++ b/lib/wallets/wallet/intermediate/lib_monero_wallet.dart @@ -298,14 +298,24 @@ abstract class LibMoneroWallet if (base == null || (oldInfo != null && oldInfo.name != walletId)) { return null; } - - return CWKeyData( - walletId: walletId, - publicViewKey: base.getPublicViewKey(), - privateViewKey: base.getPrivateViewKey(), - publicSpendKey: base.getPublicSpendKey(), - privateSpendKey: base.getPrivateSpendKey(), - ); + try { + return CWKeyData( + walletId: walletId, + publicViewKey: base.getPublicViewKey(), + privateViewKey: base.getPrivateViewKey(), + publicSpendKey: base.getPublicSpendKey(), + privateSpendKey: base.getPrivateSpendKey(), + ); + } catch (e, s) { + Logging.instance.log("getKeys failed: $e\n$s", level: LogLevel.Fatal); + return CWKeyData( + walletId: walletId, + publicViewKey: "ERROR", + privateViewKey: "ERROR", + publicSpendKey: "ERROR", + privateSpendKey: "ERROR", + ); + } } Future<(String, String)> From 2e0ac0b2f517ef76a3260a3ba21eab994ce43482 Mon Sep 17 00:00:00 2001 From: julian Date: Thu, 12 Dec 2024 16:58:01 -0600 Subject: [PATCH 023/193] chore: extra logging --- lib/utilities/connection_check/electrum_connection_check.dart | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/lib/utilities/connection_check/electrum_connection_check.dart b/lib/utilities/connection_check/electrum_connection_check.dart index 85ff83511..ae8ba3f94 100644 --- a/lib/utilities/connection_check/electrum_connection_check.dart +++ b/lib/utilities/connection_check/electrum_connection_check.dart @@ -61,7 +61,8 @@ Future checkElectrumServer({ .timeout(Duration(seconds: (proxyInfo == null ? 5 : 30))); return true; - } catch (_) { + } catch (e, s) { + Logging.instance.log("$e\n$s", level: LogLevel.Debug); return false; } } From eeb595e0d9d6e893d9a4407db816745740db6421 Mon Sep 17 00:00:00 2001 From: julian Date: Thu, 12 Dec 2024 17:05:58 -0600 Subject: [PATCH 024/193] fix: Update device-locale dep version to handle linux crashes with certain locale configurations --- scripts/app_config/templates/pubspec.template | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/scripts/app_config/templates/pubspec.template b/scripts/app_config/templates/pubspec.template index 7626f030b..1f968ec1d 100644 --- a/scripts/app_config/templates/pubspec.template +++ b/scripts/app_config/templates/pubspec.template @@ -123,7 +123,10 @@ dependencies: barcode_scan2: ^4.3.3 wakelock_plus: ^1.2.8 intl: ^0.17.0 - devicelocale: ^0.7.1 + devicelocale: + git: + url: https://github.com/cypherstack/flutter-devicelocale + ref: ba7d7d87a3772e972adb1358a5ec9a111b514fce device_info_plus: ^10.1.2 keyboard_dismisser: ^3.0.0 another_flushbar: ^1.10.28 From e9aa2d6a30d0037da40de80dd3b469ecc87d23d6 Mon Sep 17 00:00:00 2001 From: julian Date: Thu, 12 Dec 2024 17:26:55 -0600 Subject: [PATCH 025/193] fix: force override of a dep we don't even use so that sqlite doesn't complain --- pubspec.lock | 13 +++++++------ scripts/app_config/templates/pubspec.template | 2 ++ 2 files changed, 9 insertions(+), 6 deletions(-) diff --git a/pubspec.lock b/pubspec.lock index 13ac9db0a..3ccce4760 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -627,11 +627,12 @@ packages: devicelocale: dependency: "direct main" description: - name: devicelocale - sha256: "0812b66f9eac57bc55c6ed4c178e0779440aa4e4e7c7e32fe1db02a758501d0e" - url: "https://pub.dev" - source: hosted - version: "0.7.1" + path: "." + ref: ba7d7d87a3772e972adb1358a5ec9a111b514fce + resolved-ref: ba7d7d87a3772e972adb1358a5ec9a111b514fce + url: "https://github.com/cypherstack/flutter-devicelocale" + source: git + version: "0.8.1" dio: dependency: transitive description: @@ -2187,7 +2188,7 @@ packages: source: hosted version: "1.1.0" web: - dependency: transitive + dependency: "direct overridden" description: name: web sha256: "97da13628db363c635202ad97068d47c5b8aa555808e7a9411963c533b449b27" diff --git a/scripts/app_config/templates/pubspec.template b/scripts/app_config/templates/pubspec.template index 1f968ec1d..e44cdcab4 100644 --- a/scripts/app_config/templates/pubspec.template +++ b/scripts/app_config/templates/pubspec.template @@ -231,6 +231,8 @@ flutter_native_splash: android_disable_fullscreen: true dependency_overrides: + # required to make devicelocale work + web: ^0.5.0 # needed for dart 3.5+ (at least for now) win32: ^5.5.4 From 744f27386296c4dedce5d28b94620c6ee62eecd4 Mon Sep 17 00:00:00 2001 From: julian Date: Fri, 13 Dec 2024 23:10:41 -0600 Subject: [PATCH 026/193] WIP: fix electrumx failovers, add some "default" firo nodes, and tweak firo pings --- lib/electrumx_rpc/electrumx_client.dart | 15 ++++--- lib/services/node_service.dart | 43 +++++++++++++++++++ lib/wallets/wallet/wallet.dart | 27 +++++++----- test/cached_electrumx_test.mocks.dart | 9 ---- .../bitcoin/bitcoin_wallet_test.mocks.dart | 9 ---- .../bitcoincash_wallet_test.mocks.dart | 9 ---- .../dogecoin/dogecoin_wallet_test.mocks.dart | 9 ---- .../namecoin/namecoin_wallet_test.mocks.dart | 9 ---- .../particl/particl_wallet_test.mocks.dart | 9 ---- 9 files changed, 68 insertions(+), 71 deletions(-) diff --git a/lib/electrumx_rpc/electrumx_client.dart b/lib/electrumx_rpc/electrumx_client.dart index dff2b68fd..39e27ee81 100644 --- a/lib/electrumx_rpc/electrumx_client.dart +++ b/lib/electrumx_rpc/electrumx_client.dart @@ -108,7 +108,7 @@ class ElectrumXClient { late Prefs _prefs; late TorService _torService; - List? failovers; + late final List _failovers; int currentFailoverIndex = -1; final Duration connectionTimeoutForSpecialCaseJsonRPCClients; @@ -145,6 +145,7 @@ class ElectrumXClient { _host = host; _port = port; _useSSL = useSSL; + _failovers = failovers; final bus = globalEventBusForTesting ?? GlobalEventBus.instance; @@ -284,9 +285,11 @@ class ElectrumXClient { usePort = port; useUseSSL = useSSL; } else { - useHost = failovers![currentFailoverIndex].address; - usePort = failovers![currentFailoverIndex].port; - useUseSSL = failovers![currentFailoverIndex].useSSL; + _electrumAdapterChannel = null; + await ClientManager.sharedInstance.remove(cryptoCurrency: cryptoCurrency); + useHost = _failovers[currentFailoverIndex].address; + usePort = _failovers[currentFailoverIndex].port; + useUseSSL = _failovers[currentFailoverIndex].useSSL; } _electrumAdapterChannel ??= await electrum_adapter.connect( @@ -402,7 +405,7 @@ class ElectrumXClient { rethrow; } } catch (e) { - if (failovers != null && currentFailoverIndex < failovers!.length - 1) { + if (currentFailoverIndex < _failovers.length - 1) { currentFailoverIndex++; return request( command: command, @@ -495,7 +498,7 @@ class ElectrumXClient { rethrow; } } catch (e) { - if (failovers != null && currentFailoverIndex < failovers!.length - 1) { + if (currentFailoverIndex < _failovers.length - 1) { currentFailoverIndex++; return batchRequest( command: command, diff --git a/lib/services/node_service.dart b/lib/services/node_service.dart index e55e2218b..db4a25a1b 100644 --- a/lib/services/node_service.dart +++ b/lib/services/node_service.dart @@ -32,6 +32,49 @@ class NodeService extends ChangeNotifier { }); Future updateDefaults() async { + // hack + if (AppConfig.coins.where((e) => e.identifier == "firo").isNotEmpty) { + final others = [ + "electrumx01.firo.org", + "electrumx02.firo.org", + "electrumx03.firo.org", + "electrumx.firo.org", + ]; + const port = 50002; + const idPrefix = "not_a_real_default_but_temp"; + + for (final host in others) { + final _id = "${idPrefix}_$host"; + + NodeModel? node = DB.instance.get( + boxName: DB.boxNameNodeModels, + key: _id, + ); + + if (node == null) { + node = NodeModel( + host: host, + port: port, + name: host, + id: _id, + useSSL: true, + enabled: true, + coinName: "firo", + isFailover: true, + isDown: false, + torEnabled: true, + clearnetEnabled: true, + ); + + await DB.instance.put( + boxName: DB.boxNameNodeModels, + key: _id, + value: node, + ); + } + } + } + for (final defaultNode in AppConfig.coins.map( (e) => e.defaultNode, )) { diff --git a/lib/wallets/wallet/wallet.dart b/lib/wallets/wallet/wallet.dart index 0beaf2a80..bb2d2df56 100644 --- a/lib/wallets/wallet/wallet.dart +++ b/lib/wallets/wallet/wallet.dart @@ -569,16 +569,19 @@ abstract class Wallet { final start = DateTime.now(); bool tAlive = true; - final t = Timer.periodic(const Duration(seconds: 1), (timer) async { - if (tAlive) { - final pingSuccess = await pingCheck(); - if (!pingSuccess) { - tAlive = false; + Timer? t; + if (this is! SparkInterface) { + t = Timer.periodic(const Duration(seconds: 1), (timer) async { + if (tAlive) { + final pingSuccess = await pingCheck(); + if (!pingSuccess) { + tAlive = false; + } + } else { + timer.cancel(); } - } else { - timer.cancel(); - } - }); + }); + } void _checkAlive() { if (!tAlive) throw Exception("refresh alive ping failure"); @@ -717,13 +720,15 @@ abstract class Wallet { _checkAlive(); GlobalEventBus.instance.fire(RefreshPercentChangedEvent(1.0, walletId)); - tAlive = false; // interrupt timer as its not needed anymore + if (this is! SparkInterface) { + tAlive = false; // interrupt timer as its not needed anymore + } completer.complete(); } catch (error, strace) { completer.completeError(error, strace); } finally { - t.cancel(); + t?.cancel(); refreshMutex.release(); if (!completer.isCompleted) { completer.completeError( diff --git a/test/cached_electrumx_test.mocks.dart b/test/cached_electrumx_test.mocks.dart index 993f73f69..25324b805 100644 --- a/test/cached_electrumx_test.mocks.dart +++ b/test/cached_electrumx_test.mocks.dart @@ -90,15 +90,6 @@ class MockElectrumXClient extends _i1.Mock implements _i5.ElectrumXClient { ), ) as _i2.CryptoCurrency); - @override - set failovers(List<_i5.ElectrumXNode>? _failovers) => super.noSuchMethod( - Invocation.setter( - #failovers, - _failovers, - ), - returnValueForMissingStub: null, - ); - @override int get currentFailoverIndex => (super.noSuchMethod( Invocation.getter(#currentFailoverIndex), diff --git a/test/services/coins/bitcoin/bitcoin_wallet_test.mocks.dart b/test/services/coins/bitcoin/bitcoin_wallet_test.mocks.dart index e38af7ce9..75fc2228a 100644 --- a/test/services/coins/bitcoin/bitcoin_wallet_test.mocks.dart +++ b/test/services/coins/bitcoin/bitcoin_wallet_test.mocks.dart @@ -87,15 +87,6 @@ class MockElectrumXClient extends _i1.Mock implements _i4.ElectrumXClient { ), ) as _i2.CryptoCurrency); - @override - set failovers(List<_i4.ElectrumXNode>? _failovers) => super.noSuchMethod( - Invocation.setter( - #failovers, - _failovers, - ), - returnValueForMissingStub: null, - ); - @override int get currentFailoverIndex => (super.noSuchMethod( Invocation.getter(#currentFailoverIndex), diff --git a/test/services/coins/bitcoincash/bitcoincash_wallet_test.mocks.dart b/test/services/coins/bitcoincash/bitcoincash_wallet_test.mocks.dart index edbb3c632..c6eadd8f6 100644 --- a/test/services/coins/bitcoincash/bitcoincash_wallet_test.mocks.dart +++ b/test/services/coins/bitcoincash/bitcoincash_wallet_test.mocks.dart @@ -87,15 +87,6 @@ class MockElectrumXClient extends _i1.Mock implements _i4.ElectrumXClient { ), ) as _i2.CryptoCurrency); - @override - set failovers(List<_i4.ElectrumXNode>? _failovers) => super.noSuchMethod( - Invocation.setter( - #failovers, - _failovers, - ), - returnValueForMissingStub: null, - ); - @override int get currentFailoverIndex => (super.noSuchMethod( Invocation.getter(#currentFailoverIndex), diff --git a/test/services/coins/dogecoin/dogecoin_wallet_test.mocks.dart b/test/services/coins/dogecoin/dogecoin_wallet_test.mocks.dart index c5c167366..344647a50 100644 --- a/test/services/coins/dogecoin/dogecoin_wallet_test.mocks.dart +++ b/test/services/coins/dogecoin/dogecoin_wallet_test.mocks.dart @@ -87,15 +87,6 @@ class MockElectrumXClient extends _i1.Mock implements _i4.ElectrumXClient { ), ) as _i2.CryptoCurrency); - @override - set failovers(List<_i4.ElectrumXNode>? _failovers) => super.noSuchMethod( - Invocation.setter( - #failovers, - _failovers, - ), - returnValueForMissingStub: null, - ); - @override int get currentFailoverIndex => (super.noSuchMethod( Invocation.getter(#currentFailoverIndex), diff --git a/test/services/coins/namecoin/namecoin_wallet_test.mocks.dart b/test/services/coins/namecoin/namecoin_wallet_test.mocks.dart index 80e8c8922..851a2855c 100644 --- a/test/services/coins/namecoin/namecoin_wallet_test.mocks.dart +++ b/test/services/coins/namecoin/namecoin_wallet_test.mocks.dart @@ -87,15 +87,6 @@ class MockElectrumXClient extends _i1.Mock implements _i4.ElectrumXClient { ), ) as _i2.CryptoCurrency); - @override - set failovers(List<_i4.ElectrumXNode>? _failovers) => super.noSuchMethod( - Invocation.setter( - #failovers, - _failovers, - ), - returnValueForMissingStub: null, - ); - @override int get currentFailoverIndex => (super.noSuchMethod( Invocation.getter(#currentFailoverIndex), diff --git a/test/services/coins/particl/particl_wallet_test.mocks.dart b/test/services/coins/particl/particl_wallet_test.mocks.dart index 0fde0b645..ccd74b4d7 100644 --- a/test/services/coins/particl/particl_wallet_test.mocks.dart +++ b/test/services/coins/particl/particl_wallet_test.mocks.dart @@ -87,15 +87,6 @@ class MockElectrumXClient extends _i1.Mock implements _i4.ElectrumXClient { ), ) as _i2.CryptoCurrency); - @override - set failovers(List<_i4.ElectrumXNode>? _failovers) => super.noSuchMethod( - Invocation.setter( - #failovers, - _failovers, - ), - returnValueForMissingStub: null, - ); - @override int get currentFailoverIndex => (super.noSuchMethod( Invocation.getter(#currentFailoverIndex), From d6aec00b584637ecf467f0d6d0ad5dd9680bcafc Mon Sep 17 00:00:00 2001 From: julian Date: Sat, 14 Dec 2024 15:29:17 -0600 Subject: [PATCH 027/193] WIP: paginated spark anon set prep --- lib/db/sqlite/firo_cache.dart | 52 ++++++ lib/db/sqlite/firo_cache_coordinator.dart | 168 ++++++++++++++---- lib/db/sqlite/firo_cache_reader.dart | 15 ++ lib/db/sqlite/firo_cache_worker.dart | 27 ++- lib/db/sqlite/firo_cache_writer.dart | 25 +++ lib/electrumx_rpc/electrumx_client.dart | 145 +++++++++++---- .../electrumx_response/spark_models.dart | 47 +++++ lib/wallets/wallet/impl/firo_wallet.dart | 1 + lib/wallets/wallet/wallet.dart | 2 +- .../spark_interface.dart | 7 +- 10 files changed, 420 insertions(+), 69 deletions(-) create mode 100644 lib/models/electrumx_response/spark_models.dart diff --git a/lib/db/sqlite/firo_cache.dart b/lib/db/sqlite/firo_cache.dart index eac511aaa..6b3c70c8e 100644 --- a/lib/db/sqlite/firo_cache.dart +++ b/lib/db/sqlite/firo_cache.dart @@ -9,6 +9,7 @@ import 'package:sqlite3/sqlite3.dart'; import 'package:uuid/uuid.dart'; import '../../electrumx_rpc/electrumx_client.dart'; +import '../../models/electrumx_response/spark_models.dart'; import '../../utilities/extensions/extensions.dart'; import '../../utilities/logger.dart'; import '../../utilities/stack_file_system.dart'; @@ -42,12 +43,17 @@ abstract class _FiroCache { network == CryptoCurrencyNetwork.main ? "spark_set_v$_setCacheVersion.sqlite3" : "spark_set_v${_setCacheVersion}_${network.name}.sqlite3"; + static String sparkSetMetaCacheFileName(CryptoCurrencyNetwork network) => + network == CryptoCurrencyNetwork.main + ? "spark_set_meta_v$_setCacheVersion.sqlite3" + : "spark_set_meta_v${_setCacheVersion}_${network.name}.sqlite3"; static String sparkUsedTagsCacheFileName(CryptoCurrencyNetwork network) => network == CryptoCurrencyNetwork.main ? "spark_tags_v$_tagsCacheVersion.sqlite3" : "spark_tags_v${_tagsCacheVersion}_${network.name}.sqlite3"; static final Map _setCacheDB = {}; + static final Map _setMetaCacheDB = {}; static final Map _usedTagsCacheDB = {}; static Database setCacheDB(CryptoCurrencyNetwork network) { if (_setCacheDB[network] == null) { @@ -58,6 +64,15 @@ abstract class _FiroCache { return _setCacheDB[network]!; } + static Database setMetaCacheDB(CryptoCurrencyNetwork network) { + if (_setMetaCacheDB[network] == null) { + throw Exception( + "FiroCache.init() must be called before accessing FiroCache.db!", + ); + } + return _setMetaCacheDB[network]!; + } + static Database usedTagsCacheDB(CryptoCurrencyNetwork network) { if (_usedTagsCacheDB[network] == null) { throw Exception( @@ -78,12 +93,18 @@ abstract class _FiroCache { final sparkSetCacheFile = File("${sqliteDir.path}/${sparkSetCacheFileName(network)}"); + final sparkSetMetaCacheFile = + File("${sqliteDir.path}/${sparkSetMetaCacheFileName(network)}"); + final sparkUsedTagsCacheFile = File("${sqliteDir.path}/${sparkUsedTagsCacheFileName(network)}"); if (!(await sparkSetCacheFile.exists())) { await _createSparkSetCacheDb(sparkSetCacheFile.path); } + if (!(await sparkSetMetaCacheFile.exists())) { + await _createSparkSetMetaCacheDb(sparkSetMetaCacheFile.path); + } if (!(await sparkUsedTagsCacheFile.exists())) { await _createSparkUsedTagsCacheDb(sparkUsedTagsCacheFile.path); } @@ -92,6 +113,10 @@ abstract class _FiroCache { sparkSetCacheFile.path, mode: OpenMode.readWrite, ); + _setMetaCacheDB[network] = sqlite3.open( + sparkSetMetaCacheFile.path, + mode: OpenMode.readWrite, + ); _usedTagsCacheDB[network] = sqlite3.open( sparkUsedTagsCacheFile.path, mode: OpenMode.readWrite, @@ -109,6 +134,12 @@ abstract class _FiroCache { VACUUM; """, ); + setMetaCacheDB(network).execute( + """ + DELETE FROM PreviousMetaFetchResult; + VACUUM; + """, + ); usedTagsCacheDB(network).execute( """ DELETE FROM SparkUsedCoinTags; @@ -159,6 +190,27 @@ abstract class _FiroCache { db.dispose(); } + static Future _createSparkSetMetaCacheDb(String file) async { + final db = sqlite3.open( + file, + mode: OpenMode.readWriteCreate, + ); + + db.execute( + """ + CREATE TABLE PreviousMetaFetchResult ( + id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT UNIQUE, + coinGroupId INTEGER NOT NULL UNIQUE, + blockHash TEXT NOT NULL, + setHash TEXT NOT NULL, + size INTEGER NOT NULL + ); + """, + ); + + db.dispose(); + } + static Future _createSparkUsedTagsCacheDb(String file) async { final db = sqlite3.open( file, diff --git a/lib/db/sqlite/firo_cache_coordinator.dart b/lib/db/sqlite/firo_cache_coordinator.dart index fe720f804..81da6134b 100644 --- a/lib/db/sqlite/firo_cache_coordinator.dart +++ b/lib/db/sqlite/firo_cache_coordinator.dart @@ -6,6 +6,8 @@ typedef LTagPair = ({String tag, String txid}); /// background isolate and [FiroCacheCoordinator] should manage that isolate abstract class FiroCacheCoordinator { static final Map _workers = {}; + static final Map _tagLocks = {}; + static final Map _setLocks = {}; static bool _init = false; static Future init() async { @@ -15,6 +17,8 @@ abstract class FiroCacheCoordinator { _init = true; await _FiroCache.init(); for (final network in _FiroCache.networks) { + _tagLocks[network] = Mutex(); + _setLocks[network] = Mutex(); _workers[network] = await _FiroCacheWorker.spawn(network); } } @@ -28,14 +32,26 @@ abstract class FiroCacheCoordinator { final setCacheFile = File( "${dir.path}/${_FiroCache.sparkSetCacheFileName(network)}", ); + final setMetaCacheFile = File( + "${dir.path}/${_FiroCache.sparkSetMetaCacheFileName(network)}", + ); final usedTagsCacheFile = File( "${dir.path}/${_FiroCache.sparkUsedTagsCacheFileName(network)}", ); - final int bytes = - ((await setCacheFile.exists()) ? await setCacheFile.length() : 0) + - ((await usedTagsCacheFile.exists()) - ? await usedTagsCacheFile.length() - : 0); + + final setSize = + (await setCacheFile.exists()) ? await setCacheFile.length() : 0; + final tagsSize = (await usedTagsCacheFile.exists()) + ? await usedTagsCacheFile.length() + : 0; + final setMetaSize = + (await setMetaCacheFile.exists()) ? await setMetaCacheFile.length() : 0; + + print("TAG SIZE: $tagsSize"); + print("SET SIZE: $setSize"); + print("SET META SIZE: $setMetaSize"); + + final int bytes = tagsSize + setSize + setMetaSize; if (bytes < 1024) { return '$bytes B'; @@ -55,43 +71,116 @@ abstract class FiroCacheCoordinator { ElectrumXClient client, CryptoCurrencyNetwork network, ) async { - final count = await FiroCacheCoordinator.getUsedCoinTagsCount(network); - final unhashedTags = await client.getSparkUnhashedUsedCoinsTagsWithTxHashes( - startNumber: count, - ); - if (unhashedTags.isNotEmpty) { - await _workers[network]!.runTask( - FCTask( - func: FCFuncName._updateSparkUsedTagsWith, - data: unhashedTags, - ), + await _tagLocks[network]!.protect(() async { + final count = await FiroCacheCoordinator.getUsedCoinTagsCount(network); + final unhashedTags = + await client.getSparkUnhashedUsedCoinsTagsWithTxHashes( + startNumber: count, ); - } + if (unhashedTags.isNotEmpty) { + await _workers[network]!.runTask( + FCTask( + func: FCFuncName._updateSparkUsedTagsWith, + data: unhashedTags, + ), + ); + } + }); } static Future runFetchAndUpdateSparkAnonSetCacheForGroupId( int groupId, ElectrumXClient client, CryptoCurrencyNetwork network, + void Function(int countFetched, int totalCount)? progressUpdated, ) async { - final blockhashResult = - await FiroCacheCoordinator.getLatestSetInfoForGroupId( - groupId, - network, - ); - final blockHash = blockhashResult?.blockHash ?? ""; + await _setLocks[network]!.protect(() async { + Map json; + SparkAnonymitySetMeta? meta; - final json = await client.getSparkAnonymitySet( - coinGroupId: groupId.toString(), - startBlockHash: blockHash.toHexReversedFromBase64, - ); + if (progressUpdated == null) { + // Legacy + final blockhashResult = + await FiroCacheCoordinator.getLatestSetInfoForGroupId( + groupId, + network, + ); + final blockHash = blockhashResult?.blockHash ?? ""; - await _workers[network]!.runTask( - FCTask( - func: FCFuncName._updateSparkAnonSetCoinsWith, - data: (groupId, json), - ), - ); + json = await client.getSparkAnonymitySet( + coinGroupId: groupId.toString(), + startBlockHash: blockHash.toHexReversedFromBase64, + ); + } else { + const sectorSize = 100; // TODO adjust this? + final prevMetaSize = + await FiroCacheCoordinator.getSparkMetaSetSizeForGroupId( + groupId, + network, + ); + final prevSize = prevMetaSize ?? 0; + + meta = await client.getSparkAnonymitySetMeta( + coinGroupId: groupId, + ); + + progressUpdated.call(prevSize, meta.size); + + /// Returns blockHash (last block hash), + /// setHash (hash of current set) + /// and coins (the list of pairs serialized coin and tx hash) + + final fullSectorCount = (meta.size - prevSize) ~/ sectorSize; + final remainder = (meta.size - prevSize) % sectorSize; + + final List coins = []; + + for (int i = 0; i < fullSectorCount; i++) { + final start = (i * sectorSize) + prevSize; + final data = await client.getSparkAnonymitySetBySector( + coinGroupId: groupId, + latestBlock: meta.blockHash, + startIndex: start, + endIndex: start + sectorSize, + ); + + coins.addAll(data); + } + + if (remainder > 0) { + final data = await client.getSparkAnonymitySetBySector( + coinGroupId: groupId, + latestBlock: meta.blockHash, + startIndex: meta.size - remainder, + endIndex: meta.size, + ); + + coins.addAll(data); + } + + json = { + "blockHash": meta.blockHash, + "setHash": meta.setHash, + "coins": coins, + }; + } + + await _workers[network]!.runTask( + FCTask( + func: FCFuncName._updateSparkAnonSetCoinsWith, + data: (groupId, json), + ), + ); + + if (meta != null) { + await _workers[network]!.runTask( + FCTask( + func: FCFuncName._updateSparkAnonSetMetaWith, + data: meta, + ), + ); + } + }); } // =========================================================================== @@ -228,4 +317,19 @@ abstract class FiroCacheCoordinator { db: _FiroCache.setCacheDB(network), ); } + + static Future getSparkMetaSetSizeForGroupId( + int groupId, + CryptoCurrencyNetwork network, + ) async { + final result = await _Reader._getSizeForGroupId( + groupId, + db: _FiroCache.setMetaCacheDB(network), + ); + if (result.isEmpty) { + return null; + } + + return result.first["size"] as int; + } } diff --git a/lib/db/sqlite/firo_cache_reader.dart b/lib/db/sqlite/firo_cache_reader.dart index 33763ba3e..11e6382f8 100644 --- a/lib/db/sqlite/firo_cache_reader.dart +++ b/lib/db/sqlite/firo_cache_reader.dart @@ -56,6 +56,21 @@ abstract class _Reader { return db.select("$query;").first["setExists"] == 1; } + // =========================================================================== + // =============== Spark anonymity set meta queries ========================== + static Future _getSizeForGroupId( + int groupId, { + required Database db, + }) async { + final query = """ + SELECT ss.size + FROM PreviousMetaFetchResult ss + WHERE ss.groupId = $groupId; + """; + + return db.select("$query;"); + } + // =========================================================================== // =============== Spark used coin tags queries ============================== diff --git a/lib/db/sqlite/firo_cache_worker.dart b/lib/db/sqlite/firo_cache_worker.dart index 71e407992..a417cdb07 100644 --- a/lib/db/sqlite/firo_cache_worker.dart +++ b/lib/db/sqlite/firo_cache_worker.dart @@ -3,6 +3,7 @@ part of 'firo_cache.dart'; enum FCFuncName { _updateSparkAnonSetCoinsWith, _updateSparkUsedTagsWith, + _updateSparkAnonSetMetaWith, } class FCTask { @@ -29,6 +30,8 @@ class _FiroCacheWorker { final dir = await StackFileSystem.applicationFiroCacheSQLiteDirectory(); final setCacheFilePath = "${dir.path}/${_FiroCache.sparkSetCacheFileName(network)}"; + final setMetaCacheFilePath = + "${dir.path}/${_FiroCache.sparkSetMetaCacheFileName(network)}"; final usedTagsCacheFilePath = "${dir.path}/${_FiroCache.sparkUsedTagsCacheFileName(network)}"; @@ -48,7 +51,12 @@ class _FiroCacheWorker { try { await Isolate.spawn( _startWorkerIsolate, - (initPort.sendPort, setCacheFilePath, usedTagsCacheFilePath), + ( + initPort.sendPort, + setCacheFilePath, + setMetaCacheFilePath, + usedTagsCacheFilePath, + ), ); } catch (_) { initPort.close(); @@ -79,6 +87,7 @@ class _FiroCacheWorker { ReceivePort receivePort, SendPort sendPort, Database setCacheDb, + Database setMetaCacheDb, Database usedTagsCacheDb, Mutex mutex, ) { @@ -104,6 +113,13 @@ class _FiroCacheWorker { task.data as List>, ); break; + + case FCFuncName._updateSparkAnonSetMetaWith: + result = _updateSparkAnonSetMetaWith( + setMetaCacheDb, + task.data as SparkAnonymitySetMeta, + ); + break; } if (result.success) { @@ -118,7 +134,7 @@ class _FiroCacheWorker { }); } - static void _startWorkerIsolate((SendPort, String, String) args) { + static void _startWorkerIsolate((SendPort, String, String, String) args) { final receivePort = ReceivePort(); args.$1.send(receivePort.sendPort); final mutex = Mutex(); @@ -126,14 +142,19 @@ class _FiroCacheWorker { args.$2, mode: OpenMode.readWrite, ); - final usedTagsCacheDb = sqlite3.open( + final setMetaCacheDb = sqlite3.open( args.$3, mode: OpenMode.readWrite, ); + final usedTagsCacheDb = sqlite3.open( + args.$4, + mode: OpenMode.readWrite, + ); _handleCommandsToIsolate( receivePort, args.$1, setCacheDb, + setMetaCacheDb, usedTagsCacheDb, mutex, ); diff --git a/lib/db/sqlite/firo_cache_writer.dart b/lib/db/sqlite/firo_cache_writer.dart index 99d318444..36b71369b 100644 --- a/lib/db/sqlite/firo_cache_writer.dart +++ b/lib/db/sqlite/firo_cache_writer.dart @@ -48,6 +48,31 @@ FCResult _updateSparkUsedTagsWith( } } +// =========================================================================== +// ================== write to spark anon set Meta cache ========================== +FCResult _updateSparkAnonSetMetaWith( + Database db, + SparkAnonymitySetMeta meta, +) { + db.execute("BEGIN;"); + try { + db.execute( + """ + INSERT OR REPLACE INTO PreviousMetaFetchResult (coinGroupId, blockHash, setHash, size) + VALUES (?, ?, ?, ?); + """, + [meta.coinGroupId, meta.blockHash, meta.setHash, meta.size], + ); + + db.execute("COMMIT;"); + + return FCResult(success: true); + } catch (e) { + db.execute("ROLLBACK;"); + return FCResult(success: false, error: e); + } +} + // =========================================================================== // ================== write to spark anon set cache ========================== diff --git a/lib/electrumx_rpc/electrumx_client.dart b/lib/electrumx_rpc/electrumx_client.dart index 39e27ee81..f8196388a 100644 --- a/lib/electrumx_rpc/electrumx_client.dart +++ b/lib/electrumx_rpc/electrumx_client.dart @@ -21,6 +21,7 @@ import 'package:mutex/mutex.dart'; import 'package:stream_channel/stream_channel.dart'; import '../exceptions/electrumx/no_such_transaction.dart'; +import '../models/electrumx_response/spark_models.dart'; import '../services/event_bus/events/global/tor_connection_status_changed_event.dart'; import '../services/event_bus/events/global/tor_status_changed_event.dart'; import '../services/event_bus/global_event_bus.dart'; @@ -34,13 +35,6 @@ import '../wallets/crypto_currency/crypto_currency.dart'; import '../wallets/crypto_currency/interfaces/electrumx_currency_interface.dart'; import 'client_manager.dart'; -typedef SparkMempoolData = ({ - String txid, - List serialContext, - List lTags, - List coins, -}); - class WifiOnlyException implements Exception {} class TorOnlyException implements Exception {} @@ -1037,29 +1031,30 @@ class ElectrumXClient { /// "b476ed2b374bb081ea51d111f68f0136252521214e213d119b8dc67b92f5a390", /// ] /// } - Future>> getSparkMintMetaData({ - String? requestID, - required List sparkCoinHashes, - }) async { - try { - Logging.instance.log( - "attempting to fetch spark.getsparkmintmetadata...", - level: LogLevel.Info, - ); - await checkElectrumAdapter(); - final List response = - await (getElectrumAdapter() as FiroElectrumClient) - .getSparkMintMetaData(sparkCoinHashes: sparkCoinHashes); - Logging.instance.log( - "Fetching spark.getsparkmintmetadata finished", - level: LogLevel.Info, - ); - return List>.from(response); - } catch (e) { - Logging.instance.log(e, level: LogLevel.Error); - rethrow; - } - } + /// NOT USED? + // Future>> getSparkMintMetaData({ + // String? requestID, + // required List sparkCoinHashes, + // }) async { + // try { + // Logging.instance.log( + // "attempting to fetch spark.getsparkmintmetadata...", + // level: LogLevel.Info, + // ); + // await checkElectrumAdapter(); + // final List response = + // await (getElectrumAdapter() as FiroElectrumClient) + // .getSparkMintMetaData(sparkCoinHashes: sparkCoinHashes); + // Logging.instance.log( + // "Fetching spark.getsparkmintmetadata finished", + // level: LogLevel.Info, + // ); + // return List>.from(response); + // } catch (e) { + // Logging.instance.log(e, level: LogLevel.Error); + // rethrow; + // } + // } /// Returns the latest Spark set id /// @@ -1135,7 +1130,7 @@ class ElectrumXClient { final List result = []; for (final entry in map.entries) { result.add( - ( + SparkMempoolData( txid: entry.key, serialContext: List.from(entry.value["serial_context"] as List), @@ -1191,6 +1186,94 @@ class ElectrumXClient { rethrow; } } + // ======== New Paginated Endpoints ========================================== + + Future getSparkAnonymitySetMeta({ + String? requestID, + required int coinGroupId, + }) async { + try { + const command = + "spark.getsparkanonyumitysetmeta"; // TODO verify this will be correct + final start = DateTime.now(); + final response = await request( + requestID: requestID, + command: command, + args: [ + "$coinGroupId", + ], + ); + + final map = Map.from(response as Map); + + final result = SparkAnonymitySetMeta( + coinGroupId: coinGroupId, + blockHash: map["blockHash"] as String, + setHash: map["setHash"] as String, + size: map["size"] as int, + ); + + Logging.instance.log( + "Finished ElectrumXClient.getSparkAnonymitySetMeta(" + "requestID=$requestID, " + "coinGroupId=$coinGroupId" + "). Set meta=$result, " + "Duration=${DateTime.now().difference(start)}", + level: LogLevel.Debug, + ); + + return result; + } catch (e) { + Logging.instance.log(e, level: LogLevel.Error); + rethrow; + } + } + + Future> getSparkAnonymitySetBySector({ + String? requestID, + required int coinGroupId, + required String latestBlock, + required int startIndex, // inclusive + required int endIndex, // exclusive + }) async { + try { + const command = + "spark.getsparkanonyumitysetsector"; // TODO verify this will be correct + final start = DateTime.now(); + final response = await request( + requestID: requestID, + command: command, + args: [ + "$coinGroupId", + latestBlock, + "$startIndex", + "$endIndex", + ], + ); + + final map = Map.from(response as Map); + + final result = map["coins"] as List; + + Logging.instance.log( + "Finished ElectrumXClient.getSparkAnonymitySetBySector(" + "requestID=$requestID, " + "coinGroupId=$coinGroupId, " + "latestBlock=$latestBlock, " + "startIndex=$startIndex, " + "endIndex=$endIndex" + "). # of coins=${result.length}, " + "Duration=${DateTime.now().difference(start)}", + level: LogLevel.Debug, + ); + + return result; + } catch (e) { + Logging.instance.log(e, level: LogLevel.Error); + rethrow; + } + } + // =========================================================================== Future isMasterNodeCollateral({ diff --git a/lib/models/electrumx_response/spark_models.dart b/lib/models/electrumx_response/spark_models.dart new file mode 100644 index 000000000..499f20cf6 --- /dev/null +++ b/lib/models/electrumx_response/spark_models.dart @@ -0,0 +1,47 @@ +class SparkMempoolData { + final String txid; + final List serialContext; + final List lTags; + final List coins; + + SparkMempoolData({ + required this.txid, + required this.serialContext, + required this.lTags, + required this.coins, + }); + + @override + String toString() { + return "SparkMempoolData{" + "txid: $txid, " + "serialContext: $serialContext, " + "lTags: $lTags, " + "coins: $coins" + "}"; + } +} + +class SparkAnonymitySetMeta { + final int coinGroupId; + final String blockHash; + final String setHash; + final int size; + + SparkAnonymitySetMeta({ + required this.coinGroupId, + required this.blockHash, + required this.setHash, + required this.size, + }); + + @override + String toString() { + return "SparkAnonymitySetMeta{" + "coinGroupId: $coinGroupId, " + "blockHash: $blockHash, " + "setHash: $setHash, " + "size: $size" + "}"; + } +} diff --git a/lib/wallets/wallet/impl/firo_wallet.dart b/lib/wallets/wallet/impl/firo_wallet.dart index 1ff9999fe..d4faabef9 100644 --- a/lib/wallets/wallet/impl/firo_wallet.dart +++ b/lib/wallets/wallet/impl/firo_wallet.dart @@ -725,6 +725,7 @@ class FiroWallet extends Bip39HDWallet i, electrumXClient, cryptoCurrency.network, + null, ), ); } diff --git a/lib/wallets/wallet/wallet.dart b/lib/wallets/wallet/wallet.dart index bb2d2df56..6e5a9c08f 100644 --- a/lib/wallets/wallet/wallet.dart +++ b/lib/wallets/wallet/wallet.dart @@ -670,7 +670,7 @@ abstract class Wallet { GlobalEventBus.instance.fire(RefreshPercentChangedEvent(0.3, walletId)); if (this is SparkInterface && !viewOnly) { // this should be called before updateTransactions() - await (this as SparkInterface).refreshSparkData(); + await (this as SparkInterface).refreshSparkData(null); } _checkAlive(); diff --git a/lib/wallets/wallet/wallet_mixin_interfaces/spark_interface.dart b/lib/wallets/wallet/wallet_mixin_interfaces/spark_interface.dart index 977a95124..8460ce319 100644 --- a/lib/wallets/wallet/wallet_mixin_interfaces/spark_interface.dart +++ b/lib/wallets/wallet/wallet_mixin_interfaces/spark_interface.dart @@ -795,7 +795,9 @@ mixin SparkInterface } } - Future refreshSparkData() async { + Future refreshSparkData( + void Function(int countFetched, int totalCount)? progressUpdated, + ) async { final start = DateTime.now(); try { // start by checking if any previous sets are missing from db and add the @@ -823,6 +825,7 @@ mixin SparkInterface e, electrumXClient, cryptoCurrency.network, + null, ), ); @@ -1086,7 +1089,7 @@ mixin SparkInterface } try { - await refreshSparkData(); + await refreshSparkData(null); } catch (e, s) { Logging.instance.log( "$runtimeType $walletId ${info.name}: $e\n$s", From ae10bef0ee93df723361fdf1c182b414d988e9c8 Mon Sep 17 00:00:00 2001 From: julian Date: Sun, 15 Dec 2024 20:15:33 -0600 Subject: [PATCH 028/193] fix: updated spark data calls and caching --- lib/db/sqlite/firo_cache_coordinator.dart | 23 +++++++++++++++++------ lib/db/sqlite/firo_cache_reader.dart | 6 +++--- lib/electrumx_rpc/electrumx_client.dart | 10 +++++++--- 3 files changed, 27 insertions(+), 12 deletions(-) diff --git a/lib/db/sqlite/firo_cache_coordinator.dart b/lib/db/sqlite/firo_cache_coordinator.dart index 81da6134b..45fa4c62e 100644 --- a/lib/db/sqlite/firo_cache_coordinator.dart +++ b/lib/db/sqlite/firo_cache_coordinator.dart @@ -47,9 +47,18 @@ abstract class FiroCacheCoordinator { final setMetaSize = (await setMetaCacheFile.exists()) ? await setMetaCacheFile.length() : 0; - print("TAG SIZE: $tagsSize"); - print("SET SIZE: $setSize"); - print("SET META SIZE: $setMetaSize"); + Logging.instance.log( + "Spark cache used tags size: $tagsSize", + level: LogLevel.Debug, + ); + Logging.instance.log( + "Spark cache anon set size: $setSize", + level: LogLevel.Debug, + ); + Logging.instance.log( + "Spark cache set meta size: $setMetaSize", + level: LogLevel.Debug, + ); final int bytes = tagsSize + setSize + setMetaSize; @@ -112,7 +121,7 @@ abstract class FiroCacheCoordinator { startBlockHash: blockHash.toHexReversedFromBase64, ); } else { - const sectorSize = 100; // TODO adjust this? + const sectorSize = 2000; // TODO adjust this? final prevMetaSize = await FiroCacheCoordinator.getSparkMetaSetSizeForGroupId( groupId, @@ -139,10 +148,11 @@ abstract class FiroCacheCoordinator { final start = (i * sectorSize) + prevSize; final data = await client.getSparkAnonymitySetBySector( coinGroupId: groupId, - latestBlock: meta.blockHash, + latestBlock: meta.blockHash.toHexReversedFromBase64, startIndex: start, endIndex: start + sectorSize, ); + progressUpdated.call(start + sectorSize, meta.size); coins.addAll(data); } @@ -150,10 +160,11 @@ abstract class FiroCacheCoordinator { if (remainder > 0) { final data = await client.getSparkAnonymitySetBySector( coinGroupId: groupId, - latestBlock: meta.blockHash, + latestBlock: meta.blockHash.toHexReversedFromBase64, startIndex: meta.size - remainder, endIndex: meta.size, ); + progressUpdated.call(meta.size, meta.size); coins.addAll(data); } diff --git a/lib/db/sqlite/firo_cache_reader.dart b/lib/db/sqlite/firo_cache_reader.dart index 11e6382f8..b27cd77e3 100644 --- a/lib/db/sqlite/firo_cache_reader.dart +++ b/lib/db/sqlite/firo_cache_reader.dart @@ -63,9 +63,9 @@ abstract class _Reader { required Database db, }) async { final query = """ - SELECT ss.size - FROM PreviousMetaFetchResult ss - WHERE ss.groupId = $groupId; + SELECT size + FROM PreviousMetaFetchResult + WHERE coinGroupId = $groupId; """; return db.select("$query;"); diff --git a/lib/electrumx_rpc/electrumx_client.dart b/lib/electrumx_rpc/electrumx_client.dart index f8196388a..6737e7b4b 100644 --- a/lib/electrumx_rpc/electrumx_client.dart +++ b/lib/electrumx_rpc/electrumx_client.dart @@ -1193,8 +1193,12 @@ class ElectrumXClient { required int coinGroupId, }) async { try { - const command = - "spark.getsparkanonyumitysetmeta"; // TODO verify this will be correct + const command = "spark.getsparkanonymitysetmeta"; + Logging.instance.log( + "[${getElectrumAdapter()?.host}] => attempting to fetch $command...", + level: LogLevel.Info, + ); + final start = DateTime.now(); final response = await request( requestID: requestID, @@ -1238,7 +1242,7 @@ class ElectrumXClient { }) async { try { const command = - "spark.getsparkanonyumitysetsector"; // TODO verify this will be correct + "spark.getsparkanonymitysetsector"; // TODO verify this will be correct final start = DateTime.now(); final response = await request( requestID: requestID, From c1ef98833a22f909838747a1f22f98d6299638fd Mon Sep 17 00:00:00 2001 From: julian Date: Sun, 15 Dec 2024 20:17:41 -0600 Subject: [PATCH 029/193] reduced pings --- lib/electrumx_rpc/electrumx_client.dart | 5 +-- lib/utilities/constants.dart | 2 +- lib/wallets/wallet/wallet.dart | 47 +++---------------------- 3 files changed, 9 insertions(+), 45 deletions(-) diff --git a/lib/electrumx_rpc/electrumx_client.dart b/lib/electrumx_rpc/electrumx_client.dart index 6737e7b4b..3f8241bca 100644 --- a/lib/electrumx_rpc/electrumx_client.dart +++ b/lib/electrumx_rpc/electrumx_client.dart @@ -399,6 +399,7 @@ class ElectrumXClient { rethrow; } } catch (e) { + Logging.instance.log("$host $e", level: LogLevel.Debug); if (currentFailoverIndex < _failovers.length - 1) { currentFailoverIndex++; return request( @@ -525,10 +526,10 @@ class ElectrumXClient { return await request( requestID: requestID, command: 'server.ping', - requestTimeout: const Duration(seconds: 3), + requestTimeout: const Duration(seconds: 30), retries: retryCount, ).timeout( - const Duration(seconds: 3), + const Duration(seconds: 30), onTimeout: () { Logging.instance.log( "ElectrumxClient.ping timed out with retryCount=$retryCount, host=$_host", diff --git a/lib/utilities/constants.dart b/lib/utilities/constants.dart index 6b64d4a73..163b7d04e 100644 --- a/lib/utilities/constants.dart +++ b/lib/utilities/constants.dart @@ -35,7 +35,7 @@ abstract class Constants { // // true; // true for development, static const int notificationsMax = 0xFFFFFFFF; - static const Duration networkAliveTimerDuration = Duration(seconds: 10); + static const Duration networkAliveTimerDuration = Duration(seconds: 30); // Enable Logger.print statements static const bool disableLogger = false; diff --git a/lib/wallets/wallet/wallet.dart b/lib/wallets/wallet/wallet.dart index 6e5a9c08f..5b8eba8a6 100644 --- a/lib/wallets/wallet/wallet.dart +++ b/lib/wallets/wallet/wallet.dart @@ -415,6 +415,11 @@ abstract class Wallet { } void _periodicPingCheck() async { + if (refreshMutex.isLocked) { + // should be active calls happening so no need to make extra work + return; + } + final bool hasNetwork = await pingCheck(); if (_isConnected != hasNetwork) { @@ -568,25 +573,6 @@ abstract class Wallet { } final start = DateTime.now(); - bool tAlive = true; - Timer? t; - if (this is! SparkInterface) { - t = Timer.periodic(const Duration(seconds: 1), (timer) async { - if (tAlive) { - final pingSuccess = await pingCheck(); - if (!pingSuccess) { - tAlive = false; - } - } else { - timer.cancel(); - } - }); - } - - void _checkAlive() { - if (!tAlive) throw Exception("refresh alive ping failure"); - } - final viewOnly = this is ViewOnlyOptionInterface && (this as ViewOnlyOptionInterface).isViewOnly; @@ -603,57 +589,45 @@ abstract class Wallet { ), ); - _checkAlive(); - // add some small buffer before making calls. // this can probably be removed in the future but was added as a // debugging feature await Future.delayed(const Duration(milliseconds: 300)); - _checkAlive(); // TODO: [prio=low] handle this differently. Extra modification of this file for coin specific functionality should be avoided. final Set codesToCheck = {}; - _checkAlive(); if (this is PaynymInterface && !viewOnly) { // isSegwit does not matter here at all final myCode = await (this as PaynymInterface).getPaymentCode(isSegwit: false); - _checkAlive(); final nym = await PaynymIsApi().nym(myCode.toString()); - _checkAlive(); if (nym.value != null) { for (final follower in nym.value!.followers) { codesToCheck.add(follower.code); } - _checkAlive(); for (final following in nym.value!.following) { codesToCheck.add(following.code); } } - _checkAlive(); } GlobalEventBus.instance.fire(RefreshPercentChangedEvent(0.0, walletId)); _checkAlive(); await updateChainHeight(); - _checkAlive(); if (this is BitcoinFrostWallet) { await (this as BitcoinFrostWallet).lookAhead(); } - _checkAlive(); GlobalEventBus.instance.fire(RefreshPercentChangedEvent(0.1, walletId)); - _checkAlive(); // TODO: [prio=low] handle this differently. Extra modification of this file for coin specific functionality should be avoided. if (this is MultiAddressInterface) { if (info.otherData[WalletInfoKeys.reuseAddress] != true) { await (this as MultiAddressInterface) .checkReceivingAddressForTransactions(); } - _checkAlive(); } GlobalEventBus.instance.fire(RefreshPercentChangedEvent(0.2, walletId)); @@ -672,49 +646,39 @@ abstract class Wallet { // this should be called before updateTransactions() await (this as SparkInterface).refreshSparkData(null); } - _checkAlive(); - GlobalEventBus.instance.fire(RefreshPercentChangedEvent(0.50, walletId)); - _checkAlive(); final fetchFuture = updateTransactions(); _checkAlive(); final utxosRefreshFuture = updateUTXOs(); // if (currentHeight != storedHeight) { GlobalEventBus.instance.fire(RefreshPercentChangedEvent(0.60, walletId)); - _checkAlive(); await utxosRefreshFuture; GlobalEventBus.instance.fire(RefreshPercentChangedEvent(0.70, walletId)); - _checkAlive(); await fetchFuture; // TODO: [prio=low] handle this differently. Extra modification of this file for coin specific functionality should be avoided. if (!viewOnly && this is PaynymInterface && codesToCheck.isNotEmpty) { - _checkAlive(); await (this as PaynymInterface) .checkForNotificationTransactionsTo(codesToCheck); // check utxos again for notification outputs - _checkAlive(); await updateUTXOs(); } _checkAlive(); GlobalEventBus.instance.fire(RefreshPercentChangedEvent(0.80, walletId)); // await getAllTxsToWatch(); - _checkAlive(); // TODO: [prio=low] handle this differently. Extra modification of this file for coin specific functionality should be avoided. if (this is LelantusInterface && !viewOnly) { if (info.otherData[WalletInfoKeys.enableLelantusScanning] as bool? ?? false) { await (this as LelantusInterface).refreshLelantusData(); - _checkAlive(); } } GlobalEventBus.instance.fire(RefreshPercentChangedEvent(0.90, walletId)); - _checkAlive(); await updateBalance(); _checkAlive(); @@ -728,7 +692,6 @@ abstract class Wallet { } catch (error, strace) { completer.completeError(error, strace); } finally { - t?.cancel(); refreshMutex.release(); if (!completer.isCompleted) { completer.completeError( From 1884bfbaf799eccff7f9833c7300f81bdc2cbeeb Mon Sep 17 00:00:00 2001 From: julian Date: Sun, 15 Dec 2024 20:22:39 -0600 Subject: [PATCH 030/193] fix: tweak sync percent feature and track progress during spark anon set download --- .../wallet_network_settings_view.dart | 6 +- lib/wallets/wallet/wallet.dart | 37 ++++---- .../electrumx_interface.dart | 2 + .../spark_interface.dart | 92 +++++++++++++++---- 4 files changed, 100 insertions(+), 37 deletions(-) diff --git a/lib/pages/settings_views/wallet_settings_view/wallet_network_settings_view/wallet_network_settings_view.dart b/lib/pages/settings_views/wallet_settings_view/wallet_network_settings_view/wallet_network_settings_view.dart index 1be577f1d..f8eb344a8 100644 --- a/lib/pages/settings_views/wallet_settings_view/wallet_network_settings_view/wallet_network_settings_view.dart +++ b/lib/pages/settings_views/wallet_settings_view/wallet_network_settings_view/wallet_network_settings_view.dart @@ -39,6 +39,7 @@ import '../../../../wallets/isar/providers/wallet_info_provider.dart'; import '../../../../wallets/wallet/impl/epiccash_wallet.dart'; import '../../../../wallets/wallet/impl/monero_wallet.dart'; import '../../../../wallets/wallet/impl/wownero_wallet.dart'; +import '../../../../wallets/wallet/wallet_mixin_interfaces/electrumx_interface.dart'; import '../../../../widgets/animated_text.dart'; import '../../../../widgets/background.dart'; import '../../../../widgets/conditional_parent.dart'; @@ -233,7 +234,10 @@ class _WalletNetworkSettingsViewState _percent = 1; _blocksRemaining = 0; } else { - _percent = 0; + _percent = + (ref.read(pWallets).getWallet(widget.walletId) as ElectrumXInterface?) + ?.refreshingPercent ?? + 0; _blocksRemaining = -1; } diff --git a/lib/wallets/wallet/wallet.dart b/lib/wallets/wallet/wallet.dart index 5b8eba8a6..b0516b74e 100644 --- a/lib/wallets/wallet/wallet.dart +++ b/lib/wallets/wallet/wallet.dart @@ -564,6 +564,11 @@ abstract class Wallet { return future; } + void _fireRefreshPercentChange(double percent) { + (this as ElectrumXInterface?)?.refreshingPercent = percent; + GlobalEventBus.instance.fire(RefreshPercentChangedEvent(percent, walletId)); + } + // Should fire events Future _refresh(Completer completer) async { // Awaiting this lock could be dangerous. @@ -612,15 +617,14 @@ abstract class Wallet { } } - GlobalEventBus.instance.fire(RefreshPercentChangedEvent(0.0, walletId)); - _checkAlive(); + _fireRefreshPercentChange(0); await updateChainHeight(); if (this is BitcoinFrostWallet) { await (this as BitcoinFrostWallet).lookAhead(); } - GlobalEventBus.instance.fire(RefreshPercentChangedEvent(0.1, walletId)); + _fireRefreshPercentChange(0.1); // TODO: [prio=low] handle this differently. Extra modification of this file for coin specific functionality should be avoided. if (this is MultiAddressInterface) { @@ -630,8 +634,7 @@ abstract class Wallet { } } - GlobalEventBus.instance.fire(RefreshPercentChangedEvent(0.2, walletId)); - _checkAlive(); + _fireRefreshPercentChange(0.2); // TODO: [prio=low] handle this differently. Extra modification of this file for coin specific functionality should be avoided. if (this is MultiAddressInterface) { @@ -640,21 +643,21 @@ abstract class Wallet { .checkChangeAddressForTransactions(); } } - _checkAlive(); - GlobalEventBus.instance.fire(RefreshPercentChangedEvent(0.3, walletId)); + _fireRefreshPercentChange(0.3); if (this is SparkInterface && !viewOnly) { // this should be called before updateTransactions() - await (this as SparkInterface).refreshSparkData(null); + await (this as SparkInterface).refreshSparkData((0.3, 0.6)); } final fetchFuture = updateTransactions(); - _checkAlive(); + + _fireRefreshPercentChange(0.6); final utxosRefreshFuture = updateUTXOs(); // if (currentHeight != storedHeight) { - GlobalEventBus.instance.fire(RefreshPercentChangedEvent(0.60, walletId)); + _fireRefreshPercentChange(0.65); await utxosRefreshFuture; - GlobalEventBus.instance.fire(RefreshPercentChangedEvent(0.70, walletId)); + _fireRefreshPercentChange(0.70); await fetchFuture; @@ -665,8 +668,7 @@ abstract class Wallet { // check utxos again for notification outputs await updateUTXOs(); } - _checkAlive(); - GlobalEventBus.instance.fire(RefreshPercentChangedEvent(0.80, walletId)); + _fireRefreshPercentChange(0.80); // await getAllTxsToWatch(); @@ -677,16 +679,11 @@ abstract class Wallet { await (this as LelantusInterface).refreshLelantusData(); } } - GlobalEventBus.instance.fire(RefreshPercentChangedEvent(0.90, walletId)); + _fireRefreshPercentChange(0.90); await updateBalance(); - _checkAlive(); - GlobalEventBus.instance.fire(RefreshPercentChangedEvent(1.0, walletId)); - - if (this is! SparkInterface) { - tAlive = false; // interrupt timer as its not needed anymore - } + _fireRefreshPercentChange(1.0); completer.complete(); } catch (error, strace) { diff --git a/lib/wallets/wallet/wallet_mixin_interfaces/electrumx_interface.dart b/lib/wallets/wallet/wallet_mixin_interfaces/electrumx_interface.dart index cc49149d9..b59041ef8 100644 --- a/lib/wallets/wallet/wallet_mixin_interfaces/electrumx_interface.dart +++ b/lib/wallets/wallet/wallet_mixin_interfaces/electrumx_interface.dart @@ -42,6 +42,8 @@ mixin ElectrumXInterface int? get maximumFeerate => null; + double? refreshingPercent; + static const _kServerBatchCutoffVersion = [1, 6]; List? _serverVersion; Future get serverCanBatch async { diff --git a/lib/wallets/wallet/wallet_mixin_interfaces/spark_interface.dart b/lib/wallets/wallet/wallet_mixin_interfaces/spark_interface.dart index 8460ce319..fbc294e7c 100644 --- a/lib/wallets/wallet/wallet_mixin_interfaces/spark_interface.dart +++ b/lib/wallets/wallet/wallet_mixin_interfaces/spark_interface.dart @@ -14,6 +14,8 @@ import '../../../models/isar/models/blockchain_data/v2/output_v2.dart'; import '../../../models/isar/models/blockchain_data/v2/transaction_v2.dart'; import '../../../models/isar/models/isar_models.dart'; import '../../../models/signing_data.dart'; +import '../../../services/event_bus/events/global/refresh_percent_changed_event.dart'; +import '../../../services/event_bus/global_event_bus.dart'; import '../../../utilities/amount/amount.dart'; import '../../../utilities/enums/derive_path_type_enum.dart'; import '../../../utilities/extensions/extensions.dart'; @@ -795,8 +797,24 @@ mixin SparkInterface } } + // returns next percent + double _triggerEventHelper(double current, double increment) { + refreshingPercent = current; + GlobalEventBus.instance.fire( + RefreshPercentChangedEvent( + current, + walletId, + ), + ); + return current + increment; + } + + // Linearly make calls so there is less chance of timing out or otherwise breaking Future refreshSparkData( - void Function(int countFetched, int totalCount)? progressUpdated, + ( + double startingPercent, + double endingPercent, + )? refreshProgressRange, ) async { final start = DateTime.now(); try { @@ -818,25 +836,55 @@ mixin SparkInterface } groupIds.add(latestGroupId); - // start fetch and update process for each set groupId as required - final possibleFutures = groupIds.map( - (e) => - FiroCacheCoordinator.runFetchAndUpdateSparkAnonSetCacheForGroupId( - e, + final steps = groupIds.length + + 1 // get used tags step + + + 1 // check updated cache step + + + 1 // identify coins step + + + 1 // cross ref coins and txns + + + 1; // update balance + + final percentIncrement = refreshProgressRange == null + ? null + : (refreshProgressRange.$2 - refreshProgressRange.$1) / steps; + double currentPercent = refreshProgressRange?.$1 ?? 0; + + // fetch and update process for each set groupId as required + for (final gId in groupIds) { + await FiroCacheCoordinator.runFetchAndUpdateSparkAnonSetCacheForGroupId( + gId, electrumXClient, cryptoCurrency.network, - null, - ), + // null, + (a, b) { + if (percentIncrement != null) { + _triggerEventHelper( + currentPercent + (percentIncrement * (a / b)), + 0, + ); + } + }, + ); + if (percentIncrement != null) { + currentPercent += percentIncrement; + } + } + + if (percentIncrement != null) { + currentPercent = _triggerEventHelper(currentPercent, percentIncrement); + } + + await FiroCacheCoordinator.runFetchAndUpdateSparkUsedCoinTags( + electrumXClient, + cryptoCurrency.network, ); - // wait for each fetch and update to complete - await Future.wait([ - ...possibleFutures, - FiroCacheCoordinator.runFetchAndUpdateSparkUsedCoinTags( - electrumXClient, - cryptoCurrency.network, - ), - ]); + if (percentIncrement != null) { + currentPercent = _triggerEventHelper(currentPercent, percentIncrement); + } // Get cached timestamps per groupId. These timestamps are used to check // and try to id coins that were added to the spark anon set cache @@ -883,6 +931,10 @@ mixin SparkInterface ); } + if (percentIncrement != null) { + currentPercent = _triggerEventHelper(currentPercent, percentIncrement); + } + // get address(es) to get the private key hex strings required for // identifying spark coins final sparkAddresses = await mainDB.isar.addresses @@ -930,6 +982,10 @@ mixin SparkInterface isar: mainDB.isar, ); + if (percentIncrement != null) { + currentPercent = _triggerEventHelper(currentPercent, percentIncrement); + } + // check for spark coins in mempool final mempoolMyCoins = await _refreshSparkCoinsMempoolCheck( privateKeyHexSet: privateKeyHexSet, @@ -991,6 +1047,10 @@ mixin SparkInterface }); } + if (percentIncrement != null) { + currentPercent = _triggerEventHelper(currentPercent, percentIncrement); + } + // used to check if balance is spendable or total final currentHeight = await chainHeight; From 20285053676d05b26df3eec9908c0593549ec71d Mon Sep 17 00:00:00 2001 From: julian Date: Mon, 16 Dec 2024 19:34:59 -0600 Subject: [PATCH 031/193] fix: spark coin confirmations issue --- lib/wallets/isar/models/spark_coin.dart | 15 +++++++++++++++ .../wallet_mixin_interfaces/spark_interface.dart | 4 +--- 2 files changed, 16 insertions(+), 3 deletions(-) diff --git a/lib/wallets/isar/models/spark_coin.dart b/lib/wallets/isar/models/spark_coin.dart index d3ef6825c..9501bf06d 100644 --- a/lib/wallets/isar/models/spark_coin.dart +++ b/lib/wallets/isar/models/spark_coin.dart @@ -1,3 +1,5 @@ +import 'dart:math'; + import 'package:isar/isar.dart'; part 'spark_coin.g.dart'; @@ -59,6 +61,19 @@ class SparkCoin { @ignore BigInt get diversifier => BigInt.parse(diversifierIntString); + int getConfirmations(int currentChainHeight) { + if (height == null || height! <= 0) return 0; + return max(0, currentChainHeight - (height! - 1)); + } + + bool isConfirmed( + int currentChainHeight, + int minimumConfirms, + ) { + final confirmations = getConfirmations(currentChainHeight); + return confirmations >= minimumConfirms; + } + SparkCoin({ required this.walletId, required this.type, diff --git a/lib/wallets/wallet/wallet_mixin_interfaces/spark_interface.dart b/lib/wallets/wallet/wallet_mixin_interfaces/spark_interface.dart index fbc294e7c..5390b66d3 100644 --- a/lib/wallets/wallet/wallet_mixin_interfaces/spark_interface.dart +++ b/lib/wallets/wallet/wallet_mixin_interfaces/spark_interface.dart @@ -1071,9 +1071,7 @@ mixin SparkInterface final spendable = Amount( rawValue: unusedCoins .where( - (e) => - e.height != null && - e.height! + cryptoCurrency.minConfirms <= currentHeight, + (e) => e.isConfirmed(currentHeight, cryptoCurrency.minConfirms), ) .map((e) => e.value) .fold(BigInt.zero, (prev, e) => prev + e), From 4439ad70d24956c58fd248da2466abd59d544b23 Mon Sep 17 00:00:00 2001 From: julian Date: Mon, 16 Dec 2024 19:35:39 -0600 Subject: [PATCH 032/193] fix: incremental spark data cache --- lib/db/sqlite/firo_cache.dart | 58 +----- lib/db/sqlite/firo_cache_coordinator.dart | 182 +++++++----------- lib/db/sqlite/firo_cache_reader.dart | 60 +++--- lib/db/sqlite/firo_cache_worker.dart | 24 +-- lib/db/sqlite/firo_cache_writer.dart | 102 ++-------- lib/electrumx_rpc/electrumx_client.dart | 4 + .../electrumx_response/spark_models.dart | 51 +++++ lib/wallets/isar/models/wallet_info.dart | 4 +- lib/wallets/wallet/impl/firo_wallet.dart | 2 +- .../spark_interface.dart | 25 +-- 10 files changed, 191 insertions(+), 321 deletions(-) diff --git a/lib/db/sqlite/firo_cache.dart b/lib/db/sqlite/firo_cache.dart index 6b3c70c8e..d32db1bf3 100644 --- a/lib/db/sqlite/firo_cache.dart +++ b/lib/db/sqlite/firo_cache.dart @@ -31,7 +31,7 @@ void _debugLog(Object? object) { } abstract class _FiroCache { - static const int _setCacheVersion = 1; + static const int _setCacheVersion = 2; static const int _tagsCacheVersion = 2; static final networks = [ @@ -43,17 +43,12 @@ abstract class _FiroCache { network == CryptoCurrencyNetwork.main ? "spark_set_v$_setCacheVersion.sqlite3" : "spark_set_v${_setCacheVersion}_${network.name}.sqlite3"; - static String sparkSetMetaCacheFileName(CryptoCurrencyNetwork network) => - network == CryptoCurrencyNetwork.main - ? "spark_set_meta_v$_setCacheVersion.sqlite3" - : "spark_set_meta_v${_setCacheVersion}_${network.name}.sqlite3"; static String sparkUsedTagsCacheFileName(CryptoCurrencyNetwork network) => network == CryptoCurrencyNetwork.main ? "spark_tags_v$_tagsCacheVersion.sqlite3" : "spark_tags_v${_tagsCacheVersion}_${network.name}.sqlite3"; static final Map _setCacheDB = {}; - static final Map _setMetaCacheDB = {}; static final Map _usedTagsCacheDB = {}; static Database setCacheDB(CryptoCurrencyNetwork network) { if (_setCacheDB[network] == null) { @@ -64,15 +59,6 @@ abstract class _FiroCache { return _setCacheDB[network]!; } - static Database setMetaCacheDB(CryptoCurrencyNetwork network) { - if (_setMetaCacheDB[network] == null) { - throw Exception( - "FiroCache.init() must be called before accessing FiroCache.db!", - ); - } - return _setMetaCacheDB[network]!; - } - static Database usedTagsCacheDB(CryptoCurrencyNetwork network) { if (_usedTagsCacheDB[network] == null) { throw Exception( @@ -93,18 +79,12 @@ abstract class _FiroCache { final sparkSetCacheFile = File("${sqliteDir.path}/${sparkSetCacheFileName(network)}"); - final sparkSetMetaCacheFile = - File("${sqliteDir.path}/${sparkSetMetaCacheFileName(network)}"); - final sparkUsedTagsCacheFile = File("${sqliteDir.path}/${sparkUsedTagsCacheFileName(network)}"); if (!(await sparkSetCacheFile.exists())) { await _createSparkSetCacheDb(sparkSetCacheFile.path); } - if (!(await sparkSetMetaCacheFile.exists())) { - await _createSparkSetMetaCacheDb(sparkSetMetaCacheFile.path); - } if (!(await sparkUsedTagsCacheFile.exists())) { await _createSparkUsedTagsCacheDb(sparkUsedTagsCacheFile.path); } @@ -113,10 +93,6 @@ abstract class _FiroCache { sparkSetCacheFile.path, mode: OpenMode.readWrite, ); - _setMetaCacheDB[network] = sqlite3.open( - sparkSetMetaCacheFile.path, - mode: OpenMode.readWrite, - ); _usedTagsCacheDB[network] = sqlite3.open( sparkUsedTagsCacheFile.path, mode: OpenMode.readWrite, @@ -134,12 +110,6 @@ abstract class _FiroCache { VACUUM; """, ); - setMetaCacheDB(network).execute( - """ - DELETE FROM PreviousMetaFetchResult; - VACUUM; - """, - ); usedTagsCacheDB(network).execute( """ DELETE FROM SparkUsedCoinTags; @@ -165,7 +135,7 @@ abstract class _FiroCache { blockHash TEXT NOT NULL, setHash TEXT NOT NULL, groupId INTEGER NOT NULL, - timestampUTC INTEGER NOT NULL, + size INTEGER NOT NULL, UNIQUE (blockHash, setHash, groupId) ); @@ -174,7 +144,8 @@ abstract class _FiroCache { serialized TEXT NOT NULL, txHash TEXT NOT NULL, context TEXT NOT NULL, - UNIQUE(serialized, txHash, context) + groupId INTEGER NOT NULL, + UNIQUE(serialized, txHash, context, groupId) ); CREATE TABLE SparkSetCoins ( @@ -190,27 +161,6 @@ abstract class _FiroCache { db.dispose(); } - static Future _createSparkSetMetaCacheDb(String file) async { - final db = sqlite3.open( - file, - mode: OpenMode.readWriteCreate, - ); - - db.execute( - """ - CREATE TABLE PreviousMetaFetchResult ( - id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT UNIQUE, - coinGroupId INTEGER NOT NULL UNIQUE, - blockHash TEXT NOT NULL, - setHash TEXT NOT NULL, - size INTEGER NOT NULL - ); - """, - ); - - db.dispose(); - } - static Future _createSparkUsedTagsCacheDb(String file) async { final db = sqlite3.open( file, diff --git a/lib/db/sqlite/firo_cache_coordinator.dart b/lib/db/sqlite/firo_cache_coordinator.dart index 45fa4c62e..038668248 100644 --- a/lib/db/sqlite/firo_cache_coordinator.dart +++ b/lib/db/sqlite/firo_cache_coordinator.dart @@ -32,9 +32,6 @@ abstract class FiroCacheCoordinator { final setCacheFile = File( "${dir.path}/${_FiroCache.sparkSetCacheFileName(network)}", ); - final setMetaCacheFile = File( - "${dir.path}/${_FiroCache.sparkSetMetaCacheFileName(network)}", - ); final usedTagsCacheFile = File( "${dir.path}/${_FiroCache.sparkUsedTagsCacheFileName(network)}", ); @@ -44,8 +41,6 @@ abstract class FiroCacheCoordinator { final tagsSize = (await usedTagsCacheFile.exists()) ? await usedTagsCacheFile.length() : 0; - final setMetaSize = - (await setMetaCacheFile.exists()) ? await setMetaCacheFile.length() : 0; Logging.instance.log( "Spark cache used tags size: $tagsSize", @@ -55,12 +50,8 @@ abstract class FiroCacheCoordinator { "Spark cache anon set size: $setSize", level: LogLevel.Debug, ); - Logging.instance.log( - "Spark cache set meta size: $setMetaSize", - level: LogLevel.Debug, - ); - final int bytes = tagsSize + setSize + setMetaSize; + final int bytes = tagsSize + setSize; if (bytes < 1024) { return '$bytes B'; @@ -104,93 +95,70 @@ abstract class FiroCacheCoordinator { void Function(int countFetched, int totalCount)? progressUpdated, ) async { await _setLocks[network]!.protect(() async { - Map json; - SparkAnonymitySetMeta? meta; - - if (progressUpdated == null) { - // Legacy - final blockhashResult = - await FiroCacheCoordinator.getLatestSetInfoForGroupId( - groupId, - network, - ); - final blockHash = blockhashResult?.blockHash ?? ""; + const sectorSize = 12000; // TODO adjust this? + final prevMeta = await FiroCacheCoordinator.getLatestSetInfoForGroupId( + groupId, + network, + ); - json = await client.getSparkAnonymitySet( - coinGroupId: groupId.toString(), - startBlockHash: blockHash.toHexReversedFromBase64, - ); - } else { - const sectorSize = 2000; // TODO adjust this? - final prevMetaSize = - await FiroCacheCoordinator.getSparkMetaSetSizeForGroupId( - groupId, - network, - ); - final prevSize = prevMetaSize ?? 0; + final prevSize = prevMeta?.size ?? 0; - meta = await client.getSparkAnonymitySetMeta( - coinGroupId: groupId, - ); + final meta = await client.getSparkAnonymitySetMeta( + coinGroupId: groupId, + ); - progressUpdated.call(prevSize, meta.size); + progressUpdated?.call(prevSize, meta.size); - /// Returns blockHash (last block hash), - /// setHash (hash of current set) - /// and coins (the list of pairs serialized coin and tx hash) + if (prevMeta?.blockHash == meta.blockHash) { + Logging.instance.log( + "prevMeta?.blockHash == meta.blockHash", + level: LogLevel.Debug, + ); + return; + } - final fullSectorCount = (meta.size - prevSize) ~/ sectorSize; - final remainder = (meta.size - prevSize) % sectorSize; + final numberOfCoinsToFetch = meta.size - prevSize; - final List coins = []; + final fullSectorCount = numberOfCoinsToFetch ~/ sectorSize; + final remainder = numberOfCoinsToFetch % sectorSize; - for (int i = 0; i < fullSectorCount; i++) { - final start = (i * sectorSize) + prevSize; - final data = await client.getSparkAnonymitySetBySector( - coinGroupId: groupId, - latestBlock: meta.blockHash.toHexReversedFromBase64, - startIndex: start, - endIndex: start + sectorSize, - ); - progressUpdated.call(start + sectorSize, meta.size); + final List coins = []; - coins.addAll(data); - } + for (int i = 0; i < fullSectorCount; i++) { + final start = (i * sectorSize); + final data = await client.getSparkAnonymitySetBySector( + coinGroupId: groupId, + latestBlock: meta.blockHash.toHexReversedFromBase64, + startIndex: start, + endIndex: start + sectorSize, + ); + progressUpdated?.call(start + sectorSize, numberOfCoinsToFetch); - if (remainder > 0) { - final data = await client.getSparkAnonymitySetBySector( - coinGroupId: groupId, - latestBlock: meta.blockHash.toHexReversedFromBase64, - startIndex: meta.size - remainder, - endIndex: meta.size, - ); - progressUpdated.call(meta.size, meta.size); + coins.addAll(data); + } - coins.addAll(data); - } + if (remainder > 0) { + final data = await client.getSparkAnonymitySetBySector( + coinGroupId: groupId, + latestBlock: meta.blockHash.toHexReversedFromBase64, + startIndex: numberOfCoinsToFetch - remainder, + endIndex: numberOfCoinsToFetch, + ); + progressUpdated?.call(numberOfCoinsToFetch, numberOfCoinsToFetch); - json = { - "blockHash": meta.blockHash, - "setHash": meta.setHash, - "coins": coins, - }; + coins.addAll(data); } + final result = coins + .map((e) => RawSparkCoin.fromRPCResponse(e as List, groupId)) + .toList(); + await _workers[network]!.runTask( FCTask( func: FCFuncName._updateSparkAnonSetCoinsWith, - data: (groupId, json), + data: (meta, result), ), ); - - if (meta != null) { - await _workers[network]!.runTask( - FCTask( - func: FCFuncName._updateSparkAnonSetMetaWith, - data: meta, - ), - ); - } }); } @@ -265,28 +233,29 @@ abstract class FiroCacheCoordinator { ); } - static Future< - List< - ({ - String serialized, - String txHash, - String context, - })>> getSetCoinsForGroupId( + static Future> getSetCoinsForGroupId( int groupId, { - int? newerThanTimeStamp, + String? afterBlockHash, required CryptoCurrencyNetwork network, }) async { - final resultSet = await _Reader._getSetCoinsForGroupId( - groupId, - db: _FiroCache.setCacheDB(network), - newerThanTimeStamp: newerThanTimeStamp, - ); + final resultSet = afterBlockHash == null + ? await _Reader._getSetCoinsForGroupId( + groupId, + db: _FiroCache.setCacheDB(network), + ) + : await _Reader._getSetCoinsForGroupIdAndBlockHash( + groupId, + afterBlockHash, + db: _FiroCache.setCacheDB(network), + ); + return resultSet .map( - (row) => ( + (row) => RawSparkCoin( serialized: row["serialized"] as String, txHash: row["txHash"] as String, context: row["context"] as String, + groupId: groupId, ), ) .toList() @@ -294,12 +263,7 @@ abstract class FiroCacheCoordinator { .toList(); } - static Future< - ({ - String blockHash, - String setHash, - int timestampUTC, - })?> getLatestSetInfoForGroupId( + static Future getLatestSetInfoForGroupId( int groupId, CryptoCurrencyNetwork network, ) async { @@ -312,10 +276,11 @@ abstract class FiroCacheCoordinator { return null; } - return ( + return SparkAnonymitySetMeta( + coinGroupId: groupId, blockHash: result.first["blockHash"] as String, setHash: result.first["setHash"] as String, - timestampUTC: result.first["timestampUTC"] as int, + size: result.first["size"] as int, ); } @@ -328,19 +293,4 @@ abstract class FiroCacheCoordinator { db: _FiroCache.setCacheDB(network), ); } - - static Future getSparkMetaSetSizeForGroupId( - int groupId, - CryptoCurrencyNetwork network, - ) async { - final result = await _Reader._getSizeForGroupId( - groupId, - db: _FiroCache.setMetaCacheDB(network), - ); - if (result.isEmpty) { - return null; - } - - return result.first["size"] as int; - } } diff --git a/lib/db/sqlite/firo_cache_reader.dart b/lib/db/sqlite/firo_cache_reader.dart index b27cd77e3..67fea7764 100644 --- a/lib/db/sqlite/firo_cache_reader.dart +++ b/lib/db/sqlite/firo_cache_reader.dart @@ -8,21 +8,15 @@ abstract class _Reader { static Future _getSetCoinsForGroupId( int groupId, { required Database db, - int? newerThanTimeStamp, }) async { - String query = """ - SELECT sc.serialized, sc.txHash, sc.context + final query = """ + SELECT sc.serialized, sc.txHash, sc.context, sc.groupId FROM SparkSet AS ss JOIN SparkSetCoins AS ssc ON ss.id = ssc.setId JOIN SparkCoin AS sc ON ssc.coinId = sc.id - WHERE ss.groupId = $groupId + WHERE ss.groupId = $groupId; """; - if (newerThanTimeStamp != null) { - query += " AND ss.timestampUTC" - " > $newerThanTimeStamp"; - } - return db.select("$query;"); } @@ -31,16 +25,45 @@ abstract class _Reader { required Database db, }) async { final query = """ - SELECT ss.blockHash, ss.setHash, ss.timestampUTC + SELECT ss.blockHash, ss.setHash, ss.size FROM SparkSet ss WHERE ss.groupId = $groupId - ORDER BY ss.timestampUTC DESC + ORDER BY ss.size DESC LIMIT 1; """; return db.select("$query;"); } + static Future _getSetCoinsForGroupIdAndBlockHash( + int groupId, + String blockHash, { + required Database db, + }) async { + const query = """ + WITH TargetBlock AS ( + SELECT id + FROM SparkSet + WHERE blockHash = ? + ), + TargetSets AS ( + SELECT id AS setId + FROM SparkSet + WHERE groupId = ? AND id > (SELECT id FROM TargetBlock) + ) + SELECT + SparkCoin.serialized, + SparkCoin.txHash, + SparkCoin.context, + SparkCoin.groupId + FROM SparkSetCoins + JOIN SparkCoin ON SparkSetCoins.coinId = SparkCoin.id + WHERE SparkSetCoins.setId IN (SELECT setId FROM TargetSets); + """; + + return db.select("$query;", [blockHash, groupId]); + } + static Future _checkSetInfoForGroupIdExists( int groupId, { required Database db, @@ -56,21 +79,6 @@ abstract class _Reader { return db.select("$query;").first["setExists"] == 1; } - // =========================================================================== - // =============== Spark anonymity set meta queries ========================== - static Future _getSizeForGroupId( - int groupId, { - required Database db, - }) async { - final query = """ - SELECT size - FROM PreviousMetaFetchResult - WHERE coinGroupId = $groupId; - """; - - return db.select("$query;"); - } - // =========================================================================== // =============== Spark used coin tags queries ============================== diff --git a/lib/db/sqlite/firo_cache_worker.dart b/lib/db/sqlite/firo_cache_worker.dart index a417cdb07..abaceb288 100644 --- a/lib/db/sqlite/firo_cache_worker.dart +++ b/lib/db/sqlite/firo_cache_worker.dart @@ -3,7 +3,6 @@ part of 'firo_cache.dart'; enum FCFuncName { _updateSparkAnonSetCoinsWith, _updateSparkUsedTagsWith, - _updateSparkAnonSetMetaWith, } class FCTask { @@ -30,8 +29,6 @@ class _FiroCacheWorker { final dir = await StackFileSystem.applicationFiroCacheSQLiteDirectory(); final setCacheFilePath = "${dir.path}/${_FiroCache.sparkSetCacheFileName(network)}"; - final setMetaCacheFilePath = - "${dir.path}/${_FiroCache.sparkSetMetaCacheFileName(network)}"; final usedTagsCacheFilePath = "${dir.path}/${_FiroCache.sparkUsedTagsCacheFileName(network)}"; @@ -54,7 +51,6 @@ class _FiroCacheWorker { ( initPort.sendPort, setCacheFilePath, - setMetaCacheFilePath, usedTagsCacheFilePath, ), ); @@ -87,7 +83,6 @@ class _FiroCacheWorker { ReceivePort receivePort, SendPort sendPort, Database setCacheDb, - Database setMetaCacheDb, Database usedTagsCacheDb, Mutex mutex, ) { @@ -99,7 +94,8 @@ class _FiroCacheWorker { final FCResult result; switch (task.func) { case FCFuncName._updateSparkAnonSetCoinsWith: - final data = task.data as (int, Map); + final data = + task.data as (SparkAnonymitySetMeta, List); result = _updateSparkAnonSetCoinsWith( setCacheDb, data.$2, @@ -113,13 +109,6 @@ class _FiroCacheWorker { task.data as List>, ); break; - - case FCFuncName._updateSparkAnonSetMetaWith: - result = _updateSparkAnonSetMetaWith( - setMetaCacheDb, - task.data as SparkAnonymitySetMeta, - ); - break; } if (result.success) { @@ -134,7 +123,7 @@ class _FiroCacheWorker { }); } - static void _startWorkerIsolate((SendPort, String, String, String) args) { + static void _startWorkerIsolate((SendPort, String, String) args) { final receivePort = ReceivePort(); args.$1.send(receivePort.sendPort); final mutex = Mutex(); @@ -142,19 +131,14 @@ class _FiroCacheWorker { args.$2, mode: OpenMode.readWrite, ); - final setMetaCacheDb = sqlite3.open( - args.$3, - mode: OpenMode.readWrite, - ); final usedTagsCacheDb = sqlite3.open( - args.$4, + args.$3, mode: OpenMode.readWrite, ); _handleCommandsToIsolate( receivePort, args.$1, setCacheDb, - setMetaCacheDb, usedTagsCacheDb, mutex, ); diff --git a/lib/db/sqlite/firo_cache_writer.dart b/lib/db/sqlite/firo_cache_writer.dart index 36b71369b..63192d964 100644 --- a/lib/db/sqlite/firo_cache_writer.dart +++ b/lib/db/sqlite/firo_cache_writer.dart @@ -48,58 +48,17 @@ FCResult _updateSparkUsedTagsWith( } } -// =========================================================================== -// ================== write to spark anon set Meta cache ========================== -FCResult _updateSparkAnonSetMetaWith( - Database db, - SparkAnonymitySetMeta meta, -) { - db.execute("BEGIN;"); - try { - db.execute( - """ - INSERT OR REPLACE INTO PreviousMetaFetchResult (coinGroupId, blockHash, setHash, size) - VALUES (?, ?, ?, ?); - """, - [meta.coinGroupId, meta.blockHash, meta.setHash, meta.size], - ); - - db.execute("COMMIT;"); - - return FCResult(success: true); - } catch (e) { - db.execute("ROLLBACK;"); - return FCResult(success: false, error: e); - } -} - // =========================================================================== // ================== write to spark anon set cache ========================== /// update the sqlite cache -/// Expected json format: -/// { -/// "blockHash": "someBlockHash", -/// "setHash": "someSetHash", -/// "coins": [ -/// ["serliazed1", "hash1", "context1"], -/// ["serliazed2", "hash2", "context2"], -/// ... -/// ["serliazed3", "hash3", "context3"], -/// ["serliazed4", "hash4", "context4"], -/// ], -/// } /// /// returns true if successful, otherwise false FCResult _updateSparkAnonSetCoinsWith( Database db, - Map json, - int groupId, + final List coinsRaw, + SparkAnonymitySetMeta meta, ) { - final blockHash = json["blockHash"] as String; - final setHash = json["setHash"] as String; - final coinsRaw = json["coins"] as List; - if (coinsRaw.isEmpty) { // no coins to actually insert return FCResult(success: true); @@ -112,9 +71,9 @@ FCResult _updateSparkAnonSetCoinsWith( WHERE blockHash = ? AND setHash = ? AND groupId = ?; """, [ - blockHash, - setHash, - groupId, + meta.blockHash, + meta.setHash, + meta.coinGroupId, ], ); @@ -123,59 +82,28 @@ FCResult _updateSparkAnonSetCoinsWith( return FCResult(success: true); } - final coins = coinsRaw - .map( - (e) => [ - e[0] as String, - e[1] as String, - e[2] as String, - ], - ) - .toList() - .reversed; - - final timestamp = DateTime.now().toUtc().millisecondsSinceEpoch ~/ 1000; + final coins = coinsRaw.reversed; db.execute("BEGIN;"); try { db.execute( """ - INSERT INTO SparkSet (blockHash, setHash, groupId, timestampUTC) + INSERT INTO SparkSet (blockHash, setHash, groupId, size) VALUES (?, ?, ?, ?); """, - [blockHash, setHash, groupId, timestamp], + [meta.blockHash, meta.setHash, meta.coinGroupId, meta.size], ); final setId = db.lastInsertRowId; for (final coin in coins) { - int coinId; - try { - // try to insert and get row id - db.execute( - """ - INSERT INTO SparkCoin (serialized, txHash, context) - VALUES (?, ?, ?); + db.execute( + """ + INSERT INTO SparkCoin (serialized, txHash, context, groupId) + VALUES (?, ?, ?, ?); """, - coin, - ); - coinId = db.lastInsertRowId; - } on SqliteException catch (e) { - // if there already is a matching coin in the db - // just grab its row id - if (e.extendedResultCode == 2067) { - final result = db.select( - """ - SELECT id - FROM SparkCoin - WHERE serialized = ? AND txHash = ? AND context = ?; - """, - coin, - ); - coinId = result.first["id"] as int; - } else { - rethrow; - } - } + [coin.serialized, coin.txHash, coin.context, coin.groupId], + ); + final coinId = db.lastInsertRowId; // finally add the row id to the newly added set db.execute( diff --git a/lib/electrumx_rpc/electrumx_client.dart b/lib/electrumx_rpc/electrumx_client.dart index 3f8241bca..8ff04712a 100644 --- a/lib/electrumx_rpc/electrumx_client.dart +++ b/lib/electrumx_rpc/electrumx_client.dart @@ -399,7 +399,11 @@ class ElectrumXClient { rethrow; } } catch (e) { + final errorMessage = e.toString(); Logging.instance.log("$host $e", level: LogLevel.Debug); + if (errorMessage.contains("JSON-RPC error")) { + currentFailoverIndex = _failovers.length; + } if (currentFailoverIndex < _failovers.length - 1) { currentFailoverIndex++; return request( diff --git a/lib/models/electrumx_response/spark_models.dart b/lib/models/electrumx_response/spark_models.dart index 499f20cf6..43bf9f61f 100644 --- a/lib/models/electrumx_response/spark_models.dart +++ b/lib/models/electrumx_response/spark_models.dart @@ -45,3 +45,54 @@ class SparkAnonymitySetMeta { "}"; } } + +class RawSparkCoin { + final String serialized; + final String txHash; + final String context; + final int groupId; + + RawSparkCoin({ + required this.serialized, + required this.txHash, + required this.context, + required this.groupId, + }); + + static RawSparkCoin fromRPCResponse(List data, int groupId) { + try { + if (data.length != 3) throw Exception(); + return RawSparkCoin( + serialized: data[0] as String, + txHash: data[1] as String, + context: data[2] as String, + groupId: groupId, + ); + } catch (_) { + throw Exception("Invalid coin data: $data"); + } + } + + @override + bool operator ==(Object other) { + if (identical(this, other)) return true; + if (other is! RawSparkCoin) return false; + return serialized == other.serialized && + txHash == other.txHash && + groupId == other.groupId && + context == other.context; + } + + @override + int get hashCode => Object.hash(serialized, txHash, context); + + @override + String toString() { + return "SparkAnonymitySetMeta{" + "serialized: $serialized, " + "txHash: $txHash, " + "context: $context, " + "groupId: $groupId" + "}"; + } +} diff --git a/lib/wallets/isar/models/wallet_info.dart b/lib/wallets/isar/models/wallet_info.dart index eb6a4e9ea..51aa69a45 100644 --- a/lib/wallets/isar/models/wallet_info.dart +++ b/lib/wallets/isar/models/wallet_info.dart @@ -520,8 +520,8 @@ abstract class WalletInfoKeys { static const String lelantusCoinIsarRescanRequired = "lelantusCoinIsarRescanRequired"; static const String enableLelantusScanning = "enableLelantusScanningKey"; - static const String firoSparkCacheSetTimestampCache = - "firoSparkCacheSetTimestampCacheKey"; + static const String firoSparkCacheSetBlockHashCache = + "firoSparkCacheSetBlockHashCacheKey"; static const String enableOptInRbf = "enableOptInRbfKey"; static const String reuseAddress = "reuseAddressKey"; static const String isViewOnlyKey = "isViewOnlyKey"; diff --git a/lib/wallets/wallet/impl/firo_wallet.dart b/lib/wallets/wallet/impl/firo_wallet.dart index d4faabef9..d412f1d5b 100644 --- a/lib/wallets/wallet/impl/firo_wallet.dart +++ b/lib/wallets/wallet/impl/firo_wallet.dart @@ -671,7 +671,7 @@ class FiroWallet extends Bip39HDWallet // reset last checked values await info.updateOtherData( newEntries: { - WalletInfoKeys.firoSparkCacheSetTimestampCache: {}, + WalletInfoKeys.firoSparkCacheSetBlockHashCache: {}, }, isar: mainDB.isar, ); diff --git a/lib/wallets/wallet/wallet_mixin_interfaces/spark_interface.dart b/lib/wallets/wallet/wallet_mixin_interfaces/spark_interface.dart index 5390b66d3..2b1f0f903 100644 --- a/lib/wallets/wallet/wallet_mixin_interfaces/spark_interface.dart +++ b/lib/wallets/wallet/wallet_mixin_interfaces/spark_interface.dart @@ -886,11 +886,11 @@ mixin SparkInterface currentPercent = _triggerEventHelper(currentPercent, percentIncrement); } - // Get cached timestamps per groupId. These timestamps are used to check + // Get cached block hashes per groupId. These hashes are used to check // and try to id coins that were added to the spark anon set cache - // after that timestamp. - final groupIdTimestampUTCMap = - info.otherData[WalletInfoKeys.firoSparkCacheSetTimestampCache] + // after that block. + final groupIdBlockHashMap = + info.otherData[WalletInfoKeys.firoSparkCacheSetBlockHashCache] as Map? ?? {}; @@ -898,8 +898,7 @@ mixin SparkInterface // processed by this wallet yet final Map>> rawCoinsBySetId = {}; for (int i = 1; i <= latestGroupId; i++) { - final lastCheckedTimeStampUTC = - groupIdTimestampUTCMap[i.toString()] as int? ?? 0; + final lastCheckedHash = groupIdBlockHashMap[i.toString()] as String?; final info = await FiroCacheCoordinator.getLatestSetInfoForGroupId( i, cryptoCurrency.network, @@ -907,7 +906,7 @@ mixin SparkInterface final anonymitySetResult = await FiroCacheCoordinator.getSetCoinsForGroupId( i, - newerThanTimeStamp: lastCheckedTimeStampUTC, + afterBlockHash: lastCheckedHash, network: cryptoCurrency.network, ); final coinsRaw = anonymitySetResult @@ -924,11 +923,8 @@ mixin SparkInterface rawCoinsBySetId[i] = coinsRaw; } - // update last checked timestamp data - groupIdTimestampUTCMap[i.toString()] = max( - lastCheckedTimeStampUTC, - info?.timestampUTC ?? lastCheckedTimeStampUTC, - ); + // update last checked + groupIdBlockHashMap[i.toString()] = info?.blockHash; } if (percentIncrement != null) { @@ -973,11 +969,10 @@ mixin SparkInterface }); } - // finally update the cached timestamps in the database + // finally update the cached block hashes in the database await info.updateOtherData( newEntries: { - WalletInfoKeys.firoSparkCacheSetTimestampCache: - groupIdTimestampUTCMap, + WalletInfoKeys.firoSparkCacheSetBlockHashCache: groupIdBlockHashMap, }, isar: mainDB.isar, ); From f97ef50978fcae26c64ccba64d1f43ed9f2792fd Mon Sep 17 00:00:00 2001 From: julian Date: Tue, 17 Dec 2024 14:03:31 -0600 Subject: [PATCH 033/193] fix: update hash format and use better sector/page size --- lib/db/sqlite/firo_cache_coordinator.dart | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/lib/db/sqlite/firo_cache_coordinator.dart b/lib/db/sqlite/firo_cache_coordinator.dart index 038668248..a002dc222 100644 --- a/lib/db/sqlite/firo_cache_coordinator.dart +++ b/lib/db/sqlite/firo_cache_coordinator.dart @@ -95,7 +95,8 @@ abstract class FiroCacheCoordinator { void Function(int countFetched, int totalCount)? progressUpdated, ) async { await _setLocks[network]!.protect(() async { - const sectorSize = 12000; // TODO adjust this? + const sectorSize = + 1500; // chosen as a somewhat decent value. Could be changed in the future if wanted/needed final prevMeta = await FiroCacheCoordinator.getLatestSetInfoForGroupId( groupId, network, @@ -128,7 +129,7 @@ abstract class FiroCacheCoordinator { final start = (i * sectorSize); final data = await client.getSparkAnonymitySetBySector( coinGroupId: groupId, - latestBlock: meta.blockHash.toHexReversedFromBase64, + latestBlock: meta.blockHash, startIndex: start, endIndex: start + sectorSize, ); @@ -140,7 +141,7 @@ abstract class FiroCacheCoordinator { if (remainder > 0) { final data = await client.getSparkAnonymitySetBySector( coinGroupId: groupId, - latestBlock: meta.blockHash.toHexReversedFromBase64, + latestBlock: meta.blockHash, startIndex: numberOfCoinsToFetch - remainder, endIndex: numberOfCoinsToFetch, ); From 0e32e8a408df4dd7599c82a88c70fd5fe4624790 Mon Sep 17 00:00:00 2001 From: julian Date: Tue, 17 Dec 2024 15:40:13 -0600 Subject: [PATCH 034/193] fix: Issue where spark spend may not have appeared as confirmed --- lib/wallets/wallet/impl/firo_wallet.dart | 79 +++++++++++-------- .../spark_interface.dart | 12 +-- 2 files changed, 46 insertions(+), 45 deletions(-) diff --git a/lib/wallets/wallet/impl/firo_wallet.dart b/lib/wallets/wallet/impl/firo_wallet.dart index d412f1d5b..d149a7a9e 100644 --- a/lib/wallets/wallet/impl/firo_wallet.dart +++ b/lib/wallets/wallet/impl/firo_wallet.dart @@ -93,33 +93,13 @@ class FiroWallet extends Bip39HDWallet .walletIdEqualToAnyLTagHash(walletId) .findAll(); - final Set sparkTxids = {}; - - for (final coin in sparkCoins) { - sparkTxids.add(coin.txHash); - // check for duplicates before adding to list - if (allTxHashes.indexWhere((e) => e["tx_hash"] == coin.txHash) == -1) { - final info = { - "tx_hash": coin.txHash, - "height": coin.height, - }; - allTxHashes.add(info); - } - } - - final missing = await getMissingSparkSpendTransactionIds(); - for (final txid in missing.map((e) => e.txid).toSet()) { - allTxHashes.add({ - "tx_hash": txid, - }); - } - final List> allTransactions = []; // some lelantus transactions aren't fetched via wallet addresses so they // will never show as confirmed in the gui. - final unconfirmedTransactions = await mainDB - .getTransactions(walletId) + final unconfirmedTransactions = await mainDB.isar.transactionV2s + .where() + .walletIdEqualTo(walletId) .filter() .heightIsNull() .findAll(); @@ -137,21 +117,54 @@ class FiroWallet extends Bip39HDWallet final info = { "tx_hash": tx.txid, "height": height, - "address": tx.address.value?.value, }; allTxHashes.add(info); } } - for (final txHash in allTxHashes) { - // final storedTx = await db - // .getTransactions(walletId) - // .filter() - // .txidEqualTo(txHash["tx_hash"] as String) - // .findFirst(); + final Set sparkTxids = {}; + for (final coin in sparkCoins) { + sparkTxids.add(coin.txHash); + // check for duplicates before adding to list + if (allTxHashes.indexWhere((e) => e["tx_hash"] == coin.txHash) == -1) { + final info = { + "tx_hash": coin.txHash, + "height": coin.height, + }; + allTxHashes.add(info); + } + } + + final missing = await getSparkSpendTransactionIds(); + for (final txid in missing.map((e) => e.txid).toSet()) { + // check for duplicates before adding to list + if (allTxHashes.indexWhere((e) => e["tx_hash"] == txid) == -1) { + final info = { + "tx_hash": txid, + }; + allTxHashes.add(info); + } + } + + final currentHeight = await chainHeight; - // if (storedTx == null || - // !storedTx.isConfirmed(currentHeight, MINIMUM_CONFIRMATIONS)) { + for (final txHash in allTxHashes) { + final storedTx = await mainDB.isar.transactionV2s + .where() + .walletIdEqualTo(walletId) + .filter() + .txidEqualTo(txHash["tx_hash"] as String) + .findFirst(); + + if (storedTx?.isConfirmed( + currentHeight, + cryptoCurrency.minConfirms, + cryptoCurrency.minCoinbaseConfirms, + ) == + true) { + // tx already confirmed, no need to process it again + continue; + } // firod/electrumx seem to take forever to process spark txns so we'll // just ignore null errors and check again on next refresh. @@ -174,7 +187,6 @@ class FiroWallet extends Bip39HDWallet tx["height"] ??= txHash["height"]; allTransactions.add(tx); } - // } } final List txns = []; @@ -193,7 +205,6 @@ class FiroWallet extends Bip39HDWallet bool isMint = false; bool isJMint = false; bool isSparkMint = false; - final bool isMasterNodePayment = false; final bool isSparkSpend = txData["type"] == 9 && txData["version"] == 3; final bool isMySpark = sparkTxids.contains(txData["txid"] as String); final bool isMySpentSpark = diff --git a/lib/wallets/wallet/wallet_mixin_interfaces/spark_interface.dart b/lib/wallets/wallet/wallet_mixin_interfaces/spark_interface.dart index 2b1f0f903..186eb5663 100644 --- a/lib/wallets/wallet/wallet_mixin_interfaces/spark_interface.dart +++ b/lib/wallets/wallet/wallet_mixin_interfaces/spark_interface.dart @@ -1103,7 +1103,7 @@ mixin SparkInterface } } - Future> getMissingSparkSpendTransactionIds() async { + Future> getSparkSpendTransactionIds() async { final tags = await mainDB.isar.sparkCoins .where() .walletIdEqualToAnyLTagHash(walletId) @@ -1112,21 +1112,11 @@ mixin SparkInterface .lTagHashProperty() .findAll(); - final usedCoinTxidsFoundLocally = await mainDB.isar.transactionV2s - .where() - .walletIdEqualTo(walletId) - .filter() - .subTypeEqualTo(TransactionSubType.sparkSpend) - .txidProperty() - .findAll(); - final pairs = await FiroCacheCoordinator.getUsedCoinTxidsFor( tags: tags, network: cryptoCurrency.network, ); - pairs.removeWhere((e) => usedCoinTxidsFoundLocally.contains(e.txid)); - return pairs.toSet(); } From ba1ab977d6894ebf92b53bb6e2895c57c8a54173 Mon Sep 17 00:00:00 2001 From: julian Date: Tue, 17 Dec 2024 16:04:26 -0600 Subject: [PATCH 035/193] chore: build runner --- .../models/blockchain_data/address.g.dart | 2 + lib/wallets/isar/models/wallet_info.g.dart | 2 + test/cached_electrumx_test.mocks.dart | 403 ++++++++++-------- .../bitcoin/bitcoin_wallet_test.mocks.dart | 377 ++++++++-------- .../bitcoincash_wallet_test.mocks.dart | 377 ++++++++-------- .../dogecoin/dogecoin_wallet_test.mocks.dart | 377 ++++++++-------- .../namecoin/namecoin_wallet_test.mocks.dart | 377 ++++++++-------- .../particl/particl_wallet_test.mocks.dart | 377 ++++++++-------- 8 files changed, 1229 insertions(+), 1063 deletions(-) diff --git a/lib/models/isar/models/blockchain_data/address.g.dart b/lib/models/isar/models/blockchain_data/address.g.dart index 092198990..340ab9f1b 100644 --- a/lib/models/isar/models/blockchain_data/address.g.dart +++ b/lib/models/isar/models/blockchain_data/address.g.dart @@ -278,6 +278,7 @@ const _AddresstypeEnumValueMap = { 'frostMS': 13, 'p2tr': 14, 'solana': 15, + 'cardanoShelley': 16, }; const _AddresstypeValueEnumMap = { 0: AddressType.p2pkh, @@ -296,6 +297,7 @@ const _AddresstypeValueEnumMap = { 13: AddressType.frostMS, 14: AddressType.p2tr, 15: AddressType.solana, + 16: AddressType.cardanoShelley, }; Id _addressGetId(Address object) { diff --git a/lib/wallets/isar/models/wallet_info.g.dart b/lib/wallets/isar/models/wallet_info.g.dart index 89c5511fa..6e02fd6d5 100644 --- a/lib/wallets/isar/models/wallet_info.g.dart +++ b/lib/wallets/isar/models/wallet_info.g.dart @@ -268,6 +268,7 @@ const _WalletInfomainAddressTypeEnumValueMap = { 'frostMS': 13, 'p2tr': 14, 'solana': 15, + 'cardanoShelley': 16, }; const _WalletInfomainAddressTypeValueEnumMap = { 0: AddressType.p2pkh, @@ -286,6 +287,7 @@ const _WalletInfomainAddressTypeValueEnumMap = { 13: AddressType.frostMS, 14: AddressType.p2tr, 15: AddressType.solana, + 16: AddressType.cardanoShelley, }; Id _walletInfoGetId(WalletInfo object) { diff --git a/test/cached_electrumx_test.mocks.dart b/test/cached_electrumx_test.mocks.dart index 25324b805..a5c7c4c54 100644 --- a/test/cached_electrumx_test.mocks.dart +++ b/test/cached_electrumx_test.mocks.dart @@ -3,21 +3,23 @@ // Do not manually edit this file. // ignore_for_file: no_leading_underscores_for_library_prefixes -import 'dart:async' as _i7; -import 'dart:ui' as _i12; +import 'dart:async' as _i9; +import 'dart:ui' as _i14; -import 'package:decimal/decimal.dart' as _i3; +import 'package:decimal/decimal.dart' as _i4; import 'package:mockito/mockito.dart' as _i1; -import 'package:mockito/src/dummies.dart' as _i6; -import 'package:stackwallet/electrumx_rpc/electrumx_client.dart' as _i5; -import 'package:stackwallet/utilities/amount/amount_unit.dart' as _i11; -import 'package:stackwallet/utilities/enums/backup_frequency_type.dart' as _i10; -import 'package:stackwallet/utilities/enums/sync_type_enum.dart' as _i9; -import 'package:stackwallet/utilities/prefs.dart' as _i8; +import 'package:mockito/src/dummies.dart' as _i8; +import 'package:stackwallet/electrumx_rpc/electrumx_client.dart' as _i6; +import 'package:stackwallet/models/electrumx_response/spark_models.dart' as _i3; +import 'package:stackwallet/utilities/amount/amount_unit.dart' as _i13; +import 'package:stackwallet/utilities/enums/backup_frequency_type.dart' as _i12; +import 'package:stackwallet/utilities/enums/sync_type_enum.dart' as _i11; +import 'package:stackwallet/utilities/prefs.dart' as _i10; +import 'package:stackwallet/utilities/tor_plain_net_option_enum.dart' as _i7; import 'package:stackwallet/wallets/crypto_currency/crypto_currency.dart' as _i2; import 'package:stackwallet/wallets/wallet/wallet_mixin_interfaces/cash_fusion_interface.dart' - as _i4; + as _i5; // ignore_for_file: type=lint // ignore_for_file: avoid_redundant_argument_values @@ -53,8 +55,9 @@ class _FakeDuration_1 extends _i1.SmartFake implements Duration { ); } -class _FakeDecimal_2 extends _i1.SmartFake implements _i3.Decimal { - _FakeDecimal_2( +class _FakeSparkAnonymitySetMeta_2 extends _i1.SmartFake + implements _i3.SparkAnonymitySetMeta { + _FakeSparkAnonymitySetMeta_2( Object parent, Invocation parentInvocation, ) : super( @@ -63,8 +66,18 @@ class _FakeDecimal_2 extends _i1.SmartFake implements _i3.Decimal { ); } -class _FakeFusionInfo_3 extends _i1.SmartFake implements _i4.FusionInfo { - _FakeFusionInfo_3( +class _FakeDecimal_3 extends _i1.SmartFake implements _i4.Decimal { + _FakeDecimal_3( + Object parent, + Invocation parentInvocation, + ) : super( + parent, + parentInvocation, + ); +} + +class _FakeFusionInfo_4 extends _i1.SmartFake implements _i5.FusionInfo { + _FakeFusionInfo_4( Object parent, Invocation parentInvocation, ) : super( @@ -76,7 +89,7 @@ class _FakeFusionInfo_3 extends _i1.SmartFake implements _i4.FusionInfo { /// A class which mocks [ElectrumXClient]. /// /// See the documentation for Mockito's code generation for more information. -class MockElectrumXClient extends _i1.Mock implements _i5.ElectrumXClient { +class MockElectrumXClient extends _i1.Mock implements _i6.ElectrumXClient { MockElectrumXClient() { _i1.throwOnMissingStub(this); } @@ -90,6 +103,12 @@ class MockElectrumXClient extends _i1.Mock implements _i5.ElectrumXClient { ), ) as _i2.CryptoCurrency); + @override + _i7.TorPlainNetworkOption get netType => (super.noSuchMethod( + Invocation.getter(#netType), + returnValue: _i7.TorPlainNetworkOption.tor, + ) as _i7.TorPlainNetworkOption); + @override int get currentFailoverIndex => (super.noSuchMethod( Invocation.getter(#currentFailoverIndex), @@ -118,7 +137,7 @@ class MockElectrumXClient extends _i1.Mock implements _i5.ElectrumXClient { @override String get host => (super.noSuchMethod( Invocation.getter(#host), - returnValue: _i6.dummyValue( + returnValue: _i8.dummyValue( this, Invocation.getter(#host), ), @@ -137,27 +156,27 @@ class MockElectrumXClient extends _i1.Mock implements _i5.ElectrumXClient { ) as bool); @override - _i7.Future closeAdapter() => (super.noSuchMethod( + _i9.Future closeAdapter() => (super.noSuchMethod( Invocation.method( #closeAdapter, [], ), - returnValue: _i7.Future.value(), - returnValueForMissingStub: _i7.Future.value(), - ) as _i7.Future); + returnValue: _i9.Future.value(), + returnValueForMissingStub: _i9.Future.value(), + ) as _i9.Future); @override - _i7.Future checkElectrumAdapter() => (super.noSuchMethod( + _i9.Future checkElectrumAdapter() => (super.noSuchMethod( Invocation.method( #checkElectrumAdapter, [], ), - returnValue: _i7.Future.value(), - returnValueForMissingStub: _i7.Future.value(), - ) as _i7.Future); + returnValue: _i9.Future.value(), + returnValueForMissingStub: _i9.Future.value(), + ) as _i9.Future); @override - _i7.Future request({ + _i9.Future request({ required String? command, List? args = const [], String? requestID, @@ -176,11 +195,11 @@ class MockElectrumXClient extends _i1.Mock implements _i5.ElectrumXClient { #requestTimeout: requestTimeout, }, ), - returnValue: _i7.Future.value(), - ) as _i7.Future); + returnValue: _i9.Future.value(), + ) as _i9.Future); @override - _i7.Future> batchRequest({ + _i9.Future> batchRequest({ required String? command, required List? args, Duration? requestTimeout = const Duration(seconds: 60), @@ -197,11 +216,11 @@ class MockElectrumXClient extends _i1.Mock implements _i5.ElectrumXClient { #retries: retries, }, ), - returnValue: _i7.Future>.value([]), - ) as _i7.Future>); + returnValue: _i9.Future>.value([]), + ) as _i9.Future>); @override - _i7.Future ping({ + _i9.Future ping({ String? requestID, int? retryCount = 1, }) => @@ -214,11 +233,11 @@ class MockElectrumXClient extends _i1.Mock implements _i5.ElectrumXClient { #retryCount: retryCount, }, ), - returnValue: _i7.Future.value(false), - ) as _i7.Future); + returnValue: _i9.Future.value(false), + ) as _i9.Future); @override - _i7.Future> getBlockHeadTip({String? requestID}) => + _i9.Future> getBlockHeadTip({String? requestID}) => (super.noSuchMethod( Invocation.method( #getBlockHeadTip, @@ -226,11 +245,11 @@ class MockElectrumXClient extends _i1.Mock implements _i5.ElectrumXClient { {#requestID: requestID}, ), returnValue: - _i7.Future>.value({}), - ) as _i7.Future>); + _i9.Future>.value({}), + ) as _i9.Future>); @override - _i7.Future> getServerFeatures({String? requestID}) => + _i9.Future> getServerFeatures({String? requestID}) => (super.noSuchMethod( Invocation.method( #getServerFeatures, @@ -238,11 +257,11 @@ class MockElectrumXClient extends _i1.Mock implements _i5.ElectrumXClient { {#requestID: requestID}, ), returnValue: - _i7.Future>.value({}), - ) as _i7.Future>); + _i9.Future>.value({}), + ) as _i9.Future>); @override - _i7.Future broadcastTransaction({ + _i9.Future broadcastTransaction({ required String? rawTx, String? requestID, }) => @@ -255,7 +274,7 @@ class MockElectrumXClient extends _i1.Mock implements _i5.ElectrumXClient { #requestID: requestID, }, ), - returnValue: _i7.Future.value(_i6.dummyValue( + returnValue: _i9.Future.value(_i8.dummyValue( this, Invocation.method( #broadcastTransaction, @@ -266,10 +285,10 @@ class MockElectrumXClient extends _i1.Mock implements _i5.ElectrumXClient { }, ), )), - ) as _i7.Future); + ) as _i9.Future); @override - _i7.Future> getBalance({ + _i9.Future> getBalance({ required String? scripthash, String? requestID, }) => @@ -283,11 +302,11 @@ class MockElectrumXClient extends _i1.Mock implements _i5.ElectrumXClient { }, ), returnValue: - _i7.Future>.value({}), - ) as _i7.Future>); + _i9.Future>.value({}), + ) as _i9.Future>); @override - _i7.Future>> getHistory({ + _i9.Future>> getHistory({ required String? scripthash, String? requestID, }) => @@ -300,12 +319,12 @@ class MockElectrumXClient extends _i1.Mock implements _i5.ElectrumXClient { #requestID: requestID, }, ), - returnValue: _i7.Future>>.value( + returnValue: _i9.Future>>.value( >[]), - ) as _i7.Future>>); + ) as _i9.Future>>); @override - _i7.Future>>> getBatchHistory( + _i9.Future>>> getBatchHistory( {required List? args}) => (super.noSuchMethod( Invocation.method( @@ -313,12 +332,12 @@ class MockElectrumXClient extends _i1.Mock implements _i5.ElectrumXClient { [], {#args: args}, ), - returnValue: _i7.Future>>>.value( + returnValue: _i9.Future>>>.value( >>[]), - ) as _i7.Future>>>); + ) as _i9.Future>>>); @override - _i7.Future>> getUTXOs({ + _i9.Future>> getUTXOs({ required String? scripthash, String? requestID, }) => @@ -331,12 +350,12 @@ class MockElectrumXClient extends _i1.Mock implements _i5.ElectrumXClient { #requestID: requestID, }, ), - returnValue: _i7.Future>>.value( + returnValue: _i9.Future>>.value( >[]), - ) as _i7.Future>>); + ) as _i9.Future>>); @override - _i7.Future>>> getBatchUTXOs( + _i9.Future>>> getBatchUTXOs( {required List? args}) => (super.noSuchMethod( Invocation.method( @@ -344,12 +363,12 @@ class MockElectrumXClient extends _i1.Mock implements _i5.ElectrumXClient { [], {#args: args}, ), - returnValue: _i7.Future>>>.value( + returnValue: _i9.Future>>>.value( >>[]), - ) as _i7.Future>>>); + ) as _i9.Future>>>); @override - _i7.Future> getTransaction({ + _i9.Future> getTransaction({ required String? txHash, bool? verbose = true, String? requestID, @@ -365,11 +384,11 @@ class MockElectrumXClient extends _i1.Mock implements _i5.ElectrumXClient { }, ), returnValue: - _i7.Future>.value({}), - ) as _i7.Future>); + _i9.Future>.value({}), + ) as _i9.Future>); @override - _i7.Future> getLelantusAnonymitySet({ + _i9.Future> getLelantusAnonymitySet({ String? groupId = r'1', String? blockhash = r'', String? requestID, @@ -385,11 +404,11 @@ class MockElectrumXClient extends _i1.Mock implements _i5.ElectrumXClient { }, ), returnValue: - _i7.Future>.value({}), - ) as _i7.Future>); + _i9.Future>.value({}), + ) as _i9.Future>); @override - _i7.Future getLelantusMintData({ + _i9.Future getLelantusMintData({ dynamic mints, String? requestID, }) => @@ -402,11 +421,11 @@ class MockElectrumXClient extends _i1.Mock implements _i5.ElectrumXClient { #requestID: requestID, }, ), - returnValue: _i7.Future.value(), - ) as _i7.Future); + returnValue: _i9.Future.value(), + ) as _i9.Future); @override - _i7.Future> getLelantusUsedCoinSerials({ + _i9.Future> getLelantusUsedCoinSerials({ String? requestID, required int? startNumber, }) => @@ -420,22 +439,22 @@ class MockElectrumXClient extends _i1.Mock implements _i5.ElectrumXClient { }, ), returnValue: - _i7.Future>.value({}), - ) as _i7.Future>); + _i9.Future>.value({}), + ) as _i9.Future>); @override - _i7.Future getLelantusLatestCoinId({String? requestID}) => + _i9.Future getLelantusLatestCoinId({String? requestID}) => (super.noSuchMethod( Invocation.method( #getLelantusLatestCoinId, [], {#requestID: requestID}, ), - returnValue: _i7.Future.value(0), - ) as _i7.Future); + returnValue: _i9.Future.value(0), + ) as _i9.Future); @override - _i7.Future> getSparkAnonymitySet({ + _i9.Future> getSparkAnonymitySet({ String? coinGroupId = r'1', String? startBlockHash = r'', String? requestID, @@ -451,58 +470,33 @@ class MockElectrumXClient extends _i1.Mock implements _i5.ElectrumXClient { }, ), returnValue: - _i7.Future>.value({}), - ) as _i7.Future>); - - @override - _i7.Future>> getSparkMintMetaData({ - String? requestID, - required List? sparkCoinHashes, - }) => - (super.noSuchMethod( - Invocation.method( - #getSparkMintMetaData, - [], - { - #requestID: requestID, - #sparkCoinHashes: sparkCoinHashes, - }, - ), - returnValue: _i7.Future>>.value( - >[]), - ) as _i7.Future>>); + _i9.Future>.value({}), + ) as _i9.Future>); @override - _i7.Future getSparkLatestCoinId({String? requestID}) => + _i9.Future getSparkLatestCoinId({String? requestID}) => (super.noSuchMethod( Invocation.method( #getSparkLatestCoinId, [], {#requestID: requestID}, ), - returnValue: _i7.Future.value(0), - ) as _i7.Future); + returnValue: _i9.Future.value(0), + ) as _i9.Future); @override - _i7.Future> getMempoolTxids({String? requestID}) => + _i9.Future> getMempoolTxids({String? requestID}) => (super.noSuchMethod( Invocation.method( #getMempoolTxids, [], {#requestID: requestID}, ), - returnValue: _i7.Future>.value({}), - ) as _i7.Future>); + returnValue: _i9.Future>.value({}), + ) as _i9.Future>); @override - _i7.Future< - List< - ({ - List coins, - List lTags, - List serialContext, - String txid - })>> getMempoolSparkData({ + _i9.Future> getMempoolSparkData({ String? requestID, required List? txids, }) => @@ -515,30 +509,12 @@ class MockElectrumXClient extends _i1.Mock implements _i5.ElectrumXClient { #txids: txids, }, ), - returnValue: _i7.Future< - List< - ({ - List coins, - List lTags, - List serialContext, - String txid - })>>.value(<({ - List coins, - List lTags, - List serialContext, - String txid - })>[]), - ) as _i7.Future< - List< - ({ - List coins, - List lTags, - List serialContext, - String txid - })>>); - - @override - _i7.Future>> getSparkUnhashedUsedCoinsTagsWithTxHashes({ + returnValue: _i9.Future>.value( + <_i3.SparkMempoolData>[]), + ) as _i9.Future>); + + @override + _i9.Future>> getSparkUnhashedUsedCoinsTagsWithTxHashes({ String? requestID, required int? startNumber, }) => @@ -551,11 +527,62 @@ class MockElectrumXClient extends _i1.Mock implements _i5.ElectrumXClient { #startNumber: startNumber, }, ), - returnValue: _i7.Future>>.value(>[]), - ) as _i7.Future>>); + returnValue: _i9.Future>>.value(>[]), + ) as _i9.Future>>); + + @override + _i9.Future<_i3.SparkAnonymitySetMeta> getSparkAnonymitySetMeta({ + String? requestID, + required int? coinGroupId, + }) => + (super.noSuchMethod( + Invocation.method( + #getSparkAnonymitySetMeta, + [], + { + #requestID: requestID, + #coinGroupId: coinGroupId, + }, + ), + returnValue: _i9.Future<_i3.SparkAnonymitySetMeta>.value( + _FakeSparkAnonymitySetMeta_2( + this, + Invocation.method( + #getSparkAnonymitySetMeta, + [], + { + #requestID: requestID, + #coinGroupId: coinGroupId, + }, + ), + )), + ) as _i9.Future<_i3.SparkAnonymitySetMeta>); + + @override + _i9.Future> getSparkAnonymitySetBySector({ + String? requestID, + required int? coinGroupId, + required String? latestBlock, + required int? startIndex, + required int? endIndex, + }) => + (super.noSuchMethod( + Invocation.method( + #getSparkAnonymitySetBySector, + [], + { + #requestID: requestID, + #coinGroupId: coinGroupId, + #latestBlock: latestBlock, + #startIndex: startIndex, + #endIndex: endIndex, + }, + ), + returnValue: _i9.Future>.value([]), + ) as _i9.Future>); @override - _i7.Future isMasterNodeCollateral({ + _i9.Future isMasterNodeCollateral({ String? requestID, required String? txid, required int? index, @@ -570,11 +597,11 @@ class MockElectrumXClient extends _i1.Mock implements _i5.ElectrumXClient { #index: index, }, ), - returnValue: _i7.Future.value(false), - ) as _i7.Future); + returnValue: _i9.Future.value(false), + ) as _i9.Future); @override - _i7.Future> getFeeRate({String? requestID}) => + _i9.Future> getFeeRate({String? requestID}) => (super.noSuchMethod( Invocation.method( #getFeeRate, @@ -582,11 +609,11 @@ class MockElectrumXClient extends _i1.Mock implements _i5.ElectrumXClient { {#requestID: requestID}, ), returnValue: - _i7.Future>.value({}), - ) as _i7.Future>); + _i9.Future>.value({}), + ) as _i9.Future>); @override - _i7.Future<_i3.Decimal> estimateFee({ + _i9.Future<_i4.Decimal> estimateFee({ String? requestID, required int? blocks, }) => @@ -599,7 +626,7 @@ class MockElectrumXClient extends _i1.Mock implements _i5.ElectrumXClient { #blocks: blocks, }, ), - returnValue: _i7.Future<_i3.Decimal>.value(_FakeDecimal_2( + returnValue: _i9.Future<_i4.Decimal>.value(_FakeDecimal_3( this, Invocation.method( #estimateFee, @@ -610,16 +637,16 @@ class MockElectrumXClient extends _i1.Mock implements _i5.ElectrumXClient { }, ), )), - ) as _i7.Future<_i3.Decimal>); + ) as _i9.Future<_i4.Decimal>); @override - _i7.Future<_i3.Decimal> relayFee({String? requestID}) => (super.noSuchMethod( + _i9.Future<_i4.Decimal> relayFee({String? requestID}) => (super.noSuchMethod( Invocation.method( #relayFee, [], {#requestID: requestID}, ), - returnValue: _i7.Future<_i3.Decimal>.value(_FakeDecimal_2( + returnValue: _i9.Future<_i4.Decimal>.value(_FakeDecimal_3( this, Invocation.method( #relayFee, @@ -627,13 +654,13 @@ class MockElectrumXClient extends _i1.Mock implements _i5.ElectrumXClient { {#requestID: requestID}, ), )), - ) as _i7.Future<_i3.Decimal>); + ) as _i9.Future<_i4.Decimal>); } /// A class which mocks [Prefs]. /// /// See the documentation for Mockito's code generation for more information. -class MockPrefs extends _i1.Mock implements _i8.Prefs { +class MockPrefs extends _i1.Mock implements _i10.Prefs { MockPrefs() { _i1.throwOnMissingStub(this); } @@ -697,13 +724,13 @@ class MockPrefs extends _i1.Mock implements _i8.Prefs { ); @override - _i9.SyncingType get syncType => (super.noSuchMethod( + _i11.SyncingType get syncType => (super.noSuchMethod( Invocation.getter(#syncType), - returnValue: _i9.SyncingType.currentWalletOnly, - ) as _i9.SyncingType); + returnValue: _i11.SyncingType.currentWalletOnly, + ) as _i11.SyncingType); @override - set syncType(_i9.SyncingType? syncType) => super.noSuchMethod( + set syncType(_i11.SyncingType? syncType) => super.noSuchMethod( Invocation.setter( #syncType, syncType, @@ -744,7 +771,7 @@ class MockPrefs extends _i1.Mock implements _i8.Prefs { @override String get language => (super.noSuchMethod( Invocation.getter(#language), - returnValue: _i6.dummyValue( + returnValue: _i8.dummyValue( this, Invocation.getter(#language), ), @@ -762,7 +789,7 @@ class MockPrefs extends _i1.Mock implements _i8.Prefs { @override String get currency => (super.noSuchMethod( Invocation.getter(#currency), - returnValue: _i6.dummyValue( + returnValue: _i8.dummyValue( this, Invocation.getter(#currency), ), @@ -892,13 +919,13 @@ class MockPrefs extends _i1.Mock implements _i8.Prefs { ); @override - _i10.BackupFrequencyType get backupFrequencyType => (super.noSuchMethod( + _i12.BackupFrequencyType get backupFrequencyType => (super.noSuchMethod( Invocation.getter(#backupFrequencyType), - returnValue: _i10.BackupFrequencyType.everyTenMinutes, - ) as _i10.BackupFrequencyType); + returnValue: _i12.BackupFrequencyType.everyTenMinutes, + ) as _i12.BackupFrequencyType); @override - set backupFrequencyType(_i10.BackupFrequencyType? backupFrequencyType) => + set backupFrequencyType(_i12.BackupFrequencyType? backupFrequencyType) => super.noSuchMethod( Invocation.setter( #backupFrequencyType, @@ -1005,7 +1032,7 @@ class MockPrefs extends _i1.Mock implements _i8.Prefs { @override String get themeId => (super.noSuchMethod( Invocation.getter(#themeId), - returnValue: _i6.dummyValue( + returnValue: _i8.dummyValue( this, Invocation.getter(#themeId), ), @@ -1023,7 +1050,7 @@ class MockPrefs extends _i1.Mock implements _i8.Prefs { @override String get systemBrightnessLightThemeId => (super.noSuchMethod( Invocation.getter(#systemBrightnessLightThemeId), - returnValue: _i6.dummyValue( + returnValue: _i8.dummyValue( this, Invocation.getter(#systemBrightnessLightThemeId), ), @@ -1042,7 +1069,7 @@ class MockPrefs extends _i1.Mock implements _i8.Prefs { @override String get systemBrightnessDarkThemeId => (super.noSuchMethod( Invocation.getter(#systemBrightnessDarkThemeId), - returnValue: _i6.dummyValue( + returnValue: _i8.dummyValue( this, Invocation.getter(#systemBrightnessDarkThemeId), ), @@ -1110,67 +1137,67 @@ class MockPrefs extends _i1.Mock implements _i8.Prefs { ) as bool); @override - _i7.Future init() => (super.noSuchMethod( + _i9.Future init() => (super.noSuchMethod( Invocation.method( #init, [], ), - returnValue: _i7.Future.value(), - returnValueForMissingStub: _i7.Future.value(), - ) as _i7.Future); + returnValue: _i9.Future.value(), + returnValueForMissingStub: _i9.Future.value(), + ) as _i9.Future); @override - _i7.Future incrementCurrentNotificationIndex() => (super.noSuchMethod( + _i9.Future incrementCurrentNotificationIndex() => (super.noSuchMethod( Invocation.method( #incrementCurrentNotificationIndex, [], ), - returnValue: _i7.Future.value(), - returnValueForMissingStub: _i7.Future.value(), - ) as _i7.Future); + returnValue: _i9.Future.value(), + returnValueForMissingStub: _i9.Future.value(), + ) as _i9.Future); @override - _i7.Future isExternalCallsSet() => (super.noSuchMethod( + _i9.Future isExternalCallsSet() => (super.noSuchMethod( Invocation.method( #isExternalCallsSet, [], ), - returnValue: _i7.Future.value(false), - ) as _i7.Future); + returnValue: _i9.Future.value(false), + ) as _i9.Future); @override - _i7.Future saveUserID(String? userId) => (super.noSuchMethod( + _i9.Future saveUserID(String? userId) => (super.noSuchMethod( Invocation.method( #saveUserID, [userId], ), - returnValue: _i7.Future.value(), - returnValueForMissingStub: _i7.Future.value(), - ) as _i7.Future); + returnValue: _i9.Future.value(), + returnValueForMissingStub: _i9.Future.value(), + ) as _i9.Future); @override - _i7.Future saveSignupEpoch(int? signupEpoch) => (super.noSuchMethod( + _i9.Future saveSignupEpoch(int? signupEpoch) => (super.noSuchMethod( Invocation.method( #saveSignupEpoch, [signupEpoch], ), - returnValue: _i7.Future.value(), - returnValueForMissingStub: _i7.Future.value(), - ) as _i7.Future); + returnValue: _i9.Future.value(), + returnValueForMissingStub: _i9.Future.value(), + ) as _i9.Future); @override - _i11.AmountUnit amountUnit(_i2.CryptoCurrency? coin) => (super.noSuchMethod( + _i13.AmountUnit amountUnit(_i2.CryptoCurrency? coin) => (super.noSuchMethod( Invocation.method( #amountUnit, [coin], ), - returnValue: _i11.AmountUnit.normal, - ) as _i11.AmountUnit); + returnValue: _i13.AmountUnit.normal, + ) as _i13.AmountUnit); @override void updateAmountUnit({ required _i2.CryptoCurrency? coin, - required _i11.AmountUnit? amountUnit, + required _i13.AmountUnit? amountUnit, }) => super.noSuchMethod( Invocation.method( @@ -1211,25 +1238,25 @@ class MockPrefs extends _i1.Mock implements _i8.Prefs { ); @override - _i4.FusionInfo getFusionServerInfo(_i2.CryptoCurrency? coin) => + _i5.FusionInfo getFusionServerInfo(_i2.CryptoCurrency? coin) => (super.noSuchMethod( Invocation.method( #getFusionServerInfo, [coin], ), - returnValue: _FakeFusionInfo_3( + returnValue: _FakeFusionInfo_4( this, Invocation.method( #getFusionServerInfo, [coin], ), ), - ) as _i4.FusionInfo); + ) as _i5.FusionInfo); @override void setFusionServerInfo( _i2.CryptoCurrency? coin, - _i4.FusionInfo? fusionServerInfo, + _i5.FusionInfo? fusionServerInfo, ) => super.noSuchMethod( Invocation.method( @@ -1243,7 +1270,7 @@ class MockPrefs extends _i1.Mock implements _i8.Prefs { ); @override - void addListener(_i12.VoidCallback? listener) => super.noSuchMethod( + void addListener(_i14.VoidCallback? listener) => super.noSuchMethod( Invocation.method( #addListener, [listener], @@ -1252,7 +1279,7 @@ class MockPrefs extends _i1.Mock implements _i8.Prefs { ); @override - void removeListener(_i12.VoidCallback? listener) => super.noSuchMethod( + void removeListener(_i14.VoidCallback? listener) => super.noSuchMethod( Invocation.method( #removeListener, [listener], diff --git a/test/services/coins/bitcoin/bitcoin_wallet_test.mocks.dart b/test/services/coins/bitcoin/bitcoin_wallet_test.mocks.dart index 75fc2228a..a36aefef0 100644 --- a/test/services/coins/bitcoin/bitcoin_wallet_test.mocks.dart +++ b/test/services/coins/bitcoin/bitcoin_wallet_test.mocks.dart @@ -3,15 +3,17 @@ // Do not manually edit this file. // ignore_for_file: no_leading_underscores_for_library_prefixes -import 'dart:async' as _i6; +import 'dart:async' as _i8; -import 'package:decimal/decimal.dart' as _i3; +import 'package:decimal/decimal.dart' as _i4; import 'package:mockito/mockito.dart' as _i1; -import 'package:mockito/src/dummies.dart' as _i5; -import 'package:stackwallet/electrumx_rpc/cached_electrumx_client.dart' as _i7; -import 'package:stackwallet/electrumx_rpc/electrumx_client.dart' as _i4; +import 'package:mockito/src/dummies.dart' as _i7; +import 'package:stackwallet/electrumx_rpc/cached_electrumx_client.dart' as _i9; +import 'package:stackwallet/electrumx_rpc/electrumx_client.dart' as _i5; +import 'package:stackwallet/models/electrumx_response/spark_models.dart' as _i3; import 'package:stackwallet/services/transaction_notification_tracker.dart' - as _i8; + as _i10; +import 'package:stackwallet/utilities/tor_plain_net_option_enum.dart' as _i6; import 'package:stackwallet/wallets/crypto_currency/crypto_currency.dart' as _i2; @@ -49,8 +51,9 @@ class _FakeDuration_1 extends _i1.SmartFake implements Duration { ); } -class _FakeDecimal_2 extends _i1.SmartFake implements _i3.Decimal { - _FakeDecimal_2( +class _FakeSparkAnonymitySetMeta_2 extends _i1.SmartFake + implements _i3.SparkAnonymitySetMeta { + _FakeSparkAnonymitySetMeta_2( Object parent, Invocation parentInvocation, ) : super( @@ -59,9 +62,19 @@ class _FakeDecimal_2 extends _i1.SmartFake implements _i3.Decimal { ); } -class _FakeElectrumXClient_3 extends _i1.SmartFake - implements _i4.ElectrumXClient { - _FakeElectrumXClient_3( +class _FakeDecimal_3 extends _i1.SmartFake implements _i4.Decimal { + _FakeDecimal_3( + Object parent, + Invocation parentInvocation, + ) : super( + parent, + parentInvocation, + ); +} + +class _FakeElectrumXClient_4 extends _i1.SmartFake + implements _i5.ElectrumXClient { + _FakeElectrumXClient_4( Object parent, Invocation parentInvocation, ) : super( @@ -73,7 +86,7 @@ class _FakeElectrumXClient_3 extends _i1.SmartFake /// A class which mocks [ElectrumXClient]. /// /// See the documentation for Mockito's code generation for more information. -class MockElectrumXClient extends _i1.Mock implements _i4.ElectrumXClient { +class MockElectrumXClient extends _i1.Mock implements _i5.ElectrumXClient { MockElectrumXClient() { _i1.throwOnMissingStub(this); } @@ -87,6 +100,12 @@ class MockElectrumXClient extends _i1.Mock implements _i4.ElectrumXClient { ), ) as _i2.CryptoCurrency); + @override + _i6.TorPlainNetworkOption get netType => (super.noSuchMethod( + Invocation.getter(#netType), + returnValue: _i6.TorPlainNetworkOption.tor, + ) as _i6.TorPlainNetworkOption); + @override int get currentFailoverIndex => (super.noSuchMethod( Invocation.getter(#currentFailoverIndex), @@ -115,7 +134,7 @@ class MockElectrumXClient extends _i1.Mock implements _i4.ElectrumXClient { @override String get host => (super.noSuchMethod( Invocation.getter(#host), - returnValue: _i5.dummyValue( + returnValue: _i7.dummyValue( this, Invocation.getter(#host), ), @@ -134,27 +153,27 @@ class MockElectrumXClient extends _i1.Mock implements _i4.ElectrumXClient { ) as bool); @override - _i6.Future closeAdapter() => (super.noSuchMethod( + _i8.Future closeAdapter() => (super.noSuchMethod( Invocation.method( #closeAdapter, [], ), - returnValue: _i6.Future.value(), - returnValueForMissingStub: _i6.Future.value(), - ) as _i6.Future); + returnValue: _i8.Future.value(), + returnValueForMissingStub: _i8.Future.value(), + ) as _i8.Future); @override - _i6.Future checkElectrumAdapter() => (super.noSuchMethod( + _i8.Future checkElectrumAdapter() => (super.noSuchMethod( Invocation.method( #checkElectrumAdapter, [], ), - returnValue: _i6.Future.value(), - returnValueForMissingStub: _i6.Future.value(), - ) as _i6.Future); + returnValue: _i8.Future.value(), + returnValueForMissingStub: _i8.Future.value(), + ) as _i8.Future); @override - _i6.Future request({ + _i8.Future request({ required String? command, List? args = const [], String? requestID, @@ -173,11 +192,11 @@ class MockElectrumXClient extends _i1.Mock implements _i4.ElectrumXClient { #requestTimeout: requestTimeout, }, ), - returnValue: _i6.Future.value(), - ) as _i6.Future); + returnValue: _i8.Future.value(), + ) as _i8.Future); @override - _i6.Future> batchRequest({ + _i8.Future> batchRequest({ required String? command, required List? args, Duration? requestTimeout = const Duration(seconds: 60), @@ -194,11 +213,11 @@ class MockElectrumXClient extends _i1.Mock implements _i4.ElectrumXClient { #retries: retries, }, ), - returnValue: _i6.Future>.value([]), - ) as _i6.Future>); + returnValue: _i8.Future>.value([]), + ) as _i8.Future>); @override - _i6.Future ping({ + _i8.Future ping({ String? requestID, int? retryCount = 1, }) => @@ -211,11 +230,11 @@ class MockElectrumXClient extends _i1.Mock implements _i4.ElectrumXClient { #retryCount: retryCount, }, ), - returnValue: _i6.Future.value(false), - ) as _i6.Future); + returnValue: _i8.Future.value(false), + ) as _i8.Future); @override - _i6.Future> getBlockHeadTip({String? requestID}) => + _i8.Future> getBlockHeadTip({String? requestID}) => (super.noSuchMethod( Invocation.method( #getBlockHeadTip, @@ -223,11 +242,11 @@ class MockElectrumXClient extends _i1.Mock implements _i4.ElectrumXClient { {#requestID: requestID}, ), returnValue: - _i6.Future>.value({}), - ) as _i6.Future>); + _i8.Future>.value({}), + ) as _i8.Future>); @override - _i6.Future> getServerFeatures({String? requestID}) => + _i8.Future> getServerFeatures({String? requestID}) => (super.noSuchMethod( Invocation.method( #getServerFeatures, @@ -235,11 +254,11 @@ class MockElectrumXClient extends _i1.Mock implements _i4.ElectrumXClient { {#requestID: requestID}, ), returnValue: - _i6.Future>.value({}), - ) as _i6.Future>); + _i8.Future>.value({}), + ) as _i8.Future>); @override - _i6.Future broadcastTransaction({ + _i8.Future broadcastTransaction({ required String? rawTx, String? requestID, }) => @@ -252,7 +271,7 @@ class MockElectrumXClient extends _i1.Mock implements _i4.ElectrumXClient { #requestID: requestID, }, ), - returnValue: _i6.Future.value(_i5.dummyValue( + returnValue: _i8.Future.value(_i7.dummyValue( this, Invocation.method( #broadcastTransaction, @@ -263,10 +282,10 @@ class MockElectrumXClient extends _i1.Mock implements _i4.ElectrumXClient { }, ), )), - ) as _i6.Future); + ) as _i8.Future); @override - _i6.Future> getBalance({ + _i8.Future> getBalance({ required String? scripthash, String? requestID, }) => @@ -280,11 +299,11 @@ class MockElectrumXClient extends _i1.Mock implements _i4.ElectrumXClient { }, ), returnValue: - _i6.Future>.value({}), - ) as _i6.Future>); + _i8.Future>.value({}), + ) as _i8.Future>); @override - _i6.Future>> getHistory({ + _i8.Future>> getHistory({ required String? scripthash, String? requestID, }) => @@ -297,12 +316,12 @@ class MockElectrumXClient extends _i1.Mock implements _i4.ElectrumXClient { #requestID: requestID, }, ), - returnValue: _i6.Future>>.value( + returnValue: _i8.Future>>.value( >[]), - ) as _i6.Future>>); + ) as _i8.Future>>); @override - _i6.Future>>> getBatchHistory( + _i8.Future>>> getBatchHistory( {required List? args}) => (super.noSuchMethod( Invocation.method( @@ -310,12 +329,12 @@ class MockElectrumXClient extends _i1.Mock implements _i4.ElectrumXClient { [], {#args: args}, ), - returnValue: _i6.Future>>>.value( + returnValue: _i8.Future>>>.value( >>[]), - ) as _i6.Future>>>); + ) as _i8.Future>>>); @override - _i6.Future>> getUTXOs({ + _i8.Future>> getUTXOs({ required String? scripthash, String? requestID, }) => @@ -328,12 +347,12 @@ class MockElectrumXClient extends _i1.Mock implements _i4.ElectrumXClient { #requestID: requestID, }, ), - returnValue: _i6.Future>>.value( + returnValue: _i8.Future>>.value( >[]), - ) as _i6.Future>>); + ) as _i8.Future>>); @override - _i6.Future>>> getBatchUTXOs( + _i8.Future>>> getBatchUTXOs( {required List? args}) => (super.noSuchMethod( Invocation.method( @@ -341,12 +360,12 @@ class MockElectrumXClient extends _i1.Mock implements _i4.ElectrumXClient { [], {#args: args}, ), - returnValue: _i6.Future>>>.value( + returnValue: _i8.Future>>>.value( >>[]), - ) as _i6.Future>>>); + ) as _i8.Future>>>); @override - _i6.Future> getTransaction({ + _i8.Future> getTransaction({ required String? txHash, bool? verbose = true, String? requestID, @@ -362,11 +381,11 @@ class MockElectrumXClient extends _i1.Mock implements _i4.ElectrumXClient { }, ), returnValue: - _i6.Future>.value({}), - ) as _i6.Future>); + _i8.Future>.value({}), + ) as _i8.Future>); @override - _i6.Future> getLelantusAnonymitySet({ + _i8.Future> getLelantusAnonymitySet({ String? groupId = r'1', String? blockhash = r'', String? requestID, @@ -382,11 +401,11 @@ class MockElectrumXClient extends _i1.Mock implements _i4.ElectrumXClient { }, ), returnValue: - _i6.Future>.value({}), - ) as _i6.Future>); + _i8.Future>.value({}), + ) as _i8.Future>); @override - _i6.Future getLelantusMintData({ + _i8.Future getLelantusMintData({ dynamic mints, String? requestID, }) => @@ -399,11 +418,11 @@ class MockElectrumXClient extends _i1.Mock implements _i4.ElectrumXClient { #requestID: requestID, }, ), - returnValue: _i6.Future.value(), - ) as _i6.Future); + returnValue: _i8.Future.value(), + ) as _i8.Future); @override - _i6.Future> getLelantusUsedCoinSerials({ + _i8.Future> getLelantusUsedCoinSerials({ String? requestID, required int? startNumber, }) => @@ -417,22 +436,22 @@ class MockElectrumXClient extends _i1.Mock implements _i4.ElectrumXClient { }, ), returnValue: - _i6.Future>.value({}), - ) as _i6.Future>); + _i8.Future>.value({}), + ) as _i8.Future>); @override - _i6.Future getLelantusLatestCoinId({String? requestID}) => + _i8.Future getLelantusLatestCoinId({String? requestID}) => (super.noSuchMethod( Invocation.method( #getLelantusLatestCoinId, [], {#requestID: requestID}, ), - returnValue: _i6.Future.value(0), - ) as _i6.Future); + returnValue: _i8.Future.value(0), + ) as _i8.Future); @override - _i6.Future> getSparkAnonymitySet({ + _i8.Future> getSparkAnonymitySet({ String? coinGroupId = r'1', String? startBlockHash = r'', String? requestID, @@ -448,58 +467,33 @@ class MockElectrumXClient extends _i1.Mock implements _i4.ElectrumXClient { }, ), returnValue: - _i6.Future>.value({}), - ) as _i6.Future>); - - @override - _i6.Future>> getSparkMintMetaData({ - String? requestID, - required List? sparkCoinHashes, - }) => - (super.noSuchMethod( - Invocation.method( - #getSparkMintMetaData, - [], - { - #requestID: requestID, - #sparkCoinHashes: sparkCoinHashes, - }, - ), - returnValue: _i6.Future>>.value( - >[]), - ) as _i6.Future>>); + _i8.Future>.value({}), + ) as _i8.Future>); @override - _i6.Future getSparkLatestCoinId({String? requestID}) => + _i8.Future getSparkLatestCoinId({String? requestID}) => (super.noSuchMethod( Invocation.method( #getSparkLatestCoinId, [], {#requestID: requestID}, ), - returnValue: _i6.Future.value(0), - ) as _i6.Future); + returnValue: _i8.Future.value(0), + ) as _i8.Future); @override - _i6.Future> getMempoolTxids({String? requestID}) => + _i8.Future> getMempoolTxids({String? requestID}) => (super.noSuchMethod( Invocation.method( #getMempoolTxids, [], {#requestID: requestID}, ), - returnValue: _i6.Future>.value({}), - ) as _i6.Future>); + returnValue: _i8.Future>.value({}), + ) as _i8.Future>); @override - _i6.Future< - List< - ({ - List coins, - List lTags, - List serialContext, - String txid - })>> getMempoolSparkData({ + _i8.Future> getMempoolSparkData({ String? requestID, required List? txids, }) => @@ -512,30 +506,12 @@ class MockElectrumXClient extends _i1.Mock implements _i4.ElectrumXClient { #txids: txids, }, ), - returnValue: _i6.Future< - List< - ({ - List coins, - List lTags, - List serialContext, - String txid - })>>.value(<({ - List coins, - List lTags, - List serialContext, - String txid - })>[]), - ) as _i6.Future< - List< - ({ - List coins, - List lTags, - List serialContext, - String txid - })>>); - - @override - _i6.Future>> getSparkUnhashedUsedCoinsTagsWithTxHashes({ + returnValue: _i8.Future>.value( + <_i3.SparkMempoolData>[]), + ) as _i8.Future>); + + @override + _i8.Future>> getSparkUnhashedUsedCoinsTagsWithTxHashes({ String? requestID, required int? startNumber, }) => @@ -548,11 +524,62 @@ class MockElectrumXClient extends _i1.Mock implements _i4.ElectrumXClient { #startNumber: startNumber, }, ), - returnValue: _i6.Future>>.value(>[]), - ) as _i6.Future>>); + returnValue: _i8.Future>>.value(>[]), + ) as _i8.Future>>); + + @override + _i8.Future<_i3.SparkAnonymitySetMeta> getSparkAnonymitySetMeta({ + String? requestID, + required int? coinGroupId, + }) => + (super.noSuchMethod( + Invocation.method( + #getSparkAnonymitySetMeta, + [], + { + #requestID: requestID, + #coinGroupId: coinGroupId, + }, + ), + returnValue: _i8.Future<_i3.SparkAnonymitySetMeta>.value( + _FakeSparkAnonymitySetMeta_2( + this, + Invocation.method( + #getSparkAnonymitySetMeta, + [], + { + #requestID: requestID, + #coinGroupId: coinGroupId, + }, + ), + )), + ) as _i8.Future<_i3.SparkAnonymitySetMeta>); + + @override + _i8.Future> getSparkAnonymitySetBySector({ + String? requestID, + required int? coinGroupId, + required String? latestBlock, + required int? startIndex, + required int? endIndex, + }) => + (super.noSuchMethod( + Invocation.method( + #getSparkAnonymitySetBySector, + [], + { + #requestID: requestID, + #coinGroupId: coinGroupId, + #latestBlock: latestBlock, + #startIndex: startIndex, + #endIndex: endIndex, + }, + ), + returnValue: _i8.Future>.value([]), + ) as _i8.Future>); @override - _i6.Future isMasterNodeCollateral({ + _i8.Future isMasterNodeCollateral({ String? requestID, required String? txid, required int? index, @@ -567,11 +594,11 @@ class MockElectrumXClient extends _i1.Mock implements _i4.ElectrumXClient { #index: index, }, ), - returnValue: _i6.Future.value(false), - ) as _i6.Future); + returnValue: _i8.Future.value(false), + ) as _i8.Future); @override - _i6.Future> getFeeRate({String? requestID}) => + _i8.Future> getFeeRate({String? requestID}) => (super.noSuchMethod( Invocation.method( #getFeeRate, @@ -579,11 +606,11 @@ class MockElectrumXClient extends _i1.Mock implements _i4.ElectrumXClient { {#requestID: requestID}, ), returnValue: - _i6.Future>.value({}), - ) as _i6.Future>); + _i8.Future>.value({}), + ) as _i8.Future>); @override - _i6.Future<_i3.Decimal> estimateFee({ + _i8.Future<_i4.Decimal> estimateFee({ String? requestID, required int? blocks, }) => @@ -596,7 +623,7 @@ class MockElectrumXClient extends _i1.Mock implements _i4.ElectrumXClient { #blocks: blocks, }, ), - returnValue: _i6.Future<_i3.Decimal>.value(_FakeDecimal_2( + returnValue: _i8.Future<_i4.Decimal>.value(_FakeDecimal_3( this, Invocation.method( #estimateFee, @@ -607,16 +634,16 @@ class MockElectrumXClient extends _i1.Mock implements _i4.ElectrumXClient { }, ), )), - ) as _i6.Future<_i3.Decimal>); + ) as _i8.Future<_i4.Decimal>); @override - _i6.Future<_i3.Decimal> relayFee({String? requestID}) => (super.noSuchMethod( + _i8.Future<_i4.Decimal> relayFee({String? requestID}) => (super.noSuchMethod( Invocation.method( #relayFee, [], {#requestID: requestID}, ), - returnValue: _i6.Future<_i3.Decimal>.value(_FakeDecimal_2( + returnValue: _i8.Future<_i4.Decimal>.value(_FakeDecimal_3( this, Invocation.method( #relayFee, @@ -624,29 +651,29 @@ class MockElectrumXClient extends _i1.Mock implements _i4.ElectrumXClient { {#requestID: requestID}, ), )), - ) as _i6.Future<_i3.Decimal>); + ) as _i8.Future<_i4.Decimal>); } /// A class which mocks [CachedElectrumXClient]. /// /// See the documentation for Mockito's code generation for more information. class MockCachedElectrumXClient extends _i1.Mock - implements _i7.CachedElectrumXClient { + implements _i9.CachedElectrumXClient { MockCachedElectrumXClient() { _i1.throwOnMissingStub(this); } @override - _i4.ElectrumXClient get electrumXClient => (super.noSuchMethod( + _i5.ElectrumXClient get electrumXClient => (super.noSuchMethod( Invocation.getter(#electrumXClient), - returnValue: _FakeElectrumXClient_3( + returnValue: _FakeElectrumXClient_4( this, Invocation.getter(#electrumXClient), ), - ) as _i4.ElectrumXClient); + ) as _i5.ElectrumXClient); @override - _i6.Future> getAnonymitySet({ + _i8.Future> getAnonymitySet({ required String? groupId, String? blockhash = r'', required _i2.CryptoCurrency? cryptoCurrency, @@ -662,8 +689,8 @@ class MockCachedElectrumXClient extends _i1.Mock }, ), returnValue: - _i6.Future>.value({}), - ) as _i6.Future>); + _i8.Future>.value({}), + ) as _i8.Future>); @override String base64ToHex(String? source) => (super.noSuchMethod( @@ -671,7 +698,7 @@ class MockCachedElectrumXClient extends _i1.Mock #base64ToHex, [source], ), - returnValue: _i5.dummyValue( + returnValue: _i7.dummyValue( this, Invocation.method( #base64ToHex, @@ -686,7 +713,7 @@ class MockCachedElectrumXClient extends _i1.Mock #base64ToReverseHex, [source], ), - returnValue: _i5.dummyValue( + returnValue: _i7.dummyValue( this, Invocation.method( #base64ToReverseHex, @@ -696,7 +723,7 @@ class MockCachedElectrumXClient extends _i1.Mock ) as String); @override - _i6.Future> getTransaction({ + _i8.Future> getTransaction({ required String? txHash, required _i2.CryptoCurrency? cryptoCurrency, bool? verbose = true, @@ -712,11 +739,11 @@ class MockCachedElectrumXClient extends _i1.Mock }, ), returnValue: - _i6.Future>.value({}), - ) as _i6.Future>); + _i8.Future>.value({}), + ) as _i8.Future>); @override - _i6.Future> getUsedCoinSerials({ + _i8.Future> getUsedCoinSerials({ required _i2.CryptoCurrency? cryptoCurrency, int? startNumber = 0, }) => @@ -729,11 +756,11 @@ class MockCachedElectrumXClient extends _i1.Mock #startNumber: startNumber, }, ), - returnValue: _i6.Future>.value([]), - ) as _i6.Future>); + returnValue: _i8.Future>.value([]), + ) as _i8.Future>); @override - _i6.Future clearSharedTransactionCache( + _i8.Future clearSharedTransactionCache( {required _i2.CryptoCurrency? cryptoCurrency}) => (super.noSuchMethod( Invocation.method( @@ -741,16 +768,16 @@ class MockCachedElectrumXClient extends _i1.Mock [], {#cryptoCurrency: cryptoCurrency}, ), - returnValue: _i6.Future.value(), - returnValueForMissingStub: _i6.Future.value(), - ) as _i6.Future); + returnValue: _i8.Future.value(), + returnValueForMissingStub: _i8.Future.value(), + ) as _i8.Future); } /// A class which mocks [TransactionNotificationTracker]. /// /// See the documentation for Mockito's code generation for more information. class MockTransactionNotificationTracker extends _i1.Mock - implements _i8.TransactionNotificationTracker { + implements _i10.TransactionNotificationTracker { MockTransactionNotificationTracker() { _i1.throwOnMissingStub(this); } @@ -758,7 +785,7 @@ class MockTransactionNotificationTracker extends _i1.Mock @override String get walletId => (super.noSuchMethod( Invocation.getter(#walletId), - returnValue: _i5.dummyValue( + returnValue: _i7.dummyValue( this, Invocation.getter(#walletId), ), @@ -786,14 +813,14 @@ class MockTransactionNotificationTracker extends _i1.Mock ) as bool); @override - _i6.Future addNotifiedPending(String? txid) => (super.noSuchMethod( + _i8.Future addNotifiedPending(String? txid) => (super.noSuchMethod( Invocation.method( #addNotifiedPending, [txid], ), - returnValue: _i6.Future.value(), - returnValueForMissingStub: _i6.Future.value(), - ) as _i6.Future); + returnValue: _i8.Future.value(), + returnValueForMissingStub: _i8.Future.value(), + ) as _i8.Future); @override bool wasNotifiedConfirmed(String? txid) => (super.noSuchMethod( @@ -805,22 +832,22 @@ class MockTransactionNotificationTracker extends _i1.Mock ) as bool); @override - _i6.Future addNotifiedConfirmed(String? txid) => (super.noSuchMethod( + _i8.Future addNotifiedConfirmed(String? txid) => (super.noSuchMethod( Invocation.method( #addNotifiedConfirmed, [txid], ), - returnValue: _i6.Future.value(), - returnValueForMissingStub: _i6.Future.value(), - ) as _i6.Future); + returnValue: _i8.Future.value(), + returnValueForMissingStub: _i8.Future.value(), + ) as _i8.Future); @override - _i6.Future deleteTransaction(String? txid) => (super.noSuchMethod( + _i8.Future deleteTransaction(String? txid) => (super.noSuchMethod( Invocation.method( #deleteTransaction, [txid], ), - returnValue: _i6.Future.value(), - returnValueForMissingStub: _i6.Future.value(), - ) as _i6.Future); + returnValue: _i8.Future.value(), + returnValueForMissingStub: _i8.Future.value(), + ) as _i8.Future); } diff --git a/test/services/coins/bitcoincash/bitcoincash_wallet_test.mocks.dart b/test/services/coins/bitcoincash/bitcoincash_wallet_test.mocks.dart index c6eadd8f6..c853a3f37 100644 --- a/test/services/coins/bitcoincash/bitcoincash_wallet_test.mocks.dart +++ b/test/services/coins/bitcoincash/bitcoincash_wallet_test.mocks.dart @@ -3,15 +3,17 @@ // Do not manually edit this file. // ignore_for_file: no_leading_underscores_for_library_prefixes -import 'dart:async' as _i6; +import 'dart:async' as _i8; -import 'package:decimal/decimal.dart' as _i3; +import 'package:decimal/decimal.dart' as _i4; import 'package:mockito/mockito.dart' as _i1; -import 'package:mockito/src/dummies.dart' as _i5; -import 'package:stackwallet/electrumx_rpc/cached_electrumx_client.dart' as _i7; -import 'package:stackwallet/electrumx_rpc/electrumx_client.dart' as _i4; +import 'package:mockito/src/dummies.dart' as _i7; +import 'package:stackwallet/electrumx_rpc/cached_electrumx_client.dart' as _i9; +import 'package:stackwallet/electrumx_rpc/electrumx_client.dart' as _i5; +import 'package:stackwallet/models/electrumx_response/spark_models.dart' as _i3; import 'package:stackwallet/services/transaction_notification_tracker.dart' - as _i8; + as _i10; +import 'package:stackwallet/utilities/tor_plain_net_option_enum.dart' as _i6; import 'package:stackwallet/wallets/crypto_currency/crypto_currency.dart' as _i2; @@ -49,8 +51,9 @@ class _FakeDuration_1 extends _i1.SmartFake implements Duration { ); } -class _FakeDecimal_2 extends _i1.SmartFake implements _i3.Decimal { - _FakeDecimal_2( +class _FakeSparkAnonymitySetMeta_2 extends _i1.SmartFake + implements _i3.SparkAnonymitySetMeta { + _FakeSparkAnonymitySetMeta_2( Object parent, Invocation parentInvocation, ) : super( @@ -59,9 +62,19 @@ class _FakeDecimal_2 extends _i1.SmartFake implements _i3.Decimal { ); } -class _FakeElectrumXClient_3 extends _i1.SmartFake - implements _i4.ElectrumXClient { - _FakeElectrumXClient_3( +class _FakeDecimal_3 extends _i1.SmartFake implements _i4.Decimal { + _FakeDecimal_3( + Object parent, + Invocation parentInvocation, + ) : super( + parent, + parentInvocation, + ); +} + +class _FakeElectrumXClient_4 extends _i1.SmartFake + implements _i5.ElectrumXClient { + _FakeElectrumXClient_4( Object parent, Invocation parentInvocation, ) : super( @@ -73,7 +86,7 @@ class _FakeElectrumXClient_3 extends _i1.SmartFake /// A class which mocks [ElectrumXClient]. /// /// See the documentation for Mockito's code generation for more information. -class MockElectrumXClient extends _i1.Mock implements _i4.ElectrumXClient { +class MockElectrumXClient extends _i1.Mock implements _i5.ElectrumXClient { MockElectrumXClient() { _i1.throwOnMissingStub(this); } @@ -87,6 +100,12 @@ class MockElectrumXClient extends _i1.Mock implements _i4.ElectrumXClient { ), ) as _i2.CryptoCurrency); + @override + _i6.TorPlainNetworkOption get netType => (super.noSuchMethod( + Invocation.getter(#netType), + returnValue: _i6.TorPlainNetworkOption.tor, + ) as _i6.TorPlainNetworkOption); + @override int get currentFailoverIndex => (super.noSuchMethod( Invocation.getter(#currentFailoverIndex), @@ -115,7 +134,7 @@ class MockElectrumXClient extends _i1.Mock implements _i4.ElectrumXClient { @override String get host => (super.noSuchMethod( Invocation.getter(#host), - returnValue: _i5.dummyValue( + returnValue: _i7.dummyValue( this, Invocation.getter(#host), ), @@ -134,27 +153,27 @@ class MockElectrumXClient extends _i1.Mock implements _i4.ElectrumXClient { ) as bool); @override - _i6.Future closeAdapter() => (super.noSuchMethod( + _i8.Future closeAdapter() => (super.noSuchMethod( Invocation.method( #closeAdapter, [], ), - returnValue: _i6.Future.value(), - returnValueForMissingStub: _i6.Future.value(), - ) as _i6.Future); + returnValue: _i8.Future.value(), + returnValueForMissingStub: _i8.Future.value(), + ) as _i8.Future); @override - _i6.Future checkElectrumAdapter() => (super.noSuchMethod( + _i8.Future checkElectrumAdapter() => (super.noSuchMethod( Invocation.method( #checkElectrumAdapter, [], ), - returnValue: _i6.Future.value(), - returnValueForMissingStub: _i6.Future.value(), - ) as _i6.Future); + returnValue: _i8.Future.value(), + returnValueForMissingStub: _i8.Future.value(), + ) as _i8.Future); @override - _i6.Future request({ + _i8.Future request({ required String? command, List? args = const [], String? requestID, @@ -173,11 +192,11 @@ class MockElectrumXClient extends _i1.Mock implements _i4.ElectrumXClient { #requestTimeout: requestTimeout, }, ), - returnValue: _i6.Future.value(), - ) as _i6.Future); + returnValue: _i8.Future.value(), + ) as _i8.Future); @override - _i6.Future> batchRequest({ + _i8.Future> batchRequest({ required String? command, required List? args, Duration? requestTimeout = const Duration(seconds: 60), @@ -194,11 +213,11 @@ class MockElectrumXClient extends _i1.Mock implements _i4.ElectrumXClient { #retries: retries, }, ), - returnValue: _i6.Future>.value([]), - ) as _i6.Future>); + returnValue: _i8.Future>.value([]), + ) as _i8.Future>); @override - _i6.Future ping({ + _i8.Future ping({ String? requestID, int? retryCount = 1, }) => @@ -211,11 +230,11 @@ class MockElectrumXClient extends _i1.Mock implements _i4.ElectrumXClient { #retryCount: retryCount, }, ), - returnValue: _i6.Future.value(false), - ) as _i6.Future); + returnValue: _i8.Future.value(false), + ) as _i8.Future); @override - _i6.Future> getBlockHeadTip({String? requestID}) => + _i8.Future> getBlockHeadTip({String? requestID}) => (super.noSuchMethod( Invocation.method( #getBlockHeadTip, @@ -223,11 +242,11 @@ class MockElectrumXClient extends _i1.Mock implements _i4.ElectrumXClient { {#requestID: requestID}, ), returnValue: - _i6.Future>.value({}), - ) as _i6.Future>); + _i8.Future>.value({}), + ) as _i8.Future>); @override - _i6.Future> getServerFeatures({String? requestID}) => + _i8.Future> getServerFeatures({String? requestID}) => (super.noSuchMethod( Invocation.method( #getServerFeatures, @@ -235,11 +254,11 @@ class MockElectrumXClient extends _i1.Mock implements _i4.ElectrumXClient { {#requestID: requestID}, ), returnValue: - _i6.Future>.value({}), - ) as _i6.Future>); + _i8.Future>.value({}), + ) as _i8.Future>); @override - _i6.Future broadcastTransaction({ + _i8.Future broadcastTransaction({ required String? rawTx, String? requestID, }) => @@ -252,7 +271,7 @@ class MockElectrumXClient extends _i1.Mock implements _i4.ElectrumXClient { #requestID: requestID, }, ), - returnValue: _i6.Future.value(_i5.dummyValue( + returnValue: _i8.Future.value(_i7.dummyValue( this, Invocation.method( #broadcastTransaction, @@ -263,10 +282,10 @@ class MockElectrumXClient extends _i1.Mock implements _i4.ElectrumXClient { }, ), )), - ) as _i6.Future); + ) as _i8.Future); @override - _i6.Future> getBalance({ + _i8.Future> getBalance({ required String? scripthash, String? requestID, }) => @@ -280,11 +299,11 @@ class MockElectrumXClient extends _i1.Mock implements _i4.ElectrumXClient { }, ), returnValue: - _i6.Future>.value({}), - ) as _i6.Future>); + _i8.Future>.value({}), + ) as _i8.Future>); @override - _i6.Future>> getHistory({ + _i8.Future>> getHistory({ required String? scripthash, String? requestID, }) => @@ -297,12 +316,12 @@ class MockElectrumXClient extends _i1.Mock implements _i4.ElectrumXClient { #requestID: requestID, }, ), - returnValue: _i6.Future>>.value( + returnValue: _i8.Future>>.value( >[]), - ) as _i6.Future>>); + ) as _i8.Future>>); @override - _i6.Future>>> getBatchHistory( + _i8.Future>>> getBatchHistory( {required List? args}) => (super.noSuchMethod( Invocation.method( @@ -310,12 +329,12 @@ class MockElectrumXClient extends _i1.Mock implements _i4.ElectrumXClient { [], {#args: args}, ), - returnValue: _i6.Future>>>.value( + returnValue: _i8.Future>>>.value( >>[]), - ) as _i6.Future>>>); + ) as _i8.Future>>>); @override - _i6.Future>> getUTXOs({ + _i8.Future>> getUTXOs({ required String? scripthash, String? requestID, }) => @@ -328,12 +347,12 @@ class MockElectrumXClient extends _i1.Mock implements _i4.ElectrumXClient { #requestID: requestID, }, ), - returnValue: _i6.Future>>.value( + returnValue: _i8.Future>>.value( >[]), - ) as _i6.Future>>); + ) as _i8.Future>>); @override - _i6.Future>>> getBatchUTXOs( + _i8.Future>>> getBatchUTXOs( {required List? args}) => (super.noSuchMethod( Invocation.method( @@ -341,12 +360,12 @@ class MockElectrumXClient extends _i1.Mock implements _i4.ElectrumXClient { [], {#args: args}, ), - returnValue: _i6.Future>>>.value( + returnValue: _i8.Future>>>.value( >>[]), - ) as _i6.Future>>>); + ) as _i8.Future>>>); @override - _i6.Future> getTransaction({ + _i8.Future> getTransaction({ required String? txHash, bool? verbose = true, String? requestID, @@ -362,11 +381,11 @@ class MockElectrumXClient extends _i1.Mock implements _i4.ElectrumXClient { }, ), returnValue: - _i6.Future>.value({}), - ) as _i6.Future>); + _i8.Future>.value({}), + ) as _i8.Future>); @override - _i6.Future> getLelantusAnonymitySet({ + _i8.Future> getLelantusAnonymitySet({ String? groupId = r'1', String? blockhash = r'', String? requestID, @@ -382,11 +401,11 @@ class MockElectrumXClient extends _i1.Mock implements _i4.ElectrumXClient { }, ), returnValue: - _i6.Future>.value({}), - ) as _i6.Future>); + _i8.Future>.value({}), + ) as _i8.Future>); @override - _i6.Future getLelantusMintData({ + _i8.Future getLelantusMintData({ dynamic mints, String? requestID, }) => @@ -399,11 +418,11 @@ class MockElectrumXClient extends _i1.Mock implements _i4.ElectrumXClient { #requestID: requestID, }, ), - returnValue: _i6.Future.value(), - ) as _i6.Future); + returnValue: _i8.Future.value(), + ) as _i8.Future); @override - _i6.Future> getLelantusUsedCoinSerials({ + _i8.Future> getLelantusUsedCoinSerials({ String? requestID, required int? startNumber, }) => @@ -417,22 +436,22 @@ class MockElectrumXClient extends _i1.Mock implements _i4.ElectrumXClient { }, ), returnValue: - _i6.Future>.value({}), - ) as _i6.Future>); + _i8.Future>.value({}), + ) as _i8.Future>); @override - _i6.Future getLelantusLatestCoinId({String? requestID}) => + _i8.Future getLelantusLatestCoinId({String? requestID}) => (super.noSuchMethod( Invocation.method( #getLelantusLatestCoinId, [], {#requestID: requestID}, ), - returnValue: _i6.Future.value(0), - ) as _i6.Future); + returnValue: _i8.Future.value(0), + ) as _i8.Future); @override - _i6.Future> getSparkAnonymitySet({ + _i8.Future> getSparkAnonymitySet({ String? coinGroupId = r'1', String? startBlockHash = r'', String? requestID, @@ -448,58 +467,33 @@ class MockElectrumXClient extends _i1.Mock implements _i4.ElectrumXClient { }, ), returnValue: - _i6.Future>.value({}), - ) as _i6.Future>); - - @override - _i6.Future>> getSparkMintMetaData({ - String? requestID, - required List? sparkCoinHashes, - }) => - (super.noSuchMethod( - Invocation.method( - #getSparkMintMetaData, - [], - { - #requestID: requestID, - #sparkCoinHashes: sparkCoinHashes, - }, - ), - returnValue: _i6.Future>>.value( - >[]), - ) as _i6.Future>>); + _i8.Future>.value({}), + ) as _i8.Future>); @override - _i6.Future getSparkLatestCoinId({String? requestID}) => + _i8.Future getSparkLatestCoinId({String? requestID}) => (super.noSuchMethod( Invocation.method( #getSparkLatestCoinId, [], {#requestID: requestID}, ), - returnValue: _i6.Future.value(0), - ) as _i6.Future); + returnValue: _i8.Future.value(0), + ) as _i8.Future); @override - _i6.Future> getMempoolTxids({String? requestID}) => + _i8.Future> getMempoolTxids({String? requestID}) => (super.noSuchMethod( Invocation.method( #getMempoolTxids, [], {#requestID: requestID}, ), - returnValue: _i6.Future>.value({}), - ) as _i6.Future>); + returnValue: _i8.Future>.value({}), + ) as _i8.Future>); @override - _i6.Future< - List< - ({ - List coins, - List lTags, - List serialContext, - String txid - })>> getMempoolSparkData({ + _i8.Future> getMempoolSparkData({ String? requestID, required List? txids, }) => @@ -512,30 +506,12 @@ class MockElectrumXClient extends _i1.Mock implements _i4.ElectrumXClient { #txids: txids, }, ), - returnValue: _i6.Future< - List< - ({ - List coins, - List lTags, - List serialContext, - String txid - })>>.value(<({ - List coins, - List lTags, - List serialContext, - String txid - })>[]), - ) as _i6.Future< - List< - ({ - List coins, - List lTags, - List serialContext, - String txid - })>>); - - @override - _i6.Future>> getSparkUnhashedUsedCoinsTagsWithTxHashes({ + returnValue: _i8.Future>.value( + <_i3.SparkMempoolData>[]), + ) as _i8.Future>); + + @override + _i8.Future>> getSparkUnhashedUsedCoinsTagsWithTxHashes({ String? requestID, required int? startNumber, }) => @@ -548,11 +524,62 @@ class MockElectrumXClient extends _i1.Mock implements _i4.ElectrumXClient { #startNumber: startNumber, }, ), - returnValue: _i6.Future>>.value(>[]), - ) as _i6.Future>>); + returnValue: _i8.Future>>.value(>[]), + ) as _i8.Future>>); + + @override + _i8.Future<_i3.SparkAnonymitySetMeta> getSparkAnonymitySetMeta({ + String? requestID, + required int? coinGroupId, + }) => + (super.noSuchMethod( + Invocation.method( + #getSparkAnonymitySetMeta, + [], + { + #requestID: requestID, + #coinGroupId: coinGroupId, + }, + ), + returnValue: _i8.Future<_i3.SparkAnonymitySetMeta>.value( + _FakeSparkAnonymitySetMeta_2( + this, + Invocation.method( + #getSparkAnonymitySetMeta, + [], + { + #requestID: requestID, + #coinGroupId: coinGroupId, + }, + ), + )), + ) as _i8.Future<_i3.SparkAnonymitySetMeta>); + + @override + _i8.Future> getSparkAnonymitySetBySector({ + String? requestID, + required int? coinGroupId, + required String? latestBlock, + required int? startIndex, + required int? endIndex, + }) => + (super.noSuchMethod( + Invocation.method( + #getSparkAnonymitySetBySector, + [], + { + #requestID: requestID, + #coinGroupId: coinGroupId, + #latestBlock: latestBlock, + #startIndex: startIndex, + #endIndex: endIndex, + }, + ), + returnValue: _i8.Future>.value([]), + ) as _i8.Future>); @override - _i6.Future isMasterNodeCollateral({ + _i8.Future isMasterNodeCollateral({ String? requestID, required String? txid, required int? index, @@ -567,11 +594,11 @@ class MockElectrumXClient extends _i1.Mock implements _i4.ElectrumXClient { #index: index, }, ), - returnValue: _i6.Future.value(false), - ) as _i6.Future); + returnValue: _i8.Future.value(false), + ) as _i8.Future); @override - _i6.Future> getFeeRate({String? requestID}) => + _i8.Future> getFeeRate({String? requestID}) => (super.noSuchMethod( Invocation.method( #getFeeRate, @@ -579,11 +606,11 @@ class MockElectrumXClient extends _i1.Mock implements _i4.ElectrumXClient { {#requestID: requestID}, ), returnValue: - _i6.Future>.value({}), - ) as _i6.Future>); + _i8.Future>.value({}), + ) as _i8.Future>); @override - _i6.Future<_i3.Decimal> estimateFee({ + _i8.Future<_i4.Decimal> estimateFee({ String? requestID, required int? blocks, }) => @@ -596,7 +623,7 @@ class MockElectrumXClient extends _i1.Mock implements _i4.ElectrumXClient { #blocks: blocks, }, ), - returnValue: _i6.Future<_i3.Decimal>.value(_FakeDecimal_2( + returnValue: _i8.Future<_i4.Decimal>.value(_FakeDecimal_3( this, Invocation.method( #estimateFee, @@ -607,16 +634,16 @@ class MockElectrumXClient extends _i1.Mock implements _i4.ElectrumXClient { }, ), )), - ) as _i6.Future<_i3.Decimal>); + ) as _i8.Future<_i4.Decimal>); @override - _i6.Future<_i3.Decimal> relayFee({String? requestID}) => (super.noSuchMethod( + _i8.Future<_i4.Decimal> relayFee({String? requestID}) => (super.noSuchMethod( Invocation.method( #relayFee, [], {#requestID: requestID}, ), - returnValue: _i6.Future<_i3.Decimal>.value(_FakeDecimal_2( + returnValue: _i8.Future<_i4.Decimal>.value(_FakeDecimal_3( this, Invocation.method( #relayFee, @@ -624,29 +651,29 @@ class MockElectrumXClient extends _i1.Mock implements _i4.ElectrumXClient { {#requestID: requestID}, ), )), - ) as _i6.Future<_i3.Decimal>); + ) as _i8.Future<_i4.Decimal>); } /// A class which mocks [CachedElectrumXClient]. /// /// See the documentation for Mockito's code generation for more information. class MockCachedElectrumXClient extends _i1.Mock - implements _i7.CachedElectrumXClient { + implements _i9.CachedElectrumXClient { MockCachedElectrumXClient() { _i1.throwOnMissingStub(this); } @override - _i4.ElectrumXClient get electrumXClient => (super.noSuchMethod( + _i5.ElectrumXClient get electrumXClient => (super.noSuchMethod( Invocation.getter(#electrumXClient), - returnValue: _FakeElectrumXClient_3( + returnValue: _FakeElectrumXClient_4( this, Invocation.getter(#electrumXClient), ), - ) as _i4.ElectrumXClient); + ) as _i5.ElectrumXClient); @override - _i6.Future> getAnonymitySet({ + _i8.Future> getAnonymitySet({ required String? groupId, String? blockhash = r'', required _i2.CryptoCurrency? cryptoCurrency, @@ -662,8 +689,8 @@ class MockCachedElectrumXClient extends _i1.Mock }, ), returnValue: - _i6.Future>.value({}), - ) as _i6.Future>); + _i8.Future>.value({}), + ) as _i8.Future>); @override String base64ToHex(String? source) => (super.noSuchMethod( @@ -671,7 +698,7 @@ class MockCachedElectrumXClient extends _i1.Mock #base64ToHex, [source], ), - returnValue: _i5.dummyValue( + returnValue: _i7.dummyValue( this, Invocation.method( #base64ToHex, @@ -686,7 +713,7 @@ class MockCachedElectrumXClient extends _i1.Mock #base64ToReverseHex, [source], ), - returnValue: _i5.dummyValue( + returnValue: _i7.dummyValue( this, Invocation.method( #base64ToReverseHex, @@ -696,7 +723,7 @@ class MockCachedElectrumXClient extends _i1.Mock ) as String); @override - _i6.Future> getTransaction({ + _i8.Future> getTransaction({ required String? txHash, required _i2.CryptoCurrency? cryptoCurrency, bool? verbose = true, @@ -712,11 +739,11 @@ class MockCachedElectrumXClient extends _i1.Mock }, ), returnValue: - _i6.Future>.value({}), - ) as _i6.Future>); + _i8.Future>.value({}), + ) as _i8.Future>); @override - _i6.Future> getUsedCoinSerials({ + _i8.Future> getUsedCoinSerials({ required _i2.CryptoCurrency? cryptoCurrency, int? startNumber = 0, }) => @@ -729,11 +756,11 @@ class MockCachedElectrumXClient extends _i1.Mock #startNumber: startNumber, }, ), - returnValue: _i6.Future>.value([]), - ) as _i6.Future>); + returnValue: _i8.Future>.value([]), + ) as _i8.Future>); @override - _i6.Future clearSharedTransactionCache( + _i8.Future clearSharedTransactionCache( {required _i2.CryptoCurrency? cryptoCurrency}) => (super.noSuchMethod( Invocation.method( @@ -741,16 +768,16 @@ class MockCachedElectrumXClient extends _i1.Mock [], {#cryptoCurrency: cryptoCurrency}, ), - returnValue: _i6.Future.value(), - returnValueForMissingStub: _i6.Future.value(), - ) as _i6.Future); + returnValue: _i8.Future.value(), + returnValueForMissingStub: _i8.Future.value(), + ) as _i8.Future); } /// A class which mocks [TransactionNotificationTracker]. /// /// See the documentation for Mockito's code generation for more information. class MockTransactionNotificationTracker extends _i1.Mock - implements _i8.TransactionNotificationTracker { + implements _i10.TransactionNotificationTracker { MockTransactionNotificationTracker() { _i1.throwOnMissingStub(this); } @@ -758,7 +785,7 @@ class MockTransactionNotificationTracker extends _i1.Mock @override String get walletId => (super.noSuchMethod( Invocation.getter(#walletId), - returnValue: _i5.dummyValue( + returnValue: _i7.dummyValue( this, Invocation.getter(#walletId), ), @@ -786,14 +813,14 @@ class MockTransactionNotificationTracker extends _i1.Mock ) as bool); @override - _i6.Future addNotifiedPending(String? txid) => (super.noSuchMethod( + _i8.Future addNotifiedPending(String? txid) => (super.noSuchMethod( Invocation.method( #addNotifiedPending, [txid], ), - returnValue: _i6.Future.value(), - returnValueForMissingStub: _i6.Future.value(), - ) as _i6.Future); + returnValue: _i8.Future.value(), + returnValueForMissingStub: _i8.Future.value(), + ) as _i8.Future); @override bool wasNotifiedConfirmed(String? txid) => (super.noSuchMethod( @@ -805,22 +832,22 @@ class MockTransactionNotificationTracker extends _i1.Mock ) as bool); @override - _i6.Future addNotifiedConfirmed(String? txid) => (super.noSuchMethod( + _i8.Future addNotifiedConfirmed(String? txid) => (super.noSuchMethod( Invocation.method( #addNotifiedConfirmed, [txid], ), - returnValue: _i6.Future.value(), - returnValueForMissingStub: _i6.Future.value(), - ) as _i6.Future); + returnValue: _i8.Future.value(), + returnValueForMissingStub: _i8.Future.value(), + ) as _i8.Future); @override - _i6.Future deleteTransaction(String? txid) => (super.noSuchMethod( + _i8.Future deleteTransaction(String? txid) => (super.noSuchMethod( Invocation.method( #deleteTransaction, [txid], ), - returnValue: _i6.Future.value(), - returnValueForMissingStub: _i6.Future.value(), - ) as _i6.Future); + returnValue: _i8.Future.value(), + returnValueForMissingStub: _i8.Future.value(), + ) as _i8.Future); } diff --git a/test/services/coins/dogecoin/dogecoin_wallet_test.mocks.dart b/test/services/coins/dogecoin/dogecoin_wallet_test.mocks.dart index 344647a50..08f884b57 100644 --- a/test/services/coins/dogecoin/dogecoin_wallet_test.mocks.dart +++ b/test/services/coins/dogecoin/dogecoin_wallet_test.mocks.dart @@ -3,15 +3,17 @@ // Do not manually edit this file. // ignore_for_file: no_leading_underscores_for_library_prefixes -import 'dart:async' as _i6; +import 'dart:async' as _i8; -import 'package:decimal/decimal.dart' as _i3; +import 'package:decimal/decimal.dart' as _i4; import 'package:mockito/mockito.dart' as _i1; -import 'package:mockito/src/dummies.dart' as _i5; -import 'package:stackwallet/electrumx_rpc/cached_electrumx_client.dart' as _i7; -import 'package:stackwallet/electrumx_rpc/electrumx_client.dart' as _i4; +import 'package:mockito/src/dummies.dart' as _i7; +import 'package:stackwallet/electrumx_rpc/cached_electrumx_client.dart' as _i9; +import 'package:stackwallet/electrumx_rpc/electrumx_client.dart' as _i5; +import 'package:stackwallet/models/electrumx_response/spark_models.dart' as _i3; import 'package:stackwallet/services/transaction_notification_tracker.dart' - as _i8; + as _i10; +import 'package:stackwallet/utilities/tor_plain_net_option_enum.dart' as _i6; import 'package:stackwallet/wallets/crypto_currency/crypto_currency.dart' as _i2; @@ -49,8 +51,9 @@ class _FakeDuration_1 extends _i1.SmartFake implements Duration { ); } -class _FakeDecimal_2 extends _i1.SmartFake implements _i3.Decimal { - _FakeDecimal_2( +class _FakeSparkAnonymitySetMeta_2 extends _i1.SmartFake + implements _i3.SparkAnonymitySetMeta { + _FakeSparkAnonymitySetMeta_2( Object parent, Invocation parentInvocation, ) : super( @@ -59,9 +62,19 @@ class _FakeDecimal_2 extends _i1.SmartFake implements _i3.Decimal { ); } -class _FakeElectrumXClient_3 extends _i1.SmartFake - implements _i4.ElectrumXClient { - _FakeElectrumXClient_3( +class _FakeDecimal_3 extends _i1.SmartFake implements _i4.Decimal { + _FakeDecimal_3( + Object parent, + Invocation parentInvocation, + ) : super( + parent, + parentInvocation, + ); +} + +class _FakeElectrumXClient_4 extends _i1.SmartFake + implements _i5.ElectrumXClient { + _FakeElectrumXClient_4( Object parent, Invocation parentInvocation, ) : super( @@ -73,7 +86,7 @@ class _FakeElectrumXClient_3 extends _i1.SmartFake /// A class which mocks [ElectrumXClient]. /// /// See the documentation for Mockito's code generation for more information. -class MockElectrumXClient extends _i1.Mock implements _i4.ElectrumXClient { +class MockElectrumXClient extends _i1.Mock implements _i5.ElectrumXClient { MockElectrumXClient() { _i1.throwOnMissingStub(this); } @@ -87,6 +100,12 @@ class MockElectrumXClient extends _i1.Mock implements _i4.ElectrumXClient { ), ) as _i2.CryptoCurrency); + @override + _i6.TorPlainNetworkOption get netType => (super.noSuchMethod( + Invocation.getter(#netType), + returnValue: _i6.TorPlainNetworkOption.tor, + ) as _i6.TorPlainNetworkOption); + @override int get currentFailoverIndex => (super.noSuchMethod( Invocation.getter(#currentFailoverIndex), @@ -115,7 +134,7 @@ class MockElectrumXClient extends _i1.Mock implements _i4.ElectrumXClient { @override String get host => (super.noSuchMethod( Invocation.getter(#host), - returnValue: _i5.dummyValue( + returnValue: _i7.dummyValue( this, Invocation.getter(#host), ), @@ -134,27 +153,27 @@ class MockElectrumXClient extends _i1.Mock implements _i4.ElectrumXClient { ) as bool); @override - _i6.Future closeAdapter() => (super.noSuchMethod( + _i8.Future closeAdapter() => (super.noSuchMethod( Invocation.method( #closeAdapter, [], ), - returnValue: _i6.Future.value(), - returnValueForMissingStub: _i6.Future.value(), - ) as _i6.Future); + returnValue: _i8.Future.value(), + returnValueForMissingStub: _i8.Future.value(), + ) as _i8.Future); @override - _i6.Future checkElectrumAdapter() => (super.noSuchMethod( + _i8.Future checkElectrumAdapter() => (super.noSuchMethod( Invocation.method( #checkElectrumAdapter, [], ), - returnValue: _i6.Future.value(), - returnValueForMissingStub: _i6.Future.value(), - ) as _i6.Future); + returnValue: _i8.Future.value(), + returnValueForMissingStub: _i8.Future.value(), + ) as _i8.Future); @override - _i6.Future request({ + _i8.Future request({ required String? command, List? args = const [], String? requestID, @@ -173,11 +192,11 @@ class MockElectrumXClient extends _i1.Mock implements _i4.ElectrumXClient { #requestTimeout: requestTimeout, }, ), - returnValue: _i6.Future.value(), - ) as _i6.Future); + returnValue: _i8.Future.value(), + ) as _i8.Future); @override - _i6.Future> batchRequest({ + _i8.Future> batchRequest({ required String? command, required List? args, Duration? requestTimeout = const Duration(seconds: 60), @@ -194,11 +213,11 @@ class MockElectrumXClient extends _i1.Mock implements _i4.ElectrumXClient { #retries: retries, }, ), - returnValue: _i6.Future>.value([]), - ) as _i6.Future>); + returnValue: _i8.Future>.value([]), + ) as _i8.Future>); @override - _i6.Future ping({ + _i8.Future ping({ String? requestID, int? retryCount = 1, }) => @@ -211,11 +230,11 @@ class MockElectrumXClient extends _i1.Mock implements _i4.ElectrumXClient { #retryCount: retryCount, }, ), - returnValue: _i6.Future.value(false), - ) as _i6.Future); + returnValue: _i8.Future.value(false), + ) as _i8.Future); @override - _i6.Future> getBlockHeadTip({String? requestID}) => + _i8.Future> getBlockHeadTip({String? requestID}) => (super.noSuchMethod( Invocation.method( #getBlockHeadTip, @@ -223,11 +242,11 @@ class MockElectrumXClient extends _i1.Mock implements _i4.ElectrumXClient { {#requestID: requestID}, ), returnValue: - _i6.Future>.value({}), - ) as _i6.Future>); + _i8.Future>.value({}), + ) as _i8.Future>); @override - _i6.Future> getServerFeatures({String? requestID}) => + _i8.Future> getServerFeatures({String? requestID}) => (super.noSuchMethod( Invocation.method( #getServerFeatures, @@ -235,11 +254,11 @@ class MockElectrumXClient extends _i1.Mock implements _i4.ElectrumXClient { {#requestID: requestID}, ), returnValue: - _i6.Future>.value({}), - ) as _i6.Future>); + _i8.Future>.value({}), + ) as _i8.Future>); @override - _i6.Future broadcastTransaction({ + _i8.Future broadcastTransaction({ required String? rawTx, String? requestID, }) => @@ -252,7 +271,7 @@ class MockElectrumXClient extends _i1.Mock implements _i4.ElectrumXClient { #requestID: requestID, }, ), - returnValue: _i6.Future.value(_i5.dummyValue( + returnValue: _i8.Future.value(_i7.dummyValue( this, Invocation.method( #broadcastTransaction, @@ -263,10 +282,10 @@ class MockElectrumXClient extends _i1.Mock implements _i4.ElectrumXClient { }, ), )), - ) as _i6.Future); + ) as _i8.Future); @override - _i6.Future> getBalance({ + _i8.Future> getBalance({ required String? scripthash, String? requestID, }) => @@ -280,11 +299,11 @@ class MockElectrumXClient extends _i1.Mock implements _i4.ElectrumXClient { }, ), returnValue: - _i6.Future>.value({}), - ) as _i6.Future>); + _i8.Future>.value({}), + ) as _i8.Future>); @override - _i6.Future>> getHistory({ + _i8.Future>> getHistory({ required String? scripthash, String? requestID, }) => @@ -297,12 +316,12 @@ class MockElectrumXClient extends _i1.Mock implements _i4.ElectrumXClient { #requestID: requestID, }, ), - returnValue: _i6.Future>>.value( + returnValue: _i8.Future>>.value( >[]), - ) as _i6.Future>>); + ) as _i8.Future>>); @override - _i6.Future>>> getBatchHistory( + _i8.Future>>> getBatchHistory( {required List? args}) => (super.noSuchMethod( Invocation.method( @@ -310,12 +329,12 @@ class MockElectrumXClient extends _i1.Mock implements _i4.ElectrumXClient { [], {#args: args}, ), - returnValue: _i6.Future>>>.value( + returnValue: _i8.Future>>>.value( >>[]), - ) as _i6.Future>>>); + ) as _i8.Future>>>); @override - _i6.Future>> getUTXOs({ + _i8.Future>> getUTXOs({ required String? scripthash, String? requestID, }) => @@ -328,12 +347,12 @@ class MockElectrumXClient extends _i1.Mock implements _i4.ElectrumXClient { #requestID: requestID, }, ), - returnValue: _i6.Future>>.value( + returnValue: _i8.Future>>.value( >[]), - ) as _i6.Future>>); + ) as _i8.Future>>); @override - _i6.Future>>> getBatchUTXOs( + _i8.Future>>> getBatchUTXOs( {required List? args}) => (super.noSuchMethod( Invocation.method( @@ -341,12 +360,12 @@ class MockElectrumXClient extends _i1.Mock implements _i4.ElectrumXClient { [], {#args: args}, ), - returnValue: _i6.Future>>>.value( + returnValue: _i8.Future>>>.value( >>[]), - ) as _i6.Future>>>); + ) as _i8.Future>>>); @override - _i6.Future> getTransaction({ + _i8.Future> getTransaction({ required String? txHash, bool? verbose = true, String? requestID, @@ -362,11 +381,11 @@ class MockElectrumXClient extends _i1.Mock implements _i4.ElectrumXClient { }, ), returnValue: - _i6.Future>.value({}), - ) as _i6.Future>); + _i8.Future>.value({}), + ) as _i8.Future>); @override - _i6.Future> getLelantusAnonymitySet({ + _i8.Future> getLelantusAnonymitySet({ String? groupId = r'1', String? blockhash = r'', String? requestID, @@ -382,11 +401,11 @@ class MockElectrumXClient extends _i1.Mock implements _i4.ElectrumXClient { }, ), returnValue: - _i6.Future>.value({}), - ) as _i6.Future>); + _i8.Future>.value({}), + ) as _i8.Future>); @override - _i6.Future getLelantusMintData({ + _i8.Future getLelantusMintData({ dynamic mints, String? requestID, }) => @@ -399,11 +418,11 @@ class MockElectrumXClient extends _i1.Mock implements _i4.ElectrumXClient { #requestID: requestID, }, ), - returnValue: _i6.Future.value(), - ) as _i6.Future); + returnValue: _i8.Future.value(), + ) as _i8.Future); @override - _i6.Future> getLelantusUsedCoinSerials({ + _i8.Future> getLelantusUsedCoinSerials({ String? requestID, required int? startNumber, }) => @@ -417,22 +436,22 @@ class MockElectrumXClient extends _i1.Mock implements _i4.ElectrumXClient { }, ), returnValue: - _i6.Future>.value({}), - ) as _i6.Future>); + _i8.Future>.value({}), + ) as _i8.Future>); @override - _i6.Future getLelantusLatestCoinId({String? requestID}) => + _i8.Future getLelantusLatestCoinId({String? requestID}) => (super.noSuchMethod( Invocation.method( #getLelantusLatestCoinId, [], {#requestID: requestID}, ), - returnValue: _i6.Future.value(0), - ) as _i6.Future); + returnValue: _i8.Future.value(0), + ) as _i8.Future); @override - _i6.Future> getSparkAnonymitySet({ + _i8.Future> getSparkAnonymitySet({ String? coinGroupId = r'1', String? startBlockHash = r'', String? requestID, @@ -448,58 +467,33 @@ class MockElectrumXClient extends _i1.Mock implements _i4.ElectrumXClient { }, ), returnValue: - _i6.Future>.value({}), - ) as _i6.Future>); - - @override - _i6.Future>> getSparkMintMetaData({ - String? requestID, - required List? sparkCoinHashes, - }) => - (super.noSuchMethod( - Invocation.method( - #getSparkMintMetaData, - [], - { - #requestID: requestID, - #sparkCoinHashes: sparkCoinHashes, - }, - ), - returnValue: _i6.Future>>.value( - >[]), - ) as _i6.Future>>); + _i8.Future>.value({}), + ) as _i8.Future>); @override - _i6.Future getSparkLatestCoinId({String? requestID}) => + _i8.Future getSparkLatestCoinId({String? requestID}) => (super.noSuchMethod( Invocation.method( #getSparkLatestCoinId, [], {#requestID: requestID}, ), - returnValue: _i6.Future.value(0), - ) as _i6.Future); + returnValue: _i8.Future.value(0), + ) as _i8.Future); @override - _i6.Future> getMempoolTxids({String? requestID}) => + _i8.Future> getMempoolTxids({String? requestID}) => (super.noSuchMethod( Invocation.method( #getMempoolTxids, [], {#requestID: requestID}, ), - returnValue: _i6.Future>.value({}), - ) as _i6.Future>); + returnValue: _i8.Future>.value({}), + ) as _i8.Future>); @override - _i6.Future< - List< - ({ - List coins, - List lTags, - List serialContext, - String txid - })>> getMempoolSparkData({ + _i8.Future> getMempoolSparkData({ String? requestID, required List? txids, }) => @@ -512,30 +506,12 @@ class MockElectrumXClient extends _i1.Mock implements _i4.ElectrumXClient { #txids: txids, }, ), - returnValue: _i6.Future< - List< - ({ - List coins, - List lTags, - List serialContext, - String txid - })>>.value(<({ - List coins, - List lTags, - List serialContext, - String txid - })>[]), - ) as _i6.Future< - List< - ({ - List coins, - List lTags, - List serialContext, - String txid - })>>); - - @override - _i6.Future>> getSparkUnhashedUsedCoinsTagsWithTxHashes({ + returnValue: _i8.Future>.value( + <_i3.SparkMempoolData>[]), + ) as _i8.Future>); + + @override + _i8.Future>> getSparkUnhashedUsedCoinsTagsWithTxHashes({ String? requestID, required int? startNumber, }) => @@ -548,11 +524,62 @@ class MockElectrumXClient extends _i1.Mock implements _i4.ElectrumXClient { #startNumber: startNumber, }, ), - returnValue: _i6.Future>>.value(>[]), - ) as _i6.Future>>); + returnValue: _i8.Future>>.value(>[]), + ) as _i8.Future>>); + + @override + _i8.Future<_i3.SparkAnonymitySetMeta> getSparkAnonymitySetMeta({ + String? requestID, + required int? coinGroupId, + }) => + (super.noSuchMethod( + Invocation.method( + #getSparkAnonymitySetMeta, + [], + { + #requestID: requestID, + #coinGroupId: coinGroupId, + }, + ), + returnValue: _i8.Future<_i3.SparkAnonymitySetMeta>.value( + _FakeSparkAnonymitySetMeta_2( + this, + Invocation.method( + #getSparkAnonymitySetMeta, + [], + { + #requestID: requestID, + #coinGroupId: coinGroupId, + }, + ), + )), + ) as _i8.Future<_i3.SparkAnonymitySetMeta>); + + @override + _i8.Future> getSparkAnonymitySetBySector({ + String? requestID, + required int? coinGroupId, + required String? latestBlock, + required int? startIndex, + required int? endIndex, + }) => + (super.noSuchMethod( + Invocation.method( + #getSparkAnonymitySetBySector, + [], + { + #requestID: requestID, + #coinGroupId: coinGroupId, + #latestBlock: latestBlock, + #startIndex: startIndex, + #endIndex: endIndex, + }, + ), + returnValue: _i8.Future>.value([]), + ) as _i8.Future>); @override - _i6.Future isMasterNodeCollateral({ + _i8.Future isMasterNodeCollateral({ String? requestID, required String? txid, required int? index, @@ -567,11 +594,11 @@ class MockElectrumXClient extends _i1.Mock implements _i4.ElectrumXClient { #index: index, }, ), - returnValue: _i6.Future.value(false), - ) as _i6.Future); + returnValue: _i8.Future.value(false), + ) as _i8.Future); @override - _i6.Future> getFeeRate({String? requestID}) => + _i8.Future> getFeeRate({String? requestID}) => (super.noSuchMethod( Invocation.method( #getFeeRate, @@ -579,11 +606,11 @@ class MockElectrumXClient extends _i1.Mock implements _i4.ElectrumXClient { {#requestID: requestID}, ), returnValue: - _i6.Future>.value({}), - ) as _i6.Future>); + _i8.Future>.value({}), + ) as _i8.Future>); @override - _i6.Future<_i3.Decimal> estimateFee({ + _i8.Future<_i4.Decimal> estimateFee({ String? requestID, required int? blocks, }) => @@ -596,7 +623,7 @@ class MockElectrumXClient extends _i1.Mock implements _i4.ElectrumXClient { #blocks: blocks, }, ), - returnValue: _i6.Future<_i3.Decimal>.value(_FakeDecimal_2( + returnValue: _i8.Future<_i4.Decimal>.value(_FakeDecimal_3( this, Invocation.method( #estimateFee, @@ -607,16 +634,16 @@ class MockElectrumXClient extends _i1.Mock implements _i4.ElectrumXClient { }, ), )), - ) as _i6.Future<_i3.Decimal>); + ) as _i8.Future<_i4.Decimal>); @override - _i6.Future<_i3.Decimal> relayFee({String? requestID}) => (super.noSuchMethod( + _i8.Future<_i4.Decimal> relayFee({String? requestID}) => (super.noSuchMethod( Invocation.method( #relayFee, [], {#requestID: requestID}, ), - returnValue: _i6.Future<_i3.Decimal>.value(_FakeDecimal_2( + returnValue: _i8.Future<_i4.Decimal>.value(_FakeDecimal_3( this, Invocation.method( #relayFee, @@ -624,29 +651,29 @@ class MockElectrumXClient extends _i1.Mock implements _i4.ElectrumXClient { {#requestID: requestID}, ), )), - ) as _i6.Future<_i3.Decimal>); + ) as _i8.Future<_i4.Decimal>); } /// A class which mocks [CachedElectrumXClient]. /// /// See the documentation for Mockito's code generation for more information. class MockCachedElectrumXClient extends _i1.Mock - implements _i7.CachedElectrumXClient { + implements _i9.CachedElectrumXClient { MockCachedElectrumXClient() { _i1.throwOnMissingStub(this); } @override - _i4.ElectrumXClient get electrumXClient => (super.noSuchMethod( + _i5.ElectrumXClient get electrumXClient => (super.noSuchMethod( Invocation.getter(#electrumXClient), - returnValue: _FakeElectrumXClient_3( + returnValue: _FakeElectrumXClient_4( this, Invocation.getter(#electrumXClient), ), - ) as _i4.ElectrumXClient); + ) as _i5.ElectrumXClient); @override - _i6.Future> getAnonymitySet({ + _i8.Future> getAnonymitySet({ required String? groupId, String? blockhash = r'', required _i2.CryptoCurrency? cryptoCurrency, @@ -662,8 +689,8 @@ class MockCachedElectrumXClient extends _i1.Mock }, ), returnValue: - _i6.Future>.value({}), - ) as _i6.Future>); + _i8.Future>.value({}), + ) as _i8.Future>); @override String base64ToHex(String? source) => (super.noSuchMethod( @@ -671,7 +698,7 @@ class MockCachedElectrumXClient extends _i1.Mock #base64ToHex, [source], ), - returnValue: _i5.dummyValue( + returnValue: _i7.dummyValue( this, Invocation.method( #base64ToHex, @@ -686,7 +713,7 @@ class MockCachedElectrumXClient extends _i1.Mock #base64ToReverseHex, [source], ), - returnValue: _i5.dummyValue( + returnValue: _i7.dummyValue( this, Invocation.method( #base64ToReverseHex, @@ -696,7 +723,7 @@ class MockCachedElectrumXClient extends _i1.Mock ) as String); @override - _i6.Future> getTransaction({ + _i8.Future> getTransaction({ required String? txHash, required _i2.CryptoCurrency? cryptoCurrency, bool? verbose = true, @@ -712,11 +739,11 @@ class MockCachedElectrumXClient extends _i1.Mock }, ), returnValue: - _i6.Future>.value({}), - ) as _i6.Future>); + _i8.Future>.value({}), + ) as _i8.Future>); @override - _i6.Future> getUsedCoinSerials({ + _i8.Future> getUsedCoinSerials({ required _i2.CryptoCurrency? cryptoCurrency, int? startNumber = 0, }) => @@ -729,11 +756,11 @@ class MockCachedElectrumXClient extends _i1.Mock #startNumber: startNumber, }, ), - returnValue: _i6.Future>.value([]), - ) as _i6.Future>); + returnValue: _i8.Future>.value([]), + ) as _i8.Future>); @override - _i6.Future clearSharedTransactionCache( + _i8.Future clearSharedTransactionCache( {required _i2.CryptoCurrency? cryptoCurrency}) => (super.noSuchMethod( Invocation.method( @@ -741,16 +768,16 @@ class MockCachedElectrumXClient extends _i1.Mock [], {#cryptoCurrency: cryptoCurrency}, ), - returnValue: _i6.Future.value(), - returnValueForMissingStub: _i6.Future.value(), - ) as _i6.Future); + returnValue: _i8.Future.value(), + returnValueForMissingStub: _i8.Future.value(), + ) as _i8.Future); } /// A class which mocks [TransactionNotificationTracker]. /// /// See the documentation for Mockito's code generation for more information. class MockTransactionNotificationTracker extends _i1.Mock - implements _i8.TransactionNotificationTracker { + implements _i10.TransactionNotificationTracker { MockTransactionNotificationTracker() { _i1.throwOnMissingStub(this); } @@ -758,7 +785,7 @@ class MockTransactionNotificationTracker extends _i1.Mock @override String get walletId => (super.noSuchMethod( Invocation.getter(#walletId), - returnValue: _i5.dummyValue( + returnValue: _i7.dummyValue( this, Invocation.getter(#walletId), ), @@ -786,14 +813,14 @@ class MockTransactionNotificationTracker extends _i1.Mock ) as bool); @override - _i6.Future addNotifiedPending(String? txid) => (super.noSuchMethod( + _i8.Future addNotifiedPending(String? txid) => (super.noSuchMethod( Invocation.method( #addNotifiedPending, [txid], ), - returnValue: _i6.Future.value(), - returnValueForMissingStub: _i6.Future.value(), - ) as _i6.Future); + returnValue: _i8.Future.value(), + returnValueForMissingStub: _i8.Future.value(), + ) as _i8.Future); @override bool wasNotifiedConfirmed(String? txid) => (super.noSuchMethod( @@ -805,22 +832,22 @@ class MockTransactionNotificationTracker extends _i1.Mock ) as bool); @override - _i6.Future addNotifiedConfirmed(String? txid) => (super.noSuchMethod( + _i8.Future addNotifiedConfirmed(String? txid) => (super.noSuchMethod( Invocation.method( #addNotifiedConfirmed, [txid], ), - returnValue: _i6.Future.value(), - returnValueForMissingStub: _i6.Future.value(), - ) as _i6.Future); + returnValue: _i8.Future.value(), + returnValueForMissingStub: _i8.Future.value(), + ) as _i8.Future); @override - _i6.Future deleteTransaction(String? txid) => (super.noSuchMethod( + _i8.Future deleteTransaction(String? txid) => (super.noSuchMethod( Invocation.method( #deleteTransaction, [txid], ), - returnValue: _i6.Future.value(), - returnValueForMissingStub: _i6.Future.value(), - ) as _i6.Future); + returnValue: _i8.Future.value(), + returnValueForMissingStub: _i8.Future.value(), + ) as _i8.Future); } diff --git a/test/services/coins/namecoin/namecoin_wallet_test.mocks.dart b/test/services/coins/namecoin/namecoin_wallet_test.mocks.dart index 851a2855c..cd27b6654 100644 --- a/test/services/coins/namecoin/namecoin_wallet_test.mocks.dart +++ b/test/services/coins/namecoin/namecoin_wallet_test.mocks.dart @@ -3,15 +3,17 @@ // Do not manually edit this file. // ignore_for_file: no_leading_underscores_for_library_prefixes -import 'dart:async' as _i6; +import 'dart:async' as _i8; -import 'package:decimal/decimal.dart' as _i3; +import 'package:decimal/decimal.dart' as _i4; import 'package:mockito/mockito.dart' as _i1; -import 'package:mockito/src/dummies.dart' as _i5; -import 'package:stackwallet/electrumx_rpc/cached_electrumx_client.dart' as _i7; -import 'package:stackwallet/electrumx_rpc/electrumx_client.dart' as _i4; +import 'package:mockito/src/dummies.dart' as _i7; +import 'package:stackwallet/electrumx_rpc/cached_electrumx_client.dart' as _i9; +import 'package:stackwallet/electrumx_rpc/electrumx_client.dart' as _i5; +import 'package:stackwallet/models/electrumx_response/spark_models.dart' as _i3; import 'package:stackwallet/services/transaction_notification_tracker.dart' - as _i8; + as _i10; +import 'package:stackwallet/utilities/tor_plain_net_option_enum.dart' as _i6; import 'package:stackwallet/wallets/crypto_currency/crypto_currency.dart' as _i2; @@ -49,8 +51,9 @@ class _FakeDuration_1 extends _i1.SmartFake implements Duration { ); } -class _FakeDecimal_2 extends _i1.SmartFake implements _i3.Decimal { - _FakeDecimal_2( +class _FakeSparkAnonymitySetMeta_2 extends _i1.SmartFake + implements _i3.SparkAnonymitySetMeta { + _FakeSparkAnonymitySetMeta_2( Object parent, Invocation parentInvocation, ) : super( @@ -59,9 +62,19 @@ class _FakeDecimal_2 extends _i1.SmartFake implements _i3.Decimal { ); } -class _FakeElectrumXClient_3 extends _i1.SmartFake - implements _i4.ElectrumXClient { - _FakeElectrumXClient_3( +class _FakeDecimal_3 extends _i1.SmartFake implements _i4.Decimal { + _FakeDecimal_3( + Object parent, + Invocation parentInvocation, + ) : super( + parent, + parentInvocation, + ); +} + +class _FakeElectrumXClient_4 extends _i1.SmartFake + implements _i5.ElectrumXClient { + _FakeElectrumXClient_4( Object parent, Invocation parentInvocation, ) : super( @@ -73,7 +86,7 @@ class _FakeElectrumXClient_3 extends _i1.SmartFake /// A class which mocks [ElectrumXClient]. /// /// See the documentation for Mockito's code generation for more information. -class MockElectrumXClient extends _i1.Mock implements _i4.ElectrumXClient { +class MockElectrumXClient extends _i1.Mock implements _i5.ElectrumXClient { MockElectrumXClient() { _i1.throwOnMissingStub(this); } @@ -87,6 +100,12 @@ class MockElectrumXClient extends _i1.Mock implements _i4.ElectrumXClient { ), ) as _i2.CryptoCurrency); + @override + _i6.TorPlainNetworkOption get netType => (super.noSuchMethod( + Invocation.getter(#netType), + returnValue: _i6.TorPlainNetworkOption.tor, + ) as _i6.TorPlainNetworkOption); + @override int get currentFailoverIndex => (super.noSuchMethod( Invocation.getter(#currentFailoverIndex), @@ -115,7 +134,7 @@ class MockElectrumXClient extends _i1.Mock implements _i4.ElectrumXClient { @override String get host => (super.noSuchMethod( Invocation.getter(#host), - returnValue: _i5.dummyValue( + returnValue: _i7.dummyValue( this, Invocation.getter(#host), ), @@ -134,27 +153,27 @@ class MockElectrumXClient extends _i1.Mock implements _i4.ElectrumXClient { ) as bool); @override - _i6.Future closeAdapter() => (super.noSuchMethod( + _i8.Future closeAdapter() => (super.noSuchMethod( Invocation.method( #closeAdapter, [], ), - returnValue: _i6.Future.value(), - returnValueForMissingStub: _i6.Future.value(), - ) as _i6.Future); + returnValue: _i8.Future.value(), + returnValueForMissingStub: _i8.Future.value(), + ) as _i8.Future); @override - _i6.Future checkElectrumAdapter() => (super.noSuchMethod( + _i8.Future checkElectrumAdapter() => (super.noSuchMethod( Invocation.method( #checkElectrumAdapter, [], ), - returnValue: _i6.Future.value(), - returnValueForMissingStub: _i6.Future.value(), - ) as _i6.Future); + returnValue: _i8.Future.value(), + returnValueForMissingStub: _i8.Future.value(), + ) as _i8.Future); @override - _i6.Future request({ + _i8.Future request({ required String? command, List? args = const [], String? requestID, @@ -173,11 +192,11 @@ class MockElectrumXClient extends _i1.Mock implements _i4.ElectrumXClient { #requestTimeout: requestTimeout, }, ), - returnValue: _i6.Future.value(), - ) as _i6.Future); + returnValue: _i8.Future.value(), + ) as _i8.Future); @override - _i6.Future> batchRequest({ + _i8.Future> batchRequest({ required String? command, required List? args, Duration? requestTimeout = const Duration(seconds: 60), @@ -194,11 +213,11 @@ class MockElectrumXClient extends _i1.Mock implements _i4.ElectrumXClient { #retries: retries, }, ), - returnValue: _i6.Future>.value([]), - ) as _i6.Future>); + returnValue: _i8.Future>.value([]), + ) as _i8.Future>); @override - _i6.Future ping({ + _i8.Future ping({ String? requestID, int? retryCount = 1, }) => @@ -211,11 +230,11 @@ class MockElectrumXClient extends _i1.Mock implements _i4.ElectrumXClient { #retryCount: retryCount, }, ), - returnValue: _i6.Future.value(false), - ) as _i6.Future); + returnValue: _i8.Future.value(false), + ) as _i8.Future); @override - _i6.Future> getBlockHeadTip({String? requestID}) => + _i8.Future> getBlockHeadTip({String? requestID}) => (super.noSuchMethod( Invocation.method( #getBlockHeadTip, @@ -223,11 +242,11 @@ class MockElectrumXClient extends _i1.Mock implements _i4.ElectrumXClient { {#requestID: requestID}, ), returnValue: - _i6.Future>.value({}), - ) as _i6.Future>); + _i8.Future>.value({}), + ) as _i8.Future>); @override - _i6.Future> getServerFeatures({String? requestID}) => + _i8.Future> getServerFeatures({String? requestID}) => (super.noSuchMethod( Invocation.method( #getServerFeatures, @@ -235,11 +254,11 @@ class MockElectrumXClient extends _i1.Mock implements _i4.ElectrumXClient { {#requestID: requestID}, ), returnValue: - _i6.Future>.value({}), - ) as _i6.Future>); + _i8.Future>.value({}), + ) as _i8.Future>); @override - _i6.Future broadcastTransaction({ + _i8.Future broadcastTransaction({ required String? rawTx, String? requestID, }) => @@ -252,7 +271,7 @@ class MockElectrumXClient extends _i1.Mock implements _i4.ElectrumXClient { #requestID: requestID, }, ), - returnValue: _i6.Future.value(_i5.dummyValue( + returnValue: _i8.Future.value(_i7.dummyValue( this, Invocation.method( #broadcastTransaction, @@ -263,10 +282,10 @@ class MockElectrumXClient extends _i1.Mock implements _i4.ElectrumXClient { }, ), )), - ) as _i6.Future); + ) as _i8.Future); @override - _i6.Future> getBalance({ + _i8.Future> getBalance({ required String? scripthash, String? requestID, }) => @@ -280,11 +299,11 @@ class MockElectrumXClient extends _i1.Mock implements _i4.ElectrumXClient { }, ), returnValue: - _i6.Future>.value({}), - ) as _i6.Future>); + _i8.Future>.value({}), + ) as _i8.Future>); @override - _i6.Future>> getHistory({ + _i8.Future>> getHistory({ required String? scripthash, String? requestID, }) => @@ -297,12 +316,12 @@ class MockElectrumXClient extends _i1.Mock implements _i4.ElectrumXClient { #requestID: requestID, }, ), - returnValue: _i6.Future>>.value( + returnValue: _i8.Future>>.value( >[]), - ) as _i6.Future>>); + ) as _i8.Future>>); @override - _i6.Future>>> getBatchHistory( + _i8.Future>>> getBatchHistory( {required List? args}) => (super.noSuchMethod( Invocation.method( @@ -310,12 +329,12 @@ class MockElectrumXClient extends _i1.Mock implements _i4.ElectrumXClient { [], {#args: args}, ), - returnValue: _i6.Future>>>.value( + returnValue: _i8.Future>>>.value( >>[]), - ) as _i6.Future>>>); + ) as _i8.Future>>>); @override - _i6.Future>> getUTXOs({ + _i8.Future>> getUTXOs({ required String? scripthash, String? requestID, }) => @@ -328,12 +347,12 @@ class MockElectrumXClient extends _i1.Mock implements _i4.ElectrumXClient { #requestID: requestID, }, ), - returnValue: _i6.Future>>.value( + returnValue: _i8.Future>>.value( >[]), - ) as _i6.Future>>); + ) as _i8.Future>>); @override - _i6.Future>>> getBatchUTXOs( + _i8.Future>>> getBatchUTXOs( {required List? args}) => (super.noSuchMethod( Invocation.method( @@ -341,12 +360,12 @@ class MockElectrumXClient extends _i1.Mock implements _i4.ElectrumXClient { [], {#args: args}, ), - returnValue: _i6.Future>>>.value( + returnValue: _i8.Future>>>.value( >>[]), - ) as _i6.Future>>>); + ) as _i8.Future>>>); @override - _i6.Future> getTransaction({ + _i8.Future> getTransaction({ required String? txHash, bool? verbose = true, String? requestID, @@ -362,11 +381,11 @@ class MockElectrumXClient extends _i1.Mock implements _i4.ElectrumXClient { }, ), returnValue: - _i6.Future>.value({}), - ) as _i6.Future>); + _i8.Future>.value({}), + ) as _i8.Future>); @override - _i6.Future> getLelantusAnonymitySet({ + _i8.Future> getLelantusAnonymitySet({ String? groupId = r'1', String? blockhash = r'', String? requestID, @@ -382,11 +401,11 @@ class MockElectrumXClient extends _i1.Mock implements _i4.ElectrumXClient { }, ), returnValue: - _i6.Future>.value({}), - ) as _i6.Future>); + _i8.Future>.value({}), + ) as _i8.Future>); @override - _i6.Future getLelantusMintData({ + _i8.Future getLelantusMintData({ dynamic mints, String? requestID, }) => @@ -399,11 +418,11 @@ class MockElectrumXClient extends _i1.Mock implements _i4.ElectrumXClient { #requestID: requestID, }, ), - returnValue: _i6.Future.value(), - ) as _i6.Future); + returnValue: _i8.Future.value(), + ) as _i8.Future); @override - _i6.Future> getLelantusUsedCoinSerials({ + _i8.Future> getLelantusUsedCoinSerials({ String? requestID, required int? startNumber, }) => @@ -417,22 +436,22 @@ class MockElectrumXClient extends _i1.Mock implements _i4.ElectrumXClient { }, ), returnValue: - _i6.Future>.value({}), - ) as _i6.Future>); + _i8.Future>.value({}), + ) as _i8.Future>); @override - _i6.Future getLelantusLatestCoinId({String? requestID}) => + _i8.Future getLelantusLatestCoinId({String? requestID}) => (super.noSuchMethod( Invocation.method( #getLelantusLatestCoinId, [], {#requestID: requestID}, ), - returnValue: _i6.Future.value(0), - ) as _i6.Future); + returnValue: _i8.Future.value(0), + ) as _i8.Future); @override - _i6.Future> getSparkAnonymitySet({ + _i8.Future> getSparkAnonymitySet({ String? coinGroupId = r'1', String? startBlockHash = r'', String? requestID, @@ -448,58 +467,33 @@ class MockElectrumXClient extends _i1.Mock implements _i4.ElectrumXClient { }, ), returnValue: - _i6.Future>.value({}), - ) as _i6.Future>); - - @override - _i6.Future>> getSparkMintMetaData({ - String? requestID, - required List? sparkCoinHashes, - }) => - (super.noSuchMethod( - Invocation.method( - #getSparkMintMetaData, - [], - { - #requestID: requestID, - #sparkCoinHashes: sparkCoinHashes, - }, - ), - returnValue: _i6.Future>>.value( - >[]), - ) as _i6.Future>>); + _i8.Future>.value({}), + ) as _i8.Future>); @override - _i6.Future getSparkLatestCoinId({String? requestID}) => + _i8.Future getSparkLatestCoinId({String? requestID}) => (super.noSuchMethod( Invocation.method( #getSparkLatestCoinId, [], {#requestID: requestID}, ), - returnValue: _i6.Future.value(0), - ) as _i6.Future); + returnValue: _i8.Future.value(0), + ) as _i8.Future); @override - _i6.Future> getMempoolTxids({String? requestID}) => + _i8.Future> getMempoolTxids({String? requestID}) => (super.noSuchMethod( Invocation.method( #getMempoolTxids, [], {#requestID: requestID}, ), - returnValue: _i6.Future>.value({}), - ) as _i6.Future>); + returnValue: _i8.Future>.value({}), + ) as _i8.Future>); @override - _i6.Future< - List< - ({ - List coins, - List lTags, - List serialContext, - String txid - })>> getMempoolSparkData({ + _i8.Future> getMempoolSparkData({ String? requestID, required List? txids, }) => @@ -512,30 +506,12 @@ class MockElectrumXClient extends _i1.Mock implements _i4.ElectrumXClient { #txids: txids, }, ), - returnValue: _i6.Future< - List< - ({ - List coins, - List lTags, - List serialContext, - String txid - })>>.value(<({ - List coins, - List lTags, - List serialContext, - String txid - })>[]), - ) as _i6.Future< - List< - ({ - List coins, - List lTags, - List serialContext, - String txid - })>>); - - @override - _i6.Future>> getSparkUnhashedUsedCoinsTagsWithTxHashes({ + returnValue: _i8.Future>.value( + <_i3.SparkMempoolData>[]), + ) as _i8.Future>); + + @override + _i8.Future>> getSparkUnhashedUsedCoinsTagsWithTxHashes({ String? requestID, required int? startNumber, }) => @@ -548,11 +524,62 @@ class MockElectrumXClient extends _i1.Mock implements _i4.ElectrumXClient { #startNumber: startNumber, }, ), - returnValue: _i6.Future>>.value(>[]), - ) as _i6.Future>>); + returnValue: _i8.Future>>.value(>[]), + ) as _i8.Future>>); + + @override + _i8.Future<_i3.SparkAnonymitySetMeta> getSparkAnonymitySetMeta({ + String? requestID, + required int? coinGroupId, + }) => + (super.noSuchMethod( + Invocation.method( + #getSparkAnonymitySetMeta, + [], + { + #requestID: requestID, + #coinGroupId: coinGroupId, + }, + ), + returnValue: _i8.Future<_i3.SparkAnonymitySetMeta>.value( + _FakeSparkAnonymitySetMeta_2( + this, + Invocation.method( + #getSparkAnonymitySetMeta, + [], + { + #requestID: requestID, + #coinGroupId: coinGroupId, + }, + ), + )), + ) as _i8.Future<_i3.SparkAnonymitySetMeta>); + + @override + _i8.Future> getSparkAnonymitySetBySector({ + String? requestID, + required int? coinGroupId, + required String? latestBlock, + required int? startIndex, + required int? endIndex, + }) => + (super.noSuchMethod( + Invocation.method( + #getSparkAnonymitySetBySector, + [], + { + #requestID: requestID, + #coinGroupId: coinGroupId, + #latestBlock: latestBlock, + #startIndex: startIndex, + #endIndex: endIndex, + }, + ), + returnValue: _i8.Future>.value([]), + ) as _i8.Future>); @override - _i6.Future isMasterNodeCollateral({ + _i8.Future isMasterNodeCollateral({ String? requestID, required String? txid, required int? index, @@ -567,11 +594,11 @@ class MockElectrumXClient extends _i1.Mock implements _i4.ElectrumXClient { #index: index, }, ), - returnValue: _i6.Future.value(false), - ) as _i6.Future); + returnValue: _i8.Future.value(false), + ) as _i8.Future); @override - _i6.Future> getFeeRate({String? requestID}) => + _i8.Future> getFeeRate({String? requestID}) => (super.noSuchMethod( Invocation.method( #getFeeRate, @@ -579,11 +606,11 @@ class MockElectrumXClient extends _i1.Mock implements _i4.ElectrumXClient { {#requestID: requestID}, ), returnValue: - _i6.Future>.value({}), - ) as _i6.Future>); + _i8.Future>.value({}), + ) as _i8.Future>); @override - _i6.Future<_i3.Decimal> estimateFee({ + _i8.Future<_i4.Decimal> estimateFee({ String? requestID, required int? blocks, }) => @@ -596,7 +623,7 @@ class MockElectrumXClient extends _i1.Mock implements _i4.ElectrumXClient { #blocks: blocks, }, ), - returnValue: _i6.Future<_i3.Decimal>.value(_FakeDecimal_2( + returnValue: _i8.Future<_i4.Decimal>.value(_FakeDecimal_3( this, Invocation.method( #estimateFee, @@ -607,16 +634,16 @@ class MockElectrumXClient extends _i1.Mock implements _i4.ElectrumXClient { }, ), )), - ) as _i6.Future<_i3.Decimal>); + ) as _i8.Future<_i4.Decimal>); @override - _i6.Future<_i3.Decimal> relayFee({String? requestID}) => (super.noSuchMethod( + _i8.Future<_i4.Decimal> relayFee({String? requestID}) => (super.noSuchMethod( Invocation.method( #relayFee, [], {#requestID: requestID}, ), - returnValue: _i6.Future<_i3.Decimal>.value(_FakeDecimal_2( + returnValue: _i8.Future<_i4.Decimal>.value(_FakeDecimal_3( this, Invocation.method( #relayFee, @@ -624,29 +651,29 @@ class MockElectrumXClient extends _i1.Mock implements _i4.ElectrumXClient { {#requestID: requestID}, ), )), - ) as _i6.Future<_i3.Decimal>); + ) as _i8.Future<_i4.Decimal>); } /// A class which mocks [CachedElectrumXClient]. /// /// See the documentation for Mockito's code generation for more information. class MockCachedElectrumXClient extends _i1.Mock - implements _i7.CachedElectrumXClient { + implements _i9.CachedElectrumXClient { MockCachedElectrumXClient() { _i1.throwOnMissingStub(this); } @override - _i4.ElectrumXClient get electrumXClient => (super.noSuchMethod( + _i5.ElectrumXClient get electrumXClient => (super.noSuchMethod( Invocation.getter(#electrumXClient), - returnValue: _FakeElectrumXClient_3( + returnValue: _FakeElectrumXClient_4( this, Invocation.getter(#electrumXClient), ), - ) as _i4.ElectrumXClient); + ) as _i5.ElectrumXClient); @override - _i6.Future> getAnonymitySet({ + _i8.Future> getAnonymitySet({ required String? groupId, String? blockhash = r'', required _i2.CryptoCurrency? cryptoCurrency, @@ -662,8 +689,8 @@ class MockCachedElectrumXClient extends _i1.Mock }, ), returnValue: - _i6.Future>.value({}), - ) as _i6.Future>); + _i8.Future>.value({}), + ) as _i8.Future>); @override String base64ToHex(String? source) => (super.noSuchMethod( @@ -671,7 +698,7 @@ class MockCachedElectrumXClient extends _i1.Mock #base64ToHex, [source], ), - returnValue: _i5.dummyValue( + returnValue: _i7.dummyValue( this, Invocation.method( #base64ToHex, @@ -686,7 +713,7 @@ class MockCachedElectrumXClient extends _i1.Mock #base64ToReverseHex, [source], ), - returnValue: _i5.dummyValue( + returnValue: _i7.dummyValue( this, Invocation.method( #base64ToReverseHex, @@ -696,7 +723,7 @@ class MockCachedElectrumXClient extends _i1.Mock ) as String); @override - _i6.Future> getTransaction({ + _i8.Future> getTransaction({ required String? txHash, required _i2.CryptoCurrency? cryptoCurrency, bool? verbose = true, @@ -712,11 +739,11 @@ class MockCachedElectrumXClient extends _i1.Mock }, ), returnValue: - _i6.Future>.value({}), - ) as _i6.Future>); + _i8.Future>.value({}), + ) as _i8.Future>); @override - _i6.Future> getUsedCoinSerials({ + _i8.Future> getUsedCoinSerials({ required _i2.CryptoCurrency? cryptoCurrency, int? startNumber = 0, }) => @@ -729,11 +756,11 @@ class MockCachedElectrumXClient extends _i1.Mock #startNumber: startNumber, }, ), - returnValue: _i6.Future>.value([]), - ) as _i6.Future>); + returnValue: _i8.Future>.value([]), + ) as _i8.Future>); @override - _i6.Future clearSharedTransactionCache( + _i8.Future clearSharedTransactionCache( {required _i2.CryptoCurrency? cryptoCurrency}) => (super.noSuchMethod( Invocation.method( @@ -741,16 +768,16 @@ class MockCachedElectrumXClient extends _i1.Mock [], {#cryptoCurrency: cryptoCurrency}, ), - returnValue: _i6.Future.value(), - returnValueForMissingStub: _i6.Future.value(), - ) as _i6.Future); + returnValue: _i8.Future.value(), + returnValueForMissingStub: _i8.Future.value(), + ) as _i8.Future); } /// A class which mocks [TransactionNotificationTracker]. /// /// See the documentation for Mockito's code generation for more information. class MockTransactionNotificationTracker extends _i1.Mock - implements _i8.TransactionNotificationTracker { + implements _i10.TransactionNotificationTracker { MockTransactionNotificationTracker() { _i1.throwOnMissingStub(this); } @@ -758,7 +785,7 @@ class MockTransactionNotificationTracker extends _i1.Mock @override String get walletId => (super.noSuchMethod( Invocation.getter(#walletId), - returnValue: _i5.dummyValue( + returnValue: _i7.dummyValue( this, Invocation.getter(#walletId), ), @@ -786,14 +813,14 @@ class MockTransactionNotificationTracker extends _i1.Mock ) as bool); @override - _i6.Future addNotifiedPending(String? txid) => (super.noSuchMethod( + _i8.Future addNotifiedPending(String? txid) => (super.noSuchMethod( Invocation.method( #addNotifiedPending, [txid], ), - returnValue: _i6.Future.value(), - returnValueForMissingStub: _i6.Future.value(), - ) as _i6.Future); + returnValue: _i8.Future.value(), + returnValueForMissingStub: _i8.Future.value(), + ) as _i8.Future); @override bool wasNotifiedConfirmed(String? txid) => (super.noSuchMethod( @@ -805,22 +832,22 @@ class MockTransactionNotificationTracker extends _i1.Mock ) as bool); @override - _i6.Future addNotifiedConfirmed(String? txid) => (super.noSuchMethod( + _i8.Future addNotifiedConfirmed(String? txid) => (super.noSuchMethod( Invocation.method( #addNotifiedConfirmed, [txid], ), - returnValue: _i6.Future.value(), - returnValueForMissingStub: _i6.Future.value(), - ) as _i6.Future); + returnValue: _i8.Future.value(), + returnValueForMissingStub: _i8.Future.value(), + ) as _i8.Future); @override - _i6.Future deleteTransaction(String? txid) => (super.noSuchMethod( + _i8.Future deleteTransaction(String? txid) => (super.noSuchMethod( Invocation.method( #deleteTransaction, [txid], ), - returnValue: _i6.Future.value(), - returnValueForMissingStub: _i6.Future.value(), - ) as _i6.Future); + returnValue: _i8.Future.value(), + returnValueForMissingStub: _i8.Future.value(), + ) as _i8.Future); } diff --git a/test/services/coins/particl/particl_wallet_test.mocks.dart b/test/services/coins/particl/particl_wallet_test.mocks.dart index ccd74b4d7..1360bd6db 100644 --- a/test/services/coins/particl/particl_wallet_test.mocks.dart +++ b/test/services/coins/particl/particl_wallet_test.mocks.dart @@ -3,15 +3,17 @@ // Do not manually edit this file. // ignore_for_file: no_leading_underscores_for_library_prefixes -import 'dart:async' as _i6; +import 'dart:async' as _i8; -import 'package:decimal/decimal.dart' as _i3; +import 'package:decimal/decimal.dart' as _i4; import 'package:mockito/mockito.dart' as _i1; -import 'package:mockito/src/dummies.dart' as _i5; -import 'package:stackwallet/electrumx_rpc/cached_electrumx_client.dart' as _i7; -import 'package:stackwallet/electrumx_rpc/electrumx_client.dart' as _i4; +import 'package:mockito/src/dummies.dart' as _i7; +import 'package:stackwallet/electrumx_rpc/cached_electrumx_client.dart' as _i9; +import 'package:stackwallet/electrumx_rpc/electrumx_client.dart' as _i5; +import 'package:stackwallet/models/electrumx_response/spark_models.dart' as _i3; import 'package:stackwallet/services/transaction_notification_tracker.dart' - as _i8; + as _i10; +import 'package:stackwallet/utilities/tor_plain_net_option_enum.dart' as _i6; import 'package:stackwallet/wallets/crypto_currency/crypto_currency.dart' as _i2; @@ -49,8 +51,9 @@ class _FakeDuration_1 extends _i1.SmartFake implements Duration { ); } -class _FakeDecimal_2 extends _i1.SmartFake implements _i3.Decimal { - _FakeDecimal_2( +class _FakeSparkAnonymitySetMeta_2 extends _i1.SmartFake + implements _i3.SparkAnonymitySetMeta { + _FakeSparkAnonymitySetMeta_2( Object parent, Invocation parentInvocation, ) : super( @@ -59,9 +62,19 @@ class _FakeDecimal_2 extends _i1.SmartFake implements _i3.Decimal { ); } -class _FakeElectrumXClient_3 extends _i1.SmartFake - implements _i4.ElectrumXClient { - _FakeElectrumXClient_3( +class _FakeDecimal_3 extends _i1.SmartFake implements _i4.Decimal { + _FakeDecimal_3( + Object parent, + Invocation parentInvocation, + ) : super( + parent, + parentInvocation, + ); +} + +class _FakeElectrumXClient_4 extends _i1.SmartFake + implements _i5.ElectrumXClient { + _FakeElectrumXClient_4( Object parent, Invocation parentInvocation, ) : super( @@ -73,7 +86,7 @@ class _FakeElectrumXClient_3 extends _i1.SmartFake /// A class which mocks [ElectrumXClient]. /// /// See the documentation for Mockito's code generation for more information. -class MockElectrumXClient extends _i1.Mock implements _i4.ElectrumXClient { +class MockElectrumXClient extends _i1.Mock implements _i5.ElectrumXClient { MockElectrumXClient() { _i1.throwOnMissingStub(this); } @@ -87,6 +100,12 @@ class MockElectrumXClient extends _i1.Mock implements _i4.ElectrumXClient { ), ) as _i2.CryptoCurrency); + @override + _i6.TorPlainNetworkOption get netType => (super.noSuchMethod( + Invocation.getter(#netType), + returnValue: _i6.TorPlainNetworkOption.tor, + ) as _i6.TorPlainNetworkOption); + @override int get currentFailoverIndex => (super.noSuchMethod( Invocation.getter(#currentFailoverIndex), @@ -115,7 +134,7 @@ class MockElectrumXClient extends _i1.Mock implements _i4.ElectrumXClient { @override String get host => (super.noSuchMethod( Invocation.getter(#host), - returnValue: _i5.dummyValue( + returnValue: _i7.dummyValue( this, Invocation.getter(#host), ), @@ -134,27 +153,27 @@ class MockElectrumXClient extends _i1.Mock implements _i4.ElectrumXClient { ) as bool); @override - _i6.Future closeAdapter() => (super.noSuchMethod( + _i8.Future closeAdapter() => (super.noSuchMethod( Invocation.method( #closeAdapter, [], ), - returnValue: _i6.Future.value(), - returnValueForMissingStub: _i6.Future.value(), - ) as _i6.Future); + returnValue: _i8.Future.value(), + returnValueForMissingStub: _i8.Future.value(), + ) as _i8.Future); @override - _i6.Future checkElectrumAdapter() => (super.noSuchMethod( + _i8.Future checkElectrumAdapter() => (super.noSuchMethod( Invocation.method( #checkElectrumAdapter, [], ), - returnValue: _i6.Future.value(), - returnValueForMissingStub: _i6.Future.value(), - ) as _i6.Future); + returnValue: _i8.Future.value(), + returnValueForMissingStub: _i8.Future.value(), + ) as _i8.Future); @override - _i6.Future request({ + _i8.Future request({ required String? command, List? args = const [], String? requestID, @@ -173,11 +192,11 @@ class MockElectrumXClient extends _i1.Mock implements _i4.ElectrumXClient { #requestTimeout: requestTimeout, }, ), - returnValue: _i6.Future.value(), - ) as _i6.Future); + returnValue: _i8.Future.value(), + ) as _i8.Future); @override - _i6.Future> batchRequest({ + _i8.Future> batchRequest({ required String? command, required List? args, Duration? requestTimeout = const Duration(seconds: 60), @@ -194,11 +213,11 @@ class MockElectrumXClient extends _i1.Mock implements _i4.ElectrumXClient { #retries: retries, }, ), - returnValue: _i6.Future>.value([]), - ) as _i6.Future>); + returnValue: _i8.Future>.value([]), + ) as _i8.Future>); @override - _i6.Future ping({ + _i8.Future ping({ String? requestID, int? retryCount = 1, }) => @@ -211,11 +230,11 @@ class MockElectrumXClient extends _i1.Mock implements _i4.ElectrumXClient { #retryCount: retryCount, }, ), - returnValue: _i6.Future.value(false), - ) as _i6.Future); + returnValue: _i8.Future.value(false), + ) as _i8.Future); @override - _i6.Future> getBlockHeadTip({String? requestID}) => + _i8.Future> getBlockHeadTip({String? requestID}) => (super.noSuchMethod( Invocation.method( #getBlockHeadTip, @@ -223,11 +242,11 @@ class MockElectrumXClient extends _i1.Mock implements _i4.ElectrumXClient { {#requestID: requestID}, ), returnValue: - _i6.Future>.value({}), - ) as _i6.Future>); + _i8.Future>.value({}), + ) as _i8.Future>); @override - _i6.Future> getServerFeatures({String? requestID}) => + _i8.Future> getServerFeatures({String? requestID}) => (super.noSuchMethod( Invocation.method( #getServerFeatures, @@ -235,11 +254,11 @@ class MockElectrumXClient extends _i1.Mock implements _i4.ElectrumXClient { {#requestID: requestID}, ), returnValue: - _i6.Future>.value({}), - ) as _i6.Future>); + _i8.Future>.value({}), + ) as _i8.Future>); @override - _i6.Future broadcastTransaction({ + _i8.Future broadcastTransaction({ required String? rawTx, String? requestID, }) => @@ -252,7 +271,7 @@ class MockElectrumXClient extends _i1.Mock implements _i4.ElectrumXClient { #requestID: requestID, }, ), - returnValue: _i6.Future.value(_i5.dummyValue( + returnValue: _i8.Future.value(_i7.dummyValue( this, Invocation.method( #broadcastTransaction, @@ -263,10 +282,10 @@ class MockElectrumXClient extends _i1.Mock implements _i4.ElectrumXClient { }, ), )), - ) as _i6.Future); + ) as _i8.Future); @override - _i6.Future> getBalance({ + _i8.Future> getBalance({ required String? scripthash, String? requestID, }) => @@ -280,11 +299,11 @@ class MockElectrumXClient extends _i1.Mock implements _i4.ElectrumXClient { }, ), returnValue: - _i6.Future>.value({}), - ) as _i6.Future>); + _i8.Future>.value({}), + ) as _i8.Future>); @override - _i6.Future>> getHistory({ + _i8.Future>> getHistory({ required String? scripthash, String? requestID, }) => @@ -297,12 +316,12 @@ class MockElectrumXClient extends _i1.Mock implements _i4.ElectrumXClient { #requestID: requestID, }, ), - returnValue: _i6.Future>>.value( + returnValue: _i8.Future>>.value( >[]), - ) as _i6.Future>>); + ) as _i8.Future>>); @override - _i6.Future>>> getBatchHistory( + _i8.Future>>> getBatchHistory( {required List? args}) => (super.noSuchMethod( Invocation.method( @@ -310,12 +329,12 @@ class MockElectrumXClient extends _i1.Mock implements _i4.ElectrumXClient { [], {#args: args}, ), - returnValue: _i6.Future>>>.value( + returnValue: _i8.Future>>>.value( >>[]), - ) as _i6.Future>>>); + ) as _i8.Future>>>); @override - _i6.Future>> getUTXOs({ + _i8.Future>> getUTXOs({ required String? scripthash, String? requestID, }) => @@ -328,12 +347,12 @@ class MockElectrumXClient extends _i1.Mock implements _i4.ElectrumXClient { #requestID: requestID, }, ), - returnValue: _i6.Future>>.value( + returnValue: _i8.Future>>.value( >[]), - ) as _i6.Future>>); + ) as _i8.Future>>); @override - _i6.Future>>> getBatchUTXOs( + _i8.Future>>> getBatchUTXOs( {required List? args}) => (super.noSuchMethod( Invocation.method( @@ -341,12 +360,12 @@ class MockElectrumXClient extends _i1.Mock implements _i4.ElectrumXClient { [], {#args: args}, ), - returnValue: _i6.Future>>>.value( + returnValue: _i8.Future>>>.value( >>[]), - ) as _i6.Future>>>); + ) as _i8.Future>>>); @override - _i6.Future> getTransaction({ + _i8.Future> getTransaction({ required String? txHash, bool? verbose = true, String? requestID, @@ -362,11 +381,11 @@ class MockElectrumXClient extends _i1.Mock implements _i4.ElectrumXClient { }, ), returnValue: - _i6.Future>.value({}), - ) as _i6.Future>); + _i8.Future>.value({}), + ) as _i8.Future>); @override - _i6.Future> getLelantusAnonymitySet({ + _i8.Future> getLelantusAnonymitySet({ String? groupId = r'1', String? blockhash = r'', String? requestID, @@ -382,11 +401,11 @@ class MockElectrumXClient extends _i1.Mock implements _i4.ElectrumXClient { }, ), returnValue: - _i6.Future>.value({}), - ) as _i6.Future>); + _i8.Future>.value({}), + ) as _i8.Future>); @override - _i6.Future getLelantusMintData({ + _i8.Future getLelantusMintData({ dynamic mints, String? requestID, }) => @@ -399,11 +418,11 @@ class MockElectrumXClient extends _i1.Mock implements _i4.ElectrumXClient { #requestID: requestID, }, ), - returnValue: _i6.Future.value(), - ) as _i6.Future); + returnValue: _i8.Future.value(), + ) as _i8.Future); @override - _i6.Future> getLelantusUsedCoinSerials({ + _i8.Future> getLelantusUsedCoinSerials({ String? requestID, required int? startNumber, }) => @@ -417,22 +436,22 @@ class MockElectrumXClient extends _i1.Mock implements _i4.ElectrumXClient { }, ), returnValue: - _i6.Future>.value({}), - ) as _i6.Future>); + _i8.Future>.value({}), + ) as _i8.Future>); @override - _i6.Future getLelantusLatestCoinId({String? requestID}) => + _i8.Future getLelantusLatestCoinId({String? requestID}) => (super.noSuchMethod( Invocation.method( #getLelantusLatestCoinId, [], {#requestID: requestID}, ), - returnValue: _i6.Future.value(0), - ) as _i6.Future); + returnValue: _i8.Future.value(0), + ) as _i8.Future); @override - _i6.Future> getSparkAnonymitySet({ + _i8.Future> getSparkAnonymitySet({ String? coinGroupId = r'1', String? startBlockHash = r'', String? requestID, @@ -448,58 +467,33 @@ class MockElectrumXClient extends _i1.Mock implements _i4.ElectrumXClient { }, ), returnValue: - _i6.Future>.value({}), - ) as _i6.Future>); - - @override - _i6.Future>> getSparkMintMetaData({ - String? requestID, - required List? sparkCoinHashes, - }) => - (super.noSuchMethod( - Invocation.method( - #getSparkMintMetaData, - [], - { - #requestID: requestID, - #sparkCoinHashes: sparkCoinHashes, - }, - ), - returnValue: _i6.Future>>.value( - >[]), - ) as _i6.Future>>); + _i8.Future>.value({}), + ) as _i8.Future>); @override - _i6.Future getSparkLatestCoinId({String? requestID}) => + _i8.Future getSparkLatestCoinId({String? requestID}) => (super.noSuchMethod( Invocation.method( #getSparkLatestCoinId, [], {#requestID: requestID}, ), - returnValue: _i6.Future.value(0), - ) as _i6.Future); + returnValue: _i8.Future.value(0), + ) as _i8.Future); @override - _i6.Future> getMempoolTxids({String? requestID}) => + _i8.Future> getMempoolTxids({String? requestID}) => (super.noSuchMethod( Invocation.method( #getMempoolTxids, [], {#requestID: requestID}, ), - returnValue: _i6.Future>.value({}), - ) as _i6.Future>); + returnValue: _i8.Future>.value({}), + ) as _i8.Future>); @override - _i6.Future< - List< - ({ - List coins, - List lTags, - List serialContext, - String txid - })>> getMempoolSparkData({ + _i8.Future> getMempoolSparkData({ String? requestID, required List? txids, }) => @@ -512,30 +506,12 @@ class MockElectrumXClient extends _i1.Mock implements _i4.ElectrumXClient { #txids: txids, }, ), - returnValue: _i6.Future< - List< - ({ - List coins, - List lTags, - List serialContext, - String txid - })>>.value(<({ - List coins, - List lTags, - List serialContext, - String txid - })>[]), - ) as _i6.Future< - List< - ({ - List coins, - List lTags, - List serialContext, - String txid - })>>); - - @override - _i6.Future>> getSparkUnhashedUsedCoinsTagsWithTxHashes({ + returnValue: _i8.Future>.value( + <_i3.SparkMempoolData>[]), + ) as _i8.Future>); + + @override + _i8.Future>> getSparkUnhashedUsedCoinsTagsWithTxHashes({ String? requestID, required int? startNumber, }) => @@ -548,11 +524,62 @@ class MockElectrumXClient extends _i1.Mock implements _i4.ElectrumXClient { #startNumber: startNumber, }, ), - returnValue: _i6.Future>>.value(>[]), - ) as _i6.Future>>); + returnValue: _i8.Future>>.value(>[]), + ) as _i8.Future>>); + + @override + _i8.Future<_i3.SparkAnonymitySetMeta> getSparkAnonymitySetMeta({ + String? requestID, + required int? coinGroupId, + }) => + (super.noSuchMethod( + Invocation.method( + #getSparkAnonymitySetMeta, + [], + { + #requestID: requestID, + #coinGroupId: coinGroupId, + }, + ), + returnValue: _i8.Future<_i3.SparkAnonymitySetMeta>.value( + _FakeSparkAnonymitySetMeta_2( + this, + Invocation.method( + #getSparkAnonymitySetMeta, + [], + { + #requestID: requestID, + #coinGroupId: coinGroupId, + }, + ), + )), + ) as _i8.Future<_i3.SparkAnonymitySetMeta>); + + @override + _i8.Future> getSparkAnonymitySetBySector({ + String? requestID, + required int? coinGroupId, + required String? latestBlock, + required int? startIndex, + required int? endIndex, + }) => + (super.noSuchMethod( + Invocation.method( + #getSparkAnonymitySetBySector, + [], + { + #requestID: requestID, + #coinGroupId: coinGroupId, + #latestBlock: latestBlock, + #startIndex: startIndex, + #endIndex: endIndex, + }, + ), + returnValue: _i8.Future>.value([]), + ) as _i8.Future>); @override - _i6.Future isMasterNodeCollateral({ + _i8.Future isMasterNodeCollateral({ String? requestID, required String? txid, required int? index, @@ -567,11 +594,11 @@ class MockElectrumXClient extends _i1.Mock implements _i4.ElectrumXClient { #index: index, }, ), - returnValue: _i6.Future.value(false), - ) as _i6.Future); + returnValue: _i8.Future.value(false), + ) as _i8.Future); @override - _i6.Future> getFeeRate({String? requestID}) => + _i8.Future> getFeeRate({String? requestID}) => (super.noSuchMethod( Invocation.method( #getFeeRate, @@ -579,11 +606,11 @@ class MockElectrumXClient extends _i1.Mock implements _i4.ElectrumXClient { {#requestID: requestID}, ), returnValue: - _i6.Future>.value({}), - ) as _i6.Future>); + _i8.Future>.value({}), + ) as _i8.Future>); @override - _i6.Future<_i3.Decimal> estimateFee({ + _i8.Future<_i4.Decimal> estimateFee({ String? requestID, required int? blocks, }) => @@ -596,7 +623,7 @@ class MockElectrumXClient extends _i1.Mock implements _i4.ElectrumXClient { #blocks: blocks, }, ), - returnValue: _i6.Future<_i3.Decimal>.value(_FakeDecimal_2( + returnValue: _i8.Future<_i4.Decimal>.value(_FakeDecimal_3( this, Invocation.method( #estimateFee, @@ -607,16 +634,16 @@ class MockElectrumXClient extends _i1.Mock implements _i4.ElectrumXClient { }, ), )), - ) as _i6.Future<_i3.Decimal>); + ) as _i8.Future<_i4.Decimal>); @override - _i6.Future<_i3.Decimal> relayFee({String? requestID}) => (super.noSuchMethod( + _i8.Future<_i4.Decimal> relayFee({String? requestID}) => (super.noSuchMethod( Invocation.method( #relayFee, [], {#requestID: requestID}, ), - returnValue: _i6.Future<_i3.Decimal>.value(_FakeDecimal_2( + returnValue: _i8.Future<_i4.Decimal>.value(_FakeDecimal_3( this, Invocation.method( #relayFee, @@ -624,29 +651,29 @@ class MockElectrumXClient extends _i1.Mock implements _i4.ElectrumXClient { {#requestID: requestID}, ), )), - ) as _i6.Future<_i3.Decimal>); + ) as _i8.Future<_i4.Decimal>); } /// A class which mocks [CachedElectrumXClient]. /// /// See the documentation for Mockito's code generation for more information. class MockCachedElectrumXClient extends _i1.Mock - implements _i7.CachedElectrumXClient { + implements _i9.CachedElectrumXClient { MockCachedElectrumXClient() { _i1.throwOnMissingStub(this); } @override - _i4.ElectrumXClient get electrumXClient => (super.noSuchMethod( + _i5.ElectrumXClient get electrumXClient => (super.noSuchMethod( Invocation.getter(#electrumXClient), - returnValue: _FakeElectrumXClient_3( + returnValue: _FakeElectrumXClient_4( this, Invocation.getter(#electrumXClient), ), - ) as _i4.ElectrumXClient); + ) as _i5.ElectrumXClient); @override - _i6.Future> getAnonymitySet({ + _i8.Future> getAnonymitySet({ required String? groupId, String? blockhash = r'', required _i2.CryptoCurrency? cryptoCurrency, @@ -662,8 +689,8 @@ class MockCachedElectrumXClient extends _i1.Mock }, ), returnValue: - _i6.Future>.value({}), - ) as _i6.Future>); + _i8.Future>.value({}), + ) as _i8.Future>); @override String base64ToHex(String? source) => (super.noSuchMethod( @@ -671,7 +698,7 @@ class MockCachedElectrumXClient extends _i1.Mock #base64ToHex, [source], ), - returnValue: _i5.dummyValue( + returnValue: _i7.dummyValue( this, Invocation.method( #base64ToHex, @@ -686,7 +713,7 @@ class MockCachedElectrumXClient extends _i1.Mock #base64ToReverseHex, [source], ), - returnValue: _i5.dummyValue( + returnValue: _i7.dummyValue( this, Invocation.method( #base64ToReverseHex, @@ -696,7 +723,7 @@ class MockCachedElectrumXClient extends _i1.Mock ) as String); @override - _i6.Future> getTransaction({ + _i8.Future> getTransaction({ required String? txHash, required _i2.CryptoCurrency? cryptoCurrency, bool? verbose = true, @@ -712,11 +739,11 @@ class MockCachedElectrumXClient extends _i1.Mock }, ), returnValue: - _i6.Future>.value({}), - ) as _i6.Future>); + _i8.Future>.value({}), + ) as _i8.Future>); @override - _i6.Future> getUsedCoinSerials({ + _i8.Future> getUsedCoinSerials({ required _i2.CryptoCurrency? cryptoCurrency, int? startNumber = 0, }) => @@ -729,11 +756,11 @@ class MockCachedElectrumXClient extends _i1.Mock #startNumber: startNumber, }, ), - returnValue: _i6.Future>.value([]), - ) as _i6.Future>); + returnValue: _i8.Future>.value([]), + ) as _i8.Future>); @override - _i6.Future clearSharedTransactionCache( + _i8.Future clearSharedTransactionCache( {required _i2.CryptoCurrency? cryptoCurrency}) => (super.noSuchMethod( Invocation.method( @@ -741,16 +768,16 @@ class MockCachedElectrumXClient extends _i1.Mock [], {#cryptoCurrency: cryptoCurrency}, ), - returnValue: _i6.Future.value(), - returnValueForMissingStub: _i6.Future.value(), - ) as _i6.Future); + returnValue: _i8.Future.value(), + returnValueForMissingStub: _i8.Future.value(), + ) as _i8.Future); } /// A class which mocks [TransactionNotificationTracker]. /// /// See the documentation for Mockito's code generation for more information. class MockTransactionNotificationTracker extends _i1.Mock - implements _i8.TransactionNotificationTracker { + implements _i10.TransactionNotificationTracker { MockTransactionNotificationTracker() { _i1.throwOnMissingStub(this); } @@ -758,7 +785,7 @@ class MockTransactionNotificationTracker extends _i1.Mock @override String get walletId => (super.noSuchMethod( Invocation.getter(#walletId), - returnValue: _i5.dummyValue( + returnValue: _i7.dummyValue( this, Invocation.getter(#walletId), ), @@ -786,14 +813,14 @@ class MockTransactionNotificationTracker extends _i1.Mock ) as bool); @override - _i6.Future addNotifiedPending(String? txid) => (super.noSuchMethod( + _i8.Future addNotifiedPending(String? txid) => (super.noSuchMethod( Invocation.method( #addNotifiedPending, [txid], ), - returnValue: _i6.Future.value(), - returnValueForMissingStub: _i6.Future.value(), - ) as _i6.Future); + returnValue: _i8.Future.value(), + returnValueForMissingStub: _i8.Future.value(), + ) as _i8.Future); @override bool wasNotifiedConfirmed(String? txid) => (super.noSuchMethod( @@ -805,22 +832,22 @@ class MockTransactionNotificationTracker extends _i1.Mock ) as bool); @override - _i6.Future addNotifiedConfirmed(String? txid) => (super.noSuchMethod( + _i8.Future addNotifiedConfirmed(String? txid) => (super.noSuchMethod( Invocation.method( #addNotifiedConfirmed, [txid], ), - returnValue: _i6.Future.value(), - returnValueForMissingStub: _i6.Future.value(), - ) as _i6.Future); + returnValue: _i8.Future.value(), + returnValueForMissingStub: _i8.Future.value(), + ) as _i8.Future); @override - _i6.Future deleteTransaction(String? txid) => (super.noSuchMethod( + _i8.Future deleteTransaction(String? txid) => (super.noSuchMethod( Invocation.method( #deleteTransaction, [txid], ), - returnValue: _i6.Future.value(), - returnValueForMissingStub: _i6.Future.value(), - ) as _i6.Future); + returnValue: _i8.Future.value(), + returnValueForMissingStub: _i8.Future.value(), + ) as _i8.Future); } From 4fc2a7acfa931ae40c5a883c36e6d61d82993327 Mon Sep 17 00:00:00 2001 From: julian Date: Tue, 17 Dec 2024 19:23:56 -0600 Subject: [PATCH 036/193] fix: optional cast error --- .../wallet_network_settings_view.dart | 10 ++++++---- lib/wallets/wallet/wallet.dart | 4 +++- 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/lib/pages/settings_views/wallet_settings_view/wallet_network_settings_view/wallet_network_settings_view.dart b/lib/pages/settings_views/wallet_settings_view/wallet_network_settings_view/wallet_network_settings_view.dart index f8eb344a8..5b3a2eb07 100644 --- a/lib/pages/settings_views/wallet_settings_view/wallet_network_settings_view/wallet_network_settings_view.dart +++ b/lib/pages/settings_views/wallet_settings_view/wallet_network_settings_view/wallet_network_settings_view.dart @@ -234,10 +234,12 @@ class _WalletNetworkSettingsViewState _percent = 1; _blocksRemaining = 0; } else { - _percent = - (ref.read(pWallets).getWallet(widget.walletId) as ElectrumXInterface?) - ?.refreshingPercent ?? - 0; + final wallet = ref.read(pWallets).getWallet(widget.walletId); + if (wallet is ElectrumXInterface) { + _percent = wallet.refreshingPercent ?? 0; + } else { + _percent = 0; + } _blocksRemaining = -1; } diff --git a/lib/wallets/wallet/wallet.dart b/lib/wallets/wallet/wallet.dart index b0516b74e..4445ba7a9 100644 --- a/lib/wallets/wallet/wallet.dart +++ b/lib/wallets/wallet/wallet.dart @@ -565,7 +565,9 @@ abstract class Wallet { } void _fireRefreshPercentChange(double percent) { - (this as ElectrumXInterface?)?.refreshingPercent = percent; + if (this is ElectrumXInterface) { + (this as ElectrumXInterface?)?.refreshingPercent = percent; + } GlobalEventBus.instance.fire(RefreshPercentChangedEvent(percent, walletId)); } From d64c344fd002ced3fb7dce0ff2417e4fbf2f4205 Mon Sep 17 00:00:00 2001 From: Louis-Marie Baer Date: Tue, 24 Dec 2024 17:00:19 +0100 Subject: [PATCH 037/193] feat: handle test monero node authentication --- .../test_monero_node_connection.dart | 113 +++++++++--------- lib/utilities/test_node_connection.dart | 6 + scripts/app_config/templates/pubspec.template | 5 + 3 files changed, 70 insertions(+), 54 deletions(-) diff --git a/lib/utilities/test_monero_node_connection.dart b/lib/utilities/test_monero_node_connection.dart index aef26ba9a..8901d4d2e 100644 --- a/lib/utilities/test_monero_node_connection.dart +++ b/lib/utilities/test_monero_node_connection.dart @@ -12,6 +12,9 @@ import 'dart:convert'; import 'dart:io'; import 'package:flutter/material.dart'; +import 'package:http/io_client.dart'; +import 'package:monero_rpc/monero_rpc.dart'; +import 'package:digest_auth/digest_auth.dart'; import 'package:socks5_proxy/socks.dart'; import 'package:tor_ffi_plugin/socks_socket.dart'; @@ -27,11 +30,18 @@ class MoneroNodeConnectionResponse { final int? port; final bool success; - MoneroNodeConnectionResponse(this.cert, this.url, this.port, this.success); + MoneroNodeConnectionResponse( + this.cert, + this.url, + this.port, + this.success, + ); } Future testMoneroNodeConnection( Uri uri, + String? username, + String? password, bool allowBadX509Certificate, { required ({ InternetAddress host, @@ -59,36 +69,37 @@ Future testMoneroNodeConnection( await socket.connect(); await socket.connectTo(uri.host, uri.port); - final body = jsonEncode({ - "jsonrpc": "2.0", - "id": "0", - "method": "get_info", - }); - - final request = 'POST /json_rpc HTTP/1.1\r\n' - 'Host: ${uri.host}\r\n' - 'Content-Type: application/json\r\n' - 'Content-Length: ${body.length}\r\n' - '\r\n' - '$body'; - - socket.write(request); - print("Request sent: $request"); - - final buffer = StringBuffer(); - await for (var response in socket.inputStream) { - buffer.write(utf8.decode(response)); - if (buffer.toString().contains("\r\n\r\n")) { - break; + final rawRequest = DaemonRpc.rawRequestRpc(uri, 'get_info', {}); + var response = await socket.send(rawRequest); + // check if we need authentication + String? authenticateHeaderValue; + for (final line in response.split('\r\n')) { + if (line.contains('WWW-authenticate: ')) { + // both the password and username needs to be + if (username == null || password == null) { + // node asking us for authentication, but we don't have any crendentials. + return MoneroNodeConnectionResponse(null, null, null, false); + } + authenticateHeaderValue = + line.replaceFirst('WWW-authenticate: ', '').trim(); } } - - final result = buffer.toString(); - print("Response received: $result"); + // header to authenticate was present, we need to remake the request with digest + if (authenticateHeaderValue != null) { + final digestAuth = DigestAuth(username!, password!); + digestAuth.initFromAuthorizationHeader(authenticateHeaderValue); + + // generate the Authorization header for the second request. + final authHeader = digestAuth.getAuthString('POST', uri.path); + final rawRequestAuthenticated = + DaemonRpc.rawRequestRpc(uri, 'get_info', {}, authHeader); + // resend with an authenticated request + response = await socket.send(rawRequestAuthenticated); + } // Check if the response contains "results" and does not contain "error" final success = - result.contains('"result":') && !result.contains('"error"'); + response.contains('"result":') && !response.contains('"error"'); return MoneroNodeConnectionResponse(null, null, null, success); } catch (e, s) { @@ -124,36 +135,15 @@ Future testMoneroNodeConnection( return false; }; - - final request = await httpClient.postUrl(uri); - - final body = utf8.encode( - jsonEncode({ - "jsonrpc": "2.0", - "id": "0", - "method": "get_info", - }), - ); - - request.headers.add( - 'Content-Length', - body.length.toString(), - preserveHeaderCase: true, - ); - request.headers.set( - 'Content-Type', - 'application/json', - preserveHeaderCase: true, + final daemonRpc = DaemonRpc( + IOClient(httpClient), + '$uri', + username: username, + password: password, ); + final result = await daemonRpc.call('get_info', {}); - request.add(body); - - final response = await request.close(); - final result = await response.transform(utf8.decoder).join(); - // print("HTTP Response: $result"); - - final success = - result.contains('"result":') && !result.contains('"error"'); + final success = result.containsKey('status') && result['status'] == 'OK'; return MoneroNodeConnectionResponse(null, null, null, success); } catch (e, s) { @@ -210,3 +200,18 @@ Future showBadX509CertificateDialog( return result ?? false; } + +extension on SOCKSSocket { + /// write the raw request to the socket and return the response as String + Future send(String rawRequest) async { + write(rawRequest); + final buffer = StringBuffer(); + await for (final response in inputStream) { + buffer.write(utf8.decode(response)); + if (buffer.toString().contains("\r\n\r\n")) { + break; + } + } + return buffer.toString(); + } +} diff --git a/lib/utilities/test_node_connection.dart b/lib/utilities/test_node_connection.dart index 127702b14..9169cb636 100644 --- a/lib/utilities/test_node_connection.dart +++ b/lib/utilities/test_node_connection.dart @@ -38,6 +38,8 @@ Future _xmrHelper( final data = nodeFormData; final url = data.host!; final port = data.port; + final username = data.login; + final password = data.password; final uri = Uri.parse(url); @@ -51,6 +53,8 @@ Future _xmrHelper( final response = await testMoneroNodeConnection( Uri.parse(uriString), + username, + password, false, proxyInfo: proxyInfo, ).timeout(Duration(seconds: proxyInfo != null ? 30 : 10)); @@ -67,6 +71,8 @@ Future _xmrHelper( if (shouldAllowBadCert) { final response = await testMoneroNodeConnection( Uri.parse(uriString), + username, + password, true, proxyInfo: proxyInfo, ); diff --git a/scripts/app_config/templates/pubspec.template b/scripts/app_config/templates/pubspec.template index e44cdcab4..915330621 100644 --- a/scripts/app_config/templates/pubspec.template +++ b/scripts/app_config/templates/pubspec.template @@ -204,6 +204,11 @@ dependencies: cbor: ^6.3.3 cs_monero: 1.0.0-pre.1 cs_monero_flutter_libs: 1.0.0-pre.0 + monero_rpc: + git: + url: https://github.com/cypherstack/monero_rpc + ref: 57b12e59dfba46b1b2da35f7ba97628fd7528c99 + digest_auth: ^1.0.1 dev_dependencies: flutter_test: From 1137b50b8a71e88a153994f52abb56707c8396eb Mon Sep 17 00:00:00 2001 From: Louis-Marie Baer Date: Thu, 26 Dec 2024 13:56:37 +0100 Subject: [PATCH 038/193] fix: #1061 --- .../manage_nodes_views/add_edit_node_view.dart | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/lib/pages/settings_views/global_settings_view/manage_nodes_views/add_edit_node_view.dart b/lib/pages/settings_views/global_settings_view/manage_nodes_views/add_edit_node_view.dart index fb18a4716..e66f7ecc7 100644 --- a/lib/pages/settings_views/global_settings_view/manage_nodes_views/add_edit_node_view.dart +++ b/lib/pages/settings_views/global_settings_view/manage_nodes_views/add_edit_node_view.dart @@ -860,13 +860,8 @@ class _NodeFormState extends ConsumerState { onChanged?.call(canSave, canTestConnection); ref.read(nodeFormDataProvider).name = _nameController.text; ref.read(nodeFormDataProvider).host = _hostController.text; - - ref.read(nodeFormDataProvider).login = - _usernameController.text.isEmpty ? null : _usernameController.text; - - ref.read(nodeFormDataProvider).password = - _passwordController.text.isEmpty ? null : _passwordController.text; - + ref.read(nodeFormDataProvider).login = _usernameController.text; + ref.read(nodeFormDataProvider).password = _passwordController.text; ref.read(nodeFormDataProvider).port = port; ref.read(nodeFormDataProvider).useSSL = _useSSL; ref.read(nodeFormDataProvider).isFailover = _isFailover; From 516b503f31182a2d129d158404ad96b538bc6d93 Mon Sep 17 00:00:00 2001 From: Louis-Marie Baer Date: Fri, 27 Dec 2024 20:19:33 +0100 Subject: [PATCH 039/193] use monero_rpc from pub dev --- scripts/app_config/templates/pubspec.template | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/scripts/app_config/templates/pubspec.template b/scripts/app_config/templates/pubspec.template index 915330621..e052525ae 100644 --- a/scripts/app_config/templates/pubspec.template +++ b/scripts/app_config/templates/pubspec.template @@ -204,10 +204,7 @@ dependencies: cbor: ^6.3.3 cs_monero: 1.0.0-pre.1 cs_monero_flutter_libs: 1.0.0-pre.0 - monero_rpc: - git: - url: https://github.com/cypherstack/monero_rpc - ref: 57b12e59dfba46b1b2da35f7ba97628fd7528c99 + monero_rpc: ^2.0.0 digest_auth: ^1.0.1 dev_dependencies: From b44cde334c17ebb22a7a008204dcff33a51314c1 Mon Sep 17 00:00:00 2001 From: Louis-Marie Baer Date: Mon, 6 Jan 2025 16:41:36 +0100 Subject: [PATCH 040/193] fix: no 24 words option for restoring namecoin wallet --- lib/wallets/crypto_currency/coins/namecoin.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/wallets/crypto_currency/coins/namecoin.dart b/lib/wallets/crypto_currency/coins/namecoin.dart index e390d599e..77940784e 100644 --- a/lib/wallets/crypto_currency/coins/namecoin.dart +++ b/lib/wallets/crypto_currency/coins/namecoin.dart @@ -229,7 +229,7 @@ class Namecoin extends Bip39HDCurrency with ElectrumXCurrencyInterface { bool get hasMnemonicPassphraseSupport => true; @override - List get possibleMnemonicLengths => [defaultSeedPhraseLength, 12]; + List get possibleMnemonicLengths => [defaultSeedPhraseLength, 24]; @override AddressType get defaultAddressType => defaultDerivePathType.getAddressType(); From 130895a449b9314a8c96473dd39e79df1763cc52 Mon Sep 17 00:00:00 2001 From: Louis-Marie Baer Date: Mon, 13 Jan 2025 20:35:24 +0100 Subject: [PATCH 041/193] fix: update logins even if null --- lib/models/node_model.dart | 8 ++++---- .../add_edit_node_view.dart | 19 ++++++++++++++----- .../helpers/restore_create_backup.dart | 1 + lib/services/node_service.dart | 12 +++++++++++- 4 files changed, 30 insertions(+), 10 deletions(-) diff --git a/lib/models/node_model.dart b/lib/models/node_model.dart index e4d3f66b6..1a27d1345 100644 --- a/lib/models/node_model.dart +++ b/lib/models/node_model.dart @@ -65,12 +65,12 @@ class NodeModel { int? port, String? name, bool? useSSL, - String? loginName, + required String? loginName, bool? enabled, String? coinName, bool? isFailover, bool? isDown, - bool? trusted, + required bool? trusted, bool? torEnabled, bool? clearnetEnabled, }) { @@ -80,12 +80,12 @@ class NodeModel { name: name ?? this.name, id: id, useSSL: useSSL ?? this.useSSL, - loginName: loginName ?? this.loginName, + loginName: loginName, enabled: enabled ?? this.enabled, coinName: coinName ?? this.coinName, isFailover: isFailover ?? this.isFailover, isDown: isDown ?? this.isDown, - trusted: trusted ?? this.trusted, + trusted: trusted, torEnabled: torEnabled ?? this.torEnabled, clearnetEnabled: clearnetEnabled ?? this.clearnetEnabled, ); diff --git a/lib/pages/settings_views/global_settings_view/manage_nodes_views/add_edit_node_view.dart b/lib/pages/settings_views/global_settings_view/manage_nodes_views/add_edit_node_view.dart index e66f7ecc7..5bbbe37d1 100644 --- a/lib/pages/settings_views/global_settings_view/manage_nodes_views/add_edit_node_view.dart +++ b/lib/pages/settings_views/global_settings_view/manage_nodes_views/add_edit_node_view.dart @@ -860,8 +860,10 @@ class _NodeFormState extends ConsumerState { onChanged?.call(canSave, canTestConnection); ref.read(nodeFormDataProvider).name = _nameController.text; ref.read(nodeFormDataProvider).host = _hostController.text; - ref.read(nodeFormDataProvider).login = _usernameController.text; - ref.read(nodeFormDataProvider).password = _passwordController.text; + ref.read(nodeFormDataProvider).login = + _usernameController.text.isEmpty ? null : _usernameController.text; + ref.read(nodeFormDataProvider).password = + _passwordController.text.isEmpty ? null : _passwordController.text; ref.read(nodeFormDataProvider).port = port; ref.read(nodeFormDataProvider).useSSL = _useSSL; ref.read(nodeFormDataProvider).isFailover = _isFailover; @@ -1326,7 +1328,11 @@ class _NodeFormState extends ConsumerState { }); if (widget.readOnly) { ref.read(nodeServiceChangeNotifierProvider).edit( - widget.node!.copyWith(isFailover: _isFailover), + widget.node!.copyWith( + isFailover: _isFailover, + loginName: widget.node!.loginName, + trusted: widget.node!.trusted, + ), null, true, ); @@ -1351,8 +1357,11 @@ class _NodeFormState extends ConsumerState { }); if (widget.readOnly) { ref.read(nodeServiceChangeNotifierProvider).edit( - widget.node! - .copyWith(isFailover: _isFailover), + widget.node!.copyWith( + isFailover: _isFailover, + loginName: widget.node!.loginName, + trusted: widget.node!.trusted, + ), null, true, ); diff --git a/lib/pages/settings_views/global_settings_view/stack_backup_views/helpers/restore_create_backup.dart b/lib/pages/settings_views/global_settings_view/stack_backup_views/helpers/restore_create_backup.dart index 0ffa6bcf9..68d9bb1f0 100644 --- a/lib/pages/settings_views/global_settings_view/stack_backup_views/helpers/restore_create_backup.dart +++ b/lib/pages/settings_views/global_settings_view/stack_backup_views/helpers/restore_create_backup.dart @@ -1071,6 +1071,7 @@ abstract class SWB { loginName: nodeData['loginName'] as String?, isFailover: nodeData['isFailover'] as bool, isDown: nodeData['isDown'] as bool, + trusted: nodeData['trusted'] as bool?, ), nodeData['password'] as String?, true, diff --git a/lib/services/node_service.dart b/lib/services/node_service.dart index db4a25a1b..847602249 100644 --- a/lib/services/node_service.dart +++ b/lib/services/node_service.dart @@ -104,6 +104,7 @@ class NodeService extends ChangeNotifier { trusted: savedNode.trusted, torEnabled: savedNode.torEnabled, clearnetEnabled: savedNode.clearnetEnabled, + loginName: savedNode.loginName, ), ); } @@ -122,6 +123,7 @@ class NodeService extends ChangeNotifier { trusted: primaryNode.trusted, torEnabled: primaryNode.torEnabled, clearnetEnabled: primaryNode.clearnetEnabled, + loginName: primaryNode.loginName, ), ); } @@ -213,6 +215,8 @@ class NodeService extends ChangeNotifier { key: "${node.id}_nodePW", value: password, ); + } else { + await secureStorageInterface.delete(key: "${node.id}_nodePW"); } if (shouldNotifyListeners) { notifyListeners(); @@ -240,7 +244,11 @@ class NodeService extends ChangeNotifier { await DB.instance.put( boxName: DB.boxNameNodeModels, key: model.id, - value: model.copyWith(enabled: enabled), + value: model.copyWith( + enabled: enabled, + loginName: model.loginName, + trusted: model.trusted, + ), ); if (shouldNotifyListeners) { notifyListeners(); @@ -314,6 +322,8 @@ class NodeService extends ChangeNotifier { useSSL: node.useSSL, coinName: node.coinName, isDown: node.isDown, + loginName: node.loginName, + trusted: node.trusted, ); } await add(node, null, false); From 0d1bf5895d5b69f8d2768420afb7ebf09ad9f18d Mon Sep 17 00:00:00 2001 From: julian Date: Mon, 13 Jan 2025 17:13:25 -0600 Subject: [PATCH 042/193] fix: incorrect number of confirms for monero (and wownero) outputs and transactions --- lib/models/isar/models/blockchain_data/utxo.dart | 16 ++++++++++++++-- .../blockchain_data/v2/transaction_v2.dart | 4 +++- .../wallet/intermediate/lib_monero_wallet.dart | 4 ++-- 3 files changed, 19 insertions(+), 5 deletions(-) diff --git a/lib/models/isar/models/blockchain_data/utxo.dart b/lib/models/isar/models/blockchain_data/utxo.dart index 87558c541..77de5ae3a 100644 --- a/lib/models/isar/models/blockchain_data/utxo.dart +++ b/lib/models/isar/models/blockchain_data/utxo.dart @@ -77,7 +77,9 @@ class UTXO { int getConfirmations(int currentChainHeight) { if (blockTime == null || blockHash == null) return 0; if (blockHeight == null || blockHeight! <= 0) return 0; - return max(0, currentChainHeight - (blockHeight! - 1)); + return _isMonero() + ? max(0, currentChainHeight - (blockHeight!)) + : max(0, currentChainHeight - (blockHeight! - 1)); } bool isConfirmed( @@ -90,6 +92,11 @@ class UTXO { (isCoinbase ? minimumCoinbaseConfirms : minimumConfirms); } + // fuzzy + bool _isMonero() { + return keyImage != null; + } + @ignore String? get keyImage { if (otherData == null) { @@ -98,7 +105,7 @@ class UTXO { try { final map = jsonDecode(otherData!) as Map; - return map["keyImage"] as String; + return map[UTXOOtherDataKeys.keyImage] as String; } catch (_) { return null; } @@ -169,3 +176,8 @@ class UTXO { @ignore int get hashCode => Object.hashAll([walletId, txid, vout]); } + +abstract final class UTXOOtherDataKeys { + static const keyImage = "keyImage"; + static const spent = "spent"; +} diff --git a/lib/models/isar/models/blockchain_data/v2/transaction_v2.dart b/lib/models/isar/models/blockchain_data/v2/transaction_v2.dart index 3d8903391..b7a92c26e 100644 --- a/lib/models/isar/models/blockchain_data/v2/transaction_v2.dart +++ b/lib/models/isar/models/blockchain_data/v2/transaction_v2.dart @@ -109,7 +109,9 @@ class TransactionV2 { int getConfirmations(int currentChainHeight) { if (height == null || height! <= 0) return 0; - return max(0, currentChainHeight - (height! - 1)); + return _isMonero() + ? max(0, currentChainHeight - (height!)) + : max(0, currentChainHeight - (height! - 1)); } bool isConfirmed( diff --git a/lib/wallets/wallet/intermediate/lib_monero_wallet.dart b/lib/wallets/wallet/intermediate/lib_monero_wallet.dart index 3c3c34a6d..423e8c70b 100644 --- a/lib/wallets/wallet/intermediate/lib_monero_wallet.dart +++ b/lib/wallets/wallet/intermediate/lib_monero_wallet.dart @@ -1017,8 +1017,8 @@ abstract class LibMoneroWallet .findFirst(); final otherDataMap = { - "keyImage": rawUTXO.keyImage, - "spent": rawUTXO.spent, + UTXOOtherDataKeys.keyImage: rawUTXO.keyImage, + UTXOOtherDataKeys.spent: rawUTXO.spent, }; final utxo = UTXO( From 38e66bfcb1fb4194b352fd1ce53c6c266d491bdc Mon Sep 17 00:00:00 2001 From: julian Date: Mon, 13 Jan 2025 17:13:42 -0600 Subject: [PATCH 043/193] chore: update pubspec.lock --- pubspec.lock | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/pubspec.lock b/pubspec.lock index 3ccce4760..760ef2066 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -633,6 +633,14 @@ packages: url: "https://github.com/cypherstack/flutter-devicelocale" source: git version: "0.8.1" + digest_auth: + dependency: "direct main" + description: + name: digest_auth + sha256: c8f4a8d65300bd58c4a2ca84ea6bd63cb584e8021e5689c600ee7efae34d73ea + url: "https://pub.dev" + source: hosted + version: "1.0.1" dio: dependency: transitive description: @@ -1360,6 +1368,14 @@ packages: url: "https://pub.dev" source: hosted version: "0.2.0" + monero_rpc: + dependency: "direct main" + description: + name: monero_rpc + sha256: "6052b6812e3e831015d776645d0d880fce5b9632d9df2cacae54b5e10ffe2db5" + url: "https://pub.dev" + source: hosted + version: "2.0.0" mutex: dependency: "direct main" description: From a01dce1c72b9a9ed1a94ad4687b60927e33405b2 Mon Sep 17 00:00:00 2001 From: julian Date: Tue, 14 Jan 2025 16:48:32 -0600 Subject: [PATCH 044/193] Only fetch full monero transactions via ffi if required --- lib/wallets/wallet/impl/monero_wallet.dart | 6 +-- lib/wallets/wallet/impl/wownero_wallet.dart | 6 +-- .../intermediate/lib_monero_wallet.dart | 42 +++++++++++++++---- pubspec.lock | 4 +- scripts/app_config/templates/pubspec.template | 2 +- 5 files changed, 43 insertions(+), 17 deletions(-) diff --git a/lib/wallets/wallet/impl/monero_wallet.dart b/lib/wallets/wallet/impl/monero_wallet.dart index d890e06e1..f1de036aa 100644 --- a/lib/wallets/wallet/impl/monero_wallet.dart +++ b/lib/wallets/wallet/impl/monero_wallet.dart @@ -61,11 +61,11 @@ class MoneroWallet extends LibMoneroWallet { bool walletExists(String path) => lib_monero.MoneroWallet.isWalletExist(path); @override - void loadWallet({ + Future loadWallet({ required String path, required String password, - }) { - libMoneroWallet = lib_monero.MoneroWallet.loadWallet( + }) async { + libMoneroWallet = await lib_monero.MoneroWallet.loadWallet( path: path, password: password, ); diff --git a/lib/wallets/wallet/impl/wownero_wallet.dart b/lib/wallets/wallet/impl/wownero_wallet.dart index 09a9d4c5d..81407f837 100644 --- a/lib/wallets/wallet/impl/wownero_wallet.dart +++ b/lib/wallets/wallet/impl/wownero_wallet.dart @@ -97,11 +97,11 @@ class WowneroWallet extends LibMoneroWallet { lib_monero.WowneroWallet.isWalletExist(path); @override - void loadWallet({ + Future loadWallet({ required String path, required String password, - }) { - libMoneroWallet = lib_monero.WowneroWallet.loadWallet( + }) async { + libMoneroWallet = await lib_monero.WowneroWallet.loadWallet( path: path, password: password, ); diff --git a/lib/wallets/wallet/intermediate/lib_monero_wallet.dart b/lib/wallets/wallet/intermediate/lib_monero_wallet.dart index 423e8c70b..8ab9efcc8 100644 --- a/lib/wallets/wallet/intermediate/lib_monero_wallet.dart +++ b/lib/wallets/wallet/intermediate/lib_monero_wallet.dart @@ -137,7 +137,7 @@ abstract class LibMoneroWallet int currentKnownChainHeight = 0; double highestPercentCached = 0; - void loadWallet({required String path, required String password}); + Future loadWallet({required String path, required String password}); Future getCreatedWallet({ required String path, @@ -206,7 +206,7 @@ abstract class LibMoneroWallet throw Exception("Password not found $e, $s"); } - loadWallet(path: path, password: password); + await loadWallet(path: path, password: password); _setListener(); @@ -329,7 +329,7 @@ abstract class LibMoneroWallet } catch (e, s) { throw Exception("Password not found $e, $s"); } - loadWallet(path: path, password: password); + await loadWallet(path: path, password: password); final wallet = libMoneroWallet!; return (wallet.getAddress().value, wallet.getPrivateViewKey()); } @@ -565,7 +565,26 @@ abstract class LibMoneroWallet return; } - final transactions = await base.getTxs(refresh: true); + final localTxids = await mainDB.isar.transactionV2s + .where() + .walletIdEqualTo(walletId) + .filter() + .heightGreaterThan(0) + .txidProperty() + .findAll(); + + final allTxids = await base.getAllTxids(refresh: true); + + final txidsToFetch = allTxids.toSet().difference(localTxids.toSet()); + + if (txidsToFetch.isEmpty) { + return; + } + + final transactions = await base.getTxs( + txids: txidsToFetch, + refresh: false, + ); final allOutputs = await base.getOutputs(includeSpent: true, refresh: true); @@ -692,7 +711,7 @@ abstract class LibMoneroWallet fractionDigits: cryptoCurrency.fractionDigits, ); } else { - final transactions = await libMoneroWallet!.getTxs(refresh: true); + final transactions = await libMoneroWallet!.getAllTxs(refresh: true); BigInt transactionBalance = BigInt.zero; for (final tx in transactions) { if (!tx.isSpend) { @@ -790,8 +809,15 @@ abstract class LibMoneroWallet } } - void onNewBlock(int nodeHeight) { - // do something? + void onNewBlock(int nodeHeight) async { + try { + await updateTransactions(); + } catch (e, s) { + Logging.instance.log( + "onNewBlock(): $e\n$s", + level: LogLevel.Warning, + ); + } } final _utxosUpdateLock = Mutex(); @@ -1161,7 +1187,7 @@ abstract class LibMoneroWallet try { int highestIndex = -1; - final entries = await libMoneroWallet?.getTxs(refresh: true); + final entries = await libMoneroWallet?.getAllTxs(refresh: true); if (entries != null) { for (final element in entries) { if (!element.isSpend) { diff --git a/pubspec.lock b/pubspec.lock index 760ef2066..6a4e5316b 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -436,10 +436,10 @@ packages: dependency: "direct main" description: name: cs_monero - sha256: "8b2c1451d8eb09fc2a1248ecd652f2332343946a1d622b2f623b74d5f999c8d5" + sha256: ed81d9e74ea71a8b8b0bfed07a284e14b6e5f4d0dbde774735f9f0a9ab60b7fb url: "https://pub.dev" source: hosted - version: "1.0.0-pre.1" + version: "1.0.0-pre.2" cs_monero_flutter_libs: dependency: "direct main" description: diff --git a/scripts/app_config/templates/pubspec.template b/scripts/app_config/templates/pubspec.template index e052525ae..46c98e8ef 100644 --- a/scripts/app_config/templates/pubspec.template +++ b/scripts/app_config/templates/pubspec.template @@ -202,7 +202,7 @@ dependencies: blockchain_utils: ^3.3.0 on_chain: ^4.0.1 cbor: ^6.3.3 - cs_monero: 1.0.0-pre.1 + cs_monero: 1.0.0-pre.2 cs_monero_flutter_libs: 1.0.0-pre.0 monero_rpc: ^2.0.0 digest_auth: ^1.0.1 From 1a094d37457eb6fccc1151f7f89ef7dc903c92d2 Mon Sep 17 00:00:00 2001 From: julian Date: Tue, 14 Jan 2025 16:50:22 -0600 Subject: [PATCH 045/193] update test --- test/services/node_service_test.dart | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/test/services/node_service_test.dart b/test/services/node_service_test.dart index cb402deed..2fac42b96 100644 --- a/test/services/node_service_test.dart +++ b/test/services/node_service_test.dart @@ -270,7 +270,11 @@ void main() { final service = NodeService(secureStorageInterface: fakeStore); final currentLength = service.nodes.length; - final editedNode = nodeA.copyWith(name: "Some new kind of name"); + final editedNode = nodeA.copyWith( + name: "Some new kind of name", + loginName: null, + trusted: null, + ); await service.edit(editedNode, "123456", true); From cb11d58c47567698cb77805a844c27f6e653f01e Mon Sep 17 00:00:00 2001 From: julian Date: Wed, 15 Jan 2025 15:16:10 -0600 Subject: [PATCH 046/193] fix: double encoded qr address prefix --- lib/utilities/address_utils.dart | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/lib/utilities/address_utils.dart b/lib/utilities/address_utils.dart index 2e6b241b8..efac56d64 100644 --- a/lib/utilities/address_utils.dart +++ b/lib/utilities/address_utils.dart @@ -164,7 +164,14 @@ class AddressUtils { ) { // Filter unrecognized parameters. final filteredParams = _filterParams(params); - String uriString = "$scheme:$address"; + String uriString; + + // cashaddrs strike again + if (address.startsWith("$scheme:")) { + uriString = address; + } else { + uriString = "$scheme:$address"; + } if (scheme.toLowerCase() == "monero") { // Handle Monero-specific formatting. From 128dc14ce751025d41fad252e7abd98eded2074b Mon Sep 17 00:00:00 2001 From: Julian Date: Wed, 29 Jan 2025 12:56:03 -0600 Subject: [PATCH 047/193] update min flutter/dart sdk --- ios/Podfile.lock | 19 +++--- macos/Podfile.lock | 23 ++++--- pubspec.lock | 60 +++++++++---------- scripts/app_config/templates/pubspec.template | 4 +- 4 files changed, 50 insertions(+), 56 deletions(-) diff --git a/ios/Podfile.lock b/ios/Podfile.lock index 4ca2f124b..54bf5e55f 100644 --- a/ios/Podfile.lock +++ b/ios/Podfile.lock @@ -9,7 +9,7 @@ PODS: - connectivity_plus (0.0.1): - Flutter - ReachabilitySwift - - cs_monero_flutter_libs (0.0.1): + - cs_monero_flutter_libs_ios (0.0.1): - Flutter - device_info_plus (0.0.1): - Flutter @@ -87,8 +87,6 @@ PODS: - "sqlite3 (3.46.0+1)": - "sqlite3/common (= 3.46.0+1)" - "sqlite3/common (3.46.0+1)" - - "sqlite3/dbstatvtab (3.46.0+1)": - - sqlite3/common - "sqlite3/fts5 (3.46.0+1)": - sqlite3/common - "sqlite3/perf-threadsafe (3.46.0+1)": @@ -97,8 +95,7 @@ PODS: - sqlite3/common - sqlite3_flutter_libs (0.0.1): - Flutter - - "sqlite3 (~> 3.46.0+1)" - - sqlite3/dbstatvtab + - sqlite3 (~> 3.46.0) - sqlite3/fts5 - sqlite3/perf-threadsafe - sqlite3/rtree @@ -117,7 +114,7 @@ DEPENDENCIES: - barcode_scan2 (from `.symlinks/plugins/barcode_scan2/ios`) - coinlib_flutter (from `.symlinks/plugins/coinlib_flutter/darwin`) - connectivity_plus (from `.symlinks/plugins/connectivity_plus/ios`) - - cs_monero_flutter_libs (from `.symlinks/plugins/cs_monero_flutter_libs/ios`) + - cs_monero_flutter_libs_ios (from `.symlinks/plugins/cs_monero_flutter_libs_ios/ios`) - device_info_plus (from `.symlinks/plugins/device_info_plus/ios`) - devicelocale (from `.symlinks/plugins/devicelocale/ios`) - file_picker (from `.symlinks/plugins/file_picker/ios`) @@ -160,8 +157,8 @@ EXTERNAL SOURCES: :path: ".symlinks/plugins/coinlib_flutter/darwin" connectivity_plus: :path: ".symlinks/plugins/connectivity_plus/ios" - cs_monero_flutter_libs: - :path: ".symlinks/plugins/cs_monero_flutter_libs/ios" + cs_monero_flutter_libs_ios: + :path: ".symlinks/plugins/cs_monero_flutter_libs_ios/ios" device_info_plus: :path: ".symlinks/plugins/device_info_plus/ios" devicelocale: @@ -213,7 +210,7 @@ SPEC CHECKSUMS: barcode_scan2: 0af2bb63c81b4565aab6cd78278e4c0fa136dbb0 coinlib_flutter: 9275e8255ef67d3da33beb6e117d09ced4f46eb5 connectivity_plus: 07c49e96d7fc92bc9920617b83238c4d178b446a - cs_monero_flutter_libs: 43cda3474c2bc907f2b2b5bb26fd89cb864fcfc6 + cs_monero_flutter_libs_ios: fd353631682247f72a36493ff060d4328d6f720d device_info_plus: 97af1d7e84681a90d0693e63169a5d50e0839a0d devicelocale: 35ba84dc7f45f527c3001535d8c8d104edd5d926 DKImagePickerController: b512c28220a2b8ac7419f21c491fc8534b7601ac @@ -231,14 +228,14 @@ SPEC CHECKSUMS: lelantus: 417f0221260013dfc052cae9cf4b741b6479edba local_auth_darwin: 66e40372f1c29f383a314c738c7446e2f7fdadc3 MTBBarcodeScanner: f453b33c4b7dfe545d8c6484ed744d55671788cb - package_info_plus: 58f0028419748fad15bf008b270aaa8e54380b1c + package_info_plus: c0502532a26c7662a62a356cebe2692ec5fe4ec4 path_provider_foundation: 2b6b4c569c0fb62ec74538f866245ac84301af46 permission_handler_apple: 9878588469a2b0d0fc1e048d9f43605f92e6cec2 ReachabilitySwift: 985039c6f7b23a1da463388634119492ff86c825 SDWebImage: 72f86271a6f3139cc7e4a89220946489d4b9a866 share_plus: c3fef564749587fc939ef86ffb283ceac0baf9f5 sqlite3: 292c3e1bfe89f64e51ea7fc7dab9182a017c8630 - sqlite3_flutter_libs: c00457ebd31e59fa6bb830380ddba24d44fbcd3b + sqlite3_flutter_libs: 0d611efdf6d1c9297d5ab03dab21b75aeebdae31 stack_wallet_backup: 5b8563aba5d8ffbf2ce1944331ff7294a0ec7c03 SwiftProtobuf: 6ef3f0e422ef90d6605ca20b21a94f6c1324d6b3 SwiftyGif: 6c3eafd0ce693cad58bb63d2b2fb9bacb8552780 diff --git a/macos/Podfile.lock b/macos/Podfile.lock index b9159cd55..fa0068398 100644 --- a/macos/Podfile.lock +++ b/macos/Podfile.lock @@ -7,7 +7,7 @@ PODS: - connectivity_plus (0.0.1): - FlutterMacOS - ReachabilitySwift - - cs_monero_flutter_libs (0.0.1): + - cs_monero_flutter_libs_macos (0.0.1): - FlutterMacOS - desktop_drop (0.0.1): - FlutterMacOS @@ -44,8 +44,6 @@ PODS: - "sqlite3 (3.46.0+1)": - "sqlite3/common (= 3.46.0+1)" - "sqlite3/common (3.46.0+1)" - - "sqlite3/dbstatvtab (3.46.0+1)": - - sqlite3/common - "sqlite3/fts5 (3.46.0+1)": - sqlite3/common - "sqlite3/perf-threadsafe (3.46.0+1)": @@ -54,8 +52,7 @@ PODS: - sqlite3/common - sqlite3_flutter_libs (0.0.1): - FlutterMacOS - - "sqlite3 (~> 3.46.0+1)" - - sqlite3/dbstatvtab + - sqlite3 (~> 3.46.0) - sqlite3/fts5 - sqlite3/perf-threadsafe - sqlite3/rtree @@ -73,7 +70,7 @@ DEPENDENCIES: - camera_macos (from `Flutter/ephemeral/.symlinks/plugins/camera_macos/macos`) - coinlib_flutter (from `Flutter/ephemeral/.symlinks/plugins/coinlib_flutter/darwin`) - connectivity_plus (from `Flutter/ephemeral/.symlinks/plugins/connectivity_plus/macos`) - - cs_monero_flutter_libs (from `Flutter/ephemeral/.symlinks/plugins/cs_monero_flutter_libs/macos`) + - cs_monero_flutter_libs_macos (from `Flutter/ephemeral/.symlinks/plugins/cs_monero_flutter_libs_macos/macos`) - desktop_drop (from `Flutter/ephemeral/.symlinks/plugins/desktop_drop/macos`) - device_info_plus (from `Flutter/ephemeral/.symlinks/plugins/device_info_plus/macos`) - devicelocale (from `Flutter/ephemeral/.symlinks/plugins/devicelocale/macos`) @@ -108,8 +105,8 @@ EXTERNAL SOURCES: :path: Flutter/ephemeral/.symlinks/plugins/coinlib_flutter/darwin connectivity_plus: :path: Flutter/ephemeral/.symlinks/plugins/connectivity_plus/macos - cs_monero_flutter_libs: - :path: Flutter/ephemeral/.symlinks/plugins/cs_monero_flutter_libs/macos + cs_monero_flutter_libs_macos: + :path: Flutter/ephemeral/.symlinks/plugins/cs_monero_flutter_libs_macos/macos desktop_drop: :path: Flutter/ephemeral/.symlinks/plugins/desktop_drop/macos device_info_plus: @@ -157,28 +154,28 @@ SPEC CHECKSUMS: camera_macos: c2603f5eed16f05076cf17e12030d2ce55a77839 coinlib_flutter: 9275e8255ef67d3da33beb6e117d09ced4f46eb5 connectivity_plus: 18d3c32514c886e046de60e9c13895109866c747 - cs_monero_flutter_libs: e91a436103857259f5855cad4971301a5a29b38d + cs_monero_flutter_libs_macos: b901f94d39d1338f706312b026aba928d23582d4 desktop_drop: 69eeff437544aa619c8db7f4481b3a65f7696898 device_info_plus: ce1b7762849d3ec103d0e0517299f2db7ad60720 devicelocale: 9f0f36ac651cabae2c33f32dcff4f32b61c38225 flutter_libepiccash: be1560a04150c5cc85bcf08d236ec2b3d1f5d8da flutter_libsparkmobile: df2d36af1691379c81249e7be7b68be3c81d388b - flutter_local_notifications: 3805ca215b2fb7f397d78b66db91f6a747af52e4 + flutter_local_notifications: 4b427ffabf278fc6ea9484c97505e231166927a5 flutter_secure_storage_macos: 59459653abe1adb92abbc8ea747d79f8d19866c9 FlutterMacOS: 8f6f14fa908a6fb3fba0cd85dbd81ec4b251fb24 frostdart: e6bf3119527ccfbcec1b8767da6ede5bb4c4f716 isar_flutter_libs: 43385c99864c168fadba7c9adeddc5d38838ca6a lelantus: 308e42c5a648598936a07a234471dd8cf8e687a0 local_auth_darwin: 66e40372f1c29f383a314c738c7446e2f7fdadc3 - package_info_plus: fa739dd842b393193c5ca93c26798dff6e3d0e0c + package_info_plus: f5790acc797bf17c3e959e9d6cf162cc68ff7523 path_provider_foundation: 2b6b4c569c0fb62ec74538f866245ac84301af46 ReachabilitySwift: 985039c6f7b23a1da463388634119492ff86c825 share_plus: 76dd39142738f7a68dd57b05093b5e8193f220f7 sqlite3: 292c3e1bfe89f64e51ea7fc7dab9182a017c8630 - sqlite3_flutter_libs: 5ca46c1a04eddfbeeb5b16566164aa7ad1616e7b + sqlite3_flutter_libs: 1be4459672f8168ded2d8667599b8e3ca5e72b83 stack_wallet_backup: 6ebc60b1bdcf11cf1f1cbad9aa78332e1e15778c tor_ffi_plugin: 2566c1ed174688cca560fa0c64b7a799c66f07cb - url_launcher_macos: 5f437abeda8c85500ceb03f5c1938a8c5a705399 + url_launcher_macos: c82c93949963e55b228a30115bd219499a6fe404 wakelock_plus: 4783562c9a43d209c458cb9b30692134af456269 window_size: 339dafa0b27a95a62a843042038fa6c3c48de195 diff --git a/pubspec.lock b/pubspec.lock index 6a4e5316b..bb163c0e0 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -5,23 +5,23 @@ packages: dependency: transitive description: name: _fe_analyzer_shared - sha256: f256b0c0ba6c7577c15e2e4e114755640a875e885099367bf6e012b19314c834 + sha256: "16e298750b6d0af7ce8a3ba7c18c69c3785d11b15ec83f6dcd0ad2a0009b3cab" url: "https://pub.dev" source: hosted - version: "72.0.0" + version: "76.0.0" _macros: dependency: transitive description: dart source: sdk - version: "0.3.2" + version: "0.3.3" analyzer: dependency: "direct dev" description: name: analyzer - sha256: b652861553cd3990d8ed361f7979dc6d7053a9ac8843fa73820ab68ce5410139 + sha256: "1f14db053a8c23e260789e9b0980fa27f2680dd640932cae5e1137cce0e46e1e" url: "https://pub.dev" source: hosted - version: "6.7.0" + version: "6.11.0" another_flushbar: dependency: "direct main" description: @@ -363,10 +363,10 @@ packages: dependency: transitive description: name: collection - sha256: ee67cb0715911d28db6bf4af1026078bd6f0128b07a5f66fb2ed94ec6783c09a + sha256: a1ace0a119f20aabc852d165077c036cd864315bd99b7eaa10a60100341941bf url: "https://pub.dev" source: hosted - version: "1.18.0" + version: "1.19.0" compat: dependency: "direct main" description: @@ -1197,18 +1197,18 @@ packages: dependency: transitive description: name: leak_tracker - sha256: "3f87a60e8c63aecc975dda1ceedbc8f24de75f09e4856ea27daf8958f2f0ce05" + sha256: "7bb2830ebd849694d1ec25bf1f44582d6ac531a57a365a803a6034ff751d2d06" url: "https://pub.dev" source: hosted - version: "10.0.5" + version: "10.0.7" leak_tracker_flutter_testing: dependency: transitive description: name: leak_tracker_flutter_testing - sha256: "932549fb305594d82d7183ecd9fa93463e9914e1b67cacc34bc40906594a1806" + sha256: "9491a714cca3667b60b5c420da8217e6de0d1ba7a5ec322fab01758f6998f379" url: "https://pub.dev" source: hosted - version: "3.0.5" + version: "3.0.8" leak_tracker_testing: dependency: transitive description: @@ -1300,10 +1300,10 @@ packages: dependency: transitive description: name: macros - sha256: "0acaed5d6b7eab89f63350bccd82119e6c602df0f391260d0e32b5e23db79536" + sha256: "1d9e801cd66f7ea3663c45fc708450db1fa57f988142c64289142c9b7ee80656" url: "https://pub.dev" source: hosted - version: "0.1.2-main.4" + version: "0.1.3-main.0" matcher: dependency: transitive description: @@ -1756,7 +1756,7 @@ packages: dependency: transitive description: flutter source: sdk - version: "0.0.99" + version: "0.0.0" socks5_proxy: dependency: "direct main" description: @@ -1843,10 +1843,10 @@ packages: dependency: transitive description: name: stack_trace - sha256: "73713990125a6d93122541237550ee3352a2d84baad52d375a4cad2eb9b7ce0b" + sha256: "9f47fd3630d76be3ab26f0ee06d213679aa425996925ff3feffdec504931c377" url: "https://pub.dev" source: hosted - version: "1.11.1" + version: "1.12.0" stack_wallet_backup: dependency: "direct main" description: @@ -1892,10 +1892,10 @@ packages: dependency: transitive description: name: string_scanner - sha256: "556692adab6cfa87322a115640c11f13cb77b3f076ddcc5d6ae3c20242bedcde" + sha256: "688af5ed3402a4bde5b3a6c15fd768dbf2621a614950b17f04626c431ab3c4c3" url: "https://pub.dev" source: hosted - version: "1.2.0" + version: "1.3.0" string_validator: dependency: "direct main" description: @@ -1924,26 +1924,26 @@ packages: dependency: transitive description: name: test - sha256: "7ee44229615f8f642b68120165ae4c2a75fe77ae2065b1e55ae4711f6cf0899e" + sha256: "713a8789d62f3233c46b4a90b174737b2c04cb6ae4500f2aa8b1be8f03f5e67f" url: "https://pub.dev" source: hosted - version: "1.25.7" + version: "1.25.8" test_api: dependency: transitive description: name: test_api - sha256: "5b8a98dafc4d5c4c9c72d8b31ab2b23fc13422348d2997120294d3bac86b4ddb" + sha256: "664d3a9a64782fcdeb83ce9c6b39e78fd2971d4e37827b9b06c3aa1edc5e760c" url: "https://pub.dev" source: hosted - version: "0.7.2" + version: "0.7.3" test_core: dependency: transitive description: name: test_core - sha256: "55ea5a652e38a1dfb32943a7973f3681a60f872f8c3a05a14664ad54ef9c6696" + sha256: "12391302411737c176b0b5d6491f466b0dd56d4763e347b6714efbaa74d7953d" url: "https://pub.dev" source: hosted - version: "0.6.4" + version: "0.6.5" tezart: dependency: "direct main" description: @@ -2142,10 +2142,10 @@ packages: dependency: transitive description: name: vm_service - sha256: "5c5f338a667b4c644744b661f309fb8080bb94b18a7e91ef1dbd343bed00ed6d" + sha256: f6be3ed8bd01289b34d679c2b62226f63c0e69f9fd2e50a6b3c1c729a961041b url: "https://pub.dev" source: hosted - version: "14.2.5" + version: "14.3.0" wakelock_platform_interface: dependency: transitive description: @@ -2231,10 +2231,10 @@ packages: dependency: transitive description: name: webdriver - sha256: "003d7da9519e1e5f329422b36c4dcdf18d7d2978d1ba099ea4e45ba490ed845e" + sha256: "3d773670966f02a646319410766d3b5e1037efb7f07cc68f844d5e06cd4d61c8" url: "https://pub.dev" source: hosted - version: "3.0.3" + version: "3.0.4" webkit_inspection_protocol: dependency: transitive description: @@ -2317,5 +2317,5 @@ packages: source: hosted version: "0.2.3" sdks: - dart: ">=3.5.3 <4.0.0" - flutter: ">=3.24.3" + dart: ">=3.6.1 <4.0.0" + flutter: ">=3.27.3" diff --git a/scripts/app_config/templates/pubspec.template b/scripts/app_config/templates/pubspec.template index 46c98e8ef..bdb0df341 100644 --- a/scripts/app_config/templates/pubspec.template +++ b/scripts/app_config/templates/pubspec.template @@ -14,8 +14,8 @@ description: PLACEHOLDER version: PLACEHOLDER_V+PLACEHOLDER_B environment: - sdk: ">=3.5.3 <4.0.0" - flutter: ^3.24.3 + sdk: ">=3.6.1 <4.0.0" + flutter: ^3.27.3 dependencies: flutter: From 9bd343c987c765a887734eecc1006f6e27895fe0 Mon Sep 17 00:00:00 2001 From: Julian Date: Wed, 29 Jan 2025 13:07:16 -0600 Subject: [PATCH 048/193] obscure seed words while restoring in progress --- .../restore_wallet_view/restore_wallet_view.dart | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/lib/pages/add_wallet_views/restore_wallet_view/restore_wallet_view.dart b/lib/pages/add_wallet_views/restore_wallet_view/restore_wallet_view.dart index 58e51b34e..eb01ea9c7 100644 --- a/lib/pages/add_wallet_views/restore_wallet_view/restore_wallet_view.dart +++ b/lib/pages/add_wallet_views/restore_wallet_view/restore_wallet_view.dart @@ -114,6 +114,8 @@ class _RestoreWalletViewState extends ConsumerState { late final TextSelectionControls textSelectionControls; + bool _hideSeedWords = false; + Future onControlsPaste(TextSelectionDelegate delegate) async { final data = await widget.clipboard.getData(Clipboard.kTextPlain); if (data?.text == null) { @@ -212,6 +214,8 @@ class _RestoreWalletViewState extends ConsumerState { Future attemptRestore() async { if (_formKey.currentState!.validate()) { + if (mounted) setState(() => _hideSeedWords = true); + String mnemonic = ""; for (final element in _controllers) { mnemonic += " ${element.text.trim().toLowerCase()}"; @@ -282,6 +286,7 @@ class _RestoreWalletViewState extends ConsumerState { // TODO: do actual check to make sure it is a valid mnemonic for monero if (bip39.validateMnemonic(mnemonic) == false && !(widget.coin is Monero || widget.coin is Wownero)) { + if (mounted) setState(() => _hideSeedWords = false); unawaited( showFloatingFlushBar( type: FlushBarType.warning, @@ -313,6 +318,8 @@ class _RestoreWalletViewState extends ConsumerState { onCancel: () async { isRestoring = false; + if (mounted) setState(() => _hideSeedWords = false); + await ref.read(pWallets).deleteWallet( info, ref.read(secureStoreProvider), @@ -471,6 +478,8 @@ class _RestoreWalletViewState extends ConsumerState { ); }, ); + + if (mounted) setState(() => _hideSeedWords = false); } } @@ -868,6 +877,7 @@ class _RestoreWalletViewState extends ConsumerState { child: Column( children: [ TextFormField( + obscureText: _hideSeedWords, autocorrect: !isDesktop, enableSuggestions: !isDesktop, textCapitalization: @@ -1001,6 +1011,7 @@ class _RestoreWalletViewState extends ConsumerState { child: Column( children: [ TextFormField( + obscureText: _hideSeedWords, autocorrect: !isDesktop, enableSuggestions: !isDesktop, textCapitalization: @@ -1135,6 +1146,7 @@ class _RestoreWalletViewState extends ConsumerState { padding: const EdgeInsets.symmetric(vertical: 4), child: TextFormField( + obscureText: _hideSeedWords, autocorrect: !isDesktop, enableSuggestions: !isDesktop, textCapitalization: TextCapitalization.none, From ab450684b2dc6f455365eee9b64d03b61500c4eb Mon Sep 17 00:00:00 2001 From: Julian Date: Wed, 29 Jan 2025 13:31:04 -0600 Subject: [PATCH 049/193] clarify checking of new/unmined spark coins --- .../spark_interface.dart | 32 +++++++++++-------- 1 file changed, 18 insertions(+), 14 deletions(-) diff --git a/lib/wallets/wallet/wallet_mixin_interfaces/spark_interface.dart b/lib/wallets/wallet/wallet_mixin_interfaces/spark_interface.dart index 186eb5663..8de5bbbab 100644 --- a/lib/wallets/wallet/wallet_mixin_interfaces/spark_interface.dart +++ b/lib/wallets/wallet/wallet_mixin_interfaces/spark_interface.dart @@ -1014,31 +1014,35 @@ mixin SparkInterface } // check and update coins if required - final List updatedCoins = []; + final List checkedCoins = []; for (final coin in coinsToCheck) { - SparkCoin updated = coin; + final SparkCoin checked; - if (updated.height == null) { + if (coin.height == null) { final tx = await electrumXCachedClient.getTransaction( - txHash: updated.txHash, + txHash: coin.txHash, cryptoCurrency: info.coin, ); if (tx["height"] is int) { - updated = updated.copyWith(height: tx["height"] as int); + checked = coin.copyWith( + height: tx["height"] as int, + isUsed: spentCoinTags!.contains(coin.lTagHash), + ); + } else { + checked = coin; } + } else { + checked = spentCoinTags!.contains(coin.lTagHash) + ? coin.copyWith(isUsed: true) + : coin; } - if (updated.height != null && - spentCoinTags!.contains(updated.lTagHash)) { - updated = coin.copyWith(isUsed: true); - } - - updatedCoins.add(updated); + checkedCoins.add(checked); } - // update in db if any have changed - if (updatedCoins.isNotEmpty) { + // add/update in db + if (checkedCoins.isNotEmpty) { await mainDB.isar.writeTxn(() async { - await mainDB.isar.sparkCoins.putAll(updatedCoins); + await mainDB.isar.sparkCoins.putAll(checkedCoins); }); } From 1a3a09a32560ec339a6702fb8f97db20c82c14e5 Mon Sep 17 00:00:00 2001 From: Julian Date: Wed, 29 Jan 2025 16:53:55 -0600 Subject: [PATCH 050/193] firo balance type button changes --- .../desktop_balance_toggle_button.dart | 27 ++++++------------- .../sub_widgets/desktop_wallet_summary.dart | 18 ++++++++----- 2 files changed, 20 insertions(+), 25 deletions(-) diff --git a/lib/pages_desktop_specific/my_stack_view/wallet_view/sub_widgets/desktop_balance_toggle_button.dart b/lib/pages_desktop_specific/my_stack_view/wallet_view/sub_widgets/desktop_balance_toggle_button.dart index abe41055c..659f5710a 100644 --- a/lib/pages_desktop_specific/my_stack_view/wallet_view/sub_widgets/desktop_balance_toggle_button.dart +++ b/lib/pages_desktop_specific/my_stack_view/wallet_view/sub_widgets/desktop_balance_toggle_button.dart @@ -10,11 +10,10 @@ import 'package:flutter/material.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; -import 'package:flutter_svg/flutter_svg.dart'; + import '../../../../providers/wallet/public_private_balance_state_provider.dart'; import '../../../../providers/wallet/wallet_balance_toggle_state_provider.dart'; import '../../../../themes/stack_colors.dart'; -import '../../../../utilities/assets.dart'; import '../../../../utilities/constants.dart'; import '../../../../utilities/enums/wallet_balance_toggle_state.dart'; import '../../../../utilities/text_styles.dart'; @@ -86,7 +85,7 @@ class DesktopPrivateBalanceToggleButton extends ConsumerWidget { return SizedBox( height: 22, - width: 22, + width: 80, child: MaterialButton( color: Theme.of(context).extension()!.buttonBackSecondary, splashColor: Theme.of(context).extension()!.highlight, @@ -120,22 +119,12 @@ class DesktopPrivateBalanceToggleButton extends ConsumerWidget { ), ), child: Center( - child: currentType == FiroType.spark - ? SvgPicture.asset( - Assets.svg.spark, - width: 16, - // color: Theme.of(context) - // .extension()! - // .accentColorYellow, - ) - : Image( - image: AssetImage( - currentType == FiroType.public - ? Assets.png.glasses - : Assets.png.glassesHidden, - ), - width: 16, - ), + child: FittedBox( + child: Text( + currentType.name.toUpperCase(), + style: STextStyles.w500_10(context), + ), + ), ), ), ); diff --git a/lib/pages_desktop_specific/my_stack_view/wallet_view/sub_widgets/desktop_wallet_summary.dart b/lib/pages_desktop_specific/my_stack_view/wallet_view/sub_widgets/desktop_wallet_summary.dart index 5f0e0f69b..c4a719510 100644 --- a/lib/pages_desktop_specific/my_stack_view/wallet_view/sub_widgets/desktop_wallet_summary.dart +++ b/lib/pages_desktop_specific/my_stack_view/wallet_view/sub_widgets/desktop_wallet_summary.dart @@ -151,6 +151,16 @@ class _WDesktopWalletSummaryState extends ConsumerState { .textSubtitle1, ), ), + if (coin is Firo) + const Row( + children: [ + DesktopPrivateBalanceToggleButton(), + SizedBox( + width: 8, + ), + DesktopBalanceToggleButton(), + ], + ) ], ), const SizedBox( @@ -163,15 +173,11 @@ class _WDesktopWalletSummaryState extends ConsumerState { ? ref.watch(pCurrentTokenWallet)!.tokenContract.address : null, ), - if (coin is Firo) + if (coin is! Firo) const SizedBox( width: 8, ), - if (coin is Firo) const DesktopPrivateBalanceToggleButton(), - const SizedBox( - width: 8, - ), - const DesktopBalanceToggleButton(), + if (coin is! Firo) const DesktopBalanceToggleButton(), ], ); }, From 6c31e4662d081558b52987845dea65a13ccab8b4 Mon Sep 17 00:00:00 2001 From: julian Date: Thu, 30 Jan 2025 09:49:01 -0600 Subject: [PATCH 051/193] desktop single coin wallet delete ui fix --- lib/pages/wallets_view/wallets_overview.dart | 2 +- lib/services/event_bus/events/wallet_added_event.dart | 2 +- lib/services/wallets.dart | 8 +++++++- 3 files changed, 9 insertions(+), 3 deletions(-) diff --git a/lib/pages/wallets_view/wallets_overview.dart b/lib/pages/wallets_view/wallets_overview.dart index 2567a83cf..95e38b07d 100644 --- a/lib/pages/wallets_view/wallets_overview.dart +++ b/lib/pages/wallets_view/wallets_overview.dart @@ -187,7 +187,7 @@ class _EthWalletsOverviewState extends ConsumerState { updateWallets(); if (AppConfig.isSingleCoinApp) { - GlobalEventBus.instance.on().listen((_) { + GlobalEventBus.instance.on().listen((_) { updateWallets(); WidgetsBinding.instance.addPostFrameCallback((_) { if (mounted) { diff --git a/lib/services/event_bus/events/wallet_added_event.dart b/lib/services/event_bus/events/wallet_added_event.dart index 0407946fc..97b334169 100644 --- a/lib/services/event_bus/events/wallet_added_event.dart +++ b/lib/services/event_bus/events/wallet_added_event.dart @@ -1 +1 @@ -class WalletAddedEvent {} +class WalletsChangedEvent {} diff --git a/lib/services/wallets.dart b/lib/services/wallets.dart index c606a75cf..6defcf012 100644 --- a/lib/services/wallets.dart +++ b/lib/services/wallets.dart @@ -62,7 +62,9 @@ class Wallets { ); } _wallets[wallet.walletId] = wallet; - GlobalEventBus.instance.fire(WalletAddedEvent()); + if (AppConfig.isSingleCoinApp) { + GlobalEventBus.instance.fire(WalletsChangedEvent()); + } } Future deleteWallet( @@ -150,6 +152,10 @@ class Wallets { await mainDB.isar.writeTxn(() async { await mainDB.isar.walletInfo.deleteByWalletId(walletId); }); + + if (AppConfig.isSingleCoinApp) { + GlobalEventBus.instance.fire(WalletsChangedEvent()); + } } Future load(Prefs prefs, MainDB mainDB) async { From 1d9b2e39fef9f861d13a7835497f4fc205d57faf Mon Sep 17 00:00:00 2001 From: julian Date: Thu, 30 Jan 2025 10:20:47 -0600 Subject: [PATCH 052/193] update trocador api --- .../exchange/trocador/trocador_api.dart | 17 +++++++---------- 1 file changed, 7 insertions(+), 10 deletions(-) diff --git a/lib/services/exchange/trocador/trocador_api.dart b/lib/services/exchange/trocador/trocador_api.dart index 9b497a685..fa791d7d4 100644 --- a/lib/services/exchange/trocador/trocador_api.dart +++ b/lib/services/exchange/trocador/trocador_api.dart @@ -28,7 +28,7 @@ const kTrocadorApiKey = "8rFqf7QLxX1mUBiNPEMaLUpV2biz6n"; const kTrocadorRefCode = "9eHm9BkQfS"; abstract class TrocadorAPI { - static const String authority = "trocador.app"; + static const String authority = "api.trocador.app"; static const String onionAuthority = "trocadorfyhlu27aefre5u7zri66gudtzdyelymftvr4yjwcxhfaqsid.onion"; @@ -42,8 +42,8 @@ abstract class TrocadorAPI { Map? params, }) { return isOnion - ? Uri.http(onionAuthority, "api/$method", params) - : Uri.https(authority, "api/$method", params); + ? Uri.http(onionAuthority, method, params) + : Uri.https(authority, method, params); } static Future _makeGetRequest(Uri uri) async { @@ -52,7 +52,10 @@ abstract class TrocadorAPI { debugPrint("URI: $uri"); final response = await client.get( url: uri, - headers: {'Content-Type': 'application/json'}, + headers: { + "Content-Type": "application/json", + "API-KEY": kTrocadorApiKey, + }, proxyInfo: Prefs.instance.useTor ? TorService.sharedInstance.getProxyInfo() : null, @@ -83,7 +86,6 @@ abstract class TrocadorAPI { isOnion: isOnion, method: "coins", params: { - "api_key": kTrocadorApiKey, "ref": kTrocadorRefCode, }, ); @@ -123,7 +125,6 @@ abstract class TrocadorAPI { isOnion: isOnion, method: "trade", params: { - "api_key": kTrocadorApiKey, "ref": kTrocadorRefCode, "id": tradeId, }, @@ -155,7 +156,6 @@ abstract class TrocadorAPI { required String fromAmount, }) async { final params = { - "api_key": kTrocadorApiKey, "ref": kTrocadorRefCode, "ticker_from": fromTicker.toLowerCase(), "network_from": fromNetwork, @@ -180,7 +180,6 @@ abstract class TrocadorAPI { required String toAmount, }) async { final params = { - "api_key": kTrocadorApiKey, "ref": kTrocadorRefCode, "ticker_from": fromTicker.toLowerCase(), "network_from": fromNetwork, @@ -239,7 +238,6 @@ abstract class TrocadorAPI { required bool isFixedRate, }) async { final Map params = { - "api_key": kTrocadorApiKey, "ref": kTrocadorRefCode, "ticker_from": fromTicker.toLowerCase(), "network_from": fromNetwork, @@ -280,7 +278,6 @@ abstract class TrocadorAPI { required bool isFixedRate, }) async { final params = { - "api_key": kTrocadorApiKey, "ref": kTrocadorRefCode, "ticker_from": fromTicker.toLowerCase(), "network_from": fromNetwork, From 75f6e65fd932bb881968fe0f2d1588e3d22510fd Mon Sep 17 00:00:00 2001 From: julian Date: Fri, 31 Jan 2025 10:26:27 -0600 Subject: [PATCH 053/193] expose firo advanced features in dev options --- .../global_settings_view/hidden_settings.dart | 33 ++ lib/pages/wallet_view/wallet_view.dart | 34 ++ .../lelantus_coins/lelantus_coins_view.dart | 282 +++++--------- .../sub_widgets/desktop_wallet_features.dart | 22 ++ .../more_features/more_features_dialog.dart | 23 ++ .../sub_widgets/wallet_options_button.dart | 115 ------ .../spark_coins/spark_coins_view.dart | 347 +++++------------- lib/utilities/prefs.dart | 24 ++ lib/widgets/isar_collection_watcher_list.dart | 182 +++++++++ 9 files changed, 502 insertions(+), 560 deletions(-) create mode 100644 lib/widgets/isar_collection_watcher_list.dart diff --git a/lib/pages/settings_views/global_settings_view/hidden_settings.dart b/lib/pages/settings_views/global_settings_view/hidden_settings.dart index b389f31a3..c0ed42019 100644 --- a/lib/pages/settings_views/global_settings_view/hidden_settings.dart +++ b/lib/pages/settings_views/global_settings_view/hidden_settings.dart @@ -75,6 +75,39 @@ class HiddenSettings extends StatelessWidget { child: Column( crossAxisAlignment: CrossAxisAlignment.stretch, children: [ + Consumer( + builder: (_, ref, __) { + return GestureDetector( + onTap: () async { + ref + .read(prefsChangeNotifierProvider) + .advancedFiroFeatures = + !ref + .read(prefsChangeNotifierProvider) + .advancedFiroFeatures; + }, + child: RoundedWhiteContainer( + child: Text( + ref.watch( + prefsChangeNotifierProvider.select( + (s) => s.advancedFiroFeatures, + ), + ) + ? "Hide advanced Firo features" + : "Show advanced Firo features", + style: STextStyles.button(context).copyWith( + color: Theme.of(context) + .extension()! + .accentColorDark, + ), + ), + ), + ); + }, + ), + const SizedBox( + height: 12, + ), Consumer( builder: (_, ref, __) { return GestureDetector( diff --git a/lib/pages/wallet_view/wallet_view.dart b/lib/pages/wallet_view/wallet_view.dart index d3a98ef16..52d6e05a4 100644 --- a/lib/pages/wallet_view/wallet_view.dart +++ b/lib/pages/wallet_view/wallet_view.dart @@ -22,6 +22,8 @@ import '../../app_config.dart'; import '../../frost_route_generator.dart'; import '../../models/isar/exchange_cache/currency.dart'; import '../../notifications/show_flush_bar.dart'; +import '../../pages_desktop_specific/lelantus_coins/lelantus_coins_view.dart'; +import '../../pages_desktop_specific/spark_coins/spark_coins_view.dart'; import '../../providers/global/active_wallet_provider.dart'; import '../../providers/global/auto_swb_service_provider.dart'; import '../../providers/global/paynym_api_provider.dart'; @@ -1138,6 +1140,38 @@ class _WalletViewState extends ConsumerState { ); }, ), + if (wallet is FiroWallet && + ref.watch( + prefsChangeNotifierProvider.select( + (value) => value.advancedFiroFeatures, + ), + )) + WalletNavigationBarItemData( + label: "Lelantus coins", + icon: const CoinControlNavIcon(), + onTap: () { + Navigator.of(context).pushNamed( + LelantusCoinsView.routeName, + arguments: widget.walletId, + ); + }, + ), + if (wallet is FiroWallet && + ref.watch( + prefsChangeNotifierProvider.select( + (value) => value.advancedFiroFeatures, + ), + )) + WalletNavigationBarItemData( + label: "Spark coins", + icon: const CoinControlNavIcon(), + onTap: () { + Navigator.of(context).pushNamed( + SparkCoinsView.routeName, + arguments: widget.walletId, + ); + }, + ), if (!viewOnly && wallet is PaynymInterface) WalletNavigationBarItemData( label: "PayNym", diff --git a/lib/pages_desktop_specific/lelantus_coins/lelantus_coins_view.dart b/lib/pages_desktop_specific/lelantus_coins/lelantus_coins_view.dart index 61624a272..c08891aef 100644 --- a/lib/pages_desktop_specific/lelantus_coins/lelantus_coins_view.dart +++ b/lib/pages_desktop_specific/lelantus_coins/lelantus_coins_view.dart @@ -11,224 +11,122 @@ import 'package:flutter/material.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:flutter_svg/svg.dart'; -import 'package:isar/isar.dart'; + import '../../models/isar/models/isar_models.dart'; import '../../providers/db/main_db_provider.dart'; import '../../themes/stack_colors.dart'; import '../../utilities/assets.dart'; import '../../utilities/text_styles.dart'; +import '../../utilities/util.dart'; +import '../../widgets/background.dart'; +import '../../widgets/conditional_parent.dart'; import '../../widgets/custom_buttons/app_bar_icon_button.dart'; import '../../widgets/desktop/desktop_app_bar.dart'; import '../../widgets/desktop/desktop_scaffold.dart'; -import '../../widgets/rounded_white_container.dart'; +import '../../widgets/isar_collection_watcher_list.dart'; -class LelantusCoinsView extends ConsumerStatefulWidget { +class LelantusCoinsView extends ConsumerWidget { const LelantusCoinsView({ super.key, required this.walletId, }); + static const title = "Lelantus coins"; static const String routeName = "/lelantusCoinsView"; final String walletId; @override - ConsumerState createState() => _LelantusCoinsViewState(); -} - -class _LelantusCoinsViewState extends ConsumerState { - List _coins = []; - - Stream>? lelantusCoinsCollectionWatcher; - - void _onLelantusCoinsCollectionWatcherEvent(List coins) { - WidgetsBinding.instance.addPostFrameCallback((_) { - if (mounted) { - setState(() { - _coins = coins; - }); - } - }); - } - - @override - void initState() { - lelantusCoinsCollectionWatcher = ref - .read(mainDBProvider) - .isar - .lelantusCoins - .where() - .walletIdEqualTo(widget.walletId) - .sortByMintIndexDesc() - .watch(fireImmediately: true); - lelantusCoinsCollectionWatcher! - .listen((data) => _onLelantusCoinsCollectionWatcherEvent(data)); - - super.initState(); - } - - @override - void dispose() { - lelantusCoinsCollectionWatcher = null; - super.dispose(); - } - - @override - Widget build(BuildContext context) { - return DesktopScaffold( - appBar: DesktopAppBar( - background: Theme.of(context).extension()!.popupBG, - leading: Expanded( - child: Row( - children: [ - const SizedBox( - width: 32, - ), - AppBarIconButton( - size: 32, - color: Theme.of(context) - .extension()! - .textFieldDefaultBG, - shadows: const [], - icon: SvgPicture.asset( - Assets.svg.arrowLeft, - width: 18, - height: 18, - color: Theme.of(context) - .extension()! - .topNavIconPrimary, - ), - onPressed: Navigator.of(context).pop, - ), - const SizedBox( - width: 12, - ), - Text( - "Lelantus Coins", - style: STextStyles.desktopH3(context), - ), - const Spacer(), - ], - ), - ), - useSpacers: false, - isCompactHeight: true, - ), - body: Padding( - padding: const EdgeInsets.all(24), - child: Column( - children: [ - Padding( - padding: const EdgeInsets.all(4), - child: RoundedWhiteContainer( - child: Row( - children: [ - Expanded( - flex: 9, - child: Text( - "TXID", - style: STextStyles.itemSubtitle(context), - textAlign: TextAlign.left, - ), - ), - Expanded( - flex: 3, - child: Text( - "Value (sats)", - style: STextStyles.itemSubtitle(context), - textAlign: TextAlign.right, - ), - ), - Expanded( - flex: 2, - child: Text( - "Index", - style: STextStyles.itemSubtitle(context), - textAlign: TextAlign.right, - ), - ), - Expanded( - flex: 2, - child: Text( - "Is JMint", - style: STextStyles.itemSubtitle(context), - textAlign: TextAlign.right, - ), - ), - Expanded( - flex: 2, - child: Text( - "Used", - style: STextStyles.itemSubtitle(context), - textAlign: TextAlign.right, - ), + Widget build(BuildContext context, WidgetRef ref) { + return ConditionalParent( + condition: Util.isDesktop, + builder: (child) { + return DesktopScaffold( + appBar: DesktopAppBar( + background: Theme.of(context).extension()!.popupBG, + leading: Expanded( + child: Row( + children: [ + const SizedBox( + width: 32, + ), + AppBarIconButton( + size: 32, + color: Theme.of(context) + .extension()! + .textFieldDefaultBG, + shadows: const [], + icon: SvgPicture.asset( + Assets.svg.arrowLeft, + width: 18, + height: 18, + color: Theme.of(context) + .extension()! + .topNavIconPrimary, ), - ], - ), + onPressed: Navigator.of(context).pop, + ), + const SizedBox( + width: 12, + ), + Text( + title, + style: STextStyles.desktopH3(context), + ), + const Spacer(), + ], ), ), - Expanded( - child: ListView.separated( - shrinkWrap: true, - itemCount: _coins.length, - separatorBuilder: (_, __) => Container( - height: 1, - color: Theme.of(context) - .extension()! - .backgroundAppBar, + useSpacers: false, + isCompactHeight: true, + ), + body: Padding( + padding: const EdgeInsets.all(24), + child: child, + ), + ); + }, + child: ConditionalParent( + condition: !Util.isDesktop, + builder: (child) { + return Background( + child: Scaffold( + backgroundColor: + Theme.of(context).extension()!.background, + appBar: AppBar( + automaticallyImplyLeading: false, + leading: AppBarBackButton( + onPressed: () => Navigator.of(context).pop(), ), - itemBuilder: (_, index) => Padding( - padding: const EdgeInsets.all(4), - child: RoundedWhiteContainer( - child: Row( - mainAxisAlignment: MainAxisAlignment.spaceEvenly, - children: [ - Expanded( - flex: 9, - child: SelectableText( - _coins[index].txid, - style: STextStyles.itemSubtitle12(context), - ), - ), - Expanded( - flex: 3, - child: SelectableText( - _coins[index].value, - style: STextStyles.itemSubtitle12(context), - textAlign: TextAlign.right, - ), - ), - Expanded( - flex: 2, - child: SelectableText( - _coins[index].mintIndex.toString(), - style: STextStyles.itemSubtitle12(context), - textAlign: TextAlign.right, - ), - ), - Expanded( - flex: 2, - child: SelectableText( - _coins[index].isJMint.toString(), - style: STextStyles.itemSubtitle12(context), - textAlign: TextAlign.right, - ), - ), - Expanded( - flex: 2, - child: SelectableText( - _coins[index].isUsed.toString(), - style: STextStyles.itemSubtitle12(context), - textAlign: TextAlign.right, - ), - ), - ], - ), - ), + title: Text( + title, + style: STextStyles.navBarTitle(context), ), ), + body: SafeArea( + child: child, + ), ), - ], + ); + }, + child: IsarCollectionWatcherList( + itemName: title, + queryBuilder: () => ref + .read(mainDBProvider) + .isar + .lelantusCoins + .where() + .walletIdEqualTo(walletId) + .sortByMintIndexDesc(), + itemBuilder: (LelantusCoin? coin) { + return [ + ("TXID", coin?.txid ?? "", 9), + ("Value (sats)", coin?.value ?? "", 3), + ("Index", coin?.mintIndex.toString() ?? "", 2), + ("Is JMint", coin?.isJMint.toString() ?? "", 2), + ("Used", coin?.isUsed.toString() ?? "", 2), + ]; + }, ), ), ); diff --git a/lib/pages_desktop_specific/my_stack_view/wallet_view/sub_widgets/desktop_wallet_features.dart b/lib/pages_desktop_specific/my_stack_view/wallet_view/sub_widgets/desktop_wallet_features.dart index 2499d4754..be0f080b1 100644 --- a/lib/pages_desktop_specific/my_stack_view/wallet_view/sub_widgets/desktop_wallet_features.dart +++ b/lib/pages_desktop_specific/my_stack_view/wallet_view/sub_widgets/desktop_wallet_features.dart @@ -49,7 +49,9 @@ import '../../../cashfusion/desktop_cashfusion_view.dart'; import '../../../churning/desktop_churning_view.dart'; import '../../../coin_control/desktop_coin_control_view.dart'; import '../../../desktop_menu.dart'; +import '../../../lelantus_coins/lelantus_coins_view.dart'; import '../../../ordinals/desktop_ordinals_view.dart'; +import '../../../spark_coins/spark_coins_view.dart'; import '../desktop_wallet_view.dart'; import 'more_features/more_features_dialog.dart'; @@ -89,6 +91,8 @@ class _DesktopWalletFeaturesState extends ConsumerState { walletId: widget.walletId, onPaynymPressed: _onPaynymPressed, onCoinControlPressed: _onCoinControlPressed, + onLelantusCoinsPressed: _onLelantusCoinsPressed, + onSparkCoinsPressedPressed: _onSparkCoinsPressed, onAnonymizeAllPressed: _onAnonymizeAllPressed, onWhirlpoolPressed: _onWhirlpoolPressed, onOrdinalsPressed: _onOrdinalsPressed, @@ -112,6 +116,24 @@ class _DesktopWalletFeaturesState extends ConsumerState { ); } + void _onLelantusCoinsPressed() { + Navigator.of(context, rootNavigator: true).pop(); + + Navigator.of(context).pushNamed( + LelantusCoinsView.routeName, + arguments: widget.walletId, + ); + } + + void _onSparkCoinsPressed() { + Navigator.of(context, rootNavigator: true).pop(); + + Navigator.of(context).pushNamed( + SparkCoinsView.routeName, + arguments: widget.walletId, + ); + } + Future _onAnonymizeAllPressed() async { Navigator.of(context, rootNavigator: true).pop(); await showDialog( diff --git a/lib/pages_desktop_specific/my_stack_view/wallet_view/sub_widgets/more_features/more_features_dialog.dart b/lib/pages_desktop_specific/my_stack_view/wallet_view/sub_widgets/more_features/more_features_dialog.dart index 0869b0b50..a046f6d12 100644 --- a/lib/pages_desktop_specific/my_stack_view/wallet_view/sub_widgets/more_features/more_features_dialog.dart +++ b/lib/pages_desktop_specific/my_stack_view/wallet_view/sub_widgets/more_features/more_features_dialog.dart @@ -24,6 +24,7 @@ import '../../../../../utilities/text_styles.dart'; import '../../../../../wallets/crypto_currency/crypto_currency.dart'; import '../../../../../wallets/isar/models/wallet_info.dart'; import '../../../../../wallets/isar/providers/wallet_info_provider.dart'; +import '../../../../../wallets/wallet/impl/firo_wallet.dart'; import '../../../../../wallets/wallet/intermediate/lib_monero_wallet.dart'; import '../../../../../wallets/wallet/wallet_mixin_interfaces/cash_fusion_interface.dart'; import '../../../../../wallets/wallet/wallet_mixin_interfaces/coin_control_interface.dart'; @@ -46,6 +47,8 @@ class MoreFeaturesDialog extends ConsumerStatefulWidget { required this.walletId, required this.onPaynymPressed, required this.onCoinControlPressed, + required this.onLelantusCoinsPressed, + required this.onSparkCoinsPressedPressed, required this.onAnonymizeAllPressed, required this.onWhirlpoolPressed, required this.onOrdinalsPressed, @@ -57,6 +60,8 @@ class MoreFeaturesDialog extends ConsumerStatefulWidget { final String walletId; final VoidCallback? onPaynymPressed; final VoidCallback? onCoinControlPressed; + final VoidCallback? onLelantusCoinsPressed; + final VoidCallback? onSparkCoinsPressedPressed; final VoidCallback? onAnonymizeAllPressed; final VoidCallback? onWhirlpoolPressed; final VoidCallback? onOrdinalsPressed; @@ -287,6 +292,24 @@ class _MoreFeaturesDialogState extends ConsumerState { iconAsset: Assets.svg.coinControl.gamePad, onPressed: () async => widget.onCoinControlPressed?.call(), ), + if (wallet is FiroWallet && + ref.watch(prefsChangeNotifierProvider + .select((s) => s.advancedFiroFeatures))) + _MoreFeaturesItem( + label: "Lelantus Coins", + detail: "View wallet lelantus coins", + iconAsset: Assets.svg.coinControl.gamePad, + onPressed: () async => widget.onLelantusCoinsPressed?.call(), + ), + if (wallet is FiroWallet && + ref.watch(prefsChangeNotifierProvider + .select((s) => s.advancedFiroFeatures))) + _MoreFeaturesItem( + label: "Spark Coins", + detail: "View wallet spark coins", + iconAsset: Assets.svg.coinControl.gamePad, + onPressed: () async => widget.onSparkCoinsPressedPressed?.call(), + ), if (!isViewOnly && wallet is PaynymInterface) _MoreFeaturesItem( label: "PayNym", diff --git a/lib/pages_desktop_specific/my_stack_view/wallet_view/sub_widgets/wallet_options_button.dart b/lib/pages_desktop_specific/my_stack_view/wallet_view/sub_widgets/wallet_options_button.dart index f0756370f..47b590a61 100644 --- a/lib/pages_desktop_specific/my_stack_view/wallet_view/sub_widgets/wallet_options_button.dart +++ b/lib/pages_desktop_specific/my_stack_view/wallet_view/sub_widgets/wallet_options_button.dart @@ -10,7 +10,6 @@ import 'dart:async'; -import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:flutter_svg/svg.dart'; @@ -27,7 +26,6 @@ import '../../../../utilities/constants.dart'; import '../../../../utilities/show_loading.dart'; import '../../../../utilities/text_styles.dart'; import '../../../../utilities/util.dart'; -import '../../../../wallets/crypto_currency/coins/firo.dart'; import '../../../../wallets/crypto_currency/intermediate/frost_currency.dart'; import '../../../../wallets/crypto_currency/intermediate/nano_currency.dart'; import '../../../../wallets/isar/providers/wallet_info_provider.dart'; @@ -35,8 +33,6 @@ import '../../../../wallets/wallet/intermediate/lib_monero_wallet.dart'; import '../../../../wallets/wallet/wallet_mixin_interfaces/extended_keys_interface.dart'; import '../../../../wallets/wallet/wallet_mixin_interfaces/view_only_option_interface.dart'; import '../../../addresses/desktop_wallet_addresses_view.dart'; -import '../../../lelantus_coins/lelantus_coins_view.dart'; -import '../../../spark_coins/spark_coins_view.dart'; import 'desktop_delete_wallet_dialog.dart'; enum _WalletOptions { @@ -44,8 +40,6 @@ enum _WalletOptions { deleteWallet, changeRepresentative, showXpub, - lelantusCoins, - sparkCoins, frostOptions, refreshFromHeight; @@ -59,10 +53,6 @@ enum _WalletOptions { return "Change representative"; case _WalletOptions.showXpub: return "Show xPub"; - case _WalletOptions.lelantusCoins: - return "Lelantus Coins"; - case _WalletOptions.sparkCoins: - return "Spark Coins"; case _WalletOptions.frostOptions: return "FROST settings"; case _WalletOptions.refreshFromHeight: @@ -107,12 +97,6 @@ class WalletOptionsButton extends ConsumerWidget { onShowXpubPressed: () async { Navigator.of(context).pop(_WalletOptions.showXpub); }, - onFiroShowLelantusCoins: () async { - Navigator.of(context).pop(_WalletOptions.lelantusCoins); - }, - onFiroShowSparkCoins: () async { - Navigator.of(context).pop(_WalletOptions.sparkCoins); - }, onFrostMSWalletOptionsPressed: () async { Navigator.of(context).pop(_WalletOptions.frostOptions); }, @@ -225,24 +209,6 @@ class WalletOptionsButton extends ConsumerWidget { } break; - case _WalletOptions.lelantusCoins: - unawaited( - Navigator.of(context).pushNamed( - LelantusCoinsView.routeName, - arguments: walletId, - ), - ); - break; - - case _WalletOptions.sparkCoins: - unawaited( - Navigator.of(context).pushNamed( - SparkCoinsView.routeName, - arguments: walletId, - ), - ); - break; - case _WalletOptions.frostOptions: unawaited( Navigator.of(context).pushNamed( @@ -303,8 +269,6 @@ class WalletOptionsPopupMenu extends ConsumerWidget { required this.onAddressListPressed, required this.onShowXpubPressed, required this.onChangeRepPressed, - required this.onFiroShowLelantusCoins, - required this.onFiroShowSparkCoins, required this.onFrostMSWalletOptionsPressed, required this.onRefreshHeightPressed, required this.walletId, @@ -314,8 +278,6 @@ class WalletOptionsPopupMenu extends ConsumerWidget { final VoidCallback onAddressListPressed; final VoidCallback onShowXpubPressed; final VoidCallback onChangeRepPressed; - final VoidCallback onFiroShowLelantusCoins; - final VoidCallback onFiroShowSparkCoins; final VoidCallback onFrostMSWalletOptionsPressed; final VoidCallback onRefreshHeightPressed; final String walletId; @@ -324,14 +286,11 @@ class WalletOptionsPopupMenu extends ConsumerWidget { Widget build(BuildContext context, WidgetRef ref) { final coin = ref.watch(pWalletCoin(walletId)); - bool firoDebug = kDebugMode && (coin is Firo); - final wallet = ref.watch(pWallets).getWallet(walletId); bool xpubEnabled = wallet is ExtendedKeysInterface; if (wallet is ViewOnlyOptionInterface && wallet.isViewOnly) { xpubEnabled = false; - firoDebug = false; } final bool canChangeRep = coin is NanoCurrency; @@ -429,80 +388,6 @@ class WalletOptionsPopupMenu extends ConsumerWidget { ), ), ), - if (firoDebug) - const SizedBox( - height: 8, - ), - if (firoDebug) - TransparentButton( - onPressed: onFiroShowLelantusCoins, - child: Padding( - padding: const EdgeInsets.all(8), - child: Row( - mainAxisAlignment: MainAxisAlignment.start, - children: [ - SvgPicture.asset( - Assets.svg.eye, - width: 20, - height: 20, - color: Theme.of(context) - .extension()! - .textFieldActiveSearchIconLeft, - ), - const SizedBox(width: 14), - Expanded( - child: Text( - _WalletOptions.lelantusCoins.prettyName, - style: STextStyles.desktopTextExtraExtraSmall( - context, - ).copyWith( - color: Theme.of(context) - .extension()! - .textDark, - ), - ), - ), - ], - ), - ), - ), - if (firoDebug) - const SizedBox( - height: 8, - ), - if (firoDebug) - TransparentButton( - onPressed: onFiroShowSparkCoins, - child: Padding( - padding: const EdgeInsets.all(8), - child: Row( - mainAxisAlignment: MainAxisAlignment.start, - children: [ - SvgPicture.asset( - Assets.svg.eye, - width: 20, - height: 20, - color: Theme.of(context) - .extension()! - .textFieldActiveSearchIconLeft, - ), - const SizedBox(width: 14), - Expanded( - child: Text( - _WalletOptions.sparkCoins.prettyName, - style: STextStyles.desktopTextExtraExtraSmall( - context, - ).copyWith( - color: Theme.of(context) - .extension()! - .textDark, - ), - ), - ), - ], - ), - ), - ), if (isFrost) const SizedBox( height: 8, diff --git a/lib/pages_desktop_specific/spark_coins/spark_coins_view.dart b/lib/pages_desktop_specific/spark_coins/spark_coins_view.dart index 43ba62a6a..8a937fab3 100644 --- a/lib/pages_desktop_specific/spark_coins/spark_coins_view.dart +++ b/lib/pages_desktop_specific/spark_coins/spark_coins_view.dart @@ -11,285 +11,126 @@ import 'package:flutter/material.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:flutter_svg/svg.dart'; -import 'package:isar/isar.dart'; + import '../../providers/db/main_db_provider.dart'; import '../../themes/stack_colors.dart'; import '../../utilities/assets.dart'; import '../../utilities/text_styles.dart'; +import '../../utilities/util.dart'; import '../../wallets/isar/models/spark_coin.dart'; +import '../../widgets/background.dart'; +import '../../widgets/conditional_parent.dart'; import '../../widgets/custom_buttons/app_bar_icon_button.dart'; import '../../widgets/desktop/desktop_app_bar.dart'; import '../../widgets/desktop/desktop_scaffold.dart'; -import '../../widgets/rounded_white_container.dart'; +import '../../widgets/isar_collection_watcher_list.dart'; -class SparkCoinsView extends ConsumerStatefulWidget { +class SparkCoinsView extends ConsumerWidget { const SparkCoinsView({ super.key, required this.walletId, }); + static const title = "Spark coins"; static const String routeName = "/sparkCoinsView"; final String walletId; @override - ConsumerState createState() => _SparkCoinsViewState(); -} - -class _SparkCoinsViewState extends ConsumerState { - List _coins = []; - - Stream>? sparkCoinsCollectionWatcher; - - void _onSparkCoinsCollectionWatcherEvent(List coins) { - WidgetsBinding.instance.addPostFrameCallback((_) { - if (mounted) { - setState(() { - _coins = coins; - }); - } - }); - } - - @override - void initState() { - sparkCoinsCollectionWatcher = ref - .read(mainDBProvider) - .isar - .sparkCoins - .where() - .walletIdEqualToAnyLTagHash(widget.walletId) - .sortByHeightDesc() - .watch(fireImmediately: true); - sparkCoinsCollectionWatcher! - .listen((data) => _onSparkCoinsCollectionWatcherEvent(data)); - - super.initState(); - } - - @override - void dispose() { - sparkCoinsCollectionWatcher = null; - super.dispose(); - } - - @override - Widget build(BuildContext context) { - return DesktopScaffold( - appBar: DesktopAppBar( - background: Theme.of(context).extension()!.popupBG, - leading: Expanded( - child: Row( - children: [ - const SizedBox( - width: 32, - ), - AppBarIconButton( - size: 32, - color: Theme.of(context) - .extension()! - .textFieldDefaultBG, - shadows: const [], - icon: SvgPicture.asset( - Assets.svg.arrowLeft, - width: 18, - height: 18, - color: Theme.of(context) - .extension()! - .topNavIconPrimary, - ), - onPressed: Navigator.of(context).pop, - ), - const SizedBox( - width: 12, - ), - Text( - "Spark Coins", - style: STextStyles.desktopH3(context), - ), - const Spacer(), - ], - ), - ), - useSpacers: false, - isCompactHeight: true, - ), - body: Padding( - padding: const EdgeInsets.all(24), - child: Column( - children: [ - Padding( - padding: const EdgeInsets.all(4), - child: RoundedWhiteContainer( - child: Row( - children: [ - Expanded( - flex: 9, - child: Text( - "TXID", - style: STextStyles.itemSubtitle(context), - textAlign: TextAlign.left, - ), - ), - Expanded( - flex: 9, - child: Text( - "LTag Hash", - style: STextStyles.itemSubtitle(context), - textAlign: TextAlign.left, - ), - ), - Expanded( - flex: 9, - child: Text( - "Address", - style: STextStyles.itemSubtitle(context), - textAlign: TextAlign.left, - ), - ), - Expanded( - flex: 4, - child: Text( - "Memo", - style: STextStyles.itemSubtitle(context), - textAlign: TextAlign.left, - ), - ), - Expanded( - flex: 3, - child: Text( - "Value (sats)", - style: STextStyles.itemSubtitle(context), - textAlign: TextAlign.right, - ), - ), - Expanded( - flex: 2, - child: Text( - "Height", - style: STextStyles.itemSubtitle(context), - textAlign: TextAlign.right, - ), - ), - Expanded( - flex: 2, - child: Text( - "Group Id", - style: STextStyles.itemSubtitle(context), - textAlign: TextAlign.right, - ), - ), - Expanded( - flex: 2, - child: Text( - "Type", - style: STextStyles.itemSubtitle(context), - textAlign: TextAlign.right, - ), - ), - Expanded( - flex: 2, - child: Text( - "Used", - style: STextStyles.itemSubtitle(context), - textAlign: TextAlign.right, - ), + Widget build(BuildContext context, WidgetRef ref) { + return ConditionalParent( + condition: Util.isDesktop, + builder: (child) { + return DesktopScaffold( + appBar: DesktopAppBar( + background: Theme.of(context).extension()!.popupBG, + leading: Expanded( + child: Row( + children: [ + const SizedBox( + width: 32, + ), + AppBarIconButton( + size: 32, + color: Theme.of(context) + .extension()! + .textFieldDefaultBG, + shadows: const [], + icon: SvgPicture.asset( + Assets.svg.arrowLeft, + width: 18, + height: 18, + color: Theme.of(context) + .extension()! + .topNavIconPrimary, ), - ], - ), + onPressed: Navigator.of(context).pop, + ), + const SizedBox( + width: 12, + ), + Text( + title, + style: STextStyles.desktopH3(context), + ), + const Spacer(), + ], ), ), - Expanded( - child: ListView.separated( - shrinkWrap: true, - itemCount: _coins.length, - separatorBuilder: (_, __) => Container( - height: 1, - color: Theme.of(context) - .extension()! - .backgroundAppBar, + useSpacers: false, + isCompactHeight: true, + ), + body: Padding( + padding: const EdgeInsets.all(24), + child: child, + ), + ); + }, + child: ConditionalParent( + condition: !Util.isDesktop, + builder: (child) { + return Background( + child: Scaffold( + backgroundColor: + Theme.of(context).extension()!.background, + appBar: AppBar( + automaticallyImplyLeading: false, + leading: AppBarBackButton( + onPressed: () => Navigator.of(context).pop(), ), - itemBuilder: (_, index) => Padding( - padding: const EdgeInsets.all(4), - child: RoundedWhiteContainer( - child: Row( - mainAxisAlignment: MainAxisAlignment.spaceEvenly, - children: [ - Expanded( - flex: 9, - child: SelectableText( - _coins[index].txHash, - style: STextStyles.itemSubtitle12(context), - ), - ), - Expanded( - flex: 9, - child: SelectableText( - _coins[index].lTagHash, - style: STextStyles.itemSubtitle12(context), - ), - ), - Expanded( - flex: 9, - child: SelectableText( - _coins[index].address, - style: STextStyles.itemSubtitle12(context), - ), - ), - Expanded( - flex: 4, - child: SelectableText( - _coins[index].memo ?? "", - style: STextStyles.itemSubtitle12(context), - ), - ), - Expanded( - flex: 3, - child: SelectableText( - _coins[index].value.toString(), - style: STextStyles.itemSubtitle12(context), - textAlign: TextAlign.right, - ), - ), - Expanded( - flex: 2, - child: SelectableText( - _coins[index].height.toString(), - style: STextStyles.itemSubtitle12(context), - textAlign: TextAlign.right, - ), - ), - Expanded( - flex: 2, - child: SelectableText( - _coins[index].groupId.toString(), - style: STextStyles.itemSubtitle12(context), - textAlign: TextAlign.right, - ), - ), - Expanded( - flex: 2, - child: SelectableText( - _coins[index].type.name, - style: STextStyles.itemSubtitle12(context), - textAlign: TextAlign.right, - ), - ), - Expanded( - flex: 2, - child: SelectableText( - _coins[index].isUsed.toString(), - style: STextStyles.itemSubtitle12(context), - textAlign: TextAlign.right, - ), - ), - ], - ), - ), + title: Text( + title, + style: STextStyles.navBarTitle(context), ), ), + body: SafeArea( + child: child, + ), ), - ], + ); + }, + child: IsarCollectionWatcherList( + itemName: title, + queryBuilder: () => ref + .read(mainDBProvider) + .isar + .sparkCoins + .where() + .walletIdEqualToAnyLTagHash(walletId) + .sortByHeightDesc(), + itemBuilder: (SparkCoin? coin) { + return [ + ("TXID", coin?.txHash ?? "", 9), + ("LTag Hash", coin?.lTagHash ?? "", 9), + ("Address", coin?.address ?? "", 9), + ("Memo", coin?.memo ?? "", 4), + ("Value (sats)", coin?.value.toString() ?? "", 3), + ("Height", coin?.height.toString() ?? "", 2), + ("Group ID", coin?.groupId.toString() ?? "", 2), + ("Type", coin?.type.name ?? "", 2), + ("Used", coin?.isUsed.toString() ?? "", 2), + ]; + }, ), ), ); diff --git a/lib/utilities/prefs.dart b/lib/utilities/prefs.dart index 5ffc7a059..0bc2dcc43 100644 --- a/lib/utilities/prefs.dart +++ b/lib/utilities/prefs.dart @@ -72,6 +72,7 @@ class Prefs extends ChangeNotifier { _fusionServerInfo = await _getFusionServerInfo(); _autoPin = await _getAutoPin(); _enableExchange = await _getEnableExchange(); + _advancedFiroFeatures = await _getAdvancedFiroFeatures(); _initialized = true; } @@ -1158,4 +1159,27 @@ class Prefs extends ChangeNotifier { ) as bool? ?? true; } + + // Show/hide lelantus and spark coins. Defaults to false + bool _advancedFiroFeatures = false; + bool get advancedFiroFeatures => _advancedFiroFeatures; + set advancedFiroFeatures(bool advancedFiroFeatures) { + if (_advancedFiroFeatures != advancedFiroFeatures) { + DB.instance.put( + boxName: DB.boxNamePrefs, + key: "advancedFiroFeatures", + value: advancedFiroFeatures, + ); + _advancedFiroFeatures = advancedFiroFeatures; + notifyListeners(); + } + } + + Future _getAdvancedFiroFeatures() async { + return await DB.instance.get( + boxName: DB.boxNamePrefs, + key: "advancedFiroFeatures", + ) as bool? ?? + false; + } } diff --git a/lib/widgets/isar_collection_watcher_list.dart b/lib/widgets/isar_collection_watcher_list.dart new file mode 100644 index 000000000..bd4c2596e --- /dev/null +++ b/lib/widgets/isar_collection_watcher_list.dart @@ -0,0 +1,182 @@ +/* + * This file is part of Stack Wallet. + * + * Copyright (c) 2023 Cypher Stack + * All Rights Reserved. + * The code is distributed under GPLv3 license, see LICENSE file for details. + * Generated by Cypher Stack on 2023-05-26 + * + */ + +import 'dart:async'; + +import 'package:flutter/material.dart'; +import 'package:isar/isar.dart'; + +import '../../themes/stack_colors.dart'; +import '../../utilities/text_styles.dart'; +import '../../widgets/rounded_white_container.dart'; +import '../utilities/util.dart'; +import 'detail_item.dart'; + +class IsarCollectionWatcherList extends StatefulWidget { + const IsarCollectionWatcherList({ + super.key, + required this.queryBuilder, + required this.itemBuilder, + required this.itemName, + }); + + final String itemName; + final QueryBuilder Function() queryBuilder; + final List<(String title, String value, int flex)> Function(T?) itemBuilder; + + @override + State> createState() => + _IsarCollectionWatcherListState(); +} + +class _IsarCollectionWatcherListState + extends State> { + List _items = []; + + Stream>? sparkCoinsCollectionWatcher; + + late final StreamSubscription> _streamSubscription; + + void _onSparkCoinsCollectionWatcherEvent(List items) { + WidgetsBinding.instance.addPostFrameCallback((_) { + if (mounted) { + setState(() { + _items = items; + }); + } + }); + } + + @override + void initState() { + super.initState(); + + sparkCoinsCollectionWatcher = + widget.queryBuilder().watch(fireImmediately: true); + _streamSubscription = sparkCoinsCollectionWatcher! + .listen((data) => _onSparkCoinsCollectionWatcherEvent(data)); + } + + @override + void dispose() { + _streamSubscription.cancel(); + super.dispose(); + } + + @override + Widget build(BuildContext context) { + if (Util.isDesktop) { + return Column( + children: [ + Padding( + padding: const EdgeInsets.all(4), + child: RoundedWhiteContainer( + child: Row( + children: [ + Text( + "Total ${widget.itemName}: ${_items.length}", + style: STextStyles.itemSubtitle(context), + textAlign: TextAlign.left, + ), + ], + ), + ), + ), + Padding( + padding: const EdgeInsets.all(4), + child: RoundedWhiteContainer( + child: Row( + children: [ + ...widget.itemBuilder(null).map( + (e) => Expanded( + flex: e.$3, + child: Text( + e.$1, + style: STextStyles.itemSubtitle(context), + textAlign: TextAlign.left, + ), + ), + ), + ], + ), + ), + ), + Expanded( + child: ListView.separated( + shrinkWrap: true, + itemCount: _items.length, + separatorBuilder: (_, __) => Container( + height: 1, + color: Theme.of(context) + .extension()! + .backgroundAppBar, + ), + itemBuilder: (_, index) => Padding( + padding: const EdgeInsets.all(4), + child: RoundedWhiteContainer( + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceEvenly, + children: [ + ...widget.itemBuilder(_items[index]).map( + (e) => Expanded( + flex: e.$3, + child: SelectableText( + e.$2, + style: STextStyles.itemSubtitle12(context), + textAlign: TextAlign.left, + ), + ), + ), + ], + ), + ), + ), + ), + ), + ], + ); + } else { + return ListView.builder( + itemCount: _items.length + 1, + itemBuilder: (ctx, index) { + return Padding( + padding: const EdgeInsets.only( + bottom: 16, + left: 16, + right: 16, + ), + child: RoundedWhiteContainer( + child: index == 0 + ? Row( + children: [ + Text( + "Total ${widget.itemName}: ${_items.length}", + style: STextStyles.itemSubtitle(context), + ), + ], + ) + : Column( + mainAxisSize: MainAxisSize.min, + children: [ + ...widget.itemBuilder(_items[index - 1]).map( + (e) => DetailItem( + title: e.$1, + detail: e.$2, + ), + ), + ], + ), + ), + ); + }, + ); + } + } +} From 90e421174ab39c1ed72756b7cc6fcb709a49ea7a Mon Sep 17 00:00:00 2001 From: julian Date: Fri, 31 Jan 2025 12:46:40 -0600 Subject: [PATCH 054/193] option to rescan on lelantus scanning enable --- .../lelantus_settings_view.dart | 89 ++++++++++++ .../more_features/more_features_dialog.dart | 129 ++++++++++++++++++ 2 files changed, 218 insertions(+) diff --git a/lib/pages/settings_views/wallet_settings_view/wallet_settings_wallet_settings/lelantus_settings_view.dart b/lib/pages/settings_views/wallet_settings_view/wallet_settings_wallet_settings/lelantus_settings_view.dart index 56e726731..f0ebcfbf0 100644 --- a/lib/pages/settings_views/wallet_settings_view/wallet_settings_wallet_settings/lelantus_settings_view.dart +++ b/lib/pages/settings_views/wallet_settings_view/wallet_settings_wallet_settings/lelantus_settings_view.dart @@ -8,17 +8,27 @@ * */ +import 'dart:io'; + import 'package:flutter/material.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:wakelock_plus/wakelock_plus.dart'; import '../../../../providers/db/main_db_provider.dart'; +import '../../../../providers/global/wallets_provider.dart'; import '../../../../themes/stack_colors.dart'; +import '../../../../utilities/logger.dart'; +import '../../../../utilities/show_loading.dart'; import '../../../../utilities/text_styles.dart'; +import '../../../../utilities/util.dart'; import '../../../../wallets/isar/models/wallet_info.dart'; import '../../../../wallets/isar/providers/wallet_info_provider.dart'; import '../../../../widgets/background.dart'; import '../../../../widgets/custom_buttons/app_bar_icon_button.dart'; import '../../../../widgets/custom_buttons/draggable_switch_button.dart'; +import '../../../../widgets/desktop/primary_button.dart'; +import '../../../../widgets/desktop/secondary_button.dart'; +import '../../../../widgets/stack_dialog.dart'; class LelantusSettingsView extends ConsumerStatefulWidget { const LelantusSettingsView({ @@ -50,12 +60,91 @@ class _LelantusSettingsViewState extends ConsumerState { }, isar: ref.read(mainDBProvider).isar, ); + if (newValue) { + await _doRescanMaybe(); + } } finally { // ensure _isUpdatingLelantusScanning is set to false no matter what _isUpdatingLelantusScanning = false; } } + Future _doRescanMaybe() async { + final shouldRescan = await showDialog( + context: context, + builder: (context) { + return StackDialog( + title: "Rescan may be required", + message: "A blockchain rescan may be required to fully recover all " + "lelantus history. This may take a while.", + leftButton: SecondaryButton( + label: "Rescan now", + onPressed: () { + Navigator.of(context).pop(true); + }, + ), + rightButton: PrimaryButton( + label: "Later", + onPressed: () => Navigator.of(context).pop(false), + ), + ); + }, + ); + + if (mounted && shouldRescan == true) { + try { + if (!Platform.isLinux) await WakelockPlus.enable(); + + Exception? e; + if (mounted) { + await showLoading( + whileFuture: ref.read(pWallets).getWallet(widget.walletId).recover( + isRescan: true, + ), + context: context, + message: "Rescanning blockchain", + subMessage: "This may take a while." + "\nPlease do not exit this screen.", + rootNavigator: Util.isDesktop, + onException: (ex) => e = ex, + ); + + if (e != null) { + throw e!; + } + } + } catch (e, s) { + Logging.instance.log("$e\n$s", level: LogLevel.Error); + if (mounted) { + // show error + await showDialog( + context: context, + useSafeArea: false, + barrierDismissible: true, + builder: (context) => StackDialog( + title: "Rescan failed", + message: e.toString(), + rightButton: TextButton( + style: Theme.of(context) + .extension()! + .getSecondaryEnabledButtonStyle(context), + child: Text( + "Ok", + style: STextStyles.itemSubtitle12(context), + ), + onPressed: () { + Navigator.of(context, rootNavigator: Util.isDesktop).pop(); + }, + ), + ), + ); + } + } finally { + if (!Platform.isLinux) await WakelockPlus.disable(); + } + } + } + @override Widget build(BuildContext context) { return Background( diff --git a/lib/pages_desktop_specific/my_stack_view/wallet_view/sub_widgets/more_features/more_features_dialog.dart b/lib/pages_desktop_specific/my_stack_view/wallet_view/sub_widgets/more_features/more_features_dialog.dart index a046f6d12..5559e45bc 100644 --- a/lib/pages_desktop_specific/my_stack_view/wallet_view/sub_widgets/more_features/more_features_dialog.dart +++ b/lib/pages_desktop_specific/my_stack_view/wallet_view/sub_widgets/more_features/more_features_dialog.dart @@ -8,9 +8,12 @@ * */ +import 'dart:io'; + import 'package:flutter/material.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:flutter_svg/flutter_svg.dart'; +import 'package:wakelock_plus/wakelock_plus.dart'; import '../../../../../app_config.dart'; import '../../../../../db/sqlite/firo_cache.dart'; @@ -20,7 +23,10 @@ import '../../../../../providers/global/prefs_provider.dart'; import '../../../../../providers/global/wallets_provider.dart'; import '../../../../../themes/stack_colors.dart'; import '../../../../../utilities/assets.dart'; +import '../../../../../utilities/logger.dart'; +import '../../../../../utilities/show_loading.dart'; import '../../../../../utilities/text_styles.dart'; +import '../../../../../utilities/util.dart'; import '../../../../../wallets/crypto_currency/crypto_currency.dart'; import '../../../../../wallets/isar/models/wallet_info.dart'; import '../../../../../wallets/isar/providers/wallet_info_provider.dart'; @@ -40,6 +46,7 @@ import '../../../../../widgets/desktop/desktop_dialog_close_button.dart'; import '../../../../../widgets/desktop/primary_button.dart'; import '../../../../../widgets/desktop/secondary_button.dart'; import '../../../../../widgets/rounded_container.dart'; +import '../../../../../widgets/stack_dialog.dart'; class MoreFeaturesDialog extends ConsumerStatefulWidget { const MoreFeaturesDialog({ @@ -88,6 +95,10 @@ class _MoreFeaturesDialogState extends ConsumerState { }, isar: ref.read(mainDBProvider).isar, ); + + if (newValue) { + await _doRescanMaybe(); + } } finally { // ensure _isUpdatingLelantusScanning is set to false no matter what _isUpdatingLelantusScanning = false; @@ -115,6 +126,124 @@ class _MoreFeaturesDialogState extends ConsumerState { } } + Future _doRescanMaybe() async { + final shouldRescan = await showDialog( + context: context, + builder: (context) { + return DesktopDialog( + maxWidth: 700, + child: Column( + children: [ + const DesktopDialogCloseButton(), + const SizedBox( + height: 5, + ), + Text( + "Rescan may be required", + style: STextStyles.desktopH2(context), + textAlign: TextAlign.left, + ), + const SizedBox( + height: 16, + ), + const Spacer(), + Text( + "A blockchain rescan may be required to fully recover all lelantus history." + "\nThis may take a while.", + style: STextStyles.desktopTextMedium(context).copyWith( + color: Theme.of(context).extension()!.textDark3, + ), + textAlign: TextAlign.center, + ), + const Spacer(), + Padding( + padding: const EdgeInsets.only( + left: 32, + right: 32, + bottom: 32, + ), + child: Row( + children: [ + Expanded( + child: SecondaryButton( + label: "Rescan now", + onPressed: () { + Navigator.of(context).pop(true); + }, + ), + ), + const SizedBox( + width: 16, + ), + Expanded( + child: PrimaryButton( + label: "Later", + onPressed: () => Navigator.of(context).pop(false), + ), + ), + ], + ), + ), + ], + ), + ); + }, + ); + + if (mounted && shouldRescan == true) { + try { + if (!Platform.isLinux) await WakelockPlus.enable(); + + Exception? e; + if (mounted) { + await showLoading( + whileFuture: ref.read(pWallets).getWallet(widget.walletId).recover( + isRescan: true, + ), + context: context, + message: "Rescanning blockchain", + subMessage: + "This may take a while.\nPlease do not exit this screen.", + rootNavigator: Util.isDesktop, + onException: (ex) => e = ex, + ); + + if (e != null) { + throw e!; + } + } + } catch (e, s) { + Logging.instance.log("$e\n$s", level: LogLevel.Error); + if (mounted) { + // show error + await showDialog( + context: context, + useSafeArea: false, + barrierDismissible: true, + builder: (context) => StackDialog( + title: "Rescan failed", + message: e.toString(), + rightButton: TextButton( + style: Theme.of(context) + .extension()! + .getSecondaryEnabledButtonStyle(context), + child: Text( + "Ok", + style: STextStyles.itemSubtitle12(context), + ), + onPressed: () { + Navigator.of(context, rootNavigator: Util.isDesktop).pop(); + }, + ), + ), + ); + } + } finally { + if (!Platform.isLinux) await WakelockPlus.disable(); + } + } + } + late final DSBController _switchController; bool _switchReuseAddressToggledLock = false; // Mutex. From de047339f8bd12c5e5c07025eec6db61fa782bc2 Mon Sep 17 00:00:00 2001 From: julian Date: Fri, 31 Jan 2025 20:42:26 -0600 Subject: [PATCH 055/193] WIP updated logging --- lib/db/db_version_migration.dart | 44 +- lib/main.dart | 41 +- .../advanced_settings_view.dart | 7 +- .../advanced_views/debug_view.dart | 609 ------------------ .../advanced_views/logging_settings_view.dart | 349 ++++++++++ .../global_settings_view/hidden_settings.dart | 69 +- .../wallet_settings_view.dart | 23 +- .../wallet_view/desktop_wallet_view.dart | 2 +- .../advanced_settings/advanced_settings.dart | 6 +- .../advanced_settings/debug_info_dialog.dart | 466 ++++---------- .../global/debug_service_provider.dart | 15 - lib/route_generator.dart | 6 +- lib/services/debug_service.dart | 125 ---- lib/services/price.dart | 7 +- lib/utilities/constants.dart | 2 +- lib/utilities/enums/log_level_enum.dart | 17 + lib/utilities/logger.dart | 346 ++++++---- lib/utilities/prefs.dart | 23 + lib/utilities/stack_file_system.dart | 37 +- lib/utilities/util.dart | 3 + lib/utilities/wallet_tools.dart | 31 +- .../spark_interface.dart | 73 ++- pubspec.lock | 19 +- scripts/app_config/templates/pubspec.template | 12 +- 24 files changed, 1032 insertions(+), 1300 deletions(-) delete mode 100644 lib/pages/settings_views/global_settings_view/advanced_views/debug_view.dart create mode 100644 lib/pages/settings_views/global_settings_view/advanced_views/logging_settings_view.dart delete mode 100644 lib/providers/global/debug_service_provider.dart delete mode 100644 lib/services/debug_service.dart diff --git a/lib/db/db_version_migration.dart b/lib/db/db_version_migration.dart index fcf632669..ea2bc6067 100644 --- a/lib/db/db_version_migration.dart +++ b/lib/db/db_version_migration.dart @@ -29,6 +29,8 @@ import '../utilities/constants.dart'; import '../utilities/flutter_secure_storage_interface.dart'; import '../utilities/logger.dart'; import '../utilities/prefs.dart'; +import '../utilities/stack_file_system.dart'; +import '../utilities/util.dart'; import '../wallets/crypto_currency/crypto_currency.dart'; import 'hive/db.dart'; import 'isar/main_db.dart'; @@ -144,7 +146,6 @@ class DbVersionMigrator with WalletDB { ), }); } - Logger.print("newcoins $coins", normalLength: false); await DB.instance.put( boxName: walletInfo.walletId, key: '_lelantus_coins', @@ -443,6 +444,20 @@ class DbVersionMigrator with WalletDB { // try to continue migrating return await migrate(13, secureStore: secureStore); + case 13: + // migrate + await _v13(secureStore); + + // update version + await DB.instance.put( + boxName: DB.boxNameDBInfo, + key: "hive_data_version", + value: 14, + ); + + // try to continue migrating + return await migrate(14, secureStore: secureStore); + default: // finally return return; @@ -734,4 +749,31 @@ class DbVersionMigrator with WalletDB { ); } } + + Future _v13(SecureStorageInterface secureStore) async { + if (!(Util.isArmLinux || Util.isTestEnv)) { + // open logs db + final isar = await Isar.open( + [isar_models.LogSchema], + directory: (await StackFileSystem.applicationIsarDirectory()).path, + inspector: false, + maxSizeMiB: 512, + ); + + // fetch all logs + final allLogs = await isar.logs.where().findAll(); + + // migrate to simple file based logs. Date/time may be out of order + for (final log in allLogs) { + Logging.instance.lg( + log.logLevel.getLoggerLevel(), + "MIGRATED LOG::=> ${log.message}", + time: DateTime.fromMillisecondsSinceEpoch(log.timestampInMillisUTC), + ); + } + + // finally delete logs db + await isar.close(deleteFromDisk: true); + } + } } diff --git a/lib/main.dart b/lib/main.dart index e2cae6f72..3ec3643f0 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -18,10 +18,10 @@ import 'package:cs_monero/cs_monero.dart' as lib_monero; import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; +import 'package:flutter_libsparkmobile/flutter_libsparkmobile.dart' as spark; import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:flutter_secure_storage/flutter_secure_storage.dart'; import 'package:google_fonts/google_fonts.dart'; -import 'package:isar/isar.dart'; import 'package:keyboard_dismisser/keyboard_dismisser.dart'; import 'package:path_provider/path_provider.dart'; import 'package:window_size/window_size.dart'; @@ -35,7 +35,6 @@ import 'db/sqlite/firo_cache.dart'; import 'models/exchange/change_now/exchange_transaction.dart'; import 'models/exchange/change_now/exchange_transaction_status.dart'; import 'models/exchange/response_objects/trade.dart'; -import 'models/isar/models/isar_models.dart'; import 'models/models.dart'; import 'models/node_model.dart'; import 'models/notification_model.dart'; @@ -56,8 +55,6 @@ import 'providers/global/base_currencies_provider.dart'; import 'providers/global/trades_service_provider.dart'; import 'providers/providers.dart'; import 'route_generator.dart'; -// import 'package:stackwallet/services/buy/buy_data_loading_service.dart'; -import 'services/debug_service.dart'; import 'services/exchange/exchange_data_loading_service.dart'; import 'services/locale_service.dart'; import 'services/node_service.dart'; @@ -118,19 +115,6 @@ void main(List args) async { } // FlutterNativeSplash.preserve(widgetsBinding: widgetsBinding); - if (!(Logging.isArmLinux || Logging.isTestEnv)) { - final isar = await Isar.open( - [LogSchema], - directory: (await StackFileSystem.applicationIsarDirectory()).path, - inspector: false, - maxSizeMiB: 512, - ); - await Logging.instance.init(isar); - await DebugService.instance.init(isar); - - // clear out all info logs on startup. No need to await and block - unawaited(DebugService.instance.deleteLogsOlderThan()); - } // Registering Transaction Model Adapters DB.instance.hive.registerAdapter(TransactionDataAdapter()); @@ -179,6 +163,27 @@ void main(List args) async { await DB.instance.hive.openBox(DB.boxNamePrefs); await Prefs.instance.init(); + await Logging.instance.initialize( + (await StackFileSystem.applicationLogsDirectory(Prefs.instance)).path, + ); + + spark.Log.levels.addAll(spark.LoggingLevel.values); + spark.Log.onLog = ( + level, + value, { + error, + stackTrace, + required time, + }) { + Logging.instance.lg( + level.getLoggerLevel(), + value, + error: error, + stackTrace: stackTrace, + time: time, + ); + }; + if (AppConfig.appName == "Campfire" && !Util.isDesktop && !CampfireMigration.didRun) { @@ -404,7 +409,7 @@ class _MaterialAppWithThemeState extends ConsumerState // .userID; // Just reading the ref should set it if it's not already set // We shouldn't need to do this, instead only generating an ID when (or if) the userID is looked up when creating a quote } catch (e, s) { - Logger.print("$e $s", normalLength: false); + Logging.instance.e("load failure", error: e, stackTrace: s); } } diff --git a/lib/pages/settings_views/global_settings_view/advanced_views/advanced_settings_view.dart b/lib/pages/settings_views/global_settings_view/advanced_views/advanced_settings_view.dart index 6f04cce80..d86f17526 100644 --- a/lib/pages/settings_views/global_settings_view/advanced_views/advanced_settings_view.dart +++ b/lib/pages/settings_views/global_settings_view/advanced_views/advanced_settings_view.dart @@ -23,7 +23,7 @@ import '../../../../widgets/custom_buttons/app_bar_icon_button.dart'; import '../../../../widgets/custom_buttons/draggable_switch_button.dart'; import '../../../../widgets/rounded_white_container.dart'; import '../../../stack_privacy_calls.dart'; -import 'debug_view.dart'; +import 'logging_settings_view.dart'; import 'manage_coin_units/manage_coin_units_view.dart'; import 'manage_explorer_view.dart'; @@ -68,7 +68,8 @@ class AdvancedSettingsView extends StatelessWidget { ), ), onPressed: () { - Navigator.of(context).pushNamed(DebugView.routeName); + Navigator.of(context) + .pushNamed(LoggingSettingsView.routeName); }, child: Padding( padding: const EdgeInsets.symmetric( @@ -78,7 +79,7 @@ class AdvancedSettingsView extends StatelessWidget { child: Row( children: [ Text( - "Debug info", + "Logging", style: STextStyles.titleBold12(context), textAlign: TextAlign.left, ), diff --git a/lib/pages/settings_views/global_settings_view/advanced_views/debug_view.dart b/lib/pages/settings_views/global_settings_view/advanced_views/debug_view.dart deleted file mode 100644 index 92e5cc256..000000000 --- a/lib/pages/settings_views/global_settings_view/advanced_views/debug_view.dart +++ /dev/null @@ -1,609 +0,0 @@ -/* - * This file is part of Stack Wallet. - * - * Copyright (c) 2023 Cypher Stack - * All Rights Reserved. - * The code is distributed under GPLv3 license, see LICENSE file for details. - * Generated by Cypher Stack on 2023-05-26 - * - */ - -import 'dart:async'; -import 'dart:convert'; -import 'dart:io'; - -import 'package:device_info_plus/device_info_plus.dart'; -import 'package:event_bus/event_bus.dart'; -import 'package:file_picker/file_picker.dart'; -import 'package:flutter/material.dart'; -import 'package:flutter/services.dart'; -import 'package:flutter_libepiccash/git_versions.dart' as EPIC_VERSIONS; -// import 'package:flutter_libmonero/git_versions.dart' as MONERO_VERSIONS; -import 'package:flutter_riverpod/flutter_riverpod.dart'; -import 'package:flutter_svg/svg.dart'; -import 'package:lelantus/git_versions.dart' as FIRO_VERSIONS; -import 'package:package_info_plus/package_info_plus.dart'; - -import '../../../../app_config.dart'; -import '../../../../models/isar/models/log.dart'; -import '../../../../notifications/show_flush_bar.dart'; -import '../../../../providers/global/debug_service_provider.dart'; -import '../../../../themes/stack_colors.dart'; -import '../../../../utilities/assets.dart'; -import '../../../../utilities/clipboard_interface.dart'; -import '../../../../utilities/constants.dart'; -import '../../../../utilities/logger.dart'; -import '../../../../utilities/stack_file_system.dart'; -import '../../../../utilities/text_styles.dart'; -import '../../../../utilities/util.dart'; -import '../../../../widgets/background.dart'; -import '../../../../widgets/custom_buttons/app_bar_icon_button.dart'; -import '../../../../widgets/custom_buttons/blue_text_button.dart'; -import '../../../../widgets/custom_loading_overlay.dart'; -import '../../../../widgets/icon_widgets/x_icon.dart'; -import '../../../../widgets/rounded_container.dart'; -import '../../../../widgets/stack_dialog.dart'; -import '../../../../widgets/stack_text_field.dart'; -import '../../../../widgets/textfield_icon_button.dart'; -import '../stack_backup_views/helpers/swb_file_system.dart'; - -class DebugView extends ConsumerStatefulWidget { - const DebugView({super.key}); - - static const String routeName = "/debug"; - - @override - ConsumerState createState() => _DebugViewState(); -} - -class _DebugViewState extends ConsumerState { - final _searchController = TextEditingController(); - final _searchFocusNode = FocusNode(); - - final scrollController = ScrollController(); - - String _searchTerm = ""; - - List filtered(List unfiltered, String filter) { - if (filter == "") { - return unfiltered; - } - return unfiltered - .where( - (e) => (e.toString().toLowerCase().contains(filter.toLowerCase())), - ) - .toList(); - } - - BorderRadius? _borderRadius(int index, int listLength) { - if (index == 0 && listLength == 1) { - return BorderRadius.circular( - Constants.size.circularBorderRadius, - ); - } else if (index == 0) { - return BorderRadius.vertical( - bottom: Radius.circular( - Constants.size.circularBorderRadius, - ), - ); - } else if (index == listLength - 1) { - return BorderRadius.vertical( - top: Radius.circular( - Constants.size.circularBorderRadius, - ), - ); - } - return null; - } - - @override - void initState() { - super.initState(); - } - - @override - void dispose() { - _searchController.dispose(); - scrollController.dispose(); - _searchFocusNode.dispose(); - super.dispose(); - } - - @override - Widget build(BuildContext context) { - return Background( - child: Scaffold( - backgroundColor: Theme.of(context).extension()!.background, - appBar: AppBar( - leading: AppBarBackButton( - onPressed: () async { - Navigator.of(context).pop(); - }, - ), - title: Text( - "Debug", - style: STextStyles.navBarTitle(context), - ), - actions: [ - Padding( - padding: const EdgeInsets.only( - top: 10, - bottom: 10, - right: 10, - ), - child: AspectRatio( - aspectRatio: 1, - child: AppBarIconButton( - key: const Key("deleteLogsAppBarButtonKey"), - size: 36, - shadows: const [], - color: Theme.of(context).extension()!.background, - icon: SvgPicture.asset( - Assets.svg.trash, - color: Theme.of(context) - .extension()! - .accentColorDark, - width: 20, - height: 20, - ), - onPressed: () async { - await showDialog( - context: context, - builder: (_) => StackDialog( - title: "Delete logs?", - message: - "You are about to delete all logs permanently. Are you sure?", - leftButton: TextButton( - style: Theme.of(context) - .extension()! - .getSecondaryEnabledButtonStyle(context), - child: Text( - "Cancel", - style: STextStyles.itemSubtitle12(context), - ), - onPressed: () { - Navigator.of(context).pop(); - }, - ), - rightButton: TextButton( - style: Theme.of(context) - .extension()! - .getPrimaryEnabledButtonStyle(context), - child: Text( - "Delete logs", - style: STextStyles.button(context), - ), - onPressed: () async { - Navigator.of(context).pop(); - - bool shouldPop = false; - unawaited( - showDialog( - barrierDismissible: false, - context: context, - builder: (_) => WillPopScope( - onWillPop: () async { - return shouldPop; - }, - child: const CustomLoadingOverlay( - message: "Deleting logs...", - eventBus: null, - ), - ), - ), - ); - - await ref - .read(debugServiceProvider) - .deleteAllLogs(); - - shouldPop = true; - - if (mounted) { - Navigator.pop(context); - unawaited( - showFloatingFlushBar( - type: FlushBarType.info, - context: context, - message: 'Logs cleared!', - ), - ); - - setState(() {}); - } - }, - ), - ), - ); - }, - ), - ), - ), - ], - ), - body: Padding( - padding: const EdgeInsets.only( - top: 12, - left: 16, - right: 16, - ), - child: NestedScrollView( - floatHeaderSlivers: true, - headerSliverBuilder: (context, innerBoxIsScrolled) { - return [ - SliverOverlapAbsorber( - handle: - NestedScrollView.sliverOverlapAbsorberHandleFor(context), - sliver: SliverToBoxAdapter( - child: Padding( - padding: const EdgeInsets.only(bottom: 16), - child: Column( - children: [ - ClipRRect( - borderRadius: BorderRadius.circular( - Constants.size.circularBorderRadius, - ), - child: TextField( - autocorrect: Util.isDesktop ? false : true, - enableSuggestions: Util.isDesktop ? false : true, - controller: _searchController, - focusNode: _searchFocusNode, - onChanged: (newString) { - setState(() => _searchTerm = newString); - }, - style: STextStyles.field(context), - decoration: standardInputDecoration( - "Search", - _searchFocusNode, - context, - ).copyWith( - prefixIcon: Padding( - padding: const EdgeInsets.symmetric( - horizontal: 10, - vertical: 16, - ), - child: SvgPicture.asset( - Assets.svg.search, - width: 16, - height: 16, - ), - ), - suffixIcon: _searchController.text.isNotEmpty - ? Padding( - padding: - const EdgeInsets.only(right: 0), - child: UnconstrainedBox( - child: Row( - children: [ - TextFieldIconButton( - child: const XIcon(), - onTap: () async { - setState(() { - _searchController.text = ""; - _searchTerm = ""; - }); - }, - ), - ], - ), - ), - ) - : null, - ), - ), - ), - const SizedBox( - height: 12, - ), - Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - CustomTextButton( - text: "Save Debug Info to clipboard", - onTap: () async { - try { - final packageInfo = - await PackageInfo.fromPlatform(); - final version = packageInfo.version; - final build = packageInfo.buildNumber; - final signature = - packageInfo.buildSignature; - final appName = packageInfo.appName; - final String firoCommit = - FIRO_VERSIONS.getPluginVersion(); - final String epicCashCommit = - EPIC_VERSIONS.getPluginVersion(); - // final String moneroCommit = - // MONERO_VERSIONS.getPluginVersion(); - final DeviceInfoPlugin deviceInfoPlugin = - DeviceInfoPlugin(); - final deviceInfo = - await deviceInfoPlugin.deviceInfo; - final deviceInfoMap = deviceInfo.toMap(); - deviceInfoMap.remove("systemFeatures"); - - final logs = filtered( - ref.watch( - debugServiceProvider.select( - (value) => value.recentLogs, - ), - ), - _searchTerm, - ).reversed.toList(growable: false); - final List errorLogs = []; - for (final log in logs) { - if (log.logLevel == LogLevel.Error || - log.logLevel == LogLevel.Fatal) { - errorLogs.add( - "${log.logLevel}: ${log.message}", - ); - } - } - - final finalDebugMap = { - "version": version, - "build": build, - "signature": signature, - "appName": appName, - "firoCommit": firoCommit, - "epicCashCommit": epicCashCommit, - // "moneroCommit": moneroCommit, - "deviceInfoMap": deviceInfoMap, - "errorLogs": errorLogs, - }; - Logging.instance.log( - json.encode(finalDebugMap), - level: LogLevel.Info, - printFullLength: true, - ); - const ClipboardInterface clipboard = - ClipboardWrapper(); - await clipboard.setData( - ClipboardData( - text: json.encode(finalDebugMap), - ), - ); - } catch (e, s) { - Logging.instance - .log("$e $s", level: LogLevel.Error); - } - }, - ), - const Spacer(), - CustomTextButton( - text: "Save logs to file", - onTap: () async { - final systemfile = SWBFileSystem(); - await systemfile.prepareStorage(); - Directory rootPath = await StackFileSystem - .applicationRootDirectory(); - - if (Platform.isAndroid) { - rootPath = - Directory("/storage/emulated/0/"); - } - - Directory dir = - Directory('${rootPath.path}/Documents'); - if (Platform.isIOS) { - dir = Directory(rootPath.path); - } - try { - if (!dir.existsSync()) { - dir.createSync(); - } - } catch (e, s) { - Logging.instance - .log("$e\n$s", level: LogLevel.Error); - } - String? path; - if (Platform.isAndroid) { - path = dir.path; - } else { - path = await FilePicker.platform - .getDirectoryPath( - dialogTitle: "Choose Log Save Location", - initialDirectory: - systemfile.startPath!.path, - lockParentWindow: true, - ); - } - - if (path != null) { - final eventBus = EventBus(); - bool shouldPop = false; - unawaited( - showDialog( - barrierDismissible: false, - context: context, - builder: (_) => WillPopScope( - onWillPop: () async { - return shouldPop; - }, - child: CustomLoadingOverlay( - message: - "Generating ${AppConfig.prefix} logs file", - eventBus: eventBus, - ), - ), - ), - ); - - bool logsSaved = true; - String? filename; - try { - filename = await ref - .read(debugServiceProvider) - .exportToFile(path, eventBus); - } catch (e, s) { - logsSaved = false; - Logging.instance - .log("$e $s", level: LogLevel.Error); - } - - shouldPop = true; - - if (mounted) { - Navigator.pop(context); - - if (Platform.isAndroid) { - unawaited( - showDialog( - context: context, - builder: (context) => StackOkDialog( - title: logsSaved - ? "Logs saved to" - : "Error Saving Logs", - message: "${path!}/$filename", - ), - ), - ); - } else { - unawaited( - showFloatingFlushBar( - type: FlushBarType.info, - context: context, - message: logsSaved - ? 'Logs file saved' - : "Error Saving Logs", - ), - ); - } - } - } - }, - ), - ], - ), - ], - ), - ), - ), - ), - ]; - }, - body: Builder( - builder: (context) { - final logs = filtered( - ref.watch( - debugServiceProvider.select((value) => value.recentLogs), - ), - _searchTerm, - ).reversed.toList(growable: false); - - return CustomScrollView( - reverse: true, - // shrinkWrap: true, - controller: scrollController, - slivers: [ - SliverOverlapInjector( - handle: NestedScrollView.sliverOverlapAbsorberHandleFor( - context, - ), - ), - SliverList( - delegate: SliverChildBuilderDelegate( - (context, index) { - final log = logs[index]; - - return Container( - key: Key( - "log_${log.id}_${log.timestampInMillisUTC}", - ), - decoration: BoxDecoration( - color: Theme.of(context) - .extension()! - .popupBG, - borderRadius: _borderRadius(index, logs.length), - ), - child: Padding( - padding: const EdgeInsets.all(4), - child: RoundedContainer( - padding: const EdgeInsets.all(0), - color: Theme.of(context) - .extension()! - .popupBG, - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Row( - children: [ - Text( - " [${log.logLevel.name}]", - style: STextStyles.baseXS(context) - .copyWith( - fontSize: 8, - color: (log.logLevel == - LogLevel.Info - ? Theme.of(context) - .extension()! - .topNavIconGreen - : (log.logLevel == - LogLevel.Warning - ? Theme.of(context) - .extension< - StackColors>()! - .topNavIconYellow - : (log.logLevel == - LogLevel.Error - ? Colors.orange - : Theme.of(context) - .extension< - StackColors>()! - .topNavIconRed))), - ), - ), - Text( - "[${DateTime.fromMillisecondsSinceEpoch(log.timestampInMillisUTC, isUtc: true)}]: ", - style: STextStyles.baseXS(context) - .copyWith( - fontSize: 8, - color: Theme.of(context) - .extension()! - .textDark3, - ), - ), - ], - ), - Row( - crossAxisAlignment: - CrossAxisAlignment.start, - children: [ - const SizedBox( - width: 20, - ), - Flexible( - child: Column( - crossAxisAlignment: - CrossAxisAlignment.start, - children: [ - SelectableText( - log.message, - style: - STextStyles.baseXS(context) - .copyWith(fontSize: 8), - ), - ], - ), - ), - ], - ), - ], - ), - ), - ), - ); - }, - childCount: logs.length, - ), - ), - ], - ); - }, - ), - ), - ), - ), - ); - } -} diff --git a/lib/pages/settings_views/global_settings_view/advanced_views/logging_settings_view.dart b/lib/pages/settings_views/global_settings_view/advanced_views/logging_settings_view.dart new file mode 100644 index 000000000..5db54e93f --- /dev/null +++ b/lib/pages/settings_views/global_settings_view/advanced_views/logging_settings_view.dart @@ -0,0 +1,349 @@ +/* + * This file is part of Stack Wallet. + * + * Copyright (c) 2023 Cypher Stack + * All Rights Reserved. + * The code is distributed under GPLv3 license, see LICENSE file for details. + * Generated by Cypher Stack on 2023-05-26 + * + */ + +import 'dart:async'; +import 'dart:io'; + +import 'package:file_picker/file_picker.dart'; +import 'package:flutter/material.dart'; +// import 'package:flutter_libmonero/git_versions.dart' as MONERO_VERSIONS; +import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:flutter_svg/svg.dart'; + +import '../../../../app_config.dart'; +import '../../../../providers/global/prefs_provider.dart'; +import '../../../../themes/stack_colors.dart'; +import '../../../../utilities/assets.dart'; +import '../../../../utilities/logger.dart'; +import '../../../../utilities/text_styles.dart'; +import '../../../../widgets/background.dart'; +import '../../../../widgets/custom_buttons/app_bar_icon_button.dart'; +import '../../../../widgets/desktop/primary_button.dart'; +import '../../../../widgets/rounded_white_container.dart'; +import '../../../../widgets/stack_dialog.dart'; + +class LoggingSettingsView extends ConsumerStatefulWidget { + const LoggingSettingsView({super.key}); + + static const String routeName = "/loggingView"; + + @override + ConsumerState createState() => + _LoggingSettingsViewState(); +} + +class _LoggingSettingsViewState extends ConsumerState { + late final TextEditingController fileLocationController; + bool _lock = false; + + Future _edit() async { + final currentPath = ref.read(prefsChangeNotifierProvider).logsPath ?? + Logging.instance.logsDirPath; + final newPath = await _pickDir(context, currentPath); + + // test if has permission to write + if (newPath != null) { + final file = File( + "$newPath${Platform.pathSeparator}._test", + ); + if (!file.existsSync()) { + file.createSync(); + file.deleteSync(); + } + } + + // success + ref.read(prefsChangeNotifierProvider).logsPath = newPath; + + if (mounted) { + setState(() { + fileLocationController.text = + ref.read(prefsChangeNotifierProvider).logsPath ?? + Logging.instance.logsDirPath; + }); + } + } + + Future _pickDir(BuildContext context, String currentPath) async { + final String? chosenPath; + // if (Platform.isIOS) { + // chosenPath = currentPath; + // } else { + final String path = + Platform.isWindows ? currentPath.replaceAll("/", "\\") : currentPath; + chosenPath = await FilePicker.platform.getDirectoryPath( + dialogTitle: "Choose Log Save location", + initialDirectory: path, + lockParentWindow: true, + ); + // } + return chosenPath; + } + + @override + void initState() { + super.initState(); + fileLocationController = TextEditingController(); + fileLocationController.text = + ref.read(prefsChangeNotifierProvider).logsPath ?? + Logging.instance.logsDirPath; + } + + @override + void dispose() { + fileLocationController.dispose(); + super.dispose(); + } + + @override + Widget build(BuildContext context) { + return Background( + child: Scaffold( + backgroundColor: Theme.of(context).extension()!.background, + appBar: AppBar( + leading: AppBarBackButton( + onPressed: () async { + Navigator.of(context).pop(); + }, + ), + title: Text( + "Logging", + style: STextStyles.navBarTitle(context), + ), + // actions: [ + // Padding( + // padding: const EdgeInsets.only( + // top: 10, + // bottom: 10, + // right: 10, + // ), + // child: AspectRatio( + // aspectRatio: 1, + // child: AppBarIconButton( + // key: const Key("deleteLogsAppBarButtonKey"), + // size: 36, + // shadows: const [], + // color: Theme.of(context).extension()!.background, + // icon: SvgPicture.asset( + // Assets.svg.trash, + // color: Theme.of(context) + // .extension()! + // .accentColorDark, + // width: 20, + // height: 20, + // ), + // onPressed: () async { + // await showDialog( + // context: context, + // builder: (_) => StackDialog( + // title: "Delete logs?", + // message: + // "You are about to delete all logs permanently. Are you sure?", + // leftButton: TextButton( + // style: Theme.of(context) + // .extension()! + // .getSecondaryEnabledButtonStyle(context), + // child: Text( + // "Cancel", + // style: STextStyles.itemSubtitle12(context), + // ), + // onPressed: () { + // Navigator.of(context).pop(); + // }, + // ), + // rightButton: TextButton( + // style: Theme.of(context) + // .extension()! + // .getPrimaryEnabledButtonStyle(context), + // child: Text( + // "Delete logs", + // style: STextStyles.button(context), + // ), + // onPressed: () async { + // Navigator.of(context).pop(); + // + // bool shouldPop = false; + // unawaited( + // showDialog( + // barrierDismissible: false, + // context: context, + // builder: (_) => WillPopScope( + // onWillPop: () async { + // return shouldPop; + // }, + // child: const CustomLoadingOverlay( + // message: "Deleting logs...", + // eventBus: null, + // ), + // ), + // ), + // ); + // + // await ref + // .read(debugServiceProvider) + // .deleteAllLogs(); + // + // shouldPop = true; + // + // if (mounted) { + // Navigator.pop(context); + // unawaited( + // showFloatingFlushBar( + // type: FlushBarType.info, + // context: context, + // message: 'Logs cleared!', + // ), + // ); + // + // setState(() {}); + // } + // }, + // ), + // ), + // ); + // }, + // ), + // ), + // ), + // ], + ), + body: SafeArea( + child: Padding( + padding: const EdgeInsets.only( + top: 12, + left: 16, + right: 16, + ), + child: Column( + children: [ + Row( + children: [ + Text( + "Log files location", + style: STextStyles.fieldLabel(context), + textAlign: TextAlign.left, + ), + ], + ), + const SizedBox( + height: 16, + ), + TextField( + autocorrect: false, + enableSuggestions: false, + controller: fileLocationController, + style: STextStyles.field(context), + decoration: InputDecoration( + hintText: "Save to...", + hintStyle: STextStyles.fieldLabel(context), + suffixIcon: UnconstrainedBox( + child: Row( + children: [ + const SizedBox( + width: 16, + ), + SvgPicture.asset( + Assets.svg.folder, + color: Theme.of(context) + .extension()! + .textDark3, + width: 16, + height: 16, + ), + const SizedBox( + width: 12, + ), + ], + ), + ), + ), + key: const Key( + "logsDirPathLocationControllerKey", + ), + readOnly: true, + toolbarOptions: const ToolbarOptions( + copy: true, + cut: false, + paste: false, + selectAll: false, + ), + onChanged: (newValue) {}, + ), + const SizedBox( + height: 16, + ), + Row( + children: [ + Expanded( + child: RoundedWhiteContainer( + child: Text( + "NOTE: ${AppConfig.appName} must be restarted in order" + " for the new path to take effect.", + style: STextStyles.subtitle500(context), + ), + ), + ), + ], + ), + const SizedBox( + height: 16, + ), + const Spacer(), + PrimaryButton( + label: "Edit", + onPressed: () async { + if (_lock) { + return; + } + _lock = true; + try { + await _edit(); + } catch (e, s) { + Logging.instance.e( + "Failed to change logs path", + error: e, + stackTrace: s, + ); + if (context.mounted) { + final String err; + if (e + .toString() + .contains("OS Error: Operation not permitted")) { + err = "Cannot use chosen location"; + } else { + err = e.toString(); + } + + unawaited( + showDialog( + context: context, + builder: (context) => StackOkDialog( + title: "Failed to change logs path", + message: err, + ), + ), + ); + } + } finally { + _lock = false; + } + }, + ), + const SizedBox( + height: 16, + ), + ], + ), + ), + ), + ), + ); + } +} diff --git a/lib/pages/settings_views/global_settings_view/hidden_settings.dart b/lib/pages/settings_views/global_settings_view/hidden_settings.dart index c0ed42019..6a036c3e4 100644 --- a/lib/pages/settings_views/global_settings_view/hidden_settings.dart +++ b/lib/pages/settings_views/global_settings_view/hidden_settings.dart @@ -15,7 +15,6 @@ import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:flutter_svg/flutter_svg.dart'; import '../../../notifications/show_flush_bar.dart'; -import '../../../providers/global/debug_service_provider.dart'; import '../../../providers/providers.dart'; import '../../../themes/stack_colors.dart'; import '../../../utilities/assets.dart'; @@ -176,40 +175,40 @@ class HiddenSettings extends StatelessWidget { // ), // ); // }), - const SizedBox( - height: 12, - ), - Consumer( - builder: (_, ref, __) { - return GestureDetector( - onTap: () async { - await ref - .read(debugServiceProvider) - .deleteAllLogs(); - - if (context.mounted) { - unawaited( - showFloatingFlushBar( - type: FlushBarType.success, - message: "Debug Logs deleted", - context: context, - ), - ); - } - }, - child: RoundedWhiteContainer( - child: Text( - "Delete Debug Logs", - style: STextStyles.button(context).copyWith( - color: Theme.of(context) - .extension()! - .accentColorDark, - ), - ), - ), - ); - }, - ), + // const SizedBox( + // height: 12, + // ), + // Consumer( + // builder: (_, ref, __) { + // return GestureDetector( + // onTap: () async { + // await ref + // .read(debugServiceProvider) + // .deleteAllLogs(); + // + // if (context.mounted) { + // unawaited( + // showFloatingFlushBar( + // type: FlushBarType.success, + // message: "Debug Logs deleted", + // context: context, + // ), + // ); + // } + // }, + // child: RoundedWhiteContainer( + // child: Text( + // "Delete Debug Logs", + // style: STextStyles.button(context).copyWith( + // color: Theme.of(context) + // .extension()! + // .accentColorDark, + // ), + // ), + // ), + // ); + // }, + // ), const SizedBox( height: 12, ), diff --git a/lib/pages/settings_views/wallet_settings_view/wallet_settings_view.dart b/lib/pages/settings_views/wallet_settings_view/wallet_settings_view.dart index 8e889ed7c..18b18d9e1 100644 --- a/lib/pages/settings_views/wallet_settings_view/wallet_settings_view.dart +++ b/lib/pages/settings_views/wallet_settings_view/wallet_settings_view.dart @@ -49,7 +49,6 @@ import '../../../widgets/stack_dialog.dart'; import '../../address_book_views/address_book_view.dart'; import '../../home_view/home_view.dart'; import '../../pinpad_views/lock_screen_view.dart'; -import '../global_settings_view/advanced_views/debug_view.dart'; import '../global_settings_view/syncing_preferences_views/syncing_preferences_view.dart'; import '../sub_widgets/settings_list_button.dart'; import 'frost_ms/frost_ms_options_view.dart'; @@ -558,17 +557,17 @@ class _WalletSettingsViewState extends ConsumerState { ); }, ), - const SizedBox( - height: 8, - ), - SettingsListButton( - iconAssetName: Assets.svg.ellipsis, - title: "Debug Info", - onPressed: () { - Navigator.of(context) - .pushNamed(DebugView.routeName); - }, - ), + // const SizedBox( + // height: 8, + // ), + // SettingsListButton( + // iconAssetName: Assets.svg.ellipsis, + // title: "Debug Info", + // onPressed: () { + // Navigator.of(context) + // .pushNamed(DebugView.routeName); + // }, + // ), ], ), ), diff --git a/lib/pages_desktop_specific/my_stack_view/wallet_view/desktop_wallet_view.dart b/lib/pages_desktop_specific/my_stack_view/wallet_view/desktop_wallet_view.dart index 9893a6cae..3676f1192 100644 --- a/lib/pages_desktop_specific/my_stack_view/wallet_view/desktop_wallet_view.dart +++ b/lib/pages_desktop_specific/my_stack_view/wallet_view/desktop_wallet_view.dart @@ -298,7 +298,7 @@ class _DesktopWalletViewState extends ConsumerState { ), Text( WalletDevTools.checkFiroTransactionTally( - widget.walletId, + wallet, ), ), ], diff --git a/lib/pages_desktop_specific/settings/settings_menu/advanced_settings/advanced_settings.dart b/lib/pages_desktop_specific/settings/settings_menu/advanced_settings/advanced_settings.dart index e96a5288c..60a164b8f 100644 --- a/lib/pages_desktop_specific/settings/settings_menu/advanced_settings/advanced_settings.dart +++ b/lib/pages_desktop_specific/settings/settings_menu/advanced_settings/advanced_settings.dart @@ -363,7 +363,7 @@ class _AdvancedSettings extends ConsumerState { mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ Text( - "Debug info", + "Logging", style: STextStyles.desktopTextExtraSmall(context) .copyWith( color: Theme.of(context) @@ -374,7 +374,7 @@ class _AdvancedSettings extends ConsumerState { ), PrimaryButton( buttonHeight: ButtonHeight.xs, - label: "Show logs", + label: "View", width: 101, onPressed: () async { await showDialog( @@ -382,7 +382,7 @@ class _AdvancedSettings extends ConsumerState { useSafeArea: false, barrierDismissible: true, builder: (context) { - return const DebugInfoDialog(); + return const DesktopLoggingDialog(); }, ); }, diff --git a/lib/pages_desktop_specific/settings/settings_menu/advanced_settings/debug_info_dialog.dart b/lib/pages_desktop_specific/settings/settings_menu/advanced_settings/debug_info_dialog.dart index dedfe999d..2aaed6c13 100644 --- a/lib/pages_desktop_specific/settings/settings_menu/advanced_settings/debug_info_dialog.dart +++ b/lib/pages_desktop_specific/settings/settings_menu/advanced_settings/debug_info_dialog.dart @@ -1,6 +1,6 @@ -/* +/* * This file is part of Stack Wallet. - * + * * Copyright (c) 2023 Cypher Stack * All Rights Reserved. * The code is distributed under GPLv3 license, see LICENSE file for details. @@ -9,129 +9,100 @@ */ import 'dart:async'; +import 'dart:io'; -import 'package:event_bus/event_bus.dart'; import 'package:file_picker/file_picker.dart'; import 'package:flutter/material.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:flutter_svg/svg.dart'; -import '../../../../models/isar/models/log.dart'; -import '../../../../notifications/show_flush_bar.dart'; -import '../../../../providers/global/debug_service_provider.dart'; +import '../../../../app_config.dart'; +import '../../../../providers/global/prefs_provider.dart'; import '../../../../themes/stack_colors.dart'; import '../../../../utilities/assets.dart'; -import '../../../../utilities/constants.dart'; import '../../../../utilities/logger.dart'; -import '../../../../utilities/show_loading.dart'; import '../../../../utilities/text_styles.dart'; -import '../../../../utilities/util.dart'; import '../../../../widgets/desktop/desktop_dialog.dart'; import '../../../../widgets/desktop/desktop_dialog_close_button.dart'; import '../../../../widgets/desktop/primary_button.dart'; -import '../../../../widgets/desktop/secondary_button.dart'; -import '../../../../widgets/icon_widgets/x_icon.dart'; -import '../../../../widgets/rounded_container.dart'; +import '../../../../widgets/rounded_white_container.dart'; import '../../../../widgets/stack_dialog.dart'; -import '../../../../widgets/stack_text_field.dart'; -import '../../../../widgets/textfield_icon_button.dart'; -class DebugInfoDialog extends ConsumerStatefulWidget { - const DebugInfoDialog({super.key}); +class DesktopLoggingDialog extends ConsumerStatefulWidget { + const DesktopLoggingDialog({super.key}); @override - ConsumerState createState() => _DebugInfoDialog(); + ConsumerState createState() => _DebugInfoDialog(); } -class _DebugInfoDialog extends ConsumerState { - late final TextEditingController searchDebugController; - late final FocusNode searchDebugFocusNode; - - final scrollController = ScrollController(); - - String _searchTerm = ""; +class _DebugInfoDialog extends ConsumerState { + late final TextEditingController fileLocationController; + bool _lock = false; - List filtered(List unfiltered, String filter) { - if (filter == "") { - return unfiltered; - } - return unfiltered - .where( - (e) => (e.toString().toLowerCase().contains(filter.toLowerCase())), - ) - .toList(); - } + Future _edit() async { + final currentPath = ref.read(prefsChangeNotifierProvider).logsPath ?? + Logging.instance.logsDirPath; + final newPath = await _pickDir(context, currentPath); - BorderRadius? _borderRadius(int index, int listLength) { - if (index == 0 && listLength == 1) { - return BorderRadius.circular( - Constants.size.circularBorderRadius, - ); - } else if (index == 0) { - return BorderRadius.vertical( - bottom: Radius.circular( - Constants.size.circularBorderRadius, - ), - ); - } else if (index == listLength - 1) { - return BorderRadius.vertical( - top: Radius.circular( - Constants.size.circularBorderRadius, - ), + // test if has permission to write + if (newPath != null) { + final file = File( + "$newPath${Platform.pathSeparator}._test", ); + if (!file.existsSync()) { + file.createSync(); + file.deleteSync(); + } } - return null; - } - bool _lock = false; - Future<(String?, bool)?> _saveFile() async { - final path = await FilePicker.platform.getDirectoryPath( - dialogTitle: "Choose Log Save Location", - lockParentWindow: true, - ); + // success + ref.read(prefsChangeNotifierProvider).logsPath = newPath; - if (path == null) { - return null; + if (mounted) { + setState(() { + fileLocationController.text = + ref.read(prefsChangeNotifierProvider).logsPath ?? + Logging.instance.logsDirPath; + }); } + } - bool logsSaved = true; - String? filename; - try { - filename = - await ref.read(debugServiceProvider).exportToFile(path, EventBus()); - } catch (e, s) { - logsSaved = false; - Logging.instance.log("$e $s", level: LogLevel.Error); + Future _pickDir(BuildContext context, String currentPath) async { + final String? chosenPath; + if (Platform.isIOS) { + chosenPath = currentPath; + } else { + final String path = + Platform.isWindows ? currentPath.replaceAll("/", "\\") : currentPath; + chosenPath = await FilePicker.platform.getDirectoryPath( + dialogTitle: "Choose Log Save location", + initialDirectory: path, + lockParentWindow: true, + ); } - return (filename, logsSaved); + return chosenPath; } @override void initState() { - searchDebugController = TextEditingController(); - searchDebugFocusNode = FocusNode(); - super.initState(); + fileLocationController = TextEditingController(); + fileLocationController.text = + ref.read(prefsChangeNotifierProvider).logsPath ?? + Logging.instance.logsDirPath; } @override void dispose() { - searchDebugFocusNode.dispose(); - searchDebugController.dispose(); - - scrollController.dispose(); - + fileLocationController.dispose(); super.dispose(); } @override Widget build(BuildContext context) { return DesktopDialog( - // Max height of 850 unless the screen is smaller than that. - maxHeight: MediaQuery.of(context).size.height < 850 - ? MediaQuery.of(context).size.height - : 850, - maxWidth: 600, + maxHeight: double.infinity, + maxWidth: 640, child: Column( children: [ Row( @@ -140,7 +111,7 @@ class _DebugInfoDialog extends ConsumerState { Padding( padding: const EdgeInsets.all(32), child: Text( - "Debug info", + "Logging", style: STextStyles.desktopH3(context), textAlign: TextAlign.center, ), @@ -150,277 +121,122 @@ class _DebugInfoDialog extends ConsumerState { ), Padding( padding: const EdgeInsets.symmetric(horizontal: 32), - child: ClipRRect( - borderRadius: BorderRadius.circular( - Constants.size.circularBorderRadius, - ), - child: TextField( - autocorrect: Util.isDesktop ? false : true, - enableSuggestions: Util.isDesktop ? false : true, - controller: searchDebugController, - focusNode: searchDebugFocusNode, - onChanged: (newString) { - setState(() => _searchTerm = newString); - }, - style: STextStyles.field(context), - decoration: standardInputDecoration( - "Search", - searchDebugFocusNode, - context, - ).copyWith( - prefixIcon: Padding( - padding: const EdgeInsets.symmetric( - horizontal: 10, - vertical: 16, - ), - child: SvgPicture.asset( - Assets.svg.search, - width: 16, - height: 16, - ), - ), - suffixIcon: searchDebugController.text.isNotEmpty - ? Padding( - padding: const EdgeInsets.only(right: 0), - child: UnconstrainedBox( - child: Row( - children: [ - TextFieldIconButton( - child: const XIcon(), - onTap: () async { - setState(() { - searchDebugController.text = ""; - _searchTerm = ""; - }); - }, - ), - ], - ), - ), - ) - : null, + child: Row( + children: [ + Text( + "Log files location", + style: STextStyles.desktopTextFieldLabel(context), + textAlign: TextAlign.left, ), - ), + ], ), ), - Expanded( - // flex: 24, - child: NestedScrollView( - // floatHeaderSlivers: true, - headerSliverBuilder: (context, innerBoxIsScrolled) { - return [ - SliverOverlapAbsorber( - handle: NestedScrollView.sliverOverlapAbsorberHandleFor( - context, - ), - sliver: const SliverToBoxAdapter( - child: Padding( - padding: EdgeInsets.symmetric( - vertical: 16, - horizontal: 32, - ), - child: Column( - children: [], - ), + const SizedBox( + height: 10, + ), + Padding( + padding: const EdgeInsets.symmetric(horizontal: 32), + child: TextField( + autocorrect: false, + enableSuggestions: false, + controller: fileLocationController, + style: STextStyles.field(context), + decoration: InputDecoration( + hintText: "Save to...", + hintStyle: STextStyles.fieldLabel(context), + suffixIcon: UnconstrainedBox( + child: Row( + children: [ + const SizedBox( + width: 16, ), - ), - ), - ]; - }, - body: Builder( - builder: (context) { - final logs = filtered( - ref.watch( - debugServiceProvider.select((value) => value.recentLogs), - ), - _searchTerm, - ).reversed.toList(growable: false); - return CustomScrollView( - reverse: true, - // shrinkWrap: true, - controller: scrollController, - slivers: [ - SliverOverlapInjector( - handle: NestedScrollView.sliverOverlapAbsorberHandleFor( - context, - ), + SvgPicture.asset( + Assets.svg.folder, + color: Theme.of(context) + .extension()! + .textDark3, + width: 16, + height: 16, ), - SliverList( - delegate: SliverChildBuilderDelegate( - (context, index) { - final log = logs[index]; - - return Container( - key: Key( - "log_${log.id}_${log.timestampInMillisUTC}", - ), - decoration: BoxDecoration( - color: Theme.of(context) - .extension()! - .popupBG, - borderRadius: _borderRadius(index, logs.length), - ), - child: Padding( - padding: const EdgeInsets.all(4), - child: Padding( - padding: const EdgeInsets.symmetric( - horizontal: 32, - ), - child: RoundedContainer( - padding: const EdgeInsets.all(0), - color: Theme.of(context) - .extension()! - .popupBG, - child: Column( - crossAxisAlignment: - CrossAxisAlignment.start, - children: [ - Row( - children: [ - Text( - " [${log.logLevel.name}]", - style: STextStyles.baseXS(context) - .copyWith( - fontSize: 8, - color: (log.logLevel == - LogLevel.Info - ? Theme.of(context) - .extension< - StackColors>()! - .topNavIconGreen - : (log.logLevel == - LogLevel.Warning - ? Theme.of(context) - .extension< - StackColors>()! - .topNavIconYellow - : (log.logLevel == - LogLevel.Error - ? Colors.orange - : Theme.of(context) - .extension< - StackColors>()! - .topNavIconRed))), - ), - ), - Text( - "[${DateTime.fromMillisecondsSinceEpoch(log.timestampInMillisUTC, isUtc: true)}]: ", - style: STextStyles.baseXS(context) - .copyWith( - fontSize: 12, - color: Theme.of(context) - .extension()! - .textDark3, - ), - ), - ], - ), - Row( - crossAxisAlignment: - CrossAxisAlignment.start, - children: [ - const SizedBox( - width: 20, - ), - Flexible( - child: Column( - crossAxisAlignment: - CrossAxisAlignment.start, - children: [ - SelectableText( - log.message, - style: STextStyles.baseXS( - context, - ).copyWith( - fontSize: 11.5, - ), - ), - ], - ), - ), - ], - ), - ], - ), - ), - ), - ), - ); - }, - childCount: logs.length, - ), + const SizedBox( + width: 12, ), ], - ); - }, + ), + ), ), + key: const Key( + "logsDirPathLocationControllerKey", + ), + readOnly: true, + toolbarOptions: const ToolbarOptions( + copy: true, + cut: false, + paste: false, + selectAll: false, + ), + onChanged: (newValue) {}, ), ), - // const Spacer(), + const SizedBox( + height: 16, + ), Padding( - padding: const EdgeInsets.all(32), + padding: const EdgeInsets.symmetric(horizontal: 32), child: Row( children: [ Expanded( - child: SecondaryButton( - label: "Clear logs", - onPressed: () async { - await ref.read(debugServiceProvider).deleteAllLogs(); - setState(() {}); - - if (context.mounted) { - Navigator.pop(context); - unawaited( - showFloatingFlushBar( - type: FlushBarType.info, - context: context, - message: 'Logs cleared!', - ), - ); - } - }, + child: RoundedWhiteContainer( + borderColor: Theme.of(context) + .extension()! + .textSubtitle6, + child: Text( + "NOTE: ${AppConfig.appName} must be restarted in order" + " for the new path to take effect.", + style: STextStyles.desktopTextExtraExtraSmall(context), + ), ), ), + ], + ), + ), + const SizedBox( + height: 16, + ), + Padding( + padding: const EdgeInsets.all(32), + child: Row( + children: [ + const Spacer(), const SizedBox( width: 16, ), Expanded( child: PrimaryButton( - label: "Save logs to file", + label: "Edit", onPressed: () async { if (_lock) { return; } _lock = true; try { - final results = await showLoading<(String?, bool)?>( - whileFuture: _saveFile(), - context: context, - message: "Generating logs file...", + await _edit(); + } catch (e, s) { + Logging.instance.e( + "Failed to change logs path", + error: e, + stackTrace: s, ); - - if (results != null) { - if (results.$2) { - unawaited( - showDialog( - context: context, - builder: (context) => StackOkDialog( - title: "Logs saved to", - message: results.$1, - ), - ), - ); - } else { - unawaited( - showDialog( - context: context, - builder: (context) => StackOkDialog( - title: "Error Saving Logs", - message: results.$1, - ), + if (context.mounted) { + unawaited( + showDialog( + context: context, + builder: (context) => StackOkDialog( + title: "Failed to change logs path", + message: e.toString(), ), - ); - } + ), + ); } } finally { _lock = false; diff --git a/lib/providers/global/debug_service_provider.dart b/lib/providers/global/debug_service_provider.dart deleted file mode 100644 index 4d666cdcf..000000000 --- a/lib/providers/global/debug_service_provider.dart +++ /dev/null @@ -1,15 +0,0 @@ -/* - * This file is part of Stack Wallet. - * - * Copyright (c) 2023 Cypher Stack - * All Rights Reserved. - * The code is distributed under GPLv3 license, see LICENSE file for details. - * Generated by Cypher Stack on 2023-05-26 - * - */ - -import 'package:flutter_riverpod/flutter_riverpod.dart'; -import '../../services/debug_service.dart'; - -final debugServiceProvider = - ChangeNotifierProvider((ref) => DebugService.instance); diff --git a/lib/route_generator.dart b/lib/route_generator.dart index bcfffa8cd..71a3b890e 100644 --- a/lib/route_generator.dart +++ b/lib/route_generator.dart @@ -91,7 +91,7 @@ import 'pages/send_view/send_view.dart'; import 'pages/send_view/token_send_view.dart'; import 'pages/settings_views/global_settings_view/about_view.dart'; import 'pages/settings_views/global_settings_view/advanced_views/advanced_settings_view.dart'; -import 'pages/settings_views/global_settings_view/advanced_views/debug_view.dart'; +import 'pages/settings_views/global_settings_view/advanced_views/logging_settings_view.dart'; import 'pages/settings_views/global_settings_view/advanced_views/manage_coin_units/edit_coin_units_view.dart'; import 'pages/settings_views/global_settings_view/advanced_views/manage_coin_units/manage_coin_units_view.dart'; import 'pages/settings_views/global_settings_view/advanced_views/manage_explorer_view.dart'; @@ -951,10 +951,10 @@ class RouteGenerator { settings: RouteSettings(name: settings.name), ); - case DebugView.routeName: + case LoggingSettingsView.routeName: return getRoute( shouldUseMaterialRoute: useMaterialPageRoute, - builder: (_) => const DebugView(), + builder: (_) => const LoggingSettingsView(), settings: RouteSettings(name: settings.name), ); diff --git a/lib/services/debug_service.dart b/lib/services/debug_service.dart deleted file mode 100644 index 4d6e51553..000000000 --- a/lib/services/debug_service.dart +++ /dev/null @@ -1,125 +0,0 @@ -/* - * This file is part of Stack Wallet. - * - * Copyright (c) 2023 Cypher Stack - * All Rights Reserved. - * The code is distributed under GPLv3 license, see LICENSE file for details. - * Generated by Cypher Stack on 2023-05-26 - * - */ - -import 'dart:async'; -import 'dart:io'; - -import 'package:event_bus/event_bus.dart'; -import 'package:flutter/material.dart'; -import 'package:isar/isar.dart'; - -import '../app_config.dart'; -import '../models/isar/models/log.dart'; -import '../utilities/logger.dart'; - -class DebugService extends ChangeNotifier { - DebugService._(); - static final DebugService _instance = DebugService._(); - static DebugService get instance => _instance; - - late final Isar isar; - // late final Stream logsChanged; - - // bool _shouldPause = false; - // - // void togglePauseUiUpdates() { - // _shouldPause = !_shouldPause; - // notifyListeners(); - // } - - // bool get isPaused => _shouldPause; - - Future init(Isar isar) async { - this.isar = isar; - // logsChanged = this.isar.logs.watchLazy(); - // logsChanged.listen((_) { - // if (!_shouldPause) { - // updateRecentLogs(); - // } - // }); - } - - List get recentLogs => isar.logs - .where() - .sortByTimestampInMillisUTCDesc() - .limit(100) - .findAllSync(); - - // Future updateRecentLogs() async { - // int totalCount = await isar.logs.count(); - // int offset = totalCount - numberOfRecentLogsToLoad; - // if (offset < 0) { - // offset = 0; - // } - // - // _recentLogs = (await isar.logs - // .where() - // .anyTimestampInMillisUTC() - // .offset(offset) - // .limit(numberOfRecentLogsToLoad) - // .findAll()); - // notifyListeners(); - // } - - Future deleteAllLogs() async { - try { - await isar.writeTxn(() async => await isar.logs.clear()); - notifyListeners(); - return true; - } catch (_) { - return false; - } - } - - Future deleteLogsOlderThan({ - Duration timeframe = const Duration(days: 30), - }) async { - final cutoffDate = DateTime.now().subtract(timeframe).toUtc(); - await isar.writeTxn(() async { - await isar.logs - .where() - .timestampInMillisUTCLessThan(cutoffDate.millisecondsSinceEpoch) - .deleteAll(); - }); - - Logging.instance.log( - "Logs older than $cutoffDate cleared!", - level: LogLevel.Info, - ); - } - - /// returns the filename of the saved logs file - Future exportToFile(String directory, EventBus eventBus) async { - final now = DateTime.now(); - final filename = - "${AppConfig.prefix}_Wallet_logs_${now.year}_${now.month}_${now.day}_${now.hour}_${now.minute}_${now.second}.txt"; - final filepath = "$directory/$filename"; - final File file = await File(filepath).create(); - - final sink = file.openWrite(); - final logs = await isar.logs.where().anyTimestampInMillisUTC().findAll(); - final count = logs.length; - int counter = 0; - - for (final log in logs) { - sink.writeln(log); - await sink.flush(); - counter++; - final exportPercent = (counter / count).clamp(0.0, 1.0); - eventBus.fire(exportPercent); - } - - await sink.flush(); - await sink.close(); - - eventBus.fire(1.0); - return filename; - } -} diff --git a/lib/services/price.dart b/lib/services/price.dart index 5a97e43cb..c3e3e41f5 100644 --- a/lib/services/price.dart +++ b/lib/services/price.dart @@ -20,6 +20,7 @@ import '../db/hive/db.dart'; import '../networking/http.dart'; import '../utilities/logger.dart'; import '../utilities/prefs.dart'; +import '../utilities/util.dart'; import '../wallets/crypto_currency/crypto_currency.dart'; import 'tor_service.dart'; @@ -128,7 +129,7 @@ class PriceAPI { } final externalCalls = Prefs.instance.externalCalls; - if ((!Logger.isTestEnv && !externalCalls) || + if ((!Util.isTestEnv && !externalCalls) || !(await Prefs.instance.isExternalCallsSet())) { Logging.instance.log( "User does not want to use external calls", @@ -184,7 +185,7 @@ class PriceAPI { final externalCalls = Prefs.instance.externalCalls; final HTTP client = HTTP(); - if ((!Logger.isTestEnv && !externalCalls) || + if ((!Util.isTestEnv && !externalCalls) || !(await Prefs.instance.isExternalCallsSet())) { Logging.instance.log( "User does not want to use external calls", @@ -226,7 +227,7 @@ class PriceAPI { contractAddresses.isEmpty) return tokenPrices; final externalCalls = Prefs.instance.externalCalls; - if ((!Logger.isTestEnv && !externalCalls) || + if ((!Util.isTestEnv && !externalCalls) || !(await Prefs.instance.isExternalCallsSet())) { Logging.instance.log( "User does not want to use external calls", diff --git a/lib/utilities/constants.dart b/lib/utilities/constants.dart index 163b7d04e..1c3b908a1 100644 --- a/lib/utilities/constants.dart +++ b/lib/utilities/constants.dart @@ -40,7 +40,7 @@ abstract class Constants { // Enable Logger.print statements static const bool disableLogger = false; - static const int currentDataVersion = 13; + static const int currentDataVersion = 14; static const int rescanV1 = 1; diff --git a/lib/utilities/enums/log_level_enum.dart b/lib/utilities/enums/log_level_enum.dart index 5fb7f9e52..afebbf076 100644 --- a/lib/utilities/enums/log_level_enum.dart +++ b/lib/utilities/enums/log_level_enum.dart @@ -10,10 +10,27 @@ // Used in Isar db and stored there as int indexes so adding/removing values // in this definition should be done extremely carefully in production +import 'package:logger/logger.dart'; + enum LogLevel { Info, Warning, Error, Fatal, Debug; + + Level getLoggerLevel() { + switch (this) { + case LogLevel.Info: + return Level.info; + case LogLevel.Warning: + return Level.warning; + case LogLevel.Error: + return Level.error; + case LogLevel.Fatal: + return Level.fatal; + case LogLevel.Debug: + return Level.debug; + } + } } diff --git a/lib/utilities/logger.dart b/lib/utilities/logger.dart index 83949ec5b..5b446e283 100644 --- a/lib/utilities/logger.dart +++ b/lib/utilities/logger.dart @@ -8,161 +8,261 @@ * */ +import 'dart:convert'; import 'dart:core' as core; import 'dart:core'; -import 'dart:io'; +import 'dart:isolate'; +import 'dart:ui'; -import 'package:flutter/foundation.dart'; -import 'package:isar/isar.dart'; +import 'package:flutter_libsparkmobile/flutter_libsparkmobile.dart' as spark; +import 'package:logger/logger.dart'; -import '../models/isar/models/log.dart'; -import 'constants.dart'; import 'enums/log_level_enum.dart'; +import 'util.dart'; export 'enums/log_level_enum.dart'; +const _kLoggerPortName = "logger_port"; + +// convenience conversion for spark +extension LoggingLevelExt on spark.LoggingLevel { + Level getLoggerLevel() { + switch (this) { + case spark.LoggingLevel.info: + return Level.info; + case spark.LoggingLevel.warning: + return Level.warning; + case spark.LoggingLevel.error: + return Level.error; + case spark.LoggingLevel.fatal: + return Level.fatal; + case spark.LoggingLevel.debug: + return Level.debug; + case spark.LoggingLevel.trace: + return Level.trace; + } + } +} + class Logging { - static const isArmLinux = bool.fromEnvironment("IS_ARM"); - static final isTestEnv = Platform.environment["FLUTTER_TEST"] == "true"; Logging._(); static final Logging _instance = Logging._(); static Logging get instance => _instance; - static const core.int defaultPrintLength = 1020; + late final String logsDirPath; + + SendPort get _sendPort { + final port = IsolateNameServer.lookupPortByName(_kLoggerPortName); + if (port == null) { + throw Exception( + "Did you forget to call Logging.initialize()?", + ); + } + return port; + } + + Future initialize(String logsPath) async { + if (Isolate.current.debugName != "main") { + throw Exception( + "Logging.initialize() must be called on the main isolate.", + ); + } + if (IsolateNameServer.lookupPortByName(_kLoggerPortName) != null) { + throw Exception( + "Logging was already initialized", + ); + } + + logsDirPath = logsPath; + + final receivePort = ReceivePort(); + await Isolate.spawn( + (sendPort) { + final ReceivePort receivePort = ReceivePort(); + sendPort.send(receivePort.sendPort); + + PrettyPrinter prettyPrinter(bool toFile) => PrettyPrinter( + printEmojis: false, + methodCount: 0, + dateTimeFormat: + toFile ? DateTimeFormat.none : DateTimeFormat.dateAndTime, + colors: !toFile, + noBoxingByDefault: toFile, + ); - late final Isar? isar; - late final _AsyncLogWriterQueue _queue; + final consoleLogger = Logger( + printer: PrefixPrinter(prettyPrinter(false)), + ); - Future init(Isar isar) async { - _queue = _AsyncLogWriterQueue(); - this.isar = isar; + final fileLogger = Logger( + printer: PrefixPrinter(prettyPrinter(true)), + filter: ProductionFilter(), + output: AdvancedFileOutput( + path: logsDirPath, + overrideExisting: false, + latestFileName: "latest.txt", + writeImmediately: [ + Level.error, + Level.fatal, + Level.warning, + Level.trace, // mainly for spark debugging. TODO: Remove later + ], + ), + ); + + receivePort.listen((message) { + final event = (message as (LogEvent, bool)).$1; + consoleLogger.log( + event.level, + event.message, + stackTrace: event.stackTrace, + error: event.error, + time: event.time.toUtc(), + ); + if (message.$2) { + fileLogger.log( + event.level, + "${event.time.toUtc().toIso8601String()} ${event.message}", + stackTrace: event.stackTrace, + error: event.error, + time: event.time, + ); + } + }); + }, + receivePort.sendPort, + ); + final loggerPort = await receivePort.first as SendPort; + IsolateNameServer.registerPortWithName(loggerPort, _kLoggerPortName); } + String _stringifyMessage(dynamic message) => + !(message is Map || message is Iterable) + ? message.toString() + : JsonEncoder.withIndent(' ', (o) => o.toString()).convert(message); + + @core.Deprecated("Use Logging.instance.lg instead") void log( core.Object? object, { required LogLevel level, core.bool printToConsole = true, core.bool printFullLength = false, + }) => + lg( + level.getLoggerLevel(), + object, + ); + + void lg( + Level level, + dynamic message, { + DateTime? time, + Object? error, + StackTrace? stackTrace, + bool toFile = true, // false will print to console only }) { + if (Util.isTestEnv || Util.isArmLinux) { + toFile = false; + } try { - if (isTestEnv || isArmLinux) { - Logger.print(object, normalLength: !printFullLength); - return; - } - String message = object.toString(); - - // random value to check max size of message before storing in db - if (message.length > 20000) { - message = "${message.substring(0, 20000)}..."; - } - - final now = core.DateTime.now().toUtc(); - final log = Log() - ..message = message - ..logLevel = level - ..timestampInMillisUTC = now.millisecondsSinceEpoch; - if (level == LogLevel.Error || level == LogLevel.Fatal) { - printFullLength = true; - } - - _queue.add( - () async => isar!.writeTxn( - () async => await isar!.logs.put(log), + _sendPort.send( + ( + LogEvent( + level, + _stringifyMessage(message), + time: time, + error: error, + stackTrace: stackTrace, + ), + toFile ), ); - - if (printToConsole) { - final core.String logStr = "Log: ${log.toString()}"; - final core.int logLength = logStr.length; - - if (!printFullLength || logLength <= defaultPrintLength) { - debugPrint(logStr); - } else { - core.int start = 0; - core.int endIndex = defaultPrintLength; - core.int tmpLogLength = logLength; - while (endIndex < logLength) { - debugPrint(logStr.substring(start, endIndex)); - endIndex += defaultPrintLength; - start += defaultPrintLength; - tmpLogLength -= defaultPrintLength; - } - if (tmpLogLength > 0) { - debugPrint(logStr.substring(start, logLength)); - } - } - } } catch (e, s) { - print("problem trying to log"); - print("$e $s"); - Logger.print(object); + t("Isolates suck", error: e, stackTrace: s); } } -} -abstract class Logger { - static final isTestEnv = Platform.environment["FLUTTER_TEST"] == "true"; + void t( + dynamic message, { + DateTime? time, + Object? error, + StackTrace? stackTrace, + }) => + lg( + Level.trace, + message, + time: time, + error: error, + stackTrace: stackTrace, + ); - static void print( - core.Object? object, { - core.bool withTimeStamp = true, - core.bool normalLength = true, - }) async { - if (Constants.disableLogger && !isTestEnv) { - return; - } - final utcTime = withTimeStamp ? "${core.DateTime.now().toUtc()}: " : ""; - final core.int defaultPrintLength = 1020 - utcTime.length; - if (normalLength) { - debugPrint("$utcTime$object"); - } else if (object == null || - object.toString().length <= defaultPrintLength) { - debugPrint("$utcTime$object"); - } else { - final core.String log = object.toString(); - core.int start = 0; - core.int endIndex = defaultPrintLength; - final core.int logLength = log.length; - core.int tmpLogLength = log.length; - while (endIndex < logLength) { - debugPrint(utcTime + log.substring(start, endIndex)); - endIndex += defaultPrintLength; - start += defaultPrintLength; - tmpLogLength -= defaultPrintLength; - } - if (tmpLogLength > 0) { - debugPrint(utcTime + log.substring(start, logLength)); - } - } - } -} + void d( + dynamic message, { + DateTime? time, + Object? error, + StackTrace? stackTrace, + }) => + lg( + Level.debug, + message, + time: time, + error: error, + stackTrace: stackTrace, + ); -/// basic async queue for writing logs in the [Logging] to isar -class _AsyncLogWriterQueue { - final List Function()> _queue = []; - bool _runningLock = false; + void i( + dynamic message, { + DateTime? time, + Object? error, + StackTrace? stackTrace, + }) => + lg( + Level.info, + message, + time: time, + error: error, + stackTrace: stackTrace, + ); - void add(Future Function() futureFunction) { - _queue.add(futureFunction); - _run(); - } + void w( + dynamic message, { + DateTime? time, + Object? error, + StackTrace? stackTrace, + }) => + lg( + Level.warning, + message, + time: time, + error: error, + stackTrace: stackTrace, + ); - void _run() async { - if (_runningLock) { - return; - } - _runningLock = true; - try { - while (_queue.isNotEmpty) { - final futureFunction = _queue.removeAt(0); - try { - await futureFunction.call(); - } catch (e, s) { - debugPrint("$e\n$s"); - } - } - } finally { - _runningLock = false; - } - } + void e( + dynamic message, { + DateTime? time, + Object? error, + StackTrace? stackTrace, + }) => + lg( + Level.error, + message, + time: time, + error: error, + stackTrace: stackTrace, + ); + + void f( + dynamic message, { + DateTime? time, + Object? error, + StackTrace? stackTrace, + }) => + lg( + Level.fatal, + message, + time: time, + error: error, + stackTrace: stackTrace, + ); } diff --git a/lib/utilities/prefs.dart b/lib/utilities/prefs.dart index 0bc2dcc43..a2b51c89d 100644 --- a/lib/utilities/prefs.dart +++ b/lib/utilities/prefs.dart @@ -73,6 +73,7 @@ class Prefs extends ChangeNotifier { _autoPin = await _getAutoPin(); _enableExchange = await _getEnableExchange(); _advancedFiroFeatures = await _getAdvancedFiroFeatures(); + _logsPath = await _getLogsPath(); _initialized = true; } @@ -1182,4 +1183,26 @@ class Prefs extends ChangeNotifier { ) as bool? ?? false; } + + // Logs path. Null defaults to default as defined in stack_file_system.dart + String? _logsPath; + String? get logsPath => _logsPath; + set logsPath(String? logsPath) { + if (_logsPath != logsPath) { + DB.instance.put( + boxName: DB.boxNamePrefs, + key: "logsPath", + value: logsPath, + ); + _logsPath = logsPath; + notifyListeners(); + } + } + + Future _getLogsPath() async { + return await DB.instance.get( + boxName: DB.boxNamePrefs, + key: "logsPath", + ) as String?; + } } diff --git a/lib/utilities/stack_file_system.dart b/lib/utilities/stack_file_system.dart index 53e382ff0..67b992bbc 100644 --- a/lib/utilities/stack_file_system.dart +++ b/lib/utilities/stack_file_system.dart @@ -11,9 +11,10 @@ import 'dart:io'; import 'package:path_provider/path_provider.dart'; +import 'package:permission_handler/permission_handler.dart'; import '../app_config.dart'; -import 'logger.dart'; +import 'prefs.dart'; import 'util.dart'; abstract class StackFileSystem { @@ -36,7 +37,7 @@ abstract class StackFileSystem { Directory appDirectory; // todo: can merge and do same as regular linux home dir? - if (Logging.isArmLinux) { + if (Util.isArmLinux) { appDirectory = await getApplicationDocumentsDirectory(); appDirectory = Directory("${appDirectory.path}/.${AppConfig.appDefaultDataDirName}"); @@ -158,4 +159,36 @@ abstract class StackFileSystem { } static Directory? themesDir; + + static Future applicationLogsDirectory(Prefs prefs) async { + // if prefs logs path is set, use that + if (prefs.logsPath != null) { + final dir = Directory(prefs.logsPath!); + if (await dir.exists()) { + return dir; + } + } + + final appDocsDir = await getApplicationDocumentsDirectory(); + const logsDirName = "${AppConfig.prefix}_Logs"; + final Directory logsDir; + + if (Platform.isIOS) { + logsDir = Directory("${appDocsDir.path}/logs"); + } else if (Platform.isMacOS || Platform.isLinux || Platform.isWindows) { + // TODO check this is correct for macos + logsDir = Directory("${appDocsDir.path}/$logsDirName"); + } else if (Platform.isAndroid) { + await Permission.storage.request(); + logsDir = Directory("/storage/emulated/0/Documents/$logsDirName"); + } else { + throw Exception("Unsupported Platform"); + } + + if (!logsDir.existsSync()) { + await logsDir.create(recursive: true); + } + + return logsDir; + } } diff --git a/lib/utilities/util.dart b/lib/utilities/util.dart index d573d9b90..5480e0804 100644 --- a/lib/utilities/util.dart +++ b/lib/utilities/util.dart @@ -18,6 +18,9 @@ import 'package:intl/number_symbols.dart'; import 'package:intl/number_symbols_data.dart'; abstract class Util { + static const isArmLinux = bool.fromEnvironment("IS_ARM"); + static final isTestEnv = Platform.environment["FLUTTER_TEST"] == "true"; + static Directory? libraryPath; static double? screenWidth; diff --git a/lib/utilities/wallet_tools.dart b/lib/utilities/wallet_tools.dart index cbc3c616c..8d869ea63 100644 --- a/lib/utilities/wallet_tools.dart +++ b/lib/utilities/wallet_tools.dart @@ -2,13 +2,17 @@ import 'package:isar/isar.dart'; import '../db/isar/main_db.dart'; import '../models/isar/models/blockchain_data/v2/transaction_v2.dart'; +import '../models/isar/models/firo_specific/lelantus_coin.dart'; import '../wallets/crypto_currency/crypto_currency.dart'; +import '../wallets/isar/models/spark_coin.dart'; +import '../wallets/wallet/impl/firo_wallet.dart'; import 'amount/amount.dart'; import 'amount/amount_formatter.dart'; import 'amount/amount_unit.dart'; +import 'logger.dart'; abstract class WalletDevTools { - static String checkFiroTransactionTally(String walletId) { + static String checkFiroTransactionTally(FiroWallet wallet) { final amtFmt = AmountFormatter( unit: AmountUnit.normal, locale: "en_US", @@ -18,7 +22,7 @@ abstract class WalletDevTools { final all = MainDB.instance.isar.transactionV2s .where() - .walletIdEqualTo(walletId) + .walletIdEqualTo(wallet.walletId) .findAllSync(); final totalCount = all.length; @@ -43,12 +47,27 @@ abstract class WalletDevTools { fractionDigits: 8, ); - print("======== $walletId ============="); - print("totalTxCount: $totalCount"); - print( + final lelantusCoinsCount = MainDB.instance.isar.lelantusCoins + .where() + .walletIdEqualTo(wallet.walletId) + .countSync(); + final sparkCoinsCount = MainDB.instance.isar.sparkCoins + .where() + .walletIdEqualToAnyLTagHash(wallet.walletId) + .countSync(); + + final buffer = StringBuffer(); + buffer.writeln("============= ${wallet.info.name} ============="); + buffer.writeln("wallet id: ${wallet.walletId}"); + buffer.writeln("totalTxCount: $totalCount"); + buffer.writeln( "balanceAccordingToTxns: ${amtFmt.format(balanceAccordingToTxHistory)}", ); - print("=================================================="); + buffer.writeln("lelantusCoinsCount: $lelantusCoinsCount"); + buffer.writeln("sparkCoinsCount: $sparkCoinsCount"); + buffer.writeln("=================================================="); + + Logging.instance.d(buffer); return amtFmt.format(balanceAccordingToTxHistory); } diff --git a/lib/wallets/wallet/wallet_mixin_interfaces/spark_interface.dart b/lib/wallets/wallet/wallet_mixin_interfaces/spark_interface.dart index 8de5bbbab..b9107fa29 100644 --- a/lib/wallets/wallet/wallet_mixin_interfaces/spark_interface.dart +++ b/lib/wallets/wallet/wallet_mixin_interfaces/spark_interface.dart @@ -1,9 +1,12 @@ import 'dart:convert'; +import 'dart:isolate'; import 'dart:math'; import 'package:bitcoindart/bitcoindart.dart' as btc; import 'package:decimal/decimal.dart'; import 'package:flutter/foundation.dart'; +import 'package:flutter_libsparkmobile/flutter_libsparkmobile.dart' as spark + show Log; import 'package:flutter_libsparkmobile/flutter_libsparkmobile.dart'; import 'package:isar/isar.dart'; @@ -50,6 +53,66 @@ String _hashTag(String tag) { return hash; } +abstract class _SparkIsolate { + static Isolate? _isolate; + static SendPort? _sendPort; + static final ReceivePort _receivePort = ReceivePort(); + + static Future initialize() async { + _isolate = await Isolate.spawn( + (SendPort sendPort) { + spark.Log.levels.addAll(LoggingLevel.values); + spark.Log.onLog = ( + level, + value, { + error, + stackTrace, + required time, + }) { + Logging.instance.lg( + level.getLoggerLevel(), + value, + error: error, + stackTrace: stackTrace, + time: time, + ); + }; + final receivePort = ReceivePort(); + + sendPort.send(receivePort.sendPort); + + receivePort.listen((message) async { + if (message is List && message.length == 3) { + final function = message[0] as Function; + final argument = message[1]; + final replyPort = message[2] as SendPort; + + final result = await function(argument); + replyPort.send(result); + } + }); + }, + _receivePort.sendPort, + ); + _sendPort = await _receivePort.first as SendPort; + } + + static Future run(ComputeCallback task, M argument) async { + if (_isolate == null || _sendPort == null) await initialize(); + + final ReceivePort responsePort = ReceivePort(); + _sendPort?.send([task, argument, responsePort.sendPort]); + return await responsePort.first as R; + } +} + +Future computeWithLibSparkLogging( + ComputeCallback callback, + M message, +) async { + return _SparkIsolate.run(callback, message); +} + mixin SparkInterface on Bip39HDWallet, ElectrumXInterface { String? _sparkChangeAddressCached; @@ -70,7 +133,7 @@ mixin SparkInterface Future hashTag(String tag) async { try { - return await compute(_hashTag, tag); + return await computeWithLibSparkLogging(_hashTag, tag); } catch (_) { throw ArgumentError("Invalid tag string format", "tag"); } @@ -553,7 +616,7 @@ mixin SparkInterface ); extractedTx.setPayload(Uint8List(0)); - final spend = await compute( + final spend = await computeWithLibSparkLogging( _createSparkSend, ( privateKeyHex: privateKey.toHex, @@ -764,7 +827,7 @@ mixin SparkInterface // if there is new data we try and identify the coins if (rawCoins.isNotEmpty) { // run identify off main isolate - final myCoins = await compute( + final myCoins = await computeWithLibSparkLogging( _identifyCoins, ( anonymitySetCoins: rawCoins, @@ -950,7 +1013,7 @@ mixin SparkInterface // try to identify any coins in the unchecked set data final List newlyIdCoins = []; for (final groupId in rawCoinsBySetId.keys) { - final myCoins = await compute( + final myCoins = await computeWithLibSparkLogging( _identifyCoins, ( anonymitySetCoins: rawCoinsBySetId[groupId]!, @@ -2145,7 +2208,7 @@ Future _asyncSparkFeesWrapper({ required List serializedCoins, required int privateRecipientsCount, }) async { - return await compute( + return await computeWithLibSparkLogging( _estSparkFeeComputeFunc, ( privateKeyHex: privateKeyHex, diff --git a/pubspec.lock b/pubspec.lock index bb163c0e0..396ffcdbd 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -824,11 +824,11 @@ packages: dependency: "direct main" description: path: "." - ref: "9318bdd8e76e4dc8a49e3d64e8851c85e017eff3" - resolved-ref: "9318bdd8e76e4dc8a49e3d64e8851c85e017eff3" + ref: dd1e2a31bab034c97f8ea5745d1aa0b70c245490 + resolved-ref: dd1e2a31bab034c97f8ea5745d1aa0b70c245490 url: "https://github.com/cypherstack/flutter_libsparkmobile.git" source: git - version: "0.0.1" + version: "0.0.2" flutter_lints: dependency: "direct dev" description: @@ -1273,13 +1273,14 @@ packages: source: hosted version: "1.0.11" logger: - dependency: transitive + dependency: "direct main" description: - name: logger - sha256: "697d067c60c20999686a0add96cf6aba723b3aa1f83ecf806a8097231529ec32" - url: "https://pub.dev" - source: hosted - version: "2.4.0" + path: "." + ref: "3c0cba27868ebb5c7d65ebc30a8e6e5342186692" + resolved-ref: "3c0cba27868ebb5c7d65ebc30a8e6e5342186692" + url: "https://github.com/cypherstack/logger" + source: git + version: "2.5.0" logging: dependency: transitive description: diff --git a/scripts/app_config/templates/pubspec.template b/scripts/app_config/templates/pubspec.template index bdb0df341..0acdc1a4d 100644 --- a/scripts/app_config/templates/pubspec.template +++ b/scripts/app_config/templates/pubspec.template @@ -33,7 +33,7 @@ dependencies: flutter_libsparkmobile: git: url: https://github.com/cypherstack/flutter_libsparkmobile.git - ref: 9318bdd8e76e4dc8a49e3d64e8851c85e017eff3 + ref: dd1e2a31bab034c97f8ea5745d1aa0b70c245490 # cs_monero compat (unpublished) compat: @@ -206,6 +206,11 @@ dependencies: cs_monero_flutter_libs: 1.0.0-pre.0 monero_rpc: ^2.0.0 digest_auth: ^1.0.1 +# logger: ^2.5.0 + logger: + git: + url: https://github.com/cypherstack/logger + ref: 3c0cba27868ebb5c7d65ebc30a8e6e5342186692 dev_dependencies: flutter_test: @@ -233,6 +238,11 @@ flutter_native_splash: android_disable_fullscreen: true dependency_overrides: + logger: + git: + url: https://github.com/cypherstack/logger + ref: 3c0cba27868ebb5c7d65ebc30a8e6e5342186692 + # required to make devicelocale work web: ^0.5.0 From b05f6640889e8c523b02909751c49e6e2e0927a1 Mon Sep 17 00:00:00 2001 From: Julian Date: Wed, 5 Feb 2025 13:48:47 -0600 Subject: [PATCH 056/193] disable logs location selection on macos for now --- .../advanced_settings/debug_info_dialog.dart | 128 +++++++++--------- 1 file changed, 66 insertions(+), 62 deletions(-) diff --git a/lib/pages_desktop_specific/settings/settings_menu/advanced_settings/debug_info_dialog.dart b/lib/pages_desktop_specific/settings/settings_menu/advanced_settings/debug_info_dialog.dart index 2aaed6c13..e3ab86431 100644 --- a/lib/pages_desktop_specific/settings/settings_menu/advanced_settings/debug_info_dialog.dart +++ b/lib/pages_desktop_specific/settings/settings_menu/advanced_settings/debug_info_dialog.dart @@ -178,75 +178,79 @@ class _DebugInfoDialog extends ConsumerState { onChanged: (newValue) {}, ), ), - const SizedBox( - height: 16, - ), - Padding( - padding: const EdgeInsets.symmetric(horizontal: 32), - child: Row( - children: [ - Expanded( - child: RoundedWhiteContainer( - borderColor: Theme.of(context) - .extension()! - .textSubtitle6, - child: Text( - "NOTE: ${AppConfig.appName} must be restarted in order" - " for the new path to take effect.", - style: STextStyles.desktopTextExtraExtraSmall(context), + if (!Platform.isMacOS) + const SizedBox( + height: 16, + ), + if (!Platform.isMacOS) + Padding( + padding: const EdgeInsets.symmetric(horizontal: 32), + child: Row( + children: [ + Expanded( + child: RoundedWhiteContainer( + borderColor: Theme.of(context) + .extension()! + .textSubtitle6, + child: Text( + "NOTE: ${AppConfig.appName} must be restarted in order" + " for the new path to take effect.", + style: STextStyles.desktopTextExtraExtraSmall(context), + ), ), ), - ), - ], + ], + ), ), - ), - const SizedBox( - height: 16, - ), - Padding( - padding: const EdgeInsets.all(32), - child: Row( - children: [ - const Spacer(), - const SizedBox( - width: 16, - ), - Expanded( - child: PrimaryButton( - label: "Edit", - onPressed: () async { - if (_lock) { - return; - } - _lock = true; - try { - await _edit(); - } catch (e, s) { - Logging.instance.e( - "Failed to change logs path", - error: e, - stackTrace: s, - ); - if (context.mounted) { - unawaited( - showDialog( - context: context, - builder: (context) => StackOkDialog( - title: "Failed to change logs path", - message: e.toString(), - ), - ), + if (!Platform.isMacOS) + const SizedBox( + height: 16, + ), + if (!Platform.isMacOS) + Padding( + padding: const EdgeInsets.all(32), + child: Row( + children: [ + const Spacer(), + const SizedBox( + width: 16, + ), + Expanded( + child: PrimaryButton( + label: "Edit", + onPressed: () async { + if (_lock) { + return; + } + _lock = true; + try { + await _edit(); + } catch (e, s) { + Logging.instance.e( + "Failed to change logs path", + error: e, + stackTrace: s, ); + if (context.mounted) { + unawaited( + showDialog( + context: context, + builder: (context) => StackOkDialog( + title: "Failed to change logs path", + message: e.toString(), + ), + ), + ); + } + } finally { + _lock = false; } - } finally { - _lock = false; - } - }, + }, + ), ), - ), - ], + ], + ), ), - ), ], ), ); From 452f4a7daad0f1faf84d2ad0caaf5d4be1d6dcd3 Mon Sep 17 00:00:00 2001 From: Julian Date: Wed, 5 Feb 2025 14:08:45 -0600 Subject: [PATCH 057/193] macos file entitlements for updated file picker to allow SWB save/load --- macos/Flutter/GeneratedPluginRegistrant.swift | 2 ++ macos/Runner/DebugProfile.entitlements | 10 ++++++---- macos/Runner/Release.entitlements | 10 ++++++---- 3 files changed, 14 insertions(+), 8 deletions(-) diff --git a/macos/Flutter/GeneratedPluginRegistrant.swift b/macos/Flutter/GeneratedPluginRegistrant.swift index 66db749d9..245400e1a 100644 --- a/macos/Flutter/GeneratedPluginRegistrant.swift +++ b/macos/Flutter/GeneratedPluginRegistrant.swift @@ -11,6 +11,7 @@ import cs_monero_flutter_libs_macos import desktop_drop import device_info_plus import devicelocale +import file_picker import flutter_libepiccash import flutter_local_notifications import flutter_secure_storage_macos @@ -33,6 +34,7 @@ func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) { DesktopDropPlugin.register(with: registry.registrar(forPlugin: "DesktopDropPlugin")) DeviceInfoPlusMacosPlugin.register(with: registry.registrar(forPlugin: "DeviceInfoPlusMacosPlugin")) DevicelocalePlugin.register(with: registry.registrar(forPlugin: "DevicelocalePlugin")) + FilePickerPlugin.register(with: registry.registrar(forPlugin: "FilePickerPlugin")) FlutterLibepiccashPlugin.register(with: registry.registrar(forPlugin: "FlutterLibepiccashPlugin")) FlutterLocalNotificationsPlugin.register(with: registry.registrar(forPlugin: "FlutterLocalNotificationsPlugin")) FlutterSecureStoragePlugin.register(with: registry.registrar(forPlugin: "FlutterSecureStoragePlugin")) diff --git a/macos/Runner/DebugProfile.entitlements b/macos/Runner/DebugProfile.entitlements index 3d2512f1e..4dad60b7a 100644 --- a/macos/Runner/DebugProfile.entitlements +++ b/macos/Runner/DebugProfile.entitlements @@ -6,13 +6,15 @@ com.apple.security.cs.allow-jit - com.apple.security.network.server + com.apple.security.device.audio-input + + com.apple.security.device.camera + + com.apple.security.files.user-selected.read-write com.apple.security.network.client - - com.apple.security.device.audio-input - com.apple.security.device.camera + com.apple.security.network.server diff --git a/macos/Runner/Release.entitlements b/macos/Runner/Release.entitlements index 4094a6367..7c2b75281 100644 --- a/macos/Runner/Release.entitlements +++ b/macos/Runner/Release.entitlements @@ -4,13 +4,15 @@ com.apple.security.app-sandbox - com.apple.security.network.client + com.apple.security.device.audio-input - com.apple.security.network.server + com.apple.security.device.camera - com.apple.security.device.audio-input + com.apple.security.files.user-selected.read-write - com.apple.security.device.camera + com.apple.security.network.client + + com.apple.security.network.server From b9ed3ae0a055f6c3f08b652c0bf292c2ec2ee758 Mon Sep 17 00:00:00 2001 From: julian Date: Wed, 5 Feb 2025 14:47:56 -0600 Subject: [PATCH 058/193] update file_picker --- pubspec.lock | 6 +++--- scripts/app_config/templates/pubspec.template | 11 ++++------- 2 files changed, 7 insertions(+), 10 deletions(-) diff --git a/pubspec.lock b/pubspec.lock index 396ffcdbd..590466016 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -758,11 +758,11 @@ packages: dependency: "direct main" description: path: "." - ref: "9abc0930081c9859884e073bd25ab88b2114d9e7" - resolved-ref: "9abc0930081c9859884e073bd25ab88b2114d9e7" + ref: b2849e63e1d418ad8d943c886cd3f4ed20d0ff23 + resolved-ref: b2849e63e1d418ad8d943c886cd3f4ed20d0ff23 url: "https://github.com/cypherstack/flutter_file_picker.git" source: git - version: "8.0.3" + version: "8.3.1" fixnum: dependency: transitive description: diff --git a/scripts/app_config/templates/pubspec.template b/scripts/app_config/templates/pubspec.template index 0acdc1a4d..5a2b8e6cd 100644 --- a/scripts/app_config/templates/pubspec.template +++ b/scripts/app_config/templates/pubspec.template @@ -138,7 +138,10 @@ dependencies: pointycastle: ^3.6.0 package_info_plus: ^8.0.2 lottie: ^2.3.2 - file_picker: ^8.0.3 + file_picker: + git: + url: https://github.com/cypherstack/flutter_file_picker.git + ref: b2849e63e1d418ad8d943c886cd3f4ed20d0ff23 connectivity_plus: ^4.0.1 isar: version: 3.1.8 @@ -280,12 +283,6 @@ dependency_overrides: url: https://github.com/cypherstack/stack-bip39.git ref: 0cd6d54e2860bea68fc50c801cb9db2a760192fb - - file_picker: - git: - url: https://github.com/cypherstack/flutter_file_picker.git - ref: 9abc0930081c9859884e073bd25ab88b2114d9e7 - crypto: 3.0.2 analyzer: ^6.7.0 pinenacl: ^0.6.0 From 176f0ba3316393388c9bf26229945d360f05dc9d Mon Sep 17 00:00:00 2001 From: julian Date: Wed, 5 Feb 2025 14:57:55 -0600 Subject: [PATCH 059/193] clean up some prints and use logging instead in some places --- .../exchange/nanswap/nanswap_exchange.dart | 1 - lib/utilities/address_utils.dart | 16 +++- lib/wallets/api/tezos/tezos_api.dart | 2 - .../paynym_follow_toggle_button.dart | 73 +++++++++++-------- lib/widgets/date_picker/date_picker.dart | 3 +- 5 files changed, 54 insertions(+), 41 deletions(-) diff --git a/lib/services/exchange/nanswap/nanswap_exchange.dart b/lib/services/exchange/nanswap/nanswap_exchange.dart index a2de87c33..de89b886e 100644 --- a/lib/services/exchange/nanswap/nanswap_exchange.dart +++ b/lib/services/exchange/nanswap/nanswap_exchange.dart @@ -80,7 +80,6 @@ class NanswapExchange extends Exchange { } final t = response.value!; - print(t); return ExchangeResponse( value: Trade( diff --git a/lib/utilities/address_utils.dart b/lib/utilities/address_utils.dart index efac56d64..06455fcec 100644 --- a/lib/utilities/address_utils.dart +++ b/lib/utilities/address_utils.dart @@ -72,8 +72,12 @@ class AddressUtils { result["tx_description"] = Uri.decodeComponent(u.fragment); } } - } catch (e) { - print("Exception caught in parseUri($uri): $e"); + } catch (e, s) { + Logging.instance.d( + "Exception caught in parseUri($uri): $e", + error: e, + stackTrace: s, + ); } return result; } @@ -199,8 +203,12 @@ class AddressUtils { Map result = {}; try { result = Map.from(jsonDecode(data) as Map); - } catch (e) { - print("Exception caught in parseQRSeedData($data): $e"); + } catch (e, s) { + Logging.instance.d( + "Exception caught in parseQRSeedData($data)", + error: e, + stackTrace: s, + ); } return result; } diff --git a/lib/wallets/api/tezos/tezos_api.dart b/lib/wallets/api/tezos/tezos_api.dart index abe126ac3..b52c2228f 100644 --- a/lib/wallets/api/tezos/tezos_api.dart +++ b/lib/wallets/api/tezos/tezos_api.dart @@ -51,8 +51,6 @@ abstract final class TezosAPI { final account = TezosAccount.fromMap(Map.from(result)); - print("Get account =================== $account"); - return account; } catch (e, s) { Logging.instance.log( diff --git a/lib/widgets/custom_buttons/paynym_follow_toggle_button.dart b/lib/widgets/custom_buttons/paynym_follow_toggle_button.dart index daa87415c..a2c4db100 100644 --- a/lib/widgets/custom_buttons/paynym_follow_toggle_button.dart +++ b/lib/widgets/custom_buttons/paynym_follow_toggle_button.dart @@ -22,6 +22,7 @@ import '../../providers/global/wallets_provider.dart'; import '../../providers/wallet/my_paynym_account_state_provider.dart'; import '../../themes/stack_colors.dart'; import '../../utilities/assets.dart'; +import '../../utilities/logger.dart'; import '../../utilities/util.dart'; import '../../wallets/wallet/wallet_mixin_interfaces/paynym_interface.dart'; import '../desktop/primary_button.dart'; @@ -109,23 +110,25 @@ class _PaynymFollowToggleButtonState ); await Future.delayed(const Duration(milliseconds: 200)); - print("RRR result: $result"); + Logging.instance.d("PayNym follow result: $result"); } - print("Follow result: $result on try $i"); + Logging.instance.d("Follow result: $result on try $i"); if (result.value!.following == followedAccount.value!.nymID) { if (!loadingPopped && mounted) { Navigator.of(context, rootNavigator: isDesktop).pop(); } - unawaited( - showFloatingFlushBar( - type: FlushBarType.success, - message: "You are following ${followedAccount.value!.nymName}", - context: context, - ), - ); + if (mounted) { + unawaited( + showFloatingFlushBar( + type: FlushBarType.success, + message: "You are following ${followedAccount.value!.nymName}", + context: context, + ), + ); + } final myAccount = ref.read(myPaynymAccountStateProvider.state).state!; @@ -150,13 +153,15 @@ class _PaynymFollowToggleButtonState Navigator.of(context, rootNavigator: isDesktop).pop(); } - unawaited( - showFloatingFlushBar( - type: FlushBarType.warning, - message: "Failed to follow ${followedAccount.value!.nymName}", - context: context, - ), - ); + if (mounted) { + unawaited( + showFloatingFlushBar( + type: FlushBarType.warning, + message: "Failed to follow ${followedAccount.value!.nymName}", + context: context, + ), + ); + } return false; } @@ -212,23 +217,25 @@ class _PaynymFollowToggleButtonState followedAccount.value!.nonSegwitPaymentCode.code, ); await Future.delayed(const Duration(milliseconds: 200)); - print("unfollow RRR result: $result"); + Logging.instance.d("PayNym unfollow result: $result"); } - print("Unfollow result: $result on try $i"); + Logging.instance.d("Unfollow result: $result on try $i"); if (result.value!.unfollowing == followedAccount.value!.nymID) { if (!loadingPopped && mounted) { Navigator.of(context, rootNavigator: isDesktop).pop(); } - unawaited( - showFloatingFlushBar( - type: FlushBarType.success, - message: "You have unfollowed ${followedAccount.value!.nymName}", - context: context, - ), - ); + if (mounted) { + unawaited( + showFloatingFlushBar( + type: FlushBarType.success, + message: "You have unfollowed ${followedAccount.value!.nymName}", + context: context, + ), + ); + } final myAccount = ref.read(myPaynymAccountStateProvider.state).state!; @@ -247,13 +254,15 @@ class _PaynymFollowToggleButtonState Navigator.of(context, rootNavigator: isDesktop).pop(); } - unawaited( - showFloatingFlushBar( - type: FlushBarType.warning, - message: "Failed to unfollow ${followedAccount.value!.nymName}", - context: context, - ), - ); + if (mounted) { + unawaited( + showFloatingFlushBar( + type: FlushBarType.warning, + message: "Failed to unfollow ${followedAccount.value!.nymName}", + context: context, + ), + ); + } return false; } diff --git a/lib/widgets/date_picker/date_picker.dart b/lib/widgets/date_picker/date_picker.dart index cd843e542..328e2c096 100644 --- a/lib/widgets/date_picker/date_picker.dart +++ b/lib/widgets/date_picker/date_picker.dart @@ -2,6 +2,7 @@ import 'dart:math'; import 'package:calendar_date_picker2/calendar_date_picker2.dart'; import 'package:flutter/material.dart'; + import '../../themes/stack_colors.dart'; import '../../utilities/constants.dart'; import '../../utilities/util.dart'; @@ -22,8 +23,6 @@ Future showSWDatePicker(BuildContext context) async { _size.height >= 550 ? 450 : _size.height - 32, ); } - print("====================================="); - print(size); final now = DateTime.now(); From 68c7ba69103c6c1890eb7fb1170e488792c07a35 Mon Sep 17 00:00:00 2001 From: julian Date: Wed, 5 Feb 2025 17:01:40 -0600 Subject: [PATCH 060/193] log level preference --- lib/main.dart | 21 +-- .../advanced_views/logging_settings_view.dart | 105 +------------ .../global_settings_view/hidden_settings.dart | 23 +++ .../advanced_settings/debug_info_dialog.dart | 14 +- lib/utilities/logger.dart | 5 +- lib/utilities/prefs.dart | 31 ++++ .../spark_interface.dart | 43 ++++-- lib/widgets/log_level_preference_widget.dart | 142 ++++++++++++++++++ 8 files changed, 249 insertions(+), 135 deletions(-) create mode 100644 lib/widgets/log_level_preference_widget.dart diff --git a/lib/main.dart b/lib/main.dart index 3ec3643f0..65a1ff360 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -18,7 +18,6 @@ import 'package:cs_monero/cs_monero.dart' as lib_monero; import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; -import 'package:flutter_libsparkmobile/flutter_libsparkmobile.dart' as spark; import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:flutter_secure_storage/flutter_secure_storage.dart'; import 'package:google_fonts/google_fonts.dart'; @@ -72,6 +71,7 @@ import 'utilities/prefs.dart'; import 'utilities/stack_file_system.dart'; import 'utilities/util.dart'; import 'wallets/isar/providers/all_wallets_info_provider.dart'; +import 'wallets/wallet/wallet_mixin_interfaces/spark_interface.dart'; import 'widgets/crypto_notifications.dart'; final openedFromSWBFileStringStateProvider = @@ -165,24 +165,11 @@ void main(List args) async { await Logging.instance.initialize( (await StackFileSystem.applicationLogsDirectory(Prefs.instance)).path, + level: Prefs.instance.logLevel, ); - spark.Log.levels.addAll(spark.LoggingLevel.values); - spark.Log.onLog = ( - level, - value, { - error, - stackTrace, - required time, - }) { - Logging.instance.lg( - level.getLoggerLevel(), - value, - error: error, - stackTrace: stackTrace, - time: time, - ); - }; + // setup lib spark logging + initSparkLogging(Prefs.instance.logLevel); if (AppConfig.appName == "Campfire" && !Util.isDesktop && diff --git a/lib/pages/settings_views/global_settings_view/advanced_views/logging_settings_view.dart b/lib/pages/settings_views/global_settings_view/advanced_views/logging_settings_view.dart index 5db54e93f..dc6c24013 100644 --- a/lib/pages/settings_views/global_settings_view/advanced_views/logging_settings_view.dart +++ b/lib/pages/settings_views/global_settings_view/advanced_views/logging_settings_view.dart @@ -26,6 +26,7 @@ import '../../../../utilities/text_styles.dart'; import '../../../../widgets/background.dart'; import '../../../../widgets/custom_buttons/app_bar_icon_button.dart'; import '../../../../widgets/desktop/primary_button.dart'; +import '../../../../widgets/log_level_preference_widget.dart'; import '../../../../widgets/rounded_white_container.dart'; import '../../../../widgets/stack_dialog.dart'; @@ -117,102 +118,6 @@ class _LoggingSettingsViewState extends ConsumerState { "Logging", style: STextStyles.navBarTitle(context), ), - // actions: [ - // Padding( - // padding: const EdgeInsets.only( - // top: 10, - // bottom: 10, - // right: 10, - // ), - // child: AspectRatio( - // aspectRatio: 1, - // child: AppBarIconButton( - // key: const Key("deleteLogsAppBarButtonKey"), - // size: 36, - // shadows: const [], - // color: Theme.of(context).extension()!.background, - // icon: SvgPicture.asset( - // Assets.svg.trash, - // color: Theme.of(context) - // .extension()! - // .accentColorDark, - // width: 20, - // height: 20, - // ), - // onPressed: () async { - // await showDialog( - // context: context, - // builder: (_) => StackDialog( - // title: "Delete logs?", - // message: - // "You are about to delete all logs permanently. Are you sure?", - // leftButton: TextButton( - // style: Theme.of(context) - // .extension()! - // .getSecondaryEnabledButtonStyle(context), - // child: Text( - // "Cancel", - // style: STextStyles.itemSubtitle12(context), - // ), - // onPressed: () { - // Navigator.of(context).pop(); - // }, - // ), - // rightButton: TextButton( - // style: Theme.of(context) - // .extension()! - // .getPrimaryEnabledButtonStyle(context), - // child: Text( - // "Delete logs", - // style: STextStyles.button(context), - // ), - // onPressed: () async { - // Navigator.of(context).pop(); - // - // bool shouldPop = false; - // unawaited( - // showDialog( - // barrierDismissible: false, - // context: context, - // builder: (_) => WillPopScope( - // onWillPop: () async { - // return shouldPop; - // }, - // child: const CustomLoadingOverlay( - // message: "Deleting logs...", - // eventBus: null, - // ), - // ), - // ), - // ); - // - // await ref - // .read(debugServiceProvider) - // .deleteAllLogs(); - // - // shouldPop = true; - // - // if (mounted) { - // Navigator.pop(context); - // unawaited( - // showFloatingFlushBar( - // type: FlushBarType.info, - // context: context, - // message: 'Logs cleared!', - // ), - // ); - // - // setState(() {}); - // } - // }, - // ), - // ), - // ); - // }, - // ), - // ), - // ), - // ], ), body: SafeArea( child: Padding( @@ -279,13 +184,17 @@ class _LoggingSettingsViewState extends ConsumerState { const SizedBox( height: 16, ), + const LogLevelPreferenceWidget(), + const SizedBox( + height: 16, + ), Row( children: [ Expanded( child: RoundedWhiteContainer( child: Text( "NOTE: ${AppConfig.appName} must be restarted in order" - " for the new path to take effect.", + " for changes to take effect.", style: STextStyles.subtitle500(context), ), ), @@ -297,7 +206,7 @@ class _LoggingSettingsViewState extends ConsumerState { ), const Spacer(), PrimaryButton( - label: "Edit", + label: "Select log save location", onPressed: () async { if (_lock) { return; diff --git a/lib/pages/settings_views/global_settings_view/hidden_settings.dart b/lib/pages/settings_views/global_settings_view/hidden_settings.dart index 6a036c3e4..99fb927cb 100644 --- a/lib/pages/settings_views/global_settings_view/hidden_settings.dart +++ b/lib/pages/settings_views/global_settings_view/hidden_settings.dart @@ -147,6 +147,29 @@ class HiddenSettings extends StatelessWidget { ); }, ), + const SizedBox( + height: 12, + ), + Consumer( + builder: (_, ref, __) { + return GestureDetector( + onTap: () async { + ref.read(prefsChangeNotifierProvider).logsPath = + null; + }, + child: RoundedWhiteContainer( + child: Text( + "Reset log location", + style: STextStyles.button(context).copyWith( + color: Theme.of(context) + .extension()! + .accentColorDark, + ), + ), + ), + ); + }, + ), // const SizedBox( // height: 12, // ), diff --git a/lib/pages_desktop_specific/settings/settings_menu/advanced_settings/debug_info_dialog.dart b/lib/pages_desktop_specific/settings/settings_menu/advanced_settings/debug_info_dialog.dart index e3ab86431..14048b7d9 100644 --- a/lib/pages_desktop_specific/settings/settings_menu/advanced_settings/debug_info_dialog.dart +++ b/lib/pages_desktop_specific/settings/settings_menu/advanced_settings/debug_info_dialog.dart @@ -25,6 +25,7 @@ import '../../../../utilities/text_styles.dart'; import '../../../../widgets/desktop/desktop_dialog.dart'; import '../../../../widgets/desktop/desktop_dialog_close_button.dart'; import '../../../../widgets/desktop/primary_button.dart'; +import '../../../../widgets/log_level_preference_widget.dart'; import '../../../../widgets/rounded_white_container.dart'; import '../../../../widgets/stack_dialog.dart'; @@ -178,9 +179,16 @@ class _DebugInfoDialog extends ConsumerState { onChanged: (newValue) {}, ), ), + const SizedBox( + height: 8, + ), + const Padding( + padding: EdgeInsets.all(32), + child: LogLevelPreferenceWidget(), + ), if (!Platform.isMacOS) const SizedBox( - height: 16, + height: 8, ), if (!Platform.isMacOS) Padding( @@ -194,7 +202,7 @@ class _DebugInfoDialog extends ConsumerState { .textSubtitle6, child: Text( "NOTE: ${AppConfig.appName} must be restarted in order" - " for the new path to take effect.", + " for changes to take effect.", style: STextStyles.desktopTextExtraExtraSmall(context), ), ), @@ -217,7 +225,7 @@ class _DebugInfoDialog extends ConsumerState { ), Expanded( child: PrimaryButton( - label: "Edit", + label: "Select log save location", onPressed: () async { if (_lock) { return; diff --git a/lib/utilities/logger.dart b/lib/utilities/logger.dart index 5b446e283..0306f21aa 100644 --- a/lib/utilities/logger.dart +++ b/lib/utilities/logger.dart @@ -61,7 +61,7 @@ class Logging { return port; } - Future initialize(String logsPath) async { + Future initialize(String logsPath, {required Level level}) async { if (Isolate.current.debugName != "main") { throw Exception( "Logging.initialize() must be called on the main isolate.", @@ -92,11 +92,14 @@ class Logging { final consoleLogger = Logger( printer: PrefixPrinter(prettyPrinter(false)), + filter: ProductionFilter(), + level: level, ); final fileLogger = Logger( printer: PrefixPrinter(prettyPrinter(true)), filter: ProductionFilter(), + level: level, output: AdvancedFileOutput( path: logsDirPath, overrideExisting: false, diff --git a/lib/utilities/prefs.dart b/lib/utilities/prefs.dart index a2b51c89d..395e5ecd6 100644 --- a/lib/utilities/prefs.dart +++ b/lib/utilities/prefs.dart @@ -11,6 +11,7 @@ import 'dart:async'; import 'package:flutter/cupertino.dart'; +import 'package:logger/logger.dart'; import 'package:uuid/uuid.dart'; import '../app_config.dart'; @@ -74,6 +75,7 @@ class Prefs extends ChangeNotifier { _enableExchange = await _getEnableExchange(); _advancedFiroFeatures = await _getAdvancedFiroFeatures(); _logsPath = await _getLogsPath(); + _logLevel = await _getLogLevel(); _initialized = true; } @@ -1205,4 +1207,33 @@ class Prefs extends ChangeNotifier { key: "logsPath", ) as String?; } + + // log level pref + Level _logLevel = Level.warning; + Level get logLevel => _logLevel; + set logLevel(Level logLevel) { + if (_logLevel != logLevel) { + DB.instance.put( + boxName: DB.boxNamePrefs, + key: "logLevel", + value: logLevel.value, + ); + _logLevel = logLevel; + notifyListeners(); + } + } + + Future _getLogLevel() async { + final value = await DB.instance.get( + boxName: DB.boxNamePrefs, + key: "logLevel", + ) as int?; + + try { + return Level.values.firstWhere((e) => e.value == value); + } catch (_) { + // default to warning + return Level.warning; + } + } } diff --git a/lib/wallets/wallet/wallet_mixin_interfaces/spark_interface.dart b/lib/wallets/wallet/wallet_mixin_interfaces/spark_interface.dart index b9107fa29..27ac00190 100644 --- a/lib/wallets/wallet/wallet_mixin_interfaces/spark_interface.dart +++ b/lib/wallets/wallet/wallet_mixin_interfaces/spark_interface.dart @@ -9,6 +9,7 @@ import 'package:flutter_libsparkmobile/flutter_libsparkmobile.dart' as spark show Log; import 'package:flutter_libsparkmobile/flutter_libsparkmobile.dart'; import 'package:isar/isar.dart'; +import 'package:logger/logger.dart'; import '../../../db/sqlite/firo_cache.dart'; import '../../../models/balance.dart'; @@ -23,6 +24,7 @@ import '../../../utilities/amount/amount.dart'; import '../../../utilities/enums/derive_path_type_enum.dart'; import '../../../utilities/extensions/extensions.dart'; import '../../../utilities/logger.dart'; +import '../../../utilities/prefs.dart'; import '../../crypto_currency/interfaces/electrumx_currency_interface.dart'; import '../../isar/models/spark_coin.dart'; import '../../isar/models/wallet_info.dart'; @@ -53,30 +55,39 @@ String _hashTag(String tag) { return hash; } +void initSparkLogging(Level level) { + final levels = Level.values.where((e) => e >= level).map((e) => e.name); + spark.Log.levels + .addAll(LoggingLevel.values.where((e) => levels.contains(e.name))); + spark.Log.onLog = ( + level, + value, { + error, + stackTrace, + required time, + }) { + Logging.instance.lg( + level.getLoggerLevel(), + value, + error: error, + stackTrace: stackTrace, + time: time, + ); + }; +} + abstract class _SparkIsolate { static Isolate? _isolate; static SendPort? _sendPort; static final ReceivePort _receivePort = ReceivePort(); static Future initialize() async { + final level = Prefs.instance.logLevel; + _isolate = await Isolate.spawn( (SendPort sendPort) { - spark.Log.levels.addAll(LoggingLevel.values); - spark.Log.onLog = ( - level, - value, { - error, - stackTrace, - required time, - }) { - Logging.instance.lg( - level.getLoggerLevel(), - value, - error: error, - stackTrace: stackTrace, - time: time, - ); - }; + initSparkLogging(level); // ensure logging is set up in isolate + final receivePort = ReceivePort(); sendPort.send(receivePort.sendPort); diff --git a/lib/widgets/log_level_preference_widget.dart b/lib/widgets/log_level_preference_widget.dart new file mode 100644 index 000000000..7a889564d --- /dev/null +++ b/lib/widgets/log_level_preference_widget.dart @@ -0,0 +1,142 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:logger/logger.dart'; + +import '../providers/global/prefs_provider.dart'; +import '../themes/stack_colors.dart'; +import '../utilities/extensions/extensions.dart'; +import '../utilities/text_styles.dart'; +import '../utilities/util.dart'; +import 'rounded_container.dart'; + +class LogLevelPreferenceWidget extends ConsumerStatefulWidget { + const LogLevelPreferenceWidget({super.key}); + + @override + ConsumerState createState() => + _LogLevelPreferenceWidgetState(); +} + +class _LogLevelPreferenceWidgetState + extends ConsumerState { + double _sliderValue = 0; + static const List _levels = [ + Level.off, + Level.fatal, + Level.error, + Level.warning, + Level.info, + Level.debug, + Level.trace, + ]; + + @override + void initState() { + super.initState(); + _sliderValue = _levels + .indexOf(ref.read(prefsChangeNotifierProvider).logLevel) + .toDouble(); + } + + @override + Widget build(BuildContext context) { + final current = + ref.watch(prefsChangeNotifierProvider.select((s) => s.logLevel)); + return Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + "Current level: ${current.name.capitalize()}", + style: Util.isDesktop + ? STextStyles.desktopTextFieldLabel(context) + : STextStyles.fieldLabel(context), + textAlign: TextAlign.left, + ), + Slider( + min: 0, + max: _levels.length - 1, + divisions: _levels.length - 1, + value: _sliderValue, + onChanged: (value) { + // setState(() { + _sliderValue = value; + // }); + ref.read(prefsChangeNotifierProvider).logLevel = + _levels[_sliderValue.toInt()]; + }, + ), + if (current == Level.debug || current == Level.trace) + Padding( + padding: const EdgeInsets.only(top: 10), + child: RoundedContainer( + color: + Theme.of(context).extension()!.warningBackground, + child: RichText( + text: TextSpan( + text: "Privacy Warning: ", + style: STextStyles.label700(context).copyWith( + color: Theme.of(context) + .extension()! + .warningForeground, + fontSize: Util.isDesktop ? 14 : 12, + ), + children: [ + TextSpan( + text: "Selecting ", + style: STextStyles.label(context).copyWith( + color: Theme.of(context) + .extension()! + .warningForeground, + fontSize: Util.isDesktop ? 14 : 12, + ), + ), + TextSpan( + text: "Trace", + style: STextStyles.label700(context).copyWith( + color: Theme.of(context) + .extension()! + .warningForeground, + fontSize: Util.isDesktop ? 14 : 12, + ), + ), + TextSpan( + text: " or ", + style: STextStyles.label(context).copyWith( + color: Theme.of(context) + .extension()! + .warningForeground, + fontSize: Util.isDesktop ? 14 : 12, + ), + ), + TextSpan( + text: "Debug", + style: STextStyles.label700(context).copyWith( + color: Theme.of(context) + .extension()! + .warningForeground, + fontSize: Util.isDesktop ? 14 : 12, + ), + ), + TextSpan( + text: " may log sensitive metadata, such as transaction" + " details, addresses, or network activity. While no" + " private keys, mnemonics, or credentials will ever " + "be logged, enabling these levels could expose " + "information that might compromise privacy if " + "accessed by unauthorized parties.", + style: STextStyles.label(context).copyWith( + color: Theme.of(context) + .extension()! + .warningForeground, + fontSize: Util.isDesktop ? 14 : 12, + ), + ), + ], + ), + ), + ), + ), + ], + ); + } +} From 4589e42ac8322ffb85df524bab077020e4cae58f Mon Sep 17 00:00:00 2001 From: julian Date: Wed, 5 Feb 2025 17:07:49 -0600 Subject: [PATCH 061/193] refactor log function name --- lib/db/db_version_migration.dart | 6 +- lib/db/hive/db.dart | 4 +- lib/db/sqlite/firo_cache.dart | 2 +- lib/db/sqlite/firo_cache_coordinator.dart | 6 +- .../cached_electrumx_client.dart | 8 +- lib/electrumx_rpc/client_manager.dart | 2 +- lib/electrumx_rpc/electrumx_client.dart | 66 ++++----- lib/main.dart | 4 +- .../change_now/cn_exchange_estimate.dart | 3 +- .../change_now/estimated_exchange_amount.dart | 2 +- .../exchange_transaction_status.dart | 4 +- .../exchange/response_objects/estimate.dart | 4 +- .../response_objects/fixed_rate_market.dart | 3 +- .../exchange/simpleswap/sp_currency.dart | 2 +- lib/models/isar/stack_theme.dart | 2 +- lib/networking/http.dart | 6 +- .../new/steps/frost_create_step_2.dart | 5 +- .../new/steps/frost_create_step_3.dart | 2 +- .../new/steps/frost_create_step_5.dart | 2 +- .../reshare/frost_reshare_step_1a.dart | 2 +- .../reshare/frost_reshare_step_1b.dart | 2 +- .../reshare/frost_reshare_step_1c.dart | 2 +- .../reshare/frost_reshare_step_2abd.dart | 2 +- .../reshare/frost_reshare_step_2c.dart | 2 +- .../reshare/frost_reshare_step_3abd.dart | 2 +- .../reshare/frost_reshare_step_4.dart | 2 +- .../reshare/frost_reshare_step_5.dart | 2 +- .../restore/restore_frost_ms_wallet_view.dart | 6 +- ...w_wallet_recovery_phrase_warning_view.dart | 2 +- .../restore_wallet_view.dart | 8 +- .../sub_widgets/restore_failed_dialog.dart | 3 +- .../verify_recovery_phrase_view.dart | 2 +- .../new_contact_address_entry_form.dart | 2 +- lib/pages/buy_view/buy_form.dart | 14 +- .../sub_widgets/crypto_selection_view.dart | 2 +- .../confirm_change_now_send.dart | 2 +- .../exchange_step_views/step_2_view.dart | 8 +- .../exchange_step_views/step_4_view.dart | 2 +- lib/pages/exchange_view/send_from_view.dart | 2 +- .../sub_widgets/exchange_provider_option.dart | 2 +- .../subwidgets/paynym_followers_list.dart | 5 +- .../subwidgets/paynym_following_list.dart | 5 +- .../generate_receiving_uri_qr_code_view.dart | 2 +- lib/pages/send_view/frost_ms/recipient.dart | 6 +- .../send_steps/frost_send_step_1a.dart | 2 +- .../send_steps/frost_send_step_1b.dart | 2 +- .../send_steps/frost_send_step_2.dart | 2 +- .../send_steps/frost_send_step_3.dart | 2 +- .../send_steps/frost_send_step_4.dart | 2 +- lib/pages/send_view/send_view.dart | 12 +- .../transaction_fee_selection_sheet.dart | 2 +- lib/pages/send_view/token_send_view.dart | 12 +- .../install_theme_from_file_dialog.dart | 5 +- .../sub_widgets/stack_theme_card.dart | 2 +- .../add_edit_node_view.dart | 10 +- .../create_auto_backup_view.dart | 10 +- .../create_backup_view.dart | 2 +- .../edit_auto_backup_view.dart | 6 +- .../helpers/restore_create_backup.dart | 74 +++++----- .../restore_from_file_view.dart | 2 +- .../stack_restore_progress_view.dart | 2 +- .../tor_settings/tor_settings_view.dart | 4 +- .../complete_reshare_config_view.dart | 2 +- .../lelantus_settings_view.dart | 2 +- .../transaction_details_view.dart | 2 +- .../tx_v2/transaction_v2_details_view.dart | 2 +- lib/pages/wallet_view/wallet_view.dart | 2 +- .../coin_control/freeze_button.dart | 5 +- .../subwidgets/desktop_step_2.dart | 4 +- .../wallet_view/sub_widgets/desktop_send.dart | 16 +-- .../sub_widgets/desktop_token_send.dart | 10 +- .../sub_widgets/desktop_wallet_features.dart | 2 +- .../more_features/more_features_dialog.dart | 2 +- .../delete_password_warning_view.dart | 2 +- .../password/desktop_login_view.dart | 2 +- ...forgotten_passphrase_restore_from_swb.dart | 2 +- .../sub_widgets/desktop_install_theme.dart | 5 +- .../create_auto_backup.dart | 6 +- .../tor_settings/tor_settings.dart | 4 +- lib/services/auto_swb_service.dart | 12 +- lib/services/buy/simplex/simplex_api.dart | 19 +-- lib/services/coins/tezos/api/tezos_api.dart | 6 +- .../coins/tezos/api/tezos_rpc_api.dart | 4 +- .../ethereum/cached_eth_token_balance.dart | 2 +- lib/services/ethereum/ethereum_api.dart | 26 ++-- .../global/balance_refreshed_event.dart | 2 +- .../events/global/blocks_remaining_event.dart | 2 +- .../node_connection_status_changed_event.dart | 2 +- .../global/refresh_percent_changed_event.dart | 2 +- .../tor_connection_status_changed_event.dart | 2 +- .../global/tor_status_changed_event.dart | 2 +- .../global/updated_in_background_event.dart | 2 +- .../wallet_sync_status_changed_event.dart | 2 +- .../exchange/change_now/change_now_api.dart | 48 +++---- .../exchange_data_loading_service.dart | 14 +- .../majestic_bank/majestic_bank_api.dart | 24 ++-- .../exchange/nanswap/nanswap_api.dart | 18 +-- .../exchange/simpleswap/simpleswap_api.dart | 27 ++-- .../exchange/trocador/trocador_api.dart | 14 +- lib/services/frost.dart | 40 +++--- lib/services/fusion_tor_service.dart | 5 +- lib/services/monkey_service.dart | 5 +- lib/services/node_service.dart | 4 +- lib/services/notifications_service.dart | 4 +- lib/services/price.dart | 12 +- lib/services/tor_service.dart | 2 +- lib/services/wallets.dart | 26 ++-- lib/services/wallets_service.dart | 7 +- lib/themes/theme_service.dart | 16 +-- lib/utilities/address_utils.dart | 2 +- lib/utilities/biometrics.dart | 8 +- .../electrum_connection_check.dart | 4 +- lib/utilities/desktop_password_service.dart | 12 +- .../extensions/impl/contract_abi.dart | 2 +- lib/utilities/git_status.dart | 16 +-- lib/utilities/logger.dart | 20 +-- lib/utilities/show_loading.dart | 2 +- lib/utilities/test_epic_box_connection.dart | 4 +- .../test_monero_node_connection.dart | 6 +- lib/utilities/test_node_connection.dart | 12 +- lib/wallets/api/lelantus_ffi_wrapper.dart | 2 +- lib/wallets/api/tezos/tezos_api.dart | 6 +- lib/wallets/api/tezos/tezos_rpc_api.dart | 4 +- .../wallet/impl/bitcoin_frost_wallet.dart | 39 ++--- .../wallet/impl/bitcoincash_wallet.dart | 6 +- lib/wallets/wallet/impl/cardano_wallet.dart | 16 +-- lib/wallets/wallet/impl/dash_wallet.dart | 2 +- lib/wallets/wallet/impl/dogecoin_wallet.dart | 2 +- lib/wallets/wallet/impl/ecash_wallet.dart | 4 +- lib/wallets/wallet/impl/epiccash_wallet.dart | 51 +++---- lib/wallets/wallet/impl/ethereum_wallet.dart | 8 +- lib/wallets/wallet/impl/firo_wallet.dart | 24 ++-- lib/wallets/wallet/impl/litecoin_wallet.dart | 2 +- lib/wallets/wallet/impl/namecoin_wallet.dart | 2 +- lib/wallets/wallet/impl/particl_wallet.dart | 8 +- lib/wallets/wallet/impl/peercoin_wallet.dart | 2 +- lib/wallets/wallet/impl/solana_wallet.dart | 14 +- lib/wallets/wallet/impl/stellar_wallet.dart | 18 +-- .../impl/sub_wallets/eth_token_wallet.dart | 16 +-- lib/wallets/wallet/impl/tezos_wallet.dart | 18 +-- .../intermediate/lib_monero_wallet.dart | 34 ++--- .../epiccash_wallet_info_extension.dart | 3 +- lib/wallets/wallet/wallet.dart | 6 +- .../bcash_interface.dart | 4 +- .../cash_fusion_interface.dart | 8 +- .../electrumx_interface.dart | 135 +++++++++--------- .../lelantus_interface.dart | 43 +++--- .../nano_interface.dart | 8 +- .../ordinals_interface.dart | 4 +- .../paynym_interface.dart | 18 +-- .../rbf_interface.dart | 8 +- .../spark_interface.dart | 27 ++-- .../desktop/qr_code_scanner_dialog.dart | 25 ++-- lib/widgets/textfields/frost_step_field.dart | 4 +- lib/widgets/wallet_card.dart | 2 +- 155 files changed, 744 insertions(+), 713 deletions(-) diff --git a/lib/db/db_version_migration.dart b/lib/db/db_version_migration.dart index ea2bc6067..7fc07c2bb 100644 --- a/lib/db/db_version_migration.dart +++ b/lib/db/db_version_migration.dart @@ -45,7 +45,7 @@ class DbVersionMigrator with WalletDB { // safe to skip to v11 for campfire fromVersion = 11; } - Logging.instance.log( + Logging.instance.logd( "Running migrate fromVersion $fromVersion", level: LogLevel.Warning, ); @@ -105,7 +105,7 @@ class DbVersionMigrator with WalletDB { } catch (e) { // default to 2 for now latestSetId = 2; - Logging.instance.log( + Logging.instance.logd( "Failed to fetch latest coin id during firo db migrate: $e \nUsing a default value of 2", level: LogLevel.Warning, ); @@ -765,7 +765,7 @@ class DbVersionMigrator with WalletDB { // migrate to simple file based logs. Date/time may be out of order for (final log in allLogs) { - Logging.instance.lg( + Logging.instance.log( log.logLevel.getLoggerLevel(), "MIGRATED LOG::=> ${log.message}", time: DateTime.fromMillisecondsSinceEpoch(log.timestampInMillisUTC), diff --git a/lib/db/hive/db.dart b/lib/db/hive/db.dart index c71826fbc..be289d4cd 100644 --- a/lib/db/hive/db.dart +++ b/lib/db/hive/db.dart @@ -166,7 +166,7 @@ class DB { AppConfig.getCryptoCurrencyFor(jsonObject["coin"] as String); return false; } catch (e, s) { - Logging.instance.log( + Logging.instance.logd( "Error, ${jsonObject["coin"]} does not exist, $name wallet cannot be loaded", level: LogLevel.Error, ); @@ -343,7 +343,7 @@ class DB { await DB.instance.deleteBoxFromDisk(boxName: "theme"); return true; } catch (e, s) { - Logging.instance.log("$e $s", level: LogLevel.Error); + Logging.instance.logd("$e $s", level: LogLevel.Error); return false; } } diff --git a/lib/db/sqlite/firo_cache.dart b/lib/db/sqlite/firo_cache.dart index d32db1bf3..a3b2b8359 100644 --- a/lib/db/sqlite/firo_cache.dart +++ b/lib/db/sqlite/firo_cache.dart @@ -23,7 +23,7 @@ part 'firo_cache_writer.dart'; /// Temporary debugging log function for this file void _debugLog(Object? object) { if (kDebugMode) { - Logging.instance.log( + Logging.instance.logd( object, level: LogLevel.Debug, ); diff --git a/lib/db/sqlite/firo_cache_coordinator.dart b/lib/db/sqlite/firo_cache_coordinator.dart index a002dc222..84ad64b23 100644 --- a/lib/db/sqlite/firo_cache_coordinator.dart +++ b/lib/db/sqlite/firo_cache_coordinator.dart @@ -42,11 +42,11 @@ abstract class FiroCacheCoordinator { ? await usedTagsCacheFile.length() : 0; - Logging.instance.log( + Logging.instance.logd( "Spark cache used tags size: $tagsSize", level: LogLevel.Debug, ); - Logging.instance.log( + Logging.instance.logd( "Spark cache anon set size: $setSize", level: LogLevel.Debug, ); @@ -111,7 +111,7 @@ abstract class FiroCacheCoordinator { progressUpdated?.call(prevSize, meta.size); if (prevMeta?.blockHash == meta.blockHash) { - Logging.instance.log( + Logging.instance.logd( "prevMeta?.blockHash == meta.blockHash", level: LogLevel.Debug, ); diff --git a/lib/electrumx_rpc/cached_electrumx_client.dart b/lib/electrumx_rpc/cached_electrumx_client.dart index 8b1ff10c8..558561f13 100644 --- a/lib/electrumx_rpc/cached_electrumx_client.dart +++ b/lib/electrumx_rpc/cached_electrumx_client.dart @@ -100,7 +100,7 @@ class CachedElectrumXClient { } // save set to db await box.put(groupId, set); - Logging.instance.log( + Logging.instance.logd( "Updated current anonymity set for ${cryptoCurrency.identifier} with group ID $groupId", level: LogLevel.Info, ); @@ -108,7 +108,7 @@ class CachedElectrumXClient { return set; } catch (e, s) { - Logging.instance.log( + Logging.instance.logd( "Failed to process CachedElectrumX.getAnonymitySet(): $e\n$s", level: LogLevel.Error, ); @@ -162,7 +162,7 @@ class CachedElectrumXClient { return Map.from(cachedTx); } } catch (e, s) { - Logging.instance.log( + Logging.instance.logd( "Failed to process CachedElectrumX.getTransaction(): $e\n$s", level: LogLevel.Error, ); @@ -212,7 +212,7 @@ class CachedElectrumXClient { return resultingList; } catch (e, s) { - Logging.instance.log( + Logging.instance.logd( "Failed to process CachedElectrumX.getUsedCoinSerials(): $e\n$s", level: LogLevel.Error, ); diff --git a/lib/electrumx_rpc/client_manager.dart b/lib/electrumx_rpc/client_manager.dart index aea7e34e6..3199b840f 100644 --- a/lib/electrumx_rpc/client_manager.dart +++ b/lib/electrumx_rpc/client_manager.dart @@ -69,7 +69,7 @@ class ClientManager { _heightCompleters[key]!.complete(event.height); } }, - onError: (Object err, StackTrace s) => Logging.instance.log( + onError: (Object err, StackTrace s) => Logging.instance.logd( "ClientManager listen: $err\n$s", level: LogLevel.Error, ), diff --git a/lib/electrumx_rpc/electrumx_client.dart b/lib/electrumx_rpc/electrumx_client.dart index 8ff04712a..92bc7ab8a 100644 --- a/lib/electrumx_rpc/electrumx_client.dart +++ b/lib/electrumx_rpc/electrumx_client.dart @@ -233,7 +233,7 @@ class ElectrumXClient { if (!_prefs.torKillSwitch) { // Then we'll just proceed and connect to ElectrumX through // clearnet at the bottom of this function. - Logging.instance.log( + Logging.instance.logd( "Tor preference set but Tor is not enabled, killswitch not set," " connecting to Electrum adapter through clearnet", level: LogLevel.Warning, @@ -400,7 +400,7 @@ class ElectrumXClient { } } catch (e) { final errorMessage = e.toString(); - Logging.instance.log("$host $e", level: LogLevel.Debug); + Logging.instance.logd("$host $e", level: LogLevel.Debug); if (errorMessage.contains("JSON-RPC error")) { currentFailoverIndex = _failovers.length; } @@ -535,7 +535,7 @@ class ElectrumXClient { ).timeout( const Duration(seconds: 30), onTimeout: () { - Logging.instance.log( + Logging.instance.logd( "ElectrumxClient.ping timed out with retryCount=$retryCount, host=$_host", level: LogLevel.Debug, ); @@ -562,7 +562,7 @@ class ElectrumXClient { command: 'blockchain.headers.subscribe', ); if (response == null) { - Logging.instance.log( + Logging.instance.logd( "getBlockHeadTip returned null response", level: LogLevel.Error, ); @@ -761,7 +761,7 @@ class ElectrumXClient { // add empty list on error result.add([]); - Logging.instance.log( + Logging.instance.logd( "getBatchUTXOs failed to parse response=${response[i]}: $e", level: LogLevel.Error, ); @@ -826,13 +826,13 @@ class ElectrumXClient { bool verbose = true, String? requestID, }) async { - Logging.instance.log( + Logging.instance.logd( "attempting to fetch blockchain.transaction.get...", level: LogLevel.Info, ); await checkElectrumAdapter(); final dynamic response = await getElectrumAdapter()!.getTransaction(txHash); - Logging.instance.log( + Logging.instance.logd( "Fetching blockchain.transaction.get finished", level: LogLevel.Info, ); @@ -863,7 +863,7 @@ class ElectrumXClient { String blockhash = "", String? requestID, }) async { - Logging.instance.log( + Logging.instance.logd( "attempting to fetch lelantus.getanonymityset...", level: LogLevel.Info, ); @@ -871,7 +871,7 @@ class ElectrumXClient { final Map response = await (getElectrumAdapter() as FiroElectrumClient) .getLelantusAnonymitySet(groupId: groupId, blockHash: blockhash); - Logging.instance.log( + Logging.instance.logd( "Fetching lelantus.getanonymityset finished", level: LogLevel.Info, ); @@ -886,14 +886,14 @@ class ElectrumXClient { dynamic mints, String? requestID, }) async { - Logging.instance.log( + Logging.instance.logd( "attempting to fetch lelantus.getmintmetadata...", level: LogLevel.Info, ); await checkElectrumAdapter(); final dynamic response = await (getElectrumAdapter() as FiroElectrumClient) .getLelantusMintData(mints: mints); - Logging.instance.log( + Logging.instance.logd( "Fetching lelantus.getmintmetadata finished", level: LogLevel.Info, ); @@ -906,7 +906,7 @@ class ElectrumXClient { String? requestID, required int startNumber, }) async { - Logging.instance.log( + Logging.instance.logd( "attempting to fetch lelantus.getusedcoinserials...", level: LogLevel.Info, ); @@ -919,7 +919,7 @@ class ElectrumXClient { response = await (getElectrumAdapter() as FiroElectrumClient) .getLelantusUsedCoinSerials(startNumber: startNumber); // TODO add 2 minute timeout. - Logging.instance.log( + Logging.instance.logd( "Fetching lelantus.getusedcoinserials finished", level: LogLevel.Info, ); @@ -934,14 +934,14 @@ class ElectrumXClient { /// /// ex: 1 Future getLelantusLatestCoinId({String? requestID}) async { - Logging.instance.log( + Logging.instance.logd( "attempting to fetch lelantus.getlatestcoinid...", level: LogLevel.Info, ); await checkElectrumAdapter(); final int response = await (getElectrumAdapter() as FiroElectrumClient).getLatestCoinId(); - Logging.instance.log( + Logging.instance.logd( "Fetching lelantus.getlatestcoinid finished", level: LogLevel.Info, ); @@ -977,7 +977,7 @@ class ElectrumXClient { coinGroupId: coinGroupId, startBlockHash: startBlockHash, ); - Logging.instance.log( + Logging.instance.logd( "Finished ElectrumXClient.getSparkAnonymitySet(coinGroupId" "=$coinGroupId, startBlockHash=$startBlockHash). " "coins.length: ${(response["coins"] as List?)?.length}" @@ -1068,20 +1068,20 @@ class ElectrumXClient { String? requestID, }) async { try { - Logging.instance.log( + Logging.instance.logd( "attempting to fetch spark.getsparklatestcoinid...", level: LogLevel.Info, ); await checkElectrumAdapter(); final int response = await (getElectrumAdapter() as FiroElectrumClient) .getSparkLatestCoinId(); - Logging.instance.log( + Logging.instance.logd( "Fetching spark.getsparklatestcoinid finished", level: LogLevel.Info, ); return response; } catch (e) { - Logging.instance.log(e, level: LogLevel.Error); + Logging.instance.logd(e, level: LogLevel.Error); rethrow; } } @@ -1101,7 +1101,7 @@ class ElectrumXClient { .map((e) => e.toHexReversedFromBase64) .toSet(); - Logging.instance.log( + Logging.instance.logd( "Finished ElectrumXClient.getMempoolTxids(). " "Duration=${DateTime.now().difference(start)}", level: LogLevel.Info, @@ -1109,7 +1109,7 @@ class ElectrumXClient { return txids; } catch (e) { - Logging.instance.log(e, level: LogLevel.Error); + Logging.instance.logd(e, level: LogLevel.Error); rethrow; } } @@ -1146,7 +1146,7 @@ class ElectrumXClient { ); } - Logging.instance.log( + Logging.instance.logd( "Finished ElectrumXClient.getMempoolSparkData(txids: $txids). " "Duration=${DateTime.now().difference(start)}", level: LogLevel.Info, @@ -1154,7 +1154,7 @@ class ElectrumXClient { return result; } catch (e, s) { - Logging.instance.log("$e\n$s", level: LogLevel.Error); + Logging.instance.logd("$e\n$s", level: LogLevel.Error); rethrow; } } @@ -1178,7 +1178,7 @@ class ElectrumXClient { final map = Map.from(response as Map); final tags = List>.from(map["tagsandtxids"] as List); - Logging.instance.log( + Logging.instance.logd( "Finished ElectrumXClient.getSparkUnhashedUsedCoinsTagsWithTxHashes(" "startNumber=$startNumber). # of tags fetched=${tags.length}, " "Duration=${DateTime.now().difference(start)}", @@ -1187,7 +1187,7 @@ class ElectrumXClient { return tags; } catch (e) { - Logging.instance.log(e, level: LogLevel.Error); + Logging.instance.logd(e, level: LogLevel.Error); rethrow; } } @@ -1199,7 +1199,7 @@ class ElectrumXClient { }) async { try { const command = "spark.getsparkanonymitysetmeta"; - Logging.instance.log( + Logging.instance.logd( "[${getElectrumAdapter()?.host}] => attempting to fetch $command...", level: LogLevel.Info, ); @@ -1222,7 +1222,7 @@ class ElectrumXClient { size: map["size"] as int, ); - Logging.instance.log( + Logging.instance.logd( "Finished ElectrumXClient.getSparkAnonymitySetMeta(" "requestID=$requestID, " "coinGroupId=$coinGroupId" @@ -1233,7 +1233,7 @@ class ElectrumXClient { return result; } catch (e) { - Logging.instance.log(e, level: LogLevel.Error); + Logging.instance.logd(e, level: LogLevel.Error); rethrow; } } @@ -1264,7 +1264,7 @@ class ElectrumXClient { final result = map["coins"] as List; - Logging.instance.log( + Logging.instance.logd( "Finished ElectrumXClient.getSparkAnonymitySetBySector(" "requestID=$requestID, " "coinGroupId=$coinGroupId, " @@ -1278,7 +1278,7 @@ class ElectrumXClient { return result; } catch (e) { - Logging.instance.log(e, level: LogLevel.Error); + Logging.instance.logd(e, level: LogLevel.Error); rethrow; } } @@ -1301,7 +1301,7 @@ class ElectrumXClient { ], ); - Logging.instance.log( + Logging.instance.logd( "Finished ElectrumXClient.isMasterNodeCollateral, " "response: $response, " "Duration=${DateTime.now().difference(start)}", @@ -1310,7 +1310,7 @@ class ElectrumXClient { return response as bool; } catch (e) { - Logging.instance.log(e, level: LogLevel.Error); + Logging.instance.logd(e, level: LogLevel.Error); rethrow; } } @@ -1369,7 +1369,7 @@ class ElectrumXClient { } catch (e, s) { final String msg = "Error parsing fee rate. Response: $response" "\nResult: $response\nError: $e\nStack trace: $s"; - Logging.instance.log(msg, level: LogLevel.Fatal); + Logging.instance.logd(msg, level: LogLevel.Fatal); throw Exception(msg); } } catch (e) { diff --git a/lib/main.dart b/lib/main.dart index 65a1ff360..43e076879 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -209,7 +209,7 @@ void main(List args) async { ), ); } catch (e, s) { - Logging.instance.log( + Logging.instance.logd( "Cannot migrate mobile database\n$e $s", level: LogLevel.Error, printFullLength: true, @@ -558,7 +558,7 @@ class _MaterialAppWithThemeState extends ConsumerState // call reset to clear cached value await resetOpenPath(); - Logging.instance.log( + Logging.instance.logd( "This is the .swb content from intent: ${ref.read(openedFromSWBFileStringStateProvider.state).state}", level: LogLevel.Info, ); diff --git a/lib/models/exchange/change_now/cn_exchange_estimate.dart b/lib/models/exchange/change_now/cn_exchange_estimate.dart index 8d3c43566..c1aa4e7fb 100644 --- a/lib/models/exchange/change_now/cn_exchange_estimate.dart +++ b/lib/models/exchange/change_now/cn_exchange_estimate.dart @@ -9,6 +9,7 @@ */ import 'package:decimal/decimal.dart'; + import '../../../utilities/logger.dart'; enum CNEstimateType { direct, reverse } @@ -113,7 +114,7 @@ class CNExchangeEstimate { ); } catch (e, s) { Logging.instance - .log("Failed to parse: $json \n$e\n$s", level: LogLevel.Fatal); + .logd("Failed to parse: $json \n$e\n$s", level: LogLevel.Fatal); rethrow; } } diff --git a/lib/models/exchange/change_now/estimated_exchange_amount.dart b/lib/models/exchange/change_now/estimated_exchange_amount.dart index 550b39489..9cc634215 100644 --- a/lib/models/exchange/change_now/estimated_exchange_amount.dart +++ b/lib/models/exchange/change_now/estimated_exchange_amount.dart @@ -58,7 +58,7 @@ class EstimatedExchangeAmount { ); } catch (e, s) { Logging.instance - .log("Failed to parse: $json \n$e\n$s", level: LogLevel.Fatal); + .logd("Failed to parse: $json \n$e\n$s", level: LogLevel.Fatal); rethrow; } } diff --git a/lib/models/exchange/change_now/exchange_transaction_status.dart b/lib/models/exchange/change_now/exchange_transaction_status.dart index 3c3aebb7f..055a3757c 100644 --- a/lib/models/exchange/change_now/exchange_transaction_status.dart +++ b/lib/models/exchange/change_now/exchange_transaction_status.dart @@ -187,7 +187,7 @@ class ExchangeTransactionStatus { }); factory ExchangeTransactionStatus.fromJson(Map json) { - Logging.instance.log(json, printFullLength: true, level: LogLevel.Info); + Logging.instance.logd(json, printFullLength: true, level: LogLevel.Info); try { return ExchangeTransactionStatus( status: changeNowTransactionStatusFromStringIgnoreCase( @@ -228,7 +228,7 @@ class ExchangeTransactionStatus { payload: json["payload"] as Object?, ); } catch (e, s) { - Logging.instance.log("$e\n$s", level: LogLevel.Fatal); + Logging.instance.logd("$e\n$s", level: LogLevel.Fatal); rethrow; } } diff --git a/lib/models/exchange/response_objects/estimate.dart b/lib/models/exchange/response_objects/estimate.dart index d51fda17c..eddcd4c5d 100644 --- a/lib/models/exchange/response_objects/estimate.dart +++ b/lib/models/exchange/response_objects/estimate.dart @@ -9,6 +9,7 @@ */ import 'package:decimal/decimal.dart'; + import '../../../utilities/logger.dart'; class Estimate { @@ -46,7 +47,8 @@ class Estimate { kycRating: kycRating, ); } catch (e, s) { - Logging.instance.log("Estimate.fromMap(): $e\n$s", level: LogLevel.Error); + Logging.instance + .logd("Estimate.fromMap(): $e\n$s", level: LogLevel.Error); rethrow; } } diff --git a/lib/models/exchange/response_objects/fixed_rate_market.dart b/lib/models/exchange/response_objects/fixed_rate_market.dart index 103d9d99f..faa9d4268 100644 --- a/lib/models/exchange/response_objects/fixed_rate_market.dart +++ b/lib/models/exchange/response_objects/fixed_rate_market.dart @@ -9,6 +9,7 @@ */ import 'package:decimal/decimal.dart'; + import '../../../utilities/logger.dart'; class FixedRateMarket { @@ -53,7 +54,7 @@ class FixedRateMarket { minerFee: Decimal.tryParse(json["minerFee"].toString()), ); } catch (e, s) { - Logging.instance.log( + Logging.instance.logd( "FixedRateMarket.fromMap(): $e\n$s", level: LogLevel.Error, ); diff --git a/lib/models/exchange/simpleswap/sp_currency.dart b/lib/models/exchange/simpleswap/sp_currency.dart index 96905f44c..17bd6ebf5 100644 --- a/lib/models/exchange/simpleswap/sp_currency.dart +++ b/lib/models/exchange/simpleswap/sp_currency.dart @@ -59,7 +59,7 @@ class SPCurrency { warningsTo: json["warnings_to"] as List, ); } catch (e, s) { - Logging.instance.log( + Logging.instance.logd( "SPCurrency.fromJson failed to parse: $e\n$s", level: LogLevel.Error, ); diff --git a/lib/models/isar/stack_theme.dart b/lib/models/isar/stack_theme.dart index ce5002a1d..d7b8023b9 100644 --- a/lib/models/isar/stack_theme.dart +++ b/lib/models/isar/stack_theme.dart @@ -1884,7 +1884,7 @@ class StackTheme { (map[mainNetId] as String).toBigIntFromHex.toInt(), ); } else { - Logging.instance.log( + Logging.instance.logd( "Color not found in theme for $mainNetId", level: LogLevel.Error, ); diff --git a/lib/networking/http.dart b/lib/networking/http.dart index ae2a3b97b..fcb8beea3 100644 --- a/lib/networking/http.dart +++ b/lib/networking/http.dart @@ -53,7 +53,7 @@ class HTTP { response.statusCode, ); } catch (e, s) { - Logging.instance.log( + Logging.instance.logd( "HTTP.get() rethrew: $e\n$s", level: LogLevel.Info, ); @@ -99,7 +99,7 @@ class HTTP { response.statusCode, ); } catch (e, s) { - Logging.instance.log( + Logging.instance.logd( "HTTP.post() rethrew: $e\n$s", level: LogLevel.Info, ); @@ -119,7 +119,7 @@ class HTTP { onDone: () => completer.complete( Uint8List.fromList(bytes), ), - onError: (Object err, StackTrace s) => Logging.instance.log( + onError: (Object err, StackTrace s) => Logging.instance.logd( "Http wrapper layer listen: $err\n$s", level: LogLevel.Error, ), diff --git a/lib/pages/add_wallet_views/frost_ms/new/steps/frost_create_step_2.dart b/lib/pages/add_wallet_views/frost_ms/new/steps/frost_create_step_2.dart index a57148fee..0c7c666be 100644 --- a/lib/pages/add_wallet_views/frost_ms/new/steps/frost_create_step_2.dart +++ b/lib/pages/add_wallet_views/frost_ms/new/steps/frost_create_step_2.dart @@ -1,7 +1,7 @@ import 'package:flutter/material.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; + import '../../../../../frost_route_generator.dart'; -import '../../../../wallet_view/transaction_views/tx_v2/transaction_v2_details_view.dart'; import '../../../../../providers/frost_wallet/frost_wallet_providers.dart'; import '../../../../../services/frost.dart'; import '../../../../../utilities/logger.dart'; @@ -15,6 +15,7 @@ import '../../../../../widgets/dialogs/frost/frost_error_dialog.dart'; import '../../../../../widgets/frost_step_user_steps.dart'; import '../../../../../widgets/stack_dialog.dart'; import '../../../../../widgets/textfields/frost_step_field.dart'; +import '../../../../wallet_view/transaction_views/tx_v2/transaction_v2_details_view.dart'; class FrostCreateStep2 extends ConsumerStatefulWidget { const FrostCreateStep2({ @@ -177,7 +178,7 @@ class _FrostCreateStep2State extends ConsumerState { .routeName, ); } catch (e, s) { - Logging.instance.log( + Logging.instance.logd( "$e\n$s", level: LogLevel.Fatal, ); diff --git a/lib/pages/add_wallet_views/frost_ms/new/steps/frost_create_step_3.dart b/lib/pages/add_wallet_views/frost_ms/new/steps/frost_create_step_3.dart index 20130a2da..e1d7c081e 100644 --- a/lib/pages/add_wallet_views/frost_ms/new/steps/frost_create_step_3.dart +++ b/lib/pages/add_wallet_views/frost_ms/new/steps/frost_create_step_3.dart @@ -178,7 +178,7 @@ class _FrostCreateStep3State extends ConsumerState { .routeName, ); } catch (e, s) { - Logging.instance.log( + Logging.instance.logd( "$e\n$s", level: LogLevel.Fatal, ); diff --git a/lib/pages/add_wallet_views/frost_ms/new/steps/frost_create_step_5.dart b/lib/pages/add_wallet_views/frost_ms/new/steps/frost_create_step_5.dart index 4640e0abb..fed7cf360 100644 --- a/lib/pages/add_wallet_views/frost_ms/new/steps/frost_create_step_5.dart +++ b/lib/pages/add_wallet_views/frost_ms/new/steps/frost_create_step_5.dart @@ -219,7 +219,7 @@ class _FrostCreateStep5State extends ConsumerState { ); } } catch (e, s) { - Logging.instance.log( + Logging.instance.logd( "$e\n$s", level: LogLevel.Fatal, ); diff --git a/lib/pages/add_wallet_views/frost_ms/reshare/frost_reshare_step_1a.dart b/lib/pages/add_wallet_views/frost_ms/reshare/frost_reshare_step_1a.dart index a83e22d40..36d7138c0 100644 --- a/lib/pages/add_wallet_views/frost_ms/reshare/frost_reshare_step_1a.dart +++ b/lib/pages/add_wallet_views/frost_ms/reshare/frost_reshare_step_1a.dart @@ -81,7 +81,7 @@ class _FrostReshareStep1aState extends ConsumerState { ); } } catch (e, s) { - Logging.instance.log( + Logging.instance.logd( "$e\n$s", level: LogLevel.Fatal, ); diff --git a/lib/pages/add_wallet_views/frost_ms/reshare/frost_reshare_step_1b.dart b/lib/pages/add_wallet_views/frost_ms/reshare/frost_reshare_step_1b.dart index e29d1110b..4dc485795 100644 --- a/lib/pages/add_wallet_views/frost_ms/reshare/frost_reshare_step_1b.dart +++ b/lib/pages/add_wallet_views/frost_ms/reshare/frost_reshare_step_1b.dart @@ -117,7 +117,7 @@ class _FrostReshareStep1bState extends ConsumerState { ); } } catch (e, s) { - Logging.instance.log( + Logging.instance.logd( "$e\n$s", level: LogLevel.Fatal, ); diff --git a/lib/pages/add_wallet_views/frost_ms/reshare/frost_reshare_step_1c.dart b/lib/pages/add_wallet_views/frost_ms/reshare/frost_reshare_step_1c.dart index 962e207bf..4432ebd0d 100644 --- a/lib/pages/add_wallet_views/frost_ms/reshare/frost_reshare_step_1c.dart +++ b/lib/pages/add_wallet_views/frost_ms/reshare/frost_reshare_step_1c.dart @@ -204,7 +204,7 @@ class _FrostReshareStep1cState extends ConsumerState { ); } } catch (e, s) { - Logging.instance.log( + Logging.instance.logd( "$e\n$s", level: LogLevel.Fatal, ); diff --git a/lib/pages/add_wallet_views/frost_ms/reshare/frost_reshare_step_2abd.dart b/lib/pages/add_wallet_views/frost_ms/reshare/frost_reshare_step_2abd.dart index 65c22e2f6..3a2a7a64e 100644 --- a/lib/pages/add_wallet_views/frost_ms/reshare/frost_reshare_step_2abd.dart +++ b/lib/pages/add_wallet_views/frost_ms/reshare/frost_reshare_step_2abd.dart @@ -79,7 +79,7 @@ class _FrostReshareStep2abdState extends ConsumerState { .routeName, ); } catch (e, s) { - Logging.instance.log( + Logging.instance.logd( "$e\n$s", level: LogLevel.Fatal, ); diff --git a/lib/pages/add_wallet_views/frost_ms/reshare/frost_reshare_step_2c.dart b/lib/pages/add_wallet_views/frost_ms/reshare/frost_reshare_step_2c.dart index b134ea5e4..fe53e562b 100644 --- a/lib/pages/add_wallet_views/frost_ms/reshare/frost_reshare_step_2c.dart +++ b/lib/pages/add_wallet_views/frost_ms/reshare/frost_reshare_step_2c.dart @@ -59,7 +59,7 @@ class _FrostReshareStep2cState extends ConsumerState { .routeName, ); } catch (e, s) { - Logging.instance.log( + Logging.instance.logd( "$e\n$s", level: LogLevel.Fatal, ); diff --git a/lib/pages/add_wallet_views/frost_ms/reshare/frost_reshare_step_3abd.dart b/lib/pages/add_wallet_views/frost_ms/reshare/frost_reshare_step_3abd.dart index a899ddda1..e027d294c 100644 --- a/lib/pages/add_wallet_views/frost_ms/reshare/frost_reshare_step_3abd.dart +++ b/lib/pages/add_wallet_views/frost_ms/reshare/frost_reshare_step_3abd.dart @@ -70,7 +70,7 @@ class _FrostReshareStep3abdState extends ConsumerState { .routeName, ); } catch (e, s) { - Logging.instance.log( + Logging.instance.logd( "$e\n$s", level: LogLevel.Fatal, ); diff --git a/lib/pages/add_wallet_views/frost_ms/reshare/frost_reshare_step_4.dart b/lib/pages/add_wallet_views/frost_ms/reshare/frost_reshare_step_4.dart index 41d94cdd1..c3147c656 100644 --- a/lib/pages/add_wallet_views/frost_ms/reshare/frost_reshare_step_4.dart +++ b/lib/pages/add_wallet_views/frost_ms/reshare/frost_reshare_step_4.dart @@ -88,7 +88,7 @@ class _FrostReshareStep4State extends ConsumerState { ); } } catch (e, s) { - Logging.instance.log( + Logging.instance.logd( "$e\n$s", level: LogLevel.Fatal, ); diff --git a/lib/pages/add_wallet_views/frost_ms/reshare/frost_reshare_step_5.dart b/lib/pages/add_wallet_views/frost_ms/reshare/frost_reshare_step_5.dart index 834a0a638..ce9f250f2 100644 --- a/lib/pages/add_wallet_views/frost_ms/reshare/frost_reshare_step_5.dart +++ b/lib/pages/add_wallet_views/frost_ms/reshare/frost_reshare_step_5.dart @@ -104,7 +104,7 @@ class _FrostReshareStep5State extends ConsumerState { } } } catch (e, s) { - Logging.instance.log( + Logging.instance.logd( "$e\n$s", level: LogLevel.Fatal, ); diff --git a/lib/pages/add_wallet_views/frost_ms/restore/restore_frost_ms_wallet_view.dart b/lib/pages/add_wallet_views/frost_ms/restore/restore_frost_ms_wallet_view.dart index 14e1d45e5..f7aec5a82 100644 --- a/lib/pages/add_wallet_views/frost_ms/restore/restore_frost_ms_wallet_view.dart +++ b/lib/pages/add_wallet_views/frost_ms/restore/restore_frost_ms_wallet_view.dart @@ -171,7 +171,7 @@ class _RestoreFrostMsWalletViewState ); } } catch (e, s) { - Logging.instance.log( + Logging.instance.logd( "$e\n$s", level: LogLevel.Fatal, ); @@ -234,7 +234,7 @@ class _RestoreFrostMsWalletViewState ); if (qrResult == null) { - Logging.instance.log( + Logging.instance.logd( "Qr scanning cancelled", level: LogLevel.Info, ); @@ -248,7 +248,7 @@ class _RestoreFrostMsWalletViewState } } } on PlatformException catch (e, s) { - Logging.instance.log( + Logging.instance.logd( "Failed to get camera permissions while trying to scan qr code: $e\n$s", level: LogLevel.Warning, ); diff --git a/lib/pages/add_wallet_views/new_wallet_recovery_phrase_warning_view/new_wallet_recovery_phrase_warning_view.dart b/lib/pages/add_wallet_views/new_wallet_recovery_phrase_warning_view/new_wallet_recovery_phrase_warning_view.dart index aa49a9038..034cb6dbc 100644 --- a/lib/pages/add_wallet_views/new_wallet_recovery_phrase_warning_view/new_wallet_recovery_phrase_warning_view.dart +++ b/lib/pages/add_wallet_views/new_wallet_recovery_phrase_warning_view/new_wallet_recovery_phrase_warning_view.dart @@ -274,7 +274,7 @@ class _NewWalletRecoveryPhraseWarningViewState return (wallet, fetchedMnemonic); } catch (e, s) { - Logging.instance.log( + Logging.instance.logd( "$e\n$s", level: LogLevel.Fatal, ); diff --git a/lib/pages/add_wallet_views/restore_wallet_view/restore_wallet_view.dart b/lib/pages/add_wallet_views/restore_wallet_view/restore_wallet_view.dart index eb01ea9c7..06619e582 100644 --- a/lib/pages/add_wallet_views/restore_wallet_view/restore_wallet_view.dart +++ b/lib/pages/add_wallet_views/restore_wallet_view/restore_wallet_view.dart @@ -628,7 +628,7 @@ class _RestoreWalletViewState extends ConsumerState { final results = AddressUtils.decodeQRSeedData(qrResult.rawContent); - Logging.instance.log("scan parsed: $results", level: LogLevel.Info); + Logging.instance.logd("scan parsed: $results", level: LogLevel.Info); if (results["mnemonic"] != null) { final list = (results["mnemonic"] as List) @@ -636,16 +636,16 @@ class _RestoreWalletViewState extends ConsumerState { .toList(growable: false); if (list.isNotEmpty) { _clearAndPopulateMnemonic(list); - Logging.instance.log("mnemonic populated", level: LogLevel.Info); + Logging.instance.logd("mnemonic populated", level: LogLevel.Info); } else { Logging.instance - .log("mnemonic failed to populate", level: LogLevel.Info); + .logd("mnemonic failed to populate", level: LogLevel.Info); } } } on PlatformException catch (e) { // likely failed to get camera permissions Logging.instance - .log("Restore wallet qr scan failed: $e", level: LogLevel.Warning); + .logd("Restore wallet qr scan failed: $e", level: LogLevel.Warning); } } diff --git a/lib/pages/add_wallet_views/restore_wallet_view/sub_widgets/restore_failed_dialog.dart b/lib/pages/add_wallet_views/restore_wallet_view/sub_widgets/restore_failed_dialog.dart index 1ae4a5efd..1f8952c15 100644 --- a/lib/pages/add_wallet_views/restore_wallet_view/sub_widgets/restore_failed_dialog.dart +++ b/lib/pages/add_wallet_views/restore_wallet_view/sub_widgets/restore_failed_dialog.dart @@ -10,6 +10,7 @@ import 'package:flutter/material.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; + import '../../../../providers/global/secure_store_provider.dart'; import '../../../../providers/providers.dart'; import '../../../../themes/stack_colors.dart'; @@ -72,7 +73,7 @@ class _RestoreFailedDialogState extends ConsumerState { ref.read(secureStoreProvider), ); } catch (e, s) { - Logging.instance.log( + Logging.instance.logd( "Error while getting wallet info in restore failed dialog\n" "Error: $e\nStack trace: $s", level: LogLevel.Error, diff --git a/lib/pages/add_wallet_views/verify_recovery_phrase_view/verify_recovery_phrase_view.dart b/lib/pages/add_wallet_views/verify_recovery_phrase_view/verify_recovery_phrase_view.dart index e95e33539..1f6177192 100644 --- a/lib/pages/add_wallet_views/verify_recovery_phrase_view/verify_recovery_phrase_view.dart +++ b/lib/pages/add_wallet_views/verify_recovery_phrase_view/verify_recovery_phrase_view.dart @@ -306,7 +306,7 @@ class _VerifyRecoveryPhraseViewState throw ex!; } } catch (e, s) { - Logging.instance.log( + Logging.instance.logd( "$e\n$s", level: LogLevel.Fatal, ); diff --git a/lib/pages/address_book_views/subviews/new_contact_address_entry_form.dart b/lib/pages/address_book_views/subviews/new_contact_address_entry_form.dart index d84cee567..dfe2155bd 100644 --- a/lib/pages/address_book_views/subviews/new_contact_address_entry_form.dart +++ b/lib/pages/address_book_views/subviews/new_contact_address_entry_form.dart @@ -115,7 +115,7 @@ class _NewContactAddressEntryFormState // .read(shouldShowLockscreenOnResumeStateProvider // .state) // .state = true; - Logging.instance.log( + Logging.instance.logd( "Failed to get camera permissions to scan address qr code: $e\n$s", level: LogLevel.Warning, ); diff --git a/lib/pages/buy_view/buy_form.dart b/lib/pages/buy_view/buy_form.dart index f47831547..729e0e1c2 100644 --- a/lib/pages/buy_view/buy_form.dart +++ b/lib/pages/buy_view/buy_form.dart @@ -311,7 +311,7 @@ class _BuyFormState extends ConsumerState { .read(simplexProvider) .updateSupportedCryptos(response.value!); // TODO validate } else { - Logging.instance.log( + Logging.instance.logd( "_loadSimplexCurrencies: $response", level: LogLevel.Warning, ); @@ -326,7 +326,7 @@ class _BuyFormState extends ConsumerState { .read(simplexProvider) .updateSupportedFiats(response.value!); // TODO validate } else { - Logging.instance.log( + Logging.instance.logd( "_loadSimplexCurrencies: $response", level: LogLevel.Warning, ); @@ -626,7 +626,7 @@ class _BuyFormState extends ConsumerState { ref.read(simplexProvider).updateQuote(response.value!); return BuyResponse(value: response.value!); } else { - Logging.instance.log( + Logging.instance.logd( "_loadQuote: $response", level: LogLevel.Warning, ); @@ -724,7 +724,7 @@ class _BuyFormState extends ConsumerState { final qrResult = await scanner.scan(); - Logging.instance.log( + Logging.instance.logd( "qrResult content: ${qrResult.rawContent}", level: LogLevel.Info, ); @@ -734,7 +734,7 @@ class _BuyFormState extends ConsumerState { logging: Logging.instance, ); - Logging.instance.log( + Logging.instance.logd( "qrResult parsed: $paymentData", level: LogLevel.Info, ); @@ -760,7 +760,7 @@ class _BuyFormState extends ConsumerState { } on PlatformException catch (e, s) { // here we ignore the exception caused by not giving permission // to use the camera to scan a qr code - Logging.instance.log( + Logging.instance.logd( "Failed to get camera permissions while trying to scan qr code in SendView: $e\n$s", level: LogLevel.Warning, ); @@ -1241,7 +1241,7 @@ class _BuyFormState extends ConsumerState { } }); } catch (e, s) { - Logging.instance.log("$e\n$s", level: LogLevel.Info); + Logging.instance.logd("$e\n$s", level: LogLevel.Info); } }, ), diff --git a/lib/pages/buy_view/sub_widgets/crypto_selection_view.dart b/lib/pages/buy_view/sub_widgets/crypto_selection_view.dart index 3bc0b220b..890ed2cd9 100644 --- a/lib/pages/buy_view/sub_widgets/crypto_selection_view.dart +++ b/lib/pages/buy_view/sub_widgets/crypto_selection_view.dart @@ -304,7 +304,7 @@ class CoinIconForTicker extends ConsumerWidget { height: size, ); } catch (e, s) { - Logging.instance.log("$e\n$s", level: LogLevel.Fatal); + Logging.instance.logd("$e\n$s", level: LogLevel.Fatal); rethrow; } } diff --git a/lib/pages/exchange_view/confirm_change_now_send.dart b/lib/pages/exchange_view/confirm_change_now_send.dart index 1b52dfdbe..552b7f3a9 100644 --- a/lib/pages/exchange_view/confirm_change_now_send.dart +++ b/lib/pages/exchange_view/confirm_change_now_send.dart @@ -162,7 +162,7 @@ class _ConfirmChangeNowSendViewState Navigator.of(context).popUntil(ModalRoute.withName(routeOnSuccessName)); } } catch (e, s) { - Logging.instance.log( + Logging.instance.logd( "Broadcast transaction failed: $e\n$s", level: LogLevel.Error, ); diff --git a/lib/pages/exchange_view/exchange_step_views/step_2_view.dart b/lib/pages/exchange_view/exchange_step_views/step_2_view.dart index 028ce0ac4..b2873feb2 100644 --- a/lib/pages/exchange_view/exchange_step_views/step_2_view.dart +++ b/lib/pages/exchange_view/exchange_step_views/step_2_view.dart @@ -98,7 +98,7 @@ class _Step2ViewState extends ConsumerState { }); } } on PlatformException catch (e, s) { - Logging.instance.log( + Logging.instance.logd( "Failed to get camera permissions while trying to scan qr code in SendView: $e\n$s", level: LogLevel.Warning, ); @@ -135,7 +135,7 @@ class _Step2ViewState extends ConsumerState { }); } } on PlatformException catch (e, s) { - Logging.instance.log( + Logging.instance.logd( "Failed to get camera permissions while trying to scan qr code in SendView: $e\n$s", level: LogLevel.Warning, ); @@ -304,7 +304,7 @@ class _Step2ViewState extends ConsumerState { }); } catch (e, s) { Logging.instance - .log("$e\n$s", level: LogLevel.Info); + .logd("$e\n$s", level: LogLevel.Info); } }, ), @@ -543,7 +543,7 @@ class _Step2ViewState extends ConsumerState { }); }); } catch (e, s) { - Logging.instance.log( + Logging.instance.logd( "$e\n$s", level: LogLevel.Info, ); diff --git a/lib/pages/exchange_view/exchange_step_views/step_4_view.dart b/lib/pages/exchange_view/exchange_step_views/step_4_view.dart index 69bd4ea01..4196fb332 100644 --- a/lib/pages/exchange_view/exchange_step_views/step_4_view.dart +++ b/lib/pages/exchange_view/exchange_step_views/step_4_view.dart @@ -317,7 +317,7 @@ class _Step4ViewState extends ConsumerState { } } } catch (e, s) { - Logging.instance.log("$e\n$s", level: LogLevel.Error); + Logging.instance.logd("$e\n$s", level: LogLevel.Error); if (mounted && !wasCancelled) { // pop building dialog Navigator.of(context).pop(); diff --git a/lib/pages/exchange_view/send_from_view.dart b/lib/pages/exchange_view/send_from_view.dart index f499775b1..ec5778e30 100644 --- a/lib/pages/exchange_view/send_from_view.dart +++ b/lib/pages/exchange_view/send_from_view.dart @@ -387,7 +387,7 @@ class _SendFromCardState extends ConsumerState { } } } catch (e, s) { - Logging.instance.log("$e\n$s", level: LogLevel.Error); + Logging.instance.logd("$e\n$s", level: LogLevel.Error); if (mounted) { // pop building dialog Navigator.of(context).pop(); diff --git a/lib/pages/exchange_view/sub_widgets/exchange_provider_option.dart b/lib/pages/exchange_view/sub_widgets/exchange_provider_option.dart index 7ba126659..1dc2ca237 100644 --- a/lib/pages/exchange_view/sub_widgets/exchange_provider_option.dart +++ b/lib/pages/exchange_view/sub_widgets/exchange_provider_option.dart @@ -173,7 +173,7 @@ class _ExchangeOptionState extends ConsumerState { ], ); } else { - Logging.instance.log( + Logging.instance.logd( "$runtimeType rate unavailable for ${widget.exchange.name}: $data", level: LogLevel.Warning, ); diff --git a/lib/pages/paynym/subwidgets/paynym_followers_list.dart b/lib/pages/paynym/subwidgets/paynym_followers_list.dart index 43fdf0223..c362a5dba 100644 --- a/lib/pages/paynym/subwidgets/paynym_followers_list.dart +++ b/lib/pages/paynym/subwidgets/paynym_followers_list.dart @@ -12,7 +12,7 @@ import 'dart:math'; import 'package:flutter/material.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; -import 'paynym_card_button.dart'; + import '../../../providers/global/paynym_api_provider.dart'; import '../../../providers/global/wallets_provider.dart'; import '../../../providers/wallet/my_paynym_account_state_provider.dart'; @@ -24,6 +24,7 @@ import '../../../utilities/util.dart'; import '../../../wallets/wallet/wallet_mixin_interfaces/paynym_interface.dart'; import '../../../widgets/conditional_parent.dart'; import '../../../widgets/rounded_white_container.dart'; +import 'paynym_card_button.dart'; class PaynymFollowersList extends ConsumerStatefulWidget { const PaynymFollowersList({ @@ -93,7 +94,7 @@ class _PaynymFollowersListState extends ConsumerState { account.value!; } } catch (e) { - Logging.instance.log( + Logging.instance.logd( "Failed pull down refresh of paynym home page: $e", level: LogLevel.Warning, ); diff --git a/lib/pages/paynym/subwidgets/paynym_following_list.dart b/lib/pages/paynym/subwidgets/paynym_following_list.dart index 486e138e2..a1cda9b9a 100644 --- a/lib/pages/paynym/subwidgets/paynym_following_list.dart +++ b/lib/pages/paynym/subwidgets/paynym_following_list.dart @@ -12,7 +12,7 @@ import 'dart:math'; import 'package:flutter/material.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; -import 'paynym_card_button.dart'; + import '../../../providers/global/paynym_api_provider.dart'; import '../../../providers/global/wallets_provider.dart'; import '../../../providers/wallet/my_paynym_account_state_provider.dart'; @@ -24,6 +24,7 @@ import '../../../utilities/util.dart'; import '../../../wallets/wallet/wallet_mixin_interfaces/paynym_interface.dart'; import '../../../widgets/conditional_parent.dart'; import '../../../widgets/rounded_white_container.dart'; +import 'paynym_card_button.dart'; class PaynymFollowingList extends ConsumerStatefulWidget { const PaynymFollowingList({ @@ -93,7 +94,7 @@ class _PaynymFollowingListState extends ConsumerState { account.value!; } } catch (e) { - Logging.instance.log( + Logging.instance.logd( "Failed pull down refresh of paynym home page: $e", level: LogLevel.Warning, ); diff --git a/lib/pages/receive_view/generate_receiving_uri_qr_code_view.dart b/lib/pages/receive_view/generate_receiving_uri_qr_code_view.dart index dfe85d934..9fc8adb41 100644 --- a/lib/pages/receive_view/generate_receiving_uri_qr_code_view.dart +++ b/lib/pages/receive_view/generate_receiving_uri_qr_code_view.dart @@ -188,7 +188,7 @@ class _GenerateUriQrCodeViewState extends State { queryParams, ); - Logging.instance.log( + Logging.instance.logd( "Generated receiving QR code for: $uriString", level: LogLevel.Info, ); diff --git a/lib/pages/send_view/frost_ms/recipient.dart b/lib/pages/send_view/frost_ms/recipient.dart index ce38153e7..5820b7375 100644 --- a/lib/pages/send_view/frost_ms/recipient.dart +++ b/lib/pages/send_view/frost_ms/recipient.dart @@ -133,7 +133,7 @@ class _RecipientState extends ConsumerState { final qrResult = await ref.read(pBarcodeScanner).scan(); - Logging.instance.log( + Logging.instance.logd( "qrResult content: ${qrResult.rawContent}", level: LogLevel.Info, ); @@ -143,7 +143,7 @@ class _RecipientState extends ConsumerState { logging: Logging.instance, ); - Logging.instance.log( + Logging.instance.logd( "qrResult parsed: $paymentData", level: LogLevel.Info, ); @@ -175,7 +175,7 @@ class _RecipientState extends ConsumerState { _updateRecipientData(); } on PlatformException catch (e, s) { - Logging.instance.log( + Logging.instance.logd( "Failed to get camera permissions while " "trying to scan qr code in SendView: $e\n$s", level: LogLevel.Warning, diff --git a/lib/pages/send_view/frost_ms/send_steps/frost_send_step_1a.dart b/lib/pages/send_view/frost_ms/send_steps/frost_send_step_1a.dart index 0ec725d00..3bb7a9bd0 100644 --- a/lib/pages/send_view/frost_ms/send_steps/frost_send_step_1a.dart +++ b/lib/pages/send_view/frost_ms/send_steps/frost_send_step_1a.dart @@ -67,7 +67,7 @@ class _FrostSendStep1aState extends ConsumerState { .routeName, ); } catch (e, s) { - Logging.instance.log( + Logging.instance.logd( "$e\n$s", level: LogLevel.Error, ); diff --git a/lib/pages/send_view/frost_ms/send_steps/frost_send_step_1b.dart b/lib/pages/send_view/frost_ms/send_steps/frost_send_step_1b.dart index b7c95ea2c..a67afe7d3 100644 --- a/lib/pages/send_view/frost_ms/send_steps/frost_send_step_1b.dart +++ b/lib/pages/send_view/frost_ms/send_steps/frost_send_step_1b.dart @@ -108,7 +108,7 @@ class _FrostSendStep1bState extends ConsumerState { .routeName, ); } catch (e, s) { - Logging.instance.log( + Logging.instance.logd( "$e\n$s", level: LogLevel.Error, ); diff --git a/lib/pages/send_view/frost_ms/send_steps/frost_send_step_2.dart b/lib/pages/send_view/frost_ms/send_steps/frost_send_step_2.dart index 724e62092..14bee2844 100644 --- a/lib/pages/send_view/frost_ms/send_steps/frost_send_step_2.dart +++ b/lib/pages/send_view/frost_ms/send_steps/frost_send_step_2.dart @@ -291,7 +291,7 @@ class _FrostSendStep2State extends ConsumerState { // arguments: widget.walletId, // ); } catch (e, s) { - Logging.instance.log( + Logging.instance.logd( "$e\n$s", level: LogLevel.Fatal, ); diff --git a/lib/pages/send_view/frost_ms/send_steps/frost_send_step_3.dart b/lib/pages/send_view/frost_ms/send_steps/frost_send_step_3.dart index c96f15233..0b8c79c8b 100644 --- a/lib/pages/send_view/frost_ms/send_steps/frost_send_step_3.dart +++ b/lib/pages/send_view/frost_ms/send_steps/frost_send_step_3.dart @@ -233,7 +233,7 @@ class _FrostSendStep3State extends ConsumerState { .routeName, ); } catch (e, s) { - Logging.instance.log( + Logging.instance.logd( "$e\n$s", level: LogLevel.Fatal, ); diff --git a/lib/pages/send_view/frost_ms/send_steps/frost_send_step_4.dart b/lib/pages/send_view/frost_ms/send_steps/frost_send_step_4.dart index a560d7151..ec9eb3e2a 100644 --- a/lib/pages/send_view/frost_ms/send_steps/frost_send_step_4.dart +++ b/lib/pages/send_view/frost_ms/send_steps/frost_send_step_4.dart @@ -237,7 +237,7 @@ class _FrostSendStep4State extends ConsumerState { } } } catch (e, s) { - Logging.instance.log( + Logging.instance.logd( "$e\n$s", level: LogLevel.Fatal, ); diff --git a/lib/pages/send_view/send_view.dart b/lib/pages/send_view/send_view.dart index 1dd9b68ef..a3598fbe5 100644 --- a/lib/pages/send_view/send_view.dart +++ b/lib/pages/send_view/send_view.dart @@ -158,7 +158,7 @@ class _SendViewState extends ConsumerState { // .state = true, // ); - Logging.instance.log( + Logging.instance.logd( "qrResult content: ${qrResult.rawContent}", level: LogLevel.Info, ); @@ -216,7 +216,7 @@ class _SendViewState extends ConsumerState { // .state = true; // here we ignore the exception caused by not giving permission // to use the camera to scan a qr code - Logging.instance.log( + Logging.instance.logd( "Failed to get camera permissions while trying to scan qr code in SendView: $e\n$s", level: LogLevel.Warning, ); @@ -248,8 +248,8 @@ class _SendViewState extends ConsumerState { return; } _cachedAmountToSend = amount; - Logging.instance - .log("it changed $amount $_cachedAmountToSend", level: LogLevel.Info); + Logging.instance.logd("it changed $amount $_cachedAmountToSend", + level: LogLevel.Info); final amountString = ref.read(pAmountFormatter(coin)).format( amount, @@ -285,7 +285,7 @@ class _SendViewState extends ConsumerState { return; } _cachedAmountToSend = amount; - Logging.instance.log( + Logging.instance.logd( "it changed $amount $_cachedAmountToSend", level: LogLevel.Info, ); @@ -828,7 +828,7 @@ class _SendViewState extends ConsumerState { ); } } catch (e, s) { - Logging.instance.log("$e\n$s", level: LogLevel.Error); + Logging.instance.logd("$e\n$s", level: LogLevel.Error); if (mounted) { // pop building dialog Navigator.of(context).pop(); diff --git a/lib/pages/send_view/sub_widgets/transaction_fee_selection_sheet.dart b/lib/pages/send_view/sub_widgets/transaction_fee_selection_sheet.dart index 0ca0dba47..e45026981 100644 --- a/lib/pages/send_view/sub_widgets/transaction_fee_selection_sheet.dart +++ b/lib/pages/send_view/sub_widgets/transaction_fee_selection_sheet.dart @@ -831,7 +831,7 @@ class _TransactionFeeSelectionSheetState return null; } } catch (e, s) { - Logging.instance.log("$e $s", level: LogLevel.Warning); + Logging.instance.logd("$e $s", level: LogLevel.Warning); return null; } } diff --git a/lib/pages/send_view/token_send_view.dart b/lib/pages/send_view/token_send_view.dart index 4837b9773..112e15073 100644 --- a/lib/pages/send_view/token_send_view.dart +++ b/lib/pages/send_view/token_send_view.dart @@ -159,7 +159,7 @@ class _TokenSendViewState extends ConsumerState { // .state = true, // ); - Logging.instance.log( + Logging.instance.logd( "qrResult content: ${qrResult.rawContent}", level: LogLevel.Info, ); @@ -170,7 +170,7 @@ class _TokenSendViewState extends ConsumerState { ); Logging.instance - .log("qrResult parsed: $paymentData", level: LogLevel.Info); + .logd("qrResult parsed: $paymentData", level: LogLevel.Info); if (paymentData != null && paymentData.coin?.uriScheme == coin.uriScheme) { @@ -221,7 +221,7 @@ class _TokenSendViewState extends ConsumerState { // .state = true; // here we ignore the exception caused by not giving permission // to use the camera to scan a qr code - Logging.instance.log( + Logging.instance.logd( "Failed to get camera permissions while trying to scan qr code in SendView: $e\n$s", level: LogLevel.Warning, ); @@ -255,7 +255,7 @@ class _TokenSendViewState extends ConsumerState { return; } _cachedAmountToSend = _amountToSend; - Logging.instance.log( + Logging.instance.logd( "it changed $_amountToSend $_cachedAmountToSend", level: LogLevel.Info, ); @@ -293,7 +293,7 @@ class _TokenSendViewState extends ConsumerState { return; } _cachedAmountToSend = _amountToSend; - Logging.instance.log( + Logging.instance.logd( "it changed $_amountToSend $_cachedAmountToSend", level: LogLevel.Info, ); @@ -535,7 +535,7 @@ class _TokenSendViewState extends ConsumerState { ); } } catch (e, s) { - Logging.instance.log("$e\n$s", level: LogLevel.Error); + Logging.instance.logd("$e\n$s", level: LogLevel.Error); if (mounted) { // pop building dialog Navigator.of(context).pop(); diff --git a/lib/pages/settings_views/global_settings_view/appearance_settings/sub_widgets/install_theme_from_file_dialog.dart b/lib/pages/settings_views/global_settings_view/appearance_settings/sub_widgets/install_theme_from_file_dialog.dart index b95384ba1..b274ae093 100644 --- a/lib/pages/settings_views/global_settings_view/appearance_settings/sub_widgets/install_theme_from_file_dialog.dart +++ b/lib/pages/settings_views/global_settings_view/appearance_settings/sub_widgets/install_theme_from_file_dialog.dart @@ -15,6 +15,7 @@ import 'package:file_picker/file_picker.dart'; import 'package:flutter/material.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:flutter_svg/svg.dart'; + import '../../../../../themes/stack_colors.dart'; import '../../../../../themes/theme_service.dart'; import '../../../../../utilities/assets.dart'; @@ -54,7 +55,7 @@ class _InstallThemeFromFileDialogState ]); return true; } catch (e, s) { - Logging.instance.log( + Logging.instance.logd( "Failed to install theme: $e\n$s", level: LogLevel.Warning, ); @@ -77,7 +78,7 @@ class _InstallThemeFromFileDialogState }); } } catch (e, s) { - Logging.instance.log("$e\n$s", level: LogLevel.Error); + Logging.instance.logd("$e\n$s", level: LogLevel.Error); } } diff --git a/lib/pages/settings_views/global_settings_view/appearance_settings/sub_widgets/stack_theme_card.dart b/lib/pages/settings_views/global_settings_view/appearance_settings/sub_widgets/stack_theme_card.dart index 3ab865653..b9f991ab8 100644 --- a/lib/pages/settings_views/global_settings_view/appearance_settings/sub_widgets/stack_theme_card.dart +++ b/lib/pages/settings_views/global_settings_view/appearance_settings/sub_widgets/stack_theme_card.dart @@ -64,7 +64,7 @@ class _StackThemeCardState extends ConsumerState { await service.install(themeArchiveData: data); return true; } catch (e, s) { - Logging.instance.log( + Logging.instance.logd( "Failed _downloadAndInstall of ${widget.data.id}: $e\n$s", level: LogLevel.Warning, ); diff --git a/lib/pages/settings_views/global_settings_view/manage_nodes_views/add_edit_node_view.dart b/lib/pages/settings_views/global_settings_view/manage_nodes_views/add_edit_node_view.dart index 5bbbe37d1..d437c8a86 100644 --- a/lib/pages/settings_views/global_settings_view/manage_nodes_views/add_edit_node_view.dart +++ b/lib/pages/settings_views/global_settings_view/manage_nodes_views/add_edit_node_view.dart @@ -351,7 +351,7 @@ class _AddEditNodeViewState extends ConsumerState { ); if (qrResult == null) { - Logging.instance.log( + Logging.instance.logd( "Qr scanning cancelled", level: LogLevel.Info, ); @@ -359,14 +359,14 @@ class _AddEditNodeViewState extends ConsumerState { try { await _processQrData(qrResult); } catch (e, s) { - Logging.instance.log( + Logging.instance.logd( "Error processing QR code data: $e\n$s", level: LogLevel.Error, ); } } } catch (e, s) { - Logging.instance.log( + Logging.instance.logd( "Error opening QR code scanner dialog: $e\n$s", level: LogLevel.Error, ); @@ -376,7 +376,7 @@ class _AddEditNodeViewState extends ConsumerState { final result = await BarcodeScanner.scan(); await _processQrData(result.rawContent); } catch (e, s) { - Logging.instance.log( + Logging.instance.logd( "$e\n$s", level: LogLevel.Warning, ); @@ -412,7 +412,7 @@ class _AddEditNodeViewState extends ConsumerState { }); } } catch (e, s) { - Logging.instance.log( + Logging.instance.logd( "$e\n$s", level: LogLevel.Warning, ); diff --git a/lib/pages/settings_views/global_settings_view/stack_backup_views/create_auto_backup_view.dart b/lib/pages/settings_views/global_settings_view/stack_backup_views/create_auto_backup_view.dart index 4e1fdea36..228132010 100644 --- a/lib/pages/settings_views/global_settings_view/stack_backup_views/create_auto_backup_view.dart +++ b/lib/pages/settings_views/global_settings_view/stack_backup_views/create_auto_backup_view.dart @@ -175,8 +175,8 @@ class _EnableAutoBackupViewState extends ConsumerState { }); } } catch (e, s) { - Logging.instance - .log("$e\n$s", level: LogLevel.Error); + Logging.instance.logd("$e\n$s", + level: LogLevel.Error); } }, controller: fileLocationController, @@ -578,8 +578,8 @@ class _EnableAutoBackupViewState extends ConsumerState { } on Exception catch (e, s) { final String err = getErrorMessageFromSWBException(e); - Logging.instance - .log("$err\n$s", level: LogLevel.Error); + Logging.instance.logd("$err\n$s", + level: LogLevel.Error); // pop encryption progress dialog Navigator.of(context).pop(); showFloatingFlushBar( @@ -590,7 +590,7 @@ class _EnableAutoBackupViewState extends ConsumerState { return; } catch (e, s) { Logging.instance - .log("$e\n$s", level: LogLevel.Error); + .logd("$e\n$s", level: LogLevel.Error); // pop encryption progress dialog Navigator.of(context).pop(); showFloatingFlushBar( diff --git a/lib/pages/settings_views/global_settings_view/stack_backup_views/create_backup_view.dart b/lib/pages/settings_views/global_settings_view/stack_backup_views/create_backup_view.dart index 4bf75c0bf..b3c1a4369 100644 --- a/lib/pages/settings_views/global_settings_view/stack_backup_views/create_backup_view.dart +++ b/lib/pages/settings_views/global_settings_view/stack_backup_views/create_backup_view.dart @@ -208,7 +208,7 @@ class _RestoreFromFileViewState extends State { } } catch (e, s) { Logging.instance - .log("$e\n$s", level: LogLevel.Error); + .logd("$e\n$s", level: LogLevel.Error); } }, controller: fileLocationController, diff --git a/lib/pages/settings_views/global_settings_view/stack_backup_views/edit_auto_backup_view.dart b/lib/pages/settings_views/global_settings_view/stack_backup_views/edit_auto_backup_view.dart index ae88abd24..61555ee23 100644 --- a/lib/pages/settings_views/global_settings_view/stack_backup_views/edit_auto_backup_view.dart +++ b/lib/pages/settings_views/global_settings_view/stack_backup_views/edit_auto_backup_view.dart @@ -159,7 +159,7 @@ class _EditAutoBackupViewState extends ConsumerState { adkVersion = adk.item1; } on Exception catch (e, s) { final String err = getErrorMessageFromSWBException(e); - Logging.instance.log("$err\n$s", level: LogLevel.Error); + Logging.instance.logd("$err\n$s", level: LogLevel.Error); // pop encryption progress dialog Navigator.of(context).pop(); unawaited( @@ -171,7 +171,7 @@ class _EditAutoBackupViewState extends ConsumerState { ); return; } catch (e, s) { - Logging.instance.log("$e\n$s", level: LogLevel.Error); + Logging.instance.logd("$e\n$s", level: LogLevel.Error); // pop encryption progress dialog Navigator.of(context).pop(); unawaited( @@ -374,7 +374,7 @@ class _EditAutoBackupViewState extends ConsumerState { }); } } catch (e, s) { - Logging.instance.log("$e\n$s", level: LogLevel.Error); + Logging.instance.logd("$e\n$s", level: LogLevel.Error); } }, controller: fileLocationController, diff --git a/lib/pages/settings_views/global_settings_view/stack_backup_views/helpers/restore_create_backup.dart b/lib/pages/settings_views/global_settings_view/stack_backup_views/helpers/restore_create_backup.dart index 68d9bb1f0..43d0160b6 100644 --- a/lib/pages/settings_views/global_settings_view/stack_backup_views/helpers/restore_create_backup.dart +++ b/lib/pages/settings_views/global_settings_view/stack_backup_views/helpers/restore_create_backup.dart @@ -100,9 +100,9 @@ abstract class SWB { _cancelCompleter = Completer(); _shouldCancelRestore = true; Logging.instance - .log("SWB cancel restore requested", level: LogLevel.Info); + .logd("SWB cancel restore requested", level: LogLevel.Info); } else { - Logging.instance.log( + Logging.instance.logd( "SWB cancel restore requested while a cancellation request is currently in progress", level: LogLevel.Warning, ); @@ -147,10 +147,10 @@ abstract class SWB { backupFile .writeAsStringSync(Format.uint8listToString(encryptedContent)); } - Logging.instance.log(backupFile.absolute, level: LogLevel.Info); + Logging.instance.logd(backupFile.absolute, level: LogLevel.Info); return true; } catch (e, s) { - Logging.instance.log("$e\n$s", level: LogLevel.Error); + Logging.instance.logd("$e\n$s", level: LogLevel.Error); return false; } } @@ -174,10 +174,10 @@ abstract class SWB { backupFile .writeAsStringSync(Format.uint8listToString(encryptedContent)); } - Logging.instance.log(backupFile.absolute, level: LogLevel.Info); + Logging.instance.logd(backupFile.absolute, level: LogLevel.Info); return true; } catch (e, s) { - Logging.instance.log("$e\n$s", level: LogLevel.Error); + Logging.instance.logd("$e\n$s", level: LogLevel.Error); return false; } } @@ -194,7 +194,7 @@ abstract class SWB { Tuple2(encryptedText, passphrase), ); } catch (e, s) { - Logging.instance.log("$e\n$s", level: LogLevel.Error); + Logging.instance.logd("$e\n$s", level: LogLevel.Error); return null; } } @@ -214,7 +214,7 @@ abstract class SWB { final jsonBackup = utf8.decode(decryptedContent); return jsonBackup; } catch (e, s) { - Logging.instance.log("$e\n$s", level: LogLevel.Error); + Logging.instance.logd("$e\n$s", level: LogLevel.Error); return null; } } @@ -224,24 +224,24 @@ abstract class SWB { required SecureStorageInterface secureStorage, }) async { Logging.instance - .log("Starting createStackWalletJSON...", level: LogLevel.Info); + .logd("Starting createStackWalletJSON...", level: LogLevel.Info); final _wallets = Wallets.sharedInstance; final Map backupJson = {}; final NodeService nodeService = NodeService(secureStorageInterface: secureStorage); final _secureStore = secureStorage; - Logging.instance.log( + Logging.instance.logd( "createStackWalletJSON awaiting DB.instance.mutex...", level: LogLevel.Info, ); // prevent modification of data await DB.instance.mutex.protect(() async { - Logging.instance.log( + Logging.instance.logd( "...createStackWalletJSON DB.instance.mutex acquired", level: LogLevel.Info, ); - Logging.instance.log( + Logging.instance.logd( "SWB backing up nodes", level: LogLevel.Warning, ); @@ -253,7 +253,7 @@ abstract class SWB { }).toList(); backupJson['primaryNodes'] = await Future.wait(primaryNodes); } catch (e, s) { - Logging.instance.log("$e $s", level: LogLevel.Warning); + Logging.instance.logd("$e $s", level: LogLevel.Warning); } try { final nodesFuture = nodeService.nodes.map((e) async { @@ -264,10 +264,10 @@ abstract class SWB { final nodes = await Future.wait(nodesFuture); backupJson['nodes'] = nodes; } catch (e, s) { - Logging.instance.log("$e $s", level: LogLevel.Error); + Logging.instance.logd("$e $s", level: LogLevel.Error); } - Logging.instance.log( + Logging.instance.logd( "SWB backing up prefs", level: LogLevel.Warning, ); @@ -291,7 +291,7 @@ abstract class SWB { backupJson['prefs'] = prefs; - Logging.instance.log( + Logging.instance.logd( "SWB backing up addressbook", level: LogLevel.Warning, ); @@ -301,7 +301,7 @@ abstract class SWB { backupJson['addressBookEntries'] = addresses.map((e) => e.toMap()).toList(); - Logging.instance.log( + Logging.instance.logd( "SWB backing up wallets", level: LogLevel.Warning, ); @@ -330,7 +330,7 @@ abstract class SWB { final String err = "${wallet.info.coin.identifier} wallet ${wallet.info.name} " "has null keys or config"; - Logging.instance.log(err, level: LogLevel.Fatal); + Logging.instance.logd(err, level: LogLevel.Fatal); throw Exception(err); } //This case should never actually happen in practice unless the whole @@ -368,7 +368,7 @@ abstract class SWB { } backupJson['wallets'] = backupWallets; - Logging.instance.log( + Logging.instance.logd( "SWB backing up trades", level: LogLevel.Warning, ); @@ -385,7 +385,7 @@ abstract class SWB { tradeTxidLookupDataService.all.map((e) => e.toMap()).toList(); backupJson["tradeTxidLookupData"] = lookupData; - Logging.instance.log( + Logging.instance.logd( "SWB backing up trade notes", level: LogLevel.Warning, ); @@ -395,7 +395,7 @@ abstract class SWB { final tradeNotes = tradeNotesService.all; backupJson["tradeNotes"] = tradeNotes; }); - Logging.instance.log( + Logging.instance.logd( "createStackWalletJSON DB.instance.mutex released", level: LogLevel.Info, ); @@ -408,7 +408,7 @@ abstract class SWB { // .toList(growable: false); Logging.instance - .log("...createStackWalletJSON complete", level: LogLevel.Info); + .logd("...createStackWalletJSON complete", level: LogLevel.Info); return backupJson; } @@ -590,7 +590,7 @@ abstract class SWB { await restoringFuture; - Logging.instance.log( + Logging.instance.logd( "SWB restored: ${info.walletId} ${info.name} ${info.coin.prettyName}", level: LogLevel.Info, ); @@ -606,7 +606,7 @@ abstract class SWB { mnemonicPassphrase: mnemonicPassphrase, ); } catch (e, s) { - Logging.instance.log("$e $s", level: LogLevel.Warning); + Logging.instance.logd("$e $s", level: LogLevel.Warning); uiState?.update( walletId: info.walletId, restoringStatus: StackRestoringStatus.failed, @@ -640,7 +640,7 @@ abstract class SWB { uiState?.preferences = StackRestoringStatus.restoring; - Logging.instance.log( + Logging.instance.logd( "SWB restoring prefs", level: LogLevel.Warning, ); @@ -649,7 +649,7 @@ abstract class SWB { uiState?.preferences = StackRestoringStatus.success; uiState?.addressBook = StackRestoringStatus.restoring; - Logging.instance.log( + Logging.instance.logd( "SWB restoring addressbook", level: LogLevel.Warning, ); @@ -660,7 +660,7 @@ abstract class SWB { uiState?.addressBook = StackRestoringStatus.success; uiState?.nodes = StackRestoringStatus.restoring; - Logging.instance.log( + Logging.instance.logd( "SWB restoring nodes", level: LogLevel.Warning, ); @@ -675,7 +675,7 @@ abstract class SWB { // restore trade history if (trades != null) { - Logging.instance.log( + Logging.instance.logd( "SWB restoring trades", level: LogLevel.Warning, ); @@ -684,7 +684,7 @@ abstract class SWB { // restore trade history lookup data for trades send from stack wallet if (tradeTxidLookupData != null) { - Logging.instance.log( + Logging.instance.logd( "SWB restoring trade look up data", level: LogLevel.Warning, ); @@ -694,7 +694,7 @@ abstract class SWB { // restore trade notes if (tradeNotes != null) { - Logging.instance.log( + Logging.instance.logd( "SWB restoring trade notes", level: LogLevel.Warning, ); @@ -729,13 +729,13 @@ abstract class SWB { ) async { if (!Platform.isLinux) await WakelockPlus.enable(); - Logging.instance.log( + Logging.instance.logd( "SWB creating temp backup", level: LogLevel.Warning, ); final preRestoreJSON = await createStackWalletJSON(secureStorage: secureStorageInterface); - Logging.instance.log( + Logging.instance.logd( "SWB temp backup created", level: LogLevel.Warning, ); @@ -832,7 +832,7 @@ abstract class SWB { otherData = Map.from(data as Map); } } catch (e, s) { - Logging.instance.log( + Logging.instance.logd( "SWB restore walletinfo otherdata error: $e\n$s", level: LogLevel.Error, ); @@ -950,7 +950,7 @@ abstract class SWB { return false; } - Logging.instance.log("done with SWB restore", level: LogLevel.Warning); + Logging.instance.logd("done with SWB restore", level: LogLevel.Warning); await Wallets.sharedInstance .loadAfterStackRestore(_prefs, uiState?.wallets ?? [], Util.isDesktop); @@ -1100,7 +1100,7 @@ abstract class SWB { node: nodeService.getNodeById(id: node['id'] as String)!, ); } catch (e, s) { - Logging.instance.log("$e $s", level: LogLevel.Error); + Logging.instance.logd("$e $s", level: LogLevel.Error); } } } @@ -1193,7 +1193,7 @@ abstract class SWB { _cancelCompleter!.complete(); _shouldCancelRestore = false; - Logging.instance.log("Revert SWB complete", level: LogLevel.Info); + Logging.instance.logd("Revert SWB complete", level: LogLevel.Info); } static Future _restorePrefs(Map prefs) async { @@ -1310,7 +1310,7 @@ abstract class SWB { node: nodeService.getNodeById(id: node['id'] as String)!, ); } catch (e, s) { - Logging.instance.log("$e $s", level: LogLevel.Error); + Logging.instance.logd("$e $s", level: LogLevel.Error); } } } diff --git a/lib/pages/settings_views/global_settings_view/stack_backup_views/restore_from_file_view.dart b/lib/pages/settings_views/global_settings_view/stack_backup_views/restore_from_file_view.dart index c994d6c7c..1a73743ac 100644 --- a/lib/pages/settings_views/global_settings_view/stack_backup_views/restore_from_file_view.dart +++ b/lib/pages/settings_views/global_settings_view/stack_backup_views/restore_from_file_view.dart @@ -172,7 +172,7 @@ class _RestoreFromFileViewState extends ConsumerState { }); } } catch (e, s) { - Logging.instance.log("$e\n$s", level: LogLevel.Error); + Logging.instance.logd("$e\n$s", level: LogLevel.Error); } }, controller: fileLocationController, diff --git a/lib/pages/settings_views/global_settings_view/stack_backup_views/sub_views/stack_restore_progress_view.dart b/lib/pages/settings_views/global_settings_view/stack_backup_views/sub_views/stack_restore_progress_view.dart index b160eb2e1..7064dfa5a 100644 --- a/lib/pages/settings_views/global_settings_view/stack_backup_views/sub_views/stack_restore_progress_view.dart +++ b/lib/pages/settings_views/global_settings_view/stack_backup_views/sub_views/stack_restore_progress_view.dart @@ -169,7 +169,7 @@ class _StackRestoreProgressViewState ref.read(secureStoreProvider), ); } catch (e, s) { - Logging.instance.log("$e\n$s", level: LogLevel.Warning); + Logging.instance.logd("$e\n$s", level: LogLevel.Warning); } if (finished != null && finished && uiState.done) { diff --git a/lib/pages/settings_views/global_settings_view/tor_settings/tor_settings_view.dart b/lib/pages/settings_views/global_settings_view/tor_settings/tor_settings_view.dart index 425a7accc..5f34b89fa 100644 --- a/lib/pages/settings_views/global_settings_view/tor_settings/tor_settings_view.dart +++ b/lib/pages/settings_views/global_settings_view/tor_settings/tor_settings_view.dart @@ -604,7 +604,7 @@ Future connectTor(WidgetRef ref, BuildContext context) async { // Toggle the useTor preference on success. ref.read(prefsChangeNotifierProvider).useTor = true; } catch (e, s) { - Logging.instance.log( + Logging.instance.logd( "Error starting tor: $e\n$s", level: LogLevel.Error, ); @@ -627,7 +627,7 @@ Future disconnectTor(WidgetRef ref, BuildContext context) async { // Toggle the useTor preference on success. ref.read(prefsChangeNotifierProvider).useTor = false; } catch (e, s) { - Logging.instance.log( + Logging.instance.logd( "Error stopping tor: $e\n$s", level: LogLevel.Error, ); diff --git a/lib/pages/settings_views/wallet_settings_view/frost_ms/initiate_resharing/complete_reshare_config_view.dart b/lib/pages/settings_views/wallet_settings_view/frost_ms/initiate_resharing/complete_reshare_config_view.dart index 7adb5b4c3..efb5ce11a 100644 --- a/lib/pages/settings_views/wallet_settings_view/frost_ms/initiate_resharing/complete_reshare_config_view.dart +++ b/lib/pages/settings_views/wallet_settings_view/frost_ms/initiate_resharing/complete_reshare_config_view.dart @@ -148,7 +148,7 @@ class _CompleteReshareConfigViewState ); } } catch (e, s) { - Logging.instance.log( + Logging.instance.logd( "$e\n$s", level: LogLevel.Fatal, ); diff --git a/lib/pages/settings_views/wallet_settings_view/wallet_settings_wallet_settings/lelantus_settings_view.dart b/lib/pages/settings_views/wallet_settings_view/wallet_settings_wallet_settings/lelantus_settings_view.dart index f0ebcfbf0..34628565f 100644 --- a/lib/pages/settings_views/wallet_settings_view/wallet_settings_wallet_settings/lelantus_settings_view.dart +++ b/lib/pages/settings_views/wallet_settings_view/wallet_settings_wallet_settings/lelantus_settings_view.dart @@ -114,7 +114,7 @@ class _LelantusSettingsViewState extends ConsumerState { } } } catch (e, s) { - Logging.instance.log("$e\n$s", level: LogLevel.Error); + Logging.instance.logd("$e\n$s", level: LogLevel.Error); if (mounted) { // show error await showDialog( diff --git a/lib/pages/wallet_view/transaction_views/transaction_details_view.dart b/lib/pages/wallet_view/transaction_views/transaction_details_view.dart index 1071ffdae..70246ee93 100644 --- a/lib/pages/wallet_view/transaction_views/transaction_details_view.dart +++ b/lib/pages/wallet_view/transaction_views/transaction_details_view.dart @@ -219,7 +219,7 @@ class _TransactionDetailsViewState return address; } } catch (e, s) { - Logging.instance.log("$e\n$s", level: LogLevel.Warning); + Logging.instance.logd("$e\n$s", level: LogLevel.Warning); return address; } } diff --git a/lib/pages/wallet_view/transaction_views/tx_v2/transaction_v2_details_view.dart b/lib/pages/wallet_view/transaction_views/tx_v2/transaction_v2_details_view.dart index 7081f5929..55ecb0cb0 100644 --- a/lib/pages/wallet_view/transaction_views/tx_v2/transaction_v2_details_view.dart +++ b/lib/pages/wallet_view/transaction_views/tx_v2/transaction_v2_details_view.dart @@ -406,7 +406,7 @@ class _TransactionV2DetailsViewState return address; } } catch (e, s) { - Logging.instance.log("$e\n$s", level: LogLevel.Warning); + Logging.instance.logd("$e\n$s", level: LogLevel.Warning); return address; } } diff --git a/lib/pages/wallet_view/wallet_view.dart b/lib/pages/wallet_view/wallet_view.dart index 52d6e05a4..4247e96da 100644 --- a/lib/pages/wallet_view/wallet_view.dart +++ b/lib/pages/wallet_view/wallet_view.dart @@ -1199,7 +1199,7 @@ class _WalletViewState extends ConsumerState { .read(paynymAPIProvider) .nym(code.toString()); - Logging.instance.log( + Logging.instance.logd( "my nym account: $account", level: LogLevel.Info, ); diff --git a/lib/pages_desktop_specific/coin_control/freeze_button.dart b/lib/pages_desktop_specific/coin_control/freeze_button.dart index dddcc92fa..440a65fd8 100644 --- a/lib/pages_desktop_specific/coin_control/freeze_button.dart +++ b/lib/pages_desktop_specific/coin_control/freeze_button.dart @@ -11,11 +11,12 @@ import 'package:async/async.dart'; import 'package:flutter/material.dart'; import 'package:isar/isar.dart'; + import '../../db/isar/main_db.dart'; import '../../models/isar/models/blockchain_data/utxo.dart'; -import 'utxo_row.dart'; import '../../utilities/logger.dart'; import '../../widgets/desktop/primary_button.dart'; +import 'utxo_row.dart'; class FreezeButton extends StatefulWidget { const FreezeButton({ @@ -78,7 +79,7 @@ class _FreezeButtonState extends State { break; default: - Logging.instance.log( + Logging.instance.logd( "Unknown utxo method name found in $runtimeType", level: LogLevel.Fatal, ); diff --git a/lib/pages_desktop_specific/desktop_exchange/exchange_steps/subwidgets/desktop_step_2.dart b/lib/pages_desktop_specific/desktop_exchange/exchange_steps/subwidgets/desktop_step_2.dart index a7f76c7e8..a7f096d22 100644 --- a/lib/pages_desktop_specific/desktop_exchange/exchange_steps/subwidgets/desktop_step_2.dart +++ b/lib/pages_desktop_specific/desktop_exchange/exchange_steps/subwidgets/desktop_step_2.dart @@ -83,7 +83,7 @@ class _DesktopStep2State extends ConsumerState { ref.read(desktopExchangeModelProvider)!.recipientAddress = info.item2; } } catch (e, s) { - Logging.instance.log("$e\n$s", level: LogLevel.Info); + Logging.instance.logd("$e\n$s", level: LogLevel.Info); } widget.enableNextChanged.call( @@ -116,7 +116,7 @@ class _DesktopStep2State extends ConsumerState { ref.read(desktopExchangeModelProvider)!.refundAddress = info.item2; } } catch (e, s) { - Logging.instance.log("$e\n$s", level: LogLevel.Info); + Logging.instance.logd("$e\n$s", level: LogLevel.Info); } widget.enableNextChanged.call( _next(), diff --git a/lib/pages_desktop_specific/my_stack_view/wallet_view/sub_widgets/desktop_send.dart b/lib/pages_desktop_specific/my_stack_view/wallet_view/sub_widgets/desktop_send.dart index 0fb65c635..ddf4f14f6 100644 --- a/lib/pages_desktop_specific/my_stack_view/wallet_view/sub_widgets/desktop_send.dart +++ b/lib/pages_desktop_specific/my_stack_view/wallet_view/sub_widgets/desktop_send.dart @@ -150,7 +150,7 @@ class _DesktopSendState extends ConsumerState { builder: (context) => const QrCodeScannerDialog(), ); if (qrResult == null) { - Logging.instance.log( + Logging.instance.logd( "Qr scanning cancelled", level: LogLevel.Info, ); @@ -158,14 +158,14 @@ class _DesktopSendState extends ConsumerState { try { _processQrCodeData(qrResult); } catch (e, s) { - Logging.instance.log( + Logging.instance.logd( "Error processing QR code data: $e\n$s", level: LogLevel.Error, ); } } } catch (e, s) { - Logging.instance.log( + Logging.instance.logd( "Error opening QR code scanner dialog: $e\n$s", level: LogLevel.Error, ); @@ -513,7 +513,7 @@ class _DesktopSendState extends ConsumerState { ); } } catch (e, s) { - Logging.instance.log("Desktop send: $e\n$s", level: LogLevel.Error); + Logging.instance.logd("Desktop send: $e\n$s", level: LogLevel.Error); if (mounted) { // pop building dialog Navigator.of( @@ -618,7 +618,7 @@ class _DesktopSendState extends ConsumerState { if (_cachedAmountToSend != null && _cachedAmountToSend == amount) { return; } - Logging.instance.log( + Logging.instance.logd( "it changed $amount $_cachedAmountToSend", level: LogLevel.Info, ); @@ -708,7 +708,7 @@ class _DesktopSendState extends ConsumerState { } } catch (e, s) { Logging.instance - .log("Error processing QR code data: $e\n$s", level: LogLevel.Error); + .logd("Error processing QR code data: $e\n$s", level: LogLevel.Error); } } @@ -858,8 +858,8 @@ class _DesktopSendState extends ConsumerState { return; } _cachedAmountToSend = amount; - Logging.instance - .log("it changed $amount $_cachedAmountToSend", level: LogLevel.Info); + Logging.instance.logd("it changed $amount $_cachedAmountToSend", + level: LogLevel.Info); final amountString = ref.read(pAmountFormatter(coin)).format( amount!, diff --git a/lib/pages_desktop_specific/my_stack_view/wallet_view/sub_widgets/desktop_token_send.dart b/lib/pages_desktop_specific/my_stack_view/wallet_view/sub_widgets/desktop_token_send.dart index 158beed86..43d3c23a5 100644 --- a/lib/pages_desktop_specific/my_stack_view/wallet_view/sub_widgets/desktop_token_send.dart +++ b/lib/pages_desktop_specific/my_stack_view/wallet_view/sub_widgets/desktop_token_send.dart @@ -406,7 +406,7 @@ class _DesktopTokenSendState extends ConsumerState { _cachedAmountToSend == _amountToSend) { return; } - Logging.instance.log( + Logging.instance.logd( "it changed $_amountToSend $_cachedAmountToSend", level: LogLevel.Info, ); @@ -471,7 +471,7 @@ class _DesktopTokenSendState extends ConsumerState { final qrResult = await scanner.scan(); - Logging.instance.log( + Logging.instance.logd( "qrResult content: ${qrResult.rawContent}", level: LogLevel.Info, ); @@ -482,7 +482,7 @@ class _DesktopTokenSendState extends ConsumerState { ); Logging.instance - .log("qrResult parsed: $paymentData", level: LogLevel.Info); + .logd("qrResult parsed: $paymentData", level: LogLevel.Info); if (paymentData != null && paymentData.coin?.uriScheme == coin.uriScheme) { @@ -529,7 +529,7 @@ class _DesktopTokenSendState extends ConsumerState { } on PlatformException catch (e, s) { // here we ignore the exception caused by not giving permission // to use the camera to scan a qr code - Logging.instance.log( + Logging.instance.logd( "Failed to get camera permissions while trying to scan qr code in SendView: $e\n$s", level: LogLevel.Warning, ); @@ -586,7 +586,7 @@ class _DesktopTokenSendState extends ConsumerState { return; } _cachedAmountToSend = _amountToSend; - Logging.instance.log( + Logging.instance.logd( "it changed $_amountToSend $_cachedAmountToSend", level: LogLevel.Info, ); diff --git a/lib/pages_desktop_specific/my_stack_view/wallet_view/sub_widgets/desktop_wallet_features.dart b/lib/pages_desktop_specific/my_stack_view/wallet_view/sub_widgets/desktop_wallet_features.dart index be0f080b1..2d874fffd 100644 --- a/lib/pages_desktop_specific/my_stack_view/wallet_view/sub_widgets/desktop_wallet_features.dart +++ b/lib/pages_desktop_specific/my_stack_view/wallet_view/sub_widgets/desktop_wallet_features.dart @@ -319,7 +319,7 @@ class _DesktopWalletFeaturesState extends ConsumerState { final account = await ref.read(paynymAPIProvider).nym(code.toString()); - Logging.instance.log( + Logging.instance.logd( "my nym account: $account", level: LogLevel.Info, ); diff --git a/lib/pages_desktop_specific/my_stack_view/wallet_view/sub_widgets/more_features/more_features_dialog.dart b/lib/pages_desktop_specific/my_stack_view/wallet_view/sub_widgets/more_features/more_features_dialog.dart index 5559e45bc..38e91701c 100644 --- a/lib/pages_desktop_specific/my_stack_view/wallet_view/sub_widgets/more_features/more_features_dialog.dart +++ b/lib/pages_desktop_specific/my_stack_view/wallet_view/sub_widgets/more_features/more_features_dialog.dart @@ -213,7 +213,7 @@ class _MoreFeaturesDialogState extends ConsumerState { } } } catch (e, s) { - Logging.instance.log("$e\n$s", level: LogLevel.Error); + Logging.instance.logd("$e\n$s", level: LogLevel.Error); if (mounted) { // show error await showDialog( diff --git a/lib/pages_desktop_specific/password/delete_password_warning_view.dart b/lib/pages_desktop_specific/password/delete_password_warning_view.dart index e8a4c5256..1b6c3d5b1 100644 --- a/lib/pages_desktop_specific/password/delete_password_warning_view.dart +++ b/lib/pages_desktop_specific/password/delete_password_warning_view.dart @@ -87,7 +87,7 @@ class _ForgotPasswordDesktopViewState await DB.instance.init(); } catch (e, s) { - Logging.instance.log( + Logging.instance.logd( "$e\n$s", level: LogLevel.Fatal, ); diff --git a/lib/pages_desktop_specific/password/desktop_login_view.dart b/lib/pages_desktop_specific/password/desktop_login_view.dart index 89447ee57..04fab5bac 100644 --- a/lib/pages_desktop_specific/password/desktop_login_view.dart +++ b/lib/pages_desktop_specific/password/desktop_login_view.dart @@ -75,7 +75,7 @@ class _DesktopLoginViewState extends ConsumerState { secureStore: ref.read(secureStoreProvider), ); } catch (e, s) { - Logging.instance.log( + Logging.instance.logd( "Cannot migrate desktop database\n$e $s", level: LogLevel.Error, printFullLength: true, diff --git a/lib/pages_desktop_specific/password/forgotten_passphrase_restore_from_swb.dart b/lib/pages_desktop_specific/password/forgotten_passphrase_restore_from_swb.dart index a20660779..4030e6c50 100644 --- a/lib/pages_desktop_specific/password/forgotten_passphrase_restore_from_swb.dart +++ b/lib/pages_desktop_specific/password/forgotten_passphrase_restore_from_swb.dart @@ -271,7 +271,7 @@ class _ForgottenPassphraseRestoreFromSWBState }); } } catch (e, s) { - Logging.instance.log("$e\n$s", level: LogLevel.Error); + Logging.instance.logd("$e\n$s", level: LogLevel.Error); } }, child: MouseRegion( diff --git a/lib/pages_desktop_specific/settings/settings_menu/appearance_settings/sub_widgets/desktop_install_theme.dart b/lib/pages_desktop_specific/settings/settings_menu/appearance_settings/sub_widgets/desktop_install_theme.dart index 081540c3b..3ad0f0f1f 100644 --- a/lib/pages_desktop_specific/settings/settings_menu/appearance_settings/sub_widgets/desktop_install_theme.dart +++ b/lib/pages_desktop_specific/settings/settings_menu/appearance_settings/sub_widgets/desktop_install_theme.dart @@ -14,6 +14,7 @@ import 'package:flutter/material.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:flutter_svg/flutter_svg.dart'; import 'package:share_plus/share_plus.dart'; + import '../../../../../themes/stack_colors.dart'; import '../../../../../themes/theme_service.dart'; import '../../../../../utilities/assets.dart'; @@ -56,7 +57,7 @@ class _DesktopInstallThemeState extends ConsumerState { ]); return true; } catch (e, s) { - Logging.instance.log( + Logging.instance.logd( "Failed to install theme: $e\n$s", level: LogLevel.Warning, ); @@ -81,7 +82,7 @@ class _DesktopInstallThemeState extends ConsumerState { } } } catch (e, s) { - Logging.instance.log("$e\n$s", level: LogLevel.Error); + Logging.instance.logd("$e\n$s", level: LogLevel.Error); } } diff --git a/lib/pages_desktop_specific/settings/settings_menu/backup_and_restore/create_auto_backup.dart b/lib/pages_desktop_specific/settings/settings_menu/backup_and_restore/create_auto_backup.dart index bf5f3e009..3ed9aafc2 100644 --- a/lib/pages_desktop_specific/settings/settings_menu/backup_and_restore/create_auto_backup.dart +++ b/lib/pages_desktop_specific/settings/settings_menu/backup_and_restore/create_auto_backup.dart @@ -202,7 +202,7 @@ class _CreateAutoBackup extends ConsumerState { } } catch (e, s) { Logging.instance - .log("$e\n$s", level: LogLevel.Error); + .logd("$e\n$s", level: LogLevel.Error); } }, controller: fileLocationController, @@ -700,7 +700,7 @@ class _CreateAutoBackup extends ConsumerState { final String err = getErrorMessageFromSWBException(e); Logging.instance - .log("$err\n$s", level: LogLevel.Error); + .logd("$err\n$s", level: LogLevel.Error); // pop encryption progress dialog Navigator.of(context).pop(); unawaited( @@ -713,7 +713,7 @@ class _CreateAutoBackup extends ConsumerState { return; } catch (e, s) { Logging.instance - .log("$e\n$s", level: LogLevel.Error); + .logd("$e\n$s", level: LogLevel.Error); // pop encryption progress dialog Navigator.of(context).pop(); unawaited( diff --git a/lib/pages_desktop_specific/settings/settings_menu/tor_settings/tor_settings.dart b/lib/pages_desktop_specific/settings/settings_menu/tor_settings/tor_settings.dart index d01a5d678..6b698048a 100644 --- a/lib/pages_desktop_specific/settings/settings_menu/tor_settings/tor_settings.dart +++ b/lib/pages_desktop_specific/settings/settings_menu/tor_settings/tor_settings.dart @@ -71,7 +71,7 @@ class _TorSettingsState extends ConsumerState { // Toggle the useTor preference on success. ref.read(prefsChangeNotifierProvider).useTor = true; } catch (e, s) { - Logging.instance.log( + Logging.instance.logd( "Error starting tor: $e\n$s", level: LogLevel.Error, ); @@ -101,7 +101,7 @@ class _TorSettingsState extends ConsumerState { // Toggle the useTor preference on success. ref.read(prefsChangeNotifierProvider).useTor = false; } catch (e, s) { - Logging.instance.log( + Logging.instance.logd( "Error stopping tor: $e\n$s", level: LogLevel.Error, ); diff --git a/lib/services/auto_swb_service.dart b/lib/services/auto_swb_service.dart index 1113b30f1..4a44dfae3 100644 --- a/lib/services/auto_swb_service.dart +++ b/lib/services/auto_swb_service.dart @@ -42,14 +42,14 @@ class AutoSWBService extends ChangeNotifier { /// Attempt a backup. Future doBackup() async { if (_status == AutoSWBStatus.backingUp) { - Logging.instance.log( + Logging.instance.logd( "AutoSWBService attempted to run doBackup() while a backup is in progress!", level: LogLevel.Warning, ); return; } Logging.instance - .log("AutoSWBService.doBackup() started...", level: LogLevel.Info); + .logd("AutoSWBService.doBackup() started...", level: LogLevel.Info); // set running backup status and notify listeners _status = AutoSWBStatus.backingUp; @@ -62,7 +62,7 @@ class AutoSWBService extends ChangeNotifier { final autoBackupDirectoryPath = Prefs.instance.autoBackupLocation; if (autoBackupDirectoryPath == null) { - Logging.instance.log( + Logging.instance.logd( "AutoSWBService attempted to run doBackup() when no auto backup directory was set!", level: LogLevel.Error, ); @@ -105,16 +105,16 @@ class AutoSWBService extends ChangeNotifier { trimBackups(autoBackupDirectoryPath, 3); Logging.instance - .log("AutoSWBService.doBackup() succeeded", level: LogLevel.Info); + .logd("AutoSWBService.doBackup() succeeded", level: LogLevel.Info); } on Exception catch (e, s) { final String err = getErrorMessageFromSWBException(e); - Logging.instance.log("$err\n$s", level: LogLevel.Error); + Logging.instance.logd("$err\n$s", level: LogLevel.Error); // set error backup status and notify listeners _status = AutoSWBStatus.error; notifyListeners(); return; } catch (e, s) { - Logging.instance.log("$e\n$s", level: LogLevel.Error); + Logging.instance.logd("$e\n$s", level: LogLevel.Error); // set error backup status and notify listeners _status = AutoSWBStatus.error; notifyListeners(); diff --git a/lib/services/buy/simplex/simplex_api.dart b/lib/services/buy/simplex/simplex_api.dart index 5bbb82c1c..7242ee295 100644 --- a/lib/services/buy/simplex/simplex_api.dart +++ b/lib/services/buy/simplex/simplex_api.dart @@ -72,7 +72,7 @@ class SimplexAPI { return _parseSupportedCryptos(jsonArray); } catch (e, s) { - Logging.instance.log( + Logging.instance.logd( "getAvailableCurrencies exception: $e\n$s", level: LogLevel.Error, ); @@ -107,7 +107,7 @@ class SimplexAPI { return BuyResponse(value: cryptos); } catch (e, s) { Logging.instance - .log("_parseSupported exception: $e\n$s", level: LogLevel.Error); + .logd("_parseSupported exception: $e\n$s", level: LogLevel.Error); return BuyResponse( exception: BuyException( e.toString(), @@ -143,7 +143,7 @@ class SimplexAPI { return _parseSupportedFiats(jsonArray); } catch (e, s) { - Logging.instance.log( + Logging.instance.logd( "getAvailableCurrencies exception: $e\n$s", level: LogLevel.Error, ); @@ -180,7 +180,7 @@ class SimplexAPI { return BuyResponse(value: fiats); } catch (e, s) { Logging.instance - .log("_parseSupported exception: $e\n$s", level: LogLevel.Error); + .logd("_parseSupported exception: $e\n$s", level: LogLevel.Error); return BuyResponse( exception: BuyException( e.toString(), @@ -236,7 +236,8 @@ class SimplexAPI { return _parseQuote(jsonArray); } catch (e, s) { - Logging.instance.log("getQuote exception: $e\n$s", level: LogLevel.Error); + Logging.instance + .logd("getQuote exception: $e\n$s", level: LogLevel.Error); return BuyResponse( exception: BuyException( e.toString(), @@ -281,7 +282,7 @@ class SimplexAPI { return BuyResponse(value: _quote); } catch (e, s) { Logging.instance - .log("_parseQuote exception: $e\n$s", level: LogLevel.Error); + .logd("_parseQuote exception: $e\n$s", level: LogLevel.Error); return BuyResponse( exception: BuyException( e.toString(), @@ -350,7 +351,8 @@ class SimplexAPI { return BuyResponse(value: _order); } catch (e, s) { - Logging.instance.log("newOrder exception: $e\n$s", level: LogLevel.Error); + Logging.instance + .logd("newOrder exception: $e\n$s", level: LogLevel.Error); return BuyResponse( exception: BuyException( e.toString(), @@ -378,7 +380,8 @@ class SimplexAPI { return BuyResponse(value: status); } catch (e, s) { - Logging.instance.log("newOrder exception: $e\n$s", level: LogLevel.Error); + Logging.instance + .logd("newOrder exception: $e\n$s", level: LogLevel.Error); return BuyResponse( exception: BuyException( e.toString(), diff --git a/lib/services/coins/tezos/api/tezos_api.dart b/lib/services/coins/tezos/api/tezos_api.dart index e646019ee..776e0e700 100644 --- a/lib/services/coins/tezos/api/tezos_api.dart +++ b/lib/services/coins/tezos/api/tezos_api.dart @@ -25,7 +25,7 @@ abstract final class TezosAPI { final result = jsonDecode(response.body); return result as int; } catch (e, s) { - Logging.instance.log( + Logging.instance.logd( "Error occurred in TezosAPI while getting counter for $address: $e\n$s", level: LogLevel.Error, ); @@ -53,7 +53,7 @@ abstract final class TezosAPI { return account; } catch (e, s) { - Logging.instance.log( + Logging.instance.logd( "Error occurred in TezosAPI while getting account for $address: $e\n$s", level: LogLevel.Error, ); @@ -109,7 +109,7 @@ abstract final class TezosAPI { } return txs; } catch (e, s) { - Logging.instance.log( + Logging.instance.logd( "Error occurred in TezosAPI while getting transactions for $address: $e\n$s", level: LogLevel.Error, ); diff --git a/lib/services/coins/tezos/api/tezos_rpc_api.dart b/lib/services/coins/tezos/api/tezos_rpc_api.dart index 59ca98045..afddfa4c3 100644 --- a/lib/services/coins/tezos/api/tezos_rpc_api.dart +++ b/lib/services/coins/tezos/api/tezos_rpc_api.dart @@ -28,7 +28,7 @@ abstract final class TezosRpcAPI { BigInt.parse(response.body.substring(1, response.body.length - 2)); return balance; } catch (e) { - Logging.instance.log( + Logging.instance.logd( "Error occurred in tezos_rpc_api.dart while getting balance for $address: $e", level: LogLevel.Error, ); @@ -54,7 +54,7 @@ abstract final class TezosRpcAPI { final jsonParsedResponse = jsonDecode(response.body); return int.parse(jsonParsedResponse["level"].toString()); } catch (e) { - Logging.instance.log( + Logging.instance.logd( "Error occurred in tezos_rpc_api.dart while getting chain height for tezos: $e", level: LogLevel.Error, ); diff --git a/lib/services/ethereum/cached_eth_token_balance.dart b/lib/services/ethereum/cached_eth_token_balance.dart index c241f7231..7841a7580 100644 --- a/lib/services/ethereum/cached_eth_token_balance.dart +++ b/lib/services/ethereum/cached_eth_token_balance.dart @@ -54,7 +54,7 @@ class CachedEthTokenBalance { isar: mainDB.isar, ); } else { - Logging.instance.log( + Logging.instance.logd( "CachedEthTokenBalance.fetchAndUpdateCachedBalance failed: ${response.exception}", level: LogLevel.Warning, ); diff --git a/lib/services/ethereum/ethereum_api.dart b/lib/services/ethereum/ethereum_api.dart index 6f5f2313e..fbfbe52fa 100644 --- a/lib/services/ethereum/ethereum_api.dart +++ b/lib/services/ethereum/ethereum_api.dart @@ -104,7 +104,7 @@ abstract class EthereumAPI { e, ); } catch (e, s) { - Logging.instance.log( + Logging.instance.logd( "getEthTransactions($address): $e\n$s", level: LogLevel.Error, ); @@ -170,7 +170,7 @@ abstract class EthereumAPI { e, ); } catch (e, s) { - Logging.instance.log( + Logging.instance.logd( "getEthTransactionByHash($txid): $e\n$s", level: LogLevel.Error, ); @@ -233,7 +233,7 @@ abstract class EthereumAPI { e, ); } catch (e, s) { - Logging.instance.log( + Logging.instance.logd( "getEthTransactionNonces($txns): $e\n$s", level: LogLevel.Error, ); @@ -291,7 +291,7 @@ abstract class EthereumAPI { e, ); } catch (e, s) { - Logging.instance.log( + Logging.instance.logd( "getEthTokenTransactionsByTxids($txids): $e\n$s", level: LogLevel.Error, ); @@ -352,7 +352,7 @@ abstract class EthereumAPI { e, ); } catch (e, s) { - Logging.instance.log( + Logging.instance.logd( "getTokenTransactions($address, $tokenContractAddress): $e\n$s", level: LogLevel.Error, ); @@ -478,7 +478,7 @@ abstract class EthereumAPI { e, ); } catch (e, s) { - Logging.instance.log( + Logging.instance.logd( "getWalletTokenBalance(): $e\n$s", level: LogLevel.Error, ); @@ -529,7 +529,7 @@ abstract class EthereumAPI { e, ); } catch (e, s) { - Logging.instance.log( + Logging.instance.logd( "getAddressNonce(): $e\n$s", level: LogLevel.Error, ); @@ -585,7 +585,7 @@ abstract class EthereumAPI { e, ); } catch (e, s) { - Logging.instance.log( + Logging.instance.logd( "getGasOracle(): $e\n$s", level: LogLevel.Error, ); @@ -643,14 +643,14 @@ abstract class EthereumAPI { if (json["data"] is List) { if ((json["data"] as List).isEmpty) { if (autoNameOnEmpty) { - Logging.instance.log( + Logging.instance.logd( "getTokenByContractAddress(): Adding token data to server", level: LogLevel.Debug, ); // this will add the missing data to server await _addContractInfoToServer(contractAddress); - Logging.instance.log( + Logging.instance.logd( "getTokenByContractAddress(): Adding to server threw so now" "we try a normal fetch again", level: LogLevel.Debug, @@ -709,7 +709,7 @@ abstract class EthereumAPI { e, ); } catch (e, s) { - Logging.instance.log( + Logging.instance.logd( "getTokenByContractAddress(): $e\n$s", level: LogLevel.Error, ); @@ -753,7 +753,7 @@ abstract class EthereumAPI { e, ); } catch (e, s) { - Logging.instance.log( + Logging.instance.logd( "getTokenAbi($name, $contractAddress): $e\n$s", level: LogLevel.Error, ); @@ -798,7 +798,7 @@ abstract class EthereumAPI { e, ); } catch (e, s) { - Logging.instance.log( + Logging.instance.logd( "getProxyTokenImplementationAddress($contractAddress) : $e\n$s", level: LogLevel.Error, ); diff --git a/lib/services/event_bus/events/global/balance_refreshed_event.dart b/lib/services/event_bus/events/global/balance_refreshed_event.dart index 5b7a5028a..d061a5e3e 100644 --- a/lib/services/event_bus/events/global/balance_refreshed_event.dart +++ b/lib/services/event_bus/events/global/balance_refreshed_event.dart @@ -14,7 +14,7 @@ class BalanceRefreshedEvent { final String walletId; BalanceRefreshedEvent(this.walletId) { - Logging.instance.log( + Logging.instance.logd( "BalanceRefreshedEvent fired on $walletId", level: LogLevel.Info, ); diff --git a/lib/services/event_bus/events/global/blocks_remaining_event.dart b/lib/services/event_bus/events/global/blocks_remaining_event.dart index 008d39440..f94fc0b23 100644 --- a/lib/services/event_bus/events/global/blocks_remaining_event.dart +++ b/lib/services/event_bus/events/global/blocks_remaining_event.dart @@ -15,7 +15,7 @@ class BlocksRemainingEvent { String walletId; BlocksRemainingEvent(this.blocksRemaining, this.walletId) { - Logging.instance.log( + Logging.instance.logd( "RefreshPercentChangedEvent fired on $walletId with blocks remaining = $blocksRemaining", level: LogLevel.Info, ); diff --git a/lib/services/event_bus/events/global/node_connection_status_changed_event.dart b/lib/services/event_bus/events/global/node_connection_status_changed_event.dart index 7d3ca2fca..9f60bc9db 100644 --- a/lib/services/event_bus/events/global/node_connection_status_changed_event.dart +++ b/lib/services/event_bus/events/global/node_connection_status_changed_event.dart @@ -19,7 +19,7 @@ class NodeConnectionStatusChangedEvent { CryptoCurrency coin; NodeConnectionStatusChangedEvent(this.newStatus, this.walletId, this.coin) { - Logging.instance.log( + Logging.instance.logd( "NodeConnectionStatusChangedEvent fired in $walletId with arg newStatus = $newStatus", level: LogLevel.Info, ); diff --git a/lib/services/event_bus/events/global/refresh_percent_changed_event.dart b/lib/services/event_bus/events/global/refresh_percent_changed_event.dart index 7429b828e..fcae085b3 100644 --- a/lib/services/event_bus/events/global/refresh_percent_changed_event.dart +++ b/lib/services/event_bus/events/global/refresh_percent_changed_event.dart @@ -15,7 +15,7 @@ class RefreshPercentChangedEvent { String walletId; RefreshPercentChangedEvent(this.percent, this.walletId) { - Logging.instance.log( + Logging.instance.logd( "RefreshPercentChangedEvent fired on $walletId with percent (range of 0.0-1.0)= $percent", level: LogLevel.Info, ); diff --git a/lib/services/event_bus/events/global/tor_connection_status_changed_event.dart b/lib/services/event_bus/events/global/tor_connection_status_changed_event.dart index 9087d37e2..e42991270 100644 --- a/lib/services/event_bus/events/global/tor_connection_status_changed_event.dart +++ b/lib/services/event_bus/events/global/tor_connection_status_changed_event.dart @@ -16,7 +16,7 @@ class TorConnectionStatusChangedEvent { String message = ""; TorConnectionStatusChangedEvent(this.newStatus, this.message) { - Logging.instance.log( + Logging.instance.logd( "TorSyncStatusChangedEvent fired with arg newStatus = $newStatus ($message)", level: LogLevel.Info, ); diff --git a/lib/services/event_bus/events/global/tor_status_changed_event.dart b/lib/services/event_bus/events/global/tor_status_changed_event.dart index 140e01607..2466f4225 100644 --- a/lib/services/event_bus/events/global/tor_status_changed_event.dart +++ b/lib/services/event_bus/events/global/tor_status_changed_event.dart @@ -20,7 +20,7 @@ class TorPreferenceChangedEvent { required this.status, this.message, }) { - Logging.instance.log( + Logging.instance.logd( "TorStatusChangedEvent changed to \"$status\" with message: $message", level: LogLevel.Warning, ); diff --git a/lib/services/event_bus/events/global/updated_in_background_event.dart b/lib/services/event_bus/events/global/updated_in_background_event.dart index 36a23360f..94ad3a3da 100644 --- a/lib/services/event_bus/events/global/updated_in_background_event.dart +++ b/lib/services/event_bus/events/global/updated_in_background_event.dart @@ -18,7 +18,7 @@ class UpdatedInBackgroundEvent { UpdatedInBackgroundEvent(this.message, this.walletId) { if (kDebugMode) { - Logging.instance.log( + Logging.instance.logd( "UpdatedInBackgroundEvent fired with message: $message", level: LogLevel.Info, ); diff --git a/lib/services/event_bus/events/global/wallet_sync_status_changed_event.dart b/lib/services/event_bus/events/global/wallet_sync_status_changed_event.dart index 0f92fb272..497e6a97d 100644 --- a/lib/services/event_bus/events/global/wallet_sync_status_changed_event.dart +++ b/lib/services/event_bus/events/global/wallet_sync_status_changed_event.dart @@ -19,7 +19,7 @@ class WalletSyncStatusChangedEvent { CryptoCurrency coin; WalletSyncStatusChangedEvent(this.newStatus, this.walletId, this.coin) { - Logging.instance.log( + Logging.instance.logd( "WalletSyncStatusChangedEvent fired in $walletId with arg newStatus = $newStatus", level: LogLevel.Info, ); diff --git a/lib/services/exchange/change_now/change_now_api.dart b/lib/services/exchange/change_now/change_now_api.dart index 2882f9d4d..e0b96bf3b 100644 --- a/lib/services/exchange/change_now/change_now_api.dart +++ b/lib/services/exchange/change_now/change_now_api.dart @@ -79,7 +79,7 @@ class ChangeNowAPI { } } catch (e, s) { Logging.instance - .log("_makeRequest($uri) threw: $e\n$s", level: LogLevel.Error); + .logd("_makeRequest($uri) threw: $e\n$s", level: LogLevel.Error); rethrow; } } @@ -103,7 +103,7 @@ class ChangeNowAPI { return parsed; } catch (e, s) { Logging.instance - .log("_makeRequestV2($uri) threw: $e\n$s", level: LogLevel.Error); + .logd("_makeRequestV2($uri) threw: $e\n$s", level: LogLevel.Error); rethrow; } } @@ -129,13 +129,13 @@ class ChangeNowAPI { return parsed; } catch (_) { - Logging.instance - .log("ChangeNOW api failed to parse: $data", level: LogLevel.Error); + Logging.instance.logd("ChangeNOW api failed to parse: $data", + level: LogLevel.Error); rethrow; } } catch (e, s) { Logging.instance - .log("_makePostRequest($uri) threw: $e\n$s", level: LogLevel.Error); + .logd("_makePostRequest($uri) threw: $e\n$s", level: LogLevel.Error); rethrow; } } @@ -173,7 +173,7 @@ class ChangeNowAPI { ); return result; } catch (e, s) { - Logging.instance.log( + Logging.instance.logd( "getAvailableCurrencies exception: $e\n$s", level: LogLevel.Error, ); @@ -185,7 +185,7 @@ class ChangeNowAPI { ); } } catch (e, s) { - Logging.instance.log( + Logging.instance.logd( "getAvailableCurrencies exception: $e\n$s", level: LogLevel.Error, ); @@ -263,7 +263,7 @@ class ChangeNowAPI { ); return result; } catch (e, s) { - Logging.instance.log( + Logging.instance.logd( "getAvailableCurrencies exception: $e\n$s", level: LogLevel.Error, ); @@ -275,7 +275,7 @@ class ChangeNowAPI { ); } } catch (e, s) { - Logging.instance.log( + Logging.instance.logd( "getAvailableCurrencies exception: $e\n$s", level: LogLevel.Error, ); @@ -381,7 +381,7 @@ class ChangeNowAPI { } } } catch (e, s) { - Logging.instance.log( + Logging.instance.logd( "getPairedCurrencies exception: $e\n$s", level: LogLevel.Error, ); @@ -395,7 +395,7 @@ class ChangeNowAPI { return ExchangeResponse(value: currencies); } catch (e, s) { Logging.instance - .log("getPairedCurrencies exception: $e\n$s", level: LogLevel.Error); + .logd("getPairedCurrencies exception: $e\n$s", level: LogLevel.Error); return ExchangeResponse( exception: ExchangeException( e.toString(), @@ -435,7 +435,7 @@ class ChangeNowAPI { ); } } catch (e, s) { - Logging.instance.log( + Logging.instance.logd( "getMinimalExchangeAmount exception: $e\n$s", level: LogLevel.Error, ); @@ -478,7 +478,7 @@ class ChangeNowAPI { ), ); } catch (e, s) { - Logging.instance.log( + Logging.instance.logd( "getRange exception: $e\n$s", level: LogLevel.Error, ); @@ -551,7 +551,7 @@ class ChangeNowAPI { ); } } catch (e, s) { - Logging.instance.log( + Logging.instance.logd( "getEstimatedExchangeAmount exception: $e\n$s", level: LogLevel.Error, ); @@ -637,7 +637,7 @@ class ChangeNowAPI { ); } } catch (e, s) { - Logging.instance.log( + Logging.instance.logd( "getEstimatedExchangeAmount exception: $e\n$s", level: LogLevel.Error, ); @@ -763,7 +763,7 @@ class ChangeNowAPI { ); } } catch (e, s) { - Logging.instance.log( + Logging.instance.logd( "getEstimatedExchangeAmountV2 exception: $e\n$s", level: LogLevel.Error, ); @@ -797,7 +797,7 @@ class ChangeNowAPI { await compute(_parseFixedRateMarketsJson, jsonArray as List); return result; } catch (e, s) { - Logging.instance.log( + Logging.instance.logd( "getAvailableFixedRateMarkets exception: $e\n$s", level: LogLevel.Error, ); @@ -809,7 +809,7 @@ class ChangeNowAPI { ); } } catch (e, s) { - Logging.instance.log( + Logging.instance.logd( "getAvailableFixedRateMarkets exception: $e\n$s", level: LogLevel.Error, ); @@ -898,7 +898,7 @@ class ChangeNowAPI { ); } } catch (e, s) { - Logging.instance.log( + Logging.instance.logd( "createStandardExchangeTransaction exception: $e\n$s", level: LogLevel.Error, ); @@ -973,7 +973,7 @@ class ChangeNowAPI { ); } } catch (e, s) { - Logging.instance.log( + Logging.instance.logd( "createFixedRateExchangeTransaction exception: $e\n$s", level: LogLevel.Error, ); @@ -1011,8 +1011,8 @@ class ChangeNowAPI { ); } } catch (e, s) { - Logging.instance - .log("getTransactionStatus exception: $e\n$s", level: LogLevel.Error); + Logging.instance.logd("getTransactionStatus exception: $e\n$s", + level: LogLevel.Error); return ExchangeResponse( exception: ExchangeException( e.toString(), @@ -1041,7 +1041,7 @@ class ChangeNowAPI { ); return result; } catch (e, s) { - Logging.instance.log( + Logging.instance.logd( "getAvailableFloatingRatePairs exception: $e\n$s", level: LogLevel.Error, ); @@ -1053,7 +1053,7 @@ class ChangeNowAPI { ); } } catch (e, s) { - Logging.instance.log( + Logging.instance.logd( "getAvailableFloatingRatePairs exception: $e\n$s", level: LogLevel.Error, ); diff --git a/lib/services/exchange/exchange_data_loading_service.dart b/lib/services/exchange/exchange_data_loading_service.dart index 811949d6e..1708a1413 100644 --- a/lib/services/exchange/exchange_data_loading_service.dart +++ b/lib/services/exchange/exchange_data_loading_service.dart @@ -145,7 +145,7 @@ class ExchangeDataLoadingService { if (_isar == null) { await initDB(); } - Logging.instance.log( + Logging.instance.logd( "ExchangeDataLoadingService.loadAll starting...", level: LogLevel.Info, ); @@ -185,14 +185,14 @@ class ExchangeDataLoadingService { // wait for all loading futures to complete await Future.wait(futures); - Logging.instance.log( + Logging.instance.logd( "ExchangeDataLoadingService.loadAll finished in ${DateTime.now().difference(start).inSeconds} seconds", level: LogLevel.Info, ); onLoadingComplete?.call(); await _updateCurrentCacheVersion(cacheVersion); } catch (e, s) { - Logging.instance.log( + Logging.instance.logd( "ExchangeDataLoadingService.loadAll failed after ${DateTime.now().difference(start).inSeconds} seconds: $e\n$s", level: LogLevel.Error, ); @@ -219,7 +219,7 @@ class ExchangeDataLoadingService { await isar.currencies.putAll(responseCurrencies.value!); }); } else { - Logging.instance.log( + Logging.instance.logd( "Failed to load changeNOW currencies: ${responseCurrencies.exception?.message}", level: LogLevel.Error, ); @@ -353,7 +353,7 @@ class ExchangeDataLoadingService { await isar.currencies.putAll(responseCurrencies.value!); }); } else { - Logging.instance.log( + Logging.instance.logd( "loadMajesticBankCurrencies: $responseCurrencies", level: LogLevel.Warning, ); @@ -378,7 +378,7 @@ class ExchangeDataLoadingService { await isar.currencies.putAll(responseCurrencies.value!); }); } else { - Logging.instance.log( + Logging.instance.logd( "loadTrocadorCurrencies: $responseCurrencies", level: LogLevel.Warning, ); @@ -403,7 +403,7 @@ class ExchangeDataLoadingService { await isar.currencies.putAll(responseCurrencies.value!); }); } else { - Logging.instance.log( + Logging.instance.logd( "loadNanswapCurrencies: $responseCurrencies", level: LogLevel.Warning, ); diff --git a/lib/services/exchange/majestic_bank/majestic_bank_api.dart b/lib/services/exchange/majestic_bank/majestic_bank_api.dart index 0dc46343b..5f64112c2 100644 --- a/lib/services/exchange/majestic_bank/majestic_bank_api.dart +++ b/lib/services/exchange/majestic_bank/majestic_bank_api.dart @@ -11,6 +11,7 @@ import 'dart:convert'; import 'package:decimal/decimal.dart'; + import '../../../exceptions/exchange/exchange_exception.dart'; import '../../../exceptions/exchange/majestic_bank/mb_exception.dart'; import '../../../exceptions/exchange/pair_unavailable_exception.dart'; @@ -20,10 +21,10 @@ import '../../../models/exchange/majestic_bank/mb_order_calculation.dart'; import '../../../models/exchange/majestic_bank/mb_order_status.dart'; import '../../../models/exchange/majestic_bank/mb_rate.dart'; import '../../../networking/http.dart'; -import '../exchange_response.dart'; -import '../../tor_service.dart'; import '../../../utilities/logger.dart'; import '../../../utilities/prefs.dart'; +import '../../tor_service.dart'; +import '../exchange_response.dart'; class MajesticBankAPI { static const String scheme = "https"; @@ -60,7 +61,7 @@ class MajesticBankAPI { return parsed; } catch (e, s) { - Logging.instance.log( + Logging.instance.logd( "_makeRequest($uri) HTTP:$code threw: $e\n$s", level: LogLevel.Error, ); @@ -91,7 +92,8 @@ class MajesticBankAPI { } return ExchangeResponse(value: rates); } catch (e, s) { - Logging.instance.log("getRates exception: $e\n$s", level: LogLevel.Error); + Logging.instance + .logd("getRates exception: $e\n$s", level: LogLevel.Error); return ExchangeResponse( exception: ExchangeException( e.toString(), @@ -125,7 +127,7 @@ class MajesticBankAPI { return ExchangeResponse(value: limit); } catch (e, s) { Logging.instance - .log("getLimits exception: $e\n$s", level: LogLevel.Error); + .logd("getLimits exception: $e\n$s", level: LogLevel.Error); return ExchangeResponse( exception: ExchangeException( e.toString(), @@ -158,7 +160,7 @@ class MajesticBankAPI { return ExchangeResponse(value: limits); } catch (e, s) { Logging.instance - .log("getLimits exception: $e\n$s", level: LogLevel.Error); + .logd("getLimits exception: $e\n$s", level: LogLevel.Error); return ExchangeResponse( exception: ExchangeException( e.toString(), @@ -226,7 +228,7 @@ class MajesticBankAPI { return ExchangeResponse(value: result); } catch (e, s) { - Logging.instance.log( + Logging.instance.logd( "calculateOrder $fromCurrency-$receiveCurrency exception: $e\n$s", level: LogLevel.Error, ); @@ -275,7 +277,7 @@ class MajesticBankAPI { return ExchangeResponse(value: order); } catch (e, s) { Logging.instance - .log("createOrder exception: $e\n$s", level: LogLevel.Error); + .logd("createOrder exception: $e\n$s", level: LogLevel.Error); return ExchangeResponse( exception: ExchangeException( e.toString(), @@ -329,8 +331,8 @@ class MajesticBankAPI { return ExchangeResponse(value: order); } catch (e, s) { - Logging.instance - .log("createFixedRateOrder exception: $e\n$s", level: LogLevel.Error); + Logging.instance.logd("createFixedRateOrder exception: $e\n$s", + level: LogLevel.Error); return ExchangeResponse( exception: ExchangeException( e.toString(), @@ -377,7 +379,7 @@ class MajesticBankAPI { return ExchangeResponse(value: status); } catch (e, s) { - Logging.instance.log( + Logging.instance.logd( "trackOrder exception when trying to parse $json: $e\n$s", level: LogLevel.Error, ); diff --git a/lib/services/exchange/nanswap/nanswap_api.dart b/lib/services/exchange/nanswap/nanswap_api.dart index 41f06f19a..a5435e15f 100644 --- a/lib/services/exchange/nanswap/nanswap_api.dart +++ b/lib/services/exchange/nanswap/nanswap_api.dart @@ -47,7 +47,7 @@ class NanswapAPI { return parsed; } catch (e, s) { - Logging.instance.log( + Logging.instance.logd( "NanswapAPI._makeRequest($uri) HTTP:$code threw: $e\n$s", level: LogLevel.Error, ); @@ -81,7 +81,7 @@ class NanswapAPI { return parsed; } catch (e, s) { - Logging.instance.log( + Logging.instance.logd( "NanswapAPI._makePostRequest($uri) HTTP:$code threw: $e\n$s", level: LogLevel.Error, ); @@ -135,7 +135,7 @@ class NanswapAPI { return ExchangeResponse(value: result); } catch (e, s) { - Logging.instance.log( + Logging.instance.logd( "Nanswap.getSupportedCurrencies() exception: $e\n$s", level: LogLevel.Error, ); @@ -199,14 +199,14 @@ class NanswapAPI { ), ); } catch (_) { - Logging.instance.log( + Logging.instance.logd( "Nanswap.getEstimate() response was: $json", level: LogLevel.Error, ); rethrow; } } catch (e, s) { - Logging.instance.log( + Logging.instance.logd( "Nanswap.getEstimate() exception: $e\n$s", level: LogLevel.Error, ); @@ -271,7 +271,7 @@ class NanswapAPI { ), ); } catch (e, s) { - Logging.instance.log( + Logging.instance.logd( "Nanswap.getEstimateReverse() exception: $e\n$s", level: LogLevel.Error, ); @@ -322,7 +322,7 @@ class NanswapAPI { ), ); } catch (e, s) { - Logging.instance.log( + Logging.instance.logd( "Nanswap.getOrderLimits() exception: $e\n$s", level: LogLevel.Error, ); @@ -419,7 +419,7 @@ class NanswapAPI { rethrow; } } catch (e, s) { - Logging.instance.log( + Logging.instance.logd( "Nanswap.createOrder() exception: $e\n$s", level: LogLevel.Error, ); @@ -502,7 +502,7 @@ class NanswapAPI { rethrow; } } catch (e, s) { - Logging.instance.log( + Logging.instance.logd( "Nanswap.getOrder($id) exception: $e\n$s", level: LogLevel.Error, ); diff --git a/lib/services/exchange/simpleswap/simpleswap_api.dart b/lib/services/exchange/simpleswap/simpleswap_api.dart index 0653ff7c6..4573319e5 100644 --- a/lib/services/exchange/simpleswap/simpleswap_api.dart +++ b/lib/services/exchange/simpleswap/simpleswap_api.dart @@ -59,7 +59,7 @@ class SimpleSwapAPI { return parsed; } catch (e, s) { - Logging.instance.log( + Logging.instance.logd( "_makeRequest($uri) HTTP:$code threw: $e\n$s", level: LogLevel.Error, ); @@ -89,7 +89,7 @@ class SimpleSwapAPI { throw Exception("response: ${response.body}"); } catch (e, s) { Logging.instance - .log("_makeRequest($uri) threw: $e\n$s", level: LogLevel.Error); + .logd("_makeRequest($uri) threw: $e\n$s", level: LogLevel.Error); rethrow; } } @@ -149,7 +149,7 @@ class SimpleSwapAPI { ); return ExchangeResponse(value: trade, exception: null); } catch (e, s) { - Logging.instance.log( + Logging.instance.logd( "getAvailableCurrencies exception: $e\n$s", level: LogLevel.Error, ); @@ -177,7 +177,7 @@ class SimpleSwapAPI { return await compute(_parseAvailableCurrenciesJson, jsonArray as List); } catch (e, s) { - Logging.instance.log( + Logging.instance.logd( "getAvailableCurrencies exception: $e\n$s", level: LogLevel.Error, ); @@ -212,7 +212,7 @@ class SimpleSwapAPI { return ExchangeResponse(value: currencies); } catch (e, s) { - Logging.instance.log( + Logging.instance.logd( "_parseAvailableCurrenciesJson exception: $e\n$s", level: LogLevel.Error, ); @@ -247,7 +247,7 @@ class SimpleSwapAPI { ); } catch (e, s) { Logging.instance - .log("getCurrency exception: $e\n$s", level: LogLevel.Error); + .logd("getCurrency exception: $e\n$s", level: LogLevel.Error); return ExchangeResponse( exception: ExchangeException( e.toString(), @@ -280,7 +280,7 @@ class SimpleSwapAPI { return result; } catch (e, s) { Logging.instance - .log("getAllPairs exception: $e\n$s", level: LogLevel.Error); + .logd("getAllPairs exception: $e\n$s", level: LogLevel.Error); return ExchangeResponse( exception: ExchangeException( e.toString(), @@ -321,7 +321,7 @@ class SimpleSwapAPI { return ExchangeResponse(value: pairs); } catch (e, s) { - Logging.instance.log( + Logging.instance.logd( "_parseAvailableCurrenciesJson exception: $e\n$s", level: LogLevel.Error, ); @@ -359,7 +359,7 @@ class SimpleSwapAPI { return ExchangeResponse(value: jsonObject as String); } catch (e, s) { Logging.instance - .log("getEstimated exception: $e\n$s", level: LogLevel.Error); + .logd("getEstimated exception: $e\n$s", level: LogLevel.Error); return ExchangeResponse( exception: ExchangeException( e.toString(), @@ -416,7 +416,7 @@ class SimpleSwapAPI { return ExchangeResponse(value: trade); } catch (e, s) { Logging.instance - .log("getExchange exception: $e\n$s", level: LogLevel.Error); + .logd("getExchange exception: $e\n$s", level: LogLevel.Error); return ExchangeResponse( exception: ExchangeException( e.toString(), @@ -454,7 +454,8 @@ class SimpleSwapAPI { ), ); } catch (e, s) { - Logging.instance.log("getRange exception: $e\n$s", level: LogLevel.Error); + Logging.instance + .logd("getRange exception: $e\n$s", level: LogLevel.Error); return ExchangeResponse( exception: ExchangeException( e.toString(), @@ -488,7 +489,7 @@ class SimpleSwapAPI { ); return result; } catch (e, s) { - Logging.instance.log( + Logging.instance.logd( "getAvailableFixedRateMarkets exception: $e\n$s", level: LogLevel.Error, ); @@ -500,7 +501,7 @@ class SimpleSwapAPI { ); } } catch (e, s) { - Logging.instance.log( + Logging.instance.logd( "getAvailableFixedRateMarkets exception: $e\n$s", level: LogLevel.Error, ); diff --git a/lib/services/exchange/trocador/trocador_api.dart b/lib/services/exchange/trocador/trocador_api.dart index fa791d7d4..09eaeefe8 100644 --- a/lib/services/exchange/trocador/trocador_api.dart +++ b/lib/services/exchange/trocador/trocador_api.dart @@ -70,7 +70,7 @@ abstract class TrocadorAPI { return json; } catch (e, s) { - Logging.instance.log( + Logging.instance.logd( "_makeRequest($uri) HTTP:$code threw: $e\n$s", level: LogLevel.Error, ); @@ -106,7 +106,8 @@ abstract class TrocadorAPI { throw Exception("unexpected json: $json"); } } catch (e, s) { - Logging.instance.log("getCoins exception: $e\n$s", level: LogLevel.Error); + Logging.instance + .logd("getCoins exception: $e\n$s", level: LogLevel.Error); return ExchangeResponse( exception: ExchangeException( e.toString(), @@ -136,7 +137,8 @@ abstract class TrocadorAPI { return ExchangeResponse(value: TrocadorTrade.fromMap(map)); } catch (e, s) { - Logging.instance.log("getTrade exception: $e\n$s", level: LogLevel.Error); + Logging.instance + .logd("getTrade exception: $e\n$s", level: LogLevel.Error); return ExchangeResponse( exception: ExchangeException( e.toString(), @@ -211,7 +213,7 @@ abstract class TrocadorAPI { return ExchangeResponse(value: TrocadorRate.fromMap(map)); } catch (e, s) { Logging.instance - .log("getNewRate exception: $e\n$s", level: LogLevel.Error); + .logd("getNewRate exception: $e\n$s", level: LogLevel.Error); return ExchangeResponse( exception: ExchangeException( e.toString(), @@ -326,7 +328,7 @@ abstract class TrocadorAPI { "This trade couldn't be completed. Please select another provider."; } - Logging.instance.log( + Logging.instance.logd( "_getNewTrade failed to parse response: $json\n$e\n$s", level: LogLevel.Error, ); @@ -338,7 +340,7 @@ abstract class TrocadorAPI { ); } } catch (e, s) { - Logging.instance.log( + Logging.instance.logd( "_getNewTrade exception: $e\n$s", level: LogLevel.Error, ); diff --git a/lib/services/frost.dart b/lib/services/frost.dart index a3e2e030f..d0dc08d99 100644 --- a/lib/services/frost.dart +++ b/lib/services/frost.dart @@ -35,7 +35,7 @@ abstract class Frost { return participants; } catch (e, s) { - Logging.instance.log( + Logging.instance.logd( "getParticipants failed: $e\n$s", level: LogLevel.Fatal, ); @@ -48,7 +48,7 @@ abstract class Frost { decodeMultisigConfig(multisigConfig: encodedConfig); return true; } catch (e, s) { - Logging.instance.log( + Logging.instance.logd( "validateEncodedMultisigConfig failed: $e\n$s", level: LogLevel.Fatal, ); @@ -66,7 +66,7 @@ abstract class Frost { return threshold; } catch (e, s) { - Logging.instance.log( + Logging.instance.logd( "getThreshold failed: $e\n$s", level: LogLevel.Fatal, ); @@ -144,7 +144,7 @@ abstract class Frost { inputs: outputs, ); } catch (e, s) { - Logging.instance.log( + Logging.instance.logd( "extractDataFromSignConfig failed: $e\n$s", level: LogLevel.Fatal, ); @@ -168,7 +168,7 @@ abstract class Frost { return config; } catch (e, s) { - Logging.instance.log( + Logging.instance.logd( "createMultisigConfig failed: $e\n$s", level: LogLevel.Fatal, ); @@ -204,7 +204,7 @@ abstract class Frost { secretShareMachineWrapperPtr: machinePtr, ); } catch (e, s) { - Logging.instance.log( + Logging.instance.logd( "startKeyGeneration failed: $e\n$s", level: LogLevel.Fatal, ); @@ -234,7 +234,7 @@ abstract class Frost { return (share: share, secretSharesResPtr: secretSharesResPtr); } catch (e, s) { - Logging.instance.log( + Logging.instance.logd( "generateSecretShares failed: $e\n$s", level: LogLevel.Fatal, ); @@ -275,7 +275,7 @@ abstract class Frost { serializedKeys: serializedKeys, ); } catch (e, s) { - Logging.instance.log( + Logging.instance.logd( "completeKeyGeneration failed: $e\n$s", level: LogLevel.Fatal, ); @@ -322,7 +322,7 @@ abstract class Frost { return signConfig; } catch (e, s) { - Logging.instance.log( + Logging.instance.logd( "createSignConfig failed: $e\n$s", level: LogLevel.Fatal, ); @@ -352,7 +352,7 @@ abstract class Frost { machinePtr: attemptSignRes.ref.machine, ); } catch (e, s) { - Logging.instance.log( + Logging.instance.logd( "attemptSignConfig failed: $e\n$s", level: LogLevel.Fatal, ); @@ -378,7 +378,7 @@ abstract class Frost { machinePtr: continueSignRes.ref.machine, ); } catch (e, s) { - Logging.instance.log( + Logging.instance.logd( "continueSigning failed: $e\n$s", level: LogLevel.Fatal, ); @@ -398,7 +398,7 @@ abstract class Frost { return rawTransaction; } catch (e, s) { - Logging.instance.log( + Logging.instance.logd( "completeSigning failed: $e\n$s", level: LogLevel.Fatal, ); @@ -419,7 +419,7 @@ abstract class Frost { ); return configPtr; } catch (e, s) { - Logging.instance.log( + Logging.instance.logd( "decodedSignConfig failed: $e\n$s", level: LogLevel.Fatal, ); @@ -443,7 +443,7 @@ abstract class Frost { return config; } catch (e, s) { - Logging.instance.log( + Logging.instance.logd( "createResharerConfig failed: $e\n$s", level: LogLevel.Fatal, ); @@ -469,7 +469,7 @@ abstract class Frost { machine: result.machine, ); } catch (e, s) { - Logging.instance.log( + Logging.instance.logd( "beginResharer failed: $e\n$s", level: LogLevel.Fatal, ); @@ -498,7 +498,7 @@ abstract class Frost { prior: result.machine, ); } catch (e, s) { - Logging.instance.log( + Logging.instance.logd( "beginReshared failed: $e\n$s", level: LogLevel.Fatal, ); @@ -518,7 +518,7 @@ abstract class Frost { ); return result; } catch (e, s) { - Logging.instance.log( + Logging.instance.logd( "finishResharer failed: $e\n$s", level: LogLevel.Fatal, ); @@ -542,7 +542,7 @@ abstract class Frost { ); return result; } catch (e, s) { - Logging.instance.log( + Logging.instance.logd( "finishReshared failed: $e\n$s", level: LogLevel.Fatal, ); @@ -558,7 +558,7 @@ abstract class Frost { return config; } catch (e, s) { - Logging.instance.log( + Logging.instance.logd( "decodedResharerConfig failed: $e\n$s", level: LogLevel.Fatal, ); @@ -631,7 +631,7 @@ abstract class Frost { newParticipants: newParticipants, ); } catch (e, s) { - Logging.instance.log( + Logging.instance.logd( "extractResharerConfigData failed: $e\n$s", level: LogLevel.Fatal, ); diff --git a/lib/services/fusion_tor_service.dart b/lib/services/fusion_tor_service.dart index 0d5b29f59..d7bf5181b 100644 --- a/lib/services/fusion_tor_service.dart +++ b/lib/services/fusion_tor_service.dart @@ -1,8 +1,9 @@ import 'dart:io'; -import '../utilities/logger.dart'; import 'package:tor_ffi_plugin/tor_ffi_plugin.dart'; +import '../utilities/logger.dart'; + class FusionTorService { Tor? _tor; String? _torDataDirPath; @@ -61,7 +62,7 @@ class FusionTorService { try { await _tor!.start(torDataDirPath: _torDataDirPath!); } catch (e, s) { - Logging.instance.log( + Logging.instance.logd( "FusionTorService.start failed: $e\n$s", level: LogLevel.Warning, ); diff --git a/lib/services/monkey_service.dart b/lib/services/monkey_service.dart index f921135c1..1f326cf5a 100644 --- a/lib/services/monkey_service.dart +++ b/lib/services/monkey_service.dart @@ -1,10 +1,11 @@ import 'dart:typed_data'; import 'package:flutter_riverpod/flutter_riverpod.dart'; + import '../networking/http.dart'; -import 'tor_service.dart'; import '../utilities/logger.dart'; import '../utilities/prefs.dart'; +import 'tor_service.dart'; final pMonKeyService = Provider((ref) => MonKeyService()); @@ -38,7 +39,7 @@ class MonKeyService { ); } } catch (e, s) { - Logging.instance.log( + Logging.instance.logd( "Failed fetchMonKey($address): $e\n$s", level: LogLevel.Error, ); diff --git a/lib/services/node_service.dart b/lib/services/node_service.dart index 847602249..c32664839 100644 --- a/lib/services/node_service.dart +++ b/lib/services/node_service.dart @@ -293,7 +293,7 @@ class NodeService extends ChangeNotifier { final json = jsonDecode(response.body) as Map; final result = jsonDecode(json['result'] as String); final map = jsonDecode(result as String); - Logging.instance.log(map, level: LogLevel.Info); + Logging.instance.logd(map, level: LogLevel.Info); for (final coin in AppConfig.coins) { final nodeList = List>.from( @@ -331,7 +331,7 @@ class NodeService extends ChangeNotifier { } } catch (e, s) { Logging.instance - .log("updateCommunityNodes() failed: $e\n$s", level: LogLevel.Error); + .logd("updateCommunityNodes() failed: $e\n$s", level: LogLevel.Error); } } } diff --git a/lib/services/notifications_service.dart b/lib/services/notifications_service.dart index 065285257..181678f9e 100644 --- a/lib/services/notifications_service.dart +++ b/lib/services/notifications_service.dart @@ -106,7 +106,7 @@ class NotificationsService extends ChangeNotifier { _timer = Timer.periodic(notificationRefreshInterval, (_) { Logging.instance - .log("Periodic notifications update check", level: LogLevel.Info); + .logd("Periodic notifications update check", level: LogLevel.Info); if (prefs.externalCalls) { _checkTrades(); } @@ -222,7 +222,7 @@ class NotificationsService extends ChangeNotifier { } on NoSuchTransactionException catch (e, s) { await _deleteWatchedTxNotification(notification); } catch (e, s) { - Logging.instance.log("$e $s", level: LogLevel.Error); + Logging.instance.logd("$e $s", level: LogLevel.Error); } } } diff --git a/lib/services/price.dart b/lib/services/price.dart index c3e3e41f5..f8a5139f5 100644 --- a/lib/services/price.dart +++ b/lib/services/price.dart @@ -131,7 +131,7 @@ class PriceAPI { final externalCalls = Prefs.instance.externalCalls; if ((!Util.isTestEnv && !externalCalls) || !(await Prefs.instance.isExternalCallsSet())) { - Logging.instance.log( + Logging.instance.logd( "User does not want to use external calls", level: LogLevel.Info, ); @@ -172,7 +172,7 @@ class PriceAPI { return _cachedPrices; } catch (e, s) { - Logging.instance.log( + Logging.instance.logd( "getPricesAnd24hChange($baseCurrency): $e\n$s", level: LogLevel.Error, ); @@ -187,7 +187,7 @@ class PriceAPI { if ((!Util.isTestEnv && !externalCalls) || !(await Prefs.instance.isExternalCallsSet())) { - Logging.instance.log( + Logging.instance.logd( "User does not want to use external calls", level: LogLevel.Info, ); @@ -208,7 +208,7 @@ class PriceAPI { final json = jsonDecode(response.body) as List; return List.from(json); } catch (e, s) { - Logging.instance.log( + Logging.instance.logd( "availableBaseCurrencies() using $uriString: $e\n$s", level: LogLevel.Error, ); @@ -229,7 +229,7 @@ class PriceAPI { final externalCalls = Prefs.instance.externalCalls; if ((!Util.isTestEnv && !externalCalls) || !(await Prefs.instance.isExternalCallsSet())) { - Logging.instance.log( + Logging.instance.logd( "User does not want to use external calls", level: LogLevel.Info, ); @@ -273,7 +273,7 @@ class PriceAPI { return tokenPrices; } catch (e, s) { - Logging.instance.log( + Logging.instance.logd( "getPricesAnd24hChangeForEthTokens($baseCurrency,$contractAddresses): $e\n$s", level: LogLevel.Error, ); diff --git a/lib/services/tor_service.dart b/lib/services/tor_service.dart index 6904f8789..49ab83a0b 100644 --- a/lib/services/tor_service.dart +++ b/lib/services/tor_service.dart @@ -85,7 +85,7 @@ class TorService { // Complete the future. return; } catch (e, s) { - Logging.instance.log( + Logging.instance.logd( "TorService.start failed: $e\n$s", level: LogLevel.Warning, ); diff --git a/lib/services/wallets.dart b/lib/services/wallets.dart index 6defcf012..701f77d9b 100644 --- a/lib/services/wallets.dart +++ b/lib/services/wallets.dart @@ -72,7 +72,7 @@ class Wallets { SecureStorageInterface secureStorage, ) async { final walletId = info.walletId; - Logging.instance.log( + Logging.instance.logd( "deleteWallet called with walletId=$walletId", level: LogLevel.Warning, ); @@ -97,7 +97,7 @@ class Wallets { appRoot: await StackFileSystem.applicationRootDirectory(), ); Logging.instance - .log("monero wallet: $walletId deleted", level: LogLevel.Info); + .logd("monero wallet: $walletId deleted", level: LogLevel.Info); } else if (info.coin is Monero) { await lib_monero_compat.deleteWalletFiles( name: walletId, @@ -105,13 +105,13 @@ class Wallets { appRoot: await StackFileSystem.applicationRootDirectory(), ); Logging.instance - .log("monero wallet: $walletId deleted", level: LogLevel.Info); + .logd("monero wallet: $walletId deleted", level: LogLevel.Info); } else if (info.coin is Epiccash) { final deleteResult = await deleteEpicWallet( walletId: walletId, secureStore: secureStorage, ); - Logging.instance.log( + Logging.instance.logd( "epic wallet: $walletId deleted with result: $deleteResult", level: LogLevel.Info, ); @@ -210,7 +210,7 @@ class Wallets { for (final walletInfo in walletInfoList) { try { final isVerified = await walletInfo.isMnemonicVerified(mainDB.isar); - Logging.instance.log( + Logging.instance.logd( "LOADING WALLET: ${walletInfo.name}:${walletInfo.walletId} " "IS VERIFIED: $isVerified", level: LogLevel.Info, @@ -252,7 +252,7 @@ class Wallets { // await walletsService.deleteWallet(walletInfo.name, false); } } catch (e, s) { - Logging.instance.log("$e $s", level: LogLevel.Fatal); + Logging.instance.logd("$e $s", level: LogLevel.Fatal); continue; } } @@ -317,7 +317,7 @@ class Wallets { for (final walletInfo in walletInfoList) { try { final isVerified = await walletInfo.isMnemonicVerified(mainDB.isar); - Logging.instance.log( + Logging.instance.logd( "LOADING WALLET: ${walletInfo.name}:${walletInfo.walletId} " "IS VERIFIED: $isVerified", level: LogLevel.Info, @@ -355,7 +355,7 @@ class Wallets { deleteFutures.add(_deleteWallet(walletInfo.walletId)); } } catch (e, s) { - Logging.instance.log("$e $s", level: LogLevel.Fatal); + Logging.instance.logd("$e $s", level: LogLevel.Fatal); continue; } } @@ -447,7 +447,7 @@ class Wallets { for (final walletInfo in walletInfoList) { try { final isVerified = await walletInfo.isMnemonicVerified(mainDB.isar); - Logging.instance.log( + Logging.instance.logd( "LOADING WALLET: ${walletInfo.name}:${walletInfo.walletId} " "IS VERIFIED: $isVerified", level: LogLevel.Info, @@ -485,7 +485,7 @@ class Wallets { deleteFutures.add(_deleteWallet(walletInfo.walletId)); } } catch (e, s) { - Logging.instance.log("$e $s", level: LogLevel.Fatal); + Logging.instance.logd("$e $s", level: LogLevel.Fatal); continue; } } @@ -509,7 +509,7 @@ class Wallets { Future _refreshFutures(List idsToRefresh) async { final start = DateTime.now(); - Logging.instance.log( + Logging.instance.logd( "Initial refresh start: ${start.toUtc()}", level: LogLevel.Warning, ); @@ -526,7 +526,7 @@ class Wallets { } await Future.wait(futures); } - Logging.instance.log( + Logging.instance.logd( "Initial refresh duration: ${DateTime.now().difference(start)}", level: LogLevel.Warning, ); @@ -580,7 +580,7 @@ class Wallets { for (final wallet in wallets) { final isVerified = await wallet.info.isMnemonicVerified(mainDB.isar); - Logging.instance.log( + Logging.instance.logd( "LOADING WALLET: ${wallet.info.name}:${wallet.walletId} IS VERIFIED: $isVerified", level: LogLevel.Info, ); diff --git a/lib/services/wallets_service.dart b/lib/services/wallets_service.dart index 744b327d1..7d0e90c33 100644 --- a/lib/services/wallets_service.dart +++ b/lib/services/wallets_service.dart @@ -11,6 +11,7 @@ import 'dart:convert'; import 'package:flutter/material.dart'; + import '../app_config.dart'; import '../db/hive/db.dart'; import '../utilities/logger.dart'; @@ -74,7 +75,7 @@ class WalletsService extends ChangeNotifier { final names = DB.instance .get(boxName: DB.boxNameAllWalletsData, key: 'names') as Map?; if (names == null) { - Logging.instance.log( + Logging.instance.logd( "Fetched wallet 'names' returned null. Setting initializing 'names'", level: LogLevel.Info, ); @@ -85,7 +86,7 @@ class WalletsService extends ChangeNotifier { ); return {}; } - Logging.instance.log("Fetched wallet names: $names", level: LogLevel.Info); + Logging.instance.logd("Fetched wallet names: $names", level: LogLevel.Info); final mapped = Map.from(names); mapped.removeWhere((name, dyn) { final jsonObject = Map.from(dyn as Map); @@ -93,7 +94,7 @@ class WalletsService extends ChangeNotifier { AppConfig.getCryptoCurrencyFor(jsonObject["coin"] as String); return false; } catch (e, s) { - Logging.instance.log( + Logging.instance.logd( "Error, ${jsonObject["coin"]} does not exist", level: LogLevel.Error, ); diff --git a/lib/themes/theme_service.dart b/lib/themes/theme_service.dart index 19050029c..930280535 100644 --- a/lib/themes/theme_service.dart +++ b/lib/themes/theme_service.dart @@ -77,7 +77,7 @@ class ThemeService { if (file.isFile) { // TODO more sanitation? if (file.name.contains("..")) { - Logging.instance.log( + Logging.instance.logd( "Bad theme asset file path: ${file.name}", level: LogLevel.Error, ); @@ -110,7 +110,7 @@ class ThemeService { await dir.delete(recursive: true); } } else { - Logging.instance.log( + Logging.instance.logd( "Failed to delete theme $themeId", level: LogLevel.Warning, ); @@ -142,7 +142,7 @@ class ThemeService { } Future _updateDefaultTheme(String name) async { - Logging.instance.log( + Logging.instance.logd( "Updating default $name theme...", level: LogLevel.Info, ); @@ -150,7 +150,7 @@ class ThemeService { await ThemeService.instance.install( themeArchiveData: zip.buffer.asUint8List(), ); - Logging.instance.log( + Logging.instance.logd( "Updating default $name theme... finished", level: LogLevel.Info, ); @@ -174,7 +174,7 @@ class ThemeService { await Directory("${themesDir.path}/$themeId/assets").exists(); if (!jsonFileExists || !assetsDirExists) { - Logging.instance.log( + Logging.instance.logd( "Theme $themeId found in DB but is missing files", level: LogLevel.Warning, ); @@ -204,7 +204,7 @@ class ThemeService { return result; } catch (e, s) { - Logging.instance.log( + Logging.instance.logd( "Failed to fetch themes list: $e\n$s", level: LogLevel.Warning, ); @@ -236,7 +236,7 @@ class ThemeService { ); } } catch (e, s) { - Logging.instance.log( + Logging.instance.logd( "Failed to fetch themes list: $e\n$s", level: LogLevel.Warning, ); @@ -279,7 +279,7 @@ class StackThemeMetaData { previewImageUrl: map["previewImageUrl"] as String, ); } catch (e, s) { - Logging.instance.log( + Logging.instance.logd( "Failed to create instance of StackThemeMetaData using $map: \n$e\n$s", level: LogLevel.Fatal, ); diff --git a/lib/utilities/address_utils.dart b/lib/utilities/address_utils.dart index 06455fcec..d63dca66f 100644 --- a/lib/utilities/address_utils.dart +++ b/lib/utilities/address_utils.dart @@ -155,7 +155,7 @@ class AddressUtils { additionalParams: filteredParams, ); } catch (e, s) { - logging?.log("$e\n$s", level: LogLevel.Error); + logging?.logd("$e\n$s", level: LogLevel.Error); return null; } } diff --git a/lib/utilities/biometrics.dart b/lib/utilities/biometrics.dart index cf9d8c27d..6dbb05982 100644 --- a/lib/utilities/biometrics.dart +++ b/lib/utilities/biometrics.dart @@ -27,14 +27,14 @@ class Biometrics { required String title, }) async { if (!(Platform.isIOS || Platform.isAndroid)) { - Logging.instance.log( + Logging.instance.logd( "Tried to use Biometrics.authenticate() on a platform that is not Android or iOS! ...returning false.", level: LogLevel.Error, ); return false; } if (integrationTestFlag) { - Logging.instance.log( + Logging.instance.logd( "Tried to use Biometrics.authenticate() during integration testing. Returning false.", level: LogLevel.Warning, ); @@ -53,7 +53,7 @@ class Biometrics { List availableSystems = await localAuth.getAvailableBiometrics(); - Logging.instance.log( + Logging.instance.logd( "Bio availableSystems: $availableSystems", level: LogLevel.Info, ); @@ -79,7 +79,7 @@ class Biometrics { return true; } } catch (e) { - Logging.instance.log( + Logging.instance.logd( "local_auth exception caught in Biometrics.authenticate(), e: $e", level: LogLevel.Error, ); diff --git a/lib/utilities/connection_check/electrum_connection_check.dart b/lib/utilities/connection_check/electrum_connection_check.dart index ae8ba3f94..e90d7896c 100644 --- a/lib/utilities/connection_check/electrum_connection_check.dart +++ b/lib/utilities/connection_check/electrum_connection_check.dart @@ -27,7 +27,7 @@ Future checkElectrumServer({ // And the killswitch isn't set... if (!_prefs.torKillSwitch) { // Then we'll just proceed and connect to ElectrumX through clearnet at the bottom of this function. - Logging.instance.log( + Logging.instance.logd( "Tor preference set but Tor is not enabled, killswitch not set, connecting to Electrum adapter through clearnet", level: LogLevel.Warning, ); @@ -62,7 +62,7 @@ Future checkElectrumServer({ return true; } catch (e, s) { - Logging.instance.log("$e\n$s", level: LogLevel.Debug); + Logging.instance.logd("$e\n$s", level: LogLevel.Debug); return false; } } diff --git a/lib/utilities/desktop_password_service.dart b/lib/utilities/desktop_password_service.dart index 3852a8695..7197cced8 100644 --- a/lib/utilities/desktop_password_service.dart +++ b/lib/utilities/desktop_password_service.dart @@ -68,7 +68,7 @@ class DPS { await _put(key: _kKeyBlobKey, value: await _handler!.getKeyBlob()); await _updateStoredKeyBlobVersion(kLatestBlobVersion); } catch (e, s) { - Logging.instance.log( + Logging.instance.logd( "${_getMessageFromException(e)}\n$s", level: LogLevel.Error, ); @@ -104,7 +104,7 @@ class DPS { await _updateStoredKeyBlobVersion(kLatestBlobVersion); } } catch (e, s) { - Logging.instance.log( + Logging.instance.logd( "${_getMessageFromException(e)}\n$s", level: LogLevel.Error, ); @@ -125,7 +125,7 @@ class DPS { // existing passphrase matches key blob return true; } catch (e, s) { - Logging.instance.log( + Logging.instance.logd( "${_getMessageFromException(e)}\n$s", level: LogLevel.Warning, ); @@ -161,7 +161,7 @@ class DPS { // successfully updated passphrase return true; } catch (e, s) { - Logging.instance.log( + Logging.instance.logd( "${_getMessageFromException(e)}\n$s", level: LogLevel.Warning, ); @@ -189,7 +189,7 @@ class DPS { box = await DB.instance.hive.openBox(kBoxNameDesktopData); await box.put(key, value); } catch (e, s) { - Logging.instance.log( + Logging.instance.logd( "DPS failed put($key): $e\n$s", level: LogLevel.Fatal, ); @@ -205,7 +205,7 @@ class DPS { box = await DB.instance.hive.openBox(kBoxNameDesktopData); value = box.get(key); } catch (e, s) { - Logging.instance.log( + Logging.instance.logd( "DPS failed get($key): $e\n$s", level: LogLevel.Fatal, ); diff --git a/lib/utilities/extensions/impl/contract_abi.dart b/lib/utilities/extensions/impl/contract_abi.dart index b067c552e..401e8af04 100644 --- a/lib/utilities/extensions/impl/contract_abi.dart +++ b/lib/utilities/extensions/impl/contract_abi.dart @@ -68,7 +68,7 @@ extension ContractAbiExtensions on ContractAbi { return ContractAbi(name, functions, events); } catch (e, s) { - Logging.instance.log( + Logging.instance.logd( "Failed to parse ABI for $name: $e\n$s", level: LogLevel.Error, ); diff --git a/lib/utilities/git_status.dart b/lib/utilities/git_status.dart index 093bc39af..0f873df3f 100644 --- a/lib/utilities/git_status.dart +++ b/lib/utilities/git_status.dart @@ -138,7 +138,7 @@ abstract class GitStatus { String project, String commit, ) async { - Logging.instance.log("doesCommitExist", level: LogLevel.Info); + Logging.instance.logd("doesCommitExist", level: LogLevel.Info); final Client client = Client(); try { final uri = Uri.parse( @@ -151,7 +151,7 @@ abstract class GitStatus { ); final response = jsonDecode(commitQuery.body.toString()); - Logging.instance.log( + Logging.instance.logd( "doesCommitExist $project $commit $response", level: LogLevel.Info, ); @@ -159,13 +159,13 @@ abstract class GitStatus { try { isThereCommit = response['sha'] == commit; Logging.instance - .log("isThereCommit $isThereCommit", level: LogLevel.Info); + .logd("isThereCommit $isThereCommit", level: LogLevel.Info); return isThereCommit; } catch (e, s) { return false; } } catch (e, s) { - Logging.instance.log("$e $s", level: LogLevel.Error); + Logging.instance.logd("$e $s", level: LogLevel.Error); return false; } } @@ -176,7 +176,7 @@ abstract class GitStatus { String branch, String commit, ) async { - Logging.instance.log("doesCommitExist", level: LogLevel.Info); + Logging.instance.logd("doesCommitExist", level: LogLevel.Info); final Client client = Client(); try { final uri = Uri.parse( @@ -189,20 +189,20 @@ abstract class GitStatus { ); final response = jsonDecode(commitQuery.body.toString()); - Logging.instance.log( + Logging.instance.logd( "isHeadCommit $project $commit $branch $response", level: LogLevel.Info, ); bool isHead; try { isHead = response['sha'] == commit; - Logging.instance.log("isHead $isHead", level: LogLevel.Info); + Logging.instance.logd("isHead $isHead", level: LogLevel.Info); return isHead; } catch (e, s) { return false; } } catch (e, s) { - Logging.instance.log("$e $s", level: LogLevel.Error); + Logging.instance.logd("$e $s", level: LogLevel.Error); return false; } } diff --git a/lib/utilities/logger.dart b/lib/utilities/logger.dart index 0306f21aa..7243de77a 100644 --- a/lib/utilities/logger.dart +++ b/lib/utilities/logger.dart @@ -144,19 +144,19 @@ class Logging { ? message.toString() : JsonEncoder.withIndent(' ', (o) => o.toString()).convert(message); - @core.Deprecated("Use Logging.instance.lg instead") - void log( + @core.Deprecated("Use Logging.instance.log instead") + void logd( core.Object? object, { required LogLevel level, core.bool printToConsole = true, core.bool printFullLength = false, }) => - lg( + log( level.getLoggerLevel(), object, ); - void lg( + void log( Level level, dynamic message, { DateTime? time, @@ -191,7 +191,7 @@ class Logging { Object? error, StackTrace? stackTrace, }) => - lg( + log( Level.trace, message, time: time, @@ -205,7 +205,7 @@ class Logging { Object? error, StackTrace? stackTrace, }) => - lg( + log( Level.debug, message, time: time, @@ -219,7 +219,7 @@ class Logging { Object? error, StackTrace? stackTrace, }) => - lg( + log( Level.info, message, time: time, @@ -233,7 +233,7 @@ class Logging { Object? error, StackTrace? stackTrace, }) => - lg( + log( Level.warning, message, time: time, @@ -247,7 +247,7 @@ class Logging { Object? error, StackTrace? stackTrace, }) => - lg( + log( Level.error, message, time: time, @@ -261,7 +261,7 @@ class Logging { Object? error, StackTrace? stackTrace, }) => - lg( + log( Level.fatal, message, time: time, diff --git a/lib/utilities/show_loading.dart b/lib/utilities/show_loading.dart index 371d67d1d..7f97ca851 100644 --- a/lib/utilities/show_loading.dart +++ b/lib/utilities/show_loading.dart @@ -71,7 +71,7 @@ Future showLoading({ result = await whileFuture; } } catch (e, s) { - Logging.instance.log( + Logging.instance.logd( "showLoading caught: $e\n$s", level: LogLevel.Warning, ); diff --git a/lib/utilities/test_epic_box_connection.dart b/lib/utilities/test_epic_box_connection.dart index 7fff18369..8e98e4ccf 100644 --- a/lib/utilities/test_epic_box_connection.dart +++ b/lib/utilities/test_epic_box_connection.dart @@ -41,7 +41,7 @@ Future _testEpicBoxNodeConnection(Uri uri) async { return false; } } catch (e, s) { - Logging.instance.log("$e\n$s", level: LogLevel.Warning); + Logging.instance.logd("$e\n$s", level: LogLevel.Warning); return false; } } @@ -87,7 +87,7 @@ Future testEpicNodeConnection(NodeFormData data) async { return null; } } catch (e, s) { - Logging.instance.log("$e\n$s", level: LogLevel.Warning); + Logging.instance.logd("$e\n$s", level: LogLevel.Warning); return null; } } diff --git a/lib/utilities/test_monero_node_connection.dart b/lib/utilities/test_monero_node_connection.dart index 8901d4d2e..0abfff5ae 100644 --- a/lib/utilities/test_monero_node_connection.dart +++ b/lib/utilities/test_monero_node_connection.dart @@ -11,10 +11,10 @@ import 'dart:convert'; import 'dart:io'; +import 'package:digest_auth/digest_auth.dart'; import 'package:flutter/material.dart'; import 'package:http/io_client.dart'; import 'package:monero_rpc/monero_rpc.dart'; -import 'package:digest_auth/digest_auth.dart'; import 'package:socks5_proxy/socks.dart'; import 'package:tor_ffi_plugin/socks_socket.dart'; @@ -103,7 +103,7 @@ Future testMoneroNodeConnection( return MoneroNodeConnectionResponse(null, null, null, success); } catch (e, s) { - Logging.instance.log("$e\n$s", level: LogLevel.Warning); + Logging.instance.logd("$e\n$s", level: LogLevel.Warning); return MoneroNodeConnectionResponse(null, null, null, false); } finally { await socket?.close(); @@ -150,7 +150,7 @@ Future testMoneroNodeConnection( if (badCertResponse != null) { return badCertResponse!; } else { - Logging.instance.log("$e\n$s", level: LogLevel.Warning); + Logging.instance.logd("$e\n$s", level: LogLevel.Warning); return MoneroNodeConnectionResponse(null, null, null, false); } } finally { diff --git a/lib/utilities/test_node_connection.dart b/lib/utilities/test_node_connection.dart index 9169cb636..f3e1a9618 100644 --- a/lib/utilities/test_node_connection.dart +++ b/lib/utilities/test_node_connection.dart @@ -100,7 +100,7 @@ Future testNodeConnection({ if (ref.read(prefsChangeNotifierProvider).useTor) { if (formData.netOption! == TorPlainNetworkOption.clear) { - Logging.instance.log( + Logging.instance.logd( "This node is configured for non-TOR only but TOR is enabled", level: LogLevel.Warning, ); @@ -108,7 +108,7 @@ Future testNodeConnection({ } } else { if (formData.netOption! == TorPlainNetworkOption.tor) { - Logging.instance.log( + Logging.instance.logd( "This node is configured for TOR only but TOR is disabled", level: LogLevel.Warning, ); @@ -128,7 +128,7 @@ Future testNodeConnection({ onSuccess?.call(data); } } catch (e, s) { - Logging.instance.log("$e\n$s", level: LogLevel.Warning); + Logging.instance.logd("$e\n$s", level: LogLevel.Warning); } break; @@ -175,7 +175,7 @@ Future testNodeConnection({ } } } catch (e, s) { - Logging.instance.log("$e\n$s", level: LogLevel.Warning); + Logging.instance.logd("$e\n$s", level: LogLevel.Warning); } break; @@ -251,7 +251,7 @@ Future testNodeConnection({ ); final health = await rpcClient.getHealth(); - Logging.instance.log( + Logging.instance.logd( "Solana testNodeConnection \"health=$health\"", level: LogLevel.Info, ); @@ -283,7 +283,7 @@ Future testNodeConnection({ BlockfrostRequestBackendHealthStatus(), ); - Logging.instance.log( + Logging.instance.logd( "Cardano testNodeConnection \"health=$health\"", level: LogLevel.Info, ); diff --git a/lib/wallets/api/lelantus_ffi_wrapper.dart b/lib/wallets/api/lelantus_ffi_wrapper.dart index 44e446507..5bb9dab11 100644 --- a/lib/wallets/api/lelantus_ffi_wrapper.dart +++ b/lib/wallets/api/lelantus_ffi_wrapper.dart @@ -48,7 +48,7 @@ abstract final class LelantusFfiWrapper { try { return await compute(_restore, args); } catch (e, s) { - Logging.instance.log( + Logging.instance.logd( "Exception rethrown from _restore(): $e\n$s", level: LogLevel.Info, ); diff --git a/lib/wallets/api/tezos/tezos_api.dart b/lib/wallets/api/tezos/tezos_api.dart index b52c2228f..8e81f6451 100644 --- a/lib/wallets/api/tezos/tezos_api.dart +++ b/lib/wallets/api/tezos/tezos_api.dart @@ -25,7 +25,7 @@ abstract final class TezosAPI { final result = jsonDecode(response.body); return result as int; } catch (e, s) { - Logging.instance.log( + Logging.instance.logd( "Error occurred in TezosAPI while getting counter for $address: $e\n$s", level: LogLevel.Error, ); @@ -53,7 +53,7 @@ abstract final class TezosAPI { return account; } catch (e, s) { - Logging.instance.log( + Logging.instance.logd( "Error occurred in TezosAPI while getting account for $address: $e\n$s", level: LogLevel.Error, ); @@ -109,7 +109,7 @@ abstract final class TezosAPI { } return txs; } catch (e, s) { - Logging.instance.log( + Logging.instance.logd( "Error occurred in TezosAPI while getting transactions for $address: $e\n$s", level: LogLevel.Error, ); diff --git a/lib/wallets/api/tezos/tezos_rpc_api.dart b/lib/wallets/api/tezos/tezos_rpc_api.dart index 1497a46c0..a5da3b01e 100644 --- a/lib/wallets/api/tezos/tezos_rpc_api.dart +++ b/lib/wallets/api/tezos/tezos_rpc_api.dart @@ -28,7 +28,7 @@ abstract final class TezosRpcAPI { BigInt.parse(response.body.substring(1, response.body.length - 2)); return balance; } catch (e) { - Logging.instance.log( + Logging.instance.logd( "Error occurred in tezos_rpc_api.dart while getting balance for $address: $e", level: LogLevel.Error, ); @@ -54,7 +54,7 @@ abstract final class TezosRpcAPI { final jsonParsedResponse = jsonDecode(response.body); return int.parse(jsonParsedResponse["level"].toString()); } catch (e) { - Logging.instance.log( + Logging.instance.logd( "Error occurred in tezos_rpc_api.dart while getting chain height for tezos: $e", level: LogLevel.Error, ); diff --git a/lib/wallets/wallet/impl/bitcoin_frost_wallet.dart b/lib/wallets/wallet/impl/bitcoin_frost_wallet.dart index c1701d8b7..5400ba457 100644 --- a/lib/wallets/wallet/impl/bitcoin_frost_wallet.dart +++ b/lib/wallets/wallet/impl/bitcoin_frost_wallet.dart @@ -56,7 +56,7 @@ class BitcoinFrostWallet extends Wallet required List participants, required int threshold, }) async { - Logging.instance.log( + Logging.instance.logd( "Generating new FROST wallet.", level: LogLevel.Info, ); @@ -108,7 +108,7 @@ class BitcoinFrostWallet extends Wallet await mainDB.putAddresses([address]); } catch (e, s) { - Logging.instance.log( + Logging.instance.logd( "Exception rethrown from initializeNewFrost(): $e\n$s", level: LogLevel.Fatal, ); @@ -626,7 +626,7 @@ class BitcoinFrostWallet extends Wallet // TODO: [prio=none] Check for special Bitcoin outputs like ordinals. } else { - Logging.instance.log( + Logging.instance.logd( "Unexpected tx found (ignoring it): $txData", level: LogLevel.Error, ); @@ -686,7 +686,7 @@ class BitcoinFrostWallet extends Wallet "index < kFrostSecureStartingIndex hit someSaneMaximum"); } } else { - Logging.instance.log( + Logging.instance.logd( "$runtimeType.checkSaveInitialReceivingAddress() failed due" " to missing serialized keys", level: LogLevel.Fatal, @@ -698,12 +698,13 @@ class BitcoinFrostWallet extends Wallet @override Future confirmSend({required TxData txData}) async { try { - Logging.instance.log("confirmSend txData: $txData", level: LogLevel.Info); + Logging.instance + .logd("confirmSend txData: $txData", level: LogLevel.Info); final hex = txData.raw!; final txHash = await electrumXClient.broadcastTransaction(rawTx: hex); - Logging.instance.log("Sent txHash: $txHash", level: LogLevel.Info); + Logging.instance.logd("Sent txHash: $txHash", level: LogLevel.Info); // mark utxos as used final usedUTXOs = txData.utxos!.map((e) => e.copyWith(used: true)); @@ -717,7 +718,7 @@ class BitcoinFrostWallet extends Wallet return txData; } catch (e, s) { - Logging.instance.log( + Logging.instance.logd( "Exception rethrown from confirmSend(): $e\n$s", level: LogLevel.Error, ); @@ -803,11 +804,11 @@ class BitcoinFrostWallet extends Wallet ).raw.toInt(), ); - Logging.instance.log("fetched fees: $feeObject", level: LogLevel.Info); + Logging.instance.logd("fetched fees: $feeObject", level: LogLevel.Info); return feeObject; } catch (e) { - Logging.instance - .log("Exception rethrown from _getFees(): $e", level: LogLevel.Error); + Logging.instance.logd("Exception rethrown from _getFees(): $e", + level: LogLevel.Error); rethrow; } } @@ -830,7 +831,7 @@ class BitcoinFrostWallet extends Wallet } if (serializedKeys == null || multisigConfig == null) { final err = "${info.coinName} wallet ${info.walletId} had null keys/cfg"; - Logging.instance.log(err, level: LogLevel.Fatal); + Logging.instance.logd(err, level: LogLevel.Fatal); throw Exception(err); // TODO [prio=low]: handle null keys or config. This should not happen. } @@ -957,7 +958,7 @@ class BitcoinFrostWallet extends Wallet unawaited(refresh()); } catch (e, s) { - Logging.instance.log( + Logging.instance.logd( "recoverFromSerializedKeys failed: $e\n$s", level: LogLevel.Fatal, ); @@ -1164,7 +1165,7 @@ class BitcoinFrostWallet extends Wallet return await mainDB.updateUTXOs(walletId, outputArray); } catch (e, s) { - Logging.instance.log( + Logging.instance.logd( "Output fetch unsuccessful: $e\n$s", level: LogLevel.Error, ); @@ -1381,7 +1382,7 @@ class BitcoinFrostWallet extends Wallet if (e.toString().contains("initialized")) { // Ignore. This should happen every first time the wallet is opened. } else { - Logging.instance.log( + Logging.instance.logd( "Error closing electrumXClient: $e", level: LogLevel.Error, ); @@ -1478,7 +1479,7 @@ class BitcoinFrostWallet extends Wallet await checkChangeAddressForTransactions(); } } catch (e, s) { - Logging.instance.log( + Logging.instance.logd( "Exception rethrown from _checkChangeAddressForTransactions" "($cryptoCurrency): $e\n$s", level: LogLevel.Error, @@ -1493,7 +1494,7 @@ class BitcoinFrostWallet extends Wallet try { throw Exception(); } catch (_, s) { - Logging.instance.log( + Logging.instance.logd( "checkReceivingAddressForTransactions called but reuse address flag set: $s", level: LogLevel.Error, ); @@ -1525,7 +1526,7 @@ class BitcoinFrostWallet extends Wallet } } } catch (e, s) { - Logging.instance.log( + Logging.instance.logd( "Exception rethrown from _checkReceivingAddressForTransactions" "($cryptoCurrency): $e\n$s", level: LogLevel.Error, @@ -1748,7 +1749,7 @@ class BitcoinFrostWallet extends Wallet int gapCounter = 0; int index = secure ? kFrostSecureStartingIndex : 0; for (; gapCounter < 20; index++) { - Logging.instance.log( + Logging.instance.logd( "Frost index: $index, \t GapCounter chain=$chain: $gapCounter", level: LogLevel.Info, ); @@ -1843,7 +1844,7 @@ class BitcoinFrostWallet extends Wallet return allTxHashes; } catch (e, s) { - Logging.instance.log( + Logging.instance.logd( "$runtimeType._fetchHistory: $e\n$s", level: LogLevel.Error, ); diff --git a/lib/wallets/wallet/impl/bitcoincash_wallet.dart b/lib/wallets/wallet/impl/bitcoincash_wallet.dart index 3c8fb58bc..a8bcc599d 100644 --- a/lib/wallets/wallet/impl/bitcoincash_wallet.dart +++ b/lib/wallets/wallet/impl/bitcoincash_wallet.dart @@ -198,7 +198,7 @@ class BitcoincashWallet valueStringSats = prevOut.valueStringSats; addresses.addAll(prevOut.addresses); } catch (e, s) { - Logging.instance.log( + Logging.instance.logd( "Error getting prevOutJson: $e\nStack trace: $s", level: LogLevel.Warning, ); @@ -293,7 +293,7 @@ class BitcoincashWallet // only found outputs owned by this wallet type = TransactionType.incoming; } else { - Logging.instance.log( + Logging.instance.logd( "Unexpected tx found (ignoring it): $txData", level: LogLevel.Error, ); @@ -345,7 +345,7 @@ class BitcoincashWallet } } catch (e, s) { // Probably doesn't contain a cash token so just log failure - Logging.instance.log( + Logging.instance.logd( "Script pub key \"$scriptPubKeyHex\" cash token" " parsing check failed: $e\n$s", level: LogLevel.Warning, diff --git a/lib/wallets/wallet/impl/cardano_wallet.dart b/lib/wallets/wallet/impl/cardano_wallet.dart index 2b9a8b9bb..3a555c2d3 100644 --- a/lib/wallets/wallet/impl/cardano_wallet.dart +++ b/lib/wallets/wallet/impl/cardano_wallet.dart @@ -76,7 +76,7 @@ class CardanoWallet extends Bip39Wallet { await mainDB.updateOrPutAddresses([address]); } } catch (e, s) { - Logging.instance.log( + Logging.instance.logd( "$runtimeType checkSaveInitialReceivingAddress() failed: $e\n$s", level: LogLevel.Error, ); @@ -94,7 +94,7 @@ class CardanoWallet extends Bip39Wallet { return Future.value(health); } catch (e, s) { - Logging.instance.log( + Logging.instance.logd( "Error ping checking in cardano_wallet.dart: $e\n$s", level: LogLevel.Error, ); @@ -146,7 +146,7 @@ class CardanoWallet extends Bip39Wallet { slow: fee, ); } catch (e, s) { - Logging.instance.log( + Logging.instance.logd( "Error getting fees in cardano_wallet.dart: $e\n$s", level: LogLevel.Error, ); @@ -264,7 +264,7 @@ class CardanoWallet extends Bip39Wallet { ); } } catch (e, s) { - Logging.instance.log( + Logging.instance.logd( "$runtimeType Cardano prepareSend failed: $e\n$s", level: LogLevel.Error, ); @@ -355,7 +355,7 @@ class CardanoWallet extends Bip39Wallet { txid: sentTx, ); } catch (e, s) { - Logging.instance.log( + Logging.instance.logd( "$runtimeType Cardano confirmSend failed: $e\n$s", level: LogLevel.Error, ); @@ -425,7 +425,7 @@ class CardanoWallet extends Bip39Wallet { await info.updateBalance(newBalance: balance, isar: mainDB.isar); } catch (e, s) { - Logging.instance.log( + Logging.instance.logd( "Error getting balance in cardano_wallet.dart: $e\n$s", level: LogLevel.Error, ); @@ -446,7 +446,7 @@ class CardanoWallet extends Bip39Wallet { isar: mainDB.isar, ); } catch (e, s) { - Logging.instance.log( + Logging.instance.logd( "Error updating transactions in cardano_wallet.dart: $e\n$s", level: LogLevel.Error, ); @@ -581,7 +581,7 @@ class CardanoWallet extends Bip39Wallet { } on NodeTorMismatchConfigException { rethrow; } catch (e, s) { - Logging.instance.log( + Logging.instance.logd( "Error updating transactions in cardano_wallet.dart: $e\n$s", level: LogLevel.Error, ); diff --git a/lib/wallets/wallet/impl/dash_wallet.dart b/lib/wallets/wallet/impl/dash_wallet.dart index bf1e91b9a..559581256 100644 --- a/lib/wallets/wallet/impl/dash_wallet.dart +++ b/lib/wallets/wallet/impl/dash_wallet.dart @@ -234,7 +234,7 @@ class DashWallet extends Bip39HDWallet // Only found outputs owned by this wallet. type = TransactionType.incoming; } else { - Logging.instance.log( + Logging.instance.logd( "Unexpected tx found (ignoring it): $txData", level: LogLevel.Error, ); diff --git a/lib/wallets/wallet/impl/dogecoin_wallet.dart b/lib/wallets/wallet/impl/dogecoin_wallet.dart index 8d2d2f029..52946f170 100644 --- a/lib/wallets/wallet/impl/dogecoin_wallet.dart +++ b/lib/wallets/wallet/impl/dogecoin_wallet.dart @@ -237,7 +237,7 @@ class DogecoinWallet // Only found outputs owned by this wallet. type = TransactionType.incoming; } else { - Logging.instance.log( + Logging.instance.logd( "Unexpected tx found (ignoring it): $txData", level: LogLevel.Error, ); diff --git a/lib/wallets/wallet/impl/ecash_wallet.dart b/lib/wallets/wallet/impl/ecash_wallet.dart index 968ea72cc..27ec2e8bd 100644 --- a/lib/wallets/wallet/impl/ecash_wallet.dart +++ b/lib/wallets/wallet/impl/ecash_wallet.dart @@ -276,7 +276,7 @@ class EcashWallet extends Bip39HDWallet // only found outputs owned by this wallet type = TransactionType.incoming; } else { - Logging.instance.log( + Logging.instance.logd( "Unexpected tx found (ignoring it): $txData", level: LogLevel.Error, ); @@ -332,7 +332,7 @@ class EcashWallet extends Bip39HDWallet } } catch (e, s) { // Probably doesn't contain a cash token so just log failure - Logging.instance.log( + Logging.instance.logd( "Script pub key \"$scriptPubKeyHex\" cash token" " parsing check failed: $e\n$s", level: LogLevel.Warning, diff --git a/lib/wallets/wallet/impl/epiccash_wallet.dart b/lib/wallets/wallet/impl/epiccash_wallet.dart index 7533925c8..11b4973bb 100644 --- a/lib/wallets/wallet/impl/epiccash_wallet.dart +++ b/lib/wallets/wallet/impl/epiccash_wallet.dart @@ -93,13 +93,13 @@ class EpiccashWallet extends Bip39Wallet { wallet: wallet, transactionId: txSlateId, ); - Logging.instance.log( + Logging.instance.logd( "cancel $txSlateId result: $result", level: LogLevel.Info, ); return result; } catch (e, s) { - Logging.instance.log("$e, $s", level: LogLevel.Error); + Logging.instance.logd("$e, $s", level: LogLevel.Error); return e.toString(); } } @@ -196,14 +196,15 @@ class EpiccashWallet extends Bip39Wallet { } return realFee; } catch (e, s) { - Logging.instance.log("Error getting fees $e - $s", level: LogLevel.Error); + Logging.instance + .logd("Error getting fees $e - $s", level: LogLevel.Error); rethrow; } } Future _startSync() async { _hackedCheckTorNodePrefs(); - Logging.instance.log("request start sync", level: LogLevel.Info); + Logging.instance.logd("request start sync", level: LogLevel.Info); final wallet = await secureStorageInterface.read(key: '${walletId}_wallet'); const int refreshFromNode = 1; if (!syncMutex.isLocked) { @@ -216,7 +217,7 @@ class EpiccashWallet extends Bip39Wallet { ); }); } else { - Logging.instance.log("request start sync denied", level: LogLevel.Info); + Logging.instance.logd("request start sync denied", level: LogLevel.Info); } } @@ -257,7 +258,7 @@ class EpiccashWallet extends Bip39Wallet { return response is String && response.contains("Challenge"); } catch (_) { - Logging.instance.log( + Logging.instance.logd( "_testEpicBoxConnection failed on \"$host:$port\"", level: LogLevel.Info, ); @@ -289,7 +290,7 @@ class EpiccashWallet extends Bip39Wallet { return true; } catch (e, s) { Logging.instance - .log("ERROR STORING ADDRESS $e $s", level: LogLevel.Error); + .logd("ERROR STORING ADDRESS $e $s", level: LogLevel.Error); return false; } } @@ -301,7 +302,7 @@ class EpiccashWallet extends Bip39Wallet { // of the last one that has not been processed, or the index after the one most recently processed; return receivingIndex; } catch (e, s) { - Logging.instance.log("$e $s", level: LogLevel.Error); + Logging.instance.logd("$e $s", level: LogLevel.Error); return 0; } } @@ -340,7 +341,7 @@ class EpiccashWallet extends Bip39Wallet { epicboxConfig: epicboxConfig.toString(), ); - Logging.instance.log( + Logging.instance.logd( "WALLET_ADDRESS_IS $walletAddress", level: LogLevel.Info, ); @@ -378,7 +379,7 @@ class EpiccashWallet extends Bip39Wallet { // loop while scanning in chain in chunks (of blocks?) while (lastScannedBlock < chainHeight) { - Logging.instance.log( + Logging.instance.logd( "chainHeight: $chainHeight, lastScannedBlock: $lastScannedBlock", level: LogLevel.Info, ); @@ -405,14 +406,14 @@ class EpiccashWallet extends Bip39Wallet { lastScannedBlock = nextScannedBlock; } - Logging.instance.log( + Logging.instance.logd( "_startScans successfully at the tip", level: LogLevel.Info, ); //Once scanner completes restart listener await _listenToEpicbox(); } catch (e, s) { - Logging.instance.log( + Logging.instance.logd( "_startScans failed: $e\n$s", level: LogLevel.Error, ); @@ -421,7 +422,8 @@ class EpiccashWallet extends Bip39Wallet { } Future _listenToEpicbox() async { - Logging.instance.log("STARTING WALLET LISTENER ....", level: LogLevel.Info); + Logging.instance + .logd("STARTING WALLET LISTENER ....", level: LogLevel.Info); final wallet = await secureStorageInterface.read(key: '${walletId}_wallet'); final EpicBoxConfigModel epicboxConfig = await getEpicBoxConfig(); epiccash.LibEpiccash.startEpicboxListener( @@ -548,7 +550,7 @@ class EpiccashWallet extends Bip39Wallet { ); } else { try { - Logging.instance.log( + Logging.instance.logd( "initializeExisting() ${cryptoCurrency.prettyName} wallet", level: LogLevel.Info, ); @@ -569,7 +571,7 @@ class EpiccashWallet extends Bip39Wallet { await updateNode(); } catch (e, s) { // do nothing, still allow user into wallet - Logging.instance.log( + Logging.instance.logd( "$runtimeType init() failed: $e\n$s", level: LogLevel.Error, ); @@ -635,7 +637,7 @@ class EpiccashWallet extends Bip39Wallet { txid: transaction.slateId, ); } catch (e, s) { - Logging.instance.log( + Logging.instance.logd( "Epic cash confirmSend: $e\n$s", level: LogLevel.Error, ); @@ -680,7 +682,7 @@ class EpiccashWallet extends Bip39Wallet { ); } catch (e, s) { Logging.instance - .log("Epic cash prepareSend: $e\n$s", level: LogLevel.Error); + .logd("Epic cash prepareSend: $e\n$s", level: LogLevel.Error); rethrow; } } @@ -762,7 +764,7 @@ class EpiccashWallet extends Bip39Wallet { unawaited(refresh(doScan: false)); }); } catch (e, s) { - Logging.instance.log( + Logging.instance.logd( "Exception rethrown from electrumx_mixin recover(): $e\n$s", level: LogLevel.Info, ); @@ -880,7 +882,7 @@ class EpiccashWallet extends Bip39Wallet { cryptoCurrency, ), ); - Logging.instance.log( + Logging.instance.logd( "Caught exception in refreshWalletData(): $error\n$strace", level: LogLevel.Error, ); @@ -918,7 +920,7 @@ class EpiccashWallet extends Bip39Wallet { isar: mainDB.isar, ); } catch (e, s) { - Logging.instance.log( + Logging.instance.logd( "Epic cash wallet failed to update balance: $e\n$s", level: LogLevel.Warning, ); @@ -1058,7 +1060,7 @@ class EpiccashWallet extends Bip39Wallet { await mainDB.isar.transactionV2s.putAll(txns); }); } catch (e, s) { - Logging.instance.log( + Logging.instance.logd( "${cryptoCurrency.runtimeType} ${cryptoCurrency.network} net wallet" " \"${info.name}\"_${info.walletId} updateTransactions() failed: $e\n$s", level: LogLevel.Warning, @@ -1105,7 +1107,7 @@ class EpiccashWallet extends Bip39Wallet { ) != null; } catch (e, s) { - Logging.instance.log("$e\n$s", level: LogLevel.Info); + Logging.instance.logd("$e\n$s", level: LogLevel.Info); return false; } } @@ -1162,7 +1164,8 @@ class EpiccashWallet extends Bip39Wallet { timer?.cancel(); timer = null; await super.exit(); - Logging.instance.log("EpicCash_wallet exit finished", level: LogLevel.Info); + Logging.instance + .logd("EpicCash_wallet exit finished", level: LogLevel.Info); } void _hackedCheckTorNodePrefs() { @@ -1216,7 +1219,7 @@ Future deleteEpicWallet({ config: config!, ); } catch (e, s) { - Logging.instance.log("$e\n$s", level: LogLevel.Error); + Logging.instance.logd("$e\n$s", level: LogLevel.Error); return "deleteEpicWallet($walletId) failed..."; } } diff --git a/lib/wallets/wallet/impl/ethereum_wallet.dart b/lib/wallets/wallet/impl/ethereum_wallet.dart index beb377229..6551f8eda 100644 --- a/lib/wallets/wallet/impl/ethereum_wallet.dart +++ b/lib/wallets/wallet/impl/ethereum_wallet.dart @@ -240,7 +240,7 @@ class EthereumWallet extends Bip39Wallet with PrivateKeyInterface { isar: mainDB.isar, ); } catch (e, s) { - Logging.instance.log( + Logging.instance.logd( "$runtimeType wallet failed to update balance: $e\n$s", level: LogLevel.Warning, ); @@ -258,7 +258,7 @@ class EthereumWallet extends Bip39Wallet with PrivateKeyInterface { isar: mainDB.isar, ); } catch (e, s) { - Logging.instance.log( + Logging.instance.logd( "$runtimeType Exception caught in chainHeight: $e\n$s", level: LogLevel.Warning, ); @@ -297,7 +297,7 @@ class EthereumWallet extends Bip39Wallet with PrivateKeyInterface { ); if (response.value == null) { - Logging.instance.log( + Logging.instance.logd( "Failed to refresh transactions for ${cryptoCurrency.prettyName} ${info.name} " "$walletId: ${response.exception}", level: LogLevel.Warning, @@ -407,7 +407,7 @@ class EthereumWallet extends Bip39Wallet with PrivateKeyInterface { } await mainDB.updateOrPutTransactionV2s(txns); } else { - Logging.instance.log( + Logging.instance.logd( "Failed to refresh transactions with nonces for ${cryptoCurrency.prettyName} " "${info.name} $walletId: ${txsResponse.exception}", level: LogLevel.Warning, diff --git a/lib/wallets/wallet/impl/firo_wallet.dart b/lib/wallets/wallet/impl/firo_wallet.dart index d149a7a9e..055127c50 100644 --- a/lib/wallets/wallet/impl/firo_wallet.dart +++ b/lib/wallets/wallet/impl/firo_wallet.dart @@ -60,7 +60,7 @@ class FiroWallet extends Bip39HDWallet if (txData.tempTx != null) { await mainDB.updateOrPutTransactionV2s([txData.tempTx!]); _unconfirmedTxids.add(txData.tempTx!.txid); - Logging.instance.log( + Logging.instance.logd( "Added firo unconfirmed: ${txData.tempTx!.txid}", level: LogLevel.Info, ); @@ -221,7 +221,7 @@ class FiroWallet extends Bip39HDWallet ); if (isMySpark && sparkCoinsInvolvedReceived.isEmpty && !isMySpentSpark) { - Logging.instance.log( + Logging.instance.logd( "sparkCoinsInvolvedReceived is empty and should not be! (ignoring tx parsing)", level: LogLevel.Error, ); @@ -229,7 +229,7 @@ class FiroWallet extends Bip39HDWallet } if (isMySpentSpark && sparkCoinsInvolvedSpent.isEmpty && !isMySpark) { - Logging.instance.log( + Logging.instance.logd( "sparkCoinsInvolvedSpent is empty and should not be! (ignoring tx parsing)", level: LogLevel.Error, ); @@ -248,13 +248,13 @@ class FiroWallet extends Bip39HDWallet } else if (asm.startsWith("OP_LELANTUSMINT")) { isMint = true; } else { - Logging.instance.log( + Logging.instance.logd( "Unknown mint op code found for lelantusmint tx: ${txData["txid"]}", level: LogLevel.Error, ); } } else { - Logging.instance.log( + Logging.instance.logd( "ASM for lelantusmint tx: ${txData["txid"]} is null!", level: LogLevel.Error, ); @@ -268,13 +268,13 @@ class FiroWallet extends Bip39HDWallet asm.startsWith("OP_SPARKSMINT")) { isSparkMint = true; } else { - Logging.instance.log( + Logging.instance.logd( "Unknown mint op code found for sparkmint tx: ${txData["txid"]}", level: LogLevel.Error, ); } } else { - Logging.instance.log( + Logging.instance.logd( "ASM for sparkmint tx: ${txData["txid"]} is null!", level: LogLevel.Error, ); @@ -570,7 +570,7 @@ class FiroWallet extends Bip39HDWallet // only found outputs owned by this wallet type = TransactionType.incoming; } else { - Logging.instance.log( + Logging.instance.logd( "Unexpected tx found (ignoring it): $txData", level: LogLevel.Error, ); @@ -747,7 +747,7 @@ class FiroWallet extends Bip39HDWallet ); // receiving addresses - Logging.instance.log( + Logging.instance.logd( "checking receiving addresses...", level: LogLevel.Info, ); @@ -772,7 +772,7 @@ class FiroWallet extends Bip39HDWallet } // change addresses - Logging.instance.log( + Logging.instance.logd( "checking change addresses...", level: LogLevel.Info, ); @@ -899,13 +899,13 @@ class FiroWallet extends Bip39HDWallet }); unawaited(refresh()); - Logging.instance.log( + Logging.instance.logd( "Firo recover for " "${info.name}: ${DateTime.now().difference(start)}", level: LogLevel.Info, ); } catch (e, s) { - Logging.instance.log( + Logging.instance.logd( "Exception rethrown from electrumx_mixin recover(): $e\n$s", level: LogLevel.Info, ); diff --git a/lib/wallets/wallet/impl/litecoin_wallet.dart b/lib/wallets/wallet/impl/litecoin_wallet.dart index d301d0608..073fe1149 100644 --- a/lib/wallets/wallet/impl/litecoin_wallet.dart +++ b/lib/wallets/wallet/impl/litecoin_wallet.dart @@ -287,7 +287,7 @@ class LitecoinWallet // } } } else { - Logging.instance.log( + Logging.instance.logd( "Unexpected tx found (ignoring it): $txData", level: LogLevel.Error, ); diff --git a/lib/wallets/wallet/impl/namecoin_wallet.dart b/lib/wallets/wallet/impl/namecoin_wallet.dart index a401d6395..cc92b32e3 100644 --- a/lib/wallets/wallet/impl/namecoin_wallet.dart +++ b/lib/wallets/wallet/impl/namecoin_wallet.dart @@ -264,7 +264,7 @@ class NamecoinWallet // Only found outputs owned by this wallet. type = TransactionType.incoming; } else { - Logging.instance.log( + Logging.instance.logd( "Unexpected tx found (ignoring it): $txData", level: LogLevel.Error, ); diff --git a/lib/wallets/wallet/impl/particl_wallet.dart b/lib/wallets/wallet/impl/particl_wallet.dart index 567700e6f..a03068738 100644 --- a/lib/wallets/wallet/impl/particl_wallet.dart +++ b/lib/wallets/wallet/impl/particl_wallet.dart @@ -313,7 +313,7 @@ class ParticlWallet // Only found outputs owned by this wallet. type = TransactionType.incoming; } else { - Logging.instance.log( + Logging.instance.logd( "Unexpected tx found (ignoring it): $txData", level: LogLevel.Error, ); @@ -348,7 +348,7 @@ class ParticlWallet required TxData txData, required List utxoSigningData, }) async { - Logging.instance.log( + Logging.instance.logd( "Starting Particl buildTransaction ----------", level: LogLevel.Info, ); @@ -523,7 +523,7 @@ class ParticlWallet ); } } catch (e, s) { - Logging.instance.log( + Logging.instance.logd( "Caught exception while signing transaction: $e\n$s", level: LogLevel.Error, ); @@ -540,7 +540,7 @@ class ParticlWallet String hexString = builtTx.toHex(isParticl: true).toString(); if (hexString.length % 2 != 0) { // Ensure the string has an even length. - Logging.instance.log( + Logging.instance.logd( "Hex string has odd length, which is unexpected.", level: LogLevel.Error, ); diff --git a/lib/wallets/wallet/impl/peercoin_wallet.dart b/lib/wallets/wallet/impl/peercoin_wallet.dart index e1d993584..ef0ae1c71 100644 --- a/lib/wallets/wallet/impl/peercoin_wallet.dart +++ b/lib/wallets/wallet/impl/peercoin_wallet.dart @@ -272,7 +272,7 @@ class PeercoinWallet // Only found outputs owned by this wallet. type = TransactionType.incoming; } else { - Logging.instance.log( + Logging.instance.logd( "Unexpected tx found (ignoring it): $txData", level: LogLevel.Error, ); diff --git a/lib/wallets/wallet/impl/solana_wallet.dart b/lib/wallets/wallet/impl/solana_wallet.dart index 8c7f7e43b..fdf369da9 100644 --- a/lib/wallets/wallet/impl/solana_wallet.dart +++ b/lib/wallets/wallet/impl/solana_wallet.dart @@ -99,7 +99,7 @@ class SolanaWallet extends Bip39Wallet { await mainDB.updateOrPutAddresses([address]); } } catch (e, s) { - Logging.instance.log( + Logging.instance.logd( "$runtimeType checkSaveInitialReceivingAddress() failed: $e\n$s", level: LogLevel.Error, ); @@ -157,7 +157,7 @@ class SolanaWallet extends Bip39Wallet { ), ); } catch (e, s) { - Logging.instance.log( + Logging.instance.logd( "$runtimeType Solana prepareSend failed: $e\n$s", level: LogLevel.Error, ); @@ -197,7 +197,7 @@ class SolanaWallet extends Bip39Wallet { txid: txid, ); } catch (e, s) { - Logging.instance.log( + Logging.instance.logd( "$runtimeType Solana confirmSend failed: $e\n$s", level: LogLevel.Error, ); @@ -259,7 +259,7 @@ class SolanaWallet extends Bip39Wallet { health = await _rpcClient?.getHealth(); return health != null; } catch (e, s) { - Logging.instance.log( + Logging.instance.logd( "$runtimeType Solana pingCheck failed \"health response=$health\": $e\n$s", level: LogLevel.Error, ); @@ -334,7 +334,7 @@ class SolanaWallet extends Bip39Wallet { await info.updateBalance(newBalance: newBalance, isar: mainDB.isar); } catch (e, s) { - Logging.instance.log( + Logging.instance.logd( "Error getting balance in solana_wallet.dart: $e\n$s", level: LogLevel.Error, ); @@ -354,7 +354,7 @@ class SolanaWallet extends Bip39Wallet { isar: mainDB.isar, ); } catch (e, s) { - Logging.instance.log( + Logging.instance.logd( "Error occurred in solana_wallet.dart while getting" " chain height for solana: $e\n$s", level: LogLevel.Error, @@ -458,7 +458,7 @@ class SolanaWallet extends Bip39Wallet { } on NodeTorMismatchConfigException { rethrow; } catch (e, s) { - Logging.instance.log( + Logging.instance.logd( "Error occurred in solana_wallet.dart while getting" " transactions for solana: $e\n$s", level: LogLevel.Error, diff --git a/lib/wallets/wallet/impl/stellar_wallet.dart b/lib/wallets/wallet/impl/stellar_wallet.dart index 8932a30fb..7d4b5880c 100644 --- a/lib/wallets/wallet/impl/stellar_wallet.dart +++ b/lib/wallets/wallet/impl/stellar_wallet.dart @@ -172,7 +172,7 @@ class StellarWallet extends Bip39Wallet { exists = true; } } catch (e, s) { - Logging.instance.log( + Logging.instance.logd( "Error getting account ${e.toString()} - ${s.toString()}", level: LogLevel.Error, ); @@ -230,7 +230,7 @@ class StellarWallet extends Bip39Wallet { } } catch (e, s) { // do nothing, still allow user into wallet - Logging.instance.log( + Logging.instance.logd( "$runtimeType checkSaveInitialReceivingAddress() failed: $e\n$s", level: LogLevel.Error, ); @@ -266,7 +266,7 @@ class StellarWallet extends Bip39Wallet { ), ); } catch (e, s) { - Logging.instance.log( + Logging.instance.logd( "$runtimeType prepareSend() failed: $e\n$s", level: LogLevel.Error, ); @@ -327,7 +327,7 @@ class StellarWallet extends Bip39Wallet { txid: response.hash!, ); } catch (e, s) { - Logging.instance.log("Error sending TX $e - $s", level: LogLevel.Error); + Logging.instance.logd("Error sending TX $e - $s", level: LogLevel.Error); rethrow; } } @@ -394,7 +394,7 @@ class StellarWallet extends Bip39Wallet { // probably just doesn't have any history yet or whatever stellar needs return; } else { - Logging.instance.log( + Logging.instance.logd( "$runtimeType ${info.name} $walletId " "failed to fetch account to updateBalance", level: LogLevel.Warning, @@ -428,7 +428,7 @@ class StellarWallet extends Bip39Wallet { } } } catch (e, s) { - Logging.instance.log( + Logging.instance.logd( "$runtimeType ${info.name} $walletId " "updateBalance() failed: $e\n$s", level: LogLevel.Warning, @@ -448,7 +448,7 @@ class StellarWallet extends Bip39Wallet { .then((value) => value.records!.first.sequence); await info.updateCachedChainHeight(newHeight: height, isar: mainDB.isar); } catch (e, s) { - Logging.instance.log( + Logging.instance.logd( "$runtimeType updateChainHeight() failed: $e\n$s", level: LogLevel.Error, ); @@ -485,7 +485,7 @@ class StellarWallet extends Bip39Wallet { // probably just doesn't have any history yet or whatever stellar needs return; } else { - Logging.instance.log( + Logging.instance.logd( "Stellar ${info.name} $walletId failed to fetch transactions", level: LogLevel.Warning, ); @@ -676,7 +676,7 @@ class StellarWallet extends Bip39Wallet { await mainDB.updateOrPutTransactionV2s(transactionList); } catch (e, s) { - Logging.instance.log( + Logging.instance.logd( "Exception rethrown from updateTransactions(): $e\n$s", level: LogLevel.Error, ); diff --git a/lib/wallets/wallet/impl/sub_wallets/eth_token_wallet.dart b/lib/wallets/wallet/impl/sub_wallets/eth_token_wallet.dart index 99d831f4b..624b66347 100644 --- a/lib/wallets/wallet/impl/sub_wallets/eth_token_wallet.dart +++ b/lib/wallets/wallet/impl/sub_wallets/eth_token_wallet.dart @@ -153,7 +153,7 @@ class EthTokenWallet extends Wallet { usingContractAddress: contractAddress.hex, ); } catch (e, s) { - Logging.instance.log( + Logging.instance.logd( "$runtimeType _updateTokenABI(): $e\n$s", level: LogLevel.Warning, ); @@ -200,7 +200,7 @@ class EthTokenWallet extends Wallet { _sendFunction = _deployedContract.function('transfer'); } catch (e, s) { - Logging.instance.log( + Logging.instance.logd( "$runtimeType wallet failed init(): $e\n$s", level: LogLevel.Warning, ); @@ -311,7 +311,7 @@ class EthTokenWallet extends Wallet { try { throw Exception(); } catch (_, s) { - Logging.instance.log( + Logging.instance.logd( "Eth token wallet recover called. This should not happen. Stacktrace: $s", level: LogLevel.Warning, ); @@ -347,13 +347,13 @@ class EthTokenWallet extends Wallet { isar: mainDB.isar, ); } else { - Logging.instance.log( + Logging.instance.logd( "CachedEthTokenBalance.fetchAndUpdateCachedBalance failed: ${response.exception}", level: LogLevel.Warning, ); } } catch (e, s) { - Logging.instance.log( + Logging.instance.logd( "$runtimeType wallet failed to update balance: $e\n$s", level: LogLevel.Warning, ); @@ -380,7 +380,7 @@ class EthTokenWallet extends Wallet { if (response.exception != null && response.exception!.message .contains("response is empty but status code is 200")) { - Logging.instance.log( + Logging.instance.logd( "No ${tokenContract.name} transfers found for $addressString", level: LogLevel.Info, ); @@ -419,7 +419,7 @@ class EthTokenWallet extends Wallet { // Server indexing failed for some reason. Instead of hard crashing or // showing no transactions we just skip it here. Not ideal but better // than nothing showing up - Logging.instance.log( + Logging.instance.logd( "Server error: Transaction ${tokenDto.transactionHash} not found.", level: LogLevel.Error, ); @@ -523,7 +523,7 @@ class EthTokenWallet extends Wallet { } await mainDB.updateOrPutTransactionV2s(txns); } catch (e, s) { - Logging.instance.log( + Logging.instance.logd( "$runtimeType wallet failed to update transactions: $e\n$s", level: LogLevel.Warning, ); diff --git a/lib/wallets/wallet/impl/tezos_wallet.dart b/lib/wallets/wallet/impl/tezos_wallet.dart index ab1448319..d0c837302 100644 --- a/lib/wallets/wallet/impl/tezos_wallet.dart +++ b/lib/wallets/wallet/impl/tezos_wallet.dart @@ -60,7 +60,7 @@ class TezosWallet extends Bip39Wallet { return Tezos.standardDerivationPath; } catch (e, s) { - Logging.instance.log( + Logging.instance.logd( "Error in _scanPossiblePaths() in tezos_wallet.dart: $e\n$s", level: LogLevel.Error, ); @@ -144,7 +144,7 @@ class TezosWallet extends Bip39Wallet { return opList; } catch (e, s) { - Logging.instance.log( + Logging.instance.logd( "Error in _buildSendTransaction() in tezos_wallet.dart: $e\n$s", level: LogLevel.Error, ); @@ -164,7 +164,7 @@ class TezosWallet extends Bip39Wallet { } } catch (e, s) { // do nothing, still allow user into wallet - Logging.instance.log( + Logging.instance.logd( "$runtimeType checkSaveInitialReceivingAddress() failed: $e\n$s", level: LogLevel.Error, ); @@ -271,7 +271,7 @@ class TezosWallet extends Bip39Wallet { tezosOperationsList: opList, ); } catch (e, s) { - Logging.instance.log( + Logging.instance.logd( "Error in prepareSend() in tezos_wallet.dart: $e\n$s", level: LogLevel.Error, ); @@ -338,14 +338,14 @@ class TezosWallet extends Bip39Wallet { } catch (e, s) { if (_estCount > 3) { _estCount = 0; - Logging.instance.log( + Logging.instance.logd( " Error in _estimate in tezos_wallet.dart: $e\n$s", level: LogLevel.Error, ); rethrow; } else { _estCount++; - Logging.instance.log( + Logging.instance.logd( "_estimate() retry _estCount=$_estCount", level: LogLevel.Warning, ); @@ -386,7 +386,7 @@ class TezosWallet extends Bip39Wallet { return fee; } catch (e, s) { - Logging.instance.log( + Logging.instance.logd( " Error in estimateFeeFor() in tezos_wallet.dart: $e\n$s", level: LogLevel.Error, ); @@ -499,7 +499,7 @@ class TezosWallet extends Bip39Wallet { await info.updateBalance(newBalance: newBalance, isar: mainDB.isar); } catch (e, s) { - Logging.instance.log( + Logging.instance.logd( "Error getting balance in tezos_wallet.dart: $e\n$s", level: LogLevel.Error, ); @@ -523,7 +523,7 @@ class TezosWallet extends Bip39Wallet { isar: mainDB.isar, ); } catch (e, s) { - Logging.instance.log( + Logging.instance.logd( "Error occurred in tezos_wallet.dart while getting" " chain height for tezos: $e\n$s", level: LogLevel.Error, diff --git a/lib/wallets/wallet/intermediate/lib_monero_wallet.dart b/lib/wallets/wallet/intermediate/lib_monero_wallet.dart index 8ab9efcc8..2e965cb6d 100644 --- a/lib/wallets/wallet/intermediate/lib_monero_wallet.dart +++ b/lib/wallets/wallet/intermediate/lib_monero_wallet.dart @@ -179,7 +179,7 @@ abstract class LibMoneroWallet onNewBlock: onNewBlock, onBalancesChanged: onBalancesChanged, onError: (e, s) { - Logging.instance.log("$e\n$s", level: LogLevel.Warning); + Logging.instance.logd("$e\n$s", level: LogLevel.Warning); }, ), ); @@ -307,7 +307,7 @@ abstract class LibMoneroWallet privateSpendKey: base.getPrivateSpendKey(), ); } catch (e, s) { - Logging.instance.log("getKeys failed: $e\n$s", level: LogLevel.Fatal); + Logging.instance.logd("getKeys failed: $e\n$s", level: LogLevel.Fatal); return CWKeyData( walletId: walletId, publicViewKey: "ERROR", @@ -374,7 +374,7 @@ abstract class LibMoneroWallet value: "", ); } catch (e, s) { - Logging.instance.log("$e\n$s", level: LogLevel.Fatal); + Logging.instance.logd("$e\n$s", level: LogLevel.Fatal); } await updateNode(); } @@ -462,7 +462,7 @@ abstract class LibMoneroWallet isar: mainDB.isar, ); } catch (e, s) { - Logging.instance.log("$e\n$s", level: LogLevel.Fatal); + Logging.instance.logd("$e\n$s", level: LogLevel.Fatal); rethrow; } await updateNode(); @@ -476,7 +476,7 @@ abstract class LibMoneroWallet libMoneroWallet?.startListeners(); libMoneroWallet?.startAutoSaving(); } catch (e, s) { - Logging.instance.log( + Logging.instance.logd( "Exception rethrown from recoverFromMnemonic(): $e\n$s", level: LogLevel.Error, ); @@ -548,7 +548,7 @@ abstract class LibMoneroWallet _setSyncStatus(lib_monero_compat.ConnectedSyncStatus()); } catch (e, s) { _setSyncStatus(lib_monero_compat.FailedSyncStatus()); - Logging.instance.log( + Logging.instance.logd( "Exception caught in $runtimeType.updateNode(): $e\n$s", level: LogLevel.Error, ); @@ -802,7 +802,7 @@ abstract class LibMoneroWallet await updateBalance(); await updateTransactions(); } catch (e, s) { - Logging.instance.log( + Logging.instance.logd( "onBalancesChanged(): $e\n$s", level: LogLevel.Warning, ); @@ -813,7 +813,7 @@ abstract class LibMoneroWallet try { await updateTransactions(); } catch (e, s) { - Logging.instance.log( + Logging.instance.logd( "onNewBlock(): $e\n$s", level: LogLevel.Warning, ); @@ -1165,7 +1165,7 @@ abstract class LibMoneroWallet isar: mainDB.isar, ); } catch (e, s) { - Logging.instance.log( + Logging.instance.logd( "Exception in generateNewAddress(): $e\n$s", level: LogLevel.Error, ); @@ -1178,7 +1178,7 @@ abstract class LibMoneroWallet try { throw Exception(); } catch (_, s) { - Logging.instance.log( + Logging.instance.logd( "checkReceivingAddressForTransactions called but reuse address flag set: $s", level: LogLevel.Error, ); @@ -1230,13 +1230,13 @@ abstract class LibMoneroWallet } } } on SocketException catch (se, s) { - Logging.instance.log( + Logging.instance.logd( "SocketException caught in _checkReceivingAddressForTransactions(): $se\n$s", level: LogLevel.Error, ); return; } catch (e, s) { - Logging.instance.log( + Logging.instance.logd( "Exception rethrown from _checkReceivingAddressForTransactions(): $e\n$s", level: LogLevel.Error, ); @@ -1386,7 +1386,7 @@ abstract class LibMoneroWallet throw ArgumentError("Invalid fee rate argument provided!"); } } catch (e, s) { - Logging.instance.log( + Logging.instance.logd( "Exception rethrown from prepare send(): $e\n$s", level: LogLevel.Info, ); @@ -1407,20 +1407,20 @@ abstract class LibMoneroWallet txData.pendingTransaction!, ); - Logging.instance.log( + Logging.instance.logd( "transaction ${txData.pendingTransaction!.txid} has been sent", level: LogLevel.Info, ); return txData.copyWith(txid: txData.pendingTransaction!.txid); } catch (e, s) { - Logging.instance.log( + Logging.instance.logd( "${info.name} ${compatType.name.toLowerCase()} confirmSend: $e\n$s", level: LogLevel.Error, ); rethrow; } } catch (e, s) { - Logging.instance.log( + Logging.instance.logd( "Exception rethrown from confirmSend(): $e\n$s", level: LogLevel.Info, ); @@ -1499,7 +1499,7 @@ abstract class LibMoneroWallet libMoneroWallet?.startListeners(); libMoneroWallet?.startAutoSaving(); } catch (e, s) { - Logging.instance.log( + Logging.instance.logd( "Exception rethrown from recoverViewOnly(): $e\n$s", level: LogLevel.Error, ); diff --git a/lib/wallets/wallet/supporting/epiccash_wallet_info_extension.dart b/lib/wallets/wallet/supporting/epiccash_wallet_info_extension.dart index d913df779..4e634ba17 100644 --- a/lib/wallets/wallet/supporting/epiccash_wallet_info_extension.dart +++ b/lib/wallets/wallet/supporting/epiccash_wallet_info_extension.dart @@ -1,6 +1,7 @@ import 'dart:convert'; import 'package:isar/isar.dart'; + import '../../../utilities/logger.dart'; import '../../isar/models/wallet_info.dart'; @@ -17,7 +18,7 @@ extension EpiccashWalletInfoExtension on WalletInfo { ), ); } catch (e, s) { - Logging.instance.log( + Logging.instance.logd( "ExtraEpiccashWalletInfo.fromMap failed: $e\n$s", level: LogLevel.Error, ); diff --git a/lib/wallets/wallet/wallet.dart b/lib/wallets/wallet/wallet.dart index 4445ba7a9..accbfea55 100644 --- a/lib/wallets/wallet/wallet.dart +++ b/lib/wallets/wallet/wallet.dart @@ -126,7 +126,7 @@ abstract class Wallet { await updateChainHeight(); } catch (e, s) { // do nothing on failure (besides logging) - Logging.instance.log("$e\n$s", level: LogLevel.Warning); + Logging.instance.logd("$e\n$s", level: LogLevel.Warning); } // return regardless of whether it was updated or not as we want a @@ -552,7 +552,7 @@ abstract class Wallet { cryptoCurrency, ), ); - Logging.instance.log( + Logging.instance.logd( "Caught exception in refreshWalletData(): $error\n$strace", level: LogLevel.Error, ); @@ -699,7 +699,7 @@ abstract class Wallet { ); } - Logging.instance.log( + Logging.instance.logd( "Refresh for " "${info.name}: ${DateTime.now().difference(start)}", level: LogLevel.Info, diff --git a/lib/wallets/wallet/wallet_mixin_interfaces/bcash_interface.dart b/lib/wallets/wallet/wallet_mixin_interfaces/bcash_interface.dart index 0fd65ba0d..4205d32bd 100644 --- a/lib/wallets/wallet/wallet_mixin_interfaces/bcash_interface.dart +++ b/lib/wallets/wallet/wallet_mixin_interfaces/bcash_interface.dart @@ -21,7 +21,7 @@ mixin BCashInterface required List utxoSigningData, }) async { Logging.instance - .log("Starting buildTransaction ----------", level: LogLevel.Info); + .logd("Starting buildTransaction ----------", level: LogLevel.Info); // TODO: use coinlib @@ -114,7 +114,7 @@ mixin BCashInterface ); } } catch (e, s) { - Logging.instance.log( + Logging.instance.logd( "Caught exception while signing transaction: $e\n$s", level: LogLevel.Error, ); diff --git a/lib/wallets/wallet/wallet_mixin_interfaces/cash_fusion_interface.dart b/lib/wallets/wallet/wallet_mixin_interfaces/cash_fusion_interface.dart index c22064d03..6bdce0b5e 100644 --- a/lib/wallets/wallet/wallet_mixin_interfaces/cash_fusion_interface.dart +++ b/lib/wallets/wallet/wallet_mixin_interfaces/cash_fusion_interface.dart @@ -379,7 +379,7 @@ mixin CashFusionInterface return root.derivePath(derivationPath).privateKey.data; } catch (e, s) { - Logging.instance.log("$e\n$s", level: LogLevel.Fatal); + Logging.instance.logd("$e\n$s", level: LogLevel.Fatal); throw Exception("Derivation path for pubkey=$pubKey could not be found"); } } @@ -741,7 +741,7 @@ mixin CashFusionInterface if (addr == null) { // A utxo object should always have a non null address. // If non found then just ignore the UTXO (aka don't fuse it) - Logging.instance.log( + Logging.instance.logd( "Ignoring utxo=$utxo for address=\"$addressString\" while selecting UTXOs for Fusion", level: LogLevel.Info, ); @@ -781,7 +781,7 @@ mixin CashFusionInterface // Also reset the failed count here. _failedFuseCount = 0; } catch (e, s) { - Logging.instance.log( + Logging.instance.logd( "$e\n$s", level: LogLevel.Error, ); @@ -816,7 +816,7 @@ mixin CashFusionInterface } } } catch (e, s) { - Logging.instance.log( + Logging.instance.logd( "$e\n$s", level: LogLevel.Error, ); diff --git a/lib/wallets/wallet/wallet_mixin_interfaces/electrumx_interface.dart b/lib/wallets/wallet/wallet_mixin_interfaces/electrumx_interface.dart index b59041ef8..66522fe7b 100644 --- a/lib/wallets/wallet/wallet_mixin_interfaces/electrumx_interface.dart +++ b/lib/wallets/wallet/wallet_mixin_interfaces/electrumx_interface.dart @@ -114,7 +114,7 @@ mixin ElectrumXInterface List? utxos, }) async { Logging.instance - .log("Starting coinSelection ----------", level: LogLevel.Info); + .logd("Starting coinSelection ----------", level: LogLevel.Info); // TODO: multiple recipients one day assert(txData.recipients!.length == 1); @@ -171,22 +171,22 @@ mixin ElectrumXInterface ); } - Logging.instance.log( + Logging.instance.logd( "spendableOutputs.length: ${spendableOutputs.length}", level: LogLevel.Info, ); - Logging.instance.log( + Logging.instance.logd( "availableOutputs.length: ${availableOutputs.length}", level: LogLevel.Info, ); Logging.instance - .log("spendableOutputs: $spendableOutputs", level: LogLevel.Info); - Logging.instance.log( + .logd("spendableOutputs: $spendableOutputs", level: LogLevel.Info); + Logging.instance.logd( "spendableSatoshiValue: $spendableSatoshiValue", level: LogLevel.Info, ); - Logging.instance - .log("satoshiAmountToSend: $satoshiAmountToSend", level: LogLevel.Info); + Logging.instance.logd("satoshiAmountToSend: $satoshiAmountToSend", + level: LogLevel.Info); BigInt satoshisBeingUsed = BigInt.zero; int inputsBeingConsumed = 0; @@ -217,11 +217,11 @@ mixin ElectrumXInterface } Logging.instance - .log("satoshisBeingUsed: $satoshisBeingUsed", level: LogLevel.Info); - Logging.instance - .log("inputsBeingConsumed: $inputsBeingConsumed", level: LogLevel.Info); + .logd("satoshisBeingUsed: $satoshisBeingUsed", level: LogLevel.Info); + Logging.instance.logd("inputsBeingConsumed: $inputsBeingConsumed", + level: LogLevel.Info); Logging.instance - .log('utxoObjectsToUse: $utxoObjectsToUse', level: LogLevel.Info); + .logd('utxoObjectsToUse: $utxoObjectsToUse', level: LogLevel.Info); // numberOfOutputs' length must always be equal to that of recipientsArray and recipientsAmtArray final List recipientsArray = [recipientAddress]; @@ -261,7 +261,7 @@ mixin ElectrumXInterface )) .vSize!; } catch (e) { - Logging.instance.log("vSizeForOneOutput: $e", level: LogLevel.Error); + Logging.instance.logd("vSizeForOneOutput: $e", level: LogLevel.Error); rethrow; } @@ -287,7 +287,7 @@ mixin ElectrumXInterface )) .vSize!; } catch (e) { - Logging.instance.log("vSizeForTwoOutPuts: $e", level: LogLevel.Error); + Logging.instance.logd("vSizeForTwoOutPuts: $e", level: LogLevel.Error); rethrow; } @@ -310,11 +310,11 @@ mixin ElectrumXInterface ), ); - Logging.instance.log( + Logging.instance.logd( "feeForTwoOutputs: $feeForTwoOutputs", level: LogLevel.Info, ); - Logging.instance.log( + Logging.instance.logd( "feeForOneOutput: $feeForOneOutput", level: LogLevel.Info, ); @@ -322,19 +322,19 @@ mixin ElectrumXInterface final difference = satoshisBeingUsed - satoshiAmountToSend; Future singleOutputTxn() async { - Logging.instance.log( + Logging.instance.logd( 'Input size: $satoshisBeingUsed', level: LogLevel.Info, ); - Logging.instance.log( + Logging.instance.logd( 'Recipient output size: $satoshiAmountToSend', level: LogLevel.Info, ); - Logging.instance.log( + Logging.instance.logd( 'Fee being paid: $difference sats', level: LogLevel.Info, ); - Logging.instance.log( + Logging.instance.logd( 'Estimated fee: $feeForOneOutput', level: LogLevel.Info, ); @@ -358,10 +358,10 @@ mixin ElectrumXInterface // no change output required if (difference == feeForOneOutput) { - Logging.instance.log('1 output in tx', level: LogLevel.Info); + Logging.instance.logd('1 output in tx', level: LogLevel.Info); return await singleOutputTxn(); } else if (difference < feeForOneOutput) { - Logging.instance.log( + Logging.instance.logd( 'Cannot pay tx fee - checking for more outputs and trying again', level: LogLevel.Warning, ); @@ -394,24 +394,24 @@ mixin ElectrumXInterface recipientsArray.add(newChangeAddress); recipientsAmtArray.add(changeOutputSize); - Logging.instance.log('2 outputs in tx', level: LogLevel.Info); - Logging.instance.log( + Logging.instance.logd('2 outputs in tx', level: LogLevel.Info); + Logging.instance.logd( 'Input size: $satoshisBeingUsed', level: LogLevel.Info, ); - Logging.instance.log( + Logging.instance.logd( 'Recipient output size: $satoshiAmountToSend', level: LogLevel.Info, ); - Logging.instance.log( + Logging.instance.logd( 'Change Output Size: $changeOutputSize', level: LogLevel.Info, ); - Logging.instance.log( + Logging.instance.logd( 'Difference (fee being paid): $feeBeingPaid sats', level: LogLevel.Info, ); - Logging.instance.log( + Logging.instance.logd( 'Estimated fee: $feeForTwoOutputs', level: LogLevel.Info, ); @@ -433,23 +433,23 @@ mixin ElectrumXInterface recipientsAmtArray.removeLast(); recipientsAmtArray.add(changeOutputSize); - Logging.instance.log( + Logging.instance.logd( 'Adjusted Input size: $satoshisBeingUsed', level: LogLevel.Info, ); - Logging.instance.log( + Logging.instance.logd( 'Adjusted Recipient output size: $satoshiAmountToSend', level: LogLevel.Info, ); - Logging.instance.log( + Logging.instance.logd( 'Adjusted Change Output Size: $changeOutputSize', level: LogLevel.Info, ); - Logging.instance.log( + Logging.instance.logd( 'Adjusted Difference (fee being paid): $feeBeingPaid sats', level: LogLevel.Info, ); - Logging.instance.log( + Logging.instance.logd( 'Adjusted Estimated fee: $feeForTwoOutputs', level: LogLevel.Info, ); @@ -475,7 +475,7 @@ mixin ElectrumXInterface } else { // Something went wrong here. It either overshot or undershot the estimated fee amount or the changeOutputSize // is smaller than or equal to cryptoCurrency.dustLimit. Revert to single output transaction. - Logging.instance.log( + Logging.instance.logd( 'Reverting to 1 output in tx', level: LogLevel.Info, ); @@ -498,7 +498,7 @@ mixin ElectrumXInterface required int feeRatePerKB, }) async { Logging.instance - .log("Attempting to send all $cryptoCurrency", level: LogLevel.Info); + .logd("Attempting to send all $cryptoCurrency", level: LogLevel.Info); if (txData.recipients!.length != 1) { throw Exception( "Send all to more than one recipient not yet supported", @@ -629,7 +629,7 @@ mixin ElectrumXInterface return signingData; } catch (e, s) { Logging.instance - .log("fetchBuildTxData() threw: $e,\n$s", level: LogLevel.Error); + .logd("fetchBuildTxData() threw: $e,\n$s", level: LogLevel.Error); rethrow; } } @@ -640,7 +640,7 @@ mixin ElectrumXInterface required List utxoSigningData, }) async { Logging.instance - .log("Starting buildTransaction ----------", level: LogLevel.Info); + .logd("Starting buildTransaction ----------", level: LogLevel.Info); // temp tx data to show in gui while waiting for real data from server final List tempInputs = []; @@ -810,7 +810,7 @@ mixin ElectrumXInterface ); } } catch (e, s) { - Logging.instance.log( + Logging.instance.logd( "Caught exception while signing transaction: $e\n$s", level: LogLevel.Error, ); @@ -858,7 +858,7 @@ mixin ElectrumXInterface await electrumXClient.checkElectrumAdapter(); return await fetchChainHeight(retries: retries); } - Logging.instance.log( + Logging.instance.logd( "Exception rethrown in fetchChainHeight\nError: $e\nStack trace: $s", level: LogLevel.Error, ); @@ -891,7 +891,7 @@ mixin ElectrumXInterface } return result; } catch (e, s) { - Logging.instance.log( + Logging.instance.logd( "Exception rethrown in _getBatchTxCount(address: $addresses: $e\n$s", level: LogLevel.Error, ); @@ -937,7 +937,7 @@ mixin ElectrumXInterface // Ignore. This should happen every first time the wallet is opened. } else { Logging.instance - .log("Error closing electrumXClient: $e", level: LogLevel.Error); + .logd("Error closing electrumXClient: $e", level: LogLevel.Error); } } electrumXClient = ElectrumXClient.from( @@ -966,7 +966,7 @@ mixin ElectrumXInterface for (int index = 0; gapCounter < cryptoCurrency.maxUnusedAddressGap; index += txCountBatchSize) { - Logging.instance.log( + Logging.instance.logd( "index: $index, \t GapCounter $chain ${type.name}: $gapCounter", level: LogLevel.Info, ); @@ -1053,7 +1053,7 @@ mixin ElectrumXInterface int index = 0; for (; gapCounter < cryptoCurrency.maxUnusedAddressGap; index++) { - Logging.instance.log( + Logging.instance.logd( "index: $index, \t GapCounter chain=$chain ${type.name}: $gapCounter", level: LogLevel.Info, ); @@ -1177,7 +1177,7 @@ mixin ElectrumXInterface return allTxHashes; } catch (e, s) { - Logging.instance.log( + Logging.instance.logd( "$runtimeType._fetchHistory: $e\n$s", level: LogLevel.Error, ); @@ -1298,11 +1298,11 @@ mixin ElectrumXInterface ).raw.toInt(), ); - Logging.instance.log("fetched fees: $feeObject", level: LogLevel.Info); + Logging.instance.logd("fetched fees: $feeObject", level: LogLevel.Info); _cachedFees = feeObject; return _cachedFees!; } catch (e, s) { - Logging.instance.log( + Logging.instance.logd( "Exception rethrown from _getFees(): $e\nStack trace: $s", level: LogLevel.Error, ); @@ -1375,7 +1375,7 @@ mixin ElectrumXInterface try { throw Exception(); } catch (_, s) { - Logging.instance.log( + Logging.instance.logd( "checkReceivingAddressForTransactions called but reuse address flag set: $s", level: LogLevel.Error, ); @@ -1411,7 +1411,7 @@ mixin ElectrumXInterface } } } catch (e, s) { - Logging.instance.log( + Logging.instance.logd( "Exception rethrown from _checkReceivingAddressForTransactions" "($cryptoCurrency): $e\n$s", level: LogLevel.Error, @@ -1430,7 +1430,7 @@ mixin ElectrumXInterface try { throw Exception(); } catch (_, s) { - Logging.instance.log( + Logging.instance.logd( "checkChangeAddressForTransactions called but reuse address flag set: $s", level: LogLevel.Error, ); @@ -1463,7 +1463,7 @@ mixin ElectrumXInterface await checkChangeAddressForTransactions(); } } catch (e, s) { - Logging.instance.log( + Logging.instance.logd( "Exception rethrown from _checkChangeAddressForTransactions" "($cryptoCurrency): $e\n$s", level: LogLevel.Error, @@ -1503,7 +1503,7 @@ mixin ElectrumXInterface } // receiving addresses - Logging.instance.log( + Logging.instance.logd( "checking receiving addresses...", level: LogLevel.Info, ); @@ -1528,7 +1528,7 @@ mixin ElectrumXInterface } // change addresses - Logging.instance.log( + Logging.instance.logd( "checking change addresses...", level: LogLevel.Info, ); @@ -1634,7 +1634,7 @@ mixin ElectrumXInterface paymentCodeStrings: codesToCheck, ); } catch (e, s) { - Logging.instance.log( + Logging.instance.logd( "Failed to check ${PaynymIsApi.baseURL} followers/following for history during " "bitcoin wallet ($walletId ${info.name}) " "_recoverWalletFromBIP32SeedPhrase: $e/n$s", @@ -1646,7 +1646,7 @@ mixin ElectrumXInterface unawaited(refresh()); } catch (e, s) { - Logging.instance.log( + Logging.instance.logd( "Exception rethrown from electrumx_mixin recover(): $e\n$s", level: LogLevel.Info, ); @@ -1714,7 +1714,7 @@ mixin ElectrumXInterface return await mainDB.updateUTXOs(walletId, outputArray); } catch (e, s) { - Logging.instance.log( + Logging.instance.logd( "Output fetch unsuccessful: $e\n$s", level: LogLevel.Error, ); @@ -1725,12 +1725,13 @@ mixin ElectrumXInterface @override Future confirmSend({required TxData txData}) async { try { - Logging.instance.log("confirmSend txData: $txData", level: LogLevel.Info); + Logging.instance + .logd("confirmSend txData: $txData", level: LogLevel.Info); final txHash = await electrumXClient.broadcastTransaction( rawTx: txData.raw!, ); - Logging.instance.log("Sent txHash: $txHash", level: LogLevel.Info); + Logging.instance.logd("Sent txHash: $txHash", level: LogLevel.Info); txData = txData.copyWith( usedUTXOs: @@ -1745,7 +1746,7 @@ mixin ElectrumXInterface return await updateSentCachedTxData(txData: txData); } catch (e, s) { - Logging.instance.log( + Logging.instance.logd( "Exception rethrown from confirmSend(): $e\n$s", level: LogLevel.Error, ); @@ -1798,7 +1799,7 @@ mixin ElectrumXInterface ); Logging.instance - .log("PREPARE SEND RESULT: $result", level: LogLevel.Info); + .logd("PREPARE SEND RESULT: $result", level: LogLevel.Info); if (result.fee!.raw.toInt() < result.vSize!) { throw Exception( @@ -1846,7 +1847,7 @@ mixin ElectrumXInterface isSendAllCoinControlUtxos: isSendAllCoinControlUtxos, ); - Logging.instance.log("prepare send: $result", level: LogLevel.Info); + Logging.instance.logd("prepare send: $result", level: LogLevel.Info); if (result.fee!.raw.toInt() < result.vSize!) { throw Exception( "Error in fee calculation: Transaction fee (${result.fee!.raw.toInt()}) cannot " @@ -1858,7 +1859,7 @@ mixin ElectrumXInterface throw ArgumentError("Invalid fee rate argument provided!"); } } catch (e, s) { - Logging.instance.log( + Logging.instance.logd( "Exception rethrown from prepareSend(): $e\n$s", level: LogLevel.Error, ); @@ -1875,7 +1876,7 @@ mixin ElectrumXInterface await super.init(); } catch (e, s) { // do nothing, still allow user into wallet - Logging.instance.log( + Logging.instance.logd( "$runtimeType init() did not complete: $e\n$s", level: LogLevel.Warning, ); @@ -1888,7 +1889,7 @@ mixin ElectrumXInterface .getServerFeatures() .timeout(const Duration(seconds: 5)); - Logging.instance.log("features: $features", level: LogLevel.Info); + Logging.instance.logd("features: $features", level: LogLevel.Info); _serverVersion = _parseServerVersion(features["server_version"] as String); @@ -1897,7 +1898,7 @@ mixin ElectrumXInterface throw Exception("Genesis hash does not match!"); } } catch (e, s) { - Logging.instance.log( + Logging.instance.logd( "$runtimeType _initializeServerVersionAndCheckGenesisHash() did not complete: $e\n$s", level: LogLevel.Warning, ); @@ -1967,7 +1968,7 @@ mixin ElectrumXInterface } } catch (_) {} - Logging.instance.log( + Logging.instance.logd( "${info.name} _parseServerVersion($version) => $result", level: LogLevel.Info, ); @@ -2023,7 +2024,7 @@ mixin ElectrumXInterface if (root != null) { // receiving addresses - Logging.instance.log( + Logging.instance.logd( "checking receiving addresses...", level: LogLevel.Info, ); @@ -2057,7 +2058,7 @@ mixin ElectrumXInterface } // change addresses - Logging.instance.log( + Logging.instance.logd( "checking change addresses...", level: LogLevel.Info, ); @@ -2184,7 +2185,7 @@ mixin ElectrumXInterface unawaited(refresh()); } catch (e, s) { - Logging.instance.log( + Logging.instance.logd( "Exception rethrown from electrumx_mixin recoverViewOnly(): $e\n$s", level: LogLevel.Info, ); diff --git a/lib/wallets/wallet/wallet_mixin_interfaces/lelantus_interface.dart b/lib/wallets/wallet/wallet_mixin_interfaces/lelantus_interface.dart index 3d57f3c36..a51a98a22 100644 --- a/lib/wallets/wallet/wallet_mixin_interfaces/lelantus_interface.dart +++ b/lib/wallets/wallet/wallet_mixin_interfaces/lelantus_interface.dart @@ -83,7 +83,7 @@ mixin LelantusInterface privateKey, ); } catch (_) { - Logging.instance.log("error bad key", level: LogLevel.Error); + Logging.instance.logd("error bad key", level: LogLevel.Error); return lelantus.DartLelantusEntry(1, 0, 0, 0, 0, ''); } }).toList(); @@ -153,9 +153,10 @@ mixin LelantusInterface chaincode: root.chaincode, ); - Logging.instance.log("prepared fee: ${result.fee}", level: LogLevel.Info); Logging.instance - .log("prepared vSize: ${result.vSize}", level: LogLevel.Info); + .logd("prepared fee: ${result.fee}", level: LogLevel.Info); + Logging.instance + .logd("prepared vSize: ${result.vSize}", level: LogLevel.Info); // fee should never be less than vSize sanity check if (result.fee!.raw.toInt() < result.vSize!) { @@ -165,7 +166,7 @@ mixin LelantusInterface } return result; } catch (e, s) { - Logging.instance.log( + Logging.instance.logd( "Exception rethrown in firo prepareSend(): $e\n$s", level: LogLevel.Error, ); @@ -231,7 +232,7 @@ mixin LelantusInterface await mainDB.isar.lelantusCoins.put(jmint); }); } catch (e, s) { - Logging.instance.log( + Logging.instance.logd( "$e\n$s", level: LogLevel.Fatal, ); @@ -284,7 +285,7 @@ mixin LelantusInterface await mainDB.addNewTransactionData(txnsData, walletId); } else { // This is a mint - Logging.instance.log("this is a mint", level: LogLevel.Info); + Logging.instance.logd("this is a mint", level: LogLevel.Info); final List updatedCoins = []; @@ -309,7 +310,7 @@ mixin LelantusInterface await mainDB.isar.lelantusCoins.putAll(updatedCoins); }); } catch (e, s) { - Logging.instance.log( + Logging.instance.logd( "$e\n$s", level: LogLevel.Fatal, ); @@ -432,7 +433,7 @@ mixin LelantusInterface txs[address] = txn; } catch (e, s) { - Logging.instance.log( + Logging.instance.logd( "Exception caught in getJMintTransactions(): $e\n$s", level: LogLevel.Info, ); @@ -441,7 +442,7 @@ mixin LelantusInterface } return txs; } catch (e, s) { - Logging.instance.log( + Logging.instance.logd( "Exception rethrown in getJMintTransactions(): $e\n$s", level: LogLevel.Info, ); @@ -470,7 +471,7 @@ mixin LelantusInterface } return sets; } catch (e, s) { - Logging.instance.log( + Logging.instance.logd( "Exception rethrown from refreshAnonymitySets: $e\n$s", level: LogLevel.Error, ); @@ -536,7 +537,7 @@ mixin LelantusInterface final tx = await mainDB.getTransaction(walletId, coin.txid); if (tx == null) { - Logging.instance.log( + Logging.instance.logd( "Transaction with txid=${coin.txid} not found in local db!", level: LogLevel.Error, ); @@ -555,7 +556,7 @@ mixin LelantusInterface await mainDB.isar.lelantusCoins.putAll(updatedCoins); }); } catch (e, s) { - Logging.instance.log( + Logging.instance.logd( "$e\n$s", level: LogLevel.Fatal, ); @@ -638,7 +639,7 @@ mixin LelantusInterface } if (inputTxns.isEmpty) { //some error. - Logging.instance.log( + Logging.instance.logd( "cryptic \"//some error\" occurred in staticProcessRestore on lelantus coin: $coin", level: LogLevel.Error, ); @@ -698,7 +699,7 @@ mixin LelantusInterface await mainDB.isar.lelantusCoins.putAll(result.lelantusCoins); }); } catch (e, s) { - Logging.instance.log( + Logging.instance.logd( "$e\n$s", level: LogLevel.Fatal, ); @@ -716,7 +717,7 @@ mixin LelantusInterface final spendTxs = await getJMintTransactions( result.spendTxIds, ); - Logging.instance.log(spendTxs, level: LogLevel.Info); + Logging.instance.logd(spendTxs, level: LogLevel.Info); for (final element in spendTxs.entries) { final address = element.value.address.value ?? @@ -841,7 +842,7 @@ mixin LelantusInterface } for (final mintsElement in txData.mintsMapLelantus!) { - Logging.instance.log("using $mintsElement", level: LogLevel.Info); + Logging.instance.logd("using $mintsElement", level: LogLevel.Info); final Uint8List mintu8 = Format.stringToUint8List(mintsElement['script'] as String); txb.addOutput(mintu8, mintsElement['value'] as int); @@ -1063,7 +1064,7 @@ mixin LelantusInterface try { anonymitySets = await fetchAnonymitySets(); } catch (e, s) { - Logging.instance.log( + Logging.instance.logd( "Firo needs better internet to create mints: $e\n$s", level: LogLevel.Fatal, ); @@ -1087,7 +1088,7 @@ mixin LelantusInterface } if (isUsedMintTag) { - Logging.instance.log( + Logging.instance.logd( "Found used index when minting", level: LogLevel.Warning, ); @@ -1135,7 +1136,7 @@ mixin LelantusInterface unawaited(refresh()); } catch (e, s) { - Logging.instance.log( + Logging.instance.logd( "Exception caught in anonymizeAllLelantus(): $e\n$s", level: LogLevel.Warning, ); @@ -1171,13 +1172,13 @@ mixin LelantusInterface .findFirstSync(); if (txn == null) { - Logging.instance.log( + Logging.instance.logd( "Transaction not found in DB for lelantus coin: $lelantusCoin", level: LogLevel.Fatal, ); } else { if (txn.isLelantus != true) { - Logging.instance.log( + Logging.instance.logd( "Bad database state found in ${info.name} $walletId for _refreshBalance lelantus", level: LogLevel.Fatal, ); diff --git a/lib/wallets/wallet/wallet_mixin_interfaces/nano_interface.dart b/lib/wallets/wallet/wallet_mixin_interfaces/nano_interface.dart index e08bc3b45..4bf55253d 100644 --- a/lib/wallets/wallet/wallet_mixin_interfaces/nano_interface.dart +++ b/lib/wallets/wallet/wallet_mixin_interfaces/nano_interface.dart @@ -345,7 +345,7 @@ mixin NanoInterface on Bip39Wallet { } } catch (e, s) { // do nothing, still allow user into wallet - Logging.instance.log( + Logging.instance.logd( "$runtimeType checkSaveInitialReceivingAddress() failed: $e\n$s", level: LogLevel.Error, ); @@ -489,7 +489,7 @@ mixin NanoInterface on Bip39Wallet { ); } catch (e, s) { Logging.instance - .log("Error sending transaction $e - $s", level: LogLevel.Error); + .logd("Error sending transaction $e - $s", level: LogLevel.Error); rethrow; } } @@ -669,7 +669,7 @@ mixin NanoInterface on Bip39Wallet { await info.updateBalance(newBalance: balance, isar: mainDB.isar); } catch (e, s) { - Logging.instance.log( + Logging.instance.logd( "Failed to update ${cryptoCurrency.runtimeType} balance: $e\n$s", level: LogLevel.Warning, ); @@ -705,7 +705,7 @@ mixin NanoInterface on Bip39Wallet { await info.updateCachedChainHeight(newHeight: height, isar: mainDB.isar); } catch (e, s) { - Logging.instance.log( + Logging.instance.logd( "Failed to update ${cryptoCurrency.runtimeType} chain height: $e\n$s", level: LogLevel.Warning, ); diff --git a/lib/wallets/wallet/wallet_mixin_interfaces/ordinals_interface.dart b/lib/wallets/wallet/wallet_mixin_interfaces/ordinals_interface.dart index 4ca21ef1a..09896d2d6 100644 --- a/lib/wallets/wallet/wallet_mixin_interfaces/ordinals_interface.dart +++ b/lib/wallets/wallet/wallet_mixin_interfaces/ordinals_interface.dart @@ -19,7 +19,7 @@ mixin OrdinalsInterface return (await _litescribeAPI.getInscriptionsByAddress(address)) .isNotEmpty; } catch (_) { - Logging.instance.log("Litescribe api failure!", level: LogLevel.Error); + Logging.instance.logd("Litescribe api failure!", level: LogLevel.Error); return false; } @@ -54,7 +54,7 @@ mixin OrdinalsInterface await mainDB.isar.ordinals.putAll(ords); }); } catch (e, s) { - Logging.instance.log( + Logging.instance.logd( "$runtimeType failed refreshInscriptions(): $e\n$s", level: LogLevel.Warning, ); diff --git a/lib/wallets/wallet/wallet_mixin_interfaces/paynym_interface.dart b/lib/wallets/wallet/wallet_mixin_interfaces/paynym_interface.dart index b20638362..1ad8aa986 100644 --- a/lib/wallets/wallet/wallet_mixin_interfaces/paynym_interface.dart +++ b/lib/wallets/wallet/wallet_mixin_interfaces/paynym_interface.dart @@ -889,7 +889,7 @@ mixin PaynymInterface return Tuple2(clTx.toHex(), clTx.vSize()); } catch (e, s) { - Logging.instance.log( + Logging.instance.logd( "_createNotificationTx(): $e\n$s", level: LogLevel.Error, ); @@ -902,15 +902,15 @@ mixin PaynymInterface }) async { try { Logging.instance - .log("confirmNotificationTx txData: $txData", level: LogLevel.Info); + .logd("confirmNotificationTx txData: $txData", level: LogLevel.Info); final txHash = await electrumXClient.broadcastTransaction(rawTx: txData.raw!); - Logging.instance.log("Sent txHash: $txHash", level: LogLevel.Info); + Logging.instance.logd("Sent txHash: $txHash", level: LogLevel.Info); try { await updateTransactions(); } catch (e) { - Logging.instance.log( + Logging.instance.logd( "refresh() failed in confirmNotificationTx (${info.name}::$walletId): $e", level: LogLevel.Error, ); @@ -921,7 +921,7 @@ mixin PaynymInterface txHash: txHash, ); } catch (e, s) { - Logging.instance.log( + Logging.instance.logd( "Exception rethrown from confirmSend(): $e\n$s", level: LogLevel.Error, ); @@ -1047,7 +1047,7 @@ mixin PaynymInterface return (witnessComponents[1] as String).toUint8ListFromHex; } } catch (e, s) { - Logging.instance.log("_pubKeyFromInput: $e\n$s", level: LogLevel.Info); + Logging.instance.logd("_pubKeyFromInput: $e\n$s", level: LogLevel.Info); } } return null; @@ -1097,7 +1097,7 @@ mixin PaynymInterface return unBlindedPaymentCode; } catch (e, s) { - Logging.instance.log( + Logging.instance.logd( "unBlindedPaymentCodeFromTransaction() failed: $e\n$s\nFor tx: $transaction", level: LogLevel.Warning, ); @@ -1149,7 +1149,7 @@ mixin PaynymInterface return unBlindedPaymentCode; } catch (e) { - Logging.instance.log( + Logging.instance.logd( "unBlindedPaymentCodeFromTransactionBad() failed: $e\nFor tx: $transaction", level: LogLevel.Warning, ); @@ -1826,7 +1826,7 @@ mixin PaynymInterface // TODO: [prio=none] Check for special Bitcoin outputs like ordinals. } else { - Logging.instance.log( + Logging.instance.logd( "Unexpected tx found (ignoring it): $txData", level: LogLevel.Error, ); diff --git a/lib/wallets/wallet/wallet_mixin_interfaces/rbf_interface.dart b/lib/wallets/wallet/wallet_mixin_interfaces/rbf_interface.dart index 80bff1a7a..939987bdd 100644 --- a/lib/wallets/wallet/wallet_mixin_interfaces/rbf_interface.dart +++ b/lib/wallets/wallet/wallet_mixin_interfaces/rbf_interface.dart @@ -148,7 +148,7 @@ mixin RbfInterface ), ], ); - Logging.instance.log( + Logging.instance.logd( "RBF on assumed send all", level: LogLevel.Debug, ); @@ -184,7 +184,7 @@ mixin RbfInterface isChange: removed.isChange, ), ); - Logging.instance.log( + Logging.instance.logd( "RBF with same utxo set with increased fee and reduced change", level: LogLevel.Debug, ); @@ -198,7 +198,7 @@ mixin RbfInterface // oh well... // do nothing here as we already removed the change output above - Logging.instance.log( + Logging.instance.logd( "RBF with same utxo set with increased fee and no change", level: LogLevel.Debug, ); @@ -255,7 +255,7 @@ mixin RbfInterface // TODO: remove assert assert(newUtxoSet.length == txData.utxos!.length + extraUtxos.length); - Logging.instance.log( + Logging.instance.logd( "RBF with ${extraUtxos.length} extra utxo(s)" " added to pay for the new fee", level: LogLevel.Debug, diff --git a/lib/wallets/wallet/wallet_mixin_interfaces/spark_interface.dart b/lib/wallets/wallet/wallet_mixin_interfaces/spark_interface.dart index 27ac00190..fc34ed50e 100644 --- a/lib/wallets/wallet/wallet_mixin_interfaces/spark_interface.dart +++ b/lib/wallets/wallet/wallet_mixin_interfaces/spark_interface.dart @@ -66,7 +66,7 @@ void initSparkLogging(Level level) { stackTrace, required time, }) { - Logging.instance.lg( + Logging.instance.log( level.getLoggerLevel(), value, error: error, @@ -179,7 +179,7 @@ mixin SparkInterface } } catch (e, s) { // do nothing, still allow user into wallet - Logging.instance.log( + Logging.instance.logd( "$runtimeType init() failed: $e\n$s", level: LogLevel.Error, ); @@ -759,12 +759,13 @@ mixin SparkInterface required TxData txData, }) async { try { - Logging.instance.log("confirmSend txData: $txData", level: LogLevel.Info); + Logging.instance + .logd("confirmSend txData: $txData", level: LogLevel.Info); final txHash = await electrumXClient.broadcastTransaction( rawTx: txData.raw!, ); - Logging.instance.log("Sent txHash: $txHash", level: LogLevel.Info); + Logging.instance.logd("Sent txHash: $txHash", level: LogLevel.Info); txData = txData.copyWith( // TODO revisit setting these both @@ -783,7 +784,7 @@ mixin SparkInterface return await updateSentCachedTxData(txData: txData); } catch (e, s) { - Logging.instance.log( + Logging.instance.logd( "Exception rethrown from confirmSend(): $e\n$s", level: LogLevel.Error, ); @@ -857,13 +858,13 @@ mixin SparkInterface return result; } catch (e) { - Logging.instance.log( + Logging.instance.logd( "_refreshSparkCoinsMempoolCheck() failed: $e", level: LogLevel.Error, ); return []; } finally { - Logging.instance.log( + Logging.instance.logd( "$walletId ${info.name} _refreshSparkCoinsMempoolCheck() run " "duration: ${DateTime.now().difference(start)}", level: LogLevel.Debug, @@ -1167,13 +1168,13 @@ mixin SparkInterface isar: mainDB.isar, ); } catch (e, s) { - Logging.instance.log( + Logging.instance.logd( "$runtimeType $walletId ${info.name}: $e\n$s", level: LogLevel.Error, ); rethrow; } finally { - Logging.instance.log( + Logging.instance.logd( "${info.name} refreshSparkData() duration:" " ${DateTime.now().difference(start)}", level: LogLevel.Debug, @@ -1212,7 +1213,7 @@ mixin SparkInterface try { await refreshSparkData(null); } catch (e, s) { - Logging.instance.log( + Logging.instance.logd( "$runtimeType $walletId ${info.name}: $e\n$s", level: LogLevel.Error, ); @@ -1746,7 +1747,7 @@ mixin SparkInterface ); } } catch (e, s) { - Logging.instance.log( + Logging.instance.logd( "Caught exception while signing spark mint transaction: $e\n$s", level: LogLevel.Error, ); @@ -1899,7 +1900,7 @@ mixin SparkInterface await confirmSparkMintTransactions(txData: TxData(sparkMints: mints)); } catch (e, s) { - Logging.instance.log( + Logging.instance.logd( "Exception caught in anonymizeAllSpark(): $e\n$s", level: LogLevel.Warning, ); @@ -2006,7 +2007,7 @@ mixin SparkInterface return txData.copyWith(sparkMints: mints); } catch (e, s) { - Logging.instance.log( + Logging.instance.logd( "Exception caught in prepareSparkMintTransaction(): $e\n$s", level: LogLevel.Warning, ); diff --git a/lib/widgets/desktop/qr_code_scanner_dialog.dart b/lib/widgets/desktop/qr_code_scanner_dialog.dart index b9a583f46..24d24c93d 100644 --- a/lib/widgets/desktop/qr_code_scanner_dialog.dart +++ b/lib/widgets/desktop/qr_code_scanner_dialog.dart @@ -61,7 +61,7 @@ class _QrCodeScannerDialogState extends State { try { if (Platform.isLinux && _cameraLinuxPlugin != null) { await _cameraLinuxPlugin.initializeCamera(); - Logging.instance.log("Linux Camera initialized", level: LogLevel.Info); + Logging.instance.logd("Linux Camera initialized", level: LogLevel.Info); } else if (Platform.isWindows && _cameraWindowsPlugin != null) { final List cameras = await _cameraWindowsPlugin.availableCameras(); @@ -81,7 +81,7 @@ class _QrCodeScannerDialogState extends State { await _cameraWindowsPlugin.initializeCamera(_cameraId); // await _cameraWindowsPlugin!.onCameraInitialized(_cameraId).first; // TODO [prio=low]: Make this work. ^^^ - Logging.instance.log( + Logging.instance.logd( "Windows Camera initialized with ID: $_cameraId", level: LogLevel.Info, ); @@ -95,7 +95,7 @@ class _QrCodeScannerDialogState extends State { await CameraMacOS.instance .initialize(cameraMacOSMode: CameraMacOSMode.photo); - Logging.instance.log( + Logging.instance.logd( "macOS Camera initialized with ID: $_macOSDeviceId", level: LogLevel.Info, ); @@ -104,7 +104,7 @@ class _QrCodeScannerDialogState extends State { return true; } catch (e, s) { Logging.instance - .log("Failed to initialize camera: $e\n$s", level: LogLevel.Error); + .logd("Failed to initialize camera: $e\n$s", level: LogLevel.Error); return false; } } @@ -115,11 +115,11 @@ class _QrCodeScannerDialogState extends State { try { if (Platform.isLinux && _cameraLinuxPlugin != null) { _cameraLinuxPlugin.stopCamera(); - Logging.instance.log("Linux Camera stopped", level: LogLevel.Info); + Logging.instance.logd("Linux Camera stopped", level: LogLevel.Info); } else if (Platform.isWindows && _cameraWindowsPlugin != null) { // if (_cameraId >= 0) { await _cameraWindowsPlugin.dispose(_cameraId); - Logging.instance.log( + Logging.instance.logd( "Windows Camera stopped with ID: $_cameraId", level: LogLevel.Info, ); @@ -130,7 +130,7 @@ class _QrCodeScannerDialogState extends State { } else if (Platform.isMacOS) { // if (_macOSDeviceId != null) { await CameraMacOS.instance.stopImageStream(); - Logging.instance.log( + Logging.instance.logd( "macOS Camera stopped with ID: $_macOSDeviceId", level: LogLevel.Info, ); @@ -141,7 +141,7 @@ class _QrCodeScannerDialogState extends State { } } catch (e, s) { Logging.instance - .log("Failed to stop camera: $e\n$s", level: LogLevel.Error); + .logd("Failed to stop camera: $e\n$s", level: LogLevel.Error); } } @@ -162,14 +162,14 @@ class _QrCodeScannerDialogState extends State { final macOSimg = await CameraMacOS.instance.takePicture(); if (macOSimg == null) { Logging.instance - .log("Failed to capture image", level: LogLevel.Error); + .logd("Failed to capture image", level: LogLevel.Error); await Future.delayed(Duration(milliseconds: _imageDelayInMs)); continue; } final img.Image? image = img.decodeImage(macOSimg.bytes!); if (image == null) { Logging.instance - .log("Failed to capture image", level: LogLevel.Error); + .logd("Failed to capture image", level: LogLevel.Error); await Future.delayed(Duration(milliseconds: _imageDelayInMs)); continue; } @@ -187,7 +187,8 @@ class _QrCodeScannerDialogState extends State { // > WARNING Since this will check the image data against all known // > decoders, it is much slower than using an explicit decoder if (image == null) { - Logging.instance.log("Failed to decode image", level: LogLevel.Error); + Logging.instance + .logd("Failed to decode image", level: LogLevel.Error); await Future.delayed(Duration(milliseconds: _imageDelayInMs)); continue; } @@ -360,7 +361,7 @@ class _QrCodeScannerDialogState extends State { } } } catch (e, s) { - Logging.instance.log( + Logging.instance.logd( "Failed to decode image: $e\n$s", level: LogLevel.Error, ); diff --git a/lib/widgets/textfields/frost_step_field.dart b/lib/widgets/textfields/frost_step_field.dart index f7563080f..125100bf7 100644 --- a/lib/widgets/textfields/frost_step_field.dart +++ b/lib/widgets/textfields/frost_step_field.dart @@ -97,7 +97,7 @@ class _FrostStepFieldState extends State { ); if (qrResult == null) { - Logging.instance.log( + Logging.instance.logd( "Qr scanning cancelled", level: LogLevel.Info, ); @@ -109,7 +109,7 @@ class _FrostStepFieldState extends State { } } } on PlatformException catch (e, s) { - Logging.instance.log( + Logging.instance.logd( "Failed to get camera permissions while trying to scan qr code: $e\n$s", level: LogLevel.Warning, ); diff --git a/lib/widgets/wallet_card.dart b/lib/widgets/wallet_card.dart index 814d4b321..c01b46614 100644 --- a/lib/widgets/wallet_card.dart +++ b/lib/widgets/wallet_card.dart @@ -159,7 +159,7 @@ class SimpleWalletCard extends ConsumerWidget { if (!success!) { // TODO: show error dialog here? - Logging.instance.log( + Logging.instance.logd( "Failed to load token wallet for $contract", level: LogLevel.Error, ); From c4db10c9d34e70c2e5fd49a428bbeb9cecffe79a Mon Sep 17 00:00:00 2001 From: julian Date: Wed, 5 Feb 2025 17:12:44 -0600 Subject: [PATCH 062/193] add deprecated message --- lib/utilities/enums/log_level_enum.dart | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/utilities/enums/log_level_enum.dart b/lib/utilities/enums/log_level_enum.dart index afebbf076..c2c1de557 100644 --- a/lib/utilities/enums/log_level_enum.dart +++ b/lib/utilities/enums/log_level_enum.dart @@ -12,6 +12,7 @@ // in this definition should be done extremely carefully in production import 'package:logger/logger.dart'; +@Deprecated("Use Level instead, combined with the new logging features") enum LogLevel { Info, Warning, From 694910ab18e63710477a8ce88fb29e22111ef61b Mon Sep 17 00:00:00 2001 From: julian Date: Thu, 6 Feb 2025 11:57:40 -0600 Subject: [PATCH 063/193] replace deprecated logd function, clean up some logging and fix some log level logging levels --- lib/db/db_version_migration.dart | 12 +- lib/db/hive/db.dart | 7 +- lib/db/sqlite/firo_cache.dart | 14 +- lib/db/sqlite/firo_cache_coordinator.dart | 15 +- .../cached_electrumx_client.dart | 28 +- lib/electrumx_rpc/client_manager.dart | 7 +- lib/electrumx_rpc/electrumx_client.dart | 142 ++++----- .../subscribable_electrumx_client.dart | 2 +- lib/main.dart | 11 +- .../change_now/cn_exchange_estimate.dart | 7 +- .../change_now/estimated_exchange_amount.dart | 7 +- .../exchange_transaction_status.dart | 4 +- .../exchange/response_objects/estimate.dart | 7 +- .../response_objects/fixed_rate_market.dart | 5 +- .../exchange/simpleswap/sp_currency.dart | 5 +- lib/models/isar/stack_theme.dart | 6 +- lib/networking/http.dart | 17 +- .../new/steps/frost_create_step_2.dart | 5 +- .../new/steps/frost_create_step_3.dart | 5 +- .../new/steps/frost_create_step_5.dart | 5 +- .../reshare/frost_reshare_step_1a.dart | 5 +- .../reshare/frost_reshare_step_1b.dart | 5 +- .../reshare/frost_reshare_step_1c.dart | 5 +- .../reshare/frost_reshare_step_2abd.dart | 5 +- .../reshare/frost_reshare_step_2c.dart | 5 +- .../reshare/frost_reshare_step_3abd.dart | 5 +- .../reshare/frost_reshare_step_4.dart | 5 +- .../reshare/frost_reshare_step_5.dart | 5 +- .../restore/restore_frost_ms_wallet_view.dart | 17 +- ...w_wallet_recovery_phrase_warning_view.dart | 5 +- .../restore_wallet_view.dart | 16 +- .../sub_widgets/restore_failed_dialog.dart | 7 +- .../verify_recovery_phrase_view.dart | 5 +- .../new_contact_address_entry_form.dart | 5 +- lib/pages/buy_view/buy_form.dart | 38 +-- .../sub_widgets/crypto_selection_view.dart | 2 +- .../confirm_change_now_send.dart | 5 +- .../exchange_step_views/step_2_view.dart | 26 +- .../exchange_step_views/step_4_view.dart | 2 +- lib/pages/exchange_view/send_from_view.dart | 2 +- .../sub_widgets/exchange_provider_option.dart | 3 +- .../subwidgets/paynym_followers_list.dart | 7 +- .../subwidgets/paynym_following_list.dart | 7 +- .../generate_receiving_uri_qr_code_view.dart | 5 +- lib/pages/send_view/frost_ms/recipient.dart | 15 +- .../send_steps/frost_send_step_1a.dart | 5 +- .../send_steps/frost_send_step_1b.dart | 5 +- .../send_steps/frost_send_step_2.dart | 5 +- .../send_steps/frost_send_step_3.dart | 5 +- .../send_steps/frost_send_step_4.dart | 5 +- lib/pages/send_view/send_view.dart | 56 ++-- .../transaction_fee_selection_sheet.dart | 2 +- lib/pages/send_view/token_send_view.dart | 25 +- .../install_theme_from_file_dialog.dart | 7 +- .../sub_widgets/stack_theme_card.dart | 5 +- .../add_edit_node_view.dart | 29 +- .../create_auto_backup_view.dart | 15 +- .../create_backup_view.dart | 7 +- .../edit_auto_backup_view.dart | 6 +- .../helpers/restore_create_backup.dart | 115 ++++--- .../restore_from_file_view.dart | 2 +- .../stack_restore_progress_view.dart | 2 +- .../tor_settings/tor_settings_view.dart | 10 +- .../complete_reshare_config_view.dart | 5 +- .../lelantus_settings_view.dart | 2 +- .../transaction_details_view.dart | 2 +- .../tx_v2/transaction_v2_details_view.dart | 2 +- lib/pages/wallet_view/wallet_view.dart | 5 +- .../coin_control/freeze_button.dart | 5 +- .../subwidgets/desktop_step_2.dart | 4 +- .../wallet_view/sub_widgets/desktop_send.dart | 53 ++-- .../sub_widgets/desktop_token_send.dart | 23 +- .../sub_widgets/desktop_wallet_features.dart | 5 +- .../more_features/more_features_dialog.dart | 2 +- .../delete_password_warning_view.dart | 5 +- .../password/desktop_login_view.dart | 8 +- ...forgotten_passphrase_restore_from_swb.dart | 2 +- .../sub_widgets/desktop_install_theme.dart | 7 +- .../create_auto_backup.dart | 21 +- .../tor_settings/tor_settings.dart | 10 +- lib/services/auto_swb_service.dart | 16 +- lib/services/buy/simplex/simplex_api.dart | 55 ++-- lib/services/coins/tezos/api/tezos_api.dart | 15 +- .../coins/tezos/api/tezos_rpc_api.dart | 20 +- .../ethereum/cached_eth_token_balance.dart | 6 +- lib/services/ethereum/ethereum_api.dart | 100 +++--- .../global/balance_refreshed_event.dart | 5 +- .../events/global/blocks_remaining_event.dart | 6 +- .../node_connection_status_changed_event.dart | 3 +- .../global/refresh_percent_changed_event.dart | 6 +- .../tor_connection_status_changed_event.dart | 6 +- .../global/tor_status_changed_event.dart | 6 +- .../global/updated_in_background_event.dart | 11 +- .../wallet_sync_status_changed_event.dart | 6 +- .../exchange/change_now/change_now_api.dart | 156 ++++++---- .../exchange_data_loading_service.dart | 25 +- .../majestic_bank/majestic_bank_api.dart | 52 ++-- .../exchange/nanswap/nanswap_api.dart | 63 ++-- .../exchange/simpleswap/simpleswap_api.dart | 88 +++--- .../exchange/trocador/trocador_api.dart | 39 +-- lib/services/frost.dart | 100 ++---- lib/services/fusion_tor_service.dart | 5 +- lib/services/monkey_service.dart | 5 +- lib/services/node_service.dart | 9 +- lib/services/notifications_service.dart | 5 +- lib/services/price.dart | 29 +- lib/services/tor_service.dart | 5 +- lib/services/wallets.dart | 64 ++-- lib/services/wallets_service.dart | 10 +- lib/themes/theme_service.dart | 42 +-- lib/utilities/address_utils.dart | 2 +- lib/utilities/biometrics.dart | 19 +- .../electrum_connection_check.dart | 9 +- lib/utilities/desktop_password_service.dart | 30 +- .../extensions/impl/contract_abi.dart | 5 +- lib/utilities/git_status.dart | 27 +- lib/utilities/logger.dart | 13 - lib/utilities/show_loading.dart | 5 +- lib/utilities/test_epic_box_connection.dart | 4 +- .../test_monero_node_connection.dart | 4 +- lib/utilities/test_node_connection.dart | 24 +- lib/wallets/api/lelantus_ffi_wrapper.dart | 5 +- lib/wallets/api/tezos/tezos_api.dart | 15 +- lib/wallets/api/tezos/tezos_rpc_api.dart | 14 +- .../wallet/impl/bitcoin_frost_wallet.dart | 99 +++--- .../wallet/impl/bitcoincash_wallet.dart | 22 +- lib/wallets/wallet/impl/cardano_wallet.dart | 40 +-- lib/wallets/wallet/impl/dash_wallet.dart | 8 +- lib/wallets/wallet/impl/dogecoin_wallet.dart | 8 +- lib/wallets/wallet/impl/ecash_wallet.dart | 11 +- lib/wallets/wallet/impl/epiccash_wallet.dart | 104 +++---- lib/wallets/wallet/impl/ethereum_wallet.dart | 20 +- lib/wallets/wallet/impl/firo_wallet.dart | 47 +-- lib/wallets/wallet/impl/litecoin_wallet.dart | 6 +- lib/wallets/wallet/impl/namecoin_wallet.dart | 6 +- lib/wallets/wallet/impl/particl_wallet.dart | 23 +- lib/wallets/wallet/impl/peercoin_wallet.dart | 6 +- lib/wallets/wallet/impl/solana_wallet.dart | 39 +-- lib/wallets/wallet/impl/stellar_wallet.dart | 47 ++- .../impl/sub_wallets/eth_token_wallet.dart | 50 +-- lib/wallets/wallet/impl/tezos_wallet.dart | 59 ++-- .../intermediate/lib_monero_wallet.dart | 93 +++--- .../epiccash_wallet_info_extension.dart | 5 +- lib/wallets/wallet/wallet.dart | 20 +- .../bcash_interface.dart | 9 +- .../cash_fusion_interface.dart | 15 +- .../electrumx_interface.dart | 285 ++++++++---------- .../lelantus_interface.dart | 110 +++---- .../nano_interface.dart | 28 +- .../ordinals_interface.dart | 10 +- .../paynym_interface.dart | 56 ++-- .../rbf_interface.dart | 14 +- .../spark_interface.dart | 65 ++-- .../desktop/qr_code_scanner_dialog.dart | 56 ++-- lib/widgets/textfields/frost_step_field.dart | 12 +- lib/widgets/wallet_card.dart | 3 +- 156 files changed, 1572 insertions(+), 1923 deletions(-) diff --git a/lib/db/db_version_migration.dart b/lib/db/db_version_migration.dart index 7fc07c2bb..e18c4b720 100644 --- a/lib/db/db_version_migration.dart +++ b/lib/db/db_version_migration.dart @@ -45,10 +45,7 @@ class DbVersionMigrator with WalletDB { // safe to skip to v11 for campfire fromVersion = 11; } - Logging.instance.logd( - "Running migrate fromVersion $fromVersion", - level: LogLevel.Warning, - ); + Logging.instance.i("Running migrate fromVersion $fromVersion"); switch (fromVersion) { case 0: await DB.instance.hive.openBox(DB.boxNameAllWalletsData); @@ -102,12 +99,13 @@ class DbVersionMigrator with WalletDB { try { latestSetId = await client.getLelantusLatestCoinId(); - } catch (e) { + } catch (e, s) { // default to 2 for now latestSetId = 2; - Logging.instance.logd( + Logging.instance.w( "Failed to fetch latest coin id during firo db migrate: $e \nUsing a default value of 2", - level: LogLevel.Warning, + error: e, + stackTrace: s, ); } } diff --git a/lib/db/hive/db.dart b/lib/db/hive/db.dart index be289d4cd..0e9449094 100644 --- a/lib/db/hive/db.dart +++ b/lib/db/hive/db.dart @@ -166,9 +166,10 @@ class DB { AppConfig.getCryptoCurrencyFor(jsonObject["coin"] as String); return false; } catch (e, s) { - Logging.instance.logd( + Logging.instance.e( "Error, ${jsonObject["coin"]} does not exist, $name wallet cannot be loaded", - level: LogLevel.Error, + error: e, + stackTrace: s, ); return true; } @@ -343,7 +344,7 @@ class DB { await DB.instance.deleteBoxFromDisk(boxName: "theme"); return true; } catch (e, s) { - Logging.instance.logd("$e $s", level: LogLevel.Error); + Logging.instance.e("$e $s", error: e, stackTrace: s); return false; } } diff --git a/lib/db/sqlite/firo_cache.dart b/lib/db/sqlite/firo_cache.dart index a3b2b8359..c2ebbfe66 100644 --- a/lib/db/sqlite/firo_cache.dart +++ b/lib/db/sqlite/firo_cache.dart @@ -2,7 +2,6 @@ import 'dart:async'; import 'dart:io'; import 'dart:isolate'; -import 'package:flutter/foundation.dart'; import 'package:flutter_libsparkmobile/flutter_libsparkmobile.dart'; import 'package:mutex/mutex.dart'; import 'package:sqlite3/sqlite3.dart'; @@ -20,16 +19,6 @@ part 'firo_cache_reader.dart'; part 'firo_cache_worker.dart'; part 'firo_cache_writer.dart'; -/// Temporary debugging log function for this file -void _debugLog(Object? object) { - if (kDebugMode) { - Logging.instance.logd( - object, - level: LogLevel.Debug, - ); - } -} - abstract class _FiroCache { static const int _setCacheVersion = 2; static const int _tagsCacheVersion = 2; @@ -116,7 +105,8 @@ abstract class _FiroCache { VACUUM; """, ); - _debugLog( + + Logging.instance.d( "_deleteAllCache() " "duration = ${DateTime.now().difference(start)}", ); diff --git a/lib/db/sqlite/firo_cache_coordinator.dart b/lib/db/sqlite/firo_cache_coordinator.dart index 84ad64b23..6adeba520 100644 --- a/lib/db/sqlite/firo_cache_coordinator.dart +++ b/lib/db/sqlite/firo_cache_coordinator.dart @@ -42,14 +42,8 @@ abstract class FiroCacheCoordinator { ? await usedTagsCacheFile.length() : 0; - Logging.instance.logd( - "Spark cache used tags size: $tagsSize", - level: LogLevel.Debug, - ); - Logging.instance.logd( - "Spark cache anon set size: $setSize", - level: LogLevel.Debug, - ); + Logging.instance.d("Spark cache used tags size: $tagsSize"); + Logging.instance.d("Spark cache anon set size: $setSize"); final int bytes = tagsSize + setSize; @@ -111,10 +105,7 @@ abstract class FiroCacheCoordinator { progressUpdated?.call(prevSize, meta.size); if (prevMeta?.blockHash == meta.blockHash) { - Logging.instance.logd( - "prevMeta?.blockHash == meta.blockHash", - level: LogLevel.Debug, - ); + Logging.instance.d("prevMeta?.blockHash == meta.blockHash"); return; } diff --git a/lib/electrumx_rpc/cached_electrumx_client.dart b/lib/electrumx_rpc/cached_electrumx_client.dart index 558561f13..c3b8ab56a 100644 --- a/lib/electrumx_rpc/cached_electrumx_client.dart +++ b/lib/electrumx_rpc/cached_electrumx_client.dart @@ -100,17 +100,17 @@ class CachedElectrumXClient { } // save set to db await box.put(groupId, set); - Logging.instance.logd( + Logging.instance.d( "Updated current anonymity set for ${cryptoCurrency.identifier} with group ID $groupId", - level: LogLevel.Info, ); } return set; } catch (e, s) { - Logging.instance.logd( - "Failed to process CachedElectrumX.getAnonymitySet(): $e\n$s", - level: LogLevel.Error, + Logging.instance.e( + "Failed to process CachedElectrumX.getAnonymitySet(): ", + error: e, + stackTrace: s, ); rethrow; } @@ -155,16 +155,17 @@ class CachedElectrumXClient { await box.put(txHash, result); } - // Logging.instance.log("using fetched result", level: LogLevel.Info); + // Logging.instance.log("using fetched result"); return result; } else { - // Logging.instance.log("using cached result", level: LogLevel.Info); + // Logging.instance.log("using cached result"); return Map.from(cachedTx); } } catch (e, s) { - Logging.instance.logd( - "Failed to process CachedElectrumX.getTransaction(): $e\n$s", - level: LogLevel.Error, + Logging.instance.e( + "Failed to process CachedElectrumX.getTransaction(): ", + error: e, + stackTrace: s, ); rethrow; } @@ -212,9 +213,10 @@ class CachedElectrumXClient { return resultingList; } catch (e, s) { - Logging.instance.logd( - "Failed to process CachedElectrumX.getUsedCoinSerials(): $e\n$s", - level: LogLevel.Error, + Logging.instance.e( + "Failed to process CachedElectrumX.getUsedCoinSerials(): ", + error: e, + stackTrace: s, ); rethrow; } diff --git a/lib/electrumx_rpc/client_manager.dart b/lib/electrumx_rpc/client_manager.dart index 3199b840f..8cd9d5324 100644 --- a/lib/electrumx_rpc/client_manager.dart +++ b/lib/electrumx_rpc/client_manager.dart @@ -69,9 +69,10 @@ class ClientManager { _heightCompleters[key]!.complete(event.height); } }, - onError: (Object err, StackTrace s) => Logging.instance.logd( - "ClientManager listen: $err\n$s", - level: LogLevel.Error, + onError: (Object err, StackTrace s) => Logging.instance.e( + "ClientManager listen", + error: err, + stackTrace: s, ), ); } diff --git a/lib/electrumx_rpc/electrumx_client.dart b/lib/electrumx_rpc/electrumx_client.dart index 92bc7ab8a..2691adf5a 100644 --- a/lib/electrumx_rpc/electrumx_client.dart +++ b/lib/electrumx_rpc/electrumx_client.dart @@ -233,10 +233,9 @@ class ElectrumXClient { if (!_prefs.torKillSwitch) { // Then we'll just proceed and connect to ElectrumX through // clearnet at the bottom of this function. - Logging.instance.logd( + Logging.instance.w( "Tor preference set but Tor is not enabled, killswitch not set," " connecting to Electrum adapter through clearnet", - level: LogLevel.Warning, ); } else { // ... But if the killswitch is set, then we throw an exception. @@ -398,9 +397,13 @@ class ElectrumXClient { } else { rethrow; } - } catch (e) { + } catch (e, s) { final errorMessage = e.toString(); - Logging.instance.logd("$host $e", level: LogLevel.Debug); + Logging.instance.w( + "$host $e", + error: e, + stackTrace: s, + ); if (errorMessage.contains("JSON-RPC error")) { currentFailoverIndex = _failovers.length; } @@ -535,9 +538,8 @@ class ElectrumXClient { ).timeout( const Duration(seconds: 30), onTimeout: () { - Logging.instance.logd( + Logging.instance.d( "ElectrumxClient.ping timed out with retryCount=$retryCount, host=$_host", - level: LogLevel.Debug, ); }, ) as bool; @@ -562,10 +564,7 @@ class ElectrumXClient { command: 'blockchain.headers.subscribe', ); if (response == null) { - Logging.instance.logd( - "getBlockHeadTip returned null response", - level: LogLevel.Error, - ); + Logging.instance.e("getBlockHeadTip returned null response"); throw 'getBlockHeadTip returned null response'; } return Map.from(response as Map); @@ -756,14 +755,15 @@ class ElectrumXClient { try { final data = List>.from(response[i] as List); result.add(data); - } catch (e) { + } catch (e, s) { // to ensure we keep same length of responses as requests/args // add empty list on error result.add([]); - Logging.instance.logd( + Logging.instance.e( "getBatchUTXOs failed to parse response=${response[i]}: $e", - level: LogLevel.Error, + error: e, + stackTrace: s, ); } } @@ -826,15 +826,13 @@ class ElectrumXClient { bool verbose = true, String? requestID, }) async { - Logging.instance.logd( + Logging.instance.d( "attempting to fetch blockchain.transaction.get...", - level: LogLevel.Info, ); await checkElectrumAdapter(); final dynamic response = await getElectrumAdapter()!.getTransaction(txHash); - Logging.instance.logd( + Logging.instance.d( "Fetching blockchain.transaction.get finished", - level: LogLevel.Info, ); if (!verbose) { @@ -863,17 +861,15 @@ class ElectrumXClient { String blockhash = "", String? requestID, }) async { - Logging.instance.logd( + Logging.instance.d( "attempting to fetch lelantus.getanonymityset...", - level: LogLevel.Info, ); await checkElectrumAdapter(); final Map response = await (getElectrumAdapter() as FiroElectrumClient) .getLelantusAnonymitySet(groupId: groupId, blockHash: blockhash); - Logging.instance.logd( + Logging.instance.d( "Fetching lelantus.getanonymityset finished", - level: LogLevel.Info, ); return response; } @@ -886,16 +882,14 @@ class ElectrumXClient { dynamic mints, String? requestID, }) async { - Logging.instance.logd( + Logging.instance.d( "attempting to fetch lelantus.getmintmetadata...", - level: LogLevel.Info, ); await checkElectrumAdapter(); final dynamic response = await (getElectrumAdapter() as FiroElectrumClient) .getLelantusMintData(mints: mints); - Logging.instance.logd( + Logging.instance.d( "Fetching lelantus.getmintmetadata finished", - level: LogLevel.Info, ); return response; } @@ -906,9 +900,8 @@ class ElectrumXClient { String? requestID, required int startNumber, }) async { - Logging.instance.logd( + Logging.instance.d( "attempting to fetch lelantus.getusedcoinserials...", - level: LogLevel.Info, ); await checkElectrumAdapter(); @@ -919,9 +912,8 @@ class ElectrumXClient { response = await (getElectrumAdapter() as FiroElectrumClient) .getLelantusUsedCoinSerials(startNumber: startNumber); // TODO add 2 minute timeout. - Logging.instance.logd( + Logging.instance.d( "Fetching lelantus.getusedcoinserials finished", - level: LogLevel.Info, ); retryCount--; @@ -934,16 +926,14 @@ class ElectrumXClient { /// /// ex: 1 Future getLelantusLatestCoinId({String? requestID}) async { - Logging.instance.logd( + Logging.instance.d( "attempting to fetch lelantus.getlatestcoinid...", - level: LogLevel.Info, ); await checkElectrumAdapter(); final int response = await (getElectrumAdapter() as FiroElectrumClient).getLatestCoinId(); - Logging.instance.logd( + Logging.instance.d( "Fetching lelantus.getlatestcoinid finished", - level: LogLevel.Info, ); return response; } @@ -977,12 +967,11 @@ class ElectrumXClient { coinGroupId: coinGroupId, startBlockHash: startBlockHash, ); - Logging.instance.logd( + Logging.instance.d( "Finished ElectrumXClient.getSparkAnonymitySet(coinGroupId" "=$coinGroupId, startBlockHash=$startBlockHash). " "coins.length: ${(response["coins"] as List?)?.length}" "Duration=${DateTime.now().difference(start)}", - level: LogLevel.Info, ); return response; } catch (e) { @@ -1020,7 +1009,7 @@ class ElectrumXClient { // ); // // return tags; - // } catch (e) { + // } catch (e, s) { // Logging.instance.log(e, level: LogLevel.Error); // rethrow; // } @@ -1055,7 +1044,7 @@ class ElectrumXClient { // level: LogLevel.Info, // ); // return List>.from(response); - // } catch (e) { + // } catch (e, s) { // Logging.instance.log(e, level: LogLevel.Error); // rethrow; // } @@ -1068,20 +1057,22 @@ class ElectrumXClient { String? requestID, }) async { try { - Logging.instance.logd( + Logging.instance.d( "attempting to fetch spark.getsparklatestcoinid...", - level: LogLevel.Info, ); await checkElectrumAdapter(); final int response = await (getElectrumAdapter() as FiroElectrumClient) .getSparkLatestCoinId(); - Logging.instance.logd( + Logging.instance.d( "Fetching spark.getsparklatestcoinid finished", - level: LogLevel.Info, ); return response; - } catch (e) { - Logging.instance.logd(e, level: LogLevel.Error); + } catch (e, s) { + Logging.instance.e( + e, + error: e, + stackTrace: s, + ); rethrow; } } @@ -1101,15 +1092,18 @@ class ElectrumXClient { .map((e) => e.toHexReversedFromBase64) .toSet(); - Logging.instance.logd( + Logging.instance.d( "Finished ElectrumXClient.getMempoolTxids(). " "Duration=${DateTime.now().difference(start)}", - level: LogLevel.Info, ); return txids; - } catch (e) { - Logging.instance.logd(e, level: LogLevel.Error); + } catch (e, s) { + Logging.instance.e( + e, + error: e, + stackTrace: s, + ); rethrow; } } @@ -1146,15 +1140,14 @@ class ElectrumXClient { ); } - Logging.instance.logd( + Logging.instance.d( "Finished ElectrumXClient.getMempoolSparkData(txids: $txids). " "Duration=${DateTime.now().difference(start)}", - level: LogLevel.Info, ); return result; } catch (e, s) { - Logging.instance.logd("$e\n$s", level: LogLevel.Error); + Logging.instance.e("$e\n$s", error: e, stackTrace: s); rethrow; } } @@ -1178,16 +1171,19 @@ class ElectrumXClient { final map = Map.from(response as Map); final tags = List>.from(map["tagsandtxids"] as List); - Logging.instance.logd( + Logging.instance.d( "Finished ElectrumXClient.getSparkUnhashedUsedCoinsTagsWithTxHashes(" "startNumber=$startNumber). # of tags fetched=${tags.length}, " "Duration=${DateTime.now().difference(start)}", - level: LogLevel.Info, ); return tags; - } catch (e) { - Logging.instance.logd(e, level: LogLevel.Error); + } catch (e, s) { + Logging.instance.e( + e, + error: e, + stackTrace: s, + ); rethrow; } } @@ -1199,9 +1195,8 @@ class ElectrumXClient { }) async { try { const command = "spark.getsparkanonymitysetmeta"; - Logging.instance.logd( + Logging.instance.d( "[${getElectrumAdapter()?.host}] => attempting to fetch $command...", - level: LogLevel.Info, ); final start = DateTime.now(); @@ -1222,18 +1217,21 @@ class ElectrumXClient { size: map["size"] as int, ); - Logging.instance.logd( + Logging.instance.d( "Finished ElectrumXClient.getSparkAnonymitySetMeta(" "requestID=$requestID, " "coinGroupId=$coinGroupId" "). Set meta=$result, " "Duration=${DateTime.now().difference(start)}", - level: LogLevel.Debug, ); return result; - } catch (e) { - Logging.instance.logd(e, level: LogLevel.Error); + } catch (e, s) { + Logging.instance.e( + e, + error: e, + stackTrace: s, + ); rethrow; } } @@ -1264,7 +1262,7 @@ class ElectrumXClient { final result = map["coins"] as List; - Logging.instance.logd( + Logging.instance.d( "Finished ElectrumXClient.getSparkAnonymitySetBySector(" "requestID=$requestID, " "coinGroupId=$coinGroupId, " @@ -1273,12 +1271,15 @@ class ElectrumXClient { "endIndex=$endIndex" "). # of coins=${result.length}, " "Duration=${DateTime.now().difference(start)}", - level: LogLevel.Debug, ); return result; - } catch (e) { - Logging.instance.logd(e, level: LogLevel.Error); + } catch (e, s) { + Logging.instance.e( + e, + error: e, + stackTrace: s, + ); rethrow; } } @@ -1301,16 +1302,19 @@ class ElectrumXClient { ], ); - Logging.instance.logd( + Logging.instance.d( "Finished ElectrumXClient.isMasterNodeCollateral, " "response: $response, " "Duration=${DateTime.now().difference(start)}", - level: LogLevel.Info, ); return response as bool; - } catch (e) { - Logging.instance.logd(e, level: LogLevel.Error); + } catch (e, s) { + Logging.instance.e( + e, + error: e, + stackTrace: s, + ); rethrow; } } @@ -1369,7 +1373,7 @@ class ElectrumXClient { } catch (e, s) { final String msg = "Error parsing fee rate. Response: $response" "\nResult: $response\nError: $e\nStack trace: $s"; - Logging.instance.logd(msg, level: LogLevel.Fatal); + Logging.instance.e(msg, error: e, stackTrace: s); throw Exception(msg); } } catch (e) { diff --git a/lib/electrumx_rpc/subscribable_electrumx_client.dart b/lib/electrumx_rpc/subscribable_electrumx_client.dart index f06771906..8c3e1849b 100644 --- a/lib/electrumx_rpc/subscribable_electrumx_client.dart +++ b/lib/electrumx_rpc/subscribable_electrumx_client.dart @@ -503,7 +503,7 @@ // _responseHandler(response); // } catch (e, s) { // Logging.instance -// .log("JsonRPC jsonDecode: $e\n$s", level: LogLevel.Error); +// .log("JsonRPC jsonDecode", error: e, stackTrace: s,); // rethrow; // } finally { // _responseData = []; diff --git a/lib/main.dart b/lib/main.dart index 43e076879..fde2ce42a 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -209,10 +209,10 @@ void main(List args) async { ), ); } catch (e, s) { - Logging.instance.logd( - "Cannot migrate mobile database\n$e $s", - level: LogLevel.Error, - printFullLength: true, + Logging.instance.w( + "Cannot migrate mobile database", + error: e, + stackTrace: s, ); } } @@ -558,9 +558,8 @@ class _MaterialAppWithThemeState extends ConsumerState // call reset to clear cached value await resetOpenPath(); - Logging.instance.logd( + Logging.instance.d( "This is the .swb content from intent: ${ref.read(openedFromSWBFileStringStateProvider.state).state}", - level: LogLevel.Info, ); } diff --git a/lib/models/exchange/change_now/cn_exchange_estimate.dart b/lib/models/exchange/change_now/cn_exchange_estimate.dart index c1aa4e7fb..b5d75a40e 100644 --- a/lib/models/exchange/change_now/cn_exchange_estimate.dart +++ b/lib/models/exchange/change_now/cn_exchange_estimate.dart @@ -113,8 +113,11 @@ class CNExchangeEstimate { toAmount: Decimal.parse(json["toAmount"].toString()), ); } catch (e, s) { - Logging.instance - .logd("Failed to parse: $json \n$e\n$s", level: LogLevel.Fatal); + Logging.instance.e( + "Failed to parse: $json", + error: e, + stackTrace: s, + ); rethrow; } } diff --git a/lib/models/exchange/change_now/estimated_exchange_amount.dart b/lib/models/exchange/change_now/estimated_exchange_amount.dart index 9cc634215..62eee2f60 100644 --- a/lib/models/exchange/change_now/estimated_exchange_amount.dart +++ b/lib/models/exchange/change_now/estimated_exchange_amount.dart @@ -57,8 +57,11 @@ class EstimatedExchangeAmount { networkFee: Decimal.tryParse(json["networkFee"].toString()), ); } catch (e, s) { - Logging.instance - .logd("Failed to parse: $json \n$e\n$s", level: LogLevel.Fatal); + Logging.instance.e( + "Failed to parse: $json", + error: e, + stackTrace: s, + ); rethrow; } } diff --git a/lib/models/exchange/change_now/exchange_transaction_status.dart b/lib/models/exchange/change_now/exchange_transaction_status.dart index 055a3757c..7874b8b80 100644 --- a/lib/models/exchange/change_now/exchange_transaction_status.dart +++ b/lib/models/exchange/change_now/exchange_transaction_status.dart @@ -187,7 +187,7 @@ class ExchangeTransactionStatus { }); factory ExchangeTransactionStatus.fromJson(Map json) { - Logging.instance.logd(json, printFullLength: true, level: LogLevel.Info); + Logging.instance.d(json, stackTrace: StackTrace.current); try { return ExchangeTransactionStatus( status: changeNowTransactionStatusFromStringIgnoreCase( @@ -228,7 +228,7 @@ class ExchangeTransactionStatus { payload: json["payload"] as Object?, ); } catch (e, s) { - Logging.instance.logd("$e\n$s", level: LogLevel.Fatal); + Logging.instance.f("", error: e, stackTrace: s); rethrow; } } diff --git a/lib/models/exchange/response_objects/estimate.dart b/lib/models/exchange/response_objects/estimate.dart index eddcd4c5d..233959277 100644 --- a/lib/models/exchange/response_objects/estimate.dart +++ b/lib/models/exchange/response_objects/estimate.dart @@ -47,8 +47,11 @@ class Estimate { kycRating: kycRating, ); } catch (e, s) { - Logging.instance - .logd("Estimate.fromMap(): $e\n$s", level: LogLevel.Error); + Logging.instance.e( + "Estimate.fromMap()", + error: e, + stackTrace: s, + ); rethrow; } } diff --git a/lib/models/exchange/response_objects/fixed_rate_market.dart b/lib/models/exchange/response_objects/fixed_rate_market.dart index faa9d4268..a52fe5768 100644 --- a/lib/models/exchange/response_objects/fixed_rate_market.dart +++ b/lib/models/exchange/response_objects/fixed_rate_market.dart @@ -54,10 +54,7 @@ class FixedRateMarket { minerFee: Decimal.tryParse(json["minerFee"].toString()), ); } catch (e, s) { - Logging.instance.logd( - "FixedRateMarket.fromMap(): $e\n$s", - level: LogLevel.Error, - ); + Logging.instance.e("FixedRateMarket.fromMap(): ", error: e, stackTrace: s); rethrow; } } diff --git a/lib/models/exchange/simpleswap/sp_currency.dart b/lib/models/exchange/simpleswap/sp_currency.dart index 17bd6ebf5..9de40720f 100644 --- a/lib/models/exchange/simpleswap/sp_currency.dart +++ b/lib/models/exchange/simpleswap/sp_currency.dart @@ -59,10 +59,7 @@ class SPCurrency { warningsTo: json["warnings_to"] as List, ); } catch (e, s) { - Logging.instance.logd( - "SPCurrency.fromJson failed to parse: $e\n$s", - level: LogLevel.Error, - ); + Logging.instance.e("SPCurrency.fromJson failed to parse: ", error: e, stackTrace: s); rethrow; } } diff --git a/lib/models/isar/stack_theme.dart b/lib/models/isar/stack_theme.dart index d7b8023b9..efa2f7d05 100644 --- a/lib/models/isar/stack_theme.dart +++ b/lib/models/isar/stack_theme.dart @@ -13,6 +13,7 @@ import 'dart:io'; import 'package:flutter/material.dart'; import 'package:isar/isar.dart'; + import '../../app_config.dart'; import '../../utilities/extensions/impl/box_shadow.dart'; import '../../utilities/extensions/impl/gradient.dart'; @@ -1884,10 +1885,7 @@ class StackTheme { (map[mainNetId] as String).toBigIntFromHex.toInt(), ); } else { - Logging.instance.logd( - "Color not found in theme for $mainNetId", - level: LogLevel.Error, - ); + Logging.instance.w("Color not found in theme for $mainNetId"); } } diff --git a/lib/networking/http.dart b/lib/networking/http.dart index fcb8beea3..80ea57c37 100644 --- a/lib/networking/http.dart +++ b/lib/networking/http.dart @@ -53,10 +53,7 @@ class HTTP { response.statusCode, ); } catch (e, s) { - Logging.instance.logd( - "HTTP.get() rethrew: $e\n$s", - level: LogLevel.Info, - ); + Logging.instance.w("HTTP.get() rethrew: ", error: e, stackTrace: s); rethrow; } finally { httpClient.close(force: true); @@ -99,10 +96,7 @@ class HTTP { response.statusCode, ); } catch (e, s) { - Logging.instance.logd( - "HTTP.post() rethrew: $e\n$s", - level: LogLevel.Info, - ); + Logging.instance.w("HTTP.post() rethrew: ", error: e, stackTrace: s); rethrow; } finally { httpClient.close(force: true); @@ -119,9 +113,10 @@ class HTTP { onDone: () => completer.complete( Uint8List.fromList(bytes), ), - onError: (Object err, StackTrace s) => Logging.instance.logd( - "Http wrapper layer listen: $err\n$s", - level: LogLevel.Error, + onError: (Object err, StackTrace s) => Logging.instance.e( + "Http wrapper layer listen", + error: err, + stackTrace: s, ), ); return completer.future; diff --git a/lib/pages/add_wallet_views/frost_ms/new/steps/frost_create_step_2.dart b/lib/pages/add_wallet_views/frost_ms/new/steps/frost_create_step_2.dart index 0c7c666be..d8aae6d6d 100644 --- a/lib/pages/add_wallet_views/frost_ms/new/steps/frost_create_step_2.dart +++ b/lib/pages/add_wallet_views/frost_ms/new/steps/frost_create_step_2.dart @@ -178,10 +178,7 @@ class _FrostCreateStep2State extends ConsumerState { .routeName, ); } catch (e, s) { - Logging.instance.logd( - "$e\n$s", - level: LogLevel.Fatal, - ); + Logging.instance.f("$e\n$s", error: e, stackTrace: s,); if (context.mounted) { return await showDialog( context: context, diff --git a/lib/pages/add_wallet_views/frost_ms/new/steps/frost_create_step_3.dart b/lib/pages/add_wallet_views/frost_ms/new/steps/frost_create_step_3.dart index e1d7c081e..ec565cb59 100644 --- a/lib/pages/add_wallet_views/frost_ms/new/steps/frost_create_step_3.dart +++ b/lib/pages/add_wallet_views/frost_ms/new/steps/frost_create_step_3.dart @@ -178,10 +178,7 @@ class _FrostCreateStep3State extends ConsumerState { .routeName, ); } catch (e, s) { - Logging.instance.logd( - "$e\n$s", - level: LogLevel.Fatal, - ); + Logging.instance.f("$e\n$s", error: e, stackTrace: s,); if (context.mounted) { return await showDialog( diff --git a/lib/pages/add_wallet_views/frost_ms/new/steps/frost_create_step_5.dart b/lib/pages/add_wallet_views/frost_ms/new/steps/frost_create_step_5.dart index fed7cf360..3c59c7524 100644 --- a/lib/pages/add_wallet_views/frost_ms/new/steps/frost_create_step_5.dart +++ b/lib/pages/add_wallet_views/frost_ms/new/steps/frost_create_step_5.dart @@ -219,10 +219,7 @@ class _FrostCreateStep5State extends ConsumerState { ); } } catch (e, s) { - Logging.instance.logd( - "$e\n$s", - level: LogLevel.Fatal, - ); + Logging.instance.f("$e\n$s", error: e, stackTrace: s,); // pop progress dialog if (context.mounted && !progressPopped) { diff --git a/lib/pages/add_wallet_views/frost_ms/reshare/frost_reshare_step_1a.dart b/lib/pages/add_wallet_views/frost_ms/reshare/frost_reshare_step_1a.dart index 36d7138c0..740baafc3 100644 --- a/lib/pages/add_wallet_views/frost_ms/reshare/frost_reshare_step_1a.dart +++ b/lib/pages/add_wallet_views/frost_ms/reshare/frost_reshare_step_1a.dart @@ -81,10 +81,7 @@ class _FrostReshareStep1aState extends ConsumerState { ); } } catch (e, s) { - Logging.instance.logd( - "$e\n$s", - level: LogLevel.Fatal, - ); + Logging.instance.f("$e\n$s", error: e, stackTrace: s,); if (mounted) { await showDialog( diff --git a/lib/pages/add_wallet_views/frost_ms/reshare/frost_reshare_step_1b.dart b/lib/pages/add_wallet_views/frost_ms/reshare/frost_reshare_step_1b.dart index 4dc485795..7224e2acb 100644 --- a/lib/pages/add_wallet_views/frost_ms/reshare/frost_reshare_step_1b.dart +++ b/lib/pages/add_wallet_views/frost_ms/reshare/frost_reshare_step_1b.dart @@ -117,10 +117,7 @@ class _FrostReshareStep1bState extends ConsumerState { ); } } catch (e, s) { - Logging.instance.logd( - "$e\n$s", - level: LogLevel.Fatal, - ); + Logging.instance.f("$e\n$s", error: e, stackTrace: s,); if (mounted) { await showDialog( diff --git a/lib/pages/add_wallet_views/frost_ms/reshare/frost_reshare_step_1c.dart b/lib/pages/add_wallet_views/frost_ms/reshare/frost_reshare_step_1c.dart index 4432ebd0d..b10730c3a 100644 --- a/lib/pages/add_wallet_views/frost_ms/reshare/frost_reshare_step_1c.dart +++ b/lib/pages/add_wallet_views/frost_ms/reshare/frost_reshare_step_1c.dart @@ -204,10 +204,7 @@ class _FrostReshareStep1cState extends ConsumerState { ); } } catch (e, s) { - Logging.instance.logd( - "$e\n$s", - level: LogLevel.Fatal, - ); + Logging.instance.f("$e\n$s", error: e, stackTrace: s,); if (context.mounted) { await showDialog( diff --git a/lib/pages/add_wallet_views/frost_ms/reshare/frost_reshare_step_2abd.dart b/lib/pages/add_wallet_views/frost_ms/reshare/frost_reshare_step_2abd.dart index 3a2a7a64e..b54b6041b 100644 --- a/lib/pages/add_wallet_views/frost_ms/reshare/frost_reshare_step_2abd.dart +++ b/lib/pages/add_wallet_views/frost_ms/reshare/frost_reshare_step_2abd.dart @@ -79,10 +79,7 @@ class _FrostReshareStep2abdState extends ConsumerState { .routeName, ); } catch (e, s) { - Logging.instance.logd( - "$e\n$s", - level: LogLevel.Fatal, - ); + Logging.instance.f("$e\n$s", error: e, stackTrace: s,); if (mounted) { await showDialog( diff --git a/lib/pages/add_wallet_views/frost_ms/reshare/frost_reshare_step_2c.dart b/lib/pages/add_wallet_views/frost_ms/reshare/frost_reshare_step_2c.dart index fe53e562b..92a3a195b 100644 --- a/lib/pages/add_wallet_views/frost_ms/reshare/frost_reshare_step_2c.dart +++ b/lib/pages/add_wallet_views/frost_ms/reshare/frost_reshare_step_2c.dart @@ -59,10 +59,7 @@ class _FrostReshareStep2cState extends ConsumerState { .routeName, ); } catch (e, s) { - Logging.instance.logd( - "$e\n$s", - level: LogLevel.Fatal, - ); + Logging.instance.f("$e\n$s", error: e, stackTrace: s,); if (mounted) { await showDialog( diff --git a/lib/pages/add_wallet_views/frost_ms/reshare/frost_reshare_step_3abd.dart b/lib/pages/add_wallet_views/frost_ms/reshare/frost_reshare_step_3abd.dart index e027d294c..d4fc876c1 100644 --- a/lib/pages/add_wallet_views/frost_ms/reshare/frost_reshare_step_3abd.dart +++ b/lib/pages/add_wallet_views/frost_ms/reshare/frost_reshare_step_3abd.dart @@ -70,10 +70,7 @@ class _FrostReshareStep3abdState extends ConsumerState { .routeName, ); } catch (e, s) { - Logging.instance.logd( - "$e\n$s", - level: LogLevel.Fatal, - ); + Logging.instance.f("$e\n$s", error: e, stackTrace: s,); if (mounted) { await showDialog( context: context, diff --git a/lib/pages/add_wallet_views/frost_ms/reshare/frost_reshare_step_4.dart b/lib/pages/add_wallet_views/frost_ms/reshare/frost_reshare_step_4.dart index c3147c656..dd081d121 100644 --- a/lib/pages/add_wallet_views/frost_ms/reshare/frost_reshare_step_4.dart +++ b/lib/pages/add_wallet_views/frost_ms/reshare/frost_reshare_step_4.dart @@ -88,10 +88,7 @@ class _FrostReshareStep4State extends ConsumerState { ); } } catch (e, s) { - Logging.instance.logd( - "$e\n$s", - level: LogLevel.Fatal, - ); + Logging.instance.f("$e\n$s", error: e, stackTrace: s,); if (mounted) { await showDialog( context: context, diff --git a/lib/pages/add_wallet_views/frost_ms/reshare/frost_reshare_step_5.dart b/lib/pages/add_wallet_views/frost_ms/reshare/frost_reshare_step_5.dart index ce9f250f2..83fa55944 100644 --- a/lib/pages/add_wallet_views/frost_ms/reshare/frost_reshare_step_5.dart +++ b/lib/pages/add_wallet_views/frost_ms/reshare/frost_reshare_step_5.dart @@ -104,10 +104,7 @@ class _FrostReshareStep5State extends ConsumerState { } } } catch (e, s) { - Logging.instance.logd( - "$e\n$s", - level: LogLevel.Fatal, - ); + Logging.instance.f("$e\n$s", error: e, stackTrace: s,); if (mounted) { await showDialog( context: context, diff --git a/lib/pages/add_wallet_views/frost_ms/restore/restore_frost_ms_wallet_view.dart b/lib/pages/add_wallet_views/frost_ms/restore/restore_frost_ms_wallet_view.dart index f7aec5a82..88f7c3b26 100644 --- a/lib/pages/add_wallet_views/frost_ms/restore/restore_frost_ms_wallet_view.dart +++ b/lib/pages/add_wallet_views/frost_ms/restore/restore_frost_ms_wallet_view.dart @@ -171,9 +171,10 @@ class _RestoreFrostMsWalletViewState ); } } catch (e, s) { - Logging.instance.logd( - "$e\n$s", - level: LogLevel.Fatal, + Logging.instance.e( + "", + error: e, + stackTrace: s, ); if (mounted) { @@ -234,9 +235,8 @@ class _RestoreFrostMsWalletViewState ); if (qrResult == null) { - Logging.instance.logd( + Logging.instance.d( "Qr scanning cancelled", - level: LogLevel.Info, ); } else { // TODO [prio=low]: Validate QR code data. @@ -248,9 +248,10 @@ class _RestoreFrostMsWalletViewState } } } on PlatformException catch (e, s) { - Logging.instance.logd( - "Failed to get camera permissions while trying to scan qr code: $e\n$s", - level: LogLevel.Warning, + Logging.instance.w( + "Failed to get camera permissions while trying to scan qr code: ", + error: e, + stackTrace: s, ); } } diff --git a/lib/pages/add_wallet_views/new_wallet_recovery_phrase_warning_view/new_wallet_recovery_phrase_warning_view.dart b/lib/pages/add_wallet_views/new_wallet_recovery_phrase_warning_view/new_wallet_recovery_phrase_warning_view.dart index 034cb6dbc..1ab649f26 100644 --- a/lib/pages/add_wallet_views/new_wallet_recovery_phrase_warning_view/new_wallet_recovery_phrase_warning_view.dart +++ b/lib/pages/add_wallet_views/new_wallet_recovery_phrase_warning_view/new_wallet_recovery_phrase_warning_view.dart @@ -274,10 +274,7 @@ class _NewWalletRecoveryPhraseWarningViewState return (wallet, fetchedMnemonic); } catch (e, s) { - Logging.instance.logd( - "$e\n$s", - level: LogLevel.Fatal, - ); + Logging.instance.f("$e\n$s", error: e, stackTrace: s,); rethrow; } } diff --git a/lib/pages/add_wallet_views/restore_wallet_view/restore_wallet_view.dart b/lib/pages/add_wallet_views/restore_wallet_view/restore_wallet_view.dart index 06619e582..a5aec4d97 100644 --- a/lib/pages/add_wallet_views/restore_wallet_view/restore_wallet_view.dart +++ b/lib/pages/add_wallet_views/restore_wallet_view/restore_wallet_view.dart @@ -628,24 +628,24 @@ class _RestoreWalletViewState extends ConsumerState { final results = AddressUtils.decodeQRSeedData(qrResult.rawContent); - Logging.instance.logd("scan parsed: $results", level: LogLevel.Info); - if (results["mnemonic"] != null) { final list = (results["mnemonic"] as List) .map((value) => value as String) .toList(growable: false); if (list.isNotEmpty) { _clearAndPopulateMnemonic(list); - Logging.instance.logd("mnemonic populated", level: LogLevel.Info); + Logging.instance.i("mnemonic populated"); } else { - Logging.instance - .logd("mnemonic failed to populate", level: LogLevel.Info); + Logging.instance.i("mnemonic failed to populate"); } } - } on PlatformException catch (e) { + } on PlatformException catch (e, s) { // likely failed to get camera permissions - Logging.instance - .logd("Restore wallet qr scan failed: $e", level: LogLevel.Warning); + Logging.instance.e( + "Restore wallet qr scan failed: $e", + error: e, + stackTrace: s, + ); } } diff --git a/lib/pages/add_wallet_views/restore_wallet_view/sub_widgets/restore_failed_dialog.dart b/lib/pages/add_wallet_views/restore_wallet_view/sub_widgets/restore_failed_dialog.dart index 1f8952c15..7419583e7 100644 --- a/lib/pages/add_wallet_views/restore_wallet_view/sub_widgets/restore_failed_dialog.dart +++ b/lib/pages/add_wallet_views/restore_wallet_view/sub_widgets/restore_failed_dialog.dart @@ -73,11 +73,8 @@ class _RestoreFailedDialogState extends ConsumerState { ref.read(secureStoreProvider), ); } catch (e, s) { - Logging.instance.logd( - "Error while getting wallet info in restore failed dialog\n" - "Error: $e\nStack trace: $s", - level: LogLevel.Error, - ); + Logging.instance.e("Error while getting wallet info in restore failed dialog\n" + "Error: $e\nStack trace: $s"); } finally { if (mounted) { Navigator.of(context).pop(); diff --git a/lib/pages/add_wallet_views/verify_recovery_phrase_view/verify_recovery_phrase_view.dart b/lib/pages/add_wallet_views/verify_recovery_phrase_view/verify_recovery_phrase_view.dart index 1f6177192..b1f5613bb 100644 --- a/lib/pages/add_wallet_views/verify_recovery_phrase_view/verify_recovery_phrase_view.dart +++ b/lib/pages/add_wallet_views/verify_recovery_phrase_view/verify_recovery_phrase_view.dart @@ -306,10 +306,7 @@ class _VerifyRecoveryPhraseViewState throw ex!; } } catch (e, s) { - Logging.instance.logd( - "$e\n$s", - level: LogLevel.Fatal, - ); + Logging.instance.f("$e\n$s", error: e, stackTrace: s,); if (mounted) { await showDialog( diff --git a/lib/pages/address_book_views/subviews/new_contact_address_entry_form.dart b/lib/pages/address_book_views/subviews/new_contact_address_entry_form.dart index dfe2155bd..f1f399f13 100644 --- a/lib/pages/address_book_views/subviews/new_contact_address_entry_form.dart +++ b/lib/pages/address_book_views/subviews/new_contact_address_entry_form.dart @@ -115,10 +115,7 @@ class _NewContactAddressEntryFormState // .read(shouldShowLockscreenOnResumeStateProvider // .state) // .state = true; - Logging.instance.logd( - "Failed to get camera permissions to scan address qr code: $e\n$s", - level: LogLevel.Warning, - ); + Logging.instance.w("Failed to get camera permissions to scan address qr code: ", error: e, stackTrace: s); } } diff --git a/lib/pages/buy_view/buy_form.dart b/lib/pages/buy_view/buy_form.dart index 729e0e1c2..d68a02e4f 100644 --- a/lib/pages/buy_view/buy_form.dart +++ b/lib/pages/buy_view/buy_form.dart @@ -311,10 +311,7 @@ class _BuyFormState extends ConsumerState { .read(simplexProvider) .updateSupportedCryptos(response.value!); // TODO validate } else { - Logging.instance.logd( - "_loadSimplexCurrencies: $response", - level: LogLevel.Warning, - ); + Logging.instance.d("_loadSimplexCurrencies: $response"); } } @@ -326,10 +323,7 @@ class _BuyFormState extends ConsumerState { .read(simplexProvider) .updateSupportedFiats(response.value!); // TODO validate } else { - Logging.instance.logd( - "_loadSimplexCurrencies: $response", - level: LogLevel.Warning, - ); + Logging.instance.d("_loadSimplexCurrencies: $response"); } } @@ -626,10 +620,7 @@ class _BuyFormState extends ConsumerState { ref.read(simplexProvider).updateQuote(response.value!); return BuyResponse(value: response.value!); } else { - Logging.instance.logd( - "_loadQuote: $response", - level: LogLevel.Warning, - ); + Logging.instance.d("_loadQuote: $response"); return BuyResponse( exception: response.exception ?? BuyException( @@ -724,20 +715,14 @@ class _BuyFormState extends ConsumerState { final qrResult = await scanner.scan(); - Logging.instance.logd( - "qrResult content: ${qrResult.rawContent}", - level: LogLevel.Info, - ); + Logging.instance.d("qrResult content: ${qrResult.rawContent}"); final paymentData = AddressUtils.parsePaymentUri( qrResult.rawContent, logging: Logging.instance, ); - Logging.instance.logd( - "qrResult parsed: $paymentData", - level: LogLevel.Info, - ); + Logging.instance.d("qrResult parsed: $paymentData"); if (paymentData != null) { // auto fill address @@ -760,9 +745,10 @@ class _BuyFormState extends ConsumerState { } on PlatformException catch (e, s) { // here we ignore the exception caused by not giving permission // to use the camera to scan a qr code - Logging.instance.logd( - "Failed to get camera permissions while trying to scan qr code in SendView: $e\n$s", - level: LogLevel.Warning, + Logging.instance.e( + "Failed to get camera permissions while trying to scan qr code in SendView: ", + error: e, + stackTrace: s, ); } } @@ -1241,7 +1227,11 @@ class _BuyFormState extends ConsumerState { } }); } catch (e, s) { - Logging.instance.logd("$e\n$s", level: LogLevel.Info); + Logging.instance.w( + "", + error: e, + stackTrace: s, + ); } }, ), diff --git a/lib/pages/buy_view/sub_widgets/crypto_selection_view.dart b/lib/pages/buy_view/sub_widgets/crypto_selection_view.dart index 890ed2cd9..432a3435a 100644 --- a/lib/pages/buy_view/sub_widgets/crypto_selection_view.dart +++ b/lib/pages/buy_view/sub_widgets/crypto_selection_view.dart @@ -304,7 +304,7 @@ class CoinIconForTicker extends ConsumerWidget { height: size, ); } catch (e, s) { - Logging.instance.logd("$e\n$s", level: LogLevel.Fatal); + Logging.instance.f("", error: e, stackTrace: s); rethrow; } } diff --git a/lib/pages/exchange_view/confirm_change_now_send.dart b/lib/pages/exchange_view/confirm_change_now_send.dart index 552b7f3a9..999fca764 100644 --- a/lib/pages/exchange_view/confirm_change_now_send.dart +++ b/lib/pages/exchange_view/confirm_change_now_send.dart @@ -162,10 +162,7 @@ class _ConfirmChangeNowSendViewState Navigator.of(context).popUntil(ModalRoute.withName(routeOnSuccessName)); } } catch (e, s) { - Logging.instance.logd( - "Broadcast transaction failed: $e\n$s", - level: LogLevel.Error, - ); + Logging.instance.e("Broadcast transaction failed: ", error: e, stackTrace: s); // pop sending dialog Navigator.of(context).pop(); diff --git a/lib/pages/exchange_view/exchange_step_views/step_2_view.dart b/lib/pages/exchange_view/exchange_step_views/step_2_view.dart index b2873feb2..951c211b9 100644 --- a/lib/pages/exchange_view/exchange_step_views/step_2_view.dart +++ b/lib/pages/exchange_view/exchange_step_views/step_2_view.dart @@ -98,9 +98,10 @@ class _Step2ViewState extends ConsumerState { }); } } on PlatformException catch (e, s) { - Logging.instance.logd( - "Failed to get camera permissions while trying to scan qr code in SendView: $e\n$s", - level: LogLevel.Warning, + Logging.instance.w( + "Failed to get camera permissions while trying to scan qr code in SendView: ", + error: e, + stackTrace: s, ); } } @@ -135,9 +136,10 @@ class _Step2ViewState extends ConsumerState { }); } } on PlatformException catch (e, s) { - Logging.instance.logd( - "Failed to get camera permissions while trying to scan qr code in SendView: $e\n$s", - level: LogLevel.Warning, + Logging.instance.w( + "Failed to get camera permissions while trying to scan qr code in SendView: ", + error: e, + stackTrace: s, ); } } @@ -303,8 +305,11 @@ class _Step2ViewState extends ConsumerState { } }); } catch (e, s) { - Logging.instance - .logd("$e\n$s", level: LogLevel.Info); + Logging.instance.e( + "", + error: e, + stackTrace: s, + ); } }, ), @@ -543,9 +548,10 @@ class _Step2ViewState extends ConsumerState { }); }); } catch (e, s) { - Logging.instance.logd( + Logging.instance.i( "$e\n$s", - level: LogLevel.Info, + error: e, + stackTrace: s, ); } }, diff --git a/lib/pages/exchange_view/exchange_step_views/step_4_view.dart b/lib/pages/exchange_view/exchange_step_views/step_4_view.dart index 4196fb332..7b867aab3 100644 --- a/lib/pages/exchange_view/exchange_step_views/step_4_view.dart +++ b/lib/pages/exchange_view/exchange_step_views/step_4_view.dart @@ -317,7 +317,7 @@ class _Step4ViewState extends ConsumerState { } } } catch (e, s) { - Logging.instance.logd("$e\n$s", level: LogLevel.Error); + Logging.instance.e("$e\n$s", error: e, stackTrace: s); if (mounted && !wasCancelled) { // pop building dialog Navigator.of(context).pop(); diff --git a/lib/pages/exchange_view/send_from_view.dart b/lib/pages/exchange_view/send_from_view.dart index ec5778e30..59cf20a47 100644 --- a/lib/pages/exchange_view/send_from_view.dart +++ b/lib/pages/exchange_view/send_from_view.dart @@ -387,7 +387,7 @@ class _SendFromCardState extends ConsumerState { } } } catch (e, s) { - Logging.instance.logd("$e\n$s", level: LogLevel.Error); + Logging.instance.e("$e\n$s", error: e, stackTrace: s); if (mounted) { // pop building dialog Navigator.of(context).pop(); diff --git a/lib/pages/exchange_view/sub_widgets/exchange_provider_option.dart b/lib/pages/exchange_view/sub_widgets/exchange_provider_option.dart index 1dc2ca237..ea91dc60f 100644 --- a/lib/pages/exchange_view/sub_widgets/exchange_provider_option.dart +++ b/lib/pages/exchange_view/sub_widgets/exchange_provider_option.dart @@ -173,9 +173,8 @@ class _ExchangeOptionState extends ConsumerState { ], ); } else { - Logging.instance.logd( + Logging.instance.w( "$runtimeType rate unavailable for ${widget.exchange.name}: $data", - level: LogLevel.Warning, ); return Consumer( diff --git a/lib/pages/paynym/subwidgets/paynym_followers_list.dart b/lib/pages/paynym/subwidgets/paynym_followers_list.dart index c362a5dba..857fc9c8a 100644 --- a/lib/pages/paynym/subwidgets/paynym_followers_list.dart +++ b/lib/pages/paynym/subwidgets/paynym_followers_list.dart @@ -93,10 +93,11 @@ class _PaynymFollowersListState extends ConsumerState { ref.read(myPaynymAccountStateProvider.state).state = account.value!; } - } catch (e) { - Logging.instance.logd( + } catch (e, s) { + Logging.instance.w( "Failed pull down refresh of paynym home page: $e", - level: LogLevel.Warning, + error: e, + stackTrace: s, ); } }, diff --git a/lib/pages/paynym/subwidgets/paynym_following_list.dart b/lib/pages/paynym/subwidgets/paynym_following_list.dart index a1cda9b9a..9fa77cebf 100644 --- a/lib/pages/paynym/subwidgets/paynym_following_list.dart +++ b/lib/pages/paynym/subwidgets/paynym_following_list.dart @@ -93,10 +93,11 @@ class _PaynymFollowingListState extends ConsumerState { ref.read(myPaynymAccountStateProvider.state).state = account.value!; } - } catch (e) { - Logging.instance.logd( + } catch (e, s) { + Logging.instance.w( "Failed pull down refresh of paynym home page: $e", - level: LogLevel.Warning, + error: e, + stackTrace: s, ); } }, diff --git a/lib/pages/receive_view/generate_receiving_uri_qr_code_view.dart b/lib/pages/receive_view/generate_receiving_uri_qr_code_view.dart index 9fc8adb41..7b02e525f 100644 --- a/lib/pages/receive_view/generate_receiving_uri_qr_code_view.dart +++ b/lib/pages/receive_view/generate_receiving_uri_qr_code_view.dart @@ -188,10 +188,7 @@ class _GenerateUriQrCodeViewState extends State { queryParams, ); - Logging.instance.logd( - "Generated receiving QR code for: $uriString", - level: LogLevel.Info, - ); + Logging.instance.d("Generated receiving QR code for: $uriString"); return uriString; } diff --git a/lib/pages/send_view/frost_ms/recipient.dart b/lib/pages/send_view/frost_ms/recipient.dart index 5820b7375..ba8b9dbd7 100644 --- a/lib/pages/send_view/frost_ms/recipient.dart +++ b/lib/pages/send_view/frost_ms/recipient.dart @@ -133,20 +133,14 @@ class _RecipientState extends ConsumerState { final qrResult = await ref.read(pBarcodeScanner).scan(); - Logging.instance.logd( - "qrResult content: ${qrResult.rawContent}", - level: LogLevel.Info, - ); + Logging.instance.d("qrResult content: ${qrResult.rawContent}"); final paymentData = AddressUtils.parsePaymentUri( qrResult.rawContent, logging: Logging.instance, ); - Logging.instance.logd( - "qrResult parsed: $paymentData", - level: LogLevel.Info, - ); + Logging.instance.d("qrResult parsed: $paymentData"); if (paymentData != null && paymentData.coin?.uriScheme == widget.coin.uriScheme) { @@ -175,10 +169,11 @@ class _RecipientState extends ConsumerState { _updateRecipientData(); } on PlatformException catch (e, s) { - Logging.instance.logd( + Logging.instance.e( "Failed to get camera permissions while " "trying to scan qr code in SendView: $e\n$s", - level: LogLevel.Warning, + error: e, + stackTrace: s, ); } } diff --git a/lib/pages/send_view/frost_ms/send_steps/frost_send_step_1a.dart b/lib/pages/send_view/frost_ms/send_steps/frost_send_step_1a.dart index 3bb7a9bd0..31eb7b4d4 100644 --- a/lib/pages/send_view/frost_ms/send_steps/frost_send_step_1a.dart +++ b/lib/pages/send_view/frost_ms/send_steps/frost_send_step_1a.dart @@ -67,10 +67,7 @@ class _FrostSendStep1aState extends ConsumerState { .routeName, ); } catch (e, s) { - Logging.instance.logd( - "$e\n$s", - level: LogLevel.Error, - ); + Logging.instance.e("$e\n$s", error: e, stackTrace: s); } finally { _attemptSignLock = false; } diff --git a/lib/pages/send_view/frost_ms/send_steps/frost_send_step_1b.dart b/lib/pages/send_view/frost_ms/send_steps/frost_send_step_1b.dart index a67afe7d3..ade993b22 100644 --- a/lib/pages/send_view/frost_ms/send_steps/frost_send_step_1b.dart +++ b/lib/pages/send_view/frost_ms/send_steps/frost_send_step_1b.dart @@ -108,10 +108,7 @@ class _FrostSendStep1bState extends ConsumerState { .routeName, ); } catch (e, s) { - Logging.instance.logd( - "$e\n$s", - level: LogLevel.Error, - ); + Logging.instance.e("$e\n$s", error: e, stackTrace: s); if (mounted) { await showDialog( context: context, diff --git a/lib/pages/send_view/frost_ms/send_steps/frost_send_step_2.dart b/lib/pages/send_view/frost_ms/send_steps/frost_send_step_2.dart index 14bee2844..febae8b54 100644 --- a/lib/pages/send_view/frost_ms/send_steps/frost_send_step_2.dart +++ b/lib/pages/send_view/frost_ms/send_steps/frost_send_step_2.dart @@ -291,10 +291,7 @@ class _FrostSendStep2State extends ConsumerState { // arguments: widget.walletId, // ); } catch (e, s) { - Logging.instance.logd( - "$e\n$s", - level: LogLevel.Fatal, - ); + Logging.instance.f("$e\n$s", error: e, stackTrace: s,); if (context.mounted) { return await showDialog( diff --git a/lib/pages/send_view/frost_ms/send_steps/frost_send_step_3.dart b/lib/pages/send_view/frost_ms/send_steps/frost_send_step_3.dart index 0b8c79c8b..6ce475a0b 100644 --- a/lib/pages/send_view/frost_ms/send_steps/frost_send_step_3.dart +++ b/lib/pages/send_view/frost_ms/send_steps/frost_send_step_3.dart @@ -233,10 +233,7 @@ class _FrostSendStep3State extends ConsumerState { .routeName, ); } catch (e, s) { - Logging.instance.logd( - "$e\n$s", - level: LogLevel.Fatal, - ); + Logging.instance.f("$e\n$s", error: e, stackTrace: s,); if (context.mounted) { return await showDialog( diff --git a/lib/pages/send_view/frost_ms/send_steps/frost_send_step_4.dart b/lib/pages/send_view/frost_ms/send_steps/frost_send_step_4.dart index ec9eb3e2a..ee45a6e70 100644 --- a/lib/pages/send_view/frost_ms/send_steps/frost_send_step_4.dart +++ b/lib/pages/send_view/frost_ms/send_steps/frost_send_step_4.dart @@ -237,10 +237,7 @@ class _FrostSendStep4State extends ConsumerState { } } } catch (e, s) { - Logging.instance.logd( - "$e\n$s", - level: LogLevel.Fatal, - ); + Logging.instance.f("$e\n$s", error: e, stackTrace: s,); if (context.mounted) { return await showDialog( context: context, diff --git a/lib/pages/send_view/send_view.dart b/lib/pages/send_view/send_view.dart index a3598fbe5..7d063ba6f 100644 --- a/lib/pages/send_view/send_view.dart +++ b/lib/pages/send_view/send_view.dart @@ -158,10 +158,7 @@ class _SendViewState extends ConsumerState { // .state = true, // ); - Logging.instance.logd( - "qrResult content: ${qrResult.rawContent}", - level: LogLevel.Info, - ); + Logging.instance.d("qrResult content: ${qrResult.rawContent}"); final paymentData = AddressUtils.parsePaymentUri( qrResult.rawContent, @@ -216,9 +213,10 @@ class _SendViewState extends ConsumerState { // .state = true; // here we ignore the exception caused by not giving permission // to use the camera to scan a qr code - Logging.instance.logd( - "Failed to get camera permissions while trying to scan qr code in SendView: $e\n$s", - level: LogLevel.Warning, + Logging.instance.e( + "Failed to get camera permissions while trying to scan qr code in SendView: ", + error: e, + stackTrace: s, ); } } @@ -248,8 +246,6 @@ class _SendViewState extends ConsumerState { return; } _cachedAmountToSend = amount; - Logging.instance.logd("it changed $amount $_cachedAmountToSend", - level: LogLevel.Info); final amountString = ref.read(pAmountFormatter(coin)).format( amount, @@ -285,16 +281,12 @@ class _SendViewState extends ConsumerState { return; } _cachedAmountToSend = amount; - Logging.instance.logd( - "it changed $amount $_cachedAmountToSend", - level: LogLevel.Info, - ); final price = ref.read(priceAnd24hChangeNotifierProvider).getPrice(coin).item1; if (price > Decimal.zero) { - baseAmountController.text = (amount!.decimal * price) + baseAmountController.text = (amount.decimal * price) .toAmount( fractionDigits: 2, ) @@ -314,9 +306,7 @@ class _SendViewState extends ConsumerState { if (coin is! Epiccash && !_baseFocus.hasFocus) { setState(() { _calculateFeesFuture = calculateFees( - amount == null - ? 0.toAmountAsRaw(fractionDigits: coin.fractionDigits) - : amount!, + amount ?? 0.toAmountAsRaw(fractionDigits: coin.fractionDigits), ); }); } @@ -369,7 +359,7 @@ class _SendViewState extends ConsumerState { } String? _updateInvalidAddressText(String address) { - if (_data != null && _data!.contactLabel == address) { + if (_data != null && _data.contactLabel == address) { return null; } @@ -695,9 +685,7 @@ class _SendViewState extends ConsumerState { ], feeRateType: ref.read(feeRateTypeStateProvider), satsPerVByte: isCustomFee ? customFeeRate : null, - utxos: (wallet is CoinControlInterface && - coinControlEnabled && - selectedUTXOs.isNotEmpty) + utxos: (coinControlEnabled && selectedUTXOs.isNotEmpty) ? selectedUTXOs : null, ), @@ -714,9 +702,7 @@ class _SendViewState extends ConsumerState { ], feeRateType: ref.read(feeRateTypeStateProvider), satsPerVByte: isCustomFee ? customFeeRate : null, - utxos: (wallet is CoinControlInterface && - coinControlEnabled && - selectedUTXOs.isNotEmpty) + utxos: (coinControlEnabled && selectedUTXOs.isNotEmpty) ? selectedUTXOs : null, ), @@ -828,7 +814,7 @@ class _SendViewState extends ConsumerState { ); } } catch (e, s) { - Logging.instance.logd("$e\n$s", level: LogLevel.Error); + Logging.instance.e("$e\n$s", error: e, stackTrace: s); if (mounted) { // pop building dialog Navigator.of(context).pop(); @@ -960,9 +946,9 @@ class _SendViewState extends ConsumerState { baseAmountController.addListener(_baseAmountChanged); if (_data != null) { - if (_data!.amount != null) { + if (_data.amount != null) { final amount = Amount.fromDecimal( - _data!.amount!, + _data.amount!, fractionDigits: coin.fractionDigits, ); @@ -971,8 +957,8 @@ class _SendViewState extends ConsumerState { withUnitName: false, ); } - sendToController.text = _data!.contactLabel; - _address = _data!.address.trim(); + sendToController.text = _data.contactLabel; + _address = _data.address.trim(); _addressToggleFlag = true; WidgetsBinding.instance.addPostFrameCallback((timeStamp) { @@ -1602,9 +1588,9 @@ class _SendViewState extends ConsumerState { ) == FiroType.lelantus) { if (_data != null && - _data!.contactLabel == _address) { + _data.contactLabel == _address) { error = SparkInterface.validateSparkAddress( - address: _data!.address, + address: _data.address, isTestNet: coin.network == CryptoCurrencyNetwork.test, ) @@ -1620,7 +1606,7 @@ class _SendViewState extends ConsumerState { } } else { if (_data != null && - _data!.contactLabel == _address) { + _data.contactLabel == _address) { error = null; } else if (!ref.watch(pValidSendToAddress) && !ref.watch(pValidSparkSendToAddress)) { @@ -1631,7 +1617,7 @@ class _SendViewState extends ConsumerState { } } else { if (_data != null && - _data!.contactLabel == _address) { + _data.contactLabel == _address) { error = null; } else if (!ref.watch(pValidSendToAddress)) { error = "Invalid address"; @@ -1815,7 +1801,9 @@ class _SendViewState extends ConsumerState { if (coin is! Ethereum && coin is! Tezos) CustomTextButton( text: _getSendAllTitle( - showCoinControl, selectedUTXOs), + showCoinControl, + selectedUTXOs, + ), onTap: () => _sendAllTapped(showCoinControl), ), ], diff --git a/lib/pages/send_view/sub_widgets/transaction_fee_selection_sheet.dart b/lib/pages/send_view/sub_widgets/transaction_fee_selection_sheet.dart index e45026981..2586d88ee 100644 --- a/lib/pages/send_view/sub_widgets/transaction_fee_selection_sheet.dart +++ b/lib/pages/send_view/sub_widgets/transaction_fee_selection_sheet.dart @@ -831,7 +831,7 @@ class _TransactionFeeSelectionSheetState return null; } } catch (e, s) { - Logging.instance.logd("$e $s", level: LogLevel.Warning); + Logging.instance.w("$e $s", error: e, stackTrace: s,); return null; } } diff --git a/lib/pages/send_view/token_send_view.dart b/lib/pages/send_view/token_send_view.dart index 112e15073..01ae07406 100644 --- a/lib/pages/send_view/token_send_view.dart +++ b/lib/pages/send_view/token_send_view.dart @@ -159,18 +159,14 @@ class _TokenSendViewState extends ConsumerState { // .state = true, // ); - Logging.instance.logd( - "qrResult content: ${qrResult.rawContent}", - level: LogLevel.Info, - ); + Logging.instance.d("qrResult content: ${qrResult.rawContent}"); final paymentData = AddressUtils.parsePaymentUri( qrResult.rawContent, logging: Logging.instance, ); - Logging.instance - .logd("qrResult parsed: $paymentData", level: LogLevel.Info); + Logging.instance.d("qrResult parsed: $paymentData"); if (paymentData != null && paymentData.coin?.uriScheme == coin.uriScheme) { @@ -221,9 +217,10 @@ class _TokenSendViewState extends ConsumerState { // .state = true; // here we ignore the exception caused by not giving permission // to use the camera to scan a qr code - Logging.instance.logd( - "Failed to get camera permissions while trying to scan qr code in SendView: $e\n$s", - level: LogLevel.Warning, + Logging.instance.w( + "Failed to get camera permissions while trying to scan qr code in SendView: ", + error: e, + stackTrace: s, ); } } @@ -255,10 +252,6 @@ class _TokenSendViewState extends ConsumerState { return; } _cachedAmountToSend = _amountToSend; - Logging.instance.logd( - "it changed $_amountToSend $_cachedAmountToSend", - level: LogLevel.Info, - ); _cryptoAmountChangeLock = true; cryptoAmountController.text = ref.read(pAmountFormatter(coin)).format( @@ -293,10 +286,6 @@ class _TokenSendViewState extends ConsumerState { return; } _cachedAmountToSend = _amountToSend; - Logging.instance.logd( - "it changed $_amountToSend $_cachedAmountToSend", - level: LogLevel.Info, - ); final price = ref .read(priceAnd24hChangeNotifierProvider) @@ -535,7 +524,7 @@ class _TokenSendViewState extends ConsumerState { ); } } catch (e, s) { - Logging.instance.logd("$e\n$s", level: LogLevel.Error); + Logging.instance.e("$e\n$s", error: e, stackTrace: s); if (mounted) { // pop building dialog Navigator.of(context).pop(); diff --git a/lib/pages/settings_views/global_settings_view/appearance_settings/sub_widgets/install_theme_from_file_dialog.dart b/lib/pages/settings_views/global_settings_view/appearance_settings/sub_widgets/install_theme_from_file_dialog.dart index b274ae093..5ef5821a2 100644 --- a/lib/pages/settings_views/global_settings_view/appearance_settings/sub_widgets/install_theme_from_file_dialog.dart +++ b/lib/pages/settings_views/global_settings_view/appearance_settings/sub_widgets/install_theme_from_file_dialog.dart @@ -55,10 +55,7 @@ class _InstallThemeFromFileDialogState ]); return true; } catch (e, s) { - Logging.instance.logd( - "Failed to install theme: $e\n$s", - level: LogLevel.Warning, - ); + Logging.instance.w("Failed to install theme: ", error: e, stackTrace: s); return false; } } @@ -78,7 +75,7 @@ class _InstallThemeFromFileDialogState }); } } catch (e, s) { - Logging.instance.logd("$e\n$s", level: LogLevel.Error); + Logging.instance.e("$e\n$s", error: e, stackTrace: s); } } diff --git a/lib/pages/settings_views/global_settings_view/appearance_settings/sub_widgets/stack_theme_card.dart b/lib/pages/settings_views/global_settings_view/appearance_settings/sub_widgets/stack_theme_card.dart index b9f991ab8..06cbfe852 100644 --- a/lib/pages/settings_views/global_settings_view/appearance_settings/sub_widgets/stack_theme_card.dart +++ b/lib/pages/settings_views/global_settings_view/appearance_settings/sub_widgets/stack_theme_card.dart @@ -64,10 +64,7 @@ class _StackThemeCardState extends ConsumerState { await service.install(themeArchiveData: data); return true; } catch (e, s) { - Logging.instance.logd( - "Failed _downloadAndInstall of ${widget.data.id}: $e\n$s", - level: LogLevel.Warning, - ); + Logging.instance.w("Failed _downloadAndInstall of ${widget.data.id}: ", error: e, stackTrace: s); return false; } } diff --git a/lib/pages/settings_views/global_settings_view/manage_nodes_views/add_edit_node_view.dart b/lib/pages/settings_views/global_settings_view/manage_nodes_views/add_edit_node_view.dart index d437c8a86..0f00f75db 100644 --- a/lib/pages/settings_views/global_settings_view/manage_nodes_views/add_edit_node_view.dart +++ b/lib/pages/settings_views/global_settings_view/manage_nodes_views/add_edit_node_view.dart @@ -351,34 +351,28 @@ class _AddEditNodeViewState extends ConsumerState { ); if (qrResult == null) { - Logging.instance.logd( - "Qr scanning cancelled", - level: LogLevel.Info, - ); + Logging.instance.d("Qr scanning cancelled"); } else { try { await _processQrData(qrResult); } catch (e, s) { - Logging.instance.logd( - "Error processing QR code data: $e\n$s", - level: LogLevel.Error, - ); + Logging.instance.e("Error processing QR code data: ", + error: e, stackTrace: s); } } } catch (e, s) { - Logging.instance.logd( - "Error opening QR code scanner dialog: $e\n$s", - level: LogLevel.Error, - ); + Logging.instance.e("Error opening QR code scanner dialog: ", + error: e, stackTrace: s); } } else { try { final result = await BarcodeScanner.scan(); await _processQrData(result.rawContent); } catch (e, s) { - Logging.instance.logd( - "$e\n$s", - level: LogLevel.Warning, + Logging.instance.e( + "$runtimeType._scanQr()", + error: e, + stackTrace: s, ); } } @@ -412,9 +406,10 @@ class _AddEditNodeViewState extends ConsumerState { }); } } catch (e, s) { - Logging.instance.logd( + Logging.instance.w( "$e\n$s", - level: LogLevel.Warning, + error: e, + stackTrace: s, ); } } diff --git a/lib/pages/settings_views/global_settings_view/stack_backup_views/create_auto_backup_view.dart b/lib/pages/settings_views/global_settings_view/stack_backup_views/create_auto_backup_view.dart index 228132010..c75ac4a83 100644 --- a/lib/pages/settings_views/global_settings_view/stack_backup_views/create_auto_backup_view.dart +++ b/lib/pages/settings_views/global_settings_view/stack_backup_views/create_auto_backup_view.dart @@ -175,8 +175,8 @@ class _EnableAutoBackupViewState extends ConsumerState { }); } } catch (e, s) { - Logging.instance.logd("$e\n$s", - level: LogLevel.Error); + Logging.instance + .e("$e\n$s", error: e, stackTrace: s); } }, controller: fileLocationController, @@ -578,8 +578,8 @@ class _EnableAutoBackupViewState extends ConsumerState { } on Exception catch (e, s) { final String err = getErrorMessageFromSWBException(e); - Logging.instance.logd("$err\n$s", - level: LogLevel.Error); + Logging.instance + .e("$err\n$s", error: e, stackTrace: s); // pop encryption progress dialog Navigator.of(context).pop(); showFloatingFlushBar( @@ -589,8 +589,11 @@ class _EnableAutoBackupViewState extends ConsumerState { ); return; } catch (e, s) { - Logging.instance - .logd("$e\n$s", level: LogLevel.Error); + Logging.instance.e( + "", + error: e, + stackTrace: s, + ); // pop encryption progress dialog Navigator.of(context).pop(); showFloatingFlushBar( diff --git a/lib/pages/settings_views/global_settings_view/stack_backup_views/create_backup_view.dart b/lib/pages/settings_views/global_settings_view/stack_backup_views/create_backup_view.dart index b3c1a4369..944847a42 100644 --- a/lib/pages/settings_views/global_settings_view/stack_backup_views/create_backup_view.dart +++ b/lib/pages/settings_views/global_settings_view/stack_backup_views/create_backup_view.dart @@ -207,8 +207,11 @@ class _RestoreFromFileViewState extends State { }); } } catch (e, s) { - Logging.instance - .logd("$e\n$s", level: LogLevel.Error); + Logging.instance.e( + "", + error: e, + stackTrace: s, + ); } }, controller: fileLocationController, diff --git a/lib/pages/settings_views/global_settings_view/stack_backup_views/edit_auto_backup_view.dart b/lib/pages/settings_views/global_settings_view/stack_backup_views/edit_auto_backup_view.dart index 61555ee23..53669d9f0 100644 --- a/lib/pages/settings_views/global_settings_view/stack_backup_views/edit_auto_backup_view.dart +++ b/lib/pages/settings_views/global_settings_view/stack_backup_views/edit_auto_backup_view.dart @@ -159,7 +159,7 @@ class _EditAutoBackupViewState extends ConsumerState { adkVersion = adk.item1; } on Exception catch (e, s) { final String err = getErrorMessageFromSWBException(e); - Logging.instance.logd("$err\n$s", level: LogLevel.Error); + Logging.instance.e("$err\n$s", error: e, stackTrace: s); // pop encryption progress dialog Navigator.of(context).pop(); unawaited( @@ -171,7 +171,7 @@ class _EditAutoBackupViewState extends ConsumerState { ); return; } catch (e, s) { - Logging.instance.logd("$e\n$s", level: LogLevel.Error); + Logging.instance.e("$e\n$s", error: e, stackTrace: s); // pop encryption progress dialog Navigator.of(context).pop(); unawaited( @@ -374,7 +374,7 @@ class _EditAutoBackupViewState extends ConsumerState { }); } } catch (e, s) { - Logging.instance.logd("$e\n$s", level: LogLevel.Error); + Logging.instance.e("$e\n$s", error: e, stackTrace: s); } }, controller: fileLocationController, diff --git a/lib/pages/settings_views/global_settings_view/stack_backup_views/helpers/restore_create_backup.dart b/lib/pages/settings_views/global_settings_view/stack_backup_views/helpers/restore_create_backup.dart index 43d0160b6..935dad27b 100644 --- a/lib/pages/settings_views/global_settings_view/stack_backup_views/helpers/restore_create_backup.dart +++ b/lib/pages/settings_views/global_settings_view/stack_backup_views/helpers/restore_create_backup.dart @@ -99,12 +99,10 @@ abstract class SWB { _cancelCompleter = null; _cancelCompleter = Completer(); _shouldCancelRestore = true; - Logging.instance - .logd("SWB cancel restore requested", level: LogLevel.Info); + Logging.instance.d("SWB cancel restore requested"); } else { - Logging.instance.logd( + Logging.instance.d( "SWB cancel restore requested while a cancellation request is currently in progress", - level: LogLevel.Warning, ); } @@ -147,10 +145,10 @@ abstract class SWB { backupFile .writeAsStringSync(Format.uint8listToString(encryptedContent)); } - Logging.instance.logd(backupFile.absolute, level: LogLevel.Info); + Logging.instance.d(backupFile.absolute); return true; } catch (e, s) { - Logging.instance.logd("$e\n$s", level: LogLevel.Error); + Logging.instance.e("$e\n$s", error: e, stackTrace: s); return false; } } @@ -174,10 +172,10 @@ abstract class SWB { backupFile .writeAsStringSync(Format.uint8listToString(encryptedContent)); } - Logging.instance.logd(backupFile.absolute, level: LogLevel.Info); + Logging.instance.d(backupFile.absolute); return true; } catch (e, s) { - Logging.instance.logd("$e\n$s", level: LogLevel.Error); + Logging.instance.e("$e\n$s", error: e, stackTrace: s); return false; } } @@ -194,7 +192,7 @@ abstract class SWB { Tuple2(encryptedText, passphrase), ); } catch (e, s) { - Logging.instance.logd("$e\n$s", level: LogLevel.Error); + Logging.instance.e("$e\n$s", error: e, stackTrace: s); return null; } } @@ -214,7 +212,7 @@ abstract class SWB { final jsonBackup = utf8.decode(decryptedContent); return jsonBackup; } catch (e, s) { - Logging.instance.logd("$e\n$s", level: LogLevel.Error); + Logging.instance.e("$e\n$s", error: e, stackTrace: s); return null; } } @@ -223,27 +221,23 @@ abstract class SWB { static Future> createStackWalletJSON({ required SecureStorageInterface secureStorage, }) async { - Logging.instance - .logd("Starting createStackWalletJSON...", level: LogLevel.Info); + Logging.instance.d("Starting createStackWalletJSON..."); final _wallets = Wallets.sharedInstance; final Map backupJson = {}; final NodeService nodeService = NodeService(secureStorageInterface: secureStorage); final _secureStore = secureStorage; - Logging.instance.logd( + Logging.instance.d( "createStackWalletJSON awaiting DB.instance.mutex...", - level: LogLevel.Info, ); // prevent modification of data await DB.instance.mutex.protect(() async { - Logging.instance.logd( + Logging.instance.i( "...createStackWalletJSON DB.instance.mutex acquired", - level: LogLevel.Info, ); - Logging.instance.logd( + Logging.instance.i( "SWB backing up nodes", - level: LogLevel.Warning, ); try { final primaryNodes = nodeService.primaryNodes.map((e) async { @@ -253,7 +247,11 @@ abstract class SWB { }).toList(); backupJson['primaryNodes'] = await Future.wait(primaryNodes); } catch (e, s) { - Logging.instance.logd("$e $s", level: LogLevel.Warning); + Logging.instance.e( + "", + error: e, + stackTrace: s, + ); } try { final nodesFuture = nodeService.nodes.map((e) async { @@ -264,12 +262,11 @@ abstract class SWB { final nodes = await Future.wait(nodesFuture); backupJson['nodes'] = nodes; } catch (e, s) { - Logging.instance.logd("$e $s", level: LogLevel.Error); + Logging.instance.e("", error: e, stackTrace: s); } - Logging.instance.logd( + Logging.instance.d( "SWB backing up prefs", - level: LogLevel.Warning, ); final Map prefs = {}; @@ -291,9 +288,8 @@ abstract class SWB { backupJson['prefs'] = prefs; - Logging.instance.logd( + Logging.instance.d( "SWB backing up addressbook", - level: LogLevel.Warning, ); final AddressBookService addressBookService = AddressBookService(); @@ -301,9 +297,8 @@ abstract class SWB { backupJson['addressBookEntries'] = addresses.map((e) => e.toMap()).toList(); - Logging.instance.logd( + Logging.instance.d( "SWB backing up wallets", - level: LogLevel.Warning, ); final List backupWallets = []; @@ -330,7 +325,7 @@ abstract class SWB { final String err = "${wallet.info.coin.identifier} wallet ${wallet.info.name} " "has null keys or config"; - Logging.instance.logd(err, level: LogLevel.Fatal); + Logging.instance.e(err); throw Exception(err); } //This case should never actually happen in practice unless the whole @@ -368,9 +363,8 @@ abstract class SWB { } backupJson['wallets'] = backupWallets; - Logging.instance.logd( + Logging.instance.d( "SWB backing up trades", - level: LogLevel.Warning, ); // back up trade history @@ -385,9 +379,8 @@ abstract class SWB { tradeTxidLookupDataService.all.map((e) => e.toMap()).toList(); backupJson["tradeTxidLookupData"] = lookupData; - Logging.instance.logd( + Logging.instance.d( "SWB backing up trade notes", - level: LogLevel.Warning, ); // back up trade notes @@ -395,9 +388,8 @@ abstract class SWB { final tradeNotes = tradeNotesService.all; backupJson["tradeNotes"] = tradeNotes; }); - Logging.instance.logd( + Logging.instance.d( "createStackWalletJSON DB.instance.mutex released", - level: LogLevel.Info, ); // // back up notifications data @@ -407,8 +399,7 @@ abstract class SWB { // .map((e) => e.toMap()) // .toList(growable: false); - Logging.instance - .logd("...createStackWalletJSON complete", level: LogLevel.Info); + Logging.instance.d("...createStackWalletJSON complete"); return backupJson; } @@ -590,9 +581,8 @@ abstract class SWB { await restoringFuture; - Logging.instance.logd( + Logging.instance.i( "SWB restored: ${info.walletId} ${info.name} ${info.coin.prettyName}", - level: LogLevel.Info, ); final currentAddress = await wallet.getCurrentReceivingAddress(); @@ -606,7 +596,11 @@ abstract class SWB { mnemonicPassphrase: mnemonicPassphrase, ); } catch (e, s) { - Logging.instance.logd("$e $s", level: LogLevel.Warning); + Logging.instance.i( + "", + error: e, + stackTrace: s, + ); uiState?.update( walletId: info.walletId, restoringStatus: StackRestoringStatus.failed, @@ -640,18 +634,16 @@ abstract class SWB { uiState?.preferences = StackRestoringStatus.restoring; - Logging.instance.logd( + Logging.instance.d( "SWB restoring prefs", - level: LogLevel.Warning, ); await _restorePrefs(prefs); uiState?.preferences = StackRestoringStatus.success; uiState?.addressBook = StackRestoringStatus.restoring; - Logging.instance.logd( + Logging.instance.d( "SWB restoring addressbook", - level: LogLevel.Warning, ); if (addressBookEntries != null) { await _restoreAddressBook(addressBookEntries); @@ -660,9 +652,8 @@ abstract class SWB { uiState?.addressBook = StackRestoringStatus.success; uiState?.nodes = StackRestoringStatus.restoring; - Logging.instance.logd( + Logging.instance.d( "SWB restoring nodes", - level: LogLevel.Warning, ); await _restoreNodes( nodes, @@ -675,18 +666,16 @@ abstract class SWB { // restore trade history if (trades != null) { - Logging.instance.logd( + Logging.instance.d( "SWB restoring trades", - level: LogLevel.Warning, ); await _restoreTrades(trades); } // restore trade history lookup data for trades send from stack wallet if (tradeTxidLookupData != null) { - Logging.instance.logd( + Logging.instance.d( "SWB restoring trade look up data", - level: LogLevel.Warning, ); await _restoreTradesLookUpData(tradeTxidLookupData, oldToNewWalletIdMap); } @@ -694,9 +683,8 @@ abstract class SWB { // restore trade notes if (tradeNotes != null) { - Logging.instance.logd( + Logging.instance.d( "SWB restoring trade notes", - level: LogLevel.Warning, ); await _restoreTradesNotes(tradeNotes); } @@ -729,15 +717,13 @@ abstract class SWB { ) async { if (!Platform.isLinux) await WakelockPlus.enable(); - Logging.instance.logd( + Logging.instance.d( "SWB creating temp backup", - level: LogLevel.Warning, ); final preRestoreJSON = await createStackWalletJSON(secureStorage: secureStorageInterface); - Logging.instance.logd( + Logging.instance.d( "SWB temp backup created", - level: LogLevel.Warning, ); final List _currentWalletIds = await MainDB.instance.isar.walletInfo @@ -832,9 +818,10 @@ abstract class SWB { otherData = Map.from(data as Map); } } catch (e, s) { - Logging.instance.logd( - "SWB restore walletinfo otherdata error: $e\n$s", - level: LogLevel.Error, + Logging.instance.e( + "SWB restore walletinfo otherdata error: ", + error: e, + stackTrace: s, ); } @@ -950,7 +937,9 @@ abstract class SWB { return false; } - Logging.instance.logd("done with SWB restore", level: LogLevel.Warning); + Logging.instance.d( + "done with SWB restore", + ); await Wallets.sharedInstance .loadAfterStackRestore(_prefs, uiState?.wallets ?? [], Util.isDesktop); @@ -1100,7 +1089,7 @@ abstract class SWB { node: nodeService.getNodeById(id: node['id'] as String)!, ); } catch (e, s) { - Logging.instance.logd("$e $s", level: LogLevel.Error); + Logging.instance.e("", error: e, stackTrace: s); } } } @@ -1193,7 +1182,9 @@ abstract class SWB { _cancelCompleter!.complete(); _shouldCancelRestore = false; - Logging.instance.logd("Revert SWB complete", level: LogLevel.Info); + Logging.instance.d( + "Revert SWB complete", + ); } static Future _restorePrefs(Map prefs) async { @@ -1310,7 +1301,7 @@ abstract class SWB { node: nodeService.getNodeById(id: node['id'] as String)!, ); } catch (e, s) { - Logging.instance.logd("$e $s", level: LogLevel.Error); + Logging.instance.e("", error: e, stackTrace: s); } } } @@ -1327,7 +1318,7 @@ abstract class SWB { exTx = ExchangeTransaction.fromJson(trades[i] as Map); } catch (e) { // unneeded log - // Logging.instance.log("$e\n$s", level: LogLevel.Warning); + // Logging.instance.log("$e\n$s", error: e, stackTrace: s,); } Trade trade; diff --git a/lib/pages/settings_views/global_settings_view/stack_backup_views/restore_from_file_view.dart b/lib/pages/settings_views/global_settings_view/stack_backup_views/restore_from_file_view.dart index 1a73743ac..400e6e08d 100644 --- a/lib/pages/settings_views/global_settings_view/stack_backup_views/restore_from_file_view.dart +++ b/lib/pages/settings_views/global_settings_view/stack_backup_views/restore_from_file_view.dart @@ -172,7 +172,7 @@ class _RestoreFromFileViewState extends ConsumerState { }); } } catch (e, s) { - Logging.instance.logd("$e\n$s", level: LogLevel.Error); + Logging.instance.e("$e\n$s", error: e, stackTrace: s); } }, controller: fileLocationController, diff --git a/lib/pages/settings_views/global_settings_view/stack_backup_views/sub_views/stack_restore_progress_view.dart b/lib/pages/settings_views/global_settings_view/stack_backup_views/sub_views/stack_restore_progress_view.dart index 7064dfa5a..2c7ddd71e 100644 --- a/lib/pages/settings_views/global_settings_view/stack_backup_views/sub_views/stack_restore_progress_view.dart +++ b/lib/pages/settings_views/global_settings_view/stack_backup_views/sub_views/stack_restore_progress_view.dart @@ -169,7 +169,7 @@ class _StackRestoreProgressViewState ref.read(secureStoreProvider), ); } catch (e, s) { - Logging.instance.logd("$e\n$s", level: LogLevel.Warning); + Logging.instance.w("$e\n$s", error: e, stackTrace: s,); } if (finished != null && finished && uiState.done) { diff --git a/lib/pages/settings_views/global_settings_view/tor_settings/tor_settings_view.dart b/lib/pages/settings_views/global_settings_view/tor_settings/tor_settings_view.dart index 5f34b89fa..245937fdf 100644 --- a/lib/pages/settings_views/global_settings_view/tor_settings/tor_settings_view.dart +++ b/lib/pages/settings_views/global_settings_view/tor_settings/tor_settings_view.dart @@ -604,10 +604,7 @@ Future connectTor(WidgetRef ref, BuildContext context) async { // Toggle the useTor preference on success. ref.read(prefsChangeNotifierProvider).useTor = true; } catch (e, s) { - Logging.instance.logd( - "Error starting tor: $e\n$s", - level: LogLevel.Error, - ); + Logging.instance.e("Error starting tor: ", error: e, stackTrace: s); // TODO: show dialog with error message } } @@ -627,10 +624,7 @@ Future disconnectTor(WidgetRef ref, BuildContext context) async { // Toggle the useTor preference on success. ref.read(prefsChangeNotifierProvider).useTor = false; } catch (e, s) { - Logging.instance.logd( - "Error stopping tor: $e\n$s", - level: LogLevel.Error, - ); + Logging.instance.e("Error stopping tor: ", error: e, stackTrace: s); // TODO: show dialog with error message } } diff --git a/lib/pages/settings_views/wallet_settings_view/frost_ms/initiate_resharing/complete_reshare_config_view.dart b/lib/pages/settings_views/wallet_settings_view/frost_ms/initiate_resharing/complete_reshare_config_view.dart index efb5ce11a..afc48647d 100644 --- a/lib/pages/settings_views/wallet_settings_view/frost_ms/initiate_resharing/complete_reshare_config_view.dart +++ b/lib/pages/settings_views/wallet_settings_view/frost_ms/initiate_resharing/complete_reshare_config_view.dart @@ -148,10 +148,7 @@ class _CompleteReshareConfigViewState ); } } catch (e, s) { - Logging.instance.logd( - "$e\n$s", - level: LogLevel.Fatal, - ); + Logging.instance.f("$e\n$s", error: e, stackTrace: s,); if (mounted) { await showDialog( context: context, diff --git a/lib/pages/settings_views/wallet_settings_view/wallet_settings_wallet_settings/lelantus_settings_view.dart b/lib/pages/settings_views/wallet_settings_view/wallet_settings_wallet_settings/lelantus_settings_view.dart index 34628565f..da8c328bf 100644 --- a/lib/pages/settings_views/wallet_settings_view/wallet_settings_wallet_settings/lelantus_settings_view.dart +++ b/lib/pages/settings_views/wallet_settings_view/wallet_settings_wallet_settings/lelantus_settings_view.dart @@ -114,7 +114,7 @@ class _LelantusSettingsViewState extends ConsumerState { } } } catch (e, s) { - Logging.instance.logd("$e\n$s", level: LogLevel.Error); + Logging.instance.e("$e\n$s", error: e, stackTrace: s); if (mounted) { // show error await showDialog( diff --git a/lib/pages/wallet_view/transaction_views/transaction_details_view.dart b/lib/pages/wallet_view/transaction_views/transaction_details_view.dart index 70246ee93..11ebd1b82 100644 --- a/lib/pages/wallet_view/transaction_views/transaction_details_view.dart +++ b/lib/pages/wallet_view/transaction_views/transaction_details_view.dart @@ -219,7 +219,7 @@ class _TransactionDetailsViewState return address; } } catch (e, s) { - Logging.instance.logd("$e\n$s", level: LogLevel.Warning); + Logging.instance.w("$e\n$s", error: e, stackTrace: s,); return address; } } diff --git a/lib/pages/wallet_view/transaction_views/tx_v2/transaction_v2_details_view.dart b/lib/pages/wallet_view/transaction_views/tx_v2/transaction_v2_details_view.dart index 55ecb0cb0..2acb6b1a1 100644 --- a/lib/pages/wallet_view/transaction_views/tx_v2/transaction_v2_details_view.dart +++ b/lib/pages/wallet_view/transaction_views/tx_v2/transaction_v2_details_view.dart @@ -406,7 +406,7 @@ class _TransactionV2DetailsViewState return address; } } catch (e, s) { - Logging.instance.logd("$e\n$s", level: LogLevel.Warning); + Logging.instance.w("$e\n$s", error: e, stackTrace: s,); return address; } } diff --git a/lib/pages/wallet_view/wallet_view.dart b/lib/pages/wallet_view/wallet_view.dart index 4247e96da..d94e25d7a 100644 --- a/lib/pages/wallet_view/wallet_view.dart +++ b/lib/pages/wallet_view/wallet_view.dart @@ -1199,10 +1199,7 @@ class _WalletViewState extends ConsumerState { .read(paynymAPIProvider) .nym(code.toString()); - Logging.instance.logd( - "my nym account: $account", - level: LogLevel.Info, - ); + Logging.instance.d("my nym account: $account"); if (context.mounted) { Navigator.of(context).pop(); diff --git a/lib/pages_desktop_specific/coin_control/freeze_button.dart b/lib/pages_desktop_specific/coin_control/freeze_button.dart index 440a65fd8..b012b01ad 100644 --- a/lib/pages_desktop_specific/coin_control/freeze_button.dart +++ b/lib/pages_desktop_specific/coin_control/freeze_button.dart @@ -79,10 +79,7 @@ class _FreezeButtonState extends State { break; default: - Logging.instance.logd( - "Unknown utxo method name found in $runtimeType", - level: LogLevel.Fatal, - ); + Logging.instance.f("Unknown utxo method name found in $runtimeType"); return; } diff --git a/lib/pages_desktop_specific/desktop_exchange/exchange_steps/subwidgets/desktop_step_2.dart b/lib/pages_desktop_specific/desktop_exchange/exchange_steps/subwidgets/desktop_step_2.dart index a7f096d22..fd7c72a23 100644 --- a/lib/pages_desktop_specific/desktop_exchange/exchange_steps/subwidgets/desktop_step_2.dart +++ b/lib/pages_desktop_specific/desktop_exchange/exchange_steps/subwidgets/desktop_step_2.dart @@ -83,7 +83,7 @@ class _DesktopStep2State extends ConsumerState { ref.read(desktopExchangeModelProvider)!.recipientAddress = info.item2; } } catch (e, s) { - Logging.instance.logd("$e\n$s", level: LogLevel.Info); + Logging.instance.i("$e\n$s", error: e, stackTrace: s,); } widget.enableNextChanged.call( @@ -116,7 +116,7 @@ class _DesktopStep2State extends ConsumerState { ref.read(desktopExchangeModelProvider)!.refundAddress = info.item2; } } catch (e, s) { - Logging.instance.logd("$e\n$s", level: LogLevel.Info); + Logging.instance.i("$e\n$s", error: e, stackTrace: s,); } widget.enableNextChanged.call( _next(), diff --git a/lib/pages_desktop_specific/my_stack_view/wallet_view/sub_widgets/desktop_send.dart b/lib/pages_desktop_specific/my_stack_view/wallet_view/sub_widgets/desktop_send.dart index ddf4f14f6..c3a9964d4 100644 --- a/lib/pages_desktop_specific/my_stack_view/wallet_view/sub_widgets/desktop_send.dart +++ b/lib/pages_desktop_specific/my_stack_view/wallet_view/sub_widgets/desktop_send.dart @@ -150,25 +150,18 @@ class _DesktopSendState extends ConsumerState { builder: (context) => const QrCodeScannerDialog(), ); if (qrResult == null) { - Logging.instance.logd( - "Qr scanning cancelled", - level: LogLevel.Info, - ); + Logging.instance.w("Qr scanning cancelled"); } else { try { _processQrCodeData(qrResult); } catch (e, s) { - Logging.instance.logd( - "Error processing QR code data: $e\n$s", - level: LogLevel.Error, - ); + Logging.instance + .e("Error processing QR code data", error: e, stackTrace: s); } } } catch (e, s) { - Logging.instance.logd( - "Error opening QR code scanner dialog: $e\n$s", - level: LogLevel.Error, - ); + Logging.instance + .e("Error opening QR code scanner dialog", error: e, stackTrace: s); } } @@ -513,7 +506,7 @@ class _DesktopSendState extends ConsumerState { ); } } catch (e, s) { - Logging.instance.logd("Desktop send: $e\n$s", level: LogLevel.Error); + Logging.instance.e("Desktop send: ", error: e, stackTrace: s); if (mounted) { // pop building dialog Navigator.of( @@ -618,17 +611,14 @@ class _DesktopSendState extends ConsumerState { if (_cachedAmountToSend != null && _cachedAmountToSend == amount) { return; } - Logging.instance.logd( - "it changed $amount $_cachedAmountToSend", - level: LogLevel.Info, - ); + _cachedAmountToSend = amount; final price = ref.read(priceAnd24hChangeNotifierProvider).getPrice(coin).item1; if (price > Decimal.zero) { - final String fiatAmountString = (amount!.decimal * price) + final String fiatAmountString = (amount.decimal * price) .toAmount(fractionDigits: 2) .fiatString( locale: ref.read(localeServiceChangeNotifierProvider).locale, @@ -707,8 +697,11 @@ class _DesktopSendState extends ConsumerState { }); } } catch (e, s) { - Logging.instance - .logd("Error processing QR code data: $e\n$s", level: LogLevel.Error); + Logging.instance.e( + "Error processing QR code data", + error: e, + stackTrace: s, + ); } } @@ -858,11 +851,9 @@ class _DesktopSendState extends ConsumerState { return; } _cachedAmountToSend = amount; - Logging.instance.logd("it changed $amount $_cachedAmountToSend", - level: LogLevel.Info); final amountString = ref.read(pAmountFormatter(coin)).format( - amount!, + amount, withUnitName: false, ); @@ -962,11 +953,11 @@ class _DesktopSendState extends ConsumerState { cryptoAmountController.addListener(onCryptoAmountChanged); if (_data != null) { - if (_data!.amount != null) { - cryptoAmountController.text = _data!.amount!.toString(); + if (_data.amount != null) { + cryptoAmountController.text = _data.amount!.toString(); } - sendToController.text = _data!.contactLabel; - _address = _data!.address; + sendToController.text = _data.contactLabel; + _address = _data.address; _addressToggleFlag = true; } @@ -1586,9 +1577,9 @@ class _DesktopSendState extends ConsumerState { error = null; } else if (coin is Firo) { if (firoType == FiroType.lelantus) { - if (_data != null && _data!.contactLabel == _address) { + if (_data != null && _data.contactLabel == _address) { error = SparkInterface.validateSparkAddress( - address: _data!.address, + address: _data.address, isTestNet: coin.network.isTestNet, ) ? "Lelantus to Spark not supported" @@ -1601,7 +1592,7 @@ class _DesktopSendState extends ConsumerState { : "Invalid address"; } } else { - if (_data != null && _data!.contactLabel == _address) { + if (_data != null && _data.contactLabel == _address) { error = null; } else if (!ref.watch(pValidSendToAddress) && !ref.watch(pValidSparkSendToAddress)) { @@ -1611,7 +1602,7 @@ class _DesktopSendState extends ConsumerState { } } } else { - if (_data != null && _data!.contactLabel == _address) { + if (_data != null && _data.contactLabel == _address) { error = null; } else if (!ref.watch(pValidSendToAddress)) { error = "Invalid address"; diff --git a/lib/pages_desktop_specific/my_stack_view/wallet_view/sub_widgets/desktop_token_send.dart b/lib/pages_desktop_specific/my_stack_view/wallet_view/sub_widgets/desktop_token_send.dart index 43d3c23a5..647b1e1cc 100644 --- a/lib/pages_desktop_specific/my_stack_view/wallet_view/sub_widgets/desktop_token_send.dart +++ b/lib/pages_desktop_specific/my_stack_view/wallet_view/sub_widgets/desktop_token_send.dart @@ -406,10 +406,6 @@ class _DesktopTokenSendState extends ConsumerState { _cachedAmountToSend == _amountToSend) { return; } - Logging.instance.logd( - "it changed $_amountToSend $_cachedAmountToSend", - level: LogLevel.Info, - ); _cachedAmountToSend = _amountToSend; final price = ref @@ -471,18 +467,14 @@ class _DesktopTokenSendState extends ConsumerState { final qrResult = await scanner.scan(); - Logging.instance.logd( - "qrResult content: ${qrResult.rawContent}", - level: LogLevel.Info, - ); + Logging.instance.d("qrResult content: ${qrResult.rawContent}"); final paymentData = AddressUtils.parsePaymentUri( qrResult.rawContent, logging: Logging.instance, ); - Logging.instance - .logd("qrResult parsed: $paymentData", level: LogLevel.Info); + Logging.instance.d("qrResult parsed: $paymentData"); if (paymentData != null && paymentData.coin?.uriScheme == coin.uriScheme) { @@ -529,9 +521,10 @@ class _DesktopTokenSendState extends ConsumerState { } on PlatformException catch (e, s) { // here we ignore the exception caused by not giving permission // to use the camera to scan a qr code - Logging.instance.logd( - "Failed to get camera permissions while trying to scan qr code in SendView: $e\n$s", - level: LogLevel.Warning, + Logging.instance.w( + "Failed to get camera permissions while trying to scan qr code in SendView: ", + error: e, + stackTrace: s, ); } } @@ -586,10 +579,6 @@ class _DesktopTokenSendState extends ConsumerState { return; } _cachedAmountToSend = _amountToSend; - Logging.instance.logd( - "it changed $_amountToSend $_cachedAmountToSend", - level: LogLevel.Info, - ); final amountString = ref.read(pAmountFormatter(coin)).format( _amountToSend!, diff --git a/lib/pages_desktop_specific/my_stack_view/wallet_view/sub_widgets/desktop_wallet_features.dart b/lib/pages_desktop_specific/my_stack_view/wallet_view/sub_widgets/desktop_wallet_features.dart index 2d874fffd..7993ee0a6 100644 --- a/lib/pages_desktop_specific/my_stack_view/wallet_view/sub_widgets/desktop_wallet_features.dart +++ b/lib/pages_desktop_specific/my_stack_view/wallet_view/sub_widgets/desktop_wallet_features.dart @@ -319,10 +319,7 @@ class _DesktopWalletFeaturesState extends ConsumerState { final account = await ref.read(paynymAPIProvider).nym(code.toString()); - Logging.instance.logd( - "my nym account: $account", - level: LogLevel.Info, - ); + Logging.instance.d("my nym account: $account"); if (mounted) { Navigator.of(context, rootNavigator: true).pop(); diff --git a/lib/pages_desktop_specific/my_stack_view/wallet_view/sub_widgets/more_features/more_features_dialog.dart b/lib/pages_desktop_specific/my_stack_view/wallet_view/sub_widgets/more_features/more_features_dialog.dart index 38e91701c..eb2746558 100644 --- a/lib/pages_desktop_specific/my_stack_view/wallet_view/sub_widgets/more_features/more_features_dialog.dart +++ b/lib/pages_desktop_specific/my_stack_view/wallet_view/sub_widgets/more_features/more_features_dialog.dart @@ -213,7 +213,7 @@ class _MoreFeaturesDialogState extends ConsumerState { } } } catch (e, s) { - Logging.instance.logd("$e\n$s", level: LogLevel.Error); + Logging.instance.e("$e\n$s", error: e, stackTrace: s); if (mounted) { // show error await showDialog( diff --git a/lib/pages_desktop_specific/password/delete_password_warning_view.dart b/lib/pages_desktop_specific/password/delete_password_warning_view.dart index 1b6c3d5b1..1eb1331a7 100644 --- a/lib/pages_desktop_specific/password/delete_password_warning_view.dart +++ b/lib/pages_desktop_specific/password/delete_password_warning_view.dart @@ -87,10 +87,7 @@ class _ForgotPasswordDesktopViewState await DB.instance.init(); } catch (e, s) { - Logging.instance.logd( - "$e\n$s", - level: LogLevel.Fatal, - ); + Logging.instance.f("$e\n$s", error: e, stackTrace: s,); return false; } diff --git a/lib/pages_desktop_specific/password/desktop_login_view.dart b/lib/pages_desktop_specific/password/desktop_login_view.dart index 04fab5bac..15b795278 100644 --- a/lib/pages_desktop_specific/password/desktop_login_view.dart +++ b/lib/pages_desktop_specific/password/desktop_login_view.dart @@ -75,10 +75,10 @@ class _DesktopLoginViewState extends ConsumerState { secureStore: ref.read(secureStoreProvider), ); } catch (e, s) { - Logging.instance.logd( - "Cannot migrate desktop database\n$e $s", - level: LogLevel.Error, - printFullLength: true, + Logging.instance.f( + "Cannot migrate desktop database", + error: e, + stackTrace: s, ); } } diff --git a/lib/pages_desktop_specific/password/forgotten_passphrase_restore_from_swb.dart b/lib/pages_desktop_specific/password/forgotten_passphrase_restore_from_swb.dart index 4030e6c50..161459e43 100644 --- a/lib/pages_desktop_specific/password/forgotten_passphrase_restore_from_swb.dart +++ b/lib/pages_desktop_specific/password/forgotten_passphrase_restore_from_swb.dart @@ -271,7 +271,7 @@ class _ForgottenPassphraseRestoreFromSWBState }); } } catch (e, s) { - Logging.instance.logd("$e\n$s", level: LogLevel.Error); + Logging.instance.e("$e\n$s", error: e, stackTrace: s); } }, child: MouseRegion( diff --git a/lib/pages_desktop_specific/settings/settings_menu/appearance_settings/sub_widgets/desktop_install_theme.dart b/lib/pages_desktop_specific/settings/settings_menu/appearance_settings/sub_widgets/desktop_install_theme.dart index 3ad0f0f1f..94ce0da9d 100644 --- a/lib/pages_desktop_specific/settings/settings_menu/appearance_settings/sub_widgets/desktop_install_theme.dart +++ b/lib/pages_desktop_specific/settings/settings_menu/appearance_settings/sub_widgets/desktop_install_theme.dart @@ -57,10 +57,7 @@ class _DesktopInstallThemeState extends ConsumerState { ]); return true; } catch (e, s) { - Logging.instance.logd( - "Failed to install theme: $e\n$s", - level: LogLevel.Warning, - ); + Logging.instance.w("Failed to install theme: ", error: e, stackTrace: s); return false; } } @@ -82,7 +79,7 @@ class _DesktopInstallThemeState extends ConsumerState { } } } catch (e, s) { - Logging.instance.logd("$e\n$s", level: LogLevel.Error); + Logging.instance.e("$e\n$s", error: e, stackTrace: s); } } diff --git a/lib/pages_desktop_specific/settings/settings_menu/backup_and_restore/create_auto_backup.dart b/lib/pages_desktop_specific/settings/settings_menu/backup_and_restore/create_auto_backup.dart index 3ed9aafc2..3ffea6508 100644 --- a/lib/pages_desktop_specific/settings/settings_menu/backup_and_restore/create_auto_backup.dart +++ b/lib/pages_desktop_specific/settings/settings_menu/backup_and_restore/create_auto_backup.dart @@ -201,8 +201,11 @@ class _CreateAutoBackup extends ConsumerState { }); } } catch (e, s) { - Logging.instance - .logd("$e\n$s", level: LogLevel.Error); + Logging.instance.e( + "", + error: e, + stackTrace: s, + ); } }, controller: fileLocationController, @@ -699,8 +702,11 @@ class _CreateAutoBackup extends ConsumerState { } on Exception catch (e, s) { final String err = getErrorMessageFromSWBException(e); - Logging.instance - .logd("$err\n$s", level: LogLevel.Error); + Logging.instance.e( + err, + error: e, + stackTrace: s, + ); // pop encryption progress dialog Navigator.of(context).pop(); unawaited( @@ -712,8 +718,11 @@ class _CreateAutoBackup extends ConsumerState { ); return; } catch (e, s) { - Logging.instance - .logd("$e\n$s", level: LogLevel.Error); + Logging.instance.e( + "", + error: e, + stackTrace: s, + ); // pop encryption progress dialog Navigator.of(context).pop(); unawaited( diff --git a/lib/pages_desktop_specific/settings/settings_menu/tor_settings/tor_settings.dart b/lib/pages_desktop_specific/settings/settings_menu/tor_settings/tor_settings.dart index 6b698048a..162ed9860 100644 --- a/lib/pages_desktop_specific/settings/settings_menu/tor_settings/tor_settings.dart +++ b/lib/pages_desktop_specific/settings/settings_menu/tor_settings/tor_settings.dart @@ -71,10 +71,7 @@ class _TorSettingsState extends ConsumerState { // Toggle the useTor preference on success. ref.read(prefsChangeNotifierProvider).useTor = true; } catch (e, s) { - Logging.instance.logd( - "Error starting tor: $e\n$s", - level: LogLevel.Error, - ); + Logging.instance.e("Error starting tor: ", error: e, stackTrace: s); // TODO: show dialog with error message } }, @@ -101,10 +98,7 @@ class _TorSettingsState extends ConsumerState { // Toggle the useTor preference on success. ref.read(prefsChangeNotifierProvider).useTor = false; } catch (e, s) { - Logging.instance.logd( - "Error stopping tor: $e\n$s", - level: LogLevel.Error, - ); + Logging.instance.e("Error stopping tor: ", error: e, stackTrace: s); } }, ); diff --git a/lib/services/auto_swb_service.dart b/lib/services/auto_swb_service.dart index 4a44dfae3..24f58d0f7 100644 --- a/lib/services/auto_swb_service.dart +++ b/lib/services/auto_swb_service.dart @@ -42,14 +42,12 @@ class AutoSWBService extends ChangeNotifier { /// Attempt a backup. Future doBackup() async { if (_status == AutoSWBStatus.backingUp) { - Logging.instance.logd( + Logging.instance.w( "AutoSWBService attempted to run doBackup() while a backup is in progress!", - level: LogLevel.Warning, ); return; } - Logging.instance - .logd("AutoSWBService.doBackup() started...", level: LogLevel.Info); + Logging.instance.d("AutoSWBService.doBackup() started..."); // set running backup status and notify listeners _status = AutoSWBStatus.backingUp; @@ -62,9 +60,8 @@ class AutoSWBService extends ChangeNotifier { final autoBackupDirectoryPath = Prefs.instance.autoBackupLocation; if (autoBackupDirectoryPath == null) { - Logging.instance.logd( + Logging.instance.e( "AutoSWBService attempted to run doBackup() when no auto backup directory was set!", - level: LogLevel.Error, ); // set error backup status and notify listeners _status = AutoSWBStatus.error; @@ -104,17 +101,16 @@ class AutoSWBService extends ChangeNotifier { // delete all but the latest 3 auto backups trimBackups(autoBackupDirectoryPath, 3); - Logging.instance - .logd("AutoSWBService.doBackup() succeeded", level: LogLevel.Info); + Logging.instance.d("AutoSWBService.doBackup() succeeded"); } on Exception catch (e, s) { final String err = getErrorMessageFromSWBException(e); - Logging.instance.logd("$err\n$s", level: LogLevel.Error); + Logging.instance.e("$err\n$s", error: e, stackTrace: s); // set error backup status and notify listeners _status = AutoSWBStatus.error; notifyListeners(); return; } catch (e, s) { - Logging.instance.logd("$e\n$s", level: LogLevel.Error); + Logging.instance.e("$e\n$s", error: e, stackTrace: s); // set error backup status and notify listeners _status = AutoSWBStatus.error; notifyListeners(); diff --git a/lib/services/buy/simplex/simplex_api.dart b/lib/services/buy/simplex/simplex_api.dart index 7242ee295..eed33ea1b 100644 --- a/lib/services/buy/simplex/simplex_api.dart +++ b/lib/services/buy/simplex/simplex_api.dart @@ -72,9 +72,10 @@ class SimplexAPI { return _parseSupportedCryptos(jsonArray); } catch (e, s) { - Logging.instance.logd( - "getAvailableCurrencies exception: $e\n$s", - level: LogLevel.Error, + Logging.instance.e( + "getAvailableCurrencies exception: ", + error: e, + stackTrace: s, ); return BuyResponse( exception: BuyException( @@ -106,8 +107,11 @@ class SimplexAPI { return BuyResponse(value: cryptos); } catch (e, s) { - Logging.instance - .logd("_parseSupported exception: $e\n$s", level: LogLevel.Error); + Logging.instance.e( + "_parseSupported exception", + error: e, + stackTrace: s, + ); return BuyResponse( exception: BuyException( e.toString(), @@ -143,10 +147,8 @@ class SimplexAPI { return _parseSupportedFiats(jsonArray); } catch (e, s) { - Logging.instance.logd( - "getAvailableCurrencies exception: $e\n$s", - level: LogLevel.Error, - ); + Logging.instance + .e("getAvailableCurrencies exception: ", error: e, stackTrace: s); return BuyResponse( exception: BuyException( e.toString(), @@ -179,8 +181,11 @@ class SimplexAPI { return BuyResponse(value: fiats); } catch (e, s) { - Logging.instance - .logd("_parseSupported exception: $e\n$s", level: LogLevel.Error); + Logging.instance.e( + "_parseSupported exception", + error: e, + stackTrace: s, + ); return BuyResponse( exception: BuyException( e.toString(), @@ -236,8 +241,11 @@ class SimplexAPI { return _parseQuote(jsonArray); } catch (e, s) { - Logging.instance - .logd("getQuote exception: $e\n$s", level: LogLevel.Error); + Logging.instance.e( + "getQuote exception", + error: e, + stackTrace: s, + ); return BuyResponse( exception: BuyException( e.toString(), @@ -281,8 +289,11 @@ class SimplexAPI { return BuyResponse(value: _quote); } catch (e, s) { - Logging.instance - .logd("_parseQuote exception: $e\n$s", level: LogLevel.Error); + Logging.instance.e( + "_parseQuote exception", + error: e, + stackTrace: s, + ); return BuyResponse( exception: BuyException( e.toString(), @@ -351,8 +362,11 @@ class SimplexAPI { return BuyResponse(value: _order); } catch (e, s) { - Logging.instance - .logd("newOrder exception: $e\n$s", level: LogLevel.Error); + Logging.instance.e( + "newOrder exception", + error: e, + stackTrace: s, + ); return BuyResponse( exception: BuyException( e.toString(), @@ -380,8 +394,11 @@ class SimplexAPI { return BuyResponse(value: status); } catch (e, s) { - Logging.instance - .logd("newOrder exception: $e\n$s", level: LogLevel.Error); + Logging.instance.e( + "newOrder exception", + error: e, + stackTrace: s, + ); return BuyResponse( exception: BuyException( e.toString(), diff --git a/lib/services/coins/tezos/api/tezos_api.dart b/lib/services/coins/tezos/api/tezos_api.dart index 776e0e700..6c2193577 100644 --- a/lib/services/coins/tezos/api/tezos_api.dart +++ b/lib/services/coins/tezos/api/tezos_api.dart @@ -25,10 +25,7 @@ abstract final class TezosAPI { final result = jsonDecode(response.body); return result as int; } catch (e, s) { - Logging.instance.logd( - "Error occurred in TezosAPI while getting counter for $address: $e\n$s", - level: LogLevel.Error, - ); + Logging.instance.e("Error occurred in TezosAPI while getting counter for $address: ", error: e, stackTrace: s); rethrow; } } @@ -53,10 +50,7 @@ abstract final class TezosAPI { return account; } catch (e, s) { - Logging.instance.logd( - "Error occurred in TezosAPI while getting account for $address: $e\n$s", - level: LogLevel.Error, - ); + Logging.instance.e("Error occurred in TezosAPI while getting account for $address: ", error: e, stackTrace: s); rethrow; } } @@ -109,10 +103,7 @@ abstract final class TezosAPI { } return txs; } catch (e, s) { - Logging.instance.logd( - "Error occurred in TezosAPI while getting transactions for $address: $e\n$s", - level: LogLevel.Error, - ); + Logging.instance.e("Error occurred in TezosAPI while getting transactions for $address: ", error: e, stackTrace: s); rethrow; } } diff --git a/lib/services/coins/tezos/api/tezos_rpc_api.dart b/lib/services/coins/tezos/api/tezos_rpc_api.dart index afddfa4c3..688d9f68e 100644 --- a/lib/services/coins/tezos/api/tezos_rpc_api.dart +++ b/lib/services/coins/tezos/api/tezos_rpc_api.dart @@ -1,9 +1,9 @@ import 'dart:convert'; import '../../../../networking/http.dart'; -import '../../../tor_service.dart'; import '../../../../utilities/logger.dart'; import '../../../../utilities/prefs.dart'; +import '../../../tor_service.dart'; abstract final class TezosRpcAPI { static final HTTP _client = HTTP(); @@ -27,10 +27,11 @@ abstract final class TezosRpcAPI { final balance = BigInt.parse(response.body.substring(1, response.body.length - 2)); return balance; - } catch (e) { - Logging.instance.logd( - "Error occurred in tezos_rpc_api.dart while getting balance for $address: $e", - level: LogLevel.Error, + } catch (e, s) { + Logging.instance.e( + "Error occurred in tezos_rpc_api.dart while getting balance for $address", + error: e, + stackTrace: s, ); } return null; @@ -53,10 +54,11 @@ abstract final class TezosRpcAPI { final jsonParsedResponse = jsonDecode(response.body); return int.parse(jsonParsedResponse["level"].toString()); - } catch (e) { - Logging.instance.logd( - "Error occurred in tezos_rpc_api.dart while getting chain height for tezos: $e", - level: LogLevel.Error, + } catch (e, s) { + Logging.instance.e( + "Error occurred in tezos_rpc_api.dart while getting chain height for tezos", + error: e, + stackTrace: s, ); } return null; diff --git a/lib/services/ethereum/cached_eth_token_balance.dart b/lib/services/ethereum/cached_eth_token_balance.dart index 7841a7580..ce6efe1b4 100644 --- a/lib/services/ethereum/cached_eth_token_balance.dart +++ b/lib/services/ethereum/cached_eth_token_balance.dart @@ -9,13 +9,14 @@ */ import 'package:isar/isar.dart'; + import '../../db/isar/main_db.dart'; import '../../models/balance.dart'; import '../../models/isar/models/ethereum/eth_contract.dart'; -import 'ethereum_api.dart'; import '../../utilities/amount/amount.dart'; import '../../utilities/logger.dart'; import '../../wallets/isar/models/token_wallet_info.dart'; +import 'ethereum_api.dart'; class CachedEthTokenBalance { final String walletId; @@ -54,9 +55,8 @@ class CachedEthTokenBalance { isar: mainDB.isar, ); } else { - Logging.instance.logd( + Logging.instance.w( "CachedEthTokenBalance.fetchAndUpdateCachedBalance failed: ${response.exception}", - level: LogLevel.Warning, ); } } diff --git a/lib/services/ethereum/ethereum_api.dart b/lib/services/ethereum/ethereum_api.dart index fbfbe52fa..fccce0ceb 100644 --- a/lib/services/ethereum/ethereum_api.dart +++ b/lib/services/ethereum/ethereum_api.dart @@ -104,9 +104,11 @@ abstract class EthereumAPI { e, ); } catch (e, s) { - Logging.instance.logd( - "getEthTransactions($address): $e\n$s", - level: LogLevel.Error, + Logging.instance.e("getEthTransactions()", error: e); + Logging.instance.d( + "getEthTransactions($address)", + error: e, + stackTrace: s, ); return EthereumResponse( null, @@ -170,9 +172,14 @@ abstract class EthereumAPI { e, ); } catch (e, s) { - Logging.instance.logd( - "getEthTransactionByHash($txid): $e\n$s", - level: LogLevel.Error, + Logging.instance.e( + "getEthTransactionByHash()", + error: e, + ); + Logging.instance.d( + "getEthTransactionByHash($txid)", + error: e, + stackTrace: s, ); return EthereumResponse( null, @@ -233,9 +240,14 @@ abstract class EthereumAPI { e, ); } catch (e, s) { - Logging.instance.logd( - "getEthTransactionNonces($txns): $e\n$s", - level: LogLevel.Error, + Logging.instance.e( + "getEthTransactionNonces()", + error: e, + ); + Logging.instance.d( + "getEthTransactionNonces($txns)", + error: e, + stackTrace: s, ); return EthereumResponse( null, @@ -291,9 +303,14 @@ abstract class EthereumAPI { e, ); } catch (e, s) { - Logging.instance.logd( - "getEthTokenTransactionsByTxids($txids): $e\n$s", - level: LogLevel.Error, + Logging.instance.e( + "getEthTokenTransactionsByTxids()", + error: e, + ); + Logging.instance.d( + "getEthTokenTransactionsByTxids($txids)", + error: e, + stackTrace: s, ); return EthereumResponse( null, @@ -352,9 +369,14 @@ abstract class EthereumAPI { e, ); } catch (e, s) { - Logging.instance.logd( - "getTokenTransactions($address, $tokenContractAddress): $e\n$s", - level: LogLevel.Error, + Logging.instance.e( + "getTokenTransactions()", + error: e, + ); + Logging.instance.d( + "getTokenTransactions($address, $tokenContractAddress)", + error: e, + stackTrace: s, ); return EthereumResponse( null, @@ -478,9 +500,10 @@ abstract class EthereumAPI { e, ); } catch (e, s) { - Logging.instance.logd( - "getWalletTokenBalance(): $e\n$s", - level: LogLevel.Error, + Logging.instance.e( + "getWalletTokenBalance()", + error: e, + stackTrace: s, ); return EthereumResponse( null, @@ -529,9 +552,10 @@ abstract class EthereumAPI { e, ); } catch (e, s) { - Logging.instance.logd( - "getAddressNonce(): $e\n$s", - level: LogLevel.Error, + Logging.instance.e( + "getAddressNonce()", + error: e, + stackTrace: s, ); return EthereumResponse( null, @@ -585,9 +609,10 @@ abstract class EthereumAPI { e, ); } catch (e, s) { - Logging.instance.logd( - "getGasOracle(): $e\n$s", - level: LogLevel.Error, + Logging.instance.e( + "getGasOracle()", + error: e, + stackTrace: s, ); return EthereumResponse( null, @@ -643,17 +668,15 @@ abstract class EthereumAPI { if (json["data"] is List) { if ((json["data"] as List).isEmpty) { if (autoNameOnEmpty) { - Logging.instance.logd( + Logging.instance.d( "getTokenByContractAddress(): Adding token data to server", - level: LogLevel.Debug, ); // this will add the missing data to server await _addContractInfoToServer(contractAddress); - Logging.instance.logd( + Logging.instance.d( "getTokenByContractAddress(): Adding to server threw so now" "we try a normal fetch again", - level: LogLevel.Debug, ); // now try again @@ -709,9 +732,10 @@ abstract class EthereumAPI { e, ); } catch (e, s) { - Logging.instance.logd( - "getTokenByContractAddress(): $e\n$s", - level: LogLevel.Error, + Logging.instance.e( + "getTokenByContractAddress()", + error: e, + stackTrace: s, ); return EthereumResponse( null, @@ -753,9 +777,10 @@ abstract class EthereumAPI { e, ); } catch (e, s) { - Logging.instance.logd( - "getTokenAbi($name, $contractAddress): $e\n$s", - level: LogLevel.Error, + Logging.instance.e( + "getTokenAbi($name, $contractAddress)", + error: e, + stackTrace: s, ); return EthereumResponse( null, @@ -798,9 +823,10 @@ abstract class EthereumAPI { e, ); } catch (e, s) { - Logging.instance.logd( - "getProxyTokenImplementationAddress($contractAddress) : $e\n$s", - level: LogLevel.Error, + Logging.instance.e( + "getProxyTokenImplementationAddress($contractAddress)", + error: e, + stackTrace: s, ); return EthereumResponse( null, diff --git a/lib/services/event_bus/events/global/balance_refreshed_event.dart b/lib/services/event_bus/events/global/balance_refreshed_event.dart index d061a5e3e..90e81a0e5 100644 --- a/lib/services/event_bus/events/global/balance_refreshed_event.dart +++ b/lib/services/event_bus/events/global/balance_refreshed_event.dart @@ -14,9 +14,6 @@ class BalanceRefreshedEvent { final String walletId; BalanceRefreshedEvent(this.walletId) { - Logging.instance.logd( - "BalanceRefreshedEvent fired on $walletId", - level: LogLevel.Info, - ); + Logging.instance.d("BalanceRefreshedEvent fired on $walletId"); } } diff --git a/lib/services/event_bus/events/global/blocks_remaining_event.dart b/lib/services/event_bus/events/global/blocks_remaining_event.dart index f94fc0b23..ec8b968f0 100644 --- a/lib/services/event_bus/events/global/blocks_remaining_event.dart +++ b/lib/services/event_bus/events/global/blocks_remaining_event.dart @@ -15,9 +15,7 @@ class BlocksRemainingEvent { String walletId; BlocksRemainingEvent(this.blocksRemaining, this.walletId) { - Logging.instance.logd( - "RefreshPercentChangedEvent fired on $walletId with blocks remaining = $blocksRemaining", - level: LogLevel.Info, - ); + Logging.instance.d( + "RefreshPercentChangedEvent fired on $walletId with blocks remaining = $blocksRemaining"); } } diff --git a/lib/services/event_bus/events/global/node_connection_status_changed_event.dart b/lib/services/event_bus/events/global/node_connection_status_changed_event.dart index 9f60bc9db..202c2287d 100644 --- a/lib/services/event_bus/events/global/node_connection_status_changed_event.dart +++ b/lib/services/event_bus/events/global/node_connection_status_changed_event.dart @@ -19,9 +19,8 @@ class NodeConnectionStatusChangedEvent { CryptoCurrency coin; NodeConnectionStatusChangedEvent(this.newStatus, this.walletId, this.coin) { - Logging.instance.logd( + Logging.instance.d( "NodeConnectionStatusChangedEvent fired in $walletId with arg newStatus = $newStatus", - level: LogLevel.Info, ); } } diff --git a/lib/services/event_bus/events/global/refresh_percent_changed_event.dart b/lib/services/event_bus/events/global/refresh_percent_changed_event.dart index fcae085b3..2bd9ffe27 100644 --- a/lib/services/event_bus/events/global/refresh_percent_changed_event.dart +++ b/lib/services/event_bus/events/global/refresh_percent_changed_event.dart @@ -15,9 +15,7 @@ class RefreshPercentChangedEvent { String walletId; RefreshPercentChangedEvent(this.percent, this.walletId) { - Logging.instance.logd( - "RefreshPercentChangedEvent fired on $walletId with percent (range of 0.0-1.0)= $percent", - level: LogLevel.Info, - ); + Logging.instance.d( + "RefreshPercentChangedEvent fired on $walletId with percent (range of 0.0-1.0)= $percent"); } } diff --git a/lib/services/event_bus/events/global/tor_connection_status_changed_event.dart b/lib/services/event_bus/events/global/tor_connection_status_changed_event.dart index e42991270..6d7818c32 100644 --- a/lib/services/event_bus/events/global/tor_connection_status_changed_event.dart +++ b/lib/services/event_bus/events/global/tor_connection_status_changed_event.dart @@ -16,9 +16,7 @@ class TorConnectionStatusChangedEvent { String message = ""; TorConnectionStatusChangedEvent(this.newStatus, this.message) { - Logging.instance.logd( - "TorSyncStatusChangedEvent fired with arg newStatus = $newStatus ($message)", - level: LogLevel.Info, - ); + Logging.instance.d( + "TorSyncStatusChangedEvent fired with arg newStatus = $newStatus ($message)"); } } diff --git a/lib/services/event_bus/events/global/tor_status_changed_event.dart b/lib/services/event_bus/events/global/tor_status_changed_event.dart index 2466f4225..55147f0b1 100644 --- a/lib/services/event_bus/events/global/tor_status_changed_event.dart +++ b/lib/services/event_bus/events/global/tor_status_changed_event.dart @@ -20,9 +20,7 @@ class TorPreferenceChangedEvent { required this.status, this.message, }) { - Logging.instance.logd( - "TorStatusChangedEvent changed to \"$status\" with message: $message", - level: LogLevel.Warning, - ); + Logging.instance.w( + "TorStatusChangedEvent changed to \"$status\" with message: $message"); } } diff --git a/lib/services/event_bus/events/global/updated_in_background_event.dart b/lib/services/event_bus/events/global/updated_in_background_event.dart index 94ad3a3da..88089e810 100644 --- a/lib/services/event_bus/events/global/updated_in_background_event.dart +++ b/lib/services/event_bus/events/global/updated_in_background_event.dart @@ -8,8 +8,6 @@ * */ -import 'package:flutter/foundation.dart'; - import '../../../../utilities/logger.dart'; class UpdatedInBackgroundEvent { @@ -17,11 +15,8 @@ class UpdatedInBackgroundEvent { String walletId; UpdatedInBackgroundEvent(this.message, this.walletId) { - if (kDebugMode) { - Logging.instance.logd( - "UpdatedInBackgroundEvent fired with message: $message", - level: LogLevel.Info, - ); - } + Logging.instance.d( + "UpdatedInBackgroundEvent fired with message: $message", + ); } } diff --git a/lib/services/event_bus/events/global/wallet_sync_status_changed_event.dart b/lib/services/event_bus/events/global/wallet_sync_status_changed_event.dart index 497e6a97d..0fc07a993 100644 --- a/lib/services/event_bus/events/global/wallet_sync_status_changed_event.dart +++ b/lib/services/event_bus/events/global/wallet_sync_status_changed_event.dart @@ -19,9 +19,7 @@ class WalletSyncStatusChangedEvent { CryptoCurrency coin; WalletSyncStatusChangedEvent(this.newStatus, this.walletId, this.coin) { - Logging.instance.logd( - "WalletSyncStatusChangedEvent fired in $walletId with arg newStatus = $newStatus", - level: LogLevel.Info, - ); + Logging.instance.d( + "WalletSyncStatusChangedEvent fired in $walletId with arg newStatus = $newStatus"); } } diff --git a/lib/services/exchange/change_now/change_now_api.dart b/lib/services/exchange/change_now/change_now_api.dart index e0b96bf3b..d7cf255d5 100644 --- a/lib/services/exchange/change_now/change_now_api.dart +++ b/lib/services/exchange/change_now/change_now_api.dart @@ -78,8 +78,11 @@ class ChangeNowAPI { }; } } catch (e, s) { - Logging.instance - .logd("_makeRequest($uri) threw: $e\n$s", level: LogLevel.Error); + Logging.instance.e( + "_makeRequest($uri) threw", + error: e, + stackTrace: s, + ); rethrow; } } @@ -102,8 +105,11 @@ class ChangeNowAPI { return parsed; } catch (e, s) { - Logging.instance - .logd("_makeRequestV2($uri) threw: $e\n$s", level: LogLevel.Error); + Logging.instance.e( + "_makeRequestV2($uri) threw", + error: e, + stackTrace: s, + ); rethrow; } } @@ -128,14 +134,20 @@ class ChangeNowAPI { final parsed = jsonDecode(data); return parsed; - } catch (_) { - Logging.instance.logd("ChangeNOW api failed to parse: $data", - level: LogLevel.Error); + } catch (e, s) { + Logging.instance.e( + "ChangeNOW api failed to parse: $data", + error: e, + stackTrace: s, + ); rethrow; } } catch (e, s) { - Logging.instance - .logd("_makePostRequest($uri) threw: $e\n$s", level: LogLevel.Error); + Logging.instance.e( + "_makePostRequest($uri) threw", + error: e, + stackTrace: s, + ); rethrow; } } @@ -173,9 +185,10 @@ class ChangeNowAPI { ); return result; } catch (e, s) { - Logging.instance.logd( - "getAvailableCurrencies exception: $e\n$s", - level: LogLevel.Error, + Logging.instance.e( + "getAvailableCurrencies exception: ", + error: e, + stackTrace: s, ); return ExchangeResponse( exception: ExchangeException( @@ -185,9 +198,10 @@ class ChangeNowAPI { ); } } catch (e, s) { - Logging.instance.logd( - "getAvailableCurrencies exception: $e\n$s", - level: LogLevel.Error, + Logging.instance.e( + "getAvailableCurrencies exception: ", + error: e, + stackTrace: s, ); return ExchangeResponse( exception: ExchangeException( @@ -263,9 +277,10 @@ class ChangeNowAPI { ); return result; } catch (e, s) { - Logging.instance.logd( - "getAvailableCurrencies exception: $e\n$s", - level: LogLevel.Error, + Logging.instance.e( + "getAvailableCurrencies exception: ", + error: e, + stackTrace: s, ); return ExchangeResponse( exception: ExchangeException( @@ -275,9 +290,10 @@ class ChangeNowAPI { ); } } catch (e, s) { - Logging.instance.logd( - "getAvailableCurrencies exception: $e\n$s", - level: LogLevel.Error, + Logging.instance.e( + "getAvailableCurrencies exception: ", + error: e, + stackTrace: s, ); return ExchangeResponse( exception: ExchangeException( @@ -381,9 +397,10 @@ class ChangeNowAPI { } } } catch (e, s) { - Logging.instance.logd( - "getPairedCurrencies exception: $e\n$s", - level: LogLevel.Error, + Logging.instance.e( + "getPairedCurrencies exception: ", + error: e, + stackTrace: s, ); return ExchangeResponse( exception: ExchangeException( @@ -394,8 +411,11 @@ class ChangeNowAPI { } return ExchangeResponse(value: currencies); } catch (e, s) { - Logging.instance - .logd("getPairedCurrencies exception: $e\n$s", level: LogLevel.Error); + Logging.instance.e( + "getPairedCurrencies exception", + error: e, + stackTrace: s, + ); return ExchangeResponse( exception: ExchangeException( e.toString(), @@ -435,9 +455,10 @@ class ChangeNowAPI { ); } } catch (e, s) { - Logging.instance.logd( - "getMinimalExchangeAmount exception: $e\n$s", - level: LogLevel.Error, + Logging.instance.e( + "getMinimalExchangeAmount exception: ", + error: e, + stackTrace: s, ); return ExchangeResponse( exception: ExchangeException( @@ -478,9 +499,10 @@ class ChangeNowAPI { ), ); } catch (e, s) { - Logging.instance.logd( - "getRange exception: $e\n$s", - level: LogLevel.Error, + Logging.instance.e( + "getRange exception: ", + error: e, + stackTrace: s, ); return ExchangeResponse( exception: ExchangeException( @@ -551,9 +573,10 @@ class ChangeNowAPI { ); } } catch (e, s) { - Logging.instance.logd( - "getEstimatedExchangeAmount exception: $e\n$s", - level: LogLevel.Error, + Logging.instance.e( + "getEstimatedExchangeAmount exception: ", + error: e, + stackTrace: s, ); return ExchangeResponse( exception: ExchangeException( @@ -637,9 +660,10 @@ class ChangeNowAPI { ); } } catch (e, s) { - Logging.instance.logd( - "getEstimatedExchangeAmount exception: $e\n$s", - level: LogLevel.Error, + Logging.instance.e( + "getEstimatedExchangeAmount exception: ", + error: e, + stackTrace: s, ); return ExchangeResponse( exception: ExchangeException( @@ -763,9 +787,10 @@ class ChangeNowAPI { ); } } catch (e, s) { - Logging.instance.logd( - "getEstimatedExchangeAmountV2 exception: $e\n$s", - level: LogLevel.Error, + Logging.instance.e( + "getEstimatedExchangeAmountV2 exception: ", + error: e, + stackTrace: s, ); return ExchangeResponse( exception: ExchangeException( @@ -797,9 +822,10 @@ class ChangeNowAPI { await compute(_parseFixedRateMarketsJson, jsonArray as List); return result; } catch (e, s) { - Logging.instance.logd( - "getAvailableFixedRateMarkets exception: $e\n$s", - level: LogLevel.Error, + Logging.instance.e( + "getAvailableFixedRateMarkets exception: ", + error: e, + stackTrace: s, ); return ExchangeResponse( exception: ExchangeException( @@ -809,9 +835,10 @@ class ChangeNowAPI { ); } } catch (e, s) { - Logging.instance.logd( - "getAvailableFixedRateMarkets exception: $e\n$s", - level: LogLevel.Error, + Logging.instance.e( + "getAvailableFixedRateMarkets exception: ", + error: e, + stackTrace: s, ); return ExchangeResponse( exception: ExchangeException( @@ -898,9 +925,10 @@ class ChangeNowAPI { ); } } catch (e, s) { - Logging.instance.logd( - "createStandardExchangeTransaction exception: $e\n$s", - level: LogLevel.Error, + Logging.instance.e( + "createStandardExchangeTransaction exception: ", + error: e, + stackTrace: s, ); return ExchangeResponse( exception: ExchangeException( @@ -973,9 +1001,10 @@ class ChangeNowAPI { ); } } catch (e, s) { - Logging.instance.logd( - "createFixedRateExchangeTransaction exception: $e\n$s", - level: LogLevel.Error, + Logging.instance.e( + "createFixedRateExchangeTransaction exception: ", + error: e, + stackTrace: s, ); return ExchangeResponse( exception: ExchangeException( @@ -1011,8 +1040,11 @@ class ChangeNowAPI { ); } } catch (e, s) { - Logging.instance.logd("getTransactionStatus exception: $e\n$s", - level: LogLevel.Error); + Logging.instance.e( + "getTransactionStatus exception: ", + error: e, + stackTrace: s, + ); return ExchangeResponse( exception: ExchangeException( e.toString(), @@ -1041,9 +1073,10 @@ class ChangeNowAPI { ); return result; } catch (e, s) { - Logging.instance.logd( - "getAvailableFloatingRatePairs exception: $e\n$s", - level: LogLevel.Error, + Logging.instance.e( + "getAvailableFloatingRatePairs exception: ", + error: e, + stackTrace: s, ); return ExchangeResponse( exception: ExchangeException( @@ -1053,9 +1086,10 @@ class ChangeNowAPI { ); } } catch (e, s) { - Logging.instance.logd( - "getAvailableFloatingRatePairs exception: $e\n$s", - level: LogLevel.Error, + Logging.instance.e( + "getAvailableFloatingRatePairs exception: ", + error: e, + stackTrace: s, ); return ExchangeResponse( exception: ExchangeException( diff --git a/lib/services/exchange/exchange_data_loading_service.dart b/lib/services/exchange/exchange_data_loading_service.dart index 1708a1413..1cfaee23b 100644 --- a/lib/services/exchange/exchange_data_loading_service.dart +++ b/lib/services/exchange/exchange_data_loading_service.dart @@ -145,9 +145,8 @@ class ExchangeDataLoadingService { if (_isar == null) { await initDB(); } - Logging.instance.logd( + Logging.instance.d( "ExchangeDataLoadingService.loadAll starting...", - level: LogLevel.Info, ); final start = DateTime.now(); try { @@ -185,16 +184,16 @@ class ExchangeDataLoadingService { // wait for all loading futures to complete await Future.wait(futures); - Logging.instance.logd( + Logging.instance.d( "ExchangeDataLoadingService.loadAll finished in ${DateTime.now().difference(start).inSeconds} seconds", - level: LogLevel.Info, ); onLoadingComplete?.call(); await _updateCurrentCacheVersion(cacheVersion); } catch (e, s) { - Logging.instance.logd( - "ExchangeDataLoadingService.loadAll failed after ${DateTime.now().difference(start).inSeconds} seconds: $e\n$s", - level: LogLevel.Error, + Logging.instance.e( + "ExchangeDataLoadingService.loadAll failed after ${DateTime.now().difference(start).inSeconds} seconds: ", + error: e, + stackTrace: s, ); onLoadingError?.call(); } @@ -219,9 +218,8 @@ class ExchangeDataLoadingService { await isar.currencies.putAll(responseCurrencies.value!); }); } else { - Logging.instance.logd( + Logging.instance.w( "Failed to load changeNOW currencies: ${responseCurrencies.exception?.message}", - level: LogLevel.Error, ); return; } @@ -353,9 +351,8 @@ class ExchangeDataLoadingService { await isar.currencies.putAll(responseCurrencies.value!); }); } else { - Logging.instance.logd( + Logging.instance.w( "loadMajesticBankCurrencies: $responseCurrencies", - level: LogLevel.Warning, ); } } @@ -378,9 +375,8 @@ class ExchangeDataLoadingService { await isar.currencies.putAll(responseCurrencies.value!); }); } else { - Logging.instance.logd( + Logging.instance.w( "loadTrocadorCurrencies: $responseCurrencies", - level: LogLevel.Warning, ); } } @@ -403,9 +399,8 @@ class ExchangeDataLoadingService { await isar.currencies.putAll(responseCurrencies.value!); }); } else { - Logging.instance.logd( + Logging.instance.w( "loadNanswapCurrencies: $responseCurrencies", - level: LogLevel.Warning, ); } } diff --git a/lib/services/exchange/majestic_bank/majestic_bank_api.dart b/lib/services/exchange/majestic_bank/majestic_bank_api.dart index 5f64112c2..210be8af4 100644 --- a/lib/services/exchange/majestic_bank/majestic_bank_api.dart +++ b/lib/services/exchange/majestic_bank/majestic_bank_api.dart @@ -61,10 +61,8 @@ class MajesticBankAPI { return parsed; } catch (e, s) { - Logging.instance.logd( - "_makeRequest($uri) HTTP:$code threw: $e\n$s", - level: LogLevel.Error, - ); + Logging.instance + .e("_makeRequest($uri) HTTP:$code threw: ", error: e, stackTrace: s); rethrow; } } @@ -92,8 +90,11 @@ class MajesticBankAPI { } return ExchangeResponse(value: rates); } catch (e, s) { - Logging.instance - .logd("getRates exception: $e\n$s", level: LogLevel.Error); + Logging.instance.e( + "getRates exception", + error: e, + stackTrace: s, + ); return ExchangeResponse( exception: ExchangeException( e.toString(), @@ -126,8 +127,11 @@ class MajesticBankAPI { return ExchangeResponse(value: limit); } catch (e, s) { - Logging.instance - .logd("getLimits exception: $e\n$s", level: LogLevel.Error); + Logging.instance.e( + "getLimits exception", + error: e, + stackTrace: s, + ); return ExchangeResponse( exception: ExchangeException( e.toString(), @@ -159,8 +163,11 @@ class MajesticBankAPI { return ExchangeResponse(value: limits); } catch (e, s) { - Logging.instance - .logd("getLimits exception: $e\n$s", level: LogLevel.Error); + Logging.instance.e( + "getLimits exception", + error: e, + stackTrace: s, + ); return ExchangeResponse( exception: ExchangeException( e.toString(), @@ -228,9 +235,10 @@ class MajesticBankAPI { return ExchangeResponse(value: result); } catch (e, s) { - Logging.instance.logd( - "calculateOrder $fromCurrency-$receiveCurrency exception: $e\n$s", - level: LogLevel.Error, + Logging.instance.e( + "calculateOrder $fromCurrency-$receiveCurrency exception: ", + error: e, + stackTrace: s, ); return ExchangeResponse( exception: ExchangeException( @@ -276,8 +284,11 @@ class MajesticBankAPI { return ExchangeResponse(value: order); } catch (e, s) { - Logging.instance - .logd("createOrder exception: $e\n$s", level: LogLevel.Error); + Logging.instance.e( + "createOrder exception", + error: e, + stackTrace: s, + ); return ExchangeResponse( exception: ExchangeException( e.toString(), @@ -331,8 +342,8 @@ class MajesticBankAPI { return ExchangeResponse(value: order); } catch (e, s) { - Logging.instance.logd("createFixedRateOrder exception: $e\n$s", - level: LogLevel.Error); + Logging.instance + .e("createFixedRateOrder exception: ", error: e, stackTrace: s); return ExchangeResponse( exception: ExchangeException( e.toString(), @@ -379,9 +390,10 @@ class MajesticBankAPI { return ExchangeResponse(value: status); } catch (e, s) { - Logging.instance.logd( - "trackOrder exception when trying to parse $json: $e\n$s", - level: LogLevel.Error, + Logging.instance.e( + "trackOrder exception when trying to parse $json: ", + error: e, + stackTrace: s, ); return ExchangeResponse( exception: ExchangeException( diff --git a/lib/services/exchange/nanswap/nanswap_api.dart b/lib/services/exchange/nanswap/nanswap_api.dart index a5435e15f..7d2465530 100644 --- a/lib/services/exchange/nanswap/nanswap_api.dart +++ b/lib/services/exchange/nanswap/nanswap_api.dart @@ -47,9 +47,10 @@ class NanswapAPI { return parsed; } catch (e, s) { - Logging.instance.logd( - "NanswapAPI._makeRequest($uri) HTTP:$code threw: $e\n$s", - level: LogLevel.Error, + Logging.instance.e( + "NanswapAPI._makeRequest($uri) HTTP:$code threw: ", + error: e, + stackTrace: s, ); rethrow; } @@ -81,9 +82,10 @@ class NanswapAPI { return parsed; } catch (e, s) { - Logging.instance.logd( - "NanswapAPI._makePostRequest($uri) HTTP:$code threw: $e\n$s", - level: LogLevel.Error, + Logging.instance.e( + "NanswapAPI._makePostRequest($uri) HTTP:$code threw: ", + error: e, + stackTrace: s, ); rethrow; } @@ -135,9 +137,10 @@ class NanswapAPI { return ExchangeResponse(value: result); } catch (e, s) { - Logging.instance.logd( - "Nanswap.getSupportedCurrencies() exception: $e\n$s", - level: LogLevel.Error, + Logging.instance.e( + "Nanswap.getSupportedCurrencies() exception: ", + error: e, + stackTrace: s, ); return ExchangeResponse( exception: ExchangeException( @@ -198,17 +201,19 @@ class NanswapAPI { map, ), ); - } catch (_) { - Logging.instance.logd( + } catch (e, s) { + Logging.instance.e( "Nanswap.getEstimate() response was: $json", - level: LogLevel.Error, + error: e, + stackTrace: s, ); rethrow; } } catch (e, s) { - Logging.instance.logd( - "Nanswap.getEstimate() exception: $e\n$s", - level: LogLevel.Error, + Logging.instance.e( + "Nanswap.getEstimate() exception: ", + error: e, + stackTrace: s, ); return ExchangeResponse( exception: ExchangeException( @@ -271,9 +276,10 @@ class NanswapAPI { ), ); } catch (e, s) { - Logging.instance.logd( - "Nanswap.getEstimateReverse() exception: $e\n$s", - level: LogLevel.Error, + Logging.instance.e( + "Nanswap.getEstimateReverse() exception: ", + error: e, + stackTrace: s, ); return ExchangeResponse( exception: ExchangeException( @@ -322,9 +328,10 @@ class NanswapAPI { ), ); } catch (e, s) { - Logging.instance.logd( - "Nanswap.getOrderLimits() exception: $e\n$s", - level: LogLevel.Error, + Logging.instance.e( + "Nanswap.getOrderLimits() exception: ", + error: e, + stackTrace: s, ); return ExchangeResponse( exception: ExchangeException( @@ -419,9 +426,10 @@ class NanswapAPI { rethrow; } } catch (e, s) { - Logging.instance.logd( - "Nanswap.createOrder() exception: $e\n$s", - level: LogLevel.Error, + Logging.instance.e( + "Nanswap.createOrder() exception: ", + error: e, + stackTrace: s, ); return ExchangeResponse( exception: ExchangeException( @@ -502,9 +510,10 @@ class NanswapAPI { rethrow; } } catch (e, s) { - Logging.instance.logd( - "Nanswap.getOrder($id) exception: $e\n$s", - level: LogLevel.Error, + Logging.instance.e( + "Nanswap.getOrder($id) exception: ", + error: e, + stackTrace: s, ); return ExchangeResponse( exception: ExchangeException( diff --git a/lib/services/exchange/simpleswap/simpleswap_api.dart b/lib/services/exchange/simpleswap/simpleswap_api.dart index 4573319e5..0a532822d 100644 --- a/lib/services/exchange/simpleswap/simpleswap_api.dart +++ b/lib/services/exchange/simpleswap/simpleswap_api.dart @@ -59,10 +59,8 @@ class SimpleSwapAPI { return parsed; } catch (e, s) { - Logging.instance.logd( - "_makeRequest($uri) HTTP:$code threw: $e\n$s", - level: LogLevel.Error, - ); + Logging.instance + .e("_makeRequest($uri) HTTP:$code threw: ", error: e, stackTrace: s); rethrow; } } @@ -88,8 +86,11 @@ class SimpleSwapAPI { throw Exception("response: ${response.body}"); } catch (e, s) { - Logging.instance - .logd("_makeRequest($uri) threw: $e\n$s", level: LogLevel.Error); + Logging.instance.e( + "_makeRequest($uri) threw", + error: e, + stackTrace: s, + ); rethrow; } } @@ -149,10 +150,8 @@ class SimpleSwapAPI { ); return ExchangeResponse(value: trade, exception: null); } catch (e, s) { - Logging.instance.logd( - "getAvailableCurrencies exception: $e\n$s", - level: LogLevel.Error, - ); + Logging.instance + .e("getAvailableCurrencies exception: ", error: e, stackTrace: s); return ExchangeResponse( exception: ExchangeException( e.toString(), @@ -177,10 +176,8 @@ class SimpleSwapAPI { return await compute(_parseAvailableCurrenciesJson, jsonArray as List); } catch (e, s) { - Logging.instance.logd( - "getAvailableCurrencies exception: $e\n$s", - level: LogLevel.Error, - ); + Logging.instance + .e("getAvailableCurrencies exception: ", error: e, stackTrace: s); return ExchangeResponse( exception: ExchangeException( e.toString(), @@ -212,9 +209,10 @@ class SimpleSwapAPI { return ExchangeResponse(value: currencies); } catch (e, s) { - Logging.instance.logd( - "_parseAvailableCurrenciesJson exception: $e\n$s", - level: LogLevel.Error, + Logging.instance.e( + "_parseAvailableCurrenciesJson exception: ", + error: e, + stackTrace: s, ); return ExchangeResponse( exception: ExchangeException( @@ -246,8 +244,11 @@ class SimpleSwapAPI { ), ); } catch (e, s) { - Logging.instance - .logd("getCurrency exception: $e\n$s", level: LogLevel.Error); + Logging.instance.e( + "getCurrency exception", + error: e, + stackTrace: s, + ); return ExchangeResponse( exception: ExchangeException( e.toString(), @@ -279,8 +280,11 @@ class SimpleSwapAPI { ); return result; } catch (e, s) { - Logging.instance - .logd("getAllPairs exception: $e\n$s", level: LogLevel.Error); + Logging.instance.e( + "getAllPairs exception", + error: e, + stackTrace: s, + ); return ExchangeResponse( exception: ExchangeException( e.toString(), @@ -321,9 +325,10 @@ class SimpleSwapAPI { return ExchangeResponse(value: pairs); } catch (e, s) { - Logging.instance.logd( - "_parseAvailableCurrenciesJson exception: $e\n$s", - level: LogLevel.Error, + Logging.instance.e( + "_parseAvailableCurrenciesJson exception: ", + error: e, + stackTrace: s, ); return ExchangeResponse( exception: ExchangeException( @@ -358,8 +363,11 @@ class SimpleSwapAPI { return ExchangeResponse(value: jsonObject as String); } catch (e, s) { - Logging.instance - .logd("getEstimated exception: $e\n$s", level: LogLevel.Error); + Logging.instance.e( + "getEstimated exception", + error: e, + stackTrace: s, + ); return ExchangeResponse( exception: ExchangeException( e.toString(), @@ -415,8 +423,11 @@ class SimpleSwapAPI { return ExchangeResponse(value: trade); } catch (e, s) { - Logging.instance - .logd("getExchange exception: $e\n$s", level: LogLevel.Error); + Logging.instance.e( + "getExchange exception", + error: e, + stackTrace: s, + ); return ExchangeResponse( exception: ExchangeException( e.toString(), @@ -454,8 +465,11 @@ class SimpleSwapAPI { ), ); } catch (e, s) { - Logging.instance - .logd("getRange exception: $e\n$s", level: LogLevel.Error); + Logging.instance.e( + "getRange exception", + error: e, + stackTrace: s, + ); return ExchangeResponse( exception: ExchangeException( e.toString(), @@ -489,9 +503,10 @@ class SimpleSwapAPI { ); return result; } catch (e, s) { - Logging.instance.logd( - "getAvailableFixedRateMarkets exception: $e\n$s", - level: LogLevel.Error, + Logging.instance.e( + "getAvailableFixedRateMarkets exception: ", + error: e, + stackTrace: s, ); return ExchangeResponse( exception: ExchangeException( @@ -501,9 +516,10 @@ class SimpleSwapAPI { ); } } catch (e, s) { - Logging.instance.logd( - "getAvailableFixedRateMarkets exception: $e\n$s", - level: LogLevel.Error, + Logging.instance.e( + "getAvailableFixedRateMarkets exception: ", + error: e, + stackTrace: s, ); return ExchangeResponse( exception: ExchangeException( diff --git a/lib/services/exchange/trocador/trocador_api.dart b/lib/services/exchange/trocador/trocador_api.dart index 09eaeefe8..9aff6d872 100644 --- a/lib/services/exchange/trocador/trocador_api.dart +++ b/lib/services/exchange/trocador/trocador_api.dart @@ -70,10 +70,8 @@ abstract class TrocadorAPI { return json; } catch (e, s) { - Logging.instance.logd( - "_makeRequest($uri) HTTP:$code threw: $e\n$s", - level: LogLevel.Error, - ); + Logging.instance + .e("_makeRequest($uri) HTTP:$code threw: ", error: e, stackTrace: s); rethrow; } } @@ -106,8 +104,11 @@ abstract class TrocadorAPI { throw Exception("unexpected json: $json"); } } catch (e, s) { - Logging.instance - .logd("getCoins exception: $e\n$s", level: LogLevel.Error); + Logging.instance.e( + "getCoins exception", + error: e, + stackTrace: s, + ); return ExchangeResponse( exception: ExchangeException( e.toString(), @@ -137,8 +138,11 @@ abstract class TrocadorAPI { return ExchangeResponse(value: TrocadorTrade.fromMap(map)); } catch (e, s) { - Logging.instance - .logd("getTrade exception: $e\n$s", level: LogLevel.Error); + Logging.instance.e( + "getTrade exception", + error: e, + stackTrace: s, + ); return ExchangeResponse( exception: ExchangeException( e.toString(), @@ -212,8 +216,11 @@ abstract class TrocadorAPI { return ExchangeResponse(value: TrocadorRate.fromMap(map)); } catch (e, s) { - Logging.instance - .logd("getNewRate exception: $e\n$s", level: LogLevel.Error); + Logging.instance.e( + "getNewRate exception", + error: e, + stackTrace: s, + ); return ExchangeResponse( exception: ExchangeException( e.toString(), @@ -328,9 +335,10 @@ abstract class TrocadorAPI { "This trade couldn't be completed. Please select another provider."; } - Logging.instance.logd( - "_getNewTrade failed to parse response: $json\n$e\n$s", - level: LogLevel.Error, + Logging.instance.e( + "_getNewTrade failed to parse response: $json\n", + error: e, + stackTrace: s, ); return ExchangeResponse( exception: ExchangeException( @@ -340,10 +348,7 @@ abstract class TrocadorAPI { ); } } catch (e, s) { - Logging.instance.logd( - "_getNewTrade exception: $e\n$s", - level: LogLevel.Error, - ); + Logging.instance.e("_getNewTrade exception: ", error: e, stackTrace: s); return ExchangeResponse( exception: ExchangeException( e.toString(), diff --git a/lib/services/frost.dart b/lib/services/frost.dart index d0dc08d99..76c0b5db9 100644 --- a/lib/services/frost.dart +++ b/lib/services/frost.dart @@ -35,10 +35,7 @@ abstract class Frost { return participants; } catch (e, s) { - Logging.instance.logd( - "getParticipants failed: $e\n$s", - level: LogLevel.Fatal, - ); + Logging.instance.f("getParticipants failed: ", error: e, stackTrace: s); rethrow; } } @@ -48,10 +45,7 @@ abstract class Frost { decodeMultisigConfig(multisigConfig: encodedConfig); return true; } catch (e, s) { - Logging.instance.logd( - "validateEncodedMultisigConfig failed: $e\n$s", - level: LogLevel.Fatal, - ); + Logging.instance.f("validateEncodedMultisigConfig failed: ", error: e, stackTrace: s); return false; } } @@ -66,10 +60,7 @@ abstract class Frost { return threshold; } catch (e, s) { - Logging.instance.logd( - "getThreshold failed: $e\n$s", - level: LogLevel.Fatal, - ); + Logging.instance.f("getThreshold failed: ", error: e, stackTrace: s); rethrow; } } @@ -144,10 +135,7 @@ abstract class Frost { inputs: outputs, ); } catch (e, s) { - Logging.instance.logd( - "extractDataFromSignConfig failed: $e\n$s", - level: LogLevel.Fatal, - ); + Logging.instance.f("extractDataFromSignConfig failed: ", error: e, stackTrace: s); rethrow; } } @@ -168,10 +156,7 @@ abstract class Frost { return config; } catch (e, s) { - Logging.instance.logd( - "createMultisigConfig failed: $e\n$s", - level: LogLevel.Fatal, - ); + Logging.instance.f("createMultisigConfig failed: ", error: e, stackTrace: s); rethrow; } } @@ -204,10 +189,7 @@ abstract class Frost { secretShareMachineWrapperPtr: machinePtr, ); } catch (e, s) { - Logging.instance.logd( - "startKeyGeneration failed: $e\n$s", - level: LogLevel.Fatal, - ); + Logging.instance.f("startKeyGeneration failed: ", error: e, stackTrace: s); rethrow; } } @@ -234,10 +216,7 @@ abstract class Frost { return (share: share, secretSharesResPtr: secretSharesResPtr); } catch (e, s) { - Logging.instance.logd( - "generateSecretShares failed: $e\n$s", - level: LogLevel.Fatal, - ); + Logging.instance.f("generateSecretShares failed: ", error: e, stackTrace: s); rethrow; } } @@ -275,10 +254,7 @@ abstract class Frost { serializedKeys: serializedKeys, ); } catch (e, s) { - Logging.instance.logd( - "completeKeyGeneration failed: $e\n$s", - level: LogLevel.Fatal, - ); + Logging.instance.f("completeKeyGeneration failed: ", error: e, stackTrace: s); rethrow; } } @@ -322,10 +298,7 @@ abstract class Frost { return signConfig; } catch (e, s) { - Logging.instance.logd( - "createSignConfig failed: $e\n$s", - level: LogLevel.Fatal, - ); + Logging.instance.f("createSignConfig failed: ", error: e, stackTrace: s); rethrow; } } @@ -352,10 +325,7 @@ abstract class Frost { machinePtr: attemptSignRes.ref.machine, ); } catch (e, s) { - Logging.instance.logd( - "attemptSignConfig failed: $e\n$s", - level: LogLevel.Fatal, - ); + Logging.instance.f("attemptSignConfig failed: ", error: e, stackTrace: s); rethrow; } } @@ -378,10 +348,7 @@ abstract class Frost { machinePtr: continueSignRes.ref.machine, ); } catch (e, s) { - Logging.instance.logd( - "continueSigning failed: $e\n$s", - level: LogLevel.Fatal, - ); + Logging.instance.f("continueSigning failed: ", error: e, stackTrace: s); rethrow; } } @@ -398,10 +365,7 @@ abstract class Frost { return rawTransaction; } catch (e, s) { - Logging.instance.logd( - "completeSigning failed: $e\n$s", - level: LogLevel.Fatal, - ); + Logging.instance.f("completeSigning failed: ", error: e, stackTrace: s); rethrow; } } @@ -419,10 +383,7 @@ abstract class Frost { ); return configPtr; } catch (e, s) { - Logging.instance.logd( - "decodedSignConfig failed: $e\n$s", - level: LogLevel.Fatal, - ); + Logging.instance.f("decodedSignConfig failed: ", error: e, stackTrace: s); rethrow; } } @@ -443,10 +404,7 @@ abstract class Frost { return config; } catch (e, s) { - Logging.instance.logd( - "createResharerConfig failed: $e\n$s", - level: LogLevel.Fatal, - ); + Logging.instance.f("createResharerConfig failed: ", error: e, stackTrace: s); rethrow; } } @@ -469,10 +427,7 @@ abstract class Frost { machine: result.machine, ); } catch (e, s) { - Logging.instance.logd( - "beginResharer failed: $e\n$s", - level: LogLevel.Fatal, - ); + Logging.instance.f("beginResharer failed: ", error: e, stackTrace: s); rethrow; } } @@ -498,10 +453,7 @@ abstract class Frost { prior: result.machine, ); } catch (e, s) { - Logging.instance.logd( - "beginReshared failed: $e\n$s", - level: LogLevel.Fatal, - ); + Logging.instance.f("beginReshared failed: ", error: e, stackTrace: s); rethrow; } } @@ -518,10 +470,7 @@ abstract class Frost { ); return result; } catch (e, s) { - Logging.instance.logd( - "finishResharer failed: $e\n$s", - level: LogLevel.Fatal, - ); + Logging.instance.f("finishResharer failed: ", error: e, stackTrace: s); rethrow; } } @@ -542,10 +491,7 @@ abstract class Frost { ); return result; } catch (e, s) { - Logging.instance.logd( - "finishReshared failed: $e\n$s", - level: LogLevel.Fatal, - ); + Logging.instance.f("finishReshared failed: ", error: e, stackTrace: s); rethrow; } } @@ -558,10 +504,7 @@ abstract class Frost { return config; } catch (e, s) { - Logging.instance.logd( - "decodedResharerConfig failed: $e\n$s", - level: LogLevel.Fatal, - ); + Logging.instance.f("decodedResharerConfig failed: ", error: e, stackTrace: s); rethrow; } } @@ -631,10 +574,7 @@ abstract class Frost { newParticipants: newParticipants, ); } catch (e, s) { - Logging.instance.logd( - "extractResharerConfigData failed: $e\n$s", - level: LogLevel.Fatal, - ); + Logging.instance.f("extractResharerConfigData failed: ", error: e, stackTrace: s); rethrow; } } diff --git a/lib/services/fusion_tor_service.dart b/lib/services/fusion_tor_service.dart index d7bf5181b..caa0ec2ee 100644 --- a/lib/services/fusion_tor_service.dart +++ b/lib/services/fusion_tor_service.dart @@ -62,10 +62,7 @@ class FusionTorService { try { await _tor!.start(torDataDirPath: _torDataDirPath!); } catch (e, s) { - Logging.instance.logd( - "FusionTorService.start failed: $e\n$s", - level: LogLevel.Warning, - ); + Logging.instance.w("FusionTorService.start failed: ", error: e, stackTrace: s); rethrow; } } diff --git a/lib/services/monkey_service.dart b/lib/services/monkey_service.dart index 1f326cf5a..0ae745d34 100644 --- a/lib/services/monkey_service.dart +++ b/lib/services/monkey_service.dart @@ -39,10 +39,7 @@ class MonKeyService { ); } } catch (e, s) { - Logging.instance.logd( - "Failed fetchMonKey($address): $e\n$s", - level: LogLevel.Error, - ); + Logging.instance.e("Failed fetchMonKey($address): ", error: e, stackTrace: s); rethrow; } } diff --git a/lib/services/node_service.dart b/lib/services/node_service.dart index c32664839..35f595050 100644 --- a/lib/services/node_service.dart +++ b/lib/services/node_service.dart @@ -293,7 +293,7 @@ class NodeService extends ChangeNotifier { final json = jsonDecode(response.body) as Map; final result = jsonDecode(json['result'] as String); final map = jsonDecode(result as String); - Logging.instance.logd(map, level: LogLevel.Info); + Logging.instance.d(map); for (final coin in AppConfig.coins) { final nodeList = List>.from( @@ -330,8 +330,11 @@ class NodeService extends ChangeNotifier { } } } catch (e, s) { - Logging.instance - .logd("updateCommunityNodes() failed: $e\n$s", level: LogLevel.Error); + Logging.instance.e( + "updateCommunityNodes() failed", + error: e, + stackTrace: s, + ); } } } diff --git a/lib/services/notifications_service.dart b/lib/services/notifications_service.dart index 181678f9e..93e09aceb 100644 --- a/lib/services/notifications_service.dart +++ b/lib/services/notifications_service.dart @@ -105,8 +105,7 @@ class NotificationsService extends ChangeNotifier { stopCheckingWatchedTransactions(); _timer = Timer.periodic(notificationRefreshInterval, (_) { - Logging.instance - .logd("Periodic notifications update check", level: LogLevel.Info); + Logging.instance.d("Periodic notifications update check"); if (prefs.externalCalls) { _checkTrades(); } @@ -222,7 +221,7 @@ class NotificationsService extends ChangeNotifier { } on NoSuchTransactionException catch (e, s) { await _deleteWatchedTxNotification(notification); } catch (e, s) { - Logging.instance.logd("$e $s", level: LogLevel.Error); + Logging.instance.e("$e $s", error: e, stackTrace: s); } } } diff --git a/lib/services/price.dart b/lib/services/price.dart index f8a5139f5..a3c31ef17 100644 --- a/lib/services/price.dart +++ b/lib/services/price.dart @@ -131,9 +131,8 @@ class PriceAPI { final externalCalls = Prefs.instance.externalCalls; if ((!Util.isTestEnv && !externalCalls) || !(await Prefs.instance.isExternalCallsSet())) { - Logging.instance.logd( + Logging.instance.i( "User does not want to use external calls", - level: LogLevel.Info, ); return _cachedPrices; } @@ -172,10 +171,8 @@ class PriceAPI { return _cachedPrices; } catch (e, s) { - Logging.instance.logd( - "getPricesAnd24hChange($baseCurrency): $e\n$s", - level: LogLevel.Error, - ); + Logging.instance + .e("getPricesAnd24hChange($baseCurrency): ", error: e, stackTrace: s); // return previous cached values return _cachedPrices; } @@ -187,9 +184,8 @@ class PriceAPI { if ((!Util.isTestEnv && !externalCalls) || !(await Prefs.instance.isExternalCallsSet())) { - Logging.instance.logd( + Logging.instance.i( "User does not want to use external calls", - level: LogLevel.Info, ); return null; } @@ -208,9 +204,10 @@ class PriceAPI { final json = jsonDecode(response.body) as List; return List.from(json); } catch (e, s) { - Logging.instance.logd( - "availableBaseCurrencies() using $uriString: $e\n$s", - level: LogLevel.Error, + Logging.instance.e( + "availableBaseCurrencies() using $uriString: ", + error: e, + stackTrace: s, ); return null; } @@ -229,9 +226,8 @@ class PriceAPI { final externalCalls = Prefs.instance.externalCalls; if ((!Util.isTestEnv && !externalCalls) || !(await Prefs.instance.isExternalCallsSet())) { - Logging.instance.logd( + Logging.instance.i( "User does not want to use external calls", - level: LogLevel.Info, ); return tokenPrices; } @@ -273,9 +269,10 @@ class PriceAPI { return tokenPrices; } catch (e, s) { - Logging.instance.logd( - "getPricesAnd24hChangeForEthTokens($baseCurrency,$contractAddresses): $e\n$s", - level: LogLevel.Error, + Logging.instance.e( + "getPricesAnd24hChangeForEthTokens($baseCurrency,$contractAddresses): ", + error: e, + stackTrace: s, ); // return previous cached values return tokenPrices; diff --git a/lib/services/tor_service.dart b/lib/services/tor_service.dart index 49ab83a0b..542032df7 100644 --- a/lib/services/tor_service.dart +++ b/lib/services/tor_service.dart @@ -85,10 +85,7 @@ class TorService { // Complete the future. return; } catch (e, s) { - Logging.instance.logd( - "TorService.start failed: $e\n$s", - level: LogLevel.Warning, - ); + Logging.instance.w("TorService.start failed: ", error: e, stackTrace: s); // _enabled should already be false // Fire a TorConnectionStatusChangedEvent on the event bus. diff --git a/lib/services/wallets.dart b/lib/services/wallets.dart index 701f77d9b..07856e6ee 100644 --- a/lib/services/wallets.dart +++ b/lib/services/wallets.dart @@ -72,10 +72,7 @@ class Wallets { SecureStorageInterface secureStorage, ) async { final walletId = info.walletId; - Logging.instance.logd( - "deleteWallet called with walletId=$walletId", - level: LogLevel.Warning, - ); + Logging.instance.d("deleteWallet called with walletId=$walletId"); final wallet = _wallets[walletId]; _wallets.remove(walletId); @@ -96,24 +93,21 @@ class Wallets { type: lib_monero_compat.WalletType.wownero, appRoot: await StackFileSystem.applicationRootDirectory(), ); - Logging.instance - .logd("monero wallet: $walletId deleted", level: LogLevel.Info); + Logging.instance.d("monero wallet: $walletId deleted"); } else if (info.coin is Monero) { await lib_monero_compat.deleteWalletFiles( name: walletId, type: lib_monero_compat.WalletType.monero, appRoot: await StackFileSystem.applicationRootDirectory(), ); - Logging.instance - .logd("monero wallet: $walletId deleted", level: LogLevel.Info); + Logging.instance.d("monero wallet: $walletId deleted"); } else if (info.coin is Epiccash) { final deleteResult = await deleteEpicWallet( walletId: walletId, secureStore: secureStorage, ); - Logging.instance.logd( + Logging.instance.d( "epic wallet: $walletId deleted with result: $deleteResult", - level: LogLevel.Info, ); } @@ -210,11 +204,9 @@ class Wallets { for (final walletInfo in walletInfoList) { try { final isVerified = await walletInfo.isMnemonicVerified(mainDB.isar); - Logging.instance.logd( - "LOADING WALLET: ${walletInfo.name}:${walletInfo.walletId} " - "IS VERIFIED: $isVerified", - level: LogLevel.Info, - ); + Logging.instance + .d("LOADING WALLET: ${walletInfo.name}:${walletInfo.walletId} " + "IS VERIFIED: $isVerified"); if (isVerified) { // TODO: integrate this into the new wallets somehow? @@ -252,7 +244,7 @@ class Wallets { // await walletsService.deleteWallet(walletInfo.name, false); } } catch (e, s) { - Logging.instance.logd("$e $s", level: LogLevel.Fatal); + Logging.instance.w("", error: e, stackTrace: s); continue; } } @@ -317,11 +309,9 @@ class Wallets { for (final walletInfo in walletInfoList) { try { final isVerified = await walletInfo.isMnemonicVerified(mainDB.isar); - Logging.instance.logd( - "LOADING WALLET: ${walletInfo.name}:${walletInfo.walletId} " - "IS VERIFIED: $isVerified", - level: LogLevel.Info, - ); + Logging.instance + .d("LOADING WALLET: ${walletInfo.name}:${walletInfo.walletId} " + "IS VERIFIED: $isVerified"); if (isVerified) { // TODO: integrate this into the new wallets somehow? @@ -355,7 +345,11 @@ class Wallets { deleteFutures.add(_deleteWallet(walletInfo.walletId)); } } catch (e, s) { - Logging.instance.logd("$e $s", level: LogLevel.Fatal); + Logging.instance.w( + "$e $s", + error: e, + stackTrace: s, + ); continue; } } @@ -447,11 +441,9 @@ class Wallets { for (final walletInfo in walletInfoList) { try { final isVerified = await walletInfo.isMnemonicVerified(mainDB.isar); - Logging.instance.logd( - "LOADING WALLET: ${walletInfo.name}:${walletInfo.walletId} " - "IS VERIFIED: $isVerified", - level: LogLevel.Info, - ); + Logging.instance + .d("LOADING WALLET: ${walletInfo.name}:${walletInfo.walletId} " + "IS VERIFIED: $isVerified"); if (isVerified) { // TODO: integrate this into the new wallets somehow? @@ -485,7 +477,11 @@ class Wallets { deleteFutures.add(_deleteWallet(walletInfo.walletId)); } } catch (e, s) { - Logging.instance.logd("$e $s", level: LogLevel.Fatal); + Logging.instance.w( + "$e $s", + error: e, + stackTrace: s, + ); continue; } } @@ -509,9 +505,8 @@ class Wallets { Future _refreshFutures(List idsToRefresh) async { final start = DateTime.now(); - Logging.instance.logd( + Logging.instance.d( "Initial refresh start: ${start.toUtc()}", - level: LogLevel.Warning, ); const groupCount = 3; for (int i = 0; i < idsToRefresh.length; i += groupCount) { @@ -526,10 +521,8 @@ class Wallets { } await Future.wait(futures); } - Logging.instance.logd( - "Initial refresh duration: ${DateTime.now().difference(start)}", - level: LogLevel.Warning, - ); + Logging.instance + .d("Initial refresh duration: ${DateTime.now().difference(start)}"); } if (walletInitFutures.isNotEmpty && walletsToInitLinearly.isNotEmpty) { @@ -580,9 +573,8 @@ class Wallets { for (final wallet in wallets) { final isVerified = await wallet.info.isMnemonicVerified(mainDB.isar); - Logging.instance.logd( + Logging.instance.d( "LOADING WALLET: ${wallet.info.name}:${wallet.walletId} IS VERIFIED: $isVerified", - level: LogLevel.Info, ); if (isVerified) { diff --git a/lib/services/wallets_service.dart b/lib/services/wallets_service.dart index 7d0e90c33..25d768fe8 100644 --- a/lib/services/wallets_service.dart +++ b/lib/services/wallets_service.dart @@ -75,9 +75,8 @@ class WalletsService extends ChangeNotifier { final names = DB.instance .get(boxName: DB.boxNameAllWalletsData, key: 'names') as Map?; if (names == null) { - Logging.instance.logd( + Logging.instance.e( "Fetched wallet 'names' returned null. Setting initializing 'names'", - level: LogLevel.Info, ); await DB.instance.put( boxName: DB.boxNameAllWalletsData, @@ -86,7 +85,7 @@ class WalletsService extends ChangeNotifier { ); return {}; } - Logging.instance.logd("Fetched wallet names: $names", level: LogLevel.Info); + Logging.instance.d("Fetched wallet names: $names"); final mapped = Map.from(names); mapped.removeWhere((name, dyn) { final jsonObject = Map.from(dyn as Map); @@ -94,9 +93,10 @@ class WalletsService extends ChangeNotifier { AppConfig.getCryptoCurrencyFor(jsonObject["coin"] as String); return false; } catch (e, s) { - Logging.instance.logd( + Logging.instance.e( "Error, ${jsonObject["coin"]} does not exist", - level: LogLevel.Error, + error: e, + stackTrace: s, ); return true; } diff --git a/lib/themes/theme_service.dart b/lib/themes/theme_service.dart index 930280535..1915239a5 100644 --- a/lib/themes/theme_service.dart +++ b/lib/themes/theme_service.dart @@ -77,9 +77,9 @@ class ThemeService { if (file.isFile) { // TODO more sanitation? if (file.name.contains("..")) { - Logging.instance.logd( + Logging.instance.e( "Bad theme asset file path: ${file.name}", - level: LogLevel.Error, + stackTrace: StackTrace.current, ); } else { final os = OutputFileStream("$assetsPath/${file.name}"); @@ -110,9 +110,9 @@ class ThemeService { await dir.delete(recursive: true); } } else { - Logging.instance.logd( + Logging.instance.w( "Failed to delete theme $themeId", - level: LogLevel.Warning, + stackTrace: StackTrace.current, ); } } @@ -142,18 +142,12 @@ class ThemeService { } Future _updateDefaultTheme(String name) async { - Logging.instance.logd( - "Updating default $name theme...", - level: LogLevel.Info, - ); + Logging.instance.w("Updating default $name theme..."); final zip = await rootBundle.load("assets/default_themes/$name.zip"); await ThemeService.instance.install( themeArchiveData: zip.buffer.asUint8List(), ); - Logging.instance.logd( - "Updating default $name theme... finished", - level: LogLevel.Info, - ); + Logging.instance.w("Updating default $name theme... finished"); } // TODO more thorough check/verification of theme @@ -174,9 +168,9 @@ class ThemeService { await Directory("${themesDir.path}/$themeId/assets").exists(); if (!jsonFileExists || !assetsDirExists) { - Logging.instance.logd( + Logging.instance.w( "Theme $themeId found in DB but is missing files", - level: LogLevel.Warning, + stackTrace: StackTrace.current, ); } @@ -204,10 +198,8 @@ class ThemeService { return result; } catch (e, s) { - Logging.instance.logd( - "Failed to fetch themes list: $e\n$s", - level: LogLevel.Warning, - ); + Logging.instance + .w("Failed to fetch themes list: ", error: e, stackTrace: s); rethrow; } } @@ -236,10 +228,8 @@ class ThemeService { ); } } catch (e, s) { - Logging.instance.logd( - "Failed to fetch themes list: $e\n$s", - level: LogLevel.Warning, - ); + Logging.instance + .w("Failed to fetch themes list: ", error: e, stackTrace: s); rethrow; } } @@ -279,10 +269,10 @@ class StackThemeMetaData { previewImageUrl: map["previewImageUrl"] as String, ); } catch (e, s) { - Logging.instance.logd( - "Failed to create instance of StackThemeMetaData using $map: \n$e\n$s", - level: LogLevel.Fatal, - ); + Logging.instance.f( + "Failed to create instance of StackThemeMetaData using $map", + error: e, + stackTrace: s); rethrow; } } diff --git a/lib/utilities/address_utils.dart b/lib/utilities/address_utils.dart index d63dca66f..171dc09b2 100644 --- a/lib/utilities/address_utils.dart +++ b/lib/utilities/address_utils.dart @@ -155,7 +155,7 @@ class AddressUtils { additionalParams: filteredParams, ); } catch (e, s) { - logging?.logd("$e\n$s", level: LogLevel.Error); + logging?.e("", error: e, stackTrace: s); return null; } } diff --git a/lib/utilities/biometrics.dart b/lib/utilities/biometrics.dart index 6dbb05982..9a30d5fe3 100644 --- a/lib/utilities/biometrics.dart +++ b/lib/utilities/biometrics.dart @@ -27,16 +27,14 @@ class Biometrics { required String title, }) async { if (!(Platform.isIOS || Platform.isAndroid)) { - Logging.instance.logd( + Logging.instance.w( "Tried to use Biometrics.authenticate() on a platform that is not Android or iOS! ...returning false.", - level: LogLevel.Error, ); return false; } if (integrationTestFlag) { - Logging.instance.logd( + Logging.instance.w( "Tried to use Biometrics.authenticate() during integration testing. Returning false.", - level: LogLevel.Warning, ); return false; } @@ -50,12 +48,12 @@ class Biometrics { // debugPrint("isDeviceSupported: $isDeviceSupported"); if (canCheckBiometrics && isDeviceSupported) { - List availableSystems = + final List availableSystems = await localAuth.getAvailableBiometrics(); - Logging.instance.logd( + Logging.instance.w( "Bio availableSystems: $availableSystems", - level: LogLevel.Info, + stackTrace: StackTrace.current, ); //TODO properly handle caught exceptions @@ -78,10 +76,11 @@ class Biometrics { if (didAuthenticate) { return true; } - } catch (e) { - Logging.instance.logd( + } catch (e, s) { + Logging.instance.e( "local_auth exception caught in Biometrics.authenticate(), e: $e", - level: LogLevel.Error, + error: e, + stackTrace: s, ); } } diff --git a/lib/utilities/connection_check/electrum_connection_check.dart b/lib/utilities/connection_check/electrum_connection_check.dart index e90d7896c..325cfa059 100644 --- a/lib/utilities/connection_check/electrum_connection_check.dart +++ b/lib/utilities/connection_check/electrum_connection_check.dart @@ -27,9 +27,8 @@ Future checkElectrumServer({ // And the killswitch isn't set... if (!_prefs.torKillSwitch) { // Then we'll just proceed and connect to ElectrumX through clearnet at the bottom of this function. - Logging.instance.logd( + Logging.instance.w( "Tor preference set but Tor is not enabled, killswitch not set, connecting to Electrum adapter through clearnet", - level: LogLevel.Warning, ); } else { // ... But if the killswitch is set, then we throw an exception. @@ -62,7 +61,11 @@ Future checkElectrumServer({ return true; } catch (e, s) { - Logging.instance.logd("$e\n$s", level: LogLevel.Debug); + Logging.instance.e( + "$e\n$s", + error: e, + stackTrace: s, + ); return false; } } diff --git a/lib/utilities/desktop_password_service.dart b/lib/utilities/desktop_password_service.dart index 7197cced8..39243962b 100644 --- a/lib/utilities/desktop_password_service.dart +++ b/lib/utilities/desktop_password_service.dart @@ -68,10 +68,7 @@ class DPS { await _put(key: _kKeyBlobKey, value: await _handler!.getKeyBlob()); await _updateStoredKeyBlobVersion(kLatestBlobVersion); } catch (e, s) { - Logging.instance.logd( - "${_getMessageFromException(e)}\n$s", - level: LogLevel.Error, - ); + Logging.instance.e("${_getMessageFromException(e)}\n$s", error: e, stackTrace: s); rethrow; } } @@ -104,10 +101,7 @@ class DPS { await _updateStoredKeyBlobVersion(kLatestBlobVersion); } } catch (e, s) { - Logging.instance.logd( - "${_getMessageFromException(e)}\n$s", - level: LogLevel.Error, - ); + Logging.instance.e("${_getMessageFromException(e)}\n$s", error: e, stackTrace: s); throw Exception(_getMessageFromException(e)); } } @@ -125,10 +119,7 @@ class DPS { // existing passphrase matches key blob return true; } catch (e, s) { - Logging.instance.logd( - "${_getMessageFromException(e)}\n$s", - level: LogLevel.Warning, - ); + Logging.instance.w("${_getMessageFromException(e)}\n$s", error: e, stackTrace: s,); // password is wrong or some other error return false; } @@ -161,10 +152,7 @@ class DPS { // successfully updated passphrase return true; } catch (e, s) { - Logging.instance.logd( - "${_getMessageFromException(e)}\n$s", - level: LogLevel.Warning, - ); + Logging.instance.w("${_getMessageFromException(e)}\n$s", error: e, stackTrace: s,); return false; } } @@ -189,10 +177,7 @@ class DPS { box = await DB.instance.hive.openBox(kBoxNameDesktopData); await box.put(key, value); } catch (e, s) { - Logging.instance.logd( - "DPS failed put($key): $e\n$s", - level: LogLevel.Fatal, - ); + Logging.instance.f("DPS failed put($key): ", error: e, stackTrace: s); } finally { await box?.close(); } @@ -205,10 +190,7 @@ class DPS { box = await DB.instance.hive.openBox(kBoxNameDesktopData); value = box.get(key); } catch (e, s) { - Logging.instance.logd( - "DPS failed get($key): $e\n$s", - level: LogLevel.Fatal, - ); + Logging.instance.f("DPS failed get($key): ", error: e, stackTrace: s); } finally { await box?.close(); } diff --git a/lib/utilities/extensions/impl/contract_abi.dart b/lib/utilities/extensions/impl/contract_abi.dart index 401e8af04..74f252a69 100644 --- a/lib/utilities/extensions/impl/contract_abi.dart +++ b/lib/utilities/extensions/impl/contract_abi.dart @@ -68,10 +68,7 @@ extension ContractAbiExtensions on ContractAbi { return ContractAbi(name, functions, events); } catch (e, s) { - Logging.instance.logd( - "Failed to parse ABI for $name: $e\n$s", - level: LogLevel.Error, - ); + Logging.instance.e("Failed to parse ABI for $name: ", error: e, stackTrace: s); rethrow; } } diff --git a/lib/utilities/git_status.dart b/lib/utilities/git_status.dart index 0f873df3f..0a3f081a6 100644 --- a/lib/utilities/git_status.dart +++ b/lib/utilities/git_status.dart @@ -138,7 +138,7 @@ abstract class GitStatus { String project, String commit, ) async { - Logging.instance.logd("doesCommitExist", level: LogLevel.Info); + Logging.instance.d("doesCommitExist"); final Client client = Client(); try { final uri = Uri.parse( @@ -151,21 +151,17 @@ abstract class GitStatus { ); final response = jsonDecode(commitQuery.body.toString()); - Logging.instance.logd( - "doesCommitExist $project $commit $response", - level: LogLevel.Info, - ); + Logging.instance.d("doesCommitExist $project $commit $response"); bool isThereCommit; try { isThereCommit = response['sha'] == commit; - Logging.instance - .logd("isThereCommit $isThereCommit", level: LogLevel.Info); + Logging.instance.d("isThereCommit $isThereCommit"); return isThereCommit; } catch (e, s) { return false; } } catch (e, s) { - Logging.instance.logd("$e $s", level: LogLevel.Error); + Logging.instance.e("$e $s", error: e, stackTrace: s); return false; } } @@ -176,7 +172,7 @@ abstract class GitStatus { String branch, String commit, ) async { - Logging.instance.logd("doesCommitExist", level: LogLevel.Info); + Logging.instance.d("doesCommitExist"); final Client client = Client(); try { final uri = Uri.parse( @@ -189,20 +185,17 @@ abstract class GitStatus { ); final response = jsonDecode(commitQuery.body.toString()); - Logging.instance.logd( - "isHeadCommit $project $commit $branch $response", - level: LogLevel.Info, - ); + Logging.instance.d("isHeadCommit $project $commit $branch $response"); bool isHead; try { isHead = response['sha'] == commit; - Logging.instance.logd("isHead $isHead", level: LogLevel.Info); + Logging.instance.d("isHead $isHead"); return isHead; - } catch (e, s) { - return false; + } catch (e) { + rethrow; } } catch (e, s) { - Logging.instance.logd("$e $s", level: LogLevel.Error); + Logging.instance.e("", error: e, stackTrace: s); return false; } } diff --git a/lib/utilities/logger.dart b/lib/utilities/logger.dart index 7243de77a..f62b1ea4e 100644 --- a/lib/utilities/logger.dart +++ b/lib/utilities/logger.dart @@ -17,7 +17,6 @@ import 'dart:ui'; import 'package:flutter_libsparkmobile/flutter_libsparkmobile.dart' as spark; import 'package:logger/logger.dart'; -import 'enums/log_level_enum.dart'; import 'util.dart'; export 'enums/log_level_enum.dart'; @@ -144,18 +143,6 @@ class Logging { ? message.toString() : JsonEncoder.withIndent(' ', (o) => o.toString()).convert(message); - @core.Deprecated("Use Logging.instance.log instead") - void logd( - core.Object? object, { - required LogLevel level, - core.bool printToConsole = true, - core.bool printFullLength = false, - }) => - log( - level.getLoggerLevel(), - object, - ); - void log( Level level, dynamic message, { diff --git a/lib/utilities/show_loading.dart b/lib/utilities/show_loading.dart index 7f97ca851..040bc2303 100644 --- a/lib/utilities/show_loading.dart +++ b/lib/utilities/show_loading.dart @@ -71,10 +71,7 @@ Future showLoading({ result = await whileFuture; } } catch (e, s) { - Logging.instance.logd( - "showLoading caught: $e\n$s", - level: LogLevel.Warning, - ); + Logging.instance.w("showLoading caught: ", error: e, stackTrace: s); ex = e is Exception ? e : Exception(e.toString()); } diff --git a/lib/utilities/test_epic_box_connection.dart b/lib/utilities/test_epic_box_connection.dart index 8e98e4ccf..1c39390e2 100644 --- a/lib/utilities/test_epic_box_connection.dart +++ b/lib/utilities/test_epic_box_connection.dart @@ -41,7 +41,7 @@ Future _testEpicBoxNodeConnection(Uri uri) async { return false; } } catch (e, s) { - Logging.instance.logd("$e\n$s", level: LogLevel.Warning); + Logging.instance.w("$e\n$s", error: e, stackTrace: s,); return false; } } @@ -87,7 +87,7 @@ Future testEpicNodeConnection(NodeFormData data) async { return null; } } catch (e, s) { - Logging.instance.logd("$e\n$s", level: LogLevel.Warning); + Logging.instance.w("$e\n$s", error: e, stackTrace: s,); return null; } } diff --git a/lib/utilities/test_monero_node_connection.dart b/lib/utilities/test_monero_node_connection.dart index 0abfff5ae..7eba0ee30 100644 --- a/lib/utilities/test_monero_node_connection.dart +++ b/lib/utilities/test_monero_node_connection.dart @@ -103,7 +103,7 @@ Future testMoneroNodeConnection( return MoneroNodeConnectionResponse(null, null, null, success); } catch (e, s) { - Logging.instance.logd("$e\n$s", level: LogLevel.Warning); + Logging.instance.w("$e\n$s", error: e, stackTrace: s,); return MoneroNodeConnectionResponse(null, null, null, false); } finally { await socket?.close(); @@ -150,7 +150,7 @@ Future testMoneroNodeConnection( if (badCertResponse != null) { return badCertResponse!; } else { - Logging.instance.logd("$e\n$s", level: LogLevel.Warning); + Logging.instance.w("$e\n$s", error: e, stackTrace: s,); return MoneroNodeConnectionResponse(null, null, null, false); } } finally { diff --git a/lib/utilities/test_node_connection.dart b/lib/utilities/test_node_connection.dart index f3e1a9618..b212d3a0a 100644 --- a/lib/utilities/test_node_connection.dart +++ b/lib/utilities/test_node_connection.dart @@ -100,17 +100,15 @@ Future testNodeConnection({ if (ref.read(prefsChangeNotifierProvider).useTor) { if (formData.netOption! == TorPlainNetworkOption.clear) { - Logging.instance.logd( + Logging.instance.w( "This node is configured for non-TOR only but TOR is enabled", - level: LogLevel.Warning, ); return false; } } else { if (formData.netOption! == TorPlainNetworkOption.tor) { - Logging.instance.logd( + Logging.instance.w( "This node is configured for TOR only but TOR is disabled", - level: LogLevel.Warning, ); return false; } @@ -128,7 +126,11 @@ Future testNodeConnection({ onSuccess?.call(data); } } catch (e, s) { - Logging.instance.logd("$e\n$s", level: LogLevel.Warning); + Logging.instance.w( + "$e\n$s", + error: e, + stackTrace: s, + ); } break; @@ -175,7 +177,11 @@ Future testNodeConnection({ } } } catch (e, s) { - Logging.instance.logd("$e\n$s", level: LogLevel.Warning); + Logging.instance.w( + "$e\n$s", + error: e, + stackTrace: s, + ); } break; @@ -251,9 +257,8 @@ Future testNodeConnection({ ); final health = await rpcClient.getHealth(); - Logging.instance.logd( + Logging.instance.i( "Solana testNodeConnection \"health=$health\"", - level: LogLevel.Info, ); return true; } catch (_) { @@ -283,9 +288,8 @@ Future testNodeConnection({ BlockfrostRequestBackendHealthStatus(), ); - Logging.instance.logd( + Logging.instance.i( "Cardano testNodeConnection \"health=$health\"", - level: LogLevel.Info, ); return health; diff --git a/lib/wallets/api/lelantus_ffi_wrapper.dart b/lib/wallets/api/lelantus_ffi_wrapper.dart index 5bb9dab11..3ee60d994 100644 --- a/lib/wallets/api/lelantus_ffi_wrapper.dart +++ b/lib/wallets/api/lelantus_ffi_wrapper.dart @@ -48,10 +48,7 @@ abstract final class LelantusFfiWrapper { try { return await compute(_restore, args); } catch (e, s) { - Logging.instance.logd( - "Exception rethrown from _restore(): $e\n$s", - level: LogLevel.Info, - ); + Logging.instance.i("Exception rethrown from _restore(): ", error: e, stackTrace: s); rethrow; } } diff --git a/lib/wallets/api/tezos/tezos_api.dart b/lib/wallets/api/tezos/tezos_api.dart index 8e81f6451..49065433e 100644 --- a/lib/wallets/api/tezos/tezos_api.dart +++ b/lib/wallets/api/tezos/tezos_api.dart @@ -25,10 +25,7 @@ abstract final class TezosAPI { final result = jsonDecode(response.body); return result as int; } catch (e, s) { - Logging.instance.logd( - "Error occurred in TezosAPI while getting counter for $address: $e\n$s", - level: LogLevel.Error, - ); + Logging.instance.e("Error occurred in TezosAPI while getting counter for $address: ", error: e, stackTrace: s); rethrow; } } @@ -53,10 +50,7 @@ abstract final class TezosAPI { return account; } catch (e, s) { - Logging.instance.logd( - "Error occurred in TezosAPI while getting account for $address: $e\n$s", - level: LogLevel.Error, - ); + Logging.instance.e("Error occurred in TezosAPI while getting account for $address: ", error: e, stackTrace: s); rethrow; } } @@ -109,10 +103,7 @@ abstract final class TezosAPI { } return txs; } catch (e, s) { - Logging.instance.logd( - "Error occurred in TezosAPI while getting transactions for $address: $e\n$s", - level: LogLevel.Error, - ); + Logging.instance.e("Error occurred in TezosAPI while getting transactions for $address: ", error: e, stackTrace: s); rethrow; } } diff --git a/lib/wallets/api/tezos/tezos_rpc_api.dart b/lib/wallets/api/tezos/tezos_rpc_api.dart index a5da3b01e..4f9c71fe8 100644 --- a/lib/wallets/api/tezos/tezos_rpc_api.dart +++ b/lib/wallets/api/tezos/tezos_rpc_api.dart @@ -27,10 +27,11 @@ abstract final class TezosRpcAPI { final balance = BigInt.parse(response.body.substring(1, response.body.length - 2)); return balance; - } catch (e) { - Logging.instance.logd( + } catch (e, s) { + Logging.instance.e( "Error occurred in tezos_rpc_api.dart while getting balance for $address: $e", - level: LogLevel.Error, + error: e, + stackTrace: s, ); } return null; @@ -53,10 +54,11 @@ abstract final class TezosRpcAPI { final jsonParsedResponse = jsonDecode(response.body); return int.parse(jsonParsedResponse["level"].toString()); - } catch (e) { - Logging.instance.logd( + } catch (e, s) { + Logging.instance.e( "Error occurred in tezos_rpc_api.dart while getting chain height for tezos: $e", - level: LogLevel.Error, + error: e, + stackTrace: s, ); } return null; diff --git a/lib/wallets/wallet/impl/bitcoin_frost_wallet.dart b/lib/wallets/wallet/impl/bitcoin_frost_wallet.dart index 5400ba457..3beaa0e8d 100644 --- a/lib/wallets/wallet/impl/bitcoin_frost_wallet.dart +++ b/lib/wallets/wallet/impl/bitcoin_frost_wallet.dart @@ -56,10 +56,7 @@ class BitcoinFrostWallet extends Wallet required List participants, required int threshold, }) async { - Logging.instance.logd( - "Generating new FROST wallet.", - level: LogLevel.Info, - ); + Logging.instance.i("Generating new FROST wallet."); try { final salt = frost @@ -108,9 +105,10 @@ class BitcoinFrostWallet extends Wallet await mainDB.putAddresses([address]); } catch (e, s) { - Logging.instance.logd( - "Exception rethrown from initializeNewFrost(): $e\n$s", - level: LogLevel.Fatal, + Logging.instance.f( + "Exception rethrown from initializeNewFrost(): ", + error: e, + stackTrace: s, ); rethrow; } @@ -626,10 +624,7 @@ class BitcoinFrostWallet extends Wallet // TODO: [prio=none] Check for special Bitcoin outputs like ordinals. } else { - Logging.instance.logd( - "Unexpected tx found (ignoring it): $txData", - level: LogLevel.Error, - ); + Logging.instance.e("Unexpected tx found (ignoring it): $txData"); continue; } @@ -683,13 +678,13 @@ class BitcoinFrostWallet extends Wallet if (index >= someSaneMaximum) { throw Exception( - "index < kFrostSecureStartingIndex hit someSaneMaximum"); + "index < kFrostSecureStartingIndex hit someSaneMaximum", + ); } } else { - Logging.instance.logd( + Logging.instance.f( "$runtimeType.checkSaveInitialReceivingAddress() failed due" " to missing serialized keys", - level: LogLevel.Fatal, ); } } @@ -698,13 +693,14 @@ class BitcoinFrostWallet extends Wallet @override Future confirmSend({required TxData txData}) async { try { - Logging.instance - .logd("confirmSend txData: $txData", level: LogLevel.Info); + Logging.instance.d("confirmSend txData: $txData"); final hex = txData.raw!; final txHash = await electrumXClient.broadcastTransaction(rawTx: hex); - Logging.instance.logd("Sent txHash: $txHash", level: LogLevel.Info); + Logging.instance.d( + "Sent txHash: $txHash", + ); // mark utxos as used final usedUTXOs = txData.utxos!.map((e) => e.copyWith(used: true)); @@ -718,9 +714,10 @@ class BitcoinFrostWallet extends Wallet return txData; } catch (e, s) { - Logging.instance.logd( - "Exception rethrown from confirmSend(): $e\n$s", - level: LogLevel.Error, + Logging.instance.e( + "Exception rethrown from confirmSend(): ", + error: e, + stackTrace: s, ); rethrow; } @@ -804,11 +801,14 @@ class BitcoinFrostWallet extends Wallet ).raw.toInt(), ); - Logging.instance.logd("fetched fees: $feeObject", level: LogLevel.Info); + Logging.instance.i("fetched fees: $feeObject"); return feeObject; - } catch (e) { - Logging.instance.logd("Exception rethrown from _getFees(): $e", - level: LogLevel.Error); + } catch (e, s) { + Logging.instance.e( + "Exception rethrown from _getFees(): $e", + error: e, + stackTrace: s, + ); rethrow; } } @@ -831,7 +831,7 @@ class BitcoinFrostWallet extends Wallet } if (serializedKeys == null || multisigConfig == null) { final err = "${info.coinName} wallet ${info.walletId} had null keys/cfg"; - Logging.instance.logd(err, level: LogLevel.Fatal); + Logging.instance.f(err, stackTrace: StackTrace.current); throw Exception(err); // TODO [prio=low]: handle null keys or config. This should not happen. } @@ -958,10 +958,8 @@ class BitcoinFrostWallet extends Wallet unawaited(refresh()); } catch (e, s) { - Logging.instance.logd( - "recoverFromSerializedKeys failed: $e\n$s", - level: LogLevel.Fatal, - ); + Logging.instance + .f("recoverFromSerializedKeys failed: ", error: e, stackTrace: s); GlobalEventBus.instance.fire( WalletSyncStatusChangedEvent( WalletSyncStatus.unableToSync, @@ -1165,10 +1163,8 @@ class BitcoinFrostWallet extends Wallet return await mainDB.updateUTXOs(walletId, outputArray); } catch (e, s) { - Logging.instance.logd( - "Output fetch unsuccessful: $e\n$s", - level: LogLevel.Error, - ); + Logging.instance + .e("Output fetch unsuccessful: ", error: e, stackTrace: s); return false; } } @@ -1378,13 +1374,14 @@ class BitcoinFrostWallet extends Wallet final newNode = await _getCurrentElectrumXNode(); try { await electrumXClient.closeAdapter(); - } catch (e) { + } catch (e, s) { if (e.toString().contains("initialized")) { // Ignore. This should happen every first time the wallet is opened. } else { - Logging.instance.logd( - "Error closing electrumXClient: $e", - level: LogLevel.Error, + Logging.instance.e( + "Error closing electrumXClient", + error: e, + stackTrace: s, ); } } @@ -1479,11 +1476,9 @@ class BitcoinFrostWallet extends Wallet await checkChangeAddressForTransactions(); } } catch (e, s) { - Logging.instance.logd( - "Exception rethrown from _checkChangeAddressForTransactions" - "($cryptoCurrency): $e\n$s", - level: LogLevel.Error, - ); + Logging.instance + .i("Exception rethrown from _checkChangeAddressForTransactions" + "($cryptoCurrency): $e\n$s"); rethrow; } } @@ -1494,9 +1489,9 @@ class BitcoinFrostWallet extends Wallet try { throw Exception(); } catch (_, s) { - Logging.instance.logd( + Logging.instance.e( "checkReceivingAddressForTransactions called but reuse address flag set: $s", - level: LogLevel.Error, + stackTrace: s, ); } } @@ -1526,10 +1521,11 @@ class BitcoinFrostWallet extends Wallet } } } catch (e, s) { - Logging.instance.logd( + Logging.instance.e( "Exception rethrown from _checkReceivingAddressForTransactions" - "($cryptoCurrency): $e\n$s", - level: LogLevel.Error, + "($cryptoCurrency)", + error: e, + stackTrace: s, ); rethrow; } @@ -1749,9 +1745,8 @@ class BitcoinFrostWallet extends Wallet int gapCounter = 0; int index = secure ? kFrostSecureStartingIndex : 0; for (; gapCounter < 20; index++) { - Logging.instance.logd( + Logging.instance.d( "Frost index: $index, \t GapCounter chain=$chain: $gapCounter", - level: LogLevel.Info, ); Address? address; @@ -1844,10 +1839,8 @@ class BitcoinFrostWallet extends Wallet return allTxHashes; } catch (e, s) { - Logging.instance.logd( - "$runtimeType._fetchHistory: $e\n$s", - level: LogLevel.Error, - ); + Logging.instance + .e("$runtimeType._fetchHistory: ", error: e, stackTrace: s); rethrow; } } diff --git a/lib/wallets/wallet/impl/bitcoincash_wallet.dart b/lib/wallets/wallet/impl/bitcoincash_wallet.dart index a8bcc599d..666d5fd6b 100644 --- a/lib/wallets/wallet/impl/bitcoincash_wallet.dart +++ b/lib/wallets/wallet/impl/bitcoincash_wallet.dart @@ -198,9 +198,10 @@ class BitcoincashWallet valueStringSats = prevOut.valueStringSats; addresses.addAll(prevOut.addresses); } catch (e, s) { - Logging.instance.logd( + Logging.instance.w( "Error getting prevOutJson: $e\nStack trace: $s", - level: LogLevel.Warning, + error: e, + stackTrace: s, ); } } @@ -293,9 +294,11 @@ class BitcoincashWallet // only found outputs owned by this wallet type = TransactionType.incoming; } else { - Logging.instance.logd( + Logging.instance.e( + "Unexpected tx found (ignoring it)", + ); + Logging.instance.d( "Unexpected tx found (ignoring it): $txData", - level: LogLevel.Error, ); continue; } @@ -345,10 +348,17 @@ class BitcoincashWallet } } catch (e, s) { // Probably doesn't contain a cash token so just log failure - Logging.instance.logd( + Logging.instance.w( + "Script pub key cash token" + " parsing check failed", + error: e, + stackTrace: s, + ); + Logging.instance.d( "Script pub key \"$scriptPubKeyHex\" cash token" " parsing check failed: $e\n$s", - level: LogLevel.Warning, + error: e, + stackTrace: s, ); } diff --git a/lib/wallets/wallet/impl/cardano_wallet.dart b/lib/wallets/wallet/impl/cardano_wallet.dart index 3a555c2d3..3beafe5f5 100644 --- a/lib/wallets/wallet/impl/cardano_wallet.dart +++ b/lib/wallets/wallet/impl/cardano_wallet.dart @@ -76,10 +76,7 @@ class CardanoWallet extends Bip39Wallet { await mainDB.updateOrPutAddresses([address]); } } catch (e, s) { - Logging.instance.logd( - "$runtimeType checkSaveInitialReceivingAddress() failed: $e\n$s", - level: LogLevel.Error, - ); + Logging.instance.e("$runtimeType checkSaveInitialReceivingAddress() failed: ", error: e, stackTrace: s); } } @@ -94,10 +91,7 @@ class CardanoWallet extends Bip39Wallet { return Future.value(health); } catch (e, s) { - Logging.instance.logd( - "Error ping checking in cardano_wallet.dart: $e\n$s", - level: LogLevel.Error, - ); + Logging.instance.e("Error ping checking in cardano_wallet.dart: ", error: e, stackTrace: s); return Future.value(false); } } @@ -146,10 +140,7 @@ class CardanoWallet extends Bip39Wallet { slow: fee, ); } catch (e, s) { - Logging.instance.logd( - "Error getting fees in cardano_wallet.dart: $e\n$s", - level: LogLevel.Error, - ); + Logging.instance.e("Error getting fees in cardano_wallet.dart: ", error: e, stackTrace: s); rethrow; } } @@ -264,10 +255,7 @@ class CardanoWallet extends Bip39Wallet { ); } } catch (e, s) { - Logging.instance.logd( - "$runtimeType Cardano prepareSend failed: $e\n$s", - level: LogLevel.Error, - ); + Logging.instance.e("$runtimeType Cardano prepareSend failed: ", error: e, stackTrace: s); rethrow; } } @@ -355,10 +343,7 @@ class CardanoWallet extends Bip39Wallet { txid: sentTx, ); } catch (e, s) { - Logging.instance.logd( - "$runtimeType Cardano confirmSend failed: $e\n$s", - level: LogLevel.Error, - ); + Logging.instance.e("$runtimeType Cardano confirmSend failed: ", error: e, stackTrace: s); rethrow; } } @@ -425,10 +410,7 @@ class CardanoWallet extends Bip39Wallet { await info.updateBalance(newBalance: balance, isar: mainDB.isar); } catch (e, s) { - Logging.instance.logd( - "Error getting balance in cardano_wallet.dart: $e\n$s", - level: LogLevel.Error, - ); + Logging.instance.e("Error getting balance in cardano_wallet.dart: ", error: e, stackTrace: s); } } @@ -446,10 +428,7 @@ class CardanoWallet extends Bip39Wallet { isar: mainDB.isar, ); } catch (e, s) { - Logging.instance.logd( - "Error updating transactions in cardano_wallet.dart: $e\n$s", - level: LogLevel.Error, - ); + Logging.instance.e("Error updating transactions in cardano_wallet.dart: ", error: e, stackTrace: s); } } @@ -581,10 +560,7 @@ class CardanoWallet extends Bip39Wallet { } on NodeTorMismatchConfigException { rethrow; } catch (e, s) { - Logging.instance.logd( - "Error updating transactions in cardano_wallet.dart: $e\n$s", - level: LogLevel.Error, - ); + Logging.instance.e("Error updating transactions in cardano_wallet.dart: ", error: e, stackTrace: s); } } diff --git a/lib/wallets/wallet/impl/dash_wallet.dart b/lib/wallets/wallet/impl/dash_wallet.dart index 559581256..59fdaa037 100644 --- a/lib/wallets/wallet/impl/dash_wallet.dart +++ b/lib/wallets/wallet/impl/dash_wallet.dart @@ -212,7 +212,7 @@ class DashWallet extends Bip39HDWallet .fold(BigInt.zero, (value, element) => value + element); TransactionType type; - final TransactionSubType subType = TransactionSubType.none; + const TransactionSubType subType = TransactionSubType.none; // At least one input was owned by this wallet. if (wasSentFromThisWallet) { @@ -234,10 +234,8 @@ class DashWallet extends Bip39HDWallet // Only found outputs owned by this wallet. type = TransactionType.incoming; } else { - Logging.instance.logd( - "Unexpected tx found (ignoring it): $txData", - level: LogLevel.Error, - ); + Logging.instance.e("Unexpected tx found (ignoring it)"); + Logging.instance.d("Unexpected tx found (ignoring it): $txData"); continue; } diff --git a/lib/wallets/wallet/impl/dogecoin_wallet.dart b/lib/wallets/wallet/impl/dogecoin_wallet.dart index 52946f170..e9046f959 100644 --- a/lib/wallets/wallet/impl/dogecoin_wallet.dart +++ b/lib/wallets/wallet/impl/dogecoin_wallet.dart @@ -214,7 +214,7 @@ class DogecoinWallet .fold(BigInt.zero, (value, element) => value + element); TransactionType type; - final TransactionSubType subType = TransactionSubType.none; + const TransactionSubType subType = TransactionSubType.none; // At least one input was owned by this wallet. if (wasSentFromThisWallet) { @@ -237,10 +237,8 @@ class DogecoinWallet // Only found outputs owned by this wallet. type = TransactionType.incoming; } else { - Logging.instance.logd( - "Unexpected tx found (ignoring it): $txData", - level: LogLevel.Error, - ); + Logging.instance.e("Unexpected tx found (ignoring it)"); + Logging.instance.d("Unexpected tx found (ignoring it): $txData"); continue; } diff --git a/lib/wallets/wallet/impl/ecash_wallet.dart b/lib/wallets/wallet/impl/ecash_wallet.dart index 27ec2e8bd..a8741ba21 100644 --- a/lib/wallets/wallet/impl/ecash_wallet.dart +++ b/lib/wallets/wallet/impl/ecash_wallet.dart @@ -276,10 +276,8 @@ class EcashWallet extends Bip39HDWallet // only found outputs owned by this wallet type = TransactionType.incoming; } else { - Logging.instance.logd( - "Unexpected tx found (ignoring it): $txData", - level: LogLevel.Error, - ); + Logging.instance.e("Unexpected tx found (ignoring it)"); + Logging.instance.d("Unexpected tx found (ignoring it): $txData"); continue; } @@ -332,10 +330,11 @@ class EcashWallet extends Bip39HDWallet } } catch (e, s) { // Probably doesn't contain a cash token so just log failure - Logging.instance.logd( + Logging.instance.w( "Script pub key \"$scriptPubKeyHex\" cash token" " parsing check failed: $e\n$s", - level: LogLevel.Warning, + error: e, + stackTrace: s, ); } diff --git a/lib/wallets/wallet/impl/epiccash_wallet.dart b/lib/wallets/wallet/impl/epiccash_wallet.dart index 11b4973bb..10238cef6 100644 --- a/lib/wallets/wallet/impl/epiccash_wallet.dart +++ b/lib/wallets/wallet/impl/epiccash_wallet.dart @@ -3,7 +3,6 @@ import 'dart:convert'; import 'dart:io'; import 'package:decimal/decimal.dart'; -import 'package:flutter/foundation.dart'; import 'package:flutter_libepiccash/lib.dart' as epiccash; import 'package:flutter_libepiccash/models/transaction.dart' as epic_models; import 'package:isar/isar.dart'; @@ -93,13 +92,12 @@ class EpiccashWallet extends Bip39Wallet { wallet: wallet, transactionId: txSlateId, ); - Logging.instance.logd( + Logging.instance.d( "cancel $txSlateId result: $result", - level: LogLevel.Info, ); return result; } catch (e, s) { - Logging.instance.logd("$e, $s", level: LogLevel.Error); + Logging.instance.e("", error: e, stackTrace: s); return e.toString(); } } @@ -192,19 +190,18 @@ class EpiccashWallet extends Bip39Wallet { (Decimal.parse(transactionFees.fee.toString())).toBigInt().toInt(); } catch (e, s) { //todo: come back to this - debugPrint("$e $s"); + Logging.instance.e("Error getting fees", error: e, stackTrace: s); } return realFee; } catch (e, s) { - Logging.instance - .logd("Error getting fees $e - $s", level: LogLevel.Error); + Logging.instance.e("Error getting fees $e - $s", error: e, stackTrace: s); rethrow; } } Future _startSync() async { _hackedCheckTorNodePrefs(); - Logging.instance.logd("request start sync", level: LogLevel.Info); + Logging.instance.d("request start sync"); final wallet = await secureStorageInterface.read(key: '${walletId}_wallet'); const int refreshFromNode = 1; if (!syncMutex.isLocked) { @@ -217,7 +214,7 @@ class EpiccashWallet extends Bip39Wallet { ); }); } else { - Logging.instance.logd("request start sync denied", level: LogLevel.Info); + Logging.instance.d("request start sync denied"); } } @@ -257,10 +254,11 @@ class EpiccashWallet extends Bip39Wallet { ); return response is String && response.contains("Challenge"); - } catch (_) { - Logging.instance.logd( + } catch (e, s) { + Logging.instance.w( "_testEpicBoxConnection failed on \"$host:$port\"", - level: LogLevel.Info, + error: e, + stackTrace: s, ); return false; } finally { @@ -289,8 +287,7 @@ class EpiccashWallet extends Bip39Wallet { ); return true; } catch (e, s) { - Logging.instance - .logd("ERROR STORING ADDRESS $e $s", level: LogLevel.Error); + Logging.instance.e("ERROR STORING ADDRESS", error: e, stackTrace: s); return false; } } @@ -302,7 +299,7 @@ class EpiccashWallet extends Bip39Wallet { // of the last one that has not been processed, or the index after the one most recently processed; return receivingIndex; } catch (e, s) { - Logging.instance.logd("$e $s", level: LogLevel.Error); + Logging.instance.e("$e $s", error: e, stackTrace: s); return 0; } } @@ -341,9 +338,8 @@ class EpiccashWallet extends Bip39Wallet { epicboxConfig: epicboxConfig.toString(), ); - Logging.instance.logd( + Logging.instance.d( "WALLET_ADDRESS_IS $walletAddress", - level: LogLevel.Info, ); final address = Address( @@ -379,9 +375,8 @@ class EpiccashWallet extends Bip39Wallet { // loop while scanning in chain in chunks (of blocks?) while (lastScannedBlock < chainHeight) { - Logging.instance.logd( + Logging.instance.d( "chainHeight: $chainHeight, lastScannedBlock: $lastScannedBlock", - level: LogLevel.Info, ); final int nextScannedBlock = await epiccash.LibEpiccash.scanOutputs( @@ -406,24 +401,17 @@ class EpiccashWallet extends Bip39Wallet { lastScannedBlock = nextScannedBlock; } - Logging.instance.logd( - "_startScans successfully at the tip", - level: LogLevel.Info, - ); + Logging.instance.d("_startScans successfully at the tip"); //Once scanner completes restart listener await _listenToEpicbox(); } catch (e, s) { - Logging.instance.logd( - "_startScans failed: $e\n$s", - level: LogLevel.Error, - ); + Logging.instance.e("_startScans failed: ", error: e, stackTrace: s); rethrow; } } Future _listenToEpicbox() async { - Logging.instance - .logd("STARTING WALLET LISTENER ....", level: LogLevel.Info); + Logging.instance.d("STARTING WALLET LISTENER ...."); final wallet = await secureStorageInterface.read(key: '${walletId}_wallet'); final EpicBoxConfigModel epicboxConfig = await getEpicBoxConfig(); epiccash.LibEpiccash.startEpicboxListener( @@ -550,9 +538,8 @@ class EpiccashWallet extends Bip39Wallet { ); } else { try { - Logging.instance.logd( + Logging.instance.d( "initializeExisting() ${cryptoCurrency.prettyName} wallet", - level: LogLevel.Info, ); final config = await _getRealConfig(); @@ -571,10 +558,8 @@ class EpiccashWallet extends Bip39Wallet { await updateNode(); } catch (e, s) { // do nothing, still allow user into wallet - Logging.instance.logd( - "$runtimeType init() failed: $e\n$s", - level: LogLevel.Error, - ); + Logging.instance + .w("$runtimeType init() failed: ", error: e, stackTrace: s); } } } @@ -637,10 +622,7 @@ class EpiccashWallet extends Bip39Wallet { txid: transaction.slateId, ); } catch (e, s) { - Logging.instance.logd( - "Epic cash confirmSend: $e\n$s", - level: LogLevel.Error, - ); + Logging.instance.e("Epic cash confirmSend: ", error: e, stackTrace: s); rethrow; } } @@ -681,8 +663,7 @@ class EpiccashWallet extends Bip39Wallet { fee: feeAmount, ); } catch (e, s) { - Logging.instance - .logd("Epic cash prepareSend: $e\n$s", level: LogLevel.Error); + Logging.instance.e("Epic cash prepareSend", error: e, stackTrace: s); rethrow; } } @@ -764,9 +745,10 @@ class EpiccashWallet extends Bip39Wallet { unawaited(refresh(doScan: false)); }); } catch (e, s) { - Logging.instance.logd( - "Exception rethrown from electrumx_mixin recover(): $e\n$s", - level: LogLevel.Info, + Logging.instance.e( + "Exception rethrown from electrumx_mixin recover(): ", + error: e, + stackTrace: s, ); rethrow; @@ -867,7 +849,7 @@ class EpiccashWallet extends Bip39Wallet { // } }); } - } catch (error, strace) { + } catch (e, s) { GlobalEventBus.instance.fire( NodeConnectionStatusChangedEvent( NodeConnectionStatus.disconnected, @@ -882,9 +864,10 @@ class EpiccashWallet extends Bip39Wallet { cryptoCurrency, ), ); - Logging.instance.logd( - "Caught exception in refreshWalletData(): $error\n$strace", - level: LogLevel.Error, + Logging.instance.e( + "Caught exception in refreshWalletData()", + error: e, + stackTrace: s, ); } finally { refreshMutex.release(); @@ -920,9 +903,10 @@ class EpiccashWallet extends Bip39Wallet { isar: mainDB.isar, ); } catch (e, s) { - Logging.instance.logd( - "Epic cash wallet failed to update balance: $e\n$s", - level: LogLevel.Warning, + Logging.instance.w( + "Epic cash wallet failed to update balance: ", + error: e, + stackTrace: s, ); } } @@ -1060,10 +1044,11 @@ class EpiccashWallet extends Bip39Wallet { await mainDB.isar.transactionV2s.putAll(txns); }); } catch (e, s) { - Logging.instance.logd( + Logging.instance.e( "${cryptoCurrency.runtimeType} ${cryptoCurrency.network} net wallet" - " \"${info.name}\"_${info.walletId} updateTransactions() failed: $e\n$s", - level: LogLevel.Warning, + " \"${info.name}\"_${info.walletId} updateTransactions() failed", + error: e, + stackTrace: s, ); } } @@ -1107,7 +1092,11 @@ class EpiccashWallet extends Bip39Wallet { ) != null; } catch (e, s) { - Logging.instance.logd("$e\n$s", level: LogLevel.Info); + Logging.instance.e( + "", + error: e, + stackTrace: s, + ); return false; } } @@ -1164,8 +1153,7 @@ class EpiccashWallet extends Bip39Wallet { timer?.cancel(); timer = null; await super.exit(); - Logging.instance - .logd("EpicCash_wallet exit finished", level: LogLevel.Info); + Logging.instance.d("EpicCash_wallet exit finished"); } void _hackedCheckTorNodePrefs() { @@ -1219,7 +1207,7 @@ Future deleteEpicWallet({ config: config!, ); } catch (e, s) { - Logging.instance.logd("$e\n$s", level: LogLevel.Error); + Logging.instance.e("$e\n$s", error: e, stackTrace: s); return "deleteEpicWallet($walletId) failed..."; } } diff --git a/lib/wallets/wallet/impl/ethereum_wallet.dart b/lib/wallets/wallet/impl/ethereum_wallet.dart index 6551f8eda..e61da1df6 100644 --- a/lib/wallets/wallet/impl/ethereum_wallet.dart +++ b/lib/wallets/wallet/impl/ethereum_wallet.dart @@ -240,9 +240,10 @@ class EthereumWallet extends Bip39Wallet with PrivateKeyInterface { isar: mainDB.isar, ); } catch (e, s) { - Logging.instance.logd( - "$runtimeType wallet failed to update balance: $e\n$s", - level: LogLevel.Warning, + Logging.instance.w( + "$runtimeType wallet failed to update balance: ", + error: e, + stackTrace: s, ); } } @@ -258,9 +259,10 @@ class EthereumWallet extends Bip39Wallet with PrivateKeyInterface { isar: mainDB.isar, ); } catch (e, s) { - Logging.instance.logd( - "$runtimeType Exception caught in chainHeight: $e\n$s", - level: LogLevel.Warning, + Logging.instance.w( + "$runtimeType Exception caught in chainHeight: ", + error: e, + stackTrace: s, ); } } @@ -297,10 +299,9 @@ class EthereumWallet extends Bip39Wallet with PrivateKeyInterface { ); if (response.value == null) { - Logging.instance.logd( + Logging.instance.w( "Failed to refresh transactions for ${cryptoCurrency.prettyName} ${info.name} " "$walletId: ${response.exception}", - level: LogLevel.Warning, ); return; } @@ -407,10 +408,9 @@ class EthereumWallet extends Bip39Wallet with PrivateKeyInterface { } await mainDB.updateOrPutTransactionV2s(txns); } else { - Logging.instance.logd( + Logging.instance.w( "Failed to refresh transactions with nonces for ${cryptoCurrency.prettyName} " "${info.name} $walletId: ${txsResponse.exception}", - level: LogLevel.Warning, ); } } diff --git a/lib/wallets/wallet/impl/firo_wallet.dart b/lib/wallets/wallet/impl/firo_wallet.dart index 055127c50..9aa1357f0 100644 --- a/lib/wallets/wallet/impl/firo_wallet.dart +++ b/lib/wallets/wallet/impl/firo_wallet.dart @@ -60,9 +60,8 @@ class FiroWallet extends Bip39HDWallet if (txData.tempTx != null) { await mainDB.updateOrPutTransactionV2s([txData.tempTx!]); _unconfirmedTxids.add(txData.tempTx!.txid); - Logging.instance.logd( + Logging.instance.d( "Added firo unconfirmed: ${txData.tempTx!.txid}", - level: LogLevel.Info, ); } return txData; @@ -221,17 +220,15 @@ class FiroWallet extends Bip39HDWallet ); if (isMySpark && sparkCoinsInvolvedReceived.isEmpty && !isMySpentSpark) { - Logging.instance.logd( + Logging.instance.e( "sparkCoinsInvolvedReceived is empty and should not be! (ignoring tx parsing)", - level: LogLevel.Error, ); continue; } if (isMySpentSpark && sparkCoinsInvolvedSpent.isEmpty && !isMySpark) { - Logging.instance.logd( + Logging.instance.e( "sparkCoinsInvolvedSpent is empty and should not be! (ignoring tx parsing)", - level: LogLevel.Error, ); continue; } @@ -248,15 +245,13 @@ class FiroWallet extends Bip39HDWallet } else if (asm.startsWith("OP_LELANTUSMINT")) { isMint = true; } else { - Logging.instance.logd( + Logging.instance.d( "Unknown mint op code found for lelantusmint tx: ${txData["txid"]}", - level: LogLevel.Error, ); } } else { - Logging.instance.logd( + Logging.instance.d( "ASM for lelantusmint tx: ${txData["txid"]} is null!", - level: LogLevel.Error, ); } } @@ -268,15 +263,13 @@ class FiroWallet extends Bip39HDWallet asm.startsWith("OP_SPARKSMINT")) { isSparkMint = true; } else { - Logging.instance.logd( + Logging.instance.d( "Unknown mint op code found for sparkmint tx: ${txData["txid"]}", - level: LogLevel.Error, ); } } else { - Logging.instance.logd( + Logging.instance.d( "ASM for sparkmint tx: ${txData["txid"]} is null!", - level: LogLevel.Error, ); } } @@ -570,10 +563,8 @@ class FiroWallet extends Bip39HDWallet // only found outputs owned by this wallet type = TransactionType.incoming; } else { - Logging.instance.logd( - "Unexpected tx found (ignoring it): $txData", - level: LogLevel.Error, - ); + Logging.instance.e("Unexpected tx found (ignoring it)"); + Logging.instance.d("Unexpected tx found (ignoring it): $txData"); continue; } @@ -747,10 +738,7 @@ class FiroWallet extends Bip39HDWallet ); // receiving addresses - Logging.instance.logd( - "checking receiving addresses...", - level: LogLevel.Info, - ); + Logging.instance.d("checking receiving addresses..."); final canBatch = await serverCanBatch; @@ -772,10 +760,7 @@ class FiroWallet extends Bip39HDWallet } // change addresses - Logging.instance.logd( - "checking change addresses...", - level: LogLevel.Info, - ); + Logging.instance.d("checking change addresses..."); for (final type in cryptoCurrency.supportedDerivationPathTypes) { changeFutures.add( canBatch @@ -899,15 +884,15 @@ class FiroWallet extends Bip39HDWallet }); unawaited(refresh()); - Logging.instance.logd( + Logging.instance.i( "Firo recover for " "${info.name}: ${DateTime.now().difference(start)}", - level: LogLevel.Info, ); } catch (e, s) { - Logging.instance.logd( - "Exception rethrown from electrumx_mixin recover(): $e\n$s", - level: LogLevel.Info, + Logging.instance.e( + "Exception rethrown from electrumx_mixin recover(): ", + error: e, + stackTrace: s, ); rethrow; diff --git a/lib/wallets/wallet/impl/litecoin_wallet.dart b/lib/wallets/wallet/impl/litecoin_wallet.dart index 073fe1149..034056817 100644 --- a/lib/wallets/wallet/impl/litecoin_wallet.dart +++ b/lib/wallets/wallet/impl/litecoin_wallet.dart @@ -287,10 +287,8 @@ class LitecoinWallet // } } } else { - Logging.instance.logd( - "Unexpected tx found (ignoring it): $txData", - level: LogLevel.Error, - ); + Logging.instance.e("Unexpected tx found (ignoring it)"); + Logging.instance.d("Unexpected tx found (ignoring it): $txData"); continue; } diff --git a/lib/wallets/wallet/impl/namecoin_wallet.dart b/lib/wallets/wallet/impl/namecoin_wallet.dart index cc92b32e3..5eb54b33b 100644 --- a/lib/wallets/wallet/impl/namecoin_wallet.dart +++ b/lib/wallets/wallet/impl/namecoin_wallet.dart @@ -264,10 +264,8 @@ class NamecoinWallet // Only found outputs owned by this wallet. type = TransactionType.incoming; } else { - Logging.instance.logd( - "Unexpected tx found (ignoring it): $txData", - level: LogLevel.Error, - ); + Logging.instance.e("Unexpected tx found (ignoring it)"); + Logging.instance.d("Unexpected tx found (ignoring it): $txData"); continue; } diff --git a/lib/wallets/wallet/impl/particl_wallet.dart b/lib/wallets/wallet/impl/particl_wallet.dart index a03068738..80db6e2ef 100644 --- a/lib/wallets/wallet/impl/particl_wallet.dart +++ b/lib/wallets/wallet/impl/particl_wallet.dart @@ -291,7 +291,7 @@ class ParticlWallet .fold(BigInt.zero, (value, element) => value + element); TransactionType type; - final TransactionSubType subType = TransactionSubType.none; + const TransactionSubType subType = TransactionSubType.none; // Particl has special outputs like confidential amounts. We can check // for them here. They're also checked in checkBlockUTXO. @@ -313,10 +313,8 @@ class ParticlWallet // Only found outputs owned by this wallet. type = TransactionType.incoming; } else { - Logging.instance.logd( - "Unexpected tx found (ignoring it): $txData", - level: LogLevel.Error, - ); + Logging.instance.e("Unexpected tx found (ignoring it)"); + Logging.instance.d("Unexpected tx found (ignoring it): $txData"); continue; } @@ -348,10 +346,7 @@ class ParticlWallet required TxData txData, required List utxoSigningData, }) async { - Logging.instance.logd( - "Starting Particl buildTransaction ----------", - level: LogLevel.Info, - ); + Logging.instance.d("Starting Particl buildTransaction ----------"); // TODO: use coinlib (For this we need coinlib to support particl) @@ -523,10 +518,8 @@ class ParticlWallet ); } } catch (e, s) { - Logging.instance.logd( - "Caught exception while signing transaction: $e\n$s", - level: LogLevel.Error, - ); + Logging.instance.e("Caught exception while signing transaction: ", + error: e, stackTrace: s); rethrow; } @@ -540,9 +533,9 @@ class ParticlWallet String hexString = builtTx.toHex(isParticl: true).toString(); if (hexString.length % 2 != 0) { // Ensure the string has an even length. - Logging.instance.logd( + Logging.instance.e( "Hex string has odd length, which is unexpected.", - level: LogLevel.Error, + stackTrace: StackTrace.current, ); throw Exception("Invalid hex string length."); } diff --git a/lib/wallets/wallet/impl/peercoin_wallet.dart b/lib/wallets/wallet/impl/peercoin_wallet.dart index ef0ae1c71..153131415 100644 --- a/lib/wallets/wallet/impl/peercoin_wallet.dart +++ b/lib/wallets/wallet/impl/peercoin_wallet.dart @@ -272,10 +272,8 @@ class PeercoinWallet // Only found outputs owned by this wallet. type = TransactionType.incoming; } else { - Logging.instance.logd( - "Unexpected tx found (ignoring it): $txData", - level: LogLevel.Error, - ); + Logging.instance.e("Unexpected tx found (ignoring it)"); + Logging.instance.d("Unexpected tx found (ignoring it): $txData"); continue; } diff --git a/lib/wallets/wallet/impl/solana_wallet.dart b/lib/wallets/wallet/impl/solana_wallet.dart index fdf369da9..8ae0db348 100644 --- a/lib/wallets/wallet/impl/solana_wallet.dart +++ b/lib/wallets/wallet/impl/solana_wallet.dart @@ -99,10 +99,7 @@ class SolanaWallet extends Bip39Wallet { await mainDB.updateOrPutAddresses([address]); } } catch (e, s) { - Logging.instance.logd( - "$runtimeType checkSaveInitialReceivingAddress() failed: $e\n$s", - level: LogLevel.Error, - ); + Logging.instance.e("$runtimeType checkSaveInitialReceivingAddress() failed: ", error: e, stackTrace: s); } } @@ -157,10 +154,7 @@ class SolanaWallet extends Bip39Wallet { ), ); } catch (e, s) { - Logging.instance.logd( - "$runtimeType Solana prepareSend failed: $e\n$s", - level: LogLevel.Error, - ); + Logging.instance.e("$runtimeType Solana prepareSend failed: ", error: e, stackTrace: s); rethrow; } } @@ -197,10 +191,7 @@ class SolanaWallet extends Bip39Wallet { txid: txid, ); } catch (e, s) { - Logging.instance.logd( - "$runtimeType Solana confirmSend failed: $e\n$s", - level: LogLevel.Error, - ); + Logging.instance.e("$runtimeType Solana confirmSend failed: ", error: e, stackTrace: s); rethrow; } } @@ -259,10 +250,7 @@ class SolanaWallet extends Bip39Wallet { health = await _rpcClient?.getHealth(); return health != null; } catch (e, s) { - Logging.instance.logd( - "$runtimeType Solana pingCheck failed \"health response=$health\": $e\n$s", - level: LogLevel.Error, - ); + Logging.instance.e("$runtimeType Solana pingCheck failed \"health response=$health\": $e\n$s"); return Future.value(false); } } @@ -334,10 +322,7 @@ class SolanaWallet extends Bip39Wallet { await info.updateBalance(newBalance: newBalance, isar: mainDB.isar); } catch (e, s) { - Logging.instance.logd( - "Error getting balance in solana_wallet.dart: $e\n$s", - level: LogLevel.Error, - ); + Logging.instance.e("Error getting balance in solana_wallet.dart: ", error: e, stackTrace: s); } } @@ -354,11 +339,8 @@ class SolanaWallet extends Bip39Wallet { isar: mainDB.isar, ); } catch (e, s) { - Logging.instance.logd( - "Error occurred in solana_wallet.dart while getting" - " chain height for solana: $e\n$s", - level: LogLevel.Error, - ); + Logging.instance.e("Error occurred in solana_wallet.dart while getting" + " chain height for solana: $e\n$s"); } } @@ -458,11 +440,8 @@ class SolanaWallet extends Bip39Wallet { } on NodeTorMismatchConfigException { rethrow; } catch (e, s) { - Logging.instance.logd( - "Error occurred in solana_wallet.dart while getting" - " transactions for solana: $e\n$s", - level: LogLevel.Error, - ); + Logging.instance.e("Error occurred in solana_wallet.dart while getting" + " transactions for solana: $e\n$s"); } } diff --git a/lib/wallets/wallet/impl/stellar_wallet.dart b/lib/wallets/wallet/impl/stellar_wallet.dart index 7d4b5880c..811858546 100644 --- a/lib/wallets/wallet/impl/stellar_wallet.dart +++ b/lib/wallets/wallet/impl/stellar_wallet.dart @@ -172,10 +172,10 @@ class StellarWallet extends Bip39Wallet { exists = true; } } catch (e, s) { - Logging.instance.logd( - "Error getting account ${e.toString()} - ${s.toString()}", - level: LogLevel.Error, - ); + Logging.instance.e( + "Error getting account ${e.toString()} - ${s.toString()}", + error: e, + stackTrace: s); } return exists; } @@ -230,10 +230,10 @@ class StellarWallet extends Bip39Wallet { } } catch (e, s) { // do nothing, still allow user into wallet - Logging.instance.logd( - "$runtimeType checkSaveInitialReceivingAddress() failed: $e\n$s", - level: LogLevel.Error, - ); + Logging.instance.e( + "$runtimeType checkSaveInitialReceivingAddress() failed: ", + error: e, + stackTrace: s); } } @@ -266,10 +266,8 @@ class StellarWallet extends Bip39Wallet { ), ); } catch (e, s) { - Logging.instance.logd( - "$runtimeType prepareSend() failed: $e\n$s", - level: LogLevel.Error, - ); + Logging.instance + .e("$runtimeType prepareSend() failed: ", error: e, stackTrace: s); rethrow; } } @@ -327,7 +325,7 @@ class StellarWallet extends Bip39Wallet { txid: response.hash!, ); } catch (e, s) { - Logging.instance.logd("Error sending TX $e - $s", level: LogLevel.Error); + Logging.instance.e("Error sending TX $e - $s", error: e, stackTrace: s); rethrow; } } @@ -394,10 +392,9 @@ class StellarWallet extends Bip39Wallet { // probably just doesn't have any history yet or whatever stellar needs return; } else { - Logging.instance.logd( + Logging.instance.w( "$runtimeType ${info.name} $walletId " "failed to fetch account to updateBalance", - level: LogLevel.Warning, ); rethrow; } @@ -428,10 +425,11 @@ class StellarWallet extends Bip39Wallet { } } } catch (e, s) { - Logging.instance.logd( + Logging.instance.w( "$runtimeType ${info.name} $walletId " "updateBalance() failed: $e\n$s", - level: LogLevel.Warning, + error: e, + stackTrace: s, ); rethrow; } @@ -448,10 +446,8 @@ class StellarWallet extends Bip39Wallet { .then((value) => value.records!.first.sequence); await info.updateCachedChainHeight(newHeight: height, isar: mainDB.isar); } catch (e, s) { - Logging.instance.logd( - "$runtimeType updateChainHeight() failed: $e\n$s", - level: LogLevel.Error, - ); + Logging.instance.e("$runtimeType updateChainHeight() failed: ", + error: e, stackTrace: s); rethrow; } @@ -485,9 +481,8 @@ class StellarWallet extends Bip39Wallet { // probably just doesn't have any history yet or whatever stellar needs return; } else { - Logging.instance.logd( + Logging.instance.w( "Stellar ${info.name} $walletId failed to fetch transactions", - level: LogLevel.Warning, ); rethrow; } @@ -676,10 +671,8 @@ class StellarWallet extends Bip39Wallet { await mainDB.updateOrPutTransactionV2s(transactionList); } catch (e, s) { - Logging.instance.logd( - "Exception rethrown from updateTransactions(): $e\n$s", - level: LogLevel.Error, - ); + Logging.instance.e("Exception rethrown from updateTransactions(): ", + error: e, stackTrace: s); rethrow; } } diff --git a/lib/wallets/wallet/impl/sub_wallets/eth_token_wallet.dart b/lib/wallets/wallet/impl/sub_wallets/eth_token_wallet.dart index 624b66347..845b0282b 100644 --- a/lib/wallets/wallet/impl/sub_wallets/eth_token_wallet.dart +++ b/lib/wallets/wallet/impl/sub_wallets/eth_token_wallet.dart @@ -153,10 +153,8 @@ class EthTokenWallet extends Wallet { usingContractAddress: contractAddress.hex, ); } catch (e, s) { - Logging.instance.logd( - "$runtimeType _updateTokenABI(): $e\n$s", - level: LogLevel.Warning, - ); + Logging.instance + .w("$runtimeType _updateTokenABI(): ", error: e, stackTrace: s); } try { @@ -200,10 +198,8 @@ class EthTokenWallet extends Wallet { _sendFunction = _deployedContract.function('transfer'); } catch (e, s) { - Logging.instance.logd( - "$runtimeType wallet failed init(): $e\n$s", - level: LogLevel.Warning, - ); + Logging.instance + .w("$runtimeType wallet failed init(): ", error: e, stackTrace: s); } } @@ -311,9 +307,9 @@ class EthTokenWallet extends Wallet { try { throw Exception(); } catch (_, s) { - Logging.instance.logd( - "Eth token wallet recover called. This should not happen. Stacktrace: $s", - level: LogLevel.Warning, + Logging.instance.w( + "Eth token wallet recover called. This should not happen.", + stackTrace: s, ); } } @@ -347,15 +343,15 @@ class EthTokenWallet extends Wallet { isar: mainDB.isar, ); } else { - Logging.instance.logd( + Logging.instance.w( "CachedEthTokenBalance.fetchAndUpdateCachedBalance failed: ${response.exception}", - level: LogLevel.Warning, ); } } catch (e, s) { - Logging.instance.logd( - "$runtimeType wallet failed to update balance: $e\n$s", - level: LogLevel.Warning, + Logging.instance.e( + "$runtimeType wallet failed to update balance: ", + error: e, + stackTrace: s, ); } } @@ -380,9 +376,8 @@ class EthTokenWallet extends Wallet { if (response.exception != null && response.exception!.message .contains("response is empty but status code is 200")) { - Logging.instance.logd( + Logging.instance.d( "No ${tokenContract.name} transfers found for $addressString", - level: LogLevel.Info, ); return; } @@ -415,13 +410,19 @@ class EthTokenWallet extends Wallet { extra: txExtra, ), ); - } catch (_) { + } catch (e, s) { // Server indexing failed for some reason. Instead of hard crashing or // showing no transactions we just skip it here. Not ideal but better // than nothing showing up - Logging.instance.logd( + Logging.instance.e( + "Server error: Transaction hash not found.", + error: e, + stackTrace: s, + ); + Logging.instance.d( "Server error: Transaction ${tokenDto.transactionHash} not found.", - level: LogLevel.Error, + error: e, + stackTrace: s, ); } } @@ -523,9 +524,10 @@ class EthTokenWallet extends Wallet { } await mainDB.updateOrPutTransactionV2s(txns); } catch (e, s) { - Logging.instance.logd( - "$runtimeType wallet failed to update transactions: $e\n$s", - level: LogLevel.Warning, + Logging.instance.w( + "$runtimeType wallet failed to update transactions: ", + error: e, + stackTrace: s, ); } } diff --git a/lib/wallets/wallet/impl/tezos_wallet.dart b/lib/wallets/wallet/impl/tezos_wallet.dart index d0c837302..992a900ae 100644 --- a/lib/wallets/wallet/impl/tezos_wallet.dart +++ b/lib/wallets/wallet/impl/tezos_wallet.dart @@ -60,9 +60,10 @@ class TezosWallet extends Bip39Wallet { return Tezos.standardDerivationPath; } catch (e, s) { - Logging.instance.logd( - "Error in _scanPossiblePaths() in tezos_wallet.dart: $e\n$s", - level: LogLevel.Error, + Logging.instance.e( + "Error in _scanPossiblePaths() in tezos_wallet.dart: ", + error: e, + stackTrace: s, ); rethrow; } @@ -144,9 +145,10 @@ class TezosWallet extends Bip39Wallet { return opList; } catch (e, s) { - Logging.instance.logd( - "Error in _buildSendTransaction() in tezos_wallet.dart: $e\n$s", - level: LogLevel.Error, + Logging.instance.e( + "Error in _buildSendTransaction() in tezos_wallet.dart: ", + error: e, + stackTrace: s, ); rethrow; } @@ -164,9 +166,10 @@ class TezosWallet extends Bip39Wallet { } } catch (e, s) { // do nothing, still allow user into wallet - Logging.instance.logd( - "$runtimeType checkSaveInitialReceivingAddress() failed: $e\n$s", - level: LogLevel.Error, + Logging.instance.e( + "$runtimeType checkSaveInitialReceivingAddress() failed: ", + error: e, + stackTrace: s, ); } } @@ -271,9 +274,10 @@ class TezosWallet extends Bip39Wallet { tezosOperationsList: opList, ); } catch (e, s) { - Logging.instance.logd( - "Error in prepareSend() in tezos_wallet.dart: $e\n$s", - level: LogLevel.Error, + Logging.instance.e( + "Error in prepareSend() in tezos_wallet.dart: ", + error: e, + stackTrace: s, ); if (e @@ -338,16 +342,16 @@ class TezosWallet extends Bip39Wallet { } catch (e, s) { if (_estCount > 3) { _estCount = 0; - Logging.instance.logd( - " Error in _estimate in tezos_wallet.dart: $e\n$s", - level: LogLevel.Error, + Logging.instance.e( + " Error in _estimate in tezos_wallet.dart: ", + error: e, + stackTrace: s, ); rethrow; } else { _estCount++; - Logging.instance.logd( + Logging.instance.e( "_estimate() retry _estCount=$_estCount", - level: LogLevel.Warning, ); return await _estimate( account, @@ -386,9 +390,10 @@ class TezosWallet extends Bip39Wallet { return fee; } catch (e, s) { - Logging.instance.logd( - " Error in estimateFeeFor() in tezos_wallet.dart: $e\n$s", - level: LogLevel.Error, + Logging.instance.e( + " Error in estimateFeeFor() in tezos_wallet.dart: ", + error: e, + stackTrace: s, ); rethrow; } @@ -499,9 +504,10 @@ class TezosWallet extends Bip39Wallet { await info.updateBalance(newBalance: newBalance, isar: mainDB.isar); } catch (e, s) { - Logging.instance.logd( - "Error getting balance in tezos_wallet.dart: $e\n$s", - level: LogLevel.Error, + Logging.instance.e( + "Error getting balance in tezos_wallet.dart: ", + error: e, + stackTrace: s, ); } } @@ -523,10 +529,11 @@ class TezosWallet extends Bip39Wallet { isar: mainDB.isar, ); } catch (e, s) { - Logging.instance.logd( + Logging.instance.e( "Error occurred in tezos_wallet.dart while getting" - " chain height for tezos: $e\n$s", - level: LogLevel.Error, + " chain height for tezos", + error: e, + stackTrace: s, ); } } diff --git a/lib/wallets/wallet/intermediate/lib_monero_wallet.dart b/lib/wallets/wallet/intermediate/lib_monero_wallet.dart index 2e965cb6d..6e73840f9 100644 --- a/lib/wallets/wallet/intermediate/lib_monero_wallet.dart +++ b/lib/wallets/wallet/intermediate/lib_monero_wallet.dart @@ -179,7 +179,11 @@ abstract class LibMoneroWallet onNewBlock: onNewBlock, onBalancesChanged: onBalancesChanged, onError: (e, s) { - Logging.instance.logd("$e\n$s", level: LogLevel.Warning); + Logging.instance.w( + "$e\n$s", + error: e, + stackTrace: s, + ); }, ), ); @@ -307,7 +311,7 @@ abstract class LibMoneroWallet privateSpendKey: base.getPrivateSpendKey(), ); } catch (e, s) { - Logging.instance.logd("getKeys failed: $e\n$s", level: LogLevel.Fatal); + Logging.instance.f("getKeys failed: ", error: e, stackTrace: s); return CWKeyData( walletId: walletId, publicViewKey: "ERROR", @@ -374,7 +378,7 @@ abstract class LibMoneroWallet value: "", ); } catch (e, s) { - Logging.instance.logd("$e\n$s", level: LogLevel.Fatal); + Logging.instance.f("", error: e, stackTrace: s); } await updateNode(); } @@ -462,7 +466,7 @@ abstract class LibMoneroWallet isar: mainDB.isar, ); } catch (e, s) { - Logging.instance.logd("$e\n$s", level: LogLevel.Fatal); + Logging.instance.f("", error: e, stackTrace: s); rethrow; } await updateNode(); @@ -476,10 +480,8 @@ abstract class LibMoneroWallet libMoneroWallet?.startListeners(); libMoneroWallet?.startAutoSaving(); } catch (e, s) { - Logging.instance.logd( - "Exception rethrown from recoverFromMnemonic(): $e\n$s", - level: LogLevel.Error, - ); + Logging.instance.e("Exception rethrown from recoverFromMnemonic(): ", + error: e, stackTrace: s); rethrow; } }); @@ -548,10 +550,8 @@ abstract class LibMoneroWallet _setSyncStatus(lib_monero_compat.ConnectedSyncStatus()); } catch (e, s) { _setSyncStatus(lib_monero_compat.FailedSyncStatus()); - Logging.instance.logd( - "Exception caught in $runtimeType.updateNode(): $e\n$s", - level: LogLevel.Error, - ); + Logging.instance.e("Exception caught in $runtimeType.updateNode(): ", + error: e, stackTrace: s); } return; @@ -802,10 +802,7 @@ abstract class LibMoneroWallet await updateBalance(); await updateTransactions(); } catch (e, s) { - Logging.instance.logd( - "onBalancesChanged(): $e\n$s", - level: LogLevel.Warning, - ); + Logging.instance.w("onBalancesChanged(): ", error: e, stackTrace: s); } } @@ -813,10 +810,7 @@ abstract class LibMoneroWallet try { await updateTransactions(); } catch (e, s) { - Logging.instance.logd( - "onNewBlock(): $e\n$s", - level: LogLevel.Warning, - ); + Logging.instance.w("onNewBlock(): ", error: e, stackTrace: s); } } @@ -1165,10 +1159,8 @@ abstract class LibMoneroWallet isar: mainDB.isar, ); } catch (e, s) { - Logging.instance.logd( - "Exception in generateNewAddress(): $e\n$s", - level: LogLevel.Error, - ); + Logging.instance + .e("Exception in generateNewAddress(): ", error: e, stackTrace: s); } } @@ -1178,10 +1170,10 @@ abstract class LibMoneroWallet try { throw Exception(); } catch (_, s) { - Logging.instance.logd( - "checkReceivingAddressForTransactions called but reuse address flag set: $s", - level: LogLevel.Error, - ); + Logging.instance.e( + "checkReceivingAddressForTransactions called but reuse address flag set: $s", + error: e, + stackTrace: s); } } @@ -1230,16 +1222,16 @@ abstract class LibMoneroWallet } } } on SocketException catch (se, s) { - Logging.instance.logd( - "SocketException caught in _checkReceivingAddressForTransactions(): $se\n$s", - level: LogLevel.Error, - ); + Logging.instance.e( + "SocketException caught in _checkReceivingAddressForTransactions(): $se\n$s", + error: e, + stackTrace: s); return; } catch (e, s) { - Logging.instance.logd( - "Exception rethrown from _checkReceivingAddressForTransactions(): $e\n$s", - level: LogLevel.Error, - ); + Logging.instance.e( + "Exception rethrown from _checkReceivingAddressForTransactions(): ", + error: e, + stackTrace: s); rethrow; } } @@ -1386,10 +1378,8 @@ abstract class LibMoneroWallet throw ArgumentError("Invalid fee rate argument provided!"); } } catch (e, s) { - Logging.instance.logd( - "Exception rethrown from prepare send(): $e\n$s", - level: LogLevel.Info, - ); + Logging.instance.i("Exception rethrown from prepare send(): ", + error: e, stackTrace: s); if (e.toString().contains("Incorrect unlocked balance")) { throw Exception("Insufficient balance!"); @@ -1407,23 +1397,20 @@ abstract class LibMoneroWallet txData.pendingTransaction!, ); - Logging.instance.logd( + Logging.instance.d( "transaction ${txData.pendingTransaction!.txid} has been sent", - level: LogLevel.Info, ); return txData.copyWith(txid: txData.pendingTransaction!.txid); } catch (e, s) { - Logging.instance.logd( - "${info.name} ${compatType.name.toLowerCase()} confirmSend: $e\n$s", - level: LogLevel.Error, - ); + Logging.instance.e( + "${info.name} ${compatType.name.toLowerCase()} confirmSend: ", + error: e, + stackTrace: s); rethrow; } } catch (e, s) { - Logging.instance.logd( - "Exception rethrown from confirmSend(): $e\n$s", - level: LogLevel.Info, - ); + Logging.instance.e("Exception rethrown from confirmSend(): ", + error: e, stackTrace: s); rethrow; } } @@ -1499,10 +1486,8 @@ abstract class LibMoneroWallet libMoneroWallet?.startListeners(); libMoneroWallet?.startAutoSaving(); } catch (e, s) { - Logging.instance.logd( - "Exception rethrown from recoverViewOnly(): $e\n$s", - level: LogLevel.Error, - ); + Logging.instance.e("Exception rethrown from recoverViewOnly(): ", + error: e, stackTrace: s); rethrow; } }); diff --git a/lib/wallets/wallet/supporting/epiccash_wallet_info_extension.dart b/lib/wallets/wallet/supporting/epiccash_wallet_info_extension.dart index 4e634ba17..c11eb2fbc 100644 --- a/lib/wallets/wallet/supporting/epiccash_wallet_info_extension.dart +++ b/lib/wallets/wallet/supporting/epiccash_wallet_info_extension.dart @@ -18,10 +18,7 @@ extension EpiccashWalletInfoExtension on WalletInfo { ), ); } catch (e, s) { - Logging.instance.logd( - "ExtraEpiccashWalletInfo.fromMap failed: $e\n$s", - level: LogLevel.Error, - ); + Logging.instance.e("ExtraEpiccashWalletInfo.fromMap failed: ", error: e, stackTrace: s); return null; } } diff --git a/lib/wallets/wallet/wallet.dart b/lib/wallets/wallet/wallet.dart index accbfea55..48de5dd56 100644 --- a/lib/wallets/wallet/wallet.dart +++ b/lib/wallets/wallet/wallet.dart @@ -126,7 +126,11 @@ abstract class Wallet { await updateChainHeight(); } catch (e, s) { // do nothing on failure (besides logging) - Logging.instance.logd("$e\n$s", level: LogLevel.Warning); + Logging.instance.w( + "$e\n$s", + error: e, + stackTrace: s, + ); } // return regardless of whether it was updated or not as we want a @@ -537,7 +541,7 @@ abstract class Wallet { }); } }, - onError: (Object error, StackTrace strace) { + onError: (Object e, StackTrace s) { GlobalEventBus.instance.fire( NodeConnectionStatusChangedEvent( NodeConnectionStatus.disconnected, @@ -552,9 +556,10 @@ abstract class Wallet { cryptoCurrency, ), ); - Logging.instance.logd( - "Caught exception in refreshWalletData(): $error\n$strace", - level: LogLevel.Error, + Logging.instance.e( + "Caught exception in refreshWalletData()", + error: e, + stackTrace: s, ); }, ); @@ -699,10 +704,9 @@ abstract class Wallet { ); } - Logging.instance.logd( + Logging.instance.i( "Refresh for " - "${info.name}: ${DateTime.now().difference(start)}", - level: LogLevel.Info, + "$walletId::${info.name}: ${DateTime.now().difference(start)}", ); } } diff --git a/lib/wallets/wallet/wallet_mixin_interfaces/bcash_interface.dart b/lib/wallets/wallet/wallet_mixin_interfaces/bcash_interface.dart index 4205d32bd..371236180 100644 --- a/lib/wallets/wallet/wallet_mixin_interfaces/bcash_interface.dart +++ b/lib/wallets/wallet/wallet_mixin_interfaces/bcash_interface.dart @@ -20,8 +20,7 @@ mixin BCashInterface required TxData txData, required List utxoSigningData, }) async { - Logging.instance - .logd("Starting buildTransaction ----------", level: LogLevel.Info); + Logging.instance.d("Starting buildTransaction ----------"); // TODO: use coinlib @@ -114,10 +113,8 @@ mixin BCashInterface ); } } catch (e, s) { - Logging.instance.logd( - "Caught exception while signing transaction: $e\n$s", - level: LogLevel.Error, - ); + Logging.instance.e("Caught exception while signing transaction: ", + error: e, stackTrace: s); rethrow; } diff --git a/lib/wallets/wallet/wallet_mixin_interfaces/cash_fusion_interface.dart b/lib/wallets/wallet/wallet_mixin_interfaces/cash_fusion_interface.dart index 6bdce0b5e..5a24f32ca 100644 --- a/lib/wallets/wallet/wallet_mixin_interfaces/cash_fusion_interface.dart +++ b/lib/wallets/wallet/wallet_mixin_interfaces/cash_fusion_interface.dart @@ -379,7 +379,7 @@ mixin CashFusionInterface return root.derivePath(derivationPath).privateKey.data; } catch (e, s) { - Logging.instance.logd("$e\n$s", level: LogLevel.Fatal); + Logging.instance.f("", error: e, stackTrace: s); throw Exception("Derivation path for pubkey=$pubKey could not be found"); } } @@ -741,9 +741,8 @@ mixin CashFusionInterface if (addr == null) { // A utxo object should always have a non null address. // If non found then just ignore the UTXO (aka don't fuse it) - Logging.instance.logd( + Logging.instance.d( "Ignoring utxo=$utxo for address=\"$addressString\" while selecting UTXOs for Fusion", - level: LogLevel.Info, ); continue; } @@ -781,10 +780,7 @@ mixin CashFusionInterface // Also reset the failed count here. _failedFuseCount = 0; } catch (e, s) { - Logging.instance.logd( - "$e\n$s", - level: LogLevel.Error, - ); + Logging.instance.e("", error: e, stackTrace: s); // just continue on attempt failure // Increment the number of failed fusion rounds. @@ -816,10 +812,7 @@ mixin CashFusionInterface } } } catch (e, s) { - Logging.instance.logd( - "$e\n$s", - level: LogLevel.Error, - ); + Logging.instance.e("", error: e, stackTrace: s); // Stop the fusion process and update the UI state. await _mainFusionObject?.stop(); diff --git a/lib/wallets/wallet/wallet_mixin_interfaces/electrumx_interface.dart b/lib/wallets/wallet/wallet_mixin_interfaces/electrumx_interface.dart index 66522fe7b..d4b387b8d 100644 --- a/lib/wallets/wallet/wallet_mixin_interfaces/electrumx_interface.dart +++ b/lib/wallets/wallet/wallet_mixin_interfaces/electrumx_interface.dart @@ -113,8 +113,7 @@ mixin ElectrumXInterface int additionalOutputs = 0, List? utxos, }) async { - Logging.instance - .logd("Starting coinSelection ----------", level: LogLevel.Info); + Logging.instance.d("Starting coinSelection ----------"); // TODO: multiple recipients one day assert(txData.recipients!.length == 1); @@ -171,22 +170,19 @@ mixin ElectrumXInterface ); } - Logging.instance.logd( + Logging.instance.d( "spendableOutputs.length: ${spendableOutputs.length}", - level: LogLevel.Info, ); - Logging.instance.logd( + Logging.instance.d( "availableOutputs.length: ${availableOutputs.length}", - level: LogLevel.Info, ); - Logging.instance - .logd("spendableOutputs: $spendableOutputs", level: LogLevel.Info); - Logging.instance.logd( + Logging.instance.d("spendableOutputs: $spendableOutputs"); + Logging.instance.d( "spendableSatoshiValue: $spendableSatoshiValue", - level: LogLevel.Info, ); - Logging.instance.logd("satoshiAmountToSend: $satoshiAmountToSend", - level: LogLevel.Info); + Logging.instance.d( + "satoshiAmountToSend: $satoshiAmountToSend", + ); BigInt satoshisBeingUsed = BigInt.zero; int inputsBeingConsumed = 0; @@ -216,12 +212,11 @@ mixin ElectrumXInterface inputsBeingConsumed = spendableOutputs.length; } - Logging.instance - .logd("satoshisBeingUsed: $satoshisBeingUsed", level: LogLevel.Info); - Logging.instance.logd("inputsBeingConsumed: $inputsBeingConsumed", - level: LogLevel.Info); - Logging.instance - .logd('utxoObjectsToUse: $utxoObjectsToUse', level: LogLevel.Info); + Logging.instance.d("satoshisBeingUsed: $satoshisBeingUsed"); + Logging.instance.d( + "inputsBeingConsumed: $inputsBeingConsumed", + ); + Logging.instance.d('utxoObjectsToUse: $utxoObjectsToUse'); // numberOfOutputs' length must always be equal to that of recipientsArray and recipientsAmtArray final List recipientsArray = [recipientAddress]; @@ -260,8 +255,8 @@ mixin ElectrumXInterface ), )) .vSize!; - } catch (e) { - Logging.instance.logd("vSizeForOneOutput: $e", level: LogLevel.Error); + } catch (e, s) { + Logging.instance.e("vSizeForOneOutput: $e", error: e, stackTrace: s); rethrow; } @@ -286,8 +281,8 @@ mixin ElectrumXInterface ), )) .vSize!; - } catch (e) { - Logging.instance.logd("vSizeForTwoOutPuts: $e", level: LogLevel.Error); + } catch (e, s) { + Logging.instance.e("vSizeForTwoOutPuts: $e", error: e, stackTrace: s); rethrow; } @@ -310,33 +305,27 @@ mixin ElectrumXInterface ), ); - Logging.instance.logd( + Logging.instance.d( "feeForTwoOutputs: $feeForTwoOutputs", - level: LogLevel.Info, ); - Logging.instance.logd( + Logging.instance.d( "feeForOneOutput: $feeForOneOutput", - level: LogLevel.Info, ); final difference = satoshisBeingUsed - satoshiAmountToSend; Future singleOutputTxn() async { - Logging.instance.logd( + Logging.instance.d( 'Input size: $satoshisBeingUsed', - level: LogLevel.Info, ); - Logging.instance.logd( + Logging.instance.d( 'Recipient output size: $satoshiAmountToSend', - level: LogLevel.Info, ); - Logging.instance.logd( + Logging.instance.d( 'Fee being paid: $difference sats', - level: LogLevel.Info, ); - Logging.instance.logd( + Logging.instance.d( 'Estimated fee: $feeForOneOutput', - level: LogLevel.Info, ); final txnData = await buildTransaction( utxoSigningData: utxoSigningData, @@ -358,12 +347,11 @@ mixin ElectrumXInterface // no change output required if (difference == feeForOneOutput) { - Logging.instance.logd('1 output in tx', level: LogLevel.Info); + Logging.instance.d('1 output in tx'); return await singleOutputTxn(); } else if (difference < feeForOneOutput) { - Logging.instance.logd( + Logging.instance.w( 'Cannot pay tx fee - checking for more outputs and trying again', - level: LogLevel.Warning, ); // try adding more outputs if (spendableOutputs.length > inputsBeingConsumed) { @@ -394,27 +382,12 @@ mixin ElectrumXInterface recipientsArray.add(newChangeAddress); recipientsAmtArray.add(changeOutputSize); - Logging.instance.logd('2 outputs in tx', level: LogLevel.Info); - Logging.instance.logd( - 'Input size: $satoshisBeingUsed', - level: LogLevel.Info, - ); - Logging.instance.logd( - 'Recipient output size: $satoshiAmountToSend', - level: LogLevel.Info, - ); - Logging.instance.logd( - 'Change Output Size: $changeOutputSize', - level: LogLevel.Info, - ); - Logging.instance.logd( - 'Difference (fee being paid): $feeBeingPaid sats', - level: LogLevel.Info, - ); - Logging.instance.logd( - 'Estimated fee: $feeForTwoOutputs', - level: LogLevel.Info, - ); + Logging.instance.d('2 outputs in tx'); + Logging.instance.d('Input size: $satoshisBeingUsed'); + Logging.instance.d('Recipient output size: $satoshiAmountToSend'); + Logging.instance.d('Change Output Size: $changeOutputSize'); + Logging.instance.d('Difference (fee being paid): $feeBeingPaid sats'); + Logging.instance.d('Estimated fee: $feeForTwoOutputs'); TxData txnData = await buildTransaction( utxoSigningData: utxoSigningData, @@ -433,25 +406,20 @@ mixin ElectrumXInterface recipientsAmtArray.removeLast(); recipientsAmtArray.add(changeOutputSize); - Logging.instance.logd( + Logging.instance.d( 'Adjusted Input size: $satoshisBeingUsed', - level: LogLevel.Info, ); - Logging.instance.logd( + Logging.instance.d( 'Adjusted Recipient output size: $satoshiAmountToSend', - level: LogLevel.Info, ); - Logging.instance.logd( + Logging.instance.d( 'Adjusted Change Output Size: $changeOutputSize', - level: LogLevel.Info, ); - Logging.instance.logd( + Logging.instance.d( 'Adjusted Difference (fee being paid): $feeBeingPaid sats', - level: LogLevel.Info, ); - Logging.instance.logd( + Logging.instance.d( 'Adjusted Estimated fee: $feeForTwoOutputs', - level: LogLevel.Info, ); txnData = await buildTransaction( @@ -475,9 +443,8 @@ mixin ElectrumXInterface } else { // Something went wrong here. It either overshot or undershot the estimated fee amount or the changeOutputSize // is smaller than or equal to cryptoCurrency.dustLimit. Revert to single output transaction. - Logging.instance.logd( + Logging.instance.d( 'Reverting to 1 output in tx', - level: LogLevel.Info, ); return await singleOutputTxn(); @@ -497,8 +464,7 @@ mixin ElectrumXInterface required int? satsPerVByte, required int feeRatePerKB, }) async { - Logging.instance - .logd("Attempting to send all $cryptoCurrency", level: LogLevel.Info); + Logging.instance.d("Attempting to send all $cryptoCurrency"); if (txData.recipients!.length != 1) { throw Exception( "Send all to more than one recipient not yet supported", @@ -628,8 +594,11 @@ mixin ElectrumXInterface return signingData; } catch (e, s) { - Logging.instance - .logd("fetchBuildTxData() threw: $e,\n$s", level: LogLevel.Error); + Logging.instance.e( + "fetchBuildTxData() threw", + error: e, + stackTrace: s, + ); rethrow; } } @@ -639,8 +608,7 @@ mixin ElectrumXInterface required TxData txData, required List utxoSigningData, }) async { - Logging.instance - .logd("Starting buildTransaction ----------", level: LogLevel.Info); + Logging.instance.d("Starting buildTransaction ----------"); // temp tx data to show in gui while waiting for real data from server final List tempInputs = []; @@ -810,9 +778,10 @@ mixin ElectrumXInterface ); } } catch (e, s) { - Logging.instance.logd( - "Caught exception while signing transaction: $e\n$s", - level: LogLevel.Error, + Logging.instance.e( + "Caught exception while signing transaction: ", + error: e, + stackTrace: s, ); rethrow; } @@ -858,9 +827,10 @@ mixin ElectrumXInterface await electrumXClient.checkElectrumAdapter(); return await fetchChainHeight(retries: retries); } - Logging.instance.logd( + Logging.instance.e( "Exception rethrown in fetchChainHeight\nError: $e\nStack trace: $s", - level: LogLevel.Error, + error: e, + stackTrace: s, ); // completer.completeError(e, s); // return Future.error(e, s); @@ -891,9 +861,10 @@ mixin ElectrumXInterface } return result; } catch (e, s) { - Logging.instance.logd( - "Exception rethrown in _getBatchTxCount(address: $addresses: $e\n$s", - level: LogLevel.Error, + Logging.instance.e( + "Exception rethrown in _getBatchTxCount(address: $addresses: ", + error: e, + stackTrace: s, ); rethrow; } @@ -932,12 +903,15 @@ mixin ElectrumXInterface final newNode = await _getCurrentElectrumXNode(); try { await electrumXClient.closeAdapter(); - } catch (e) { + } catch (e, s) { if (e.toString().contains("initialized")) { // Ignore. This should happen every first time the wallet is opened. } else { - Logging.instance - .logd("Error closing electrumXClient: $e", level: LogLevel.Error); + Logging.instance.e( + "Error closing electrumXClient", + error: e, + stackTrace: s, + ); } } electrumXClient = ElectrumXClient.from( @@ -966,9 +940,8 @@ mixin ElectrumXInterface for (int index = 0; gapCounter < cryptoCurrency.maxUnusedAddressGap; index += txCountBatchSize) { - Logging.instance.logd( + Logging.instance.d( "index: $index, \t GapCounter $chain ${type.name}: $gapCounter", - level: LogLevel.Info, ); final List txCountCallArgs = []; @@ -1053,9 +1026,8 @@ mixin ElectrumXInterface int index = 0; for (; gapCounter < cryptoCurrency.maxUnusedAddressGap; index++) { - Logging.instance.logd( + Logging.instance.d( "index: $index, \t GapCounter chain=$chain ${type.name}: $gapCounter", - level: LogLevel.Info, ); final derivePath = cryptoCurrency.constructDerivePath( @@ -1177,10 +1149,8 @@ mixin ElectrumXInterface return allTxHashes; } catch (e, s) { - Logging.instance.logd( - "$runtimeType._fetchHistory: $e\n$s", - level: LogLevel.Error, - ); + Logging.instance + .e("$runtimeType._fetchHistory: ", error: e, stackTrace: s); rethrow; } } @@ -1298,13 +1268,16 @@ mixin ElectrumXInterface ).raw.toInt(), ); - Logging.instance.logd("fetched fees: $feeObject", level: LogLevel.Info); + Logging.instance.d( + "fetched fees: $feeObject", + ); _cachedFees = feeObject; return _cachedFees!; } catch (e, s) { - Logging.instance.logd( + Logging.instance.e( "Exception rethrown from _getFees(): $e\nStack trace: $s", - level: LogLevel.Error, + error: e, + stackTrace: s, ); if (_cachedFees == null) { rethrow; @@ -1375,9 +1348,10 @@ mixin ElectrumXInterface try { throw Exception(); } catch (_, s) { - Logging.instance.logd( + Logging.instance.e( "checkReceivingAddressForTransactions called but reuse address flag set: $s", - level: LogLevel.Error, + error: e, + stackTrace: s, ); } } @@ -1411,11 +1385,9 @@ mixin ElectrumXInterface } } } catch (e, s) { - Logging.instance.logd( - "Exception rethrown from _checkReceivingAddressForTransactions" - "($cryptoCurrency): $e\n$s", - level: LogLevel.Error, - ); + Logging.instance + .e("Exception rethrown from _checkReceivingAddressForTransactions" + "($cryptoCurrency): $e\n$s"); rethrow; } } @@ -1430,9 +1402,10 @@ mixin ElectrumXInterface try { throw Exception(); } catch (_, s) { - Logging.instance.logd( + Logging.instance.e( "checkChangeAddressForTransactions called but reuse address flag set: $s", - level: LogLevel.Error, + error: e, + stackTrace: s, ); } } @@ -1463,11 +1436,9 @@ mixin ElectrumXInterface await checkChangeAddressForTransactions(); } } catch (e, s) { - Logging.instance.logd( - "Exception rethrown from _checkChangeAddressForTransactions" - "($cryptoCurrency): $e\n$s", - level: LogLevel.Error, - ); + Logging.instance + .e("Exception rethrown from _checkChangeAddressForTransactions" + "($cryptoCurrency): $e\n$s"); rethrow; } } @@ -1503,9 +1474,8 @@ mixin ElectrumXInterface } // receiving addresses - Logging.instance.logd( + Logging.instance.e( "checking receiving addresses...", - level: LogLevel.Info, ); final canBatch = await serverCanBatch; @@ -1528,9 +1498,8 @@ mixin ElectrumXInterface } // change addresses - Logging.instance.logd( + Logging.instance.d( "checking change addresses...", - level: LogLevel.Info, ); for (final type in cryptoCurrency.supportedDerivationPathTypes) { changeFutures.add( @@ -1634,11 +1603,12 @@ mixin ElectrumXInterface paymentCodeStrings: codesToCheck, ); } catch (e, s) { - Logging.instance.logd( + Logging.instance.e( "Failed to check ${PaynymIsApi.baseURL} followers/following for history during " "bitcoin wallet ($walletId ${info.name}) " - "_recoverWalletFromBIP32SeedPhrase: $e/n$s", - level: LogLevel.Error, + "_recoverWalletFromBIP32SeedPhrase", + error: e, + stackTrace: s, ); } } @@ -1646,9 +1616,10 @@ mixin ElectrumXInterface unawaited(refresh()); } catch (e, s) { - Logging.instance.logd( - "Exception rethrown from electrumx_mixin recover(): $e\n$s", - level: LogLevel.Info, + Logging.instance.e( + "Exception rethrown from electrumx_mixin recover(): ", + error: e, + stackTrace: s, ); rethrow; @@ -1714,10 +1685,8 @@ mixin ElectrumXInterface return await mainDB.updateUTXOs(walletId, outputArray); } catch (e, s) { - Logging.instance.logd( - "Output fetch unsuccessful: $e\n$s", - level: LogLevel.Error, - ); + Logging.instance + .e("Output fetch unsuccessful: ", error: e, stackTrace: s); return false; } } @@ -1725,13 +1694,16 @@ mixin ElectrumXInterface @override Future confirmSend({required TxData txData}) async { try { - Logging.instance - .logd("confirmSend txData: $txData", level: LogLevel.Info); + Logging.instance.d( + "confirmSend txData: $txData", + ); final txHash = await electrumXClient.broadcastTransaction( rawTx: txData.raw!, ); - Logging.instance.logd("Sent txHash: $txHash", level: LogLevel.Info); + Logging.instance.d( + "Sent txHash: $txHash", + ); txData = txData.copyWith( usedUTXOs: @@ -1746,9 +1718,10 @@ mixin ElectrumXInterface return await updateSentCachedTxData(txData: txData); } catch (e, s) { - Logging.instance.logd( - "Exception rethrown from confirmSend(): $e\n$s", - level: LogLevel.Error, + Logging.instance.e( + "Exception rethrown from confirmSend(): ", + error: e, + stackTrace: s, ); rethrow; } @@ -1798,8 +1771,7 @@ mixin ElectrumXInterface isSendAllCoinControlUtxos: isSendAllCoinControlUtxos, ); - Logging.instance - .logd("PREPARE SEND RESULT: $result", level: LogLevel.Info); + Logging.instance.d("PREPARE SEND RESULT: $result"); if (result.fee!.raw.toInt() < result.vSize!) { throw Exception( @@ -1847,7 +1819,9 @@ mixin ElectrumXInterface isSendAllCoinControlUtxos: isSendAllCoinControlUtxos, ); - Logging.instance.logd("prepare send: $result", level: LogLevel.Info); + Logging.instance.d( + "prepare send: $result", + ); if (result.fee!.raw.toInt() < result.vSize!) { throw Exception( "Error in fee calculation: Transaction fee (${result.fee!.raw.toInt()}) cannot " @@ -1859,9 +1833,10 @@ mixin ElectrumXInterface throw ArgumentError("Invalid fee rate argument provided!"); } } catch (e, s) { - Logging.instance.logd( - "Exception rethrown from prepareSend(): $e\n$s", - level: LogLevel.Error, + Logging.instance.e( + "Exception rethrown from prepareSend(): ", + error: e, + stackTrace: s, ); rethrow; } @@ -1876,9 +1851,10 @@ mixin ElectrumXInterface await super.init(); } catch (e, s) { // do nothing, still allow user into wallet - Logging.instance.logd( - "$runtimeType init() did not complete: $e\n$s", - level: LogLevel.Warning, + Logging.instance.w( + "$runtimeType init() did not complete: ", + error: e, + stackTrace: s, ); } } @@ -1889,7 +1865,9 @@ mixin ElectrumXInterface .getServerFeatures() .timeout(const Duration(seconds: 5)); - Logging.instance.logd("features: $features", level: LogLevel.Info); + Logging.instance.d( + "features: $features", + ); _serverVersion = _parseServerVersion(features["server_version"] as String); @@ -1898,9 +1876,10 @@ mixin ElectrumXInterface throw Exception("Genesis hash does not match!"); } } catch (e, s) { - Logging.instance.logd( - "$runtimeType _initializeServerVersionAndCheckGenesisHash() did not complete: $e\n$s", - level: LogLevel.Warning, + Logging.instance.w( + "$runtimeType _initializeServerVersionAndCheckGenesisHash() did not complete: ", + error: e, + stackTrace: s, ); } } @@ -1968,9 +1947,8 @@ mixin ElectrumXInterface } } catch (_) {} - Logging.instance.logd( + Logging.instance.d( "${info.name} _parseServerVersion($version) => $result", - level: LogLevel.Info, ); return result; } @@ -2024,9 +2002,8 @@ mixin ElectrumXInterface if (root != null) { // receiving addresses - Logging.instance.logd( + Logging.instance.d( "checking receiving addresses...", - level: LogLevel.Info, ); final canBatch = await serverCanBatch; @@ -2058,9 +2035,8 @@ mixin ElectrumXInterface } // change addresses - Logging.instance.logd( + Logging.instance.d( "checking change addresses...", - level: LogLevel.Info, ); for (final type in cryptoCurrency.supportedDerivationPathTypes) { final path = cryptoCurrency.constructDerivePath( @@ -2185,9 +2161,10 @@ mixin ElectrumXInterface unawaited(refresh()); } catch (e, s) { - Logging.instance.logd( - "Exception rethrown from electrumx_mixin recoverViewOnly(): $e\n$s", - level: LogLevel.Info, + Logging.instance.e( + "Exception rethrown from electrumx_mixin recoverViewOnly(): ", + error: e, + stackTrace: s, ); rethrow; diff --git a/lib/wallets/wallet/wallet_mixin_interfaces/lelantus_interface.dart b/lib/wallets/wallet/wallet_mixin_interfaces/lelantus_interface.dart index a51a98a22..148bd61a2 100644 --- a/lib/wallets/wallet/wallet_mixin_interfaces/lelantus_interface.dart +++ b/lib/wallets/wallet/wallet_mixin_interfaces/lelantus_interface.dart @@ -82,8 +82,9 @@ mixin LelantusInterface coin.mintIndex, privateKey, ); - } catch (_) { - Logging.instance.logd("error bad key", level: LogLevel.Error); + } catch (e, s) { + Logging.instance.e("error bad key"); + Logging.instance.t("error bad key", error: e, stackTrace: s); return lelantus.DartLelantusEntry(1, 0, 0, 0, 0, ''); } }).toList(); @@ -153,10 +154,8 @@ mixin LelantusInterface chaincode: root.chaincode, ); - Logging.instance - .logd("prepared fee: ${result.fee}", level: LogLevel.Info); - Logging.instance - .logd("prepared vSize: ${result.vSize}", level: LogLevel.Info); + Logging.instance.d("prepared fee: ${result.fee}"); + Logging.instance.d("prepared vSize: ${result.vSize}"); // fee should never be less than vSize sanity check if (result.fee!.raw.toInt() < result.vSize!) { @@ -166,9 +165,10 @@ mixin LelantusInterface } return result; } catch (e, s) { - Logging.instance.logd( - "Exception rethrown in firo prepareSend(): $e\n$s", - level: LogLevel.Error, + Logging.instance.e( + "Exception rethrown in firo prepareSend()", + error: e, + stackTrace: s, ); rethrow; } @@ -232,9 +232,10 @@ mixin LelantusInterface await mainDB.isar.lelantusCoins.put(jmint); }); } catch (e, s) { - Logging.instance.logd( - "$e\n$s", - level: LogLevel.Fatal, + Logging.instance.e( + "", + error: e, + stackTrace: s, ); rethrow; } @@ -285,7 +286,7 @@ mixin LelantusInterface await mainDB.addNewTransactionData(txnsData, walletId); } else { // This is a mint - Logging.instance.logd("this is a mint", level: LogLevel.Info); + Logging.instance.t("this is a mint"); final List updatedCoins = []; @@ -310,9 +311,10 @@ mixin LelantusInterface await mainDB.isar.lelantusCoins.putAll(updatedCoins); }); } catch (e, s) { - Logging.instance.logd( - "$e\n$s", - level: LogLevel.Fatal, + Logging.instance.e( + "", + error: e, + stackTrace: s, ); rethrow; } @@ -433,18 +435,20 @@ mixin LelantusInterface txs[address] = txn; } catch (e, s) { - Logging.instance.logd( - "Exception caught in getJMintTransactions(): $e\n$s", - level: LogLevel.Info, + Logging.instance.i( + "Exception caught in getJMintTransactions(): ", + error: e, + stackTrace: s, ); rethrow; } } return txs; } catch (e, s) { - Logging.instance.logd( - "Exception rethrown in getJMintTransactions(): $e\n$s", - level: LogLevel.Info, + Logging.instance.i( + "Exception rethrown in getJMintTransactions(): ", + error: e, + stackTrace: s, ); rethrow; } @@ -471,9 +475,10 @@ mixin LelantusInterface } return sets; } catch (e, s) { - Logging.instance.logd( - "Exception rethrown from refreshAnonymitySets: $e\n$s", - level: LogLevel.Error, + Logging.instance.e( + "Exception rethrown from refreshAnonymitySets: ", + error: e, + stackTrace: s, ); rethrow; } @@ -537,9 +542,11 @@ mixin LelantusInterface final tx = await mainDB.getTransaction(walletId, coin.txid); if (tx == null) { - Logging.instance.logd( + Logging.instance.e( + "Transaction with txid=REDACTED not found in local db!", + ); + Logging.instance.d( "Transaction with txid=${coin.txid} not found in local db!", - level: LogLevel.Error, ); } } @@ -556,9 +563,10 @@ mixin LelantusInterface await mainDB.isar.lelantusCoins.putAll(updatedCoins); }); } catch (e, s) { - Logging.instance.logd( - "$e\n$s", - level: LogLevel.Fatal, + Logging.instance.f( + " ", + error: e, + stackTrace: s, ); rethrow; } @@ -639,9 +647,8 @@ mixin LelantusInterface } if (inputTxns.isEmpty) { //some error. - Logging.instance.logd( + Logging.instance.f( "cryptic \"//some error\" occurred in staticProcessRestore on lelantus coin: $coin", - level: LogLevel.Error, ); continue; } @@ -699,9 +706,10 @@ mixin LelantusInterface await mainDB.isar.lelantusCoins.putAll(result.lelantusCoins); }); } catch (e, s) { - Logging.instance.logd( - "$e\n$s", - level: LogLevel.Fatal, + Logging.instance.e( + "", + error: e, + stackTrace: s, ); // don't just rethrow since isar likes to strip stack traces for some reason throw Exception("e=$e & s=$s"); @@ -717,7 +725,7 @@ mixin LelantusInterface final spendTxs = await getJMintTransactions( result.spendTxIds, ); - Logging.instance.logd(spendTxs, level: LogLevel.Info); + Logging.instance.d("lelantus spendTxs: $spendTxs"); for (final element in spendTxs.entries) { final address = element.value.address.value ?? @@ -842,7 +850,7 @@ mixin LelantusInterface } for (final mintsElement in txData.mintsMapLelantus!) { - Logging.instance.logd("using $mintsElement", level: LogLevel.Info); + Logging.instance.d("using $mintsElement"); final Uint8List mintu8 = Format.stringToUint8List(mintsElement['script'] as String); txb.addOutput(mintu8, mintsElement['value'] as int); @@ -1064,9 +1072,10 @@ mixin LelantusInterface try { anonymitySets = await fetchAnonymitySets(); } catch (e, s) { - Logging.instance.logd( - "Firo needs better internet to create mints: $e\n$s", - level: LogLevel.Fatal, + Logging.instance.f( + "Firo needs better internet to create mints: ", + error: e, + stackTrace: s, ); rethrow; } @@ -1088,10 +1097,7 @@ mixin LelantusInterface } if (isUsedMintTag) { - Logging.instance.logd( - "Found used index when minting", - level: LogLevel.Warning, - ); + Logging.instance.d("Found used index when minting"); } if (!isUsedMintTag) { @@ -1136,9 +1142,10 @@ mixin LelantusInterface unawaited(refresh()); } catch (e, s) { - Logging.instance.logd( - "Exception caught in anonymizeAllLelantus(): $e\n$s", - level: LogLevel.Warning, + Logging.instance.w( + "Exception caught in anonymizeAllLelantus(): ", + error: e, + stackTrace: s, ); rethrow; } @@ -1172,15 +1179,16 @@ mixin LelantusInterface .findFirstSync(); if (txn == null) { - Logging.instance.logd( + Logging.instance.e( + "Transaction not found in DB for lelantus coin", + ); + Logging.instance.d( "Transaction not found in DB for lelantus coin: $lelantusCoin", - level: LogLevel.Fatal, ); } else { if (txn.isLelantus != true) { - Logging.instance.logd( + Logging.instance.f( "Bad database state found in ${info.name} $walletId for _refreshBalance lelantus", - level: LogLevel.Fatal, ); } diff --git a/lib/wallets/wallet/wallet_mixin_interfaces/nano_interface.dart b/lib/wallets/wallet/wallet_mixin_interfaces/nano_interface.dart index 4bf55253d..1d725afb4 100644 --- a/lib/wallets/wallet/wallet_mixin_interfaces/nano_interface.dart +++ b/lib/wallets/wallet/wallet_mixin_interfaces/nano_interface.dart @@ -345,9 +345,10 @@ mixin NanoInterface on Bip39Wallet { } } catch (e, s) { // do nothing, still allow user into wallet - Logging.instance.logd( - "$runtimeType checkSaveInitialReceivingAddress() failed: $e\n$s", - level: LogLevel.Error, + Logging.instance.e( + "$runtimeType checkSaveInitialReceivingAddress() failed: ", + error: e, + stackTrace: s, ); } } @@ -488,8 +489,11 @@ mixin NanoInterface on Bip39Wallet { txid: decoded["hash"].toString(), ); } catch (e, s) { - Logging.instance - .logd("Error sending transaction $e - $s", level: LogLevel.Error); + Logging.instance.e( + "Error sending transaction", + error: e, + stackTrace: s, + ); rethrow; } } @@ -669,9 +673,10 @@ mixin NanoInterface on Bip39Wallet { await info.updateBalance(newBalance: balance, isar: mainDB.isar); } catch (e, s) { - Logging.instance.logd( - "Failed to update ${cryptoCurrency.runtimeType} balance: $e\n$s", - level: LogLevel.Warning, + Logging.instance.w( + "Failed to update ${cryptoCurrency.runtimeType} balance: ", + error: e, + stackTrace: s, ); } } @@ -705,9 +710,10 @@ mixin NanoInterface on Bip39Wallet { await info.updateCachedChainHeight(newHeight: height, isar: mainDB.isar); } catch (e, s) { - Logging.instance.logd( - "Failed to update ${cryptoCurrency.runtimeType} chain height: $e\n$s", - level: LogLevel.Warning, + Logging.instance.w( + "Failed to update ${cryptoCurrency.runtimeType} chain height: ", + error: e, + stackTrace: s, ); } } diff --git a/lib/wallets/wallet/wallet_mixin_interfaces/ordinals_interface.dart b/lib/wallets/wallet/wallet_mixin_interfaces/ordinals_interface.dart index 09896d2d6..430c46c45 100644 --- a/lib/wallets/wallet/wallet_mixin_interfaces/ordinals_interface.dart +++ b/lib/wallets/wallet/wallet_mixin_interfaces/ordinals_interface.dart @@ -18,8 +18,8 @@ mixin OrdinalsInterface try { return (await _litescribeAPI.getInscriptionsByAddress(address)) .isNotEmpty; - } catch (_) { - Logging.instance.logd("Litescribe api failure!", level: LogLevel.Error); + } catch (e, s) { + Logging.instance.e("Litescribe api failure!", error: e, stackTrace: s); return false; } @@ -54,10 +54,8 @@ mixin OrdinalsInterface await mainDB.isar.ordinals.putAll(ords); }); } catch (e, s) { - Logging.instance.logd( - "$runtimeType failed refreshInscriptions(): $e\n$s", - level: LogLevel.Warning, - ); + Logging.instance.w("$runtimeType failed refreshInscriptions(): ", + error: e, stackTrace: s); } } // =================== Overrides ============================================= diff --git a/lib/wallets/wallet/wallet_mixin_interfaces/paynym_interface.dart b/lib/wallets/wallet/wallet_mixin_interfaces/paynym_interface.dart index 1ad8aa986..9d1935bec 100644 --- a/lib/wallets/wallet/wallet_mixin_interfaces/paynym_interface.dart +++ b/lib/wallets/wallet/wallet_mixin_interfaces/paynym_interface.dart @@ -889,10 +889,7 @@ mixin PaynymInterface return Tuple2(clTx.toHex(), clTx.vSize()); } catch (e, s) { - Logging.instance.logd( - "_createNotificationTx(): $e\n$s", - level: LogLevel.Error, - ); + Logging.instance.e("_createNotificationTx(): ", error: e, stackTrace: s); rethrow; } } @@ -901,18 +898,18 @@ mixin PaynymInterface required TxData txData, }) async { try { - Logging.instance - .logd("confirmNotificationTx txData: $txData", level: LogLevel.Info); + Logging.instance.d("confirmNotificationTx txData: $txData"); final txHash = await electrumXClient.broadcastTransaction(rawTx: txData.raw!); - Logging.instance.logd("Sent txHash: $txHash", level: LogLevel.Info); + Logging.instance.d("Sent txHash: $txHash"); try { await updateTransactions(); - } catch (e) { - Logging.instance.logd( + } catch (e, s) { + Logging.instance.e( "refresh() failed in confirmNotificationTx (${info.name}::$walletId): $e", - level: LogLevel.Error, + error: e, + stackTrace: s, ); } @@ -921,9 +918,10 @@ mixin PaynymInterface txHash: txHash, ); } catch (e, s) { - Logging.instance.logd( - "Exception rethrown from confirmSend(): $e\n$s", - level: LogLevel.Error, + Logging.instance.e( + "Exception rethrown from confirmSend(): ", + error: e, + stackTrace: s, ); rethrow; } @@ -1047,7 +1045,7 @@ mixin PaynymInterface return (witnessComponents[1] as String).toUint8ListFromHex; } } catch (e, s) { - Logging.instance.logd("_pubKeyFromInput: $e\n$s", level: LogLevel.Info); + Logging.instance.e("_pubKeyFromInput()", error: e, stackTrace: s); } } return null; @@ -1097,9 +1095,15 @@ mixin PaynymInterface return unBlindedPaymentCode; } catch (e, s) { - Logging.instance.logd( - "unBlindedPaymentCodeFromTransaction() failed: $e\n$s\nFor tx: $transaction", - level: LogLevel.Warning, + Logging.instance.e( + "unBlindedPaymentCodeFromTransaction()", + error: e, + stackTrace: s, + ); + Logging.instance.d( + "unBlindedPaymentCodeFromTransaction() failed for tx: $transaction", + error: e, + stackTrace: s, ); return null; } @@ -1148,10 +1152,16 @@ mixin PaynymInterface ); return unBlindedPaymentCode; - } catch (e) { - Logging.instance.logd( + } catch (e, s) { + Logging.instance.e( + "unBlindedPaymentCodeFromTransactionBad()n", + error: e, + stackTrace: s, + ); + Logging.instance.d( "unBlindedPaymentCodeFromTransactionBad() failed: $e\nFor tx: $transaction", - level: LogLevel.Warning, + error: e, + stackTrace: s, ); return null; } @@ -1826,10 +1836,8 @@ mixin PaynymInterface // TODO: [prio=none] Check for special Bitcoin outputs like ordinals. } else { - Logging.instance.logd( - "Unexpected tx found (ignoring it): $txData", - level: LogLevel.Error, - ); + Logging.instance.w("Unexpected tx found (ignoring it)"); + Logging.instance.d("Unexpected tx found (ignoring it): $txData"); continue; } diff --git a/lib/wallets/wallet/wallet_mixin_interfaces/rbf_interface.dart b/lib/wallets/wallet/wallet_mixin_interfaces/rbf_interface.dart index 939987bdd..2e609aeb0 100644 --- a/lib/wallets/wallet/wallet_mixin_interfaces/rbf_interface.dart +++ b/lib/wallets/wallet/wallet_mixin_interfaces/rbf_interface.dart @@ -148,10 +148,7 @@ mixin RbfInterface ), ], ); - Logging.instance.logd( - "RBF on assumed send all", - level: LogLevel.Debug, - ); + Logging.instance.d("RBF on assumed send all"); return await prepareSend(txData: txData); } else if (txData.recipients!.where((e) => e.isChange).length == 1) { final newFee = BigInt.from(oldTransaction.vSize! * newRate); @@ -184,9 +181,8 @@ mixin RbfInterface isChange: removed.isChange, ), ); - Logging.instance.logd( + Logging.instance.d( "RBF with same utxo set with increased fee and reduced change", - level: LogLevel.Debug, ); } else { // new change amount is less than dust limit. @@ -198,9 +194,8 @@ mixin RbfInterface // oh well... // do nothing here as we already removed the change output above - Logging.instance.logd( + Logging.instance.d( "RBF with same utxo set with increased fee and no change", - level: LogLevel.Debug, ); } return await buildTransaction( @@ -255,10 +250,9 @@ mixin RbfInterface // TODO: remove assert assert(newUtxoSet.length == txData.utxos!.length + extraUtxos.length); - Logging.instance.logd( + Logging.instance.d( "RBF with ${extraUtxos.length} extra utxo(s)" " added to pay for the new fee", - level: LogLevel.Debug, ); return await buildTransaction( diff --git a/lib/wallets/wallet/wallet_mixin_interfaces/spark_interface.dart b/lib/wallets/wallet/wallet_mixin_interfaces/spark_interface.dart index fc34ed50e..347bf9f2c 100644 --- a/lib/wallets/wallet/wallet_mixin_interfaces/spark_interface.dart +++ b/lib/wallets/wallet/wallet_mixin_interfaces/spark_interface.dart @@ -179,10 +179,7 @@ mixin SparkInterface } } catch (e, s) { // do nothing, still allow user into wallet - Logging.instance.logd( - "$runtimeType init() failed: $e\n$s", - level: LogLevel.Error, - ); + Logging.instance.e("$runtimeType init() failed", error: e, stackTrace: s); } // await info.updateReceivingAddress( @@ -759,13 +756,12 @@ mixin SparkInterface required TxData txData, }) async { try { - Logging.instance - .logd("confirmSend txData: $txData", level: LogLevel.Info); + Logging.instance.d("confirmSend txData: $txData"); final txHash = await electrumXClient.broadcastTransaction( rawTx: txData.raw!, ); - Logging.instance.logd("Sent txHash: $txHash", level: LogLevel.Info); + Logging.instance.d("Sent txHash: $txHash"); txData = txData.copyWith( // TODO revisit setting these both @@ -784,9 +780,10 @@ mixin SparkInterface return await updateSentCachedTxData(txData: txData); } catch (e, s) { - Logging.instance.logd( - "Exception rethrown from confirmSend(): $e\n$s", - level: LogLevel.Error, + Logging.instance.e( + "Exception rethrown from confirmSend(): ", + error: e, + stackTrace: s, ); rethrow; } @@ -857,17 +854,17 @@ mixin SparkInterface } return result; - } catch (e) { - Logging.instance.logd( - "_refreshSparkCoinsMempoolCheck() failed: $e", - level: LogLevel.Error, + } catch (e, s) { + Logging.instance.e( + "_refreshSparkCoinsMempoolCheck() failed", + error: e, + stackTrace: s, ); return []; } finally { - Logging.instance.logd( + Logging.instance.d( "$walletId ${info.name} _refreshSparkCoinsMempoolCheck() run " "duration: ${DateTime.now().difference(start)}", - level: LogLevel.Debug, ); } } @@ -1168,16 +1165,13 @@ mixin SparkInterface isar: mainDB.isar, ); } catch (e, s) { - Logging.instance.logd( - "$runtimeType $walletId ${info.name}: $e\n$s", - level: LogLevel.Error, - ); + Logging.instance + .e("$runtimeType $walletId ${info.name}: ", error: e, stackTrace: s); rethrow; } finally { - Logging.instance.logd( + Logging.instance.d( "${info.name} refreshSparkData() duration:" " ${DateTime.now().difference(start)}", - level: LogLevel.Debug, ); } } @@ -1213,10 +1207,8 @@ mixin SparkInterface try { await refreshSparkData(null); } catch (e, s) { - Logging.instance.logd( - "$runtimeType $walletId ${info.name}: $e\n$s", - level: LogLevel.Error, - ); + Logging.instance + .e("$runtimeType $walletId ${info.name}: ", error: e, stackTrace: s); rethrow; } } @@ -1747,9 +1739,10 @@ mixin SparkInterface ); } } catch (e, s) { - Logging.instance.logd( - "Caught exception while signing spark mint transaction: $e\n$s", - level: LogLevel.Error, + Logging.instance.e( + "Caught exception while signing spark mint transaction: ", + error: e, + stackTrace: s, ); rethrow; } @@ -1900,9 +1893,10 @@ mixin SparkInterface await confirmSparkMintTransactions(txData: TxData(sparkMints: mints)); } catch (e, s) { - Logging.instance.logd( - "Exception caught in anonymizeAllSpark(): $e\n$s", - level: LogLevel.Warning, + Logging.instance.w( + "Exception caught in anonymizeAllSpark(): ", + error: e, + stackTrace: s, ); rethrow; } @@ -2007,9 +2001,10 @@ mixin SparkInterface return txData.copyWith(sparkMints: mints); } catch (e, s) { - Logging.instance.logd( - "Exception caught in prepareSparkMintTransaction(): $e\n$s", - level: LogLevel.Warning, + Logging.instance.w( + "Exception caught in prepareSparkMintTransaction(): ", + error: e, + stackTrace: s, ); rethrow; } diff --git a/lib/widgets/desktop/qr_code_scanner_dialog.dart b/lib/widgets/desktop/qr_code_scanner_dialog.dart index 24d24c93d..53b21bb9c 100644 --- a/lib/widgets/desktop/qr_code_scanner_dialog.dart +++ b/lib/widgets/desktop/qr_code_scanner_dialog.dart @@ -61,7 +61,7 @@ class _QrCodeScannerDialogState extends State { try { if (Platform.isLinux && _cameraLinuxPlugin != null) { await _cameraLinuxPlugin.initializeCamera(); - Logging.instance.logd("Linux Camera initialized", level: LogLevel.Info); + Logging.instance.d("Linux Camera initialized"); } else if (Platform.isWindows && _cameraWindowsPlugin != null) { final List cameras = await _cameraWindowsPlugin.availableCameras(); @@ -81,9 +81,8 @@ class _QrCodeScannerDialogState extends State { await _cameraWindowsPlugin.initializeCamera(_cameraId); // await _cameraWindowsPlugin!.onCameraInitialized(_cameraId).first; // TODO [prio=low]: Make this work. ^^^ - Logging.instance.logd( + Logging.instance.d( "Windows Camera initialized with ID: $_cameraId", - level: LogLevel.Info, ); } else if (Platform.isMacOS) { final List videoDevices = await CameraMacOS.instance @@ -95,16 +94,18 @@ class _QrCodeScannerDialogState extends State { await CameraMacOS.instance .initialize(cameraMacOSMode: CameraMacOSMode.photo); - Logging.instance.logd( + Logging.instance.d( "macOS Camera initialized with ID: $_macOSDeviceId", - level: LogLevel.Info, ); } return true; } catch (e, s) { - Logging.instance - .logd("Failed to initialize camera: $e\n$s", level: LogLevel.Error); + Logging.instance.e( + "Failed to initialize camera", + error: e, + stackTrace: s, + ); return false; } } @@ -115,14 +116,11 @@ class _QrCodeScannerDialogState extends State { try { if (Platform.isLinux && _cameraLinuxPlugin != null) { _cameraLinuxPlugin.stopCamera(); - Logging.instance.logd("Linux Camera stopped", level: LogLevel.Info); + Logging.instance.d("Linux Camera stopped"); } else if (Platform.isWindows && _cameraWindowsPlugin != null) { // if (_cameraId >= 0) { await _cameraWindowsPlugin.dispose(_cameraId); - Logging.instance.logd( - "Windows Camera stopped with ID: $_cameraId", - level: LogLevel.Info, - ); + Logging.instance.d("Windows Camera stopped with ID: $_cameraId"); // } else { // Logging.instance.log("Windows Camera ID is null. Cannot dispose.", // level: LogLevel.Error); @@ -130,18 +128,18 @@ class _QrCodeScannerDialogState extends State { } else if (Platform.isMacOS) { // if (_macOSDeviceId != null) { await CameraMacOS.instance.stopImageStream(); - Logging.instance.logd( - "macOS Camera stopped with ID: $_macOSDeviceId", - level: LogLevel.Info, - ); + Logging.instance.d("macOS Camera stopped with ID: $_macOSDeviceId"); // } else { // Logging.instance.log("macOS Camera ID is null. Cannot stop.", // level: LogLevel.Error); // } } } catch (e, s) { - Logging.instance - .logd("Failed to stop camera: $e\n$s", level: LogLevel.Error); + Logging.instance.e( + "Failed to stop camera", + error: e, + stackTrace: s, + ); } } @@ -161,15 +159,13 @@ class _QrCodeScannerDialogState extends State { } else if (Platform.isMacOS) { final macOSimg = await CameraMacOS.instance.takePicture(); if (macOSimg == null) { - Logging.instance - .logd("Failed to capture image", level: LogLevel.Error); + Logging.instance.w("Failed to capture image"); await Future.delayed(Duration(milliseconds: _imageDelayInMs)); continue; } final img.Image? image = img.decodeImage(macOSimg.bytes!); if (image == null) { - Logging.instance - .logd("Failed to capture image", level: LogLevel.Error); + Logging.instance.w("Failed to capture image"); await Future.delayed(Duration(milliseconds: _imageDelayInMs)); continue; } @@ -187,8 +183,7 @@ class _QrCodeScannerDialogState extends State { // > WARNING Since this will check the image data against all known // > decoders, it is much slower than using an explicit decoder if (image == null) { - Logging.instance - .logd("Failed to decode image", level: LogLevel.Error); + Logging.instance.w("Failed to decode image"); await Future.delayed(Duration(milliseconds: _imageDelayInMs)); continue; } @@ -211,7 +206,7 @@ class _QrCodeScannerDialogState extends State { } break; } else { - // Logging.instance.log("No QR code found in the image", level: LogLevel.Info); + // Logging.instance.log("No QR code found in the image"); // if (mounted) { // widget.onSnackbar("No QR code found in the image."); // } @@ -220,7 +215,7 @@ class _QrCodeScannerDialogState extends State { await Future.delayed(Duration(milliseconds: _imageDelayInMs)); } catch (e) { - // Logging.instance.log("Failed to capture and scan image: $e\n$s", level: LogLevel.Error); + // Logging.instance.log("Failed to capture and scan image", error: e, stackTrace: s,); // Spammy. // if (mounted) { @@ -252,7 +247,7 @@ class _QrCodeScannerDialogState extends State { } return qrDecode.text; } catch (e) { - // Logging.instance.log("Failed to decode QR code: $e\n$s", level: LogLevel.Error); + // Logging.instance.log("Failed to decode QR code", error: e, stackTrace: s,); // Spammy. return null; } @@ -361,9 +356,10 @@ class _QrCodeScannerDialogState extends State { } } } catch (e, s) { - Logging.instance.logd( - "Failed to decode image: $e\n$s", - level: LogLevel.Error, + Logging.instance.e( + "Failed to decode image: ", + error: e, + stackTrace: s, ); if (context.mounted) { await showFloatingFlushBar( diff --git a/lib/widgets/textfields/frost_step_field.dart b/lib/widgets/textfields/frost_step_field.dart index 125100bf7..3c86f1fed 100644 --- a/lib/widgets/textfields/frost_step_field.dart +++ b/lib/widgets/textfields/frost_step_field.dart @@ -97,10 +97,7 @@ class _FrostStepFieldState extends State { ); if (qrResult == null) { - Logging.instance.logd( - "Qr scanning cancelled", - level: LogLevel.Info, - ); + Logging.instance.d("Qr scanning cancelled"); } else { // TODO [prio=low]: Validate QR code data. widget.controller.text = qrResult; @@ -109,9 +106,10 @@ class _FrostStepFieldState extends State { } } } on PlatformException catch (e, s) { - Logging.instance.logd( - "Failed to get camera permissions while trying to scan qr code: $e\n$s", - level: LogLevel.Warning, + Logging.instance.w( + "Failed to get camera permissions while trying to scan qr code: ", + error: e, + stackTrace: s, ); } } diff --git a/lib/widgets/wallet_card.dart b/lib/widgets/wallet_card.dart index c01b46614..4981dafaf 100644 --- a/lib/widgets/wallet_card.dart +++ b/lib/widgets/wallet_card.dart @@ -159,9 +159,8 @@ class SimpleWalletCard extends ConsumerWidget { if (!success!) { // TODO: show error dialog here? - Logging.instance.logd( + Logging.instance.e( "Failed to load token wallet for $contract", - level: LogLevel.Error, ); return; } From 8ca4421c2a20beed0f8d7b2ade7edb62a8e84bd8 Mon Sep 17 00:00:00 2001 From: julian Date: Thu, 6 Feb 2025 12:07:31 -0600 Subject: [PATCH 064/193] adjust log level privacy warning text --- lib/widgets/log_level_preference_widget.dart | 36 +++++++++++++++----- 1 file changed, 28 insertions(+), 8 deletions(-) diff --git a/lib/widgets/log_level_preference_widget.dart b/lib/widgets/log_level_preference_widget.dart index 7a889564d..0e8b713c3 100644 --- a/lib/widgets/log_level_preference_widget.dart +++ b/lib/widgets/log_level_preference_widget.dart @@ -65,14 +65,16 @@ class _LogLevelPreferenceWidgetState _levels[_sliderValue.toInt()]; }, ), - if (current == Level.debug || current == Level.trace) + if (current == Level.debug || + current == Level.trace || + current == Level.info) Padding( padding: const EdgeInsets.only(top: 10), child: RoundedContainer( color: Theme.of(context).extension()!.warningBackground, - child: RichText( - text: TextSpan( + child: SelectableText.rich( + TextSpan( text: "Privacy Warning: ", style: STextStyles.label700(context).copyWith( color: Theme.of(context) @@ -119,11 +121,29 @@ class _LogLevelPreferenceWidgetState ), TextSpan( text: " may log sensitive metadata, such as transaction" - " details, addresses, or network activity. While no" - " private keys, mnemonics, or credentials will ever " - "be logged, enabling these levels could expose " - "information that might compromise privacy if " - "accessed by unauthorized parties.", + " details, amounts, addresses, or network activity. While ", + style: STextStyles.label(context).copyWith( + color: Theme.of(context) + .extension()! + .warningForeground, + fontSize: Util.isDesktop ? 14 : 12, + ), + ), + TextSpan( + text: "Info", + style: STextStyles.label700(context).copyWith( + color: Theme.of(context) + .extension()! + .warningForeground, + fontSize: Util.isDesktop ? 14 : 12, + ), + ), + TextSpan( + text: " logs are less likely to contain sensitive data, " + "they may still include some. No private keys, " + "mnemonics, or credentials will ever be logged, but " + "enabling these levels could expose information that " + "might compromise privacy if accessed by unauthorized parties.", style: STextStyles.label(context).copyWith( color: Theme.of(context) .extension()! From 024086910b955a9049367e7ead10a0877e1081d3 Mon Sep 17 00:00:00 2001 From: julian Date: Thu, 6 Feb 2025 12:12:55 -0600 Subject: [PATCH 065/193] log some extra wallet info --- lib/wallets/wallet/intermediate/lib_monero_wallet.dart | 1 + lib/wallets/wallet/wallet.dart | 8 ++++++++ 2 files changed, 9 insertions(+) diff --git a/lib/wallets/wallet/intermediate/lib_monero_wallet.dart b/lib/wallets/wallet/intermediate/lib_monero_wallet.dart index 6e73840f9..5d176ec7d 100644 --- a/lib/wallets/wallet/intermediate/lib_monero_wallet.dart +++ b/lib/wallets/wallet/intermediate/lib_monero_wallet.dart @@ -733,6 +733,7 @@ abstract class LibMoneroWallet @override Future exit() async { + Logging.instance.i("exit called on $walletId"); libMoneroWallet?.stopAutoSaving(); libMoneroWallet?.stopListeners(); libMoneroWallet?.stopSyncing(); diff --git a/lib/wallets/wallet/wallet.dart b/lib/wallets/wallet/wallet.dart index 48de5dd56..36cec7b85 100644 --- a/lib/wallets/wallet/wallet.dart +++ b/lib/wallets/wallet/wallet.dart @@ -242,6 +242,13 @@ abstract class Wallet { .walletIdEqualTo(walletId) .findFirst(); + Logging.instance.i( + "Wallet.load loading" + " $walletId " + "${walletInfo?.coin.identifier}" + " ${walletInfo?.name}", + ); + if (walletInfo == null) { throw Exception( "WalletInfo not found for $walletId when trying to call Wallet.load()", @@ -712,6 +719,7 @@ abstract class Wallet { } Future exit() async { + Logging.instance.i("exit called on $walletId"); _periodicRefreshTimer?.cancel(); _networkAliveTimer?.cancel(); From 56314e7f24b5930681e32ebbc665bcfd9c24f27e Mon Sep 17 00:00:00 2001 From: sneurlax Date: Sun, 23 Feb 2025 19:05:56 -0600 Subject: [PATCH 066/193] Replace vapigen with valac for Ubuntu 20.04 build docs If `valac` works, merge this PR. --- docs/building.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/building.md b/docs/building.md index 492639b05..bf2252a3b 100644 --- a/docs/building.md +++ b/docs/building.md @@ -58,7 +58,7 @@ sudo apt-get install libssl-dev curl unzip automake build-essential file pkg-con For Ubuntu 20.04, ``` -sudo apt-get install vapigen +sudo apt-get install valac pip3 install --upgrade meson==0.64.1 markdown==3.4.1 markupsafe==2.1.1 jinja2==3.1.2 pygments==2.13.0 toml==0.10.2 typogrify==2.0.7 tomli==2.0.1 ``` From 2e737b5911de8341eb573dd09024ab8ed9afc8ee Mon Sep 17 00:00:00 2001 From: julian Date: Wed, 12 Feb 2025 19:49:36 -0600 Subject: [PATCH 067/193] build runner update mocks --- test/cached_electrumx_test.mocks.dart | 56 ++- .../pages/send_view/send_view_test.mocks.dart | 50 ++- .../exchange/exchange_view_test.mocks.dart | 383 ++++++++++-------- .../managed_favorite_test.mocks.dart | 108 +++-- .../node_options_sheet_test.mocks.dart | 116 ++++-- .../transaction_card_test.mocks.dart | 280 +++++++------ 6 files changed, 617 insertions(+), 376 deletions(-) diff --git a/test/cached_electrumx_test.mocks.dart b/test/cached_electrumx_test.mocks.dart index a5c7c4c54..4ac0b9849 100644 --- a/test/cached_electrumx_test.mocks.dart +++ b/test/cached_electrumx_test.mocks.dart @@ -4,14 +4,15 @@ // ignore_for_file: no_leading_underscores_for_library_prefixes import 'dart:async' as _i9; -import 'dart:ui' as _i14; +import 'dart:ui' as _i15; import 'package:decimal/decimal.dart' as _i4; +import 'package:logger/logger.dart' as _i13; import 'package:mockito/mockito.dart' as _i1; import 'package:mockito/src/dummies.dart' as _i8; import 'package:stackwallet/electrumx_rpc/electrumx_client.dart' as _i6; import 'package:stackwallet/models/electrumx_response/spark_models.dart' as _i3; -import 'package:stackwallet/utilities/amount/amount_unit.dart' as _i13; +import 'package:stackwallet/utilities/amount/amount_unit.dart' as _i14; import 'package:stackwallet/utilities/enums/backup_frequency_type.dart' as _i12; import 'package:stackwallet/utilities/enums/sync_type_enum.dart' as _i11; import 'package:stackwallet/utilities/prefs.dart' as _i10; @@ -1130,6 +1131,45 @@ class MockPrefs extends _i1.Mock implements _i10.Prefs { returnValueForMissingStub: null, ); + @override + bool get advancedFiroFeatures => (super.noSuchMethod( + Invocation.getter(#advancedFiroFeatures), + returnValue: false, + ) as bool); + + @override + set advancedFiroFeatures(bool? advancedFiroFeatures) => super.noSuchMethod( + Invocation.setter( + #advancedFiroFeatures, + advancedFiroFeatures, + ), + returnValueForMissingStub: null, + ); + + @override + set logsPath(String? logsPath) => super.noSuchMethod( + Invocation.setter( + #logsPath, + logsPath, + ), + returnValueForMissingStub: null, + ); + + @override + _i13.Level get logLevel => (super.noSuchMethod( + Invocation.getter(#logLevel), + returnValue: _i13.Level.all, + ) as _i13.Level); + + @override + set logLevel(_i13.Level? logLevel) => super.noSuchMethod( + Invocation.setter( + #logLevel, + logLevel, + ), + returnValueForMissingStub: null, + ); + @override bool get hasListeners => (super.noSuchMethod( Invocation.getter(#hasListeners), @@ -1186,18 +1226,18 @@ class MockPrefs extends _i1.Mock implements _i10.Prefs { ) as _i9.Future); @override - _i13.AmountUnit amountUnit(_i2.CryptoCurrency? coin) => (super.noSuchMethod( + _i14.AmountUnit amountUnit(_i2.CryptoCurrency? coin) => (super.noSuchMethod( Invocation.method( #amountUnit, [coin], ), - returnValue: _i13.AmountUnit.normal, - ) as _i13.AmountUnit); + returnValue: _i14.AmountUnit.normal, + ) as _i14.AmountUnit); @override void updateAmountUnit({ required _i2.CryptoCurrency? coin, - required _i13.AmountUnit? amountUnit, + required _i14.AmountUnit? amountUnit, }) => super.noSuchMethod( Invocation.method( @@ -1270,7 +1310,7 @@ class MockPrefs extends _i1.Mock implements _i10.Prefs { ); @override - void addListener(_i14.VoidCallback? listener) => super.noSuchMethod( + void addListener(_i15.VoidCallback? listener) => super.noSuchMethod( Invocation.method( #addListener, [listener], @@ -1279,7 +1319,7 @@ class MockPrefs extends _i1.Mock implements _i10.Prefs { ); @override - void removeListener(_i14.VoidCallback? listener) => super.noSuchMethod( + void removeListener(_i15.VoidCallback? listener) => super.noSuchMethod( Invocation.method( #removeListener, [listener], diff --git a/test/pages/send_view/send_view_test.mocks.dart b/test/pages/send_view/send_view_test.mocks.dart index fee6a0d7f..476ab3883 100644 --- a/test/pages/send_view/send_view_test.mocks.dart +++ b/test/pages/send_view/send_view_test.mocks.dart @@ -7,6 +7,7 @@ import 'dart:async' as _i10; import 'dart:typed_data' as _i19; import 'dart:ui' as _i14; +import 'package:logger/logger.dart' as _i22; import 'package:mockito/mockito.dart' as _i1; import 'package:mockito/src/dummies.dart' as _i16; import 'package:stackwallet/db/isar/main_db.dart' as _i3; @@ -17,7 +18,7 @@ import 'package:stackwallet/services/locale_service.dart' as _i15; import 'package:stackwallet/services/node_service.dart' as _i2; import 'package:stackwallet/services/wallets.dart' as _i9; import 'package:stackwallet/themes/theme_service.dart' as _i17; -import 'package:stackwallet/utilities/amount/amount_unit.dart' as _i22; +import 'package:stackwallet/utilities/amount/amount_unit.dart' as _i23; import 'package:stackwallet/utilities/enums/backup_frequency_type.dart' as _i21; import 'package:stackwallet/utilities/enums/sync_type_enum.dart' as _i20; import 'package:stackwallet/utilities/flutter_secure_storage_interface.dart' @@ -1128,6 +1129,45 @@ class MockPrefs extends _i1.Mock implements _i12.Prefs { returnValueForMissingStub: null, ); + @override + bool get advancedFiroFeatures => (super.noSuchMethod( + Invocation.getter(#advancedFiroFeatures), + returnValue: false, + ) as bool); + + @override + set advancedFiroFeatures(bool? advancedFiroFeatures) => super.noSuchMethod( + Invocation.setter( + #advancedFiroFeatures, + advancedFiroFeatures, + ), + returnValueForMissingStub: null, + ); + + @override + set logsPath(String? logsPath) => super.noSuchMethod( + Invocation.setter( + #logsPath, + logsPath, + ), + returnValueForMissingStub: null, + ); + + @override + _i22.Level get logLevel => (super.noSuchMethod( + Invocation.getter(#logLevel), + returnValue: _i22.Level.all, + ) as _i22.Level); + + @override + set logLevel(_i22.Level? logLevel) => super.noSuchMethod( + Invocation.setter( + #logLevel, + logLevel, + ), + returnValueForMissingStub: null, + ); + @override bool get hasListeners => (super.noSuchMethod( Invocation.getter(#hasListeners), @@ -1184,18 +1224,18 @@ class MockPrefs extends _i1.Mock implements _i12.Prefs { ) as _i10.Future); @override - _i22.AmountUnit amountUnit(_i4.CryptoCurrency? coin) => (super.noSuchMethod( + _i23.AmountUnit amountUnit(_i4.CryptoCurrency? coin) => (super.noSuchMethod( Invocation.method( #amountUnit, [coin], ), - returnValue: _i22.AmountUnit.normal, - ) as _i22.AmountUnit); + returnValue: _i23.AmountUnit.normal, + ) as _i23.AmountUnit); @override void updateAmountUnit({ required _i4.CryptoCurrency? coin, - required _i22.AmountUnit? amountUnit, + required _i23.AmountUnit? amountUnit, }) => super.noSuchMethod( Invocation.method( diff --git a/test/screen_tests/exchange/exchange_view_test.mocks.dart b/test/screen_tests/exchange/exchange_view_test.mocks.dart index b7a8d49d5..565f05f82 100644 --- a/test/screen_tests/exchange/exchange_view_test.mocks.dart +++ b/test/screen_tests/exchange/exchange_view_test.mocks.dart @@ -3,40 +3,41 @@ // Do not manually edit this file. // ignore_for_file: no_leading_underscores_for_library_prefixes -import 'dart:async' as _i9; -import 'dart:ui' as _i12; +import 'dart:async' as _i10; +import 'dart:ui' as _i13; -import 'package:decimal/decimal.dart' as _i18; +import 'package:decimal/decimal.dart' as _i19; +import 'package:logger/logger.dart' as _i9; import 'package:mockito/mockito.dart' as _i1; import 'package:mockito/src/dummies.dart' as _i7; import 'package:stackwallet/models/exchange/change_now/cn_exchange_estimate.dart' - as _i21; + as _i22; import 'package:stackwallet/models/exchange/change_now/exchange_transaction.dart' - as _i23; -import 'package:stackwallet/models/exchange/change_now/exchange_transaction_status.dart' as _i24; +import 'package:stackwallet/models/exchange/change_now/exchange_transaction_status.dart' + as _i25; import 'package:stackwallet/models/exchange/response_objects/estimate.dart' - as _i20; + as _i21; import 'package:stackwallet/models/exchange/response_objects/fixed_rate_market.dart' - as _i22; + as _i23; import 'package:stackwallet/models/exchange/response_objects/range.dart' - as _i19; + as _i20; import 'package:stackwallet/models/exchange/response_objects/trade.dart' - as _i14; -import 'package:stackwallet/models/isar/exchange_cache/currency.dart' as _i17; -import 'package:stackwallet/models/isar/exchange_cache/pair.dart' as _i25; + as _i15; +import 'package:stackwallet/models/isar/exchange_cache/currency.dart' as _i18; +import 'package:stackwallet/models/isar/exchange_cache/pair.dart' as _i26; import 'package:stackwallet/networking/http.dart' as _i3; import 'package:stackwallet/services/exchange/change_now/change_now_api.dart' - as _i16; + as _i17; import 'package:stackwallet/services/exchange/exchange_response.dart' as _i4; -import 'package:stackwallet/services/trade_notes_service.dart' as _i15; -import 'package:stackwallet/services/trade_service.dart' as _i13; -import 'package:stackwallet/utilities/amount/amount_unit.dart' as _i10; +import 'package:stackwallet/services/trade_notes_service.dart' as _i16; +import 'package:stackwallet/services/trade_service.dart' as _i14; +import 'package:stackwallet/utilities/amount/amount_unit.dart' as _i11; import 'package:stackwallet/utilities/enums/backup_frequency_type.dart' as _i8; import 'package:stackwallet/utilities/enums/sync_type_enum.dart' as _i6; import 'package:stackwallet/utilities/prefs.dart' as _i5; import 'package:stackwallet/wallets/crypto_currency/crypto_currency.dart' - as _i11; + as _i12; import 'package:stackwallet/wallets/wallet/wallet_mixin_interfaces/cash_fusion_interface.dart' as _i2; @@ -557,6 +558,45 @@ class MockPrefs extends _i1.Mock implements _i5.Prefs { returnValueForMissingStub: null, ); + @override + bool get advancedFiroFeatures => (super.noSuchMethod( + Invocation.getter(#advancedFiroFeatures), + returnValue: false, + ) as bool); + + @override + set advancedFiroFeatures(bool? advancedFiroFeatures) => super.noSuchMethod( + Invocation.setter( + #advancedFiroFeatures, + advancedFiroFeatures, + ), + returnValueForMissingStub: null, + ); + + @override + set logsPath(String? logsPath) => super.noSuchMethod( + Invocation.setter( + #logsPath, + logsPath, + ), + returnValueForMissingStub: null, + ); + + @override + _i9.Level get logLevel => (super.noSuchMethod( + Invocation.getter(#logLevel), + returnValue: _i9.Level.all, + ) as _i9.Level); + + @override + set logLevel(_i9.Level? logLevel) => super.noSuchMethod( + Invocation.setter( + #logLevel, + logLevel, + ), + returnValueForMissingStub: null, + ); + @override bool get hasListeners => (super.noSuchMethod( Invocation.getter(#hasListeners), @@ -564,67 +604,67 @@ class MockPrefs extends _i1.Mock implements _i5.Prefs { ) as bool); @override - _i9.Future init() => (super.noSuchMethod( + _i10.Future init() => (super.noSuchMethod( Invocation.method( #init, [], ), - returnValue: _i9.Future.value(), - returnValueForMissingStub: _i9.Future.value(), - ) as _i9.Future); + returnValue: _i10.Future.value(), + returnValueForMissingStub: _i10.Future.value(), + ) as _i10.Future); @override - _i9.Future incrementCurrentNotificationIndex() => (super.noSuchMethod( + _i10.Future incrementCurrentNotificationIndex() => (super.noSuchMethod( Invocation.method( #incrementCurrentNotificationIndex, [], ), - returnValue: _i9.Future.value(), - returnValueForMissingStub: _i9.Future.value(), - ) as _i9.Future); + returnValue: _i10.Future.value(), + returnValueForMissingStub: _i10.Future.value(), + ) as _i10.Future); @override - _i9.Future isExternalCallsSet() => (super.noSuchMethod( + _i10.Future isExternalCallsSet() => (super.noSuchMethod( Invocation.method( #isExternalCallsSet, [], ), - returnValue: _i9.Future.value(false), - ) as _i9.Future); + returnValue: _i10.Future.value(false), + ) as _i10.Future); @override - _i9.Future saveUserID(String? userId) => (super.noSuchMethod( + _i10.Future saveUserID(String? userId) => (super.noSuchMethod( Invocation.method( #saveUserID, [userId], ), - returnValue: _i9.Future.value(), - returnValueForMissingStub: _i9.Future.value(), - ) as _i9.Future); + returnValue: _i10.Future.value(), + returnValueForMissingStub: _i10.Future.value(), + ) as _i10.Future); @override - _i9.Future saveSignupEpoch(int? signupEpoch) => (super.noSuchMethod( + _i10.Future saveSignupEpoch(int? signupEpoch) => (super.noSuchMethod( Invocation.method( #saveSignupEpoch, [signupEpoch], ), - returnValue: _i9.Future.value(), - returnValueForMissingStub: _i9.Future.value(), - ) as _i9.Future); + returnValue: _i10.Future.value(), + returnValueForMissingStub: _i10.Future.value(), + ) as _i10.Future); @override - _i10.AmountUnit amountUnit(_i11.CryptoCurrency? coin) => (super.noSuchMethod( + _i11.AmountUnit amountUnit(_i12.CryptoCurrency? coin) => (super.noSuchMethod( Invocation.method( #amountUnit, [coin], ), - returnValue: _i10.AmountUnit.normal, - ) as _i10.AmountUnit); + returnValue: _i11.AmountUnit.normal, + ) as _i11.AmountUnit); @override void updateAmountUnit({ - required _i11.CryptoCurrency? coin, - required _i10.AmountUnit? amountUnit, + required _i12.CryptoCurrency? coin, + required _i11.AmountUnit? amountUnit, }) => super.noSuchMethod( Invocation.method( @@ -639,7 +679,7 @@ class MockPrefs extends _i1.Mock implements _i5.Prefs { ); @override - int maxDecimals(_i11.CryptoCurrency? coin) => (super.noSuchMethod( + int maxDecimals(_i12.CryptoCurrency? coin) => (super.noSuchMethod( Invocation.method( #maxDecimals, [coin], @@ -649,7 +689,7 @@ class MockPrefs extends _i1.Mock implements _i5.Prefs { @override void updateMaxDecimals({ - required _i11.CryptoCurrency? coin, + required _i12.CryptoCurrency? coin, required int? maxDecimals, }) => super.noSuchMethod( @@ -665,7 +705,7 @@ class MockPrefs extends _i1.Mock implements _i5.Prefs { ); @override - _i2.FusionInfo getFusionServerInfo(_i11.CryptoCurrency? coin) => + _i2.FusionInfo getFusionServerInfo(_i12.CryptoCurrency? coin) => (super.noSuchMethod( Invocation.method( #getFusionServerInfo, @@ -682,7 +722,7 @@ class MockPrefs extends _i1.Mock implements _i5.Prefs { @override void setFusionServerInfo( - _i11.CryptoCurrency? coin, + _i12.CryptoCurrency? coin, _i2.FusionInfo? fusionServerInfo, ) => super.noSuchMethod( @@ -697,7 +737,7 @@ class MockPrefs extends _i1.Mock implements _i5.Prefs { ); @override - void addListener(_i12.VoidCallback? listener) => super.noSuchMethod( + void addListener(_i13.VoidCallback? listener) => super.noSuchMethod( Invocation.method( #addListener, [listener], @@ -706,7 +746,7 @@ class MockPrefs extends _i1.Mock implements _i5.Prefs { ); @override - void removeListener(_i12.VoidCallback? listener) => super.noSuchMethod( + void removeListener(_i13.VoidCallback? listener) => super.noSuchMethod( Invocation.method( #removeListener, [listener], @@ -736,16 +776,16 @@ class MockPrefs extends _i1.Mock implements _i5.Prefs { /// A class which mocks [TradesService]. /// /// See the documentation for Mockito's code generation for more information. -class MockTradesService extends _i1.Mock implements _i13.TradesService { +class MockTradesService extends _i1.Mock implements _i14.TradesService { MockTradesService() { _i1.throwOnMissingStub(this); } @override - List<_i14.Trade> get trades => (super.noSuchMethod( + List<_i15.Trade> get trades => (super.noSuchMethod( Invocation.getter(#trades), - returnValue: <_i14.Trade>[], - ) as List<_i14.Trade>); + returnValue: <_i15.Trade>[], + ) as List<_i15.Trade>); @override bool get hasListeners => (super.noSuchMethod( @@ -754,14 +794,14 @@ class MockTradesService extends _i1.Mock implements _i13.TradesService { ) as bool); @override - _i14.Trade? get(String? tradeId) => (super.noSuchMethod(Invocation.method( + _i15.Trade? get(String? tradeId) => (super.noSuchMethod(Invocation.method( #get, [tradeId], - )) as _i14.Trade?); + )) as _i15.Trade?); @override - _i9.Future add({ - required _i14.Trade? trade, + _i10.Future add({ + required _i15.Trade? trade, required bool? shouldNotifyListeners, }) => (super.noSuchMethod( @@ -773,13 +813,13 @@ class MockTradesService extends _i1.Mock implements _i13.TradesService { #shouldNotifyListeners: shouldNotifyListeners, }, ), - returnValue: _i9.Future.value(), - returnValueForMissingStub: _i9.Future.value(), - ) as _i9.Future); + returnValue: _i10.Future.value(), + returnValueForMissingStub: _i10.Future.value(), + ) as _i10.Future); @override - _i9.Future edit({ - required _i14.Trade? trade, + _i10.Future edit({ + required _i15.Trade? trade, required bool? shouldNotifyListeners, }) => (super.noSuchMethod( @@ -791,13 +831,13 @@ class MockTradesService extends _i1.Mock implements _i13.TradesService { #shouldNotifyListeners: shouldNotifyListeners, }, ), - returnValue: _i9.Future.value(), - returnValueForMissingStub: _i9.Future.value(), - ) as _i9.Future); + returnValue: _i10.Future.value(), + returnValueForMissingStub: _i10.Future.value(), + ) as _i10.Future); @override - _i9.Future delete({ - required _i14.Trade? trade, + _i10.Future delete({ + required _i15.Trade? trade, required bool? shouldNotifyListeners, }) => (super.noSuchMethod( @@ -809,12 +849,12 @@ class MockTradesService extends _i1.Mock implements _i13.TradesService { #shouldNotifyListeners: shouldNotifyListeners, }, ), - returnValue: _i9.Future.value(), - returnValueForMissingStub: _i9.Future.value(), - ) as _i9.Future); + returnValue: _i10.Future.value(), + returnValueForMissingStub: _i10.Future.value(), + ) as _i10.Future); @override - _i9.Future deleteByUuid({ + _i10.Future deleteByUuid({ required String? uuid, required bool? shouldNotifyListeners, }) => @@ -827,12 +867,12 @@ class MockTradesService extends _i1.Mock implements _i13.TradesService { #shouldNotifyListeners: shouldNotifyListeners, }, ), - returnValue: _i9.Future.value(), - returnValueForMissingStub: _i9.Future.value(), - ) as _i9.Future); + returnValue: _i10.Future.value(), + returnValueForMissingStub: _i10.Future.value(), + ) as _i10.Future); @override - void addListener(_i12.VoidCallback? listener) => super.noSuchMethod( + void addListener(_i13.VoidCallback? listener) => super.noSuchMethod( Invocation.method( #addListener, [listener], @@ -841,7 +881,7 @@ class MockTradesService extends _i1.Mock implements _i13.TradesService { ); @override - void removeListener(_i12.VoidCallback? listener) => super.noSuchMethod( + void removeListener(_i13.VoidCallback? listener) => super.noSuchMethod( Invocation.method( #removeListener, [listener], @@ -871,7 +911,7 @@ class MockTradesService extends _i1.Mock implements _i13.TradesService { /// A class which mocks [TradeNotesService]. /// /// See the documentation for Mockito's code generation for more information. -class MockTradeNotesService extends _i1.Mock implements _i15.TradeNotesService { +class MockTradeNotesService extends _i1.Mock implements _i16.TradeNotesService { MockTradeNotesService() { _i1.throwOnMissingStub(this); } @@ -906,7 +946,7 @@ class MockTradeNotesService extends _i1.Mock implements _i15.TradeNotesService { ) as String); @override - _i9.Future set({ + _i10.Future set({ required String? tradeId, required String? note, }) => @@ -919,23 +959,23 @@ class MockTradeNotesService extends _i1.Mock implements _i15.TradeNotesService { #note: note, }, ), - returnValue: _i9.Future.value(), - returnValueForMissingStub: _i9.Future.value(), - ) as _i9.Future); + returnValue: _i10.Future.value(), + returnValueForMissingStub: _i10.Future.value(), + ) as _i10.Future); @override - _i9.Future delete({required String? tradeId}) => (super.noSuchMethod( + _i10.Future delete({required String? tradeId}) => (super.noSuchMethod( Invocation.method( #delete, [], {#tradeId: tradeId}, ), - returnValue: _i9.Future.value(), - returnValueForMissingStub: _i9.Future.value(), - ) as _i9.Future); + returnValue: _i10.Future.value(), + returnValueForMissingStub: _i10.Future.value(), + ) as _i10.Future); @override - void addListener(_i12.VoidCallback? listener) => super.noSuchMethod( + void addListener(_i13.VoidCallback? listener) => super.noSuchMethod( Invocation.method( #addListener, [listener], @@ -944,7 +984,7 @@ class MockTradeNotesService extends _i1.Mock implements _i15.TradeNotesService { ); @override - void removeListener(_i12.VoidCallback? listener) => super.noSuchMethod( + void removeListener(_i13.VoidCallback? listener) => super.noSuchMethod( Invocation.method( #removeListener, [listener], @@ -974,7 +1014,7 @@ class MockTradeNotesService extends _i1.Mock implements _i15.TradeNotesService { /// A class which mocks [ChangeNowAPI]. /// /// See the documentation for Mockito's code generation for more information. -class MockChangeNowAPI extends _i1.Mock implements _i16.ChangeNowAPI { +class MockChangeNowAPI extends _i1.Mock implements _i17.ChangeNowAPI { MockChangeNowAPI() { _i1.throwOnMissingStub(this); } @@ -989,54 +1029,55 @@ class MockChangeNowAPI extends _i1.Mock implements _i16.ChangeNowAPI { ) as _i3.HTTP); @override - _i9.Future<_i4.ExchangeResponse>> getAvailableCurrencies({ + _i10.Future<_i4.ExchangeResponse>> + getAvailableCurrencies({ bool? fixedRate, bool? active, }) => - (super.noSuchMethod( - Invocation.method( - #getAvailableCurrencies, - [], - { - #fixedRate: fixedRate, - #active: active, - }, - ), - returnValue: - _i9.Future<_i4.ExchangeResponse>>.value( - _FakeExchangeResponse_2>( - this, - Invocation.method( - #getAvailableCurrencies, - [], - { - #fixedRate: fixedRate, - #active: active, - }, - ), - )), - ) as _i9.Future<_i4.ExchangeResponse>>); + (super.noSuchMethod( + Invocation.method( + #getAvailableCurrencies, + [], + { + #fixedRate: fixedRate, + #active: active, + }, + ), + returnValue: + _i10.Future<_i4.ExchangeResponse>>.value( + _FakeExchangeResponse_2>( + this, + Invocation.method( + #getAvailableCurrencies, + [], + { + #fixedRate: fixedRate, + #active: active, + }, + ), + )), + ) as _i10.Future<_i4.ExchangeResponse>>); @override - _i9.Future<_i4.ExchangeResponse>> getCurrenciesV2() => + _i10.Future<_i4.ExchangeResponse>> getCurrenciesV2() => (super.noSuchMethod( Invocation.method( #getCurrenciesV2, [], ), returnValue: - _i9.Future<_i4.ExchangeResponse>>.value( - _FakeExchangeResponse_2>( + _i10.Future<_i4.ExchangeResponse>>.value( + _FakeExchangeResponse_2>( this, Invocation.method( #getCurrenciesV2, [], ), )), - ) as _i9.Future<_i4.ExchangeResponse>>); + ) as _i10.Future<_i4.ExchangeResponse>>); @override - _i9.Future<_i4.ExchangeResponse>> getPairedCurrencies({ + _i10.Future<_i4.ExchangeResponse>> getPairedCurrencies({ required String? ticker, bool? fixedRate, }) => @@ -1050,8 +1091,8 @@ class MockChangeNowAPI extends _i1.Mock implements _i16.ChangeNowAPI { }, ), returnValue: - _i9.Future<_i4.ExchangeResponse>>.value( - _FakeExchangeResponse_2>( + _i10.Future<_i4.ExchangeResponse>>.value( + _FakeExchangeResponse_2>( this, Invocation.method( #getPairedCurrencies, @@ -1062,10 +1103,10 @@ class MockChangeNowAPI extends _i1.Mock implements _i16.ChangeNowAPI { }, ), )), - ) as _i9.Future<_i4.ExchangeResponse>>); + ) as _i10.Future<_i4.ExchangeResponse>>); @override - _i9.Future<_i4.ExchangeResponse<_i18.Decimal>> getMinimalExchangeAmount({ + _i10.Future<_i4.ExchangeResponse<_i19.Decimal>> getMinimalExchangeAmount({ required String? fromTicker, required String? toTicker, String? apiKey, @@ -1080,8 +1121,8 @@ class MockChangeNowAPI extends _i1.Mock implements _i16.ChangeNowAPI { #apiKey: apiKey, }, ), - returnValue: _i9.Future<_i4.ExchangeResponse<_i18.Decimal>>.value( - _FakeExchangeResponse_2<_i18.Decimal>( + returnValue: _i10.Future<_i4.ExchangeResponse<_i19.Decimal>>.value( + _FakeExchangeResponse_2<_i19.Decimal>( this, Invocation.method( #getMinimalExchangeAmount, @@ -1093,10 +1134,10 @@ class MockChangeNowAPI extends _i1.Mock implements _i16.ChangeNowAPI { }, ), )), - ) as _i9.Future<_i4.ExchangeResponse<_i18.Decimal>>); + ) as _i10.Future<_i4.ExchangeResponse<_i19.Decimal>>); @override - _i9.Future<_i4.ExchangeResponse<_i19.Range>> getRange({ + _i10.Future<_i4.ExchangeResponse<_i20.Range>> getRange({ required String? fromTicker, required String? toTicker, required bool? isFixedRate, @@ -1113,8 +1154,8 @@ class MockChangeNowAPI extends _i1.Mock implements _i16.ChangeNowAPI { #apiKey: apiKey, }, ), - returnValue: _i9.Future<_i4.ExchangeResponse<_i19.Range>>.value( - _FakeExchangeResponse_2<_i19.Range>( + returnValue: _i10.Future<_i4.ExchangeResponse<_i20.Range>>.value( + _FakeExchangeResponse_2<_i20.Range>( this, Invocation.method( #getRange, @@ -1127,13 +1168,13 @@ class MockChangeNowAPI extends _i1.Mock implements _i16.ChangeNowAPI { }, ), )), - ) as _i9.Future<_i4.ExchangeResponse<_i19.Range>>); + ) as _i10.Future<_i4.ExchangeResponse<_i20.Range>>); @override - _i9.Future<_i4.ExchangeResponse<_i20.Estimate>> getEstimatedExchangeAmount({ + _i10.Future<_i4.ExchangeResponse<_i21.Estimate>> getEstimatedExchangeAmount({ required String? fromTicker, required String? toTicker, - required _i18.Decimal? fromAmount, + required _i19.Decimal? fromAmount, String? apiKey, }) => (super.noSuchMethod( @@ -1147,8 +1188,8 @@ class MockChangeNowAPI extends _i1.Mock implements _i16.ChangeNowAPI { #apiKey: apiKey, }, ), - returnValue: _i9.Future<_i4.ExchangeResponse<_i20.Estimate>>.value( - _FakeExchangeResponse_2<_i20.Estimate>( + returnValue: _i10.Future<_i4.ExchangeResponse<_i21.Estimate>>.value( + _FakeExchangeResponse_2<_i21.Estimate>( this, Invocation.method( #getEstimatedExchangeAmount, @@ -1161,14 +1202,14 @@ class MockChangeNowAPI extends _i1.Mock implements _i16.ChangeNowAPI { }, ), )), - ) as _i9.Future<_i4.ExchangeResponse<_i20.Estimate>>); + ) as _i10.Future<_i4.ExchangeResponse<_i21.Estimate>>); @override - _i9.Future<_i4.ExchangeResponse<_i20.Estimate>> + _i10.Future<_i4.ExchangeResponse<_i21.Estimate>> getEstimatedExchangeAmountFixedRate({ required String? fromTicker, required String? toTicker, - required _i18.Decimal? fromAmount, + required _i19.Decimal? fromAmount, required bool? reversed, bool? useRateId = true, String? apiKey, @@ -1186,8 +1227,8 @@ class MockChangeNowAPI extends _i1.Mock implements _i16.ChangeNowAPI { #apiKey: apiKey, }, ), - returnValue: _i9.Future<_i4.ExchangeResponse<_i20.Estimate>>.value( - _FakeExchangeResponse_2<_i20.Estimate>( + returnValue: _i10.Future<_i4.ExchangeResponse<_i21.Estimate>>.value( + _FakeExchangeResponse_2<_i21.Estimate>( this, Invocation.method( #getEstimatedExchangeAmountFixedRate, @@ -1202,18 +1243,18 @@ class MockChangeNowAPI extends _i1.Mock implements _i16.ChangeNowAPI { }, ), )), - ) as _i9.Future<_i4.ExchangeResponse<_i20.Estimate>>); + ) as _i10.Future<_i4.ExchangeResponse<_i21.Estimate>>); @override - _i9.Future<_i4.ExchangeResponse<_i21.CNExchangeEstimate>> + _i10.Future<_i4.ExchangeResponse<_i22.CNExchangeEstimate>> getEstimatedExchangeAmountV2({ required String? fromTicker, required String? toTicker, - required _i21.CNEstimateType? fromOrTo, - required _i18.Decimal? amount, + required _i22.CNEstimateType? fromOrTo, + required _i19.Decimal? amount, String? fromNetwork, String? toNetwork, - _i21.CNFlowType? flow = _i21.CNFlowType.standard, + _i22.CNFlowType? flow = _i22.CNFlowType.standard, String? apiKey, }) => (super.noSuchMethod( @@ -1231,9 +1272,9 @@ class MockChangeNowAPI extends _i1.Mock implements _i16.ChangeNowAPI { #apiKey: apiKey, }, ), - returnValue: - _i9.Future<_i4.ExchangeResponse<_i21.CNExchangeEstimate>>.value( - _FakeExchangeResponse_2<_i21.CNExchangeEstimate>( + returnValue: _i10 + .Future<_i4.ExchangeResponse<_i22.CNExchangeEstimate>>.value( + _FakeExchangeResponse_2<_i22.CNExchangeEstimate>( this, Invocation.method( #getEstimatedExchangeAmountV2, @@ -1250,19 +1291,19 @@ class MockChangeNowAPI extends _i1.Mock implements _i16.ChangeNowAPI { }, ), )), - ) as _i9.Future<_i4.ExchangeResponse<_i21.CNExchangeEstimate>>); + ) as _i10.Future<_i4.ExchangeResponse<_i22.CNExchangeEstimate>>); @override - _i9.Future<_i4.ExchangeResponse>> + _i10.Future<_i4.ExchangeResponse>> getAvailableFixedRateMarkets({String? apiKey}) => (super.noSuchMethod( Invocation.method( #getAvailableFixedRateMarkets, [], {#apiKey: apiKey}, ), - returnValue: _i9 - .Future<_i4.ExchangeResponse>>.value( - _FakeExchangeResponse_2>( + returnValue: _i10 + .Future<_i4.ExchangeResponse>>.value( + _FakeExchangeResponse_2>( this, Invocation.method( #getAvailableFixedRateMarkets, @@ -1270,15 +1311,15 @@ class MockChangeNowAPI extends _i1.Mock implements _i16.ChangeNowAPI { {#apiKey: apiKey}, ), )), - ) as _i9.Future<_i4.ExchangeResponse>>); + ) as _i10.Future<_i4.ExchangeResponse>>); @override - _i9.Future<_i4.ExchangeResponse<_i23.ExchangeTransaction>> + _i10.Future<_i4.ExchangeResponse<_i24.ExchangeTransaction>> createStandardExchangeTransaction({ required String? fromTicker, required String? toTicker, required String? receivingAddress, - required _i18.Decimal? amount, + required _i19.Decimal? amount, String? extraId = r'', String? userId = r'', String? contactEmail = r'', @@ -1303,9 +1344,9 @@ class MockChangeNowAPI extends _i1.Mock implements _i16.ChangeNowAPI { #apiKey: apiKey, }, ), - returnValue: _i9 - .Future<_i4.ExchangeResponse<_i23.ExchangeTransaction>>.value( - _FakeExchangeResponse_2<_i23.ExchangeTransaction>( + returnValue: _i10 + .Future<_i4.ExchangeResponse<_i24.ExchangeTransaction>>.value( + _FakeExchangeResponse_2<_i24.ExchangeTransaction>( this, Invocation.method( #createStandardExchangeTransaction, @@ -1324,15 +1365,15 @@ class MockChangeNowAPI extends _i1.Mock implements _i16.ChangeNowAPI { }, ), )), - ) as _i9.Future<_i4.ExchangeResponse<_i23.ExchangeTransaction>>); + ) as _i10.Future<_i4.ExchangeResponse<_i24.ExchangeTransaction>>); @override - _i9.Future<_i4.ExchangeResponse<_i23.ExchangeTransaction>> + _i10.Future<_i4.ExchangeResponse<_i24.ExchangeTransaction>> createFixedRateExchangeTransaction({ required String? fromTicker, required String? toTicker, required String? receivingAddress, - required _i18.Decimal? amount, + required _i19.Decimal? amount, required String? rateId, required bool? reversed, String? extraId = r'', @@ -1361,9 +1402,9 @@ class MockChangeNowAPI extends _i1.Mock implements _i16.ChangeNowAPI { #apiKey: apiKey, }, ), - returnValue: _i9 - .Future<_i4.ExchangeResponse<_i23.ExchangeTransaction>>.value( - _FakeExchangeResponse_2<_i23.ExchangeTransaction>( + returnValue: _i10 + .Future<_i4.ExchangeResponse<_i24.ExchangeTransaction>>.value( + _FakeExchangeResponse_2<_i24.ExchangeTransaction>( this, Invocation.method( #createFixedRateExchangeTransaction, @@ -1384,12 +1425,12 @@ class MockChangeNowAPI extends _i1.Mock implements _i16.ChangeNowAPI { }, ), )), - ) as _i9.Future<_i4.ExchangeResponse<_i23.ExchangeTransaction>>); + ) as _i10.Future<_i4.ExchangeResponse<_i24.ExchangeTransaction>>); @override - _i9.Future< + _i10.Future< _i4 - .ExchangeResponse<_i24.ExchangeTransactionStatus>> getTransactionStatus({ + .ExchangeResponse<_i25.ExchangeTransactionStatus>> getTransactionStatus({ required String? id, String? apiKey, }) => @@ -1402,9 +1443,9 @@ class MockChangeNowAPI extends _i1.Mock implements _i16.ChangeNowAPI { #apiKey: apiKey, }, ), - returnValue: _i9 - .Future<_i4.ExchangeResponse<_i24.ExchangeTransactionStatus>>.value( - _FakeExchangeResponse_2<_i24.ExchangeTransactionStatus>( + returnValue: _i10 + .Future<_i4.ExchangeResponse<_i25.ExchangeTransactionStatus>>.value( + _FakeExchangeResponse_2<_i25.ExchangeTransactionStatus>( this, Invocation.method( #getTransactionStatus, @@ -1415,10 +1456,10 @@ class MockChangeNowAPI extends _i1.Mock implements _i16.ChangeNowAPI { }, ), )), - ) as _i9.Future<_i4.ExchangeResponse<_i24.ExchangeTransactionStatus>>); + ) as _i10.Future<_i4.ExchangeResponse<_i25.ExchangeTransactionStatus>>); @override - _i9.Future<_i4.ExchangeResponse>> + _i10.Future<_i4.ExchangeResponse>> getAvailableFloatingRatePairs({bool? includePartners = false}) => (super.noSuchMethod( Invocation.method( @@ -1427,8 +1468,8 @@ class MockChangeNowAPI extends _i1.Mock implements _i16.ChangeNowAPI { {#includePartners: includePartners}, ), returnValue: - _i9.Future<_i4.ExchangeResponse>>.value( - _FakeExchangeResponse_2>( + _i10.Future<_i4.ExchangeResponse>>.value( + _FakeExchangeResponse_2>( this, Invocation.method( #getAvailableFloatingRatePairs, @@ -1436,5 +1477,5 @@ class MockChangeNowAPI extends _i1.Mock implements _i16.ChangeNowAPI { {#includePartners: includePartners}, ), )), - ) as _i9.Future<_i4.ExchangeResponse>>); + ) as _i10.Future<_i4.ExchangeResponse>>); } diff --git a/test/widget_tests/managed_favorite_test.mocks.dart b/test/widget_tests/managed_favorite_test.mocks.dart index c2bc00d2c..218b9c0c5 100644 --- a/test/widget_tests/managed_favorite_test.mocks.dart +++ b/test/widget_tests/managed_favorite_test.mocks.dart @@ -5,19 +5,20 @@ // ignore_for_file: no_leading_underscores_for_library_prefixes import 'dart:async' as _i10; import 'dart:typed_data' as _i15; -import 'dart:ui' as _i20; +import 'dart:ui' as _i21; +import 'package:logger/logger.dart' as _i19; import 'package:mockito/mockito.dart' as _i1; import 'package:mockito/src/dummies.dart' as _i17; import 'package:stackwallet/db/isar/main_db.dart' as _i3; import 'package:stackwallet/models/isar/stack_theme.dart' as _i14; -import 'package:stackwallet/models/node_model.dart' as _i22; +import 'package:stackwallet/models/node_model.dart' as _i23; import 'package:stackwallet/networking/http.dart' as _i6; -import 'package:stackwallet/services/locale_service.dart' as _i21; +import 'package:stackwallet/services/locale_service.dart' as _i22; import 'package:stackwallet/services/node_service.dart' as _i2; import 'package:stackwallet/services/wallets.dart' as _i9; import 'package:stackwallet/themes/theme_service.dart' as _i13; -import 'package:stackwallet/utilities/amount/amount_unit.dart' as _i19; +import 'package:stackwallet/utilities/amount/amount_unit.dart' as _i20; import 'package:stackwallet/utilities/enums/backup_frequency_type.dart' as _i18; import 'package:stackwallet/utilities/enums/sync_type_enum.dart' as _i16; import 'package:stackwallet/utilities/flutter_secure_storage_interface.dart' @@ -833,6 +834,45 @@ class MockPrefs extends _i1.Mock implements _i12.Prefs { returnValueForMissingStub: null, ); + @override + bool get advancedFiroFeatures => (super.noSuchMethod( + Invocation.getter(#advancedFiroFeatures), + returnValue: false, + ) as bool); + + @override + set advancedFiroFeatures(bool? advancedFiroFeatures) => super.noSuchMethod( + Invocation.setter( + #advancedFiroFeatures, + advancedFiroFeatures, + ), + returnValueForMissingStub: null, + ); + + @override + set logsPath(String? logsPath) => super.noSuchMethod( + Invocation.setter( + #logsPath, + logsPath, + ), + returnValueForMissingStub: null, + ); + + @override + _i19.Level get logLevel => (super.noSuchMethod( + Invocation.getter(#logLevel), + returnValue: _i19.Level.all, + ) as _i19.Level); + + @override + set logLevel(_i19.Level? logLevel) => super.noSuchMethod( + Invocation.setter( + #logLevel, + logLevel, + ), + returnValueForMissingStub: null, + ); + @override bool get hasListeners => (super.noSuchMethod( Invocation.getter(#hasListeners), @@ -889,18 +929,18 @@ class MockPrefs extends _i1.Mock implements _i12.Prefs { ) as _i10.Future); @override - _i19.AmountUnit amountUnit(_i4.CryptoCurrency? coin) => (super.noSuchMethod( + _i20.AmountUnit amountUnit(_i4.CryptoCurrency? coin) => (super.noSuchMethod( Invocation.method( #amountUnit, [coin], ), - returnValue: _i19.AmountUnit.normal, - ) as _i19.AmountUnit); + returnValue: _i20.AmountUnit.normal, + ) as _i20.AmountUnit); @override void updateAmountUnit({ required _i4.CryptoCurrency? coin, - required _i19.AmountUnit? amountUnit, + required _i20.AmountUnit? amountUnit, }) => super.noSuchMethod( Invocation.method( @@ -973,7 +1013,7 @@ class MockPrefs extends _i1.Mock implements _i12.Prefs { ); @override - void addListener(_i20.VoidCallback? listener) => super.noSuchMethod( + void addListener(_i21.VoidCallback? listener) => super.noSuchMethod( Invocation.method( #addListener, [listener], @@ -982,7 +1022,7 @@ class MockPrefs extends _i1.Mock implements _i12.Prefs { ); @override - void removeListener(_i20.VoidCallback? listener) => super.noSuchMethod( + void removeListener(_i21.VoidCallback? listener) => super.noSuchMethod( Invocation.method( #removeListener, [listener], @@ -1012,7 +1052,7 @@ class MockPrefs extends _i1.Mock implements _i12.Prefs { /// A class which mocks [LocaleService]. /// /// See the documentation for Mockito's code generation for more information. -class MockLocaleService extends _i1.Mock implements _i21.LocaleService { +class MockLocaleService extends _i1.Mock implements _i22.LocaleService { MockLocaleService() { _i1.throwOnMissingStub(this); } @@ -1044,7 +1084,7 @@ class MockLocaleService extends _i1.Mock implements _i21.LocaleService { ) as _i10.Future); @override - void addListener(_i20.VoidCallback? listener) => super.noSuchMethod( + void addListener(_i21.VoidCallback? listener) => super.noSuchMethod( Invocation.method( #addListener, [listener], @@ -1053,7 +1093,7 @@ class MockLocaleService extends _i1.Mock implements _i21.LocaleService { ); @override - void removeListener(_i20.VoidCallback? listener) => super.noSuchMethod( + void removeListener(_i21.VoidCallback? listener) => super.noSuchMethod( Invocation.method( #removeListener, [listener], @@ -1098,16 +1138,16 @@ class MockNodeService extends _i1.Mock implements _i2.NodeService { ) as _i8.SecureStorageInterface); @override - List<_i22.NodeModel> get primaryNodes => (super.noSuchMethod( + List<_i23.NodeModel> get primaryNodes => (super.noSuchMethod( Invocation.getter(#primaryNodes), - returnValue: <_i22.NodeModel>[], - ) as List<_i22.NodeModel>); + returnValue: <_i23.NodeModel>[], + ) as List<_i23.NodeModel>); @override - List<_i22.NodeModel> get nodes => (super.noSuchMethod( + List<_i23.NodeModel> get nodes => (super.noSuchMethod( Invocation.getter(#nodes), - returnValue: <_i22.NodeModel>[], - ) as List<_i22.NodeModel>); + returnValue: <_i23.NodeModel>[], + ) as List<_i23.NodeModel>); @override bool get hasListeners => (super.noSuchMethod( @@ -1128,7 +1168,7 @@ class MockNodeService extends _i1.Mock implements _i2.NodeService { @override _i10.Future setPrimaryNodeFor({ required _i4.CryptoCurrency? coin, - required _i22.NodeModel? node, + required _i23.NodeModel? node, bool? shouldNotifyListeners = false, }) => (super.noSuchMethod( @@ -1146,33 +1186,33 @@ class MockNodeService extends _i1.Mock implements _i2.NodeService { ) as _i10.Future); @override - _i22.NodeModel? getPrimaryNodeFor({required _i4.CryptoCurrency? currency}) => + _i23.NodeModel? getPrimaryNodeFor({required _i4.CryptoCurrency? currency}) => (super.noSuchMethod(Invocation.method( #getPrimaryNodeFor, [], {#currency: currency}, - )) as _i22.NodeModel?); + )) as _i23.NodeModel?); @override - List<_i22.NodeModel> getNodesFor(_i4.CryptoCurrency? coin) => + List<_i23.NodeModel> getNodesFor(_i4.CryptoCurrency? coin) => (super.noSuchMethod( Invocation.method( #getNodesFor, [coin], ), - returnValue: <_i22.NodeModel>[], - ) as List<_i22.NodeModel>); + returnValue: <_i23.NodeModel>[], + ) as List<_i23.NodeModel>); @override - _i22.NodeModel? getNodeById({required String? id}) => + _i23.NodeModel? getNodeById({required String? id}) => (super.noSuchMethod(Invocation.method( #getNodeById, [], {#id: id}, - )) as _i22.NodeModel?); + )) as _i23.NodeModel?); @override - List<_i22.NodeModel> failoverNodesFor( + List<_i23.NodeModel> failoverNodesFor( {required _i4.CryptoCurrency? currency}) => (super.noSuchMethod( Invocation.method( @@ -1180,12 +1220,12 @@ class MockNodeService extends _i1.Mock implements _i2.NodeService { [], {#currency: currency}, ), - returnValue: <_i22.NodeModel>[], - ) as List<_i22.NodeModel>); + returnValue: <_i23.NodeModel>[], + ) as List<_i23.NodeModel>); @override _i10.Future add( - _i22.NodeModel? node, + _i23.NodeModel? node, String? password, bool? shouldNotifyListeners, ) => @@ -1240,7 +1280,7 @@ class MockNodeService extends _i1.Mock implements _i2.NodeService { @override _i10.Future edit( - _i22.NodeModel? editedNode, + _i23.NodeModel? editedNode, String? password, bool? shouldNotifyListeners, ) => @@ -1268,7 +1308,7 @@ class MockNodeService extends _i1.Mock implements _i2.NodeService { ) as _i10.Future); @override - void addListener(_i20.VoidCallback? listener) => super.noSuchMethod( + void addListener(_i21.VoidCallback? listener) => super.noSuchMethod( Invocation.method( #addListener, [listener], @@ -1277,7 +1317,7 @@ class MockNodeService extends _i1.Mock implements _i2.NodeService { ); @override - void removeListener(_i20.VoidCallback? listener) => super.noSuchMethod( + void removeListener(_i21.VoidCallback? listener) => super.noSuchMethod( Invocation.method( #removeListener, [listener], diff --git a/test/widget_tests/node_options_sheet_test.mocks.dart b/test/widget_tests/node_options_sheet_test.mocks.dart index 5e878015f..cf7098de6 100644 --- a/test/widget_tests/node_options_sheet_test.mocks.dart +++ b/test/widget_tests/node_options_sheet_test.mocks.dart @@ -5,18 +5,19 @@ // ignore_for_file: no_leading_underscores_for_library_prefixes import 'dart:async' as _i10; import 'dart:io' as _i8; -import 'dart:ui' as _i17; +import 'dart:ui' as _i18; +import 'package:logger/logger.dart' as _i16; import 'package:mockito/mockito.dart' as _i1; import 'package:mockito/src/dummies.dart' as _i14; import 'package:stackwallet/db/isar/main_db.dart' as _i3; -import 'package:stackwallet/models/node_model.dart' as _i18; +import 'package:stackwallet/models/node_model.dart' as _i19; import 'package:stackwallet/services/event_bus/events/global/tor_connection_status_changed_event.dart' - as _i20; + as _i21; import 'package:stackwallet/services/node_service.dart' as _i2; -import 'package:stackwallet/services/tor_service.dart' as _i19; +import 'package:stackwallet/services/tor_service.dart' as _i20; import 'package:stackwallet/services/wallets.dart' as _i9; -import 'package:stackwallet/utilities/amount/amount_unit.dart' as _i16; +import 'package:stackwallet/utilities/amount/amount_unit.dart' as _i17; import 'package:stackwallet/utilities/enums/backup_frequency_type.dart' as _i15; import 'package:stackwallet/utilities/enums/sync_type_enum.dart' as _i13; import 'package:stackwallet/utilities/flutter_secure_storage_interface.dart' @@ -28,7 +29,7 @@ import 'package:stackwallet/wallets/isar/models/wallet_info.dart' as _i11; import 'package:stackwallet/wallets/wallet/wallet.dart' as _i5; import 'package:stackwallet/wallets/wallet/wallet_mixin_interfaces/cash_fusion_interface.dart' as _i6; -import 'package:tor_ffi_plugin/tor_ffi_plugin.dart' as _i21; +import 'package:tor_ffi_plugin/tor_ffi_plugin.dart' as _i22; // ignore_for_file: type=lint // ignore_for_file: avoid_redundant_argument_values @@ -708,6 +709,45 @@ class MockPrefs extends _i1.Mock implements _i12.Prefs { returnValueForMissingStub: null, ); + @override + bool get advancedFiroFeatures => (super.noSuchMethod( + Invocation.getter(#advancedFiroFeatures), + returnValue: false, + ) as bool); + + @override + set advancedFiroFeatures(bool? advancedFiroFeatures) => super.noSuchMethod( + Invocation.setter( + #advancedFiroFeatures, + advancedFiroFeatures, + ), + returnValueForMissingStub: null, + ); + + @override + set logsPath(String? logsPath) => super.noSuchMethod( + Invocation.setter( + #logsPath, + logsPath, + ), + returnValueForMissingStub: null, + ); + + @override + _i16.Level get logLevel => (super.noSuchMethod( + Invocation.getter(#logLevel), + returnValue: _i16.Level.all, + ) as _i16.Level); + + @override + set logLevel(_i16.Level? logLevel) => super.noSuchMethod( + Invocation.setter( + #logLevel, + logLevel, + ), + returnValueForMissingStub: null, + ); + @override bool get hasListeners => (super.noSuchMethod( Invocation.getter(#hasListeners), @@ -764,18 +804,18 @@ class MockPrefs extends _i1.Mock implements _i12.Prefs { ) as _i10.Future); @override - _i16.AmountUnit amountUnit(_i4.CryptoCurrency? coin) => (super.noSuchMethod( + _i17.AmountUnit amountUnit(_i4.CryptoCurrency? coin) => (super.noSuchMethod( Invocation.method( #amountUnit, [coin], ), - returnValue: _i16.AmountUnit.normal, - ) as _i16.AmountUnit); + returnValue: _i17.AmountUnit.normal, + ) as _i17.AmountUnit); @override void updateAmountUnit({ required _i4.CryptoCurrency? coin, - required _i16.AmountUnit? amountUnit, + required _i17.AmountUnit? amountUnit, }) => super.noSuchMethod( Invocation.method( @@ -848,7 +888,7 @@ class MockPrefs extends _i1.Mock implements _i12.Prefs { ); @override - void addListener(_i17.VoidCallback? listener) => super.noSuchMethod( + void addListener(_i18.VoidCallback? listener) => super.noSuchMethod( Invocation.method( #addListener, [listener], @@ -857,7 +897,7 @@ class MockPrefs extends _i1.Mock implements _i12.Prefs { ); @override - void removeListener(_i17.VoidCallback? listener) => super.noSuchMethod( + void removeListener(_i18.VoidCallback? listener) => super.noSuchMethod( Invocation.method( #removeListener, [listener], @@ -902,16 +942,16 @@ class MockNodeService extends _i1.Mock implements _i2.NodeService { ) as _i7.SecureStorageInterface); @override - List<_i18.NodeModel> get primaryNodes => (super.noSuchMethod( + List<_i19.NodeModel> get primaryNodes => (super.noSuchMethod( Invocation.getter(#primaryNodes), - returnValue: <_i18.NodeModel>[], - ) as List<_i18.NodeModel>); + returnValue: <_i19.NodeModel>[], + ) as List<_i19.NodeModel>); @override - List<_i18.NodeModel> get nodes => (super.noSuchMethod( + List<_i19.NodeModel> get nodes => (super.noSuchMethod( Invocation.getter(#nodes), - returnValue: <_i18.NodeModel>[], - ) as List<_i18.NodeModel>); + returnValue: <_i19.NodeModel>[], + ) as List<_i19.NodeModel>); @override bool get hasListeners => (super.noSuchMethod( @@ -932,7 +972,7 @@ class MockNodeService extends _i1.Mock implements _i2.NodeService { @override _i10.Future setPrimaryNodeFor({ required _i4.CryptoCurrency? coin, - required _i18.NodeModel? node, + required _i19.NodeModel? node, bool? shouldNotifyListeners = false, }) => (super.noSuchMethod( @@ -950,33 +990,33 @@ class MockNodeService extends _i1.Mock implements _i2.NodeService { ) as _i10.Future); @override - _i18.NodeModel? getPrimaryNodeFor({required _i4.CryptoCurrency? currency}) => + _i19.NodeModel? getPrimaryNodeFor({required _i4.CryptoCurrency? currency}) => (super.noSuchMethod(Invocation.method( #getPrimaryNodeFor, [], {#currency: currency}, - )) as _i18.NodeModel?); + )) as _i19.NodeModel?); @override - List<_i18.NodeModel> getNodesFor(_i4.CryptoCurrency? coin) => + List<_i19.NodeModel> getNodesFor(_i4.CryptoCurrency? coin) => (super.noSuchMethod( Invocation.method( #getNodesFor, [coin], ), - returnValue: <_i18.NodeModel>[], - ) as List<_i18.NodeModel>); + returnValue: <_i19.NodeModel>[], + ) as List<_i19.NodeModel>); @override - _i18.NodeModel? getNodeById({required String? id}) => + _i19.NodeModel? getNodeById({required String? id}) => (super.noSuchMethod(Invocation.method( #getNodeById, [], {#id: id}, - )) as _i18.NodeModel?); + )) as _i19.NodeModel?); @override - List<_i18.NodeModel> failoverNodesFor( + List<_i19.NodeModel> failoverNodesFor( {required _i4.CryptoCurrency? currency}) => (super.noSuchMethod( Invocation.method( @@ -984,12 +1024,12 @@ class MockNodeService extends _i1.Mock implements _i2.NodeService { [], {#currency: currency}, ), - returnValue: <_i18.NodeModel>[], - ) as List<_i18.NodeModel>); + returnValue: <_i19.NodeModel>[], + ) as List<_i19.NodeModel>); @override _i10.Future add( - _i18.NodeModel? node, + _i19.NodeModel? node, String? password, bool? shouldNotifyListeners, ) => @@ -1044,7 +1084,7 @@ class MockNodeService extends _i1.Mock implements _i2.NodeService { @override _i10.Future edit( - _i18.NodeModel? editedNode, + _i19.NodeModel? editedNode, String? password, bool? shouldNotifyListeners, ) => @@ -1072,7 +1112,7 @@ class MockNodeService extends _i1.Mock implements _i2.NodeService { ) as _i10.Future); @override - void addListener(_i17.VoidCallback? listener) => super.noSuchMethod( + void addListener(_i18.VoidCallback? listener) => super.noSuchMethod( Invocation.method( #addListener, [listener], @@ -1081,7 +1121,7 @@ class MockNodeService extends _i1.Mock implements _i2.NodeService { ); @override - void removeListener(_i17.VoidCallback? listener) => super.noSuchMethod( + void removeListener(_i18.VoidCallback? listener) => super.noSuchMethod( Invocation.method( #removeListener, [listener], @@ -1111,16 +1151,16 @@ class MockNodeService extends _i1.Mock implements _i2.NodeService { /// A class which mocks [TorService]. /// /// See the documentation for Mockito's code generation for more information. -class MockTorService extends _i1.Mock implements _i19.TorService { +class MockTorService extends _i1.Mock implements _i20.TorService { MockTorService() { _i1.throwOnMissingStub(this); } @override - _i20.TorConnectionStatus get status => (super.noSuchMethod( + _i21.TorConnectionStatus get status => (super.noSuchMethod( Invocation.getter(#status), - returnValue: _i20.TorConnectionStatus.disconnected, - ) as _i20.TorConnectionStatus); + returnValue: _i21.TorConnectionStatus.disconnected, + ) as _i21.TorConnectionStatus); @override ({_i8.InternetAddress host, int port}) getProxyInfo() => (super.noSuchMethod( @@ -1143,7 +1183,7 @@ class MockTorService extends _i1.Mock implements _i19.TorService { @override void init({ required String? torDataDirPath, - _i21.Tor? mockableOverride, + _i22.Tor? mockableOverride, }) => super.noSuchMethod( Invocation.method( diff --git a/test/widget_tests/transaction_card_test.mocks.dart b/test/widget_tests/transaction_card_test.mocks.dart index a5816bdcb..a146a9abf 100644 --- a/test/widget_tests/transaction_card_test.mocks.dart +++ b/test/widget_tests/transaction_card_test.mocks.dart @@ -4,27 +4,28 @@ // ignore_for_file: no_leading_underscores_for_library_prefixes import 'dart:async' as _i11; -import 'dart:typed_data' as _i25; +import 'dart:typed_data' as _i26; import 'dart:ui' as _i17; -import 'package:decimal/decimal.dart' as _i22; +import 'package:decimal/decimal.dart' as _i23; import 'package:isar/isar.dart' as _i9; +import 'package:logger/logger.dart' as _i20; import 'package:mockito/mockito.dart' as _i1; import 'package:mockito/src/dummies.dart' as _i16; import 'package:stackwallet/db/isar/main_db.dart' as _i3; -import 'package:stackwallet/models/isar/models/block_explorer.dart' as _i27; +import 'package:stackwallet/models/isar/models/block_explorer.dart' as _i28; import 'package:stackwallet/models/isar/models/blockchain_data/v2/transaction_v2.dart' - as _i29; -import 'package:stackwallet/models/isar/models/contact_entry.dart' as _i26; -import 'package:stackwallet/models/isar/models/isar_models.dart' as _i28; -import 'package:stackwallet/models/isar/stack_theme.dart' as _i24; + as _i30; +import 'package:stackwallet/models/isar/models/contact_entry.dart' as _i27; +import 'package:stackwallet/models/isar/models/isar_models.dart' as _i29; +import 'package:stackwallet/models/isar/stack_theme.dart' as _i25; import 'package:stackwallet/networking/http.dart' as _i8; import 'package:stackwallet/services/locale_service.dart' as _i15; import 'package:stackwallet/services/node_service.dart' as _i2; -import 'package:stackwallet/services/price_service.dart' as _i21; +import 'package:stackwallet/services/price_service.dart' as _i22; import 'package:stackwallet/services/wallets.dart' as _i10; -import 'package:stackwallet/themes/theme_service.dart' as _i23; -import 'package:stackwallet/utilities/amount/amount_unit.dart' as _i20; +import 'package:stackwallet/themes/theme_service.dart' as _i24; +import 'package:stackwallet/utilities/amount/amount_unit.dart' as _i21; import 'package:stackwallet/utilities/enums/backup_frequency_type.dart' as _i19; import 'package:stackwallet/utilities/enums/sync_type_enum.dart' as _i18; import 'package:stackwallet/utilities/flutter_secure_storage_interface.dart' @@ -817,6 +818,45 @@ class MockPrefs extends _i1.Mock implements _i14.Prefs { returnValueForMissingStub: null, ); + @override + bool get advancedFiroFeatures => (super.noSuchMethod( + Invocation.getter(#advancedFiroFeatures), + returnValue: false, + ) as bool); + + @override + set advancedFiroFeatures(bool? advancedFiroFeatures) => super.noSuchMethod( + Invocation.setter( + #advancedFiroFeatures, + advancedFiroFeatures, + ), + returnValueForMissingStub: null, + ); + + @override + set logsPath(String? logsPath) => super.noSuchMethod( + Invocation.setter( + #logsPath, + logsPath, + ), + returnValueForMissingStub: null, + ); + + @override + _i20.Level get logLevel => (super.noSuchMethod( + Invocation.getter(#logLevel), + returnValue: _i20.Level.all, + ) as _i20.Level); + + @override + set logLevel(_i20.Level? logLevel) => super.noSuchMethod( + Invocation.setter( + #logLevel, + logLevel, + ), + returnValueForMissingStub: null, + ); + @override bool get hasListeners => (super.noSuchMethod( Invocation.getter(#hasListeners), @@ -873,18 +913,18 @@ class MockPrefs extends _i1.Mock implements _i14.Prefs { ) as _i11.Future); @override - _i20.AmountUnit amountUnit(_i4.CryptoCurrency? coin) => (super.noSuchMethod( + _i21.AmountUnit amountUnit(_i4.CryptoCurrency? coin) => (super.noSuchMethod( Invocation.method( #amountUnit, [coin], ), - returnValue: _i20.AmountUnit.normal, - ) as _i20.AmountUnit); + returnValue: _i21.AmountUnit.normal, + ) as _i21.AmountUnit); @override void updateAmountUnit({ required _i4.CryptoCurrency? coin, - required _i20.AmountUnit? amountUnit, + required _i21.AmountUnit? amountUnit, }) => super.noSuchMethod( Invocation.method( @@ -996,7 +1036,7 @@ class MockPrefs extends _i1.Mock implements _i14.Prefs { /// A class which mocks [PriceService]. /// /// See the documentation for Mockito's code generation for more information. -class MockPriceService extends _i1.Mock implements _i21.PriceService { +class MockPriceService extends _i1.Mock implements _i22.PriceService { MockPriceService() { _i1.throwOnMissingStub(this); } @@ -1042,36 +1082,36 @@ class MockPriceService extends _i1.Mock implements _i21.PriceService { ) as bool); @override - _i7.Tuple2<_i22.Decimal, double> getPrice(_i4.CryptoCurrency? coin) => + _i7.Tuple2<_i23.Decimal, double> getPrice(_i4.CryptoCurrency? coin) => (super.noSuchMethod( Invocation.method( #getPrice, [coin], ), - returnValue: _FakeTuple2_5<_i22.Decimal, double>( + returnValue: _FakeTuple2_5<_i23.Decimal, double>( this, Invocation.method( #getPrice, [coin], ), ), - ) as _i7.Tuple2<_i22.Decimal, double>); + ) as _i7.Tuple2<_i23.Decimal, double>); @override - _i7.Tuple2<_i22.Decimal, double> getTokenPrice(String? contractAddress) => + _i7.Tuple2<_i23.Decimal, double> getTokenPrice(String? contractAddress) => (super.noSuchMethod( Invocation.method( #getTokenPrice, [contractAddress], ), - returnValue: _FakeTuple2_5<_i22.Decimal, double>( + returnValue: _FakeTuple2_5<_i23.Decimal, double>( this, Invocation.method( #getTokenPrice, [contractAddress], ), ), - ) as _i7.Tuple2<_i22.Decimal, double>); + ) as _i7.Tuple2<_i23.Decimal, double>); @override _i11.Future updatePrice() => (super.noSuchMethod( @@ -1141,7 +1181,7 @@ class MockPriceService extends _i1.Mock implements _i21.PriceService { /// A class which mocks [ThemeService]. /// /// See the documentation for Mockito's code generation for more information. -class MockThemeService extends _i1.Mock implements _i23.ThemeService { +class MockThemeService extends _i1.Mock implements _i24.ThemeService { MockThemeService() { _i1.throwOnMissingStub(this); } @@ -1174,10 +1214,10 @@ class MockThemeService extends _i1.Mock implements _i23.ThemeService { ) as _i3.MainDB); @override - List<_i24.StackTheme> get installedThemes => (super.noSuchMethod( + List<_i25.StackTheme> get installedThemes => (super.noSuchMethod( Invocation.getter(#installedThemes), - returnValue: <_i24.StackTheme>[], - ) as List<_i24.StackTheme>); + returnValue: <_i25.StackTheme>[], + ) as List<_i25.StackTheme>); @override void init(_i3.MainDB? db) => super.noSuchMethod( @@ -1189,7 +1229,7 @@ class MockThemeService extends _i1.Mock implements _i23.ThemeService { ); @override - _i11.Future install({required _i25.Uint8List? themeArchiveData}) => + _i11.Future install({required _i26.Uint8List? themeArchiveData}) => (super.noSuchMethod( Invocation.method( #install, @@ -1233,35 +1273,35 @@ class MockThemeService extends _i1.Mock implements _i23.ThemeService { ) as _i11.Future); @override - _i11.Future> fetchThemes() => + _i11.Future> fetchThemes() => (super.noSuchMethod( Invocation.method( #fetchThemes, [], ), - returnValue: _i11.Future>.value( - <_i23.StackThemeMetaData>[]), - ) as _i11.Future>); + returnValue: _i11.Future>.value( + <_i24.StackThemeMetaData>[]), + ) as _i11.Future>); @override - _i11.Future<_i25.Uint8List> fetchTheme( - {required _i23.StackThemeMetaData? themeMetaData}) => + _i11.Future<_i26.Uint8List> fetchTheme( + {required _i24.StackThemeMetaData? themeMetaData}) => (super.noSuchMethod( Invocation.method( #fetchTheme, [], {#themeMetaData: themeMetaData}, ), - returnValue: _i11.Future<_i25.Uint8List>.value(_i25.Uint8List(0)), - ) as _i11.Future<_i25.Uint8List>); + returnValue: _i11.Future<_i26.Uint8List>.value(_i26.Uint8List(0)), + ) as _i11.Future<_i26.Uint8List>); @override - _i24.StackTheme? getTheme({required String? themeId}) => + _i25.StackTheme? getTheme({required String? themeId}) => (super.noSuchMethod(Invocation.method( #getTheme, [], {#themeId: themeId}, - )) as _i24.StackTheme?); + )) as _i25.StackTheme?); } /// A class which mocks [MainDB]. @@ -1314,13 +1354,13 @@ class MockMainDB extends _i1.Mock implements _i3.MainDB { ) as _i11.Future); @override - List<_i26.ContactEntry> getContactEntries() => (super.noSuchMethod( + List<_i27.ContactEntry> getContactEntries() => (super.noSuchMethod( Invocation.method( #getContactEntries, [], ), - returnValue: <_i26.ContactEntry>[], - ) as List<_i26.ContactEntry>); + returnValue: <_i27.ContactEntry>[], + ) as List<_i27.ContactEntry>); @override _i11.Future deleteContactEntry({required String? id}) => @@ -1345,16 +1385,16 @@ class MockMainDB extends _i1.Mock implements _i3.MainDB { ) as _i11.Future); @override - _i26.ContactEntry? getContactEntry({required String? id}) => + _i27.ContactEntry? getContactEntry({required String? id}) => (super.noSuchMethod(Invocation.method( #getContactEntry, [], {#id: id}, - )) as _i26.ContactEntry?); + )) as _i27.ContactEntry?); @override _i11.Future putContactEntry( - {required _i26.ContactEntry? contactEntry}) => + {required _i27.ContactEntry? contactEntry}) => (super.noSuchMethod( Invocation.method( #putContactEntry, @@ -1365,17 +1405,17 @@ class MockMainDB extends _i1.Mock implements _i3.MainDB { ) as _i11.Future); @override - _i27.TransactionBlockExplorer? getTransactionBlockExplorer( + _i28.TransactionBlockExplorer? getTransactionBlockExplorer( {required _i4.CryptoCurrency? cryptoCurrency}) => (super.noSuchMethod(Invocation.method( #getTransactionBlockExplorer, [], {#cryptoCurrency: cryptoCurrency}, - )) as _i27.TransactionBlockExplorer?); + )) as _i28.TransactionBlockExplorer?); @override _i11.Future putTransactionBlockExplorer( - _i27.TransactionBlockExplorer? explorer) => + _i28.TransactionBlockExplorer? explorer) => (super.noSuchMethod( Invocation.method( #putTransactionBlockExplorer, @@ -1385,13 +1425,13 @@ class MockMainDB extends _i1.Mock implements _i3.MainDB { ) as _i11.Future); @override - _i9.QueryBuilder<_i28.Address, _i28.Address, _i9.QAfterWhereClause> + _i9.QueryBuilder<_i29.Address, _i29.Address, _i9.QAfterWhereClause> getAddresses(String? walletId) => (super.noSuchMethod( Invocation.method( #getAddresses, [walletId], ), - returnValue: _FakeQueryBuilder_8<_i28.Address, _i28.Address, + returnValue: _FakeQueryBuilder_8<_i29.Address, _i29.Address, _i9.QAfterWhereClause>( this, Invocation.method( @@ -1400,10 +1440,10 @@ class MockMainDB extends _i1.Mock implements _i3.MainDB { ), ), ) as _i9 - .QueryBuilder<_i28.Address, _i28.Address, _i9.QAfterWhereClause>); + .QueryBuilder<_i29.Address, _i29.Address, _i9.QAfterWhereClause>); @override - _i11.Future putAddress(_i28.Address? address) => (super.noSuchMethod( + _i11.Future putAddress(_i29.Address? address) => (super.noSuchMethod( Invocation.method( #putAddress, [address], @@ -1412,7 +1452,7 @@ class MockMainDB extends _i1.Mock implements _i3.MainDB { ) as _i11.Future); @override - _i11.Future> putAddresses(List<_i28.Address>? addresses) => + _i11.Future> putAddresses(List<_i29.Address>? addresses) => (super.noSuchMethod( Invocation.method( #putAddresses, @@ -1422,7 +1462,7 @@ class MockMainDB extends _i1.Mock implements _i3.MainDB { ) as _i11.Future>); @override - _i11.Future> updateOrPutAddresses(List<_i28.Address>? addresses) => + _i11.Future> updateOrPutAddresses(List<_i29.Address>? addresses) => (super.noSuchMethod( Invocation.method( #updateOrPutAddresses, @@ -1432,7 +1472,7 @@ class MockMainDB extends _i1.Mock implements _i3.MainDB { ) as _i11.Future>); @override - _i11.Future<_i28.Address?> getAddress( + _i11.Future<_i29.Address?> getAddress( String? walletId, String? address, ) => @@ -1444,13 +1484,13 @@ class MockMainDB extends _i1.Mock implements _i3.MainDB { address, ], ), - returnValue: _i11.Future<_i28.Address?>.value(), - ) as _i11.Future<_i28.Address?>); + returnValue: _i11.Future<_i29.Address?>.value(), + ) as _i11.Future<_i29.Address?>); @override _i11.Future updateAddress( - _i28.Address? oldAddress, - _i28.Address? newAddress, + _i29.Address? oldAddress, + _i29.Address? newAddress, ) => (super.noSuchMethod( Invocation.method( @@ -1464,13 +1504,13 @@ class MockMainDB extends _i1.Mock implements _i3.MainDB { ) as _i11.Future); @override - _i9.QueryBuilder<_i28.Transaction, _i28.Transaction, _i9.QAfterWhereClause> + _i9.QueryBuilder<_i29.Transaction, _i29.Transaction, _i9.QAfterWhereClause> getTransactions(String? walletId) => (super.noSuchMethod( Invocation.method( #getTransactions, [walletId], ), - returnValue: _FakeQueryBuilder_8<_i28.Transaction, _i28.Transaction, + returnValue: _FakeQueryBuilder_8<_i29.Transaction, _i29.Transaction, _i9.QAfterWhereClause>( this, Invocation.method( @@ -1478,11 +1518,11 @@ class MockMainDB extends _i1.Mock implements _i3.MainDB { [walletId], ), ), - ) as _i9.QueryBuilder<_i28.Transaction, _i28.Transaction, + ) as _i9.QueryBuilder<_i29.Transaction, _i29.Transaction, _i9.QAfterWhereClause>); @override - _i11.Future putTransaction(_i28.Transaction? transaction) => + _i11.Future putTransaction(_i29.Transaction? transaction) => (super.noSuchMethod( Invocation.method( #putTransaction, @@ -1493,7 +1533,7 @@ class MockMainDB extends _i1.Mock implements _i3.MainDB { @override _i11.Future> putTransactions( - List<_i28.Transaction>? transactions) => + List<_i29.Transaction>? transactions) => (super.noSuchMethod( Invocation.method( #putTransactions, @@ -1503,7 +1543,7 @@ class MockMainDB extends _i1.Mock implements _i3.MainDB { ) as _i11.Future>); @override - _i11.Future<_i28.Transaction?> getTransaction( + _i11.Future<_i29.Transaction?> getTransaction( String? walletId, String? txid, ) => @@ -1515,11 +1555,11 @@ class MockMainDB extends _i1.Mock implements _i3.MainDB { txid, ], ), - returnValue: _i11.Future<_i28.Transaction?>.value(), - ) as _i11.Future<_i28.Transaction?>); + returnValue: _i11.Future<_i29.Transaction?>.value(), + ) as _i11.Future<_i29.Transaction?>); @override - _i11.Stream<_i28.Transaction?> watchTransaction({ + _i11.Stream<_i29.Transaction?> watchTransaction({ required int? id, bool? fireImmediately = false, }) => @@ -1532,11 +1572,11 @@ class MockMainDB extends _i1.Mock implements _i3.MainDB { #fireImmediately: fireImmediately, }, ), - returnValue: _i11.Stream<_i28.Transaction?>.empty(), - ) as _i11.Stream<_i28.Transaction?>); + returnValue: _i11.Stream<_i29.Transaction?>.empty(), + ) as _i11.Stream<_i29.Transaction?>); @override - _i9.QueryBuilder<_i28.UTXO, _i28.UTXO, _i9.QAfterWhereClause> getUTXOs( + _i9.QueryBuilder<_i29.UTXO, _i29.UTXO, _i9.QAfterWhereClause> getUTXOs( String? walletId) => (super.noSuchMethod( Invocation.method( @@ -1544,17 +1584,17 @@ class MockMainDB extends _i1.Mock implements _i3.MainDB { [walletId], ), returnValue: - _FakeQueryBuilder_8<_i28.UTXO, _i28.UTXO, _i9.QAfterWhereClause>( + _FakeQueryBuilder_8<_i29.UTXO, _i29.UTXO, _i9.QAfterWhereClause>( this, Invocation.method( #getUTXOs, [walletId], ), ), - ) as _i9.QueryBuilder<_i28.UTXO, _i28.UTXO, _i9.QAfterWhereClause>); + ) as _i9.QueryBuilder<_i29.UTXO, _i29.UTXO, _i9.QAfterWhereClause>); @override - _i9.QueryBuilder<_i28.UTXO, _i28.UTXO, _i9.QAfterFilterCondition> + _i9.QueryBuilder<_i29.UTXO, _i29.UTXO, _i9.QAfterFilterCondition> getUTXOsByAddress( String? walletId, String? address, @@ -1567,7 +1607,7 @@ class MockMainDB extends _i1.Mock implements _i3.MainDB { address, ], ), - returnValue: _FakeQueryBuilder_8<_i28.UTXO, _i28.UTXO, + returnValue: _FakeQueryBuilder_8<_i29.UTXO, _i29.UTXO, _i9.QAfterFilterCondition>( this, Invocation.method( @@ -1579,10 +1619,10 @@ class MockMainDB extends _i1.Mock implements _i3.MainDB { ), ), ) as _i9 - .QueryBuilder<_i28.UTXO, _i28.UTXO, _i9.QAfterFilterCondition>); + .QueryBuilder<_i29.UTXO, _i29.UTXO, _i9.QAfterFilterCondition>); @override - _i11.Future putUTXO(_i28.UTXO? utxo) => (super.noSuchMethod( + _i11.Future putUTXO(_i29.UTXO? utxo) => (super.noSuchMethod( Invocation.method( #putUTXO, [utxo], @@ -1592,7 +1632,7 @@ class MockMainDB extends _i1.Mock implements _i3.MainDB { ) as _i11.Future); @override - _i11.Future putUTXOs(List<_i28.UTXO>? utxos) => (super.noSuchMethod( + _i11.Future putUTXOs(List<_i29.UTXO>? utxos) => (super.noSuchMethod( Invocation.method( #putUTXOs, [utxos], @@ -1604,7 +1644,7 @@ class MockMainDB extends _i1.Mock implements _i3.MainDB { @override _i11.Future updateUTXOs( String? walletId, - List<_i28.UTXO>? utxos, + List<_i29.UTXO>? utxos, ) => (super.noSuchMethod( Invocation.method( @@ -1618,7 +1658,7 @@ class MockMainDB extends _i1.Mock implements _i3.MainDB { ) as _i11.Future); @override - _i11.Stream<_i28.UTXO?> watchUTXO({ + _i11.Stream<_i29.UTXO?> watchUTXO({ required int? id, bool? fireImmediately = false, }) => @@ -1631,11 +1671,11 @@ class MockMainDB extends _i1.Mock implements _i3.MainDB { #fireImmediately: fireImmediately, }, ), - returnValue: _i11.Stream<_i28.UTXO?>.empty(), - ) as _i11.Stream<_i28.UTXO?>); + returnValue: _i11.Stream<_i29.UTXO?>.empty(), + ) as _i11.Stream<_i29.UTXO?>); @override - _i9.QueryBuilder<_i28.TransactionNote, _i28.TransactionNote, + _i9.QueryBuilder<_i29.TransactionNote, _i29.TransactionNote, _i9.QAfterWhereClause> getTransactionNotes( String? walletId) => (super.noSuchMethod( @@ -1643,19 +1683,19 @@ class MockMainDB extends _i1.Mock implements _i3.MainDB { #getTransactionNotes, [walletId], ), - returnValue: _FakeQueryBuilder_8<_i28.TransactionNote, - _i28.TransactionNote, _i9.QAfterWhereClause>( + returnValue: _FakeQueryBuilder_8<_i29.TransactionNote, + _i29.TransactionNote, _i9.QAfterWhereClause>( this, Invocation.method( #getTransactionNotes, [walletId], ), ), - ) as _i9.QueryBuilder<_i28.TransactionNote, _i28.TransactionNote, + ) as _i9.QueryBuilder<_i29.TransactionNote, _i29.TransactionNote, _i9.QAfterWhereClause>); @override - _i11.Future putTransactionNote(_i28.TransactionNote? transactionNote) => + _i11.Future putTransactionNote(_i29.TransactionNote? transactionNote) => (super.noSuchMethod( Invocation.method( #putTransactionNote, @@ -1667,7 +1707,7 @@ class MockMainDB extends _i1.Mock implements _i3.MainDB { @override _i11.Future putTransactionNotes( - List<_i28.TransactionNote>? transactionNotes) => + List<_i29.TransactionNote>? transactionNotes) => (super.noSuchMethod( Invocation.method( #putTransactionNotes, @@ -1678,7 +1718,7 @@ class MockMainDB extends _i1.Mock implements _i3.MainDB { ) as _i11.Future); @override - _i11.Future<_i28.TransactionNote?> getTransactionNote( + _i11.Future<_i29.TransactionNote?> getTransactionNote( String? walletId, String? txid, ) => @@ -1690,11 +1730,11 @@ class MockMainDB extends _i1.Mock implements _i3.MainDB { txid, ], ), - returnValue: _i11.Future<_i28.TransactionNote?>.value(), - ) as _i11.Future<_i28.TransactionNote?>); + returnValue: _i11.Future<_i29.TransactionNote?>.value(), + ) as _i11.Future<_i29.TransactionNote?>); @override - _i11.Stream<_i28.TransactionNote?> watchTransactionNote({ + _i11.Stream<_i29.TransactionNote?> watchTransactionNote({ required int? id, bool? fireImmediately = false, }) => @@ -1707,29 +1747,29 @@ class MockMainDB extends _i1.Mock implements _i3.MainDB { #fireImmediately: fireImmediately, }, ), - returnValue: _i11.Stream<_i28.TransactionNote?>.empty(), - ) as _i11.Stream<_i28.TransactionNote?>); + returnValue: _i11.Stream<_i29.TransactionNote?>.empty(), + ) as _i11.Stream<_i29.TransactionNote?>); @override - _i9.QueryBuilder<_i28.AddressLabel, _i28.AddressLabel, _i9.QAfterWhereClause> + _i9.QueryBuilder<_i29.AddressLabel, _i29.AddressLabel, _i9.QAfterWhereClause> getAddressLabels(String? walletId) => (super.noSuchMethod( Invocation.method( #getAddressLabels, [walletId], ), - returnValue: _FakeQueryBuilder_8<_i28.AddressLabel, - _i28.AddressLabel, _i9.QAfterWhereClause>( + returnValue: _FakeQueryBuilder_8<_i29.AddressLabel, + _i29.AddressLabel, _i9.QAfterWhereClause>( this, Invocation.method( #getAddressLabels, [walletId], ), ), - ) as _i9.QueryBuilder<_i28.AddressLabel, _i28.AddressLabel, + ) as _i9.QueryBuilder<_i29.AddressLabel, _i29.AddressLabel, _i9.QAfterWhereClause>); @override - _i11.Future putAddressLabel(_i28.AddressLabel? addressLabel) => + _i11.Future putAddressLabel(_i29.AddressLabel? addressLabel) => (super.noSuchMethod( Invocation.method( #putAddressLabel, @@ -1739,7 +1779,7 @@ class MockMainDB extends _i1.Mock implements _i3.MainDB { ) as _i11.Future); @override - int putAddressLabelSync(_i28.AddressLabel? addressLabel) => + int putAddressLabelSync(_i29.AddressLabel? addressLabel) => (super.noSuchMethod( Invocation.method( #putAddressLabelSync, @@ -1749,7 +1789,7 @@ class MockMainDB extends _i1.Mock implements _i3.MainDB { ) as int); @override - _i11.Future putAddressLabels(List<_i28.AddressLabel>? addressLabels) => + _i11.Future putAddressLabels(List<_i29.AddressLabel>? addressLabels) => (super.noSuchMethod( Invocation.method( #putAddressLabels, @@ -1760,7 +1800,7 @@ class MockMainDB extends _i1.Mock implements _i3.MainDB { ) as _i11.Future); @override - _i11.Future<_i28.AddressLabel?> getAddressLabel( + _i11.Future<_i29.AddressLabel?> getAddressLabel( String? walletId, String? addressString, ) => @@ -1772,11 +1812,11 @@ class MockMainDB extends _i1.Mock implements _i3.MainDB { addressString, ], ), - returnValue: _i11.Future<_i28.AddressLabel?>.value(), - ) as _i11.Future<_i28.AddressLabel?>); + returnValue: _i11.Future<_i29.AddressLabel?>.value(), + ) as _i11.Future<_i29.AddressLabel?>); @override - _i28.AddressLabel? getAddressLabelSync( + _i29.AddressLabel? getAddressLabelSync( String? walletId, String? addressString, ) => @@ -1786,10 +1826,10 @@ class MockMainDB extends _i1.Mock implements _i3.MainDB { walletId, addressString, ], - )) as _i28.AddressLabel?); + )) as _i29.AddressLabel?); @override - _i11.Stream<_i28.AddressLabel?> watchAddressLabel({ + _i11.Stream<_i29.AddressLabel?> watchAddressLabel({ required int? id, bool? fireImmediately = false, }) => @@ -1802,11 +1842,11 @@ class MockMainDB extends _i1.Mock implements _i3.MainDB { #fireImmediately: fireImmediately, }, ), - returnValue: _i11.Stream<_i28.AddressLabel?>.empty(), - ) as _i11.Stream<_i28.AddressLabel?>); + returnValue: _i11.Stream<_i29.AddressLabel?>.empty(), + ) as _i11.Stream<_i29.AddressLabel?>); @override - _i11.Future updateAddressLabel(_i28.AddressLabel? addressLabel) => + _i11.Future updateAddressLabel(_i29.AddressLabel? addressLabel) => (super.noSuchMethod( Invocation.method( #updateAddressLabel, @@ -1850,7 +1890,7 @@ class MockMainDB extends _i1.Mock implements _i3.MainDB { @override _i11.Future addNewTransactionData( - List<_i7.Tuple2<_i28.Transaction, _i28.Address?>>? transactionsData, + List<_i7.Tuple2<_i29.Transaction, _i29.Address?>>? transactionsData, String? walletId, ) => (super.noSuchMethod( @@ -1867,7 +1907,7 @@ class MockMainDB extends _i1.Mock implements _i3.MainDB { @override _i11.Future> updateOrPutTransactionV2s( - List<_i29.TransactionV2>? transactions) => + List<_i30.TransactionV2>? transactions) => (super.noSuchMethod( Invocation.method( #updateOrPutTransactionV2s, @@ -1877,13 +1917,13 @@ class MockMainDB extends _i1.Mock implements _i3.MainDB { ) as _i11.Future>); @override - _i9.QueryBuilder<_i28.EthContract, _i28.EthContract, _i9.QWhere> + _i9.QueryBuilder<_i29.EthContract, _i29.EthContract, _i9.QWhere> getEthContracts() => (super.noSuchMethod( Invocation.method( #getEthContracts, [], ), - returnValue: _FakeQueryBuilder_8<_i28.EthContract, _i28.EthContract, + returnValue: _FakeQueryBuilder_8<_i29.EthContract, _i29.EthContract, _i9.QWhere>( this, Invocation.method( @@ -1892,27 +1932,27 @@ class MockMainDB extends _i1.Mock implements _i3.MainDB { ), ), ) as _i9 - .QueryBuilder<_i28.EthContract, _i28.EthContract, _i9.QWhere>); + .QueryBuilder<_i29.EthContract, _i29.EthContract, _i9.QWhere>); @override - _i11.Future<_i28.EthContract?> getEthContract(String? contractAddress) => + _i11.Future<_i29.EthContract?> getEthContract(String? contractAddress) => (super.noSuchMethod( Invocation.method( #getEthContract, [contractAddress], ), - returnValue: _i11.Future<_i28.EthContract?>.value(), - ) as _i11.Future<_i28.EthContract?>); + returnValue: _i11.Future<_i29.EthContract?>.value(), + ) as _i11.Future<_i29.EthContract?>); @override - _i28.EthContract? getEthContractSync(String? contractAddress) => + _i29.EthContract? getEthContractSync(String? contractAddress) => (super.noSuchMethod(Invocation.method( #getEthContractSync, [contractAddress], - )) as _i28.EthContract?); + )) as _i29.EthContract?); @override - _i11.Future putEthContract(_i28.EthContract? contract) => + _i11.Future putEthContract(_i29.EthContract? contract) => (super.noSuchMethod( Invocation.method( #putEthContract, @@ -1922,7 +1962,7 @@ class MockMainDB extends _i1.Mock implements _i3.MainDB { ) as _i11.Future); @override - _i11.Future putEthContracts(List<_i28.EthContract>? contracts) => + _i11.Future putEthContracts(List<_i29.EthContract>? contracts) => (super.noSuchMethod( Invocation.method( #putEthContracts, @@ -1947,7 +1987,7 @@ class MockMainDB extends _i1.Mock implements _i3.MainDB { /// A class which mocks [IThemeAssets]. /// /// See the documentation for Mockito's code generation for more information. -class MockIThemeAssets extends _i1.Mock implements _i24.IThemeAssets { +class MockIThemeAssets extends _i1.Mock implements _i25.IThemeAssets { MockIThemeAssets() { _i1.throwOnMissingStub(this); } From 0623023b3a1b6bb0b57e5acca539bc70148b2b9d Mon Sep 17 00:00:00 2001 From: julian Date: Wed, 12 Feb 2025 19:49:47 -0600 Subject: [PATCH 068/193] WIP names --- .../isar/models/blockchain_data/utxo.dart | 1 + .../confirm_name_transaction_view.dart | 1067 +++++++++++++++++ .../namecoin_names_home_view.dart | 350 ++++++ lib/pages/wallet_view/wallet_view.dart | 13 + .../sub_widgets/desktop_wallet_features.dart | 11 + .../more_features/more_features_dialog.dart | 10 + lib/route_generator.dart | 31 + lib/wallets/models/name_op_state.dart | 52 + lib/wallets/models/tx_data.dart | 8 + lib/wallets/wallet/impl/namecoin_wallet.dart | 925 +++++++++++++- lib/wallets/wallet/wallet.dart | 26 +- .../electrumx_interface.dart | 25 +- lib/widgets/desktop/desktop_fee_dialog.dart | 2 +- pubspec.lock | 9 + scripts/app_config/templates/pubspec.template | 4 + 15 files changed, 2498 insertions(+), 36 deletions(-) create mode 100644 lib/pages/namecoin_names/confirm_name_transaction_view.dart create mode 100644 lib/pages/namecoin_names/namecoin_names_home_view.dart create mode 100644 lib/wallets/models/name_op_state.dart diff --git a/lib/models/isar/models/blockchain_data/utxo.dart b/lib/models/isar/models/blockchain_data/utxo.dart index 77de5ae3a..e4f91258c 100644 --- a/lib/models/isar/models/blockchain_data/utxo.dart +++ b/lib/models/isar/models/blockchain_data/utxo.dart @@ -180,4 +180,5 @@ class UTXO { abstract final class UTXOOtherDataKeys { static const keyImage = "keyImage"; static const spent = "spent"; + static const nameOpData = "nameOpData"; } diff --git a/lib/pages/namecoin_names/confirm_name_transaction_view.dart b/lib/pages/namecoin_names/confirm_name_transaction_view.dart new file mode 100644 index 000000000..f46fcf795 --- /dev/null +++ b/lib/pages/namecoin_names/confirm_name_transaction_view.dart @@ -0,0 +1,1067 @@ +/* + * This file is part of Stack Wallet. + * + * Copyright (c) 2023 Cypher Stack + * All Rights Reserved. + * The code is distributed under GPLv3 license, see LICENSE file for details. + * Generated by Cypher Stack on 2023-05-26 + * + */ + +import 'dart:async'; +import 'dart:io'; + +import 'package:decimal/decimal.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:flutter_svg/svg.dart'; + +import '../../models/isar/models/transaction_note.dart'; +import '../../notifications/show_flush_bar.dart'; +import '../../pages_desktop_specific/coin_control/desktop_coin_control_use_dialog.dart'; +import '../../pages_desktop_specific/my_stack_view/wallet_view/sub_widgets/desktop_auth_send.dart'; +import '../../providers/db/main_db_provider.dart'; +import '../../providers/global/secure_store_provider.dart'; +import '../../providers/providers.dart'; +import '../../route_generator.dart'; +import '../../themes/stack_colors.dart'; +import '../../themes/theme_providers.dart'; +import '../../utilities/amount/amount.dart'; +import '../../utilities/amount/amount_formatter.dart'; +import '../../utilities/constants.dart'; +import '../../utilities/logger.dart'; +import '../../utilities/text_styles.dart'; +import '../../utilities/util.dart'; +import '../../wallets/isar/providers/wallet_info_provider.dart'; +import '../../wallets/models/tx_data.dart'; +import '../../wallets/wallet/impl/namecoin_wallet.dart'; +import '../../widgets/background.dart'; +import '../../widgets/conditional_parent.dart'; +import '../../widgets/custom_buttons/app_bar_icon_button.dart'; +import '../../widgets/desktop/desktop_dialog.dart'; +import '../../widgets/desktop/desktop_dialog_close_button.dart'; +import '../../widgets/desktop/primary_button.dart'; +import '../../widgets/icon_widgets/x_icon.dart'; +import '../../widgets/rounded_container.dart'; +import '../../widgets/rounded_white_container.dart'; +import '../../widgets/stack_dialog.dart'; +import '../../widgets/stack_text_field.dart'; +import '../../widgets/textfield_icon_button.dart'; +import '../pinpad_views/lock_screen_view.dart'; +import '../send_view/sub_widgets/sending_transaction_dialog.dart'; + +class ConfirmNameTransactionView extends ConsumerStatefulWidget { + const ConfirmNameTransactionView({ + super.key, + required this.txData, + required this.walletId, + }); + + static const String routeName = "/confirmNameTransactionView"; + + final TxData txData; + final String walletId; + + @override + ConsumerState createState() => + _ConfirmNameTransactionViewState(); +} + +class _ConfirmNameTransactionViewState + extends ConsumerState { + late final String walletId; + late final bool isDesktop; + + late final FocusNode _noteFocusNode; + late final TextEditingController noteController; + + Future _attemptSend() async { + final wallet = ref.read(pWallets).getWallet(walletId); + final coin = wallet.info.coin; + + final sendProgressController = ProgressAndSuccessController(); + + unawaited( + showDialog( + context: context, + useSafeArea: false, + barrierDismissible: false, + builder: (context) { + return SendingTransactionDialog( + coin: coin, + controller: sendProgressController, + ); + }, + ), + ); + + final time = Future.delayed( + const Duration( + milliseconds: 2500, + ), + ); + + final List txids = []; + Future txDataFuture; + + final note = noteController.text; + + try { + txDataFuture = wallet.confirmSend(txData: widget.txData); + + // await futures in parallel + final futureResults = await Future.wait([ + txDataFuture, + time, + ]); + + final txData = (futureResults.first as TxData); + + sendProgressController.triggerSuccess?.call(); + + // await futures in parallel + await Future.wait([ + // wait for animation + Future.delayed(const Duration(seconds: 5)), + + // associated name data for reg tx + ref.read(secureStoreProvider).write( + key: nameSaltKeyBuilder(txData.txid!, walletId), + value: encodeNameSaltData( + txData.opNameState!.name, + txData.opNameState!.saltHex, + txData.opNameState!.value, + ), + ), + ]); + + txids.add(txData.txid!); + ref.refresh(desktopUseUTXOs); + + // save note + for (final txid in txids) { + await ref.read(mainDBProvider).putTransactionNote( + TransactionNote( + walletId: walletId, + txid: txid, + value: note, + ), + ); + } + + unawaited(wallet.refresh()); + + if (mounted) { + // pop sending dialog + Navigator.of(context, rootNavigator: Util.isDesktop).pop(); + // pop confirm send view + Navigator.of(context, rootNavigator: Util.isDesktop).pop(); + } + } catch (e, s) { + const niceError = "Broadcast name transaction failed"; + + Logging.instance.e(niceError, error: e, stackTrace: s); + + if (mounted) { + // pop sending dialog + Navigator.of(context, rootNavigator: Util.isDesktop).pop(); + + await showDialog( + context: context, + useSafeArea: false, + barrierDismissible: true, + builder: (context) { + if (isDesktop) { + return DesktopDialog( + maxWidth: 450, + child: Padding( + padding: const EdgeInsets.all(32), + child: Column( + mainAxisSize: MainAxisSize.min, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + niceError, + style: STextStyles.desktopH3(context), + ), + const SizedBox( + height: 24, + ), + Flexible( + child: SingleChildScrollView( + child: SelectableText( + e.toString(), + style: STextStyles.smallMed14(context), + ), + ), + ), + const SizedBox( + height: 56, + ), + Row( + children: [ + const Spacer(), + Expanded( + child: PrimaryButton( + buttonHeight: ButtonHeight.l, + label: "Ok", + onPressed: Navigator.of(context).pop, + ), + ), + ], + ), + ], + ), + ), + ); + } else { + return StackDialog( + title: niceError, + message: e.toString(), + rightButton: TextButton( + style: Theme.of(context) + .extension()! + .getSecondaryEnabledButtonStyle(context), + child: Text( + "Ok", + style: STextStyles.button(context).copyWith( + color: Theme.of(context) + .extension()! + .accentColorDark, + ), + ), + onPressed: () { + Navigator.of(context).pop(); + }, + ), + ); + } + }, + ); + } + } + } + + @override + void initState() { + isDesktop = Util.isDesktop; + walletId = widget.walletId; + _noteFocusNode = FocusNode(); + noteController = TextEditingController(); + noteController.text = widget.txData.note ?? ""; + + super.initState(); + } + + @override + void dispose() { + noteController.dispose(); + + _noteFocusNode.dispose(); + super.dispose(); + } + + @override + Widget build(BuildContext context) { + final coin = ref.watch(pWalletCoin(walletId)); + + final unit = coin.ticker; + + final fee = widget.txData.fee; + final amountWithoutChange = widget.txData.amountWithoutChange!; + + return ConditionalParent( + condition: !isDesktop, + builder: (child) => Background( + child: Scaffold( + backgroundColor: + Theme.of(context).extension()!.background, + appBar: AppBar( + backgroundColor: + Theme.of(context).extension()!.background, + leading: AppBarBackButton( + onPressed: () async { + // if (FocusScope.of(context).hasFocus) { + // FocusScope.of(context).unfocus(); + // await Future.delayed(Duration(milliseconds: 50)); + // } + Navigator.of(context).pop(); + }, + ), + title: Text( + "Confirm transaction", + style: STextStyles.navBarTitle(context), + ), + ), + body: LayoutBuilder( + builder: (builderContext, constraints) { + return Padding( + padding: const EdgeInsets.only( + left: 12, + top: 12, + right: 12, + ), + child: SingleChildScrollView( + child: ConstrainedBox( + constraints: BoxConstraints( + minHeight: constraints.maxHeight - 24, + ), + child: IntrinsicHeight( + child: Padding( + padding: const EdgeInsets.all(4), + child: child, + ), + ), + ), + ), + ); + }, + ), + ), + ), + child: ConditionalParent( + condition: isDesktop, + builder: (child) => Column( + crossAxisAlignment: CrossAxisAlignment.stretch, + mainAxisSize: MainAxisSize.min, + children: [ + Row( + children: [ + AppBarBackButton( + size: 40, + iconSize: 24, + onPressed: () => Navigator.of( + context, + rootNavigator: true, + ).pop(), + ), + Text( + "Confirm transaction", + style: STextStyles.desktopH3(context), + ), + ], + ), + Flexible( + child: SingleChildScrollView( + child: child, + ), + ), + ], + ), + child: Column( + crossAxisAlignment: CrossAxisAlignment.stretch, + mainAxisSize: isDesktop ? MainAxisSize.min : MainAxisSize.max, + children: [ + if (!isDesktop) + Column( + crossAxisAlignment: CrossAxisAlignment.stretch, + children: [ + Text( + "Confirm Name transaction", + style: STextStyles.pageTitleH1(context), + ), + const SizedBox( + height: 12, + ), + RoundedWhiteContainer( + child: Column( + crossAxisAlignment: CrossAxisAlignment.stretch, + children: [ + Text( + "Name", + style: STextStyles.smallMed12(context), + ), + const SizedBox( + height: 4, + ), + Text( + widget.txData.opNameState!.name, + style: STextStyles.itemSubtitle12(context), + ), + ], + ), + ), + const SizedBox( + height: 12, + ), + RoundedWhiteContainer( + child: Column( + crossAxisAlignment: CrossAxisAlignment.stretch, + children: [ + Text( + "Value", + style: STextStyles.smallMed12(context), + ), + const SizedBox( + height: 4, + ), + Text( + widget.txData.opNameState!.value, + style: STextStyles.itemSubtitle12(context), + ), + ], + ), + ), + const SizedBox( + height: 12, + ), + RoundedWhiteContainer( + child: Column( + crossAxisAlignment: CrossAxisAlignment.stretch, + children: [ + Text( + "Recipient", + style: STextStyles.smallMed12(context), + ), + const SizedBox( + height: 4, + ), + Text( + widget.txData.recipients!.first.address, + style: STextStyles.itemSubtitle12(context), + ), + ], + ), + ), + const SizedBox( + height: 12, + ), + RoundedWhiteContainer( + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text( + "Amount", + style: STextStyles.smallMed12(context), + ), + SelectableText( + ref.watch(pAmountFormatter(coin)).format( + amountWithoutChange, + ), + style: STextStyles.itemSubtitle12(context), + textAlign: TextAlign.right, + ), + ], + ), + ), + const SizedBox( + height: 12, + ), + RoundedWhiteContainer( + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text( + "Transaction fee", + style: STextStyles.smallMed12(context), + ), + SelectableText( + ref.watch(pAmountFormatter(coin)).format(fee!), + style: STextStyles.itemSubtitle12(context), + textAlign: TextAlign.right, + ), + ], + ), + ), + if (widget.txData.fee != null && widget.txData.vSize != null) + const SizedBox( + height: 12, + ), + if (widget.txData.fee != null && widget.txData.vSize != null) + RoundedWhiteContainer( + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text( + "sats/vByte", + style: STextStyles.smallMed12(context), + ), + const SizedBox( + height: 4, + ), + SelectableText( + "~${fee.raw.toInt() ~/ widget.txData.vSize!}", + style: STextStyles.itemSubtitle12(context), + ), + ], + ), + ), + if (widget.txData.note!.isNotEmpty) + const SizedBox( + height: 12, + ), + if (widget.txData.note!.isNotEmpty) + RoundedWhiteContainer( + child: Column( + crossAxisAlignment: CrossAxisAlignment.stretch, + children: [ + Text( + "Note", + style: STextStyles.smallMed12(context), + ), + const SizedBox( + height: 4, + ), + SelectableText( + widget.txData.note!, + style: STextStyles.itemSubtitle12(context), + ), + ], + ), + ), + ], + ), + if (isDesktop) + Padding( + padding: const EdgeInsets.only( + top: 16, + left: 32, + right: 32, + bottom: 50, + ), + child: RoundedWhiteContainer( + padding: const EdgeInsets.all(0), + borderColor: + Theme.of(context).extension()!.background, + child: Column( + mainAxisSize: MainAxisSize.min, + crossAxisAlignment: CrossAxisAlignment.stretch, + children: [ + Container( + decoration: BoxDecoration( + color: Theme.of(context) + .extension()! + .background, + borderRadius: BorderRadius.only( + topLeft: Radius.circular( + Constants.size.circularBorderRadius, + ), + topRight: Radius.circular( + Constants.size.circularBorderRadius, + ), + ), + ), + child: Padding( + padding: const EdgeInsets.symmetric( + horizontal: 12, + vertical: 22, + ), + child: Row( + children: [ + SvgPicture.file( + File( + ref.watch( + themeProvider.select( + (value) => value.assets.send, + ), + ), + ), + width: 32, + height: 32, + ), + const SizedBox( + width: 16, + ), + Text( + "Send $unit Name transaction", + style: STextStyles.desktopTextMedium(context), + ), + ], + ), + ), + ), + Padding( + padding: const EdgeInsets.all(12), + child: Column( + mainAxisSize: MainAxisSize.min, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + "Name", + style: STextStyles.desktopTextExtraExtraSmall( + context, + ), + ), + const SizedBox( + height: 2, + ), + SelectableText( + widget.txData.opNameState!.name, + style: STextStyles.desktopTextExtraExtraSmall( + context, + ).copyWith( + color: Theme.of(context) + .extension()! + .textDark, + ), + ), + ], + ), + ), + Container( + height: 1, + color: Theme.of(context) + .extension()! + .background, + ), + Padding( + padding: const EdgeInsets.all(12), + child: Column( + mainAxisSize: MainAxisSize.min, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + "Value", + style: STextStyles.desktopTextExtraExtraSmall( + context, + ), + ), + const SizedBox( + height: 2, + ), + SelectableText( + widget.txData.opNameState!.value, + style: STextStyles.desktopTextExtraExtraSmall( + context, + ).copyWith( + color: Theme.of(context) + .extension()! + .textDark, + ), + ), + ], + ), + ), + ], + ), + ), + ), + if (isDesktop) + Padding( + padding: const EdgeInsets.only( + left: 32, + right: 32, + ), + child: Column( + mainAxisSize: MainAxisSize.min, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + SelectableText( + "Note (optional)", + style: + STextStyles.desktopTextExtraSmall(context).copyWith( + color: Theme.of(context) + .extension()! + .textFieldActiveSearchIconRight, + ), + textAlign: TextAlign.left, + ), + const SizedBox( + height: 10, + ), + ClipRRect( + borderRadius: BorderRadius.circular( + Constants.size.circularBorderRadius, + ), + child: TextField( + minLines: 1, + maxLines: 5, + autocorrect: isDesktop ? false : true, + enableSuggestions: isDesktop ? false : true, + controller: noteController, + focusNode: _noteFocusNode, + style: + STextStyles.desktopTextExtraSmall(context).copyWith( + color: Theme.of(context) + .extension()! + .textFieldActiveText, + height: 1.8, + ), + onChanged: (_) => setState(() {}), + decoration: standardInputDecoration( + "Type something...", + _noteFocusNode, + context, + desktopMed: true, + ).copyWith( + contentPadding: const EdgeInsets.only( + left: 16, + top: 11, + bottom: 12, + right: 5, + ), + suffixIcon: noteController.text.isNotEmpty + ? Padding( + padding: const EdgeInsets.only(right: 0), + child: UnconstrainedBox( + child: Row( + children: [ + TextFieldIconButton( + child: const XIcon(), + onTap: () async { + setState( + () => noteController.text = "", + ); + }, + ), + ], + ), + ), + ) + : null, + ), + ), + ), + const SizedBox( + height: 20, + ), + ], + ), + ), + + if (isDesktop) + Padding( + padding: const EdgeInsets.only( + top: 16, + left: 32, + ), + child: Text( + "Amount", + style: STextStyles.desktopTextExtraExtraSmall(context), + ), + ), + if (isDesktop) + Padding( + padding: const EdgeInsets.only( + top: 10, + left: 32, + right: 32, + ), + child: RoundedContainer( + padding: const EdgeInsets.symmetric( + horizontal: 16, + vertical: 18, + ), + color: Theme.of(context) + .extension()! + .textFieldDefaultBG, + child: Builder( + builder: (context) { + final externalCalls = ref.watch( + prefsChangeNotifierProvider.select( + (value) => value.externalCalls, + ), + ); + String fiatAmount = "N/A"; + + if (externalCalls) { + final price = ref + .read( + priceAnd24hChangeNotifierProvider, + ) + .getPrice(coin) + .item1; + if (price > Decimal.zero) { + fiatAmount = (amountWithoutChange.decimal * price) + .toAmount(fractionDigits: 2) + .fiatString( + locale: ref + .read( + localeServiceChangeNotifierProvider, + ) + .locale, + ); + } + } + + return Row( + children: [ + SelectableText( + ref.watch(pAmountFormatter(coin)).format( + amountWithoutChange, + ), + style: STextStyles.itemSubtitle( + context, + ), + ), + if (externalCalls) + Text( + " | ", + style: STextStyles.itemSubtitle( + context, + ), + ), + if (externalCalls) + SelectableText( + "~$fiatAmount ${ref.watch( + prefsChangeNotifierProvider.select( + (value) => value.currency, + ), + )}", + style: STextStyles.itemSubtitle( + context, + ), + ), + ], + ); + }, + ), + ), + ), + if (isDesktop) + Padding( + padding: const EdgeInsets.only( + top: 16, + left: 32, + ), + child: Text( + "Recipient", + style: STextStyles.desktopTextExtraExtraSmall(context), + ), + ), + if (isDesktop) + Padding( + padding: const EdgeInsets.only( + top: 10, + left: 32, + right: 32, + ), + child: RoundedContainer( + padding: const EdgeInsets.symmetric( + horizontal: 16, + vertical: 18, + ), + color: Theme.of(context) + .extension()! + .textFieldDefaultBG, + child: SelectableText( + widget.txData.recipients!.first.address, + style: STextStyles.itemSubtitle(context), + ), + ), + ), + // todo amoutn here + if (isDesktop) + Padding( + padding: const EdgeInsets.only( + top: 16, + left: 32, + ), + child: Text( + "Transaction fee", + style: STextStyles.desktopTextExtraExtraSmall(context), + ), + ), + if (isDesktop) + Padding( + padding: const EdgeInsets.only( + top: 10, + left: 32, + right: 32, + ), + child: RoundedContainer( + padding: const EdgeInsets.symmetric( + horizontal: 16, + vertical: 18, + ), + color: Theme.of(context) + .extension()! + .textFieldDefaultBG, + child: SelectableText( + ref.watch(pAmountFormatter(coin)).format(fee!), + style: STextStyles.itemSubtitle(context), + ), + ), + ), + if (isDesktop && + widget.txData.fee != null && + widget.txData.vSize != null) + Padding( + padding: const EdgeInsets.only( + top: 16, + left: 32, + ), + child: Text( + "sats/vByte", + style: STextStyles.desktopTextExtraExtraSmall(context), + ), + ), + if (isDesktop && + widget.txData.fee != null && + widget.txData.vSize != null) + Padding( + padding: const EdgeInsets.only( + top: 10, + left: 32, + right: 32, + ), + child: RoundedContainer( + padding: const EdgeInsets.symmetric( + horizontal: 16, + vertical: 18, + ), + color: Theme.of(context) + .extension()! + .textFieldDefaultBG, + child: SelectableText( + "~${fee!.raw.toInt() ~/ widget.txData.vSize!}", + style: STextStyles.itemSubtitle(context), + ), + ), + ), + if (!isDesktop) const Spacer(), + SizedBox( + height: isDesktop ? 23 : 12, + ), + Padding( + padding: isDesktop + ? const EdgeInsets.symmetric( + horizontal: 32, + ) + : const EdgeInsets.all(0), + child: RoundedContainer( + padding: isDesktop + ? const EdgeInsets.symmetric( + horizontal: 16, + vertical: 18, + ) + : const EdgeInsets.all(12), + color: Theme.of(context) + .extension()! + .snackBarBackSuccess, + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text( + isDesktop ? "Total amount to send" : "Total amount", + style: isDesktop + ? STextStyles.desktopTextExtraExtraSmall(context) + .copyWith( + color: Theme.of(context) + .extension()! + .textConfirmTotalAmount, + ) + : STextStyles.titleBold12(context).copyWith( + color: Theme.of(context) + .extension()! + .textConfirmTotalAmount, + ), + ), + SelectableText( + ref + .watch(pAmountFormatter(coin)) + .format(amountWithoutChange + fee!), + style: isDesktop + ? STextStyles.desktopTextExtraExtraSmall(context) + .copyWith( + color: Theme.of(context) + .extension()! + .textConfirmTotalAmount, + ) + : STextStyles.itemSubtitle12(context).copyWith( + color: Theme.of(context) + .extension()! + .textConfirmTotalAmount, + ), + textAlign: TextAlign.right, + ), + ], + ), + ), + ), + SizedBox( + height: isDesktop ? 28 : 16, + ), + Padding( + padding: isDesktop + ? const EdgeInsets.symmetric( + horizontal: 32, + ) + : const EdgeInsets.all(0), + child: PrimaryButton( + label: "Send", + buttonHeight: isDesktop ? ButtonHeight.l : null, + onPressed: () async { + final dynamic unlocked; + + if (isDesktop) { + unlocked = await showDialog( + context: context, + builder: (context) => DesktopDialog( + maxWidth: 580, + maxHeight: double.infinity, + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + const Row( + mainAxisAlignment: MainAxisAlignment.end, + children: [ + DesktopDialogCloseButton(), + ], + ), + Padding( + padding: const EdgeInsets.only( + left: 32, + right: 32, + bottom: 32, + ), + child: DesktopAuthSend( + coin: coin, + ), + ), + ], + ), + ), + ); + } else { + unlocked = await Navigator.push( + context, + RouteGenerator.getRoute( + shouldUseMaterialRoute: + RouteGenerator.useMaterialPageRoute, + builder: (_) => const LockscreenView( + showBackButton: true, + popOnSuccess: true, + routeOnSuccessArguments: true, + routeOnSuccess: "", + biometricsCancelButtonString: "CANCEL", + biometricsLocalizedReason: + "Authenticate to send transaction", + biometricsAuthenticationTitle: "Confirm Transaction", + ), + settings: + const RouteSettings(name: "/confirmsendlockscreen"), + ), + ); + } + + if (mounted) { + if (unlocked == true) { + unawaited(_attemptSend()); + } else { + if (context.mounted) { + unawaited( + showFloatingFlushBar( + type: FlushBarType.warning, + message: Util.isDesktop + ? "Invalid passphrase" + : "Invalid PIN", + context: context, + ), + ); + } + } + } + }, + ), + ), + if (isDesktop) + const SizedBox( + height: 32, + ), + ], + ), + ), + ); + } +} diff --git a/lib/pages/namecoin_names/namecoin_names_home_view.dart b/lib/pages/namecoin_names/namecoin_names_home_view.dart new file mode 100644 index 000000000..531d543a3 --- /dev/null +++ b/lib/pages/namecoin_names/namecoin_names_home_view.dart @@ -0,0 +1,350 @@ +import 'dart:async'; + +import 'package:decimal/decimal.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:flutter_svg/svg.dart'; +import 'package:isar/isar.dart'; +import 'package:namecoin/namecoin.dart'; + +import '../../models/isar/models/blockchain_data/utxo.dart'; +import '../../providers/db/main_db_provider.dart'; +import '../../providers/global/wallets_provider.dart'; +import '../../themes/stack_colors.dart'; +import '../../utilities/amount/amount.dart'; +import '../../utilities/assets.dart'; +import '../../utilities/enums/fee_rate_type_enum.dart'; +import '../../utilities/logger.dart'; +import '../../utilities/show_loading.dart'; +import '../../utilities/text_styles.dart'; +import '../../utilities/util.dart'; +import '../../wallets/models/name_op_state.dart'; +import '../../wallets/models/tx_data.dart'; +import '../../wallets/wallet/impl/namecoin_wallet.dart'; +import '../../widgets/conditional_parent.dart'; +import '../../widgets/custom_buttons/app_bar_icon_button.dart'; +import '../../widgets/desktop/desktop_app_bar.dart'; +import '../../widgets/desktop/desktop_dialog.dart'; +import '../../widgets/desktop/desktop_scaffold.dart'; +import '../../widgets/desktop/primary_button.dart'; +import '../../widgets/desktop/secondary_button.dart'; +import '../../widgets/rounded_white_container.dart'; +import '../../widgets/stack_dialog.dart'; +import 'confirm_name_transaction_view.dart'; + +class NamecoinNamesHomeView extends ConsumerStatefulWidget { + const NamecoinNamesHomeView({ + super.key, + required this.walletId, + }); + + final String walletId; + + static const String routeName = "/namecoinNamesHomeView"; + + @override + ConsumerState createState() => + _NamecoinNamesHomeViewState(); +} + +class _NamecoinNamesHomeViewState extends ConsumerState { + String? lastAvailableName; + + NamecoinWallet get _wallet => + ref.read(pWallets).getWallet(widget.walletId) as NamecoinWallet; + + Future _preRegister() async { + final data = scriptNameNew(lastAvailableName!); + + // TODO: fill out properly + TxData txData = TxData( + opNameState: NameOpState( + name: lastAvailableName!, + saltHex: data.$2, + commitment: data.$3, + value: "test", // TODO: get from user for automatic reg later + nameScriptHex: data.$1, + type: OpName.nameNew, + ), + feeRateType: FeeRateType.slow, // TODO: make configurable? + recipients: [ + ( + address: (await _wallet.getCurrentReceivingAddress())!.value, + isChange: false, + amount: Amount.fromDecimal( + Decimal.parse("0.015"), + fractionDigits: _wallet.cryptoCurrency.fractionDigits, + ), + ), + ], + ); + + txData = await _wallet.prepareNameSend(txData: txData); + + Logging.instance.f("SALTY: ${txData.opNameState!.saltHex}"); + + if (mounted) { + if (Util.isDesktop) { + await showDialog( + context: context, + builder: (context) => DesktopDialog( + maxHeight: MediaQuery.of(context).size.height - 64, + maxWidth: 580, + child: ConfirmNameTransactionView( + txData: txData, + walletId: _wallet.walletId, + ), + ), + ); + } else { + await Navigator.of(context).pushNamed( + ConfirmNameTransactionView.routeName, + arguments: (txData, _wallet.walletId), + ); + } + } + } + + @override + Widget build(BuildContext context) { + debugPrint("BUILD: $runtimeType"); + final isDesktop = Util.isDesktop; + + return MasterScaffold( + isDesktop: isDesktop, + appBar: isDesktop + ? DesktopAppBar( + isCompactHeight: true, + background: Theme.of(context).extension()!.popupBG, + leading: Row( + children: [ + Padding( + padding: const EdgeInsets.only( + left: 24, + right: 20, + ), + child: AppBarIconButton( + size: 32, + color: Theme.of(context) + .extension()! + .textFieldDefaultBG, + shadows: const [], + icon: SvgPicture.asset( + Assets.svg.arrowLeft, + width: 18, + height: 18, + color: Theme.of(context) + .extension()! + .topNavIconPrimary, + ), + onPressed: Navigator.of(context).pop, + ), + ), + SvgPicture.asset( + Assets.svg.file, + width: 32, + height: 32, + color: Theme.of(context).extension()!.textDark, + ), + const SizedBox( + width: 10, + ), + Text( + "Names", + style: STextStyles.desktopH3(context), + ), + ], + ), + ) + : AppBar( + leading: AppBarBackButton( + onPressed: () { + Navigator.of(context).pop(); + }, + ), + titleSpacing: 0, + title: Text( + "Names", + style: STextStyles.navBarTitle(context), + overflow: TextOverflow.ellipsis, + ), + ), + body: ConditionalParent( + condition: !isDesktop, + builder: (child) => SafeArea( + child: Padding( + padding: const EdgeInsets.all(16), + child: child, + ), + ), + child: Column( + crossAxisAlignment: + isDesktop ? CrossAxisAlignment.start : CrossAxisAlignment.center, + children: [ + LookupNameForm( + walletId: widget.walletId, + onNameAvailable: (name) { + if (name != lastAvailableName) { + setState(() { + lastAvailableName = name; + }); + } + }, + ), + if (lastAvailableName != null) + PrimaryButton( + label: "Register $lastAvailableName", + onPressed: _preRegister, + ), + const SizedBox( + height: 32, + ), + Expanded( + child: StreamBuilder( + stream: ref.watch( + mainDBProvider.select( + (s) => s.isar.utxos + .where() + .walletIdEqualTo(widget.walletId) + .filter() + .otherDataIsNotNull() + .watch(fireImmediately: true), + ), + ), + builder: (context, snapshot) { + List list = []; + if (snapshot.hasData) { + list = snapshot.data!; + } + + return ListView.separated( + itemCount: list.length, + itemBuilder: (context, index) => RoundedWhiteContainer( + child: Text(list[index].otherData!), + ), + separatorBuilder: (context, index) => const SizedBox( + height: 10, + ), + ); + }, + ), + ), + ], + ), + ), + ); + } +} + +class LookupNameForm extends ConsumerStatefulWidget { + const LookupNameForm({ + super.key, + required this.walletId, + this.onNameAvailable, + }); + + final String walletId; + + final void Function(String? name)? onNameAvailable; + + @override + ConsumerState createState() => _LookupNameFormState(); +} + +class _LookupNameFormState extends ConsumerState { + final nameController = TextEditingController(); + final nameFieldFocus = FocusNode(); + + NamecoinWallet get _wallet => + ref.read(pWallets).getWallet(widget.walletId) as NamecoinWallet; + + bool _lookupLock = false; + Future _lookup() async { + if (_lookupLock) return; + _lookupLock = true; + try { + widget.onNameAvailable?.call(null); + final result = await showLoading( + whileFuture: _wallet.lookupName(nameController.text), + context: context, + message: "Looking up ${nameController.text}", + onException: (e) => throw e, + rootNavigator: Util.isDesktop, + delay: const Duration(seconds: 2), + ); + + if (result?.available == true) { + widget.onNameAvailable?.call(nameController.text); + } + + Logging.instance.i("LOOKUP RESULT: $result"); + } catch (e, s) { + widget.onNameAvailable?.call(null); + Logging.instance.e("_lookup failed", error: e, stackTrace: s); + + if (mounted) { + await showDialog( + context: context, + builder: (_) => StackOkDialog( + title: "Name lookup failed", + desktopPopRootNavigator: Util.isDesktop, + maxWidth: Util.isDesktop ? 600 : null, + ), + ); + } + } finally { + _lookupLock = false; + } + } + + @override + void initState() { + super.initState(); + WidgetsBinding.instance.addPostFrameCallback((_) { + if (mounted) { + nameFieldFocus.requestFocus(); + } + }); + } + + @override + void dispose() { + nameController.dispose(); + nameFieldFocus.dispose(); + super.dispose(); + } + + @override + Widget build(BuildContext context) { + return Column( + crossAxisAlignment: + Util.isDesktop ? CrossAxisAlignment.start : CrossAxisAlignment.center, + children: [ + TextField( + textInputAction: TextInputAction.search, + focusNode: nameFieldFocus, + controller: nameController, + onSubmitted: (_) { + if (nameController.text.isNotEmpty) { + _lookup(); + } + }, + onChanged: (_) { + // trigger look up button enabled/disabled state change + setState(() {}); + }, + ), + const SizedBox( + height: 20, + ), + SecondaryButton( + label: "Look up name", + enabled: nameController.text.isNotEmpty, + width: 160, + buttonHeight: ButtonHeight.l, + onPressed: _lookup, + ), + ], + ); + } +} diff --git a/lib/pages/wallet_view/wallet_view.dart b/lib/pages/wallet_view/wallet_view.dart index d94e25d7a..a4a846dcf 100644 --- a/lib/pages/wallet_view/wallet_view.dart +++ b/lib/pages/wallet_view/wallet_view.dart @@ -52,6 +52,7 @@ import '../../wallets/crypto_currency/intermediate/frost_currency.dart'; import '../../wallets/isar/providers/wallet_info_provider.dart'; import '../../wallets/wallet/impl/bitcoin_frost_wallet.dart'; import '../../wallets/wallet/impl/firo_wallet.dart'; +import '../../wallets/wallet/impl/namecoin_wallet.dart'; import '../../wallets/wallet/intermediate/lib_monero_wallet.dart'; import '../../wallets/wallet/wallet_mixin_interfaces/cash_fusion_interface.dart'; import '../../wallets/wallet/wallet_mixin_interfaces/coin_control_interface.dart'; @@ -87,6 +88,7 @@ import '../churning/churning_view.dart'; import '../coin_control/coin_control_view.dart'; import '../exchange_view/wallet_initiated_exchange_view.dart'; import '../monkey/monkey_view.dart'; +import '../namecoin_names/namecoin_names_home_view.dart'; import '../notification_views/notifications_view.dart'; import '../ordinals/ordinals_view.dart'; import '../paynym/paynym_claim_view.dart'; @@ -1172,6 +1174,17 @@ class _WalletViewState extends ConsumerState { ); }, ), + if (wallet is NamecoinWallet) + WalletNavigationBarItemData( + label: "Names", + icon: const CoinControlNavIcon(), + onTap: () { + Navigator.of(context).pushNamed( + NamecoinNamesHomeView.routeName, + arguments: widget.walletId, + ); + }, + ), if (!viewOnly && wallet is PaynymInterface) WalletNavigationBarItemData( label: "PayNym", diff --git a/lib/pages_desktop_specific/my_stack_view/wallet_view/sub_widgets/desktop_wallet_features.dart b/lib/pages_desktop_specific/my_stack_view/wallet_view/sub_widgets/desktop_wallet_features.dart index 7993ee0a6..74512e256 100644 --- a/lib/pages_desktop_specific/my_stack_view/wallet_view/sub_widgets/desktop_wallet_features.dart +++ b/lib/pages_desktop_specific/my_stack_view/wallet_view/sub_widgets/desktop_wallet_features.dart @@ -19,6 +19,7 @@ import 'package:flutter_svg/svg.dart'; import '../../../../app_config.dart'; import '../../../../notifications/show_flush_bar.dart'; import '../../../../pages/monkey/monkey_view.dart'; +import '../../../../pages/namecoin_names/namecoin_names_home_view.dart'; import '../../../../pages/paynym/paynym_claim_view.dart'; import '../../../../pages/paynym/paynym_home_view.dart'; import '../../../../providers/desktop/current_desktop_menu_item.dart'; @@ -99,6 +100,7 @@ class _DesktopWalletFeaturesState extends ConsumerState { onMonkeyPressed: _onMonkeyPressed, onFusionPressed: _onFusionPressed, onChurnPressed: _onChurnPressed, + onNamesPressed: _onNamesPressed, ), ); } @@ -380,6 +382,15 @@ class _DesktopWalletFeaturesState extends ConsumerState { ); } + void _onNamesPressed() { + Navigator.of(context, rootNavigator: true).pop(); + + Navigator.of(context).pushNamed( + NamecoinNamesHomeView.routeName, + arguments: widget.walletId, + ); + } + @override Widget build(BuildContext context) { final wallet = ref.watch(pWallets).getWallet(widget.walletId); diff --git a/lib/pages_desktop_specific/my_stack_view/wallet_view/sub_widgets/more_features/more_features_dialog.dart b/lib/pages_desktop_specific/my_stack_view/wallet_view/sub_widgets/more_features/more_features_dialog.dart index eb2746558..72a5d0778 100644 --- a/lib/pages_desktop_specific/my_stack_view/wallet_view/sub_widgets/more_features/more_features_dialog.dart +++ b/lib/pages_desktop_specific/my_stack_view/wallet_view/sub_widgets/more_features/more_features_dialog.dart @@ -31,6 +31,7 @@ import '../../../../../wallets/crypto_currency/crypto_currency.dart'; import '../../../../../wallets/isar/models/wallet_info.dart'; import '../../../../../wallets/isar/providers/wallet_info_provider.dart'; import '../../../../../wallets/wallet/impl/firo_wallet.dart'; +import '../../../../../wallets/wallet/impl/namecoin_wallet.dart'; import '../../../../../wallets/wallet/intermediate/lib_monero_wallet.dart'; import '../../../../../wallets/wallet/wallet_mixin_interfaces/cash_fusion_interface.dart'; import '../../../../../wallets/wallet/wallet_mixin_interfaces/coin_control_interface.dart'; @@ -62,6 +63,7 @@ class MoreFeaturesDialog extends ConsumerStatefulWidget { required this.onMonkeyPressed, required this.onFusionPressed, required this.onChurnPressed, + required this.onNamesPressed, }); final String walletId; @@ -75,6 +77,7 @@ class MoreFeaturesDialog extends ConsumerStatefulWidget { final VoidCallback? onMonkeyPressed; final VoidCallback? onFusionPressed; final VoidCallback? onChurnPressed; + final VoidCallback? onNamesPressed; @override ConsumerState createState() => _MoreFeaturesDialogState(); @@ -474,6 +477,13 @@ class _MoreFeaturesDialogState extends ConsumerState { iconAsset: Assets.svg.churn, onPressed: () async => widget.onChurnPressed?.call(), ), + if (wallet is NamecoinWallet) + _MoreFeaturesItem( + label: "Names", + detail: "Namecoin DNS", + iconAsset: Assets.svg.file, + onPressed: () async => widget.onNamesPressed?.call(), + ), if (wallet is SparkInterface && !isViewOnly) _MoreFeaturesClearSparkCacheItem( cryptoCurrency: wallet.cryptoCurrency, diff --git a/lib/route_generator.dart b/lib/route_generator.dart index 71a3b890e..1a3581db1 100644 --- a/lib/route_generator.dart +++ b/lib/route_generator.dart @@ -72,6 +72,8 @@ import 'pages/home_view/home_view.dart'; import 'pages/intro_view.dart'; import 'pages/manage_favorites_view/manage_favorites_view.dart'; import 'pages/monkey/monkey_view.dart'; +import 'pages/namecoin_names/confirm_name_transaction_view.dart'; +import 'pages/namecoin_names/namecoin_names_home_view.dart'; import 'pages/notification_views/notifications_view.dart'; import 'pages/ordinals/ordinal_details_view.dart'; import 'pages/ordinals/ordinals_filter_view.dart'; @@ -772,6 +774,20 @@ class RouteGenerator { } return _routeError("${settings.name} invalid args: ${args.toString()}"); + case NamecoinNamesHomeView.routeName: + if (args is String) { + return getRoute( + shouldUseMaterialRoute: useMaterialPageRoute, + builder: (_) => NamecoinNamesHomeView( + walletId: args, + ), + settings: RouteSettings( + name: settings.name, + ), + ); + } + return _routeError("${settings.name} invalid args: ${args.toString()}"); + case FusionProgressView.routeName: if (args is String) { return getRoute( @@ -1843,6 +1859,21 @@ class RouteGenerator { } return _routeError("${settings.name} invalid args: ${args.toString()}"); + case ConfirmNameTransactionView.routeName: + if (args is (TxData, String)) { + return getRoute( + shouldUseMaterialRoute: useMaterialPageRoute, + builder: (_) => ConfirmNameTransactionView( + txData: args.$1, + walletId: args.$2, + ), + settings: RouteSettings( + name: settings.name, + ), + ); + } + return _routeError("${settings.name} invalid args: ${args.toString()}"); + case WalletInitiatedExchangeView.routeName: if (args is Tuple2) { return getRoute( diff --git a/lib/wallets/models/name_op_state.dart b/lib/wallets/models/name_op_state.dart new file mode 100644 index 000000000..98ca00e2d --- /dev/null +++ b/lib/wallets/models/name_op_state.dart @@ -0,0 +1,52 @@ +import 'package:namecoin/namecoin.dart'; + +class NameOpState { + final String name; + + final OpName type; + + final String saltHex; + final String commitment; + final String value; + final String nameScriptHex; + + NameOpState({ + required this.name, + required this.type, + required this.saltHex, + required this.commitment, + required this.value, + required this.nameScriptHex, + }); + + NameOpState copyWith({ + String? walletId, + String? name, + String? txid, + OpName? type, + String? saltHex, + String? commitment, + String? value, + String? nameScriptHex, + }) { + return NameOpState( + name: name ?? this.name, + type: type ?? this.type, + saltHex: saltHex ?? this.saltHex, + commitment: commitment ?? this.commitment, + value: value ?? this.value, + nameScriptHex: nameScriptHex ?? this.nameScriptHex, + ); + } + + @override + String toString() { + return "NameOpState(" + "name: $name, " + "type: ${type.name}, " + "saltHex: $saltHex, " + "commitment: $commitment, " + "value: $value, " + "nameScriptHex: $nameScriptHex)"; + } +} diff --git a/lib/wallets/models/tx_data.dart b/lib/wallets/models/tx_data.dart index 652a5605f..21fa206c9 100644 --- a/lib/wallets/models/tx_data.dart +++ b/lib/wallets/models/tx_data.dart @@ -8,6 +8,7 @@ import '../../models/paynym/paynym_account_lite.dart'; import '../../utilities/amount/amount.dart'; import '../../utilities/enums/fee_rate_type_enum.dart'; import '../isar/models/spark_coin.dart'; +import 'name_op_state.dart'; typedef TxRecipient = ({String address, Amount amount, bool isChange}); @@ -77,6 +78,9 @@ class TxData { final bool ignoreCachedBalanceChecks; + // Namecoin Name related + final NameOpState? opNameState; + TxData({ this.feeRateType, this.feeRateAmount, @@ -113,6 +117,7 @@ class TxData { this.usedSparkCoins, this.tempTx, this.ignoreCachedBalanceChecks = false, + this.opNameState, }); Amount? get amount { @@ -239,6 +244,7 @@ class TxData { List? usedSparkCoins, TransactionV2? tempTx, bool? ignoreCachedBalanceChecks, + NameOpState? opNameState, }) { return TxData( feeRateType: feeRateType ?? this.feeRateType, @@ -277,6 +283,7 @@ class TxData { tempTx: tempTx ?? this.tempTx, ignoreCachedBalanceChecks: ignoreCachedBalanceChecks ?? this.ignoreCachedBalanceChecks, + opNameState: opNameState ?? this.opNameState, ); } @@ -316,5 +323,6 @@ class TxData { 'usedSparkCoins: $usedSparkCoins, ' 'tempTx: $tempTx, ' 'ignoreCachedBalanceChecks: $ignoreCachedBalanceChecks, ' + 'opNameState: $opNameState, ' '}'; } diff --git a/lib/wallets/wallet/impl/namecoin_wallet.dart b/lib/wallets/wallet/impl/namecoin_wallet.dart index 5eb54b33b..a911215bb 100644 --- a/lib/wallets/wallet/impl/namecoin_wallet.dart +++ b/lib/wallets/wallet/impl/namecoin_wallet.dart @@ -1,17 +1,49 @@ +import 'dart:convert'; +import 'dart:typed_data'; + +import 'package:coinlib_flutter/coinlib_flutter.dart' as coinlib; +import 'package:decimal/decimal.dart'; import 'package:isar/isar.dart'; +import 'package:namecoin/namecoin.dart'; -import '../../../models/isar/models/blockchain_data/address.dart'; -import '../../../models/isar/models/blockchain_data/transaction.dart'; import '../../../models/isar/models/blockchain_data/v2/input_v2.dart'; import '../../../models/isar/models/blockchain_data/v2/output_v2.dart'; import '../../../models/isar/models/blockchain_data/v2/transaction_v2.dart'; +import '../../../models/isar/models/isar_models.dart'; +import '../../../models/signing_data.dart'; import '../../../utilities/amount/amount.dart'; +import '../../../utilities/enums/derive_path_type_enum.dart'; +import '../../../utilities/enums/fee_rate_type_enum.dart'; +import '../../../utilities/extensions/extensions.dart'; import '../../../utilities/logger.dart'; import '../../crypto_currency/crypto_currency.dart'; import '../../crypto_currency/interfaces/electrumx_currency_interface.dart'; +import '../../models/name_op_state.dart'; +import '../../models/tx_data.dart'; import '../intermediate/bip39_hd_wallet.dart'; import '../wallet_mixin_interfaces/coin_control_interface.dart'; +import '../wallet_mixin_interfaces/cpfp_interface.dart'; import '../wallet_mixin_interfaces/electrumx_interface.dart'; +import '../wallet_mixin_interfaces/rbf_interface.dart'; + +const kNameWaitBlocks = blocksMinToRenewName; +const kNameTxVersion = 0x7100; + +const _kNameSaltSplitter = r"$$$$"; + +String nameSaltKeyBuilder(String txid, String walletId) => + "${walletId}_${txid}_nameSaltData"; + +String encodeNameSaltData(String name, String salt, String value) => + "$name$_kNameSaltSplitter$salt$_kNameSaltSplitter$value"; +({String salt, String name, String value}) decodeNameSaltData(String value) { + try { + final split = value.split(_kNameSaltSplitter); + return (salt: split[1], name: split[0], value: split[2]); + } catch (_) { + throw Exception("Bad name salt data"); + } +} class NamecoinWallet extends Bip39HDWallet @@ -50,19 +82,118 @@ class NamecoinWallet // =========================================================================== @override - Future< - ({ - bool blocked, - String? blockedReason, - String? utxoLabel, - })> checkBlockUTXO( + Future<({String? blockedReason, bool blocked, String? utxoLabel})> + checkBlockUTXO( Map jsonUTXO, String? scriptPubKeyHex, Map jsonTX, String? utxoOwnerAddress, - ) async { - // Namecoin doesn't have special outputs like tokens, ordinals, etc. - return (blocked: false, blockedReason: null, utxoLabel: null); + ) { + throw UnsupportedError( + "Namecoin does not used the checkBlockUTXO() function. " + "Due to tight integration with names, output freezing is handled directly" + " in the overridden parseUTXO() function.", + ); + } + + @override + Future parseUTXO({ + required Map jsonUTXO, + }) async { + final txn = await electrumXCachedClient.getTransaction( + txHash: jsonUTXO["tx_hash"] as String, + verbose: true, + cryptoCurrency: cryptoCurrency, + ); + + final inputs = txn["vin"] as List? ?? []; + final isCoinbase = inputs.any((e) => (e as Map?)?["coinbase"] != null); + + final vout = jsonUTXO["tx_pos"] as int; + + final outputs = txn["vout"] as List; + + String? utxoOwnerAddress; + + bool shouldBlock = false; + String? blockReason; + String? label; + String? otherDataString; + + for (final output in outputs) { + // find matching output + if (output["n"] == vout) { + utxoOwnerAddress = + output["scriptPubKey"]?["addresses"]?[0] as String? ?? + output["scriptPubKey"]?["address"] as String?; + + // check for nameOp + if (output["scriptPubKey"]?["nameOp"] != null) { + // block/freeze regardless of whether parsing the raw data succeeds + shouldBlock = true; + blockReason = "Contains name"; + + try { + final rawNameOP = (output["scriptPubKey"]["nameOp"] as Map) + .cast(); + + otherDataString = jsonEncode({ + UTXOOtherDataKeys.nameOpData: jsonEncode(rawNameOP), + }); + final nameOp = OpNameData( + rawNameOP, + jsonUTXO["height"] as int, + ); + Logging.instance.i( + "nameOp:\n$nameOp", + ); + + switch (nameOp.op) { + case OpName.nameNew: + label = "Name New"; + break; + case OpName.nameFirstUpdate: + label = "Name First Update: ${nameOp.fullname}"; + break; + case OpName.nameUpdate: + label = "Name Update: ${nameOp.fullname}"; + break; + } + } catch (e, s) { + Logging.instance.w( + "Namecoin OpNameData failed to parse" + " \"${output["scriptPubKey"]?["nameOp"]}\"", + error: e, + stackTrace: s, + ); + label = "Failed to parse raw nameOp data"; + } + } + + break; + } + } + + final utxo = UTXO( + walletId: walletId, + txid: txn["txid"] as String, + vout: vout, + value: jsonUTXO["value"] as int, + name: label ?? "", + isBlocked: shouldBlock, + blockedReason: blockReason, + isCoinbase: txn["is_coinbase"] as bool? ?? + txn["is-coinbase"] as bool? ?? + txn["iscoinbase"] as bool? ?? + isCoinbase, + blockHash: txn["blockhash"] as String?, + blockHeight: jsonUTXO["height"] as int?, + blockTime: txn["blocktime"] as int?, + address: utxoOwnerAddress, + otherData: otherDataString, + ); + + return utxo; } @override @@ -242,7 +373,7 @@ class NamecoinWallet .fold(BigInt.zero, (value, element) => value + element); TransactionType type; - final TransactionSubType subType = TransactionSubType.none; + const TransactionSubType subType = TransactionSubType.none; // At least one input was owned by this wallet. if (wasSentFromThisWallet) { @@ -290,4 +421,774 @@ class NamecoinWallet await mainDB.updateOrPutTransactionV2s(txns); } + + // namecoin names ============================================================ + + Future<({OpNameData? data, bool available})> lookupName(String name) async { + bool available = false; + + final nameScriptHash = nameIdentifierToScriptHash(name); + + final historyWithName = await electrumXClient.getHistory( + scripthash: nameScriptHash, + ); + OpNameData? opNameData; + if (historyWithName.isNotEmpty) { + final txHeight = historyWithName.last["height"] as int; + final txHash = historyWithName.last["tx_hash"] as String; + + final txMap = await electrumXCachedClient.getTransaction( + txHash: txHash, + cryptoCurrency: cryptoCurrency, + ); + + try { + opNameData = OpNameData.fromTx(txMap, txHeight); + final isExpired = opNameData.expired(await chainHeight); + + Logging.instance.i( + "Name $opNameData \nis expired = $isExpired", + ); + available = isExpired; + } catch (_) { + available = false; // probably + } + } else { + Logging.instance.i("Name \"$name\" not found."); + available = true; + } + + return (data: opNameData, available: available); + } + + /// Must be called in refresh() AFTER the wallet's UTXOs have been updated! + Future checkForNameNewOPs() async { + final currentHeight = await chainHeight; + // not ideal filtering + final utxos = await mainDB + .getUTXOs(walletId) + .filter() + .otherDataIsNotNull() + .and() + .blockHeightIsNotNull() + .and() + .blockHeightLessThan(currentHeight - kNameWaitBlocks) + .findAll(); + + for (final utxo in utxos) { + final otherData = jsonDecode(utxo.otherData!) as Map; + if (otherData[UTXOOtherDataKeys.nameOpData] != null) { + final nameOp = OpNameData( + (jsonDecode(otherData[UTXOOtherDataKeys.nameOpData] as String) as Map) + .cast(), + utxo.blockHeight!, + ); + + Logging.instance.t( + "Found OpName: $nameOp", + stackTrace: StackTrace.current, + ); + + if (nameOp.op == OpName.nameNew) { + // at this point we should have an unspent UTXO that is at least + // 12 blocks old which we can now do nameFirstUpdate on + + //TODO: Should check if name was registered by someone else here + + final sKey = nameSaltKeyBuilder(utxo.txid, walletId); + + final data = decodeNameSaltData( + (await secureStorageInterface.read(key: sKey))!, + ); + + final nameScriptHex = scriptNameFirstUpdate( + data.name, + data.value, + data.salt, + ); + + TxData txData = TxData( + opNameState: NameOpState( + name: data.name, + saltHex: data.salt, + commitment: "n/a", + value: data.value, + nameScriptHex: nameScriptHex, + type: OpName.nameFirstUpdate, + ), + feeRateType: FeeRateType.slow, // TODO: make configurable? + recipients: [ + ( + address: (await getCurrentReceivingAddress())!.value, + isChange: false, + amount: Amount.fromDecimal( + Decimal.parse("0.01"), + fractionDigits: cryptoCurrency.fractionDigits, + ), + ), + ], + ); + + txData = await prepareNameSend(txData: txData); + + txData = await confirmSend(txData: txData); + + // TODO + await secureStorageInterface.delete(key: sKey); + // TODO + await secureStorageInterface.write( + key: nameSaltKeyBuilder(txData.txid!, walletId), + value: encodeNameSaltData( + txData.opNameState!.name, + txData.opNameState!.saltHex, + txData.opNameState!.value, + ), + ); + } + } + } + } + + /// Builds and signs a transaction + Future _createNameTx({ + required TxData txData, + required List utxoSigningData, + required bool isForFeeCalcPurposesOnly, + }) async { + Logging.instance.d("Starting _createNameTx ----------"); + + assert(txData.recipients!.where((e) => !e.isChange).length == 1); + + if (!isForFeeCalcPurposesOnly) { + final nameAmount = + txData.recipients!.where((e) => !e.isChange).first.amount; + + switch (txData.opNameState!.type) { + case OpName.nameNew: + assert( + nameAmount.decimal.toString() == "0.015", + ); + break; + case OpName.nameFirstUpdate || OpName.nameUpdate: + assert( + nameAmount.decimal.toString() == "0.01", + ); + break; + } + } + + // temp tx data to show in gui while waiting for real data from server + final List tempInputs = []; + final List tempOutputs = []; + + final List prevOuts = []; + + coinlib.Transaction clTx = coinlib.Transaction( + version: kNameTxVersion, + inputs: [], + outputs: [], + ); + + // TODO: [prio=high]: check this opt in rbf + final sequence = this is RbfInterface && (this as RbfInterface).flagOptInRBF + ? 0xffffffff - 10 + : 0xffffffff - 1; + + // Add transaction inputs + for (var i = 0; i < utxoSigningData.length; i++) { + final txid = utxoSigningData[i].utxo.txid; + + final hash = Uint8List.fromList( + txid.toUint8ListFromHex.reversed.toList(), + ); + + final prevOutpoint = coinlib.OutPoint( + hash, + utxoSigningData[i].utxo.vout, + ); + + final prevOutput = coinlib.Output.fromAddress( + BigInt.from(utxoSigningData[i].utxo.value), + coinlib.Address.fromString( + utxoSigningData[i].utxo.address!, + cryptoCurrency.networkParams, + ), + ); + + prevOuts.add(prevOutput); + + final coinlib.Input input; + + switch (utxoSigningData[i].derivePathType) { + case DerivePathType.bip44: + input = coinlib.P2PKHInput( + prevOut: prevOutpoint, + publicKey: utxoSigningData[i].keyPair!.publicKey, + sequence: sequence, + ); + + // TODO: fix this as it is (probably) wrong! + case DerivePathType.bip49: + throw Exception("TODO p2sh"); + // input = coinlib.P2SHMultisigInput( + // prevOut: prevOutpoint, + // program: coinlib.MultisigProgram.decompile( + // utxoSigningData[i].redeemScript!, + // ), + // sequence: sequence, + // ); + + case DerivePathType.bip84: + input = coinlib.P2WPKHInput( + prevOut: prevOutpoint, + publicKey: utxoSigningData[i].keyPair!.publicKey, + sequence: sequence, + ); + + case DerivePathType.bip86: + input = coinlib.TaprootKeyInput(prevOut: prevOutpoint); + + default: + throw UnsupportedError( + "Unknown derivation path type found: ${utxoSigningData[i].derivePathType}", + ); + } + + clTx = clTx.addInput(input); + + tempInputs.add( + InputV2.isarCantDoRequiredInDefaultConstructor( + scriptSigHex: input.scriptSig.toHex, + scriptSigAsm: null, + sequence: sequence, + outpoint: OutpointV2.isarCantDoRequiredInDefaultConstructor( + txid: utxoSigningData[i].utxo.txid, + vout: utxoSigningData[i].utxo.vout, + ), + addresses: utxoSigningData[i].utxo.address == null + ? [] + : [utxoSigningData[i].utxo.address!], + valueStringSats: utxoSigningData[i].utxo.value.toString(), + witness: null, + innerRedeemScriptAsm: null, + coinbase: null, + walletOwns: true, + ), + ); + } + + int nonChangeCount = 0; // sanity check counter. Should only hit 1. + // Add transaction outputs + for (var i = 0; i < txData.recipients!.length; i++) { + final address = coinlib.Address.fromString( + normalizeAddress(txData.recipients![i].address), + cryptoCurrency.networkParams, + ); + + final coinlib.Output output; + + // there should only be 1 name output + if (!txData.recipients![i].isChange) { + nonChangeCount++; + if (nonChangeCount > 1) { + Logging.instance.d("Oddly formatted Name txData: $txData"); + throw Exception("Oddly formatted Name tx"); + } + final scriptPubKey = address.program.script.compiled; + output = coinlib.Output.fromScriptBytes( + txData.recipients![i].amount.raw, // should be 0.015 or 0.01 + Uint8List.fromList( + txData.opNameState!.nameScriptHex.toUint8ListFromHex + scriptPubKey, + ), + ); + } else { + output = coinlib.Output.fromAddress( + txData.recipients![i].amount.raw, + address, + ); + } + + clTx = clTx.addOutput(output); + + tempOutputs.add( + OutputV2.isarCantDoRequiredInDefaultConstructor( + scriptPubKeyHex: "000000", + valueStringSats: txData.recipients![i].amount.raw.toString(), + addresses: [ + txData.recipients![i].address.toString(), + ], + walletOwns: (await mainDB.isar.addresses + .where() + .walletIdEqualTo(walletId) + .filter() + .valueEqualTo(txData.recipients![i].address) + .valueProperty() + .findFirst()) != + null, + ), + ); + } + + try { + // Sign the transaction accordingly + for (var i = 0; i < utxoSigningData.length; i++) { + final value = BigInt.from(utxoSigningData[i].utxo.value); + coinlib.ECPrivateKey key = utxoSigningData[i].keyPair!.privateKey; + + if (clTx.inputs[i] is coinlib.TaprootKeyInput) { + final taproot = coinlib.Taproot( + internalKey: utxoSigningData[i].keyPair!.publicKey, + ); + + key = taproot.tweakPrivateKey(key); + } + + clTx = clTx.sign( + inputN: i, + value: value, + key: key, + prevOuts: prevOuts, + ); + } + } catch (e, s) { + Logging.instance.e( + "Caught exception while signing transaction: ", + error: e, + stackTrace: s, + ); + rethrow; + } + + return txData.copyWith( + raw: clTx.toHex(), + vSize: clTx.vSize(), + tempTx: TransactionV2( + walletId: walletId, + blockHash: null, + hash: clTx.hashHex, + txid: clTx.txid, + height: null, + timestamp: DateTime.timestamp().millisecondsSinceEpoch ~/ 1000, + inputs: List.unmodifiable(tempInputs), + outputs: List.unmodifiable(tempOutputs), + version: clTx.version, + type: + tempOutputs.map((e) => e.walletOwns).fold(true, (p, e) => p &= e) && + txData.paynymAccountLite == null + ? TransactionType.sentToSelf + : TransactionType.outgoing, + subType: TransactionSubType.none, + otherData: null, + ), + ); + } + + Future prepareNameSend({ + required TxData txData, + }) async { + try { + if (txData.amount == null) { + throw Exception("No recipients in attempted transaction!"); + } + + final feeRateType = txData.feeRateType; + final customSatsPerVByte = txData.satsPerVByte; + final feeRateAmount = txData.feeRateAmount; + final utxos = txData.utxos; + + final bool coinControl = utxos != null; + + if (customSatsPerVByte != null) { + final result = await coinSelectionName( + txData: txData.copyWith(feeRateAmount: -1), + utxos: utxos?.toList(), + coinControl: coinControl, + ); + + Logging.instance.d("PREPARE NAME SEND RESULT: $result"); + + if (result.fee!.raw.toInt() < result.vSize!) { + throw Exception( + "Error in fee calculation: Transaction fee cannot be less than vSize", + ); + } + + return result; + } else if (feeRateType is FeeRateType || feeRateAmount is int) { + late final int rate; + if (feeRateType is FeeRateType) { + int fee = 0; + final feeObject = await fees; + switch (feeRateType) { + case FeeRateType.fast: + fee = feeObject.fast; + break; + case FeeRateType.average: + fee = feeObject.medium; + break; + case FeeRateType.slow: + fee = feeObject.slow; + break; + default: + throw ArgumentError("Invalid use of custom fee"); + } + rate = fee; + } else { + rate = feeRateAmount as int; + } + + final result = await coinSelectionName( + txData: txData.copyWith( + feeRateAmount: rate, + ), + utxos: utxos?.toList(), + coinControl: coinControl, + ); + + Logging.instance.d( + "prepare send: $result", + ); + if (result.fee!.raw.toInt() < result.vSize!) { + throw Exception( + "Error in fee calculation: Transaction fee (${result.fee!.raw.toInt()}) cannot " + "be less than vSize (${result.vSize})"); + } + + return result; + } else { + throw ArgumentError("Invalid fee rate argument provided!"); + } + } catch (e, s) { + Logging.instance.e( + "Exception rethrown from prepareNameSend(): ", + error: e, + stackTrace: s, + ); + rethrow; + } + } + + Future coinSelectionName({ + required TxData txData, + required bool coinControl, + int additionalOutputs = 0, + List? utxos, + }) async { + Logging.instance.d("Starting coinSelectionName ----------"); + + assert(txData.recipients!.length == 1); + + if (coinControl && utxos == null) { + throw Exception("Coin control used where utxos is null!"); + } + + final recipientAddress = txData.recipients!.first.address; + final satoshiAmountToSend = txData.amount!.raw; + final int? satsPerVByte = txData.satsPerVByte; + final selectedTxFeeRate = txData.feeRateAmount!; + + final int expectedSatsValue; + switch (txData.opNameState!.type) { + case OpName.nameNew: + expectedSatsValue = 150_0000; + break; + case OpName.nameFirstUpdate || OpName.nameUpdate: + expectedSatsValue = 100_0000; + break; + } + + if (satoshiAmountToSend != BigInt.from(expectedSatsValue)) { + throw Exception( + "Invalid Name amount for ${txData.opNameState!.type}: ${txData.amount}", + ); + } + + final List availableOutputs = + utxos ?? await mainDB.getUTXOs(walletId).findAll(); + final currentChainHeight = await chainHeight; + + final canCPFP = this is CpfpInterface && coinControl; + + final spendableOutputs = availableOutputs + .where( + (e) => + !e.isBlocked && + (e.used != true) && + (canCPFP || + e.isConfirmed( + currentChainHeight, + cryptoCurrency.minConfirms, + cryptoCurrency.minCoinbaseConfirms, + )), + ) + .toList(); + final spendableSatoshiValue = + spendableOutputs.fold(BigInt.zero, (p, e) => p + BigInt.from(e.value)); + + if (spendableSatoshiValue < satoshiAmountToSend) { + throw Exception("Insufficient balance"); + } else if (spendableSatoshiValue == satoshiAmountToSend) { + throw Exception("Insufficient balance to pay transaction fee"); + } + + if (coinControl) { + if (spendableOutputs.length < availableOutputs.length) { + throw ArgumentError("Attempted to use an unavailable utxo"); + } + // don't care about sorting if using all utxos + } else { + // sort spendable by age (oldest first) + spendableOutputs.sort( + (a, b) => (b.blockTime ?? currentChainHeight) + .compareTo((a.blockTime ?? currentChainHeight)), + ); + } + + Logging.instance.d( + "spendableOutputs.length: ${spendableOutputs.length}" + "\navailableOutputs.length: ${availableOutputs.length}" + "\nspendableOutputs: $spendableOutputs" + "\nspendableSatoshiValue: $spendableSatoshiValue" + "\nsatoshiAmountToSend: $satoshiAmountToSend", + ); + + BigInt satoshisBeingUsed = BigInt.zero; + int inputsBeingConsumed = 0; + final List utxoObjectsToUse = []; + + if (!coinControl) { + for (var i = 0; + satoshisBeingUsed < satoshiAmountToSend && + i < spendableOutputs.length; + i++) { + utxoObjectsToUse.add(spendableOutputs[i]); + satoshisBeingUsed += BigInt.from(spendableOutputs[i].value); + inputsBeingConsumed += 1; + } + for (int i = 0; + i < additionalOutputs && + inputsBeingConsumed < spendableOutputs.length; + i++) { + utxoObjectsToUse.add(spendableOutputs[inputsBeingConsumed]); + satoshisBeingUsed += + BigInt.from(spendableOutputs[inputsBeingConsumed].value); + inputsBeingConsumed += 1; + } + } else { + satoshisBeingUsed = spendableSatoshiValue; + utxoObjectsToUse.addAll(spendableOutputs); + inputsBeingConsumed = spendableOutputs.length; + } + + Logging.instance.d( + "satoshisBeingUsed: $satoshisBeingUsed" + "\ninputsBeingConsumed: $inputsBeingConsumed" + "\nutxoObjectsToUse: $utxoObjectsToUse", + ); + + // numberOfOutputs' length must always be equal to that of recipientsArray and recipientsAmtArray + final List recipientsArray = [recipientAddress]; + final List recipientsAmtArray = [satoshiAmountToSend]; + + // gather required signing data + final utxoSigningData = await fetchBuildTxData(utxoObjectsToUse); + + final int vSizeForOneOutput; + try { + vSizeForOneOutput = (await _createNameTx( + utxoSigningData: utxoSigningData, + isForFeeCalcPurposesOnly: true, + txData: txData.copyWith( + recipients: await helperRecipientsConvert( + [recipientAddress], + [satoshisBeingUsed], + ), + ), + )) + .vSize!; + } catch (e, s) { + Logging.instance.e("vSizeForOneOutput: $e", error: e, stackTrace: s); + rethrow; + } + + final int vSizeForTwoOutPuts; + + BigInt maxBI(BigInt a, BigInt b) => a > b ? a : b; + + try { + vSizeForTwoOutPuts = (await _createNameTx( + utxoSigningData: utxoSigningData, + isForFeeCalcPurposesOnly: true, + txData: txData.copyWith( + recipients: await helperRecipientsConvert( + [recipientAddress, (await getCurrentChangeAddress())!.value], + [ + satoshiAmountToSend, + maxBI( + BigInt.zero, + satoshisBeingUsed - satoshiAmountToSend, + ), + ], + ), + ), + )) + .vSize!; + } catch (e, s) { + Logging.instance.e("vSizeForTwoOutPuts: $e", error: e, stackTrace: s); + rethrow; + } + + // Assume 1 output, only for recipient and no change + final feeForOneOutput = BigInt.from( + satsPerVByte != null + ? (satsPerVByte * vSizeForOneOutput) + : estimateTxFee( + vSize: vSizeForOneOutput, + feeRatePerKB: selectedTxFeeRate, + ), + ); + // Assume 2 outputs, one for recipient and one for change + final feeForTwoOutputs = BigInt.from( + satsPerVByte != null + ? (satsPerVByte * vSizeForTwoOutPuts) + : estimateTxFee( + vSize: vSizeForTwoOutPuts, + feeRatePerKB: selectedTxFeeRate, + ), + ); + + Logging.instance.d( + "feeForTwoOutputs: $feeForTwoOutputs" + "\nfeeForOneOutput: $feeForOneOutput", + ); + + final difference = satoshisBeingUsed - satoshiAmountToSend; + + Future _singleOutputTxn() async { + Logging.instance.d( + 'Input size: $satoshisBeingUsed' + '\nRecipient output size: $satoshiAmountToSend' + '\nFee being paid: $difference sats' + '\nEstimated fee: $feeForOneOutput', + ); + final txnData = await _createNameTx( + isForFeeCalcPurposesOnly: false, + utxoSigningData: utxoSigningData, + txData: txData.copyWith( + recipients: await helperRecipientsConvert( + recipientsArray, + recipientsAmtArray, + ), + ), + ); + return txnData.copyWith( + fee: Amount( + rawValue: feeForOneOutput, + fractionDigits: cryptoCurrency.fractionDigits, + ), + usedUTXOs: utxoSigningData.map((e) => e.utxo).toList(), + ); + } + + // no change output required + if (difference == feeForOneOutput) { + Logging.instance.d('1 output in tx'); + return await _singleOutputTxn(); + } else if (difference < feeForOneOutput) { + Logging.instance.w( + 'Cannot pay tx fee - checking for more outputs and trying again', + ); + // try adding more outputs + if (spendableOutputs.length > inputsBeingConsumed) { + return coinSelectionName( + txData: txData, + additionalOutputs: additionalOutputs + 1, + utxos: utxos, + coinControl: coinControl, + ); + } + throw Exception("Insufficient balance to pay transaction fee"); + } else { + if (difference > (feeForOneOutput + cryptoCurrency.dustLimit.raw)) { + final changeOutputSize = difference - feeForTwoOutputs; + // check if possible to add the change output + if (changeOutputSize > cryptoCurrency.dustLimit.raw && + difference - changeOutputSize == feeForTwoOutputs) { + // generate new change address if current change address has been used + await checkChangeAddressForTransactions(); + final String newChangeAddress = + (await getCurrentChangeAddress())!.value; + + BigInt feeBeingPaid = difference - changeOutputSize; + + // add change output + recipientsArray.add(newChangeAddress); + recipientsAmtArray.add(changeOutputSize); + + Logging.instance.d('2 outputs in tx' + '\nInput size: $satoshisBeingUsed' + '\nRecipient output size: $satoshiAmountToSend' + '\nChange Output Size: $changeOutputSize' + '\nDifference (fee being paid): $feeBeingPaid sats' + '\nEstimated fee: $feeForTwoOutputs'); + + TxData txnData = await _createNameTx( + utxoSigningData: utxoSigningData, + isForFeeCalcPurposesOnly: false, + txData: txData.copyWith( + recipients: await helperRecipientsConvert( + recipientsArray, + recipientsAmtArray, + ), + ), + ); + + // make sure minimum fee is accurate if that is being used + if (BigInt.from(txnData.vSize!) - feeBeingPaid == BigInt.one) { + final changeOutputSize = difference - BigInt.from(txnData.vSize!); + feeBeingPaid = difference - changeOutputSize; + recipientsAmtArray.removeLast(); + recipientsAmtArray.add(changeOutputSize); + + Logging.instance.d( + '\nAdjusted Input size: $satoshisBeingUsed' + '\nAdjusted Recipient output size: $satoshiAmountToSend' + '\nAdjusted Change Output Size: $changeOutputSize' + '\nAdjusted Difference (fee being paid): $feeBeingPaid sats' + '\nAdjusted Estimated fee: $feeForTwoOutputs', + ); + + txnData = await _createNameTx( + utxoSigningData: utxoSigningData, + isForFeeCalcPurposesOnly: false, + txData: txData.copyWith( + recipients: await helperRecipientsConvert( + recipientsArray, + recipientsAmtArray, + ), + ), + ); + } + + return txnData.copyWith( + fee: Amount( + rawValue: feeBeingPaid, + fractionDigits: cryptoCurrency.fractionDigits, + ), + usedUTXOs: utxoSigningData.map((e) => e.utxo).toList(), + ); + } else { + // Something went wrong here. It either overshot or undershot the estimated fee amount or the changeOutputSize + // is smaller than or equal to cryptoCurrency.dustLimit. Revert to single output transaction. + Logging.instance.d( + 'Reverting to 1 output in tx', + ); + + return await _singleOutputTxn(); + } + } + } + + return txData; + } } diff --git a/lib/wallets/wallet/wallet.dart b/lib/wallets/wallet/wallet.dart index 36cec7b85..9f74fbcee 100644 --- a/lib/wallets/wallet/wallet.dart +++ b/lib/wallets/wallet/wallet.dart @@ -663,17 +663,21 @@ abstract class Wallet { await (this as SparkInterface).refreshSparkData((0.3, 0.6)); } - final fetchFuture = updateTransactions(); - - _fireRefreshPercentChange(0.6); - final utxosRefreshFuture = updateUTXOs(); - // if (currentHeight != storedHeight) { - _fireRefreshPercentChange(0.65); - - await utxosRefreshFuture; - _fireRefreshPercentChange(0.70); - - await fetchFuture; + if (this is NamecoinWallet) { + await updateUTXOs(); + _fireRefreshPercentChange(0.6); + await (this as NamecoinWallet).checkForNameNewOPs(); + _fireRefreshPercentChange(0.70); + await updateTransactions(); + } else { + final fetchFuture = updateTransactions(); + _fireRefreshPercentChange(0.6); + final utxosRefreshFuture = updateUTXOs(); + _fireRefreshPercentChange(0.65); + await utxosRefreshFuture; + _fireRefreshPercentChange(0.70); + await fetchFuture; + } // TODO: [prio=low] handle this differently. Extra modification of this file for coin specific functionality should be avoided. if (!viewOnly && this is PaynymInterface && codesToCheck.isNotEmpty) { diff --git a/lib/wallets/wallet/wallet_mixin_interfaces/electrumx_interface.dart b/lib/wallets/wallet/wallet_mixin_interfaces/electrumx_interface.dart index d4b387b8d..4416b918a 100644 --- a/lib/wallets/wallet/wallet_mixin_interfaces/electrumx_interface.dart +++ b/lib/wallets/wallet/wallet_mixin_interfaces/electrumx_interface.dart @@ -74,7 +74,7 @@ mixin ElectrumXInterface } Future> - _helperRecipientsConvert( + helperRecipientsConvert( List addrs, List satValues, ) async { @@ -248,7 +248,7 @@ mixin ElectrumXInterface vSizeForOneOutput = (await buildTransaction( utxoSigningData: utxoSigningData, txData: txData.copyWith( - recipients: await _helperRecipientsConvert( + recipients: await helperRecipientsConvert( [recipientAddress], [satoshisBeingUsed - BigInt.one], ), @@ -268,7 +268,7 @@ mixin ElectrumXInterface vSizeForTwoOutPuts = (await buildTransaction( utxoSigningData: utxoSigningData, txData: txData.copyWith( - recipients: await _helperRecipientsConvert( + recipients: await helperRecipientsConvert( [recipientAddress, (await getCurrentChangeAddress())!.value], [ satoshiAmountToSend, @@ -330,7 +330,7 @@ mixin ElectrumXInterface final txnData = await buildTransaction( utxoSigningData: utxoSigningData, txData: txData.copyWith( - recipients: await _helperRecipientsConvert( + recipients: await helperRecipientsConvert( recipientsArray, recipientsAmtArray, ), @@ -392,7 +392,7 @@ mixin ElectrumXInterface TxData txnData = await buildTransaction( utxoSigningData: utxoSigningData, txData: txData.copyWith( - recipients: await _helperRecipientsConvert( + recipients: await helperRecipientsConvert( recipientsArray, recipientsAmtArray, ), @@ -425,7 +425,7 @@ mixin ElectrumXInterface txnData = await buildTransaction( utxoSigningData: utxoSigningData, txData: txData.copyWith( - recipients: await _helperRecipientsConvert( + recipients: await helperRecipientsConvert( recipientsArray, recipientsAmtArray, ), @@ -474,7 +474,7 @@ mixin ElectrumXInterface final int vSizeForOneOutput = (await buildTransaction( utxoSigningData: utxoSigningData, txData: txData.copyWith( - recipients: await _helperRecipientsConvert( + recipients: await helperRecipientsConvert( [recipientAddress], [satoshisBeingUsed - BigInt.one], ), @@ -511,7 +511,7 @@ mixin ElectrumXInterface final data = await buildTransaction( txData: txData.copyWith( - recipients: await _helperRecipientsConvert( + recipients: await helperRecipientsConvert( [recipientAddress], [amount], ), @@ -1155,8 +1155,6 @@ mixin ElectrumXInterface } } - /// The optional (nullable) param [checkBlock] is a callback that can be used - /// to check if a utxo should be marked as blocked Future parseUTXO({ required Map jsonUTXO, }) async { @@ -1685,8 +1683,11 @@ mixin ElectrumXInterface return await mainDB.updateUTXOs(walletId, outputArray); } catch (e, s) { - Logging.instance - .e("Output fetch unsuccessful: ", error: e, stackTrace: s); + Logging.instance.e( + "Output fetch unsuccessful: ", + error: e, + stackTrace: s, + ); return false; } } diff --git a/lib/widgets/desktop/desktop_fee_dialog.dart b/lib/widgets/desktop/desktop_fee_dialog.dart index 322fbb876..713aaa109 100644 --- a/lib/widgets/desktop/desktop_fee_dialog.dart +++ b/lib/widgets/desktop/desktop_fee_dialog.dart @@ -1,5 +1,5 @@ -import 'package:flutter/material.dart'; import 'package:cs_monero/cs_monero.dart' as lib_monero; +import 'package:flutter/material.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; import '../../models/models.dart'; diff --git a/pubspec.lock b/pubspec.lock index 590466016..d5280cd24 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -1385,6 +1385,15 @@ packages: url: "https://pub.dev" source: hosted version: "3.1.0" + namecoin: + dependency: "direct main" + description: + path: "." + ref: "41c4f32eb0eb82540a42fae25a10ece2557d517c" + resolved-ref: "41c4f32eb0eb82540a42fae25a10ece2557d517c" + url: "https://github.com/Cyrix126/namecoin_dart" + source: git + version: "0.3.0" nanodart: dependency: "direct main" description: diff --git a/scripts/app_config/templates/pubspec.template b/scripts/app_config/templates/pubspec.template index 5a2b8e6cd..2e83d017d 100644 --- a/scripts/app_config/templates/pubspec.template +++ b/scripts/app_config/templates/pubspec.template @@ -214,6 +214,10 @@ dependencies: git: url: https://github.com/cypherstack/logger ref: 3c0cba27868ebb5c7d65ebc30a8e6e5342186692 + namecoin: + git: + url: https://github.com/Cyrix126/namecoin_dart + ref: 41c4f32eb0eb82540a42fae25a10ece2557d517c dev_dependencies: flutter_test: From c277cd9641f529f4ee5f1b8e94812d638c6fb456 Mon Sep 17 00:00:00 2001 From: julian Date: Thu, 13 Feb 2025 12:01:57 -0600 Subject: [PATCH 069/193] update namecoin_dart version --- pubspec.lock | 6 +++--- scripts/app_config/templates/pubspec.template | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/pubspec.lock b/pubspec.lock index d5280cd24..233e824f8 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -1389,11 +1389,11 @@ packages: dependency: "direct main" description: path: "." - ref: "41c4f32eb0eb82540a42fae25a10ece2557d517c" - resolved-ref: "41c4f32eb0eb82540a42fae25a10ece2557d517c" + ref: "819b21164ef93cc0889049d4a8a1be2d0cc36a1b" + resolved-ref: "819b21164ef93cc0889049d4a8a1be2d0cc36a1b" url: "https://github.com/Cyrix126/namecoin_dart" source: git - version: "0.3.0" + version: "2.0.0" nanodart: dependency: "direct main" description: diff --git a/scripts/app_config/templates/pubspec.template b/scripts/app_config/templates/pubspec.template index 2e83d017d..145e191ed 100644 --- a/scripts/app_config/templates/pubspec.template +++ b/scripts/app_config/templates/pubspec.template @@ -217,7 +217,7 @@ dependencies: namecoin: git: url: https://github.com/Cyrix126/namecoin_dart - ref: 41c4f32eb0eb82540a42fae25a10ece2557d517c + ref: 819b21164ef93cc0889049d4a8a1be2d0cc36a1b dev_dependencies: flutter_test: From 3ea469bb1fe5b5ae66e6759178eda81c6b02a898 Mon Sep 17 00:00:00 2001 From: julian Date: Thu, 13 Feb 2025 12:45:46 -0600 Subject: [PATCH 070/193] use private key for deterministic salt --- .../namecoin_names_home_view.dart | 12 ++++++++++-- lib/wallets/wallet/impl/namecoin_wallet.dart | 17 ++++++++++++++--- .../wallet/intermediate/bip39_hd_wallet.dart | 13 +++++++++---- 3 files changed, 33 insertions(+), 9 deletions(-) diff --git a/lib/pages/namecoin_names/namecoin_names_home_view.dart b/lib/pages/namecoin_names/namecoin_names_home_view.dart index 531d543a3..2b2a444e4 100644 --- a/lib/pages/namecoin_names/namecoin_names_home_view.dart +++ b/lib/pages/namecoin_names/namecoin_names_home_view.dart @@ -54,7 +54,15 @@ class _NamecoinNamesHomeViewState extends ConsumerState { ref.read(pWallets).getWallet(widget.walletId) as NamecoinWallet; Future _preRegister() async { - final data = scriptNameNew(lastAvailableName!); + final myAddress = await _wallet.getCurrentReceivingAddress(); + if (myAddress == null) { + throw Exception("No receiving address found"); + } + + // get address private key for deterministic salt + final pk = await _wallet.getPrivateKey(myAddress); + + final data = scriptNameNew(lastAvailableName!, pk.data); // TODO: fill out properly TxData txData = TxData( @@ -69,7 +77,7 @@ class _NamecoinNamesHomeViewState extends ConsumerState { feeRateType: FeeRateType.slow, // TODO: make configurable? recipients: [ ( - address: (await _wallet.getCurrentReceivingAddress())!.value, + address: myAddress.value, isChange: false, amount: Amount.fromDecimal( Decimal.parse("0.015"), diff --git a/lib/wallets/wallet/impl/namecoin_wallet.dart b/lib/wallets/wallet/impl/namecoin_wallet.dart index a911215bb..8bc9581a7 100644 --- a/lib/wallets/wallet/impl/namecoin_wallet.dart +++ b/lib/wallets/wallet/impl/namecoin_wallet.dart @@ -497,9 +497,20 @@ class NamecoinWallet final sKey = nameSaltKeyBuilder(utxo.txid, walletId); - final data = decodeNameSaltData( - (await secureStorageInterface.read(key: sKey))!, - ); + final encoded = await secureStorageInterface.read(key: sKey); + if (encoded == null) { + continue; + } + + final data = decodeNameSaltData(encoded); + + // verify cached matches + final myAddress = await mainDB.getAddress(walletId, utxo.address!); + final pk = await getPrivateKey(myAddress!); + final generatedSalt = scriptNameNew(data.name, pk.data).$2; + + // TODO replace assert with proper error + assert(generatedSalt == data.salt); final nameScriptHex = scriptNameFirstUpdate( data.name, diff --git a/lib/wallets/wallet/intermediate/bip39_hd_wallet.dart b/lib/wallets/wallet/intermediate/bip39_hd_wallet.dart index 832ce3e13..90cbacea4 100644 --- a/lib/wallets/wallet/intermediate/bip39_hd_wallet.dart +++ b/lib/wallets/wallet/intermediate/bip39_hd_wallet.dart @@ -33,14 +33,19 @@ abstract class Bip39HDWallet extends Bip39Wallet return coinlib.HDPrivateKey.fromSeed(seed); } + Future getPrivateKey(Address address) async { + return (await getRootHDNode()) + .derivePath(address.derivationPath!.value) + .privateKey; + } + Future getPrivateKeyWIF(Address address) async { - final keys = - (await getRootHDNode()).derivePath(address.derivationPath!.value); + final privateKey = await getPrivateKey(address); final List data = [ cryptoCurrency.networkParams.wifPrefix, - ...keys.privateKey.data, - if (keys.privateKey.compressed) 1, + ...privateKey.data, + if (privateKey.compressed) 1, ]; final checksum = coinlib.sha256DoubleHash(Uint8List.fromList(data)).sublist(0, 4); From 5a39bb2b641ed9059bcb142baf7cce710411c688 Mon Sep 17 00:00:00 2001 From: julian Date: Thu, 13 Feb 2025 12:55:07 -0600 Subject: [PATCH 071/193] auto focus cursor in search field on desktop --- .../add_wallet_views/add_wallet_view/add_wallet_view.dart | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/lib/pages/add_wallet_views/add_wallet_view/add_wallet_view.dart b/lib/pages/add_wallet_views/add_wallet_view/add_wallet_view.dart index 03d289237..748f5074e 100644 --- a/lib/pages/add_wallet_views/add_wallet_view/add_wallet_view.dart +++ b/lib/pages/add_wallet_views/add_wallet_view/add_wallet_view.dart @@ -153,7 +153,12 @@ class _AddWalletViewState extends ConsumerState { } WidgetsBinding.instance.addPostFrameCallback((_) { - ref.refresh(addWalletSelectedEntityStateProvider); + if (mounted) { + ref.refresh(addWalletSelectedEntityStateProvider); + if (isDesktop) { + _searchFocusNode.requestFocus(); + } + } }); super.initState(); From 873fc63045d0e98e51205c8e4be301f643db852f Mon Sep 17 00:00:00 2001 From: julian Date: Thu, 13 Feb 2025 12:55:43 -0600 Subject: [PATCH 072/193] consistent log level edit --- lib/wallets/wallet/impl/firo_wallet.dart | 2 +- .../wallet/wallet_mixin_interfaces/electrumx_interface.dart | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/lib/wallets/wallet/impl/firo_wallet.dart b/lib/wallets/wallet/impl/firo_wallet.dart index 9aa1357f0..aed72a33a 100644 --- a/lib/wallets/wallet/impl/firo_wallet.dart +++ b/lib/wallets/wallet/impl/firo_wallet.dart @@ -738,7 +738,7 @@ class FiroWallet extends Bip39HDWallet ); // receiving addresses - Logging.instance.d("checking receiving addresses..."); + Logging.instance.i("checking receiving addresses..."); final canBatch = await serverCanBatch; diff --git a/lib/wallets/wallet/wallet_mixin_interfaces/electrumx_interface.dart b/lib/wallets/wallet/wallet_mixin_interfaces/electrumx_interface.dart index 4416b918a..2660d60ff 100644 --- a/lib/wallets/wallet/wallet_mixin_interfaces/electrumx_interface.dart +++ b/lib/wallets/wallet/wallet_mixin_interfaces/electrumx_interface.dart @@ -1472,7 +1472,7 @@ mixin ElectrumXInterface } // receiving addresses - Logging.instance.e( + Logging.instance.i( "checking receiving addresses...", ); @@ -2003,7 +2003,7 @@ mixin ElectrumXInterface if (root != null) { // receiving addresses - Logging.instance.d( + Logging.instance.i( "checking receiving addresses...", ); From 6d291408a3cdee9ee461e374908ea1836e001645 Mon Sep 17 00:00:00 2001 From: julian Date: Thu, 13 Feb 2025 14:02:55 -0600 Subject: [PATCH 073/193] hack in name op utxo confirmation check --- .../isar/models/blockchain_data/utxo.dart | 9 +++- lib/pages/coin_control/coin_control_view.dart | 49 ++++++++++++++---- lib/pages/coin_control/utxo_card.dart | 34 +++++++++---- lib/pages/coin_control/utxo_details_view.dart | 28 +++++++--- .../coin_control/utxo_row.dart | 27 +++++----- lib/wallets/wallet/impl/namecoin_wallet.dart | 51 ++++++++++++++++--- 6 files changed, 148 insertions(+), 50 deletions(-) diff --git a/lib/models/isar/models/blockchain_data/utxo.dart b/lib/models/isar/models/blockchain_data/utxo.dart index e4f91258c..57f9ede64 100644 --- a/lib/models/isar/models/blockchain_data/utxo.dart +++ b/lib/models/isar/models/blockchain_data/utxo.dart @@ -85,9 +85,14 @@ class UTXO { bool isConfirmed( int currentChainHeight, int minimumConfirms, - int minimumCoinbaseConfirms, - ) { + int minimumCoinbaseConfirms, { + int? overrideMinConfirms, // added to handle namecoin name op outputs + }) { final confirmations = getConfirmations(currentChainHeight); + + if (overrideMinConfirms != null) { + return confirmations >= overrideMinConfirms; + } return confirmations >= (isCoinbase ? minimumCoinbaseConfirms : minimumConfirms); } diff --git a/lib/pages/coin_control/coin_control_view.dart b/lib/pages/coin_control/coin_control_view.dart index 07703a149..cb288f845 100644 --- a/lib/pages/coin_control/coin_control_view.dart +++ b/lib/pages/coin_control/coin_control_view.dart @@ -26,6 +26,8 @@ import '../../utilities/assets.dart'; import '../../utilities/constants.dart'; import '../../utilities/text_styles.dart'; import '../../wallets/isar/providers/wallet_info_provider.dart'; +import '../../wallets/wallet/impl/namecoin_wallet.dart'; +import '../../wallets/wallet/wallet.dart'; import '../../wallets/wallet/wallet_mixin_interfaces/coin_control_interface.dart'; import '../../widgets/animated_widgets/rotate_icon.dart'; import '../../widgets/app_bar_field.dart'; @@ -88,6 +90,18 @@ class _CoinControlViewState extends ConsumerState { await coinControlInterface.updateBalance(); } + bool _isConfirmed(UTXO utxo, int currentChainHeight, Wallet wallet) { + if (wallet is NamecoinWallet) { + return wallet.checkUtxoConfirmed(utxo, currentChainHeight); + } else { + return utxo.isConfirmed( + currentChainHeight, + wallet.cryptoCurrency.minConfirms, + wallet.cryptoCurrency.minCoinbaseConfirms, + ); + } + } + @override void initState() { if (widget.selectedUTXOs != null) { @@ -347,10 +361,15 @@ class _CoinControlViewState extends ConsumerState { CoinControlViewType.manage || (widget.type == CoinControlViewType.use && !utxo.isBlocked && - utxo.isConfirmed( + _isConfirmed( + utxo, currentHeight, - minConfirms, - coin.minCoinbaseConfirms, + ref.watch( + pWallets.select( + (s) => s + .getWallet(widget.walletId), + ), + ), )), initialSelectedState: isSelected, onSelectedChanged: (value) { @@ -412,10 +431,16 @@ class _CoinControlViewState extends ConsumerState { (widget.type == CoinControlViewType.use && !_showBlocked && - utxo.isConfirmed( + _isConfirmed( + utxo, currentHeight, - minConfirms, - coin.minCoinbaseConfirms, + ref.watch( + pWallets.select( + (s) => s.getWallet( + widget.walletId, + ), + ), + ), )), initialSelectedState: isSelected, onSelectedChanged: (value) { @@ -557,10 +582,16 @@ class _CoinControlViewState extends ConsumerState { CoinControlViewType .use && !utxo.isBlocked && - utxo.isConfirmed( + _isConfirmed( + utxo, currentHeight, - minConfirms, - coin.minCoinbaseConfirms, + ref.watch( + pWallets.select( + (s) => s.getWallet( + widget.walletId, + ), + ), + ), )), initialSelectedState: isSelected, onSelectedChanged: (value) { diff --git a/lib/pages/coin_control/utxo_card.dart b/lib/pages/coin_control/utxo_card.dart index 0881c7eb6..624b41eee 100644 --- a/lib/pages/coin_control/utxo_card.dart +++ b/lib/pages/coin_control/utxo_card.dart @@ -20,6 +20,8 @@ import '../../utilities/amount/amount_formatter.dart'; import '../../utilities/constants.dart'; import '../../utilities/text_styles.dart'; import '../../wallets/isar/providers/wallet_info_provider.dart'; +import '../../wallets/wallet/impl/namecoin_wallet.dart'; +import '../../wallets/wallet/wallet.dart'; import '../../widgets/conditional_parent.dart'; import '../../widgets/icon_widgets/utxo_status_icon.dart'; import '../../widgets/rounded_container.dart'; @@ -52,6 +54,18 @@ class _UtxoCardState extends ConsumerState { late bool _selected; + bool _isConfirmed(UTXO utxo, int currentChainHeight, Wallet wallet) { + if (wallet is NamecoinWallet) { + return wallet.checkUtxoConfirmed(utxo, currentChainHeight); + } else { + return utxo.isConfirmed( + currentChainHeight, + wallet.cryptoCurrency.minConfirms, + wallet.cryptoCurrency.minCoinbaseConfirms, + ); + } + } + @override void initState() { _selected = widget.initialSelectedState; @@ -110,18 +124,16 @@ class _UtxoCardState extends ConsumerState { ), child: UTXOStatusIcon( blocked: utxo.isBlocked, - status: utxo.isConfirmed( + status: _isConfirmed( + utxo, currentHeight, - ref - .watch(pWallets) - .getWallet(widget.walletId) - .cryptoCurrency - .minConfirms, - ref - .watch(pWallets) - .getWallet(widget.walletId) - .cryptoCurrency - .minCoinbaseConfirms, + ref.watch( + pWallets.select( + (s) => s.getWallet( + widget.walletId, + ), + ), + ), ) ? UTXOStatusIconStatus.confirmed : UTXOStatusIconStatus.unconfirmed, diff --git a/lib/pages/coin_control/utxo_details_view.dart b/lib/pages/coin_control/utxo_details_view.dart index ba71f7a01..9959abdda 100644 --- a/lib/pages/coin_control/utxo_details_view.dart +++ b/lib/pages/coin_control/utxo_details_view.dart @@ -23,6 +23,8 @@ import '../../utilities/amount/amount_formatter.dart'; import '../../utilities/text_styles.dart'; import '../../utilities/util.dart'; import '../../wallets/isar/providers/wallet_info_provider.dart'; +import '../../wallets/wallet/impl/namecoin_wallet.dart'; +import '../../wallets/wallet/wallet.dart'; import '../../widgets/background.dart'; import '../../widgets/conditional_parent.dart'; import '../../widgets/custom_buttons/app_bar_icon_button.dart'; @@ -67,6 +69,18 @@ class _UtxoDetailsViewState extends ConsumerState { await MainDB.instance.putUTXO(utxo!.copyWith(isBlocked: !utxo!.isBlocked)); } + bool _isConfirmed(UTXO utxo, int currentChainHeight, Wallet wallet) { + if (wallet is NamecoinWallet) { + return wallet.checkUtxoConfirmed(utxo, currentChainHeight); + } else { + return utxo.isConfirmed( + currentChainHeight, + wallet.cryptoCurrency.minConfirms, + wallet.cryptoCurrency.minCoinbaseConfirms, + ); + } + } + @override void initState() { utxo = MainDB.instance.isar.utxos @@ -95,14 +109,14 @@ class _UtxoDetailsViewState extends ConsumerState { final coin = ref.watch(pWalletCoin(widget.walletId)); final currentHeight = ref.watch(pWalletChainHeight(widget.walletId)); - final confirmed = utxo!.isConfirmed( + final confirmed = _isConfirmed( + utxo!, currentHeight, - ref.watch(pWallets).getWallet(widget.walletId).cryptoCurrency.minConfirms, - ref - .watch(pWallets) - .getWallet(widget.walletId) - .cryptoCurrency - .minCoinbaseConfirms, + ref.watch( + pWallets.select( + (s) => s.getWallet(widget.walletId), + ), + ), ); return ConditionalParent( diff --git a/lib/pages_desktop_specific/coin_control/utxo_row.dart b/lib/pages_desktop_specific/coin_control/utxo_row.dart index 26204375c..548e2c05e 100644 --- a/lib/pages_desktop_specific/coin_control/utxo_row.dart +++ b/lib/pages_desktop_specific/coin_control/utxo_row.dart @@ -20,7 +20,9 @@ import '../../themes/stack_colors.dart'; import '../../utilities/amount/amount.dart'; import '../../utilities/amount/amount_formatter.dart'; import '../../utilities/text_styles.dart'; +import '../../wallets/crypto_currency/coins/namecoin.dart'; import '../../wallets/isar/providers/wallet_info_provider.dart'; +import '../../wallets/wallet/impl/namecoin_wallet.dart'; import '../../widgets/conditional_parent.dart'; import '../../widgets/custom_buttons/blue_text_button.dart'; import '../../widgets/desktop/secondary_button.dart'; @@ -135,19 +137,18 @@ class _UtxoRowState extends ConsumerState { ), UTXOStatusIcon( blocked: utxo.isBlocked, - status: utxo.isConfirmed( - ref.watch(pWalletChainHeight(widget.walletId)), - ref - .watch(pWallets) - .getWallet(widget.walletId) - .cryptoCurrency - .minConfirms, - ref - .watch(pWallets) - .getWallet(widget.walletId) - .cryptoCurrency - .minCoinbaseConfirms, - ) + status: (coin is Namecoin + ? (ref.watch(pWallets).getWallet(widget.walletId) + as NamecoinWallet) + .checkUtxoConfirmed( + utxo, + ref.watch(pWalletChainHeight(widget.walletId)), + ) + : utxo.isConfirmed( + ref.watch(pWalletChainHeight(widget.walletId)), + coin.minConfirms, + coin.minCoinbaseConfirms, + )) ? UTXOStatusIconStatus.confirmed : UTXOStatusIconStatus.unconfirmed, background: Theme.of(context).extension()!.popupBG, diff --git a/lib/wallets/wallet/impl/namecoin_wallet.dart b/lib/wallets/wallet/impl/namecoin_wallet.dart index 8bc9581a7..52d6f314f 100644 --- a/lib/wallets/wallet/impl/namecoin_wallet.dart +++ b/lib/wallets/wallet/impl/namecoin_wallet.dart @@ -476,14 +476,8 @@ class NamecoinWallet .findAll(); for (final utxo in utxos) { - final otherData = jsonDecode(utxo.otherData!) as Map; - if (otherData[UTXOOtherDataKeys.nameOpData] != null) { - final nameOp = OpNameData( - (jsonDecode(otherData[UTXOOtherDataKeys.nameOpData] as String) as Map) - .cast(), - utxo.blockHeight!, - ); - + final nameOp = getOpNameDataFrom(utxo); + if (nameOp != null) { Logging.instance.t( "Found OpName: $nameOp", stackTrace: StackTrace.current, @@ -499,6 +493,9 @@ class NamecoinWallet final encoded = await secureStorageInterface.read(key: sKey); if (encoded == null) { + Logging.instance.w( + "Found OpName encoded value not found!!", + ); continue; } @@ -1202,4 +1199,42 @@ class NamecoinWallet return txData; } + + /// return null if utxo does not contain name op + OpNameData? getOpNameDataFrom(UTXO utxo) { + if (utxo.otherData == null) { + return null; + } + final otherData = jsonDecode(utxo.otherData!) as Map; + if (otherData[UTXOOtherDataKeys.nameOpData] != null) { + try { + final nameOp = OpNameData( + (jsonDecode(otherData[UTXOOtherDataKeys.nameOpData] as String) as Map) + .cast(), + utxo.blockHeight!, + ); + return nameOp; + } catch (e, s) { + Logging.instance.d( + "getOpNameDataFrom($utxo) failed", + error: e, + stackTrace: s, + ); + return null; + } + } + return null; + } + + bool checkUtxoConfirmed(UTXO utxo, int currentChainHeight) { + final isNameOpOutput = getOpNameDataFrom(utxo) != null; + + final confirmedStatus = utxo.isConfirmed( + currentChainHeight, + cryptoCurrency.minConfirms, + cryptoCurrency.minCoinbaseConfirms, + overrideMinConfirms: isNameOpOutput ? kNameWaitBlocks : null, + ); + return confirmedStatus; + } } From 69b3e9b1ab52225857efe0af7202c5662ed6721c Mon Sep 17 00:00:00 2001 From: julian Date: Thu, 13 Feb 2025 14:07:38 -0600 Subject: [PATCH 074/193] handle name op output selection based on name op type --- lib/wallets/wallet/impl/namecoin_wallet.dart | 102 +++++++++++++++++-- 1 file changed, 93 insertions(+), 9 deletions(-) diff --git a/lib/wallets/wallet/impl/namecoin_wallet.dart b/lib/wallets/wallet/impl/namecoin_wallet.dart index 52d6f314f..cde50427b 100644 --- a/lib/wallets/wallet/impl/namecoin_wallet.dart +++ b/lib/wallets/wallet/impl/namecoin_wallet.dart @@ -917,19 +917,103 @@ class NamecoinWallet final canCPFP = this is CpfpInterface && coinControl; - final spendableOutputs = availableOutputs - .where( - (e) => - !e.isBlocked && - (e.used != true) && - (canCPFP || + int nameOutputCount = 0; // for sanity check. Should only be max 1; + void nameOutputCountCheck() { + nameOutputCount++; + if (nameOutputCount > 1) { + throw Exception("nameOutputCount greater than one"); + } + } + + final List spendableOutputs; + switch (txData.opNameState!.type) { + case OpName.nameNew: + spendableOutputs = availableOutputs + .where( + (e) => + !e.isBlocked && + (e.used != true) && + (canCPFP || + e.isConfirmed( + currentChainHeight, + cryptoCurrency.minConfirms, + cryptoCurrency.minCoinbaseConfirms, + )), + ) + .toList(); + break; + + case OpName.nameFirstUpdate: + spendableOutputs = availableOutputs.where( + (e) { + if (e.used == true) return false; + + final nameOp = getOpNameDataFrom(e); + if (nameOp != null) { + if (nameOp.op == OpName.nameFirstUpdate || + nameOp.op == OpName.nameUpdate) { + return false; + } else { + final confirmed = e.isConfirmed( + currentChainHeight, + cryptoCurrency.minConfirms, + cryptoCurrency.minCoinbaseConfirms, + overrideMinConfirms: kNameWaitBlocks, + ); + + if (confirmed) { + nameOutputCountCheck(); + } + return confirmed; + } + } else { + return canCPFP || e.isConfirmed( currentChainHeight, cryptoCurrency.minConfirms, cryptoCurrency.minCoinbaseConfirms, - )), - ) - .toList(); + ); + } + }, + ).toList(); + break; + + case OpName.nameUpdate: + spendableOutputs = availableOutputs.where( + (e) { + if (e.used == true) return false; + + final nameOp = getOpNameDataFrom(e); + if (nameOp != null) { + if (nameOp.op == OpName.nameFirstUpdate || + nameOp.op == OpName.nameUpdate) { + final confirmed = e.isConfirmed( + currentChainHeight, + cryptoCurrency.minConfirms, + cryptoCurrency.minCoinbaseConfirms, + overrideMinConfirms: kNameWaitBlocks, + ); + + if (confirmed) { + nameOutputCountCheck(); + } + return confirmed; + } else { + return false; + } + } else { + return canCPFP || + e.isConfirmed( + currentChainHeight, + cryptoCurrency.minConfirms, + cryptoCurrency.minCoinbaseConfirms, + ); + } + }, + ).toList(); + break; + } + final spendableSatoshiValue = spendableOutputs.fold(BigInt.zero, (p, e) => p + BigInt.from(e.value)); From cdffec81dfe52dfbda20faa4a7dae46597bafe56 Mon Sep 17 00:00:00 2001 From: julian Date: Thu, 13 Feb 2025 17:23:14 -0600 Subject: [PATCH 075/193] refactor auto register NAME NEW process --- .../confirm_name_transaction_view.dart | 6 +- .../namecoin_names_home_view.dart | 3 +- lib/wallets/models/name_op_state.dart | 11 +- lib/wallets/wallet/impl/namecoin_wallet.dart | 207 +++++++++++------- lib/wallets/wallet/wallet.dart | 2 +- 5 files changed, 138 insertions(+), 91 deletions(-) diff --git a/lib/pages/namecoin_names/confirm_name_transaction_view.dart b/lib/pages/namecoin_names/confirm_name_transaction_view.dart index f46fcf795..df1245da2 100644 --- a/lib/pages/namecoin_names/confirm_name_transaction_view.dart +++ b/lib/pages/namecoin_names/confirm_name_transaction_view.dart @@ -126,7 +126,11 @@ class _ConfirmNameTransactionViewState // associated name data for reg tx ref.read(secureStoreProvider).write( - key: nameSaltKeyBuilder(txData.txid!, walletId), + key: nameSaltKeyBuilder( + txData.txid!, + walletId, + txData.opNameState!.outputPosition, + ), value: encodeNameSaltData( txData.opNameState!.name, txData.opNameState!.saltHex, diff --git a/lib/pages/namecoin_names/namecoin_names_home_view.dart b/lib/pages/namecoin_names/namecoin_names_home_view.dart index 2b2a444e4..f52e55ec7 100644 --- a/lib/pages/namecoin_names/namecoin_names_home_view.dart +++ b/lib/pages/namecoin_names/namecoin_names_home_view.dart @@ -73,6 +73,7 @@ class _NamecoinNamesHomeViewState extends ConsumerState { value: "test", // TODO: get from user for automatic reg later nameScriptHex: data.$1, type: OpName.nameNew, + outputPosition: -1, //currently unknown, updated later ), feeRateType: FeeRateType.slow, // TODO: make configurable? recipients: [ @@ -89,8 +90,6 @@ class _NamecoinNamesHomeViewState extends ConsumerState { txData = await _wallet.prepareNameSend(txData: txData); - Logging.instance.f("SALTY: ${txData.opNameState!.saltHex}"); - if (mounted) { if (Util.isDesktop) { await showDialog( diff --git a/lib/wallets/models/name_op_state.dart b/lib/wallets/models/name_op_state.dart index 98ca00e2d..577663f12 100644 --- a/lib/wallets/models/name_op_state.dart +++ b/lib/wallets/models/name_op_state.dart @@ -2,13 +2,12 @@ import 'package:namecoin/namecoin.dart'; class NameOpState { final String name; - final OpName type; - final String saltHex; final String commitment; final String value; final String nameScriptHex; + final int outputPosition; NameOpState({ required this.name, @@ -17,17 +16,17 @@ class NameOpState { required this.commitment, required this.value, required this.nameScriptHex, + required this.outputPosition, }); NameOpState copyWith({ - String? walletId, String? name, - String? txid, OpName? type, String? saltHex, String? commitment, String? value, String? nameScriptHex, + int? outputPosition, }) { return NameOpState( name: name ?? this.name, @@ -36,6 +35,7 @@ class NameOpState { commitment: commitment ?? this.commitment, value: value ?? this.value, nameScriptHex: nameScriptHex ?? this.nameScriptHex, + outputPosition: outputPosition ?? this.outputPosition, ); } @@ -47,6 +47,7 @@ class NameOpState { "saltHex: $saltHex, " "commitment: $commitment, " "value: $value, " - "nameScriptHex: $nameScriptHex)"; + "nameScriptHex: $nameScriptHex, " + "outputPosition: $outputPosition)"; } } diff --git a/lib/wallets/wallet/impl/namecoin_wallet.dart b/lib/wallets/wallet/impl/namecoin_wallet.dart index cde50427b..6627449c4 100644 --- a/lib/wallets/wallet/impl/namecoin_wallet.dart +++ b/lib/wallets/wallet/impl/namecoin_wallet.dart @@ -31,8 +31,13 @@ const kNameTxVersion = 0x7100; const _kNameSaltSplitter = r"$$$$"; -String nameSaltKeyBuilder(String txid, String walletId) => - "${walletId}_${txid}_nameSaltData"; +String nameSaltKeyBuilder(String txid, String walletId, int txPos) { + if (txPos.isNegative) { + throw Exception("Invalid vout index"); + } + + return "${walletId}_${txid}_${txPos}nameSaltData"; +} String encodeNameSaltData(String name, String salt, String value) => "$name$_kNameSaltSplitter$salt$_kNameSaltSplitter$value"; @@ -461,99 +466,118 @@ class NamecoinWallet return (data: opNameData, available: available); } + // TODO: handle this differently? + final Set<(int, String)> _unknownNameNewOutputs = {}; + /// Must be called in refresh() AFTER the wallet's UTXOs have been updated! - Future checkForNameNewOPs() async { - final currentHeight = await chainHeight; - // not ideal filtering - final utxos = await mainDB - .getUTXOs(walletId) - .filter() - .otherDataIsNotNull() - .and() - .blockHeightIsNotNull() - .and() - .blockHeightLessThan(currentHeight - kNameWaitBlocks) - .findAll(); + Future checkAutoRegisterNameNewOutputs() async { + try { + final currentHeight = await chainHeight; + // not ideal filtering + final utxos = await mainDB + .getUTXOs(walletId) + .filter() + .otherDataIsNotNull() + .and() + .blockHeightIsNotNull() + .and() + .blockHeightGreaterThan(0) + .and() + .blockHeightLessThan(currentHeight - kNameWaitBlocks) + .findAll(); + + Logging.instance.t( + "_unknownNameNewOutputs(count=${_unknownNameNewOutputs.length})" + ":\n$_unknownNameNewOutputs", + ); - for (final utxo in utxos) { - final nameOp = getOpNameDataFrom(utxo); - if (nameOp != null) { - Logging.instance.t( - "Found OpName: $nameOp", - stackTrace: StackTrace.current, - ); + // check cache and remove known auto unspendable name new outputs + utxos.removeWhere( + (e) => _unknownNameNewOutputs.contains((e.vout, e.txid))); + + for (final utxo in utxos) { + final nameOp = getOpNameDataFrom(utxo); + if (nameOp != null) { + Logging.instance.t( + "Found OpName: $nameOp\n\nIN UTXO: $utxo", + ); - if (nameOp.op == OpName.nameNew) { - // at this point we should have an unspent UTXO that is at least - // 12 blocks old which we can now do nameFirstUpdate on + if (nameOp.op == OpName.nameNew) { + // at this point we should have an unspent UTXO that is at least + // 12 blocks old which we can now do nameFirstUpdate on - //TODO: Should check if name was registered by someone else here + //TODO: Should check if name was registered by someone else here - final sKey = nameSaltKeyBuilder(utxo.txid, walletId); + final sKey = nameSaltKeyBuilder(utxo.txid, walletId, utxo.vout); - final encoded = await secureStorageInterface.read(key: sKey); - if (encoded == null) { - Logging.instance.w( - "Found OpName encoded value not found!!", - ); - continue; - } + final encoded = await secureStorageInterface.read(key: sKey); + if (encoded == null) { + Logging.instance.d( + "Found OpName NAME NEW utxo without local matching data." + "\nUTXO: $utxo" + "\nUnable to auto register.", + ); + _unknownNameNewOutputs.add((utxo.vout, utxo.txid)); + continue; + } - final data = decodeNameSaltData(encoded); + final data = decodeNameSaltData(encoded); - // verify cached matches - final myAddress = await mainDB.getAddress(walletId, utxo.address!); - final pk = await getPrivateKey(myAddress!); - final generatedSalt = scriptNameNew(data.name, pk.data).$2; + // verify cached matches + final myAddress = await mainDB.getAddress(walletId, utxo.address!); + final pk = await getPrivateKey(myAddress!); + final generatedSalt = scriptNameNew(data.name, pk.data).$2; - // TODO replace assert with proper error - assert(generatedSalt == data.salt); + // TODO replace assert with proper error + assert(generatedSalt == data.salt); - final nameScriptHex = scriptNameFirstUpdate( - data.name, - data.value, - data.salt, - ); + final nameScriptHex = scriptNameFirstUpdate( + data.name, + data.value, + data.salt, + ); - TxData txData = TxData( - opNameState: NameOpState( - name: data.name, - saltHex: data.salt, - commitment: "n/a", - value: data.value, - nameScriptHex: nameScriptHex, - type: OpName.nameFirstUpdate, - ), - feeRateType: FeeRateType.slow, // TODO: make configurable? - recipients: [ - ( - address: (await getCurrentReceivingAddress())!.value, - isChange: false, - amount: Amount.fromDecimal( - Decimal.parse("0.01"), - fractionDigits: cryptoCurrency.fractionDigits, - ), + TxData txData = TxData( + utxos: {utxo}, + opNameState: NameOpState( + name: data.name, + saltHex: data.salt, + commitment: "n/a", + value: data.value, + nameScriptHex: nameScriptHex, + type: OpName.nameFirstUpdate, + outputPosition: -1, //currently unknown, updated later ), - ], - ); + feeRateType: FeeRateType.slow, // TODO: make configurable? + recipients: [ + ( + address: (await getCurrentReceivingAddress())!.value, + isChange: false, + amount: Amount.fromDecimal( + Decimal.parse("0.01"), + fractionDigits: cryptoCurrency.fractionDigits, + ), + ), + ], + ); - txData = await prepareNameSend(txData: txData); + // generate tx + txData = await prepareNameSend(txData: txData); - txData = await confirmSend(txData: txData); + // broadcast tx + txData = await confirmSend(txData: txData); - // TODO - await secureStorageInterface.delete(key: sKey); - // TODO - await secureStorageInterface.write( - key: nameSaltKeyBuilder(txData.txid!, walletId), - value: encodeNameSaltData( - txData.opNameState!.name, - txData.opNameState!.saltHex, - txData.opNameState!.value, - ), - ); + // clear out value from local secure storage on successful registration + await secureStorageInterface.delete(key: sKey); + } } } + } catch (e, s) { + Logging.instance.e( + "checkAutoRegisterNameNewOutputs() failed", + error: e, + stackTrace: s, + ); } } @@ -603,7 +627,7 @@ class NamecoinWallet : 0xffffffff - 1; // Add transaction inputs - for (var i = 0; i < utxoSigningData.length; i++) { + for (int i = 0; i < utxoSigningData.length; i++) { final txid = utxoSigningData[i].utxo.txid; final hash = Uint8List.fromList( @@ -685,9 +709,11 @@ class NamecoinWallet ); } + int? nameOpVoutIndex; + int nonChangeCount = 0; // sanity check counter. Should only hit 1. // Add transaction outputs - for (var i = 0; i < txData.recipients!.length; i++) { + for (int i = 0; i < txData.recipients!.length; i++) { final address = coinlib.Address.fromString( normalizeAddress(txData.recipients![i].address), cryptoCurrency.networkParams, @@ -709,7 +735,13 @@ class NamecoinWallet txData.opNameState!.nameScriptHex.toUint8ListFromHex + scriptPubKey, ), ); + // redundant sanity check + if (nameOpVoutIndex != null) { + throw Exception("More than one NAME OP output detected!"); + } + nameOpVoutIndex = i; } else { + // change output output = coinlib.Output.fromAddress( txData.recipients![i].amount.raw, address, @@ -739,7 +771,7 @@ class NamecoinWallet try { // Sign the transaction accordingly - for (var i = 0; i < utxoSigningData.length; i++) { + for (int i = 0; i < utxoSigningData.length; i++) { final value = BigInt.from(utxoSigningData[i].utxo.value); coinlib.ECPrivateKey key = utxoSigningData[i].keyPair!.privateKey; @@ -767,9 +799,16 @@ class NamecoinWallet rethrow; } + if (nameOpVoutIndex == null) { + throw Exception("No NAME OP output detected!"); + } + return txData.copyWith( raw: clTx.toHex(), vSize: clTx.vSize(), + opNameState: txData.opNameState!.copyWith( + outputPosition: nameOpVoutIndex, + ), tempTx: TransactionV2( walletId: walletId, blockHash: null, @@ -799,6 +838,10 @@ class NamecoinWallet throw Exception("No recipients in attempted transaction!"); } + Logging.instance.t( + "prepareNameSend called with TxData:\n\n$txData", + ); + final feeRateType = txData.feeRateType; final customSatsPerVByte = txData.satsPerVByte; final feeRateAmount = txData.feeRateAmount; @@ -1049,7 +1092,7 @@ class NamecoinWallet final List utxoObjectsToUse = []; if (!coinControl) { - for (var i = 0; + for (int i = 0; satoshisBeingUsed < satoshiAmountToSend && i < spendableOutputs.length; i++) { diff --git a/lib/wallets/wallet/wallet.dart b/lib/wallets/wallet/wallet.dart index 9f74fbcee..161c68f5f 100644 --- a/lib/wallets/wallet/wallet.dart +++ b/lib/wallets/wallet/wallet.dart @@ -666,7 +666,7 @@ abstract class Wallet { if (this is NamecoinWallet) { await updateUTXOs(); _fireRefreshPercentChange(0.6); - await (this as NamecoinWallet).checkForNameNewOPs(); + await (this as NamecoinWallet).checkAutoRegisterNameNewOutputs(); _fireRefreshPercentChange(0.70); await updateTransactions(); } else { From 534ee512755ac42a9711ec032701497a161787b9 Mon Sep 17 00:00:00 2001 From: julian Date: Thu, 13 Feb 2025 17:36:09 -0600 Subject: [PATCH 076/193] update namecoin dns More option name and icon --- lib/pages/wallet_view/wallet_view.dart | 4 ++-- .../sub_widgets/more_features/more_features_dialog.dart | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/lib/pages/wallet_view/wallet_view.dart b/lib/pages/wallet_view/wallet_view.dart index a4a846dcf..41422c7e0 100644 --- a/lib/pages/wallet_view/wallet_view.dart +++ b/lib/pages/wallet_view/wallet_view.dart @@ -1176,8 +1176,8 @@ class _WalletViewState extends ConsumerState { ), if (wallet is NamecoinWallet) WalletNavigationBarItemData( - label: "Names", - icon: const CoinControlNavIcon(), + label: "Domains", + icon: const PaynymNavIcon(), onTap: () { Navigator.of(context).pushNamed( NamecoinNamesHomeView.routeName, diff --git a/lib/pages_desktop_specific/my_stack_view/wallet_view/sub_widgets/more_features/more_features_dialog.dart b/lib/pages_desktop_specific/my_stack_view/wallet_view/sub_widgets/more_features/more_features_dialog.dart index 72a5d0778..ef452c09b 100644 --- a/lib/pages_desktop_specific/my_stack_view/wallet_view/sub_widgets/more_features/more_features_dialog.dart +++ b/lib/pages_desktop_specific/my_stack_view/wallet_view/sub_widgets/more_features/more_features_dialog.dart @@ -479,9 +479,9 @@ class _MoreFeaturesDialogState extends ConsumerState { ), if (wallet is NamecoinWallet) _MoreFeaturesItem( - label: "Names", + label: "Domains", detail: "Namecoin DNS", - iconAsset: Assets.svg.file, + iconAsset: Assets.svg.robotHead, onPressed: () async => widget.onNamesPressed?.call(), ), if (wallet is SparkInterface && !isViewOnly) From f1e1bd0dc07019610d6ed0bb067769acd2bd7a69 Mon Sep 17 00:00:00 2001 From: julian Date: Thu, 13 Feb 2025 23:00:06 -0600 Subject: [PATCH 077/193] WIP names gui --- .../namecoin_names_home_view.dart | 289 +++----------- .../sub_widgets/buy_domain_option_widget.dart | 362 ++++++++++++++++++ .../manage_domains_option_widget.dart | 55 +++ lib/wallets/wallet/impl/namecoin_wallet.dart | 68 +++- 4 files changed, 522 insertions(+), 252 deletions(-) create mode 100644 lib/pages/namecoin_names/sub_widgets/buy_domain_option_widget.dart create mode 100644 lib/pages/namecoin_names/sub_widgets/manage_domains_option_widget.dart diff --git a/lib/pages/namecoin_names/namecoin_names_home_view.dart b/lib/pages/namecoin_names/namecoin_names_home_view.dart index f52e55ec7..8cc1e5068 100644 --- a/lib/pages/namecoin_names/namecoin_names_home_view.dart +++ b/lib/pages/namecoin_names/namecoin_names_home_view.dart @@ -1,36 +1,19 @@ -import 'dart:async'; - -import 'package:decimal/decimal.dart'; import 'package:flutter/material.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:flutter_svg/svg.dart'; -import 'package:isar/isar.dart'; -import 'package:namecoin/namecoin.dart'; -import '../../models/isar/models/blockchain_data/utxo.dart'; -import '../../providers/db/main_db_provider.dart'; -import '../../providers/global/wallets_provider.dart'; import '../../themes/stack_colors.dart'; -import '../../utilities/amount/amount.dart'; import '../../utilities/assets.dart'; -import '../../utilities/enums/fee_rate_type_enum.dart'; -import '../../utilities/logger.dart'; -import '../../utilities/show_loading.dart'; +import '../../utilities/constants.dart'; import '../../utilities/text_styles.dart'; import '../../utilities/util.dart'; -import '../../wallets/models/name_op_state.dart'; -import '../../wallets/models/tx_data.dart'; -import '../../wallets/wallet/impl/namecoin_wallet.dart'; import '../../widgets/conditional_parent.dart'; import '../../widgets/custom_buttons/app_bar_icon_button.dart'; import '../../widgets/desktop/desktop_app_bar.dart'; -import '../../widgets/desktop/desktop_dialog.dart'; import '../../widgets/desktop/desktop_scaffold.dart'; -import '../../widgets/desktop/primary_button.dart'; -import '../../widgets/desktop/secondary_button.dart'; -import '../../widgets/rounded_white_container.dart'; -import '../../widgets/stack_dialog.dart'; -import 'confirm_name_transaction_view.dart'; +import '../../widgets/toggle.dart'; +import 'sub_widgets/buy_domain_option_widget.dart'; +import 'sub_widgets/manage_domains_option_widget.dart'; class NamecoinNamesHomeView extends ConsumerStatefulWidget { const NamecoinNamesHomeView({ @@ -48,69 +31,7 @@ class NamecoinNamesHomeView extends ConsumerStatefulWidget { } class _NamecoinNamesHomeViewState extends ConsumerState { - String? lastAvailableName; - - NamecoinWallet get _wallet => - ref.read(pWallets).getWallet(widget.walletId) as NamecoinWallet; - - Future _preRegister() async { - final myAddress = await _wallet.getCurrentReceivingAddress(); - if (myAddress == null) { - throw Exception("No receiving address found"); - } - - // get address private key for deterministic salt - final pk = await _wallet.getPrivateKey(myAddress); - - final data = scriptNameNew(lastAvailableName!, pk.data); - - // TODO: fill out properly - TxData txData = TxData( - opNameState: NameOpState( - name: lastAvailableName!, - saltHex: data.$2, - commitment: data.$3, - value: "test", // TODO: get from user for automatic reg later - nameScriptHex: data.$1, - type: OpName.nameNew, - outputPosition: -1, //currently unknown, updated later - ), - feeRateType: FeeRateType.slow, // TODO: make configurable? - recipients: [ - ( - address: myAddress.value, - isChange: false, - amount: Amount.fromDecimal( - Decimal.parse("0.015"), - fractionDigits: _wallet.cryptoCurrency.fractionDigits, - ), - ), - ], - ); - - txData = await _wallet.prepareNameSend(txData: txData); - - if (mounted) { - if (Util.isDesktop) { - await showDialog( - context: context, - builder: (context) => DesktopDialog( - maxHeight: MediaQuery.of(context).size.height - 64, - maxWidth: 580, - child: ConfirmNameTransactionView( - txData: txData, - walletId: _wallet.walletId, - ), - ), - ); - } else { - await Navigator.of(context).pushNamed( - ConfirmNameTransactionView.routeName, - arguments: (txData, _wallet.walletId), - ); - } - } - } + bool _onManage = true; @override Widget build(BuildContext context) { @@ -148,7 +69,7 @@ class _NamecoinNamesHomeViewState extends ConsumerState { ), ), SvgPicture.asset( - Assets.svg.file, + Assets.svg.robotHead, width: 32, height: 32, color: Theme.of(context).extension()!.textDark, @@ -157,7 +78,7 @@ class _NamecoinNamesHomeViewState extends ConsumerState { width: 10, ), Text( - "Names", + "Domains", style: STextStyles.desktopH3(context), ), ], @@ -171,7 +92,7 @@ class _NamecoinNamesHomeViewState extends ConsumerState { ), titleSpacing: 0, title: Text( - "Names", + "Domains", style: STextStyles.navBarTitle(context), overflow: TextOverflow.ellipsis, ), @@ -188,52 +109,51 @@ class _NamecoinNamesHomeViewState extends ConsumerState { crossAxisAlignment: isDesktop ? CrossAxisAlignment.start : CrossAxisAlignment.center, children: [ - LookupNameForm( - walletId: widget.walletId, - onNameAvailable: (name) { - if (name != lastAvailableName) { - setState(() { - lastAvailableName = name; - }); - } - }, - ), - if (lastAvailableName != null) - PrimaryButton( - label: "Register $lastAvailableName", - onPressed: _preRegister, + Padding( + padding: EdgeInsets.only( + top: Util.isDesktop ? 24 : 16, + left: Util.isDesktop ? 24 : 16, + right: Util.isDesktop ? 24 : 16, ), - const SizedBox( - height: 32, - ), - Expanded( - child: StreamBuilder( - stream: ref.watch( - mainDBProvider.select( - (s) => s.isar.utxos - .where() - .walletIdEqualTo(widget.walletId) - .filter() - .otherDataIsNotNull() - .watch(fireImmediately: true), + child: SizedBox( + height: 48, + child: Toggle( + key: UniqueKey(), + onColor: Theme.of(context).extension()!.popupBG, + offColor: Theme.of(context) + .extension()! + .textFieldDefaultBG, + onText: "Buy domain", + offText: "Manage domains", + isOn: !_onManage, + onValueChanged: (value) { + setState(() { + _onManage = !value; + }); + }, + decoration: BoxDecoration( + color: Colors.transparent, + borderRadius: BorderRadius.circular( + Constants.size.circularBorderRadius, + ), ), ), - builder: (context, snapshot) { - List list = []; - if (snapshot.hasData) { - list = snapshot.data!; - } - - return ListView.separated( - itemCount: list.length, - itemBuilder: (context, index) => RoundedWhiteContainer( - child: Text(list[index].otherData!), + ), + ), + Expanded( + child: Padding( + padding: EdgeInsets.all(Util.isDesktop ? 24 : 16), + child: IndexedStack( + index: _onManage ? 0 : 1, + children: [ + BuyDomainOptionWidget( + walletId: widget.walletId, ), - separatorBuilder: (context, index) => const SizedBox( - height: 10, + ManageDomainsOptionWidget( + walletId: widget.walletId, ), - ); - }, + ], + ), ), ), ], @@ -242,116 +162,3 @@ class _NamecoinNamesHomeViewState extends ConsumerState { ); } } - -class LookupNameForm extends ConsumerStatefulWidget { - const LookupNameForm({ - super.key, - required this.walletId, - this.onNameAvailable, - }); - - final String walletId; - - final void Function(String? name)? onNameAvailable; - - @override - ConsumerState createState() => _LookupNameFormState(); -} - -class _LookupNameFormState extends ConsumerState { - final nameController = TextEditingController(); - final nameFieldFocus = FocusNode(); - - NamecoinWallet get _wallet => - ref.read(pWallets).getWallet(widget.walletId) as NamecoinWallet; - - bool _lookupLock = false; - Future _lookup() async { - if (_lookupLock) return; - _lookupLock = true; - try { - widget.onNameAvailable?.call(null); - final result = await showLoading( - whileFuture: _wallet.lookupName(nameController.text), - context: context, - message: "Looking up ${nameController.text}", - onException: (e) => throw e, - rootNavigator: Util.isDesktop, - delay: const Duration(seconds: 2), - ); - - if (result?.available == true) { - widget.onNameAvailable?.call(nameController.text); - } - - Logging.instance.i("LOOKUP RESULT: $result"); - } catch (e, s) { - widget.onNameAvailable?.call(null); - Logging.instance.e("_lookup failed", error: e, stackTrace: s); - - if (mounted) { - await showDialog( - context: context, - builder: (_) => StackOkDialog( - title: "Name lookup failed", - desktopPopRootNavigator: Util.isDesktop, - maxWidth: Util.isDesktop ? 600 : null, - ), - ); - } - } finally { - _lookupLock = false; - } - } - - @override - void initState() { - super.initState(); - WidgetsBinding.instance.addPostFrameCallback((_) { - if (mounted) { - nameFieldFocus.requestFocus(); - } - }); - } - - @override - void dispose() { - nameController.dispose(); - nameFieldFocus.dispose(); - super.dispose(); - } - - @override - Widget build(BuildContext context) { - return Column( - crossAxisAlignment: - Util.isDesktop ? CrossAxisAlignment.start : CrossAxisAlignment.center, - children: [ - TextField( - textInputAction: TextInputAction.search, - focusNode: nameFieldFocus, - controller: nameController, - onSubmitted: (_) { - if (nameController.text.isNotEmpty) { - _lookup(); - } - }, - onChanged: (_) { - // trigger look up button enabled/disabled state change - setState(() {}); - }, - ), - const SizedBox( - height: 20, - ), - SecondaryButton( - label: "Look up name", - enabled: nameController.text.isNotEmpty, - width: 160, - buttonHeight: ButtonHeight.l, - onPressed: _lookup, - ), - ], - ); - } -} diff --git a/lib/pages/namecoin_names/sub_widgets/buy_domain_option_widget.dart b/lib/pages/namecoin_names/sub_widgets/buy_domain_option_widget.dart new file mode 100644 index 000000000..feb9b93ce --- /dev/null +++ b/lib/pages/namecoin_names/sub_widgets/buy_domain_option_widget.dart @@ -0,0 +1,362 @@ +import 'dart:async'; + +import 'package:flutter/material.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:flutter_svg/svg.dart'; +import 'package:namecoin/namecoin.dart'; + +import '../../../providers/providers.dart'; +import '../../../themes/stack_colors.dart'; +import '../../../utilities/amount/amount.dart'; +import '../../../utilities/assets.dart'; +import '../../../utilities/constants.dart'; +import '../../../utilities/logger.dart'; +import '../../../utilities/show_loading.dart'; +import '../../../utilities/text_styles.dart'; +import '../../../utilities/util.dart'; +import '../../../wallets/models/name_op_state.dart'; +import '../../../wallets/models/tx_data.dart'; +import '../../../wallets/wallet/impl/namecoin_wallet.dart'; +import '../../../widgets/desktop/desktop_dialog.dart'; +import '../../../widgets/desktop/primary_button.dart'; +import '../../../widgets/desktop/secondary_button.dart'; +import '../../../widgets/rounded_white_container.dart'; +import '../../../widgets/stack_dialog.dart'; +import '../confirm_name_transaction_view.dart'; + +class BuyDomainOptionWidget extends ConsumerStatefulWidget { + const BuyDomainOptionWidget({super.key, required this.walletId}); + + final String walletId; + + @override + ConsumerState createState() => _BuyDomainWidgetState(); +} + +class _BuyDomainWidgetState extends ConsumerState { + final _nameController = TextEditingController(); + final _nameFieldFocus = FocusNode(); + + String? get formattedNameInField { + if (_nameController.text.isNotEmpty) { + if (_nameController.text.startsWith("d/")) { + return _nameController.text; + } else { + return "d/${_nameController.text}"; + } + } + return null; + } + + bool _isAvailable = false; + String? _lastLookedUpName; + + bool _lookupLock = false; + Future _lookup() async { + if (_lookupLock) return; + _lookupLock = true; + try { + _isAvailable = false; + + _lastLookedUpName = formattedNameInField; + final result = await showLoading( + whileFuture: + (ref.read(pWallets).getWallet(widget.walletId) as NamecoinWallet) + .lookupName(_lastLookedUpName!), + context: context, + message: "Searching...", + onException: (e) => throw e, + rootNavigator: Util.isDesktop, + delay: const Duration(seconds: 2), + ); + + _isAvailable = result?.nameState == NameState.available; + + if (mounted) { + setState(() {}); + } + + Logging.instance.i("LOOKUP RESULT: $result"); + } catch (e, s) { + Logging.instance.e("_lookup failed", error: e, stackTrace: s); + + if (mounted) { + await showDialog( + context: context, + builder: (_) => StackOkDialog( + title: "Name lookup failed", + desktopPopRootNavigator: Util.isDesktop, + maxWidth: Util.isDesktop ? 600 : null, + ), + ); + } + } finally { + _lookupLock = false; + } + } + + @override + void initState() { + super.initState(); + WidgetsBinding.instance.addPostFrameCallback((_) { + if (mounted) { + _nameFieldFocus.requestFocus(); + } + }); + } + + @override + void dispose() { + _nameController.dispose(); + _nameFieldFocus.dispose(); + super.dispose(); + } + + @override + Widget build(BuildContext context) { + return Column( + crossAxisAlignment: + Util.isDesktop ? CrossAxisAlignment.start : CrossAxisAlignment.center, + children: [ + SizedBox( + height: 48, + child: Row( + children: [ + Expanded( + child: Container( + height: 48, + width: 100, + decoration: BoxDecoration( + color: Theme.of(context) + .extension()! + .textFieldDefaultBG, + borderRadius: BorderRadius.only( + topLeft: Radius.circular( + Constants.size.circularBorderRadius, + ), // Adjust radius as needed + bottomLeft: + Radius.circular(Constants.size.circularBorderRadius), + ), + ), + child: Row( + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Expanded( + child: TextField( + textInputAction: TextInputAction.search, + focusNode: _nameFieldFocus, + controller: _nameController, + textAlignVertical: TextAlignVertical.center, + decoration: InputDecoration( + isDense: true, + contentPadding: EdgeInsets.zero, + prefixIcon: Padding( + padding: const EdgeInsets.all(14), + child: SvgPicture.asset( + Assets.svg.search, + width: 20, + height: 20, + color: Theme.of(context) + .extension()! + .textFieldDefaultSearchIconLeft, + ), + ), + fillColor: Colors.transparent, + hintText: "Find a domain name", + hintStyle: STextStyles.fieldLabel(context), + border: InputBorder.none, + enabledBorder: InputBorder.none, + focusedBorder: InputBorder.none, + ), + onSubmitted: (_) { + if (_nameController.text.isNotEmpty) { + _lookup(); + } + }, + onChanged: (_) { + // trigger look up button enabled/disabled state change + setState(() {}); + }, + ), + ), + ], + ), + ), + ), + Container( + height: 48, + width: 100, + decoration: BoxDecoration( + color: Theme.of(context) + .extension()! + .buttonBackPrimary, + borderRadius: BorderRadius.only( + topRight: Radius.circular( + Constants.size.circularBorderRadius, + ), // Adjust radius as needed + bottomRight: + Radius.circular(Constants.size.circularBorderRadius), + ), + ), + child: Center( + child: Text( + ".bit", + style: STextStyles.w600_14(context).copyWith( + color: Theme.of(context) + .extension()! + .buttonTextPrimary, + ), + ), + ), + ), + ], + ), + ), + SizedBox( + height: Util.isDesktop ? 24 : 16, + ), + SecondaryButton( + label: "Lookup", + enabled: _nameController.text.isNotEmpty, + // width: Util.isDesktop ? 160 : double.infinity, + buttonHeight: Util.isDesktop ? ButtonHeight.l : null, + onPressed: _lookup, + ), + const SizedBox( + height: 32, + ), + if (_lastLookedUpName != null) + _NameCard( + walletId: widget.walletId, + isAvailable: _isAvailable, + formattedName: _lastLookedUpName!, + ), + ], + ); + } +} + +class _NameCard extends ConsumerWidget { + const _NameCard({ + super.key, + required this.walletId, + required this.isAvailable, + required this.formattedName, + }); + + final String walletId; + final bool isAvailable; + final String formattedName; + + Future _preRegister( + BuildContext context, + NamecoinWallet wallet, + String value, + ) async { + final myAddress = await wallet.getCurrentReceivingAddress(); + if (myAddress == null) { + throw Exception("No receiving address found"); + } + + // get address private key for deterministic salt + final pk = await wallet.getPrivateKey(myAddress); + + final data = scriptNameNew(formattedName, pk.data); + + TxData txData = TxData( + opNameState: NameOpState( + name: formattedName, + saltHex: data.$2, + commitment: data.$3, + value: value, + nameScriptHex: data.$1, + type: OpName.nameNew, + outputPosition: -1, //currently unknown, updated later + ), + feeRateType: kNameTxDefaultFeeRate, // TODO: make configurable? + recipients: [ + ( + address: myAddress.value, + isChange: false, + amount: Amount( + rawValue: BigInt.from(kNameNewAmountSats), + fractionDigits: wallet.cryptoCurrency.fractionDigits, + ), + ), + ], + ); + + txData = await wallet.prepareNameSend(txData: txData); + + if (context.mounted) { + if (Util.isDesktop) { + await showDialog( + context: context, + builder: (context) => DesktopDialog( + maxHeight: MediaQuery.of(context).size.height - 64, + maxWidth: 580, + child: ConfirmNameTransactionView( + txData: txData, + walletId: wallet.walletId, + ), + ), + ); + } else { + await Navigator.of(context).pushNamed( + ConfirmNameTransactionView.routeName, + arguments: (txData, wallet.walletId), + ); + } + } + } + + @override + Widget build(BuildContext context, WidgetRef ref) { + final availability = isAvailable ? "Available" : "Unavailable"; + final color = isAvailable + ? Theme.of(context).extension()!.accentColorGreen + : Theme.of(context).extension()!.accentColorRed; + + final style = (Util.isDesktop + ? STextStyles.w500_16(context) + : STextStyles.w500_12(context)); + + return RoundedWhiteContainer( + padding: EdgeInsets.all(Util.isDesktop ? 24 : 16), + child: IntrinsicHeight( + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + crossAxisAlignment: CrossAxisAlignment.stretch, + children: [ + Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text( + "${formattedName.substring(2)}.bit", + style: style, + ), + Text( + availability, + style: style.copyWith( + color: color, + ), + ), + ], + ), + PrimaryButton( + label: "Buy domain", + enabled: isAvailable, + buttonHeight: ButtonHeight.m, + width: 140, + onPressed: () => _preRegister( + context, + ref.read(pWallets).getWallet(walletId) as NamecoinWallet, + ), + ), + ], + ), + ), + ); + } +} diff --git a/lib/pages/namecoin_names/sub_widgets/manage_domains_option_widget.dart b/lib/pages/namecoin_names/sub_widgets/manage_domains_option_widget.dart new file mode 100644 index 000000000..a9261c2bb --- /dev/null +++ b/lib/pages/namecoin_names/sub_widgets/manage_domains_option_widget.dart @@ -0,0 +1,55 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:isar/isar.dart'; + +import '../../../models/isar/models/blockchain_data/utxo.dart'; +import '../../../providers/db/main_db_provider.dart'; +import '../../../widgets/rounded_white_container.dart'; + +class ManageDomainsOptionWidget extends ConsumerStatefulWidget { + const ManageDomainsOptionWidget({ + super.key, + required this.walletId, + }); + + final String walletId; + + @override + ConsumerState createState() => + _ManageDomainsWidgetState(); +} + +class _ManageDomainsWidgetState + extends ConsumerState { + @override + Widget build(BuildContext context) { + return StreamBuilder( + stream: ref.watch( + mainDBProvider.select( + (s) => s.isar.utxos + .where() + .walletIdEqualTo(widget.walletId) + .filter() + .otherDataIsNotNull() + .watch(fireImmediately: true), + ), + ), + builder: (context, snapshot) { + List list = []; + if (snapshot.hasData) { + list = snapshot.data!; + } + + return ListView.separated( + itemCount: list.length, + itemBuilder: (context, index) => RoundedWhiteContainer( + child: Text(list[index].otherData!), + ), + separatorBuilder: (context, index) => const SizedBox( + height: 10, + ), + ); + }, + ); + } +} diff --git a/lib/wallets/wallet/impl/namecoin_wallet.dart b/lib/wallets/wallet/impl/namecoin_wallet.dart index 6627449c4..ff7bce0cf 100644 --- a/lib/wallets/wallet/impl/namecoin_wallet.dart +++ b/lib/wallets/wallet/impl/namecoin_wallet.dart @@ -2,7 +2,6 @@ import 'dart:convert'; import 'dart:typed_data'; import 'package:coinlib_flutter/coinlib_flutter.dart' as coinlib; -import 'package:decimal/decimal.dart'; import 'package:isar/isar.dart'; import 'package:namecoin/namecoin.dart'; @@ -28,6 +27,10 @@ import '../wallet_mixin_interfaces/rbf_interface.dart'; const kNameWaitBlocks = blocksMinToRenewName; const kNameTxVersion = 0x7100; +const kNameTxDefaultFeeRate = FeeRateType.slow; + +const kNameNewAmountSats = 150_0000; +const kNameAmountSats = 100_0000; const _kNameSaltSplitter = r"$$$$"; @@ -429,7 +432,38 @@ class NamecoinWallet // namecoin names ============================================================ - Future<({OpNameData? data, bool available})> lookupName(String name) async { + Future<({OpNameData? data, NameState nameState})> lookupName( + String name, + ) async { + // first check own utxos. Should only need to check NAME NEW here. + // NAME UPDATE and NAME FIRST UPDATE will appear readable from electrumx + final utxos = + await mainDB.getUTXOs(walletId).filter().otherDataIsNotNull().findAll(); + for (final utxo in utxos) { + final nameOp = getOpNameDataFrom(utxo); + if (nameOp?.op == OpName.nameNew) { + Logging.instance.f(utxo); + final sKey = nameSaltKeyBuilder(utxo.txid, walletId, utxo.vout); + + final encoded = await secureStorageInterface.read(key: sKey); + if (encoded == null) { + // seems this NAME NEW was created elsewhere + continue; + } + + final data = decodeNameSaltData(encoded); + Logging.instance.e( + data, + ); + if (data.name == name) { + return ( + data: null, + nameState: NameState.unavailable, + ); + } + } + } + bool available = false; final nameScriptHash = nameIdentifierToScriptHash(name); @@ -463,7 +497,10 @@ class NamecoinWallet available = true; } - return (data: opNameData, available: available); + return ( + data: opNameData, + nameState: available ? NameState.available : NameState.unavailable, + ); } // TODO: handle this differently? @@ -471,6 +508,9 @@ class NamecoinWallet /// Must be called in refresh() AFTER the wallet's UTXOs have been updated! Future checkAutoRegisterNameNewOutputs() async { + Logging.instance.t( + "$walletId checkAutoRegisterNameNewOutputs()", + ); try { final currentHeight = await chainHeight; // not ideal filtering @@ -493,7 +533,8 @@ class NamecoinWallet // check cache and remove known auto unspendable name new outputs utxos.removeWhere( - (e) => _unknownNameNewOutputs.contains((e.vout, e.txid))); + (e) => _unknownNameNewOutputs.contains((e.vout, e.txid)), + ); for (final utxo in utxos) { final nameOp = getOpNameDataFrom(utxo); @@ -548,13 +589,13 @@ class NamecoinWallet type: OpName.nameFirstUpdate, outputPosition: -1, //currently unknown, updated later ), - feeRateType: FeeRateType.slow, // TODO: make configurable? + feeRateType: kNameTxDefaultFeeRate, // TODO: make configurable? recipients: [ ( address: (await getCurrentReceivingAddress())!.value, isChange: false, - amount: Amount.fromDecimal( - Decimal.parse("0.01"), + amount: Amount( + rawValue: BigInt.from(kNameAmountSats), fractionDigits: cryptoCurrency.fractionDigits, ), ), @@ -598,12 +639,12 @@ class NamecoinWallet switch (txData.opNameState!.type) { case OpName.nameNew: assert( - nameAmount.decimal.toString() == "0.015", + nameAmount.raw == BigInt.from(kNameNewAmountSats), ); break; case OpName.nameFirstUpdate || OpName.nameUpdate: assert( - nameAmount.decimal.toString() == "0.01", + nameAmount.raw == BigInt.from(kNameAmountSats), ); break; } @@ -941,10 +982,10 @@ class NamecoinWallet final int expectedSatsValue; switch (txData.opNameState!.type) { case OpName.nameNew: - expectedSatsValue = 150_0000; + expectedSatsValue = kNameNewAmountSats; break; case OpName.nameFirstUpdate || OpName.nameUpdate: - expectedSatsValue = 100_0000; + expectedSatsValue = kNameAmountSats; break; } @@ -1365,3 +1406,8 @@ class NamecoinWallet return confirmedStatus; } } + +enum NameState { + available, + unavailable; +} From 667f2f504e0ad8238b980c9fbefbd49a15b067af Mon Sep 17 00:00:00 2001 From: julian Date: Tue, 18 Feb 2025 09:24:11 -0600 Subject: [PATCH 078/193] change particl default address type to old --- lib/wallets/crypto_currency/coins/particl.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/wallets/crypto_currency/coins/particl.dart b/lib/wallets/crypto_currency/coins/particl.dart index 067aae72d..8788b6114 100644 --- a/lib/wallets/crypto_currency/coins/particl.dart +++ b/lib/wallets/crypto_currency/coins/particl.dart @@ -219,7 +219,7 @@ class Particl extends Bip39HDCurrency with ElectrumXCurrencyInterface { int get targetBlockTimeSeconds => 600; @override - DerivePathType get defaultDerivePathType => DerivePathType.bip84; + DerivePathType get defaultDerivePathType => DerivePathType.bip44; @override Uri defaultBlockExplorer(String txid) { From cd9907db5cc26b7a0e2012210868fe38858a22e0 Mon Sep 17 00:00:00 2001 From: julian Date: Tue, 18 Feb 2025 16:18:03 -0600 Subject: [PATCH 079/193] WIP: namecoin domain name buy and add record ui --- .../dns_a_record_address_type.dart | 25 + lib/models/namecoin_dns/dns_record.dart | 90 ++++ lib/models/namecoin_dns/dns_record_type.dart | 45 ++ .../add_dns_record/add_dns_step_1.dart | 234 +++++++++ .../add_dns_record/add_dns_step_2.dart | 156 ++++++ .../add_dns_record/name_form_interface.dart | 67 +++ .../add_dns_record/sub_widgets/a_form.dart | 216 +++++++++ .../sub_widgets/cname_form.dart | 52 ++ .../add_dns_record/sub_widgets/ds_form.dart | 104 ++++ .../sub_widgets/import_form.dart | 69 +++ .../add_dns_record/sub_widgets/ns_form.dart | 54 +++ .../add_dns_record/sub_widgets/srv_form.dart | 104 ++++ .../add_dns_record/sub_widgets/ssh_form.dart | 88 ++++ .../add_dns_record/sub_widgets/tls_form.dart | 63 +++ .../add_dns_record/sub_widgets/txt_form.dart | 52 ++ lib/pages/namecoin_names/buy_domain_view.dart | 458 ++++++++++++++++++ .../sub_widgets/buy_domain_option_widget.dart | 122 ++--- lib/route_generator.dart | 16 + 18 files changed, 1944 insertions(+), 71 deletions(-) create mode 100644 lib/models/namecoin_dns/dns_a_record_address_type.dart create mode 100644 lib/models/namecoin_dns/dns_record.dart create mode 100644 lib/models/namecoin_dns/dns_record_type.dart create mode 100644 lib/pages/namecoin_names/add_dns_record/add_dns_step_1.dart create mode 100644 lib/pages/namecoin_names/add_dns_record/add_dns_step_2.dart create mode 100644 lib/pages/namecoin_names/add_dns_record/name_form_interface.dart create mode 100644 lib/pages/namecoin_names/add_dns_record/sub_widgets/a_form.dart create mode 100644 lib/pages/namecoin_names/add_dns_record/sub_widgets/cname_form.dart create mode 100644 lib/pages/namecoin_names/add_dns_record/sub_widgets/ds_form.dart create mode 100644 lib/pages/namecoin_names/add_dns_record/sub_widgets/import_form.dart create mode 100644 lib/pages/namecoin_names/add_dns_record/sub_widgets/ns_form.dart create mode 100644 lib/pages/namecoin_names/add_dns_record/sub_widgets/srv_form.dart create mode 100644 lib/pages/namecoin_names/add_dns_record/sub_widgets/ssh_form.dart create mode 100644 lib/pages/namecoin_names/add_dns_record/sub_widgets/tls_form.dart create mode 100644 lib/pages/namecoin_names/add_dns_record/sub_widgets/txt_form.dart create mode 100644 lib/pages/namecoin_names/buy_domain_view.dart diff --git a/lib/models/namecoin_dns/dns_a_record_address_type.dart b/lib/models/namecoin_dns/dns_a_record_address_type.dart new file mode 100644 index 000000000..8709baa49 --- /dev/null +++ b/lib/models/namecoin_dns/dns_a_record_address_type.dart @@ -0,0 +1,25 @@ +enum DNSAddressType { + IPv4, + IPv6, + Tor, + Freenet, + I2P, + ZeroNet; + + String get key { + switch (this) { + case DNSAddressType.IPv4: + return "ip"; + case DNSAddressType.IPv6: + return "ip6"; + case DNSAddressType.Tor: + return "_tor"; + case DNSAddressType.Freenet: + return "freenet"; + case DNSAddressType.I2P: + return "i2p"; + case DNSAddressType.ZeroNet: + return "zeronet"; + } + } +} diff --git a/lib/models/namecoin_dns/dns_record.dart b/lib/models/namecoin_dns/dns_record.dart new file mode 100644 index 000000000..ee0842b34 --- /dev/null +++ b/lib/models/namecoin_dns/dns_record.dart @@ -0,0 +1,90 @@ +import 'dart:convert'; + +import 'package:meta/meta.dart'; + +import '../../utilities/logger.dart'; +import 'dns_a_record_address_type.dart'; +import 'dns_record_type.dart'; + +@Immutable() +final class DNSRecord { + final DNSRecordType type; + final Map data; + + DNSRecord({ + required this.type, + required this.data, + }); + + String jsonDataString() => jsonEncode(data); + + DNSRecord copyWith({ + DNSRecordType? type, + DNSAddressType? addressType, + Map? data, + }) { + return DNSRecord( + type: type ?? this.type, + data: data ?? this.data, + ); + } + + @override + String toString() { + return "DNSRecord(type: $type, data: $data)"; + } + + static String merge(List records) { + final start = DateTime.now(); + + final Map result = {}; + + for (final record in records) { + switch (record.type) { + case DNSRecordType.CNAME: + if (result[record.data.keys.first] != null) { + throw Exception("CNAME record already exists"); + } + _deepMerge(result, record.data); + break; + + case DNSRecordType.TLS: + case DNSRecordType.NS: + case DNSRecordType.DS: + case DNSRecordType.SRV: + case DNSRecordType.SSH: + case DNSRecordType.TXT: + case DNSRecordType.IMPORT: + case DNSRecordType.A: + _deepMerge(result, record.data); + break; + } + } + + Logging.instance.w(DateTime.now().difference(start)); + return jsonEncode(result); + } +} + +void _deepMerge(Map base, Map updates) { + updates.forEach((key, value) { + if (value is Map && base[key] is Map) { + _deepMerge(base[key] as Map, value); + } else if (value is List && base[key] is List) { + (base[key] as List).addAll(value); + } else { + if (base[key] != null) { + throw Exception( + "Attempted to overwrite value: ${base[key]} where key=$key", + ); + } + if (value is Map) { + base[key] = Map.from(value); + } else if (value is List) { + base[key] = List.from(value); + } else { + base[key] = value; + } + } + }); +} diff --git a/lib/models/namecoin_dns/dns_record_type.dart b/lib/models/namecoin_dns/dns_record_type.dart new file mode 100644 index 000000000..c8e215194 --- /dev/null +++ b/lib/models/namecoin_dns/dns_record_type.dart @@ -0,0 +1,45 @@ +enum DNSRecordType { + A, + CNAME, + NS, + DS, + TLS, + SRV, + TXT, + IMPORT, + SSH; + + String get info { + switch (this) { + case DNSRecordType.A: + return "An A record maps your domain to an address (IPv4, IPv6, Tor," + " Freenet, I2P, or ZeroNet)."; + case DNSRecordType.CNAME: + return "A CNAME record redirects your domain to another domain," + " essentially acting as an alias."; + case DNSRecordType.NS: + return "An NS record specifies the nameservers that are authoritative" + " for your domain."; + case DNSRecordType.DS: + return "A DS record holds information about DNSSEC (DNS Security " + "Extensions) for your domain, helping with verification and " + "integrity."; + case DNSRecordType.TLS: + return "A TLS record is used for specifying details about how to " + "establish secure connections (like TLS certificates) for your" + " domain."; + case DNSRecordType.SRV: + return "An SRV record specifies the location of servers for specific" + " services, such as SIP, XMPP, or Minecraft servers."; + case DNSRecordType.TXT: + return "A TXT record allows you to add arbitrary text to your domain's" + " DNS record, often used for verification (e.g., SPF, DKIM)."; + case DNSRecordType.IMPORT: + return "An IMPORT record is used to bring in DNS records from an" + " external source into your domain's configuration."; + case DNSRecordType.SSH: + return "An SSH record provides information related to SSH public keys" + " for securely connecting to your domain's services."; + } + } +} diff --git a/lib/pages/namecoin_names/add_dns_record/add_dns_step_1.dart b/lib/pages/namecoin_names/add_dns_record/add_dns_step_1.dart new file mode 100644 index 000000000..ad59c4fc1 --- /dev/null +++ b/lib/pages/namecoin_names/add_dns_record/add_dns_step_1.dart @@ -0,0 +1,234 @@ +import 'package:dropdown_button2/dropdown_button2.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_svg/svg.dart'; + +import '../../../models/namecoin_dns/dns_record_type.dart'; +import '../../../route_generator.dart'; +import '../../../themes/stack_colors.dart'; +import '../../../utilities/assets.dart'; +import '../../../utilities/constants.dart'; +import '../../../utilities/text_styles.dart'; +import '../../../utilities/util.dart'; +import '../../../widgets/desktop/desktop_dialog.dart'; +import '../../../widgets/desktop/desktop_dialog_close_button.dart'; +import '../../../widgets/desktop/primary_button.dart'; +import '../../../widgets/desktop/secondary_button.dart'; +import '../../../widgets/stack_dialog.dart'; +import 'add_dns_step_2.dart'; + +class AddDnsStep1 extends StatefulWidget { + const AddDnsStep1({super.key}); + + @override + State createState() => _AddDnsStep1State(); +} + +class _AddDnsStep1State extends State { + DNSRecordType? _recordType; + + bool _nextLock = false; + void _next() { + if (_nextLock) return; + _nextLock = true; + try { + if (mounted) { + Navigator.of(context).push( + RouteGenerator.getRoute( + builder: (context) { + return Util.isDesktop + ? DesktopDialog( + maxHeight: double.infinity, + maxWidth: 580, + child: Column( + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Padding( + padding: const EdgeInsets.only( + left: 32, + ), + child: Text( + "Add DNS record", + style: STextStyles.desktopH3( + context, + ), + ), + ), + const DesktopDialogCloseButton(), + ], + ), + Padding( + padding: const EdgeInsets.symmetric( + horizontal: 32, + ), + child: AddDnsStep2( + recordType: _recordType!, + ), + ), + ], + ), + ) + : StackDialogBase( + child: AddDnsStep2(recordType: _recordType!), + ); + }, + ), + ); + } + } finally { + _nextLock = false; + } + } + + @override + Widget build(BuildContext context) { + return Column( + mainAxisSize: MainAxisSize.min, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + if (!Util.isDesktop) + Text( + "Add DNS record", + style: STextStyles.pageTitleH2(context), + ), + SizedBox( + height: Util.isDesktop ? 24 : 16, + ), + Text( + "Choose a record type", + style: Util.isDesktop + ? STextStyles.w500_12(context).copyWith( + color: Theme.of(context).extension()!.textDark3, + ) + : STextStyles.w500_14(context).copyWith( + color: Theme.of(context).extension()!.textDark3, + ), + ), + SizedBox( + height: Util.isDesktop ? 12 : 8, + ), + DropdownButtonHideUnderline( + child: DropdownButton2( + hint: Text( + "Choose a record type", + style: STextStyles.fieldLabel(context), + ), + dropdownStyleData: DropdownStyleData( + offset: const Offset(0, -10), + elevation: 0, + decoration: BoxDecoration( + color: Theme.of(context) + .extension()! + .textFieldDefaultBG, + borderRadius: BorderRadius.circular( + Constants.size.circularBorderRadius, + ), + ), + ), + menuItemStyleData: const MenuItemStyleData( + padding: EdgeInsets.symmetric( + horizontal: 16, + vertical: 4, + ), + ), + isExpanded: true, + value: _recordType, + onChanged: (value) { + if (value is DNSRecordType && _recordType != value) { + setState(() { + _recordType = value; + }); + } + }, + iconStyleData: IconStyleData( + icon: SvgPicture.asset( + Assets.svg.chevronDown, + width: 10, + height: 5, + color: Theme.of(context).extension()!.textDark3, + ), + ), + items: [ + ...DNSRecordType.values.map( + (e) => DropdownMenuItem( + value: e, + child: Padding( + padding: const EdgeInsets.symmetric(vertical: 4), + child: Text( + e.name, + style: STextStyles.desktopTextExtraExtraSmall(context) + .copyWith( + color: Theme.of(context) + .extension()! + .textDark, + ), + ), + ), + ), + ), + ], + ), + ), + if (_recordType != null) + SizedBox( + height: Util.isDesktop ? 10 : 6, + ), + if (_recordType != null) + Padding( + padding: const EdgeInsets.symmetric(horizontal: 12), + child: Row( + children: [ + Expanded( + child: Text( + _recordType!.info, + style: Util.isDesktop + ? STextStyles.w500_10(context).copyWith( + color: Theme.of(context) + .extension()! + .infoItemLabel, + ) + : STextStyles.w500_8(context).copyWith( + color: Theme.of(context) + .extension()! + .infoItemLabel, + ), + ), + ), + ], + ), + ), + SizedBox( + height: Util.isDesktop ? 24 : 16, + ), + Row( + children: [ + Expanded( + child: SecondaryButton( + label: "Cancel", + buttonHeight: ButtonHeight.l, + onPressed: () { + Navigator.of(context, rootNavigator: true).pop(); + }, + ), + ), + const SizedBox( + width: 16, + ), + Expanded( + child: PrimaryButton( + label: "Next", + enabled: _recordType != null, + onPressed: _next, + buttonHeight: ButtonHeight.l, + ), + ), + ], + ), + SizedBox( + height: Util.isDesktop ? 32 : 16, + ), + ], + ); + } +} diff --git a/lib/pages/namecoin_names/add_dns_record/add_dns_step_2.dart b/lib/pages/namecoin_names/add_dns_record/add_dns_step_2.dart new file mode 100644 index 000000000..13b127bfc --- /dev/null +++ b/lib/pages/namecoin_names/add_dns_record/add_dns_step_2.dart @@ -0,0 +1,156 @@ +import 'package:flutter/material.dart'; + +import '../../../models/namecoin_dns/dns_record_type.dart'; +import '../../../utilities/logger.dart'; +import '../../../utilities/text_styles.dart'; +import '../../../utilities/util.dart'; +import '../../../widgets/desktop/primary_button.dart'; +import '../../../widgets/desktop/secondary_button.dart'; +import '../../../widgets/stack_dialog.dart'; +import 'name_form_interface.dart'; +import 'sub_widgets/a_form.dart'; +import 'sub_widgets/cname_form.dart'; +import 'sub_widgets/ds_form.dart'; +import 'sub_widgets/import_form.dart'; +import 'sub_widgets/ns_form.dart'; +import 'sub_widgets/srv_form.dart'; +import 'sub_widgets/ssh_form.dart'; +import 'sub_widgets/tls_form.dart'; +import 'sub_widgets/txt_form.dart'; + +class AddDnsStep2 extends StatefulWidget { + const AddDnsStep2({super.key, required this.recordType}); + final DNSRecordType recordType; + + @override + State createState() => _AddDnsStep2State(); +} + +class _AddDnsStep2State extends State { + final GlobalKey _formStateKey = GlobalKey(); + + bool _nextLock = false; + void _nextPressed() { + if (_nextLock) return; + _nextLock = true; + try { + final record = _formStateKey.currentState!.buildRecord(); + Navigator.of(context, rootNavigator: true).pop( + record, + ); + } catch (e, s) { + Logging.instance.e( + runtimeType, + error: e, + stackTrace: s, + ); + + final String err; + switch (e.runtimeType) { + case const (ArgumentError): + err = e.toString().replaceFirst( + "Invalid Arguments(s): ", + "", + ); + + case const (Exception): + err = e.toString().replaceFirst( + "Exception: ", + "", + ); + + default: + err = e.toString(); + } + + showDialog( + context: context, + useRootNavigator: true, + builder: (context) { + return StackOkDialog( + desktopPopRootNavigator: true, // mobile as well due to sub nav flow + title: "Error", + maxWidth: 500, + message: err, + ); + }, + ); + } finally { + _nextLock = false; + } + } + + NameFormStatefulWidget? _form; + NameFormStatefulWidget get form => _form ??= _buildForm(); + + NameFormStatefulWidget _buildForm() { + switch (widget.recordType) { + case DNSRecordType.A: + return AForm(key: _formStateKey); + case DNSRecordType.CNAME: + return CNAMEForm(key: _formStateKey); + case DNSRecordType.NS: + return NSForm(key: _formStateKey); + case DNSRecordType.DS: + return DSForm(key: _formStateKey); + case DNSRecordType.TLS: + return TLSForm(key: _formStateKey); + case DNSRecordType.SRV: + return SRVForm(key: _formStateKey); + case DNSRecordType.TXT: + return TXTForm(key: _formStateKey); + case DNSRecordType.IMPORT: + return IMPORTForm(key: _formStateKey); + case DNSRecordType.SSH: + return SSHForm(key: _formStateKey); + } + } + + @override + Widget build(BuildContext context) { + return Column( + mainAxisSize: MainAxisSize.min, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + if (!Util.isDesktop) + Text( + "Add DNS record", + style: STextStyles.pageTitleH2(context), + ), + SizedBox( + height: Util.isDesktop ? 24 : 16, + ), + form, + SizedBox( + height: Util.isDesktop ? 24 : 16, + ), + Row( + children: [ + Expanded( + child: SecondaryButton( + label: "Cancel", + buttonHeight: ButtonHeight.l, + onPressed: () { + Navigator.of(context).pop(); + }, + ), + ), + const SizedBox( + width: 16, + ), + Expanded( + child: PrimaryButton( + label: "Next", + onPressed: _nextPressed, + buttonHeight: ButtonHeight.l, + ), + ), + ], + ), + SizedBox( + height: Util.isDesktop ? 32 : 16, + ), + ], + ); + } +} diff --git a/lib/pages/namecoin_names/add_dns_record/name_form_interface.dart b/lib/pages/namecoin_names/add_dns_record/name_form_interface.dart new file mode 100644 index 000000000..6fff33894 --- /dev/null +++ b/lib/pages/namecoin_names/add_dns_record/name_form_interface.dart @@ -0,0 +1,67 @@ +import 'package:flutter/material.dart'; + +import '../../../models/namecoin_dns/dns_record.dart'; +import '../../../themes/stack_colors.dart'; +import '../../../utilities/constants.dart'; +import '../../../utilities/text_styles.dart'; +import '../../../utilities/util.dart'; + +abstract class NameFormStatefulWidget extends StatefulWidget { + const NameFormStatefulWidget({super.key}); +} + +abstract class NameFormState + extends State { + DNSRecord buildRecord(); +} + +class DNSFieldText extends StatelessWidget { + const DNSFieldText(this.text, {super.key}); + + final String text; + + @override + Widget build(BuildContext context) { + return Text( + text, + style: Util.isDesktop + ? STextStyles.w500_12(context).copyWith( + color: Theme.of(context).extension()!.textDark3, + ) + : STextStyles.w500_14(context).copyWith( + color: Theme.of(context).extension()!.textDark3, + ), + ); + } +} + +class DNSFormField extends StatelessWidget { + const DNSFormField({super.key, required this.controller, this.keyboardType}); + + final TextEditingController controller; + final TextInputType? keyboardType; + + @override + Widget build(BuildContext context) { + return ClipRRect( + borderRadius: BorderRadius.circular( + Constants.size.circularBorderRadius, + ), + child: TextField( + controller: controller, + textAlignVertical: TextAlignVertical.center, + keyboardType: keyboardType, + decoration: InputDecoration( + isDense: true, + contentPadding: const EdgeInsets.all(16), + fillColor: Colors.transparent, + // hintText: "e.g. ns1.stackwallet.com.", + hintStyle: STextStyles.fieldLabel(context), + border: InputBorder.none, + enabledBorder: InputBorder.none, + focusedBorder: InputBorder.none, + ), + ), + ); + } +} diff --git a/lib/pages/namecoin_names/add_dns_record/sub_widgets/a_form.dart b/lib/pages/namecoin_names/add_dns_record/sub_widgets/a_form.dart new file mode 100644 index 000000000..fe120f17d --- /dev/null +++ b/lib/pages/namecoin_names/add_dns_record/sub_widgets/a_form.dart @@ -0,0 +1,216 @@ +import 'dart:io'; + +import 'package:dropdown_button2/dropdown_button2.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_svg/svg.dart'; + +import '../../../../models/namecoin_dns/dns_a_record_address_type.dart'; +import '../../../../models/namecoin_dns/dns_record.dart'; +import '../../../../models/namecoin_dns/dns_record_type.dart'; +import '../../../../themes/stack_colors.dart'; +import '../../../../utilities/assets.dart'; +import '../../../../utilities/constants.dart'; +import '../../../../utilities/text_styles.dart'; +import '../../../../utilities/util.dart'; +import '../name_form_interface.dart'; + +class AForm extends NameFormStatefulWidget { + const AForm({super.key}); + + @override + NameFormState createState() => _AFormState(); +} + +class _AFormState extends NameFormState { + final _addressDataController = TextEditingController(); + final _addressDataFieldFocus = FocusNode(); + + DNSAddressType? _addressType; + + @override + DNSRecord buildRecord() { + final parts = _addressDataController.text.split(",").map((e) => e.trim()); + + final List addresses = []; + + for (final part in parts) { + switch (_addressType!) { + case DNSAddressType.IPv4: + final address = + InternetAddress(part.trim(), type: InternetAddressType.IPv4); + addresses.add(address.address); + break; + + case DNSAddressType.IPv6: + final address = InternetAddress(part, type: InternetAddressType.IPv6); + addresses.add(address.address); + break; + + case DNSAddressType.Tor: + final regex = RegExp(r'^[a-z2-7]{56}\.onion$'); + if (regex.hasMatch(part)) { + addresses.add(part); + } else { + throw Exception("Invalid tor address: $part"); + } + + case DNSAddressType.Freenet: + // TODO: verify + final regex = RegExp(r'(CHK|SSK|USK)@[a-zA-Z0-9~-]{43,}/?'); + final kskRegex = RegExp(r'KSK@[\w\-.~]+'); + if (regex.hasMatch(part) || kskRegex.hasMatch(part)) { + addresses.add(part); + } else { + throw Exception("Invalid freenet address: $part"); + } + + case DNSAddressType.I2P: + // TODO: verify + final b32Regex = RegExp(r'^[a-z2-7]{52}\.b32\.i2p$'); + final b64Regex = RegExp(r'^[A-Za-z0-9+/=]{516,}$'); + if (b32Regex.hasMatch(part) || b64Regex.hasMatch(part)) { + addresses.add(part); + } else { + throw Exception("Invalid i2p address: $part"); + } + + case DNSAddressType.ZeroNet: + // TODO: verify + final regex = RegExp(r'^[13][a-km-zA-HJ-NP-Z1-9]{32,33}$'); + if (regex.hasMatch(part)) { + addresses.add(part); + } else { + throw Exception("Invalid zeronet address: $part"); + } + } + } + + final Map map; + + if (_addressType == DNSAddressType.Tor) { + map = { + "map": { + "_tor": { + "txt": addresses, + }, + }, + }; + } else { + map = { + _addressType!.key: addresses, + }; + } + + return DNSRecord( + type: DNSRecordType.A, + data: map, + ); + } + + @override + void dispose() { + _addressDataController.dispose(); + _addressDataFieldFocus.dispose(); + super.dispose(); + } + + @override + Widget build(BuildContext context) { + return Column( + mainAxisSize: MainAxisSize.min, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + const DNSFieldText( + "Address type", + ), + DropdownButtonHideUnderline( + child: DropdownButton2( + hint: Text( + "Choose address type", + style: STextStyles.fieldLabel(context), + ), + dropdownStyleData: DropdownStyleData( + offset: const Offset(0, -10), + elevation: 0, + decoration: BoxDecoration( + color: Theme.of(context) + .extension()! + .textFieldDefaultBG, + borderRadius: BorderRadius.circular( + Constants.size.circularBorderRadius, + ), + ), + ), + menuItemStyleData: const MenuItemStyleData( + padding: EdgeInsets.symmetric( + horizontal: 16, + vertical: 4, + ), + ), + isExpanded: true, + value: _addressType, + onChanged: (value) { + if (value is DNSAddressType && _addressType != value) { + setState(() { + _addressType = value; + }); + } + }, + iconStyleData: IconStyleData( + icon: SvgPicture.asset( + Assets.svg.chevronDown, + width: 10, + height: 5, + color: Theme.of(context).extension()!.textDark3, + ), + ), + items: [ + ...DNSAddressType.values.map( + (e) => DropdownMenuItem( + value: e, + child: Padding( + padding: const EdgeInsets.symmetric(vertical: 4), + child: Text( + e.name, + style: STextStyles.desktopTextExtraExtraSmall(context) + .copyWith( + color: Theme.of(context) + .extension()! + .textDark, + ), + ), + ), + ), + ), + ], + ), + ), + SizedBox( + height: Util.isDesktop ? 24 : 16, + ), + ClipRRect( + borderRadius: BorderRadius.circular( + Constants.size.circularBorderRadius, + ), + child: TextField( + focusNode: _addressDataFieldFocus, + controller: _addressDataController, + textAlignVertical: TextAlignVertical.center, + maxLines: 3, + decoration: InputDecoration( + isDense: true, + contentPadding: const EdgeInsets.all(16), + fillColor: Colors.transparent, + hintText: "e.g. 255.255.255.255, " + "76f4a520a262c269dcba66bc1f560452e30a44e14ce6b37ce20b8.onion", + hintStyle: STextStyles.fieldLabel(context), + border: InputBorder.none, + enabledBorder: InputBorder.none, + focusedBorder: InputBorder.none, + ), + ), + ), + ], + ); + } +} diff --git a/lib/pages/namecoin_names/add_dns_record/sub_widgets/cname_form.dart b/lib/pages/namecoin_names/add_dns_record/sub_widgets/cname_form.dart new file mode 100644 index 000000000..0c83a6b56 --- /dev/null +++ b/lib/pages/namecoin_names/add_dns_record/sub_widgets/cname_form.dart @@ -0,0 +1,52 @@ +import 'package:flutter/material.dart'; + +import '../../../../models/namecoin_dns/dns_record.dart'; +import '../../../../models/namecoin_dns/dns_record_type.dart'; +import '../../../../utilities/util.dart'; +import '../name_form_interface.dart'; + +class CNAMEForm extends NameFormStatefulWidget { + const CNAMEForm({super.key}); + + @override + NameFormState createState() => _CNAMEFormState(); +} + +class _CNAMEFormState extends NameFormState { + final _aliasController = TextEditingController(); + + @override + DNSRecord buildRecord() { + final address = _aliasController.text.trim(); + + return DNSRecord( + type: DNSRecordType.CNAME, + data: {"alias": address}, + ); + } + + @override + void dispose() { + _aliasController.dispose(); + super.dispose(); + } + + @override + Widget build(BuildContext context) { + return Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisSize: MainAxisSize.min, + children: [ + const DNSFieldText( + "Alias of", + ), + SizedBox( + height: Util.isDesktop ? 10 : 8, + ), + DNSFormField( + controller: _aliasController, + ), + ], + ); + } +} diff --git a/lib/pages/namecoin_names/add_dns_record/sub_widgets/ds_form.dart b/lib/pages/namecoin_names/add_dns_record/sub_widgets/ds_form.dart new file mode 100644 index 000000000..dbab0d28f --- /dev/null +++ b/lib/pages/namecoin_names/add_dns_record/sub_widgets/ds_form.dart @@ -0,0 +1,104 @@ +import 'package:flutter/material.dart'; + +import '../../../../models/namecoin_dns/dns_record.dart'; +import '../../../../models/namecoin_dns/dns_record_type.dart'; +import '../../../../utilities/util.dart'; +import '../name_form_interface.dart'; + +class DSForm extends NameFormStatefulWidget { + const DSForm({super.key}); + + @override + NameFormState createState() => _DSFormState(); +} + +class _DSFormState extends NameFormState { + final _keytagController = TextEditingController(); + final _algoController = TextEditingController(); + final _typeController = TextEditingController(); + final _hashController = TextEditingController(); + + @override + DNSRecord buildRecord() { + return DNSRecord( + type: DNSRecordType.DS, + data: { + "ds": [ + [ + int.parse(_keytagController.text.trim()), + int.parse(_algoController.text.trim()), + int.parse(_typeController.text.trim()), + _hashController.text.trim(), + ], + ], + }, + ); + } + + @override + void dispose() { + _keytagController.dispose(); + _algoController.dispose(); + _typeController.dispose(); + _hashController.dispose(); + super.dispose(); + } + + @override + Widget build(BuildContext context) { + return Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisSize: MainAxisSize.min, + children: [ + const DNSFieldText( + "Keytag", + ), + SizedBox( + height: Util.isDesktop ? 10 : 8, + ), + DNSFormField( + controller: _keytagController, + keyboardType: TextInputType.number, + ), + SizedBox( + height: Util.isDesktop ? 24 : 16, + ), + const DNSFieldText( + "Algorithm", + ), + SizedBox( + height: Util.isDesktop ? 10 : 8, + ), + DNSFormField( + controller: _algoController, + keyboardType: TextInputType.number, + ), + SizedBox( + height: Util.isDesktop ? 24 : 16, + ), + const DNSFieldText( + "Hash type", + ), + SizedBox( + height: Util.isDesktop ? 10 : 8, + ), + DNSFormField( + controller: _typeController, + keyboardType: TextInputType.number, + ), + SizedBox( + height: Util.isDesktop ? 24 : 16, + ), + const DNSFieldText( + "Hash (base64)", + ), + SizedBox( + height: Util.isDesktop ? 10 : 8, + ), + DNSFormField( + controller: _hashController, + ), + ], + ); + } +} diff --git a/lib/pages/namecoin_names/add_dns_record/sub_widgets/import_form.dart b/lib/pages/namecoin_names/add_dns_record/sub_widgets/import_form.dart new file mode 100644 index 000000000..02c95a3ee --- /dev/null +++ b/lib/pages/namecoin_names/add_dns_record/sub_widgets/import_form.dart @@ -0,0 +1,69 @@ +import 'package:flutter/material.dart'; + +import '../../../../models/namecoin_dns/dns_record.dart'; +import '../../../../models/namecoin_dns/dns_record_type.dart'; +import '../../../../utilities/util.dart'; +import '../name_form_interface.dart'; + +class IMPORTForm extends NameFormStatefulWidget { + const IMPORTForm({super.key}); + + @override + NameFormState createState() => _IMPORTFormState(); +} + +class _IMPORTFormState extends NameFormState { + final _nameController = TextEditingController(); + final _subdomainController = TextEditingController(); + + @override + DNSRecord buildRecord() { + return DNSRecord( + type: DNSRecordType.IMPORT, + data: { + "import": [ + [ + _nameController.text.trim(), + if (_subdomainController.text.trim().isNotEmpty) + _subdomainController.text.trim(), + ], + ], + }, + ); + } + + @override + void dispose() { + _nameController.dispose(); + _subdomainController.dispose(); + super.dispose(); + } + + @override + Widget build(BuildContext context) { + return Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisSize: MainAxisSize.min, + children: [ + const DNSFieldText( + "Namecoin name", + ), + SizedBox( + height: Util.isDesktop ? 10 : 8, + ), + DNSFormField( + controller: _nameController, + ), + const DNSFieldText( + "Subdomain (optional)", + ), + SizedBox( + height: Util.isDesktop ? 10 : 8, + ), + DNSFormField( + controller: _subdomainController, + ), + ], + ); + } +} diff --git a/lib/pages/namecoin_names/add_dns_record/sub_widgets/ns_form.dart b/lib/pages/namecoin_names/add_dns_record/sub_widgets/ns_form.dart new file mode 100644 index 000000000..604a5736c --- /dev/null +++ b/lib/pages/namecoin_names/add_dns_record/sub_widgets/ns_form.dart @@ -0,0 +1,54 @@ +import 'package:flutter/material.dart'; + +import '../../../../models/namecoin_dns/dns_record.dart'; +import '../../../../models/namecoin_dns/dns_record_type.dart'; +import '../../../../utilities/util.dart'; +import '../name_form_interface.dart'; + +class NSForm extends NameFormStatefulWidget { + const NSForm({super.key}); + + @override + NameFormState createState() => _NSFormState(); +} + +class _NSFormState extends NameFormState { + final _serverController = TextEditingController(); + + @override + DNSRecord buildRecord() { + final address = _serverController.text.trim(); + + return DNSRecord( + type: DNSRecordType.NS, + data: { + "ns": [address], + }, + ); + } + + @override + void dispose() { + _serverController.dispose(); + super.dispose(); + } + + @override + Widget build(BuildContext context) { + return Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisSize: MainAxisSize.min, + children: [ + const DNSFieldText( + "Nameserver", + ), + SizedBox( + height: Util.isDesktop ? 10 : 8, + ), + DNSFormField( + controller: _serverController, + ), + ], + ); + } +} diff --git a/lib/pages/namecoin_names/add_dns_record/sub_widgets/srv_form.dart b/lib/pages/namecoin_names/add_dns_record/sub_widgets/srv_form.dart new file mode 100644 index 000000000..dff066abf --- /dev/null +++ b/lib/pages/namecoin_names/add_dns_record/sub_widgets/srv_form.dart @@ -0,0 +1,104 @@ +import 'package:flutter/material.dart'; + +import '../../../../models/namecoin_dns/dns_record.dart'; +import '../../../../models/namecoin_dns/dns_record_type.dart'; +import '../../../../utilities/util.dart'; +import '../name_form_interface.dart'; + +class SRVForm extends NameFormStatefulWidget { + const SRVForm({super.key}); + + @override + NameFormState createState() => _SRVFormState(); +} + +class _SRVFormState extends NameFormState { + final _priorityController = TextEditingController(); + final _weightController = TextEditingController(); + final _portController = TextEditingController(); + final _hostController = TextEditingController(); + + @override + DNSRecord buildRecord() { + return DNSRecord( + type: DNSRecordType.SRV, + data: { + "srv": [ + [ + int.parse(_priorityController.text.trim()), + int.parse(_weightController.text.trim()), + int.parse(_portController.text.trim()), + _hostController.text.trim(), + ], + ], + }, + ); + } + + @override + void dispose() { + _priorityController.dispose(); + _weightController.dispose(); + _portController.dispose(); + _hostController.dispose(); + super.dispose(); + } + + @override + Widget build(BuildContext context) { + return Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisSize: MainAxisSize.min, + children: [ + const DNSFieldText( + "Priority", + ), + SizedBox( + height: Util.isDesktop ? 10 : 8, + ), + DNSFormField( + controller: _priorityController, + keyboardType: TextInputType.number, + ), + SizedBox( + height: Util.isDesktop ? 24 : 16, + ), + const DNSFieldText( + "Weight", + ), + SizedBox( + height: Util.isDesktop ? 10 : 8, + ), + DNSFormField( + controller: _weightController, + keyboardType: TextInputType.number, + ), + SizedBox( + height: Util.isDesktop ? 24 : 16, + ), + const DNSFieldText( + "Port", + ), + SizedBox( + height: Util.isDesktop ? 10 : 8, + ), + DNSFormField( + controller: _portController, + keyboardType: TextInputType.number, + ), + SizedBox( + height: Util.isDesktop ? 24 : 16, + ), + const DNSFieldText( + "Host", + ), + SizedBox( + height: Util.isDesktop ? 10 : 8, + ), + DNSFormField( + controller: _hostController, + ), + ], + ); + } +} diff --git a/lib/pages/namecoin_names/add_dns_record/sub_widgets/ssh_form.dart b/lib/pages/namecoin_names/add_dns_record/sub_widgets/ssh_form.dart new file mode 100644 index 000000000..9be1cbb8b --- /dev/null +++ b/lib/pages/namecoin_names/add_dns_record/sub_widgets/ssh_form.dart @@ -0,0 +1,88 @@ +import 'package:flutter/material.dart'; + +import '../../../../models/namecoin_dns/dns_record.dart'; +import '../../../../models/namecoin_dns/dns_record_type.dart'; +import '../../../../utilities/util.dart'; +import '../name_form_interface.dart'; + +class SSHForm extends NameFormStatefulWidget { + const SSHForm({super.key}); + + @override + NameFormState createState() => _SSHFormState(); +} + +class _SSHFormState extends NameFormState { + final _algoController = TextEditingController(); + final _fingerprintTypeController = TextEditingController(); + final _fingerprintController = TextEditingController(); + + @override + DNSRecord buildRecord() { + return DNSRecord( + type: DNSRecordType.SSH, + data: { + "sshfp": [ + [ + int.parse(_algoController.text.trim()), + int.parse(_fingerprintTypeController.text.trim()), + _fingerprintController.text.trim(), + ], + ], + }, + ); + } + + @override + void dispose() { + _algoController.dispose(); + _fingerprintTypeController.dispose(); + _fingerprintController.dispose(); + super.dispose(); + } + + @override + Widget build(BuildContext context) { + return Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisSize: MainAxisSize.min, + children: [ + const DNSFieldText( + "Algorithm", + ), + SizedBox( + height: Util.isDesktop ? 10 : 8, + ), + DNSFormField( + controller: _algoController, + keyboardType: TextInputType.number, + ), + SizedBox( + height: Util.isDesktop ? 24 : 16, + ), + const DNSFieldText( + "Fingerprint type", + ), + SizedBox( + height: Util.isDesktop ? 10 : 8, + ), + DNSFormField( + controller: _fingerprintTypeController, + keyboardType: TextInputType.number, + ), + SizedBox( + height: Util.isDesktop ? 24 : 16, + ), + const DNSFieldText( + "Fingerprint (base64)", + ), + SizedBox( + height: Util.isDesktop ? 10 : 8, + ), + DNSFormField( + controller: _fingerprintController, + ), + ], + ); + } +} diff --git a/lib/pages/namecoin_names/add_dns_record/sub_widgets/tls_form.dart b/lib/pages/namecoin_names/add_dns_record/sub_widgets/tls_form.dart new file mode 100644 index 000000000..bf2b1a33e --- /dev/null +++ b/lib/pages/namecoin_names/add_dns_record/sub_widgets/tls_form.dart @@ -0,0 +1,63 @@ +import 'package:flutter/material.dart'; + +import '../../../../models/namecoin_dns/dns_record.dart'; +import '../../../../models/namecoin_dns/dns_record_type.dart'; +import '../../../../utilities/util.dart'; +import '../name_form_interface.dart'; + +class TLSForm extends NameFormStatefulWidget { + const TLSForm({super.key}); + + @override + NameFormState createState() => _TLSFormState(); +} + +class _TLSFormState extends NameFormState { + final _pubkeyController = TextEditingController(); + + @override + DNSRecord buildRecord() { + return DNSRecord( + type: DNSRecordType.TLS, + data: { + "map": { + "*": { + "tls": [ + [ + 2, + 1, + 0, + _pubkeyController.text.trim(), + ], + ], + }, + }, + }, + ); + } + + @override + void dispose() { + _pubkeyController.dispose(); + super.dispose(); + } + + @override + Widget build(BuildContext context) { + return Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisSize: MainAxisSize.min, + children: [ + const DNSFieldText( + "DANE-TA public key (base64)", + ), + SizedBox( + height: Util.isDesktop ? 10 : 8, + ), + DNSFormField( + controller: _pubkeyController, + ), + ], + ); + } +} diff --git a/lib/pages/namecoin_names/add_dns_record/sub_widgets/txt_form.dart b/lib/pages/namecoin_names/add_dns_record/sub_widgets/txt_form.dart new file mode 100644 index 000000000..64f2111b7 --- /dev/null +++ b/lib/pages/namecoin_names/add_dns_record/sub_widgets/txt_form.dart @@ -0,0 +1,52 @@ +import 'package:flutter/material.dart'; + +import '../../../../models/namecoin_dns/dns_record.dart'; +import '../../../../models/namecoin_dns/dns_record_type.dart'; +import '../../../../utilities/util.dart'; +import '../name_form_interface.dart'; + +class TXTForm extends NameFormStatefulWidget { + const TXTForm({super.key}); + + @override + NameFormState createState() => _TXTFormState(); +} + +class _TXTFormState extends NameFormState { + final _valueController = TextEditingController(); + + @override + DNSRecord buildRecord() { + return DNSRecord( + type: DNSRecordType.TXT, + data: { + "txt": [_valueController.text.trim()], + }, + ); + } + + @override + void dispose() { + _valueController.dispose(); + super.dispose(); + } + + @override + Widget build(BuildContext context) { + return Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisSize: MainAxisSize.min, + children: [ + const DNSFieldText( + "Value", + ), + SizedBox( + height: Util.isDesktop ? 10 : 8, + ), + DNSFormField( + controller: _valueController, + ), + ], + ); + } +} diff --git a/lib/pages/namecoin_names/buy_domain_view.dart b/lib/pages/namecoin_names/buy_domain_view.dart new file mode 100644 index 000000000..b9a30a24f --- /dev/null +++ b/lib/pages/namecoin_names/buy_domain_view.dart @@ -0,0 +1,458 @@ +import 'dart:async'; + +import 'package:flutter/material.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:namecoin/namecoin.dart'; + +import '../../../providers/providers.dart'; +import '../../../utilities/amount/amount.dart'; +import '../../../utilities/logger.dart'; +import '../../../utilities/util.dart'; +import '../../../wallets/models/name_op_state.dart'; +import '../../../wallets/models/tx_data.dart'; +import '../../../wallets/wallet/impl/namecoin_wallet.dart'; +import '../../../widgets/desktop/desktop_dialog.dart'; +import '../../../widgets/desktop/primary_button.dart'; +import '../../../widgets/desktop/secondary_button.dart'; +import '../../../widgets/stack_dialog.dart'; +import '../../models/namecoin_dns/dns_record.dart'; +import '../../route_generator.dart'; +import '../../themes/stack_colors.dart'; +import '../../utilities/amount/amount_formatter.dart'; +import '../../utilities/text_styles.dart'; +import '../../wallets/isar/providers/wallet_info_provider.dart'; +import '../../widgets/background.dart'; +import '../../widgets/conditional_parent.dart'; +import '../../widgets/custom_buttons/app_bar_icon_button.dart'; +import '../../widgets/custom_buttons/blue_text_button.dart'; +import '../../widgets/desktop/desktop_dialog_close_button.dart'; +import '../../widgets/rounded_white_container.dart'; +import 'add_dns_record/add_dns_step_1.dart'; +import 'confirm_name_transaction_view.dart'; + +class BuyDomainView extends ConsumerStatefulWidget { + const BuyDomainView({ + super.key, + required this.walletId, + required this.domainName, + }); + + final String walletId; + final String domainName; + + static const routeName = "/buyDomainView"; + + @override + ConsumerState createState() => _BuyDomainWidgetState(); +} + +class _BuyDomainWidgetState extends ConsumerState { + bool _settingsHidden = true; + final List _dnsRecords = []; + + String _getFormattedDNSRecords() { + if (_dnsRecords.isEmpty) return ""; + + return DNSRecord.merge(_dnsRecords); + } + + bool _preRegLock = false; + Future _preRegister() async { + if (_preRegLock) return; + _preRegLock = true; + try { + final wallet = + ref.read(pWallets).getWallet(widget.walletId) as NamecoinWallet; + final myAddress = await wallet.getCurrentReceivingAddress(); + if (myAddress == null) { + throw Exception("No receiving address found"); + } + + final value = _getFormattedDNSRecords(); + + Logging.instance.f(value); + + // get address private key for deterministic salt + final pk = await wallet.getPrivateKey(myAddress); + + String formattedName = widget.domainName; + if (!formattedName.startsWith("d/")) { + formattedName = "d/$formattedName"; + } + if (formattedName.endsWith(".bit")) { + formattedName.split(".bit").first; + } + + final data = scriptNameNew(formattedName, pk.data); + + TxData txData = TxData( + opNameState: NameOpState( + name: formattedName, + saltHex: data.$2, + commitment: data.$3, + value: value, + nameScriptHex: data.$1, + type: OpName.nameNew, + outputPosition: -1, //currently unknown, updated later + ), + feeRateType: kNameTxDefaultFeeRate, // TODO: make configurable? + recipients: [ + ( + address: myAddress.value, + isChange: false, + amount: Amount( + rawValue: BigInt.from(kNameNewAmountSats), + fractionDigits: wallet.cryptoCurrency.fractionDigits, + ), + ), + ], + ); + + txData = await wallet.prepareNameSend(txData: txData); + + if (mounted) { + if (Util.isDesktop) { + await showDialog( + context: context, + builder: (context) => DesktopDialog( + maxHeight: MediaQuery.of(context).size.height - 64, + maxWidth: 580, + child: ConfirmNameTransactionView( + txData: txData, + walletId: wallet.walletId, + ), + ), + ); + } else { + await Navigator.of(context).pushNamed( + ConfirmNameTransactionView.routeName, + arguments: (txData, wallet.walletId), + ); + } + } + } catch (e, s) { + Logging.instance.e("_preRegister failed", error: e, stackTrace: s); + } finally { + _preRegLock = false; + } + } + + bool _addLock = false; + Future _addRecord() async { + if (_addLock) return; + _addLock = true; + try { + final value = await showDialog( + context: context, + barrierDismissible: false, + builder: (context) { + return Navigator( + onGenerateRoute: (settings) { + return RouteGenerator.getRoute( + builder: (context) { + return Util.isDesktop + ? DesktopDialog( + maxHeight: double.infinity, + maxWidth: 580, + child: Column( + children: [ + Row( + mainAxisAlignment: + MainAxisAlignment.spaceBetween, + children: [ + Padding( + padding: const EdgeInsets.only( + left: 32, + ), + child: Text( + "Add DNS record", + style: STextStyles.desktopH3(context), + ), + ), + DesktopDialogCloseButton( + onPressedOverride: () { + Navigator.of(context, rootNavigator: true) + .pop(); + }, + ), + ], + ), + const Padding( + padding: EdgeInsets.symmetric(horizontal: 32), + child: AddDnsStep1(), + ), + ], + ), + ) + : const StackDialogBase( + child: AddDnsStep1(), + ); + }, + ); + }, + ); + }, + ); + + if (mounted && value != null) { + setState(() { + _dnsRecords.add(value); + }); + } + } catch (e, s) { + Logging.instance.e("Add DNS record failed", error: e, stackTrace: s); + + if (mounted) { + await showDialog( + context: context, + builder: (_) => StackOkDialog( + title: "Add DNS record failed", + desktopPopRootNavigator: Util.isDesktop, + maxWidth: Util.isDesktop ? 600 : null, + ), + ); + } + } finally { + _addLock = false; + } + } + + @override + Widget build(BuildContext context) { + final coin = ref.watch(pWalletCoin(widget.walletId)); + return ConditionalParent( + condition: !Util.isDesktop, + builder: (child) { + return Background( + child: Scaffold( + appBar: AppBar( + leading: const AppBarBackButton(), + titleSpacing: 0, + title: Text( + "Buy domain", + style: STextStyles.navBarTitle(context), + overflow: TextOverflow.ellipsis, + ), + ), + body: Padding( + padding: const EdgeInsets.symmetric(horizontal: 16), + child: child, + ), + ), + ); + }, + child: Column( + crossAxisAlignment: Util.isDesktop + ? CrossAxisAlignment.start + : CrossAxisAlignment.stretch, + children: [ + if (!Util.isDesktop) + Text( + "Buy domain", + style: Util.isDesktop + ? STextStyles.desktopH3(context) + : STextStyles.pageTitleH2(context), + ), + SizedBox( + height: Util.isDesktop ? 24 : 16, + ), + Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Text( + "Name registration will take approximately 2 to 4 hours.", + style: Util.isDesktop + ? STextStyles.w500_14(context).copyWith( + color: Theme.of(context) + .extension()! + .textDark3, + ) + : STextStyles.w500_12(context).copyWith( + color: Theme.of(context) + .extension()! + .textDark3, + ), + ), + ], + ), + SizedBox( + height: Util.isDesktop ? 24 : 16, + ), + RoundedWhiteContainer( + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text( + "Domain name", + style: Util.isDesktop + ? STextStyles.w500_14(context).copyWith( + color: Theme.of(context) + .extension()! + .infoItemLabel, + ) + : STextStyles.w500_12(context).copyWith( + color: Theme.of(context) + .extension()! + .infoItemLabel, + ), + ), + Text( + "${widget.domainName.substring(2)}.bit", + style: Util.isDesktop + ? STextStyles.w500_14(context) + : STextStyles.w500_12(context), + ), + ], + ), + ), + SizedBox( + height: Util.isDesktop ? 16 : 8, + ), + RoundedWhiteContainer( + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text( + "Amount", + style: Util.isDesktop + ? STextStyles.w500_14(context).copyWith( + color: Theme.of(context) + .extension()! + .infoItemLabel, + ) + : STextStyles.w500_12(context).copyWith( + color: Theme.of(context) + .extension()! + .infoItemLabel, + ), + ), + Text( + ref.watch(pAmountFormatter(coin)).format( + Amount( + rawValue: BigInt.from(kNameNewAmountSats), + fractionDigits: coin.fractionDigits, + ), + ), + style: Util.isDesktop + ? STextStyles.w500_14(context) + : STextStyles.w500_12(context), + ), + ], + ), + ), + SizedBox( + height: Util.isDesktop ? 16 : 8, + ), + CustomTextButton( + text: _settingsHidden ? "More settings" : "Hide settings", + onTap: () { + setState(() { + _settingsHidden = !_settingsHidden; + }); + }, + ), + if (!_settingsHidden) + SizedBox( + height: Util.isDesktop ? 24 : 16, + ), + if (!_settingsHidden) + if (_dnsRecords.isEmpty) + RoundedWhiteContainer( + child: Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Text( + "Add DNS records to your domain name", + style: STextStyles.w500_12(context).copyWith( + color: Theme.of(context) + .extension()! + .textSubtitle1, + ), + ), + ], + ), + ), + if (!_settingsHidden) + if (_dnsRecords.isNotEmpty) + ListView( + shrinkWrap: true, + children: [ + ..._dnsRecords.map( + (e) => DNSRecordCard( + key: Key(e.toString()), + record: e, + onRemoveTapped: () => setState(() { + _dnsRecords.remove(e); + }), + ), + ), + ], + ), + if (!_settingsHidden) + SizedBox( + height: Util.isDesktop ? 16 : 8, + ), + if (!_settingsHidden) + SecondaryButton( + label: _dnsRecords.isEmpty + ? "Add DNS record" + : "Add another DNS record", + // width: Util.isDesktop ? 160 : double.infinity, + buttonHeight: Util.isDesktop ? ButtonHeight.l : null, + onPressed: _addRecord, + ), + SizedBox( + height: Util.isDesktop ? 24 : 16, + ), + if (!Util.isDesktop) const Spacer(), + PrimaryButton( + label: "Buy", + // width: Util.isDesktop ? 160 : double.infinity, + buttonHeight: Util.isDesktop ? ButtonHeight.l : null, + onPressed: _preRegister, + ), + SizedBox( + height: Util.isDesktop ? 32 : 16, + ), + ], + ), + ); + } +} + +class DNSRecordCard extends StatelessWidget { + const DNSRecordCard({ + super.key, + required this.record, + required this.onRemoveTapped, + this.extraInfo, + }); + + final DNSRecord record; + final VoidCallback onRemoveTapped; + final String? extraInfo; + + @override + Widget build(BuildContext context) { + return RoundedWhiteContainer( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text( + "${record.type.name}${extraInfo != null ? " - ${extraInfo!}" : ""}", + ), + CustomTextButton( + text: "Remove", + onTap: onRemoveTapped, + ), + ], + ), + Text(record.jsonDataString()), + ], + ), + ); + } +} diff --git a/lib/pages/namecoin_names/sub_widgets/buy_domain_option_widget.dart b/lib/pages/namecoin_names/sub_widgets/buy_domain_option_widget.dart index feb9b93ce..cca3d4e79 100644 --- a/lib/pages/namecoin_names/sub_widgets/buy_domain_option_widget.dart +++ b/lib/pages/namecoin_names/sub_widgets/buy_domain_option_widget.dart @@ -3,26 +3,23 @@ import 'dart:async'; import 'package:flutter/material.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:flutter_svg/svg.dart'; -import 'package:namecoin/namecoin.dart'; import '../../../providers/providers.dart'; import '../../../themes/stack_colors.dart'; -import '../../../utilities/amount/amount.dart'; import '../../../utilities/assets.dart'; import '../../../utilities/constants.dart'; import '../../../utilities/logger.dart'; import '../../../utilities/show_loading.dart'; import '../../../utilities/text_styles.dart'; import '../../../utilities/util.dart'; -import '../../../wallets/models/name_op_state.dart'; -import '../../../wallets/models/tx_data.dart'; import '../../../wallets/wallet/impl/namecoin_wallet.dart'; import '../../../widgets/desktop/desktop_dialog.dart'; +import '../../../widgets/desktop/desktop_dialog_close_button.dart'; import '../../../widgets/desktop/primary_button.dart'; import '../../../widgets/desktop/secondary_button.dart'; import '../../../widgets/rounded_white_container.dart'; import '../../../widgets/stack_dialog.dart'; -import '../confirm_name_transaction_view.dart'; +import '../buy_domain_view.dart'; class BuyDomainOptionWidget extends ConsumerStatefulWidget { const BuyDomainOptionWidget({super.key, required this.walletId}); @@ -248,68 +245,6 @@ class _NameCard extends ConsumerWidget { final bool isAvailable; final String formattedName; - Future _preRegister( - BuildContext context, - NamecoinWallet wallet, - String value, - ) async { - final myAddress = await wallet.getCurrentReceivingAddress(); - if (myAddress == null) { - throw Exception("No receiving address found"); - } - - // get address private key for deterministic salt - final pk = await wallet.getPrivateKey(myAddress); - - final data = scriptNameNew(formattedName, pk.data); - - TxData txData = TxData( - opNameState: NameOpState( - name: formattedName, - saltHex: data.$2, - commitment: data.$3, - value: value, - nameScriptHex: data.$1, - type: OpName.nameNew, - outputPosition: -1, //currently unknown, updated later - ), - feeRateType: kNameTxDefaultFeeRate, // TODO: make configurable? - recipients: [ - ( - address: myAddress.value, - isChange: false, - amount: Amount( - rawValue: BigInt.from(kNameNewAmountSats), - fractionDigits: wallet.cryptoCurrency.fractionDigits, - ), - ), - ], - ); - - txData = await wallet.prepareNameSend(txData: txData); - - if (context.mounted) { - if (Util.isDesktop) { - await showDialog( - context: context, - builder: (context) => DesktopDialog( - maxHeight: MediaQuery.of(context).size.height - 64, - maxWidth: 580, - child: ConfirmNameTransactionView( - txData: txData, - walletId: wallet.walletId, - ), - ), - ); - } else { - await Navigator.of(context).pushNamed( - ConfirmNameTransactionView.routeName, - arguments: (txData, wallet.walletId), - ); - } - } - } - @override Widget build(BuildContext context, WidgetRef ref) { final availability = isAvailable ? "Available" : "Unavailable"; @@ -349,10 +284,55 @@ class _NameCard extends ConsumerWidget { enabled: isAvailable, buttonHeight: ButtonHeight.m, width: 140, - onPressed: () => _preRegister( - context, - ref.read(pWallets).getWallet(walletId) as NamecoinWallet, - ), + onPressed: () async { + if (context.mounted) { + if (Util.isDesktop) { + await showDialog( + context: context, + builder: (context) => DesktopDialog( + maxWidth: 580, + maxHeight: double.infinity, + child: Column( + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Padding( + padding: const EdgeInsets.only( + left: 32, + ), + child: Text( + "Buy domain", + style: STextStyles.desktopH3(context), + ), + ), + const DesktopDialogCloseButton(), + ], + ), + Padding( + padding: const EdgeInsets.symmetric( + horizontal: 32, + ), + child: BuyDomainView( + walletId: walletId, + domainName: formattedName, + ), + ), + ], + ), + ), + ); + } else { + await Navigator.of(context).pushNamed( + BuyDomainView.routeName, + arguments: ( + walletId: walletId, + domainName: formattedName + ), + ); + } + } + }, ), ], ), diff --git a/lib/route_generator.dart b/lib/route_generator.dart index 1a3581db1..3e51359ae 100644 --- a/lib/route_generator.dart +++ b/lib/route_generator.dart @@ -72,6 +72,7 @@ import 'pages/home_view/home_view.dart'; import 'pages/intro_view.dart'; import 'pages/manage_favorites_view/manage_favorites_view.dart'; import 'pages/monkey/monkey_view.dart'; +import 'pages/namecoin_names/buy_domain_view.dart'; import 'pages/namecoin_names/confirm_name_transaction_view.dart'; import 'pages/namecoin_names/namecoin_names_home_view.dart'; import 'pages/notification_views/notifications_view.dart'; @@ -2186,6 +2187,21 @@ class RouteGenerator { } return _routeError("${settings.name} invalid args: ${args.toString()}"); + case BuyDomainView.routeName: + if (args is ({String walletId, String domainName})) { + return getRoute( + shouldUseMaterialRoute: useMaterialPageRoute, + builder: (_) => BuyDomainView( + walletId: args.walletId, + domainName: args.domainName, + ), + settings: RouteSettings( + name: settings.name, + ), + ); + } + return _routeError("${settings.name} invalid args: ${args.toString()}"); + // == Desktop specific routes ============================================ case CreatePasswordView.routeName: if (args is bool) { From 51b0cc1510f33e9865b58a3843e76853f3176666 Mon Sep 17 00:00:00 2001 From: julian Date: Tue, 18 Feb 2025 16:18:51 -0600 Subject: [PATCH 080/193] add method to check for and ignore name outputs in balance --- lib/wallets/wallet/impl/namecoin_wallet.dart | 9 +++++++++ lib/wallets/wallet/intermediate/bip39_hd_wallet.dart | 6 ++++++ 2 files changed, 15 insertions(+) diff --git a/lib/wallets/wallet/impl/namecoin_wallet.dart b/lib/wallets/wallet/impl/namecoin_wallet.dart index ff7bce0cf..bb28ed52e 100644 --- a/lib/wallets/wallet/impl/namecoin_wallet.dart +++ b/lib/wallets/wallet/impl/namecoin_wallet.dart @@ -1368,6 +1368,15 @@ class NamecoinWallet return txData; } + @override + bool ignoreUtxoInBalance(UTXO utxo) { + if (getOpNameDataFrom(utxo) != null) { + // ignore name outputs in balance calculation + return true; + } + return false; + } + /// return null if utxo does not contain name op OpNameData? getOpNameDataFrom(UTXO utxo) { if (utxo.otherData == null) { diff --git a/lib/wallets/wallet/intermediate/bip39_hd_wallet.dart b/lib/wallets/wallet/intermediate/bip39_hd_wallet.dart index 90cbacea4..777dda064 100644 --- a/lib/wallets/wallet/intermediate/bip39_hd_wallet.dart +++ b/lib/wallets/wallet/intermediate/bip39_hd_wallet.dart @@ -6,6 +6,7 @@ import 'package:isar/isar.dart'; import '../../../models/balance.dart'; import '../../../models/isar/models/blockchain_data/address.dart'; +import '../../../models/isar/models/blockchain_data/utxo.dart'; import '../../../models/keys/view_only_wallet_data.dart'; import '../../../utilities/amount/amount.dart'; import '../../../utilities/enums/derive_path_type_enum.dart'; @@ -194,6 +195,9 @@ abstract class Bip39HDWallet extends Bip39Wallet return address; } + /// If this function returns true, the UTXO will be ignored in displayed balance + bool ignoreUtxoInBalance(UTXO utxo) => false; + // ========== Private ======================================================== Future _viewOnlyPathHelper() async { @@ -329,6 +333,8 @@ abstract class Bip39HDWallet extends Bip39Wallet ); for (final utxo in utxos) { + if (ignoreUtxoInBalance(utxo)) continue; + final utxoAmount = Amount( rawValue: BigInt.from(utxo.value), fractionDigits: cryptoCurrency.fractionDigits, From 321cf855a7aa4ab2e9ec656f4fa4ed5428823681 Mon Sep 17 00:00:00 2001 From: julian Date: Tue, 18 Feb 2025 16:56:04 -0600 Subject: [PATCH 081/193] clean up record info display --- lib/models/namecoin_dns/dns_record.dart | 10 +++++++++- lib/pages/namecoin_names/buy_domain_view.dart | 17 +++++++++++++---- 2 files changed, 22 insertions(+), 5 deletions(-) diff --git a/lib/models/namecoin_dns/dns_record.dart b/lib/models/namecoin_dns/dns_record.dart index ee0842b34..63958d748 100644 --- a/lib/models/namecoin_dns/dns_record.dart +++ b/lib/models/namecoin_dns/dns_record.dart @@ -16,7 +16,15 @@ final class DNSRecord { required this.data, }); - String jsonDataString() => jsonEncode(data); + String getValueString() { + // TODO error handling + dynamic value = data; + while (value is Map) { + value = value[value.keys.first]; + } + + return value.toString(); + } DNSRecord copyWith({ DNSRecordType? type, diff --git a/lib/pages/namecoin_names/buy_domain_view.dart b/lib/pages/namecoin_names/buy_domain_view.dart index b9a30a24f..977656cc5 100644 --- a/lib/pages/namecoin_names/buy_domain_view.dart +++ b/lib/pages/namecoin_names/buy_domain_view.dart @@ -15,7 +15,9 @@ import '../../../widgets/desktop/desktop_dialog.dart'; import '../../../widgets/desktop/primary_button.dart'; import '../../../widgets/desktop/secondary_button.dart'; import '../../../widgets/stack_dialog.dart'; +import '../../models/namecoin_dns/dns_a_record_address_type.dart'; import '../../models/namecoin_dns/dns_record.dart'; +import '../../models/namecoin_dns/dns_record_type.dart'; import '../../route_generator.dart'; import '../../themes/stack_colors.dart'; import '../../utilities/amount/amount_formatter.dart'; @@ -425,12 +427,19 @@ class DNSRecordCard extends StatelessWidget { super.key, required this.record, required this.onRemoveTapped, - this.extraInfo, }); final DNSRecord record; final VoidCallback onRemoveTapped; - final String? extraInfo; + + String get _extraInfo { + if (record.type == DNSRecordType.A) { + // TODO error handling + return " - ${DNSAddressType.values.firstWhere((e) => e.key == record.data.keys.first).name}"; + } + + return ""; + } @override Widget build(BuildContext context) { @@ -442,7 +451,7 @@ class DNSRecordCard extends StatelessWidget { mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ Text( - "${record.type.name}${extraInfo != null ? " - ${extraInfo!}" : ""}", + "${record.type.name}$_extraInfo", ), CustomTextButton( text: "Remove", @@ -450,7 +459,7 @@ class DNSRecordCard extends StatelessWidget { ), ], ), - Text(record.jsonDataString()), + Text(record.getValueString()), ], ), ); From 63474ac6eb1d93300c27d19a1c892bfc2cdd7ce1 Mon Sep 17 00:00:00 2001 From: julian Date: Tue, 18 Feb 2025 17:36:17 -0600 Subject: [PATCH 082/193] better base dialog widget --- lib/pages/namecoin_names/buy_domain_view.dart | 75 ++++++++++--------- .../sub_widgets/buy_domain_option_widget.dart | 58 +++++++------- lib/widgets/dialogs/s_dialog.dart | 64 ++++++++++++++++ 3 files changed, 133 insertions(+), 64 deletions(-) create mode 100644 lib/widgets/dialogs/s_dialog.dart diff --git a/lib/pages/namecoin_names/buy_domain_view.dart b/lib/pages/namecoin_names/buy_domain_view.dart index 977656cc5..ea7c032b3 100644 --- a/lib/pages/namecoin_names/buy_domain_view.dart +++ b/lib/pages/namecoin_names/buy_domain_view.dart @@ -11,7 +11,6 @@ import '../../../utilities/util.dart'; import '../../../wallets/models/name_op_state.dart'; import '../../../wallets/models/tx_data.dart'; import '../../../wallets/wallet/impl/namecoin_wallet.dart'; -import '../../../widgets/desktop/desktop_dialog.dart'; import '../../../widgets/desktop/primary_button.dart'; import '../../../widgets/desktop/secondary_button.dart'; import '../../../widgets/stack_dialog.dart'; @@ -28,6 +27,7 @@ import '../../widgets/conditional_parent.dart'; import '../../widgets/custom_buttons/app_bar_icon_button.dart'; import '../../widgets/custom_buttons/blue_text_button.dart'; import '../../widgets/desktop/desktop_dialog_close_button.dart'; +import '../../widgets/dialogs/s_dialog.dart'; import '../../widgets/rounded_white_container.dart'; import 'add_dns_record/add_dns_step_1.dart'; import 'confirm_name_transaction_view.dart'; @@ -116,12 +116,13 @@ class _BuyDomainWidgetState extends ConsumerState { if (Util.isDesktop) { await showDialog( context: context, - builder: (context) => DesktopDialog( - maxHeight: MediaQuery.of(context).size.height - 64, - maxWidth: 580, - child: ConfirmNameTransactionView( - txData: txData, - walletId: wallet.walletId, + builder: (context) => SDialog( + child: SizedBox( + width: 580, + child: ConfirmNameTransactionView( + txData: txData, + walletId: wallet.walletId, + ), ), ), ); @@ -153,37 +154,39 @@ class _BuyDomainWidgetState extends ConsumerState { return RouteGenerator.getRoute( builder: (context) { return Util.isDesktop - ? DesktopDialog( - maxHeight: double.infinity, - maxWidth: 580, - child: Column( - children: [ - Row( - mainAxisAlignment: - MainAxisAlignment.spaceBetween, - children: [ - Padding( - padding: const EdgeInsets.only( - left: 32, + ? SDialog( + child: SizedBox( + width: 580, + child: Column( + children: [ + Row( + mainAxisAlignment: + MainAxisAlignment.spaceBetween, + children: [ + Padding( + padding: const EdgeInsets.only( + left: 32, + ), + child: Text( + "Add DNS record", + style: STextStyles.desktopH3(context), + ), ), - child: Text( - "Add DNS record", - style: STextStyles.desktopH3(context), + DesktopDialogCloseButton( + onPressedOverride: () { + Navigator.of(context, + rootNavigator: true) + .pop(); + }, ), - ), - DesktopDialogCloseButton( - onPressedOverride: () { - Navigator.of(context, rootNavigator: true) - .pop(); - }, - ), - ], - ), - const Padding( - padding: EdgeInsets.symmetric(horizontal: 32), - child: AddDnsStep1(), - ), - ], + ], + ), + const Padding( + padding: EdgeInsets.symmetric(horizontal: 32), + child: AddDnsStep1(), + ), + ], + ), ), ) : const StackDialogBase( diff --git a/lib/pages/namecoin_names/sub_widgets/buy_domain_option_widget.dart b/lib/pages/namecoin_names/sub_widgets/buy_domain_option_widget.dart index cca3d4e79..14d902e88 100644 --- a/lib/pages/namecoin_names/sub_widgets/buy_domain_option_widget.dart +++ b/lib/pages/namecoin_names/sub_widgets/buy_domain_option_widget.dart @@ -13,10 +13,10 @@ import '../../../utilities/show_loading.dart'; import '../../../utilities/text_styles.dart'; import '../../../utilities/util.dart'; import '../../../wallets/wallet/impl/namecoin_wallet.dart'; -import '../../../widgets/desktop/desktop_dialog.dart'; import '../../../widgets/desktop/desktop_dialog_close_button.dart'; import '../../../widgets/desktop/primary_button.dart'; import '../../../widgets/desktop/secondary_button.dart'; +import '../../../widgets/dialogs/s_dialog.dart'; import '../../../widgets/rounded_white_container.dart'; import '../../../widgets/stack_dialog.dart'; import '../buy_domain_view.dart'; @@ -289,36 +289,38 @@ class _NameCard extends ConsumerWidget { if (Util.isDesktop) { await showDialog( context: context, - builder: (context) => DesktopDialog( - maxWidth: 580, - maxHeight: double.infinity, - child: Column( - children: [ - Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - Padding( - padding: const EdgeInsets.only( - left: 32, + builder: (context) => SDialog( + child: SizedBox( + width: 580, + child: Column( + children: [ + Row( + mainAxisAlignment: + MainAxisAlignment.spaceBetween, + children: [ + Padding( + padding: const EdgeInsets.only( + left: 32, + ), + child: Text( + "Buy domain", + style: STextStyles.desktopH3(context), + ), ), - child: Text( - "Buy domain", - style: STextStyles.desktopH3(context), - ), - ), - const DesktopDialogCloseButton(), - ], - ), - Padding( - padding: const EdgeInsets.symmetric( - horizontal: 32, + const DesktopDialogCloseButton(), + ], ), - child: BuyDomainView( - walletId: walletId, - domainName: formattedName, + Padding( + padding: const EdgeInsets.symmetric( + horizontal: 32, + ), + child: BuyDomainView( + walletId: walletId, + domainName: formattedName, + ), ), - ), - ], + ], + ), ), ), ); diff --git a/lib/widgets/dialogs/s_dialog.dart b/lib/widgets/dialogs/s_dialog.dart new file mode 100644 index 000000000..a6b32148c --- /dev/null +++ b/lib/widgets/dialogs/s_dialog.dart @@ -0,0 +1,64 @@ +import 'package:flutter/material.dart'; + +import '../../themes/stack_colors.dart'; +import '../../utilities/util.dart'; +import '../conditional_parent.dart'; + +class SDialog extends StatelessWidget { + const SDialog({ + super.key, + required this.child, + this.padding = EdgeInsets.zero, + this.contentCanScroll = true, + this.margin, + this.background, + this.mainAxisAlignment, + this.crossAxisAlignment, + }); + + final Widget child; + final bool contentCanScroll; + final Color? background; + final EdgeInsets? margin; + final EdgeInsets padding; + final MainAxisAlignment? mainAxisAlignment; + final CrossAxisAlignment? crossAxisAlignment; + + @override + Widget build(BuildContext context) { + return Padding( + padding: margin ?? EdgeInsets.all(Util.isDesktop ? 32 : 16), + child: Column( + mainAxisAlignment: mainAxisAlignment ?? + (Util.isDesktop ? MainAxisAlignment.center : MainAxisAlignment.end), + crossAxisAlignment: crossAxisAlignment ?? CrossAxisAlignment.center, + children: [ + Flexible( + child: Material( + borderRadius: BorderRadius.circular(20), + child: Container( + decoration: BoxDecoration( + color: background ?? + Theme.of(context).extension()!.popupBG, + borderRadius: BorderRadius.circular( + 20, + ), + ), + child: ConditionalParent( + condition: contentCanScroll, + builder: (child) => SingleChildScrollView( + child: child, + ), + child: Padding( + padding: padding, + child: child, + ), + ), + ), + ), + ), + ], + ), + ); + } +} From 116b5747cf6369c0bb575f7b0d21a1ff8a50ad60 Mon Sep 17 00:00:00 2001 From: julian Date: Wed, 19 Feb 2025 10:59:38 -0600 Subject: [PATCH 083/193] validate name value length --- lib/models/namecoin_dns/dns_record.dart | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/lib/models/namecoin_dns/dns_record.dart b/lib/models/namecoin_dns/dns_record.dart index 63958d748..0c4bef782 100644 --- a/lib/models/namecoin_dns/dns_record.dart +++ b/lib/models/namecoin_dns/dns_record.dart @@ -1,8 +1,9 @@ import 'dart:convert'; import 'package:meta/meta.dart'; +import 'package:namecoin/namecoin.dart'; -import '../../utilities/logger.dart'; +import '../../utilities/extensions/extensions.dart'; import 'dns_a_record_address_type.dart'; import 'dns_record_type.dart'; @@ -43,8 +44,6 @@ final class DNSRecord { } static String merge(List records) { - final start = DateTime.now(); - final Map result = {}; for (final record in records) { @@ -69,8 +68,15 @@ final class DNSRecord { } } - Logging.instance.w(DateTime.now().difference(start)); - return jsonEncode(result); + final string = jsonEncode(result); + if (string.toUint8ListFromUtf8.length > valueMaxLength) { + throw Exception( + "Value length (${string.toUint8ListFromUtf8.length}) exceeds maximum" + " allowed ($valueMaxLength)", + ); + } + + return string; } } From 7cdbe581efafd65ec1c9e5502e712880609e47ee Mon Sep 17 00:00:00 2001 From: julian Date: Wed, 19 Feb 2025 11:00:03 -0600 Subject: [PATCH 084/193] show error dialog --- lib/pages/namecoin_names/buy_domain_view.dart | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/lib/pages/namecoin_names/buy_domain_view.dart b/lib/pages/namecoin_names/buy_domain_view.dart index ea7c032b3..22f16d738 100644 --- a/lib/pages/namecoin_names/buy_domain_view.dart +++ b/lib/pages/namecoin_names/buy_domain_view.dart @@ -135,6 +135,23 @@ class _BuyDomainWidgetState extends ConsumerState { } } catch (e, s) { Logging.instance.e("_preRegister failed", error: e, stackTrace: s); + + String err = e.toString(); + if (err.startsWith("Exception: ")) { + err = err.replaceFirst("Exception: ", ""); + } + + if (mounted) { + await showDialog( + context: context, + builder: (_) => StackOkDialog( + title: "Add DNS record failed", + message: err, + desktopPopRootNavigator: Util.isDesktop, + maxWidth: Util.isDesktop ? 600 : null, + ), + ); + } } finally { _preRegLock = false; } From 06b0584691f8ac8b9e516b775a549ca5ea9302ff Mon Sep 17 00:00:00 2001 From: julian Date: Wed, 19 Feb 2025 11:00:33 -0600 Subject: [PATCH 085/193] better encoding --- lib/wallets/wallet/impl/namecoin_wallet.dart | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/lib/wallets/wallet/impl/namecoin_wallet.dart b/lib/wallets/wallet/impl/namecoin_wallet.dart index bb28ed52e..cb3901e29 100644 --- a/lib/wallets/wallet/impl/namecoin_wallet.dart +++ b/lib/wallets/wallet/impl/namecoin_wallet.dart @@ -32,8 +32,6 @@ const kNameTxDefaultFeeRate = FeeRateType.slow; const kNameNewAmountSats = 150_0000; const kNameAmountSats = 100_0000; -const _kNameSaltSplitter = r"$$$$"; - String nameSaltKeyBuilder(String txid, String walletId, int txPos) { if (txPos.isNegative) { throw Exception("Invalid vout index"); @@ -43,11 +41,16 @@ String nameSaltKeyBuilder(String txid, String walletId, int txPos) { } String encodeNameSaltData(String name, String salt, String value) => - "$name$_kNameSaltSplitter$salt$_kNameSaltSplitter$value"; + jsonEncode({ + "name": name, + "salt": salt, + "value": value, + }); + ({String salt, String name, String value}) decodeNameSaltData(String value) { try { - final split = value.split(_kNameSaltSplitter); - return (salt: split[1], name: split[0], value: split[2]); + final map = (jsonDecode(value) as Map).cast(); + return (salt: map["salt"]!, name: map["name"]!, value: map["value"]!); } catch (_) { throw Exception("Bad name salt data"); } From 0d1bfc191f903f694b413e4ec9259c748f25d6cb Mon Sep 17 00:00:00 2001 From: julian Date: Wed, 19 Feb 2025 11:04:45 -0600 Subject: [PATCH 086/193] clean up logging --- lib/pages/namecoin_names/buy_domain_view.dart | 2 +- lib/wallets/wallet/impl/namecoin_wallet.dart | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/lib/pages/namecoin_names/buy_domain_view.dart b/lib/pages/namecoin_names/buy_domain_view.dart index 22f16d738..73a3f5772 100644 --- a/lib/pages/namecoin_names/buy_domain_view.dart +++ b/lib/pages/namecoin_names/buy_domain_view.dart @@ -72,7 +72,7 @@ class _BuyDomainWidgetState extends ConsumerState { final value = _getFormattedDNSRecords(); - Logging.instance.f(value); + Logging.instance.t("Formatted namecoin name value: $value"); // get address private key for deterministic salt final pk = await wallet.getPrivateKey(myAddress); diff --git a/lib/wallets/wallet/impl/namecoin_wallet.dart b/lib/wallets/wallet/impl/namecoin_wallet.dart index cb3901e29..87dd63acc 100644 --- a/lib/wallets/wallet/impl/namecoin_wallet.dart +++ b/lib/wallets/wallet/impl/namecoin_wallet.dart @@ -445,7 +445,6 @@ class NamecoinWallet for (final utxo in utxos) { final nameOp = getOpNameDataFrom(utxo); if (nameOp?.op == OpName.nameNew) { - Logging.instance.f(utxo); final sKey = nameSaltKeyBuilder(utxo.txid, walletId, utxo.vout); final encoded = await secureStorageInterface.read(key: sKey); From ad07d7abb90f0cd59391fc8384531cbe2a4a4bb1 Mon Sep 17 00:00:00 2001 From: julian Date: Wed, 19 Feb 2025 13:02:29 -0600 Subject: [PATCH 087/193] fix: pop buy name dialog on success --- lib/pages/namecoin_names/confirm_name_transaction_view.dart | 2 ++ 1 file changed, 2 insertions(+) diff --git a/lib/pages/namecoin_names/confirm_name_transaction_view.dart b/lib/pages/namecoin_names/confirm_name_transaction_view.dart index df1245da2..53e6017d2 100644 --- a/lib/pages/namecoin_names/confirm_name_transaction_view.dart +++ b/lib/pages/namecoin_names/confirm_name_transaction_view.dart @@ -160,6 +160,8 @@ class _ConfirmNameTransactionViewState Navigator.of(context, rootNavigator: Util.isDesktop).pop(); // pop confirm send view Navigator.of(context, rootNavigator: Util.isDesktop).pop(); + // pop buy popup //TODO test on mobile + Navigator.of(context, rootNavigator: Util.isDesktop).pop(); } } catch (e, s) { const niceError = "Broadcast name transaction failed"; From a576e451990d1930c026e0594706a36e5e4fdebe Mon Sep 17 00:00:00 2001 From: julian Date: Thu, 20 Feb 2025 15:31:52 -0600 Subject: [PATCH 088/193] WIP: namecoin names desktop/mobile specific layout tweaks, and various clean up --- lib/models/namecoin_dns/dns_record.dart | 33 +- lib/models/namecoin_dns/dns_record_type.dart | 23 + .../add_dns_record/add_dns_step_1.dart | 47 +- .../add_dns_record/add_dns_step_2.dart | 37 +- .../add_dns_record/name_form_interface.dart | 6 +- .../add_dns_record/sub_widgets/a_form.dart | 41 +- .../sub_widgets/cname_form.dart | 3 +- .../add_dns_record/sub_widgets/ds_form.dart | 3 +- .../sub_widgets/import_form.dart | 3 +- .../add_dns_record/sub_widgets/ns_form.dart | 3 +- .../add_dns_record/sub_widgets/srv_form.dart | 3 +- .../add_dns_record/sub_widgets/ssh_form.dart | 3 +- .../add_dns_record/sub_widgets/tls_form.dart | 3 +- .../add_dns_record/sub_widgets/txt_form.dart | 3 +- lib/pages/namecoin_names/buy_domain_view.dart | 225 ++++--- .../confirm_name_transaction_view.dart | 6 +- .../namecoin_names_home_view.dart | 181 ++++-- .../sub_widgets/buy_domain_option_widget.dart | 6 +- .../manage_domains_option_widget.dart | 46 +- .../sub_widgets/name_details.dart | 595 ++++++++++++++++++ .../sub_widgets/owned_name_card.dart | 183 ++++++ lib/route_generator.dart | 16 + lib/wallets/wallet/impl/namecoin_wallet.dart | 6 + lib/widgets/desktop/desktop_scaffold.dart | 4 +- 24 files changed, 1277 insertions(+), 202 deletions(-) create mode 100644 lib/pages/namecoin_names/sub_widgets/name_details.dart create mode 100644 lib/pages/namecoin_names/sub_widgets/owned_name_card.dart diff --git a/lib/models/namecoin_dns/dns_record.dart b/lib/models/namecoin_dns/dns_record.dart index 0c4bef782..9c54bf98b 100644 --- a/lib/models/namecoin_dns/dns_record.dart +++ b/lib/models/namecoin_dns/dns_record.dart @@ -4,19 +4,44 @@ import 'package:meta/meta.dart'; import 'package:namecoin/namecoin.dart'; import '../../utilities/extensions/extensions.dart'; -import 'dns_a_record_address_type.dart'; import 'dns_record_type.dart'; @Immutable() -final class DNSRecord { +abstract class DNSRecordBase { + final String name; + + DNSRecordBase({required this.name}); + + String getValueString(); +} + +@Immutable() +final class RawDNSRecord extends DNSRecordBase { + final String value; + + RawDNSRecord({required super.name, required this.value}); + + @override + String getValueString() => value; + + @override + String toString() { + return "RawDNSRecord(name: $name, value: $value)"; + } +} + +@Immutable() +final class DNSRecord extends DNSRecordBase { final DNSRecordType type; final Map data; DNSRecord({ + required super.name, required this.type, required this.data, }); + @override String getValueString() { // TODO error handling dynamic value = data; @@ -29,18 +54,18 @@ final class DNSRecord { DNSRecord copyWith({ DNSRecordType? type, - DNSAddressType? addressType, Map? data, }) { return DNSRecord( type: type ?? this.type, data: data ?? this.data, + name: name, ); } @override String toString() { - return "DNSRecord(type: $type, data: $data)"; + return "DNSRecord(name: $name, type: $type, data: $data)"; } static String merge(List records) { diff --git a/lib/models/namecoin_dns/dns_record_type.dart b/lib/models/namecoin_dns/dns_record_type.dart index c8e215194..6e25cc038 100644 --- a/lib/models/namecoin_dns/dns_record_type.dart +++ b/lib/models/namecoin_dns/dns_record_type.dart @@ -42,4 +42,27 @@ enum DNSRecordType { " for securely connecting to your domain's services."; } } + + String? get key { + switch (this) { + case DNSRecordType.A: + return null; + case DNSRecordType.CNAME: + return "alias"; + case DNSRecordType.NS: + return "ns"; + case DNSRecordType.DS: + return "ds"; + case DNSRecordType.TLS: + return "tls"; + case DNSRecordType.SRV: + return "srv"; + case DNSRecordType.TXT: + return "txt"; + case DNSRecordType.IMPORT: + return "import"; + case DNSRecordType.SSH: + return "sshfp"; + } + } } diff --git a/lib/pages/namecoin_names/add_dns_record/add_dns_step_1.dart b/lib/pages/namecoin_names/add_dns_record/add_dns_step_1.dart index ad59c4fc1..dd9119cac 100644 --- a/lib/pages/namecoin_names/add_dns_record/add_dns_step_1.dart +++ b/lib/pages/namecoin_names/add_dns_record/add_dns_step_1.dart @@ -17,7 +17,9 @@ import '../../../widgets/stack_dialog.dart'; import 'add_dns_step_2.dart'; class AddDnsStep1 extends StatefulWidget { - const AddDnsStep1({super.key}); + const AddDnsStep1({super.key, required this.name}); + + final String name; @override State createState() => _AddDnsStep1State(); @@ -64,13 +66,19 @@ class _AddDnsStep1State extends State { ), child: AddDnsStep2( recordType: _recordType!, + name: widget.name, ), ), ], ), ) : StackDialogBase( - child: AddDnsStep2(recordType: _recordType!), + keyboardPaddingAmount: + MediaQuery.of(context).viewInsets.bottom, + child: AddDnsStep2( + recordType: _recordType!, + name: widget.name, + ), ); }, ), @@ -114,9 +122,20 @@ class _AddDnsStep1State extends State { "Choose a record type", style: STextStyles.fieldLabel(context), ), + buttonStyleData: ButtonStyleData( + decoration: BoxDecoration( + color: Theme.of(context) + .extension()! + .textFieldDefaultBG, + borderRadius: BorderRadius.circular( + Constants.size.circularBorderRadius, + ), + ), + ), dropdownStyleData: DropdownStyleData( offset: const Offset(0, -10), elevation: 0, + maxHeight: Util.isDesktop ? null : 200, decoration: BoxDecoration( color: Theme.of(context) .extension()! @@ -142,11 +161,14 @@ class _AddDnsStep1State extends State { } }, iconStyleData: IconStyleData( - icon: SvgPicture.asset( - Assets.svg.chevronDown, - width: 10, - height: 5, - color: Theme.of(context).extension()!.textDark3, + icon: Padding( + padding: const EdgeInsets.only(right: 10), + child: SvgPicture.asset( + Assets.svg.chevronDown, + width: 10, + height: 5, + color: Theme.of(context).extension()!.textDark3, + ), ), ), items: [ @@ -206,7 +228,7 @@ class _AddDnsStep1State extends State { Expanded( child: SecondaryButton( label: "Cancel", - buttonHeight: ButtonHeight.l, + buttonHeight: Util.isDesktop ? ButtonHeight.l : null, onPressed: () { Navigator.of(context, rootNavigator: true).pop(); }, @@ -220,14 +242,15 @@ class _AddDnsStep1State extends State { label: "Next", enabled: _recordType != null, onPressed: _next, - buttonHeight: ButtonHeight.l, + buttonHeight: Util.isDesktop ? ButtonHeight.l : null, ), ), ], ), - SizedBox( - height: Util.isDesktop ? 32 : 16, - ), + if (Util.isDesktop) + const SizedBox( + height: 32, + ), ], ); } diff --git a/lib/pages/namecoin_names/add_dns_record/add_dns_step_2.dart b/lib/pages/namecoin_names/add_dns_record/add_dns_step_2.dart index 13b127bfc..f6bb22f67 100644 --- a/lib/pages/namecoin_names/add_dns_record/add_dns_step_2.dart +++ b/lib/pages/namecoin_names/add_dns_record/add_dns_step_2.dart @@ -19,7 +19,13 @@ import 'sub_widgets/tls_form.dart'; import 'sub_widgets/txt_form.dart'; class AddDnsStep2 extends StatefulWidget { - const AddDnsStep2({super.key, required this.recordType}); + const AddDnsStep2({ + super.key, + required this.recordType, + required this.name, + }); + + final String name; final DNSRecordType recordType; @override @@ -86,23 +92,23 @@ class _AddDnsStep2State extends State { NameFormStatefulWidget _buildForm() { switch (widget.recordType) { case DNSRecordType.A: - return AForm(key: _formStateKey); + return AForm(key: _formStateKey, name: widget.name); case DNSRecordType.CNAME: - return CNAMEForm(key: _formStateKey); + return CNAMEForm(key: _formStateKey, name: widget.name); case DNSRecordType.NS: - return NSForm(key: _formStateKey); + return NSForm(key: _formStateKey, name: widget.name); case DNSRecordType.DS: - return DSForm(key: _formStateKey); + return DSForm(key: _formStateKey, name: widget.name); case DNSRecordType.TLS: - return TLSForm(key: _formStateKey); + return TLSForm(key: _formStateKey, name: widget.name); case DNSRecordType.SRV: - return SRVForm(key: _formStateKey); + return SRVForm(key: _formStateKey, name: widget.name); case DNSRecordType.TXT: - return TXTForm(key: _formStateKey); + return TXTForm(key: _formStateKey, name: widget.name); case DNSRecordType.IMPORT: - return IMPORTForm(key: _formStateKey); + return IMPORTForm(key: _formStateKey, name: widget.name); case DNSRecordType.SSH: - return SSHForm(key: _formStateKey); + return SSHForm(key: _formStateKey, name: widget.name); } } @@ -129,7 +135,7 @@ class _AddDnsStep2State extends State { Expanded( child: SecondaryButton( label: "Cancel", - buttonHeight: ButtonHeight.l, + buttonHeight: Util.isDesktop ? ButtonHeight.l : null, onPressed: () { Navigator.of(context).pop(); }, @@ -142,14 +148,15 @@ class _AddDnsStep2State extends State { child: PrimaryButton( label: "Next", onPressed: _nextPressed, - buttonHeight: ButtonHeight.l, + buttonHeight: Util.isDesktop ? ButtonHeight.l : null, ), ), ], ), - SizedBox( - height: Util.isDesktop ? 32 : 16, - ), + if (Util.isDesktop) + const SizedBox( + height: 32, + ), ], ); } diff --git a/lib/pages/namecoin_names/add_dns_record/name_form_interface.dart b/lib/pages/namecoin_names/add_dns_record/name_form_interface.dart index 6fff33894..e5fc996bd 100644 --- a/lib/pages/namecoin_names/add_dns_record/name_form_interface.dart +++ b/lib/pages/namecoin_names/add_dns_record/name_form_interface.dart @@ -7,7 +7,9 @@ import '../../../utilities/text_styles.dart'; import '../../../utilities/util.dart'; abstract class NameFormStatefulWidget extends StatefulWidget { - const NameFormStatefulWidget({super.key}); + const NameFormStatefulWidget({super.key, required this.name}); + + final String name; } abstract class NameFormState @@ -54,8 +56,6 @@ class DNSFormField extends StatelessWidget { decoration: InputDecoration( isDense: true, contentPadding: const EdgeInsets.all(16), - fillColor: Colors.transparent, - // hintText: "e.g. ns1.stackwallet.com.", hintStyle: STextStyles.fieldLabel(context), border: InputBorder.none, enabledBorder: InputBorder.none, diff --git a/lib/pages/namecoin_names/add_dns_record/sub_widgets/a_form.dart b/lib/pages/namecoin_names/add_dns_record/sub_widgets/a_form.dart index fe120f17d..ec6728f9a 100644 --- a/lib/pages/namecoin_names/add_dns_record/sub_widgets/a_form.dart +++ b/lib/pages/namecoin_names/add_dns_record/sub_widgets/a_form.dart @@ -15,7 +15,7 @@ import '../../../../utilities/util.dart'; import '../name_form_interface.dart'; class AForm extends NameFormStatefulWidget { - const AForm({super.key}); + const AForm({super.key, required super.name}); @override NameFormState createState() => _AFormState(); @@ -25,7 +25,7 @@ class _AFormState extends NameFormState { final _addressDataController = TextEditingController(); final _addressDataFieldFocus = FocusNode(); - DNSAddressType? _addressType; + DNSAddressType _addressType = DNSAddressType.IPv4; @override DNSRecord buildRecord() { @@ -34,7 +34,7 @@ class _AFormState extends NameFormState { final List addresses = []; for (final part in parts) { - switch (_addressType!) { + switch (_addressType) { case DNSAddressType.IPv4: final address = InternetAddress(part.trim(), type: InternetAddressType.IPv4); @@ -102,6 +102,7 @@ class _AFormState extends NameFormState { } return DNSRecord( + name: widget.name, type: DNSRecordType.A, data: map, ); @@ -123,6 +124,9 @@ class _AFormState extends NameFormState { const DNSFieldText( "Address type", ), + SizedBox( + height: Util.isDesktop ? 10 : 8, + ), DropdownButtonHideUnderline( child: DropdownButton2( hint: Text( @@ -132,6 +136,7 @@ class _AFormState extends NameFormState { dropdownStyleData: DropdownStyleData( offset: const Offset(0, -10), elevation: 0, + maxHeight: Util.isDesktop ? null : 200, decoration: BoxDecoration( color: Theme.of(context) .extension()! @@ -156,12 +161,25 @@ class _AFormState extends NameFormState { }); } }, + buttonStyleData: ButtonStyleData( + decoration: BoxDecoration( + color: Theme.of(context) + .extension()! + .textFieldDefaultBG, + borderRadius: BorderRadius.circular( + Constants.size.circularBorderRadius, + ), + ), + ), iconStyleData: IconStyleData( - icon: SvgPicture.asset( - Assets.svg.chevronDown, - width: 10, - height: 5, - color: Theme.of(context).extension()!.textDark3, + icon: Padding( + padding: const EdgeInsets.only(right: 10), + child: SvgPicture.asset( + Assets.svg.chevronDown, + width: 10, + height: 5, + color: Theme.of(context).extension()!.textDark3, + ), ), ), items: [ @@ -188,6 +206,12 @@ class _AFormState extends NameFormState { SizedBox( height: Util.isDesktop ? 24 : 16, ), + const DNSFieldText( + "Value", + ), + SizedBox( + height: Util.isDesktop ? 10 : 8, + ), ClipRRect( borderRadius: BorderRadius.circular( Constants.size.circularBorderRadius, @@ -200,7 +224,6 @@ class _AFormState extends NameFormState { decoration: InputDecoration( isDense: true, contentPadding: const EdgeInsets.all(16), - fillColor: Colors.transparent, hintText: "e.g. 255.255.255.255, " "76f4a520a262c269dcba66bc1f560452e30a44e14ce6b37ce20b8.onion", hintStyle: STextStyles.fieldLabel(context), diff --git a/lib/pages/namecoin_names/add_dns_record/sub_widgets/cname_form.dart b/lib/pages/namecoin_names/add_dns_record/sub_widgets/cname_form.dart index 0c83a6b56..34cc7a600 100644 --- a/lib/pages/namecoin_names/add_dns_record/sub_widgets/cname_form.dart +++ b/lib/pages/namecoin_names/add_dns_record/sub_widgets/cname_form.dart @@ -6,7 +6,7 @@ import '../../../../utilities/util.dart'; import '../name_form_interface.dart'; class CNAMEForm extends NameFormStatefulWidget { - const CNAMEForm({super.key}); + const CNAMEForm({super.key, required super.name}); @override NameFormState createState() => _CNAMEFormState(); @@ -20,6 +20,7 @@ class _CNAMEFormState extends NameFormState { final address = _aliasController.text.trim(); return DNSRecord( + name: widget.name, type: DNSRecordType.CNAME, data: {"alias": address}, ); diff --git a/lib/pages/namecoin_names/add_dns_record/sub_widgets/ds_form.dart b/lib/pages/namecoin_names/add_dns_record/sub_widgets/ds_form.dart index dbab0d28f..29cdbaf6f 100644 --- a/lib/pages/namecoin_names/add_dns_record/sub_widgets/ds_form.dart +++ b/lib/pages/namecoin_names/add_dns_record/sub_widgets/ds_form.dart @@ -6,7 +6,7 @@ import '../../../../utilities/util.dart'; import '../name_form_interface.dart'; class DSForm extends NameFormStatefulWidget { - const DSForm({super.key}); + const DSForm({super.key, required super.name}); @override NameFormState createState() => _DSFormState(); @@ -21,6 +21,7 @@ class _DSFormState extends NameFormState { @override DNSRecord buildRecord() { return DNSRecord( + name: widget.name, type: DNSRecordType.DS, data: { "ds": [ diff --git a/lib/pages/namecoin_names/add_dns_record/sub_widgets/import_form.dart b/lib/pages/namecoin_names/add_dns_record/sub_widgets/import_form.dart index 02c95a3ee..cfcaa0d23 100644 --- a/lib/pages/namecoin_names/add_dns_record/sub_widgets/import_form.dart +++ b/lib/pages/namecoin_names/add_dns_record/sub_widgets/import_form.dart @@ -6,7 +6,7 @@ import '../../../../utilities/util.dart'; import '../name_form_interface.dart'; class IMPORTForm extends NameFormStatefulWidget { - const IMPORTForm({super.key}); + const IMPORTForm({super.key, required super.name}); @override NameFormState createState() => _IMPORTFormState(); @@ -19,6 +19,7 @@ class _IMPORTFormState extends NameFormState { @override DNSRecord buildRecord() { return DNSRecord( + name: widget.name, type: DNSRecordType.IMPORT, data: { "import": [ diff --git a/lib/pages/namecoin_names/add_dns_record/sub_widgets/ns_form.dart b/lib/pages/namecoin_names/add_dns_record/sub_widgets/ns_form.dart index 604a5736c..6d6eb914c 100644 --- a/lib/pages/namecoin_names/add_dns_record/sub_widgets/ns_form.dart +++ b/lib/pages/namecoin_names/add_dns_record/sub_widgets/ns_form.dart @@ -6,7 +6,7 @@ import '../../../../utilities/util.dart'; import '../name_form_interface.dart'; class NSForm extends NameFormStatefulWidget { - const NSForm({super.key}); + const NSForm({super.key, required super.name}); @override NameFormState createState() => _NSFormState(); @@ -20,6 +20,7 @@ class _NSFormState extends NameFormState { final address = _serverController.text.trim(); return DNSRecord( + name: widget.name, type: DNSRecordType.NS, data: { "ns": [address], diff --git a/lib/pages/namecoin_names/add_dns_record/sub_widgets/srv_form.dart b/lib/pages/namecoin_names/add_dns_record/sub_widgets/srv_form.dart index dff066abf..db3c01a0c 100644 --- a/lib/pages/namecoin_names/add_dns_record/sub_widgets/srv_form.dart +++ b/lib/pages/namecoin_names/add_dns_record/sub_widgets/srv_form.dart @@ -6,7 +6,7 @@ import '../../../../utilities/util.dart'; import '../name_form_interface.dart'; class SRVForm extends NameFormStatefulWidget { - const SRVForm({super.key}); + const SRVForm({super.key, required super.name}); @override NameFormState createState() => _SRVFormState(); @@ -21,6 +21,7 @@ class _SRVFormState extends NameFormState { @override DNSRecord buildRecord() { return DNSRecord( + name: widget.name, type: DNSRecordType.SRV, data: { "srv": [ diff --git a/lib/pages/namecoin_names/add_dns_record/sub_widgets/ssh_form.dart b/lib/pages/namecoin_names/add_dns_record/sub_widgets/ssh_form.dart index 9be1cbb8b..9503544be 100644 --- a/lib/pages/namecoin_names/add_dns_record/sub_widgets/ssh_form.dart +++ b/lib/pages/namecoin_names/add_dns_record/sub_widgets/ssh_form.dart @@ -6,7 +6,7 @@ import '../../../../utilities/util.dart'; import '../name_form_interface.dart'; class SSHForm extends NameFormStatefulWidget { - const SSHForm({super.key}); + const SSHForm({super.key, required super.name}); @override NameFormState createState() => _SSHFormState(); @@ -20,6 +20,7 @@ class _SSHFormState extends NameFormState { @override DNSRecord buildRecord() { return DNSRecord( + name: widget.name, type: DNSRecordType.SSH, data: { "sshfp": [ diff --git a/lib/pages/namecoin_names/add_dns_record/sub_widgets/tls_form.dart b/lib/pages/namecoin_names/add_dns_record/sub_widgets/tls_form.dart index bf2b1a33e..509e0b201 100644 --- a/lib/pages/namecoin_names/add_dns_record/sub_widgets/tls_form.dart +++ b/lib/pages/namecoin_names/add_dns_record/sub_widgets/tls_form.dart @@ -6,7 +6,7 @@ import '../../../../utilities/util.dart'; import '../name_form_interface.dart'; class TLSForm extends NameFormStatefulWidget { - const TLSForm({super.key}); + const TLSForm({super.key, required super.name}); @override NameFormState createState() => _TLSFormState(); @@ -18,6 +18,7 @@ class _TLSFormState extends NameFormState { @override DNSRecord buildRecord() { return DNSRecord( + name: widget.name, type: DNSRecordType.TLS, data: { "map": { diff --git a/lib/pages/namecoin_names/add_dns_record/sub_widgets/txt_form.dart b/lib/pages/namecoin_names/add_dns_record/sub_widgets/txt_form.dart index 64f2111b7..bd331cd21 100644 --- a/lib/pages/namecoin_names/add_dns_record/sub_widgets/txt_form.dart +++ b/lib/pages/namecoin_names/add_dns_record/sub_widgets/txt_form.dart @@ -6,7 +6,7 @@ import '../../../../utilities/util.dart'; import '../name_form_interface.dart'; class TXTForm extends NameFormStatefulWidget { - const TXTForm({super.key}); + const TXTForm({super.key, required super.name}); @override NameFormState createState() => _TXTFormState(); @@ -18,6 +18,7 @@ class _TXTFormState extends NameFormState { @override DNSRecord buildRecord() { return DNSRecord( + name: widget.name, type: DNSRecordType.TXT, data: { "txt": [_valueController.text.trim()], diff --git a/lib/pages/namecoin_names/buy_domain_view.dart b/lib/pages/namecoin_names/buy_domain_view.dart index 73a3f5772..a43266637 100644 --- a/lib/pages/namecoin_names/buy_domain_view.dart +++ b/lib/pages/namecoin_names/buy_domain_view.dart @@ -1,5 +1,6 @@ import 'dart:async'; +import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:namecoin/namecoin.dart'; @@ -20,6 +21,7 @@ import '../../models/namecoin_dns/dns_record_type.dart'; import '../../route_generator.dart'; import '../../themes/stack_colors.dart'; import '../../utilities/amount/amount_formatter.dart'; +import '../../utilities/show_loading.dart'; import '../../utilities/text_styles.dart'; import '../../wallets/isar/providers/wallet_info_provider.dart'; import '../../widgets/background.dart'; @@ -58,59 +60,76 @@ class _BuyDomainWidgetState extends ConsumerState { return DNSRecord.merge(_dnsRecords); } - bool _preRegLock = false; - Future _preRegister() async { - if (_preRegLock) return; - _preRegLock = true; - try { - final wallet = - ref.read(pWallets).getWallet(widget.walletId) as NamecoinWallet; - final myAddress = await wallet.getCurrentReceivingAddress(); - if (myAddress == null) { - throw Exception("No receiving address found"); - } + String _getNameFormattedForInternal() { + String formattedName = widget.domainName; + if (!formattedName.startsWith("d/")) { + formattedName = "d/$formattedName"; + } + if (formattedName.endsWith(".bit")) { + formattedName.split(".bit").first; + } + return formattedName; + } - final value = _getFormattedDNSRecords(); + Future _preRegFuture() async { + final wallet = + ref.read(pWallets).getWallet(widget.walletId) as NamecoinWallet; + final myAddress = await wallet.getCurrentReceivingAddress(); + if (myAddress == null) { + throw Exception("No receiving address found"); + } - Logging.instance.t("Formatted namecoin name value: $value"); + final value = _getFormattedDNSRecords(); - // get address private key for deterministic salt - final pk = await wallet.getPrivateKey(myAddress); + Logging.instance.t("Formatted namecoin name value: $value"); - String formattedName = widget.domainName; - if (!formattedName.startsWith("d/")) { - formattedName = "d/$formattedName"; - } - if (formattedName.endsWith(".bit")) { - formattedName.split(".bit").first; - } + // get address private key for deterministic salt + final pk = await wallet.getPrivateKey(myAddress); - final data = scriptNameNew(formattedName, pk.data); - - TxData txData = TxData( - opNameState: NameOpState( - name: formattedName, - saltHex: data.$2, - commitment: data.$3, - value: value, - nameScriptHex: data.$1, - type: OpName.nameNew, - outputPosition: -1, //currently unknown, updated later - ), - feeRateType: kNameTxDefaultFeeRate, // TODO: make configurable? - recipients: [ - ( - address: myAddress.value, - isChange: false, - amount: Amount( - rawValue: BigInt.from(kNameNewAmountSats), - fractionDigits: wallet.cryptoCurrency.fractionDigits, - ), + final formattedName = _getNameFormattedForInternal(); + + final data = await compute(_computeScriptNameNew, (formattedName, pk.data)); + + TxData txData = TxData( + opNameState: NameOpState( + name: formattedName, + saltHex: data.$2, + commitment: data.$3, + value: value, + nameScriptHex: data.$1, + type: OpName.nameNew, + outputPosition: -1, //currently unknown, updated later + ), + feeRateType: kNameTxDefaultFeeRate, // TODO: make configurable? + recipients: [ + ( + address: myAddress.value, + isChange: false, + amount: Amount( + rawValue: BigInt.from(kNameNewAmountSats), + fractionDigits: wallet.cryptoCurrency.fractionDigits, ), - ], - ); + ), + ], + ); + + txData = await wallet.prepareNameSend(txData: txData); + return txData; + } - txData = await wallet.prepareNameSend(txData: txData); + bool _preRegLock = false; + Future _preRegister() async { + if (_preRegLock) return; + _preRegLock = true; + try { + final txData = (await showLoading( + whileFuture: _preRegFuture(), + context: context, + message: "Preparing transaction...", + onException: (e) { + throw e; + }, + ))!; if (mounted) { if (Util.isDesktop) { @@ -121,7 +140,7 @@ class _BuyDomainWidgetState extends ConsumerState { width: 580, child: ConfirmNameTransactionView( txData: txData, - walletId: wallet.walletId, + walletId: widget.walletId, ), ), ), @@ -129,7 +148,7 @@ class _BuyDomainWidgetState extends ConsumerState { } else { await Navigator.of(context).pushNamed( ConfirmNameTransactionView.routeName, - arguments: (txData, wallet.walletId), + arguments: (txData, widget.walletId), ); } } @@ -145,7 +164,7 @@ class _BuyDomainWidgetState extends ConsumerState { await showDialog( context: context, builder: (_) => StackOkDialog( - title: "Add DNS record failed", + title: "Error", message: err, desktopPopRootNavigator: Util.isDesktop, maxWidth: Util.isDesktop ? 600 : null, @@ -191,23 +210,30 @@ class _BuyDomainWidgetState extends ConsumerState { ), DesktopDialogCloseButton( onPressedOverride: () { - Navigator.of(context, - rootNavigator: true) - .pop(); + Navigator.of( + context, + rootNavigator: true, + ).pop(); }, ), ], ), - const Padding( - padding: EdgeInsets.symmetric(horizontal: 32), - child: AddDnsStep1(), + Padding( + padding: const EdgeInsets.symmetric( + horizontal: 32, + ), + child: AddDnsStep1( + name: _getNameFormattedForInternal(), + ), ), ], ), ), ) - : const StackDialogBase( - child: AddDnsStep1(), + : StackDialogBase( + child: AddDnsStep1( + name: _getNameFormattedForInternal(), + ), ); }, ); @@ -247,6 +273,7 @@ class _BuyDomainWidgetState extends ConsumerState { builder: (child) { return Background( child: Scaffold( + backgroundColor: Colors.transparent, appBar: AppBar( leading: const AppBarBackButton(), titleSpacing: 0, @@ -256,9 +283,23 @@ class _BuyDomainWidgetState extends ConsumerState { overflow: TextOverflow.ellipsis, ), ), - body: Padding( - padding: const EdgeInsets.symmetric(horizontal: 16), - child: child, + body: SafeArea( + child: LayoutBuilder( + builder: (ctx, constraints) { + return SingleChildScrollView( + child: ConstrainedBox( + constraints: + BoxConstraints(minHeight: constraints.maxHeight), + child: IntrinsicHeight( + child: Padding( + padding: const EdgeInsets.symmetric(horizontal: 16), + child: child, + ), + ), + ), + ); + }, + ), ), ), ); @@ -279,7 +320,9 @@ class _BuyDomainWidgetState extends ConsumerState { height: Util.isDesktop ? 24 : 16, ), Row( - mainAxisAlignment: MainAxisAlignment.center, + mainAxisAlignment: Util.isDesktop + ? MainAxisAlignment.center + : MainAxisAlignment.start, children: [ Text( "Name registration will take approximately 2 to 4 hours.", @@ -363,15 +406,21 @@ class _BuyDomainWidgetState extends ConsumerState { ), ), SizedBox( - height: Util.isDesktop ? 16 : 8, + height: Util.isDesktop ? 24 : 16, ), - CustomTextButton( - text: _settingsHidden ? "More settings" : "Hide settings", - onTap: () { - setState(() { - _settingsHidden = !_settingsHidden; - }); - }, + ConditionalParent( + condition: !Util.isDesktop, + builder: (child) => Row( + children: [child], + ), + child: CustomTextButton( + text: _settingsHidden ? "More settings" : "Hide settings", + onTap: () { + setState(() { + _settingsHidden = !_settingsHidden; + }); + }, + ), ), if (!_settingsHidden) SizedBox( @@ -395,38 +444,38 @@ class _BuyDomainWidgetState extends ConsumerState { ), ), if (!_settingsHidden) - if (_dnsRecords.isNotEmpty) - ListView( - shrinkWrap: true, + ConditionalParent( + condition: !Util.isDesktop, + builder: (child) => Expanded(child: child), + child: Column( + mainAxisSize: MainAxisSize.min, children: [ ..._dnsRecords.map( (e) => DNSRecordCard( - key: Key(e.toString()), + key: ValueKey(e), record: e, onRemoveTapped: () => setState(() { _dnsRecords.remove(e); }), ), ), + SizedBox( + height: Util.isDesktop ? 16 : 8, + ), + SecondaryButton( + label: _dnsRecords.isEmpty + ? "Add DNS record" + : "Add another DNS record", + buttonHeight: Util.isDesktop ? ButtonHeight.l : null, + onPressed: _addRecord, + ), ], ), - if (!_settingsHidden) - SizedBox( - height: Util.isDesktop ? 16 : 8, - ), - if (!_settingsHidden) - SecondaryButton( - label: _dnsRecords.isEmpty - ? "Add DNS record" - : "Add another DNS record", - // width: Util.isDesktop ? 160 : double.infinity, - buttonHeight: Util.isDesktop ? ButtonHeight.l : null, - onPressed: _addRecord, ), SizedBox( height: Util.isDesktop ? 24 : 16, ), - if (!Util.isDesktop) const Spacer(), + if (!Util.isDesktop && _settingsHidden) const Spacer(), PrimaryButton( label: "Buy", // width: Util.isDesktop ? 160 : double.infinity, @@ -442,6 +491,10 @@ class _BuyDomainWidgetState extends ConsumerState { } } +(String, String, String) _computeScriptNameNew((String, Uint8List) args) { + return scriptNameNew(args.$1, args.$2); +} + class DNSRecordCard extends StatelessWidget { const DNSRecordCard({ super.key, diff --git a/lib/pages/namecoin_names/confirm_name_transaction_view.dart b/lib/pages/namecoin_names/confirm_name_transaction_view.dart index 53e6017d2..f1e21861e 100644 --- a/lib/pages/namecoin_names/confirm_name_transaction_view.dart +++ b/lib/pages/namecoin_names/confirm_name_transaction_view.dart @@ -492,11 +492,13 @@ class _ConfirmNameTransactionViewState ], ), ), - if (widget.txData.note!.isNotEmpty) + if (widget.txData.note != null && + widget.txData.note!.isNotEmpty) const SizedBox( height: 12, ), - if (widget.txData.note!.isNotEmpty) + if (widget.txData.note != null && + widget.txData.note!.isNotEmpty) RoundedWhiteContainer( child: Column( crossAxisAlignment: CrossAxisAlignment.stretch, diff --git a/lib/pages/namecoin_names/namecoin_names_home_view.dart b/lib/pages/namecoin_names/namecoin_names_home_view.dart index 8cc1e5068..8970de7c6 100644 --- a/lib/pages/namecoin_names/namecoin_names_home_view.dart +++ b/lib/pages/namecoin_names/namecoin_names_home_view.dart @@ -101,63 +101,150 @@ class _NamecoinNamesHomeViewState extends ConsumerState { condition: !isDesktop, builder: (child) => SafeArea( child: Padding( - padding: const EdgeInsets.all(16), + padding: const EdgeInsets.only( + top: 16, + left: 16, + right: 16, + ), child: child, ), ), - child: Column( - crossAxisAlignment: - isDesktop ? CrossAxisAlignment.start : CrossAxisAlignment.center, - children: [ - Padding( - padding: EdgeInsets.only( - top: Util.isDesktop ? 24 : 16, - left: Util.isDesktop ? 24 : 16, - right: Util.isDesktop ? 24 : 16, - ), - child: SizedBox( - height: 48, - child: Toggle( - key: UniqueKey(), - onColor: Theme.of(context).extension()!.popupBG, - offColor: Theme.of(context) - .extension()! - .textFieldDefaultBG, - onText: "Buy domain", - offText: "Manage domains", - isOn: !_onManage, - onValueChanged: (value) { - setState(() { - _onManage = !value; - }); - }, - decoration: BoxDecoration( - color: Colors.transparent, - borderRadius: BorderRadius.circular( - Constants.size.circularBorderRadius, - ), - ), + child: Util.isDesktop + ? Padding( + padding: const EdgeInsets.only( + top: 24, + left: 24, + right: 24, ), - ), - ), - Expanded( - child: Padding( - padding: EdgeInsets.all(Util.isDesktop ? 24 : 16), - child: IndexedStack( - index: _onManage ? 0 : 1, + child: Row( children: [ - BuyDomainOptionWidget( - walletId: widget.walletId, + SizedBox( + width: 460, + child: Column( + crossAxisAlignment: CrossAxisAlignment.stretch, + children: [ + Row( + children: [ + Text( + "Buy domain", + style: + STextStyles.desktopTextExtraSmall(context) + .copyWith( + color: Theme.of(context) + .extension()! + .textFieldActiveSearchIconLeft, + ), + ), + ], + ), + const SizedBox( + height: 14, + ), + Flexible( + child: BuyDomainOptionWidget( + walletId: widget.walletId, + ), + ), + ], + ), + ), + const SizedBox( + width: 24, ), - ManageDomainsOptionWidget( - walletId: widget.walletId, + Expanded( + child: Column( + crossAxisAlignment: CrossAxisAlignment.stretch, + children: [ + Row( + children: [ + Text( + "Manage domains", + style: + STextStyles.desktopTextExtraSmall(context) + .copyWith( + color: Theme.of(context) + .extension()! + .textFieldActiveSearchIconLeft, + ), + ), + ], + ), + const SizedBox( + height: 14, + ), + Flexible( + child: SingleChildScrollView( + child: ManageDomainsOptionWidget( + walletId: widget.walletId, + ), + ), + ), + ], + ), ), ], ), + ) + : Column( + crossAxisAlignment: CrossAxisAlignment.stretch, + children: [ + SizedBox( + height: 48, + child: Toggle( + key: UniqueKey(), + onColor: + Theme.of(context).extension()!.popupBG, + offColor: Theme.of(context) + .extension()! + .textFieldDefaultBG, + onText: "Buy domain", + offText: "Manage domains", + isOn: !_onManage, + onValueChanged: (value) { + FocusManager.instance.primaryFocus?.unfocus(); + setState(() { + _onManage = !value; + }); + }, + decoration: BoxDecoration( + color: Colors.transparent, + borderRadius: BorderRadius.circular( + Constants.size.circularBorderRadius, + ), + ), + ), + ), + const SizedBox( + height: 16, + ), + Expanded( + child: IndexedStack( + index: _onManage ? 0 : 1, + children: [ + BuyDomainOptionWidget( + walletId: widget.walletId, + ), + LayoutBuilder( + builder: (context, constraints) { + return ConstrainedBox( + constraints: BoxConstraints( + minHeight: constraints.maxHeight, + ), + child: SingleChildScrollView( + child: IntrinsicHeight( + child: ManageDomainsOptionWidget( + walletId: widget.walletId, + ), + ), + ), + ); + }, + ), + ], + ), + ), + ], ), - ), - ], - ), ), ); } diff --git a/lib/pages/namecoin_names/sub_widgets/buy_domain_option_widget.dart b/lib/pages/namecoin_names/sub_widgets/buy_domain_option_widget.dart index 14d902e88..966af3cad 100644 --- a/lib/pages/namecoin_names/sub_widgets/buy_domain_option_widget.dart +++ b/lib/pages/namecoin_names/sub_widgets/buy_domain_option_widget.dart @@ -182,7 +182,7 @@ class _BuyDomainWidgetState extends ConsumerState { ), Container( height: 48, - width: 100, + width: Util.isDesktop ? 100 : 74, decoration: BoxDecoration( color: Theme.of(context) .extension()! @@ -282,8 +282,8 @@ class _NameCard extends ConsumerWidget { PrimaryButton( label: "Buy domain", enabled: isAvailable, - buttonHeight: ButtonHeight.m, - width: 140, + buttonHeight: Util.isDesktop ? ButtonHeight.m : ButtonHeight.l, + width: Util.isDesktop ? 140 : 120, onPressed: () async { if (context.mounted) { if (Util.isDesktop) { diff --git a/lib/pages/namecoin_names/sub_widgets/manage_domains_option_widget.dart b/lib/pages/namecoin_names/sub_widgets/manage_domains_option_widget.dart index a9261c2bb..37044728b 100644 --- a/lib/pages/namecoin_names/sub_widgets/manage_domains_option_widget.dart +++ b/lib/pages/namecoin_names/sub_widgets/manage_domains_option_widget.dart @@ -1,10 +1,15 @@ +import 'dart:convert'; + import 'package:flutter/material.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:isar/isar.dart'; +import 'package:namecoin/namecoin.dart'; import '../../../models/isar/models/blockchain_data/utxo.dart'; import '../../../providers/db/main_db_provider.dart'; -import '../../../widgets/rounded_white_container.dart'; +import '../../../utilities/util.dart'; +import '../../../wallets/isar/providers/wallet_info_provider.dart'; +import 'owned_name_card.dart'; class ManageDomainsOptionWidget extends ConsumerStatefulWidget { const ManageDomainsOptionWidget({ @@ -23,6 +28,7 @@ class _ManageDomainsWidgetState extends ConsumerState { @override Widget build(BuildContext context) { + final height = ref.watch(pWalletChainHeight(widget.walletId)); return StreamBuilder( stream: ref.watch( mainDBProvider.select( @@ -35,19 +41,37 @@ class _ManageDomainsWidgetState ), ), builder: (context, snapshot) { - List list = []; + List<(UTXO, OpNameData)> list = []; if (snapshot.hasData) { - list = snapshot.data!; + list = snapshot.data!.map((utxo) { + final data = jsonDecode(utxo.otherData!) as Map; + + final nameData = jsonDecode(data["nameOpData"] as String) as Map; + + return ( + utxo, + OpNameData(nameData.cast(), utxo.blockHeight ?? height) + ); + }).toList(growable: false); } - return ListView.separated( - itemCount: list.length, - itemBuilder: (context, index) => RoundedWhiteContainer( - child: Text(list[index].otherData!), - ), - separatorBuilder: (context, index) => const SizedBox( - height: 10, - ), + return Column( + children: [ + ...list.map( + (e) => Padding( + padding: const EdgeInsets.only( + bottom: 10, + ), + child: OwnedNameCard( + utxo: e.$1, + opNameData: e.$2, + ), + ), + ), + SizedBox( + height: Util.isDesktop ? 14 : 6, + ), + ], ); }, ); diff --git a/lib/pages/namecoin_names/sub_widgets/name_details.dart b/lib/pages/namecoin_names/sub_widgets/name_details.dart new file mode 100644 index 000000000..6c8ff25ea --- /dev/null +++ b/lib/pages/namecoin_names/sub_widgets/name_details.dart @@ -0,0 +1,595 @@ +import 'dart:convert'; + +import 'package:flutter/material.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:isar/isar.dart'; +import 'package:namecoin/namecoin.dart'; + +import '../../../models/isar/models/isar_models.dart'; +import '../../../providers/db/main_db_provider.dart'; +import '../../../providers/global/secure_store_provider.dart'; +import '../../../themes/stack_colors.dart'; +import '../../../utilities/text_styles.dart'; +import '../../../utilities/util.dart'; +import '../../../wallets/isar/providers/wallet_info_provider.dart'; +import '../../../wallets/wallet/impl/namecoin_wallet.dart'; +import '../../../widgets/background.dart'; +import '../../../widgets/conditional_parent.dart'; +import '../../../widgets/custom_buttons/app_bar_icon_button.dart'; +import '../../../widgets/custom_buttons/simple_copy_button.dart'; +import '../../../widgets/desktop/desktop_dialog_close_button.dart'; +import '../../../widgets/rounded_container.dart'; +import '../../wallet_view/transaction_views/transaction_details_view.dart'; + +class NameDetailsView extends ConsumerStatefulWidget { + const NameDetailsView({ + super.key, + required this.utxoId, + required this.walletId, + }); + + static const routeName = "/namecoinNameDetails"; + + final Id utxoId; + final String walletId; + + @override + ConsumerState createState() => _ManageDomainsWidgetState(); +} + +class _ManageDomainsWidgetState extends ConsumerState { + late Stream streamUTXO; + UTXO? utxo; + OpNameData? opNameData; + + String? constructedName, value; + + Stream? streamLabel; + AddressLabel? label; + + void setUtxo(UTXO? utxo, int currentHeight) { + if (utxo != null) { + this.utxo = utxo; + final data = jsonDecode(utxo.otherData!) as Map; + + final nameData = jsonDecode(data["nameOpData"] as String) as Map; + opNameData = + OpNameData(nameData.cast(), utxo.blockHeight ?? currentHeight); + + _setName(); + } + } + + void _setName() { + try { + constructedName = opNameData!.constructedName; + value = opNameData!.value; + } catch (_) { + if (opNameData?.op == OpName.nameNew) { + ref + .read(secureStoreProvider) + .read( + key: nameSaltKeyBuilder( + utxo!.txid, + widget.walletId, + utxo!.vout, + ), + ) + .then((onValue) { + if (onValue != null) { + final data = (jsonDecode(onValue) as Map).cast(); + WidgetsBinding.instance.addPostFrameCallback((_) { + constructedName = data["name"]!; + value = data["value"]!; + if (mounted) { + setState(() {}); + } + }); + } else { + WidgetsBinding.instance.addPostFrameCallback((_) { + constructedName = "UNKNOWN"; + value = ""; + if (mounted) { + setState(() {}); + } + }); + } + }); + } + } + } + + @override + void initState() { + super.initState(); + + setUtxo( + ref + .read(mainDBProvider) + .isar + .utxos + .where() + .idEqualTo(widget.utxoId) + .findFirstSync(), + ref.read(pWalletChainHeight(widget.walletId)), + ); + + _setName(); + + if (utxo?.address != null) { + label = ref.read(mainDBProvider).getAddressLabelSync( + widget.walletId, + utxo!.address!, + ); + + if (label != null) { + streamLabel = ref.read(mainDBProvider).watchAddressLabel(id: label!.id); + } + } + + streamUTXO = ref.read(mainDBProvider).watchUTXO(id: widget.utxoId); + } + + @override + Widget build(BuildContext context) { + final currentHeight = ref.watch(pWalletChainHeight(widget.walletId)); + + final isExpired = opNameData?.expired(currentHeight) == true; + final isSemiExpired = opNameData?.expired(currentHeight, true) == true; + + return ConditionalParent( + condition: !Util.isDesktop, + builder: (child) => Background( + child: Scaffold( + backgroundColor: Colors.transparent, + appBar: AppBar( + backgroundColor: Colors.transparent, + // Theme.of(context).extension()!.background, + leading: const AppBarBackButton(), + title: Text( + "Domain details", + style: STextStyles.navBarTitle(context), + ), + ), + body: SafeArea( + child: LayoutBuilder( + builder: (context, constraints) { + return Padding( + padding: const EdgeInsets.symmetric(horizontal: 16), + child: SingleChildScrollView( + child: ConstrainedBox( + constraints: BoxConstraints( + minHeight: constraints.maxHeight, + ), + child: IntrinsicHeight( + child: child, + ), + ), + ), + ); + }, + ), + ), + ), + ), + child: ConditionalParent( + condition: Util.isDesktop, + builder: (child) { + return SizedBox( + width: 641, + child: Column( + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Padding( + padding: const EdgeInsets.only(left: 32), + child: Text( + "Domain details", + style: STextStyles.desktopH3(context), + ), + ), + const DesktopDialogCloseButton(), + ], + ), + Padding( + padding: const EdgeInsets.only( + left: 32, + right: 32, + bottom: 32, + top: 10, + ), + child: RoundedContainer( + padding: EdgeInsets.zero, + color: Colors.transparent, + borderColor: Theme.of(context) + .extension()! + .textFieldDefaultBG, + child: child, + ), + ), + ], + ), + ); + }, + child: StreamBuilder( + stream: streamUTXO, + builder: (context, snapshot) { + if (snapshot.hasData) { + setUtxo(snapshot.data!, currentHeight); + } + + return utxo == null + ? Center( + child: Text( + "Missing output. Was it used recently?", + style: STextStyles.w500_14(context).copyWith( + color: Theme.of(context) + .extension()! + .accentColorRed, + ), + ), + ) + : Column( + crossAxisAlignment: CrossAxisAlignment.stretch, + children: [ + // if (!isDesktop) + // const SizedBox( + // height: 10, + // ), + RoundedContainer( + padding: const EdgeInsets.all(12), + color: Util.isDesktop + ? Colors.transparent + : Theme.of(context) + .extension()! + .popupBG, + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Row( + children: [ + // if (isDesktop) + // UTXOStatusIcon( + // blocked: utxo!.isBlocked, + // status: confirmed + // ? UTXOStatusIconStatus.confirmed + // : UTXOStatusIconStatus.unconfirmed, + // background: Theme.of(context) + // .extension()! + // .popupBG, + // selected: false, + // width: 32, + // height: 32, + // ), + // if (isDesktop) + // const SizedBox( + // width: 16, + // ), + + SelectableText( + constructedName ?? "", + style: STextStyles.pageTitleH2(context), + ), + ], + ), + SelectableText( + opNameData!.op.name, + style: STextStyles.w500_14(context), + ), + ], + ), + ), + const _Div(), + RoundedContainer( + padding: Util.isDesktop + ? const EdgeInsets.all(16) + : const EdgeInsets.all(12), + color: Util.isDesktop + ? Colors.transparent + : Theme.of(context) + .extension()! + .popupBG, + child: Column( + mainAxisSize: MainAxisSize.min, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text( + "Value", + style: STextStyles.w500_14(context).copyWith( + color: Theme.of(context) + .extension()! + .textSubtitle1, + ), + ), + + // TODO: edit value + // SimpleEditButton( + // editValue: utxo!.name, + // editLabel: "label", + // onValueChanged: (newName) { + // MainDB.instance.putUTXO( + // utxo!.copyWith( + // name: newName, + // ), + // ); + // }, + // ), + ], + ), + const SizedBox( + height: 4, + ), + SelectableText( + value ?? "", + style: STextStyles.w500_14(context), + ), + ], + ), + ), + const _Div(), + RoundedContainer( + padding: Util.isDesktop + ? const EdgeInsets.all(16) + : const EdgeInsets.all(12), + color: Util.isDesktop + ? Colors.transparent + : Theme.of(context) + .extension()! + .popupBG, + child: Column( + mainAxisSize: MainAxisSize.min, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text( + "Address", + style: STextStyles.w500_14(context).copyWith( + color: Theme.of(context) + .extension()! + .textSubtitle1, + ), + ), + Util.isDesktop + ? IconCopyButton( + data: utxo!.address!, + ) + : SimpleCopyButton( + data: utxo!.address!, + ), + ], + ), + const SizedBox( + height: 4, + ), + SelectableText( + utxo!.address!, + style: STextStyles.w500_14(context), + ), + ], + ), + ), + if (label != null && label!.value.isNotEmpty) + const _Div(), + if (label != null && label!.value.isNotEmpty) + RoundedContainer( + padding: Util.isDesktop + ? const EdgeInsets.all(16) + : const EdgeInsets.all(12), + color: Util.isDesktop + ? Colors.transparent + : Theme.of(context) + .extension()! + .popupBG, + child: Column( + mainAxisSize: MainAxisSize.min, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row( + mainAxisAlignment: + MainAxisAlignment.spaceBetween, + children: [ + Text( + "Address label", + style: + STextStyles.w500_14(context).copyWith( + color: Theme.of(context) + .extension()! + .textSubtitle1, + ), + ), + Util.isDesktop + ? IconCopyButton( + data: label!.value, + ) + : SimpleCopyButton( + data: label!.value, + ), + ], + ), + const SizedBox( + height: 4, + ), + SelectableText( + label!.value, + style: STextStyles.w500_14(context), + ), + ], + ), + ), + const _Div(), + RoundedContainer( + padding: Util.isDesktop + ? const EdgeInsets.all(16) + : const EdgeInsets.all(12), + color: Util.isDesktop + ? Colors.transparent + : Theme.of(context) + .extension()! + .popupBG, + child: Column( + mainAxisSize: MainAxisSize.min, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text( + "Transaction ID", + style: STextStyles.w500_14(context).copyWith( + color: Theme.of(context) + .extension()! + .textSubtitle1, + ), + ), + Util.isDesktop + ? IconCopyButton( + data: utxo!.txid, + ) + : SimpleCopyButton( + data: utxo!.txid, + ), + ], + ), + const SizedBox( + height: 4, + ), + SelectableText( + utxo!.txid, + style: STextStyles.w500_14(context), + ), + ], + ), + ), + const _Div(), + RoundedContainer( + padding: Util.isDesktop + ? const EdgeInsets.all(16) + : const EdgeInsets.all(12), + color: Util.isDesktop + ? Colors.transparent + : Theme.of(context) + .extension()! + .popupBG, + child: Column( + mainAxisSize: MainAxisSize.min, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + "Expiry", + style: STextStyles.w500_14(context).copyWith( + color: Theme.of(context) + .extension()! + .textSubtitle1, + ), + ), + const SizedBox( + height: 4, + ), + Row( + children: [ + SelectableText( + isExpired + ? "Expired" + : "${opNameData!.expiredBlockLeft(currentHeight)!}", + style: STextStyles.w500_14(context).copyWith( + color: isExpired + ? Theme.of(context) + .extension()! + .accentColorRed + : isSemiExpired + ? Theme.of(context) + .extension()! + .accentColorYellow + : Theme.of(context) + .extension()! + .accentColorGreen, + ), + ), + if (!isExpired) + Text( + " blocks left", + style: + STextStyles.w500_14(context).copyWith( + color: isExpired + ? Theme.of(context) + .extension()! + .accentColorRed + : isSemiExpired + ? Theme.of(context) + .extension()! + .accentColorYellow + : Theme.of(context) + .extension()! + .accentColorGreen, + ), + ), + ], + ), + ], + ), + ), + const _Div(), + RoundedContainer( + padding: Util.isDesktop + ? const EdgeInsets.all(16) + : const EdgeInsets.all(12), + color: Util.isDesktop + ? Colors.transparent + : Theme.of(context) + .extension()! + .popupBG, + child: Column( + mainAxisSize: MainAxisSize.min, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + "Confirmations", + style: STextStyles.w500_14(context).copyWith( + color: Theme.of(context) + .extension()! + .textSubtitle1, + ), + ), + const SizedBox( + height: 4, + ), + SelectableText( + "${utxo!.getConfirmations(currentHeight)}", + style: STextStyles.w500_14(context), + ), + ], + ), + ), + ], + ); + }, + ), + ), + ); + } +} + +class _Div extends StatelessWidget { + const _Div({super.key}); + + @override + Widget build(BuildContext context) { + if (Util.isDesktop) { + return Container( + width: double.infinity, + height: 1.0, + color: Theme.of(context).extension()!.textFieldDefaultBG, + ); + } else { + return const SizedBox( + height: 12, + ); + } + } +} diff --git a/lib/pages/namecoin_names/sub_widgets/owned_name_card.dart b/lib/pages/namecoin_names/sub_widgets/owned_name_card.dart new file mode 100644 index 000000000..79a08dcd6 --- /dev/null +++ b/lib/pages/namecoin_names/sub_widgets/owned_name_card.dart @@ -0,0 +1,183 @@ +import 'dart:convert'; + +import 'package:flutter/material.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:namecoin/namecoin.dart'; + +import '../../../models/isar/models/isar_models.dart'; +import '../../../providers/global/secure_store_provider.dart'; +import '../../../themes/stack_colors.dart'; +import '../../../utilities/text_styles.dart'; +import '../../../utilities/util.dart'; +import '../../../wallets/isar/providers/wallet_info_provider.dart'; +import '../../../wallets/wallet/impl/namecoin_wallet.dart'; +import '../../../widgets/desktop/primary_button.dart'; +import '../../../widgets/dialogs/s_dialog.dart'; +import '../../../widgets/rounded_white_container.dart'; +import 'name_details.dart'; + +class OwnedNameCard extends ConsumerStatefulWidget { + const OwnedNameCard({ + super.key, + required this.opNameData, + required this.utxo, + }); + + final OpNameData opNameData; + final UTXO utxo; + + @override + ConsumerState createState() => _OwnedNameCardState(); +} + +class _OwnedNameCardState extends ConsumerState { + String? constructedName, value; + + (String, Color) getExpiry(int currentChainHeight, StackColors theme) { + final String message; + final Color color; + + final remaining = widget.opNameData.expiredBlockLeft( + currentChainHeight, + false, + ); + final semiRemaining = widget.opNameData.expiredBlockLeft( + currentChainHeight, + true, + ); + + if (remaining == null) { + color = theme.accentColorRed; + message = "Expired"; + } else { + message = "$remaining blocks remaining"; + if (semiRemaining == null) { + color = theme.accentColorYellow; + } else { + color = theme.accentColorGreen; + } + } + + return (message, color); + } + + bool _lock = false; + + Future _showDetails() async { + if (_lock) return; + _lock = true; + try { + if (Util.isDesktop) { + await showDialog( + context: context, + builder: (context) => SDialog( + child: NameDetailsView( + utxoId: widget.utxo.id, + walletId: widget.utxo.walletId, + ), + ), + ); + } else { + await Navigator.of(context).pushNamed( + NameDetailsView.routeName, + arguments: ( + widget.utxo.id, + widget.utxo.walletId, + ), + ); + } + } finally { + _lock = false; + } + } + + void _setName() { + try { + constructedName = widget.opNameData.constructedName; + value = widget.opNameData.value; + } catch (_) { + if (widget.opNameData.op == OpName.nameNew) { + ref + .read(secureStoreProvider) + .read( + key: nameSaltKeyBuilder( + widget.utxo.txid, + widget.utxo.walletId, + widget.utxo.vout, + ), + ) + .then((onValue) { + if (onValue != null) { + final data = (jsonDecode(onValue) as Map).cast(); + WidgetsBinding.instance.addPostFrameCallback((_) { + constructedName = data["name"]!; + value = data["value"]!; + if (mounted) { + setState(() {}); + } + }); + } else { + WidgetsBinding.instance.addPostFrameCallback((_) { + constructedName = "UNKNOWN"; + value = ""; + if (mounted) { + setState(() {}); + } + }); + } + }); + } + } + } + + @override + void initState() { + super.initState(); + _setName(); + } + + @override + Widget build(BuildContext context) { + final (message, color) = getExpiry( + ref.watch(pWalletChainHeight(widget.utxo.walletId)), + Theme.of(context).extension()!, + ); + + return RoundedWhiteContainer( + child: Row( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Expanded( + flex: 5, + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + SelectableText(constructedName ?? ""), + if (value != null) + const SizedBox( + height: 8, + ), + if (value != null) SelectableText(value!), + ], + ), + ), + Expanded( + flex: 2, + child: SelectableText( + message, + style: STextStyles.w500_12(context).copyWith( + color: color, + ), + ), + ), + PrimaryButton( + label: "Details", + buttonHeight: Util.isDesktop ? ButtonHeight.xs : ButtonHeight.l, + onPressed: _showDetails, + ), + ], + ), + ); + } +} diff --git a/lib/route_generator.dart b/lib/route_generator.dart index 3e51359ae..1539bdbeb 100644 --- a/lib/route_generator.dart +++ b/lib/route_generator.dart @@ -75,6 +75,7 @@ import 'pages/monkey/monkey_view.dart'; import 'pages/namecoin_names/buy_domain_view.dart'; import 'pages/namecoin_names/confirm_name_transaction_view.dart'; import 'pages/namecoin_names/namecoin_names_home_view.dart'; +import 'pages/namecoin_names/sub_widgets/name_details.dart'; import 'pages/notification_views/notifications_view.dart'; import 'pages/ordinals/ordinal_details_view.dart'; import 'pages/ordinals/ordinals_filter_view.dart'; @@ -719,6 +720,21 @@ class RouteGenerator { } return _routeError("${settings.name} invalid args: ${args.toString()}"); + case NameDetailsView.routeName: + if (args is (Id, String)) { + return getRoute( + shouldUseMaterialRoute: useMaterialPageRoute, + builder: (_) => NameDetailsView( + walletId: args.$2, + utxoId: args.$1, + ), + settings: RouteSettings( + name: settings.name, + ), + ); + } + return _routeError("${settings.name} invalid args: ${args.toString()}"); + case PaynymClaimView.routeName: if (args is String) { return getRoute( diff --git a/lib/wallets/wallet/impl/namecoin_wallet.dart b/lib/wallets/wallet/impl/namecoin_wallet.dart index 87dd63acc..ce6856baa 100644 --- a/lib/wallets/wallet/impl/namecoin_wallet.dart +++ b/lib/wallets/wallet/impl/namecoin_wallet.dart @@ -890,6 +890,12 @@ class NamecoinWallet final feeRateAmount = txData.feeRateAmount; final utxos = txData.utxos; + if (txData.note == null) { + txData = txData.copyWith( + note: "Name transaction ${txData.opNameState!.type.name}", + ); + } + final bool coinControl = utxos != null; if (customSatsPerVByte != null) { diff --git a/lib/widgets/desktop/desktop_scaffold.dart b/lib/widgets/desktop/desktop_scaffold.dart index 25b18963b..920c66306 100644 --- a/lib/widgets/desktop/desktop_scaffold.dart +++ b/lib/widgets/desktop/desktop_scaffold.dart @@ -9,6 +9,7 @@ */ import 'package:flutter/material.dart'; + import '../../themes/stack_colors.dart'; import '../background.dart'; @@ -70,8 +71,7 @@ class MasterScaffold extends StatelessWidget { } else { return Background( child: Scaffold( - backgroundColor: background ?? - Theme.of(context).extension()!.background, + backgroundColor: background ?? Colors.transparent, appBar: appBar as PreferredSizeWidget?, body: body, ), From ae97d3ce24bce169ff58d81fa7205312353b760e Mon Sep 17 00:00:00 2001 From: julian Date: Thu, 20 Feb 2025 17:48:44 -0600 Subject: [PATCH 089/193] domain name input length restriction --- .../sub_widgets/buy_domain_option_widget.dart | 180 +++++++++++------- lib/utilities/text_formatters.dart | 63 ++++++ 2 files changed, 179 insertions(+), 64 deletions(-) create mode 100644 lib/utilities/text_formatters.dart diff --git a/lib/pages/namecoin_names/sub_widgets/buy_domain_option_widget.dart b/lib/pages/namecoin_names/sub_widgets/buy_domain_option_widget.dart index 966af3cad..1040dda4f 100644 --- a/lib/pages/namecoin_names/sub_widgets/buy_domain_option_widget.dart +++ b/lib/pages/namecoin_names/sub_widgets/buy_domain_option_widget.dart @@ -3,13 +3,16 @@ import 'dart:async'; import 'package:flutter/material.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:flutter_svg/svg.dart'; +import 'package:namecoin/namecoin.dart'; import '../../../providers/providers.dart'; import '../../../themes/stack_colors.dart'; import '../../../utilities/assets.dart'; import '../../../utilities/constants.dart'; +import '../../../utilities/extensions/impl/string.dart'; import '../../../utilities/logger.dart'; import '../../../utilities/show_loading.dart'; +import '../../../utilities/text_formatters.dart'; import '../../../utilities/text_styles.dart'; import '../../../utilities/util.dart'; import '../../../wallets/wallet/impl/namecoin_wallet.dart'; @@ -31,6 +34,8 @@ class BuyDomainOptionWidget extends ConsumerStatefulWidget { } class _BuyDomainWidgetState extends ConsumerState { + static const kMaxByteLength = nameMaxLength - 2; // subtract length of "d/" + final _nameController = TextEditingController(); final _nameFieldFocus = FocusNode(); @@ -77,11 +82,17 @@ class _BuyDomainWidgetState extends ConsumerState { } catch (e, s) { Logging.instance.e("_lookup failed", error: e, stackTrace: s); + String? err; + if (e.toString().contains("Contains invalid characters")) { + err = "Contains invalid characters"; + } + if (mounted) { await showDialog( context: context, builder: (_) => StackOkDialog( title: "Name lookup failed", + message: err, desktopPopRootNavigator: Util.isDesktop, maxWidth: Util.isDesktop ? 600 : null, ), @@ -111,6 +122,7 @@ class _BuyDomainWidgetState extends ConsumerState { @override Widget build(BuildContext context) { + final double dotBitBoxLength = Util.isDesktop ? 100 : 74; return Column( crossAxisAlignment: Util.isDesktop ? CrossAxisAlignment.start : CrossAxisAlignment.center, @@ -140,6 +152,11 @@ class _BuyDomainWidgetState extends ConsumerState { children: [ Expanded( child: TextField( + inputFormatters: [ + Utf8ByteLengthLimitingTextInputFormatter( + kMaxByteLength, + ), + ], textInputAction: TextInputAction.search, focusNode: _nameFieldFocus, controller: _nameController, @@ -170,7 +187,7 @@ class _BuyDomainWidgetState extends ConsumerState { _lookup(); } }, - onChanged: (_) { + onChanged: (value) { // trigger look up button enabled/disabled state change setState(() {}); }, @@ -182,7 +199,7 @@ class _BuyDomainWidgetState extends ConsumerState { ), Container( height: 48, - width: Util.isDesktop ? 100 : 74, + width: dotBitBoxLength, decoration: BoxDecoration( color: Theme.of(context) .extension()! @@ -209,6 +226,31 @@ class _BuyDomainWidgetState extends ConsumerState { ], ), ), + const SizedBox( + height: 4, + ), + Row( + mainAxisAlignment: MainAxisAlignment.end, + children: [ + Padding( + padding: EdgeInsets.only(right: dotBitBoxLength), + child: Builder( + builder: (context) { + final length = + _nameController.text.toUint8ListFromUtf8.lengthInBytes; + return Text( + "$length/$kMaxByteLength", + style: STextStyles.w500_10(context).copyWith( + color: Theme.of(context) + .extension()! + .textSubtitle2, + ), + ); + }, + ), + ), + ], + ), SizedBox( height: Util.isDesktop ? 24 : 16, ), @@ -263,78 +305,88 @@ class _NameCard extends ConsumerWidget { mainAxisAlignment: MainAxisAlignment.spaceBetween, crossAxisAlignment: CrossAxisAlignment.stretch, children: [ - Column( - crossAxisAlignment: CrossAxisAlignment.start, - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - Text( - "${formattedName.substring(2)}.bit", - style: style, - ), - Text( - availability, - style: style.copyWith( - color: color, + Flexible( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text( + "${formattedName.substring(2)}.bit", + style: style, ), - ), - ], + const SizedBox( + height: 4, + ), + Text( + availability, + style: style.copyWith( + color: color, + ), + ), + ], + ), ), - PrimaryButton( - label: "Buy domain", - enabled: isAvailable, - buttonHeight: Util.isDesktop ? ButtonHeight.m : ButtonHeight.l, - width: Util.isDesktop ? 140 : 120, - onPressed: () async { - if (context.mounted) { - if (Util.isDesktop) { - await showDialog( - context: context, - builder: (context) => SDialog( - child: SizedBox( - width: 580, - child: Column( - children: [ - Row( - mainAxisAlignment: - MainAxisAlignment.spaceBetween, + Column( + children: [ + PrimaryButton( + label: "Buy domain", + enabled: isAvailable, + buttonHeight: + Util.isDesktop ? ButtonHeight.m : ButtonHeight.l, + width: Util.isDesktop ? 140 : 120, + onPressed: () async { + if (context.mounted) { + if (Util.isDesktop) { + await showDialog( + context: context, + builder: (context) => SDialog( + child: SizedBox( + width: 580, + child: Column( children: [ + Row( + mainAxisAlignment: + MainAxisAlignment.spaceBetween, + children: [ + Padding( + padding: const EdgeInsets.only( + left: 32, + ), + child: Text( + "Buy domain", + style: STextStyles.desktopH3(context), + ), + ), + const DesktopDialogCloseButton(), + ], + ), Padding( - padding: const EdgeInsets.only( - left: 32, + padding: const EdgeInsets.symmetric( + horizontal: 32, ), - child: Text( - "Buy domain", - style: STextStyles.desktopH3(context), + child: BuyDomainView( + walletId: walletId, + domainName: formattedName, ), ), - const DesktopDialogCloseButton(), ], ), - Padding( - padding: const EdgeInsets.symmetric( - horizontal: 32, - ), - child: BuyDomainView( - walletId: walletId, - domainName: formattedName, - ), - ), - ], + ), ), - ), - ), - ); - } else { - await Navigator.of(context).pushNamed( - BuyDomainView.routeName, - arguments: ( - walletId: walletId, - domainName: formattedName - ), - ); - } - } - }, + ); + } else { + await Navigator.of(context).pushNamed( + BuyDomainView.routeName, + arguments: ( + walletId: walletId, + domainName: formattedName + ), + ); + } + } + }, + ), + ], ), ], ), diff --git a/lib/utilities/text_formatters.dart b/lib/utilities/text_formatters.dart new file mode 100644 index 000000000..70a96231d --- /dev/null +++ b/lib/utilities/text_formatters.dart @@ -0,0 +1,63 @@ +import 'dart:convert'; +import 'dart:math' as math; + +import 'package:flutter/services.dart'; + +class Utf8ByteLengthLimitingTextInputFormatter extends TextInputFormatter { + Utf8ByteLengthLimitingTextInputFormatter( + this.maxBytes, + ) : assert(maxBytes == -1 || maxBytes > 0); + + final int maxBytes; + + static TextEditingValue truncate(TextEditingValue value, int maxBytes) { + final String text = value.text; + final encoded = utf8.encode(text); + + if (encoded.length <= maxBytes) { + return value; + } + + int validLength = maxBytes; + while (validLength > 0 && (encoded[validLength] & 0xC0) == 0x80) { + validLength--; + } + + final truncated = utf8.decode(encoded.sublist(0, validLength)); + + return TextEditingValue( + text: truncated, + selection: value.selection.copyWith( + baseOffset: math.min(value.selection.start, truncated.length), + extentOffset: math.min(value.selection.end, truncated.length), + ), + composing: !value.composing.isCollapsed && + truncated.length > value.composing.start + ? TextRange( + start: value.composing.start, + end: math.min(value.composing.end, truncated.length), + ) + : TextRange.empty, + ); + } + + @override + TextEditingValue formatEditUpdate( + TextEditingValue oldValue, + TextEditingValue newValue, + ) { + if (maxBytes == -1 || + utf8.encode(newValue.text).lengthInBytes <= maxBytes) { + return newValue; + } + + assert(maxBytes > 0); + + if (utf8.encode(oldValue.text).lengthInBytes == maxBytes && + oldValue.selection.isCollapsed) { + return oldValue; + } + + return truncate(newValue, maxBytes); + } +} From edaaeda838037e566d825fb491f796589cfbc961 Mon Sep 17 00:00:00 2001 From: julian Date: Thu, 20 Feb 2025 17:49:25 -0600 Subject: [PATCH 090/193] clean up domain names management ui somewhat --- .../manage_domains_option_widget.dart | 24 ++++++ .../sub_widgets/name_details.dart | 2 +- .../sub_widgets/owned_name_card.dart | 83 ++++++++++++++----- 3 files changed, 86 insertions(+), 23 deletions(-) diff --git a/lib/pages/namecoin_names/sub_widgets/manage_domains_option_widget.dart b/lib/pages/namecoin_names/sub_widgets/manage_domains_option_widget.dart index 37044728b..2d696d64b 100644 --- a/lib/pages/namecoin_names/sub_widgets/manage_domains_option_widget.dart +++ b/lib/pages/namecoin_names/sub_widgets/manage_domains_option_widget.dart @@ -26,6 +26,25 @@ class ManageDomainsOptionWidget extends ConsumerStatefulWidget { class _ManageDomainsWidgetState extends ConsumerState { + double _tempWidth = 0; + double? _width; + int _count = 0; + + void _sillyHack(double value, int length) { + if (value > _tempWidth) _tempWidth = value; + _count++; + if (_count == length) { + WidgetsBinding.instance.addPostFrameCallback((_) { + if (mounted) { + setState(() { + _width = _tempWidth; + _tempWidth = 0; + }); + } + }); + } + } + @override Widget build(BuildContext context) { final height = ref.watch(pWalletChainHeight(widget.walletId)); @@ -65,6 +84,11 @@ class _ManageDomainsWidgetState child: OwnedNameCard( utxo: e.$1, opNameData: e.$2, + firstColWidth: _width, + calculatedFirstColWidth: (value) => _sillyHack( + value, + list.length, + ), ), ), ), diff --git a/lib/pages/namecoin_names/sub_widgets/name_details.dart b/lib/pages/namecoin_names/sub_widgets/name_details.dart index 6c8ff25ea..33bd9a30c 100644 --- a/lib/pages/namecoin_names/sub_widgets/name_details.dart +++ b/lib/pages/namecoin_names/sub_widgets/name_details.dart @@ -513,7 +513,7 @@ class _ManageDomainsWidgetState extends ConsumerState { ), if (!isExpired) Text( - " blocks left", + " blocks remaining", style: STextStyles.w500_14(context).copyWith( color: isExpired diff --git a/lib/pages/namecoin_names/sub_widgets/owned_name_card.dart b/lib/pages/namecoin_names/sub_widgets/owned_name_card.dart index 79a08dcd6..74b6577c2 100644 --- a/lib/pages/namecoin_names/sub_widgets/owned_name_card.dart +++ b/lib/pages/namecoin_names/sub_widgets/owned_name_card.dart @@ -11,6 +11,7 @@ import '../../../utilities/text_styles.dart'; import '../../../utilities/util.dart'; import '../../../wallets/isar/providers/wallet_info_provider.dart'; import '../../../wallets/wallet/impl/namecoin_wallet.dart'; +import '../../../widgets/conditional_parent.dart'; import '../../../widgets/desktop/primary_button.dart'; import '../../../widgets/dialogs/s_dialog.dart'; import '../../../widgets/rounded_white_container.dart'; @@ -21,11 +22,16 @@ class OwnedNameCard extends ConsumerStatefulWidget { super.key, required this.opNameData, required this.utxo, + this.firstColWidth, + this.calculatedFirstColWidth, }); final OpNameData opNameData; final UTXO utxo; + final double? firstColWidth; + final void Function(double)? calculatedFirstColWidth; + @override ConsumerState createState() => _OwnedNameCardState(); } @@ -33,7 +39,7 @@ class OwnedNameCard extends ConsumerStatefulWidget { class _OwnedNameCardState extends ConsumerState { String? constructedName, value; - (String, Color) getExpiry(int currentChainHeight, StackColors theme) { + (String, Color) _getExpiry(int currentChainHeight, StackColors theme) { final String message; final Color color; @@ -50,7 +56,7 @@ class _OwnedNameCardState extends ConsumerState { color = theme.accentColorRed; message = "Expired"; } else { - message = "$remaining blocks remaining"; + message = "Expires in $remaining blocks"; if (semiRemaining == null) { color = theme.accentColorYellow; } else { @@ -136,9 +142,13 @@ class _OwnedNameCardState extends ConsumerState { _setName(); } + double _callbackWidth = 0; + @override Widget build(BuildContext context) { - final (message, color) = getExpiry( + debugPrint("BUILD: $runtimeType"); + + final (message, color) = _getExpiry( ref.watch(pWalletChainHeight(widget.utxo.walletId)), Theme.of(context).extension()!, ); @@ -148,29 +158,58 @@ class _OwnedNameCardState extends ConsumerState { crossAxisAlignment: CrossAxisAlignment.start, mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ - Expanded( - flex: 5, - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - SelectableText(constructedName ?? ""), - if (value != null) - const SizedBox( - height: 8, - ), - if (value != null) SelectableText(value!), - ], + ConditionalParent( + condition: widget.firstColWidth != null && Util.isDesktop, + builder: (child) => ConstrainedBox( + constraints: BoxConstraints(maxWidth: widget.firstColWidth!), + child: child, ), - ), - Expanded( - flex: 2, - child: SelectableText( - message, - style: STextStyles.w500_12(context).copyWith( - color: color, + child: ConditionalParent( + condition: widget.firstColWidth == null && Util.isDesktop, + builder: (child) => LayoutBuilder( + builder: (context, constraints) { + if (widget.firstColWidth == null && + _callbackWidth != constraints.maxWidth) { + _callbackWidth = constraints.maxWidth; + widget.calculatedFirstColWidth?.call(_callbackWidth); + } + return ConstrainedBox( + constraints: BoxConstraints(maxWidth: constraints.maxWidth), + child: child, + ); + }, + ), + child: Padding( + padding: const EdgeInsets.only(right: 12), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + SelectableText(constructedName ?? ""), + const SizedBox( + height: 8, + ), + SelectableText( + message, + style: STextStyles.w500_12(context).copyWith( + color: color, + ), + ), + ], + ), ), ), ), + if (Util.isDesktop) + Expanded( + child: SelectableText( + value ?? "", + style: STextStyles.w500_12(context), + ), + ), + if (Util.isDesktop) + const SizedBox( + width: 12, + ), PrimaryButton( label: "Details", buttonHeight: Util.isDesktop ? ButtonHeight.xs : ButtonHeight.l, From 9fc63686441d6ad7fa74541febd6c0fdc6e99e7d Mon Sep 17 00:00:00 2001 From: julian Date: Fri, 21 Feb 2025 10:41:11 -0600 Subject: [PATCH 091/193] WIP: manage domain ui --- lib/pages/namecoin_names/buy_domain_view.dart | 10 +- .../namecoin_names/manage_domain_view.dart | 109 +++++ .../sub_widgets/name_details.dart | 126 ++++-- .../sub_widgets/transfer_option_widget.dart | 424 ++++++++++++++++++ .../sub_widgets/update_option_widget.dart | 105 +++++ lib/route_generator.dart | 16 + lib/wallets/models/name_op_state.dart | 8 +- lib/wallets/wallet/impl/namecoin_wallet.dart | 16 +- 8 files changed, 771 insertions(+), 43 deletions(-) create mode 100644 lib/pages/namecoin_names/manage_domain_view.dart create mode 100644 lib/pages/namecoin_names/sub_widgets/transfer_option_widget.dart create mode 100644 lib/pages/namecoin_names/sub_widgets/update_option_widget.dart diff --git a/lib/pages/namecoin_names/buy_domain_view.dart b/lib/pages/namecoin_names/buy_domain_view.dart index a43266637..19f6dafda 100644 --- a/lib/pages/namecoin_names/buy_domain_view.dart +++ b/lib/pages/namecoin_names/buy_domain_view.dart @@ -155,12 +155,12 @@ class _BuyDomainWidgetState extends ConsumerState { } catch (e, s) { Logging.instance.e("_preRegister failed", error: e, stackTrace: s); - String err = e.toString(); - if (err.startsWith("Exception: ")) { - err = err.replaceFirst("Exception: ", ""); - } - if (mounted) { + String err = e.toString(); + if (err.startsWith("Exception: ")) { + err = err.replaceFirst("Exception: ", ""); + } + await showDialog( context: context, builder: (_) => StackOkDialog( diff --git a/lib/pages/namecoin_names/manage_domain_view.dart b/lib/pages/namecoin_names/manage_domain_view.dart new file mode 100644 index 000000000..ba17957be --- /dev/null +++ b/lib/pages/namecoin_names/manage_domain_view.dart @@ -0,0 +1,109 @@ +import 'package:flutter/material.dart'; + +import '../../models/isar/models/blockchain_data/utxo.dart'; +import '../../themes/stack_colors.dart'; +import '../../utilities/constants.dart'; +import '../../utilities/text_styles.dart'; +import '../../utilities/util.dart'; +import '../../widgets/background.dart'; +import '../../widgets/conditional_parent.dart'; +import '../../widgets/custom_buttons/app_bar_icon_button.dart'; +import '../../widgets/toggle.dart'; +import 'sub_widgets/transfer_option_widget.dart'; +import 'sub_widgets/update_option_widget.dart'; + +class ManageDomainView extends StatefulWidget { + const ManageDomainView({ + super.key, + required this.walletId, + required this.utxo, + }); + + final String walletId; + final UTXO utxo; + + static const routeName = "/manageDomainView"; + + @override + State createState() => _ManageDomainViewState(); +} + +class _ManageDomainViewState extends State { + bool _onTransfer = true; + + @override + Widget build(BuildContext context) { + return ConditionalParent( + condition: !Util.isDesktop, + builder: (child) { + return Background( + child: Scaffold( + backgroundColor: Colors.transparent, + appBar: AppBar( + leading: const AppBarBackButton(), + titleSpacing: 0, + title: Text( + "Manage domain", + style: STextStyles.navBarTitle(context), + overflow: TextOverflow.ellipsis, + ), + ), + body: SafeArea( + child: Padding( + padding: const EdgeInsets.symmetric(horizontal: 16), + child: child, + ), + ), + ), + ); + }, + child: Column( + children: [ + SizedBox( + height: 48, + child: Toggle( + key: UniqueKey(), + onColor: Theme.of(context).extension()!.popupBG, + offColor: Theme.of(context) + .extension()! + .textFieldDefaultBG, + onText: "Transfer", + offText: "Update", + isOn: !_onTransfer, + onValueChanged: (value) { + FocusManager.instance.primaryFocus?.unfocus(); + setState(() { + _onTransfer = !value; + }); + }, + decoration: BoxDecoration( + color: Colors.transparent, + borderRadius: BorderRadius.circular( + Constants.size.circularBorderRadius, + ), + ), + ), + ), + const SizedBox( + height: 16, + ), + Expanded( + child: IndexedStack( + index: _onTransfer ? 0 : 1, + children: [ + TransferOptionWidget( + walletId: widget.walletId, + utxo: widget.utxo, + ), + UpdateOptionWidget( + walletId: widget.walletId, + utxo: widget.utxo, + ), + ], + ), + ), + ], + ), + ); + } +} diff --git a/lib/pages/namecoin_names/sub_widgets/name_details.dart b/lib/pages/namecoin_names/sub_widgets/name_details.dart index 33bd9a30c..48114aa9a 100644 --- a/lib/pages/namecoin_names/sub_widgets/name_details.dart +++ b/lib/pages/namecoin_names/sub_widgets/name_details.dart @@ -16,10 +16,13 @@ import '../../../wallets/wallet/impl/namecoin_wallet.dart'; import '../../../widgets/background.dart'; import '../../../widgets/conditional_parent.dart'; import '../../../widgets/custom_buttons/app_bar_icon_button.dart'; +import '../../../widgets/custom_buttons/blue_text_button.dart'; import '../../../widgets/custom_buttons/simple_copy_button.dart'; import '../../../widgets/desktop/desktop_dialog_close_button.dart'; +import '../../../widgets/dialogs/s_dialog.dart'; import '../../../widgets/rounded_container.dart'; import '../../wallet_view/transaction_views/transaction_details_view.dart'; +import '../manage_domain_view.dart'; class NameDetailsView extends ConsumerStatefulWidget { const NameDetailsView({ @@ -150,6 +153,27 @@ class _ManageDomainsWidgetState extends ConsumerState { "Domain details", style: STextStyles.navBarTitle(context), ), + actions: utxo == null + ? null + : [ + Padding( + padding: const EdgeInsets.only( + top: 10, + bottom: 10, + right: 10, + ), + child: CustomTextButton( + key: const Key("addAddressBookEntryFavoriteButtonKey"), + text: "Manage", + onTap: () { + Navigator.of(context).pushNamed( + ManageDomainView.routeName, + arguments: (walletId: widget.walletId, utxo: utxo!), + ); + }, + ), + ), + ], ), body: SafeArea( child: LayoutBuilder( @@ -247,36 +271,79 @@ class _ManageDomainsWidgetState extends ConsumerState { child: Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ - Row( + Column( + crossAxisAlignment: CrossAxisAlignment.start, children: [ - // if (isDesktop) - // UTXOStatusIcon( - // blocked: utxo!.isBlocked, - // status: confirmed - // ? UTXOStatusIconStatus.confirmed - // : UTXOStatusIconStatus.unconfirmed, - // background: Theme.of(context) - // .extension()! - // .popupBG, - // selected: false, - // width: 32, - // height: 32, - // ), - // if (isDesktop) - // const SizedBox( - // width: 16, - // ), - SelectableText( constructedName ?? "", style: STextStyles.pageTitleH2(context), ), + if (Util.isDesktop) + SelectableText( + opNameData!.op.name, + style: STextStyles.w500_14(context), + ), ], ), - SelectableText( - opNameData!.op.name, - style: STextStyles.w500_14(context), - ), + if (Util.isDesktop && utxo != null) + CustomTextButton( + text: "Manage", + onTap: () { + showDialog( + context: context, + builder: (context) { + return SDialog( + child: SizedBox( + width: 641, + child: Column( + children: [ + Row( + mainAxisAlignment: + MainAxisAlignment + .spaceBetween, + children: [ + Padding( + padding: + const EdgeInsets.only( + left: 32, + ), + child: Text( + "Manage domain", + style: + STextStyles.desktopH3( + context, + ), + ), + ), + const DesktopDialogCloseButton(), + ], + ), + Padding( + padding: const EdgeInsets.only( + left: 32, + right: 32, + bottom: 32, + ), + child: IntrinsicHeight( + child: ManageDomainView( + walletId: widget.walletId, + utxo: utxo!, + ), + ), + ), + ], + ), + ), + ); + }, + ); + }, + ), + if (!Util.isDesktop) + SelectableText( + opNameData!.op.name, + style: STextStyles.w500_14(context), + ), ], ), ), @@ -305,19 +372,6 @@ class _ManageDomainsWidgetState extends ConsumerState { .textSubtitle1, ), ), - - // TODO: edit value - // SimpleEditButton( - // editValue: utxo!.name, - // editLabel: "label", - // onValueChanged: (newName) { - // MainDB.instance.putUTXO( - // utxo!.copyWith( - // name: newName, - // ), - // ); - // }, - // ), ], ), const SizedBox( diff --git a/lib/pages/namecoin_names/sub_widgets/transfer_option_widget.dart b/lib/pages/namecoin_names/sub_widgets/transfer_option_widget.dart new file mode 100644 index 000000000..1bd9c9cde --- /dev/null +++ b/lib/pages/namecoin_names/sub_widgets/transfer_option_widget.dart @@ -0,0 +1,424 @@ +import 'dart:async'; + +import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:namecoin/namecoin.dart'; + +import '../../../models/isar/models/blockchain_data/utxo.dart'; +import '../../../providers/providers.dart'; +import '../../../utilities/address_utils.dart'; +import '../../../utilities/amount/amount.dart'; +import '../../../utilities/barcode_scanner_interface.dart'; +import '../../../utilities/clipboard_interface.dart'; +import '../../../utilities/constants.dart'; +import '../../../utilities/logger.dart'; +import '../../../utilities/text_styles.dart'; +import '../../../utilities/util.dart'; +import '../../../wallets/isar/providers/wallet_info_provider.dart'; +import '../../../wallets/models/name_op_state.dart'; +import '../../../wallets/models/tx_data.dart'; +import '../../../wallets/wallet/impl/namecoin_wallet.dart'; +import '../../../widgets/desktop/primary_button.dart'; +import '../../../widgets/dialogs/s_dialog.dart'; +import '../../../widgets/icon_widgets/addressbook_icon.dart'; +import '../../../widgets/icon_widgets/clipboard_icon.dart'; +import '../../../widgets/icon_widgets/qrcode_icon.dart'; +import '../../../widgets/icon_widgets/x_icon.dart'; +import '../../../widgets/stack_dialog.dart'; +import '../../../widgets/stack_text_field.dart'; +import '../../../widgets/textfield_icon_button.dart'; +import '../../address_book_views/address_book_view.dart'; +import '../../send_view/sub_widgets/building_transaction_dialog.dart'; +import '../confirm_name_transaction_view.dart'; + +class TransferOptionWidget extends ConsumerStatefulWidget { + const TransferOptionWidget({ + super.key, + required this.walletId, + required this.utxo, + this.clipboard = const ClipboardWrapper(), + this.barcodeScanner = const BarcodeScannerWrapper(), + }); + + final String walletId; + final UTXO utxo; + + final ClipboardInterface clipboard; + final BarcodeScannerInterface barcodeScanner; + + @override + ConsumerState createState() => + _TransferOptionWidgetState(); +} + +class _TransferOptionWidgetState extends ConsumerState { + late final String walletId; + late final ClipboardInterface clipboard; + late final BarcodeScannerInterface scanner; + late final TextEditingController _addressController; + late final FocusNode _addressFocusNode; + + String? _address; + + bool _previewLock = false; + Future _preview() async { + if (_previewLock) return; + _previewLock = true; + + // wait for keyboard to disappear + FocusScope.of(context).unfocus(); + await Future.delayed( + const Duration(milliseconds: 100), + ); + + try { + final wallet = ref.read(pWallets).getWallet(walletId) as NamecoinWallet; + + bool wasCancelled = false; + + if (mounted) { + unawaited( + showDialog( + context: context, + useSafeArea: false, + barrierDismissible: false, + builder: (context) { + return BuildingTransactionDialog( + coin: wallet.info.coin, + isSpark: false, + onCancel: () { + wasCancelled = true; + Navigator.of(context).pop(); + }, + ); + }, + ), + ); + } + + final time = Future.delayed( + const Duration( + milliseconds: 2500, + ), + ); + + final txDataFuture = wallet.prepareNameSend( + txData: TxData( + feeRateType: kNameTxDefaultFeeRate, // TODO: make configurable? + recipients: [ + ( + address: _address!, + isChange: false, + amount: Amount( + rawValue: BigInt.from(kNameAmountSats), + fractionDigits: wallet.cryptoCurrency.fractionDigits, + ), + ), + ], + note: "Transfer domain name", + opNameState: NameOpState( + name: "", + saltHex: "", + commitment: "", + value: "", + nameScriptHex: "", + type: OpName.nameUpdate, + output: widget.utxo, + outputPosition: -1, //currently unknown, updated later + ), + // satsPerVByte: isCustomFee ? customFeeRate : null, + // utxos: (wallet is CoinControlInterface && + // coinControlEnabled && + // selectedUTXOs.isNotEmpty) + // ? selectedUTXOs + // : null, + ), + ); + + final results = await Future.wait([ + txDataFuture, + time, + ]); + + final txData = results.first as TxData; + + if (!wasCancelled && mounted) { + // pop building dialog + Navigator.of(context).pop(); + + if (mounted) { + if (Util.isDesktop) { + await showDialog( + context: context, + builder: (context) => SDialog( + child: SizedBox( + width: 580, + child: ConfirmNameTransactionView( + txData: txData, + walletId: widget.walletId, + ), + ), + ), + ); + } else { + await Navigator.of(context).pushNamed( + ConfirmNameTransactionView.routeName, + arguments: (txData, widget.walletId), + ); + } + } + } + } catch (e, s) { + Logging.instance.e("_preview failed", error: e, stackTrace: s); + + if (mounted) { + String err = e.toString(); + if (err.startsWith("Exception: ")) { + err = err.replaceFirst("Exception: ", ""); + } + + await showDialog( + context: context, + builder: (_) => StackOkDialog( + title: "Error", + message: err, + desktopPopRootNavigator: Util.isDesktop, + maxWidth: Util.isDesktop ? 600 : null, + ), + ); + } + } finally { + _previewLock = false; + } + } + + bool _enableButton = false; + + void _setValidAddressProviders(String? address) { + _enableButton = ref + .read(pWallets) + .getWallet(walletId) + .cryptoCurrency + .validateAddress(address ?? ""); + if (mounted) { + setState(() {}); + } + } + + Future _scanQr() async { + try { + if (FocusScope.of(context).hasFocus) { + FocusScope.of(context).unfocus(); + await Future.delayed(const Duration(milliseconds: 75)); + } + + final qrResult = await scanner.scan(); + final coin = ref.read(pWalletCoin(walletId)); + + Logging.instance.d("qrResult content: ${qrResult.rawContent}"); + + final paymentData = AddressUtils.parsePaymentUri( + qrResult.rawContent, + logging: Logging.instance, + ); + + if (paymentData != null && + paymentData.coin?.uriScheme == coin.uriScheme) { + // auto fill address + _address = paymentData.address.trim(); + _addressController.text = _address!; + + _setValidAddressProviders(_address); + + // now check for non standard encoded basic address + } else { + _address = qrResult.rawContent.split("\n").first.trim(); + _addressController.text = _address ?? ""; + + _setValidAddressProviders(_address); + } + } on PlatformException catch (e, s) { + // here we ignore the exception caused by not giving permission + // to use the camera to scan a qr code + Logging.instance.e( + "Failed to get camera permissions while trying to scan qr code in" + " $runtimeType", + error: e, + stackTrace: s, + ); + } + } + + @override + void initState() { + super.initState(); + walletId = widget.walletId; + clipboard = widget.clipboard; + scanner = widget.barcodeScanner; + _addressController = TextEditingController(); + _addressFocusNode = FocusNode(); + WidgetsBinding.instance.addPostFrameCallback((_) { + if (mounted) { + _addressFocusNode.requestFocus(); + } + }); + } + + @override + void dispose() { + _addressController.dispose(); + _addressFocusNode.dispose(); + super.dispose(); + } + + @override + Widget build(BuildContext context) { + return Column( + mainAxisSize: MainAxisSize.min, + crossAxisAlignment: + Util.isDesktop ? CrossAxisAlignment.start : CrossAxisAlignment.center, + children: [ + ClipRRect( + borderRadius: BorderRadius.circular( + Constants.size.circularBorderRadius, + ), + child: TextField( + key: const Key("nameTransferViewAddressFieldKey"), + controller: _addressController, + readOnly: false, + autocorrect: false, + enableSuggestions: false, + toolbarOptions: const ToolbarOptions( + copy: false, + cut: false, + paste: true, + selectAll: false, + ), + onChanged: (newValue) { + _address = newValue.trim(); + _setValidAddressProviders(_address); + }, + focusNode: _addressFocusNode, + style: STextStyles.field(context), + decoration: standardInputDecoration( + "Enter ${ref.watch(pWalletCoin(walletId)).ticker} address", + _addressFocusNode, + context, + ).copyWith( + contentPadding: const EdgeInsets.only( + left: 16, + top: 6, + bottom: 8, + right: 5, + ), + suffixIcon: Padding( + padding: _addressController.text.isEmpty + ? const EdgeInsets.only(right: 8) + : const EdgeInsets.only(right: 0), + child: UnconstrainedBox( + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceAround, + children: [ + _addressController.text.isNotEmpty + ? TextFieldIconButton( + semanticsLabel: + "Clear Button. Clears The Address Field Input.", + key: const Key( + "nameTransferClearAddressFieldButtonKey", + ), + onTap: () { + _addressController.text = ""; + _address = ""; + _setValidAddressProviders( + _address, + ); + setState(() {}); + }, + child: const XIcon(), + ) + : TextFieldIconButton( + semanticsLabel: + "Paste Button. Pastes From Clipboard To Address Field Input.", + key: const Key( + "nameTransferPasteAddressFieldButtonKey", + ), + onTap: () async { + final ClipboardData? data = + await clipboard.getData( + Clipboard.kTextPlain, + ); + if (data?.text != null && + data!.text!.isNotEmpty) { + String content = data.text!.trim(); + if (content.contains("\n")) { + content = content.substring( + 0, + content.indexOf( + "\n", + ), + ); + } + + _addressController.text = content.trim(); + _address = content.trim(); + + _setValidAddressProviders( + _address, + ); + } + }, + child: _addressController.text.isEmpty + ? const ClipboardIcon() + : const XIcon(), + ), + if (_addressController.text.isEmpty) + TextFieldIconButton( + semanticsLabel: + "Address Book Button. Opens Address Book For Address Field.", + key: const Key( + "nameTransferAddressBookButtonKey", + ), + onTap: () { + Navigator.of(context).pushNamed( + AddressBookView.routeName, + arguments: ref.read(pWalletCoin(walletId)), + ); + }, + child: const AddressBookIcon(), + ), + if (_addressController.text.isEmpty) + TextFieldIconButton( + semanticsLabel: + "Scan QR Button. Opens Camera For Scanning QR Code.", + key: const Key( + "nameTransferScanQrButtonKey", + ), + onTap: _scanQr, + child: const QrCodeIcon(), + ), + ], + ), + ), + ), + ), + ), + ), + SizedBox( + height: Util.isDesktop ? 24 : 16, + ), + // if (!Util.isDesktop) const Spacer(), + PrimaryButton( + label: "Transfer", + enabled: _enableButton, + // width: Util.isDesktop ? 160 : double.infinity, + buttonHeight: Util.isDesktop ? ButtonHeight.l : null, + onPressed: _preview, + ), + SizedBox( + height: Util.isDesktop ? 24 : 16, + ), + ], + ); + } +} diff --git a/lib/pages/namecoin_names/sub_widgets/update_option_widget.dart b/lib/pages/namecoin_names/sub_widgets/update_option_widget.dart new file mode 100644 index 000000000..64ffe7423 --- /dev/null +++ b/lib/pages/namecoin_names/sub_widgets/update_option_widget.dart @@ -0,0 +1,105 @@ +import 'dart:async'; + +import 'package:flutter/material.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; + +import '../../../models/isar/models/blockchain_data/utxo.dart'; +import '../../../utilities/barcode_scanner_interface.dart'; +import '../../../utilities/clipboard_interface.dart'; +import '../../../utilities/logger.dart'; +import '../../../utilities/util.dart'; +import '../../../widgets/desktop/secondary_button.dart'; +import '../../../widgets/stack_dialog.dart'; + +class UpdateOptionWidget extends ConsumerStatefulWidget { + const UpdateOptionWidget({ + super.key, + required this.walletId, + required this.utxo, + this.clipboard = const ClipboardWrapper(), + this.barcodeScanner = const BarcodeScannerWrapper(), + }); + + final String walletId; + final UTXO utxo; + + final ClipboardInterface clipboard; + final BarcodeScannerInterface barcodeScanner; + + @override + ConsumerState createState() => _BuyDomainWidgetState(); +} + +class _BuyDomainWidgetState extends ConsumerState { + final _nameController = TextEditingController(); + final _nameFieldFocus = FocusNode(); + + bool _lookupLock = false; + Future _lookup() async { + if (_lookupLock) return; + _lookupLock = true; + try {} catch (e, s) { + Logging.instance.e("_lookup failed", error: e, stackTrace: s); + + String? err; + if (e.toString().contains("Contains invalid characters")) { + err = "Contains invalid characters"; + } + + if (mounted) { + await showDialog( + context: context, + builder: (_) => StackOkDialog( + title: "Name lookup failed", + message: err, + desktopPopRootNavigator: Util.isDesktop, + maxWidth: Util.isDesktop ? 600 : null, + ), + ); + } + } finally { + _lookupLock = false; + } + } + + @override + void initState() { + super.initState(); + WidgetsBinding.instance.addPostFrameCallback((_) { + if (mounted) { + _nameFieldFocus.requestFocus(); + } + }); + } + + @override + void dispose() { + _nameController.dispose(); + _nameFieldFocus.dispose(); + super.dispose(); + } + + @override + Widget build(BuildContext context) { + return Column( + mainAxisSize: MainAxisSize.min, + crossAxisAlignment: + Util.isDesktop ? CrossAxisAlignment.start : CrossAxisAlignment.center, + children: [ + SizedBox( + height: Util.isDesktop ? 24 : 16, + ), + SecondaryButton( + label: "Update", + enabled: _nameController.text.isNotEmpty, + // width: Util.isDesktop ? 160 : double.infinity, + buttonHeight: Util.isDesktop ? ButtonHeight.l : null, + onPressed: _lookup, + ), + SizedBox( + height: Util.isDesktop ? 24 : 16, + ), + ], + ); + } +} diff --git a/lib/route_generator.dart b/lib/route_generator.dart index 1539bdbeb..6695a53b8 100644 --- a/lib/route_generator.dart +++ b/lib/route_generator.dart @@ -74,6 +74,7 @@ import 'pages/manage_favorites_view/manage_favorites_view.dart'; import 'pages/monkey/monkey_view.dart'; import 'pages/namecoin_names/buy_domain_view.dart'; import 'pages/namecoin_names/confirm_name_transaction_view.dart'; +import 'pages/namecoin_names/manage_domain_view.dart'; import 'pages/namecoin_names/namecoin_names_home_view.dart'; import 'pages/namecoin_names/sub_widgets/name_details.dart'; import 'pages/notification_views/notifications_view.dart'; @@ -805,6 +806,21 @@ class RouteGenerator { } return _routeError("${settings.name} invalid args: ${args.toString()}"); + case ManageDomainView.routeName: + if (args is ({String walletId, UTXO utxo})) { + return getRoute( + shouldUseMaterialRoute: useMaterialPageRoute, + builder: (_) => ManageDomainView( + walletId: args.walletId, + utxo: args.utxo, + ), + settings: RouteSettings( + name: settings.name, + ), + ); + } + return _routeError("${settings.name} invalid args: ${args.toString()}"); + case FusionProgressView.routeName: if (args is String) { return getRoute( diff --git a/lib/wallets/models/name_op_state.dart b/lib/wallets/models/name_op_state.dart index 577663f12..5390db018 100644 --- a/lib/wallets/models/name_op_state.dart +++ b/lib/wallets/models/name_op_state.dart @@ -1,5 +1,7 @@ import 'package:namecoin/namecoin.dart'; +import '../../models/isar/models/blockchain_data/utxo.dart'; + class NameOpState { final String name; final OpName type; @@ -8,6 +10,7 @@ class NameOpState { final String value; final String nameScriptHex; final int outputPosition; + final UTXO? output; NameOpState({ required this.name, @@ -17,6 +20,7 @@ class NameOpState { required this.value, required this.nameScriptHex, required this.outputPosition, + this.output, }); NameOpState copyWith({ @@ -36,6 +40,7 @@ class NameOpState { value: value ?? this.value, nameScriptHex: nameScriptHex ?? this.nameScriptHex, outputPosition: outputPosition ?? this.outputPosition, + output: output, ); } @@ -48,6 +53,7 @@ class NameOpState { "commitment: $commitment, " "value: $value, " "nameScriptHex: $nameScriptHex, " - "outputPosition: $outputPosition)"; + "outputPosition: $outputPosition, " + "output: $output)"; } } diff --git a/lib/wallets/wallet/impl/namecoin_wallet.dart b/lib/wallets/wallet/impl/namecoin_wallet.dart index ce6856baa..0f863cc14 100644 --- a/lib/wallets/wallet/impl/namecoin_wallet.dart +++ b/lib/wallets/wallet/impl/namecoin_wallet.dart @@ -982,6 +982,11 @@ class NamecoinWallet throw Exception("Coin control used where utxos is null!"); } + if (txData.opNameState!.type == OpName.nameUpdate && + txData.opNameState!.output == null) { + throw Exception("Missing name output to update"); + } + final recipientAddress = txData.recipients!.first.address; final satoshiAmountToSend = txData.amount!.raw; final int? satsPerVByte = txData.satsPerVByte; @@ -1005,6 +1010,12 @@ class NamecoinWallet final List availableOutputs = utxos ?? await mainDB.getUTXOs(walletId).findAll(); + + if (txData.opNameState!.type == OpName.nameUpdate) { + // name output is added later + availableOutputs.removeWhere((e) => e == txData.opNameState!.output!); + } + final currentChainHeight = await chainHeight; final canCPFP = this is CpfpInterface && coinControl; @@ -1138,7 +1149,10 @@ class NamecoinWallet BigInt satoshisBeingUsed = BigInt.zero; int inputsBeingConsumed = 0; - final List utxoObjectsToUse = []; + final List utxoObjectsToUse = [ + if (txData.opNameState!.type == OpName.nameUpdate) + txData.opNameState!.output!, + ]; if (!coinControl) { for (int i = 0; From 05767dea1317f4676b221d9fb70613b5c855f026 Mon Sep 17 00:00:00 2001 From: julian Date: Mon, 24 Feb 2025 12:05:58 -0600 Subject: [PATCH 092/193] name tx note tweaks --- lib/pages/namecoin_names/buy_domain_view.dart | 1 + lib/wallets/wallet/impl/namecoin_wallet.dart | 7 +++++++ 2 files changed, 8 insertions(+) diff --git a/lib/pages/namecoin_names/buy_domain_view.dart b/lib/pages/namecoin_names/buy_domain_view.dart index 19f6dafda..d0dddda3e 100644 --- a/lib/pages/namecoin_names/buy_domain_view.dart +++ b/lib/pages/namecoin_names/buy_domain_view.dart @@ -100,6 +100,7 @@ class _BuyDomainWidgetState extends ConsumerState { type: OpName.nameNew, outputPosition: -1, //currently unknown, updated later ), + note: "Reserve ${widget.domainName.substring(2)}.bit", feeRateType: kNameTxDefaultFeeRate, // TODO: make configurable? recipients: [ ( diff --git a/lib/wallets/wallet/impl/namecoin_wallet.dart b/lib/wallets/wallet/impl/namecoin_wallet.dart index 0f863cc14..10c804022 100644 --- a/lib/wallets/wallet/impl/namecoin_wallet.dart +++ b/lib/wallets/wallet/impl/namecoin_wallet.dart @@ -580,6 +580,12 @@ class NamecoinWallet data.salt, ); + String noteName = + data.name.startsWith("d/") ? data.name.substring(2) : data.name; + if (!noteName.endsWith(".bit")) { + noteName += ".bit"; + } + TxData txData = TxData( utxos: {utxo}, opNameState: NameOpState( @@ -591,6 +597,7 @@ class NamecoinWallet type: OpName.nameFirstUpdate, outputPosition: -1, //currently unknown, updated later ), + note: "Purchase $noteName", feeRateType: kNameTxDefaultFeeRate, // TODO: make configurable? recipients: [ ( From 6539b75f9f3e84d2e9c942a185d9f6baad1fae6d Mon Sep 17 00:00:00 2001 From: julian Date: Mon, 24 Feb 2025 15:17:49 -0600 Subject: [PATCH 093/193] mobile/desktop name ui clean up and transfer name functionality --- .../confirm_name_transaction_view.dart | 8 +- .../namecoin_names/manage_domain_view.dart | 123 ++++++------- .../manage_domains_option_widget.dart | 1 + .../sub_widgets/name_details.dart | 173 ++++++++++++------ .../sub_widgets/transfer_option_widget.dart | 128 +++++++++---- lib/wallets/wallet/impl/namecoin_wallet.dart | 136 +++----------- 6 files changed, 304 insertions(+), 265 deletions(-) diff --git a/lib/pages/namecoin_names/confirm_name_transaction_view.dart b/lib/pages/namecoin_names/confirm_name_transaction_view.dart index f1e21861e..ec0fc926a 100644 --- a/lib/pages/namecoin_names/confirm_name_transaction_view.dart +++ b/lib/pages/namecoin_names/confirm_name_transaction_view.dart @@ -15,6 +15,7 @@ import 'package:decimal/decimal.dart'; import 'package:flutter/material.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:flutter_svg/svg.dart'; +import 'package:namecoin/namecoin.dart'; import '../../models/isar/models/transaction_note.dart'; import '../../notifications/show_flush_bar.dart'; @@ -160,8 +161,13 @@ class _ConfirmNameTransactionViewState Navigator.of(context, rootNavigator: Util.isDesktop).pop(); // pop confirm send view Navigator.of(context, rootNavigator: Util.isDesktop).pop(); - // pop buy popup //TODO test on mobile + // pop buy popup Navigator.of(context, rootNavigator: Util.isDesktop).pop(); + + // pop name details view + if (txData.opNameState!.type == OpName.nameUpdate) { + Navigator.of(context, rootNavigator: Util.isDesktop).pop(); + } } } catch (e, s) { const niceError = "Broadcast name transaction failed"; diff --git a/lib/pages/namecoin_names/manage_domain_view.dart b/lib/pages/namecoin_names/manage_domain_view.dart index ba17957be..6d2679d60 100644 --- a/lib/pages/namecoin_names/manage_domain_view.dart +++ b/lib/pages/namecoin_names/manage_domain_view.dart @@ -4,9 +4,7 @@ import '../../models/isar/models/blockchain_data/utxo.dart'; import '../../themes/stack_colors.dart'; import '../../utilities/constants.dart'; import '../../utilities/text_styles.dart'; -import '../../utilities/util.dart'; import '../../widgets/background.dart'; -import '../../widgets/conditional_parent.dart'; import '../../widgets/custom_buttons/app_bar_icon_button.dart'; import '../../widgets/toggle.dart'; import 'sub_widgets/transfer_option_widget.dart'; @@ -33,76 +31,71 @@ class _ManageDomainViewState extends State { @override Widget build(BuildContext context) { - return ConditionalParent( - condition: !Util.isDesktop, - builder: (child) { - return Background( - child: Scaffold( - backgroundColor: Colors.transparent, - appBar: AppBar( - leading: const AppBarBackButton(), - titleSpacing: 0, - title: Text( - "Manage domain", - style: STextStyles.navBarTitle(context), - overflow: TextOverflow.ellipsis, - ), - ), - body: SafeArea( - child: Padding( - padding: const EdgeInsets.symmetric(horizontal: 16), - child: child, - ), - ), + return Background( + child: Scaffold( + backgroundColor: Colors.transparent, + appBar: AppBar( + leading: const AppBarBackButton(), + titleSpacing: 0, + title: Text( + "Manage domain", + style: STextStyles.navBarTitle(context), + overflow: TextOverflow.ellipsis, ), - ); - }, - child: Column( - children: [ - SizedBox( - height: 48, - child: Toggle( - key: UniqueKey(), - onColor: Theme.of(context).extension()!.popupBG, - offColor: Theme.of(context) - .extension()! - .textFieldDefaultBG, - onText: "Transfer", - offText: "Update", - isOn: !_onTransfer, - onValueChanged: (value) { - FocusManager.instance.primaryFocus?.unfocus(); - setState(() { - _onTransfer = !value; - }); - }, - decoration: BoxDecoration( - color: Colors.transparent, - borderRadius: BorderRadius.circular( - Constants.size.circularBorderRadius, - ), - ), - ), - ), - const SizedBox( - height: 16, - ), - Expanded( - child: IndexedStack( - index: _onTransfer ? 0 : 1, + ), + body: SafeArea( + child: Padding( + padding: const EdgeInsets.symmetric(horizontal: 16), + child: Column( children: [ - TransferOptionWidget( - walletId: widget.walletId, - utxo: widget.utxo, + SizedBox( + height: 48, + child: Toggle( + key: UniqueKey(), + onColor: + Theme.of(context).extension()!.popupBG, + offColor: Theme.of(context) + .extension()! + .textFieldDefaultBG, + onText: "Transfer", + offText: "Update", + isOn: !_onTransfer, + onValueChanged: (value) { + FocusManager.instance.primaryFocus?.unfocus(); + setState(() { + _onTransfer = !value; + }); + }, + decoration: BoxDecoration( + color: Colors.transparent, + borderRadius: BorderRadius.circular( + Constants.size.circularBorderRadius, + ), + ), + ), + ), + const SizedBox( + height: 16, ), - UpdateOptionWidget( - walletId: widget.walletId, - utxo: widget.utxo, + Expanded( + child: IndexedStack( + index: _onTransfer ? 0 : 1, + children: [ + TransferOptionWidget( + walletId: widget.walletId, + utxo: widget.utxo, + ), + UpdateOptionWidget( + walletId: widget.walletId, + utxo: widget.utxo, + ), + ], + ), ), ], ), ), - ], + ), ), ); } diff --git a/lib/pages/namecoin_names/sub_widgets/manage_domains_option_widget.dart b/lib/pages/namecoin_names/sub_widgets/manage_domains_option_widget.dart index 2d696d64b..f4a7df875 100644 --- a/lib/pages/namecoin_names/sub_widgets/manage_domains_option_widget.dart +++ b/lib/pages/namecoin_names/sub_widgets/manage_domains_option_widget.dart @@ -82,6 +82,7 @@ class _ManageDomainsWidgetState bottom: 10, ), child: OwnedNameCard( + key: ValueKey(e), utxo: e.$1, opNameData: e.$2, firstColWidth: _width, diff --git a/lib/pages/namecoin_names/sub_widgets/name_details.dart b/lib/pages/namecoin_names/sub_widgets/name_details.dart index 48114aa9a..fbcbb01f3 100644 --- a/lib/pages/namecoin_names/sub_widgets/name_details.dart +++ b/lib/pages/namecoin_names/sub_widgets/name_details.dart @@ -19,10 +19,13 @@ import '../../../widgets/custom_buttons/app_bar_icon_button.dart'; import '../../../widgets/custom_buttons/blue_text_button.dart'; import '../../../widgets/custom_buttons/simple_copy_button.dart'; import '../../../widgets/desktop/desktop_dialog_close_button.dart'; +import '../../../widgets/desktop/secondary_button.dart'; import '../../../widgets/dialogs/s_dialog.dart'; import '../../../widgets/rounded_container.dart'; import '../../wallet_view/transaction_views/transaction_details_view.dart'; import '../manage_domain_view.dart'; +import 'transfer_option_widget.dart'; +import 'update_option_widget.dart'; class NameDetailsView extends ConsumerStatefulWidget { const NameDetailsView({ @@ -232,6 +235,122 @@ class _ManageDomainsWidgetState extends ConsumerState { child: child, ), ), + Padding( + padding: const EdgeInsets.symmetric(horizontal: 32), + child: Row( + children: [ + Expanded( + child: SecondaryButton( + label: "Transfer", + buttonHeight: ButtonHeight.l, + onPressed: () { + showDialog( + context: context, + builder: (context) { + return SDialog( + child: SizedBox( + width: 641, + child: Column( + children: [ + Row( + mainAxisAlignment: + MainAxisAlignment.spaceBetween, + children: [ + Padding( + padding: const EdgeInsets.only( + left: 32, + ), + child: Text( + "Transfer domain", + style: STextStyles.desktopH3( + context, + ), + ), + ), + const DesktopDialogCloseButton(), + ], + ), + Padding( + padding: const EdgeInsets.only( + left: 32, + right: 32, + bottom: 32, + top: 16, + ), + child: TransferOptionWidget( + walletId: widget.walletId, + utxo: utxo!, + ), + ), + ], + ), + ), + ); + }, + ); + }, + ), + ), + const SizedBox( + width: 32, + ), + Expanded( + child: SecondaryButton( + label: "Update", + buttonHeight: ButtonHeight.l, + onPressed: () { + showDialog( + context: context, + builder: (context) { + return SDialog( + child: SizedBox( + width: 641, + child: Column( + children: [ + Row( + mainAxisAlignment: + MainAxisAlignment.spaceBetween, + children: [ + Padding( + padding: const EdgeInsets.only( + left: 32, + ), + child: Text( + "Update domain", + style: STextStyles.desktopH3( + context, + ), + ), + ), + const DesktopDialogCloseButton(), + ], + ), + Padding( + padding: const EdgeInsets.only( + left: 32, + right: 32, + bottom: 32, + ), + child: UpdateOptionWidget( + walletId: widget.walletId, + utxo: utxo!, + ), + ), + ], + ), + ), + ); + }, + ); + }, + ), + ), + ], + ), + ), + const SizedBox( + height: 32, + ), ], ), ); @@ -285,60 +404,6 @@ class _ManageDomainsWidgetState extends ConsumerState { ), ], ), - if (Util.isDesktop && utxo != null) - CustomTextButton( - text: "Manage", - onTap: () { - showDialog( - context: context, - builder: (context) { - return SDialog( - child: SizedBox( - width: 641, - child: Column( - children: [ - Row( - mainAxisAlignment: - MainAxisAlignment - .spaceBetween, - children: [ - Padding( - padding: - const EdgeInsets.only( - left: 32, - ), - child: Text( - "Manage domain", - style: - STextStyles.desktopH3( - context, - ), - ), - ), - const DesktopDialogCloseButton(), - ], - ), - Padding( - padding: const EdgeInsets.only( - left: 32, - right: 32, - bottom: 32, - ), - child: IntrinsicHeight( - child: ManageDomainView( - walletId: widget.walletId, - utxo: utxo!, - ), - ), - ), - ], - ), - ), - ); - }, - ); - }, - ), if (!Util.isDesktop) SelectableText( opNameData!.op.name, diff --git a/lib/pages/namecoin_names/sub_widgets/transfer_option_widget.dart b/lib/pages/namecoin_names/sub_widgets/transfer_option_widget.dart index 1bd9c9cde..3ac435b8c 100644 --- a/lib/pages/namecoin_names/sub_widgets/transfer_option_widget.dart +++ b/lib/pages/namecoin_names/sub_widgets/transfer_option_widget.dart @@ -19,7 +19,10 @@ import '../../../wallets/isar/providers/wallet_info_provider.dart'; import '../../../wallets/models/name_op_state.dart'; import '../../../wallets/models/tx_data.dart'; import '../../../wallets/wallet/impl/namecoin_wallet.dart'; +import '../../../widgets/conditional_parent.dart'; +import '../../../widgets/desktop/desktop_dialog.dart'; import '../../../widgets/desktop/primary_button.dart'; +import '../../../widgets/desktop/secondary_button.dart'; import '../../../widgets/dialogs/s_dialog.dart'; import '../../../widgets/icon_widgets/addressbook_icon.dart'; import '../../../widgets/icon_widgets/clipboard_icon.dart'; @@ -78,31 +81,62 @@ class _TransferOptionWidgetState extends ConsumerState { bool wasCancelled = false; if (mounted) { - unawaited( - showDialog( - context: context, - useSafeArea: false, - barrierDismissible: false, - builder: (context) { - return BuildingTransactionDialog( - coin: wallet.info.coin, - isSpark: false, - onCancel: () { - wasCancelled = true; - Navigator.of(context).pop(); - }, - ); - }, - ), - ); + if (Util.isDesktop) { + unawaited( + showDialog( + context: context, + useSafeArea: false, + barrierDismissible: false, + builder: (context) { + return DesktopDialog( + maxWidth: 400, + maxHeight: double.infinity, + child: Padding( + padding: const EdgeInsets.all(32), + child: BuildingTransactionDialog( + coin: wallet.info.coin, + isSpark: false, + onCancel: () { + wasCancelled = true; + Navigator.of(context, rootNavigator: true).pop(); + }, + ), + ), + ); + }, + ), + ); + } else { + unawaited( + showDialog( + context: context, + useSafeArea: false, + barrierDismissible: false, + builder: (context) { + return BuildingTransactionDialog( + coin: wallet.info.coin, + isSpark: false, + onCancel: () { + wasCancelled = true; + Navigator.of(context).pop(); + }, + ); + }, + ), + ); + } } + final opName = wallet.getOpNameDataFrom(widget.utxo)!; + final time = Future.delayed( const Duration( milliseconds: 2500, ), ); + final nameScriptHex = scriptNameUpdate(opName.fullname, opName.value); + final txDataFuture = wallet.prepareNameSend( txData: TxData( feeRateType: kNameTxDefaultFeeRate, // TODO: make configurable? @@ -116,23 +150,17 @@ class _TransferOptionWidgetState extends ConsumerState { ), ), ], - note: "Transfer domain name", + note: "Transfer ${opName.constructedName}", opNameState: NameOpState( - name: "", + name: opName.fullname, saltHex: "", commitment: "", - value: "", - nameScriptHex: "", + value: opName.value, + nameScriptHex: nameScriptHex, type: OpName.nameUpdate, output: widget.utxo, outputPosition: -1, //currently unknown, updated later ), - // satsPerVByte: isCustomFee ? customFeeRate : null, - // utxos: (wallet is CoinControlInterface && - // coinControlEnabled && - // selectedUTXOs.isNotEmpty) - // ? selectedUTXOs - // : null, ), ); @@ -405,19 +433,43 @@ class _TransferOptionWidgetState extends ConsumerState { ), ), SizedBox( - height: Util.isDesktop ? 24 : 16, - ), - // if (!Util.isDesktop) const Spacer(), - PrimaryButton( - label: "Transfer", - enabled: _enableButton, - // width: Util.isDesktop ? 160 : double.infinity, - buttonHeight: Util.isDesktop ? ButtonHeight.l : null, - onPressed: _preview, + height: Util.isDesktop ? 42 : 16, ), - SizedBox( - height: Util.isDesktop ? 24 : 16, + if (!Util.isDesktop) const Spacer(), + ConditionalParent( + condition: Util.isDesktop, + builder: (child) => Row( + children: [ + Expanded( + child: SecondaryButton( + label: "Cancel", + buttonHeight: ButtonHeight.l, + onPressed: Navigator.of( + context, + rootNavigator: Util.isDesktop, + ).pop, + ), + ), + const SizedBox( + width: 16, + ), + Expanded( + child: child, + ), + ], + ), + child: PrimaryButton( + label: "Transfer", + enabled: _enableButton, + // width: Util.isDesktop ? 160 : double.infinity, + buttonHeight: Util.isDesktop ? ButtonHeight.l : null, + onPressed: _preview, + ), ), + if (!Util.isDesktop) + const SizedBox( + height: 16, + ), ], ); } diff --git a/lib/wallets/wallet/impl/namecoin_wallet.dart b/lib/wallets/wallet/impl/namecoin_wallet.dart index 10c804022..94bcae938 100644 --- a/lib/wallets/wallet/impl/namecoin_wallet.dart +++ b/lib/wallets/wallet/impl/namecoin_wallet.dart @@ -595,6 +595,7 @@ class NamecoinWallet value: data.value, nameScriptHex: nameScriptHex, type: OpName.nameFirstUpdate, + output: utxo, outputPosition: -1, //currently unknown, updated later ), note: "Purchase $noteName", @@ -989,7 +990,8 @@ class NamecoinWallet throw Exception("Coin control used where utxos is null!"); } - if (txData.opNameState!.type == OpName.nameUpdate && + if ((txData.opNameState!.type == OpName.nameFirstUpdate || + txData.opNameState!.type == OpName.nameUpdate) && txData.opNameState!.output == null) { throw Exception("Missing name output to update"); } @@ -1018,7 +1020,8 @@ class NamecoinWallet final List availableOutputs = utxos ?? await mainDB.getUTXOs(walletId).findAll(); - if (txData.opNameState!.type == OpName.nameUpdate) { + if (txData.opNameState!.type == OpName.nameUpdate || + txData.opNameState!.type == OpName.nameFirstUpdate) { // name output is added later availableOutputs.removeWhere((e) => e == txData.opNameState!.output!); } @@ -1027,111 +1030,19 @@ class NamecoinWallet final canCPFP = this is CpfpInterface && coinControl; - int nameOutputCount = 0; // for sanity check. Should only be max 1; - void nameOutputCountCheck() { - nameOutputCount++; - if (nameOutputCount > 1) { - throw Exception("nameOutputCount greater than one"); - } - } - - final List spendableOutputs; - switch (txData.opNameState!.type) { - case OpName.nameNew: - spendableOutputs = availableOutputs - .where( - (e) => - !e.isBlocked && - (e.used != true) && - (canCPFP || - e.isConfirmed( - currentChainHeight, - cryptoCurrency.minConfirms, - cryptoCurrency.minCoinbaseConfirms, - )), - ) - .toList(); - break; - - case OpName.nameFirstUpdate: - spendableOutputs = availableOutputs.where( - (e) { - if (e.used == true) return false; - - final nameOp = getOpNameDataFrom(e); - if (nameOp != null) { - if (nameOp.op == OpName.nameFirstUpdate || - nameOp.op == OpName.nameUpdate) { - return false; - } else { - final confirmed = e.isConfirmed( - currentChainHeight, - cryptoCurrency.minConfirms, - cryptoCurrency.minCoinbaseConfirms, - overrideMinConfirms: kNameWaitBlocks, - ); - - if (confirmed) { - nameOutputCountCheck(); - } - return confirmed; - } - } else { - return canCPFP || + final spendableOutputs = availableOutputs + .where( + (e) => + !e.isBlocked && + (e.used != true) && + (canCPFP || e.isConfirmed( currentChainHeight, cryptoCurrency.minConfirms, cryptoCurrency.minCoinbaseConfirms, - ); - } - }, - ).toList(); - break; - - case OpName.nameUpdate: - spendableOutputs = availableOutputs.where( - (e) { - if (e.used == true) return false; - - final nameOp = getOpNameDataFrom(e); - if (nameOp != null) { - if (nameOp.op == OpName.nameFirstUpdate || - nameOp.op == OpName.nameUpdate) { - final confirmed = e.isConfirmed( - currentChainHeight, - cryptoCurrency.minConfirms, - cryptoCurrency.minCoinbaseConfirms, - overrideMinConfirms: kNameWaitBlocks, - ); - - if (confirmed) { - nameOutputCountCheck(); - } - return confirmed; - } else { - return false; - } - } else { - return canCPFP || - e.isConfirmed( - currentChainHeight, - cryptoCurrency.minConfirms, - cryptoCurrency.minCoinbaseConfirms, - ); - } - }, - ).toList(); - break; - } - - final spendableSatoshiValue = - spendableOutputs.fold(BigInt.zero, (p, e) => p + BigInt.from(e.value)); - - if (spendableSatoshiValue < satoshiAmountToSend) { - throw Exception("Insufficient balance"); - } else if (spendableSatoshiValue == satoshiAmountToSend) { - throw Exception("Insufficient balance to pay transaction fee"); - } + )), + ) + .toList(); if (coinControl) { if (spendableOutputs.length < availableOutputs.length) { @@ -1146,6 +1057,20 @@ class NamecoinWallet ); } + // add name output to modify + if (txData.opNameState!.type == OpName.nameUpdate || + txData.opNameState!.type == OpName.nameFirstUpdate) { + spendableOutputs.insert(0, txData.opNameState!.output!); + } + + final spendableSatoshiValue = + spendableOutputs.fold(BigInt.zero, (p, e) => p + BigInt.from(e.value)); + + if (spendableSatoshiValue < satoshiAmountToSend) { + throw Exception("Insufficient balance"); + } else if (spendableSatoshiValue == satoshiAmountToSend) { + throw Exception("Insufficient balance to pay transaction fee"); + } Logging.instance.d( "spendableOutputs.length: ${spendableOutputs.length}" "\navailableOutputs.length: ${availableOutputs.length}" @@ -1156,10 +1081,7 @@ class NamecoinWallet BigInt satoshisBeingUsed = BigInt.zero; int inputsBeingConsumed = 0; - final List utxoObjectsToUse = [ - if (txData.opNameState!.type == OpName.nameUpdate) - txData.opNameState!.output!, - ]; + final List utxoObjectsToUse = []; if (!coinControl) { for (int i = 0; From 7dd919f795c4006d25d1151c1dfc471429f27b5e Mon Sep 17 00:00:00 2001 From: julian Date: Mon, 24 Feb 2025 15:39:24 -0600 Subject: [PATCH 094/193] disable manage for pre reg names for now --- .../sub_widgets/name_details.dart | 220 +++++++++--------- 1 file changed, 113 insertions(+), 107 deletions(-) diff --git a/lib/pages/namecoin_names/sub_widgets/name_details.dart b/lib/pages/namecoin_names/sub_widgets/name_details.dart index fbcbb01f3..0e42a0a2e 100644 --- a/lib/pages/namecoin_names/sub_widgets/name_details.dart +++ b/lib/pages/namecoin_names/sub_widgets/name_details.dart @@ -143,6 +143,10 @@ class _ManageDomainsWidgetState extends ConsumerState { final isExpired = opNameData?.expired(currentHeight) == true; final isSemiExpired = opNameData?.expired(currentHeight, true) == true; + final canManage = utxo != null && + (opNameData?.op == OpName.nameUpdate || + opNameData?.op == OpName.nameFirstUpdate); + return ConditionalParent( condition: !Util.isDesktop, builder: (child) => Background( @@ -156,9 +160,8 @@ class _ManageDomainsWidgetState extends ConsumerState { "Domain details", style: STextStyles.navBarTitle(context), ), - actions: utxo == null - ? null - : [ + actions: canManage + ? [ Padding( padding: const EdgeInsets.only( top: 10, @@ -176,7 +179,8 @@ class _ManageDomainsWidgetState extends ConsumerState { }, ), ), - ], + ] + : null, ), body: SafeArea( child: LayoutBuilder( @@ -235,122 +239,124 @@ class _ManageDomainsWidgetState extends ConsumerState { child: child, ), ), - Padding( - padding: const EdgeInsets.symmetric(horizontal: 32), - child: Row( - children: [ - Expanded( - child: SecondaryButton( - label: "Transfer", - buttonHeight: ButtonHeight.l, - onPressed: () { - showDialog( - context: context, - builder: (context) { - return SDialog( - child: SizedBox( - width: 641, - child: Column( - children: [ - Row( - mainAxisAlignment: - MainAxisAlignment.spaceBetween, - children: [ - Padding( - padding: const EdgeInsets.only( - left: 32, - ), - child: Text( - "Transfer domain", - style: STextStyles.desktopH3( - context, + if (canManage) + Padding( + padding: const EdgeInsets.symmetric(horizontal: 32), + child: Row( + children: [ + Expanded( + child: SecondaryButton( + label: "Transfer", + buttonHeight: ButtonHeight.l, + onPressed: () { + showDialog( + context: context, + builder: (context) { + return SDialog( + child: SizedBox( + width: 641, + child: Column( + children: [ + Row( + mainAxisAlignment: + MainAxisAlignment.spaceBetween, + children: [ + Padding( + padding: const EdgeInsets.only( + left: 32, + ), + child: Text( + "Transfer domain", + style: STextStyles.desktopH3( + context, + ), ), ), - ), - const DesktopDialogCloseButton(), - ], - ), - Padding( - padding: const EdgeInsets.only( - left: 32, - right: 32, - bottom: 32, - top: 16, + const DesktopDialogCloseButton(), + ], ), - child: TransferOptionWidget( - walletId: widget.walletId, - utxo: utxo!, + Padding( + padding: const EdgeInsets.only( + left: 32, + right: 32, + bottom: 32, + top: 16, + ), + child: TransferOptionWidget( + walletId: widget.walletId, + utxo: utxo!, + ), ), - ), - ], + ], + ), ), - ), - ); - }, - ); - }, + ); + }, + ); + }, + ), ), - ), - const SizedBox( - width: 32, - ), - Expanded( - child: SecondaryButton( - label: "Update", - buttonHeight: ButtonHeight.l, - onPressed: () { - showDialog( - context: context, - builder: (context) { - return SDialog( - child: SizedBox( - width: 641, - child: Column( - children: [ - Row( - mainAxisAlignment: - MainAxisAlignment.spaceBetween, - children: [ - Padding( - padding: const EdgeInsets.only( - left: 32, - ), - child: Text( - "Update domain", - style: STextStyles.desktopH3( - context, + const SizedBox( + width: 32, + ), + Expanded( + child: SecondaryButton( + label: "Update", + buttonHeight: ButtonHeight.l, + onPressed: () { + showDialog( + context: context, + builder: (context) { + return SDialog( + child: SizedBox( + width: 641, + child: Column( + children: [ + Row( + mainAxisAlignment: + MainAxisAlignment.spaceBetween, + children: [ + Padding( + padding: const EdgeInsets.only( + left: 32, + ), + child: Text( + "Update domain", + style: STextStyles.desktopH3( + context, + ), ), ), - ), - const DesktopDialogCloseButton(), - ], - ), - Padding( - padding: const EdgeInsets.only( - left: 32, - right: 32, - bottom: 32, + const DesktopDialogCloseButton(), + ], ), - child: UpdateOptionWidget( - walletId: widget.walletId, - utxo: utxo!, + Padding( + padding: const EdgeInsets.only( + left: 32, + right: 32, + bottom: 32, + ), + child: UpdateOptionWidget( + walletId: widget.walletId, + utxo: utxo!, + ), ), - ), - ], + ], + ), ), - ), - ); - }, - ); - }, + ); + }, + ); + }, + ), ), - ), - ], + ], + ), + ), + if (canManage) + const SizedBox( + height: 32, ), - ), - const SizedBox( - height: 32, - ), ], ), ); From 29802ddda5f6fbdf6972c78b80e1bfaab9303d10 Mon Sep 17 00:00:00 2001 From: julian Date: Mon, 24 Feb 2025 19:29:16 -0600 Subject: [PATCH 095/193] update name functionality w/ basic json pretty view --- .../sub_widgets/name_details.dart | 93 +++--- .../sub_widgets/owned_name_card.dart | 37 ++- .../sub_widgets/transfer_option_widget.dart | 6 +- .../sub_widgets/update_option_widget.dart | 307 ++++++++++++++++-- lib/utilities/text_formatters.dart | 38 ++- lib/wallets/wallet/impl/namecoin_wallet.dart | 4 +- 6 files changed, 389 insertions(+), 96 deletions(-) diff --git a/lib/pages/namecoin_names/sub_widgets/name_details.dart b/lib/pages/namecoin_names/sub_widgets/name_details.dart index 0e42a0a2e..7fa77f807 100644 --- a/lib/pages/namecoin_names/sub_widgets/name_details.dart +++ b/lib/pages/namecoin_names/sub_widgets/name_details.dart @@ -8,6 +8,7 @@ import 'package:namecoin/namecoin.dart'; import '../../../models/isar/models/isar_models.dart'; import '../../../providers/db/main_db_provider.dart'; import '../../../providers/global/secure_store_provider.dart'; +import '../../../providers/global/wallets_provider.dart'; import '../../../themes/stack_colors.dart'; import '../../../utilities/text_styles.dart'; import '../../../utilities/util.dart'; @@ -105,6 +106,47 @@ class _ManageDomainsWidgetState extends ConsumerState { } } + (String, Color) _getExpiry(int currentChainHeight, StackColors theme) { + final String message; + final Color color; + + if (utxo?.blockHash == null) { + message = "Expires in $blocksNameExpiration+ blocks"; + color = theme.accentColorGreen; + } else { + final remaining = opNameData?.expiredBlockLeft( + currentChainHeight, + false, + ); + final semiRemaining = opNameData?.expiredBlockLeft( + currentChainHeight, + true, + ); + + if (remaining == null) { + color = theme.accentColorRed; + message = "Expired"; + } else { + message = "Expires in $remaining blocks"; + if (semiRemaining == null) { + color = theme.accentColorYellow; + } else { + color = theme.accentColorGreen; + } + } + } + + return (message, color); + } + + bool _checkConfirmedUtxo(int currentHeight) { + return (ref.read(pWallets).getWallet(widget.walletId) as NamecoinWallet) + .checkUtxoConfirmed( + utxo!, + currentHeight, + ); + } + @override void initState() { super.initState(); @@ -140,10 +182,13 @@ class _ManageDomainsWidgetState extends ConsumerState { Widget build(BuildContext context) { final currentHeight = ref.watch(pWalletChainHeight(widget.walletId)); - final isExpired = opNameData?.expired(currentHeight) == true; - final isSemiExpired = opNameData?.expired(currentHeight, true) == true; + final (message, color) = _getExpiry( + currentHeight, + Theme.of(context).extension()!, + ); final canManage = utxo != null && + _checkConfirmedUtxo(currentHeight) && (opNameData?.op == OpName.nameUpdate || opNameData?.op == OpName.nameFirstUpdate); @@ -616,45 +661,11 @@ class _ManageDomainsWidgetState extends ConsumerState { const SizedBox( height: 4, ), - Row( - children: [ - SelectableText( - isExpired - ? "Expired" - : "${opNameData!.expiredBlockLeft(currentHeight)!}", - style: STextStyles.w500_14(context).copyWith( - color: isExpired - ? Theme.of(context) - .extension()! - .accentColorRed - : isSemiExpired - ? Theme.of(context) - .extension()! - .accentColorYellow - : Theme.of(context) - .extension()! - .accentColorGreen, - ), - ), - if (!isExpired) - Text( - " blocks remaining", - style: - STextStyles.w500_14(context).copyWith( - color: isExpired - ? Theme.of(context) - .extension()! - .accentColorRed - : isSemiExpired - ? Theme.of(context) - .extension()! - .accentColorYellow - : Theme.of(context) - .extension()! - .accentColorGreen, - ), - ), - ], + SelectableText( + message, + style: STextStyles.w500_14(context).copyWith( + color: color, + ), ), ], ), diff --git a/lib/pages/namecoin_names/sub_widgets/owned_name_card.dart b/lib/pages/namecoin_names/sub_widgets/owned_name_card.dart index 74b6577c2..b345966c6 100644 --- a/lib/pages/namecoin_names/sub_widgets/owned_name_card.dart +++ b/lib/pages/namecoin_names/sub_widgets/owned_name_card.dart @@ -43,24 +43,29 @@ class _OwnedNameCardState extends ConsumerState { final String message; final Color color; - final remaining = widget.opNameData.expiredBlockLeft( - currentChainHeight, - false, - ); - final semiRemaining = widget.opNameData.expiredBlockLeft( - currentChainHeight, - true, - ); - - if (remaining == null) { - color = theme.accentColorRed; - message = "Expired"; + if (widget.utxo.blockHash == null) { + message = "Expires in $blocksNameExpiration+ blocks"; + color = theme.accentColorGreen; } else { - message = "Expires in $remaining blocks"; - if (semiRemaining == null) { - color = theme.accentColorYellow; + final remaining = widget.opNameData.expiredBlockLeft( + currentChainHeight, + false, + ); + final semiRemaining = widget.opNameData.expiredBlockLeft( + currentChainHeight, + true, + ); + + if (remaining == null) { + color = theme.accentColorRed; + message = "Expired"; } else { - color = theme.accentColorGreen; + message = "Expires in $remaining blocks"; + if (semiRemaining == null) { + color = theme.accentColorYellow; + } else { + color = theme.accentColorGreen; + } } } diff --git a/lib/pages/namecoin_names/sub_widgets/transfer_option_widget.dart b/lib/pages/namecoin_names/sub_widgets/transfer_option_widget.dart index 3ac435b8c..dcd8e1282 100644 --- a/lib/pages/namecoin_names/sub_widgets/transfer_option_widget.dart +++ b/lib/pages/namecoin_names/sub_widgets/transfer_option_widget.dart @@ -198,7 +198,11 @@ class _TransferOptionWidgetState extends ConsumerState { } } } catch (e, s) { - Logging.instance.e("_preview failed", error: e, stackTrace: s); + Logging.instance.e( + "_preview transfer name failed", + error: e, + stackTrace: s, + ); if (mounted) { String err = e.toString(); diff --git a/lib/pages/namecoin_names/sub_widgets/update_option_widget.dart b/lib/pages/namecoin_names/sub_widgets/update_option_widget.dart index 64ffe7423..80c016245 100644 --- a/lib/pages/namecoin_names/sub_widgets/update_option_widget.dart +++ b/lib/pages/namecoin_names/sub_widgets/update_option_widget.dart @@ -1,15 +1,31 @@ import 'dart:async'; +import 'dart:convert'; import 'package:flutter/material.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:namecoin/namecoin.dart'; import '../../../models/isar/models/blockchain_data/utxo.dart'; +import '../../../providers/global/wallets_provider.dart'; +import '../../../themes/stack_colors.dart'; +import '../../../utilities/amount/amount.dart'; import '../../../utilities/barcode_scanner_interface.dart'; import '../../../utilities/clipboard_interface.dart'; +import '../../../utilities/extensions/extensions.dart'; import '../../../utilities/logger.dart'; +import '../../../utilities/text_formatters.dart'; +import '../../../utilities/text_styles.dart'; import '../../../utilities/util.dart'; +import '../../../wallets/models/name_op_state.dart'; +import '../../../wallets/models/tx_data.dart'; +import '../../../wallets/wallet/impl/namecoin_wallet.dart'; +import '../../../widgets/desktop/desktop_dialog.dart'; +import '../../../widgets/desktop/primary_button.dart'; import '../../../widgets/desktop/secondary_button.dart'; +import '../../../widgets/dialogs/s_dialog.dart'; import '../../../widgets/stack_dialog.dart'; +import '../../send_view/sub_widgets/building_transaction_dialog.dart'; +import '../confirm_name_transaction_view.dart'; class UpdateOptionWidget extends ConsumerStatefulWidget { const UpdateOptionWidget({ @@ -31,15 +47,177 @@ class UpdateOptionWidget extends ConsumerStatefulWidget { } class _BuyDomainWidgetState extends ConsumerState { - final _nameController = TextEditingController(); - final _nameFieldFocus = FocusNode(); + final _controller = TextEditingController(); - bool _lookupLock = false; - Future _lookup() async { - if (_lookupLock) return; - _lookupLock = true; - try {} catch (e, s) { - Logging.instance.e("_lookup failed", error: e, stackTrace: s); + late final bool wasJson; + late final String _currentValue; + + String _getNewValue() { + final value = _controller.text; + try { + final json = jsonDecode(value); + final minified = jsonEncode(json); + return minified; + } catch (_) {} + return value; + } + + int _countLength() { + try { + final json = jsonDecode(_controller.text); + final minified = jsonEncode(json); + return minified.toUint8ListFromUtf8.lengthInBytes; + } catch (_) {} + + return _controller.text.toUint8ListFromUtf8.lengthInBytes; + } + + bool _previewLock = false; + Future _previewUpdate() async { + if (_previewLock) return; + _previewLock = true; + try { + final newValue = _getNewValue(); + if (newValue == _currentValue) { + throw Exception("Value was not changed!"); + } + + // wait for keyboard to disappear + FocusScope.of(context).unfocus(); + await Future.delayed( + const Duration(milliseconds: 100), + ); + + final wallet = + ref.read(pWallets).getWallet(widget.walletId) as NamecoinWallet; + + bool wasCancelled = false; + + if (mounted) { + if (Util.isDesktop) { + unawaited( + showDialog( + context: context, + useSafeArea: false, + barrierDismissible: false, + builder: (context) { + return DesktopDialog( + maxWidth: 400, + maxHeight: double.infinity, + child: Padding( + padding: const EdgeInsets.all(32), + child: BuildingTransactionDialog( + coin: wallet.info.coin, + isSpark: false, + onCancel: () { + wasCancelled = true; + Navigator.of(context, rootNavigator: true).pop(); + }, + ), + ), + ); + }, + ), + ); + } else { + unawaited( + showDialog( + context: context, + useSafeArea: false, + barrierDismissible: false, + builder: (context) { + return BuildingTransactionDialog( + coin: wallet.info.coin, + isSpark: false, + onCancel: () { + wasCancelled = true; + Navigator.of(context).pop(); + }, + ); + }, + ), + ); + } + } + + final _address = await wallet.getCurrentReceivingAddress(); + + final opName = wallet.getOpNameDataFrom(widget.utxo)!; + + final time = Future.delayed( + const Duration( + milliseconds: 2500, + ), + ); + + final nameScriptHex = scriptNameUpdate(opName.fullname, newValue); + + final txDataFuture = wallet.prepareNameSend( + txData: TxData( + feeRateType: kNameTxDefaultFeeRate, // TODO: make configurable? + recipients: [ + ( + address: _address!.value, + isChange: false, + amount: Amount( + rawValue: BigInt.from(kNameAmountSats), + fractionDigits: wallet.cryptoCurrency.fractionDigits, + ), + ), + ], + note: "Update ${opName.constructedName} (${opName.fullname})", + opNameState: NameOpState( + name: opName.fullname, + saltHex: "", + commitment: "", + value: newValue, + nameScriptHex: nameScriptHex, + type: OpName.nameUpdate, + output: widget.utxo, + outputPosition: -1, //currently unknown, updated later + ), + ), + ); + + final results = await Future.wait([ + txDataFuture, + time, + ]); + + final txData = results.first as TxData; + + if (!wasCancelled && mounted) { + // pop building dialog + Navigator.of(context).pop(); + + if (mounted) { + if (Util.isDesktop) { + await showDialog( + context: context, + builder: (context) => SDialog( + child: SizedBox( + width: 580, + child: ConfirmNameTransactionView( + txData: txData, + walletId: widget.walletId, + ), + ), + ), + ); + } else { + await Navigator.of(context).pushNamed( + ConfirmNameTransactionView.routeName, + arguments: (txData, widget.walletId), + ); + } + } + } + } catch (e, s) { + Logging.instance.e( + "_preview update name failed", + error: e, + stackTrace: s, + ); String? err; if (e.toString().contains("Contains invalid characters")) { @@ -50,7 +228,7 @@ class _BuyDomainWidgetState extends ConsumerState { await showDialog( context: context, builder: (_) => StackOkDialog( - title: "Name lookup failed", + title: "Update failed", message: err, desktopPopRootNavigator: Util.isDesktop, maxWidth: Util.isDesktop ? 600 : null, @@ -58,24 +236,32 @@ class _BuyDomainWidgetState extends ConsumerState { ); } } finally { - _lookupLock = false; + _previewLock = false; } } @override void initState() { super.initState(); - WidgetsBinding.instance.addPostFrameCallback((_) { - if (mounted) { - _nameFieldFocus.requestFocus(); - } - }); + final wallet = + ref.read(pWallets).getWallet(widget.walletId) as NamecoinWallet; + + _currentValue = wallet.getOpNameDataFrom(widget.utxo)!.value; + + // see if json, if so format nicely + try { + final json = jsonDecode(_currentValue); + _controller.text = const JsonEncoder.withIndent(" ").convert(json); + wasJson = true; + } catch (_) { + _controller.text = _currentValue; + wasJson = false; + } } @override void dispose() { - _nameController.dispose(); - _nameFieldFocus.dispose(); + _controller.dispose(); super.dispose(); } @@ -83,22 +269,87 @@ class _BuyDomainWidgetState extends ConsumerState { Widget build(BuildContext context) { return Column( mainAxisSize: MainAxisSize.min, - crossAxisAlignment: - Util.isDesktop ? CrossAxisAlignment.start : CrossAxisAlignment.center, + crossAxisAlignment: Util.isDesktop + ? CrossAxisAlignment.start + : CrossAxisAlignment.stretch, children: [ - SizedBox( - height: Util.isDesktop ? 24 : 16, + Text( + "Edit value", + style: STextStyles.label(context), + ), + const SizedBox( + height: 6, ), - SecondaryButton( - label: "Update", - enabled: _nameController.text.isNotEmpty, - // width: Util.isDesktop ? 160 : double.infinity, - buttonHeight: Util.isDesktop ? ButtonHeight.l : null, - onPressed: _lookup, + TextField( + controller: _controller, + maxLines: null, + autocorrect: false, + enableSuggestions: false, + style: const TextStyle(fontFamily: "monospace"), + onChanged: (_) { + setState(() {}); + }, + inputFormatters: [ + Utf8ByteLengthLimitingTextInputFormatter( + valueMaxLength, + tryMinifyJson: true, + ), + ], + ), + const SizedBox( + height: 4, + ), + Row( + mainAxisAlignment: MainAxisAlignment.end, + children: [ + Builder( + builder: (context) { + final length = _countLength(); + return Text( + "$length/$valueMaxLength", + style: STextStyles.w500_10(context).copyWith( + color: Theme.of(context) + .extension()! + .textSubtitle2, + ), + ); + }, + ), + ], ), SizedBox( - height: Util.isDesktop ? 24 : 16, + height: Util.isDesktop ? 32 : 16, ), + if (!Util.isDesktop) const Spacer(), + Row( + children: [ + Expanded( + child: SecondaryButton( + label: "Cancel", + buttonHeight: Util.isDesktop ? ButtonHeight.l : null, + onPressed: Navigator.of( + context, + rootNavigator: Util.isDesktop, + ).pop, + ), + ), + const SizedBox( + width: 16, + ), + Expanded( + child: PrimaryButton( + label: "Update", + enabled: _controller.text.isNotEmpty, + buttonHeight: Util.isDesktop ? ButtonHeight.l : null, + onPressed: _previewUpdate, + ), + ), + ], + ), + if (!Util.isDesktop) + const SizedBox( + height: 16, + ), ], ); } diff --git a/lib/utilities/text_formatters.dart b/lib/utilities/text_formatters.dart index 70a96231d..a7cf76d4f 100644 --- a/lib/utilities/text_formatters.dart +++ b/lib/utilities/text_formatters.dart @@ -5,13 +5,31 @@ import 'package:flutter/services.dart'; class Utf8ByteLengthLimitingTextInputFormatter extends TextInputFormatter { Utf8ByteLengthLimitingTextInputFormatter( - this.maxBytes, - ) : assert(maxBytes == -1 || maxBytes > 0); + this.maxBytes, { + this.tryMinifyJson = false, + }) : assert(maxBytes == -1 || maxBytes > 0); final int maxBytes; + final bool tryMinifyJson; - static TextEditingValue truncate(TextEditingValue value, int maxBytes) { - final String text = value.text; + static String _maybeTryMinify(String text, bool tryMinifyJson) { + if (tryMinifyJson) { + try { + final json = jsonDecode(text); + final minified = jsonEncode(json); + return minified; + } catch (_) {} + } + + return text; + } + + static TextEditingValue truncate( + TextEditingValue value, + int maxBytes, + bool tryMinifyJson, + ) { + final String text = _maybeTryMinify(value.text, tryMinifyJson); final encoded = utf8.encode(text); if (encoded.length <= maxBytes) { @@ -47,17 +65,23 @@ class Utf8ByteLengthLimitingTextInputFormatter extends TextInputFormatter { TextEditingValue newValue, ) { if (maxBytes == -1 || - utf8.encode(newValue.text).lengthInBytes <= maxBytes) { + utf8 + .encode(_maybeTryMinify(newValue.text, tryMinifyJson)) + .lengthInBytes <= + maxBytes) { return newValue; } assert(maxBytes > 0); - if (utf8.encode(oldValue.text).lengthInBytes == maxBytes && + if (utf8 + .encode(_maybeTryMinify(oldValue.text, tryMinifyJson)) + .lengthInBytes == + maxBytes && oldValue.selection.isCollapsed) { return oldValue; } - return truncate(newValue, maxBytes); + return truncate(newValue, maxBytes, tryMinifyJson); } } diff --git a/lib/wallets/wallet/impl/namecoin_wallet.dart b/lib/wallets/wallet/impl/namecoin_wallet.dart index 94bcae938..64dc23801 100644 --- a/lib/wallets/wallet/impl/namecoin_wallet.dart +++ b/lib/wallets/wallet/impl/namecoin_wallet.dart @@ -454,9 +454,7 @@ class NamecoinWallet } final data = decodeNameSaltData(encoded); - Logging.instance.e( - data, - ); + if (data.name == name) { return ( data: null, From ed65ab5648ffb196b522a78456f0f4da647e20fa Mon Sep 17 00:00:00 2001 From: julian Date: Tue, 25 Feb 2025 08:35:19 -0600 Subject: [PATCH 096/193] flutter version update --- docs/building.md | 10 +- pubspec.lock | 94 +++++++++---------- scripts/app_config/templates/pubspec.template | 4 +- 3 files changed, 54 insertions(+), 54 deletions(-) diff --git a/docs/building.md b/docs/building.md index bf2252a3b..204012f46 100644 --- a/docs/building.md +++ b/docs/building.md @@ -13,12 +13,12 @@ Here you will find instructions on how to install the necessary tools for buildi The following instructions are for building and running on a Linux host. Alternatively, see the [Mac](#mac-host) and/or [Windows](#windows-host) section. This entire section (except for the Android Studio section) needs to be completed in WSL if building on a Windows host. ### Flutter -Install Flutter 3.24.3 by [following their guide](https://docs.flutter.dev/get-started/install/linux/desktop?tab=download#install-the-flutter-sdk). You can also clone https://github.com/flutter/flutter, check out the `3.24.3` tag, and add its `flutter/bin` folder to your PATH as in +Install Flutter 3.29.0 by [following their guide](https://docs.flutter.dev/get-started/install/linux/desktop?tab=download#install-the-flutter-sdk). You can also clone https://github.com/flutter/flutter, check out the `3.29.0` tag, and add its `flutter/bin` folder to your PATH as in ```sh FLUTTER_DIR="$HOME/development/flutter" git clone https://github.com/flutter/flutter.git "$FLUTTER_DIR" cd "$FLUTTER_DIR" -git checkout 3.24.3 +git checkout 3.29.0 echo 'export PATH="$PATH:'"$FLUTTER_DIR"'/bin"' >> "$HOME/.profile" source "$HOME/.profile" flutter precache @@ -243,7 +243,7 @@ rustup target add aarch64-apple-ios aarch64-apple-darwin Optionally download [Android Studio](https://developer.android.com/studio) as an IDE and activate its Dart and Flutter plugins. VS Code may work as an alternative, but this is not recommended. ### Flutter -Install [Flutter](https://docs.flutter.dev/get-started/install) 3.24.3 on your Mac host by following [these instructions](https://docs.flutter.dev/get-started/install/macos). Run `flutter doctor` in a terminal to confirm its installation. +Install [Flutter](https://docs.flutter.dev/get-started/install) 3.29.0 on your Mac host by following [these instructions](https://docs.flutter.dev/get-started/install/macos). Run `flutter doctor` in a terminal to confirm its installation. ### Build plugins and configure #### Building plugins for iOS @@ -313,13 +313,13 @@ If the DLLs were built on the WSL filesystem instead of on Windows, copy the res Frostdart will be built by the Windows host later. ### Install Flutter on Windows host -Install Flutter 3.24.3 on your Windows host (not in WSL2) by [following their guide](https://docs.flutter.dev/get-started/install/windows/desktop?tab=download#install-the-flutter-sdk) or by cloning https://github.com/flutter/flutter, checking out the `3.24.3` tag, and adding its `flutter/bin` folder to your PATH as in +Install Flutter 3.29.0 on your Windows host (not in WSL2) by [following their guide](https://docs.flutter.dev/get-started/install/windows/desktop?tab=download#install-the-flutter-sdk) or by cloning https://github.com/flutter/flutter, checking out the `3.29.0` tag, and adding its `flutter/bin` folder to your PATH as in ```bat @echo off set "FLUTTER_DIR=%USERPROFILE%\development\flutter" git clone https://github.com/flutter/flutter.git "%FLUTTER_DIR%" cd /d "%FLUTTER_DIR%" -git checkout 3.24.3 +git checkout 3.29.0 setx PATH "%PATH%;%FLUTTER_DIR%\bin" echo Flutter setup completed. Please restart your command prompt. ``` diff --git a/pubspec.lock b/pubspec.lock index 233e824f8..b66fcecf0 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -58,10 +58,10 @@ packages: dependency: "direct main" description: name: async - sha256: "947bfcf187f74dbc5e146c9eb9c0f10c9f8b30743e341481c1e2ed3ecc18c20c" + sha256: d2872f9c19731c2e5f10444b14686eb7cc85c76274bd6c16e1816bff9a3bab63 url: "https://pub.dev" source: hosted - version: "2.11.0" + version: "2.12.0" barcode_scan2: dependency: "direct main" description: @@ -159,10 +159,10 @@ packages: dependency: transitive description: name: boolean_selector - sha256: "6cfb5af12253eaf2b368f07bacc5a80d1301a071c73360d746b7f2e32d762c66" + sha256: "8aab1771e1243a5063b8b0ff68042d67334e3feab9e95b9490f9a6ebf73b42ea" url: "https://pub.dev" source: hosted - version: "2.1.1" + version: "2.1.2" borsh_annotation: dependency: transitive description: @@ -297,10 +297,10 @@ packages: dependency: transitive description: name: characters - sha256: "04a925763edad70e8443c99234dc3328f442e811f1d8fd1a72f1c8ad0f69a605" + sha256: f71061c654a3380576a52b451dd5532377954cf9dbd272a78fc8479606670803 url: "https://pub.dev" source: hosted - version: "1.3.0" + version: "1.4.0" charcode: dependency: transitive description: @@ -329,10 +329,10 @@ packages: dependency: transitive description: name: clock - sha256: cb6d7f03e1de671e34607e909a7213e31d7752be4fb66a86d29fe1eb14bfb5cf + sha256: fddb70d9b5277016c77a80201021d40a2247104d9f4aa7bab7157b7e3f05b84b url: "https://pub.dev" source: hosted - version: "1.1.1" + version: "1.1.2" code_builder: dependency: transitive description: @@ -363,10 +363,10 @@ packages: dependency: transitive description: name: collection - sha256: a1ace0a119f20aabc852d165077c036cd864315bd99b7eaa10a60100341941bf + sha256: "2f5709ae4d3d59dd8f7cd309b4e023046b57d8a6c82130785d2b0e5868084e76" url: "https://pub.dev" source: hosted - version: "1.19.0" + version: "1.19.1" compat: dependency: "direct main" description: @@ -734,10 +734,10 @@ packages: dependency: transitive description: name: fake_async - sha256: "511392330127add0b769b75a987850d136345d9227c6b94c96a04cf4a391bf78" + sha256: "6a95e56b2449df2273fd8c45a662d6947ce1ebb7aafe80e550a3f68297f3cacc" url: "https://pub.dev" source: hosted - version: "1.3.1" + version: "1.3.2" ffi: dependency: "direct main" description: @@ -750,10 +750,10 @@ packages: dependency: transitive description: name: file - sha256: "5fc22d7c25582e38ad9a8515372cd9a93834027aacf1801cf01164dac0ffa08c" + sha256: a3b4f84adafef897088c160faf7dfffb7696046cb13ae90b508c2cbc95d3b8d4 url: "https://pub.dev" source: hosted - version: "7.0.0" + version: "7.0.1" file_picker: dependency: "direct main" description: @@ -1197,18 +1197,18 @@ packages: dependency: transitive description: name: leak_tracker - sha256: "7bb2830ebd849694d1ec25bf1f44582d6ac531a57a365a803a6034ff751d2d06" + sha256: c35baad643ba394b40aac41080300150a4f08fd0fd6a10378f8f7c6bc161acec url: "https://pub.dev" source: hosted - version: "10.0.7" + version: "10.0.8" leak_tracker_flutter_testing: dependency: transitive description: name: leak_tracker_flutter_testing - sha256: "9491a714cca3667b60b5c420da8217e6de0d1ba7a5ec322fab01758f6998f379" + sha256: f8b613e7e6a13ec79cfdc0e97638fddb3ab848452eff057653abd3edba760573 url: "https://pub.dev" source: hosted - version: "3.0.8" + version: "3.0.9" leak_tracker_testing: dependency: transitive description: @@ -1309,10 +1309,10 @@ packages: dependency: transitive description: name: matcher - sha256: d2323aa2060500f906aa31a895b4030b6da3ebdcc5619d14ce1aada65cd161cb + sha256: dc58c723c3c24bf8d3e2d3ad3f2f9d7bd9cf43ec6feaa64181775e60190153f2 url: "https://pub.dev" source: hosted - version: "0.12.16+1" + version: "0.12.17" material_color_utilities: dependency: transitive description: @@ -1333,10 +1333,10 @@ packages: dependency: "direct main" description: name: meta - sha256: bdb68674043280c3428e9ec998512fb681678676b3c54e773629ffe74419f8c7 + sha256: e3641ec5d63ebf0d9b41bd43201a66e3fc79a65db5f61fc181f04cd27aab950c url: "https://pub.dev" source: hosted - version: "1.15.0" + version: "1.16.0" mime: dependency: transitive description: @@ -1454,10 +1454,10 @@ packages: dependency: transitive description: name: path - sha256: "087ce49c3f0dc39180befefc60fdb4acd8f8620e5682fe2476afd0b3688bb4af" + sha256: "75cca69d1490965be98c73ceaea117e8a04dd21217b37b292c9ddbec0d955bc5" url: "https://pub.dev" source: hosted - version: "1.9.0" + version: "1.9.1" path_parsing: dependency: transitive description: @@ -1582,10 +1582,10 @@ packages: dependency: transitive description: name: platform - sha256: "9b71283fc13df574056616011fb138fd3b793ea47cc509c189a6c3fa5f8a1a65" + sha256: "5d6b1b0036a5f331ebc77c850ebc8506cbc1e9416c27e59b439f917a902a4984" url: "https://pub.dev" source: hosted - version: "3.1.5" + version: "3.1.6" plugin_platform_interface: dependency: transitive description: @@ -1622,10 +1622,10 @@ packages: dependency: transitive description: name: process - sha256: "21e54fd2faf1b5bdd5102afd25012184a6793927648ea81eea80552ac9405b32" + sha256: "107d8be718f120bbba9dcd1e95e3bd325b1b4a4f07db64154635ba03f2567a0d" url: "https://pub.dev" source: hosted - version: "5.0.2" + version: "5.0.3" protobuf: dependency: transitive description: @@ -1829,10 +1829,10 @@ packages: dependency: transitive description: name: source_span - sha256: "53e943d4206a5e30df338fd4c6e7a077e02254531b138a15aec3bd143c1a8b3c" + sha256: "254ee5351d6cb365c859e20ee823c3bb479bf4a293c22d17a9f1bf144ce86f7c" url: "https://pub.dev" source: hosted - version: "1.10.0" + version: "1.10.1" sqlite3: dependency: "direct main" description: @@ -1853,10 +1853,10 @@ packages: dependency: transitive description: name: stack_trace - sha256: "9f47fd3630d76be3ab26f0ee06d213679aa425996925ff3feffdec504931c377" + sha256: "8b27215b45d22309b5cddda1aa2b19bdfec9df0e765f2de506401c071d38d1b1" url: "https://pub.dev" source: hosted - version: "1.12.0" + version: "1.12.1" stack_wallet_backup: dependency: "direct main" description: @@ -1886,10 +1886,10 @@ packages: dependency: "direct main" description: name: stream_channel - sha256: ba2aa5d8cc609d96bbb2899c28934f9e1af5cddbd60a827822ea467161eb54e7 + sha256: "969e04c80b8bcdf826f8f16579c7b14d780458bd97f56d107d3950fdbeef059d" url: "https://pub.dev" source: hosted - version: "2.1.2" + version: "2.1.4" stream_transform: dependency: transitive description: @@ -1902,10 +1902,10 @@ packages: dependency: transitive description: name: string_scanner - sha256: "688af5ed3402a4bde5b3a6c15fd768dbf2621a614950b17f04626c431ab3c4c3" + sha256: "921cd31725b72fe181906c6a94d987c78e3b98c2e205b397ea399d4054872b43" url: "https://pub.dev" source: hosted - version: "1.3.0" + version: "1.4.1" string_validator: dependency: "direct main" description: @@ -1926,34 +1926,34 @@ packages: dependency: transitive description: name: term_glyph - sha256: a29248a84fbb7c79282b40b8c72a1209db169a2e0542bce341da992fe1bc7e84 + sha256: "7f554798625ea768a7518313e58f83891c7f5024f88e46e7182a4558850a4b8e" url: "https://pub.dev" source: hosted - version: "1.2.1" + version: "1.2.2" test: dependency: transitive description: name: test - sha256: "713a8789d62f3233c46b4a90b174737b2c04cb6ae4500f2aa8b1be8f03f5e67f" + sha256: "301b213cd241ca982e9ba50266bd3f5bd1ea33f1455554c5abb85d1be0e2d87e" url: "https://pub.dev" source: hosted - version: "1.25.8" + version: "1.25.15" test_api: dependency: transitive description: name: test_api - sha256: "664d3a9a64782fcdeb83ce9c6b39e78fd2971d4e37827b9b06c3aa1edc5e760c" + sha256: fb31f383e2ee25fbbfe06b40fe21e1e458d14080e3c67e7ba0acfde4df4e0bbd url: "https://pub.dev" source: hosted - version: "0.7.3" + version: "0.7.4" test_core: dependency: transitive description: name: test_core - sha256: "12391302411737c176b0b5d6491f466b0dd56d4763e347b6714efbaa74d7953d" + sha256: "84d17c3486c8dfdbe5e12a50c8ae176d15e2a771b96909a9442b40173649ccaa" url: "https://pub.dev" source: hosted - version: "0.6.5" + version: "0.6.8" tezart: dependency: "direct main" description: @@ -2152,10 +2152,10 @@ packages: dependency: transitive description: name: vm_service - sha256: f6be3ed8bd01289b34d679c2b62226f63c0e69f9fd2e50a6b3c1c729a961041b + sha256: "0968250880a6c5fe7edc067ed0a13d4bae1577fe2771dcf3010d52c4a9d3ca14" url: "https://pub.dev" source: hosted - version: "14.3.0" + version: "14.3.1" wakelock_platform_interface: dependency: transitive description: @@ -2327,5 +2327,5 @@ packages: source: hosted version: "0.2.3" sdks: - dart: ">=3.6.1 <4.0.0" + dart: ">=3.7.0-0 <4.0.0" flutter: ">=3.27.3" diff --git a/scripts/app_config/templates/pubspec.template b/scripts/app_config/templates/pubspec.template index 145e191ed..b62c8d967 100644 --- a/scripts/app_config/templates/pubspec.template +++ b/scripts/app_config/templates/pubspec.template @@ -14,8 +14,8 @@ description: PLACEHOLDER version: PLACEHOLDER_V+PLACEHOLDER_B environment: - sdk: ">=3.6.1 <4.0.0" - flutter: ^3.27.3 + sdk: ">=3.7.0 <4.0.0" + flutter: ^3.29.0 dependencies: flutter: From 44f0d0d8df3688cf7f6db72e0cccc883b51afe07 Mon Sep 17 00:00:00 2001 From: julian Date: Tue, 25 Feb 2025 08:38:51 -0600 Subject: [PATCH 097/193] flutter_libmonero is no more --- docs/building.md | 25 +------------------------ 1 file changed, 1 insertion(+), 24 deletions(-) diff --git a/docs/building.md b/docs/building.md index 204012f46..d336eac16 100644 --- a/docs/building.md +++ b/docs/building.md @@ -68,13 +68,6 @@ sudo apt install pipx libgcrypt20-dev libglib2.0-dev libsecret-1-dev pipx install meson==0.64.1 markdown==3.4.1 markupsafe==2.1.1 jinja2==3.1.2 pygments==2.13.0 toml==0.10.2 typogrify==2.0.7 tomli==2.0.1 ``` -Install `libtinfo5` (required by [monero_c](https://github.com/MrCyjaneK/monero_c), should be dropped in the future): -``` -wget http://mirrors.kernel.org/ubuntu/pool/universe/n/ncurses/libtinfo5_6.3-2ubuntu0.1_amd64.deb -O libtinfo5.deb \ - && apt install ./libtinfo5.deb \ - && rm libtinfo5.deb -``` - Install [Rust](https://www.rust-lang.org/tools/install) via [rustup.rs](https://rustup.rs), the required Rust toolchains, and `cargo-ndk 2.12.7` with command: ``` curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh @@ -162,19 +155,6 @@ cd scripts cd scripts ./build_app.sh -a stack_wallet -p linux ``` - #### Building plugins and configure for Windows Install dependencies like MXE: @@ -304,10 +284,7 @@ If the DLLs were built on the WSL filesystem instead of on Windows, copy the res - `stack_wallet/crypto_plugins/flutter_libepiccash/scripts/windows/build/libepic_cash_wallet.dll` - `stack_wallet/crypto_plugins/flutter_liblelantus/scripts/windows/build/libmobileliblelantus.dll` - + Frostdart will be built by the Windows host later. From 03dcb2babf7b0542c2b0b1d1fb9bee6bea82a726 Mon Sep 17 00:00:00 2001 From: julian Date: Tue, 25 Feb 2025 08:58:49 -0600 Subject: [PATCH 098/193] update barcode_scan2 for flutter 3.29.0 --- pubspec.lock | 4 ++-- scripts/app_config/templates/pubspec.template | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/pubspec.lock b/pubspec.lock index b66fcecf0..21f8eb65a 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -66,10 +66,10 @@ packages: dependency: "direct main" description: name: barcode_scan2 - sha256: a2ab566027cd57b2795ea42aa26835dbaa8fe70bcc1aff54942a14d3705dff97 + sha256: efbe38629e6df2200e4d60ebe252e8e041cd5ae7b50f194a20f01779ade9d1c3 url: "https://pub.dev" source: hosted - version: "4.3.3" + version: "4.5.0" basic_utils: dependency: "direct main" description: diff --git a/scripts/app_config/templates/pubspec.template b/scripts/app_config/templates/pubspec.template index b62c8d967..fe59c1674 100644 --- a/scripts/app_config/templates/pubspec.template +++ b/scripts/app_config/templates/pubspec.template @@ -120,7 +120,7 @@ dependencies: event_bus: ^2.0.0 uuid: ^3.0.5 crypto: ^3.0.2 - barcode_scan2: ^4.3.3 + barcode_scan2: ^4.5.0 wakelock_plus: ^1.2.8 intl: ^0.17.0 devicelocale: From fd223ddaea9be91188fb0d5cf2810abbfb34c77e Mon Sep 17 00:00:00 2001 From: julian Date: Tue, 25 Feb 2025 09:27:16 -0600 Subject: [PATCH 099/193] android build files ignore --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index 597ed4be4..3d212c730 100644 --- a/.gitignore +++ b/.gitignore @@ -29,6 +29,7 @@ .pub-cache/ .pub/ /build/ +android/app/.cxx # Web related lib/generated_plugin_registrant.dart From 5ddde67555ac57361d126ad6543b04cfb8a2eaca Mon Sep 17 00:00:00 2001 From: julian Date: Wed, 26 Feb 2025 13:40:38 -0600 Subject: [PATCH 100/193] hide zero lelantus balance on desktop --- .../desktop_balance_toggle_button.dart | 37 +++++++++++----- .../wallet_view/sub_widgets/desktop_send.dart | 44 ++++++++++--------- .../sub_widgets/desktop_wallet_summary.dart | 24 ++++++---- 3 files changed, 66 insertions(+), 39 deletions(-) diff --git a/lib/pages_desktop_specific/my_stack_view/wallet_view/sub_widgets/desktop_balance_toggle_button.dart b/lib/pages_desktop_specific/my_stack_view/wallet_view/sub_widgets/desktop_balance_toggle_button.dart index 659f5710a..5f4dcf574 100644 --- a/lib/pages_desktop_specific/my_stack_view/wallet_view/sub_widgets/desktop_balance_toggle_button.dart +++ b/lib/pages_desktop_specific/my_stack_view/wallet_view/sub_widgets/desktop_balance_toggle_button.dart @@ -17,6 +17,7 @@ import '../../../../themes/stack_colors.dart'; import '../../../../utilities/constants.dart'; import '../../../../utilities/enums/wallet_balance_toggle_state.dart'; import '../../../../utilities/text_styles.dart'; +import '../../../../wallets/isar/providers/wallet_info_provider.dart'; class DesktopBalanceToggleButton extends ConsumerWidget { const DesktopBalanceToggleButton({ @@ -74,15 +75,21 @@ class DesktopBalanceToggleButton extends ConsumerWidget { class DesktopPrivateBalanceToggleButton extends ConsumerWidget { const DesktopPrivateBalanceToggleButton({ super.key, + required this.walletId, this.onPressed, }); + final String walletId; final VoidCallback? onPressed; @override Widget build(BuildContext context, WidgetRef ref) { final currentType = ref.watch(publicPrivateBalanceStateProvider); + final showLelantus = + ref.watch(pWalletBalanceSecondary(walletId)).spendable.raw > + BigInt.zero; + return SizedBox( height: 22, width: 80, @@ -90,21 +97,31 @@ class DesktopPrivateBalanceToggleButton extends ConsumerWidget { color: Theme.of(context).extension()!.buttonBackSecondary, splashColor: Theme.of(context).extension()!.highlight, onPressed: () { - switch (currentType) { - case FiroType.public: - ref.read(publicPrivateBalanceStateProvider.state).state = - FiroType.lelantus; - break; + if (showLelantus) { + switch (currentType) { + case FiroType.public: + ref.read(publicPrivateBalanceStateProvider.state).state = + FiroType.lelantus; + break; + + case FiroType.lelantus: + ref.read(publicPrivateBalanceStateProvider.state).state = + FiroType.spark; + break; - case FiroType.lelantus: + case FiroType.spark: + ref.read(publicPrivateBalanceStateProvider.state).state = + FiroType.public; + break; + } + } else { + if (currentType != FiroType.spark) { ref.read(publicPrivateBalanceStateProvider.state).state = FiroType.spark; - break; - - case FiroType.spark: + } else { ref.read(publicPrivateBalanceStateProvider.state).state = FiroType.public; - break; + } } onPressed?.call(); }, diff --git a/lib/pages_desktop_specific/my_stack_view/wallet_view/sub_widgets/desktop_send.dart b/lib/pages_desktop_specific/my_stack_view/wallet_view/sub_widgets/desktop_send.dart index c3a9964d4..0c8b9034c 100644 --- a/lib/pages_desktop_specific/my_stack_view/wallet_view/sub_widgets/desktop_send.dart +++ b/lib/pages_desktop_specific/my_stack_view/wallet_view/sub_widgets/desktop_send.dart @@ -1107,28 +1107,30 @@ class _DesktopSendState extends ConsumerState { ], ), ), - DropdownMenuItem( - value: FiroType.lelantus, - child: Row( - children: [ - Text( - "Lelantus balance", - style: STextStyles.itemSubtitle12(context), - ), - const SizedBox( - width: 10, - ), - Text( - ref.watch(pAmountFormatter(coin)).format( - ref - .watch(pWalletBalanceSecondary(walletId)) - .spendable, - ), - style: STextStyles.itemSubtitle(context), - ), - ], + if (ref.watch(pWalletBalanceSecondary(walletId)).spendable.raw > + BigInt.zero) + DropdownMenuItem( + value: FiroType.lelantus, + child: Row( + children: [ + Text( + "Lelantus balance", + style: STextStyles.itemSubtitle12(context), + ), + const SizedBox( + width: 10, + ), + Text( + ref.watch(pAmountFormatter(coin)).format( + ref + .watch(pWalletBalanceSecondary(walletId)) + .spendable, + ), + style: STextStyles.itemSubtitle(context), + ), + ], + ), ), - ), DropdownMenuItem( value: FiroType.public, child: Row( diff --git a/lib/pages_desktop_specific/my_stack_view/wallet_view/sub_widgets/desktop_wallet_summary.dart b/lib/pages_desktop_specific/my_stack_view/wallet_view/sub_widgets/desktop_wallet_summary.dart index c4a719510..6620e8626 100644 --- a/lib/pages_desktop_specific/my_stack_view/wallet_view/sub_widgets/desktop_wallet_summary.dart +++ b/lib/pages_desktop_specific/my_stack_view/wallet_view/sub_widgets/desktop_wallet_summary.dart @@ -23,6 +23,8 @@ import '../../../../utilities/amount/amount_formatter.dart'; import '../../../../utilities/enums/wallet_balance_toggle_state.dart'; import '../../../../utilities/text_styles.dart'; import '../../../../wallets/crypto_currency/coins/firo.dart'; +import '../../../../wallets/crypto_currency/crypto_currency.dart' + show CryptoCurrency; import '../../../../wallets/isar/providers/eth/current_token_wallet_provider.dart'; import '../../../../wallets/isar/providers/eth/token_balance_provider.dart'; import '../../../../wallets/isar/providers/wallet_info_provider.dart'; @@ -48,10 +50,15 @@ class DesktopWalletSummary extends ConsumerStatefulWidget { class _WDesktopWalletSummaryState extends ConsumerState { late final String walletId; + late final CryptoCurrency coin; + late final bool isFiro; + @override void initState() { - walletId = widget.walletId; super.initState(); + walletId = widget.walletId; + coin = ref.read(pWalletCoin(widget.walletId)); + isFiro = coin is Firo; } @override @@ -63,8 +70,7 @@ class _WDesktopWalletSummaryState extends ConsumerState { (value) => value.externalCalls, ), ); - final coin = ref.watch(pWalletCoin(widget.walletId)); - final isFiro = coin is Firo; + final locale = ref.watch( localeServiceChangeNotifierProvider.select((value) => value.locale), ); @@ -152,15 +158,17 @@ class _WDesktopWalletSummaryState extends ConsumerState { ), ), if (coin is Firo) - const Row( + Row( children: [ - DesktopPrivateBalanceToggleButton(), - SizedBox( + DesktopPrivateBalanceToggleButton( + walletId: walletId, + ), + const SizedBox( width: 8, ), - DesktopBalanceToggleButton(), + const DesktopBalanceToggleButton(), ], - ) + ), ], ), const SizedBox( From 3146f4dce9244349ec8f5118767001a5ff786218 Mon Sep 17 00:00:00 2001 From: julian Date: Wed, 26 Feb 2025 15:33:18 -0600 Subject: [PATCH 101/193] WIP firo balance display desktop --- .../wallet_view/desktop_wallet_view.dart | 243 +++++------- .../sub_widgets/desktop_wallet_features.dart | 366 ++++++++---------- .../sub_widgets/desktop_wallet_summary.dart | 114 +++--- .../firo_desktop_wallet_summary.dart | 245 ++++++++++++ .../more_features/more_features_dialog.dart | 277 ++++++------- pubspec.lock | 4 +- 6 files changed, 712 insertions(+), 537 deletions(-) create mode 100644 lib/pages_desktop_specific/my_stack_view/wallet_view/sub_widgets/firo_desktop_wallet_summary.dart diff --git a/lib/pages_desktop_specific/my_stack_view/wallet_view/desktop_wallet_view.dart b/lib/pages_desktop_specific/my_stack_view/wallet_view/desktop_wallet_view.dart index 3676f1192..9d19d3b81 100644 --- a/lib/pages_desktop_specific/my_stack_view/wallet_view/desktop_wallet_view.dart +++ b/lib/pages_desktop_specific/my_stack_view/wallet_view/desktop_wallet_view.dart @@ -55,6 +55,7 @@ import '../../../widgets/rounded_white_container.dart'; import '../../coin_control/desktop_coin_control_use_dialog.dart'; import 'sub_widgets/desktop_wallet_features.dart'; import 'sub_widgets/desktop_wallet_summary.dart'; +import 'sub_widgets/firo_desktop_wallet_summary.dart'; import 'sub_widgets/my_wallet.dart'; import 'sub_widgets/network_info_button.dart'; import 'sub_widgets/wallet_keys_button.dart'; @@ -62,11 +63,7 @@ import 'sub_widgets/wallet_options_button.dart'; /// [eventBus] should only be set during testing class DesktopWalletView extends ConsumerStatefulWidget { - const DesktopWalletView({ - super.key, - required this.walletId, - this.eventBus, - }); + const DesktopWalletView({super.key, required this.walletId, this.eventBus}); static const String routeName = "/desktopWalletView"; @@ -138,12 +135,10 @@ class _DesktopWalletViewState extends ConsumerState { eventBus = widget.eventBus != null ? widget.eventBus! : GlobalEventBus.instance; - WidgetsBinding.instance.addPostFrameCallback( - (_) { - ref.read(currentWalletIdProvider.notifier).state = wallet.walletId; - ref.read(desktopUseUTXOs.notifier).state = {}; - }, - ); + WidgetsBinding.instance.addPostFrameCallback((_) { + ref.read(currentWalletIdProvider.notifier).state = wallet.walletId; + ref.read(desktopUseUTXOs.notifier).state = {}; + }); if (!wallet.shouldAutoSync) { // // enable auto sync if it wasn't enabled when loading wallet @@ -171,9 +166,10 @@ class _DesktopWalletViewState extends ConsumerState { final monke = wallet is BananoWallet ? wallet.getMonkeyImageBytes() : null; // if the view only wallet watches a single address there are no keys of any kind - final showKeysButton = !(wallet is ViewOnlyOptionInterface && - wallet.isViewOnly && - wallet.viewOnlyType == ViewOnlyWalletType.addressOnly); + final showKeysButton = + !(wallet is ViewOnlyOptionInterface && + wallet.isViewOnly && + wallet.viewOnlyType == ViewOnlyWalletType.addressOnly); return DesktopScaffold( appBar: DesktopAppBar( @@ -181,59 +177,48 @@ class _DesktopWalletViewState extends ConsumerState { leading: Expanded( child: Row( children: [ - const SizedBox( - width: 32, - ), + const SizedBox(width: 32), AppBarIconButton( size: 32, - color: Theme.of(context) - .extension()! - .textFieldDefaultBG, + color: + Theme.of( + context, + ).extension()!.textFieldDefaultBG, shadows: const [], icon: SvgPicture.asset( Assets.svg.arrowLeft, width: 18, height: 18, - color: Theme.of(context) - .extension()! - .topNavIconPrimary, + color: + Theme.of( + context, + ).extension()!.topNavIconPrimary, ), onPressed: onBackPressed, ), - const SizedBox( - width: 15, - ), + const SizedBox(width: 15), SvgPicture.file( - File( - ref.watch(coinIconProvider(wallet.info.coin)), - ), + File(ref.watch(coinIconProvider(wallet.info.coin))), width: 32, height: 32, ), - const SizedBox( - width: 12, - ), + const SizedBox(width: 12), ConstrainedBox( - constraints: const BoxConstraints( - minWidth: 48, - ), + constraints: const BoxConstraints(minWidth: 48), child: IntrinsicWidth( - child: DesktopWalletNameField( - walletId: widget.walletId, - ), + child: DesktopWalletNameField(walletId: widget.walletId), ), ), if (ref.watch(pWalletInfo(widget.walletId)).isViewOnly) - const SizedBox( - width: 20, - ), + const SizedBox(width: 20), if (ref.watch(pWalletInfo(widget.walletId)).isViewOnly) Text( "(View only)", style: STextStyles.desktopTextExtraSmall(context).copyWith( - color: Theme.of(context) - .extension()! - .textFieldActiveSearchIconLeft, + color: + Theme.of(context) + .extension()! + .textFieldActiveSearchIconLeft, ), ), if (kDebugMode) const Spacer(), @@ -244,12 +229,8 @@ class _DesktopWalletViewState extends ConsumerState { children: [ Row( children: [ - const Text( - "dbgHeight: ", - ), - const SizedBox( - width: 2, - ), + const Text("dbgHeight: "), + const SizedBox(width: 2), Text( ref .watch(pWalletChainHeight(widget.walletId)) @@ -259,12 +240,8 @@ class _DesktopWalletViewState extends ConsumerState { ), Row( children: [ - const Text( - "dbgTxCount: ", - ), - const SizedBox( - width: 2, - ), + const Text("dbgTxCount: "), + const SizedBox(width: 2), Text( wallet.isarTransactionVersion == 2 ? ref @@ -290,16 +267,10 @@ class _DesktopWalletViewState extends ConsumerState { wallet is FiroWallet) Row( children: [ - const Text( - "dbgBal: ", - ), - const SizedBox( - width: 2, - ), + const Text("dbgBal: "), + const SizedBox(width: 2), Text( - WalletDevTools.checkFiroTransactionTally( - wallet, - ), + WalletDevTools.checkFiroTransactionTally(wallet), ), ], ), @@ -307,19 +278,13 @@ class _DesktopWalletViewState extends ConsumerState { wallet is FiroWallet) Row( children: [ - const Text( - "sparkCache: ", - ), - const SizedBox( - width: 2, - ), + const Text("sparkCache: "), + const SizedBox(width: 2), FutureBuilder( future: FiroCacheCoordinator.getSparkCacheSize( wallet.cryptoCurrency.network, ), - builder: (_, snapshot) => Text( - snapshot.data ?? "", - ), + builder: (_, snapshot) => Text(snapshot.data ?? ""), ), ], ), @@ -332,23 +297,12 @@ class _DesktopWalletViewState extends ConsumerState { walletId: widget.walletId, eventBus: eventBus, ), + if (showKeysButton) const SizedBox(width: 2), if (showKeysButton) - const SizedBox( - width: 2, - ), - if (showKeysButton) - WalletKeysButton( - walletId: widget.walletId, - ), - const SizedBox( - width: 2, - ), - WalletOptionsButton( - walletId: widget.walletId, - ), - const SizedBox( - width: 12, - ), + WalletKeysButton(walletId: widget.walletId), + const SizedBox(width: 2), + WalletOptionsButton(walletId: widget.walletId), + const SizedBox(width: 12), ], ), ], @@ -367,37 +321,40 @@ class _DesktopWalletViewState extends ConsumerState { children: [ if (monke != null) SvgPicture.memory( - Uint8List.fromList(monke!), + Uint8List.fromList(monke), width: 60, height: 60, ), if (monke == null) SvgPicture.file( - File( - ref.watch(coinIconProvider(wallet.info.coin)), - ), + File(ref.watch(coinIconProvider(wallet.info.coin))), width: 40, height: 40, ), - const SizedBox( - width: 10, - ), - DesktopWalletSummary( - walletId: widget.walletId, - initialSyncStatus: wallet.refreshMutex.isLocked - ? WalletSyncStatus.syncing - : WalletSyncStatus.synced, - ), + const SizedBox(width: 10), + if (wallet is FiroWallet) + FiroDesktopWalletSummary( + walletId: widget.walletId, + initialSyncStatus: + wallet.refreshMutex.isLocked + ? WalletSyncStatus.syncing + : WalletSyncStatus.synced, + ), + + if (wallet is! FiroWallet) + DesktopWalletSummary( + walletId: widget.walletId, + initialSyncStatus: + wallet.refreshMutex.isLocked + ? WalletSyncStatus.syncing + : WalletSyncStatus.synced, + ), const Spacer(), - DesktopWalletFeatures( - walletId: widget.walletId, - ), + DesktopWalletFeatures(walletId: widget.walletId), ], ), ), - const SizedBox( - height: 24, - ), + const SizedBox(height: 24), Row( children: [ SizedBox( @@ -405,15 +362,14 @@ class _DesktopWalletViewState extends ConsumerState { child: Text( "My wallet", style: STextStyles.desktopTextExtraSmall(context).copyWith( - color: Theme.of(context) - .extension()! - .textFieldActiveSearchIconLeft, + color: + Theme.of(context) + .extension()! + .textFieldActiveSearchIconLeft, ), ), ), - const SizedBox( - width: 16, - ), + const SizedBox(width: 16), Expanded( child: Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, @@ -422,25 +378,29 @@ class _DesktopWalletViewState extends ConsumerState { wallet.cryptoCurrency.hasTokenSupport ? "Tokens" : "Recent activity", - style: - STextStyles.desktopTextExtraSmall(context).copyWith( - color: Theme.of(context) - .extension()! - .textFieldActiveSearchIconLeft, + style: STextStyles.desktopTextExtraSmall( + context, + ).copyWith( + color: + Theme.of(context) + .extension()! + .textFieldActiveSearchIconLeft, ), ), CustomTextButton( - text: wallet.cryptoCurrency.hasTokenSupport - ? "Edit" - : "See all", + text: + wallet.cryptoCurrency.hasTokenSupport + ? "Edit" + : "See all", onTap: () async { if (wallet.cryptoCurrency.hasTokenSupport) { final result = await showDialog( context: context, - builder: (context) => EditWalletTokensView( - walletId: widget.walletId, - isDesktopPopup: true, - ), + builder: + (context) => EditWalletTokensView( + walletId: widget.walletId, + isDesktopPopup: true, + ), ); if (result == 42) { @@ -462,34 +422,23 @@ class _DesktopWalletViewState extends ConsumerState { ), ], ), - const SizedBox( - height: 14, - ), + const SizedBox(height: 14), Expanded( child: Row( crossAxisAlignment: CrossAxisAlignment.start, children: [ SizedBox( width: sendReceiveColumnWidth, - child: MyWallet( - walletId: widget.walletId, - ), - ), - const SizedBox( - width: 16, + child: MyWallet(walletId: widget.walletId), ), + const SizedBox(width: 16), Expanded( - child: wallet.cryptoCurrency.hasTokenSupport - ? MyTokensView( - walletId: widget.walletId, - ) - : wallet.isarTransactionVersion == 2 - ? TransactionsV2List( - walletId: widget.walletId, - ) - : TransactionsList( - walletId: widget.walletId, - ), + child: + wallet.cryptoCurrency.hasTokenSupport + ? MyTokensView(walletId: widget.walletId) + : wallet.isarTransactionVersion == 2 + ? TransactionsV2List(walletId: widget.walletId) + : TransactionsList(walletId: widget.walletId), ), ], ), diff --git a/lib/pages_desktop_specific/my_stack_view/wallet_view/sub_widgets/desktop_wallet_features.dart b/lib/pages_desktop_specific/my_stack_view/wallet_view/sub_widgets/desktop_wallet_features.dart index 74512e256..78a36d8d7 100644 --- a/lib/pages_desktop_specific/my_stack_view/wallet_view/sub_widgets/desktop_wallet_features.dart +++ b/lib/pages_desktop_specific/my_stack_view/wallet_view/sub_widgets/desktop_wallet_features.dart @@ -9,7 +9,6 @@ */ import 'dart:async'; -import 'dart:io'; import 'package:flutter/material.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; @@ -27,7 +26,6 @@ import '../../../../providers/global/paynym_api_provider.dart'; import '../../../../providers/providers.dart'; import '../../../../providers/wallet/my_paynym_account_state_provider.dart'; import '../../../../themes/stack_colors.dart'; -import '../../../../themes/theme_providers.dart'; import '../../../../utilities/amount/amount.dart'; import '../../../../utilities/assets.dart'; import '../../../../utilities/constants.dart'; @@ -57,10 +55,7 @@ import '../desktop_wallet_view.dart'; import 'more_features/more_features_dialog.dart'; class DesktopWalletFeatures extends ConsumerStatefulWidget { - const DesktopWalletFeatures({ - super.key, - required this.walletId, - }); + const DesktopWalletFeatures({super.key, required this.walletId}); final String walletId; @@ -80,6 +75,7 @@ class _DesktopWalletFeaturesState extends ConsumerState { } Future _onBuyPressed() async { + Navigator.of(context, rootNavigator: true).pop(); ref.read(currentDesktopMenuItemProvider.state).state = DesktopMenuItemId.buy; ref.read(prevDesktopMenuItemProvider.state).state = DesktopMenuItemId.buy; @@ -88,20 +84,22 @@ class _DesktopWalletFeaturesState extends ConsumerState { Future _onMorePressed() async { await showDialog( context: context, - builder: (_) => MoreFeaturesDialog( - walletId: widget.walletId, - onPaynymPressed: _onPaynymPressed, - onCoinControlPressed: _onCoinControlPressed, - onLelantusCoinsPressed: _onLelantusCoinsPressed, - onSparkCoinsPressedPressed: _onSparkCoinsPressed, - onAnonymizeAllPressed: _onAnonymizeAllPressed, - onWhirlpoolPressed: _onWhirlpoolPressed, - onOrdinalsPressed: _onOrdinalsPressed, - onMonkeyPressed: _onMonkeyPressed, - onFusionPressed: _onFusionPressed, - onChurnPressed: _onChurnPressed, - onNamesPressed: _onNamesPressed, - ), + builder: + (_) => MoreFeaturesDialog( + walletId: widget.walletId, + onPaynymPressed: _onPaynymPressed, + onBuyPressed: _onBuyPressed, + onCoinControlPressed: _onCoinControlPressed, + onLelantusCoinsPressed: _onLelantusCoinsPressed, + onSparkCoinsPressedPressed: _onSparkCoinsPressed, + // onAnonymizeAllPressed: _onAnonymizeAllPressed, + onWhirlpoolPressed: _onWhirlpoolPressed, + onOrdinalsPressed: _onOrdinalsPressed, + onMonkeyPressed: _onMonkeyPressed, + onFusionPressed: _onFusionPressed, + onChurnPressed: _onChurnPressed, + onNamesPressed: _onNamesPressed, + ), ); } @@ -112,82 +110,74 @@ class _DesktopWalletFeaturesState extends ConsumerState { void _onCoinControlPressed() { Navigator.of(context, rootNavigator: true).pop(); - Navigator.of(context).pushNamed( - DesktopCoinControlView.routeName, - arguments: widget.walletId, - ); + Navigator.of( + context, + ).pushNamed(DesktopCoinControlView.routeName, arguments: widget.walletId); } void _onLelantusCoinsPressed() { Navigator.of(context, rootNavigator: true).pop(); - Navigator.of(context).pushNamed( - LelantusCoinsView.routeName, - arguments: widget.walletId, - ); + Navigator.of( + context, + ).pushNamed(LelantusCoinsView.routeName, arguments: widget.walletId); } void _onSparkCoinsPressed() { Navigator.of(context, rootNavigator: true).pop(); - Navigator.of(context).pushNamed( - SparkCoinsView.routeName, - arguments: widget.walletId, - ); + Navigator.of( + context, + ).pushNamed(SparkCoinsView.routeName, arguments: widget.walletId); } Future _onAnonymizeAllPressed() async { - Navigator.of(context, rootNavigator: true).pop(); await showDialog( context: context, barrierDismissible: false, - builder: (context) => DesktopDialog( - maxWidth: 500, - maxHeight: double.infinity, - child: Padding( - padding: const EdgeInsets.symmetric(horizontal: 32, vertical: 20), - child: Column( - children: [ - Text( - "Attention!", - style: STextStyles.desktopH2(context), - ), - const SizedBox(height: 16), - Text( - "You're about to anonymize all of your public funds.", - style: STextStyles.desktopTextSmall(context), - ), - const SizedBox(height: 32), - Row( - mainAxisAlignment: MainAxisAlignment.center, + builder: + (context) => DesktopDialog( + maxWidth: 500, + maxHeight: double.infinity, + child: Padding( + padding: const EdgeInsets.symmetric(horizontal: 32, vertical: 20), + child: Column( children: [ - SecondaryButton( - width: 200, - buttonHeight: ButtonHeight.l, - label: "Cancel", - onPressed: () { - Navigator.of(context).pop(); - }, + Text("Attention!", style: STextStyles.desktopH2(context)), + const SizedBox(height: 16), + Text( + "You're about to anonymize all of your public funds.", + style: STextStyles.desktopTextSmall(context), ), - const SizedBox(width: 20), - PrimaryButton( - width: 200, - buttonHeight: ButtonHeight.l, - label: "Continue", - onPressed: () { - Navigator.of(context).pop(); - - unawaited( - _attemptAnonymize(), - ); - }, + const SizedBox(height: 32), + Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + SecondaryButton( + width: 200, + buttonHeight: ButtonHeight.l, + label: "Cancel", + onPressed: () { + Navigator.of(context).pop(); + }, + ), + const SizedBox(width: 20), + PrimaryButton( + width: 200, + buttonHeight: ButtonHeight.l, + label: "Continue", + onPressed: () { + Navigator.of(context).pop(); + + unawaited(_attemptAnonymize()); + }, + ), + ], ), ], ), - ], + ), ), - ), - ), ); } @@ -196,13 +186,14 @@ class _DesktopWalletFeaturesState extends ConsumerState { unawaited( showDialog( context: context, - builder: (context) => WillPopScope( - child: const CustomLoadingOverlay( - message: "Anonymizing balance", - eventBus: null, - ), - onWillPop: () async => shouldPop, - ), + builder: + (context) => WillPopScope( + child: const CustomLoadingOverlay( + message: "Anonymizing balance", + eventBus: null, + ), + onWillPop: () async => shouldPop, + ), ), ); final firoWallet = @@ -213,9 +204,9 @@ class _DesktopWalletFeaturesState extends ConsumerState { shouldPop = true; if (context.mounted) { Navigator.of(context, rootNavigator: true).pop(); - Navigator.of(context).popUntil( - ModalRoute.withName(DesktopWalletView.routeName), - ); + Navigator.of( + context, + ).popUntil(ModalRoute.withName(DesktopWalletView.routeName)); unawaited( showFloatingFlushBar( type: FlushBarType.info, @@ -233,9 +224,9 @@ class _DesktopWalletFeaturesState extends ConsumerState { shouldPop = true; if (mounted) { Navigator.of(context, rootNavigator: true).pop(); - Navigator.of(context).popUntil( - ModalRoute.withName(DesktopWalletView.routeName), - ); + Navigator.of( + context, + ).popUntil(ModalRoute.withName(DesktopWalletView.routeName)); unawaited( showFloatingFlushBar( type: FlushBarType.success, @@ -248,53 +239,51 @@ class _DesktopWalletFeaturesState extends ConsumerState { shouldPop = true; if (mounted) { Navigator.of(context, rootNavigator: true).pop(); - Navigator.of(context).popUntil( - ModalRoute.withName(DesktopWalletView.routeName), - ); + Navigator.of( + context, + ).popUntil(ModalRoute.withName(DesktopWalletView.routeName)); await showDialog( context: context, - builder: (_) => DesktopDialog( - maxWidth: 400, - maxHeight: 300, - child: Padding( - padding: const EdgeInsets.all(24), - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Text( - "Anonymize all failed", - style: STextStyles.desktopH3(context), - ), - const Spacer( - flex: 1, - ), - Text( - "Reason: $e", - style: STextStyles.desktopTextSmall(context), - ), - const Spacer( - flex: 2, - ), - Row( + builder: + (_) => DesktopDialog( + maxWidth: 400, + maxHeight: 300, + child: Padding( + padding: const EdgeInsets.all(24), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, children: [ - const Spacer(), - const SizedBox( - width: 16, + Text( + "Anonymize all failed", + style: STextStyles.desktopH3(context), ), - Expanded( - child: PrimaryButton( - label: "Ok", - buttonHeight: ButtonHeight.l, - onPressed: - Navigator.of(context, rootNavigator: true).pop, - ), + const Spacer(flex: 1), + Text( + "Reason: $e", + style: STextStyles.desktopTextSmall(context), + ), + const Spacer(flex: 2), + Row( + children: [ + const Spacer(), + const SizedBox(width: 16), + Expanded( + child: PrimaryButton( + label: "Ok", + buttonHeight: ButtonHeight.l, + onPressed: + Navigator.of( + context, + rootNavigator: true, + ).pop, + ), + ), + ], ), ], ), - ], + ), ), - ), - ), ); } } @@ -307,9 +296,7 @@ class _DesktopWalletFeaturesState extends ConsumerState { showDialog( context: context, builder: (context) { - return const LoadingIndicator( - width: 100, - ); + return const LoadingIndicator(width: 100); }, ), ); @@ -328,20 +315,18 @@ class _DesktopWalletFeaturesState extends ConsumerState { // check if account exists and for matching code to see if claimed if (account.value != null && account.value!.nonSegwitPaymentCode.claimed - // && - // account.value!.segwit - ) { + // && + // account.value!.segwit + ) { ref.read(myPaynymAccountStateProvider.state).state = account.value!; - await Navigator.of(context).pushNamed( - PaynymHomeView.routeName, - arguments: widget.walletId, - ); + await Navigator.of( + context, + ).pushNamed(PaynymHomeView.routeName, arguments: widget.walletId); } else { - await Navigator.of(context).pushNamed( - PaynymClaimView.routeName, - arguments: widget.walletId, - ); + await Navigator.of( + context, + ).pushNamed(PaynymClaimView.routeName, arguments: widget.walletId); } } } @@ -349,46 +334,41 @@ class _DesktopWalletFeaturesState extends ConsumerState { Future _onMonkeyPressed() async { Navigator.of(context, rootNavigator: true).pop(); - await (Navigator.of(context).pushNamed( - MonkeyView.routeName, - arguments: widget.walletId, - )); + await (Navigator.of( + context, + ).pushNamed(MonkeyView.routeName, arguments: widget.walletId)); } void _onOrdinalsPressed() { Navigator.of(context, rootNavigator: true).pop(); - Navigator.of(context).pushNamed( - DesktopOrdinalsView.routeName, - arguments: widget.walletId, - ); + Navigator.of( + context, + ).pushNamed(DesktopOrdinalsView.routeName, arguments: widget.walletId); } void _onFusionPressed() { Navigator.of(context, rootNavigator: true).pop(); - Navigator.of(context).pushNamed( - DesktopCashFusionView.routeName, - arguments: widget.walletId, - ); + Navigator.of( + context, + ).pushNamed(DesktopCashFusionView.routeName, arguments: widget.walletId); } void _onChurnPressed() { Navigator.of(context, rootNavigator: true).pop(); - Navigator.of(context).pushNamed( - DesktopChurningView.routeName, - arguments: widget.walletId, - ); + Navigator.of( + context, + ).pushNamed(DesktopChurningView.routeName, arguments: widget.walletId); } void _onNamesPressed() { Navigator.of(context, rootNavigator: true).pop(); - Navigator.of(context).pushNamed( - NamecoinNamesHomeView.routeName, - arguments: widget.walletId, - ); + Navigator.of( + context, + ).pushNamed(NamecoinNamesHomeView.routeName, arguments: widget.walletId); } @override @@ -399,7 +379,8 @@ class _DesktopWalletFeaturesState extends ConsumerState { final prefs = ref.watch(prefsChangeNotifierProvider); final showExchange = prefs.enableExchange; - final showMore = wallet is PaynymInterface || + final showMore = + wallet is PaynymInterface || (wallet is CoinControlInterface && ref.watch( prefsChangeNotifierProvider.select( @@ -415,54 +396,46 @@ class _DesktopWalletFeaturesState extends ConsumerState { final isViewOnly = wallet is ViewOnlyOptionInterface && wallet.isViewOnly; return Row( + mainAxisSize: MainAxisSize.min, children: [ - if (!isViewOnly && - Constants.enableExchange && - AppConfig.hasFeature(AppFeature.swap) && - showExchange) + if (!isViewOnly && wallet.info.coin is Firo) SecondaryButton( - label: "Swap", - width: buttonWidth, + label: "Anonymize funds", + width: buttonWidth * 2, buttonHeight: ButtonHeight.l, icon: SvgPicture.asset( - Assets.svg.arrowRotate, + Assets.svg.recycle, height: 20, width: 20, - color: Theme.of(context) - .extension()! - .buttonTextSecondary, + color: + Theme.of( + context, + ).extension()!.buttonTextSecondary, ), - onPressed: () => _onSwapPressed(), + onPressed: () => _onAnonymizeAllPressed(), ), - if (Constants.enableExchange && - AppConfig.hasFeature(AppFeature.buy) && - showExchange) - const SizedBox( - width: 16, - ), - if (Constants.enableExchange && - AppConfig.hasFeature(AppFeature.buy) && + if (!isViewOnly && wallet.info.coin is Firo) const SizedBox(width: 16), + if (!isViewOnly && + Constants.enableExchange && + AppConfig.hasFeature(AppFeature.swap) && showExchange) SecondaryButton( - label: "Buy", + label: "Swap", width: buttonWidth, buttonHeight: ButtonHeight.l, - icon: SvgPicture.file( - File( - ref.watch(themeProvider.select((value) => value.assets.buy)), - ), + icon: SvgPicture.asset( + Assets.svg.arrowRotate, height: 20, width: 20, - color: Theme.of(context) - .extension()! - .buttonTextSecondary, + color: + Theme.of( + context, + ).extension()!.buttonTextSecondary, ), - onPressed: () => _onBuyPressed(), - ), - if (showMore) - const SizedBox( - width: 16, + onPressed: () => _onSwapPressed(), ), + + if (showMore) const SizedBox(width: 16), if (showMore) SecondaryButton( label: "More", @@ -472,9 +445,10 @@ class _DesktopWalletFeaturesState extends ConsumerState { Assets.svg.bars, height: 20, width: 20, - color: Theme.of(context) - .extension()! - .buttonTextSecondary, + color: + Theme.of( + context, + ).extension()!.buttonTextSecondary, ), onPressed: () => _onMorePressed(), ), diff --git a/lib/pages_desktop_specific/my_stack_view/wallet_view/sub_widgets/desktop_wallet_summary.dart b/lib/pages_desktop_specific/my_stack_view/wallet_view/sub_widgets/desktop_wallet_summary.dart index 6620e8626..fdc0f99b7 100644 --- a/lib/pages_desktop_specific/my_stack_view/wallet_view/sub_widgets/desktop_wallet_summary.dart +++ b/lib/pages_desktop_specific/my_stack_view/wallet_view/sub_widgets/desktop_wallet_summary.dart @@ -66,35 +66,40 @@ class _WDesktopWalletSummaryState extends ConsumerState { debugPrint("BUILD: $runtimeType"); final externalCalls = ref.watch( - prefsChangeNotifierProvider.select( - (value) => value.externalCalls, - ), + prefsChangeNotifierProvider.select((value) => value.externalCalls), ); final locale = ref.watch( localeServiceChangeNotifierProvider.select((value) => value.locale), ); - final baseCurrency = ref - .watch(prefsChangeNotifierProvider.select((value) => value.currency)); + final baseCurrency = ref.watch( + prefsChangeNotifierProvider.select((value) => value.currency), + ); - final tokenContract = widget.isToken - ? ref.watch(pCurrentTokenWallet.select((value) => value!.tokenContract)) - : null; + final tokenContract = + widget.isToken + ? ref.watch( + pCurrentTokenWallet.select((value) => value!.tokenContract), + ) + : null; - final priceTuple = widget.isToken - ? ref.watch( - priceAnd24hChangeNotifierProvider - .select((value) => value.getTokenPrice(tokenContract!.address)), - ) - : ref.watch( - priceAnd24hChangeNotifierProvider - .select((value) => value.getPrice(coin)), - ); + final priceTuple = + widget.isToken + ? ref.watch( + priceAnd24hChangeNotifierProvider.select( + (value) => value.getTokenPrice(tokenContract!.address), + ), + ) + : ref.watch( + priceAnd24hChangeNotifierProvider.select( + (value) => value.getPrice(coin), + ), + ); final _showAvailable = ref.watch(walletBalanceToggleStateProvider.state).state == - WalletBalanceToggleState.available; + WalletBalanceToggleState.available; final Amount balanceToShow; if (isFiro) { @@ -115,13 +120,15 @@ class _WDesktopWalletSummaryState extends ConsumerState { break; } } else { - final Balance balance = widget.isToken - ? ref.watch( - pTokenBalance( - (walletId: walletId, contractAddress: tokenContract!.address), - ), - ) - : ref.watch(pWalletBalance(walletId)); + final Balance balance = + widget.isToken + ? ref.watch( + pTokenBalance(( + walletId: walletId, + contractAddress: tokenContract!.address, + )), + ) + : ref.watch(pWalletBalance(walletId)); balanceToShow = _showAvailable ? balance.spendable : balance.total; } @@ -145,47 +152,40 @@ class _WDesktopWalletSummaryState extends ConsumerState { ), if (externalCalls) SelectableText( - "${Amount.fromDecimal( - priceTuple.item1 * balanceToShow.decimal, - fractionDigits: 2, - ).fiatString( - locale: locale, - )} $baseCurrency", + "${Amount.fromDecimal(priceTuple.item1 * balanceToShow.decimal, fractionDigits: 2).fiatString(locale: locale)} $baseCurrency", style: STextStyles.desktopTextExtraSmall(context).copyWith( - color: Theme.of(context) - .extension()! - .textSubtitle1, + color: + Theme.of( + context, + ).extension()!.textSubtitle1, ), ), - if (coin is Firo) - Row( - children: [ - DesktopPrivateBalanceToggleButton( - walletId: walletId, - ), - const SizedBox( - width: 8, - ), - const DesktopBalanceToggleButton(), - ], - ), + // if (coin is Firo) + // Row( + // children: [ + // DesktopPrivateBalanceToggleButton( + // walletId: walletId, + // ), + // const SizedBox( + // width: 8, + // ), + // const DesktopBalanceToggleButton(), + // ], + // ), ], ), - const SizedBox( - width: 8, - ), + const SizedBox(width: 8), WalletRefreshButton( walletId: walletId, initialSyncStatus: widget.initialSyncStatus, - tokenContractAddress: widget.isToken - ? ref.watch(pCurrentTokenWallet)!.tokenContract.address - : null, + tokenContractAddress: + widget.isToken + ? ref.watch(pCurrentTokenWallet)!.tokenContract.address + : null, ), - if (coin is! Firo) - const SizedBox( - width: 8, - ), - if (coin is! Firo) const DesktopBalanceToggleButton(), + + const SizedBox(width: 8), + const DesktopBalanceToggleButton(), ], ); }, diff --git a/lib/pages_desktop_specific/my_stack_view/wallet_view/sub_widgets/firo_desktop_wallet_summary.dart b/lib/pages_desktop_specific/my_stack_view/wallet_view/sub_widgets/firo_desktop_wallet_summary.dart new file mode 100644 index 000000000..73f384f82 --- /dev/null +++ b/lib/pages_desktop_specific/my_stack_view/wallet_view/sub_widgets/firo_desktop_wallet_summary.dart @@ -0,0 +1,245 @@ +/* + * This file is part of Stack Wallet. + * + * Copyright (c) 2023 Cypher Stack + * All Rights Reserved. + * The code is distributed under GPLv3 license, see LICENSE file for details. + * Generated by Cypher Stack on 2023-05-26 + * + */ + +import 'package:decimal/decimal.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:flutter_svg/flutter_svg.dart'; + +import '../../../../pages/wallet_view/sub_widgets/wallet_refresh_button.dart'; +import '../../../../providers/providers.dart'; +import '../../../../providers/wallet/public_private_balance_state_provider.dart'; +import '../../../../providers/wallet/wallet_balance_toggle_state_provider.dart'; +import '../../../../services/event_bus/events/global/wallet_sync_status_changed_event.dart'; +import '../../../../themes/stack_colors.dart'; +import '../../../../utilities/amount/amount.dart'; +import '../../../../utilities/amount/amount_formatter.dart'; +import '../../../../utilities/assets.dart'; +import '../../../../utilities/enums/wallet_balance_toggle_state.dart'; +import '../../../../utilities/extensions/extensions.dart'; +import '../../../../utilities/text_styles.dart'; +import '../../../../wallets/crypto_currency/coins/firo.dart'; +import '../../../../wallets/isar/providers/wallet_info_provider.dart'; +import 'desktop_balance_toggle_button.dart'; + +class FiroDesktopWalletSummary extends ConsumerStatefulWidget { + const FiroDesktopWalletSummary({ + super.key, + required this.walletId, + required this.initialSyncStatus, + }); + + final String walletId; + final WalletSyncStatus initialSyncStatus; + + @override + ConsumerState createState() => + _WFiroDesktopWalletSummaryState(); +} + +class _WFiroDesktopWalletSummaryState + extends ConsumerState { + late final String walletId; + + late final Firo coin; + late final bool isFiro; + + @override + void initState() { + super.initState(); + walletId = widget.walletId; + coin = ref.read(pWalletCoin(widget.walletId)) as Firo; + } + + @override + Widget build(BuildContext context) { + debugPrint("BUILD: $runtimeType"); + + Decimal? price; + if (ref.watch( + prefsChangeNotifierProvider.select((value) => value.externalCalls), + )) { + final priceTuple = ref.watch( + priceAnd24hChangeNotifierProvider.select( + (value) => value.getPrice(coin), + ), + ); + price = priceTuple.item1; + } + + final _showAvailable = + ref.watch(walletBalanceToggleStateProvider.state).state == + WalletBalanceToggleState.available; + + final balance0 = ref.watch(pWalletBalanceTertiary(walletId)); + final balanceToShowSpark = + _showAvailable ? balance0.spendable : balance0.total; + + final balance1 = ref.watch(pWalletBalanceSecondary(walletId)); + final balanceToShowLelantus = + _showAvailable ? balance1.spendable : balance1.total; + + final balance2 = ref.watch(pWalletBalance(walletId)); + final balanceToShowPublic = + _showAvailable ? balance2.spendable : balance2.total; + + return Consumer( + builder: (context, ref, __) { + return Row( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Table( + columnWidths: { + 0: const IntrinsicColumnWidth(), + 1: const IntrinsicColumnWidth(), + if (price != null) 2: const IntrinsicColumnWidth(), + }, + children: [ + TableRow( + children: [ + const _Prefix(type: FiroType.spark), + _Balance(coin: coin, amount: balanceToShowSpark), + if (price != null) + _Price( + coin: coin, + amount: balanceToShowSpark, + price: price, + ), + ], + ), + if (balanceToShowLelantus.raw > BigInt.zero) + TableRow( + children: [ + const _Prefix(type: FiroType.lelantus), + _Balance(coin: coin, amount: balanceToShowLelantus), + if (price != null) + _Price( + coin: coin, + amount: balanceToShowLelantus, + price: price, + ), + ], + ), + TableRow( + children: [ + const _Prefix(type: FiroType.public), + _Balance(coin: coin, amount: balanceToShowPublic), + if (price != null) + _Price( + coin: coin, + amount: balanceToShowPublic, + price: price, + ), + ], + ), + ], + ), + + const SizedBox(width: 8), + WalletRefreshButton( + walletId: walletId, + initialSyncStatus: widget.initialSyncStatus, + ), + const SizedBox(width: 8), + const DesktopBalanceToggleButton(), + ], + ); + }, + ); + } +} + +class _Prefix extends StatelessWidget { + const _Prefix({super.key, required this.type}); + + final FiroType type; + + String get asset { + switch (type) { + case FiroType.public: + return Assets.png.glasses; + case FiroType.lelantus: + return Assets.png.glasses; + case FiroType.spark: + return Assets.svg.spark; + } + } + + @override + Widget build(BuildContext context) { + return Padding( + padding: const EdgeInsets.symmetric(horizontal: 8.0), + child: Row( + crossAxisAlignment: CrossAxisAlignment.end, + children: [ + SizedBox( + width: 20, + height: 20, + child: + asset.endsWith(".png") + ? Image(image: AssetImage(asset)) + : SvgPicture.asset(asset), + ), + const SizedBox(width: 6), + + SelectableText( + type.name.capitalize(), + style: STextStyles.w500_24(context), + ), + ], + ), + ); + } +} + +class _Balance extends ConsumerWidget { + const _Balance({super.key, required this.coin, required this.amount}); + + final Firo coin; + final Amount amount; + + @override + Widget build(BuildContext context, WidgetRef ref) { + return SelectableText( + ref.watch(pAmountFormatter(coin)).format(amount, ethContract: null), + style: STextStyles.desktopH3(context), + textAlign: TextAlign.end, + ); + } +} + +class _Price extends ConsumerWidget { + const _Price({ + super.key, + required this.coin, + required this.amount, + required this.price, + }); + + final Firo coin; + final Amount amount; + final Decimal price; + + @override + Widget build(BuildContext context, WidgetRef ref) { + return Padding( + padding: const EdgeInsets.only(left: 16), + child: SelectableText( + "${Amount.fromDecimal(price * amount.decimal, fractionDigits: 2).fiatString(locale: ref.watch(localeServiceChangeNotifierProvider.select((value) => value.locale)))} " + "${ref.watch(prefsChangeNotifierProvider.select((value) => value.currency))}", + style: STextStyles.desktopTextExtraSmall(context).copyWith( + color: Theme.of(context).extension()!.textSubtitle1, + ), + + textAlign: TextAlign.end, + ), + ); + } +} diff --git a/lib/pages_desktop_specific/my_stack_view/wallet_view/sub_widgets/more_features/more_features_dialog.dart b/lib/pages_desktop_specific/my_stack_view/wallet_view/sub_widgets/more_features/more_features_dialog.dart index ef452c09b..1ee0447b3 100644 --- a/lib/pages_desktop_specific/my_stack_view/wallet_view/sub_widgets/more_features/more_features_dialog.dart +++ b/lib/pages_desktop_specific/my_stack_view/wallet_view/sub_widgets/more_features/more_features_dialog.dart @@ -22,7 +22,9 @@ import '../../../../../providers/db/main_db_provider.dart'; import '../../../../../providers/global/prefs_provider.dart'; import '../../../../../providers/global/wallets_provider.dart'; import '../../../../../themes/stack_colors.dart'; +import '../../../../../themes/theme_providers.dart'; import '../../../../../utilities/assets.dart'; +import '../../../../../utilities/constants.dart'; import '../../../../../utilities/logger.dart'; import '../../../../../utilities/show_loading.dart'; import '../../../../../utilities/text_styles.dart'; @@ -54,10 +56,11 @@ class MoreFeaturesDialog extends ConsumerStatefulWidget { super.key, required this.walletId, required this.onPaynymPressed, + required this.onBuyPressed, required this.onCoinControlPressed, required this.onLelantusCoinsPressed, required this.onSparkCoinsPressedPressed, - required this.onAnonymizeAllPressed, + // required this.onAnonymizeAllPressed, required this.onWhirlpoolPressed, required this.onOrdinalsPressed, required this.onMonkeyPressed, @@ -68,10 +71,11 @@ class MoreFeaturesDialog extends ConsumerStatefulWidget { final String walletId; final VoidCallback? onPaynymPressed; + final VoidCallback? onBuyPressed; final VoidCallback? onCoinControlPressed; final VoidCallback? onLelantusCoinsPressed; final VoidCallback? onSparkCoinsPressedPressed; - final VoidCallback? onAnonymizeAllPressed; + // final VoidCallback? onAnonymizeAllPressed; final VoidCallback? onWhirlpoolPressed; final VoidCallback? onOrdinalsPressed; final VoidCallback? onMonkeyPressed; @@ -92,12 +96,12 @@ class _MoreFeaturesDialogState extends ConsumerState { try { // Toggle enableLelantusScanning in wallet info. - await ref.read(pWalletInfo(widget.walletId)).updateOtherData( - newEntries: { - WalletInfoKeys.enableLelantusScanning: newValue, - }, - isar: ref.read(mainDBProvider).isar, - ); + await ref + .read(pWalletInfo(widget.walletId)) + .updateOtherData( + newEntries: {WalletInfoKeys.enableLelantusScanning: newValue}, + isar: ref.read(mainDBProvider).isar, + ); if (newValue) { await _doRescanMaybe(); @@ -117,12 +121,12 @@ class _MoreFeaturesDialogState extends ConsumerState { try { // Toggle enableOptInRbf in wallet info. - await ref.read(pWalletInfo(widget.walletId)).updateOtherData( - newEntries: { - WalletInfoKeys.enableOptInRbf: newValue, - }, - isar: ref.read(mainDBProvider).isar, - ); + await ref + .read(pWalletInfo(widget.walletId)) + .updateOtherData( + newEntries: {WalletInfoKeys.enableOptInRbf: newValue}, + isar: ref.read(mainDBProvider).isar, + ); } finally { // ensure _switchRbfToggledLock is set to false no matter what _switchRbfToggledLock = false; @@ -138,17 +142,13 @@ class _MoreFeaturesDialogState extends ConsumerState { child: Column( children: [ const DesktopDialogCloseButton(), - const SizedBox( - height: 5, - ), + const SizedBox(height: 5), Text( "Rescan may be required", style: STextStyles.desktopH2(context), textAlign: TextAlign.left, ), - const SizedBox( - height: 16, - ), + const SizedBox(height: 16), const Spacer(), Text( "A blockchain rescan may be required to fully recover all lelantus history." @@ -160,11 +160,7 @@ class _MoreFeaturesDialogState extends ConsumerState { ), const Spacer(), Padding( - padding: const EdgeInsets.only( - left: 32, - right: 32, - bottom: 32, - ), + padding: const EdgeInsets.only(left: 32, right: 32, bottom: 32), child: Row( children: [ Expanded( @@ -175,9 +171,7 @@ class _MoreFeaturesDialogState extends ConsumerState { }, ), ), - const SizedBox( - width: 16, - ), + const SizedBox(width: 16), Expanded( child: PrimaryButton( label: "Later", @@ -200,9 +194,10 @@ class _MoreFeaturesDialogState extends ConsumerState { Exception? e; if (mounted) { await showLoading( - whileFuture: ref.read(pWallets).getWallet(widget.walletId).recover( - isRescan: true, - ), + whileFuture: ref + .read(pWallets) + .getWallet(widget.walletId) + .recover(isRescan: true), context: context, message: "Rescanning blockchain", subMessage: @@ -223,22 +218,26 @@ class _MoreFeaturesDialogState extends ConsumerState { context: context, useSafeArea: false, barrierDismissible: true, - builder: (context) => StackDialog( - title: "Rescan failed", - message: e.toString(), - rightButton: TextButton( - style: Theme.of(context) - .extension()! - .getSecondaryEnabledButtonStyle(context), - child: Text( - "Ok", - style: STextStyles.itemSubtitle12(context), + builder: + (context) => StackDialog( + title: "Rescan failed", + message: e.toString(), + rightButton: TextButton( + style: Theme.of(context) + .extension()! + .getSecondaryEnabledButtonStyle(context), + child: Text( + "Ok", + style: STextStyles.itemSubtitle12(context), + ), + onPressed: () { + Navigator.of( + context, + rootNavigator: Util.isDesktop, + ).pop(); + }, + ), ), - onPressed: () { - Navigator.of(context, rootNavigator: Util.isDesktop).pop(); - }, - ), - ), ); } } finally { @@ -293,9 +292,7 @@ class _MoreFeaturesDialogState extends ConsumerState { "Reusing addresses reduces your privacy and security. Are you sure you want to reuse addresses by default?", style: STextStyles.desktopTextSmall(context), ), - const SizedBox( - height: 43, - ), + const SizedBox(height: 43), Row( children: [ Expanded( @@ -307,9 +304,7 @@ class _MoreFeaturesDialogState extends ConsumerState { label: "Cancel", ), ), - const SizedBox( - width: 16, - ), + const SizedBox(width: 16), Expanded( child: PrimaryButton( buttonHeight: ButtonHeight.l, @@ -343,12 +338,12 @@ class _MoreFeaturesDialogState extends ConsumerState { } Future _updateAddressReuse(bool shouldReuse) async { - await ref.read(pWalletInfo(widget.walletId)).updateOtherData( - newEntries: { - WalletInfoKeys.reuseAddress: shouldReuse, - }, - isar: ref.read(mainDBProvider).isar, - ); + await ref + .read(pWalletInfo(widget.walletId)) + .updateOtherData( + newEntries: {WalletInfoKeys.reuseAddress: shouldReuse}, + isar: ref.read(mainDBProvider).isar, + ); if (_switchController.isOn != null) { if (_switchController.isOn!.call() != shouldReuse) { @@ -366,19 +361,16 @@ class _MoreFeaturesDialogState extends ConsumerState { @override Widget build(BuildContext context) { final wallet = ref.watch( - pWallets.select( - (value) => value.getWallet(widget.walletId), - ), + pWallets.select((value) => value.getWallet(widget.walletId)), ); final coinControlPrefEnabled = ref.watch( - prefsChangeNotifierProvider.select( - (value) => value.enableCoinControl, - ), + prefsChangeNotifierProvider.select((value) => value.enableCoinControl), ); final isViewOnly = wallet is ViewOnlyOptionInterface && wallet.isViewOnly; - final isViewOnlyNoAddressGen = wallet is ViewOnlyOptionInterface && + final isViewOnlyNoAddressGen = + wallet is ViewOnlyOptionInterface && wallet.isViewOnly && wallet.viewOnlyType == ViewOnlyWalletType.addressOnly; @@ -391,9 +383,7 @@ class _MoreFeaturesDialogState extends ConsumerState { mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ Padding( - padding: const EdgeInsets.only( - left: 32, - ), + padding: const EdgeInsets.only(left: 32), child: Text( "More features", style: STextStyles.desktopH3(context), @@ -402,13 +392,25 @@ class _MoreFeaturesDialogState extends ConsumerState { const DesktopDialogCloseButton(), ], ), - if (!isViewOnly && wallet.info.coin is Firo) + if (Constants.enableExchange && + AppConfig.hasFeature(AppFeature.buy) && + ref.watch(prefsChangeNotifierProvider).enableExchange) _MoreFeaturesItem( - label: "Anonymize funds", - detail: "Anonymize funds", - iconAsset: Assets.svg.recycle, - onPressed: () async => widget.onAnonymizeAllPressed?.call(), + label: "Buy", + detail: "Buy cryptocurrency", + isSvgFile: true, + iconAsset: ref.watch( + themeProvider.select((value) => value.assets.buy), + ), + onPressed: () async => widget.onBuyPressed?.call(), ), + // if (!isViewOnly && wallet.info.coin is Firo) + // _MoreFeaturesItem( + // label: "Anonymize funds", + // detail: "Anonymize funds", + // iconAsset: Assets.svg.recycle, + // onPressed: () async => widget.onAnonymizeAllPressed?.call(), + // ), // TODO: [prio=med] // if (manager.hasWhirlpoolSupport) // _MoreFeaturesItem( @@ -425,8 +427,11 @@ class _MoreFeaturesDialogState extends ConsumerState { onPressed: () async => widget.onCoinControlPressed?.call(), ), if (wallet is FiroWallet && - ref.watch(prefsChangeNotifierProvider - .select((s) => s.advancedFiroFeatures))) + ref.watch( + prefsChangeNotifierProvider.select( + (s) => s.advancedFiroFeatures, + ), + )) _MoreFeaturesItem( label: "Lelantus Coins", detail: "View wallet lelantus coins", @@ -434,8 +439,11 @@ class _MoreFeaturesDialogState extends ConsumerState { onPressed: () async => widget.onLelantusCoinsPressed?.call(), ), if (wallet is FiroWallet && - ref.watch(prefsChangeNotifierProvider - .select((s) => s.advancedFiroFeatures))) + ref.watch( + prefsChangeNotifierProvider.select( + (s) => s.advancedFiroFeatures, + ), + )) _MoreFeaturesItem( label: "Spark Coins", detail: "View wallet spark coins", @@ -497,17 +505,18 @@ class _MoreFeaturesDialogState extends ConsumerState { height: 20, width: 40, child: DraggableSwitchButton( - isOn: ref.watch( - pWalletInfo(widget.walletId) - .select((value) => value.otherData), - )[WalletInfoKeys.enableLelantusScanning] as bool? ?? + isOn: + ref.watch( + pWalletInfo( + widget.walletId, + ).select((value) => value.otherData), + )[WalletInfoKeys.enableLelantusScanning] + as bool? ?? false, onValueChanged: _switchToggled, ), ), - const SizedBox( - width: 16, - ), + const SizedBox(width: 16), Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ @@ -529,17 +538,18 @@ class _MoreFeaturesDialogState extends ConsumerState { height: 20, width: 40, child: DraggableSwitchButton( - isOn: ref.watch( - pWalletInfo(widget.walletId) - .select((value) => value.otherData), - )[WalletInfoKeys.enableOptInRbf] as bool? ?? + isOn: + ref.watch( + pWalletInfo( + widget.walletId, + ).select((value) => value.otherData), + )[WalletInfoKeys.enableOptInRbf] + as bool? ?? false, onValueChanged: _switchRbfToggled, ), ), - const SizedBox( - width: 16, - ), + const SizedBox(width: 16), Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ @@ -564,18 +574,19 @@ class _MoreFeaturesDialogState extends ConsumerState { width: 40, child: IgnorePointer( child: DraggableSwitchButton( - isOn: ref.watch( - pWalletInfo(widget.walletId) - .select((value) => value.otherData), - )[WalletInfoKeys.reuseAddress] as bool? ?? + isOn: + ref.watch( + pWalletInfo( + widget.walletId, + ).select((value) => value.otherData), + )[WalletInfoKeys.reuseAddress] + as bool? ?? false, controller: _switchController, ), ), ), - const SizedBox( - width: 16, - ), + const SizedBox(width: 16), Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ @@ -588,9 +599,7 @@ class _MoreFeaturesDialogState extends ConsumerState { ], ), ), - const SizedBox( - height: 28, - ), + const SizedBox(height: 28), ], ), ); @@ -603,6 +612,7 @@ class _MoreFeaturesItem extends StatefulWidget { required this.label, required this.detail, required this.iconAsset, + this.isSvgFile = false, this.onPressed, }); @@ -612,6 +622,7 @@ class _MoreFeaturesItem extends StatefulWidget { final String label; final String detail; final String iconAsset; + final bool isSvgFile; final Future Function()? onPressed; @override @@ -644,26 +655,33 @@ class _MoreFeaturesItemState extends State<_MoreFeaturesItem> { height: _MoreFeaturesItem.iconSizeBG, radiusMultiplier: _MoreFeaturesItem.iconSizeBG, child: Center( - child: SvgPicture.asset( - widget.iconAsset, - width: _MoreFeaturesItem.iconSize, - height: _MoreFeaturesItem.iconSize, - color: Theme.of(context) - .extension()! - .settingsIconIcon, - ), + child: + widget.isSvgFile + ? SvgPicture.file( + File(widget.iconAsset), + width: _MoreFeaturesItem.iconSize, + height: _MoreFeaturesItem.iconSize, + color: + Theme.of( + context, + ).extension()!.settingsIconIcon, + ) + : SvgPicture.asset( + widget.iconAsset, + width: _MoreFeaturesItem.iconSize, + height: _MoreFeaturesItem.iconSize, + color: + Theme.of( + context, + ).extension()!.settingsIconIcon, + ), ), ), - const SizedBox( - width: 16, - ), + const SizedBox(width: 16), Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - Text( - widget.label, - style: STextStyles.w600_20(context), - ), + Text(widget.label, style: STextStyles.w600_20(context)), Text( widget.detail, style: STextStyles.desktopTextExtraExtraSmall(context), @@ -677,11 +695,7 @@ class _MoreFeaturesItemState extends State<_MoreFeaturesItem> { } class _MoreFeaturesItemBase extends StatelessWidget { - const _MoreFeaturesItemBase({ - super.key, - required this.child, - this.onPressed, - }); + const _MoreFeaturesItemBase({super.key, required this.child, this.onPressed}); final Widget child; final VoidCallback? onPressed; @@ -689,10 +703,7 @@ class _MoreFeaturesItemBase extends StatelessWidget { @override Widget build(BuildContext context) { return Padding( - padding: const EdgeInsets.symmetric( - vertical: 6, - horizontal: 32, - ), + padding: const EdgeInsets.symmetric(vertical: 6, horizontal: 32), child: RoundedContainer( color: Colors.transparent, borderColor: @@ -755,22 +766,18 @@ class _MoreFeaturesClearSparkCacheItemState Assets.svg.x, width: _MoreFeaturesItem.iconSize, height: _MoreFeaturesItem.iconSize, - color: Theme.of(context) - .extension()! - .settingsIconIcon, + color: + Theme.of( + context, + ).extension()!.settingsIconIcon, ), ), ), - const SizedBox( - width: 16, - ), + const SizedBox(width: 16), Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - Text( - label, - style: STextStyles.w600_20(context), - ), + Text(label, style: STextStyles.w600_20(context)), FutureBuilder( future: FiroCacheCoordinator.getSparkCacheSize( widget.cryptoCurrency.network, diff --git a/pubspec.lock b/pubspec.lock index 21f8eb65a..27df84ae0 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -2327,5 +2327,5 @@ packages: source: hosted version: "0.2.3" sdks: - dart: ">=3.7.0-0 <4.0.0" - flutter: ">=3.27.3" + dart: ">=3.7.0 <4.0.0" + flutter: ">=3.29.0" From 48d2ac5e9bd7eee8a2974a66db85363c92ebb7fd Mon Sep 17 00:00:00 2001 From: julian Date: Wed, 26 Feb 2025 16:13:08 -0600 Subject: [PATCH 102/193] firo desktop wallet header refactor --- .../wallet_view/desktop_wallet_view.dart | 122 ++++++++++++------ 1 file changed, 83 insertions(+), 39 deletions(-) diff --git a/lib/pages_desktop_specific/my_stack_view/wallet_view/desktop_wallet_view.dart b/lib/pages_desktop_specific/my_stack_view/wallet_view/desktop_wallet_view.dart index 9d19d3b81..2cf41f06a 100644 --- a/lib/pages_desktop_specific/my_stack_view/wallet_view/desktop_wallet_view.dart +++ b/lib/pages_desktop_specific/my_stack_view/wallet_view/desktop_wallet_view.dart @@ -45,6 +45,7 @@ import '../../../utilities/wallet_tools.dart'; import '../../../wallets/isar/providers/wallet_info_provider.dart'; import '../../../wallets/wallet/impl/banano_wallet.dart'; import '../../../wallets/wallet/impl/firo_wallet.dart'; +import '../../../wallets/wallet/wallet.dart'; import '../../../wallets/wallet/wallet_mixin_interfaces/view_only_option_interface.dart'; import '../../../widgets/custom_buttons/app_bar_icon_button.dart'; import '../../../widgets/custom_buttons/blue_text_button.dart'; @@ -315,45 +316,7 @@ class _DesktopWalletViewState extends ConsumerState { padding: const EdgeInsets.all(24), child: Column( children: [ - RoundedWhiteContainer( - padding: const EdgeInsets.all(20), - child: Row( - children: [ - if (monke != null) - SvgPicture.memory( - Uint8List.fromList(monke), - width: 60, - height: 60, - ), - if (monke == null) - SvgPicture.file( - File(ref.watch(coinIconProvider(wallet.info.coin))), - width: 40, - height: 40, - ), - const SizedBox(width: 10), - if (wallet is FiroWallet) - FiroDesktopWalletSummary( - walletId: widget.walletId, - initialSyncStatus: - wallet.refreshMutex.isLocked - ? WalletSyncStatus.syncing - : WalletSyncStatus.synced, - ), - - if (wallet is! FiroWallet) - DesktopWalletSummary( - walletId: widget.walletId, - initialSyncStatus: - wallet.refreshMutex.isLocked - ? WalletSyncStatus.syncing - : WalletSyncStatus.synced, - ), - const Spacer(), - DesktopWalletFeatures(walletId: widget.walletId), - ], - ), - ), + DesktopWalletHeaderRow(wallet, monke), const SizedBox(height: 24), Row( children: [ @@ -449,3 +412,84 @@ class _DesktopWalletViewState extends ConsumerState { ); } } + +class DesktopWalletHeaderRow extends ConsumerWidget { + const DesktopWalletHeaderRow(this.wallet, this.monke, {super.key}); + + final Wallet wallet; + final List? monke; + + @override + Widget build(BuildContext context, WidgetRef ref) { + return RoundedWhiteContainer( + padding: const EdgeInsets.all(20), + child: + wallet is FiroWallet && MediaQuery.of(context).size.width < 1600 + ? Column( + children: [ + Row( + children: [ + SvgPicture.file( + File(ref.watch(coinIconProvider(wallet.info.coin))), + width: 40, + height: 40, + ), + const SizedBox(width: 10), + FiroDesktopWalletSummary( + walletId: wallet.walletId, + initialSyncStatus: + wallet.refreshMutex.isLocked + ? WalletSyncStatus.syncing + : WalletSyncStatus.synced, + ), + + const Spacer(), + ], + ), + const SizedBox(height: 10), + Row( + children: [ + DesktopWalletFeatures(walletId: wallet.walletId), + ], + ), + ], + ) + : Row( + children: [ + if (monke != null) + SvgPicture.memory( + Uint8List.fromList(monke!), + width: 60, + height: 60, + ), + if (monke == null) + SvgPicture.file( + File(ref.watch(coinIconProvider(wallet.info.coin))), + width: 40, + height: 40, + ), + const SizedBox(width: 10), + if (wallet is FiroWallet) + FiroDesktopWalletSummary( + walletId: wallet.walletId, + initialSyncStatus: + wallet.refreshMutex.isLocked + ? WalletSyncStatus.syncing + : WalletSyncStatus.synced, + ), + + if (wallet is! FiroWallet) + DesktopWalletSummary( + walletId: wallet.walletId, + initialSyncStatus: + wallet.refreshMutex.isLocked + ? WalletSyncStatus.syncing + : WalletSyncStatus.synced, + ), + const Spacer(), + DesktopWalletFeatures(walletId: wallet.walletId), + ], + ), + ); + } +} From 60d47f235dbcfb4bd1bf104cd6979a1298937500 Mon Sep 17 00:00:00 2001 From: julian Date: Wed, 26 Feb 2025 16:27:19 -0600 Subject: [PATCH 103/193] update sparkmobile lib --- pubspec.lock | 4 ++-- scripts/app_config/templates/pubspec.template | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/pubspec.lock b/pubspec.lock index 27df84ae0..b611f6f20 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -824,8 +824,8 @@ packages: dependency: "direct main" description: path: "." - ref: dd1e2a31bab034c97f8ea5745d1aa0b70c245490 - resolved-ref: dd1e2a31bab034c97f8ea5745d1aa0b70c245490 + ref: a5b90f613a7d0e77ec1089a7d95552cae4a58be6 + resolved-ref: a5b90f613a7d0e77ec1089a7d95552cae4a58be6 url: "https://github.com/cypherstack/flutter_libsparkmobile.git" source: git version: "0.0.2" diff --git a/scripts/app_config/templates/pubspec.template b/scripts/app_config/templates/pubspec.template index fe59c1674..c52440856 100644 --- a/scripts/app_config/templates/pubspec.template +++ b/scripts/app_config/templates/pubspec.template @@ -33,7 +33,7 @@ dependencies: flutter_libsparkmobile: git: url: https://github.com/cypherstack/flutter_libsparkmobile.git - ref: dd1e2a31bab034c97f8ea5745d1aa0b70c245490 + ref: a5b90f613a7d0e77ec1089a7d95552cae4a58be6 # cs_monero compat (unpublished) compat: From bf5bfc3d71b36e4c6bd163a371f87743eb049b6a Mon Sep 17 00:00:00 2001 From: dethe <76167420+detherminal@users.noreply.github.com> Date: Wed, 12 Mar 2025 23:51:29 +0300 Subject: [PATCH 104/193] fix: use trocador provider icons --- .../exchange/response_objects/estimate.dart | 2 + .../sub_widgets/exchange_provider_option.dart | 38 ++++++++++++++++++- .../response_objects/trocador_quote.dart | 3 ++ .../exchange/trocador/trocador_exchange.dart | 2 + 4 files changed, 44 insertions(+), 1 deletion(-) diff --git a/lib/models/exchange/response_objects/estimate.dart b/lib/models/exchange/response_objects/estimate.dart index 233959277..6f4173ade 100644 --- a/lib/models/exchange/response_objects/estimate.dart +++ b/lib/models/exchange/response_objects/estimate.dart @@ -19,6 +19,7 @@ class Estimate { final String? warningMessage; final String? rateId; final String exchangeProvider; + final String? exchangeProviderLogo; final String? kycRating; Estimate({ @@ -28,6 +29,7 @@ class Estimate { this.warningMessage, this.rateId, required this.exchangeProvider, + this.exchangeProviderLogo, this.kycRating, }); diff --git a/lib/pages/exchange_view/sub_widgets/exchange_provider_option.dart b/lib/pages/exchange_view/sub_widgets/exchange_provider_option.dart index ea91dc60f..5b11876e8 100644 --- a/lib/pages/exchange_view/sub_widgets/exchange_provider_option.dart +++ b/lib/pages/exchange_view/sub_widgets/exchange_provider_option.dart @@ -314,7 +314,43 @@ class _ProviderOptionState extends ConsumerState<_ProviderOption> { child: SizedBox( width: isDesktop ? 32 : 24, height: isDesktop ? 32 : 24, - child: SvgPicture.asset( + child: widget.estimate?.exchangeProviderLogo != null && + widget + .estimate! + .exchangeProviderLogo! + .isNotEmpty + ? ClipRRect( + borderRadius: BorderRadius.circular(5), + child: Image.network( + widget.estimate!.exchangeProviderLogo!, + loadingBuilder: ( + context, + child, + loadingProgress, + ) { + if (loadingProgress == null) { + return child; + } else { + return const Center( + child: + CircularProgressIndicator(), + ); + } + }, + errorBuilder: (context, error, stackTrace) { + return SvgPicture.asset( + Assets.exchange.getIconFor( + exchangeName: widget.exchange.name, + ), + width: isDesktop ? 32 : 24, + height: isDesktop ? 32 : 24, + ); + }, + width: isDesktop ? 32 : 24, + height: isDesktop ? 32 : 24, + ), + ) + : SvgPicture.asset( Assets.exchange.getIconFor( exchangeName: widget.exchange.name, ), diff --git a/lib/services/exchange/trocador/response_objects/trocador_quote.dart b/lib/services/exchange/trocador/response_objects/trocador_quote.dart index cb478a25e..74c55a477 100644 --- a/lib/services/exchange/trocador/response_objects/trocador_quote.dart +++ b/lib/services/exchange/trocador/response_objects/trocador_quote.dart @@ -12,6 +12,7 @@ import 'package:decimal/decimal.dart'; class TrocadorQuote { final String provider; + final String? providerLogo; final String kycRating; final int insurance; final bool fixed; @@ -21,6 +22,7 @@ class TrocadorQuote { TrocadorQuote({ required this.provider, + this.providerLogo, required this.kycRating, required this.insurance, required this.fixed, @@ -32,6 +34,7 @@ class TrocadorQuote { factory TrocadorQuote.fromMap(Map map) { return TrocadorQuote( provider: map['provider'] as String, + providerLogo: map['provider_logo'] as String?, kycRating: map['kycrating'] as String, insurance: map['insurance'] as int, // wtf trocador? diff --git a/lib/services/exchange/trocador/trocador_exchange.dart b/lib/services/exchange/trocador/trocador_exchange.dart index 701bca7cb..cf02cc206 100644 --- a/lib/services/exchange/trocador/trocador_exchange.dart +++ b/lib/services/exchange/trocador/trocador_exchange.dart @@ -236,6 +236,7 @@ class TrocadorExchange extends Exchange { fixedRate: quote.fixed, reversed: reversed, exchangeProvider: quote.provider, + exchangeProviderLogo: quote.providerLogo, rateId: response.value!.tradeId, kycRating: quote.kycRating, ), @@ -256,6 +257,7 @@ class TrocadorExchange extends Exchange { fixedRate: quote.fixed, reversed: reversed, exchangeProvider: quote.provider, + exchangeProviderLogo: quote.providerLogo, rateId: response.value!.tradeId, kycRating: quote.kycRating, ), From dbc805ed2183f83ddcedb46bc1deaafdf6ed0306 Mon Sep 17 00:00:00 2001 From: Julian Date: Thu, 13 Mar 2025 14:55:37 -0600 Subject: [PATCH 105/193] update liblelantus submodule --- crypto_plugins/flutter_liblelantus | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/crypto_plugins/flutter_liblelantus b/crypto_plugins/flutter_liblelantus index 5b08645a5..89f05ee42 160000 --- a/crypto_plugins/flutter_liblelantus +++ b/crypto_plugins/flutter_liblelantus @@ -1 +1 @@ -Subproject commit 5b08645a5b5d30955f4bde2a624ff89ef516e452 +Subproject commit 89f05ee42754f80da036ddcf31c7b1e1dc3b4a83 From 709eebc1b708c5779bd684f624d87e57743feefe Mon Sep 17 00:00:00 2001 From: Julian Date: Thu, 13 Mar 2025 16:06:31 -0600 Subject: [PATCH 106/193] update frostdart submodule --- crypto_plugins/frostdart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/crypto_plugins/frostdart b/crypto_plugins/frostdart index 2451deab8..f111cdf18 160000 --- a/crypto_plugins/frostdart +++ b/crypto_plugins/frostdart @@ -1 +1 @@ -Subproject commit 2451deab817b456ad93d5579c0d0687cb681392a +Subproject commit f111cdf183bec1c71c2b20cf265d3879a81f7903 From 2edfe0f3cc4a1940b4314a582124e75636ca4e9e Mon Sep 17 00:00:00 2001 From: Tritonn204 Date: Tue, 28 Jan 2025 02:11:58 -0800 Subject: [PATCH 107/193] xelis boiler plate early setup --- .gitignore | 1 + .gitmodules | 3 +++ crypto_plugins/xelis_flutter | 1 + lib/models/isar/models/blockchain_data/address.dart | 5 ++++- lib/wallets/isar/models/wallet_info.dart | 1 + lib/wallets/isar/models/wallet_info.g.dart | 2 ++ scripts/android/build_all.sh | 1 + scripts/android/build_all_campfire.sh | 1 + scripts/android/build_all_duo.sh | 1 + scripts/ios/build_all.sh | 1 + scripts/ios/build_all_campfire.sh | 1 + scripts/ios/build_all_duo.sh | 1 + scripts/linux/build_all.sh | 1 + scripts/linux/build_all_campfire.sh | 1 + scripts/linux/build_all_duo.sh | 1 + scripts/macos/build_all.sh | 1 + scripts/macos/build_all_campfire.sh | 1 + scripts/macos/build_all_duo.sh | 1 + scripts/windows/build_all.sh | 1 + scripts/windows/build_all_campfire.sh | 1 + scripts/windows/build_all_duo.sh | 1 + scripts/windows/build_secp256k1.bat | 4 ++-- 22 files changed, 29 insertions(+), 3 deletions(-) create mode 160000 crypto_plugins/xelis_flutter diff --git a/.gitignore b/.gitignore index 3d212c730..9b2706bb0 100644 --- a/.gitignore +++ b/.gitignore @@ -65,6 +65,7 @@ libepic_cash_wallet.dll libmobileliblelantus.dll libtor_ffi.dll flutter_libsparkmobile.dll +xelis_flutter.dll secp256k1.dll /libisar.so /lib/app_config.g.dart diff --git a/.gitmodules b/.gitmodules index 2186826df..2f76b7ffa 100644 --- a/.gitmodules +++ b/.gitmodules @@ -7,3 +7,6 @@ [submodule "crypto_plugins/frostdart"] path = crypto_plugins/frostdart url = https://github.com/cypherstack/frostdart +[submodule "crypto_plugins/xelis_flutter"] + path = crypto_plugins/xelis_flutter + url = https://github.com/Tritonn204/xelis_flutter_ffi.git diff --git a/crypto_plugins/xelis_flutter b/crypto_plugins/xelis_flutter new file mode 160000 index 000000000..294bdf87e --- /dev/null +++ b/crypto_plugins/xelis_flutter @@ -0,0 +1 @@ +Subproject commit 294bdf87e5f5350ecc15b2066b77a91c9ef0568d diff --git a/lib/models/isar/models/blockchain_data/address.dart b/lib/models/isar/models/blockchain_data/address.dart index 584636050..0d8d48791 100644 --- a/lib/models/isar/models/blockchain_data/address.dart +++ b/lib/models/isar/models/blockchain_data/address.dart @@ -175,7 +175,8 @@ enum AddressType { frostMS, p2tr, solana, - cardanoShelley; + cardanoShelley + xelis; String get readableName { switch (this) { @@ -213,6 +214,8 @@ enum AddressType { return "P2TR (taproot)"; case AddressType.cardanoShelley: return "Cardano Shelley"; + case AddressType.xelis: + return "Xelis"; } } } diff --git a/lib/wallets/isar/models/wallet_info.dart b/lib/wallets/isar/models/wallet_info.dart index 51aa69a45..779f1dd78 100644 --- a/lib/wallets/isar/models/wallet_info.dart +++ b/lib/wallets/isar/models/wallet_info.dart @@ -517,6 +517,7 @@ abstract class WalletInfoKeys { static const String epiccashData = "epiccashDataKey"; static const String bananoMonkeyImageBytes = "monkeyImageBytesKey"; static const String tezosDerivationPath = "tezosDerivationPathKey"; + static const String xelisDerivationPath = "xelisDerivationPathKey"; static const String lelantusCoinIsarRescanRequired = "lelantusCoinIsarRescanRequired"; static const String enableLelantusScanning = "enableLelantusScanningKey"; diff --git a/lib/wallets/isar/models/wallet_info.g.dart b/lib/wallets/isar/models/wallet_info.g.dart index 6e02fd6d5..39506f199 100644 --- a/lib/wallets/isar/models/wallet_info.g.dart +++ b/lib/wallets/isar/models/wallet_info.g.dart @@ -269,6 +269,7 @@ const _WalletInfomainAddressTypeEnumValueMap = { 'p2tr': 14, 'solana': 15, 'cardanoShelley': 16, + 'xelis': 17, }; const _WalletInfomainAddressTypeValueEnumMap = { 0: AddressType.p2pkh, @@ -288,6 +289,7 @@ const _WalletInfomainAddressTypeValueEnumMap = { 14: AddressType.p2tr, 15: AddressType.solana, 16: AddressType.cardanoShelley, + 15: AddressType.xelis, }; Id _walletInfoGetId(WalletInfo object) { diff --git a/scripts/android/build_all.sh b/scripts/android/build_all.sh index 60aa13c6a..4d09d7aa0 100755 --- a/scripts/android/build_all.sh +++ b/scripts/android/build_all.sh @@ -16,6 +16,7 @@ PLUGINS_DIR=../../crypto_plugins (cd "${PLUGINS_DIR}"/flutter_libepiccash/scripts/android && ./build_all.sh ) set_rust_to_1720 (cd "${PLUGINS_DIR}"/frostdart/scripts/android && ./build_all.sh ) +(cd "${PLUGINS_DIR}"/xelis_flutter/scripts/android && ./build_all.sh ) wait echo "Done building" diff --git a/scripts/android/build_all_campfire.sh b/scripts/android/build_all_campfire.sh index 60aa13c6a..4d09d7aa0 100755 --- a/scripts/android/build_all_campfire.sh +++ b/scripts/android/build_all_campfire.sh @@ -16,6 +16,7 @@ PLUGINS_DIR=../../crypto_plugins (cd "${PLUGINS_DIR}"/flutter_libepiccash/scripts/android && ./build_all.sh ) set_rust_to_1720 (cd "${PLUGINS_DIR}"/frostdart/scripts/android && ./build_all.sh ) +(cd "${PLUGINS_DIR}"/xelis_flutter/scripts/android && ./build_all.sh ) wait echo "Done building" diff --git a/scripts/android/build_all_duo.sh b/scripts/android/build_all_duo.sh index d67e700a8..9c928a084 100755 --- a/scripts/android/build_all_duo.sh +++ b/scripts/android/build_all_duo.sh @@ -18,6 +18,7 @@ PLUGINS_DIR=../../crypto_plugins (cd "${PLUGINS_DIR}"/flutter_libepiccash/scripts/android && ./build_all.sh ) set_rust_to_1720 (cd "${PLUGINS_DIR}"/frostdart/scripts/android && ./build_all.sh ) +(cd "${PLUGINS_DIR}"/xelis_flutter/scripts/android && ./build_all.sh ) wait echo "Done building" diff --git a/scripts/ios/build_all.sh b/scripts/ios/build_all.sh index bcb03e991..abebdfdb8 100755 --- a/scripts/ios/build_all.sh +++ b/scripts/ios/build_all.sh @@ -18,6 +18,7 @@ rustup target add x86_64-apple-ios (cd ../../crypto_plugins/flutter_libepiccash/scripts/ios && ./build_all.sh ) set_rust_to_1720 (cd ../../crypto_plugins/frostdart/scripts/ios && ./build_all.sh ) +(cd ../../crypto_plugins/xelis_flutter/scripts/ios && ./build_all.sh ) wait echo "Done building" diff --git a/scripts/ios/build_all_campfire.sh b/scripts/ios/build_all_campfire.sh index bcb03e991..abebdfdb8 100755 --- a/scripts/ios/build_all_campfire.sh +++ b/scripts/ios/build_all_campfire.sh @@ -18,6 +18,7 @@ rustup target add x86_64-apple-ios (cd ../../crypto_plugins/flutter_libepiccash/scripts/ios && ./build_all.sh ) set_rust_to_1720 (cd ../../crypto_plugins/frostdart/scripts/ios && ./build_all.sh ) +(cd ../../crypto_plugins/xelis_flutter/scripts/ios && ./build_all.sh ) wait echo "Done building" diff --git a/scripts/ios/build_all_duo.sh b/scripts/ios/build_all_duo.sh index 89e6f4641..2dd4d30ee 100755 --- a/scripts/ios/build_all_duo.sh +++ b/scripts/ios/build_all_duo.sh @@ -20,6 +20,7 @@ rustup target add x86_64-apple-ios (cd ../../crypto_plugins/flutter_libepiccash/scripts/ios && ./build_all.sh ) set_rust_to_1720 (cd ../../crypto_plugins/frostdart/scripts/ios && ./build_all.sh ) +(cd ../../crypto_plugins/xelis_flutter/scripts/ios && ./build_all.sh ) wait echo "Done building" diff --git a/scripts/linux/build_all.sh b/scripts/linux/build_all.sh index 423646185..16de64450 100755 --- a/scripts/linux/build_all.sh +++ b/scripts/linux/build_all.sh @@ -16,6 +16,7 @@ mkdir -p build (cd ../../crypto_plugins/flutter_libepiccash/scripts/linux && ./build_all.sh ) set_rust_to_1720 (cd ../../crypto_plugins/frostdart/scripts/linux && ./build_all.sh ) +(cd ../../crypto_plugins/xelis_flutter/scripts/linux && ./build_all.sh ) ./build_secp256k1.sh diff --git a/scripts/linux/build_all_campfire.sh b/scripts/linux/build_all_campfire.sh index 423646185..16de64450 100755 --- a/scripts/linux/build_all_campfire.sh +++ b/scripts/linux/build_all_campfire.sh @@ -16,6 +16,7 @@ mkdir -p build (cd ../../crypto_plugins/flutter_libepiccash/scripts/linux && ./build_all.sh ) set_rust_to_1720 (cd ../../crypto_plugins/frostdart/scripts/linux && ./build_all.sh ) +(cd ../../crypto_plugins/xelis_flutter/scripts/linux && ./build_all.sh ) ./build_secp256k1.sh diff --git a/scripts/linux/build_all_duo.sh b/scripts/linux/build_all_duo.sh index 78067b478..a57cc7f91 100755 --- a/scripts/linux/build_all_duo.sh +++ b/scripts/linux/build_all_duo.sh @@ -18,6 +18,7 @@ mkdir -p build (cd ../../crypto_plugins/flutter_libepiccash/scripts/linux && ./build_all.sh ) set_rust_to_1720 (cd ../../crypto_plugins/frostdart/scripts/linux && ./build_all.sh ) +(cd ../../crypto_plugins/xelis_flutter/scripts/linux && ./build_all.sh ) ./build_secp256k1.sh diff --git a/scripts/macos/build_all.sh b/scripts/macos/build_all.sh index af608846f..02d45501b 100755 --- a/scripts/macos/build_all.sh +++ b/scripts/macos/build_all.sh @@ -10,6 +10,7 @@ set_rust_to_1671 (cd ../../crypto_plugins/flutter_libepiccash/scripts/macos && ./build_all.sh ) set_rust_to_1720 (cd ../../crypto_plugins/frostdart/scripts/macos && ./build_all.sh ) +(cd ../../crypto_plugins/xelis_flutter/scripts/macos && ./build_all.sh ) wait echo "Done building" diff --git a/scripts/macos/build_all_campfire.sh b/scripts/macos/build_all_campfire.sh index af608846f..02d45501b 100755 --- a/scripts/macos/build_all_campfire.sh +++ b/scripts/macos/build_all_campfire.sh @@ -10,6 +10,7 @@ set_rust_to_1671 (cd ../../crypto_plugins/flutter_libepiccash/scripts/macos && ./build_all.sh ) set_rust_to_1720 (cd ../../crypto_plugins/frostdart/scripts/macos && ./build_all.sh ) +(cd ../../crypto_plugins/xelis_flutter/scripts/macos && ./build_all.sh ) wait echo "Done building" diff --git a/scripts/macos/build_all_duo.sh b/scripts/macos/build_all_duo.sh index 8a53e5801..2e309ad12 100755 --- a/scripts/macos/build_all_duo.sh +++ b/scripts/macos/build_all_duo.sh @@ -12,6 +12,7 @@ set_rust_to_1671 (cd ../../crypto_plugins/flutter_libepiccash/scripts/macos && ./build_all.sh ) set_rust_to_1720 (cd ../../crypto_plugins/frostdart/scripts/macos && ./build_all.sh ) +(cd ../../crypto_plugins/xelis_flutter/scripts/macos && ./build_all.sh ) wait echo "Done building" diff --git a/scripts/windows/build_all.sh b/scripts/windows/build_all.sh index 191a46cc0..8b8a3e822 100755 --- a/scripts/windows/build_all.sh +++ b/scripts/windows/build_all.sh @@ -11,6 +11,7 @@ mkdir -p build (cd ../../crypto_plugins/flutter_liblelantus/scripts/windows && ./build_all.sh ) set_rust_to_1720 (cd ../../crypto_plugins/frostdart/scripts/windows && ./build_all.sh ) +(cd ../../crypto_plugins/xelis_flutter/scripts/windows && ./build_all.sh ) ./build_secp256k1_wsl.sh diff --git a/scripts/windows/build_all_campfire.sh b/scripts/windows/build_all_campfire.sh index 191a46cc0..8b8a3e822 100755 --- a/scripts/windows/build_all_campfire.sh +++ b/scripts/windows/build_all_campfire.sh @@ -11,6 +11,7 @@ mkdir -p build (cd ../../crypto_plugins/flutter_liblelantus/scripts/windows && ./build_all.sh ) set_rust_to_1720 (cd ../../crypto_plugins/frostdart/scripts/windows && ./build_all.sh ) +(cd ../../crypto_plugins/xelis_flutter/scripts/windows && ./build_all.sh ) ./build_secp256k1_wsl.sh diff --git a/scripts/windows/build_all_duo.sh b/scripts/windows/build_all_duo.sh index 3e27eff02..fe05ba659 100755 --- a/scripts/windows/build_all_duo.sh +++ b/scripts/windows/build_all_duo.sh @@ -13,6 +13,7 @@ mkdir -p build (cd ../../crypto_plugins/flutter_liblelantus/scripts/windows && ./build_all.sh ) set_rust_to_1720 (cd ../../crypto_plugins/frostdart/scripts/windows && ./build_all.sh ) +(cd ../../crypto_plugins/xelis_flutter/scripts/windows && ./build_all.sh ) ./build_secp256k1_wsl.sh diff --git a/scripts/windows/build_secp256k1.bat b/scripts/windows/build_secp256k1.bat index f5777b974..bae7c9788 100644 --- a/scripts/windows/build_secp256k1.bat +++ b/scripts/windows/build_secp256k1.bat @@ -7,6 +7,6 @@ git reset --hard cmake -G "Visual Studio 17 2022" -A x64 -S . -B build cd build cmake --build . -if not exist "..\..\..\..\build\" mkdir "..\..\..\..\build\" -xcopy bin\Debug\libsecp256k1-2.dll "..\..\..\..\build\secp256k1.dll" /Y +if not exist "..\..\..\..\..\build\" mkdir "..\..\..\..\..\build\" +xcopy bin\Debug\libsecp256k1-2.dll "..\..\..\..\..\build\secp256k1.dll" /Y cd ..\..\..\ From 2061eba2f2aa3b973aea8043fe699410a31baa5f Mon Sep 17 00:00:00 2001 From: Tritonn204 Date: Wed, 29 Jan 2025 00:38:23 -0800 Subject: [PATCH 108/193] xelis CryptoCurrency definition added, bridged wallet wrapper started --- lib/wallets/crypto_currency/coins/xelis.dart | 122 +++++++++++++++++++ lib/wallets/wallet/impl/xelis_wallet.dart | 14 +++ lib/wallets/wallet/wallet.dart | 4 + 3 files changed, 140 insertions(+) create mode 100644 lib/wallets/crypto_currency/coins/xelis.dart create mode 100644 lib/wallets/wallet/impl/xelis_wallet.dart diff --git a/lib/wallets/crypto_currency/coins/xelis.dart b/lib/wallets/crypto_currency/coins/xelis.dart new file mode 100644 index 000000000..24db5815b --- /dev/null +++ b/lib/wallets/crypto_currency/coins/xelis.dart @@ -0,0 +1,122 @@ +import '../../../models/isar/models/blockchain_data/address.dart'; +import '../../../models/node_model.dart'; +import '../../../utilities/default_nodes.dart'; +import '../../../utilities/enums/derive_path_type_enum.dart'; +import '../crypto_currency.dart'; +import '../intermediate/bip39_currency.dart'; + +import 'package:xelis_flutter/lib.dart' as xelis; + +class Xelis extends Bip39Currency { + Xelis(super.network) { + _idMain = "xelis"; + _uriScheme = "xelis"; + switch (network) { + case CryptoCurrencyNetwork.main: + _id = _idMain; + _name = "Xelis"; + _ticker = "XEL"; + default: + throw Exception("Unsupported network: $network"); + } + } + + late final String _id; + @override + String get identifier => _id; + + late final String _idMain; + @override + String get mainNetId => _idMain; + + late final String _name; + @override + String get prettyName => _name; + + late final String _uriScheme; + @override + String get uriScheme => _uriScheme; + + late final String _ticker; + @override + String get ticker => _ticker; + + @override + NodeModel get defaultNode { + switch (network) { + case CryptoCurrencyNetwork.main: + return NodeModel( + host: "https://us-node.xelis.io", + port: 443, + name: DefaultNodes.defaultName, + id: DefaultNodes.buildId(this), + useSSL: true, + enabled: true, + coinName: identifier, + isFailover: true, + isDown: false, + torEnabled: true, + clearnetEnabled: true, + ); + default: + throw Exception("Unsupported network: $network"); + } + } + + @override + int get minConfirms => 20; + + @override + bool get torSupport => true; + + @override + bool validateAddress(String address) { + try { + return xelis.isAddressValid(address); + } catch (_) { + return false; + } + } + + @override + String get genesisHash => throw UnimplementedError(); + + @override + int get defaultSeedPhraseLength => 12; + + @override + int get fractionDigits => 9; + + @override + bool get hasBuySupport => false; + + @override + bool get hasMnemonicPassphraseSupport => false; + + @override + List get possibleMnemonicLengths => [defaultSeedPhraseLength, 24]; + + @override + AddressType get defaultAddressType => defaultDerivePathType.getAddressType(); + + @override + BigInt get satsPerCoin => BigInt.from(1000000000); + + @override + int get targetBlockTimeSeconds => 15; + + @override + DerivePathType get defaultDerivePathType => DerivePathType.xelis; + + @override + Uri defaultBlockExplorer(String txid) { + switch (network) { + case CryptoCurrencyNetwork.main: + return Uri.parse("https://explorer.xelis.io/txs/$txid"); + default: + throw Exception( + "Unsupported network for defaultBlockExplorer(): $network", + ); + } + } +} diff --git a/lib/wallets/wallet/impl/xelis_wallet.dart b/lib/wallets/wallet/impl/xelis_wallet.dart new file mode 100644 index 000000000..c53a266d5 --- /dev/null +++ b/lib/wallets/wallet/impl/xelis_wallet.dart @@ -0,0 +1,14 @@ +// this source file acts as a structural formality +import 'package:xelis_flutter/lib.dart' as xelis; + +class XelisWallet extends Bip39Wallet { + XelisWallet(CryptoCurrencyNetwork network) : super(Xelis(network)); + + final syncMutex = Mutex(); + + final xelis.Network network = cryptoCurrency.network == CryptoCurrencyNetwork.main + ? xelis.Network.Mainnet + : xelis.Network.Testnet; + + xelis.XelisWallet _wallet; +} \ No newline at end of file diff --git a/lib/wallets/wallet/wallet.dart b/lib/wallets/wallet/wallet.dart index 161c68f5f..733c3cf3e 100644 --- a/lib/wallets/wallet/wallet.dart +++ b/lib/wallets/wallet/wallet.dart @@ -47,6 +47,7 @@ import 'impl/stellar_wallet.dart'; import 'impl/sub_wallets/eth_token_wallet.dart'; import 'impl/tezos_wallet.dart'; import 'impl/wownero_wallet.dart'; +import 'impl/xelis_wallet.dart'; import 'intermediate/cryptonote_wallet.dart'; import 'wallet_mixin_interfaces/electrumx_interface.dart'; import 'wallet_mixin_interfaces/lelantus_interface.dart'; @@ -406,6 +407,9 @@ abstract class Wallet { case const (Wownero): return WowneroWallet(net); + case const (Xelis): + return XelisWallet(net); + default: // should never hit in reality throw Exception("Unknown crypto currency: ${walletInfo.coin}"); From 34cee820182da984a5866293d01c2c2788932e4a Mon Sep 17 00:00:00 2001 From: Tritonn204 Date: Wed, 29 Jan 2025 00:38:54 -0800 Subject: [PATCH 109/193] added xelis enum variants --- lib/utilities/enums/derive_path_type_enum.dart | 6 +++++- lib/wallets/crypto_currency/crypto_currency.dart | 1 + 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/lib/utilities/enums/derive_path_type_enum.dart b/lib/utilities/enums/derive_path_type_enum.dart index 3d64fb45a..e50ed2387 100644 --- a/lib/utilities/enums/derive_path_type_enum.dart +++ b/lib/utilities/enums/derive_path_type_enum.dart @@ -19,7 +19,8 @@ enum DerivePathType { eCash44, solana, bip86, - cardanoShelley; + cardanoShelley, + xelis; AddressType getAddressType() { switch (this) { @@ -45,6 +46,9 @@ enum DerivePathType { case DerivePathType.cardanoShelley: return AddressType.cardanoShelley; + + case DerivePathType.xelis: + return AddressType.xelis; } } } diff --git a/lib/wallets/crypto_currency/crypto_currency.dart b/lib/wallets/crypto_currency/crypto_currency.dart index 066675d28..d5553ceca 100644 --- a/lib/wallets/crypto_currency/crypto_currency.dart +++ b/lib/wallets/crypto_currency/crypto_currency.dart @@ -23,6 +23,7 @@ export 'coins/solana.dart'; export 'coins/stellar.dart'; export 'coins/tezos.dart'; export 'coins/wownero.dart'; +export 'coins/xelis.dart'; enum CryptoCurrencyNetwork { main, From 5f9466ca3cbd78447cb3b48462b3c8bfd56191bc Mon Sep 17 00:00:00 2001 From: Tritonn204 Date: Thu, 6 Feb 2025 04:34:50 -0800 Subject: [PATCH 110/193] build script + dep updates, xelis library integration progress --- crypto_plugins/xelis_flutter | 2 +- .../isar/models/blockchain_data/address.dart | 2 +- .../models/blockchain_data/address.g.dart | 2 + lib/wallets/crypto_currency/coins/xelis.dart | 26 +- .../intermediate/electrum_currency.dart | 5 + lib/wallets/isar/models/wallet_info.g.dart | 2 +- lib/wallets/wallet/impl/xelis_wallet.dart | 542 +++++++++++++++++- linux/flutter/generated_plugin_registrant.cc | 4 + linux/flutter/generated_plugins.cmake | 1 + macos/Flutter/GeneratedPluginRegistrant.swift | 2 + pubspec.lock | 55 ++ scripts/android/build_all.sh | 3 +- scripts/android/build_all_campfire.sh | 3 +- scripts/android/build_all_duo.sh | 3 +- scripts/app_config/configure_stack_wallet.sh | 2 + scripts/app_config/templates/pubspec.template | 5 + scripts/ios/build_all.sh | 3 +- scripts/ios/build_all_campfire.sh | 3 +- scripts/ios/build_all_duo.sh | 3 +- scripts/linux/build_all.sh | 3 +- scripts/linux/build_all_campfire.sh | 3 +- scripts/linux/build_all_duo.sh | 3 +- scripts/macos/build_all.sh | 3 +- scripts/macos/build_all_campfire.sh | 3 +- scripts/macos/build_all_duo.sh | 3 +- scripts/rust_version.sh | 9 + scripts/windows/build_all.sh | 3 +- scripts/windows/build_all_campfire.sh | 3 +- scripts/windows/build_all_duo.sh | 3 +- .../flutter/generated_plugin_registrant.cc | 3 + windows/flutter/generated_plugins.cmake | 1 + 31 files changed, 680 insertions(+), 28 deletions(-) create mode 100644 lib/wallets/crypto_currency/intermediate/electrum_currency.dart diff --git a/crypto_plugins/xelis_flutter b/crypto_plugins/xelis_flutter index 294bdf87e..e93337c26 160000 --- a/crypto_plugins/xelis_flutter +++ b/crypto_plugins/xelis_flutter @@ -1 +1 @@ -Subproject commit 294bdf87e5f5350ecc15b2066b77a91c9ef0568d +Subproject commit e93337c262580665ffb0d16cfcd8d3614f7e371a diff --git a/lib/models/isar/models/blockchain_data/address.dart b/lib/models/isar/models/blockchain_data/address.dart index 0d8d48791..8947d6c46 100644 --- a/lib/models/isar/models/blockchain_data/address.dart +++ b/lib/models/isar/models/blockchain_data/address.dart @@ -175,7 +175,7 @@ enum AddressType { frostMS, p2tr, solana, - cardanoShelley + cardanoShelley, xelis; String get readableName { diff --git a/lib/models/isar/models/blockchain_data/address.g.dart b/lib/models/isar/models/blockchain_data/address.g.dart index 340ab9f1b..a9289a481 100644 --- a/lib/models/isar/models/blockchain_data/address.g.dart +++ b/lib/models/isar/models/blockchain_data/address.g.dart @@ -279,6 +279,7 @@ const _AddresstypeEnumValueMap = { 'p2tr': 14, 'solana': 15, 'cardanoShelley': 16, + 'xelis': 17, }; const _AddresstypeValueEnumMap = { 0: AddressType.p2pkh, @@ -298,6 +299,7 @@ const _AddresstypeValueEnumMap = { 14: AddressType.p2tr, 15: AddressType.solana, 16: AddressType.cardanoShelley, + 17: AddressType.xelis, }; Id _addressGetId(Address object) { diff --git a/lib/wallets/crypto_currency/coins/xelis.dart b/lib/wallets/crypto_currency/coins/xelis.dart index 24db5815b..84e8439bb 100644 --- a/lib/wallets/crypto_currency/coins/xelis.dart +++ b/lib/wallets/crypto_currency/coins/xelis.dart @@ -5,9 +5,9 @@ import '../../../utilities/enums/derive_path_type_enum.dart'; import '../crypto_currency.dart'; import '../intermediate/bip39_currency.dart'; -import 'package:xelis_flutter/lib.dart' as xelis; +import 'package:xelis_flutter/src/api/utils.dart' as x_utils; -class Xelis extends Bip39Currency { +class Xelis extends CryptoCurrency { Xelis(super.network) { _idMain = "xelis"; _uriScheme = "xelis"; @@ -16,6 +16,10 @@ class Xelis extends Bip39Currency { _id = _idMain; _name = "Xelis"; _ticker = "XEL"; + case CryptoCurrencyNetwork.test: + _id = "xelisTestNet"; + _name = "tXelis"; + _ticker = "XET"; default: throw Exception("Unsupported network: $network"); } @@ -58,6 +62,22 @@ class Xelis extends Bip39Currency { torEnabled: true, clearnetEnabled: true, ); + + case CryptoCurrencyNetwork.test: + return NodeModel( + host: "https://testnet-node.xelis.io", + port: 443, + name: DefaultNodes.defaultName, + id: DefaultNodes.buildId(this), + useSSL: true, + enabled: true, + coinName: identifier, + isFailover: true, + isDown: false, + torEnabled: true, + clearnetEnabled: true, + ); + default: throw Exception("Unsupported network: $network"); } @@ -72,7 +92,7 @@ class Xelis extends Bip39Currency { @override bool validateAddress(String address) { try { - return xelis.isAddressValid(address); + return x_utils.isAddressValid(strAddress: address); } catch (_) { return false; } diff --git a/lib/wallets/crypto_currency/intermediate/electrum_currency.dart b/lib/wallets/crypto_currency/intermediate/electrum_currency.dart new file mode 100644 index 000000000..4d8378f16 --- /dev/null +++ b/lib/wallets/crypto_currency/intermediate/electrum_currency.dart @@ -0,0 +1,5 @@ +import '../crypto_currency.dart'; + +abstract class ElectrumCurrency extends CryptoCurrency { + ElectrumCurrency(super.network); +} \ No newline at end of file diff --git a/lib/wallets/isar/models/wallet_info.g.dart b/lib/wallets/isar/models/wallet_info.g.dart index 39506f199..5e93564c0 100644 --- a/lib/wallets/isar/models/wallet_info.g.dart +++ b/lib/wallets/isar/models/wallet_info.g.dart @@ -289,7 +289,7 @@ const _WalletInfomainAddressTypeValueEnumMap = { 14: AddressType.p2tr, 15: AddressType.solana, 16: AddressType.cardanoShelley, - 15: AddressType.xelis, + 17: AddressType.xelis, }; Id _walletInfoGetId(WalletInfo object) { diff --git a/lib/wallets/wallet/impl/xelis_wallet.dart b/lib/wallets/wallet/impl/xelis_wallet.dart index c53a266d5..c21100625 100644 --- a/lib/wallets/wallet/impl/xelis_wallet.dart +++ b/lib/wallets/wallet/impl/xelis_wallet.dart @@ -1,14 +1,542 @@ -// this source file acts as a structural formality -import 'package:xelis_flutter/lib.dart' as xelis; +import 'dart:async'; +import 'dart:convert'; +import 'dart:io'; + +import 'package:decimal/decimal.dart'; +import 'package:flutter/foundation.dart'; +import 'package:isar/isar.dart'; + +import 'package:xelis_flutter/src/api/network.dart' as x_network; +import 'package:xelis_flutter/src/api/wallet.dart' as x_wallet; +import 'package:xelis_dart_sdk/xelis_dart_sdk.dart' as xelis_sdk; + +import '../../../models/isar/models/blockchain_data/address.dart'; +import '../../../models/isar/models/blockchain_data/transaction.dart'; +import '../../../models/isar/models/blockchain_data/v2/input_v2.dart'; +import '../../../models/isar/models/blockchain_data/v2/output_v2.dart'; +import '../../../models/isar/models/blockchain_data/v2/transaction_v2.dart'; + +import '../../../models/node_model.dart'; +import '../../../models/balance.dart'; +import '../../../utilities/amount/amount.dart'; +import '../../crypto_currency/crypto_currency.dart'; +import '../../models/tx_data.dart'; +import '../wallet.dart'; + +import 'package:isar/isar.dart'; +import 'package:mutex/mutex.dart'; +import 'package:stack_wallet_backup/generate_password.dart'; +import 'package:web_socket_channel/web_socket_channel.dart'; +import '../intermediate/bip39_wallet.dart'; + +extension XelisNetworkConversion on CryptoCurrencyNetwork { + x_network.Network get xelisNetwork { + switch (this) { + case CryptoCurrencyNetwork.main: + return x_network.Network.mainnet; + case CryptoCurrencyNetwork.test: + return x_network.Network.testnet; + default: + throw ArgumentError('Unsupported network type for Xelis: $this'); + } + } +} + +extension CryptoCurrencyNetworkConversion on x_network.Network { + CryptoCurrencyNetwork get cryptoCurrencyNetwork { + switch (this) { + case x_network.Network.mainnet: + return CryptoCurrencyNetwork.main; + case x_network.Network.testnet: + return CryptoCurrencyNetwork.test; + default: + throw ArgumentError('Unsupported Xelis network type: $this'); + } + } +} + +class XelisWallet extends Wallet { + x_wallet.XelisWallet? _wallet; + + x_wallet.XelisWallet? get wallet => _wallet; + set wallet(x_wallet.XelisWallet newWallet) { + _wallet = newWallet; + } + + void _checkInitialized() { + if (_wallet == null) { + throw StateError('XelisWallet not initialized'); + } + } -class XelisWallet extends Bip39Wallet { XelisWallet(CryptoCurrencyNetwork network) : super(Xelis(network)); final syncMutex = Mutex(); + NodeModel? _xelisNode; + Timer? timer; + + // ==================== Overrides ============================================ + + @override + int get isarTransactionVersion => 2; + + @override + Future init({bool? isRestore}) async { + if (isRestore != true) { + x_wallet.PrecomputedTablesShared? encodedTables = + await secureStorageInterface.read(key: "xelis_precomputed_tables"); + + String? encodedWallet = + await secureStorageInterface.read(key: "${walletId}_wallet"); + + // check if should create a new wallet + if (encodedWallet == null) { + final String password = generatePassword(); + + await secureStorageInterface.write( + key: '${walletId}_password', + value: password, + ); + + final String name = walletId; + + final wallet = await x_wallet.createXelisWallet( + name: name, + password: password, + network: cryptoCurrency.network.xelisNetwork, + seed: null, // Xelis lib will autogenerate this + privateKey: null, // Xelis lib will autogenerate this + precomputedTables: encodedTables, + ); + + await secureStorageInterface.write( + key: '${walletId}_wallet', + value: wallet, + ); + + _wallet = wallet; + } else { + try { + + final String name = walletId; + final password = + await secureStorageInterface.read(key: '${walletId}_password'); + + final wallet = await x_wallet.openXelisWallet( + name: name, + password: password, + network: cryptoCurrency.network.xelisNetwork, + precomputedTables: encodedTables, + ); + + await secureStorageInterface.write( + key: '${walletId}_wallet', + value: wallet, + ); + + _wallet = wallet; + } catch (e, s) { + // do nothing, still allow user into wallet + } + } + + // Creation or Opening of Xelis wallets will generate tables if required + // Make sure to store said shared tables if we make it this far, to save + // time in the future + if (encodedTables == null) { + await secureStorageInterface.write( + key: 'xelis_precomputed_tables', + value: x_wallet.getCachedTable(), + ); + } + } + + return await super.init(); + } + + @override + Future pingCheck() async { + _checkInitialized(); + try { + await _wallet!.getDaemonInfo(); + return true; + } catch (_) { + return false; + } + } + + @override + Future updateBalance() async { + try { + final BigInt xelBalance = await _wallet!.getXelisBalanceRaw(); // in the future, use getAssetBalances and handle each + final balance = Balance( + total: Amount( + rawValue: xelBalance, + fractionDigits: cryptoCurrency.fractionDigits, + ), + spendable: Amount( + rawValue: xelBalance, + fractionDigits: cryptoCurrency.fractionDigits, + ), + blockedTotal: Amount.zeroWith( + fractionDigits: cryptoCurrency.fractionDigits, + ), + pendingSpendable: Amount.zeroWith( + fractionDigits: cryptoCurrency.fractionDigits, + ), + ); + await info.updateBalance( + newBalance: balance, + isar: mainDB.isar, + ); + } catch (e, s) { + } + } + + @override + Future updateChainHeight() async { + try { + final infoString = await _wallet!.getDaemonInfo(); + + final Map nodeInfo = json.decode(infoString); + + final int topoheight = nodeInfo['topoheight'] as int; + + await info.updateCachedChainHeight( + newHeight: topoheight, + isar: mainDB.isar, + ); + } catch (e, s) { + print('Error updating chain height: $e'); + print('Stack trace: $s'); + } + } + + @override + Future updateNode() async { + // do nothing + } + + @override + Future> updateTransactions({bool isRescan = false}) async { + _checkInitialized(); + + int firstBlock = 0; + if (!isRescan) { + firstBlock = await mainDB.isar.transactionV2s + .where() + .walletIdEqualTo(walletId) + .heightProperty() + .max() ?? + 0; + + if (firstBlock > 10) { + // add some buffer + firstBlock -= 10; + } + } + + await _wallet!.rescan(topoheight: firstBlock as BigInt); + final txListJson = await _wallet!.allHistory(); + + final List txns = []; + + for (final jsonString in txListJson) { + try { + final transactionEntry = xelis_sdk.TransactionEntry.fromJson(json.decode(jsonString)); + + // Check for duplicates + final storedTx = await mainDB.isar.transactionV2s + .where() + .txidWalletIdEqualTo(transactionEntry.hash, walletId) + .findFirst(); + + if (storedTx != null && + storedTx.height != null && + storedTx.height! > 0) { + continue; // Skip already processed transactions + } + + final List outputs = []; + final List inputs = []; + TransactionType txType; + TransactionSubType txSubType = TransactionSubType.none; + int? nonce; + Amount? fee; + Map otherData = {}; + + final entryData = transactionEntry.txEntryType; + + if (entryData is xelis_sdk.CoinbaseEntry) { + final coinbase = entryData; + txType = TransactionType.incoming; + outputs.add(OutputV2.isarCantDoRequiredInDefaultConstructor( + scriptPubKeyHex: "00", + valueStringSats: coinbase.reward.toString(), + addresses: [thisAddress], + walletOwns: true, + )); + } else if (entryData is xelis_sdk.BurnEntry) { + final burn = entryData; + txType = TransactionType.outgoing; + inputs.add(InputV2.isarCantDoRequiredInDefaultConstructor( + scriptSigAsm: null, + scriptSigHex: null, + sequence: null, + outpoint: null, + valueStringSats: burn.amount.toString(), + addresses: [thisAddress], + witness: null, + innerRedeemScriptAsm: null, + coinbase: null, + walletOwns: true, + )); + otherData['burnAsset'] = burn.asset; + } else if (entryData is xelis_sdk.IncomingEntry) { + final incoming = entryData; + txType = incoming.from == thisAddress + ? TransactionType.sentToSelf + : TransactionType.incoming; + + for (final transfer in incoming.transfers) { + final int decimals = await _wallet!.getAssetDecimals( + asset: transfer.asset + ); + + outputs.add(OutputV2.isarCantDoRequiredInDefaultConstructor( + scriptPubKeyHex: "00", + valueStringSats: transfer.amount.toString(), + addresses: [thisAddress], + walletOwns: true, + )); + otherData['asset_${transfer.asset}'] = transfer.amount.toString(); + if (transfer.extraData != null) { + otherData['extraData_${transfer.asset}'] = transfer.extraData!.toJson(); + } + } + } else if (entryData is xelis_sdk.OutgoingEntry) { + final outgoing = entryData; + txType = TransactionType.outgoing; + nonce = outgoing.nonce; + fee = Amount( + rawValue: BigInt.from(outgoing.fee), + fractionDigits: decimals + ); + + for (final transfer in outgoing.transfers) { + final int decimals = await _wallet!.getAssetDecimals( + asset: transfer.asset + ); + + outputs.add(OutputV2.isarCantDoRequiredInDefaultConstructor( + scriptPubKeyHex: "00", + valueStringSats: transfer.amount.toString(), + addresses: [transfer.destination], + walletOwns: transfer.destination == thisAddress, + )); + otherData['asset_${transfer.asset}'] = transfer.amount.toString(); + if (transfer.extraData != null) { + otherData['extraData_${transfer.asset}'] = transfer.extraData!.toJson(); + } + } + } else { + // Skip unknown entry types + return; + } + + final txn = TransactionV2( + walletId: walletId, + blockHash: "", // Not provided in Xelis data + hash: transactionEntry.hash, + txid: transactionEntry.hash, + timestamp: (transactionEntry.timestamp?.millisecondsSinceEpoch ?? 0) ~/ 1000, + height: transactionEntry?.topoheight, + inputs: List.unmodifiable(inputs), + outputs: List.unmodifiable(outputs), + version: -1, // Version not provided + type: txType, + subType: txSubType, + otherData: jsonEncode({ + ...otherData, + if (nonce != null) 'nonce': nonce, + if (fee != null) 'overrideFee': fee.toJsonString(), + }), + ); + + txns.add(txn); + } catch (e, s) { + } + } + + await mainDB.updateOrPutTransactionV2s(txns); + return txns.map((e) => e.txid).toList(); + } + + @override + Future updateUTXOs() async { + // not used in xel + return false; + } + + @override + Future checkSaveInitialReceivingAddress() async { + // do nothing + } + + @override + FilterOperation? get changeAddressFilterOperation => + throw UnimplementedError("Not used for $runtimeType"); + + @override + FilterOperation? get receivingAddressFilterOperation => + FilterGroup.and(standardReceivingAddressFilters); + + @override + Future prepareSend({required TxData txData}) async { + try { + _checkInitialized(); + + // Validate recipients + if (txData.recipients == null || txData.recipients!.length != 1) { + throw Exception("$runtimeType prepareSend requires 1 recipient"); + } + + final recipient = txData.recipients!.first; + final Amount sendAmount = recipient.amount; + final asset = cryptoCurrency.assetId ?? xelis_sdk.xelisAsset; + + final sendAmountStr = await _wallet!.formatCoin( + atomicAmount: sendAmount.rawValue, + assetHash: asset + ); + + // Check balance using raw method + final xelBalance = await _wallet!.getXelisBalanceRaw(); + final balance = Amount( + rawValue: xelBalance, + fractionDigits: cryptoCurrency.fractionDigits, // needs to become tied to asset + ); + + // Create transfers for fee estimation + final transfers = [ + x_wallet.Transfer( + floatAmount: sendAmountStr as double, + strAddress: recipient.address, + assetHash: asset, + ) + ]; + + // Estimate fees + final estimatedFeeString = await _wallet!.estimateFees(transfers: transfers); + final feeAmount = Amount( + rawValue: BigInt.parse(estimatedFeeString), + fractionDigits: cryptoCurrency.fractionDigits, + ); + + // Apply fee multiplier + final feeMultiplier = txData.feeRateAmount ?? 1.0; + final boostedFee = Amount( + rawValue: (BigInt.from((feeAmount.raw * + BigInt.from((feeMultiplier * 100).toInt())) / + BigInt.from(100))), + fractionDigits: cryptoCurrency.fractionDigits, + ); + + // Check if we have enough for both transfer and fee + if (sendAmount + boostedFee > balance) { + final requiredAmt = await _wallet!.formatCoin( + atomicAmount: (sendAmount + boostedFee).rawValue, + assetHash: asset + ); + + final availableAmt = await _wallet!.formatCoin( + atomicAmount: xelBalance, + assetHash: asset + ); + + throw Exception( + "Insufficient balance to cover transfer and fees. " + "Required: $requiredAmt, Available: $availableAmt" + ); + } + + return txData.copyWith( + fee: boostedFee, + otherData: { + 'asset': asset, + }, + ); + } catch (e, s) { + rethrow; + } + } + + @override + Future confirmSend({required TxData txData}) async { + try { + _checkInitialized(); + + // Validate recipients + if (txData.recipients == null || txData.recipients!.length != 1) { + throw Exception("$runtimeType confirmSend requires 1 recipient"); + } + + final recipient = txData.recipients!.first; + final Amount sendAmount = recipient.amount; + final asset = txData.otherData?['asset'] ?? xelis_sdk.xelisAsset; + + String txHash; + + final amt = await _wallet!.formatCoin( + atomicAmount: recipient.amount as BigInt, + assetHash: asset + ) as double; + + // Create a transfer transaction + final txJson = await _wallet!.createTransfersTransaction( + transfers: [ + x_wallet.Transfer( + floatAmount: amt, + strAddress: recipient.address, + assetHash: asset, + extraData: null, // Add extra data if needed + ) + ] + ); + + final tx = x_wallet.TransactionSummary.fromJson(txJson); + + // Broadcast the transaction + await _wallet!.broadcastTransaction(txHash: tx.hash); + + return await updateSentCachedTxData(txData: txData.copyWith( + txid: tx.hash, + )); + } catch (e, s) { + rethrow; + } + } - final xelis.Network network = cryptoCurrency.network == CryptoCurrencyNetwork.main - ? xelis.Network.Mainnet - : xelis.Network.Testnet; + @override + Future recover({required bool isRescan}) async { + await refreshMutex.protect(() async { + if (isRescan) { + await mainDB.deleteWalletBlockchainData(walletId); + await checkSaveInitialReceivingAddress(); + await updateBalance(); + await updateTransactions(isRescan: true); + } else { + await checkSaveInitialReceivingAddress(); + unawaited(updateBalance()); + unawaited(updateTransactions()); + } + }); + } - xelis.XelisWallet _wallet; + @override + Future exit() async { + timer?.cancel(); + timer = null; + await super.exit(); + } } \ No newline at end of file diff --git a/linux/flutter/generated_plugin_registrant.cc b/linux/flutter/generated_plugin_registrant.cc index 88c196c5e..4a096bcde 100644 --- a/linux/flutter/generated_plugin_registrant.cc +++ b/linux/flutter/generated_plugin_registrant.cc @@ -16,6 +16,7 @@ #include #include #include +#include void fl_register_plugins(FlPluginRegistry* registry) { g_autoptr(FlPluginRegistrar) cs_monero_flutter_libs_linux_registrar = @@ -48,4 +49,7 @@ void fl_register_plugins(FlPluginRegistry* registry) { g_autoptr(FlPluginRegistrar) window_size_registrar = fl_plugin_registry_get_registrar_for_plugin(registry, "WindowSizePlugin"); window_size_plugin_register_with_registrar(window_size_registrar); + g_autoptr(FlPluginRegistrar) xelis_flutter_registrar = + fl_plugin_registry_get_registrar_for_plugin(registry, "XelisFlutterPlugin"); + xelis_flutter_plugin_register_with_registrar(xelis_flutter_registrar); } diff --git a/linux/flutter/generated_plugins.cmake b/linux/flutter/generated_plugins.cmake index 72a81025c..22b92c965 100644 --- a/linux/flutter/generated_plugins.cmake +++ b/linux/flutter/generated_plugins.cmake @@ -13,6 +13,7 @@ list(APPEND FLUTTER_PLUGIN_LIST stack_wallet_backup url_launcher_linux window_size + xelis_flutter ) list(APPEND FLUTTER_FFI_PLUGIN_LIST diff --git a/macos/Flutter/GeneratedPluginRegistrant.swift b/macos/Flutter/GeneratedPluginRegistrant.swift index 245400e1a..73a62daf8 100644 --- a/macos/Flutter/GeneratedPluginRegistrant.swift +++ b/macos/Flutter/GeneratedPluginRegistrant.swift @@ -26,6 +26,7 @@ import stack_wallet_backup import url_launcher_macos import wakelock_plus import window_size +import xelis_flutter func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) { CameraMacosPlugin.register(with: registry.registrar(forPlugin: "CameraMacosPlugin")) @@ -49,4 +50,5 @@ func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) { UrlLauncherPlugin.register(with: registry.registrar(forPlugin: "UrlLauncherPlugin")) WakelockPlusMacosPlugin.register(with: registry.registrar(forPlugin: "WakelockPlusMacosPlugin")) WindowSizePlugin.register(with: registry.registrar(forPlugin: "WindowSizePlugin")) + XelisFlutterPlugin.register(with: registry.registrar(forPlugin: "XelisFlutterPlugin")) } diff --git a/pubspec.lock b/pubspec.lock index b611f6f20..920ea7743 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -187,6 +187,14 @@ packages: url: "https://pub.dev" source: hosted version: "2.4.1" + build_cli_annotations: + dependency: transitive + description: + name: build_cli_annotations + sha256: b59d2769769efd6c9ff6d4c4cede0be115a566afc591705c2040b707534b1172 + url: "https://pub.dev" + source: hosted + version: "2.1.0" build_config: dependency: transitive description: @@ -885,6 +893,14 @@ packages: url: "https://pub.dev" source: hosted version: "1.0.4" + flutter_rust_bridge: + dependency: transitive + description: + name: flutter_rust_bridge + sha256: "3292ad6085552987b8b3b9a7e5805567f4013372d302736b702801acb001ee00" + url: "https://pub.dev" + source: hosted + version: "2.7.1" flutter_secure_storage: dependency: "direct main" description: @@ -1185,6 +1201,14 @@ packages: url: "https://pub.dev" source: hosted version: "6.8.0" + jsontool: + dependency: transitive + description: + name: jsontool + sha256: e49bf419e82d90f009426cd7fdec8d54ba8382975b3454ed16a3af3ee1d1b697 + url: "https://pub.dev" + source: hosted + version: "2.1.0" keyboard_dismisser: dependency: "direct main" description: @@ -2148,6 +2172,14 @@ packages: url: "https://pub.dev" source: hosted version: "2.1.4" + very_good_analysis: + dependency: transitive + description: + name: very_good_analysis + sha256: "62d2b86d183fb81b2edc22913d9f155d26eb5cf3855173adb1f59fac85035c63" + url: "https://pub.dev" + source: hosted + version: "7.0.0" vm_service: dependency: transitive description: @@ -2237,6 +2269,14 @@ packages: url: "https://pub.dev" source: hosted version: "2.4.5" + web_socket_client: + dependency: transitive + description: + name: web_socket_client + sha256: "0ec5230852349191188c013112e4d2be03e3fc83dbe80139ead9bf3a136e53b5" + url: "https://pub.dev" + source: hosted + version: "0.1.5" webdriver: dependency: transitive description: @@ -2286,6 +2326,21 @@ packages: url: "https://pub.dev" source: hosted version: "1.1.0" + xelis_dart_sdk: + dependency: "direct main" + description: + name: xelis_dart_sdk + sha256: "2a7f8ab4c30fad2fd824ba6ea4e83ac20c726b47c7aa4f1e713ef3971a3ec1f7" + url: "https://pub.dev" + source: hosted + version: "0.24.0" + xelis_flutter: + dependency: "direct main" + description: + path: "crypto_plugins/xelis_flutter" + relative: true + source: path + version: "0.0.1" xml: dependency: transitive description: diff --git a/scripts/android/build_all.sh b/scripts/android/build_all.sh index 4d09d7aa0..b6e6527c3 100755 --- a/scripts/android/build_all.sh +++ b/scripts/android/build_all.sh @@ -14,9 +14,10 @@ PLUGINS_DIR=../../crypto_plugins (cd "${PLUGINS_DIR}"/flutter_liblelantus/scripts/android && ./build_all.sh ) (cd "${PLUGINS_DIR}"/flutter_libepiccash/scripts/android && ./build_all.sh ) +set_rust_to_1840 +(cd "${PLUGINS_DIR}"/xelis_flutter/scripts/android && ./build_all.sh ) set_rust_to_1720 (cd "${PLUGINS_DIR}"/frostdart/scripts/android && ./build_all.sh ) -(cd "${PLUGINS_DIR}"/xelis_flutter/scripts/android && ./build_all.sh ) wait echo "Done building" diff --git a/scripts/android/build_all_campfire.sh b/scripts/android/build_all_campfire.sh index 4d09d7aa0..b6e6527c3 100755 --- a/scripts/android/build_all_campfire.sh +++ b/scripts/android/build_all_campfire.sh @@ -14,9 +14,10 @@ PLUGINS_DIR=../../crypto_plugins (cd "${PLUGINS_DIR}"/flutter_liblelantus/scripts/android && ./build_all.sh ) (cd "${PLUGINS_DIR}"/flutter_libepiccash/scripts/android && ./build_all.sh ) +set_rust_to_1840 +(cd "${PLUGINS_DIR}"/xelis_flutter/scripts/android && ./build_all.sh ) set_rust_to_1720 (cd "${PLUGINS_DIR}"/frostdart/scripts/android && ./build_all.sh ) -(cd "${PLUGINS_DIR}"/xelis_flutter/scripts/android && ./build_all.sh ) wait echo "Done building" diff --git a/scripts/android/build_all_duo.sh b/scripts/android/build_all_duo.sh index 9c928a084..a84ec4f8f 100755 --- a/scripts/android/build_all_duo.sh +++ b/scripts/android/build_all_duo.sh @@ -16,9 +16,10 @@ PLUGINS_DIR=../../crypto_plugins (cd "${PLUGINS_DIR}"/flutter_liblelantus/scripts/android && ./build_all.sh ) (cd "${PLUGINS_DIR}"/flutter_libepiccash/scripts/android && ./build_all.sh ) +set_rust_to_1840 +(cd "${PLUGINS_DIR}"/xelis_flutter/scripts/android && ./build_all.sh ) set_rust_to_1720 (cd "${PLUGINS_DIR}"/frostdart/scripts/android && ./build_all.sh ) -(cd "${PLUGINS_DIR}"/xelis_flutter/scripts/android && ./build_all.sh ) wait echo "Done building" diff --git a/scripts/app_config/configure_stack_wallet.sh b/scripts/app_config/configure_stack_wallet.sh index 0fd8e5e8a..a7311a19a 100755 --- a/scripts/app_config/configure_stack_wallet.sh +++ b/scripts/app_config/configure_stack_wallet.sh @@ -71,6 +71,7 @@ final List _supportedCoins = List.unmodifiable([ Peercoin(CryptoCurrencyNetwork.main), Solana(CryptoCurrencyNetwork.main), Stellar(CryptoCurrencyNetwork.main), + Xelis(CryptoCurrencyNetwork.main), Tezos(CryptoCurrencyNetwork.main), Wownero(CryptoCurrencyNetwork.main), Bitcoin(CryptoCurrencyNetwork.test), @@ -83,6 +84,7 @@ final List _supportedCoins = List.unmodifiable([ Litecoin(CryptoCurrencyNetwork.test), Peercoin(CryptoCurrencyNetwork.test), Stellar(CryptoCurrencyNetwork.test), + Xelis(CryptoCurrencyNetwork.test), ]); final ({String from, String to}) _swapDefaults = (from: "BTC", to: "XMR"); diff --git a/scripts/app_config/templates/pubspec.template b/scripts/app_config/templates/pubspec.template index c52440856..26d28185a 100644 --- a/scripts/app_config/templates/pubspec.template +++ b/scripts/app_config/templates/pubspec.template @@ -30,6 +30,11 @@ dependencies: frostdart: path: ./crypto_plugins/frostdart + xelis_flutter: + path: ./crypto_plugins/xelis_flutter + + xelis_dart_sdk: ^0.24.0 + flutter_libsparkmobile: git: url: https://github.com/cypherstack/flutter_libsparkmobile.git diff --git a/scripts/ios/build_all.sh b/scripts/ios/build_all.sh index abebdfdb8..013346c9b 100755 --- a/scripts/ios/build_all.sh +++ b/scripts/ios/build_all.sh @@ -16,9 +16,10 @@ rustup target add x86_64-apple-ios (cd ../../crypto_plugins/flutter_liblelantus/scripts/ios && ./build_all.sh ) (cd ../../crypto_plugins/flutter_libepiccash/scripts/ios && ./build_all.sh ) +set_rust_to_1840 +(cd ../../crypto_plugins/xelis_flutter/scripts/ios && ./build_all.sh ) set_rust_to_1720 (cd ../../crypto_plugins/frostdart/scripts/ios && ./build_all.sh ) -(cd ../../crypto_plugins/xelis_flutter/scripts/ios && ./build_all.sh ) wait echo "Done building" diff --git a/scripts/ios/build_all_campfire.sh b/scripts/ios/build_all_campfire.sh index abebdfdb8..013346c9b 100755 --- a/scripts/ios/build_all_campfire.sh +++ b/scripts/ios/build_all_campfire.sh @@ -16,9 +16,10 @@ rustup target add x86_64-apple-ios (cd ../../crypto_plugins/flutter_liblelantus/scripts/ios && ./build_all.sh ) (cd ../../crypto_plugins/flutter_libepiccash/scripts/ios && ./build_all.sh ) +set_rust_to_1840 +(cd ../../crypto_plugins/xelis_flutter/scripts/ios && ./build_all.sh ) set_rust_to_1720 (cd ../../crypto_plugins/frostdart/scripts/ios && ./build_all.sh ) -(cd ../../crypto_plugins/xelis_flutter/scripts/ios && ./build_all.sh ) wait echo "Done building" diff --git a/scripts/ios/build_all_duo.sh b/scripts/ios/build_all_duo.sh index 2dd4d30ee..02045eb26 100755 --- a/scripts/ios/build_all_duo.sh +++ b/scripts/ios/build_all_duo.sh @@ -18,9 +18,10 @@ rustup target add x86_64-apple-ios (cd ../../crypto_plugins/flutter_liblelantus/scripts/ios && ./build_all.sh ) (cd ../../crypto_plugins/flutter_libepiccash/scripts/ios && ./build_all.sh ) +set_rust_to_1840 +(cd ../../crypto_plugins/xelis_flutter/scripts/ios && ./build_all.sh ) set_rust_to_1720 (cd ../../crypto_plugins/frostdart/scripts/ios && ./build_all.sh ) -(cd ../../crypto_plugins/xelis_flutter/scripts/ios && ./build_all.sh ) wait echo "Done building" diff --git a/scripts/linux/build_all.sh b/scripts/linux/build_all.sh index 16de64450..746bfd880 100755 --- a/scripts/linux/build_all.sh +++ b/scripts/linux/build_all.sh @@ -14,9 +14,10 @@ mkdir -p build ./build_secure_storage_deps.sh (cd ../../crypto_plugins/flutter_liblelantus/scripts/linux && ./build_all.sh ) (cd ../../crypto_plugins/flutter_libepiccash/scripts/linux && ./build_all.sh ) +set_rust_to_1840 +(cd ../../crypto_plugins/xelis_flutter/scripts/linux && ./build_all.sh ) set_rust_to_1720 (cd ../../crypto_plugins/frostdart/scripts/linux && ./build_all.sh ) -(cd ../../crypto_plugins/xelis_flutter/scripts/linux && ./build_all.sh ) ./build_secp256k1.sh diff --git a/scripts/linux/build_all_campfire.sh b/scripts/linux/build_all_campfire.sh index 16de64450..746bfd880 100755 --- a/scripts/linux/build_all_campfire.sh +++ b/scripts/linux/build_all_campfire.sh @@ -14,9 +14,10 @@ mkdir -p build ./build_secure_storage_deps.sh (cd ../../crypto_plugins/flutter_liblelantus/scripts/linux && ./build_all.sh ) (cd ../../crypto_plugins/flutter_libepiccash/scripts/linux && ./build_all.sh ) +set_rust_to_1840 +(cd ../../crypto_plugins/xelis_flutter/scripts/linux && ./build_all.sh ) set_rust_to_1720 (cd ../../crypto_plugins/frostdart/scripts/linux && ./build_all.sh ) -(cd ../../crypto_plugins/xelis_flutter/scripts/linux && ./build_all.sh ) ./build_secp256k1.sh diff --git a/scripts/linux/build_all_duo.sh b/scripts/linux/build_all_duo.sh index a57cc7f91..1fa5419c5 100755 --- a/scripts/linux/build_all_duo.sh +++ b/scripts/linux/build_all_duo.sh @@ -16,9 +16,10 @@ mkdir -p build ./build_secure_storage_deps.sh & (cd ../../crypto_plugins/flutter_liblelantus/scripts/linux && ./build_all.sh ) (cd ../../crypto_plugins/flutter_libepiccash/scripts/linux && ./build_all.sh ) +set_rust_to_1840 +(cd ../../crypto_plugins/xelis_flutter/scripts/linux && ./build_all.sh ) set_rust_to_1720 (cd ../../crypto_plugins/frostdart/scripts/linux && ./build_all.sh ) -(cd ../../crypto_plugins/xelis_flutter/scripts/linux && ./build_all.sh ) ./build_secp256k1.sh diff --git a/scripts/macos/build_all.sh b/scripts/macos/build_all.sh index 02d45501b..6f612b822 100755 --- a/scripts/macos/build_all.sh +++ b/scripts/macos/build_all.sh @@ -8,9 +8,10 @@ set_rust_to_1671 (cd ../../crypto_plugins/flutter_liblelantus/scripts/macos && ./build_all.sh ) (cd ../../crypto_plugins/flutter_libepiccash/scripts/macos && ./build_all.sh ) +set_rust_to_1840 +(cd ../../crypto_plugins/xelis_flutter/scripts/macos && ./build_all.sh ) set_rust_to_1720 (cd ../../crypto_plugins/frostdart/scripts/macos && ./build_all.sh ) -(cd ../../crypto_plugins/xelis_flutter/scripts/macos && ./build_all.sh ) wait echo "Done building" diff --git a/scripts/macos/build_all_campfire.sh b/scripts/macos/build_all_campfire.sh index 02d45501b..6f612b822 100755 --- a/scripts/macos/build_all_campfire.sh +++ b/scripts/macos/build_all_campfire.sh @@ -8,9 +8,10 @@ set_rust_to_1671 (cd ../../crypto_plugins/flutter_liblelantus/scripts/macos && ./build_all.sh ) (cd ../../crypto_plugins/flutter_libepiccash/scripts/macos && ./build_all.sh ) +set_rust_to_1840 +(cd ../../crypto_plugins/xelis_flutter/scripts/macos && ./build_all.sh ) set_rust_to_1720 (cd ../../crypto_plugins/frostdart/scripts/macos && ./build_all.sh ) -(cd ../../crypto_plugins/xelis_flutter/scripts/macos && ./build_all.sh ) wait echo "Done building" diff --git a/scripts/macos/build_all_duo.sh b/scripts/macos/build_all_duo.sh index 2e309ad12..387020650 100755 --- a/scripts/macos/build_all_duo.sh +++ b/scripts/macos/build_all_duo.sh @@ -10,9 +10,10 @@ set_rust_to_1671 (cd ../../crypto_plugins/flutter_liblelantus/scripts/macos && ./build_all.sh ) (cd ../../crypto_plugins/flutter_libepiccash/scripts/macos && ./build_all.sh ) +set_rust_to_1840 +(cd ../../crypto_plugins/xelis_flutter/scripts/macos && ./build_all.sh ) set_rust_to_1720 (cd ../../crypto_plugins/frostdart/scripts/macos && ./build_all.sh ) -(cd ../../crypto_plugins/xelis_flutter/scripts/macos && ./build_all.sh ) wait echo "Done building" diff --git a/scripts/rust_version.sh b/scripts/rust_version.sh index 8cda1229b..ac553f969 100755 --- a/scripts/rust_version.sh +++ b/scripts/rust_version.sh @@ -16,4 +16,13 @@ set_rust_to_1720() { echo "Rust version 1.72.0 is not installed. Please install it using 'rustup install 1.72.0'." >&2 exit 1 fi +} + +set_rust_to_1840() { + if rustup toolchain list | grep -q "1.84.0"; then + rustup default 1.84.0 + else + echo "Rust version 1.84.0 is not installed. Please install it using 'rustup install 1.84.0'." >&2 + exit 1 + fi } \ No newline at end of file diff --git a/scripts/windows/build_all.sh b/scripts/windows/build_all.sh index 8b8a3e822..498e95b75 100755 --- a/scripts/windows/build_all.sh +++ b/scripts/windows/build_all.sh @@ -9,9 +9,10 @@ set_rust_to_1671 mkdir -p build (cd ../../crypto_plugins/flutter_libepiccash/scripts/windows && ./build_all.sh ) (cd ../../crypto_plugins/flutter_liblelantus/scripts/windows && ./build_all.sh ) +set_rust_to_1840 +(cd ../../crypto_plugins/xelis_flutter/scripts/windows && ./build_all.sh ) set_rust_to_1720 (cd ../../crypto_plugins/frostdart/scripts/windows && ./build_all.sh ) -(cd ../../crypto_plugins/xelis_flutter/scripts/windows && ./build_all.sh ) ./build_secp256k1_wsl.sh diff --git a/scripts/windows/build_all_campfire.sh b/scripts/windows/build_all_campfire.sh index 8b8a3e822..6eb31ac04 100755 --- a/scripts/windows/build_all_campfire.sh +++ b/scripts/windows/build_all_campfire.sh @@ -9,8 +9,9 @@ set_rust_to_1671 mkdir -p build (cd ../../crypto_plugins/flutter_libepiccash/scripts/windows && ./build_all.sh ) (cd ../../crypto_plugins/flutter_liblelantus/scripts/windows && ./build_all.sh ) -set_rust_to_1720 +set_rust_to_1840 (cd ../../crypto_plugins/frostdart/scripts/windows && ./build_all.sh ) +set_rust_to_1720 (cd ../../crypto_plugins/xelis_flutter/scripts/windows && ./build_all.sh ) ./build_secp256k1_wsl.sh diff --git a/scripts/windows/build_all_duo.sh b/scripts/windows/build_all_duo.sh index fe05ba659..5b5b0772a 100755 --- a/scripts/windows/build_all_duo.sh +++ b/scripts/windows/build_all_duo.sh @@ -11,8 +11,9 @@ set_rust_to_1671 mkdir -p build (cd ../../crypto_plugins/flutter_libepiccash/scripts/windows && ./build_all.sh ) (cd ../../crypto_plugins/flutter_liblelantus/scripts/windows && ./build_all.sh ) -set_rust_to_1720 +set_rust_to_1840 (cd ../../crypto_plugins/frostdart/scripts/windows && ./build_all.sh ) +set_rust_to_1720 (cd ../../crypto_plugins/xelis_flutter/scripts/windows && ./build_all.sh ) ./build_secp256k1_wsl.sh diff --git a/windows/flutter/generated_plugin_registrant.cc b/windows/flutter/generated_plugin_registrant.cc index 74ef33c4e..eca37870c 100644 --- a/windows/flutter/generated_plugin_registrant.cc +++ b/windows/flutter/generated_plugin_registrant.cc @@ -20,6 +20,7 @@ #include #include #include +#include void RegisterPlugins(flutter::PluginRegistry* registry) { CameraWindowsRegisterWithRegistrar( @@ -50,4 +51,6 @@ void RegisterPlugins(flutter::PluginRegistry* registry) { registry->GetRegistrarForPlugin("UrlLauncherWindows")); WindowSizePluginRegisterWithRegistrar( registry->GetRegistrarForPlugin("WindowSizePlugin")); + XelisFlutterPluginCApiRegisterWithRegistrar( + registry->GetRegistrarForPlugin("XelisFlutterPluginCApi")); } diff --git a/windows/flutter/generated_plugins.cmake b/windows/flutter/generated_plugins.cmake index 2f370e685..4c59517d9 100644 --- a/windows/flutter/generated_plugins.cmake +++ b/windows/flutter/generated_plugins.cmake @@ -17,6 +17,7 @@ list(APPEND FLUTTER_PLUGIN_LIST stack_wallet_backup url_launcher_windows window_size + xelis_flutter ) list(APPEND FLUTTER_FFI_PLUGIN_LIST From 96478de9cce1fbb16128632f9cbc6bcc4859691e Mon Sep 17 00:00:00 2001 From: Tritonn204 Date: Thu, 6 Feb 2025 04:36:55 -0800 Subject: [PATCH 111/193] gitignore --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index 9b2706bb0..aa0b3b8a8 100644 --- a/.gitignore +++ b/.gitignore @@ -107,3 +107,4 @@ scripts/linux/build/libsecret/subprojects/gi-docgen/.meson-subproject-wrap-hash. crypto_plugins/cs_monero/built_outputs crypto_plugins/cs_monero/build +crypto_plugins/*.diff From 24a20238bccc2881d4a395360647a9e00c793d50 Mon Sep 17 00:00:00 2001 From: Tritonn204 Date: Tue, 11 Feb 2025 22:21:07 -0800 Subject: [PATCH 112/193] Xelis base integration --- .gitignore | 4 + crypto_plugins/xelis_flutter | 2 +- flutter_01.png | 0 lib/main.dart | 16 + ...w_wallet_recovery_phrase_warning_view.dart | 228 +++++ .../restore_view_only_wallet_view.dart | 5 + .../restore_wallet_view.dart | 14 +- .../verify_recovery_phrase_view.dart | 5 + .../helpers/restore_create_backup.dart | 5 + .../my_stack_view/wallet_summary_table.dart | 4 +- .../xelis_table_progress_provider.dart | 69 ++ lib/providers/providers.dart | 1 + lib/utilities/test_node_connection.dart | 23 + lib/wallets/crypto_currency/coins/xelis.dart | 16 +- lib/wallets/models/tx_data.dart | 12 + lib/wallets/wallet/impl/xelis_wallet.dart | 786 ++++++++++++------ .../intermediate/cryptonote_wallet.dart | 3 +- .../wallet/intermediate/external_wallet.dart | 12 + .../intermediate/lib_monero_wallet.dart | 1 + .../wallet/intermediate/lib_xelis_wallet.dart | 563 +++++++++++++ lib/wallets/wallet/wallet.dart | 4 +- lib/widgets/xelis_table_progress.dart | 77 ++ pubspec.lock | 12 +- .../app_config/templates/linux/CMakeLists.txt | 3 + scripts/app_config/templates/pubspec.template | 9 +- .../templates/windows/CMakeLists.txt | 4 + 26 files changed, 1613 insertions(+), 265 deletions(-) create mode 100644 flutter_01.png create mode 100644 lib/providers/progress_report/xelis_table_progress_provider.dart create mode 100644 lib/wallets/wallet/intermediate/external_wallet.dart create mode 100644 lib/wallets/wallet/intermediate/lib_xelis_wallet.dart create mode 100644 lib/widgets/xelis_table_progress.dart diff --git a/.gitignore b/.gitignore index aa0b3b8a8..5e86f725e 100644 --- a/.gitignore +++ b/.gitignore @@ -71,6 +71,10 @@ secp256k1.dll /lib/app_config.g.dart /android/app/src/main/app_icon-playstore.png +# Dart generated files (Freezed, Riverpod, GoRouter etc..) +lib/**/*.g.dart +lib/**/*.freezed.dart + ## other generated project files pubspec.yaml diff --git a/crypto_plugins/xelis_flutter b/crypto_plugins/xelis_flutter index e93337c26..2a3824490 160000 --- a/crypto_plugins/xelis_flutter +++ b/crypto_plugins/xelis_flutter @@ -1 +1 @@ -Subproject commit e93337c262580665ffb0d16cfcd8d3614f7e371a +Subproject commit 2a382449090daac64a15434b6e802d6e06d30502 diff --git a/flutter_01.png b/flutter_01.png new file mode 100644 index 000000000..e69de29bb diff --git a/lib/main.dart b/lib/main.dart index fde2ce42a..45a1fff18 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -74,15 +74,31 @@ import 'wallets/isar/providers/all_wallets_info_provider.dart'; import 'wallets/wallet/wallet_mixin_interfaces/spark_interface.dart'; import 'widgets/crypto_notifications.dart'; +import 'package:xelis_flutter/src/frb_generated.dart' as xelis_rust; +import 'package:xelis_flutter/src/api/api.dart' as xelis_api; + final openedFromSWBFileStringStateProvider = StateProvider((ref) => null); +void startListeningToRustLogs() { + xelis_api.createLogStream().listen((logEntry) { + print("[Rust Log] [${logEntry.level}] ${logEntry.tag}: ${logEntry.msg}"); + }, onError: (e) { + print("Error receiving Rust logs: $e"); + }); +} + // main() is the entry point to the app. It initializes Hive (local database), // runs the MyApp widget and checks for new users, caching the value in the // miscellaneous box for later use void main(List args) async { + // talker.info('initializing Rust lib ...'); + await xelis_rust.RustLib.init(); WidgetsFlutterBinding.ensureInitialized(); + await xelis_api.setUpRustLogger(); + startListeningToRustLogs(); + if (Util.isDesktop && args.length == 2 && args.first == "-d") { StackFileSystem.setDesktopOverrideDir(args.last); } diff --git a/lib/pages/add_wallet_views/new_wallet_recovery_phrase_warning_view/new_wallet_recovery_phrase_warning_view.dart b/lib/pages/add_wallet_views/new_wallet_recovery_phrase_warning_view/new_wallet_recovery_phrase_warning_view.dart index 1ab649f26..9d6b7fdf0 100644 --- a/lib/pages/add_wallet_views/new_wallet_recovery_phrase_warning_view/new_wallet_recovery_phrase_warning_view.dart +++ b/lib/pages/add_wallet_views/new_wallet_recovery_phrase_warning_view/new_wallet_recovery_phrase_warning_view.dart @@ -40,6 +40,7 @@ import '../../../widgets/desktop/desktop_scaffold.dart'; import '../../../widgets/rounded_container.dart'; import '../../../widgets/rounded_white_container.dart'; import '../../../widgets/stack_dialog.dart'; +import '../../../widgets/xelis_table_progress.dart'; import '../new_wallet_options/new_wallet_options_view.dart'; import '../new_wallet_recovery_phrase_view/new_wallet_recovery_phrase_view.dart'; import 'recovery_phrase_explanation_dialog.dart'; @@ -103,6 +104,233 @@ class _NewWalletRecoveryPhraseWarningViewState ); } } + + // () async { + // try { + // unawaited( + // showDialog( + // context: context, + // barrierDismissible: false, + // useSafeArea: true, + // builder: (ctx) { + // return Center( + // child: Column( + // mainAxisSize: MainAxisSize.min, + // children: [ + // const LoadingIndicator( + // width: 50, + // height: 50, + // ), + // if (widget.coin is Xelis) ...[ + // const SizedBox(height: 16), + // const XelisTableProgress(), + // ], + // ], + // ), + // ); + // }, + // ), + // ); + // String? otherDataJsonString; + // if (widget.coin is Tezos) { + // otherDataJsonString = jsonEncode({ + // WalletInfoKeys + // .tezosDerivationPath: + // Tezos.standardDerivationPath + // .value, + // }); + // // }//todo: probably not needed (broken anyways) + // // else if (widget.coin is Epiccash) { + // // final int secondsSinceEpoch = + // // DateTime.now().millisecondsSinceEpoch ~/ 1000; + // // const int epicCashFirstBlock = 1565370278; + // // const double overestimateSecondsPerBlock = 61; + // // int chosenSeconds = secondsSinceEpoch - epicCashFirstBlock; + // // int approximateHeight = chosenSeconds ~/ overestimateSecondsPerBlock; + // // / + // // // debugPrint( + // // // "approximate height: $approximateHeight chosen_seconds: $chosenSeconds"); + // // height = approximateHeight; + // // if (height < 0) { + // // height = 0; + // // } + // // + // // otherDataJsonString = jsonEncode( + // // { + // // WalletInfoKeys.epiccashData: jsonEncode( + // // ExtraEpiccashWalletInfo( + // // receivingIndex: 0, + // // changeIndex: 0, + // // slatesToAddresses: {}, + // // slatesToCommits: {}, + // // lastScannedBlock: epicCashFirstBlock, + // // restoreHeight: height, + // // creationHeight: height, + // // ).toMap(), + // // ), + // // }, + // // ); + // } else if (widget.coin is Firo) { + // otherDataJsonString = jsonEncode( + // { + // WalletInfoKeys + // .lelantusCoinIsarRescanRequired: + // false, + // }, + // ); + // } + + // final info = WalletInfo.createNew( + // coin: widget.coin, + // name: widget.walletName, + // otherDataJsonString: + // otherDataJsonString, + // ); + + // var node = ref + // .read( + // nodeServiceChangeNotifierProvider, + // ) + // .getPrimaryNodeFor( + // currency: coin, + // ); + + // if (node == null) { + // node = coin.defaultNode; + // await ref + // .read( + // nodeServiceChangeNotifierProvider, + // ) + // .setPrimaryNodeFor( + // coin: coin, + // node: node, + // ); + // } + + // final txTracker = + // TransactionNotificationTracker( + // walletId: info.walletId, + // ); + + // int? wordCount; + // String? mnemonicPassphrase; + // String? mnemonic; + // String? privateKey; + + // wordCount = info + // .coin.defaultSeedPhraseLength; + + // // TODO: Refactor these to generate each coin in their respective classes + // // This code should not be in a random view page file + // if (coin is Monero || + // coin is Wownero || + // coin is Xelis) { + // // currently a special case due to the + // // xmr/wow/xelis libraries handling their + // // own mnemonic generation + // } else if (wordCount > 0) { + // if (ref + // .read( + // pNewWalletOptions.state, + // ) + // .state != + // null) { + // if (coin + // .hasMnemonicPassphraseSupport) { + // mnemonicPassphrase = ref + // .read( + // pNewWalletOptions.state, + // ) + // .state! + // .mnemonicPassphrase; + // } else { + // // this may not be epiccash specific? + // if (coin is Epiccash) { + // mnemonicPassphrase = ""; + // } + // } + + // wordCount = ref + // .read( + // pNewWalletOptions.state, + // ) + // .state! + // .mnemonicWordsCount; + // } else { + // mnemonicPassphrase = ""; + // } + + // if (wordCount < 12 || + // 24 < wordCount || + // wordCount % 3 != 0) { + // throw Exception( + // "Invalid word count", + // ); + // } + + // final strength = + // (wordCount ~/ 3) * 32; + + // mnemonic = bip39.generateMnemonic( + // strength: strength, + // ); + // } + + // final wallet = await Wallet.create( + // walletInfo: info, + // mainDB: ref.read(mainDBProvider), + // secureStorageInterface: + // ref.read(secureStoreProvider), + // nodeService: ref.read( + // nodeServiceChangeNotifierProvider, + // ), + // prefs: ref.read( + // prefsChangeNotifierProvider, + // ), + // mnemonicPassphrase: + // mnemonicPassphrase, + // mnemonic: mnemonic, + // privateKey: privateKey, + // ); + + // await wallet.init(); + + // // pop progress dialog + // if (context.mounted) { + // Navigator.pop(context); + // } + // // set checkbox back to unchecked to annoy users to agree again :P + // ref + // .read( + // checkBoxStateProvider.state, + // ) + // .state = false; + + // if (context.mounted) { + // final nav = Navigator.of(context); + // unawaited( + // nav.pushNamed( + // NewWalletRecoveryPhraseView + // .routeName, + // arguments: Tuple2( + // wallet, + // await (wallet + // as MnemonicInterface) + // .getMnemonicAsWords(), + // ), + // ), + // ); + // } + // } catch (e, s) { + // Logging.instance.log( + // "$e\n$s", + // level: LogLevel.Fatal, + // ); + // // TODO: handle gracefully + // // any network/socket exception here will break new wallet creation + // rethrow; + // } + // } } Future<(Wallet, List)> _initNewFuture() async { diff --git a/lib/pages/add_wallet_views/restore_wallet_view/restore_view_only_wallet_view.dart b/lib/pages/add_wallet_views/restore_wallet_view/restore_view_only_wallet_view.dart index 3a7131762..9123b2f46 100644 --- a/lib/pages/add_wallet_views/restore_wallet_view/restore_view_only_wallet_view.dart +++ b/lib/pages/add_wallet_views/restore_wallet_view/restore_view_only_wallet_view.dart @@ -31,6 +31,7 @@ import '../../../wallets/isar/models/wallet_info.dart'; import '../../../wallets/wallet/impl/epiccash_wallet.dart'; import '../../../wallets/wallet/impl/monero_wallet.dart'; import '../../../wallets/wallet/impl/wownero_wallet.dart'; +import '../../../wallets/wallet/impl/xelis_wallet.dart'; import '../../../wallets/wallet/wallet.dart'; import '../../../wallets/wallet/wallet_mixin_interfaces/extended_keys_interface.dart'; import '../../../widgets/custom_buttons/app_bar_icon_button.dart'; @@ -264,6 +265,10 @@ class _RestoreViewOnlyWalletViewState await (wallet as WowneroWallet).init(isRestore: true); break; + case const (XelisWallet): + await (wallet as XelisWallet).init(isRestore: true); + break; + default: await wallet.init(); } diff --git a/lib/pages/add_wallet_views/restore_wallet_view/restore_wallet_view.dart b/lib/pages/add_wallet_views/restore_wallet_view/restore_wallet_view.dart index a5aec4d97..b70c2afcf 100644 --- a/lib/pages/add_wallet_views/restore_wallet_view/restore_wallet_view.dart +++ b/lib/pages/add_wallet_views/restore_wallet_view/restore_wallet_view.dart @@ -49,6 +49,7 @@ import '../../../wallets/wallet/impl/epiccash_wallet.dart'; import '../../../wallets/wallet/impl/monero_wallet.dart'; import '../../../wallets/wallet/impl/wownero_wallet.dart'; import '../../../wallets/wallet/intermediate/lib_monero_wallet.dart'; +import '../../../wallets/wallet/impl/xelis_wallet.dart'; import '../../../wallets/wallet/supporting/epiccash_wallet_info_extension.dart'; import '../../../wallets/wallet/wallet.dart'; import '../../../widgets/custom_buttons/app_bar_icon_button.dart'; @@ -199,6 +200,10 @@ class _RestoreWalletViewState extends ConsumerState { ); return wowneroWordList.contains(word); } + // TODO: use Xelis word list + if (widget.coin is Xelis) { + return true; + } return _wordListHashSet.contains(word); } @@ -283,10 +288,9 @@ class _RestoreWalletViewState extends ConsumerState { ); } - // TODO: do actual check to make sure it is a valid mnemonic for monero + // TODO: do actual check to make sure it is a valid mnemonic for monero + xelis if (bip39.validateMnemonic(mnemonic) == false && - !(widget.coin is Monero || widget.coin is Wownero)) { - if (mounted) setState(() => _hideSeedWords = false); + !(widget.coin is Monero || widget.coin is Wownero || widget.coin is Xelis)) { unawaited( showFloatingFlushBar( type: FlushBarType.warning, @@ -371,6 +375,10 @@ class _RestoreWalletViewState extends ConsumerState { await (wallet as WowneroWallet).init(isRestore: true); break; + case const (XelisWallet): + await (wallet as XelisWallet).init(isRestore: true); + break; + default: await wallet.init(); } diff --git a/lib/pages/add_wallet_views/verify_recovery_phrase_view/verify_recovery_phrase_view.dart b/lib/pages/add_wallet_views/verify_recovery_phrase_view/verify_recovery_phrase_view.dart index b1f5613bb..04dc94d33 100644 --- a/lib/pages/add_wallet_views/verify_recovery_phrase_view/verify_recovery_phrase_view.dart +++ b/lib/pages/add_wallet_views/verify_recovery_phrase_view/verify_recovery_phrase_view.dart @@ -40,6 +40,7 @@ import '../../../wallets/isar/providers/wallet_info_provider.dart'; import '../../../wallets/wallet/impl/epiccash_wallet.dart'; import '../../../wallets/wallet/impl/monero_wallet.dart'; import '../../../wallets/wallet/impl/wownero_wallet.dart'; +import '../../../wallets/wallet/impl/xelis_wallet.dart'; import '../../../wallets/wallet/intermediate/lib_monero_wallet.dart'; import '../../../wallets/wallet/wallet.dart'; import '../../../wallets/wallet/wallet_mixin_interfaces/extended_keys_interface.dart'; @@ -225,6 +226,10 @@ class _VerifyRecoveryPhraseViewState await (voWallet as WowneroWallet).init(isRestore: true); break; + case const (XelisWallet): + await (voWallet as XelisWallet).init(isRestore: true); + break; + default: await voWallet.init(); } diff --git a/lib/pages/settings_views/global_settings_view/stack_backup_views/helpers/restore_create_backup.dart b/lib/pages/settings_views/global_settings_view/stack_backup_views/helpers/restore_create_backup.dart index 935dad27b..b6e872bd4 100644 --- a/lib/pages/settings_views/global_settings_view/stack_backup_views/helpers/restore_create_backup.dart +++ b/lib/pages/settings_views/global_settings_view/stack_backup_views/helpers/restore_create_backup.dart @@ -55,6 +55,7 @@ import '../../../../../wallets/wallet/impl/bitcoin_frost_wallet.dart'; import '../../../../../wallets/wallet/impl/epiccash_wallet.dart'; import '../../../../../wallets/wallet/impl/monero_wallet.dart'; import '../../../../../wallets/wallet/impl/wownero_wallet.dart'; +import '../../../../../wallets/wallet/impl/xelis_wallet.dart'; import '../../../../../wallets/wallet/intermediate/lib_monero_wallet.dart'; import '../../../../../wallets/wallet/wallet.dart'; import '../../../../../wallets/wallet/wallet_mixin_interfaces/mnemonic_interface.dart'; @@ -506,6 +507,10 @@ abstract class SWB { case const (WowneroWallet): await (wallet as WowneroWallet).init(isRestore: true); break; + + case const (XelisWallet): + await (wallet as XelisWallet).init(isRestore: true); + break; default: await wallet.init(); diff --git a/lib/pages_desktop_specific/my_stack_view/wallet_summary_table.dart b/lib/pages_desktop_specific/my_stack_view/wallet_summary_table.dart index 5df82cc0f..066ae9073 100644 --- a/lib/pages_desktop_specific/my_stack_view/wallet_summary_table.dart +++ b/lib/pages_desktop_specific/my_stack_view/wallet_summary_table.dart @@ -25,7 +25,7 @@ import '../../utilities/text_styles.dart'; import '../../utilities/util.dart'; import '../../wallets/crypto_currency/crypto_currency.dart'; import '../../wallets/isar/providers/all_wallets_info_provider.dart'; -import '../../wallets/wallet/intermediate/lib_monero_wallet.dart'; +import '../../wallets/wallet/intermediate/external_wallet.dart'; import '../../widgets/breathing.dart'; import '../../widgets/conditional_parent.dart'; import '../../widgets/desktop/desktop_dialog.dart'; @@ -138,7 +138,7 @@ class _DesktopWalletSummaryRowState } final Future loadFuture; - if (wallet is LibMoneroWallet) { + if (wallet is ExternalWallet) { loadFuture = wallet.init().then((value) async => await (wallet).open()); } else { diff --git a/lib/providers/progress_report/xelis_table_progress_provider.dart b/lib/providers/progress_report/xelis_table_progress_provider.dart new file mode 100644 index 000000000..5f57dca29 --- /dev/null +++ b/lib/providers/progress_report/xelis_table_progress_provider.dart @@ -0,0 +1,69 @@ +import 'package:xelis_flutter/src/api/api.dart' as xelis_api; +import 'package:flutter_riverpod/flutter_riverpod.dart'; + +enum XelisTableGenerationStep { + t1PointsGeneration, + t1CuckooSetup, + t2Table, + unknown; + + factory XelisTableGenerationStep.fromString(String step) { + return switch (step) { + "T1PointsGeneration" => XelisTableGenerationStep.t1PointsGeneration, + "T1CuckooSetup" => XelisTableGenerationStep.t1CuckooSetup, + "T2Table" => XelisTableGenerationStep.t2Table, + _ => XelisTableGenerationStep.unknown, + }; + } + + String get displayName => switch (this) { + t1PointsGeneration => "Generating T1 Points", + t1CuckooSetup => "Setting up T1 Cuckoo", + t2Table => "Generating T2 Table", + unknown => "Processing", + }; +} + +class XelisTableProgressState { + final double? tableProgress; + final XelisTableGenerationStep currentStep; + + const XelisTableProgressState({ + this.tableProgress, + this.currentStep = XelisTableGenerationStep.unknown, + }); + + XelisTableProgressState copyWith({ + double? tableProgress, + XelisTableGenerationStep? currentStep, + }) { + return XelisTableProgressState( + tableProgress: tableProgress ?? this.tableProgress, + currentStep: currentStep ?? this.currentStep, + ); + } +} + +final xelisTableProgressProvider = StreamProvider((ref) { + return xelis_api.createProgressReportStream().map((report) { + return report.when( + tableGeneration: (progress, step, _) { + final currentStep = XelisTableGenerationStep.fromString(step); + final stepIndex = switch(currentStep) { + XelisTableGenerationStep.t1PointsGeneration => 0, + XelisTableGenerationStep.t1CuckooSetup => 1, + XelisTableGenerationStep.t2Table => 2, + XelisTableGenerationStep.unknown => 0, + }; + + final totalProgress = (stepIndex * 0.5) + (progress * 0.5); + + return XelisTableProgressState( + tableProgress: totalProgress, + currentStep: currentStep, + ); + }, + misc: (_) => const XelisTableProgressState(), + ); + }); +}); \ No newline at end of file diff --git a/lib/providers/providers.dart b/lib/providers/providers.dart index a96a9869c..e6e9ef20b 100644 --- a/lib/providers/providers.dart +++ b/lib/providers/providers.dart @@ -32,3 +32,4 @@ export './ui/verify_recovery_phrase/correct_word_provider.dart'; export './ui/verify_recovery_phrase/random_index_provider.dart'; export './ui/verify_recovery_phrase/selected_word_provider.dart'; export './wallet/transaction_note_provider.dart'; +export './progress_report/xelis_table_progress_provider.dart'; diff --git a/lib/utilities/test_node_connection.dart b/lib/utilities/test_node_connection.dart index b212d3a0a..8df98eab5 100644 --- a/lib/utilities/test_node_connection.dart +++ b/lib/utilities/test_node_connection.dart @@ -26,6 +26,9 @@ import 'test_monero_node_connection.dart'; import 'test_stellar_node_connection.dart'; import 'tor_plain_net_option_enum.dart'; +import 'package:logging/logging.dart' as std_logging; +import 'package:xelis_dart_sdk/xelis_dart_sdk.dart' as xelis_sdk; + Future _xmrHelper( NodeFormData nodeFormData, BuildContext context, @@ -297,6 +300,26 @@ Future testNodeConnection({ testPassed = false; } break; + + case Xelis(): + try { + final daemon = xelis_sdk.DaemonClient( + endPoint: formData.host!, + secureWebSocket: formData.useSSL ?? false, + ); + daemon.connect(); + + final xelis_sdk.GetInfoResult networkInfo = await daemon.getInfo(); + testPassed = networkInfo.height != null; + + Logging.instance.log( + "Xelis testNodeConnection result: \"${networkInfo.toString()}\"", + level: LogLevel.Info, + ); + } catch (e, s) { + testPassed = false; + } + break; } return testPassed; diff --git a/lib/wallets/crypto_currency/coins/xelis.dart b/lib/wallets/crypto_currency/coins/xelis.dart index 84e8439bb..1f57b2afb 100644 --- a/lib/wallets/crypto_currency/coins/xelis.dart +++ b/lib/wallets/crypto_currency/coins/xelis.dart @@ -3,11 +3,11 @@ import '../../../models/node_model.dart'; import '../../../utilities/default_nodes.dart'; import '../../../utilities/enums/derive_path_type_enum.dart'; import '../crypto_currency.dart'; -import '../intermediate/bip39_currency.dart'; +import '../intermediate/electrum_currency.dart'; import 'package:xelis_flutter/src/api/utils.dart' as x_utils; -class Xelis extends CryptoCurrency { +class Xelis extends ElectrumCurrency { Xelis(super.network) { _idMain = "xelis"; _uriScheme = "xelis"; @@ -50,7 +50,7 @@ class Xelis extends CryptoCurrency { switch (network) { case CryptoCurrencyNetwork.main: return NodeModel( - host: "https://us-node.xelis.io", + host: "us-node.xelis.io", port: 443, name: DefaultNodes.defaultName, id: DefaultNodes.buildId(this), @@ -65,7 +65,7 @@ class Xelis extends CryptoCurrency { case CryptoCurrencyNetwork.test: return NodeModel( - host: "https://testnet-node.xelis.io", + host: "testnet-node.xelis.io", port: 443, name: DefaultNodes.defaultName, id: DefaultNodes.buildId(this), @@ -84,7 +84,7 @@ class Xelis extends CryptoCurrency { } @override - int get minConfirms => 20; + int get minConfirms => 1; @override bool get torSupport => true; @@ -102,10 +102,10 @@ class Xelis extends CryptoCurrency { String get genesisHash => throw UnimplementedError(); @override - int get defaultSeedPhraseLength => 12; + int get defaultSeedPhraseLength => 25; @override - int get fractionDigits => 9; + int get fractionDigits => 8; @override bool get hasBuySupport => false; @@ -114,7 +114,7 @@ class Xelis extends CryptoCurrency { bool get hasMnemonicPassphraseSupport => false; @override - List get possibleMnemonicLengths => [defaultSeedPhraseLength, 24]; + List get possibleMnemonicLengths => [defaultSeedPhraseLength]; @override AddressType get defaultAddressType => defaultDerivePathType.getAddressType(); diff --git a/lib/wallets/models/tx_data.dart b/lib/wallets/models/tx_data.dart index 21fa206c9..b8839fe3d 100644 --- a/lib/wallets/models/tx_data.dart +++ b/lib/wallets/models/tx_data.dart @@ -74,6 +74,9 @@ class TxData { final List? sparkMints; final List? usedSparkCoins; + // xelis specific + final String? otherData; + final TransactionV2? tempTx; final bool ignoreCachedBalanceChecks; @@ -113,6 +116,7 @@ class TxData { this.mintsMapLelantus, this.tezosOperationsList, this.sparkRecipients, + this.otherData, this.sparkMints, this.usedSparkCoins, this.tempTx, @@ -142,6 +146,11 @@ class TxData { return null; } + String? get getOtherData { + final val = this.otherData; + return val; + } + Amount? get amountSpark => sparkRecipients != null && sparkRecipients!.isNotEmpty ? sparkRecipients! @@ -213,6 +222,7 @@ class TxData { String? note, String? noteOnChain, String? memo, + String? otherData, Set? utxos, List? usedUTXOs, List? recipients, @@ -258,6 +268,7 @@ class TxData { note: note ?? this.note, noteOnChain: noteOnChain ?? this.noteOnChain, memo: memo ?? this.memo, + otherData: otherData ?? this.otherData, utxos: utxos ?? this.utxos, usedUTXOs: usedUTXOs ?? this.usedUTXOs, recipients: recipients ?? this.recipients, @@ -321,6 +332,7 @@ class TxData { 'sparkRecipients: $sparkRecipients, ' 'sparkMints: $sparkMints, ' 'usedSparkCoins: $usedSparkCoins, ' + 'otherData: $otherData, ' 'tempTx: $tempTx, ' 'ignoreCachedBalanceChecks: $ignoreCachedBalanceChecks, ' 'opNameState: $opNameState, ' diff --git a/lib/wallets/wallet/impl/xelis_wallet.dart b/lib/wallets/wallet/impl/xelis_wallet.dart index c21100625..b14ef7cc2 100644 --- a/lib/wallets/wallet/impl/xelis_wallet.dart +++ b/lib/wallets/wallet/impl/xelis_wallet.dart @@ -10,71 +10,45 @@ import 'package:xelis_flutter/src/api/network.dart' as x_network; import 'package:xelis_flutter/src/api/wallet.dart' as x_wallet; import 'package:xelis_dart_sdk/xelis_dart_sdk.dart' as xelis_sdk; +import 'package:path_provider/path_provider.dart'; +import 'package:path/path.dart' as path; + +import '../intermediate/lib_xelis_wallet.dart'; + +import '../../../utilities/stack_file_system.dart'; import '../../../models/isar/models/blockchain_data/address.dart'; import '../../../models/isar/models/blockchain_data/transaction.dart'; import '../../../models/isar/models/blockchain_data/v2/input_v2.dart'; import '../../../models/isar/models/blockchain_data/v2/output_v2.dart'; import '../../../models/isar/models/blockchain_data/v2/transaction_v2.dart'; +import '../../../services/event_bus/events/global/blocks_remaining_event.dart'; +import '../../../services/event_bus/events/global/refresh_percent_changed_event.dart'; +import '../../../services/event_bus/events/global/tor_connection_status_changed_event.dart'; +import '../../../services/event_bus/events/global/tor_status_changed_event.dart'; +import '../../../services/event_bus/events/global/updated_in_background_event.dart'; +import '../../../services/event_bus/events/global/wallet_sync_status_changed_event.dart'; +import '../../../services/event_bus/global_event_bus.dart'; + import '../../../models/node_model.dart'; +import '../../../models/paymint/fee_object_model.dart'; import '../../../models/balance.dart'; import '../../../utilities/amount/amount.dart'; +import '../../../utilities/logger.dart'; import '../../crypto_currency/crypto_currency.dart'; import '../../models/tx_data.dart'; import '../wallet.dart'; +import '../../../providers/providers.dart'; + import 'package:isar/isar.dart'; import 'package:mutex/mutex.dart'; import 'package:stack_wallet_backup/generate_password.dart'; import 'package:web_socket_channel/web_socket_channel.dart'; -import '../intermediate/bip39_wallet.dart'; - -extension XelisNetworkConversion on CryptoCurrencyNetwork { - x_network.Network get xelisNetwork { - switch (this) { - case CryptoCurrencyNetwork.main: - return x_network.Network.mainnet; - case CryptoCurrencyNetwork.test: - return x_network.Network.testnet; - default: - throw ArgumentError('Unsupported network type for Xelis: $this'); - } - } -} - -extension CryptoCurrencyNetworkConversion on x_network.Network { - CryptoCurrencyNetwork get cryptoCurrencyNetwork { - switch (this) { - case x_network.Network.mainnet: - return CryptoCurrencyNetwork.main; - case x_network.Network.testnet: - return CryptoCurrencyNetwork.test; - default: - throw ArgumentError('Unsupported Xelis network type: $this'); - } - } -} - -class XelisWallet extends Wallet { - x_wallet.XelisWallet? _wallet; - - x_wallet.XelisWallet? get wallet => _wallet; - set wallet(x_wallet.XelisWallet newWallet) { - _wallet = newWallet; - } - - void _checkInitialized() { - if (_wallet == null) { - throw StateError('XelisWallet not initialized'); - } - } +import '../intermediate/lib_xelis_wallet.dart'; +class XelisWallet extends LibXelisWallet { XelisWallet(CryptoCurrencyNetwork network) : super(Xelis(network)); - - final syncMutex = Mutex(); - NodeModel? _xelisNode; - Timer? timer; - // ==================== Overrides ============================================ @override @@ -82,145 +56,226 @@ class XelisWallet extends Wallet { @override Future init({bool? isRestore}) async { - if (isRestore != true) { - x_wallet.PrecomputedTablesShared? encodedTables = - await secureStorageInterface.read(key: "xelis_precomputed_tables"); + debugPrint("Xelis: init"); + + // final progressState = ref.read(xelisTableProgressProvider); + // if (progressState.hasValue && + // progressState.value?.tableProgress != null && + // progressState.value!.tableProgress! < 1.0) { + // GlobalEventBus.instance.fire( + // WalletSyncStatusChangedEvent( + // WalletSyncStatus.syncing, + // walletId, + // info.coin, + // ), + // ); + + // while ((ref.read(xelisTableProgressProvider).value?.tableProgress ?? 1.0) < 1.0) { + // await Future.delayed(const Duration(milliseconds: 100)); + // } + // } + + if (isRestore == true) { + await _restoreWallet(); + return await super.init(); + } - String? encodedWallet = + String? walletExists = await secureStorageInterface.read(key: "${walletId}_wallet"); - // check if should create a new wallet - if (encodedWallet == null) { - final String password = generatePassword(); + if (walletExists == null) { + await _createNewWallet(); + } - await secureStorageInterface.write( - key: '${walletId}_password', - value: password, - ); + await open(); + await updateTransactions(isRescan: true, topoheight: 0); - final String name = walletId; + return await super.init(); + } - final wallet = await x_wallet.createXelisWallet( - name: name, - password: password, - network: cryptoCurrency.network.xelisNetwork, - seed: null, // Xelis lib will autogenerate this - privateKey: null, // Xelis lib will autogenerate this - precomputedTables: encodedTables, - ); + Future _createNewWallet() async { + final String password = generatePassword(); + + debugPrint("Xelis: storing password"); + await secureStorageInterface.write( + key: Wallet.mnemonicPassphraseKey(walletId: info.walletId), + value: password, + ); + + await secureStorageInterface.write( + key: '${walletId}_wallet', + value: 'true', + ); + + await secureStorageInterface.write( + key: '_${walletId}_needs_creation', + value: 'true', + ); + } - await secureStorageInterface.write( - key: '${walletId}_wallet', - value: wallet, - ); + Future _restoreWallet() async { + final String password = generatePassword(); - _wallet = wallet; - } else { - try { + await secureStorageInterface.write( + key: Wallet.mnemonicPassphraseKey(walletId: info.walletId), + value: password, + ); - final String name = walletId; - final password = - await secureStorageInterface.read(key: '${walletId}_password'); + await secureStorageInterface.write( + key: '${walletId}_wallet', + value: 'true', + ); - final wallet = await x_wallet.openXelisWallet( - name: name, - password: password, - network: cryptoCurrency.network.xelisNetwork, - precomputedTables: encodedTables, - ); + await secureStorageInterface.write( + key: '_${walletId}_needs_restoration', + value: 'true', + ); - await secureStorageInterface.write( - key: '${walletId}_wallet', - value: wallet, - ); + if (libXelisWallet != null) { + await super.exit(); + } + } - _wallet = wallet; - } catch (e, s) { - // do nothing, still allow user into wallet - } - } + @override + Future recover({required bool isRescan}) async { + if (isRescan) { + await refreshMutex.protect(() async { + await mainDB.deleteWalletBlockchainData(walletId); + await updateTransactions(isRescan: true, topoheight: 0); + }); + return; + } - // Creation or Opening of Xelis wallets will generate tables if required - // Make sure to store said shared tables if we make it this far, to save - // time in the future - if (encodedTables == null) { - await secureStorageInterface.write( - key: 'xelis_precomputed_tables', - value: x_wallet.getCachedTable(), - ); - } - } + // Borrowed from libmonero for now, need to refactor for Xelis view keys + // if (isViewOnly) { + // await recoverViewOnly(); + // return; + // } - return await super.init(); + try { + await open(); + } catch (e, s) { + Logging.instance.log( + "Exception rethrown from recoverFromMnemonic(): $e\n$s", + level: LogLevel.Error, + ); + rethrow; + } } + @override Future pingCheck() async { - _checkInitialized(); + checkInitialized(); try { - await _wallet!.getDaemonInfo(); + await libXelisWallet!.getDaemonInfo(); return true; } catch (_) { return false; } } + final _balanceUpdateMutex = Mutex(); + @override - Future updateBalance() async { - try { - final BigInt xelBalance = await _wallet!.getXelisBalanceRaw(); // in the future, use getAssetBalances and handle each - final balance = Balance( - total: Amount( - rawValue: xelBalance, - fractionDigits: cryptoCurrency.fractionDigits, - ), - spendable: Amount( - rawValue: xelBalance, - fractionDigits: cryptoCurrency.fractionDigits, - ), - blockedTotal: Amount.zeroWith( - fractionDigits: cryptoCurrency.fractionDigits, - ), - pendingSpendable: Amount.zeroWith( - fractionDigits: cryptoCurrency.fractionDigits, - ), - ); - await info.updateBalance( - newBalance: balance, - isar: mainDB.isar, - ); - } catch (e, s) { - } + Future updateBalance({int? newBalance}) async { + await _balanceUpdateMutex.protect(() async { + try { + if (await libXelisWallet!.hasXelisBalance()) { + final BigInt xelBalance = newBalance != null + ? BigInt.from(newBalance) + : await libXelisWallet!.getXelisBalanceRaw(); // in the future, use getAssetBalances and handle each + final balance = Balance( + total: Amount( + rawValue: xelBalance, + fractionDigits: cryptoCurrency.fractionDigits, + ), + spendable: Amount( + rawValue: xelBalance, + fractionDigits: cryptoCurrency.fractionDigits, + ), + blockedTotal: Amount.zeroWith( + fractionDigits: cryptoCurrency.fractionDigits, + ), + pendingSpendable: Amount.zeroWith( + fractionDigits: cryptoCurrency.fractionDigits, + ), + ); + await info.updateBalance( + newBalance: balance, + isar: mainDB.isar, + ); + } + } catch (e, s) { + Logging.instance.log( + "Error in updateBalance(): $e\n$s", + level: LogLevel.Warning, + ); + } + }); + } + + Future _fetchChainHeight() async { + final infoString = await libXelisWallet!.getDaemonInfo(); + final Map nodeInfo = json.decode(infoString); + return int.parse(nodeInfo['topoheight'].toString()); } @override - Future updateChainHeight() async { + Future updateChainHeight({int? topoheight}) async { try { - final infoString = await _wallet!.getDaemonInfo(); - - final Map nodeInfo = json.decode(infoString); + final height = topoheight ?? await _fetchChainHeight(); - final int topoheight = nodeInfo['topoheight'] as int; - await info.updateCachedChainHeight( - newHeight: topoheight, + newHeight: height.toInt(), isar: mainDB.isar, ); } catch (e, s) { - print('Error updating chain height: $e'); - print('Stack trace: $s'); + Logging.instance.log( + "Error in updateChainHeight(): $e\n$s", + level: LogLevel.Warning, + ); } } @override Future updateNode() async { - // do nothing + try { + final node = getCurrentNode(); + await libXelisWallet?.offlineMode(); + await libXelisWallet!.onlineMode( + daemonAddress: node.host + ); + } catch (e, s) { + Logging.instance.log( + "Error updating node: $e\n$s", + level: LogLevel.Error, + ); + rethrow; + } } @override - Future> updateTransactions({bool isRescan = false}) async { - _checkInitialized(); + Future> updateTransactions({ + bool isRescan = false, + List? rawTransactions, + int? topoheight, + }) async { + checkInitialized(); + + final newReceivingAddress = await getCurrentReceivingAddress() ?? + Address( + walletId: walletId, + derivationIndex: 0, + derivationPath: null, + value: libXelisWallet!.getAddressStr(), + publicKey: [], + type: AddressType.xelis, + subType: AddressSubType.receiving, + ); + final thisAddress = newReceivingAddress.value; + int firstBlock = 0; if (!isRescan) { firstBlock = await mainDB.isar.transactionV2s @@ -234,17 +289,18 @@ class XelisWallet extends Wallet { // add some buffer firstBlock -= 10; } + } else { + await libXelisWallet!.rescan(topoheight: BigInt.from(topoheight!)); } - await _wallet!.rescan(topoheight: firstBlock as BigInt); - final txListJson = await _wallet!.allHistory(); + final txListJson = rawTransactions ?? await libXelisWallet!.allHistory(); final List txns = []; for (final jsonString in txListJson) { try { final transactionEntry = xelis_sdk.TransactionEntry.fromJson(json.decode(jsonString)); - + // Check for duplicates final storedTx = await mainDB.isar.transactionV2s .where() @@ -259,26 +315,49 @@ class XelisWallet extends Wallet { final List outputs = []; final List inputs = []; - TransactionType txType; + TransactionType? txType; TransactionSubType txSubType = TransactionSubType.none; int? nonce; - Amount? fee; + Amount fee = Amount( + rawValue: BigInt.zero, + fractionDigits: cryptoCurrency.fractionDigits + ); Map otherData = {}; - final entryData = transactionEntry.txEntryType; + final entryType = transactionEntry.txEntryType; - if (entryData is xelis_sdk.CoinbaseEntry) { - final coinbase = entryData; + if (entryType is xelis_sdk.CoinbaseEntry) { + final coinbase = entryType; txType = TransactionType.incoming; + + final int decimals = await libXelisWallet!.getAssetDecimals( + asset: xelis_sdk.xelisAsset + ); + + fee = Amount( + rawValue: BigInt.zero, + fractionDigits: decimals + ); + outputs.add(OutputV2.isarCantDoRequiredInDefaultConstructor( - scriptPubKeyHex: "00", + scriptPubKeyHex: "", valueStringSats: coinbase.reward.toString(), addresses: [thisAddress], walletOwns: true, )); - } else if (entryData is xelis_sdk.BurnEntry) { - final burn = entryData; + } else if (entryType is xelis_sdk.BurnEntry) { + final burn = entryType; txType = TransactionType.outgoing; + + final int decimals = await libXelisWallet!.getAssetDecimals( + asset: burn.asset + ); + + fee = Amount( + rawValue: BigInt.from(burn.fee), + fractionDigits: decimals + ); + inputs.add(InputV2.isarCantDoRequiredInDefaultConstructor( scriptSigAsm: null, scriptSigHex: null, @@ -292,21 +371,26 @@ class XelisWallet extends Wallet { walletOwns: true, )); otherData['burnAsset'] = burn.asset; - } else if (entryData is xelis_sdk.IncomingEntry) { - final incoming = entryData; + } else if (entryType is xelis_sdk.IncomingEntry) { + final incoming = entryType; txType = incoming.from == thisAddress ? TransactionType.sentToSelf : TransactionType.incoming; for (final transfer in incoming.transfers) { - final int decimals = await _wallet!.getAssetDecimals( + final int decimals = await libXelisWallet!.getAssetDecimals( asset: transfer.asset ); + fee = Amount( + rawValue: BigInt.zero, + fractionDigits: decimals + ); + outputs.add(OutputV2.isarCantDoRequiredInDefaultConstructor( - scriptPubKeyHex: "00", + scriptPubKeyHex: "", valueStringSats: transfer.amount.toString(), - addresses: [thisAddress], + addresses: [incoming.from], walletOwns: true, )); otherData['asset_${transfer.asset}'] = transfer.amount.toString(); @@ -314,34 +398,41 @@ class XelisWallet extends Wallet { otherData['extraData_${transfer.asset}'] = transfer.extraData!.toJson(); } } - } else if (entryData is xelis_sdk.OutgoingEntry) { - final outgoing = entryData; + } else if (entryType is xelis_sdk.OutgoingEntry) { + final outgoing = entryType; txType = TransactionType.outgoing; nonce = outgoing.nonce; - fee = Amount( - rawValue: BigInt.from(outgoing.fee), - fractionDigits: decimals - ); for (final transfer in outgoing.transfers) { - final int decimals = await _wallet!.getAssetDecimals( + final int decimals = await libXelisWallet!.getAssetDecimals( asset: transfer.asset ); - outputs.add(OutputV2.isarCantDoRequiredInDefaultConstructor( - scriptPubKeyHex: "00", - valueStringSats: transfer.amount.toString(), + fee = Amount( + rawValue: BigInt.from(outgoing.fee), + fractionDigits: decimals + ); + + inputs.add(InputV2.isarCantDoRequiredInDefaultConstructor( + scriptSigHex: null, + scriptSigAsm: null, + sequence: null, + outpoint: null, addresses: [transfer.destination], - walletOwns: transfer.destination == thisAddress, + valueStringSats: (transfer.amount + outgoing.fee).toString(), + witness: null, + innerRedeemScriptAsm: null, + coinbase: null, + walletOwns: true, )); - otherData['asset_${transfer.asset}'] = transfer.amount.toString(); + otherData['asset_${transfer.asset}_amount'] = transfer.amount.toString(); + otherData['asset_${transfer.asset}_fee'] = fee.toString(); if (transfer.extraData != null) { otherData['extraData_${transfer.asset}'] = transfer.extraData!.toJson(); } } } else { // Skip unknown entry types - return; } final txn = TransactionV2( @@ -354,7 +445,7 @@ class XelisWallet extends Wallet { inputs: List.unmodifiable(inputs), outputs: List.unmodifiable(outputs), version: -1, // Version not provided - type: txType, + type: txType!, subType: txSubType, otherData: jsonEncode({ ...otherData, @@ -363,10 +454,21 @@ class XelisWallet extends Wallet { }), ); + Logging.instance.log( + "Entry done ${entryType.toString()}", + level: LogLevel.Debug, + ); + + txns.add(txn); } catch (e, s) { + Logging.instance.log( + "Error handling tx $jsonString: $e\n$s", + level: LogLevel.Warning, + ); } } + await updateBalance(); await mainDB.updateOrPutTransactionV2s(txns); return txns.map((e) => e.txid).toList(); @@ -392,81 +494,149 @@ class XelisWallet extends Wallet { FilterGroup.and(standardReceivingAddressFilters); @override - Future prepareSend({required TxData txData}) async { - try { - _checkInitialized(); - - // Validate recipients - if (txData.recipients == null || txData.recipients!.length != 1) { - throw Exception("$runtimeType prepareSend requires 1 recipient"); - } - - final recipient = txData.recipients!.first; - final Amount sendAmount = recipient.amount; - final asset = cryptoCurrency.assetId ?? xelis_sdk.xelisAsset; + Future get fees async { + // TODO: implement _getFees... maybe + return FeeObject( + numberOfBlocksFast: 10, + numberOfBlocksAverage: 10, + numberOfBlocksSlow: 10, + fast: 1, + medium: 1, + slow: 1, + ); + } - final sendAmountStr = await _wallet!.formatCoin( - atomicAmount: sendAmount.rawValue, - assetHash: asset + @override + Future prepareSend({required TxData txData, String? assetId}) async { + try { + checkInitialized(); + + // Use default address if recipients list is empty + final recipients = txData.recipients?.isNotEmpty == true + ? txData.recipients! + : [( + address: 'xel:xz9574c80c4xegnvurazpmxhw5dlg2n0g9qm60uwgt75uqyx3pcsqzzra9m', + amount: Amount.zeroWith( + fractionDigits: cryptoCurrency.fractionDigits, + ), + isChange: false + )]; + + final asset = assetId ?? xelis_sdk.xelisAsset; + + // Calculate total send amount + final totalSendAmount = recipients.fold( + Amount(rawValue: BigInt.zero, fractionDigits: cryptoCurrency.fractionDigits), + (sum, recipient) => sum + recipient.amount ); // Check balance using raw method - final xelBalance = await _wallet!.getXelisBalanceRaw(); + final xelBalance = await libXelisWallet!.getXelisBalanceRaw(); final balance = Amount( rawValue: xelBalance, - fractionDigits: cryptoCurrency.fractionDigits, // needs to become tied to asset - ); - - // Create transfers for fee estimation - final transfers = [ - x_wallet.Transfer( - floatAmount: sendAmountStr as double, - strAddress: recipient.address, - assetHash: asset, - ) - ]; - - // Estimate fees - final estimatedFeeString = await _wallet!.estimateFees(transfers: transfers); - final feeAmount = Amount( - rawValue: BigInt.parse(estimatedFeeString), fractionDigits: cryptoCurrency.fractionDigits, ); - // Apply fee multiplier - final feeMultiplier = txData.feeRateAmount ?? 1.0; - final boostedFee = Amount( - rawValue: (BigInt.from((feeAmount.raw * - BigInt.from((feeMultiplier * 100).toInt())) / - BigInt.from(100))), - fractionDigits: cryptoCurrency.fractionDigits, + // Estimate fee using the shared method + final boostedFee = await estimateFeeFor( + totalSendAmount, + 1, + feeMultiplier: 1.0, + recipients: recipients, + assetId: asset, ); - // Check if we have enough for both transfer and fee - if (sendAmount + boostedFee > balance) { - final requiredAmt = await _wallet!.formatCoin( - atomicAmount: (sendAmount + boostedFee).rawValue, + // Check if we have enough for both transfers and fee + if (totalSendAmount + boostedFee > balance) { + final requiredAmt = await libXelisWallet!.formatCoin( + atomicAmount: (totalSendAmount + boostedFee).raw, assetHash: asset ); - final availableAmt = await _wallet!.formatCoin( + final availableAmt = await libXelisWallet!.formatCoin( atomicAmount: xelBalance, assetHash: asset ); throw Exception( - "Insufficient balance to cover transfer and fees. " + "Insufficient balance to cover transfers and fees. " "Required: $requiredAmt, Available: $availableAmt" ); } return txData.copyWith( fee: boostedFee, - otherData: { + otherData: jsonEncode({ 'asset': asset, - }, + }), ); } catch (e, s) { + Logging.instance.log( + "Exception rethrown from prepareSend(): $e\n$s", + level: LogLevel.Error, + ); + rethrow; + } + } + + @override + Future estimateFeeFor( + Amount amount, + int feeRate, + { + double? feeMultiplier, + List recipients = const [], + String? assetId + } + ) async { + try { + checkInitialized(); + final asset = assetId ?? xelis_sdk.xelisAsset; + + // // Use default address if recipients list is empty + // final effectiveRecipients = recipients.isNotEmpty + // ? recipients + // : [( + // address: 'xel:xz9574c80c4xegnvurazpmxhw5dlg2n0g9qm60uwgt75uqyx3pcsqzzra9m', + // amount: amount, + // isChange: false + // )]; + + // final transfers = await Future.wait( + // effectiveRecipients.map((recipient) async { + // final amountStr = await libXelisWallet!.formatCoin( + // atomicAmount: recipient.amount.raw, + // assetHash: asset + // ); + // return x_wallet.Transfer( + // floatAmount: amountStr as double, + // strAddress: recipient.address, + // assetHash: asset, + // ); + // }) + // ); + + // // Estimate fees + // final estimatedFeeString = await libXelisWallet!.estimateFees(transfers: transfers); + // final feeAmount = Amount( + // rawValue: BigInt.parse(estimatedFeeString), + // fractionDigits: cryptoCurrency.fractionDigits, + // ); + + // // Apply fee multiplier + // final multiplier = feeMultiplier ?? 1.0; + return Amount( + // rawValue: (BigInt.from((feeAmount.raw * + // BigInt.from((multiplier * 100).toInt())) / + // BigInt.from(100))), + rawValue: BigInt.zero, + fractionDigits: cryptoCurrency.fractionDigits, + ); + } catch (e, s) { + Logging.instance.log( + "Exception rethrown from estimateFeeFor(): $e\n$s", + level: LogLevel.Error, + ); rethrow; } } @@ -474,7 +644,7 @@ class XelisWallet extends Wallet { @override Future confirmSend({required TxData txData}) async { try { - _checkInitialized(); + checkInitialized(); // Validate recipients if (txData.recipients == null || txData.recipients!.length != 1) { @@ -483,17 +653,16 @@ class XelisWallet extends Wallet { final recipient = txData.recipients!.first; final Amount sendAmount = recipient.amount; - final asset = txData.otherData?['asset'] ?? xelis_sdk.xelisAsset; - String txHash; + final asset = (txData.getOtherData != null ? jsonDecode(txData.getOtherData!) : null)?['asset'] ?? xelis_sdk.xelisAsset; - final amt = await _wallet!.formatCoin( - atomicAmount: recipient.amount as BigInt, + final amt = double.parse(await libXelisWallet!.formatCoin( + atomicAmount: sendAmount.raw, assetHash: asset - ) as double; + )); // Create a transfer transaction - final txJson = await _wallet!.createTransfersTransaction( + final txJson = await libXelisWallet!.createTransfersTransaction( transfers: [ x_wallet.Transfer( floatAmount: amt, @@ -504,39 +673,170 @@ class XelisWallet extends Wallet { ] ); - final tx = x_wallet.TransactionSummary.fromJson(txJson); + final txMap = jsonDecode(txJson); + final txHash = txMap['hash'] as String; // Broadcast the transaction - await _wallet!.broadcastTransaction(txHash: tx.hash); + await libXelisWallet!.broadcastTransaction(txHash: txHash); return await updateSentCachedTxData(txData: txData.copyWith( - txid: tx.hash, + txid: txHash, )); } catch (e, s) { + Logging.instance.log( + "Exception rethrown from confirmSend(): $e\n$s", + level: LogLevel.Error, + ); rethrow; } } @override - Future recover({required bool isRescan}) async { - await refreshMutex.protect(() async { - if (isRescan) { - await mainDB.deleteWalletBlockchainData(walletId); - await checkSaveInitialReceivingAddress(); - await updateBalance(); - await updateTransactions(isRescan: true); - } else { - await checkSaveInitialReceivingAddress(); - unawaited(updateBalance()); - unawaited(updateTransactions()); + Future handleEvent(Event event) async { + try { + switch (event) { + case NewTopoheight(:final height): + await handleNewTopoHeight(height); + case NewAsset(:final asset): + await handleNewAsset(asset); + case NewTransaction(:final transaction): + await handleNewTransaction(transaction); + case BalanceChanged(:final event): + await handleBalanceChanged(event); + case Rescan(:final startTopoheight): + await handleRescan(startTopoheight); + case Online(): + await handleOnline(); + case Offline(): + await handleOffline(); + case HistorySynced(:final topoheight): + await handleHistorySynced(topoheight); + } + } catch (e, s) { + Logging.instance.log( + "Error handling wallet event: $e\n$s", + level: LogLevel.Error, + ); + } + } + + @override + Future handleNewTopoHeight(int height) async { + await info.updateCachedChainHeight( + newHeight: height, + isar: mainDB.isar, + ); + } + + @override + Future handleNewTransaction(xelis_sdk.TransactionEntry tx) async { + try { + final txListJson = [jsonEncode(tx.toString())]; + final newTxIds = await updateTransactions( + isRescan: false, + rawTransactions: txListJson, + ); + + await updateBalance(); + + Logging.instance.log( + "New transaction processed: ${newTxIds.first}", + level: LogLevel.Info, + ); + } catch (e, s) { + Logging.instance.log( + "Error handling new transaction: $e\n$s", + level: LogLevel.Warning, + ); + } + } + + @override + Future handleBalanceChanged(xelis_sdk.BalanceChangedEvent event) async { + try { + final asset = event.assetHash; + if (asset == xelis_sdk.xelisAsset) { + await updateBalance(newBalance: event.balance); } + + // TODO: Update asset balances if needed + } catch (e, s) { + Logging.instance.log( + "Error handling balance change: $e\n$s", + level: LogLevel.Warning, + ); + } + } + + @override + Future handleRescan(int startTopoheight) async { + await refreshMutex.protect(() async { + await mainDB.deleteWalletBlockchainData(walletId); + await updateTransactions(isRescan: true, topoheight: startTopoheight); + await updateBalance(); }); } @override - Future exit() async { - timer?.cancel(); - timer = null; - await super.exit(); + Future handleOnline() async { + GlobalEventBus.instance.fire( + WalletSyncStatusChangedEvent( + WalletSyncStatus.synced, + walletId, + info.coin, + ), + ); + unawaited(refresh()); + } + + @override + Future handleOffline() async { + GlobalEventBus.instance.fire( + WalletSyncStatusChangedEvent( + WalletSyncStatus.unableToSync, + walletId, + info.coin, + ), + ); + } + + @override + Future handleHistorySynced(int topoheight) async { + await updateChainHeight(); + await updateBalance(); + await updateTransactions(); + GlobalEventBus.instance.fire( + WalletSyncStatusChangedEvent( + WalletSyncStatus.synced, + walletId, + info.coin, + ), + ); + } + + @override + Future handleNewAsset(xelis_sdk.AssetData asset) async { + // TODO: Store asset information if needed + // TODO: Update UI/state for new asset + Logging.instance.log( + "New asset detected: ${asset}", + level: LogLevel.Info, + ); + } + + @override + Future refresh({int? topoheight}) async { + await refreshMutex.protect(() async { + try { + await updateChainHeight(topoheight: topoheight); + await updateBalance(); + await updateTransactions(); + } catch (e, s) { + Logging.instance.log( + "Error in refresh(): $e\n$s", + level: LogLevel.Warning, + ); + } + }); } } \ No newline at end of file diff --git a/lib/wallets/wallet/intermediate/cryptonote_wallet.dart b/lib/wallets/wallet/intermediate/cryptonote_wallet.dart index 131bf8f04..0d32e07a3 100644 --- a/lib/wallets/wallet/intermediate/cryptonote_wallet.dart +++ b/lib/wallets/wallet/intermediate/cryptonote_wallet.dart @@ -2,8 +2,9 @@ import '../../crypto_currency/intermediate/cryptonote_currency.dart'; import '../wallet.dart'; import '../wallet_mixin_interfaces/coin_control_interface.dart'; import '../wallet_mixin_interfaces/mnemonic_interface.dart'; +import 'external_wallet.dart'; -abstract class CryptonoteWallet extends Wallet +abstract class CryptonoteWallet extends ExternalWallet with MnemonicInterface, CoinControlInterface { CryptonoteWallet(super.currency); } diff --git a/lib/wallets/wallet/intermediate/external_wallet.dart b/lib/wallets/wallet/intermediate/external_wallet.dart new file mode 100644 index 000000000..e5ce6b39b --- /dev/null +++ b/lib/wallets/wallet/intermediate/external_wallet.dart @@ -0,0 +1,12 @@ +import '../../crypto_currency/crypto_currency.dart'; +import '../wallet.dart'; + +// anstract class to be fleshed out for the standardization of wallet implementations +// that rely on bridged code libraries outside, or external native wallet functions +abstract class ExternalWallet extends Wallet { + ExternalWallet(super.currency); + + // wallet opening and initialization separated to prevent db lock collision errors + // must be overridden + Future open(); +} diff --git a/lib/wallets/wallet/intermediate/lib_monero_wallet.dart b/lib/wallets/wallet/intermediate/lib_monero_wallet.dart index 5d176ec7d..b6b30de34 100644 --- a/lib/wallets/wallet/intermediate/lib_monero_wallet.dart +++ b/lib/wallets/wallet/intermediate/lib_monero_wallet.dart @@ -190,6 +190,7 @@ abstract class LibMoneroWallet } } + @override Future open() async { bool wasNull = false; diff --git a/lib/wallets/wallet/intermediate/lib_xelis_wallet.dart b/lib/wallets/wallet/intermediate/lib_xelis_wallet.dart new file mode 100644 index 000000000..26cf77842 --- /dev/null +++ b/lib/wallets/wallet/intermediate/lib_xelis_wallet.dart @@ -0,0 +1,563 @@ +import 'package:isar/isar.dart'; +import '../../../models/isar/models/blockchain_data/address.dart'; +import '../../crypto_currency/intermediate/electrum_currency.dart'; +import '../wallet.dart'; +import '../wallet_mixin_interfaces/mnemonic_interface.dart'; + +import 'package:freezed_annotation/freezed_annotation.dart'; +import 'package:json_annotation/json_annotation.dart'; + +import 'dart:async'; +import 'dart:convert'; +import 'dart:io'; + +import 'package:decimal/decimal.dart'; +import 'package:flutter/foundation.dart'; +import 'package:isar/isar.dart'; + +import 'package:xelis_flutter/src/api/network.dart' as x_network; +import 'package:xelis_flutter/src/api/wallet.dart' as x_wallet; +import 'package:xelis_dart_sdk/xelis_dart_sdk.dart' as xelis_sdk; + +import 'package:path_provider/path_provider.dart'; +import 'package:path/path.dart' as path; + +import '../../../utilities/stack_file_system.dart'; +import '../../../models/isar/models/blockchain_data/transaction.dart'; +import '../../../models/isar/models/blockchain_data/v2/input_v2.dart'; +import '../../../models/isar/models/blockchain_data/v2/output_v2.dart'; +import '../../../models/isar/models/blockchain_data/v2/transaction_v2.dart'; + +import '../../../models/node_model.dart'; +import '../../../models/paymint/fee_object_model.dart'; +import '../../../models/balance.dart'; +import '../../../utilities/amount/amount.dart'; +import '../../../utilities/logger.dart'; +import '../../crypto_currency/crypto_currency.dart'; +import '../../models/tx_data.dart'; + +import 'package:isar/isar.dart'; +import 'package:mutex/mutex.dart'; +import 'package:stack_wallet_backup/generate_password.dart'; +import 'package:web_socket_channel/web_socket_channel.dart'; + +import 'external_wallet.dart'; + +enum XelisTableSize { + low, + full; + + bool get isLow => this == XelisTableSize.low; + + static XelisTableSize get platformDefault { + if (kIsWeb) { + return XelisTableSize.low; + } + return XelisTableSize.full; + } +} + +class XelisTableState { + final bool isGenerating; + final XelisTableSize currentSize; + final XelisTableSize _desiredSize; + + XelisTableSize get desiredSize { + if (kIsWeb) { + return XelisTableSize.low; + } + return _desiredSize; + } + + const XelisTableState({ + this.isGenerating = false, + this.currentSize = XelisTableSize.low, + XelisTableSize desiredSize = XelisTableSize.full, + }) : _desiredSize = desiredSize; + + XelisTableState copyWith({ + bool? isGenerating, + XelisTableSize? currentSize, + XelisTableSize? desiredSize, + }) { + return XelisTableState( + isGenerating: isGenerating ?? this.isGenerating, + currentSize: currentSize ?? this.currentSize, + desiredSize: kIsWeb ? XelisTableSize.low : (desiredSize ?? this._desiredSize), + ); + } + + factory XelisTableState.fromJson(Map json) { + return XelisTableState( + isGenerating: json['isGenerating'] as bool, + currentSize: XelisTableSize.values[json['currentSize'] as int], + desiredSize: XelisTableSize.values[json['desiredSize'] as int], + ); + } + + Map toJson() => { + 'isGenerating': isGenerating, + 'currentSize': currentSize.index, + 'desiredSize': _desiredSize.index, + }; +} + +extension XelisNetworkConversion on CryptoCurrencyNetwork { + x_network.Network get xelisNetwork { + switch (this) { + case CryptoCurrencyNetwork.main: + return x_network.Network.mainnet; + case CryptoCurrencyNetwork.test: + return x_network.Network.testnet; + default: + throw ArgumentError('Unsupported network type for Xelis: $this'); + } + } +} + +extension CryptoCurrencyNetworkConversion on x_network.Network { + CryptoCurrencyNetwork get cryptoCurrencyNetwork { + switch (this) { + case x_network.Network.mainnet: + return CryptoCurrencyNetwork.main; + case x_network.Network.testnet: + return CryptoCurrencyNetwork.test; + default: + throw ArgumentError('Unsupported Xelis network type: $this'); + } + } +} + +sealed class Event { + const Event(); +} + +final class NewTopoheight extends Event { + final int height; + const NewTopoheight(this.height); +} + +final class NewAsset extends Event { + final xelis_sdk.AssetData asset; + const NewAsset(this.asset); +} + +final class NewTransaction extends Event { + final xelis_sdk.TransactionEntry transaction; + const NewTransaction(this.transaction); +} + +final class BalanceChanged extends Event { + final xelis_sdk.BalanceChangedEvent event; + const BalanceChanged(this.event); +} + +final class Rescan extends Event { + final int startTopoheight; + const Rescan(this.startTopoheight); +} + +final class Online extends Event { + const Online(); +} + +final class Offline extends Event { + const Offline(); +} + +final class HistorySynced extends Event { + final int topoheight; + const HistorySynced(this.topoheight); +} + +abstract class LibXelisWallet extends ExternalWallet + with MnemonicInterface { + LibXelisWallet(super.currency); + + static const String _kHasFullTablesKey = 'xelis_has_full_tables'; + static const String _kGeneratingTablesKey = 'xelis_generating_tables'; + static const String _kWantsFullTablesKey = 'xelis_wants_full_tables'; + static bool _isAnyWalletGeneratingTables = false; + static final _initMutex = Mutex(); + static final _tableGenerationMutex = Mutex(); + static Completer? _tableGenerationCompleter; + + x_wallet.XelisWallet? libXelisWallet; + + x_wallet.XelisWallet? get wallet => libXelisWallet; + set wallet(x_wallet.XelisWallet? newWallet) { + if (newWallet == null && libXelisWallet != null) { + throw StateError('Cannot set wallet to null after initialization'); + } + libXelisWallet = newWallet; + } + + void checkInitialized() { + if (libXelisWallet == null) { + throw StateError('libXelisWallet not initialized'); + } + } + + final syncMutex = Mutex(); + NodeModel? _xelisNode; + Timer? timer; + String? tablePath; + + StreamSubscription? _eventSubscription; + + Future getPrecomputedTablesPath() async { + final appDir = await StackFileSystem.applicationRootDirectory(); + // Create a subdirectory for the tables + final tablePath = path.join(appDir.path, 'xelis', 'tables/'); + return tablePath; + } + + Future getTableState() async { + final hasFullTables = await secureStorageInterface.read(key: _kHasFullTablesKey) == 'true'; + final isGenerating = await secureStorageInterface.read(key: _kGeneratingTablesKey) == 'true'; + final wantsFull = await secureStorageInterface.read(key: _kWantsFullTablesKey) != 'false'; + + return XelisTableState( + isGenerating: isGenerating, + currentSize: hasFullTables ? XelisTableSize.full : XelisTableSize.low, + desiredSize: wantsFull ? XelisTableSize.full : XelisTableSize.low, + ); + } + + Future setTableState(XelisTableState state) async { + await secureStorageInterface.write( + key: _kHasFullTablesKey, + value: state.currentSize == XelisTableSize.full ? 'true' : 'false', + ); + await secureStorageInterface.write( + key: _kGeneratingTablesKey, + value: state.isGenerating ? 'true' : 'false', + ); + await secureStorageInterface.write( + key: _kWantsFullTablesKey, + value: state.desiredSize == XelisTableSize.full ? 'true' : 'false', + ); + } + + Stream convertRawEvents() async* { + checkInitialized(); + final rawEventStream = libXelisWallet!.eventsStream(); + + await for (final rawData in rawEventStream) { + final json = jsonDecode(rawData); + try { + final eventType = xelis_sdk.WalletEvent.fromStr(json['event'] as String); + switch (eventType) { + case xelis_sdk.WalletEvent.newTopoHeight: + yield NewTopoheight(json['data']['topoheight'] as int); + case xelis_sdk.WalletEvent.newAsset: + yield NewAsset( + xelis_sdk.AssetData.fromJson(json['data'] as Map)); + case xelis_sdk.WalletEvent.newTransaction: + yield NewTransaction( + xelis_sdk.TransactionEntry.fromJson( + json['data'] as Map)); + case xelis_sdk.WalletEvent.balanceChanged: + yield BalanceChanged( + xelis_sdk.BalanceChangedEvent.fromJson( + json['data'] as Map)); + case xelis_sdk.WalletEvent.rescan: + yield Rescan(json['data']['start_topoheight'] as int); + case xelis_sdk.WalletEvent.online: + yield const Online(); + case xelis_sdk.WalletEvent.offline: + yield const Offline(); + case xelis_sdk.WalletEvent.historySynced: + yield HistorySynced(json['data']['topoheight'] as int); + } + } catch (e, s) { + Logging.instance.log( + "Error processing wallet event: $e\n$s", + level: LogLevel.Error, + ); + continue; + } + } + } + + Future handleEvent(Event event) async {} + Future handleNewTopoHeight(int height); + Future handleNewTransaction(xelis_sdk.TransactionEntry tx); + Future handleBalanceChanged(xelis_sdk.BalanceChangedEvent event); + Future handleRescan(int startTopoheight) async {} + Future handleOnline() async {} + Future handleOffline() async {} + Future handleHistorySynced(int topoheight) async {} + Future handleNewAsset(xelis_sdk.AssetData asset) async {} + + Future refresh({int? topoheight}); + + Future connect() async { + try { + _eventSubscription = + convertRawEvents().listen(handleEvent); + + final node = getCurrentNode(); + Logging.instance.log( + "Connecting to node: ${node.host}", + level: LogLevel.Info, + ); + await libXelisWallet!.onlineMode( + daemonAddress: node.host + ); + await super.refresh(); + } catch (e, s) { + Logging.instance.log( + "Error connecting to node: $e\n$s", + level: LogLevel.Error, + ); + rethrow; + } + } + + List get standardReceivingAddressFilters => [ + FilterCondition.equalTo( + property: r"type", + value: info.mainAddressType, + ), + const FilterCondition.equalTo( + property: r"subType", + value: AddressSubType.receiving, + ), + ]; + + List get standardChangeAddressFilters => [ + FilterCondition.equalTo( + property: r"type", + value: info.mainAddressType, + ), + const FilterCondition.equalTo( + property: r"subType", + value: AddressSubType.change, + ), + ]; + + @override + Future open() async { + bool wasNull = false; + + if (libXelisWallet == null) { + wasNull = true; + final tablePath = await getPrecomputedTablesPath(); + final tableState = await getTableState(); + final String name = walletId; + final password = await secureStorageInterface.read( + key: Wallet.mnemonicPassphraseKey(walletId: info.walletId), + ); + + await LibXelisWallet._initMutex.protect(() async { + try { + final needsCreation = await secureStorageInterface.read( + key: '_${walletId}_needs_creation', + ); + + final needsRestoration = await secureStorageInterface.read( + key: '_${walletId}_needs_restoration', + ); + + libXelisWallet = await syncMutex.protect(() async { + if (needsCreation == 'true') { + debugPrint("Xelis: creating new wallet"); + final wallet = await x_wallet.createXelisWallet( + name: name, + password: password!, + network: cryptoCurrency.network.xelisNetwork, + precomputedTablesPath: tablePath, + l1Low: tableState.currentSize.isLow + ); + + final mnemonic = await wallet.getSeed(); + await secureStorageInterface.write( + key: Wallet.mnemonicKey(walletId: walletId), + value: mnemonic.trim(), + ); + + await secureStorageInterface.delete( + key: '_${walletId}_needs_creation', + ); + + return wallet; + } else if (needsRestoration == 'true') { + final mnemonic = await getMnemonic(); + final seedLength = mnemonic.trim().split(" ").length; + + invalidSeedLengthCheck(seedLength); + + debugPrint("Xelis: recovering wallet"); + final wallet = await x_wallet.createXelisWallet( + name: name, + password: password!, + seed: mnemonic.trim(), + network: cryptoCurrency.network.xelisNetwork, + precomputedTablesPath: tablePath, + l1Low: tableState.currentSize.isLow + ); + + await secureStorageInterface.write( + key: Wallet.mnemonicKey(walletId: walletId), + value: mnemonic.trim(), + ); + + await secureStorageInterface.delete( + key: '_${walletId}_needs_restoration', + ); + + return wallet; + } else { + debugPrint("Xelis: opening existing wallet"); + return await x_wallet.openXelisWallet( + name: name, + password: password!, + network: cryptoCurrency.network.xelisNetwork, + precomputedTablesPath: tablePath, + l1Low: tableState.currentSize.isLow, + ); + } + }); + } catch (e, s) { + Logging.instance.log( + "Failed to open/create wallet: $e\n$s", + level: LogLevel.Error, + ); + rethrow; + } + }); + } + + if (await isTableUpgradeAvailable()) { + unawaited(updateTablesToDesiredSize()); + } + + final newReceivingAddress = await getCurrentReceivingAddress() ?? + Address( + walletId: walletId, + derivationIndex: 0, + derivationPath: null, + value: libXelisWallet!.getAddressStr(), + publicKey: [], + type: AddressType.xelis, + subType: AddressSubType.receiving, + ); + await mainDB.updateOrPutAddresses([newReceivingAddress]); + + if (info.cachedReceivingAddress != newReceivingAddress.value) { + await info.updateReceivingAddress( + newAddress: newReceivingAddress.value, + isar: mainDB.isar, + ); + } + + if (wasNull) { + try { + await connect(); + } catch (e) { + Logging.instance.log( + "Failed to start sync: $e", + level: LogLevel.Error, + ); + rethrow; + } + } + + unawaited(refresh()); + } + + @override + Future exit() async { + await refreshMutex.protect(() async { + timer?.cancel(); + timer = null; + + await _eventSubscription?.cancel(); + _eventSubscription = null; + + await libXelisWallet?.offlineMode(); + libXelisWallet?.dispose(); + libXelisWallet = null; + + await super.exit(); + }); + } + + void invalidSeedLengthCheck(int length) { + if (!(length == 25)) { + throw Exception("Invalid Xelis mnemonic length found: $length"); + } + } +} + +extension XelisTableManagement on LibXelisWallet { + Future isTableUpgradeAvailable() async { + if (kIsWeb) return false; + + final state = await getTableState(); + return state.currentSize != state.desiredSize; + } + + Future updateTablesToDesiredSize() async { + if (kIsWeb) return; + + if (LibXelisWallet._tableGenerationCompleter != null) { + try { + await LibXelisWallet._tableGenerationCompleter!.future; + return; + } catch (_) { + // Previous generation failed, we'll try again + } + } + + await LibXelisWallet._tableGenerationMutex.protect(() async { + // Check again after acquiring mutex + if (LibXelisWallet._tableGenerationCompleter != null) { + try { + await LibXelisWallet._tableGenerationCompleter!.future; + return; + } catch (_) { + // Previous generation failed, we'll try again + } + } + + final state = await getTableState(); + if (state.currentSize == state.desiredSize) return; + + LibXelisWallet._tableGenerationCompleter = Completer(); + await setTableState(state.copyWith(isGenerating: true)); + + try { + final tablePath = await getPrecomputedTablesPath(); + await x_wallet.updateTables( + precomputedTablesPath: tablePath, + l1Low: state.desiredSize.isLow, + ); + + await setTableState(XelisTableState( + isGenerating: false, + currentSize: state.desiredSize, + desiredSize: state.desiredSize, + )); + + LibXelisWallet._tableGenerationCompleter!.complete(); + } catch (e, s) { + Logging.instance.log( + "Failed to update tables: $e\n$s", + level: LogLevel.Error, + ); + await setTableState(state.copyWith(isGenerating: false)); + + LibXelisWallet._tableGenerationCompleter!.completeError(e); + } finally { + if (!LibXelisWallet._tableGenerationCompleter!.isCompleted) { + LibXelisWallet._tableGenerationCompleter!.completeError( + Exception('Table generation abandoned') + ); + } + LibXelisWallet._tableGenerationCompleter = null; + } + }); + } +} \ No newline at end of file diff --git a/lib/wallets/wallet/wallet.dart b/lib/wallets/wallet/wallet.dart index 733c3cf3e..be21c5282 100644 --- a/lib/wallets/wallet/wallet.dart +++ b/lib/wallets/wallet/wallet.dart @@ -173,8 +173,8 @@ abstract class Wallet { value: viewOnlyData!.toJsonEncodedString(), ); } else if (wallet is MnemonicInterface) { - if (wallet is CryptonoteWallet) { - // currently a special case due to the xmr/wow libraries handling their + if (wallet is CryptonoteWallet || wallet is XelisWallet) { // + // currently a special case due to the xmr/wow/xelis libraries handling their // own mnemonic generation on new wallet creation // if its a restore we must set them if (mnemonic != null) { diff --git a/lib/widgets/xelis_table_progress.dart b/lib/widgets/xelis_table_progress.dart new file mode 100644 index 000000000..ffecba861 --- /dev/null +++ b/lib/widgets/xelis_table_progress.dart @@ -0,0 +1,77 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; +import '../../../themes/stack_colors.dart'; +import '../../../utilities/text_styles.dart'; +import '../../../widgets/progress_bar.dart'; + +import '../providers/providers.dart'; + +class XelisTableProgress extends ConsumerWidget { + const XelisTableProgress({super.key}); + + @override + Widget build(BuildContext context, WidgetRef ref) { + final progressAsyncValue = ref.watch(xelisTableProgressProvider); + + return DefaultTextStyle( + style: TextStyle( + color: Theme.of(context).textTheme.bodyLarge?.color ?? Colors.black, + fontSize: 14, + ), + child: Center( + child: progressAsyncValue.when( + data: (progress) => Container( + padding: const EdgeInsets.all(16), + decoration: BoxDecoration( + color: Theme.of(context).extension()!.popupBG, + borderRadius: BorderRadius.circular(12), + ), + constraints: const BoxConstraints(maxWidth: 450), + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + Text( + "Generating Precomputed Tables...", + style: STextStyles.desktopH3(context).copyWith( + fontSize: 24, + ), + textAlign: TextAlign.center, + ), + const SizedBox(height: 8), + Text( + "These tables are required for the fast decryption of private transactions. This is a one-time process upon the creation of your first Xelis wallet in Stack Wallet.", + style: STextStyles.subtitle600(context).copyWith( + fontSize: 14, + color: Theme.of(context).extension()!.textSubtitle1, + ), + textAlign: TextAlign.center, + ), + const SizedBox(height: 16), + Text( + progress.currentStep.displayName, + style: STextStyles.titleBold12(context), + textAlign: TextAlign.center, + ), + const SizedBox(height: 8), + ProgressBar( + width: 200, + height: 8, + fillColor: const Color.fromARGB(255,2,255,207), + backgroundColor: Theme.of(context).extension()!.textFieldDefaultBG, + percent: progress.tableProgress ?? 0.0, + ), + const SizedBox(height: 4), + Text( + "${((progress.tableProgress ?? 0.0) * 100).toStringAsFixed(1)}%", + style: STextStyles.label(context), + ), + ], + ), + ), + loading: () => const SizedBox.shrink(), + error: (_, __) => const SizedBox.shrink(), + ), + ), + ); + } +} \ No newline at end of file diff --git a/pubspec.lock b/pubspec.lock index 920ea7743..a7480b775 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -967,8 +967,16 @@ packages: description: flutter source: sdk version: "0.0.0" + freezed: + dependency: "direct dev" + description: + name: freezed + sha256: "44c19278dd9d89292cf46e97dc0c1e52ce03275f40a97c5a348e802a924bf40e" + url: "https://pub.dev" + source: hosted + version: "2.5.7" freezed_annotation: - dependency: transitive + dependency: "direct main" description: name: freezed_annotation sha256: c2e2d632dd9b8a2b7751117abcfc2b4888ecfe181bd9fca7170d9ef02e595fe2 @@ -2340,7 +2348,7 @@ packages: path: "crypto_plugins/xelis_flutter" relative: true source: path - version: "0.0.1" + version: "0.0.2" xml: dependency: transitive description: diff --git a/scripts/app_config/templates/linux/CMakeLists.txt b/scripts/app_config/templates/linux/CMakeLists.txt index 25750ef4f..16b662db7 100644 --- a/scripts/app_config/templates/linux/CMakeLists.txt +++ b/scripts/app_config/templates/linux/CMakeLists.txt @@ -140,6 +140,9 @@ install(FILES "${CMAKE_CURRENT_SOURCE_DIR}/../crypto_plugins/flutter_libepiccash install(FILES "${CMAKE_CURRENT_SOURCE_DIR}/../crypto_plugins/flutter_liblelantus/scripts/linux/build/libmobileliblelantus.so" DESTINATION "${INSTALL_BUNDLE_LIB_DIR}" COMPONENT Runtime) +install(FILES "${CMAKE_CURRENT_SOURCE_DIR}/../crypto_plugins/xelis_flutter/linux/bin/x86_64-unknown-linux-gnu/release/libxelis_flutter.so" DESTINATION "${INSTALL_BUNDLE_LIB_DIR}" + COMPONENT Runtime) + install(FILES "${CMAKE_CURRENT_SOURCE_DIR}/../scripts/linux/build/jsoncpp/build/src/lib_json/libjsoncpp.so.1.7.4" DESTINATION "${INSTALL_BUNDLE_LIB_DIR}" COMPONENT Runtime) install(FILES "${CMAKE_CURRENT_SOURCE_DIR}/../scripts/linux/build/jsoncpp/build/src/lib_json/libjsoncpp.so.1" DESTINATION "${INSTALL_BUNDLE_LIB_DIR}" diff --git a/scripts/app_config/templates/pubspec.template b/scripts/app_config/templates/pubspec.template index 26d28185a..f56904fde 100644 --- a/scripts/app_config/templates/pubspec.template +++ b/scripts/app_config/templates/pubspec.template @@ -1,5 +1,5 @@ -name: PLACEHOLDER -description: PLACEHOLDER +name: stackwallet +description: Stack Wallet # The following defines the version and build number for your application. # A version number is three numbers separated by dots, like 1.2.43 @@ -11,7 +11,7 @@ description: PLACEHOLDER # In iOS, build-name is used as CFBundleShortVersionString while build-number used as CFBundleVersion. # Read more about iOS versioning at # https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html -version: PLACEHOLDER_V+PLACEHOLDER_B +version: 2.1.1+211 environment: sdk: ">=3.7.0 <4.0.0" @@ -35,6 +35,8 @@ dependencies: xelis_dart_sdk: ^0.24.0 + freezed_annotation: ^2.4.1 + flutter_libsparkmobile: git: url: https://github.com/cypherstack/flutter_libsparkmobile.git @@ -229,6 +231,7 @@ dev_dependencies: sdk: flutter integration_test: sdk: flutter + freezed: ^2.4.2 build_runner: ^2.1.7 flutter_launcher_icons: ^0.13.1 hive_generator: ^2.0.0 diff --git a/scripts/app_config/templates/windows/CMakeLists.txt b/scripts/app_config/templates/windows/CMakeLists.txt index b9add856d..e998725c9 100644 --- a/scripts/app_config/templates/windows/CMakeLists.txt +++ b/scripts/app_config/templates/windows/CMakeLists.txt @@ -86,6 +86,10 @@ install(FILES "${CMAKE_CURRENT_SOURCE_DIR}/../crypto_plugins/flutter_libepiccash install(FILES "${CMAKE_CURRENT_SOURCE_DIR}/../crypto_plugins/flutter_liblelantus/scripts/windows/build/libmobileliblelantus.dll" DESTINATION "${INSTALL_BUNDLE_LIB_DIR}" COMPONENT Runtime) +# todo make this handle arm+x86, required plugin adjustment +# install(FILES "${CMAKE_CURRENT_SOURCE_DIR}/../crypto_plugins/xelis_flutter/windows/bin/x86_64-unknown-windows-msvc/release/libxelis_flutter.so" DESTINATION "${INSTALL_BUNDLE_LIB_DIR}" +# COMPONENT Runtime) + if(PLUGIN_BUNDLED_LIBRARIES) install(FILES "${PLUGIN_BUNDLED_LIBRARIES}" DESTINATION "${INSTALL_BUNDLE_LIB_DIR}" From 7a3558e7e9fab2abfc85d959a2f5fb522a1840e5 Mon Sep 17 00:00:00 2001 From: Tritonn204 Date: Wed, 12 Feb 2025 01:52:52 -0800 Subject: [PATCH 113/193] Slight polish for Xelis integration --- .../svg/campfire/socials/discord.svg | 30 +- .../svg/campfire/socials/telegram-brands.svg | 20 +- .../svg/stack_duo/socials/discord.svg | 30 +- .../svg/stack_duo/socials/telegram-brands.svg | 20 +- .../svg/stack_wallet/socials/discord.svg | 30 +- .../stack_wallet/socials/telegram-brands.svg | 20 +- google_fonts/LICENSE.txt | 404 +++++++++--------- google_fonts/OFL.txt | 186 ++++---- .../xelis_table_progress_provider.dart | 15 +- lib/wallets/wallet/impl/xelis_wallet.dart | 22 +- .../wallet/intermediate/lib_xelis_wallet.dart | 13 +- .../app_config/templates/linux/CMakeLists.txt | 2 +- 12 files changed, 394 insertions(+), 398 deletions(-) diff --git a/asset_sources/svg/campfire/socials/discord.svg b/asset_sources/svg/campfire/socials/discord.svg index 4d6aff6ed..a93742dfd 100644 --- a/asset_sources/svg/campfire/socials/discord.svg +++ b/asset_sources/svg/campfire/socials/discord.svg @@ -1,15 +1,15 @@ - - - - - + + + + + diff --git a/asset_sources/svg/campfire/socials/telegram-brands.svg b/asset_sources/svg/campfire/socials/telegram-brands.svg index 61d09ee08..629eabf23 100644 --- a/asset_sources/svg/campfire/socials/telegram-brands.svg +++ b/asset_sources/svg/campfire/socials/telegram-brands.svg @@ -1,10 +1,10 @@ - - - - - + + + + + diff --git a/asset_sources/svg/stack_duo/socials/discord.svg b/asset_sources/svg/stack_duo/socials/discord.svg index 4d6aff6ed..a93742dfd 100644 --- a/asset_sources/svg/stack_duo/socials/discord.svg +++ b/asset_sources/svg/stack_duo/socials/discord.svg @@ -1,15 +1,15 @@ - - - - - + + + + + diff --git a/asset_sources/svg/stack_duo/socials/telegram-brands.svg b/asset_sources/svg/stack_duo/socials/telegram-brands.svg index 61d09ee08..629eabf23 100644 --- a/asset_sources/svg/stack_duo/socials/telegram-brands.svg +++ b/asset_sources/svg/stack_duo/socials/telegram-brands.svg @@ -1,10 +1,10 @@ - - - - - + + + + + diff --git a/asset_sources/svg/stack_wallet/socials/discord.svg b/asset_sources/svg/stack_wallet/socials/discord.svg index 4d6aff6ed..a93742dfd 100644 --- a/asset_sources/svg/stack_wallet/socials/discord.svg +++ b/asset_sources/svg/stack_wallet/socials/discord.svg @@ -1,15 +1,15 @@ - - - - - + + + + + diff --git a/asset_sources/svg/stack_wallet/socials/telegram-brands.svg b/asset_sources/svg/stack_wallet/socials/telegram-brands.svg index 61d09ee08..629eabf23 100644 --- a/asset_sources/svg/stack_wallet/socials/telegram-brands.svg +++ b/asset_sources/svg/stack_wallet/socials/telegram-brands.svg @@ -1,10 +1,10 @@ - - - - - + + + + + diff --git a/google_fonts/LICENSE.txt b/google_fonts/LICENSE.txt index 75b52484e..d64569567 100644 --- a/google_fonts/LICENSE.txt +++ b/google_fonts/LICENSE.txt @@ -1,202 +1,202 @@ - - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright [yyyy] [name of copyright owner] - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/google_fonts/OFL.txt b/google_fonts/OFL.txt index ad214842c..b525cbf3a 100644 --- a/google_fonts/OFL.txt +++ b/google_fonts/OFL.txt @@ -1,93 +1,93 @@ -Copyright 2020 The Inter Project Authors (https://github.com/rsms/inter) - -This Font Software is licensed under the SIL Open Font License, Version 1.1. -This license is copied below, and is also available with a FAQ at: -http://scripts.sil.org/OFL - - ------------------------------------------------------------ -SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 ------------------------------------------------------------ - -PREAMBLE -The goals of the Open Font License (OFL) are to stimulate worldwide -development of collaborative font projects, to support the font creation -efforts of academic and linguistic communities, and to provide a free and -open framework in which fonts may be shared and improved in partnership -with others. - -The OFL allows the licensed fonts to be used, studied, modified and -redistributed freely as long as they are not sold by themselves. The -fonts, including any derivative works, can be bundled, embedded, -redistributed and/or sold with any software provided that any reserved -names are not used by derivative works. The fonts and derivatives, -however, cannot be released under any other type of license. The -requirement for fonts to remain under this license does not apply -to any document created using the fonts or their derivatives. - -DEFINITIONS -"Font Software" refers to the set of files released by the Copyright -Holder(s) under this license and clearly marked as such. This may -include source files, build scripts and documentation. - -"Reserved Font Name" refers to any names specified as such after the -copyright statement(s). - -"Original Version" refers to the collection of Font Software components as -distributed by the Copyright Holder(s). - -"Modified Version" refers to any derivative made by adding to, deleting, -or substituting -- in part or in whole -- any of the components of the -Original Version, by changing formats or by porting the Font Software to a -new environment. - -"Author" refers to any designer, engineer, programmer, technical -writer or other person who contributed to the Font Software. - -PERMISSION & CONDITIONS -Permission is hereby granted, free of charge, to any person obtaining -a copy of the Font Software, to use, study, copy, merge, embed, modify, -redistribute, and sell modified and unmodified copies of the Font -Software, subject to the following conditions: - -1) Neither the Font Software nor any of its individual components, -in Original or Modified Versions, may be sold by itself. - -2) Original or Modified Versions of the Font Software may be bundled, -redistributed and/or sold with any software, provided that each copy -contains the above copyright notice and this license. These can be -included either as stand-alone text files, human-readable headers or -in the appropriate machine-readable metadata fields within text or -binary files as long as those fields can be easily viewed by the user. - -3) No Modified Version of the Font Software may use the Reserved Font -Name(s) unless explicit written permission is granted by the corresponding -Copyright Holder. This restriction only applies to the primary font name as -presented to the users. - -4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font -Software shall not be used to promote, endorse or advertise any -Modified Version, except to acknowledge the contribution(s) of the -Copyright Holder(s) and the Author(s) or with their explicit written -permission. - -5) The Font Software, modified or unmodified, in part or in whole, -must be distributed entirely under this license, and must not be -distributed under any other license. The requirement for fonts to -remain under this license does not apply to any document created -using the Font Software. - -TERMINATION -This license becomes null and void if any of the above conditions are -not met. - -DISCLAIMER -THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT -OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE -COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, -INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL -DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM -OTHER DEALINGS IN THE FONT SOFTWARE. +Copyright 2020 The Inter Project Authors (https://github.com/rsms/inter) + +This Font Software is licensed under the SIL Open Font License, Version 1.1. +This license is copied below, and is also available with a FAQ at: +http://scripts.sil.org/OFL + + +----------------------------------------------------------- +SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 +----------------------------------------------------------- + +PREAMBLE +The goals of the Open Font License (OFL) are to stimulate worldwide +development of collaborative font projects, to support the font creation +efforts of academic and linguistic communities, and to provide a free and +open framework in which fonts may be shared and improved in partnership +with others. + +The OFL allows the licensed fonts to be used, studied, modified and +redistributed freely as long as they are not sold by themselves. The +fonts, including any derivative works, can be bundled, embedded, +redistributed and/or sold with any software provided that any reserved +names are not used by derivative works. The fonts and derivatives, +however, cannot be released under any other type of license. The +requirement for fonts to remain under this license does not apply +to any document created using the fonts or their derivatives. + +DEFINITIONS +"Font Software" refers to the set of files released by the Copyright +Holder(s) under this license and clearly marked as such. This may +include source files, build scripts and documentation. + +"Reserved Font Name" refers to any names specified as such after the +copyright statement(s). + +"Original Version" refers to the collection of Font Software components as +distributed by the Copyright Holder(s). + +"Modified Version" refers to any derivative made by adding to, deleting, +or substituting -- in part or in whole -- any of the components of the +Original Version, by changing formats or by porting the Font Software to a +new environment. + +"Author" refers to any designer, engineer, programmer, technical +writer or other person who contributed to the Font Software. + +PERMISSION & CONDITIONS +Permission is hereby granted, free of charge, to any person obtaining +a copy of the Font Software, to use, study, copy, merge, embed, modify, +redistribute, and sell modified and unmodified copies of the Font +Software, subject to the following conditions: + +1) Neither the Font Software nor any of its individual components, +in Original or Modified Versions, may be sold by itself. + +2) Original or Modified Versions of the Font Software may be bundled, +redistributed and/or sold with any software, provided that each copy +contains the above copyright notice and this license. These can be +included either as stand-alone text files, human-readable headers or +in the appropriate machine-readable metadata fields within text or +binary files as long as those fields can be easily viewed by the user. + +3) No Modified Version of the Font Software may use the Reserved Font +Name(s) unless explicit written permission is granted by the corresponding +Copyright Holder. This restriction only applies to the primary font name as +presented to the users. + +4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font +Software shall not be used to promote, endorse or advertise any +Modified Version, except to acknowledge the contribution(s) of the +Copyright Holder(s) and the Author(s) or with their explicit written +permission. + +5) The Font Software, modified or unmodified, in part or in whole, +must be distributed entirely under this license, and must not be +distributed under any other license. The requirement for fonts to +remain under this license does not apply to any document created +using the Font Software. + +TERMINATION +This license becomes null and void if any of the above conditions are +not met. + +DISCLAIMER +THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT +OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE +COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM +OTHER DEALINGS IN THE FONT SOFTWARE. diff --git a/lib/providers/progress_report/xelis_table_progress_provider.dart b/lib/providers/progress_report/xelis_table_progress_provider.dart index 5f57dca29..cbebe8224 100644 --- a/lib/providers/progress_report/xelis_table_progress_provider.dart +++ b/lib/providers/progress_report/xelis_table_progress_provider.dart @@ -1,6 +1,9 @@ import 'package:xelis_flutter/src/api/api.dart' as xelis_api; import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:flutter/foundation.dart'; +import 'dart:math' as math; + enum XelisTableGenerationStep { t1PointsGeneration, t1CuckooSetup, @@ -45,6 +48,7 @@ class XelisTableProgressState { } final xelisTableProgressProvider = StreamProvider((ref) { + double lastPrintedProgress = 0.0; return xelis_api.createProgressReportStream().map((report) { return report.when( tableGeneration: (progress, step, _) { @@ -56,10 +60,15 @@ final xelisTableProgressProvider = StreamProvider((ref) XelisTableGenerationStep.unknown => 0, }; - final totalProgress = (stepIndex * 0.5) + (progress * 0.5); - + if ((progress - lastPrintedProgress).abs() >= 0.05 || + currentStep != XelisTableGenerationStep.fromString(step) || + progress >= 0.99) { + debugPrint("Xelis Table Generation: $step - ${progress*100.0}%"); + lastPrintedProgress = progress; + } + return XelisTableProgressState( - tableProgress: totalProgress, + tableProgress: progress, currentStep: currentStep, ); }, diff --git a/lib/wallets/wallet/impl/xelis_wallet.dart b/lib/wallets/wallet/impl/xelis_wallet.dart index b14ef7cc2..5fbbf976b 100644 --- a/lib/wallets/wallet/impl/xelis_wallet.dart +++ b/lib/wallets/wallet/impl/xelis_wallet.dart @@ -57,23 +57,6 @@ class XelisWallet extends LibXelisWallet { @override Future init({bool? isRestore}) async { debugPrint("Xelis: init"); - - // final progressState = ref.read(xelisTableProgressProvider); - // if (progressState.hasValue && - // progressState.value?.tableProgress != null && - // progressState.value!.tableProgress! < 1.0) { - // GlobalEventBus.instance.fire( - // WalletSyncStatusChangedEvent( - // WalletSyncStatus.syncing, - // walletId, - // info.coin, - // ), - // ); - - // while ((ref.read(xelisTableProgressProvider).value?.tableProgress ?? 1.0) < 1.0) { - // await Future.delayed(const Duration(milliseconds: 100)); - // } - // } if (isRestore == true) { await _restoreWallet(); @@ -88,7 +71,6 @@ class XelisWallet extends LibXelisWallet { } await open(); - await updateTransactions(isRescan: true, topoheight: 0); return await super.init(); } @@ -168,10 +150,12 @@ class XelisWallet extends LibXelisWallet { Future pingCheck() async { checkInitialized(); try { - await libXelisWallet!.getDaemonInfo(); + final nodeInfo = await libXelisWallet!.getDaemonInfo(); + await handleOnline(); return true; } catch (_) { return false; + await handleOffline(); } } diff --git a/lib/wallets/wallet/intermediate/lib_xelis_wallet.dart b/lib/wallets/wallet/intermediate/lib_xelis_wallet.dart index 26cf77842..e3651179e 100644 --- a/lib/wallets/wallet/intermediate/lib_xelis_wallet.dart +++ b/lib/wallets/wallet/intermediate/lib_xelis_wallet.dart @@ -427,10 +427,12 @@ abstract class LibXelisWallet extends ExternalWallet rethrow; } }); - } - - if (await isTableUpgradeAvailable()) { - unawaited(updateTablesToDesiredSize()); + + debugPrint("Checking for upgradability"); + if (await isTableUpgradeAvailable()) { + debugPrint("Generating large tables in background"); + unawaited(updateTablesToDesiredSize()); + } } final newReceivingAddress = await getCurrentReceivingAddress() ?? @@ -540,7 +542,8 @@ extension XelisTableManagement on LibXelisWallet { currentSize: state.desiredSize, desiredSize: state.desiredSize, )); - + + debugPrint("Table upgrade done"); LibXelisWallet._tableGenerationCompleter!.complete(); } catch (e, s) { Logging.instance.log( diff --git a/scripts/app_config/templates/linux/CMakeLists.txt b/scripts/app_config/templates/linux/CMakeLists.txt index 16b662db7..f1853439c 100644 --- a/scripts/app_config/templates/linux/CMakeLists.txt +++ b/scripts/app_config/templates/linux/CMakeLists.txt @@ -140,7 +140,7 @@ install(FILES "${CMAKE_CURRENT_SOURCE_DIR}/../crypto_plugins/flutter_libepiccash install(FILES "${CMAKE_CURRENT_SOURCE_DIR}/../crypto_plugins/flutter_liblelantus/scripts/linux/build/libmobileliblelantus.so" DESTINATION "${INSTALL_BUNDLE_LIB_DIR}" COMPONENT Runtime) -install(FILES "${CMAKE_CURRENT_SOURCE_DIR}/../crypto_plugins/xelis_flutter/linux/bin/x86_64-unknown-linux-gnu/release/libxelis_flutter.so" DESTINATION "${INSTALL_BUNDLE_LIB_DIR}" +install(FILES "${CMAKE_CURRENT_SOURCE_DIR}/../crypto_plugins/xelis_flutter/scripts/linux/build/libxelis_flutter.so" DESTINATION "${INSTALL_BUNDLE_LIB_DIR}" COMPONENT Runtime) install(FILES "${CMAKE_CURRENT_SOURCE_DIR}/../scripts/linux/build/jsoncpp/build/src/lib_json/libjsoncpp.so.1.7.4" DESTINATION "${INSTALL_BUNDLE_LIB_DIR}" From c6bff81648a9f559e73b9c8af7dc33167820229a Mon Sep 17 00:00:00 2001 From: Tritonn204 Date: Thu, 13 Feb 2025 22:57:58 -0800 Subject: [PATCH 114/193] Android works --- crypto_plugins/xelis_flutter | 2 +- .../wallet/intermediate/lib_xelis_wallet.dart | 14 +++++++++----- 2 files changed, 10 insertions(+), 6 deletions(-) diff --git a/crypto_plugins/xelis_flutter b/crypto_plugins/xelis_flutter index 2a3824490..24c66562d 160000 --- a/crypto_plugins/xelis_flutter +++ b/crypto_plugins/xelis_flutter @@ -1 +1 @@ -Subproject commit 2a382449090daac64a15434b6e802d6e06d30502 +Subproject commit 24c66562dce9019c1af7d43f5b58bba59e336e91 diff --git a/lib/wallets/wallet/intermediate/lib_xelis_wallet.dart b/lib/wallets/wallet/intermediate/lib_xelis_wallet.dart index e3651179e..53522fa74 100644 --- a/lib/wallets/wallet/intermediate/lib_xelis_wallet.dart +++ b/lib/wallets/wallet/intermediate/lib_xelis_wallet.dart @@ -206,10 +206,12 @@ abstract class LibXelisWallet extends ExternalWallet StreamSubscription? _eventSubscription; Future getPrecomputedTablesPath() async { - final appDir = await StackFileSystem.applicationRootDirectory(); - // Create a subdirectory for the tables - final tablePath = path.join(appDir.path, 'xelis', 'tables/'); - return tablePath; + if (kIsWeb) { + return ""; + } else { + final appDir = await getApplicationSupportDirectory(); + return "${appDir.path}/"; + } } Future getTableState() async { @@ -345,7 +347,8 @@ abstract class LibXelisWallet extends ExternalWallet wasNull = true; final tablePath = await getPrecomputedTablesPath(); final tableState = await getTableState(); - final String name = walletId; + final appDir = await getApplicationDocumentsDirectory(); + final String name = path.join(appDir.path, walletId); final password = await secureStorageInterface.read( key: Wallet.mnemonicPassphraseKey(walletId: info.walletId), ); @@ -504,6 +507,7 @@ extension XelisTableManagement on LibXelisWallet { Future updateTablesToDesiredSize() async { if (kIsWeb) return; + await Future.delayed(const Duration(seconds: 1)); if (LibXelisWallet._tableGenerationCompleter != null) { try { await LibXelisWallet._tableGenerationCompleter!.future; From e1964ea68e7d7135be853496a4286c3cb548abed Mon Sep 17 00:00:00 2001 From: Tritonn204 Date: Thu, 13 Feb 2025 23:29:56 -0800 Subject: [PATCH 115/193] adjusted for xelis flutter refactor --- lib/wallets/wallet/intermediate/lib_xelis_wallet.dart | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/lib/wallets/wallet/intermediate/lib_xelis_wallet.dart b/lib/wallets/wallet/intermediate/lib_xelis_wallet.dart index 53522fa74..9935e0f18 100644 --- a/lib/wallets/wallet/intermediate/lib_xelis_wallet.dart +++ b/lib/wallets/wallet/intermediate/lib_xelis_wallet.dart @@ -348,7 +348,8 @@ abstract class LibXelisWallet extends ExternalWallet final tablePath = await getPrecomputedTablesPath(); final tableState = await getTableState(); final appDir = await getApplicationDocumentsDirectory(); - final String name = path.join(appDir.path, walletId); + final String name = walletId; + final String directory = path.join(appDir.path, '/'); final password = await secureStorageInterface.read( key: Wallet.mnemonicPassphraseKey(walletId: info.walletId), ); @@ -368,6 +369,7 @@ abstract class LibXelisWallet extends ExternalWallet debugPrint("Xelis: creating new wallet"); final wallet = await x_wallet.createXelisWallet( name: name, + directory: directory, password: password!, network: cryptoCurrency.network.xelisNetwork, precomputedTablesPath: tablePath, @@ -394,6 +396,7 @@ abstract class LibXelisWallet extends ExternalWallet debugPrint("Xelis: recovering wallet"); final wallet = await x_wallet.createXelisWallet( name: name, + directory: directory, password: password!, seed: mnemonic.trim(), network: cryptoCurrency.network.xelisNetwork, @@ -415,6 +418,7 @@ abstract class LibXelisWallet extends ExternalWallet debugPrint("Xelis: opening existing wallet"); return await x_wallet.openXelisWallet( name: name, + directory: directory, password: password!, network: cryptoCurrency.network.xelisNetwork, precomputedTablesPath: tablePath, From 1463ea79723aac8dacc1ac734be0730b701fa07c Mon Sep 17 00:00:00 2001 From: Anthony Tritonn Date: Sat, 15 Feb 2025 14:45:36 -0800 Subject: [PATCH 116/193] Xelis price service added, wallet storage bugs fixed, updated to apple-compliant xelis lib --- crypto_plugins/xelis_flutter | 2 +- lib/services/price.dart | 1 + lib/wallets/wallet/intermediate/lib_xelis_wallet.dart | 2 +- linux/flutter/generated_plugin_registrant.cc | 4 ---- linux/flutter/generated_plugins.cmake | 2 +- macos/Flutter/GeneratedPluginRegistrant.swift | 2 -- macos/Podfile.lock | 9 +++++++-- windows/flutter/generated_plugin_registrant.cc | 3 --- windows/flutter/generated_plugins.cmake | 2 +- 9 files changed, 12 insertions(+), 15 deletions(-) diff --git a/crypto_plugins/xelis_flutter b/crypto_plugins/xelis_flutter index 24c66562d..0f333afd9 160000 --- a/crypto_plugins/xelis_flutter +++ b/crypto_plugins/xelis_flutter @@ -1 +1 @@ -Subproject commit 24c66562dce9019c1af7d43f5b58bba59e336e91 +Subproject commit 0f333afd91531e45dc4b2523af3f85fee9375edc diff --git a/lib/services/price.dart b/lib/services/price.dart index a3c31ef17..801e720e2 100644 --- a/lib/services/price.dart +++ b/lib/services/price.dart @@ -48,6 +48,7 @@ class PriceAPI { Namecoin: "namecoin", Nano: "nano", Banano: "banano", + Xelis: "xelis", }; static const refreshInterval = 60; diff --git a/lib/wallets/wallet/intermediate/lib_xelis_wallet.dart b/lib/wallets/wallet/intermediate/lib_xelis_wallet.dart index 9935e0f18..84a8e0817 100644 --- a/lib/wallets/wallet/intermediate/lib_xelis_wallet.dart +++ b/lib/wallets/wallet/intermediate/lib_xelis_wallet.dart @@ -349,7 +349,7 @@ abstract class LibXelisWallet extends ExternalWallet final tableState = await getTableState(); final appDir = await getApplicationDocumentsDirectory(); final String name = walletId; - final String directory = path.join(appDir.path, '/'); + final String directory = appDir.path; final password = await secureStorageInterface.read( key: Wallet.mnemonicPassphraseKey(walletId: info.walletId), ); diff --git a/linux/flutter/generated_plugin_registrant.cc b/linux/flutter/generated_plugin_registrant.cc index 4a096bcde..88c196c5e 100644 --- a/linux/flutter/generated_plugin_registrant.cc +++ b/linux/flutter/generated_plugin_registrant.cc @@ -16,7 +16,6 @@ #include #include #include -#include void fl_register_plugins(FlPluginRegistry* registry) { g_autoptr(FlPluginRegistrar) cs_monero_flutter_libs_linux_registrar = @@ -49,7 +48,4 @@ void fl_register_plugins(FlPluginRegistry* registry) { g_autoptr(FlPluginRegistrar) window_size_registrar = fl_plugin_registry_get_registrar_for_plugin(registry, "WindowSizePlugin"); window_size_plugin_register_with_registrar(window_size_registrar); - g_autoptr(FlPluginRegistrar) xelis_flutter_registrar = - fl_plugin_registry_get_registrar_for_plugin(registry, "XelisFlutterPlugin"); - xelis_flutter_plugin_register_with_registrar(xelis_flutter_registrar); } diff --git a/linux/flutter/generated_plugins.cmake b/linux/flutter/generated_plugins.cmake index 22b92c965..aa67f97ac 100644 --- a/linux/flutter/generated_plugins.cmake +++ b/linux/flutter/generated_plugins.cmake @@ -13,7 +13,6 @@ list(APPEND FLUTTER_PLUGIN_LIST stack_wallet_backup url_launcher_linux window_size - xelis_flutter ) list(APPEND FLUTTER_FFI_PLUGIN_LIST @@ -22,6 +21,7 @@ list(APPEND FLUTTER_FFI_PLUGIN_LIST flutter_libsparkmobile frostdart tor_ffi_plugin + xelis_flutter ) set(PLUGIN_BUNDLED_LIBRARIES) diff --git a/macos/Flutter/GeneratedPluginRegistrant.swift b/macos/Flutter/GeneratedPluginRegistrant.swift index 73a62daf8..245400e1a 100644 --- a/macos/Flutter/GeneratedPluginRegistrant.swift +++ b/macos/Flutter/GeneratedPluginRegistrant.swift @@ -26,7 +26,6 @@ import stack_wallet_backup import url_launcher_macos import wakelock_plus import window_size -import xelis_flutter func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) { CameraMacosPlugin.register(with: registry.registrar(forPlugin: "CameraMacosPlugin")) @@ -50,5 +49,4 @@ func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) { UrlLauncherPlugin.register(with: registry.registrar(forPlugin: "UrlLauncherPlugin")) WakelockPlusMacosPlugin.register(with: registry.registrar(forPlugin: "WakelockPlusMacosPlugin")) WindowSizePlugin.register(with: registry.registrar(forPlugin: "WindowSizePlugin")) - XelisFlutterPlugin.register(with: registry.registrar(forPlugin: "XelisFlutterPlugin")) } diff --git a/macos/Podfile.lock b/macos/Podfile.lock index fa0068398..12715b6ea 100644 --- a/macos/Podfile.lock +++ b/macos/Podfile.lock @@ -65,6 +65,8 @@ PODS: - FlutterMacOS - window_size (0.0.2): - FlutterMacOS + - xelis_flutter (0.0.1): + - FlutterMacOS DEPENDENCIES: - camera_macos (from `Flutter/ephemeral/.symlinks/plugins/camera_macos/macos`) @@ -92,6 +94,7 @@ DEPENDENCIES: - url_launcher_macos (from `Flutter/ephemeral/.symlinks/plugins/url_launcher_macos/macos`) - wakelock_plus (from `Flutter/ephemeral/.symlinks/plugins/wakelock_plus/macos`) - window_size (from `Flutter/ephemeral/.symlinks/plugins/window_size/macos`) + - xelis_flutter (from `Flutter/ephemeral/.symlinks/plugins/xelis_flutter/macos`) SPEC REPOS: trunk: @@ -149,6 +152,8 @@ EXTERNAL SOURCES: :path: Flutter/ephemeral/.symlinks/plugins/wakelock_plus/macos window_size: :path: Flutter/ephemeral/.symlinks/plugins/window_size/macos + xelis_flutter: + :path: Flutter/ephemeral/.symlinks/plugins/xelis_flutter/macos SPEC CHECKSUMS: camera_macos: c2603f5eed16f05076cf17e12030d2ce55a77839 @@ -170,7 +175,7 @@ SPEC CHECKSUMS: package_info_plus: f5790acc797bf17c3e959e9d6cf162cc68ff7523 path_provider_foundation: 2b6b4c569c0fb62ec74538f866245ac84301af46 ReachabilitySwift: 985039c6f7b23a1da463388634119492ff86c825 - share_plus: 76dd39142738f7a68dd57b05093b5e8193f220f7 + share_plus: 3c787998077d6b31e839225a282e9e27edf99274 sqlite3: 292c3e1bfe89f64e51ea7fc7dab9182a017c8630 sqlite3_flutter_libs: 1be4459672f8168ded2d8667599b8e3ca5e72b83 stack_wallet_backup: 6ebc60b1bdcf11cf1f1cbad9aa78332e1e15778c @@ -181,4 +186,4 @@ SPEC CHECKSUMS: PODFILE CHECKSUM: 236401fc2c932af29a9fcf0e97baeeb2d750d367 -COCOAPODS: 1.15.2 +COCOAPODS: 1.16.2 diff --git a/windows/flutter/generated_plugin_registrant.cc b/windows/flutter/generated_plugin_registrant.cc index eca37870c..74ef33c4e 100644 --- a/windows/flutter/generated_plugin_registrant.cc +++ b/windows/flutter/generated_plugin_registrant.cc @@ -20,7 +20,6 @@ #include #include #include -#include void RegisterPlugins(flutter::PluginRegistry* registry) { CameraWindowsRegisterWithRegistrar( @@ -51,6 +50,4 @@ void RegisterPlugins(flutter::PluginRegistry* registry) { registry->GetRegistrarForPlugin("UrlLauncherWindows")); WindowSizePluginRegisterWithRegistrar( registry->GetRegistrarForPlugin("WindowSizePlugin")); - XelisFlutterPluginCApiRegisterWithRegistrar( - registry->GetRegistrarForPlugin("XelisFlutterPluginCApi")); } diff --git a/windows/flutter/generated_plugins.cmake b/windows/flutter/generated_plugins.cmake index 4c59517d9..55c2cc622 100644 --- a/windows/flutter/generated_plugins.cmake +++ b/windows/flutter/generated_plugins.cmake @@ -17,7 +17,6 @@ list(APPEND FLUTTER_PLUGIN_LIST stack_wallet_backup url_launcher_windows window_size - xelis_flutter ) list(APPEND FLUTTER_FFI_PLUGIN_LIST @@ -25,6 +24,7 @@ list(APPEND FLUTTER_FFI_PLUGIN_LIST flutter_libsparkmobile frostdart tor_ffi_plugin + xelis_flutter ) set(PLUGIN_BUNDLED_LIBRARIES) From e04efc7247f6513d1019f4adeaef8300edd170ce Mon Sep 17 00:00:00 2001 From: Anthony Tritonn Date: Sat, 15 Feb 2025 22:38:34 -0800 Subject: [PATCH 117/193] Apple/iOS builds working (with PRs from plugins) --- crypto_plugins/xelis_flutter | 2 +- ios/Podfile.lock | 36 +++++++++++-------- .../xcshareddata/xcschemes/Runner.xcscheme | 1 + scripts/app_config/templates/pubspec.template | 2 +- scripts/ios/build_all.sh | 8 +---- scripts/ios/build_all_campfire.sh | 2 -- scripts/ios/build_all_duo.sh | 2 -- scripts/macos/build_all.sh | 2 -- scripts/macos/build_all_campfire.sh | 2 -- scripts/macos/build_all_duo.sh | 2 -- 10 files changed, 25 insertions(+), 34 deletions(-) diff --git a/crypto_plugins/xelis_flutter b/crypto_plugins/xelis_flutter index 0f333afd9..6ab305434 160000 --- a/crypto_plugins/xelis_flutter +++ b/crypto_plugins/xelis_flutter @@ -1 +1 @@ -Subproject commit 0f333afd91531e45dc4b2523af3f85fee9375edc +Subproject commit 6ab3054347e6b58776c69059e3352ab980b0b83e diff --git a/ios/Podfile.lock b/ios/Podfile.lock index 54bf5e55f..64fb9ea9e 100644 --- a/ios/Podfile.lock +++ b/ios/Podfile.lock @@ -109,6 +109,8 @@ PODS: - Flutter - wakelock_plus (0.0.1): - Flutter + - xelis_flutter (0.0.1): + - Flutter DEPENDENCIES: - barcode_scan2 (from `.symlinks/plugins/barcode_scan2/ios`) @@ -138,6 +140,7 @@ DEPENDENCIES: - tor_ffi_plugin (from `.symlinks/plugins/tor_ffi_plugin/ios`) - url_launcher_ios (from `.symlinks/plugins/url_launcher_ios/ios`) - wakelock_plus (from `.symlinks/plugins/wakelock_plus/ios`) + - xelis_flutter (from `.symlinks/plugins/xelis_flutter/ios`) SPEC REPOS: trunk: @@ -205,6 +208,8 @@ EXTERNAL SOURCES: :path: ".symlinks/plugins/url_launcher_ios/ios" wakelock_plus: :path: ".symlinks/plugins/wakelock_plus/ios" + xelis_flutter: + :path: ".symlinks/plugins/xelis_flutter/ios" SPEC CHECKSUMS: barcode_scan2: 0af2bb63c81b4565aab6cd78278e4c0fa136dbb0 @@ -215,34 +220,35 @@ SPEC CHECKSUMS: devicelocale: 35ba84dc7f45f527c3001535d8c8d104edd5d926 DKImagePickerController: b512c28220a2b8ac7419f21c491fc8534b7601ac DKPhotoGallery: fdfad5125a9fdda9cc57df834d49df790dbb4179 - file_picker: 09aa5ec1ab24135ccd7a1621c46c84134bfd6655 + file_picker: 9b3292d7c8bc68c8a7bf8eb78f730e49c8efc517 Flutter: e0871f40cf51350855a761d2e70bf5af5b9b5de7 - flutter_libepiccash: 36241aa7d3126f6521529985ccb3dc5eaf7bb317 - flutter_libsparkmobile: 6373955cc3327a926d17059e7405dde2fb12f99f - flutter_local_notifications: 4cde75091f6327eb8517fa068a0a5950212d2086 - flutter_native_splash: 52501b97d1c0a5f898d687f1646226c1f93c56ef - flutter_secure_storage: 23fc622d89d073675f2eaa109381aefbcf5a49be + flutter_libepiccash: 7d480d11241faea8aefdcb96991319c5e26d4735 + flutter_libsparkmobile: e2fcf99dafae4f5d28bf15468bad6d2ba9403c64 + flutter_local_notifications: ad39620c743ea4c15127860f4b5641649a988100 + flutter_native_splash: 9e672d3818957718ee006a491730c09deeecace9 + flutter_secure_storage: 2c2ff13db9e0a5647389bff88b0ecac56e3f3418 frostdart: 4c72b69ccac2f13ede744107db046a125acce597 - integration_test: 252f60fa39af5e17c3aa9899d35d908a0721b573 - isar_flutter_libs: fdf730ca925d05687f36d7f1d355e482529ed097 - lelantus: 417f0221260013dfc052cae9cf4b741b6479edba - local_auth_darwin: 66e40372f1c29f383a314c738c7446e2f7fdadc3 + integration_test: 4a889634ef21a45d28d50d622cf412dc6d9f586e + isar_flutter_libs: bc909e72c3d756c2759f14c8776c13b5b0556e26 + lelantus: a5bdee9de3d78dedd1fffda1d92ea3c67106881f + local_auth_darwin: 553ce4f9b16d3fdfeafce9cf042e7c9f77c1c391 MTBBarcodeScanner: f453b33c4b7dfe545d8c6484ed744d55671788cb package_info_plus: c0502532a26c7662a62a356cebe2692ec5fe4ec4 path_provider_foundation: 2b6b4c569c0fb62ec74538f866245ac84301af46 permission_handler_apple: 9878588469a2b0d0fc1e048d9f43605f92e6cec2 ReachabilitySwift: 985039c6f7b23a1da463388634119492ff86c825 SDWebImage: 72f86271a6f3139cc7e4a89220946489d4b9a866 - share_plus: c3fef564749587fc939ef86ffb283ceac0baf9f5 + share_plus: de6030e33b4e106470e09322d87cf2a4258d2d1d sqlite3: 292c3e1bfe89f64e51ea7fc7dab9182a017c8630 sqlite3_flutter_libs: 0d611efdf6d1c9297d5ab03dab21b75aeebdae31 stack_wallet_backup: 5b8563aba5d8ffbf2ce1944331ff7294a0ec7c03 SwiftProtobuf: 6ef3f0e422ef90d6605ca20b21a94f6c1324d6b3 SwiftyGif: 6c3eafd0ce693cad58bb63d2b2fb9bacb8552780 - tor_ffi_plugin: d80e291b649379c8176e1be739e49be007d4ef93 - url_launcher_ios: 5334b05cef931de560670eeae103fd3e431ac3fe - wakelock_plus: 78ec7c5b202cab7761af8e2b2b3d0671be6c4ae1 + tor_ffi_plugin: 2a4dd758515e5124dce8323f950f6bb135e611b5 + url_launcher_ios: 694010445543906933d732453a59da0a173ae33d + wakelock_plus: fd58c82b1388f4afe3fe8aa2c856503a262a5b03 + xelis_flutter: 63a1007da6fd27faa9f451bb9c2f7aa165c01cbe PODFILE CHECKSUM: 57c8aed26fba39d3ec9424816221f294a07c58eb -COCOAPODS: 1.15.2 +COCOAPODS: 1.16.2 diff --git a/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index 5e31d3d34..c53e2b314 100644 --- a/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -48,6 +48,7 @@ ignoresPersistentStateOnLaunch = "NO" debugDocumentVersioning = "YES" debugServiceExtension = "internal" + enableGPUValidationMode = "1" allowLocationSimulation = "YES"> diff --git a/scripts/app_config/templates/pubspec.template b/scripts/app_config/templates/pubspec.template index f56904fde..e4d0612ac 100644 --- a/scripts/app_config/templates/pubspec.template +++ b/scripts/app_config/templates/pubspec.template @@ -11,7 +11,7 @@ description: Stack Wallet # In iOS, build-name is used as CFBundleShortVersionString while build-number used as CFBundleVersion. # Read more about iOS versioning at # https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html -version: 2.1.1+211 +version: 2.1.2+212 environment: sdk: ">=3.7.0 <4.0.0" diff --git a/scripts/ios/build_all.sh b/scripts/ios/build_all.sh index 013346c9b..f21a66453 100755 --- a/scripts/ios/build_all.sh +++ b/scripts/ios/build_all.sh @@ -10,15 +10,9 @@ set_rust_to_1671 rustup target add aarch64-apple-ios rustup target add x86_64-apple-ios -# ensure ios rust triples are there -rustup target add aarch64-apple-ios -rustup target add x86_64-apple-ios - (cd ../../crypto_plugins/flutter_liblelantus/scripts/ios && ./build_all.sh ) -(cd ../../crypto_plugins/flutter_libepiccash/scripts/ios && ./build_all.sh ) -set_rust_to_1840 -(cd ../../crypto_plugins/xelis_flutter/scripts/ios && ./build_all.sh ) set_rust_to_1720 +(cd ../../crypto_plugins/flutter_libepiccash/scripts/ios && ./build_all.sh ) (cd ../../crypto_plugins/frostdart/scripts/ios && ./build_all.sh ) wait diff --git a/scripts/ios/build_all_campfire.sh b/scripts/ios/build_all_campfire.sh index 013346c9b..bcb03e991 100755 --- a/scripts/ios/build_all_campfire.sh +++ b/scripts/ios/build_all_campfire.sh @@ -16,8 +16,6 @@ rustup target add x86_64-apple-ios (cd ../../crypto_plugins/flutter_liblelantus/scripts/ios && ./build_all.sh ) (cd ../../crypto_plugins/flutter_libepiccash/scripts/ios && ./build_all.sh ) -set_rust_to_1840 -(cd ../../crypto_plugins/xelis_flutter/scripts/ios && ./build_all.sh ) set_rust_to_1720 (cd ../../crypto_plugins/frostdart/scripts/ios && ./build_all.sh ) diff --git a/scripts/ios/build_all_duo.sh b/scripts/ios/build_all_duo.sh index 02045eb26..89e6f4641 100755 --- a/scripts/ios/build_all_duo.sh +++ b/scripts/ios/build_all_duo.sh @@ -18,8 +18,6 @@ rustup target add x86_64-apple-ios (cd ../../crypto_plugins/flutter_liblelantus/scripts/ios && ./build_all.sh ) (cd ../../crypto_plugins/flutter_libepiccash/scripts/ios && ./build_all.sh ) -set_rust_to_1840 -(cd ../../crypto_plugins/xelis_flutter/scripts/ios && ./build_all.sh ) set_rust_to_1720 (cd ../../crypto_plugins/frostdart/scripts/ios && ./build_all.sh ) diff --git a/scripts/macos/build_all.sh b/scripts/macos/build_all.sh index 6f612b822..af608846f 100755 --- a/scripts/macos/build_all.sh +++ b/scripts/macos/build_all.sh @@ -8,8 +8,6 @@ set_rust_to_1671 (cd ../../crypto_plugins/flutter_liblelantus/scripts/macos && ./build_all.sh ) (cd ../../crypto_plugins/flutter_libepiccash/scripts/macos && ./build_all.sh ) -set_rust_to_1840 -(cd ../../crypto_plugins/xelis_flutter/scripts/macos && ./build_all.sh ) set_rust_to_1720 (cd ../../crypto_plugins/frostdart/scripts/macos && ./build_all.sh ) diff --git a/scripts/macos/build_all_campfire.sh b/scripts/macos/build_all_campfire.sh index 6f612b822..af608846f 100755 --- a/scripts/macos/build_all_campfire.sh +++ b/scripts/macos/build_all_campfire.sh @@ -8,8 +8,6 @@ set_rust_to_1671 (cd ../../crypto_plugins/flutter_liblelantus/scripts/macos && ./build_all.sh ) (cd ../../crypto_plugins/flutter_libepiccash/scripts/macos && ./build_all.sh ) -set_rust_to_1840 -(cd ../../crypto_plugins/xelis_flutter/scripts/macos && ./build_all.sh ) set_rust_to_1720 (cd ../../crypto_plugins/frostdart/scripts/macos && ./build_all.sh ) diff --git a/scripts/macos/build_all_duo.sh b/scripts/macos/build_all_duo.sh index 387020650..8a53e5801 100755 --- a/scripts/macos/build_all_duo.sh +++ b/scripts/macos/build_all_duo.sh @@ -10,8 +10,6 @@ set_rust_to_1671 (cd ../../crypto_plugins/flutter_liblelantus/scripts/macos && ./build_all.sh ) (cd ../../crypto_plugins/flutter_libepiccash/scripts/macos && ./build_all.sh ) -set_rust_to_1840 -(cd ../../crypto_plugins/xelis_flutter/scripts/macos && ./build_all.sh ) set_rust_to_1720 (cd ../../crypto_plugins/frostdart/scripts/macos && ./build_all.sh ) From 2f02d4dc58fa11f00a5e533e511913a677934a0c Mon Sep 17 00:00:00 2001 From: Tritonn204 Date: Sun, 16 Feb 2025 00:04:23 -0800 Subject: [PATCH 118/193] removed Xelis lib from build scripts --- crypto_plugins/xelis_flutter | 2 +- pubspec.lock | 92 +++++++++++++-------------- scripts/android/build_all.sh | 4 +- scripts/android/build_all_campfire.sh | 4 +- scripts/android/build_all_duo.sh | 4 +- scripts/ios/build_all_campfire.sh | 2 +- scripts/ios/build_all_duo.sh | 2 +- scripts/linux/build_all.sh | 4 +- scripts/linux/build_all_campfire.sh | 4 +- scripts/linux/build_all_duo.sh | 4 +- scripts/macos/build_all.sh | 2 +- scripts/macos/build_all_campfire.sh | 2 +- scripts/macos/build_all_duo.sh | 2 +- scripts/windows/build_all.sh | 4 +- scripts/windows/build_all_campfire.sh | 4 +- scripts/windows/build_all_duo.sh | 4 +- 16 files changed, 61 insertions(+), 79 deletions(-) diff --git a/crypto_plugins/xelis_flutter b/crypto_plugins/xelis_flutter index 6ab305434..0f333afd9 160000 --- a/crypto_plugins/xelis_flutter +++ b/crypto_plugins/xelis_flutter @@ -1 +1 @@ -Subproject commit 6ab3054347e6b58776c69059e3352ab980b0b83e +Subproject commit 0f333afd91531e45dc4b2523af3f85fee9375edc diff --git a/pubspec.lock b/pubspec.lock index a7480b775..4113dc2eb 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -58,10 +58,10 @@ packages: dependency: "direct main" description: name: async - sha256: d2872f9c19731c2e5f10444b14686eb7cc85c76274bd6c16e1816bff9a3bab63 + sha256: "947bfcf187f74dbc5e146c9eb9c0f10c9f8b30743e341481c1e2ed3ecc18c20c" url: "https://pub.dev" source: hosted - version: "2.12.0" + version: "2.11.0" barcode_scan2: dependency: "direct main" description: @@ -159,10 +159,10 @@ packages: dependency: transitive description: name: boolean_selector - sha256: "8aab1771e1243a5063b8b0ff68042d67334e3feab9e95b9490f9a6ebf73b42ea" + sha256: "6cfb5af12253eaf2b368f07bacc5a80d1301a071c73360d746b7f2e32d762c66" url: "https://pub.dev" source: hosted - version: "2.1.2" + version: "2.1.1" borsh_annotation: dependency: transitive description: @@ -305,10 +305,10 @@ packages: dependency: transitive description: name: characters - sha256: f71061c654a3380576a52b451dd5532377954cf9dbd272a78fc8479606670803 + sha256: "04a925763edad70e8443c99234dc3328f442e811f1d8fd1a72f1c8ad0f69a605" url: "https://pub.dev" source: hosted - version: "1.4.0" + version: "1.3.0" charcode: dependency: transitive description: @@ -337,10 +337,10 @@ packages: dependency: transitive description: name: clock - sha256: fddb70d9b5277016c77a80201021d40a2247104d9f4aa7bab7157b7e3f05b84b + sha256: cb6d7f03e1de671e34607e909a7213e31d7752be4fb66a86d29fe1eb14bfb5cf url: "https://pub.dev" source: hosted - version: "1.1.2" + version: "1.1.1" code_builder: dependency: transitive description: @@ -371,10 +371,10 @@ packages: dependency: transitive description: name: collection - sha256: "2f5709ae4d3d59dd8f7cd309b4e023046b57d8a6c82130785d2b0e5868084e76" + sha256: a1ace0a119f20aabc852d165077c036cd864315bd99b7eaa10a60100341941bf url: "https://pub.dev" source: hosted - version: "1.19.1" + version: "1.19.0" compat: dependency: "direct main" description: @@ -742,10 +742,10 @@ packages: dependency: transitive description: name: fake_async - sha256: "6a95e56b2449df2273fd8c45a662d6947ce1ebb7aafe80e550a3f68297f3cacc" + sha256: "511392330127add0b769b75a987850d136345d9227c6b94c96a04cf4a391bf78" url: "https://pub.dev" source: hosted - version: "1.3.2" + version: "1.3.1" ffi: dependency: "direct main" description: @@ -758,10 +758,10 @@ packages: dependency: transitive description: name: file - sha256: a3b4f84adafef897088c160faf7dfffb7696046cb13ae90b508c2cbc95d3b8d4 + sha256: "5fc22d7c25582e38ad9a8515372cd9a93834027aacf1801cf01164dac0ffa08c" url: "https://pub.dev" source: hosted - version: "7.0.1" + version: "7.0.0" file_picker: dependency: "direct main" description: @@ -1229,18 +1229,18 @@ packages: dependency: transitive description: name: leak_tracker - sha256: c35baad643ba394b40aac41080300150a4f08fd0fd6a10378f8f7c6bc161acec + sha256: "7bb2830ebd849694d1ec25bf1f44582d6ac531a57a365a803a6034ff751d2d06" url: "https://pub.dev" source: hosted - version: "10.0.8" + version: "10.0.7" leak_tracker_flutter_testing: dependency: transitive description: name: leak_tracker_flutter_testing - sha256: f8b613e7e6a13ec79cfdc0e97638fddb3ab848452eff057653abd3edba760573 + sha256: "9491a714cca3667b60b5c420da8217e6de0d1ba7a5ec322fab01758f6998f379" url: "https://pub.dev" source: hosted - version: "3.0.9" + version: "3.0.8" leak_tracker_testing: dependency: transitive description: @@ -1341,10 +1341,10 @@ packages: dependency: transitive description: name: matcher - sha256: dc58c723c3c24bf8d3e2d3ad3f2f9d7bd9cf43ec6feaa64181775e60190153f2 + sha256: d2323aa2060500f906aa31a895b4030b6da3ebdcc5619d14ce1aada65cd161cb url: "https://pub.dev" source: hosted - version: "0.12.17" + version: "0.12.16+1" material_color_utilities: dependency: transitive description: @@ -1365,10 +1365,10 @@ packages: dependency: "direct main" description: name: meta - sha256: e3641ec5d63ebf0d9b41bd43201a66e3fc79a65db5f61fc181f04cd27aab950c + sha256: bdb68674043280c3428e9ec998512fb681678676b3c54e773629ffe74419f8c7 url: "https://pub.dev" source: hosted - version: "1.16.0" + version: "1.15.0" mime: dependency: transitive description: @@ -1486,10 +1486,10 @@ packages: dependency: transitive description: name: path - sha256: "75cca69d1490965be98c73ceaea117e8a04dd21217b37b292c9ddbec0d955bc5" + sha256: "087ce49c3f0dc39180befefc60fdb4acd8f8620e5682fe2476afd0b3688bb4af" url: "https://pub.dev" source: hosted - version: "1.9.1" + version: "1.9.0" path_parsing: dependency: transitive description: @@ -1614,10 +1614,10 @@ packages: dependency: transitive description: name: platform - sha256: "5d6b1b0036a5f331ebc77c850ebc8506cbc1e9416c27e59b439f917a902a4984" + sha256: "9b71283fc13df574056616011fb138fd3b793ea47cc509c189a6c3fa5f8a1a65" url: "https://pub.dev" source: hosted - version: "3.1.6" + version: "3.1.5" plugin_platform_interface: dependency: transitive description: @@ -1654,10 +1654,10 @@ packages: dependency: transitive description: name: process - sha256: "107d8be718f120bbba9dcd1e95e3bd325b1b4a4f07db64154635ba03f2567a0d" + sha256: "21e54fd2faf1b5bdd5102afd25012184a6793927648ea81eea80552ac9405b32" url: "https://pub.dev" source: hosted - version: "5.0.3" + version: "5.0.2" protobuf: dependency: transitive description: @@ -1861,10 +1861,10 @@ packages: dependency: transitive description: name: source_span - sha256: "254ee5351d6cb365c859e20ee823c3bb479bf4a293c22d17a9f1bf144ce86f7c" + sha256: "53e943d4206a5e30df338fd4c6e7a077e02254531b138a15aec3bd143c1a8b3c" url: "https://pub.dev" source: hosted - version: "1.10.1" + version: "1.10.0" sqlite3: dependency: "direct main" description: @@ -1885,10 +1885,10 @@ packages: dependency: transitive description: name: stack_trace - sha256: "8b27215b45d22309b5cddda1aa2b19bdfec9df0e765f2de506401c071d38d1b1" + sha256: "9f47fd3630d76be3ab26f0ee06d213679aa425996925ff3feffdec504931c377" url: "https://pub.dev" source: hosted - version: "1.12.1" + version: "1.12.0" stack_wallet_backup: dependency: "direct main" description: @@ -1918,10 +1918,10 @@ packages: dependency: "direct main" description: name: stream_channel - sha256: "969e04c80b8bcdf826f8f16579c7b14d780458bd97f56d107d3950fdbeef059d" + sha256: ba2aa5d8cc609d96bbb2899c28934f9e1af5cddbd60a827822ea467161eb54e7 url: "https://pub.dev" source: hosted - version: "2.1.4" + version: "2.1.2" stream_transform: dependency: transitive description: @@ -1934,10 +1934,10 @@ packages: dependency: transitive description: name: string_scanner - sha256: "921cd31725b72fe181906c6a94d987c78e3b98c2e205b397ea399d4054872b43" + sha256: "688af5ed3402a4bde5b3a6c15fd768dbf2621a614950b17f04626c431ab3c4c3" url: "https://pub.dev" source: hosted - version: "1.4.1" + version: "1.3.0" string_validator: dependency: "direct main" description: @@ -1958,34 +1958,34 @@ packages: dependency: transitive description: name: term_glyph - sha256: "7f554798625ea768a7518313e58f83891c7f5024f88e46e7182a4558850a4b8e" + sha256: a29248a84fbb7c79282b40b8c72a1209db169a2e0542bce341da992fe1bc7e84 url: "https://pub.dev" source: hosted - version: "1.2.2" + version: "1.2.1" test: dependency: transitive description: name: test - sha256: "301b213cd241ca982e9ba50266bd3f5bd1ea33f1455554c5abb85d1be0e2d87e" + sha256: "713a8789d62f3233c46b4a90b174737b2c04cb6ae4500f2aa8b1be8f03f5e67f" url: "https://pub.dev" source: hosted - version: "1.25.15" + version: "1.25.8" test_api: dependency: transitive description: name: test_api - sha256: fb31f383e2ee25fbbfe06b40fe21e1e458d14080e3c67e7ba0acfde4df4e0bbd + sha256: "664d3a9a64782fcdeb83ce9c6b39e78fd2971d4e37827b9b06c3aa1edc5e760c" url: "https://pub.dev" source: hosted - version: "0.7.4" + version: "0.7.3" test_core: dependency: transitive description: name: test_core - sha256: "84d17c3486c8dfdbe5e12a50c8ae176d15e2a771b96909a9442b40173649ccaa" + sha256: "12391302411737c176b0b5d6491f466b0dd56d4763e347b6714efbaa74d7953d" url: "https://pub.dev" source: hosted - version: "0.6.8" + version: "0.6.5" tezart: dependency: "direct main" description: @@ -2192,10 +2192,10 @@ packages: dependency: transitive description: name: vm_service - sha256: "0968250880a6c5fe7edc067ed0a13d4bae1577fe2771dcf3010d52c4a9d3ca14" + sha256: f6be3ed8bd01289b34d679c2b62226f63c0e69f9fd2e50a6b3c1c729a961041b url: "https://pub.dev" source: hosted - version: "14.3.1" + version: "14.3.0" wakelock_platform_interface: dependency: transitive description: diff --git a/scripts/android/build_all.sh b/scripts/android/build_all.sh index b6e6527c3..6547783e2 100755 --- a/scripts/android/build_all.sh +++ b/scripts/android/build_all.sh @@ -13,10 +13,8 @@ mkdir -p build PLUGINS_DIR=../../crypto_plugins (cd "${PLUGINS_DIR}"/flutter_liblelantus/scripts/android && ./build_all.sh ) -(cd "${PLUGINS_DIR}"/flutter_libepiccash/scripts/android && ./build_all.sh ) -set_rust_to_1840 -(cd "${PLUGINS_DIR}"/xelis_flutter/scripts/android && ./build_all.sh ) set_rust_to_1720 +(cd "${PLUGINS_DIR}"/flutter_libepiccash/scripts/android && ./build_all.sh ) (cd "${PLUGINS_DIR}"/frostdart/scripts/android && ./build_all.sh ) wait diff --git a/scripts/android/build_all_campfire.sh b/scripts/android/build_all_campfire.sh index b6e6527c3..6547783e2 100755 --- a/scripts/android/build_all_campfire.sh +++ b/scripts/android/build_all_campfire.sh @@ -13,10 +13,8 @@ mkdir -p build PLUGINS_DIR=../../crypto_plugins (cd "${PLUGINS_DIR}"/flutter_liblelantus/scripts/android && ./build_all.sh ) -(cd "${PLUGINS_DIR}"/flutter_libepiccash/scripts/android && ./build_all.sh ) -set_rust_to_1840 -(cd "${PLUGINS_DIR}"/xelis_flutter/scripts/android && ./build_all.sh ) set_rust_to_1720 +(cd "${PLUGINS_DIR}"/flutter_libepiccash/scripts/android && ./build_all.sh ) (cd "${PLUGINS_DIR}"/frostdart/scripts/android && ./build_all.sh ) wait diff --git a/scripts/android/build_all_duo.sh b/scripts/android/build_all_duo.sh index a84ec4f8f..30ea1b82c 100755 --- a/scripts/android/build_all_duo.sh +++ b/scripts/android/build_all_duo.sh @@ -15,10 +15,8 @@ mkdir -p build PLUGINS_DIR=../../crypto_plugins (cd "${PLUGINS_DIR}"/flutter_liblelantus/scripts/android && ./build_all.sh ) -(cd "${PLUGINS_DIR}"/flutter_libepiccash/scripts/android && ./build_all.sh ) -set_rust_to_1840 -(cd "${PLUGINS_DIR}"/xelis_flutter/scripts/android && ./build_all.sh ) set_rust_to_1720 +(cd "${PLUGINS_DIR}"/flutter_libepiccash/scripts/android && ./build_all.sh ) (cd "${PLUGINS_DIR}"/frostdart/scripts/android && ./build_all.sh ) wait diff --git a/scripts/ios/build_all_campfire.sh b/scripts/ios/build_all_campfire.sh index bcb03e991..1389a0dcc 100755 --- a/scripts/ios/build_all_campfire.sh +++ b/scripts/ios/build_all_campfire.sh @@ -15,8 +15,8 @@ rustup target add aarch64-apple-ios rustup target add x86_64-apple-ios (cd ../../crypto_plugins/flutter_liblelantus/scripts/ios && ./build_all.sh ) -(cd ../../crypto_plugins/flutter_libepiccash/scripts/ios && ./build_all.sh ) set_rust_to_1720 +(cd ../../crypto_plugins/flutter_libepiccash/scripts/ios && ./build_all.sh ) (cd ../../crypto_plugins/frostdart/scripts/ios && ./build_all.sh ) wait diff --git a/scripts/ios/build_all_duo.sh b/scripts/ios/build_all_duo.sh index 89e6f4641..60f9192ec 100755 --- a/scripts/ios/build_all_duo.sh +++ b/scripts/ios/build_all_duo.sh @@ -17,8 +17,8 @@ rustup target add aarch64-apple-ios rustup target add x86_64-apple-ios (cd ../../crypto_plugins/flutter_liblelantus/scripts/ios && ./build_all.sh ) -(cd ../../crypto_plugins/flutter_libepiccash/scripts/ios && ./build_all.sh ) set_rust_to_1720 +(cd ../../crypto_plugins/flutter_libepiccash/scripts/ios && ./build_all.sh ) (cd ../../crypto_plugins/frostdart/scripts/ios && ./build_all.sh ) wait diff --git a/scripts/linux/build_all.sh b/scripts/linux/build_all.sh index 746bfd880..f45a500ff 100755 --- a/scripts/linux/build_all.sh +++ b/scripts/linux/build_all.sh @@ -13,10 +13,8 @@ set_rust_to_1671 mkdir -p build ./build_secure_storage_deps.sh (cd ../../crypto_plugins/flutter_liblelantus/scripts/linux && ./build_all.sh ) -(cd ../../crypto_plugins/flutter_libepiccash/scripts/linux && ./build_all.sh ) -set_rust_to_1840 -(cd ../../crypto_plugins/xelis_flutter/scripts/linux && ./build_all.sh ) set_rust_to_1720 +(cd ../../crypto_plugins/flutter_libepiccash/scripts/linux && ./build_all.sh ) (cd ../../crypto_plugins/frostdart/scripts/linux && ./build_all.sh ) ./build_secp256k1.sh diff --git a/scripts/linux/build_all_campfire.sh b/scripts/linux/build_all_campfire.sh index 746bfd880..f45a500ff 100755 --- a/scripts/linux/build_all_campfire.sh +++ b/scripts/linux/build_all_campfire.sh @@ -13,10 +13,8 @@ set_rust_to_1671 mkdir -p build ./build_secure_storage_deps.sh (cd ../../crypto_plugins/flutter_liblelantus/scripts/linux && ./build_all.sh ) -(cd ../../crypto_plugins/flutter_libepiccash/scripts/linux && ./build_all.sh ) -set_rust_to_1840 -(cd ../../crypto_plugins/xelis_flutter/scripts/linux && ./build_all.sh ) set_rust_to_1720 +(cd ../../crypto_plugins/flutter_libepiccash/scripts/linux && ./build_all.sh ) (cd ../../crypto_plugins/frostdart/scripts/linux && ./build_all.sh ) ./build_secp256k1.sh diff --git a/scripts/linux/build_all_duo.sh b/scripts/linux/build_all_duo.sh index 1fa5419c5..6c8d5cd58 100755 --- a/scripts/linux/build_all_duo.sh +++ b/scripts/linux/build_all_duo.sh @@ -15,10 +15,8 @@ set_rust_to_1671 mkdir -p build ./build_secure_storage_deps.sh & (cd ../../crypto_plugins/flutter_liblelantus/scripts/linux && ./build_all.sh ) -(cd ../../crypto_plugins/flutter_libepiccash/scripts/linux && ./build_all.sh ) -set_rust_to_1840 -(cd ../../crypto_plugins/xelis_flutter/scripts/linux && ./build_all.sh ) set_rust_to_1720 +(cd ../../crypto_plugins/flutter_libepiccash/scripts/linux && ./build_all.sh ) (cd ../../crypto_plugins/frostdart/scripts/linux && ./build_all.sh ) ./build_secp256k1.sh diff --git a/scripts/macos/build_all.sh b/scripts/macos/build_all.sh index af608846f..e7a9b6eea 100755 --- a/scripts/macos/build_all.sh +++ b/scripts/macos/build_all.sh @@ -7,8 +7,8 @@ source ../rust_version.sh set_rust_to_1671 (cd ../../crypto_plugins/flutter_liblelantus/scripts/macos && ./build_all.sh ) -(cd ../../crypto_plugins/flutter_libepiccash/scripts/macos && ./build_all.sh ) set_rust_to_1720 +(cd ../../crypto_plugins/flutter_libepiccash/scripts/macos && ./build_all.sh ) (cd ../../crypto_plugins/frostdart/scripts/macos && ./build_all.sh ) wait diff --git a/scripts/macos/build_all_campfire.sh b/scripts/macos/build_all_campfire.sh index af608846f..e7a9b6eea 100755 --- a/scripts/macos/build_all_campfire.sh +++ b/scripts/macos/build_all_campfire.sh @@ -7,8 +7,8 @@ source ../rust_version.sh set_rust_to_1671 (cd ../../crypto_plugins/flutter_liblelantus/scripts/macos && ./build_all.sh ) -(cd ../../crypto_plugins/flutter_libepiccash/scripts/macos && ./build_all.sh ) set_rust_to_1720 +(cd ../../crypto_plugins/flutter_libepiccash/scripts/macos && ./build_all.sh ) (cd ../../crypto_plugins/frostdart/scripts/macos && ./build_all.sh ) wait diff --git a/scripts/macos/build_all_duo.sh b/scripts/macos/build_all_duo.sh index 8a53e5801..ffba77824 100755 --- a/scripts/macos/build_all_duo.sh +++ b/scripts/macos/build_all_duo.sh @@ -9,8 +9,8 @@ source ../rust_version.sh set_rust_to_1671 (cd ../../crypto_plugins/flutter_liblelantus/scripts/macos && ./build_all.sh ) -(cd ../../crypto_plugins/flutter_libepiccash/scripts/macos && ./build_all.sh ) set_rust_to_1720 +(cd ../../crypto_plugins/flutter_libepiccash/scripts/macos && ./build_all.sh ) (cd ../../crypto_plugins/frostdart/scripts/macos && ./build_all.sh ) wait diff --git a/scripts/windows/build_all.sh b/scripts/windows/build_all.sh index 498e95b75..7398f9ca0 100755 --- a/scripts/windows/build_all.sh +++ b/scripts/windows/build_all.sh @@ -8,10 +8,8 @@ set_rust_to_1671 mkdir -p build (cd ../../crypto_plugins/flutter_libepiccash/scripts/windows && ./build_all.sh ) -(cd ../../crypto_plugins/flutter_liblelantus/scripts/windows && ./build_all.sh ) -set_rust_to_1840 -(cd ../../crypto_plugins/xelis_flutter/scripts/windows && ./build_all.sh ) set_rust_to_1720 +(cd ../../crypto_plugins/flutter_liblelantus/scripts/windows && ./build_all.sh ) (cd ../../crypto_plugins/frostdart/scripts/windows && ./build_all.sh ) ./build_secp256k1_wsl.sh diff --git a/scripts/windows/build_all_campfire.sh b/scripts/windows/build_all_campfire.sh index 6eb31ac04..6c7d153ce 100755 --- a/scripts/windows/build_all_campfire.sh +++ b/scripts/windows/build_all_campfire.sh @@ -8,10 +8,8 @@ set_rust_to_1671 mkdir -p build (cd ../../crypto_plugins/flutter_libepiccash/scripts/windows && ./build_all.sh ) -(cd ../../crypto_plugins/flutter_liblelantus/scripts/windows && ./build_all.sh ) -set_rust_to_1840 -(cd ../../crypto_plugins/frostdart/scripts/windows && ./build_all.sh ) set_rust_to_1720 +(cd ../../crypto_plugins/flutter_liblelantus/scripts/windows && ./build_all.sh ) (cd ../../crypto_plugins/xelis_flutter/scripts/windows && ./build_all.sh ) ./build_secp256k1_wsl.sh diff --git a/scripts/windows/build_all_duo.sh b/scripts/windows/build_all_duo.sh index 5b5b0772a..5d77f4292 100755 --- a/scripts/windows/build_all_duo.sh +++ b/scripts/windows/build_all_duo.sh @@ -10,10 +10,8 @@ set_rust_to_1671 mkdir -p build (cd ../../crypto_plugins/flutter_libepiccash/scripts/windows && ./build_all.sh ) -(cd ../../crypto_plugins/flutter_liblelantus/scripts/windows && ./build_all.sh ) -set_rust_to_1840 -(cd ../../crypto_plugins/frostdart/scripts/windows && ./build_all.sh ) set_rust_to_1720 +(cd ../../crypto_plugins/flutter_liblelantus/scripts/windows && ./build_all.sh ) (cd ../../crypto_plugins/xelis_flutter/scripts/windows && ./build_all.sh ) ./build_secp256k1_wsl.sh From 0dad4ad591a8f4b37216416898cd8a30cee721f9 Mon Sep 17 00:00:00 2001 From: Tritonn204 Date: Mon, 17 Feb 2025 11:16:13 -0800 Subject: [PATCH 119/193] updated linux devops for new Xelis flutter setup, fixed Xelis fee estimation bug --- lib/wallets/wallet/impl/xelis_wallet.dart | 101 +++++++++++------- .../app_config/templates/linux/CMakeLists.txt | 3 - .../templates/windows/CMakeLists.txt | 4 - 3 files changed, 62 insertions(+), 46 deletions(-) diff --git a/lib/wallets/wallet/impl/xelis_wallet.dart b/lib/wallets/wallet/impl/xelis_wallet.dart index 5fbbf976b..7e6fe2ebd 100644 --- a/lib/wallets/wallet/impl/xelis_wallet.dart +++ b/lib/wallets/wallet/impl/xelis_wallet.dart @@ -47,6 +47,8 @@ import 'package:stack_wallet_backup/generate_password.dart'; import 'package:web_socket_channel/web_socket_channel.dart'; import '../intermediate/lib_xelis_wallet.dart'; +import 'dart:math'; + class XelisWallet extends LibXelisWallet { XelisWallet(CryptoCurrencyNetwork network) : super(Xelis(network)); // ==================== Overrides ============================================ @@ -577,45 +579,66 @@ class XelisWallet extends LibXelisWallet { checkInitialized(); final asset = assetId ?? xelis_sdk.xelisAsset; - // // Use default address if recipients list is empty - // final effectiveRecipients = recipients.isNotEmpty - // ? recipients - // : [( - // address: 'xel:xz9574c80c4xegnvurazpmxhw5dlg2n0g9qm60uwgt75uqyx3pcsqzzra9m', - // amount: amount, - // isChange: false - // )]; - - // final transfers = await Future.wait( - // effectiveRecipients.map((recipient) async { - // final amountStr = await libXelisWallet!.formatCoin( - // atomicAmount: recipient.amount.raw, - // assetHash: asset - // ); - // return x_wallet.Transfer( - // floatAmount: amountStr as double, - // strAddress: recipient.address, - // assetHash: asset, - // ); - // }) - // ); - - // // Estimate fees - // final estimatedFeeString = await libXelisWallet!.estimateFees(transfers: transfers); - // final feeAmount = Amount( - // rawValue: BigInt.parse(estimatedFeeString), - // fractionDigits: cryptoCurrency.fractionDigits, - // ); - - // // Apply fee multiplier - // final multiplier = feeMultiplier ?? 1.0; - return Amount( - // rawValue: (BigInt.from((feeAmount.raw * - // BigInt.from((multiplier * 100).toInt())) / - // BigInt.from(100))), - rawValue: BigInt.zero, - fractionDigits: cryptoCurrency.fractionDigits, - ); + // Default values for a new wallet or when estimation fails + final defaultDecimals = 8; + final defaultFee = BigInt.from(0); + + // Use default address if recipients list is empty + final effectiveRecipients = recipients.isNotEmpty + ? recipients + : [( + address: 'xel:xz9574c80c4xegnvurazpmxhw5dlg2n0g9qm60uwgt75uqyx3pcsqzzra9m', + amount: amount, + isChange: false + )]; + + try { + final transfers = await Future.wait( + effectiveRecipients.map((recipient) async { + try { + final amt = double.parse(await libXelisWallet!.formatCoin( + atomicAmount: recipient.amount.raw, + assetHash: asset + )); + return x_wallet.Transfer( + floatAmount: amt, + strAddress: recipient.address, + assetHash: asset, + extraData: null, + ); + } catch (e) { + // Handle formatCoin error - use default conversion + debugPrint("formatCoin failed: $e, using fallback conversion"); + final rawAmount = recipient.amount.raw; + final floatAmount = rawAmount / BigInt.from(10).pow(defaultDecimals); + return x_wallet.Transfer( + floatAmount: floatAmount.toDouble(), + strAddress: recipient.address, + assetHash: asset, + extraData: null, + ); + } + }) + ); + + final decimals = await libXelisWallet!.getAssetDecimals( + asset: asset + ); + final estimatedFee = double.parse(await libXelisWallet!.estimateFees(transfers: transfers)); + final rawFee = (estimatedFee * pow(10, decimals)).round(); + return Amount( + rawValue: BigInt.from(rawFee), + fractionDigits: cryptoCurrency.fractionDigits, + ); + } catch (e, s) { + debugPrint("Fee estimation failed: $e\n$s"); + + debugPrint("Using fallback fee: $defaultFee"); + return Amount( + rawValue: defaultFee, + fractionDigits: cryptoCurrency.fractionDigits, + ); + } } catch (e, s) { Logging.instance.log( "Exception rethrown from estimateFeeFor(): $e\n$s", diff --git a/scripts/app_config/templates/linux/CMakeLists.txt b/scripts/app_config/templates/linux/CMakeLists.txt index f1853439c..25750ef4f 100644 --- a/scripts/app_config/templates/linux/CMakeLists.txt +++ b/scripts/app_config/templates/linux/CMakeLists.txt @@ -140,9 +140,6 @@ install(FILES "${CMAKE_CURRENT_SOURCE_DIR}/../crypto_plugins/flutter_libepiccash install(FILES "${CMAKE_CURRENT_SOURCE_DIR}/../crypto_plugins/flutter_liblelantus/scripts/linux/build/libmobileliblelantus.so" DESTINATION "${INSTALL_BUNDLE_LIB_DIR}" COMPONENT Runtime) -install(FILES "${CMAKE_CURRENT_SOURCE_DIR}/../crypto_plugins/xelis_flutter/scripts/linux/build/libxelis_flutter.so" DESTINATION "${INSTALL_BUNDLE_LIB_DIR}" - COMPONENT Runtime) - install(FILES "${CMAKE_CURRENT_SOURCE_DIR}/../scripts/linux/build/jsoncpp/build/src/lib_json/libjsoncpp.so.1.7.4" DESTINATION "${INSTALL_BUNDLE_LIB_DIR}" COMPONENT Runtime) install(FILES "${CMAKE_CURRENT_SOURCE_DIR}/../scripts/linux/build/jsoncpp/build/src/lib_json/libjsoncpp.so.1" DESTINATION "${INSTALL_BUNDLE_LIB_DIR}" diff --git a/scripts/app_config/templates/windows/CMakeLists.txt b/scripts/app_config/templates/windows/CMakeLists.txt index e998725c9..b9add856d 100644 --- a/scripts/app_config/templates/windows/CMakeLists.txt +++ b/scripts/app_config/templates/windows/CMakeLists.txt @@ -86,10 +86,6 @@ install(FILES "${CMAKE_CURRENT_SOURCE_DIR}/../crypto_plugins/flutter_libepiccash install(FILES "${CMAKE_CURRENT_SOURCE_DIR}/../crypto_plugins/flutter_liblelantus/scripts/windows/build/libmobileliblelantus.dll" DESTINATION "${INSTALL_BUNDLE_LIB_DIR}" COMPONENT Runtime) -# todo make this handle arm+x86, required plugin adjustment -# install(FILES "${CMAKE_CURRENT_SOURCE_DIR}/../crypto_plugins/xelis_flutter/windows/bin/x86_64-unknown-windows-msvc/release/libxelis_flutter.so" DESTINATION "${INSTALL_BUNDLE_LIB_DIR}" -# COMPONENT Runtime) - if(PLUGIN_BUNDLED_LIBRARIES) install(FILES "${PLUGIN_BUNDLED_LIBRARIES}" DESTINATION "${INSTALL_BUNDLE_LIB_DIR}" From 102fab5faee2f2969a8baa40bdb0dc98df2d77a3 Mon Sep 17 00:00:00 2001 From: Tritonn204 Date: Mon, 17 Feb 2025 14:01:05 -0800 Subject: [PATCH 120/193] updated price_test, corrected outgoing tx db entries for xelis --- crypto_plugins/xelis_flutter | 2 +- .../tx_v2/transaction_v2_details_view.dart | 8 +++- lib/wallets/wallet/impl/xelis_wallet.dart | 21 +++++++++- test/price_test.dart | 38 ++++++++++++------- 4 files changed, 51 insertions(+), 18 deletions(-) diff --git a/crypto_plugins/xelis_flutter b/crypto_plugins/xelis_flutter index 0f333afd9..0413b9e49 160000 --- a/crypto_plugins/xelis_flutter +++ b/crypto_plugins/xelis_flutter @@ -1 +1 @@ -Subproject commit 0f333afd91531e45dc4b2523af3f85fee9375edc +Subproject commit 0413b9e49fa5fb8f0b30c8c5c559228f26435e2c diff --git a/lib/pages/wallet_view/transaction_views/tx_v2/transaction_v2_details_view.dart b/lib/pages/wallet_view/transaction_views/tx_v2/transaction_v2_details_view.dart index 2acb6b1a1..8f0852941 100644 --- a/lib/pages/wallet_view/transaction_views/tx_v2/transaction_v2_details_view.dart +++ b/lib/pages/wallet_view/transaction_views/tx_v2/transaction_v2_details_view.dart @@ -1366,13 +1366,17 @@ class _TransactionV2DetailsViewState ], ), ), - if (coin is! NanoCurrency) + if (coin is! NanoCurrency && + !(coin is Xelis && _transaction.type == TransactionType.incoming) + ) isDesktop ? const _Divider() : const SizedBox( height: 12, ), - if (coin is! NanoCurrency) + if (coin is! NanoCurrency && + !(coin is Xelis && _transaction.type == TransactionType.incoming) + ) RoundedWhiteContainer( padding: isDesktop ? const EdgeInsets.all(16) diff --git a/lib/wallets/wallet/impl/xelis_wallet.dart b/lib/wallets/wallet/impl/xelis_wallet.dart index 7e6fe2ebd..4eb300b90 100644 --- a/lib/wallets/wallet/impl/xelis_wallet.dart +++ b/lib/wallets/wallet/impl/xelis_wallet.dart @@ -356,6 +356,14 @@ class XelisWallet extends LibXelisWallet { coinbase: null, walletOwns: true, )); + + outputs.add(OutputV2.isarCantDoRequiredInDefaultConstructor( + scriptPubKeyHex: "", + valueStringSats: burn.amount.toString(), + addresses: ['burn'], + walletOwns: false, + )); + otherData['burnAsset'] = burn.asset; } else if (entryType is xelis_sdk.IncomingEntry) { final incoming = entryType; @@ -376,9 +384,10 @@ class XelisWallet extends LibXelisWallet { outputs.add(OutputV2.isarCantDoRequiredInDefaultConstructor( scriptPubKeyHex: "", valueStringSats: transfer.amount.toString(), - addresses: [incoming.from], + addresses: [thisAddress], walletOwns: true, )); + otherData['asset_${transfer.asset}'] = transfer.amount.toString(); if (transfer.extraData != null) { otherData['extraData_${transfer.asset}'] = transfer.extraData!.toJson(); @@ -404,13 +413,21 @@ class XelisWallet extends LibXelisWallet { scriptSigAsm: null, sequence: null, outpoint: null, - addresses: [transfer.destination], + addresses: [thisAddress], valueStringSats: (transfer.amount + outgoing.fee).toString(), witness: null, innerRedeemScriptAsm: null, coinbase: null, walletOwns: true, )); + + outputs.add(OutputV2.isarCantDoRequiredInDefaultConstructor( + scriptPubKeyHex: "", + valueStringSats: transfer.amount.toString(), + addresses: [transfer.destination], + walletOwns: false, + )); + otherData['asset_${transfer.asset}_amount'] = transfer.amount.toString(); otherData['asset_${transfer.asset}_fee'] = fee.toString(); if (transfer.extraData != null) { diff --git a/test/price_test.dart b/test/price_test.dart index dc7aaeb9e..2a5b9c038 100644 --- a/test/price_test.dart +++ b/test/price_test.dart @@ -30,7 +30,7 @@ void main() { url: Uri.parse( "https://api.coingecko.com/api/v3/coins/markets?vs_currency=btc&ids" "=monero,bitcoin,litecoin,ecash,epic-cash,zcoin,dogecoin,bitcoin-cash" - ",namecoin,wownero,ethereum,particl,nano,banano,stellar,tezos" + ",namecoin,wownero,ethereum,particl,nano,banano,stellar,tezos,xelis" "&order=market_cap_desc&per_page=50" "&page=1&sparkline=false"), headers: { @@ -93,7 +93,10 @@ void main() { 'max_supply":null,"ath":0.00013848,"ath_change_percentage":-79.75864' ',"ath_date":"2021-12-11T08:39:41.129Z","atl":5.74028e-07,"atl_chang' 'e_percentage":4783.08078,"atl_date":"2020-03-13T16:55:01.177Z","roi' - '":null,"last_updated":"2022-08-22T16:38:32.826Z"}]'), + '":null,"last_updated":"2022-08-22T16:38:32.826Z"},{"id":"xelis","sy' + 'mbol":"xel","name":"Xelis","image":"https://assets.coingecko.com/co' + 'ins/images/37615/large/green_background_black_logo.png","current_pr' + 'ice":0.00001234,"price_change_percentage_24h":5.67}]'), 200)); final priceAPI = PriceAPI(client); @@ -125,7 +128,8 @@ void main() { 'Coin.dogecoinTestNet: [0, 0.0], ' 'Coin.firoTestNet: [0, 0.0], ' 'Coin.litecoinTestNet: [0, 0.0], ' - 'Coin.stellarTestnet: [0, 0.0]' + 'Coin.stellarTestnet: [0, 0.0], ' + 'Coin.xelis: [0.00001234, 5.67]' '}', ); verify(client.get( @@ -134,7 +138,7 @@ void main() { "https://api.coingecko.com/api/v3/coins/markets?vs_currency=btc" "&ids=monero,bitcoin,litecoin,ecash,epic-cash,zcoin,dogecoin," "bitcoin-cash,namecoin,wownero,ethereum,particl,nano,banano,stellar" - ",tezos" + ",tezos,xelis" "&order=market_cap_desc&per_page=50&page=1&sparkline=false", ), headers: {'Content-Type': 'application/json'})).called(1); @@ -151,7 +155,7 @@ void main() { "https://api.coingecko.com/api/v3/coins/markets?vs_currency=btc&" "ids=monero,bitcoin,litecoin,ecash,epic-cash,zcoin,dogecoin," "bitcoin-cash,namecoin,wownero,ethereum,particl,nano,banano,stellar" - ",tezos" + ",tezos,xelis" "&order=market_cap_desc&per_page=50&page=1&sparkline=false"), headers: { 'Content-Type': 'application/json' @@ -213,7 +217,10 @@ void main() { '21000000.0,"max_supply":null,"ath":0.00013848,"ath_change_percentag' 'e":-79.75864,"ath_date":"2021-12-11T08:39:41.129Z","atl":5.74028e-0' '7,"atl_change_percentage":4783.08078,"atl_date":"2020-03-13T16:55:01' - '.177Z","roi":null,"last_updated":"2022-08-22T16:38:32.826Z"}]'), + '.177Z","roi":null,"last_updated":"2022-08-22T16:38:32.826Z"},{"id":' + '"xelis","symbol":"xel","name":"Xelis","image":"https://assets.coing' + 'ecko.com/coins/images/37615/large/green_background_black_logo.png",' + '"current_price":0.00001234,"price_change_percentage_24h":5.67}]'), 200)); final priceAPI = PriceAPI(client); @@ -247,7 +254,8 @@ void main() { 'Coin.bitcoincashTestnet: [0, 0.0], Coin.dogecoinTestNet: [0, 0.0], ' 'Coin.firoTestNet: [0, 0.0], ' 'Coin.litecoinTestNet: [0, 0.0], ' - 'Coin.stellarTestnet: [0, 0.0]' + 'Coin.stellarTestnet: [0, 0.0], ' + 'Coin.xelis: [0.00001234, 5.67]' '}', ); @@ -258,7 +266,7 @@ void main() { "https://api.coingecko.com/api/v3/coins/markets?vs_currency=btc&ids" "=monero,bitcoin,litecoin,ecash,epic-cash,zcoin,dogecoin," "bitcoin-cash,namecoin,wownero,ethereum,particl,nano,banano,stellar" - ",tezos" + ",tezos,xelis" "&order=market_cap_desc&per_page=50&page=1&sparkline=false"), headers: {'Content-Type': 'application/json'})).called(1); @@ -274,7 +282,7 @@ void main() { "https://api.coingecko.com/api/v3/coins/markets?vs_currency=btc" "&ids=monero,bitcoin,litecoin,ecash,epic-cash,zcoin,dogecoin," "bitcoin-cash,namecoin,wownero,ethereum,particl,nano,banano,stellar" - ",tezos" + ",tezos,xelis" "&order=market_cap_desc&per_page=50&page=1&sparkline=false"), headers: { 'Content-Type': 'application/json' @@ -337,7 +345,9 @@ void main() { 'y":21000000.0,"max_supply":null,"ath":0.00013848,"ath_change_perce' 'ntage":-79.75864,"ath_date":"2021-12-11T08:39:41.129Z","atl":5.74' '028e-07,"atl_change_percentage":4783.08078,"atl_date":"2020-03-13T' - '16:55:01.177Z","roi":null,"last_updated":"2022-08-22T16:38:32.826Z"}]'), + '16:55:01.177Z","roi":null,"last_updated":"2022-08-22T16:38:32.826Z"' + '},{"id":"xelis","symbol":xel,"name":com/coins/images/37615/large/g' + 'reen_background_black_logo.png,"image":"https://assets.coingecko'), 200)); final priceAPI = PriceAPI(client); @@ -368,7 +378,8 @@ void main() { 'Coin.dogecoinTestNet: [0, 0.0], ' 'Coin.firoTestNet: [0, 0.0], ' 'Coin.litecoinTestNet: [0, 0.0], ' - 'Coin.stellarTestnet: [0, 0.0]' + 'Coin.stellarTestnet: [0, 0.0], ' + 'Coin.xelis: [0, 0.0]' '}', ); }); @@ -382,7 +393,7 @@ void main() { "https://api.coingecko.com/api/v3/coins/markets?vs_currency=btc" "&ids=monero,bitcoin,litecoin,ecash,epic-cash,zcoin,dogecoin," "bitcoin-cash,namecoin,wownero,ethereum,particl,nano,banano,stellar" - ",tezos" + ",tezos,xelis" "&order=market_cap_desc&per_page=50&page=1&sparkline=false"), headers: { 'Content-Type': 'application/json' @@ -418,7 +429,8 @@ void main() { 'Coin.dogecoinTestNet: [0, 0.0], ' 'Coin.firoTestNet: [0, 0.0], ' 'Coin.litecoinTestNet: [0, 0.0], ' - 'Coin.stellarTestnet: [0, 0.0]' + 'Coin.stellarTestnet: [0, 0.0], ' + 'Coin.xelis: [0, 0.0]' '}', ); }); From 8b41d0b588da82f57bbec278853c7041f91114cf Mon Sep 17 00:00:00 2001 From: Tritonn204 Date: Thu, 20 Feb 2025 13:43:48 -0800 Subject: [PATCH 121/193] xelis_flutter branch switch adopted --- crypto_plugins/xelis_flutter | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/crypto_plugins/xelis_flutter b/crypto_plugins/xelis_flutter index 0413b9e49..e331de2f3 160000 --- a/crypto_plugins/xelis_flutter +++ b/crypto_plugins/xelis_flutter @@ -1 +1 @@ -Subproject commit 0413b9e49fa5fb8f0b30c8c5c559228f26435e2c +Subproject commit e331de2f38e8a0240ae42f1f0c2d4e752dce9574 From a06945b3a24e45b022f09a9e32da8b5ad2eeda6d Mon Sep 17 00:00:00 2001 From: Tritonn204 Date: Thu, 20 Feb 2025 13:51:29 -0800 Subject: [PATCH 122/193] xelis_flutter correction --- crypto_plugins/xelis_flutter | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/crypto_plugins/xelis_flutter b/crypto_plugins/xelis_flutter index e331de2f3..c87f524be 160000 --- a/crypto_plugins/xelis_flutter +++ b/crypto_plugins/xelis_flutter @@ -1 +1 @@ -Subproject commit e331de2f38e8a0240ae42f1f0c2d4e752dce9574 +Subproject commit c87f524be99fc3fe448d24a86f368c10ac5b1e0b From 2879e5bc03134d41c38e062f93b4964a7611e237 Mon Sep 17 00:00:00 2001 From: Tritonn204 Date: Thu, 20 Feb 2025 14:12:59 -0800 Subject: [PATCH 123/193] updated fee estimation params in xelis_flutter --- crypto_plugins/xelis_flutter | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/crypto_plugins/xelis_flutter b/crypto_plugins/xelis_flutter index c87f524be..e939a8120 160000 --- a/crypto_plugins/xelis_flutter +++ b/crypto_plugins/xelis_flutter @@ -1 +1 @@ -Subproject commit c87f524be99fc3fe448d24a86f368c10ac5b1e0b +Subproject commit e939a81205c7eb9b29069f27c965ff38f9f677f3 From 8c6f660ec643b654c3f64c1360aec1ab734353b9 Mon Sep 17 00:00:00 2001 From: Tritonn204 Date: Wed, 26 Feb 2025 14:33:28 -0800 Subject: [PATCH 124/193] libepiccash build script corrections, pubspec template adjusted for staging --- scripts/app_config/templates/pubspec.template | 6 +++--- scripts/ios/build_all.sh | 2 +- scripts/ios/build_all_campfire.sh | 2 +- scripts/ios/build_all_duo.sh | 2 +- scripts/linux/build_all.sh | 2 +- scripts/linux/build_all_campfire.sh | 2 +- scripts/linux/build_all_duo.sh | 2 +- scripts/macos/build_all.sh | 2 +- scripts/macos/build_all_campfire.sh | 2 +- scripts/macos/build_all_duo.sh | 2 +- scripts/windows/build_all.sh | 2 +- scripts/windows/build_all_campfire.sh | 2 +- scripts/windows/build_all_duo.sh | 2 +- 13 files changed, 15 insertions(+), 15 deletions(-) diff --git a/scripts/app_config/templates/pubspec.template b/scripts/app_config/templates/pubspec.template index e4d0612ac..76da23390 100644 --- a/scripts/app_config/templates/pubspec.template +++ b/scripts/app_config/templates/pubspec.template @@ -1,5 +1,5 @@ -name: stackwallet -description: Stack Wallet +name: PLACEHOLDER +description: PLACEHOLDER # The following defines the version and build number for your application. # A version number is three numbers separated by dots, like 1.2.43 @@ -11,7 +11,7 @@ description: Stack Wallet # In iOS, build-name is used as CFBundleShortVersionString while build-number used as CFBundleVersion. # Read more about iOS versioning at # https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html -version: 2.1.2+212 +version: PLACEHOLDER_V+PLACEHOLDER_B environment: sdk: ">=3.7.0 <4.0.0" diff --git a/scripts/ios/build_all.sh b/scripts/ios/build_all.sh index f21a66453..bef3e9095 100755 --- a/scripts/ios/build_all.sh +++ b/scripts/ios/build_all.sh @@ -11,8 +11,8 @@ rustup target add aarch64-apple-ios rustup target add x86_64-apple-ios (cd ../../crypto_plugins/flutter_liblelantus/scripts/ios && ./build_all.sh ) -set_rust_to_1720 (cd ../../crypto_plugins/flutter_libepiccash/scripts/ios && ./build_all.sh ) +set_rust_to_1720 (cd ../../crypto_plugins/frostdart/scripts/ios && ./build_all.sh ) wait diff --git a/scripts/ios/build_all_campfire.sh b/scripts/ios/build_all_campfire.sh index 1389a0dcc..bcb03e991 100755 --- a/scripts/ios/build_all_campfire.sh +++ b/scripts/ios/build_all_campfire.sh @@ -15,8 +15,8 @@ rustup target add aarch64-apple-ios rustup target add x86_64-apple-ios (cd ../../crypto_plugins/flutter_liblelantus/scripts/ios && ./build_all.sh ) -set_rust_to_1720 (cd ../../crypto_plugins/flutter_libepiccash/scripts/ios && ./build_all.sh ) +set_rust_to_1720 (cd ../../crypto_plugins/frostdart/scripts/ios && ./build_all.sh ) wait diff --git a/scripts/ios/build_all_duo.sh b/scripts/ios/build_all_duo.sh index 60f9192ec..89e6f4641 100755 --- a/scripts/ios/build_all_duo.sh +++ b/scripts/ios/build_all_duo.sh @@ -17,8 +17,8 @@ rustup target add aarch64-apple-ios rustup target add x86_64-apple-ios (cd ../../crypto_plugins/flutter_liblelantus/scripts/ios && ./build_all.sh ) -set_rust_to_1720 (cd ../../crypto_plugins/flutter_libepiccash/scripts/ios && ./build_all.sh ) +set_rust_to_1720 (cd ../../crypto_plugins/frostdart/scripts/ios && ./build_all.sh ) wait diff --git a/scripts/linux/build_all.sh b/scripts/linux/build_all.sh index f45a500ff..423646185 100755 --- a/scripts/linux/build_all.sh +++ b/scripts/linux/build_all.sh @@ -13,8 +13,8 @@ set_rust_to_1671 mkdir -p build ./build_secure_storage_deps.sh (cd ../../crypto_plugins/flutter_liblelantus/scripts/linux && ./build_all.sh ) -set_rust_to_1720 (cd ../../crypto_plugins/flutter_libepiccash/scripts/linux && ./build_all.sh ) +set_rust_to_1720 (cd ../../crypto_plugins/frostdart/scripts/linux && ./build_all.sh ) ./build_secp256k1.sh diff --git a/scripts/linux/build_all_campfire.sh b/scripts/linux/build_all_campfire.sh index f45a500ff..423646185 100755 --- a/scripts/linux/build_all_campfire.sh +++ b/scripts/linux/build_all_campfire.sh @@ -13,8 +13,8 @@ set_rust_to_1671 mkdir -p build ./build_secure_storage_deps.sh (cd ../../crypto_plugins/flutter_liblelantus/scripts/linux && ./build_all.sh ) -set_rust_to_1720 (cd ../../crypto_plugins/flutter_libepiccash/scripts/linux && ./build_all.sh ) +set_rust_to_1720 (cd ../../crypto_plugins/frostdart/scripts/linux && ./build_all.sh ) ./build_secp256k1.sh diff --git a/scripts/linux/build_all_duo.sh b/scripts/linux/build_all_duo.sh index 6c8d5cd58..78067b478 100755 --- a/scripts/linux/build_all_duo.sh +++ b/scripts/linux/build_all_duo.sh @@ -15,8 +15,8 @@ set_rust_to_1671 mkdir -p build ./build_secure_storage_deps.sh & (cd ../../crypto_plugins/flutter_liblelantus/scripts/linux && ./build_all.sh ) -set_rust_to_1720 (cd ../../crypto_plugins/flutter_libepiccash/scripts/linux && ./build_all.sh ) +set_rust_to_1720 (cd ../../crypto_plugins/frostdart/scripts/linux && ./build_all.sh ) ./build_secp256k1.sh diff --git a/scripts/macos/build_all.sh b/scripts/macos/build_all.sh index e7a9b6eea..af608846f 100755 --- a/scripts/macos/build_all.sh +++ b/scripts/macos/build_all.sh @@ -7,8 +7,8 @@ source ../rust_version.sh set_rust_to_1671 (cd ../../crypto_plugins/flutter_liblelantus/scripts/macos && ./build_all.sh ) -set_rust_to_1720 (cd ../../crypto_plugins/flutter_libepiccash/scripts/macos && ./build_all.sh ) +set_rust_to_1720 (cd ../../crypto_plugins/frostdart/scripts/macos && ./build_all.sh ) wait diff --git a/scripts/macos/build_all_campfire.sh b/scripts/macos/build_all_campfire.sh index e7a9b6eea..af608846f 100755 --- a/scripts/macos/build_all_campfire.sh +++ b/scripts/macos/build_all_campfire.sh @@ -7,8 +7,8 @@ source ../rust_version.sh set_rust_to_1671 (cd ../../crypto_plugins/flutter_liblelantus/scripts/macos && ./build_all.sh ) -set_rust_to_1720 (cd ../../crypto_plugins/flutter_libepiccash/scripts/macos && ./build_all.sh ) +set_rust_to_1720 (cd ../../crypto_plugins/frostdart/scripts/macos && ./build_all.sh ) wait diff --git a/scripts/macos/build_all_duo.sh b/scripts/macos/build_all_duo.sh index ffba77824..8a53e5801 100755 --- a/scripts/macos/build_all_duo.sh +++ b/scripts/macos/build_all_duo.sh @@ -9,8 +9,8 @@ source ../rust_version.sh set_rust_to_1671 (cd ../../crypto_plugins/flutter_liblelantus/scripts/macos && ./build_all.sh ) -set_rust_to_1720 (cd ../../crypto_plugins/flutter_libepiccash/scripts/macos && ./build_all.sh ) +set_rust_to_1720 (cd ../../crypto_plugins/frostdart/scripts/macos && ./build_all.sh ) wait diff --git a/scripts/windows/build_all.sh b/scripts/windows/build_all.sh index 7398f9ca0..191a46cc0 100755 --- a/scripts/windows/build_all.sh +++ b/scripts/windows/build_all.sh @@ -8,8 +8,8 @@ set_rust_to_1671 mkdir -p build (cd ../../crypto_plugins/flutter_libepiccash/scripts/windows && ./build_all.sh ) -set_rust_to_1720 (cd ../../crypto_plugins/flutter_liblelantus/scripts/windows && ./build_all.sh ) +set_rust_to_1720 (cd ../../crypto_plugins/frostdart/scripts/windows && ./build_all.sh ) ./build_secp256k1_wsl.sh diff --git a/scripts/windows/build_all_campfire.sh b/scripts/windows/build_all_campfire.sh index 6c7d153ce..f7c98194c 100755 --- a/scripts/windows/build_all_campfire.sh +++ b/scripts/windows/build_all_campfire.sh @@ -8,8 +8,8 @@ set_rust_to_1671 mkdir -p build (cd ../../crypto_plugins/flutter_libepiccash/scripts/windows && ./build_all.sh ) -set_rust_to_1720 (cd ../../crypto_plugins/flutter_liblelantus/scripts/windows && ./build_all.sh ) +set_rust_to_1720 (cd ../../crypto_plugins/xelis_flutter/scripts/windows && ./build_all.sh ) ./build_secp256k1_wsl.sh diff --git a/scripts/windows/build_all_duo.sh b/scripts/windows/build_all_duo.sh index 5d77f4292..51ca3956b 100755 --- a/scripts/windows/build_all_duo.sh +++ b/scripts/windows/build_all_duo.sh @@ -10,8 +10,8 @@ set_rust_to_1671 mkdir -p build (cd ../../crypto_plugins/flutter_libepiccash/scripts/windows && ./build_all.sh ) -set_rust_to_1720 (cd ../../crypto_plugins/flutter_liblelantus/scripts/windows && ./build_all.sh ) +set_rust_to_1720 (cd ../../crypto_plugins/xelis_flutter/scripts/windows && ./build_all.sh ) ./build_secp256k1_wsl.sh From f56519ec1401fe7b34bda236052be9c894425f85 Mon Sep 17 00:00:00 2001 From: Tritonn204 Date: Thu, 27 Feb 2025 12:44:14 -0800 Subject: [PATCH 125/193] svg change reversal --- .../svg/campfire/socials/discord.svg | 30 +++++++++---------- .../svg/campfire/socials/telegram-brands.svg | 20 ++++++------- .../svg/stack_duo/socials/discord.svg | 30 +++++++++---------- .../svg/stack_duo/socials/telegram-brands.svg | 20 ++++++------- .../svg/stack_wallet/socials/discord.svg | 30 +++++++++---------- .../stack_wallet/socials/telegram-brands.svg | 20 ++++++------- 6 files changed, 75 insertions(+), 75 deletions(-) diff --git a/asset_sources/svg/campfire/socials/discord.svg b/asset_sources/svg/campfire/socials/discord.svg index a93742dfd..4d6aff6ed 100644 --- a/asset_sources/svg/campfire/socials/discord.svg +++ b/asset_sources/svg/campfire/socials/discord.svg @@ -1,15 +1,15 @@ - - - - - + + + + + diff --git a/asset_sources/svg/campfire/socials/telegram-brands.svg b/asset_sources/svg/campfire/socials/telegram-brands.svg index 629eabf23..61d09ee08 100644 --- a/asset_sources/svg/campfire/socials/telegram-brands.svg +++ b/asset_sources/svg/campfire/socials/telegram-brands.svg @@ -1,10 +1,10 @@ - - - - - + + + + + diff --git a/asset_sources/svg/stack_duo/socials/discord.svg b/asset_sources/svg/stack_duo/socials/discord.svg index a93742dfd..4d6aff6ed 100644 --- a/asset_sources/svg/stack_duo/socials/discord.svg +++ b/asset_sources/svg/stack_duo/socials/discord.svg @@ -1,15 +1,15 @@ - - - - - + + + + + diff --git a/asset_sources/svg/stack_duo/socials/telegram-brands.svg b/asset_sources/svg/stack_duo/socials/telegram-brands.svg index 629eabf23..61d09ee08 100644 --- a/asset_sources/svg/stack_duo/socials/telegram-brands.svg +++ b/asset_sources/svg/stack_duo/socials/telegram-brands.svg @@ -1,10 +1,10 @@ - - - - - + + + + + diff --git a/asset_sources/svg/stack_wallet/socials/discord.svg b/asset_sources/svg/stack_wallet/socials/discord.svg index a93742dfd..4d6aff6ed 100644 --- a/asset_sources/svg/stack_wallet/socials/discord.svg +++ b/asset_sources/svg/stack_wallet/socials/discord.svg @@ -1,15 +1,15 @@ - - - - - + + + + + diff --git a/asset_sources/svg/stack_wallet/socials/telegram-brands.svg b/asset_sources/svg/stack_wallet/socials/telegram-brands.svg index 629eabf23..61d09ee08 100644 --- a/asset_sources/svg/stack_wallet/socials/telegram-brands.svg +++ b/asset_sources/svg/stack_wallet/socials/telegram-brands.svg @@ -1,10 +1,10 @@ - - - - - + + + + + From 0ed0ef3ed98f9a25b38683f288524268db1def13 Mon Sep 17 00:00:00 2001 From: Tritonn204 Date: Thu, 27 Feb 2025 12:48:25 -0800 Subject: [PATCH 126/193] removed frostdart from windows build scripts --- scripts/windows/build_all.sh | 2 -- scripts/windows/build_all_campfire.sh | 2 -- scripts/windows/build_all_duo.sh | 2 -- 3 files changed, 6 deletions(-) diff --git a/scripts/windows/build_all.sh b/scripts/windows/build_all.sh index 191a46cc0..19668811f 100755 --- a/scripts/windows/build_all.sh +++ b/scripts/windows/build_all.sh @@ -9,8 +9,6 @@ set_rust_to_1671 mkdir -p build (cd ../../crypto_plugins/flutter_libepiccash/scripts/windows && ./build_all.sh ) (cd ../../crypto_plugins/flutter_liblelantus/scripts/windows && ./build_all.sh ) -set_rust_to_1720 -(cd ../../crypto_plugins/frostdart/scripts/windows && ./build_all.sh ) ./build_secp256k1_wsl.sh diff --git a/scripts/windows/build_all_campfire.sh b/scripts/windows/build_all_campfire.sh index f7c98194c..19668811f 100755 --- a/scripts/windows/build_all_campfire.sh +++ b/scripts/windows/build_all_campfire.sh @@ -9,8 +9,6 @@ set_rust_to_1671 mkdir -p build (cd ../../crypto_plugins/flutter_libepiccash/scripts/windows && ./build_all.sh ) (cd ../../crypto_plugins/flutter_liblelantus/scripts/windows && ./build_all.sh ) -set_rust_to_1720 -(cd ../../crypto_plugins/xelis_flutter/scripts/windows && ./build_all.sh ) ./build_secp256k1_wsl.sh diff --git a/scripts/windows/build_all_duo.sh b/scripts/windows/build_all_duo.sh index 51ca3956b..cc55fe70b 100755 --- a/scripts/windows/build_all_duo.sh +++ b/scripts/windows/build_all_duo.sh @@ -11,8 +11,6 @@ set_rust_to_1671 mkdir -p build (cd ../../crypto_plugins/flutter_libepiccash/scripts/windows && ./build_all.sh ) (cd ../../crypto_plugins/flutter_liblelantus/scripts/windows && ./build_all.sh ) -set_rust_to_1720 -(cd ../../crypto_plugins/xelis_flutter/scripts/windows && ./build_all.sh ) ./build_secp256k1_wsl.sh From 448fd0c94d6b0be1d7889712f5a8d29c0181e36e Mon Sep 17 00:00:00 2001 From: Tritonn204 Date: Thu, 27 Feb 2025 12:49:42 -0800 Subject: [PATCH 127/193] keep version update without frostdart in windows build scripts --- scripts/windows/build_all.sh | 1 + scripts/windows/build_all_campfire.sh | 1 + scripts/windows/build_all_duo.sh | 1 + 3 files changed, 3 insertions(+) diff --git a/scripts/windows/build_all.sh b/scripts/windows/build_all.sh index 19668811f..4c9f03472 100755 --- a/scripts/windows/build_all.sh +++ b/scripts/windows/build_all.sh @@ -9,6 +9,7 @@ set_rust_to_1671 mkdir -p build (cd ../../crypto_plugins/flutter_libepiccash/scripts/windows && ./build_all.sh ) (cd ../../crypto_plugins/flutter_liblelantus/scripts/windows && ./build_all.sh ) +set_rust_to_1720 ./build_secp256k1_wsl.sh diff --git a/scripts/windows/build_all_campfire.sh b/scripts/windows/build_all_campfire.sh index 19668811f..4c9f03472 100755 --- a/scripts/windows/build_all_campfire.sh +++ b/scripts/windows/build_all_campfire.sh @@ -9,6 +9,7 @@ set_rust_to_1671 mkdir -p build (cd ../../crypto_plugins/flutter_libepiccash/scripts/windows && ./build_all.sh ) (cd ../../crypto_plugins/flutter_liblelantus/scripts/windows && ./build_all.sh ) +set_rust_to_1720 ./build_secp256k1_wsl.sh diff --git a/scripts/windows/build_all_duo.sh b/scripts/windows/build_all_duo.sh index cc55fe70b..db58ca1ff 100755 --- a/scripts/windows/build_all_duo.sh +++ b/scripts/windows/build_all_duo.sh @@ -11,6 +11,7 @@ set_rust_to_1671 mkdir -p build (cd ../../crypto_plugins/flutter_libepiccash/scripts/windows && ./build_all.sh ) (cd ../../crypto_plugins/flutter_liblelantus/scripts/windows && ./build_all.sh ) +set_rust_to_1720 ./build_secp256k1_wsl.sh From c1cd9869c02d215d25ee1dd7cae10fa73090fbc8 Mon Sep 17 00:00:00 2001 From: Tritonn204 Date: Tue, 11 Mar 2025 15:19:49 -0700 Subject: [PATCH 128/193] removed xelis submodule in favor of git tag dependency --- .gitignore | 1 - .gitmodules | 3 --- crypto_plugins/xelis_flutter | 1 - lib/wallets/crypto_currency/coins/xelis.dart | 2 +- lib/wallets/models/tx_data.dart | 5 ----- lib/wallets/wallet/impl/xelis_wallet.dart | 2 +- pubspec.lock | 8 +++++--- 7 files changed, 7 insertions(+), 15 deletions(-) delete mode 160000 crypto_plugins/xelis_flutter diff --git a/.gitignore b/.gitignore index 5e86f725e..41677c67a 100644 --- a/.gitignore +++ b/.gitignore @@ -65,7 +65,6 @@ libepic_cash_wallet.dll libmobileliblelantus.dll libtor_ffi.dll flutter_libsparkmobile.dll -xelis_flutter.dll secp256k1.dll /libisar.so /lib/app_config.g.dart diff --git a/.gitmodules b/.gitmodules index 2f76b7ffa..2186826df 100644 --- a/.gitmodules +++ b/.gitmodules @@ -7,6 +7,3 @@ [submodule "crypto_plugins/frostdart"] path = crypto_plugins/frostdart url = https://github.com/cypherstack/frostdart -[submodule "crypto_plugins/xelis_flutter"] - path = crypto_plugins/xelis_flutter - url = https://github.com/Tritonn204/xelis_flutter_ffi.git diff --git a/crypto_plugins/xelis_flutter b/crypto_plugins/xelis_flutter deleted file mode 160000 index e939a8120..000000000 --- a/crypto_plugins/xelis_flutter +++ /dev/null @@ -1 +0,0 @@ -Subproject commit e939a81205c7eb9b29069f27c965ff38f9f677f3 diff --git a/lib/wallets/crypto_currency/coins/xelis.dart b/lib/wallets/crypto_currency/coins/xelis.dart index 1f57b2afb..db4adf76b 100644 --- a/lib/wallets/crypto_currency/coins/xelis.dart +++ b/lib/wallets/crypto_currency/coins/xelis.dart @@ -50,7 +50,7 @@ class Xelis extends ElectrumCurrency { switch (network) { case CryptoCurrencyNetwork.main: return NodeModel( - host: "us-node.xelis.io", + host: "127.0.0.1", port: 443, name: DefaultNodes.defaultName, id: DefaultNodes.buildId(this), diff --git a/lib/wallets/models/tx_data.dart b/lib/wallets/models/tx_data.dart index b8839fe3d..94474e390 100644 --- a/lib/wallets/models/tx_data.dart +++ b/lib/wallets/models/tx_data.dart @@ -146,11 +146,6 @@ class TxData { return null; } - String? get getOtherData { - final val = this.otherData; - return val; - } - Amount? get amountSpark => sparkRecipients != null && sparkRecipients!.isNotEmpty ? sparkRecipients! diff --git a/lib/wallets/wallet/impl/xelis_wallet.dart b/lib/wallets/wallet/impl/xelis_wallet.dart index 4eb300b90..81cbfafe8 100644 --- a/lib/wallets/wallet/impl/xelis_wallet.dart +++ b/lib/wallets/wallet/impl/xelis_wallet.dart @@ -678,7 +678,7 @@ class XelisWallet extends LibXelisWallet { final recipient = txData.recipients!.first; final Amount sendAmount = recipient.amount; - final asset = (txData.getOtherData != null ? jsonDecode(txData.getOtherData!) : null)?['asset'] ?? xelis_sdk.xelisAsset; + final asset = (txData.otherData != null ? jsonDecode(txData.otherData!) : null)?['asset'] ?? xelis_sdk.xelisAsset; final amt = double.parse(await libXelisWallet!.formatCoin( atomicAmount: sendAmount.raw, diff --git a/pubspec.lock b/pubspec.lock index 4113dc2eb..51772d2f4 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -2345,9 +2345,11 @@ packages: xelis_flutter: dependency: "direct main" description: - path: "crypto_plugins/xelis_flutter" - relative: true - source: path + path: "." + ref: "v0.1.0" + resolved-ref: "2d36e584ae5d913b2634bcfe54e2266880cbd813" + url: "https://github.com/Tritonn204/xelis_flutter_ffi.git" + source: git version: "0.0.2" xml: dependency: transitive From 4e26e4c246af31f927f18bc45d85db9b21b2c865 Mon Sep 17 00:00:00 2001 From: Tritonn204 Date: Tue, 11 Mar 2025 16:29:35 -0700 Subject: [PATCH 129/193] updated dep template --- pubspec.lock | 164 +++++++++--------- scripts/app_config/templates/pubspec.template | 6 +- 2 files changed, 86 insertions(+), 84 deletions(-) diff --git a/pubspec.lock b/pubspec.lock index 51772d2f4..55d7b344c 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -183,10 +183,10 @@ packages: dependency: transitive description: name: build - sha256: "80184af8b6cb3e5c1c4ec6d8544d27711700bc3e6d2efad04238c7b5290889f0" + sha256: cef23f1eda9b57566c81e2133d196f8e3df48f244b317368d65c5943d91148f0 url: "https://pub.dev" source: hosted - version: "2.4.1" + version: "2.4.2" build_cli_annotations: dependency: transitive description: @@ -199,42 +199,42 @@ packages: dependency: transitive description: name: build_config - sha256: bf80fcfb46a29945b423bd9aad884590fb1dc69b330a4d4700cac476af1708d1 + sha256: "4ae2de3e1e67ea270081eaee972e1bd8f027d459f249e0f1186730784c2e7e33" url: "https://pub.dev" source: hosted - version: "1.1.1" + version: "1.1.2" build_daemon: dependency: transitive description: name: build_daemon - sha256: "79b2aef6ac2ed00046867ed354c88778c9c0f029df8a20fe10b5436826721ef9" + sha256: "8e928697a82be082206edb0b9c99c5a4ad6bc31c9e9b8b2f291ae65cd4a25daa" url: "https://pub.dev" source: hosted - version: "4.0.2" + version: "4.0.4" build_resolvers: dependency: transitive description: name: build_resolvers - sha256: "339086358431fa15d7eca8b6a36e5d783728cf025e559b834f4609a1fcfb7b0a" + sha256: b9e4fda21d846e192628e7a4f6deda6888c36b5b69ba02ff291a01fd529140f0 url: "https://pub.dev" source: hosted - version: "2.4.2" + version: "2.4.4" build_runner: dependency: "direct dev" description: name: build_runner - sha256: "028819cfb90051c6b5440c7e574d1896f8037e3c96cf17aaeb054c9311cfbf4d" + sha256: "74691599a5bc750dc96a6b4bfd48f7d9d66453eab04c7f4063134800d6a5c573" url: "https://pub.dev" source: hosted - version: "2.4.13" + version: "2.4.14" build_runner_core: dependency: transitive description: name: build_runner_core - sha256: f8126682b87a7282a339b871298cc12009cb67109cfa1614d6436fb0289193e0 + sha256: "22e3aa1c80e0ada3722fe5b63fd43d9c8990759d0a2cf489c8c5d7b2bdebc021" url: "https://pub.dev" source: hosted - version: "7.3.2" + version: "8.0.0" built_collection: dependency: transitive description: @@ -247,10 +247,10 @@ packages: dependency: transitive description: name: built_value - sha256: c7913a9737ee4007efedaffc968c049fd0f3d0e49109e778edc10de9426005cb + sha256: "28a712df2576b63c6c005c465989a348604960c0958d28be5303ba9baa841ac2" url: "https://pub.dev" source: hosted - version: "8.9.2" + version: "8.9.3" calendar_date_picker2: dependency: "direct main" description: @@ -572,10 +572,10 @@ packages: dependency: transitive description: name: dart_style - sha256: "7856d364b589d1f08986e140938578ed36ed948581fbc3bc9aef1805039ac5ab" + sha256: "7306ab8a2359a48d22310ad823521d723acfed60ee1f7e37388e8986853b6820" url: "https://pub.dev" source: hosted - version: "2.3.7" + version: "2.3.8" dartx: dependency: transitive description: @@ -881,10 +881,10 @@ packages: dependency: transitive description: name: flutter_plugin_android_lifecycle - sha256: "9b78450b89f059e96c9ebb355fa6b3df1d6b330436e0b885fb49594c41721398" + sha256: "615a505aef59b151b46bbeef55b36ce2b6ed299d160c51d84281946f0aa0ce0e" url: "https://pub.dev" source: hosted - version: "2.0.23" + version: "2.0.24" flutter_riverpod: dependency: "direct main" description: @@ -953,10 +953,10 @@ packages: dependency: "direct main" description: name: flutter_svg - sha256: "1b7723a814d84fb65869ea7115cdb3ee7c3be5a27a755c1ec60e049f6b9fcbb2" + sha256: c200fd79c918a40c5cd50ea0877fa13f81bdaf6f0a5d3dbcc2a13e3285d6aa1b url: "https://pub.dev" source: hosted - version: "2.0.11" + version: "2.0.17" flutter_test: dependency: "direct dev" description: flutter @@ -1016,10 +1016,10 @@ packages: dependency: transitive description: name: glob - sha256: "0e7014b3b7d4dac1ca4d6114f82bf1782ee86745b9b42a92c9289c23d8a0ab63" + sha256: c3f1ee72c96f8f78935e18aa8cecced9ab132419e8625dc187e1c2408efc20de url: "https://pub.dev" source: hosted - version: "2.1.2" + version: "2.1.3" google_fonts: dependency: "direct main" description: @@ -1096,18 +1096,18 @@ packages: dependency: transitive description: name: http_multi_server - sha256: "97486f20f9c2f7be8f514851703d0119c3596d14ea63227af6f7a481ef2b2f8b" + sha256: aa6199f908078bb1c5efb8d8638d4ae191aac11b311132c3ef48ce352fb52ef8 url: "https://pub.dev" source: hosted - version: "3.2.1" + version: "3.2.2" http_parser: dependency: transitive description: name: http_parser - sha256: "2aa08ce0341cc9b354a498388e30986515406668dbcc4f7c950c3e715496693b" + sha256: "178d74305e7866013777bab2c3d8726205dc5a4dd935297175b19a23a2e66571" url: "https://pub.dev" source: hosted - version: "4.0.2" + version: "4.1.2" ieee754: dependency: transitive description: @@ -1149,10 +1149,10 @@ packages: dependency: transitive description: name: io - sha256: "2ec25704aba361659e10e3e5f5d672068d332fc8ac516421d483a11e5cbd061e" + sha256: dfd5a80599cf0165756e3181807ed3e77daf6dd4137caaad72d0b7931597650b url: "https://pub.dev" source: hosted - version: "1.0.4" + version: "1.0.5" isar: dependency: "direct main" description: @@ -1205,10 +1205,10 @@ packages: dependency: transitive description: name: json_serializable - sha256: ea1432d167339ea9b5bb153f0571d0039607a873d6e04e0117af043f14a1fd4b + sha256: c2fcb3920cf2b6ae6845954186420fca40bc0a8abcc84903b7801f17d7050d7c url: "https://pub.dev" source: hosted - version: "6.8.0" + version: "6.9.0" jsontool: dependency: transitive description: @@ -1462,26 +1462,26 @@ packages: dependency: transitive description: name: package_config - sha256: "1c5b77ccc91e4823a5af61ee74e6b972db1ef98c2ff5a18d3161c982a55448bd" + sha256: "92d4488434b520a62570293fbd33bb556c7d49230791c1b4bbd973baf6d2dc67" url: "https://pub.dev" source: hosted - version: "2.1.0" + version: "2.1.1" package_info_plus: dependency: "direct main" description: name: package_info_plus - sha256: df3eb3e0aed5c1107bb0fdb80a8e82e778114958b1c5ac5644fb1ac9cae8a998 + sha256: "739e0a5c3c4055152520fa321d0645ee98e932718b4c8efeeb51451968fe0790" url: "https://pub.dev" source: hosted - version: "8.1.0" + version: "8.1.3" package_info_plus_platform_interface: dependency: transitive description: name: package_info_plus_platform_interface - sha256: ac1f4a4847f1ade8e6a87d1f39f5d7c67490738642e2542f559ec38c37489a66 + sha256: a5ef9986efc7bf772f2696183a3992615baa76c1ffb1189318dd8803778fb05b url: "https://pub.dev" source: hosted - version: "3.0.1" + version: "3.0.2" path: dependency: transitive description: @@ -1494,10 +1494,10 @@ packages: dependency: transitive description: name: path_parsing - sha256: caa17e8f0b386eb190dd5b6a3b71211c76375aa8b6ffb4465b5863d019bdb334 + sha256: "883402936929eac138ee0a45da5b0f2c80f89913e6dc3bf77eb65b84b409c6ca" url: "https://pub.dev" source: hosted - version: "1.0.3" + version: "1.1.0" path_provider: dependency: "direct main" description: @@ -1510,18 +1510,18 @@ packages: dependency: transitive description: name: path_provider_android - sha256: c464428172cb986b758c6d1724c603097febb8fb855aa265aeecc9280c294d4a + sha256: "4adf4fd5423ec60a29506c76581bc05854c55e3a0b72d35bb28d661c9686edf2" url: "https://pub.dev" source: hosted - version: "2.2.12" + version: "2.2.15" path_provider_foundation: dependency: transitive description: name: path_provider_foundation - sha256: f234384a3fdd67f989b4d54a5d73ca2a6c422fa55ae694381ae0f4375cd1ea16 + sha256: "4843174df4d288f5e29185bd6e72a6fbdf5a4a4602717eed565497429f179942" url: "https://pub.dev" source: hosted - version: "2.4.0" + version: "2.4.1" path_provider_linux: dependency: transitive description: @@ -1670,18 +1670,18 @@ packages: dependency: transitive description: name: pub_semver - sha256: "40d3ab1bbd474c4c2328c91e3a7df8c6dd629b79ece4c4bd04bee496a224fb0c" + sha256: "7b3cfbf654f3edd0c6298ecd5be782ce997ddf0e00531b9464b55245185bbbbd" url: "https://pub.dev" source: hosted - version: "2.1.4" + version: "2.1.5" pubspec_parse: dependency: transitive description: name: pubspec_parse - sha256: c799b721d79eb6ee6fa56f00c04b472dcd44a30d258fac2174a6ec57302678f8 + sha256: "0560ba233314abbed0a48a2956f7f022cce7c3e1e73df540277da7544cad4082" url: "https://pub.dev" source: hosted - version: "1.3.0" + version: "1.5.0" qr: dependency: transitive description: @@ -1766,10 +1766,10 @@ packages: dependency: transitive description: name: shelf - sha256: ad29c505aee705f41a4d8963641f91ac4cee3c8fad5947e033390a7bd8180fa4 + sha256: e7dd780a7ffb623c57850b33f43309312fc863fb6aa3d276a754bb299839ef12 url: "https://pub.dev" source: hosted - version: "1.4.1" + version: "1.4.2" shelf_packages_handler: dependency: transitive description: @@ -1790,10 +1790,10 @@ packages: dependency: transitive description: name: shelf_web_socket - sha256: "073c147238594ecd0d193f3456a5fe91c4b0abbcc68bf5cd95b36c4e194ac611" + sha256: cc36c297b52866d203dbf9332263c94becc2fe0ceaa9681d07b6ef9807023b67 url: "https://pub.dev" source: hosted - version: "2.0.0" + version: "2.0.1" sky_engine: dependency: transitive description: flutter @@ -1812,10 +1812,10 @@ packages: description: path: "." ref: master - resolved-ref: b1fa8ca505e7e488edb4c2859f0218d48b15dead + resolved-ref: e6232c53c1595469931ababa878759a067c02e94 url: "https://github.com/cypherstack/socks_socket.git" source: git - version: "1.0.0" + version: "1.1.1" solana: dependency: "direct main" description: @@ -1837,10 +1837,10 @@ packages: dependency: transitive description: name: source_helper - sha256: "6adebc0006c37dd63fe05bca0a929b99f06402fc95aa35bf36d67f5c06de01fd" + sha256: "86d247119aedce8e63f4751bd9626fc9613255935558447569ad42f9f5b48b3c" url: "https://pub.dev" source: hosted - version: "1.3.4" + version: "1.3.5" source_map_stack_trace: dependency: transitive description: @@ -1926,10 +1926,10 @@ packages: dependency: transitive description: name: stream_transform - sha256: "14a00e794c7c11aa145a170587321aedce29769c08d7f58b1d141da75e3b1c6f" + sha256: ad47125e588cfd37a9a7f86c7d6356dde8dfe89d071d293f80ca9e9273a33871 url: "https://pub.dev" source: hosted - version: "2.1.0" + version: "2.1.1" string_scanner: dependency: transitive description: @@ -2015,10 +2015,10 @@ packages: dependency: transitive description: name: timing - sha256: "70a3b636575d4163c477e6de42f247a23b315ae20e86442bebe32d3cabf61c32" + sha256: "62ee18aca144e4a9f29d212f5a4c6a053be252b895ab14b5821996cff4ed90fe" url: "https://pub.dev" source: hosted - version: "1.0.1" + version: "1.0.2" tint: dependency: transitive description: @@ -2096,26 +2096,26 @@ packages: dependency: transitive description: name: url_launcher_ios - sha256: e43b677296fadce447e987a2f519dcf5f6d1e527dc35d01ffab4fff5b8a7063e + sha256: "16a513b6c12bb419304e72ea0ae2ab4fed569920d1c7cb850263fe3acc824626" url: "https://pub.dev" source: hosted - version: "6.3.1" + version: "6.3.2" url_launcher_linux: dependency: transitive description: name: url_launcher_linux - sha256: e2b9622b4007f97f504cd64c0128309dfb978ae66adbe944125ed9e1750f06af + sha256: "4e9ba368772369e3e08f231d2301b4ef72b9ff87c31192ef471b380ef29a4935" url: "https://pub.dev" source: hosted - version: "3.2.0" + version: "3.2.1" url_launcher_macos: dependency: transitive description: name: url_launcher_macos - sha256: "769549c999acdb42b8bcfa7c43d72bf79a382ca7441ab18a808e101149daf672" + sha256: "17ba2000b847f334f16626a574c702b196723af2a289e7a93ffcb79acff855c2" url: "https://pub.dev" source: hosted - version: "3.2.1" + version: "3.2.2" url_launcher_platform_interface: dependency: transitive description: @@ -2128,18 +2128,18 @@ packages: dependency: transitive description: name: url_launcher_web - sha256: "772638d3b34c779ede05ba3d38af34657a05ac55b06279ea6edd409e323dca8e" + sha256: "3ba963161bd0fe395917ba881d320b9c4f6dd3c4a233da62ab18a5025c85f1e9" url: "https://pub.dev" source: hosted - version: "2.3.3" + version: "2.4.0" url_launcher_windows: dependency: transitive description: name: url_launcher_windows - sha256: "44cf3aabcedde30f2dba119a9dea3b0f2672fbe6fa96e85536251d678216b3c4" + sha256: "3284b6d2ac454cf34f114e1d3319866fdd1e19cdc329999057e44ffe936cfa77" url: "https://pub.dev" source: hosted - version: "3.1.3" + version: "3.1.4" uuid: dependency: "direct main" description: @@ -2152,26 +2152,26 @@ packages: dependency: transitive description: name: vector_graphics - sha256: "0b9149c6ddb013818075b072b9ddc1b89a5122fff1275d4648d297086b46c4f0" + sha256: "27d5fefe86fb9aace4a9f8375b56b3c292b64d8c04510df230f849850d912cb7" url: "https://pub.dev" source: hosted - version: "1.1.12" + version: "1.1.15" vector_graphics_codec: dependency: transitive description: name: vector_graphics_codec - sha256: "2430b973a4ca3c4dbc9999b62b8c719a160100dcbae5c819bae0cacce32c9cdb" + sha256: "99fd9fbd34d9f9a32efd7b6a6aae14125d8237b10403b422a6a6dfeac2806146" url: "https://pub.dev" source: hosted - version: "1.1.12" + version: "1.1.13" vector_graphics_compiler: dependency: transitive description: name: vector_graphics_compiler - sha256: f3b9b6e4591c11394d4be4806c63e72d3a41778547b2c1e2a8a04fadcfd7d173 + sha256: "1b4b9e706a10294258727674a340ae0d6e64a7231980f9f9a3d12e4b42407aad" url: "https://pub.dev" source: hosted - version: "1.1.12" + version: "1.1.16" vector_math: dependency: transitive description: @@ -2249,10 +2249,10 @@ packages: dependency: transitive description: name: watcher - sha256: "3d2ad6751b3c16cf07c7fca317a1413b3f26530319181b37e3b9039b84fc01d8" + sha256: "69da27e49efa56a15f8afe8f4438c4ec02eff0a117df1b22ea4aad194fe1c104" url: "https://pub.dev" source: hosted - version: "1.1.0" + version: "1.1.1" web: dependency: "direct overridden" description: @@ -2305,10 +2305,10 @@ packages: dependency: "direct overridden" description: name: win32 - sha256: "10169d3934549017f0ae278ccb07f828f9d6ea21573bab0fb77b0e1ef0fce454" + sha256: daf97c9d80197ed7b619040e86c8ab9a9dad285e7671ee7390f9180cc828a51e url: "https://pub.dev" source: hosted - version: "5.7.2" + version: "5.10.1" win32_registry: dependency: transitive description: @@ -2347,10 +2347,10 @@ packages: description: path: "." ref: "v0.1.0" - resolved-ref: "2d36e584ae5d913b2634bcfe54e2266880cbd813" + resolved-ref: "966469f2660226c33a1de77d1c5efee5459a2d4e" url: "https://github.com/Tritonn204/xelis_flutter_ffi.git" source: git - version: "0.0.2" + version: "0.1.0" xml: dependency: transitive description: @@ -2371,10 +2371,10 @@ packages: dependency: transitive description: name: yaml - sha256: "75769501ea3489fca56601ff33454fe45507ea3bfb014161abc3b43ae25989d5" + sha256: b9da305ac7c39faa3f030eccd175340f968459dae4af175130b3fc47e40d76ce url: "https://pub.dev" source: hosted - version: "3.1.2" + version: "3.1.3" zxcvbn: dependency: "direct main" description: diff --git a/scripts/app_config/templates/pubspec.template b/scripts/app_config/templates/pubspec.template index 76da23390..8ebd267fb 100644 --- a/scripts/app_config/templates/pubspec.template +++ b/scripts/app_config/templates/pubspec.template @@ -31,8 +31,10 @@ dependencies: path: ./crypto_plugins/frostdart xelis_flutter: - path: ./crypto_plugins/xelis_flutter - + git: + url: https://github.com/Tritonn204/xelis_flutter_ffi.git + ref: v0.1.0 + xelis_dart_sdk: ^0.24.0 freezed_annotation: ^2.4.1 From f7b73620e24b754c6a82f71d8235745ef3022878 Mon Sep 17 00:00:00 2001 From: Tritonn204 Date: Tue, 11 Mar 2025 19:42:22 -0700 Subject: [PATCH 130/193] added port information to xelis connection invocations --- lib/utilities/test_node_connection.dart | 2 +- lib/wallets/crypto_currency/coins/xelis.dart | 2 +- lib/wallets/wallet/intermediate/lib_xelis_wallet.dart | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/lib/utilities/test_node_connection.dart b/lib/utilities/test_node_connection.dart index 8df98eab5..b75c22b93 100644 --- a/lib/utilities/test_node_connection.dart +++ b/lib/utilities/test_node_connection.dart @@ -304,7 +304,7 @@ Future testNodeConnection({ case Xelis(): try { final daemon = xelis_sdk.DaemonClient( - endPoint: formData.host!, + endPoint: "${formData.host!}:${formData.port!}", secureWebSocket: formData.useSSL ?? false, ); daemon.connect(); diff --git a/lib/wallets/crypto_currency/coins/xelis.dart b/lib/wallets/crypto_currency/coins/xelis.dart index db4adf76b..1f57b2afb 100644 --- a/lib/wallets/crypto_currency/coins/xelis.dart +++ b/lib/wallets/crypto_currency/coins/xelis.dart @@ -50,7 +50,7 @@ class Xelis extends ElectrumCurrency { switch (network) { case CryptoCurrencyNetwork.main: return NodeModel( - host: "127.0.0.1", + host: "us-node.xelis.io", port: 443, name: DefaultNodes.defaultName, id: DefaultNodes.buildId(this), diff --git a/lib/wallets/wallet/intermediate/lib_xelis_wallet.dart b/lib/wallets/wallet/intermediate/lib_xelis_wallet.dart index 84a8e0817..6985754d9 100644 --- a/lib/wallets/wallet/intermediate/lib_xelis_wallet.dart +++ b/lib/wallets/wallet/intermediate/lib_xelis_wallet.dart @@ -301,11 +301,11 @@ abstract class LibXelisWallet extends ExternalWallet final node = getCurrentNode(); Logging.instance.log( - "Connecting to node: ${node.host}", + "Connecting to node: ${node.host}:${node.port}", level: LogLevel.Info, ); await libXelisWallet!.onlineMode( - daemonAddress: node.host + daemonAddress: "${node.host}:${node.port}" ); await super.refresh(); } catch (e, s) { From dd67d2fdbbd2c664f6d445b658a67dcf713df5ab Mon Sep 17 00:00:00 2001 From: Tritonn204 Date: Thu, 13 Mar 2025 15:57:46 -0700 Subject: [PATCH 131/193] reversions and deletions as per request --- flutter_01.png | 0 google_fonts/LICENSE.txt | 404 +++++++++--------- google_fonts/OFL.txt | 186 ++++---- scripts/android/build_all.sh | 2 +- scripts/android/build_all_campfire.sh | 2 +- scripts/android/build_all_duo.sh | 2 +- scripts/app_config/configure_stack_wallet.sh | 2 - scripts/app_config/templates/pubspec.template | 10 - scripts/ios/build_all.sh | 4 + scripts/rust_version.sh | 9 - scripts/windows/build_all.sh | 1 + scripts/windows/build_all_campfire.sh | 1 + scripts/windows/build_all_duo.sh | 1 + 13 files changed, 305 insertions(+), 319 deletions(-) delete mode 100644 flutter_01.png diff --git a/flutter_01.png b/flutter_01.png deleted file mode 100644 index e69de29bb..000000000 diff --git a/google_fonts/LICENSE.txt b/google_fonts/LICENSE.txt index d64569567..75b52484e 100644 --- a/google_fonts/LICENSE.txt +++ b/google_fonts/LICENSE.txt @@ -1,202 +1,202 @@ - - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright [yyyy] [name of copyright owner] - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/google_fonts/OFL.txt b/google_fonts/OFL.txt index b525cbf3a..ad214842c 100644 --- a/google_fonts/OFL.txt +++ b/google_fonts/OFL.txt @@ -1,93 +1,93 @@ -Copyright 2020 The Inter Project Authors (https://github.com/rsms/inter) - -This Font Software is licensed under the SIL Open Font License, Version 1.1. -This license is copied below, and is also available with a FAQ at: -http://scripts.sil.org/OFL - - ------------------------------------------------------------ -SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 ------------------------------------------------------------ - -PREAMBLE -The goals of the Open Font License (OFL) are to stimulate worldwide -development of collaborative font projects, to support the font creation -efforts of academic and linguistic communities, and to provide a free and -open framework in which fonts may be shared and improved in partnership -with others. - -The OFL allows the licensed fonts to be used, studied, modified and -redistributed freely as long as they are not sold by themselves. The -fonts, including any derivative works, can be bundled, embedded, -redistributed and/or sold with any software provided that any reserved -names are not used by derivative works. The fonts and derivatives, -however, cannot be released under any other type of license. The -requirement for fonts to remain under this license does not apply -to any document created using the fonts or their derivatives. - -DEFINITIONS -"Font Software" refers to the set of files released by the Copyright -Holder(s) under this license and clearly marked as such. This may -include source files, build scripts and documentation. - -"Reserved Font Name" refers to any names specified as such after the -copyright statement(s). - -"Original Version" refers to the collection of Font Software components as -distributed by the Copyright Holder(s). - -"Modified Version" refers to any derivative made by adding to, deleting, -or substituting -- in part or in whole -- any of the components of the -Original Version, by changing formats or by porting the Font Software to a -new environment. - -"Author" refers to any designer, engineer, programmer, technical -writer or other person who contributed to the Font Software. - -PERMISSION & CONDITIONS -Permission is hereby granted, free of charge, to any person obtaining -a copy of the Font Software, to use, study, copy, merge, embed, modify, -redistribute, and sell modified and unmodified copies of the Font -Software, subject to the following conditions: - -1) Neither the Font Software nor any of its individual components, -in Original or Modified Versions, may be sold by itself. - -2) Original or Modified Versions of the Font Software may be bundled, -redistributed and/or sold with any software, provided that each copy -contains the above copyright notice and this license. These can be -included either as stand-alone text files, human-readable headers or -in the appropriate machine-readable metadata fields within text or -binary files as long as those fields can be easily viewed by the user. - -3) No Modified Version of the Font Software may use the Reserved Font -Name(s) unless explicit written permission is granted by the corresponding -Copyright Holder. This restriction only applies to the primary font name as -presented to the users. - -4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font -Software shall not be used to promote, endorse or advertise any -Modified Version, except to acknowledge the contribution(s) of the -Copyright Holder(s) and the Author(s) or with their explicit written -permission. - -5) The Font Software, modified or unmodified, in part or in whole, -must be distributed entirely under this license, and must not be -distributed under any other license. The requirement for fonts to -remain under this license does not apply to any document created -using the Font Software. - -TERMINATION -This license becomes null and void if any of the above conditions are -not met. - -DISCLAIMER -THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT -OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE -COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, -INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL -DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM -OTHER DEALINGS IN THE FONT SOFTWARE. +Copyright 2020 The Inter Project Authors (https://github.com/rsms/inter) + +This Font Software is licensed under the SIL Open Font License, Version 1.1. +This license is copied below, and is also available with a FAQ at: +http://scripts.sil.org/OFL + + +----------------------------------------------------------- +SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 +----------------------------------------------------------- + +PREAMBLE +The goals of the Open Font License (OFL) are to stimulate worldwide +development of collaborative font projects, to support the font creation +efforts of academic and linguistic communities, and to provide a free and +open framework in which fonts may be shared and improved in partnership +with others. + +The OFL allows the licensed fonts to be used, studied, modified and +redistributed freely as long as they are not sold by themselves. The +fonts, including any derivative works, can be bundled, embedded, +redistributed and/or sold with any software provided that any reserved +names are not used by derivative works. The fonts and derivatives, +however, cannot be released under any other type of license. The +requirement for fonts to remain under this license does not apply +to any document created using the fonts or their derivatives. + +DEFINITIONS +"Font Software" refers to the set of files released by the Copyright +Holder(s) under this license and clearly marked as such. This may +include source files, build scripts and documentation. + +"Reserved Font Name" refers to any names specified as such after the +copyright statement(s). + +"Original Version" refers to the collection of Font Software components as +distributed by the Copyright Holder(s). + +"Modified Version" refers to any derivative made by adding to, deleting, +or substituting -- in part or in whole -- any of the components of the +Original Version, by changing formats or by porting the Font Software to a +new environment. + +"Author" refers to any designer, engineer, programmer, technical +writer or other person who contributed to the Font Software. + +PERMISSION & CONDITIONS +Permission is hereby granted, free of charge, to any person obtaining +a copy of the Font Software, to use, study, copy, merge, embed, modify, +redistribute, and sell modified and unmodified copies of the Font +Software, subject to the following conditions: + +1) Neither the Font Software nor any of its individual components, +in Original or Modified Versions, may be sold by itself. + +2) Original or Modified Versions of the Font Software may be bundled, +redistributed and/or sold with any software, provided that each copy +contains the above copyright notice and this license. These can be +included either as stand-alone text files, human-readable headers or +in the appropriate machine-readable metadata fields within text or +binary files as long as those fields can be easily viewed by the user. + +3) No Modified Version of the Font Software may use the Reserved Font +Name(s) unless explicit written permission is granted by the corresponding +Copyright Holder. This restriction only applies to the primary font name as +presented to the users. + +4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font +Software shall not be used to promote, endorse or advertise any +Modified Version, except to acknowledge the contribution(s) of the +Copyright Holder(s) and the Author(s) or with their explicit written +permission. + +5) The Font Software, modified or unmodified, in part or in whole, +must be distributed entirely under this license, and must not be +distributed under any other license. The requirement for fonts to +remain under this license does not apply to any document created +using the Font Software. + +TERMINATION +This license becomes null and void if any of the above conditions are +not met. + +DISCLAIMER +THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT +OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE +COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM +OTHER DEALINGS IN THE FONT SOFTWARE. diff --git a/scripts/android/build_all.sh b/scripts/android/build_all.sh index 6547783e2..60aa13c6a 100755 --- a/scripts/android/build_all.sh +++ b/scripts/android/build_all.sh @@ -13,8 +13,8 @@ mkdir -p build PLUGINS_DIR=../../crypto_plugins (cd "${PLUGINS_DIR}"/flutter_liblelantus/scripts/android && ./build_all.sh ) -set_rust_to_1720 (cd "${PLUGINS_DIR}"/flutter_libepiccash/scripts/android && ./build_all.sh ) +set_rust_to_1720 (cd "${PLUGINS_DIR}"/frostdart/scripts/android && ./build_all.sh ) wait diff --git a/scripts/android/build_all_campfire.sh b/scripts/android/build_all_campfire.sh index 6547783e2..60aa13c6a 100755 --- a/scripts/android/build_all_campfire.sh +++ b/scripts/android/build_all_campfire.sh @@ -13,8 +13,8 @@ mkdir -p build PLUGINS_DIR=../../crypto_plugins (cd "${PLUGINS_DIR}"/flutter_liblelantus/scripts/android && ./build_all.sh ) -set_rust_to_1720 (cd "${PLUGINS_DIR}"/flutter_libepiccash/scripts/android && ./build_all.sh ) +set_rust_to_1720 (cd "${PLUGINS_DIR}"/frostdart/scripts/android && ./build_all.sh ) wait diff --git a/scripts/android/build_all_duo.sh b/scripts/android/build_all_duo.sh index 30ea1b82c..d67e700a8 100755 --- a/scripts/android/build_all_duo.sh +++ b/scripts/android/build_all_duo.sh @@ -15,8 +15,8 @@ mkdir -p build PLUGINS_DIR=../../crypto_plugins (cd "${PLUGINS_DIR}"/flutter_liblelantus/scripts/android && ./build_all.sh ) -set_rust_to_1720 (cd "${PLUGINS_DIR}"/flutter_libepiccash/scripts/android && ./build_all.sh ) +set_rust_to_1720 (cd "${PLUGINS_DIR}"/frostdart/scripts/android && ./build_all.sh ) wait diff --git a/scripts/app_config/configure_stack_wallet.sh b/scripts/app_config/configure_stack_wallet.sh index a7311a19a..0fd8e5e8a 100755 --- a/scripts/app_config/configure_stack_wallet.sh +++ b/scripts/app_config/configure_stack_wallet.sh @@ -71,7 +71,6 @@ final List _supportedCoins = List.unmodifiable([ Peercoin(CryptoCurrencyNetwork.main), Solana(CryptoCurrencyNetwork.main), Stellar(CryptoCurrencyNetwork.main), - Xelis(CryptoCurrencyNetwork.main), Tezos(CryptoCurrencyNetwork.main), Wownero(CryptoCurrencyNetwork.main), Bitcoin(CryptoCurrencyNetwork.test), @@ -84,7 +83,6 @@ final List _supportedCoins = List.unmodifiable([ Litecoin(CryptoCurrencyNetwork.test), Peercoin(CryptoCurrencyNetwork.test), Stellar(CryptoCurrencyNetwork.test), - Xelis(CryptoCurrencyNetwork.test), ]); final ({String from, String to}) _swapDefaults = (from: "BTC", to: "XMR"); diff --git a/scripts/app_config/templates/pubspec.template b/scripts/app_config/templates/pubspec.template index 8ebd267fb..c52440856 100644 --- a/scripts/app_config/templates/pubspec.template +++ b/scripts/app_config/templates/pubspec.template @@ -30,15 +30,6 @@ dependencies: frostdart: path: ./crypto_plugins/frostdart - xelis_flutter: - git: - url: https://github.com/Tritonn204/xelis_flutter_ffi.git - ref: v0.1.0 - - xelis_dart_sdk: ^0.24.0 - - freezed_annotation: ^2.4.1 - flutter_libsparkmobile: git: url: https://github.com/cypherstack/flutter_libsparkmobile.git @@ -233,7 +224,6 @@ dev_dependencies: sdk: flutter integration_test: sdk: flutter - freezed: ^2.4.2 build_runner: ^2.1.7 flutter_launcher_icons: ^0.13.1 hive_generator: ^2.0.0 diff --git a/scripts/ios/build_all.sh b/scripts/ios/build_all.sh index bef3e9095..bcb03e991 100755 --- a/scripts/ios/build_all.sh +++ b/scripts/ios/build_all.sh @@ -10,6 +10,10 @@ set_rust_to_1671 rustup target add aarch64-apple-ios rustup target add x86_64-apple-ios +# ensure ios rust triples are there +rustup target add aarch64-apple-ios +rustup target add x86_64-apple-ios + (cd ../../crypto_plugins/flutter_liblelantus/scripts/ios && ./build_all.sh ) (cd ../../crypto_plugins/flutter_libepiccash/scripts/ios && ./build_all.sh ) set_rust_to_1720 diff --git a/scripts/rust_version.sh b/scripts/rust_version.sh index ac553f969..8cda1229b 100755 --- a/scripts/rust_version.sh +++ b/scripts/rust_version.sh @@ -16,13 +16,4 @@ set_rust_to_1720() { echo "Rust version 1.72.0 is not installed. Please install it using 'rustup install 1.72.0'." >&2 exit 1 fi -} - -set_rust_to_1840() { - if rustup toolchain list | grep -q "1.84.0"; then - rustup default 1.84.0 - else - echo "Rust version 1.84.0 is not installed. Please install it using 'rustup install 1.84.0'." >&2 - exit 1 - fi } \ No newline at end of file diff --git a/scripts/windows/build_all.sh b/scripts/windows/build_all.sh index 4c9f03472..191a46cc0 100755 --- a/scripts/windows/build_all.sh +++ b/scripts/windows/build_all.sh @@ -10,6 +10,7 @@ mkdir -p build (cd ../../crypto_plugins/flutter_libepiccash/scripts/windows && ./build_all.sh ) (cd ../../crypto_plugins/flutter_liblelantus/scripts/windows && ./build_all.sh ) set_rust_to_1720 +(cd ../../crypto_plugins/frostdart/scripts/windows && ./build_all.sh ) ./build_secp256k1_wsl.sh diff --git a/scripts/windows/build_all_campfire.sh b/scripts/windows/build_all_campfire.sh index 4c9f03472..191a46cc0 100755 --- a/scripts/windows/build_all_campfire.sh +++ b/scripts/windows/build_all_campfire.sh @@ -10,6 +10,7 @@ mkdir -p build (cd ../../crypto_plugins/flutter_libepiccash/scripts/windows && ./build_all.sh ) (cd ../../crypto_plugins/flutter_liblelantus/scripts/windows && ./build_all.sh ) set_rust_to_1720 +(cd ../../crypto_plugins/frostdart/scripts/windows && ./build_all.sh ) ./build_secp256k1_wsl.sh diff --git a/scripts/windows/build_all_duo.sh b/scripts/windows/build_all_duo.sh index db58ca1ff..3e27eff02 100755 --- a/scripts/windows/build_all_duo.sh +++ b/scripts/windows/build_all_duo.sh @@ -12,6 +12,7 @@ mkdir -p build (cd ../../crypto_plugins/flutter_libepiccash/scripts/windows && ./build_all.sh ) (cd ../../crypto_plugins/flutter_liblelantus/scripts/windows && ./build_all.sh ) set_rust_to_1720 +(cd ../../crypto_plugins/frostdart/scripts/windows && ./build_all.sh ) ./build_secp256k1_wsl.sh From 0d20cb6b3b2af6cc98ec263b4751e911f1996a15 Mon Sep 17 00:00:00 2001 From: Tritonn204 Date: Thu, 13 Mar 2025 16:05:24 -0700 Subject: [PATCH 132/193] remove logging package from test_node_connection --- lib/utilities/test_node_connection.dart | 1 - 1 file changed, 1 deletion(-) diff --git a/lib/utilities/test_node_connection.dart b/lib/utilities/test_node_connection.dart index b75c22b93..679571541 100644 --- a/lib/utilities/test_node_connection.dart +++ b/lib/utilities/test_node_connection.dart @@ -26,7 +26,6 @@ import 'test_monero_node_connection.dart'; import 'test_stellar_node_connection.dart'; import 'tor_plain_net_option_enum.dart'; -import 'package:logging/logging.dart' as std_logging; import 'package:xelis_dart_sdk/xelis_dart_sdk.dart' as xelis_sdk; Future _xmrHelper( From 08c5a5fbc7e2292b7d9c8771eca146be0e2fbece Mon Sep 17 00:00:00 2001 From: Julian Date: Thu, 13 Mar 2025 17:50:56 -0600 Subject: [PATCH 133/193] macos tweaks and updates --- .gitignore | 2 -- macos/Podfile.lock | 8 ++++- pubspec.lock | 4 +-- .../macos/Runner.xcodeproj/project.pbxproj | 34 ++++--------------- scripts/app_config/templates/pubspec.template | 2 +- 5 files changed, 16 insertions(+), 34 deletions(-) diff --git a/.gitignore b/.gitignore index 3d212c730..11959187d 100644 --- a/.gitignore +++ b/.gitignore @@ -59,8 +59,6 @@ coverage scripts/**/build /lib/external_api_keys.dart -libcw_monero.dll -libcw_wownero.dll libepic_cash_wallet.dll libmobileliblelantus.dll libtor_ffi.dll diff --git a/macos/Podfile.lock b/macos/Podfile.lock index fa0068398..fefce84ae 100644 --- a/macos/Podfile.lock +++ b/macos/Podfile.lock @@ -15,6 +15,8 @@ PODS: - FlutterMacOS - devicelocale (0.0.1): - FlutterMacOS + - file_picker (0.0.1): + - FlutterMacOS - flutter_libepiccash (0.0.1): - FlutterMacOS - flutter_libsparkmobile (0.0.1): @@ -74,6 +76,7 @@ DEPENDENCIES: - desktop_drop (from `Flutter/ephemeral/.symlinks/plugins/desktop_drop/macos`) - device_info_plus (from `Flutter/ephemeral/.symlinks/plugins/device_info_plus/macos`) - devicelocale (from `Flutter/ephemeral/.symlinks/plugins/devicelocale/macos`) + - file_picker (from `Flutter/ephemeral/.symlinks/plugins/file_picker/macos`) - flutter_libepiccash (from `Flutter/ephemeral/.symlinks/plugins/flutter_libepiccash/macos`) - flutter_libsparkmobile (from `Flutter/ephemeral/.symlinks/plugins/flutter_libsparkmobile/macos`) - flutter_local_notifications (from `Flutter/ephemeral/.symlinks/plugins/flutter_local_notifications/macos`) @@ -113,6 +116,8 @@ EXTERNAL SOURCES: :path: Flutter/ephemeral/.symlinks/plugins/device_info_plus/macos devicelocale: :path: Flutter/ephemeral/.symlinks/plugins/devicelocale/macos + file_picker: + :path: Flutter/ephemeral/.symlinks/plugins/file_picker/macos flutter_libepiccash: :path: Flutter/ephemeral/.symlinks/plugins/flutter_libepiccash/macos flutter_libsparkmobile: @@ -158,6 +163,7 @@ SPEC CHECKSUMS: desktop_drop: 69eeff437544aa619c8db7f4481b3a65f7696898 device_info_plus: ce1b7762849d3ec103d0e0517299f2db7ad60720 devicelocale: 9f0f36ac651cabae2c33f32dcff4f32b61c38225 + file_picker: e716a70a9fe5fd9e09ebc922d7541464289443af flutter_libepiccash: be1560a04150c5cc85bcf08d236ec2b3d1f5d8da flutter_libsparkmobile: df2d36af1691379c81249e7be7b68be3c81d388b flutter_local_notifications: 4b427ffabf278fc6ea9484c97505e231166927a5 @@ -181,4 +187,4 @@ SPEC CHECKSUMS: PODFILE CHECKSUM: 236401fc2c932af29a9fcf0e97baeeb2d750d367 -COCOAPODS: 1.15.2 +COCOAPODS: 1.16.2 diff --git a/pubspec.lock b/pubspec.lock index b611f6f20..36d4f69ed 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -824,8 +824,8 @@ packages: dependency: "direct main" description: path: "." - ref: a5b90f613a7d0e77ec1089a7d95552cae4a58be6 - resolved-ref: a5b90f613a7d0e77ec1089a7d95552cae4a58be6 + ref: "619190a388e362c0e9d1c4c4a6e64f5395bd8d84" + resolved-ref: "619190a388e362c0e9d1c4c4a6e64f5395bd8d84" url: "https://github.com/cypherstack/flutter_libsparkmobile.git" source: git version: "0.0.2" diff --git a/scripts/app_config/templates/macos/Runner.xcodeproj/project.pbxproj b/scripts/app_config/templates/macos/Runner.xcodeproj/project.pbxproj index b0e43be79..6db80d9b0 100644 --- a/scripts/app_config/templates/macos/Runner.xcodeproj/project.pbxproj +++ b/scripts/app_config/templates/macos/Runner.xcodeproj/project.pbxproj @@ -97,9 +97,7 @@ B98151802A674022009D013C /* mobileliblelantus.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = mobileliblelantus.framework; path = ../crypto_plugins/flutter_liblelantus/scripts/macos/mobileliblelantus/mobileliblelantus.framework; sourceTree = ""; }; B98151832A674143009D013C /* libsqlite3.0.tbd */ = {isa = PBXFileReference; lastKnownFileType = "sourcecode.text-based-dylib-definition"; name = libsqlite3.0.tbd; path = usr/lib/libsqlite3.0.tbd; sourceTree = SDKROOT; }; BF5E76865ACB46314AC27D8F /* Pods-RunnerTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.debug.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.debug.xcconfig"; sourceTree = ""; }; - CEA2021C2BDD4D7100FE1D27 /* wownero_libwallet2_api_c.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; path = wownero_libwallet2_api_c.dylib; sourceTree = ""; }; - CEA2021F2BDD4F0B00FE1D27 /* monero_libwallet2_api_c.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; path = monero_libwallet2_api_c.dylib; sourceTree = ""; }; - E6036BF01BF05EA773C76D22 /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + E6036BF01BF05EA773C76D22 /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; F1FA2C4D2BA4B49F00BDA1BB /* frostdart.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = frostdart.dylib; path = ../crypto_plugins/frostdart/macos/frostdart.dylib; sourceTree = ""; }; F1FA2C4F2BA4B4CA00BDA1BB /* frostdart.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = frostdart.dylib; path = ../crypto_plugins/frostdart/macos/frostdart.dylib; sourceTree = ""; }; /* End PBXFileReference section */ @@ -149,9 +147,7 @@ 33CC10E42044A3C60003C045 = { isa = PBXGroup; children = ( - CEA2021F2BDD4F0B00FE1D27 /* monero_libwallet2_api_c.dylib */, - CEA2021C2BDD4D7100FE1D27 /* wownero_libwallet2_api_c.dylib */, - F1FA2C4F2BA4B4CA00BDA1BB /* frostdart.dylib */, + F1FA2C4F2BA4B4CA00BDA1BB /* frostdart.dylib */, 33FAB671232836740065AC1E /* Runner */, 33CEB47122A05771004F2AC0 /* Flutter */, 331C80D6294CF71000263BE5 /* RunnerTests */, @@ -281,7 +277,7 @@ isa = PBXProject; attributes = { LastSwiftUpdateCheck = 0920; - LastUpgradeCheck = 1430; + LastUpgradeCheck = 1510; ORGANIZATIONNAME = ""; TargetAttributes = { 331C80D4294CF70F00263BE5 = { @@ -599,10 +595,7 @@ "$(inherited)", "\"${PODS_CONFIGURATION_BUILD_DIR}/ReachabilitySwift\"", "\"${PODS_CONFIGURATION_BUILD_DIR}/connectivity_plus\"", - "\"${PODS_CONFIGURATION_BUILD_DIR}/cw_monero\"", - "\"${PODS_CONFIGURATION_BUILD_DIR}/cw_shared_external\"", - "\"${PODS_CONFIGURATION_BUILD_DIR}/cw_wownero\"", - "\"${PODS_CONFIGURATION_BUILD_DIR}/desktop_drop\"", + "\"${PODS_CONFIGURATION_BUILD_DIR}/desktop_drop\"", "\"${PODS_CONFIGURATION_BUILD_DIR}/device_info_plus\"", "\"${PODS_CONFIGURATION_BUILD_DIR}/devicelocale\"", "\"${PODS_CONFIGURATION_BUILD_DIR}/flutter_libepiccash\"", @@ -627,10 +620,7 @@ LIBRARY_SEARCH_PATHS = ( "$(inherited)", "\"${DT_TOOLCHAIN_DIR}/usr/lib/swift/${PLATFORM_NAME}\"", - "\"${PODS_ROOT}/../Flutter/ephemeral/.symlinks/plugins/cw_monero/macos/External/macos/lib\"", - "\"${PODS_ROOT}/../Flutter/ephemeral/.symlinks/plugins/cw_shared_external/macos/External/macos/lib\"", - "\"${PODS_ROOT}/../Flutter/ephemeral/.symlinks/plugins/cw_wownero/macos/External/macos/lib\"", - "\"${PODS_ROOT}/../Flutter/ephemeral/.symlinks/plugins/flutter_libepiccash/macos/libs\"", + "\"${PODS_ROOT}/../Flutter/ephemeral/.symlinks/plugins/flutter_libepiccash/macos/libs\"", "\"${PODS_ROOT}/../Flutter/ephemeral/.symlinks/plugins/isar_flutter_libs/macos\"", /usr/lib/swift, "$(PATH)/crypto_plugins/frostdart/macos\n", @@ -763,9 +753,6 @@ "$(inherited)", "\"${PODS_CONFIGURATION_BUILD_DIR}/ReachabilitySwift\"", "\"${PODS_CONFIGURATION_BUILD_DIR}/connectivity_plus\"", - "\"${PODS_CONFIGURATION_BUILD_DIR}/cw_monero\"", - "\"${PODS_CONFIGURATION_BUILD_DIR}/cw_shared_external\"", - "\"${PODS_CONFIGURATION_BUILD_DIR}/cw_wownero\"", "\"${PODS_CONFIGURATION_BUILD_DIR}/desktop_drop\"", "\"${PODS_CONFIGURATION_BUILD_DIR}/device_info_plus\"", "\"${PODS_CONFIGURATION_BUILD_DIR}/devicelocale\"", @@ -791,9 +778,6 @@ LIBRARY_SEARCH_PATHS = ( "$(inherited)", "\"${DT_TOOLCHAIN_DIR}/usr/lib/swift/${PLATFORM_NAME}\"", - "\"${PODS_ROOT}/../Flutter/ephemeral/.symlinks/plugins/cw_monero/macos/External/macos/lib\"", - "\"${PODS_ROOT}/../Flutter/ephemeral/.symlinks/plugins/cw_shared_external/macos/External/macos/lib\"", - "\"${PODS_ROOT}/../Flutter/ephemeral/.symlinks/plugins/cw_wownero/macos/External/macos/lib\"", "\"${PODS_ROOT}/../Flutter/ephemeral/.symlinks/plugins/flutter_libepiccash/macos/libs\"", "\"${PODS_ROOT}/../Flutter/ephemeral/.symlinks/plugins/isar_flutter_libs/macos\"", /usr/lib/swift, @@ -818,9 +802,6 @@ "$(inherited)", "\"${PODS_CONFIGURATION_BUILD_DIR}/ReachabilitySwift\"", "\"${PODS_CONFIGURATION_BUILD_DIR}/connectivity_plus\"", - "\"${PODS_CONFIGURATION_BUILD_DIR}/cw_monero\"", - "\"${PODS_CONFIGURATION_BUILD_DIR}/cw_shared_external\"", - "\"${PODS_CONFIGURATION_BUILD_DIR}/cw_wownero\"", "\"${PODS_CONFIGURATION_BUILD_DIR}/desktop_drop\"", "\"${PODS_CONFIGURATION_BUILD_DIR}/device_info_plus\"", "\"${PODS_CONFIGURATION_BUILD_DIR}/devicelocale\"", @@ -846,10 +827,7 @@ LIBRARY_SEARCH_PATHS = ( "$(inherited)", "\"${DT_TOOLCHAIN_DIR}/usr/lib/swift/${PLATFORM_NAME}\"", - "\"${PODS_ROOT}/../Flutter/ephemeral/.symlinks/plugins/cw_monero/macos/External/macos/lib\"", - "\"${PODS_ROOT}/../Flutter/ephemeral/.symlinks/plugins/cw_shared_external/macos/External/macos/lib\"", - "\"${PODS_ROOT}/../Flutter/ephemeral/.symlinks/plugins/cw_wownero/macos/External/macos/lib\"", - "\"${PODS_ROOT}/../Flutter/ephemeral/.symlinks/plugins/flutter_libepiccash/macos/libs\"", + "\"${PODS_ROOT}/../Flutter/ephemeral/.symlinks/plugins/flutter_libepiccash/macos/libs\"", "\"${PODS_ROOT}/../Flutter/ephemeral/.symlinks/plugins/isar_flutter_libs/macos\"", /usr/lib/swift, "$(PATH)/crypto_plugins/frostdart/macos\n", diff --git a/scripts/app_config/templates/pubspec.template b/scripts/app_config/templates/pubspec.template index c52440856..ff0fe79b1 100644 --- a/scripts/app_config/templates/pubspec.template +++ b/scripts/app_config/templates/pubspec.template @@ -33,7 +33,7 @@ dependencies: flutter_libsparkmobile: git: url: https://github.com/cypherstack/flutter_libsparkmobile.git - ref: a5b90f613a7d0e77ec1089a7d95552cae4a58be6 + ref: 619190a388e362c0e9d1c4c4a6e64f5395bd8d84 # cs_monero compat (unpublished) compat: From 0f7e44faddb9fc6548eabd3b94262560c6e73d34 Mon Sep 17 00:00:00 2001 From: Tritonn204 Date: Fri, 14 Mar 2025 14:38:05 -0700 Subject: [PATCH 134/193] rebase cleanup + xelis bug fixes --- ...w_wallet_recovery_phrase_warning_view.dart | 230 +----------------- lib/utilities/test_node_connection.dart | 3 +- lib/wallets/crypto_currency/coins/xelis.dart | 6 +- lib/wallets/wallet/impl/xelis_wallet.dart | 150 ++++++------ .../wallet/intermediate/lib_xelis_wallet.dart | 50 ++-- pubspec.lock | 104 ++++---- scripts/app_config/configure_stack_wallet.sh | 2 + scripts/app_config/templates/pubspec.template | 5 + 8 files changed, 168 insertions(+), 382 deletions(-) diff --git a/lib/pages/add_wallet_views/new_wallet_recovery_phrase_warning_view/new_wallet_recovery_phrase_warning_view.dart b/lib/pages/add_wallet_views/new_wallet_recovery_phrase_warning_view/new_wallet_recovery_phrase_warning_view.dart index 9d6b7fdf0..7d93d038a 100644 --- a/lib/pages/add_wallet_views/new_wallet_recovery_phrase_warning_view/new_wallet_recovery_phrase_warning_view.dart +++ b/lib/pages/add_wallet_views/new_wallet_recovery_phrase_warning_view/new_wallet_recovery_phrase_warning_view.dart @@ -40,7 +40,6 @@ import '../../../widgets/desktop/desktop_scaffold.dart'; import '../../../widgets/rounded_container.dart'; import '../../../widgets/rounded_white_container.dart'; import '../../../widgets/stack_dialog.dart'; -import '../../../widgets/xelis_table_progress.dart'; import '../new_wallet_options/new_wallet_options_view.dart'; import '../new_wallet_recovery_phrase_view/new_wallet_recovery_phrase_view.dart'; import 'recovery_phrase_explanation_dialog.dart'; @@ -104,233 +103,6 @@ class _NewWalletRecoveryPhraseWarningViewState ); } } - - // () async { - // try { - // unawaited( - // showDialog( - // context: context, - // barrierDismissible: false, - // useSafeArea: true, - // builder: (ctx) { - // return Center( - // child: Column( - // mainAxisSize: MainAxisSize.min, - // children: [ - // const LoadingIndicator( - // width: 50, - // height: 50, - // ), - // if (widget.coin is Xelis) ...[ - // const SizedBox(height: 16), - // const XelisTableProgress(), - // ], - // ], - // ), - // ); - // }, - // ), - // ); - // String? otherDataJsonString; - // if (widget.coin is Tezos) { - // otherDataJsonString = jsonEncode({ - // WalletInfoKeys - // .tezosDerivationPath: - // Tezos.standardDerivationPath - // .value, - // }); - // // }//todo: probably not needed (broken anyways) - // // else if (widget.coin is Epiccash) { - // // final int secondsSinceEpoch = - // // DateTime.now().millisecondsSinceEpoch ~/ 1000; - // // const int epicCashFirstBlock = 1565370278; - // // const double overestimateSecondsPerBlock = 61; - // // int chosenSeconds = secondsSinceEpoch - epicCashFirstBlock; - // // int approximateHeight = chosenSeconds ~/ overestimateSecondsPerBlock; - // // / - // // // debugPrint( - // // // "approximate height: $approximateHeight chosen_seconds: $chosenSeconds"); - // // height = approximateHeight; - // // if (height < 0) { - // // height = 0; - // // } - // // - // // otherDataJsonString = jsonEncode( - // // { - // // WalletInfoKeys.epiccashData: jsonEncode( - // // ExtraEpiccashWalletInfo( - // // receivingIndex: 0, - // // changeIndex: 0, - // // slatesToAddresses: {}, - // // slatesToCommits: {}, - // // lastScannedBlock: epicCashFirstBlock, - // // restoreHeight: height, - // // creationHeight: height, - // // ).toMap(), - // // ), - // // }, - // // ); - // } else if (widget.coin is Firo) { - // otherDataJsonString = jsonEncode( - // { - // WalletInfoKeys - // .lelantusCoinIsarRescanRequired: - // false, - // }, - // ); - // } - - // final info = WalletInfo.createNew( - // coin: widget.coin, - // name: widget.walletName, - // otherDataJsonString: - // otherDataJsonString, - // ); - - // var node = ref - // .read( - // nodeServiceChangeNotifierProvider, - // ) - // .getPrimaryNodeFor( - // currency: coin, - // ); - - // if (node == null) { - // node = coin.defaultNode; - // await ref - // .read( - // nodeServiceChangeNotifierProvider, - // ) - // .setPrimaryNodeFor( - // coin: coin, - // node: node, - // ); - // } - - // final txTracker = - // TransactionNotificationTracker( - // walletId: info.walletId, - // ); - - // int? wordCount; - // String? mnemonicPassphrase; - // String? mnemonic; - // String? privateKey; - - // wordCount = info - // .coin.defaultSeedPhraseLength; - - // // TODO: Refactor these to generate each coin in their respective classes - // // This code should not be in a random view page file - // if (coin is Monero || - // coin is Wownero || - // coin is Xelis) { - // // currently a special case due to the - // // xmr/wow/xelis libraries handling their - // // own mnemonic generation - // } else if (wordCount > 0) { - // if (ref - // .read( - // pNewWalletOptions.state, - // ) - // .state != - // null) { - // if (coin - // .hasMnemonicPassphraseSupport) { - // mnemonicPassphrase = ref - // .read( - // pNewWalletOptions.state, - // ) - // .state! - // .mnemonicPassphrase; - // } else { - // // this may not be epiccash specific? - // if (coin is Epiccash) { - // mnemonicPassphrase = ""; - // } - // } - - // wordCount = ref - // .read( - // pNewWalletOptions.state, - // ) - // .state! - // .mnemonicWordsCount; - // } else { - // mnemonicPassphrase = ""; - // } - - // if (wordCount < 12 || - // 24 < wordCount || - // wordCount % 3 != 0) { - // throw Exception( - // "Invalid word count", - // ); - // } - - // final strength = - // (wordCount ~/ 3) * 32; - - // mnemonic = bip39.generateMnemonic( - // strength: strength, - // ); - // } - - // final wallet = await Wallet.create( - // walletInfo: info, - // mainDB: ref.read(mainDBProvider), - // secureStorageInterface: - // ref.read(secureStoreProvider), - // nodeService: ref.read( - // nodeServiceChangeNotifierProvider, - // ), - // prefs: ref.read( - // prefsChangeNotifierProvider, - // ), - // mnemonicPassphrase: - // mnemonicPassphrase, - // mnemonic: mnemonic, - // privateKey: privateKey, - // ); - - // await wallet.init(); - - // // pop progress dialog - // if (context.mounted) { - // Navigator.pop(context); - // } - // // set checkbox back to unchecked to annoy users to agree again :P - // ref - // .read( - // checkBoxStateProvider.state, - // ) - // .state = false; - - // if (context.mounted) { - // final nav = Navigator.of(context); - // unawaited( - // nav.pushNamed( - // NewWalletRecoveryPhraseView - // .routeName, - // arguments: Tuple2( - // wallet, - // await (wallet - // as MnemonicInterface) - // .getMnemonicAsWords(), - // ), - // ), - // ); - // } - // } catch (e, s) { - // Logging.instance.log( - // "$e\n$s", - // level: LogLevel.Fatal, - // ); - // // TODO: handle gracefully - // // any network/socket exception here will break new wallet creation - // rethrow; - // } - // } } Future<(Wallet, List)> _initNewFuture() async { @@ -419,7 +191,7 @@ class _NewWalletRecoveryPhraseWarningViewState // TODO: Refactor these to generate each coin in their respective classes // This code should not be in a random view page file - if (coin is Monero || coin is Wownero) { + if (coin is Monero || coin is Wownero || coin is Xelis) { // currently a special case due to the // xmr/wow libraries handling their // own mnemonic generation diff --git a/lib/utilities/test_node_connection.dart b/lib/utilities/test_node_connection.dart index 679571541..a211dd97d 100644 --- a/lib/utilities/test_node_connection.dart +++ b/lib/utilities/test_node_connection.dart @@ -311,9 +311,8 @@ Future testNodeConnection({ final xelis_sdk.GetInfoResult networkInfo = await daemon.getInfo(); testPassed = networkInfo.height != null; - Logging.instance.log( + Logging.instance.i( "Xelis testNodeConnection result: \"${networkInfo.toString()}\"", - level: LogLevel.Info, ); } catch (e, s) { testPassed = false; diff --git a/lib/wallets/crypto_currency/coins/xelis.dart b/lib/wallets/crypto_currency/coins/xelis.dart index 1f57b2afb..b05fce216 100644 --- a/lib/wallets/crypto_currency/coins/xelis.dart +++ b/lib/wallets/crypto_currency/coins/xelis.dart @@ -59,7 +59,7 @@ class Xelis extends ElectrumCurrency { coinName: identifier, isFailover: true, isDown: false, - torEnabled: true, + torEnabled: false, clearnetEnabled: true, ); @@ -74,7 +74,7 @@ class Xelis extends ElectrumCurrency { coinName: identifier, isFailover: true, isDown: false, - torEnabled: true, + torEnabled: false, clearnetEnabled: true, ); @@ -87,7 +87,7 @@ class Xelis extends ElectrumCurrency { int get minConfirms => 1; @override - bool get torSupport => true; + bool get torSupport => false; @override bool validateAddress(String address) { diff --git a/lib/wallets/wallet/impl/xelis_wallet.dart b/lib/wallets/wallet/impl/xelis_wallet.dart index 81cbfafe8..42d260255 100644 --- a/lib/wallets/wallet/impl/xelis_wallet.dart +++ b/lib/wallets/wallet/impl/xelis_wallet.dart @@ -139,10 +139,10 @@ class XelisWallet extends LibXelisWallet { try { await open(); } catch (e, s) { - Logging.instance.log( - "Exception rethrown from recoverFromMnemonic(): $e\n$s", - level: LogLevel.Error, - ); + // Logging.instance.log( + // "Exception rethrown from recoverFromMnemonic(): $e\n$s", + // level: LogLevel.Error, + // ); rethrow; } } @@ -193,10 +193,10 @@ class XelisWallet extends LibXelisWallet { ); } } catch (e, s) { - Logging.instance.log( - "Error in updateBalance(): $e\n$s", - level: LogLevel.Warning, - ); + // Logging.instance.log( + // "Error in updateBalance(): $e\n$s", + // level: LogLevel.Warning, + // ); } }); } @@ -204,6 +204,8 @@ class XelisWallet extends LibXelisWallet { Future _fetchChainHeight() async { final infoString = await libXelisWallet!.getDaemonInfo(); final Map nodeInfo = json.decode(infoString); + + pruningHeight = int.parse(nodeInfo['pruned_topoheight'].toString()); return int.parse(nodeInfo['topoheight'].toString()); } @@ -217,10 +219,10 @@ class XelisWallet extends LibXelisWallet { isar: mainDB.isar, ); } catch (e, s) { - Logging.instance.log( - "Error in updateChainHeight(): $e\n$s", - level: LogLevel.Warning, - ); + // Logging.instance.log( + // "Error in updateChainHeight(): $e\n$s", + // level: LogLevel.Warning, + // ); } } @@ -228,15 +230,16 @@ class XelisWallet extends LibXelisWallet { Future updateNode() async { try { final node = getCurrentNode(); - await libXelisWallet?.offlineMode(); - await libXelisWallet!.onlineMode( - daemonAddress: node.host - ); + final bool online = await libXelisWallet!.isOnline(); + if (online == true) { + await libXelisWallet!.offlineMode(); + } + await super.connect(); } catch (e, s) { - Logging.instance.log( - "Error updating node: $e\n$s", - level: LogLevel.Error, - ); + // Logging.instance.log( + // "Error updating node: $e\n$s", + // level: LogLevel.Error, + // ); rethrow; } } @@ -276,7 +279,7 @@ class XelisWallet extends LibXelisWallet { firstBlock -= 10; } } else { - await libXelisWallet!.rescan(topoheight: BigInt.from(topoheight!)); + await libXelisWallet!.rescan(topoheight: BigInt.from(pruningHeight)); } final txListJson = rawTransactions ?? await libXelisWallet!.allHistory(); @@ -457,18 +460,18 @@ class XelisWallet extends LibXelisWallet { }), ); - Logging.instance.log( - "Entry done ${entryType.toString()}", - level: LogLevel.Debug, - ); + // Logging.instance.log( + // "Entry done ${entryType.toString()}", + // level: LogLevel.Debug, + // ); txns.add(txn); } catch (e, s) { - Logging.instance.log( - "Error handling tx $jsonString: $e\n$s", - level: LogLevel.Warning, - ); + // Logging.instance.log( + // "Error handling tx $jsonString: $e\n$s", + // level: LogLevel.Warning, + // ); } } await updateBalance(); @@ -574,10 +577,10 @@ class XelisWallet extends LibXelisWallet { }), ); } catch (e, s) { - Logging.instance.log( - "Exception rethrown from prepareSend(): $e\n$s", - level: LogLevel.Error, - ); + // Logging.instance.log( + // "Exception rethrown from prepareSend(): $e\n$s", + // level: LogLevel.Error, + // ); rethrow; } } @@ -657,10 +660,10 @@ class XelisWallet extends LibXelisWallet { ); } } catch (e, s) { - Logging.instance.log( - "Exception rethrown from estimateFeeFor(): $e\n$s", - level: LogLevel.Error, - ); + // Logging.instance.log( + // "Exception rethrown from estimateFeeFor(): $e\n$s", + // level: LogLevel.Error, + // ); rethrow; } } @@ -707,10 +710,10 @@ class XelisWallet extends LibXelisWallet { txid: txHash, )); } catch (e, s) { - Logging.instance.log( - "Exception rethrown from confirmSend(): $e\n$s", - level: LogLevel.Error, - ); + // Logging.instance.log( + // "Exception rethrown from confirmSend(): $e\n$s", + // level: LogLevel.Error, + // ); rethrow; } } @@ -737,10 +740,10 @@ class XelisWallet extends LibXelisWallet { await handleHistorySynced(topoheight); } } catch (e, s) { - Logging.instance.log( - "Error handling wallet event: $e\n$s", - level: LogLevel.Error, - ); + // Logging.instance.log( + // "Error handling wallet event: $e\n$s", + // level: LogLevel.Error, + // ); } } @@ -763,15 +766,15 @@ class XelisWallet extends LibXelisWallet { await updateBalance(); - Logging.instance.log( - "New transaction processed: ${newTxIds.first}", - level: LogLevel.Info, - ); + // Logging.instance.log( + // "New transaction processed: ${newTxIds.first}", + // level: LogLevel.Info, + // ); } catch (e, s) { - Logging.instance.log( - "Error handling new transaction: $e\n$s", - level: LogLevel.Warning, - ); + // Logging.instance.log( + // "Error handling new transaction: $e\n$s", + // level: LogLevel.Warning, + // ); } } @@ -785,10 +788,10 @@ class XelisWallet extends LibXelisWallet { // TODO: Update asset balances if needed } catch (e, s) { - Logging.instance.log( - "Error handling balance change: $e\n$s", - level: LogLevel.Warning, - ); + // Logging.instance.log( + // "Error handling balance change: $e\n$s", + // level: LogLevel.Warning, + // ); } } @@ -842,24 +845,35 @@ class XelisWallet extends LibXelisWallet { Future handleNewAsset(xelis_sdk.AssetData asset) async { // TODO: Store asset information if needed // TODO: Update UI/state for new asset - Logging.instance.log( - "New asset detected: ${asset}", - level: LogLevel.Info, - ); + // Logging.instance.log( + // "New asset detected: ${asset}", + // level: LogLevel.Info, + // ); } @override Future refresh({int? topoheight}) async { await refreshMutex.protect(() async { try { - await updateChainHeight(topoheight: topoheight); - await updateBalance(); - await updateTransactions(); + final bool online = await libXelisWallet!.isOnline(); + if (online == true) { + await updateChainHeight(topoheight: topoheight); + await updateBalance(); + await updateTransactions(); + } else { + GlobalEventBus.instance.fire( + WalletSyncStatusChangedEvent( + WalletSyncStatus.unableToSync, + walletId, + info.coin, + ), + ); + } } catch (e, s) { - Logging.instance.log( - "Error in refresh(): $e\n$s", - level: LogLevel.Warning, - ); + // Logging.instance.log( + // "Error in refresh(): $e\n$s", + // level: LogLevel.Warning, + // ); } }); } diff --git a/lib/wallets/wallet/intermediate/lib_xelis_wallet.dart b/lib/wallets/wallet/intermediate/lib_xelis_wallet.dart index 6985754d9..fea6eef53 100644 --- a/lib/wallets/wallet/intermediate/lib_xelis_wallet.dart +++ b/lib/wallets/wallet/intermediate/lib_xelis_wallet.dart @@ -183,6 +183,7 @@ abstract class LibXelisWallet extends ExternalWallet static Completer? _tableGenerationCompleter; x_wallet.XelisWallet? libXelisWallet; + int pruningHeight = 0; x_wallet.XelisWallet? get wallet => libXelisWallet; set wallet(x_wallet.XelisWallet? newWallet) { @@ -273,10 +274,10 @@ abstract class LibXelisWallet extends ExternalWallet yield HistorySynced(json['data']['topoheight'] as int); } } catch (e, s) { - Logging.instance.log( - "Error processing wallet event: $e\n$s", - level: LogLevel.Error, - ); + // Logging.instance.log( + // "Error processing wallet event: $e\n$s", + // level: LogLevel.Error, + // ); continue; } } @@ -300,19 +301,19 @@ abstract class LibXelisWallet extends ExternalWallet convertRawEvents().listen(handleEvent); final node = getCurrentNode(); - Logging.instance.log( - "Connecting to node: ${node.host}:${node.port}", - level: LogLevel.Info, - ); + // Logging.instance.log( + // "Connecting to node: ${node.host}:${node.port}", + // level: LogLevel.Info, + // ); await libXelisWallet!.onlineMode( daemonAddress: "${node.host}:${node.port}" ); await super.refresh(); } catch (e, s) { - Logging.instance.log( - "Error connecting to node: $e\n$s", - level: LogLevel.Error, - ); + // Logging.instance.log( + // "Error connecting to node: $e\n$s", + // level: LogLevel.Error, + // ); rethrow; } } @@ -427,10 +428,10 @@ abstract class LibXelisWallet extends ExternalWallet } }); } catch (e, s) { - Logging.instance.log( - "Failed to open/create wallet: $e\n$s", - level: LogLevel.Error, - ); + // Logging.instance.log( + // "Failed to open/create wallet: $e\n$s", + // level: LogLevel.Error, + // ); rethrow; } }); @@ -465,10 +466,10 @@ abstract class LibXelisWallet extends ExternalWallet try { await connect(); } catch (e) { - Logging.instance.log( - "Failed to start sync: $e", - level: LogLevel.Error, - ); + // Logging.instance.log( + // "Failed to start sync: $e", + // level: LogLevel.Error, + // ); rethrow; } } @@ -486,6 +487,7 @@ abstract class LibXelisWallet extends ExternalWallet _eventSubscription = null; await libXelisWallet?.offlineMode(); + await libXelisWallet?.close(); libXelisWallet?.dispose(); libXelisWallet = null; @@ -554,10 +556,10 @@ extension XelisTableManagement on LibXelisWallet { debugPrint("Table upgrade done"); LibXelisWallet._tableGenerationCompleter!.complete(); } catch (e, s) { - Logging.instance.log( - "Failed to update tables: $e\n$s", - level: LogLevel.Error, - ); + // Logging.instance.log( + // "Failed to update tables: $e\n$s", + // level: LogLevel.Error, + // ); await setTableState(state.copyWith(isGenerating: false)); LibXelisWallet._tableGenerationCompleter!.completeError(e); diff --git a/pubspec.lock b/pubspec.lock index 55d7b344c..cec915896 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -58,10 +58,10 @@ packages: dependency: "direct main" description: name: async - sha256: "947bfcf187f74dbc5e146c9eb9c0f10c9f8b30743e341481c1e2ed3ecc18c20c" + sha256: d2872f9c19731c2e5f10444b14686eb7cc85c76274bd6c16e1816bff9a3bab63 url: "https://pub.dev" source: hosted - version: "2.11.0" + version: "2.12.0" barcode_scan2: dependency: "direct main" description: @@ -159,10 +159,10 @@ packages: dependency: transitive description: name: boolean_selector - sha256: "6cfb5af12253eaf2b368f07bacc5a80d1301a071c73360d746b7f2e32d762c66" + sha256: "8aab1771e1243a5063b8b0ff68042d67334e3feab9e95b9490f9a6ebf73b42ea" url: "https://pub.dev" source: hosted - version: "2.1.1" + version: "2.1.2" borsh_annotation: dependency: transitive description: @@ -305,10 +305,10 @@ packages: dependency: transitive description: name: characters - sha256: "04a925763edad70e8443c99234dc3328f442e811f1d8fd1a72f1c8ad0f69a605" + sha256: f71061c654a3380576a52b451dd5532377954cf9dbd272a78fc8479606670803 url: "https://pub.dev" source: hosted - version: "1.3.0" + version: "1.4.0" charcode: dependency: transitive description: @@ -337,10 +337,10 @@ packages: dependency: transitive description: name: clock - sha256: cb6d7f03e1de671e34607e909a7213e31d7752be4fb66a86d29fe1eb14bfb5cf + sha256: fddb70d9b5277016c77a80201021d40a2247104d9f4aa7bab7157b7e3f05b84b url: "https://pub.dev" source: hosted - version: "1.1.1" + version: "1.1.2" code_builder: dependency: transitive description: @@ -371,10 +371,10 @@ packages: dependency: transitive description: name: collection - sha256: a1ace0a119f20aabc852d165077c036cd864315bd99b7eaa10a60100341941bf + sha256: "2f5709ae4d3d59dd8f7cd309b4e023046b57d8a6c82130785d2b0e5868084e76" url: "https://pub.dev" source: hosted - version: "1.19.0" + version: "1.19.1" compat: dependency: "direct main" description: @@ -742,10 +742,10 @@ packages: dependency: transitive description: name: fake_async - sha256: "511392330127add0b769b75a987850d136345d9227c6b94c96a04cf4a391bf78" + sha256: "6a95e56b2449df2273fd8c45a662d6947ce1ebb7aafe80e550a3f68297f3cacc" url: "https://pub.dev" source: hosted - version: "1.3.1" + version: "1.3.2" ffi: dependency: "direct main" description: @@ -758,10 +758,10 @@ packages: dependency: transitive description: name: file - sha256: "5fc22d7c25582e38ad9a8515372cd9a93834027aacf1801cf01164dac0ffa08c" + sha256: a3b4f84adafef897088c160faf7dfffb7696046cb13ae90b508c2cbc95d3b8d4 url: "https://pub.dev" source: hosted - version: "7.0.0" + version: "7.0.1" file_picker: dependency: "direct main" description: @@ -967,16 +967,8 @@ packages: description: flutter source: sdk version: "0.0.0" - freezed: - dependency: "direct dev" - description: - name: freezed - sha256: "44c19278dd9d89292cf46e97dc0c1e52ce03275f40a97c5a348e802a924bf40e" - url: "https://pub.dev" - source: hosted - version: "2.5.7" freezed_annotation: - dependency: "direct main" + dependency: transitive description: name: freezed_annotation sha256: c2e2d632dd9b8a2b7751117abcfc2b4888ecfe181bd9fca7170d9ef02e595fe2 @@ -1229,18 +1221,18 @@ packages: dependency: transitive description: name: leak_tracker - sha256: "7bb2830ebd849694d1ec25bf1f44582d6ac531a57a365a803a6034ff751d2d06" + sha256: c35baad643ba394b40aac41080300150a4f08fd0fd6a10378f8f7c6bc161acec url: "https://pub.dev" source: hosted - version: "10.0.7" + version: "10.0.8" leak_tracker_flutter_testing: dependency: transitive description: name: leak_tracker_flutter_testing - sha256: "9491a714cca3667b60b5c420da8217e6de0d1ba7a5ec322fab01758f6998f379" + sha256: f8b613e7e6a13ec79cfdc0e97638fddb3ab848452eff057653abd3edba760573 url: "https://pub.dev" source: hosted - version: "3.0.8" + version: "3.0.9" leak_tracker_testing: dependency: transitive description: @@ -1341,10 +1333,10 @@ packages: dependency: transitive description: name: matcher - sha256: d2323aa2060500f906aa31a895b4030b6da3ebdcc5619d14ce1aada65cd161cb + sha256: dc58c723c3c24bf8d3e2d3ad3f2f9d7bd9cf43ec6feaa64181775e60190153f2 url: "https://pub.dev" source: hosted - version: "0.12.16+1" + version: "0.12.17" material_color_utilities: dependency: transitive description: @@ -1365,10 +1357,10 @@ packages: dependency: "direct main" description: name: meta - sha256: bdb68674043280c3428e9ec998512fb681678676b3c54e773629ffe74419f8c7 + sha256: e3641ec5d63ebf0d9b41bd43201a66e3fc79a65db5f61fc181f04cd27aab950c url: "https://pub.dev" source: hosted - version: "1.15.0" + version: "1.16.0" mime: dependency: transitive description: @@ -1486,10 +1478,10 @@ packages: dependency: transitive description: name: path - sha256: "087ce49c3f0dc39180befefc60fdb4acd8f8620e5682fe2476afd0b3688bb4af" + sha256: "75cca69d1490965be98c73ceaea117e8a04dd21217b37b292c9ddbec0d955bc5" url: "https://pub.dev" source: hosted - version: "1.9.0" + version: "1.9.1" path_parsing: dependency: transitive description: @@ -1614,10 +1606,10 @@ packages: dependency: transitive description: name: platform - sha256: "9b71283fc13df574056616011fb138fd3b793ea47cc509c189a6c3fa5f8a1a65" + sha256: "5d6b1b0036a5f331ebc77c850ebc8506cbc1e9416c27e59b439f917a902a4984" url: "https://pub.dev" source: hosted - version: "3.1.5" + version: "3.1.6" plugin_platform_interface: dependency: transitive description: @@ -1654,10 +1646,10 @@ packages: dependency: transitive description: name: process - sha256: "21e54fd2faf1b5bdd5102afd25012184a6793927648ea81eea80552ac9405b32" + sha256: "107d8be718f120bbba9dcd1e95e3bd325b1b4a4f07db64154635ba03f2567a0d" url: "https://pub.dev" source: hosted - version: "5.0.2" + version: "5.0.3" protobuf: dependency: transitive description: @@ -1861,10 +1853,10 @@ packages: dependency: transitive description: name: source_span - sha256: "53e943d4206a5e30df338fd4c6e7a077e02254531b138a15aec3bd143c1a8b3c" + sha256: "254ee5351d6cb365c859e20ee823c3bb479bf4a293c22d17a9f1bf144ce86f7c" url: "https://pub.dev" source: hosted - version: "1.10.0" + version: "1.10.1" sqlite3: dependency: "direct main" description: @@ -1885,10 +1877,10 @@ packages: dependency: transitive description: name: stack_trace - sha256: "9f47fd3630d76be3ab26f0ee06d213679aa425996925ff3feffdec504931c377" + sha256: "8b27215b45d22309b5cddda1aa2b19bdfec9df0e765f2de506401c071d38d1b1" url: "https://pub.dev" source: hosted - version: "1.12.0" + version: "1.12.1" stack_wallet_backup: dependency: "direct main" description: @@ -1918,10 +1910,10 @@ packages: dependency: "direct main" description: name: stream_channel - sha256: ba2aa5d8cc609d96bbb2899c28934f9e1af5cddbd60a827822ea467161eb54e7 + sha256: "969e04c80b8bcdf826f8f16579c7b14d780458bd97f56d107d3950fdbeef059d" url: "https://pub.dev" source: hosted - version: "2.1.2" + version: "2.1.4" stream_transform: dependency: transitive description: @@ -1934,10 +1926,10 @@ packages: dependency: transitive description: name: string_scanner - sha256: "688af5ed3402a4bde5b3a6c15fd768dbf2621a614950b17f04626c431ab3c4c3" + sha256: "921cd31725b72fe181906c6a94d987c78e3b98c2e205b397ea399d4054872b43" url: "https://pub.dev" source: hosted - version: "1.3.0" + version: "1.4.1" string_validator: dependency: "direct main" description: @@ -1958,34 +1950,34 @@ packages: dependency: transitive description: name: term_glyph - sha256: a29248a84fbb7c79282b40b8c72a1209db169a2e0542bce341da992fe1bc7e84 + sha256: "7f554798625ea768a7518313e58f83891c7f5024f88e46e7182a4558850a4b8e" url: "https://pub.dev" source: hosted - version: "1.2.1" + version: "1.2.2" test: dependency: transitive description: name: test - sha256: "713a8789d62f3233c46b4a90b174737b2c04cb6ae4500f2aa8b1be8f03f5e67f" + sha256: "301b213cd241ca982e9ba50266bd3f5bd1ea33f1455554c5abb85d1be0e2d87e" url: "https://pub.dev" source: hosted - version: "1.25.8" + version: "1.25.15" test_api: dependency: transitive description: name: test_api - sha256: "664d3a9a64782fcdeb83ce9c6b39e78fd2971d4e37827b9b06c3aa1edc5e760c" + sha256: fb31f383e2ee25fbbfe06b40fe21e1e458d14080e3c67e7ba0acfde4df4e0bbd url: "https://pub.dev" source: hosted - version: "0.7.3" + version: "0.7.4" test_core: dependency: transitive description: name: test_core - sha256: "12391302411737c176b0b5d6491f466b0dd56d4763e347b6714efbaa74d7953d" + sha256: "84d17c3486c8dfdbe5e12a50c8ae176d15e2a771b96909a9442b40173649ccaa" url: "https://pub.dev" source: hosted - version: "0.6.5" + version: "0.6.8" tezart: dependency: "direct main" description: @@ -2192,10 +2184,10 @@ packages: dependency: transitive description: name: vm_service - sha256: f6be3ed8bd01289b34d679c2b62226f63c0e69f9fd2e50a6b3c1c729a961041b + sha256: "0968250880a6c5fe7edc067ed0a13d4bae1577fe2771dcf3010d52c4a9d3ca14" url: "https://pub.dev" source: hosted - version: "14.3.0" + version: "14.3.1" wakelock_platform_interface: dependency: transitive description: @@ -2335,7 +2327,7 @@ packages: source: hosted version: "1.1.0" xelis_dart_sdk: - dependency: "direct main" + dependency: transitive description: name: xelis_dart_sdk sha256: "2a7f8ab4c30fad2fd824ba6ea4e83ac20c726b47c7aa4f1e713ef3971a3ec1f7" diff --git a/scripts/app_config/configure_stack_wallet.sh b/scripts/app_config/configure_stack_wallet.sh index 0fd8e5e8a..e46420fa0 100755 --- a/scripts/app_config/configure_stack_wallet.sh +++ b/scripts/app_config/configure_stack_wallet.sh @@ -73,6 +73,7 @@ final List _supportedCoins = List.unmodifiable([ Stellar(CryptoCurrencyNetwork.main), Tezos(CryptoCurrencyNetwork.main), Wownero(CryptoCurrencyNetwork.main), + Xelis(CryptoCurrencyNetwork.main), Bitcoin(CryptoCurrencyNetwork.test), Bitcoin(CryptoCurrencyNetwork.test4), Bitcoincash(CryptoCurrencyNetwork.test), @@ -83,6 +84,7 @@ final List _supportedCoins = List.unmodifiable([ Litecoin(CryptoCurrencyNetwork.test), Peercoin(CryptoCurrencyNetwork.test), Stellar(CryptoCurrencyNetwork.test), + Xelis(CryptoCurrencyNetwork.test), ]); final ({String from, String to}) _swapDefaults = (from: "BTC", to: "XMR"); diff --git a/scripts/app_config/templates/pubspec.template b/scripts/app_config/templates/pubspec.template index c52440856..b17e18a6d 100644 --- a/scripts/app_config/templates/pubspec.template +++ b/scripts/app_config/templates/pubspec.template @@ -30,6 +30,11 @@ dependencies: frostdart: path: ./crypto_plugins/frostdart + xelis_flutter: + git: + url: https://github.com/Tritonn204/xelis_flutter_ffi.git + ref: v0.1.0 + flutter_libsparkmobile: git: url: https://github.com/cypherstack/flutter_libsparkmobile.git From 4feb14c7da5b1fc9e08771728e66989dbf98b1e7 Mon Sep 17 00:00:00 2001 From: Tritonn204 Date: Fri, 14 Mar 2025 20:51:00 -0700 Subject: [PATCH 135/193] updated rust logging method, added mnemonic word validation for Xelis --- lib/main.dart | 4 ++-- .../restore_wallet_view/restore_wallet_view.dart | 9 ++++++++- 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/lib/main.dart b/lib/main.dart index 45a1fff18..2304688fa 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -82,9 +82,9 @@ final openedFromSWBFileStringStateProvider = void startListeningToRustLogs() { xelis_api.createLogStream().listen((logEntry) { - print("[Rust Log] [${logEntry.level}] ${logEntry.tag}: ${logEntry.msg}"); + Logging.instance.i("[Rust Log] [${logEntry.level}] ${logEntry.tag}: ${logEntry.msg}"); }, onError: (e) { - print("Error receiving Rust logs: $e"); + Logging.instance.e("Error receiving Rust logs: $e"); }); } diff --git a/lib/pages/add_wallet_views/restore_wallet_view/restore_wallet_view.dart b/lib/pages/add_wallet_views/restore_wallet_view/restore_wallet_view.dart index b70c2afcf..0c3ca9a6a 100644 --- a/lib/pages/add_wallet_views/restore_wallet_view/restore_wallet_view.dart +++ b/lib/pages/add_wallet_views/restore_wallet_view/restore_wallet_view.dart @@ -25,6 +25,8 @@ import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:flutter_svg/flutter_svg.dart'; import 'package:wakelock_plus/wakelock_plus.dart'; +import 'package:xelis_flutter/src/api/seed_search_engine.dart' as x_seed; + import '../../../notifications/show_flush_bar.dart'; import '../../../pages_desktop_specific/desktop_home_view.dart'; import '../../../pages_desktop_specific/my_stack_view/exit_to_my_stack_button.dart'; @@ -104,6 +106,7 @@ class _RestoreWalletViewState extends ConsumerState { late final int _seedWordCount; late final bool isDesktop; + x_seed.SearchEngine? _xelisSeedSearch; final HashSet _wordListHashSet = HashSet.from(bip39wordlist.WORDLIST); final ScrollController controller = ScrollController(); @@ -168,6 +171,10 @@ class _RestoreWalletViewState extends ConsumerState { // _focusNodes.add(FocusNode()); } + if (widget.coin is Xelis) { + _xelisSeedSearch = x_seed.SearchEngine.init(languageIndex: BigInt.from(0)); + } + super.initState(); } @@ -202,7 +209,7 @@ class _RestoreWalletViewState extends ConsumerState { } // TODO: use Xelis word list if (widget.coin is Xelis) { - return true; + return _xelisSeedSearch!.search(query: word).length > 0; } return _wordListHashSet.contains(word); } From 6e725a5bb5bbdce79779f5af51200ea3badeafe0 Mon Sep 17 00:00:00 2001 From: Tritonn204 Date: Fri, 14 Mar 2025 20:51:14 -0700 Subject: [PATCH 136/193] removed comment --- .../restore_wallet_view/restore_wallet_view.dart | 1 - 1 file changed, 1 deletion(-) diff --git a/lib/pages/add_wallet_views/restore_wallet_view/restore_wallet_view.dart b/lib/pages/add_wallet_views/restore_wallet_view/restore_wallet_view.dart index 0c3ca9a6a..82aef0d60 100644 --- a/lib/pages/add_wallet_views/restore_wallet_view/restore_wallet_view.dart +++ b/lib/pages/add_wallet_views/restore_wallet_view/restore_wallet_view.dart @@ -207,7 +207,6 @@ class _RestoreWalletViewState extends ConsumerState { ); return wowneroWordList.contains(word); } - // TODO: use Xelis word list if (widget.coin is Xelis) { return _xelisSeedSearch!.search(query: word).length > 0; } From 30dedee63fe64709af3dc80ea54e02e5d0ace8c5 Mon Sep 17 00:00:00 2001 From: Julian Date: Mon, 17 Mar 2025 07:59:13 -0600 Subject: [PATCH 137/193] ios tweaks and updates --- ios/Podfile.lock | 4 ++-- .../xcshareddata/xcschemes/Runner.xcscheme | 1 + pubspec.lock | 8 +++----- scripts/app_config/templates/pubspec.template | 2 +- 4 files changed, 7 insertions(+), 8 deletions(-) diff --git a/ios/Podfile.lock b/ios/Podfile.lock index 54bf5e55f..ffd9d8ca3 100644 --- a/ios/Podfile.lock +++ b/ios/Podfile.lock @@ -215,7 +215,7 @@ SPEC CHECKSUMS: devicelocale: 35ba84dc7f45f527c3001535d8c8d104edd5d926 DKImagePickerController: b512c28220a2b8ac7419f21c491fc8534b7601ac DKPhotoGallery: fdfad5125a9fdda9cc57df834d49df790dbb4179 - file_picker: 09aa5ec1ab24135ccd7a1621c46c84134bfd6655 + file_picker: b159e0c068aef54932bb15dc9fd1571818edaf49 Flutter: e0871f40cf51350855a761d2e70bf5af5b9b5de7 flutter_libepiccash: 36241aa7d3126f6521529985ccb3dc5eaf7bb317 flutter_libsparkmobile: 6373955cc3327a926d17059e7405dde2fb12f99f @@ -245,4 +245,4 @@ SPEC CHECKSUMS: PODFILE CHECKSUM: 57c8aed26fba39d3ec9424816221f294a07c58eb -COCOAPODS: 1.15.2 +COCOAPODS: 1.16.2 diff --git a/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index 5e31d3d34..c53e2b314 100644 --- a/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -48,6 +48,7 @@ ignoresPersistentStateOnLaunch = "NO" debugDocumentVersioning = "YES" debugServiceExtension = "internal" + enableGPUValidationMode = "1" allowLocationSimulation = "YES"> diff --git a/pubspec.lock b/pubspec.lock index 36d4f69ed..0da4f60f4 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -823,11 +823,9 @@ packages: flutter_libsparkmobile: dependency: "direct main" description: - path: "." - ref: "619190a388e362c0e9d1c4c4a6e64f5395bd8d84" - resolved-ref: "619190a388e362c0e9d1c4c4a6e64f5395bd8d84" - url: "https://github.com/cypherstack/flutter_libsparkmobile.git" - source: git + path: "../flutter_libsparkmobile" + relative: true + source: path version: "0.0.2" flutter_lints: dependency: "direct dev" diff --git a/scripts/app_config/templates/pubspec.template b/scripts/app_config/templates/pubspec.template index ff0fe79b1..5f009019a 100644 --- a/scripts/app_config/templates/pubspec.template +++ b/scripts/app_config/templates/pubspec.template @@ -33,7 +33,7 @@ dependencies: flutter_libsparkmobile: git: url: https://github.com/cypherstack/flutter_libsparkmobile.git - ref: 619190a388e362c0e9d1c4c4a6e64f5395bd8d84 + ref: 28d0f6c8db56a7d14d6495e810b8705a5c438929 # cs_monero compat (unpublished) compat: From b190907caef58059d65bd2f13aa88af6779e1d3e Mon Sep 17 00:00:00 2001 From: Julian Date: Mon, 17 Mar 2025 08:25:41 -0600 Subject: [PATCH 138/193] pubspec lock update --- pubspec.lock | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/pubspec.lock b/pubspec.lock index e7a85729a..95c5d28ab 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -831,9 +831,11 @@ packages: flutter_libsparkmobile: dependency: "direct main" description: - path: "../flutter_libsparkmobile" - relative: true - source: path + path: "." + ref: "28d0f6c8db56a7d14d6495e810b8705a5c438929" + resolved-ref: "28d0f6c8db56a7d14d6495e810b8705a5c438929" + url: "https://github.com/cypherstack/flutter_libsparkmobile.git" + source: git version: "0.0.2" flutter_lints: dependency: "direct dev" From fe2514e97e9c1bab18448433f2fcc49e76d16b8a Mon Sep 17 00:00:00 2001 From: Julian Date: Mon, 17 Mar 2025 08:42:32 -0600 Subject: [PATCH 139/193] lint and code formatting --- lib/wallets/wallet/impl/xelis_wallet.dart | 505 +++++++++--------- .../wallet/intermediate/lib_xelis_wallet.dart | 185 +++---- 2 files changed, 339 insertions(+), 351 deletions(-) diff --git a/lib/wallets/wallet/impl/xelis_wallet.dart b/lib/wallets/wallet/impl/xelis_wallet.dart index 42d260255..0dbeb56df 100644 --- a/lib/wallets/wallet/impl/xelis_wallet.dart +++ b/lib/wallets/wallet/impl/xelis_wallet.dart @@ -1,53 +1,29 @@ import 'dart:async'; import 'dart:convert'; -import 'dart:io'; +import 'dart:math'; -import 'package:decimal/decimal.dart'; import 'package:flutter/foundation.dart'; import 'package:isar/isar.dart'; - -import 'package:xelis_flutter/src/api/network.dart' as x_network; -import 'package:xelis_flutter/src/api/wallet.dart' as x_wallet; +import 'package:mutex/mutex.dart'; +import 'package:stack_wallet_backup/generate_password.dart'; import 'package:xelis_dart_sdk/xelis_dart_sdk.dart' as xelis_sdk; +import 'package:xelis_flutter/src/api/wallet.dart' as x_wallet; -import 'package:path_provider/path_provider.dart'; -import 'package:path/path.dart' as path; - -import '../intermediate/lib_xelis_wallet.dart'; - -import '../../../utilities/stack_file_system.dart'; +import '../../../models/balance.dart'; import '../../../models/isar/models/blockchain_data/address.dart'; import '../../../models/isar/models/blockchain_data/transaction.dart'; import '../../../models/isar/models/blockchain_data/v2/input_v2.dart'; import '../../../models/isar/models/blockchain_data/v2/output_v2.dart'; import '../../../models/isar/models/blockchain_data/v2/transaction_v2.dart'; - -import '../../../services/event_bus/events/global/blocks_remaining_event.dart'; -import '../../../services/event_bus/events/global/refresh_percent_changed_event.dart'; -import '../../../services/event_bus/events/global/tor_connection_status_changed_event.dart'; -import '../../../services/event_bus/events/global/tor_status_changed_event.dart'; -import '../../../services/event_bus/events/global/updated_in_background_event.dart'; +import '../../../models/paymint/fee_object_model.dart'; import '../../../services/event_bus/events/global/wallet_sync_status_changed_event.dart'; import '../../../services/event_bus/global_event_bus.dart'; - -import '../../../models/node_model.dart'; -import '../../../models/paymint/fee_object_model.dart'; -import '../../../models/balance.dart'; import '../../../utilities/amount/amount.dart'; import '../../../utilities/logger.dart'; import '../../crypto_currency/crypto_currency.dart'; import '../../models/tx_data.dart'; -import '../wallet.dart'; - -import '../../../providers/providers.dart'; - -import 'package:isar/isar.dart'; -import 'package:mutex/mutex.dart'; -import 'package:stack_wallet_backup/generate_password.dart'; -import 'package:web_socket_channel/web_socket_channel.dart'; import '../intermediate/lib_xelis_wallet.dart'; - -import 'dart:math'; +import '../wallet.dart'; class XelisWallet extends LibXelisWallet { XelisWallet(CryptoCurrencyNetwork network) : super(Xelis(network)); @@ -59,14 +35,15 @@ class XelisWallet extends LibXelisWallet { @override Future init({bool? isRestore}) async { debugPrint("Xelis: init"); - + if (isRestore == true) { await _restoreWallet(); return await super.init(); } - String? walletExists = - await secureStorageInterface.read(key: "${walletId}_wallet"); + final String? walletExists = await secureStorageInterface.read( + key: "${walletId}_wallet", + ); if (walletExists == null) { await _createNewWallet(); @@ -79,7 +56,7 @@ class XelisWallet extends LibXelisWallet { Future _createNewWallet() async { final String password = generatePassword(); - + debugPrint("Xelis: storing password"); await secureStorageInterface.write( key: Wallet.mnemonicPassphraseKey(walletId: info.walletId), @@ -128,9 +105,9 @@ class XelisWallet extends LibXelisWallet { await updateTransactions(isRescan: true, topoheight: 0); }); return; - } + } - // Borrowed from libmonero for now, need to refactor for Xelis view keys + // Borrowed from libmonero for now, need to refactor for Xelis view keys // if (isViewOnly) { // await recoverViewOnly(); // return; @@ -138,7 +115,7 @@ class XelisWallet extends LibXelisWallet { try { await open(); - } catch (e, s) { + } catch (_) { // Logging.instance.log( // "Exception rethrown from recoverFromMnemonic(): $e\n$s", // level: LogLevel.Error, @@ -147,17 +124,16 @@ class XelisWallet extends LibXelisWallet { } } - @override Future pingCheck() async { checkInitialized(); try { - final nodeInfo = await libXelisWallet!.getDaemonInfo(); + await libXelisWallet!.getDaemonInfo(); await handleOnline(); return true; } catch (_) { - return false; await handleOffline(); + return false; } } @@ -168,9 +144,11 @@ class XelisWallet extends LibXelisWallet { await _balanceUpdateMutex.protect(() async { try { if (await libXelisWallet!.hasXelisBalance()) { - final BigInt xelBalance = newBalance != null - ? BigInt.from(newBalance) - : await libXelisWallet!.getXelisBalanceRaw(); // in the future, use getAssetBalances and handle each + final BigInt xelBalance = + newBalance != null + ? BigInt.from(newBalance) + : await libXelisWallet! + .getXelisBalanceRaw(); // in the future, use getAssetBalances and handle each final balance = Balance( total: Amount( rawValue: xelBalance, @@ -187,12 +165,9 @@ class XelisWallet extends LibXelisWallet { fractionDigits: cryptoCurrency.fractionDigits, ), ); - await info.updateBalance( - newBalance: balance, - isar: mainDB.isar, - ); + await info.updateBalance(newBalance: balance, isar: mainDB.isar); } - } catch (e, s) { + } catch (_) { // Logging.instance.log( // "Error in updateBalance(): $e\n$s", // level: LogLevel.Warning, @@ -203,7 +178,8 @@ class XelisWallet extends LibXelisWallet { Future _fetchChainHeight() async { final infoString = await libXelisWallet!.getDaemonInfo(); - final Map nodeInfo = json.decode(infoString); + final Map nodeInfo = + (json.decode(infoString) as Map).cast(); pruningHeight = int.parse(nodeInfo['pruned_topoheight'].toString()); return int.parse(nodeInfo['topoheight'].toString()); @@ -213,12 +189,12 @@ class XelisWallet extends LibXelisWallet { Future updateChainHeight({int? topoheight}) async { try { final height = topoheight ?? await _fetchChainHeight(); - + await info.updateCachedChainHeight( newHeight: height.toInt(), isar: mainDB.isar, ); - } catch (e, s) { + } catch (_) { // Logging.instance.log( // "Error in updateChainHeight(): $e\n$s", // level: LogLevel.Warning, @@ -235,7 +211,7 @@ class XelisWallet extends LibXelisWallet { await libXelisWallet!.offlineMode(); } await super.connect(); - } catch (e, s) { + } catch (_) { // Logging.instance.log( // "Error updating node: $e\n$s", // level: LogLevel.Error, @@ -252,22 +228,24 @@ class XelisWallet extends LibXelisWallet { }) async { checkInitialized(); - final newReceivingAddress = await getCurrentReceivingAddress() ?? - Address( - walletId: walletId, - derivationIndex: 0, - derivationPath: null, - value: libXelisWallet!.getAddressStr(), - publicKey: [], - type: AddressType.xelis, - subType: AddressSubType.receiving, - ); + final newReceivingAddress = + await getCurrentReceivingAddress() ?? + Address( + walletId: walletId, + derivationIndex: 0, + derivationPath: null, + value: libXelisWallet!.getAddressStr(), + publicKey: [], + type: AddressType.xelis, + subType: AddressSubType.receiving, + ); final thisAddress = newReceivingAddress.value; - + int firstBlock = 0; if (!isRescan) { - firstBlock = await mainDB.isar.transactionV2s + firstBlock = + await mainDB.isar.transactionV2s .where() .walletIdEqualTo(walletId) .heightProperty() @@ -288,16 +266,19 @@ class XelisWallet extends LibXelisWallet { for (final jsonString in txListJson) { try { - final transactionEntry = xelis_sdk.TransactionEntry.fromJson(json.decode(jsonString)); + final transactionEntry = xelis_sdk.TransactionEntry.fromJson( + (json.decode(jsonString) as Map).cast(), + ); // Check for duplicates - final storedTx = await mainDB.isar.transactionV2s - .where() - .txidWalletIdEqualTo(transactionEntry.hash, walletId) - .findFirst(); - - if (storedTx != null && - storedTx.height != null && + final storedTx = + await mainDB.isar.transactionV2s + .where() + .txidWalletIdEqualTo(transactionEntry.hash, walletId) + .findFirst(); + + if (storedTx != null && + storedTx.height != null && storedTx.height! > 0) { continue; // Skip already processed transactions } @@ -305,140 +286,150 @@ class XelisWallet extends LibXelisWallet { final List outputs = []; final List inputs = []; TransactionType? txType; - TransactionSubType txSubType = TransactionSubType.none; + const TransactionSubType txSubType = TransactionSubType.none; int? nonce; Amount fee = Amount( - rawValue: BigInt.zero, - fractionDigits: cryptoCurrency.fractionDigits + rawValue: BigInt.zero, + fractionDigits: cryptoCurrency.fractionDigits, ); - Map otherData = {}; + final Map otherData = {}; final entryType = transactionEntry.txEntryType; if (entryType is xelis_sdk.CoinbaseEntry) { - final coinbase = entryType; - txType = TransactionType.incoming; + final coinbase = entryType; + txType = TransactionType.incoming; + + final int decimals = await libXelisWallet!.getAssetDecimals( + asset: xelis_sdk.xelisAsset, + ); + + fee = Amount(rawValue: BigInt.zero, fractionDigits: decimals); + + outputs.add( + OutputV2.isarCantDoRequiredInDefaultConstructor( + scriptPubKeyHex: "", + valueStringSats: coinbase.reward.toString(), + addresses: [thisAddress], + walletOwns: true, + ), + ); + } else if (entryType is xelis_sdk.BurnEntry) { + final burn = entryType; + txType = TransactionType.outgoing; + + final int decimals = await libXelisWallet!.getAssetDecimals( + asset: burn.asset, + ); + + fee = Amount( + rawValue: BigInt.from(burn.fee), + fractionDigits: decimals, + ); + inputs.add( + InputV2.isarCantDoRequiredInDefaultConstructor( + scriptSigAsm: null, + scriptSigHex: null, + sequence: null, + outpoint: null, + valueStringSats: burn.amount.toString(), + addresses: [thisAddress], + witness: null, + innerRedeemScriptAsm: null, + coinbase: null, + walletOwns: true, + ), + ); + + outputs.add( + OutputV2.isarCantDoRequiredInDefaultConstructor( + scriptPubKeyHex: "", + valueStringSats: burn.amount.toString(), + addresses: ['burn'], + walletOwns: false, + ), + ); + + otherData['burnAsset'] = burn.asset; + } else if (entryType is xelis_sdk.IncomingEntry) { + final incoming = entryType; + txType = + incoming.from == thisAddress + ? TransactionType.sentToSelf + : TransactionType.incoming; + + for (final transfer in incoming.transfers) { final int decimals = await libXelisWallet!.getAssetDecimals( - asset: xelis_sdk.xelisAsset + asset: transfer.asset, ); - fee = Amount( - rawValue: BigInt.zero, - fractionDigits: decimals - ); + fee = Amount(rawValue: BigInt.zero, fractionDigits: decimals); - outputs.add(OutputV2.isarCantDoRequiredInDefaultConstructor( + outputs.add( + OutputV2.isarCantDoRequiredInDefaultConstructor( scriptPubKeyHex: "", - valueStringSats: coinbase.reward.toString(), + valueStringSats: transfer.amount.toString(), addresses: [thisAddress], walletOwns: true, - )); - } else if (entryType is xelis_sdk.BurnEntry) { - final burn = entryType; - txType = TransactionType.outgoing; + ), + ); + otherData['asset_${transfer.asset}'] = transfer.amount.toString(); + if (transfer.extraData != null) { + otherData['extraData_${transfer.asset}'] = + transfer.extraData!.toJson(); + } + } + } else if (entryType is xelis_sdk.OutgoingEntry) { + final outgoing = entryType; + txType = TransactionType.outgoing; + nonce = outgoing.nonce; + + for (final transfer in outgoing.transfers) { final int decimals = await libXelisWallet!.getAssetDecimals( - asset: burn.asset + asset: transfer.asset, ); fee = Amount( - rawValue: BigInt.from(burn.fee), - fractionDigits: decimals + rawValue: BigInt.from(outgoing.fee), + fractionDigits: decimals, ); - inputs.add(InputV2.isarCantDoRequiredInDefaultConstructor( - scriptSigAsm: null, + inputs.add( + InputV2.isarCantDoRequiredInDefaultConstructor( scriptSigHex: null, + scriptSigAsm: null, sequence: null, outpoint: null, - valueStringSats: burn.amount.toString(), addresses: [thisAddress], + valueStringSats: (transfer.amount + outgoing.fee).toString(), witness: null, innerRedeemScriptAsm: null, coinbase: null, walletOwns: true, - )); + ), + ); - outputs.add(OutputV2.isarCantDoRequiredInDefaultConstructor( + outputs.add( + OutputV2.isarCantDoRequiredInDefaultConstructor( scriptPubKeyHex: "", - valueStringSats: burn.amount.toString(), - addresses: ['burn'], + valueStringSats: transfer.amount.toString(), + addresses: [transfer.destination], walletOwns: false, - )); + ), + ); - otherData['burnAsset'] = burn.asset; - } else if (entryType is xelis_sdk.IncomingEntry) { - final incoming = entryType; - txType = incoming.from == thisAddress - ? TransactionType.sentToSelf - : TransactionType.incoming; - - for (final transfer in incoming.transfers) { - final int decimals = await libXelisWallet!.getAssetDecimals( - asset: transfer.asset - ); - - fee = Amount( - rawValue: BigInt.zero, - fractionDigits: decimals - ); - - outputs.add(OutputV2.isarCantDoRequiredInDefaultConstructor( - scriptPubKeyHex: "", - valueStringSats: transfer.amount.toString(), - addresses: [thisAddress], - walletOwns: true, - )); - - otherData['asset_${transfer.asset}'] = transfer.amount.toString(); - if (transfer.extraData != null) { - otherData['extraData_${transfer.asset}'] = transfer.extraData!.toJson(); - } - } - } else if (entryType is xelis_sdk.OutgoingEntry) { - final outgoing = entryType; - txType = TransactionType.outgoing; - nonce = outgoing.nonce; - - for (final transfer in outgoing.transfers) { - final int decimals = await libXelisWallet!.getAssetDecimals( - asset: transfer.asset - ); - - fee = Amount( - rawValue: BigInt.from(outgoing.fee), - fractionDigits: decimals - ); - - inputs.add(InputV2.isarCantDoRequiredInDefaultConstructor( - scriptSigHex: null, - scriptSigAsm: null, - sequence: null, - outpoint: null, - addresses: [thisAddress], - valueStringSats: (transfer.amount + outgoing.fee).toString(), - witness: null, - innerRedeemScriptAsm: null, - coinbase: null, - walletOwns: true, - )); - - outputs.add(OutputV2.isarCantDoRequiredInDefaultConstructor( - scriptPubKeyHex: "", - valueStringSats: transfer.amount.toString(), - addresses: [transfer.destination], - walletOwns: false, - )); - - otherData['asset_${transfer.asset}_amount'] = transfer.amount.toString(); - otherData['asset_${transfer.asset}_fee'] = fee.toString(); - if (transfer.extraData != null) { - otherData['extraData_${transfer.asset}'] = transfer.extraData!.toJson(); - } + otherData['asset_${transfer.asset}_amount'] = + transfer.amount.toString(); + otherData['asset_${transfer.asset}_fee'] = fee.toString(); + if (transfer.extraData != null) { + otherData['extraData_${transfer.asset}'] = + transfer.extraData!.toJson(); } + } } else { - // Skip unknown entry types + // Skip unknown entry types } final txn = TransactionV2( @@ -446,8 +437,9 @@ class XelisWallet extends LibXelisWallet { blockHash: "", // Not provided in Xelis data hash: transactionEntry.hash, txid: transactionEntry.hash, - timestamp: (transactionEntry.timestamp?.millisecondsSinceEpoch ?? 0) ~/ 1000, - height: transactionEntry?.topoheight, + timestamp: + (transactionEntry.timestamp?.millisecondsSinceEpoch ?? 0) ~/ 1000, + height: transactionEntry.topoheight, inputs: List.unmodifiable(inputs), outputs: List.unmodifiable(outputs), version: -1, // Version not provided @@ -456,7 +448,7 @@ class XelisWallet extends LibXelisWallet { otherData: jsonEncode({ ...otherData, if (nonce != null) 'nonce': nonce, - if (fee != null) 'overrideFee': fee.toJsonString(), + 'overrideFee': fee.toJsonString(), }), ); @@ -465,9 +457,8 @@ class XelisWallet extends LibXelisWallet { // level: LogLevel.Debug, // ); - txns.add(txn); - } catch (e, s) { + } catch (_) { // Logging.instance.log( // "Error handling tx $jsonString: $e\n$s", // level: LogLevel.Warning, @@ -518,22 +509,29 @@ class XelisWallet extends LibXelisWallet { checkInitialized(); // Use default address if recipients list is empty - final recipients = txData.recipients?.isNotEmpty == true - ? txData.recipients! - : [( - address: 'xel:xz9574c80c4xegnvurazpmxhw5dlg2n0g9qm60uwgt75uqyx3pcsqzzra9m', - amount: Amount.zeroWith( - fractionDigits: cryptoCurrency.fractionDigits, - ), - isChange: false - )]; + final recipients = + txData.recipients?.isNotEmpty == true + ? txData.recipients! + : [ + ( + address: + 'xel:xz9574c80c4xegnvurazpmxhw5dlg2n0g9qm60uwgt75uqyx3pcsqzzra9m', + amount: Amount.zeroWith( + fractionDigits: cryptoCurrency.fractionDigits, + ), + isChange: false, + ), + ]; final asset = assetId ?? xelis_sdk.xelisAsset; // Calculate total send amount final totalSendAmount = recipients.fold( - Amount(rawValue: BigInt.zero, fractionDigits: cryptoCurrency.fractionDigits), - (sum, recipient) => sum + recipient.amount + Amount( + rawValue: BigInt.zero, + fractionDigits: cryptoCurrency.fractionDigits, + ), + (sum, recipient) => sum + recipient.amount, ); // Check balance using raw method @@ -555,28 +553,26 @@ class XelisWallet extends LibXelisWallet { // Check if we have enough for both transfers and fee if (totalSendAmount + boostedFee > balance) { final requiredAmt = await libXelisWallet!.formatCoin( - atomicAmount: (totalSendAmount + boostedFee).raw, - assetHash: asset + atomicAmount: (totalSendAmount + boostedFee).raw, + assetHash: asset, ); final availableAmt = await libXelisWallet!.formatCoin( - atomicAmount: xelBalance, - assetHash: asset + atomicAmount: xelBalance, + assetHash: asset, ); throw Exception( "Insufficient balance to cover transfers and fees. " - "Required: $requiredAmt, Available: $availableAmt" + "Required: $requiredAmt, Available: $availableAmt", ); } return txData.copyWith( fee: boostedFee, - otherData: jsonEncode({ - 'asset': asset, - }), + otherData: jsonEncode({'asset': asset}), ); - } catch (e, s) { + } catch (_) { // Logging.instance.log( // "Exception rethrown from prepareSend(): $e\n$s", // level: LogLevel.Error, @@ -587,39 +583,43 @@ class XelisWallet extends LibXelisWallet { @override Future estimateFeeFor( - Amount amount, - int feeRate, - { - double? feeMultiplier, - List recipients = const [], - String? assetId - } - ) async { + Amount amount, + int feeRate, { + double? feeMultiplier, + List recipients = const [], + String? assetId, + }) async { try { checkInitialized(); final asset = assetId ?? xelis_sdk.xelisAsset; // Default values for a new wallet or when estimation fails - final defaultDecimals = 8; + final defaultDecimals = cryptoCurrency.fractionDigits; final defaultFee = BigInt.from(0); - + // Use default address if recipients list is empty - final effectiveRecipients = recipients.isNotEmpty - ? recipients - : [( - address: 'xel:xz9574c80c4xegnvurazpmxhw5dlg2n0g9qm60uwgt75uqyx3pcsqzzra9m', - amount: amount, - isChange: false - )]; + final effectiveRecipients = + recipients.isNotEmpty + ? recipients + : [ + ( + address: + 'xel:xz9574c80c4xegnvurazpmxhw5dlg2n0g9qm60uwgt75uqyx3pcsqzzra9m', + amount: amount, + isChange: false, + ), + ]; try { final transfers = await Future.wait( effectiveRecipients.map((recipient) async { try { - final amt = double.parse(await libXelisWallet!.formatCoin( - atomicAmount: recipient.amount.raw, - assetHash: asset - )); + final amt = double.parse( + await libXelisWallet!.formatCoin( + atomicAmount: recipient.amount.raw, + assetHash: asset, + ), + ); return x_wallet.Transfer( floatAmount: amt, strAddress: recipient.address, @@ -630,7 +630,8 @@ class XelisWallet extends LibXelisWallet { // Handle formatCoin error - use default conversion debugPrint("formatCoin failed: $e, using fallback conversion"); final rawAmount = recipient.amount.raw; - final floatAmount = rawAmount / BigInt.from(10).pow(defaultDecimals); + final floatAmount = + rawAmount / BigInt.from(10).pow(defaultDecimals); return x_wallet.Transfer( floatAmount: floatAmount.toDouble(), strAddress: recipient.address, @@ -638,28 +639,30 @@ class XelisWallet extends LibXelisWallet { extraData: null, ); } - }) + }), ); - final decimals = await libXelisWallet!.getAssetDecimals( - asset: asset + final decimals = await libXelisWallet!.getAssetDecimals(asset: asset); + final estimatedFee = double.parse( + await libXelisWallet!.estimateFees(transfers: transfers), ); - final estimatedFee = double.parse(await libXelisWallet!.estimateFees(transfers: transfers)); final rawFee = (estimatedFee * pow(10, decimals)).round(); return Amount( rawValue: BigInt.from(rawFee), fractionDigits: cryptoCurrency.fractionDigits, ); } catch (e, s) { - debugPrint("Fee estimation failed: $e\n$s"); - - debugPrint("Using fallback fee: $defaultFee"); + Logging.instance.d( + "Fee estimation failed. Using fallback fee: $defaultFee", + error: e, + stackTrace: s, + ); return Amount( rawValue: defaultFee, fractionDigits: cryptoCurrency.fractionDigits, ); } - } catch (e, s) { + } catch (_) { // Logging.instance.log( // "Exception rethrown from estimateFeeFor(): $e\n$s", // level: LogLevel.Error, @@ -681,12 +684,19 @@ class XelisWallet extends LibXelisWallet { final recipient = txData.recipients!.first; final Amount sendAmount = recipient.amount; - final asset = (txData.otherData != null ? jsonDecode(txData.otherData!) : null)?['asset'] ?? xelis_sdk.xelisAsset; - - final amt = double.parse(await libXelisWallet!.formatCoin( - atomicAmount: sendAmount.raw, - assetHash: asset - )); + final asset = + (txData.otherData != null + ? jsonDecode(txData.otherData!) + : null)?['asset'] + as String? ?? + xelis_sdk.xelisAsset; + + final amt = double.parse( + await libXelisWallet!.formatCoin( + atomicAmount: sendAmount.raw, + assetHash: asset, + ), + ); // Create a transfer transaction final txJson = await libXelisWallet!.createTransfersTransaction( @@ -696,8 +706,8 @@ class XelisWallet extends LibXelisWallet { strAddress: recipient.address, assetHash: asset, extraData: null, // Add extra data if needed - ) - ] + ), + ], ); final txMap = jsonDecode(txJson); @@ -706,10 +716,10 @@ class XelisWallet extends LibXelisWallet { // Broadcast the transaction await libXelisWallet!.broadcastTransaction(txHash: txHash); - return await updateSentCachedTxData(txData: txData.copyWith( - txid: txHash, - )); - } catch (e, s) { + return await updateSentCachedTxData( + txData: txData.copyWith(txid: txHash), + ); + } catch (_) { // Logging.instance.log( // "Exception rethrown from confirmSend(): $e\n$s", // level: LogLevel.Error, @@ -739,7 +749,7 @@ class XelisWallet extends LibXelisWallet { case HistorySynced(:final topoheight): await handleHistorySynced(topoheight); } - } catch (e, s) { + } catch (_) { // Logging.instance.log( // "Error handling wallet event: $e\n$s", // level: LogLevel.Error, @@ -749,10 +759,7 @@ class XelisWallet extends LibXelisWallet { @override Future handleNewTopoHeight(int height) async { - await info.updateCachedChainHeight( - newHeight: height, - isar: mainDB.isar, - ); + await info.updateCachedChainHeight(newHeight: height, isar: mainDB.isar); } @override @@ -765,12 +772,12 @@ class XelisWallet extends LibXelisWallet { ); await updateBalance(); - + // Logging.instance.log( // "New transaction processed: ${newTxIds.first}", // level: LogLevel.Info, // ); - } catch (e, s) { + } catch (_) { // Logging.instance.log( // "Error handling new transaction: $e\n$s", // level: LogLevel.Warning, @@ -785,9 +792,9 @@ class XelisWallet extends LibXelisWallet { if (asset == xelis_sdk.xelisAsset) { await updateBalance(newBalance: event.balance); } - + // TODO: Update asset balances if needed - } catch (e, s) { + } catch (_) { // Logging.instance.log( // "Error handling balance change: $e\n$s", // level: LogLevel.Warning, @@ -869,7 +876,7 @@ class XelisWallet extends LibXelisWallet { ), ); } - } catch (e, s) { + } catch (_) { // Logging.instance.log( // "Error in refresh(): $e\n$s", // level: LogLevel.Warning, @@ -877,4 +884,4 @@ class XelisWallet extends LibXelisWallet { } }); } -} \ No newline at end of file +} diff --git a/lib/wallets/wallet/intermediate/lib_xelis_wallet.dart b/lib/wallets/wallet/intermediate/lib_xelis_wallet.dart index fea6eef53..626b83c94 100644 --- a/lib/wallets/wallet/intermediate/lib_xelis_wallet.dart +++ b/lib/wallets/wallet/intermediate/lib_xelis_wallet.dart @@ -1,46 +1,19 @@ -import 'package:isar/isar.dart'; -import '../../../models/isar/models/blockchain_data/address.dart'; -import '../../crypto_currency/intermediate/electrum_currency.dart'; -import '../wallet.dart'; -import '../wallet_mixin_interfaces/mnemonic_interface.dart'; - -import 'package:freezed_annotation/freezed_annotation.dart'; -import 'package:json_annotation/json_annotation.dart'; - import 'dart:async'; import 'dart:convert'; -import 'dart:io'; -import 'package:decimal/decimal.dart'; import 'package:flutter/foundation.dart'; import 'package:isar/isar.dart'; - +import 'package:mutex/mutex.dart'; +import 'package:path_provider/path_provider.dart'; +import 'package:xelis_dart_sdk/xelis_dart_sdk.dart' as xelis_sdk; import 'package:xelis_flutter/src/api/network.dart' as x_network; import 'package:xelis_flutter/src/api/wallet.dart' as x_wallet; -import 'package:xelis_dart_sdk/xelis_dart_sdk.dart' as xelis_sdk; -import 'package:path_provider/path_provider.dart'; -import 'package:path/path.dart' as path; - -import '../../../utilities/stack_file_system.dart'; -import '../../../models/isar/models/blockchain_data/transaction.dart'; -import '../../../models/isar/models/blockchain_data/v2/input_v2.dart'; -import '../../../models/isar/models/blockchain_data/v2/output_v2.dart'; -import '../../../models/isar/models/blockchain_data/v2/transaction_v2.dart'; - -import '../../../models/node_model.dart'; -import '../../../models/paymint/fee_object_model.dart'; -import '../../../models/balance.dart'; -import '../../../utilities/amount/amount.dart'; -import '../../../utilities/logger.dart'; +import '../../../models/isar/models/blockchain_data/address.dart'; import '../../crypto_currency/crypto_currency.dart'; -import '../../models/tx_data.dart'; - -import 'package:isar/isar.dart'; -import 'package:mutex/mutex.dart'; -import 'package:stack_wallet_backup/generate_password.dart'; -import 'package:web_socket_channel/web_socket_channel.dart'; - +import '../../crypto_currency/intermediate/electrum_currency.dart'; +import '../wallet.dart'; +import '../wallet_mixin_interfaces/mnemonic_interface.dart'; import 'external_wallet.dart'; enum XelisTableSize { @@ -48,7 +21,7 @@ enum XelisTableSize { full; bool get isLow => this == XelisTableSize.low; - + static XelisTableSize get platformDefault { if (kIsWeb) { return XelisTableSize.low; @@ -83,7 +56,7 @@ class XelisTableState { return XelisTableState( isGenerating: isGenerating ?? this.isGenerating, currentSize: currentSize ?? this.currentSize, - desiredSize: kIsWeb ? XelisTableSize.low : (desiredSize ?? this._desiredSize), + desiredSize: kIsWeb ? XelisTableSize.low : (desiredSize ?? _desiredSize), ); } @@ -170,14 +143,14 @@ final class HistorySynced extends Event { const HistorySynced(this.topoheight); } -abstract class LibXelisWallet extends ExternalWallet +abstract class LibXelisWallet + extends ExternalWallet with MnemonicInterface { LibXelisWallet(super.currency); static const String _kHasFullTablesKey = 'xelis_has_full_tables'; static const String _kGeneratingTablesKey = 'xelis_generating_tables'; static const String _kWantsFullTablesKey = 'xelis_wants_full_tables'; - static bool _isAnyWalletGeneratingTables = false; static final _initMutex = Mutex(); static final _tableGenerationMutex = Mutex(); static Completer? _tableGenerationCompleter; @@ -200,7 +173,6 @@ abstract class LibXelisWallet extends ExternalWallet } final syncMutex = Mutex(); - NodeModel? _xelisNode; Timer? timer; String? tablePath; @@ -216,9 +188,12 @@ abstract class LibXelisWallet extends ExternalWallet } Future getTableState() async { - final hasFullTables = await secureStorageInterface.read(key: _kHasFullTablesKey) == 'true'; - final isGenerating = await secureStorageInterface.read(key: _kGeneratingTablesKey) == 'true'; - final wantsFull = await secureStorageInterface.read(key: _kWantsFullTablesKey) != 'false'; + final hasFullTables = + await secureStorageInterface.read(key: _kHasFullTablesKey) == 'true'; + final isGenerating = + await secureStorageInterface.read(key: _kGeneratingTablesKey) == 'true'; + final wantsFull = + await secureStorageInterface.read(key: _kWantsFullTablesKey) != 'false'; return XelisTableState( isGenerating: isGenerating, @@ -249,21 +224,30 @@ abstract class LibXelisWallet extends ExternalWallet await for (final rawData in rawEventStream) { final json = jsonDecode(rawData); try { - final eventType = xelis_sdk.WalletEvent.fromStr(json['event'] as String); + final eventType = xelis_sdk.WalletEvent.fromStr( + json['event'] as String, + ); switch (eventType) { case xelis_sdk.WalletEvent.newTopoHeight: yield NewTopoheight(json['data']['topoheight'] as int); case xelis_sdk.WalletEvent.newAsset: yield NewAsset( - xelis_sdk.AssetData.fromJson(json['data'] as Map)); + xelis_sdk.AssetData.fromJson( + json['data'] as Map, + ), + ); case xelis_sdk.WalletEvent.newTransaction: yield NewTransaction( - xelis_sdk.TransactionEntry.fromJson( - json['data'] as Map)); + xelis_sdk.TransactionEntry.fromJson( + json['data'] as Map, + ), + ); case xelis_sdk.WalletEvent.balanceChanged: yield BalanceChanged( - xelis_sdk.BalanceChangedEvent.fromJson( - json['data'] as Map)); + xelis_sdk.BalanceChangedEvent.fromJson( + json['data'] as Map, + ), + ); case xelis_sdk.WalletEvent.rescan: yield Rescan(json['data']['start_topoheight'] as int); case xelis_sdk.WalletEvent.online: @@ -273,7 +257,7 @@ abstract class LibXelisWallet extends ExternalWallet case xelis_sdk.WalletEvent.historySynced: yield HistorySynced(json['data']['topoheight'] as int); } - } catch (e, s) { + } catch (_) { // Logging.instance.log( // "Error processing wallet event: $e\n$s", // level: LogLevel.Error, @@ -293,12 +277,12 @@ abstract class LibXelisWallet extends ExternalWallet Future handleHistorySynced(int topoheight) async {} Future handleNewAsset(xelis_sdk.AssetData asset) async {} + @override Future refresh({int? topoheight}); Future connect() async { try { - _eventSubscription = - convertRawEvents().listen(handleEvent); + _eventSubscription = convertRawEvents().listen(handleEvent); final node = getCurrentNode(); // Logging.instance.log( @@ -306,10 +290,10 @@ abstract class LibXelisWallet extends ExternalWallet // level: LogLevel.Info, // ); await libXelisWallet!.onlineMode( - daemonAddress: "${node.host}:${node.port}" + daemonAddress: "${node.host}:${node.port}", ); await super.refresh(); - } catch (e, s) { + } catch (_) { // Logging.instance.log( // "Error connecting to node: $e\n$s", // level: LogLevel.Error, @@ -319,26 +303,20 @@ abstract class LibXelisWallet extends ExternalWallet } List get standardReceivingAddressFilters => [ - FilterCondition.equalTo( - property: r"type", - value: info.mainAddressType, - ), - const FilterCondition.equalTo( - property: r"subType", - value: AddressSubType.receiving, - ), - ]; + FilterCondition.equalTo(property: r"type", value: info.mainAddressType), + const FilterCondition.equalTo( + property: r"subType", + value: AddressSubType.receiving, + ), + ]; List get standardChangeAddressFilters => [ - FilterCondition.equalTo( - property: r"type", - value: info.mainAddressType, - ), - const FilterCondition.equalTo( - property: r"subType", - value: AddressSubType.change, - ), - ]; + FilterCondition.equalTo(property: r"type", value: info.mainAddressType), + const FilterCondition.equalTo( + property: r"subType", + value: AddressSubType.change, + ), + ]; @override Future open() async { @@ -374,7 +352,7 @@ abstract class LibXelisWallet extends ExternalWallet password: password!, network: cryptoCurrency.network.xelisNetwork, precomputedTablesPath: tablePath, - l1Low: tableState.currentSize.isLow + l1Low: tableState.currentSize.isLow, ); final mnemonic = await wallet.getSeed(); @@ -382,7 +360,7 @@ abstract class LibXelisWallet extends ExternalWallet key: Wallet.mnemonicKey(walletId: walletId), value: mnemonic.trim(), ); - + await secureStorageInterface.delete( key: '_${walletId}_needs_creation', ); @@ -402,14 +380,14 @@ abstract class LibXelisWallet extends ExternalWallet seed: mnemonic.trim(), network: cryptoCurrency.network.xelisNetwork, precomputedTablesPath: tablePath, - l1Low: tableState.currentSize.isLow + l1Low: tableState.currentSize.isLow, ); await secureStorageInterface.write( key: Wallet.mnemonicKey(walletId: walletId), value: mnemonic.trim(), ); - + await secureStorageInterface.delete( key: '_${walletId}_needs_restoration', ); @@ -427,7 +405,7 @@ abstract class LibXelisWallet extends ExternalWallet ); } }); - } catch (e, s) { + } catch (_) { // Logging.instance.log( // "Failed to open/create wallet: $e\n$s", // level: LogLevel.Error, @@ -435,7 +413,7 @@ abstract class LibXelisWallet extends ExternalWallet rethrow; } }); - + debugPrint("Checking for upgradability"); if (await isTableUpgradeAvailable()) { debugPrint("Generating large tables in background"); @@ -443,16 +421,17 @@ abstract class LibXelisWallet extends ExternalWallet } } - final newReceivingAddress = await getCurrentReceivingAddress() ?? - Address( - walletId: walletId, - derivationIndex: 0, - derivationPath: null, - value: libXelisWallet!.getAddressStr(), - publicKey: [], - type: AddressType.xelis, - subType: AddressSubType.receiving, - ); + final newReceivingAddress = + await getCurrentReceivingAddress() ?? + Address( + walletId: walletId, + derivationIndex: 0, + derivationPath: null, + value: libXelisWallet!.getAddressStr(), + publicKey: [], + type: AddressType.xelis, + subType: AddressSubType.receiving, + ); await mainDB.updateOrPutAddresses([newReceivingAddress]); if (info.cachedReceivingAddress != newReceivingAddress.value) { @@ -490,7 +469,7 @@ abstract class LibXelisWallet extends ExternalWallet await libXelisWallet?.close(); libXelisWallet?.dispose(); libXelisWallet = null; - + await super.exit(); }); } @@ -505,15 +484,15 @@ abstract class LibXelisWallet extends ExternalWallet extension XelisTableManagement on LibXelisWallet { Future isTableUpgradeAvailable() async { if (kIsWeb) return false; - + final state = await getTableState(); return state.currentSize != state.desiredSize; } Future updateTablesToDesiredSize() async { if (kIsWeb) return; - - await Future.delayed(const Duration(seconds: 1)); + + await Future.delayed(const Duration(seconds: 1)); if (LibXelisWallet._tableGenerationCompleter != null) { try { await LibXelisWallet._tableGenerationCompleter!.future; @@ -522,7 +501,7 @@ extension XelisTableManagement on LibXelisWallet { // Previous generation failed, we'll try again } } - + await LibXelisWallet._tableGenerationMutex.protect(() async { // Check again after acquiring mutex if (LibXelisWallet._tableGenerationCompleter != null) { @@ -533,7 +512,7 @@ extension XelisTableManagement on LibXelisWallet { // Previous generation failed, we'll try again } } - + final state = await getTableState(); if (state.currentSize == state.desiredSize) return; @@ -547,30 +526,32 @@ extension XelisTableManagement on LibXelisWallet { l1Low: state.desiredSize.isLow, ); - await setTableState(XelisTableState( - isGenerating: false, - currentSize: state.desiredSize, - desiredSize: state.desiredSize, - )); + await setTableState( + XelisTableState( + isGenerating: false, + currentSize: state.desiredSize, + desiredSize: state.desiredSize, + ), + ); debugPrint("Table upgrade done"); LibXelisWallet._tableGenerationCompleter!.complete(); - } catch (e, s) { + } catch (e) { // Logging.instance.log( // "Failed to update tables: $e\n$s", // level: LogLevel.Error, // ); await setTableState(state.copyWith(isGenerating: false)); - + LibXelisWallet._tableGenerationCompleter!.completeError(e); } finally { if (!LibXelisWallet._tableGenerationCompleter!.isCompleted) { LibXelisWallet._tableGenerationCompleter!.completeError( - Exception('Table generation abandoned') + Exception('Table generation abandoned'), ); } LibXelisWallet._tableGenerationCompleter = null; } }); } -} \ No newline at end of file +} From c24935dabfdc2790610c117a5a0347cc49f2d283 Mon Sep 17 00:00:00 2001 From: Julian Date: Mon, 17 Mar 2025 12:01:53 -0600 Subject: [PATCH 140/193] logging change --- lib/main.dart | 353 ++++++++++++---------- lib/wallets/wallet/impl/xelis_wallet.dart | 13 +- macos/Podfile.lock | 161 ---------- 3 files changed, 199 insertions(+), 328 deletions(-) diff --git a/lib/main.dart b/lib/main.dart index 2304688fa..ccf2ecf6e 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -22,8 +22,12 @@ import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:flutter_secure_storage/flutter_secure_storage.dart'; import 'package:google_fonts/google_fonts.dart'; import 'package:keyboard_dismisser/keyboard_dismisser.dart'; +import 'package:logger/logger.dart'; import 'package:path_provider/path_provider.dart'; import 'package:window_size/window_size.dart'; +import 'package:xelis_flutter/src/api/api.dart' as xelis_api; +import 'package:xelis_flutter/src/api/logger.dart' as xelis_logging; +import 'package:xelis_flutter/src/frb_generated.dart' as xelis_rust; import 'app_config.dart'; import 'db/db_version_migration.dart'; @@ -74,18 +78,36 @@ import 'wallets/isar/providers/all_wallets_info_provider.dart'; import 'wallets/wallet/wallet_mixin_interfaces/spark_interface.dart'; import 'widgets/crypto_notifications.dart'; -import 'package:xelis_flutter/src/frb_generated.dart' as xelis_rust; -import 'package:xelis_flutter/src/api/api.dart' as xelis_api; - -final openedFromSWBFileStringStateProvider = - StateProvider((ref) => null); +final openedFromSWBFileStringStateProvider = StateProvider( + (ref) => null, +); void startListeningToRustLogs() { - xelis_api.createLogStream().listen((logEntry) { - Logging.instance.i("[Rust Log] [${logEntry.level}] ${logEntry.tag}: ${logEntry.msg}"); - }, onError: (e) { - Logging.instance.e("Error receiving Rust logs: $e"); - }); + xelis_api.createLogStream().listen( + (logEntry) { + final Level level; + switch (logEntry.level) { + case xelis_logging.Level.error: + level = Level.error; + case xelis_logging.Level.warn: + level = Level.warning; + case xelis_logging.Level.info: + level = Level.info; + case xelis_logging.Level.debug: + level = Level.debug; + case xelis_logging.Level.trace: + level = Level.trace; + } + + Logging.instance.log( + level, + "[Xelis Rust Log] ${logEntry.tag}: ${logEntry.msg}", + ); + }, + onError: (dynamic e) { + Logging.instance.e("Error receiving Xelis Rust logs: $e"); + }, + ); } // main() is the entry point to the app. It initializes Hive (local database), @@ -96,9 +118,6 @@ void main(List args) async { await xelis_rust.RustLib.init(); WidgetsFlutterBinding.ensureInitialized(); - await xelis_api.setUpRustLogger(); - startListeningToRustLogs(); - if (Util.isDesktop && args.length == 2 && args.first == "-d") { StackFileSystem.setDesktopOverrideDir(args.last); } @@ -124,9 +143,7 @@ void main(List args) async { if (screenHeight != null) { // starting to height be 3/4 screen height or 900, whichever is smaller final height = min(screenHeight * 0.75, 900); - setWindowFrame( - Rect.fromLTWH(0, 0, 1220, height), - ); + setWindowFrame(Rect.fromLTWH(0, 0, 1220, height)); } } @@ -162,8 +179,9 @@ void main(List args) async { // node model adapter DB.instance.hive.registerAdapter(NodeModelAdapter()); - if (!DB.instance.hive - .isAdapterRegistered(lib_monero_compat.WalletInfoAdapter().typeId)) { + if (!DB.instance.hive.isAdapterRegistered( + lib_monero_compat.WalletInfoAdapter().typeId, + )) { DB.instance.hive.registerAdapter(lib_monero_compat.WalletInfoAdapter()); } @@ -184,6 +202,9 @@ void main(List args) async { level: Prefs.instance.logLevel, ); + await xelis_api.setUpRustLogger(); + startListeningToRustLogs(); + // setup lib spark logging initSparkLogging(Prefs.instance.logLevel); @@ -210,10 +231,12 @@ void main(List args) async { // Desktop migrate handled elsewhere (currently desktop_login_view.dart) if (!Util.isDesktop) { - final int dbVersion = DB.instance.get( - boxName: DB.boxNameDBInfo, - key: "hive_data_version", - ) as int? ?? + final int dbVersion = + DB.instance.get( + boxName: DB.boxNameDBInfo, + key: "hive_data_version", + ) + as int? ?? 0; if (dbVersion < Constants.currentDataVersion) { try { @@ -248,22 +271,25 @@ void main(List args) async { // verify current user preference theme and revert to default // if problems are found to prevent app being unusable - if (!(await ThemeService.instance - .verifyInstalled(themeId: Prefs.instance.themeId))) { + if (!(await ThemeService.instance.verifyInstalled( + themeId: Prefs.instance.themeId, + ))) { Prefs.instance.themeId = "light"; } // verify current user preference light brightness theme and revert to default // if problems are found to prevent app being unusable - if (!(await ThemeService.instance - .verifyInstalled(themeId: Prefs.instance.systemBrightnessLightThemeId))) { + if (!(await ThemeService.instance.verifyInstalled( + themeId: Prefs.instance.systemBrightnessLightThemeId, + ))) { Prefs.instance.systemBrightnessLightThemeId = "light"; } // verify current user preference dark brightness theme and revert to default // if problems are found to prevent app being unusable - if (!(await ThemeService.instance - .verifyInstalled(themeId: Prefs.instance.systemBrightnessDarkThemeId))) { + if (!(await ThemeService.instance.verifyInstalled( + themeId: Prefs.instance.systemBrightnessDarkThemeId, + ))) { Prefs.instance.systemBrightnessDarkThemeId = "dark"; } @@ -279,18 +305,14 @@ class MyApp extends StatelessWidget { final localeService = LocaleService(); localeService.loadLocale(); - return const KeyboardDismisser( - child: MaterialAppWithTheme(), - ); + return const KeyboardDismisser(child: MaterialAppWithTheme()); } } // Sidenote: MaterialAppWithTheme and InitView are only separated for clarity. No other reason. class MaterialAppWithTheme extends ConsumerStatefulWidget { - const MaterialAppWithTheme({ - super.key, - }); + const MaterialAppWithTheme({super.key}); @override ConsumerState createState() => @@ -364,7 +386,9 @@ class _MaterialAppWithThemeState extends ConsumerState prefs: ref.read(prefsChangeNotifierProvider), ); ref.read(priceAnd24hChangeNotifierProvider).start(true); - await ref.read(pWallets).load( + await ref + .read(pWallets) + .load( ref.read(prefsChangeNotifierProvider), ref.read(mainDBProvider), ); @@ -394,7 +418,9 @@ class _MaterialAppWithThemeState extends ConsumerState if (ref.read(prefsChangeNotifierProvider).isAutoBackupEnabled) { switch (ref.read(prefsChangeNotifierProvider).backupFrequencyType) { case BackupFrequencyType.everyTenMinutes: - ref.read(autoSWBServiceProvider).startPeriodicBackupTimer( + ref + .read(autoSWBServiceProvider) + .startPeriodicBackupTimer( duration: const Duration(minutes: 10), ); break; @@ -427,9 +453,10 @@ class _MaterialAppWithThemeState extends ConsumerState ref.read(prefsChangeNotifierProvider).systemBrightnessDarkThemeId; break; case Brightness.light: - themeId = ref - .read(prefsChangeNotifierProvider) - .systemBrightnessLightThemeId; + themeId = + ref + .read(prefsChangeNotifierProvider) + .systemBrightnessLightThemeId; break; } } else { @@ -448,9 +475,8 @@ class _MaterialAppWithThemeState extends ConsumerState ref.read(applicationThemesDirectoryPathProvider.notifier).state = StackFileSystem.themesDir!.path; - ref.read(themeProvider.state).state = ref.read(pThemeService).getTheme( - themeId: themeId, - )!; + ref.read(themeProvider.state).state = + ref.read(pThemeService).getTheme(themeId: themeId)!; if (Platform.isAndroid) { // fetch open file if it exists @@ -478,18 +504,17 @@ class _MaterialAppWithThemeState extends ConsumerState ref.read(prefsChangeNotifierProvider).systemBrightnessDarkThemeId; break; case Brightness.light: - themeId = ref - .read(prefsChangeNotifierProvider) - .systemBrightnessLightThemeId; + themeId = + ref + .read(prefsChangeNotifierProvider) + .systemBrightnessLightThemeId; break; } WidgetsBinding.instance.addPostFrameCallback((_) { if (ref.read(prefsChangeNotifierProvider).enableSystemBrightness) { ref.read(themeProvider.state).state = - ref.read(pThemeService).getTheme( - themeId: themeId, - )!; + ref.read(pThemeService).getTheme(themeId: themeId)!; } }); }; @@ -568,8 +593,8 @@ class _MaterialAppWithThemeState extends ConsumerState /// should only be called on android currently Future getOpenFile() async { // update provider with new file content state - ref.read(openedFromSWBFileStringStateProvider.state).state = - await platform.invokeMethod("getOpenFile"); + ref.read(openedFromSWBFileStringStateProvider.state).state = await platform + .invokeMethod("getOpenFile"); // call reset to clear cached value await resetOpenPath(); @@ -586,9 +611,9 @@ class _MaterialAppWithThemeState extends ConsumerState Future goToRestoreSWB(String encrypted) async { if (!ref.read(prefsChangeNotifierProvider).hasPin) { - await Navigator.of(navigatorKey.currentContext!) - .pushNamed(CreatePinView.routeName, arguments: true) - .then((value) { + await Navigator.of( + navigatorKey.currentContext!, + ).pushNamed(CreatePinView.routeName, arguments: true).then((value) { if (value is! bool || value == false) { Navigator.of(navigatorKey.currentContext!).pushNamed( RestoreFromEncryptedStringView.routeName, @@ -602,16 +627,17 @@ class _MaterialAppWithThemeState extends ConsumerState navigatorKey.currentContext!, RouteGenerator.getRoute( shouldUseMaterialRoute: RouteGenerator.useMaterialPageRoute, - builder: (_) => LockscreenView( - showBackButton: true, - routeOnSuccess: RestoreFromEncryptedStringView.routeName, - routeOnSuccessArguments: encrypted, - biometricsCancelButtonString: "CANCEL", - biometricsLocalizedReason: - "Authenticate to restore ${AppConfig.appName} backup", - biometricsAuthenticationTitle: - "Restore ${AppConfig.prefix} backup", - ), + builder: + (_) => LockscreenView( + showBackButton: true, + routeOnSuccess: RestoreFromEncryptedStringView.routeName, + routeOnSuccessArguments: encrypted, + biometricsCancelButtonString: "CANCEL", + biometricsLocalizedReason: + "Authenticate to restore ${AppConfig.appName} backup", + biometricsAuthenticationTitle: + "Restore ${AppConfig.prefix} backup", + ), settings: const RouteSettings(name: "/swbrestorelockscreen"), ), ), @@ -621,10 +647,7 @@ class _MaterialAppWithThemeState extends ConsumerState InputBorder _buildOutlineInputBorder(Color color) { return OutlineInputBorder( - borderSide: BorderSide( - width: 1, - color: color, - ), + borderSide: BorderSide(width: 1, color: color), borderRadius: BorderRadius.circular(Constants.size.circularBorderRadius), ); } @@ -662,9 +685,7 @@ class _MaterialAppWithThemeState extends ConsumerState ), // splashFactory: NoSplash.splashFactory, splashColor: Colors.transparent, - buttonTheme: ButtonThemeData( - splashColor: colorScheme.splash, - ), + buttonTheme: ButtonThemeData(splashColor: colorScheme.splash), textButtonTheme: TextButtonThemeData( style: ButtonStyle( // splashFactory: NoSplash.splashFactory, @@ -672,8 +693,9 @@ class _MaterialAppWithThemeState extends ConsumerState minimumSize: MaterialStateProperty.all(const Size(46, 46)), // textStyle: MaterialStateProperty.all( // STextStyles.button(context)), - foregroundColor: - MaterialStateProperty.all(colorScheme.buttonTextSecondary), + foregroundColor: MaterialStateProperty.all( + colorScheme.buttonTextSecondary, + ), backgroundColor: MaterialStateProperty.all( colorScheme.buttonBackSecondary, ), @@ -690,25 +712,22 @@ class _MaterialAppWithThemeState extends ConsumerState checkboxTheme: CheckboxThemeData( splashRadius: 0, shape: RoundedRectangleBorder( - borderRadius: - BorderRadius.circular(Constants.size.checkboxBorderRadius), + borderRadius: BorderRadius.circular( + Constants.size.checkboxBorderRadius, + ), ), - checkColor: MaterialStateColor.resolveWith( - (state) { - if (state.contains(MaterialState.selected)) { - return colorScheme.checkboxIconChecked; - } + checkColor: MaterialStateColor.resolveWith((state) { + if (state.contains(MaterialState.selected)) { + return colorScheme.checkboxIconChecked; + } + return colorScheme.checkboxBGChecked; + }), + fillColor: MaterialStateColor.resolveWith((states) { + if (states.contains(MaterialState.selected)) { return colorScheme.checkboxBGChecked; - }, - ), - fillColor: MaterialStateColor.resolveWith( - (states) { - if (states.contains(MaterialState.selected)) { - return colorScheme.checkboxBGChecked; - } - return colorScheme.checkboxBorderEmpty; - }, - ), + } + return colorScheme.checkboxBorderEmpty; + }), ), appBarTheme: AppBarTheme( centerTitle: false, @@ -726,91 +745,101 @@ class _MaterialAppWithThemeState extends ConsumerState ), // labelStyle: STextStyles.fieldLabel(context), // hintStyle: STextStyles.fieldLabel(context), - enabledBorder: - _buildOutlineInputBorder(colorScheme.textFieldDefaultBG), - focusedBorder: - _buildOutlineInputBorder(colorScheme.textFieldDefaultBG), + enabledBorder: _buildOutlineInputBorder( + colorScheme.textFieldDefaultBG, + ), + focusedBorder: _buildOutlineInputBorder( + colorScheme.textFieldDefaultBG, + ), errorBorder: _buildOutlineInputBorder(colorScheme.textFieldDefaultBG), - disabledBorder: - _buildOutlineInputBorder(colorScheme.textFieldDefaultBG), - focusedErrorBorder: - _buildOutlineInputBorder(colorScheme.textFieldDefaultBG), + disabledBorder: _buildOutlineInputBorder( + colorScheme.textFieldDefaultBG, + ), + focusedErrorBorder: _buildOutlineInputBorder( + colorScheme.textFieldDefaultBG, + ), ), ), home: CryptoNotifications( - child: Util.isDesktop - ? FutureBuilder( - future: loadShared(), - builder: (context, snapshot) { - if (snapshot.connectionState == ConnectionState.done) { - if (_desktopHasPassword) { - String? startupWalletId; - if (ref - .read(prefsChangeNotifierProvider) - .gotoWalletOnStartup) { - startupWalletId = ref + child: + Util.isDesktop + ? FutureBuilder( + future: loadShared(), + builder: (context, snapshot) { + if (snapshot.connectionState == ConnectionState.done) { + if (_desktopHasPassword) { + String? startupWalletId; + if (ref .read(prefsChangeNotifierProvider) - .startupWalletId; + .gotoWalletOnStartup) { + startupWalletId = + ref + .read(prefsChangeNotifierProvider) + .startupWalletId; + } + + return DesktopLoginView( + startupWalletId: startupWalletId, + load: load, + ); + } else { + return const IntroView(); } - - return DesktopLoginView( - startupWalletId: startupWalletId, - load: load, - ); } else { - return const IntroView(); + return const LoadingView(); } - } else { - return const LoadingView(); - } - }, - ) - : FutureBuilder( - future: load(), - builder: (BuildContext context, AsyncSnapshot snapshot) { - if (snapshot.connectionState == ConnectionState.done) { - // FlutterNativeSplash.remove(); - if (ref.read(pAllWalletsInfo).isNotEmpty || - ref.read(prefsChangeNotifierProvider).hasPin) { - // return HomeView(); - - String? startupWalletId; - if (ref - .read(prefsChangeNotifierProvider) - .gotoWalletOnStartup) { - startupWalletId = ref + }, + ) + : FutureBuilder( + future: load(), + builder: ( + BuildContext context, + AsyncSnapshot snapshot, + ) { + if (snapshot.connectionState == ConnectionState.done) { + // FlutterNativeSplash.remove(); + if (ref.read(pAllWalletsInfo).isNotEmpty || + ref.read(prefsChangeNotifierProvider).hasPin) { + // return HomeView(); + + String? startupWalletId; + if (ref .read(prefsChangeNotifierProvider) - .startupWalletId; - } - - return LockscreenView( - isInitialAppLogin: true, - routeOnSuccess: HomeView.routeName, - routeOnSuccessArguments: startupWalletId, - biometricsAuthenticationTitle: - "Unlock ${AppConfig.prefix}", - biometricsLocalizedReason: - "Unlock your ${AppConfig.appName} using biometrics", - biometricsCancelButtonString: "Cancel", - ); - } else { - if (AppConfig.appName == "Campfire" && - !CampfireMigration.didRun && - CampfireMigration.hasOldWallets) { - return const CampfireMigrateView(); + .gotoWalletOnStartup) { + startupWalletId = + ref + .read(prefsChangeNotifierProvider) + .startupWalletId; + } + + return LockscreenView( + isInitialAppLogin: true, + routeOnSuccess: HomeView.routeName, + routeOnSuccessArguments: startupWalletId, + biometricsAuthenticationTitle: + "Unlock ${AppConfig.prefix}", + biometricsLocalizedReason: + "Unlock your ${AppConfig.appName} using biometrics", + biometricsCancelButtonString: "Cancel", + ); } else { - return const IntroView(); + if (AppConfig.appName == "Campfire" && + !CampfireMigration.didRun && + CampfireMigration.hasOldWallets) { + return const CampfireMigrateView(); + } else { + return const IntroView(); + } } + } else { + // CURRENTLY DISABLED as cannot be animated + // technically not needed as FlutterNativeSplash will overlay + // anything returned here until the future completes but + // FutureBuilder requires you to return something + return const LoadingView(); } - } else { - // CURRENTLY DISABLED as cannot be animated - // technically not needed as FlutterNativeSplash will overlay - // anything returned here until the future completes but - // FutureBuilder requires you to return something - return const LoadingView(); - } - }, - ), + }, + ), ), ); } diff --git a/lib/wallets/wallet/impl/xelis_wallet.dart b/lib/wallets/wallet/impl/xelis_wallet.dart index 0dbeb56df..0bb95e8e8 100644 --- a/lib/wallets/wallet/impl/xelis_wallet.dart +++ b/lib/wallets/wallet/impl/xelis_wallet.dart @@ -2,7 +2,6 @@ import 'dart:async'; import 'dart:convert'; import 'dart:math'; -import 'package:flutter/foundation.dart'; import 'package:isar/isar.dart'; import 'package:mutex/mutex.dart'; import 'package:stack_wallet_backup/generate_password.dart'; @@ -34,7 +33,7 @@ class XelisWallet extends LibXelisWallet { @override Future init({bool? isRestore}) async { - debugPrint("Xelis: init"); + Logging.instance.d("Xelis: init"); if (isRestore == true) { await _restoreWallet(); @@ -57,7 +56,7 @@ class XelisWallet extends LibXelisWallet { Future _createNewWallet() async { final String password = generatePassword(); - debugPrint("Xelis: storing password"); + Logging.instance.d("Xelis: storing password"); await secureStorageInterface.write( key: Wallet.mnemonicPassphraseKey(walletId: info.walletId), value: password, @@ -626,9 +625,13 @@ class XelisWallet extends LibXelisWallet { assetHash: asset, extraData: null, ); - } catch (e) { + } catch (e, s) { // Handle formatCoin error - use default conversion - debugPrint("formatCoin failed: $e, using fallback conversion"); + Logging.instance.d( + "formatCoin failed, using fallback conversion", + error: e, + stackTrace: s, + ); final rawAmount = recipient.amount.raw; final floatAmount = rawAmount / BigInt.from(10).pow(defaultDecimals); diff --git a/macos/Podfile.lock b/macos/Podfile.lock index 38e7c6e0c..c1dcbc7c9 100644 --- a/macos/Podfile.lock +++ b/macos/Podfile.lock @@ -1,194 +1,33 @@ PODS: - - camera_macos (0.0.1): - - FlutterMacOS - - coinlib_flutter (0.5.0): - - Flutter - - FlutterMacOS - - connectivity_plus (0.0.1): - - FlutterMacOS - - ReachabilitySwift - - cs_monero_flutter_libs_macos (0.0.1): - - FlutterMacOS - - desktop_drop (0.0.1): - - FlutterMacOS - - device_info_plus (0.0.1): - - FlutterMacOS - - devicelocale (0.0.1): - - FlutterMacOS - - file_picker (0.0.1): - - FlutterMacOS - flutter_libepiccash (0.0.1): - FlutterMacOS - - flutter_libsparkmobile (0.0.1): - - FlutterMacOS - - flutter_local_notifications (0.0.1): - - FlutterMacOS - - flutter_secure_storage_macos (6.1.1): - - FlutterMacOS - FlutterMacOS (1.0.0) - frostdart (0.0.1): - FlutterMacOS - - isar_flutter_libs (1.0.0): - - FlutterMacOS - lelantus (0.0.1): - FlutterMacOS - - local_auth_darwin (0.0.1): - - Flutter - - FlutterMacOS - - package_info_plus (0.0.1): - - FlutterMacOS - - path_provider_foundation (0.0.1): - - Flutter - - FlutterMacOS - - ReachabilitySwift (5.0.0) - - share_plus (0.0.1): - - FlutterMacOS - - "sqlite3 (3.46.0+1)": - - "sqlite3/common (= 3.46.0+1)" - - "sqlite3/common (3.46.0+1)" - - "sqlite3/fts5 (3.46.0+1)": - - sqlite3/common - - "sqlite3/perf-threadsafe (3.46.0+1)": - - sqlite3/common - - "sqlite3/rtree (3.46.0+1)": - - sqlite3/common - - sqlite3_flutter_libs (0.0.1): - - FlutterMacOS - - sqlite3 (~> 3.46.0) - - sqlite3/fts5 - - sqlite3/perf-threadsafe - - sqlite3/rtree - - stack_wallet_backup (0.0.1): - - FlutterMacOS - - tor_ffi_plugin (0.0.1) - - url_launcher_macos (0.0.1): - - FlutterMacOS - - wakelock_plus (0.0.1): - - FlutterMacOS - - window_size (0.0.2): - - FlutterMacOS - - xelis_flutter (0.0.1): - - FlutterMacOS DEPENDENCIES: - - camera_macos (from `Flutter/ephemeral/.symlinks/plugins/camera_macos/macos`) - - coinlib_flutter (from `Flutter/ephemeral/.symlinks/plugins/coinlib_flutter/darwin`) - - connectivity_plus (from `Flutter/ephemeral/.symlinks/plugins/connectivity_plus/macos`) - - cs_monero_flutter_libs_macos (from `Flutter/ephemeral/.symlinks/plugins/cs_monero_flutter_libs_macos/macos`) - - desktop_drop (from `Flutter/ephemeral/.symlinks/plugins/desktop_drop/macos`) - - device_info_plus (from `Flutter/ephemeral/.symlinks/plugins/device_info_plus/macos`) - - devicelocale (from `Flutter/ephemeral/.symlinks/plugins/devicelocale/macos`) - - file_picker (from `Flutter/ephemeral/.symlinks/plugins/file_picker/macos`) - flutter_libepiccash (from `Flutter/ephemeral/.symlinks/plugins/flutter_libepiccash/macos`) - - flutter_libsparkmobile (from `Flutter/ephemeral/.symlinks/plugins/flutter_libsparkmobile/macos`) - - flutter_local_notifications (from `Flutter/ephemeral/.symlinks/plugins/flutter_local_notifications/macos`) - - flutter_secure_storage_macos (from `Flutter/ephemeral/.symlinks/plugins/flutter_secure_storage_macos/macos`) - FlutterMacOS (from `Flutter/ephemeral`) - frostdart (from `Flutter/ephemeral/.symlinks/plugins/frostdart/macos`) - - isar_flutter_libs (from `Flutter/ephemeral/.symlinks/plugins/isar_flutter_libs/macos`) - lelantus (from `Flutter/ephemeral/.symlinks/plugins/lelantus/macos`) - - local_auth_darwin (from `Flutter/ephemeral/.symlinks/plugins/local_auth_darwin/darwin`) - - package_info_plus (from `Flutter/ephemeral/.symlinks/plugins/package_info_plus/macos`) - - path_provider_foundation (from `Flutter/ephemeral/.symlinks/plugins/path_provider_foundation/darwin`) - - share_plus (from `Flutter/ephemeral/.symlinks/plugins/share_plus/macos`) - - sqlite3_flutter_libs (from `Flutter/ephemeral/.symlinks/plugins/sqlite3_flutter_libs/macos`) - - stack_wallet_backup (from `Flutter/ephemeral/.symlinks/plugins/stack_wallet_backup/macos`) - - tor_ffi_plugin (from `Flutter/ephemeral/.symlinks/plugins/tor_ffi_plugin/macos`) - - url_launcher_macos (from `Flutter/ephemeral/.symlinks/plugins/url_launcher_macos/macos`) - - wakelock_plus (from `Flutter/ephemeral/.symlinks/plugins/wakelock_plus/macos`) - - window_size (from `Flutter/ephemeral/.symlinks/plugins/window_size/macos`) - - xelis_flutter (from `Flutter/ephemeral/.symlinks/plugins/xelis_flutter/macos`) - -SPEC REPOS: - trunk: - - ReachabilitySwift - - sqlite3 EXTERNAL SOURCES: - camera_macos: - :path: Flutter/ephemeral/.symlinks/plugins/camera_macos/macos - coinlib_flutter: - :path: Flutter/ephemeral/.symlinks/plugins/coinlib_flutter/darwin - connectivity_plus: - :path: Flutter/ephemeral/.symlinks/plugins/connectivity_plus/macos - cs_monero_flutter_libs_macos: - :path: Flutter/ephemeral/.symlinks/plugins/cs_monero_flutter_libs_macos/macos - desktop_drop: - :path: Flutter/ephemeral/.symlinks/plugins/desktop_drop/macos - device_info_plus: - :path: Flutter/ephemeral/.symlinks/plugins/device_info_plus/macos - devicelocale: - :path: Flutter/ephemeral/.symlinks/plugins/devicelocale/macos - file_picker: - :path: Flutter/ephemeral/.symlinks/plugins/file_picker/macos flutter_libepiccash: :path: Flutter/ephemeral/.symlinks/plugins/flutter_libepiccash/macos - flutter_libsparkmobile: - :path: Flutter/ephemeral/.symlinks/plugins/flutter_libsparkmobile/macos - flutter_local_notifications: - :path: Flutter/ephemeral/.symlinks/plugins/flutter_local_notifications/macos - flutter_secure_storage_macos: - :path: Flutter/ephemeral/.symlinks/plugins/flutter_secure_storage_macos/macos FlutterMacOS: :path: Flutter/ephemeral frostdart: :path: Flutter/ephemeral/.symlinks/plugins/frostdart/macos - isar_flutter_libs: - :path: Flutter/ephemeral/.symlinks/plugins/isar_flutter_libs/macos lelantus: :path: Flutter/ephemeral/.symlinks/plugins/lelantus/macos - local_auth_darwin: - :path: Flutter/ephemeral/.symlinks/plugins/local_auth_darwin/darwin - package_info_plus: - :path: Flutter/ephemeral/.symlinks/plugins/package_info_plus/macos - path_provider_foundation: - :path: Flutter/ephemeral/.symlinks/plugins/path_provider_foundation/darwin - share_plus: - :path: Flutter/ephemeral/.symlinks/plugins/share_plus/macos - sqlite3_flutter_libs: - :path: Flutter/ephemeral/.symlinks/plugins/sqlite3_flutter_libs/macos - stack_wallet_backup: - :path: Flutter/ephemeral/.symlinks/plugins/stack_wallet_backup/macos - tor_ffi_plugin: - :path: Flutter/ephemeral/.symlinks/plugins/tor_ffi_plugin/macos - url_launcher_macos: - :path: Flutter/ephemeral/.symlinks/plugins/url_launcher_macos/macos - wakelock_plus: - :path: Flutter/ephemeral/.symlinks/plugins/wakelock_plus/macos - window_size: - :path: Flutter/ephemeral/.symlinks/plugins/window_size/macos - xelis_flutter: - :path: Flutter/ephemeral/.symlinks/plugins/xelis_flutter/macos SPEC CHECKSUMS: - camera_macos: c2603f5eed16f05076cf17e12030d2ce55a77839 - coinlib_flutter: 9275e8255ef67d3da33beb6e117d09ced4f46eb5 - connectivity_plus: 18d3c32514c886e046de60e9c13895109866c747 - cs_monero_flutter_libs_macos: b901f94d39d1338f706312b026aba928d23582d4 - desktop_drop: 69eeff437544aa619c8db7f4481b3a65f7696898 - device_info_plus: ce1b7762849d3ec103d0e0517299f2db7ad60720 - devicelocale: 9f0f36ac651cabae2c33f32dcff4f32b61c38225 - file_picker: e716a70a9fe5fd9e09ebc922d7541464289443af flutter_libepiccash: be1560a04150c5cc85bcf08d236ec2b3d1f5d8da - flutter_libsparkmobile: df2d36af1691379c81249e7be7b68be3c81d388b - flutter_local_notifications: 4b427ffabf278fc6ea9484c97505e231166927a5 - flutter_secure_storage_macos: 59459653abe1adb92abbc8ea747d79f8d19866c9 FlutterMacOS: 8f6f14fa908a6fb3fba0cd85dbd81ec4b251fb24 frostdart: e6bf3119527ccfbcec1b8767da6ede5bb4c4f716 - isar_flutter_libs: 43385c99864c168fadba7c9adeddc5d38838ca6a lelantus: 308e42c5a648598936a07a234471dd8cf8e687a0 - local_auth_darwin: 66e40372f1c29f383a314c738c7446e2f7fdadc3 - package_info_plus: f5790acc797bf17c3e959e9d6cf162cc68ff7523 - path_provider_foundation: 2b6b4c569c0fb62ec74538f866245ac84301af46 - ReachabilitySwift: 985039c6f7b23a1da463388634119492ff86c825 - share_plus: 3c787998077d6b31e839225a282e9e27edf99274 - sqlite3: 292c3e1bfe89f64e51ea7fc7dab9182a017c8630 - sqlite3_flutter_libs: 1be4459672f8168ded2d8667599b8e3ca5e72b83 - stack_wallet_backup: 6ebc60b1bdcf11cf1f1cbad9aa78332e1e15778c - tor_ffi_plugin: 2566c1ed174688cca560fa0c64b7a799c66f07cb - url_launcher_macos: c82c93949963e55b228a30115bd219499a6fe404 - wakelock_plus: 4783562c9a43d209c458cb9b30692134af456269 - window_size: 339dafa0b27a95a62a843042038fa6c3c48de195 PODFILE CHECKSUM: 236401fc2c932af29a9fcf0e97baeeb2d750d367 From 8e703f128c61a2d1fd4c57b4349b9f39365919ca Mon Sep 17 00:00:00 2001 From: Julian Date: Mon, 17 Mar 2025 14:28:38 -0600 Subject: [PATCH 141/193] temp libspark fix --- macos/Podfile.lock | 162 ++++++++++++++++++ pubspec.lock | 4 +- scripts/app_config/templates/pubspec.template | 2 +- 3 files changed, 165 insertions(+), 3 deletions(-) diff --git a/macos/Podfile.lock b/macos/Podfile.lock index c1dcbc7c9..a51d63f71 100644 --- a/macos/Podfile.lock +++ b/macos/Podfile.lock @@ -1,33 +1,195 @@ PODS: + - camera_macos (0.0.1): + - FlutterMacOS + - coinlib_flutter (0.5.0): + - Flutter + - FlutterMacOS + - connectivity_plus (0.0.1): + - FlutterMacOS + - ReachabilitySwift + - cs_monero_flutter_libs_macos (0.0.1): + - FlutterMacOS + - desktop_drop (0.0.1): + - FlutterMacOS + - device_info_plus (0.0.1): + - FlutterMacOS + - devicelocale (0.0.1): + - FlutterMacOS + - file_picker (0.0.1): + - FlutterMacOS - flutter_libepiccash (0.0.1): - FlutterMacOS + - flutter_libsparkmobile (0.0.1): + - FlutterMacOS + - flutter_local_notifications (0.0.1): + - FlutterMacOS + - flutter_secure_storage_macos (6.1.1): + - FlutterMacOS - FlutterMacOS (1.0.0) - frostdart (0.0.1): - FlutterMacOS + - isar_flutter_libs (1.0.0): + - FlutterMacOS - lelantus (0.0.1): - FlutterMacOS + - local_auth_darwin (0.0.1): + - Flutter + - FlutterMacOS + - package_info_plus (0.0.1): + - FlutterMacOS + - path_provider_foundation (0.0.1): + - Flutter + - FlutterMacOS + - ReachabilitySwift (5.2.3) + - share_plus (0.0.1): + - FlutterMacOS + - "sqlite3 (3.46.0+1)": + - "sqlite3/common (= 3.46.0+1)" + - "sqlite3/common (3.46.0+1)" + - "sqlite3/fts5 (3.46.0+1)": + - sqlite3/common + - "sqlite3/perf-threadsafe (3.46.0+1)": + - sqlite3/common + - "sqlite3/rtree (3.46.0+1)": + - sqlite3/common + - sqlite3_flutter_libs (0.0.1): + - FlutterMacOS + - sqlite3 (~> 3.46.0) + - sqlite3/fts5 + - sqlite3/perf-threadsafe + - sqlite3/rtree + - stack_wallet_backup (0.0.1): + - FlutterMacOS + - tor_ffi_plugin (0.0.1) + - url_launcher_macos (0.0.1): + - FlutterMacOS + - wakelock_plus (0.0.1): + - FlutterMacOS + - window_size (0.0.2): + - FlutterMacOS + - xelis_flutter (0.0.1): + - FlutterMacOS DEPENDENCIES: + - camera_macos (from `Flutter/ephemeral/.symlinks/plugins/camera_macos/macos`) + - coinlib_flutter (from `Flutter/ephemeral/.symlinks/plugins/coinlib_flutter/darwin`) + - connectivity_plus (from `Flutter/ephemeral/.symlinks/plugins/connectivity_plus/macos`) + - cs_monero_flutter_libs_macos (from `Flutter/ephemeral/.symlinks/plugins/cs_monero_flutter_libs_macos/macos`) + - desktop_drop (from `Flutter/ephemeral/.symlinks/plugins/desktop_drop/macos`) + - device_info_plus (from `Flutter/ephemeral/.symlinks/plugins/device_info_plus/macos`) + - devicelocale (from `Flutter/ephemeral/.symlinks/plugins/devicelocale/macos`) + - file_picker (from `Flutter/ephemeral/.symlinks/plugins/file_picker/macos`) - flutter_libepiccash (from `Flutter/ephemeral/.symlinks/plugins/flutter_libepiccash/macos`) + - flutter_libsparkmobile (from `Flutter/ephemeral/.symlinks/plugins/flutter_libsparkmobile/macos`) + - flutter_local_notifications (from `Flutter/ephemeral/.symlinks/plugins/flutter_local_notifications/macos`) + - flutter_secure_storage_macos (from `Flutter/ephemeral/.symlinks/plugins/flutter_secure_storage_macos/macos`) - FlutterMacOS (from `Flutter/ephemeral`) - frostdart (from `Flutter/ephemeral/.symlinks/plugins/frostdart/macos`) + - isar_flutter_libs (from `Flutter/ephemeral/.symlinks/plugins/isar_flutter_libs/macos`) - lelantus (from `Flutter/ephemeral/.symlinks/plugins/lelantus/macos`) + - local_auth_darwin (from `Flutter/ephemeral/.symlinks/plugins/local_auth_darwin/darwin`) + - package_info_plus (from `Flutter/ephemeral/.symlinks/plugins/package_info_plus/macos`) + - path_provider_foundation (from `Flutter/ephemeral/.symlinks/plugins/path_provider_foundation/darwin`) + - share_plus (from `Flutter/ephemeral/.symlinks/plugins/share_plus/macos`) + - sqlite3_flutter_libs (from `Flutter/ephemeral/.symlinks/plugins/sqlite3_flutter_libs/macos`) + - stack_wallet_backup (from `Flutter/ephemeral/.symlinks/plugins/stack_wallet_backup/macos`) + - tor_ffi_plugin (from `Flutter/ephemeral/.symlinks/plugins/tor_ffi_plugin/macos`) + - url_launcher_macos (from `Flutter/ephemeral/.symlinks/plugins/url_launcher_macos/macos`) + - wakelock_plus (from `Flutter/ephemeral/.symlinks/plugins/wakelock_plus/macos`) + - window_size (from `Flutter/ephemeral/.symlinks/plugins/window_size/macos`) + - xelis_flutter (from `Flutter/ephemeral/.symlinks/plugins/xelis_flutter/macos`) + +SPEC REPOS: + trunk: + - ReachabilitySwift + - sqlite3 EXTERNAL SOURCES: + camera_macos: + :path: Flutter/ephemeral/.symlinks/plugins/camera_macos/macos + coinlib_flutter: + :path: Flutter/ephemeral/.symlinks/plugins/coinlib_flutter/darwin + connectivity_plus: + :path: Flutter/ephemeral/.symlinks/plugins/connectivity_plus/macos + cs_monero_flutter_libs_macos: + :path: Flutter/ephemeral/.symlinks/plugins/cs_monero_flutter_libs_macos/macos + desktop_drop: + :path: Flutter/ephemeral/.symlinks/plugins/desktop_drop/macos + device_info_plus: + :path: Flutter/ephemeral/.symlinks/plugins/device_info_plus/macos + devicelocale: + :path: Flutter/ephemeral/.symlinks/plugins/devicelocale/macos + file_picker: + :path: Flutter/ephemeral/.symlinks/plugins/file_picker/macos flutter_libepiccash: :path: Flutter/ephemeral/.symlinks/plugins/flutter_libepiccash/macos + flutter_libsparkmobile: + :path: Flutter/ephemeral/.symlinks/plugins/flutter_libsparkmobile/macos + flutter_local_notifications: + :path: Flutter/ephemeral/.symlinks/plugins/flutter_local_notifications/macos + flutter_secure_storage_macos: + :path: Flutter/ephemeral/.symlinks/plugins/flutter_secure_storage_macos/macos FlutterMacOS: :path: Flutter/ephemeral frostdart: :path: Flutter/ephemeral/.symlinks/plugins/frostdart/macos + isar_flutter_libs: + :path: Flutter/ephemeral/.symlinks/plugins/isar_flutter_libs/macos lelantus: :path: Flutter/ephemeral/.symlinks/plugins/lelantus/macos + local_auth_darwin: + :path: Flutter/ephemeral/.symlinks/plugins/local_auth_darwin/darwin + package_info_plus: + :path: Flutter/ephemeral/.symlinks/plugins/package_info_plus/macos + path_provider_foundation: + :path: Flutter/ephemeral/.symlinks/plugins/path_provider_foundation/darwin + share_plus: + :path: Flutter/ephemeral/.symlinks/plugins/share_plus/macos + sqlite3_flutter_libs: + :path: Flutter/ephemeral/.symlinks/plugins/sqlite3_flutter_libs/macos + stack_wallet_backup: + :path: Flutter/ephemeral/.symlinks/plugins/stack_wallet_backup/macos + tor_ffi_plugin: + :path: Flutter/ephemeral/.symlinks/plugins/tor_ffi_plugin/macos + url_launcher_macos: + :path: Flutter/ephemeral/.symlinks/plugins/url_launcher_macos/macos + wakelock_plus: + :path: Flutter/ephemeral/.symlinks/plugins/wakelock_plus/macos + window_size: + :path: Flutter/ephemeral/.symlinks/plugins/window_size/macos + xelis_flutter: + :path: Flutter/ephemeral/.symlinks/plugins/xelis_flutter/macos SPEC CHECKSUMS: + camera_macos: c2603f5eed16f05076cf17e12030d2ce55a77839 + coinlib_flutter: 9275e8255ef67d3da33beb6e117d09ced4f46eb5 + connectivity_plus: 18d3c32514c886e046de60e9c13895109866c747 + cs_monero_flutter_libs_macos: b901f94d39d1338f706312b026aba928d23582d4 + desktop_drop: 69eeff437544aa619c8db7f4481b3a65f7696898 + device_info_plus: ce1b7762849d3ec103d0e0517299f2db7ad60720 + devicelocale: 9f0f36ac651cabae2c33f32dcff4f32b61c38225 + file_picker: e716a70a9fe5fd9e09ebc922d7541464289443af flutter_libepiccash: be1560a04150c5cc85bcf08d236ec2b3d1f5d8da + flutter_libsparkmobile: df2d36af1691379c81249e7be7b68be3c81d388b + flutter_local_notifications: 4b427ffabf278fc6ea9484c97505e231166927a5 + flutter_secure_storage_macos: 59459653abe1adb92abbc8ea747d79f8d19866c9 FlutterMacOS: 8f6f14fa908a6fb3fba0cd85dbd81ec4b251fb24 frostdart: e6bf3119527ccfbcec1b8767da6ede5bb4c4f716 + isar_flutter_libs: 43385c99864c168fadba7c9adeddc5d38838ca6a lelantus: 308e42c5a648598936a07a234471dd8cf8e687a0 + local_auth_darwin: 66e40372f1c29f383a314c738c7446e2f7fdadc3 + package_info_plus: 12f1c5c2cfe8727ca46cbd0b26677728972d9a5b + path_provider_foundation: 2b6b4c569c0fb62ec74538f866245ac84301af46 + ReachabilitySwift: 7f151ff156cea1481a8411701195ac6a984f4979 + share_plus: 76dd39142738f7a68dd57b05093b5e8193f220f7 + sqlite3: 292c3e1bfe89f64e51ea7fc7dab9182a017c8630 + sqlite3_flutter_libs: 1be4459672f8168ded2d8667599b8e3ca5e72b83 + stack_wallet_backup: 6ebc60b1bdcf11cf1f1cbad9aa78332e1e15778c + tor_ffi_plugin: 2566c1ed174688cca560fa0c64b7a799c66f07cb + url_launcher_macos: c82c93949963e55b228a30115bd219499a6fe404 + wakelock_plus: 4783562c9a43d209c458cb9b30692134af456269 + window_size: 339dafa0b27a95a62a843042038fa6c3c48de195 + xelis_flutter: 34e05f3621e46381fb1b10d7c11f63764d3f7a80 PODFILE CHECKSUM: 236401fc2c932af29a9fcf0e97baeeb2d750d367 diff --git a/pubspec.lock b/pubspec.lock index 95c5d28ab..5df33ec99 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -832,8 +832,8 @@ packages: dependency: "direct main" description: path: "." - ref: "28d0f6c8db56a7d14d6495e810b8705a5c438929" - resolved-ref: "28d0f6c8db56a7d14d6495e810b8705a5c438929" + ref: ca0c72cecc40fc0bfbafc0d26af675d973ab516b + resolved-ref: ca0c72cecc40fc0bfbafc0d26af675d973ab516b url: "https://github.com/cypherstack/flutter_libsparkmobile.git" source: git version: "0.0.2" diff --git a/scripts/app_config/templates/pubspec.template b/scripts/app_config/templates/pubspec.template index 965529cec..62b1947ca 100644 --- a/scripts/app_config/templates/pubspec.template +++ b/scripts/app_config/templates/pubspec.template @@ -38,7 +38,7 @@ dependencies: flutter_libsparkmobile: git: url: https://github.com/cypherstack/flutter_libsparkmobile.git - ref: 28d0f6c8db56a7d14d6495e810b8705a5c438929 + ref: ca0c72cecc40fc0bfbafc0d26af675d973ab516b # cs_monero compat (unpublished) compat: From 441bc8c1138ba6115490efe499781fb0c880001b Mon Sep 17 00:00:00 2001 From: sneurlax Date: Mon, 17 Mar 2025 17:00:45 -0500 Subject: [PATCH 142/193] feat: update flutter_libepiccash TODO: merge https://github.com/cypherstack/flutter_libepiccash/pull/56 "Reorganize codebase, add tests, and fix example app" to main --- crypto_plugins/flutter_libepiccash | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/crypto_plugins/flutter_libepiccash b/crypto_plugins/flutter_libepiccash index 0bb1b1ced..3644a34a0 160000 --- a/crypto_plugins/flutter_libepiccash +++ b/crypto_plugins/flutter_libepiccash @@ -1 +1 @@ -Subproject commit 0bb1b1ced6e0d3c66e383698f89825754c692986 +Subproject commit 3644a34a0a65759b4d70b5be931a34e8b5fdc430 From 564c3ba715af93a23469fb859013896aefa9db42 Mon Sep 17 00:00:00 2001 From: Julian Date: Mon, 17 Mar 2025 17:14:05 -0600 Subject: [PATCH 143/193] update default themes --- .../default_themes/stack_wallet/dark.zip | Bin 1060905 -> 1157605 bytes .../default_themes/stack_wallet/light.zip | Bin 1008797 -> 1103991 bytes lib/themes/theme_service.dart | 63 ++++++++++-------- 3 files changed, 35 insertions(+), 28 deletions(-) diff --git a/asset_sources/default_themes/stack_wallet/dark.zip b/asset_sources/default_themes/stack_wallet/dark.zip index df24199c441499af9ae2d0c80a9d539e9378a1b3..a859175051f203b4e828eb032ad2472f0171b8a7 100644 GIT binary patch delta 106643 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%0DGpr^y8U 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 diff --git a/asset_sources/default_themes/stack_wallet/light.zip b/asset_sources/default_themes/stack_wallet/light.zip index 9e0c82d9d0b784a00d77b720d5c8f2fc09c6a17f..b26156da8966f20dea566c649dae947ac69f81ed 100644 GIT binary patch delta 104954 zcmaf)bxa*yyXf&!yjYP96ew=Rio3hJySwWE#br~9dvSN!IHg$e;_mK6HZHgCIXAhv zIp3Qz$y)Qr`ei*nnP*KVdr086Rt!y94jus)=AY|9F9D63OtxUb%EKEK1{MJd3j_0C zOaC9DLYPV=jrs0>=ji_(L54y8D=qPbm=o_GasNYPgEUAB4puLbfKT{e00+K2Sfu|} zIuX8@^M4iPfy(hOJ9VL||08OQi}zmu5clIhfGYyqzW}WW2e5wuJ7Ix;0Xl_~{{gDl zMg9eV=NN+j3%C>go06SG!vE}$kHq~iJDekhA^ZjS3kClLh%a=6Mf$&fFJ}?`7Yg=M z#XpMR3jCX3REzkr(P z=l={O=7_HTUFR3#`OiiqMhk7g>Lq0Si!bZ8#o-Y|JzaDYb&6T&o}w45{u%!x1z}+R zU)DQ>y6C3LBxA7B)cm!%_V4)T{vV6vzdf8f*?{yf9)!>|B0b5&>ZPJNqy9^BLrk1e zjf&pkX*ucqS6%*{e&WEwFsDx9p^*R%HV&rt7GD1~n>pDyGP`+NX{e*aypavy`Y$v7 zgDIz-ay1Tv9z}~aMs+Ei@PL9kY*=MDA5vmI6@`t;2b+lE)a^t^uGjN$X@SLAroCsTU3WQ> zq7k##Y3%demEFr${CYq_%1YoxgVM{f;G^d7{iidtQ%vZJEFYP!4a7IUWzfO!!Yn?* z^U-;{_0;p?&(rS-W{7K*2T(!T<;rlJL8jRm=lxx+VuWlSkLCJaeXRi?(DF$--#t3+ zKfZXrB&TPpn8mDEmtEh#U-a9*yl&GNY`dkAY-ifD48 zdGLmoviN%FowlW}JvgLzL#At%i;X7lN=)vLy`*ZA3Z$ z%8vhKlcrT{7iiRT^kYosj3FY_R$W%iljM%P^ux6D=P7n_aC z+N?d3Uj_10Sy2l5CmPmhaLClAl+fnRxb|N9WYZXs99DH>MGr3~0swBm6##oy>NP)y z==h+#&eUvm=D@n*s&@^dx!qGwkgC0OB{&}aGT`0+2LK`;{9=1;W*Mwm=3UaGph8wKf0Cz=FvX7@=QyqAc-S$E%G#~1;A z&ts`ZPr$>KQg>jAea-ENHtRg&BEfcrf2`}t`#ICfV2_uWkvjMNNFD>}}8 z*DuHKOzdC6^-<=eYQg1#M_ioHZ}81|nCwVaA^=s@P7@dwAd30qvs!jekbKEkaA_)I zAoMzNuCFTe+_^956~G}-Kg>yE7haFi}6~nd;dYN7Dr*40+ zi60b7(G}A_E19r+ye+9o_T^5^8HxRwu4EKngf$D6aykp+RNYr|${it%8@%GtB_o3h zNWNZl4q98e<-|Cin*AwYSF;MCVK=vy0ESfpKq{=r$F}v}9+^IxEPW%x!?Q-txlLe&P zj(GNbO>#HX9+?n}fXZCvQQJ&>B8>6v=(|DZxULE98&GC&fauf=cg3J3;bdulFxgnt zqUpPVN{REWtQTdTUNg+Bv>HO7cBhXV-!*05k@ELkBqwNH@HvBPXPh~x2y=dKdopr% zK7i6j^NIBG4khTFoh=i>W)xw|LX3+f64C)Hy;e{aH~f};TmuJ@-w{gRJF5Wyl0icT zR(2}-oyy}S#3UZL?PshYkG@Bjy=H4AK3+2(HPMY`y_imKgv+*5b}xwwW0hg2Ksh>kWxCQM*D& zNxzn@yX(M}z|JKaj0)EqAC4SFOiN}M3FOGGFzIvS9?vZw!7o3+t-KA^wOi|sPL?lx zdFy<~WdXOo<*<-yd{kcm&M04_&Q$S7;s9Y&jBXRP6#FMyqIc3>0~29{(S!mWUDsE$ zrV>qe0WPM4m+&rzqK&Y#ocML83ki6mT3?~5wHmWu&%WA-IBNk6z9o)^WM8BoE=eY^Dz_@vYg(cWw7q1(D0 zMw^X~6%mOh@6^UjJQ88W{=gV7Y&RLbfaId8u4&gyA$V2SbVt&GgG%mfVfWpKh`56B zWf_hDeuqAZ>a)p75<$7PCV9G>lfE0RIOnC-Y8K(!SgyuR>Imqk~TPq${a zVz6dw^t;Gga2&t6XRjgX+PkidAdS&5{#NzO9Xv$pMng|vv13w#Ngm6$9{Kal3oEs! zk-s164-K&HgCgM^{*OX*0pRfVD_7QvKq!fyowZZ{F=(+a3#p>6?T{5WsYgHsrOKQVZetI zEmlmr&t#UTk$>-JKu=G4NSfXNfAhrb%ILHpg->X@2!}{R+NRmN84fD@_h5n;D0e+W zGR2Hl)EM5IH~by21)^+dpR;ZGelUFO2UQ9&%@EVb0R`{St$*x+CXT5H5J286OQe=a%0)J zjEgQw0UR`7#vY8?TVVq9&T}ZUIDQDvUR~+E#6*KYLS;bYQ+LkIeiO&O$Me%eR}%*? zp}Vz$n5GdbHAzL(A(jHW5yez$_S)Hx_CCuGY*>p5=}PNV~V7rp%SkCp`b61b?j9!=RD;=mTvB= zPh2~VKGlFenWq$hNVfK?CiGeLuW^!rcrq)l{_W}5m*~UI-(T))4%Z0>c_89Th}tn< z;AfL;*LhL*zZtW9cL7@tOI6Lgi?{lg4dxflK8^1si5Ed(mAM-Tv+Y))t@*Cc#$SuS z`>)TY}`bcclUC%BegDHd0vj zplP`8>*h;&e>0Q_JY-Oy@4G0OE`P7gt|Q}Mi)+}au9s8{nwn@}5k0Ycp&2$=a}wq} zibov%HB0FUTG@qfZ~Oko^9VegW3Sg#eAPP`2UKZPXE0Zzv^!tiK{L3J7e z+R{|I1zR%|5-imnjwnS1&4S!{hN*nb>b>j-2AC92MBT3H z+W<7J)BAS85`YSyGEBdiM|Vr)DD|lOsS~~NJA@_|vYLKYcDvl}mq}Z`0`%b&-dn3J6EE26{n8S=Bo5$-#^po$b%vR& zQ@b^-#WUE^=cUx}S05FFyNc3pFB|Gld^G7lrs^Ox830?X-5X>vfc!aahEC&LM6%Hl zoE9BtLR^(j`Wc+Z$OJ9DNwAX;mlpdz=&(zNwT&6Of35k!jsK)t8oiJQw!rS()~ad7Vp^^lYxn! z2jpZi(mU|S^{aUf8dx&gUKw+Q44DGst(QK{H8Lf_0Z9;TD;#fF47)HUJHDQ&#DtzZ zKp?IuJ+AeehN2qET-!B^%uui)+@(PTaZUWpM5Jrw8`3qyA0ug~So9=a9uGfDhoZuE zxbSP*xgF&ku)av2TZ)=j4W{S73a>cGR`-DG=ePD^Xzs_X0pgx}(?7TG~ zqWyaRMd0m|@dqJhIXzby&ilS<;q>{>_rSMmWV4(#z}T?x?F8A7ipiRzEsdT-;QJD4 zApG3L~AhU{+Q=#(Pp+)t(`U87E<|xMb4FFdEB0pa5;IT3B+u`+P4uEF9 zM=yMyrr5GLnZ2}jleW9qk%g0i_}|Kj|Ti<(Lb(XzI!?wqY2k)kpj-v zHhVVVod(f_-Yc^>H=0-cy?b&YSc(VxE&)N5#VM>dXQGx=j5%B12N@DP2e(xzi9F== zSZ(u9J`(g|7u@XZ^;#1(k^0%ajR%OJF+s6!7!8-yT9gST$s7VQ3X(aP8=N@s`Yk>p zCuu?BP3sprO+qtuWG2BG-0#iM5DXZs^bHTt=KtI_vKcDOKeD%vUhLxk$QR$H4x?Ys zp2LR4+jrKvBXP=q39%+8PYgw=83ZIs3S1S4=T1#1Xgp|s&GRc&SYmV{F##Nk1DO*a z8_jhFMzgbsnB^gm1~1!1(3)z}{%hxZ+Z3xFd*io=Md^(;$?@(&LdX)iYwNj8*vL;x)r3pITUt4KI3paj4&=EsETq1@G=KGWU zyX_ftVe`I%q3KYq+@F1ewHufa1AK*@y0iMZt*?Ap!ycKrc1aPNjgs^gED)~5>ob4w zH1>fbNg@HKg|Rl$r)~XW_>nJPZWCenUqHLn^$Eu*HTdJ=gMje$)G_9UonIgK#^3#uvAvBHB0RIl5_=m}o0? zjBtyn6gd%;*7rQzjwZfd)!>`*}zN3EaLwyDb-Doh>)6fS9%?Iv5?%b96CaYMaI#2Y3Vt<2~{DI14{CL{n{Vi~SDX!lXNQ0l{h`?KNcV(QYrymwsfsVI9O9k<;^!m6nw zEvb4hEL_)O^ZAW1*kP-g2GQuA>J7*&Dw$SGCC%@6&!P4X~b z5GFRMQ4X;8P&*IHiH&8KV8U-xog>jeX1jkj7V)~xMmjHUFN4xJM{&?Dgea^&OPxq$ zZ4~M)wDIQ}W#COYabU{XK;*m!@q=*(lYj>m_s)bdx1R^jS>hk<80-eepUblfznkpa zbb<%U@BF67Ix;G5H(5+SCg=X@@JQb-c)*KjXFLXiB3;wkN582&o4N#UX^)8gcoaRF zz6^he^G=0VQ>LQcQjnu=D$xN+9+b3K9)J49Fw)QZHiW5ToPu&xBF0&fI6-w4=|f6Y zLkdlQBaC@+B}_HhB9@$Obij2@hOAS=<{JWL-5;oCa$I+~X-sp-aN!bNiw$oLEt=&h zxpq~6Rmit~GfJnCTsuxKfZOwggFudc>wwkKiTdc7MW5D3H8M;w67vnn(}*NI}MgPl_nok z_agI4%&gz4c2?@ZYN7Q*)5Bu=*|6vN(cVS_o>c5);0@6dg9xB{;65L;4I3IU&%%tn zy3x?WR6vj!?S(lQt1>sOB^a<$W2s%y6iNTV#DUEfvtCIEUG*Zu9vZ+Svo59*u)|f! zuO1ig(e$RsdbvIW*}GIAqU?$~LT)h=N99+{tP*OrTMFYcX`EY06WfQ#&?a`K^amXP zLt-lkE+Q$0$7+HtPIvIBb(g0D?n`#)Wa+9F3@X!rWzqJ}I@4B<#%F244NjWRr2X_( zDm8C&&dyqq|Hym*Q5Gco$-4*V)c27c|AF~g|8r?eOl8Zo#($+N=bFi-5}$(OHrNhw z*fPLlxNgHvTK#-u`K>D=bBX->5cHZE==%7hW7=4w5>(I9F@n;#WE*~mTf@>TABfK% zL4vsq;xuD$c$X%8Pm;GV9X@nE?RyqyX6B_sJ(aB^u2i)UH_KpR%(c(KV;p&e|v$nEkrrS1Bs0%~micSCwgWaGMq z(A?fxcVF|b1pd{8Zo>()?;7V&Dm>5GY%FNvjmi+u_Cnd?#+4VGT-5>Uu<8&&od zB6lRBU?#pmbdlgv%O)XKRtZV%E@^8HH6FM;(H42NV$DSW zVq|f-u+cfyv+9F#pzk`EXH6lFK}(QHp<^%nx7t46G1XQRVbmSLskiCZb*96Iv%$;a zUh|r8ruTG)7zevvI%&*40H2EZdR~HV^_p!+Dh^a&$DJr+q|NQU**66f!pa|MzHPkM zo33)dxCc=so9ut?1&Ca=_Ggv}aW*3QP|XE0vXuXZ%2VtJ3(hR zbx2Vmy*3A5xbC_r9z#x+APKj^$C{L&Wl|+V*Q;Aqh297wBb$$c_dJKlh6>Y@s*h)K`PXHAJv#TseQW9?F{?VQ;+MWLxwU6*X!cU1d|p9 zt={a^w9>jg+~Af(0pNw%gbnRu)YQnzPM*exp(4?jB(3sn1qxc0vf#w9Tn4;`)D&`y zidMU+HSzA%3a=5$MxI8#roh8`aWRrcJ2x)&%_*0X;nA&ng}?nww&gl|ZnX{hT%EpU zhPTo9`x0ZH@-(Yq~1*-P3@K!r+j!z1s~ayTwdMW4FQ zkipW%fjTSO(nWIc20aKG$B2(Jx|e?-!l_q0x}-aMWbwRnto9=un+U%9EpZl%x5_7OrGIFWJ z82zGrKeZhN&_&=$5*6>(EH*y6rgTNbEj?l8i~Z_JL`a$@#WYZN$As0)*I4Zh(dv<* zn2n>co07}Bw73L2O#Zo%z7Hu=V+X6B6gwXcH`dv|qdcPc?7p!3YfIte;^XJJBiZ+F z=~KgOoBP&okPWAoDpDp*lbVz?Rh`s(`m-6zC-57>0qtZF)=8(Ut^WBRVpLxqYwuNt zgqm9`yPBte2<$~L4#(g=Kg&C>*!QnSSxV^!a850s=@XSzc2VU8SFz&UI_l;>#IL>+09RxT-!=-0bQQYCB`9m#9c7X=*^ z|Nimw4xti0r(uT4-UVw|GC~?(R_Wj=dSpx$HU%4KQ%3V?!3=vRKFP~66A=GjQPFWGtXB{^psa3=${U3dLJh7S5glg#3lbTo@>YW{mD zF9F3sm`LdSdPM>|p-bvdb5VbuPCT`D#k!i8!Kps))casIIZOB4<)mbg*q<-Xs4vY< zA3We^9vhfj5B8tQ1A-9W`|+M`eW}dwDmN<%A;9!fe>!V$6bA?b}ZpL!zBB_T%iB#D84D+mL$cj?vGgBA)S3E@jcDsK%en)TsPSnri-y8Lau zMgCUp8}!2}_n`aKhdCc%gzPYRBSrAaTr}({M4?SwU$=^wI$Aa!f#>P`pG%e zXrNr5%Dx_EJ@krAnK;`x%XF)vY)Z%B@Af6m#q7xpzKU;e5qM9)up+UuGQ3&8N*SeSaCF?9C;lY!BAz-0Dr-a=I5pn*{>#lMhp=3`}kCm^~k@hdfMr!zCH(!z_z zbt4^q*{`xdM;qK>9>=Q5R^`*YdC?J@UErvUuc@sK2w^@;+^sz84{+BO}4C zGCBC?%|X?DVqhQ0aHai_nQo&L}6geoSbnG93BC1fq@J5M3qEOuk zH3F311&N5TLRnnR25twd@}Z+o@gt(a`|&wW#RkiP`T$Xtn_o1WzkuF)uX-l}arCFV zM2DNTFTGJZg&P{wNpot!d@JA`t>N3n(QfmN4qO?RTKZ6{i-2j3=pBdVzCcjJ%M23)sgx$oxr&7sA*Pa`I&-5!)-e1;NXlBp}c z*K**{Zvq0}5Kw26dAg`Y!ShwPlMhU!~6)?vuQ zdpIghhOtl|J`d>&aJGPFG#@m#g_hsM1S{QM<}r@0IRJrJ3>!uKc&P>2JKpW`qvFmP zOqf_)R2BA~zeq4OJk8*mcYW2sV$A;MtL?-7%I#@9zYg`@LOUCwZ?0ag6gph=P>ei4VZ0> zje$v;vRRHUT*G!y_Y@n9s$I{P%m@}+rEM*}o}2U@7ft-!$fyqhX=TZze`51P<&hy*@Pj1xvxbJwv0;|FL+Aes4S*q`S)*vlazjc|jqLvPw#MoDqJ zuNH@3w{uj$FGZrfxQSuIghx{I5H@IfTCl7PDMi5zj4+?#W!|f@SIuB^?_NkF3!M0` z@H!Dgeu2$C@ppumc+ASmbFHNKpegpZM{sIQje1IXJlvawaD&PzYW3~M4crX z=Xr$nc8L6OaH#LB*!H4q15tkf0dh>kOo`*8jB>Ty z_OF_2r-VYYhX9KTX*TAs^itm(OYBTNQr_mQQSXu3n7PKy zTtMtk0(ex;$8Bo7=^O`Grm1kgn-RwwQ*P??J__cDwXU8ThC7tXKPs;}3pZ7aqp#1H z1asyG*}LA5+N;Tx%X4ozFl-Y>m)z~hWY2VwSVtGSIlmUzfeNXK0SJ3Q931lM;;LCu ze>VmxIXMMSj#Tk?Gd~Pf!S$T>yR1tG{ik!D?pCS2_J+)Ef(q@hH_F$nFZK}l?vD|E zqrYLV8vDxR;;`FtZEqhwJjIp}y%$WnW-n-TL*xADd-=-u<43&fABwtLHdW$bPp1`b zTofRoRa`u_aO)$I0Z^Z;?^%CDT3xYVIwzI}%E}iKyxsN@e%YG1UympGdYIfXqu*cR zplYsAaY{ps)W zsteOu)i%vswX6A?6(~Z64Qu8sqaglf50^q)OA(sQo84|jpsoz$!B@@*{^HMaee%J<#Qg&6nnPWDN-R^npKZk@fhL~}QHp=ZKx z&X#5|!-L=MTQ6Rr4q9vO*QdfApo0AbKccZz%BPv&eZ|g$qZn9kR>qo$<5}S@!tH&@ zS7^Ke(hCP1poXN#+c*}zX;^pcO!DW2y1yI56cbYWhe=6^lW4EY46%g{bVV*GL%|~N z=BVfUApAi#y1$h)yV|CS2$KGG&qHW5bj@SYrMLi>kLP^){fC`?P0~$nc}O_NO&s4; zu2zySv_n;NX70HF5y2EZG)AkvV=_A3vneyM&#bWs1iMH}6n*$YTL7^%LGw{13+j_W zB2GJYUI{h{ce^G9<>5|Rx^4H!Xz(I2JjI`lX+!46eB2mc7IJ!+W~U6NcH20hg{cmm z7y|t^Ix}4i*qN72F=H?9&&}NAR?$>j%|ragzm$VDV_v_OO3_&~rkP*O2O#}?nc}p; zmGf!@ELASBf3)wo%gm+C!`Amg_DKt%6x-){0`Cz@@XzhL``KpKYIZRUa->jpyvGbjFjd zcMfFjndNT%eBpHc1`5^gAgNd<9D$fUdol-FRj+Z}I9RQD-kchD5LV8gz8;?+{XPf3 zoR5w#FZ%Jd*U-H7-v;(gS>Oj=Lf75MhW20o+}CtJ^s@-Mv>kH2rpRUC>a*Gx22_&) zP3PNJQh`M@R2wsve3x<=Q)03|ldtt!ql+DEGn&~HlpS5KxhW>3Dg_FVmTuPOYsp$? ze6Qq0>4V}N`Qjni;>suSw80>})jakZ{zi5uu3g7Eb*x`WtrKEpAL4;r(%s{W7kfH8 z!7lm~s7m4|xA7B)OZ951eU1t{&6yz}t*~AmbQ#7++rs$9g-(>wFuKJ{cuu8$KtCjt zDk4EQff8ZSkQ+p*hlF0i84ouM@se(s>6DCiMi-D_vvk~Nmhr*8 zK1=H;kXCd65XV6sGL^#GmVjlx$D`YH} zqDo>HaZ5%pePC1Nwx-5f**)_blEcjkl9+`P{C)#BtjDloNxLgYiXe0LecU)$m48m6 zfBKRGN$M-uLMyeY64r*MWB}0CfGCxoOzUXXs?6~+li9A-72@Ec%R=Z1xSER1UG&uP zb;jE$+}%UzRZB*OfkvT6*TEQ39c{NvJW{z+Z0UjPDyl$p<_yZ#Yy7QT&n)rug^LG=u0NmkVamcX2d^_DQI{a zB!aiAySwce@kta?GU+$2f_+^zxLJC;f59+X+LOlFlDq z5)vsdU{!du?uX)P=>a~_qT$MXxq&!RikxGZ=hDhB{JKM3d$FLH2urg%@FBTKiyTq*3fH$eo#>ogKW+48iF-~E2K<{`4QahzqF)1EeFL6Q zA!`9QhfaYvL-R(@&o#isg#JJq{m60QL^?RhHuE!4;J3C#7JR3n%WL_u`ctW)xInbi zUtc`lCqwM5_U{6c=4QV?b9BE(zGRZd2wwRdkd%-60>0U?&)cwJoV5xV+BcWx8x@pC zNp!&;m5(I20OJCu3P$O&ZzjnCN%bINddn95b6CE=c4P0;3~|PC1E`V;k#o0dhnTyX zu`0Uy2dkCRo|%G*%xByR7uQWn>)KKlu{9loLyj3}f}q!~HxBLRNpdo@Rdr<&Po$b7 zid;d72t8riZpl;{*xeiH0yqmvm{l?nFTGUPOFOks00q1Olry%0Xpxhh;?r`qixXS+ z6y*669)A3Bs}NcY+6nHCM~Ibxz?5SvqeC%vl)mUEe|zr)Is!?`?aL9)`)=-k+j@a11 zUobfefL@cuMvS6??ABs8Fh z%zi<`wTitUbK-jxB-=Erl-!cTev7b(*XK<;V8E{Dx6epjup0_y2XW7%f@K_~*f)2z z<`(&EHQBH@&8Z7sy>jtz;ja&pFP~ROK9{Sn>4j_*PNScD85tF%#j3a4bVT?EmO8n4 ztsd`n{tiZexfSwTcP|nvWS#H#2OsiT^-!G_5Us1V(tUJn|6oz($2|ji_^iZ>MQ&gb z2gp04^eKNGsrNwS5A7bE*7i&;8JOZZg2Icm!wcUvVsjxCTdAbVVPg;Pt{<+x2tH~I7r?b|`kHhg(2Z#Fe% z!3Yl#OMfL&ez+Qx6Dq_P&SojTk4TBR^c44S^=jjsRl*jRL$I~WgIqCG(%GYNq~m!= z_7b})XZ60*uz0Pc>ZeBi&x2B5C+AQ4M9jzrZ_>u7i1XqmGaODw3nB$*PKlA$fd#A! zZdG^H8?EBkWWku_3K`@E`*@}K({B@et@}rIC>6y|eXYTy+|knHCo^>qU06rTAn+2+ z6T>{5hg7AzI~V4zgQLGWT`yBSz0{tqce|dHU9x|%Z!?UIYg}iATZX;+$7PJ1Uen6- zs9)WRF$KTKXPjI3O3WtUQX!Ik!HwjI0I0HULhz^qV8$Mc6)0Zszr zV%sed<;Y%YbN1q@SrwvE-IitJ8nlP+WlvHVcT6Q=1!dIY*X2oK$&MY@^p%7U^#TqW z)82}Lj~A1Lul=IDcshFT_xy41q~GadEz)kPhM$Jc_pf#*jc@42Z`M|;0_8pvh1ieD z7KEKRJ-qv1^Bq}Sy0XSodhytTZbSAmgr+zKcvp8Tl)dbHECze#=9`)8I=CY-#4xDG z#rNXs;q1c9MDz$}r9mmD67iolrF;DIS+^1vh5o6D-+u1XG92QKASg=_LO0SVn1=a# zR(QQq%hf>0@f9|5Q71_vfI7)^vR_;FSbZRa&QDsw8%UGzG*_^-&d_Si#VP(-zWvWP zOYzX*-!zgagp{`|kBRmY3nMO$(yB^SBrb47o_&l%wOE{$$ly~g1_X!YgR^5ZeNJln zR0hg;W-rb6TEECfuCQ@32sxwo$13|nv4D+ii&y=kvFWIyI^L~Zz#xw`DMBV8R$O+V zyw189Lzp>YU?^2huDMuk(_32g5epylR96PpL`D?0m%*3VB6iQ1%gL%W-{7+1n!gbI zppqQi^@AYLrr+Mp$9Ol@a{j&fpQ%C_Pq_nTgHB6Ceo@E}VT0dWdYt_WZVNLoL@ejv z>u-~xfsRir4AWWe0OpGNoPW{PrLf)i@cfrXX^C*7u`4nO`WQ8RW$%tpArZ!lFOkQt zPjpr7{NB|S{*9$k-SaOjpffU~j;AfrzV5W!`&6MNnx8t%avqAKMF$}jM;PCuDqBWv z8d%%fWOeK9_`nfmZXF?gUqw-OLZkfJcVk4`EROsx>Vy`m04YU`FosGOut=`I!HXXC zvm3r3`*o1^-s?{kiBdPrwp9aV35GH22dpW(duuSr-p~7pJ#`B%RsN!=60_CPeOfg8 z2EOzxb0w&F%Z!D#M)8^VgmeR~uv5t1?xq5Vz7;|J{L=4qPRH>PGk&II>Ckt_&7sQ~ zj#feO71Ib7KySEA*;d);kO!mnqsyn`*D#R8=0sfh$ZAIB=0eEMHww-T#cQWgHC0vG z4s-4S9bwX->Yq|gQf9sZeOeq>+}qW~Ip6FS5ctYDKpCXnT__ zAZO5eC^;YdZSu+Rht~5h)ximBo9|OGhej{?r(Wz?JJIoiE;5>D?+B;)1V7o5>4FoaGh(5PSRswG-pMP!AyS>JOzTWHt@`wX);f}*L=VATEx3cVcBNe2>u z5p7kB_cb;IvYsQ>z`V{7lbcAPiJUJdch^YZ#1Mx#Ytb+D_vgk2>?NKdx_K$=u=HK2 zmZ5?t>0deLF^)4GtD6^rBO@c9hz?>a$J70Gi)y->HFK483YOo}$_1~nZT8*7FJemk zY}}J31eatFI(g|RXpB}wn6$UJsjqwk(4Zr~Mb&S?saK`TJQHP0m*sW7er@j!BX#Hm zNLyF@EWN9B&t&~Sfz}S&^E=0rHUI3jXXylI?eqT5#@1_HcN)hTG+Y%(^yHgIu+ptt zZp6M++CQFXBQ5p44T`C62vz9Y_ou1ZD^(FU;pIq4f#+N{D6(c3jFfll~jP=W=V~k;T zb&t@3q=_F%eASSYOSyA3$I&(6w^ow~f9nqH-)PG?C6~O*F>__`G7oY+l@_48~%$uUh-txOuoDb9!+|*_?LV z+39j0g*R^%(N{xAweoqk{4I}+R>v|;)R(07Whs|(TAig)e7-gFF)yM3QS#9402)SX z9i5f<0&I^Fk%=U>={<3Y{X>kHc2AG7pw$E@2Q1J1u%{(MFNK!}S)l?NvTqlK=KfhIH1JTi?3HA4eUE)Q7u8F_ zk5@87`f5)+mfW+_6X#Zdp+>;#LNUMU^_h*;w}df=LjgY3r*U^pm%kqg%Szh(xU#-B z3${%MSSP3Bn1~GJ-L~X5l$^Dj*AG+qvtE9MdR&6ahx@;2f#c<~=G=3$F>Ns8YbXm= z$Z&FZ8Ah}KNdl&O)Lkjt@dSdcVb|4Wb6Ue!?*72I~yrZQjSoJ3~touCKW%t%% zHpg%$o;E6nS?!n{2#$b0v^A;xTI}+qO1PD7AC!;cb5tT+{^$w`ZV7ItbfweF_pC^3 ztMQ_%S~f23;;;(E5;&02`Z!Vn%uLQ^5mcIs`eq~QG>nJb|Bd=YbgV%^WrMkZdAr)^ zXvf28q3h z{zC)ku3Wn8N)q~|UqxP4Z;piA#mD2@qoT;Weos8+(v(vb53EaA4MIf?a-2P?d%({& z)a>I9omz=1$=#2ZPTM^)(5~7Q5^r@&2DtJj>;sdTY4*@DUBJ~ZJx*tV`-65dI?s|s znk}uj0v+Cf4t>{W*52VmpF$^cP6C+TAt{QM&oE74o?M*aZXufxBMJ^lfyA?H_#A06oi?D+AUL z&~VIU7GITaCs&hWopgopm8b6mt(Ju$F^7l5_~^>4ozCQrlAx@Ayg1`a2O69b)1%m9 zB+g+=HdTNAH?~Sz6U&K?tfvEeP-#zbpu+MeqCKr{EYuFelrIAYHiX5oXFU|!fv|5z zH|-FB6!of>zNC1T=x1|ZDd0FV$Lby3gt?H{M!)vc?90e=LGnTXJqFJH5O^Ds?Fm8$ zzpWMsOBH;Rif&P^BdEobB7>W}$q+p$>*=NUGc}k{dW*jEbC?1_*~@}1|C7&-ioMv; zsXPs`{mt|4l058WevCKR_?NWQhvWNXKgC^uQBVp_8#Nv=x%-Ue<^H~o%c-+covYVk zF)fk7lJjQ1)-78KGqC-X|J+UWJ627hVMDCkgt&N=+TurEFX}|6hj!YUEoIu=0_)&M zPy8gEGTvcFt3M7LIx3zhF_C24f>3y`n6(z7u%hti5(PU+RKtv}>o-G z=85s|@A+otnTwf=x~q#?Rcr6PYVG~Lzc2hLaRvkj1pX z9k*s?hU_Zw3xDo?cuX4l3w$Km~ z^#6zpP`W)G^u(7$(Q&j0iBtSLw?{~|pN7EH%EM7q?}wCgM>T)K)AdQ4M%L+Oav&t;g@e@tX^PSgI8A43EhRE%WzeFCSDGM;QWiSy7sl zK(gI-=&q|@(8LhqWn0rXP5fi9P6>$XP8KYCFZxlUh2{i4AA>@TAHX>sh0lff=*2?oAvg#*!JTKa5Ha~ z0kmk~I+6Ttu(5d0G_wdR$s+&0c`=Jn;gs3y!ffGe@pCXp%tcZ114F)S*JI{2F8Hfe z*_O_VOXPpt_skY?$b87 zw#$_L>oHKsPyFdq+i>AaH>>b#6ZRFDhWc=>@j~wYxe2|-IP=x4pVspY>HT|c(HBkn z*q4G%{}(cD`&aPA%9ma7r#l;{2j$--ny}jA7J+;Db`en{^mcc@4)_8-Hz@t`e?53y z6&l>GXZCe^dj;gkf4bNKNJj;rI;zvbSt}AZ|O}05Ho-LUfm_>UtOz%%sV12i>do|#MsIH3g>Pz3;cbarO zc7|RV?Fw%y=b=7`u&>hK<+6|l2b=ZaMDBr!D!tN!+#jWJ-R=d_&k>juy3JOXcK`}f zWDyba*f6B7))atsZ?ZV9}z#Z+m2g>KCNwH`KtuOxO^WXcsmFNoT z49T^`N&yF7{F@GFqoc1TL#pnZ+wlfhD;7FI+x1JH#vKzGzs6W#)0@D*&B>f$(OJU6 zSmM3O6Vn`FUo=#-q<6(AG z)*%|bnI(6{oc2}6FYrMjSd>nyOo$qq^jcO#CaTlTQ+^Gg%=uq>zywu0+ff2N3u(Oa zb5rcVBF@qoKHb`4mSDu)pbst9!0dGxyo3;z>30R8bCf$YxdTPsswV1$ZnkVGQsQH6 zP*l@cm%8TPGqf&}*29t9Zic&%|x^l~WA%X3=|iN;T> z-jFhJ14@rj&+%2|7r0KCosNLld!;K?1|v-x^)#+ul$t+jcQfQ{S6cCtMWS@lXaT}| zcyg@34|0Z-mpJ8EX)OKB*31}zk`b)*A%j3ZUfn97Y_MVCig%|GE^cRe;HGMi8#nhw zVuvaMYthJHZvn!OpPI^ogQ_G$VFcZYe4uYugVLwny5{00(ah092qavR%j=vR=#C4x z7S$C|$2;}fzPr`Gy$n1jrbwoe*G5CI?&7x$RAQ>D!jE0>o^vY~inxBHYWMbs%U9G? zXms}h2aH{dGE-6BLR1D*H&mK!1YYZPAuy)g9JR)zn+lwW&lQ!?huqLvtpTN}i&c%o zEnI4#t4hVZlA%91#<*W$ggdF<-;`DQ@nv#HKKyGXHjRspWrS9)Op{3Au>>&_#@}pJ z-P&i%)&mO!`)21--eVS-o(Q* z_qwKfY31-l{bzE8;=laA_eoy}vkQV>*&|>TIYJE%-sE!rIL{6|g23n8);Nb7_O&5Re+g-d@pu#i115^69 z|Je@m$t~wQi`URMg1gNaq77D?M?SoK^eW!Un3pJ?MhlE`VOwrLZ>FP65@!aVO{N!{ zwKsoXqh-=Uz*z-+W=z%vMNC@-&MxzOqyK?|*DeaY)r>@n}nyupECKj>% zh8v~3SbNhW+h=Z~oT*|lL}P+B^D~gd>^S;)d{E&)(ZYR|DZ@f83FocDxE^4DpVIl%1&)>A=#4PDp2DJb9>|)kBpR^BfIt& z`bfmzUfkkSVwtYFi4VwAPR`emTX_ z`#YgI%RKq9a=^n8MjY50&$A}M19#y|vrE!Lob@CZ%ALZ($n?|Cz{@WuRaaBr(YMfU z$pe~h-@6XM-u~#ks|7}JO&=w3{(<`Ar?1l{&j~T9Eu5SDnxDIpJ;XeEZ z!CV&lHbw~>ddHIZJz16@CY%-FiO=e|a36eU2+nL(|1Wm_0TM|?a1VXK*oSIKJx5RDt`wtEBrKx5H%urZrKD_D0w!rkQuM2a-NfKvZ5{cxV- zlwfTUW7Xhqx|P1HCYE6Q@>vZ}f6#hHnimeF)^SNZgb%b-6*mpNh{yqrIO}s+?2j~j znuMBfBZf z=-*WTf|@KuyQY!%wTd#y?$$&vMyYjOZo&cMrpQOVfG;*t9gX(UNP?W&Rz6oeOCdww z6wAYnD5NuE{0)p~v2&~`*Z+O97SaYrju0AfBpM`A4q`>d&Zn9@j_&(Q+Y^wm=yG(99iEh{#GLQ2+csABRE_$TVEU~R$yH+qP2C>1QpC6OT_Rf)11 zlw;>4HfP-0LAmV$#8)zudfKYgRs@>G+(0f-+qx!3!y<&`JK{aL-FEa>Iyf?%K@sRL zX|}1n-I-LgHU!cY8-viwM2HPQg2zPDOao5A9`7mR(Gn9thy67P^T@cyPt}k0#Mlg* z{n}k$b?$IgY)@!h`>1H_x&=(BUJr#9DSZz*d~J6&98xX(g7@vvQEfb*EUA8rljtiw z0ooQv@reK;bvI=tX3c^!`l`P3GOwIkT1T<_swS~NFvYby{?9*fwQ$sbKF~Y~LQ{O# z#lHO)1Wz&W1ON?1vRwXB;%G1bQf}(#0gv#EoxqP&Ip*_iMo9;=IounDz0)UFtFDXW zd#?SF^z31xIWd%ml-L#d5gYXr2w}sOzSAwu!2gnu8Fvb&>7QExc3TJ(XJ)r@`?pRN zza3LXp`zCxDDww)M@zzC8TM64O3)>pOjRM*jJr#~AYjUC=n2j*6tp~oo%LFLB}^k! zHubB7Z6+Ft=X6Y1rsGosi+PtYfm|-(aRX2DBQz8!q=7tXn-w3k%LUNJ`$i(i3g*AR zdc$1zzEj=m->mP^+_>P@ zR=%S^Rx-t~lX&37UZ4cDTL5w15qq68+QstWiRw?O3xc2oIoTP0Xv^JT zTvp4+FW%g*C00CfgPMOp3=5zJwv0oew)Q4%_ZmY()s~^FE-(>VsqvKesQ}m%y35>X z|A5d_iGoVp105N4e>+0D!}++=ptu~e%!l*T4K>nYA#`;VIv>1*!iiM>fP92RatAUQ zn-Zy0a-c``Wy7)`UZ}Wb+f?u?MpBqHBb!Hfg-&SE6z1*|A{AV#% z%!^ooeN|`kt+t9dSbX(~%Gna6b>E?&Y{M&7dKq#8;lEi^via~B5 z!V~K>j=v3Vnc~AEnuCJ~QNLVy+Xcb9gCfEGXXf(YrC?s}3d^w_dO3w#jb|!I&^J(x zvQ!O6F{pSpi(^bGMbW<)vK+VtU&)MX->ZI=f-O5>MZ?XF&UARDs*PF>>z1dKm~6V? zL(CyfY*M;jZWW1Zt}b}^j`|GMd{S={%l+ba`qp@*t-D5O#?ygL0a$h09y)Z|b)}g4 z)`(mz1^uYJ4BJ+?Km(2*c}_GSR(%Az!oiSIQYQe_<>r3rM|Zav5LIO5?YxY#MBVXy7Kbgy_gR9$iKCux;;^KXoBNRwEJZOmMAY zJ+pNys&!drRF6#D%4xSm*l%+kk@In-7B(;Ug~sUj0%)e$p22#^$VGH5BYtyz(V>c3rm_=LBF$G_tP5eXN2yUL= zL2I1k&EvE(D)>RmY9Pjk!Pw|*Xgbs-mJMre+z1xbjWRAs@#bv$%;ioV?;TmYrVu8+ z(k?r~(j6s>h}YG#+)ZxIpYa&%npwG=C*QSRQkvU2^R5 ziFhYHmE?P<#bJ_7tUm)hF>o=v!&SPy2sXYI_~8F;@o10;e1=+MPPKTAT1E^ z-e~AyduAU`E<7{0N#NlyAM!_oKP3oH!Zv0Wip6bUKVleOp%sI1Ks?Fg;lvYJk?m{- z6eV?JN@D{r4-~b!@v7gVDnA#q7IY`@WgZSW!eILKOQiLYt*Vp^*R3*>9cf-7N2a>+ zF^Lo(rY%Y=><^W97mbQFj(bO8Nfe6kimQSqW<{dgP48GOT3G-J;Dw|_|1Tn>Gn_IP zQ+?I>TRLmQ;Qm+*K)KUwcu#|@b}1K2!`y{$2P6jS1(IwHS3x2QA>ICR&9 zawnL*6}9dB*RC=N(q!B&1S|BaY9Bdu4rP4x}4s!SOLa z^X~40NGl+OZ;`>{$C+Jlwl9Z9#7*et9%LtwNF_F&%pahjc8%jB%t?qhHv)#rFBFz@6(UDTR1W(Ie&m)0sB6Mq4q}40Ac{2JLFU_4 zYCqp6?b#Qcr#)-ka8t%qnVN~#m8)?@vknM|HB6qT!gSbaJAgKzC}Lxp2)LkXWBPGEB!G>^mT^chGUzUgGfhQlOF@7z?lWKH4LDSJC0 z{w_rSTjhv-Fx%sBv6}soC~PlqgNcsl+dNL(JH)7-YL`y6pBBoXt3q=`X)cvE;SM4P zttt3h{xOPy^h=`pj{vUHC67 z%aGHy`7>E2J~Ld`r>Z!|<$Z}7c$x+=W))1VaimYkUVb+LomjvS%>lX*kZip_L+4*j z07#O<*{L?gBipT7NYY5@6V0YQ+8M`5RF$NF@SvA38%g5m+HjIjn_Nw7#XLJ&`Psn? zr7)NW(Ey{}a_3F2a}+GsY<#z(m{;c{gL8gxQ_Z>{LeP=<N~tTaS{5XADi#M)GK{K&BJP`h`)qeCfzY21a)S?l3r0#ieE?ps_g zUPUbsgth5vi!(1fGUod8$KL}a{=e;1kW>ukcV_ZVO+{Cmn+Fxlz$#gK{lQ5jHx_Yu z9dgt){+X*q@ylMGy6Cpj@01=a(cET3GQy&Tkd!u>Ch_e}94RsHDoMJ5wAPh8sAo4J9W>b4-tuW3s~e~Cf3x%b zKy!bKG2T7~J^QT3nSWc-bd%if_*Ozdg4<}6B~_EIXiB{(o9BwcZzEn#f9slYpvmtx z(zRf_mOq5z$VAW~y}u$lX8&qgN4Purap9fqM0NKkEyrES0;_z~y}v)}YF5OwnLi$V zC%W_wK!rA+FsH5%Lm4I3WRFD_9GYC_x6kw0&~Wf)7(O$`uB{HnWc^o5b4ikWkiAt% zGZH}vFZ$cM$LVX5cYpKhrojmqlWX4e!;^*$K%=0dOmb>sz{!=ooWt!*FLf`$Y%t|h z^_ar?rQ`164m|Zvxd@t2_{M(0%4LYa1I{}(LT_m9TN63cn&U2}L~l*zE9YNKD*1Ok z{h@(8ma|5zYK5s{c{f0uq&yNOjF~DoL{;hLEmqaPehHWM*7oDpPA<9vW^XflaM*;T z@miGG|Cg!ZEUf*RP`ilEtMQQ$_?21NSBl4ZvS%)!9|+m)4v!DZyl#goMXa29J`{F0 zWp88Ycyct-8ELWZ_T{3uC@09C>g3IvkFri2&|+uJ#0)&?VEA>Xb-ehOjOK1L2DSq? zZlkoThd|5)*D4r&6q|Q-Ph|o9fInE4;oB8V5y!sd{BcaFiDgD^mApymVbeGyOt`^+ z%mEkWPUzwNunEU4tt6XbJy9KWlB?C@pxkQVJsMW#U14&0bn)srBRXppf5>A>HIqEg z%yde9(C-Y@t@)4dbKdTbES2puIAf3_^eMJqhQOPwg-tgJkeuy}SNqm+`6E$(g{3LA z*luW)xaKPjuTI*kZAEis7QEn32kZe>4{(oHFVUckrJw!_$*}VDD`zb1bFLfpfP4dS zfMOt5e+#EF+zNgy{M~3(lYvhAzGwA38U~*sAlGaQRyT_#Ww}1m`~ZLi2ktD|V@YV7 z3H&oyllFSdOe`)EG6l|o4~8ovcmF4(P~ZfY6NDp&>6lD=N5^_0m$BQBCh1Ai%t2gz@ZDv6s zKxCl-S%uopbX4M z|E7{VhWNie;Nd6uQagcG%tL<=X(s^>JO^BzuT)`+i4Z*fdLuyYcD<-!7p^rj2?*)A zS@bJyXiP7rxr%WA;S&%H9!BYPMLCuoCaIjAmrHAn3L0E=XaIUMwsz z#^H$5R!b(D^^1%1%xB2EYkFV?0MF$RqrL@z0)}B8>D5~&Q3e}|<9AoE#42+rP!anK zbQbL^!Vjm~$>Zv3=ilVS-9`j5XW_*Iz=%c1^|V8mM!W*tsk??JFSXV5%pB5#(>H0# z`C2MwtC2b;mvPllz)0g!z;=B_6*#n=v@}^$|8-9VT`3Hp{jdAgDU;68fFyrKBN9zz zRpd!*Slq`}!B;cnZQ$)Rb%aVf9S_RA<;9woRpcV5_e$BLTwDHR=Trt`sQP6U@CgZ!3mRF_p(lH)gfAP8HO%zXs&*zfF1l}Tf0t_9xk&~ zSl6efmW1GK?Cx5D3vM%R9w;Zh`eZYYt71x8#MnmEufD<|-nUs2A9r`;DOqWOH^7#> zY4uY8R~GH~=33%-sK|RT1L9!%a*@3YF(i)oSo)l&7Ro?@GPGJ*!UId>Q9-$G^jZ2f zfRy^r=qkUB%y|bR-z& z)F@N(e{O^U=r3V!KYG152pH8u{1=8|&{BfTq>#{&;z{eg16&`Y7R#h{+c-gN$vO@~ z_%J>uQ4uP)eU6vaaA*|J@RI@GAk_mT*xjAR3W_#aQt$3@A(~w~+;yLOsRzR_X7-Lz zThlDSd2dVyY~%Z^C4k#v0XG))TUlB~xO}2sIJ1SViFuO)x~NdY-9w#YS1TGz{fPyO zGSwUu9zPQ)Nplvw+3UtWM>M78{yOJ78Ju-9Lf2fRO(418%929yYFsT$H%*fu;a#-{ zQG`@>{N)qz*Sl8AsF!|SefQ-DI5vX$yTFR>^mr|r(kOyPK}5_fO7eibKHYv<)?2tv*+O%=~5<;k&FxYsO0O(`sG(JZo@N}A?@ zbA|yWZ;NM5O~VonyV9!MsoeP7$snv6DVMeD&q(~?!0}Y0G)X0Fg`t+j_9kFg>x0wg zd%pQlz|a4}SOkU|-F@pZ!#E_eCf&BKrh*=G+4#Gn7RO$?h{BRW?&@zd=C(}8J}OTd zr)^n6_X+-oXU# z#-o%ej-x%^o)H8>DwS2HSy-+^>5ary1pi5K=7zN9|wn2$v{XOX$2(eSRxX;tWZ7_3VX|rz!|4r85Gvw73Z5 zK!F2^&I90!HN`=F1Irb5X~&Jh5Kq%6n*2TDqS)^gvZGmvJ6=v*8SUTnTi*vDdIrKA zq;ZpHelw&)qN=9yZw~LMsPJfiA2WYVg7)li zqCq#DUhH^)Aw!rA6n7iCT^?blbcba|;=I%*T?qxwa{1%LnyotmNC~cxw>T>yvMrIR zw509&W@s%BGK<|TTM_YP05&+KoK^RB9LO*;D#~)3?S%y7oLG#l232$E@&ZiuHo@@M zX7{W7K#W8#Xkz#$bKK1MbI`-6OTDezFcwq!2I(ou=ouLGzSF|@R|*gH6thcpVdBH~%SUfrh3qD1E<^!ty*#bE^`yA> zc#ymxGWahr?))C(P1|%F)i{{_+#eFe2VuaG6&M?kRW%CfFL0t&6G(jMUN!Hu*qJoh zLx!%Zn@I;GqJa0r**B}_GNPvBham!+Au_r7h^?DauK=?_ntOiuq6-#qo)lu*`EtxU zwZfLXgRQY12b|L?$?=F|rtf(giaokWgHHW00+75B|4ut*&6;BW3}k3oP5=p74ZZ>8 z!e^p)<)f3u{FS{bj%?|$r(5ZwR?xB|fpXdAns$xsm_8K42B){l%^g1YW7shrg^S8t zNavvNBn_xA;bg8!4NWUYmqFn8v2ZwqfbH%fjn#U`WwH}_v0vtv7p27b zE;EM{5e-#Z7;0sW$EQ&3Nd5fL5=&wrCT&QALTuR>xo$aucb`myd>S~eL`<_zEtKmx zkQ5jrV__n2ZWq~FcU5*G$~8xAcj|%(M_XU6M_=+vNebb_$O%_-cFZ+`_g4qWuLEfa zF2_^>Aw77R4J7C(5I%>qO*xXN5l$#a>EkHZ(tAsh$i$=Y))&u8vi&+idcc22P9bUdLcxI7rbnJRgh9`3!dd0)>uH5lxx~(+s5=hURv3h z8?S#hq1D{j48D0LGA)d9nm=7k9B4$LOI0&a*=wt0V>xv7ZGO{_>qcD$-AXlqH}yW| z>8ty1(o__g`6bB>Xev(pX%}gtV?b8nKzJ?sWMd`AGc(khF(Pc9A&Y=V_~iv$Zw--^ zt6s-xGpYp@n+5}CqEE+v>qOM4Tw{)!P$Y17|7y?hu;xz5XL1yD9xIEYA^Zw9m4G_? zg%8PO(Tx&0+xiur<*7uYV%T_f2vJDW7Ec>oz^I89sF;E z6W+hh8x4KE4ITsE6yC#pR&xA4fW9B6Ox@4#%iCMszfXamlO;y)uj}Xb@8kdBa8UkS zqiO-t3%wm&+>c)7?8RtL-!g%2nQo=nIX+KQbY_8XAe?Q#`+uN~&y4AwPayFA6p-_^ z-ScU`?ei()bDd$|^Ew&z^^`E({d!kXGrIh7e?Ioh_Vu=+=VRSo@Qai7{Q%_5m;ELO zkp4V92Ws}rN8M#@#umi!IXyZ_wR-mp@JRK1I=4GXXkBe@C#mJrT|T)SHvHpMOnwba z6@0_2E*ToGF#>+BwzNpKpFD5;-@p<+=a15>4r|7qnj_=f!?vT@*Yj}uZNHDxnx2>S zn(ohz9N&DQp7)3K=`S)I5Y*5Yu;Kd4?xRb9_j%;uSjidO*Ffmx9MR)=bk z@b&tQbF=&qmc9IAOELgj*L#*a;Nn$Gw+Iu8TL0BK!J*00`Q4uqw9O}^ZU4_0at@t< zSg2Iy?m?)9q37sjfid6InolTKXa9*qZWjJfq9MEyL&)-T#DXict6iYU$cp(*=%>Ww zHlM0&(R;qkm=yC?T4&GO!+K56^YGX2Wb1|4aqR*`A_yhm`@tz!sWQz0VC%eRj zQqM~mTI-jPvK%a&mh6uVG4ubDW&TUL`CsUoek`Q_4@0O03ma)v0M)`!Rrh~$Y4HCE z3#PGlM>Y;h=Fi-EOO^fQJ~~l8KWRXMYQ=BWPi((v!VWt`}XH8RnN;YF)+dIv{-2K{psteMaQnISZzw{#W!j`Tb=k&e|dk``}5r*yPz}ae!E)<>$s;Pv!-$J%Cllluln_3 zs-%BiQ4fe`wl!o|ZrRe|99BTZ ziJvswp2It}|I$45JgKIn_~HY|yv{nF6P&J@KXUu5z)|$}QnJ5~v@v|EnyCgAyEUp# zWo~viez`n80iQSRKbKq1?A|JR4EJ9LjE3T;Pj6FLp6(lbri}klY0Q5v zkm-8p){YtM*PdIM2r%$OSX{m)Yh1PEa4f$pV@E15$9KLt4xHHt~@j2@)(d0n8!t8U7mtCqGji<#nXgbg3 zF9N5pJ-0Lk_DlbG*nQ6TF08&O0YAGS?=PPKPoG=gnMzo@uBS}pes$h2*G&-vOH#&; z8MN1o7C&4Uvy!})ZUhrj=Ua~*HD7tZ*IqU3)?0kh*Z9o;uq;sm1sumhR?tM<&QcaHbqPF~Y2k`X@6XprrBr&4FpG zy``aM$yf-9p}3JWj@q5W|f6?gy%H17QrY&wYO!<3? zf6`pVZBIAj<6m#x>8bD#ds28()}<)5oxXgWzLeIKci##sIs(h>vv&FEwCaH|Y^w&q z?D9{8;o+Y0p-C^KePSSJleqhXwj{gfgqBa^j$<_Sc_Rg2r1e&`ZzOnM1GD$?BBTO} z`OKDi{~-R9Xt)8QZhzbxeNJEZe1Mp~?uh;F$L+t?h2Ho7W$;zY_SZO9%l7-@anJJ= zs#G{Z-Q%QM#Mu<@*6ZqQ+u>NO5 z!SR;6>*Q%N!0VJnM^Z!3|K%;U|bIa>>i5 zLS-$er$Kd#ZU);_`pV{#K0?O)U~}vvfSUDHb9Xm?jQejVCn@}4zJK9Vqe+PMEypS4 zK(omC?j49O%{!%}RqSUdFE3EyJkH1#30Q7@Wnd}NeXIQJqJPb+5PfY5VBUCsGpIxq?3a+DnPI%X6QQU zczRg#yye)_tIcz&&(E!|&*}J=)}Wb_OC{Tg^)?XP;bAY+i6oHQ@#xe=g-QxAGqqM6 zgR%NepUYJ_>l@ro>6f~zn!i0f7LiQl_OVVYZz(%0t(y>IKnQb$!C5!QO~^>^WJcF> zaR4yWExh^Uc4*YQ_b8+Gx=j51afiCVknMyV z`%L9&=LaXwar7M9jok11@&F#~^GJQ3Ui-*gsQ$5dnbkobZ3%1&OZPFr#F$8_*nH(3 z-uMsxJTlF%73jZOPP6y0dxV(I2ilrJ8neJSn=m~*(&N2hC6+7}b+$%VlBSEB3vE_u%$ zIPW?M^vf5uDAYV&M??j)p`Z{)Zh*y{8ZwYcF)qsAS(9?^bQrD0#?lM!+nF24t*2pJ zU~M8=JV9=jttMkd z9+eJBYc*dJkl^IPxlGatcTBhk5eZTV8W;DvFQx_s{*hW2^GS)1TZ)6-cOXbnXWuRO zCYF8iEletDfF=BI*xB-Hg1XAMl7Q}Je%a39Jz-TEnR+2F_u=TiRQOe%$wv0RnxXu- zptto+=kf~aif$0>QB2j*Kc}80OGw$j1U|mvlL73<{(6jZlJbNf>OvvTV>~8nkJG2` z^ljzc_M^vY{DBrKp5_5%Q9urS=j56Aza>ts{$mZ+)YC$x?-xIbgsx?Jvsl~V7uU}w zW1{#7vhxICk?&N@nqD>*Jm2^=m;g-{gzsT5geI|5waa8{XXxNMuhFzTiApb(%291& zfM4fv109Qehk3^#w!y!n3;9P%i_MKSDCnl%WYnsMTMCVmel6&f!~hjP^cUrmGO#Pg zqRtT2DxEIh{f_GI1)aJO$l6|=IkS#YGqrsL;O`b1x~6A!V_a%>>cSJ1&)F7pkbyH1 z_zE_`+Yk4=C+gO}$I$g7nmc}HqUoCyYHrz0>TK^#P+KhM`YJ*gAwHv73DvZPZj?CLxcRGSi&_fINu*4cN2DQb()1F4EZNCJB$iXYf$!9>)+@OQpzTk43 zpE9kqk+L5H_xfT1YN)JhS;t)yjl&u}Zhx|m%>bOup_e0J4M3_h^q&z!3J1aJXi`X< zG{l%{F(dYCWyj{EqRmW3J$Op#oR!y_CPU_Cb~3wa zyb46bTo_hLA23;T^Ij1zq}1Vi57SPY2y#fFI5#T(Q)z>RIxw;oQjn z#Ch7<%8!7)(pQwHwiYvAeYA z)P&DP_V-R=ghxV#ef#zvB>4(vb?pEit~MVH&#p#c;Y@ zbX<`b0Zh)@d6+p(gysyzsw}5+r!G={mK{9Izh(lT=r<;VT~I{i?6vdyf>SUVHyhmlLSQF&|JY98yq zZ7(DwW^lu9Py^7!EC=&(*HSAUf}&3i?rXvd0R|`{c0nrXpnXcOH4O!s!rK&^!%&X+ z;WOilvpdv?BOqP0oCrjNZPn9cs_P`*!; z4ovT>Zj=l~5?kFZnN{%59A{lr`0PU9iD0u?g?lT=oH2GCTf*c2mqgU`wC1f;B&44n zk2J|i5C#$=vy;jPgaRp-rhTtQE4~tp2 zDzUI4ew*G;4H{Th!FoRxU#V9DdR<+1sR(H__te`nn-aJQ#?hu6hKYGRWatq*)p7;< z!Vcjn(aZ>^@9$gh?{JfS$7!$NQwUu+XKV0Nysp{-?Y%q56mc_qzxU8u`8Vw@fg+7i zoZrwsJN>45X|u$2DXleTTE~9@h}?rov~lhj9g4R(5V@pDm0vEHPaVa7G>p%5g6A!* zI}`-TgwiRgDao;MfDL7cU>DEs$9pgmvE(&V(c*k!RN9+3;ihs1Z_y#SL9uSJx}Lm1 z7%u21T`aMa{o^4inSprl99T15fv+!tcCx-|%d@V%9vR$NLsY3oy$V%kE8U^xYABcg zeSY4)9fKJ?2A*?a+*hAG_@IGpO5<6*>qHLLIpSPSXsNV~(#s%b?-ZI)uYai|J@6aHAA*N06%tj}BU@-*1T>%7`kfC+Fvufc4^OGYD7_k*FeX2yq?y4=vhgZ_ob_gA_4q?C&W2s$bPG zg6y%TcYm4({N7{(=~Dz$)(6?THc;WvLId)!6wk9~p_akS@?I{yNBjooL*?xI|a#g9j?~@@0`J zz~(I=|9EC?xzIg<&}<`9PBI+qhoHwld2w`*N9sn5-l+Dd~#a&aR&J10ndh z%uAqx7X$g8ma|@ynUkJovRHm+`dFd`f(}`$>)`lMxfN#NnC#EG6 zkpOm1*ScD;_i}P&{FH&Uab_oj!no`c7U^2UoFriU{;SLb-m_G2;3?}tweA+i*LXD8~}~xKh`i> zQ4U(T>>3M5y`Syi_3}pp2Mw+KrJbThp!TlsHYOh$c@hG^83ccR9X-0bNNe4NAHa^z zS$!@meu^R$Y$h8LkTdud>I5eTnB(o);&Nm6lv^SnLDlS8@*6%WI;h0cOQ49b#h*3^HL?smyKVtBVbu8up42Ua zBtr6V#8fY9(FlCu1$#nG`lEN+0%&H{Yp_aDzN*L7ekpP#Jf03dVgycHPEVnTmu&(L zl^}L+X~m{(02xM_w;R>vV^QFEntU5UC%GK&>OuSC2Na;xQ1Ck;lR#ojDZ`0pX!{h{ zz}!y}+m^cfdW7#)(lE$2e_@M>2^5RuaY@icmYef!0up!gSTA7eu~e6&nSo;f;TZ)N zy^e#Mu%VrM@~-TuC_UkU1<0m&nD<2U^6TO_si6^^IEE7JktW$0rqU#SEIHi5>FHw^ z`@4yL)%K$Fw$T9h(O>=)>OD5=M$Pgcc9(u}kWK~Mnq21uD$NN;rfSKQ0yTF3zQ!U%0Q#;~cg+@|FM|=1`PfL~>`#jp+&JnUHPdVbs z)?*(>5DA^j*0R@UxU=`r?(9{)m49OGk(2%)(OFf#V~lN2ge2@;bpV!B4YdG}LiFSR zl}_DBZsZ}H9pO1;k7S5c5`=VRj)rQOdI|S;ocM}2U@{05!F9}_Ftfph-&CWVEexwq zo;!&1jeA#^6`LU?52`YfRU$oXf{mLyT4Ve~Ou~l@llkkcVubR;Jh7FrNozDAT44lR zp4}$4FyGCt;+Hmh06-oBOY#dB*4zChVV$RLXulk)Q`q09%)PwzQlTt$6grs6&8M8s ziJGeTA*=e>vN`x!AAQ9ZO*OS+frnDsmk2s+tx4bzhO~U$eYSl8Yv~tcRTlPc5^gHe zy6kEsM0AAm4!hfelJrb6h|7kqNJSqGmBOSM&1nZn2zm7zCcxs-&8#11##UtPXW!}4 z{Xa?v7MUErjNwUipgCAfBNpw%lw8+g@d4g*MMWM%)cTx24 z2bU*`i$YL}3A>0&i91gaiQZk=5_g8XXyARx|9Mm9@27a4B|%g^?wp%aP4R9t3#DYL zO)XbMJqv87`TlgI-BDoe3QtjNDaUcM@ffDyqd*wnkI8Ej15YG1e16x+(}FjIlD9|T zp-N<9(v{?=?DvZrCcF3)cI2dfPt&gjT1p3u6~>eMTRMqJ-_Y-SNbT8BbH~z9)8$YA z`X0(cWpkLKg}mg-hQjO_b0VS0?m_}-4;Xc}=wBdpe#NSM?SvDhfAQFkUK}DcoUQ+L z`MhCy?v=GfC1yaLn_^izJv?a(uLcuGG4A%5CKL8X_K9!5c5I|ik?j8fdq9N0p!%%! zr7o>#jaIkR?DU;zDXU>|-4>k%tJW1=Q`gtF*NjZJBd{!8O&)1Ec5Pd3B@89qQ42iH z)N8C;u>K3wf90O-0;@1Atnt%~F)46hc-vvl9AL&IT?#C!fhfxgm)Rr3T7tV{UIg6A z?tnp2Ow!=i=Er4ltXY8KWr0Gupi#T_r;8?lLu94lk4zcwdev@Il}Pa7;~B?3X|V)w z1!0QIS&f&wCC_WA(K$5O!hB7?AK_|#3IIOBaX@zDe`&x_p`cc4<^+MR6=YXmlT)#@ zd(c^mYed)jFg!Nj+`>lHPTGLwqdxtdg}$AX6p5%4lMr->X_{VE3AwyewZ{W z8bm6G89uQZ7oky%%A!)|{T4V=WnuG!=-5gFePxp&M1}#`J2mGLj$yAdMUU@*=Le#1i*F)q?@8{;{(l@{VFX}3jYnAUVa``9~fE3SdveHfA3&qAZWsAG3Q{)5QmOne^)u_AV_v;FPP)_eaaDD+6WeyL`Vlf+d?%S z4ip1tMn!pV@b{L2RAssE%EUqS0$dYKb(fkWg;T1|6?4_Vz(iB6I&kHr2CLU-Rlc`^wLfO+fAyS- zG2I;9t#&M2%Z2>%wi!^6huXW#LhG`w)Qe7GV75h*SQZ>{cMwe=u0mR;*_y(Hg=tr? zIUsUXGjEVTo|jX-s3S96F~va@6>p)pYloN)mY=*GwJmn|PAn^5<=q;3=7vbvcHC{^ zcG=#qsD7p5o%UvxB2iwfAvUSy}JVrwdztdrWl7V`Yz`+gW{Ta-mV)mB=NkU zke#S;lEGf<-#bGY;8NacXd^UMmHMqC_&iTPz)UyVT4^_ABhiv*D02taos2$6xUfRj zv`FmEfFU^;m4ebzc*zQ$OGRP(=Vs3EPMGFvXa9g|NANlIV@PPh_sAbWe>t0JYKk$$ z5wd66EZs$=Tv>mLrK?cQZVX<+hgczj8w_qTQ7t719VWlc`3NHHsPx?aPW~<@C~wAFk0Xie>GE(Y;oTl&h_`!^pN_1`l`%)yTHjHdk*|!RNVpJ*(nP2Tv)|uG-^OkXiOy zd{8$^Az?#rJ{d3z*wJ=mdCdSV$B3VW&^dR*zNuMLn63Q!WZ%@ROGK6+b?V1~wh8*+ z*!reTpWnvDqove!9P#cYc?a9c54#&go~C9e`v<~zDyyjewWKkby>r* zvdzdBuafsQpk0W34r45t6g6d2z_#1us3|}DX_#?>tCfwS!yc-qSQ|vD8!=8zvCMHJ z0{FyU1hgk*1zS*m#xy8Tlgjt)JWO7hQ(lhICGY)Y!WQRyau-wVj~K3=mn(RQ{z=ZM3<;IRc2aJ|d|YF# zeba3YUasBBg3mMcYEHLeo2Af@E&CjMTiR`*1L+qJ=-vYVQr~KcA11G|0wx6?&u%`? zSA5Z3u)Nr0pj2iKQr`ZhGwwsBLvoEvt8vha{1K{1*!!i!#f`JL(t+0}ens+*F z4+~Oi-d)RsT?uApfO{sI1s`0@Cpj>$q=^h1G7v0d+!gE&%&gBsKC_>fBR6c4gB-U? z^1}#m7!(&^tE5S${w$BKRP8@8t(#3XUs~u2e-Ekl*%cR~`kJj7J`>lmYS|f8wle3| z2vodT$4V^Z@V6u_qnqPUKom9Ny84_P#-KsrzaftSKW;@JF51mpH~aSnYKAXSPWVJ> zw6;SHQ5!tX*6WES3~gJdNJ&_E1y$WzpNb=Un8xMedy(LIwQ>xz*s(~R8L9=AyKT?YL1q<>}{?; z^F0X~siB~|1z?+3bT8Ri0Z$oBxdC(qf1Hy6r^+2Ag@((>*SdqJ+4=#-x~$PX|ACpw zF%~SCIwn6Efl^Bbqj87U`^Yg7x65OAme8HC(u_0m1QDVmZ2}q-Ky;- z=KvH7N>W!SSL)wB&au=9t0ow=-X|bbfqv8V+kz$4GRS!2la~6Wk1lJtyxjb>e|daZ zMJ(U_<=@eNi%R2z8PHh0a116$dIyS0*wIiC(|er|-AdZg9pkCz6^k*Vcj~>6vtvTZ zIML8q1xH`Tx?9>yM$7f1KX{s}*HF0N3m~-Du#d?x7BJX@R!UPTy@XAUg<(-_-VB~K zfSN?K<0d;nqPd0v6y&Rj*J&Qtf2`C^C3v2?AyH)@rD%-J_0O{qERFqc~RdE;eUOpim=$aM!1LZB0 z$CWKdVoqf^=^){R%2mKwl$X&KbuBg+57%!6!qZ&+K)M~=0lEx5Sjy!Vdy2{V6~&{D z0PRvuu=lnCZEs4$Xk)W^Ru|B+;giG!UE~piN+P{h7r7)`Mbepdf664s2t%fRm%bZX zH~qX$u!@B5fY3i zEM*6Sl66AQuT;#@e>K`tJUO`$wk~}S6~gmmy_(lb_N=fHjeJ++PO_EA;eUdH4hJ;I zlRGO;x?qEQjWlOUP%{;u=QL-O@3kG z#52agHHfc&nW;8_n za71LWLo{elWhs#a!5x5!zc<=yQoKn28On5FV0~@fzRc3g2_=hGzLL}21zRDVu*(LN z>`dq&r<%&RSSS;YTA~KyA3gBR1okp6eOm!sf4#?@h31Yg0#gb|M4wEgHn9W~=t;~j zE?i1lTWqbNYy~Wn)XAvOdPMm->CJh38_DYPryETf&w6*R8%+Zl&#Ie$xN{@pS#$S* zp4&ONv?rR~7ZS}8w7a93oM*zCnFLDCW!CH*>lDJ>P?L=fDZ2-hbXi!XSe-KXD z$$F;e3wh53Evu%LPy>*qfS_d|zz@YCfd;2`lAbk}s~(pK=zjYwvaY0OGCivHvuL^! z!|vg)3r3UmjEt{9nNHTT;?^G$*U5TD?+824?}cft=uNulCG8Ra9d~^XS)#!bEHB|x z3Lif8EA1K6DjHl)`=yxbE-P_Ae`(KJlovo2VB3f%yLZx_#qX&B#H+LMVoUonSuf{R zJ{df!Sf+jNilh>ggkqjgllM$rpIC7_dC%0;v1p30sN|wDlncX4%Q+}xWa;ERQ+-1i z_dG94liu&d40rj-GBw>(Ar})#A_>@i>L>46b@>cQACbvQ&ugK{m6Z48e}JpR$x_Pj zeS8x-0!!~(+1E*ZMj~S=b?=?jXBxUmTum3nBrW?SCPeiQ+9M8pmV!b8nCin_E6u?y z2qiw%EAtsw0Z7iBr)w-sg_6^`zOLd>)@Lh1_4LxjC-$Wdo(#fn0%f11rr09a8R`E>eO?Cd2^SQ!-#x^NhC+Y48cfp zo^`i9tMZ7uApM3-E_efPX9raLw_~5qTpyGgInRg;u!BDbP;wpG?L-^oJBy5p%6p@HXN;lB8Sd$0 z9Oo`@^f5TNmMcp9*zlwy4$$s*Q ztf1X_Xe6_oT~dPNj#oc+At3VN{GxAenIGN_b z8VB;X0L=ldf07w1%#DN(4BLU)g_$c%H!-oqn8C`y9MJde7zi%en52sRGFvY}uv2IO z^NzF=eZ;bWlYGSvgG-TMqI`U$hNER$O$e41_ZoE5&%(TNzl(i@40@G;1{TNtD%B2m z7)F?wWlsoM92rRE06Wi@IK=Ja<>*f)YAqC`PIm^Te?FjA$<7SP?Fmh?vu;Q(5J|Q( zK(MJf+0N)4xh?fRm(&RI!-pTBSozNGiY}cl4?E8{^I?J1@K7SDpvp&fi1ALNR-*RQ zJH$VrIXg6V1*l#Pes0K-YyctOS@HKoF`g#tHD`4?^M>i;E((dOl}^4!uCr#0DBG7j zerT2ae=k~4tZ9sy%s=sx)o=`3dD!b3j^3egrH;V75Ipd6A=#PuV4YE}9r}q1$nIUY zMzXW+x3$8Y?TpH`UCiUh6-&5@Gf zEE#1xV@l7#Jwq5Yw1aBF!M@r1(*N7=9#q zipwYuK2OwZx+;suHoiL|uaWJn8UM*-gi}v7KGfDD+gUe$R7+OG?KUUqZKU=N{3#|) zwzFn@nkozq%Z$5hr=J1-B{5UO%VfB`3JjEJBYSwA-<7CT$r__To_F|mr3JMfouXTW1zT=jgd({O)ouFwiNtbX71Ip12O+ZAXHb}Ru@ zv2Ovcv|JV)?y)K-&Vl4RyNY&L8Y{5$kprYVYc66&TF(BC^~+|XPgC`h)rdgpQ5jT@ z!0YUarn21p;FIJ&Q2&Q57ueg>-xd5ye}lNUts2be#!0T1NOdAzK|f5GRA(9kiN^uC zL$|2z9kHid*d{ZoGTakIklnk^&%>#=^}384gy1Y!e-=zvrZa|kV-)XXI^%sP1&Piw zEx&iNoY5`RuzI&^Hq~u-uw1N$hvh8ZuH8HN9Yb0t&zXin2NpCJ?>!lY(is-gf1EX! z#SKYw7Gu#?UEe`LD36S{3Mj@eskf8(?wQsJCMpkHZ4?ga-E&@bwV zLYgy>{&bvpr!kVvhq*b+8Spblf+di6C3hM*&Mpn@x^t;n3v8?$UdnNnqD-(7NzM#z z^>_`WQGMY9InLs1!3 z>USrX2lk2;=o7y_f!)y9s(L}28CbXBwMcRmq75cqjn1qt+uVk6I(eUMb@`E~J(3E= z-9%1wbJt1=^)U&$&8vo6CsLus&YTYTcqQQmy=&yJB*z(jkG!3MgoOm}M1oV6ZOl%B zwpUDNQg@0ot7pZQd#pzie-t=7Q@Vh1rSH3iHd*#1vgr<2CxT6mv+A-umY%2T<*br7 zD;wO^L&cQi4C(1Ct(6>S0S@Ie*urH<;IYhLSIgj12~w}Lp#q=jiozL&y4zOC#k8(@ zg|gr^hZk0N@CehY#9!z69_M!rQ=O0o^R%XO%r9RprJM|R5f`hEe3p%2y?)*)_a%ms^192yGQSD5-RTAoUm#Zzt*3u?lI`KSNFXz>{v(R`Ri6`br&>?>FPP|FP zwE!YMdWx)3%M>fze}h|vzIU5>;&Uee+8wdYW_KbQxLdM@_R3WxhJg!~BeDzQqUeJT z@#OfnOV>@a(~PCCX0Y z=f#5+7fy4eUpT8kY0iv}9e%aLHrXQWsM4H`OFesJ$BMhWe+VLQWDR~0l%>j3 zhJ{l26#v2H91AL+r^$3?Y)sE;3T!K1eUZ8r&zg`gw$CKdCt0kR(aC*OU*_rMluCq5 zP!);J8hOruw%ws05o0ZkNDOvyR2i2{=Ac%CJY+5Djyt}8-XmK z+hIE)kt~P zwkbKO&OpETSt(!{q2E zA$sjQG70N~mGpJNJg6xV}!$VfzFQ~aS+Jr9R z!nI+YsDQf7btF8ie!bi6Ec!@GC-B{slLS_PT6U}w$;bQ z*Re@Y8tUVHXcO6OmNBuy(v|tl2;AI)%xBH|;Iqo?CD*MF<~lc0pV4^*?@Q&iLmhlX zM+xc|K@jdHI~$OI z)HM6{Wujhl)!{oV8%CbH7*w^o67WJcM&?w(*Upzq`gdT&42l)X-fHqmUMJFpJ6*)0 zskkuQxkC>1>>@0f^uf%^!mFNJCLptm^VlraSKJ*C7VC=e=u#1rH&WJre~rD4MG((lOKrJ)(Cl2pvV*EbrcyM z45YQRAKG#`%MVqjcz2l_&$?Xz2~tohvFTf52_d-4C>U_uxnXPgi?>M6O7b%hv$;9R z&*+>jE&O@A^IX{WK*S=VcZ`fXAgB;6p1i||Smaw)Ke{6Yt=MxmLB)Y0f9|OmfpD8s zMwAr#WLcVWB&35}*MgaV^KrNy8L9 zU4vmwL(FRWSsMs;JBTZJv)g?E28VAT2zNPO7y#DS!^xR!PnTs@A90SiFxZg+t^0K% zr^tYooeJkJ!5PY9r9i8`f0XQoF1WkQB|(BQ;^t&PtL|KO92Q1dp&}9#2oHxcSW6hI zBcQd?6x%B%_cp4jcnAoxs-r6wq->CJ$Hi52KH!!DN)K2$k%KB0n~TxUs`BQW={{!Z zHBVi>OhzE!NV`h@vt~{2^bHqlR|7khM|z;J`+E>K&t;alfZ z3NXuc7tN_TyYFh!e}TX)xScSwdnEx{R2K<^u}bQ5(iuEY)l2*o6TSix@ow6Wg2!u7+(=h*Y#&&LPZfbJ za&)Kp+RloKf9qAn^634p+()u}Rwsm&?^Uto6a6B-S7LCA+U_pPQYt%`bOt@_b!0-T z{(U(~LFRp7THIZ6!|6`(-AII{*N3SEiO@7s!|a?yXe#?6aJ^6RuI_8=aQvb<(lMNs zfa4dxJFoK$^JJgS6Cs7J3?nK_eyCa&Cdmuv9@pKff2@@$k)MXksX@=nj{1h}#u$iX zp_{iav-J`NbHhwF(8~vjVcZ`Ef=XvgGPG{R@A3^aT{_nG%l{1y?j zVaGs#FD#FIg}Ai%Ru=A6#0jL|eaE-X<7{#z+`;*qP_v?<;H|pddl>QdRoJK&&oWR(G~;Bhwo`Lp#FEfr;LeC7_ ze`35NV6v#9oNG(KTqVzzSKSEMEITFXcI|+|2PExe$ z&ZWqvhxfLQ7(8Q1mWC`nYd}fSm}69vG{&Zj$<@6CWv$TFs`eBsayr#I!0#&C*jubM zK7ECq_Z~lIXE;puPv(y1r+Io!SGVP7$JTSlRL#MdeDNW9L#n}I^@ZgG)e21Ze;gD` zpHhFF)Q=ez|Bs}7J@mfC3=ZGG7WwR)5-rP#Ll(pmq570F1e9aEh1rgjXz{!v@{|&- zg&J9wEK-RKNQ_g zhRtoLryx;sqBTRo>|A=AX_fKAx%o&kB+akv&M>WEsF_!!pdMDuPG4QfPM7L-LgSh> zwN5IIf*T<0)Q}1t1+U0Xw_%`YgSzc@BeEju_3F$a%ddAMb5b-F_fGUlTP#m2hGi|5vXABn5oZE35hNO|<&1nVVid*8nMl^9svQJ=8eNjO zfbO+&0q2UncUW^QU!Oa!2R(jIwjL9a+?~Sd%WS=zSc#Dhv}(kNk`@glW}7`}(Tb6x zHXv!ynvtYT&#F^ui;bFX8R#lUvN!~J(W;*(?cH+ZgMjtKA4(jL$kIV9I6E{QG8>W~5rojk%vqWkpVr7cGFTJRHf3b^+&%f6bT7vwD6vh|dGtP! zSBLSDR0SionkJ)-t(15OcJXl=HJO)<;+ve#%zpr_<$n6$P7 z7fFuR{CV>7tsrRIe+zd6M-_E(SQgi zL7I^hOk5jF^Ey~Scc|~EF3Z!D+-N1r8|s@huPV0!Q|BUWm6J`#E2_r?{4`lFQ$j?- zEp(tt6BX&vPyp-iksb}KD6ACe(X#!i?>W+=fi-oQM0zx^f2ev8>CwWe;hrNunxXHh zKk}mibw%DIKUyZ@_td|x13hz_RF3>;JkMSA&X1Oz7w4WMKN`qeBNX}3K;}}3Mt(Fq zET8%#KN<>dEwIRs2J+W}i2P_^V`UkO{Ahqt&1mFD1FWi@&W~oDZN2Bnk7lQeO80Dt zM!7-vZ79})f7bIU00@^{-g4weyCM?5OxH^+?1Wnae0Nc)o+92&aZ{v5159>qp~TfO z{CyQS1=U&xn_R?N9CsxZ?S!duX^=e{?%X41jjeBHcV@IKE4=b&%O4T;qhw*Cp>dk4 ze59+=&zBy+SvR3NF$`7Jjh~ey zoup{xcEurnnxmIf=@eUNK-=Ma%7=#RB&jPG8Ie~(PFplHDEB5V=-6L*duF&N2e`^oXpju88xm_}$?Y+PDp^ZK z)3C#jSO!nBp@k;~dEyn#1O}EXCO)#ED#qr*J)oGS6L;`(V>#G~*yMY`5pfxW>Sm@9 zc1oOwGhDZ~OI<7L?KU~Zy1(fk$;EK3=vaGee+f)2J0;oB!UtRT7m*FE_c>>Q z=Bmqy`-FLA>(zkT+hN*ODLD?fSem|_;yRiYiF0WE}m!WB?eX;G&Bse4^FbSIM`^9yLJwch*NEG zl3szxI)i5ogUoIcO59Z+POwuRnAa8xe=?%=z`Vs~O{S)MDrD_sC_6dPxOs@F?Iu^K zS(-7iFP$g)L6Caj%4${eNY^b%25O@?3%hcn0fEiX$%#hqFuzEXX5FiA|7j0IOj0zW z6PZ^5jUL%In;~jkvc%mA=xQ4gpeCtOSv#LjTY+$i7*(iFJTFrvIne_0Hk*(efAc!Y zIre3;UgzV{jb6);SJ9#)ZuAZlkc+IFHo=N>t4;}>a}dhiq;K@wFAkD z#{1JZXAqXJYiUtJ6`l8pdf6@*--Xo8D_vmO9OSNx^yl@(xVX_n^B`>^^5=>)O z2@tZP1%@5&-ncL=cQHxDGF+|&j?VSGs&CtfETy7~Sb?7=>vd8dX~fhL>^?ZkVr>{< zw%?H?WmImZ$H$wNDLSAA$x_cNaHohisttxb}h1^@xJn+HS(S5@oH}2v}mUYLvLh7qj$Ew zNTbHQ>iRP(-%KlsvFX-{i%azJB|9K zgCu*|UMtFXjFxPB^0_irDvce291ED6$$@^JC)!{eaO^yC3X`%6qXyS^YfMT! zH~D>R?i&W6s630if8uNy?}zBRJ#&yK?v#mCI%|l?*z-JAz`Szc_{q=8t`O9x^f4}(tyWf8Oo0SV1gJx}B zV$76Zl_Aqz6|-@(@RUo128=7xSd{B&z$yc*0Tc3n{NA=FVB=0e&t&7)fR*)*_(QNs znVj#4-|h}0z;Ir-a6!m$)1=2e#ej`@4ahBmd}9D(z-Ec}>m7?Qa@9#b zY$2?RD4agoe=^-}k66l2E4UpbbNOGfI<2w#Era^9MS?&k(#~wZyu)!pse{!tuyE)w zu;B=E6$L zc5jP$f9EyzVs49@A-809)%ddOhQ*qE20r~hx&6*!PPk5X_|qrE zmjj~40dcoyP%KMlrW&!#y3dEF!TvZOI3E7`e?Qy#(Bgckmgm>;z?jEa1&mEGR{lcu z(NIbp4JnR>;fbhTScKMXe}aT4q=dOat)#;ym#G$#7OaImM;6{%Iplr$BJcNq$@>@b zepucUMuMA%M|Xs)6oU`zc8Kos$;`Pg=cWFEJBj5C0)+hTURD<_xIV*fZLx6Jt@FQx zfA_y%M2K+qfNN(!R0QUdaqEn}4rNak8tt$mX^_O4|{dwKn(Lo=qzQ71Wp`d z$$9!Kt4qE;1S<(ed7Z>}Hc)hzg|Y3|ctf(-#W?#wDlsgIUzjc{bG&q;Bi<)IPjPJR zQ@P@YCVK9-Z2AeGJf8SA+tn2%zT6VO5N4;^7kn8AD^1jt<8)9I8JBf9Zyt z0d(+=;_)8_4BA$x$jpqFY8~$%{29NmQ+5(c%Gt$6F(K}Td;^w`c|JZ!PRQ3-ySCAx zcc^G5st@j6JgfKw->9c>p4rqW8N#_n)?JT@IyK1k5EHiD`55WWlnaSHfZrL*fL7x?>KO%1E96Jd*A`nek|O-OZj+l(8m1ebVBxz`Ky=+IJuz+LfC3QZ{skf8@_tZ7P30jXpqdoBH1udO~K!9YW?#woDF#0h+BrKICCS z?&TchWS~cruOCH43gAK=+(dsjRpDo);<+2(!CcVEfh)sg(=7;i_?-IP@&{auRG#J} zD^DK@Jvd1#S4{wlMjzz7lj`GF-0g+P3peW8jYyJ8zNrUc!>~2lf4Z^Ouo)OUEjE>9 z7g2I`riIGNU`OZ_jTI5BGt^bFg`NiY&!nxQ?_qB#@0QC96IftO$jBl�@bC8)^CT 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 y4*r+E<$oIZuLlC>C+-~J!$=V(*_ delta 9296 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 diff --git a/lib/themes/theme_service.dart b/lib/themes/theme_service.dart index 1915239a5..542c6375e 100644 --- a/lib/themes/theme_service.dart +++ b/lib/themes/theme_service.dart @@ -31,9 +31,7 @@ final pThemeService = Provider((ref) { }); class ThemeService { - // dumb quick conditional based on name. Should really be done better - static const _currentDefaultThemeVersion = - AppConfig.appName == "Campfire" ? 17 : 16; + static const _currentDefaultThemeVersion = 17; ThemeService._(); static ThemeService? _instance; static ThemeService get instance => _instance ??= ThemeService._(); @@ -61,9 +59,7 @@ class ThemeService { final jsonString = utf8.decode(themeJsonFiles.first.content as List); final json = jsonDecode(jsonString) as Map; - final theme = StackTheme.fromJson( - json: Map.from(json), - ); + final theme = StackTheme.fromJson(json: Map.from(json)); try { theme.assets; @@ -96,11 +92,12 @@ class ThemeService { Future remove({required String themeId}) async { final themesDir = StackFileSystem.themesDir!; - final isarId = await db.isar.stackThemes - .where() - .themeIdEqualTo(themeId) - .idProperty() - .findFirst(); + final isarId = + await db.isar.stackThemes + .where() + .themeIdEqualTo(themeId) + .idProperty() + .findFirst(); if (isarId != null) { await db.isar.writeTxn(() async { await db.isar.stackThemes.delete(isarId); @@ -184,22 +181,27 @@ class ThemeService { try { final response = await client.get( url: Uri.parse("$baseServerUrl/themes"), - proxyInfo: Prefs.instance.useTor - ? TorService.sharedInstance.getProxyInfo() - : null, + proxyInfo: + Prefs.instance.useTor + ? TorService.sharedInstance.getProxyInfo() + : null, ); final jsonList = jsonDecode(response.body) as List; - final result = List>.from(jsonList) - .map((e) => StackThemeMetaData.fromMap(e)) - .where((e) => e.id != "light" && e.id != "dark") - .toList(); + final result = + List>.from(jsonList) + .map((e) => StackThemeMetaData.fromMap(e)) + .where((e) => e.id != "light" && e.id != "dark") + .toList(); return result; } catch (e, s) { - Logging.instance - .w("Failed to fetch themes list: ", error: e, stackTrace: s); + Logging.instance.w( + "Failed to fetch themes list: ", + error: e, + stackTrace: s, + ); rethrow; } } @@ -210,9 +212,10 @@ class ThemeService { try { final response = await client.get( url: Uri.parse("$baseServerUrl/theme/${themeMetaData.id}"), - proxyInfo: Prefs.instance.useTor - ? TorService.sharedInstance.getProxyInfo() - : null, + proxyInfo: + Prefs.instance.useTor + ? TorService.sharedInstance.getProxyInfo() + : null, ); final bytes = Uint8List.fromList(response.bodyBytes); @@ -228,8 +231,11 @@ class ThemeService { ); } } catch (e, s) { - Logging.instance - .w("Failed to fetch themes list: ", error: e, stackTrace: s); + Logging.instance.w( + "Failed to fetch themes list: ", + error: e, + stackTrace: s, + ); rethrow; } } @@ -270,9 +276,10 @@ class StackThemeMetaData { ); } catch (e, s) { Logging.instance.f( - "Failed to create instance of StackThemeMetaData using $map", - error: e, - stackTrace: s); + "Failed to create instance of StackThemeMetaData using $map", + error: e, + stackTrace: s, + ); rethrow; } } From b3e02b64de18e6a449baa34c1af1e3ec1adca924 Mon Sep 17 00:00:00 2001 From: Julian Date: Mon, 17 Mar 2025 17:16:05 -0600 Subject: [PATCH 144/193] use standard app dir --- lib/utilities/stack_file_system.dart | 23 +++++++++++++++++-- .../wallet/intermediate/lib_xelis_wallet.dart | 9 ++++---- 2 files changed, 25 insertions(+), 7 deletions(-) diff --git a/lib/utilities/stack_file_system.dart b/lib/utilities/stack_file_system.dart index 67b992bbc..217b33eeb 100644 --- a/lib/utilities/stack_file_system.dart +++ b/lib/utilities/stack_file_system.dart @@ -39,8 +39,9 @@ abstract class StackFileSystem { // todo: can merge and do same as regular linux home dir? if (Util.isArmLinux) { appDirectory = await getApplicationDocumentsDirectory(); - appDirectory = - Directory("${appDirectory.path}/.${AppConfig.appDefaultDataDirName}"); + appDirectory = Directory( + "${appDirectory.path}/.${AppConfig.appDefaultDataDirName}", + ); } else if (Platform.isLinux) { if (_overrideDesktopDirPath != null) { appDirectory = Directory(_overrideDesktopDirPath!); @@ -148,6 +149,24 @@ abstract class StackFileSystem { } } + static Future applicationXelisDirectory() async { + final root = await applicationRootDirectory(); + final dir = Directory("${root.path}/xelis"); + if (!dir.existsSync()) { + await dir.create(); + } + return dir; + } + + static Future applicationXelisTableDirectory() async { + final xelis = await applicationXelisDirectory(); + final dir = Directory("${xelis.path}/table"); + if (!dir.existsSync()) { + await dir.create(); + } + return dir; + } + static Future initThemesDir() async { final root = await applicationRootDirectory(); diff --git a/lib/wallets/wallet/intermediate/lib_xelis_wallet.dart b/lib/wallets/wallet/intermediate/lib_xelis_wallet.dart index 626b83c94..063c61362 100644 --- a/lib/wallets/wallet/intermediate/lib_xelis_wallet.dart +++ b/lib/wallets/wallet/intermediate/lib_xelis_wallet.dart @@ -4,12 +4,12 @@ import 'dart:convert'; import 'package:flutter/foundation.dart'; import 'package:isar/isar.dart'; import 'package:mutex/mutex.dart'; -import 'package:path_provider/path_provider.dart'; import 'package:xelis_dart_sdk/xelis_dart_sdk.dart' as xelis_sdk; import 'package:xelis_flutter/src/api/network.dart' as x_network; import 'package:xelis_flutter/src/api/wallet.dart' as x_wallet; import '../../../models/isar/models/blockchain_data/address.dart'; +import '../../../utilities/stack_file_system.dart'; import '../../crypto_currency/crypto_currency.dart'; import '../../crypto_currency/intermediate/electrum_currency.dart'; import '../wallet.dart'; @@ -174,7 +174,6 @@ abstract class LibXelisWallet final syncMutex = Mutex(); Timer? timer; - String? tablePath; StreamSubscription? _eventSubscription; @@ -182,7 +181,7 @@ abstract class LibXelisWallet if (kIsWeb) { return ""; } else { - final appDir = await getApplicationSupportDirectory(); + final appDir = await StackFileSystem.applicationXelisTableDirectory(); return "${appDir.path}/"; } } @@ -326,9 +325,9 @@ abstract class LibXelisWallet wasNull = true; final tablePath = await getPrecomputedTablesPath(); final tableState = await getTableState(); - final appDir = await getApplicationDocumentsDirectory(); + final xelisDir = await StackFileSystem.applicationXelisDirectory(); final String name = walletId; - final String directory = appDir.path; + final String directory = xelisDir.path; final password = await secureStorageInterface.read( key: Wallet.mnemonicPassphraseKey(walletId: info.walletId), ); From 5adfee831ec008d4e071ea5043c7502e29e7bfc7 Mon Sep 17 00:00:00 2001 From: Julian Date: Mon, 17 Mar 2025 17:19:07 -0600 Subject: [PATCH 145/193] Use logger --- .../wallet/intermediate/lib_xelis_wallet.dart | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/lib/wallets/wallet/intermediate/lib_xelis_wallet.dart b/lib/wallets/wallet/intermediate/lib_xelis_wallet.dart index 063c61362..5146c6aed 100644 --- a/lib/wallets/wallet/intermediate/lib_xelis_wallet.dart +++ b/lib/wallets/wallet/intermediate/lib_xelis_wallet.dart @@ -9,6 +9,7 @@ import 'package:xelis_flutter/src/api/network.dart' as x_network; import 'package:xelis_flutter/src/api/wallet.dart' as x_wallet; import '../../../models/isar/models/blockchain_data/address.dart'; +import '../../../utilities/logger.dart'; import '../../../utilities/stack_file_system.dart'; import '../../crypto_currency/crypto_currency.dart'; import '../../crypto_currency/intermediate/electrum_currency.dart'; @@ -344,7 +345,7 @@ abstract class LibXelisWallet libXelisWallet = await syncMutex.protect(() async { if (needsCreation == 'true') { - debugPrint("Xelis: creating new wallet"); + Logging.instance.i("Xelis: creating new wallet"); final wallet = await x_wallet.createXelisWallet( name: name, directory: directory, @@ -371,7 +372,7 @@ abstract class LibXelisWallet invalidSeedLengthCheck(seedLength); - debugPrint("Xelis: recovering wallet"); + Logging.instance.i("Xelis: recovering wallet"); final wallet = await x_wallet.createXelisWallet( name: name, directory: directory, @@ -393,7 +394,7 @@ abstract class LibXelisWallet return wallet; } else { - debugPrint("Xelis: opening existing wallet"); + Logging.instance.i("Xelis: opening existing wallet"); return await x_wallet.openXelisWallet( name: name, directory: directory, @@ -413,9 +414,9 @@ abstract class LibXelisWallet } }); - debugPrint("Checking for upgradability"); + Logging.instance.i("Xelis: Checking for upgradability"); if (await isTableUpgradeAvailable()) { - debugPrint("Generating large tables in background"); + Logging.instance.i("Xelis: Generating large tables in background"); unawaited(updateTablesToDesiredSize()); } } @@ -533,7 +534,7 @@ extension XelisTableManagement on LibXelisWallet { ), ); - debugPrint("Table upgrade done"); + Logging.instance.i("Xelis: Table upgrade done"); LibXelisWallet._tableGenerationCompleter!.complete(); } catch (e) { // Logging.instance.log( From 1cddb14bf1d08ae66bcd7be87f4469c87fa1b95b Mon Sep 17 00:00:00 2001 From: dethe <76167420+detherminal@users.noreply.github.com> Date: Mon, 17 Mar 2025 18:34:08 +0300 Subject: [PATCH 146/193] feat: detect bitcoin/monero uri's fix: use uri instead of manual parsing reformat: remove braces and use efficient variables refactor: add forgotten vars --- lib/pages/send_view/send_view.dart | 51 +++++++++++++++++++++++++----- 1 file changed, 43 insertions(+), 8 deletions(-) diff --git a/lib/pages/send_view/send_view.dart b/lib/pages/send_view/send_view.dart index 7d063ba6f..6fb8af4bf 100644 --- a/lib/pages/send_view/send_view.dart +++ b/lib/pages/send_view/send_view.dart @@ -1350,11 +1350,31 @@ class _SendViewState extends ConsumerState { selectAll: false, ), onChanged: (newValue) { - _address = newValue.trim(); + final trimmed = newValue.trim(); + + if ((trimmed.length - (_address?.length ?? 0)).abs() > 1) { + if (coin is Monero && Uri.parse(trimmed).scheme == "monero") { + final parsedUri = Uri.parse(trimmed); + final addr = parsedUri.path; + sendToController.text = addr; + _address = addr; + cryptoAmountController.text = parsedUri.queryParameters["tx_amount"] ?? ""; + } else if (coin is Bitcoin && Uri.parse(trimmed).scheme == "bitcoin") { + final parsedUri = Uri.parse(trimmed); + final addr = parsedUri.path; + sendToController.text = addr; + _address = addr; + cryptoAmountController.text = parsedUri.queryParameters["amount"] ?? ""; + } + } else { + sendToController.text = trimmed; + _address = trimmed; + } + _setValidAddressProviders(_address); setState(() { - _addressToggleFlag = newValue.isNotEmpty; + _addressToggleFlag = trimmed.isNotEmpty; }); }, focusNode: _addressFocusNode, @@ -1433,13 +1453,28 @@ class _SendViewState extends ConsumerState { content, ); } - sendToController.text = - content.trim(); - _address = content.trim(); - _setValidAddressProviders( - _address, - ); + final trimmed = content.trim(); + + if (coin is Monero && Uri.parse(trimmed).scheme == "monero") { + final parsedUri = Uri.parse(trimmed); + final addr = parsedUri.path; + sendToController.text = addr; + _address = addr; + cryptoAmountController.text = parsedUri.queryParameters["tx_amount"] ?? ""; + } else if (coin is Bitcoin && Uri.parse(trimmed).scheme == "bitcoin") { + final parsedUri = Uri.parse(trimmed); + final addr = parsedUri.path; + sendToController.text = addr; + _address = addr; + cryptoAmountController.text = parsedUri.queryParameters["amount"] ?? ""; + } else { + sendToController.text = trimmed; + _address = trimmed; + } + + _setValidAddressProviders(_address,); + setState(() { _addressToggleFlag = sendToController From d835b142301dd1b332f22c78593d0131c1208101 Mon Sep 17 00:00:00 2001 From: dethe <76167420+detherminal@users.noreply.github.com> Date: Tue, 18 Mar 2025 13:31:28 +0300 Subject: [PATCH 147/193] fix: controller positioning --- lib/pages/send_view/send_view.dart | 1 - 1 file changed, 1 deletion(-) diff --git a/lib/pages/send_view/send_view.dart b/lib/pages/send_view/send_view.dart index 6fb8af4bf..1e6f33970 100644 --- a/lib/pages/send_view/send_view.dart +++ b/lib/pages/send_view/send_view.dart @@ -1367,7 +1367,6 @@ class _SendViewState extends ConsumerState { cryptoAmountController.text = parsedUri.queryParameters["amount"] ?? ""; } } else { - sendToController.text = trimmed; _address = trimmed; } From ce5d9d43e11cf8e0c985374a63c60eb923ac186f Mon Sep 17 00:00:00 2001 From: Julian Date: Tue, 18 Mar 2025 09:04:50 -0600 Subject: [PATCH 148/193] use Platform.pathSeparator --- lib/utilities/stack_file_system.dart | 4 ++-- lib/wallets/wallet/intermediate/lib_xelis_wallet.dart | 3 ++- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/lib/utilities/stack_file_system.dart b/lib/utilities/stack_file_system.dart index 217b33eeb..795ea9720 100644 --- a/lib/utilities/stack_file_system.dart +++ b/lib/utilities/stack_file_system.dart @@ -151,7 +151,7 @@ abstract class StackFileSystem { static Future applicationXelisDirectory() async { final root = await applicationRootDirectory(); - final dir = Directory("${root.path}/xelis"); + final dir = Directory("${root.path}${Platform.pathSeparator}xelis"); if (!dir.existsSync()) { await dir.create(); } @@ -160,7 +160,7 @@ abstract class StackFileSystem { static Future applicationXelisTableDirectory() async { final xelis = await applicationXelisDirectory(); - final dir = Directory("${xelis.path}/table"); + final dir = Directory("${xelis.path}${Platform.pathSeparator}table"); if (!dir.existsSync()) { await dir.create(); } diff --git a/lib/wallets/wallet/intermediate/lib_xelis_wallet.dart b/lib/wallets/wallet/intermediate/lib_xelis_wallet.dart index 5146c6aed..8e5fbb3c0 100644 --- a/lib/wallets/wallet/intermediate/lib_xelis_wallet.dart +++ b/lib/wallets/wallet/intermediate/lib_xelis_wallet.dart @@ -1,5 +1,6 @@ import 'dart:async'; import 'dart:convert'; +import 'dart:io'; import 'package:flutter/foundation.dart'; import 'package:isar/isar.dart'; @@ -183,7 +184,7 @@ abstract class LibXelisWallet return ""; } else { final appDir = await StackFileSystem.applicationXelisTableDirectory(); - return "${appDir.path}/"; + return "${appDir.path}${Platform.pathSeparator}"; } } From 6361d9f04834e206f52b471fc124f98a7ca4be9e Mon Sep 17 00:00:00 2001 From: Julian Date: Tue, 18 Mar 2025 09:05:11 -0600 Subject: [PATCH 149/193] WIP: wallet exists check --- lib/wallets/wallet/intermediate/lib_xelis_wallet.dart | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/lib/wallets/wallet/intermediate/lib_xelis_wallet.dart b/lib/wallets/wallet/intermediate/lib_xelis_wallet.dart index 8e5fbb3c0..92178d93e 100644 --- a/lib/wallets/wallet/intermediate/lib_xelis_wallet.dart +++ b/lib/wallets/wallet/intermediate/lib_xelis_wallet.dart @@ -319,6 +319,15 @@ abstract class LibXelisWallet ), ]; + static Future checkWalletExists(String walletId) async { + final xelisDir = await StackFileSystem.applicationXelisDirectory(); + final walletDir = Directory( + "${xelisDir.path}${Platform.pathSeparator}$walletId", + ); + // TODO: should we check for certain files within the dir? + return await walletDir.exists(); + } + @override Future open() async { bool wasNull = false; From 2298a12afb8de7f4f9a8920a26bfb0edf88c98f0 Mon Sep 17 00:00:00 2001 From: Julian Date: Tue, 18 Mar 2025 14:48:22 -0600 Subject: [PATCH 150/193] update themes --- .../default_themes/stack_duo/dark.zip | Bin 1006992 -> 1157580 bytes .../default_themes/stack_duo/light.zip | Bin 954883 -> 1103976 bytes .../default_themes/stack_wallet/dark.zip | Bin 1157605 -> 1157580 bytes .../default_themes/stack_wallet/light.zip | Bin 1103991 -> 1103976 bytes 4 files changed, 0 insertions(+), 0 deletions(-) diff --git a/asset_sources/default_themes/stack_duo/dark.zip b/asset_sources/default_themes/stack_duo/dark.zip index 1e5f6136e3bcdb12c953ed144a203d6ac35d9fe0..8b31f4278dad0f955b95ffc1f518f76b28ec9643 100644 GIT binary patch delta 158844 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

!Bjq3OPjp22drzY785OXn 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 f~6WbSm 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
getMyNotificationAddress() async { - final storedAddress = await mainDB - .getAddresses(walletId) - .filter() - .subTypeEqualTo(AddressSubType.paynymNotification) - .and() - .typeEqualTo(AddressType.p2pkh) - .and() - .not() - .typeEqualTo(AddressType.nonWallet) - .findFirst(); + final storedAddress = + await mainDB + .getAddresses(walletId) + .filter() + .subTypeEqualTo(AddressSubType.paynymNotification) + .and() + .typeEqualTo(AddressType.p2pkh) + .and() + .not() + .typeEqualTo(AddressType.nonWallet) + .findFirst(); if (storedAddress != null) { return storedAddress; } else { final root = await _getRootNode(); final node = root.derivePath( - _basePaynymDerivePath( - testnet: info.coin.network.isTestNet, - ), + _basePaynymDerivePath(testnet: info.coin.network.isTestNet), ); final paymentCode = PaymentCode.fromBip32Node( node, @@ -1493,23 +1532,19 @@ mixin PaynymInterface pubkey: paymentCode.notificationPublicKey(), ); - final addressString = btc_dart - .P2PKH( - data: data, - network: networkType, - ) - .data - .address!; + final addressString = + btc_dart.P2PKH(data: data, network: networkType).data.address!; Address address = Address( walletId: walletId, value: addressString, publicKey: paymentCode.getPubKey(), derivationIndex: 0, - derivationPath: DerivationPath() - ..value = _notificationDerivationPath( - testnet: info.coin.network.isTestNet, - ), + derivationPath: + DerivationPath() + ..value = _notificationDerivationPath( + testnet: info.coin.network.isTestNet, + ), type: AddressType.p2pkh, subType: AddressSubType.paynymNotification, otherData: await storeCode(paymentCode.toString()), @@ -1520,16 +1555,17 @@ mixin PaynymInterface // beginning to see if there already was notification address. This would // lead to a Unique Index violation error await mainDB.isar.writeTxn(() async { - final storedAddress = await mainDB - .getAddresses(walletId) - .filter() - .subTypeEqualTo(AddressSubType.paynymNotification) - .and() - .typeEqualTo(AddressType.p2pkh) - .and() - .not() - .typeEqualTo(AddressType.nonWallet) - .findFirst(); + final storedAddress = + await mainDB + .getAddresses(walletId) + .filter() + .subTypeEqualTo(AddressSubType.paynymNotification) + .and() + .typeEqualTo(AddressType.p2pkh) + .and() + .not() + .typeEqualTo(AddressType.nonWallet) + .findFirst(); if (storedAddress == null) { await mainDB.isar.addresses.put(address); @@ -1607,45 +1643,43 @@ mixin PaynymInterface overrideAddresses ?? await fetchAddressesForElectrumXScan(); // Separate receiving and change addresses. - final Set receivingAddresses = allAddressesOld - .where( - (e) => - e.subType == AddressSubType.receiving || - e.subType == AddressSubType.paynymNotification || - e.subType == AddressSubType.paynymReceive, - ) - .map((e) => e.value) - .toSet(); - final Set changeAddresses = allAddressesOld - .where((e) => e.subType == AddressSubType.change) - .map((e) => e.value) - .toSet(); + final Set receivingAddresses = + allAddressesOld + .where( + (e) => + e.subType == AddressSubType.receiving || + e.subType == AddressSubType.paynymNotification || + e.subType == AddressSubType.paynymReceive, + ) + .map((e) => e.value) + .toSet(); + final Set changeAddresses = + allAddressesOld + .where((e) => e.subType == AddressSubType.change) + .map((e) => e.value) + .toSet(); // Remove duplicates. final allAddressesSet = {...receivingAddresses, ...changeAddresses}; // Fetch history from ElectrumX. - final List> allTxHashes = - await fetchHistory(allAddressesSet); - - final unconfirmedTxs = await mainDB.isar.transactionV2s - .where() - .walletIdEqualTo(walletId) - .filter() - .heightIsNull() - .or() - .heightEqualTo(0) - .txidProperty() - .findAll(); - - allTxHashes.addAll( - unconfirmedTxs.map( - (e) => { - "tx_hash": e, - }, - ), + final List> allTxHashes = await fetchHistory( + allAddressesSet, ); + final unconfirmedTxs = + await mainDB.isar.transactionV2s + .where() + .walletIdEqualTo(walletId) + .filter() + .heightIsNull() + .or() + .heightEqualTo(0) + .txidProperty() + .findAll(); + + allTxHashes.addAll(unconfirmedTxs.map((e) => {"tx_hash": e})); + // Only parse new txs (not in db yet). final List> allTransactions = []; for (final txHash in allTxHashes) { @@ -1670,16 +1704,17 @@ mixin PaynymInterface } catch (e) { // tx no longer exists then delete from local db if (e.toString().contains( - "JSON-RPC error 2: daemon error: DaemonError({'code': -5, " - "'message': 'No such mempool or blockchain transaction", - )) { + "JSON-RPC error 2: daemon error: DaemonError({'code': -5, " + "'message': 'No such mempool or blockchain transaction", + )) { await mainDB.isar.writeTxn( - () async => await mainDB.isar.transactionV2s - .where() - .walletIdEqualTo(walletId) - .filter() - .txidEqualTo(txid) - .deleteFirst(), + () async => + await mainDB.isar.transactionV2s + .where() + .walletIdEqualTo(walletId) + .filter() + .txidEqualTo(txid) + .deleteFirst(), ); continue; } else { @@ -1802,8 +1837,9 @@ mixin PaynymInterface TransactionSubType subType = TransactionSubType.none; if (outputs.length > 1 && inputs.isNotEmpty) { for (int i = 0; i < outputs.length; i++) { - final List? scriptChunks = - outputs[i].scriptPubKeyAsm?.split(" "); + final List? scriptChunks = outputs[i].scriptPubKeyAsm?.split( + " ", + ); if (scriptChunks?.length == 2 && scriptChunks?[0] == "OP_RETURN") { final blindedPaymentCode = scriptChunks![1]; final bytes = blindedPaymentCode.toUint8ListFromHex; @@ -1856,7 +1892,8 @@ mixin PaynymInterface txid: txData["txid"] as String, height: txData["height"] as int?, version: txData["version"] as int, - timestamp: txData["blocktime"] as int? ?? + timestamp: + txData["blocktime"] as int? ?? DateTime.timestamp().millisecondsSinceEpoch ~/ 1000, inputs: List.unmodifiable(inputs), outputs: List.unmodifiable(outputs), @@ -1872,12 +1909,8 @@ mixin PaynymInterface } @override - Future< - ({ - String? blockedReason, - bool blocked, - String? utxoLabel, - })> checkBlockUTXO( + Future<({String? blockedReason, bool blocked, String? utxoLabel})> + checkBlockUTXO( Map jsonUTXO, String? scriptPubKeyHex, Map? jsonTX, @@ -1905,7 +1938,8 @@ mixin PaynymInterface blocked = true; blockedReason = "Incoming paynym notification transaction."; } else { - blockedReason = "Paynym notification change output. Incautious " + blockedReason = + "Paynym notification change output. Incautious " "handling of change outputs from notification transactions " "may cause unintended loss of privacy."; utxoLabel = blockedReason; @@ -1920,23 +1954,21 @@ mixin PaynymInterface return ( blockedReason: blockedReason, blocked: blocked, - utxoLabel: utxoLabel + utxoLabel: utxoLabel, ); } @override FilterOperation? get transactionFilterOperation => FilterGroup.not( - const FilterGroup.and( - [ - FilterCondition.equalTo( - property: r"subType", - value: TransactionSubType.bip47Notification, - ), - FilterCondition.equalTo( - property: r"type", - value: TransactionType.incoming, - ), - ], - ), - ); + const FilterGroup.and([ + FilterCondition.equalTo( + property: r"subType", + value: TransactionSubType.bip47Notification, + ), + FilterCondition.equalTo( + property: r"type", + value: TransactionType.incoming, + ), + ]), + ); } diff --git a/scripts/app_config/templates/pubspec.template b/scripts/app_config/templates/pubspec.template index 62b1947ca..7f9d25c86 100644 --- a/scripts/app_config/templates/pubspec.template +++ b/scripts/app_config/templates/pubspec.template @@ -38,7 +38,7 @@ dependencies: flutter_libsparkmobile: git: url: https://github.com/cypherstack/flutter_libsparkmobile.git - ref: ca0c72cecc40fc0bfbafc0d26af675d973ab516b + ref: 33e1034911b842c57bdf6ddaa825cbf635a0c9db # cs_monero compat (unpublished) compat: @@ -176,12 +176,7 @@ dependencies: convert: ^3.1.1 flutter_hooks: ^0.20.3 meta: ^1.9.1 -# coinlib_flutter: ^2.1.0-rc.1 - coinlib_flutter: - git: - url: https://github.com/julian-CStack/coinlib.git - ref: 0acacfd17eacf72135c693a7b862bd9b7cc56739 - path: coinlib_flutter + coinlib_flutter: ^3.0.0 electrum_adapter: git: url: https://github.com/cypherstack/electrum_adapter.git @@ -261,18 +256,9 @@ dependency_overrides: # needed for dart 3.5+ (at least for now) win32: ^5.5.4 - # coin lib git for testing while waiting for publishing - coinlib: - git: - url: https://github.com/julian-CStack/coinlib.git - ref: 0acacfd17eacf72135c693a7b862bd9b7cc56739 - path: coinlib - - coinlib_flutter: - git: - url: https://github.com/julian-CStack/coinlib.git - ref: 0acacfd17eacf72135c693a7b862bd9b7cc56739 - path: coinlib_flutter + # namecoin names lib needs to be updated + coinlib: ^3.0.0 + coinlib_flutter: ^3.0.0 bip47: git: From 72fa218a98264d61eda7690d06b73c2381a0c87b Mon Sep 17 00:00:00 2001 From: julian Date: Thu, 27 Mar 2025 09:39:03 -0600 Subject: [PATCH 170/193] update liblelantus --- crypto_plugins/flutter_liblelantus | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/crypto_plugins/flutter_liblelantus b/crypto_plugins/flutter_liblelantus index 89f05ee42..30bc004bd 160000 --- a/crypto_plugins/flutter_liblelantus +++ b/crypto_plugins/flutter_liblelantus @@ -1 +1 @@ -Subproject commit 89f05ee42754f80da036ddcf31c7b1e1dc3b4a83 +Subproject commit 30bc004bd7cadd635e943d29033a8d261cbc1eda From a62b58041a53389fed5f84d4818edba7100d3ddc Mon Sep 17 00:00:00 2001 From: julian Date: Thu, 27 Mar 2025 10:43:31 -0600 Subject: [PATCH 171/193] clean up scripts --- pubspec.lock | 28 +++++++++++++-------------- scripts/android/build_all.sh | 6 ------ scripts/android/build_all_campfire.sh | 5 ----- scripts/android/build_all_duo.sh | 5 ----- scripts/android/config.sh | 2 -- scripts/android/install_ndk.sh | 21 -------------------- scripts/ios/build_all.sh | 4 ---- scripts/ios/build_all_campfire.sh | 4 ---- scripts/ios/build_all_duo.sh | 4 ---- scripts/linux/build_all.sh | 4 ---- scripts/linux/build_all_campfire.sh | 4 ---- scripts/linux/build_all_duo.sh | 3 --- scripts/macos/build_all.sh | 6 ------ scripts/macos/build_all_campfire.sh | 7 ------- scripts/macos/build_all_duo.sh | 6 ------ scripts/rust_version.sh | 28 --------------------------- scripts/windows/build_all.sh | 4 ---- scripts/windows/build_all_campfire.sh | 4 ---- scripts/windows/build_all_duo.sh | 4 ---- 19 files changed, 13 insertions(+), 136 deletions(-) delete mode 100755 scripts/android/install_ndk.sh delete mode 100755 scripts/rust_version.sh diff --git a/pubspec.lock b/pubspec.lock index 8bdf56e80..c74b3910d 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -352,21 +352,19 @@ packages: coinlib: dependency: "direct overridden" description: - path: coinlib - ref: "0acacfd17eacf72135c693a7b862bd9b7cc56739" - resolved-ref: "0acacfd17eacf72135c693a7b862bd9b7cc56739" - url: "https://github.com/julian-CStack/coinlib.git" - source: git - version: "2.2.0" + name: coinlib + sha256: f99c090ca300b6c9b5414dc100f7f36f49a5a2af31d477b3ce04a605c5f1103c + url: "https://pub.dev" + source: hosted + version: "3.1.0" coinlib_flutter: dependency: "direct main" description: - path: coinlib_flutter - ref: "0acacfd17eacf72135c693a7b862bd9b7cc56739" - resolved-ref: "0acacfd17eacf72135c693a7b862bd9b7cc56739" - url: "https://github.com/julian-CStack/coinlib.git" - source: git - version: "2.2.0" + name: coinlib_flutter + sha256: "185c622986d12d2ccda98f151ce047360464dd7a6cbb6877781a9816d14bb8c4" + url: "https://pub.dev" + source: hosted + version: "3.0.0" collection: dependency: transitive description: @@ -832,8 +830,8 @@ packages: dependency: "direct main" description: path: "." - ref: ca0c72cecc40fc0bfbafc0d26af675d973ab516b - resolved-ref: ca0c72cecc40fc0bfbafc0d26af675d973ab516b + ref: "33e1034911b842c57bdf6ddaa825cbf635a0c9db" + resolved-ref: "33e1034911b842c57bdf6ddaa825cbf635a0c9db" url: "https://github.com/cypherstack/flutter_libsparkmobile.git" source: git version: "0.0.2" @@ -1247,7 +1245,7 @@ packages: path: "crypto_plugins/flutter_liblelantus" relative: true source: path - version: "0.0.2" + version: "0.0.3" lints: dependency: transitive description: diff --git a/scripts/android/build_all.sh b/scripts/android/build_all.sh index 47c36fd79..3b19c1c5b 100755 --- a/scripts/android/build_all.sh +++ b/scripts/android/build_all.sh @@ -2,19 +2,13 @@ set -x -e -# libepiccash requires old rust -source ../rust_version.sh -set_rust_to_181 - mkdir -p build . ./config.sh -./install_ndk.sh PLUGINS_DIR=../../crypto_plugins (cd "${PLUGINS_DIR}"/flutter_liblelantus/scripts/android && ./build_all.sh ) (cd "${PLUGINS_DIR}"/flutter_libepiccash/scripts/android && ./build_all.sh ) -set_rust_to_1720 (cd "${PLUGINS_DIR}"/frostdart/scripts/android && ./build_all.sh ) wait diff --git a/scripts/android/build_all_campfire.sh b/scripts/android/build_all_campfire.sh index ccb8830b1..3b19c1c5b 100755 --- a/scripts/android/build_all_campfire.sh +++ b/scripts/android/build_all_campfire.sh @@ -2,18 +2,13 @@ set -x -e -source ../rust_version.sh -set_rust_to_181 - mkdir -p build . ./config.sh -./install_ndk.sh PLUGINS_DIR=../../crypto_plugins (cd "${PLUGINS_DIR}"/flutter_liblelantus/scripts/android && ./build_all.sh ) (cd "${PLUGINS_DIR}"/flutter_libepiccash/scripts/android && ./build_all.sh ) -set_rust_to_1720 (cd "${PLUGINS_DIR}"/frostdart/scripts/android && ./build_all.sh ) wait diff --git a/scripts/android/build_all_duo.sh b/scripts/android/build_all_duo.sh index cd1ba0174..25b3ce9ea 100755 --- a/scripts/android/build_all_duo.sh +++ b/scripts/android/build_all_duo.sh @@ -4,18 +4,13 @@ set -x -e # todo: revisit following at some point -source ../rust_version.sh -set_rust_to_181 - mkdir -p build . ./config.sh -./install_ndk.sh PLUGINS_DIR=../../crypto_plugins (cd "${PLUGINS_DIR}"/flutter_liblelantus/scripts/android && ./build_all.sh ) (cd "${PLUGINS_DIR}"/flutter_libepiccash/scripts/android && ./build_all.sh ) -set_rust_to_1720 (cd "${PLUGINS_DIR}"/frostdart/scripts/android && ./build_all.sh ) wait diff --git a/scripts/android/config.sh b/scripts/android/config.sh index 864c78c18..8d560ec36 100644 --- a/scripts/android/config.sh +++ b/scripts/android/config.sh @@ -1,7 +1,5 @@ #!/bin/sh export WORKDIR="$(pwd)/"build -export ANDROID_NDK_ZIP=${WORKDIR}/android-ndk-r20b.zip -export TOOLCHAIN_DIR="${WORKDIR}/toolchain" # Change this Value to a lower number if you run out of memory while compiling export OVERRIDE_THREADS="$(nproc)" \ No newline at end of file diff --git a/scripts/android/install_ndk.sh b/scripts/android/install_ndk.sh deleted file mode 100755 index 0864a2bde..000000000 --- a/scripts/android/install_ndk.sh +++ /dev/null @@ -1,21 +0,0 @@ -#!/bin/sh - -mkdir -p build -. ./config.sh -ANDROID_NDK_SHA256="8381c440fe61fcbb01e209211ac01b519cd6adf51ab1c2281d5daad6ca4c8c8c" - -if [ ! -e "$ANDROID_NDK_ZIP" ]; then - curl https://dl.google.com/android/repository/android-ndk-r20b-linux-x86_64.zip -o "${ANDROID_NDK_ZIP}" -fi -echo "${ANDROID_NDK_SHA256}" "${ANDROID_NDK_ZIP}" | sha256sum -c || exit 1 - - -PLUGINS_DIR=../../crypto_plugins - -mkdir -p "${PLUGINS_DIR}"/flutter_libmonero/scripts/android/build -mkdir -p "${PLUGINS_DIR}"/flutter_liblelantus/scripts/android/build -mkdir -p "${PLUGINS_DIR}"/flutter_libepiccash/scripts/android/build - -cp "${ANDROID_NDK_ZIP}" "${PLUGINS_DIR}"/flutter_libmonero/scripts/android/build/ -cp "${ANDROID_NDK_ZIP}" "${PLUGINS_DIR}"/flutter_liblelantus/scripts/android/build/ -cp "${ANDROID_NDK_ZIP}" "${PLUGINS_DIR}"/flutter_libepiccash/scripts/android/build/ diff --git a/scripts/ios/build_all.sh b/scripts/ios/build_all.sh index b9eab976f..6ac527632 100755 --- a/scripts/ios/build_all.sh +++ b/scripts/ios/build_all.sh @@ -2,9 +2,6 @@ set -x -e -source ../rust_version.sh -set_rust_to_181 - # ensure ios rust triples are there rustup target add aarch64-apple-ios rustup target add x86_64-apple-ios @@ -15,7 +12,6 @@ rustup target add x86_64-apple-ios (cd ../../crypto_plugins/flutter_liblelantus/scripts/ios && ./build_all.sh ) (cd ../../crypto_plugins/flutter_libepiccash/scripts/ios && ./build_all.sh ) -set_rust_to_1720 (cd ../../crypto_plugins/frostdart/scripts/ios && ./build_all.sh ) wait diff --git a/scripts/ios/build_all_campfire.sh b/scripts/ios/build_all_campfire.sh index b9eab976f..6ac527632 100755 --- a/scripts/ios/build_all_campfire.sh +++ b/scripts/ios/build_all_campfire.sh @@ -2,9 +2,6 @@ set -x -e -source ../rust_version.sh -set_rust_to_181 - # ensure ios rust triples are there rustup target add aarch64-apple-ios rustup target add x86_64-apple-ios @@ -15,7 +12,6 @@ rustup target add x86_64-apple-ios (cd ../../crypto_plugins/flutter_liblelantus/scripts/ios && ./build_all.sh ) (cd ../../crypto_plugins/flutter_libepiccash/scripts/ios && ./build_all.sh ) -set_rust_to_1720 (cd ../../crypto_plugins/frostdart/scripts/ios && ./build_all.sh ) wait diff --git a/scripts/ios/build_all_duo.sh b/scripts/ios/build_all_duo.sh index 24236e8a7..4f5191bd2 100755 --- a/scripts/ios/build_all_duo.sh +++ b/scripts/ios/build_all_duo.sh @@ -4,9 +4,6 @@ set -x -e # todo: revisit following at some point -source ../rust_version.sh -set_rust_to_181 - # ensure ios rust triples are there rustup target add aarch64-apple-ios rustup target add x86_64-apple-ios @@ -17,7 +14,6 @@ rustup target add x86_64-apple-ios (cd ../../crypto_plugins/flutter_liblelantus/scripts/ios && ./build_all.sh ) (cd ../../crypto_plugins/flutter_libepiccash/scripts/ios && ./build_all.sh ) -set_rust_to_1720 (cd ../../crypto_plugins/frostdart/scripts/ios && ./build_all.sh ) wait diff --git a/scripts/linux/build_all.sh b/scripts/linux/build_all.sh index bdb3bd527..0562c2191 100755 --- a/scripts/linux/build_all.sh +++ b/scripts/linux/build_all.sh @@ -2,9 +2,6 @@ set -x -e -source ../rust_version.sh -set_rust_to_181 - # for arm # flutter-elinux clean # flutter-elinux pub get @@ -13,7 +10,6 @@ mkdir -p build ./build_secure_storage_deps.sh (cd ../../crypto_plugins/flutter_liblelantus/scripts/linux && ./build_all.sh ) (cd ../../crypto_plugins/flutter_libepiccash/scripts/linux && ./build_all.sh ) -set_rust_to_1720 (cd ../../crypto_plugins/frostdart/scripts/linux && ./build_all.sh ) ./build_secp256k1.sh diff --git a/scripts/linux/build_all_campfire.sh b/scripts/linux/build_all_campfire.sh index bdb3bd527..0562c2191 100755 --- a/scripts/linux/build_all_campfire.sh +++ b/scripts/linux/build_all_campfire.sh @@ -2,9 +2,6 @@ set -x -e -source ../rust_version.sh -set_rust_to_181 - # for arm # flutter-elinux clean # flutter-elinux pub get @@ -13,7 +10,6 @@ mkdir -p build ./build_secure_storage_deps.sh (cd ../../crypto_plugins/flutter_liblelantus/scripts/linux && ./build_all.sh ) (cd ../../crypto_plugins/flutter_libepiccash/scripts/linux && ./build_all.sh ) -set_rust_to_1720 (cd ../../crypto_plugins/frostdart/scripts/linux && ./build_all.sh ) ./build_secp256k1.sh diff --git a/scripts/linux/build_all_duo.sh b/scripts/linux/build_all_duo.sh index 91d2127cd..60557556d 100755 --- a/scripts/linux/build_all_duo.sh +++ b/scripts/linux/build_all_duo.sh @@ -4,8 +4,6 @@ set -x -e # todo: revisit following at some point -source ../rust_version.sh -set_rust_to_181 # for arm # flutter-elinux clean @@ -15,7 +13,6 @@ mkdir -p build ./build_secure_storage_deps.sh & (cd ../../crypto_plugins/flutter_liblelantus/scripts/linux && ./build_all.sh ) (cd ../../crypto_plugins/flutter_libepiccash/scripts/linux && ./build_all.sh ) -set_rust_to_1720 (cd ../../crypto_plugins/frostdart/scripts/linux && ./build_all.sh ) ./build_secp256k1.sh diff --git a/scripts/macos/build_all.sh b/scripts/macos/build_all.sh index 2212929e8..5fa49e6ff 100755 --- a/scripts/macos/build_all.sh +++ b/scripts/macos/build_all.sh @@ -2,16 +2,10 @@ set -x -e -source ../rust_version.sh -set_rust_to_181 - (cd ../../crypto_plugins/flutter_liblelantus/scripts/macos && ./build_all.sh ) (cd ../../crypto_plugins/flutter_libepiccash/scripts/macos && ./build_all.sh ) -set_rust_to_1720 (cd ../../crypto_plugins/frostdart/scripts/macos && ./build_all.sh ) wait echo "Done building" -# set rust (back) to a more recent stable release to allow stack wallet to build tor -set_rust_to_1720 diff --git a/scripts/macos/build_all_campfire.sh b/scripts/macos/build_all_campfire.sh index 2212929e8..8102b1d00 100755 --- a/scripts/macos/build_all_campfire.sh +++ b/scripts/macos/build_all_campfire.sh @@ -2,16 +2,9 @@ set -x -e -source ../rust_version.sh -set_rust_to_181 - (cd ../../crypto_plugins/flutter_liblelantus/scripts/macos && ./build_all.sh ) (cd ../../crypto_plugins/flutter_libepiccash/scripts/macos && ./build_all.sh ) -set_rust_to_1720 (cd ../../crypto_plugins/frostdart/scripts/macos && ./build_all.sh ) wait echo "Done building" - -# set rust (back) to a more recent stable release to allow stack wallet to build tor -set_rust_to_1720 diff --git a/scripts/macos/build_all_duo.sh b/scripts/macos/build_all_duo.sh index f4114c7ef..23c4e0be3 100755 --- a/scripts/macos/build_all_duo.sh +++ b/scripts/macos/build_all_duo.sh @@ -4,16 +4,10 @@ set -x -e # todo: revisit following at some point -source ../rust_version.sh -set_rust_to_181 - (cd ../../crypto_plugins/flutter_liblelantus/scripts/macos && ./build_all.sh ) (cd ../../crypto_plugins/flutter_libepiccash/scripts/macos && ./build_all.sh ) -set_rust_to_1720 (cd ../../crypto_plugins/frostdart/scripts/macos && ./build_all.sh ) wait echo "Done building" -# set rust (back) to a more recent stable release to allow stack wallet to build tor -set_rust_to_1720 diff --git a/scripts/rust_version.sh b/scripts/rust_version.sh deleted file mode 100755 index 8cfada233..000000000 --- a/scripts/rust_version.sh +++ /dev/null @@ -1,28 +0,0 @@ -#!/bin/sh - -set_rust_to_1671() { - if rustup toolchain list | grep -q "1.67.1"; then - rustup default 1.67.1 - else - echo "Rust version 1.67.1 is not installed. Please install it using 'rustup install 1.67.1'." >&2 - exit 1 - fi -} - -set_rust_to_1720() { - if rustup toolchain list | grep -q "1.72.0"; then - rustup default 1.72.0 - else - echo "Rust version 1.72.0 is not installed. Please install it using 'rustup install 1.72.0'." >&2 - exit 1 - fi -} - -set_rust_to_181() { - if rustup toolchain list | grep -q "1.81"; then - rustup default 1.81 - else - echo "Rust version 1.81 is not installed. Please install it using 'rustup install 1.81'." >&2 - exit 1 - fi -} diff --git a/scripts/windows/build_all.sh b/scripts/windows/build_all.sh index 6daedb861..0f4d61b19 100755 --- a/scripts/windows/build_all.sh +++ b/scripts/windows/build_all.sh @@ -2,13 +2,9 @@ set -x -e -source ../rust_version.sh -set_rust_to_181 - mkdir -p build (cd ../../crypto_plugins/flutter_libepiccash/scripts/windows && ./build_all.sh ) (cd ../../crypto_plugins/flutter_liblelantus/scripts/windows && ./build_all.sh ) -set_rust_to_1720 (cd ../../crypto_plugins/frostdart/scripts/windows && ./build_all.sh ) ./build_secp256k1_wsl.sh diff --git a/scripts/windows/build_all_campfire.sh b/scripts/windows/build_all_campfire.sh index 6daedb861..0f4d61b19 100755 --- a/scripts/windows/build_all_campfire.sh +++ b/scripts/windows/build_all_campfire.sh @@ -2,13 +2,9 @@ set -x -e -source ../rust_version.sh -set_rust_to_181 - mkdir -p build (cd ../../crypto_plugins/flutter_libepiccash/scripts/windows && ./build_all.sh ) (cd ../../crypto_plugins/flutter_liblelantus/scripts/windows && ./build_all.sh ) -set_rust_to_1720 (cd ../../crypto_plugins/frostdart/scripts/windows && ./build_all.sh ) ./build_secp256k1_wsl.sh diff --git a/scripts/windows/build_all_duo.sh b/scripts/windows/build_all_duo.sh index f6ce810ef..5ee690c05 100755 --- a/scripts/windows/build_all_duo.sh +++ b/scripts/windows/build_all_duo.sh @@ -4,13 +4,9 @@ set -x -e # todo: revisit following at some point -source ../rust_version.sh -set_rust_to_181 - mkdir -p build (cd ../../crypto_plugins/flutter_libepiccash/scripts/windows && ./build_all.sh ) (cd ../../crypto_plugins/flutter_liblelantus/scripts/windows && ./build_all.sh ) -set_rust_to_1720 (cd ../../crypto_plugins/frostdart/scripts/windows && ./build_all.sh ) ./build_secp256k1_wsl.sh From 3251159814db389f0e2483a1edcb8db6f3ca23a8 Mon Sep 17 00:00:00 2001 From: julian Date: Thu, 27 Mar 2025 10:58:28 -0600 Subject: [PATCH 172/193] update docs re rust version --- docs/building.md | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/docs/building.md b/docs/building.md index d336eac16..c3dacb90b 100644 --- a/docs/building.md +++ b/docs/building.md @@ -72,8 +72,8 @@ Install [Rust](https://www.rust-lang.org/tools/install) via [rustup.rs](https:// ``` curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh source ~/.bashrc -rustup install 1.67.1 1.71.0 1.72.0 1.73.0 -rustup default 1.67.1 +rustup install 1.85.1 +rustup default 1.85.1 cargo install cargo-ndk --version 2.12.7 --locked ``` @@ -209,12 +209,12 @@ brew install brotli cairo coreutils gdbm gettext glib gmp libevent libidn2 libng ``` -Download and install [Rust](https://www.rust-lang.org/tools/install). [Rustup](https://rustup.rs/) is recommended for Rust setup. Use `rustc` to confirm successful installation. Install toolchains 1.67.1 and 1.72.0 and `cbindgen` and `cargo-lipo` too. You will also have to add the platform target(s) `aarch64-apple-ios` and/or `aarch64-apple-darwin`. You can use the command(s): +Download and install [Rust](https://www.rust-lang.org/tools/install). [Rustup](https://rustup.rs/) is recommended for Rust setup. Use `rustc` to confirm successful installation. Install toolchain 1.85.1 and `cbindgen` and `cargo-lipo` too. You will also have to add the platform target(s) `aarch64-apple-ios` and/or `aarch64-apple-darwin`. You can use the command(s): ``` curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh source ~/.bashrc -rustup install 1.67.1 1.71.0 1.72.0 1.73.0 -rustup default 1.67.1 +rustup install 1.85.1 +rustup default 1.85.1 cargo install cargo-ndk --version 2.12.7 --locked cargo install cbindgen cargo-lipo rustup target add aarch64-apple-ios aarch64-apple-darwin @@ -306,8 +306,8 @@ Run `flutter doctor` in PowerShell to confirm its installation. ### Rust Install [Rust](https://www.rust-lang.org/tools/install) on the Windows host (not in WSL2). Download the installer from [rustup.rs](https://rustup.rs), make sure it works on the commandline (you may need to open a new terminal), and install the following versions: ``` -rustup install 1.67.1 1.71.0 1.72.0 1.73.0 -rustup default 1.67.1 +rustup install 1.85.1 +rustup default 1.85.1 cargo install cargo-ndk --version 2.12.7 --locked ``` From 5bb781323463876c10c3ef86b0916944e3ccfa25 Mon Sep 17 00:00:00 2001 From: julian Date: Thu, 27 Mar 2025 14:19:33 -0600 Subject: [PATCH 173/193] revert to switching rust versions as required --- docs/building.md | 8 ++++---- scripts/android/build_all.sh | 7 +++++++ scripts/android/build_all_campfire.sh | 7 +++++++ scripts/android/build_all_duo.sh | 7 +++++++ scripts/ios/build_all.sh | 7 +++++++ scripts/ios/build_all_campfire.sh | 7 +++++++ scripts/ios/build_all_duo.sh | 7 +++++++ scripts/linux/build_all.sh | 7 +++++++ scripts/linux/build_all_campfire.sh | 7 +++++++ scripts/linux/build_all_duo.sh | 7 +++++++ scripts/macos/build_all.sh | 9 ++++++++- scripts/macos/build_all_campfire.sh | 9 ++++++++- scripts/macos/build_all_duo.sh | 9 ++++++++- scripts/rust_version.sh | 21 +++++++++++++++++++++ scripts/windows/build_all.sh | 7 +++++++ scripts/windows/build_all_campfire.sh | 7 +++++++ scripts/windows/build_all_duo.sh | 7 +++++++ 17 files changed, 133 insertions(+), 7 deletions(-) create mode 100755 scripts/rust_version.sh diff --git a/docs/building.md b/docs/building.md index c3dacb90b..14109e627 100644 --- a/docs/building.md +++ b/docs/building.md @@ -72,7 +72,7 @@ Install [Rust](https://www.rust-lang.org/tools/install) via [rustup.rs](https:// ``` curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh source ~/.bashrc -rustup install 1.85.1 +rustup install 1.85.1 1.81.0 rustup default 1.85.1 cargo install cargo-ndk --version 2.12.7 --locked ``` @@ -209,11 +209,11 @@ brew install brotli cairo coreutils gdbm gettext glib gmp libevent libidn2 libng ``` -Download and install [Rust](https://www.rust-lang.org/tools/install). [Rustup](https://rustup.rs/) is recommended for Rust setup. Use `rustc` to confirm successful installation. Install toolchain 1.85.1 and `cbindgen` and `cargo-lipo` too. You will also have to add the platform target(s) `aarch64-apple-ios` and/or `aarch64-apple-darwin`. You can use the command(s): +Download and install [Rust](https://www.rust-lang.org/tools/install). [Rustup](https://rustup.rs/) is recommended for Rust setup. Use `rustc` to confirm successful installation. Install toolchains 1.81.0 and 1.85.1 and `cbindgen` and `cargo-lipo` too. You will also have to add the platform target(s) `aarch64-apple-ios` and/or `aarch64-apple-darwin`. You can use the command(s): ``` curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh source ~/.bashrc -rustup install 1.85.1 +rustup install 1.85.1 1.81.0 rustup default 1.85.1 cargo install cargo-ndk --version 2.12.7 --locked cargo install cbindgen cargo-lipo @@ -306,7 +306,7 @@ Run `flutter doctor` in PowerShell to confirm its installation. ### Rust Install [Rust](https://www.rust-lang.org/tools/install) on the Windows host (not in WSL2). Download the installer from [rustup.rs](https://rustup.rs), make sure it works on the commandline (you may need to open a new terminal), and install the following versions: ``` -rustup install 1.85.1 +rustup install 1.85.1 1.81.0 rustup default 1.85.1 cargo install cargo-ndk --version 2.12.7 --locked ``` diff --git a/scripts/android/build_all.sh b/scripts/android/build_all.sh index 3b19c1c5b..5438234ea 100755 --- a/scripts/android/build_all.sh +++ b/scripts/android/build_all.sh @@ -8,7 +8,14 @@ mkdir -p build PLUGINS_DIR=../../crypto_plugins (cd "${PLUGINS_DIR}"/flutter_liblelantus/scripts/android && ./build_all.sh ) + +# libepiccash requires old rust +source ../rust_version.sh +set_rust_version_for_libepiccash (cd "${PLUGINS_DIR}"/flutter_libepiccash/scripts/android && ./build_all.sh ) +# set rust (back) to a more recent stable release after building epiccash +set_rust_to_everything_else + (cd "${PLUGINS_DIR}"/frostdart/scripts/android && ./build_all.sh ) wait diff --git a/scripts/android/build_all_campfire.sh b/scripts/android/build_all_campfire.sh index 3b19c1c5b..5438234ea 100755 --- a/scripts/android/build_all_campfire.sh +++ b/scripts/android/build_all_campfire.sh @@ -8,7 +8,14 @@ mkdir -p build PLUGINS_DIR=../../crypto_plugins (cd "${PLUGINS_DIR}"/flutter_liblelantus/scripts/android && ./build_all.sh ) + +# libepiccash requires old rust +source ../rust_version.sh +set_rust_version_for_libepiccash (cd "${PLUGINS_DIR}"/flutter_libepiccash/scripts/android && ./build_all.sh ) +# set rust (back) to a more recent stable release after building epiccash +set_rust_to_everything_else + (cd "${PLUGINS_DIR}"/frostdart/scripts/android && ./build_all.sh ) wait diff --git a/scripts/android/build_all_duo.sh b/scripts/android/build_all_duo.sh index 25b3ce9ea..40be4bee4 100755 --- a/scripts/android/build_all_duo.sh +++ b/scripts/android/build_all_duo.sh @@ -10,7 +10,14 @@ mkdir -p build PLUGINS_DIR=../../crypto_plugins (cd "${PLUGINS_DIR}"/flutter_liblelantus/scripts/android && ./build_all.sh ) + +# libepiccash requires old rust +source ../rust_version.sh +set_rust_version_for_libepiccash (cd "${PLUGINS_DIR}"/flutter_libepiccash/scripts/android && ./build_all.sh ) +# set rust (back) to a more recent stable release after building epiccash +set_rust_to_everything_else + (cd "${PLUGINS_DIR}"/frostdart/scripts/android && ./build_all.sh ) wait diff --git a/scripts/ios/build_all.sh b/scripts/ios/build_all.sh index 6ac527632..c47228cdc 100755 --- a/scripts/ios/build_all.sh +++ b/scripts/ios/build_all.sh @@ -11,7 +11,14 @@ rustup target add aarch64-apple-ios rustup target add x86_64-apple-ios (cd ../../crypto_plugins/flutter_liblelantus/scripts/ios && ./build_all.sh ) + +# libepiccash requires old rust +source ../rust_version.sh +set_rust_version_for_libepiccash (cd ../../crypto_plugins/flutter_libepiccash/scripts/ios && ./build_all.sh ) +# set rust (back) to a more recent stable release after building epiccash +set_rust_to_everything_else + (cd ../../crypto_plugins/frostdart/scripts/ios && ./build_all.sh ) wait diff --git a/scripts/ios/build_all_campfire.sh b/scripts/ios/build_all_campfire.sh index 6ac527632..c47228cdc 100755 --- a/scripts/ios/build_all_campfire.sh +++ b/scripts/ios/build_all_campfire.sh @@ -11,7 +11,14 @@ rustup target add aarch64-apple-ios rustup target add x86_64-apple-ios (cd ../../crypto_plugins/flutter_liblelantus/scripts/ios && ./build_all.sh ) + +# libepiccash requires old rust +source ../rust_version.sh +set_rust_version_for_libepiccash (cd ../../crypto_plugins/flutter_libepiccash/scripts/ios && ./build_all.sh ) +# set rust (back) to a more recent stable release after building epiccash +set_rust_to_everything_else + (cd ../../crypto_plugins/frostdart/scripts/ios && ./build_all.sh ) wait diff --git a/scripts/ios/build_all_duo.sh b/scripts/ios/build_all_duo.sh index 4f5191bd2..3e3a73119 100755 --- a/scripts/ios/build_all_duo.sh +++ b/scripts/ios/build_all_duo.sh @@ -13,7 +13,14 @@ rustup target add aarch64-apple-ios rustup target add x86_64-apple-ios (cd ../../crypto_plugins/flutter_liblelantus/scripts/ios && ./build_all.sh ) + +# libepiccash requires old rust +source ../rust_version.sh +set_rust_version_for_libepiccash (cd ../../crypto_plugins/flutter_libepiccash/scripts/ios && ./build_all.sh ) +# set rust (back) to a more recent stable release after building epiccash +set_rust_to_everything_else + (cd ../../crypto_plugins/frostdart/scripts/ios && ./build_all.sh ) wait diff --git a/scripts/linux/build_all.sh b/scripts/linux/build_all.sh index 0562c2191..011d972b3 100755 --- a/scripts/linux/build_all.sh +++ b/scripts/linux/build_all.sh @@ -9,7 +9,14 @@ set -x -e mkdir -p build ./build_secure_storage_deps.sh (cd ../../crypto_plugins/flutter_liblelantus/scripts/linux && ./build_all.sh ) + +# libepiccash requires old rust +source ../rust_version.sh +set_rust_version_for_libepiccash (cd ../../crypto_plugins/flutter_libepiccash/scripts/linux && ./build_all.sh ) +# set rust (back) to a more recent stable release after building epiccash +set_rust_to_everything_else + (cd ../../crypto_plugins/frostdart/scripts/linux && ./build_all.sh ) ./build_secp256k1.sh diff --git a/scripts/linux/build_all_campfire.sh b/scripts/linux/build_all_campfire.sh index 0562c2191..011d972b3 100755 --- a/scripts/linux/build_all_campfire.sh +++ b/scripts/linux/build_all_campfire.sh @@ -9,7 +9,14 @@ set -x -e mkdir -p build ./build_secure_storage_deps.sh (cd ../../crypto_plugins/flutter_liblelantus/scripts/linux && ./build_all.sh ) + +# libepiccash requires old rust +source ../rust_version.sh +set_rust_version_for_libepiccash (cd ../../crypto_plugins/flutter_libepiccash/scripts/linux && ./build_all.sh ) +# set rust (back) to a more recent stable release after building epiccash +set_rust_to_everything_else + (cd ../../crypto_plugins/frostdart/scripts/linux && ./build_all.sh ) ./build_secp256k1.sh diff --git a/scripts/linux/build_all_duo.sh b/scripts/linux/build_all_duo.sh index 60557556d..aa804e73e 100755 --- a/scripts/linux/build_all_duo.sh +++ b/scripts/linux/build_all_duo.sh @@ -12,7 +12,14 @@ set -x -e mkdir -p build ./build_secure_storage_deps.sh & (cd ../../crypto_plugins/flutter_liblelantus/scripts/linux && ./build_all.sh ) + +# libepiccash requires old rust +source ../rust_version.sh +set_rust_version_for_libepiccash (cd ../../crypto_plugins/flutter_libepiccash/scripts/linux && ./build_all.sh ) +# set rust (back) to a more recent stable release after building epiccash +set_rust_to_everything_else + (cd ../../crypto_plugins/frostdart/scripts/linux && ./build_all.sh ) ./build_secp256k1.sh diff --git a/scripts/macos/build_all.sh b/scripts/macos/build_all.sh index 5fa49e6ff..37dda0e64 100755 --- a/scripts/macos/build_all.sh +++ b/scripts/macos/build_all.sh @@ -2,8 +2,15 @@ set -x -e -(cd ../../crypto_plugins/flutter_liblelantus/scripts/macos && ./build_all.sh ) + +# libepiccash requires old rust +source ../rust_version.sh +set_rust_version_for_libepiccash (cd ../../crypto_plugins/flutter_libepiccash/scripts/macos && ./build_all.sh ) +# set rust (back) to a more recent stable release after building epiccash +set_rust_to_everything_else + +(cd ../../crypto_plugins/flutter_liblelantus/scripts/macos && ./build_all.sh ) (cd ../../crypto_plugins/frostdart/scripts/macos && ./build_all.sh ) wait diff --git a/scripts/macos/build_all_campfire.sh b/scripts/macos/build_all_campfire.sh index 8102b1d00..59a93ef26 100755 --- a/scripts/macos/build_all_campfire.sh +++ b/scripts/macos/build_all_campfire.sh @@ -2,8 +2,15 @@ set -x -e -(cd ../../crypto_plugins/flutter_liblelantus/scripts/macos && ./build_all.sh ) + +# libepiccash requires old rust +source ../rust_version.sh +set_rust_version_for_libepiccash (cd ../../crypto_plugins/flutter_libepiccash/scripts/macos && ./build_all.sh ) +# set rust (back) to a more recent stable release after building epiccash +set_rust_to_everything_else + +(cd ../../crypto_plugins/flutter_liblelantus/scripts/macos && ./build_all.sh ) (cd ../../crypto_plugins/frostdart/scripts/macos && ./build_all.sh ) wait diff --git a/scripts/macos/build_all_duo.sh b/scripts/macos/build_all_duo.sh index 23c4e0be3..960f5a44a 100755 --- a/scripts/macos/build_all_duo.sh +++ b/scripts/macos/build_all_duo.sh @@ -4,8 +4,15 @@ set -x -e # todo: revisit following at some point -(cd ../../crypto_plugins/flutter_liblelantus/scripts/macos && ./build_all.sh ) + +# libepiccash requires old rust +source ../rust_version.sh +set_rust_version_for_libepiccash (cd ../../crypto_plugins/flutter_libepiccash/scripts/macos && ./build_all.sh ) +# set rust (back) to a more recent stable release after building epiccash +set_rust_to_everything_else + +(cd ../../crypto_plugins/flutter_liblelantus/scripts/macos && ./build_all.sh ) (cd ../../crypto_plugins/frostdart/scripts/macos && ./build_all.sh ) wait diff --git a/scripts/rust_version.sh b/scripts/rust_version.sh new file mode 100755 index 000000000..b894b7a5d --- /dev/null +++ b/scripts/rust_version.sh @@ -0,0 +1,21 @@ +#!/bin/sh + + +set_rust_to_everything_else() { + if rustup toolchain list | grep -q "1.85.1"; then + rustup default 1.85.1 + else + echo "Rust version 1.85.1 is not installed. Please install it using 'rustup install 1.85.1'." >&2 + exit 1 + fi +} + +set_rust_version_for_libepiccash() { + if rustup toolchain list | grep -q "1.81.0"; then + rustup default 1.81 + else + echo "Rust version 1.81.0 is not installed. Please install it using 'rustup install 1.81.0'." >&2 + exit 1 + fi +} + diff --git a/scripts/windows/build_all.sh b/scripts/windows/build_all.sh index 0f4d61b19..cf3ad76d9 100755 --- a/scripts/windows/build_all.sh +++ b/scripts/windows/build_all.sh @@ -3,7 +3,14 @@ set -x -e mkdir -p build + +# libepiccash requires old rust +source ../rust_version.sh +set_rust_version_for_libepiccash (cd ../../crypto_plugins/flutter_libepiccash/scripts/windows && ./build_all.sh ) +# set rust (back) to a more recent stable release after building epiccash +set_rust_to_everything_else + (cd ../../crypto_plugins/flutter_liblelantus/scripts/windows && ./build_all.sh ) (cd ../../crypto_plugins/frostdart/scripts/windows && ./build_all.sh ) diff --git a/scripts/windows/build_all_campfire.sh b/scripts/windows/build_all_campfire.sh index 0f4d61b19..cf3ad76d9 100755 --- a/scripts/windows/build_all_campfire.sh +++ b/scripts/windows/build_all_campfire.sh @@ -3,7 +3,14 @@ set -x -e mkdir -p build + +# libepiccash requires old rust +source ../rust_version.sh +set_rust_version_for_libepiccash (cd ../../crypto_plugins/flutter_libepiccash/scripts/windows && ./build_all.sh ) +# set rust (back) to a more recent stable release after building epiccash +set_rust_to_everything_else + (cd ../../crypto_plugins/flutter_liblelantus/scripts/windows && ./build_all.sh ) (cd ../../crypto_plugins/frostdart/scripts/windows && ./build_all.sh ) diff --git a/scripts/windows/build_all_duo.sh b/scripts/windows/build_all_duo.sh index 5ee690c05..e54986e7d 100755 --- a/scripts/windows/build_all_duo.sh +++ b/scripts/windows/build_all_duo.sh @@ -5,7 +5,14 @@ set -x -e # todo: revisit following at some point mkdir -p build + +# libepiccash requires old rust +source ../rust_version.sh +set_rust_version_for_libepiccash (cd ../../crypto_plugins/flutter_libepiccash/scripts/windows && ./build_all.sh ) +# set rust (back) to a more recent stable release after building epiccash +set_rust_to_everything_else + (cd ../../crypto_plugins/flutter_liblelantus/scripts/windows && ./build_all.sh ) (cd ../../crypto_plugins/frostdart/scripts/windows && ./build_all.sh ) From 321ae2e7ad158ce44740ad2d0f8a4d6a8b19eb7a Mon Sep 17 00:00:00 2001 From: Tritonn204 Date: Thu, 27 Mar 2025 23:44:09 -0500 Subject: [PATCH 174/193] New TX typing bug fix for --- lib/wallets/wallet/impl/xelis_wallet.dart | 21 +++++++++++---------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/lib/wallets/wallet/impl/xelis_wallet.dart b/lib/wallets/wallet/impl/xelis_wallet.dart index d9511c379..f250bb7f7 100644 --- a/lib/wallets/wallet/impl/xelis_wallet.dart +++ b/lib/wallets/wallet/impl/xelis_wallet.dart @@ -317,7 +317,7 @@ class XelisWallet extends LibXelisWallet { @override Future> updateTransactions({ bool isRescan = false, - List? rawTransactions, + List? objTransactions, int? topoheight, }) async { checkInitialized(); @@ -354,16 +354,17 @@ class XelisWallet extends LibXelisWallet { await libXelisWallet!.rescan(topoheight: BigInt.from(pruningHeight)); } - final txListJson = rawTransactions ?? await libXelisWallet!.allHistory(); + final txList = objTransactions ?? + (await libXelisWallet!.allHistory()) + .map((jsonStr) => xelis_sdk.TransactionEntry.fromJson( + json.decode(jsonStr), + ) as xelis_sdk.TransactionEntry) + .toList(); final List txns = []; - for (final jsonString in txListJson) { + for (final transactionEntry in txList) { try { - final transactionEntry = xelis_sdk.TransactionEntry.fromJson( - (json.decode(jsonString) as Map).cast(), - ); - // Check for duplicates final storedTx = await mainDB.isar.transactionV2s @@ -555,7 +556,7 @@ class XelisWallet extends LibXelisWallet { txns.add(txn); } catch (e, s) { Logging.instance.w( - "Error in $runtimeType handling transaction: $jsonString", + "Error in $runtimeType handling transaction: $transactionEntry", error: e, stackTrace: s, ); @@ -858,10 +859,10 @@ class XelisWallet extends LibXelisWallet { @override Future handleNewTransaction(xelis_sdk.TransactionEntry tx) async { try { - final txListJson = [jsonEncode(tx.toString())]; + final txList = [tx]; final newTxIds = await updateTransactions( isRescan: false, - rawTransactions: txListJson, + objTransactions: txList, ); await updateBalance(); From ce639c995514c9ab393d357acacc0c81671f8463 Mon Sep 17 00:00:00 2001 From: julian Date: Thu, 27 Mar 2025 18:54:38 -0600 Subject: [PATCH 175/193] docs update --- docs/building.md | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/docs/building.md b/docs/building.md index 14109e627..4ba1b7150 100644 --- a/docs/building.md +++ b/docs/building.md @@ -13,12 +13,12 @@ Here you will find instructions on how to install the necessary tools for buildi The following instructions are for building and running on a Linux host. Alternatively, see the [Mac](#mac-host) and/or [Windows](#windows-host) section. This entire section (except for the Android Studio section) needs to be completed in WSL if building on a Windows host. ### Flutter -Install Flutter 3.29.0 by [following their guide](https://docs.flutter.dev/get-started/install/linux/desktop?tab=download#install-the-flutter-sdk). You can also clone https://github.com/flutter/flutter, check out the `3.29.0` tag, and add its `flutter/bin` folder to your PATH as in +Install Flutter 3.29.2 by [following their guide](https://docs.flutter.dev/get-started/install/linux/desktop?tab=download#install-the-flutter-sdk). You can also clone https://github.com/flutter/flutter, check out the `3.29.2` tag, and add its `flutter/bin` folder to your PATH as in ```sh FLUTTER_DIR="$HOME/development/flutter" git clone https://github.com/flutter/flutter.git "$FLUTTER_DIR" cd "$FLUTTER_DIR" -git checkout 3.29.0 +git checkout 3.29.2 echo 'export PATH="$PATH:'"$FLUTTER_DIR"'/bin"' >> "$HOME/.profile" source "$HOME/.profile" flutter precache @@ -38,7 +38,7 @@ Use `Tools > SDK Manager` to install: - `SDK Tools > Android SDK command line tools` - `SDK Tools > CMake` and for Android builds, - - `SDK Tools > Android SDK (API 30)` + - `SDK Tools > Android SDK (API 35)` - `SDK Tools > NDK` Then in `File > Settings > Plugins`, install the **Flutter** and **Dart** plugins and restart the IDE. In `File > Settings > Languages & Frameworks > Flutter > Editor`, enable auto format on save to match the project's code style. If you have problems with the Dart SDK, make sure to run `flutter` in a terminal to download it (use `source ~/.bashrc` to update your environment variables if you're still using the same terminal from which you ran `setup.sh`). Run `flutter doctor` to install any missing dependencies and review and agree to any license agreements. @@ -68,13 +68,13 @@ sudo apt install pipx libgcrypt20-dev libglib2.0-dev libsecret-1-dev pipx install meson==0.64.1 markdown==3.4.1 markupsafe==2.1.1 jinja2==3.1.2 pygments==2.13.0 toml==0.10.2 typogrify==2.0.7 tomli==2.0.1 ``` -Install [Rust](https://www.rust-lang.org/tools/install) via [rustup.rs](https://rustup.rs), the required Rust toolchains, and `cargo-ndk 2.12.7` with command: +Install [Rust](https://www.rust-lang.org/tools/install) via [rustup.rs](https://rustup.rs), the required Rust toolchains, and `cargo-ndk` with command: ``` curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh source ~/.bashrc rustup install 1.85.1 1.81.0 rustup default 1.85.1 -cargo install cargo-ndk --version 2.12.7 --locked +cargo install cargo-ndk ``` Android specific dependencies: @@ -215,7 +215,7 @@ curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh source ~/.bashrc rustup install 1.85.1 1.81.0 rustup default 1.85.1 -cargo install cargo-ndk --version 2.12.7 --locked +cargo install cargo-ndk cargo install cbindgen cargo-lipo rustup target add aarch64-apple-ios aarch64-apple-darwin ``` @@ -223,7 +223,7 @@ rustup target add aarch64-apple-ios aarch64-apple-darwin Optionally download [Android Studio](https://developer.android.com/studio) as an IDE and activate its Dart and Flutter plugins. VS Code may work as an alternative, but this is not recommended. ### Flutter -Install [Flutter](https://docs.flutter.dev/get-started/install) 3.29.0 on your Mac host by following [these instructions](https://docs.flutter.dev/get-started/install/macos). Run `flutter doctor` in a terminal to confirm its installation. +Install [Flutter](https://docs.flutter.dev/get-started/install) 3.29.2 on your Mac host by following [these instructions](https://docs.flutter.dev/get-started/install/macos). Run `flutter doctor` in a terminal to confirm its installation. ### Build plugins and configure #### Building plugins for iOS @@ -290,13 +290,13 @@ If the DLLs were built on the WSL filesystem instead of on Windows, copy the res Frostdart will be built by the Windows host later. ### Install Flutter on Windows host -Install Flutter 3.29.0 on your Windows host (not in WSL2) by [following their guide](https://docs.flutter.dev/get-started/install/windows/desktop?tab=download#install-the-flutter-sdk) or by cloning https://github.com/flutter/flutter, checking out the `3.29.0` tag, and adding its `flutter/bin` folder to your PATH as in +Install Flutter 3.29.2 on your Windows host (not in WSL2) by [following their guide](https://docs.flutter.dev/get-started/install/windows/desktop?tab=download#install-the-flutter-sdk) or by cloning https://github.com/flutter/flutter, checking out the `3.29.2` tag, and adding its `flutter/bin` folder to your PATH as in ```bat @echo off set "FLUTTER_DIR=%USERPROFILE%\development\flutter" git clone https://github.com/flutter/flutter.git "%FLUTTER_DIR%" cd /d "%FLUTTER_DIR%" -git checkout 3.29.0 +git checkout 3.29.2 setx PATH "%PATH%;%FLUTTER_DIR%\bin" echo Flutter setup completed. Please restart your command prompt. ``` @@ -308,7 +308,7 @@ Install [Rust](https://www.rust-lang.org/tools/install) on the Windows host (not ``` rustup install 1.85.1 1.81.0 rustup default 1.85.1 -cargo install cargo-ndk --version 2.12.7 --locked +cargo install cargo-ndk ``` ### Windows SDK and Developer Mode From cfba818f128c062e16ece7c611e7833081a24951 Mon Sep 17 00:00:00 2001 From: julian Date: Thu, 27 Mar 2025 19:01:42 -0600 Subject: [PATCH 176/193] temporary git ref updates for testing --- crypto_plugins/flutter_libepiccash | 2 +- crypto_plugins/frostdart | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/crypto_plugins/flutter_libepiccash b/crypto_plugins/flutter_libepiccash index 238455f2b..c98ad210e 160000 --- a/crypto_plugins/flutter_libepiccash +++ b/crypto_plugins/flutter_libepiccash @@ -1 +1 @@ -Subproject commit 238455f2b3fe39564cc617ed0ea45f22971aa644 +Subproject commit c98ad210e89a19fd661df06751b2d7df9bb8c239 diff --git a/crypto_plugins/frostdart b/crypto_plugins/frostdart index f111cdf18..3a1f556d5 160000 --- a/crypto_plugins/frostdart +++ b/crypto_plugins/frostdart @@ -1 +1 @@ -Subproject commit f111cdf183bec1c71c2b20cf265d3879a81f7903 +Subproject commit 3a1f556d50b87fcd5e60a2b7b1b98835518c9822 From 93212d797079508ca7c7ec5c05eebcfa1e515434 Mon Sep 17 00:00:00 2001 From: julian Date: Fri, 28 Mar 2025 11:08:31 -0600 Subject: [PATCH 177/193] update merged refs --- crypto_plugins/flutter_libepiccash | 2 +- crypto_plugins/frostdart | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/crypto_plugins/flutter_libepiccash b/crypto_plugins/flutter_libepiccash index c98ad210e..25e6cb3a3 160000 --- a/crypto_plugins/flutter_libepiccash +++ b/crypto_plugins/flutter_libepiccash @@ -1 +1 @@ -Subproject commit c98ad210e89a19fd661df06751b2d7df9bb8c239 +Subproject commit 25e6cb3a3e7bee04e425af6beccb47e8d0708fdb diff --git a/crypto_plugins/frostdart b/crypto_plugins/frostdart index 3a1f556d5..6f1310ecc 160000 --- a/crypto_plugins/frostdart +++ b/crypto_plugins/frostdart @@ -1 +1 @@ -Subproject commit 3a1f556d50b87fcd5e60a2b7b1b98835518c9822 +Subproject commit 6f1310eccd336fb3c8dc00b61e39a3f0f3a2b59a From d2e77c9ff0e282824a198ce51f454ec4e48e55e5 Mon Sep 17 00:00:00 2001 From: julian Date: Fri, 28 Mar 2025 11:32:22 -0600 Subject: [PATCH 178/193] handle nanswaps api response change --- .../api_response_models/n_currency.dart | 4 +- .../exchange/nanswap/nanswap_api.dart | 74 +++++-------------- 2 files changed, 22 insertions(+), 56 deletions(-) diff --git a/lib/services/exchange/nanswap/api_response_models/n_currency.dart b/lib/services/exchange/nanswap/api_response_models/n_currency.dart index 87f42de12..35b01e87e 100644 --- a/lib/services/exchange/nanswap/api_response_models/n_currency.dart +++ b/lib/services/exchange/nanswap/api_response_models/n_currency.dart @@ -4,7 +4,7 @@ class NCurrency { final String name; final String image; final String network; - final bool hasExternalId; + final bool? hasExternalId; final bool feeLess; NCurrency({ @@ -24,7 +24,7 @@ class NCurrency { name: json['name'] as String, image: json['image'] as String, network: json['network'] as String, - hasExternalId: json['hasExternalId'] as bool, + hasExternalId: json['hasExternalId'] as bool?, feeLess: json['feeless'] as bool, ); } diff --git a/lib/services/exchange/nanswap/nanswap_api.dart b/lib/services/exchange/nanswap/nanswap_api.dart index 7d2465530..6e2848586 100644 --- a/lib/services/exchange/nanswap/nanswap_api.dart +++ b/lib/services/exchange/nanswap/nanswap_api.dart @@ -33,12 +33,11 @@ class NanswapAPI { try { final response = await _client.get( url: uri, - headers: { - 'Accept': 'application/json', - }, - proxyInfo: Prefs.instance.useTor - ? TorService.sharedInstance.getProxyInfo() - : null, + headers: {'Accept': 'application/json'}, + proxyInfo: + Prefs.instance.useTor + ? TorService.sharedInstance.getProxyInfo() + : null, ); code = response.code; @@ -56,10 +55,7 @@ class NanswapAPI { } } - Future _makePostRequest( - Uri uri, - Map body, - ) async { + Future _makePostRequest(Uri uri, Map body) async { int code = -1; try { final response = await _client.post( @@ -70,9 +66,10 @@ class NanswapAPI { 'Accept': 'application/json', }, body: jsonEncode(body), - proxyInfo: Prefs.instance.useTor - ? TorService.sharedInstance.getProxyInfo() - : null, + proxyInfo: + Prefs.instance.useTor + ? TorService.sharedInstance.getProxyInfo() + : null, ); code = response.code; @@ -117,9 +114,7 @@ class NanswapAPI { // // application/json Future>> getSupportedCurrencies() async { - final uri = _buildUri( - endpoint: "all-currencies", - ); + final uri = _buildUri(endpoint: "all-currencies"); try { final json = await _makeGetRequest(uri); @@ -128,11 +123,7 @@ class NanswapAPI { for (final key in (json as Map).keys) { final _map = json[key] as Map; _map["id"] = key; - result.add( - NCurrency.fromJson( - Map.from(_map), - ), - ); + result.add(NCurrency.fromJson(Map.from(_map))); } return ExchangeResponse(value: result); @@ -196,11 +187,7 @@ class NanswapAPI { map["to"] ??= to.toUpperCase(); map["from"] ??= from.toUpperCase(); - return ExchangeResponse( - value: NEstimate.fromJson( - map, - ), - ); + return ExchangeResponse(value: NEstimate.fromJson(map)); } catch (e, s) { Logging.instance.e( "Nanswap.getEstimate() response was: $json", @@ -270,11 +257,7 @@ class NanswapAPI { map["to"] ??= to.toUpperCase(); map["from"] ??= from.toUpperCase(); - return ExchangeResponse( - value: NEstimate.fromJson( - map, - ), - ); + return ExchangeResponse(value: NEstimate.fromJson(map)); } catch (e, s) { Logging.instance.e( "Nanswap.getEstimateReverse() exception: ", @@ -312,20 +295,14 @@ class NanswapAPI { }) async { final uri = _buildUri( endpoint: "get-limits", - params: { - "to": to.toUpperCase(), - "from": from.toUpperCase(), - }, + params: {"to": to.toUpperCase(), "from": from.toUpperCase()}, ); try { final json = await _makeGetRequest(uri); return ExchangeResponse( - value: ( - minFrom: json["min"] as num, - maxFrom: json["max"] as num, - ), + value: (minFrom: json["min"] as num, maxFrom: json["max"] as num), ); } catch (e, s) { Logging.instance.e( @@ -397,9 +374,7 @@ class NanswapAPI { required String toAddress, String? extraIdOrMemo, }) async { - final uri = _buildUri( - endpoint: "create-order", - ); + final uri = _buildUri(endpoint: "create-order"); final body = { "from": from.toUpperCase(), @@ -417,9 +392,7 @@ class NanswapAPI { try { return ExchangeResponse( - value: NTrade.fromJson( - Map.from(json as Map), - ), + value: NTrade.fromJson(Map.from(json as Map)), ); } catch (_) { debugPrint(json.toString()); @@ -489,21 +462,14 @@ class NanswapAPI { // // The order id Future> getOrder({required String id}) async { - final uri = _buildUri( - endpoint: "get-order", - params: { - "id": id, - }, - ); + final uri = _buildUri(endpoint: "get-order", params: {"id": id}); try { final json = await _makeGetRequest(uri); try { return ExchangeResponse( - value: NTrade.fromJson( - Map.from(json as Map), - ), + value: NTrade.fromJson(Map.from(json as Map)), ); } catch (_) { debugPrint(json.toString()); From 913a4ac7c528d6f524e37ea170a68be676add9ae Mon Sep 17 00:00:00 2001 From: julian Date: Fri, 28 Mar 2025 11:38:20 -0600 Subject: [PATCH 179/193] add explicit cast and type check --- lib/wallets/wallet/impl/xelis_wallet.dart | 22 ++++++++++++++++------ 1 file changed, 16 insertions(+), 6 deletions(-) diff --git a/lib/wallets/wallet/impl/xelis_wallet.dart b/lib/wallets/wallet/impl/xelis_wallet.dart index 72094fcf4..bcbf09f4c 100644 --- a/lib/wallets/wallet/impl/xelis_wallet.dart +++ b/lib/wallets/wallet/impl/xelis_wallet.dart @@ -361,12 +361,22 @@ class XelisWallet extends LibXelisWallet { await libXelisWallet!.rescan(topoheight: BigInt.from(pruningHeight)); } - final txList = objTransactions ?? - (await libXelisWallet!.allHistory()) - .map((jsonStr) => xelis_sdk.TransactionEntry.fromJson( - json.decode(jsonStr), - ) as xelis_sdk.TransactionEntry) - .toList(); + xelis_sdk.TransactionEntry _checkDecodeJsonStringTxEntry( + String jsonString, + ) { + final json = jsonDecode(jsonString); + if (json is Map) { + return xelis_sdk.TransactionEntry.fromJson(json.cast()); + } + + throw Exception("Not a Map on jsonDecode($jsonString)"); + } + + final txList = + objTransactions ?? + (await libXelisWallet!.allHistory()) + .map(_checkDecodeJsonStringTxEntry) + .toList(); final List txns = []; From d9acb6728a260cd26bc2912ab46eb319a370395f Mon Sep 17 00:00:00 2001 From: julian Date: Sat, 29 Mar 2025 12:06:29 -0600 Subject: [PATCH 180/193] update liblelantus ref --- crypto_plugins/flutter_liblelantus | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/crypto_plugins/flutter_liblelantus b/crypto_plugins/flutter_liblelantus index 30bc004bd..7b325030b 160000 --- a/crypto_plugins/flutter_liblelantus +++ b/crypto_plugins/flutter_liblelantus @@ -1 +1 @@ -Subproject commit 30bc004bd7cadd635e943d29033a8d261cbc1eda +Subproject commit 7b325030bce46a423aa46497d1a608b7a8a58976 From 29416bdfc69159501ec9e4e5768c8c6f55b977d3 Mon Sep 17 00:00:00 2001 From: julian Date: Tue, 1 Apr 2025 14:12:21 -0600 Subject: [PATCH 181/193] update spark ref and coinlib with win build fix --- pubspec.lock | 22 ++++++++++--------- scripts/app_config/templates/pubspec.template | 17 +++++++++++--- 2 files changed, 26 insertions(+), 13 deletions(-) diff --git a/pubspec.lock b/pubspec.lock index c74b3910d..3b9ce2337 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -352,18 +352,20 @@ packages: coinlib: dependency: "direct overridden" description: - name: coinlib - sha256: f99c090ca300b6c9b5414dc100f7f36f49a5a2af31d477b3ce04a605c5f1103c - url: "https://pub.dev" - source: hosted + path: coinlib + ref: fd5f658320f00a2e281ccaee97c2d2a77b4aa966 + resolved-ref: fd5f658320f00a2e281ccaee97c2d2a77b4aa966 + url: "https://www.github.com/julian-CStack/coinlib" + source: git version: "3.1.0" coinlib_flutter: dependency: "direct main" description: - name: coinlib_flutter - sha256: "185c622986d12d2ccda98f151ce047360464dd7a6cbb6877781a9816d14bb8c4" - url: "https://pub.dev" - source: hosted + path: coinlib_flutter + ref: fd5f658320f00a2e281ccaee97c2d2a77b4aa966 + resolved-ref: fd5f658320f00a2e281ccaee97c2d2a77b4aa966 + url: "https://www.github.com/julian-CStack/coinlib" + source: git version: "3.0.0" collection: dependency: transitive @@ -830,8 +832,8 @@ packages: dependency: "direct main" description: path: "." - ref: "33e1034911b842c57bdf6ddaa825cbf635a0c9db" - resolved-ref: "33e1034911b842c57bdf6ddaa825cbf635a0c9db" + ref: "32e529f9f6b06a12f9d98cbeed9d2270012a14a0" + resolved-ref: "32e529f9f6b06a12f9d98cbeed9d2270012a14a0" url: "https://github.com/cypherstack/flutter_libsparkmobile.git" source: git version: "0.0.2" diff --git a/scripts/app_config/templates/pubspec.template b/scripts/app_config/templates/pubspec.template index 7f9d25c86..81648e903 100644 --- a/scripts/app_config/templates/pubspec.template +++ b/scripts/app_config/templates/pubspec.template @@ -38,7 +38,7 @@ dependencies: flutter_libsparkmobile: git: url: https://github.com/cypherstack/flutter_libsparkmobile.git - ref: 33e1034911b842c57bdf6ddaa825cbf635a0c9db + ref: 32e529f9f6b06a12f9d98cbeed9d2270012a14a0 # cs_monero compat (unpublished) compat: @@ -257,8 +257,19 @@ dependency_overrides: win32: ^5.5.4 # namecoin names lib needs to be updated - coinlib: ^3.0.0 - coinlib_flutter: ^3.0.0 + #coinlib: ^3.0.0 + #coinlib_flutter: ^3.0.0 + coinlib: + git: + url: https://www.github.com/julian-CStack/coinlib + path: coinlib + ref: fd5f658320f00a2e281ccaee97c2d2a77b4aa966 + + coinlib_flutter: + git: + url: https://www.github.com/julian-CStack/coinlib + path: coinlib_flutter + ref: fd5f658320f00a2e281ccaee97c2d2a77b4aa966 bip47: git: From b435838dc3467cca6cb37b0dee879a11368ec3d7 Mon Sep 17 00:00:00 2001 From: julian Date: Tue, 1 Apr 2025 17:18:05 -0600 Subject: [PATCH 182/193] fix bad patch --- pubspec.lock | 4 ++-- scripts/app_config/templates/pubspec.template | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/pubspec.lock b/pubspec.lock index 3b9ce2337..b4599310d 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -832,8 +832,8 @@ packages: dependency: "direct main" description: path: "." - ref: "32e529f9f6b06a12f9d98cbeed9d2270012a14a0" - resolved-ref: "32e529f9f6b06a12f9d98cbeed9d2270012a14a0" + ref: e8c502652da7836cd1a22893339838553675b464 + resolved-ref: e8c502652da7836cd1a22893339838553675b464 url: "https://github.com/cypherstack/flutter_libsparkmobile.git" source: git version: "0.0.2" diff --git a/scripts/app_config/templates/pubspec.template b/scripts/app_config/templates/pubspec.template index 81648e903..61918bf7a 100644 --- a/scripts/app_config/templates/pubspec.template +++ b/scripts/app_config/templates/pubspec.template @@ -38,7 +38,7 @@ dependencies: flutter_libsparkmobile: git: url: https://github.com/cypherstack/flutter_libsparkmobile.git - ref: 32e529f9f6b06a12f9d98cbeed9d2270012a14a0 + ref: e8c502652da7836cd1a22893339838553675b464 # cs_monero compat (unpublished) compat: From 56bcc23c746ff82f8de3f22ab09864380f9b9b19 Mon Sep 17 00:00:00 2001 From: Tritonn204 Date: Mon, 14 Apr 2025 11:58:03 -0700 Subject: [PATCH 183/193] fixed path separator on windows, decouple fee calculation from transfer count in TX history --- .../.signature.p7s | Bin 0 -> 18696 bytes .../LICENSE | 21 + ...rosoft.Windows.CppWinRT.2.0.210806.1.nupkg | Bin 0 -> 642114 bytes .../bin/cppwinrt.exe | Bin 0 -> 1204088 bytes .../build/native/CppWinrtRules.Project.xml | 84 ++ .../native/Microsoft.Windows.CppWinRT.props | 66 ++ .../native/Microsoft.Windows.CppWinRT.targets | 888 ++++++++++++++++++ .../lib/arm/cppwinrt_fast_forwarder.lib | Bin 0 -> 323648 bytes .../lib/arm64/cppwinrt_fast_forwarder.lib | Bin 0 -> 305486 bytes .../lib/win32/cppwinrt_fast_forwarder.lib | Bin 0 -> 217970 bytes .../lib/x64/cppwinrt_fast_forwarder.lib | Bin 0 -> 259428 bytes .../readme.txt | 22 + lib/utilities/stack_file_system.dart | 4 +- lib/wallets/wallet/impl/xelis_wallet.dart | 13 +- .../wallet/intermediate/lib_xelis_wallet.dart | 4 +- libtinfo5.deb | Bin 0 -> 100086 bytes pubspec.lock | 20 +- 17 files changed, 1101 insertions(+), 21 deletions(-) create mode 100644 Microsoft.Windows.CppWinRT.2.0.210806.1/.signature.p7s create mode 100644 Microsoft.Windows.CppWinRT.2.0.210806.1/LICENSE create mode 100644 Microsoft.Windows.CppWinRT.2.0.210806.1/Microsoft.Windows.CppWinRT.2.0.210806.1.nupkg create mode 100644 Microsoft.Windows.CppWinRT.2.0.210806.1/bin/cppwinrt.exe create mode 100644 Microsoft.Windows.CppWinRT.2.0.210806.1/build/native/CppWinrtRules.Project.xml create mode 100644 Microsoft.Windows.CppWinRT.2.0.210806.1/build/native/Microsoft.Windows.CppWinRT.props create mode 100644 Microsoft.Windows.CppWinRT.2.0.210806.1/build/native/Microsoft.Windows.CppWinRT.targets create mode 100644 Microsoft.Windows.CppWinRT.2.0.210806.1/build/native/lib/arm/cppwinrt_fast_forwarder.lib create mode 100644 Microsoft.Windows.CppWinRT.2.0.210806.1/build/native/lib/arm64/cppwinrt_fast_forwarder.lib create mode 100644 Microsoft.Windows.CppWinRT.2.0.210806.1/build/native/lib/win32/cppwinrt_fast_forwarder.lib create mode 100644 Microsoft.Windows.CppWinRT.2.0.210806.1/build/native/lib/x64/cppwinrt_fast_forwarder.lib create mode 100644 Microsoft.Windows.CppWinRT.2.0.210806.1/readme.txt create mode 100644 libtinfo5.deb diff --git a/Microsoft.Windows.CppWinRT.2.0.210806.1/.signature.p7s b/Microsoft.Windows.CppWinRT.2.0.210806.1/.signature.p7s new file mode 100644 index 0000000000000000000000000000000000000000..8795060a209cd2f9414a32424b67f055aee7d7ca GIT binary patch literal 18696 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 +0c(9&@a* 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 T#g~&_bcN+gZk*2~_6z(MsmwGx literal 0 HcmV?d00001 diff --git a/Microsoft.Windows.CppWinRT.2.0.210806.1/LICENSE b/Microsoft.Windows.CppWinRT.2.0.210806.1/LICENSE new file mode 100644 index 000000000..9e841e7a2 --- /dev/null +++ b/Microsoft.Windows.CppWinRT.2.0.210806.1/LICENSE @@ -0,0 +1,21 @@ + MIT License + + Copyright (c) Microsoft Corporation. + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE diff --git a/Microsoft.Windows.CppWinRT.2.0.210806.1/Microsoft.Windows.CppWinRT.2.0.210806.1.nupkg b/Microsoft.Windows.CppWinRT.2.0.210806.1/Microsoft.Windows.CppWinRT.2.0.210806.1.nupkg new file mode 100644 index 0000000000000000000000000000000000000000..19a52273508c58d3b94f320a8412701d0594f70e GIT binary patch literal 642114 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

-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

qdN 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

bn*Ds4_=~jd|5$lZ32T) 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 literal 0 HcmV?d00001 diff --git a/Microsoft.Windows.CppWinRT.2.0.210806.1/bin/cppwinrt.exe b/Microsoft.Windows.CppWinRT.2.0.210806.1/bin/cppwinrt.exe new file mode 100644 index 0000000000000000000000000000000000000000..a78f34b05a4c98b0da925442711c2af8f64ca119 GIT binary patch literal 1204088 zcmeFaeRx#Wxi-F&3}L{588m9tSfWOYf*1icI;a7e1eJjakOZp;TBR|yN@WI72@X!C zX0zNjZP9uvJ;j#xa4cg!;@hclczp6+1Ned z$-)21iEPij_mi@RxeUE?qhxm^E^t10hjqi6K$bS5< z>U;d-KUUwy<4@rG`ES;LuL0lNw`D&56ux(VlKH(8@ICOr#K)ge-$%cgk@y6U$hA}jMim^8BapJOg!4xAGKdP>pGJFmJr^I}X^>1eI)(t^C99)X=5H60D zM3MF{-!N9syz7>mg1}7v^}qwiegnQ&5C^G$#X!hRUCh{dA?|lfF^n_uy&KPfbD@D==O z@kkF^+K*-*WV7e6*;*7vv(xaEY?k*5zL9En+8#DLht1xQX!d7p_HMh`XR&VgR~3GO z0x!RpZNwY}4Sc);kFVQbomqACV?1d*jM44o{bE(kwg1@}tntxbaQ{`_pQg%JwedPn zT|YZ*2qj))iFbK7TbJnO^`{+dy*>S3xfqD_4n+n$72>eDyuev0?sb?O3vxt>Lo9X` zXEl3cp_@f!c&>A1=u4u)G0$97;PD>0t3t%Y#sbguX0fQiwKRUQcb}Nxp5I})E|r%a z$TsjSFVf6)x|my3~57d;S|@f;<@|)KmA?rd2nJ|6aL&)vPA#e zu^5b_+G0;U)GI1-%uu&H>7{I=Sx!~egD$b&X;brwmw3!d0N7HU8&d)!R-#z0^s|z`3$;)Moy1MUEOwa1&NZ=O zS4M`JEqra2@lcOBJ|5~eG4xVADRrT{qx&<^omi5KPG-kV6!CY7c}d)?!ZUxnYic1*|0=c>#XKL!H9k6c2TX@)r4rw$!+TPI12zK=qFohs2d=*8Ox- zWH5us!q9^|MW{y%h3^6CE@6uuk!DXo{(c_^f)1O|p*)0N!`k1J-u}|fn;cI*`Q*gl zZNk?hE;fBcCT7|Ic5Gx`gn1CU$HrG1LwF*bT#QXbz z3IB(;n3FgU*MaW+1G8V2ucJ$>0P)WC`y7V+>*C?$-##XN|9BXEFFZDVoBmF*%mo@J zG59*fMDI1u&`fcS!+VV@bWV(b91EuTDVUswyRyk%4{O}7`+96j9lla*DifE9YnbYy0@HfmC&6_`^QgN3@TzxdM@2u&~k*1@Op{aMTTUsWUf%LI3 zK_w-kyrXX}s9pFv#o7hdhGOs9g~1tEC|oW?g<=y)RP+#ZGuvG3Fe{vqQirSGWr1=I z1uEo;&jN~2oA7szN3LM)R5Nm8AgdWG!%Mf)s5GK>_Btr+_t?P{eyXaoFcBx15FrJio5_vl%!E^YL7kMu;=n?a= zWX$MlRChnq-0v2d?q{0%o$hBc`?K6n^G8HFgYzRY!yWxE03a?AhpID|$vjX)z>40$ zZVv|JKb`{~E&j6RIlQ{L2VX<^_=QzPKurH7iHh%lm!wr}IabBJy5byEw4%48(SV%M zngMEXSr&h0HOKdGzyZ-55K&&m*LtjlF8S`(%;D?kdcC-h09uXZs+KurhGi{46`2cA z^rgLSjmuADq@M&XYqUE^QaN!?|}Tyr13`8ic}N71LsOML7pVvS%NBQC4QA& zf&xW0ql7)b#gmi5ar3|~JWS5-VEXie{6fwOGqhJeG8B(jXM&o+4Fcle8utml9$Ejq zX4W!wQ_A~r6Wo@Qv-TN`-q+#vb-ANoh3$Z4g69$o4oT?*Q^AwSriD0O-~w3n;lmv~yW9Uoi`%fFLp^sOD; z(Qe(ucs9|HY~u4e+LA1l=;$SOwAb#a|J&$jJUR;BUud{%n=l#TpxpCI482?d4>8nk z`dXG_61`8>yI?0j~jS$Fhl*73DOhO*pIaI2BH+4zFO4eT02{^M8ns6*$Bz+hck zsW%d(J{N;eB}-vo?Zn{YXrpQ?K8V5NIk1_K|06ouraQuj4S7eRiO`}ErFQ62R3GHR zWT}xr?@B9mW};N^yw92Tqd=@84tMk;pe=m=g@#q$WBIoSzaks5C^?kA6Z5t0X4}5@ zlL3L{mk;GF=qTmGH$_y388nmo255fF#uuOY-l z`PS&GL7(t%6Z@vW6#3K9%}11Y$`MPCMw-u>zE6uM_k(*eNsGf*oub-e zO|>;oCD31srcg4qierWZc`wB(ru8kCB}xWQi1`LcybzZkqD0^2qbeGJAX)L$V^wsa zM4w|+#az3hBE~;8*s!S{c?&(}v*H0<4+nLcU2!5o-8rlxZ=vEGR{Zv;ip6$C#X#;% zR-Awu3-PG`hT;7L(u)@lE53ro&mUfVb$anB$>NjIdKDf4kyOhqp9JBp#SIX34`}>2 z+)U8-Y0Vi%|GgqKKqd^8-q#4iNAcCq=jf@a4_`Uc{j^)$nB!jXlBn?1`K9-@ zb*EVKGt3f?XpQ`xR$g|U%hS35-o*anVYs!zCWPfy2Cn`$%t)zf$6GTP+AUg#>GRa5 z_UrLHpFW=AierpM_?@E6A@)UjvLX_4gT@(@onTo?0LOQvvI^W%|bSd^I0-KJlH zl?CJ{0=kSin9v^DP}lOe$l@KqbIQV?K@I&*WS|b3s?N9uy1N9`2%toQJOXC<0F+l! zk8FX^rGW1Oo09Tr{8DVSL%#jDcpRemyf`Rov8yVM`c)s|Bfj1v|0ag1J$8pyIiT#3 z57cKH{W(I70z7Z|HKwlzS|TvB(T3%JNdCc86C>9EY2i(?F&kTB(T(7|di905 z`mlJojAFh_Fb8ieeewopK+}yK+j=9C5jM7=J&f9$CE|d)YArjB}4IqdIbE+?_ zT77;QbR>Mp4=x_B6kFe3sA`t49e*wO+Z~X7T*Zq$(-*s@`|Cw{eO865%rk=v(_ zGx|@T?r$us#tPeN`s?NCS>u8GdT88PzO7i2ks9f-e4W5ghWjdCC#DBxAb1)LLd(B9 zeo@t|G9!M`E%>aSU2RA|6la=x(I$8FZ$NK&(;N`{Hq*BY^}xV1$lHK+6Hg;Uv)m8d z1|22RbkOo|iwwox^M~v%*uBQqHBno&eA^WM_6Fn` zP1GzJlx9(n(h%oK&BFaaIqwX!Hr)??fO~y&@u2|u3okwoknLEN0EChafMfxXJPioB zVBcMs<22aQQRPsmTCGrZ15tGmP<3Ww3RO>{fw52(To@Ue<9?t_LDxP8n&t##riPBf zAJB~hbcGtaQwUurEM3*k5~r zIm%fW^no$JtBQ!APDCb3nE_6Q-!U~Nv9U5bl7Y1aWhVBdv9eB;&)qt+=y?=0c zXyDR+*1+4~E*RcC-2n84y&KXd@n>x3*u$Hsh8Ix7Tg2gAh~cdSZR+8LuGe&42ZBtJ zdSs~3{lHJL79&j^V~nXVp!9Qqv{{3696)+VgG2_^ck0+6xfDnX6-WyR(oBH#66ipK z1UN!pi}{pV8uQW2#K@CNFfw$$`+*z<+iPRMc78zag1!&fGEfeUP6BM(G;EYweVdNP z<517JFrc3IpRQ2n?*zwpU*+%2Y7Ue^Op(?2qL5VOk{%#vXr0M*Im!d{Wi(f2H#aN6 zlA+4)C1chs*;fY+O_pi;sTZ}V^$))J6g^ETk(O}qeFTbuB(@!Vi>?}H$dAt*Z^-$) zx||u~^awpgP&a3Yu&RhUWJj-|rL3K(8%>QBUY0_PSRci^uMf35iI!C$%u3;I{t z7N2u&W+*=%Iw~eq?E<+}?Zij?>z+unOL_^gQjF$iCCW6iOhc;7$*D4qM45dovo}@d zg9noBj7yX`z%nhVGKW%SvJ+)qW103;nV+W0j8By5W|_`ZnFmv4oQX1jW|^K;nJ=fx zOh}X&WEq(%b7iW`#6+2t&9CuuTB^)(i84po&WEXXKG~ccyDL#0-N%rnz|)fpz4c!l%INZ zb@I{NJh)8~y@bA36=2C}sghHZC94=auUf(9+wdWOd%n_^G~tY(Hw2&HuZ5qAu!p9F ziwxLSO}Pl^?L^gpwV=QeTTtLcG{gwVhv*1auCXvBv-HAT=v6P@b*5dYh9;$MuV2As}^0j#G9 zrJp^M40}OA&WYq5&9$%o<_cW6eX+U)1(O@+s_Qn4ZgLbB<~6HN)hAkp#;Z9U0*o7nJ!yckK!Y0$8(MfDhKJ6OXJF&^MKS zEY>+@$EVMJmJesWy2d?qfnj`}e%ym{)Q>YqsK#B>^<>w;=5k?hgSP9ai46WYag}3w zbIjL4u%@@#;gEpkxDbjl)k_#q9j$mQ5C0Ur>?((76DLf63F83d$`(DmZk*+q)jxgx z3Kd!7o9FX72hdP`){cr`f;X!%)5UTqIsS3B6S2-dzz0ia^#386X9k2-y ze*hUC~*%_!g@4N^L;k=yTMDX~68MKRXs?RgmxS zE&!)iz5MiyVIGjg`g0-vZY?Ts%E#}8A&#ide77My(@#SD=d=<>V5y9};WSi;Je~V| zj=h}kNw=4s$8xD05$@{D_}vb9_dVIh8mzZZ;9S9y3NFTjEIbew%3V*wqJ_hWOWN}j zfaa(g0-mZJ)%2>`vnXE&sUy~ZQbWct+QE>a_Uxb4bga929Gaf4PXP=4=9v88h*{H% zXoOkQCb9)0Y~!s`r@6#IxK?bSj;L5btaKySW$eK)zwj^iV6DDj+_4=hWCk5457yZ? zV-G%LU&&c(v*Av@9bvi-#Q1#eUSDTuoHx`JoLZexft9foy{y3?J$Pn5!)hg_YDX*y zHun8c%$&Yt?I(S)becooMv_LlLVApdUy}YdHxnn3ON|O(IpJP|X$*2WqYO;l6_7o5fQmt*@Ov#U zaG8_M3Wu#nqWnJim0FQ6K)cPp%Nb_-135_!aTH`O7lOyYr8K1>12OQUa1g!erzDa{LwA-`CpT=_@ROAA1NbCWNCXck0#Zkk6Cr zAZ-R{aa12)#Q>GO6!&0_V1!fg$ivi^YFAYb5G2WO^drYp8U2~FUKH6k*0Hi@cDrnc z%RV8NlOQDe&(|nq|9R{mX*dq>3s0p$Aa$t|sXHEvlY)to(=<@IXg4PT)Q;_mp05|d zf_(8hGjtGAol;dmz@mxAp;^_ZRuyqFUx!2Yj^yprs!y+4p156^yzQ9vVt?jS83Ou^ zFw{s2R^5oP7{?lmO%I4KTmO8$za@@XKDZ|bg6I_-2;Q4P(iX&PHze(%LsS5y3Z==l z6fDk2O}7zTqTE>iZu!A&Nv0s6nN2f7tHSr>yF%B&vbov;&H*uPj+ZVJqv5gOD?t9} z)v{k42Tr(-obZP~1}Ch9tule=Jw{Pk|J4!68#etjzsi-GKNZ^lRJ>W8g}5mqsiY{k z=C)U`4=gqh+1eApa)LwuZXK9UvpjBRM({Gsp9iz&f)78ZqIy-OoR+Qh6?iKh(_`>R zw#AFRgLlogTt(9d&Ew$1k9-El*1`UXm?jsA&CFV5Uh5G1d41#cn65H#b}m5q4*-y) zJzk8NfAT+(FDDcFW6PIC@L4D1OT!N!U&dF}VZy7&50fwJ0oMOczWiT-zw)jz;eY5y zDfkEfUCGCK!arO-K8;cS{|Ntgzdk1X?LSPxU#Q`KY&85IW0e1w;crN>0QmEBKUY6_ z1EM*dey&XECoT$$YM6a-)WmSWrySe4o63yTzR;M4A5O#1%)F#HCR5_kZs&5o&sFE1xZ?kL^A zh~mLH*RFB06F~|aDBn&ElOK56r676}fgQzedyL>Z8X%1J)ZUU}w?=pa*zNl8hWyE) zwQdja+3uc#BoI$A1K*qk{M;_T^<}c&Ci&t`*#?rjx>PK)r-u;WIifL*m<1Ih@%Xmm zPMiF}rBK&1hs^`xr%)iiMV73UO*wH*It%;%f}ejKC9U5~q9pW%VHBa^J4{xt;Y%QF z8AflDr_czyULmY}Y=o`8StIPR)#(Tu9F8z%7Xq6aVRsZ|8+~^G;qpVw4@o9Lk8@J; zs1Pc|vWntXh#jLc9xTX#5;0A@2{AMcYDG>!WP%{)2+!tyRI%lgGclG$1w|kMs5diI z+HiqrMy?QknZbf--sJ^zLKE>Dg}lwd`DiGIwG247ZemI z>bkaCS&6kxp^HnPXby?C{-3B87hk%lpfI#BmW7&z*dMz}DW^1EaUU|wg7o0RfOwoC z4pwJW%0ci0Je<4AoDBn7>{p_0O`;fNA0W#M$Rm%bVjeMs-vt3V;omTs1G!>Qv{%)^ zt1YY0PE`(|uY9f+zo7zr13>Bpn84>S{VcPh5?TZDAde_@u??R&@@7Ia2n2beAG>RR z!tq040}gWJ-AEDv_VNL2UUha=5xSBeJgP_vTI6YXq;)wwLJFAdN<0dE86j%~kcTot zg;c@VVDo#K;?QDtgD@|(!A~K)L=3JNG!8Va0h1@1z|PNR9hOIUVEJNmyoi~1JCX%2 zw+o_Pfr!PJ@LL%P$cGkG>d+4GZSOl3?P(Wt_4UujLTOIx)SQBN-K=eHQ^0`?9c+S7PYp?Z>n1LGR9h&vp+`E zT^wxg^QPnHFS~95)398SOOkQJ_PR6$<(wc)ykM|G3>2Sz} z;cOJyW)}8Bkbjgo&8vo6#x`YgbzN_#(rWrYk|Ku91NA^!k{pKRSDKG79~3KL4->?M zFUO1)sEgcKv=|o(aUQY3DHb|JvCDjf$)IL=o%#F>UPPy{aI<)xt(g9YOlvMKypQl< z$mLa!-L>Dx%AJihrW}@b96#pkV%sraH@~1-!Iwztf{tFDQ6}J?I4XZhwy4rkO<#lM z+lA!WCM+A%k1Jn&O#LW?y-R;ev;|Mpn#`-pFz98mqHVYpupa5aS4{mN|F`^gv1mJP zk^je{e5km8l<{HB|KW0jm$1&)6|V6ZAy2r*X@neLgW0XVH#7Pj_%tFlJ3N2^`37PS z$L_wWS={e1qg`l3__iZgKiZ8;OWiP4>Knr0-cN$3)x#;UTbACMVL-r)kF*wfKM4&8 zRbuw5R!Oe+6SuDexp)QPdnXv7>~PJSMktrjOyS!R8A8h7Nyr(o0vUaOK@^@&>Ci$e z+K9el>T@lIh%x5^rdV_@Zd0*TW9BVA(mY(Lk>2!WHPTk!TL31AfxU$scMsN0o$qa- z2mzTUlaLf2U+ah$%A40@8nZt(L%RVEmPUhU2J4^R>aP7UBqFnhYQJP(M0rQ}b~X29 zUTs=A=+Ck|_#~e%GNZh-?DXcJ!R!SGHbYIb<4o^woc*d<(`eT0Ma~!cafm$|QQ8{{ zyK7&;P()2wSfo`e>cl75dGr=Fc>Yqv5R1BSsYv0K8x$#wLn@@#-xT!5co+GvoO*l_ zHPBQH_mm7I?-zT}{X9>sSU)Y+8C@8dZ*Ok@L?o~K8>L661|8y&4d|5a?hAy){!mLZ7BYb<4TMy_m!qRBumwBm)%_?P1 zxY%4wqi-Z6y|Tp2(EB3VS%`>hnH|Tb1^z;Gf?sA0y^Yyv2z(EB(-4U5tqOtL6ax9n zMxY~s!20Xec*hHWo7dm|zeZr2jldRp2w*Fq9%)D+ko|uS0`CDW0fComodXDrMR%bF zhZu{p8I@8KWh(}8dpe*OHSHqQqBy#umPm6klHI&zP9nMuaT`@zy&ZC9Y|<@ehA+dDIc9?N{QS3%dw!W zM+Q+@FRKq#lT1f}o)zVNSr1>5Zq(O_Pz{B>8h$`lycm!7AFr3B(zdR~ZX9gRv7!MV*sC;cXY&}yrp?ZFRm2t_~=ID^puMx$WV&^3);V?s^TFcZoB2`A9xO0*vorckw;! zU2cGZsvBgIqjhzzEO`i&RO%?|KSAA5PzB21;QSgON!wre-WIS4>@UQ$L!a6~7K6A? zeQJ4(+%R+_md2UiQM|=AZNVN|ef8i1I|x_Iw;i8`yeI%wLWyThz4L^U<$YIRa3j;E}xg=qIe2zX^etc2|hd!ES{}0>X@jf>D!AhxV0=q)$ zBt=0@JNa3U9e6eU4Xq`G7)KAsVQcF4vxNCN&r#fp#T*YMR9TW1GYU0b-IGt%aks9o zxGJ)E_zQCZL}!4$cEf#Bjj$J-e&s!~@ndlJmOM@ZrS*};48k=qH23cxkaD|32$_Iw z*b?=1Q3Jlvj^smdi0w#fFGfrhdLX(-GNbPP)2U;2za3p4Q@GM>zsnip zNUCGnN6)0uN#d;>oDU~ zZdcA2$A~Se<1OD~b~{RAtwK{uO}PxQU*UgDAWPKWg+04o|8`nfJKVKDg6K=INEnUt zAO^S_sU^OLGACw`C&%}Yn_|<0V#_ZqQ|RWNU@BwUJnNEQDN7npY+#QPO)cVi3a4YP ztcuE*u^sXN?NSQJ>@Zmjw?qYD;|X62=p;|&H!!l{j(!21A-XXMi6_m4-nLNR>=$85 zW+3jUq?qXoo7k7?>+ORE1wz|erlngMHZ&WeZY^{qxjz?Z@P&o0ph~lezUxp!jhZku zYM98`>`Ju9VlMR)-78@Zjq9){D zl(%48Lpr|R!y|>SD~PX`2p?2ywa3rgv(|4$Za5im!x~55sxhG&?*D0cL+*HY^e!TFgD2Cy)z=^M?F7)^jtRD?lquW< zo5_S3#~iC6YyH}{x%XOm%C%0D+3$X#bk6LLnO@nj4BK%_bLUPDO@0CNj_|i#WNzLI+@?c%G29CdC+~|T zdEymOnv2aC*U+;njE|eMLgTE3%lmJmqY%D854Nhq2??)g9(QU4a8Ym^nvn&yh;3xz z*$fpPkU97bcV8~*O#4TQPe>{!n+Lkk!Lj`#;#2c^u14i6L^7D=3nxUu9`eqB-dutD zhK#_?NxuY$6F(u;k(?scLa7jk5aQuoc?IS9rX0_2)DRbA$B+3u)qLc&X4C!QA3*#u zwXc!T!94|6ld;vbU{i84u7n@k3U*eHH!boraj+^MRZYdmSv#d^9g&Dy?2)=GQAbkT~e-C9&ue-Jzkcme)XpA6WS$V7)gEkJI zNOeZlG<1Ll09TeQgLxE-QkD<_kwcj&$rw}SJ#WLn)fYF42i@ghKumY!~#%R-#8Zib-q}9(*W{*Z~D)j#Py`l@A=oH_nxK3EM)D ze9^&XMJvJ1YKBZ(8j!DUCUB64z2vZ5D#aesL=TB^29BTj97_B*)Bq*!1T-KD-8Qyt zrLnP$Du$|P)M)4_pyUN8kGRiOtYB@(K#g@%;Q4Q!{yNf7vB_;nv?56)d-ki5BN^`b zN2VV_Y{Xpb$?BNyADCBWxh?}Co_2_Rx<=BLZ3KMnc)vjxx~5{6p3HwaH z0R!{}a$_*=pDj{K17b5XA`17zg3cOCB?mr1XJ>h$S zJQq%<*(Y96Pd-#*YmBdVK$&oIOmAMR#)N)kr3Q@|c<3KNz9QV5V3n{SbfEn!yqXh4z`4bSYLzdIpf^rK{u1u|E zYc=iH>@?i9PhoL#)z@>WA7KV9wz59P9|QP-^lhaU_gt0YEk)t`X{bDoisAe7C%L2F z!j-rLP6k90Kz)z|arw9TWU6iQi}Tn>52BUOD;ki98bEaD+sBdYu0ThoLSarV1wBN(5~GtjYvatv^{_WWV^ zD)%ChcX8phG%gtmL5v(qjajo@P6A7{%D0=o9Y|-B7l8TU*dZJz5D#_1ZzX@eK_LlM za(T{C`8J-T1S#=o;(qAflD@BEsNu^8kfjYr!>p$M+eA%o2{#)K5 zbL9^A{1^f-mTx=p7m#0^zL`pu;I z;lq%pXoL@%><8EK!Q1wORC{IIc;t6h{q(okcCiB=_O^@W#cJC{B6CMq(BoN|8qct^ z%7(9x_XRdZw871WBWJ3fVC!4i`dW`%gQjP{XsZM2SR|EHEbDOIkpHN-LacXWed7Hr zxS0Fj8&?5t_tR6|3%cr7!ZKbrcDDQp@eurLsU-XNkVpo%Q7QaJaNPb1sr<;^|MFN# z`m30vzbd`{&sjf_*gtl+Q-&q!-=iwEAtgV6S%$!D--TgAtLP};1e}NXDqy12{QMmK zb09I-*Qf=NMj49mm_y{pBSm;C-cO@B%ui&%PVT_zaop)c%W$njd@4NRO{Q`*0g4f4 zDa;I>Xv-__OIlRnOof@D_i?z#k+{3|Vbt&*Hp>SsBr~fM6nahnht?7&_6IEj6rlkn z^S)%2crfBY#1CNo!fkl9_ikr!fhfuMmK22YMac|rNnt2gloWYO<{~e>WP!J2VaO>; z0^XA4!93Iy2jD+%kH^&@hcL)0_^>!gK6`^)j4H2MDnrQIeffG>Y8SA{Ihilyj9gxb z1#JYUR^{UxvV)tN93QHgz#?JV5e~G|izHDQ-@spDJ!H3nVjcLf*TYi~B*}G|s6u?J z^;m%e)SSoxM%&_joJi=R*A7N<5gNdE&YA4+=ikgQ%uA4+QtIfqsaWqf8nwPud-f)k z7TDPZ$QN+II7ZGu4Upv!lVKCPEJu{qGwpC>V?d~l%Y{T}Me$@tMzCOx%$ouPA~T9P z8L+J{g`pnGMrKle@Jcp~mZl-Ya5gjMb18pzfz{!f7QO2RfX?h*mE1=?kw0>%sFsk1 z7ZuD2o44UlYVasK+fw8g3E>)7*)dF1?J zCi7HAH6|dpo@0YDft)ku72-RG2~~VVn?%OHqIC-7S}s(Mm}zi6gYHz4_6)h5E`|kq zF1NF(k^k_J9-HNpKuN^v5+W=yt$&5gO-^fq+>`6ePLd*h<_f<{<+S`NLrj4zs}%P* zu>d^c9v2)qc_@*Ogg8&g;f)3T;J=PpZ}*>qyghDouDTf+8C5)Og6DHAS(r(H^El9k zmr}%+$1`qdalG(t0EqUGVU}0i|6{<4^nE6T7bk#CtjA&d9{?X{tU^I2zV1>0(zOKG zy>9@n*5LW1Y;@~tVz-LU@hkUg)$alM^mkOhx#%~ixIcz|^K`#$caK2Q|FZuXiT+&& z^sqg|fy?eb#(5#4RrhVF?ynx%eR6*OhvQH7pO@Z$mfe5pSpC1ae#G$EKl15%(%1iX zw31r?>9G^?H7tK{HRL}A44X{AL6Fv&5C5G@Q z+fMqwck!3y4@(z(m6krjYV&lmg&W8g*5k78G_+uqH-ViL0TvakYEh;@(SOqY>5hI1 zhOG-MA70>OyTF?$prQsbBkfQtcn+9s_d{ZaF&1|%Ilosg zMUhUCC}+T1JG|V|RJof{<#=Kh%F&^0w|8Eu+@+~<({wp5RJ&Yes@#-RIi5#__L!Y% zmwW5h#5kgTxNDDt2T=_#_sdkd=2SVJKsCJFmQ*>q9T=4d$!rCy)MxvJzNpXj3r$so z(zI3+3g)SWOqPU#V zv(c*sz#+~Y6Ls&ihFW%b3hxBEK8#kzjjfnZ9+28Wk z{e1Xq^>Cqj_*lMr$na12K0f3jzTrkv9_oBc{qW!io>1P08znxC(0$>?9(-qp?g}@m zm{I7qaASkIvpU>ZhYKTA8Ey>Y+YwqE#s=~bTm}J0XuitHpQ~~8K`Om%H`vw+{b?*HNQU&E)X9r(Pq zB#F<}7abFyN}sV0tfoGI&8QwLM`^A21!^(1rMec38-%1utq~K-Bcm23d-^P;)(p`X9IY z>bX|hWA4jpuAT5Yp%t{|DBDWz=V1d1RzGWTB4E%^S|k~6FInX^w! z`ft*6<%cClD`jRkRd_#AiF~`@7weggQ}yW#Y^1pfznIF3^ED_fU_N72@UtC^)U+G! z+ILYxSuKA7RxICE_ziJ~S(|K+A?;py=mKtj^J8nNGKA!kFEV(t9S;6X`2n`MSpKbY z`uTue9b6l_NPC$>=d0bQ?R$w69xAHNVStN~C)#w_NJaXS90U&fuh4~uRN)pDrY8dj zIPi=&b>vzbYJCTw0e{#`Re{gFXbbfVw-TIQxpM|U7%knl-EPkj%gzC{VzbOaCTh!4 zstWcFmJR4w{-hcasVZD0cd)eJH49v03Hr=U(PxgLPplqApRdao55PsRu^`t7o{4Ez zT7CUNEM-y-f8`bvcu3*mN7S4{mB*Za_EimCVjJ6UA+4TzSZ3NOxU;0pIxx@mrq#D7q%^NVM+^-#aHWG<7MeD@R2kyvMBW zq9!L>v44lf)!8cNgfGJ$cWeF_C$_w`PM1Z2fc)Ci@W`k0DBT}867?)Uf(>&rxfmRQ zkn$nUMYrsgdYnX#nd%icoD1y-9F4>Q^&0v_e0*j4`k0$i_J{ie;U8J)GFQSc-MFQq z5J`1~XsoXMT_o&f)KO7ZR1G()2;+gcZ)2VB&p4DF36`~IQ~TigDAtWGc!!Z&|7WBB zWT>~|z;F}Nbs3yArA}qZ<6u`=#c}usXj!3H{}=HQ-rzEV z@E^zx`WdyreszRtsw~V4vj)eQbdq8_LGB&+lL7fWNT|P5z6(u5EOFw<{(_9)Oe9Sl zlxHy`b%|5HeRv$x<z|06yRWEtxih?JmJvJ`Mh=!;K%U73 z%_Z7ZkMigan>@RTe)95LYcgpcwpbaH98& zGP3_tlnE8Cz_9Ks2u@>P@VWiug?OCDq@#e9Yn{ke#&izfh9V#C2A+=-Lm;ko4mmg{+bF<3hPTmcB%bYl5Um;Ug6EBUi!pNu zhwR;@XO6l0lmMK$pWX-4a54(261(^661yQIJa!3_C7Az#h`kHeBshMD+Rawf3EYW-xGs^AXg~N}VtF-xuRNQCK+|iXFX# z0u#9d2Cj}^9h48;1~9Pk#EASYOS^y}s{WRV4Z$G%$lq` zUQ{Yn?LvZWJ<4`*9G)VHr}&Hq=;0V4t~s_7U@H&Bd=KU6R_f1SE92SqU(^t4W4_vA z{j5%<7WP-+*+D!5cIXUN*jYa}4LiIm3zj6XgATQKpv6Et#7oI94ICYFa*uMp%M?i}q}v@4?Zo*s>ROM`e+pO3 zwZb3%C$1P;mvF^Y-=Y+z6jIX=tub$7c>~=;8q0sh0>&y16j z`s3z-UUW1TKYL%iX@0)|n6bCtyK5UTAyBc}pRGk01Lt`bLcaMs85(y-p>JWspLZVi zd6~Gp+XXG$J1@um062)@ox~dM+BD7(0|^zSXq=~a?fAQX$& zpsXCg&a;yf`3tQ>II*Te&bc%L+hsz7@H`0|f7vc)cc?%NbWbqgc5kS|UHcLS7HK^j z;o|V7zXLqwEVu$7JcS2fvrrQke;~KKHx47%%WPBZ@m$#=_HexRZqWnEOMEAHa9Gwf zE)D?=#!_1YspeWpLRY&+^bRq(lJstI|41yFi_eGD61UWKO!0?H(Km^18O#OUBte#R zQZQSCn?}EZ02a2^0dA}0ZLhDxtrEgG$cIk?5tMgP_^1SJXKIwbqQ~N|FoNC$pr%XF- z|9DZU()K^KO4S=+7K%^HD&-P19xK_1>g+!DjWDn9FZK;K$$!@3wK5;30go)Q78eAw z%jBO*vyD~O;+z}%Vi=~JqTqsl2>Dx)POl%LdXiqTdo}%iDz^>_hHyF|gQ2sS&vPo} zwB=ZTRF#kf%&7^;cfXq=GHsg_*tSVtrLs4A+sKfpKFHh9o&4P$Sghxv5u{WUy#l*M z?;Sl@sYwCFs!Qx(++e2UV?hk!Mya8%a2^ESksWbcm5LC6}gIe2@7i1b+RNK$0ZX6d1wSg&Z zTTW#q$N<}NM$!SpwvWPDO*#PRBxsPik^wt@MKb3l?q(@6C;3}i)~|ntm%Q=M$ozJM z_w6R1fE>Zf#_~^4dS4D&(CZCjeBwGl(k9RQ^EjZF69?T^D;)CC71>FY>%|n1Kg2!2 zCBQY>W((A_B8%270^GhCfuY>Zq7rp93Y(cOra!h#{GCuVsSBJb->Vte! z_AmIs?^Ba8MlK~IIlXXxsFMr6(mxKzvb{k<+54&z6Dg+!Uu-e}3+%C1x!{rMJg7qP zwaB5ha|w|Zk(Nt1GCTh?=v%98*Galjp?ItRm2}>klD{XOoRq(jf#peNHaLu#(N7t| zi@+M-x#7y*vZ}DP6qf1AMn<2h*5Ia+C8gzQfvU^!1CImhsD?KAILaV#h`1zmbzjJ* z+hGgr#DKZm>yUcCMbn*ZOVxuKOpQZjeL+Ub37BG0-fbs{w58H2N220fprRbJ2bN#A z>X;_hxp=A&GpEBwjOOn*rsKnNtlU_hb^(N#pj$3EJj!J;Fv4W%PaL~Raufc)N zvI5`8)aAf_# z`$2G7lEQfxCUf-#DiICy{{#nuuE9`YBfa-AYjx1_1E! zuH8t)!5`&4?5>>xH8ahN>#>%k$Gq_to9oYoLRaF%Q4nHswLyo)QoI`Ik#m&Cg0ANU zxvwEJn?CM^+%bf*ktVo&@iQRbL!_<`{vO_C0p(^yl^Li)6ALFJ;@4dKLLG8KRjZM; z_*NS^6Wxf(1sTvAafFAvb}u@Rr{HFXgumqEs=MKruL_`g)mD7SJAX%FbG4SvMh&O6 za2kvyZ}^@(BXrT03E?A?gEPZN@`C45@rSET@A}d1FvhC5+~v_qZ0RnYZS*~l8{rKL zGOdN4ve4N8jK1ppCUirt04MONgyrQ#@rUsXg@}-8-N{0QP8Ql}7wW%Vt~^`e?c^#e z3ArTXdpZ^5L@`oB<;5t*A%;$_dN^6o(}{u)*#$8phx9mR6yZKGNAK|*S`7htF?yuy zy_oLrd-AZv;ZNpc?W#fK0zc-evKVvYS0OK2U0$R-;4Kfd?iLj+((d;% zZ^$2?HJlJ>{L6aW+?fe7d?qq z%f)D64T7?tV9zZ`1?TQSA>diD$cMXBh9N7#c6ZR*)(d~Zu(M)!*qlv13I2|2h)SNt zb`C70@cna)V7^+29(pkmSAtiei6jmqr|+8z25gq;MEQwZjJcEXl9Rm9p+toiMZd5( zNxb0v{Wr;{6$CL5+mQ{1i=cyRS z)E50YXsxbvPTlvZa zQTBk>DVfU5Gu43&C^!EXEEiMy*b0b)*df~DJTha3|37Jf{Jb`A7KxClcb0z~i+)Af%HB-M{ufe0VNT{mn0LhwuQEr{0`m6G{QO4qX|kLeRN60U?o_yp(>2%R3j z0x=oTAROp$1Z@7pI1phc{m<{7OAc8?^E(!Td!bk6j0f7%sm>l*<Lt;QWS@RQAcRsOnFImX=42Z5a}n+mZ72pPN7|CH%i)3L>e z1*KHKEjM0>cS~ZWUx=r5B^M$a8SraO?~uItKQI@ARPVY2vK&7Umg=>Zxl$F^TkZq`zs1;7uaCP4=tC8!=cX8;^=xUsi zgnpE#GwwpJN_rgd`XVBHF%f>vZ*7FrUW&XxVmE?*O4FQx^)P?RFP;dtr=K7s>|xLv zdR9InIUolXK>{p_sOit4|s+UE}&Z)-?{ehJpM*sEaR!?sPKa! z235!v z+LZ=|Ud)<)U~fL2TF;vYB*0IytP%bvb#@qbKr!mxjl2^G1nlcjeiVv?ZaD)BvC@8< zWbqFvU&x&k@@4W4$d?=En0sgmYk#4VFC~yK^jwKU$|nA^%Ex1jus0WThsDhJH=W15 z4f;2khi2h0d)47p+RoQTzI^(}iJn`d*P>m+vO?-JmQdi3^+ktY=bRx z;9+}%f=Kx({P0V#5s-r|AC*tS_F5#`>IMq-kg5`0>fR|51HwM7CIPONTyzE!gxj&G z^ib<=oFhN`%V_yUC)wBG!PjcB=I{OK^gtyqNe?6R2{QZ#D(g{~y2xrt0Z92C1 z1tU|9+ICMFsb|{5|Dgm4c3PYyy5eYS^0r?>|4r!f&{0FkXLc5HBV5LX!mhH!~ zqPL(K6zakISh$<#kZi@cFryoFYr5A20n!ttYa+)M0EfF2z;q1DP3SdIhqKNs+-e00 zJGCJ}zidN6l>k9Oqlis`u?8-SEm5M$)=jQLK2qQ4xn*knBiO>5GI{j;UVciNei9sO za#zB~w3D9Z0|6YOVy>*0FEA>KdnB%h0`mUN3cVD!N??;496;_2!@A$O3f$P zZIt!z0U!36LE!M;`W>Cl9k2`RK#Sf=e@G>uUyLju57V3dTg7WQnX1u*66?bOMR>q0K>;>y*n8c8Rn&KW@^-mvDV(i!i2zTiiu&Bwq0c?0 z^tq=xIljkmFpa3$Ay#e|p?XuDfa29ro%A7M_cDiwb1^W)I{kh!4iO~%DbMTj^{OHE zV2HzmGhLxt4G+$QC@&Koz^i!$m67ho?-X49?db;q^e25;uQY!;E*U;yMyoNsP3&*} zQ^KVfhf^*KOPMjff4-dD6Azqly~ z3Wd}8Cd?W*oN(=;ts-B)SMh_X5X4Se_}_aAE}SBi;(L?(PReBB9Q8cA{x&>L)St@w zkB+E+|J$hFgi@^kpQGxB@iGq!IP6`~&Lu zpcLz$JF0#$9w+M0RO7#A`1oJ^BkHe3DK&nqjp5^O$KynO1^=TX>Yw)x>JOom8vm&J zGw?W3|7`YOF{1v;KcoH%lv3j#Rev=eC+aKwpERQWf3toVA8P!g>dUnH1#0{oIQ~#m zVuC#~)xr5Jutyj8L83r$S^;IAY*hu^QA|WUQ7D*JNKMn7x|K5$1-jA-C_FA!1%lk| zqv-Gr6sX#c502xeoWwjNwZD}8a4h-N72vgcMqTc%)g*tXP@r3?}S9Z ziTb0~&!Z#i&+lh_G@|BzRQ&~bJZ%0dbp7PGD+W-%3Z>NiC+jEm-DtY}+c=i|V~nK> z_Bqw;7G#|97nOyb0m*q{lpNsl88an8uc9iaczIRwAzhVikrg#cGF~i^jFc>!8T{{+|$js8+7+3@TczSOm{*Y|f zfrO?0O)5)myGrKvJ!bi~<29nVg%&K8ZNmUm%(sKiEcC;JHcw$!>RHTJZ~T?L!Rery z+4^%9<2HDRFm!`{*&q95|DEb4_sCz_`BwG#Gq4nrVFr>v-i*_$JN9mYV!x{c-y1unQ;7Kkoee@VCw7fhyyF_ce(Rm+cY zXuLvYu>xfWQx(Yf62?68zEzFLGd`tWAp&_BH@;G2GFw zmzr-uMoXFZCP^P~v<>M|# zs&W&3+&tXMy3VD~SFe4Q&Ti!YAz2j4V4C5I1inAI)6)MGK}-2l2S%o1EbxxfwF}QE zR3m5@ZP1>TS_vW%_c^9}u^(U|RgX4-cN=#QAUnxMTPs9^d#kqX2}vg@1SCPZ>cU(kFvo1k^T2G2cTQb&Jrg z>M0Tf^5*$y?7O&x=F7RX^BM83qXY6JBvkfq0z&XA*#$i7Y~%J~?2Ve17dlzNSG!Ha zUdOy&Xq)|4vmzP05u5C~dHyxb6h?2fTj$cv#ueiuT_UUZ?RpmR(4p}uQJy4!8X=Zz?;n89to z#5ofm?ZjDT>oLg3e^6{Rj`&LxrzwA&7AlNa<|bWpqQ;}M48M(rz@ym_D-9gL+Cz^jcT51rEYU8V4NC{F<%9od}x z88Yp~8?+kjB&1#6q2~aM?;WruFo=YAPM;K~gDKkelyEl{5yI%V2_fBBaC_0MgfBi& z&UETOy_|0S4$;qFW+hl=g_o&iX2Y8pc@k=RqJmvmw#SG!{2B6DP2l@KS29@3t6Nj^ z6B(E@#^l(xITf~$%UwGOtQGo2!a`q`oo1mQ1{&=|PVNIrC31G*SHePX$2H7z%q=ds zF$ghToyghCh{>$Slheu5dTV;I(*o-N?}$JKXHSKkbz&levx6C&o$~8&?`snu8JsvP zxa*j)nkHr2|E`7V8oepJdv%uNz(3EDe4nogci1Jk5+e5Ub2(~ZSO|F{=c;|oC{v!(?a>@Ir$u-eU)ow9j9ae~O{ z-YzT#P6lH?2oJ5m^dRW0^~a9DGWcbcr^N#|%XFwwUM8@#ly5kJi`PtbN~>OI@>4Je zyjsXkTU(7qCs1GozU3eJ=ztiMuVZ-*kEybpa&gk3YN~8^P?>U=%AJbc+<*rujVr9BUBkFB&!o4gcyC{F?_F z)8~7{5@0-iIk3l3)OaeS-&8^J#4uExTycw>he-vh=s{CO#AOC#00ZEZ3y-}|O^1*5 zl+~b5Q@Mdh`n5sWy_om_GIJSONkqg|S!JE}@=+BYVJg`);*lyxm5s}PAU$v-7D(`G z=h#@#S$xG~Gd_tR^>c_f$vfq-=kS-alXD38l|Rolt0|>+ZE}c<0nBW? zUqI2*)Wp`r9CiGL)@qR8VaS@xGK_`{O*Wn2R{GqOYh6|IKLESR#YcRdN1mKTj|Q{V z_9y$}i7ap)+Fi{8TJ-tbpx@BxWA--*{psFbA8w~5R#c+>9M%4>GIS46&1iO(k@-SH zQiHl&9I8OnFn8A5(2{Z%091VE(j=lX*H0xbZ#nMTYE}MtJi&QV$jf6B1Y$7s^e7-S zJ^VhM9@5^|H9ViQ++NS}uhy(3Hy@2&Rtsg=ngJpLo@b2qTXs;+H8k|_Ge?)08 zX{7%T3_m~LBZi%yfA=}q$Jd5rPkMxp!JB@7M@q0g`IDqAPn?dK|9pC0l4T*^D^2F5 z=iiH~T+Do42fdF`F|Zz*oxFk~NL07tKEo7EHV1%nM4IOT6q;J?)tLc#AAaG~G+0zP zYY%TEkk=r|D8h3^P#}0JB0{KAp$fsn)5#KTSR?%__-?eFOqF2z6GLGgG?S&*p$_%# zlxOZmI6$Ab4eX_zw>@eX6%7t(X;beUMxuJor2xkkfcCAR6WWv*M#nUi#$`J* z6c#gm;a@pR?R>OZAZ3k&nm8 z5%=XV@%Jj%Kbs}wmMHCnD1T>K`Yinpztj}%wP$HZ{^(h1P=yk+bmk1q(skJ7z=^_U zJUvl~Y1*1;Pt$$Rahi78hq!J{*{h?b={-G7?_ggliM({9c*FZ(7&k*DeD}n@2g%CY z^jTfdbK*U_dE$RTvf-Vk<-K0t-e;K!*GP}6 z8;1ediEkwj$!4mJ1-i>bq63RVvzx~9d-C{0sBK$N3Ucu)rrz=u z;JoU@hFCNQx5IjJnc3jM&wxB%X@N8dF${dh<*#2tw|XO2Ulwi%wUa{muyEk)dB|2% z2hk?>vyDDZS7W_@8s2rOtLme5b8Y_t&eyf?x2cn8-&6Bb%hz~~)lBS!L@`8Lpu26gTN{Tu2n+KW;->TNB($h&8Ca8BW-y0dN}>`q_Bz%jJf~c$9JPZ zD^UUY>U<@vpg~bsDU(({iq>Hijd&AEGN>UILvP}N0EdIuLr3dSy0`afu7VCm)oXw} zymqn&L32Cgd@f$k!&mm66H#6WDKGy$jc|V>*UyDdp{9BnO>uua^^H(_XeUXj2=5dM z-_KR}7J!S~pO;~+@~poX?{*PT8*x7Io!Gf(``4G@%uDzcnm$sTtq0Oq$tUDw{PKLr zrhnx)XTG^r)7<1WqtA2xcfOpAhZKOC^F?XmROk&nK6xm0D)bOw?mt8DOSo0WW{%SL za6U9%P19~45q($wsFIVbs+T=xTD#ML2CZEcv|pO z5JUs`!*0%LgV)y>T7tul!MsAH|I#F!l$->dNi^a}?Z^9gkQkR*r!p1PUh7Ud?+o=W zLR;Zd5Wmi&E4$^%*l1>ZR-j(eGk}GMFz(hIRU#!MbhiK=H(^QZ5p z&(E0o!Q@XotxqB04Mfqni5MiW*04MiN;U>Rnp@<};;#e*6Xa01!JJXPm4VHyD$9s+Z4amyJl!DjMerNDwFDO9K0bh>+7hI1w)EhkC%tlAx zDf$%yb=kJQw;WnIoK5gH1mv_Y06V^(qW&qk1A1r&F9$7@!HWoHhsF#Ug8T;9Hm9|x zD8Xhg_&>b83w)Ht^*+8K8;BCvAOT|qjTn_0)CefifCga+D#7IvLMt~frQ4_#byx8c z3~nM>Usj_9O}_>k1(jA>(>7F4vomxX2IFO@HWx@osJ(MaH|? zWV|lTb2rEG+*7;r+$TCLp8Fu8RN%mb$%=TY0z^U1QCpF$0I})f(}eK=NoDNr%dM#) z+O4VQqI3dk?}HB<%Z4#M)QAd8#ntm;%1IG>V2B^&Q_?GW>nU@Uh3@-C%>0X)r^S=&c%ClmVH*Ayh+~Q zOm(G0Pa{S($OOtwh7RPqm%9fBPQ4PX#Z~%e-gX97A<^BEWaDL=z7ZcNs!c|ZU_^3F z!{I>rSht;t*dXNO0Lc{0gHP!g({(}|DAK;fw9}iUDX2{C#(JbZ9V8GgT>;4StdvW= zVJdS|RUn0sH7ifG6!MXJzW3C}+xyjrTqRWg>Aqs>M5kFZ6dBB?W3!}}`Prf8XGiS( z?1-J8^;GEH&2n@`Gmn`V(5B~Sv-$+=9(kmJ5z{eni@i$j9+S(Y?R6;M$Be6BRh)4f z*XbFj=Ub6I-y)%-L1eXOI^(!aXPhZe zB!YhG5=}ur^k^t2{#{%QfT7lBaggx{ek(A>iQPq#M9sl4wyh=&eQW0-Y?%0W(Syj3 z99kWK7RrMpmgBw%K%i!W_G(skqG?=H7rLBnn~Q$>DNqxFHNaQ{V)E~Z+Bj)rv`8Ng zmSa!S__mf~ecRjKvWEcq24dIrF($V=F$()AosjQBpWm7_Ozcz`0W(9B`U1vn>Wc`T z7K0Ah8;WzhTGg?~10nG-c$n~9eyZaasL2#6ZGQD9+x4BaA(QS8t;Sj`>ee<5DV&>2r!Lnm{-Py6kyG2>SO z7$Z7PtO=L-MfO?wMP&SD4$N-xt7$C!@-d=8PkvT_p`zDOuqddd4lgLC-kNU0kJ4 zkXH+bag{zSqt8LnBd()-f5NLg7nTFe#Ue=# z$g|B+lW@Q&$aU|8=hUJ^NInXdQqo&YX`5W@j_-(iEDGx4}+EN8k zo8=V`I}gec^YSW1URBAfmGWv6uUS>HysD5_E96zB^(skTmCLJUd9}`Z#rY8|Et6MG z@``7;ONGVquu&eCSPw}YdPZUtXmyPYSt*gA&u%B?^ceEscA^f2i3@#rJ70%OTg_MS zb;Ff@#&gzL9Qt15nJ@B;pzCt`BhLu4ezq_2j3Dc0yCTmxfmec^giAR$nl%-17&N^C zzG{>elCl^PsVh{DJ?N`!NxYYKd|E7B|GSSsC$* zCj=MyH%cRdXhIFS8QDP;H=7Mk(FZrXA6iQ+H(Q8C)E00Hct+q-xY>(UG2G1dkB91z z#H8neT1J34_c=KYr|Y!V%)9`9PA(y1Y#(HZ&^PsdbYwRgpC{o1Xy{I3WX8@wXWGp- zOz5)K+we<8f#g=!&j!Th&5BuFdOQ_-Ilb7Abuj?$gJ16q;v}`#gZU-cQpth!r4swd zgT~jkO@f=?1Z*3KwF(Lujy4nfRj{Z9=|iz8Q*^$WgtPVTDsu3jGKA71?@!e~m;=BA3 zy_ftJKgXh8XLy_N#g}bCe|g0|5h-6Es=3q zYA~+?2aW$UbVp+7=CP6en@gR+0ihY4!ONW4ok-5RM|JK73^O_nd^X6KaVVIJ(+Y#R ziQyTY(((*Z*~0^QbKeYSU?&c^selL^H;`Z@hyPPdbw}O5PLBUnEtZN} z+J^vP)p2dFfDe%DtgrXXAk9?RG=n4ZFz)yKO`L``Wg+a2=>um-ArhE6IesS#Jt2ik z8r+pILN@PDKz0kaPz9U{0V(OF3h~>}@2LpVs^M=5y30vdb1`b6Rf#WgBM_(Db7><{ zAfYQdxu|JU=N*gGf_EqB3>&WLh>mOy&548k@V>aIa9cUZC0|h)T4)Lu6?27GW~T83 z6l`1D6kyEeT~o#@EK-a#zMy120K;7=47Z4@ze!l~0}B{)!d8ioFu%5Gtm#m7nQk6ZxXs+ z3xcum7Rv3+c9*+KscFzao?m0muqxZ2&|`)@fmSfXu4l{s7R)dNB;XMSuSR=#R59A{ z2XOd=SIcpj*eVqsfuL7-uYAH*@|5N{Fd*85gQSv1KZe6hc(Z&plt@dw4+gWIyX1TD z(iC4R>s4@;y#X<3^vS=6r$w)qHlqW5@NZ-u+ZBWZ>%1gToG}eKJGOBLWq@&+GdM6f z+Zm>#kOL>E=^x<^u)M)!AoJE^ywWfuB~D$_N+TR2SFQYx`*~z_i>u_vBxW>SUNVY5uH=EPVVCfz`WeZPI>_DL{UqT)t~0HD2)09*{Cloyg?k`jF=+%I zH2u-Yb7%rI!i5P&4Bvr=uj_?Q_WE)dp8E>Ke9NIJ4shC=C5>tAsW|Dc?oi<1$+z8z z#vQsIByg54xG7dZZ=7ik(b%|{YVW{La|7rVJo=rSQ*gxm~)bFubgYBvP>H&mN!X#`` z2Im5Hh7b6zDqeMp14*Oc#Oa$27qzosd8_q9nDj@~4@TVnsiX6%0v5-1N%6y)2^ljsFFp17q1UQR^kvls7j zl@6syU)+q`0~pg5<7K29h#J$_lme$CrNDE8q}tx5_WgJz!}asKqK3=lcOy=T2+Kgn zqKKgE?k|x9XMA@eZRv}f)Fs!_ecM%X8#QbMcr>fDpV(u_zzA5~8?!t0VH#B7w$TE7 zCnB3ze6xCRIXZX1c$KfPg7<$T+{+&p7v!=`aga+nrZ{z$FUdcHB_70A-=3iIZ^gEU`gzrivr8#%A6^?UKEOl&RU{CP+iN8kd7KZ6oYEIRcvnsN#C8#RdC z0Fg0?upG4g73Hb!!2hzGgH?}I9Y#?T1}E0Tum~svQqmOMrbZn$|pKYbcUG| ziGYeW`eoa;eQ00Xky>yC|HD_XX^8jKYU|ogj>p-0DD;jr$?ix z)>yp5*eWd|ACkKTUJkM?4DAMeg*T!Y&DDVdX$Y0+tnEhLri{EQuI#E}y(z=nNWGi% z_63RrOKGl)#e)}5Y&=|#yI%2tU=3~dV+~MLi34q&DrF5G^(an;(ePO~_&Gu$upEVw zlhbw%8Q50h&k$Pbu`Qe2b3-;L<#ALF93qMs(ygf<0(Fgf9JD zwf%{d3@7@QKpPpy9E8aS>OPkOE$UVM_IcW0@m{iAUI42KJ`k#Qxpx|GSs2r}%3()8 z`T;wdqVtmJ4CFdl8GQC=BGb9o;leOoP)N&j+Mqd@TsqEFQeNGIo+E-&wt^(8hWolL zc%XNsV1mFkzx1ednaa}LcOL5<#j_}&VwB^EzLPN~B0szD<#zMWPBQY6nHW;S-HKP9 z0-n%Fj;Kb$$eZ%LJ|5!g!K`A_2E3s*@zztT&GEy;t%*VNX7KP zuEf|$#yMKK!?Jxe5m+f>#1KES*z7pcc#nwR&)}~?#zIqTX z5OQoH72xm*(-r(493Y^PiuhfN*ZsN@eKPsIhg`1P)FcZ^q2#paM)RLLqv@r;`RPu< z2qU`G*o{dFS5IFwn&0M$s+Iig?h zd<#L?N$1Am1<68>SaHz~he$=eQ@3q%;vA%?Ir~u5C|c6Q(yv~$$FuKz|K>Df zLOC2u=ilcWK2J}znX5U~T%`*zzo`r>j3HuvwV=5ih7VcVw5ZzaVwTeov6)&4qpoGz zBSrsOHP&}k;9`eA2g=o>3k8L6Vru@!f+RzEM$uv}X4-SCE^ zyR_uJK6I~H(-KS1xt9NI-_1YCAX-jAjbMol#B2xGA$zm zs^{mBQzQI5&=KW79^;q;_o%#DMj*bW8o*rwMfG6jIP=sINs{*#FiT^zyLlV3!wR{( z_j9{J4(U`pofEMESoV>psmE~=24D?jp&FXLY*H{&#pHaJK*vR7H^5;Rq>d)_Yb?32 zI*ABpteKm6hGq>15dtOXhxX`3S|U0=)gnO=fk0Mbj&duUo|*?+E36$a5iSw|S754s zHLWU5g3~7A^o^Ywr%i3cO)_m3G8NdG)uvBP*pvyIQo|y!;RE17apy(DwvEjrw=sSI z8EK?nFz`d7~PY(}J(X zgs(;2E#TI%eIOnpa<6&qaEk6akc0kHX221FVtDIc422v zS~K#s2#C|hp$4MpaYB>UuIeWq_ij(e;hhVN zo1F#5g*?U+TVjWTd7TRi!j84vxzBNOgI28;`b8k8Z$8esFp4_8DL=jfX#i8MV2%Sg z)vFI0;t*AMi0Ka|EST-^j-5SQ(jSEF=dZtj=UI5kv|LB#kpFXXKo@ zVMo#su&*5FNo+g8YTH%PihHyDu72btobUj^viuCV=hx71!ZJyNgcl-IFN$6i~hVI`U z`}wL-sK;|aP^F%;pI?UwyR!}AL~xA8ICNqmen>WPeT8W}^0jLyH2CO8ns0TJE> zfX-Wt`rG~wZ-Kt3&nD~7$dgoE6C3;

h$xmf&K{>t=ufYukSP)50G(Ih#yW{Q$}m^&bgzWaJEOSY0SXJ4b;Q z+3RoDBKsXYMkEe3%!jTLc7iXF!L-%*46F&p-l>whVWLE+pUt?2>!71C4G2t}3+RhE zg!1YR448X=YWp$R=xJ77*r)Kdw(b9spuhllBjS$dK%NhlJPxJ>@+d7+DY4l{U2EXU z?SOTv3<3obr&lYavA9vJQ}r%cG$1MrfY1^O3)McOUklY8uuz?)t453*PN?xS)k}_E zzvng5{yhRw`tDi@(s$RBk{|)vhrwAwBJ}B-+o9w0I}TcVi+>_&Zuke)hn~jhYOr@Q zGxfrcqph2kezqZ+UiyqT$~WVUV7kx8!rY_>%XGgVqdBj9fjR!Sas2(aqATC)^6v*n z8~>j7eh|5LCH|0ieFnJz9TXC5U&L-tFCzyIoHOnA`~AO-vD^Q+hu!}2*r0#c8m?&D z&x0cZlHV+5@txR6i!uq%6-)C@)6!gkBLX+!JYbA*`#CWASLo{_n*7(00DHmmW%ypO zoWI<{vYwA$MB{g6ug4)k6w!i$ggDqO1{UJsra|-ZY$yi^Kc7EaZpD=&D}n1#R|%&n z1$jM9xYIE5%q-BsoAYrKt@9`>a^#q=Cf4mS=Q`+`q{T#0Xq8HcI_qI-_t*(<#X(W2 zp{a4$5Qo8y?gi7_P0Pd1M4S|L98Zcm03m|?S7eep0Xw@iOmZRhPej_GFvznU;|$H9 z0|$y(TQxafqANN_)SWS@*sd`yJrvk^YDS$oENil4bR}|ZofV;jF>^jm1Q){w!T z2;_ON{@{?&OCLk__$)nSXX3VpuDT8anZwm$D~T=YZaj<(TO%UULU}t-1iLt_AH!xb zW<6|;C@fA7>eh7}HtZGcj~=#W>Uh)KjnTtak6}aNq`XFT^ zX+wBZnBZNJJjbD?ek=%pT5@_!)pEwxN|ewwW?l>~seBN)F^+mBMl`<(MbmGe{M<}d zhouD0QdbXM3QuQFyZ!eytB<*0i>#X@KRVO(Tn>+#;#Khue-=`W`zM5Ecd8fg894nJ z;PeSuGZOqKaUDFP1=IraP}_zBY;Xf%>^YyA`${bcYu|>3K=@U3A7P_K2lif#(-lFuCGTMu)rVuv<`_WAPzYb-ZQoWr(F|j4KeZsH#D;BV(t?$ z@c_>Jqp`qvC*pJ!ImmZPet!N4*P3+TF*G@+?(YLucZmzm_d~g-B3Z}1gYm+n9^`qX zjlg*6pIs&2pl_k6rv_SDf-?`b4}-clxIo<~YfNYRfC;tm0OeV4XgaS|^f`DK4TOG; zWd&3D24~_tuq1?0BWz4c39yD_UNhD&LN^$jnBNha$^F&=+3&bY+5miZqpRdYcH)!Z zhF$1g;9p6>t-Q#7-*=v|o>#^Mq`)V+9c&-NmDhZcoXz&sZ55OZ}nZcC;)=Ud5 zPhxhnf3LBXu6QBIhG(p==XI!teJSOjhJ-MJrR-h9jPY^m1DGj8A-)QWGkr5A3^q9E zC?A%v0zZ(32mFBh9JTnRdh|B-i zr$zLI)g9Gn)TaL!l>sI(@zH`IV}Y8Q9U*zM$8R;{j*m0i)OipYK|FUTKYhvJ!oxeEG zMR#CvVu32YuzLsIZkQI^0W}$*8wd2Jli5q02Smu#DR>p#t19-&+%weOx+J<=@Ig5T ziig>)`6b=DW$yEZAw=1)DE=h&B=eBjdKi5?<7*-A2f<-q``l+1SOK|rVRi>rjdl2v zutl#vyhIr2*)$ouN*)F*eCNL$zVy@KOWy#+AkLdJ0*qP#a`O3;w}Q`WspBfafoU{U ziR9^J7q{&&I|qd!72*72mGdURJxd?aWZZ?bwPvMH2dp!*kofqJ&l~lp2ewGEvnmb{kcV)BEN`KZ?&nb%%6y3w3p~ za@yadgmsmiha#*pOR8M1tDJ}`vruIYs+^B17oy6^y2=Dy<$P4xc2FQ(rmLKfDkHf( zhV;m%;wmvP_loaIAMTK3dc>@^g-D%=KSb&)zZaw2B4|6X%KiPL-o_VWiBo7}htt23 z{3o<3IdFF>&X!B{ovvI{Wkg38pktD>Sg$-KX|ZT1kI{JW9qsMDwb6Q+o?rW-=NI)9 zn?Je}^<(kWzL^)jjHuOW0rESkV9)6%a}#9&5ep zKzm>pD==u(Z4t|>HX;(hTmraC9)!k>lE&L`t*9h#d=kD$Fbvby!nMN!#7AOyDWm9y zg0tQ!p!H_UnfP{j#2<}Q1}P$frTbC9hd76^DtIxWa+N*>l`*-j9N@=?N_iU;1p~%+0aL3RqQQz3sfxftQ8Uei1#qxWq7UMl!pfsw z6v@IWi5vBsyMbW3BG=}$A-EG5;@tWGH59L!fGe>x!Rtz(j}z$SydLI1fS2`-?7S)s z{Tk1*T6_e|Fnu7-GSJYoHlMTk|()JV5a2Ylu7r-T+hKNGmw*E@j7EG zafhe`XiM37<+_tNv%odg1s{H6OAF z+U|8Uf|Xq$*GsJ~Q-fG`d~}zoT1L9u6qZms%24T}taD3Q1h-B4k%Tk?5vETR{ArddGy7 z(_m+t%e8T4mjk&_EMpGL-#@!d*faVCd#`yC>uFrij&b-#dg=WG6T2GyTe=nDVm^}e z==IrOU_8fH4)q}XE&@gSap;G5ysMe1!XmM_>-ZIi9LDeWKZ5+qZ!yhbyZXn`uOLDw zqob8W6GyA@N^rDxPK>r|*~b>z_*&gTr`*2e8TWwcKLr=24WlrYDrpMPP}B_OkR&Xv z*;@Zz#r3bN^b7C+O2C*yZGMcC+Q1lO0oR|>_O{US=jW)wmOnaQ zBjnFmwC*YyMHT}Ylpr(9Rhoo*a43icJS_e(IaDnfHZrs=ZZx*?qe!+GaXBQ%mPssL zJE{l{d>m5Ei1Vs5^0v_5a7!%zEhs0PTaal6$K7?y-biPkpn2kC60aqvf^vfS>40>d zd9f3N9h3}>I%y+THR&j=!~UNEP;-nB5o~6+Hob?0e@W&>kGeUjT`Mt-JjasRssd0|puN+z5J3Rn^foX=bv`Slpsd>U$fdKVWnt!qL9VNqrgE zCtKFs=Lk;1E8!%U9UD`;7hI7+%|f@XsiP&&12+-KMMhL#tvOoNwCpf)SJ&i@%o zrKx`y+A^!_m}J&*-@?=6?Jm59sr3CGpyZqw0p$sTG7q4jm2rC6bKos=B3Squt2r+5 zm2TooCm1KXN;SHqix#?g7}O{mT`4BIpFI7Hh`e3hL5GCCsmmDB71r9yY2hJj4V=39;2^lr4hwIzm3EK*2-(W$J^kp#y4D?>u=zHV_sb!`C8t>OW%6s zF4h&4=*s0e0;TlB7X1_1@v3L8^)cA8n>p$MqrJ8b8 z)6=3%HK{>Qpg~Dr*#wL2WU&5zHaIVGw4YOWQA`3D+2$M{PH?o32o$v@%Lb?5mYbpt zz*$};QLFyF2K2Cja#`omX`fJ-7(s?``kUl{M*$6GP@s$@P%_KrH4PdIYwFlScj zMYu#FI4sdpSk-RrVH@0#j5~}7)<0dr4g8B6q23MriyO*ut!Hu765Nm~k8z~y1}ZWr zK*|hmfNFso?g~_`7==N`bt6WCe%5^KS}zcwxc**LC%nK?Md%Jc3w3o?MXZ2d;(xVy zUFA_zu|xz~oaUA0(yNKJ^114)_xJAE^?dz(}*#=NvVsLv=q@=IbiQM5=Tc>&Yjut;$(} zEmgggsCJkja`^hGFG1J07i2}f{tfIwzc`DN!Z%xv2B^verD->1bVQ#*^iEHosD25?DGEiB8j9r-6pAE}4op&9=!wx9c5f9xDM)ft$w*PR;2wAB zT13fnbxr~0ly9-EjHIZ`t?$NqptGbPW4e4t-6zR+3Pl*2pmIV#NZw4O5fQ)G&i};^ z#g7g;4OEm6h?E$_t8x5z9Y1D4R+XB_uiUGOU`5+PqELdVezt3jdY^1k}^ewL)@-ellS4Ag6WMqHCs>;HH9Rn z6xfRc6FMkq{xIWkN)sN*B37pcLp~=lrzWBl0CA|L2!giOtgs_=(YWj?*@{-s%NptB z4v>fr8#EIl=j~v0P_3)veiW1VJl)5aPu44U;>`e!C3(g5-_d-d~30N zvb9Zg9P+EJU?TYgb|U!${re|iOPV`4Oo4C+Rdxy6*hRK+$vVw8cB#5o5}@aH5>imp zewCO-YD&Tvkh$VPfRIXLZn=h3uqrbs+3>7*iMu~@xJsENNY@a$Jf~|?*KLQoZkeuH zFgj3;YUYHlP-@x&LHr+?l7>N>e&pDOM|(#$1|TuJ!Bz4b!9OI4#{aaFqG-&iQb2N; z1U8M;hw|#xVNf1v>oP8%u8HFE9GxK$L9)yh1ss4rK9vkX#_<^ihrav==|vLzWE@za%I=1t zE}W(D7|Ly8mXp%o6aD`E5P8Tzkk4rO-D>F{fqpZqG}00D9WCEaW*DAx)Y90eTzC$z zL@w;ad8L~FWBt_}&7al+fi{1N*{}Wz3on0_z3P%o`%1ly^VMwUHF?;gcH$ux%J3!| z`+e##;VSXt@5yT`xHuATb-)-vWyY>3J zVUh2k5Z(nsv^%L4!cCS!2!icTA$05d>a-yQIarD+&~=>Y)8Gy})SMh!i#jV%v<+I+ zCPX1Yi`o>AOh|YDEou|As3EaR6iy^@SD;hzm{idADjla%$}&Gk)s4V4pJIt9yBuz& z+@j*R3I8j>&-Ic3XgnHpz*Iss4zR$-jQOYR;QEl_8ZGZw!ImW=s|5gT%WFo zWIrm;!*kHU5Ica!%q`Pn1#zFw_vCL4|xy99WC#l!$L12rv|99?{(wFBJXb= zt$8udC5iCjwDcHxKOK;KOLn`(ar=k&%cRd#s$nt%x z?2JZ){xgvDme5~Dq4FKw3y>qB4}m`i8C>a+xJxzdj1~CD!=BTdz+X->umrwoPZ4=P z9xr;z`vW(Myhpx$$oqM-1?i@|uQres%#`;vTHgOoa37KP^F~I|m{X;L5$!$5t36icCt*x1nST+7=f9Ns>#)DuL*_r*i_E|7 zx&MvK@2Krl=D&@dDE-r*+n znb=vEO$L$Mcn?)`7k%)t;fRGlC6Zbmra%@2)X48JC0%nrk}e(u2F`ni?nK1zgj?6t zA(~YU=DM}SKQmC&0pSF9_GSpD=6D=1hzAf(%{_#Z1{9TZMiNjjs7C`joPfS4nnN_8 zSd&Kq+I>xa4S>7{$BsgbQ{mYGM`^AC-`WPn0j59q+iV9%>DAxGc0%sAq4%7rTbCUD zqd{%aa>d+VJq1>?UG34)|s zgS)K;r}WyOroS7a>2HNif54zgeb7@>4myBeQwpjFF+VBYpmI17g$QS8ysDD$#)n^{ zIDqgV3|LlHok z`A-B^`fF$_Gwkvu0MVO?Mp*wX_VZ6K!Y7Wb+4B5K`+3eB)L%PE*FVjE{y9MLX5Fvh z$*`aQF$49qoUH2^Za-gx@J#Pm3>n+~8Yg9${mlTB-b{o<^7%*h^V1Rb>g@zjeEzEa z{8uNTd?%32=fAg~kG_@o&(Y5xwVw}1aHhBXZ+d(K_VY44@}?s8mGxYwpL;hJqmne# zgoni2JiGki@px5@##uhweqMm^Rqtke$LFWo&#womd6!|3`Fybb{9%xkHx)6zeEu1Z zMl$gbzz}+80@-~2p8Y%%k-^?(1pM;(%l7ko&{eNvf^PR2`}ul=-+C2@n&p3n=Un7; z`768ftGwe*o8x%C2>~*AhDlYTUM}V|N#rb|F0VG;1lF5hVe;;het7rKF!{k2uX|qD zB11bLf$)RZkk}sf)AsO(d!dS?A@EPRQ3}Rhw8WahYB@()aKun#E~;^J+A|N$f5D4u|p`=q-~eA{R~m6Q)#g zgr|Zj@rMRM#~h$8PHnqOq#smsq(P<43qND^&p27I;URGxx-Bc5o5>dqxf6k(AS~zP z>5lLWsZ^bgu7GuQJ5_0*5f10(NV(kU`e!D8qA(%Bz{1)Y{}j3+M>%grf!r)KY3#uy%LGgJw&hW&9N1kEqoa0delt*E+OV}*WjdW`1 zlC~rOqL!Z(K|0SLoWaDt7a6ltG8+4+dAZd5ebgMD!5XB2NCs9uFb1NIDF|EWvyL%R z$H&j14nZPe)OZZfkil8}j!UMX`8ck$7Ar6Ay)bMb>e=rNM4%xD4I$g~^CmAjZf^9V3p zRFbfVqNU>i#MbhJyK|A6n4VL5q6hUKtge? zR1$WVO@;Li{*EhzSH*X2I0IdqKvgo@6XZH&&%(f9)Gl9&%R|;QSkC--vDp zsD^BbS@+pPCZ;KGj&268-+(ZtpXVRpX-HFYoq#vau>F`u&WU_ZVu3 zvGOk1-bAm1{MypxU+Yb4fIgOpKVAN6wJ`v*fx8OIVbfJP4xBkajvImeY|H;DWFyHQ_CxB5(Y&H5Uq#nxv+XOCaE_ua?m-fr)^ zkN@&+?|Y12xA)z@KYw~GeBHkv+3kG~`hq)8G`_mm-{6UT-=lsc`ReccFA#hm^?p^R zaqBoZ;%WRXKzw~Z-Z#kn_|lK_)2hggJn9PgqsNlyGYCWWZo(gusDn9!kmKIHB?xO3 z46$xp!)8^Dn1vwHKe-XJ0Nt|+d3Mw$c(dR@1l$#7s^iDwrl=WJ8yD-71^0joB)%|o zTk-;PLdQi~PcUw^jz*q~;0sc^M}3Mp4dWB$G((bnqpeM+UVORR`#X;FH|Q%)LFIJB z74;SC=)cj{(SOO=Jx={Ym7V5!e>~9lpn2He=lTF-xJ`8xW|DL5kE5(@QPXcAUyeHd z?-~SWkuNu^PoE`U=8+htN*Q$?Mt7Am2Yh)a%A+u9k8Dcpashu0IQdo0`m%Svd^Z~* zU%n3qct^41-t+%pOJ%FgqUQxVyb&H9dw3P%dvIO@+3z*~iDJ<>-xMr*5>AX$U&Hac zAe3KDz51L97CprotCBFNph3*=a!}y>2cjtu0|5@%+Le!t%xgI+)I&zj(W!5ua}a&= z3*v&QZxE;qI4Zppv5xa*V#SNah+2ZQa^~|W%B@l}m~Jkw9R6=SSRrp6j-fEzRYA~l zUPaKo&Tu1M1&i-;uwC_!voV(EGLXDnEx~@j;b-uy4zcsk#VC^?@oxO#!$)Tf?f3ji z-*2#!lnnQl!b}*1HVX_$c8uT|B)n+#s9oP21~hE%p02~7EX0o#lCq)#4~{_y1SzXg zRs5QiwZo>Y&9*MlowB%C@uIv?7I^eFP!uHo4oz8`9qQB1yHS=t@a}ZBp%1)MXX6yr zDB9wsUa$PeCZ<5gwGmqCmVEVH?#_WwD%8l&qKK&)GuzXJ193XkZ+=M+xP0vTDD_t{ z0y{w+amJmKjav}=E%Lqs)O73p(bN>0H;$FYRiFcRrW&`T;OH3?K2hT7+${gaZ==iW zLKc7I`-h98-)rhrU9b#V@_Q2)h&PJFHmi@2A_3H-NeTNFJT(ZZ#t_X#hKPe<$ut2L zn5J3-e>a0uq@r-V`ieJxtT3I$MUOaK>uZhko#&Rh5m|wd|G7p{d4Z<53RU~{QBqug z?C-bYZ{)5nJeNL30+2Fza5Th#LjE(fQ8=FHI}VgbOXeM3(pyxfxSzvlMtW;fV=>q1 zU=-nGQQl(R>5ZJM^H(OlRrK^PQuln?jowTRb1Oa)PF9PvPEGn+a%R-}rwoJ}A+c`x zuHk=6l{^^YQUFoQ;26OdSK?Z2JP<{4HI|B5p|YRm-UExk|2A4h+oBwdHKP5lLaS($ zA92RgB;&Tk?9Y5BXnE$YBt0&T(9dVkKbKB6Zp&(L?~X$;@IRLLJQQ2PtmG8qMM8@F z=qz-_O=cm6+_xJ7xUn?VxGkkyd&_T$t_>fPWIgKcv+&p?+5E~-i0cx)Mp5e`ui}lR z>Benos1Xqm>>nC_ihfR7KM?q>CaKTy{ol6q`d;)4zQ6bJ*!S!|8i>6AgFRn+t$zU^ z?WO(5_g~x{{T`ilc5Ri;t>?g5UC!IA2hux{igvmv+FR6x+@I?6zF7;mUt)NRvb6x-RNuBQc?yQJM&O|*VSs&{Wv$!M)mlJi%p65X;sR+-6WLeevR ziW03k_{O8&N2&~DlhdVAyOp}bDm4?bL$6}-(LD8MxKH3<1%Ph~O%E7Y;dltmO7#sY z{H{BQzUn|xBSdCR;drnxD4dmgR19~0PzFkO#iPp6n70)fbHs2M3elvX3@o_;8a~G; zA|IQ6`lK(x;r$#%&HMa2ut6d=2myP>V)QV-++3uy9$T>XwMZZQl*#P&t4Y_8h3=C@ z`aaqh7rtw?G(U~apAh3ub5QdTwY;4?O8ALoRl4OJjO^Ry`?q!j z5P1ztP%y7p8;Pu8DhcM57=m{_UWU62_9p#lP>`;E1cxcjsX}?h-p4s7*U6kLQFr)2 z@%}9)ZOswkC{3wM`0RaW;(C^ySV&6wWVF47Hzgo^IXSeRue6;;yOF!5y&k{bi-%?j z*R;AGyL#lt+i1KFOlig63Fr~Hs5Oxq=E=P`EA{zk*wf$h4(-ie=()GZN(H>gO5NaLjr6puMTZHj!A>;YW4Vv*l zaNs*5zshDjYwfnWGoD#!XR_IjIq56WI*6%CH?`KGURK?BkKWz*vdUyV14e@N%s$77 z^rbkdv>X39JtIn=>xch*64`10NjyZ99)NfL23^eri^#=>^eKSlE%Wt-FX|haW2503 zWNph&{g!ij7}pOmu4JH!xFgT&Uq1Ffo7V@T=k);f>@DAAUOWGbd40aDzo8I#B6Dp% zuJl|ZYv4u^7zUMClVK3=Hfi->80NhG%VYn|yuSZbYhDlPZC+n-!colYf!4hK@c5W{ zJvaZqn%611Bj0&m@7f>;>3v@R?T6jwbwZ&vuh-$bZ!@p2HQVWHUbnaQIQHJX2tbgRwBKl1{KrPFzx#x(Oav zrgpLYfCx_~NbMF6G;nB$_Go-iK5s;+Lxx zMKiiDdY-Wg&NED4Zfuzq6KDNY{G67beqC|#lnaRQuxyyILt)t?)Ah^T_FvfGE`fk; z?(&y}LRqL>rKQPi+eRV9X|5j!-6cVHvASjeW2B5Y>=Q!H8bHq>E+f8hm&D+RgqG;m8&Slg9G$z%!itbF2Y}qpCXo*?~V1*~ts7zyG)MO-0YQ zxZy`R-+med^^?XA%7^-Ipy5j$8zEzLv zXTE)gv%&v|^X(gqB*0zpNYs2|I(g2Xm4BfzjCT2fssjp?o?kb=WzVnEXY2Vjdw#e1 zbpv8@^!z&X@VA>^yHFmJvG@74;QengzwXgB^_*W<5+us7{b}5)Nk`JNgm+pM%{~f5_(`WFYn}(SyP3}&~yB2 zx;t$;=mcqWov-SD1|nTkA@BJYbHXgL+A8umi#)&>UP>=GMU69Z@3NetM#eftxz@l} z#UZXoh4>5~gx9Ram;4uA!#ZTxa_@qVmCvkeS)X;KTXmge)|If@Cd?OGwKcpebU8rkWq-&XpTBe(|WcFDLkt4M{WYv4_*|gwlC$yBz26g zW+@!GoP$ih(q@3dEaK4eTk^*w!!?;s(n%}eqzjXfzDrzrCLBHJBK-+4t(N9Nxrrh! z{XI5spSJna>JCzvt#8NrgSnH8JZP0v8`-a*BqI*290kKRmu#+*htQ5bWoreR4$FyN zVh;X+YYPMoMVJOd|yva9HmBm3Yj2_ff&?PuIN z)|i%ZM;N14T0ZvDIO2)y0LdOEN;T=*S&gGdDoaQtElzIa%E<;6d+Lybo zn~;M?OixZk(ipa0k9b`K;eZ<;#gGE~; zqkt@OJYjcr%^5tbpoS{HS~1h*>JxZ}KB1!Cj*CYB8+_Xq^>(89Hj&?Mb&3 z#r1&jT+L^c3R0^VZ6_ov)&?{NzdmH%P`if7073jB#R)$&SF>!wXV{+ zr~;ua>jZ6o1_|MMyKHW#>qdf25rJaRUf0i{_dhKcOi1I)o03q5a6n zdhJ+2RzTNh3~3?xkD#uMLq<;4XTxmdLowl+yD>a#WD(>+;UW?h$Z3xBLw#OE<6t$W z?f$VQPt#2C>-RBXW;&6>F|Q;06W@u(L8P>+-cAh`=OvQ58&Yvf!9NU>vsR~bUXmxu z#8WTy_x=0HJ-;9I{m9JaXlwS$kx~v;#kuSEUTX{)hewZZVV{r5UQGtF>T)k{)n5f6 z&cGDjb@|Wprd@q0I9fIC_%EDL6S>-EUa4AeE&cTmH9B8n@%H%8id1;(7v^x(LE)ejPwEhUl8 zfbNd=K}LhLBfj46N?P&}fm%8Tf{&jkW&O_Txb^|#YoDNT%i?sYXvXAp#6pDA?FH>> zPB+}-bc2x$Vx78UDA?R7g^ogyK0Kk<2~Hxjm{h2aF9l5x;X>)9U*euh<=KyOEoG^d zJ(O-QJI!c>|Ev+}4is&I4bi>MH7tSO!GP%Aged)lRNS~qKZC-eiA@BkX490QQG-3) z0^fiAwU2YGjYJvk*s=bijLm(!vEBzppvU^B@^#{Nj`cQDMfHzN>hNG`PM>QHPBO^aU;j}SkS!UD)bqF`qRDC>`wJeMh)g~zM1BKlC5YT|uOO00 zY``EzBa#hkJruZ#b?>V~m7SI!P z0zKr{lE3I7#~xSokf*)dJH<8v>+R_{hG*qC=7#8lXs^D9M9cO2>fMeU%sKxSO}J_O z5iZRGp-DCi1axh??HAG05wgLmEi1ad}AILxY8GVhEjm+pQ)@rJq2fA@U zOLuX+(>s1PA8X==#}xI6pG#IJI9BIvaTKG&LukLy*r9c!&uPs(^Foa$l|-l!*jWJp zfgNgIzz%DOV237>KCpAs{G-Q?TgpbTL+gt0)R_=2XqjB9*AW=Jqjhl2`tKg+gJ`lmOl*^d!q_$(mKUJ z6nmTac5h?Zr1mFbEKe&$CoS!S*DY)z>Nq&%zZ=Bv-vUa{fx z-U2!Yc&=or$XqppO!+m)R2Umz91Nw6?9+kj?UlE^>NeG|BWuK7Gz_d9Dwbx2gA%be zOSTl_Z=92Zp)^Ji6;Zk!A8uo}Kz97;MYrQ)mFlC43N2hz)c%q@K92E0 zvzcbIaN-BEKO3h8beALD*YYdy)mNZNAUO6+8bO1^xAe;&f0hwm+|RBlKT zZ?4yHy23Zu6)Md_CI}KIC;}_%U}>j3oy@1}+>S6`Il?*Audoly-h@~JvntkH8jQ2n zfu;O57}|$Y#-0Vb0gNf^P)&HGo&?DoS;!(5d@+*+OFzd`p40jmSX)Es0o>{Mk*=-0 zrq34Bim0M^nPd76ZLvyKu~()uY%j^EtE_Yq{&L{54f&}1*!5U!deJ7v@4{6HI89zY zhOCxPjklTa={U5~P})J5y0-F1eSytTbRGaugooBk%9E``A{>Y~?VIt~5!ekgfZ`P- zm^llYgHlXw+N0o3WGu9TE&_ zyv%(_Ve`kmU3^B*S*=A-M^yf(>&_ z!G@dFJ0P#syNgk!9uNHr{Tifa0W5{pEUT(sk?z9njdW-lI#^9Vi{cJ#Pk2d7)xh8W zh=(rgv5q{Z zo^O)$19|81&c{bxBeGUpYL*L@jzei2ga&LPsW7fR>O+iE+dQ<)9A88f;#lRUT9Ac@ z7D%87>S`8D@m`OH>BgH)m|UeVfoWRBt#VH9OkFP5F846XfrFaPxiB=rKcog48C%vs z7RF%+k5QwzE9kC=BOz{&#d&}WoVedc$3peUl}`2;2k7A4;I6IY!E?M1`q2puIk9JD$Cn-yqunps5v5GFXjm zO=}Rlp2HA^47i3E1u4cA$s}WEysQ0~_&r9LHv_O20_Vy68W@2?(@~9TzJlFB(3Y!& z%VmAep+0d!jy}xT&0~MqVk8Y=pfm2)_|WX6;@hbg3AeQ8C5O+KiYUBGo$xJ28vCS- zMl^=0xXKS5J|w~lP;fUw?6@DauU0mj7Hon zGU5tRsC~XEAv3m$b+c0Kg^c<(oakyy5#VN`?uRCWK+zUx)o0-iQ*u;?X!t8ZCvg5O zMx*v$!tY$6PztB=5b%~#Ua_a%G!SyQG~K)nmyX4imVr`6oyrA(@Mmbp;3gJtWd&$~ zF?h}DqBnI5#(I8EmItFJOB|6wtwUSr&GK9INSC%?ia{h)c5UUAiK}z44&cf__$nG5 zCXN1ipVg>l*|BCvg1 zgaouHB45L%B^L%0t24Mz z{cT%1ZVQLTjLyvLqZyr_0{s}B;y8<3Wi|{4Bisi1P|vnwg2)g9yc8P1il95-EvZL6 zh__q`4j>yCj$={r(AMxk*sSA-H1+~CD|98K#i{KR&Pg{%Yoe%rB=#-!w|1b;!Nh|JkT}O zX%saDiyDJ@yQ~LzD^Vo2|EK9^iUMgSUv>INl6Rsy^Fg9N0S`Qk5je3F8{y1M-B7w8 zU}K??ga0MOAQXH)!i3P{sFJYRPZp7zh7U(s1KrRTHPE9u(CeD)f!>U_9Oy)%eAItC z(0c(O@UrP9nL$zd=rPb!zx_A{banZH<{K9 z5@`T%P7?l>hh@=!2ir#Ilt7ms9=&8^vObOGZ?|L!f8*(psu2h*Y6KOO4uLE&{JS83 zPtkNT!|6XB+2nV3C7bt&{y}o@aU$mJsLBEUZ^bIxKz4xqg&Y58tP=j4tnnwhM!;jT zO6IqUVw2sC7)&O3p8m!Z|KU`vLD>PY(cHVjSqj%F*#tv2yH8as)b3ja^;` z2tp;@kl=Ve5m(4cxMD0U81H^W%Lds+#Im8VOoVM4s!Vv2!Sxo>X@(2&F z!9!y)7YNQk(Y|Dy{e%63T0|?=2HiD?*Os+Jji>8%bO4L0WaDydd)GpoZ}F%#pUW)5 z#`ZpH>_-SRx);r2=2`Owm33wCEq90-bwu;r0I$hdHaDSrJ;-Jp9%`}~`0dDMokw{-6|#Z(;b_Rl z%vI&oT_@R;zx@A_Y>EmkvcZs(cL>o`Vm#HYABb&~3`6sa(=sFW(Ljf<5Bgzts>;BW zT`(DA(Q_r#5^FH&|7+>3BqKE%ZG&pM89$lxTc}NYK4CZ8zlFQmdc#+*?{uz*YW4ZQ z1=n%LiA=GB6eZcnFO_8+kn9Z)z}3oO%t^+Ep=(-0;C4~SkLmKmbg<(pp)~BKw9Xa3tafe365Vna@egse27f3We~S5 z>Ni&-8G;`X4vlyW9^BaFFSB`?Hls8;)S%_!$}#|pYa}g)1wK`KS0Iovgz)5P?nav4 z&vvvQS9o@VyBt-PV+XiV{Q_sPFgbs*G&U8D>FY+7kj?8xuq$L<2kE?Np(B64$*~&y zQRm;&vo7e>v(CLGw=EHTN(7y|KG2EndL)4fdE)wx(!`lHoVYX0D$JzUY5gP}!eF+i z;q+KwduZ|P$lWoVdLx$NNOH2pOc(TtxHu#li!0lPL$e^=&}|j$M=Vt8V+=$ubW;(P zupa0@ezaLgR8D7SHF+#3!Ci%i8+niPBOB@ZjC=qaSKv47uF~~y(m$K|qXyw4jf@I$ znyaAG-1yhDi&}-6BTzt`sKAs(sKg=OEG~B)TJbK!1CJ`b98c*_tzI}I0s!v`0KKaT zz+L$59e{h~BPES1HokS2Zd|E-pd~73y$FJ5@JhBx{_tM({1yM%S&>5*3tS~>7(C-9 zGli6^bQo`!=p13Lk{5x2sPk2)6az{SK4Qq2oS5eTMviFY34v+wOTfnD+qfKSo;jF< z>v1O%k-O&$usou13HBgx29bL7PY6PX!!FYZ7Z{E&>f-(13)If9Ya4*mh{j!tCdT3P z`AnuFp4om99*5?qPrMZGCgO1xs+gr_UYLMI;q>%{p6zrmS1U2vfiM!-xk~dWZohK| z_J4!+%tPM6|MdBlIIZ#%^egGEmpsVd1SH^~$#H~2PFPGNc9zgVc@)zzF(WnJ97i0y zI}xJ-~OOSfc`0|3g(#QG=3}5$KswF71ElBSu2)DaK@Jg|!YtA&q;HS! z9nxQ*2Yuo6<>3*$0n)AZ9Uy($z5}E`x9dWEzs8dCCr-stq5%-$h=96jg@r+*q2!5bib&b|YrzqIcF>7(`?APwQJS4dU# zjDp48f^-+2g9oGwyFRB6NWaAMz92o(ZXb{ivF`wBS8}8mfbC?yIvu6MB}tC zNK4P@9jAHyKzftiJ|Mluz5}HB_8lP2weJAw1-R=K($r{3qvn1LPTxDbcStv)2Yul* z?26zGkZ!l{0O>RK9U$Fc-vQDGaMvrOW1}I3+i$Onv$ARTSD4@h119UzUf z?*Qp%LnD0xq#xt1S4eZBA&uhvF*sdwR_{2yq8~_avD*ivKeF!tX@PwQNH4YT0BJVv zdWF<;G?4yfToj}~v8Cyg=mBsl5+8~67|&!%{a1%X@B}ztwC@1tv-Ta}eB8bRoIk^z z31_qr%^J!;swk@e;3j%ui*ktJqqzPjL#4j4$WspBfbr8UsgK+M=D+h$%NZA>Ic zI}}=mr!-Wk<=;=h9%BKw#ImP}Za*MUv>#gS8tj21k0h*Hwc<3H2a}Yda8w&1@nIb( z{ZXVuhg|{?I@D^j#59&b&A)wBT8j^bcA#CHl=^rreXD4Vf2)*_!lm^ln4Yja(6HB< z5AD}onYwRmrqH3rrZQ`%dYpkYx^hofX4h7Jr;_ll0gLO9RESb=4@Z8v=>SQ?3{kdu_ZXTS_uJcXe$4*$ufJEkE)Ubhd@7d&c1RU->! z@e~F)0ducoeJ>4%W&#d0Y`mrRJS)Z^v^g*os=#9wz$^8|XdPD~W$}8D+BX>F8rqC9 z*mO86@ZuI+C5B4*5n{;rvpkS>wr_ah*&+EzO?%GzAg1sfv$QVdQHNl^K?8}Q^#qFs zb}xR3XdE|(D@5Oz_t^cw6qu?C@SC(QF#MTABSA(lz6cfrz zWu@{C4I)#TkWmR-j8T-~IiMu6TJ`;9LUD=4`gN#)%X1_$XO;b|(EorhvAq8KLRmi% zV@Q&LPr{|;_={Qr18Wl#gTNqhAJ_yVkViDT73k{AboH{k2(KHCK|lC0w~skCM{M8= z2yVcCMpOgHdb3Cx*o?or2W-$B0M=?YFcX(YY+$`^prJqz1gkISaCuMUFZwaowh~BZ zoGERh8PO;MA36DhcMa}+oUz9u0XD{Dp*UzO%sYp1n~r!% zL#kw83&9~bo=$n>WBTiMr*T;0)z`ut)BX{mTu4x+1in;CS$^4}P%2t3bMI5HKMJ~% zJ2W>~jd=@n27Vbz$9wNSAjG>1f4a7g#l4z%n($ont$o6femgSe?O;akHrwBJBJ3OI zrIFxpa3AfLyU?A`l4N6Aa_G*)?A#=Onvt85otx@UHFDFkbJP9FM(()m+)NlHbF;E@ zC;R3UX!BL*U_5(#$vi!5NgM~=2N3ND)T&Mal?|x^1dW z(WhCoHA3>S_N3=F9KPLUk(jGAn|Dz}-F7A(n8L$%ol1Hb$V&%U&kN}ZUsJi?qkomt zgcR6LQt22`qWxPjLFm+AB7dDHb376twF0}Skg7lc`cIErcT4Q{g!u-|4Uu8cV^D&^ zIHtf@k_k)k1qIqV_ZnQpf#1{M-khDUe8XWAzQP$Cfbi6SyEPF;rS`oAb7|?FXvEXT z)c&%?8T!qy9z@?rAlVnZb2I)Lv1xUXEDg$@3LP-Fb zm{boz));cIGtH9vglAYLpE*e~m~3^ToG2Q``c8BJ-8RKN6ayN>0LEAqMn=PC#fNp5%pIs$x zR9L*q>F^y}eEap_XXoKwyg`6o1aH2JukbClFLChk+ZcyGdwEs^u9u6RdbIyQ6EpY)=I*9|A{)iPo)|SSQ#!O)53MnYNA%+6YODJZd`gOu=CW6 zxH6No;yQP(Uwgb+U8TU_hyljM~gR%tu%z`hvrbO;HPZ#mPZT0=b@h#5d zO^L%4+J@plvO|9k!YH3@5(fAP)YP?jhmDAGO%jZWcBmBabwj@FzSF>jxl>UAcN(Lm*7HH z`YK*E$X~qN0ViO4t;j2FkDtS1s1`Vlp=t+6S6^N7m~~ZAg)ZER0}^n&lxly16UVuP z;NttXN5K=LsziN8K9hbdZoBD|uC86oM`KI^CEqa5Sn5Ph?qMNRaz6BB#wma1|HPPN zT#*>@a=o(ds{!W8;2~#DT}%8F2lhj5KF*kZC{TN9#wUS>LxIC5-*&3;iD!X2ArEo> z)OR^6!^mZTf8ks%IIu2$8QbmXY}>0n;6whBe0zNi-w=3dnCoLGJl1KRb&O|AobX;S zZ$El4)fsdj$XfXSQTOcuQI&cB12f8~qcavM7AECX6jUfy>SzHv;B9me0lTQRYsQ+D zDWg_e>OeW1oz`~Sw|ckx)$Vq;+Dg;_FDaIpmTOeDJqB)AY@$*8KHuj#*O_w=yX?Ea zKR7d-Ip;ag`QD!I{plIX$4caPN=_;j3G4&CNF~YWCo<6!2{p6l$9J(|S98n;YhV(z zs_ai1yGcJ$%SoG1uCRMKBxd<0Qn8Q>5<0nkVY1Y#eW3?1XLEJ8i@kVJFT89KtprK# z3W{$>Xldpl-PvhS?&wX~DHA|Dtw0IFta8SP)C+vhdPSPV6Wir% z7=@lFA=?3&f)?YAKHO;wuT2*z6+{khEF5#BQb!5W26OQ%@c$R@*gs1bU_O+aZQovf zq>DlYu6OAzGwP~8v#XnnuKYAr-ka@$7p``N|CJEh7n!7tt}&3xFGYH`&?kRuso%#*W`MAd z>yRtHe%l}dq~2Az&JyW*#|lTE>0oHUr?5!c%^4DNS>oiaZ8Cc363`?5Hec)fZ0Y!@ zIuFurlx)<*8x-dtGfV-xs(2dKX*yft}P@hn!)3 zQQ_=U(PW(_#?E`wjz$}Cx0m;}*JZ!Ih9vEey2fOjSUW6tDAa(cqmm}uBiDua z9)^}Cx}&n#z=oF+@v*$-+;3ib!!o9Qw+vW`;GNGHG!_oz~j+{*FE-c$+ws&ZGrvHP?`zM7d zIsYdq%_#=1Y)3PSZKceQ0#xcpF*_~DPQ}DPNo0kUH%Liz$}LV|)f4pIf3WKR4L4<~ z#NMoLz7#?7jNfS{pF|<#l06ZBJ>~6Gfw7>d@U6#!wi;Ii9xNob#@6jPS z)&F!X`-!jCXGHS{`fA*_UX34uY?+@!8(H5K=tpIX1_y>eZ;0fzH69PGpl1oYLi{e( zHzsDkPYul-eImsTNUx6cjubi~xeCh&$1nL}nm}c?NHG})Xo3(pH-%6ofpkAYcP23HwLwKo^mjc)6=)&6-6^PxTRpbfo&5 z0rn%MtoL_7ba8`J7j?W7=^k}dQt^$+tbzE8?80+J?`E)9@I1Er-f_M zVMOPoVa@X$4DFQw$UFz8n9!K&_9VG`C%QcaxH^xnE=a?rd1?677G9TycSs1=X3^{8 z)t2n>Eva``rhwV}=}~Q1I+4fhWRH`Q5NHEc zecjgYi)Hh zf4sb2P1Eylj>^Br;El8!dJJmwYT*8pcG3=<-_-DU0q^0>wL~`ZN%F@)0D_3nA-E1= zdWHW3;TXo=c}Lqj;B!C-_RVUn=vBB)=(U5_?tcd7sVnOa)>Z>ajLvy>smPVFP8#pA zS0hswsp-S8^Xb%ZyC>@3ftmGkWK^es*MYy@wxV#@YD_7-u^UioWoe9{#5G0Y%P`XxAk5L5d?1vEf0Vy>}<#_Hl zqJ>HC5TQ0=)}G3Zi>FA_T(>xo`#hcm9_}lIuI{766SL`W2UEDMPB~r5! zW;>)rw2ZQEVn4lZx2AFB6YTYOK;EIG-x%$uriPbsEtMi%`Csr!GpyDc;OK4>=`u~sTfsoAfe@DFj zuT(smtG%v^IIb=A|CfY>f_ze0{9?UH`Utjw{Us*px!feZ^+G-i*uRqB6@e9zL+b|C z8ox*R?wm1w8fp^Q6?{fCAFwerZ5RARo|R-Br^r(|6go)PI%D)%tlA@=dg`g}3k&on z^1$erfxfy0*@eu5IY_jJAc*YDXzsvpLqlXt8yPX!BD!agHIJk@I_O09S~{}ZAm7;b z7iId#%rXCHa!&Qixy8LJYuO$R>Wp zbM!BO_oeZX7awofC6`F^xMjC9nkPSH=XAKT2I-!X!Jncj_(u4-SAs6@LB1ME>qDV$ z3MsRfU_j}<589tP`SXwqP2b4SAk#RD6kY9wdw({Ra7Yz)5)etFY zla<_HVJW-hHlU*`%A;|?nOLkWH|X~Ab}6I9BcqN1kqe=jMsKs>K{F!xPGN_#v-mVr z0N{O)PuY%uM?!nZMWP_bi%MMB<$~exd!f31v`NLuLJ`27>%;$Y%uA8ubCSo`JLCzkb%d)OI6wcJ@K0^!XIFWK_YT#DfBLcf)T&^@ z@WO=98{waRDnFqrm^i#JG4yQsr}lDZRgQglu08Z1249_!{oZtTsXV?qd3;gkpA4@N zy#?sz57`{(LlS5%_#O7!zx47r)y!WL2{cR7oY{y5fVdEhdMolUFJ7w>k8=G>wJZ6JmPGda+ysr`SXkYFK-y zfqemGA77L!J?i9j{8UIRU-g2yK{jR>ftdKJ zOv3XN)@tknx#lTkXX0m^#}!g5Ob6)5Et0=AGAwd&vNWx^XmV*J*Ten+$dpj)CD(vL zR?oo%S6NDpBMAU&k+WymU62@TIr4|umS@E>p^_-kXOqY1GTIqg(kcze_yE46LtkfX zR&_vVyKF?p6SN`p%rm&ici-y6Plc@CP#IkAiXn9E)PdnI8X}{} z&f;SKFsO}y1@$TW6X@Qw9wmptFF>a7XF`GTd(i0CMkdY&0H$<{L$X1Rp6079zYZqP zXd88GvPCDm$ZBbk#yG=kU6FBZzS_`NjT7MmN?U3Edrjyo8g7vTYuxFi=vTXB`GV`a zM#s{4xh)6x(By)V|`mdF6=nSeKTN#G_hseN-~ z5|&|EFJUVna9B2yaoBrL$Dm)9PvNF4Aw)M&Qa!XTECDsh0=G%sq4sw{O1%?5xJspj z@Y=b^t9K!<-rGLc8HAUk9eM4{p9W$@zC9YcBdIJMt39qt#XV`h3Es?5SKnxFR{2Ea zgt>yaHI4ZP5=T3wDLk>?g$PJ{77HRBPw3$N+7~+TTWb3S7&Mh#p!^WZ!02goE~oKf zVd_XVwZhVwF&*bKv$wDvAaoL~xHJ`~(%|&1iD3WZ3Em+yrsMaQ<=;6E2>A@B29}n| z(soSF$;Np3JWz!|yT^(+fWk1!^#*w50$zhSpzyeGT^9~I0vOgsz^mK~{pSdPi1*Y$ zcH96X$U;sNkd4`Gfz2R!U5G?go%FSp}N z5q&AfnW!HL7pOft^IQaP7QY4W5N(j#4K0oo;Nnxj7eVlVlj^Wgl!e|1-2{DPA-#|& zo;&5`d&GQm^z%(On=jcjs5irE<|4ZD!8L+q0h&T2P)}RcaSuJY=26!P?|jBKSwBa~ zmHLzBwU79>jD$zu;jXv{q6kjk=-dQ#j5YL&@bSmWJ{K2q-KC$f;EZZr*3QSc?RzX3 zQOA$8vP70NWYnr*Aw>Xwh+hg>3fCK`y+8$u-EGmi1H=Dph~&3n!QcY0bufX)AvHq) zevg6RR8jPV(4MH{JsLj)E|#WfYK>UCqoan(i?_UR<82WN3bqeI5!-U037Zl}$EUE; z47{X&ANOTo-_61j?8w+xs%P6A@Uj%|!!T6$k4H~-1lb#O(ofs5BN&uZia6HPb8x%q zn#~S?v)SGMf@m821n3aGF;Jh-f`v5H&>q^up2Jt_9Lv7A(Lf~{!3g~S_vugjo+V`H z^rul50tm;ZKiL4BpQk_l&%*}&sV|_{N&U%kKl>#bi(xeL7l7gjP$~8r+X!?a-qrG!wcqd(llf zrPPQI2G-ofeMWKtq;8|wxIRW{cmtS&E5H(Wzq z#M>8$w=ZBe)^a+3{pcj}*#O$mS6|2b6F{Q*^!|Sq?;lu2h_&nF^;S(RXTKk0o3YcG z5zXDOxh`CTgywWKgVGWxV*4?S1UM+somLvr>q$5b+cRXy=sEjJ-n{GM^&{tjQh2Tr@LP( zI(?RJQ)u`sDL;LdZ&Z3{aQG%Hoa1TXJV~kvFTy`T`p1S@)v?A5{(=bOtHaDYah7lU zyza^X^Lh-{X1Y2-y^IUp|5kZhzA8rEW)DARdAl3MdNxcuQL>!%e3C9O%z}=rF0yC5(zheqkkXt>NI8LO8L=2dUYDR2>sKbSEsSAI0L;pjh&4%@Q~2gZ?Qil zc>?gYFF%XYjx@H1pWR1ad!w~d)Sm_&d>4BR?d0^Ef!^EK+C!)*#01y&|*uBU>C7Xj}D6YsM8f^TCtP;o(m>U;>$Mj&M z=QVjXVk?r?)%aTyNOnrQOQVa@0SkmZQwMKc5%?izMd0v?z>#)u<*L_mZBheMYE`d5)mB(8n?gplo-snQG^i6!L@&AyppVnyPpxtiklk;6R-O=~ysZz6D)M1KkpBtPWjW9sxo>c_r7@ z`_)`qBR=WxUYryBbilw*GPMNNWVW&fppMA87bGD*6~-Cxf||Fb$hcT~v?>U z;Ap5O@)|%0J~5WO-g^iLnMmZtuYyCkD_Ryvp76RUW8tc7Je>&ZF$p`yG~qm*f}$!2 zYw}+~SRV53`kN!gO_lGvD{heK>8@l!PbY$&`Vc+!=JW)1;6yZ8At~iVE>0|6@`J5B zLnek88hT==j)p2}b%7Iv(@m#&4aa6E()8`K{! z(u)LnP!Z>@dLmQE_2g@bO3#H73Q?6zei7OVTQ8{OhnhX_Smfj1zv@^%_KkV0#q+Qx z!)H4f;<%LLG2RKn*+eX#0`Hs)ubcwWTzG&#+DpWzislbA(R?o)O!UV3a2AJelZX82 za0$Ze4UY-@=`GTQa8tB)q1-qmJBhE&BSBV35#ceyjmyT~02#9@{{fdt z`(M>%TV)B*3*t$hAv*t^Wqg0Pl+AthpkH{sGIqk*4`WKnPsU;23O<(HR}m-FL{Hcc=vEx-9u~PzJjykqQ$3PWAl2j8cma)BIdi9Ws00}2Y!troDO#u>dikwaX_->onC^~_> ziVe;jX>&=ilzrPkmMpwrEi)sixV70XmMs|CYd~RPWlwwW4gy{pi zSL7LF8N`i87Hb|M)~I=oh$aYa^E8Mx55!s;K1sAK*v>^;R(OL4qAiuQ&XmS&IC_QF zSxus!vyUQAf8FQrq+Og5;;?#t?r;43^H1vd`PHev?faLU-0|~sE0$rG7e#7hW;wvGEbG3Xs1ze|0n**qPS3GPwTST;!!hdmZ!un(Jf4fjYq+;l z^|qAg3*Mz|}<{y=3aEU_S3?YGtc8esoc`ly6WD5q!#DoqgW&@D8O z#7H<9hxrJNiWS{1)@rdnNA>h&x;|6#T{FU{s1ZcoM`@6)|B~c;6Yqp~f|TUT^~~$F z5aquPUvBa|O1ryq+0DF?rhFkpG41TPN2Wh2rD*_wY;0!==7R`vJ#DY-h~$x=jf_j4 zOx+mBWNk;y!8nw_G)MAMBZDLJ9Fch_kjVq{unP1hlj@MVhi!b@VzH;dFUDz>jD`-|6#pfE3vl5xMXSP=asA@-%AV3);CQdUp7W3Ev8TlQ< zKfvMKic4V-XQ4&W+n{$rk67wKsAaSbG@`uH4#~9|$<8+<$np8Agj~u5$=Jq|pBvcU zciC+DzV8;-LUnkDZo)>CfKI-nYD~`+fv;9ddn-1EPL-NL=Ris?^!|WVEf<*Yl?%+j zkV0(fO{g)?h>r3=6JcM`RiXaAz2*I+@u^&0${3$Q+1QG*g^=A^Bmz`!40Rhe$rXaK z8=5GUx_sN=Tv->I4qbWqYP^we-NIYKwQ0-R=^e{^(6jKN`<%%{EgS`R^CwigdDj(P{KhUOJR zi%DG2iLE>LL_)iK&F+e+AVS~;?Ff+6R0l^EavUa9pe}r^6VaQgmqiy%k+$JU-31@+Pqe;w~J zIu`N%@fhwT4&F8avkA(hqC}JmKz_Y zj>?7bu6|FqPus^&My1d$B(4%nLwnqnPa_T_P1}J!g%?qgp}X>7z)M<~5}lDE*e^7( zh)0Y*M@4q0itke}P0^2|*DOOn4qk!sA~Msc6=QjS$Xec$(c@d>gh#y<0+avH49l|* z{&jQN>_YCsVWp!7pJByxYyM0J>ck3Rus2rf>EBXb9_Bg*1Qr~fx43NOE*ML$ciY?d zQ<{M+7~%h*klQ|}5;kmN!b`j43KJfRLnZ@zhwy?%t2_9w*tQ+_lKfC{kDXy}M!!KBE)SyE`Eg+Ee3iz`kU==(q4@)C==XyQKAK zO`Q-*mL@KOiHtnzlE$vovYIwi!6hW;Wj)~}cvWlhFT`DSxg(O5{e4Z2gR~zfX+L|o z_T#73FhnaH+_%&SJQbr)cZ@e5KW4S!lJU9T0`d;I#uzGD7K*}x>=NXeDb}CxFEtI- z{L@sUg51JsaZux)yrKXJjJsxpa~vtucsxt-=KkOjQ+C18+<@VfTTydM zqw?XngPP$%@>ATej!KTsU@PFcu~QD|ct<3OlEg3>^&VxM;uh^bbv`tJm=MheOW0hL z&_-|aNFQX>M~e4E=Q^cPEP4x*#y5o8V^s0y^Mn3znS_xt!g^)ob}KJHe4 z3J+HuTMWkrIuXEZjG&vbaEFK0OO*BLLp^_*$9GU8L`v0RImUxLTGUvRjD*jg&yCBH zAUaSZS{tSM>LzJDqO^8>+S7bbkPU~hR*SA(D7u#KZ|oucgs;S?vflBE6xzpo+Z2Rv zfq7h@#C>@@cr(WCF&PLBGS*WYF?7-jAfzU8VGNIOKOkJ(D9_$7u?dMzf5vk_>)<$o z=x?MR-cuBvM7+#pNBB-kUuXaxYYQ^zmfC_W`Y1)XsYPsOcYw!e+$!@cMXb1%Mb%+gdRio3#z!E1IJmayvRPYY z$Cd6>vz*XM$x>=sm+am$&1Xg0FP(>XE490CuRCvV5qrHm?kz@G51ze76Ojc;78>Km~Z@IV_Uhw{Lt-=xO7%{=Bk|lGYxhll~TN z#P36+rc3!v%FesTNyb{o4DK)gu^Xu-&bSP)a7|h?e;*j<)#)>^ z0qmZe^^3Xwc^Bh($+J+8l)@OM)Y<1&T0VDZG`|VYeU3kOrt)08A3R-0q=U!|ABX%f zX<{j-dB^5sm1I!k<)V6tAQ3XFY3Q67zE6{lZO@;tJ7+a1EZ_ zBZJCSCDbrhQ-J0ccLg$}fL`vq-yT`gB5mSz5Zm`>RQu`|oc=alwB}Uklwb=dL79hM zJ|G5ELob7)j^5HCU#)vovs@J2Q!a{r1=lscD@vbdiQAR>1&YjISHt4gNT99Cwju#@ zl6v^+L+*@fDkSO+@_=F0cuL0h$@n)B|I!tKR{RXPR+xkSG?VF)6v+<5=uEJOWv!6_ z;;tl4Bv?3bzkOT87r~}2t_#qzVZ2k3i*GCjQTEw@aLN@9fD`yCl-2=Y6aYr`%+w<3 z(`ccqBxARz50LU&qLWjkaSc$Spm~gA(!3@qZ(nU*6W$v^B_=-h(MM#$@r?ASg`TQ$ z%_}A)N5{2TUZ9`^)w zT)>OmIEWZ6xG+D-HYt_SmLsUdZOgRSLnoNuCvh@ zNkq|CBJ_%SZo?r*r1Bo{1iVozrE!kvjSln+iC&DFYt*Y$z5!TrJCagKC`}bRA^3KN z3V^Te7**=Z6*)Ve4-K1#>rhh?bcA})s{TWyPb9mszhw7$Lfs=-^8Y;}(3-_hi72$l z$5fLr6U-UA&ZAIO8iWU8dcsW`vPW0=AMhuRi;QlQ%pInD;3@lO%N~d1OsYn)m zqkM#=i}3a*)#SPoI7D=h2|D)QL3byB122@eqdY4YfWblkKG+QovV*@*7tEru7v3a@ zt=%GHuvY*SmO^@u9yEN+8(_DHu7I@)owzsX0`Oos%-tD+k=JOa>Gz6U??A+dChe}c zo-F-9E2%KK1RG>rcmzsy6byP$N^Yl$mOCdN!EI(Gx5vdh&7G*V}7x!O1~ZOJ^xV!8?71?3{<$<*M;}(Ca1SDP^bQJ(XX?dniZD zm+xN!4+PcyP=lm{g=KrVkCxK?*rlI9X6y?8&>rerMjOGDU5<3qvIbnhnz58(0UtJl zDm2{`qIKsLIP6&5+ZVvZbuo86?sZo=`i+?GuB;&8Q{Wim+ZF0p)<+%5I|w5^j*%oc z#;Tgo4`R@>0{Mf!{N(ba70&j2Ph&5XX{BO^VhrgzMBMHOuTS)Cb}xU6#!SlCOwYEj zr}<)6!SLaBcV4x$75}F4R2bG5DvoLyjW{iI;nJJ4s2RE^bjDI_J##8D?kOi|Rkhfw zgZ@b+?+V#fCqeUV^x_I~i9I*&r}oCaWk`OK;czc*VGOGk=8kEN@@<|sh$h4*lWd$! z3MP{be-q(CHPg2I1XiiVK}HDCrypG~JcZ;0c9kuqX|S4Xc#$_GqeGp7uT+jN(j@Sj z$I7lpvf5Wpg|#WZ`o-$a11H%7yLr-FGOINP=Lj1s{;6B<^`550RQ?8 zf^Ag5yWDvO!0*B;uL6EW2Y|m0BgFtdH3sm+HURvGs0P&le~$)uND&$EsT#Es(9-~m z)F5+dKzAuXC+fgWE(6d9V$vMw9sqs8c`DG)lYx#0VN@M|(nDnaJOi4g3~(%6uOpk8 zy^I3^T!A;}omVZpkR=Qur4vzUYz<1eF_j`iF1kd)A%LZ?C~4f+c7`!|q4ML1U`&BSuM+HWMBxohHZ{vVj!> zz$8bWZxgoq)<2&%_LW(I9`D6%SOcTI^q3g{C5D}dgDk9M{50u=k-tTjMR0{_qR8LO zj)&@D!4RvkNCT3JBnq|0@I&239Y648#6l3wz(59mz{;!1p`Ot|o8X4pW<59jMd5}} zGngTS8Z|~TDAb}#27ePTU8T-vs$75o!fUq>D}-7NoX`)`ZS0Qw!3ft3RvBRkX9UAD zVjplW2w8mqd!ZH3eg+2(+8RG3Qwe_zGqC4jv;%i8Q%1-OaYjf{8NtOF0m4Vm2$$8# zjNlTCkV=dY>3|U$%QZ%DX^fB>!w4jYzzBhFI3u_;Mp#8-gAh3rxC9ZZOppvJgabQC z1H97)CPQ6-Yt?~NPEQ}-*{xB|yNPpsz$Vrk&(Vu{TEe8bY*CzV5xtH@*y=%rch!GEx zPYv=}Cxl}4r=D~@N`@cEHB*On&lBpVHFZaZN5n)^Lw{L*KtSvZRie(75Dc|0Q7pSxzS)E34Ain0g6q?xv{UKcC_$5 zs}dJk0j=amMTG+@8dzuMZsgdRyr9|rHO8i7A9aC zpmmZ!y62OWija>WDqp%{q|V8gIs1P_`SQ&WGx>7EwZ|e~8le(t0({y*z;-GQ z3Pm3kzL%0RZZ5x@uQ>{Q-PN6h@8cM$bMSSsUlG3Nf=uHDM?djekQtqk-x9PP4Zc5q z1NgS$5DQ;Q_ZG&IY$dToQn}3q_FZ$1A|YOVM*x;P7Ai@yT4;m;j1(gwu&;{2G))#d z;Yd0_tHOd7OT#mj$5HY-0>39iJJW!@@?QY9go6TXSzgHfoyam( zfc;leq0NDP*3|}JhgxE!@wm4;3G2^h$G|$!sslB&?^Xfnv0v&TeXj;-R21+PNe5^s z*#2hze~_J`!J3<*Cql)J1NFUd2{rb^O-Pkc0PSz#aQ^Ic70&0%a8{mJDB#SW2K)a< zRnLbwKI;IWd>RfM%3L2wvoJzG&R-=y_QDgRw(X}jnLv&o$BooP>168!54r!TB4~I=)(kf zvH(L((7hE%$f~ytiC%h;FJ02g^={R^q&qdW`&3N5v7c&tA{%BiZFmye7i3qR2FT-m zbt<>~)P0%`vKe+4ZV0k|@Kwk}4)8zS2=G6SgCO!ad9C7T_Su5KiAnL(}9nNJHn_^0%Gm3%UJQ3}gVXg)I4zioR5bq6*$n3t95evCVYcetM!7 zW_&X@<68`{os7AX8Q%=>K7OhZypTL_XPJ)vH%;FF^&UXNIAb`-;8pcGoy&xrhgSaE ze~>C{4(oYW8ekny&3CNP0h?QT7Qjx&NCseA`fqRlR1fao%744-H9%hR-)5Ymg1)o< z+cFIW@ZZixHa@!&2TguYp-2Znj-0I)&^9-|(2!vbZ^-a>-jHFf~6_F8k8aV#}p#>k8IQl!Yd3P zn49!%b8J5PdjmG(d|(@1)gkk_4mjsh3}is2g%4~!DoQoZ`3fTvsgrDiR0s1gH2r~a zhPetG5$(D73W?gu2%0kaSGR|DwTE_~T^I^w+Cz2ip$*t@sXg@f_Rt!*!@wRvMh$#q zIWvY-BMWa?BN9jyZ`nlyR9sL0^=1=fhcq2^jE!CVB?w{)4nz=K-kCaY{H<)pS^(W# z_iwpE;7j)1=L3j&cto=JO+_*CEPZ^mFBgP{gqg|`=UUVa3!2J z4-odrX%lLNUqxBC2|rjuNnZ-G(=`#t)zULiJkZL2`QsQxETjU?kS(f^@W^e#4O+vkIW@4Y(FWS z=1{-+awF6=T~$E+e&lP&Px&8G&%;1Q$je$2_m|1KDjP0i)-!X%~tPFhaN27HIC^vg* zwn1qPeGd4~#X*6)@@c6*>DG8GNNgt1X(6f(PdA9Fc>hfbUPo1WQi#>Wu&9HE1E4#(KB`uy4VEU>*l=PV%(mYcx;rZXwmv zoaiId3`DPox1jn}t94Y*ef6}^n^65l7|B5OmTuz5KGM^@3~zE1ySOV?7slgmV$w~i z#|DB-Jz}W8H-7W9XBDx@S5Y;tGhWC%d6}Nh3EtKZ!ZXku?vTMkhIyza6Wz#Z&kbuF;G!sH*Sm z0l?qDK?68nFI8iq19-m#rP%`BW5ldfs@CGGLVlDzql33<_L{)EeQM|6ebongc&{{t zH>gkta?|)K2)hM@9qDUE*z++Ljj%fb>b$)wZ3EO(pa-!@IB1~e-#EOzBtM9-cVkr~ zzooDcKf$R0H8u($e5XCnH*^ipio+l>UqLfG5*9{y8d!kw1l%6RAz_X>bP< zOxgvwkHbM@0!3fRB%1Gbohkz#N&BnCG_#8UhIRy}S22OHr8?K^?M2o5R&x%@hc{sT?d0xwjtLmpB~{pWEVT9$QymJd<5VL*$O z{zHXds%87j^q<~lY%+mYkaSl6xgFkGo&NJ7pqqh%3SHS>&@p_^Bz4@J?%yu#7`}TS z?Ie6d7^pMw{m15C4ZevUGx#>~J;XZ;-wW5OVjs@Y`VRo#%{ausm-mZORCw9HkM%&8 zUzy4_zz1ewpI$7cq`CQ%W8D0U9uZLH(L>c<+7+Me;l@ZZl#!O)QDSRolYp~GY=xUo zNo-B#X^$SwO#qV%qJ)PJd1ZU7y)=C3ErV_4;|q~4ND;%dpwx{$aThwd!n&g9p?8}| zQl?h5$xb{7p+xpi1TW)t|KKELiJ-h>#gL7gkuIEhvL;=CpRD(Z{&6tDk8qjE`Qmt? z6lohUqzQj7>G0;R&etajCQ#GHk&9_a8{hR1?p4ypx&Oc-ZTvcn)VZ|r495zpKLz>zK%oByh$jwc&Z$6ZS5IL8V_8-qw4Z-CQ6O&y<~YQ{d# z1_X*k>NsU&QZ73tg$e11h9)FOoPXG-7g5oAplAgS3W}8VTXktF@i7DcB(sXAE%8I! zkkcYCT}cd&&CeP7Anxrhk_{Q}-RO-GeiCW`6|ssj;W$)ltJ zzKgaY+PeFz_;=%{Azh0r@yXAci8T9{^RY#i7v?1PD@JJrArF((}PvG##pZ--u)N;)SBAZ#)22vz4i zRAd4AiI^Ek3y&oKeP@k?R``Bp@WV(rYYV`C8V+2scM<8qagbx9Kk{ufe7O{l=g={#52i(F+`Yv(#3rU)1!aU$1rE?L@K zL<|Tv4CrM@kge442qXJAUVHTMxvVE zEF-aLEs%(Xz9!MP)xG>50)eSmSGNLqUH~)AUW0F$ctI+7!Pg-`;$#JKvYGr(JrZ$K zigX-oymaZ?=)?qhFG1Yt$v6lfE~@uXc7zbxDfBit+vvqE4xZ>Zw4BSaRVC)}eskM_ z5)az8<0tH|lnA^|azslKkd;eVr3q3gh?i4X%;c20$pltq!0I3CfYsY@kP)ij)5?A~ zvEC5~H?`ldAT`-sh5LTAz^tkw#Aec*a5wH%R0Qq^vB*7m1|!9&*h6$#W8_;Q`yDB~ z$GszDr%(}~s4Dh5X-sLnjLE`&C&vi4-+_bC_?{VLA8H8Z=DTGr*@U}fwSj8M9L~XaV?NslIOwM1`6k(xd%HT2jfv>1=+;-3j{jZQQ%SfgcBs z1BHK7_>;>W$~Trfv---B4+4hfYTf&}0{*fu1%g2}LxuD^c&C6rSL;;xo2YdwFj99R7O8s9L;-FsG(kY+Db|Z^A((f0h1K`^7?^-atCB zIp8lAGt(41&3+MpUxbP;Rk7ptrG;YW#z--Mw{kQ zrBYfmyVANFU>FWUSi*Zl^PW0ZXcwW(cmH=lL8Yn$3p65g_ zF%{k&#g`tyKn8eQ#PgC~*F*c4#+NplI<}4%FD27=C*n(=qos;Q+AV7V>2GjQAuYZr z@?}Jve;qV|MVmYk>6C%S6|giS6gbsY-+Q{|d(V`8?^&wveTe3Md5lzLbM_cM(txda zxpXlAs-g>S9LtbY^N1L9P4JG6@x716+Kn)G$!mIqeWtD5v@~nJ_c1~vi}k(d018ua zA^G34@JUEbM-*+_p-`-jL5AQVoU-`emzuyY~nE9`de~%IW ze<%FoV2XcPKSyBA6LFBK1saFWkwToFN;X)k%;`9pMx2gMFL8P*McL97PETcTLP52_ zbZ}S!5Y0oDNOKlGD3lB!ggvRvyFYa+Gb(OL|Oi5S*SYN7+*OVo0jE9A(QC zQMMsUlx+ll8Y64zUN9Fl_01Y{dx^P~1@ibFW((xBp?bsyFvQP$c97XMWP0KMcoWD> z!@+<|{G;%5$M`hCCaf+~d^SS4wb1C7ULf$PT3s4GMaPZ@5I`e*^1z0QPZN#)e2gUH zQweNXSY7wNAn+-yu8kT#NvlugR+j}nNwjwYpJaKNHk5cDo=(+ad)jxZmaic7*e4KV zTahFqOK2c9h#g1ScpP*{)#1~l`a`f;Aoi-^D{_kL<^s#65<7C2NSeZqUX}^n52ww0 zQM_{=zz!Bx-CU-<$gNsWvwMH6Zs|9CXOl@#_#X{fqouKprJFs2W$Arg3>? zjVoQ%xH1*Qr?G5Oa?MxVy6hM^9BT=Fb*tc8ZVB=vV+(`iW{eagheyQ7;SoaP+V`wp z4x_$U@s=1ht{iKPixeA0J0z(L(1YY@$V`cw$uFE{h9w8{>_8s zX3f792YxaC79uZK7S7<`mtF#LpTj|iTpj;H9a7>CydMy7#zWA$-d7JnkHu;8h{KR9 zj>@A%943ZkRLT(t-WKSN4n*-k&ec$0%c>#Zjq?I6&zTMVa6e?hDpM zrqxJ;+%@T-#*7{kzwxbs^pS?}@)-0PS_8e?$kC@n8ivWDSDOR1<$~BXECJ}x`m)~U zwY>eOvj<2cHTP#OKgXc`#MKr)ybQN0 z%Fk^CM+=wpFbrf+ek^JWA6g|us1}n(3MDjIR7f$ZkZM8I7m3eMvkVy8+kiX3r zlb8gtnpGG!F9k~E3d7M~s|wBq;u%U6mUxDeEUP|ay{4Zg+gRmlfPN_sMsAVwl{ydq zYmkC!0sq9aJBI(Mc$-ea|Mkqy!T*#eeq;F0y+won26l|_f5`yc90JhlM-)9D7_>$6`3^f%q4gFg55TFCV)Fp`1BEz6i|AJ)VFNx&cKB{>Q- zo09x7=|VZyx1!8~J_ z-87{alKyW`0W1H5gTRV{511}Ievg)Lz=mwI05Qq3%_8Syz;~p}$+(3yRdbsq`3!*; z%ji}1jRGy)X5q1W3!7!r=_*>3q$G>jebz$)Euzd7S<2=%i=6PFpoM}dLt#~W$s0U0 z$iCKa!%G;{ESZCYENql?%#ciSktHLtEJQlJ=9)HpD4vHbi;q$KAu|oKEZSB9J%@0R znMT2n>>rBDr$2^x{B}}C%_Z2Z(_)xNvoHk{RW8yoQAhFkRE!kEL>8W*sGl2;|D%RI#N#h~0@xddgN!|cygQn`F$fwqNkP-@iyH<4 zu1C#q+PeT~(q%Xu)!w*+QVsjapC#J5YHOI=xE9MJqaqqdBk71(bwGL3RrFhRR z@?oa`uUXQ7udrmX!L$yi?T5~8ALM-Ep05$LC^X&R~e(A1)4GuBzxU(Y(^;EoSX znLQKF8zD5Cm6)sMAp7%!z*7_l1IsAF>3Pf@4 zK@h~!6n!IAMU=ulnK2oEl*@^XzqGsb+@sS6jT(kdH3Lw+geWR$k%88zA&IMlmYIIP zyH3YNuk2E}NYMu^AF4c1&bqDAumpXu>3(48D;#7j>G6X}YW!rvO+b?=Kh@n}iKb~M z34XE+5iY(~hbEPuOoZI=7%4^(v_R7hf7PSub&a1iYl@i0gtm#{I^ZWutLn9DWK>bF zj_x0+s8X2f=nvND<0cJV@H&sY59k_-gThn_zSQ*xcOKo|J)P8Tb4Gfz-%&91@f;n7 zIrnP+2eR+&zHulU5hMF3eh1m-{j(lr+XYim z=*%dFOhRYGR5_qhGKbaB8P35}eMggpJbY&<3rl9}WZ{z^sAyE;cRz0uLG}|$!sQhV z@w@tafZEMCD9naW1-~l4b*%5bRc?v3$$gH3wd?<&!&*oBo)aT=j?u1NsmI!HrSGjN z(_yE_`zm%itM9FX4Wa3KdKFhc*IzLQy|rZAQT_k_0Cy1_R1Q+`*E#tJ zB|ct4n#;!`QpC-bcy^q?rlqeiX_mkySK>R$Z@3>L$=FovV2k_)M^s=__zHFMk;I?o zwlk5BB)hnL#Am1T8~%#wUDM`OO}+WM%f3TJK6ZW*dLfPe&Kh$`hAsUS-+SWlWRVzunWV?l9W*9f ztGtPruHc${xG9tfMvE32eD%>P9eMvkwTW2IlPvHs6Eo6$xV%}O=|eC+s=9YVO_90C zX=7vl0yvMtLAUVtI>B10(mXWCjLb8-Bp;XqB z)NgZ{_^>-hCTiX!;lr)|oxl#auvRJ9F;U&8Vx$uF$jV)FArYm#`<3*cQ`B;o`e%VBVh=;3K&P4s= z9l-K598_6JUle|_TJInsJKOJO5Gn5F60)Y}Q6%J-mkZo-3CVN)EIfsaF;a|#wD1&u zew&{2bnBf_IQ`OoH-Ag9;K=t~dX7}qyUsrxoJ##}G#p~RyZ=wX;XOF0I28C>)@(C4?p%auU%`mOLH zSd3pY@r}oO(et;$yOf_Bf?*d^r3@?VCJpya=Pd(Yw;f_kv`UlkG0~XPJGmhk6q%UL3}Xr(JVe%#fJ^x!6;7g;SnDx z;v-Fb(9?s_3NPIsWG8BkUGG$KE_p-E1oQ-zbDbfjv8GTO{&E5zU&d)pO&SQYZ~Vl7hSz|6KASc@7>T(SeU=1a)(+4l*c+ig9~chnmN{ zi*=gEyXzFq!@V3W8U9P&D9A=Wr_%CeHuk^@(DMJ{pe}!0e`x}h#k8{DMXD;brbi+> z^`;kA9yO;&5<9wBLO+EUO!TLhli1Op{<_~=5}KonSOa9ovaZHc(3y9tj?VrE5VWGR zHytr_X3?L1;4OM8Lkf)C$5PjyzMd#7zCZnrs2^?V(Vt%Qq5oJT2=4R(mznL_`1?|j z1ClW*YwESN3N_5j7ac8+<*C?@S;HF4xc#>RYx{5@tSRybvyf9_JL6B@d4(lnuC^Nx z6Q4g-RieWTsRCA*IRzudNB|3e@@-4>xcM#p$?p~Gm^AGj6)nf&Pws}M&GLExfAXc3 zz(xrU#`QqpgZDGr4N;r|{gFg5FYi%v%DpUbIpAmA@nmm;K!#<6HPp`D- zcycF3is^V_QS*P~CLlxYctV~Kx!Xx95-d`Aw-Z{rsAUau%hXOMa{ak(e_4-B?R1jK zJDu?UC0+BWe+eXYOt+J4dJ~*&JYDW~GRr++w9UNV$yILwag!YRzOCrdAX>4+O-#uw zmy_G6zn_dWWO_Uv2GSnFLFFGTo^rn1F~m3jM0%?ELh7}}u#x5)5dv;h5$;ve%Sl7C zVxy1SvA?}>Zy<}nSqzvfIdD6_bXzRI~gs+>PU>#IkEc4 z0=-z>Mr0x+R|-i?+p$%zRxrJIOWU42e6iPmJ(CQ>eA6RABD@gTsVF%4qXg(gz^ z22w83Kq{H_S)&Tnk;=5prW7Mo-5LV15*FSJ1Wv#~k3fZgf0leb7b>-deBFRu!#j-l zd=bFCosq9MVx$x>fcmXxi6M9wUzGIcIA3v+Ee2}ltEC!OEz#&Gy za+TlEpBuyoq>iSHOCX=f)9WH)QLrTF)a z!0l!nbPTBHKcEr|r<`wh4EaH;pfp>cawPUHH?U!>zu>ZQI#k}>0V==yJ`R-@YcK4;tS~Wk=)(^}hiqOTj@w8R4r5&K}s`&7|wlhH}_S zuAbZ9J4n%?ZQ>9pB4b>{iO3#Dm_q6YH5>-4yLi`dXm1Gx{o<8dpz0Sh2@hvT_$Fut)}Ueu3m;lvhk zEij^kY`dn%@R$%xF0-o0j|+f2xhnFU7gXGh{aFtVvNzG_ST-aO1e&%G_?wD@0e`=i z|Kwb#*cO=E@SPEJu{CD<@^zT&$bWJZ1~OvKyvFQ{YxJ1=?foYM@dAqfWa0BF+J2V* zx5vOFKen_hl`31xab>f zB;FZZl+MxP;x9BJC2|>R@qT{2-;*%A70CbitP1%d@y}3e%jAN>Z!|c=$j&VXoJZiG z@P-0!V?TaUdgU5R`UWjR^^c^nvq=#*mtE_c4N%wj9TOJzXQOmrr$CIA7O@B;8NfaP z`>_}|^`-)Q*kyZX>jD3e0(dH}r@A|`NvW_MUzKVy${e=XkHymNO2@=i&F`jXR19=B zAFIxQhBxK`4X@z9(V*x9D#>GhE-W;ZW?)@!`8X-l=4kMJ6N83W4d9YI9U40F7aqjU zzJulcq}}cTwvtlT?H0r(Yn%v8 z`o0T&BTZ|TLJUtN@89Icer0DSAnbhk*@d>Ud#i)UZ))NIX#B^~ropH1BZx=y<^Jh9 z;HC-(O=A5#epx_TuQ|W;5cAVg6=V73tc!53Vz_q1FV)z@ymS0=#;pGozg%;nj$hV3 z@w52lumLAOTmzhZkAuc9$FP1JAO+SO5zD`h5nQnz+J{E!5Yf^4F%%*AJ#40L%D|bAW&l4!>aim<1i&0u4W~7&OH4!-;sCPVvJF7^!n; z==*y;8h*?5W13IL533(lQE@Em$Lkt8uzobo20H$UgOMM8mVa#M!F%uh{>vY<9 z?J7K6hn9}w7bjw*7_?Xz_DiqOqvf~uudN%VZxk4zW85FO!6vH@YmoA%E?1$wy!wqE`6DA@XNs193{?qH=0&%sDB*s{uh zpP|QAHO7S68y{^l$p<8l8if#*&YWm~(dqvAF1(1U8_#%1#hQ{2X!N8V?cqVT$+IpA8%7*!$<+lw*lkk9a{XUtU}4MA+%v^K^K95IEpm zYJ%6A&*JcEk+qw7nI5kj1YY9{g=I$3XJjiGj|!I_rGM@RFPY)AKPHN0M8@easqcU3 zh$?2iHumN3fzJjUtnexGs{x-nb_MeSyT_hye;@Q)3mH7PAw~vk*cGN%VYa~TQS?;0hAxW!GQ9Z_0@oHjekwLb6}M0+6B|jaGZP51i5f=1 z#A%lUqbK2@!>EE!;O=Psae70y1_hh<$9Z%QAWT_G5I&_2A7bBp$EcVcz}`L=2s@Vk zH~|{A)BSOtF9GuYL;Z2SI|t~}@BC%xk8|GLz#joY?EKZ){x}zE_<|)kcRKKOH4ZWO zYDy;m73n>+xeE7Hp?J*S%C3WoZK2~hJ`ubm>o_`}xmXIlcpb9(pyGsXv04V-`B-Hm zq25^R?{P-4ei4j-iR7X&e>1#OvTJHHcfPg4HHFyHX)y(39?9QIyD`59ryCqm@r`VT zU@F=|caFvQeC#LBSH+qW^gj(i?Sq2=D$#!vvIXV-gN4#z5eSsF3Ll`qh4mv{-dsXG zx7#40;^KK*GX+%n610rqK!p`10_sW(WDrmm-oN*X^x`QhAd5)Euh8G|RLoV0+b#I3 zDt?aE-|;56=w*){`a8aLDWJOs2Zdx6`SSl$zJ59g#scAQePlp55`EN7p@h=0=PVt@ z4|IU>`54K7@d@5JF+mVHUw?O@9_Rnx=IgIJQ@6gI@E3)^{>$?9;Uko(8TtC(Oa(Q6 zje|nXntdw!7k&l(hqP34=@R_#D8zPMx{lZ$?10$1Vx$;iv(kSi>51(>s{fp!qmO^D zROn;gFVTOtYUuPr|0xAJPr^Y%r<#upeEzKcBHEyWLMbxeFXB%h0PL`QRHevtzlbMK z2Np>w@>DsxuRzVw(e{fNO2c-#-~9gufYJYh{UY8!Ek;2y>=%*zC$1pD{tn#;Dq!>0#jgk4OBJlm? zcs(25qpb5-Z`8oIZa+E-dRy#AXK8L^W76EQN0HWBqbj>8+sxxZ7&S%H*XSW~a{p@@ z=;6RX9;0=31QBiT97V$RkFZ?QLpXScF@$~}ws&h_TafRkOd!T?mch0Ht zI};~P0!EUduQ=x{N;0k*C!jB!bL8-Ym2Pz6Q0hTUe_?8ZkOillNq=E-#ChO|JNaQV zr%l;5{))2GhC&r&OD6NpmUyDQNO4eF3)6Gt6o;ENL?Bd=GZ~2R;hQTc@UX)HgUWxosMyJhAhbUt!rb0n}&D)y{-`l+YR$|!b8*Ecr=(LzUL36ts~#SIx-BTIJidm_{J9NHfV?ZD;hs@VYhy2?-7 z6+dEV-!5q@zruZMVuH<<5okKJe@$_5@d>zcQ}zA<_DvbpzFqFyJSY#AitFVGG}$*F z`ua_}EE3ShlDQn&{i@&f8rSnYN34GqJs$(($(88GM*S`z8M# zdQ7dqjoy+!&0ZY|)Jp*tb>u`H%XoQRz4$H#_64yH;LjCge+In5OZFs$dis6}bt}ZC z0aBo;v5)*k`iS)g2Zc8{q-}`1OFLO2NrAvVSSv+5Z;r9mBzXfZGb26e*%!-tg~yh$ z?a=rxJ=&k{MTXhu5=0fjIuK%2BTV|NM2<#{6QKm&%1B=|lpA0zo$^rn{Zzg)gU z<>yFS*+pYO(Mgf6Qh_6q?~n?dk$eO^SZxwLueQJ;KAiLsZghpeal!PcmVmiw_0l2x zr@kM`dtsErxG-GfLa_f^fC)&jl>!I?7Jx(5gEWcww}?81N!x;;2Idsgls**`-HTDT zu}5gsS{GnPqjtrpMUAVZB@I%j9<)aFeHWCllK~<8O7o?E-#HEd^Y55#n{A6Eu?Nu8 zh-JFyR6{Vx9>$NnEReBUe5H%nVq78x_DIFMFy`c_V{9~a9UX@(FDhZx6L2dYxEW8d z;|V2FU-l!tOlSwtM$elhj}y6o4aP`1wo$(-@(lh>wIP8BL{L1*tL*efu_m}X)3n{C zxU-9wpQ)R@dD&Lzz_`*}TexB~UgoIU!c8aR4RqSV2+|ff(O7Jv-kpYx*B0cyJnEJv z^1efJ`~aFkTWBEUz`Kb$1VsW-H=Q7>(CGNQv>rta+@ zqcsfWyG#v1Z3*0@dv7&p4Wt^z&r9~c%DYS%=B0RFvx2PX0aerY+E|wWXw8O$ig@{p zf`4^A>$soU0VuH+YQ*x5Vj+_&aN{Gq52fN>B@v~={0EE_qefWd&)q)?*qrDHi!D%S z0pLl6zjFQ@J4se0s4~r0sj3p4&3~AxMRY0uVLVU~!hvHzfj^k**!$zpAkErbt!Swg z*ih99EgMCs702VHWQUlW_ua5^iamvqV$=$Y#0LBMN?0{t)|Z z!+*!?Z+RAPMvB3Rg`#(JjvgaV z3H~ruzEV`LrK)@-Xg*61bt*UsnDC(MN!gdDA~~+%ltNqkd=J~40_Nx&n>81Dm%prx z7h;t7r|O=V4zVJ&QeaiWzwOh_{i!+o5+@N>gbZ-r*nf0n=6- z6qpiyYyM%rnK=qYkTmU4{lkYb1q-O&zTODc7S&rQgv@h&RH(WumlGT;8t?cqkP))2 zx~4nWnWhzXBO2~JJ5mo>**^>gwS|DoG-D3V_a>BYK>ue!mZA}|iwGIOZRWt81lYvW z?(6IHw98wynLmIJezn&A2DajTe!%x`9Q5!tdOddZ<4^W12BENopNaXOgl<8VL-> ze``t-PtA4XHyDf{@XgTo;&E^u=0;v6vE|9Jn2bN5J&Klr+jBJV;lx3Y52AM-40MY9 zu3F>}6GMKmm3H&!T0!Zub`uu~*>JpoI*){e6{wp;LN3KXGNt$HC=Yu5Z~=3n+VB)B zUX#H$qM{^dK)P(mhMI+(D5)zea!#|tm*nfDNtY9cp`n@$-lEMv|JX$a(76`&ELiT-IrdO zoC7GbgL|NqJ#t}t`~Dy3&9{;_;1=;JpV?)1z@9>1t2=xczvDqtYsO)z9%RU#RmYKv z_e63XzC-ScztBZ+XDmzxe?}Lu=*>;h{3iPmUu*eX$u&59*fVdCl$5*du+3w$&Fdot z+rrfYGuDOIwuM^2D|Zynk1Xsli%d- zo%Egi=KQuuDk&}2C68u?}T%~bpgo*2Y^hD1%RML24oSO znlWyLKvVX6tmY!j;>&64(9NW{A?g?uq|o**_A;%M1V9H)nL0_z8@$3(kcP@gv6!V^z@WxN~6uT{8Y< z+!fd*74P64h7n_{zjDCCU_TNavaYlwvSbIFO-n8w9oV7sGZfR?g$VyNlZ6_*{3zR{kX?)UQ3@ z%9$L&mD@_9erJ%4fppy8ozUDpdh1%?0a&W&i~kEjQ71vG24UCwci?tgG=Pdvr_@~Q z-$(z}`WeS8eq^Wm9QeNtw~?0O%XgNa==S(`xO>|`5B`0iha68h-;uKaL0o}x3V}H` zZ4iJ{%)&=J?&aJw9@vp5RWCcjNikU(+ZJ9oFr!)_#fNa`R*OvDV*QDVhkS|mSXX6LbA<17K$-=1s zymwLm7C0ojK`;Are>mjzTYCJuO5(h)(zk`tfKz!Tr`usG!T)TV$6+H3MgxpJ0!AuZ z{8k}OKxGS8%48(y=YU~+Gykr1L<*%z)4clUJlM-&E2ZaLh3D`G-rwC}E21;Sx+kA$ zcyc%8$>Jr|^~+wi)UbYi_f7}vSN{ui{^-%_`qgY$zu;Q~7W^(P!=;`@Neq}!4WN+zsm@#^rB4P>IaM-{KOuM18l1NE%##OIuWq~ZSPRS-Qlb46+tCxD;jti46SHR>W2H3Ry37_D2rA!FJh#a zRx}npv{SM`ENX|Z*Jw<%q7iLqxHs6?*((JmL2{6hyIWS&omywFbl%yk%Bri^G&uWt zS1)QmF-?HY<9%5a*peY3Ll+O5n=%gPGW7*lg8b1$i=jzKjV>1gD9U(fq}*5RCCOufI) z&p!@0%z2;pdG_adKTERs#NDuBc|R{$25B4PYSe9z4NKvsB<#YD{=MxLD;5a(79=I^ z#6^*CgpY09 zZIZsG+Jejw6t>{tXO&~^wAP=}EjaiY*v4_xmU*;5yyq~qI4rU3CK?)>Z}lY(^I6vl zr+O2-ZmW=Q7e*%fT`+w><}NbgE!d0TO7Oeb!HD2#qEnL^tl%BW7IE7vT~M*Xii{+o zt&ocpkA$3j$ExB^0_4x7K&7*Z%#d7bSyi%-4gETUKFn?eD`phr(7DY8L9#2F6zqu; z|2P^_u<=YWsUuRUq=>>8g2aDKGNpMbx&iHKeZy^~v+{$hHwm7&O zo{-j7IZIT@M}KlClZ94qxs*3Kz(elgF;>tpzO2a zsA*o>y5e&tF7Oi!EWY$ae|nI9^QSYjq-%?a!C3(yo)ycXhAWv#Y&8$}v1dyCOK<1j|=V(o6 zShY7%aiVaAH@5#2dr?Pl)X*fyC~FZ=n(zU=mtd)HC8Q_x`rLc9mF}Rmg;g5vWb3m^ zbO?k3;V=^fU1+bHa>eh6H*18xle@UZPcCQJWgD!;29-5r{*K~(+g}8!ky;=YVJ#*# zOx_o^Ejw&+2J(gd!dl`~&Xt?Io}hpLPhW87`YlJG!njYbGAEX$({?7Yz1fHl*ydda zKv1xDC||^zEt10vT2N>kaSJ#k^L7GYa}IO1oliGy=By5}?*-fCH8?g;I|YUcBdvCL zlH}jx>E#ED|Lypr_$1UBSo_Or zn#zvCHEu=Q*ze94uL9rr=?t0Z(4WPLHH#5zeH@k!d78wcOMtEb_T}y6oeIuFasgN{ zp;wjgExv=EwfH1)K0)Ph@x?-6Bk#8f&%~Y^f;F-ca=o)FhD;(Ho74Ued%h>Yjjwd?2n2a06KQB;W20c2;Dlq{fSO0B*xETD3#{OzxhjFA$0#IR~JiBn3x3B?<%$wI( zAk4I;1#EMd6YR1`!KL{f0o%NE`v0bnK-06+)(NZAkc3f(&*wjm&*A1%+6KP5N?5yP zU)oM2c%*TgboPp_aBtn>`b&ucn3%qcR?2JijpHxu?R+H~8 z5bwvMeAX*L5dtFmg~7BMcUmyFKrF`R^g_AfWVV@9388iibl0hf_T)-mz|9b?x5hySRhA2xf8t-ZA^lwpP)s&H^yyFY_lXcPz-=Z8=8}VhWn}##~`-tU ze&sP(AMpgY)_+E*zIi?uBsT&;9T5kCcuiYX9gHJxby*=y5%&znA!rrqY@18m0qXS4 zh)G-LEvc(M9Jhl0pqf>uGxlsF?1jaYwPVg-?6&zK?6mraxH*4G231x!$7MEp(eu`Bb*AOKBoW{crq;Tj~=8y1c(mut?3lhvHIQOEA%P+_5?8c0Q$Ok+E?(F zN1}^~RftbpTlQU0;=gdSHiMb9zlX>a zeLsUmE?6XU2h-==IR&^^Jd!%>VYoyjBq1EhF+%2-x3Dp83yiDkBi6J{8VyQcKC~}x z3qDsqZ5TA{;nY)XbDt$N$^H@l;tKi;|2EgRD$XWLINRu`fk>Qln5{AY8v1nL7X;X} z!!U@$tl>WRvs=6w+zybDHGBzuKinD~%>OP~!`V$fD_^jhYaxzBm6z#ZHoFB9*491- z+@4O{o?-W=b7oKH%#N

B$ut$&$AfRJ^TG4-l>uZz~11w_6-QAGYPFzMf1(acCDZ zE*lxRg|i6b!xGZg>tX3j{EWT%+UoCO6-vluk?>uK`yvPr?OOir#Vb_z9V)eHO-tA^9W z0WdfL(F#c%#>>*sWiP9NxN0U3lO5|kRa_Fj*O{RSl29vqBzv{20ofNxuvtNRpu!JG z<>tfNoN7<2fdvOfvfXzokSokg@>x3~Rsslbw81}e?4M>8_SYv1{w-qKTE}77@pLav zQb>bm26}xi)Ra}l*dDGvw6m?O&n}SkY&G7)Ev9x?=w~@T&@%t$#qDxLEC0L9{7v30 z>^0dtmHcfSu>@Sc#MWgcjdoB>K~c8QOMIh~jF{CR-lE(GHx? zHpgvwp*4N9mw$xiKrgVrC4X#x&ZM~%c!uHKC_YRmvk91s(1@p({T1?@jnEWYO~JOz zf%!PaE{<0dsjQa%I?OZ~!?_yUV(?eKJ()EW!&Moy^|#Qy$8+E${_x^hHv3^WBb zphA$JPP<*!`b3su03|&9Y%DR#>dVDQpQ4K>DKHM|PICa7-3X#%hpq6_WJe89eGzQJ z*;k6or9b~zRMAnsN}k1S$>9gcrm#k<75N zq5knMm~n|$0RE2s#b-^N2;*fgNd}AUy?9s6+*b6x7{`A20c=rWwUA?t`^vFuY6shU z38gFB(cdkev(g=_ihe`%nTS5S35OapK+ik?ga4<28G3y&R-B-GxM2e}h3&K@BD@YC z12B4u=JZJZAc--a4-i0lfTlhY;kS@U&f^2nj1-eM%L-WX2X2*99_Qe7SzO*AE5M0` zqR9$)^GqzLBs@y_FDIrxG8TK4>m&28H%tT2B-m^MPq333K~Msyl>gEdboL}JTKZD+ ziwxn5#6C0lUh;fo_>MdfC47H`=86Ws*=L+I_`bMbh3~=ZqK5BG9ef9!3;6cKMF(Gf z@sBeg=d)aeQx6l$-TJH^ve17nZC}5}0B-FltVhWfC15KVEo+-Mh4Er3p(BabQFdW< zY);7D+m*q zGCeRaNfoke)aLp4OQoF}2;w2EsivJC(%qNcgrh4wq!JHlo={W=okv?-@5_n71|Zuh zYc5>2A$q*-w+;DG95b8+VCBCKtWhk` z0$=YM=%>H_8)xwiNp|~2CX0K^Kt^zj|Dqs&Nzk$5-bEBB*x?y)usX)mN4XVCmQ@}0 zHD7FrX0eB9v68y}C5;2dspKv`p93#TbzL}b67((GkL7gb9ntf zuwrsLYJG;&vy|`LEWb1LH{2@K|Iacz9sLvvQj!vp>;F&3Vvxf8bd(esXbGpIL4y=e zR-z9#TO}uCASU9wh<5#}z$mA=KXyT+%5&c$CU-7T4I+?fm$N~pXW=3X2mB;>QvM+a zDLa+ePlJPS=Az_yqPR{>3gVTF%XD9Rii38%6})Rhl3%iNq&UqE8%12(fO~PI$a3E* z2pV*xXrSfBVB|9z!IYlA-pjz zO%c$H=iNvz#7`AbP9sB_<$7LOI;$sDog{fKDD7t{?h3=kKR7jUFPfW^n#aQ~sPAXviN9*)ikKxs^uzQ6u+$ ztdILZm@=&HE1kNyI|s`>+=ogzy$#}dWGEY>`@<(Vy3K5wUBBQ~*`|4&Fk?~;dN&q| zM(6Hqj|CN*<~yv|td;swfEM9MBpv8_xG(cLm&!fdH-tRs=e{Q7K|;XFkY@$l2*@wD z_zbK!NsE>mW%&1yLZ)D%F7(aEZW^)l_K9Tw(W7fgnWMCS@`r$_-!}^_{HLwQqO>^IeVWDVX z{r0I^SU;}t2^5b=;D)_X%lIUqCg;@oP+KUrRw2%^uO*0Y9&H5i4X3K>j=h?g&IY*%5Gm1Q!|J$+CZCNY78fFgAhlC44V(vb!ehdMc&)h$DZ} z!1%rhF#hr3=wO`PP77lMT~&H+M$FtqMY39WeE~u~0c!3u1=Y}SIGY=z1=x+M;aei= z+f?Af!*ZMs;P%CZ6E&mf?uzQb9FIl>WTjy&$gFiHgSMdqQe@ihqUeBg$;3CN?e`vv zOxxS)G;n8Ls7YPNomeOu+Wxw&7Va-LqixLb*rCw@kZZ`|VG?GK4+*Z?`hpaa@)Cvr zHp+;?cP!9?e-Ib(G8Y*>30jps<`NYZXvwhjG@#;jT=en<@t>vI_|Lsc=p-!vZ$IUT zDEWVzkYf%86D!G5-GORz3W0T+)E;pZ9>uEdi6~YI-#da|%owAICQ^DAx5WnjfV;UZ z=9y_`hi!ilSh0ZuD@SlUEW1Hth9L{Efm>l$wZURiEX;P_JnTe{ht+9q9Xi^qg|}Ac z7XOB}-FFqfNNIrkiG7^4@5Z1B`-}vrTXbSiPee|!fHy@>Ju+9}t>kURF&h$g>HKW& z?qciZyX()!T~PE;&n$(IwVUU!SNJ_5PUSNo&yX})C*JiJk}#|6QvM&=a3gN~o06jO z1w_o&lz)k^G_v(qA(`Ym`Q$W77_H9`e+N&_87&UzKx9GbhWI~H2G{Z*8|a5Gdy$xP z1P)I20`YVI(U8w~FPw*G%YjLk^`mx+W6Vq=RR??Y%Wa#TBU`UNX_CPnO#@{M{8VYAU>&>CDrz!O@ z306G3OZ?&%I|9&(dk%Kbq`$$VvA9cT^p0iU@pOV|pFD7r+k&4d$N>ev+F;{dLLU#6 zJ||P819Ok2*fvGSScG4pFo1M_%JRl__NOwri~?VZ~k~i z^QrTAxaPZNFGmF|IrDyYzY7W)BKorh@f-=~!@ncvh8ol;6 z@}h~nPk?>gb(oPZOXP19rG0!CLah>LVM+uN0or<8Gy;U#6Fn7;6=aqhC9mMT-A>^H z=3rt-CTt5t5F|^vWGjpeaWh%G#-imGF9*D=wswT6t@1s%RSqFMOay2WLP)_vdezma zS6z)+4}HW(v<5*!5mMd+{ww@C4R0#bGmLbnsZLqeC?%@Fcp zm@X3qyn9{)%oA^Rz>z0^pVt&=YXmcWn9#!)_MS{iWgj{4o<+94Y?IBGm0qoqBv z{hjgzUM)Mw&pM{JmG>u}i(kbQTr}uBR)41*8PvwS^CBvHuvJAOh5MGPcHveYVY8J- z@^`MqLecO}H42qf-Z=sOPU*Eq9JCH6!xy28rVm&$G<6$4)#uq7WOC19v?T@2m?d0DHQ|9Vvj$d;sN$}mjvM9EL=1U z!0@5y3&ZoLGst8%7F$c^a+)`bg>Br<;m#tTioP(2eBOeEbOw=G|I?!|D3w^)2|eHI zioMDau4(B?giBlIYjnQ%x(Z^bjF001;uW~aAZGCGr}&>dj>5u{$t*0Xoi7Q$GWvMmJRuF2)cB~;Jk>2;sUoij`v0^7^8T`_$dlz&l=y3gJ%p?c z=7WAtrl~PMjhhphpJr{<@RNc+1AaOk3q`|EB~$^c@YBZ%{(vK7p~4*C)oeQa0m@O~ z&m@xk;a4i3ojOS2vwu1tG);%XL2*D~KU{SD*Msq2BP=v_a+-uF5Ji3{qk#v15CanF zfB|!0a9oJ)9;s3kC?KBottqya&emf~^+9+q;LTrZu(d$uHUn(kiiPypl8$Z@=;#*l z2I=T_6ID7X*rKxq3JtTi2MvTR1R!}7sE(Zk)KU}(*b4IS3?iUz5y{-Lh1*36_frD| zI&ag4`%lN#Nf88`Hk$;act&rGt6jk(D_ zD>8n1Zix~<{*vhMb1Bt*{ZH`Y*{tH{^Zx%7KbPw86Jr5>nnG~~_)+{FWXhur7xj*@ zV|d~o@_LfE*Fy{i?x`cMhX+#-$O2o5yU6Y}M$o_RYWPm=n-3!BKUB8AT}D{_~57vl}6n0q0Fjt z04Q>Nl8KApyflP4J`K$A!4VG}pGHSsgY5VO;P_lXgDqLXppX|Zc6_dx$v}h6Qg~%B zc)O)-vMv64FMyPd%0tTYnt4>-qIe#D6}#Y~$RSgNgWX`)#ND-pcPp^L)>vqn;0PrsVl7hhTeK~9q@WKATho#unq|Dkq}uNrJ8+gP$*Bg zkIlFr&v1(m0k=|cBGn@1qNk-e5*Iy2nLLH&m7DMKlRJa?%2{NZ8+%hbW^lHYqd=-& z;|L3`$E~s_%d$I6PB$LJLV8cONncG*dJV@^hmhN&T9HgsvV4&MovJ~5k=+elq@Jqr z)HDc_ZyBA)p%R!VZeAME*cm!dQOFWqWn`Y#$LrbS78hPdLMSK+p#cyq`p5549xpw;7I(VER{vIH4?00^ zKLkX5iHl^vDe{I%8`#kX^5!cthKJm*s%W2&Ix`P7;zTDczae5ya}IZ3D^ z>GJhI0N7V?;Zz*8ee%*qQ`q+7dr_jj;jkUET7j*tTsej{(3-#hD?0cVpb%Eon#>W2 zWIjMFz+ph*3l2_YNH7Bhi7$~BF`t4i_zkqi|^^emUoEDMO|d?De8N}nVlz!Hw+oUc1D7|&3^Ou)`m(m$3%jt^91 z;E==dJCM;A7md6D{mb?v`LRmBC|HXFVPTv3uA6TMuwaly@LhlX1c2B3u1w%ioWj6b zoJA`}=ez!Zf>NFDN{39`Rzv9<*cgVI#z-V@)h!|eQighBOP=cG*t*t86v;@e^Lmh_ zH2ngtr%ElNV4$+6YVw+p?;x^#oP8?%aRTzuuYmu1xM<*iJn_9}V9T1=jXfuGiDYIs zxDFYD4ZjPq877G5#7- zF@yN)xedTf3NEU4knEdd@~_&!8aMN=o|{A*6Vbo=2rWR4!M_?oD@NyEz5P9L%>Tl_ zI`pBQbu|9fz|?=_U;U_J3jWpfUx2A1TqOKJpJ?S557o(WI5`)xQ1pDtx44*Ni9jV8$K{a%PU>A z6732jpO>Dk^Le+ZIDwM?K?F{|#YM|KD*sSaoMjf<`KeNnq7)RHU?B>2rX)qhodMBL z2CA{9zy21zl@)H=-n)X!G^wC9sl=iWI5pS-ItK^rkxvb9u3Af{2JCp1jtoRPRh5qn z8pO}YU^V7|>u%C>K)9dr@8uc}c$5T*2?w;tLV6A`_A~C;qve2i83&+o6LElS>uzRI zF-?6H&tX8XWSkCBA?{|k2<;=YLMojJ$rkU`Z=0~f-8X7k0p|fxJ`_*GbKT+#Dz6Vk^WF`5j!|*MBX--~)o_fGZ)Fg%yAuoP zIVPyLylAckik83LrRA7c6dY;t6q?mPP<)@Cd^fLufW$DWaytk6mUDoLQWVyaypf0x zlb`guiWPVxZ+;J~EXGB~N=y91&fK)z1Kb$!PdS;k#?tJ}@sV*e;2jNanCv0`F~H51 zana$X|4uD#-ZsKbGyVZ?kVCSSlQQt+7Jmq19}^7S`?iXq&1WhYlDJ2Mp~#O!2W=Hk z;GS0B0Z$fOWIV|~8NPZmc?VX9yd%ZVWRs+Fz26;DkLmp$N-hbt zzcZ0~Hy3iOnVq@KUCOb>^gcTtHIaHW-&`;CjP-umcCFO=fMG367jqD5a!CN*J-`}p zM}aJK>|ufr=$8dwcS-QEC|5NqgbiK&8P~ISl|r?yW;TG?a~ZXu|4q;>-lAf!JNmEh z1@$Lbdme9)sDjFc{s=fglKEg$29{dFV%xPE%>QYO%HGEWFjDQ7j z;$oG9d8ghFnw z^JT#~)azU@5!jVH>2`?jLN|?n;Fk+Wjq6E4xZV=cm@*EEvH3- zZQ#F-k@eX1iXLlCCb%&vFU*fj$}3;fkTT^9n~`!Z7K(^Yl z)S&M6dwW^L z`Cl7>_u=R;8|&C;yKf`Idz}!MhH*=^aWxFV)RYbgX2NT$B)m35I)^*}0tGOTR0ZEp zHeQ(5b{YPHOg>cN_H^to?nv_t#2wWzWNNy=mcfkV-_fRrW?l`qx*Qve#?_w@Ub6Ib zE`vnht(p8P z=TT;BD)|-$*34U2NN>#;+nSxe&{{Lcd;Z_Qy^#^qjlWd%=l?gU&_=Ms`Zb^(+8PFJ z3Es&vybbGP4!;F(8B4{kHuleox4&E!)T8NQm+X~-d}qGWL+ImF!{`pD2W zhILnWWLRguq=B_^K5YQ&oui_Ib;dd^tf?A4Vew zOGU2_Ivi0f0qBFqjR5rTxX6H(ejcN|`i9J1V_qm49+?*&eon&+k>u5dSST7^c<3`N zFPsEjDC4J2Sm-8r z*)=ROUXCo(;3ZQ0^dT%14PFkf*5c(P$4>`h_p%mW&`QD4vBys*sQ7}h`q_Hms|puG zeD!AdYCP`v>4RjL8b|0-henoRgP-A8V>T`2l9`hGXZCcu=Z$dg~u-l$+@*QX+#eYCEq1HqOLF#>O$klTLdcFg2Fwi_`TI zJv?V=?IWD(neL60k3Sv@=_R^xJjwr|R-!*fC^)Ws{Oz}!oK$YSN-M{s$j5(H2k*C5 z0p9<`B@Et*{5Gr?d<|x_38b&&`!US}ANQ~Z()STuOiqdayfPfp#=5ic11+SFx8LVv z6ENS3-KbVgOGSfEsW65FA6^X@yKvz!X7W24e>jWGcw>6rF(@)U2N!6d9EqME#6r=~ z^P%^(P(FToZhe~xppOpJ0y+wME>U3(`LXv?z;kt zof|UkL5=}trzq#`2C=+$SST7j>Uoc2fM<4}wEUt^9#C~^hoGWUk0rloxQY=Rxo3X@ zj10v^#t5VT2=;q3>s>nU3CqtrkBo3*+TrH*u8A^OgX4v=-B<^ZYrK&!oRW-cv^&uj3@ag!&i&`akK0qV9g-E=wC32O|WL| zug99Iqq*gudcOv1ihpc?wU7FRW6e0lpxe7ztkKZ(W~ZOc{9}GD%d^68F3Znc!~J6j zccZG?2?9qPb*y>6Q9+#KB5UI1Ej|_JsZENt1{ZnXhrnGOE`&3NuO4CX3^@lZyrYm& zKcV$xn;Pq#8?K0~cS)jMx0IMT#0n)MR`B!etjfDTYm z=!Mc#*|KE~h3u3Xh8o9iH<;+4fA`hupma_ZQ9O}7?anERJ&TH#Q6B&^SK}gclY}3f zC+YkP=2u{f8tT19z_>Q6_p0p!utlzs_`3oqh`!$I0a`J-dapm;0xq<@N=|gWS0=V@ z;#SPxPi}?WnWUw9uc!W{U>x?>`uBl@8eBLI7=N&Q6-0{c>^v`tWo6+w3Hd6>R6$l2 zGF6tc?5<@jyK4o@?pn#RyQ)}r*BX}HwU%Xf;jBKL<*OjOYb(oCL9iFuU3*xjN+JtH zUBeo$qAY=uRaid=Ia#Gaybd<8nJ@WUFT!}ldZo7WImR{pAU+}1GpX=fNGnF?OU5iA zjBDzZk|+-=ydeYc2hl9`oZQN&v#tVYVlzSI(=jc1pq=LFNo5h01}^k^7P`gjeKeE@HsMCZe0!@r zE#+MPGOLrFTA5@{KY@kxmW{EF485+^ktegB&^cGtj!*rnXh%uPnj zHGkgt-!T5W`7eqr+* z!}?iVN~XK9ZL;Q)$hJw{9L^iCP0agQ%*Gb`Tx<%9prI0YZ+K|et_@b?tTl9 zz5|yq`GWZ&e{1K5bXU3)29PHUtF-ZE8k~qJ&URY??1==-oObT;J8S7f*bv@AnjYfK zuElV4X)=bR+BUZuf1S7hM*;ZfNBEunNT44=PfXf?34$TWb6Jws+7++=_rDjVZ9KHE z`beyBr26;HaYqWo{Zjzdwcf%FKI?36TN)H?t@dUm2oCImwovDHHqdgIv+gYsy@d@z z;pQ4=Q*1swmR5Z*sKcL(!O!>;vJC4nWgg$dU)H~ZCVqu>nrfY$h_73`Gp&MiYuW0= zvZ_RHp`BjExfL%^o&oe==!wB(jG`sH5n!T){1>o*{AIlqpB}kqT zH`P)UT|muNnXM)_TWt`Rz(zIG1(_GMs0+rI00R2BKT9<=vDE?>My(6-UJla*RX}7j zbPuwywkbWNQi*rLmC`3fZzk`_UJ%VYlqsK#!D2SCg;tyw*%sP?A{HfIF4FnHzpzj=_R#j{Ih46QB5<8))f(FB?f{}bj{pG3x$Piss!CljFH?Jyy)oD^ua0(XD zR}>g~V|PCXC@U2OZ1ytB3F2x5a)1JwQ(Xj-c)Oj>szJnNFZaY(g=tpbysB7>#Sthz zP1u3*foo4cO63F4nFoZzMgj7g*A5J8UOO~LS(VN{M8%KwVul2d?!g{wj zt_Q3HS3=q9WPGD^MmtM!Hy8}`i>Kp6Tj#-e>nRDIwn6{~6Z>;O2-GLzzo(YogYTR= zae)wnp3!UB-x?iuhj5&ubc8jH`gW%TAFq=L~Se4@zXJ93G1AZ620wd3rWW$e|c#F;6 z+SWe)58JFEb^yX<_YdJ;7{b5MS~ATXe|a7nFVv8^BlbFz_c15>ruo4=IFQ$15Lb6> z@Bnt_Eyhf)nl%3)yqv{$KNUfO2g-Nb9(V`8hS1G)yKh9QJzrdV8~(Cd*qAmVH5uEh z4#sZzD{jY%M^cA9d}trO7q^A|F5t`6N33a^gag&Tb&fl5XkTvJ7JMMAsunxPt#Z_q zoGx60M{W{tB}?#LO#CWNO{u33Q*dvx=%$acDQql7sKJxuz4_<{+R!%K{Nb$@!Ua*- zh}7=AHi*4nX7I-b**4NP9oomAyRLd)=eTv45jr9@am!!yVo&46e7(QH)spr{SxqZn z@AqwX*Jj_ey5YiCw)U7T1|Ykd{H`YYia(yg-_>BLbXoEEiovP9F)l2{og-`l9`HXg z`#pf>n$&(c9WFa!FS?lCBU7lJbA(|zNf_2twyIlNby-zYS+KKh{uwbA%jg_&!AlI! z_;Mn4^&k`pd+)Ntv9|kD@t+kUE+3Iuo8~X8X#&m?)An-u^(FR_0I!8@SrB(VgYV;Q zMBhlUfZinq?~-BnyMpXpTutm{Vl1}z;@ReV(CdhIToQ**h9uKoD&pf%os`I4QF(~4 zNkw6=FWutU<+?Y%Q2)ku{TokD!`r_2B757i-%@veil_OHE6{v+`Q}vjD;qqmVDqrR_qyy+C zBF5`Oz6|1p3BGIuZ4-O#_7*mEQUdyccf?J;q)h4z?l@4~Ic?*_1-AF&%YxT? zTCKR0t!=%G3fc~!zN`c_VImel;LVr4(3VAKEe{@ywcy!tU|o9Y^RY zteUg}pZdzzfLwqXaTR(uL5$$7Pw7=vmi=V9DSG=m?=Swhdy*A&P58X+tT+pV!(4g@ zcGSR#xkU7_Qgw#ik_8Dlwk-Dl0=Kw*8SsyxmjPjyWB>Gy(j6$Ar0@2sn&`FOU2lV8 zsK(;7u~V?V@q>K_8%^}FuauQ+MIZhuH{Q9*m$ytzf>seerkjE8@=$T_UI*Fwf^%71P1%ej z3_qog`6$#Tp%7Y5G9t$f(_r^F+)|TV_Ir%yD_{090);r_F-#iGtKx4VqG7o94dxCb z>BrCxE5tvy6~S>tzZ{G7*-)!5V}W;WJ1$bT;*a9=L9y~*l{@ax-yzC(l=sH+*hM?H zpZ!|f9~9ZN2`C3Et+7gys49Xa`Wf&7cIuhU14dpd-Lo*lJ@4{+-k0xL;CH^k;l7lq z9p^#|@$qE>o4Xp$%HdjL5*~ktw3I=(C<}k$2G^to;5XudTb`!bt|a(ci}zdri?dgI zt3|woE*Ij$c|rKf{lSjD0LK+E_(psBV}+gw-GaIxs8}vOP~8Q z>lgwuH(M$*#R^xlFSDVnCdJ|REa$s={UKQYw5##sXe0dn2dVF0){um#WiuFH@-LKd zFGRxvFqxqbYlSJ+(pfN~dyuAf+2Jx_e%0-9kd?))g=zR|{VBq?pAvM0zVyZ7?Qk_p zXX1{FeZ%cJxJ$ILuX`{)IN(jLp=3)fq{ebJFBFP%W?KDsr?f7f;VnealG$pLQzaoH zW`GogyhM7ZHo|DDcc@*+uJyW;{OQRIAn7UmM;H3xO>ldM;yVe#`hxt4{`5o(@+lsH zpOqc(#t79l8P*u1J%~ScmK+)(!&+Wd+;(!RTm0}TCeF0jl;L@&7M_U);1rI)?TDv= z$%A|LM0Gd38zCm-w!%%8UJ&y+W^(#TnA}Fl=_0HReThGT*|FJ%3TL4F^Wye&PXhKs z!=RHY3@XtSQA^!!xEs}q8P1yliB)yJroLz{=VvHUj)U5GLpvB|eeHo&6 z@MTT-GY{$dUBC*cW~eo8V@|I4bca}4gxM1WG2F_eC%<(8yLG+T*hVr%W{$9U#!gP3 z98(~+MZFd@EZ}qX{WJR69>oyma@t$lj70dO-EgbfCiQZFQMcU!e1PN3&cBL)Y?JdZ zj4{W%DVewG84a&mshfyf`AihgEVHcJ*;pi+c+by1ZM=sJ51!u~jPvV40yJ`%_5D2` zRH}poa5979lpx^07fQEznCCDIIlPKg85!~D>n=6b14m!AP`l!8T=ep^tRY1)|C@{; zOLNH@#4o21aJ?msIIwL#xBX_mDFwc2w3x$p?kx&@ZM^r6NoMm|SV#|J6EAjelglhAXU2Z{ParviWVyRqSQ znpV&hBvL41*`0uwJP4}jQF*sw3Vszk;UeL1-|jKW@AMJlk8pg_k&UolX`7AnE8sI0 zv|$p4e!|X~MV{*=hD|eme*$im=X!Yw^d@t?Mq;68=6bzX31ljBy*AQ{m}X2RDpK5z zV56Jmm88Yy=tpGu0Gr0Myz0DpI7C5IEPR&NGo4U+q?zRPFlO z8OhGE7ZZ|9@@ERLkp9HSIAZ&01?OR&wY?iFHp?+x!A`@P_5NAubFMJy{ll|Pao#6O z)bt3Qetx}yA5u`(X~sI`kYdb<*oRx(bdz$Hk!}%hTmTxl9v3YQaDJ7gZiM`UT%s&v zyorgC@s@y>RPe^MkqO?O$3oHIt@V5@-cEG>!L{R6oV>YK!ATVP2csq^@Wy$@{s#c> z23(rK+suCW{Wbu~*nXJXmctnO!7rQ&^=!*@@%~6$AG{1VSGFH!o7oRnVG+G*N zPq|jNF#(JECYqJ-k|~^1_`Vc7A{@>G3l%uq%Gvxg6FcIoQ=)^lW3Cp~ zWR`Q@*JL#F4lUF_8-{?SrFkP5OtY3j!`f%VZleiy1)$pIAkV;#RJ$$e*4evmREQd> zU@7+l{GD)-h&pQdaT>5_B0m-P8{P&$q`EdreOUL{q)9+k! zEb`-b71WR)Z&w1;Z{X5QejF>kKS9Q?v0UlVIH|knqoH zW1_5Idg~?t(bz^A%r|YCBYATHhd+}sk?NQJic@e9u}A-eSy~x$^6Qsg%2%b%p-&a5 z^N;G6hTNcteAF*pI1gw`#f8uo9lnsU7fnCw5E+KXa_Q07$o#S_PvIA7+^>lq9*%{g z;hA^u)$+^-MtZne4;$0*UEpi0% zDJ-OySjG{^m>F7$McE}v1QJ|!W{qI%PQ2=_B}py!1LUra!-PXa z5!H&noD}noZph({D&%SY(QH8eTU=zw^PgOw=;FT=GNRJIt*`_jugDZYgW)|mfN@I6 z-v~5O@;B1k5s%`LrIHN@IEhQhS~X^otR{{gIi|QdET%YN6mFGciVT=0F~uW)0X;Uz z>&g)@09+XM7Ie6hid$DCgk1J|411%IBO?>Vo2CIhqpZH%SZX5P2=o9eyyJ@LjhQ z-Y$y({4gH$CkKo(l&y;OCBXYnxM=XL@SBF)po0whwSGfpu`xo6jzpGu4`*|JV;0?f z;trFj(}h?l8kzS{u~z1tg#7T@5vsK7{hlK2qRS8e0i8-EQ=9r9-V3Nt!9~w)l0A^D z%DV#a5se#g+NB6>qj(#c!p1W0XfU#jI|px|$hiAtm0XY7qLFcDPu0q}2Wdst zsi%>GQ6kT&l_DY#8YJD2ww$a=w?wUUa}O|)ZWr*^lB8Qp{bODmr&!0x5N|sZkdDVi zL*LQlhsVKQH-Yk#n2ZiiG>t*6xLN~cC7x;kX!8yF1ONu`2TyEqwuErp8)yRz^Is8Qx%m{|Od=J3X^#dO!`{d7L*#{i^hVAgvMvulAADj6#}E_!klMEw_18<+{D>pyw^Nb@?>4}S-^BKHj0o(a(F z>rg95DVx-xPNEf~>lyOJZNP!HX9zn+Ke7EM&%o|Y8pVuz9avGie?-xLa!{(m4KM

NLyP{qj|@~}+qUa(oFB~m_e|7BE4Hn|4+d7(&R-RNkWNC3{r8MX zoF8~q9+ke3+E?d>Hkb_60k_SH!>Y_d=e5QEHMFlo`sb_B#r7Lll3S+nuRd)f#AK{{b zF@tZ9u=5diCIVYGntox=khN+|@jdxoP5lh_l^WKFF&FX7NP_A^G^qJ{pOjN-#) zMmFmo6K%h+N6ehNtFbxN@knoWx^DJF*0H8UMG)%UJKqTeor#NzAcmh~J&$co#aD@5YeVit) z_DWtwBk@PnNeJaC9^h6yfjo5aVO%8ne?0s#(`AYaJKw7*fAn-{aKXH06I}Rzjt&=> z-lW9^spey$R(R-cu|f3)S)5Sv$(^qn39C!7uYb%MMJh_b8rI1`N$55$YpD96r*i(p zkDqu@7gCH4c*CXvAP#6SulQ>+Mvd**$v<(9G4mxV`*SQYXOQKJnZyCl#X`~e65bm) zmbfo*lKY8n=%?DWU0zgd+GFo0nyaEK)gtCi0=nF|sFIBT_K)P*6)?O_eu{Y8qNOx> z*7tghM7<5-#bh!Y>#0?HIrW<9sqZi6)XVe~d*=3;-C7 zy{VCVB5RDhF69{LPg8{>#TQy(p=dP5o%vdgaeVQG7mSRKdw0u{dk7*qEge;EEK&}I z5ns4r8~{8P7Y%?Je3P{2!AzD>u~SeSPo}dmWE*$sA*<3h&vr?=M1ib%KhL+Yh#soO zK5C~tEmV)E9^s2P6TdW-zmMdXMoembs;{DKQPkMB5I~K`g#(qrGph4n81^QxeR5}H z*skcIz}8k?E^7*dNaQFi6b*de&(*^B_~(b*8fyaOPj+ajH;O~xk}--Dr}*z!!1`%i zR03x3?j05%4e;9^zH2J9i0%lEcV&ywGjRmBpX>jsH1e|=dJvy9p8?D932TXg1 z#mbH|AGI1o&kU2jlCecKEbx!=QO{HHh797LuLa(|$3@b&(eTF)=#ycBiy7M@^T(4H zYH$&WKQ6^W(eTF;ZY?g3pFf6R9GW5IpZi)1`6&3~P8H7JkJ)1Y=YQi8#vjLH-;C`A zU>e&ufvp@5vPG-v0B+ydyK_7+i#C#d^B*iE;UQv9y=@f71CP9%O#3G90@c2GZNWda zZ^oCRN(6?ryETbo z#$X{mw-|fPw`FU&g*wmZ&$W=t!X=l+?|{V!zXKizVjPskg*5u_Ri`3Vo5fW*+(c~M z_@$P4j(uomhKemj$a>`gTbJOX#a1ML0ho&BJfp9s_7Y@fZfFI08pKm%I!$SXoC&NYdwndaGuHqb8~yFmxej!Fm4L~Z{~)+K0( zP#9=lYx?y@j^w;XyiFz&$oiSQ2YZJhWIV}PNv)K35Z}rHe*cS07=CfyugkySSY`8h z-hgdPxpJt&KXX!h1rfD9frxZ$3MW^Di2|zwTSIbRgDrDaT(vs~IdPPVS9mUV68(Ih z-@d?#JoBQl@|rd*$uCcmiuMqa{LsUU(!sHE?oi!NR5S_yYt{`iZ}8TsQ4>$TFXC4c-JFtn7U4bW~L3DB;`MI~<@k23SeH<4j$4B4Cc zK1}_Sx#uX5HTTCmV-Y=6jrGQSrxvQm-FfNho(Pq}Dar}BFT6dUGzn$+@p?(z?+`sF2riS_>`FH*r1s4(h zyGt{))PFMlI}eh&A2m_eLCz1y~LQr z;*tJ8Rc9`RoH;3nZb_MuPJMEXmPe%IX?O@?oZq<87xp}V%q1#9kUTwQ2oQ2RF0!za z@$rA>yzpc)t<>-ovW6pi=bkuNPr1QdISV+QgMBVfDAT9U(A2=`Ee7dT! zQfDhndUDPSAIVW9EY1u2I6*o+anX2O{Y7r+KK^9@t6y%v1KjMIPwy>G}25Rmw1eJ5)Qk!IY^K&jyh8u%J<7ACN7wqCd)(rjN0q}xB#6gl0xw51WW30H!|)T? zUpx%M)Pye{_#`r4ENQRdi%9jRPAn7+U%c5*%NNI4Z(4=nb%sXZ`yXq0p(Uqr7}EV! zr}3F|qJLcU^e^?#ku$?3`vMjJ$>`}PB8V(!E_9LDAt25nQ`*?R=*Tyyc$2E`;bD@# zDE(CAQ6&4~iFV2KV1G=B|V^>7sYR}EFF#5NF{+mrL zx(HiTPrG1kgq^ZAf3Eyc`zS?az}kqt3W)jpN*OT{12FnG^XEgbLQOF6=tp|WS8Z>O zfn}#E7%=zeM_~~?)f@Zs@AuI{|9JfQUuT#^eb;=bg>poHzJDi$-f_PE`XGSyRa`Xm z9$B8eM#ir(U0=y}q0lv=y1Fik!=L`g7N8lpMYWm6OwVx6{4^n2`D$F8s zZt#|@bp&m5`yi(3o1WtJuyK|b(EnV?IJ&WQE(O=3&wae`t*yOt4-M+E`_qH;p+B7u zw~4ou&Q7*eT5ON5qG=EfXjweBs>0c5d$gv)v%CK&d(oKb)&bj!MhhkKdZn}LEWX)w zxTF85U{U<^a|UdidZur>D6G#H-TqihWos-_>DgV8l`MQ)kMiX`G-s+W{RIuhO4bUV z&G=LO73itlRq$+GfKfs|7eePFtzvunQhbFg1s|Z_{*U-7-M+~!9;#utS77W;UVx@6 zbQiMssM8g~$078^ID|q6AtHe$Yu2QcRS|pu6o+Snt$ZI;w1C#R*}?JSdVMigOvP8J zx4U@hQa$Vm{<*>)4AY^JP;0Dt!tGY?9jR7oIo{oyy=MhYbYioiW+n)m(l%lw2J9D-oTgeM9Pm5)soyoq@DXY#n(B6CeIm7VJLj zU+LAsIA79d?AFb`ME=X#>hI&Kzl%k~`?yWsyjq{NlQ+9g*g{~MG7nZt9_7Q81k=_P z_^g);+c5u!KE(mW=Cr(q0(TmU@z;tj`YgMyV6?DJ9Dv`;)^w>y@IAl=MqS80Nbt={ z@s@Y*n6@QaURciI8?-B#2~H>8vKuPK~3w=yXOWHpkkcwgV0nwZ`ls$I+s% zgc6*KG&+J)`?1?b+VN$gI2^g)ZhZMn+;*TS2@AkpZ3LxZ7-@>zEVbO2!FJnF~{7Ug0?*+=_j zQ^{wMt3N&&S?N4Fz!@rX(X^*b5i{m4#bgT6WPMs*QOWWLh2nD=rPw-q18jYq~TpE#P zYj4Ba1@_7z$ylBiAC(MT;O#Kk2zLQWx-Id+Y6_Gx<-4vu|u zM?2iiH$~L3vA7?Jro5odehOYO2d^4~pDtQA1OGV{KlAOCuH?#L$rYL4`v$C7F_NwR zJKNSF+uYv~3yu1P=>Ac3|GpKtjkdF;_zIgn2DQI7dmB7^G#(p^pBc1=O#J5*{LHae zrYBck&Gz67Rt!xR)=IB739AUsJ>D7C@!p=}AV7p4#;zuLP4kSk^C5aG(mMd@4R=kR zXS~Z>xCUL6N)kS>0aeoYB5z5RG?@b|PUEYj0T7oT^tZ;hEK6f5J63qUn)_vOlC5*P zrSwRb;#Q?cPVvN7=Eu0|1LzuYB?c#Awo8s9E1|d@nEjrW7|oDnO|DO%84e#^g!v^U z4R&~qm7cF?4wdw{8sr5q;T?}bOmivRKruxD9 z#iQxD6a7~E^_Kb$ldrFFZbVMP#vGbVGxkDA+qt* zd8H*^T8dqeNfmip9fzlO^9|9j>#9iVS2MUDW`02v#qUElDm=BVHO_T-#ya+lL*3&n zSepKh*VzaABqS8Bxx7j!soM7vD3*o~UgXQcD3cw^2(EA?b3T+zus2sS+9@GpF$x6( z1vcSNOsVX8O{Y{qAME@a#p)O-$Ogc42~C6g$Q8e%ZPW;TCnvkb=lII(M7I{sM&YUi zZWeI*8ZT@TY2U3bLvb4~Nugm_=J zm?LbgaZSTO6?@sNDHcz%Z`@$?J3*8%SFA$X29z;@Z?Tll@?b!th>0@A9T!-$R(hE$+Y?@JEQIwu&$BBAVJ*pkrPDoxlH&+V{tN z(B>pUFMmYXd3hB^E>$?|dmR+wyhy1k+)OizMkMzGo?5X9Iyu66iI~Km!!Rq+xfTDV z_aiCn!!Lk9tl-B0A&MZimPVOESlixnCQxgoIB7*8BSo;6e+iMF(W9)NWmYTOdu{4l z(=(v65U27a`0kF~cL~`7*|nZNLR^irK1RJ4w-k32a(W1{11{P+*^P1Y&A-QJYVQ`}Xan52q(pVAjdDsb@gKdxzMu*`sW)6^Ztm!S)!4c*MPG zoO>V)_FxpKIHMadqCCDhxu4)lp~v?XT-bTctR#$CbfpLh8NCjA6KwCDvhPZgjBAA$ z?5x93%$XXQBDAMx#n|49#Vf`O8$<3CN-;U5?b==k_aUr+R2nP*Aa`JET4uGuI`|WX zN%{8y6#T!A{-0MjIcBm|h^2{1>%;-Cfi6}q0bK~_BU@NkT2fCsm{8)0E87?=#IXTJ zE3Eh+ZoQC`*mhg5gZ=OBXLHuHUF8;^`7nmQPJb1go7p5jVMGkacl*%jgl02wo6R$W zbD?ll5JST#hV*VszF>jEz;Y46|g zma`jN_0Pj>;?B~ci)Bg7B@p;_*jE@V*+qxd^U3sN)~cTIT=;sWBhEUBfW^+zvvZ0jY-Y%n^-8C zvzgOVc^rY~1$>Pa34Xf%w=0ZmxmL1CCCzKOc;(icphqdTI50xxmJ4BKxpM32Ta=TS zyyM=4TO96GViE%_;>T%-Nvyy{);A2_O1#G~f8zsmGd01}$is9z7=2LhP;5!Bv9elf}^*@}W z*c=$6ew^8@0Bhse+V`(=SkICsl&CzxBbKq)zY;U9kYR05wel1e(nl?gV{0+za#-{J zInU6Ftd|QWa8dc{Kk0wFWT{ESz7>BtsXQpU20E7^TV3KUoR9nfA3*#T7a8&zd8W`e z`bj|!h4tgy8D|RfyIzS5^9O<&m`6GvIS&g(19M+zEzFPed?bCN3ACShnZ1?-?UtgN z7yhQe85BPA0>F71E*khM^sS+8s1JjFvvVDN~u>^$>?O%LP;VLmA|PeejY3 z>xk#^=bpo1&1L>m&160fKX_(RKx)hhiDKLz$|NIf%0X44tQoIJl<4}Ut@L@#LP(R5cWTGVA|=T$pI;8@{%f^1$R5BlAEda!(Yw6RE!8Tr3m~4|r3w zJaEG68`iyP!WDB~&~nAG*Eh^jF^2kv+*Dv}BrbZ4F?|~WU(K)uJ~HUna$X29GPa#Q zT*UEZme;cD4~{R!N0Iuq+>M2z(aAf{FZyjfF>~Jmq z0+VuKC$Rq@|MEw_2@?&(w$uZ&sPiw&Rcs*tveUW1Mh9HN;g9aa%&iDQxv+D0a0m4t zW<3K^l#}+J&TnA4u8fSO1~TfEt89d^xR?GGvK369R8d;o>$^-@LUxhyoE-3{>Q8aMsWD|$YAEPil961#1U;r=Nzg1{9Jl!s~#-`>`R)rN)BMoi zIm{W&my?}ol6|%J83pDMX?{pY4s%ZP$6rrcfH_Tui6$elA(h&rs3-kcg*56(FFgm4 zz6cjp>M(eBSM)h_cq6qbiYA}6{b5rKy!x~r1L3|y&952^M9hD~Lec2(&yutlIDz?Z zDH!5uh>F!uX;E=3Nv&QLCrC4SCIvWo92bt09K=?}d59 zJfTT~?} z#psDIBa$aMb4W_*covY*9v3cubn!DtB5B?+C0?N|uryhr1f!zr#6;NKCZhj^CpZ(x zUCnF5CX`hFf?MSYB`l_GGNEJ)7SeY$Z`4mH0aR#0NmY9+sB|^oN?^y-V}!S9@Uf=e z5WPU?%o*nq+IqtvV%^uCi6^1nko84HV{@uEoI%6wfeSuVEp*rZ%n(YH!Da=+t@A{J|SU)plK$ zqp0cV{K0nteKp$gXD7fsfQza*_-{;q9IL&$os3RnId#XQ91C*PNwt@F)am}8ITl*9 zSG!>$z2-2MRl=zp3n$iI?enpT+PMD_&H{W+Zq)YbV=6Xauin}b*tiK7)n3x(OS6!Z zu7CN&{YQ~09W<<>J@POB6}f+Tr=I|$==+y1rWK>>U*4`ARzAu7%dhm+po-eh0kDMzkWqVsIf;q=^?!&Qh9*;3>7$aQY6t_ z67wdf5uLG+UJ@Dm4D;J!K}8ZVADu-ICz5^E(+A{qs=Uq+AbCC2k^A+ISlpx=}LA(iJMH7G@ zdXNKL*3{wiM>^pR6iv<2X-zcs5-gdL0LM6g@w4{8RTVB;T+#1F{zfxz0~}*8zw!k# zQH?pKFW<3gEI0o<+$x{nDf#UNUiPoPaE>w7-FXREP~jLl5o~sJ)~tRG6>kAK)jYg@ z4y#E{Cu&eTxIvH0KpRm^}R&T0qDbi{>YgyG|O`fL3~2C6ZKEb!_%BwVjA-NUiM zVu6wBuZLhEJ%PVNQir(joG=nwMjb&8lx86_sv4omI@B z{(4SZVCG(2WL}}4dU@62e3(1Qay90W*ow$J(iN{HMMP}nio7y7-~M2}f{lnga&9cg z2Imo)NzQeKTnXLm{Lgegj8tu%?lP*jz6je<86&!*?Y=7DA*>SG0Pu0RaCpyYpi?$A zMF+__NYSB?xVQXXN|mC~?xieCXD-XqslXAE*LlC-?Cy0g5S%@{&PN4jPp|Vy!P(pE zTqrn^qO%AoI%rHRIMcn(#e#FN*ZGFv9LoASkMKH|v6jp$1m`tg=Ssmj#_OySoY#Au zYXs*FUMF&aZbku%;GBfcV}kPzHd=NHYZ6(^YFcL?Kp{Bqr9`0eQtX|@@X@54Y-I}G zv$o~Z!943+&ZElZGw?Rz0J5%)8F*89WCs3y2PYZEz`xRiO$_sSSST6>{w;*2PKudv z8*<1(%W0Du)472+lxG&Y2m>179u{j4d1`rYc^_*ykJLG|WQ(o|^vfa7q88egdyp)L z=@j3p%|t4sbR(nlg6-Q?>5!HoO9$J1&jLjMXI{uHE9Po9y7#{5$aKixS~C5Euo^D+7c&CY zG@ggl+XJTeITuGkmz>&4)zc|=1ZunOYn9qQzEY;PqMJ|jp4{TU1}X&OwuoD-Aearf zG}Bkz_2(;5`a5rv!EB6S*Bm{DRr`+H+7q{GFdWI>`MWe6!^XDuEq`e-eA4`#C10r) zckCbqb;siG{H5Xq*4>~u;G`ceGESKNkSw1s8s;DNC*#-{?i*)EhWl?{YTzCz|F9ej z=@o!6+!t?!ZL{-<}G+v(ww8W1kPS zoJ?V399%ssG7cth(cmCbzDW!giUtR_1+_Rh$@wO4Y*w*i8K7Y0*z-+Rt9*d$pgtDh zsV6Qnp5&hzeqd3volMiHr(9^Pc_A6Xrj0c}x|gFvo~{g0q?@k1dlT-Krz_t_%7$WR z2Gf;`u#kSbvazeV>mbmfOjrJY%zX<$R8{`}027QgIhdsM%aW4H!phPL!wQ4}Owhpx z*p`nrGb1Zg#>Xa#j;P~x%F5c>-mk5;wydSC`t=gg z>7mMJvO|^C6P4TbCn}##C+=@=Ne_-`!->lB{!!szdaB|7xUiLwB@~vRc$#Kf03nuKKP5{e+NrkxF{@P{OHH*S-TqdC|x=1^apMM z_BDw>tLAX7C|MdUAHcITk8R^zVOg5H6r5%dfnI`vWJ_jQr}F5JoGUy6{ill4fW?#| z>zMc)Df$i;RJCKh7>$CE08})I9Y~jq5+T|s=+*B{5;cFD&F&Im3_amO&Is7}MfPi_ zXxu?Y;MU*3opM|h?i`lBlu#IKtS?{BveuWxtv2=LVGLx)#~ky+AEGbAw`ltE#DGK6 zmyYhZuG-!rHTJq!O%^(!G`dz9%$X&m&v1G0~Ek$P)hgq5ibz&ogrKygI>ti2Vf(#Mlml$McT z7c}>%M<-@i){p-0rE%>Nw)PBT{$Xg#Nzq67-tK3&-13>pkFy{C8JI?^R+-WPqF;xL z;xEz^JbS=;_;CQ(CNlp+g|*C|ut|`4H6LcMhVmQ+vLo}|u>D?3ZXAXD{lu^)?W_B% z(rzz*|ElJykrMmqXOO%N7e&sMM z3I@`924hfF{hjC;j$r=2-$N#DAuyfYqU;t9CVwB)I0FlG^-thTDK4BNj34Rn)be@m zOe0b#v}M}@Y4I*A;!=utTgjC`+-9{ApWg=ZS=UDVwh^q**G8}f6_YM<%jt;rY9scx zfG1*Y1Wnb@lrcNrU1=moi`$UdK;}x^zB*CsTQy9Dr=)ZibHT_?B+a~>UF_0bIdj9L9Pyb)u z(&#^|@8Qxv_+QX}5iX)0D9<%~E$@#g;ozE`?>C>qV`D^-aucV!f+#eb#u3Fp+=9H? zX;J@OuF~8x&b;I+PIDe-1}L&-_1_(|{#(w^=<*`b_1|cbH{g7e7I{}<659HvTI6js z?Aw4z8f?DcJJ7WsE($GG`IhnX4-^~hL>mOD*d={lhB|XpIfrs0h*sd&b|MUJ&T6Zi z5gL4Q$oV^N%8?PSn!9kILn>O>PpVj0=vlb|fBVq7s0O*99^lDy5qaqU@+b3@YBtVTbw zs%_84`OmIxO2_~eYxc44%VWvkKVJTRaTC5jsJONAYROMRbEpg78PR5qCTz5)7-pO5 z2=!V>+l-+pTUKuJ^kZk8jV5QA-u*L9Q|C5{&+X+|@eXOnvRvBTYfxqD+^5k(N&O6f z3Z}3Cx3CN!!!1m}r^eH+GivJ>Ms~oHkQdVu9O2wF_G)o+I5(X>3+MLb554F^eQv6wbaFViAM2wMN8ZJ30viXS zF;7-UMKR`hyUr)+V@lveCkx?Qzkur z>S_Ztle%XV5IO4Y(Xgj;D zpuvKD|Mh^ z66t;5kI$MQbK`ciA3|3jX_!mOqCcqpTF9MU`(?s{eU4;@V|ov%tTRyCC*#*pL1&<& zw`a*!^oM^fDI=jh@s2QU&I9&A6d1F@xi0!bO9FlY%jG2dd6=yZ%p{l|Lbv6Wm{sO1m>l_1L457@3(&8!0Azjag$ecRgC*r6NV~ z3ARm06Py^NayPnXh0!z%|DZb@RdD=Af|ae3zeyJJEPrD~npD}y`lXek1B56p2pD$W~FGbkss zoErI%vzi+B<8sjHs(E^x0}bFbqS20i&{1jVU}}v>$~CY|J)|Mdz})_B`sLVexQ8{ovZbsSH8aP$OaU&0J20juVpvF0w4)Rop8JN1_3Ff38Du1rf@#p2w z!Jij!iQ!Kgvsbh-6-x)nJXsCLZE)nt!|Om&(^`!4ujULftHl`cBEGHEVz8E7Cbbw} z{|OB7K=;@ZS}r@_G?yQ6ibF7uR}aA){s9=G)?(CBQz+D8pcIvd`vBL-PwOi(&;(1d zEh#oDGFG6w9j(YXU8%^(LqFm8A!u2=F9V(8m3oZLJ-{zsk3kPUp`{@S^-*)tWgq%# zY{F8{v7doW$Kb-)#QX{84`9>*>&<_E9aA*+*mqyWnWJQ2qStg@c>!Nl&dOxWG3iP% z6a&fHVp(tg^7~v{coybC%ACXPr#2o(t08`hJ-1*DYrpH3S99zYotNPBOxe4D?Du>M zvfqJ=s2wssQtR~$`>6$i?o4QYDxa3x^&pz&mp?Die1YQ04Up0YW%g)(*?S_*59@r= zKSPXT30;JVXgKLWt<)a*@^?kaP;b=#6OcFq7lFh~zOi1$^Xt_7M0LC|>UYzVf_`Hu zf1y+_<(kjtdB$ze2^5zsD1IFV(o4DV{_U*|BE=uah#aj86((B08(Hm9S52!~ntTL} zlN186hBrzz%LjLv2>LeGidqqL+xxdKI!~2#tcN|*2u3`C%YpDe1)9cm&g1h?B|DnV zlb%)SY<`|hWVAgR->^fZ@!{bAQywv)YXzpF$+cxxcMq_WmesxbBha!G7cSI#{BO}e zXcSPf32n(JYZ-Puqtez>ZPh>MQ4C~9hLg67^gaCkK}(jHP`N9=Gucer=pPhXs_F-J zV1NGsX#FiNngJ2~qaFP68F*)oUv3@A32%m9?tB{Gwu4{J#6WiN%N^T5_&*H4G(3gr z9~i%M>3Wd(#nn?aE^wq*?gEp%xG*L${#g6Zp%kVYTba*sPB@Lg%rMLTC-GGUvn;f* z=J#SCy(Spfq5Qr@)P%$AM_RSWL=BSoZOLkIASe331FF4&6K#196Z^@_a~Fyw*T~FQAW1; zwExLY@Zit5$o|t#zUMj$uZ{CP9mSmHM3G8&ye~!r#Y+lu*&zmgn?w5 zpJY{e*mD!7Ip3Fir1L#DKBmR4|LUT~t~T;LcWP9IwU286l{?v3<$Z3E zwY)#{s7-kvfPw7D`-AmIL*BnCHIes+h8>c;U;mcscOmbywu2MXagpWy(DnyhOQE;1 z2K;=bUIVl^iEBWQM+6P9+E4aR45Zfp<9$shz9VYDQQIFd{$Z{PZCFZtB~ev{gV`VO z>6xnKLABv`+rSBei-Le`faDbHkOn>I&rglx^roa1S~^@&dJ!N;tSkUfVNjr85dBPTB7GOuS+WJPZE@ z`iOhb|95xeBO}gGZOtO|zt{xnpNoqo{j&WZYbg9jX#Y8rQe>YCS;2G>E0{*-U7x&K z+)7TOpx;_B=cnp$-Eu|+3_Rqz9mZLca)dW=cw?V=QIJ09p^Lwgv?N* zvhzIl9F_GE|JsOub;Q34D{e?7`AAU95fxbo*bnz<0+#Pk1Z?`XM|46ya-3!%i*Wu2 zPBtZDaZzN1`6D$RiOJ^eGwfeoKmo2XM|Tg=b2J(ocit;-)T&x6%MXGvj;XsM5ehS)0}kcU*<~c{*z;q z)sJSgo05Y)%cNckkeZg%Tf6}zU4RRx=i#g`-$bFSv1~i|^i0>6)9w*u+iHFJ^($1m zTgH98-wwZ%u{28-vo!aU}6Q8S)4^5aLMpW^U4 zH6Q&%hpH9_6Axx+oS^$(-vTEZaZz;Qko<2L*wn;EU6ZBfgyt7`WIp!}ffH8#w>t*X zbHdpF-o8fU#L@A;;gDvXPX0w@gKhtNmc|2U!&UzR4@Tpn+9Nypz)|;`(wq#krnw8# zr&;d<<^vzaKz3-Jv|6P3kRdPu5!S(yg$=NjSC^~H{#%8 zG6@%z{>TR^`(1hQP^)3_&_uvqdj0}xV*f9C=Y9LdAQ#@-=$6WyIQ3ofAa3ytsbi;k zatPWDcR_c$wl8xYyVTpE9vEb@)Ab2DBH!uSzHIcd?98As@~TgA1Z70YY8g?|%isa_ z#+1ZkF)nM1XW@%9G}LW#rQ3TjBVn5>@2JwL1!pPP=Gqax%@r+SLc`p?(#VWt99RuD z2#vsnZLatJ0IuM!M>vOMZJAEXhPKeMp*mJJ#P_(;-SFnj5~a zO;ySx9k1VXnyR~q*Z=t%q~uv#6e(eNL9H)iyVaAGs%3-o3?HWO*O-?V4zT9s$i)IL zt@=0YxzHXjOa3YH@_`u4){fl=>gIHoctJ*qRox_swSQ>D1b=OmvU{vr<52s5RSwzf z-;i*+N_S}IMQcF!{A zG|X5@nO1yvko5milY7vA&8wjQDqIx0E03VRG=w^@z00mlrOs>F_|!$8dRD%(XtQT! zcu;=w^u$@0Ui$rvi?cqgxX_cF=t(~IN6);G$)0ZUc+5}6CaNL$qbnXulb7YEF8fpJ z(jlo!$ERXcj7Ud$r)oak?ikK0po7iFV7F)eN(YPgBzrJO8NQ!{$02mE0{n3-9!DlG z8}O)&%%LZJ4^1C0Zy?0)WB=e!+Wsf( zMlsp~h25C=Pu{zQJ#3QK>FMUhmbGT~YhJ=1*v2;KJ=7e#EaPxGc;9+&dK_8vG21|i zLf>W_G2ah|f=hK7TLNEp${Y8RrIBpoUR|JuZrqzSsAMGh?S)gCfWq)w_I%?&*@Gr<@6;d&W}WX_PXLKx=wi(Gc6^Rd~m5=A%rZD zR35!9N;mu#HmJFRIWDPI*=;HN^K8^ha#OAJH?-P{#m+_b_TzPxP1uhG``%2CJ0Gaz z)-%=I`oAc=HMTD!&$YHM)6pJPjY=qvHQR~R1q0c!FSk7-+Lz53F(#GGcVfll*7;5> zF}Kb$>DbPsB>4tfWYV9Vui2eWqS~Dihw<}1GC;FO10Cdymtc?5a8c}#@(BJ1TBFw2 zk=3$u9$p;9$HrN$`!YE1l^Qc4nnb ze*Eifd;B;9+hw&Z;}PV?)Qe2`(FZfr5{(DLkA2HjEd@V*dmjAw85e;cYJSC{zV=57 zH;t*k6sM+(RfSqki)+KPw+qx)>#Yo`@~^-^dTlVSaeL+ok@_r?ubf9{aJ~^X#T%b* zgtq(b*mS-5>)#9t^Ittnq_>SyhYQE4WJYpj_`f9v|?;6hWHpUS6YD)X1m5@>E!zx+WTdo;i75s~JHS--rh%7oel zn2jdw2dZD5qtO}l%Nc(MozKLD)0xTl!RBv!E&$n#QR)k)b17F=jx^iO*DJR9ImKD- z+$w*29R`x6+;UBI>qDI4NAtYvo|v>!FL2Z6Dj>C;zb&X#O+E6r&pibWJcSG80HeRP zd_M;`Y+_R`Kh4^vjIXdM-#?|P)V9Qx;~qSM^1b5ECh~m)W@BHz_n=dcTsi>x9`+=t zn~#es-wRro!<%U(Q>YYF&ad$e%##g6P)&FZDrvhzCDv%_m@*x@xB+2J*a4zFR2IwrD49XPyZ7dyPB zksV&MTk_)Y8U%(Ftm0}mE5IV`{2ClpQ-!%BPHe;J=d4~(4i&4&-4vr5E8$tat(CA~ zx}bz#Dz4t3K=AWZRk5&C!u$tBB`k@fp<)$wn=0o!;*c78Yz@l>#vD>Z&kzc+_m9va zHN58sPFqrf%_@tYA6d6)x_##-if(%r-UYJ!PjA9Us!mn~y9)K+k3q0+#)S*Ed}a1y zw6SnQ9MK;J;)wn*5J&WffjFW+48#%rVYV^hZeYR)>lnBbIvgGpChs#!^-D~cWjTMBRy?PHn}KOb;??XsC5q_IVN zuczLkY5KsC?GNRg2MpO-t*-?!klvyhua)k-OSEW5VSOhXGgj7jR=%&ADtqf|KYpj0 zLukVX4}k0qxahS(wnyod{w!4<-CY1#aN3f)73jvRwB&9huT$7+%!Q&JdM-rA7gKK( zxL_4uBw!#t7mVwnZdxI7;po(dygo(q8OOb+GQxIz5k5%;3WzU;-Va{n;X-+FkpAGZ z86cmr4SFxd+6Mh_1E)O8VXN|QV1t4f$c_!#dxvO)j=*`D(*W;ci`lYP>Q19AqI%y>OoDS-9Qq))`m%>?NpVR2!yfe#bb^KY-M0LHwKojr8KzdCy z_Bp=P$4?j^jlQu(3!qPDk-uSAgQ> zxM&myy-~k$!(g=^ZlHCbSvzg1*d6rm3VYi?G6x!9hZE@&RGhE}Zzp|_=D5*)IWbh= zY>PO8l?~MqTE~H6Q@j=S zsO7~eo+Y2+-H|0^(4Dj%ra)9G{tIe1;e9eW1KooY%aOKhBRla)D9%P_u#$w6vQgM0cR>#qxbRt8_MtK( zQ7Uc=7C5C+XRypw?g%Fh#K)yEuCid6o8({vlCFMc0_$1q!p~_3rZRmV9OFunHbQC% zX(ObT;4F|@+Kto_Fn$wqOT5yh8TlpHTS6;c`YRZJplWa52j(@gw^NR_wzo^i3HJ6O ze#?bukblyY9>_dSnRsrAV@mo3B@WUX1KF{+OBRXtb^}I?$<}N#&K+$Fc{d5UBc3VR zq&dd^7MY^jYcxB2V!djIiw^a-ePlup)js!kkeubP7K3rotVMJ@28Zes+2{=OE@2wbhsI=^~1jlv8^m|J|`50`K z=QW2fa=|Flb&yeRqA>|mQ*#q?RA%~nC?DWeu6JqNKveeXGH~NXTtsd};}Z*i`6R%z z2@f(cKP!JZ_D=#27Ag8-fGxjIw8w+81tJd)x1M6oJ4RvIb(o6=7Hzo7yESqHoa6;T z?kjN7lbgrGDn7Bmg99iaH^zgTj=W;G;T{?_2_sZ^K0-IrASW3jT(Ci|5tspupMKu1s=T%k-i$Ri@4R8}`N^ zc5KR$d7?ZYPJhFPhnOJ0m2jz=I9qOo?lMu_3Vr)xP<19QoT`@eoKJzVF+EfG@2iy% z(U^K*sSSGWh_^@2ODaWrK1nSO>aB1Fjd1>tz8mlv+KvErvgSGT%(-LP@jGz{)t1HO z&@R7`>COxsh=)$Uqk_flq^i)!TAxEFsak7GN!kXT3wdaD=?TEuYBQig-Dii{<;6>N!ZC0k;;gxPRls)97XbIRYpA3pHr@yRH;6Lf%JN3Tp{MU zU6hkTwrs3lWzd$5g(735DH?;-;rUI!9EbYAz@jn~!KNaym7V$q6@!ucuuZ;Lt zMEuJm{-qKBBCPT%tvTy(n~INg@2-kN9`-*~ zK^*$y5+x2?9u9VWrY8mU#@OhEPCYj@KO@(FjS#qLwLWtl2GVoWI9IlHrpV2svp&-k zlU5MYO>0$V*^n{c>vU)ds9`t3S9+q8hiZH zf8(4m+jB5vIOoIx*K0ohRpo@``hAXHwC4AzdZm~{#9{jVfNG=^y&q6EyEQdNfx(rS zj%s$XRrdfr?GgF;$YPBFSg+|@2?q4RMWMGE4_L%seJH3mru15ze~uZMVyng?fzoO` zU=V-Zih=Zg(>S;P(F~E&E2&L9lzR4Lny}|BeBPO91f{;{zG!>}1saom@Bg49 z+S~W;nGQaR``&+MN<;Ye^JcpJya@(?rJi=P24;w8nyIYZXo!}3 zqsxbK&1BeO0o5auDzp!NQZ-X9gfzw$mrWDB5v#;uRgmozShN9;gI01MfgQ>=lasXA z$8CWa?k?02!`CmXPKZ{21G(S_j7Ps+Q%O|Eo;w>~n>!4*Bu!C+0#xBtn!uyz#54&y4lgarr z*nFi;Lx%=t#doRe0kF`p%IWH!*S^Z0*M3TD&|k$cn*oJQ^mqIZ z*77yaE65kESTNJy6ETn-`Kp{M%GbY`Ii?Y*5F7B7fSA~TuLSVefJXv5HS^ogLa*P* z)8ww}i>llWjfn*8{IHK?Xe;6U9OSYJ$YUlhf;XHDO@*3J#{!CTtq#ZZROd5 zf9G=E91vg5!9aS{W1KDcvYhjV?`b^(_|ox`5x)HPdv;$G_n;Ed9=@Ec5gqt)({vDh z11=ysv#+4H*q=vEfl>!RwiTOWlZlwg0kBEs5D;09P1u6C2{!3UN3@4cX50vBi`e7| zs$Q%wPHRFPM;T<(>T>jmgHXiL9P~Hi{M_e7#BqV}tIeAKMD#%L1s@so ziJHZu`#)|2@$+%v63^(b`Zt>kqVj?AH_3L;}d$ zdMn8L4KA`l0eu&=(wIiekG3;(-@(v5a-u-@%b8zT!O;CmhVJiY=>8#w?jK|59yw8< zd*nnj(VLg$M^~}@DB=U;N7u6aDB^=679aRnPINTOiH>DCQRGMAgODGE4?=#lk?pU6 z3qpRh3Hxi5tqc`3CF-3GAz&q^b7diDBYD8TCPMIWi(Uw{lm<6+`z{xR;C;mj83@4& z45SwV3eNXvhU!dk!oBI^PN!V8yT6E zOy14nV5c2Tw@!On1v_Jp#5{cD3e8kyqyFJ0uzxTv0{c~e>_*EW8|OKmn{R3s>b}vN zg&6#EsbCi93KGMn24-On2GW}a6Z~_nXcmsh{+RJN4%kqazxrCxWt$-AWsUj(K^txa z_20rpr2awFJG=^5Y+{fL`Q%LVZBqsbl()*aMZSurys<&PVWLR+Bav?#bDfc6zLm~L zb<8&MZQC`HBj4tm0+J8IMIgBy{6m4d3I1uemht_U2$ZG<-%Q5u#Xxps{P*!9r4Mue z{KWAl(w)R_ONRId0zh-Rt7$XlbOjgneZrsc_y#-#)v#x=ukU&${M0{ z@a!z{p}!{ajsxGYG_Q8>q&22Ag4H$BY-i3z2%XtVt`{r%W{{-~X-qUnR??W+NMm+J zxA<%mT72Gokv^zcOM{BlLH}wWdF2rrRCLHKKH+hqCb!yna%=H@6Fi00zJF@jA9$P{ zlOP*gaM2Wy$w!Kkzl^Sbxx!TQCgGfQG4jx`0SBFn2CAB8QU8KL^jc?Z-h0HorZaI7^v#T(^C=QHwqz;%_f37qzyUVsx#J6a z^t|LxM~a@6_nOc%4^yG4&a)Jj^jrtbr5&x1@n_KUOk7lYN;{=uS2&(#1j%Pkhr<`T z(n<0VbWg5)ABmr4iz^`)0|`ldII>Q?X-}cBL=872sDRXN)v3pPb77L!I9vO@}x? zcPaUFg8liqE>r2pyM4&=iChopsY$6+OT)C;&QNFy6^v|m(7Q6^T@frsBg++?14|sJ z@sLT4fCoted7}aPSgruu?4>P59OeD#?gVlLW{MCG75U>@Lo;0Agj5h2 ziL7vbI{g$ra}4$wU{}C#Qe0^yIhdc0Kf_+$D|6g(ywQ^iaWZ}~Ym?{R8eil+`FEw_ z)xx_gw0E(e0)E?1Fj=~ZLz?MaP``;j*^b{OXMOP--L{b=6=QJEBC3G+foxZ#VOb-S zUl(!WBZ_{|PgR@@g{-DjVL#$|4YL@TEZ=8nR?5;x8!$>KDGjK4eJ@^sUOP+u$C63> z<(6xqwGea%8HE=@6MUf=eM`yd>`hm7jsK>=?UUjwlft?1kw_Vlzt4}ym}lXAsUQ!+ z7%s@e>kjN+NcHrtqEDfB(heWF_jWw3um0KpeU$zdw+(ogJTVRfFu5fex5PVqq!=Um zNCB>@Aj?mrTK$R$^Unj>dPcjDw*oc;ibI&+i|=Vj<0~0JW$DVEhQ3Oy-%pM8BNPrB z$NDQjrgU?wRZf~e=du3ke%$}CSfA#$%~mpoVIVuP{;Q+758|;tHonBh`VGdh{;rT0 ztICZC-Lb6bBgn2Q?xU|oWdCD^7TFiv3$^EGD&@yS_6Ph`AGyJ;rg8c@$egR;u_|z( zEM)xZrQj)x`t2DM>l*XI)o9I&zPJ^&ld2j&8suHxMrU3-yf|y5$cuX@cUjVO)RrrTR#dcaC2-p3P~D)gg2IIst>&!LMQ8k-}S{^Gxv8t`FG#*uh&vFBI|Cn`1%M z*Kpxf1w9wERzU)^6eQxtWVTT`CFouHKhKvdrJU1PDQ5+XL9tviTQ+j7 z5!IdB*Ft0AL{bAz(QbZR5u{8eNP`tY%2owwXMa;cn*5%%AT2&a5G1+>%uJ9@!9aEd zsk%rMqz^D+3}<*|JVuasW;|AqxOn_i6OX|b;_+I#CLYJ$p^C?t!=8kXys0sLFzSCs zgXw*7QJ60HQ<`{E8q6xGCuM(pE9rASNRA%x9q4fC?-_l3%$f$yuvt#T6G%M4+ye;K z`bu!_3e69F&D3nG{^_eIvn^yKv$9m#W|!!}aP1&c#%WvmEE`;A~L5u4aHa z8-`<1Pwm-dm9PB@hmGq!uko5h@let89%jC_$;|ndVK!Q_<3Rb^&A+Su7x~((5|H*{ zTvY!XX!S9V+j>y>TBYW6AkWkyG{{tIPN{KYHK&SkBcvS|(yZom>AN7Vb<0hHfi|L5=>N*}Q0LR3-j>m27$eL4HZTf_0>JCu*QQsT(PN+5&(zM3~ zp+;)8DJ)>r%y^nMrW%%~X=AHlTaiCbQr#XbV8#f@!%}9# zCZzI}8n$%Bm-SVB*)hQ2CZOnVTdjTB8>e!eWRV|>4NO2$2?ny`%hq{CUq(-Dig6=6 z28;1!Jo4k7>pvPh(=9w#=P8=!@-0z4SMEXnB+h4Wsa#5Tkm_P^sR|dxPbrVgUs>D7 zIekG;WBb^3i?w|`4|ikBKEAVA<%Q**h;#Ffpnc44HmSV01hcVkA8*ts4f}X<5h&dQ z7eOE9QvAm^JBmq>6%7BaWJ_E3v!$(v*wWTxY-#H$wzTyuTiSYo)kmyi#XPH7G0$37 z%(I>q^8iN{G8|dN7RP*SaSX*g4Xj!2F4im;3OJD^U{K5h-J7D+SxjYh7So`CtbnIN z&AkMGuuZt0iZj${?nUv6(XnXe$pY86Q8R0@uW?5>n(M~kOFSZ}zak!Nf&HPxL)RTotl^xT3kPd3`c_*=awJ9Bxu1~F1A ztvCaUI!Y7ukqb4mJPqd`422lpiHoA>@*~stJS`p(|m)C9vVxnke&XD?4V?aKqM8}8LY}q0pPcZ_1^ssmmRYjoz7G)JIs1Np~#LwuIL^N zq_^J2H9EgtAzE)5B*$dXYNBNa?1Jp@Q+J|dhfBn3nnYyE#@whn=X~6Zvd=BBKsDwg z4{ruOw5d^TdnWe36@b-G;X+x=`5TjeJuquoUKTd0znYmH$TG7={Jnv~USp5Yxxv~t z^y(?t2DX#k#5TN&f%J&k*fyMexo8`9s{9pHE{4C{HeiPjBpcpYv<8kDzqe$C0 zoz;Z1&Z*xp(|yN@g6^{}C??45uNcUV?nkmj-9MV=!+TRSO@E+L)%5HbP3K*Hg+f!v zNC%87>+;)svl_&vImpgjaD5vt3hz|?P7&i-MtQ7Lc{|7s3Vn_Ba#D@8UM}jc>ZN)9 zxHkr|qmxT66?O8k>K|~9tYJaj%D375*vTJv>7~Z6wEkfTs5%oDPE}?vXKVhjO-LTE z_@Cf2CC@j7<@u&6vC%YH!&=E6+>eQd&3j9)VOqX|CyXEICTQ4Z3-5Xn2GVPoal-iF zOi{y5F-jP7z!MW2abzZ%-l!dy7IoFI*+>lfUekc-hKd^Ele(`G@~!Dk~$`Tg%FHk02|S=O1Dq zJF;@y#iFcG>5E|j_tY`6!jYILD_jEJ)+E64{6n-MQFbDB&Qc{{#9{orkIZnYd>x4M z4=)E_({NGvsyrSle}TlJIc#*kDCN zBc6Je#Z!ps5l^jR@%?HR->+ryJ!1O7tl%}9#q@bBrbm2_xD4@q18ZgkY9YP{dL7H+ zvTImeHc^So5aJ^)o1$Q|sVX*msfVdG$Xlzo23kzdJ;$Wu1Zz;QNQ*&S_S@^Kw8%TV zjpMTGE)=anPc^28L@0YFRv5=+w8AI`Guv?@-{dMpEI#Q=nk=fs6i|cx+7dasQ#h%0KuA|ioUN| z%SK@rK{l-Vhkmifo@^BK7iD7uvm{abYBm|m#^Ll2UEtC<{=sc3$BSY(Zu7U%KUA|I z{T(DO6MXEvL~lWk8b3FjV9L+2tF8GtJIN+LJs3#u`Hgjb)_MO6e!iTj@$;BzM}nUt zbo{*FV(_ycE}}1)^4kf!A zjT`=S43`du8#XGQzyLSweOZ+b%bfmI{Y2c*U5z0Gx6N&=fD1WpSQ&#G?6?7nEmru* zNX-vSqJBWZ7F*sl2{}*0{b;KKGdOy*F-hjGL~LPilH_sC3rxcPuK|#@w{Q`qP4)+w zG4TUng3cfCn89BEh#=syi6=O9mELk_vcXZp_Z3KyBZII{fP>^9}!_!q7DH!sd6|4zg}ddqK| zAE@m6hx6|ZhsM9I<%i9`3?2V2>ks~A;-cf?#qd8c zKk)xrhW~;2v6xcB@c%}J|B(Oy{s-m<{)aLH{{!3s|2H!H4{!(k-vs=xV19%E!2A;x z%s)xR{BHusnrO4{1-&#xWBzFoFt6(}CtHiDQ7pXy=1;;vdTB7m0k@thO2ctRnE!rb zT=!7Od;dXVevbChCsRTD6D`nw_5R=0m70%lP=#h%4E8&M^YfAUnuVW;^FPjoZ0*KH zkuCbj?8Cqqybm#eXh94Ps-FHOAY2n!$oq%2EKK@ckOixH`rn?jCkxl5i?VR^>*=5D z)HwXh^(u!Csh+;4W)o0Pe|A6cEghF5&aVg%tO>tXK5Nad)xX)~*DwrZM|WR6{g36> zkH2dCDwuR6`8DSp@T&qBm0weg@%quV-wH+_%P{&i3Pzu(V)Qr)w2gCn_x+u7-wdO_ zwvTh4VRVX`%qlR7F_6rCON_oIjdP#(ii$VF=-e{KV03P|?Ze-8mfOExGuzitvyGAq z+Bo`_U*X$(MxS-L^l3&7c`fMX7+`*+X67UFG=qH&`v3NYAZ6e}1xfyg+3Wr>c%0g6 zj=^o#zfmAX<@%_qN?@> zU;ox!v(dEv?M$$$3KxY>%Ht8@*BA<%jrsNM6W07X7I&9cUs2ID90%c?F zw?3xlel*5*w+q~VL$TBb82d>Kr02dd#y;+3k^2#h7=vLSGsf6Yg}jg1#@HNP-=dl6 zu@>n1tRFRBe)~15kdz;tnfb^p%}kGVkl^W%rA4?<8DjF&FA7f|Onu8u6bKvh+VQA0 zuhV`Icx_eR^7s zHtZ*0J`-!9wD!o&w6T}k&xIBr5!#trDL!f?+ktw``nml1VGz~2pUeC<&{N;fg*7KK z*(H!nN3_?^#orSni~U?`m|{k?Ofl-`(uVuNrWkAp_)=50v;*~RS%b6H#SHwzgG|3BYW5jS1S{Lw z){rA_pA`)4V;Fk0f}zK%82Von2penb$OrY>8jYi-{}*3XvL7@)HQN){1q10VvoVgk z?L-WSULAY~`94_ybiHu7Wfo|U^l~FoNX#g6EgP6l7b;-c{7F!+%}fvqt=KK!dSKYsq! zCO<+L$PPb#>h_25<8sVfsWiHK)FJU>tEMO5$GaziADeK|@#7jTUjglaeeGcO6_^+J zcQwPmz`Ve}z`Ve}z`Ve}z`Ve}z`Xq#<^}$3VEA_z%Qpk_0{;T@0{;T@7Alw*5Ez)( zr(oXED(1b80$1bgL*@>T+ zWsPc-`fN1jg?ZbJU;*|urUpEAeU4UzKZ|^=rj_%$0y9ChNSXwu?ykVkt$TKYmJ~?J&iSNEC{Q)#Z7+UD zrh9(|e!m(fEK9iF)<`A5Op}n*K4=-v^adbgP%DTS-9MCYJM|yY-ecI-Xqr6{kO2 zv#~l4Y7_?2TTbJ6@=Z6VKSwP`=RBw+Oj_9|bM@1L?VGj6uIU zR^;Y)Oq-%`3Aafx81w~ZldLf)N1s8>N)}mQmlJSrim#kpq%!^580>O56Y`OhHO(w? zkjfJv8?$jyEF_bUG-@9y##Guh0A*6xsqj)eAM9p8W)sU8e<$aqSx)}+e{)_kueVg; zrGeL5cZbSL%bfgaT{thf*JBmhx}N6TEGk`)aB#VHY;&U4wIPMF2*)%Nj3ddQ{;#+w)R*3>A}N53_|q^|ktRYpf&GOKNEPzn%9`@0euMr+2LJJr^q|n zN0FcI&_?%McR>2UI1L@Pa&$<1#G{!()(}oXhe_v~sNt#n&SW*T(NO$cO$X7ICUP9L zf4FEm$ms1e#wUlae+ni+NC!+}aDMF5UxQ-CvH7J-Iro%Zn$ei#PoHw`F@#BT&Ssco zFB;9-!6aA3bMA43`6bi5C``h|JqD9-%`?L!9F07vsh!pNv5P*@&`4vhibjsy`LO{_ z?edWS>H{*1{(s-S<+yr}ba_B4ZD##VFQV!h^RyyI5$k&ij=7zVNGS9B2u z(rccv4}93cdB-uxVfHJ^zR*PNo~ahC;eq-UAzPvtIP~L?T%hz~Tm<_5k>{0UQ3!9W zX$_0?nx^?UUQOHf5$6`uv}Y|eZ3za_YnpK^_x*kxaHnRVKV_O0wXb4rw2wo!0(p}4 zN9eqgQ*cX4q<34ks%B$jRss)U9zJrbreoRY|CI>NFULjHF{WQBqJA+n!uL<#`6UQ$ ztXb&+y=G~=;+mEBA?Fn|%Y6Uz7YkKBS?03}e&>ARS|y))xg#MAQ=oaWVmP*ToLO3e zere!R?EC z9XV8_39Gd}@`C2BSc5}A61L-Upk$J;lBz`8D0eutF%72Bv91#>{m_zIv7hMgH7o(V z&c{WtpGUiYOcDk6#y0bz`PMdb{d=6#%w|5JaN3}rViX3lV>92}C)&(Ewtvj`J2h*W zo26RI!|or`Q{yoD$J`hP4o|{`a+ul2>==E94nv=z!_a5wF!UKh41IS*&VJ={ zcbn>P9S#r|R}G?d_}>kJ4y*go4Rm-82C}2WU;ZNMFx}J2Q%{2O)G%)tqr-Ohqsvu` zYjJXEY}Mj>b4A4+aTvetBRw>RVl(>vkvN?HjEln0!Hl1<%&^ZL%szvM;3s$peu9VK zC&KoF+An$?0JDjXcHC~Qqp3Rt9ktpo`Vt1RqoX~47Ikz3<75=B*<_4s4rjk;$#zXU zpT0!Z&Y~DBWAnFtq_@UK>=)hnJJ`4l7jAj^mFZ_@jDAM*lj)?*^MW5}H09)Zf6;SN z(@Bm{hrcUu(rUlgS978{X`G)fZWlTEhwS%SwoQxtKEFt1YigW7yXObdnyyoI5Y|*#?QDqFLB0kH5Q5uBv`$x98+_zr4Fa(P5&(hNL75jU zG=V@%XNi_n-qB&>chz$leB?xpYuM3I_A9tH5*OJY_K(pw$}g^C_UgGW`oL7jw#>BF zv2W27O07e(st;a(f%MkWSjYCXi8^+a>$&@3_R1O?<)aFfQf2hqmQ&}d|?G%Fmf!; zD|*Pp$UQk-dXEfzpvB- zn6H0P=xeM49k*EPKq~HodUS@p7AcfB@Dnd#AUitHbC0M4%=0i)B(8tK8wg8aAupD{ zqR&H;S0uY^F!Bw3_)Xbg`g-C?Rkg76<=hK`N7`Zt4td9Uef?9^^X6hsLX^6YXJ|Jb z?VLdzO{N|?CdJ`!v*XJ9`^aw?96iC*cU1d^@yBTA*#%l%SZ#~_m3`&?Nj-*;+UUV^ z{x;>Tx&Qt9n7NV&&5e2`r(W>mlQV&=g;M)n;-f&phi6XZ`(F$D8A@f zw95g`#zlOt3v2WfUb|G^zZLW;mG(-*`;~=oF5%{i6QyohJ8-6*a-duRo08lTwtp%4 z>3c?n3FGCquAv+~Mc82J@<7{#f%w^a-F+?UZr{gI6U3-oqi2gEA|Ql^Ud4oME@OC9V2B|1rT~gIf}US2_c; zoeqCOa8!1=%SX=QcN3c6LVGfYV@U!c2zDl8A!;w_p^QFfOA>xD4xcEMkKZGG`7c*h z{^+Qz zlDE6dv-jtOCb%;TCi#0zX6Kodjv@<@sA4fDJROEI5IB|5FL&@-LhRSz<(7^}NdbqHv=7;u3nIUmt0Bp^wo12GZ~%PL~{Kq5l{v zR?cvK5$@X|-O-6_=&eRvO@&9=&d&e*8RuD6be-Y=!Ai-C-!U!e zP<~1{aV|#jh4Y>CekO6{?dk7p;1CPzCoZa>Hw7*%F) z1D=+WcUxoz>)9d8<0?(xOANIg7O60>Bf_~8*cV^nk-|_+O#mf!=TzUNJLvspYzlnY zxnQ3IESug#@^uDk`()GwYB~cQy**3V+Gbsek6eOTX*8qkTwH@M(|x%cw&Q)^v5!21s;5!pIX76IpW-9;<43R9Lj2+`QU_98{&oug%#=0u3l=)qPD_mAt#Na$KI38}I>0Sv*;Ym+{20=+g?HRNRakznHw309o>rLlTKr9EAJ8*IXoE z4T?!NC!4!w<_&B0Z6=WTE{Q?Dc^5 zto`9<9Iee*8mM*dnGH;!@OSOl7=8y@-6}^qA-r^VDb5#YH?H5-#AtNjZd5TZ$w!?g;4S%m*4NS`2&rp)M_i$q?gt! zFq1@YBr-D@S{`YjKgwkEx&PxgHktisvhKE+vAF_oP-BDN3$!MemZy-R^p#?lgoxh_ z4wMG{ot|!qGRO(jQ>mfk&a{1bj^IpJ5C$YanN;Ivz!#wCBt|ZmqXcM<@_)*D2xO?Z zji7IDWQzMO{DIUHd0uW)q~0}tU&U+kS?11C^3s2}r>KvyCsG$~c!Ag$;^Xu>_X^ct z81P%?ueM8x)UU$5(jjz&p|+QgcfB?qsAGgcg4eeND&0^H>KkNn@}C2aFpp#UBWewc z6kG*@mQL~g%3Mh*btS@N)X#;A;dWY?b19)vTazC3BWv3+#s+?cu?fs`I}lglIKwn} zCh|Po8Q0qcGNBvQ+h!j*frlvkJ1Q^e6Mp|si}ycJkUznEO8ap0p<)7A0n?f9q@-1V z0X<3FpI0?6+2OxDFyHM6mAPTHDo&E(MwSC_Q^c)uVb2240@f$T?JIZS-#9=@g+nb< zq)JjA7rK)oRC4Y-px=2e__>sd{6I&f!X3^}p)hHE}hfiEHWND@Cgpv^t7Nm90R!rv0j^yUV;_OPzA~Y|&VPXc<5EHe zDZT+eZz~+2zWESZp545Lq)kX%!%9QzGIjZ_;doGkUKac88G%V z9=rj^_T)HL{#ygG%;%QiD0ujA$6M6Ev`oOb2^A->(cQSl`#+(d@_&Lv7&((q<-(dM zab>i6=L=4&WP1AHItr))9dW@CPEX!mnaP>xy91Si?}^aS8lCLM0{@Mx=!J`?dNIBu z-AOGt?rAP_)~n)L?op1X5Ae^!DBT=&Jbe<1OhBSiQY{ZTKhIH-1&M&vPyijQ+=z7D z8&s5JLn>_|kc(36n(G6bAH>zvHUYCZnOR}jyFX)q20HZ$7* zA!Q&MP&8daYy^b;UPa0ZoV_a5Av@AFtFB_Q)BvV^2Qwk5o{iqNU>O{+3FjlwyHdBOA+y`_E*lsDa9y{CTDI1(V`PAzla-K!VqzHUtt3sSJ&9!brvy z8rw*g8KBvy#rUR=RN<;pUG_I3{rYSECd%F+u0t>c6_p(>)+Ut5=10#wuN&DFAVx2g zxCzB#Eb+q}z%8GGaQ;mYMoK*IZhXiQ8k-!>=3!E{lbSUA#U30qZ4?~W2r&bj@|_TH zXwwKt&jFF( znBBqRT~ane=0*^(tF%Sxzzg^b86QX~2*q@k(GihGGyDr&;|WqYSPaTGQ{C~lB0uFS zufVhu$nl@VIm#=fwsHqxV*|OQPrM_XNbMQ~8=#TVmD@jri&WCc+TY^v=0KVNdu2bk z<82OX>{XvX2^eznUK-OBES(z6pGIdY74I$$-c}?HEhH6i z7u?5pWrWR9j3nlr9FrOICxdW2r=?51jCT!F`C;U{x_rz`NS&7EqIlF(eP2VI9REO` zM@i#oKwgFe_ac!iX8lDfb*-h(q^=n|Yk!TGe%<+fMmVcsX42dA)t01$U$cJm4EYUa zC#&|~@e6)sIjR$+t2zU9eKNL&a%hff*7?%bktO7>jmS?iC{8^G&q>Mwco~3qZ@dLq zNW&H~y%<%M+gEm~kr-Dw%nuO-jsx9Cv3^`=mJ<@D8BdDa#!r9g!1LZW~I)dUl|)!%;C|(&POwMalK}T)dgJfZF$Y=T4!2kmJF5 z7_Y!(^e=i~d(*W;9i$5k8-M>vPy!^N@Rqp^i=@X><^hB zZy?>C*H0YtRpT+Lz*yUIm6G20I7Ua7H##H+C6NYGqA?|YXcPG@-@FjI?v=XYd&x4K z(H0GuWD9!7(t{#3mGQ0C>&QOZh(^Qclt0=STprKO5%5bdl{>ol8lWvj79hnQ!bg*O zZ!1n(LdFu@pniG*n1t8jLS7f{u*pYOGw|zzU5u}q=XdyTq^~l>w+!z{i3piM%7{N1 z>J;&%uMLqMsHBdN^>>8 zR3hdhr@_Qxy$^|B&!T1;+{Z;Gx|lo)`4vub6-tf*nmt0%kov z$rCWYzt4Z&sX23yIh5lJ$FbZExdmTSagxFT{653OPWcB&AwGp$mjST5l)Q>@HCf}I z$Am)pP9Ogc_1=I1ff^@L>!~t`=JSdXPp*INl2CCwiG%5ylE*R;*ky1UZ~nyPVWK7v z2Kj@%QX-JjapW;{)Y(R=u$N29r@$je8lEbyE1aNTSD1B~MAsDl^B%QPG^U`pg>aQV z3+JcO2YORVFrwoxwJEFQBUKgBvByBIdru*5M0pYOSM_xh*H@(TZ^dtFG*muI9~nLU zF4+GCh)3a`Zmj(}e!+g`bIuRt_sOcCS>_{`;rk3}LQRW9Ieh|6O~Jy>U=k2VLVd8n z#g}(sC{HRS-SF995?H8zb3hIIxTJlYtk{k<_)qe61_$$@>uspPDs~0Ob>hELDK3~0 z&ZWlB5zgfZEte;$YztD)lDvW&VAB3aa$b<{@U%Sa#G4SbR`!wKh9N=Add z$moUKZv}^8y3z(2gwkLtABszv=eA;AAI7{hcT(oDxiIGO>Bzb64di(J&2ai6et$`m zCnRGH^G67B;tQe@83+PImFI2pZw16$;eHG8O8o)wo432BU(l)a~A0|L%WU`cj zN(@@%a^#vo1;7{d@8%GJoWqd2JLKI)jZtVgAbSX-%hs$F$*SPEHkw%Ww$i){tT+X8 z5v0QXZObVBW$PF_fb55xu1}3=Kp59gDsGhOGPY<-Y{}9{afxkKTFFTA$qpuz%Qgs- zE+?^oSL*VZT!25AUnz7vkt{$gTS}Jkh!(zwn(@FKmfcbTLxWkf=82xO4H zHn(jLEtrz09UMo)Z!H@m8AC*PT?C&Cj>F?0qnSrYng3=K=?tg|>~nfn)?~*p zdjr~7DgS@sW!# z1VM|%2wtJ*=_vT%u`HGTG5nUP#uCZrDiFlqM=F^ON$w%Vmq=T5saT31IKmNbMFkbq zel>R>NgSAy;zBV3kaeXiI5*urJznY(8ki$}i1V>=pAFKMtPd-4R!j~Iy0juGP#d4M z-T!0O&WiIxIs0MG`c4jHo)?<7-|x=)(0|J0z~$%pd$x3!>had`^sS060TQ3p;Qvvo z&Dd0*m+p2%D$?CM_k~8Mrv!`AQ>7ijyz~_E-*cJ#2r!)4*Isf+LZN-JJ2(#b*WU#T zpq|C=gR5oIhG22$8|M$Z@#eP|zSVTXFaMT)KzJu@_~jdz*D>uXUzj@-tK}i6JXEVy4NIZmBw{;ZwQWQlRnJYdGfe6 z&kLW#?QBWd*_}N-<;FV4mcM1ywwwaHpFy{o{}A-MC4a}-ccDzffBCZZ+k|CxHBIrM zUdi#Fp0l;8w*OKDtAX$1{GS1kNaNf=e+S^rl1m}E)7c#@IUi3a$lw2u`h9nD{N{5$ zuG-Ll>8a8u)t~x5mkSm)NF~k^RCsyo;y6~}{EYZhBmNX%vt3EXB@-uSM`k*)x>z%VayxZV zO+|mHtT3yrNIzVmI9%RHa)B_MRF;}m)=U5SRPpmEBMEGw`twp*dRAFq{pZug&!>$f zaFy!kLwV`0F#d0&9tnS>;E!aAe0DL zvHBkyE&iBqB=!qxKPHv+&ng?J|9pS(^ZiDWfx6ER&MM2+e}1s|`OJ}oI#z}DuI^q( zCjNgN|9^x37lD5QzhUn$6YYJ9k-rDPL4BH+09*y{MfqiMTh*N79sX`oQdUm#^kZk; zf@FABPRfkQ3vPFYZ|jv*Q6UY0+n0@1IjR<#K_&-zaubZn2q)|bgIrgppsagHGInIP zhKDdniRd9bq!;~cct{$32woVR?hH|zB)EI#3{j! zUG0=k$odhc{+F!xE3W1BbW(h1rb~kM)wzQC9l_z9S?~K>TJm74(^$P7-k-0$U(gX8 z(Fyz9f(=2^SZCIcSj`&Kk?|qd;k*l7!J-S@fqEByqgBEb#|IHz zvYSyQ1KFbzyiL~M8|MHtIeBTW6K--q>?B=|1@oQ#ei?`yYc|AF>K&|9wYEZ`({~#& zv|OVEdWUAELb35_NBK47$oGKmrC5s#mZgwRv_eAM5`-4BY=|6ul&6vB=orPUI@l3J z)Q}C0&UVMe1+hjih9%01y)MuU=W~<5b7gX2h@2=3=hLhc!kqs6VIY6VPL~vxszrb;=qpWI)w^S}OIQJ(x3 z4Y^V5yFFtQGTP5?3G7Srpze?lFdG9rY&n42 zWPlsA0j{weAlYPqGqnLuwj3bEWPq=ba{>+MEqsEf<}^q(8Q>{xfCnrG=w&j%b=m-9 zEeA+58Q^qnfS%d_p59fEA1Y3e1syljO~&~Icu6M34m>p{MPHKv9?%B3!*YOrCIgJs z20-@TVg~(920%HNato+dwHRQa$pFX`D+6rBQ*#<*nhXGQs|-LJ#hDK<*kpjw+5oU5 z76W9P4A5O0fZ`4F8RVG^@E*iQmV+>!$^)3oQ=!Q?w0o{R&U|eg1A#0u8DOY3z~wOm zya)S~(T4Rvug~-R4}twKj#~!o4D5$-+%n+jti7|kPCsUl&ov`y!uVD3SC89(2PYn2 zZ%dY4?^@s~gd*HUj})UwLtW#dxg!%My0ODEWZt3;Cm*%+Z zy{9@ROWso_2Xl^JcD;L1b49mhUe{7@*QM8c@OoFg?pYL}FGlE#mCB3V7X3_L>`q_w zD=&7(N;Y2XNnaeNym;c(i{7KJo=jgIqrBRadWcjNsdL0WO4^Oo4Gq~hI>$&iIfGNv zoeV<#Cs$1wj9So|3`3wU3$%)54Z-3S(#r#3E2Xk^y5c|KX}4;+#R;#Z;b|Iw+8J`m&3@9PfOJ}ARtmpk|!hTTy!t`G)xY3O!6#|=rgGrCyqwe9S32>p#F0t|8glr z$CN79E~uqrO7}M46QTUR!7=L-Y5~5Ne2p)*j9zyfl$=c@4S!2?3RL9j6u!g@>xQr? zG$9LvDd(w~8B9gFuWU#m@mEnoMcaO7f{N@h?bK!*)wkw{!Hb6f`*|E+!0>s zi&wDrpOcM@VRa_{2y_&Bs_(%dku?tdDHT_dzW8OZJIlMA(@rW($tZLugy{RInZ=St zLOuOyO4kL0yABz33>pK$XGviBhmwDVbO#mMgyK~pXSb}yRCGN{is)@EX0LC-J={StL~!v~T=%qL zZso^JX=CGIY?7-E*T(yq?WOx{uw*P6^Z-(~KxnnbNx$Dq&}E zOjXP2KN0NF+7X@h7<%P(U>YJybizS2s9;RY+6g7dAzlOuq(m4JRuBqk{Mh` zKVQ5tCs@33au(yfXW;;fODmg01xZwWUc@JsjY#yoR$KLD-2U45%}a~dN}Fm)e0to@ zJ^O3$Vtmd1S{xIGcdDuAgbI>jS?E_Eq@qyZl18`#Vf5r^LLFnUa(ULTo+Z6;Cj&O4 zdWaQzZ{+c5?SS_JO;-%q?0LQ}&>-h9(KHzB=#BoPE((vcbbpe`TuD97Wk;D zYwww4NCp^~K?aQ)Axczi&?2EVVS?s0lb|F_fF!;ETP>xj_9D#is02b!5^}N~r7iYi z!Fz4Xy%+nEwu;nJngpB^5qbD3Rj#Hj>Pf?`Q7Hta%=iEAedZBfSHJJ~h2L<_*?aBR z+H3E<_S$Q&nJ~#8|g0dgBJDz z1--W;ogQ%Z2Icea-by}Oi|~K%H2J!oP?P1W$=7S;D@7>1+46NOLr2Ni9EN7_HL$$* zG{Qk}4Ek8UhWN@n^wxEJ{crjDbG~v})myvy%4Jn=J;K)=@)bt}wq9D2&|7itW9$7- z`C7o&jq-I4U)RZ3+$Og5QoTTLeHgEOje4NCZ@J#Og&&Lb*4=zA)LVP_yhm?6#pmsM zYZjJ-zM$SZh0jX8HOObN-g-Zu1$t{6pOf@fGPHdY^wthObM)53d}isb1AKb)RximJ z!iLNqZ}y*ed$Vj6 zR`9yJmn=)OERMV9cg{g<=^4>TQDnkTWA5r_`fIKI-Pos*C)9 zvdYLK4T%{Hd%kKbNpso14$(P-_ID<)-#0gCD3!f4FBdxT+Uc1Czdz=V9 zTL$j6@y3&bNHm@^*k{c^Ha;=JmZ|1{_6(L)CMf7;i-HEz?~8c@lnb8JV&IxO^SiYe zw!Yw|d`7-^ktRnN4w9^oYMod3NAdh5G*C6vQy1-x$sxExkMF9O)i75G0gFztniTz%U7?<3wHMPwAEe1OPkYc}ZLg~FmX=FM=rYhr*S9x%=d zaK;0!v;tI;XsZq14y3f>DI}*FtgjC?I2xShhabdZYj$#s+H7{2EfRgdGvcD`$=2TK zaJ98ALabHxgLoZO_7W=~QFa&sZB<6pA9Y!2=twnLL^5;LsP;~v-Qj3!odYl{MQtLF zc#G+70a-Sc^rXgVVbN+ z8YCU9xydZ9Rw~c@m_mD= zZEJNPSJkRk=tQ#Iw6<^@Etv?B2!E#SfoM}F2MTEy#_Ew#n*X`B)-C8#MFLjbQ&vEN zu78FAwtC2yFk_)9t%aT$&_~w${6o zY34H8|1=4tDqie-gk7N62XyoUO72b~|3wSc`&e*OqU@K5YRo7Oh2*x@hk+NXvJv7@ z4$^o{A4Lc;07Qo4i2N=Q`GS=}8fd2VR5FWy;#Cf@I1Xb70G&6z0B$2u3A;lU1jJe; z(?j=~o!mxoET@j*H2;pazywt*tDb@D+7X!2w}HGhJISn_dmeD4rGe$~Z*Ob;c@jIn zkZ6D?Gqt~;R)LN*puQam5}p35L`0RroD!4qZxCS(Dbxw|Mk8(US@MDBh#ZR3lKnVT z_H9b-+pD%?08qdOoZ>KzGdh#)PU7?h3#W+@U=XLWpW*}PMTR^;GQ&8qaQYI$+WlQ= z7*}ZfGr$hMRDq1wto3l6)YDt9g+Fh!~hNxNx-XqzYJi^18R{LyPha{3TECOlWEQY+u%WaPw z01`k+2k}5|apY17O!(Ka0tr06PIUR#p$RVljVjiv?;lmv>5jCHvm^h6NE8;YYuhi^ zp(QBtyLecGK*pu;2_T-dj<(hwkfK$>pGm2}bYf=vD+9J2Mc%4igj0j!f2^>ycw;_b z1qRJeA0mWnX=@Ry!od@VorVAf8xOe!A!m|Q39G(S?x@hss`hb0N?9Y%SRiwd%4*J) zET)#rOr&~_6^0v9vY^(z9QtyGiG#n4kR(~Tzu%FZ(<2T)(%IS%Aas`X5sZa*)YmsS z%&)u`i?!FT1zy^_()`b~1zZ-9$J#)+}m17O75q-AT!k;;a)nunA?{WXfqNvx?FwS8g1Cwha$^dh%TR1FkVCjf3h<&p?^dAW zB`8Ou1u7>Pg04fD0=-dz=1Ne?P%KbVmdy1?0yIN`UM)c>%CtZ^RZCFNf|cuAPT87k zBq%p~7AU7v3Ho!qs0wUVpw~*!oMf(&dt_a+6S=l1&XOxf^> z5|lz(3smwp1l^JVeNKU1FG0JLpd^2ZqumM6hZX1z67)zC)Qp4nBtXBSK))zKDgUr4 zAo)vH;8X(i%L;Uo1f`JJ0+r*Gpjil0$QrIdZR)OYAPzs?fP`T(3^!@~By8@jeLCLgOpqxu(1=mwNlrktS15}+d$Xqg1%S%n2kCPdcNgBR5WT$NFQa)PePZHc*?uiy~f7MMW5 z>Kq(3cez{1%`UthO3RT*56;NUPd4J_uYB$OH8QZGc&EvH2T{l{3mHZt4C!4*2q(_$ z)VKM21#w9d;#yH>kqlD(17Bpx5{AT=CbtcBxucb(?Se z5ICyp1}>1?X1)*M!NM%&jkxC%aX_rie2H-qy@>m_L>$VpnNO$2eJ2rz4upS>)VKwS zIMBb%T$UPlYa$M_gU!5)aWkyC+>nUFqG2;{NlkZAA`UC5%^c6TzPhcnJ}M`#Rl zLx}%QKvbZ`d_{+eP?Yf!_rD^6|SFzv=if z{Tw{!Tkj2chVg5{PvG}`{5IhCBz}bDZwubH;08PZ%04jfa8CW;KjCg1ZdTz)R=<4kZNw;UBjRwjY=lw9KC$U{WgBHV zd^5^&`G}THkO0>iW#l0MP+*jC^#MRJAJMXM3E(%%s`#znHD|E-&uG~_65uOF**6rx zBBLzCH=}GhAJMXv5}?u0TKJ7WedELU-_XeI^3TxLs~1~TBP&dJjXP~a`;ir)Z`>lk z$)EDi(8#^=FRDGm2a`ODryjrt6q@g0NxSLn8~$zo@pHZ%nd6f~>J3^o?!uo6I)< z(6828R3j%YlTcP|Xir!X`o_)jdyDmLXk^Lx7uCp-%Op^GL6YBE5&Fgs`MulvHneW* zEvk_-mr1xEHMG~Q2z}#W`Q2lEqhGDJsAlqwZRwRDA6gOm#sT?#%KAp9a(TjEl(w2w z63T%MZG;t}Z}iGq8d4PnS?SML;H#qp>JF$zsaog&(O%q^DnBAlb1;- zJTf%60h53F#%B3Vrk#I=MwXs`QH>nEOhWmHp*?Oz=o_Du-pOo2)(m46V(2i)s(^jY%jWH?+sB2z}!w`TeBz zZD`y8@Gq)u;Tx0i{KC+9`oKSZ<97MI!}>O~4(lzdaUUR)P~dB5FIy4%#@FQcA?w@F z4qIJ{>V7*1PQ+#8^D5^KKAr5@vPv1y|7(?S0fPaR@ z4Fdn78ute>31yRpc4Y!&LgH;=;%$=kCjJQKh3O-L+I!}{a%NS8S6)T8M{qkHnaOFx zC?N|56HH#RX;JXZ6^>x+Ci9z*@LCL%j8COuCI&eF42`Oc>g}Gy8#hcUjEaTo?SAV` zhm}6C=P#LWy$U_Pb6in(Dn(*-|7hgGm4FVKncqG03X~{+r_>Cm~HCL z+h0QyMLV#d@#=1L{=EE`?=rVPiqBL7Ei9k+sVAr^?8dd`+&b}5J+4We)N$n*H($j_ z+^?QseiT8{k)UqefA)ZOLshteHY3;BU>952m$-GB9W?i18D%KGa%pU82fp#1CHC=J z>V#muIqV)l&~DL;+}!-V<~3H0U{Zc5Eab8f%&W}xizAV6)^8X&H#hCHQ29|wYk}<4NWcG2*dwAF(9M7sE&ChB5|wRE9T_p z$S3Z{ntNLgr)8?$6DHc|NNN_i{+^*7}UxiNY|r zNwvXvBOk!}UbD=KxA@_t{f(+qb@lRA=4$ua_W>3*+rJU`|8!bLM`1d^A zN?&@-9~iOyDyTxhzW_1>eG&^lL$b)C@!ESmdf-&witBZ7}9%{?~Ner~F9gXpr;| zdnBE8xZ(=uE2n6!|6j4YMHZ1oxZCQDRAxnPcj${e`t7brFjrrmtykvg!HI_L_QD!l zw73$#X*R86fd-%`m*iq9#ykmt`SXn8 z8H~~^i}hf+QA}BzjrTxPZ#-J_O<~G@#&a$cHrlEgw(yb$_|%dY+HdM4%3VO>{02MB zEtuty_lm$2XrSXBE=_7Wa9P=!li=SoS8C9cO8d~|5M1Ey?I>w^6InRnC8rxEpe{Pw zezFU`FH$BTdA;40dL;w(uZujm4mF?*RayZWxo|sP>&%}DN&1%2sl4f@diR6ocn?d#Oz&bQDQnF4jzwzNn^^@l9vhC|Eko!|WOoCWgs53Hp z(7|T^?-jKsr`1$5RjNKuq|X1I#B4g)J|@fxp-8cEQUQj+H|k&)%A}s0Rh+a1b(ONt zI0cq&X*Lj(V5LKp-{?x;r**?}&@I^a1DsT4dUwi;s<4S?nmnQ7f+%WDF$}kI#f(t} z=&&JTRBRS5ai??$<_u|+brLRHNy<|7|LP4KjbxEr?z}1nlC|MC!{Y87lE;Mol&{7OmM6E z+58E5Kc{~PSZAhPE6G|&ENd$#xoqLQgQX|O*!V^RStdp^9r4{6LGB*{^?{i!)H zsgfi;`KIcVlTx2^jXrbf4%s`IVx&o174fQ##F7OPnBi32gDRo_63cZeUB!!4<<%z3 z!%}%J`2{h6E6zRWpm%7by3y3<9zd7q;k|nJwW$9CENcY?wEvjsxY6-iU8v)-akuB} zj`PDtz9hqDECH3E$Cl&jIy6jQidqy0S}e^LPC8u}g%THvz(lRUw(1`DwoCi&L%@wP zz`n{Ib4tJx-N~rwFgRjw=~#79CGHGY(|U8MUAMcprS(}>GqX7|9K#RwjS~UnkDNwW zSr1`)X}dNS%%TY;8V%)0q1}__&1!@=WK)O)_ zt8X}ZE9k;oF!l<|oh7OcM3xUBrz-o=D0k){UmKp7FF``sPNy|BeqeK#5A@xO!3Yye z4v~g2oW95WD*(2SuBVZnMpMj%&85BS<~Zw!{;~JM4VFT+QC^UPK;&B>^UbF@(UF64 zAMytW07SS4Q$z*|*v?Pfi>Yx9|6_iva7BUJZw&7Wnj;_=2Ogv(_b-qFh{i*>J_IY* z=1*|T3oXe^U<9~4=Y(My(qeOL4QcV_V8qaJx6OQU-yo(E^ok`X{}oxG!Wz`0Yj}xk zIPKc4fdrn$PU57UGM*x-^nGsm+)0*ZR7^s-cwm9%Lv0Z%ymqXkMnx8zX;fsZxE%G6 z7&Iy-sIQ59m?w}93XK&lKuA9%eqcth`N?RoTO-1p`6F<0Fa--H1@>o`P0}k0jEW+r zrS+Doerv&`hY)sO(0q1*S}>grIie;&{aCtNn_Z*Us64P3+KHd`$n+{}g8 z5XfeNVd}S79dI~{rjX$Qx3kDewkOW;NEYX)fS8ml&e2pBC(hjTpM$wc&TpzUgJ)E< z2mHVW@B^jjQ;Q$i3Y^xNKh!=mKaesXp9>c-0oM~*)uR^tp8L4qXVNBhX^&n$`LGD| ztC;>EaK$fj3j<&Ujv}3vNO1{0GKyRRCqU9eoJ-jAtmG181BN#&tTzvTN7a7tehh0a zj2KADCxdhISqzTq-wX3MC1&J7Q`XCA%6etU#-Lim;+B$Y47+4r@&{Gxo;uTSRV#Jf zm0Vg%t(K?MN|X#L317sUEJ}8yC{Y-4DzxIu!t1cZk(vQfIw0%m8IY*OmxbC<$3&^h z*rS?&FGeBbQAbiKg!BP(Y_&M2vT$2oXEs4vZ6G13r?kMS|jXl z4#!@oBR-jx<%j|SGWJAVQ^Ad0>pQt*eB{=c?i90gFyzJLNVQ!bhRc`p+cIE|r67^c zCE!}>#5>p}Tpk-wUGgPkw&#EjU@G*KdAvyy0X8<@TEoGA%aSP($1R8v-P7c5$b;Pw zY;V!n%}CU%?|MuKBZB76M7l5MAMcwi)2?=F?;u|_jl?%zk10TIyr{&L*m%Jv$3UGK zd2#su(#z0Jk3LD1<>(%?Sa$*~4!HFzb1^X68o6Z?^+|nW@hxT- zz&=TtE3axGeP7-|2?MMk9;u7A*h61{r5bB*caf+(r5WS%I+b6oWo4oh=8pcl8gorq z5&8$hWxcEjg~FP=Q{0wwm$kYA!EI@3B+Q=&i)qBJrt1+*9!a^%0* zH%bI@Bp>4}tS(rRu2&bpv5T0Sg)LT~fWi>iT%!2G@73qzX5%C!^i_!6LtgynZi#^g zAdbj-91^3hzB|P(NJom&-OcYK{P-?==#mzgP-%I^-9qDn!pQ4VfHxlB1?x3k2!mZX z8NZG3o$>flSQ23m92UHgxfk*WPkN(kG|c>{kgUfG=j3|aYu6yrVux>F*+Yf2t^?>?fI{%{VrVWh$xb)e3dVU6=Mi<;V7KO=bqBz{=^nyf3)u0*Mm2^d46de+ zf;=M|w1*&AyaO%bbrQ%B!xIu3y#TiF`}k$>UU$qWcJMKucPf>gckHKKs3L`w#U4px zUYndBC~tzxRS&G>xzgu)>qh&tz%s)`D(dJxUV$#E$QG33WLaHQ5$~dz?4p?kT(Pli zvww2XKfnf2;&rcWQYbkDBjB~UViz#t4UIY8Wrqd8mAP5A(7ngI6jJU4QatIq7g3J$m0TtZ(Bv|K4rgPBB2g+hx*cf!U9|D{MJA`K+y&*mVY0X{8Trr?E@ zFk4|&42y%d+Dp;$ErtXv1}@-Pi~xrJfO@>99*5LJwjk0%O&#g9OJ+zB7A)CrG5lND zXv4qxc7$O5XrWC5^YUYI`%5Sxiy`ishtPDx3?g5J5xML1<`Jx+rTX*LqbQ}}%6j#Q ztxCEXLlBIz=BY%H2s6P3s2EzN`5lEN1&}L594#ygdk**;2Gj5v%S7*R2W7M@Lf;p# z87)nC3(7aDF(DFRoN3e>N0)kYT5qV~kVs1#V3W9^wo5P)IfOu?h5t(owY-M6AfkvQ zI?pnXe*}t?B`WO5vN-@$m|~imN2~;_kX2M*tgIwY6{aY(dBpt)MuS-Rnb4Bnlh7N0 zazaNUthf2^AG4l(7CX&Hr3MVRPB%N8V;i{YiBWdq)Q5!S$6Dj&j=x2Nx>tan@<_vBJA zO_cO*Uk6d}VEzG1T%^iVg9C~%i25zGMwuoZm`>AiS%bvGmcGjq$@v0H-8uJ%A5x?T z7b>+*u}8X}mSY@T@$DFj*a(}l^ZZBU>6`x$eAD#vK4rVTMA{#z>aUqa)ANTH1E2mw z*6bFX%`>0v9|KLbN3~BpizmQRbgAgH)(nrBK4{Ij1}+_*3Ck73$S5Mc55|pLv|$AC z2k=&ENe#eHaUXzXOL-~?tK@e)0ckotlCG+H4sF~W& z(5AQYcxVCPe7r`&5eW)J2ASzpTHDI(8#2KK_vTBgf1 zSfQ)w=!@q=9wU<|O?c*32vqziND8NZTF)hViAzlPjPDLPn;KoV(5Su)^5sq?+WGqq zyX|LE&I zV26%T_j2ldR**bj!OWK8 zW&|pHySas>Sa`gcJrTQj$4HcZNhA=%cH_1bd2%n6n6!s*Mn-p5y)TZ4qV3D$7-M<4)jNrtvt@eO#-;&EP^J=F(bP(Ww&0XeyteLP3Fv@ti`UFA-3N+lG(C~pZgE!uLfmClufb+idespIi*$Ec<7=}b zwf*>gfZyI(HINbPpquI}ZX$=u{bMt0;s2n}-_7z`+VQC}eN8m(W%+qHn>_-vRHXw9 zcbC<^mS>=L#leVUDvUC}gSku0-5pyp!~88Yx!61po7ZwJCI$LctTnj^tbotiRy(kf zDZ#$gj{Q)Ky+JYtSwV}C6;~~yHOV_f^Gk!OVAA~F&f-0-@qGI`#cm3-IB}q zh=YmxbHtn!fDcVU*-GGnJ-^G>3D*pz{dKeI%@f;Yy^uL}v8-LAEAO;bDGnmBKlJqr z4<8W%TJ}S*g>kVo7X-7AZw>Z3^NOKqwmewp^Q8BS{nHp4{vu=whcSjn1FoJhC!HX! z{eYoyRj@1`h@9TU$|m^(7mn&>7-kTJT4C{SRqGv`ifbzhY?v;98kf77&h`W(?{8Dv z<`b-j=qI=cb3eQp5vzv-cg;VkCh=?r*ulH`OA8V&W6r8BVCSjpi@4w9ND z@)5_JdLn0;MGmwnz^KY;6UNVHm|yxQ^MVf3iXl>Di`3*lfNy9RkmvuC*at5a;8}{{ zXdAe6&oj!TY)Z~BV61l4t0OagQ9xO}ziS-sF&-X!as+TyKe_{YJ_Z98*6R0Y~`;efpgM;%$Zoyw;; zn9Y_%hw`vM1ZDi~h_@0}JA5l#OFZxl zC8li0oZa#$s!vU_rWIaW$YVxuZ0K9=S~5()VI(2K4`P0Eh>!cefivIPUq?pLsJi94 z8-AIj3s{#ZfsR>tSfnJoZ^-tS!G%Jowbjh70E<+$HST*cqrZK+&HN(*(W*MgJ<`k% z!K;dkc~ra)&T929v0Ze;{U1DCK65`S`H$Z$K#Zl<1$@_Gro|B#{YA@Mg61-8q^zE0 zJPr=TDmWCTNEG6Z@$d(69(icJ`8DK?In3I76u>c-3Q+q|c?J?cfRtoIRwiY;jQvM8 z^&)t#A#9KD!lIEH3x7=Au|WYGx$pv>#eIZBGW6JqI3Y2fmsH+JO@Q{u^ANb0nClU* zVmWqV>hhAw;;t2I1eUyqe~d0&jhp1|<_&l=zs_|p$xW5Zwd>|{tihf-o&ik)Ld`N< zf#BSlvI0-!3Jg99>wO<|f-rkS0Vf*?ShuMTE7uq0ae!=if*{C&3eZ%VZPdu;!I4Q_v_Y=6^aLtD-FWO{K2Adj}CWAc*gyNe{!Ptj#pG!(p#H53V|eJDFGBD@UZ{%{cdTE2B!?`#4B=eZ{}Qt9w6bnbWZgFREh-~r z(|1M0e+s|D_#LpGZ@~&>F}X~7-m;AHNo?vw@i-wK*D&RfESLh#*9k;TxpIT|gUX44nLZ%R&m z{GtZHuI07(vZsT#+hlqUh2|I@iL&pO-m{GfMa^;M7?wpS@@%31oe@BM6G50)^fBO z8q{~r$bVTcEjCIO3uJx(<5Of+Q&f}Ky~GFjgJ3FuaBlr1`ePxpYGhK48XkC;xxkE` zj}vWLT?xwg0h%Hi+>5~C{~C)Vx%OhTi|eKzp3dQW1kP5R(TYkN)V8A)(_n8qS6_xX z&HGu@m{h~nVWez+Dtjgx`xU;83Z7?!Qvdzml=n8SsQ}|i9-|-EAEkUV zrCAp&?=$%8i%V=DRE4GF9A}+m13pXrQ_g!UL2EpugLiyjLCSDiFwZ z&pNs7c~sHcxle9YeOglKKlgn6aS7K+aih3{+J{uBmBK^a|C&*vwuvPUj$Ix8cI1`; zo<89s4DvUNlZHd8Yv@_o-TWcInpQb%p^`(8>ll?E~fjUV`RT-+}hf{RhsF=%GL2{3cYwM7poc z;ci~f_F$r(B)%-YKdn@ka)OcSEK|&ZYx^{LeTSbb@ySiJc!~FiaKXrjPQnS;91(Cf zEgxYET?O~DdS1OnZMkB)R}#_6Cg)%>ZVfB^Y2sXIl0>P50<~vgLa(0 zpbw{9XTQ5j))6XeEl&dNBrq(K1%78}XhGn9cguGX7+K}2H!Eay9ndImSx3OY{q};u z(y&{4(1!2qXkaPG&m)_Ed1PL>vJVV*W3$bBloAM|LVvF}|0yq$AgA!11^%PT!M3KV z5ecL!+!OJVq^`U}t!56;(Lq2y&y6^)+nG<`C1@HzDfDc`-g~6T45t%p!RibOzm@g25O zSb{#!kM1*ohruVoJ7*_Pf@{p4Z-L5?{PUeAe>)|Q1?!$e{deN`0^5O~K1!Y~Z{gW8+okXW zK}OnKY%PXhQb=uWJRZFk)H9-RbZz?O*nu1@JRIM4>ogW_juDQeO)IdfIAb@OrT7Nf zDSG>7>U`izu5W{m6MK<0(Uz+^cFp2hm2mR^nlb!pSO-Y}?LTo!hjkry#Hsb%k|X~)zP zH1h^GkmC{F>qFBp4D;Y}Q>q=G>48!Wzo{(xyuF`a%%j2m1t>TeMcsp+cCQ96`Kq-byf}B)&i7V%=OwT{eB=z0NQGhc&_%y}EC^h*C zYJca{iJKzzPLs}?N0_P(c&g<)A z@Iw1i(EM*Mn5V^;BQvwiUtt^45UMwS9K_`1hw{EtGKjBR?4jCeOV7ONFkT?@nW*xa zE&b8Q^ZACA&z;C8p2;DRKA%2R11fA@f`WU0h8iShN4Y-8`bv4MtnX^@w%@{;S+c$- z#4Vya3yXd+)P->r+cThUH(VrYPH7$E^Y&<+r?ivfa7eZ%SYy6AlcXS#Ezy;&(4NCb zLvEe<8^p7kEN2MX-M4<;e8~hu@#~4*$&srnDd#unztx$uQ1OObxW!(qGEiFg;PG*8 z=!q=zKpao7yg1lx3JkUr%;zw33i#RW{X0|uQyPy~^q1T(WW|sDy|6oh4HC8hxW8Yr z4$J}!4%o#Ci2Hfss5S+4mFO~@Z9;yURgY6sm+7dGtpX1^lzT87<%W0TRNV{Nz3;=2 z7kp@5cMbH9HbHv?OuAO#7{KCnwm>Cbp9}b#FMJU*Wq%ZvQBLAd(@DH?5YNM4^Tnr0 z@bI~-3W%R9sdlUNa8hOBJm=iXg4!y0yMG(H!egPCFJ6iimBH&+M>huG0pA}(x4~sS zz1(-C`3!iuKME5DO?lxKqE5Qhw=5VSgwECpHE+K z3B0Kaw0Yhoa9r1!)Cc*qor)Kk!PuB=ELhOj!gbY@Pm4clN#gSY=VPDfjomnA%mhv7 z{=H2_PHeSb#|+AwjwLn02HV2ke`5Pzbs#n-m#ZU$c}F>F@;h*)SBGjQ_wsM}k3b@T z-4qfrM=rQve#E?jUDO?Md>OgbM5Z|DTr7OlY<-MV%n=YCcK#y#T3uXC z32H{M@LsEARV-Mwt72nvPyw8SX#?MOH{%G+Hti0qukPjmUVHOYozola3sJkKSolb6 z%oJH++&+dRz@eSSNe%`CHAPYBU>!vehhk&02;@IB+5fx!E>UTS>~eKbyB59p0hsya1< z=S;hilLg_ZkBynYcqp43O7GN%*NbWFY*z1&b+JFH+I{cL+PS~87|1`PhOP4uX1?(U zh$d#EYt8F3PsJ8)!8XGDE2az}l+qOQ#Otsnxt^gfCqmQAKQnYWL!V28+Rc{`svXS| zdl&9z)Fwnd-+?zsMDH2#&sa*-8bpbzZW(KqBaWk_X@yhr^NQh;{CrJl~<$m;Z`X12;0o_r(%8Zmupg+fN z0zTF8Cd`>&57?3Zk>z^R-{W43(}cM1&6QZYQFv8{XbGW+HJwhvH}<6O8I&u>5*%-~ z0|b88BaWuXluq#m)VR%w2ol|x?tO6AcsQI<*ZXg1cHHmg(THo3<#+Q6W)b(h2~U}x zk{so9)4vJt^tibanFEVIkGtFS?|`q(@GoQGW>MQuvlAVttSYOjKlFom8O^c`2OIwi zie6Jl|C)8-%M`_Jh1x;F;DKC_cFj^TlRM6evFx1gHn;gXSaxHu*v&o2H4*VdA|lQF zRcb_YA|l<~kQ(vLM1;d!of`|NhH~^&F~<=de)m5wu7t-9ZQ0%;jD?R|}{4#mj(ZT-B#( zlJpW-5MB9uD0BNwTDVi`?XJ;i*FEBhb_N1=e?*f4l1R?(W&55&)`AGvO$V+ z44RuM_-RRP&+Uo%^$dCGM_BwJg>G~iek{}2i>Ut4mV2FGdqD8rxby)|x_bi?W{3n&V&%!*_XMvYDFpFT& zAe|j-lQrB9oY`+@-V3@1DL1K4csVY1Md}cvs;Y1 zu-QhSoNq>;l8;Drj``nC)Dkj+*YPy}@N8;Hs!Ys>v``EyfzS%zW_As>sIhVGwfm6+ z#EP`fHZISNwIlDQ&XeilVCU)dgMZ8G@^vrGlyQAd`a<62F5M+f52?niy8=3xH)i4cf%VvEE8f^FJGJqQHHte8F0hn zPJNoPb(07XCHFkV>m|5uKgw4#BRtku6AWi;aY2t_*A_?k3%HrzwB1=;1JU7F=sFT8 z7`|kSGYm!Q(pWqy9Z@)mVUT;?)e0@stB#2%PE)F}kAi-<@6FK7?dfIEd1><>Y0n5?^8Aqyo#sH(Q)_)v>;J zpR$2sLU+>+fPX+lVYCf(xLyw*Lj`i$hl^-UAW}6@hJbb)SZ!;N>c3VIhq+bp1M;jQ zu1gegwC`Qntg$LfZ~JJ`SyG0^7I<(3hnnukMp5N~Yl9}0LZA>bY2IDtyVF!PQ|NaP zKIb|~#Gw?y4HYMTW$$g|==wz5m4m!1SW9C2B35kXBJyg>OK?m%E9%$3Q|esRPg*Dg_>C z*Qlze&3{;u@!>cbn@KW;F(W@s;KZqz7tfFg=sgjBo@lQ{UheWYr5AX7_dW@|Qv3Q$Q-2Zipib=lMw}oE^qFBJIkX>+~ zcod%Q^;rX@76Sz{CzK6vx8o(>JE5^`WPixpo+kE{22kEqJE$3&&3^4i@YP zsd=8BMFXXmSa~UGmiUD}(+jEm+&zieV({gA+^F3IehzCXWE{GGOMa|QZ`^<#)B*f@ zObC;(KyA?*PZciru9^a|R@LSO>tc&sI5YZBtX?#wHc7#Vi$$fkuy%7eJ+dNJq1SFk zKE9JHUq!wU8Pp-Wt@w4A|6+l|ogdcMo8cB3m*KOKrCBR83|+#rXLs}8&<$Ylx0jIP=^$^h6g%OoeqH2Rg{s#E&i0lDi1QxDthMpn1r4ZmLR73Af z^)^es_s>*%@SIa*ipz*NS;i`UgyYJtrw?{2U|j(bH4b1CdVvs{PRr}Ubuho#c{;7m zTz@%?!-h>-FfDo(y@HRUFk=ckDrGLQ1aj?rq2`XdMjSU$idTkvHy*vrV{IXfGI`8l zl&Le0GAVP1g1dMS%SS&(#FxcD-s#R*dcFBgY!37?uU?iFaSZ6V3-%Ch2S8y3=lKv^ z>u$Z?0ev1{KZ<`S>nsVI-2KGI3ZIf+`YdNM-<15)wwuT=o$pKrr_$uRT;#h>CD@KZ zhmOm}%Y42i^KlSSlJCOwO}Ht8(q( zk+HC=&inwpn3Q&6AV&Q!aaXe!1ChVO=3l^=TId(mIRbZUin>MBZjs4Lp5TE->ENSb zM5mT~>qv-r3NiL}haHn&=}Y^yU0ao9YpdO}a%f>7%l*issJ$=XZM?V{H_^U>k77L& z8$Pm90axF*IV!?ac-3*HYC`yT03Y#$=10Is zyZ@zg46fgNNewP4a&!ISeaqDQU!rE=?7IBpxEtWX-2i7jIDmPgBsV|CQy9@D_Wcgy z)~5Y=oOt8azfxtr^KV01vcC(XlDtb<;%LcUhY6x&im37OLV?K66y8gGZ-(o|9bQqM z>F|}0bA)rC#qSD8(q8-vrGtf>a0zRSs@*P}=VXcLGer5vFhwlpeB{VG=sV!vB(=2^ zWZx9oj$L_o%*d;mfx@$WZ_b|w5Z>k5XGNwC4!oniSRl9S8oa4o zVosrK8axZQv|ZlFGA|T3N~AeyF*dJL$F2m~pF-w&yRdue97qS&hf!;TmP^D~mE&wP zgE>n3Y3VP)i6M{9EWJE6e>A4fA1lwp51bS;S7QFq!|PgJT;-as&s+&r%}4IU8YC)~ z!{n%|Qs>kCNVQzLHb^6?8H|SI$$>HMwG;489jC2ui&Jrr?%$wxMwj4ve#H!MIQ|V+ zQyCu-y@Gw5S=m%D3>zE-^feMF82&pF9yD{Ia<`$c0g|sLXlMosT7R}r?ZlRf!Luc# zySW9kXS=iMv&majd}gh4KU6F3uW zf7hE;UUnpSmsq$7d@*F#5l8zhnaVVCpdBUrZ779HDA>Rf{ND`L817HSerqm|E%KU~ zAP)Vess2a9^CSKqz=JocMoQRU&5LqkZ$o*&B^jeGuuAwU^lw;-MPq}R_cgS&-a!V+ z-xjQ!W&ZRbS*oPg^?C&uqGr9qvsHFcI&g<_fg{}W?cp`#_c^g*Hzd!&;%nep=U|lZ zVe`EZ{G$l3;|l2S0YyNbc0@f)K6<~3cH|%Ly^FM7hofjO7AMC+9G4eDaZ@Wt@VZJ4 zko8!vI(vsiyluo?8fIGeZ@OVY!M`4Wix2l+2FRw>Ujw0nooEgZgTxYCri0lAyUQQM5`hAd9Z!jyc_(R&DsgQ(`&x>ZiK7p2Jk(W^Zzuuk_J0gwXK z%#3&s!mRZy2ON$zKY?(N<1A6Xs0I`mi7dx=(EJC;us4J_$s+Hl2YKw^%52U!E>~qP z7*ansg2i}$&uJ&~#%RtK0j!o7m55qh@w3&^`^HI$*7 zS1>Cw;+t5?Cj5SGzV{C)luCn5K;*wP3n-NI9xAfR851oyT**!<@oZ--gf4ZU-jpw6p(JJ$xA5Vz)lS&2>Q7Nu4e%wU%J3iCft z2HD8qM8!QhIoKsetU7w*X%XGtHUwN0z)BK#P?@M*v8as2rHCZ1f{t@Vr>Zd@7G8(|x>wzd|N_t!vj;x@bRw5|2;Ak3h-c%ozwu&zimkO>o^eWM|Rfb)e} zDn9Of;gqNvh&bR|xHWH2=<)^Y3}k{Lid{xA&r9Lk;FL}4wTIuwBKn5FI^7KmpaTn_ zeBI1w8x9BUky$S2A(S4&^rv;=UePHCiwNI%4E)5+5Rxb)96a&2MEfI-;?AD5bE^&I zOSPd*c}kE7VNgDxQ98^D0}ci>Ap=oox97pE6#Uj&;*lFWzf71*%bAFXiM&6_##2jo5WwK^QTZhQ6&fNatXsHrQT|)hHx~hU(-s^$=J$wq zov3hX9ZtyP(1yfx4_2IBP&}cmsLf8V6f>Oy4RfG{Q$+azN1r((o>(1u{v8a4=8#^s z*D})>h4CT1_E39;v%^dWuNS5ePgLN1FXXAgan4rrVn5D8<@#4M8`keYWhfgxiwiSc zXKS~%AHpW9L{x28j7D6>?-{JlvMdNDBOPN-au{1#k>tT0zamxZ%uiqtP?ceRfY@ z<%2w&Ssg#AQK9mr=8(JeQ2vWB-P>Vzf3NezpN7Ykw#QqZbH0ZxgXYF-tZ6;;5cZ1N zpL_I@Q<&1>|DeWPt>Q#CtRTGT-iby8Yp~TpZS{Fx^M{ZU;>IZIj6G7+;j?K2p2gQi zD(xa8fyTiil}n{a<#L&;bG|+ncLL%HnXZkPaJ#R>f4{j(cAOe7H{6yYPdShMez>Ht z2;RD>+Hi|?i#1`!-;Jg=+!xKXnP0yRuRWcqOw-K zCvvOZ*SUDESmuqmF7oYJb`d-#oM!K3!WdrE;k5O2VYEi`-o$Cyp=DPhFaarBw+4e6Gu^f8QIWwnVx)dP=ok0^A%V3t zGA0O^ir_7L?AMj?4(lqGr_S7&%iy@}J4yNKKcpA6-be{t65-$ka%@WSgR|=DXPZAQ zXBw~Q2GzB^xFQp`cW9ggM-eY#O0(>A$nwLk=U;dtdktxsTGY0@6A67w_cljiNq*Ni z4t(Ekv-|cf{$Rf7O1)u(^im#EfDIMTz@R~zQ;&%x0C_P^_R}LUn6Sqvhps99@RX88 zJagE0xDb3dt(i8D_2YJ+BzJXPPD-$+;5IG;^_@u@P)|&O^ z-|!W`%%#S_0n`ezAid7T_#dLX<87=xY#9mdK0oH?1M`n!#*u5zA(VvFhe;|?XwB&1 zBecTeFu%!D$P_CqL>twZ#sOnzsO(s}0M{c=sS8l>gOpBG;}=TKMn(rry+BMejAGJ< zpdi>cY{hWCKYleUT&pEoS`GLm98(ld2x^#Br4%pwwm>o2K zfrIn545SL+pzG*ear>dD4<-YcY@`PjT^+8IU5!r}h__CwnWfmDx32~=hQK#j0T@)F z_0K`}G63K1cP4X?>Af83sp&IP(+@J>5KkXJ7{NE_-8~~Q|JR&D+l;nm;VQ-ll8aC3 zxO&De#BD!IN*@hyDznD>0x-3DARCVyJ&@ZLn4kwHw!tE~pPD4R-ZU0F+@IncRAM=0 zV`vS`g?AT0H}-CbL*jUfKY2dE42A|x%O0W`XHd!R7JbTos(Hg0GJUt8*E7hXob7I36s|Lm=r_&@l*4W!`emg>X;> zn<|+6y2Pb9g+m~zTuD@%t#Q{MD{-WT&K8Gpvz1f+Zbz;7rbE9!*CD%fPO?j9Ye$oF z*wH~}Bug-b^(YfhbAgihxSlo%#+!b$g$5-2hb<#dM@%0e3T4#b*^9tbR$oG-%6M3O z_YF4k^b`=7GJ9>o`P><^*IFVTrFFp8Q-9yehAi{z&~de9ufv?SC`UWLt*7SLUBSDnKDA6Av2=oS6UVLwKqI2Hs6P3cDoF zW+UR=x#F+#4i4yzTmi_^$Z*|)``yENC+6P)bM6U*^gHOzQ(Pu^=3OOqE>?$(&Ud~B zR(RTX&m1B3q7bX%wYU)n7W~o$aMXvp-?{vJ z^#{E4SR_6?fh%xWD%{PKO)eyN+%U|%0wZD?-`&jz*`M>u+h4^Vt>vxoWuO3X0nH~7 z9I4KoWlkQ4%YBmVddh|+1tv{D9qL~DXG9mybGg66m7;K7j=Oa~^MR;wSEmVy<{I(R zU_m2yF`yM6YAm|3QA1bb;K4o04o0KIlkh_8;EI#5%b>U)`*O@OI?j|ZKb64R?F86U z!ZymS*SPpm?9wY4s#m)7>Itfe^b zcu{v)MIE^`Q4|ToNVlkZ;%xIp83iRU%QUf7e|Q{hm?%z~+YyZytQ2*6_>}pVuYz;L zf}l9PfFlzfpzVg6+0?ULBZFDvQ)pmo9HUCywp{nDmSCxo(^KD{n9`goTI0YjTkJ`~DqI@uUX6B)%i z>~5I5E(H}qjKQTnMJt?@uZLkONNVUgTvC`Fs!gE2%Aolz$N)%U+hx0gPuZFZLA3sxr&Kdtc(lKohe$2;~Zck57 zPfN3>rGx(Pn)-*Z^ZwcGGUa*Wkz<_qwB|eT-$e_;BaD)AE+bp*9I-{;k^#e#0gGh- z9Y|OZAsH|<8L(6a3{M11mihpxh2dSUw^Jc~{|gWPzFP=f1NE*)}zLaBj3EJp@BS>6mh{ML|^n z4>M>mhF%IQ#kHq8dmNgqgw5Tu083!suPyx5K*urvt-AUJ5N|x6iQ$CX&^S*~@=eUI z3t(M7bP?tb*tzE?r;o=v`Y;2{$N5w;*jowZn+`gno$7amisY5%aCSqE`Nh$8p76o; zBbWg&1*0H*D27Tw78DD2L3dN@$xJ^8y<+#zI@^Y+8u(9@t@%{4GvA@D$b?*Q?|J!a zV-SD6JRx8n%wJ>Y^m81bh}&>Sgq#WnG1|Hgdjq|8hwgvIVz~bREP(mmO^Adk`a^1y zyc@#et-gcqW}=F>F34}$csysKk$HP~g|r7U2%e)?ZHKL0a<8>M6xFyL2i!CpUuXW~ zZrlu#s%8k{QF-Gtc~Qwz&vZn*8MEqW4g-d%d#Hcw&U+*M4F*MO*Uy58}y2?p}e@=bk?ULT1nb78cM-M-P{Bbd*2PiT85bt63+%L^?p+t!= zItM+oXuWXj=w8$fFicUV*NZdV4+2KNbjK4rHyHSV%ONly1~4dub*qKH~@Y42dWVD7cgq3#gyuW`#JH8pnG zFl=#RPGbaeK*iAy|3oB$eTKEbY~+ZSAdXy}jPn-qQL) zua5*U6Or;zT4SY3D{VJU+6K#&fRy=t*WPCy2?6!i&*%U7!)J14&e><}_uA{d`Yvf+ zAfEL%XkvH}a_*zh!cS4LoF+48R8W`IL2coGLkAMr>2DiOTcz0-L&rnB8&W=T`5g5M z)(QTn+VLy&w~DM3QNK{|7Iq5ptE6jZKxTIPTVLl{U1*Lx8;fOzbo-LPvll;v+Im_RDz59$yi^9KU4ZI+hdKl6Az1R^S`%R&I|2zFu7|?XB8g_7rls57 z07(1^o;<{Br7yuh-Pe(V32%ibQm{tM&GWFJ5z``Jy4KR2o7M+wrrbnudtqhcL#KQ; zJWKOb!o-+S^tUbsICQhWjRTh$rkWGe`$ zFv5C}v|?R43Bm4f+ai7b7-s1v2EtlBgUv(E%EZ;pr?c>z;m4=mNCl}XKaQFXLkCMD zv2S1vw28A@mMeXk-#lMX#9aULjBf+}X$;#xx$_aikc4Xugvd)=@=_wr{M4T%$oli!{H0nCyun2Iku+t9yr7`8{aSs9q` zUH-09(rQ7N6Fv*$sOzbZnxa?~OpHP{FY)4XKyuNb=gORxb0h6}A!I>3RcpSLJRW9f zrwt!0I+nFFz3U1&9Xvp!V^?0&QV@ydNf076GxY)@dvBCeM@p01K_4f^%7%zO+o2#- zj6V)e892TO)B2C^`tG=UJw82N~fMb|^b-E>{L2|x{ea-|!kZ;9KWxSkr2URwUQO*V-OCx=lC@R(i0!n0)BeYmW zq?6Cf!__k`_P3!)mR&c~ODe5W;e;m;wE{<{nIXdn=ZRQijEE&hy$2&aQcQ1eZyth7 zC!8J4Nr*s1T-etym}>1kmq?Mnw^k^zH_3Os)t8HMoRP|e`Uw|$#KtmN$n%r(^HU?f2L}v zz^oiSu>R*`Qk`r=r#9O8VQVa)#(5uHW7yRAjUl>583#If6$}3+9)yUrlrQISBj$+l zd52NHaF;?p_`KjmiNloMl<=vm$D56J4m{p;Aj-yLtOo2n|C6s;n>woOx6IE6h@K^0OiKQ#1)qSJ)mzC`xjn-8r4s-^&&S)+oXmUc<5J0)TZ>2c!#HC1^xXGA+l8y z*soZ91xWrUYX!ICq>N6ZW0-sym7|R(aA+7HM0aHDInrQ9mfn=_h!)g&0JF49qXdul z`bTBQDvV4%TiPD0VBtV{RDg!$VpJoh#0Lo7(Z`A0y&+#h;Wv7y5XLv5z72G-xa=5> zom-1%0B6;U3T-I@J`o!+NP0br0whsMf_fn#U0w{*Z=V5WBvO$_SV=E&lRMY?+g{)s zhN*MBh}S2Gl=^~lz7=T+wU!f~CJ1>X5^CT2EF{#PDT0lMCrG=dJ`1|F+?erN%VrF~ z>2n-8{V7+BTSF<71LF8q&E=8f=Y>y4&-1c66NHkOo|lXRy(Mz|YJZy;`a+w&tlozm z&3t;evP`SH#y5HG>BVXagJivI^{UUo&^O4P^`ju%r{hrItVj~G1)B<@%Y3R4^ms}g zmq;52>bM?cO+;@cMV;1hRc7kA_+fNhJVVDdeLT(G3+sg!jWi^ShFF!py3&`@wrzFx z^nCRQ;#)!jSkv=im2nur(sl?A1GeuD?JW?^+L%QL^mb|*qJF}1Xd0=0#05ko`%CiS z5H!UER}dRiF_@eKsexXC5EIRxT6<*TN>0)%S6{-3=5M>3$9DPmrwnQF`k#L(a-cC@ zXqUgh&*l2(74Z>v`K~FsEnm<-CrUaP{9UHb^8b7@WF`^7J_bUwm^RSVwgzVNMzh7e z*pP{RM$(i*qggr!Q5z(PIQc+2gEfg^9r5DznBdkxRfZNn#B8XVsSaTSKhZn{%S2=M z*B)tqFFF&>Y?=SAN|q0TdbLlB@7uXpBg?f4>mr`K7Yup9XQS3{79!+4S@VV5W2l5X zUO#kwhtMJ@nO6DRglaXlV~)IF3&jYazMq?s)et;wzvWvjIAbLj{m^?r_Lu-WAbgy` z=DhJsepoZdV^tRE%Qvy*BYkMp{+0WYK3t7NuOwtun+T|IW<^j-$>!yhYQB{c@g@T+ zySXU^r+J|~{TH4#*Yj@py7YTh@}x|j1ZW;0X0ICA`U|el^KlJ5*}p6vWM{iQgFGMXUaHuTp*gAV zgM7*L=E{OG`ysKsP<4M@Rt1)Zf|ccL!IYqg{7=UiSL9Pp(09sf`ql{Wd zkrketaL#*WUQhFKPSWwbnL-zmHgQyzf0U@iJvj{L06bA{j)bgdF^8fuzq+fn+h&nfllSK)hhLYwGap8msp478s>U;lkx%$T%v zahdOd<;ORuub!&B*js25fl3dVcV&*xkE|%j!c3s1Fi}%rl@+Y_5ZrYg$1iI4H$?n- zyN9DY(l@jjf8dc}x3wlef==7t_9o~-lH2&(_V5jHq(^!v>C}Yef)gH<<0$N#*jFA7 z0FZ+r42&;!Qk|c(RS;Px$R$Oqp=Nvd+2T4CxX2awY<-CWPmllN)A z^l2#+k@&BQVM6$r?2Cp1t5R>CO13Cjy3uX72hF(WvP&n2F1SsFJ_IJTl)z zSNjZBCtwN&^;QMx!O1&B4oQ*rTBHG@rfEJyD@y@(>PCI$i zx68gS)B9fi?XV1>(4BNYECc8t71V~iMG#+g1$ISNv>bi}S$FL*H#&TD0Z4O*JHVmt zfuLb%4H=mvO!vsZU=ld9FxpTQ3l?*TCNxpv3`+)1$rzNA4M?i927g9+h~R)M`(=cA zBAv$VSmc|ZY|e}HmH6A9mG)pg#znZC8n5T$5OL)rZN|Ri@Mae*guk^}Hr8q(QJeT? z<#dv^Nsg$?MRIV7kps^3qD24D_8^bptaIQz0o!+N80}%7bl|{M3|yq|c7I!euI8T? z-Oiwzw5)Ui5>G8F^|wB!$7_Z)b1DNG>6?IAF(EPf;>$md(ff_~CdwqOYA#CGz7H=< zBdMK+Tt@tXsL##3iYs^Ds&GIuqqklGxgB_Y7I=vi@>WxX_SA7xB}O8+ra#`ElT9LiqPx z681L@5!SgCU8o zFDVK0Q?efVOPGHw1x3RAJ- nM2PtrGnh68tCRBykXe>_zz)%&+lfzY4)b?#_)oV zqc^>WnB^TRiWiX)1c?0Uz^(j=^o{qoZTy%9Eo!RyHZxas)xbs=X>fdR5NWT29+#()D zv3jK!*b)U>4oBpf{!v5*GQ@N8V(6wyLpPaJ(J{9WOhP9k=0LLU7%@)A&{Puvb2SY; z*Vj~tCRcq$>L5mm5!*l?Qx|d@j`51TScRd=D-1<6nAj$kt%<9D$#=?H*O44IFN&=K ze<2|1ARr{=HeD5aG6`TlP|7{)!$`Sv6S;_ahOzIs{D@`25RTH;Yl|4J5NqXm0nY$i zP&Ac3CuR~Oj>+cu=)&>I8*>>3@pc@JKDk$a4IgeQRA2a;9tLs0bmY8AO3a}eKLlAg zH%Va%`B5YFFo`fSy8EpXe!~&7I5axzQ?#ZX42-_RZ|%v21_62vrZhanUXc~gkMs>| z9`=G(koOG_4|zf89cZt|(LASku3Cg`{mhV~w|NGzU0IrB6cglAa#st56q@NVN{97MgWwJO(5d>-WUIG-*)Si|x!%aiRk z{bc@;-+n$*etYvt=3i6rboX_XbFRj*c@W#7Aq?fuGl|G=J~BhNH6fQtpyrBmBR(DDxGgG)_5gbmP1wkMJ6Me}0Qs`Tin47wxnO zR4ILFDiBL4_0u@>nc^Yvk2bRFB>x!nXjx@{-ZJMwVM0taF{^5;4l}nki7H`sFitY| z-aK1^FWQ6AF!pG2992CSAZmQu|Ih^DP?_OC5YZAO#e$vMzxBf@Ojp!Sc_+$%zr{&sNWd9l6SCzbG)vTt{el+ zj4r{<$bN^z8!=9QGb0g(f1W3DJmra$bQK4Y`ohArm?4?sZ4+H{VThCI`y(rq^_h|< z6r23=1eY7@)Rvhk(5z?UKr>1NEuvZVT6tC%$>K&Q;c`}BPImI=q8owUZNAiLSW)-_ z<7;w`W4}4LzsUmQZ~_Or@RZ=CKkT>fW$w4BgYP%|=cBdcJl@0K(Bd<*vyrzi{tQIG zVpihX#OW@)ibdb|FDzG!QdM2V5_EPFZpZR}@l=Y3954LD=|1NT5x!dCUAzA}Gg{S+ zQiioI79Wx0xhG)` zLLLtZDPSFs?99C*AvXxuC71ZHO~Zf(x~%BKbv%|SUa##|7v0QDyP~Ul$WRkjP9@gS zjA}ef2^SDq)r0faE}i$eyUt&^nG_*Tmq>sieX+vZ3AB_~)lC@n?m^vhwNGx9g0R40 zvP#Jsb2h1LTs^yuJ()#*|oFCXVYmde}9YhYbG?bp(x@|6W;S`!SS&O$$Z<)wh zvawH}B^$VuCgOhp(Z_$cc6DMH9y(*oTx+ix);uH#x%eKhW(AGQ|BT{^XiR(lq`QF7 zL<;>;7mB|Lxsqo$5WuF802TR(CG!$XmKaZw9cmUB6&IF3XZR@#)iqFe$A5OXT*t&+ zf6Y451F2ecFDY|bTc?JEqqHLHkjVp3wVXiEzY zmzfZ@ORcgc2uRNpDQPhkUB(svFjOknBl?c-HV$h}r`$^MyG)Bhf;n0j(di))ZLX@=TNUGm58Jcn*kC z`#KsXxDory+3aI{26n!O%%0DaeE!JiAfNLOSGj)1wUH&@!U2FYd@vTCqzQQ;f=*)wC!g34qnj_L#9#5;SbYHoB||AV)s}Lgqvihz|Tq7puXi4 z4!@c%Jb$bDsV+=XQ{BzSvY44OCBkk?K{OY$`)Er(0a)TW>%S*`7=Zcpwqb z5*$5Sb(M(r!DsowViIY$K{d#7$>knLvX0Y!iX?Uub##xbbu9>9k43MrJ)IKi(^DF) z&WOpR-WAfL*XXSOP&x~U%7|td{-b zvBav4s;Js9rPYR%G<}%4#CY#F?b15^Ispe867dD=l_D8Ej zB4n<<-l{5$Ruf0PAX>dRI%{sM`ZH3BNMtA-z1aNVnpb^`#A&TwV%=I`&6-Mx{i95N zZ{Xc!Lv7#xO6mBgmtSsG*GRCXUV<$(*t5#iV^D+fqLO!;&$K3cT5)KD@FydWis z8hRvf)L(J5QT=H%uhbtZA<;lDqGoB3?R$V@*mB#LUAy@fKHc_+n8~HbWe93$1|=>; z^9TxE2m5+VVp07aV_!rX^Lu4s&rz#n{D_KR7Pc9ZB$+(W(-e?10b|5#u7{NP&UZ7D5Df0GLsqTykjWHH_cdZsQ!G=H+ z_w+mo@;u!uNASb+(Q5Ds;#fnZnGXM*_X;XmO>&g6R*rkOwUc02CGcd2WHbOkV4T2i z9O*q9XlMM!Zbwb@R~hleESsRUIO56YbQ)`v7r`#XKg0cbsI?}k z>70}jTD7n3mD|p?HXrWh4Bvcsmv~NlBtED_XC)iKaBZ?-Pq~92bQUQg#=7U=^XE&w zLfHKNZ}swu+!R2QzD~86d$hIRR&W^SvEJrUnKfKg)feZe?31EX?joQbC5R*!**7*? zb!gFsD_8Y}5jOc-MbHmb; zwdzp(dH-Y1x5w2tn3&|oaIPnt|006QVq~!3R#^b`^I)9N_fO{})l-Mcq&ekQDKhj$b4k`PuU9q|!7XFbTM5DYIXmqEc;2TLgO zBarvtz1xVqq~9LnewT>2oteW_vMWA}yPYyj`FBMAG?t+Hfo&XEjLr^!>wn6KbR}Nh z2dJvv!@G1)Q-vK#6`n=-ZN}Hp;`di=KK#n?`krxBz2oZl z58q7GPLnlKmPWoy%8c??$-|!Eo2`0MrI7KbWOr%%Z2X5NXFrnw7%<5CS$u(Bi|{&Q z)3ubgn|f;dbVcJvolwK}#k~;yssho3nULi9to==1H(|C~K7%ODZW)U*aTno?|2l*a z!RQ%5(8adz7f6N)Qh1itThiM=Ljs=wgNQ8G=k8<;5=1b1yD#$RvCBte%(c_b-{>rp zn)51fR}`Zo%*s@lxzY_7d_6z{hSEnM@iB@9$ypVx?PjMTTd}T;R_!6UtYke@(N+72 zTMLF?!d#aeCfIw&pN6=X<=u9cOm=fV+|p|UCK}@nJ^78cV%f?3Or@e8v|FPa^ zcI5cjW$s{nNa=f#&E$pIN1oVa?(%pSMq)8fyu(`6O$?heB+~SWdnYp zd!i#z57RWr=i5F(h!FNh*Rr#$`X0Tt*hv|iD=Q~HTHb2#xJkEewp`Xoq>xr8+f1(g zBq;{@>D-qzto0c!uAPO~zF{JbeAIhBFi@;;U4H&{=68ZY~V?o#j z8exw<0rh&5c$bt6hv+=@%x;h{W<@f#I+4o)HMTo-1oX2<>$m?7>iq|CtmX1E9pacn zP!q?T&hj-$9Glp8W64JZef*Zc;;lI<@k6Pw4^gk3-(|(1X-~6#FUpJ}P?@cIiws>W z6oAPfaZIf||3m^H8J%z-0q_Y;*?#UdLjZ94kF-5U^x6NqIs2Vszj_A8{*V4uAN#t0 zhz6m8h&rxGAqjU@W7T*|-vE_x#9U@gw%#p$1;z$j8J~O0`jNq_yx|0-ej} zh15oview1**{Kll(OhVBcB+u*f}+5zXEvx-%0?mlJ^dfz-zvq)6O=5j9{U!Q{Bgtu zs%ClyS(s|iz<5-DKzZ^(@u;4s3@n;9#7*}PefUVBRfk*P9s}Kqs z*^zMDQ2H=Ua?!!vAgsVw#00e7b%bvv2Pw|U?Rr{@`CCN@QTj@x9lw=*8?1%-fp>N2 zzxPe(zZOFOO?1VptsT~ul5LVGtK}l>VyqaPNrW;(2oG4*Q|I0+Z1-2rmBRuvXW~2Z z(r8Hd&Z_+wwC=BCzwD|I?wK!gx}s>>>2AqGpYUydCBpj>;k}74M~?c}zwi`O8>s&L zz`^Citlbj${Bv^pH*!Na4huAiOXxK2S`zbYE_uDAL&qhQ#)*j<1&B-NB^-+S4Uvp= zqlimLqlin`tK$;(&QSpxH5ganME#QWeOo@U;w7cvPT*;KlbJ1ryDVxL|u)rE> z*AJaD+r~sFO9V$g?TU#;tSHEqJc(r=OQM0=~c5c@jh9< zMZ_~d;f8bIK2~EEWwJeGX2nQ*rVyQzRt$kj`IIy#Pb~jt6E{Trx18GIZ?bl5@k!%O z<=FClrjQ1XcN!?5M`32DZ3~kj3%O1}^ycbhgj_Ts-we(qXK<#-;FK{q6Ow~7AuUML zCWogOoeQb_r|eB5M4NimTMLMHEhDs!n-13cW;IyrZvHqs&0J)>lF2h(1hFD|nPdG{ za>r=_=n-R1`9-+k!28Y97HuHULXiAU>#BN*)W~`jsYY$yI!?;#JgJ}#JrdL*PehQ( zpbq}Fdu7dwG{P6CJrv#~sgsTfaY!`1W5{#g+N~RkTcsB-xoUa+ElK1+@uST})Os#x zlSF9}kG4;Zft$hMvQi$;KNQ|4(B990_Du&G&#l*J_~`&RO#oz9T-6Z3)eu_q^d_qT$Ie;be{&8 z%-?i?vDf*Vo_|nGmQ4PpngTIYA8y5}VTbJPGCfrfOVsF`0m+*lh}J)7k~cjlTEr8Q zH$|bTM1{*UQW(@eXpY{82;Z)b6Y`0hLOfSJr0w*ORDn#Ko!D%LalWw{@)$|9ita`W^Ztmd&p9Uw|RlCGjcK>&E&s_0w(!V%~p9bV^+Cl*d zW&GXy<+@A#E7!quH(kGz{%8i@;5X*~!{uv2US;w%k-6^!@-_7i%-6L47jg*n%h%K! z&CJ*I7}2c=0B3)Md`)#EvnhzyOI?8yog1o$Y>y3U)3+HnNe7j0Ptl?#*~jE>^5sUS z7h21(9}ZHP?bDf|rk^@#(?EIC$%HFL-juuJRPv_3RSZB*>G99pe;+>I(zUS61M)4& zjx@XSd~k?E5u7^T(st;%|5LuD?LtDGkZ3mCs z(0RSIy`k~S%EimCD@A_sJXPq7O1obDlQq3q5-LslCK1S{d*phKHGLB6%F6d!zAFN| z!&h2!CRsDi@C0UD;R%l}lO#%&i$>zXJKHs zPLo8Vl6vDL&IVs=^ACJ{v@jicWJFM#$zOD>rSlhM_s?G>lE}>bMcJp!UsU<>N!Kv> zi~bvWI!E&in+(sO#Q~?6arWMNm&soQKB=9RA^$#E{vYf))><=HirVM7mF!rP1!$(u z0yGSvtrc8hvH;1|f6sAHzGS`;iX#GfO#M>xOq~y? zxtd%+%@t)LKO>(=*eFof_?%v0#Memg;uj>A&qM1;-1)?EQUrzE2ym^D>P8HNMdz6l zenBVpkp7#*9>G&2_Sk?$tSnhlUrO_vw;m1}Eot7m`c{M;L6U~Hrgfz2s#>iaY+0kV z8;r8FfCkiAUFsY{G>Eb^hfKk{NVd7!YAhlZ50b(ffhe@f=>loy67{Z_f!5!-t}nwqIG{S$>{1n>3$!lIAlnYk4UFZA6oakUG3}>7Vfs`EqMyO#$9kza}eb z{}i9N8@GCfC6$_1{f4Aov-KdzD>_D|`@nzm)x!32II;?81n}G5C;@aN(NXPQiPwZI z3~@RKyQDkXAYqyiJ(BLIejNuxIR`^uRLAk@NMtvvc|T>HJh6favAPoBb)yZ&9zq5 zh7!a*spY2W83IEV?A{7qIh zfezCtj~dkm`g=mgqJ&9#G*w<`%t(0@Or|{2AWX`mS*HNt2EgIqXNrnI8M)XmgHlGU zU9D3dX$&PPj}qYJ1HYxWYgg-(M>~|=rx~3Q4U+uZMXx%8CgoA$z%MCB)}s4=jZnd- zHppeTigHo^d1aRCToC=QP7Au`@VS%ELwug%6X#Q&Z=T8XPn>Q(kugEndOq9u_|6Er zZs8-(Z!8G9?&c%kf5kP)UrUk(k-+rNKl8jMJo@LKIf|3N)lfh}8Ee5}#1vVQfd(!d z&OATRy=)j^-aOsWa!>r~7M*tO zUiHKtAWgR0=FtKX)V(-NM|p_p8&VnXceZ_or`WJ+Bb!)Tv;5*;r-^bGYg_5uh*hoC z_p4g5R$C`uV^w#XI~!cKolh~EFhp&9O@GNT9gjR$#)CY6r5*-rx4kq=@{ea%fJTqh z)!9{hOMVkFEp+b=saN07bPv&?TK@-Pud{6eg8}sYbTILR{7`xPfjFVAT%G8~vbCkq z6JqvLl9}{|q^x$;y5(*{aj#wBb&xv@^Tjiz*Llw1c1%jTsHi0FA<3-UnX@K1(by1CvYPa)Md8I|Rbc(wpq*1>)M>lFJ-Bj;f zt{dgE?%PLUr&03W2R3SfY1F%DLl_BZ)LvdQjS^T+qcp5Gsf+4I(x_&hsby4aRs(na z(kO|)rbA@TH7y!x-M5aCPK)HF4{XtHpB|>qm=*zely%=+Dt2H<8$J-mw+xKJ6pYc< zeUGHuA%pvYFlHJU-7GsshIXJDA>^lb>1Blc{J^*K%-i2FZwm?hupZQ^N6d&;$>Pel z?kkY}V-}H2?gzr%G+d8PMG9_PKChYi5?IcBISb`aGsDx5ila^`!?;5WojEb%cR>zkw=C>kzL=Q;DG(YZGuzYXzKoa-5Mrp2jXRSi~Td z4@M}Jcp1?Yoj5JR7y z${}__kkR{rhe=%_@MvR9A0}pv2zEB#1hRayYWJcb9G|jfKi3NHrS6kO{6YTboQ=G7 znuy!IiCtC~KXR-rtmyNs`{ay~RY!bRIc-m|@cst#%7`{UquV(^1!S_=Pve=$SlBK( z&SbFxKX|h4HK5NlplyA0oytW1i853UBmU|@VAudKksL|9KQe~XyOab~77)Vsq$KBaq|`$dJ@GfhPBCJH$7&do7(b zE$HOy+UKNR^qCDJ2x{9X``sL=i6`WT`aOP_hFm!7|3)rsmCB=Sg6h&+&X5aRGsuOl zD)$LPF6b9dEZW)jsBT>S*2EL?%^b6g=-KL57-I6J&^g&O1&BOC2tie++n=Tw&SCro z*Q&*r%9scuKj)+4`==R5=4AF$dQJq1o)q8PZBiH2jHOX> z#Hm*=kw(ec&D|nt)DKSAjhZJlZ#wR}d(YeK~`!dhK$UHhvI5%nJg&&>l`>d(p{l`-?cv7;D z3dU>1tI3G1r@-bT4A37Npo8qWs$&;@bh7y==mB;>DBaYpOrTh2C= zge_$Zwr(pFyj1#L(=gi}&(~<1{H+VA+-ro5f8ueg%hF}w!LWYvpb?x+s_rM-pApm^ zo$F6 zkuv@}KO$6lu?sY>1KuQL>X-JNf1(O?_TS_5B<> zZ#5RI2q`nns#2G|bl~eu4VFfCtne&av?#~KL9-?z0&%49P2(M#DD?vtKZGMEf2_@_wv`q2x1xfCPln1}q@%>E(x1Ff#`S%_klZ_+ z>(B=bVh@Rl`~yxW5wv+66jc7V0-GYf*KWgxy4iZ23C%* zm(1_m{eC>#deio3Apw3Ihw4x+shgN-R4I=mTZ@g6iB^VgV#SDsey9IVB0iDcVhmoBn5J*bz2m4nTAuriT;j!6$8Lpb zjVX_tIt~!#33GYO-GP3yVwYIevY4G5zT3oH><6E8`kQ|_**Lvvm`~(`=hUU-gPGPvz5Sir4o1Ev zF^?rESZN~iwR|t046ORmi)m`MCeE>G?Fp&Jp`9&k{El%Se|_U;ZOzQH7v$Y>M52c- zJv*{GA1h~G&VdDW%e_U>bzb@$AGJw-!F%oy8vkb(F{Zk#HJqdx@%T{3vnnlI z3=k@!NFcs~J6wL{Dixk0K}FDcsd&s9PEP0i%&MY+MN!`hOrvAT3T99NHq4}c;EnsF zEOlHS<8-Ez?biH#iwMq4b*^@*+j3w(w;jca+`rHQRnQi0!%M)A6V)* zR`f&?IZJDsJkP8I$*C7$HQCqLiC!VL%4OcjzPBzecU?u8ma~?Txye*+S09VIZI507 zAv@?L_2r_&@}e)kNLL}y$)goXc$d~Ud7oJ)pl?oruCS|*KLfYq3T$SbCV`e56^&xR z_N-!!CqnExY~}q9Sbx*V#Sa3d4n@(~Xn^Q=CU$TVsP>?0JVAq>)Grh^5L-IWIv7${ zjn7RXr;4&VHP2{O;#A3RFd z$G{y>uddb87t0Sd<5Au1$kp;I5&rbzqR(FEiVfMwFZmZ6@_6doCg+>_BnO3gdn;qh zPTnNNje*_jpXkvRjX2S)+6%C``%>yw5*w%OIlUH!;28HbqCD^sab&%>to5bvk&+nd zwb>G(WE{)_OGq4=GbhpP|F87h|AX4^V%?xP6P;Y%B&#MQYjl2(%0;@yx#;ZnfnMW& zy55)XMlhLNUaIRqq%d|)PM_g^moPu79aOd0^#Uc^PDVKx`7J;3vAq`CPo<$O{ z%`5lIT+N*tp`o09U8G(5fW2D-#!UD3Kjs#w%WCl?IRwE4Vx)hb#Gl*J>+cA9!l#R& zWFn6r3%t|AxtNLWNX+(FcNgDG`!q;k-Is*5OMRaXr&gl*vM6%fgiFF_`JXDkgeHdF z8?#7^aY=Y6_b0kQpj$3$Ptj)bhS|>}W@nt|69!vxQ8H+~9=V-up|1CMV`?$Zghn@wN<@wv*<_ng@cKtpq5baug8u#@wk+G`%vcyz~CCE;J zf=*5(0ithYV8mMp2`{q9t`Fpi{tZa*L^f-J-6<`kS!d(n*w`>f{fuK)pPrXPZ~dOp zg7+K)rE|TxKb^Z0Edad#&IxB2(-r9(626cqIs9RrR!is=+2C*D>G ztSkpi&vsC5VtIi&^fbLhyM4sF^kOWN44s!E-$KVC9pg$iJ8aK++HK`gwi+E|e83@qo?4EsSb*mNDZY<4Xl?`JeWS_ zk|4s+8-DX{GKg?Sr^SAB<|L;bMIWXeTYi-4=tR?wNlrV8Xva?r`j096#v{m7Q)`;` zIfe_QPyhUf9pb5ah_5p>I|D2uog8AAC?X7L{s{twz^T=FxSyD2<(gFNI0gC#w9VOH z&=6o2@Wr+Mr-n87pSogE;Na48N{(`A87CA@f&Z!IGqNL_vuh~8-DPS48iR%Nw=5`a zm%rLojxYLG#@IUWiTE%6*eW^V?i$KRw z$ade^>P<1xt7DjWD-Bee84_vcs zj9E8wUiT2u+8DQ3Z;8zhs3zMQDWBtMUJ>vj`2SwQQPL3462d7OG)t}k2DK{&nZ+r#`}FRGjOwZVNG=YKB>;IwWN#e zQvY+7jL9+LlhpUv`NPyt<#+utNF?~i*0lh`tDd?~cNPO;B}&4br`9@lmpNG%5}?mn>L)OhYTy9|Gq}J|hM~ zvX@nGaI$l5rC{rvhox46 z6*2<0B%^t1#3chxI6Z&j;6Y#lePZL1Cj*RI*Or#c7-U&(j?`ch(YW#&I2;<^p?})P zxAY|#x||eq>vdfX`d{O}3jrt|Tag{PCbH7<+~?(f{9Nm0&DHNdAih`0yGSU`L|{?T zOK_#mjNnR~Cco0N*+*0p);}!0J!vQ$!XfNg4(KM}#wsh`mm|%bNS;Tt6;eyTMlb!O zzzhFQDBfTGyVLqi#vReiL)dDndEeh@jzm~(IY{d%8(_mdz+AhS+G*4Z0WwFoN z*^s0{jKIjCG9EE`x$4_=9X}oYzNQ`YbBSGZvK4RCCkW|^V+f^=$mJI+EA#{cHmb2!^TDZ!+Z09dim%}BL zY}wrx=w13Hd1$0>EZ1sTuH_iyyjq7=17DKp!)S8`FG%1?0xF>Uk0D4{bFYyr(r+#Y?i^cBcwUH%~YH;Dx( z8CM#4`SE=dd)Lh3@u^z`~TUPb9;_tSRr6{)iEtY`C>z&g%klH^*bOEX!lxcW^v?5-cqvR z<&~d=ti4*(T)+Od2HrHjAr>s6M##=$Ed+qd#gR!r)Kv@tfyckSV4)+2Q9mTnDXrG$ z!Nin2rcc}&lR^cLsIu^GmGf_CQ-Wy9ReO+PHT)b2L{Pl1S6a3EH;DoV^8T3wSO3(_ z_;!fr{4kQ0mvb^*?Q^*v3Ku*L)`HWGj$FWLjA$i~mdQL`?KY2x^?!Vj36RGf2Qbo( z{9ce(>eXL6&q4$%kOr#%0*3!d?6p17k-|&^e}VeBQ!0tiGxKqzL}wE8kJq%Qp(aCg zCPD3RN6p{#hVb*vV}!uFuN|CTEC~I22lQp_7%{xlfG=zQ(-RRHsL-g4h2X3RJ-$TC zlaxAMi^KzXvcKlP3m0+1urA2QalaKUpUWTlql~~#BLf#VYU0{R=1J?d6XfLs4^<;8 z*N5t$lJXs@V%yG&Y>zt@#`V*7>yI9LE zO;FCepD!Xj_ln<2AJp=VTGE984YKkAfa#~c6P_YQT{csW@9V5zuZO+U2(wKEa+c+Ro2~c%y)O z8+sTt9MbTc7*yZrI!M7E?h{Q1LH9ZB52<_k1qN^?Sjeb?MNw~xZtBl6%+@pfwfmf2 z%M2sNbTCIF(;Msud$NHINEsetp7r*7LG^85mtKZNvB5XOwzMCQ^xf7n+W+L*y){8` zyxPNMW7d4cD^N;&-^GW>fFJeWM}K3m8q(<8k?)){CsV$Y!j=Q{HRwjV$a6v7CVMqu zem#Od!XsiX@RRGZ_5=UM`iSvW6dkduZuydo%U}YSF4EylkJ+`|i7V6=C@I4kM8kWQ z=Hj$+kU*+Xyi%3HQ*QVtk@8;}&W&uz4!jj+k?#q-PN2FNyy-qh zI%j23KmKdkDF0J)JdvaF+R;nH?#LF8VU5I^xm$Hcb&U28-Q+Ou4ym8~r^vH+ ziDF3{NzX+7Cj><89uRYDyH&N_Kb4qRd*W_xS#QFXwcW-UNy#Au0~2Xd7mQyti>yg9 z+(K$Vcy@mfopBL##&n+=;i;xHZp+OeKOOmY9n=BJ7i7mG{ugn7 zF`Pgwr%U`~LTcMLrFZDQ{H?oX-s+Fp zE5=3syf0dPEIx*VE3Z!dCq=kVDXWhZXQFi>{JsBq5}!+;gS_ane0$Ov#6$`AqF08y z@0*PvqO_q=1@{VWL3U0`qh9sEZ-Jxro(yDp=SlUbGqfIcoNkym8qh&R8DbPs2q^yk zMiOL$s!jm}n6)JuaF7oq&7*gNOYX;dM*V(>%nSHkI9cn4yaxN$yuhpI9|^}H1WRr}p0d48jHv}8-k`+>fe3#CMKjFh3TK6}!cjfmi0eO<q zUKbh>Z=;$7so>mqPIhyle)x;8Wa5W(D7yjpL4uV!N*&E3B77R4nbu7`>-48P~#E}cv&X!cphlG?#>2VqiFN@r0bn-BYMwN4sPz&4C`CJ_OFh##0xkED-^WXJF+9mW0 zfiMI?+`vzNM6z&LJD-u3mUJN)qbSFskUG}R$V+|^gvmBP7B8~4Xvx@bmk-+{rR5%h ze*#_p3idh)5(2(l6C$+l&M33yb<05bGi&jdI&zG7<)T!;}xz)|O zeuHyQXFuvIgYc1+91_~2agJKUoHHy;dy>c=WA&pp{C5fCpec@9fT$O_H+pVAVrPz; zEMR2)`}#kMB=VM3NDQ2-t!v6c&^Uf6sC}}M^^NXdUyGq`T)Oo_-3Te4rf&X<1+Mx@ zl*NDFdWXb0DgU!0y(F=}sY#t#h<7uj3`b>2ZiRr-=B&#bEb zV5$2$Y@aP$0>K{LwcFiYq8wk%QD9f%PZ?6<7BbCMj}wD`GPE|yD`HifC~x8W@IS@vtc7@t%)m zMAP}5RhvKqo1`h@*78QZk|N_diqfWr17#YwaI{QS-nr)oLqHCKiuz60Ue zlSB9<5dL8q2>rJ$hAkXTukwstOU%G6>J35;XCkDNu7{HAQzXnu;_1m!=wae8%EB6J zS7KRyVp*OVj-{TXUc#NQ(P&52>B4h0wiCX5RB(cb^wEe;&>amF|1*vZVnj~a6n1V=|IXqHKa)z z(qm~z#nPrl;6gh{iejzO4#jdNEW6I7M(vdPJZOlb$1?|k^X)?p!9HN?3M)*7Cmn*z ztl)qlIAJ*NO~QH){QJ)i!!+HhN7Il_F$}|Y=wT2Q9h$j$4JvG2b2M}6mVaap4(lUw z+uS_6d@5+e=+GE1lfPTSQiP8UJmTq>!JMKj(Ru}pi16d@Id zFtLMTC6Q&%nh;WN=-*QX@sqh}stO1v(?4pn(1giGpA?^cFWm+3*^0q>ah0{yqZyjl zT1EONGCcAu7&AG9wkse#bUr#qnkTIODK1`c4nv_8N|3NHEpuZVm+$cH>Ko7O?T zd4=~-yU4VJErZ7eZ-D$?WJTk@P6-GsdByv5NTfucq?&XEh$Y??t$$&XNRxQhvfPCW>~hbITP(DV^O}c>rmPJ)6iF{UD`#S@kmkv%xYdlVsN5?h zuMkG;G6LQuc|>`F#_d|PNPU+y`xZqK*M>(gy7D$pm?V{UdCraG$9AtQ%Xnjwd1D^g zSAg{i$`CN&Jcl22bXucDB{f24APD!c?zUJR@^|}obvE6l{Mr4>YaQ4yr@Xa!OG7f= zm;b4y$0Nt*HTxpRg@N3BJg_+&w>GB)`WhL16utlB%)Ns_l0=O;e?;&9y(9f5n`w!T zvO3@;H!`1Ehmf5AA{>$l%%}F!9lrPw@g^p!4uRmOn)Qh>-H=)_deeX}kPY-(3qO^T)nqMbbWP zAM9mh8YMN;X7*!A2l`iuY}MT|6D(wVhC{bIB#x-}(5a$bt|1`)*`f-3+5Z#_c*h^| zhHu_|z{z6*(JZ3WR~Dk+sYxn4y)Gl~>LA?yofxzt?>bZDUB?EIcWu)}wdQYEQUi{> zYt%_p;ID!gw2U$jiroDYBCg1)UP4ax5nn~r;7eDCl#-y5>Lo^*gP+Eqs~b=B>cQGi zewM0ZXc*`Bp)Vv7UhhC7-+q*S%Y04cfBjCqTB1aTcCe>c#F-7LDzSP#$#~6|Trp_Q zb#0x|bCdEibz~JYR*LDT?D~`9vtReaXLC3T-ei-h75)!z|aqY)C)g zfu>>u1Pj(d+U})Ac6l~bC(@;7t|}4|xC_xs7xU`voQe%_yr3z2@k&rrCs9IyjN+py zTaAN&A#e!-r`iXwwk92sUG;!qaXd!4)PKyP;`&F0mc@Vffix|9g8%NzASp<%i|^0_ z>(9d^sdl3wI*_}Q`v$tOol_>VYAaf<)m=hNk{PXbqrVbenwF9YwNkZL2q`$1{hd`^ zt`KTXTAQT~zbNh4$_9_+Y~+-3i0h5%1`Q<7D{0I_>>*wupgg4D9A7L)4zuV?NetYN zOE%>8&6GCeHbNcM^uNsJ=lNrBxH(Tp)TfARLVY$klb69~F>k$1Z~>-2wcU$<#dvcs zEdZ46b@E)jvr?ugbxy&>qgX@2v{{q9Jx&k1Pu{~~dieYr-NU3rDx+6AOB~woA0E){q{DCN7>MkRXw}fU{n}yQmgTV8NMDi;QakG;Ex>%5VeFF}o7GLJlOc2dKU1EX|3M}{ z>}yb8l(q+XHo*ksrHqIuC8&Xo*PTwO+15(z9b&%!>X=~7uv`y-FafEy$QRz% z^kI@dI40z6iavM~A$|sZ@QHrV-Yt?lovA>e z?xFJ0#)|%TloN4MXVQqC@^uJ&rC|6N#}P>4n0gALOtzLT)qhDR=O-Tu&C}SFg%wY& zH>8F%)9YHVkZnyw%Xx1ZI2SUW01RC6iT?;;CrKz%d`NP_fM;bH>o?2=t`I*6tTANB z2?ZXWD~=S_oP3VxC|j(`yMgRKh?%ws*3L!;BcY<}w0N4$6;jvSrdKQR_H%KqC~c1q zi?(>RxuSKs?9pnEcC>irMzJN*n|1NC;5T(=Qv4_DPc)mNT^=~|(kP^K8F6 zF>}9&HR1^;uH=iEk8|NZkk1@wr5;rwD{qBYl>I_;?9o;c6C!I!Cx^FONJ}U&f5zg8 znHoMDB~3{EdrR80u=%slkd8lL^R3q8!F&npX|lv6_pn*#F!7vw5XmmpAa&RFf>FDp z*Wf`&u9)a*@1j`H$HSpZ#Z$1y>f4yL4&#Z==rtLLKShPAY`tadJIYvX=`l&J@5u!3 zCU3Jx%og9GN)im=AlTrE>~n|bS=k*2vLo%+3-j8PZI>tbk|$V-#a@X2y|I?x+FXJb~s`Jh_K*5XAYI+Zcf zIu~m-TTB_o3RlMN=qiGAX)R9RYo3bPJ>ENYo}ygqJLjZq>jMRrPE4|MqWxpFz~9_>E4VW9pf9`as%To0|P1g zz3tS?_=rjVs7PmFAiU4tHkaQACi7=~u;9Q%t}4h22BRg{Pa%6$dx15I@r!l4$0}t$ z^YI{R#+KTil@R4jhr4s_U-y%#gKx@w&@c z0B3=lpDDT!a_D9CCXp{y6x^Nh{OD46@LMPexJl2n@Nd@Voad=&9Xz+69cfo-h?8-r5foXd%1=vvK2Bbm|e5i0wM3R z5lus8V+4IU1?(CWxL)>gzWCoo=X#?d4{52L0ZpD?C*2=;4Ji_q{gI9#-CtkyF8K?i zwa;3&=UD{4p5xQGa-yqtMQe$&V(P;Iv| zY-XhfI+u+_&94>td)a$9(~*#ZMF-fDsy*(m_$RIKR_pR6j{5DqBM6naK&m1Q0$w-J zyR1qq1f+S=ly8Jt=hjZ7AqTBh&x${8w8ax`^hRg-`tN3~QMp3~*l1LwDLYGI(fW3* z4%o_s5MGGiYYdKaw{mxJ$0EIP?S5;b@N+t=GCQ$dJqGSd_lWJZ-wLeo~T$alHFDEVM#`oU$EOZb_|!pm%8skF*cS!Crdf~$EX63fPFC2}Au{Fl@l;3XG4 zkF;j~7GfqncT3Q%XgrBj5kzQlJ0HiV^;wA9gSGxO-`0^Eml)X5>INIsTv=Msf!EpX!MF ztsMVT?Qt)*IAn!-QhsQIt33Z*&#-2&wpu~7OY1UgTN4qDkAB(6RYWcN=FPIV_M;CC z0P3!-lxB9;4_)W&EW?>M(}KVd$4MYhWB~bg5=gcN@?8UDku?qi$PL~Xj@Am_e zdkP@i+0Y_|lhv|OfYk4|E4;cT%N-!Ytl6HZoIbRtzgd6(A-*F6)aUzysvZQ?&{MSP z@(fUC2`E{^rfUTbC^J68P66a#Q@U%vzR3Y%y7o5?9X0|OCF@=PC>I?YehNU3WB|Hb z0Exh5KYoxU+jbw&au)y$IEFNwIzgv_HmU%4O}^IM#vd(hJX}ELS((okq@E3tXJ5^HR*`xp5(_ma^Vug-&qREouE=~gEcMJQ&(6+#_SeP9z7LgW z2|O}VeSanOY?wTIJM-C-sb|CGSuFF}cT&%M^6aNP;|#d!D?!&9KAn7qe>La|@wuPR zn|#JC3Az^Zd5q6-K9#o;Bbv`&GCsfJyBwh>rN{QAj|k|ow1s{@dMsMMJzCptErVb$ zu%`P;juX-zbJ6Iktzzg0eIOk(+FZR=B(Ey)_$!7NV~}U$vEf3mq29DtR|r zzsG&J?Y-5t7=_pG-~Bh+a|Vyhu<0$Zby4Q9IsMMH>i1ZO2VZ3qF=tgp|MU_BZ7OtNad?Duc4}y#YK?z#rT+&!5B>C zlOI@FJU*NgAlrQNWH3h^T+dYP;Lpo&^`B*9B)NJ_HeX!`6qtO`djJgn&|MLK+`@bn z;ivzisl{df=Ys`h5C;#n5b8WAS-{FVrxw?^;?0CXK@RBr&Whih@zfn}$oQ2VujyBI zNPKd?-=6q*0ht>=OD;L_)8sNVK142Fm@l|Q0x3x7^D?p-3qIkA&&BUT6zBygqmVfa z!A;o3KolgFc;TQ!iRR)$^*GBH{&JGgsEl1qUgIBE&7xh2@FARYB?5_NFO~R!n8z?p zG!l(3FjW5MXB5}?pAUJ-zj6tWB_&!JMMyzg!cp&kKAy`3OF+hC-3Hz4xi4 zjED81{e`U88%&U#Sfvb$D^}^1i#3thvglvQ-xadDQo&docOSKmcKmIuo7~aEK8JW| zm+e^-JuN!Nv(Wb3N!}zBmBzjbaaa!Gux#W-h*zT1yphd5gdU2bNp3u8iXqK&+Lu$C z(LU(e3mQ|*Bi_L&-Q@uL*Vm)-yK&%!o#5~K>~(IWAl5Xmq>M!qSK*6R`s~WQnDmS2 zTc(?ko&2+wB462SRbZHmNT&H~boI)6-kvN$ygQEKYwdJ3aVF5{-@>ZTZc~wP5J`WtrmvYk#7A65p@+I+lzMg6y2>n) z&NCu*HR9m}OqbJgdszX`^X*v$>nih69Cii^wHKoQ`SL>9v|GQ%rp;QH!+lqLBB5`| z_?;7->EU-4_O?VJ<6CxojF>XkfPeVqj>A*w`yP=>S=E!Hm6KzYQ)FCXm1X8KRW8=7 zDOPnEB2~f^Uxg~57nL4~bsN;oplIpHlr_bk@`RMsnX<~@{41wg%ceBwd_T!VS!E}T zo!&i*HUw$AkIxuBpWri*&oz8xy_xas${bI}l}q%GjBJJm(yXt&BG)I)^L&I7`=a5! z{wK5S+k7lGQo2-n$e@55H#GH{`GUMP?3 zIg7s(n;RV_OOzv`gLP_M#S%Tm0!7nDT(`aIk0_SxhCCWMWPQakdsg1;b=5w#Mws;2 zT<&@zopa6N-BD+~#+rV70yWO>7SZ(Wx12B$TBW-3CW`1Ok%4#q>GKI~V5a>OazdSv zH#)D_*F+S)M2pAzl=>wHjEMB|gf+OY0YVJqiBBWGEPuWT$OweB#Xnebbh;)3pAb}y zP1#BL!D4}ATA8uV>hYldnxgW^0ax=Z;ioUQYWhH{p<_uzq%lXV ztWSzZ{bF|4=!s6s;?1o1IsUw|J_1y7@%l$qONhX-0_Lx}h{vu-`@~3WqFvJ$cscxU z3((=*m~;bA4zH0W z>y9HD#$C(x?dv-Baia7X)z5`m_2d8gjXbJT%b6Hfkoc5bFJ)5>C5{TH!8|wKB(`Tc znqz>04XTcHmdQBJ9IwZDrWxl3j(m@m6ANk_@8q5~S}ZGkOrx)8gSRutIFI$`<-mCP z^TfAVM`8>XG0bH}z(uWpj8x@wK+t`4jo6yyTf3A5KIWDkoQM?@Z4Rk-#eSj`@&`ZW zFIkly&XHoP`^5D#ZLC>8e-FQHF$txNYU*4~54-Iv>-fDV<(k_+VBl5S(d8=4&4t>+ zcP~J3j$Gbw?~G1|M(%O%L`FM385K>vh&{Smauz9shrOB<&FeLCQvRSfjS}l%5C#pf z`T1VrMMB!5*jNVID@XoZ;$rI4pu&z(qixBhj^eQ6aiL z82jjrW+7tTr(Tqb2!GG;tzo$KTjEG|F`g%_cd!c)?Ah0i_m3*?X5X&%`F=n6o~TB{Jy!JPr&eIz*K41BIMiMn~bYLZ0_FyNSx??RW?GrAWv1)1rRR5y(|X-UPQkc_Ym+WT}fn zOpb^9c>IS)L;0m@%9cuk@?Dam83*vU&%!=J9NzAWbd2}63fsB% zwnA6<;`O5>8p}N+Ws9LR?LYdOq5PS+co>;JuVne#1Vy48uQ;!-EeL}ma?*}xj|L@=&hyI(2jB?gKtcik8d?pHMkgV-^4?IY~1s_yl> z8rfS_4@9dTQh%W+aiAYyQZa?++anUrqBB@D^1vC?vbg(P5pu0nLmFA9wQIo{OsY$b z+0V0e`q_4MKxmJ&0PN`7nfBJ~uR5Z_h;0+`9!e&1G;R9V;_JS3_^~jw^{k>=|5XB-4Yt6w-e~0p%r(!DMnEpP*=2Y)&?{_|Ee1ZI6qL2`~@otZL zigB{TRN0^BDeh$BkLauzPjrxMe;zv?geEi!w*{RQ38Lt40hYu+C)Wpm7173t`rsQf z^}#cYKKL`%YoZA*+3nteoFV_i>4O{8OAyDY7)IVqRjS$U;<~%Gqx;Ta9O)3TDNF=Zhv2sXK^0*qA6#wMjN+!2($KC#A}hQ z1-ewa&5Sqv^ZYb2gnu5ygz%vMNy6FT%01M7SBNDK$9HoS9nSyb?Ooubs;1e1BpmNsyu9grm?LEGd!w5;v_Yb<5=pot-V)UEw-2T z+FROM#Yb&IXab5nlp-o>RH{2pv{5Joh|KT1_BrziB-Y;hzkm2-&N=(B_IvHM*IIk6 zQkVKN{HR7Q=(j;erJzAAr<3^Cz*kG;LOuynWiN>YgOUJJB_fIVPS&JVK&sd!5x+X6 zfK(wyBEj601Z?IBnM)$Uk4a$FFje-Dh+mnEPZe+^;-9qQ!xfx&U8#bCM3VdaBuN!Z z=p@yTPY}eiUp)pkQ8UQV(U-dU1U42vB-8Ue+&3q$KS*Jwea^ge_S54!u2LTJXMO7YS(V&N`<{=nA!}#%E63Wg|3DcWo;H|B>S;NgtvP_L za-$8)%)vn-%&C7Cw1o>9Ic@HR3#;mLY_^RBo`#>s!__hg@p>BWAp|o*%x;kTUX?e6 z)38a()vmhE=4rT(_@;t!gpq_xd)pePyRc1MAY5h)orF4iP0Z*uZouyDn7rphExn;* z=db)4zL1W}-h`e7D&PET_k;W7v0EOI(nr-WpFHnZ-*cT{r>RwIc@}j}lyXkv)5y)q zp8!ufk$V(poCz|0h%;VtEn4G8f4-R7pV_A=ml?w&g?4z$E6)hqn^M<=EN)BSa6sKs zCY6gT0;y$h$UY?VqYJe3s-~Vrm9>&HUfz(SofVqeMypXD>o^H2@?#pn$v$+3@0Gwf z^StX#i>!b?ErLER1f3TNeOj0UwD7^e;LH1h|C)gR{P0}@e-vJi z(-5x@)Pj$o`%_R(Y=0{0t2^vpYtP8A9qpO{J8WIw;?|#D+`rg9%0tFJV0oUt<>d@m z-nmtY!zIVoe);dmjaOldK6D9-=qmWaSUJh}6-y6ip0;(QBK3PX5T*3+L$93D!)E`M zrj|eMv*6!w!?xQz*6PcI%&02 z^iNB7t8bUc^bi3#IM}Av{*|s=zw-x0wvYJp+=m_*f3x^o%HI$8`yGFK_&dzsnaqI6 z{N2P~oGKY`Kl?>;im{zlCuzP^kx01oG2#5d|3hJOS2*}^IJi-c*`rVxnKC=znsTG3 zLF~Y>5*!3I`u{Mc%u^p_LQa|EslQF0=X&n<{~oV8*#AaKN{aDmQ<${nk_(Q&e$~WC z)UNqGd(mTNHx)XY{C@}!ZuCD6!$!6uabB#XKOj*=e$pZDNy8ZOW$dEMG{?cfZ8rj@ z;A5eaF;9K1#1%X9GR47-=5d!QlcXr^FlB!xP2uZaF|zKYW>Vh$JF1NX^bWP23O5`v zf(HZFR{DY}kli%r4+sdVs4#($FmUzIj);!JT1c7B@f@Ad{?bs!poe-C*ib28#<^a7YLaz9m1|w8K|FhzC>7M)9y&=X7wK88kiZIh0KSz zH(49ogtehLAey@G{5k3AE71;rWr^nu|9*8T*`$*nRb%BX*}-s9!p!K05q>>dW`u>G zrwY3{Uuu_HdjKSvmU16m6!_neir_$bF9iCd>iI)jnk`bAS-fIuSPx^X^n1L7!BirQ zaP}4T7{S8rdwrOM#>cL@DsCiPTbyBE(QlzBYSK1qFjO)KAZ!_rna#*M^ z@}Z}1ujDiUt2zgv#RM(%8Y)6BS7fG3$@wBnf#qLmBZ|LOtD}6>cF3r}`$wGi@JJI1Y=11IC#)$KIk)lF}_X%-fF$-e6 z^yxmtI7rOg4|gY#)d2gk(B8;zyEqVOeq0`M7daMLY&o;~P{Ss(t~0e!5X4i3-R7x3 zEMs}S3q7B_Ay&f85@V)5RX*{YL`7YZiG#USQh2n2J3DG>mrQqW!kZGhL&7wgcOco^ zDKA8dCzNxgLgtW3?6MTC(_VHtAFDxZxs>P)0j-;+HA`{c#=^5rU&6B3Ra z2omV;(C3`4f(mXzc!ch6Pa*EC!y9xloLbgvx=7d+>rn+VPT-Ukal)@Sf2%8Paq@V; z{o=~6CP*Ue;clX*2HG-EeBTPgoqOfs(t4Ee%9y3+qBHZflQ&quyTv5uc-e z4>Np+nv4HeTz$Z9e@u3b>E5`Qd@ESJ{sWeAEjAN9_1(b#e47Q(9qJaqVkjBRTF+%* zXrCp75OY zZ5Yu~f0GKX*&V%_QX&y?N{o51-S5dR(V$%vi-*rmY!v=RLduBe^#L}EhK0P#KDtp* zCoZ&&LZr3N`U+iv+f5m3=_V~>ohLF@pD|~>;cw&ygi(4=yMMh|8D@;^zm4*cn-Nqb zT!xBjGdF^PVGk8LCqyr0ziQMXSN{W+$ko4*f=!XDPQr!n#&RxosH@&KO=4qCZ&NB> z0?!M79$f@qaI2?bluYkkYQ`tD=E-e(TlYMPRZE!$cWZG6;>i+Mo{0gD_F3d?@X&$V zDwI!&zpN!b|5nrtCB2jD-8+0GuE6=o_RXnSh6N94oO(`l;QZS{1z*U+p>=m z@R2?E7w$mxS!(8O{}ly{Okyj$`H(2w?o~fT2ahLxo~C~FLVO?79Z9lfp|dOYWF$EO7b`1<4&gf`WhU|Vnb#z(G3;-HKE&jg4f+rpv>wFx27OcNUY6Kq z2Hv2@=neXfsh`;?TYqnL3U`AeGu>(qO<;&RBkVaTqZ{9!A5U%$bzQ4ivdO)nFAKRP zto^l%ajP||y&>+g9etUdXa?h3>M=O7_+8r8(uu>5%o(N>6z6lnF_F7AGSxt#FpKGn zGWE#o2?eZYgp`Y35V=cGlTOmDll(VyH2aLiJ_E)?zeq2q@Iz9t>VShntVA4XO$&S} z5}7L__3o$Y38r=JpKjy}#h~&?#4X8hA0z8jF6gU@PmYWBobyPlJ&+fP$W179m(J6{ ztC{Bk37o3)G|KCR>B{&As{y-KR_+Q+~-b(7Z;>l4y0c0A+yiqCE4cOzJYo^ z4{Xn%z1Cd*83Jn{dj?&i5^QbnT%45M=CE2$-K%r|L@r!|POOiwIm*NSL0|o?jgu4l zTSF0~LI@@Gx6JgG%bk?_j_dWv>no2PjHg-zjL*FCIGqHah&Z1^e;WF(pFw~YxCSwrM%Ox2GVCR z)5j3smznlCjtA5hJQvrEOba&TQi?EZ;iwUN!Z3jiO#m zMOR?nPw#+nn*f>}5zY*|^U)RL8e~(E3x&Z*5!%gP9Z5&7n2X+Eq^Q^D?+rdX|0Yvs zuoe(PthUSWSrd=)g}v`VXkBVlIxEW6S4kzfUGyA{t4QA$!QZ-V?f|U*i#2x7VjS5r z=HKdf&y~ZI2R+DQ=dFJ4TzPRV(C3PO{3d0-A)om$iLX$7>W{x?ohOu$Z&r*`9p{OC zDAVmsYBh0k(6OnU1XLLGXnN`|V$iMA#7-;OW*O)Hbe*1)h(2eDgX(Q??X7D%=89_~ zu>`=JvfY3RwBv-9szr+DQod}iHt|U0RxPL)NOzZtTBoT{!i7yV8H9#DoK0osc&B(V zzk>Q!>F#jaCOe9w(X`8(<&Gx9DjJ~Yoc zoCl&i4L5<2-k|9I%Qxvwxk7@wIpB@P?hZ%k|^ zr|awP7JYCWBOoZ<8J@QT)mE`-l1XD59UHxYL15YA2M9X1m6Ea}ZogFaW`3_5M5?zG0~*=^GoX*J(dvVc<$cGx41Sg5;FCApW_NTNNf%JjM_1?zmZatr*HlbqY+~^402(yLFRzDTi zn7@lPAQGB+y9=11zUi)Ib*J&fwZ`z51-omRw8htXTzxB_ekpw%&`wp`%y#!5YCRH`$|)j=kzpcLqn+O_oSOs|CQl<5nZ^27)6Od8)D_w5RN2P}8vlJ&;S9=hWi zBLmZBamn!rqr8vgxX5@OHzm(Zgmx(Ekq#7sw@9x)6CXxq?o}_3rlK>qs_Q8#GV?Jt zohJvCNYP^udH6}e$IQB4#j#GZ0n`V>EZq2Zsax0)8Gux3P~+!YOTlD*bbvIee5wHf zuQniX9+is|%Gs&K#F6VQCUX5$7Ucf~xtgT&lZ=KmUX%TOr{eqtt?H*xWXY!Kx6V6g zRZ5tqAFI`3LTlG9qQ^$dIDO%4={)!R&Y_+0fwJ<@Kd0Ht?4vL4jO&Zvby$=5Y?yDYYvl~j6EnF%UBC_M zU5;&znaX>`YTX2x>QZ;Y;p~_(Ocf-h=uJb!}RRE zU6*X4_GH=eX7;BnF0U9-fX8_Qtj;p0T5f_yd8JRbc>jxi6QH37do~wD~6LgU4xI2 zTu$kCODaEcNYzvY@X1!yw}dj1+s-7fx`8 zuC%vyHU7>oz`!1^tjiV*r|E%W+jc>_ZhM5blSJY)$Zyq13p@8Sus7Pl zHO!9{Wr;!9Ue@~MVy`IT^vGg=6FXPuRo>uufr}lhn8uidb)U~dZ(}kf%%8H*#b%LS z=)IL{D3!GO(p>7gzr2iuzP-}@6l15ooQR7PIuUnQ+RKU9icNYs>HYt}%gH`!Ql<`$ z*ZnCsQl2NknA4NIlwx@~X(0*WLRnj0PI|+zpmB0yxi>L=oAlnWY_9fgQnONMT(0Ec zI;q>yjzwq!=p51A{2cC0uG2L-&AmyM2^EkP%9Q|!%2Z$XCNEwDF}<11P^CShkr@4p zCZQk{6c!@0>`j@)tc_#F@~pgL#`RbV$FXM5$}dKolciDEZq|0@DkBqJH&m#ft&rZ) zK20>j(s-NU1aG4thF6noSWkWNc6_~#OXAC1OjP4|gsUV0?%ZOXXc(7obJUiLsr)d| zIrtkB)s8?3TPO$yu^)AWY4G(-}HG)@6T8wl^#me+P!U5t-g_- z`uhcK&XQYw2jbcEt-g^YJXM_ejAY@u)#$;#c?Ud&^A600*Pz^J4v14yefp839Ud;7 zT&}N^8yuYag#93A#`|5AgaB(dX&Sw%L4SgJ_J+AIi}eI9&2SM5C-ycL#8|u;-)8cg z5J}l0H@M*u79K`+6KduTc`qlZ_oFk>Djc)E|M<4x`}%a<#RjF>?k#b8h4dMb83J$G zVWUXjNuSnBk?$L84r-;+Yvni;7l0)COJB!JOB}iSUdLl0{pFqGF}2`7l5}Q#TATCZqdxN^ z!T;z2k0$^)+-1^2or-1Ohp32$WU}v@G z4eQH!JFJju*o^t?)W((YI1z`9lneP!5*lhN;Z8o{laJVo(Qd|^rgjW1qJtEQg!&0T z_T5SMIz+#@xgY)JO|m0=21|B5@%mh!xOj8X1q}J^KatT+-apRL`q*-xK6{9+9<%i0 z6wkv6{6?FFRF^yc8TyWYk-p=PHd(RDsPr1Mpub^ZLH!lG%?FDQYP`s0nk1Kd|BXdi zZABB&MJb*rxBWLh&29hU?8c&OLT%A+8^zhitkL13?C{LdgxI4u5yB_$Y0+6`N~3tR zF)JrrG&(#p$0*JX7v&n26O38ojpA|b#T;X#d}tSWuw6*`x%_>T zKgKJe-%@4iw+xp~Z3PQ6=F+LALQCA>!-6FLHg$YY6?$H(g`Q8CdpRdqFkN`ad~%2; zxv9Zoy<55~KlrhXuepA6ZcgD}4#;1|1hGb-9K&|yVSEj%dR};rdZKfycBa!bQZXzk zY3MuM_v>lusm~KEKhtHU=H9l<-u}4EIwFdjEOfv2Pvh=(VM`fXgUV#(!j_G=U&jKR zg&$BBkCc?4z%IA_O5qsqja|l0FG_Z@z^?S22>J~%ZxI+FOYBBKq%1LU8VV0^zp=A` zBbZWi1bzge(rB=FuIKy$Zj5YGE?|M)1za;VATEeu_%4bSWx6ikiNMcc zFXnMAykmVOW_;8un(f#j>-$9T!)QGmZkWxNu?(n%6koxsM!wH{la*NVMv?$B$7^Bg zcuh>;+f(?>f^5TU#3Ha*X?{VN&0+QP(n7{tb!WnoRdi{wZBYI`$+s1Y)i zF=%<`wVX&(Urz(}C=fGf`}y)4Dpg?(0T~=GFk3sG>6^DL^mcDz2kzq^YvmU-)AM4v zS-%xt)6c@!h%zk)PUqbVz;kiYni_ilsXMAUzQ5=*zU-pb5GOZNkx3aJH;t-)Y1LpY zP4+zTQglYsmfYqkwZY+@CyMM^fJ|uUool0cM08AP4#FIqX@5qBl@w_@^8A)}TtoI4 z9(n90)S+MSb0XT|m!mGT<+Mf6T3xNR8n>$NjMlwvEkPK_bhv4I?SQ&L#|g8Ld1X^y zCyp(G_Jz#-QE!c~97g56CL)3@bb3oq+EiBdwVwLd$U+~BX4~`lW@wpk+LCLOqJ zFP{jYxNP5!ja|?}kJ==eO5GeUoIf+>9cDbmN+7_EVZQyr5qT|Tcv8Njnnd$B-MXU} z8m(s7HzbTYw3fjt>y1oDS?xxGyE*4#?4h(L;{HDS zf;Hr*iJZ+kQ7c}JuW0&1_HSv;%IjJ>(oU799-vusWe8@}{*4l%&T`w5WpT$MEx)|2jJq z8sFgNc}nC)Xu94|$9}`Szq;-IR%vN(E8MzUf4+nhciR%PBKT&K!{bQ zwfQzmsXDFbdF_&u4#hO*A3=3<11I?5-nUg<-NuEnQ6eOS@z#;0+h_ zd`aG`Fs$G0wcKQD-!`pdkUTYu(v#=zJv3!@xhh8*qGvk$Vid zUb|V7mDh7&`32^=)FQb16cuf2b9jh&YjY^j=xVR}^O=IKM61oNUVfB4;G@5CtZ8J@ zt>52LWP6vtIa`WsJvOefCS;P5eU-ON{3~Z*(Qj-1=lX5mU>Q*1QwE)zC`dD-#XmhP7( zUNfu`4?(*Dsn#})I@9+ z=klHU$1y>FccO`y~Cs84lL3uXreq8TW?{F=u ze=+yhk*CYbaoQ5bL>oY)XlBIG`;Q)BqhGH{uE*6kb(|Py1*_ZCcZsta%VR+O?EhPP zpSFa(&mq+AU$OTI37%^2bH^E}+5Z>zK8G=ObgDS9m4n6Sw)Y7QEmq`p*IwJFGXDqm zK6SUr6j6Ie^waMDsl89^scC-n@B$D|OGkQWo1^VI{6-36+eiyFFU3rcOZeVN3zu1@ z|1WW*l4Z_Cb50F7pEh|DBo6n(`jwH}^Iw98W8C4ICPtz}$g1tjh}lrMvS1AeeCI;1p1MVZ~}tt1VCm^w+Hd z3RVJ&JDFm45(ai@N3=}MmKqMB)^#mlPg{xUoq*k2Y&ocZK+H(}GV$HRno@XH{Sdh~?!Dvq?w1e7aT@qr>w8!RinlU_ z#~X#t3Nam1guh z_>i+;=oV8Lftgxp1gAbny+e~ZD!{wf-d0VAoFBUMMub@XEZHJ3=MuXLprh5^ctkJ{ z=s6Nr5dHZn!eDLNbv#D2ZkNu6nMqRdT9RYw9`HI*i+jqg__#bAB}8-6lJ+An`xtqd zmXxUnhhZfn2Olg#wV*}N&R++esx2k*F3!?0n4#9!1BrURG`6@xZjGL2SWqlGkBTdA?^&!{(1{K53jIDjC-8cnxcV%elY zD6vcZnP{R29<^Bzs&0R-w4dSD?T^D7RGp1I8+C6YLmxOR6TzdjPxb_yi%*3!ygFCl z6eTkBfpcjhc+_S&lqcZ4O=G1#+BH@p^aU%FVHuy_tOsVZ6_nU;&G{+v+&ON!*j4IM z+u>A8hiGQ?fcW$Oc0W!_V9`4?-SYYEZ>RO$kEis>{=e9d(NvKx{+IXTw3Pk$w}NRB zw#5Gr_G8^`dOyCdPf`C%``d~AnCYQ6;)v5P>p`|*L0qP;QhGNfCoxu*YBn*DAS{h7 zWzxxf)An8Bnh=#Z63g2Xp2LaJ?zu}8$&uYhzH1Nd@`QsuzGKMKk44c`*`xBd`98)` zF5Bt4Xr`mBA3wPkckPQf3WoXnz2~T6nR=U^fSeT-h~E=n%;}9R9TR%5BV5!QwNxOU zlg^?Bs6cdcv^^49)8oa04H^UCJF;$AHp}pF`)pZ-m59?&Pm|v}t*-q@VO93a~KJ@#_pBWSPn;*;F24$Y$CT3Nq6;~sp#8g2P6&R749 zC^|VTsrW$j$5ZKvDgE*j*;&@O9ZxL;4+-zJZjpZJlG}y9rkf*`cHeH#-Oupal-cM% z@qpU zzI}n=!aw&skyhC9w#%{2w=a0evCHv-uap$B;|rgC0yp$dV?PSJw*ah)-2wF>{mC;< zAfLQH!GPSY_9WtfM*pYA{V@^81huKQ)VQA{;`GYdYhA)f#|Cu=d{!9;D zKE7Vtz#v!Wcup&#`SX-nfkf&ND~)G zr(AwWOWe1{O6)+Uj!YHZEUTjQ0pzslO45@4ii+-uJNwr0)bl>|_04ey=ZnT#=mY1n z;kZf42zo;;7&kz})w%rdq2s-QiB0yaGlCa|j(-}sxM`aG>LPpa?9lO(fzeIV(ylH_ z3l0q(j|DtU(;Qb9IRcsIG>5j?Mdf}zDwxhq_Ia(Bc)6Bv4m*)06vF4+H~*Xh=(7NQwil7uIa zNLSiR?lM(w0qfSlrfXox^1B3Bw+42&53o~+ySUs&d@gdE2izb{O3p`A591T^eI~Ot zA-|%FNlr-8iwg{wYL$`q!wTxF@+$Fc(Jr-N;CSri&rclALR}O4#Xmu}<9BnZhw+n} zVY zzcr3cEPBb!LJ}=?*1Irn#SsXm$&Vp6d{dCUsHv9C#uu^LS*oXfn^PRYSQ2QLO%Qc# zo#*a1Wv#x2`&!e(@rul6Bs_Yau}7q1>-Kz*x5c+D9;!uU`#pvGaaP+JYPNgsYdQMr z5Nx4q2K!ix#1fQMrq;@?WND17Bqr3+5iaSC4o5^Vq+Bf|mVH7HCh`QN3B6_1H9S8{ zolkX5*&0T`rP84u@3MoD*DhVvLf-A`ec9CDgMbNi?bQK6qJ>BPqOjmd_qR)_PvIZ zm#6TMDB6TRGPl7@a~o`T62LZi(%c3!*#=Kq+hDP5gD0(RuvoUilh!s^oVpFN3wnL8 zt-#_Srf)Ife@^q!{Y*YRiL3X^`W^wt#2gWs|8gJJ^vUjPTQ&xABCkyjpo4r{IDvW! zcRO|}KaB$K$S#DHaPs;aEPR~IrxFd)*% zWUGP&Fs%CBH;Zg41N>Q)-`rZ0sU8B*j*80ahdISpH+EyWdgP5uXYdNZ*vN13YT(u= zIJ|mCpMXG7wIZM*Hgc(?c7katj2`m~QPv1*KP)`;Vc>0elpj>4@|(-b@U0XZSxtrw z^#s!8?^AebBTMzj0{ZwxB08EQZ^wMe6G$s)}}nu89Rc z9vCK>1*p)M6~-0PKE#>Bt801TuFObvJ6*SLerxOsX-RD4&7_ULFOd4uw|0+n ze8QpQEEEKMUv@7WY!td2g($8pb7M=C!^a1Ze=xwdM2}UdD>+LsYB`G@5i#;}k4a<7 zoKdH5cfiZV%;&p3zZ=Ggb)(|jibG~8mHB83X11koBCTEJFpg^Ub#mV&h>K%r@AS9z z$6zMl7{aTfokC}lv3Bb3$YKjKlHx*RI2(dvQo0A zx>-J}%+Ej`UX&-`EIB+>QiX?Z*1yl{Ur87qx>f&fQ@jaJ8E3j zC7XaZivmN7du^LbzlvJsWTFae!Fi8N;Ze6)KFa(yTktDS4S`@rLp{9qJKsfzDJuG3rY?_skx0x7K7;SIZ#RP!-x!!p;gB^wf*}*2`aS zocF$ryo!NQ8~q0!*+{45Zx@}r`b$Yb88gB|C9t{-Tvt7gALWw@%U}<;MsahD;p_Z6 zKh?RCs*BaHc1u53wWmwwG@_#EO|Md#7wntXIHmT#1Vu zd=bTQfI33Ojc!t%QK7zUrE+0{;%hHU=S+H)*dBEWV`EHEIXo&WViVM847$m|pcxvU?EYBR^$z(RxlMl0-73FVG|TVQ zXZc-n&q$>oLl5Z3xtsMP{c-&myGcJTd5p({-%s!0Vfbwu_Ufl|!+xF-ziY!m`EEGC ztY}Zq;oZ*vM#*KxoO5q&wzbzD^ol~^Rv%fH4Yjuhg(F#42UfOYx*cP|{I7yh-jQ^|0nG~aAm zx^7zM+B(qeEqDQL3Ekqt!kDvwcDLK*h@!U=^E~kyQ>(gulXaf>{k2RWrj0orW~a^v z-4itqwSnGmcjoS((;|Ar5cjDr@-hFz4fin7!;wb${b9ZQK2$5ef4ozE|FnwVCHMUB zQT>QKpdSwf^rJymuY-DcN*sy1F^!12;qwqmAq_a`*?LFCQ zu9S$shlL?a1#IMI8M|ooe*>Y4?V@u!$WhjmkZG)viBFk(m@D{2O$^jc)_d2vo6Wsz zT6SG<+as@`uH4X2FN?rlGdRA?J@vn$b3%)|LFVvF^0!CU9GLC-Iaj8UCZn%A%ay-f z9E)PP07WwY;ku*W2`v5=T&63&`JKf`Z+pN>R}?S)PLK}FZ!R#iM&=y|W4WytMXMq0 zL;O8qobk&(vo4^?@-{7iOf{0;8ucmB+}bWf=}zU>JcsG6{6pg2Roe zz0^Fk%O2J*_;}Y(5twJrg@HBMfB4Qz^S7rIE6QEhbK#_y5^+9wv{g_-U|48Zngzmv z_o+vu7ed?8+S8?DWOi(jkfSX&PN|;yeEl0EA)!IMSLE@P)SJn8ECuW-t_wWA~W-sE(cooTobo z2iTY`zAYS_^mrA7uaJ5|ujDsxhpI2&Z*uyB_8V-TA2ypTj_R_p#kNJUE68j^y6O#o z3-Kj?c^z>s*kugRU&_LZF>}bE^;%nzW(9UH+93H%q>vR_d{}r3p~XG2K|IJj=gww6 zd?IubMn1qNkYXe6H(x|KFg9|%PShPK?alXhD`i zZ*JZE0G-*o`F{DG&B>>_-1dz8_zo>UtJ1iJ;}w>AEehckIKaL`%Q_hjNxNRs%FjPb zE6bc+*!Wn*J_LnjECdf*XT}sPZI@t;63nzO>$DFf(*ma4go955wKXcBtmy4vgJdZ` z(K#O-C})$-X+_6#axSQ>FpjBtk~i~N$!lu7avf7}jV@dgaf3U&rdI`+HdSQ^7^VO% zywYv7o4FRuPeA+_4xuGhQjRMzDaQG^$~-qOMPn>+ZkCE;R4ti!ACozr*ju5dpOTpK zK&WTf%B6^f#(ads*KJf5Np?;^KUSHK4)ZY~Xa<@OXiQ1zTA?4+=3~G4D1q}x+(z>; zZk7Ie)_m+YABXkBi2d$EO6Bj*{I&7-B7b}Nd!4^``0M1ao4=#{o#Zc_TDti=gFhN; zvGeTg)z#U*v$o&-N#^!zM#?c^sKh_K$%;SYwD^l8{y;qb&{gsL-iTb}!i|l@mudJ2 z4qi^g3olXP&lq$vR_%Vyg8v7J-&{>s$`mXwf9qm){kPWih!@8ZV)=5Y{J7-D!4HT5 z`KLA1q!eQW`1L&Y3;r3aT@A6-=NiL}+r=bEczEbdTV1=D)(GG3T&2RRUD0$M`HVKV z(e693?0g)6Y_?swc&lXDLKbv$_t{A9JHh577bd;NTY27da4y z@`66pG5XHfHstx>`DW5bHJX#8piM;2Z+*Mxt*Mey(~;Wwg_w-;chIqAs#9`zN7i&d zRZ!>=;z;+3zbE}#K7Vrb*f&eN6??;i`3|sUqC)CN7lFa&u$emiJyoHXY?s(-ulZ}; zYj6JUA-k1Kcd{JazXZ_$YPx8)`V*LKHbzcrfAoM2lO{8>(rn>*z3kz)wk$$x>LzrO zL_jSJO0%x8wF1KUGWk6aGRWf~C6=sY{MA`eo9(I2Pi;0|OVGjjIW}@PEkC;d9CjWm z3iio{@dne4*4BvQuGq+2=^Ei$L0RO;`)RM1xB5lL#sTDBx)gAAm zi-Y6(=BXGky_U9b-=eDwH599a^PFs}u9t4EuGuNgHD0kw`(oc*fS`l=&tYHbuI*qvAf|V?0@)G zi*jzX2h)swjq`fuvp#RKR;P&Jq#m11(9ZnkXod+@ILM5ua5}9ivB^rKr^M`_iBj~e z;~0$X@0fH9&GKrIU2Npzqz`9=Fzj%t2{P1kIn1S=%HRcNIie)1cpVUv;B|x6g!*GE#ZDsMBqA&M|IvLK`^+ z|0a$5_hRy)sigv&{<-$h+b0|S{~5j>D<5~bImiz;T3S@vMzCH@<=jp~`g(Sj(XvMo zlq2%pb3`aTc%!|^|DORTjJRQ;w?7S6dVvsi5QfC3em1#|w0tpetE6|gd@%UP7Q0US zRZ%TO@E9BUEcJ(i8DjQKrx^CAUGtw%f_t&nMhz$+cyWGnc$U}UKMZ{s+GAr;hraIp ztB8DOpPxxx!+>=H=|2Q&W<;bkfQanF(WXp z2ECF8%W4MEBr|tli{XDzr+zqGoTZZ=leF1^yqauqB^>Hx+8@yvX$dNn$ey`}5 zcc|liy2hCwi#lp9Ux2M*xwO(Qvj;kVfoP>y8^>Q&913x%?w-clg;jWp#ktyp?3{QWLvEh4U#hw zdYJ=MqEdZwzSZ$Tr_mZ6A-Zi(_sjI9jpa_&M4asZ?DOo!t1;k#HhP@z$?0aFpwGYv zu7TK%%TmLUBvqhFmtpMOFh$6s=a`^1t_nI`lkZnZAZ>q>WX8u8X7TDqsuEh8ZL10l zimk|2pL~aY4K2y0cDdBfav=Vy&;*lxfonoOTfh~|S1;&fV{BC9i?!Dx-#Qw|D5^zV zbUg29QH6RR2|(B(tl%M7d{AdzD!t{Nzd+`Mb@t(SwSxM|!GS|YPK6p`*3y*B%3^}w zmrfW$8trGQzA!)Y!BM{XUDi4-`F;!ye zcjlNMj6`dVo=R20v#P54I+_@nm5u!Ym{B(6r9$DUqsbtB?o935MOPYkxOawLocWh}ciC62yCOKY{qrUS_VpxP&;okNL_5T^R@365Op@?}@USu$0u@(nT|CXV)VKAl95d8UB z_Np0-TD8DazhUS?W93!4rB~fej8uq2PC>V)B|R4gLh!7L=jM{4LTx#Z3E7riRd+J` zAB2A-zUc)l)njRdx#Wv*=w=!n%?kCn)_87h&Q6z{W$Gbv#wEx|!{eY=CqP%73cA$* z2YKp81ML)83j|hc^=7HRKjpnxzf+w)sB^_z%pp)`F3)~Y=Phy6`CSWjs)11FtM5{5 zD(X!8AEM500_a~toh*+^_2k)t4A`?i6LnUoTiyhEw^}EUGLDIXK{u$WY#UYB=xNh< z$?)sV)}5#CJ7(pr@dDJNN+ri!r^?|;N6mE_HjW#Y;NA1+ooPlpTRBU>rH+_Li7bWa zR$hY-l!vg5A&LpH=!7z%n%O{I)uIkFTW!(Tsz;M}gxdQ)xZ5_038vL*qK=SC)9Mg$ zw#ZjxJ;g>I6gq~Q#)B924Q6~Fk=Z9VZam`0X0ZI6*}01iFEsVQQD!m}WvOdkr>ODh zm;c};GR+C>E?~EsuS#CcxmyzpH9O19;BJD!F6MFZs&ATSgBp>0sxMJ>2xc>Cv=s$b zkS+L>{O~O;Qiw>Av%8Zi4(k$i4zUllJyrWY9 zUwg}z%5XZ0YWD72>2&i|)Gn-78zo9pxo?)Z!`Z8?ZEALlV{D9uVsk^(Jilb} zXeUn}$H4@9EO-zwdxcAyv3+J_c>1{5^zofjLGkR{3zIoUo}RR? zdrvaTM;$`0cp6Ud9=;yJ$5a0fuSUj@B4=>WD9-+0!pfWu7M0j6^ zkxb8BA>JfuI!V{AhKG!nipmi$SQ+pGOS^qDop+wKE`74UYuN~Xg1;mn_z22gnDkil zlSF+z^|#0rrj<)Mb-;+mq{;G+gebv{KuW6-KQ~O2J~j(_k|Z=MdS42l>^Pvr?yUQZ zWFosBLu}_i=;Rv5+$cx12N)YV(L8_5&wueI_2buNqcTU%#c*NEV%9dm@DuVk)~>;Cf{umfK+PRmG9GF=!%V9cUDSUNTV?7*nJol2#HNi8PaCHJ3aJ*lZM;2r zR%jL=ik)n&i500!p3i9>WsjWAtA$|tV;W|4G4&wUdvJSJ#+&-(eky?Y-{f3KZqUZG zxr_`B?*{EX4lBEx)nv4(E68o~1q6G5z|NDOv*gFikEg-*TjrNtxn!EzqDN~oqKEVf z!G#KkyNQ3?2psjxn{bH1$5uWt{G!CkPxY!l3$wGUOtoE@;B1&&?{DlAu6OqLs6mn2 zs1Or1MmtA&;UdI&-yc^C`2*pnX6$7eah+j~J51`f_6*4g!3~A287gu7JRWXpnQ}p< z#JSm76)N~@3hNsh^Ec9Ev+QYFF9v~ldAYHpOpRKH?#0`1Xifc2{NRBDvdk-a-=Fr*;V0-cg|=O@u|w{~Y))Bd_^urR~*xNA6~bBpI1 z&^ylFukpt2mNMw7&U-0Qquu9p1(x&4+%di<@%b;Yd5po%Kn2x2c!Wz$f z*q%6KXwNK=;lzZmn*(v^8(Fp?TSAx{5QfAw26(iuZDpF#-SS>qWLg$RX^V5pR5SCU zX3AVt!ufQxiBNgy1wve8i&aW%Dxlr@N>barygy&07-N(9J)C(Wlb(|gRS7|E_c0_9 zmy`g|z96B#UTz`!q$Qp(rihx`?J}ESg(J-$FVhV{o;?A!B}F$>Q_R5p(m#PI^$E4y ztfFa1%93WN;@NNdoY~J}9rnqN!ZVz&hDRr3CxM~)9Ica@2s$*|s9rfoXtL95)R0o6 z^8PIraWvkJX%c!2YsyQV+_YvW!g9PrWXuT*W>smoNN&$W#4W|5aGb7=O=6z*y*+L5 zPO1EF`;>ax;20k>(xJs&f@MUQu4W0UWza><2UY|pfbQ@xE>26qMaeQ7q|8*$k14a^ zKuVDVOfTJKGjCR3LW*Rac&jVaS$Ibkv06&!rGOo@FgeNo3E1n{@seP-FpmcS3#y}S zx)=X&RU!{8f_tqz@l_+xNX*H6VTHQ=lt?1f9{SBH62;nCr=(yYwkN9(DvS%ak!&Nf zHpSRsOoU=uX!>ZQz^yrB$|%SRH813t7sU|oU7HrDNJ9<t;Gp`uuh&U5a<<;x9Cd&x{xU9Vxz1 zveNS;wQc^PhO+@U6)Y*`p`?@!-~70auD6P5h!-^}_$ zm8-~2^lHk)+ivQHnCRDWOJd!hzU=E(yS3)g;?U~Rj^F}gT8^oCG}4@O!^}ySsV7~q zz$hQbxw+VwkxOka4}BN%zEGB0U`TA4vt0d_VThh{1YMa?#-K!d60AlTjY+HyH&b2l z3uqVp&#dV+$(o+N4GLz5r;W;uD~{3I{oO1STX!t|ez-C1wg=_6z`34BN=fk@?SBq^ zyoNr}gg&kx=u8n2QO|LUq&akp8)ZA`RrYGBU;8vKn1)A|D0PL)v!P>#9zm1Hh41-- zUZWs8JPl4jz%4zONitFM(xkT>Tft4su%u(s_A(XSmQ-6EJQ5FvQqHl3xLT`I{qtQ* z9YgS7OpxQ-zf-d~V!Btqn~3Qy{jTQ*Htx|%8=pW({mzY{!rV~hEYGT{Xi3dNHStmA zBm~{Xn&du*sZnL_i%7`xdg92on`v^kT6q~0=L|7*c`0oIo3g|;LQNS)ll@J1z&^Yy z-XWo`g~@|4GlR1ctqP8cls>E;0aW$4KMI}vaG83E#aWY86=D69m~cf3 zIUekCeudcGz&FB9Q$lQBcrdP|08sk7^A{u;;4n^$IAsUCCmXwtl-rtW<+r|h-T9d8 zf~K+=E9e_I%{$fm@1V=bF0FRRa9L+TE|(P~F-3nCA?bNJNMYcXQbrgPYP{^LfH2xP zLL3Qx6#B+EoQsdQB5{S**e7y)>Z%lRhFkJ}QuZB+A8#fZK5Y(YB}DR)mPFJ2d5w5|4Hv7;5as!GQ}v+UEHd z#RJ)|sMgRjwPh~TQcIs(EsmVx7zATbQXC2VjV{lsNs}v~`HSP(92L=aR1jW}&ElWd zauPK#Wfv`ur`T4Q5{_fccpTn&;|KmEjR9$3LnS0DM5 zV?4JaUi&nrzDC5B@qN|F(@`hyOrN7i8QhdI%gRqj^VPjfS~;>i&|??pz+Kf7U|p(9 zx@4+`rp^^UW>D3x>4uvrq{Ua^9`(QXamTe+HfEX|8##{ECyFd%{JnZZ(2)o@(#$9( zM^C&SPu9h(ubO~xjMNp7g+LabXTJD0<6#%xacHHwL<;3tO@SbfWa{) zQ{z;%1XNW?${bSadq0wpG|a2&`mADvzN3i|xjgTkh zI6%byES&{&E^tnzx&-D{nflE#20mRnsZtdX!i-YGbp2%hpDp#v&>HYsEIXL)p>MLO zOKgSszKL_sV*9GpD?k$1msP4gXa#a#9N5Mc0()jhU^YQ!-$R4tP8naI+5BoD5i{ z1D;I=JfH)blL3$GfUU^@eHn4Xwq$_5skmWBGGK?!vO5{jp#%0N1A278{$xN_le9%7 z7S?nauLC-g0VO)%U@~B#4p7N}RXU(68E}sd=uQSar~?is10Ew_Ll57mr7UF`Zs_Hm z)vH&zafR*%eSI#${fzAsT`JL(ws3)Qh16QJH%&G)cN5VN5v73Sy=O-uXi!BhD)m)ekK9ZK2+Kx`fPP zgFdf4GhXkVKcU_|FfgfirmlB8o|HwOVY&$(mA_zjpV~1N7fH1z`$q?zWo3+Da5Qy5 zuRynMKck6NAE&6ni#+^V&|ow}bmK(};IO)sZ=)@;_#mfylajk1(-nG?fQCD5pg$>P z4C7?^!f8nY>$GEBbgbcwjPEJ8O)Coz4L~KtMozRk6D4#@tic&d$Ayj!Ubee0bsRrP zg{Deoo2P!?kM(uM*vJV2MrY%WokWJsf^@a?4j|$uvy!IRO9zU)E15*ZQpvBf_!s6j zlJl1ikSQ#BN?BpNs`}CHJVB%!?iffHld$2ZGH*_J>iwmH-+lT6njc% zTRSndMx`zLLhYK5H~@SUIJc?9UcWsss%g~K-es<<_jtb7B%qqpYA4x(?;_sm3`xG% z*IuRbT^!GsW31_jXFW5XbyiANZe?_q@GbhO%(a6xP$kwP3H$d;g~kyZaoZy0F5mO4 z#x0(D5u%x^ag;jI$*kUr*8!%^h3%Y&MM(eygg-*U=06~sD(-fhp4rXl7aa)ucMHrG znvWwD;Vc|HWm*1`C@Ni1fwD+yT@FgVFp;Ts3EUdT3d^M)r>w4}RO0m2wUAQF}pnse3-$gfeHi#D&g_+Hk*l z8bjb3TCA8jTyqs80vtQh?Go_^I+*?}u9kJZdVaAD6+0O5iyom<87xI|lM@L#DHjC( z)+O}cHdGtUV8hh+4s{jGu3O_0P0!$n&0ho#RSDZ=BJBZCXmK-UK)0^QDK@>vM@pOX zakvebY`vza!)~ytc8`(66bmgrK%Nf%4%)(t4}`zn5wB1)=TEC-zl*!7Z-V$CmC=N3 zN57b&=moLGC0;hVR33sVqkw?kN92$xErlOChxVfN-Yv_FfsSD}_<@_~DXlUP6P0o3*6Us^|t7%kErl_=R2}gFnyS*S+MvO@k{Z_OFJuc2{OSAQF zmi{$cpUKbYZ02-ejL9{t@$@pIs5Dvd>oYu;62K!|uVB##I<5tlG^t z^L8i4!2Ba&S6hM8UZHxgV^rqfgfcR1%naLwg-$uF$BxiceRFf!0?!lI<+_aBq8z(>iRU}7ed1aAy3I4{ zbxgK8pYkv((54&n{L3AAdk%SS8@$Bx_m`G<0({%SsDhX%Hv@ywA^R)Q z|9#h6F=W3n_|LJEC)XM+#?ky29Nms%p^sys?pXe={I<{*XWiR2yS*-W!B}|&UY3VF z=&E}U(6zy>F!Qji5Gjmd!n?5d>ej%OXjOf1^}B(K>JJ9qX;EH+MiTT2K^X+?ivD2! z0-Zckc#_Oy{nUK)%0nFhmoaz_t{tmfwB&ftRE}{F7$0&OneoHWXPBqs8)x1P6mb|@N?|S$IH-zn;9mo&CSG>G2bGt4-=HkD{tfvb&b|KOOT2A>$z$D{7@PrBxZT7AgNV8>tp3(9JKS#j8B}X#7f%6P5 z>^Uni4rwgS!6Wpl?8KpzB!iD+x&rCXh_FF~)M6U&a9NF`#$GL`g~K2BJWZ}O>cDKE z=D1=T7^mMX4eEGju2U|#$l3Cn&CFzb=va>Dd#ICQ;oWN( z_R3F={7jIa0{JPEpM~;-JDU%VtCx3p*>i>J-Nb#oz=VU=d>k5bk|E% z)a>8oi9Ye%buXcv?=qMvBlakjL(jg|XwPr^m0;E2uy`kW?&_cyth6>yNbCt5)vi`N z4G+nCn{<+=L5whXo_;@V`A`r@r!#`R?aatJCqa(o!*NeJjIM~RaAA7Z6Itgv+LlSK zz+%tS?>Ri7$9Z4kxozg*$cn>8jJNsTP$vU^TMeR}V{-Cys* zVaUyc{oG*=RNxHpb2KB=W)HR7%^;@Z9z93?o5_MV`9r@5z2k`G{!nMjjZ7r>dij~c zUkQIV^JmSG^#UyQy{X9FSZudK=wpdD!oQzo#i~T7<;HH@mQt{{oVQLp zM8XhUPxF_J34N3k`a3xi#b{JEi*=H7w53DRy>YY!HH%naBwa%Xp_Y`Xv6BP_qim9% z(BJKNc9N!m&Tz3~uK6h3!5v0hsKW#2py6E_!_;_tUCRfVfh87B)AKt+X1lDj3R#r% zS&kY-&yopRNf2!zd`SU6-zno~#X^48E+yg{gwZ~JRuV@0B2P%4naKOg!41@H0Ym#i zI>&$uA{u|5-q6Sj7In^-gMSOXeLj4~7G^@gV~h%)i61Mm*{fTGFFl7j+lz{41dqm1 zGF!9R)QB|$~YW(G@_)8iuq9!1*8;0@@WfeLBMm{Qxunb>X;6~3AJ=mj`Fi zo>0mqSQVa5Q!Gl|RWANU@&3`js@8N{8@KlG>A`p^vU6=ub&o@D_aNv4q&@KL;v8UXm2#GTnc z@S8R8Y+qq^9C)?`{46q^WdUbe6rMc*@NAM_{@wruzfauz{TF<(Zk6&CsyJ|TQ1lAxBvYpa`~%)U7yx*bxM=^tcgO}* z)a5JeiUaSmfPYA)4=vyy@&3^O!2eF%-}?uCn+D$PE9{N~@3w${Os0=5;GgjR$pFAH zrC)fcf8ZlD@WZ~s!+H@MW)U2=p#Oth|FEDR;r++}(2o*#w14PAyctD3zQUeBxrupt zEa1n;bj$*NocH4c06#(8iT;2GZ!(H{eTBVoz`YjWPs#A91^6WICkFr=BQDl2;55t^ zw=C%VtxM|uuCMUjcoFYfMI0on%uGSa*39e|C7Uy~ACw&YnNjq<@Bgv)F5ppBSL650 zWReUpI3orKf*J)C4Qe2ui4!%6B*9B?LL?WJU|SpGpe@22E@~h!iDq&fwQsext-fll zt-ZXhZ56QI5`rP9Rgk`lVihm7I~`i1(hv}t|8MPcCJ7jC-}`;f_k7Ry=6N#boPGA~ ztiATyYp=a7#eYwZ=ilv$6%`9sO2sx-4qLH>rNdP0YbjmqAW-~4vhok?$}x5>7Oa%YZLA!&atlj`t-MuN{&ArA<7DL@ z+m(Zq#e$Slxs8;=R&F8bu$5=)%J&9}_i8i;WmoOBYiF%37Oa%oZLA!&b_+{~t^Lo? zFthZNK=CKZu76@zet^maGo^AHGl#9*!qj0a7vFf)!v9?G)z^F_&xfw@J>|OncLK%l zB-?+-ZvS0M3ffBhHrfu`zJaz4_o>7 zb>;sE6#pYxIn-BIZc$sS^4)v|s5@-s7Ag;0`I)-%e+7#Fm8=}A1FTPYyLe?JwMV*@7samxAoV&O|Rd!8+?ba5L^}fv~hLV1})qjw!xqrAC~?t zQ2e*#*9fN|th3E2=*n$e9ky}{cZaR~W7JH|(w;zZPqK316r^&SQ_z*$xH@d*7VZvP z`44pE{|prWGg-NC3R1bvDd@^=TphM@3wMXDJYQG-VW9X!4RkPhm9Pp@yUi--+HGVV zwss47hpl}laxJs;-+|(PC%Z13f>dsE3c7NOGZ+>>=k^Q!4v(L!bmjX3#ru+#3#TBJ z+nj=~+{V>mdv4+GusuJX%Bd;ICcyQBr|VY1Cit4~0+kNkTJ?M+7HsAC|6uPmJ-b(W zalN%A>y=(yZ*9qXbuao3-I87KIa@NbBaR^hQH3dgq;FkX_Ex#8pw?1n_SSG3J$O0( zsBhf`)LrU|KYduJ&Kud&Mb3$|I9K+aekTOoj{r6 z;oLIEnLPh3uguZH^Cdj*m{sPuh3Ba}e>kJeaU;*C^8DP{WsW;}K9=V{pH=3#j_0#@ z?x4=aJo|ZmeLC(Yc|MBgKhj1c&!c!=M;r5bR?WgwcFP(SPRlRKWHWlmk%H{EE0K)P zlS7r9zVBUZe8*2fkPDQ z3`PGQ;MWq#$|>GC-5gEfCSRR!Do0k@Kh_A?TT!X_ZWtexk#m|vW5-D00H+c!W1_~H zm?dfWjBY&=knE^MsU@^HQc#7saR#+_aK=$V(0j4OqHE) zZ8F~&aTI2i{f}(i)E`xX_?;n)j*NV?1IY4R<00dRP6cn}obcI~O5&s(pNe@Uy@`aDU2`}#> zqctpWklq>cH`J`-5V-2s%&nbbBQZxG8H@x;@@labcM7%yJ@_#5~%gQV{(U|zaCc41^5M$yqyY1tQ`R|$C95t4B`Z_$}N#>kPIhDX; z3|6EpLR_Oq#L7IuiuhT5>CW&ua#-qXMsZBP{~p)Ga%^ic?s^7qQjtyG$m$HYQ6=iW z6;h6a%DFfwsl{wMUP$fv3p0($p!a1A5!(3~x^9)NvjnTu4OS)bv1B=mEV+H@?vUeh z-(8*OM;Gj}&#!UvGm5id@%$YhBj)6Xo=vNxmvFkn5&8;&UgobLL-R3A@K!?7GG*$aS!ZI(h6rG_=PX2UlKTQLjHsvwe z>A3w__g6x#2$|D|idSjRf|)u<4BBSBC}6o*Rq#^kK8EccK_sV&5hQ1|2S^+dH-l`_+gNK=sYt zQsIMCl)rdV_?zlSQgtDkK6}({+~PQ@GP-z@dY!##Z7qkng=XWP{Ih(wN5fb5ndDOp+HRy^$_|Api=b`(ml2#J7V?C`92@86~Rnew@oSZbh9a37B6q zCoRB;o1tW%hXKr5nY_l7{4%faW)UTT1hJB>3|xlzwrUTm;@1UnH;DmtNjs`aM4SrD zf58{|8(>`Y96^cRGaa$UdqSz=%b=t`<-^*KAIdMe$9MZfWC)bp@4NjTfjyRAz4_%2 z`pA}7BKdW-Mo`EL}V2w@oo2g)Bd9*<|E4T>W>G4}*vjjUh-v&lyUPqmvu6py@> z>HruJ*_30V998~av55{=M+V=<_sHk1Jz2KljhTR^sd18oia~GUpKr(%G}BMy-ErEu zZppQg)sr098Ff#^m4J4w_q%Nk8$O;;)7lo)!6`qVNj*eZbI~FV7q!xD! z7))&nst2G8YP{V6-#`bj^GSg|qxn(8;7T*JqRK!xY@hUO#VF`^2v=40b;$$jJURYf z6JYu^`I;r}F5cjtf)gVo!wOHhl*LJFsP?LdNz7mD3Foc}Xf>DYH36;mGTHj7-_sy1tE87gam5{fp#D; zAGdBzWY-AUF9_LfBjh9-A-h-44V1jF`T~41GS(e$yCdzrDIIz#3#T=$BzDN@eU3uo z6f~+h=ARNP@1|*7>kVLy)!{DLt4P$)93~xDvqxi%`01k$OK!G?<@jqYsG%7o^i4ZG zScWEa6Mh-K)8}duYMaVZXnez5=+5m6bcSZ}Hhvm-b7QDpAii^MAdEaPZ?lA!}lWJ zZfB{%79EwjtteF`mgDjA(V%)5{DY4uc|kq(Z}JwRc-gJ~pl?|`VD?dNa;-YSY~+4Cky|rXk6YA1 z9C5#!uIwV1y6HwIbys{u5hVkcc$ahqaZOjL{ot|u=kBCW#|!J`u^FDtB~LP<@G|_E zoriN5;wEGPT0N+=qs7U05@+TWK&5_wE|^)~9i8J>roP<-Of2O$gKWF3OS;4CaJZMO%-lnvg$uudBb6A1f8i>9CJQj#c`~z-lx`m zESt`v=$tIGV?Z&G{eebQ;is5!kZ(Wwl>UZC1j$C-FPwm&sk|PkNiNQhN@%u(OWUnN0xjWMr4iHEMYHkm+e56-NRoz)GtpV1gB}&Ns{71n)7Pgy z5)f;x#XoS1)?%kR@#^G?VfkUh62{luM5X4rxjV5TxL)*Qw#$y7P&+=58L8K9B}&$O z(;l>#TH03yU@cQN3R5uOlUOn-F+He$1?{z1fC-|XTE1rvI=MPGrQifs|0VAFqf_{y z5`{t_>jG!u#={Hi+Qh-BGV5)sEIPT9hU(jBR@7aIg1W8TOdsd-`OIGPx&!K7Rzhg! zR;+&ix`4F#W}HZcfYV5Q97^Y?P&ble0TD(lr$<`#`kX843LW9&t};jK*+QF5o5&j| z@+?UW6uFnBhDKvjNkFvfXZEli%I&kAl~t=Bvc~Gq43ABudiSv{>&lF5&Ws$)T(XlG zS=Od)1`75POikWHCbJfGWmd;Fyg^N@#9|4O7_Ezbkcm=&5nm_~$Sf@9R~Ds9Q81c~ zg3-lOGUv|=R#Y^!mk-3Cu#7=A5#`%+RrEx9Ehp?bW{pP&m7jp?C;|lH_d;G=I%Q^r zpt+vFN4}dy&pS4AS?r2G`pr?%Io=3xLGJ*}XwZAa^F8Vte4H3}zyf+yn1`MRczxCF zGDZ06Octxo7ih-4x5&-3aOmLn;auAHh+1{Gir+40^$nSc#pq7^6X?U9P6fbgfzHEc zMO_=HcQAS=`ioW7l_s&ktGm|A7mX4)*Px45!Yvg^Y>B`!>YD z4?q@j%xn1e+%i@H9lniyh-oGVXQHcIKbTR&2Gd(t`6e+Z>F_h6jwi_%q9#|m0%q)+LQ z7ZZW5a5miaDS8d}tMh=Wwl9?x9p{2#Oh+wgX7??=xcio~Ec0tBs%n@@w;HnKN9;i{ zFu#|wVvOzQQ-y{M8a@GaF_68Oe(0h(Qc9O^lA=!aO+A=?vzKC&KFmt5hH|z_bwi#M z)#b&|G~`mkvCFP?_@cofMGK{opYLYBUoCoXqQh-SRt5gJ=TfBtO&=9LI_0aevg@W{W)~s+hfyb-Ud`}k< zdCrs{Yv43j!BcWVS5`c62jZI^QD~Ah`%2Qv^RYXhVTyngSHS{sIE7~kVylM_2I#5nK&Y>6+BjNvqCdFPB9-5 z#SVrQmeks8g8wr1gHr%*4-^mkZR~*pJg2>KzF^yDDq>Fy zuSlC!hzsRUHCjp5gOJr1h6eo#iPb)F37&F5 zWRU${tVPbT&>hbZ2~k568D!v}+)g50wO&_OHWWfPgX$96Zy1y11gKK1;eIAcP|f*` zkgFU>Q3QVg+6iE~2)2%mJ72JDFEiT&u%U4(z~-Ws>3H9_;MLx!<7<*=O8tX9V^p=& z%2sJ_*iAd2oF4d$>Z)jq;F6mEFzr4hsA8?AzLp5xZ|J`J0)qajjlZyosITQ(N%sFx zC;xgddA=lz4kH>lD{2n@m)|ScCW_r=VKMFdLjmQxatEM-Hi{kpWC)CRx~Qo zU%2dyn7bUrOgt{#3#BzYNrl+rUuGRrp$NB&lJO z1&2QkCSN7VQ!F?h`>~1{L^_A`{I$(` zT3!KuZ2JUG*|&c7WgIW+#BgrxhJz3f>W>vHG`H4A_MZ_R7kGZ@n8*h%a;B4H3rsz>@yT6RHX-M^wX@ZWzmxU09dQX-2wi@;SN zwy@U;g}t{hGyf@PFfcQP-aCHT?q;ho9$t?l2wp|x_$H{X!Qh7+uv6Xu~$Lj;DiVmejRJzHLNoYq(u5%#)5(6qO!Wd;-Huh zL3Nj|JQJ&)KrAM!Ms8vV%5OIQU7h_LktcZ(Ymwh=`+^nL@KlOYpRq`1 zt9O45pS3}nvDP+=r?pmMb%aFaTI}Y_ep@YHmT7<4VJo(J-`RYQljP|HsqP0>bt$27HL^L<-xw>&(0xnx`Y-f) z5EW>7AAD+88FujtITFM(xf5fsB6oZ&##H+&z}h1pXxh$MU&;f`ayj1}FRD^?_lN~e zY`Ld0XwJDfI?9|g2jkrPe#s^~ahBS|)$|GKuL-6&9CZ&%1p01QR6o&_6F08fT~^ad z>^^BRa=+yJ)ao#1YLVv>!ny=r_cbd}9+3#q(%w@S0@-JTFa_RPierFY2SNhhy64TN zJIUl*m%%ya2JTGcepZD&bcD@dYso$lr5wfR31W&3Fnx;2NM z>Jf8Z1=A$V%cd!eIMGYuC@|0O7py`dyJTO-J6KC<-$^4mxrjWVKYyXQQMP)*jUEbv z9;&oKP{!!l0aFfvz};lAARywsArKH*@0UQ}Mrh;bL*VJwuLXey2Q*;_6pHn-`!%32 z1PB%ahHdv@Z?Oh(a?>3bQ{Gt7Gm-uY%Tpp9T3}}Z?a=&x1XM%v-)HCFB?3O3A2+9N zW2|;|I*DIw3f5qUjJ$l=XfeR#0eoA%{9}pht_v`KMVy4cX(YljSzOU0?N^cAQ)A_F z8nf6VM}Fbs;kO~5r$-LDZX(M2lvPudaZ571fcn?R`WSw`AA5>a5w(uA0{DpRPdssd zLvMGyxrt~aqBMo;&k}E2CK6v_+r1I=t;4802rjBZ8q*A+@g`V>z`MWclheeQmX)MG zp4#+DHkR;>-nQe)$Q^C;Qc3$Ww=-7hs`$=^!F) zB0(V8UpLT;+?T0oZy#QP&H4SDhsG}2+O$visvnqPBc1S@MFGrb4!?d&ZY+&{0SgX(tjnr#Wpvj zFTK6`vU|V2sQMA|?!CqOvg>_)d81cfcGQoQcYj%|FI(T&mlt~VrMrHVyxX)`U)t-L zcbrTt)|U&v6P`tnHqXnFUW#rpDa5VeBMB|j6Bp3NoqZ`GH3Ue}kqvk;zaF1hnm zeYv9$E@^YgtrzM`>n`Lnn@gJip)XDTOrBb9;yaJlcPr$Mj}7H$7eh(qPxZxC0=PT2R#-1fR5wz=+SysyKC0p>_t5d|s zLw&$_Z^?SIe3woUAH$@)u>^ORJ9G;Dkd(hH`Mz1s#)%&M(@J?^$r{dJbjnUEWs`61 zBD!Ukx9ikrt<)!dYv=3K4LbFAR_dd^wdd*7M|7&_-O$Q!d}~k9sSoSah?V*?-`b;e z>iwiHxt@IY_|`gg%H5K(kd!-pYd;X&F26%k%1OD^xAw0(rBzY_q%`~1KCe@nB;^#K zC@^1|)$FzV)uyg{~+nI{hocM@RZ=!ee=z7V^mJpwOlJS)k$~BT5VT zCDFHjI_xUg4^_&2dGB7cA1t7|zO~meG@-L=>I1#WaTh-Nap|hOKV|U}dIrtJM5}>@d<7LzIIhue!rwFB89;} zpodWpKERQ||A$V|gI`7pgTF(k=)s>w3WMLJQ<|in$;rV#y5|v6?ZNl0eUJwr|22nQ z)ZAtTN-~ymhJPUN(vp#eJFrpH|53i*m1nR3bc?I`a&Ha8iwFjU7`3BkGHq1}4#2)b z)IG*%QxnbP3Sb%K*>tT25VK&CrR$@R`tH=r>PAIpwL&J|>Ll($m$ftGC3o7{L* zh!TdMI2xO*TtT(IPj6w^?sn_D44d0UMdPrXv4Ncbd05WF>-^S0&L8S6TC&asJ@?T| z{rPlSPQMv)7~=z~m-Jd>m7a#XMXB%nwXCDJF&Q`#gEcxBQ!})l7g@Hl!R&8g8Ql&Qh zT2MIpD;X*JvQo2qM@3elH#R!4Y?AsDBqLHk32j|<%x^#-9f?Gg0X7H{9bC=i#zB>_ zOSj*4q6u zsarB8adwGcLgv|cbXiz~$E&&<24MB-`!KxLfhWf|j_|t-94qq2f!^giVrAOro5K>N zv1_^{GoJdm1ab5I?oA=}AB(DIuY4CYtjv4I!|mZh^d>;7d|&G>NtZ;lpZ==vQNrnG zT~9T;aB3Euht%T2CmF*MVibE%Df49aI@9BeShlXU>l#z7S`eC{x8iI0iPS)oU69Pt zbnrv7D;qV3esQM99{=Eyw9vsCo)O}Ds#V=DDHc=yL&^H^i zdjs2+6jNXPMBmdcWIyi5DIf~p;aPm;T+S-WahkUplLVA}4ixfzDO;oS!E|4XX3|Rh zJ>3i!TcMD@ws(Xl`%Pl-bnZ30J-?Uaq&z`0^=wO>&6CAdIQF7HFgT{qZ=SBVPBkoR-|U%})m^(o>)3yZDU zBjeY?+bZROLTMOf36-0O1FHRLW`E@G=Pi0GFJ+RZgOA^Vz$$*EzL>8K=4iU{6o&z8 zn84uzWk)W0DKEvVOY{|;=49jd{PF>?%%)4BgTw%>&>n$Q%bRp@leb6sYuSe>hfLX8 z31~7fXEOyoh+}j3ob{TG?^UUD<&$Lf$y^U4p1n~9PA2S_flp;k#RD{ROg+Jhtyz&7 z%rtS3c?9zihi2Y8boA>XZ3L~;=;*~I@2Q0MPzzu;!0mo+5*t0cAiqQ2fPeG&|+k-o-m z7)tD3K~2!=FCNeweAs!?t*=M%elB$+$yJv2Itwwt-7I*{$0CPEpAgg!aaGK2JT);P zmg;8G8{5OhWJCdwiOu7BX~2 z9Z{v;)#PuMA!U=G#Y>{l zUNVgcs+hb1P+)XWPbCW`6o(Q)dJqobBTR0Pg8}Y6fLcHfxIfaQ2Ygr|_|VASXmIiC z5*A+LFTDQOU;KU|#py3@POX)Xi52<#LGWrV{k7J+d+%eCml9;=@#Ek-P5k(IdykjE z4}A_dPIBhDbtLbQ3*mNqMldlQ`4U0u*b&JiGUH+D)y^KW(k?7rs`LMR)NZ5Ftn^d_O&8oqM zdO0CAFdJY{m>7%>69W}m9Ko?j+rzX=uMsj@tP}Hrn>`<7WvA(@2bd5Wy zu^W)19igt1I2IT@OR!|GdwxEOsIx=Ps;YTv6zrq9UwYRaIC#@3tKESYmrRCjmUB*K&X2OY zC+@Gd&r#L4K^e}eV8us>q9oXX1`dJXkI3%$QDDA*^*>lVZgK}UFMnH#=9996$NuFn zr@ZutlTdHvo>NwO;#~t1g^$tH7xnr0cauN{4+QN*#Xq#S)}F&?s5kock*I`vQE%&x z_{EOrW|@Eood)4BJnHuK4oAw4+N1X8_Q~Vbtfkaci#dYKI6VOcf||7Q0+M^cZXrHd zUPN{k6%?UDWC6MZj>akCXwT-tOxaQDbpIWwJrXnrZff#I00+}zxJR|e!CZ|&`s)rk z8GV@PIXGk3Rx_!7G*38D6+7e=!P|rxZ zTb>r2E#Fg_n89+l_8rDzex_hr`GM@`Pr1zFJo=Oc{XMrxCThn9t9!|%Ygq9UtCyud zE*Ger7q+=$uhEN!#{A5{^UJ@3)kox;9!CZBR?LgK)SYZ_Sw-hOMJ+ot(GK5011lQH zPb&-hQWae%V{roA?)ffgh=O#;e_8JcfA+pOf}GtUkLLFq58xJ1hNP!LXUgcgK(500 z58#IAvM06J(F1_=Y!K2@ay<>no?wQ?foZ0Z2^q!rx)<&kxsB#=@AxmPH-Ef#05hh& zCYW(Jk83gQb9x8K5)z{1!Sl@;{W1<=l{pK5RgSNxS5_dj zlVfR>8pAI98DZ-+geMC7K8~>A-H~@R33?sYUy~r9(+$JFFU@?5SD#_{_vfV)=zM); zF#MV7^+f|8R=I<3?Y7JtrSSzGF&F+PoiInTedKWM?X;$SX~s@y5sUfgDz&PeZzy$> zxz;=)&~1#0tYU?GLLxS&NwFj7{RPn@rZ~f+@+O2w==AtKtrHTZp3q+SE#`7z?+7+X zo$)BcvO|XDx8G&_>=o^t!OpFFRd+6anydg->aBkb0@|ZQ*7~(}B9BUOo0DKW`7*2L zw$K0|F0|Uh{iW>ch|z9717brhU2UGisJ)-_H}p$)6W@{U+TxE)We(Qjwrc5N%Gg`F zQaWu7BmwE!`isYV5YQbn2f1#jm=0?ox|U0@k~d zybZu%?{!o)Ac85BcS$aEC#Zf%wO=ZN8Jny+Q>wn_kgET-dq~wCoVIPs$ekiG~5-%|u_A>CrP5x(t0|3WRrwP1+<&^GE#xriG<9 z_S78|MGgPuU-O6e)2F1W$Szm3}#%SWWgzcVC4*7)ap%-#om*q zGH9ylsa9?g4VqfvX+VLa%L*!Yx$-O&hL;9YQOl1%o2NDt!EtJE}jaMTRN{_be4S9rVR zR<)@NS;>JvI-@#wP(9ZIF~;ah0*Be>QHL~s9*sYEmB7nx{8AbxiuV_{{#$lo!?eDW zE*#SO#h-1R-RB(fsBoP8jEkrd;UgK7(P3X(iND}mVNb!*!v!RE0V0t&!?{x6bX{Po zMoPAT*s9co-EG}**NiRoFhSo6r^{uj;hNDt18L=;xJAnWp4Nbx4dfwF?v$>$D@7c2 zXav%dg4om&|mw?@D#2ySAF8Gh6+MxiihVGvm)@?~AU=OO(zOo?nD_!r2Ym#42-3{WqdLRqRO(Yd+~!wSM@y%wiED5} zzo7r}JDNIjh)wi*(>@K6j3h*)PY9ANh^#Xk4-5gy79s*$6Zvy`^K<4XJ31RK!*}SS z!#dQ4=tXxZA|3Lr-(tRQ18bm9p9idmb@ztCYoLdiedHVdRoQ5K%IPUrwdEmNO(JbL&lm=m~HIFh<5+|de8w8Be?8D>Yc!XK^3 zAY^Z}Vp6msD_SunS~0b?A}3mr*IH2!{hqGtds3HO6DX;!f<`jeO-Juu9n6)oe0z{t_dkHbZN+Hy#^VZwXAY>cNWz)Jta(!W^SYzo4Kh@ zJSI$;`W8K5n<2+v3v>Tmr;e=}5bb?__t$c^Jxupk!q0r|?$;dJ{rx~}p!+L$_r=}+ z89f=={e_(5NCaFx^2kamIbUgNW!y|ho5*I`L{DQ(+qSmn&fXp#Nd&UOwr$PCxh*95 z0{wD)JO!WXP5Ztb9^JIBBGo(vRKisg3FeV@jcxUQCX2)t4;5-?jK#?K;*N9?#0~QlIDKa zL7K!$|J-8kXWjSeV(p9CN2FjCZ51PJpqMb~MZ4-n$;!vgmp7I)R^&PWFAN8AWR^XR zARCaOkKI&||84R7-B#l)faQS?}jMd6xxWD+fcld3tPkrhD|`6~!j zPLvYjcyVyc2Hm4Ry&O7I=8fc?K&MI$1j_tNi2dM)9b%owxs;K{lI)5eON)c7j!1$B z+I)f%NfYZ9^=8Hk~bC%&~>7+=%C;VijKYjV;#FUnI zO*}lmsFu=Hyd*MrY9d-UrL`_6T9*~Ao7P%a5YOZ7PN+isWNz}29>+-dT3cp#J*>fJ( zh4iC=|3?0A=Kps7@8thp{(sKDbpT_-By(pXfyQhSCfx#)$(IelY6f7m;@QJsbTb(urGA%2 zoI7m9SzkIs5J%#t+dz6k5T^^onS7fD(h32?=K|?1wk;Y+*~GRV1k&+>ZGt%BoJb?i zN$e5@NZ07^_50R4>Z7GI>P5lgYLcX5he4*qhRoSqA*pvWW)JYcj{j%)@8jhaZlnQ<8i)Q>^F07UV1kSyWQddlM0LK zKa#IY246ot_!<$sRr;jC*Y^#+emMC$eeiYDz-zr|Rd8GZhxa3$Gd#Jibh<@iP;5ef zN!>kB8VIK*N;CQ3xtR&vZU|FpmD+06@2cyJm1bgzkt`fkuN^IMyM)<;ko%ZLR;|IV z(gLSiIZUOUv5L&Dq5|hU-};IfYdVDT&r|=cYoQWZ4jLRyEU9(VG0>3nF=~PTeeJEYe_iamv`bEm`N!eL~nzDoz7{aqZ4AueDj>%^D97dQ4Nk@)Gx zaATMmOg8wB39N~SxA7l?ZHzj!ji!~;PmNVf4X4jjCv#rj87azen?)IB;en`2Bqx!P zz`3(NvT{Z;Tln*{wG~Y-C^e4eXnhy9E)HMInasM)MU$94j-EwO>Sibl>;zX)UGiuvT~Zk_}&ohzXcbB&o8(*oLg{dcyd95uVn{m zW|6-sufgyZvaLa0uT_)?l`2c~=AvnkdqeW1&C%d?E8uX!E6k^T$97e)FnMmX7j zY50^-!)5h>jlPzD@ruE&&-WWgz-ikE``@I3uz%(PN@#?Ynz+{pD~JrjVm%S*&ow60 zM{aOwoOP2SiL-Z+C(?hWF;3oUtd+M(ti2)9e-*AF`mYIRMEbugs&xj64;W#fJW^v^ zK~9akg2WnkFAQBP9~3?{(jVpox_>$9Ci`zNa(S;&_*8B*3LnpnM&V5TRXN5;>#K$$ zaUE;Ym%@DvU;4RlfAx|9xCfv7U${dtz8c)EC6zsz`C;zPP))7x>C)+7!s=^%&EE%K z0v)T*3!jB8kFQzwhmrpC!{i;KRZ%ZFkj34q|IpWd71eT za)$iz>WI3GkXb4{TqPWe@opuVyTFY2Hf}0Fs(5##fAQ*asrc$uG=7bs(|1IB>AS{b zWtp z^0mlgWsk6{d38AibfSmm^YyqvYh7><)q%RKVzU#?st)CD-WWcEK%^>-o3yTy1ErlxiF=ufr9OMkVwYD%mwGkaBDOiRGB z_w|)#c?~}S$uT3i4kHoNkWrF|m3o7f75X&5+JIiop3j_%Wo?H_p&Jtk<<-~WG>)pQ zwkitc1l8#jr!2hGi)uUUY$V{g=@_%rb_h9`m6lShtm42dY2YkTrT?cGv&3SOzZ%Be z2^G^Aa~!nf%P{6wY)v%AoF+FzFlIT_PGd|=Y7vZiiX8uc!I*VDpNlauHhW)&G0Q2Q z#F$cM`xju$#a7m#7=ymjpkUNSo}$Y_*msrAKpW($<%@jHvUdn{EI&7VCJW&q1ZSBh zI5!_caG3o=2+sRoNN^Nuhen^XS-dp*EVl^GvSA2Ln@}eqIR6rK8G=4hK|&!o_sJ$$ z(B}ta{i^6wtO*VQVWBzw7QrFhF>01joKV(6$VpC;=(t0t#nT`;M})F#%;)e|AR7CF zRHq)ha-llCzV%fzLMyQ5d^PNWbkqm7eunr&AU@tuk-SUNpUow^bAYr>hE5bkq#BM> z%lGI^o>0-{^?~gif%Vr%Zz}K8w5Zpto5J=XyDl&GwCr@UU$aONu9vc^)iHk;#1e0F zLW*RY0X5oVz7$j=z>^_(MYsS>iH_7;5gcJwtG6*4Nn+JqP=wgrOzh!q8b3gaMpx)I z9=Gy=Qpm2gE0?Rz8<1T8-;P{mjQm$dE>o~URx-1cwBYYQ(CUzqWx_y=-dD@ zVbiw(Y>@cN2H;S;T!>09rEB^e{qj%_{hBSLALOK18YxWG{>Qj3Mrxp}hq z+j5Q1uNhiy*PQ>gYv%Z*LTuG?UoNf|9?vYDiezCt@|}Wju!n|w3Z=2_9bLm|b9|hU z(KdH_)4r?2Xqq(bD>G7~Ra4E4sp2^+wyH2_zNE}IMPdkV`jWbY+tcI~Ma^5}SdWth zf+|EyX96T5uV+-6MX15|n?-WgjgjdwlrXg-hS`l4kjs2a7-KAAmw7bg63eCrE2#PY zx6o+f`cIA!uxsc?*>~YXU}b4mWYaX5z{_F3utJ>bFt9?T=u8!Xj@8!6S6z)%pvu#hU#uVoM5YUb{#`@OJolzfn zUSL}vcxf2ep26qZu>JUrFN5u2pxsD;&wzHuXF*%S5C~}hgZwsV-9H-w+Rs4t6b(1| zuF%!kxOcE5mdSM(5Wo2DR|D}V0dZ(4t0VHj&q7&q!=P-nJ*x!stcf)O06}<|QU&%j zthBz_x4w{|7J^XVgRGE$jDX0KFl)3F&UvoepWOwuXz*cwDm|-=A zyA>QHSq&nx3?i>w?3SHHg>w8rdMCEEV|C|z$<}2i)kiavkAt1DdwJ-&oCPg)02#d4 zbCet)uyA;V{8U{azq!Oz4v$yqg#-Kfrr*eZzDHa-%DiI2!Z1DT)TFK7tT_JPK^?A;mJQW%|^C9}J6#OBheG9vLKp$w6?_mYlAjY@wVTt{2RaDzy1MH&x? z6H>z~G!=DjV+5{bmN5kJv}zRw59m#YN~f)(BdhWpVeBPlHs$4ny_VKYmoq0(3LVx5 zo%YGGHOvgI`t`mq2I#tT2LO7;uQfnN{C^Ojxg3!V4^XsCEr7~|5`g|dV4no&u>#Og z&Se^=h}JNJuoR=}qemVJRGH59R0DxjDH3HCiww2woB{ZK@JoSTe71mnCSvYd(NN2l zpJTMRfyhB_<3-K@e-urRR^y6|Ta+P>AfjKUXho*Bm1ef4%OsM)>@+K~%#D`7V8oi| zn!qAdWNZbCQ&`#=@xJ z>SuX|;Ts$zNsfUACl1r#S{kgaB_ix| zr9q6R;4)61$^^~xQ7qyt<|j|e_sLm|v$V7<(CE486>$xKo*pyI$;cn2ZVC*H{J(!8 zBj1S+2b!xzvWt6x3H+vqk5cmov%P3#gDbSuEHL#ni?sUymig~gSE!MTD6S2gMN!PQ zgXqP){QdK=gI;tH`vz^$j2*;QvsX-`_wlM}^(l^phgd$pc!=e5hT3-aKvyr+eb9$Q zwsMNO%^ZmbYdqhhh+<@D=Y3*uoPxD6Rsn_H__&0_bR`NsrpxrSm3T0FaV0nu8&o*? z(i$cVsi7XVl6v$wToDHh@?a%S%d85^0ep))aqH(WM7cF1!9f|`GSzh)Jpq>5T4GBK zs8*SuQ)+x-x){bR<6IG2PSl?8pVKk4U}U%dP`N{O)2aeT_zEEitE$XZGjn&c6654H zw%Qf>cCRBCN=w?Qs%!4h3o=-6a(+o~_=M!{Ry?GMEvqGM+Xo#zKTwxvtdAcj2afRx z1NoNaS$Tx<6NxBWSDEtSi1g>^2Mp+|{7*W$>GrSE$=`gnPPQD{NmiV}PFgZQ4L+lm zm_w`bR?Rc(W{N5{J|%`Q3$QZVW13mehQfr9!gZSktDJ-S7=Q3|Hf2G7SzuKj5u?5c zb{l1O*FEAK)bL5_t;%2;HCAsbP;^CJih%aBeL}hDykwvD5ZfXP+rVU}vY?AdQd7$J zlu=fC^Gy8M$f(a7$nMW{W+-xI*eH!^D7uMWCy4KNEa-6yU`0jjE9704%qxCHz2<9d z-zvcoSmt#w-=&OK1llyGa|TGLT&u5c4kYOtkq;65D1 z%=7HlcB~M%5r~OtOoPrk=L(PM9BeU@7C%Y0n75F@8=~fmfr`1UiU1)JjR8&8ac2S` zo_eFXXh35EZKkC>kA9f;X0a#mT6iA7Akb)v`5a91Cwl*J5-OnDCVQlMb(YMo49w>9 zPBpUVRp>kw)49U#L^?FiCo!YW4=mVYJYhYR^e?ou$HZ|>nlPzf(7P2<{h__H`WEwE zgdH{AyHs~?z3$$HpXpxS(C(dJb#KaNx`)SZ>EPpE+QB@uUbQRB46(};&yfUQ!S?bE zFb=UGSd3-2HW7bj=D>=O_W*RYTg+Ns4*%V941${n2pMsd@a{l_rI>g{_zULwL^u*3 zs4?*ZfzJ@_Hzc8Qo*yD``|4dN80^Ah_x}&OFz>m6E)2Eh7_?H{{byOv2`!^1+wggc zUa<2h&s^c|*eH%u#oX5RrHXeYSNMcOT==Ks!aw9};83LyZ^I@3DW$#KNywR`BBkfS zn=t;jo2^nOKqDlANO(LGb1?9Lm~Et@e;@|HsC8p5SR=+^t5Mq(yE8m%WzC=)mg^2H zGyxF_a%V~1+h6=Deub#wM5)61{slb;ZlNPWcSI7Po+`1rw9GKiPq9csOe!&HipvL= zx@9E*1@X7A((UoJtS2>AJS7&qHl7x(!Q+!Ru+iu<>pUC2=Ww*=JC~P*&s~!bU2YGb zu_pgExn`}&XF+QZAGs!~5;u-kqB&XaK4Z!&KV3RNDHm>6}(D0?ioq`olW}xcs`QGDxu=WY!~N%o0XZNVO^@*sBC)Sj-XD@4 zxO3arGF`NYL0 z@A)y9*wwQipj4|ZSQRt~kMr~$^gK5Kt$CDf-~&5ADXNan>gI;w5&9>NkhI?}oWtzF zx=1{4bD&jGjqj{Ss7?G1?g1!jyo(XxR4Gd{2>(8fSKfuuy!Z@@K|c^=PR86f<4B+L;0v^f>$SZPZk3z2;up%2*Vs>F;eF^15=XigZYLG@1M!paV~l;* z#{9FxXtBGC^7D*-gu|ny1`!Is6&)*e1eGCc1a(xYMRI3$iYUgKxtK~KL|%|7_J-Aw z$@oO@Y!-)&*u}}_(i6p_FVxXHV@qp!qUpR7jM2?o9y!5xXGa;&@mYx!){4}&^wzXe z?UwnV@9FlS%6x!UDD55cx~#3_AUoL!ZRH6hzK<1TAqyU1{1?TMD6pGzULsSYEnQS| zg>AMoq?Wa%$3K?D|B_CX6B(LL;aZc(Z@41JNH~zYZOCsWE{GBW>pv zj0m3r!*QZ~pZ+@iW#`^+e_7d(PfMhf>EkY|LI)N0%mj7mEO4g3DUss=CtV#d5)vy( za-6p`pEZbl+KWPB2O4(|fv02qTXLM>!Gd6TBI;Cz$V;F8%vq|bJO$f-?uH&E~M zWir<-htpH4)TtB~pGw*zq4&X`Q6e|-pcG^-Po^WdB%CA{kvrJPBpkUX_hn@FAGf8% zGYifMJB!U1V=J9)&LZUQ`?6muP5DqH8peBg`xJkb8Ps6*gVTxdcbHT7OME_d{Xq5? z#cM%Hf7AYR!eyRm)D0+soxv3r+@uYyA5MN$M_EuQYX>nO1EcjC+G>8rfs3@ir!a z>E-*SxMjR12NvfD?M@npvf1++H?d`WmF}s{b;aJoGj>_p7rW}`_)HaDzAEe0vT?2 z_sKHH5jeQyn2;Nb$6{zG=**ek`Z;t{wyS=2MpHs=#+Uae47~s0koUgk zCaRCQe{a4<(b&w#t^R1sQ}$Y2*_$KnDVTK!_D+0x@5__75~8k_O{!*IgT068l6P{u=JIHG?28+2P2J`V|mO~?5Z&4;SX z=%V&IDbpvi+aGdiw|#qXL1yuFy{zGyr(>rYRB2#-l4sJ6YQ^U+lg~+nPh+$mv7|xk z5C>`mvSz2en>wX>92*_VGw!x{##CMR=F}?>R5-fX6C%sC`Y7{tvwMo>mDg}z%NsR~ zg+ohwB^)UHI#Ip9hl5G=)`#-DMHW_ZPIv@3Gh|zxG?5lI_m70Zt$lDvH4;-6>SB1ZyO^{b2{3Poyfbm< z-tCijgeQqF%mb_uqs;Ck<{yC0mjymC-W!~KQocGq-aMCO>4?GolMrKB6b!HN-Vncw ztQuPSQZ#u$`tqmSZNJG6G%=2MM4baD32@GF6v9SKKF86-WfCV%PDgmGN*OGDQ?m5q zQktD!a+f47I%LW0kKn~Ek+x`So;mX=@#5Atd)(BvE5@DTTi3njZK`!(nGJ_T)LdyQ z$W_`Zs^UnM<~5kvZm|b?a0la0P(-kRHG~5>= z1<^gYSi8s_>!uwsi?{6I#kFqLNRsAaDU8S$3ex;L`a~8HeT2{ZQ!6gUs_V@>TrSrK z&Nhy%XV#9bH&+m@?*LL{lQxR&@3Y8IN0G{qWPb=8lPLo-HRqe$S<-hp98 z#Y3nyR!wGdti->KuEWwuIccEuh^|tv^N>Op4HOa|f|b?b!Vs~yJu2f=I>$yi^2z+A zr^UPrz%U|h|8gm*{j$@T5WC1J-uWx4)n@k87PgJVAso9Z&KCv{DBeb=a@!vl@D|=; zpNhixh1{~NYg`de)u4fB`hW_*U_DK4@rfRiV~yT{*XN%V9#`G)!q5zlTNz}>Va08|KzgWA+)|lp^yKbrcn(^C zhDJplGu!aeu5W!B_N`hjas=-}r)%}1(_*Er`uxoBi6LJwc8hHKL;j#zcef1?UrUd4 zGkVLhyoqmWXs07p$m!I{56g%P@;*(5(6q~9-csNC2?+1uQdvH-C8B5Kr@RYRg$k?H zRf9F&B?V4LU3Z6Zk%*HCzlqp`{7aWbK3N#PUJ6*?;UH_D%eXSq?_YX(y$C$&1Fstu zy!TsOWy_MR)+m;p-!#7IHDB`tSR3;Dn*H3EFpOQULc8m*(%1e%x=xqH+P8!p*4~M| zpWdofs(r0Vcvh(o5!{GVcgRGId7I3ez7Ch~&h|p_q@Igx;LON=@e8!y#hT}vG_Yc} zQU~?M$4B1&loOFHuBa{?Pmhe2IhRN-`Yg>tb&g{_U=n9ylax`-(3t%nKNPvri`b?? z04-y!2YAiy0}O=bLvo+h^6E+Kw!N~zM_VRAgAi}uo52;tBLnHMirza_vc{%JV$98NwK^KbC=+{>*d;_5O^9$ z$fs1Q3}$;Q78EqvLe9R)bY)d@&3*ZRDsI zSscoI>)Q!LoMJU-w{$!c2f`pj^-D@tSM`Vkbh|gIi(=xg-Pe4rPSwq+_9Bt`_?l}- zt2bM6=z|!!H{U|vakVrgl3gh8vdBKeAYyK82Dyg3iR=qYP^6fMvkpnFH;$^$zw1nr zjgj?{r}DUQgiqm4l1}rryh|fwkaSTJp6Yw6}`L(iuGc(e@}^$J=rwZne+ zRFQKFGvI3x5vv95uL|mG_Q|BE&rb_a(T6YjErN(k$5#{P_Ax;xwS`@#u0A|EUTLA2 z_s6#x$e3Rw%G!&(J}>3|4OXuq z&gS8G@To03N_^(Cwy8GR;t#l%XNOyfQ>W5~pQq7^(XTGKmIij@wj-JLHIE11s-wBF z8{JSQ)W%|^If)#0*bR>e;hD9Y?O7HivQG&>ArVp{~9<2|>!fcZY6$V*B2$$0Oa4kLBR`0OxwNn#dXGPpynP>6_MHz2s9?uM8uD^X6Y2BubR!;VK2zOek_>q-or3!Zbit|1EG>-xF3CJe zEFp^vShIU8z#6(pXnxzzn&62(mB;7N)8kon{8hnf^*GcK823o1Ym8e{+D-T7o(K=Q z?VDQ)$V^>$cM_^;?ugzyTZ*%=Tt*HSmWzEY4P>Z~ta6?2YY{bdZruxgE%Uf-_!;o4 zQkUK@m=V2qCPg8)pof?*W_NAtkLm_|&B9%T0yXvdDZb`0+?!8H!%qlOY;Gy!mNW=n zB3JdCkenZr%uz#Wfb`D_avsV;L6v6emDY7!h&|HjvOreBH!d!h{mm{lG`c+ zeUVzKl?3cFV*)sh%VA$pR6h|dLtkSvm%^M8r<`G7Pv!EhAIJLVYk7(i9Ame9K#w@h zl1r>bfEWzTkG0H^8{IFvIppAwAJA3^{6;CWC03nfei*$gIc94}G)G$5*O!u8R+imBby1!2wDaj+yuo{~g|@hr}uI^yYiWzO9~pQj}|P_3W=1bZL+ z)YS8Hx5P(F0c)t^>F1kz%u6F1{Z_{!2UC5w)iK3bhvneTEtOZRAF@P>r!R|=&KfC{ zR9!SiNSn1;s9ZgW@9%+(gZOT9L>9i^I|X5wI(3S}kt)7pqAgQ-jIg@3y`%`d9(^&5Uy~Y%_Br56$KYrM>Be zZoSMLgrk%)o;F*g_yCV%q?;Riilo7qMxqLMC?^JNgs+!;7IMp3NJ}A)F?R_YOBlpg z>-F>`Nwebz1=+mk%7I;MCW+>)_uWsvXiO`LUE+zx#57ud28@QNudt%7}s+qyWGS0QB^RsS_}I~dQ3h*rD;I}4phSh z)^I#7w5I;}TT3K+VWfZcl7BWFQXV_rKSk#Fh#YYr0Ziq0@)PqKME@YlamEOF>qZ*p(Q4aad zSPqG1iwtIk4QBNddC?-nicqEu>GZ&~IhZEXX3ahkDNy6b2v1Y`%-MUVY5{6~BD{C1 zT0m)Trl?Eh#%^nlu2MR{H$tVjp(jxbm-t-WH>)!#J2yK4nZtDFMK6A9D#m{rU9Cy_ z+Z&UUG^uM4as?aQen*zo;3DkzqoCmS<+3+i|$BCw>KI*5X-nwVkv9_t?*7^8XF?&H1Yq6@^3^< zM+3Msx?od$WXM$`QUe;+p={gn?%Wjl!0Br~09^FVudSPKxjeOe%u}r71y1utlgZ-R z{|{;J0v}~{CjQT4CdrTs6C_|1lqf;b2%^E7IH2J&Ay%RZF$oa^x~r6q_O}-11ylmT zNi>t!X=&GPb*rsb-D-7PtcrN4CPWi%*(`g-~2`|h_dr_wyB`pxo_n1!W>AF7-<4c~b{0%xyV5CK1__Ia- zty0a2mN&j{z26fpW1x;A`6V>0!0>zd9?r8G$JVeCr&*a^iUG;7-am~2K`J3YKwWiy zVRAQhG_{7oF{P6t6F~1Bk9YBfd8;$dBVlp_s|kROe}S4-9ef2^I5EbFxCkDU#hTF( zh+>C-CAy*(vLl?tG;vnvGD?Yj6Ph)MO3W&686tsIu})o%jgu4PC-NO(MI3_ou|Q5D zIrQUfvhk&&Oub=!ft_ZgST6d8knf}Di=I+r6;-+$enQ_scpzM1;Cx4k7Kw}_{ExLx zhq2N;J1;^Q%ezI&{bLa2QuXouF*KlhULfLF{(-1)#~Np`JxbMg;!X6RyEopv+P1!3 zn(3>kQm%=y=1U%H_ zd#Jv8EA3kc>eW@Tfr31!LRPVI5?~pGRm&W7p;X-m|Eg5I58F;5NEUEAzDalFR%X~66uRf zY!T+j)13o71O6Ov-gK>o6o7Ln9Bg$XAT5=kw^wqIw1v-vCny{lG$zOsOo9VYsWT77 z>nT%*$8nAn&qpeO`VZRK=R#?5h;gnIx}pbIncDQVOn;vo&y*3*^pme;>WF1Ze3WU4 zABGEu4#ODhJZS7RPX=p_nm>AqoWYvTV9k-B@l>$pSy6pF2x%26as_MlpxicIAGtQ{ z+MhzbJ@F5+STrA@j$A$`QL=t|A-oKfXw`K*_!8czW2UOq8Y}gvDv(qnN8QF>v%fr8 z+o8_WNjgN7y57pysYY3eav!Lxti&T~fWZm8IisLvkGtMYg#|T7(Z}S$EIA@gJ(<8Q zfQCLj{zUhEukj4K1Z`jz z$;#{3uXPDuL1Nn+Syso$1XP_bo4_eo>-EOjR`F?m&8HF_igzj4pta4iM3T7I%Sqn-Rlr57(DzZrrf60Mz zwf{WnC}g0!{(RlQ&X*;x6iSrRWu>gG1Ir}9j#a8$Jvvn6IKWKrQJq@=ms;Qrbemrj zU6C6#n*vP5UBAuBN-X=@t@co(peLAunH3$ulFdYS4!u%GO5+Xdg0(L+R zg0&kPC%Et3&SPwlsuHC!<_Tc|G)bkty4PO^!OQ(>VeS_aR`P%-A6>f0(_z+hfbe@e z5+>Q|pp0w)Tnc}xh74yk+8dqjSs`cYOzH00o#ADnT0O@9V%8jOnkQpi>E3iXV;nTz zWSD2I58J@^gB1rt>w#l)wB_zKOWuSG;!Za^wA5{BFe$V$p)u{u#?)EvP4nz?JX_a( zL=Wj6K;bObU1c*KM+F!WO~3D|YTty=M%@>0=dmYwTl!?^57Hs?D_)mA`2=6(4Yn#T zGNnI~3lvKJYEBVN$`_jVZXjujjAp5t2QF;h3**W5Mjb!7?WJnEPJ-dA-^6itWRn0< z<9OskF}-^%t-0X6l5Bck0~7Ra4r;Kb_l2MaXL>gV?-d|m8lV;7oQSbU9by?ojH7BV zf2-6E{nn{k`I~nb$a5mb5%nT(Xzhh(m>N8%qN69`3jR{+0{8f(G`>A)&l8Z$x}wtG z$dlBx=P90w$Xp*t%m$2Vn9|8@s= zsVLfuq<5@~6AVRrOLUBi_>kxr$wuw+gJ9h<}dy zER&NV$okIuPR4z7)D%qsfdFf*LMmevv^?}>#pykL4p2r-SvVaMm5fb zr`8M}blyT5+aU_9A4zOeUjzZ!06el%QN@eH!LATEqVK8UJi$Y`dX8zUCT>QOXo1xB zm^Qdo*SF_D0-k5Ku!|Fnvqgj4(H!x&=cs^8auPN{j^@BE?Kw6nRMG#K$X^=n5gw>P zcQuT;z-acLD^$_dxXv2_QTR0w=5=YbG?;3RG)FkL1#jG)6MdSydwkbe4z-vJ=|!Rv z#nvgoZ;g>wn6fKB5h86H3YW{sybe@@#o`?h?cvA3GW4}9p6kZ?%jq^sf=C4iGa3U*|)W2RfRT-GDVdY>^qXK zA%B(?_|%RDV_YFw0}!|Z~#pR)Y( z(5$}&`bVuw#5G4vYiRvka{ESBd$x{ip4bv-b|H3izIBBBF|8hzMNa@!7IZ0$R3%)K zP6|!~c~xhQmXRQ?%8i_etpwj}RmriWg;r9A#O+=!`NgiNs)5?0^6}sGM`>NSC2(sevVj4)QjlAq zuyNNWSz9_VV`ofXV~lj|3MF&O5xcV1oa>r3Gixwmwh_t9N093^e@HselF#fO-4 z|Lax{2xw{b0{G$46RxJKky@fBw${qlDz35|@*(9t-ZX!5VciTOrybW9O;pr6o-Q zN<-H;gMU2AZ%+qR_dP~N`9!Bh<+kI>7w;2tqPnV64k6wnkjL$pWrH^ zQ$E{*yyjFpr_MRpNCa!tq7A`{W}MEK9M9V)0loBWIhoixC+rS`LM!V3Fr7~}O_Obl!T zvu39`{Xuj7g9GkAwgrtn!IDn@h&LwCj@{U3qTI}k_(jqc^dO5f=~`$!rVpkb*!+@XA6{=gbb7pQ+l zFB7tF(FO!>z2+7+4~IACe9ddZ9W#yyR}JR~D=*Xq0gv*R825dtCEZe*kh%jZKta#j%P&}k-t552bBSdcXpK-5 zu#Vb200>kZ0a*~e!boK08({}I08TUD?7QoqXF$!8op}*-V7B=y^c21+oN5d>OR%s4 z%`m;qeYf_bJMDdqzmC0*espekkNyI!f?iL{io`&>eROYbOVAN$#S_30VX6P18}oo8 zMze|e7{Hr7ZL5lwCl=IhUU3z*OxNrov*JxzQ71ybkV!=bvJxIuXo1sl?ZD_}$By84 z2LgLQO5n~Je*q4?3RLv4hPM_=n?ya*tWXXlyDzW;0&m*_KX}vmU9_fUYe0cWz6!<4 zU@5RbgMVXZV3bYXS!RpJv0{9v+!@NeC!A!}FTVU)P79oc9>?-8f~hn!Jut&W<1o+? z38osygsOQvdMqFSA(Wlo-7y>(1>?#nCk!?#N0P+&NJzoVBe2Epe#V&-{+x>ibcggn zi@hmHe`>S4A9v=g_|$B{t^jNx25slgz|1G?3s9)MG|=sG|L(>dr#UyrIjL@)%{H@+ z?PRzQ&B$45I&+p1rGtna>xh}*G7`IPML_}-;?TBt$LG9zeU6J#X;Blo%+}ELysU=U zG`E)iLdvh7k+UuVrQ7MGt^dGg>sdz@m#A#^taH~3uTfpiCwF~_$EU4SVQn_e&vDm% zP-jUL4}GrQ-)1A=iQPyz)ESsrk3y-<-SB-1hSD=$y4v=NU>aRd@E-p-|J0A_N&ws- z?Q^LP9uKMayY5Q#kDL|0Tt@_=YUGLfhZ~Emj`7gj}=V@JYxKssjtU|bq{ajz~c957!Vq~4P!aq|jmC?C9 z$KCw5vzxDTn%}fI)RW{z${>B+jG`gg^ z0szdy^13&7*IWIox-?t7-@az~Q1xzK#y?xVQDIfxZ8GeB>q{d!KCbQAo)dap`GhKiZbmZAXip#=zoa6ik|BOi7Er(4eg6wX z?LU90{qFkjvgC9h-1S$B^IpNH2!Z$3NW*I5>zN zci*0gZBN(n&%YN&*P_<2gKJrZ9Nh#JR!OMn2y)|Fup=_5`K308wJ1JwgA`Yj1e zZulcalCDM6^7c)0mF@CCh{RuJ8@h6w5uSRiv#puq{^m6UFC78~GsJ7y~MEiuHs`F!2 zWxYaGlj2pie->>#2C&k6vZjMWRsT~!_eo)Ce}}Yx4>}Fjh%Ao*m4U^t6i`h&ke_Ft z{&SF5YseP+uUi7hqq6Ut6D&sdfB|(D=0`jPwYnV-)xN~`!eSW{UX})nZ`Xesms1^D zNzrhg$?d|=*|svdrw$gJEf(3tE< z+dK(NXe6-Z@9i1Vzxe$k6?bQtU}Dl>e@dCUh76=uNA8%RuCksZcT7{$V~^9-1+m9` zb$0A=vKk$GyhyoXkA>>*EPkLx?wG5-h(2z-iGHf1ydf?b>QEwG>DOHuW+zt9S9`Q2oIi7>Fsebd@j+x@ z@7i=X1HpO<7R_JG)+OcSU8D%B2dg9t&oFx)Yo?HRIvZcAE`(`fLhAcdp>K@U@I+6B z{W=2%zUmsj0;g-)Ep!i|+Dz%LHfuIchc6hpOdzRA;^zbRpG{zMq70kc`DTm-P9S_^Xc~AstX$KSf&ce z6h5RITB$xm9h!!^tcG$#IXRMB)pgRce>klB;gS90VLh%nXhXyL5eLUNhjkaZ%GCzG z4I9>%b{pdT1^)S+I7b7EC|<`6&dAR$vOCq5MXxqrq)8wo>e2%2whqDG}Fio6`_rB?#j{X zOZeVa@qe?5yUQyVi1m&73uhWvZ9GtH8F7+R;2&^o5ud`o#>p?o7F*5cVjW9T zR5>-`(aq>>w;+8EOCHqY1*^>#LKCl20(~22=vh%)C8Hke*;F}%(g6NS(WPED47}hq zf+7YJ)K4t^B(<%Vv>pX^?i^} zii}GNU#-FUP@8qa7!(eXgB-#{t&zC}>S?qO-_NB>gV)a*T&R6(NI&iBX(i*>wTOJW zn>Ae{V~=wD(^oeWson$ALu*!~^XS_PBYKk1n~T$oQJUT?;5&qOgHVgmoQh)@_c2`7k{{9_`_ z`n$O$dI_%Yz6j)KNMnTCHx%mO23aP~3CfVU+^+Q~j8QRKI$N53g}NM8O(J*DdZ34X5`#KHtF8OZyST8`_V zXamc+z8WFoWwtP&Ze>xN$y!M!xt^A(toaN(8b68H*oEh*2dk{qI ziHwd=@B|b}f>j3|f0~#=Z@yliR-13M{zzpcmg+xxf!~(?6qp$kljhipXK*)EKtZV! z2zVrGG4R|F6;6p!B7xPu)hIEYE=Nb720bp&AD4O`m+Bt3s`lk9%a3Q#^Fz*<`p=m^&oOCiDkssP)0k{}JI!Lm90vk7Ir(H1sy;DyDFp4@qq=!)FLYU2 z9i4nV_qOzBWl9{b+Y&eGhn8T;PR~}{<=^ar<(d}m(c2Hjp`blR_*_7xb+sSaj9Y*( zRs9^Gkvm+&{FzmUCo;?owprUzSNkz1EuGDj&bC$#S?yP!(r`$PPUHi@VkbaT)of{W z$(~@b)&f3-$ZBPP1Yj$S%4+`J^+HTS&2hu_k@MzO)S5YOw3lHnXNaNvTVx8;zJAt3 zmr_~T&?zG~O%^xJ+Drt{nd%|tvf9&D9lFE5Cc*46Yjc?RRMsA(=W185HYcySz&lx# z@i3>C5+UbXtOy$xDZQ2Ku062(5TuE?M~v4(&eKB0E>DZdW&M}Uv>|$1HCnYMAU`>R zCc)Y5(9LZ9(WR>Wa!PCUf)VYGci-jcXmx=jA(=TWG6+#wS-=4VN`*q3NmWsciH~JZ z*Y-#G>Q!R#C9JnEQ%J@olDoc*46jJV4HX&weACOdV2Lz5J?c_BiJq0D7v;f+zNJ1g$t|THKW&mMH6i6SnNklsjD>Xm(6k1e5d84 zi&*4UW>Q{cX~B%*T7NS1Ll2lp9) zux0}s6&F~gx5=^{&&+`djL!FVg9ms!Ew2uL=N>GUnh=BdXLKdQnXf-oeh5lT_aOayF;QGRON3x(=0SRxm^#RjRk1 zVV&@JxUvdK;bm)>Ebe!WV)#44`>gdNY=|kGDMLB#w~&ymN_Fr(1`pRg7GuAZH&kF(d_HlAJ-&Q!bh>vm*Us+rMtjH&dwV$IlKHRDh?UHuTa z@g794%)D(iU2EtQ*uZMJ`u+epGNfZw`YtVr^UOF6Gyj`}#|!aLf|~S)$;I^ZDJpC|A-~z3w#Sp80IcUz;lJk9%sDv?;5fW(L#Y`H#T2wTeeVsTuGcEKl0>rtMA3WJRphp%a1(yMyrz8m(7y6QGVpfH%8^f zzUaiKScByp$w$P*rLWyk3+J(8&8N1l9H>ciL<=N1wNxD1)Qfg&E3F}1BGLeXKmp=-3?Aa0ws=b*etDgY_NP_ zVY6y(&)dVI+P~d%Q2QV%gLHRdzICz z6&)K7x1Nu9W0TOxvzinWUoLx8N@^H&QrxM2I;=SET!uNb(zCd@CNgOuFrusBDJiaD zG)nPARsKI0FC8krQHpCA4@mJOl{u_9O04 zTAxQ*Ga_ddGxD(2{is9rN_9TP^@50du8CC^&Xj`I)I33{Qq{-_p_>rxyFT#h<;;0h z8h@Iq(sOI=1R9?q(|gL?@?yPT&jth(M5W$T>J{;=Asg~*jUO$Zb(sVuoDQ1*sMY+~ z?5T%i<^IuXVnaq3nEK;?%ZZpqwejAsiWUDqEq1{hXxoEU+oFrTQcaHm|K`wYhsg(N zPxY|zRF}sJjQjSjp z8#nbBk7|?r?2w;M`T0_QQYfM($j@~7`B(Xw%TLz|encg9*=AX#da25jFIoLR-BN3! z3x`e;&E}rAOiA`m`H?4Iin?kjI~LIGVRzL~8Nof#oPAjkgUxcV=k4=sjUo)=wgoaDOQ1&4-wY+j!n!ftvN1l9XYKJsFdMe+zY?*wyNq*$Xm!Y1O z&v+|^8S0-o)EaXu%)<++P@k&pc?KjU?U`o;Gxgca%pK8L`j(UnSKI8n#*X5oimVrMbaAm}giC$!k+;f5RP$YJ)AC&GIokY(-rilWo;AkTc zSvVTF%J0GbG=k=HEDjo-p3Cky0ijU+n4dqUb0e+zt`)B({VDuE>*UDvjcUt6DTai^ z5%C_4WezlFvqBfL>*D!@nzn!iayHtE!Vkwtd4veawBYreN@3HYTct%YlujE;;Hz~* zi;@OR(oab|jl*(J9X(Fg&2Mlu^_+vZYK%dGNw{;5`})BIHssw*o9?GgO9Qo^pd0mb zDn@?LEtG5%&y{8#`sj`}(3H)#Y?vB7LTp#6jn}~dECvy;#*&E?90zi8AnY12U7`>= zH*jLme^t}<6P&$U?EdfcZXsYsS!B#IMxH^NXtoow4WE1`v`;?ofFm;`Zu!vAo1N7( zcY?EVHVl)2d0KUEz%yw4)5dY1xs9uI9V%IL- z%besLZmjtj(M!4d{UCqm3==Gzidsg3Em zZEL>i)S;Go=ej1_{i&5|9}Pk!Jv>qcsJ`7cg7?6#$UjMxc=1xFwn}~03g!fX8gvB) z2aPdm0ssTqHg#bfaQNni-ql{uWwOpz%tV3pZCNvffcjdy&K2n`!YnPo6}K~n$g`uO z>SV?=JWjRjv7qnduhnejok`MG5Si$95?ZxN^{}#K?}EklhOd2022$cUjOeXZ-5!`iM$!YP~E`Z_jS}VmPtfp=l8Y~od5FXj;@xlDyYG(Vo0*V!7^uF{pp#Spex5QB|f!4o=#{Y^95uR;c&L}Lvlc9B_8B;6O+Y6{RRGIdwoIeEL+M2qf$NgLis$?|- zoO``{aKnB^rD~OILb;qYUXd!ZZPuAVOQwa7`|_by(|cgc+mN|!N3R0+VOl$GzixH1 z4-Cr9TIP^ekM{EU@|UGPf>rg5a8;@@fgb*Y?!o$QVbl&?eeliUCdO7KoEU4*u$(f2 zwGRd>UNGm{vx43S@XqdN50-QUy-!5OJj+=_L<(^jsV{foxL;m;#e^Q}n>wRffJdt}4ZDtUXA3Z1KD6na+eX9HQx~=$dD8%w0 zSEAh#k)C`zX;d5eg=rT?3m_fnXzjq0sJ0g@dx2@&H_R?MTqtvgEA z2O?uu>pRt5|Bg(ju`$%E;i+Zq1qE_Reb*WYqlSHJC*gq9`+}LKS6q|RxD<~XlLJN0guuxZV~j6-QMr0D zmYxy8kgCWf`jNE*%XfsKyM+l8OwzLYn4m(c!4T>Xj{%MIwZa^faE16B?&S{Eet+xM zOd}TR3>7)dRwPwFR=N~5=L<}CE}l!6&bTpPp@Bs0OH`naskURx;YKC z7&Wo`l!FN2YKvKs8TjC;mj0yMw&ja)QS@ZsxIJmkb!8zw`I+F)j`Q%$ zGoI}$R+xX3#L$Za{PLbfG=&){Msj41t1T(Li0Bj{?@4q&j)oc}N3bL#wg+izjm!h zcP(thyEMuDlK49c^rslV7~=$$4D%pA1lFf-U7l{nD+ z2!^aFe8&9Bv)3JXQ}*hMl7!zw2rSRw3ZnVCS-pW1DaHt2`VC8i8MtA?{~*61BKox~ zKP;@^WfcgzLm^oMWq3fOXl~2i{!+6Av)N^G>nP6*IbiTAoE>aXWMi3^A@geXU&aW9 zx=G1xWJ zHWRNF&v9oU@yu2qzh#ZV7yOOtAKhjF?E0}>I-t$q%!1B0=M(4yS4q^Svz=%A0dbxGUs zRFW}XP0@vgsv_B!Q4Qt{{%Prwfo77eMM-Sfbmh=F&m|`kRO=Jzli}{EaSm1*nl_>< zP~Xf)|BIq~0E(XG8`L1r(a#A{@RHs)lpeT==)M-jr<)N+qniZKn*}KP4e-s<)c3Hb ztp+_omCaSIBn+N*N;FC!4Qq7Rfoe>QZ7=06K6Xlf&sH;AV`DwM=w^|zLNA=!<54=V z?(x3pr&y0KNceh>pZ~x2_}>I*tj7kzwrXS8|8#oc7}c=R`#O`l&9BLR!6D!#du zXoAUnV8U^A+J@d1#QGa#h6%|O5ykLJa(fC11x#;?v#v(90?ayxw@RE z@eI-{9eWtGHhinNh#nXCYS2FxyU*=Hfxu5`&UZL9O^MuN188z@A$z&imrzx;K+R9J z*(PqW5NhN1!B|p3|3+Wrq#fQD?v+??0$mAK ze)9OwwM{K-199%11}5Rs!}u%%iHpZYtLgfJ+0`qhrt2W*ntp_< zPzXI(T|g5iLAK^aUqp`PQr*z5rRuvd>aSwHMvE1$8Cf7n3uSn&fdUc@XKu5@e~hCA z*GsWmo-nK@y>Zhcph$8 z+S2XWv2LXM{_QlvbIg6u7HJH6UUFwPBX*NV*F(8IX4|;!=H9M8`P?oXHfW&T`Qn7x zx}|aG3~7G>bvDALw&!y4UY+(3ipTG8COiBUC=?Nx6VC)a#<`|-hJp!A!Mmdbfs;0i zPhyUet_P$FD@Wa$1dx~lZUwQQ(}ST?cz7qw88hD_yy8{#qU)EEe^9k3Zzt%5f)-vrCSS#%2Ix zbr8Ii$+YqK8X|iRAXF$X?dqWsa(GuN!7P|!)NPDwJQW#6ksiVxK;dQ4(NbEb3WM{Ec>cL795?h(?mlugo5hCXth>he*n88+Xv*rDGXU@rKa# zS#ru=!`C4OBV}CbI9l_vUl3W`$;OV&g?PcyYgu%o9`YqDC{Q4v&)r)Vu&Wno@+QR*|$Ki^A}2wU(faKY zbKDIFcoM3(hi|x%qs7qw@(e&&7Mr6SDTJ$JvnHfm?be$o1BJ``W&f-b)$DtkcrqW+ z4b;#Y4zIgwjjKSnebpVIKMGVlhV+L*`l+|zXVNRfiNvPBvwOv5P4*e-D9Fu=5Z7`{ z-JSLn!#yjUhVUlJ&~$7KwAlmuY_mKs>Vi8w`;B(1vAJ7Wz7E~n(La-3h7P=pp(O1o|`!Ai5;GZg|Rxf)YZ(rWw+!kye#zp!LPVD!Osw+q_;3Vh@ z=Xl;XK0~7=pLLC!3(1|^mUp;tuafXuRssASUnwP8qy!uYDbwwKV!PdeL+hcNvZgBs zq$!FfJjA0fYuRc!=5KioTDTVXIfF))djBP+JKLr{;ct`{-p1&nj@pYpT=_rgK_o$xes)9xgyE0nyPIFJg!+zB^u> zs9yZ4_2w)Nu8}~Y_uci3_oN@J3_x2S6)37(SUD{@$zp~d!K zO}~-sOW2rF9d=+%O6`ulWHkD_gh|4t_9|{&%^wzj1>LdT?7t;Y3zg2^=!q|t{K>`s z^P4Inp(5DdN9(>yF`SKK!=qpqMzb_tpMRlwlz zQv0nDlkXBKH@%4a%u{jPeGefuBjK~9K5NvQ<`ztTs?czyB{cFBChwU=xyObxVFTTe zO+#Z^$)w4c%3xZ<>Pxvnmiqi;Mpi{fc4@(A8QElOWRqoNuNgM7MVzm`GZ%7y%7S&j zl(N*b)m@)XYG^i|(@VOskq(YT{?nGw)g?piJ-*_C(BcGN3M0LU$VWz!iJP!6ccm|Z z(XNKq=-4ac{i+^sE*0VA3$Zf5c&pfWyX$|lE42f zJvSIgxzy#L;4InbS3lfCflXJLBL+oJlSJ15&G|>uG=h9qncQPAP=`+!!KB!VjETPA zJ`(arZhK*FO_N)VsYKyf%hmKWRt!XC0vfeQz5p9rv!zSiPU0i9GIU3zX=MGj)yZ(5 ze!+m{?Q?HxnT=2Mubit+^Bh|~^4i(%O-Xf|MRa8IcQuXVbM%sc2b7_n|AQPB7gDlI zl&lKD8JvzU2-qV0Fd6a7iWsm93BdvKeXsd>S5A0#x*J$*{f-&3~Y^|5jO=~ISKKO`J5`;m0)Hv2-E^YFy6uv{45 z{b%~82l~^EGeXq~o_AK9re_sqg`M*tWg$y65ihqIm14eF!JI7Hm*cNkZ>cDAfdGop zBXItx$q9>c`=V27DbL82wD-kf?AiJBK(3@J{zk8)KQp$%o_&$OG4`xnPydiTYoCmt zb2*#V*Jf}ctXnxoeYw#BYtvvw8XjI#sa~BTH`cc@aDf2>cQ3`PR;cGK2>&|oO`zh?;C$?-HuVr-wPr=f3b7`P&asS2EwOZtjvVQ;)}*E-NI)NLA<@Yi#ebxD^C zO4e%b-~vXAtZPgD7*1IKvh#x!za2x60YhKSaQ=tHML1RUv(*63ryxzbkcK>zqGZNQNp!C6t z?yhE;Bh4a)OX&ynInz{Kyash*9Lj2YWY^Ymc}5FGzG{3oVe@XkY3e57CJ8EeMXAq z5LAW=!Lxjs*O)-yxBjcSo`?_JE%c2AtBoQll<}_<6oFvBRx*%sH6;J{xVHb54?_U# zz63x-GcExXFmeTk;rTj@i!2xufiWQpK&me3@j0U9fwZJ;uKl8va&;y5gUB3zC{X0C zvyKSOU9S<(`TAOk$`R+&lLX_ta?u|xh1lAw_}r~?yk;>(CdAI4+r$`w4OOZBQ#3yy zFT38BQ4zhgjL?jE;S1Wlof>7(km7JG^xuC2xe7{-u3F%LNgycIP|Jj5ep(vhKYec( z_*fcLTX(toNOS5kG3UE~?`L(jokGkVDfg$S9E%4U{!nEy)#2k-3w?=8K=V#lC!US( z>%%+-^SkB=s@4Akcf;j8`_rJg^YqSr{0(1)5cPfCM?T!^OZRrSJC^pA`)#k+8Dhmr|Q z{j6vni`S;LQ8gc3k~Om)j>5_;_zCdC4m13vN-%%)_t+Yer_?2;Yofye-_%_%!eq@6 zNivqmRr8jV5f#MC@6 zJu~is>x~ne?6|nVwSIM$sFfM#S^XBeIo6*RC3LgU%nDwMMT%Wbqh&;T#=>eKhDW_@<7D9}RFuiqD{?LguFaAdrAuA5C8yf|V1l%28mEmm z_<8qNTDFP7&-_&kB0CF%pSa!8FoU1E-^#+1lL_;LD9R7#uUu|lu>uuq5^d}6u9t|I z;!%7IqakK}X}oJMWL;Po!a^3xq(>D^pugVZ>sMPY=FeGnJtUjOE<3y)Se7oWJNOJ$ zc0JBdOo?C&!^c^Xgmw(9bfTtd97c5DNa2J<)~IbSW}C)w#>l?*0?%USn)Ag((uHO+ zTbIS=til%>ZpaRvMOEa}?$A=nxO`gOI>I1dXs&dI^I~Q4dZiStErRnf0z*^vE6Q1g zMygw%mZ1@B3bO6%mU?&`!0Ky~bj}u-v{3$_fE?R^F^++(+ovt!AU?KP*3cSb3TiV} zX6Ui>C!CXy8U8C&CHE|h0Y@M;5=9m&iCp*2Q>+v1?cjRs4ZA{Q1OW?`C^{;`-3={Y zjCUIC)&C-`KG5wO6S|Aez&{-znHAyUw@~2}Y*& z#E%i+%FD5!JgvaUSP9b$L`+Q+W9K*1RJkEX8hY zOs1}P+9j5SExZr1fL0(?fXm?}bf>+vvP?ZUUfPt+%1kdX28_ok@O01-e$qM@1O0ay z8@|?x-zuvWfBFrr(2hFhWil9da4_l(CW9WO*=5{AdfYRkM_4C+t+`jT^F_)j>7Oon{8asp1tcvuW@=#tVqXC*9c?`+R{E_;-1v) zey1-Xe9Y$veAu~H1BYl*e~XrZ%?eqFxxRPwEP~bGvHp`HRy12u+x!X7+3P;AH(`<~Awy!~iaq$x#I+~my;RobUxDSkWxD%j|aSPnAbleKgv z2AY#WilE^0np0bR(-sIv@VP1s8z0lRQJ6v@yR#M-1{;lv~3~u8;S_pY3M4mk=U439R7^S@pzB; zN7tPw5N7<*x|S=#_?v8Wg&l*17(}lfUB##nXXw@s^(GSCI#}LEaB65I3S+Ck$s2iY zdUI!@vy_o@&>Q7zV=T4`m$08OF-&!C$?ztk)%g-t=Eoal8&XAbL#F6q*=QOk|8xulz;mpzV zm61yRiR%&rCvI6j9+~7VWd20zC$n=J*(G!Gym;2LC2Pv^)5)4b);Gv%WwdhDwM=Vt zH_o%0{dKhmY>O9(3y`g`v#OnwDoWN!P~heaOj|29s*EOSpmNrqok!9?xz_!OkExm!`T?{)u*2d0aH3rgjHFC+4q&d?J5?AVP! zKs`_^Gbu3u65En(!etaAakS4Y135V&s}w^mM`N5jCz3c|W-yIn_QK!>nnx6P(^id9 zEm-kbXQ9WuDbkb{)=$}4t;iKQr|mmMfNGaTb6hZ zu5p=L9_owOieNnre|6X@oq^h{1S7MqU>Z@R97Om-xKeObujS~~jAP|TwT~BWQk>#} zEL-8#t{XYz!yzrNStLqm*&Jt<(WYeZISz--_3kyN&h^Ms=bE9FGgD@nZQ*E_v1FP> z{nyb}s$RT%XnK=u;j!p8S<_3UC?8o9n>B1=L7Bw262^}zeJm4LlZh`Y7)mgduW??T zUxDW<&n`n&n@7)B%hGmd{xlnJ=59n?#)!~$_O|3H;v;B|v!Qw2RIt`LGQLK_AMACt zSvJ43exGp~hDSo7sCT)LVf--DdChJ1X@!m!)JRd)SiqgEGrT4l7)h1_Acu}a`z#Ir z&I|hRx{+mr$<|gYMl=@Kdv&RS%0l0?Qsuyq6ubL6g28h0h@NYAd}87oFH?6qOAMqS z+^m`CK6NI%j3taU0{G~Vw}IO3DYVS}z?Nc;NmgBG`kCBS{zQ01xm#o(l>lj=tct}q z^{%05aM;33RZnrCe_&0nr@i+40&jn93al@*Voo#`!6RhTcGG{EqH=YM#u~C@XGYVl zooRjj0SrF9Gh>KeSraNT6`Aniu=C-zLZp@9OXDTQ*9RZ#{i22`s@zkRC>(m4UO30YBsbm=A?DG#(?LGam{lat&aAH^<6hR}Z! z`9=0t!cges@1@4pISrC%ADnHNPF98Pw4(;A;q8`v6LOA41MTmfdhf)s7w}Fn7YHl& z8#~NOr(iBg)>Q`nqLwr>pv=4brG8^XAmS3Gns9}xS^`g|**J|8Cxhivsg6aJh zNvp9qj^OscsGtZ$eVwx)Y56%QR-C0HRvDSrM>ikWrL6h5AZdj&{K0VLin21z1LS@l zs}4QFIj0fe@)SAex-MnO1!^;FE02O7+5GQG>sEGfn&ZbRFgVM9T42zN7sJ6KzpD{n z<%9DKagv5?JO}T?ovzeYGzLHtJH>iUTkBoS)D$dqu1j0vEXZ1s)P`YR*wI)c5>Ppm z5ucZ-5f)0>^@3mt7Nm^SR^P1DOqaTa5ewfE`1Dr)Y=Q^)Cy=lFTQjz@TEZTI^9>jiPU=+|&i;qBq-(Ck z}?rRn!+Rq6!vEzg7goGSGyS>sT!u0mq@b zyG2QpX3Allh}i+|KewUA$1%t9Juk1f!01_fhWmAlL(l--b*^+p_zn_vuV>B2G9Ka6 zv_fAvRrhu?3!%C?>Jw&(diAGT%BmeJaa3=!7o^`Pg31S)t(to2gym`@F)j>N)%99gTdII*M$kzb5YqP)^ z-WZmT$Lm^|$T3{gO0e*b=rYl|TXb?fmn81WJ0Is7J}hcgi_`EM$Hn{@UAG*~Ws_yd z(Oi9^oFwjs^?cWk=EA#&`!EH5upjRHchTCi_I1Xpw{0H?`;`r&lviW56_ zcY`KKP!(@;20`pGdo!NI^A$d`U_93hdwXJ+KuOOWL0t}UVa=u*&)dekX2o&wqIsBzzsA47WPg=oDj@I(? z{x0~l@WneUJ~(0FYx_gadr_Q0lLULP<3fBaGT+873sfD)R8UQ!*}B$*+4}0K=;57% zP2BLJev;ebV9i4iu)(cexSU3r6oyrwMqiwc5~wS}&!c{L#CVpOKo%LCW*#e7d)SFs z=^il;5`C}YDE+3}1rZMl2hUzF6XL+;Qy1*xmb|l*HLUHzd}<0Z=}`X zR4^?%+83DPbXKXql8g(g#f!rAc@Zl%)mlfa!Rxyp1jx|AEc&^49Hr&1;Ln~w@afs@ zpNM+N#s1T0+~^-Y;|jmKtV(@xzg~-5@eco2Q)g?kH#R&&_8C`zugcid{*$0WkBd7g#GROtsI9n+Z{YiY{9CH zzrlt^`F&(Hzm1QG6_&aTNl0m^L5ktf?B~Cdn$kj{XL%P7{>)7op1&Ie3RmKo7tly$ zRf4c(MP8K7N&Dtn?K3;Nh|yy+8zddpbFQo9L_#oB&s*@3`}OYz{riCa6;HvzM;_+4 z@sUUQRlh|{KvQH4_#*}QBQ6~|mi6VDAuW>D2!Oi$sm7?LVmr>_F04B-)kw@=nBdR0 z8Wnj_`pGTwTmH!2Zm8pdZF^(BuF9Vlc~M}f6j9U&HArto-*&Usw{Gv(Qex2kn=%N)+G=|FY>n6&=zK!fZ$j+ZcUd* zbd2z4E&^TKgE4>Rzy2xtv>p)NPldG`Q{}-EvFIn<@@*d1Uz9??rF$>qhR#+d!SBq% z;y`m2(Mm5{#^tCsVxw&)X*X(R`eUMS&gJv%^7$w7nclvcEdlmmF-aIbIO(Vu+t%l6 zAMm0B{N?k~jU*kDjb9_LhTiyW}aoqWihy3PG zmh~so`jesm#1J`n1B}=&X;EO3pT>!#2h7Yktvyj*X*MpqwjxLiUli#7`>DxqO7a+J zDM$rUPp^fhk88^cCt;j-h^TEEsNbqjj8@yX2LBUrgh?pMP(A{{- zc;*cmkKB_@&dXsuNMwR9L#B-8E7G!E|t(ji~J)+r2e zOHvVPQ2lH*L(u~_*T26;_Ha5df~Fs&2KJgKOPzm!7@sa(AUuRHpQomUnARu$Q# zVv(^35{a&d?0&M$`R?0{{1|1{ zlCmX9sD^~59gX)V$p}j4-VD!-^?66A>{p@L*@6BuR;AR%RDjL4+fV_pW4~g&z1ZZGrri>4n8|b+Kob zQ+#U4^;xwnoB39AJ|ss!;k6`$CPudzFKb+9W%02m&3=a_W!jSg zivA!Uxqpj`Y36YMicf|x=>vT!iHI?CCin`>UO_}49v~gM`QJ|@O0ET|m56t8VtX@9 z+vD}nJ6-?ED;oZr<=kof_n3x%ZPbP1eZrygk1SX<-#@}!Rg9y6AB2f{pi+KB!vr^9 zRV)SpxF*l@pU>B5q=+QLy?)S&6oC;Qi=f)f3+k*rk)+rW2G(l}|2IAqftMigTED4j zs6M#?N#WGhe`duB@p3gpYFN$#7rS4|TwAWF0{YIt$we8)4JRU80u)hOpss0!p zn1#c3l4kbsy!@l}Czam7dwFxe1iNxfb5t)^v>rCg?)G#T=ZR^>>#{=-jxG(Z9Zw)7 zI7@5gEU8q7skKW~;3Pse9#Up#2!2B!Nui=FZnx51ni&#Y43|+QSfGqo>S{lw%%}cy ztgHS^_olt>O)ld2uv46~Jlj|HVkIOD^!GzWXTCg0gX&zaLOHMc*um;LE+E#|z0xim z{LbrI$_N$Alq1&NAR3JjPhHRPcUVK(|D+pooA>B6wA({OUk}6QnmhIkw8LiEJ$qJu$bm#qA7dAK4mhB30U{7_F5g^E z4>4zv<*zoLkjZpf?ZYu9Rx`e&(1rm(Em>-6|Lj3~=;{P%La1N|5JZ{ZeQQN zi3j`M(-fYOjTLJ$$ESm{aslIiYP&mV_s|`QA|j55mKI#$Kc~{%9{M4X4aAasDf%a0 zO1z{{=6A*Ue8CmQ2aC}Q#eJ#nt@wOI&6rJNqItxTR9&gyKng8lc2woQxA!C&s-htZ zax8M@JEiK@_vLh#qy21Q#6t^Jl~o#R6sEc95*!(^&n!T!s)0{HsMO}w*A<-Mza}z$y?P%-1k#R6i;$Z2hlwKC5bt^io5IOB!x)B%}{BAXOH`y*LlYmZzOV+ zJMagdeNI@+pV26Q^=lOf0BB(D`k(S$G|>cH@Ww``9t#=Ab)jnsplI=|KgR^KC;@LJ z$JNc!6q%1+zcAmp(ks=1pXreUmtQD)UTwKv*DS|Y_v>Cw^G$4NtcDy?$JSXQVq>Iw z|2_)rh$>=Ks{N=SRO7m7E6Elvz{e`}nj|k_#fbb%ll2RUVH6E6E%Y#4^+{%WQTR&}Zm~=4t&NdL>1I-s(=lVFe;jwk z=@QUWm_~^Z}Txad9`o87tgs@x3zAmWEJx zwxIJ>=xU^vtG}*gl2CNR<2JsAGZ6Xz2`(@fyo4kQu6J zjf^Q|hc`4oE^d&;t6*S~JlQ}gbUUPN;Mfa~ zRX?YNQO)r?c?@I={u#I8{zr|r0>=BsFY6b2X7jz;0bmV$nre>SV9ikwTnsL253G;W zF*>z#qw3N@ZwKRdy?O*HFg~8_(nJ}wLi7EWzb2I{kZ#sOtC({-wYqOx;bd%k;^Vym zh{B&bg(=e-YLtZ{&QE%L`3nimOl;1ZdW+DGKNHMB23cPGqj-_VW9>*bM^E_AxfpM? zJ><);?mN-)aZ+e{vgIUDEJ-mVjhbb&iIc#XiN=k%8hWqG$2OVQl_i^{MyC2Vb@8dT z*bL0$_oDO2@ru(V<`Jh!9l+GsJ&c#~Y?z`x^6)pjGJ&pb}dYtHQ%K9Qv|k)<+` zr9%^`Aq3`Al%r#;+Dqjz{eK>h4~3vrQ9+lro!#}H$kY|3 zc@l3Yl7Iw_8~>Qhby0>V@s4Opij|V-N%Tik`XAMKvOI~aqbVO*DdRnfYoaL!tdwj| zVqG+4iW98J03N-6XtJ{nEA%SxHc?Hf&5W~CH+ z5}%5uR9Y$XJ&DgoQ|3xa>~;urXUX*_dWIspsKE-YyTE*wu`o_AFoonJ>e30!AYQ+T z;$3;L0(?-`ssJFYW*m(TsAIokR<+~>61K3bLh=YkIY#pIlc%;{?T+S&7$Yjx7G5y; z3%n}zfMANnu`cmfK3FA=t4HD`PODTKo5sOADF(5$*-~&1cBt)L=)m%D#abX5ffh3)bW^$a? zez){-t*zeb_t)E(w=EB`NG8EN&_V)K6CoN9^^AiUM3aCq^Z%`V&P)=dkNf|=zb%=4 z_H*sM*Is+=wbx!tSiL^v?ICnFjfHNdwrQNc)@DoVlIz0S5ia+rSnf9lqDQ;jm&c-O ziT3StSp~+xo4eejV~M{SD3j%KBN8(kerzB*$K_rai}nsgPjtDjRMD^%D~Ggjoy&bi zEM@jUf$LrF#j)r~1JSuI_mWujsDbDkTyD;F07LcB34=Q@$>lDIrMydu)vp^}?t5d= z2L__Q>~dpd-mGWmK=f1@WO*rPV54zJ_0wDovJ^;k8IKGUD2$CW(cc}2o*f%!qL&Ut z&x;Ku(KClse@|>QN%@jW8G)YYbr_&rWE6_j(b)8)g%{sd0baF~5rFp(uY-(>;^L)| zwBWp!igT$OaT9w-O(G)Ck0Rrz72u5h`F=~GDV9#M)o&nJ>S z7;kUiOffseJ%Aa-)dr%QSlEd$KNg-Gm@_#Rz9lf{7VtG7?&lH%n(nKjHn=K#R}?L& z&9GTlLzj^FC3r_h|0qovzx{bM8ePBHc$Qy|Qxu-H8FBMVQZk^jKr@H3Ac);@xMD5q zZ%a93@C8ZtTQSSb7-vD!8Y|{bGiGu@(&JXlt!B(E1xY`$VkSt;0C_;`34R9^T;2t- z8uA}eG~x36M-+|FFuhgO_mZLwa!kyN&ShO-D$5v6H6~xpbHT>&MmaO?P}0)R)BtnA zA|_YmfKJtY#_yhxZo|N7i;VvyjLfDmJd;v^+i5@lWocHcx|0Y>z9c0r%HmZ87jalh zGrl3=@MB~}xPaVKSH;}JMSt6P_ZsABXajdGbZa23=ua7~#HDowXR(K6#^Ux^ag$vX zlzd>{^Ta8#5S(?3%PLOv|5DL{l-Dm(Z;*LR^B+v3x7T=!UpZsp;tzVj_;#j%MrYw;i{uOhqK!~ncRAXQ8<_z+`#qqXWp)XEgn(3s3knmg`SQ6 zf@mU@6vMA0u{N%{53o5CaFKsgpmH_SyVRX>A2@|ZKqQF-y~mxh%2(Txcc`aFKOc0w zC~_HQ1)C)<2xVtyr+q$FwBDoqZV)P4q6JX;SKWO4TziR?jc2 z0?(-EtXTA;R`hccy~du&99whnZ7W3xhHFh~EQP&l(Lf`MRrBN2HiJjxe5;JO2y?m3 zMu6%XD|)#^4>UrGQ&lxBtzN8WtysrsRY%S3WhlNitc!d!bbW}Bq-fB5>!ySYIGyy4L%~MB~|{lPrl5ya9PHeZ{O_T zBc~*px_78#x%QW@=hT zaByOwJ^v+v!<+JQ)=sWG=d3XwYZ^gvTT-G?sC#^ahLqX35yb{3_gQ}ZCB~P@1LcY2 zlr$;|Pb)U#N+L_6e-uPA-hitMs34SiU}@v~b_u(KNI&+MLua}x@F z+Roebk3}{HQddLYDg+%svdh-I1%E;QW)u zd>#quE5;z*NJha&UrLjVVo_EJ8Ac%FL6{zMUx&jVLk4{`QbG}e%JL14z~+OK?i92R z^w_JZs{%#MC6$8-owD(RtZP{$l(U`}P*k z0L|)(7Gmp8wh{P{1if1N5dWwc{PEbpM=@6{^CqsWe6Y8gyF#u2FF{e4@`=6&)q|>q zeX;LQrX22HkG`M~M({e$N0`!s68#a`km${~rYpAP0e#M9zE+A*vs8aX!BfixBAP}u7{KZp*K=a_%iIwH% zAdOX`&Jog_<}wbWixJH;UgJmY(7tj8Zj?S(X;DcY2*>Xw5!&yocla7J(PyMW?+eAo zPb8k{j7_3?Z#b&*oUCvU4uT8eAuC@1fI@tW(oDG}^|ORj<171B&MS1asvl>~4KFs{ zIWIS3(-b^08p3)572-9U+^MR0-q4!CBc^P9S9IP0E~O5}B|a(u$V4nY25>3$Z{gCg z3vg)|N4UYb1e2h6QZYj(qO^BBoa-MriPHkaLcvY<=otpLj{a(OQ=Kfv?7h=r6W4r~ zVxl<{ow6E#BPGUk;9?4RI~14Lqzb6ro~#HKCQnjkvy{2mE%g1RQafXv&1+h>5*2UP}W>ko{|Y1 zpieS)SP`br?j^3u1x_)wVa#RAK?JjP8b*RiDG4q_hCTQ?4DzW|pbrX)#A0Ie>;Hm1907^4-Y=5fZA^Yb&y6a zhyX{m2un_jEvm6`56`m&iqnlvwAVey>4;T4AR5Q#aw^Yz}h z0YALIByhz>`yG)JdR=_7gdh!?ED`$~|5+}?J?P&olUC@`7u?^|epPej@uaS3v@(>K zi2_!MQN%qG(~vrT&eFp0I;LllSpWr}#m2*T$W5PVMW1sJdc}Ka$BllC)alaatQK{? z35isglt6u`AAU-&sLwfm<JQ*Q&&tXmrE!L3QMp2@5DHY!CSsEKR(yu{*MO36At>rS?I6g%JX3lvU??@I1xqWNZGgxKMFhHIM^~a(5nv74bdIAU8`y&_+nQJTvJ1t zo>^9KiTCOztzwQ$TUMkI@%jmMFh`0zXvSpwKqi;!a-;Xq^0=yU zl$)m$29KyJsK;E@yc*|OrnM#fW_6rVlp*8^Tge@wI3~=(zP~xplgnq+37x z=BpT*;mR1($>LZj#ICBhu--XXDm-Q>GXu`Zum_WZ>!T5S@Zp4l{;hvn#(T~~ ztJosqPekxbBZn7b^+WJT&3T95rh{v(?JH1>g<@xLt3wVEuLgY;%tqkqKuTGDrU&8f zs5Pq_@G3tSG}DLEr@TYOW%-wQ=ISa#ig7LKLXjk67eAa?^5;0cHy67L*SOFuH7=!) z8V1kRdJ59-vV80g8=s(_7)duCF$=EZtCaJ=RxH+hMJR?()@)gRfj6Tpe=5oWBb91t zs*I{EY#0kcyfiXZ_M1vzQ6R=H^&lm%4~b#IndL+@=H-E`R&_+;=Jy4EnMF~#`m_&P zB1OI4Phx8XX@YynBIBbI*5ZcFQq*0Dt|}Ci>upr%1Z`!DV(a*21;2~d$o3O_RO-fx zyUO8lySdmr31=o`(mULJ<09jA>&r9JUAV}d5-aeySs=f%Q957Quau5PyOY$aKxk%s zJqC<-Ok}uw7*WN>Fvta*vK%NuF}0J&bOt;ao-=hEE~GT3Xvrvn@ak=bi=SeB*FDgE zBO?hw^}FxayL#GVG$^*avU{lQmAf->@JMfx#-|iU@?zv?{bD1l!0IOl-cO_|20zuO zIRYDSY-o6S zhQ_Mnh~DB(So3tHFg?pHD73%HWF-d1F*6ohBcOF`_{X4`aCuad*MMDcS~U5IZ*Y^b zj`L_ZR=u3&5B<{|Rv#4)&@&4!W(ag`##DY{c=4%hx&Itq_?~sL;z18q8+bejI}-Cv z?9lw%Y1X~TO44Ut$Z*9mOso3g;3{0k-lD!+WxLgXS4C1rG|8y^2CFdZR&fRJbgx9TW7Q>|F&sy!tG#QY9mOs}KeuOglvzB`z z`XUz^cLBcxNaIYA1@<nX@h|c6!_D&ftAv*yym%uhl>|}><7@b6>7X_IH%QH?^$MllMZ~uzIgu7RR3aOkdZl?Q@ED7Y_z1%ZtP)=RtBpb@S z*cV|;%mFe9lhCG%5T@k8okE7j%Sthg$x%DM#GSM%IP;gmdqq2Pqq8#9&fXIl9-O&X zzLP6M=lIrkHv2*?q4ym2GiEvOYoc9c(Exc%R$L-h*nYt%2v^E0Ryh~Etazu^GX1u) zg4>06iVE-a5G`#L-l@)k$`+CEPAzaahd@hsh7~U>t|(Rtt_ay(yi~@ZQgMFEn`N>$ zIyM=EF~Yi0jH+|%SJW4ovd|d!9pQs+7|1BB(4dUU3pR#P5UzOfc`Q40`~|VLQ-q3T z1=Z>BYrM3s#V65-br{4!cp^tY#Y^#m+c+#r`P{~ENx*|s{eX+R4i?=SW+{u+;NY|p z2khnoZy)bk#H!yl`bHOqBg%LzgmWVR_%yoFm3yYO-{?W&B2EfHQfo`J1UgDEmag1* zZo1{~aaqf5F;}N&oTqAro2 zL`OaYCZHdR_%=_q>b*=czvhnr+a<#Oa;-&4l*cF_>dM(&#m0#~dS)tw9@KUoVBSr2 zeoshVo?;U3De48bKOjKnN0_>zQzh;tCPz;WtvXO*9uRPSy1ZU+?$0K z`8qRSl5=lysMB839dddS)9SlJ4o^~sV6eQoA>@=$f`s4_UsgR2i76>EH|VW<)%pDm z&$xouJ);T^d(v<-e_4iYHKZjy!&b--1+(Otlg(ydmA!xEvdVJ=6Fj5UZz2WudoRhb zRfu01UlZ#rqfmt{+)OX-*wT0O1TVJpr}UmhvGOs&1Rk&VarNF>vR5E^ZieSNZD&jN z>!A~l=N#yb?{_}ulpn`)nevnPTo%B-{#+t|-_U-yqL;gKUuP{7t^IDvCwx%BM7=5d zK6XT35jt)1V=;VcNv5aZz9UxBKWspUem_`QA%l^H7s; zz#PN_<{%zOWD@MY17;@OF)uE{FVF`@|(t(gZ?t)pua#)2@1LkD~}6a zFUx(Eyy4n%$(#GC4$zWdy7+EeWx81lh%JCZlN&;Dx>tzyG9F{rx#cq z{p6qS1>iHW7wgGh)sr_a(i63izt9u2AOB1@n(`Xb4m{78+e~z_Rp?>`19MJ;E-Uob z&<76Ri3Gh)mQ6BiR@+H1wvrMBMI{ASS$Mqh%7#d_<@GRzkCzwXIq24sdt6}-VL zye=cl@{o~bCS_!qTfMdN1mg_ylbPJ!;J1E{C?ZLC3dX`8hbxSrAfJem75-mN#BzWNrcgx$-L>xbhpp z6K(bmB4@_0{1_s+@0+}cyFBjn@XbZVY#ie-<5g1P5+QFkHW1x7pNH-nx4$OTJxi|p zHuBn;>ppeqR%8si?mNbi3%&Y_@!o>C6sPjk<6zdnDT=Kh_Kw|uG~%617>)pzyU}#r z&N(|8DBx;A^D}z3H5L4c$x^YEjpmBlhjD%AAt#W|5zUKyij@THMvo~@$}iBWMl(OU z^8Xr~DR0q{0YrIBoM*guk1)4NESyZ9yjtasByKd(^l+iBT#I? zSjX;@YxvazEi_%&g5e{3 z)8Z$Sne%0m%-feT90r-v5N@ayYbMtTdEM~J8Hmd82ET<7D+^$vG9BBvk1UD3ATgpL zrP>-^K|1%va+_VgUr^T=u&OzZ=br)ZC$2?7Oi_4yxiYwCl9~!^wO>X#kv;7P?0nOp z=5^BEXMCgQqwR1Er`d{W!);pC`^3!=N33Vpy&ry)k3}Vz*pSO;cPbn?7u(7{oaTRt zwD`PwS5prrKVYB_vu1yQ`GO}K7Rz|Zn|P6$r9@_0J-Gx4=HT}|k%`5{gCPEP ztQv2Ikr%H5A>~@$$Exe}`6pwR_Xg23HuTsOrOOm~3s4*=V5-!6h7>kZ<{bu*H*I3e zuB(aZsLx+9dZU==n-09?8?H9$7s0=ciY%q*E5;7>A&&qiDaLN^ zncL6OhjYh2+=VaR<@gt)*Ya%9dP2z5LJy53LEU{QSGy7s><|PMa7kyRea@W{$ENGy%SloK)9qyzsun}m$cRHPAUzq=)^E3mULMasD!L@ z8lwfK6`8oh04&T?H^jjb!bwcEuo=GdN!p{oCJ=PoR#2}!`a6PpgLoxBv=xURZ8fu# zjA}=|_^*>wKjvx*=aO1bxA|SsFTuTF(aD0(wC`~Ok48MkITyV-V6DH%q!O~<4p=~it=dg-=&p< zRx1@-T9ggneX-TqXdM5p%@#Yj%e@7Be;+h7lO5tl2KPpO6RVS1w_>6gQ^LHY+cJ1X zW*Ilp0xNO}xepmR>O)rKFa8XIHbnlF)htW0*yx2vvzDaPj%i4n@#$9?cw1y+H{)LU8VfN%G7F`KhK!pa(oT(eEnCI-L4S6|-^VvC$ zNW$EjlxbO>bJM=&xpCS$&-iH@JtGYdtytb?KYXb_8WwAbjmZhZ*J+J&!R{9Pl?aS(yDe4s*ZZc_=aajzFaxHg1rBo5ccuIl@lCMWYf-so11Y0U4-*y zW4TD(BM(p@;v1gz$Ap?!Bg=foV$Xb^G2Bxq^?zAfy4q(XdoEG+3*^PdLzIi$$O}yQ zy*5}R?<`MC?SC-CwG#f{#l}zNH@VpOH-1ZNn(}I^n$g~}v)O3=F<@&Ib`0lM%*gVb zuZnsvnL0!BKLexc@F{xmcU6s(ER43^|6Gh~*w8sI|tWQlA`} znrL%lQOTXMX0=K!kEiCEh~*x>G?<B9&Jem)Gc z=}Z9c1DtHd^FYyvyk@-A@*9{pM*VfjUoMc*7Vitp%;ZZK4YmR77l;>@x&`;&?PT*dE^7=5jd>ZXL-v2^^uQ@R=Oc;pc zeZFQ#;4a6Cdg(!2R5%o}LYDoIjtS(f6R!oiV@Udn@KIP*Rn>~{BF^kWMb`cA@EIhN?(bOgSY$#3ie?rHs(ZxsuI+o{Twx8y&vtw3f$Cw=IDKY+qod*Tn$mkN|I)aT3 z$_b%qPqEo3$E}~GQS;3iunX_5(BD~Rj;ncCa28{m`n_@8^-j;I?xM^DPbTl;8Yx@q zd#@+_Br8U*$F2xNlZo!(@63eH!c`=6*K_;wAM~GcC?Lpb-t9DWvY=T}`l5(GvO}K5 zO8(%vb-JL6=gNYR_v;*++D{+5;_c3kq=|=lTDmXk;d>%j46vtwwi|JlW{- zIOS+wL8$cuUX_Tkn>K8Z+B!%|Z0`i(j?vs6MmyT(@+2KMCYi>BWHm#dch_fnE@Aw$ zJZbJMLo;K!FYufv9o==Av2bE{U6u!RduQrWK#Sq=6cdlH zG4VJZJm$jB>2um6;|1OXUuQpJLF^A)YJGm5Rv+n-ELnY03;R8*AxqhCM))1Vm9V6} z!?n3t{C(uU*r_x>BFOQ@SGw#qq2oz;&dTGR(FEH~Y({{U<=c`ak_akTopqeEdpl_D zY+uTTMCxk(@@BxddNoPTc6<9$SL8OScV?Ea^BnB$qKEHWiF4J1dfm_0$Z5G6m2oE|?) zPe2>S*O?-9Tp`6%rTCTOM@2^I$=P+L&^y%(0ytg?8LO3^l=hjf_NyXE9Wz}WSFMU` zeK3N(37(O@+J1gFjy4+Z5Dw!SmIm*&UsNCC)rYxhEWvbb78gIE{1LCLg_H4MnyPo~ z<};BLJ^d9A5gg_bV=NKXGUQxh=V>6_l`{GvHX{5G2~$TA8%Mgufpjq4r#p_n-B}Dp zdnmP|J+C|bTfi?V)3*%Qb~ZlWRn9K?5Y&?`xF;lDJn)!%$g}3H_LqfZz1;}~5Q>&C ztGj4;rgxmZIWRxnf9SzvZhr{b4=s>*k0JF1mN<8PL_f;1dl3ZeY%B|G8NSSusu%~T z-f)0%+e~75lOi?gk!&J5+7x}gnka2&53u8V1-C2g8kMKTjmRn)yUFnzf3Ey9v864w zP0%XX(pK~a1Co!ss;jomUZ@^wj15z^2U8J1dQu=y`??G9I4AzJ+zMM#OvE1k{Q0CK`< z-Q}Bp3eA3-XQt48?(>|MWeb)ZbB`TLNDvZ(%Bf@J*UqDUc#V4f0mC;z74$ve+$+T* zc%|PP!0Qs>3(Yeq>o$>f5pwJdvnA6Dhd)S&dXf4g^3PL`|h zRJsu8VMixTWv@KCqVEa0@5p@O?M^eMW5p*=@F7&5JhRCoF>(=-+J3s-c za&{%J5#>PZGTz{CX}x<`bYvCAEPnM&!o5gm>tDObf2NUkxW4vgm;&Lv3;?t>*OzIR z&dzc0clv6Eir&7dc#GmxKFd+IRMsX`h9p z8RuE;J<491v5WR;`)wlMxRxdx$+mccKzCu&WBj!VcL@wPsDL!R^cH_h(p{7&o*@1B zSXDQ?5F!dcCM}76AUYcaKvi!L8yjImscT~4nlB&wi3|03CzXYV_SGq<@VDT#- zYs(F4K2NP}WDW7}FZ?@3d<(zt65l|$l{`Jve@{+2&4%nm9p+yHQDdcfB43xtBjkUN zyp4pZbNR<*+KA``LB8qoNAq3I%Bwsf;YnRHxOS`C{Zt_%+cIhGG~S=K$Q7K8vHb&l zDaEO3`4QTfV79Ti9groiu1qUAw0kur%d~xmXgD)s0sRT7(t$Vmcbe%NX}eZ+{rJb) zqrx#reS;=r;V9vHd#(9Dn)+!LP4PSBaWn5h2EUbN_tR|Y8}uT&8%J|e zE3x~|)03sDzb~ll-)Sb-;+%B;HZtXBCQ-6^Hq}jkigfaRP^Oi(^ZN?JTuZo%oSpm< zUfRzuh+oRGSlc7bQN`Mb1kUpB9Vx|WgCFL1=|29E@iNv=2mcUQ%4$-xed*W=1xbtTJtDv#f-!a?K}Vz%&FzHm&LtP)>#}m;?^?yjfW%3x@({Zvl@Fzj&5p zRtodDzI8;IcAmOEI$EZk=JzahZveC3sMGi3kAq^B=S`gX6;-MAGCfK|n*T8tUK~1x z=S6AMtaWjQ3GDh-+LPKZ9owm(AE;f`^kM>)6#Qzezj7 z*RlZNyKCLg#$&{OKTZOcCQ|Nd`c4)VBC9Q?AWQDEo0+vfNg!b^eILGm^wsQaO zt0)l`L6|BabMAkJsP@x>FxKFeGz0rFrjrSHgIz39@GarzfQ&NpPXQBdJY(E|Nv7l1mt~D=|tJ zE3Q?Ek3Z5_DJNM8`*xoO>(oUmH8DEO8w0ogkWAnqbDY!a)a0v$QNcz_#*8L&IFoEg zWCfQt?;b1(WOa(K)bKBnwcyacf)ou;jy)|@v3$BIJ0dW0X-T@gXkav zJQbH2U|94czB&mweRZSxari!P21euphCbnQBks2HlN6~9Q^vC+V{^e`muagj>@_UHg!=YQ`C6~&DTG!JS}?x1or*ZDfL?BG;MbeC)rkd9t92sVTf{QbYaA+YGr zF@rs9GT%7_8nK4Y?gv6xgr)5Bi(lmzDpk@=+DXz*u+_2mWJ)iZNPi9ZdhDx+m6$sI zVKmoPzF?&Q%fExf2z$XECH1{hYa-k3(TuRk98_hpMs{Dpw^}iYe0>2Us7=)(HU6EN z8jvmy)U->k#V^DyLCs#Z7}YjgOW$RKEe@%2VezP-U;{JJTPCwXW?D_^;y3&N$r33a zMAn8EtBAG7XM+{*4XmY$vNzuw&*2#ywNW4LZ7uC0) ziX=)AK7L1@@DHWgg8(iy6FI#7H1Ys%vI$kJ4zo!~_>hEfduQa`j<)a}l;!6#;97bi z2nk*-2I-Kh9N~0TDwb#hX&2yrAB(GRuWdhmbkdCg{Z{*hJ=;cN-#}|M+hj!Bo7;}Z zy%=&A6;A@Z?H?@wf8#rC$gj?*_Jgiw~=B<`~$Xs0m76T8_7zYYEkaajTfFa_y3XFGKK5u!Y<`uxG=^O-8 z%gL6L!}k3n$P7&|zB#riI8(R9!sa@uH$IdxHw5k2?;baQtJGSk?`Y$jZ7Ejd{v6xU zJzr;Rj{a8ucKg4<-$LBLszqqCu+(-e>HC7`5j*GEfws-|E>=F(Dj!L)0&j(4O+J3H z{8{bI7mL2Ingps*{W&^mE$~$A5lUezw;D+p)?6Qy@epjUBHdgb!$TV9JiZTUS!Z0RhCnTn8jnUggai%=5@J&XaF_~2a2cH6iNjap`%po|O^A!i zFmhUsW@r1ioy|k4e@)iLvEz`E&h{>$RPCR4wAaJEI^bSe-@g6jW$*&Y?cd5tu76(X zf+nlQQ-3V!1%Nig`W=o5!rancSGmXDkyuZR@6<3P>e2GR?3`pi^xolrt^7q8GE;9Bnw&v z(syy5wHerriQZS=E;(flkI110&RS-z5!jy#<2=(%c(GG&ReZhF=N%ubc(kh6cYZ9- zP*L=xcH`RvjdUa(V*nUAMvPHBer)V(d<&J?#mcpPpw?I50dcEyNTdQ32Bt4{c zw1cnet|=_6vBXQGGeJhpF9%au#Nk!~`9-nvQwGYXNqI7eM0RLddCe5B`iJTxe}206 zMiF?KPfrl*7G;`%%+#vZvy|G@I85z)XhSh&ZHb+UUUGt#wl*Vr=x6uy-VHx0Lw_ zUnoo4iCOH#;2l;(T^7br8xwQu5TrJHkHjCCBC1sGeDKx1K1ZC%46d6PSlNT-s@C1FE=jFjVlB^{*(UbF2)7> zGU}<*J1fE{reIHe$aPnGtfIK_`zwt@*T*ZlJ61_p2M*~aH+7dAFAU_kE|w$mO;II4 zi}JsIDSCpR_;x)<5t}!I*TqK|buM0;@VA8dC#5rKd`=u8ZD$**7QqdP3thqTMB{y8 zdG?^ciWnrfiNQMR{mZfoeed$%1Mz=jQZ*K0E7poCX=Bo3gk|$?OnRJ9*BQEy^dmxR zkBYOApAyRKt!@F|k;r`c$w%yv=n>*qa+h4g=xr{4^q~KC%Zj&_EL37ydzeykSii31{VgCDDkTEEO z+FP-Tz6G;k%(HRjjM&vlIxg3&r`_^&&h%RRvu$x@W|oO(taK3z@uK0oDRcTsU|yf9 zI}{9q-rI@v9Q(f+#`6;eQBuhknTp-t9Lw(Sm@nG>)plU=*w={=+VI2+86W-#&o!}S zM6KdYM7_5gRe`eubw3eF%d4F_GZEb|Jn*fEz3|2%Fy6D#TFF#PqH3z#YKo@cdB;Ys z5Bm^!L?N9?FMiGsON{xlW0yd$i;3wM%6egHSh@fBuDKrF%JeCYevR)E-K-VMP7KsZFIZ(Z^^(e2i_$?N`O?VL!SJmlaLGgUGc>zoYQ+f2SQ8f`dlad-4jvo6AjLP2#jEpZRMY0_2T`?0{ovA`MvfWS4cNQ9rQqIw%w zowC5Z>4n0}HJiOxS8;(oj}dp-$8?y|xMTP4;@eoogLacEdO(J`)OdLg`T_nQk;XVr7uY;0 zN>n1|gv|tfn-ql>_@zpJcfdbccI<7T!1h}R%nSsdB0dnjfse}bd9b?L_kJcPg=Zf} zX~@>-|B?IvZKMA&LUO_ut$Y#PQ)yL(UKM>gdCqhQgEJk;mz%kGFtc)O?dYm6ztSYGW$F>Q0+MbXn zwJ@MYD3aoPRz{EKP*UZ~uhDYQG0fMyenT#sCFOuC;Fn@Szrg4Us*YnwX3URe8Dxe} z(3RXhQc1xc0Z1Gc+v{Yo1q5o^xFh&rbY5VO%(giL1&tV{pqSp9doHMkESUbHIf4b} z*C**S@sBJ6FO>%8MhoiJJ9M>)XPf;9N_X{blAOKmasD1QbTt@ZGY8j$1mXU@JbCyq}uF1DjUP_ZMH{>p8d71dSLdRTWJPU2Eg~Mn#%Za ztme8V@Z@s-7Q1kVN){sl_CkhcKL`-45mm7Z=T8PI5R?v>^C!R!8txn1mN@4Q26Rl zXJT4Y;4zisuCGclr>+)LWM5#rRQ}Qw$dK7|?vt`CMBOn-?+Lw^sN4qaTuH0%jAN74 zUp?FzsG1@`hToA6qc^L4K=2-?NgJ zoyqF1)zSCat)-*)SRK9n!j9(E4(VuKb0|E{Ui&xt`HI!gTmF7O4`L+g3;pC+pjJza z#K{6?L;+W=@}OVVHDqoI5VKS78#7B+J4D_g_ps7HP_UMV1=Sri-2*{Z6lp(BkqH<=Ka?TTN7EWp(p1Qv4_ z!$pz*9*Qvy^L~4$45&b8$KvacnLvGyj5<%>c<=P+YcfrHBpF8QD~f>s8Gr(Q>0QuY zOPJ!)GiyFd9#`{GQ?JG%oCwqfpLx1`d!&F34@;^f+V6@0@tCf$=b7zN9{OIT0=`4G zIr{zrwPW+TuG#ZPvkZh|y%u;(H5OI1M1D4CM==2!G}IPA4L?u--CV0Y!{jTv$_=;l zOI2mfnUD^>abUgz3Sg^m%vw3s=xUb)+u&~D!pxma+O&zEgJY-3O_Rl{WTRqoM zFitBKYP)$xtcok_QAGH{;%>9J*%f_{2sZ+IcJUXk<)L_&^eVLocxu^m!alfPLweM% zn;_#1o3M!6)RV$FYjD!*D&LAk@0YpKa<`+E(lTZgAOo%Er zv?1Xp6ZY8N<5`6$6-k0(6?#s%huIrB0}I~(+%xs__Z291#@i8442vJiDqY7CoZ3ia z=k)zi&5&#sR#B62(-kZx`>Su;EXiD4ZmTAMynL8)a9h4H(cZ$_hIs{b>(C;SVA{B0Dx)~xJ; zIh&7>UW>$X-J`@4+K=iRmH0|-VRH}S6llAg83Ib~pw|Vq$uK)6o5NVJe|_4t$(*?Q zo33e#*sC44=_=n{0X52;?YuAh&ZTmiNG-LWGodZmBLl4YpJoj6Y7v@N9i;+GQqUH; zZOvmy^1@S2u^CoLC|5$8B{W__9zp{$zAMJk0rfciy1b(mdp1!s*Eybym^@PMf8+t7 zUZ3}uWyWkY}PYKW~Pl=(OK~hnyq#(dm&tJCp0e0ZYUjB*=guotz z<%re16IhGmjd_{~u}3j-M(AO-x|q4!7n1pScSSvKA&+un@kXQHpaQbNnkKGmyHor9 zLHmI~P*nXzUY6U?(^Kf{b!v}_g@A$s+9O|rqX~|el&z?E+e0kMyyi(KB6tQi0l|?-6jgOS{unldQj< z`$o;M>cr~da|EcggHWYnt1}-1tR@pT&v%z zKPlndx`1B|af>w`$vCg8x#wm^f`1FtI7F<*RDJiB42=Gu7IeS#ZtE26d4F7R9wBw3 z)T~--skvyKs(@L8Ikx(n0cGX2pnt>dkrYdZ#@=NPQbEu9Y(1#35L>CLgWKfG8c)^u z;m93UeQMs+_}RM(KHfO4WDv@H5$L1(lQQ0BL;7~9Hr~G3Fa6crwm?ua6}-J+T*)H+ zfCaUv85H*TD_rOBN2A8U@Or(eeB>GCPJef_>Kb#>*d|Uw^;6 z1*8H@-*4h*?g1uRVRJ!f^K=u*3L4js)`PO%1G9rwfjd+rk zby#hDUt%pwmdfVR1>UQ_WIQ}9c31W32FTY%yjQ0*Bp@1yyvNm+qxy=-Uj{j@zNE%+ zS#{zau*hGM`@l22i#!mI8gN&A%5+z4Z%D*W&noX9*I9^+OHiskuzKp>(QEI;?jK$3EHn5 zIqS~^=de<;Vpcx>wu*()(ima<8|_X7_g2{mdPQ*fAb0j-?#f@{+&E0zk%({ID;!?&c3-Ezj_Zirmb)&r9i`U+qwy~f z$ypDk_(vfFmPNMUv5-GBCU=l(3zJRBeHot-a^JAe5MEz0d?5XV~R zHX5hoki9Qc?}|){ZbaMBwNTk$#Z(&ii1%hmViquD7+1urgE+12zp(eK23gMXotn(k zPTu+lRR6SkYO%;-t9LU2!Vl?Fy{Gy>4&yiaw)joSZs~S}-f*G!|VF z;}IqrZ20($(cMsz-zL zj{mpSc*suS?IRcC+0SIQ;{wu$=mva0}3m?3-pN^ljEQi0?IC#zyW#TZ|qZR?0xxUg^F_7c+cn%+!z{9O46R(YDmFo{_)CSDH&!V11G>En7%={IZ>uy?v z(WJV$!mTqlp44D^Ud4k*p|55h`Ltrf~2xpL)-a3xI+ zrZbpokX0U2CBOq|9D8OCRIr;06c&a>XUD>x%Z+gZIer?;5!o!LQwd&R#_w{Y&mITX z8_%-T!YtOW!mQJq6lUqwqIQSN6m3V!To8qu3ulde7D{+nS()^6lfEruAPhZ4 zBg%oU8%zC-&n7?4AlpQ#~E1l@3f8)PX-G#yW80|6vEt ziNN;%uMX(t(gB6H3q{*w3AQw5D2=a)c}GL%lfT(CwR)WH*e0Exy4*QY3toa8Pxt2Z zG}sDx?>-@jMWYpcE@RzW7;zQ*V!d*HFY241l4oJ*xRCD#^*LR_o}%fZ0_M4aFMcNQ zm1y(i^2JXMU)ZxnoubfT^NwvuNr;S2>x%4sQ4GK74dQUio6?ZNyYK38KwwKjMp;3F z-9_nznty|8IukVyTWxlo{;GbK>THD`O@1n{V~23$UX=&aO;{W!$V-t8!=XJJmic;< zH2*C`VY6F^(-F$J?N;|>L)+@IHngp&!39xyC7yi-O5nLu(3=M*OYv-^`Ku{bdG4c^ z_S(F20bgzR?!-mdSacdw?~)oa)9O517nw2F5|dp=oRE}sqns0jZVSIa9qd@#WrneV z4s8xi@8{Uc*1eJpCMiLGD%wxnRrrHTl**6ZIZ%~nyNuCDtC7&)lqXP-Td2L9B3pW& zyr;)3U4nO%I}!T>QsGK`-Pj3B4_1vu6RwUO+edWCu0 zLYO~7h;mKL##(lxaDiNQ>y3-BQ)eJ0iI$2Z^`cC7W@&E7b36a0@b3oxVRNvMW*!@8 zCdq2%N}Pvmbzp}ll8KRtL=?{>DS$6ZF21r6w!ob9#yOc4v{ZHUL3_pU%)K@~{BL9N zpk6Jy%a|>far{lSAibONxAb|)R-qKA{q3HSPp`4vYwKyj8go_crWEP|=`nd!=()6V z0UBF2N96+Mf%oML(j8Qp$=KRc7i1F5BA8-kO6;!B@}!z!XCz$=3Rx+c76WM=5R7H+ z7&@5FQuWul&pDqAoq@QNShS@E#ntUH@c~77 z6QXU@J;->jNDtTx8aQ;=%xr-?Bb892Z8Ts;4zdRXy+?cxbfIT9v$5zDmQie&5JM@r zXhg_J0c%3ECgy0wSGkPB*=LPRxg6-_coEprtB9|Ujrp4xUe!a{b=dNl(p@w{EMcA+ zO&L)qjF!_#V164_>3vouugb~Tszl1?>SmV7YeSJF6Yk><-#Y?zy@ETfs4s4Qn#I<}O?oNqR}c-9 zL}M0MA~Fl~9LEXFg7OFvN#AQLlv&s-{bm+kr!!1KgVmX|Q0Fi@z^Cd=su@mV5)Onq zo#F;0>@fTDUV7+w3jJwNJsQxRr!%dKLLVgRq2dyr_tk2)39JfivgqeR9}KU2Uz#_k zVlt3jM&D!u6)(!^%1lutX_rhA4|-Hz^g7JDU8FZJn{FUpHr+tHEc1rAvrZW?OK1&) zKc?fAv?hs6LXahTZxY5mNPo?2YdyUQLIt)$DMBX_(^?t*6LP{bLy0CH zr?rMo3{R_*RbU;h7cNBXSR#A9*pJ$YYX~8{bM-UgP$V(CvGp|Ll8we%&RHH11d(?WybX57RLhq0RhDs^M8wuSLy6x9$ietB3uks-{h<1EXNO5Tv% z#hQazikqEPo3BzsS!506gc%H8nm8fA@>k5X7wyQ|ZG}@bJ~J5_6q;LG4VrP2)!Q-e2HVN{P+1JXsh?VG+Brq)(m;>nCoc?!#1(UG^n5$L^8f*Eyl;f6-|dau-e zAgX~{l_);?dWV-k;BmPVg)zTPc>e2rMiMstc$DB5WBiRpC+|PR{bvGU#8f6y0qb(c zNKc-$J;7(#J(o}Vwb~yP98v=Sbl4(wKwAYkkt+y1CIKKi`HTeEK~7!(Dd7JjNMXbl z8h_x~Orvc)xg)dbAaq(rWpHKxpug0TW_(N4a*ecE)Z1~j>GJNMGODZ3%EYd2I(wxv z5Znx^|QRd{Bbi4Okn3^8$zLfpu66=WRT(vMbXEfd#?9U4mAt#Et z`rW+h%k*UW&W*yJ|GBXktHeex);o)8JLY66E133<6)yyeYNcp!j?=ZU#Bv#;n&e=AheGRXVp`=1Xn z$jjRl>^Js-DFY@AcS-fg2FvoX3|JLl^f-)&O!$@u`tfQhgq~@{a^d-ZT=?9h4*#;OMN3=7&Y6 z3d0bc(`vnr7ZM{^67HJTN!T74PPlg(O0FN%#}^#cMITiceF&Z2QCphJ;lAi}&9^^1 ze4=LlM|WknL?+ZMaOk6ILN(t>z9Dg1qW0(>3RQfbpndO81a1p!zTfbx?RZ7m8#tL? z)VUt3up*+w@dURf*A*F&D{8W5MT?A@eL1z$D!k>|j(yNkwm@ia5haXuZ|f^M3+mU8 zzW&=M=|q`Wy{E!a1d_vC-|%S2dM9{Zy%U@+S~a{3oI++C16BY)W6>wVJ2V#c%2~c( zvENvCIb)I-xZHQG%~$5Yh|g7rvJW$;+_=2kXd#$#6TInN5oXIF*=^_lYpAVoP1cQf zK~zO<^Q#K=L^wl!zZPEx;k#VvmcBQcTt$)CnXT2MIA` zd9|@b7za{VN#Ew=6y4x3{=%>CfnEr0uNdHT8LSv>V&L6Dt$|B?`^UNP3uHWO#m{`e=t-?FA{S*cm&iJNR zacySP{I5|mm@%38HchED^KIt5JaPm|h)vD0zRfup3>XFLi(vH?vBn|RI+R_Q$Th}j zN<^+Qv%X?xeOdB|B^_lhCf?TSp=}x8__J7uu*L(61*y`*e|k(b{~Z*F*v@KO89=NM zj&#urezE>Eu@~z_E!f=KiXElJNo!TYd2Cl5-v7KT6wf`=qiHtV<}G4WYWmF_Ps-EE zwAb%3%?)D3?8fNBIlI**>#4YXAPFNp<;4Bt5C$^Pob)n?x znD?@6o-qApw)*lH1cpLjz*rQ(#hd9!svwfq>c*}nkW99*l8r2&g{s;T3EeP=d=@#y zmo)Z*+eGS9bOg;h{M&HG9TC{l>F?f}$ve~+BO(srO6*u^B$W$)?Xm0GlJyl?{-awn zxFPh9nl{fZ06%ZNtPuAx4Nr+Q8dy%`dk~1!uLYPG~Ccy0stp1oiq8 z%4do99v1sFC62*i4;cX97T*>laox2QTTZj$PJ71I%uB#u)~K4xZ_8ZgyscGxgBj&8kGmAfuh4k5&`SkY0jqRR&rWu1nX@GV~MAQ_!*#BDi7@d}w3 z86FY)=aC*vw*?nE3-;rauFf;lbai*7F#+V!_d%#7TMs>Iw7mwa7#YpW_S>N-MJMHk zqpCxtbnxS=Wl&CXU)jjzk|foU#FaJ9i@cp&l8B4w_T{Q^NqvUY5^=Y5%$-_n)S3zG z5|UO;+7PJX4)}fmaw-RW%Lg3r{rhxCost^Oz0d*QS7^FewSiPI$G9)nyk{)epg3of zWI!Yb1oeo~obA>xV>$V}Ib4+vm4piAb{Vrjmx0K-P~9MYv_l&LB<8Ale~H@uSF`>5Znt5CH%E@k zwccraWd(`XXGSkC1l^6?7yO=Wq8WE7f<>P5`$C1Gch3CdeLJ#5@8#NICu>qXUqaI*8%-BqW5R9kuS>q|osEf!@7>l&sGd;6ZJpjU zQ6gx~Yrd`1llmfiLUdhXPrDvkwla2YuKdC09mTWuB7*0PR9;fc)lqREB~aop&g07j za{?k}o$JhPf)l!`F0gTQVD1ReuOvP2)l5-PsKZ!>GI?@pBKI6jOPlyNkr`NI{Fp{r z%-Kc9)b&j^3jxL?yXd6)9HBl>>01zb<78TUY%eHTj$(pV^=m@zgf${PFh-+x0qWtY zko%|u?+T9(t+YiRT4Sr=s@XV<=RX9*?1ZOSEt@YXcUDHF;JTDu@*|fcI2|*-J5I1c zuF^fZKg*SUlioKiX~_t~MS;O#M$oh{H4(&1QBhi9X^~n{>E~FMppdREG*u%qO!y^J-^@H?>jThOkbUI{?Bus=YP)VVy$=YwbovH?fZWB>{%Mp9FvZT zB5jU&b)!H|%?qg;4#w&D!K>28j!{X*r}{)=Qr+&pE_?lbCe=-k2P-Qr~O7JHKQavp-&gv!SdsyfZXD%ig_Lm7Jdy#3CdN6uZ*(X~h03aA@h4<8KvczS-i z&!Q%I_2PAdd^5mkIghCuiGoyB;O-`R-DIC*$J2sZbVE!(0E99`%?vK)R@C zfZ(>T6;hMy6U24N(=P!3igAh8^Ol1TQZXN+b@`*iQ+<|P`U~RzD?Wr#OH^K|-V}E* z-th~J`vWbnY1uB6viRL(EU^{;Fx;6NbX~Nx3j<+Lhgd;R$EY_Qm!rmTfb5WtFx*jy z=b+#!Ve|CgL2s#%_MerP1;<>04DR@y4n0yXTk66n9)!D}JK*BS>7R)E34@SjvUDhw zw=s$S*US`I4oJk|aOr5_SllDI zw~CT`DakurL!fTodn#OWZahRgkQq1A!pa-2>ks-pmhL%};tkgsMAY=M_bSmg)sE;t zmzMd+3kY!82NKU1gbOWk$@0So-oxmG$q?@v9oyY81JUjpB@&a6b3fs7|FG@>yl4~& zAQXQ^Hl26B9^pF}Ugf$My@*Q|Hez*8~fZQrKU7L*51arTSz^uORxa9DR=;QG9M7vm9L zk@qoi(G8o38~+M9 z_x*ziUS9sMNSVA!IXpZee{6RQK}*m0H!ZvQK%27Z>JJz^9HA}s(BlZD5S_}RXj6f| zezsP4Zg%kud@||c8Le30;-<2I&NMwX15u8|Kw$jEPSt>;+}w;9(iFe-Hmtq>&gm_d zmIgL0!&$GJc|lRS-{7m3R`}7)riTV!va}w)v@~e&F-x6zJtVtXhf3(1b2X_3XLgdJ zdyG=zH`0~S=z@`eaQ2;;BYcEY5B1W^D@}ELlY&nYmcmNiB2Y`qo8gecWY`tVuxJ^B zp9V#R=1oe2@evta^6>Rp#@A`_Ea_&wD{%KiRkw<~ z@*cSQ?%LoAOY6L{=>>Vp%4Xg71#_%luAEavx|lo-xQ0SUn_S#}6q;E8z9;&{(rRTT z!q9WEjds@K0-bT45f_Md9EfTYNO?y)4nR9Tc5WCd4`a~y5F2ph+>w)_-JU|bMLS2k z?JU}DprhTkN4sr_b{jC?XB@t_{PB2OORceD9_FZZ)22?r*Q0*aEbcHW{D0nLc0HaZ z%dRJoT>^{?6kX5%N*37l1jw!@5FJiu(e;QlwbFleW+kd%j@|A7Nw_#h&v$tccRJrzxRv(%|{b3G7YtKSzfx}9+0<&W^_)t zcrsy0*#n{2g{(eSH(+mX+#p7pn;n^LaVy((;slnh1p^Q4tG>m4Z=`a7r)jeF`Oh@% zU5EeUe<2ueXEQVX|1-r8FSNe#71zDv=MvISDgHN}+J$+D((N$bN*$}|eQCha-~7$~ zxT7BzLR&G{u<}CpgWW1@fxOtgTLrGKX}TZhxx#t(+|vC4=c*y4~ zf9!qr{=>^`KSF^Wt>IcXOg4Tlg*}R9?|TTujU`CDq1&If_F8Ocz|vCa_`CsIbLahc zf8KQOxet(eY@;2x_UoIN3tT*jgZ#PSet+Rp9@h%b+U|!?VBm4aU9J&QNY` zhx1EKE6(ll-(A|Yg4?uh&pjiuQ1-C)vvR0x6Eu4l@s8E)P4J61tw8JmVVkVK`l%mU zyu>>6b^g{XdN%$z*nxeoH$h)#z2kLX?5QAdoeT`X{0dJ`$tMGPBHQ)$HR8#>Rv`4+ zt`mm*s4BJLPy;SntWxVW9JuY0{GQs{wP^jm`NRG4B1;EU)Xk{E_IqRls0pC#MM)DB zbxpg*-)Y0uv1&}kU(i>g)*NW?&{GWQb`CwQsOL2GjMDVv=ZB%PsGA|Gk|s z;;-FM@aLycu!#ynbOp?BA^6?QjbwVCfL+>JM!_lyUJG#AN*R|Dse?!%8LyD>Gs&12 zRk5_pSMBgTRFPby4#L9RJvG+;hbS5}7ozK3(x5*I*LeDa61^!glM=}e2^V{+!Q$(% zXQX7wk1ACoyy#=QIaR6W_XsF^4mJBbGz*(iUus?aT`TIR@A)g<>u0V|$f}-Ah1;p{ zL;pq&%#SKo?W@_I*QzDJ?w(l-;SmnI?xUI-s>#&Uu)MSGyC~$VK4Nu6{a5gupTc$+ zwVtZ&YL9Z@{CLd$)GdOmT)jaAZD7!|49btDKxYWJ*^o;yn6dj4x`(-W2b4W91!mM= z-zYb%zcp$|wzOmIf(fA_IuN*IERX#)fDF~Pl8#(+(g7 z)8!-5oeZQVBAI>p`JGA60G*#7Lo!;BLr8{uF@)^MqfHn>H_oLYzNs+e_3Lyude*NB zwPBx^_RI!)2Nleuf+Sr5Hp$iE2QGT}`83!sAJ7Z%7f|*>3ii_lW%Wk>E7YJ>9(5pc z73AM{$iGeba?1bgr&}%+xU@fJF^7!xWc*k%vOWYMKkoHFjDJGE82>2NJ`G}P-1O(? zTj}2&Z+n=S%Lo*|V(FCbhL*3-a>~ls|F#52#W|zPFfKIgL<%HhF60@)h>Y5?WdIQ>ZnI zTAzYeO>()=CmQ`0D9O(cq`t3lZ<2d{838T+4t>q3ua5dgP#^MH>?sym37J#);S_uK zbZ~ZZ<_Ghv2Koi##r zsENCduZ7?U5lPWaeaS0E+7z9auF$&iDpxW0jhJOhR9Gs=mpKKCP=hh#^uIY$+&v7WG}l zH?d^a#NYg=Rcc)WDm&VB^oPvnaW!OtM?P~GNei7lZQiL+PZu zXVd?}Uq2vsoOR5GR(I>#OY5F=D9xeL2rB&;H)epH^{M(B_BY4X0Nn23rXg}SGB?Q~ zKAPgoD8539L%v$gx=4SQtJxzwx|2xGhqn?fROg}`XKSgMv^<$`I zEVZn3XvvQ{tya(Xp8m~_^xIN0i<09VlETx%|1oE-c=-J|(mPeA=llpL`zFf!d&nPG zliv4CpMGC2TlDhxu)VgOq5|8Bgz1|_ej`G=*Kit$k z|8=VG-Dpg(BfyIto1kZsL(gdH*+xApG(DVOS6e;p=lFHAL#{35YA83}BYor_^7&EQ z)X-qsQKtra$q(mypX|~7Q3lHHXM?_L_+c{X3Edyt)R@2=#Q-^srtBY4WjNAe#UcM3<PfYZRFwZ9aAaCoHw5 zmg_~IX4)W!Y5l1$p8C?<^s&D5^YC!w1{iS}Uy_j1xnDrp3n|{Ou{g%ZDm4l6>=$DN z#(t|8eH`z$I`nO%zH;jO`maXW6Z4hgci4g|)tZyC9tN5{>mlp&42Ql6)TbT}n_0dgVq$O1^G#tqc?=9NYcqqOvYjToO!t2|okuC5a5 zdOOs0rMe2Lo7Gqy#)B%hKif3cuO!rPHFr6e&SDlg3!!d`bGON+co-Yl($tSY*_$nd z?xxVKN%rs}87AA$(+JY>H<& zaNhfhL;5*NU!e5of65%Q{|*$EiN)xTQ#|v{UIbbma%h=EEkTb!%Q{VqC?xTR`l{!8 zx8r7qhPKo&lN!dmY2f-Qr#IabNoo- zcrHSq{pcLtFM;lKp_MNMFnYzMM=`1bLJsYX6^eXo?8hgCKYP z=VgiYbLj6u{SDL~C-hgS6>m|4sO%q*jM}8`(C{0;?i$Gm|9`ndxA+(+d)OjqYzvKo z-SLOxVUkc*t;TvP6XW_*4oxemDTkW&H|X_YlUjU*Io+U^ih1xdHPDNmRj_D`L(eek z*-brnaE?K(z~!RAOUwLJUNg<0kC2223RK^F(<94~=b`<_?a-+#hR)tDI`g@| zNBi4D?OLkM)YMW>jL=uBrhAdkfqYXT&tdoycDC*3DSxj+zEBMm z@^xx|FY+vhecTTh8~?i~AM_~XFaDvI=LWUR;&8Z`SlDYWfcc|E>Nt4*koiKl(A~-}gK9N7Dm6 zgi_H&Z_0p3frKVl-s3E!9uyLy+!S+nh&IBhS zLA{}9n2p2U5qW2O@m1f@$pH1qtw^7t{nZsZ8KExH$yjxsPA*atB)O!l5QeHrQpu9C zB0fE+KNa(7Ll>cSNg2Pvq^`!3FvM9Pkrz-JMr_C11G8cBOBWiOoVPq49uQ8E?|=9R zzldGIueW$kG<1Jl50$cjn^Acol@E7QF6t8%s!u}`mr#H8W)X=>`YTCP;U5I9QojKf zZ>IwsZ>N9eU~mxOco`&QJ|wTS?Ojc5Fg45AA`vSXp9TqK_>v2LPjeZIdx_~hZuS-_ zW+Bpj{*=oM!&CQSi(h6d7?iz&*_!*C(`R|hLoh(N_=}HtZ&i&W^6H)r!cCC+aTYt&dl3X`WeLnEE!P(j+6y@5{N zUL;XaWmT62-X(B_`ZlpFnO6lV61m)q=?NY6f)t@=LAq7kT=<_QviVKDMAn0{$1FjK zocu*E5zbd4M1nPHsK9kz57Rx1Q9RZCv;Oo#h!-@c*e;3Oz}In(K=rNeo6PCM!^QPUyMnP!r} zg=#v&-JQbP4V7yhDxaWA!&0a$uLnC`LbJVXzQC$pt$sNR)nfVf##NS&XyUtB<|&(5 z`;hpz53!0wFf1mBMZ~GA8U<39N7a>G1m!Pc0z`&BU_k54CSCHXwBJ6Bs`#Qvy@htj z*e6A7jXJ23v6U3K_M0Qtidgr&hJpuq-L#GFp~TK%);8kR?c=v->ldSEvl zk<}23qgeDZh;7uxWZ~j3?sSKp&Ou=_AF;~XpjyV^)Iq-74()j#Z63%RZAEZ?egMh- zx6@Az%*l?;9!ck}mFAz_O7qzZp8{pip&gwZc5wb5ltjPPsx^_|MEU!sdX&33FS1@} z;(pFLY6@HqO^1Kdc(okyd_rMQPx%r^%@Fc*6Z;hClHQ73cY)(>T9Ttrl+b97ZCKL(#!4P}D$0zPh6Pr~owy{O;vg3-_WpzXjpy*}VeQcG)^=rf4wzr=pW7niT?ODe%6ATRuQblq%-;h;Bqy;}84 zM3LnLus73#9Esh^#1=8JnU2IDA<9?uY}M*o&pu34^KV~+Xf;KbDZC zfBYb_KICQo-liriHT_)IIDeFn z@gmR6KH`v{NBI)UzvUrct@^%%b}J`lsRm9xN>!7<)#^h6Z&1&^$fjMYehDm&aAFoJ zkBk=XVU@odd>9GH!J{w?vMGCpYOiJPgWSLkq8KWTDf) zV#q8en>dB>-S@%~%zt(3Kiv}$$5kI8b5=fd?vl)+zSgNp?|Jqlb@101@^2#lN(Vpg z%WzHxO!XMQ&Mz%XS4|@^84z@!+6u#>AOqCCVa$51+QLf;ED`k;q)^2aZr4(vgK}Q* zaFE#7c^}+b`BSd*YRLWkoqPFXz8K}1AJ*ST9P;xhA3^!I+~i&STMv;4GFr*_gk)rH zg1qRj0`tv6e*>tt6f2_GcsKnVmqOm>{Gm#%de5_*SkI5W3~6Nzq}#elWB!2kb42=| zaB%&SGO@y)Q+^pwzUpj=xeN6g8j@QLi=?|3QgJ#J+s|rl6Z!evlb!wD7_du!52N6A z3O=R_%I?JVd=NXvKr#w{O_hu;{-k3XHX^=;itdr|`B8qV??Jh4Sc~jq_fe?x zS_t{LrA~j~JitE6SE(hqXi=}9vN6_Urdlf2JNP~lDz0PTtH;1st#(0z?h9RU5`F?x zjAn{!YTfHst!j_(tY38R&6L_esp$?W?vI7M%@R7V_6O#wGe|tws0Q(TUafnJ@wI9I zpXI)3a}iam<|E3@CAnO{AhkD&^wN0+l-;ln>7Mzvv9%n3>(v~g|GZjK;-M^(?L3b1 zYbn3ci~M;t1pak1B9i6On{wrpOLoY)lsAVwU$Thvmm?*M81Hs?>SN_N^%9w>uaiUH zoFJS?jjlU{D9%afMitrNvT$CRr<&7HQvhCBZF8xx^OI0m@r_G;4}l=Q9quv@uR%RI ztyUdCb>LcWg>YDn`j|+mTHTM{&D{YUaPJT)(R2e-ieX9*>nRBV*Y+Xm|BK)g?c*NF zhntJk>Rp~0VdwJ+m}N%FC{{!D*UmI9Vfr)heNTBNmPe`fPeJN{LyGCuy+;Sus`dEB zrF*tmk0((slyd7FaxyopPq@K#59LeM*f%}XEronLhuy8Hse+nDX_`d(rBdGDMSeHr zk71yc`91*3eueTa9rAT*7SeaOoAr3TLv9`A`WHa%aE-ga>eVEq?@fLNrDjsGIB(7k*Xg@7v zJj**ojH-2N5vnEEp+R_d&kq|y9)zVImr#xJG?Ll#bz^_Hq{k`~<4Err$;f$G1NvvS z!zFcPFJ@0QWSAsRNa!YAbclIorvB`JPqVi z{CMptlusi)b&C;e0oD0F2X#A7%NoP}EXLQfK8o@ucNn=>YTUB_3&E|>Zk7w}Hw&{_ zliN}VnaH-7#P?L9Trcxf8snuLbUBfmbR#iEq zUlA&}hp5^GnNITl&bo>oyav#JSqHw_*i0q3J^xys{C2?Y>pVBya#IiwXH0!o?=;7P zvInk5_Hw_Fl?5K5AM4h7)LgNTaWe%I^9RX-al+NXkNB z|F<4*pXd1Ebxm~L$6%CuGj(d$cRjlw&Poa#YICX9cLUT`oYZpQQeQY^CXqvoFRw}t z&V!Qhlc;PLH5Hx-uzwriNT3(R!g5;b5AySft9 zSHlXhyHYxMfWwYnR9_?Vuh~KWRYy`k_WxE>Upc;CCvk~}i#1%N;X)0s)o>25Te`W6 z?lb0E({8rd4o z(y-!bM`R)M5500;(TgcmGlfJg1+l)JN&O{ie_*$Ki0>!;_LMHKg0hFc2>IJJd9H(U z_IlPkj`#1A+e+?BpXsH}a;%u)na*zJ-;vG|N)}Oak3&*e27jDZ1Cbuj{boZC-)v-g z>dWOW7gUBgRQ9FHN~%n8RjHlZxLc@Ns|E{PqMF`;YI&sNhY23m>R*QV;z`{xRiNy? zFG2hDuG;zjK<>Zj>syR~YRoFn?o13wxzsY2S}IOx4rBWogBQ|saPukFRrA3i=5uae zduBE9p<1>VyO(+TS~#P(!`!Y+D2oZr(i4*I75f#Z_|BMb_M536SU60JqcZR4WP9~B zo$Rb`(8=!VI-TsJJ^|9bCULlXeI3#*XS&}Xml@=|Y%bE96Noo0(RI&&LGLerdBd|> zF&pvVk+Y2lsm@RYb%mNb_`Aeqomhf(V!2wED;!g!9v*_+kfE8r`&V+Auk82h3~z$L z&2GIW{j^q3wHB0pCR4plPgQds5Zh^p7sJ^fZWSsx-`GeMMO5+iF}-C-9eFS(X0L3I z(E@K!8#4G@phjCgtc#>WCOPzurrt{GU7_h^#c0^(DOUoyn;mj(DHpI2a^v0X(Hg;7 zbUp5l;gLvaIk84>1fPJi522P;4lUdOsK)zKvB79iKh?=lwaHr^D#h-`a%xGUmVHP6 zy5=%IR3Wh>M#}LIk+8_~`*PK4LynjB#TQz4P z%Vqzmg0fdp!R?v?$~R2)lw*JPzC-S9$~Ai#az7twT;A-@BCr}`KUM-g?AMAt_35=R z$)WOLs_ajd8(dXt-)H!J1&>b{Fh$~9sCze2ag91&;L~a%asEt{pSmc4WP6f#w&Lqw z?1WuYdy>Qf-#4KK--X~zt(^!eP}>Nu?c`DfSwQl4U&>aJ{6Uam)cCa^tqeU*5^b?k z1fjZJQ;l0_Re?HMB+{RWJUW)v2<5M60=-47(7aa23Imr5QW&;SkRlPYAcaBkf}F{8 zraO7Z2~yZL0;F4E=aL=e)-+!)?@O!T&fZTPjfSdPd2<4(b zu%GsnPcN6C@8G)+MF9`!*==w+MW~OZ}$8NU8~?njBpX*Dn!v?pLA{ zZ?8tRM3N-?sKY_JIY69qY)&O9R5AieSig&xd(Llo+7T&M=YhGH%s0vu+27Q)@YGxm z=B;EtPG|Xe}&Uu9V%4YEIa`NYMW~DBN2)-&o@*uyBEJMxTUAZyPT@-u6~8!&0zaUhp-RClS zOQA=s|2*%J(EHOsGFOm!s!WvSYX?8i*_L?9iSgju9Ni5kLD?@*yrX6_)64QA$L6_} z+(EB_Tm3}OA?J62tvo%#&4WioI#)o=qvT{tzU7eA>j&nSF0V=0KO{B9%S?9{vwqw` zHQ7{?q^l9@D}VY4?=yhi#aJ@Gt$^4ziruM;$;9#3Wqf7|6=ba;YYWNh5^qO*G2&$n zdXb#ni@|yNpzaLlx#+F!##8a8M+P{RQl_SLYW;f8D}U$5ah4cBP6TEkVq z?)fc&kxgk@5=|TCYMMJMw~niy(DQQ$l+2Hxs}O5^OjqgO=-J-=`;<_^a$ZR#%IipZ z{{hL1^#VumyHnYY>eV;Wh!GU19tG)c5_fsRsbe5@EQJo9Z)r#&#`mWu5Th~rsU1Ml zv|9|)v>sz6>!)CKSIRAf`sIihN4mcQWlyL2?ljS*eA&fUFt(hrEo26GKT6VLvOHpe z-IZrU=qaI`-O5UecizJMS4czHo`Sr{v9iq|cQm=5)3{N8st{-~#&^z6B1;4dbBF9*L%{^_R*vYaMM3(3OyU6L1lw0}LB2W|!P$^DwS zaz5&XpY3oi`D4ldx(h$P-xbb6tWXumJc(3Ob9Fg3}nu7#nD~x4Qp>H6m7eCUgj>rq^TZ88f72-Te zZ;=-YB|C&%%9mBlmn@}Z87W!3oqsG&@-n_q`rs1U$A(-A${zS8^js}(WS>iVoZ=Od zFN}PjNj~&f^wSREiE=ddvwhnFnvhJ1`jkzMCFYT7_et6WnQ>wnxwLci2_xtD}W z+EKKcq7z(2g+KG6%Gv+!NMs3t3{)Q!r3rF~`qn#K!PKa)34C0A%u52Bkia|Hdbt&Y zvirS-q`uoH{DS>6?z2pRehzu}3sbkNcYD#qp()9s>0xS$p{5N|lQ0+k$8NR3^F9%A zZ%S_=%;M=v;SCg?{_4A^WRdFadWmCDE zGNqKs5Hh}MaZiuAzgYRSA?JB=js_=(+v~S_Zb5M$>&&Cz%zg))T{O57lS#Q*52e~9_>XlncpJwDq8zvDgAI>edl#;RXS6B z4dkx1Rfx=f)ibl)I!mW`vmM}gQxnf{il2bcuAu)Weka8%n7SF_Y_d;7hB#lt%Qd_h z*u8F_h5d#)69`XA=Fh8k{cXiSlRU!2cj}o={V+4#u}!8(k$D02bL?T9A3> zZZL;|xpG%2e)~fG<9qFUWVp}#?qvw!&v8#%dKkZ1U+-TwvYD-8UW>d#*8=eHsPA~( zs*R^v4_}LIHtS)TG1(d5@2(Q+8=0YbxpHGVwUy$xEUwD}#hbhv00ohpa45)#m`meik zZC5lYzOcp*q~L#2|BDlpx*s?Eh2Ne}y7C9;lP{6p6^w9|-`UyKhg1$DZ0FMO(0p{10Dv<0Xzy=4R{r>7w{S2JHVd+zmMB0eE`D&lL4`SM*+_O-T@o}`~bKL z2;ARRxeE{tm;+b@SPR$!s07pkt^jVRfIk2sfCxYgU=CnDAO}zY*aRp6df6j?h^h_?C)M%2N#yiYGL!`fiNh`W!Agp9C;r|A=&$ru z;_;j!RL%vb1zaXP4?w(Y+@utfDSd=FEk4+T+^_W6pvWO zRn<>W48KfJlrezT;Y#!uBNcn3lb&siHyBe=%yCBQRg@H$xFX~&{Kt{Xm7hi`g%n% z(v3*sU+M`GdU|=)Lwo*f`MB8gh|sgxyB=fwKdN%6Ko(jC9G1(j3qHWu2XXwgCQ!4t^#;X%A=zNCg-GWD^UIom&)h!+^^6dNQXp!eYVA|9lxFv8HFw1c!F!N*u zrVp}#lYk3=4Zuaf^vO2hMBq|j`lbe$zPSL*vh{szwD3`9VAjDQz`cMc1G7FP0ka-t z1LJ4AlvTj=#RlLY;1Xc^v;vsz;WY3a!1cf^Z{O_E!pD7p>EjS!miJg-mibIz*0&^J z`Z^1kKF$HAj|+k6<6>a?csFos;7Z^Hz%{^dpHc^$1$+f~A#nR8qeWR5fZ0|C0xtrN z0B!+16PWca3z%&r2blGD6ENHPcHnH_a^S_l$AMX z1zrgp1Dpq(1k5^=1>6yM88GYaCg3i>c3=x|1@JQ9I$+kl24G`+Jm-Ig1Y>G)$^rui zpbT4jy4ix^0W6Mq45hXVG(er7jK=wxRB^gYz7&he7{7pnWSR*xI|>^ui8e81Oi9M* zVl|r$Ddsd(L`S&UX629+Z%)Mkq=>n&reDsBlT%EFcueUm$>~X#A!{($MFvbJRzW4sVup9(P4koE zOa{y#*?wS>H91X8>1Ez)NiHzuA?W42i!Iop=8K#2!K95N!^%prJzV#+eb z*{pP;A;E0Hcx(`}bR~g#$0(j*&5*QkA3O(VGmf)x7ndrIHH2FUCUO2_OGDvctdvEi zB*$Z7!vT~Arkdx|>g1FZQ=%~ilMYT|w80d4MLyHvwREhD5RoiqK~{@7#b8c1S+unc zW%E;0rHe)L9T9*-~o8cNv zUcLH}hBm7i>m#^AuJI5i5;UM9$~qv@$*{uvsgAmkL0K_Rb=DKT)=PfQVO{0S(mkEVUF-6+OTVTWxOfPY)eeiX1(;cTZiB%b}Ux0@JV6a zafUT&VlLs-g8Gu0jG1S=Te!2kaq7twGrrj@8Q6fLM_I-$1 z2F^wcIgW4Q;{(d^pa*&laz_6DfU1}|K`HtzTzS0PC;_Lj@3Q04NM-Gwa3vezod1jf z#E+byw7fP_840*@b)@nOfO~Ew2=9%s1h?@1qb6XEGD^9p$tYziU?E^0o);l}1@K5b zCjpiNsE2bk&ZjnEF2eZ;=Nz0jaL&NF9Oqk{({R4RV(JcP1Bk(%Q9!cXxAJwNw?8}q zKRg+(1kA#o9-x2hNJRle11excXtPnu4nSbU1Z7^UQDUEodstj1YTcj`kGM*|QOY{N zWbmZ_7^ajUjP?>1`^vB@E@8*DFdRn|pWRPjE_MF|0i~eJ0Tmil0#^Z!1F8Y10X2YH z06%QAM&j9+lLL$ZOK;EsBf!#oHt5-)XDi)TV6KUD2tlCx00wF>1UL*Z7BCqw6A%wb z0r2BUM?nJkWNO%`VT*#qM7YF8?U~_}$kZ^y`8+Zu1KW+}ILd$?X)&3IN13cs*-A-I z(&^FIZAiur-9pm{3n=UyPQu&*Q=srHg>mE2Ifsk6g^8px0-c}L6h0p#e|Q!agYtQj zDb<*sWVVoMCc{ zb*Af#pdN-dN<#~D(;-4frr0u)qUG2=4c;&f7o$JBH-%0dn~V)B%Ytc1rZnA{i6*Pf zk_HYqcZAJ?9X6|`z-$?3OPww9sQF0iILD$xo#x7qJYgm}I-X&ZljG)&Fx%3s_Y4#| zM`DULI!(^#P$u=(P>?AQR(b3TuJCZX@!!pRu0IVyWG}cJzt=acSJ%#+I^Ni!eY+cOXxp}JKtO;$KG)07b>ahkqq~k` z;!4sQxyH8wx5V=z?Kuay6`l)#xz;Yy@HSwMCA+ow3Sh3KtF-6S8mxw#XMbpOXfo_k)iX3a*I8c!2Jqo;^V0ZupKHC2iX%dp0S z=EJO6)}&-c;9=IR1Y?F(r{{}(1&xh*QY;P`lW}%3`7<(;6RflD6nZ3mm!Q+F77SXm zW?_|s4mJ)W@2pu^=%gek;#DBmJ|dI`8q!ReKnj*(DcHML?g#zA1E@Pg(2Ie-9|2tf zGak~{gxIvfCm1}vQAok)I9XP#C&3Tgq4WcWs4@gHU{M|b?gJduOYWU60^JkLi$L6g zxZZ$ZKtDhazylB%0^y#Z7Xcmy#LiC;yD7IrHg^7O7n%;aU5Vw2#+<-tB^GlnYRw&{*ki=?1=3Y!r)l^!G-t2(h@<#qgrjoME$= zs5F*kh_^Yyjo#!n{jTDe)nL0tB=3^GL%VCVBVL;BT}$lzWQ)~?+{Y(pq^Dq)L~PVy zHpu*$k_`V~f-8?R_XejKE;|038A@!NIbG};IzEP7 z|C96F`Mf%iwz-yro0puPZp5ei`fs^o;}>A-5Y?TpE9C;h!ktG0^RCBXrGWQ`F4bD+ z0FR?${B05ro_{okdGzqvf6?2hy;{YZL~pio?+E$0?KT6{YI{t0jx*0PX37PH&NJlx z2Nc6(^aF-4$L2EIrC~Um`Ur6%!5M?srG}tJal9QHxf@4$WbCe(5bM<=_Bc>B*bKbYXPuL@Kc`|Z}Vt>Dq`Y*=~H4GQlXz@ zh*6}zHy3*Y$vO z$dlGTdb&DhxO;j!uRA86?ptE_XY#wo^V$7F8!4yf&GlIicg2+FGe5eF`?HL7#_P{I zpF7s$b*#s`>(}G|DO~6KfB3(9K(908(tS?s9?mwa$CKCf=0l?~W1VkSDEw^meFY-F`hS{h3&&by?SE-DYCeJ3WuO9%6>O%HUCa z^m@t%%IWg@GqI~4KD*lED$h86^nOCOOHWsqbA6T)-v6>p_|eP8+cS0P@#J;aP5TH8 z*J<5mZ_i*8A9p=^xQ_LBU6=l>$Ny8f&iDWD-+LekGXWcB6)B3GQv{{iQc^&oK9+Ky zh@V?P>uvNI7djubUM8zu=ru0%S{Hhq3;m=E{gey6y@^xj4j0-FcChWV0`QEyelp(V za>{*#*%FTRoc4kPjQD(9I!fT*HT+Bf*4Aw!6z+W!ZazCo$p8$AjZmTh{B$cDrTG0h zN(lj+YZsx6X&<57RgQOg;NLw>@{o_u{EPrUKYf51_9N0d1|aRzq-nF}En51vYTd@~ zy6gP|+TPHveTN%626npX=FYd=+QrcIwr<^f^t?T&*B!n41o!Rd-2NUk7|XYzp~Hrc z2n!!MDq?ixn6Xjg#z#+>IBD{fsncSnKR9FNLl4i2{rg?_M;0x9^f4vqmC?es*oEOr z2hL>&6!+3*0T}jw`^TWT{|mwzMgDV-@%9{nx9R`w-!h!6bN|i>L{ zfA`N-!{azhsQ+t%aqi#z)8!5Sw->*Xz2xzw%a%W}B4=f8-m3i7Yu2uN@~MKSpLw?M zx#!n!c;UsDiZ;Id%BIb)zE=GDmaW^~c=N52x8Hep`;PzYwC{TF{oNmYxTmyi@4oVn zKHgt(;NT~fpB_3~b>!%=<0n4*y!zx9r%r$Q)z>v=zWKKH?04VSsXv@M|Km?T*Z=bC zZx??5<6^_5KQCYT>*}@t?GEqnJG6h*;r*Y^|NrUq|F`}BPXo^1$BO~y|9JjA`agrC z|HJO)zxen6K@aG&#PQGPUw-r+jQDXM=f5UC|L&hI@0!DZmtR*2(!O5${~LU$zrQ1< zJ>IbfC^9qvv`&%hUuIZibLanexpi^{C{9{ZJg6tvl{^#1^$~${M`F%nd1kyh;5q=; zHJnp&Ex|b^=d;8NBj(;3<2V=A0H23x&z!sP zIT}Eji2(9V(lF1IP(SBMOgja@_*8%akPhe!;EPAvnhl_>OEmmAFvFJusAm~~@|c4w zy#Oz2&l`bh$0h*Nc@03modDW(2*CKy0gRsx2lD-LAe=(~$WQ%HrMAsv^1%~v!4L1B zOaI~%`ooXbkyRV|yd-#yzwg?*XVc7mzx0a3ngXBr9e)jMUVd~%!jqRe3{D9XVM@Ts zwWfkT!)Jf)6MozC9edtB{w0KmHhH>b*~+QiJHPhlM~SHw8K+abg4gQ0{MS4wWyvz0J8r`wDuzF`9)KdefI*On#|yk8%3xty^dA z_X}(Od*Y3|k4$`P=jC4cYhnxN2o$kj?)x1#t$u6j>o1LJanCzr9;%sjI=l6jtM#EL zR~J`h-!!*d9C8{m_O564Pg{Cocx0{dw%1SIA28$t%Wr4bSvyQGz3$ap&ZnHbBjDI~ z&=#=#))~g}X~}my64?2h=w`hKe%bG*+oR*2n|I*V8`a3wL4AEYn$t$#l-7yf4!x^q z=o`(VEw^4eaipNv`=8E8c&6{*mrpJJ)3j~USDEWyHk3@dwCCfkJqpG|ecMb~61?y7 zg{s>oMhE%t{O#9v)7rHketPjk_kH$Ur|AuyL!MMVYya*OyD~Q~G+y0#!yF?@ySD8u z`HB0c8oCq=%Dbo4df(*q4?Z-_H=HZ)x&DQ^#13h#I=s;P*SqGmn-KBgp_k8wPkf9g z69V4PD!ACB)OzzO<)Qi#+sCI~Z@=s0H(y))O=HIdW!_lxN9x{nBPJX^@bv9dwtn;3 z?cWt|c=c`0>Xp#Qs`D4>bGkkDQEKZLbF)1o_B|Bb5aHYQr_R%h{tT+W@afRaeLEG+ z`)v1$u;j%)X_o?Cn0nI!+a|0w&%Cp1h%M*wr*0hj>D)ovSAMnPMcO@t40_`rxnrZ%iv_yCYjk z*wM>y_~=KUFHRl0xpUOcPrpik;fwo+-MDky!K!(M?P@T|< zoiLxDOCB|J&*)(}vgDGz_RZ!UT87RZym0(On+^>a_RaXzRR6BO4w!m&YP+%?&whR` zXxX`Ej%5xWee0XST}Bx~-gxH7p+9p^efrh7CrXp1YNFTebs+MmyK{Plx`0ogg*?|q<;eb2hDwsrE2zi@oqoNISqKWA!U z`(39(4-UQ~D{1{*b5DNs*6+KM<9i}MwHIb(Uw-Szlpl)?k?R|#J-fB_)i-?}d9_bu z^3!{6?bW$_|CXaCs^{;&=ZN2wFP>Wa!v5!rKN-^_aDM%Dt#XPlS_8Tay3#h{>>I1& zrU!ig$+LCIpZ9#gQoH?$Eo*1ocHe*vww4RWtW!q?XI@Hs{`=52H({m^ z`+5w|yL8}%b!{@{by&}>*nNC2b?YZwBn;F zD+8wdXL{A~4==~u`MAAlr|_{&?>i9HX`AvOv+rCnzijB8p@E4mIv*{B|$nPOgCyZ-x=gD-6~&(54MFz@5K>Ak;-`D)1F zm}?_%>#%5A@pRkwJtrk*c8uHk-MLw<|N1uhzPbT-7d0dTPXj)zAEX z^VXL;4NXG#sKj4g{9(Ul2ga2A`1_eJ#%)}aajI4AhM&eKUiVUm*FW2_~W(ub5x?bZFYbpzRkk%f?hy98IigD1I|>@PRkpom!F7 z=7krYR>~q~+@JelHMHSeRYoiDXo5*|6HddugF#-8!ruz9^r$r)1Hk-C-8 zCyxjG((FS^e4t<1Ju5D6&1&E4tqE7|d-hz94*h$NZF7Cojf00=4SMfNPG-!A7wwyB z@6Xu#>&Qigv#o3VyLLMD=6_!4`%e4lE%{sT`(gONXP$li>#u#T9{cTRc9R7~_d>hR z`VG;)ym5MepEvFgxi{+LjH<-cA6gWzpV07Y)AEv1Pwkqdq+I`PSCsf1JJQk@LF_bq!58t}N}a@jKhMmB04tw`>W` zukDx_fBE-g^X{Ktr1opSIAQFC0eye5|F-%%|8~g*V>62Vd&Y*g^BK}QXI^F3;LZ2` zeBg`R?RUOEeAw7apQSX38OsX&V;Q7jSb54}y z2a5_5(5~*Dg&)7z>&6SMhmQX3@T;3MU+MPYrpITzT-nbOaQ9$7 zxccSDL;2m?-TubWZaX`@->kfMWs98$&%HhB^q5vJ9Bgv>qtz3>yEA+0zSYGs{RR%d zwOL;KvwN<#yK=3$|AM&0zwSAaFhBatuGyUY7)ugwYVC8h^i1=r!5KH48rt`zSH5}S z9pg8r*N;q zuCRCivBgsf=h8-ZGM~zS%J#VR;d`D>`{>S{Yw!7Jcu>Xa1#fo$>UtJZ{IIg;b51z$49*W{esBv{<`h?^v`O3K76qG=bQ3BNKxXyefRXZ&1t^H z8($1xW38CH`pUGAt(C|3*@vgaot#!VW5?a<)pjYy3FSAPdhh8SFO2(TWAyizPS1NR zu4V6+`hE4nZA?!ISoy)jL#E!F`EAH6pWHwG#iL95ym)bwb^oP(&wk%|PDt&nZ5#4_ zYx(E-oD?X>b?U*y?})@BcG_n%Y2YaN3$vsQ{vv+ER}<~Jxl zEdrG$EpAnswCtfY@eNj*`rfTHZS{cCv~`5ito1~tS(}HHW`4;^b3dEX{JO`L=GU)P zn)|<`wD5mZX%X_6fGbr`V%Zda6|Cw!F9;r>eY zGldvGe{ZfFd|qs_rJFOE2YhOV^6xS`_6z~50BZpSfI`3qKoOuAPy(<6$^lh?YCtWZ z4sae&54Zqm09*kmyKoj3;0y2r1OVCtIs<|L{Q=|;0S*O30HOgi0r7xzz#>34U>RU7 zU=u*=)0Gm?c0ehh0#F602GjuR01W`&_we0OKp#LTAQ})4NC8*@ivY_2s{jRn4S-F6 zZGi27-GFkyaX=m50)YI=`^Xa@5D)|y0vHR31y})#0LuV{fKtG5z$9Cm5{1iCCgZyg z({L7Xa*_?_`ID7NMl0jujX1u6c!9x_K>~bflEU|wlWZ0di1LD*;DfBqA}B?PG^Qyd zO|z9KqeU5(ZUJ7PL?X>dTZ%HwmZ(fJr7PocAaa~}z7l4NBR|dvE})D>5YP+RxFlf6 zCvzJu=MfHo1@3%nciN~jp zAqpP@i3Rv55fOt@QwQcj%OM&4S!j`C*ynvze_z5E2CuKN#cZs zE*Fm{k&Gtqe3p7LphI#d(k@pHoF5i8HVzvG5AYMM z;V9sK@K-$kF3{5F6aVqF6yy2N;0Pg?8^BsX4IpF>`W8SHfalX{f$ISwrT=_ZjipX6>F2Qi zXV0tgtQ*f->2kc~=`Q%H@wqh5`=L@$CwQ8Or-~K|8{|1GS3P(BZ|Pw<^9&lTV-8(4 z_h)g6&p+8I&vnH?o~6apSUjO+M9DTj+xKtsOnJ8QG}Khx8lDTJHUDG>&js?Vnmm=J zOViu*(m%_~65yFLT~<%|pJlT|&SgEJv`qEC+0AtHH=e<;*(zEl&%Eh(h4JKC=D)Uu zr{Q?cjo!1u6Y_pB`jag+0WrL5Og~T8xMXBmn{eijdFQ)W-3E8d@GW^!BY7HaHtfst zV&A{fBYiD%NE@AJ=Dhhn9(|)Mecpk_5B;UzlIFc$Ff<)`F@uk{rv<|^uBRzo(~&ym z8AOY?XN_qz&IjgL2peWG@e6Ik(vvfWjhiID|G{vvX#gCaW=oY{f|FnK%D{KLIENw6 z-(l{-wFBV0VZ-9A_$J%5Z#{%?mFHhqii!V}0nP_vmE!}Ac zr{)@u{_R4cbP~TXz)Rimp-tlZf2mI0dOi?7CBtM1livoAc^QX$8z|?Zn>_M>u*)|F zr-27saYDbYZ*&H}2bvt;NRb}L^)+o7J7RR$WOE}HhhLqc-~b=k9e#+C_bv=KXAScb zHcjl^4ogpu=2yrUAY+82$p(lFlx z4w{5N-0Q`2PzL^xX87oFVI)O33R=*n-u?UcN0?zB=EQ&yKp0>S+EOrP2GNLHh~7FF zZ{5d%o{P2;tc(%+)-rsuxO*vU|7g6k=R1Ae|KdWIxX{NndKh@lgC2)71j9jJ(ZWZ7 z4yYKdJczM90(788j|Oc3Jp!SVK=*gynd}n2$c4X13!e=B3eb95wV-u7eGf>Q_82sJ zEa*^;radtlO*$S=t$7pHTpr&l^RVu8#J0W^f@Tg8U;E`qv@-eF0>W&NO+cM z6=*bV*sjsEty-h0{{rYRit@sb?hUP>l`; zoutw9)hdlS{k5-MQ|2Js#bkMssdMfA| z(35aloVF>4rEi&EKhX3cZELU5)YI98X4>8H%$caL1N10(j%kO1W<93e(Sm*u`cMyC zcv4*G9MG)0^j9HhoJtaDZxi7UA_m`ybfGIj>-uY4=nJ5uVF7*QS0(c{26Si855h|3 zGX(S)tsX?Xgr~TKF9SUp|5&c{g`TfsgzIz#Xg%-rkxqAnj69Rh`G-8&k06gQdFnk; z%xN>k%Egl>7$Yy|f1LL^dE~l<-yLAMTz%o*B{8-qIznX1oO?QXxI*F@i8$GTl_pqR8)X;QkDhiP?*c z4W;f)m-L)x8Vol=fR-?i-b>3p-m{iAmQO(*v!IXba{28U*22a-8CV;zeXvA%pCC)0 z9_2b&exF9>UzSVbc-C54%C$inG!S#$6;4{f53`NDF~c-ePwjqNRtvSv}z%r`&o`ngJ!Yb1m4 zE^CiBKCY%xVFRs~HH`e+XR;x;vdq27$#o-J2z}<6K37i$SU{h19rky8^sZb1%kuH& zE7`ZQXJely>#lo#*^^~C^5AKYzNX{7*xvG^=btG^n>=;M5|n+AHyw<3%FF#lcRSNz zC)bqTvqjZm-4=o&-7J`fAAbrYq!V!+6W3U*1(nMSu zLYaoMUFrRq-hb)+Rpar3<0x%p`;`5Fth2Jd$BB`FAs@+kD*Xk>6@-tb=9E zQ|LOcKCTA4jI7KX_c%EAuzu;hdjHS8C4=azXcu$Ob28i`akY?PPJeTy&lVv4&DOM~mS(fw(bC?L4t(c$2 z@%kVM&PK8-`gS*K#r}ScHz(!usGqmGt>cQ0rB0bY#{Dg^MOr(!e#cG9$G+S5Ve6#fmMJeKm#EB z-n@X%(!!%)ZyFVBgJf`3#jWt=aQeIWwFeIbGpA|$qii`bzt)CrHtFbPKc z2hztdLQr@V{qcz)Uq5NR((3JneB}x)%|XwXSK0Z6?Ee?2p>Ca{`%lY<$5%@jQ9e?!y-+ zt4DZ$KHdXVbgB7HEW`5S^~;us@%T~F|AkC0XYzQo9{l7>>6i%V3wR2+D!8@&+P+Ca zLw8hFu;_w}9f`ZnE zLkw5lsD7$|NLOEYUXpgS71~%9IsP=IDV6WIBpjLv6jg|9B&(dbi4v_-0ubAJfQ~CaSFt7mY`0b3Ty1UwE6%2im~K5UvZ90qXz_fifVDXFR_e0Zlh5#*r(ZCkK1YjGW64(|v1&DKG60jX`ArQZXoeadT-vCqq zw*xx>_X2Ssse#VGlfcfvRA3iiIuOtCnLzYEWdXYZvw=N;`9OD|a0k!)Fi!!|r=bf( zziS;J`b1>FK%glw5yPj$vve>3YmmzV<-l@47oZjp{etCzo*-8M`T#2e!-3ks1fUKO zpKVtLP6W9MFbP-{xD;3oxB*xlxC^KYR0C@O(FdsqL?5I+@GOKI0Mmgrfe(PSfZ4!0 zz)!%sK zLZAt74X_z-JJ1ZM0-6I)0-FQVfEK_^pd~OL*aE1P=_<4Y>H=+n4S=nIroc8pTVPwD z0%!+x1GWS91KI-vfbD_NKu6$cAOTJRDuDBV9e~Nej=;@8XW&s_CtxbDGw>F$3or}l z3d{p`1qye;et=bgZooRg9zbKDJJ1^F0h9xK0bPK7fS$m7+f$Rlp0ny)F5qK129bhW367Uuf<~<<`s0+*k>H~#)U=P45z*@jMztE9f9G%j=%(97%&M~1}3UxpcZg5up)3TPzQJvSP7U4tOC3RtOv{j zwg(FLAs=8BAiN+iGyrM=O@S4Gwm==A0$2&?2CM??2doDS0JaB417X1slt3-u3}8jz zLZA+C4X_e$JFp5+1*``=32YC{1eSq`F&n4@`~<87)P4Zzfd;^OKpC(-&<Fcaf}&oSN<>Vxq> z?S~K#Gys;dfcgM+fEE}Iw8L;~7@rsp^uTc7Kn%Bq@rmKUI1C3WG29OHg)(p<%5u;b z%E0X?D?nc;15YBIp`J(=s3+15>WTD#aSGHL4de6?=mBT|#FHI<{9w0@AL%?TJquw^ zA~2k8zhFo1OViappm4uO<5%Ii+AKdff2Yq1p!E*zC z@C?VuWb`iLCz_|nUr)i0bmqk8?D%0`4&+cS52Hjc8Gi6Af*(9<;s^a<_(9((eqsyT z!|H{neEfv-a`88B@Pqyh{Dgpi1wX!pK04OE2!6)GGZKEn_<5?U(c$UWxo>CcE{qgrt@Dov}4;CN6!_kwBAJlUg5Z@C(P2dR{ zTZ;Bz$^H3g6PDo5$F&&k!V*q6z3DYR6YogZRXzI$dLcq+lL8^Ut&UbG{uCk#I*3G?)#dmOYYtWSRkN87?YQ4jcz3F;H`M;o(*QgQEs zc81s3UbHpL6YGigW(g^9--9-X_3RGUXm@!16a4Q6QXKDR__c2cVf}@+XbGvYo)~XQ zpM=0VLED8-Mex}trf1h^v(h!%ttD6h))Q?P`wsPq_KS7H`b5w=cc*n`{zTR!+ZT{o$<*Jjy>#0rdu|Sq&u)ZIG(VVvB#xxg}Gqw z;@_lUt#o2LS118(o#`F@m1xtbBQ_3Qg`RND#uYy8Vm>GA53C2ywU~21xMt(ZiRuyO zR2-j}o{bq69!c9HjTuaXPdc&Ati~P?qG>~H46t#lX=fd28^hsFychM$#tG|hC#o;a zzSK-FwZ9YH`AhBWL~VhsIr!vHYBPTCUTSj(I(Au`neJJeJ5u}AY=dTbtbVKwQrXh? z_L+{|Xiu@Sd((O_eY^4U&<0o;tZeu#bf}Y5HtLwoCr-Q`5wMm?Gn3RlXWFN%4E&t{ zseNvIF2FKazq2wr(lO77BUT>k0ja$1v@Yl^Ma#so#q#x_;Vj?o zv2PqAE zheK*Ro-bKG%#v9?-RQZKrSah76~B=bz{h|eH;~hT{eU-s z0l*!=XkapMH1HST6yOEmJm3{zGVl^`GjJntFK{35DDWsS6?hAH3y3~|EZ|vS9#8}d zFX4S5KnT>!3|Ix^B|u|f7|;~L4S{ly{ZWScmI1nejBBtba177~xCdwr@nwMtAY;F~ zfUE_a2r{liNx+|h9uQt0xD;d@+xCU79|4lo3G9T*2Z4zz=QGy*C? z4g^MnjJ~HCAcq4zKsEs`1UUql0PU#+Tm!NjFbU$VfZIWi1u7xFGEfEbJm5*-T3{M* zD=-s?^UibNZeTu81w@|_`l_^Ev%jf@zNfYr4l??Tra-<`fDJ&#{lG$qZviv~IS!Zw z@pXW2C`Zp63AiO!qx*$gY8vrK& zwV@pR7OW}AlY#k=u07Be z3UC2X4e|QGc_7aOrb51LfXN__1)hX>1K?(m`(QlCHGz9U?h8B$T!`Vo8Nf{73Sc&H z127%Z*8&Q;u5{m(336=^tAI>*e9%rg$aO%T1T+S&2U-J%0p-A@z-+j$F3<(!0T>VU zYy$KIIRNMbOaVp%j{udx?Z719USKlt3~)Q}1TY`+s|QqrJP?Ry`}@GNARh)k03HN> z04_F7{8v%EL>;qJT zY>NbWIWQeK3fK?An*p;y4h4P!Mgg_oFrR-N;60E{fk{AH;7XtZxD)6G{0-O-*cliA zj0Uo^5Psu8TEBhiJjK>*KRPF|>j0`Jc8zatNa;hVCxV3!p><-{Vbs3abvSLSbUmW* zUfefH`LHLUEX`1jaQ4m(3&+!kl%AagSvdTCIvS4WE4GvO*Vx0e5cWSlb(YSM?Ck1C z^JKmN<|SfhF!pSm?Mv}FF1|xvbT9K4;4Xyuj_?^Z+7Xs(3EIKFWxj&|x}LK=H{Oro zc&1>_*x5DyFNNc~8%5W2Zh#OxK}XOLhI=ABpW)MZyvDsEz5^s(`_X!^aOUljuCY$+ zn$?e8htjgy^$EVGl{y`1Xu+?N8S~ zmWDmQm#&M_4T|G*>wmVgX}tjt_$oMpS?@znTLsm<69j?;YH;} zQ=4FE@RTT}iPs3nw>2;v&zbn!#CVNobi7OQZQvVHc#Y>?<}qYG2IeJW=M?6dW7n*| zq-)#{uxtEZy2kgkr0WQ(6Lwx_1BRAd=m%O zKx#wG^DCX<*+?n!r!ea;l9}a7K0xLzWdlhGfb8IQ7NJkC(8be0~qQzWBLlD*-_&ev?N)ttXI!!_q% z7LIRG;cSY2DYSGf1N)bS7f+9~sH6wHmfDU!I{Y@P zWw`w40n^uM&TWi}Um1l_Jlu!NT^N;?TsGkRc%SLx9;5OUmv=A(AdymaT=j!Q$bH;TAxs`JI)9vJ8{TA~U z)b0W4H~M97{GB-eRMYBJ4Qr6|-9rL*lWk<<%$$iR4{D{VyN@J(DfeQ$kFkTGP+!}3 z`~c}^66ln*2g+C8x*HRdLI$pCWwg->@>f?Ie{F`ER4BWv#<7mAL2hOL%dJDiEiPiy zjQ)^bv8~z2=10hmCV`(J$}@*g$q|8%lDly~Gqf47rlc-I|0FAwYp`EMTLHR}}7ec9*Ylm@mALT2-F))!8b zz}e!RR&A}|{;m2gtDYq>#ApS(&ytjjTOeHn#0K)K`sr11ztQZjMu`2TZVs z_Ky#~FJ2)(jd|)YFy0m9*m+}nUL{9^?VFfRgZ|WgHK*CVtE64h*lNb^HqgF{iRnYH zk(-g1ZMIEo>L5g$g-sXI$*}9EXY4Is3-qzJpZ%_XKBho`|`_|lEs@6-Pl`7-Xz{DZro|Ey36B(v{S1=zgb;xpHBiEYEj;jLYD}PEh8hMYbGuUbUbh{h0 zr*(s6zuXXeFLZZ*qt*E!ycDywLd_eZa>mY^a|@gg3f60vVB`d6!6&lbsFdP#Jj|Hl`d1ar7QDO_>=qS#Ws z-tk&zXy11C%dJB%ifbm$v_0O_5XvX^Iv-QTwHYn3&>1`Vyr}+Ekh?Cb4YWVvi^t}3 zqK@pB0}}%vKc!>V!pmpHb|>dNIQORfK_PQM!-1d9h<1NCRZE)K4CDzPlTFTudqNvO zSu~(4f4Xkqe-{O6Pl>#+(w%p7RR!ZvgsFcG20g@ucYWQ%=DCscule zCTnC@PKXX`wNsskKzoG5L%X$3h%c}9iBQ@@|0s4Z^=WlnY;b67?WV6=L3~)j7XM@7 zktXvhw$<(q_E9i??XO40yyemQa}R=jB%3weef)?xP@F%0`z0r+-=!f5?+=ScZCnmd z>Dm4u{9(Paxt51Thd~~P@4Hw-{n~rZ@I546tiOBp)xA((!DQ9L`D*d4ucgt#JKZ3@ z&%nw{MX`_H+C39&p*+RQIrFqr#L0AiH^tiz)1U7b zovS_FbVeWb8|u1q@IJB2wM9EWG=u(CCU=;dwny~(?VT$BWe>Q2?r-uQyT#Lvjmlm6 z%?9G1Ug~mum$=7$V2z_4pMgECn%CUvcd^d>V0+j4&>qE47vfbr#03+U>+c)`^->+0)Ni8kwb3_&8eo5pKlC|az1Xt% zww!5gZ6V&PiB;kn@m$2Qxt*QB-jr?Dx{hBdcI%ztU9~>gs~~&Xy8be;d(JM)J&nSZd zC+GU?_ecGf_F?A)MFBexD86uh=KRF@k@ExRd(M2$cbsoI-*Dz}=5pq6zUIv4e8u^a z^9AQ~&S#uYIiGN5aX#jJ#QBi(0q1?rdz^PUGdVLj?{MDcyv2Ew^9JX2&UDUeoL4!o zaHeryW>j9{yvUi#d4cmh=Q+-^oM$*sbDrWn$$5hFIOj3Wqnt-L4|5)36m(httE=<# zBBz2=;8a)R@tg`yfm2 zoC2p>o5yo1IN_lqI|o(d@tg`yfm2<9$8#z;1x|H&9?z-Z6gbsdJf2g*DR8RG@pw)J zr@*N$%i}o}oC2r143Fnja0;AifyZ+yIAP9U=b+N220=O6%)^j)`C7l#(J^#@B$>@y z*^-8NEi-5I)B#!Tvm%9%w(YC*Rh@$Ukl?er?b=Rc^0sEaLQ~jJ3F}g zK}N11XMR`_;z!(DCe?QFX$5lfvY9vhNnpzbdwjpxfSjE+*)5Q?Oc^hh?FIW!Vd2W@ zDM6&e+g9~vdc%Gg-V9%A9YO}ECbSFN_Di)U>m#o?E@v2NKG`U#OMk47OT9;%hLfQcJ1VCh!TYCt z@d!*H)_RpqZq9-IsnBoNp++Ofv9f<0wG(QBY#_HwA3+Rjn~rig=K`{9{;t_0$^HO~ zE{zX4ft+@@O}A0x(z2YVopdn&d52T9Mw8(wt)|#KM*G_Jt6R!wBIXa)?PrPozfhhz zdie5X#x3du5Fy-O9(_**g_w&%<_|#*?KEx(53`z~!`)e6QFqt4aRf3Ax5(x=|%0TW2#-34hK_20sI&0hD_-U%e^ zeVX3RulFjRbO+YHYSR%5STm`GMWYvhpB8}|Rg zlxArblSteB`5XEr8-Z+_k~Vb`>3I59*z>~}@8^{MXc9S^v$<2lXw-+(t~(tklV+P* zCe#hXzr?GwXbnXUn_SwsK z6#U3|nGU5%;IzCMVCuisQ;`beuK; z_d^SV4h@YJgU7x*(RPw4$mwnO)r=Kq%x_bEb$lm~O&4$57bC_Gvubp=lLg3eGuI4? z5g)ltKQe5bJIJaU3(Lfat4}VzRyn#J$XO=S)(#ar3X__&{)p|#J3G>Ks2KJ5^6kgk zm_DuCkQdRS)`sdIH{_r^`b^*1AXh!PRow#jkC{f!t)oTvf=w4%v_d(%?%-AaQEQBLi9erkkx`+bU~<^dK zsV9QPF>NQ@nDe|T$l3)Hst1b^!D%)on{dA`jI!+;Bz{@8+g1NF?q}=NzPCJ39J9}T z&HfD?K(@O)<57T^>pf64V|;gzJ+|3e1&Fnd{Jx=H8|*K|rt9(k;-WiR?^-@Vd&oaN z>Y$%^{}0c@eGkHZTJR}bzr3HAX*Dk>RGv=4nA=KJa9M^Yf<=^75KFO>6#9rd#TB9Sf>`|X;MV}r$ zMKZd};gkUEPoK6^_PdLAyUyFD=VE^-gZibriK|A=NOx+B{hM5^;agWR+O|p4>F?40 zeOg@A?;>8de^cp5U(Da<4o-iJ`qtJ%S zwp?z-WgA9?HKW>!%a&Yj&ZsnJ6wJ8XjLRmBYGX!)5tj|QEaP$`MrA`rp#hicak(y| zx;CSt7MBgUtk2~dj7nWbp*okVa=8klx)P&8hszbYT!B$2&!{ZN<+5BBxLjbs`r|XB z;uDuYaQQu>kk6=m%jGv*&Sg~OFsie;{EEvjxcr<^c*dxF!sRS3KVnooWK`eh@;xqR zGAc6|g*#ln#pRn^zRsvfXH;M1@)a&$W>j8c6fSc40+-J-s?Rbi&T#n@mrru}IHU3y zqi~eVhq-)+Q7tkmQn;+*@&QI+KcjLlm-le_4=(RwRPSU|?BMb?E^lQNwlFF;arrkc zZ(vlcXH>7{@)|C$;_^yHA(>IRoXg9&yo6D)m{Glu%L};tE2DBAqcE4tv$>qa<<-pY z)TQ@a$Is{CoQhw0 z_&i4STprJMW2$4}((6L>tQay$t#k-+1J z^Y~$m3QlD_507IMI2Ex>R>tu7p*)^b5zWJ+csQpblF7;l9v{x*ITc|%eh3feRD|;I z5Jq({kLOeb@%TUMWH#}DG+oQi=wd;p{RCmzqK z=+EQ(@%X+xo>SR}hkNmGPK76vmA!dB_@h7zIvg{V%yMkYqKy&FR?x$r2&E37&U^@yB zclY8mAMv~-_*7EAar8@imocv)o?nH9m4$bXtF+?+p6sRZ##NR1j%lCowmYBhj`3%! z2_GDtRI(m>7t{C|y2_7^hleaRnedsGXP~G4ZW*60; zb}e;*qv5PqS>dthpAZbHBnxEIS-V3QYF9w{OBF>KGEG-@wMGPOzezQrESb62D{g#G zV~p=tU0s%VggVU{HJFyaP*+)wbQyN7?fdyHG5$dfg%%mQHT>?|h~_Al)z8!-hHI>b zw0++KDX#NKEJZg|G?RQkm z>eU3}+t%M+gCyIXAJr`XfU-KHN^~mA& ziJsH$w!!$+#xi}9wz$UeoHI|bel-l0`ef+BzUD^ds694mlB!Qu4%t^}{6H#48(ABW z(XMTOGI~q<>xglZ0U5ln{v%)Ku9#m#lWYT$eb~{WnGLP4Q!_!`F*lb*CNiZey^_gh1z#} zE8W_}_@dvT@q!-4r?iN!O@hr#2aN9Lh_Z`KYHhOFF}TnB{DvrBYiV7F=)2!>I+suH zH@8*RA$}gSwL0Wa!1f+%omq#BtF|R@{X}@a4zE_WRn#S;2aFm&)|~3ITD#=Bh*8+buY^IJ)D>yx!l zEmNsvDEempmfd&qRArUa-)Wktc&zR`_%o+ppYaX(uD6j?Z#k zIhV$ZRv|Kyy}tGPh%>Z*FSS@GBR4L{7HQw5_LOCPQbsoKSf{sr60P4Qn`{|LYO;Ud zU41IQY$-D&su#);YmMP~zM!mP3;y6-Z#|vIjnKZ7R;`tWWYF}y_=la)U#e`! zylfxRg!pyTzp+eB?KiD`QWFwi=3&G8y)a&=?4WK!T28xqYxo$P50uW1*-c2CnAS zQxe~Qt;g`wxIQYE_i$-S4vf>cG{1@SkFu;sLQ^tfL`vh%IaVlJ_DpU{2DYnmw0%tr zkc9=kQk#;Nhui)1DS+CKmZxAs#`f+C-c_1@^pzI1#Qhtpygwh%9pi1U7St4j5AV>wRu}zE!qcl4YKkqlHynCn zsSV1@udS#l4)v{f!ee7clzXN})fD#$=U+B$-wx%n*GWxL@3HrE>rFI%`1Qs$Mcd$} zZ62?s<(b@gWgvE+v$TEK6a}Wgd_y!4?S8W<=rGX<<;0u67>G7U<7+vcF+kbumbZa8 z^T5{1{XgcbK)!gZg@Kqmch+i)#`YMWaJxWXyl8c0!r;S}C^x)wL0`-rm;7q?74$a= z)9!537b}W6Y0J`GQMSxT)E9T@+YfSZM}LfPKEqvKG#c(b1VADRG)pae$f?wU3axjz1q|sc4S5Aisvdk-JI-6 z`>Wj(qAQxjKl-p^hZWv0KB=xNmK)poQ>;BrKRHdTE}pKY^P>Fvt{6Y#ig$H!)*ZL1 z=Ul0Nldcw26CDmJCRo>^_Lp>RMKy7q@noydT|Q!cXQY#A;+V;;dY%4-`Zp(E&!{RI zj<&KjxbPn1&2OxzDrWAUIA;758sF$9sVa79G9;psBfP%=4-9T)R1qheXB^r(#~tNQ zw-T#})>UPz>{n1Z>vrQR;)*3(T6UXC)2H4MD~mmSj$TSHPwT%c!@IIrbG z>MGiwyYH{i5f%A+ygwhO{Wa|Y(GhFeEFBo)^$^?B?_q|vc;xY_jOb6ae@q@FYKxOj zbltlkfwnLEQDbfK+NI6M>#c8q`R{%V)|!ynuti9fwkX?WB~}#OmYoL`htc}SJoT<1KK5Vv=FtvXp82za^5Xo~Cfaol(eao0 zY(;r-=taHv85imObDop(qJ6#Dy|%8U^NHd`hL(71)(Ye5<C06S;=XTkP z%}^frl4yzJQhyuus~>HD*;g6m#N-^~PFsdi`&suYv7G4oWVqezUNn8@?8fE9F8SU= zc3PO>{r9rPvf|d}L!LX`p!y&E+Pkb+*(a?0gK^Zp^>PZzh)tWttgqrk>$@&zMHx{? zXx!z^O8hXb+l6e^xI!u(}3(5nn7tPr-w$4rPbmg9ms>RZy)5Q;@>Sx;l)WLpUOVSS z?Po)__#wq>(W>Jo7t--D@pZxbl(?jy%PF#G`TcUp`;UVQq!P}G*72_&j^Q8S7@`k)kc~ZASqcdhyKbddDHz^|@ zZuh^ip$FDy-rIt_lu?u4U$p!gpSK9|cO);R%VZ-ZsX^y)<#r4zkmr;Gyd7Jn$CGE(?GmH1o_UOJVc%CwT(vpJcz0|(*-z7dviMVa2 z`_YExmzrPjB&FG^Y3m+E(E2C8Ps~bL^ytCT>>Jb`LOv8cO6m6GWq)fmo!?|16Cb9W zT`}}%>eI$p{>hI8_fxhEd*T!nNXLWqr-FMaP3!Jl*75{x-^ovjcT>)I`ZQg9|EXF|uJp1tUNr2JBFBIQ8- zy-9Zis6J!`1&31B>2*n02h;Y!?;-9<@eWC?+O#~akFua(eM*&TvwHXbgU&Bdg`!Wb zy}$dVB_1U&`v%NkcVvX4|E}rgT|E8}D|QI&+|lZ)$Wj))U(mYM$BhoPvdNxvdl#Ge zE|L2xhdVB|$R>ld2lSqhG*mSyF*2)W$7~XLYIxlStCLi5lWJbx-anfJ?uuV?FLtK< z&fD8&VbR&dM84x*#_SoYlS|_3bov>72Xo@iZYh&}0{mWmr z1%1pWqYm~s`eI3#s^R7h>~s+G`>Y zSS3W3SuSsQ{ZkW<7q7|mJ)_Dl%$TjZI>T>D`wBT^-o&os;!n(!&%ZThwrk@Y@?!10 zd1E(@m)rTpM~<}1Au;7o>>j&)k({jC>3+Uv4q20zm*RD3n*8?Ydx4$8a>(^3ibbss zj+c+~e{(luVh$NomCUerTdcZ!r}3L*%X5gA-j;1ydXwcz*KedI?#&^q>)BnsRjGrj za=8cVCSA%QX&r8Qb}5@A@6*C@xbsTe%eWVYCm5UlwLk!>x^8Y(pn^+`Rj7kyA=;@Z?4ZJ_ulwkZSx>r^>Bm!5z8aF z@M0NA|Liu`&Wy5y9&m;Hy_P?a_`#hCX(1leuYP}&Z=N=55H0&4E zc=u&}n%ll1o8>ziri@gos?Qm8dQHzaWbwlnua<_)RNZLyN1HBD5I?tJ8H)pp0TyEzN7(TN2>-&UveykNjNw#GvKLZ;4mH zPJP?kOH|^G%JF*Yx1>ttg5W+=V^l5b1-m06!CUgS+T^Cy z#u z>vhQ|AJ27IJ@M)k)r&dKORk6Hll^bgmgFB_p;{C)?fQvn`NaN@(Yc4`Et20%Hg|fs zIiHwxo80I1llk%)&VSTuc_E+tcK=Ds!B?VHZHCuewDom9314u3mHydD^5X@wD-SSu zPmG%Ovl?-And;%ObKBdteNPUI{bSq-?_gE+UMJ5u|MZ@;%U(NwbhlwDj~;hcj34u! zq)w_odO)3Js{IvDN54*fPg*`YKl@hZIWz9%U;L$`MxJz5TD?z;Y2?@6TF zqlDAO3G%>)gGL2a`9NA;X)wsO|6Elo%dXFtSbrd!+T0p5(0aanP*ca9<-9(SyB%iU zjBK$?)$ey}{pBM*kmLTxPLDmaL@s_F;T5+01F`x1uG*;&N%E1om&LFnA4qEWx&7CExk2T%*u4?s>RJ=CPda%+@ zW#9kd%$WWk$^D4^2Qr2(RdpHsF=trfM`FL(bF6#6cvaU5E3LP${Yb3LJgZ&)v|M%R zP`9K;XFrmO%PmKyI*ga=G`cq6aLz{(vowsH{=8hZwAZBDOX_|iw_QA@2I`KJk4!D_ z-lX_MDjlDY*|yUXdAEywtzHLzg7M{2(0$4r`5%uf%!~Nt6LB7>bWv>{Di2M1bxXGA z6S?X7of@$wHx26*&R<%@>GqtMr&n-Ta z;ggmP9p$o2_4AsKx9ar!Oe(Y;aINf%@$!WePSv`v{7kYkUQ9pKXtrun%bVpMZTw7H z{t*!>7%i3i>?)IMc=9A@dDJ zj%&7if$A-p{@BXn3;E^jM&;Dy6XX-zPJHY+@(Z~;v&!ivSLVoXB&}JsZOs=l*K}!Z zqovDLuY+e2uwW^&$%W%334!`e1)T0lC^sw%Es zIajXe6ggm+M**3(GTrj-XztqF-Y!4O zUl0AI`Qgh2ih*x%4!t7c4C;i2z*ne_Wzud&T5e7}u- zSiVL7OW}+~^)DVSN!A_NmBj1KEs~d|+z352zo(}l$)cxP3 zZ%HOA!H?6^ygtPHAAk2@H6d@tz4mLP4e_t~H>$m!-1NLa>K#P?;EA$Hj=zz~ms3yn zy=3ShD2`aRYPp3pcD|l}b0plKd^Ng;>2@;AW1H#pT#$WUKX1Hr2TAkl-H2pD{nUY< z>(~69{2Dw%OL?y?#2-^Oo4bqTuJt>&`DhEM?~}o?<#&@6V^$hnI8qz(>pF9I*d8)6 zGFdOHTm!iOL66E;_mc5$Jz z2H(GWQr6_DikvxPHQwyvGr5o)erT6d3VG6fW^VO|O`-fDJIc=#$@<}YR;`_7?jXqI z$CgB>Nv98YU(Otd&o}ODcC31cY|WlwilZ2lq_GV>Z(zdKAi_}8m?;*B+YA8JJP=y^v-Kuo<6+;t!HmHPNqM*mafVP?U|vNB_+&!sMnpPV8xeU`**el)N1?rQM;H+|oaHO`UB^S92vXm z(I}{&&)8lLwa$|VbFFehmx2E^x$G^A#plV-ug4|5c?R)G^M>_ne1Ql_wVyuQRuRg- z*;u*g0tuO)^KMLR6KIc4rva5xNn+F9Mgzh?-&r5qDqT{^alL)}<_-aS++f(p=I2zh zHCG&S!x!qecSysb$5RRH8)kNW0`1*!>D={#RH9t=`fat=VDAZsQ(7o4lIi=KILYKt zpQO;b3r1cfiw0U6j>rM~@3+}{emdu-{s_9 z&Eyh!-*}Cw?%0};UyXHsewT<|-6~e~w(B_v=^fQW7hWPG+AiN5+O9d+Z{=Z!u3RFb zcJ-7yPwl}T4y^yZ%4O0reRthOb6`A|Hh*c%e{^c-$>&4P?5rDf{*aidWU@qcVYGvP6$^OqM9ym`>A6%=BWiMAL$6G+v_5HYQ74=*?t_snwY*QF-JlyDj^+6iFU!u=CCQA$nW3t423noiUcypQF zFHyOl$r6PLOqQ76gUJ#TYV-R!qwim0?cvPa$z+M?W0@?`r3aHG?rq3qiOFD}XeSb< z9AUD===n^R*e{gH6891&OH79Ev(o%Hg(s<0mY9B+$r9}rF#OJJ{Sws+m@Ltw zKa(Y9)?>0npZjO&{Svd+Fj-=B1d}BSEto7(`R)w8Um|=3gUXCbcTj~l?qpCWmHN8& z=;i6%sh@{?FHcz{{MFgmXkY(8+3?WFn7B%#D#_pz8W|oM87T9MiVBzEpJw%qi;8h@ zFb#=~i-AAFD)WzujEysqg$D-3S;$HR#)Jlk#F@z=qXHBB;V;|M>{zClaZF%bd`zS) zHZH*4emKj`dst}Ta8u073|6aBqF9dYX-;D*{pI>;mL=8vpH`CI|06Xjt?<9EHoWsc zqNCydA-*x*aZEktvj3WTN|gIw(##K;HSM{``0()PIM583rVRe_a9~_uduD+p^C+JD zTce^xCZ!EC`G0OUM^KiEsf2F5qk@q@!kZd#b|&j-}EmMz1-wQR{oNlTR>U7B##Wxdv3Hs+g4kmKJO zyG2FO0%UT!u70l=`9E%wW=Uq>E6VX77e&`BK743V-_+i>dg=!TbCC}Jh3@)GmL^NmwKv1r~D^}*gq=jFZ9$uD(A2D)ITh$ z^qwlV>-p|NR=A~+PFY1~0^GtB%jg^X2|6|Wm3+Rt`23ZOzO^0rvl`JgzgW{iMSfprd~$Bhb;`$_QK=C7dz#_Ms8c;l*7t8uN_5Z=5$5S&5ns70J`Vv`Q;f zS~Q!`Y4;R4X?)}3qGYk5BLm^k8yn{v7wQjx6E`+a9v>PR*Q%v=oFm;5TVV=QGg)(H z$XqmIMHeQ^)shUi3&3117C{%p|pQe5;Pta%!{%prU_Xo z1ygkw){;qFjbEkKD4KiCXcOb23Ok*r7*h#M=f|CTk_AbAz2<-6&{D!sc)id{?d`!S zsA-YR@R)tE&Moe{`@w2xTCQZ%r5f$OTbI&`{mumS-`7itRqVf@k`g8UPio_DszI~2 znLFBq=42tWF)JKow2!&R?rYjBQ}{VvQ^|roOI^6jIDpPqQst@4xbC zO7|4a48?Ewb0^IAbtL8gb)9~AY5LENa@z0G4D;{wBFm+Cca6b6HAFw(UG3unVNUgp z3zW&@MnnhVzCh;bNVN+OP2&CIWI?bXdxydwoX1BqC8nQv__O!HGAYs=NS}84wlW?d$I!7#mxdg?F59aM2oEG6$$ha8%3)DT~m^==h@2OS^TLZ+Lv5H`bjx z&i%vj(v+H0K%jp(M9V!LP0g&j1jcoUGqsjR8Ls-Q?10dqpum_wsJWC2_~9|oJFa9k zqoZJ70^0)z*|4b4fReE>fjl3KFRT^!;$wNmGzt3|>B$wXc#v;=I21?~{B>ea$zJ@U z!ovgo<3gh%Eo9OziN(RAw1B__ja=;u^TPZhpm(HOO-+if%`8eJquH3U%nGAM@g?=E znwbqLjVnji{99*(NR5pv_Tt|)qtfa|SB}CFT4+zjEsGaed|XrWg2Re~Eb=cI%->Ow zW{a^z%O5DRaQImM({|IA!olPlrIze*X|cC7Ev7JOW{Zjo35+r0bD14AP-@ z?@qluO*LmWe0oANveFDK-A*(QoF(e&2$}Nf)Uw#Y^s97IVJvm29bU99NE$GQxq%wk zH=4)0RkI0}j%)#w>h*&q4H)#zPX60vLyv2!PFjT=O(QiISB=@bm^%hu?)cy6erbBq zu$U4{)3=%+{~v3CywK!-umO($V-0Zps|^63-aj@XKFADB*)%4ZfyP|%&Hn%QOXnK+ zfx^M*_is0y+fV6*2gQU2Mg|n$yB01X&A*;qEJ`E|{qqeP?}^Yjm|4EDfPJqLrL1HB zs1lZ?R3bVibQl~>?2Gp2d`E6xY-0_(OMd7rnxCcl5fakj32CfZEVv@+B>e3on18r$ zY^*HAH`bfZ{xtQd!il?-`@AewdqFu%ay z(8$8WtZ69+Gc%c`W0C5MPFhx-Lt|p&OwE{sx~Lmz)-i#xaQ=hxzD}=kC=3Nhw;@Yv z<>DLLF+K(ku7z1*cNArd5+7N`o!*7^!(&-~+$6tkk^fY2FpCtaZNPvC-w}R+-tm#~ zv4H`D2FXg*qqGbBiwZ5#YCesBZKyKOQrh$bwoq*T1(Tsh_#<{9wWq{5mg=j~_ZBj1 z8Glmo->H7F-YKm!ex%MCw%eOMviVQ7fsGle^HPUk>9wUJKf*UG&>Oq~fibZ#{<&Yv z6o+;(9Tc@i+SUH+9l-~FWWc}Igc4Tx%|PH>KECthPY>$7i zqFhh^URA%PcoVL8^dsZ83mQ|{6W?kMYdX)-N;0#*+uX>gNM_33|MQKOnk)@I&>7p3 zQEM#G)6zcZ-|IuZ`mt^*Ro%4AfWSByA^&=@Y*N5#t`;$!1ri28@e z2f$Ni`sKeCe3Gy#nj@@29A)q_7#s&>_!v+IQ*umrly895H+3DQF(y01s48W$z~NHN zws69T`fA3Y3yg29Ddu7>gJ}s?fqzo$kCj?DPenP(iWN?a9#yH>_|n{6K^e(_27B-q8e7=P; zEFF8|?$lM9D@}vrLj&k$6612uL~bB z{i;J(@){kgq?{eSP}M|=BHwm$rwTE5gt+aRuD9BlZJf;F~!Fu(GB zMo~ozlhJib4cKj<$8YWcFo(hd?O}rp ziQ#>lqL+8sOPU(XE$oUQ4flIuX+_hG#*|XnI_ZL)RN<8h_F(v{GNnhan0H~bi?YUo za4LkYD^7wa;^%uMntZ!3s&e?Ed5CXhaGawW_KmV|9iVHip@YnXX}K^Zs;YR+FytGx!zlbvTL8<|P*0KKS&~xw z1fw+i1x2<9lz3G~BaPJJ(zNh(Hx@Rlc$5BP3i!UY6xWGHqkg2}uqlJ*Bk-)OaA>3F zOnRZ9aAba?#l@F)8FW1Dv!WVl)TT5Qe{1IXW^tuj^N+N%v|~e5k@HL1vi;DD6l_NF zjis9i+ThYBgdZuBubV&kq6*hHs{p(8A65b{j>w5m9ye;fr}0d zpl>Y{}Vk>S1s2=v16I#`&pT9v+6mW>`QGo;1_@v-QC z#EmN@+>a3V>}XKFl$Ms)BdGH#5;(C-5fx@E+7$;IRFUrl9NY zO39Nq?dx2>)h-Pa;ahyPMBLF!3r}c(1@%jt7rI$k%%52XuL>QTUmY1RQ&vfhMrhQ9 zzoI}#M(l9k=)&bt`r(+OnT)+6{b#kIhDUS47pvh_GP)n4_cGz@dVK9AWCK;&fc%&m za6w}8Q{jYKy6JF5bqEOPReXDc$%_n8LrJtc#n$gX)4~r|2Anh+KEYyT{D38~Ej9HY z^>BCX;RcQ)_Gsff+5TD8i?6@D|6reH>DY_yuQW%xhLYIKpt*Hr>!WnU1^*AE{@x*g z@ApfaK}+*bNK@Qja-SA=chXq|T>;?ODteF@aY| zcT5406D|;rd{jG{^4wT&a((@`n}}ZopiP7=-}f6=e3>a+M&K8vhK2fuhr^>tcz}rC zZ3x9zK+uI;w0ab&2uBht2qtIA0NC&<9GpL5Fry$*)KxjxiQS1_>?G*(C3JAdE{JQN1}RR1@U0j20g2@&a~fe>_t9)51+mvTznkfGO- z@zFxhRL^CJZBlH7kV=Zm2d~3A$!CS6xz^>f?*A+=l}DrR9zkHUHZ%K=>}%^ej+sU* zHL{^LmW28?gW*uD2B+K)6*W(o6gUkJ^wl;W*JdKg z>yAp1mXL(}IYCNDMnT192>}iTgVabK;&1%e?*T1YTU*p4P>YCE6ZMrsqmr@C7>gq! z0qA8IYdANGy$K8QQJ;0cekHwMUaYOcSX{1NZc8X07{04cs6Z&@q&xEpyaww+^4_=- zh8xC0QmBvEDe5cMG~anLKjdu5fZ#mP)$4hzqUdQ4dzjnD(-XuNczyz@I-zrEne4%~ zYo(|0qnnZ3u;lUioy+W1by+0-){;n7+m8(RaLciE4-=MfZytE1pRH#gQCT;22wX_}?krrZI1=1}*$H?yxub<#58N<+5TE~YM>Y!f#k zoD3MDI$Zfx?Lzx@>biGmGD{BzN*8+#63r>mKL^kISpFqhJ zq$z>xnm_Ynzd+5VYNQ$FPUVeD%`F>Y!z@Ze26xTYPX?pY zsmL!4z0BInEaptSu0C{|Lj{~9kS4_zjnL)Ck6Sz2kN!`;ck70ozma9tCN0Z<$`oYF z;wIe`ry-C+1JZvS_FWt|NoN58f{l}^psp-XfkLmGWY@#r!nu$EZd^UU0ib@?;E%}K z3o*12!XlK7-pyN?6ou2KP0C}(vKph^Fa6WN?QpJZ))?*u4V}YLRGs)C^Qm(9eimYh)GZd=&K_TxFBmdiX!&5sJYb}^%y82;t zb@g`j#xRhQ^AY z_91iDjf!|YAMTw^MyDUQkKp@Eah8I|B#2GyrHqjcyx1z?;!J-@5U1F%A7Danu_+m) zf~~VwWQ8mjYa-Ycm`b7hDM>&ZL;>850)P~^cAh_bY9fFQQx2IFB9iPmnN)t`C!Pfq z^HmKelQC;@9f8l$?}(pSA2t? zCMtXi){fuDoM(+OT6%=;u)QB0-?^>b)isRoC$CDsWyqSqO(bl|W9S5A?>^Z3^l zAmsWK284BCZz-(UVsClBW|!n>a%@6`@@9OZ$CtfWpaFsW&wDN;ES4=xmUsw}vp&RW*{%bMpd3(gEm`dvH2F8twTfyxk05$-Dg7WPFU&#HTYqDto2wCLe2;F!pY93XGbW& zus2<)1@aOtzZfMdKW(7Aa}Up&Do81*I+Yxkkgd#4|c2B&ZER@k&-M|d55?VX(T z4@a+XDsVCeX2(M!5u_d;0<~Ec@=K|2Fz>Xm`N3)H!&b9sBB6@djXg&KTDF>-o*}@F zYB__$_k)kDSgHYz?5S$MuKq%M9iFx3@=($i_2jA}7m+*gmjquPnBf6p zPTEBjdPZb*z=Ca&<_g95kXXT;G%Y+OKO?$y#L7`U`L%$E>rLEYIPjQ#E~Z+jsQ!AG z-d+#VI1e}(GNHHxnSlN|&FbvA-$QMNZ(n@3B)O#FnNF#Qd^~yZ{T3SRZf)*vKYN;- zP2oC@=3{P0F^dDM%Fsu4(;mV~r|<`GWWTQ|Gmr`9>A_)<75*rCb2tRPgFP@4#%3K0 zq@@0{)Tj~?&1iHClsMXSsE9O#piyR)OZG*GNy=s3C10LtPd7S^k&X2BaszDxJz>AN z4%etrFG3PgS!frR5DQFjAH;1tmx$Vg#QC z2a>BI=HANmYy`^KO5Mk-JcYla0}((q-L8g|o<2@*+e_0S)NCIw0U!UPTpR5X@4WS9 zZS7<*863@kbZ|E*l7NkBYE05dYv|%Q zjt}GO;SV*)X<}wPMsG7_Z~TOoJ`@w4wZC2HF;l(zo7r)3mfzV&-CUGzNk;8Ff+SWh zpBigSsJ3bqJS*N-zP3iQ&AdRJpnU+w8Tf($O2Q}{=Lqf;G?8HeJCEXD$;VeCrQh=t zb}L-)(8i2NaZbA@7z4ulAnaf^fe#K*0*iNps8!7{68dztx1QARMwQ;Fxo~8>9Skj4 zW(UJ8t3-2xNZ^y`E!rg+e@Y_i?3StsHA>31E-}S2k*6!_TfnVQvR3F@AmCRJog*oX zA9K);QJ@P69RD0nu-L_YYOb5iW3IFN(;`_I9jI3^;}$Jeh%$Wqkly`nrZ)q+t@)fyP-2_0?nUu1H&g-M%Xvv<{ottoo$4eR26K3mVo?Dg!`-0{o6}FAAt>b zF-^wbE3PuF{pmt>twjEGA?-B7{}dO}Li91V%^*n_Td9UfSIrKKsCJyuFIa5r-Zt0< z(~rk{daDCAykuIM>4g3o5w;ws3&z=MK=QA3W7>?l%R7e1xa8U5Km zKoG9Rm9##pbF|a*j8re|cqXr+O;|Fi%^i=6P}C)kh+Q~9mlp16P`br;jfaA4V_r^c zNEgq!3QQYp2@$!@;M>1yh^Mty#4FKDUS2qu5k>G@#4=*%X%XHU%7|?>eB!FRrzdXWa&u{#4m17v?%Wd-&qX{(NV|if{?Tat!fcXMHIS4+n_5ZD;+kEO~B7U9G*Ug&?_hq;6 z5->k*KhWi%8eU{TsDB8gkV>6W>Vi&fzIeX->`7U#etLtm6so|@X4ET7#k)~`3^(RL z&)$u2V-D0Is*#ERz$c|-atw+jI;glqk&Z(lQ+XVr;gTJTRpEpPRWE$Kc@t`5>EdJ! zG;^1C^5B0|$Dn2rkfO!m!0US?pSPyqriNC)hA*zIA!h`qCz!sBjK;HL?9MR9CL^a^ zEz#wk@TCc-n$|95Ga35FB11{^#$WTK`mf7s<;8UPM8?)*=tH($>d@|=o#5KDA(F~O z8o|3*?`pr!5?u9-(*oR*qUQtZi!U0SOykOpsefGv`pug&q03lWn0Cp{(u=BuYr4Iw zob)<@phy8}Wu0{zLV>(URJ04Q4_^)T-fCVd5_q>C@HbS>)+}}0`zaFh{Rk3?t8y!8 z1}q+a-Tv-y{AzHx9X4NgnSj56eVx}M~}a6A1UIsSV|-^KCJViK4B?!=XU=T z$86vy@|ajvxcn&u#9XQPP*OBZLahnJ#F4=hBpZi&q-wI<=#BQ5SgOu7DP|gkI#Hz; z6y`H2^(()pz!fn_{N^`)mX!i1ryZBrL#p_C4K-ACWtwy?bi>!nwI}(DnXblE73If9 zsrN=f4hKVyyZ3QuBrbT1GK>nFgc#6^)_A6T3}xOT3)8M6ta%oKh!whu<=N-!OPm?; z3c#r&oVTHa^-Xp2X5M$kE$WYJj2qs&q^k+6nEFPJ4ieyo8^0Rm5qOcm%`vhwoQ@As zD!Jtzg@p!(p&-`e=Eir!(^-QUc}2Kc!QeNLZRRKK*>V4}#ZwcOz(nZ=n-TmcvZ_A! z7NuX4RwTYSrO|$%u#LJek2d^q ze8`c-OfU}d#?=4v7{oqST7K#oQAiynB}`GiVl)Fclo%r<_;d~1A6oZ!SWO_Ga(h8L zQqaxcA`<5Y(@raj%S%PfqO=MGWuUDI_}Z|CRvINOBxKNG((CUXPDlH=RGgJ!R#)%b zzGGEmR@1-yb#wIwo6P#p-Fww9)ZfVbj&XzDlXh6)km^mXqRHlXQ%>5Ttm5h5cn{Vh z;2g7_Z(!JbxxD%K`R49F`rA)`*m<_uf4;SY1v3lF#QC!5uCPW6Ag=K621k(`la2&X z$$`+iH+o*$oHehelyl&$aMYZwE(<78$3@bDVWffh^x9&1@Clm!< z9*-^fJa5G(dHovgt)!O0T;M=n$K^NOeuWC}A991M4^l&I!wU zZ1?$8Q)(-k4P}TD9A>;2?}&M#xJW1|c(^PEcQM6>Ef>_yyc%9TzHSheoFkHUjoXn# zP)S)#RI1%Z6z+RkxDG&;RPVgh&2Z{han}&X5nM;ywj_0tw0H)r1-8oMmiw3#Y{!K$ z;_~Ku@yM4P?hgn1f()wlD1=U=9HLry2y3ZtVX_rj3#yD?v6>Vk94zx8IJ!UvmBgwT z6dE>($@{@HBt;CK#Xg>douKej>A{bq;d=p%!*R7EtNOKhioh2~s3FQpYQ6T1WOXAi z=N?kTCZnyUXf_^y)0zqe8cPSC<+!^ZA<#+fiVG`rSa=(fttAy`Eg1y(L=_tdUWaKW zPQ;w|q;gV!isj>QKUw^ljZv595Dng;f}|)!)7nN00mG_HFWc5d#27)D;>Xk6g{P<*3bzYYj*fRm^m{53}`;AD->(%2IiHf@ANxr_$~Mwi{46 zu>k~Sjc|w+`ug{0Yj(es67qu(hryQxkmIcnBE*f1#;aaq3e zPBlBxbzvqmxh3f08~mNCYdED6TA)VU;1H!g@>aiW?1n*36EEH?PBOhAiu`|o0N zo;6o~4bLWb3+Hfh@)s5#1+(0tKc=U10XAQ$`*T@|{QKLbi%MuQv$24+Y8TmJUH&^; zs@fEivuqASHS_&H?bh0MX;jQ)+9!3Xa``SUpZ}RwYz}!XW>FR}Vl(^p0$dD(nKljK zrj%ZaS+o{kYKhNhG51qe;OEE;pPYp6@uQf`ej6OO^&9&o?uxo+iZj5({+OH zBjx3`cCAsP#+Ht@sTuTbr~8XsWy?Cf}d$}+>`1V0+GWwZ{+0bU*ca_4eI~Zk1j&7qJy9x+G@| zdVz6iTQ>Dao?A!^*sOpEU-~QU7!OgbF$$^m^&eSxstJHw{r?fGzDvnlWVCCNz2)KS zB?VPq|J|zns@JP!O^Yr1y|AxK$`Sj8?kr`mSpzDPYZCM8OGx27NrKhuaYuRyS&Dg6 z#V~IwE&Ze7J7t`;o9yLOK0o7}+`;wyKewOsR#sM)a0O)#H6Ngr{r-;+`VV%#d*1JF zEH5uz_uJ0yH`7H%l9|Qdmt5J0@u^;Di83Qmd`M>6-Fp0Z`}x+>=Ue@LjV8h7!HeBz zijC{YjxgkGt2O85Q6v-R9G;F(hij7RDW`p^_v6Xi0gBY)bc7uDVQR{BcoWBNU?$#S z(_k=>q*I*M*gxA#M{(TU8@Ik%`8%l73piFj`^(8>@cL*F-s~Y2!miT&YW40tko}3U zxVLg=E-dcezIR`l9}cA;i>PsJg5+4+p%wc*7W2m$C?sIVA9uE%zj*TCTb#9e^x~-$ zmVVxU{^AGjzHB|LYqf}H^V!a`7rWa}w{Wuq%3qESL>FMj4{T)V-c3yr!o&1NdO^UZ z>mn4ls*jzZhtGa`-VeX@pFVi9_56nin_K;G#HKjchTAD322DucZhg1?)We&#>r}io zer;`zZnmC2be*`%9SrXPBHW|#*FsUmM76i9PLT@mO5I*NzY7pb{7y!%&QNi(-%G#*8m5|p znFvUDEfnVU!|4GrO*@aMFb}sL0pEvZ`?USy>Gw~c{e-IrwN-$~YbO4KBVM%wMSwYh z(DdLWm7ME)GTNJrr{jZD6t~79t-;~Pe-3%2&zBG|wl6K`w;JqgGM}8|8Xdz{9aRTs zyzUFvBGEMANaApBMCj9%&v2#JaB^H-+r0Lf2JZDf{+yA(KFPc9XM0$ltT0VX|M9SZ_FYOwZHLB*$Zr^}ji}EqM z+5Tely=Xg1N@ws;EfiGuk495m8ngGN*Q5)XiFLY&lmgdI=iE#-r;lkh&*5;R_^r6z zQuS|q40iCTy3om+l9Okew`V-*CGqsGGh=1xWdQlJPigNVSr#Wm33%z{X84nR{G1XI zYnx)ZBNxE(PUZ|ihi50Vr25PB_gq37XVIRKJ%Y!*`gJuT^w`tQ>ekoQ7hjCpdSKEY zX?{8SneRmk@jbo5PII4;Pt5JCA;({m+v!lX<~)|Cq=;Af>F$Nm3N&&{Q#q+h_v>A= z#cqfBQLbH*e5u`Lved56igJDUTVvegde@DcI`Y+-1dxBDi(?$tzeS3ZjO2KpY4(yP zPy12Lls9JO3TX%VtM#S3%NW{qYj-O*ovqrlBH)g9UMJHn4=Ll#W&gE-@OL|O-5~Sh zCA4+E{u?UGRkI{jENJs*l~QAn6+W@{#UwJB&Ezxz?Yua3q!f4|9Es=SfQMtTS_l zbg3AZDp($K`P2<4Dw<;HE)waw#HEpD>gdeCh?$xRzPP~>k3A-*KRNtP;S0&9m!`Ka zoX-1R%Cv_9R~NhT#lcit&?wgBY{>j|s~uP;rpuvPkik`6{Nhk<;lv_$zc^@D&VaV- zUtFIvy#hInLF?vA;kEe}8TN}@0^_lnIj_)Ca5-+)=g)g!>OqH)`t2?hOa7S|spiUV zhU4ba$3^UL->&2ym{M6crv}Y~sJXk5EU!^~HFdll2EP{%Ol#da#4hNEHQ_X#)MuHd zPu6(FduELv+u=q3tntpL^wQ#LCY?Y3-QKa+WXvU8wMaO^pE5_gvN8*ME=|n39jcTw z<6=5A=B~(O?^8Q)9e!I2UGq6PQK7Gxs13NHDzVOMFq-(!HI?ExyIfY8xI+?>edRZP zvOCVALb0ozZw#_!dVR2B^~Jve-JqJG}D!YOzpR{c2pQobBw@B0c5aLbX-Nx0}-_(40u&ru)0s&+~%O%@j!8RDka7qM0%cLzElWH1Sd8ADr+cm2Jd8TqnpWNN7b!m#OyN$BU zsEsn&Cuv^bnXd_&LZo*AeqoOVH+9ENRkm|pkHFU5Zt1#1qPqMvxLuPbPOy*Pqezuh zV(E`?Tk>nAzG%EjPn>C5%N0S0gk zLfv>2JgM9jnNTRq;Xg&`)8RyTp0v*@EumQJWa=smhR25}QR`SN`<0n%*hRZBwg%oA z69MUbwK)MQViY?+s#vfW;&MyAoU7;G>!&0_3;@mR-0vaH?%NmNEmc_Pejc7_q82Oq zKlq;6db?p0Iwa)INCaznmzC_eOy+6~*$T|u(~HdatDayW*?6C~yuH*&ZMzZ-ET0%C ze6Bbk;c6xZlE)U(+1#>abUZm-TcZbRXBW&$9}OnR*sCd(Q24 z3nL3deLHOSXTIYe3M{@wW+;l7hu?)aZBX3e5y|@1b_Oi1F3M+Goa_UF@xT(GnK7~h zG;&I5Z*YntyVQZbLmsKowSXR9!EgGNKf({ha=f?169kA_)X^V80K8%&cDIr0>1>8G zI%!>;QKh|&4kU5y(x4Narg|Cpb%%_)(`3W?F5cQeHT(Q$_874^_rfvO3$*g<#44@KkvU0W!$L7J9jW9OCv8zmLa&;O z%=xk@?;ugrUvyzMbq;oFOUDAdO=V+W-4ZDYbCQ>0dIsr3$Lu;*a&j(O zJY4LpifJTjSJH=KW?lFJkoD@6z6Ir)&7Gpubg3yhF$GImR#dYP@aV^{UNR?@st zd6>Cr3Gb@$XjeH8VKJ=en!~pbZgzpdS0|?vzbvnIdw2r1fCD6(B$Mfz(MkURx0Cddw3`;T z$+)=1$iK1<65NPDdW)2}{S`fssO~3!iYpR%b$+3~lliA6Q)=|GMqIUr8Mbe>A{NI* z&_ImCK>xZ2gT)bV3`=wD`nFBtbsHMDjRG8MAzG{QgecvdOT6fUNRI7xHvnt_H$QXXVz-#W z;@^6xgPI_2`{+Piny{kCFtgbX)2cYNAsw}#_fD~hZ$3Xv#$%{ibeh^(=#M8@O-%{| zKC{hA=Es~Jzn@qMV%;IBjjT&L7B%3^b{26NF3}s_)g`i`AVJ&N?#GN5I}Jc4*9QHv z@QUCYKSO}gJ*O5o1xWb{6T>2Vi2E3@i57*X9G+pJ9x>FECT?oM4uH&tx^8c=Wki7( znt$pRM^FOzL}bow#;TpibGSr6US4PAb2>GN`bJmCDf=!08~ z0Gq6}bRnZA`DUc++CvPw5thS4L(6UR;gmUcaYKEI8LW1Lt$KKNbo3F!+bgK6K-(OQ z;tM)9^3P~Zb=T4Hur_pQk+vzQ+3ul3a6Sa0MXV38rtGA9)n?Es-yHfa?H4eh!FH() zsc{R8u00WrB>KeM@VUH!Lupn_0=(hVqEaH>Irj*2$1(>s%a)}M7j@p}wcCOVV!Tt` zbzE%gvp`k^HIuB^YC*Cx(?!&q5xqskk`Ib}hAcprixF)9AFtY|o3U<}*4B@<`foU9SsQPW7h#itFbJBHqew^5n}6yj(+|*oQwt0moJY7A72goXU9CfkIPMn zhOA?5RE^)l29WJy?F~?b95Yrch6utXvGjEE!E}R?2Jc4Ly8ehd2|90&css*8O!uV~ z5$B(y;n5VAtjJ;twT*ZfdwkH_UE)#yfJI}u(-n~sj?ck~-;h3+9cODeY%0yOIZ=?m z8^~d@c(^PV*rJNUL2ujE)D>5!tt8tHT2?4W{TFl8Ij5ACXdAdol3Sr19nu4CQ^8{R zDC94+>umw=moN8+C^tlZggOf{!jgJ1GKdg~Uw^ovNSQy|syRNG^3d#$cyBy{i|Sh& z%cyxFG-gbhhy!8^Perzi!;Sm(6kzOU19z&z;%OTOg)INBcL^3CP6ksu)EHHP;FUM(I0NCi)vgb zEs8!hPk7s6lP`!G3~{G!2XmNy!iFnRT&I|iZ2g7n1fw{~u|x>J@nfb?$9s4S=s26r zX3A>*#gDyI<6KzSt*wc`g(e|E6`L<6FzVqSaNU}MU~mJ3{rW=tA}p zlWiaJJA3aQsqrKlHLJGn{zOBg$tYRnUpY5x=@n`?Bbf~IhDl=zLuyztoEaWFMJ>d< zoA#>KVekv5SRLC2c!KRhy)h%h_YJdP;rF<${XV6qAq@zwaCKh(}qgqZ8)TnJx&SlCP zZzcIh*qO@9yi@Z6yKH+TCbKIMegXG+Bb2jfG`*ieAx5WoV!9dCEsG5OCS1%&q7Ga` zVcw1tWx)spy`%K`$$ZTC;%p8TxgLxMFrZK0$UfDj92N08(y95c*&||6Faj2M<*)K; z3UzYPvfySmj87N>k;Wz)YO~HRD>ZRkN95Jp^q8$p0x(9lHEOf(cz=-e8Y5ckoXvI_}&?K1(0l zt@}KfS^e*`;pF3XSc~*H(S!Jj4V1cLxXd2lCP}`lHO-~;W-wh9Y#lsEhcWjr%whn1HC4-dR zGiv}C#tCB20rWZ|BLQ~%6309;gH^PVVkm5)(qnaf9O}VUMLY|Wc{7zitpS_KV}EGi zoF>j`lKHXi%v>Q}7uIy$*kv1bSB+(ED{Cl+qk0sAIojJ#$Hxz040t@{__aIj0{dQ6 znsB(qfhM?CIC^j^RvU$DYJWRDLskZ1G`Si#N1$KptzFb7?QHQ_a|2Zun?1$#mu)8- zd;E;r#wi|Euy!#yc5YmoHl;R~_yy{$`D%`_%4sv~_OE2r)cU-V`Rh^$UBP^Iss2Cp z{B|ki!hB~_s7_hl$jWHqh-zwAX<9KCNM@JlvvEb*W&GO}s?<$m_9~BgS*kyHJvziC z7xMRu>F^2eAvqjA9`C))?0q=M+gJxI3S&Axo9qqy!FXN~JY^xQ!}d=&aSZovI2j)A z4WCPAH!61)xPNwn`b)#fdV$t7?FMq!jXQZ`%;9fvPBxjpKLF?CX*Jo)f6AUn^i=W5EWI-AT4(xYk8Z4_%k15PASxVr-8YK-%a-JWR(ajB9 zSz{F=Fw=~WUx)lFZKeM;Nv-Bk++v5#tWkiAB5<;jxw-M1*>o!5Yyuq#VL{*)Y|-{E zXp6Mp#DEAV@y~T!G>w^N^m55!l|rqL!#EAJnWl0%dx?=b8Kns)3Nc8pIqf+SJ3VOg zmo91doKFW+$ifuE{Zz|~g!FaHmxnrwv50L`;+js@qUhnASc?tCc5A{W+U+u0jw*6f zUIgTxk6zny9eEx>FVyeS!RbVu*g;r9*%-29_#oeV1v_+X824pO)tnua-7Y7iIaT8Iz*TbHP29I3?oFY3`H%CW6X&b>=DkReTB_5* zSMky`-OLD5pfUt#xMi(tH0&dKfb(b+bfT279P|0r_@|IlOV=ux z-XtO9-i#054QB^!7oCwK;{uVKx5QAdpuEDq1}s`6nd#^IH&~>AS13r>#iW@$C3ns< z$b7<&jetmDik>6}YD@jE@z{9^;aA7z@Q64?%6WQgFd6oTAGBbbXt=2XQZ7`vzNm_d zKG^%Ov(bci5;DG4l%@PvN%87q1@OpOlcJ2n1HqD7&yu;f%HDje`9j2RH&P%nsi>>^1I4yjfsJdm%+8sF)BdTXOk8jK_hog6MISaL4GDlfYH_Kgv*uQa6@S&jWF z5_<{h@{GAEk(kAE`R_brHgr)2fis3EgJ*^hq8=C$~ie#2d5^my#4T>w=DdQsTBk4iKY>URpR(oyb^8##zhef-C>VGD*(L02p zQ;eel%3ko+BF=@sf;?vQ)sQnxJdYEmvIPBu!5&IqTNU`(Lm~_hIS|k$<>RrY*fi{V zM02gn;_H@lUI`@ZQp<__XxqbC{6r^G8S=_FHW8%pNX-&xogMIvx z-FrD$)moXmrL?Lqun4W{v}-yh)BAN6P;h`#d+dCbu);`-%!>ulqKp$o#7Y)=vd?P9 zEMNKLjrl_G9{oEr7Cg0ej+?}!cguc4sy=FSfe-)1* zkbj8q+vpvS9;c~{Y~|+&2Sen?UT72n^5-0A_QDFgu=~Ad()h20OV=QY*eLK1BkY~E z!j7xA3}cWRp`=&C^hOFK0O63YInk)@5&@>Bf=Zz!Gq+e-0%hYDtd>qx`1$h7>Ica_ z#3_$qI0__phM}x80!>p)x=X0vPz@BD!^1HuOfUy}P;Gwk#g~{Pc6L+YE2*n1=XWbq zQ9pe%y!0qYN4B7T6oKS>5zeZKw zR3F#5v<=u{R;k(B{wXTaj1LZc05hbVF1D6w8e}Ky6u+&_d(M}RD4)l_+#q{rJo?u{ z08EVd!X*%eD;vh8HL0f?L8~LRiZ`kI}6M;TCGa6{r5{2exNEf7en6euaVK0_6`^nkm z5X1_{5`5byjT!pW1=rHQFKn`@HJBWst0o`@jeV_i&$EnudZp6=%5G{^895G zVZ*I|GR8BBV;v;}F&d2-1 z$fG9Q*=aVRAO7oP=^uMWvZhVk5^L}kdp~X!L*tQWnE(?Lb z7~irLhnYWYrAv3Uk;1q5NiL9nuRqCu&rYK8g(gadif$Lj8Ed-urZK^%-klt~#$ zy9Q+hRNHVVPq@**5iyw(b#o9g{LZ~%xPIFOXW{)|%2Gk^M&q;T;m6=O&`TJ?w@u8` zmhVuKlI*@kN+xWJCvx?g>EJc94phf!n^H9r7&q>Ap= zl0Pv;K>Q@d((koHmf>L;lh&R8CS<3!{Lu!7j>xa0M!8l^rzM+jY5@XOT&6!=uVy64 z$BuG(sKhYeAwRS;2K8yOpk$vTL}09Z-HbC2D$~TfAgYW_&6q)GmU3(A(UQ=@WK_!~ za3W&EAf||SZ2|N@KHwA>l-44dfPxnvOz_1PCaV5apz9SE%ZEJX&vGP1J8*O3HIflh zJHLveOch$dC_t3y8z9qrD^m3$*TCG=)fSU-$WBYHNO58;>AM^~4o&S*``@U~F+?~Y z&3wX-k^x_&pURPJz&vobGw_FufP^${Y}za1YddKzj>B@!82$Ez>t=;J+jSl*ib(Jg z+-j1dA%f9%S0HVUcL&qAPliVi7z_zJ>}LCGm^iU zG0-T)tHFLBCu_%hx$N1FpXQvxrvU}skk}iad^EvQRad6)bdM36cG{(nkZtGWf5X7E z$U=4@1ay+}%AQ?K$l`WE^ecOEx!??NO(GgTAE_#H%(&%8UwtPn1;1x29fIM(Mu=*m z>I94H6c~_WoPTTJ-o*P7Bds(9%Bta%0Aag5t(y98sqRS?8!CMnEziYD4QzHFqpru;tIdQBX_%Ytot{aMaApESqen$-W~BGeqEK2acKv z<^c|;9KU>Cxst#Um(>5>F{O-W-HFXE88&d9|0e70MBL2b2{i=y%6qMx7-F_4eJ6G6 z`MtF^5lbnc$ih!(vlI4hLI!LA1k)sYa^ZX322oKy4?lJ-8MGLZ%)il5^(mn_?fk|y z0s|-QsG<%*Euoh04NkGqhyx%frLRBRsWb$v;Ge|_fK3aWE3Lct-VFEN#(6}6%6yfv z&+;@@PR_7f+%j?1p*tCey}pjQrh?z;rv+P3&6j%F0efxjTZ~eHo~(|c*xcpTjJ-zO zEHXIv0}3kq0-?lEpQC=mFzldQDg1(03g>~f)g@G{R3Ac#Pg%EII7+eM9_-*!%2UL2 zI}F)$lsi97gu0>TzJ(_BdZ*&#>=iOr*K#E*qZ+O!i6}Ebxat-VK2<veOQ*`Ha>-<|qKf3I9b-3L-is+;Nw^WPTL=a4C4g3Tue)Mb=&R6Guo&hdgzm7? z%uB_(8-9hrxyg+?GXV)-3Q#GQd;_Uoz=+G+fW!PK60xf6ZWX$_Y?DZwZ^^c88p6kGD46XtsA&nO_@Du9sZb zyhn^(6npytNARUirP5+p!d`twCbs;v6U<-BMDv##;e1rb|LV@5W^}mxNA~JJ$s^*^ z8j20sI73$4!D(tojl$v_>GNS1I({3Jl@+)}x1&|NdfDYni({FO=c4h2){QOD*JN6v zD-&ZffdQFzRV=Gvmwd}MZoyGF!=-Fi93dr52JmTO!c0GzP5Ci`!(0E$(s{>kal)W8 zggbK-804C@j%jYiL|w<|c6Q((60`CG(`P5Hkw!D@cIK=#AaJ9)COf{!EgK(WZ~0(6 ziK%J`M4X(AC#Ngn(oDkT$1iSC-p^%nV1D(p*@EdMHaH@Y6475IkQ&wd z`s;ZNL#8_O20H>`rI-dzUNeiJ^b;OS^?@8OO1!C7d^&4r#@*e(3Ee_0>lcCXpFCuS=EWI_@_}5nASgCh63fous&jcHpD62_K$**`cO(0!$|&E4&1Pj&Wfk`top8YFr% z9GtkC!(i$zkDlNpzo6azx}A-xzb|1-`1-r@db0G|8?Ijg_zZg>{OybHlB*yGZ{|NL zBmG4Vr~ZBk=Vv$w!7+cDCf*mVvG?ug;vPO8VLt=cB5aNi4^dDJAt&8pFq3jb0U!UN7c^-=)~hiRVbeO|b29CuYb?7E@kJY-=y+%|e#^wb6%LBT9>0Xu$=93xzRaMBM~A^Qp= z$&rhLn+lM4!Ea8Fq2{K##Q~61i0`3()8J@rE!cjWCy*48?$L;BMG`TL^yvWQXocmq z`!xtorvfFtzJCV1Zf-mtkKdl1#M`9h)Xt6Sy1r3gCDCKIU!tL4FFEOaVhYT}3LYSy zi?4joxl{^v6Ob;hd`XGVcarkWm(j`~NartpCYYj1PW$d7!iM_6t0ljE%C(%dTv zvHyKCn3#o6roepIl%y<84sg!{?$ipeg@1FKC**D)OZgx%)YwureF|Sgh0W@^K&)?j z60T{Ew#>Us15f{IH+TNVEL*~IB=>f4{@rkh&X-V?=(hgd!dJXI1PE}A-adBALv>H{ zbAP##OXOLi;sH+0s`C=fbdS%jU+1qlpE1?B{aj}K&%^QEnNABiit`drQ3rOddUJYu zGF|)f%fZ{h%F*=8y_1vo%mw%ov|^g>@1y)1{*k0mnJTAI;AXf&Z792eAs)P7?HHP3 z#OY?9?VVOfIO~Q(8t;ZUrJ>uOdQcQaKE@M20p~qxwF)ed#YtJDFFRo(?-9QDUdSAs zx3;f(wi2BIzT8sfjY>CKiefy7&dej7kXxs-oFQ6h3wj}Et!J&5bnf+YJ_HpU267;c zDq4g3_LU@laO!2GYdqz-8ob}wD@o&rAhk~hB@t-E)f+YoMB9yhsOf#KK0h&Oj^CDS{{EXV65~g}A~SV`P5n=1NV1Hi(jjG%iug@r*s;QnuVK z8lf3gvGuRW^jwpo@yK<b)oNnTDczE!qh1Pn3 zS8ky>g89i;0X4fCB;)5^ZSf|~Z;KfeXL$#erdb%7QH|g%JJ}-GLS^8m zheG!OA#tjCp<>kjoc`vjkdr3oPK7tO<;(ApOoIzSDP@I4=O$CRs|!8A1Jqw6^DDg( ze{aMNO7&ROCle4PvFV%5hMu@)L5W&{wK~k$(b`(+7>|oc)DT-+i?3RvMn<2$kr)v| zBk4&UTc0}u%FBT$tg=qvtJ52E=!G2%PEgb-es4|b4c<|KIS>+z%pt1jL@=~GUNck9 zqMH)mV-`s2Jpd~)=XLH(k3`}A$a0zA5%8kYG)PuuFUphUT9NW7I zo{K3&y3*LOr6S)KGaUxwuCDK|huxYyVjpSAsWPU@vTAKDfYSY*3m~M^Kmbz@+t0?q zGfc;17_EIRc!;I!MsHaTm9GefMFe9ZRIitf4U864{5uV?kmFIlV*f&{2#Yo5^+gqz z?Rqv3pP;)ETPmWh6u(i3I_T2j-P*ZxZOfe+Z77nyNWx-3t2m@;oi?@`U9P00R25R( zoFXgEntCGkEKwIysJcerOl$*?8O$wqK6kl_nY~9SGrDh)?RR!ZX`MmwOmo*oAqx(MGli(Lm5}7Of%ec8VJZ;gm=VB8yhfyX!oY&bE?M z4VuJofhM(lWun?A=e0F3G@V*-Gn~;?9@g1Qa*;hIG8R|rAM*OtD`!K(5J7S5`wl1R zI@;p2onGi*joN)PgM|%Tl*gz~26J9@tPE7hBi@pcW>uZw;@k>PuI1Jfh2iY;yxYU` z-Nx)ubaTKARLlA$OU27<%6Fh^u3aoV5Z897Nr)>*-VR-EIvix==7;Hv|LWT*C!q8; z?9#gE74|u?tjPh`Ks|3HYB2p^!yU`FSe;ccfCWmOhM#b4;Q({GTW^^0X&&QI>CB%m z(ZR%EZtCNw*$q~{V=7wm+)NMWS@VbDIf;eNx|*4snP<^KhAC$)J}#?+@d4t$MAZTl zoULzE8Y^dzPDA2a#uWE7jE`gmrH$7&D&!@~vUV4Lzkh>@iBeBVigu(kNwV%l5P!nz zi>$X~RZ%NFbj5Y(jcT~^dIicN^|T+_63)6o#EXkJAAhHgnsAiQ6TKq4FChB_c`-?d zTimjiXu9WFC~kIUM{VuqW{oD;khwuB^R$z&hEh$zi1_8R|FF+zBpQY0_hP+Ma^|yh z8P~?x!_lkB0L7Y7<8pMW`zQK4d(ts)%TKZK4oOuZt#1nZfot8R;e5GbuFA-x$#D2s zv9Rg4sPxvI7=1|ulio(h=nwP4yzWpVN7sTiMwb~mGAeru)Y3iQe0;7t-7MEmUg7r5aK=zD8P-&ayRtC2o*qBSF*d zZ3K)Fw0Soe9qJ;S@`X(iT}b+7d7aOpINM>Ocre{=;H{eNr1lhvVVM*#vWYO`A+)Sm{m04y8^0al!lsZ_nAJYQVEth- z-ovsI(w+LMNRPo@vsXXWxC)K9wmIGom+U^-eei;KU2A0Tli<$<=R_4XFsIDvWc?B_ z=MAux`rk@WQV0Gbo%F67t@&?@NsG|gLcHqtmYIr6SKj0fXz-=f_F$Wr1KT^6 z@;-O3L)lkmB}G-VvaP-o99+h}bA{uZx`c*#X16O7E@FCrUHK~#=i>W0v$Wk%N_Xk< zJMn<5=kL`Q-&BvU$so>u3=@+MzskP0YOeIP#}fk0)BGL}`CE&L;cBzH81xZ&q9mGZ zeI>H^OHLY}fX67P?k^PLQ>PF7D#JO@f}(PV;9q04+AybKR3|HHgFINvS%cep(}Ok` z!VeD*OLKM0F!s1!2?xTcVDRF!o%iz-Kk*wSj(067EQaw_tG{azlHRZ-YTcAdhfV6EOQUK z=(s#iZX`L2`Mlj?zP6KPB!(X&I!rbOFL{S_xoIG)=o_jZ7^Z)~i;hRr=bP#7*>LUf z>I}iz{fKXw)req1Q}AZz-%Z!aK%G49UPchuSz=g}nV#kYT_UG0LWKhVgc)M|e!8~y zi0O-x(uN{7&9N>PSe-o@3&~ju^yyC8Lflu)O!iv62_?|y;O5zr+W%}(c%G?S9};z) z^Jqeyd%s_pjZ+XvKf*!_iyK^I*#GP=CzHYJqX8!X96{M14PGCQr>ORati9=*_FqS6 zHW}_$*KYo_KSVebIrqc;n=H?Qyk_R?Pp`!kJa_V<>Obi}*m?5VUo@%F4h?NT`QdSY z`|0l1&f{mB-)}wa?`%DI*nhJ13{oRXJ>nBr-CcGfAp%y*Tb{^_VfRwkBGw; zFprieXdbYA`a}lV zsByI6+|FOb9j;#BiW50w4#gf!_TGRyd)R5_?;?3J8OA-+XP{t|C(%Q7a6d|2^!M&k z^zxg`Bw5w`xvFcYGv=& z21N}k8xP5A4V$EuT{@l;(2~=P`hnsguVl1gXb&g2 z9S!$+@Ok(&e!rc5|AkIg{UxO`!szM^`v$k}C6Mg4*(Dm?z2DL34jXl}xr;XUe5fN5 zU{sY9VtfL9i04`^sBHH`$ikGsiMKATq!O)y*SCwpZZOZubEaqr=59~XL)Vp{89lnEL4-OE~ywG3`A*+H>BwiUED$FLwI z{+sQEmyWF|(yCNRtpnBsp>L(0Kwm8*FQ7SNip-`bK+stzB2CJ$nnNOV_wHUsQYfMz z7-4)i+=$?+Kq;loik+}4M9gZi;!ayvFh{+Z#5^+1X?l@|duNjglvQy$kF_8K#T(Ts zEqt5HPI&w<8heYuC_k1raS&=S8E$>pLumN*@Ye17-iyK=JpeBMOTN|h3>O!#W+zD{ z`Hi29OE)(P*>G&dbNQjT0KfASyaRO^qx(Mt{cJ2V8B|bTZpFPI)X>d0Rr_mE4Td=i2Y3V`-g*%xXl@{t7sN$27_k~aI_D7w7E(yisPE_ zeKo*oUgSUlrXaw@+y1`vpmZ@agiAX1xksIB-t^|#DGN2Q+fkUS1`%q+p|UaL)pDa5 zv!Z){A0?kQO!Khihl_+!N(`<>8=M<9cQ4`A7~??`E2Wpk`@&L_xbl_4u=(X^L2-CW+=h(zuluf47rG&Bi zu1d)~s`%jFXGl1q)=)0Qa2}4fl>Dun)5@KDDL8c%S|J&pSI0(WTw zRL+eao@`Vryp_lmSg$?{)nrwR8}5#U&}I|NzFLTm70Tx%ouHx~DgQ$ahooq1M@q zw&s!F2$^j)nUtyJ({7m1rbfCP-wYoLG4hQzS=F}f=EIr{2&FE&CQgN2JMn-EY;rR; zVS8&S-%ZV3gxQ&QF$HFkUcvV{_cxtMG-DNw zQjko+I3?|8>+1n?bX%YlUbV3&(drCFf<+$3_ghAh{k}4DG;t)=8=979qb~27-Cs_f zTKb%!RuLWRI6#m|Ax;QiOEc5{k{%4Er@N9m-aX%4scOjeZhz{BKio6R+yvxB9<1sXZKmmP#MGnnO&a$>4Z;fK^qjdY6_^SjSCrocaE8> zZwsjW0=X(eb-_O3$h$fCcFdV22j-k0H?RP(wdJgu{~6=elt319H(A( zaD6Qi_r^+tjC$=ho8A0&UDVLI?ph=PSX;uD>B?a1A3r?X*{y0>HFn%)czkxG$*I)< z(b!XNOX%rs)TU4w)Fg8R8-fH-j5+MN?t_D?HzIzBRJ=wBGxy_d{js*zmB0?;bN$$9 zFaD+7Yvh%JKo|LMYil_UI!u%9li@=G|JH}Fl4z^SPb9K95RHU^onhp_ zh4K4%eVMj*W7$sl=xWen0Kyk+a_5{$nq3oxTPJUhU&w2EC?O;pwa;g*PB^$d?`Rin z#074d&FX@Iy?i>J9MM|BB1>#Zmyy+gluudEj)j^Ld9qP3z#j)UWf=%vQy&1)D~(kt zOZmcs{r#Qc!Iu``uU?%Uog{0EUbi`SNI(sR+1}$=-x&D|$ET>B2WI2?4)%g0fv_sj z0sJ<^`2>x)9S)9O?GGGA<71TE69mqt!PwzJ90KS~vH5Gn_w)_sIP|VGfsPni%cljS z*%BzhrLd}Kt_gZCf9}b0BCaRWT$Kg_Er9_wcPg2=Upif$t5uO1PEV_TXAEfv&=GDC zd$@S8>p}ye9Z7gZ&V9R{+_z6jJ;Ut5P3)BSgkw^)p-h0QnL#{bd?MU zt;@xJp3LNN?ag`*ccR)5Vb}Z=R$i`v7F+CA&832lkjNG`%UQ!G9xLtv$^c6fKb!D_ zaqn)|#fd8&>w3DY$(@a5q^81$!e&|nuTX?Pbe5Ii*WRKd656bA1Y(Z^b)ansg@#E^ zST*pW9IQzC^WhP7K z?3#SO9{Mfty7i#S0&9OO#W2tM@a4;6Tm&}V!>-KFKSP@iNA!OY$cAG%Jwr`qZe72g zAOgMLi+cHFv^N<~#|NitYtKKT^dsuIJr;A}7bxsF}OJjz)%FVC(o&&kSyJ7qg#<{9kVp1A-(Z3~tf7LMKO;Ak|#+^%J6+xLRa=MjNQ^&Gzr;NM7{Xit1GerWg7 z`rUd73#<5Lqr6EfOCK91R%iwhU+vrD!(wrnT}$K8FhK$dc)Hxoe*`J`v% zSgnj9L!R)QalUu>0cF@>jSvIFf(Tz($V!cQ7uDxl+V!Qp_A}86!=^Rr5{Xds#L6Wl z&{blBiz_GZ_#T*IbC{L6dz3T#S=_MKaa~E#{-`Ck1S!=hf zmZLFV%9q!;pIU~kfs3R4o_L3|u)hb)n`&G=#_k?z4tibfj9$OVo=~OON)#+K<3njF zPwUdll_qpieUX5Ra$`d!xveizp8VshA#Qm`^q1~#8HkOF>#{AG9IB4DBT@173CT?F zmj+@aIt|9zFC>PfH@Z|5cP@dqFJoUE!KfoZ>|Q2#i;nBS@*pn9_|j;{fTk?w;do6f zf+F=NXKWYM)*(qZVrLA=K#Wva5FASbH(?TY1{))HA^oo_wV0$uIAzAZcU`2pq~av6 zI_*}*o?yg!3MTp(BFN@+S|#fq7`K=fM6@ZLCDBYl+9VXGw#0BX&DT|H=M;UUN_sIR zxBzWeC8dRsC(dU*B+K2;i32p=1E6{l~;qmh{NaLSm$K&nr z1HbLqWfqAExeOma=Op`FT%GElil-!l)NT9oXs=7Uypw(woi<&sxk`_>fs(-~x7cwl zy6i%j2)DBt(7x@S|FVc%n{l(Kkj9(Kv89WoOaRJf&(6{;1_6qjidsVLGhJx2fVs?c zszZq&d<>I+ilJBKiBm#wzJD&udm(WPtd}C-MP&QDD9?y+SYjo2yK}aU?<%o^*9`VQ zhaa*C=R5Gt2XGpA%Ic0KuQX~|T?NBjiP4?YP(x*ZKbBfmuy+|#9maW-u|c~*>o}j? zF4|f<5_O}x>sI%CD0y>p$u2KBX#j13itFQ7Kdj2<;6Q8vj#2JO60=;+j?-8hJuQqJ zn;smjt}a!$H2(fvFR;12fTAGO_t{-&dwYWgN%AnmY%bldaY+g~Tosq*;*jG`E9QC7 z!3Uq_LNzE9bWNi@^47{jl%>A~1{WUREr6m+ zq_)oaV*2BHb!)ZyUzrYLYxA$Ge_etUIFaIO(G3pITw&+h%EI{X35ra~#305p<5~Jyv43=7 z{G*AusO=G=I66{Xjo)%L#X|3|=YRbr#j@Ch6h+oWilXsqLbzFi&}5lFpq;xM1enB2 zLZFGP*4L~1)qmFv?%mqwH7xLyAhCeQl{wOGlu;rk?D0*ft++8 zAMHsV2MIj@fH)rfmktO2rK7=r8_MrrqPM|D4ej=g=yI@8roQL$=)V2*cl-Ai-5<8S z70|d9@VG@!M}7*O-ueo@OQfvLjg8vQdSQd({`CFeL^NKe6q&6$m{&Om{m~=!=EXt3 zeV59bCcM>E{aL;D`fvKH>TvTn{%WHnTLlDKdaEP6y3SSt-?AkM|TPxW`9rs^-M9wlsGWOA(X+t++2}4v_ zSZK~dEnq4ArkG{d@SU|lx9#>NlGA2E#Jirp8Qkhm#;1pIwtR&vm2_$pOY(j^>6{*M zYYkdax_nt=Ef26N=-s)Eh@m`go5cbi{k=EIfPHW%;5<;YcK__+O78>I`2Rm!MqecLXz+ippgTt^sRnOA^~YHxJH-qvy-|I& z!Lv%Z{BGJmn!fJ8V#(~N4q_o$Iv07oVUTd-Pfq)|F~k&Ev|b`V)ER+jb2ujU;pAwD zDGGz*%>Z>|+d_r`9~~&w_b=gaep8)esDJg~{_Vg0{qKKA(X)Qvn`1k!s zx4!*$^Wi4{-h6QH_U5gJQofd!fS)3<_g6Qnp9mPkB2Kbq2;>xjijMC`jA%XZ3Qk?d zH;~y{^|XC;iqp)f*IJ!^@kL7YJC98X>Zg~dq^52$)khTGzKlFYNZ=H;5$_@}EZ${8 z$Uzc-Z4P4#Kmfj_K=Ab#i z3^wV`&loNG=l%5OEofbMeCu8d5>YW8K&A~1hs&8zk4?WVHoaA9x>;;`yVUeyvFV*s z)2(9DyJ#9UH8Phx1#fT9=B*8jG=+S1qk6!I7M{?Ue|w|C*nG$*Tll{y#1|OYo}(nhlvG;#gS zX%<>RGfF?tGF&rd%vr3BV6U#f3xb8vZi6wC;0_`Carax&9D}tb+k}z$0M`!J=VdIA z@e8Ec`~}gYFF2B$zrcomQK1Ax^B0&=j{0A8;5AYVoabGSlon_0qKi^%*$g0jdZ)!W z-E^O%>lMB7mrhdjml~{U^G-|D-ADZmiLU5sV`{au?k)+ld^u*4$c_ZPAT4=+17)st z@tCZjP*6%Rs=pe7MQt<4HbHxJL%tqW1vh>OM`SqF$di6wogJX6hmX`m?a3j8z)iwT zU!9kkxUP!#srCNwYirTX2P@^qID5MY+U#p`~R0`3i zpbJruE`-}4lZy3H?{Y!I1u?jH zmj~tQK_%lG)^1Jo++waJFI8o{(0p&g9PJL$)rOD=dHOoD%0X-p%@ty zVca|85btyCUl(A@WZz0in<;3J!?5GMzuo=n_MKG;HEuoHeE8to`x1iu`~7bpJluS= z#jxY8)jPMpy8E|#5`w(*@b=cNM{$-H_gc-;2qxA?53Nr82*w}A9@d|Ou5GY4kOQ#R zp*1QEtu&PoC-h3&k{-H{NU5)OJLx7;nfW(*@+8{RF!7I=P}2bI2K*cfb^*gLdtI-G z$GpU7s3`$X0eJYWv^UeLJOVBr&J=i%1T|&j3^RT)@A{f91(7d2&lsXMl<}s~?8LO47)q$(0ch=hrY}Vh>t(nQ~mfVm;57?L_(Q zrqbY~;xS>^2}62is2C-CL?V=Un7qctM5x7vDj{R7w*Wj0R+8hs2s#8Nn-L(yVT=rMjBZdEk`Z^K%4|Sne6t z2-EONL5Xl=i9>fDmGLf1C1JDrVJq(&Nh4oJb#Ci7r6MESPEtgC_wFs+I@gJ9QAJ8t zw-LTpk1rc2tqLL*Ko&*7D2(TxngonuN3@N<7)0>iq-@*egK>B$cL*YwAkff)h#}ly(LV%(#5l6t71|rT-3U zdF@)m=h%Q&Nv*GBGh5zYXUUWeLV0xyaA-D?mMj1Uz5{nA2xxR!K$4~=kZxZRB}v~9 zNOvy@iMI_ab@wj=$wHU{>FiQ`BBaQuvr93GpdzQvF2yN=imW=j6sryn#{*^g!KF~z zAD^NAn{fQ#QV7v}MUL-XisKyrg3;?+_b#JOZ?FbJq**}epO=AFu5supdP+Zg5V79l z)AO||m(cUP=ELUCV0s>3`xZuMI5?gkd4m8{%<4S8wvE3p0w9P~AS@z|ghLoS0^-gB znvp<+K_ejUEuioQ!Wovw*IrzR7v7>Mj0x z7m=i^fxbIB8a_W6w38MZTupZm5k)1$R!)Wn3wM`YWhgq}p8#CL@EAN2T;RK6+C6LtgUkNCk0p(??2^;Vjs4^zz8r9h} z&<$8bJ{RCQjDD@V3)rM$C&9GO!>CKr6U_QzUDZr>+NQ`h1%fz_cM2SYMkY zoviAkQXz2Ps=%39a*ISN#1=AZn`Egs-6fls)^57?c**rFDbGdAWUqyeB(C>*T|u!f z@nS?#fY?^ViLCi`S@zAOZjV`20=SIy(jK2tt|?`lXs|oQUAh>Z?2_OnyCuGDqeID1wbVsc%-`qjD^XcGe~Jf znCp*+xy3U7c!-nb5)S<1q5j9kJjPA`kW80Y;2#fjGF_r`e>~LxxR`4s{*T9T3;h4_ z5Dz=Ve>}`(SL1hqwjdGQ#A-cyxDVB1l(+!H1iW?A9MS%Z?LK|h{n0(>o!Ijiss|7~+ zV^R-(bGMN{*!!=u(Pa31=cmUg-L~~%?-09C?}okWM}5L_>frLYV^=&`IT><5Wd+U` z=<&G%nAx4&oycpQ=cCRn&uaBK7S`KOcXs=7t0t~Ry%4ck?{gD8FB0?6FYG=$o{xG* z@eb5*FujOuwX?a2ZSAv*y2hoi2a^$OZ#8>(QoUr>!sODedL{|eFf|#3;PhDy&~);i zEUr}ZL(YHL@bxx<&5$XNyQ^!40b%LG(cb7(2}sS{SifE!rP1PUSU&2jK{;wWaA6Hr zR1J!B2;1ttrtbv{CHRvY|Ej;6kc@3|BNFflirK)ZAzW_;?QMOj#ACHAGUVrAb))qh z94FZeaXpTQ2B`!k)V1Kzc-$?D#w*>Lo=c=1+sg^2IcwGifiR-kN+r^KUSI{;$xjO; zd!s&;UIl2!jJD`Gi$aQu;dsxOzfpFY}t zy1l!#{3U*p}Re4vZNFc=#r@6Qp7d5BV+41S<5W<|N$K&yPXaI_+YFEy?BEK&nB8SJ( z=lvp0wT+$AMhofT8B-5l&e!Hj$7W5% z<5Qbf4+e)*=jrknew>o%1MThe3u&oeFveJ8hBDq7BF<*#Rv^iYtma2ZHf=aX%J5*nf56M>HR&kh#X#4_Zrl+- zZW=-rEQiH^RaRN{(;q z2;l3f0u!LV9=v$zUlMfUNU)F)hxKqmZubuk2d~dH7fZUZ;U5~lfn0_Y`6Y=kg5%56 zgmZlE50;aK@dv95=QO(hldCI`WpXW7C#RE~zOWLM$VETL7}g_yP$QvkhU$Yo^sVI) zP*^wb+MF_^?gOf*-;n2Ic-wjWH(DHEn zm6?4g3TM8lXOoyNP43+2<)ljWswhut^XH1&9E88Z)B%qR$T&mpC{;jVOhGM@ za)zHwXTGsQmCXh)KHySlu2!MhN=6gfIs2Bs@=`nEJrWKJn*+3|Le0lZ7!KNExoR0D z!Dxx$U)H21ckha+T+I>+ul-L{tMe!delz@z&khfx5$1Ep<6N8C2eNgPSci#z@8n~D z+RGWGm4`6^!$`tF(s%6+()I>U2|5`o2E55lC@ro}$+-?&EOX(FYCbmS6Mtf8W~(%R zI&mZWQR!v$ykY9)y{JsmB1$ZEMHw|b949m-Xhr85Xtx>Ne6C5zS#v|HZLF;5P!SCE z-PyXlf5uR)Gx{~Y#|gBgw>I0f(B7`Mwll0Av#%RnY>zXTwqt&<>swRc(fL~A`Rg`5nw<%vV zE{CAfblBrAXR+QG*>E07RHoz(R(;SojkbQ0=PTXV%-Fp=nyoPKtI?GX(XD^{@Ch1iE^As|2)P9SoG_eZ(UzLF zZ}c#&xIz@vnTM}1annHy{GfX)>W#QHgJWh4>NVsyZ*-4~tI$;%q7-h< z@g(l^X!q5i-`o(7EdU7*%?XD~!dJs5`H6gz`HFnd)+Y)zJidlg=~>xxzL4NKuIOYO z7YT9q_vO!al@UD_+$%X}05n_j;5A(DWi~CR&E}0>$aVZe`bceNV2HV$J8xoYYrvur`5_q_{sA6{CB&c%7zLZvZmK{^-j9vg7T*!48(=&UN1v9D0W{^SI! zhF7q_xO#BP>lUW{_oLG{(LzdQkNwIYLbTLuuz0j{&N-%Dvs|7P-;=`j$hTwFaGwmn z0n#Pju=ctLqRR>_ieZ30AC8KG`O1i}%igU`ZJ!9i0KFZ-DDh7$*wjy#SX0YiPpGNS zZjq+8zmh;xhb3|T1wW4t;>d`9$iOxCXCdwXJWOFlrHKnwbD`%0eFdJ1E=Lkhxs$b<~mDHmlfaiJ;U3&cX1t?LdlRfx^H%i+H#41c76QH%pkba$XT+0xm){$mW%o zGv<>=%bnc8+l~EI<1B$Mgmb4T4X`6O!`KFzQx~WqHfckQysk32m};u&q^q5Tb7swe zwvV~x1ITui!c8h+J>G^Wt9&KR&c~1;8-ngNY_rwBs2!7POft?0*iUw3?n0#0l%<`f zWv`bl({2knCTL3!E$7wZV;aA6BiR-Sf4?`y1Qg=b zCM8zGnwjXDlIC$Ex7H$t(yZImQLj;yZFI_@H!j#NQvq5i0XG-Oykuq$JKs;lEvlo# zW>TKv9exdCG<>%~Fk_!1wDhs#8qfj|89y{}^(cG**9%&tFWWumGq<|h(??_*Aq7&C z4msZ-`tTO*%4Q8>n%?3!(>`$*b>a#Da22A>*CFc49X=He-*kN%pIAW8{mSPqGl}zdG+DDQ-NFZYOC>?Ox%;d4E*DHqV~+c5~~R=1F8=s=e>o+!8e< z@xyVj2FLB)77*Og(MjgU1?&IM-urjAbsKr(`*&Z(O?v93R9mr=G}~1a?NMYo(Nq6g zOHSHvP7V((Q8u4Yq)JkD{AknH{{4Jr2EgE6T=G(q)9!BB#v<jnExc<)x_)(xBB3a*J4|x2(e~ODKne%>x6Yg^QzZ)sh`=$f8)bXY$ zBitxo2`CZd-^RpMAOB|m1>I(Ud0HQCK}fIPL`-5}Mx3QR2t>fyx5bYeP#7|ITpY-mUxEP8`D4g&+A1t=F z^*YV5qjSPDvvHLUTf-CDx!Tv+>?B_HOi~3)&SK#+Hc8wkr~?_5%3LQDh-j_IR;Ge+ znAxy3`MOd-e*6B)E@{l|KWR@r9=r5R<5Y@)mK%79x!8c(-K7CrCh6vtc{Mye9iH}S z^am>{%q`0N+*6r2Z5K3I5l7$UZAs_aa++lO#oj~#zKL(mb zCH6nbAK%ul=B^D~XOz$u!*xjIksI2OEFksK?#14w?e=DVomSWx=9v2xdh=^E6YXRr zb_gK`(}R8JRzfDvayvC`|0&NZ#Jt#9goue` z7rl*K-(eB6Qh6A>wN$RinCe7>&)Is6sB)KQ3pT7ya1*8&>W|KFgM&QC%v??aNXrE2 zb`yM@o(*)@Gco4^LJRnP8Mf4`JuD+UBn<={qFuBf4=v- z`=7r_|9<-B&CkEP&wueE{b>9C%g6bp*}{dbhsf58W47tXr~b!h{>SG(-2XBE{ouzo zke~nXX|3#MwcnrDe*dBN`-|G|fAcrX)|sn>3Nms%K{x9?EJ18YU|kX}0a!!!Tbzz+ zm?elRR26R+utAZm7l?qprX_~~r`DPzih2TDfAlqu>m5(OADs^Ou@dNg@rV2OA0S7@ z{`3CJ<41p#6dB+aKo>oj0B^yvEWsvtt9tO~GFgFJICIb{7CdniM_*~+`t_LcfkQTT zTAQEFmKp-uS-sj(O&Zddmv?`i&YLYB16>)J>+mw6vrE@Hn?A@j|H?9 zPbZHq2D8C=ZK`euMm1#sC9W|gTjZNg^#=3zlM_9(v$FP|92>q%UR%T9d~hKb&p0Jq zz+gEH#pX630mgDfT!ty@z*}51F`aejL$j*leFFemHI2Zfn_aqnm4rqV(^w>6j0_Il zBrwK&_cfrQYduWf$o;fz&kZzdvrZ4p3<59F)&j>3T43STZ>)UAIdpmvxEC3JC(*i)X46 ztyz9zMZs$4XxPJ@L!uHEUc?F6iQC%&U8BqS+YH5U`Bk^N=6a+kU`1z)umRe*m2C~- zFc77kS$hTZvUVMrN^xwwb{SaqRzxT45od4mtLv5!AtPDEyOH4iz5q0iyoN|11WUPhL1WnF-@w6GXQO zxS(8$4nmSKnEVpu@a5A#J$?55)BeK)BrH65$f#u&LE!RufaEQG!PYar5+4Kq>A$@~ zxl4S5ll)jNxBP8%bNDLKt>x7u#Ij>;h`q&R3UX0drEKg*`DD@wO<{f3)OXnVwx!L= zJ%MzDvvo2E;Y~I|+h%1aV9Qh=yjon34w(yPj(ufmR=h)cB(uBanL&!vq3PSG!jHGN zQ+v|H?rvz7&aKX^HrOw!B15A87P=yPBGaI`0oz!cO>Eg9w{$?v5(t#z9JhlSws^P_ zptOMyBUD$dbVmh8g`mDqyYH=J5Ldfh5H@mkF$ z)1L2UgNqBq1CULwe&PaOfCU{^uvu?CTx2*A=MEUCWzvXKPOsaB*78l{2E2bGQzsi} z=M(3YW0aU@JzyPXwGelhkftDYtoj&*%2gRn1hcf!ao$qD_qIkIiOW4}FAnI1L3^gvZjm-(p5HQUs{i`0HtN_V z*URp?=J8pqL`M@`iPL{_wBN@z+s1ExdodflJ|9%?2D1rvJ9`(G^Eb_>r=vONm+j9# z|HB_QDg^G)c7}_c##QwOuFQEQ{+SAy3tu6PR&V;#;5||UoD3ii)w^MJI)yohbocnh zQG99z=hgH~3`VVvh7ksavw>~;sogu~R$0MOhT$3Pqr26&$oY5yYjD^<$MlUz2WIh? zW|G_&VD!F)5bGH>9Le3TzSV6!3?>llbm!ZUHFjl^E8BF%`W{Qp6GXmN|9Lr_y*~`j zvYwAL7@ewDXLHl`Ns}>Lfq{c@)IbS&>Lc#WVF4(AU&% zcF8<0RXE&xJsJ<6$yqyjpT;xW%rW2-oa>6An`wa`SP@otU&cPL4nKRRr!R(Qeubyc zqjB9h1et-Tb^h=PVr1V8#+^_$>;0VR&(5{pa3-rzoOzVqIF&@K-2OIyrY<+mtMRpg zAI@e_-jgXTTyv2oA~=9C<}JxeAWd8oEfoW6?)SexPf74xM(X8F*}Y6|{k60$nFGWx zgkGKxkl6^)yv(?qx82~BE1U%ukX%iX(mTuGtx56}MmZNU-|m*B%JtN-AvWEhe)9lH zBPF))mZbLB@$5=KCF!tQ7xM-EN4fhON-XJ{L>9-+0N-}>G>4*?y;)I zXJb~RC509CJO@?=$fw6qDD!Ue9X|kmZx<%^bc~kV6oyWPGt04`HEpZ_8hq#xz1*A( zB{5#ZSN^T>sFk0qTskk(qJ-qxL;E^Lnoh^b^sTJfH{dJB{f@YQDUKbU(}k^ZsV*!2 zs*RYpquJteFs@!8BJ=I^r(ur`h2RZ#7+kZ-a*1MsNyJr-tg2Qa-oQ~O1z_2DLwt7t zk2nDrEUdcNUJWprQoM=f)kY*0-ldaUu9;*Uz>*Rl|J$7xPBBr2n#0JhjcpObSX%wVSN6*>`XUm%0>Z+8|QBB?Ky0nFqLy_oej7<)lOuK(VR+t_Q%P4l;iW*Ew3ZWO|)q+=Vt6sg& zXR>%R#e)9&c=mdmcJO>_vuEHoZXfGl<38Jkov00V#($bwoQCaP>-#buux}fyyA|28 zTwa%Q#k{=lhJ&BD!ru9H`bpzmmfO6cacZf}A%p1nyshJz9G1E+0K@KmZ=-HWnvo<6 z{8&A=bfQ^;a|{JT)|-O3uViz>_V&$kZJOw?2j4dUH-%lpG4 zx5?XJD{d~W8@=3tee3MqTuXTm;p(+EJCZ!!9X+WBvrEhg~&-@bPH~EH3VUq2gCMRg);4K{hQ9oJ1<1?xpv|vY6(Hd;?A9N zb=rCqJoif(x4m637V?WVp7REa8e)1r^UujF(g%MrI+CVR%{%+t?ErCr$nck-Gc9g# z?^Xt{=Gq}#ezvPW_x=o_|4Z*L`E1w>n|u2532qABKT0-4z0Icx&z+4<;JB7XKMl)W zi56LcfF5uASz- zF?DYak|P|vDhe@<`z)~MNi_LU!TWZ|e1uM#S-rb3OKF89;DbCX*jAa6vOW11Ql*7^ zRwp7zqi;Pi7i{XX7o=dhlq*I_(ha9yN!*Qg+UQN>o)icjR9?-yO$+$LE?Db{PdP5YJN_1tnFk10oCw>FmmJ!UnpJ6Dh6Z1gcHH{3U!b?)w3m zMow+1lBNR&Ghsk?8AYLgNjnKXnMSAZm<~j)clTLkU8w60AbVs|} z!!&@&Or2!7?!xmuMks@uv$&GEBhdwIL7*ZsOknW%V>73=(kA$py!}{*&J7!)9JaQ@ zm$%al$==!wU!oaNBfdK}(S~CW<#1W0R80kCL3au!o&edA@ozezH5@hOlw97rkniS= zb7Wqx`$E|3B49*l(qff4;JI`S>8_g&t&$N6ZhZ$4na)1F9bpVm%|8FEYxAFdkmf({ z+WhAqr1{T&{&Y10PXnV!>CM-tvuh*LR9)PQr(#X&xe;uCYW};6qcpq>O_3M}4{N}eB`fEp3pY9!hcX$-MQlY52j_uu2 zL)^yyWUzQUs^5NWj(FKvND+*TPlG=~)6m8}p^!aG)^^w(7~v2sU`wX4u-z3!C8<=( z^d%=3b;g_DlTZ1{%khag*j}k=&)?w_n{U3tdXhOINAA}8Pz$dl_2KB#Vl~MlIQqQ! zPLlGC{@8rSm`}EMS!j>%q`}KVgE3h2vd|)5N|Tp`CPj9tS)rO`+?y3D>7nB${<^DN z+pQYvj+D6A)zze_XphQ4#|lhszl&a1gpwKq(g20H$q~V+I9PdG1Jm7cx`-Z{NBcC zcpJ{9&Ehx+0SO)PSb?cDO=OG{5TiLLH8|y|iAF0FQ!l6AX*i!82(bL>cdI*W5=mA- zXJiB5kByD$BML2DJUw}`W#p^wRQG>AII#E0Jr%lFmdjB(ILMeiTz!U2z$%;4>@ovy|V2cDvlxM%%Pec&lXK*(=b2Nc^Dj zAh;2-Ox2q14sgO>Pa%WkXf*tJcycN6u8q+U0Pyc}N)g#>km?bJj0~LS!0>IC2Z=91 zHN;#VkUUQEy=2|ghSK&nY?NTH#d8AAe$R^ z-pZM}-W{16J3upF@mxpy$RG~+lyHLCu-0g)R{191%ErV!kScp|3xsn4j5Bfa(nJ$v* zA;M7dw}6=bSjpIo8yKJ8#hwJ z_Moj{dyR&JW%8td_~$=<5zihXT#Ob-4-WmGhA{p={$w;c8DE|bxBF_%SEXvOL}DTwC!#M4l{0yQ59bgdl0QQ2(BebWP`jEIiE_ zLM{-XATJ~%9Ihj@QR+wqZ62q`tjU(WS_%L^dD-ljv88myRaVYlaFxC23ZR$Ox^u^E z0+&LH^3qXyzp8_&>^9si84UZJ7{FgN92i(gA-KVCvFI`x!7hL^**Gemr@^3xnIM5-Fb$l6bhuX;fih&d%DHEbs#aY5d5oqaao?&kY` zCOT3zapeQ)?qbs`ba=T=@#zwkTrBT(d$GW}0DDC!D|LRkmec*^0zhAHME~a;u(-s6 z;kt7`k-FEJ3j!Z%(OqGf|7w#$xkJD5PW=B@AZcV4L0pk;{ ztU-2jU{2YPGiRr9B&@V`bI9@9f?$m4YqcKKUW(Kq z`0Xfw;WE?gHO`u;#j(sF4bl3+)skT(c}nS}4~jCv&quxW(=PWD+5{a6Cz8r$#HJQl z&5rQ1u4T-HQfwsRMMybrd}2#$ny0ajS-D?kRg;s?8K7cj3y(A6bd?@idP((w?%lXt zQbyOL##a!or}8QU3FkVNVJ*0tVd85Lf=F{^P2ZrAYwuRfa=Kx7SF%kzZX?TDiuO3! z$d6m|NCITs^o02z0a=lQ!MXwc(FhMU}SQ!!g`j!qIO;6I!`oZOl!WIjcZIeOYu+F z<>>GzxlJN53F$-3JH@X5s`F0~11Iv41Zk9z7&o1VYRZ4b3{*t&f5A-TsPxY{NL}v@ z_u3kB5Cyj}wU*X1*PDEh;yJERUdXlvHpAkRBVDH03(X*xSysKHYCgT3oeWzwQ5u5I z^h}4`E&u+VT_h9`K(Ip9iZ%q`lXQT1BKk4x<5~gpH>UOQBP(u>7u`WMuz+O&x*$J|y zj;F}37?KyQvfPZvUD7~i@MEOFss_aMp(KhactGe|&i%+8k9)he&Jmd^ZQ5*a$0Zpv z2P~K@CP}u0;MuhjPAAsL%%4WI*qKpc*hyjMMNI6E|=aNAYttN3MoQ}HWyEJBpq*w=y=@ht+5BTB~2hT5GS z;VT)6U~{Qh1y4pKauqLT)Azl2{k(LwN#LmGT&81$tAI8!vv-7VM8YlE(QoYuv`jPkw`Mqs@dQj z6oDI)NSq>^2wX3$3!aeZ4M?7HO#H2 zyeGn6Wa@$-*sO(wSv41Qmoj&)CjOTZ8G_Ue*YR|4+Mi)+ADs{T460+$b?@=V7!nND z-Z~wRKSnT8ozr+`>ArCOqD>r}K4F6)KiJ9i6xP}Oc$qAU<%q%A!ZM7G_4Ai?ez$l3 z=Re}EXZ#Oo*pb&8L6*`uF>v;@$cgT_qqBjoGH^N~res!UA^YQ3hZXrOve%vLXEWs7fj4aVdFctM@O`EWGK+syo z%oiGlD5-v{PvJYU4%d{sz1~NWOB)FAcpwfcqsYBoGt|^TiNe9A`BC?c6;5o?m!;nF zjo4o&(~I|51I4EA?M6$?J=4~qCsV&-!2&g$Km`=?nrfzJl&R$_55y@zSLysp(rwH4 zUIBPrl}m?2X6Bi4dVph0w-x}aHB>_x0@kxhkZIRI1>C4vi|GFZM%$fqei)Czx-A<+J$k#UoDnD3$q+1NKDHHP;W9p&P6Y^V=*6)AsYqXcUcdsU=<)WqW)aVCEZ2W9W+Et@CyIr<{x=fI) zO#?k>$Qw_R1ekX-{c@ZMi-MTh8Y|ts*=t=85Qa>i!F1Myy7i@ZBt=e?ni}`Ls}29W z9$URWA$>D`%E<-6QGm^n)xKiR?WU2}ri(7-;v-apZzn#$k^ zQbpL!UQx&8Bw<;8l9=f4`jhnDh}iTjdLt|8)+i4&*G-0^-M^j-)iuDJmn44j zbkVLqlYB7YO8zft6VB8B+$xH{Xw`n?%-!v5D5zPc{@3fSvap2{jkN8NK-FL#m4 zB94yuMu9{dBC$cF{`_(={F%OTSkf)8bQPs9fwrXFT{mR#VYcQ+e=eqSCtlz7mIdvr zh&+XP%yZ#UQB;Qw7oJ@XL%Nxl>#*9#B(WIcTrK?}*PebCqQUGZXW z&`+6!h8?!mk$~JP+&M0EibI$+_-V46gq4OOVU5Krdsphlx?;eVS2Gu@weN5VVZ{rC zM`xpx>Xb59;q=lFw`9H<24d)eJYm%UaCl(DX)Y;@9t z@*sDgp#86h)%XS*Spd8ZecmOPXBWW!0Ip697fZ5vT7|Re7-vUcD=JLA zKxk)|sRNEvAh!r`4EJp3A@5i_MPjcmf)gOz+eKg= z2cwuIX%7L?MQ-gCHqP^33Hvn|_WN*b^7!3}m$N3RTZXP==n7m{aXi2VuVwvc|@nBn<3u@7s=E?GPbU4NJ{#X;b}_r`tVMLO`h}B`?J za#g`rV65+W9Mp%>gh#BGj3LELHAKh*qt{6`9F(-E6xl5i2ZRE|HV7aG#V03khS-OC zqwqrAe6+-C)DGpkxI0?5&fJ=9XT+eLz-v5LZkZ96n@WPk-mhS}*#=Er>xGMYHmRsE`fx) zI`!Ev94qEd2?IRRaP*}^IV)H@;Sh9Hy*-Sx*__KZbPUW@teD%% ztQV}%wekZXdc+ zGebHkX`CL}2k~JZ^{gD?Gk|9Knq*d^Am+#&h@4yR z0jciSwi>Rr$@HBY6H%fP%gO5~k<}RztMN(rsQ*vW%zZOl9KA=&=j`M28BFQoXbPJVY((mF(MOK_Yc!wurAE~Y1MdK+7^K7z%UkLbuiF9D98vAJIS7WCyh z#1(u5>{S&;@s+U060!WU94*bij-NhpH90?cc1Vrwb06x47qjd-!a5~>jtx{2eD~(a( zT9&a5(=}im*@X+mf}SfX50P60?kz3~()_^)W#}rsu1}P*GI3;C!jLsc6=qnjp^%-( z_V7=PU#_|9cPmkv+%mXXO_yW!tFMU=M&XoK2x8?tL ztN$~YAWY=JzyI6)w9Y}bVm&PilLCr$JjZyXV`=e`>)<3tg#led8>hVxZ*&-Wy%KegG{^&20jMO?KHU)2D& zmiS{G$5_GR_V3B-ui?+o;cIr=Te+S=j%&J13$(^$Yj?im3hba62R#RRw|aMWvb}w% z_dOsWHh=KlX!y=OJOsn&V8Nr^l&HtrqSIxKcF|OnuM8)7nskfux$b42<0=^3<>LA! zY}O4LUc9NtM4%O85ujXs{DgkxSGHwhzQ1>)#hYp-X7(1{#}Tc#R&~_uMR?ftmOAi9 z@zjTY&z*v?tXc8%RSO7Cn0I6k{Upf4YD?5ccR-;ro;keBfYAuZ(QR$A6ufG*jE%@b zc=FfF(G335H-p*GrDI-N7?Dh46nKj@yzrr^j3QAZ(Y426X;YYZivvvulp-^lTwEfL zq>L))W5@5>=z($enk#J?nK-s{0{1d%g_O+Lqk5 zHY5~h5x5XO+Bhi{w^Blh;sR$=FFGh>^d#T;IkJ313v!bRs&X`$ zEw;DA7N~WoY?T(oGEv{AqTxi`*P}D&EzxJ#PXp@kY%fOiYg6F`d6Uxwiiofn+6|cT zN|pP`(lctLT6Nk7N<{i4#mkPn-f~#biQ_VqI|dhex2M_4r?Un+(lteGCkY$29b*lz zTO(>UgnHbJ*-;OKAHNyM)lKc%;#NW$0|!e+uIsIlRaq1d@y+_<(R|^W-%S(52k68u zFc0`f@QHm6-M<;WOGhiI%bf-UG|GrbB;cC_m%sRNdqYl2ob0nuBfxB-K$i zNZ0h4xyE%K&~}9)&B>$IWU;b%jEo8}m6_bmjO1lgj7qtzc%wd$`2@yN77|4 zULJ05@1ubJ`_Q)8V67XEg0COuYWK>|;WV7#T$lpkX=(lGoO^BUhN`&e1gEM7?WM1^ ze3@D@(5@H0EE}y(6R@_3w-5k!GF+nVsQAhOk0sG4&n#G6L-c;&~X5GRPs1fd~ms zP=JJIauA0ST!c|i+)bm~sZQJIasKiBXD^<;JU)DSa3rXDH5F%x6ND*nIA3R|>aa*$ zGMt+#FrjXo`6XNp0-ehpD$I9hkh0TW|H;vQA7|Z=J={`}S38(hW~0g0o88)7O0oy= z;^6q@i>G@JAL8uX5r#nj#gMrgaa12@%n=fREaV=3|C^^T_xpW3&+cU^!|K1f9E~CV zeI#z5A*(5dG=cYdn+(oFhPUo1+q{o;sO3Ii-G&+afgVep9HxHX3~`JF_>30y8=!RQ zB2kOTMUUV++#BO_E|^zGhC94p^I=cQik*|RXO!#2S&{I=r!S7lo5M$c@d1n90-Z;* z;m|+B&I~S4;Pnf9%ajW^da2F0vFWr>!`~!`A+nUWynwAMENPRx!g)7h9>$f??-l<3 z-RLKRcJzKuiXG|wNJB^myOf6qfe z43Y}Z=L6(uuH67(YENI@O^0uI;H<{qBzH9!JOB>ltOfYNSsA`o9Ln~EAsbCws^JCs3$+-yHP!9zTAzzju7l|N7;lM+YykwO=bB$CZ!%a&&y~r1|pjo2SoS z9P|&LG6jduLnJOgHd>R7%ZH>y{zS36|G8oJWbaQ0kN2K_bNH~wKmDf%FOOgBJ;oj6 zFTa)t4-X#g;S_alvo%7mgLd3SYIKp;E%>Og6Ig3I|7jRQg+*~QQ7Ddp02wP5szCA~ z&VK?x_#?3&fnz2RDkX4$;0Sn)n?JV>7DFYR$=~Rq=nfnfIAWST+jc*DEW}H!C;<$B zz*+RF_iqfyc<=?k%ei;HyuTLexKw0qyc3c{icLR|hS7B1w&`(1Bu-~?EgV9@H9G|2 z1}1|s98ZUm8{$xI@;ZFM%p)U4qPnM-7f2^E?4Kjn5x$>7q(%XJz)+>s?w2zzC$`j9 zA2>@4nU?GVHR)o0dDWHn7o2J)sfQHM4Q9HQIqGAJ@Qf>fT&svSN%Ei6sZ(J=;L=q} zg$PDnU_p!GVlf&Go8f*R*IA)>91f{14rY2h;AG>Sf&J;(PKgn_J>Ch3j0&z?G{@5= z@$jF%ocx5)kx8k-;ofTmeLQ>hf8i34_o?$lBS(r)?8+d_CAI-_GJtQXgdgZF!Ki5- zV10f><3 zC$rIoq@TF~HqNqwWiNjABQcEO>M#Ypb;9d)vov##c1GL(sC3*+f5Hr=Utb|p4(7J$ zNq7E!I~-p;f;#*Mpf6F`$5tzr&(R#XCdVCD9pT*5RYE7K@ga^}jK*^#O|Tkb>Znbn z`rS%}!FU&bGMUw@(U`fnIu4o807gwwVmF1!c&j!-;xW6pnc8cuZy4hJ&1Epax*aKe z5rPDMJuz(h_RN}AGp0f0uzFRU9*1h;Lf2Gq!N0&=0iBW3rhxcb()1Q20%^=1K@uOq z?D!r55+a;oq?pc3LMD^nRh$9`uckN=7)@dbzB0edO?O6-z6f3ouKEEaN=vRpf>gC6 zZR@+3+=h!n=E(pBJ3Q@q-(rt4tem$87&Pum$jfHGcn{918h+b*S>+bovMRwmuHDK| zw*RFN?j{rCJYQCFpX_Yf3nk>r;n;rSyVGzP8m(Pw!LI+P*Mb>^*P7M3W`p~mqHdKX3Ny#z-h>sAcFdLoWW+_ShCxw!wp9n=%vHA5HYeA$V zWig-kjc@sBBWD2>INTXl5*J~Cu%8)6#vHv@1R=xd|gGVuEKgt}{@8;)+O zCn~M8d6Kg(3~o|_;VDY)kdh8R6ARPj(x-wHyC{k!d&<=jtS6R&xJhB;M?{>Og(Msn z*7P`P=Nx>5l8XeNC`RhU?h_Af!}oJx^V9u^$|A(dg=r>--TwH=-+{Gf0etu!eky+_-G zrp@zPPS4Pta_s=YFez7Mq4w&0Yg50HtT-@2S67UTtXOGiur+>i6{gSh--ZJ7FK^n7 z$jBA_$jhzYk!JVuCvN<)dl~(WhPh+dtj{l_R5=KR7{lXf3NDl>PUp0)gWK@Q=R?2@ zOBdqo5D1D1XJ?r4rlV@=u0gyWt{EdaiYma)vcW+y;dE^hb+|k7w|tZ1uM2;Kg6vFv4zb&AJlI-1vZh)MSr<1$7Gv4#)~{0Nb7;~Gsy3)w2?ORotK{B z5p+mv_JSG_8wS}DHqkCHPSl{7sJRr4jybXfPg7@*GhOzp4wlW0K)qzn$8nOAE$3WH zjNQzO9sEfd{J<;(zUM3Yj0-jD&u!rV4-Rx z8#}RF#_|sPcEmb&!thOP%!)9$1;jFxrK~A0GdEmuCo0C-AR^gvGdxUkllT^UoC}Jg zZ`V)A{Jhh0`2@)17u!H79^A)CU@RW`{g{3vUd6T;7XdtZOOzyI)I z2=686KtolM$kTu`RomODPR`&D^JQy-Q(EwusRfA(Sq?f7YkCoSOpJo>4)!Z@6$J$Q zgA)cXVHr3XfppvPxu7cCPMo$*<#jNBg_xy!b&IXkUS|zSZVqC_PZ?}?M?|PE?XiWB6n(KZiPWLn9F%oD|}-% z)!<#5Qx;T-oYk)pH7=QoGudbvLiK80c~!4hWLCY2i)3=#N< zp6S2hX_9$Ig_qUo%BrkVkxyBPTVYZLaXE*wqBmww2JPCs@gXi9S>vm8<&3XWWQ;Fx zD}3<)m$Su}yfIfiuxm3#(i`@vFJq4Fj=U+4-)gq?~ z0vBC7PfOxZx94gf8%BMor zBDV_VZiQzBxXU?LsBmNc6=2?&i!#FO`l>bA=&P>FM_+d-BYnYJ<)jDPjg`K}t?|+W zy)iQ_9rut4df>-fXSrsBx&UEa))qi4<#3_=tund*zZ<^`6>p901=!c-{t1)8kGoqt zR=g`;1Nb5n!^>OYSOB)1J)zW%c@Y40CwwVl)9pDteRlZtG0soxVSCvE3&$L5QDQi3 zjC6ClbDliI+?mg--Wt%n0}Tv+EW#}*p^gb$dbkMxGxUn+Ii@^*cBGclE>a{ zcMv~)&%goijE`~WZ8%DY^m@Elwq;|ty_MYgEsiJlKc|Ma6kJqUl{SefZ|=0?;XRsPHEs)wnuD(!BDG4lg-hLe)eV_?t=qyT^VM`iC985 z+rlxJ8Ql;HrPpgcpY(JKS7+*W<3^`=o8B$^fU^vuF=KNWlN8%mXF1k(f1CvqORq9t zEEvbEm_{|9C!}Vrl;>>(ZY(nmyk$e{fu9rJTT=xaP0tI2pnVq_nHw60Hxh+g1lkhF z5)~B<9|PSc5C*ttU#)7x=CK*wXI*;`jFj3O2u^5}Zg05t?#+PN4mLXXwLZ14i%Y$J zkJ5L2bYkq(x_C6BAsBapLA4e-9R`^NL<6qHSJ?GLN#?S#WrfxqTeWKc_+u*)W0l}H zIsEgA@#R_gbCB>Q&EUeFHi+2~J1P{5ebCUh(yCE{40V-<3yl_bL`mT%mTQ5abyXpR z(JDvgpfr*4!)a}Vy*&oJ13B>&?|sPS&mhz;rixD`4RQMd)fRw^Ok1XA<6L2oN`y5< zrzNz2VH%=~)1{1-iC5^RH)_l2}X(f5lgrT2JHOgUWvkRii zqz{d&wsH&TG9}?s%HkH~v*a;nNij+;oth2e#}E&{7~eY|NRDwkg1c2hjCul0dK z-S|=Vu8G%jgrY2)P#UmID%%J0aCWYz2U8edO(bdkBKDHh=mlR)qDkA|B0quz2%IsfrcLkV7ya2FNnA{aF^YN*^!hD; zcIgw25;eOi+01#p}ua9h_RVXgE!J_EhDr5;d zmMar8YS$Etr$R!wdgi`AN#Cs_%aVZe3PPm+ezwa*M4ESc-oKnM?>wK@bAPu|!({Pp z^(-Vxx?4R#d@c7?JJO}6S&Z-PZfdoSUyVR|)@OC!LR>beC86**elCfZmUMMx-u@-h zsc2bvwzXYT#aY@*RRWU00J)*vVFasd2U>7P?FG|7;=pb=Bbx%Y{SAqsn#g;FI*_b# zN`qR!t=zkf*3y-89A-$&1Q_nb?^T?rOvBtRbk@2 zqqL7Di9#-Zid2z8e8rE5GKS-Fe&zjiLxvz$b-R<87x>dI@v+N!cW;43H^8+s4_jpR zy4+Yr{+RkBW}lX&Nyn3(W;m#rKbY=$E_Eo}2mBtdgo6hTT^yis zYcD5McB!;pHQffj8?-&fFH?vyY(WN54!Y?!0PM3)r9b_7r^J>nr)yJrb29AL(U&qpFTcyHIg z9Z#|Fkpr5Ao+LYyv&B`E2mazmNMQ_U1>&tytrq6+EH5kjk2I`PCqyir*5CZq$oSC2 zNoECe7a+Hp<`bfb)&LWn;IC!3-VCrh8j6-LFAQm^oZzNQj9; zpS9`Yn)w|CB4KChNU1;dp>lL#&ZfB@l;Uw#(z>ow@(1^v3HOFD* z1tF9;7R?pXqm$&$oy^(6a(TBiy_lRRSfFykv#HZO6u3I*9qtv{5$}tv{x<-9quPbz z`?^>w$JBY#4ddMRr6PVk#G6cR=E6u4#Wkug_oyB1 zj7qDtNoSayf^-`M`mSo#BB_A-Lc$WtH z9i0o7tEa?1({)z{z13Y7ay=MPZ_@9Z^?9|b>qG&k=WdY%>V*@_1q(#UjAZM9wQs&t zH?1bnQFbjMy=#{<6f-iVcCiW;mv3!tc@;IU5x`nZQ(VVpRdJ?kL7OcH%QX0T%WJ`e zkYQr0M}Ol^HyXJ67@Np+Btuw3b|ivW8o`J0)mM)E!T8IThfW+y>%>F~<4uqz0zul` zujF22vRP~2GLoWZ&12*J+uDT;6zGP_IidL*jO5_0g>}^dn@HJi~s* zSJm}7xCE=5h^s_CA!AfC?YJKAfKJ}*wR!hZ&vEbi^x65aqj2XI2I1~)qbSs>b}CBO zb+p3H2at4+)3qdP_X8j$!*8cH`XKN(*pFYnrLA-H2idVL>t)-VRuckS)VMo~TiY95 zH>p94l9{*r8!<;WtHZ;G{pZiW>+ikz=BUrhBM_Wo(MM_4gcUEREtKWsJX1}p5XT&t%X7dst zx)Oc|vc#NmuuO1sQvZB3$F*=LZ+agqu2};JHfr>s1ROi6OC=r`%pJeEocyF$e#%mC zUJYhLB>BdllQ;Kp|Ln==453x*!1=53`)V%t#ms;6JCRCTRGl%(lIEZJONO(W%vw2m z%j6B0H_6iAub8{;;b1Xvxg*272VWpQfbTw4y~pSLuwH!kS@Yc=QBCT7{=*-C%wJoS zRA!-Imh&z>ot@ge1#Ca>1)rGopAXMZ&M#zJ7U_irkX}1CJ(DKtDQMmD-z`p!aD8OI zI~kK3y~*^g-1m(9pA$Yyo|oj%Pttp++OT#Xd$vMH4(fV zQ9Hoh=bUCMYR46Shw9DlAyW5nbUJqz-JBq}4Es0iC~i)}yQH<+@hSqw-N}p5`EZ|s zN>34}Wzkm^rSP zE*0i@Rmpq_g}cCg^9yE(fLOtBIv*`?bM3`?VR>ud-^gBNM{9@x;sVThr;Y&XGa=XCKr7^aSG5q;Xw(2g zQ_R;D9)M`fv+aE_?Um2K>!RFfPr$8DZ#R{Wu=agLi-PyD)fQ{P1hAfuOk$kdJE;+#?0O=9L& z-!Ur%vyXf1syT{^eh~+%{PD@^JXr z;_}^a@Dq)9A#@^lcwBS)g7CqOoR(%jNI%wVY>5gf;(k@+Yig26aXL2pFP7l*yp)v` zi1hxXfGV~s#uZPI9Pj2vX&Dfo%JKz$leztT`gRx(f4s(4ANz!xN2HLO%2<(~e9GpN zMg$ZeHoL&5P+og*w@8wEtf!}Au?lgA&}=Y&vr$ba&|kyqY>Jy_;Zb{CjYpFq&an)j z;1)PJE^n1!)#()GDlOFc<;4XqrmToJ45zRz+sY`)#`z%voDyK@5`N&{C*0_ST)dtB zG{otp#T!7yL4Iv&UIvwK-)hmVD1ccA+Tr)W?L|OMuOUYCm)td$y+YUodJryQ`m)i5 zocQUNvyXVT@N_gkK`0Mz1CX3yMj77&eArlV%=yA9)b~E~ShG zA{5lY&GB~vBH;$$0wi=rterJ0Nb7J(#CHIpF2|#j5oTGeOyS0vNgQ3*0bq^ToO%Ms z?+zWP3~s_`a>TF}oAG5~_do?UR|DooQoMt8M=60)96EDjH)<&yrq*c%nj>f~yO**a zDZ3j^pp^j1XtoJaF@ryQCqm@t3DKo|v9uFv2&uT$JK@huhCL(E=$RWDAqKALU?Xu; z>u&5hHJ8n(=BCc%BT2ilj6;(#1%z__AcKOVfpPIq&!GjH2kjrtnJ_X&jbs(lv z-sDv?QUvMh#%XLg+&ZVzhW`geFDGkFJvGEHAr;KWn^7%q{rXJ3el$Ylo9c_Ey1@bz z%ODnuS}M3UMcp)Lqy|%<3wBDE?%ovy?N8~bb@iS5zCWET2Cy4>U^bjDKSmh);1m|$ z*YJy}Dl+|dKDdzkW8CH0?4nxLJK^mP8bccnbPf?LIXl_jK72B`kfJ!c9Upu*8otXP z9>U!^cr_mGXqi6^-+#v_|L23zObhPrCf5K_cm=H2z=g;<2pOt1X4KY;ymK!d#Bkje z3A9jO%ze7|fx{)S2vDv*eu9mi>Xqe-;=NYLB`enSOd{X5KE|9GP02Vn2O{?(FdQV5 z3fQ>fQDgnCYqJog9?S0btY}*OBw2H&0BwsqVzZqD0a?S$&^A5Y;POMkQ9!ITYs4NjvBPqQh8rX2~=jYE}9Lt_+mOewS_Nuv|+B#d;X*JxH z{32y?EDZGjel$6qzMF4vKVm8pS%+_L??+PO#bHx1r2!Ba8cuUj)pmpWBp5Yq@&RX<0>79A<$(B{nK_I7B*y+C<#?vz$O#(OL2Hh4UH!kUQ zDNticBC}1rn-+Yu(Ys?6w3EybhA_+J`vcqCel|7R{|)}a))3LVib07u1UbRe9{tJ; zyWFlm{o?a~|3eZ2tL9`#l)q**3-R9hB?sD2&uZ3{XLGW$f_}nUw{B1Lh4V(FR@U#T z%}ym865Bi#0XJqb=@?Wl86p(k`L%_r>HLk_a(pl-M2&Uf|k7NxN!^v6Lt$<2cSE816>8yu&kFh)1!jW{db)(S*WA3w08T3jg-T7b!zX20) zB2;7o3x}%_q&m37S`PY=@wMTIZf$H_Ma>H(%WKOcsOk)9OL=`8Twnq{mP~a-LR#7` z9qVLyesTzW0*gc{Y^7unnMuGh{5Too&p?F~YnX@oWa043Lc^uAv4;fR#F0Z9Yp$@v z80fOwLu5p<&;hip>UjWtAlB^RxAte3F4A1b^Y$_KV8s5}s#>c_)VN`F% zv9^b?W{n3O*bMeea;AcmRcq455c>V^Wh2f4vGb1Bx>0C4#B8qFwy1cWfn%T|^zglV zIWAcbNJPqmtI*K$EYs{MpIY=JXT-dZd|B%!9~pIGV|k@oh31&}X1I7cv4Jgt|JksZ zA;Qs=M0N2tg;Z9j?;Z~4i+%W3hd*QIPIdal+w5WF!ukBo_-s6QJ-1T|)x|!BMYLr) z2>}Uuo|IYFF%^Y5>MjYxsC8Mp$qv@~RqK)Kh;$*R^>PNul>l&Qo=TeHle}sdHkqnD zf`p@B(n_T!w_h1!GRY?i}U<|!YvQ4zaN_# zJ=VUi&8vcySsNNo<=t#VMHR3Xn=l|Q-v0gQTtGUbG;r%A=9}n6+j8R8C~Q-%$;Lyj z$Zej$K=}L7uz(h6*o|;DpWICJ9wK0GI+zNp~@n9ULAH=E+XK!&P$!4bvS;-k*>*KIMj{W;i<_u7Fo7JhpD8iErzRE<~8qeAxiuht*kKe{)K85 zQ5yS=o^H1-|Fg~(I~tZyc~3*p*a((d=V8fqCA;VGC)&sATang(^_(O9%SrDJgV6X;SLj_N61 zy6cK%^KVCIh$zkY`|QQDm&dq|^+>uKHg!^r-otGB6}8d4Y`@{W%LI{VNYy7blMsGi z+I@Yf6~`4!@bKMkZz7peZT^~%N9TR)gZ+dhCSrZfDJb7z7V`y2m9a++W_45N)^ZM+ z&=DuSKbSDQdNBV90ogMin`f`a)!+<%0*S7ceoUE{&&pR9XrMm?k zSJ`@PhF?ysfY?=a;cCnj>d-L~`lRXK4sNM}m3+5e2 zZMKVtI%o#0LQ%w+P-`iq?qzQWdN{NT_-N$y%1TL%b=;uIKTFN&_ zM^Wypoi&^pYwH3wUf?|Oq0gm^5ze2vTg3>1pC&E%G}5o>faYs{a({Xa8)Bj`Rw-2- zfLa#o{*#|xV<=5dL+zTRM&0e&TVp&%YcayfyWdF+wEOyRAP*!>hiHy(9N1-!?D~8d zu1A8#Ib6>_W7KliN>GDqs+GweWMf!3bhCkhG5uTUztLH6pfB~Ghq>OxU5P@@Cj0?a zbeb~4U5f2H>KsT!>squwXwRZFT^OiX-A*Q z@fJi#?i?GyYxXVzYIe#1ckPl3Xi78}U1WPlZQ{H{7$bI`{GrR(6$@P6y=m_~{5DGX z_Hv@Q%}BeC4#r~t6}1};M%o+oW$IPb(y+WWGsj*PYKYwz4oAK`gze2}cCpF_I890I zgSFCRdO5dqP7nlKMa=)0&tm{HX>iKclWC4tj)ueP&0=ve-~Qy2)9J~4>wI)Fo6e`W zyWwPd{>eLCp?q@r?&6b^i;H_0yZ7*HwzxOA7|lO{yW-?>#uPa3e=B(2!^zEi%oKty z;yW>nead#wKVpD6=%Hm|5QfbOC3WCL>Dw?;5U4KEWXMtc?Iw;=abq*yz5Na&-eRNK z)MD8C7NKxDYuQaziQuxKa|%V9!Pp_-S}-qu2N-U_ViVt$J5I~9&y7HbfSp3d=3UsP z#(rQ}W3&@NmAp_?5ROX$@Jd%IJt?B=z&k1xZhJ;|teDIR^RpT%i3BzxHJV(us3YrA zAzA_2{YsWiSG7wuy+cIYAqQOiexLjw3?I9T{78t7MQ#~AE1J3owfEb3OD=Nt`7pcb1JBI8DGx6_DGsFSb3p2V+f_b?gJd)x0_5o& z+|fu8(eK;ar6R(gRvCJ(Gf7S-X?M~6=jj}M}} z8{-PvOk{__>^UY3W2s?c(qxP-PQFkW=nT>pjS-(;WTlAmk=HPFCCPOjv4IN0@^Tdr zoTae#(yH((cAEn-UkOL-+}O~8yruwSRw)Q@y)#QhG9oE58G5YaU`r|FjgSNA4^J>dP!Xt3ngqa_RE%q*v)`r?%V1&0_azepmd*~qJIMf%fDMEM? z4zhySn_3JLQwJH2qLmu=Ug}G^jI4(K-`db@b%9ajLUS89l&J<#U>3VzV}@VrlYN`u zEddjqeuT%*Ok8gL0mAYm^IafHB3#n!b;ks_9dLI7C|D*GqF^R*DzytL7(2qLpK#r1 zXhI2|urZa=a1%r)gXqCvWJ`>ndS?fxxWxy4e{8Mj$s&EMYD?3&)Z{;_S5irUB?GP} z|JI~J@Cfs&6iA&|rF)a1wW?&a5$mk5PWtZk!Vhj7T;KvKOw!o=*Dq~SWv}n;BGahN zKn%S6;m5G?J(wYS6NF6w$mpEye4>r_g%Y;d8^4F=5R|(F5f%^3 zrJAU)8}i6mp+B(4h^|#{6za4opsTRn`Q^tRo4a%8uA0$x`yIQKmw9etw%cT4oZRXF z5|vnyAH&WoH9l^+%29}+1XbM>Sk*$j74srn3ZE5IBa0bl8)}l>MLz8_B!%pQ*xb2- zbF>;5!`vWD`!SCcBfwIhJ#pA zGz*m(wpMqP{R~H{2gOk5+Kl3fA3t|15fY0Vvd8CI?LttRW7mwa`=)f}4rP2O+{gir`$A zYS$E^==okljC6O#ySjHMPZ88IiE^W94N)qzn40?lQWd*$t5o?%5wTmK<~615h0K9| z{9cFBafmcTFu+g3u}l_kN4sT6n5Ofi;RA?g=w@7erT(rVukJ&`A*{z|5fxH=>=^2Qd#%P$)P2G_Y>9B+hF=1fJmF9xsSOqfo3@?0`l!2d>J>4=x{ z#-Ug6)RMrlB~6pjpjmWQMIkVm;k8l5AgvVCSNq6y>K{Owk!t|wRAOx)=P#EI;)p7x zDPs9QZ$RfH34{4=6^Z*{hIM_XC^Q#lPim1d(g}+XJo4fye#^L`9{wB9C@lOydBrajR5gXVrKD zm-rd@7PNS8Gjmg_WQ5!q8(XKyS}>bpZz~sLH-`~nn|C64Qejt6#%kEaJ?#ya$4y0H zjCs&(&!=RW5eFv$w!>NDLxIj~9};6jy1#xB0t>O}s6v(yV<~=`E%Ip|*%Hos1!Kg( z@y571(OKEilRx?4F1H0aMqJEns8N8W$!*5ypqhT&8czqOs(-Tk%Ao3McfGMXKY2`x zqkG&h?n(-WIx%9D>frSV8_0ngF`_g{l;WWOs@yf-rEMjatI>?;H)M(Bn(P`)c;!hb zZRege>gv+x-_ln2FF&q5*|A76UkG8z8(sU@NwoN)3?yneJfa>uJYCZscNg$Fc#i3n zDrSIPk>wQOZ-3WT1txQP+Ic*wA z--bA7i?WtQ8hMc_$tp^mnevdw%_Vjm2|O3?Q_wh3i|klFwwiYVI@;PEYIQK1O=tVK zrffB7SMTJmEm+nYo-$^d+_M3ODjoNhKNK?zHl#f)~MTQNPYmj`9IB2+* z$jDV!mI<&UtxiFM|by&l@ ziZXM2<6QL%0k zDboGJiPaQORtujl2`#f=?M#zIf>;0bU(r}>LA`}b-V+H(94EyecKsK|^FPE2Dk9^$&xWa1}U zaXS4gjP>SwCol>##$;v_wmM1NGOvBS5X`T+Gz*zNCOAAbgOM*8`C}fB4wE$z))5&t z+xWy0#x~s~9cloq`80;Js5-CWH`ewZwYXDNGdR2NJrQCKpHEDS)Z&l%#^KJNqD@L+ zvrSFH;(1FoSPtp-nC4cZH^K9X5zC^-gUHt>N0yAs-=-Tc0a@+IBPfb!^mEY;@0>~F zR=j#OvJxZXXF@7VCczTPHV(Trd@6QeCY-BvGb)qU(_QM0x1$&8SwTUWT%+LmxMRIUx9#guXO zO3==FI(^~kQd2V>d#e_)$fH%o}H3}w~S*o~OXv5|D%O9inh#&w$3 zN`%dc%AtMacHDD=BG|~;;LHIK5nZ~N=fpfSwr1x_|I4hp>nH2lP=_OMboM^XlRK#w zyUZbwR(0vc9po}|{o`RfXm#1*9%jKRNEe92`zmO%cE_fbowRS!BB5*wme~p0D7MR* z=v@wtY20+muI7Z(j_19rtyx>pLpR;lc|a|T%dATUvCOM|Pz*&4XH<+a5)J>Fi^5pp zO3vv=igr@kne?$1Wj+q!RSNr~+A4UzI3@_Ti5{N@$qOpjhlk_?gQfXV!Dzlqs)D6z z!-#!Sf~S$rVojv9RC83aG(Qfo4^+vx83tM&wX$+Az{a|mL|9AH%TMoKfR+zic#(Jk zsM8+64AHC1Z--2Kr@j8egRftHBWLqJ3eR*>e)(%A4 z6Xa`H?bRf)vxg%a0I3heoS$pBJG5dZD}kx%38v2%q8}Y5eyt>fww&E;(AgQ_7ME$H zG;~WGeW^^4V|QRRmXg^a6?LY&X7$jCl4q5bC8?;46o*sXlD*R0E?$#c*|OBv%ENM3 zsfU0gk^wn~aIW(ewtg+&qzkJAwunwe9+~{v_BJL-?C*1Hc`y#~t5+fuO*;d|Pql~4 ztXaTEY^{%JZ?u^27@fZ_C57?v+;;^QVAcaXY>f;ONF<5mOp~F8so8*QkZ>p=m;Htx zEFLe1T!}=om$cJCcEbR@oJ}nAaGS4-HS)Si6@x*19adOPil(zeDZb`*sq6!fT$;6i z2;#Tm7B>sp*rPE(&&|~NHl9mfCVQe>^#o9@qN7V~!6RZ2N;A?>OsmkIu1dneT;%!W=G`(2AoWg% z4}tSj!}w-HG@JGW6kXF7#^GL+KwEmk?vilCtXh)>oRDSVr9Ork*pmpE>b35acS=Zu|uV+e5?-7FBb20`#7Gnf&kcvlD;VTWd=cgaD7M< zAbl>;w#^V||C;Vd@x%6M#jEG3oG-_bGceni0q%iX= z(5kym{IyMrFun`hPBJApz)x=&2SVN(v_6@7`Dqifecb0kE!BwiYq!E;C;0Rihy>?eAP7juRoF_ynzFXh8C~)neUe)$5{5T)K znKf)Y&&HyI^77R=?#IG56b{&2Os8Xv6*~{l@zRUees3Z&LtkuY8qRQCFUzlGn4Lma>#scauUdH%S6JbQm6Z6C*`_e0B}rMm%GX?P~k6b0Q!8)KaJhdd$U z_b+usm>a{Vx{jR-oJ?5}b24n!JD2+w5-MpcL}!wnaISK2dJ4YHAzDhEfM1YELrZu< z21Be8GE1@_*Qktxr)}(PK#g4tX+5_BlHu${PBPiQnZk@RKLWknHMLbl*QGzfP7GWvRUmtKR*7;^Mn4A z-+Wy+z8y*5Vp%EiSytl7-r>_)DM$T01Bz7tG^_rUw2Sb4 zO`@t708lR1ocHegr;)RM1P+Zp#F@^)mI$HJtBPrlyhqYx$rn$*e*8SYk~LnlH2 zLo=cHVf!iccBu)}03V0+_W@*(r?u?JDju0eNTurqkn1o^@qLCkn@Awf#2B!&3 zj@EeZye|eZc1h9OMd)>E*+v~3fKA7slbyqToq>a~!DtN=eDn?Bt(X=s7MHVOv!u7i zW!BOARt%scTbRfqoSr)XO2j^Fu?t|W8f3}Faf?hf$zg}mum+}LqTSmy#s*0#3~Mu3X=k9NyVdK<(P@8r z2GOxM+*NrxeKACE4I*$)-XBl*E-uC+xK^-=#zeHs%XRyVZbG+D)2l2H;Nd$%H}&JTFK#svjDC3udGgj9e>d} zE@V!)oQ(c@i3|(MG;T!%YI3FvM&cJ{0r3+ku?mC=BPpyeoEBNarw+U{D%nk5Ns5GaTgWyrMAnC( zv~tq<1y88X(zLHotw9Eoy8DlVV=3qE$k;HXz(8H7&U8hp70}fr5zU{f?*?JCWM4xvndC6V8&iUw!*0aB0l-P{DB4M+_u9wY6c{tgI>u zw@8Ti@(_gDSFEmk5lm6gM-qouaFo)$j?0m2mY?%?0y3tALh_thC`Ed*z+`tvJm86Qz{x4W96WEc&Rqcj^3uZ ze?gh36U82pbNzDog_kw?n(=$EzJdiA0pv>6&4bin^d_e{o#FaB;h zSx1Aw@zT^TVVNz(j9v+9>n&>U-XP%-PY1;Yx8h3JX6zCMA+r-FcB{!tjbUG=35>|( zbl?*iICADhr?2hp_oLysaA=N&`KfnJn``Zm*h8^1U~;i*InK*^m@~@6&CF?oB5NPH zwm$Noh&THl%DbZ&?({qB_|M_g`oled=uXbQ)w8EjXX#c^vlSUKYdl-0`Kn2wnv`ct<#gEHe(9ZfKMVP6?B~u6OUX zmUCMf=wZX}+Fq~qjjby(=V+9NzqM9#lAQCI;vFC!Y{dqXn# zP&8(k;=k&(Vw-hxj985&GltB^HvWRN`)6_7*VgUCCnrVh9av=mQ=jVc9Xo6CmpAD_ z*>F@)I^C|BvEBlUqE$)FyP+E~ybuH9)1@iSVhyjl8MF`r8I)r0_r%PJO9mJ-+uIV< zW2T{*d`VVvD(ZmeDYfBj(feo>Fj^#x&^doKdVM)XBGDioz{rB1dI%4C1y6IOs}7`F zWZp$sH{p!sMiw1J#@dR+aFG}ev7sckZey#_#`0C`8nhu^ZIm&jnvJ)h>2z%xO-nWn zbIP|6zHY;U_D^wBG%nSSZ)7ve$6KwYs2?YKQjm4{SK_QwINnmUD*IIt(+g| zmw}i>Fb)!NnA`Bk)(|2H8`zqO9d_C!hb`kO7Nc+cZuP?t=Y#jJhW*RQ<$QSh4``A&8{_&_qQi2%9J!Q(KyZu2*dP#%swVZ4Y|eSg`FJ6T_yN8J{osX%^>GFZN4XR((XWZD5-= z-4^0(yV&xVkydOVd}1fJteK#*pKIkiVwnhx{PII1> zc$%1WMtxQ*&G=%a?ul+v-!m)|pnex_LJlF|8LbC}F=w+~&UC-~;2hsE64zEVH|2hmjubf=A^YHu z@NfzJYApI6FIOrhtL8~P%OH1WYXv7N6e4~&SF9iKNLP>B4$e43s7>kSQ}~9Ekh>iH z$oKpt!PZ|9bX@JnCoG`zx{mJ@e-OhBWDQ>T=XKRCG7Kb{I}<`D!zs!wc29$BewkrK z%%t|~OQ=y8W`yGQPyG^rW%&t3lvDK*H35%9F}fFW1X>kR5Q&C2f+z%!1iv>_33V8K zoWaFm7zIrqA{&FdL+FvjAZ-K${D6Ysd7)%L zgAz77zjT5p+9SaEXbFsu3P7S9bk{+NN{;ZgInD8ZjkzpAF4w>2{FT5GVG(qm>V}*f zLB6bTC4mSsuRp*V2JR>m6bY?@Yj#>;NmC6_<08MvJ(~ujJYb+*yf1ElMuL|s26>FA zN%OUQ=p_&asNHK4tBI#W&QYCVFBTU%YRs;_8#7d=Z?&nAnDWykuqllDVlnU#B$Q(%V-jN)5k+J1bRpn* z^!hb!N5aKMcn_<=MqY&!%F{`OY;L$KDYqkPnoW4$l%TF_0WuPS8b&yO-Yj@|ZbGEy zfLBs8t7m@(Jppyo4?7UO#~=SRoK1$~&pzEc9gjbTSG~kEJU7(tGI^f{o|X!hGy~<{ zYD4~2N1Apqv)i;vSBVblZ!&!cJ>z2ERWS75^|Ty7Mb+k^@O$g9;7jABNJPgqqltQF zvG!(1W3M@ya7)*Z!RAmltXL14aV?Cp^oA=mn?}wsa18vY4eXYw0`f03JCPfKq^j<5 zl?M??-5l_I>iE1*SoQf#p*9CaZAcT8@e=EfITojgAQZHai_FewWIL3s5I$whOdXkw zmoNzR`8TX0!n5Jz^1RYeNKyP)ZR#WuC&4fgG^#3>B|vq@bCKshgX6E%HJ76HX(6&ypG zA6;M3Q?B}nys#49ySjFOni zun1eEmgu9P992!^hE5uu0ngxA#bDM7sz<_W{ypz=46nV`WN&Y6scFMBEX$innxVFd z)fRU3SzLOQEm{%Xcc0f0U!qt?>|7L4fcETp+kb`UaIF2h^)(js?L0YG+T;NjvO6yw= z)VRErDSh1)fOREb*b?l2|8;E#;uJ<861!|~Uu!|DOj^C3)p8|ekuPV7zaGkqF1zLz z7YY?*t2xB@=0+=9qKv7_W8_rjH^asL1cMt1c^f4e6{(hhpZ*u9# zw1#|C<;7l;Hhu}LqY{oRvST4vrOJ>n7WjAh%1{^8SbOCHrHi*{@Y-Wbalgvs?FhRE zyxU{zIiO>>Bd8r;R7)p5I4fQjiiYTTgltmtUgVH?gQ_>9*KeHq(uZRx&!{_7k4YA% zcrzPSy;DyHKab8Y&!ManV(_q{jhZsnJtUfIJ`qO=BChRhLL`C?qU&*H0ZRBMH$#!? zvf<;(`(>8MKU6?L3kx_;uOE!0(w?&7C0tP=a`xHJp3q1$j>r;%r*+=4t$>qg2$Uk$jy2QT3 zP=rh`?r<1I&IdMpVNT5gK z!RvV)0!t_hGBAAH1jVNj++%D{KeCI`;Hr3#)0{>5iN&9jJ=jyg9({+xGg4@XlAjf} zwtlJRd1Jp+m-z$RR;&V-p3g?p*=X_p3YjWu!VwWX8vQ@|;qmYE45!=T44S2L@jDc% zCUuL!X#<*1I>wa(6=IVjFuZfW6zKrdMuP0AVpq10dpqI6fh+qT`LeGXw(DFM5e4ol zej~-+jV7}NR5Al|92r0gOPHOm;cJ<$2_=WgC#st2@?TSfGT&&)Yux^o^}~X0`fFY( zegow57LnZ`-ICl0y39~*5{rg|Fe12f%^O@h@lr;XPm7gHr!ZK!#sog<&aLvb&TEN= zi5wym&q1_B%ppWX_^IJn2>U;XH|nM{H>@d(cJ+&=yJ1sd9P;L5Tfd8!HJd!Kxz&(W zV*_F@q=|=UA4x8}D!*`nEcw~L+3*Y@C&=Icy-xIpT%gQ%;$z7-|9$ZS zm=~eyk}~k=AQj`{{dc?@NZF8x7#m4vBh)GaF6Vl4kC{nvWTeWD|HqYp596s&m_##H z8Q?EtDF>+7&(MWqh7s_e&`!rS$x5Kx+s}|Me@4(ntQuyZERqiAPm%0%Haa;%oX`MC zmOG*&>u{WF9ANH!b3TM4SuPb|ZmaN$Tm15{hz=*`KO(LQj=PtK_!`I&37UB1$c|fE zaoh@s?pS@~?kR!?^ao!kctC&f#k%0Fej9kU9^e!G^&1Ef+FC#Z5_bmr0RCs6UZVr7 z-v*w|2l(v3`V9mKZ7rYyiQ?1_{QvB|OK_Y?k|vfiJ$A*FOmiHQ$xMG$4Oj^ji3Y$o z8pIF;z#^w`ID!XW_)|Aefj?7yVEOB!4WXhDU~IIV1RVy^RQ1j|g1X7yTk>t( z`Un>7S{B=s@8d!c0Z01}u{^>uXx!>2uv&R00TA}(+qeLjJCn7)#NTo2=Bm3b1{QOh zl|(h)X9Ac&CCmhX?f01gma8j>u6&sZNG@h%Oz?Lm0QV4uOo045EMz>qN z!08kCTlmeX=;Z2{qGO>#te0=6p+fE{7Pv=dLa3^*(_pC$rh^M?Z>*%j0;;Itsj$t0 zb;@^QxWM-I%^Yk+=S~b&HE|lO)3g)ARTZ3uD;j!oMo_(+2C8~{a;U1S(@?E8pB%2y z;%UHC@{saciKIkZD4YUH0)f(z7tfKyj9LK>E<{GO%BmcGHIx}ov?)` zZ_Z9VBQ<9WPu`r&Nh7r-B`0r)Q`SiBu;Ap)Z~_~t85SJ98Cj8Jw=we8#2xP>pu!HCNVmLa#+pzXtZkSw}*^0o~%{$%V4lQD)w6hFoK4wFgT?yfeHG(sl+MbcXS&{EIc}JL!a-$s1>wp1Yikedt|>Rg*zOR| zDLZSiovg1Um6*80I%^9~(OYsdJQdTAtsp#Ee@E@EDK|xLXVF=U?PPuBkja8zl(7|W z%ye=KC(iU^D+o{4-%-13%1t-6Q+L*4J6T_K@ic5;)d@EFs2bndbfc=MPS#DcoEz3p zEjGn~>SA(A_BF^()>F5{9M)G`aEjjQB6rH(T0AB+DrDt5tgkFIML*4=d&-Uqrjre- zU5XFur*+oKLgMNaJvOf1=>*ndJz1Y~E!)UNFpL^QA?Si@8af3Yi;1`+s6QE%#IrGs z5G*u(U+GwxsFQw`B-r|nX3w(jyx9F}_t`hQm96bZIMKQ#J@aeC!E326U+ipYi4Rhb zYthX5kcEDLvR*8B2vi)-}Li1w+E-2#dC#5`ZYs3 zi7$2{IQk|kfUww2 zsFgfru=W-I+&Gjmb!JAH9pW%E%Ge&wf@j7ijrDiVj5g$&84}0hHw(TI-`|*g!#Xpg z4M<~m^k*PZ;F~GDnO>r-dv<*&X>#h!M$OESDy}!viWA5y4#lBV2~@DDGfRfCu^O{s zm?>PO@!*e58jcGq&5SlwG&3ZQ#cygwqdv=VxJF&AV))Hq+72UTX23MlxL`fY82{!t zR56a(S&>EEv@@Hur*qi4NIB;T9fvZu(#%9jow_rljm2+jQ4;s*IFu2m@2oh+xPWIy zmMNUUUXZMVbsVZhF5+2e7zqlV8C`6brk${JSFMrvcpRb)g*G$k3mn2Tqv=rWryATE?~$GX3(_$?Gh$t?i`vVsIIG7YnRi^zlw{dttKNx_9VHtkH6LF8Fh-n|4AWXn z<4IiKo{qW9ZGF(gS20!J+kuc~Cg2venKA4@w5OKrT1S-Y@dO~5NMZ6)oHx%LllDetEZ-@_sP$Ipagcg^qj&;KZKm()}ET2-gQ3% zauV3(k~8+@9umHo%2aGvxL9yfi2>FRro(_`p_F?C}#>z|XkuqN*k%0PdQk!Hl0>PUs z;nSh}75Ls7-6JHhi4RS)CO`2xgv>GSB32=FF>~}uEA0D7+IuH&m?!x4T!P5Dj2ICGzyR0UxUW5r!aN7;VBza^#C+w+DMfz zg6Ai*H1OcWg1@?6)@r=(J~iGTmSgVJX$y0Z15`os;r>xTnRN60^KLtXnM*XUNT$X& z?w1+Y+2W?$WimZD2KU_s-CfuBkl*Ki5?6-0vWfN0(a54PEVu$?#|(g49F8!?Ju+aBF~?z?&82Xi zGsS`tzD4gcrxv?YLF)>yI8 zsme34c^+BPFrtTYTr?Wjl2}yi%V_>p{`6XvhD0C@B%puEUj>%NXscq|-`TE>4Nnt0 zqpl(?6!%vLbATA+4BRK9k6i5am|)DDPKwda>ZYN?G)vJVZDT&*lYzWIdGy+k#reqs z;nTpJ)bZg%`|(PVPvT#ZaPxH*zJZ-D-}W;=Iwj8?%iEpx^eHu&D*zc-CnwJ z=f#sJo~*e*keNg-o?2eIckkBn^6izoE6dAL?XzgGb1SDXSXsV(d-=xgmD|fNMs4-> zojZ4KFW*CXvztq%;>Yw;mu%==y2HK!#@sQ(gYUi%n}!jNysMF*N4T?n3FcR+ngAeY@7kQr@p zpzGGOPNn6$uk;b`olF7j;+izJ{^93k*HTbJm4hb2_HJ}kPPxz5)=e^V5zn=En$yM3 zk3%UKmscWL3w|_`8QtZ(CEwm*Ea~s%(F=C5z=$+VYJG63gq* z=d<>Z`9~)=-WJ~Mh|1GjXZUkLh0B-dL*1)hw1wnJrX272iD2+wZ@xnIU0nANGKA9a7%*BPiZZO)V_s~?{#B6wx!I`; z(E93Xmv<*rPT>x3p0zI4L=@%O+Vav8mbmhuU2S)aBf@ChosDC_(`ztIGv*E5I!G+6 zSASQ#$GsG5apsXjAW-Lx?%PH^xD+AtZpAA^RkUOmeKtJ%l_+I#Yg?2t(R-bb%M#TGL;N%3bA9g zv5layM-w%+yp((aY|-MzNG(=_7LTTEu{xkdVF32{gZsu`x~VGsWvRN+6d)>E22%X+_)s?GK``uiS$#JQGtN{dRT-&+MJW4YGp;`E>X!Z zFc2vb%m^tYiL#i4NO}Bf{%d_yROOhJh3h&G_=odC$>rO?KVlX#Ou9e$P=HU}8d4Hc zFoGk~sIJCa@E%6*O{1+k#ymH+QS=N~5Y^tqn(ssn)Rexn>P{v#-mKyJ<@v$XM6`yr zHld!)+HPP43tT{1yVb#1)hETv^}xpV$XIKcdl)3K&AI4sa~+7~*$9U8Q%S`^b5^O; zG6ba+5s+!Ll#u&kAHJk{=rB;0P*D|4FZKzXPd#KY^c9ROt6kwL$LKrv(;`<5=rk@I zzHysDIa2M_-Pe5b`Ss8Jqvabp&vMGGxN?3DA#Gv=_++3?6g<2>#7|}gXD$wq6{d5j z4+$(7UH;VZalPlGECR+?fuYAbQYG`oN>qpS%9$s8YOHCm0Pia2y;^#Wi)#n%EH^#1e)78B-cHP^q?w!~1s1e@F-X``Rnt zV<(pVI4qAp5X*ifmPZ_lEL#s`v1L!?mGP;(;;Fm>DqqVC`M|bUJZ)CSr_G9|%?fBU zZrgVqf2`aayY>w))i=f$>l=Ywk1yCaJk@UGQq4O`NqtPZ{KJpYiD$S`qFGz@b1`ik zF@A8ipqg5dh^5Bo!D@u%-SZnBzO|JSmcNNfBbdH9H;q2UOKFFePVj=9+FR1Nf4Y+U z^oCi#Rl{2Zt|fO}tgv7iSRL`TtI}Lq{-5G4K3kDDD>-j&$eSBEZ*G1tgdy`t%&js`+X-#uf@ ze{$M5t(~5guWG>jRjK6sbP@?4uW|EGLG*aou!0JojD|`<(6}I;*X-IXS{BN*8pNH7&kYaw$e_lnbO0|`G z`UsId@<=g^SFASXNYRI!@QUs*#v*=^aX{;9^)K48TliPdr@IQnd{{jk#|K)uEF7wnyM-27O1E z4Jc3AxLJ%#;5je1rR= zzpNZQ-rL^LoS{RSO5NEus8b}`vTbd_%qu$;SRZI6?kmkTza|yEh&_*&eUqZsVAjSa%0AI$FL3 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 XXMau|9ly?N)Piq + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Microsoft.Windows.CppWinRT.2.0.210806.1/build/native/Microsoft.Windows.CppWinRT.props b/Microsoft.Windows.CppWinRT.2.0.210806.1/build/native/Microsoft.Windows.CppWinRT.props new file mode 100644 index 000000000..d7e2c652c --- /dev/null +++ b/Microsoft.Windows.CppWinRT.2.0.210806.1/build/native/Microsoft.Windows.CppWinRT.props @@ -0,0 +1,66 @@ + + + + + + + $(MSBuildAllProjects);$(MSBuildThisFileFullPath) + + + + x64 + true + true + false + CppWinRT + true + + true + + PreventSdkUapPropsAssignment + true + + + + + false + stdcpp17 + + + true + $(IntDir)Unmerged\%(Filename).winmd + None + None + false + false + nul + nul + nul + nul + + + + + false + + + + false + + + + + + + + + diff --git a/Microsoft.Windows.CppWinRT.2.0.210806.1/build/native/Microsoft.Windows.CppWinRT.targets b/Microsoft.Windows.CppWinRT.2.0.210806.1/build/native/Microsoft.Windows.CppWinRT.targets new file mode 100644 index 000000000..16d0b020d --- /dev/null +++ b/Microsoft.Windows.CppWinRT.2.0.210806.1/build/native/Microsoft.Windows.CppWinRT.targets @@ -0,0 +1,888 @@ + + + + + + $(MSBuildAllProjects);$(MSBuildThisFileFullPath) + + + + normal + -verbose + $(OutDir)$(RootNamespace).winmd + $(IntDir)Merged\ + $(IntDir)Unmerged\ + true + false + true + false + true + false + $([System.IO.Path]::GetFullPath($(MSBuildThisFileDirectory)))..\..\ + $([System.IO.Path]::GetFullPath($(MSBuildThisFileDirectory))) + $(CppWinRTParameters) -fastabi + "$(CppWinRTPackageDir)bin\" + "$(CppWinRTPackageDir)" + + + true + C++ + Windows.UI.Xaml + $(GeneratedFilesDir)XamlMetaDataProvider.idl + $(GeneratedFilesDir)XamlMetaDataProvider.cpp + + $(IntDir)$(MSBuildProjectFile).mdmerge.rsp + $(IntDir)$(MSBuildProjectFile).midlrt.rsp + $(IntDir)$(MSBuildProjectFile).cppwinrt_plat.rsp + $(IntDir)$(MSBuildProjectFile).cppwinrt_ref.rsp + $(IntDir)$(MSBuildProjectFile).cppwinrt_comp.rsp + + + + false + + false + true + true + true + + $(IntDir)Generated Files\ + + $(GeneratedFilesDir) + + $(WindowsSDK_MetadataPathVersioned) + + $(GeneratedFilesDir);$(CAExcludePath) + + + $(PrepareForBuildDependsOn); + CppWinRTVerifyKitVersion; + + + + $(BeforeMidlCompileTargets);CppWinRTAddXamlMetaDataProviderIdl; + + + $(ComputeMidlInputsTargets);CppWinRTComputeXamlGeneratedMidlInputs;CppWinRTSetMidlReferences; + + + $(AfterMidlTargets); + GetCppWinRTMdMergeInputs; + CppWinRTMergeProjectWinMDInputs; + CppWinRTGetResolvedWinMD; + CppWinRTCopyWinMDToOutputDirectory; + + + $(ResolveReferencesDependsOn); + CppWinRTImplicitlyExpandTargetPlatform + + + $(ResolveAssemblyReferencesDependsOn);GetCppWinRTProjectWinMDReferences;CppWinRTMarkStaticLibrariesPrivate; + + + + $(BeforeClCompileTargets);CppWinRTAddXamlMetaDataProviderCpp;CppWinRTMakeProjections; + + + + + CppWinRTComputeXamlGeneratedCompileInputs;$(ComputeCompileInputsTargets);CppWinRTHeapEnforcementOptOut; + + + + $(MarkupCompilePass1DependsOn);CppWinRTAddXamlReferences + + + $(MarkupCompilePass2DependsOn);CppWinRTSetXamlLocalAssembly + + + $(CleanDependsOn);CppWinRTClean + + + $(GetTargetPathDependsOn);CppWinRTGetResolvedWinMD + + + $(GetPackagingOutputsDependsOn);CppWinRTGetResolvedWinMD + + + + + + + false + + + + + <_CppWinRT_RS4OrGreater>false + <_CppWinRT_RS4OrGreater Condition="'$(TargetPlatformVersion)' >= '10.0.17134.0'">true + + + + + + + <_FilesToDelete Remove="@(_FilesToDelete)"/> + <_FilesToDelete Include="$(GeneratedFilesDir)**"/> + <_FilesToDelete Include="$(CppWinRTMergedDir)**"/> + <_FilesToDelete Include="$(CppWinRTUnmergedDir)**"/> + <_FilesToDelete Include="$(CppWinRTProjectWinMD)"/> + + + + + + + + %(ClCompile.AdditionalOptions) /DWINRT_NO_MAKE_DETECTION + + + + + + + + + <_TargetPlatformWinMDs Condition="'$(TargetPlatformSdkRootOverride)' != ''" Include="$(TargetPlatformSdkRootOverride)\References\$(XeWin10TargetVersion)\**\*.winmd"> + true + false + $(TargetPlatformMoniker) + $(TargetPlatformDisplayName) + CppWinRTImplicitlyExpandTargetPlatform + True + + <_TargetPlatformWinMDs Condition="'$(TargetPlatformSdkRootOverride)' == ''" Include="$(WindowsSDK_MetadataPathVersioned)\**\*.winmd"> + true + false + $(TargetPlatformMoniker) + $(TargetPlatformDisplayName) + CppWinRTImplicitlyExpandTargetPlatform + True + + + + + + + + + + <_ResolveAssemblyReferenceResolvedFiles Include="@(_TargetPlatformWinMDs)" /> + + + <_TargetPlatformWinMDs Remove="@(_TargetPlatformWinMDs)" /> + + + + + + + + + true + true + + + false + + + + + + + + + + + + + + + + + <_CppWinRTProjectWinMDItems Include="$(CppWinRTProjectWinMD)" /> + + + $([System.IO.Path]::GetFileName('$(CppWinRTProjectWinMD)')) + true + $(WinMDImplementationPath)$(TargetName)$(TargetExt) + winmd + true + $(MSBuildProjectName) + $(ConfigurationType) + + + <_CppWinRTProjectWinMDItems Remove="$(CppWinRTProjectWinMD)" /> + + + + + + + + + <_ResolvedProjectReferencePaths Condition="'%(_ResolvedProjectReferencePaths.ProjectType)' == 'StaticLibrary'"> + false + + + + + + + + <_CppWinRTPlatformWinMDInputs Remove="@(_CppWinRTPlatformWinMDInputs)" /> + <_CppWinRTPlatformWinMDInputs Include="@(CppWinRTPlatformWinMDReferences)" /> + + %(FullPath) + + + + + + + + + <_CppWinRTPlatformWinMDReferences Remove="@(_CppWinRTPlatformWinMDReferences)" /> + <_CppWinRTPlatformWinMDReferences Include="@(ReferencePath)" Condition="'%(ReferencePath.IsSystemReference)' == 'true' and '%(ReferencePath.WinMDFile)' == 'true' and '%(ReferencePath.ReferenceSourceTarget)' == 'ResolveAssemblyReference'" /> + + <_CppWinRTPlatformWinMDReferences Include="@(ReferencePath)" Condition="'%(ReferencePath.IsSystemReference)' == 'true' and '%(ReferencePath.WinMDFile)' == 'true' and '%(ReferencePath.ResolvedFrom)' == 'ImplicitlyExpandTargetPlatform'" /> + + <_CppWinRTPlatformWinMDReferences Include="@(ReferencePath)" Condition="'%(ReferencePath.IsSystemReference)' == 'true' and '%(ReferencePath.WinMDFile)' == 'true' and '%(ReferencePath.ResolvedFrom)' == 'CppWinRTImplicitlyExpandTargetPlatform'" /> + <_CppWinRTPlatformWinMDReferences Include="$(CppWinRTSDKReferences)" /> + + + %(FullPath) + + + + + + + + + <_CppWinRTDirectWinMDReferences Remove="@(_CppWinRTDirectWinMDReferences)" /> + <_CppWinRTDirectWinMDReferences Include="@(ReferencePath)" Condition="'%(ReferencePath.IsSystemReference)' != 'true' and '%(ReferencePath.WinMDFile)' == 'true' and '%(ReferencePath.ReferenceSourceTarget)' == 'ResolveAssemblyReference'" /> + <_CppWinRTDirectWinMDReferences Include="@(ReferencePath)" Condition="'%(ReferencePath.WinMDFile)' == 'true' and '%(ReferencePath.ReferenceSourceTarget)' == 'ExpandSDKReference'" /> + + + %(FullPath) + + + + + + + + + + <_CppWinRTStaticProjectReferences Remove="@(_CppWinRTStaticProjectReferences)"/> + <_CppWinRTStaticProjectReferences Include="@(_ResolvedProjectReferencePaths)" + Condition= "'%(_ResolvedProjectReferencePaths.ProjectType)'=='StaticLibrary' AND + '%(_ResolvedProjectReferencePaths.WinMDFile)' == 'true'"/> + + <_CppWinRTDynamicProjectReferences Remove="@(_CppWinRTDynamicProjectReferences)"/> + <_CppWinRTDynamicProjectReferences Include="@(_ResolvedProjectReferencePaths)" + Condition= "'%(_ResolvedProjectReferencePaths.ProjectType)'!='StaticLibrary' AND + ('%(_ResolvedProjectReferencePaths.WinMDFile)' == 'true' OR + ('%(_ResolvedProjectReferencePaths.WinMDFile)' == '' AND '%(_ResolvedProjectReferencePaths.Extension)' == '.winmd'))"/> + + + + + %(FullPath) + + + + %(FullPath) + + + + + + + + + + + + <_MdMergeInputs Remove="@(_MdMergeInputs)"/> + <_MdMergeInputs Include="@(Midl)"> + %(Midl.OutputDirectory)%(Midl.MetadataFileName) + $(CppWinRTProjectWinMD) + + + <_MdMergeInputs Include="@(CppWinRTStaticProjectWinMDReferences)" Condition="'$(ConfigurationType)' != 'StaticLibrary'"> + $(CppWinRTProjectWinMD) + + <_MdMergeReferences Remove="@(_MdMergeReferences)" /> + + <_MdMergeReferences Include="@(CppWinRTStaticProjectWinMDReferences)" Condition="'$(ConfigurationType)' == 'StaticLibrary'" /> + <_MdMergeReferences Include="@(CppWinRTDirectWinMDReferences)" /> + <_MdMergeReferences Include="@(CppWinRTDynamicProjectWinMDReferences)" /> + <_MdMergeReferences Include="@(CppWinRTPlatformWinMDReferences)" /> + + + + + + + + + + + + + + <_DisableReferences>false + <_DisableReferences Condition="('$(CppWinRTOverrideSDKReferences)' != 'true') and ('$(TargetPlatformVersion)' < '10.0.18310.0')">true + + + + + + >true + + + + + + + + + + + XamlGenerated + + + + + + + + <_DisableReferences>false + <_DisableReferences Condition="('$(CppWinRTOverrideSDKReferences)' != 'true') and ('$(TargetPlatformVersion)' < '10.0.18310.0')">true + [$(XamlNamespace).Markup.FullXamlMetadataProvider] + import "$(XamlNamespace).Markup.idl"%3b + +// This file is generated by the build to support Xaml apps +$(XamlMarkupIdlImport) +namespace $(RootNamespace) +{ + $(FullXamlMetadataProviderAttribute)runtimeclass XamlMetaDataProvider : [default] $(XamlNamespace).Markup.IXamlMetadataProvider + { + XamlMetaDataProvider()%3b + } +} + + + + + + + + + + <_PCH>@(ClCompile->Metadata('PrecompiledHeaderFile')->Distinct()) + #include "$(_PCH)" + +// This file is generated by the build to support Xaml apps +$(XamlMetaDataProviderPch) +#include "XamlMetaDataProvider.h" +#include "XamlMetaDataProvider.g.cpp" + + + + + + + + + + <_MidlReferences Remove="@(_MidlReferences)"/> + <_MidlReferences Include="@(CppWinRTDirectWinMDReferences)"/> + <_MidlReferences Include="@(CppWinRTStaticProjectWinMDReferences)"/> + <_MidlReferences Include="@(CppWinRTDynamicProjectWinMDReferences)"/> + <_MidlReferences Include="@(CppWinRTPlatformWinMDReferences)"/> + <_MidlReferencesDistinct Remove="@(_MidlReferencesDistinct)" /> + <_MidlReferencesDistinct Include="@(_MidlReferences->'%(WinMDPath)'->Distinct())" /> + + %(Midl.AdditionalOptions) %40"$(CppWinRTMidlResponseFile)" + + + + <_MidlrtParameters>@(_MidlReferencesDistinct->'/reference "%(WinMDPath)"',' ') + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + <_MdMergeDepth Condition="'$(CppWinRTNamespaceMergeDepth)' != ''">-n:$(CppWinRTNamespaceMergeDepth) + <_MdMergeDepth Condition="'$(_MdMergeDepth)' == ''">$(CppWinRTMergeDepth) + <_MdMergeDepth Condition="'$(_MdMergeDepth)' == '' And '$(CppWinRTRootNamespaceAutoMerge)' == 'true'">-n:$(RootNamespace.Split('.').length) + <_MdMergeDepth Condition="'$(_MdMergeDepth)' == '' And ('@(Page)' != '' Or '@(ApplicationDefinition)' != '')">-n:1 + <_MdMergeCommand>$(MdMergePath)mdmerge %40"$(CppWinRTMdMergeResponseFile)" + + + + <_MdMergeParameters Condition="'$(CppWinRTMergeNoValidate)'!='true'">-v + <_MdMergeParameters>$(_MdMergeParameters) @(CppWinRTMdMergeMetadataDirectories->'-metadata_dir "%(RelativeDir)."', ' ') + <_MdMergeParameters>$(_MdMergeParameters) @(CppWinRTMdMergeInputs->'-i "%(Identity)"', ' ') + <_MdMergeParameters>$(_MdMergeParameters) -o "$(CppWinRTMergedDir.TrimEnd('\'))" -partial $(_MdMergeDepth) + + + + + + + + + + + <_MdMergedOutput Remove="@(_MdMergedOutput)"/> + <_MdMergedOutput Include="$(CppWinRTMergedDir)*.winmd"/> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $(CppWinRTPath)cppwinrt %40"$(CppWinRTPlatformProjectionResponseFile)" + + + <_CppwinrtInputs Remove="@(_CppwinrtInputs)"/> + <_CppwinrtInputs Include="@(CppWinRTPlatformWinMDInputs)"/> + + + <_CppwinrtParameters>$(CppWinRTCommandVerbosity) $(CppWinRTParameters) + <_CppwinrtParameters>$(_CppwinrtParameters) @(_CppwinrtInputs->'-in "%(WinMDPath)"', ' ') + <_CppwinrtParameters>$(_CppwinrtParameters) -out "$(GeneratedFilesDir)." + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $(CppWinRTPath)cppwinrt %40"$(CppWinRTReferenceProjectionResponseFile)" + + + <_CppwinrtRefInputs Remove="@(_CppwinrtRefInputs)"/> + <_CppwinrtRefInputs Include="@(CppWinRTDirectWinMDReferences)"/> + <_CppwinrtRefInputs Include="@(CppWinRTDynamicProjectWinMDReferences)"/> + <_CppwinrtRefRefs Remove="@(_CppwinrtRefRefs)"/> + <_CppwinrtRefRefs Include="@(CppWinRTPlatformWinMDReferences)"/> + + + <_CppwinrtParameters>$(CppWinRTCommandVerbosity) $(CppWinRTParameters) + <_CppwinrtParameters>$(_CppwinrtParameters) @(_CppwinrtRefInputs->'-in "%(WinMDPath)"', ' ') + <_CppwinrtParameters>$(_CppwinrtParameters) @(_CppwinrtRefRefs->'-ref "%(WinMDPath)"', ' ') + <_CppwinrtParameters>$(_CppwinrtParameters) -out "$(GeneratedFilesDir)." + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + <_PCH>@(ClCompile->Metadata('PrecompiledHeaderFile')->Distinct()) + + + + true + $(_PCH) + + + -prefix + -pch $(CppWinRTPrecompiledHeader) + $(CppWinRTPath)cppwinrt %40"$(CppWinRTComponentProjectionResponseFile)" + + + + <_MdMergedOutput Remove="@(_MdMergedOutput)"/> + <_MdMergedOutput Include="$(CppWinRTMergedDir)*.winmd"/> + <_CppwinrtCompInputs Remove="@(_CppwinrtCompInputs)"/> + <_CppwinrtCompInputs Include="@(_MdMergedOutput)"> + %(_MdMergedOutput.FullPath) + + + <_CppwinrtCompInputs Include="@(CppWinRTStaticProjectWinMDReferences)" Condition="'$(ConfigurationType)' == 'StaticLibrary'"> + %(CppWinRTStaticProjectWinMDReferences.FullPath) + + <_CppwinrtCompRefs Remove="@(_CppwinrtCompRefs)"/> + <_CppwinrtCompRefs Include="@(CppWinRTDirectWinMDReferences)"/> + <_CppwinrtCompRefs Include="@(CppWinRTDynamicProjectWinMDReferences)"/> + <_CppwinrtCompRefs Include="@(CppWinRTPlatformWinMDReferences)"/> + + + <_CppwinrtParameters>$(CppWinRTCommandVerbosity) $(CppWinRTParameters) -overwrite -name $(RootNamespace) $(CppWinRTCommandPrecompiledHeader) $(CppWinRTCommandUsePrefixes) -comp "$(GeneratedFilesDir)sources" + <_CppwinrtParameters Condition="'$(CppWinRTOptimized)'=='true'">$(_CppwinrtParameters) -opt + <_CppwinrtParameters>$(_CppwinrtParameters) @(_CppwinrtCompInputs->'-in "%(WinMDPath)"', ' ') + <_CppwinrtParameters>$(_CppwinrtParameters) @(_CppwinrtCompRefs->'-ref "%(WinMDPath)"', ' ') + <_CppwinrtParameters>$(_CppwinrtParameters) -out "$(GeneratedFilesDir)." + + + + + + + + + + + + + + + + + + + + + + + + + + $(CppWinRTProjectWinMD) + + + + + + + %(AdditionalOptions) /bigobj + %(AdditionalOptions) /await + %(AdditionalIncludeDirectories);$(GeneratedFilesDir) + + + $(WindowsSDK_MetadataFoundationPath);%(AdditionalMetadataDirectories) + $(WindowsSDK_MetadataPath);%(AdditionalMetadataDirectories) + %(AdditionalOptions) /nomidl + + + %(AdditionalDependencies);WindowsApp.lib + %(AdditionalDependencies);$(CppWinRTPackageDir)build\native\lib\$(Platform)\cppwinrt_fast_forwarder.lib + + + + diff --git a/Microsoft.Windows.CppWinRT.2.0.210806.1/build/native/lib/arm/cppwinrt_fast_forwarder.lib b/Microsoft.Windows.CppWinRT.2.0.210806.1/build/native/lib/arm/cppwinrt_fast_forwarder.lib new file mode 100644 index 0000000000000000000000000000000000000000..18e1845062666bbe14e7080edfb364ca6341a10a GIT binary patch literal 323648 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%0D9~?FZ`^+c`YE;1pmo`&V?f7H8w-7H2ZG` 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 literal 0 HcmV?d00001 diff --git a/Microsoft.Windows.CppWinRT.2.0.210806.1/build/native/lib/win32/cppwinrt_fast_forwarder.lib b/Microsoft.Windows.CppWinRT.2.0.210806.1/build/native/lib/win32/cppwinrt_fast_forwarder.lib new file mode 100644 index 0000000000000000000000000000000000000000..6788f38bf24186d467d0b161ce1ac5314c281995 GIT binary patch literal 217970 zcmeFaf546P{l|Yvk|RlyB)^g*llz?OT<1Dhk|fC_Ns|2PPItPK?zl-NbDK<($z(Di zlgZ3vGR(}(%*@QpOcIi0GMP-0$@lrZ&gK4a_j(<#@4w&g@%ilYc8k#@o z@q$54pP_}%3>w_$i6{CDesah&{o{Fgd3WRqTjS!^gt*lewn^H zZk0C1#T|}|I~*5xI4 z9!v32Pe_ktLV7F{(qoyB9?OLESSF;$Qu;Ps>GXD`N>5O%yy>z9$bfvv?rM+~e zy>z9$l)j^+w3kU~FO$+C222xX)k?gFQs%^+RL=GmuYD))6!n1rM*l`dzqH@ zGA(|e(q5*ey_Ei9Anj!!?PVbCWgzWkAnj!!?PVbCWgzWkAb#`GUJBb1(kPtB6ZSHZ zC+uY+PuR;up0JmRJYg>rdBR>M@`Sxi=rP;@oW*=9YeOzhwai!VEm1ZATntfbp z_Hm`z$CYLu>9yXKW*=9YeOzg%aHZE^S9-~ErG|H!Pg0tFlG5yxlxCl#H2Wl_*(WK@K1pfzkzUr5((IFzW}l=q`y{1FBPqQwC#Bc1 zq*VJ!sU?$AsU*ecpfHUk#nV`P)Ww4&%|1zK_DM>!Pg0tFlG5yxlxCl#H2a8OT$+87 z((IFzW}l=q`y{2=Cn?Q7Non>;O0!Q=nthVe>?0mcY4%A!k9c}Wvrkf*eUj4blaywkq%`{^rP(Jb%|1zK_DM>!Pg0tF#PeO6 zeUj4blaywkq%`{^rP(Jb%|1zK_DM>!Pg0tFlG5xWK7pm#Cn?Q7Non>;O0!Q=nthVe z?30vcpQJSVB&FFWDa}4oBYD#7<4LoRC(S;dH2Zkc?BhwZk0;GOo;3S-((L0&vyW7# zo;3S-((L0&vyUguKAtrDc+%|SNwbe9%|4zq`*_mqBfUO&((L0&vyUguKAtrDc+%|S zNwbe9%|4zq`*_mq<4LoR^n&L}vyUguKAtrDc+%|SNwbe9%|4zq`*_mq<4LoRC(S<6 zD>!~*^PB%B@ubBC(S;dH2Zkc?BhwZk0;GOo;3S-((L0&vyUgu zKAtrDhzCxZeLQLQ@ubv=CCxr5Y4%A;vrkHzeNxiwlagkilr;NDMU#?dpOiHFq@>v= zCCxr5Y4%A;vrkHzeNxiwlagkilr;ND&6$#BpOiHFq@>v=CCxr5Y4%A;vrkHzeNxiw zgF7{R^F<>i%|6mgK}wo^Qqt^`l4hTjH2b8a*(W8wxy)m zCne23DQWgeNwZH%ntf8z?30papOiHFq@>v=CCxt4i*-txeNxiwlagkilr;OKq}d1e z1rbg;=_NcRz2c>$7l@SDr_$FED@l9?izmEzeu#%tntf8z?30papOiHFq@>wLTvD2S zQqt^`l4hTjH2b8a*(W8v=CCxr5Y4%A;vyb?oOS4Z(ntf8z?30papOiHFq@>v=CCxr5Y4%A;vrkHzeZ;f) zo0Z^86Ou!UPz?b!xxKJ>?!eSEj|mx zlSVwo^0y?s{n?ksAzvDYq+!aJ#vxxChkR)q@}+Uem&PGq8i#yo9P*`c$d|?;UmAzR z!y%1BzBCT`(m3Qx$P+A&?($YATmd2s9G!97>nU=<(v@{N-rEw@NjYDZ^97;>$P+A&? z($YATmd2s9G!99fpO(g$P+A&?($YATmd2s9G!98GVrgj{ zN=xHVS{jGa(m0fs#-X${4yC1WC@qacX=xlvOXHCAs+^X_p|ms(rKNEwEsaBIX&g#R z<4{@}htkqOla^lp)6&bOG-jm5mlv^(#qtuL>*7;GJd?x&FMprH75KC?4oP!US{jGa z(m0fs#-X${4yC1WC@qacX=xlvOXE;l8i&%-I3(`*H(##;X&efqaVU_+p+Fjk0%;ry zq;V*a#-TtOhXQFF3Z!vJdL#pB915gyD3HdXKpKYvX&efqaVU_+p+Fjk0%;ryq;W_( zH3MlJ3Z!u;kj9}v8ixXD915gyD3HdXKpKYvX&efqaY%Zu1=2VaNaIi-jYEMn4h7OU z6iDMxAdN$TG!6yQI21_ZkW?OlG!6yQI21_ZP#}#%fiw;U(l``I<4_=tLxD671=2Vq zwP7HQLxD671=2VaNaIi-jYEMn4h7OU6iDMxAdN$TG!9Ai9!TR*AdN$TG!6yQI21_Z zP#}#%fiw;U(l``I<4_=tL(=P2AdN$TG!6yQI21_ZP#}#%fiw;U(l``I<4_=tLxD67 zNiV>GG!6yQI21_ZP#}#%fiw;U(l``I<4_=tLxD8q1kz9-O%#FnA}YS-h!rh1npgnh z^F=(p#79H^=7l%#Nh1>f+W+g%+`umbpZ&~@a*pFXu-b7>m3N$Sx&O%>f!qh(q$K{Abm0M(1=GyJTT&M5f6)aRK$ZKe4FAq zAf5u^86chj;^Qwq{Nkf8KKSBeFFy3rqbWY{;^Qt|Y>SJJx^%HEE?sPkOBdVX(#5v8 zbg?ZiU2GE{4C!K9T)Nm6moB!&rHgHG>0(=4y4V(%F1E#`i*0e~Vq09g*e0G`(#5v8 zbg?ZiU2Ka>7u({}#kRO~u`MoLY>P`5+v3v2wzzb$O?P`5 z+v3v2wzzb$EiPSbi%S>V;?l)7@%b-ZY>P`5+wk$4LU~CS+v3v2wzzb$EiPSbi%S>V z;?l*oxOA~iEHvq2TU@%>7MCuz#ifgFap_`PT)Nm6moB!&rHgHG>0(=4y4WT*v~;m8 zE?sPkOBdVX(#5v8bg?ZiU2Ka>7u({}#kRO~u`MoLY!hE{q>F8F>0(=4y4V(%F1E#` zi*0e~Vq09g*cO*Aw#B83ZE@+sn)Di)y9@XEqjK&p++~i3H2dW4!d>PdNwZJxF5G1f zlJF0rgf#o)?!sN>z)7=D?k?PA4w5wc<<{(M4kMs}Ggf#o)?!tZk(ahb2yUg*B z{@s_m3wN1=Bt6}7ci}$oQ!;aR;VyH|NY{OGci}E`kfiHAxw~+eIY`oVpWI!z&u<@T z_Q~Ca`}`9rcNgw5$3vQZa(Ce_bC9IjCwCX_^V%nO7w$6Wj5Pb??!sN>AW5@N?k?PA z4w5wcztC_>zum_cbOw6z1LZK`*ccruXFA$++~iY z^j_!OUAW5}BIh5P(d zCU+O^^J+JD7w$5rhjeu)cNgw52T8g*l)DRenS&(#CVcKL+~>EC^pml)^qcT$X&g#R zSBKKlZ^Eag--J&~zX_j~eiJ?|{U&_wF5KromfyVVMD8x!=T}1RF5G2~hxE(wxw~+e zIY`nk$LH?CUFIMOzZ{>t3wN1gB;6P&cNgw52T8gyQ0^|=We$=w4(0B`ecm_}-i5o& zZMbo3E_}KcKH)m3f8L+Woww`PkC$$LH1z8u| zW34~j!<8K8%ZiS3hjYc9(cgRU?B9E(kK+t}J@a?YZsXq@fA0+!kMDf(xCd{zxP0qN z$H&HBJnBph{)ICiF24jgw0k*LbPjD_ekt*{<&}sH%VWgvmsciMF29U;cX<_J;quFg zpDwRT%vyd0@%r*=#H8g{5-%^WPK;iD6>xCanKNgW^J^X~qFqfZpw*=Hpj|`jOshp} zN4u8Rl2)7M(ypU5q1B<)qt&I=pw**Qrq!pFqcxzN_!@RS?J%t&Z6ECh+74PH+Gg5~ zv~@H*l+MAGG(MOI7t@;1=Fx7Z&7d`_JtmZCMH`Lx=!G_4vfpjD*ZN;`cT)`E77b{p*=ttD*_?RMHWS}WQ{ z+8wktwAQp`v^!}FX>Dk8Xm`=3(c01`((a~>p|zt8r`1J82Ko zw$QrM*3%xLt)lgyEurdyF=K)|b|o_BgFO zt$@~v_5`ghtskug?MYgkR!D11dx}$Z2;}eDHyBi;Bi_J?GWu*+Fsf~ z+IHF?+9p~tZ7ppuZ3S%zZ4vD`+FaUD+H~6Uv`MsKw6V1B&_>XP(~4;?&?PV!+Bn()+RLGL)%At zi?)L{m$sSqQ`$P(Jlaay+qA{B`LubopV4N}7SJZseoh-lTSyy8`vq+XZ4s?M?HyV^ zZ85DI?U%HUv?a7Qw0CI%Z7Hoe?N_u$v}Lr~wB@vFv=y|9v|rOse+gSjJ4X8r?I3Lx zZ4d3Yv~9H2w2idi(bmw`(3a7DPg_V^OPfRc18o{@9c?1*kF+tg^|ax%KhXx#HqiRf z{!Hsd+eqs|`wOi-Z4<2(?XNVCwwczH_BUDs+7?<(+TUqaXj^IJY5$;|JOSHAJ3{*> zZ9i>0Z71zL+7{Xl+Irgiv{kg7v?a6;X!B{iXtQX$X;Wx>Xya)g(nitt(uUGLq79(! zqxGeIOzTeDPwPbcgw~dJfYyTcFIt>-kk**?DXk9e5Uo1x-?U1!!?ZJBz&@iLryZdk zqWy=qmv)r4o%T6x6YUsnE$zRw6}02DMYJzyb7?1N(`jGQCecpP#?ro`ji8;P71RDl zE2N#K^`U)D>qp;Uz^3i{^ax|ZI5v>`mJgp(^Vp=U)1zJ_wCA12(inLS5VVBa5 z(kjso&|8 zdfH)HL)t#t4YVD!Mzqbe8)@rkjcF@sH_;Z;n$YIaZl=wkHKk3aeTz1Z){Hiib_;C? ztvRhfEsvH@i_^N%610vqm)3@sqy;pO)|{52HKO^n+O#yS8ZDqzq}@t8eGJxuc8qo# z?I5isZ4d2s+BRA%+D6(Pv^BKWv}LqAX$xs>Xme>Gq|K-GqRpc9rcI&sp^c|KN*hJXrwye& zMjJruOY2K}oYtLIK>1i| zS`qCK?OEDh+CbWN+928{S}|=cZ7^*GZ3t}C(?-#J+V^P9XrpNjX)n@h(Z)qX46g_ zf&GMbm^O#DkM8GGwr9eb+mc3m9)2Mi)r&|^JqV#&7duyO{V>vHjcKCHj?%W z+7Q|zT7TL*w0zoPS~uD+X&q@xXl-ck(gNC2T65a3XpLygXtim}Y1L>eXccL{rk(x_ zwvu*?_8Zzk+A7)}+HYywXsc-(X}_bbp{=1Uqy3(?khYdKhxP~BG}=1aMA{!|V`%GX z!)bq_4Ww-w3@WP)2h(6(#q5R zK|6UEwvBd#_D|Y=+IHGb+IzGuv>mkdwD)PNXgg_3Xdlq#({|Bj(RS0O(Du;A(>|n) zqV1&(rF}#jK-)*_OZ%ACowlFWiS`MtE$slU1?^w7IPD;JaQw+EH31+5uXOwu@Gowv~1nZ3C?eZ8hz3+EQ9o+5*}YwAr+3w5hZ!X%lGG zX`^XZ(T34#(28hR(+X%cX+3Dy&^ps<(c00jrM0Bhrn$81XiaE!X!U4yX*Fo|Xq9R8 zY2|1QXeT~}T~9kqYe?HiyMeZY)`+&5b|Y;atubvS?Izk{S`*ql+Rd~Xw5GJlv~SVI z(VEdl(r%#*p*5%Vr{&S|X>nRNT7uS*=F-~GlC*&4(VEjzv_>?aR-2ZlRig#8inLp4 zrw_tf(2mh=qaCERr0t>IPTNLnMcYWbgSLj&nzoE~Cv73E4Q&qXF4{C&TiQh0-Lx^Z zcC_KNduRh`?P>jJ-=_7Vb)a>j-Aijv>qu)wyN~A4I?q09} zdysbWU$CyUBeaKT`)S>1J82Kow$QrM*3%xLt)lgyEurq~o_)}2;B>qL8k)|S?f)`IpVElw+>HKsj9t3&Hgt4@2GR*5!% zcIE)=8QO7L5$zD|S=wIOK-zZNAlfEcF>NhvFl_~G2yGGVIoe#>P}+3b^R!8{VYIQd z@6bljhSQ2^FVG5UBWQhS-=%e>jihy;mC#z#M$vrQ_h`*%qiGFkFVbq!#?Y$LzE7(_ z8%sO&3G5}>QQA1#0ou#7U9|DEt+ZEY8)y?~t7$)=Eu~GQEug(hn@yWUn@am3Z31mF zZ8YsQ+A!J_S`qC>v;x{xS`XUmw9d3?w05)~(^}G|(_Gpcv?jC}w0g9ev>LQow92$M zY2|3MX(#r>enLA;n?u`2dyBS%HkY=U_EXwA+C17y+S|0nwE47ow4c#t&=$}p(|%4H zM_Wi6N&5wD2yGFqKkXe_K5a3r8||00jSggx3q1v)wGSY-_h34*3g#GeotFSTT7cm`vYwnZ5?eQ z?T@rEwDq*%v_H`X(l*fg(f&;9McYX0Li-D?J#7=M745GykG7fCl=e4T1KJi^P1@gS zRcKpjPnZ7uD;v=y}Dv_-TpXme>NXwzw5 z(k9VP(#F!hqK%-Pq7~ErM=PYAruCtHP3uZKL+e0u%EMaI%F%q{3N~=m+K)ZrAn^uiB zm3Ad<0(dFj@^-5$$SP0j(yj2kjbKXId>qgs2dziL`)}6MV_6Thitp{xhttV|htru+;tv787 ztq*NH?NQn&T0U(k?J?Q_T3=dU+T*nDv;tZu+7q<4w0^V}v?pnCS|P15?I~IvT7Oz~ z+S9a3v;nj;yI{}Ij?;>0hiK2z_Rjir5uHi9;sR!n<=R!AE`>qGl4tt)LLtplxu)|xho=F`4MYepMQYe;*MR*N=< zR+aXBS_Rrz+Nlp@(%zsoq0OMxqs^q% zpv|IHroBlkN1IJMu@m+a+F{xp+CJJ_v>mj$w9T}i($>-D(N@ylrY)w;r_H1Nj5dR| zfHs--bJ{rCLfS~$FK9z(i)j66@6hsTi)r0xzod1fEupocy-N#dOKHt%zoIpwEu+<@ zEvHqZt)Nw;{hD_Aeb`FcG1_lv2WhKlduYFZ7irwyn5i8he7f!2@qXId}XMp_rzUuf-Vn`o_Qf2Db}&9tVpztI}d zw$N(Q{!Xhx+e#}>`v>jh4%jx@5!yd#`)S*0J8AFHw$OIa*3;gnt)lIuEunotn@`(C zn?>7An?l<|8&CU?Hj1{FHk9@eZ2)Z_tuO6kT6fxhS|{2kw6?SZv=+2~(c-j&w8peg zX?19aXw_-|rd6UHrk!~Y_8ILs?Fj7KM9WEKbJTcnr^Czsc{?aNp3MjHNf z{I>e|KhYn)&yjyB;XeWW-`2A!35+AGp-VR;@wgvI^O6~m*WX$v+4JArtdO1guMz`o#(-~bR0OUY31CU6vpV^+eSZ`};?XHZQ+{+#GrAb*zA z4CK#SZUOl-k>((OZh>Q5!k;a~L0BJSHVI!8F(a z48W$~t)K_C09%2#f$hPTU>6XNVM#Br71$5F0~`pp28V-pg1pAl2Al}q1@c-69`h1j z&$t`pHHUT}uM6A*t^wPF{P*>@LH--K1IT};;v6aAza=|@{P*5{ApcF)39N{d?0&Es z*cq%1J^(fXaZZ&q2XW4q1YlRN4fqh)5$pzb10M$S!R}yx5a(dY5U>Y066^_b7U>0Y zUg!<-HN6kW*WE`!zBcBAeEoV1=OaO<1 zQ^DuK+2Am60r(woDL5Ql4ZZ+w0P&nF*$RFa+y#yV4}c~3-=p9t@D%txutEjL84Xqi zUj%D`W59;s_rYc$p1UPJ_!8I}90zs)Uk1B^0o#MCz%Jl#!Cv5Mupjt4a3Ht_91i{-90RTeCxU+fr-AFhIp80` zh2VN{8Tcn~4Y&c^2>uz|25toRfPVoGf}6l&;9tSh;AXJmrH=DAuo}1ptPTDhYy@rv zn}h!V18^JI2K*=35!?=T1K$Jl!5v_K@O^LyxDy-+egKXGcY%|^-QWyx4>%9}5L^uI z1y_O}f$PA1;AZe+a0j>_+y{OF9tID9C%}J!U$26usHzyly&_)Ct0<-k+mMPP*(UjMI{fRn&#;B@dxa4v|~>XJp^Rp1J+2Dlcy z8r%fd1h<3NfP2AO;34o@@Hki-JOf?_R;rBGf3P}O7pw!;0~>?&!8q6eYyn;mwgnr4 zoxmHw?qDOZFL)z30L1K2G8DWC90fK3$AdS6Q^2O+Ebv?4e6Sg~1iS@Y1vUrQgL&W< z5Hm>0PA~!P2VL+8m;_IP9$5Y|y#9k#Kp(6Lrojea05%101w9b6Oi3&7Hn2U|66^xr z4)y|Df&IWcz=2?Ea5#7;I0kG3P6Y1)r-5z3IpE#kLa-gU47>+i1GWb@g5L(WfgQj- z;Jx5Mup@X3ybnALVzw%&SOu^DU^TEaSQ~r*Yy@@zn}ZL60oWC613mJ2)5Y3;q-w0L}x4f^UPP z!1>^K@Mqu@Z~-_A{5d!uTnH`!e*vxn7lG@+cfc*+VsIz;OK?B91Uv%13!Vg*g5|5> z^&hMPE(2?V%fSZV3a}~oYtRE%f~~;cfbGFmU>ESWU@ver*bn?2I1pR|4hMe^jse$# z6Tv@#)4+A$9Pp3eLU28}4Ez(g2HXH{1pf?f12=+uz`uY8!A;;X@UP%$a5Gr(O1%Dq z)xa%aZSe14BXBF&9Q+3ufZM<};6K5R;C8SZ_#T)K?g0CP?}J0Yo#06D18^L;3!Dt@ z24{eKzt26hE2gMGluz(NrJW-TcOF9%0}Rl%{~72qVW8aN%i5}XTG z2N!`?fh)io;9Br%a1)4s`<846uL1XhwZKE*wcv5EHh2cS4y;rIum50mur62!tOqs* z>w|F+|AsDU0bUQb1sj5$z#G8sU?Z?Ecq2FfYzz(sZvsbwO~CQs&EOOe{}wNq1%3;h z4>kjrfVY6Fz~;>Z5KuJIF4samY8XOMZ3625VfD^&Hz-eGxa1MAkxDady zE(7lY*MPXjP_hyHHn#22a2$wh9wn2(-rx+d4>%8e6kH7E zgDb(uz;$3>a5MNgxC1Nz_kmA0EdE8!RNu*;4p9j_#JR5h-*0| ztHBq*4d4iHEBIY-7dR3;0G5D9!BOBT@Oxl|T6p~jtAa0rwZJi8L-6}xGjJ^EgD-)t z!Es;*@MW+oI3DZ+z5*746To8d2jB>BA~+U&6`TZ40;hvN1m}X2!A0O};0kaGxEA~o zxCxvJZUFL*S3W$H4*cf~hjDxem7T{07w%{DF z6ZjU`9h?jH1%C<-0Ox^2!MDLt;CygA_%m<{xB#35{v4bSE(Di=zW`T(i@^2ZJKz>@ zF}M@_CAc440v-Y11y6!Y!Sc27`VUqCmw`3G<9i190;xfhl9Td$AD|WiQpf=Y2Z3=4){lKA-En~2L1_L18x8}f`10Lfg8a+ z;9tOl;3n`G_*d{WxEZW?9bW&zYTy>IHu!h25x5m>4*mlSz-?d~@Sk8ua68xyd=JbA zcYyuD_rW3HPH-gn0XPoa1x^NcgEPQA;5_g{a51)L5?la&1ug|ofvds)fg8Zn;8yT!a2I$6JOJWCf5}m> z9C!-62&_;So58B!#b7P40@x6|1Z)Q4+HHvsUJAAbD}f!r7}yo84E6yp0}H__U@>?( zI0CE+js>p(CxN&ITrwTJ5}XTG2N!`?fh)io;9Br%a1&S)+zws??geXshrnyW;~=gj zmz)8w11r_T>pxf>tP9ow>w%5I`d}Pv0JZ?H2it-T!A{@}V0RGLq)YmOH-ZDe#^6x! zCU6wk1RM|E3{C-?g0sMHf%Cy;;1ci_a21Ga+a>G4Ja7vb2X}%Aa6jmRN5CX_67<0G z_3`=-RsnsmCYS~rfVf6p(iFTE^uQKiEATe3J=hZL0^Sbx0$YLoz&pT!U~6zVcqcdp zYy(aN?*gZRZNWL<-QYs79k>j<2V4WT2RDM>2DgD7z&+r-;6V`A>`RV;_kpLuPGH3b zc>M>fft|tH-~(VIunX86d=L!4u3#JRA+RHeYyTzPz=y$nushfvd;}Z<_5eqMJ;8Bc zFK{y08=L|50q22_f{Q`?454Ht_!zhj>ipL3Ggu34?F=r36{Gaum50W z@F}nch@VB2)B~Ren}7pA7kmb62^N9vz-PhE;6ShkI0!5Ni@_prFgOgv&ooL#gU^8z zz@gw&@Of}HI1F3>eg|9%4hL6*FMu1s5#UzvyWlPmKN~4I0G5D9!BOBT@Oxl|hIsu4 ztAa0rwZJi8L-6}xGjJ^EgD-)t!Es;*@MW+oI3DZ+z5*746To8d2jB>BA~+U&6`TZ4 z0;hvN1m}X2!A0O};0kaGxEA~oxCxvJZUFL*S3W$H4*cf~hjDxem7T{07w%{DF6ZjU`9h?jH1%C<-0Ox^2!MDLt;CygA_%m<{xB#35 z{v4bSE(Di=zW`T(i@^2ZJKz>@F}M@_CAc440v-Y11y6!Y!Sapp`VUqCmw`3G<9i190;xfhl9Td$AD|WiQpf=Y2Z3=4){lK zA-En~2L1_L18x8}f`10Lfg8a+;9tOl;3n`G_*d{WxEZW?BVPZ(YTy>IHu!h25x5m> z4*mlSz-?d~@Sk8ua68xyd=JbAcYyuD_rW3HPH-gn0XPoa1x^NcgEPQA;5_g{a51)L5?la&1s-+qyg$RA zL6^go7IgSG-p(N0vB`ICt5zO=`4T3=KbPZ&<_`}+br<#>R8(B_#NhfjJ21;zDmdOn?M z()0foeW@J=CV>gGEJ87x(Pg1sYG@ zk_c{b^YUE3=VOJ>^t`92c<{sNR8K6~bHLNL@aq*1>g#;t-5U6D_!Z%yIJ=7HI#>b4C3N?k*ZM zG=I?JIK2GY=`zuZQIxFsf6+4Ed@B0Rv!!`uH2PB}&CiCs(ATc4rqhOW6*YbKkOgJ- z``ibus-Dh^zIe8HH8mdI=9hb(EzT>+%5k%N^%`nCWr^2RL>&O(QiPe#p^<;{17qeCSe^Z@!5d z_bl$%iid%<2opTdMK!;|nenZ>7e=kG#52ytNunXov3H)259Yk8AOBPaFOq zQ9g9xCkS8Yn{TJa!<)%pDBfO;`>x@n?V!d}mUu@s9)7C%g}!{UK=Ny}I7tj1kS zyo(x7Xz_DTo33g+uEoziZMv!PfcK8R(4p(D#>0;rxKO-@8uu+k=vc=);Z z7y9P&)p*kK)%&V(*Ag#Ku~ zO%d`FHoQ&sh2lkOJmneA`GIOY{QQ>-ef45B9)4!vh2lfhxNG_5hpO>}7C-m28K%bL zTKwF{eYhGAKdbdZ`#wUAhaXvTq4-EO?w|b!Y_@-hjZ)*`=NMn;tB+RW;pazRC_YAw zCoSLnST*ii;^WkKLW`e!+KgA@aV>uCX){5M2WPJxWP9Kys`0cXK1q%HmiS~fp0dQJ zsBzB{pQ^@_miRO^9)A4Bg-+V(YCNHR^>a^~8EQPP#m_x$W~uSu>_ww&r_F3N9^U8w zLi;{Pjr*3bK39#0AE0%iuRc$Whab9nq4<0?p0s@P3)Hx4i7!;+2`zr^X|qU;$F=ym zr_EwD9$2mxE>YuYOMIys_bu^dYCL6$uTbNjCB9OPCoS<+YTUKNSF7=a7C-m2S);~F zugu??G{&@#M$!e^}KKS`Wy6o>6PMaUw@;XFTGTpEx$?6mtHH* zmfx)BOD`5@%Wu*1rB{oy<+tkj(#yr!^4s)$p5^h|uI3YgCBH+@o6f(Tdfs&Y?b7q6 z^KXxyH=Tcb^}Ol)+o$JE=ih!kZ#w@D=y}umcTmrp&c8!y-ZhfJ{)OHMpx=S}BdB|UFC|0?Tw)A`5WG*XVA>HMpz=S}BdH9c=S z|EjBb&vgFP(DSDAkH4WMA3x7@{?*d+rt`11o;RI;b@aUH{Hv$uP3IqfvrRdErt`0% zo;RI;jr6?f{A;Y{H7|{OmoZ=gnh%H~b|*ILh;`mc?iH}zjzJ#Xs2c6#2_fBel|<@lNUuY;a9 z^UmTDb<^{v{_C#iP5swH&zt(Mm!3EEUmrbh z>c4zFZ|c9kYTh^XUxA)C^v>cE4bk(a{u`?1T~q%J)AOeO;~gF3c7c)-qe3n^t`G6rs{c9|4q~L zrv96*=S}@LL(iM~Zv>cEEzt9({#&T$ zP5rk>&zt&hv7R^e-x4(+nEG$2o;UU1GCgnVzZH7k)PF1Wys7_I>3LKCt=99V{#&Ex zP5rl4&zt&hot`)K-+DFgnfh;oo;UU1Mm=xpzfF4H)PI}xys7`T=y_BBZPoLp{@bSK zP5rlB&zt&hhn_d}-%d3jFa5=(Y}XHW>G|~8Ux3M$-=pVCe|0Haey^TSS-$>0Jzx6E zOWD5uem$SGeEkD@zVz3ZvVHx7dOl(K`iJy<=`S#4`}&9Ve4gd&A5rruQ~w>+^QQhg zrsqxlcU;e#`tO9EH}&61J#Xs2Q+nRif2Z}lssGOCc~k$D!yOjo>lZ0g|CLws2~+=7 z(DSDL;~g&L?>}Mcze;-E)PI%rys7`H=y_BBRn_yR{;Q_vP5oD0&zt(MhMqU|Urjad zoBFSoo;UR$@2D!Df4-^z>gah>|JBp;rv7W7=S}_BP|utCk9VR~j-RRj8tZve|25I` zrv7WH=3P_&HPiE^{^K2d<>Tj?`Y*2MP5tNUc~k#+dfwE3zMePrU!dnr{ntXzoBFS% zo;UShD>a`s^c8%K-qe3R^t`G6dg*yn|Mk)HrvBrd-R1Ky zY3jeedfwE31$w@;|FYc~te={X=apW-%(g&bmIX?$U}jr@_r#ZvU_8%s33GtDKwzry zB0X=a@PT^XRN=*X-c;d3^t`FUhw6D#g%8v7rV1af=S>wpLeHBjoFBp!bhoj z&s5=~^}MOV$LM)eg^$(qrV1aY=S>wpUeB8sP~dfrswll6RQg=f12 zIz`RLOK;+oEk9Myr_bIDC|iD-o-e(PQ?~qcJ)g3C{TX_`^hQqEzWyvdpR|1a*?PY8 zR!-Tz{v17@uzdZwdcO2#PT9WxJUyRh`TFzKe9F{+3-r9H{}$?bQ~xc}^QQh=tmjSr zw?xmI`fsV8H}&5#J#Xs26?)#(e=GI8ssC1~`Gl$eR_l3F|EOF&_1`W%Z|c82dfwE3d-c4j|Muy5Q~&K(^RB7?4(NGP{~grxrv5vm=S}^0SkIgK z?}(l^_1{rFZ|c8edfwE3$Mw9a|4!(6Q~#Y*^J!E6oznBB{yVMbP5pO9&zt&>AFe20 zKS-PUue_c&^n%#&zmYd(DSAWZ=vQrQ-$;MiskdqGgWviJ#VV;)_UGl;cfK1slwapc~gb+ zbDovsXR7e_dfrsw9rV1Z!aM5u(hARZ3AB@%kC)!iK3l%Co-e(leYSiTJzsiD`)v8H zdcO3Y_Sy2?^nB?}?X%^(>-o~V+Gor2bH(NJFJ5|E`)v7MdcO3&_Sy1%^nB@!?X%_c z^?csh8{=oo_f_*LQ~&Yv*yZDwGWB0SJ#Xs2LOpNlzy5mO)PDo?ys7{AIrhr&Gxgs< zJ#Xs2Vm)u_zae_w)PF3ZJOe>3#FssCoFdDql`v-P~G|K{jc6de-qe5F z^t`G6w(EIQ|LxH8rTv%f0`^Wdk4xxhe~mla0=u#-P4$q}%U9O(rJwGZEnh{?mwvowwtQ7RU;6o;+49x&eCY>#X3JOC^QE8g znJr&K&zFA0XSRGzJzx46pV{)Y^nB@ud}hnn*7JF1KO{6;zK)ttnfkAuo;USh13ho* zzlM6=)PIfiys7^h>v>cEHPQ2?{%fk|P5swQ&zt(Mxt=%mUtG;6O#SETc~k#+dfwE3 zzMePrU!dnr{ntXzoBFS%o;UShD?M-Ozt(!*)PHUCys7`%s(Ihkf9>?VssGyRc~k#& z(DSDL>!{~V{nts)oBFS_o;USh7d>z4zpi@T)PLRdys7`Xt9jSde?9cPssDQEc~k%O z(etMM%h&U!{_CsfP5oD(=S}_BPtTkBuTamM`mev9H}&5DHJ>*1Uy+_S_1{1}Z|c8d zJ#Xs2A$s1_e?#@WssD!Qc~k!l*Yl?S8=>b-{Wnt2oBD5*nopYgZ?v8__1_phZ|c9X zdfwE3v>a!FVXX+3SX+{O%=XO&zmZIg`PK6_)0x*s_<2M z-c;eM^}MOV*Xa4u3eR>4bFG?>2dO*qoQs@GoNW1ZdOmH*uh;XwCBH$>r!4u6dfv0- zH|hDLCBIqEyO#VGJ)f}Tx9a)0CBIG2=UMXG)qKj-e>?QNssDEBc~k%G((|VN+oR`A z{kK=ooBD5`o;UU1em!sMzXN*S)PD!{ys7^VsriJd{|@VUQ~w>&^QQhgs^?ApcTCTl z`tP`&H}&5MJ#Xs2lX~9Nf2Z`kssB#vc~k$LQS-j3|H{?S-U8s8`mem6H}ziyJ#Xs2 zihADEf0gvSssAeLc~k#Y(etMMtE%Ts{Z~!ToBFT1ns-h8S3}R6`md&*H}zjFJ#Xs2 z+Irs9e|7Y{ssHNfc~k#2(DSDLYpCZ<{ntp(oBFS@nopbhuZf;F^v>cE1$y4pe=XE}($s$~^}MP7TIqRH|Fzchrv7WA z=S}_BR?nOIubrMZ^I^GYv3W?P_hmIX{#AiJmw z1f~Y=s^?7&+)dA$8o0ZjH#Kk%J#T8@UV7ftzUmQG7wCCY1NT$& zo~eNg^}MNp`|EjA0}s&irUow3^QHzKsOL=$T&(9!4Ln58n;Lkio;Nk{Fg;(|z}c=~ z4_EW?z&Bh0AED>dmi$OP?_2Vt^nA*aAFby-OMZ-=Pg?S0^}K7zkJIxBOMbkbk6ZE+ z^n9KrKT*x6O#L@W&zt&hvYt2f-xNJ>>c6Ra-qe57^t`G6rt5iA|IN_zrv96y=S}@L zThE*NZ;qNznEG$7o;UU1JUwsfzxjIJ)PD=~ys7^d>UmTDEzys7`z=y_BBt=03U{#&Q#P5rlC&zt&h zgPu3_-$pg>n)+{(o;UU1W<77}zb$&+)PGy`ys7`T>3LKCZP)Xr{@bDFP5rl1&zt&h zm!3EE-ySueHuc|LJ#Xs2eR|&1fBW^kss9e>c~k!#)bpnPJEZ4L{dZW;oBHpFo;UU1 zQ9W;bscSg^f`mfy8+B*P}rv59h z=S}@rLC=@=U$zU_71cbhfS>&>>}(5E%Cdmz3S?z!{~V{nts)oBFS_o;USh7d>z4zpi@T)PLRdys7`X>v>cE^-%K(Q~&kS^QQjmqvuWi zm#^nd{nuB|oBFRn&zt(MpPo1MU!k5i^b-{Wnt2oBD5*o;UU1Xf^Me`frS$H}&6GJ#Xs2 zaeCg=f8+JMssASEc~k#Q)bpnPo22JW{Wn?9oBD5xo;UU1R5hPA_1`o-Z|cA4dfwE3 zGxWTv|7PiVQ~%A@^QQirqvuWiH&@S_`fr||H}&6qJ#Xs21!_KN>c540-qe4K^t`G6 z7VCLa|1Ht;rv6*1=S}^$OwXJ8Z-t&W_1{W8Z|c8QdcL&(vR%Mlt>$qB{Om7LXIo%R zmIX{#AlIr31f~XFr{_%#yk5_n8hC@AH#P7^J#T8@O?uwcz?=2Fse!lXc~b*#)$^tX z-lpeG4ZK~=d!`27q32Bvyi?Dc8hDqUH#P7cJ#T8@y?Wl%!29&Pse$+Fc~b))(DSAS zKB(tQ8#vn)@Iz`o9t4If;D_~m+LAw_=Y325sGd(*^2hYNXUQMe^GQqogr0XT`ICA+ zVacD;^Knc5w4Tqi3LKCRo3&S z{;Q(rP5oC@&zt(Mnw~fHUv)K~F!f&zJ#Xs2ntI;Uf3@_yssC#0c~k$@(etMMtEcBp z{ntRxoBFSzo;UShBRy~Gzs73bH}zi=J#Xs2rh4Agf6er~ssEbmc~k$z^}MP7Ts?2< zKTpq_`p?(%rv3}`ys7_MsCn1ae=YUAssCE(c~k$j*7K(RYoq5){nu8{oBFSvo;USh zdp&RJzYcod)PEiIys7^>srj_2|2pe=Q~!0*^QQjms^?Ap*GUmTD_1E*J{u`j@P5oD-=S}@L zP|utCuUOBU`frGyFYUi<7qEw_d0YWM`%Bc>78sUg0n-)8;pzf`sewo6c~b+A)bpkW z9;N3^4Ln-Un;LkGo;Nk{SUqoQ;Bk81)WGBQys3dF=y_8EPgL`ssevcyc~b*V*7K$Y zo}%YX4LnuPn;LkUo;Nk{bUkls;2C<})WEa!ys3d_>-o|K&UOWSj+#%I&cC^O-gN%W z)AOeDZ@!*4oqr4Tyy^T~sOL@R-y%J4I{y~ydDHo~M9-VfzomNKbp9<<^S_Z#w^0>3P%nw_4Ae&c8K!-gN%0)$^wFZ=Ieuoqy}~yy^Vgpyy5J-$pf`Hl2T) z^t|c(+pOnJ=ie4RZ#w_B>Uq=ow@uHR&cE$?-gN%$(DSDAZ>OF&oqxOZeChd@?H@3E z)I9zLboQ5MvMsPT%L1kebf3CFV0s4Z*Yl=lzyUpPdIlWS^QLFOAw6$;1{~J&rf0wr zJ#Tsj9M$utXTUK%Z+ZqC*Yl;%fLHNj>Ps$moXXB?k;R-d4IHOjxUKy48H+i0z)qCs z-@7Zam@^7i8L7(7n8;$zZ(x^&+kO{W%=rpdCEWIPWHBe*&~Yvgx7`+5%y|x0HQe@{ z$YRdBut&pf%Oi_9$6ybI+fGCla}qZ=&b{HbRAez{AneX?+mOg&&O5Mlxb5A@V$KoR zE#bCfk;R-_8aWRB3-&D$S7``CB=fcQh z&RekB;kLIUi#hvX)xvEDB8xfK-{d%th1+h7Eav3H9uBt^L>6=2gxwczdn>Y-vj=up zxNTo#F{f@52cJ^J@8$Z)VoonuUbrnkvY7J*3_FFt_hw`6 zi?DX#wwEG{Ics4p!)@y$i#ZqJ#BjrHmqZqGTElPx;CpEsS z*k6a+>P8lG9)Z0RZtERc%=t0wr{T7lkzqa98=3VY!+I#cA7<8z4C}#O%B&X|)`NXF zvtDFa4>mZnUSwDg#q?BWy~wa0?51+u-`YNl$gm#lKjF6Ckzqa9C*ii4kzqa92jRBekzu_%9p~@i zwz`pFJ=mYZZM`GIda&Py+h#_F^;Vd9^z-tcRiG+u^plkzqa99pSd#kzqYpD%>_RGOP#tR%X4(upS16>oe;`hV@|A zWY&ue>%lJ1tQQ&9gI%0iFEXr$7xS+&`x_b7gROJI=SO5%54JMgHZwA;2U{F&+Z`F! z!wc=aa9iETupVqiX1&O;9&B=Ey~wa0Y+Po&$gmz>1V?7piwx_*hGf=@4C}%AXV!}h z>%o?1_BS%DhZm?{gxl&yhV@`?h1+^ZhV@`S4!6yW4C}#O&8!z0*29a(_cQB7hV@`C zWY&ue>%j(P){6}5!Jf>l7a7(=vG>lb7a7)rHOZWRkzqYpz0CO+8Plk7a7)r{Wo*`BEx!}9Ou)_@rw-W z!9EPP^^Oed!Ty<9FEXqL`%7lM$gtl1j`RD>dXZs0*o4gSiwx_*Mu*#GMuzoZ!@_O5 zBg1-~9j7SVRyQ)N2P?>|7a7)r^~kIj8PsX1&O;9?Z?G z7a7)rm1G`|$go})$9XREctnQvU{7ZrkI1kd?6Gj$%*e1F?BUFMkzqXyT=!+xiwx_* z?#iqe8PtQQ&9!!UGXX1&O;9_(mlejSTC-c7@w^M~3wt za-6N%smOZtEQx)`R^q+%_{ZtOxr|X1&O;UU$d&WoEs|upaE~ z%zBYwJ=o05dXZs0*lU^fBEx!*IL^zN^&-Q1u&$ZsTVz-d)*dX1&O;UQb-l$*dO{)`L~ZtQQ&9gPqDe9+6=^ z*dH_f7a7*;g=3oOzsRs2?3bDTiwx_*-p=%2WLOV2GqYY~Sg$vZX=c61upaE?%zBYw zJy=P&ZDwRx5B6NRZFgi?uMeK9;kLSwVLjN2%>G7(^lsRUSwD=-*JjF>qUn3V1=3WBEx#HKAH6*!+Nlr z%Z0BWkzu{Z@bB7iTiwX89_;FHTkpuQ9_+Gk+sw$Y9_*rU+wRD)USG%g(&5*r8yVJv zeHL!(9U0bxeH?C^85!1ty&rDd9U0bp9M9FvdXZs0Se^3x8oeXKda&x@wwaM(Jy@l1 z+wRD)UV-DBxhVYpBEx#HW&G$gm!4Z@6uDWLWPB$Jw4)FEXqL+mu-^ zGOPz%n^`Y1tOxr+=J-X1_4+x^i{ZAqkzqa9cfxJGBg1;IXTxnXBg1;ICo=0rhV`Dr z^^(kbkzqa91DW+A`+w@X6L>4fw*BL4D`Asa<_02?ZLfRHnGz8~rp(fuG)aY!Ia8)g znU$21B!tW}A<8_Z5+zA8WqyD6b)D~jIsfl@KA-pfJcsYI9d)f`wT|wUebYzk82cpA zN7^g)Nuuvmu9w6Gqyh2ykVIcUuKxvVDv3VQaj{PleWb%; zpCtN79b%s(`cC8eU+j}aA1NFAB+*A|75gO7M_LunD~UdSF<2VUD~UeR{9q?bqL1`` zu)8GDN17e`B+)k@lX*V&NurN5GxkZMk2E#*NurN5KK4nXZ(t@fHug!PkF-X^@cNL% z^$61HaNfHm)n+~?tq8V264y5dWinp}YaxkizNF8Bb(2(^xsxeGnJ-AM1zRYI zzQLKyGqFz+eWXWXpCtN7lVhJG`bc-jK1uYQp2^%4`y|mvx+?ZbqL0)iyxzu1qL0)m z*g{G44dL^JU@aukM=A&FCW$^$UF?%YAE{;RlSJPce7+F-B+*COF!o8JkJKpkNurPR zS9mTLN}_Klk7@YzuZ1M~NY4c8CW$`MBf-W=qK`B=*g{G44dXG5eUj)S-4y#I(MP%} z_DQ0TbYbk1L?3UUXU0BB^pW@nlwY5_NurN5E1p*peWdBZ7D}RzvWdZ3NTQE)N3d>^ z=p&7ZeUj)ST^{=+(RUWtxniFr`ba}#pCtN7{bHXa`bek5K1uYQ&2`rB9JP={AE`yK zZj$IDZ60i#B>G5=gDsRq--t}6LF|)6AL;k__(`IV^h2<5lISCS9c-Z_`p)6C8mxsR z`bcwQpCtN7P2=lL5`Cmi8MBjN_ zuM5^f5`CnPgLRWcA8AhPlSCis<=7{QzLA;Cwej(jL?7wWVBI9qM>;3iI7#%8P7k(F z5`E`${XX_dqK|Y^?2|+v>B!h8i9XVSu}>0x7jXSP_DQ0TRET|&=p$VepASj&kKUI8N%WD9kA0HpBXy2_lIXjL>yEKc5`CmSVxJ`XNJ;FIL?3CV z*e8j;i!+&@YSPz!3rX~mz75t*5`CmEgN>6!AL)Z&3nkHaNhb4V?2|+v>4n%Qi9XWf zu}>0xqz7Z4B>FDRWbTc9lISDd8v7*CM{3Y8J;yjnd>%mhy+LY=B-Lh`jpB6~Y3J7RqVEbm?+(^d5`Cn7gY}d|AE^>-f+YG# zyTv|9^j*p4-LX#+eWa~ppCtN78^u0J^pVzzeUj+oP3!OQT(*=%AL;c>dXAow=p#KF zY=R{ENRI|vEQ!9+Jf^`~N}`W+Pq3bn=p)@6Y=R{ENcv~F}kHjd$CP<=>^i({rB>Jx58gj6flISB%3f5B+eWW{sO^`$%>4w-RiN0&Oh8+7O z(MLKz_DQ0TG%WT>qK|Z1?2|;_b^JMs*e8iTQk(D`^^`;(X}e$(B+*COBG_U{^j*(& z`S|=wqL0)t_DQ0T^hbRBB+*A&8Emm6`o{2D4c1Z;eWcHW^^`;(X*PA5zNHy{GCW$`MZ}IVyMBj~ELynK1B>G5S1?wq^KGG+_CP<=> z^iJ%PMBhz(HWB+I(MP&2K7NwuBaI3+K@xqWbAv6GL?8dq4++*%5`Cn;u}>0xq?2Qx zB>G54#Xd>&-NNTRu}>0xq;|1S5`Cm%?2|+v>Eif&NTP2n*O24$A&EZHp!j@9qL0)o zJ|B|kBb^ZYB++*(*N|hMB>G4P#6C&%k@k#zlISDlVxJ`XZsW6w*e8iT($Dd{lISBX zi|3U@A8A3b#ggc|o$Ky5`A~@c~9(9*J>i9S-p@E*EY5}(K4$?GzlcLzzeneL>O!Fo&L^L^5iV3Q>AXP!u31Y07hHnaU* zTz?MMN>Xj62kDJqeI(IGdM@@!qL1`g?2|;_-CTc;eUj)Sjf;Jf=p)?{`y|mvx;pkr zqVFEA>4(=_D@pW`4h_~v5`Coof=!Y{AE|AyC6eeH$2I+6tt8P$+A&xkN%WDn2{uU* zeWZ49K< zB+*CWCz19^qL0K27h58Uz6m_0u}>0xq>E#pB>G5a$398)kp{&+N%Y;v_2)IxAET8d z`baZ^^^rs$>Hc7oB+*B@E7%fA^iAaYbL^8uAL+{2Cy74N1+h;OeWc;BPZE8Txc(gb zB+*Ce9{VKGN7^+!N0TJcN7_Ev5=r#k&o%vEtt8P$+8|gTN%WD{jD3>mBmEg4KS}gW z=Ch(;tt8P$S`w^}B>G5S1e+v@KGJ)!PZE8MtL6>D^C5{oQj=hPB+*A&FW4kW^pVyG zwnP$r{DZbSK7NwuBdv&!pCtN7i-S#)L?7wXU`r&?H0xq*r5~B>G6#$Hz|+ zeWc5REs;dugIv=O)=Cn6q%(r`kwhQq)YvD9K2q1%CyBmkd{z|uB+*AYIQB`RkF-zh zlSCh>6#FF6_Yl{g zW9*YeA8D`HCyBm?x&9pcB+*A|9s4BFNBSk6R}y`s@8WqS(Kmx@`oUUBqL1`Zus)LL zBfTB_B+*BDDfUUC?-4#LihYvkBRv%RB+*B@FZM~Ik92$NlSJR6ye=Dt*M}tjJRIrI zaNfR>YBTqdehfBQ5`Vsqv^3Z;In6iM`v zIs{uLiM}WJJRn$WN%WDju}>0xq*k#{5`Cm?W1l4Yp5$|;*e8iT(mJtE5`Cn9!*e-B z5`CoE;n%-qlIWYoV;ZcrB>G4^AiPKQlSChhUqrAelISCi54KDaeNXY2#y&~(k*UYuk+X^i9XUZ@w}4gBRvvqiX{3-lY=djMBg)9e-74K5`Cnb zVxJ`XNLR%^N%WB}jD3>mdzS0Zu}>0xqye!{5`Cl|u}>0xq`L4NEt5nagQjJ$){^KW zZ56DaB>G4j#^+ZOeWXUQPZE94b4@=!ev;@TtqRsp5`Cnl!KO%}k2F8nGD-Bkz-u*F zYf1ExT7=h3KS}hFHV-yM5`Cn`!Inv)??tY21#2ydKGN^uvFay@KGF}trbwcX^mVXh zlIVMh>(9YjOQMf7H&{PO^pRc*HboMBq%k$=KjX_J(f2af^nkOo^pV=fK1uYw%4bEfPZE8kOB;mOuO#|N z=LDM~i9XWl!Inv)?=`MJ2Wu^fKGI3CPZE8kBV(T=`bY=HK1uYw&h_WmCy72%A@)h4 zkF-ndlSCis*LYq@^u56~{ditU^pO??>nDjm(#OH3NTQE4C-zCAk6#d9j(w8oBh89^ zlISB%kA0HpBTbBblIVMr&x&H7B>G5y#q&zy&!dx81$#hJZDuLy+hEHj)n;~ji|f?E z+DPKhx05~y)?X6;&JXF$U{fX0M|vUlNuuvmBi$SOB+*B@HTFrO zZw{Y-#6C&%k&X|qt^SheBXtfoRT6!q{evx+MBh7H`w!Me5`Cm3_DQ0Tv{USpL?5YX z?2|;_yL_e;`y|mvs*Qb;=p$ufpCtN7JQ4hQuv`*-b9qdIwUI<0i8p+{uD>MuNDl^^ zDv3VQy|GUcee-xsW1l4YNY}UCuj$w)i9XV^@w}4gBRv|= zD~UeRlwivx(Z?_L_XKMri9XWJu}>0xq|vcY5`CnLVxJ`XKHyq&?2|+vX<+P=L?5YV z?2|+vX}9p&S}uvc54nCHtc@i4NLvT%FNr?VM!}{^qK~vz?2|;_M_j*;kDny^NIwPZ zFNr?Vx51`LqL1`tu;r5I`6=`V>s(iXv{N}`Xnez4_|==+3gTEW^# zqL1`PeEcNQM_L&lKS}hFz6rKm5`CX?tvOg5N%WEC#Xd>&kzS8|lISDd5FbBD^nJ$l z`(SM((MLKzSbs_Mk%k4EDv3VQX|YcdeV=pvKK4nXk917zlSCiskk}`QKGMFiPZE7! z@VQXzlSChBRD3=p(MLKrJ|B|kBMphqha~zKNPXk;A&EZH$+1roeWasepCtN72gN=~ z^zjc+yVxg*K2kCENurO`CiY39kMvtSuO#{waQ!}>R}y`suY&cLL?7vsU{fX0M|vmr zNuqBd*YAV1kwhQqsbKvj(MNhX*i=dMktPLOE{VQHd@dBMjU@U=f5-Dms?AI${S@p$ zN&Nd@q-DWYNaEj-{VJ1L5Ufs8ZKfaT!(am?)n=xU-U>EN5`Cl>gRPK6-(s#w2dk4r zA8A^!fs*JWO$atk5`CoGf~}B5-`9NB5&I<3M>=7R^!;O?B>G5)2b(5|KGFffR!E}n z8?N&QtCK_@DHr=B(MQ@j_DQ0T)GYQ%qHhVGAH_aN^pVz$eUj)S)xG4bVxJ`X_(k`&*e8iT(si*<5`Cmmu}>0xq;q4R zB>I-|nvQ*v=p#KB&nt;O(qr+wlISBn5Nw4c`o813anVHCUY_`bgWy*PA5z zNL$9&nGlz{VKlRB+*CuGd_Nj=p+3YA3sU-k(LBoA&I^pxvm_nP7-~j z_hO$U`bclYK1uYEZj6tgB>Glytv*G4f1RE%cKGN`D(L2?g(Z^8f9{VKG zM>;n4NurN*XzY_jA8EhXCy73u$hNUh5`Co0;`1SiKGJ#d`H(~(>5TY%NTTl-t}Dmq zLlS+YuCY%NeWasfpCtN72gg21^!>_p<=7{QK2j<6NurOmYwVLmA8BG5C$398)k!Hj`N%WEKkA0Hp`<>5# zVxJ`XNdLt1O5)$2CjA`jAxX8F<)rU|t&~)oY4ZoypM%v);@`(6eH3i4B)&%l>Fr?C zCDBKEDfUUC?@z8j$398)ksgYDlISDd7yBg9N4h=sNuuvBKG%qSlISCy7+zb0CDBJZ zBG`0E^pQFSTPcaYzqzI#tX>j*qMj4F%4EPi9XVk!3ImBkMvNm>5}Lp-52{L(U+;o+#dTR(MP&I z_DQ0TbXn|^L?7wA*e8j;nwrcRu}>0xr03&#CDBKk8P6+;KGM`+D<#plMongXuzE@K zk;cY8N%WDfiG7mjBV7{vB+=KPCNm=TNurN5IQB`RkJLN%NurOG4X>@0lIUw#lW7&K zUJ`wzZG#P#L?3CBVACbhM_MQLNurMrIeBt;AFP)|ABkVku)&h(BQXN7>5}LpEey6& z5`B$oG9Sf0N%WCghS$tsN%WDn3N~F5eWVS8t&~I`zaefEtX>j*q`%_hCy74Ns`&Ux zqK~vR*h)$CF&O3ttCvI{>HXLzi9XWo*e8iT(oOO4lSCg6=vBe$CDBK^FxX&8^pVaC zHeC{Zqye!{5`DEbnI5rE5`CoOVxJ`XNQcEfN%WCA#6C&%ty`1XJ@!eWk92u_J|xjc z8X2DtN%WD1#^*y4ee2a^`o-r%5`CmoVxJ`XNL^x|B>G65VxJ`X8rNjn$398)k;<`8 z5`Cn)*e8iT((m!SlIUB%Ci6o)uO#|NUk4j3i9XV2!KO>1k2E*-NuqCqn#^mlPZE8k zXJVfu`bdw&K1uYECdWQW^zk9d-LX#+eWZWmc_r0m9whw|>|sfK{}R&jV5=nYJ)O9S zv?y32sWvl^^l`8ul4>*4NOOYCkVGHp<=7{QK1TMe*e8iT()8FTi9XWA*e8iT(jBo+ z5`Fw4G$!^*qK|Y^cx?@lL?7wMU^67qM>;UrDoONhT9es3SR#o&QX%$9qK~vo?2|+v zsYUFQMBipLnayLLB>G5=W1l4YNDX42B>G4%#6C&%HL1xw9{VKGM|v>!NurN*Z|svq zAL-WECyBnzYckiyK1uYEE{%PX=p&sI`y|mvIz9GDqHl|uOrO{%i9XT}@%fcRA8G6O z{7Ryav{8J1CDFHKO=hk5{7Rya^mqLENurPRQ~dc!qL1`#{P{_uj}I2Vj6Xj~^pQS@ zeUj)Sy&3x?(MP%>{`@4-$A#DPuApX!{zDH*~y_<7+!!>-c(( zukZMVj&JPvrj9ppd<)07a(o-dn>yay@$DRM>G+P0@8o!E$J;nw=Xky2iQ{?4i;kBa zZ|nFTj_>7oJIC8QzMtd!JKoXpgBcKis(k8-?=;tezW6a9ly=-I~>2u@p~K}@Aw4ACpvz=<5L`;>i9Irr#n8w@kbq>>G%_l z&vN`}$DeildB9pA(8y&P}nczeh9b9{ftJ34-lj(2hVSjUfd{6xo3cKj5_ zyF1>~@!pR2b-bVB{T(0Z_+ZC}I6l_z1_(b$q1b7dU>Af@?<99iJkK^MVpWygJ$M1K1isMrqpXT^<$7eYHsN*vo zf5P!ujz8`AvyMOS_=}Fe?D(sWzwY>K$KP^%j^pn-KF{&@9skhrj~)Ni@y{Kf@Av}8 z7dgJz@oyYo>i9Cpmpi_~@s*CRa{OnhA`I^Nvz?Hq6E_>PY6-Zjy@8x(q$J;x;pX2*G-qG=c9Pi}#p^kTU{0PU7a=eS<$2xwz<0m?Pvg4;X z-rez@j`w!FujBn3@9+3P#|Jw;#POky4|n`5$45ARuHz#ezrgW}9KXczQI22k_?3>2 zcKjO0uXB8i<2O2fv*TkOzs>PG9KXx)dmJC{_yor%I)1<7Qyib__%z3-J3hnlM;)K( z_!ExLa{Ot>pLP6s$6s{(WyfE2{B_4?JN}mAa~yxy@p+EF@A!v~f9&|Dj(_g>e8(3! zzR2;#j(_9$QpcA$zTEK@j<0llmE%7<{;T7w9sk4eza0O^@$^Q6=KgoQq2rAlU)%9o z$JcXweaAO+d}GHqb-an=TR6UzpQ-o;~P7^spCx?-@@^&9N)(Arj9pvd^^WmI=-XhJ2~Fk@ivavIbQF0;&|Ti zqT^-9+d967<9j*Y&hhq+@8|gbj(2qYAjdm7eyHP}9Y4bHqa5$z__2;3@A!$1pX~T4 zj(2ywr{ldH@9TI!$NM`z(DA{J4{>~`NY$1iaFBF8Ure3avtJAS3( zqaDA-@#`EP5k8E{87he zI{t*?vmAfg@n;=>-tiY5f7$U@9e>^N*^a;E_#DUIb$p)V?>qjX;~zWzspFqJKHu>L zjxTb2vE$!3zSQw$jxTq7h2tw7U*-7Ej{oZTYRCU@{4dAE-|-C{-`Md@9dF|J7LIS__%@C=b-cOb+d1CS@f{uC$??{Xw{g7A@p{J-$McRC z9WOiH*6}?Y-^=lKj<Io`?fLmltz_z{jD<#-pzk9GWb$4_+pWXDf& zyu0H)9q;XUU&s47-rw<@oA1vcYKE9k2*fn z@h2Rg<@nQ%KkNAOj=$*m%Z|V5`0I|(cKj{J=Q#eZwh-S*$2W9*W5+jjyouvmIKGwR+c@6T@#cAG>m5%V&pTdp zyzF>e$Mu|z<6Rs-*74&VKhg1%9Y4kK z?vD3#ytm_h9q;FOf5!(pKG^Xgjt_NwxZ`IzKEm;H9UtlV1&&|j_$7{ya{O|~uXKF0 zTCpbRQ@%tU0;`mg@r#U{|@fnUk>iA5@ zpKyGZ<4-&OtmDr+{-WbAJN~NUuRA{5@wXhG79RJzzUmaiV_#ck{<@i62XEt~CzvB%ZZ{+yej@LTA zp5yB~zM{O7af1u@mC#x-SOFuzvcKG$KQ2)p5yO3{-NU^JN~KTpF2L^@db`A za(uDl-#EV1@nw!LcYKB8D;;0u_|JH|9)ku9t~<5ovBMhF{L77j8f4n_?$vE*U41>@ zq$d-lZfLKwhPE6qF#RU|+^HbbpyshwF{Kj!Q`fWG&~B2sO#@#efAOFHs_WUS`>;MO zk4!23p8pMMI&)8e)ocCdOEU5`N2QkDC!j&i=&t|$-~TtK|J(omC;job^RoP9O{RG! zN*%H_|6i4T_^a)dq(9KkO8W3u^-4zYS0yFa@K<{&8P8vJP%@Lh>ZD{gf0Z7-`tzC3 zUmdSx6@QgJj@7T>)<~JYO1RlYW{{FPWVn*{NP6$AYEKs=y~9>j`XSdV8HuEK>#Bau z7$m)?S5+n=>7Bo-G7CxX4_1{q$V*BVA?dxws$cUf@{y8Sp0o(o|E~1jw{w-GcLDrN$;P};(|a*h z|E?X8AC$C3ephlRlHPr%`ge6l(tGq&WjK=F$)_q;BI*5ps&W^S-W8}SGm!M&K~;Gb zN$)UJl~0lMK15YnfuwgUs>&K`X2LyQ{-Y2Lk*C6TLgsL(gN$)vSm6=F-XQHaiM$-EiRb@Vs-c_e6tB~~GJ5_1a zh`Wj_*$PST<5T^bIwZZ@PgU9@={jwd79|sq zaY~*<9#Ap|c}&Sy$a6|oBX1~aT+1DPm28K6p`?T?QPK(dQAs!CPbI^VHF?cfpVO<5 z4V2u2Y^mfiWP2sEkzJL1iIkN5jO?RioprgRu9Bw6(MobiS0x>hQAoS|e0a-NdQ zkjs?Zfn2ZTVdQotuOjy;`3!kT$x7r&C2Ow7{!y|O^0t!QkdKt?hb&Zb9P*u#fyggP zE=K-UG8S2fU)`$D>4V57N?t^^Rq_$iO3890tE8qe`$tI=q=S-Oki(R;Lyl8&G}1#! zKV*QC^N}-^+=yJLWHNG(`%q>LP> ztNM1E3|-gD+}C9ffC@s3sf(bM~rY^3BzWNRgj z_-*(OO14IJQf(Q-z#|z z`Atds{pxCXZ?2x=TV!1&>Gw9z>7V01Rmm5~8A{SW^Lw6>wfNNi zG9}v}*DJ{)w=3BnxlhRn$U{m7BTp*16nRNW`e&5hR`L+?k&^V!vn*8d3G$ti^v^#0 zqND*=G5=Mv1(Ghy>Lb4^vWb%R$hJz3L0T#4k7Sixi0rN;{j8>gk_V8(l%&`7k5lpi z(nCpl4S0Z(e~~klY`O*eN6F5}RZ8|kZc=h2a<`Jc$YdqwA&)2-gFK^T67rgor;)iz z<|64nu0HbLAYUu_6Zt{OhFh|KlWJ)BtiaGasaXxJG=TbJQ3MQ$?3?} zN=6|&D7hWkP04hmqU051UnQR+hbZ|0IYvptZP-6bwnR=-QilvvvM-YUUZr}jW05PA z3_xyBauIT;l3S2TN~R(YD|rEVO38=FD@wjY-cgd-mi?n-Gvq5JtQ?2Y`U7auRZek|D@>N-je#Q*sA#y^@EK+m*bE+^6I-K@2kC5I!QDd~-Tt>hf!2PM}bzbm;9X~6H9 zt3TE(q_L8Bkj<4WMp`KO9oa?6`YqW%O14M#R#HX|RB{M%q>}E)NlMN{`Y0KVoUUXX za*mRj$fZi&M6Ok`07Z9>3vaXVUkj<2AvJ?A9$xg`5 zO7=u@N{&F%t3uTus}FL3l5>&6m0XXUpkyM_OUYBnASLf2XDj&{xmd{`$kj?V*qQyK zq$M&=Nd8j*)X!v@{*F~9N{&HVDd~@7m0XDIuH(se5T|ZXDo>a1Ck^Q4& zD?<5D<#X3 ztdg1%`$tI=q=S-Oki(R;Lyl8&G}1#!KV*QC^N}-^+=yJLWHNGY4$Xq3dBcCbhjeM=-9OMTj*CD?vxesZ;=M&YR^DLyX zl6R2Jl`KYDDES@PMalXV_K%Y7k-e3akpq<+f*h%&J93heGm$<@MkDDbI@ME*L(Wk$ z6S-8$o5;0F79h7O`31RGNo`y9kCJA{<4W?#3rY?|-c)ij@_~{wkS~>7j(n@+PUI&g zGmyWPyoRjBXEW7D<8x#qB|jotD`~Vl`$x&v$ZksNk&2QINcy={^~X9MIYh}I{Y_&O+W$ay9avlJUqFN*+hj&j_oJ{9DM6N){r2D)|*zv*~~Tu66fj|0rpW zY^kJxY_H@XWLG6!k&=?3$UaK0Kn_-N7jm?cN06>cUPn$<@&$5+l2yogO4e$}{!y|G za=nr)a=ViKk^7XKfIOsRFp_@KS$*U$MP5>J8}hc2hmenyyo@YV@(J>tk`>4=N*e6L z{!y|8vQD%A{(N>tHc`?Z*;dIhNGm1%k*tynk=>QtjC4@)0CJd;=aJ)-e1P;&vJ4rZ z>nlDAzvsdAxo5WLVi@z4f#{a zaAeKx|NER?g>0bY9%M@;k0IMDnT_nKl-{!!8tIa)~$>8hk7a;lP( zkTaAFLC#Zh8FHDDJCN&@JdE6~HF z`ymUJ9EW_TWFYd3l8cdlm5fE!Y5Cuu^MlAHN?t^^Rq_$iO3890tE8qA`$tI=q=S-O zki(R;Lyl8&G}1#!KV*QC^O5w=lvE%28<7i@Oh&F!@+@+blJ}6il`KUjEBPCFM9Id7 zuz!@aLS9p{2QpX5;mBu7dLv&eIS2Vc$#ux@O724%?C{^S&q5k2c?a2C$zr61lHZYC zl&pU!`$x(4$lglINctyZs*n63$dO9ABPS_26X~O5G;+Fbt+B|jqRpYN$Y@{KyPf0S&E?53n1sVM1y?5pH>{i9@aWRj9L$iqtZL7r051$jkDf8-q{7a^Z08H;?SWEztG zDW&Qo|1$EMl24JER{#B)mB_kE8Xdv@QL+uvOi6<5tfV87Q*tu0r;?$_0ZOh!4p(vy za)OeXNG~OCA%m1GLe5sQ8o5}>`bV;Vl%(Is=N2Vxk#R~oBMGUAuPeGpyT?o?UzN?bYM7uBZ0s*1vz(-h+n@$s9Ov_@L8z?LTP9nf%YahGe>) zdFsF+L%a6w-F0Z+VFOPqwyXdDsq}xT{C}zPe<@pUSk|z_u$*Ce!wQBOhsYYI$QsAU z8s|uib0o$&65||+agM||M`D~KG0u?~=SYlmB*r;%#yN7vIdaB1a>hAw#yN7vIdaB1 za>hAw#yN7vIr7Fi^2Ryx#yRrFIr7Fi^2Ryx#yRrFIr7Fi^2Rv|#yJYcISR%(3dT7K z#yJYcISR%(3dT7K#yJYcIf}+PipDvL#yN_{If}+PipDvL#yN_{If}+PipDug#yLvH zIZDPkO2#=##yLvHIZDPkO2#=##yLvHIm*U4%Emd$#yQHyIm*U4%Emd$#yQHyIm*U4 z%Emb=#yKj+IV#3ED#ke~#yKj+IV#3ED#ke~#yKj+IkNS}L9+G6NwW3EQL^>MS+e!U zVY2ncX|nakakBNsd9wA!fwJ}1iR`y_>qJ@WL|N-ZS?feu>qJ@WMCLoZ`4(@z$7iiK z`K#aU(z1L^0H~XyhZlAT@?z7hWeb#!z&sy*JS?eu7 zYrW@ZtvCIw^{$__-uAQB`+nAXYXxMj8IZMhK-L-pS!)SottpVTwm{Yz16gYgWUV=nwe~>P8U$Hu z5oE1NkhL~J)*1y_YZYXzS&+4MLDm`uS!)?&t!a?8wn5e!2U%+!WUYCSwe~^Q8VFfy zA!MzIkhL~K)*1;}Yb9i@nUJ-1Le?4zS!*d|t*MZ;wnEk#3t4L|WUaZ7we~{R8Vp%$ zF=VaDkhL~LVr_=R+6;-c84_zVB-Um~tj&;En<23_Lt<@)#M%srwHcDEu^AF;GbGk# zNUY6}SeqfSHbY`U<$XlBsZ*7LWwHfl(X2@HcA#ZJlytNtf)@I0Cn;~y)hP<^I^44a^ zTbm(oZHBzH8S>U<$XlBsZ*7LWwHfl(X2@HcA#ZJlytNtf)@I0Cn;~y)hP<^I^44a^ zTbm(oZHBzH8S>U<$XlBsZ*7LWwHfl(X2@HcA#ZJlytNtf)@I0Cn;~y)hP<^I^44a^ zTbm(oZHBzH8S>U<$XlBsZ*7LWwHfl(X2@HcA#ZJlytNtf)@I0Cn;~y)hP<^I^44a^ zTbm(oZHBzH8S>U<$XlBsZ*7LWwHfl(X2@HcA#ZJlytNtf)@I0Cn;~y)hP<^I^44a^ zTbm(oZHBzH8S>U<$XlBsZ*7LWwHfl(X2@HcA#ZJlytNq$)@CSJo1tKBhJv*j3f5*Q zSev0>ZH9ui84A{BC|H}JU~PtiwHXT5W++&jpg0&e6)@CSJo1tKBhJv*j3f5*Q zSev0>ZH9ui84A{BC|H}JU~PtiwHXT5W++&jpg0&e6)@CSJo1tKBhJv*j3f5*Q zSev0>ZH9ui84A{BC|H}JU~PtiwHXT5W++&jpg0&e6)@CSJo1tKBhJv*j3f5*Q zSev0>ZH9ui84A{BC|H}JU~PtiwHXT5W++&jpg0&e6)@CSJo1tKBhJv*j3f5*Q zSev0>ZH9ui84A{BC|H}JU~PtiwHXT5W++&jpg0&e6)@CSJo1tKBhJv*j3f5*Q zSev0>ZH9ui84A{BC|H}JU~PtiwHXT5W++&jpg0&e6)@CSJo1tKBhJv*jiq>W* zTAQJ0ZHA(?8H(0sC|aALXl;g~wHb=mW++;lp=fP}qO}={)@CSLo1tiJhN86@iq>W* zTAQJ0ZHA(?8H(0sC|aALXl;g~wHb=mW++;lp=fP}qO}={)@CSLo1tiJhN86@iq>W* zTAQJ0ZHA(?8H(0sC|aALXl;g~wHb=mW++;lp=fP}qO}={)@CSLo1tiJhN86@iq>W* zTAQJ0ZHA(?8H(0sC|aALXl;g~wHb=mW++;lp=fP}qO}={)@CSLo1tiJhN86@iq>W* zTAQJ0ZHA(?8H(0sC|aALXl;g~wHb=mW++;lp=fP}qO}={)@CSLo1tiJhN86@iq>W* zTAQJ0ZHA(?8H(0sC|aALXl;g~wHb=mW++;lp=fP}qO}={)@CSLo1tiJhN86@iq>W* zTAQJ0ZHA(?8A{e>C|R4KWNn6$wHZp*W++*kp=51_lC>F1)@CSKo1tWFhLW`zO4ep5 zS(~9`ZHAJy8A{e>C|R4KWNn6$wHZp*W++*kp=51_lC>F1)@CSKo1tWFhLW`zO4ep5 zS(~9`ZHAJy8A{e>C|R4KWNn6$wHZp*W++*kp=51_lC>F1)@CSKo1tWFhLW`zO4ep5 zS(~9`ZHAJy8A{e>C|R4KWNn6$wHZp*W++*kp=51_lC>F1)@CSKo1tWFhLW`zO4ep5 zS(~9`ZHAJy8A{e>C|R4KWNn6$wHZp*W++*kp=51_lC>F1)@CSKo1tWFhLW`zO4ep5 zS(~9`ZHAJy8A{e>C|R4KWNn6$wHZp*W++*kp=51_lC>F1)@CSKo1tWFhLW`zO4ep5 zS(~9`ZHAJy8A{e>C|R4KWNn6$wHeCRW++>mp=@o2vb7n?)@CSMo1tuNhO)I8%GPEm zTbrS5ZHBV78OqjXC|jGMY;A_JwHeCRW++>mp=@o2vb7n?)@CSMo1tuNhO)I8%GPEm zTbrS5ZHBV78OqjXC|jGMY;A_JwHeCRW++>mp=@o2vb7n?)@CSMo1tuNhO)I8%GPEm zTbrS5ZHBV78OqjXC|jGMY;A_JwHeCRW++>mp=@o2vb7n?)@CSMo1tuNhO)I8%GPEm zTbrS5ZHBV78OqjXC|jGMY;A_JwHeCRW++>mp=@o2vb7n?)@CSMo1tuNhO)I8%GPEm zTbrS5ZHBV78OqjXC|jGMY;A_JwHeCRW++>mp=@o2vb7n?)@CSMo1tuNhO)I8%GPEm zTbrS5ZHBV78OqjXC|jGMY;A_JwHeCRW++>mp=@o2vb7m1)@G6Qp`;H}JLAw?V46mIGgFeIulLYdi3@<~Mh;)&t*~$~>F3ANX4HY}SI{ lYt6G+8-lMj&t|O%zScaOwIlcrTjtrUCBfI4XA4{6e*hlJLKFZ1 literal 0 HcmV?d00001 diff --git a/Microsoft.Windows.CppWinRT.2.0.210806.1/build/native/lib/x64/cppwinrt_fast_forwarder.lib b/Microsoft.Windows.CppWinRT.2.0.210806.1/build/native/lib/x64/cppwinrt_fast_forwarder.lib new file mode 100644 index 0000000000000000000000000000000000000000..3855fe7888f051384cf9bc7f65b95f2f5817aeda GIT binary patch literal 259428 zcmeGFe?aW{`2UX&JIIO+gAl?XWX+G~{35grLTDL;&@#JXvzs+b2w@N#!XSh&YzScx zLKuV)1|ft&O9+Dy`?;>`oV{Pyt82f1eEcI({|Z%bzFi&lC6OiTm@!{dwa4JaK=XxId5oX(jyglkn$BT+QF;&*MMh z59rV5kLOS459iM2e$xJ#@=sLUoy$K>{#o)*l7Ei;Q{Xmv*VwfgnK3u z?wLrqXCmRAiG+J567HEuxM#xs!;|hcmUPcn(j7hNe;jv+q&q~?9U|!tk#vVhx^H;D2Oyh`=2paEA!oAp&;@_XDTgAyV!TDR+pJJ4DJIBIW;C?hq+= zh?F}-${oV}Fll#)v^zxF9U|=xk#>hjyF;Y?KiwT7?GBN4hj4#W#vLN#4v}$($hbpf z+#xdV5E*xfjQ{z#LuA|`+;_>kLuB0{vhEOBcZjSzMAjW5>kg51hsgS$p*w{CfICFa z9U|urk#mR0xkKdKA#&~zId_PhJ4EjI&)Ka)B6j=`iP-T&Bx1)8k%%2XL?U+l5Q*6F zLnLCy50Qu+KSUyS{1AzlJB0fQy2Vbo#ZI`zPPoNRxW!Jm#ZI`zPPoNRxW!Jm#dh19 z@Xw7~?8MdlUGAB1i=A+bop6htaEqOAi=A+b?S8qCaEqOAi=A+bop6gyzjb)*m(&Tj z*a^4T3Afk@x7Z1{*#7Zyi=A+bop6htaEqOAi=7DE=Y(7Agj?){TkM2eZ2uIy#ZI`z zPPoNRxW!Jm#ZI`zPNdu?wp;9kTkM2eZ2zisi=A+bop6htaEqOAi=A+bO}~|W{3Vxm z?@n&96K=8nCz4z2gj?){TkM2e?1WqFgj?){TkM2e>_o=B#k$4zpZjjH6K=8T%K?r* zf^M-BZm|gQQ#Rq+9HyTkND;?4(=lq+4wIqNZc- za!I$?Nw?TZx7hyCaf_XFi=A|fopg(xbc>yIi=A|fopg(xbc>yIi|wCKx7bOy*h#n8 zNw?TZx7bOy*h#n8Nw?TZx7bOy*#0%>7CY${JLwiX=@vWb7CY${JLwiX=@vWb7CY${ z+ke`)#ZJ1#PP)ZTy2Vbq#ZJ1#PP)ZTy2Vbq#ZJ1#_MhpwyI zi=A|fopg(xbc>yIi|yWv0=L+KTkOCscHkB}aEl$d#SYwJ2X3(gx7dMOZ1?sVxWx|K zVh3)q1Gm_LTkOCscHkB}aEl$d#SYwJyLbG+Eq34*J8+8~xWx|KVh3)q1Gm_LTkOCs zcHkD~=NqpC$e!=bu0SU|h|Q zeEi?B1Gm_LTkOCscHkD<{Zb%siygSd4%}h~Zm|Qm*nwN@z%6#*7CUf@9k|8zkA++8 zz%6#*7CUf@9k|5~++qiAu>-f*fm`grEw+F9++qiAu>-f*fm`grEq34*J8+8~xWx|K zVh3)q{VUEbcHkB}aEl$d#SYwJ2X3(gx7dMO?7%H{;1=6|lDNeV++qiAu>-f*fm`gr zEq34*J8+8~xWx|KV!Kb{lw0hSTkMou?37#Vlw0hSTkMou?37#Vlw0hSTWt5vlX8ol za*LgEi=A?dopOtva*LgEi=A?dopOtva*OTWEK_c=Q*NSljRmW|5 z-GZmxf~Vbrr`>|5-GZmxg43T`J@&4bb_?#_D${Pk({91jZo$)T!P9QR({91jZo$)T z!P9QR({91tyL;L#c-k#^+AVn6EqK~3c-k#^+AVn6EqK~3c-k$v8>F;b@U&a-v|I4B zTky17@U&ZS`m@c)Un*|L(ry&e?j6=`XxhJD`A>fTndD!V{yFv!*wy^gkN>`Q+AVn6 zEx4Qgv|I4BTky17@U&a-v|I4BTky17@U&a-v|I4BTX26)x8P~F;AywuX}92Mx8P~F z;AywuX}92Mx8P~F;Qpy`3!Ziho^}hKb_3!ZTco^cDFaSNVt3!ZTco^cDF zaSNVt3!ZTc?mlHRZoxBd!82~bGj72%ZoxBd!82~bGj72%ZoxBd!QHz|#w~cpEqKN) zc*ZSw#w~cpEqKN)c*ZSw#w~cpEx3DQ%(w;5xCPI+1<$wz&$tE8xCPI+1<$wz&$tE8 zxCM9brj{Qqh)-8C} zEqK-~xcdanx&_a=1<$$#&$x8PZ~;90le zS-0R>x8PZ~;90leS-0R>x8Uw=FzXgP>lQrg7Ch?~JnI%b>lQrg7Ch?~JnI%b>lWO- zb7$RxXWfEl-GXP`f@j@=XWfEl-GXP`f@j@=XWfFkvB|mx&$E+yl=iGwl+=A!ag6G_V=iGwl+=A!ag6G_V=iGw3_vxHl@SI!l zoLlgmTkxD)@SI!loLlgmTkxD)@SIz4H!V50;5oP8Ik(_Bx8OOq;5oP8Ik(_Bx8OOq z;5j$gehvNn`7QBp%>G@@zh(H(KmTI(uMGb%)6e<;@4N8E=+8f$z6o{?D9VhOto{?D9VhOtFzpC++D|syX!b{cO570uH(erb)2}njuUs+apLYePTXC`@vl>N z9VhOteD?8jSH(~6%V!^+*U5eP?1SNcPsRNf;>msa?BnHrAN%CKeD>jSzmM&HZ~5fDeD?8jzmI)#Uq1Wr zxZlTiUv!XizmI)#Uq1T?y5Gk>xi267`TslCECe-`LOBkcZp8!%V%CXC->#E z4~F|%@{{}W>6`G$efjK5#Vz>Befi8w#r-?@$$k0ki^u&t_{n|wu-7N|<O-SvPNsvAN1Q)?{&~+jf21^a z=|vYl>+Fl4{PfV7cfaa8pZ>1+G4c1F3h`KsemAMRJ3)6q$VnSLv-t9Bhwe9e{qqW+ zyJo08OgH|czs@e5KUs=CAb7H)BlhE z?GFvDpFQz^zhnLGq0qnkL!r-4ocf#oa=lQfKNRafd-DH&zx}g9p`N|}`vdof`uoo= zp8w=apBjDSRpsC&*9b)p>F0QZYs!cIeI5SsI_`V=`xUPGezQ*sg*KjW>ib;vG5&s= z^4A3yoOPSBeE6Jm&l!5exdSiV?;g19+_r&N7NXq)XPnb9aM_symxaH0<`;M8AN{rv-9Tfa7amp^>!tlLb>_x;*B{ft6?xLm!B{mtsvWq*bG zndDcLuDtTfvu@KLq92bQq0kjY^>+4x`t{lK>Nj8y)aj87T@h99V2`NZkUgw^Blgz+ z@Xx<7ds98a-caYqbGVO z)NjKcRqtkxsNa@7tbRN8)_-yS+p{;-qwEd!JFwT)@5o+LzY}{^y@$P`erNWw`d!#d z>UU)?s`s)N)bGZgS3jFQP^Zs0I=_01J)$0G5348GTSqv5lD(-Ous76G>~-}tdrdvV zURBSsSJZRtW%YZom(=gcUR3X6FR0&(J+FRm_CTH9!RY+z{p=C-bJ)Y`_hoPW2j{;Z zds98n-cY|kdtLnj>^1cVvRBmy*emJ}VlS&dn7yR_5cZ<_AbUamq3n6}hp`9h4`+|6 z53xto&t(s*KZ3pWZ=9dsYp-ak^Ly$Q4fRK{*VP}*UQ>SzdsTgyy`uhD_Oklp*h}h< zXD_Ocuou*yz@ArsB72}t@BDOr^-=bSI?vb@Vf81oxBi9mKZU)iUSw~mpU+-bzkt1_ z{#5p=`WSmf{b}rF^{2C!)GuT&s*kf5)StngSLf}%B2d4WJ*v*jdqqV3ne1WpOW0e7 zIRCTQo9ZR@hWe%Kb@gYn*VLcGUR9rDuc$wly{!H`_LBPZ*^BB^>;?4~u;sYz6s~Bfzl^=E{&M!3`YYJ0>ND&W^;fc&)nCP4 zQooG7s6NYHP=7UhUi~%ff%ThPRs?W1m)ZfBhR(~sdN&Ri?MfC;tg8JLp^Xl(l57ghu9#vmtkEp+kJ*@t2_SWBV z{`asq)vN3c_4l&Z)!)ZnQ@@93+f+Y&#Ql!Jy8D$ zdsKaeJ)-_m_OSZL*jp`}|KsdU^%{Fa{S)kU^-r?b)IY^uRbOSVsDGNhto|AHlKN-a zi|T9a1@+Id=hZ*Y9;knTJ*vLW9#Q`ydszKT?5)4y{9k5os@K^Y>R(~6tACZfrv5ed zs`>_dMg8mSW%X~cm(;(>UR2*?FQ|WuJ+J<4_CWnR>{0bC_K5m-*~9AJV{iQx=l?!? zQ@z37Q2zmYUHymbHT55{SJk)KE9yUHFRTBAy`=tA_M-X@dqMqY?0NN{vj^(GV2`Tr zvPaZ^$sSh!6?^M1IRCHNo9a#WhWc;V>*~K{uc`lzy{f*)UQxe-y{!Iw_LBM^*o*4> z>;?5dvgg(R#2%>snLVn0z#dWm3wv1ouk5V@od0j^P4yOgL;dgUb@hL+*VO;XUR6J2 zuc-fvy{!Ik_LBO4*o*2%>;?7zvgg(R#~!F($sSdw`#972)vv)GR=*~D>(4m<8SG7U zz8rEzL;YIpb@gkr*VM1WUR7^nuc%*_y{vvFdrAFz>_zo<_JaEL+4Jf*U=P&KVvnkK zut(Hy$R1X|5qs-TIRA~=o9YqvhB{q=q4TTXl)a{YGxn-_CwoQx=ImwlTdR% z?_w{g--bGNW{SoKCJ$q9<%HB}F1AATlj_ft{JF!>Q zd)O=LcV;iE--W%TepmLQdM|rH{ch}e^|RRn^}Dl2)nn`t^*DQ2J;C1E$N7`&P4$4i zp`K!|tEbs(>KXQ`dX~MSo?|bo--ErReoywIdLMg1{a);O^?S1i>i1!fs`s-;)X!lL ztKXNs^#`2)e(X*4JbOd^{_J)22e8-FAIM%+A7HPjKZw1o{$Tc!`a{@@>VxbB^@pW^nHs*kW2)StkfSAQaVp#CKGsQM^-MEyMWu=f`JM^=Gi>)h}WX)Gua_s!y;-)St;7R=eK8I^%t{;)nCHi`W?>yQud~LnZ2R@GWNRq%h_w{uVAmL&#+h2U&&rpe-(R4 z{WA8V`Yd}v{nhMw_1CZm>aS&ws?V`U)L+LQR)0Nv>$f=n8`zub750Yu8`ThSytG|OiP=6>qW&)Su==~%Tff2i z-^1Qiud+AP-^*TCe;<2I{c`rI`VxCZ{r&7^^$)O@)IZ2xR9|KZ`^ zQS}w}i26s_!|ESnZ#8lLkFz(`YwQj6Pq5e3KgnKG{}g*weU-hU{%Q8I`e)cn>YrsV zs;{vZ)IZ0bSN}YFp#BB+sQNm4ME#5GVf8Puw|Kp78^{=y+)xW`BQvW7sQ;L~to{@BlKM~Ci|RY<1@)h?=hc7C9;p9c3&HtN)h0rv5wjs`?&#Mg0o)vik4YOX`1MFRJge z7u5gAo>%`9d!YVj_Ne*+dqn*&>|yo4vbT0|{=cy|)m!Wh^}n;%)&Id>Q~xJ>RsE2? zqW&-TviiT-OX~k&FRCB07u5gDo>%`Ld!T+LdsIDiP4bBPHQ2-I*JN+~0_Q)2y{R5% zZ>V33y{>+3_L};2*sJPo>=pIvvX|A*WG|^-kG-hg&R$TzK6_rBzY^k#K>aNCsCox` zME!>BVf7oaw|YeNr^_#Po)o;OGQokj8QN4@3 zpnfa%y!x%#1NGamN7cL8BkH$h53Apfz4bGk|Mu)n^(cEo{SNGP^*gfH)bGSzRqtW1 zsNb2rtbP~vlKNfQi|W1X1@*hJ=he?<57h6@9#xOAN7Uo&Vf6%iYX|2~vNzQO_J(?j zy{?{Suc>F)tLjzYu zd!YVs_Ne+0dqn+Q_OSXR*jqor`5(#NR4=eM)E~uOSAR5nP5m+KRrO)^iuz;O%j%C~ zFR4GCy{JCIUQp++>bfGY{zUdb{YmUm^-=bS`g!bO^(V8pevI=!g}td>WN)aS&t6x* zfW4;vRQ9U+7<)ziY3yb7r?Z#TFJv#OkFyulpTVA2zlc3hznDF$KEWPQe^1f0uvgV5*(>VLWiP8gkG-V+eDe+hf*M>zjW*_-NR_J;b)*z4*qXRoQhg1xFf!(LH;C3{)@RqQ48 z%h-$Rv+M=+SF`8UU&9`#zm`3!KF1zWe;s>R{q^jvAL9IPU~j5d*c<9^WUs5giM^)& zX7;N3JbOj`E$n6Wx3ZVi-^N~4Utlk&znwj={tos){hjPl^+ooG`n%Y}>hET6{Q&2G z4|`L+%HB|aFMD16ee5;$%h{{yOY9Z(_p_JPKfqp6{~&u&eVM(W{vr0f`iI#A^^dSe z)mPXf>K|nftAC8W)xh~b&fZk7u{YE|!CqJYBzsN$Q|wjsRrZSdr`gNupJ6Ylf0n(d zzQ$fq{~UW>{qyXB`WM)v>g((g^)IrA)xX5v`aaJ8W%j0eoxP#{752LNSJ`XoUt_PT zZ?IR?zs_D({|0+W{hRDX^-cDI`nTBg>fdG$)W5?XRo`NdsDGC|to}Xr*7tD!@3S}6 z8|)4BAF$Wef5=`_{}FpteVe_a{$uvC`cK$P>OW;Ks_(ED)PKgFSN}PCp#BT?sQNB@ zME#fSVfA0Jx4w(>|C+t2-ehm6|AxJ;{#*8%`tR7Q>U-=J^()xR>c3|%ssDk!sJ_o$ zQ2!%)Uj0w(f%>1>qv{9j5%s^Yht>be-rBi=dhssD$)sD8v=Q2#G`Uj2XUf%=u~QT5On=7&VL4bQ$5Vy zP`?&?UH#hZHTCPTSJm6tE9%!}FRP!)UQ)jvdr`fey`X-5_PqKH*aP*m*rVzl>=E@F zvWL}g#NPTg&VOU}rh0_Ep?(wgy82DoYw9;+uc~*lSJZFLURJ*adrAG4>_zo1_JaDY z*z@YQW)IYF!yZ-dW{;@fmOZR~JNDMMaQ@q~H`Sx;4fQ*)*VXUHUQ@pldsV%My`p|+ z_Okk2*h}hnWiP7tvKQ3v#-3L{n>|p!J9|_;#vW0Rvxn6a?5$0lKgr%y57-;(DfYU0 zn!To;VXvxZ*(>Tf_Okjt*h}j7WG|}su@}_u#hzEcH+!IdANHtvKYK*|9QLsKec4;z z#QE>X-c--CH`MRXURQqrdrkd;>{ayv_KNz0*vsk?o1LuDvdsDr@-cWxOdtLp}>^1eruvgWG*(>UgWiP8gj=iM* zc=n?D2zx>O3G8|GC$b0XPhyX%kFrP9&tng(KbgJtb)5ex>`nC|dqe$v_PY87>^1eL zvRBo|*emK!V=t>eoxP-fA$w7MoV}p_4EDVGMeKq4#q3e_3HFHkGugxHm$0`saQ*~*Duc<$Wy{bORUQvH8ds+Q?>?QT*vlrE;*bC|}V9%?+kUda;5qng9 znmwZaV)n55OW0dq!}(vz-c&EMH`HIoURQrPdrkcn>{ay{_KNx|*~{v$VlSy*#$HsP zWiP0|nmw=n8umc_wd_&#IrfP9>)6BUuV-(473Y5gdsDr_-cWxddtLoa>^1c_vscyU z*(>UAVK1w{mA$0?Huj?W0((LI?d*B=cd!TQ?_`gvFS19}-^CtQe>Z#UD>(mq*qiEA z_J;a<+3V`>W3Q=S&R$htVy~#bpS`U90rrym2ic42%j^a953%RfKg=Gee}p}%zQP_+ z|0sJ{{bTH{I?n%b_NID`y`laI_PY8f*=y>bVy~*NvRBkU&0bdj40}oav+PCnHTHt~ z=h*Y=pJxx$zrY?<#s=u-DbU%3f3d8hcfJgT12u zb@sCQH`q(+-()YUZ?YHEzr~(c|2BJ|{vGzH`WAac{k!a8_3yE_zJ&9CpS`KxU~j1Z zfW5B%L-v~bkJzi~+w2wfAG4R$f5Ki;|0#P>eTTiE{xkNx`p?+|^c3VIMn)c?#LRX<>lsQ-mMto~Q_);iArH}i=U8)URZZlE>%|0^ESUh3Q);6qo;d>i=Aq{^!(3Lm}q2 z(~Y^^aK~xpk3|f38tyXOZ8&PU$8fJ<{u%OL{No2gr#Nf4&v3utyx{@EgNBC;7Yq*@ z9x*&>xM+CH@VMa#!zII$hNlcq8!j83F+6K{&Tz%>yx|4Ii-xO)mkci(UNKxVylQyO z@Veo;;SIx^hPMni3~w9WF}!QIX?V}@zTpGIEyIU~j|_+COJn%2cKQ}J+-A7laEIZD z;ZDO{hPw?%4fh!CH5@Y>7|t5*Gu&@DZ+O7)py46I1;fLJM+}b|E*c&)JZ^ZxaLMqb z;VHw@hRcR$49^;#Gh8t|Z+OA*qT#CHCBw^xR}9w-uNq!6yl%K|c*F3f;Vr`r!`p^; z4DT9l8s0O!Z}`A)%kZJ$Bf}xOG|Yd=>)&vj;da9vh9ibM4R;ytHXJqFW4PCF%y3{h zYq-yFzu~;$0mFlahYS}C4;vmaJZiXTc+Bv);R(Yf!;^-m3{M*_8=f&dYk1CZ#qhl0 z1;dMmtA>{hFB@JlTr<3Cc+K#-;kw}s!<&Y;3^xpK8{RRzYq)86&+xwC1H&!DhlY;~ zhv=6^c>No0Gu&>t!*IlKr{ONc-G-xvdkps)ju{RNXASom?l+t_JYaax@Q~qx;bFrg zhDQw-4UZWfH#}juWO&l>l;LT^Wy3RuXARF8t{9#-ykL0IaMkdV;bp@shHHjb4X+tq zH(WQoVR+NeAS)N`1^F2 zk4Fr58tyXOZ8&PU$8fLVnBl;1)^MNUe#3dg1BM3;4;d~P9yUB;c+_yw@R;Fo!xM%} zh9?bA8J;#=Hauf^*6^I+is5;~3x*dBR}C*2UN*d9xMq0O@S5Ru!*#*e3G~8vl+i=uykKta!F~fo3 ztl>Vx{f6^~2MiAy9x_}oJZyNx@TlRU;W5MGh9?Y{3{M)KGCXa#YGs6~ps} z7Yr{Nt{Pr4yli;IaLw?l;WfkShUEf;fCRD!#jp|4L1$%8QwR1V7O)Y(D0Gr&~?n~-*B7ZcEcTpBZfN-cNy+B z95viyxYuyZa9}uVxX*CE;k@Ai!-Iy03>OR!8y+z{YPe{4%<#D33Bx7BlZK}ZPa7^9 zo-sUYc+POe@Vwy#!;6NihL;R48(uM7GrVee&G5S6y5SAOn})XxHw0FuZ8EYIw=; zvf&lOHN&fh*9@;4t{dJkylHsLaKrGn;T^-fhMR`>4DTC0Fx)bHX!yvm{KDt-uX)1! zi=floX1LvOhvA6fPQzV>yA4MT_ZaRq95Wmk&KmAB+;2E@S))&!=dZzYd&na&2YQn4#N?{orb#%cN>lx z?lIhJIA%C7oHg8MxZiNz@POe#!$XD(hKCK07#=lTG(2W_-0+0qlHp0iQ--GvmkrMt zo;5sYxMFzT@Pgq*!&SpehL;Vm7_J#!HN0kc-EiIThT%=aTZS8kw+-(Y-Zk7byk~gd z@PXl$;X}hmhULpaPrv7f`Ab7jbDQCI!ySerhC2;+8SXY5HQZyk*Ko{mU^r{I&v3ut zyx{@EgNBC;7Yq*@9x*&>xM+CH@VMa#!zII$hNlcq8!j83F+6K{&Tz%>yx|4Ii-xO) zmkci(UNKxVylQyO@Veo;;SIx^hPMni3~w9WF}!QIX?V}@zTpGIEyIU~j|_*-(${?0 zaGT+F!ySerhC2;+8SXY5HQZyk*Ko{mU^r{I&v3utyx{@EgNBC;7Yq*@9x*&>xM+CH z@VMa#!zII$hNlcq8!j83F+6K{&Tz%>yx|4Ii-xO)mkci(UNKxVylQyO@Veo;;SIx^ zhPMni3~w9WF}!QIX?X86^Z%R?;xA}8MSN+qLq5j8$hn~q`zeYLovNKgHLxl> zqeM5RZ)b#hK)t9jBL0!ikgw1`MOoB7qMJzV2jz)Q{m27EH>Gc9ga$!Fs0E^%NgW1_ zppFvp&-;u}5i~}0>PH?Yy1CQ|PziOC=oV6^K+{C0{@yatE$Q1Cp&8ID>KqY2N@s*B zpn22Z3p{^5k)3-B1bJwqT5N`0qqi<`g@y1x2JDsg!VxDs0Tz*sV&eU>JiZ$q=xA0h)+?N=+uwgMs!E1 z?Vt|S2+^ISc7nQ4yNPLDVNT0_sHVBD$B3?VWRs=9RZD^7K!dBbqq9)Izg0|S^`a?P7&Q->NKc~ zIz#jTsk5Lt)C$o9rOtyEP#1{?q*g&osLMnTlDYz_p{^1=Sn3*R9kovM5UCrWP1G%- zL8%SUHtG)1L#6J5ny7n350knNIzVj^JzVM`=m?cQHA6#E!=N^zQ?JQ(qI0EofFh`! zM30c#1?onP5B4M30i%56Yts5ItJzAZQ4+K=c@?!=Mq=QKDg~ zMbH@PIMHLJPJl|NlSGe`It7|WEfYOn>I`TWb&hC6Y6UcpxJrftr7nY3 zP-{d_lDZ07LtQ5tm0AaFpl%YKCv^+dK;0&KveX^WE^3qLDN^@9`=|#*MX4>&A?gv) z`BM3peWxf)bm~>tMs$JHc2Eaugy^YKJ3(Ej-9%$jqo5wtUZST-je!ExEYZ`Y_JR6Q z^F$X)9RLlY4iSw@Er5nmM~I#wbre)Y9V5C(>NscuwM2BW)Jf13>NL@W)G}xWb(ZLv zQs+Pw)On&yq%MFKQL9AHlDY(1MqME)Nv(laQP+qrmAVe9qizsATk0lg3$;P?9I4x& z9n@W-NvTcH9_l{PbEO`DTBwIa&y#ut3SH}}S6!Is`BK|J?Wi3@Q&JO<`(nwFXe4WJGZy;$lHsDL_5^b)Bfpi$H!(MzR{fyPlM zh{{q+ph?szqL)dX29;4~h+Zyr7Bq)iA$o<>dC&stBGHW0DrgCHndp^LS3ot?Rial( zT?4J7)`>2Yx&him-6EQm+5l~%?hw6N>Mp2>x<~XHsr#S<)E3cer5=KgP(#-ah32G& zL2X2*_m}8(QaeBq)J~$;OYH)6qeh9|Ahie7iy9-UNDV+))IOp&O6>>bQ3r_LBy|up zgjyhav(#bG2bY%v>>$tnnztA zdb`v`P!)BF=p9m*K`W>=qIXJN1+Ag36D>-ugEmk%iQXl33)Dc}CVIEj9ndanljuEC z_dxro2Sin=EzlwA5z%|4hOToJg^5n@FVXv?wu3rQBSe==?F4n9b`vd0je>emdx_pJ zH3kY$vqT?|+6U@K%@ci4>HugEb%KM_7rH+FpP)kG~kva*Q zLY*dBky-}Lpw1F~RO%e4f;vz1F{ulnMbs+M$E7ZTmQh!TYEo;URn#@2Pe@${)loNy zJ}Gq*w1wIr`jpgd&<^S@(W=xYXb*Lt=+jaUKrPfmqR&V@0)^VHdew!AJ}b2i)Q;Lg zv?etI>O}1#`kd5mP!zR?=<`y0K{3>T=nGP_pgz=oqIIcx&;aTn(HEr-feNU@L|>9R z0vbgv5`9_f7-$@If~YRF1e!#hBKnHdX;2w;hUlwOXF+qQ6{4?6od+$TE)s1>t%8Jn8_^52X%*hENMcKax5O8bKW;+Ll@bjiHVc{aES*sDwI6^b@I5plQ@H(NCq$ zfM!wWh<2n_K=Y^zL_d?d2&$qk5&c~1GH3<0M)V7*tDrU1b)sFVbKK11BT(pi zSH0@OME{Z625Lv`AUcv70d=Bw5&c(cHzh^{4d8dOG|A-cBIS;flSBcJ)x&~TDtrJ~O>IP^Nb&IH7Y6G;5xK@Szr0#_TGpWO%5!6wlPN_xE80t9D&81F& zN~n`Ww~#sonno=X-BRidXcl#js7q=EG>^JKbStTgpepJT(XFK}gH}*$M7NQ;3R**5 zC+e132W_Bk65Uqn7N~)`O>{e{JD^?ECeiJs?t%7E4~U{tTcAVKBceM<4PE~#3KN~) zU!proZ3lIrMu_etwG-5Z+D+6WH45rM?IpUi)EFp0%@W;3Y9FW{HBWR`sRN)v)FGl? zsRht5>Il)@q>h4$sAEKDOC1MIpq7a4E_D(#g*r_XlUfGNpw1G-rOtsWsPjY#sSBV* z)GAR@>Jn%fb%iL9S_7@3t`ViAu7m2R8$@ZTo1iV!22n=pHfRTRmnbW>3ED&5C(21Z z0JTsLiS8lw2o$=(Rj;}*(LJTMf!a|!i29^PK%J;vME8=~4T_@n5Zzm9FDQl@5Zy;= z7SxB@Pt-3p4;nxnBsxdx5U7AUOmttVBcM^#BGLV%j)BHeCy4S=OQ1>ADWdyJod%Ur zXNVpkbrv*-S|NI%)OpYX>LSsA)GBBRb(!cvQddAV)K#JfOI-u4qt=NYB6S0_iMmBJ zD769FM%^KLsMK9h6LpX1VN&-&2dFKghf6&K9ij4bY%G$OSEnnztAdV= zq9;jR1+Ag36OBr(gEmk%iO!R{1!|yf6Fph#4rmv(N%Rz{d!T*P1EQkT7U&T5i0FK& z{6afLVWQLfOaF6$)OJt@YJ}*iQaeFisNFeNsWO5)GX1{rS^gPQS(F> zN*w?Vq7D&_OD%wgQAdcLA$1f~L>(i#Na{Ff0<}bRvD8V>6zVk5gw!%<26dL`nNsIK z71Vj6OQbG<7E!B2&yureO(Q~C9fLf@BM9-6Y1mZ6$C82-63==(HY8$8>wS#C%Y6R4Y+C}sNsokI` zY7fy1rS^hir~%Q7q-H^VsQpCKQuCkz)Ip*bOC16gP=|?LB6S2bidrOksnjvhIO+sZ zS!xM1i8@8}GO5#`GU^P`%cahO=1?m{uaG(qT0mVSnvq%sEuk(Gy;AB5sD`>q^eU-q zpmo$b(PdIMK%1yrM6*&Gpl#G0qE}1Z1vOFkh+ZRgA9R4)B6_XVL(mZ_e*yEH)G(-x z=+tYno#=H^J3tZCPNLUK?E-b9Mv2}awFlIT8Y8Mm4M17cKB6~D?FZ#i2Z-Jzbr3X! zS|EC})M3yF>L}5?)FNmMb)4ueQYSzq)JdYZN}U2tqn3%@CUpihi#kWNAhiOTM_nL# zyVONc6?KW|9a5J;E2uT1cS>Cat)Z?HElRC}Hc&T--X(Pl)Ii-PdbiXa&@O6|=si;R zK>Mf%L{+IR&>`v((R-!xm&l)@Fwv=3T^rH+q_%@PP$NW_OYH=8p>`83NsWSfPT9H}?&7jT_eN^fksDe6A^f9RmpheUw(Z{7OftFEMh-y-6pjFg0qEAR&2h~wG zh(0NG6SRfeAo`TlZO{(tF43ygCTI_JpXk$44?r!{L!!?}Jp%C`!Z^LZM4y$~25Lv` zAX<|e0d=Bw5q(Z-HzJZJ!Qkm!q2hd>3?VWKZd z9RZD^7Ky$rbqq9)Izd#IS^`a?P7!@Y>NKc~Iz#kTsk5Lt)C$qpq|SpDP#1|dq*g&o zsLMoOm%0L~p{^2rL+To69kovMO{p88P1G%-O{opgHtG)1x1{cZny7n3-Jn8_^52X%*hENMcKax5O8bKW;+Ll@bjiHVc{aES*sDwI6^b@I5plQ@H(NCq$ zfM!wWh<2n_K=Y^zL_d?d2&$qk5&c~1GH3<0M)V7*tDrU1b)sFVbKrAG=W+o`m@wY&=l%4(Sg)5Xa;qb=r2;|Ko!(^qQ6RA04<_ciT);a3ABv5Le!F4 z1FfR25&d22I;f7iLG%x)o1iV!2GKvIZi9AEcZm+AHbHx+`$YeedH`yn9uoaq>JfzL1ok#qH9Z?1OSZIwMBH6)I-n_D*s{F4yj>K8`G)Z|0TMi)DBPtwUg*ZQoBIis8OOD zOYH&mqQ;0KQUg#HwU6i~Qu{%9)B&QKN*x3Zp%#d4CUqDzf;vjnDYXb1Lmel&xzq_z z33Za_7E-4`)2L;lTS}b)&7#f`bxEy&=1~`jZY6aQR7G7Py0z40&(hKTk1Gy0<}bRcd3)0Db#7AnA9?826dJwE_Du6L7gW`NL>Ie zqE?BLQkOu>s4GN))Ea0Nb&V(`bsbbk-5^R!-2`o+Hi$A(w?R9oyF^*3P0$|dK2c8U z0jPy~NOTXWM$3Ww#6GVBbCD0`56w&>qPJ_y* zGei%NIt!XZtq?s>>O5!xb&+U5Y8AAEx=i#SsVkrw>MGHLrLKY2QR_qxk-7oeMBO49 zl-dAoqwWwrRO&9MiMmJhFsb{X1JoAL!=)aAj!^lQ5kpeLpf;k@`%84L)DBPtwUg)( zQoBIis8OOvO6>vlqQ-~{QUg#HwU6jgQu{%9)B&PLOC1Cap%#c9BXt-wf;vhxEVT$4 zLmel2tkelm33Za_aZ;y1)2L;l$4i|7&7#f`jYzG4=1~`jo*;D*R7G7PdZN^2&emdx@SVH3kY$vqVpq+6U@K%@bWH zbpSMoIz%)swE!AM9U*##)KO3ob&TjDspFst)DqFfQYS%EsMACfQp=zj)LEiuN}U5$ zQ0Iv*k-7j{M6D7%OX?D68FhuIB((-wMO`DhRO&jYj=DkgY^j@|Ez}0lbEIyAc2IYT zCZ#q(d#L+F&y{)rYM~wyJx}Tph;MsydVh(YFSQNSj@m&qB{c%-MC~Gafz)nL6t#!w zg;IM#G1P$QMN+e%KGc4qX{mY80O}yoi=_^M3aGLKU|m2a#xCp8ReBRajm zM6Z+D0g9k@61`q(7pNOGO7sS)J)mCH7*R!P0Lr5F5xr4rKPZnnK=dZ5gPJ(@iwM_IjsWYHi)H$LBsTI&X>H^W*r7nW1 zs7plekh%<7L9G$JQ|c;c4RxJpQEDBufx1cbE~#6f2I@A^yQS`cc2S!|?~%F(+DAPg zs!DBv4pEPY-Yb=F-F1q>M5p(c=zUV#K^>?OqRXXrg1S(s4GM@sWs3l>Kf4}q^^VNs2fC|l)4Gp zLTwOzO6oRf2X&WdRcaHohq_PnX{iUG7V06cT{ymD&bsN9`b5lNtea zqIMB|PHHzOirPc;d8xgi7-~TD1*ut3A8J3*y3{;q0CkY)i&BR`1=L}pFG(E%jiMHb zzASYNG>$q!RF_%;O`=W_eMRatsEj&8^i`>|pgGhE(buHTgBDO1i8iEGK})F1L|>P> z0;-{|5`9DJ8fYE0PV`Nw8=y_pEuu}S4bV2~4$-%y?t+@Adqm%sx(_-)Z4rG(>LKU| zHFR70{a>kJP#e+d{U!RY)DBPtwUg+3QoBIis8OQtOYH&mqQ;0CQUg#HwU6irQu{%9 z)B&O&N*x3Zp%#dKBy|`xf;vjHEwu<5LmemjvD67r33Za_CsLJ_~JL{p)I!5#-spFst z)DqF3rA~sTP^XCwq?SQ5sIx?Wkva#epw1KhRq6t05w%M6H>pdYWz-d-med+(6?Kj1 z?^4%6b<_=_e@NW~ZJ{=Z{wZ}Ew1c`!bSSk6+C$wZ`j^xLPz&{t=-*P0Kzs|;Q?I%( z(SM}2f!a|!h>oO2K%J;vME{lA4T_@n5dBYTFDQl@5M3!X3+hAdC!#OTrvIM@4WJGZ zT|?>+sDL_5bWN!vpi$H!(HT<5K;x(rL}95V&?M><(Y2&bgUYBgMAw!&3z|c%5M4*= zJZJ%Rk*G~-6|{u9OmtnTE1(+cD$$uz*Ffv2b)xG@-2iQ(ZV|OhZGg5>cZjYpbr;k` z-6Ohz)P2waYK!PBsfVB=RK7`Xhtx2rjY*#NcA^_f?EpnkJBe;2wF}gZ8YQ~1)E-bT zYK$l%H2`H%`-pBLwI7s69U!`?)Irb?YJuoxQink!sG~%kQj4H5)N!JlOPv6fP$!9Q zA$1BgjanwUrPLYFEb1Ilm(&Vq9(94}R#F#1Rn#S-TT5LAt)SM3ZXPDM0b$NH-A1wVWQLfOLRx6 z?Vt|S2+^ISc7nQ4yNP>qmt`G%MYoJxsHKLT%bx<93gD5R^6SRfeAj(MH2JN8k5@n?}L3^nCL^-Jkpcd*O z(LJOdf%rz_r}vlWo>JRD?Wi3@eNrQ!PSh@O<`( z>X(`a4WJGZog;M!R6rdjy06p`&?st==zdbiK;x(rM0u$t&?M><(fy@PgUYBgL=TWU z3z|c%5Is=pJZJ%Rk!V0_6|{u9O!OeBE1(+cD$#?bu7TE3>qHNcx&him-69&4+5l~% z?hrjx>Mp2>x<~Xdsr#S<)E3dhr5=KgQ2AE&LsG+_Hlow}OLVT(4p0QOljspryFlHj zQKCmm?E&?o#)t}115g&VkLXcS`$2is0is7s9Rv-b7Kk1rbr>{)I!ZJwwFnwR9VdFM z)Co`tb&}|DQl~)EsAZzZOPvADqRtVGNUeb8Q5T4wAaxN`MO`9#qSR&33Tln$Nm5rq zYpCl)qf+aj4b)Ad^Q3Np8mQYuPnNm^+C^;=Jw@ssXdm@}s3^4sIz&ApI$tXP#}ZCa znCSHW5?vs*9n^suA$qFRPEZ$WH_@2XD5wXum*{CyW1s*vOZ0T9eV~5SJkfl zhq_PnT&V}37V06<^Q0bu_&>*SdVh(YFSQNSj@m&qB{c%-MC~Gafz)nL6t#!wg;IM# zG1P$QMN+e%KGc4qX{mY80O}yoi=_^M3aGLKU|mH&e;b5g^gHlow}OY}Oa z9iRwmC(-Mrc7eK4qeO3z+5_rEjS*F(2B0izAJH47_Ji`M14M6M&>o zb(CmcY7sPsI!^Q!sS}_Q>Lk%yrA~pSQOiVclR5*MMV%vBkXixFqb?A=UFssJin>Jf z4ynta71SEhJEg9I)=<}p7Nyof8>pK^?~=L&YM^cty<6%IXcx6f^d6~upncQ>qN>yu z=n(aY=)F?;KPhyI!bGR{m*{;`+d&tp-vO6NG*eA zP-lrgDs>K2L7gZ1nA8Q(B5IZB<5HJE%cv_vHK{ewD(V{1C#0@}>Zlt;pOm@@+Cps* zeM;&!Xa{wdXjN(xw1>J+^l7OFpcd*O(PyL{f%rdKb$Wk^J}b2i)Q;Lgv?etI>O}1# z`kd5mP!zR?=<`y0K{3>T=nGP_pgz=oqV@lWy)%!qa(@5+ds@&PItkgG$dV;z_8D7~ zP$>*WA)2%(ZKFj+I8-WG29e!l&636vWt}7nX(CHV6IoI*RAm1>&(-xk-`{t+=3IaL z{`x(5d_A7e&+GoaI%m$g&voDT`#u`kdSco-rMGs)7Rc7pv~^E!?TNiETYIIgEWNcK zwotYXOxuw3)^h9(**Yq1W7Av5V~b>KGHnynTc==e%GT@CR*~L19eYc*-jTL@(pxLB z#j^FGw9QIyeG*$DTdUIcTzcy~>}}cla@wlXTi?Lmk*$l<_HKG>4fd{VU6Hm=(px{r zmde)Jw5?5V{SJFiwr)sUU3%+gY?*A`nzldFTT{Oltwy#sO4|;Y9)GdrvNe{rUDI3l zz}}aw`=l+N-r5@bK(-#5wj8%ym z=dyKr+U`hiy$4$*TPxG{P`%1Qcm$nV*t##O1*}6GxThm+r#J-lTsb9Re%^G2P z{KdYJtvjYImfpH6_N{E)BW?Snx5lyWWNYiR9h%;H1h!7LCeoId-dcoxFI$gITSa(_2fi4YIX++Ipt9_QE#G*0QwqOK%;B{UBS1q^&%?brklaY#p1n@#(Ee ztWLI0Oxu+7*6XpKWNSs*rl+^wf&DC7?@3!_dh0{jCfPbGZBM4RR$-fE>vL(Fm)`m^ zwnes9r|pgO*2UN_vi04x)ugwszc^wwHzt887Hw(rtgH(Tl`$M+wkhUGuTVvRtvUS(A?UCNP5B8UAji;@3dh4Os-?H_Hv?bD8 z^RRzpYf;*cO>Zs1LL<5Vo3>8rtzEG!*;<;m?&+;Pu?DiWSK7+bTl--RW$VDS4M}e; z#~R7jQE3~S-Z~y@EL)Rlo0#4@1=~)xUZ1v#^w#Ov_OkVkwB3{5T8Zr-TOUf>tn}6= zu_m&$Ds9iDx6Z>N+4^$Ys?%Guw&S(p#r*f*e_w-t_kn-+fq(abfA@iZ_kn-+fq(ab zfA@iZ_kn-+fq(abfA@iZ_ksUE_5l_F@&1qL0;QI!}|U|`Qyg^ zKmFr|_UZedf8PImIrODSJ$L@u%)ev#H}%rRvX0*6k_*mQzpk+DSuUTibzxh7rC6f1O^v`LBowVbQEe72<=E6A-u+CO3`HYF*OzoT4 z`=ya>yN+77*U)QHe|GBM$@3~Z9r)@AvpWu)x9722D<*IIjdWwB~b!%lEFxHIIh_zV0syQ#k*C*Z07P&)9}t|bqIWT`K% zg?%Bnf&<%93#p+M%!93A5#;|TSq%BQO!8>R*A|k;LORLgANcBx5l3I>lk?bxJ_~^VMVtjKfmc3YNhGU^(P9P9|Y%SOM8Rl9ljaSOrtBYc)*0 zt~D_Ay4J$f>skl7J(^6th}@=1#$f7ojziv~WCF6Nmn?w^SPHXY8O(v@Fc&5v?`5(A z=EF)@0IOgjtcJYD$r{LeoUDbs$H_W)3=EC<#xab+<6s=}o+lHKT{2k$OJFH%56j>Q zupD-PNq8cxfG5F9crvVl9bq->1Z!YtSPM^qb+8Le?KE9s44w+(@HCi!r^6Ch3QOS` zune9F%V9T|gxz5UJPTIBvtbqN0jpt8SOd?2weVb62hW44owXN?!Si7pUH}uYH!Oi= zuoU)zW$;2+4*S9+><24ge^?0zz$$nVtcC+&4IBh(;l;2H4u+`@$q*QWLtz{ag9$hs zmcVjY3Yk60GB^U3!;vrvN5Kj>8dkzfVHF$$tKnE!1INKycp0pNm&4SDb3BZ}D_|U6 z2@~)tSOSy$Un#sAmceUaIh+8Ka3ZXLlVByh7FNN@uo_N*HE=4dh1bD4I1Q$T!u2o) zZ-8-lBTT@XUI9ISwIVI_PXR>2owHJk@);CxsM zUxan=C72q%FT)so1;*j4FackKC9oQn!UeDlz7EUbLYRbazzVnsR>C)76?_X;!^N-$ zE`hc1ZCD52fvKVYE{wsYFb>~?3AhZFz#3Qzm%}pnJ}ieHz$9D&E8vH)5`F}$;K#5U zegbRYN>~d&g>~>Vm^#>e4r6c?jKeQr0frh(jKRNP9R3Xx@E=$LLl%z@vtSu)0Lx)Rn1qdB z1#Ao};dZbJZV#*B4zLC`fweG#b+9Q+9n^P(F}M?q!<}IQHiIQF21{XcSO#~2<*)@z z!d+nn+znR3-C-4M39I2AumuH zY*+?!U^&c%Ntg#KU_Pvb1+WSh!fIFqYhW>~g-63WcnnOPJRJ*T@HiNU$HN3{2TNcH zEQRf189V`&!wxVBPlOflBv=VghE=d5tcIOn4eShS;VG~Vc7dsrwyrP+Pla)K8ce{` zVF@gSrSJ?`2G4}$up3Om?yv%$1uNm%unP8o)vzb5f#<+lcrL7i=fTv;VlNnj=fgO> z0488>SOUvnDeMEw;DxXp_Jv8<4_3hbuo4b{Rq!HM4F|#+I0)9li(wrc3{xkmLtqRJ zg>g6xCg5;b0?T13yablP5wIMNgh@CGR>0A)5?%_c;22m9$HE#o4%WiUU>&?1rcRE> z!x+2*#^IGP0k483FbPZH)vyd+1IytAn1mBy1)Kyc;kB>|PKMQR3ao)sVJ*B4*1>5o zby9vkjKLdV9Nq{M@FrLSD_|+S8J59YU^%=MCgF5g0dIqq@OD@QXTWNB2dsg2!diG2 ztb=#M)WyI(Fb401ad;n0!24kdtc0a-CM<&wz;gH?Ou~m?1$-D*!be~gd=ys0S+E8^ z25aHtuns-}Qx_pm!Wf(lxID8K#;4)YOYhWo{4$I*CupE8>lW+yBfFHt2 z_z|pvAH!<+39NxDVJ-X=*1^wU>SFJ67=x=|9DV^4a5XG}wXhVffo1SZSPs8}Nw^kP zz^`E?{03IRZ(%k34%WbRuoiv~>)?8ry2#uBV{jvk!yjM*{s>E89V~@E!7}(WEQgz5 z5^jbSa0{%2zrZT^E3AfFVGaBZ*23Rm9sC1^xcrU($r${L{~d>a!vy>XmcY<}$A?+4 z3^st}upvysMz8`lhLvzTSOvF-)o=$`1Dn8F7{NN&6oytD|6vU71mkdLn1Ib-35>x~ z*c_I@U0^wE0h4f7SOIr~m2h`h1zW;uxCg9(d%{|{7p#MO!_>w6J}?INg>kqaOu+qN z35>&1*b0`x17JBk5GG-3SOE`$mGEF#1rLGM@K9I-+rV0Q7_5Vb!_*?e5ikaigmKsw zCg4%91SVi9%!Xw!2bRNJn1p$-0_MX?SOBYFA*_Z)um%>xT6i?9gU7(oTK>lAWDFk1 z|Bl1sVFI>;C9njR!uGHXo&d{X2bhE>!U}j2tb`}SD%cTL!%naUc80a^6j%qlz|^8i zR~Un*!Z1$)41*b~;kb6_nz7uLb^ zU}~|Z7mUI4VH{on6Rd@@{}JxDm$T4=@3Lge9;J zmcpN48T=WR!%Z*=H^U0J1y;geU={ooR>Q5Z2L1+X;qR~x{sB{q%YVWc{0qk6-!K9H zfh90B~7^U?HrAMX&}I!&-PWtb@nE z)XjrqVGJGzx)?4Xb+e=wjKT9^99{quus1A$Wv~?Xfo1SQSPuKbB0gU3=V~HI1DD>a99G%VJW->mcbFQ9FBxZI0{z4(XbL;3aj84 zSPjR*8aNKt!pmSCyd0)(4vmK~cm<5ZD`5g&1xsKOmcpxH8N3FT!wE16C&CIi30A^u zVHKPVtKk$_1E<1Tcpa>R(_reR)b%h1Z-8-lBTT@XU+8GHbi!v|p! zJ_IY^!>|%Q0;}Mouo}*SHSjT53m=Dd@Clf@3HKz7!PzhlpMnWE2bRDpSPGwpW$+nT z4xfcd_#CW&b73WX9#+8@U^ScvYv6oX3txnF@FkeK`S&u6!B=1$z6ulYHCO_xVJTby z%i!y<94>@O_y(+ii(n;u6IQ{uU^QF}Yv2-C3*Uxy@Ew@C>G&>;!KE+`--8Lb43@we zSPGZJGWb3$habQsTmdWKhp-ZU1gqf3uo`{>Yv4*)3qOT*@H3dY+4(t)!BsF0zkmt2 z8kWFXSPIv`GWaDdhhM=YTnj7U*RT?P1FPV-uo`{`Yv4Lq3%`eTa6L@jWZeK`a3hSv zA7BFh2uolcEQLS8GWatrhnrv$ZiW?b3#^2{z$*AFtcF`*4g3w(!r$Rf9M&J-#4#ph zHAjuFkDS?mNdG<~`~Sz+NQPf{aVQMOHg8CwCe@OEb`JZ7o}(GxgZhpbK63bgQSn31 zY!g4V5C1FPe&ophLoXcCe*~YFa9s1ycTB(k`B0(%*#6e{N&fQ>J$ul|(S3%*yNw#% zZ_w~wIf?AzUMCG3)qh0!h(SEVvpe+aK79C)k-bjshGyrr%_(l1n@Hpq_PTJ;uwI>p zj~vyrs6f6FGjs^wU`ajV$Ps@7X6_zhbqg|g z+gRQF%-zGSZeHf@kybZ1bN48#o3pK(|KBDaS9;85E}v5W{%5!IuuF#z?tk*|5o7v{ z=*Iyn(*V!?&+7je|G634`F1-ybGy)PC$_cg`#=<%?ShOSh-0j7apvxER<|f~x1H53 z%-n5nbqg|gJ6PTP%-xf$ZeHeYN2{Bgx!c+5=4|WMH|D!o-Rwkm=7Yqkb~};z@N~M_ zF3h-Jo?&&1Gk3dL-J;Chv#f4m=57zGTadYXj@8Z2+&$0g=4I}lZ*_AscY9mioNe90 z|2C-q@00C5RyR90Av;HX<-TS)Cv&;KSJic!DhKAb9ty)F3emW zZk7u&moG8P`I*Zj&2nDm@@T7^~>;XyS{h&Caaz6_+Z>@mK`6ATg|fLgK?W#c8uN`X4$cK-)WW|d-vUD*|B%uYnB~* z_x)zsv3Jij%er^hcR})?Rn9KTc;ff4)h*84ebnj}W$r#^bqh0hpRl?GnY**CZhq$O z9IKm`x%;%$&CT3>*6QYL>()1Y=33o6$Mku@EIX#pe6#GBJ};SN$Mku{EIX#pYi8Lo zeHNHy$MjifmL1b)ky&<3pSR4iPM`Yruq9SG-?4|iW0oCz*iy6X*u$2YWyc=2+$v}1 zZo7R@-wXDES=Rd=^_4#~%X-_RzVgRrS?_w(S6*qA^Bte6&&;ypQ?<%0J3dvb&9dWD zwZ<$vK2=|tWyh!LYpa}HoOuuX)+`rgF0V7og_+Ci&2mBJ@_SdsA zIA+);v+S5*Tg5zE^t>J&($o{X@0>}7kY?dA4Z+o-s7=KO7vSa);HOr3ix06|RjK5}9Ima>nnww?E z_-kR79pi5|v+NjuEzPoH{OxI$b^O)0z_GVgW_cv@J&%3ub|Uja*#1_#&@p;jnPtc5 zJJ4Wx}X4x@%k2K4U)5oK%a-m~>W}9Wl{LD4Wj`^8y zmL2o6&@4OVXR%p!%+F)2a;{^3^2M_M_~*YK>T(_Pvz=LX%+K~_*)cymm}STOJjpEU z{H$*QuA^1XF3z|B*V*b8XYO{fx<#40r&`^@%-z$iZb9bm8CEwxbGMt-&CA?9%j)K4 z?)I>{IorDRT{fR%b&DLwxAV-h zGRuzR+aRl4d(&9mluPRyogcd>dny9mltE zX4!FkyWA{0j&E0(WykUDDzmJ|xB6z-)mFLKF~cU9WycJgWR@K>Y_eH)%&@6eIo~nE zrkQ2O47EbixjoY?JLdL-X4x^fAGXT*j=BA)S$53r$IP;0Za-m` z9dmoOS$53rIcC{0x1YAk*~OVZ&(E6WqRi#FX1OqP`319FkhwhHEazt~zhsv4GM8Vm z$_0)i#%pHTal}|)mK{fog=X1t#8_mNa~wyEx6HERh_S>hJB}Fdm}Na;)OQnMsa4MW zZH#4BwZJj{mYZeA`1`;tJI3FKX4x_RJ~qpa@wd_}JI3EmUaBqcN5`TtISP=ZMWCzYp=80iOe_W)?4jD$LQT?mK~$_N3-l0 zy+4^{$LQT;m2(}VcZ*qejNV_(vSalAW|kc%>wj3~LdX34%Pc$Q=RaoIF+a0*`H%JV z|Ms6c7dqx=L$mCdpN-A3V}5RLm2(~Qvx!-D%+ID~*)czNGRuzn*~~0E=4W%W>^OaF zVU>#~&icFeFsv+S5* z#b((t!;Z1a#f}+voLP3vuy$tIF~i!MWycKbV3qS7GwdX@?3iI4&9Y;LbvDb68P>%r zXXkGF@8|1VaXr;6=VUIQZkF}G`>*ej&oImSpZ(WY?q-#X9dr9Ev+S7LJ*Zw*bgss)bmH_a?N#@`KQ*)jfZ zGRuzfce7b`jK5pWvSa++W|eas<8Ovpc8tF}&9Y==Ldn`Iq;^)2rB=DfF~gRbWycI#Zk8Q0>;tpxm|-7U z``9cyX4p!z?3iJnnPtZeTV<7t95ZaSS$52@HD=i{!@e@hjv4l~S$52@Z_Tn}hOM*8 zd5#&j-Yh$2*haJLm|;JfWycKr$t*i&*e0{=m|QiB7cSRVZeo`8FXF7P z+|(@V-@{p7c_*t}?3mll%(7!{H#f_Ux!uAnJLdLoX4x^fTbgCZ+}_hF=R4;1-e%b` zxA!&6j=8)%yhU->ArtbbX3edTPcT;Moj^Qa?3iIEnPtZe>u8o8Gpw^&cFeFYX4x^rPPNK8 zjv02kS$52@Gt9DMhIKQ`jv02AS$52@9%fl*SbgiY=U8P{d$-*Osjq#W-A-h_i*mlz zE_BS#-e%b`Kl_+v$NcPTmL2o6zg5n4%+HI=vSWS@GRuznIoK>a=I2nWTI6vSWr#HOr0}Hq9(MX4nl@InOb}ZZgY`8FsT-cFeF_&9Y;L-DZ`G z95ZZ&S$52@JI%6VhTUzJ9W(4+v+S5*_nT$M44Y|{^BgnmL9^_bVGo;S#|(SaEIVe{ zV`kYg!=5n9ju|%FDi=Fu*c`L$m|;(wWycJA)+{?_*j%fe@0ejPm}SQdn{SpKGwda^ z?3iJ%SmkW}J!JJQcD!bm^%s%VS6*P2_4hl}S6*nA9lzdTkyS2s%6xta6Uyh_T5mJB}Dz%(CN%@vB*O95H^g$_0)Y_J>(^ z%&@=AvSWt*W0oB=ENfTe4s?NIhBY+Hjv3b2D(5(6*!E`GF~gdeWycI_YL*={Y$vnq zm|@M#vSWrdx5|Z%8P>uqJ7(B!X4x^rTAF3Y4BOKx=Q?KC-e%b`!}c}Hjv2PUS$52@ zR#v&tF~bft%Z?d#kXd%jutUtUV}`Xc%Z?d#xLJ10up_N~IS zcFeGRv+S5*g=X0?!-}nPkz^QURm|^YAvSWs|x5{~r8P>rpJ7(BPX4x^r zI+|t24C`!_iySkoi&=Keuv5*lV}_k>mK`(f472Q*VcpEKV}_k&mGc}ktcO{4%&>FJ zvSWswXO##X^Bps6uvvD@ zu%TwzF~f$NWycJ=#42a&FS@U9!C|CX*57nrUwO1y)?XP@UwMpKcKpVeaaOt5F}E)_ z%Z|Byg;{pY?W@ePV{TtdbNOzwoR_(LuT?H^95L=U z%Z?+)Otb7bVmxS;9Y>6Zt#Xdzi1Dadb{sJtGs})6#uH}Qam1Kyl?xm*Y>ruW%&@1; zvSWrlYnB}|Y_3^$%&-^CvSWtLx5_z=8TOJ{cFeF>%(7#Ky=ImjGi-rbcFeGaX4x^r z7Fp#&#|(SREIVe{60_`>Vegn_#|&F)m2(|4Y?)bh%&_HV*)hXDFw2e^_MufSbj+}i z&9Y;Ltu)Jy8TOf3cFeF!w>U$1ebRW5eS?W4@HV{T`g zWyjpkHOr25lR=L12!}^+K#|-OlmK`(fBD3t6 zVS~)FV}=bj%Z?c~)GFsVX4r7E?3iJfm}SQd8)=puGi%&Rjv02fRnB$HunA__F~cUAWycJgY?d7}Y^qf*bj+}6X4x^rZZOM^ z8FrIdcFeGw&9Y;L-D;K{Gwe32oa>ljGt9DMhTUnF9W(51v+S5*_nKwL47=YfJ7(BS zt6b!mVGo*R#|(SeEIVe{qh{GL!ydEBd5#(OgjsgXu-RtWF~jDVWycJA+A0@0X4tc4 z*)hZBnq|ifd%-L_X4rhQ?3iIMnPtZed&Mf}IcC^vX4x^r7MNwn3|nZH9W!i^S$52@ zx6HC*hApwm#f};Fj#+lhu%%|%F~gRbWycI#Zk6*LGwcJi?3iI6nq|if``9cyX4p!r zoSmEb7e0JumUA+fSD9t~MHTg}xUM$Kj^9(U#wr&(=Jr=+*)g}jHp`B={jFJc%oC9dmn&S$53rU(K>(ZvSSLvx_r-B>ynW zMVZTgndQRF<$ug_LFRJS?#BJ+?EK8-hGsc0bGflqE^r(%wl~X;BSsUm>^NdHHOr18 z#!gl_$8p4HW|kdCjOJ$9al~k0mK{fo-K=tfV}`Xf%Z?egr&)H)u)WQ)V}|W(mK`%} zf3xhEVXdrkj$?)$XqFu_>>#u3m|=&QWycI_W0oB=>~OQ}m|;g+~ga zcFeF`v+S5*`BpjCF~bVYvSWr7n`OrgJH{+KX4r97xzI7g+L>j?3~O(e9W$(hS$52@ zlgzSXhIKT{jv3b3D(5<8SQoSGm|>@yWycIV-7Gt1*coQoF~howH z|0Bh-ta5fDGzi;;`no-=ZgJ-BIaaqQbN4)}TbQ|fzSS+r-0f|3^D}q*SlztL-M&^g zH*>eY)y>(~t#7H|BCA{EIKB-s%Z}sQV6*Hvz6~|Yj^o>KtDNUJzFlIL9mltkX4!Fk z8*P>y$G0(7xyW&R8)uds$G6MPvg7!6g;{nS->x#tj^o?aX4!Fkn_!jm9LKjwX4!Fk zn{1XH$G53w*>QZEW|ketw;Rl|;~f1at6c1uVK5G`VO%Vn`OuE5qZ=q7dz(m zV`kYgx1TV}j=4SCEIa1*9JB10+fSQi$J~C_D(5@q_FS{^Ne4V3l(mM~n~6vg3&Hu~~K;F;<#o#}VT*t6boiVXMrtV}`9Z z%Z?eg#wK4*)hY`n`Org+h~>@GwesR?3iIcnPtZe z+hmms9W!i;S$52@U(K>(hW%!i9W(3?tDNhYVSkxr#|-<&EIVdcR?GBqlj4XtvaV}><0%Z?egy;*k5uqI~NF~gdgWycKL$t*i&STn1f>zHB9 z&9Y;LwJ^($8Md2QcFeGrX4x^r_B6{n!|Gd6-`gr@XJ=fE-`DCEXYTHAb&E20TUp)0 z%-sX6Zb9bmK~^_EbN3Ldo0qxU#_Hx~?jCM+bGCKsTPirx>J~YUZ%3JB$MG%OEIW>G zxn|jMe9O1Wd5+^-p;>ku--^w$^Q!i zWR@Mrw~l7naeV7+mGd0Ow=QPcaeO<~EIW>Gr<-NR@$C$=>^Q!4Gs}*1^s}sTv15ky zFw2e^c8*zg%&_y!vSWswZS#<$T8s8)=puGin`Ou6d4gGXe4ZznWyc;i*(^Kuu&HL*v4>4F%Z@$l2D9wg!)`Lm zjy>#Vt6b>V!)`Upjy>!)v+UTzW|(Ei9(Jc$cI;tyn`OrycCT4>>|yttWyc;i(=0po zum{buW1Zn)tDK#aah>5&t6QA8`K111&bGP*nY(kWZhq$O(^fYxbN5-R zo13{i*XrhM>(;l<@PgGXa!jB3X4x@)UNXy$>GO(Nc1)kw%(7$pEHKNC>9f!*JEqSf zv+S5YZ<%Gs^jTt-9mltKta7nq4_j)M9eda^v+UTzmYZeA9`=D*cI;svnq|ix_OV%Z z>|ra-vSSbX%q%AzSq}XZ*}z-zSq~?Xm$1Xz1P?M(dz22d#|tilhxJV_Fi9i zlhw`5{2pzwx;fjrA-s_lLeob48y2fYVdQ}!>>$|~wJ1D|{oOG2|2J1H3O{0-CEKJH zh22_*5aWJp)3B#n6i&kSl&rH_6t2bwNj6C>3a?PJ(3i$_x&_%Lh zwJ2PIwU=zPS`=nug_1q37KL@#k&b|^5^ZZ7KI+z#gd(;7KK}}GRbDBMPV6swqzfuMWN}TA#|0j znOYP&Vkbz}MJ);wup-GOt3}~8tgU1V)uQkR#*4|%_K#W=3fqLxOtNFtqA&uB$$%d#!;UTP#WV6(wP>c1DY^_=p z_BlL+QzeV5MWH9wL9$+IQJ9VuOLm7^6l$=eBwL{tg&mIwfgOO?Af^_DPFR-wY+co& za4q(${A|~$Md1x>AL%Yui)5!7B3UDLuargMSnNW{O4On-7V9b5c(o`zhn*(bJhdp) zVJAwqS&i3}H}Yu75^B7rSVFQPYP_ZxJ0m~aEHz$J>;}o!szqU6UX%%vwNi`1x!5?# zE>MfY3~ab$cdJEV1-3-8Pt>B&oG0>{WV@+F;WTWnWM`^HVH);?WH+frVKFvSvUk;@ z&^SAU8ImPJ(3S5$f=8_$)#w@{( zOijZuS}h7sVFya~j9L`dV|z;WqgoUW&E<0>*%4|{=#Mp)Y>-+M9>D&P$9+UC3ahaO zvj2Uh#(R_(!dBV;TB$|hJnSs_^LndA;SQ{eWcR2=;X|ywWGmI8uuDEOQL^3DqHsEP zvt-@WqHsMnS+WYXC@jIQkZh@16t*h}VWeb{S`<29gCy&y7KJ3%Te692%zJEKc?}k* z@g8AAx4lPd%zK7-U&;8Uxft&ec8+AD)tL9#>5@II#=OT)l5C?I^PVAjjAU)pnD-bv z1@C!(wJ6++F@(uxszqTXHeY^@RccY#oq;n)vc1%z&<%T7vL0$tsKD-)Y`R($mSS5Z zTdo#`h!6RC$#zy_-eYSd>!KEgiP*=IO;L-&0&J;di`1gr@dFzpS&3Q{#$iJxyFx7r&trWhdr>V4o3Nil>izvyEeeVD zA$%uUo>~-!VqZvhiCPpM$5u%8lv)(N#deWwy;>9wI3a{r;H9kk!G|76X@j1fUW~F|%>1uqAu-1|-SL1WU0dz0P zc2?tagvBK5qQ>V4+fK46YJ85cKjr6Lq{in6YuG6DxD6O7DdRoDeruS@O4Ooo8TPe2 z=PT8s@B;RkWG|^jVKcT|vaM=S$UZrQwX1OYEk$OJ3+Dy zYRtNhoD)jcMlA{#Vy)yk4^ZRW7HcWlgKAOu9NS5TAvVGN}a5navJm+)O zIJd=qlx&6?=V90_@?2J^MPaATAxx31xmpxX!LF3-G_@#9#zsjtO^x#~>|)6lt3@H} z6waw7YpfQ9aUO=Xlk9Fa&cm>L z$v#ozJnYmE4wq~>|njQsX>~1NZro9j(T7DArA~F=||YV86(7c}^_~ z8?g0cxCw zVGl~yTaEKD>`uwz)~drXbb z5q7d<->5}l|FikLNp_%G6nbGfl9j1N;ZE#O$?jE)!bjLU@)~@q7KIi)c+QfwREt6> z_JU;H)uM0%He0fr)uQk=_Ml|%sYPM?p6nZvHC2nkiP$yrTso<-HiC_nY?4|OUd4t< z_PQF^@mN2}{!xoU(K#V(lE*k!EefNtb&`!!i^4P5YRR5gV?77^P_j*GTyrw~T1b{q z<8y?)Dvvu@jn5JGoMf}q_#9!6OZK%IpQH0asFdsgH9kk!?UMCY<8y>vFWEh6e2%cA za`jn7dpuHz-!U5(EXwzp*6)c71>%_XZ)<8y>VZY11J4ubT7VH~&&I{F|@F(`UWZ{Bs7KLK$eaVhfi^8SYV#zL3i^8*54|#qs zsIe}9ohsR8wJ03fn{^P$veh^qVa1XSQ;Wi**a7mKpHPd!T5J!=zEg`rtFjPwmh2$4 zC|rOwlI%jYDBO+xF3TsTPH=u@RE3Q{&vbe+UC5J6Mf#Z|nle`l@m6jdho-QjK$O>{od%tJFC69uUGt z$@Ws?+#CB!vL0%jdt)mlo36&WH?~Z&Y#AdvOTg%X2SK8rQJcJjr^haSe-|CqLV5YFxu&XGr$G8rQHxLg*-2 zGc~SZvEwA`s>U@emMhs*HLhW?Hj=%m#x*SVuDk{fhi)^jkFeJzD^cSb7Mmy86>6M& zV^2x;q8it**h7;2s>U_!F!l|}^3=G7#U{vexkQa?SZthRPpNSYiw&1-y;>An4-cWg zWQVG;7KCk<$LOyXh5NAYC3`?E3ZG%MlC4&Y!XD+kmy+$H7KO90T_rn5jn5JGnmq1w zH9kk!T*;QJ@j2qe>f8&t(I4*Oc)& z!VZ?Kof@AbY#+(StMNI)c9Cqp8lNL<2g!a><8w5Udqwi|=Bn{I!WuV9eYVQgc#p6@ zWZ!*CjcZu!TY1hK)VPKn#agapZPd7i#XgX1fEw4Z*b>PeRO1>J>nYE#R*h@e(X6*i zwyzr3u-J)`ovX$*EOxYHGt{_-#SWC`yh4p@*h^UlmaMrN*RWVK$xc(_8Ww9T*)%n- zVX;5tIWJb@8g>k8+>$j`;~Ey5F3;rzwJ2PUT_@R9YEhVnB_(@VEecz(OC|eFEebhf zxl18gfm#%XV;4#`QY{KkVqN4pSE;e4inW()qgoUW9>=<}WQVCmp)Yo%WEZJLp%Qyp z9^)Z3?xA7NNVY~T3VU4^!Ys-5Q{x^QcAsSDsd2vtn=FrUhguYtV^>J_p;{DnzMOSx z$#zkTLKke1WT&e|VG7n;vg_5Nun0R#vL$L!Xuttrt2~$O)S}Q1`$4h}YEc-Et(7dP z7KQoPr;@#*7KLB18p(cFi$d-dA-pMBp;{Emu{rWwMyavxjXf;c(`r%p9=ltzAJn37 z$d#<~OLn+g6#8Lt+1CcDMPVkkyJQcmMd1r*YC@szqTcwnnlW)S~bv_OWDdt3{#V z)vSd}w!K;uO0b2Jov0RtE3o;JU9A>{7qMRQv%RVogT9@=W>@?6h6Q%lk8))D8weQRxjDEYEd{98z9*k zYEifj+aix~qgoW+!q!Xnj#?BNadNdrvK`c-&>s6(vXj)Ja3xkPk8zD!6kfufm+UpQ zC~U=^l> zQ5b;jE7`?rQFst*A=#s9+=s=QNVZmudwf&5pCUhRD>c^tuX^* z)L6H`zLV$tsT%7R*RiHASxYt6EwB}mbys8E0()Dso7Gsiz|N89_nsQ-7Sp)zB3V;4 z)-AA;BGl2D7nAZ(gsL)BQL#jcj@akVIXg^iKyTeT>}Z{)s< zWUbYra6Z;ovOa22xC`ql&-p&JD13~aAlYYXQP}k+*5xJJLoEttU~MHkODzgFVz0QMd-1B9C#c8tWF=m69z~W8DH9C0S~m zr;K$A>|)7|Q)Ar%E0gRpHP$V#vn6{$jdcs`H+e3b)mXQ|>%Y|yJTVRh!cE1|y7T7(KeXhp3#dPjh zNVcaM>lRom+1JiiW8DI4DcP-RtXp6^NmirAy2WkWJCSTBHP$UKegHnxr>L=RfiWD& zCabY-fpOp^dqa(N3v85RS+{R9)-A9N@|=%XW8DJ#QnJg{Shv7Fk!+qC>lWC1l5J6A z-C_o7;gaR3v2KCADA{l|)-AB}IXmm2F9*c+1dP~&SIY_=Nf7T9dbzE@-2;$GIS zB|AiobqnlH$@;0WZh_q-*-SOoEwCK<41S@;y2X90w@bFS8tWF=evW8GpV>(ug@$x~z90^3`%OVqd~#+pm^ zlp5<6*!GgGS7Y7c0oJMIIUlOVx&^jLvi@qUTVS_mrRK&1YOGse*GslqjdhC$xep=P zK5DF6U}GgaM=c7sV8bN4U5)Q7V*MohK#lL$J;XY7!_?!()S}QC>mb>wYJ9&AE0*j! zwJ0paj*{#xwMb54UzNvb^e}fHuqYgdJttXvHSX(Tk4tu?8u#9@O37YQP>pp9>>J5y)mXQf#T^96_Elru0()PwbJbY4z!pn3LydI{>}h!}E7VxGc#L&w z$(pONZh_q^*=cI5TVS_JHcgFn3+#XfsrPrW8tWF1b1y-%#%iovU^`28f*R`lWBD$u3f3-2z)A*+XiqTVO9qwnmM0i`lHf%g?r-8tWEVcgfCEW8DHf zMY228Shv7RB>PZ}b&IFCBO%!?YOGseM@V+M8tWF=GIMHP$WW@SG*v zPK|X7>}kn5sIhK=vE%W6B-L2Az!>Ueuc)zZfn6)l<##pKEjXx-m#k2Ybqj2SWTVtr zx4;HU_Ou%77TB-y7(b}7Zo!k=DB0m^tXp7TNj6Z8bqj2zWDl#cZh^fnkMX4%>lV+j z{w&%4YOGsePf6BGjdcs`A<6DkW8DI~OR|sDShskV`v#J=P-EQ!%azYysT%7RSR2W1 zP-EQ!+h4M`)mXQ9j(ZrAZLb!E60E6YC#tb-fn`Z{wHoUd*!S{WUR7h=0;`qm4>i^; z=CV#LS&?Y>Ww|J2iddZ5_Shv7llgGGJjdcrbu4K=uv2KAqAz7Uo>lS?Q zXG(UY8tWF=b@CV&tFdl@B_(@Qjdcs`Qpwh;v2O7)YsiwdQe)i$yHK(V)cD>K)>E>( z)%e~L_J=%|Pt^F{(krZcOSYRD-&?}ImF!G4zPE&}lI$imzPE&ZAlbWWd~fMh?gvQL zM2+t)Vb92OIa!VGEn%}Ho1n(`mazLIt5)NCOW1VD{!-(6ORsT1K=!qx)%e~Lwx?uc z)cD>K)=aYJ)cD>K)>yKi)cD>~HIE@PtgRZ~x4^EGY_J;Nx4@E;%~Iq07TBedeXYj# zEf%mQEzkJ?HNJ0wt(B~|8f#0~r;^>H#`i6-8p&3w@qLTeS(BD*cQw9mfxRqQH#NR* zf%R^XI#yJu@qG*IEXkIt@qLSh++UC^Qses;SbNDjs`0%gtWdIvYJ6`AJ5sU*YJ6`A ztC82>Z#BNR^ajsavSZZv-V(-+$MYMj#`l&mhC10?HNLlmal%CQvl`!9;-Gq;WJjs- zy(Mh2JeMJAd~XT6LbAuy_}&sWQnGK<_}&svZjfXLs`0%gY^yv*nHt|)!hVqKUNzSL zu(gtXs>b@?TfCQ&wNzvM4_hdY(Or%8KWx5aH>!il|A9k~3lhj!M!}79Huixuxtp8z$N%oH#>winQ4i|?)mZ<-K9=lpHP-*IrILNC#`@no+z*h)XsyQj zA9ki>ebiY0!#YWJpBn3b*zuBmrpEf;yR0EMOua69sImTs?JL!?sA)S&j8S><)P@*Q&AphutXILN(U^u!)kTmRC~7`X6?g zWXGwo{)d%Ic9|OMf7k%YUQlEG4?A6+^JX>H|CX_aELpZ1>wnlWk_}U1{SV8Q>wnlZd5q81SpQqj+OTAMso(iW=*G*w2zpR%87S`%bbq z)L8$+zK|^IgKft8AGSiW>Qj2(~pQm)4OAI4B8o2|zBAI1q2+4pL!|8ekmRwnn&lFd|O{STWW&*cj>*8e_Z?OL+E)mZ<-MoHFFjrBk5V##h(WBm{NO&;TY zHP-(==e?AynHuYV*w>PERb%}Rqr}fPRgLvO>SpUNgm+TTX*8i|pl0Buy`XAO( zvh`}L|E=c!f@FuPvHpiOl&rrR>wnk=c`gsAvHpjBDcNc@*8gf*LzZkGHP-*I_ar+< zjrBk5e0hx9)mZ<-x=Hqd8tZ>+Sm&24rpEdo)=sih)mZ<-4wcW$b!x2tVf#t;mRcl> z-n&ZH=u1|KG1mXENV4{7tp8y_vMbeC|HFQ1klGJkQe*uOyE7}5ZB=9a?<>}`CCgW1 z{STWY*$6e(|FFv?o1@11A9jgk8`N0;XJ~HELYLVkb-Xni|)z*s+rRsm3+zx7-hqtXPd}SZsm3E|;ot4U4@X*|Ta~ z!(y`~t5f3|_B-xPNOq(e*Ra_2@)#GZaSe-IBiW;BT*G2xC0nb;HS9Xpvn6Y##x*R~ zPqGWtxQ4~fmF#Xcu3@piJTP@j5YFxu&A4>MF z8rQJvxg#N26E)r=>^XTZC#!J{i#;yc1U0TsYFxu&k4yHm8rQHtvu{Xtlp5Et*i?Bg zL)5s2#jcXU@ecCTce)VPMl zZk2438rQH`fqVvESK}HMJ3_L5)VPNIg?l2B9jnGQEVhSa;Y^WO7u-Hn;9#`WU7F#CSw`yF&Zsp#DJVt9Zu3@q6lJ!yJ z8WuZ6visDyhQ&%G`%H~%SWe8^$Y*8`HLhW?{Utj~jpGrvn`F1BaSe+#m28@qd3VX=Xdy`aW5EVjGslbh9ekN)IZSF(f}pChc7WJA=Lb=aAb%~Iodgmsc^ts3jz zf3a2|SzL{K6Ih;Pz0|mWgdHZ?9ctX;!{U;yP~$x8Z_XLyHI1op9)@+4>{K<*!?5Ed zyH1VsFf3QHx6~r}qT1{7x-|NSJ1ZFHVc0y$+N*IMhCL-aVGl|6k{ah>*bVX+ zTh%xZ3t3@;Wcg~GhhgI+8==N|7&ct8Icl7TVf`iBpvHMvR#rGqvNmd*hhcxqa~Yt< zeOPR>WDlxw9~S#wvRXCn!#2nYwUX_t#(h}qBgxKH<323*u4FURc#p8T@?2J^aUYhG z_9rB3uEu>>Y^G$Vsc|0`n<3dWHSWV=2g~PUu^RVb86^8i)>w`Eu-Gn=ouI~jSZoK$ zu2SPZEcTN;#>;BlhsC~?>^C*;!#2(et0XH><323*fn+1qxDSghk*rFM`>@z+l5JGu zKJ0c`;X-*XhpBNN7V9b5MQYrK#ZHs#AvNy9Vkb(rMveQh+h>KNCEHJp`>rSAF6R5c89ERsbssTaUT{NBH8I`+=s>9l;*2 z!ZVU>r^bC)Y?fpl)VL3e-6vU6jr*|Jbje;(<323*gJi#}aUV9y3Tq`RRO3D@_Nio} z)VL3e)kyZV8uwwb!{j~sL5=&cO|wE=vcuK54~y+C*+4b!!(uy1_OKfFVX+31eW}KM zSQc`(%H!^@#;n6yZku&#yhqqY+h&~_pCj!2ZL>~|S;qx&H_2jZtP5bBCF`oj+6~rD zvMFk;uVML;y`jeO13O%@)Zsd19OJQ8k{zqYc^G!4{A^>@I1j@*Nj6uF^Dyjq$$nPj zJgiw($dl|SHI5(Hjgk#f<2($TDA{9boQGkTN%oBz=V7s|P%hblYMh5*10*X`<2(%O zCE2}doQGl0OZKT6=V8sW!jqDZd$ znyPUghJ7JfCpFH)uoaR`QsX=fdt0*C)i@8sswMkJjrXWUR@lB#>U{E8HIDJvU-JKV znHp=L*e1#5sj?IG{)FKVoT?wS<_N|vL>IyH8IWW&@r55u}k_P84F5q64X->7jt z!_EB?$qrECniDIK>;g6JZDU7Bc9$C8Kfn%<>?1YqMf1P63t78>uyfcU#*eh^pVM!ubq?_lJSk?&~aI~#e-$agXFU5$KqBj3Zw_cHQ*jC?;Mj~n>`M&8=U4>s~c zjr=epKf=h{8hOIVbBsLC$P0|T$jFa2@?(wscq1<{@)L~wL?b`h$U7PNDMsGa$WJr! zQX@ap$h#Z)*+$;e$j>$MUPgX_k(U|yg+|`b$OjntKqJ4{$cGsDFe5KF@)1Tp%E&J@ z^07vKnURk-@+*xzY2?=!`9veX*2t$A`E^Eqy^-H&d_?{4I08+lJ7Ki9~6 z8Tkc9US{MM8hJk>A7JDIjr?LGA7bRgjJ({)M;Q4iBfr$h#~S%%Mn2xiuQc+ckzZrv z6OH^@BcEdA*BSZsMt-A_R~Y#%Mn2uhZ#VKgjQlPmzsJb$GxAC!f56BeGV(`^e3p?v zZsboI`BO$-W#rEo`Ey48yphi{@)wQ#Wg~yp$g7R~bt8Yn$lo;b#YX7jeM<-oQtH!||=jC=0o9Mt-o7A8O=>8Tk=L-qy$yMxJBjc}8AfccW$wuDE$WJlyu10>Ek(V0znMU5-$j>(No<@GIk@qt43yi$X$S*YVenvjP$Ojtv z#YR5F$cGtuxsi`B@=->9sgaL0^2>~TypdmNgic`L#wq#mKKS^6QQKMkB8< z@>`62x{=>*6+Jl}7%6kw0YQj~MwZBY)h;pEUBPjJ(RopE2_1jQn{c zpJ(JR8u`mc{;H8z8~N)-{)UmiY2=HI{B0wD*T~;9@){$5-^f=O`A0_niIIP5WPk#9EgUyOXKk^gSwe;WDUMxOe`4gc%; zzmYdG^6iX#2P2P+d`BbS*~nu?zKfCXYUH~c`5s2Tmyz#d?vqND+t((OPRP?imN}5hrfr-WvDTxVOeF&bVq_^?%2<|9HQ*57!mt`J4#9Jm;Kz z5jc4bKiu#m4L{oOV-2qveuCjA8Gf?iry72`;b$6tw&8Wd&olf2!!I)YV#6;r{Bpyu zG`wN>HHKej_zi~NWcV$H-)8t7hBpnr+wgl0zu)i&4S(41M-6}6@Rs3E8UBpn&l&!L z;V&8fis7#r-ZuPA!{0XiUBllu`~$;3GW-+6JBEL5_?L$N)9`;8{;lEP8~$&@yBD4L z#b5s${wu>5F?=z@moR)u!8X|Jv~17`}qxD;d6u;j0;5FnkTe2OGY&;p-Z{ zzTq1fKFn~(aL@3-@W}AQ@C^;$*zipaFB-m?;hP)2rQur{{#(PhHT-vmmkj^C;X4@q z2g7$Z{EvqJ$?!iLUN(Gp!zUWPhv9n~{ujgdGJLw>6~kv5KHKnp4ByxAzZ(8G!~br0 z)$o59ez4((8h*IpM;d;#;l~ay{A|PPhM#Bn1%_W__{D}_ zYWU@bUuk&5@M{de&hQ%yzsc}h48P6rI}C3cez)QG8h*dw4;uck;g1^rxZy3spECRz z!=E$!1;bx5{1wArGrVp1n})w__`8O`Z}e`NS4hIb7A-0&|A|EJ;qGW=V^zc>8f zhIe0R>=%FiZ}_haU&Qdm3}3?VB@JK7@Vw#682)R+e`ELxhOcD!Du%CSc){>B3?FRx z+J>)d`1*!#VE8b@9m74t1H&W36T>$&d}G5mHN0r}W`=KW_?CumW%zFm-`4Qo8D28{ z_lECa_#X`4+3-Ia{wKr#Y6lMO%B@Y4-H)9|wmuN!`z;TITw zk>M8`eyQP?8-AtX4a2W7{5r#LF#IONZ!!Ef!|yP>Y53iS-)s2&hCgWd!-hX<_~VAR z41db-XAFPN@D~h!$?#VUf6ef=;cpuLw&Cv@{=VTK82*vrpBUaT{By&c^}pf2GJFxk7c+bb!HGEsc ze`k2f@ZTH0gW-QLd}qV|X!xHD|Fhv`!*@4)qTzcOzNg`TF?=t>ryE`|e5T>E4d2J` zeGUJs;eRvy?}k?m|A*lR8-A$ahZ}yR;YS;Otl>4oPcZx>!%sH+RKrg<{7l2oHoR{5 zd4^wL_(g_aZ1|;yUvBu7hBpkq#_;P5zrpaE48O(j+YGQ~`+%r5dJTg2nd_%)GHhfdVi-vDz_~wRhY4}!# z|JLwr4ga0tCBuJj_zs5u!SJ08|D)l5GW^emmkrivIyzhV3K z?$f;1R3$kKQ;np1E$BMQC72o{w_s|LJc6l3@(QLl z$;X&FB;D&Rbw31p`x%HSPg20tz4h+nV(MPCrzhQO;ucB9Vk(hL#8f8fUa_u1aww)M z$tjp>B;D)r)JeKmOmC1pjHyZTGNu+u_ZqBik{>X2NS6BPllbS4w0kAB?&UmskKMsk zAQ_3NtG)YluSHWN>0XJtL^2ywndA^m6_W0CBC8||Fx5zI!c-^eUhSzt@)D*d$%mL) zB;R9dlMKMqLx*Iw?h^)Xy+=A6Q=X)VsX#IYlS8sQrtbZEKh7*nC6a?Nl}YAfs*qfS zsY-GqrW(nEnCc`iVrr0lfT>CH9i|q^l6YcnldKBqkPPcSdE?f5Tq7{$NlKUsB;zqT zBr`D;N#i$^0pX+8!6_Q6VRY_jOR3rHm zQ=Oy_y4)aH7SbeH3(_KqA#IYaAsv!kAvxT7XP$;BPjVop0?F~19Fp@f6-lngR3do* zQ<>yNOcjz3F;z)^z*Hj{xES_BG6>Qj@gYr;Eg&tDogi(JDUc4y{*WAQz5N`6DNk|^ zrUJ>;m>iOOFcnFj#Z)4B4^x@s8%!0F{)=NjB&$MdB*P(fl97-G$yi8}WD=xBG8fV& zIRerlIRlczt+$^mFy%?^#8e=85|cyn7N#P}SC~p9i{et0Ws(&k6_O#4D#<308p-yM zI>~rQgJc$@Npc9JMRE$HO>zmOLvkwwmyr9}ejdY=CwU!Hf#fqx4oP493cpCQ9Hd0D z4x~(yLMkNNK&m9WL24v3Aa#<1APtfeAx)ACAuW;{A#IX}ARUsIA-HJU&-U{%raZ}y zmlaNSkEwrLZ58l_5FYueYC}kUYrPPlu1s5 zR7fs^R7q}!)JUFy)JfieG)TUHG)em5|KVFC%R|~E>p?ms8+HHBA3s)aKifg_B;z0j zlD#1g$vjArWIm)svH(&hxfxO+c?41=c@66EPNS1{(N!Eh2NMcBvWNS!= zWLHQIKVNS@(;#`010e;H;~@^o`H&*X^^g+D1CTPwi;xP*hmb1C50DzkK)m*Ion#QC zLE=N2BwIjQBs)RcBvT+AlKmmw-^%Ij=NL$y9+3aOB61F4ei2C0$EfYeD2 zf;31@gfvMmgtSO*gtSQ>f^k%lObi2{U8;Rqaan1vmiB+s~~lfyC4mcry)&}cOWg2uOV%c#qp;N z9g>wHIqaynpP`UE$p}b+WDLY1nE)x0%z>0h4uh0QPJ>iPE`wA_Zim!Jo`BRz-hebn zzJN4I`r#7IEt2ISZIbmM9g>Z@7k0)Td;8fAk|!AlDUj?9aY*JtiX`(PC6Wb@GRe)5 z3dtjoD#@#m8p)@SI!T`uu^*CUAx)CCAT5#@(k9s&(jnOulEbch`i)1HAn`8>4L$W`l zdvWmIevX0UNzQ>3NUnxBB=h*$en?h@)JTRy>Leo}4U(~t zCdnj7i)1dOO>zXJLvjWrhxbr#KUYBVBzHmzBu_#dlD8m5lCK~ol0{d+en?h?R7i$E zswA60Y9!l3>LlYK4U$=qCdna?7Rf1)HpwNB4#};M9Nvq){X7QAle`WokbDMlNc!TB zREs3bK}sa+K*}U3q(ZU{q)M_Iq((9WQYSeG(jYkz(j>VM(jvJL(k6Kb(jj>nlEZtt zx1Wz8d6FL?1(Ky#!+uECgcM0aNQq=Lq)f64q(U+kQYAS6QX@GIQYSeV(jd7O(j>VL z(js{t(k595>5zN}$>F1+x1Ry4V?QLTLkc7=#3304DU$36DUnQulu7o3R7j43R7uW) z)JU#^)Jg7wG)SI?G)dlpv`D^&v`H2(U_T@)L%M(6ptql)kUYrPPlu1s5R7fs^R7q}!)JUFy)JfieG)TUHG)ejm!hT4WhqOu7gLFtXg5>Zq)Z5Q? zkUYsaNP%Q;h(j_DQY4uVDUmFIlu2%eR7f6yR7qZi)JQ&s)JgiRf&Gvy3u%(91!NQ-1ANSkB|q(iblB!`d1-hPgO|wh2FZz#Cdq}67Ril}HpxSf4#~@q96ri>`}r7>C;1UlAX$1H?1yAcNRcFjlt@NH z$|So$DkM`ORgwcBHIm~Xb&_)-4U%giO_KW{Et2OUZIXqM4#{_r96l3z`x&q<_CvBd zq(I_A9FkFxBFT=B63JvpnPfjmh2$tmmE3dv=VD#`7T8p#uoI>{T5 z2FVwYCP}~bu^*DpuOiR3*5$wC$>H<4x1Yx#d6L&51(MGo4oTnP z*bm8akP^u{kTOXMsgP^~sgmplsgcZp)JYD4G)PW_G)XRmv`B7*v`HRO=sBu7E2BxgZt zBv(P|BzHj?Bu_({B=104Bws_?B#V3456Q}q9G)q9`xy$!lZ=2ANX9@Mk_nI^$s9Z$k{Hq^ z*&5Oz*%gw*^Gk0((;#`010e;H;~@^o`H&*X^^g+D1CTPwi;xP*hmb1C50Dzkz!3W( z83bvN_>d;a7LXRnPLMXq6iA0;e@G6`LB0JP1Id$|11XSP4RJ{BffPxeg_KC%gOo|W zfmBHPN7xU^s*oDVa7dkGB&0zy7Sbe{1Zk1Xg|tbIfOJUCfaLHz)!WY%kUYtqkOIk* z5QpR~NRi|#NQq?882cev5mF%;0;!U00;!Q~52=%khcrlLL7F6oKw2cHK-wgiKsqG1 zLUMR6>+R<;NS@?%NP*-th(pph!G1`VgOo_tfs{#7NQGn@NR?zaNR4C$q)u`Wq(O2b zq)Boiq(yQgq)qY=q(kyDB!}m_-hMuYjDkPUdswB5VY9voU>LhPK8YEvpnk4-; z#(qeahqOu7gLFtXg5>Z_+S|`|kUYsaNP%Q;h(j_DQY4uVDUmFIlu2%eR7f6yR7qZi z)JQ&s)Jghmg8h&z3u%(91!NQ-1ANSkB|q(iblB!}nU-hPgO z5#k($>F)ax1Wz8d6FL? z1(KyV!+uECgcM0aNQq=Lq)f64q(U+kQYAS6QX@GIQYSeV(jd7O(j>VL(js{t(k595 z>5zN}$)N|m{R|j|{gA8UHBe@DvC%FsK zAbA?nBzXtYBKaE9CRu!Q?1yA!NDhVQ?Pn+?Pci~hAQ=O3NG3pvBy%7olEWZnlG7j+ zlFJ}flG`CQk|!W_k~bg?k}n`ll73rYKP1aT+9c~iIwTuGa;QjeKifg_B;z0jlD#1g z$vjArWIm)svH(&hxfxO+c@$D5c^y(C`5aOw>9-~JL$U&-Niqb|BH0wuCK&_ikW7T+ zP@3L;=0fr$M?wlDXF(j22Bb)G52Qr$9HdOL5K5%sS%izJzPv5W)Yy+?MlRF4+A2)9DobfX!j+?OOqzO~UO_?x$uf4|YQJFn6 zxApXWW=x&5<&2qg@#aZ0bAx|+(VRo;1#$6n_Z74?oVHG|rwh&Ym>R zo;1#$G|8Sc$(}UHo;1mxG|8Sc$(}UHo;1mxG|8Sc$(}ULo;1y#G|iqg&7L&Po;1y# zG|iqg&7Ks$HOudpG<#Cl$sW~pvS)Rj>|tFeds^4Y9@llU=XIUzfn6tiV%NzY*>&X1 zzmO|AvnywI<;<>}*_AW9a%QcTW=p!|O1NApmn-RVrCqMX%awY$k}p^K zbERRfM9h_nxsowgI_65qTq&6=DRZS|uEflhnz@oQS9<13&|E2+D@k*uX|6=gm8!Xt zHCMXkO4wW}n=5H^rERXn&6T>jk~dfS=1SmPDV!^bbER>vM9!7Uxso|oI_FC0Tq&I^ zsdJ@uuEfrj+PRWDS9<44@LVaLE6H=Ed9FmymFl^YJy*KtO88tUpDXEerG2i%&z1VQ zl0R4a=Sl!wDWEF}bftl=M9`HAx{^UxI_OCUJ?Wq)9rUDwo^;TY4tml-PdeyH2R-Sa zCmr7XYa^rVBHbkLIydeT8pI_OCUJ?Wq)9rUDwo^;TY4tml-PdeyH z2R-SaCmr;pgPwHIlMZ^)K~Fm9Ne4aYpeG&lq=TMx(31{&(m_u;=t&1X>7XYa^rVBH zbkLIydeT8pI_OCUJ?Wq)9rUDwo^;TY4tml-PdeyH2R-SaCmr;pgPwHIlMZ^)K~Fm9 zNe4aYpeG&lq=TMx(31{&(m_u;=t&1X>7XYa^rVBnbkLU$`qDvPI_OIWed(Yt9rUGx zzI4!+4*JqTUpnYZ2YuUL0>xPO9y@Fpf4TtrGvh7(3cMS(m`K3 z=t~EE>7Xwi^reHobkLU$`qDvPI_OIWed(Yt9rUGxzI4!+4*JqTUpnYZ2YuUL0>xPO9y@Fpf4TtrGvh7(3cMS(m`K3=t~EE>7Xwi^reHobkLU$`qDvP zI_OIWed(Yt9rUGxzI4!+4*JqTUpnYZ2YuUL0>xPO9y@Fpf4Tt zrGvh7(3cMS(m`K3=t~EE>7Xwi^reHobkLU$`qDvPIv7X?1L(gMoA~kPZgY!9Y3~NCyMyU?3d~q=SKUFpv%g(!oGF7)S>L>0lro z45WjBbTE((2GYSmIv7X?1L(gMoA~kPZgY z!9Y3~NCyMyU?3d~q=SKUFpv%g(!oGF7)S>L>0lro45WjBbTE((2GYSmIv7X?1L(gMoA~kPZgY!9Y3~NCyMyU?3d~q=SKUFpv%g z(!oGF7)S>L>0lro45WjBbTE((2GYSmIv7X?1L!~m4u;afP&yb&2Se## zC>;!?gQ0XVln#c{!B9FFN(V#fU??37rGue#Fq964(!o$V7)l32>0l@w45fpibTE_- zhSI@MIv7d^L+M~B9So&|p>!~m4u;afP&yb&2Se##C>;!?gQ0XVln#c{!B9FFN(V#f zU??37rGue#Fq964(!o$V7)l32>0l@w45fpibTE_-hSI@MIv7d^L+M~B9So&|p>!~m z4u;afP&yb&2Se##C>;!?gQ0XVln#c{!B9FFN(V#fU??37rGue#Fq964(!o$V7)l32 z>0l@w45fpibTE_-hSI@MIv7d^L+M~B9So&|p>!~m4u;afP&yb%2P5fVBpr;TgOPMF zk`6}F!ALq7Ne3h8U?d%kq=S)kFp>^N(!oeN7)b{s>0l%sjHH8+bTE<*M$*AZIv7a@ zBk5oy9gL)dk#sPU4o1?!NIDov2P5fVBpr;TgOPMFk`6}F!ALq7Ne3h8U?d%kq=S)k zFp>^N(!oeN7)b{s>0l%sjHH8+bTE<*M$*AZIv7a@Bk5oy9gL)dk#sPU4o1?!NIDov z2P5fVBpr;TgOPMFk`6}F!ALq7Ne3h8U?d%kq=S)kFp>^N(!oeN7)b{s>0l%sjHH8+ zbTE<*M$*AZIv7a@Bk5oy9gL)dk#sPU4o1?!NIDov2P5fVBpr;TgRyilmJY_!!B{#N zO9x}=U@RSsrGv3_FqRI+(!p3d7)u9Z>0m4!jHQFIbTF0<#?rx9Iv7g_W9eWl9gL-e zv2-w&4#v{KSUMO>2V?1AEFFxcgRyilmJY_!!B{#NO9x}=U@RSsrGv3_FqRI+(!p3d z7)u9Z>0m4!jHQFIbTF0<#?rx9Iv7g_W9eWl9gL-ev2-w&4#v{KSUMO>2V?1AEFFxc zgRyilmJY_!!B{#NO9x}=U@RSsrGv3_FqRI+(!p3d7)u9Z>0m4!jHQFIbTF0<#?rx9 zIv7g_W9eWl9gL-ev2-w&4#v{KSUMO>2V?1AEFFxcgRyilmJY_!!B{$&NCy+?U?Lq% zq=SicFp&->(!oSJm`Dc`>0lxqOr(Q}bTE+)Cepz~I+#cY6X{?g9ZaNyiF7cL4kpsU zL^_yA2NUUFA{|VmgNbx7kq#!(!9+TkNCy+?U?Lq%q=SicFp&->(!oSJm`Dc`>0lxq zOr(Q}bTE+)Cepz~I+#cY6X{?g9ZaNyiF7cL4kpsUL^_yA2NUUFA{|VmgNbx7kq#!( z!9+TkNCy+?U?Lq%q=SicFp&->(!oSJm`Dc`>0lxqOr(Q}bTE+)Cepz~I+#cY6X{?g z9ZaNyiF7cL4kpsUL^_yA2NUUFA{|VmgNbx7kq#!(!9+TkNCy+?U?Lq%q=Tt+FqICb z(!o?Zm`Vpz>0l}yOr?XVbTE|;rqaPwI+#iaQ|VwT9ZaQzsdO-v4yMw0l}yOr?XVbTE|; zrqaPwI+#iaQ|VwT9ZaQzsdO-v4yMw0l}yOr?XVbTE|;rqaPwI+#iaQ|VwT9ZaQzsdO-v z4yMw5jAz_mVG6ccg~6mwaiuBR#~u^b6{xi1?a+J-sv$_tMi#6>%>;y>t=x c($h;BaW6f+v=OgQpr@BQ;$C`s^l^#*13WI~XaE2J literal 0 HcmV?d00001 diff --git a/Microsoft.Windows.CppWinRT.2.0.210806.1/readme.txt b/Microsoft.Windows.CppWinRT.2.0.210806.1/readme.txt new file mode 100644 index 000000000..049ab13b8 --- /dev/null +++ b/Microsoft.Windows.CppWinRT.2.0.210806.1/readme.txt @@ -0,0 +1,22 @@ +======================================================================== +The Microsoft.Windows.CppWinRT NuGet package automatically generates C++/WinRT projection headers, +enabling you to both consume and produce Windows Runtime classes. +======================================================================== + +C++/WinRT detects Windows metadata required by the project, from: +* Platform winmd files in the SDK (both MSI and NuGet) +* NuGet package references containing winmd files +* Other project references producing winmd files +* Raw winmd file references +* Interface definition language (IDL) files in the project + +For any winmd file discovered above, C++/WinRT creates reference (consuming) projection headers. +Client code can simply #include these headers, which are created in the generated files directory (see below). + +For any IDL file contained in the project, C++/WinRT creates component (producing) projection headers. +In addition, C++/WinRT generates templates and skeleton implementations for each runtime class, under the Generated Files directory. + +======================================================================== +For more information, visit: +https://github.com/Microsoft/cppwinrt/tree/master/nuget +======================================================================== diff --git a/lib/utilities/stack_file_system.dart b/lib/utilities/stack_file_system.dart index 795ea9720..217b33eeb 100644 --- a/lib/utilities/stack_file_system.dart +++ b/lib/utilities/stack_file_system.dart @@ -151,7 +151,7 @@ abstract class StackFileSystem { static Future applicationXelisDirectory() async { final root = await applicationRootDirectory(); - final dir = Directory("${root.path}${Platform.pathSeparator}xelis"); + final dir = Directory("${root.path}/xelis"); if (!dir.existsSync()) { await dir.create(); } @@ -160,7 +160,7 @@ abstract class StackFileSystem { static Future applicationXelisTableDirectory() async { final xelis = await applicationXelisDirectory(); - final dir = Directory("${xelis.path}${Platform.pathSeparator}table"); + final dir = Directory("${xelis.path}/table"); if (!dir.existsSync()) { await dir.create(); } diff --git a/lib/wallets/wallet/impl/xelis_wallet.dart b/lib/wallets/wallet/impl/xelis_wallet.dart index bcbf09f4c..af5d24752 100644 --- a/lib/wallets/wallet/impl/xelis_wallet.dart +++ b/lib/wallets/wallet/impl/xelis_wallet.dart @@ -498,16 +498,16 @@ class XelisWallet extends LibXelisWallet { txType = TransactionType.outgoing; nonce = outgoing.nonce; + fee = Amount( + rawValue: BigInt.from(outgoing.fee), + fractionDigits: decimals, + ); + for (final transfer in outgoing.transfers) { final int decimals = await libXelisWallet!.getAssetDecimals( asset: transfer.asset, ); - fee = Amount( - rawValue: BigInt.from(outgoing.fee), - fractionDigits: decimals, - ); - inputs.add( InputV2.isarCantDoRequiredInDefaultConstructor( scriptSigHex: null, @@ -515,7 +515,7 @@ class XelisWallet extends LibXelisWallet { sequence: null, outpoint: null, addresses: [thisAddress], - valueStringSats: (transfer.amount + outgoing.fee).toString(), + valueStringSats: (transfer.amount).toString(), witness: null, innerRedeemScriptAsm: null, coinbase: null, @@ -534,7 +534,6 @@ class XelisWallet extends LibXelisWallet { otherData['asset_${transfer.asset}_amount'] = transfer.amount.toString(); - otherData['asset_${transfer.asset}_fee'] = fee.raw.toString(); if (transfer.extraData != null) { otherData['extraData_${transfer.asset}'] = transfer.extraData!.toJson(); diff --git a/lib/wallets/wallet/intermediate/lib_xelis_wallet.dart b/lib/wallets/wallet/intermediate/lib_xelis_wallet.dart index 901223469..c2b810b6e 100644 --- a/lib/wallets/wallet/intermediate/lib_xelis_wallet.dart +++ b/lib/wallets/wallet/intermediate/lib_xelis_wallet.dart @@ -182,7 +182,7 @@ abstract class LibXelisWallet return ""; } else { final appDir = await StackFileSystem.applicationXelisTableDirectory(); - return "${appDir.path}${Platform.pathSeparator}"; + return "${appDir.path}/"; } } @@ -319,7 +319,7 @@ abstract class LibXelisWallet static Future checkWalletExists(String walletId) async { final xelisDir = await StackFileSystem.applicationXelisDirectory(); final walletDir = Directory( - "${xelisDir.path}${Platform.pathSeparator}$walletId", + "${xelisDir.path}/$walletId", ); // TODO: should we check for certain files within the dir? return await walletDir.exists(); diff --git a/libtinfo5.deb b/libtinfo5.deb new file mode 100644 index 0000000000000000000000000000000000000000..06dbc4822258e8ff880345e7bf0af67398c2076f GIT binary patch literal 100086 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 Date: Mon, 14 Apr 2025 12:27:57 -0700 Subject: [PATCH 184/193] windows secp script fix --- scripts/windows/build_secp256k1.bat | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/scripts/windows/build_secp256k1.bat b/scripts/windows/build_secp256k1.bat index bae7c9788..5a6ee6d99 100644 --- a/scripts/windows/build_secp256k1.bat +++ b/scripts/windows/build_secp256k1.bat @@ -7,6 +7,6 @@ git reset --hard cmake -G "Visual Studio 17 2022" -A x64 -S . -B build cd build cmake --build . -if not exist "..\..\..\..\..\build\" mkdir "..\..\..\..\..\build\" -xcopy bin\Debug\libsecp256k1-2.dll "..\..\..\..\..\build\secp256k1.dll" /Y +if not exist "..\..\..\..\build\" mkdir "..\..\..\..\..\build\" +xcopy bin\Debug\libsecp256k1-2.dll "..\..\..\..\build\secp256k1.dll" /Y cd ..\..\..\ From 27dd2a2134fbbef65e184da477a603c9d41a9b0c Mon Sep 17 00:00:00 2001 From: Tritonn204 Date: Mon, 14 Apr 2025 12:29:37 -0700 Subject: [PATCH 185/193] moved to org xelis repo --- pubspec.lock | 24 +++++++++---------- scripts/app_config/templates/pubspec.template | 2 +- 2 files changed, 13 insertions(+), 13 deletions(-) diff --git a/pubspec.lock b/pubspec.lock index b69b3989c..e1c749f4c 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -353,20 +353,20 @@ packages: dependency: "direct overridden" description: path: coinlib - ref: "0acacfd17eacf72135c693a7b862bd9b7cc56739" - resolved-ref: "0acacfd17eacf72135c693a7b862bd9b7cc56739" - url: "https://github.com/julian-CStack/coinlib.git" + ref: fd5f658320f00a2e281ccaee97c2d2a77b4aa966 + resolved-ref: fd5f658320f00a2e281ccaee97c2d2a77b4aa966 + url: "https://www.github.com/julian-CStack/coinlib" source: git - version: "2.2.0" + version: "3.1.0" coinlib_flutter: dependency: "direct main" description: path: coinlib_flutter - ref: "0acacfd17eacf72135c693a7b862bd9b7cc56739" - resolved-ref: "0acacfd17eacf72135c693a7b862bd9b7cc56739" - url: "https://github.com/julian-CStack/coinlib.git" + ref: fd5f658320f00a2e281ccaee97c2d2a77b4aa966 + resolved-ref: fd5f658320f00a2e281ccaee97c2d2a77b4aa966 + url: "https://www.github.com/julian-CStack/coinlib" source: git - version: "2.2.0" + version: "3.0.0" collection: dependency: transitive description: @@ -832,8 +832,8 @@ packages: dependency: "direct main" description: path: "." - ref: ca0c72cecc40fc0bfbafc0d26af675d973ab516b - resolved-ref: ca0c72cecc40fc0bfbafc0d26af675d973ab516b + ref: e8c502652da7836cd1a22893339838553675b464 + resolved-ref: e8c502652da7836cd1a22893339838553675b464 url: "https://github.com/cypherstack/flutter_libsparkmobile.git" source: git version: "0.0.2" @@ -1247,7 +1247,7 @@ packages: path: "crypto_plugins/flutter_liblelantus" relative: true source: path - version: "0.0.3" + version: "0.0.2" lints: dependency: transitive description: @@ -2340,7 +2340,7 @@ packages: path: "." ref: "v0.1.0" resolved-ref: c685c5d3550cca414ec30d4b61259761f129dda6 - url: "https://github.com/Tritonn204/xelis_flutter_ffi.git" + url: "https://github.com/xelis-project/xelis-flutter-ffi.git" source: git version: "0.1.0" xml: diff --git a/scripts/app_config/templates/pubspec.template b/scripts/app_config/templates/pubspec.template index 61918bf7a..4ab3c02a2 100644 --- a/scripts/app_config/templates/pubspec.template +++ b/scripts/app_config/templates/pubspec.template @@ -32,7 +32,7 @@ dependencies: xelis_flutter: git: - url: https://github.com/Tritonn204/xelis_flutter_ffi.git + url: https://github.com/xelis-project/xelis-flutter-ffi.git ref: v0.1.0 flutter_libsparkmobile: From a4de7d34ccbe5c4cd9b5de3b8b5ad8a7a0452991 Mon Sep 17 00:00:00 2001 From: Tritonn204 Date: Mon, 14 Apr 2025 13:45:37 -0700 Subject: [PATCH 186/193] windows secp script fix --- pubspec.lock | 2 +- scripts/linux/build_secp256k1.sh | 2 +- scripts/windows/build_secp256k1.bat | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/pubspec.lock b/pubspec.lock index e1c749f4c..bae7b77f5 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -1247,7 +1247,7 @@ packages: path: "crypto_plugins/flutter_liblelantus" relative: true source: path - version: "0.0.2" + version: "0.0.3" lints: dependency: transitive description: diff --git a/scripts/linux/build_secp256k1.sh b/scripts/linux/build_secp256k1.sh index f00b6b82b..17bcd32c9 100755 --- a/scripts/linux/build_secp256k1.sh +++ b/scripts/linux/build_secp256k1.sh @@ -11,4 +11,4 @@ cmake .. cmake --build . mkdir -p ../../../../../build cp lib/libsecp256k1.so.2.2.2 "../../../../../build/libsecp256k1.so" -cd ../../../ +cd ../../../ \ No newline at end of file diff --git a/scripts/windows/build_secp256k1.bat b/scripts/windows/build_secp256k1.bat index 5a6ee6d99..bae7c9788 100644 --- a/scripts/windows/build_secp256k1.bat +++ b/scripts/windows/build_secp256k1.bat @@ -7,6 +7,6 @@ git reset --hard cmake -G "Visual Studio 17 2022" -A x64 -S . -B build cd build cmake --build . -if not exist "..\..\..\..\build\" mkdir "..\..\..\..\..\build\" -xcopy bin\Debug\libsecp256k1-2.dll "..\..\..\..\build\secp256k1.dll" /Y +if not exist "..\..\..\..\..\build\" mkdir "..\..\..\..\..\build\" +xcopy bin\Debug\libsecp256k1-2.dll "..\..\..\..\..\build\secp256k1.dll" /Y cd ..\..\..\ From 13d23a42e33a2d86ac7e259522d9afde4b6a37ee Mon Sep 17 00:00:00 2001 From: Tritonn204 Date: Mon, 14 Apr 2025 20:08:37 -0700 Subject: [PATCH 187/193] tx fee fully fixed --- lib/wallets/wallet/impl/xelis_wallet.dart | 30 ++++++++++++++++------- 1 file changed, 21 insertions(+), 9 deletions(-) diff --git a/lib/wallets/wallet/impl/xelis_wallet.dart b/lib/wallets/wallet/impl/xelis_wallet.dart index af5d24752..352b076f7 100644 --- a/lib/wallets/wallet/impl/xelis_wallet.dart +++ b/lib/wallets/wallet/impl/xelis_wallet.dart @@ -416,7 +416,7 @@ class XelisWallet extends LibXelisWallet { asset: xelis_sdk.xelisAsset, ); - fee = Amount(rawValue: BigInt.zero, fractionDigits: decimals); + fee = Amount(rawValue: BigInt.zero, fractionDigits: cryptoCurrency.fractionDigits); outputs.add( OutputV2.isarCantDoRequiredInDefaultConstructor( @@ -426,6 +426,7 @@ class XelisWallet extends LibXelisWallet { walletOwns: true, ), ); + otherData['overrideFee'] = fee.toJsonString(); } else if (entryType is xelis_sdk.BurnEntry) { final burn = entryType; txType = TransactionType.outgoing; @@ -436,7 +437,7 @@ class XelisWallet extends LibXelisWallet { fee = Amount( rawValue: BigInt.from(burn.fee), - fractionDigits: decimals, + fractionDigits: cryptoCurrency.fractionDigits, ); inputs.add( @@ -476,7 +477,7 @@ class XelisWallet extends LibXelisWallet { asset: transfer.asset, ); - fee = Amount(rawValue: BigInt.zero, fractionDigits: decimals); + fee = Amount(rawValue: BigInt.zero, fractionDigits: cryptoCurrency.fractionDigits); outputs.add( OutputV2.isarCantDoRequiredInDefaultConstructor( @@ -492,6 +493,7 @@ class XelisWallet extends LibXelisWallet { otherData['extraData_${transfer.asset}'] = transfer.extraData!.toJson(); } + otherData['overrideFee'] = fee.toJsonString(); } } else if (entryType is xelis_sdk.OutgoingEntry) { final outgoing = entryType; @@ -500,14 +502,25 @@ class XelisWallet extends LibXelisWallet { fee = Amount( rawValue: BigInt.from(outgoing.fee), - fractionDigits: decimals, + fractionDigits: cryptoCurrency.fractionDigits, ); - for (final transfer in outgoing.transfers) { - final int decimals = await libXelisWallet!.getAssetDecimals( - asset: transfer.asset, - ); + inputs.add( + InputV2.isarCantDoRequiredInDefaultConstructor( + scriptSigHex: null, + scriptSigAsm: null, + sequence: null, + outpoint: null, + addresses: [thisAddress], + valueStringSats: (outgoing.fee).toString(), + witness: null, + innerRedeemScriptAsm: null, + coinbase: null, + walletOwns: true, + ), + ); + for (final transfer in outgoing.transfers) { inputs.add( InputV2.isarCantDoRequiredInDefaultConstructor( scriptSigHex: null, @@ -560,7 +573,6 @@ class XelisWallet extends LibXelisWallet { otherData: jsonEncode({ ...otherData, if (nonce != null) 'nonce': nonce, - 'overrideFee': fee.toJsonString(), }), ); From 7c408a1af62849d2c31344fe79c21341c8be4bc5 Mon Sep 17 00:00:00 2001 From: Tritonn204 Date: Mon, 14 Apr 2025 21:32:20 -0700 Subject: [PATCH 188/193] updated to xelis_flutter v0.1.1 --- scripts/app_config/templates/pubspec.template | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/app_config/templates/pubspec.template b/scripts/app_config/templates/pubspec.template index 4ab3c02a2..9c6c48cb4 100644 --- a/scripts/app_config/templates/pubspec.template +++ b/scripts/app_config/templates/pubspec.template @@ -33,7 +33,7 @@ dependencies: xelis_flutter: git: url: https://github.com/xelis-project/xelis-flutter-ffi.git - ref: v0.1.0 + ref: v0.1.1 flutter_libsparkmobile: git: From f45f8cfa76b4d05ebab70ef56ce515fcd6b769f0 Mon Sep 17 00:00:00 2001 From: Tritonn204 Date: Tue, 15 Apr 2025 10:36:37 -0700 Subject: [PATCH 189/193] updated gitignore --- .gitignore | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.gitignore b/.gitignore index a71bb538f..05e1f380f 100644 --- a/.gitignore +++ b/.gitignore @@ -20,6 +20,9 @@ # is commented out by default. #.vscode/ +#CppWinRT manual install +Microsoft.Windows*/ + # Flutter/Dart/Pub related **/doc/api/ .dart_tool/ From 7f69eb8eff3e35b325fa8fe5b63c2541955d6ac3 Mon Sep 17 00:00:00 2001 From: Tritonn204 Date: Tue, 15 Apr 2025 10:39:07 -0700 Subject: [PATCH 190/193] git commit -m "Stop tracking Microsoft.Windows* files and folders" --- .../.signature.p7s | Bin 18696 -> 0 bytes .../LICENSE | 21 - ...rosoft.Windows.CppWinRT.2.0.210806.1.nupkg | Bin 642114 -> 0 bytes .../bin/cppwinrt.exe | Bin 1204088 -> 0 bytes .../build/native/CppWinrtRules.Project.xml | 84 -- .../native/Microsoft.Windows.CppWinRT.props | 66 -- .../native/Microsoft.Windows.CppWinRT.targets | 888 ------------------ .../lib/arm/cppwinrt_fast_forwarder.lib | Bin 323648 -> 0 bytes .../lib/arm64/cppwinrt_fast_forwarder.lib | Bin 305486 -> 0 bytes .../lib/win32/cppwinrt_fast_forwarder.lib | Bin 217970 -> 0 bytes .../lib/x64/cppwinrt_fast_forwarder.lib | Bin 259428 -> 0 bytes .../readme.txt | 22 - 12 files changed, 1081 deletions(-) delete mode 100644 Microsoft.Windows.CppWinRT.2.0.210806.1/.signature.p7s delete mode 100644 Microsoft.Windows.CppWinRT.2.0.210806.1/LICENSE delete mode 100644 Microsoft.Windows.CppWinRT.2.0.210806.1/Microsoft.Windows.CppWinRT.2.0.210806.1.nupkg delete mode 100644 Microsoft.Windows.CppWinRT.2.0.210806.1/bin/cppwinrt.exe delete mode 100644 Microsoft.Windows.CppWinRT.2.0.210806.1/build/native/CppWinrtRules.Project.xml delete mode 100644 Microsoft.Windows.CppWinRT.2.0.210806.1/build/native/Microsoft.Windows.CppWinRT.props delete mode 100644 Microsoft.Windows.CppWinRT.2.0.210806.1/build/native/Microsoft.Windows.CppWinRT.targets delete mode 100644 Microsoft.Windows.CppWinRT.2.0.210806.1/build/native/lib/arm/cppwinrt_fast_forwarder.lib delete mode 100644 Microsoft.Windows.CppWinRT.2.0.210806.1/build/native/lib/arm64/cppwinrt_fast_forwarder.lib delete mode 100644 Microsoft.Windows.CppWinRT.2.0.210806.1/build/native/lib/win32/cppwinrt_fast_forwarder.lib delete mode 100644 Microsoft.Windows.CppWinRT.2.0.210806.1/build/native/lib/x64/cppwinrt_fast_forwarder.lib delete mode 100644 Microsoft.Windows.CppWinRT.2.0.210806.1/readme.txt diff --git a/Microsoft.Windows.CppWinRT.2.0.210806.1/.signature.p7s b/Microsoft.Windows.CppWinRT.2.0.210806.1/.signature.p7s deleted file mode 100644 index 8795060a209cd2f9414a32424b67f055aee7d7ca..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18696 zcmeHvc|4Tu-?mu{Ci|Xskg~gG#-2jiA`)4mVyxMhu~V9{6e&wYJ0eT=B}rMbC8C9h zBx^+_OV;AK#&)N>=huC|&-?!F=l6c}Po3Af%sJ+NW#C>oCl}MOo*bEJX z0-8kB{0a~?$Dt4ynhu~rP+5d<q4gD1@90u>PYVB*_?VXk_Dow|8|>KqHYD3ABua zoD?8|mOuk&39N*a1o%i?6Nf*pV6ewTQrc3=z}--Hub#Xb4zGsS)DS(OkM)ulJ>+Yt zYX~@6VfHwvt6&c9LL!rhTuuNHRtgZIHWSK`0`RcW05WJa8d&*b%0`0) zOY6md*EEO_{vQ_rd@(R0gpLd#LXc1*1VWZW%hEEq_tcSs)03qZbMB03xv#g!oynSN z`HGSkGO?hZJ=K-T5|6$Zq|d(ae0#gkAc+#*<{3Ime*3e7W7#oHdcySDljVi$Zio z>A^2+TvV%Y(id454_`g&?c6b*qD>>Zw8f+Ay2aD;(bDz4hNn@o!e>#1Ki*tieD z*8m|)p}pVR|LMzs2j1U0u5!l1wi7eB$ICMJ^yozUt2ahPH=0|Rh016WERHblHyM1f zD|nxpNrJRJM~23TQN7=7#!fpzNN*68V%+fE?P910yNZOuXUv!Q`x8QVKiG_&e%o7Z zx3B2vXd#uz==M*(6(^KLCrh_WJDZ0??(8$W0U^I~dzWB!^PQlFJ@t+n zYg@@g!|XB{#A`**Gk=a#(Ag;}trQ0-cz$zxGQIn?oc@}*no9>uMJXs-B!=}0)8~3NdtI$8y9zOAiK7t}5lD0HiS4I0Y0){W_KAMw6ME>RjaAG^0I zZ7#e`c5BC-tS?u?(mDmRY5jy0PJVc1_o9A5ct^vF0D-u{7=eq?KE%1?5CL1pLs&h} z0-^2Y+w31c)SqCsiwIY16HmVR;fxq6K9@`DG-WUK*M1!f_KK|9!dy4BE!KT^wp+^W zmY@%TO|i*CJJDRNBNNC$<8rN%51zxKi%v}^J>_L+qQ?eHbW<}&9FVs|CbR8yOKN8# zpP>W=Mk%d#>tC#%pkth>J5N`g@?PxV4F3Lu&;rX~yb6(GQ0}Y)9`%&Y8n1Z$#w~2- z_pQBx7oM$zU?SuRxKfP(BPon7hh0hl0ft>DgzQhDnZ($*1>w{H5FK5*Dd}p3ciTYbfW7OjpkcDBt*me)u7}^yP;%{cufFJg zswASfS4G0g!xJD7NE70P`vbm!LXupPOqkT#P##WFe{~$EKljD{^}Yv4Q$WEr0d+tQ zfg};}u+t*Hem_h1TTBDO&nB|T1Zb?j5S`2H~Whj~wH z$HGzDyU6dT`MT9E{>MzhEzEKe7&vwlb_sv+kBpb{##<7P= z#Kw#qcT&X^+9tnaPrYn?a10=BV&+PUwTYRVn7N6Wf65_$ND((Na~(5fL7vIG#xoB+ z8r^Q=q>~9?0JlDzk_l-H z3SJ;d^mKJW(=U@8I0X}hzKylBtBW<72jC(#Lo%`G*jstH;$3Y)UCGtM&D8_v3F>HT z^|1e@{N*@Q6<~P7JrdHikyQgd-TzQre;s*WAZeHmQ_O*LXJB zbNsre#N7kR(RLHL?_(}7w+_}lyf4>f&IpxlG0$lr4giPwUS(?CP%%VCU8VdY6#a_K z&AX8HyBz&jpVwrhx@>4Yr&*R5VI82=h4-xch;hSWvDz3wdRkM-bRofzVC8;6ec<^3@Q%sqe zJEyf`8eG_47^GPnhiasra1HgwcS}~o?;e!s6_Y+Cl2v+?KHuVE4izrCExW9!Em1J@ z+kBkVx5T8LHQHGRu2l5~I`d1u^N0GAygPL6BE_9&_jig#A*J|f_VgWX+elF9E0E^~xB${g*d%nACxKR%AtSE4;WJ8f2PIfA01ZyZmpu?I(RO z3a$q11!PxLT96#VAb*P+QX&v`1ZoHz0uVyh2qj3heF5*kNVRp>dI8X|J!@b5Ur}um zNm!@bq^xQ+saj>-)TA%9oGCy7vY&8ZnQp#~4K?<}GS8St;vUBNXN}FI-b`e@MtMS3 zF#dGxxVkcO=+pb9ft;&?UfxSq<>gcCml8th54S7A-{r{qk+n|uq$Qr57>A`LP@Z9q zY`#nD>n(CO`$b^hR7~UZ$mXKOFL>MVt-@EPUfm@E-&JBoN&}sCUi% +0c(9&@a* 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 T#g~&_bcN+gZk*2~_6z(MsmwGx diff --git a/Microsoft.Windows.CppWinRT.2.0.210806.1/LICENSE b/Microsoft.Windows.CppWinRT.2.0.210806.1/LICENSE deleted file mode 100644 index 9e841e7a2..000000000 --- a/Microsoft.Windows.CppWinRT.2.0.210806.1/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ - MIT License - - Copyright (c) Microsoft Corporation. - - Permission is hereby granted, free of charge, to any person obtaining a copy - of this software and associated documentation files (the "Software"), to deal - in the Software without restriction, including without limitation the rights - to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - copies of the Software, and to permit persons to whom the Software is - furnished to do so, subject to the following conditions: - - The above copyright notice and this permission notice shall be included in all - copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - SOFTWARE diff --git a/Microsoft.Windows.CppWinRT.2.0.210806.1/Microsoft.Windows.CppWinRT.2.0.210806.1.nupkg b/Microsoft.Windows.CppWinRT.2.0.210806.1/Microsoft.Windows.CppWinRT.2.0.210806.1.nupkg deleted file mode 100644 index 19a52273508c58d3b94f320a8412701d0594f70e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 642114 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

TI%}0#{0l{UVD)lRZS|Wkv+u3G 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%0A!_Bbz7jZ!fx`-{&TWuE3^X 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

-QrL354G?n74sS>eIdVY#pYIWwG4SP-YtZ7M?RnH zeZM}ou>TSdfpE!y-*{-ZK2q@7eB0v z?WPqvs@NW~o}Q`Z$L(iV+0}&j47l3N+C>sCWmU&Yjy%+{`BL%dS}2Zu{dZ-Xj}?#Z zhfb}}jt8pIX^Z*jp;jD4h=Zllji%wZ1y@nll7P$S$HmdBDaY(;#yuN}?X&f=bQ9AA zW%)nFl9l_q!qtyBn&TwE}jG_wSRX-w#k7@Ai>telpSNFwtPc~_i z@C$+Qn)|zs&VW3Z@9(gQWF}|T#a_L5oT^+s@=)C-l6ZYw++E80@#|PWi&Xl~DS+$B z(6RaW3b>wHk}ZMmRV;R_ie1q{pbWCHITwy9wbZKJ8+o|D{8;C4a{1>gro!TA&yI2C zO#RM39(@WmyJ4y(?!Mdlt!+)-#U6C8bg_Aaa{Zsjt;&l7O}~ndsadO$YLYL$ja7F3 zH8w%zz6RdCJQRP!yV?@HFdGl`Hb`RDPWM$U~G(*2_n2p#_rJ z{^fhaOchjmor@n<$7Tyu%=-hFbqKULVpD!@aZ{8s@>D$9*59qmG1|$i{LxBrlR(oc zara-W*O6-20;GMcAqaRXxzo)x0Ovhj~_4paMkp!_?W8oTT+eI#p4Oe z%s->+W9e+igXOtInPKDd@yi+Yv1ekhg}z^NU)g3N$e}9M3{bi+4$Vw&M6G@!!^_!CxI zA)d1w_^Z1P=p+T`7RGkVtMbu`0)$hm1PDb02-o*_nx4g*#(oMFUu;5Ejs|==+M)Ha zv!_mwYWBt!hGN#=*RiR)=I}b!=@dATbnN|5pY``KHXjWS?RIvn&A<3|iw*D9BW~!x zyY&L~1ZGsl9tCvoCGMkaCaz`F#s;4DFW)4bv(={VQbu*G!l_T_-j$#~AA$ZpUIG5H z1^gLrbVzVgf42Z|oLfXqR=%nvES`hGA20vB(j-w?vw(BS)aPUt&o+jF*x5F<=MQVJ3Qlx@yRZ?X{=NekyJgv_b{Mz?Sx6&XW#w~57WoJpTon%M&h%o z0sbGVq?%Bpfo#Q|af)Ud-7cz$KM=*+cf^P!D>T{x#?rR(0qb9e=#SBEe5(v#(gVI! z01NjJ)(3x>!t}Wm*j7jn>DvFW=+k!jV>h(*i->|;Gz__@$##D+ zR=i0P0zUK#q&C9oPiWh%;L$ag9BN`;LA<-Kfq1uEj?{LqHHcj)KK2V}s92DSlK(h% zwnkCut$5DILl-G3_vInpmj|-N(JKMj=jD(+OdwC%E);}EARrq%9k0^61X7XDfIRT5-zT5Wy>dGJ&0pCe?ExLYJyTx5hS?ogzxI4%;2#6${iT#&7d z7&E8b>Gjm6^Ja8P_{DzNy#;9Z7p5wz0AA@6`K0n}WJslTWplTBWlcA^@(=Rm@N%0Id{RW@|5seDZeC!KS!KKCE1P^lUzoxkxq}^B{_^nlg^Ijq>d>Ly1hdURgkEuc9DiERJ2?G^`@*4RY7h) zH9;0hEt0dL>dPXic5)`vR#`N4QqG;KD7%a*BWFn6@7oq$`6O~STrzWZR=-gVW7UX$ zzoioIg_}mr01hp{aUF1^0}fNb;SD(I0mm@l2)xxw#@~wBNqBbn1gc#&k@>iKDl)6m z2v^^2jUkymlM%;N7T zn8jJ{7&vE6dn9K?wUE=M&dA19c14y{E{nWenGkumQXkaW3hGn@b;7U0%TT-I(A3Rw z33ueoVl8)?#aqgm#eLZMM$E}AJk@FRL8{&89a*%GRinm~u8PvsQ5DrGoQeu&{J>B} z_nt}y=@Bq-jb!U~m*n!);;B->uTNDA443$J~vd<(5XWccYR>Zuwx2U@%7}_*FdkRSEdjRq(5OBnP+G>p@K? zaeb+tnB)JZPw*bh#%=WOQY1WSvY)k2IL$S1<<# zXFFO5j(Hgz6Era@&_sU*IO7HIs}sP*atPCXl^;m?q|BMtCAc`I*&dFvuei z#18~<2SG$YkUz0toc}|wz-Coz0g7}$;SDJMcnoBJ1<$ICyo-wr#n(|o3A?Fy{Di@M zR6foYHEGz3GCsT>rDza?a>boM$+&j#uRr^*WI=-Iwm7D&!4g#8;cF-wxTc@14b=jo z)DNPx0;04Jw5b8w6a&}H2G>lMOT<2|K3yWgC+M5z+(^A{ALfqNTb%HC9n7Fi}zU zIjo}MW3Hm^b5KRu$5cga3a^5mvR2W+Y_rFr^bKQB7QlsbWLH}fwW1*rxbwEXV>V%3KCZ!pYOjHfQC~_y>5%Q)b@K&p8`a&fy30hR)Z zI|{sNl!vCDvHBR{LC^u;E&<;bQU5nR!cg5b_iIT z{2~55YnllJ`M={2{n^0n8_?zY$|_Pqs>#2xba;V&55qz#TUnY4=B$g(#P9C-I5o7^ zZ)g|`@%0$uD*)o_0)(hAgeU=W4HE3(1i5Ad5MFZj}sf#RRt!s&4@Qk6ey7idjy8Wz;PR_5*RGGfyG93J5Cb0-}nB&%UQh zKCpuMzzQ~Xvhn@jBnj>#u&r66MhL_>24Y+eVq6*&u^tp5*p(ET)ixfgt9Z3Ms2_?L776*)qtey4M{f~l5Rbus%%JA!;q?okgBkd zs;+Yr1Zg5QC&0=m+Jj(38^?PcR-sx!qR|0s7=bmmfHfR|iFLq)6)=GYCj5YjlpL_k zJ;+tNAi&gdeYu_(Vx!vo?E`U^3YB;lh;eC%@g#_GYlv~4A!LbTkR@aQMM@4Vv6L7{ z6A?S{M%0}IFW8e%wEXz|%_p=W_hTVf>BDM{hfHIoqBP|SY$yO56xi34)xRO*jld$m z!7?}u2`>%eTrIMPUmYTEOP|f>YlwJE@bAgy4@_!#TNezE4)UJ4w=%tl+j7PpTG9Aj zGFsUiJI-76eQ@I03@3Hi4ZrwuXx4YqGZ8_V(Z8NWANW)kW@_c$u|g~R`I){I6sC7= z(!;Or9n%F4vvT8{Uao*Oxs=YxP?OGp~FH+l1T|b1oIgxtMukkl+hc`*N z_QvM9^1Ir;-M*{sU~eqZM!hzX`j12NXY#w+sWC&i>WS2|evMDH9o{G9o->}mT|SZe zMBCwyEt3F>e6!I*S9Y%N4wrusHr*in@l8;oWQl7umcL7v5!#~^Jnjxk6(jBgCm z9&;lG>41rkK{{d{#vq+Ag)zu;n5r10Go~#D>4NzbgLK7A#~{yRmeP5kE)Aw4h#G^8iSoQCwmIMR^b7+)IlBIX7S>4S-6qX-GdzAr0w|siGkRFl{s> z8S{yTq+q6L$V-@|vB=99iCE+n%#K)OAV%|KN}%w+^}(dGSA1A9{HGF{S;i)8V!mQK zZ(>%k!#4d}SpFXX-q`T+(#j_K~ zr_n$H`Dtai`kVh7=>KEB{(0igH!s&n{kMKZGTCfH9ddO=_LMp&Nen%fphJFJF+9yV zE2DYxw?Mi7-##|Jc^SO&kcZN5fvcrL`%fJZL2CZ@-+G;H&3U&h*{?HD(SP)8pgvIv zEko{XQuOBv|93Ny+3<3y)c<22H|j5s>K)M$t4lI(&eDhM`-}^Y%@N$XN z|M-t<`B(O?@6Ov?FYKfEI#ADg`6%gpV1iyv=t}keQ-S~T1LdJ~H&9dx-+yYK2tqTq z;bqXu|M9ojzDa#!#mRjOwH5n)_SH-JO1~MqK@LPuulUmMbC~{8Zgxrfxa5aM*YkM# zOSRc0eQ?p_dj3fL&FN72ui~zs(9&=1iXYZrJdw=K(&;)KP+mP9nhp;J(bBDU#aZ#X8A zhck+&-JBI|&Y$;oaB=e>+MafY4_7zu({7}*ZoA?6=NFVa(M=Nk7u(+l@B8J=;ddKn z-(iPqAFR5zuU~27+US>?mj+=)4P)W+6&z}*- z+BTz45U5RB1)Vh}#?pIVi&9d!msQ^x;uO=0qb81)8=5Kh6tDH!J}jHugxxm&Cw5O2 z&F*)_`cuTDmnC}x1ALauj4q$(5&vA>l@mSQgPR_eL7;fsnFks4`?LXk(Y5Csr z{%rJgpp9h#_w1-?B~g|V#+4g2eNEg?t zKHN;V+;TK))ppb1C~UaGfvR;|dzMDHT|Hc|FV%9(2g5Y0Esa^L9880A6%Mo|zhAd? zXlaDk)x$;mQekcgI%}1h2*f%0`*yOu_ zI=D2#^XltqQ}3&<3-^(%wpjjlN8v!-x~+XnBiygPF4)&?xy3DO6((86H297}ke005 z)nLmlTTO#suiN@J!%>XK)sZU-2R^RbI=nOja24(Aw%Rh9waUjdxEOBtzAxC<*kLQz z@xrjNfYONZ`lt2`{WR76v!La?P8~}~9W171$>R%M z!*a_V8~Mb)Ycm_XZzXzsw+#(e{|lOb<>DEgQTK%U{TA@(`>28H5cBZ&=K|VUKjsgq z4`=<8Jbx=*(Mq+RO(3h{jIO95?jnw3_k=41{S{a+ILAL)_r&D;EnsL*g%RevZDK?74|#J9{61=+I@@0U z!|9ZCt?!ZsuDk+%ZNqqdzdak&X{vkjgJu<;>~$;g`)vrnV`!7sf3xK0 zcQs`V;)*7pjJ?gJ&^V~R?BwiF?4BHfc5}bAbCffE?;O70N_O9|Nl*N4o2l;mThjkH zZqMKIebhjeM_~Qql)n*VQ~QfBblsC5G^={*g+RYp4BCGQahcw_aK;OXmz)r*1gR6$L5<;SMjuN?bEF5p3?DOXQL@&Gv1M|F+7Qxr89xBNSt4p-*4wzdG2*Df6zKC)cZE={eJuKRRz=c=MP$z zO$|u+{pKCuQ-`_u{q{U3`Cqe-?z-dt>`snoUo3_>FfCo<4$1T_gg#igJfOx$i6=#+(%wxE_QF)>$XxFBN9G$+o~z#hmW1+ z!M-!QLsIo`aQzdIcYwj)Q~P^}FNH7viJ!lL`0(|^zvB2W5YN#G-<$p3y}P(>%BDN9 z%)6|_cuXpYl0S8Su>Ep&Gxqgeg`f?vU-+I%ihkd_GT@YhZU`VBhy!k&)u?roG>9AHFvE^!@pRR%iZ034VVe z={qxK&C;@ER!{9Nqx1c3CU%vXqDQ%u;$_1r&42QTN{bHdT(32mb@DT9_mg)L(fl3! z))2ZxHVh^34%r$*at5=8)nBplMpXgCA*)cO39aUB0f7akEu|y^9sUi{g;B&R< z{bS#GnDLi~+W|+_UuQ-hc~8s6fA8VZzdSrDAotgqa(97T-1i;|c$s^c`WId@1fYMt zn!{tT?=Nf%K!+)RclnR7e-SZx2k>t2mn$OfuWZk0BM7wd@Gm5z1y_HgoBskGeR5fd zFE-g@IBP7P^F{jlrX!TsoN~5}d{}lL!bswL+XeYoEmC{7;UD$kB?B5#&Z*yYKXXod z&#pep=Z9L~P1v-^w9_}Xen-^dw%Q7~Xs$Ts@JPQ;)b>Qq~fy zVap6W;WbFseKJ@rv(`po`>dWqt9s{i(QKR2!T1qh)Q66sR*lXT_~+L}CsjLF5H2DS zAKwM}#f_j)#TlZmwxur!7u^vbOM~)NJ9SXS(W0)-r2&NJRYCd6on%z;W6?>C&LR9o zKg7qEK?qdwJ<(xOsaC@IJkjAZr9$|NDWYO3oi9;$R6C>`-bK zH}W3!fmGTTJ5qr1PZBj&?i?d<79mO+g3{wh4x;>@i1ObDrN@oPq5LyMiMFM+DE|Uc z;^|U~a_0cbKTVW)w$wCXWI3XwJSbbOa}a;=z9`YPR3mmI4E5nmsYcugOt>jpuhMBj z;AErx6GZFPJKG5ySCs#C(R$@hEdpm4UQN(46t_T>a=MflKe80T zs|up4ce>&)rioIVN||vZlc?gVAc|6_41pt$*d0GY!E@{oyjMY>r)(5AL6k3j&6JRM zR9bqXLn5G*a})2s0YP~ZLab)+-!rnES?O^cPdrx+Mb<`8GD3(<2GN$~7t66l(C>!O zKQLU+v9gue39%e{ETa^uUm02bQ-gyETE6NZ_tOk%2CJwa}hrf#;q=P^clsahwE#e>sDBhUJbT$Ar`; za4ZO17ZfiWMTRf?C4|U0vg{H#+Ia2|imZs>Yarm~qv>UgVJB8!EN2$aO+=A{Lij}? z*gqJ|vn(+c_G1(eFz1J0n;HBv2EUTQZ(_)}u=?UTNIX{?#oLCUWQSne7)(1>xEgy5 z&pnBt&_l2v8Q4>-iUf`bfh&q4mxN&7FtG3)MRm4V0>=c;MWT4B2&OH|Sc4rN&%vR1 z$_UE+5XuKevNNllz{Q|=q6kV-2&Ivc?8-`3VQ+}%2%~sg5&YZ`eohFboIyOpN>*dj z;y71PJU0aYP6+>I2<0P#=)fW>u}u>=D-o2i5I!x0UdN!@v$8eVig6rC0(YxGNtE{j z{ScMe`SBc60@oQueiB0OVDQ@+%+o9)n(ZCWX(e#2P~?yhI($9jG>h-RVydzyV>$VF zZUCyJiNSPbF+r4gjyImWAH}mm@Pk8$jw~59_HZ1hg20^-@Xx;-LaAaXqS?j?95Dhn z2gO6qG5U@{KgFUYa42ycV?5Uo#WO+hpN8;j7<5P0G8B)A;<+REg(3V>0cpA_+cl1} z4#jgu@S{U0tqcl$xeLvPFPw_uxdsUS-4K2YgK~~VN3)Y-Il~059f}+s!vDbFpAyW) z#&fdqTw@eZ5z_${MLiinw3OrZh z?dgjI#FwK|_laex#Oh7V+MrhTfmYRlR^^Ipr_#Z=aVz}v*IKq@?0GS2$s-*7E`}_~ z%K)3oWNe}f5_6+BdO$;?!u52iMf|u^!nj3TSH5~@2`b=2DzkhOvpy(a4bTnbqbpop zOSNLh2jj=J;=8<6Iui-gU-8pcHEcn8#xXlmWzO9)jz3?ON@S+i$9CnQ?f_z?fw5kW z72%==wd6XEUW6eBi;AfY_{ER=#dg6u@d7`+f-wD}mOT?YQi7U2gqkJya%Kq^gK+dG zILajqPZy!{I(7JLBjCm|f?%qK@&KQ73tJN;rZJ$QHW02&Z0A2*&5H?E)16|UTA zLzw=Enmy^xy@2vB#?cFK*pHjAFN2Jg2J)2#j8!X=Nu}~2W&C)0Y?rZGXA^!}2Q@p; z%R%EWM&jtvILdttZzn>hJ(by(imlj0$r4SrYn)UYsMn|AOW~(2YS|RE&UXBC5ROuW;R$j#j(!hENyqR6$s0$f;wbqT zo(zg>OeNcC@c@le>15paTQ9EbEy^E3GO7dKPr4}X+%gn57>E7i7QdDq9yij3n$;Bm zV;xG3p`uu)MzLoC;4u{U3NATUFuaN4M&gp63Wf?O?n7Mi9DoywTZl`Z zL!5x(#^93k1OQqnZWb;%M=+d0aWCU!-m~c#h#lU$)cSV8P>{h>nQsM55MxJZs96^Q zoBXyQy7GY2921G66xYUKmkNF_N07s*-CY_x6) zDrycInEV|m`fDJp!8lC<+;cmRS!)3}^N%3E*zvL<5Re`r>Uyqm*ja#^K)8sel4S%c znD_9RHsFu!g!tmr*eV#7B#XK_H4fVefQJYdMW|$o0C;ZqF^&|liv1%^{3bh`Bw; z^cw;9^S;d|2_VYwobyzk5|#IhJ6Es^!BL*$D7hHkMubjFDmYO^d{;QSvx_i|#80z( zIie{4D>zCjj`ACZC)kOkVyjZIuQpL0iYD7OwkC|HCv?>-b>dL7Z&0&wy__68=Ny%{ zk;>cT&K2xNaFk3Or3AwhY)4XMY#NEATl9B9{Bw=rY6FVO6-38UTHJU=+&C?vD_g0P z9y?x4TIURY`Vf^z zcIOJAxG6Zw4IKYAhIbl4W~5@@rc#DT(8&DpVhj8bnqquQ6N*0a}alZ_~ zYfQz~r}C>d@$*C}HjT#019Y_tid`u)VZ1M492?t3QSD5|PcOqy^I<&a=*tMx#9B5z zZe&>R`37EqMEEQ9(1R)TY{{FCS3f%b(8TeG<59;Gj=wq{cQpBQ z3UX0f)6CN})0U*6(rnY#r=3VsPg|L0ly>FluiH!R_Zn}%yLS8A9dEa*ZByH>rjWNS zZ%5vC&uyMN)FCV&Ny~t$BtJ;j=ZQf z1`$UeA5Ar zMQKK9MlUrun08U4Hu>nj?MEMeR|KaY6A1swbE5u_8Q>KDM8ei4?)D$4@T1jF2u%Nk zfJVbl2<-ncfs4jJQK95dY{WeLV*;G=pGe^6@M9Y>5B!9{{htuf_?ZnXenO!4Cj|0; zVuO;jpTvpI&j>XB*vKV$KOs=^69SJ^DF&ixhcixO7-i^X;4;iI4rUzBAY|;%Fv&aq>?Xa8~;;EK3#(whL`|VGBIN>KgEb$Wq6#ZnilKJf?KK$T& z3>+u#z(yxm8TX`*noMPIkNuxtPSIzt>vR#(E$hbdcYdLt(Q-cAEHy4#F|oME>|SEP ztsz{qWUhu&fbMV>;h3;ya2_wk$7z+EF5jH`Kq8l^c_2{N@T6g2OaHzDTEZ_X%vbcU zAcvif5^A|-aw9CnUgqw)%&^5_mdW;OAG~g}Kcdig)l2*aJ8p0x;SNnXWsg&rZr7B5 zuE?8fnQB+uBv%s_JHKorHB@~Kw!i+{a(emN2Bf8_iC)>sge8uo-)7)2arY;6-C zIMdRmM;kqUazWvZysIg`yG4c)noIMZ{NkZXWWGwlWbRtHV%Xq7(TJ941&65@fO|K2!@FMxr^4_M1U`%tLcOzN~S(7GC7iNS4 zD$KpPB|(EXtTSGlD{{Y-w%+k__f2-XCuYAo|Iv;HTIN@gjvCY36TZ`Nd5#SpSu{P5 z^*Tfex^d6RHqnP7PHLPNH;6VH?G0P5bxoeOT-he?XxDOxHF@9i)~_i$o$j&yN^-Fc z=UYCpXV6)6<&=obu(DxyPJENJNrhXbq@IS`XZVjLPEX( zyu0T{`?41~M3S>k|27xJ+_AU&@k1$-&y6-*O0sp{(!bnAGFP$XX6CQU%t}2AH;!vM z8TRjSNzZj^Ioc9)MPll0%;lJzXLqb=)p~x80cCAV8!9YC6b9mRo-G~U+p3+H?BXBu z*26XnJ53jHveM&sPwbnyFk1!ww@9WLL2vCH`?_fM;57D#V$1X;l>3Wgm!H`_#@f4Q znY2|q>9;)8OF!SfadFk}F({Vr{lt<9(&HuLYg^ZS-6irweN!{FT5sl(RAt-YhW(bN z_jJ2XO0Mv|VtAk^NNUHd%(mK|je*Px1HQ=g?e=v;TUxfw%Jkc0(Lz$(Q~5$2e|Q?q z)*frQe}wnkiXd!N+osyk<6rB*f3m*izKPU%jP0c_r<_s!8yqMpl;72FI!0D2OOF5I z)a8Rg?@{wxi6U*mc~hxuzj!b8_Lw}chA#gS;grOa7Qbkkx5;d)Zrj?> z)X3A_ANxAGuD9?vt2Yxi&fD!pN_wkxDFWBKRiV&=bTs_95eVW32T^Z4SSdUM4Fd4Josu%T_BHCy+jN4ga`EixX_ z;}lN78mG4@^z%s~myPUptuQ!WeK+yL{ohXrwMDeIDK+$Dt`L!`^3vT!|&=6sv*^fivF;wGuPhs%11nqxhpeF$g14IA^bTe^H+tv*T+;=d&q#x5!qkU zq`IZgIxp=vs#}&<(Faj`<2j*`=a!wLE|t40AO0fF+05F-Y8T!=2-B&|Q@&YM?gPJr zo0Nx1$u3B8a4j@7OIYUEa7jo_?vp#u`!pjy1k5xK03c@JKEsGO)@)VdNZ#l#je2G-njT9S3*Ho>+p=w@h8ug zss>gc((08vX+iL;_qp3%qL=9@{DNT`Khe}4miHxPa*v|6-b~IRZR_}^Mi)QIna5%e zL|Prz^&f7T4$S&<0{_@)5vZ^1xwhCM0x7KS>qc6b*C(wIzZ!{#opsepnzz&n<)_42 z(L-GtSMwrLG@d8vU%vlDJ>G!f;6S4*m^~8t+T|9yu%lGsYmDD{zq{HChDncCd#r68 zIMAS-Nm#P0tIPiS9~EW^i>4*>A7!Lao~W;AhS-@Ak!Iv6OXbS+xh}C+bwca8x=S^D zxl-{v1g!+|?faA^Exnh>tY?S(#FA>;EPd5nCdYI)ro zRI|#mmDfb|m`e(`MdiIoS%wiFV!gYb=i9JFuwE>N^&-2HBNSy5_T|E%^G@-Yo>ZLq~6e@|U*JtCbX}=7fO`MGvjjwZXn0&n-){4R)qO*Fx zJt(dB{Cj)XN>JaG_2-M?MKq~-Qz=%kevEYsXXXW3v%K;acwn5C>FK}b1lE=A@>;#E zZus%5l)jS|izHB8Vhv|nVvah$<_L}NcB^YC%q)c4tfsLI z5-Pj}9i=`Yoo`!dY>@|Ah@J=epdL!s#0NywZMH~{DailzK6kXX9cT!H2~v!+_oQ@&qu3($+xuL1*eAhM zY7b9r{5cGqUPCe@0+i=d#fC2_*)X%Y$|sIs7X#p1CPUVar2&*->g;7QSloUS#KHOi zfuUarT;VVbMAG;|0l;+wuaSTG24H$o-;-vAD;jayDg5?AVk9E7zRj)SVgdi2Q(fCq zM-j_g(VQ16oF3^)p2yhhH>Cpld)+)SwO^5dL&%MPo!RbgT^P6qFs%S4`uFXY9J;1? z3@CYG6pyC}3Fy*l=$CGRKJ6Fvon6(x2jrISdiuubVR{uu=va60^0MI^0BgJ4jvmVK z%>W7=B<{jOYrs+6!wYxY0hHFM@b}3=zX7;*5unN(r=+|GqRv$g4kE250Oyy^Q6u46 zFl4_P@G#uA8^Aj)Z;5kW905#~ACPapWE%ov3B^fDiWoTI!1GP22~h&3om>>h`U@*L zfsTQLm%MI0js^ldh;M~c_5=L1LV8-j*>Hh}><6bAP~oL0?BXrc6sR>1RG~_M0TvBk z-ZBOMR}E^fHaKzU$DZHWy`yy<+#mT{yzG2yp#%+X{ zJnNLNdv*P}lfLi_F?eFf``A;}LDTh{$DY+b~D3)rg^}ne~XbpNITw z;m_*jsKc-4*6=TX>@t-U1>L>e)*zo5wxpwS>YkOC>C+QpzKIUY`!!JTf0lb70gYr; zWWV{P?V6MGRauzTsG{s@Sm#RheV2931Tad;(!v*J*08z>x&|4+F4( zr2l%So4WZI5_d1L`a`0&V!YF>A*+;@^K5PI$uE3ejo+VbQauKPKKE*~g@vKaKm|S8 z@38+^)E92MFx%Ey&0fFGaCx=|wFVpbtUEWC$d=0V6p^a*83yN&ag64c$oyD0L57u`v7tNl`NKNf}X=!?y|O!!6+}+kGJy7qWtQZ z=U~(4t{Vt89a+5LizS(7F@ry5Q=0Mwq>0^LR zI$}aZ)1;gp<@W_?-`bCSu5O?8MZRuKg)3bF5gOLWe=|kmF4NQnpIi&@z30u_E)<%T z(^C)yMmF0zJym$ZR;6d}%|39YvK9M})*Ux)z`}%2)jcU45BsV)8=Cb&`^K+18$5zO z@P9QYiyRC57zuhqg5HWQXg3+P)&o?oaNpUD_D@17dVLqn+eBupfL0x=ICN3K)-Ga$ zlcjo_+>937B0{ zW-AMCHZ>-7c9>Z#)Vwj4zot1M@Axq{HnG7g^YN0$w|QcDv9^yDw!Jzq6E^%3_POg? z-Ho|Am(=3rrCxp2FN$zg>>?fstl_^g10DKC5@{1VWXjFe`cK92?~Of)S>n7Io=Z7- zI1l%XuDpj9L}xriXI&Iq(Vn=wVq3#Oum|DnZ&nS8G%$zK?uw1vl0%@7^ye=cqz9;+ zny{3Pvye@$=2fPM?4jfaPNxZG+@8WVtboC6Lc7FJHn|A&pg8uZc7gUbpyvu{S|SqA z>DN`CYgi_*c+F7Kge^ZGz?5AGW4gnYVBVY${LaZ7P;(Xyu$>v;>q@#~?1__Ua7#K8 zZqWoL0PB98)dGcoWx4GXn%zA{@i<;^upw#WLS6OJh5^f!(~PI`un@>p_sOKxp0rq@ zY50XdQiOFHfB&WxjG%ed!pOT}6Cfa*3HyTk*u{P0GS*k!=bECihjKi{uxCu8LD$I8 z?+tN#GX1hwx2DwM!pnK8_JXa@Lwanz6r_zlNN4#K=&qn_dG+EgU4$G)q|G zYoS9a8#acV_ONqeuh6&scdH;1E zJ!K&%a~+0~i{@u#=9z?5bC;2a%i8u8O5cf@7?OD<5zy-|)OS|7e_Koc*v(}a*r@Rr z!`z9k;+;Z?+aWUcxP;{P@vj0JHNzPptKD71hYC|%A=Nl18?}D4i^#Z3e7U)4!(p&S zYZZio(=?aaff>ywG|N?W-Y*h zHqru%A3&l=!NQthzmP6uKlIYVKkv}x^*QPiYaxz9UmgW?E`8hxY`_lS40k7nJ0JO{iN|OJ>&i#4T+Dzn>*1wWGCVPP@0e7 zD2F_b?MKrVo2c~*6d!eF*NQfi7MX?%pgm{VF-l7ATuzf}aNjm@%2~F@xR%%RN7?^0M@&>Vc_ieV~gKO2w>pU{xR(=%( z#&-YS0XX8ks7dKMnINheTz$y6;<*vw~GMyq^8jvv>=IGAv#Ojm%v0Vf!r5B z9G#xxoeQ+(K}DVZ9sLE8H_vhnO>bK?ooOfnrmax0xaGtCZD<>Ce+4!`!j|>pHMfT0 z){Cm#H3AnpB2S}zd~Y?Sb|O%{%Z)K|tG`krVC(b1O!}g)wvV;?7nt!EwF&kdE2p>{ za*?p*=&Ob^_bYQsgCTfBn}AcE3he5HfW!FBK&KcOtgqtA*b{+4=|3k`;crFh!my=B zQ%YD9tTAr6s&1L~)$Tpw{Ki25?3Wc7CaRvIhlrEVyDpH;vIP|=O@pOn4LnkZ#6Nx+ zu#y8y@w8>7Z~UOo!st6{@zvI~U-9+FaqeRI!F4rX^(TYN%wR1z#NFVr z%E=@D`L4dJI%PVMZ~`p?pA7?c3=}}q;vjb6f!^c{BiL(Nhh@v{`doAX5}RK^CS{>j zJrs?|$umNQwBoQlYtDGTad9$44qE4{ez zy4u5#VL>iWhNR{WNzMEZiMMq&mg>H@YPOnDbTQFiDJkBh*@gDOpax+x%7Ra@x-{fJ z(L%puEpQXs2iV&Qayxmqr1srjbc;Pn}_p^;IOrse6pr zPzMypwOY~I8uDkHSN9XL`d*DYX70L+t_FKY)zFVTuH?!*FoJCg@xuH5IIW6G?y`Q7 zDK5=C2)6VtJ>U!xeVc$l$7{0q{yIegg`5vr{XW`O&!al@@}Ba9n-kR}L^^hX=hnvc zo3y}AiL~F_g(a6T_$0n z_UoRsh=~=jNqbRq_Ff;NHU=a|oCS}R2BmA#ELLj2=>HXlg$F^6b^?nSLVy&8S-i94 zy2N}{Oz|^I2xqzqPF>0^ZR{BmEVz&UXxsNtuufRh{y);b`=9Ff|Gx;K$PQ7RkS+U_ zedKVgoK(uL?47+Sdvi_)p*YISjDu{Fy^aytR2-Weo5SZi@7wMB7kqDidEU;r&UGH+ z{9mRu||IZ2fHew7#-M%Q9leufgHR9ftS)%I;ZG= z2i}9jB1rWGKy^w$VJtfh%w5MRlWuyQ7EGzwVss}r`9!%#faDUnnc4mvRUONFW8HQ9 z7{>|XR}N}xm>--0QDgy)3GYO$_pWl_q|w>F?Y;_{R}q+N8@EA*Uyd!$3Zeiw-2j9mI2rJw-r}F311aFb82D;Gdyj2!`C$JZH*3Hz zue*@a#bg*va||21`Nk{hL>a+0pjdM9o(I&rnB{4`cyntZ@vQ-gfHf4KlM@Ffg%R|I z!SqJYz~imE4^syqAdw{iXD9VRS(K4l%?Mo3g4}$$4f3wozmb;dP@NC5><2*FHV0hr zkuGEh=Jas_Aelj1Bq?A5N+`0TnoLR;yqlro60(w3yOn6WyFH*;`O?nU!i_-f;0yu$ zWKOmN%m7t*t|CdQn8;qJo^b{**hV1<1s{V~9|WU*nHE%c(EPr{<=u|}pzy9-xObC5 z7A2JEMX!5TnDM_BFhXG4t0V`PL~ETofP$L+-HZ_&TZJCDPH~Y>CRDj%IKV3U;P8ME zv?%{8CyC_%(7snmX3$Spv%C;GODB$HV?Mv2=^>pFsC#V1y=eSaI>nf)i-usz|Jy}ASiC&;*9kE|3@_IK!9bEPnvaK zHRN5~pqDZQSgb_qyGDRoO-O(p6d+7Sq+0PZ1k@=JjNrN2%oRg_SAZdY8Ed}RZ0~@p z9#dCZT@hjLyuBh`EHp zMw|fSMJIy}dI0usYfhTdPsYyQs)I7Zq6o4q9&sQe=3S?fwjtnx+=@tB@CYCf+kaxa zyDgOB|x$qQ>hGk7)cxNvBS&ohz ztgPnn5N=L<=eW-6w19n%)2@5X2n0>q_~?!ygjavxgixlC8`+dsxhV>G62LdM<1xN znE)j}tv@oL=!iWVFRs{Pz-p1;tRUvO!=+pjHR_$TM8x);KcWFB_7DwPR~(>NeCl34 z$#QZyXi^3`clYD;`B0HKIGiH+LzO_E%c+b3Sqv(~513;Y zOz(hUY6ph-|1`F#B^d7-;5`MC;-Lf{w2uTyOC&Ay7E}u>={2&!g&7#(w&YFfyK24p zwK4{w5xvLF{jU^g6ZWaD#~Ka@2wI^pN$vqUF=7K3o&45^rN?e-_&&< z`{S;F*N{Q)9bhh+(D|X3Qi^{jk@#Q`>1aR{Tm-wV!*LD(_`zw%XXxizvF!ZUN+Mv- zRHsch$o)uT%KbkP#m@v0u+SK4P?=eGC5^;~ zrFeGCb-X=a!P~XO%(Ek|EMHbzWzfa|&2He@D$deY6YWH8!vH;&dFiBN%5HeB9Q4xD1bvGhTUqg9hBq{laVrt#3I0C*$oGnQ^E^KaucYe zc#>2nG2@gTu$~#%$Ozzo*hCOz<=z8j6)I8-M*+^i%nz9I)A)nD--HKGkLpe1d@UO7<|yqhx?D&!(r zW_f+eBcAU-Z5-sBPbsk0Ymd!^n!N+NJh37w78rq;aU;RK-9Ss(RnuA$6_-7lZhj$a z6kOYa9>4*TrCSt1JG;Tm4+ba3r6gqJICU<*C=K|Yts?Nunig5L2fJsUjAeyzr|b=4 z1i{?v*-2XwsGI5q&q~}O%HnQ;+a^`PBfKoY*+~Sz0yA)QqS%lBe0SR#ywBsicq>8M zg5qYXKnO@hFc^i$I-mmpS>b-tX1B7^*x7sRk8ly~bi}EViaiN5EdiJ~HYr=?A)+Ks z9G>|3?ztI>wM&AG);$F=t^#b%wywB2-{wLuSWFizw#$i6%;Y$g1#4u^pNf#rkSJzJ zz&YC}A9yAwc&48LcqVDi;(AGmOBoEVQCTC&yX($_y9&P#z;68>g3wcdCH%IfKjpJ{ zyE*M%EV;9Gu5uH&vrmLT!%Bi<&OiV;B|umnM*@>F$fkr6TN7|bYozx-MgTfjCK-g? zpOj<+kdmctPzLgq2K19UP3IS5fQgZQ3uM~iel>%~N6;O0$-w)8f+SJ*dUqYB+CKn7 zbOxwFM8wE2A@wF8JGM-qq>X^}gQGGD-t|~&2iyNiVyB>~^>u;%M3dz4-9-X@4@qG) zl4f9_lDqu!Gr$qDDypwZX@g=g0N^BL1dy;9T#O241>>GBGHXNg|0Nr$gH!qY%VHo# zlbKa4n3Yp*6Kal@NkK#ipbF>&;QFlIT{EwaYu|rSBDCz|EVkRQG6OKf?-`ht_TYj; z6vT)M02YD-6I{1Jg|PuXZm>skM+Qj!K0=BvX&VD1L*wR$)R+ImUnv!^!Wqd^B$-LT z{cpxlf}ve_h+i4+8(}K9&1Q0I43bs*av;N}N*(mXFb; z^AUp4Aywf|w2scGmc7SV-;Y69B>wF$*BUsYrSw0!Z+GU{pF=0>k1B=!t%C ze$EdLKW&gT6$V#V+XF{#;X(md)gyJK1sIEGedA8oZEriYL7hk(I)X%Mh1cj+*1!Y& zu7X(arGS3X1FW>54BQu=v=3bUDs{v&Kze7MXXtbSA#Q69rsD5Yr7Rkbc5rZR;{0y+ zbl1W#gRU-P3U>vk2FU#^8mvMjQE?_9$ae37rj|=yOUrCjG61a&5$#mK*;Sk|?-qda zvZ)+<_?7gI`zBT8Bva!vr-G6JB64+j*1fma2jOla&D~%UbP4(GT>{NXbGS0Qg7ylZbV7+dp7CIT@} z#&;|kddaQ$5-*6=F#^EcwK0QGzV1VB2kbp?sN}p<(GHCSVMYXtYUtsHNMSAlnprmq z1co{FGmVrcNX9IfPl!7;<@TU6gDF4u8gY2!uLH4*uHrzX6C|!kg#zc54G>D(6cENd zcQf_3o22(HA!^LEOwuEJzvZ~d{YYBHB8@|Zi=-sX!MZ6V{wfUQ<(=X4N2a7I%Lcrd zWrt{vYXc`o8!AfY8=SEp+koN9HSP8rqg*-0HA>oisdWikfhoY6A^;tu z`~XSI01U{zS(CbWTn}=!TTbdTp*dwT7Lsj1eRRgKEY+0KrXtpTkf@TOc|zVO3hv|* zojboE@^0(qTN;x;o*1#k6AjGZx6IBrK`3yWH8`gANCg_uNjNL`%@Rp;#+wA|VmhB^ zkQr$&WkClkWUhK#%Xgw|?3?t!WmEtZqjQif>>ve8z@bvb8w^IAcX9tk7yv6H5@Rh6 zIKPTb05juQ7qreE8YuWI(hHE7;2>!va)P>%eyu1*xzRPr*aJ=xW#e_Zu#X%KQ_GIe zlD6TI_6eM~hGLq79@wUbT6b+%#7H7Nk!M`}&UW zru@RX>z@A&Hx=UTKb)P3AElat+}hIeGZpMw>^eU($Nv0bFO#!px*I2bG;yo?Y4K*? z^Yu4OiOPSln)$l#O_Kk!>=eu?lY1eI{-VgI%Msk;8vkdoUG((Z<2b;!M5wods9~N z0{cn7&VMg$@*NqzOV<6DXrS$Vv^8Pz^~#y&rf{c+h1I3Ap@R?Fogdx=V~bQYYwz(D z@o4v$uk;1>4z>+$Okqynw;yWAuca^>>A~drQkeZ@xD|T~a&Yf>m+fqLtz5!vs~&1* z-+h3k;?2$P8T!&aEWR5kWF%{@zij712t^IQo3h2HqITH90#60U%Ty)}%RR1aB*0E| zQ_wSG=qhCDw-1WjXLXEH;UZV$EBxSG=bxlISS-fZb^7=+jl1znKSa-B!NN6 zjdR_(20<>#3&F#!X)FF>yC45l7;Qj`O0{SV1uQttMlozvC3EtA5C9|U|W|` z{h(z5y+_q1*)H_DbUP2~m4=;pc&*s{yby_Q;hBkQMIqYwY#XIfs%Ll;Kh8@>*;@;^ zOwHUU2cF5MTUs=Vx&;Sxi!_S9p$4zO`joiU`MME8fZXH7PTb=(d!|L2jTCWSTZ>UI z`w(v$Me)e}DKUXvEXCw_nMWok1}CZ9W6$05_m=YRrM5Z@Y$#zwJ0zu?bpSd?AtJD= z*1ietx530wmr869EAACM_4}l?HQyK@jjo>QCFqtZwda&5VPMh{O%##I}Cnb)Nn2hwbcQH z%A5cV8#<#I%5Q$V#7=#IWnTu#5C^TfOc(mn`LC{q=Vn?kJ)4555|iwY62~A2L@_^# zKr%&qHDA}@iAN@;BPd)#?3>vx`mHNeFT+@4e@3)XPLbh-CT=P&-xTlAlbAj8aFQ}b z2>Wbmb)IJU;VL2Y^psZ1b8AQGbjH(?ZJ@%>taJZ#ZNZO~GP#+xMBxL|E+ZCi;f}%0 z@=3Qk3}wcTggUs2GfxgRcvw#kHYyf~8@1L-*@|Efj=x|ON0e6MTTfz-dkgAL`*wN4 zJa8kM*vyhF#q78%J38{n5$_6+$NXEvm2N#+Uo+QhjSOfepUK-2ur)tcZ$*}=7G7oc zQ+>7-w203pVpA!6XIZrZliGB=3#%%E$Z0n4k5g>;N62sHaPj9;HnIl(u{N03#ggx? zW5SzhbH#o3%53M>=DBJHj&~F{Q5F5iJ5q}%Re4AmU8%r^`?Qdc=VYai36321@W)7~ z(g!aVGgcF*pH>(8R-{Xr%gNDA49@+QHqAz-yh1_NTg38I6|dDLG<)lw9JQ8qQd@7f z4!s#MF`uXQ>*pn=Dps%k8xiJ7f^{-oj!6 ziWbfuNjLqJZ2fVo4pW z@7V0hg8tGXWH;W$|82zI>(1KN7I?@DK>=(LeV|JXI;QES?i^lh(MFpeYvZ%>zLm3A z371P)r?Ps4pz&KGtj`N((OP+IZ{`K|8iy7IoOkR2ESw-YyfuB5bdD=(fSchNVF?!#w_H;@2J{~GH-vHmf zvN12shiD3`klQX3{r0_)d~idJZ;k{g^XXoowK8T<%J6?U%whLjNYRH<2M$K}VE zb!_Y-f83It%cmizQy+0FL5X*fmtQF4_~?q3E<*V{I}j~H-;r#atot_j>Mxy4TZ9%& zew}$-NYC>+x&tHg@R!bhs|eQv`FSkmLF2gU%1!jH8ULNo8^g|03%}m&zc*xV_+#6A z-EUJv;Hm6~D&B7)Q$utRC|xC%T&MW-eW;ym>b%)54?kDyUfqZNC~A|fhy0B-B4Xoz z5UZj34OgsulJJB6v1`c*N8w)S)Cm*U@ykp%D!DdHzCJv1*r=|Zc1TXhJ~n1RulY=R zL(DT*Z}7X5rPgL9te6M&Da)qfThRA8m?vL;=^Mi6P|xaOEntC3c+Z+7t^qBYcu#|f zN+IK}K(CcPs*zbLXl+8Mg!DH#wvo+C^_1SokRYL+;QxBA;Z^4DL1YlnE0PL3HWEA^@k2U z!RG~5PLAC}k9~c$eP%it2h69q#R}+a-8i_!{#jzyhqFyzTB{)#vks~ zlURFAOXI)b!?~@MRNsq@2CwH%$Vlb2dv!AfGk8kfb9!q~5s`<4X4brwkbXay^A9(T zQOQ9x@<9T4PGhIZ2cSCOets&W*Q16Si6T6soPK?ejwyk1< zoIf_C!Ult-Y`hvMS*^ssa*4k!q}s20Y$qod<+e7qqmxoGMrP%P!O6mGDDIz<^$g!q zZdNh8hRqV$K8w{@%moIS4CVc4CauS>T_jnxwqB?ouQ$0h8|jyZNyv5$It5xK6nkXe z1tWMX#QV7C-HdjRH$eN;V3N*XuX<2Kr^^(0UL-7){M!k#ltR+KOuRFEaQ*y%W1Yn#o_;2)U4d1JNFtw+8XhG*13!&JK9|R>UxSpM^4o)sxrF|CG?Pt#P}8 zpv5G;L*LavJFgI}ao@vkZ3n5ycS z8SM(C4K8X{So?xr72@xQDwfr7DLaPgbhD!iVLTk?K$ZO5&g$ zS`Z-`I;?0Il$n7MrqTMR#~=PebP>k?RpsbLPt3e2umUQyJv1k1dPe8Xu#{Tom~~IY zWT@N6%ej2po3WT5mKW$X3v34soI)>M5ba;uj~_?c{vxzbYwstq1JWY|k;LU~JNg^6DXBTS7Cemyp{ zU^9V;fyVO|S+SiCi=RATXBkx|M{l;y%-{bhA!IxjtGaSooyHqlNbh#Yk6u;rrPdmp z589*EVli2CuJ024#%m?dZ%S^JX!^IbaCbFw3z9XRYF2cy=Uaw@e)xE~-%}q)}cBLtUN?bpf;cZ|yym{TuUAK7r@w+NY7GSFi28TtNpXTn$W$Ol7o{O!$OGSg!o_zvpDclUnR z?7|kkmEUU{>5DzzTdYJQB!s#MebAkTl3{TIrkKWlJr`R2GmtV@#AnNc)A5;u<5gbn z03&3CgsjhAAZ734V(r3&w-xvP8#F}3wE8Y@HYxr$Xin9;nVkD1@oI|U8fs_qh3~M2 z=8;$Vx{!$+VRHFMJ+g$Nrwg;>j;N!$ufW{%0ps+6l9wSs?lmEK zD*f@H({gxyekzK7+R8PVh)55uo!)ybYkK)O>>~zyDeKmi&qkc zXgHoitcFP6ol`Mn937l|6nCI4Dli3z!sss?+(053{TVW)@sYyHGAXNfxeprT95Q@k zntG1PDrkFE3>r=4zI0R7kY)GL`CEOKzxm#?L3L7>wG`eHXYY#XAq5ukule0ApeNac zOTL+uR(`mVfu7#8U8}~c=vU=m2rzzPsCTOdB0b~?5BYe1`J&%ujQpotkyBtO{7qU~ zs;3uFwhjgWDTxtButscI@e76OPk$>?_*a^v&`{JDl{`>+xhJkAwHefPv9=+3nF$vb zU*h$y3X*G~U*9ckyYims{jL$Oo%0l%sU`t;ARDS_wz*BVo+?N7`H)%!kVQVpW0U-!%Nv z&|2#a(X1bUbHud!+?({H=-B~JC+msBFt5!QH->s^ne*>KYrR7CIUBqaZoE=yh!j?v^}d_;$jUiWYs6XJKP&dD_p)^ugZ z0&EJ(O-=x+{f$v;OC?PkPrWJ1s%ps4pqF~J>Q4P{g#5{<`*kgbzjrU@O1`h+CgWuQ zuNa}vwabWCNnM2K11~M%kN7UdzkX=+NcIo+#U3k!0mb+(9e;nT>E>sUWA^!HK%r^ia5Q(2 zr1ZrRjlF9owEU9_&>o+WAcQ?wjurGV-d6_wXyKF+U3W{F9%{(G+o-*dp82YcKO)nz zNXl~d&)yHM{>lZSkcFsBEiM!Kh=0K!|8+-c;Xgob55{Z#CtR3J>Qjq#gai&$SJ?T* z9;{sUi)PtfZOy;pKv$DR4|>z=HGR@e=d~j}gi+{8-#frQwOqN;xln=9JG}hufo&V> z2igeM$iSJ`X}zM2297S+HkAqHo*x)yc96xJLEE#x53TkZYKjT`T<)#2J2%!)ZiHE{ z_L(-oGW5FHK$~Mz77RZ*u;ziB29Eq0$n6U#kn4SVPAC+%p3P zG@2U7mAm7QF*;XQw^IVGV8H6QrlnBub9_HpaiQ0U7O+v1W)(ZS8&17OhPMs%^$~KR z_ZNs5o{;)Qi|kQ~qK|{c$@zUL1Ma-&bRcq=dOm@WkBGNc`LJs}-EMk*G1t4?z_OqC zs^M|a#EFNp;hg@yQaB^M^?&pvBzT$-Ny1e_g!QGZk+p1(t2^%W=)4zW|0am*rwjFn zJj#+yo1T~3tBMC26QK_2Zx|`IMgk8~tBrbIa-ko!*3UcgOOnskg6hU7T*&pG7bsIP zWdD04#7}5rnY{Bl6GN{Tmt@0=MmMT=85Qf(X(T4qmko=9bX^(OQC;EwyFJUWqll?U zx%a*F`0z&0HYU7GT7L|Dao`uE*P_{_T)uB1pR;vnkAFsk5dY0D;G`#+LRC}mwLphe*K%T1!CvMLuD0%pp=9( zaw|_<2dj$Rm1m1kcDBF1yl9`-Y~vd(*Ok}4dgv(gw}r}0@2M1Kq1=AF_4@cT4Z#tr zVD5zpc=*Jx#2AEpyogJyY@RqvoqMhL^BIR$AVPVD4#i@WJHC1~_gY^F-J9WShwT>; zXE&P$sG8OaiRT%4{t{s?udBb5DmId?d33q0oF9Bf$>3`2E4$}0tej&9tJEgkTX|wH;`%z(S5$B?)MAjgaPxW4|nQ$fHeHO^q zL%Bjo>$jDC4E(mS_NV)vHX{xEDDvh~Rm*FCC-@||6gNB72ucb4wQEUlLR}!gq-^M1 z2Ww1(hc9L%Df}>9=)3W1;I)x&CZj+&D-4o-T~7$M^Rjal#<5%$!;D#?uYcq>G!`wT zT1E?_sXHXpn(=V@%?Rj6uI$Re?s=kgUq9Nz8@3aKHryLHs);5l%XLK z*E6Q4Sjk~11m_(WiL!Sm!ri({ai98qQ{a5X%SC1!0VDLVbl)Zz4=euSBrM`niPufR zv}`*xTx7S-vcMNPmRGCGbG7InQ)GJTXQ%WJ+18~tBMM@S)cQ)J#q$#tW4_HayZJ|| zJmh!QgY>x91-b9{VfoF=Zdf~KO?;q=8RcHN`ye9CxKOFgIOp%RzOINg&V3oYO+&@J z3p$Di)BG$t?7??+u2`LNd8|bYieJH z9(T;Xa@Ly|&X0QXLd3f|m7XWyjMZIcHoslOx_uU<2h$&V+{C0AO2zr!a#L$ciUA_R za3)2BeZhT?jP_7n`Uim?vPw1tlz)~}?mk@De^wSVilLK@%E1t^QBof^2l4dCd%Hc4 zou$ok`;S75Ovz_Xc&xwqr%TBj2 zD!Qs?3l^c8>D<;Ie>cPZ8=PivA=cxCqJ0$nzP)D%d`0stAkX)bljFkc1DRIDw1ZtF8rK%PrkUexRBli_2Tl5b9<56-dc-D>t>CdwIev0v(s@`6f&s zO^c!;s{a+i1=bh--O+hMQ}pcbWx}ThT}e0(yL1ZAFcZ%Mo{M{gUzclwGH)(yW;RHE zHzm&gUStaOV~vK2Ei>DNn%zxAE8rYj;O=uHOYVDccjfjxc9CJOxxiz1C7EOJULV{W z=9&h-I&k5ce{)EmF^r=;WlCXtif6FHge)n&omUt!SNl^)e!L~>_MoslQZfG@mIlobz zQ>-0T1p73vF~c`ZlladJX<~~Mk+`hr-EB)?tmWNGl#%sXFI$BPV%lpUy35It@kk1l z{wx9g3lh(H=p^VlEj()O&j~Ol5Qg+_z@L4 ze%vXyOK3EePE`7(opafuRl0_=tQ+MD(fp5vfZO2Xh;=Ewi=r2afoWy83nD3fwyJ6} zO<9vwGm@1_jiVd| zijsAwk43X(+)$J;`sdP~nPHMI{yAYXo3}ao$1CE|vMXPDyhu?bTo8NxzX2cHlxYZK zLYaFaoOL%{X@IL9AA70oSuiN=^ir0>h@X?Uhoh0l8pz2?V)OC1PnB7mL4LgKR>euj ze@L$|z_v*^>dZ)8*(ek2%<#0(R^oEm7ZW}TYN)53 zmewUQ?=gw$ht6y$LE>?N<#0~*Pg5|Cd2yxr#n7LJ_aVG-my)f$S^_^mNWZV`*nJoB zw0yw{61v@(Q1@W$`r4{Z3|4jNqWAmp;XsQI@O#!wD-ibg{?@TqCeA1>QLQ$QWV;kAF~_QM}$Fc4VKII$IYTNA$IR|6+}@K)cDxH zEm}{e?Ou)llHybg5&s?}qE9D6SF0^^F<u#y}mFa9iRuZP1Q-7w{74{~yOy0;X0q#9(oj$(_%X@h5 zQND26ZT)Dk!;mgSQjOXt1Scood;cnf?;n}^bR9F6sF2r22VZ(;7-MDnyCKkm_$J6k zK|JTC7k_=8|J&8UCS!YrNwM^}A`w4}}o%>+Y3&Y0K|Ygx~+oG&EXR43(*Vl*8aB z{ZQhdKR{9fsW!SWbf6_>JM_oQdr5xV%spZRg@j1|D(t@2z43d{CJ%ne(ex`^?w~}? z=r*Aff-I*#QTy^D>%rz@rKF=LNRH=!VqrT_XO`&J>6a+Du-6zjTVZ?6bBO-s#va)B zy2IcqXbzK+WAk7G){$`Zl!sO#(sH>u>7IVh^*seR4;9e^4Og(XWQXJyA6+>JT6~3c zJUn&r&ut@|!gDTEW|T=xcf~Z@e0y~3;Ri?O^j`sf(P0v97&tG_4M7z9yx1BYk`n&@ z4kH~kTa@Kz-eN`pwH4`i{aiL#EFT?zf1Hp~_C3PTbGtV;$@8q=W(*%biI!>`;e-tL z{9=GClygeLAh^{S7|rd$FXt)FBLTw0mwmlvT?TkgjL>ks(U-r_Z$h{Jo04jT{l>H} zLUNN{e}gkCG*UmFzFeml<+0n+pr1n-G?QUAfOBXB1IzZB0Noo?mcn_WmUNulsC^Dx zMBx)OZE38u|43cz>g4JS?Y z&&oYt(l0l^kIoVs4yo;XfxKkvS_$X2585H$H0;cWefsK$;M1oSnPn4bDO`!5($Qf# zDLRh|Yw4u(!8Ouz@}Z*AZ*F5a8wr$1OIvXxp6e2N2g5CV%rR1`OI9Gk?1e$Nz6z)G zL2fDe2AQmz046m&gW-x4J0ET{UaWU5gkM`Hlz@D9q(Sxy@TZYFqXHR(UWj-SK2YrD zG^^wGUno~~tR?h&so`eapDRd@ABHjiE~`hXAzvp+Az8alzrpWXW{RO`#Jp?a915p< zhJ30>-AZj9;TFBK-JtN~mOuGlU@xavB!3ovGji*HQrY&Z`#&UK+@WNCog@YZsV(>_ zt7bG$C}ZkYjd#kh|0H=d*#MU;{U#+47q8m zJRYkCjb%pO`&D2ENlrSlL;C$H7>7x?Mx2r(C4A)T)wFKApLj5F_MCm0x&wLcq@>G3 zJNN1h{2KNfH0RO@n+2$-ab~1#CXB7HrAem{PP=;y=V7y~f%9SyhlIHDHRyt$RMTZ{ zPmsFqnS#BSPvD=W)pm60r% zpBwSslv)b*ZvfK7hvHdG&dY}DLc>v$?;#S*pW8k-%F29qnBa>+4xUAgelC%*thX@9 zfXiY3v&^&B|Mm1r#)`UK0>erR`-+2gx_qKcmL<|Y&YWFR7we(DqxSta;dj~+FJ%Tn zQ0!*c=~p4xOmTBJcrq8fJpT6DD4 z*qH_N71#Wd5`w*=|A#lZ!x+(s61yoW^j0Rz9Ojm7*Y#)fi;*6ZY(4b!#Fc4iJg@dC z55;GlJow!zpXn+_F(qf~&XnT7>Gg{f=1vTDbldq8cNr5o3r*cd4YJ!^Ars32jevep zc_hO(4bRMH(*Ic z6i)EJP)M!O4nJhf2=QqB{bCc8@c9|*zBk>VvrmSNle`<1J#tUKK0+6{w_p(On2>x3yr4 z`SD`+2A{;`M)^Mi-jwJQbnTrb&Q#ds&?lv9(c}{X!!eVGP#%h^p}>UN2lx!yLD#`b zqH)fJ8W~3X`>3cU-_{%6&z2YNFDW#aRrxflVhd3BH@V{Nk&Xc)>d1$-{~FqTAOGGnCiWZLy5s3u&Nx9 z!NUa^e5qb9S&J;_+N+frXL=d@ZB6@kP_(`sKqDVmeu4k@H|-9in_vJBlCiIO)^Adc zx5~wrwXpvai9!~Av^txwy}&KS~`hlR$VGmqnW>%aIG-%K-!S!%H9Vt#yG>4 zB2W@VJM2vOvAhWgBaKKCTeOO~(r-h%x0zGgIh2GlZ4%|xg*e%!9mJ?XGuLf&PhV$P zN5lCx4H`BW;J~~To|GwXTF*9&{>Q;KH{T^ zCq8}D#3^1VG1owCso9uHX|=&3&{7gV5Fnd?_+{d5JaM)3R~$ zYWpMdr(AB!kI(z@-vLSeZG^mzjsFK>`EOk6DbH0!=WMvwo2+8S?#RGd$nZs7V>L3| zr!(of_&NV{_}$%A5yn36v89Z02FHOvYBBe`20yr%*;F1W+#MzhKJ!HK1hg6@zTmO{ z=wejH8!3ixc+-cE344)~z+@M-o$C1+PHla|j#lR{Z`L3mDkM`r_$_Cn`w^MD*c2+A z!kXAADF)gTeGbQ5JNkW6a@#{+X-Q#(0NH^}cH&X8KbV1DaO53FWI_=Ux6!E7t zpgC#Y4fC74{Q<2FT7N1P|pA_1?lM_Ms`!=$6l=tlc4D#(=FY9Ke>OV$1NNbeC>B=0a7^#sEv%tp;VKZqwsUhWI`ZnXW~ zVa)hV&4NZt*?@;y_SS&mt66NNB?ivY)D8zMB&8d&kc4+d>NJ_x{!q+r^o#cO?m?A6 z440EnQs39eI}JeFS3?8(wJha?yTjWzxp$LZ9q_GOLPm(51#q)Ow+}c%zxr=tr|*;} zRRLW~)JA%Zo|d&QSt85uO_l?kQ&NhG-#K4G3UNZ+cW{sgJlE^3^%^Xf%4PbsA)ZOK zMnH1Au&~DkeKqHyYMftAwW`9v5>s`rh#DV1 zG~a}2H+~pORlWuqa0<3_{b2YV`%ai}vJ=cdf!Xe@P0&Amckkgm_S=kc$@?d2sM`xV z$W~iIER1oW-L`78_Or{g@i~idp*^K@1qoKkM1xvrT zslYS*wsKA{^}XrCj3rMbYw6#puuv)g9l$%(B)*n%@5CGn2wRFFISyA-WB#^q=S4}W z9{8J!BU?7g+{|3>yllFKqTfmAQVSRnQ;Wep4q}M@5kq`bW=|P5xy*~Yr0pLMr+CPp z8eT0S4)d;<M<1fXnn(meu3a&6ubo!?vQOvWZeL zPv&QToQ>-$Kr-^CBxE;7*deXItfE+eS2`Z`W8v8!wViwEgUkY9W`kgI$0kF#-pe~a zw>DeFHcxIcVB^VwGc(iKbX!E_6U^;illfkRf5q{>tj@Z%@z`J4zQ#uxOLj=D%gEp*Zjb_lOkwhgZG43Czy3;rp{__lh;Dff(OAO9hF z)8Tt+OwNOm41;vG4ySZ~#SpHr56Mf_3B;dd$Qy@2Rzm$5v`RvP`V_%?{>bZH0k*X( z0!@A-jA4s<@^3dC&gX^Ehe_Piw}~Fbz(kns!g5UwH#gmac!sHUy`yq&>DttCHr`&> z_5E26AA-ER1zgdWE)K;9LZgFsAhkH+glzu`Lfg!5M6u|6He>0dkG2we8{58D#ja zVt5Tq@HRoirFN~zyxGd^>DT6CQy$uszu#z9f)bRoDut#GKamUd(S+(s=768U*`hZWIC~Q+9K~9>jzW~VLEr~{q-}MetV?PZVwlvq~Pc#i~}>iu+>ARQubIa z{l(gEwO5#NocBz|5YwErOTbA7AJQ!;7x;ySyR-F6=n9d*O8C{&ZAHjPwq2^$3PoBX z6Z;k4fg-6g(_aCiY?>N|ZEBEjlo0)X_(`(!=95c`Iw@P|xkg9O!t^YOBYhw~3FDPt=WBsNW{;qTqZ@c2z*?&I;-eu!+Fj zZoA{`4TIuF7a*FZ#GPG+?oN2%jJ>;i4{GXJy|`n3G`8(ngt>bIFGk$^xwN0ATltXZ zM!K`Hlh=mGk-Fuz;}_c;i{$ci?(x1(oo8RpIS82_btQjjllwZeMXRp7g9*O=^J0vn zl4fCz%^}WaF{7kR{4OUD@@iU-#>OE|+xm3|X{nPWsd(dWG=p8MS&KA;*S66+iuu9! zw5OY~4`bCNT+^+rl6_@6Q>sdPJ{as7<_K1fZ4gpml%M-=HW_#Ui9Wy}&??$?i=-Xm z9cIR7x0p3yP6~o3j}+yskSc5GzB~crwalMods>l+jSeNz;#S%&Y|+*qJ{;`LWUt)c z%1{*07WJJ|%c(honI3ktOuVl|neam_0@5PmCg>Mgn zEUPA|I?4!Y90<%|vNd7oo?`TVCY$0SN z>Qn~*;J|cXTuDl7by6xB;wBwv6$oJ@EAy{Om2AiZB4Nnrq1l#E^~JS*kw+PWKi6g| z11vzh4ieY;{iB+Opgi0Mw5+jV?pc0~oW3szeg}=HGMMUo?kNNn7v$;@e>}i`RxwcO zY7Zc!ulOi zQJgwDPqdGn?#Z{yWEH8sa^Jt>;tGy#@-#H-Ei%&uEWToBLY{ErZk zZ?3QV)RPA?m?0Flp3#s;1@YpL*6W2gCzjPcjd@U4cdFsE12K-Q-9Ol~6*>F0r>l#z z02lR3Jcb9dyC+F1OL*%AD52owUW$xLZh8l~F+ZSXC$RLP=1fLSxtT1ze;Up|y0nnC zO)h)Lf0pZILD$%?7<;Rg`1bdp3XBLlpOf*7;83Uh0ZcA?<(CnG?qk1=dWrAdpJ(<> za5AYtT^w0vcgtM5B?cI;PLKsDrFxAQS=OysdQb}ODJKILI& z9GLjqhjglQopkx8&~% zg#{#QuEZdncN3)!h<23-G*a@LmGD{-Owma&(;etcK^o;_X* z$;SPz5V7WJK~1UEg({S{{|KzOKgd9Bv8#ZT7$xM1ED^cp`mAF8Gxyn$wjKS4ql%AM ziG{xRf7*j1tm{U-wn(WyXkOH4Hg6wO_uD=H$2?3nVM>hD&^4k_4tL;oq8|NOn}+Jz z%=^Aa5Z9z5l;6QjZU#*7mb+i${XnM?%khl=rkZ5LP*hVprEuW^r9cQOx@?3`pDe3+ z&BmE$R#I)a?r`MFweIiZV9;Iki)XRx=sRE#yV<9edD5pwsI)VP8MQc_JWQ+AeAz9E zWc@YUQu5^{I;a>fueHU?NavQ^<*|v68EwH2G8U@$vpIU2e->q9k9m~$kcVq$9Z1FI zf01wjE#;t$Cb~@uH7CiTB4HqhulbEEJ1vb>mOXQ(J#0Qd^>$I^VJ$l5g%~DnbBW!A ze}nOGA^X#7(&|fPbX7vv1rMS*Oy>CNT4xCHz@MEsL_%~MIt5X&48f&v*1v{=jAVlZ za^UB4DY@LM&y~@Qgv)f4;RgG!-kB@jcPGfa({*3LFC}Yg>jPdeH7&*%JM^*?es!PA zj7d{XewrWnnHE0E$V=u|(?Fm+-#G$fmtdz?4ZiwBsolP`aH4_FI zTCPo=>c4tf8+g3G1A6Hpg@-+n(sfGREAh^Qjn8u!bHVIROu64Q6nNkj0TOhL_%ge6Nb%<0NBBLS_38)zN6~r5L;c5byo|Ck&dTQN>=`0i#T{QHrGAv+60%1q zdlP4*Q<0rqN|a63iOlRnHrcbY_xgSMr~XPFcc1V3^M1cx&)55FeZ9UIWiMcn2cMn8 z46M3ZvQJd}9BWHoJfP|8}mqc-^9~xgr_7lBoWbR$$mJBt!$#1v&Za`*_?BZP!-zk&xI2R5tZP&wKYgJF0!Ov;vO=-tD@am>A7(lEKM+3cHaFs@czkdzi2Al-8ZZvMrWj6L^nK+ zv-|)v{`$4OalKOrvbb_uY-$DBJL(h{S}Jw~KVd#?&Q^XBSD~@+plfux^WOQWyN|0c zN)zd8NX&K(+*X~u%($QNAAQ?z0)x{CFZLs2juuCsH(Q3in`zBkI)Lgf#V5iSnnv|^ zlfh-hTRsqrepN9r7TP(nJT5H*S}voifmE0E4n}nL&l8G(ud9?b^=POteQ4f6Df#y{ z)N7F??B_JDxLrztL!?sq+(wcadwhjetWJ&`cE{HlpbLBEV-IdPdIOO~F7lsEzkta? zPhI0>T)d{nUh;i8*Ba`-$YYP9fsQ@~4n2lG-y@Dc9{1QR9e0WOTZ%7-FBo6XKWI{$ zcdddEoyw~G2nLM9%a&Uul^-X*t8h9HE_o`f8zeyM<(Xy2RKLu9rxQoSkYw! z4*R)~2|N;!q{H9UA%ObW{CX(9kULQ+@=ODa#&LanU%8mGrXLKDFP@}{Hq{jq+%b}s zH}Eko4A{FrC*Fz2)5@73<8kf;d55P7dBCL{*qZeuJ#egzY6wjoTpG__kwQ?ondOeq zuQJ-9xZ0ebO{|L{TI)X0a#ZY6gk?M&xl% zV}MCHC5KMtpLB;p|6HySBQj5X_}#{_98p!Pq$KT>Jb_BiY@|ND>4iTNQU^E1v=f zdl^`wLVD8q_Tvtx_Wf{BpI^96H=+z1W>M}x5jeV?pfwVMF2dWS91?G(!ou1|T7I`P)kV+mi9IY};57hH6s&NV|HTLGSE&Z)4G8Bu;iE2*Xbd?u|2v z?5i*5SP$h&dsGB-IO?A;IG60p;k>*ImIGV|rU;0fAKt?mfvyvSYR_vA__dp8cT&Dj zBs>&C#H7#)qG$@9Jj;Nk2#ee}O%e^(>Q73*pJN&)$4~GjLSxtA*h0PzkL&Ti`T6#? zTM3~33?s;!;?Je`zabZ{d}$zWi0Az3Idpb+t3?|p>X&AAe$>iOo2JcBzzay%ICPcXf4Wxy7%<*aTW-?oA8qqM&| zyEVgYsF3U0(KC;pIsb~Adv+V6&)CWnxnBg6+dumX3*Ss~X3jx%sqx1LuTQOIY#B_l zrk=d^4jd|fB1CMsEb;HtegO+0{T|}U9G*s_^a?i0jF6Onz1s}u!mvUUr&iB@NGVU* z6dOOV0O!`mSPymbIEm_(QYo59CxE-^DU@NBN@Q7 zntw;{Ew-RigI?;EL8y!tci8a=%Y_QXdA=K?N!dJld0N;7eJnVWg5tC|yW{cw5=dVm60%`-O z=c3{1QDZ7c!AuxtEV1_x=sOzK2PR5-eqZ1Vk~>IaW*6?7EO1P!Al>HO(0ucKDB7d4Q)>pCQBf+za{-`Y2kX zjlZC{(^_P+pRA4C@aenPSCX!Cr+Qb{#`23XkWY~(bWrGT6mft zO&2no&${>{YUrEB=x$5E{?8guztN1j3%4Hp9tuoOOmk9akAAZ;%ZY>cUhPJ1p)~w& zAivWZubg^#x|p2UJJa8Ur`x; zL1OQIKpTJ&FQtoB_Zpuhn^=QqK4S8!Q5KAN9=sbZOE4(cB4Z%bT3XYyThI|N;$-tE z%%zAg))fqpRBE1_Xm|f1YcF$Me zSp;{s4Bi1$2t8wKn4xct&ig|O9NjAsRM9OiTJ)9XKz+Olh)FC%9RG)Wn(*f5RLC|DE;&T~lG z5b%1^iWxPc8y+=1UFiuvKmFo9Q3rWe>d5CGk#Q4Awgc#zD_cG{@q#~O40C`dWhxaP z9dHm1OE}k-MadT3>b?}*nHxUY45qoZB|#%HgiL+f)*H*w9{D?XPA5qWo^1S2F0cwp zjF5<8tRae%>}dZ;2YE4fB7!$p;i9Kc6uw>}l6etZmW-5R66|5Y-Rv7=hLqohR`bWV zmN%iMfErDO$vEviWc^)9u4SFkQwyQ?%pat}7oKn{MTKqEzmq`3_PA?*ULL9DC!UcS zXThTR^4MGJm7JI-v59}C$rzgc7Vf8t8%5;%6;fdec!cA_?yz}ck?)(beQGshXQSUd zn%e+wsYgDG-OqPbV~4C0HNfl;_t~8$XV7jco{_{^wJ=K%gNgazrZXr6&R#^ zeTMMBA?r>9h6SsAoX4uGvzQTuoTO_9vb5;35>r!?>JG)?%lkxS=)ye)K2aku>_GQL z{X-&)U8ITF@w-UG%Q91NA&!?AAkWGH?>Z`h<06~a8vbKGd*oWv^;DR`bj}q=aWCZ% z<(Aoa182XLkA`A+)&Vh4G6)*|qRlu1>oc;oYKsZ^NCRjK%{ck)ou6%OAjDh%U0 zVWZfc;%j&&1VPA%!Qm(eKGPDwL~!<-Y2A<)a1VpoU_Km8-w`7dq0Tb`W?b55!qt7A z--im%zPb-O_h-3OmXa&Gzd}^6PX>2#EV=?@FlRxK7^J9yLb9DqszFI>^L)%=b#&`O zIArR&mkEFu9T7k$BRs&Cb9*jj`0-%0`SX%370 z&|f2lh)Fk+sUP8U`t)wSZEkeC@0tin*F=QZjXB@QiZ8+`@DnYJ>rx*%&2d$tWTLfpl*&*_%Y!H zhkZIsXQsw(v~B*fdy>7#l>&ynJ9a5lSpq!&yeJ(s1+U-GP<$~u#6sv>jI4x<;`}6( zX4`cK_1J=W4nWg$2%K?AhB#CDQ>V3n@WP_8*J}!S=IPSW7vdJ^a9-`(kI|3!$cjMU zKl_rI`p<$Gf-SON1n3}dW}*892rksG%tl_ExL5jhn|H=GrB}?6G^SgC9BS7>Em<53 zN8;CNZZoA1n2IA}*$5|eo;&3a@MHmPGU=+_Q{Q>NTzGX6cV^+)YnWw=Q=1m+L0aE5svsaqG6sbnq|8q(Tr_ou^)8nS8-QbRQ1AkYqKNq zb%E)BXG47g43N~Hbbd$mq24n@A>Ze@pfuOV$h+w17G54;8L737=~%GMrn?359XCd^ z0h<>*afpZI^ki7Djhx#wz;-IVj^uPNVZ%M{bML-iM7=<%hT4O=(9ojj@l`BA>$~kX5;(}#)pI#odM!y$;(}XX2ymastL`D74U|_LZof0XJTuWcAfyB-R#ETG_ zNVjml4{2_7FIkse2$a#!e~Uk`7yBM6TB6onh5~Dr|Kqn&WU9`9JCc(2*r3E zMZ(lRp14E?0{UYM|2QSvBFbU^K9aZ8$FJn*LSD!YVp6}(Br27*<^=$|JX#oYu6Jli z7zLO1npCG+9w+RW;jGeq*>&r74|I`qUw6NcFIA}V7sHG?YPd6gb(bKH&#@6`V&>vQ z+{IUNIJOn%Kv4v}6enuw(ytPr5v6LCtJ|M0yqyPUI-g6_=%u-LG>mLHhW@k7byp)x zGKrcwx7XSXPFmuKB!W^ZU}>6U&DU%4mHxy6PvxS5=#BU>Mt*T+NUq08uT=G<< z5MfL+Z!Zo+ePh-QBXvMA=Y{}+&SlZOMe8xun=U~N;`NM$<&Zaa0?=`$VV>vR(0k(; zT@6n~)7jY=#ovJMB1+3KrMDLz_owi8B|$=ilQl4&1u+iLAz!ar*zjJh4FD4_Bt)*w zX_ms;K^ZG7Iq2ADQ7n%}m7fQ#sFr-c2B?XL;`N_-1W|I6BBLTk5m)`51XY5P8p96aH2m`5IXSEmH6ru=9n}!L z!icqMSHo$x_|1fWv4IEg;As%%(ngWDUEaXL!%IKGF)n;16Hjiq`X7__bRd{{q$W3M z$1YDELopYg&D4^UXUiw#06+7u3_CVL#wQo1_qhY$UY}p?(BA^7HdQd%WWtg+nG~Yl z{LmPcsb6p%lcw=74^`7b(##;hcOgp8+S+vGopk)U)ven&#hChN8Mm$wf>b<~>Ff2d z-Kr6Ey{ixYK`QZ4$yGBeS<}8oP-V~jL~&ladINz)w*gTY^_4Kml$vfP0yWnrwpA9SMm`RR=jF0K#x&8Oun6$re2pOG?ds-B^`{UHmy-$K)1%zvyPP>7P0P>g$YrW&uR!I$OSnU)?JD z!|eziIy#T3-E=WxNP@E0dk{>~Ez;=@ATdw!WGF*tKmW9b*4LW9phJ2P&lx;C=}uY1 zG~-mBy^@qFS&%UbIZ?lXr1m9vV%GxdEFsEQpIl#6@tO-5y)0Tn)fd!On;_4t8-1e6 z66W>H@iQ$c+(gM4Mp!dbD|fp5jKDTn8q9suHz*zPOJ}rbZ-Q_hr2eRe$7ws3V7@;h z=#OpBYsvKHcl-E8fiTbs;KcWr(ZuVd>h_hB2OFPZ%E6ZI<8w^+ zddL$~o@q>ocRacer;D-L=`22lVkF-njb6xHK_f4G^-PD!X2h7pBF-C05u+4;Bjd>p zPPaCK)l~PRu8EjiV{mjOg$`)Ff6q8jMi8kLRed3xX9aBcj4AY%~Czd^us7siYmk zDXa+RS2oos6{5p%4Fq;E?c8M_r}vxmV;lp?$1J%f?WJ?=cmww=SU0G4YkeU3#JN{h z*eI^-;6n>)aK3aPnfXq_%J<*ES4kU4e%h^csz>E9^#UE$@WHb=TH!JNCTpwK*G@26 znrAiuw+@YvJn|31*`R<1I@gPL8VG}*0 zIS0wi^V(7axu%IPdQGjUW}u=xfWE@~StL)tEKac`;p{*P4_nIIRh;&Mx*n22&G`!~ zL@)`4<(B3zgZ>loPy)dgoXoC^_C1LMpm&p&3zh0cnSp`x=t@fpU}Q;H-DK2_P|ZTw z7ks#KA4y$RUW}TWw2|J~px&M@HbQc%|Cr+Q%f{V+sbiXbt!&L5``T zgt_xN!Xbf({mlwvB%R8iEVSEgE)F2&KFVORi{RTXqRKj-zw_(rM22A+Eb92Ajd9n} z;zw-JdJN*Z zS965MUoZ_D%X2v^)yX=!ykrukuoiBMQ_b_Titf|w^#&?Ulgs$ZxY)OCBE_DNBcc_c z^Tn{>*3$E6<;zz8M8)XmASMPvgGey9`h0?=@+PuQwbE-FQ;o`M#W#P|-#mzbumxv) zQ5zO#1K1aTq~%%0TNO@5@36Io1$w=O&sn|#6i&1*_;uR+Ra@1%b~NLaS8W1IRa3f%d@;fY4zmtLq+b78KT6N!8oYm(_!yJ>3Un!ER@`%!0bpm^m3Z~=xA5z zz9bv=T9=vpsG0r{NjH)RUQAb~azQuYf=*k^4Miq$zv5b};-!V+SFLka$sPN=aTI&K zssizm&-bEQP+R$&xEp;-1L>*-j%M0mo;e+hmj~wRLvbS-0~gN8Z`tGW^=Z}`(x4rh zi!O09&<2+2#ow{6E>}p5Vn6J{$iWx?R44WgYva|OB#5JX%Lu1uFMtSJeU=FG_+drR zUosb?1;;MG>WAvyVfvyK-pBGVVzr#OuZqjQCv(b+fG-m^gg_+jTtt+|qvQRXI5NL{ z5tM!AV*PEBTEkmN_my`j%r$Hg4SGjXtx>ykQNBr3pS*MejC{gu0wTBR5772c-8a9n z6uUdM-o@QpIRQPR4xe1(wzvaIbC34}EIhLhuHUlV?>%4m1`{^_#e}W_lPH&g%jxFf zpu%(w#)2YAak!nuG5HgkC`)@!y#8K@Lp3IC{VN3FOJ$|*5pzIqrG6dA7%7`g z?~Zvg%*{DlREO^kFM?z<>fCe% zQ_D!LOfK;Ry0Fl;8#(hRTei3De5HnGmG3#Pk1*Zv(UZ6z#ImRvt={){-%_qFg2**~{<_;BY!w?Sj$bhL;^|6+0rJ!YiIVqH;VZT`rKH`_f<`DQapT z>Louy0_L4ym)!EmHd*a=nhHx4i{`F1#1u0x``e3MvEwEaVP-o8rfkujwlZ0-If!$& zp;3zLyFOQi=H#Dr#2LYRAz&>1P7sr0Qu}5e=3-Zhwc1E;^NJ1aUiQGc~aQCWRokUmT%x5 zwbM%L$%`EQ&3D#!H?$m=h^L`l11Y2uQI^FYzfNi5-p^?;=?0lk;FGF|J0^kIN#5lh z`wJ@V;-3xN!I(ANb&ZMOqW%zh)^gPU-zTsh2Fv=zBS87zehDL0kFMgZ;P1=y%ol#d zKgZP-)I?0=7)PWUR`kYvQZ%SlF|ZQQe-T;o=kD5`%2;utJnCw}sw@Wd3f01h3sr?Z zAYR#yM@3l(1TyQ^efJ}p6*YB3dPph|>zkRX`V?6L-u&?_AHIrgXTvs(0>13ZjQ1Tp zyn+u)x>gAzXdo9w`nVUPCEtmh(jhneS1On565AD#{bvA8>; zxhE-2a}QrTAK4t{)JU807s7$T{W*YRYZbebY(PPiQ2LT?K` zctd`6pYK{Rw&*|tYevr_8-5OZL?MI1#&{O0gLwss6tv#2Vd*8CJeYotodE=KVk8); z$?k);lB4+?PIG}^7Pi{L$4DI%@w{DaW6Ni66U$_V?S1s74aY79m}_ zbV<^?Rf6`D;5e%o%E=L-tF3R#1hn4TsG0hgJQ}y1$mjDupg!<#3V~#W%BUpqjNE>0 z!<@Xs2W4;T&HG5B*h1g8AP1Mn)LM7am4QtJ`wRu#4RNVdf$FCq)-sai$BUXgpKR;sYG1L}Rz|64H=;@yZzH z_Zbj6^C^WDR{WA-)lO63Ri8K5BwapaComb{DJArmS1*4``{KurIuFR1ylSzGq{FU zy6L=)*O+fI*@c_4M^f;2Y(sT>zd!&t^H2dG;s+ite19%H1NTp*ww0{HSo&momnuJz znwlXk563xvxCs5Xpb`p74~RftE?9bvD&pUy!?Aozy`i}4>6q+>JJ)_k@us59$=`fJ zlH=Sb^;+j5-?>x#p;^_XYxuC9O_ZkeMq)Y?AD;gjczLCTx9}W)T|dGi_Lga|q-0<* zEU@DDgT-C$_sP;lCW4A90VX#!t7ma<9*Qr7SYIhW06FH4lqv1>hv2$Q!*Q;f*hX}K z1JoPyH4yrX>_mll@5=OupYt}AWUCbr;0&Yt)*8=)rr@?j{EHN9mE2hV zW(0htWZ@*Ji42cr(XFdK6vufiTwXdm%{N>m937U)FsJb+y-y0*$)sHL<8C0Ycr+^= z-^QOk)@9v?ZGQ-<)gsf=lW>XkkzMupv?HRQDyAhP{2bU(VgO}3RE0R8pjxrQfq2LWb1VDanf zjJ#9nN68l8f%mCC)09Kn537M%KgZI`*p!TSN06uOE%iWB?}W@i8U5>>2MgL;MkSsr zy#(AF%-S;?cYBaJqg_pRMwbobC%=9k2gk&WeX=`8VITwg(d@*ihBY7uif^S!0_a?d z_ES>-la#Jy=)#-(_}6mL3X>A$043bTk9hdg`qjy!XdcPSu~p*d$g$0DWWndP zbGtbX*a`-31FRe1466U0MXs4(j=6wxAxbE`d+R@Np^x3|pz;_Gwr9kKkS3z;THr|u zUvD#1Mnro|`8HZr?Z{q7((q2VIC@ST1prPweVS>Hs}cM_hqs9gO(9Z{?q0S=WSE8Z zAB=p*{mUs`SZHzWbCyk|gx5NVG9N4A?7iA{yF5%70N#fh@fwo=kC!&!Km#GfIenrq zB6OI_yFE{R2$LorPe+}F*5mKG08xwjmw=2D=7x8BP3RiYlxT6$y=v5cX_<+(Z1?;uK#XQ~8#`oP8^3HyK)kYYV)lHmC&Eo)+acIVDb#vE<6U0}Mb%-Q2yTjW&-@-7T3 zFr$C%^OnFuGv4Y--QH5p|9$i3YXHu>9ur@VE}pp~_uHrj%eg}WEI-`EUOd+8p@DrCR=?Y4hs zP70CodVQVMKb9s4P?(Zx~`@_Tx_QjXD1vPM+6b=a%3}T`wvaFv+A+@3fHx(qn z4J6Z5GwX>?_ieT*fvM-{?`*Ui1g2~%)e^NFq)7&D*UhrV`CiOF1WtZxH)+;TNBvr!SyDsNW+lEX#o ztu1xdCrygTe6sZ3X7sbQE_C@_=qOmPG4?4sOmkNgw?}oFZwwNxy-PMXkmmYj>Xy&n zJE~9kT3_!CvUw{{y3Qv9;)D>8(q+zJ8`4Rq{oux6I>CIz;@40gfNKpRf;7v!*(O(! z4^Q)a)1Q9=F{mp6EIE^7fBhEer8?O-Voua=A(e(RoRTyO?5Spmc`FgM(iAK^TSxN?qxFI5#6rV#IvT)+v2X2d_Iq& z$vn)f5I$FBu=xcH7+)^{yf@>od&ku>p~Jb#OLg=q^V(B?#fWqU(9flYS@YMjyt`fXu3$ zx8g=Y{;$seGrUQf)2D+N)@ZsHY56R`kXvAuF$mHyh=v7BHLqn#o*|X-$sm4QoCc|X z5R9QA6bl=La@lC-*c4G>^&LLn5*j@g*}Vz8YC9~<@mqc%I_xKrWWJ)ked<(Lq4KAAQzrRc zyW+ekz>l4!nRCLkwa{|!2T(W)cyA#ZY&e>`16H9FnX_WS8|L078lI7?g$4B{M1aIx z*oKHz8T?Q6HkeMfz_t_KsgF?30%f`MrAyQxE`&n-+0-a%@ON=IK`>{vXL~zgy*CF2 z+|e@&`_0xkz7URf7Oeq0j=Usd3djAxrX?RNqtd|OoUla`d2sG{$4 zLjD~`XO2U{OPKp8LmMZ2Z)E~ydYen9dWIyEA%=(;UJ!|I9&kfny{$2grs-MA#+I0a z+n@wibv}?`ZPh#mMi;$-20%+w7jhFvnd57#t$q_$^63NbV>lcr=c^q}^9|f5+vZBD z4PGM=WG-traiV)QaZw(c`A3Okn*)48c*Hj9uA+CJQXotafF6LrJK>?L(tkZm^Nr}<;;5>FQQV0_YPcNmq_FpVJxOJ^< zC)vTA+w{%1f7@;KU#r4UV-F<^D$t@rt{Kr7P%p8Tl7jGg7Al!ccuQ1qE zP_Ys)=D#`HH2^~98MT#?vX2-Yy|(0bFKkiZBwOU&k}8<(dvBP{rRyh2#E*m4^CRfK zm3<8H%u-A4xV!gS_!5#vTop5<*x{+#>(E)Y@D81u1qFz<|56@^-2@4+_ z(z<*vKN?50KACx~G&-1x0hpHbW);k4KmA#*HB@F$9~o++htAGYY{GhcP?Q5f!K(P{;c^! z9L##K$cb}&<5lhKlRA?xYCYejL7tS!Qe1(T@cG%6tGUFiW)W(^Dd@go3L@ zVL*Zwkr4Stv)&UG@3ZIr?ZINYtbp3Rgc@(n=I_3;Q(M@BnsnZeC$@Ackn;J4B`oqYc9$@Y(5 z?%A;17AHTEZrSsvxTlh9wa%YOje=i!jYA5C(Fz;OK*F5Zbi&bXg%}zqxsUCbRG|@< z5|wA9id7!BN0?T$88{(zO{U-l8fFxcX4%5?Eo7_o~5@G|7$H&iWB=7e#`tyy0nds>visyno7krbJ8CfE|q zxnvrpDdRig*l7#hPq5+EZg+XV;;qe^lZc06@w8*FQ8fGK!eF7iry#OmKkbdNNjma08FuGscIl!~W#kSJ_KUsHrW7s^6dZmROq z$Fmqu-2oN-ApsaNY_&DZ>8>iqy@j`4fe6p!thoS!Y)l6%ealNVx4U`uzR@i^C}rO` zOxz4J^;6HY@uW>}SM4RAM29k@|I*L!jtYJt=&EZP*rzKo*U-a+-$Zc>a<9+lmou-GNdfk7*bd|2~7BQFppy zp_J6x61t2p|{%A4Bwajf+ zz}$pJ259VhWqzV+0TKre#gJLicxr#SwGa?vqb~sy3c7>jvjmnYx2YL6Q65qt2qI!? zQm(F=bbBPigNr8$Jj-KL`K({=avIj%Xrx*ma)~U}uB)9dfzvFKj z$7Ca%&ntUSGRO#wVp_|`Xe8h7)$bkg97t_E;zKaDL(r)Pd+%lv_ zlo(|8E~NO}*O8d?sAaO81SZ=8T|OWQW+W^+Wh9#< zNLHBOX`XK{8jiUfRKju!W`aiKZ95-L*c6WcL!MJ3z4IxxN!5yG(GA|N`ZA8%+WyKK zS)!R=1-4=3+6+{=^sr&^T63%rM?q2w>MCyYCQ$fIYq7}8yetj(2^&>ItEA&KWc z#<7U$jC{x7&!*q_1`GLIFN9S|1=WH^T%c=Bf(77Qn5t=1L)~5H=yll_^!0jC+#r>g zF(g*-A*(#OMPISw%~xUVnt!p2p!H_39Lli6cz1S4802sLA`<1FtGyf*Huy(Ga;i?A zjEolk@xk4C^>k$P^TRl2cMPW~7$pwHtf3xT4L-0bC0`gv>R#@0n!}fOX)4;j362O% zhcB$yhrnVZaj>AzXehM3pt8w%qrox7JqI|_CqHOkhUFLQBk4^`z^cLrq#f@^*LVn> z${-Z627$A1rrh7TQ|d6UV_vv3MaU3~3aOTk=lvtn4^h8z&Hd-(#zC$8I)0e|^n3|l z%A5EItdhECZR~TG?J*jxcG`h~dRC%aKHIbd>Vcy1*#C~3WZHeR)M@v_D^wO8xJEuw zDyZq;&q;}!BQp-$ATe7@`Le3RHW@%ne90eoCh0w(UM^4R6;w1BdA@to$2ChOaZw|-uN;E!tHNC92+W*O>x7YmX;8h%j-!7|4M@q|%$ufFlZESbNV;ig?;8LH# z8WdUDQWyT)-;0Gl`lX?e2t}}(OnqDhD@eBHL*8p)KM6*d7b1S+ zCf^c$OJNqjlu59ASVSGnU#9JB*yj6LLJ)S1dz?Kd6tnvlz9@)ZadU|c|0{RNqH3x3tc9ZkOrMOS0iONDXw@~8v*R>rLd`&Y(K!AHSYv$3c4 zivyt@HS=iu5P_3zpMF8QGN?&hPl+DUxg=@BY-39$oG%GbUZ`LH*5F^!likujXs; z#s$+6jlbTzmcKnVS-u4%j9opJ)^L&~>gpqTK41_!CCL~C_s=O26!S+-i*Di>zn1q1 ziZ1)&ZoTO*ZH%!^NEM5Zy#1sAmROQSBe73;9<;YfCa8)S?FE*3CY?;YQ6UkOEc?Dc z&5|PuPxudnA3x?nsJ!p`+}_v2k)>l$y_>$}+oTf6%g7^dzcQ9X|MxUd;~=_rJ618! z-K&;RczX9%?ZS8w&3k$W03-tl) zm3Wu-iR_nucXu~-S5Lto%Yl;`x)Q7FQ{*I@$UvOvHcTSpLOdPJ(77vJ>6k&Jw4`nzvPdD8k zJgp4~?8x#xbu#zA%MjR;ehzi|HqZay$ok|s>$H%);mG}M)7I){VrP$=;9U9EUA=Ct<2?b5OIk%QCuty72b-P6m@ zo%M@^bd6@CU#&&&&z@(TOxul5$PUJFyi52HJRwqy7umS+d1=@z&bu=w#&u%EsUj(P z_?hp}@zWv28Vwmg51DFniPX+!m$8dp+%M0~uN3RR^eZfIKiG{w_B!XVthkB?@SM2i7!vR9v=T`%Mu>K5d*(8yXMl5EYx85n;1rXsho@a^s3n@o=h6_G zzM_1lJG+hkoW)+^dCfy$u8+Fk`9+HELYLRJV2W10QWL=F0S`s*uAlA2J?*I zOx-?>pW}m?EST380fRw2^@pk_w&`PL)N}eD!ovr6W#3bu8*LJ(K03Aaq@Prhe?%$% zxieM8?5Yd+C4Mbj+^LFqoOwRQOIKihv#>@a|XaIj6d_Ps%qpJE|w$0!;#bbnft-syICfI^*g<>HH-`pM7;THOMf(%XPn0Y3ECH zmnL)jL8nNCO3shkn)6k~Pssy15-Hjf zC>40kzo~)VZco~_pUm{~^;~1p{iKZ5nYH;gPj1~D%D z!b@jAjWh^IK88^v$ojX2$&4 zp}GFSwVM5XPD8)w)gQEj{^2FBWXE_(x+CP}71pCROcOxzfM}F3;b-i;hkX>w1 z57P9ZTU&k;^RriGQ`Sm^g0B@H&jby5>sRu-q?CmS&Q6Aw6tV8prz2T!d2I;a{2cK- zb3n{`P&0L}bLD&SynDxU0lB>81dnR)R+Dh{ktX@tj-##8pk&PaQ+3mkw#PjeyaH^V zG)m=_kf}*O8shvBS{+PIlb@#al~%g!tnMXsyU&BG=^+_TBu<`L8V;)(^f7c2sw4P@V<>_B5;APD7jC*u?qH;Wcx*d4B zopHL6ak9O8y8CJ3bQu$HT3&j(tl@v0`7n{IP4~^+n=Pxd^of6r{R39I%15)!=($y@ zOV8R1Fld(A|_DSsv=8I7$Dc1QVTMj|7!pK3FpR9*y!l}hZw|5Wn<>@ zv*ZJh4-gMisiA#1G3%iHxu>Lp;X1bOQMy)CCFAcOT_mXT z-@d(&GZ#vssMAn4awPblLYqZngw_U=n8a|!;FU49yiSvwlT`>p%6r3i*Ke!jsTZAp z3`FEb` zM&g^Vxu$z>RnOd`h3%5ATGA`O+NfB|+_i4h-?VUe`yl!LvE>3Y%bBw+%k3HdQAF3+fj$%B)dLv z_|=|4GuY)$f@JlzAeLtrKkl8VzYiJLvMOJ!ls37iYfzoPN#dx~t?b14TUedet5-ed zj|tc>uF+TSZhq)6^ZVk)S*6*Nv#_Fy9Lvb_8@Z&VvwT-wdJMmI_}}1y zh5k^MP|(I)*ebg6=UZZpvZ-ZE=kloTspK$CQ1ln>e33r3i2m%@Tb2ud@_O=Azb-lv z)2};Du60rco}?<6-EzjWe1FJSv)WjcOd!R5D+*v^{je6cG+LmUU+2uF7Dj54=9WS~ zzcXqz`duK$=}`aIuoGR%ea_6VZp}U?D4I^>{Grjq2ep*~*9(Sn9*-ovw0I30^tUp^ z@9~GEuvv%Xxv78mxaV|_;eEIFK*PCi?~mTX=n^Hm=tM6OJw=Z)dhfkO z??x9w5+zEID2ZOj1PLREP6$RHLi831BL@G^IrpA>&OJHzxBkmomU;Jn_q+Fg-e>PE z8Q(kw6WYpU`zjc_e{1pIr*Pgr!3vltm6R^E@y|Ev;OT}jQ}w&KE3^$`9pfLpU75sk z5)N`N6~mD71#Gs($&>CnkRm#Xnn|P2Pe)b)9)xE3uj^P|)yKQ?BR2CpJ_OnrMGi?= zP9|00(#I-0`e+<9VPB9)@`8Dhh$BFb*j{zRYYW2RhrD7_m)_It_JP95$ujf2zHi`D zmDB5a%uASlKX_>Alh0iJxDaW&@_8eH+Cb5!_K_5d+h4txpnZd&Ihi?mdg zjDwo`RAfH{9Mx|6NoP&d#ZB1fHki*<)C+NarIw)ECM4}g{f@0H^Vg@x57h>c9i0~3 zY`2Y)Dnpf+K6TX}cjMKhH(-A-k!>Qqs-Ll8tHzGxNap7gpfBqAR8?DUY(0_wVa7i< zkGvTa!{v#1cD-J(&1dB^Yzz`fzLk2EI$E$8ckg3Pvc3%sOfD$vlkz@A&W2Up81{x( zMYBtkck0_u-|$8uATVm;XxLqpW8x`HC9upG3z;5gA@P`~8I@KDhg}bx{`{)axZkQE zQ&4Im5G;Nc*s=v{%fx4-+k)N}=LG@^a2lN|>~hW5 z!!T0^W#?cu@fwDGQBMo!N_+Y(|LUn^8ITR;T7?!QdhNB zWV&!T(rU@5XcAx8WIMjD^0_%4<8#P~c*&beJhz~b+8M`ep}{v-`CVNy%x-)))7}`( zfxHw)HolURE<%GxjLj#&@esqPq#-VFcYC0k>qMhW6+${)@`%~~Ac;UW`lHzOmKyQAj=1S|-JT4lWy0pGJ;y0wl5+xs8V%YQuv>$sI zIHrV2!M;M~zgVjm#}Cmj_^R1;7e~hS8Sn>?of3MG`klrsT59 zfz}NtC0>#Id?@_W2`kxzvU!DUcBJW>Abm6mfr2ZZib?c6Q9`x5+!3UF@mor&0y+;G zc$)=oNH>q*E@K~9_nw)Vk}OQZJ&4?Cn$I)+zF&n9NJ@SA6x#>OoIL5WQjd3^708TS zw9!tjf59lqt7Xjw9dh@#h6^w~WX%F;G{+1>mW3@=h&Z>c4~xuA_ojDj)nSq5zDqru zXJSY-8=@|nh{$Uz)l@F4P*E21jvBe_8jji~dN`f}Tw_N|mqF)rx2?rIuu7BMvy_aP z4-Nf3C=|_okv;krTjA|=nhlmz_2u(MnXA$~)u2^sGPp4jeZKv@B`<|t(Hj}ywpTk=y zm3j0nJUy+lhhVKytcTVOWDuUM!x9;nVH~Gpk8J~+r~tgj#e(GH*j@ZV1mR&-w|A~z zczj3CUYySsgkR)tFAcP}-+g&RykC!NL7S#$?D%v^;7bhfjCOZuM^|vK`_X5lP=T9~ z(p7mX&%rFa{xVsxB<#{Ux>M*F^Mah6iXm~rL?^>^7lWjcLlhyndv zXI5Lk+?ne20a_M2q8JT}HL?XBbDd&i&W$H|EaU?Yttp%u54H_Optpi+AKxdq7EDJb z4Wb_ymNCVp#;1v#D|zLuuo@cEZ@Ff_hs`bky4#?n^E%Y4;q!n)gkWP%J`J34-ML}9 zm-tabW1}Npx?V8fUGCdtuQvktXm>gl(>CB%BR(-oTEe3i{!eCgm7?#%^nMD6d1`mX=s)=XT_Li-3 z@%eUJbAxo}2x9ZJP_kG?OBh=UA{Z27CDEG1FB@D9w`{|L6fF}=BRk5v#=^DU=C>0$mf`Lc-7`enqkh(n*f&?$jF}y> zd74e*tNd2IrLsc-KwsVd8D>}N|1Z1ZQFo@5{4Ur+_SIa92r}_%1z28^tHBSdN_GH_Atj_ z0KfIy*n`jK3HGkp#}$Vsrd6`bHq|CkB3b)(CkXc_?l_ux|D`TUskO%>ptp@(_&=ks zQEz=g=z;T~KT%09SeCKy=O#zJuzm_C*3yu>sRew)jp`sY=oIXop!6YKM}nrWWTVX_ zVA9rv9S*j+G-)1KqJoHbHX|>2Qij>ZPmM`E=!h{l(;jwLi79D31a~~*8%0sl^V6sE zllDDr_Evb?ehBer?X~TGeV5xAM^BKoBc5|WxXb$Y)TrL0+;kGmbs7(-ZYm&`ZMwm!gFyy(fi2OfLCw|Og? zseAISUP~we!*xGTtYKFql8C3b-{T%D6KqymiEJy1x^qjSWGg`7l3m^ z*8Vl$zYnu;G3%7=McK;0Z;1Qf`-aoOG2^LF6wS)3H{*4KdbcdYh-~i-x7j#bEAo3~ z#OVqpGs*_*tH$dAFid*0lSIJp%L(WPRb1uxa)^kNl2#A`M29Qr@Fb{RL7xpiib#E9 zOvKg7qe!_73U=GW^oA?SBIks#(w4z;m1MqNA}>iw#XO7p@pU4uc=p)-v?ion3m0Eq zzFT07=SWw((Z()Eq1BT4#WmOgo@uJy%NeQ{W!FC|6}vw}+KI}MtU%eBFJhk?6Z38N ziz(g_hRy}oKGmZ;-$2n%T+e&!^!Zt_XeIlnXT$RpN#W+}#n2m6tzdMVSQn4Mf*QEh`Rok8St1|?O`}=So;NlpD+N4U-MqB!#yCY9 z(rsMNtwpS9W0IJ+^bj#Cv#1-g^cLasybsZC%pELK{A^w?jOatB;EMR{(l zpuSr5DB7fzr0b!ur3)nU{+CC{*tHqnJuI!6?b(J8Mv5DC$?S;c`ca>9d#RoJWQZ|PT^({XW93$RGrSPPQNPUENbb{bKA)X zf6m*-Cq~Yz_)pACvPDVZZn+!by!bdEsQNpXX>4aTy`9ine=?;lkBKZfV{9YwB?^up zhL88}IWAxu@gEtNN4kvjUM>6ngY3w1(;}tsjh+AOTh@|?F&YxB`}`G_FUAnERl#+K znPQp3xOl)@;9sy)oY#7f)QNOa@h{Mta#ewBMSC0D!>e!L=z>3Agn-@*=gywVQ9OKj z_fUJRSQeTYtiXDql)GSUo5NmMR~6tGG{EZoF<&QmFZ#|rK9Y77&ITe3)f4UyRO(_j z)8FY7WO|fJFN=SI<+m_%cliX%VFs4C&h*8ODAo{4`IaQ2v4eT;B*Og@y1sP~=AR?` zNY%(ij|3!EdEL9VLC28Nnz?A-BBII~o>0p?1bgvZ9qCYqH;Nsa)5a;9kkbm%0mqD2 z>WXj@GtW78GRC=wm}Yr>vaxv`sY%7V|1`iWj!@1`u8M?CoG;&w09vA2$HILbf;Ek2 zJ_9Y#y9b@qZ>79q9K~Jw@Z}MR#N4XrDG>$3XGTz>J1IUbIf9an`-m)O?21gG&pe(` z@U1wva}Y5@xM>ml4hX@h2-Q>EDdiM!re$i2#c^3QPl$67@5E83=+=_uzly%qB=j9G zhbXas4KYuUX8&fQJU<0~y)DeD))$ZLxrI14Q;}$IV(WzNQHRK!`Jx336w0yEF1M~R zS_iISnl*~DAuiR>=A+M>VeQ{lnJ4D1lJ1=tq_wO&Sty#cg;>M4ReE`t3USI&(6f|a zRCaSg^Sf1V8x5HwM9F#_rZ+ty0%^1s#*%Pp#{wKD!wZT%;~E~H+28BO-W2>a@c$f1@fT?_@E zu#NHQOX3wNW{pQ}xm-q~ehagL9MhHM-^-PGZ$FrH@g=%KcEq*G@@B6yE`=%CvI_`=R!f$wfYION*j{)R*^ESV%WW5uuwEmW?5txZ|JMu1{*FbH5pF>7kin-5%N#n)-tmnnq zMd-VS?Pn(unAMRB%&h#`iT1@eq4u-p_Vb{<&c8D@K;6j>czqR3C!R*e2CK_M#rsqtS1v^M$t zJ2xzhdgEL-a!w)%!jC0pU+~Ks)}X1hDk`_Ia9buQ7rdqy`R=t%TR2Qx2hxD7@$L6k z#9u(Drf|p}TAb|Ouy1I;|0&Y(b@q8S`t3`Fga{U1!sES{-a|SpJD4hWi;d_Ybp-#4 zX8=vsQJ9W5nuMVpGa2C?GeC=rp>QE&8Z?Fut+OlR)N|j<>?nYg6$DP^==vt6BdU zOVg_@OP#^NXv+qsJEr?0vo0Ly`);l^utai&r_)Ma@56&%1_VSZyjL<3WYi(y8BE)` z&N@4fc=s~aX~^W$mi_Fur5EI0DwakidF>7TDEwJSVjH_&cyuF(LW_#MuD@Yas_Kx1+_P7a&(I6ArC)5z>B>c7bwK{ zRmF|;&Rc7xC9*C`Rjx6WLEyGgXFI=T8mmXgQq;x_U=^`?ZvCC&8_wTgkJ7UD+RS(2 zGNI248XUTBSy5m3?VGw-i^h`p)9wwWf7maQ#-bb?^AvwKSBCR0@}{)HL_KB0OQOm# z67is$cki7Y6GS9MY73yoAJg{7T*)jlrWnCzG>u9x^*61XS8X0E>A6G48n=+9f&_~) zY;#oD1SIoRL7->6Eg3XFI>dJnt}8LE#rY6%=%|Mp_;aL*@tVOlM1k7I^;4j(Gx|A1 zU9`|^va06>Ty?g;pLA-Mq>8w#gyF{1w#My2mLUe6S6k71DVlVlucVEYj3$O)StBn` zUh2TMqS=_P@SE_W;yYTfR3RNn(I*8|n@%74lkRZee5ja8o89>}Q!tmfjdWMO-8W%{ z1XNrppi{)L)g1NPFT{a ze@!trrI%!PfVl$aQtTEXvYZvY|@sla;O9tuZFGq^fO&A=|26At}}P zJm;-c15(Uca)hT~LzL<|Z?LH|{OqnuY)vBwUJ}jYdXHnN$OskCP3J|KDarBeYu3qi z#Vr4@8jq)NvDQRx;8)Aa@*AypFHYvWk|gk3SKvK^VFzfw<~jyJ&Jg@I9pmjUfgV#_byU~8L5QSL7Q(oME; zxI=lw3~HI_yu!CXR8NTv-mgY!{2X|)V}Ao`ix*_Nyivc2M37O=Td32wDm50<+e}5< za{8OT+_L!+-!~v$*f?KhCalsaiP@0mb1bg1j)|Olcj3P7r1|Pr{Kcthr^iyqpw5?= zP45cE8uy*u8KrG}eT*TFV zGMzqHoC(QmyE-|QI#pF76^+*hk9B-q6WJ?`glDc@;NY$bk#BQ8m{fm>EAW2yXy;&4 zuGNUnx~j2X`xd1{wxY8vvgl=9vr0qfyAM5tvokgsItmTCEi9BRZn0jGL`TUL>`~Zi z6--vQKjDxlY@T!R6MYynWQo>g3p7r*(S3Fsu7Mk~&O)%;wqp5_sqJkfSMCrQZJIif z&lT=mvWl)Pi^RL{iywY`_2ON;wKDaY{Ire2^G132UEC{?TRa4h)psc&$FL7xkr|*) zGF4vxYHs?pzG~Vp8H@WzQi-zi8)gc4cav-G*N#zii2Vmzi3bEs4A=HqzUt4r>p z+%+dqif6KCEwSihMf+;8Ufc5mrV2k(fBumx=^iEqCg6iGg4VeoR_2PLj3=!lEYA6m zJc-xd_=C>p7QH`(B2Ee-&K}paU)%_>oAv1Ra*2ZMkFPCHSqdoK^GZZ25b?zvU03qG zkx@O7arRE>U@M+Z{8bg6`{u5-B(#~Yv|D<(UD?~Mwn&x0G^MA91{Qz5xT+apF3+Ud zOY?mom2ir-wEETp!Mz;iQP z7$oixZVSmYi1)tnAT8VM?c;*$-=0S?a_O(*pE^HcAz^|LPU84ubRQG<@|d)3U1-y! z*(puC<0m?TYd;|sh^g%!9rf)yZA|D^mSx3FgxL^Jv(W(n_1Nc zj)*3oT}~T@{j;o$(8h>Cf0)ZBWL?CEI-6qBT7xtfe%Sui?Ve9a%UADMT08u~h9X!W z`%@$s6x>jiHixOsu}brsLKJQ;Q~zN!~a z#!;v%tS8{{vPM*MIP#+#}<{alB4Rwh1ZGPl{H zgk}saW6+a%pnPS=O7oL)s5?aFAr6+AX@Cs*EA8xZGuGPS!nj-=Sq43NZAABSJq;pi z^xgJ)Moseensy;*veJgIzEg6}5G)>F&+uV|^QvClg%Vb|A8%%TDahtHcZ({B=+^9u z4j%ikBTK6X7pq4XL!@T|WD-1Zc5Ob%YkF!I5W8_?LQ!lW11w4&;X^Z%EVOMRK_7wgxx%B#c;bbIS->o$>qT8%?sYVjFLkB#XrS z*iFC2c+J25N0^rj;kOp&CMnybcabHFTnXf*Y}0K6czUrk=t6_k1kL5QHSkEO3$KRL zfbjVVrViO#DjW89;na_w=IXd@vBCm`9h@j<-(q#pIl;ZdaRja$-CDP*9!1U;5=j(- zo)+On+WIz}+T4h?*@M>K!FxK@N@OXfce^`udne$3EXtwiZEDk zwt8(qnLUM9>x50KxpkB^aO8RDO>{j|9KQMvJL#Fa z?Xk+Fjn-a{t!;^)Anu(V`7TH`AyO1d@1?})@$FDJu0^1v`flb4kt)LPymjLNL@}_3 zJ}~2lXtquVgL0z)jy(N!r{&~l4roR8uBFuP0=4xZT)I{g4ZcEp<-M;g)>|qNw0;|l z=gCe7cLH7x8LCx)x-s{0wQWL!uq=bv5f4f*iupp~1V`z8)?{#1jK9GZLvIf}>9adw2*(|&xj!C4O5P4ram7YRJd5M*6_y8?k+}wWAa*;k}vvdX2$adV?}B5!d}O?Y~= zg~;IA0`jArwx(AV=`VJiR;oPiui{)wCYZ7iF2TMxC(78Aq&;`*R*Q73?|x`+y8_cr z$oHrSo@q_%hTKkCViSJ}y}AI^B?X<#A%E$mqW;AyP+bXEu9qq;qp`o1Uexq#V{~g@ z?#-vc&8}kz8(L2XZR4D$lZpZ)0(ZS<-0&5$7Z@tl!x3r}rdD+%@!h0E1-1q;@&e9F z6KQi%Ov2(VbBB0cojT0|{Po!SG>?#ZkYUL}tHquCQX*yX_bfB~Yj`z}K1`CCB1^2$ z4tNTDSdCod_EZUUb3%f$f^MFYJr*Q<`??6mVM-(3-Sk{YFcN`VY>cp_vRaO_@Js?f zM?5U}iq!*q63%Jeh_y@GF(16YPR^Z+$c7zcQhwbfe)l@B63Si@h ztaiU=vJaEx6*eJyr5S$Dp(Bzkm2-$!J$LlFen)lj8?r)c@CS|6qRNpohi%hTk zT=!3pc`EHLTFK(qi`#U4zp8FcjVjd@GX7I8KOsx63ol7qAok}7X}%)QZM#Slf|Ibd z6j!BC&%KSuh|m)+!jo#glj?y?_FQ*Wn6NpKuhuBvmFJ%)5sqKu+@>ws-4d zztR%GC@b^YN|k#W!(?5glY-Zu!tP(!Z5T~R&6*H4?~6AVc9!18{wA>rNjo$9Mj%U< zeI)a+kpY?ND|xK_P2ip7#^{4HD(=Wilpl_=Csw`vM<1G@C-wo^tjde{z4S5<6<`Fu zg>;XC>rJLfx!>Xy9Sz*@oP>TlbW3t3+OZB9c zGF6%W_(2z=ie6Yej}1QVTG7A9tN!}*?v;DwcDp9c*b7|S0hKv^B$fJBFlWw^d18-< zJN<99OASa(@50`ZpbmYI&+Pbe3AGG5-cS&y$tf6^7CKU(mXEpyGC6Jpax(G>&rimA z;vBfcZt=MC=?UAyaND>D*<`Mw9#&MkyE%`?%o<4sDU0mZZ@w6BBe?2HO_84!*0CkClqJ9De4_;$DA*!m^e+$jVpxleqwQ{ zDpsDWAE6=TgVraQ585%yqAZa*M1(XU#~PzHk8WJN7|9AYT5<(rBq~c`8&30H86?j2d_;9PDnZeW5e*H)w2$~y z?@Q?96pmlL+fe?5*P1U+ps=a3Hx#QfQ{jtL4)%SnpioL}tFDe*F~W64OPhCU)x~YY z(4q9vabnC{P*nS{gR~CI3C_!pJzQ#)-`bv>&nV=YlD|f>I5YMs*Gi9p3{-7>iv?op zx4G+xt;C`9;f&%@`_P-?s~1Z&H2JalL=Z96AH9_cIwCs|l38qv=}tdk|8~~Z`e__z z;P)lj6t{1@T72eAERO&e31NvQUOXCPZKIrTIWdMT#T#YZ(9cDt_uZ+i>QaU222)_T zOEiSV*ip~OdqF3igcAs^wogg)`e@#*th4BVF`}<5ACvBm46G?j2#-0CyrkK;n_hCj zW4BRHu#fJr_JWiW6^Oyo>z#-BuDxau(aD`pPO2&)?)i}U^;IQ)^WkmrrI)nuUM}q# zyI8VT(jAmxJE)?c{$7Ug5TSVQxfLs?(P5zislMlZ%?y)Bjad^TLC~AAehY46vZFE= zCApzZ2ZmPN2Ng$rc_NY=!PQmAmJ{w+5gG3D0*LB5P6YXAIgyEYMbo<{Hm z9EG=Gu1H&d=nIjAF;=tStb?_T*=w{&sEH1FrBn}h+|!S-Lt)h%P_kAjrpPY>wM}qM zA3PWHj$uBPj170KfTKmPha(GmN7d6v$!#^4%_oalsA&iFH#VMi(LCL@>gS&}jhgqz zb`=k-?tU^*=!i~4jQ1NlItgAi9cO+N8O3-p`tv!?w2SHD9sGKWCjxc8--s8comZ=E z2cnqzUkDIQxA7t`=F?(iAhW^9T4$0w0ut*vkZBpHnTs3I5gnOcQ9Fs2$;W=hr{1|@Lw!Yb0Ra{Mncl_6V zoUp^Dnq%*qY}P`@u>9w&hd+EBL}8cmN7eM5N+})+EA`bMYDpGVZ81!6Wcfw*tEmS; zMrL9hb0#X4l)kE^ZUpb~ZXKHB7}XCO(Cj-K-P|;KQcigFGcI)I!y$(yWZjn_Jw_5j zs-mx?V$W2Tq*;$|YMD~fc z?u?P8P2koe-zvqNxt%@a#5sap$>Jn;=N+{mdZU>}`H0imp`v%fbbigp)4IrAmW4JA zWpi2ueEyNnNI~1VZJ#v5W=X!o#0?R~4(p4wM7V4@4#1=yZ7%o z2YDD%1dfP24iNn93yJM>Iv6+q)cdbX;&E3 zbvcUkXR9csu28*YjrT(ix{#y`$ew%iQv@5CyHnB5DRB&>x>SOE=F80&_58OT(~?J_ z^0fPtw8ch))OPe&H5VV$>Qk8OVo8LYj5YM4&e{bk#fa>#`zEO@#kQ^5Py>0UiNBBBp zyOKE!N@LuRG{@C}#1^*bOUWlN6=E5rNpri|#19&!%*kzgP9;XquAiDany1MRji1SI zo5oJyLzLCOuw?)2l1oWNVqaM8$0^%X^=aFtthzqcj8g*=)psYc>B+<*tV2~3zOLr8 ziC-hAYhePj-Ycj4{)Ud3gfp0;UVu8)CF)g92DW8i?7WJ<_4Wc}@(s%pbwBSGw*(YF z{8{ibpA#LgDq}^jYiPQkpztT9g@9qlyxp3hdU-V^O0wf@kb z!Vr=q&PNfKH<(d5Wq}`Tkw2s1Uh@pCtmp8Eq493(GzGc(qXY&z(}IXCm`-l z0!9D(S6x$|EqqNox`pjl<0>cW)aF0*7?`46r+I3g8b+Al?OhSL@`^+H5XH~+EU0oN zfW%fnme@a7wR(RpsCJCfWf~O8XJt&3Y0y#cyb6<3Fp@2tqEHASUy7EVA}#van0B3r z5Rzo&b}EissSp^&A*v9U05z;`41{YKZY6D3G)B=Shqb7!*A~7ORy-1ZVP@u=y#Z05 ztIUKG$-z_}L&iCb8@2@Ag5(SpIw*1T+CJqsH$l^lsEk&gwD~c$K)!l$%K1ksH~$zC zaLqR`nX+@NKF4;T>U0GUn<>~m@oTXNC%*Ews$mEFA^#T4pfi}p$kQm@t6^-BR;P-n z+&shD*u4|0c-9)EOLUWzZ+#~!oBlMi38X(%9-eD8X)y83kP%lbEX#6*DII5CW+79- zz!+RdM4x=^8AkN=kN64lW3l(TgxhLIuJOjgrozq*hx$YrG_skRqn=lCmv^il`*S|` zbANE*B|k}P$BSscKL*v=-);-!@%)K>+Rpc;!WIvzKg} zwpFjGA>ojCfd7o@MIc=2WMpi$4ZiwrF!C|`%{ z&)~S`S;c+R%If`c)cT(%k3u>C*1kHR%)O>$9X;uf7(DyxTym%ee66 zt)kBjlI#*(n*Lx5O^avNO)paBo8AlOw32Wjym3_WDR##vrJ7>y_RrWFu%utJ`@&S& z5?q+*&|Tt&?ae9eGp*}v2zN4FoEY*~=hP5YQ&_6 z=GLRAu9Ou+!3u5g{-Oi$XU2g>7^cz;A2RNb&Fe>LQ`o`$hSAKj*P2)&ZU=?kebRO~ z1H+X*xAoOb5y%siGG?lnF!Qf;@gt{bcYd^d{gJbM z{5+M^a{=QwC~MyW`?be{sf~PI-B*IYI*Z53?RU-|e0ZBk0IivCc&z$8|Adu%bZFk`|huj$sUj#)uVu6LmB zZd_%9x+u7%AL3ih@R`@_G)?E+7-I2xaeu|FJB~@CAefDM;kCnR0vJby)75ACnp34lCu4lXqa1R?~v#o+7Jjt?4J zeFK5C-r#~nfK?kmXE!?`59^1{{`Nv{&Nf2UKJF4?LbhIB0nQ#i4=o+6eSvSDJ^|J~ zcJ@AkfX4Q_h|o!cvx^8;ss}eHHS?0Byf+&Yzx)i_=t=}uUTWmYPboSGh&e_wEMyLs=} z#IyS2m$Uugwrbzut-QlqYi4UQHS86RLTxtZU1wVSBo|!8U#0_P^3}8mf0WBzeSG7I zvwg!+a(CRhEbZySlg{@4^>wj_k=@!U2&yd5Du{(pNp+ysBQ}e9wv17)qFwZ z;%9}tXi+~A^Q+KDVhD9_Ah46tU(QJ@Qx^GPibP_mJx1>Z_5*hN1Xj=b=ZTyP;pr7R+9r<^Rk+hKHWa zuIxQ&zkh!H#B^mZtzA)2`uqsp`o%M~UD7)%5k8my@do3Dp zk}@+cT|p|Iti)#nD*g6stMUWDH<5Io=l9-fzz2%WxyA&koU;-e2UKS4*>*(Ij|z50 z(*2*`Yt@j_>#=A1B9iX?yce!vXT~KWNOdhM@sal90hJ#6&Uc(!BI$n5ds{T@%(?0X zsf@D{D+g32?b){U)M%7*j{+Dr1wk6 zqo%Pxx%&&v_pEP!71$q|v&~`uhl{)Y|NDe$WleZOz88h;5}SXg>UK;r5=aD(TVeG+8L;vRhtbe$2-ub^hJhBG@ z{2xBLMVtax;(xffDe=VQj>Xp z{S^B&TRQ-_)j(`;$+!Os=FeOI6Xo36_&)^yFa7gL`2REzTKmzU^ieYE8XZDZFxt@! zcLdP)rnvQmEwD#*|964;*)JCVtUV__{ePJddiq~R|GXbK4Zd~tzgGTp{_lc-u%JIY z`n9Sc#_pH?iwa(KG_xCk3oo%b^aQlLCpess@-%(_@@MOA^1kiZWvPZoB>(RmgjN58 z>3`+yHkxVoww*cdNDJW$KZ;vhY=M)i`<2NkV>(0wkk{V?yX9JcU;K-9HSBlIzbyX6 z1ijP$WkS2}f4Be`p7VqL+2SvbYJDO5OaK2+^`djD|94P-EdCMgEl2Z8--DZ5?D2bX zVFh1h2^VKVCw~0spxgXdJZj%bB1rYmd!t(~BD`pQ1f$o0bOTr4m*UnMTi~$jeqJ(4 znhxRnn;@X%*Xw_5fLCz;q5Q|5ij5H$+=5MZ{jv{Qkp*{E6j~+3gzY;ni7on&H&}J>s=* zs%lGS?{AfO30l6;mC6F1X}$Jsl_%EsFOS-5*weH^KcctH1K%4-;(vc5E*q2d`)2PyM?5n=&G$#V-LU(D=bO7W{NBUkl?Cv$*{Q*| zys*VYgQC-j8X2RSa<#H?GjS&ElJf0xO)yP2uOpLi$j*!rKZJ6;{XoE%uDR=F`;&U3 zN|HGphl>jf3}3Q9ws^SW_;%*>r&AasMe>in5ZCRCh=2m4N-l_jXt+1}efWZ;dk{Z* z{8)S_-}kI+pzPwVX=nS&3}TN#dIOppeuN@WwzXVn8A&6s1Rgy_5KlePc3h_2voPx# zI25v@eDrg#-e@Re4UNG7! zZNB|;9fjou;=exDvQcBj2`8<@Sp?-G!fTmANw;yEqu-$_mI+R~+6}i#v%0|^6!Peo zXvEMmfn*}{9C!FW-U0O8GV@H!hVcQEp$mLlAiVZ22K98AU@Dn8R0(6%j7~O@Jk!UZ zWDcN@6PdRu<@cA~_ETpQ90`-C!7?&l_HAfI$f?6J#Ys z1a6g%089MgUg>BA?E#de8!QOyZ$cv+4)$hSHh2%9huz>|DtRPucq$rUyiDMj#Oy|W z5nh!mNFk483HORaBZ3d0bP3FPT;X2jXoSqc-eSv!+W}Os3#>&eZ^Rew^#qNeKY&to zgCWW7aKG{U%LEO}1mnvDK=fah2`ak4sdVy2Jm)wjl1xIt`@b=$o67_P-QZLzc_YAP zB^q&anfX)8hRy-BWSQV@GBZDgyp$RSb?*Sm-UX&jzUY|LJWXU~6b$#uMkCk`pdpFO zj}n6;5~^1R2JdyMSvvoAP7M;cY(A zB{H`GZsnp8Ko$Tj7udqR64C0HB09hhM|iC&2BidG*afx#ZkI78eiS%tm`+|w8)Nkp zjgSVgOJvUD39o&Ci5~+*5&&jE&=wdJ-ZDWMAOdcN7AF4EMJ*u1#u%$AGy(w26#$Z2 z-bmp5=4GmY`|ErFy?+4pK7bl56MRf&uB5(Lx|Gl?6FjDnHv(YDLnA~Eptb;n6c30d(sIzh?=rHN^amC%HVj5skPGK$pa9CKSF;bO4=S7AiXfa(E+r|KPGyP$T#cprU{%=_2qlGT_RIc7Z38ncEaFC^3L#-QdZ@3%$$y|C(@@ zsS@T37ZwN?<_Q-T46g;46L%uR?Nfk}yy0Fzq9_6A0ESY_O954?4y|1b zBFac2=sRyW{G+jxsWAS~xZ|4g(mmm(lF?}1D- zpb?rt)dV=Gh_M3xK<84#@XLbv^is41h`7RQ)iJ17KrID!8DXr-(7)vaxVN_f+<_`^ zwoG6MWK0`_;yoz4B#dDaa~qIa;sa;^0J~uLzTg3LXL;ljO+hO8KmaI-1E@MsF9AJ( zRg?#g|4cLKOIUu57{@;&W_Ky#Sthsv@P|fT>ORH_sO^bBHSD(31d^XkBcDwxpG_@) z6#xR@OdA@Zc2J;n2@7lZ{?!BMDnPwNW_~JpDd3)7J@^e4e!!3k#wrnwcmUMNBxXi{ z-A0(QORkdvWk3UC1yuQWUErQBa5&oYvN*!yj=+%U)()9{^V(~3L@=mqhnANtlH@&b zqynbwxB5pVj|OUdIKVG}qrBn!1_#iv*Appk4xG z0mAn1#a6KPziyEOVNls2L+eu z|8-+4P`=y+1Z{T!Z33W6WUd72Y(syEcaI@_zq%GAYoy#8VN20@`v2z#E=$uXkv~4Pe$tZhvuEZ1d5GkHD)$ z=1^cpF#(Dp(D$e>VlN~3HP3#>lP7#1sI)-%3j*O@Z_$WWpyDN8uwD8Hq`{L$9tm{# zH)sSjm#@~9#-%8`Y+;39|?GAG#Za|bD zs?|yqPUS`r5SfqiucZqG3RfiBar_dPUlZ-}&iwp4>U(#KyDZREG+`Aec%UZ(5UM6+mu@(8gG;-?T;1RvV5S5nKcJ84VhTzCx>o`X`Vku8a{&F)1E;;eH>If&1hcob7DEzN}=6Xr&W`GdN7%KpWsV=YwjXWBdfNviNT{g)%w(xz` z186RQEWqFg7!(OWt?me>%Ubs9!IAb7PrqLdj#HOm{~EORgntH&;j%3KdT^xs4NqWT zxrebzMk8VY$^pMt0PUjz?Rn{b9)Q3LGy<5Pe7nHIKnK^uSiM5a-~C6>7B5@Eud8F$ zWs-jh+HY_|5}0q@!B_$1!5bL-fnfvaV|Oskmzy$yLJ17BDi{rs&lb;)JHma)6e+g* zmO29yQ!Zj^ZIA^&+EZilU*<5nd3E2jE~#zMXTS-uXSTMl-6+oh-at&jbxIW8lqEc^ z?KSznv)n4zK)o~W3QcD0nPQU*a_@(z3kP2LL?4WBoaOpwx(G(5JCF#8}Z1dyX2HU3r|rD6p0Pwy_Z5Pmf);AUqkJAXU$%hg8_T zS<(*gH}R-N`#p}{K)0QarJIrhDd*OC>|RgX6Zo2(drCRfZECY-H_-H2M@n?1ZBO~4 z&+uy=YeMFzPyNkb+wP4SsUW{yN(}E`=sGi+ zd#{IN~*WBY_w>vQs*&Dn8*JP^G>v!n()3 zWin_aq`Ta2%!DpfWQW(BCAs*UA$Fo!++>nv$*1%H6>-MX3@#@Q@ zvqS;KEM}h+UG8epy!5E#jV}5 zp4-86Ge=Y%($O2l0>30-_aOo!R!U90;da~Pjt-@OL#xVw!i zXY7^PlB9?Q{%z=tK??$RNXzt^H!-7b!bsy zo0_=4dsk!Ttv7oFMzA6Vk9G+}V27664J*jp5ze*EVj-<)1aS;r^cxBH=pgQ}QJ6$V-F}!CuXcxudTmt5D@7Ha%gAm@2dj zv01HS$$i3h=>dYU?b5$wSh?}qb+i?GmwU8v{mry}(~(VM@0`-%#_51)(F&9}b#44w z)0@+_OL2(exq5DO10An@A=M)~4lmJK9zALSEpMyFuggW4CUDWxDvx#M4{0GzgjAy6 z5p{e~25-tLr4g=HZKbWQ)#Jx0GNda#?kcwOaZ}GW9MPk;m9}rL`QmC~NYAB5!!NC6 z-ghA&uBl-%%1RBU%d;OFPY(s=AMm#&@N8-+F8C3>D@VF2hbQ*Y>d}eBo7u^Z#DEIv zwmCnP+kBUp4M8a6W#-}m3a^cSGe-QyH`gjc1*v``AzcRk+MbgcreLwk4DPr#%o;C6Z=BWe%`|bFjoROh z^q9cz?WeU*uPIa5)ERe0pKm|E+g4LxCpS9u%87+mg*K)bX16O~;?N_+EX-bA^A(=P zy-vQLc?YyEk~AsCDD;qfT%{c^O=&~@b+?WGJ(ohirz}-A1oq9MULALtDrv9WwMKQt zyLlBTPO4%~)a#^Cd8O1`faCplw*Ij$-fO%s^U=%1Iv72#7{gNS(kAbrV&lZp;-Z69 z!!&_&sbx2-5wDGCdMuG#3HPU-qXaQU^IoEu3NV$Me;bOo#hN5Wd8f`usq#%+zRx|{ zL^`sGN9TB`L7!L~f;qBlUYuxevlK@dR&Prj#a42^&h$eyb%j(k@rT53L=pdn2XWRz zeBXz7!7kMfPfMN;!z*l!+R689DZ2;NKf_;iTM@}CI?Y@mMD!f-6RPYO(aW~#o@iNt z6N}0CuAa8un)HBw8Z5fpe|zM0UmY0uIDJx%xCosio_nittABuANIUJU6d%mqel3fM z0R;*-+;s7vi`OnggN`!6?x*_0Ld=I+6(8V6;dw%KyWO@b*bRl*Ws8`ED{a_aHd+RZ zb`Lh`(k^c+MKx@*VH!qsC>=14|6nU2_J12M1Vgl40}n_B z-fRQIQ^v@Q&XBQPy%X6pio|C-LO7yvqal^>m!ztqH?e}btZuTK zyWqs`!4NSA`o?4fz$KXWTI%u}>! z?<8{znyVSHQ(kbvd5Pg(1v3#LOur*Cx0!x%ZGvN|9&E1PJE82*3~vkiX=kpDGoSWc zPPKcZJ^_0)`aX)N1Dkaxo7d44ISvNXTk1i*3;>f4eo=N{%kf;}b*P#i*&uSlBwF0s zMBMFR|C>4?zL4M{E$kn`kYebZHvS(knQ6-?xe3;m9+=xBlv`7m9dx-VMNkSf%<}W2 z&TlB2CMaww+7k{p>Fb1^r{+{1>r!8I5oM3KNaCaH{Zzb9zX<$ZtS0VFEU2>M>49E1 z@%2cG0yfr`xL})}wrrbuzpdm7a&scQ-`|}MvP-*hLx&>1KJ*hT7XAK1sE z)(99shcwUide3R%YY0Wqc7i>^Y)Gc+uA3Fet@EZPkIi>p5p=qeELLt%LT%(9xD@#b zeOlUrSlCwVCwCuFmR+(HVrn8pU4U4aPXw-WgztnL1DmA*PenKFanYUvPj&e3Ts=yc zA3=MhH(n`!?P>$Wo=QHr*z0CZ5F^)2vr;B1)!vj*b~vfHk!<&y^vP{v8;Q;DfoSbU z*nWuhibRxk^&!o;Mvzv+9idQ>6t>C)COF9jij9GWjrs8Ob&+ z+;j#FI*!L7BYgBV8jO`Vyz0c6Q;EvD^MKIt`iw0>BqVLKP8ro|1ym(JE_3~^V&k?F z^=4HRQ3SguUooof$w^gKoDI*!)S`O4WL8Ewg=; zU3;riZ(+$ew+84TA-nls;tFL~FeI)FeTwRl!+4YQnDW!3WUuX5_%W)tzeSJPwUQyXRoxA>%e{_b8YZCbi64n5qOz#SXTry`F}V zsrx}TY@af9CO99rG;9mEw-VOo}?5aR+M z*Aj?;BB~wobEhi_F^J-A7w#%sf?nX&r6{5%kUE11-SdGUJvXr>PLu|}QURv(w<8$- z53Qpl)o>4SG;Zv0gbAsaxI|J)_5CjZR=G(ICmvJ3Qai{?%MWkvG^kYH*Wx_XEUIom z$|Igm=pcT#ncx;7?j>7&uCzPUBP+tAr3Yek1=S}RhHz7Jl*ucbv**y7hUsoM?aA2J z!8F+ElN=5NbOw_lDt)1l3dPios6DmnYC{=K&Q07KuKo9L6Yi^W)#u~*~ zVEK-s#d5_sIt5-ltG*YD@Pm6TK zES7dFX8f(dKH z?#<)S;vaF^-!jx56`NP+jbdprB%Q*L%A|Uh+A3|k%$k6tVu7v5vN;E6(e;{?%OZ@< z$TCo(H$@nKb`YRMb?R4U-2H9+W3VH+{c*unWUi$_WruxBmcUf6!UenX?Xm1s7a)2k z8~^mcx|NyR^acdft(%5D!PrrRt%zJd68vU#~~r}{dLMrquAU3*40N!TudAG zcte^2OD(VgxE>gC4yYaB4%>LR*HEZd2VA_`Vab4ndJ`PCy||(>2H_1iw>EH&lmO^H z!A~3Q?gWjNFM!XD@dKw$x0QsNg#3-MA&6y;1YWVI#L8F-hh0MFHMM`)H8>xB;3s_ z4|8It#lv`tO?zxDfYUUqjhg8H?Q8$~5E=Oh_#mVeb|86T*Zx;!nKyze2OE55kk+)n zX<)u1kd35{z1QXmTa5+7)29Kb?9kQ3HM%&aEpttsqQgWi>ggTc7Zb1z1@obT)kZpc z$`u&E$(QI)Bd?;{HR{Obvtv(yBqkoMjLP-KtdMC83ooPk7VZZo8D(Xa2d>P^KT! zf@2nGicx*a?Nkc_Ur2gp&@n1orIZJQsi`!f=3vfrBSR93Vy+foWhR1UM3)S2GCEyJ zbT;B6Fc~*x?;uFsD329rP@I`71m|{u!kT+6GcH$#rQ3e*fDBsQeCT8lehV_3U~m$< zt01N(z`!CN&?p{h;R|^JvVc6k)d3q!2fl+Yjh&*RZT)es@-G`V1Sx_Tx_+P^jo00+ zX(h@-W*mkyMD>Zxo(7fWIvhBCSj!s1VLAZ8E&%$BqQJxlKxaomj-5V8gdQTmPcYFi z%&!skHqMX+Xth`Tv1)f}>w@R{ecOb2CJcidxpF*dZtjvGvT!p%KJaBO(Y7E%p}sLk z^a1yj0x-HRfa8SJgUGr<+vB#Y%D%%(HwI?5woMmWzs+iEhS7L*^5;SI_Sm{0_&$B`V$Qx6`YRM~t~ zoeai|^VRNl{{Vtgq1e9Wt`xHi>j{uRQ*bZfC+(`}j|;H5!TxQP(JmO+Eg`@%`PvNQ z4S5_^GR54e)^~1{HYT!pv$eN3=c1@IHwOZUVKH0Nko>ox%H^OgH$S7QnBak^{Ipjw z*Tgsq96RoQ7Qnyv93*@dsvxV!*2ZbS$g?e9DNF;p%3TKnDt81^kj(faQd|y4*%J6e zs&Nd?2tzfY(DD&^ntezWnY(IOwKk5sf!uQT8L7jssnG}E{$EIsK7XYSsYQ3 z*}$XeM9<~Xrp_{7d6B!=K~!_zXgCo4^yvC>OmE|#f?4Mw87Xz9BN>3vYoH#1d68ML zjw@&Y98WM6dJ$knMNP4uqiqtNy3bsO>Bwo1eiS`6__;LV`+09i3c9WS?UODHL!3&h zH15Cs0951$o2poEa7P4`nW>R5J47u?lFAB=wvz1i%)};!(B=b}J)$T$a6eVNiLq}} za3YF>*34XyKe&X2DNcl{$ut&vZN?mZFl&cxf=P_!SQtif#IBR4k-kNwV;Ir+2fa~q zrp^H(zcP7gi(1W;A;tt3=1@LP0O9fp2t)GI5$Z^LV?UK{j`xD zRp3NqGz=07k8hg%-@M%@S}3~V_xiyq9~#OkVIy-!vePF zu_K6uJb343Tme-qar9Ikix!F`?LY#iVIRr%IJQY=Q>bDV{lM4J8{H=E+}W9S5bnp_ z85T`kAy4Z=9LhHZdOYkan+|N6!?YBwu*a(H*II-(!yqk;8fYb?=1u@q|6)e_V*sTq zD+8L8W-#ESE{rcm1cWR!wqx$%T>KrBsE2?oTik%Njx{kZTGc|u?+g=znjqgp zjB`6kJpngy%o@QObLeX5-H)~>sQw8C?rQ`Z#sMp-_X3=jp(;bU0;`;^-|(SafQDHk zgdb+0%pYj1zV|cJdV(l&i)%TXMpW+Hk_|d}KSSbV0 z6|Qi@T|j}E%G?51AAv)jG}w(kQ1DHI(6b-}!jMw%uX#A%$?>O|d)PA-Q#M=?V3KoF zZI}~bX7$tG{7`c>Q7->=OsC{E&=kG z1mD@FQ^_5-CHEW*gOhp_Dl**TS*ow|nOZX#o7Ldn0qTruu+f*b%T!>sIL6;R z%*mC`H6LeM!6Oe9>I9l%SCCw_<@*#L4VRo6bF;eQRc+C3}D3j+6vwOx| z-|(i6$+q0my*#G4)w5Yj)AFJflvYEM(>vTk6jRrQGq48m-|`AFr`BuGwj&iyLLtO? zFHY*EksbFTEXr@}# z^P!xCDQo*fkT(INFV#V~2!Sgh{-|zu_)2l5>TZAu6u<=SFz^gi=Qvw>z(C$$;>-y! zrWm-07M4+Po4`mPW?o=}JKa!c2RAmL6lc#kriDW}rj}{=bKvG7kLJDhQ+a_c0&6g5 zsoXGIS|bzrkOfd6ISZoawcA^uElNwe8!H`Pm+5|us!A!weDmOZ%7ZiZ^&u>M+96R3r@VV3%dwoMFIOAy19v77=|3xg+>fI3o+2Q<`vy0Evr*_`Qu+CY^DlsZ9}!bs-;RW+E7j(a#r zUWm3kkT$n4^Cl<-6C*9YfM~*fwTNvrp@Si)iJ9kImH`c=c&B#!vEl}4tIHmBWyS(ib~J2hTL6- zz+Q&ZsP6k8Fm2x?5%+kTtbw3BAU(yEpwy^bK+R1Z5Z-a!k&OLdsuho!W*AI%B8qpZ zekSUn9=KKKCXLs@jwDUF01@;TnK8~qiw7y%Vowrq$RIy^$1I)MBf9_~2uRZ$kZnD1 zhytBRK(tz7hNWawq`U`|=s2tDz=@>5iHyg$#J@3fL4QTAk(cnppdU+K-y0U#Kul|e1~#q z)t5Wew0ijI)AJZckH_2VBk}G9{siWJ2yEEB zo@Y|31~baOhw-vt22^G|5+gSbzusdOCH{cw+?)Y}w=wya$))~Gnl)QuoazNQ(OyB! z5C^`cG=t8XVoIJk@EmL-L^#cn%-7*+9R%VA^Fb(cbhbf85w0j;L1|mrTl`(V&aHa)jbi4;Oft z$;rG~Qjh&->f8~LyNDXK2rcU0pv%t?p~mJ?x%^<+hql7I@Cz)J;|CiQ1j;i9)1ebX zpC-G_c8o*OC4i}dP*7dRv;d}-eSqJ1v5<8E?{bJ-2Z7t5u-Cl-bJOaEjSXeuyEJp{ zDCI98y%yskWmD~5n2jrOrlZpUNDQ*Iz1R$9<3o1yHt{qlE5tL*eg&pfUW8kDe$WU~ z6(_8^F}0a@n_-W;%Z}TGhaQ$L)Wj^?C1B|0NGp;pQE`(dNs%7W1TO^#jz{Ma`8S5h zZ+2{#VltTFRL}7oRftAEg2_T7tkO{5M0iFM|FL3}R5#|H6RUY<0dbxK>cO!i6KpLM zh*3#)1UGaNa1%eC`*nSG@-ndz&X}X1z@ctTnj(r|_OvpO5TN!#Qw`{XYBXbiwe#9p zKJ^J$pENUJ1K!`42}SnK>r4>LK+OOXO(r5K=Yg80icox;E?Q8lVIG-QgNOoWL{S=G z>P_Ro@;z#bL+%VOSbQY&NL~guLViFwk0oLdZU$xa#%(b7VILTEf_Va?F91vq)m+*G zn6C)Hk(;s-CA9z%WL#CT$0G_@F|!WPlmq=lbb-~PD#`mrDly!chmcZSA5?bXWNuzs z5N<}3;tQKFRXq@ZpvpQ$rS=mybR5Rp85vr|*c*~mRob4tRlou$-8$g!EvDv*hD?$6 z1uS;P61z_TKnowe(1Jr1u8>Y`IE}Ah+oZ1?`CJ4aU%;9B_uZgGRoHP=F-@XWVRvAO z8G^3^{VBp6Lpqq^VpN%M7jYH54snec*Tz?p-CLMkCdk}iwQwbW&`C4mojgrDY!RO# zqYkxv1bSF%hD)rCT*4sv;e`OSMt=<52^bxn6J^u~dg9IlAao~xh(j}Q=)y&-02oG0 z?5I$);MAt9DpZIX1|N@6n%L9vfKM;*HG}LIVV*?zLcq|nS-NWrr;Nyt;M0xtJ#MBp z+fVxfRqaH`W_RtGS^QhL2WLv^ualq{g=x=RGoajrqjnNGO@I; z#(fa3Nq*PYwi=1nQLBY74cJynjJ&gc!=a^CJro_*ZJ$f|H6N@Oz5wR`{imWjAy zbS1yd&Z?|5g^|x<+Te6eWX5EsVeYV&);}wVgyJo(k*#&{BO>eP+WmgzF6p>vBbv(Z z#PK*P|EE~T*gZG4p>}Gs0RJ)hoOkp37leKCJFDGvx6tm02Ni)ljM>n>fe7th9SvIv ztJyn|8i_JizY@kY344`|w=u&XJXmxr5u6kNW5aQbRVZfh1@{j614u_|jk)h)xPUcX!Pn{ayVM-8u4r+%X_zEUZpwVuJ@n8Dk; z`XL_-{W8}&=CbSuBHkbT^tF4nMR2?KrfUTcX`$$HeC`!lAGAUIg;Dp=8|LDyvyXop zg$bmj|0!PoXr2Ev=4f|q94co0V?}bHuyIMQ#Z{R=cv#%H?`uMhWd9vsu3vo%B|?W5 zQ)m8NKeQNjNIzdjKyFp_Z;iQ=R2wX>GYVfnd4VuYn+%mR4OZ>F8~A~}WS zRxiK%Ryb=d+Yr;D;M1{wsPweCjU4y*YSyf#;cU5MUuil$bs!=#+Ui(|Vg5xcG5l^z z7nN)A2O>~?`cf-PoRyI5YD7xDgkbZtYL4(n0nct7Ld+)5Rq*L{{Q0K6 z`MB6%+NDM21^`C|l_7K>V~ryGeeZL`$rszFGHi{u0B! z4q5h{Lt%Z`;FNs(xiAjhN4UH7>Mz_@@zG_4<-JtPBJ(Vn0~nt0oR_kSUTZUw<#`{K z{3Z4K&=aDQx*Eo9@<#o&7U+aE+HdWqKj~}3)ddg3FD4(KCifiB z?^Cbf)HdnEV0eGMvpO0kW^>D1qrXi{_Uu^anBcI0Mg-2sqG0aC#(W{pILcA*t#cUP zCFLJ}$um(mwy#{O;2l(uNfl%ZzLFm!+u!}E=iT0>^OIKR!r?=~u6>yl(URYzvepOm z^S?-yztpo zmvzO@lyd}d|0>KqI&q@p_ZA!1uZ0=i)P;)%@w-WF>ayY*D;AM1B616b3cSCvE+pUZ zPI)si$2IPa7s zP1ZKDl&q<4MYoE|c&u>nX!K@PwQTRIR_?1po4L!qQk@a``f?nBe@Cn|vxSBQXe^vP z9`G>$r_Pp&GHb5l9h5B32w@}rQjuI9?Hnkdc|0f}yQ(@BtgF#eo0NIat0Z-^s;2cU zAJYCW#9UUSS4_ws<6pl&7D|6y44M1)1&@B;r$;rCKC0Ibhkx%czQyugHtd0}VG3v1 z0ndoS-C6!v$?6LUg_nk zb^AE-=0Dfc-TpKlvYc1Ir%4C~uFn7bdM1jeRNHqdw78o6*D9~JpO2?O_nPdK?wP&E zR{X<08vNMMlmtDK>VU*SNuTUxj-Nj@WJPt`uN6OL54`E}DDMFlAAc+#-rr$D*y>4OiKB!?4MZeqzeQhLca#zLl$RWcn7x-AE#YQg z_%YzB1HlM-nCF-$IKWfqb7DbX6)&ahpT;jQ9ILt#`g{&yb+x7e z;q0R8c;xZtew|^nJCB@$EKsp64K{sMhp$-$YIi-6a0?_~GWXjH&ey(mgBEUUW`B5m zv?Xr*h19G1T>mfP_y^S=R9WJ4b-x^GJny&k>Ba@6nnKmtt9M^re92j=CCmM^gXhqO zV^pm;zJD!lY|V9T$JR0?GFS(#8}`?u_kS20taFkb*R!mfi_CRIym5c!)Zmv61@En` zR&Cv&-*}Apprj;FXv6k>+Q(u%*7>8-3wu`Fe8=oLif%UVg$qAbdV^0P{fYT83<85AW)nD1ZzngU4V(+e%K;wZ&*A#W94Ih*Euddqh z&W6_OPFu_R$4nbU3QY*k-V#HaTG)5UcHp@^JKJPiVsep(uCpKAF8z@vaX(7bUvjrq zjNKb&5ygXe^V1N|xovwbD&>u_Y(i{ZFI7?@QolyT!tPK|ik9Vg%=(?B!%mV3HEV~E zUSBv|wcq4Z#pJXsG-F-Ay{><wmI4{^H9+-Vz_}gT}sUc!_jZy3f88 zE|vFXnUeL^{nTM~O$M@Bg{YJ@S?LqRHBJ*0Nm!l#|@^-WB`()d6O${g2; zV)6F+LPLa?5CSe2jKmHKG;Xy^E|^|9H>`OZc?jj7mr@qUw~D*`*3@tMgvD z8+R=^a^^JSX5F?0@Kd@RSv?UknoX>w8b(39Nbi3Rh6|M{$!?2&r!>@kr?&|gm=W{H<7jg0aM6;G+ZT2GiPB+W!n;((I_es2;dN?RJyr5J}vYUKI7hW~Dn$+F?Yf%HxpGO<9%3b+4Ns_FH3~DfB9v@?tf(ooeqt{ zr58R%bk%LHZ~qvoyyMfo`L1txi(E3|pP>JnNs%<8vicfYq+a*pkodQXybe=&wT zoVp)>w$lf9H;pSiZQ#S$VeQ%l!$q$5Ui_9JY{hvdvk2Yr?BoU^&skJ>ZsLcNqqq-a zDoH0tC1u+>Pb|w>#vIuwnC;f(V1(t8UVJ32{5gxLJ0B<-)|wYBDp!6Yz+57sCP)m4 z{lcn)YbCH6bQ3;Ig#8)tA!ttLUlDIxxQXvBY~Eh}v#ENoHJ@?2WhFK6b@>gJ(z62I zE;mA@i`Ln`7lh;A7pl(Vy4&R+IX4%sv(WnyvL-ProSHh`q5p*Uv*LSow_6_%ipm~b z&A&m9t8@~N%t{;-!aKAMnsp{m2dQ^A!u!RiVh3MXI_tK#JNsFlXRead>OX#b{>3mJ z@2mf~(&dp}H?rdL+{?cjbPvetM+XXbKXJc|8(`mDwpw>wv&@dUJrG~7{=9#N&pstV z{Ml#TpFgkR_ap=Za@}RVT<$&t(_mODYnSzRC*ZsPG`XGJsW$$;{J5jF>G9yPS^v)4 z6JsfYoZv{gHJ9Z$JLWD|93KCg@O?Qq{UZt6iindAPrh&?$mzGEm*vlxe$6AL=byLv zgM0t9djLR9z$=b)@u^(b}lR zE8wNn7kPeJf`o5mlgr)mvRbi6##-pdL1w4wkh6^9F4+iZ=27F0& zxnF-;cBE8xuJd@H_nY>i$J0ait@tiiP2bBqCic?RgrahHZQM_}%qPWQMJTT^%z8cl zkFk?TBL0(cgr~VH-FRH%N@`%xpxyS#xg}YWuE_3@?vFR_pYX<7^l7DqRt4;e=Nsu`RdKaA$*=LqxG*+wI5OKxlJoJt2>#uj(Ssv3d|-n zvFrJx7TGZ&JCWo0heS(#7+g~D+stM{NaK|G+wc1fl513sdHdX$3lnNCKj5ur!QYg6^Wz$p>Gst0#Ko{rsewn4VHTd{*RU=Kt24bkzlsIC zi&vznLjmbahZeUryZa;%$%VIA3ieJQm0xH@@!5YdY>TrJC@EJx_uoY6Y5Y~gcv=c!-EYbH7C~hNt&Ph#wK@x zuM}bAv3V+I>hg+)NU4lNU4ayml4;q*_VPdAJqf|&ysJLn3`ZCB9mU?xb>v+&cTbvD znZ3FyHoVYf86Q(;cc4`12dPhctlj)k;LXKP1G`iB{vr(fc!U-bS9q)N3j5D~CG#eF zTLK4_Uf$=|s>RkVGh{P#&qzO`at&T+8{c%)?{>!TxSt8)M_S%cYJX5K z@o+fVcB1-}mFvYtj-AAF7WJJkLRYM1M{Z>CbjLi~M)t~Wiu$|u=nDzSp3C=~8Pk9H z;`>pNfXm&L*3_IQA4$KCiumhm;P#j5{5ZE4Uw`4_yLNtT>yej9Pkhb!5~qWdyYYp~ z&dN7`pX*DI<`FxB)34#LW?Z;8DDd`$j3qK=XYJ=@n!0>#fuPh2tzxspMgDum^7e(N zVvh{GwZ{5jX0vZr;yC%`M&tR0?`c^g50+Zj@IO8iZowK8@@iwaQ>DeFoW~U>?5KAp zX59w%o_tTH$mS4sK^a&x>%|do{Tt>T&R*ZQTes!9cM3PP69n9Se_~2L9WDj=U{=Pd@oHnyIbr$LJrCmF8=c^n4B<>ZC zUs#T}_%RoL!MwS_OVa!6tqJcVxE)tgY=`)Tqu$tmSU-;NoLS(60dLOR%J%A>xqfMp zGw@FaYQp4%T=FoFD?O6O+lw+fVh|)mtELDIpeFOj4t2*!2+HAq7V_$dmr5xts9*{V z*YlnFhyn4Eb0R)m(>J%^$^6%dffJ>Y&lTxuZwk4*(u+lr5rdEGPZ{;s$&xx{e;vhd z=-%?p#cXI;p)8OGytl7Th-8k^OvPGzz6phy|6X*m$c{CS@~>aM{Rm&A;^|+G%{+tdRu$|~!IznZjjZ1P^{OmSlp1aS-Tk}J=3Jhi&zpsjOckuN z;M~%TY){O?5DNZ@_M(gxpEZW`53=78s7kcuPCP>9AFG-IPxGgVH9<1S;4d{I|_$c)$XilhDS@3;YYZqUuF>+cKGEs zfMhye?eo5Aq3u@L5Kvfj2j}FhOW!`*{r+oY+r#=(vIU~SP4=g(c+O{mlF9hqFS@JP zbrs(mt-Lnbxz^eLNZ!bU_7c*Xty_guo}ZL({QM1jF{E|M{PM#1ZME)2V#Qe;*=s%j zCRkM{|6aZH@n#=c)`@B?ODIB{h z6ykbxX6sIRWPb0*lcTrs+q$ji1*HULtAxC5{|d?~Qf1SivqC&*(6l78AYKQ_;&g{; zLtz4J#anmo)}MU-FPo`IYsk$5-SLGVv=2&&Oy)`Bul^IcH`(YL`X_%prvB7%#-vVf zKC7tQk_9?uz4hLpaN~>6Q;3K;w=l}~S)BAGC};GGw|2}O#k=She7U{%^;qA#g$boI zMeCFItyE7k8tgz(-yTn_Kl$T>dT}+!hbme5*tD6g1FOe2gJr8??#!Jb`m`I4K8+s~ zm|Z%JC+Q}>67_bmC?-4qh0}5$4Ljf+^o7>;SXuE0eOgbBXSJPi>-~G(2%Qjss#9+K z;9vOnpBFc8t+wW0eT5iMd9@l-Y7Y+O5!ioeqJTHv~291 zYUL{EF3wNN>OO*w?4sWjhQ%0@ztmsh)XQqq1J~L|Yd$<`LOXh2+vR z^*CZ!nt}`J_4YL~v*2WMQ{Pb5ec0GRvrR4J~HR1A8m$>k~o#p)(<#!;b(&kHJqqw*9@WGw3q5Q~zl>A8ijzrm8;pOIvTL!g{%9k8zKAEae~#1= zo~!z%98q*`b|?+)(3y} z3r9#XhIciXa%GTzRvxNnyndq^oZeUdL1!l_E5BGFs9@)G0;do`FkV;Socpmxw$igk zYYD54oesEtrROJUw_YOTFNF6$1FurGFH&W(&%gbWo+S0E&s%o6bLVF;!21!7-P`F) zz=g+YkS8IscwKo{^eQ;V7n6FH&q-Q_$6p&uKQ1}?#4#jXzvQYV`R!_k5WH34nmBl3 zw((f$g(s;~D*nG$lEe)bxdt0tr}-cMc7u%I=T9x!W4atB*Cu48thDdfOI!41V>@E| zM2;159g=*1Ush4~%(%s#_?te~_W4!%cdb;L(<7B50U5|rtL1+&T2=7xm_M82QKd!F zU020CpC}k~bzeRHz@zTTW9hZO599KuH!bk{j$9vVj(xG)_#CC z**`;T|FsnPswPA=a3Q*}e41u!|3|i}?sUt~=ePV_eC>2kf#w_1B@ z&hByMHvQMCqUz_PDaUs-O>~jQ3p0~0zckTLVyE62wxxBv>KR9Rxr`mWhra2=8}_cO zPOR>YMRIs)++@GaU~SyzDfLIgUAZmgTPdTi*)$)-dRh8g6t5N1YRM^uHM@fG<8J{Q zRkA)}4zJraIcdFHKQaFzKd`3!r4A>bNpKW@Nj6%uqYGbO()*)!|On)xNO*y?zf6tX7vvFAAGmUk|n(xEN?G zeR-XX(`hbaOEXuoJYb|Sa&iRu)QHDOOW4gnd}+Ecg2ZFhUwi7}=?aFbDL&6B$CZuG zbjRVm(b0^Th==JVfBYZKE2vO3-AkX|L>9IBk{vh|E=f)9OS?StE$8xB-6-E)w(n0J z#hs5@m!(3Z8)rwa;668eyq$u{M$E9ul|`N}Pj)zEU0|5P!*AD0P8isDSi) z;zs+JC}+CxtzDLv^ge2*J5i3CpCd3H^?kd2etZ|3qFK54qWGU)6~B0+*UQJAsTd(P5Xbnbh647N#@HN&@k! zbD#HC-#CBT-3vTWQ)d^gTFPe^b7-LXKhYAEjNflUXVv1n%xMdnFSKgA!(D);yHq-SBx z_+${jk&yBCxQq1Mu&mh3~i zMbGc4TpWBZQ+>Qd=GJwrPYOk*&e$@=x|iy)cjDB_AGOc6v2*ho*rQx_OII$vxrjC% zS~_g?p-GZ8A*AxEs*(K9;4lepoBU%EbEo`5xdgNb!t-C<>;8ByS;qDw@I-$tz1_a; zo8*5w^{!5pEMCyQJb#pXZRfABHeaVy?z4(NBKHku{%Za#baI6gufXPqRQWjnH`>IbiCyz9)8sMXu3tKs@5&os@e2ysFIZ=%qp{HTIM4t`%-v@SC6b@leG%iD#}o| zSp3Yq%~%$%DF40SQb&JYm)R;WLqp9EhQ2F{e=xRI;}AD+E0V=n22nZpk4D0KLO-G=m93==9pVxGAZSrd`B8{6X4j7lHUtqB^l)_|s)||g? zI)!f^utZKN-~>E1tcUa&$-Fh@>~dH@!$Q_`Yo2tK_48)nVNG*}t{?kPy0c#(H01?oSf7 zq&3GP@OTN!$hYKFl#=nnpyjF=(rb!+@WItL{1Ra$A{`fy)7gGc_5(v-%RP@YXFFBP zB9UP;q-3y|^z`1C23)y!V*j6owF4=cs?)VN@j9c*xVu-=evKX}d59ioD~UgKmDNbm z_-@!r0?tUWzjA9%swLB>hqn65+)H$SMOk)!q?^J$-zV~eZ|h6aXoIuz@?m_ZqURHS zNkk6|>s|Ep3we@qZQQ^CFCF0vKk8~_j3b@y&HZjx_DC8d^0IiOJ}zQ5Nu8joWmqN3 z%f9y67pJSRcuP!i;Xh${zeXc3si(!kbg4RRF+xDVR7;_qrp>%)@rKKzx0U;iJxxZ7 z=R#hk-8~yfzE;IzUANJz1~%Jl&$Rprh8&p{Bzcw z9}A-e?eAP9J`MLR>kdA@R~y|ZU7>coM2fU~G(~gpg8;bRA5o#5lpM|P@%JC+u(NY`xbORV zU$6K3x*uA3y(QPlN8^G&_Pi8~noWC6wxwy>`J7Hao^%c*=;_}dW@D_%8cF0i)qK(y z3?dp=W-wKix|eB0m+#6&q(H?p9<-or>K_s(oYUM{t_p?%E9)<j4pd- zNu#Rc9ZV26S{vU+6HaBI=%kDH^Q-&-ltSz76kmVSj?Fx|ZS_9;|tA zAC8$L#~?7vabm6W!YcvPSmpl2?;t~Ix!}~#awM>cM>^_Z$s?W98q9!L9ivE9(u)!e zNC`?U9i?^edHkI14>SKrj+8ecOyDeWnC?TH1?D`#1{pVu065Iz6_F!&5VSHat+CzX zy8YB>c`K|(ff}RX=pp~q`g9ii$2hNh4-`LksGyL#U&C~X+^o(>$j>@sOw z=Xs}!OD~Nx6Z6WbyQ2|T!w61p+ha9y{9^3=OL{zTK^(M&cwC=-SFTlNg&WF_+H6tQ zZKZ?y~@QV<{CPVzJK=vd>d_!VZ zEJwVOATt?S(;eRyP0SR(9Cbr-fWtNChTH-U%N;c84+4amVKYeG_mRhj@0*;PQ0=4_ z=z8PI=jhcwnIKm5v#e$Y9@$F@03T{Y~6rHjP&#tiv6Msnzr;E9jj8`dvRL!@ZM$~@XQ&Q5gu6N0pf)3mxEt})4F8V?4 z$M>n=EQg5|pg8rUh%Th~x>LWEjL?T6+0n%vGUAgaFOFE%iQn?TnWMpqcE}pmid;tL zT)nPuV|=-DG$d=oxSb<@VcxHA5>U()8flCk5qLyvON4U(S3!i7?>7f|oSGfolAh#1KU%-3A&?*;AjBy!XpY4!32e07 zfm~5ypsg!CjdmKkh@Z~_K7XmYR5Tsc#tvCQ&x^0HLlcb%J6#HMjl$=|XLZ-WL^m>& zhU+gi&{Hrg-#)3r2l4)9DA_{?G?(@ZQ0fSge$Y{#G=7 z|A^F1E|+-}*dZWqGjrCY&V;^XWpuTlKiPdbBqI5-l;MWHx~CzY1)R4&(JyG6fYm=( zsZ2eI)bG-%jy|EnMhrY-KS`VPluX70 zCB1=tHn?Pe=Y5by?YPRz@YmE6sag`~X8rnUm+;N*X`te-ig>S4RHYR`1k9h$6ki2} z=cQ{am@X&i3o-lXx3#o2RCMjH)MrE!nUHGxBM;CNOv4pv@~9{0T+xGxE5K z4(lKT4?V@v0)zvbLmr2dS>nu(kD<2A1ojU$c-5$}q^#<<3TNeqddW}`6B9Q_8kCkz z!1p2-4RyOp|rn zpc1f>$fL~S4v2*!$!r^306c2C}KhWLxCkz8uhH)hbKTA9mf-@iHuXk79#I2mTSG`6} zJ@_E@a7$&rNqy3Wcd$&YUw%U!$xb8Ch|XVsYgID&LN@eQu{An$)TMw>yauczy^Ks+iBhPX~z&HYM@y< zpV(FvR7sTDEvv8%A%heJUQi={bn&k?J#K6$2UCH=2j;2_lnm|>jqWWH>bGf1aKST> zw|fiP_Tu8HJ09aAjNOY>80ELP&p&J!yG!G6Z^n?j-bGbkY+M50Ggy{3?{2qxpwqF; zM`op-4MI;O;XH{ED4iAYNC2`7G$99Tyh?uRj6GPqKQWOWbrM{XQ;xFc4oM13&S}4f zRh|%B_Zcrj2%~v1U^NxFDd+1dQ!-g+T|D3zmnQb*M~CUH`5O!tb`#;X1#MpalIJnY zqgI1YJUiY;bQ$T|P?>8e+x}0om9&yqk={QN*OOKCWM>MI@fiIEkMN5~MYjdoWzOY2 z^|noR2G#rB$5_z~Z-k)P+geSq64OGYV?p`du?G;4BcbpGS3kf~Y9W&P@(rAEAE3h* zmgq+e;|2~Eo^)pSB?s=hLn&gFSdlueW!olVF8RrWucQ&%DIdzFUfj+XliOJjZG3j# zB|6>yY@7ey38e#P|HCWJbthe9oBi8UbDs@*Q9=w; z#0ZIH_avN;0GxVwXEdVAKzxC!A7{aI^*bk%`(`EuMyuw89qo&GH4DSQSyj*99y<|Q zF3E`cjz>1)3$bo@xUtN2=lf;d`c0U;vhMUGoRV+dbm83y=^qM?-(BP>@ef>KGvmeQ zTtG*9`F_HV)nvTUH_<{RdCrrnq~`Q8I$=sbXX$xPY}m znLQDh&tjvdNAS;DN3?M%D#gy3#dy^9IYCao<9)IB!7iou?g>I+A}>08YQenCvQp*_0(1S{djOT8J{mEq#9OR z`0(c&KKyO@#lYP45O&cwxpRB?2Ygfgvkc7R?zwGcuQtv>JlLyulqI;<1Zt3>afbxd z4xY3{j?%8_e27lLewG%!roUBxQl_r=S|+_ly*DX!4ZtAlt*zQ!BiWcSA)Ho`xlr{+ zF;Pr3nfo+rs)s$m=6MQSNP%X4#yjrkgRuu6zQo+xuSsc!X4O~sx-?kZDC<~Dl*_fY zwllNqS3GoS&71$`?+6r~*dOJmV8=}XjAk}lxsvg|( zugYbt{&)aCI9pR&0KFuZ3_UN|u4%_-H*NcjRvy$Pp(||q&+aBZWoFl~DdJxS6GNul zABb1Y0lQ3cza4ao{*be$e(fr(GR zbtNP;u0Eb@EFkO5e&;c24+pJQM%EThug@csW3=z4mG00$Y^_Tyo~Ngp0*%JaZE?=b zl4bRh8Tn*0UAfY!2c&oPhC5_B8O?I>y&k%2{fTy3aQjy?&NDx@+YLQxT`~-B>e|Fe z$qwj!j5e<|6d!_b3xQS$tYxtCKa7`khO2jV*Q#{`?-=46-BSYTeRuXfkpfAN^A^FL zRx&FK*~T;QfgN`|CmKzk{iHo7K{ih4C9_crqGDLbx>=T(Ek^J2I_0O{lr5$qt&D?Crj&YAmWscb64s-JEkf6_u|y zzqmk@OJ#S5L_{}MKk=}0w)RiYENj;q=yJ+*|7?J(EQ@NPX4jIkcgbwY{yIGG_&d|I zUmI;FvOgjjOuP#TwYj^qSQk|UW0)5F%~h_6IEr>3Gj-eM`y_6ssy$Amz=u!1g8)3e za@TUmV%h!LtgCh#0L_;z(G0vr%%BRQ*ng!JeYrNsFbAW`jjvBH2EWbnVC9DicN(%x z=3lsTw$Ey}{S>L^k|E`qh*?n|>$0Lg&JmS(C<>SEZyFqU=mgyV;$63We;LxDgWpFqIh21hTr}+Daho8$gij^+-NiP?8@A;{^%{7KxgEv#wkRenH^sD z?KSO-Yk2o)07lgJXyT$7v#3pq6S2SGKLkG`I9S#6dgwA zOjh{(?xQGyiB2nqn zHAV}o_f7(ea%`Ljt|GoUFE1E}w~ck_@ssrzrib!ib5>K^I0L0@ka~3;Uuplx5Fqr) zHa$%Gb5#px7ot(1!hqStWyavs!Yy#_p#Lw?8vSr9yEwi6@#e1k`8|QbAIwB1A5i+2 zENrw*eARh#-#O#GKd?Nrho~UCH7UW(4g!er6MAgUNZ9?K75=xQsKPjmTDKR(E8V15 zdZ9>obt?@X)AwUOa7GBCPe%WIBLMW4Ff!|}GdOEk;DRIr0H+eZ4e>t5Zp&Dwe> zzPr$*wb+ZupaZa=g2eW<_Rsa1eeoKii^)NR$T+MNGd80(*D+{$3+tY<4ih(Aj zY`)r@s8Q{|a6ucTo&ga9-C|4;6nUcLUwLYi&W;O9MGiXc$g~=AZ*jV2YKt5VBv|1trBBtS8qe~w1JSTpl*OFTozFgh?dT3KPL^!)m6BV5=M2I_wV(I9Q83_)S8B$ zvvCiz7#$__@-WxXVJQzgD*%#Gxqg9bA3MFUYt}~$Qqrk8wk?GnKl<^2HL~^&ekH6$ zjbKK}8k;M`EVUgrR8(Kb57#*YkzpP?E(HItHhXu8d|ZS`z4$Sdt&tiV?sAPB2|pbj z1U)tGfPr=ip*_KOLP~0tYM>F$%UqGSgo&hKxxMIaT&5*t+_df63<2R$BCEBnHqn&5 zzVNV&i&2jk=Tt`|9bLFI^4N_J!JbL`nLN$r=MpI$J~LDemo8$r-mBQei8L-*);+i* zmYA->>i$9?qtqz1il)ntjrQ#V*eI;}1#Fl4 zdCEn{tJC{ zATMO+*%^cDp1s%|N10LwUij@ar*6{erPZDYt+@tfxoGEb zK0nIq7RGXgclA{5wBD*?juj7WRHa7hG`7>@^V|0Rs<})*#rId!CE_B~aIaR7Xa~U< z))Hk+#M;p9Mo;^V(U>vSf!IJSwj-xh)oq`U+2gnV)y+5Jms*x*^+fKND&I z^i?)>;)3RK}n1EQVUF~|{G$lYK!ad@apm8a_p z_;Kes3qHE1`>7VewIxV(Keo{>csaI(P@i@Z`}2>1(16HR2c2OUau$Te4_M9cSCHYP5K^=XHEJ5{aoQ`7}khhDyiT4Gfs*d%ZV5}>|OTA zz+ChW`S-R*7>|)$0-jBp$mTL*`SP)mgt6mw26hdHdvN7CpCd1y&^k73>Wi4_rRsvI zxpqp3hn;W{6oWFhKBUCnOH6pq7K*RRKmFda_G627_ps15`VtiK#x01N>yvfEf3*AR z_I!O1ZKqMzJrBap7i@dC|~I@JlfDCuqrBVddL=X~U1scxe!ggdZh+P$?MlvnMS zZ^ImdE5)!$wtP+NC+87G?S*AC_mWG|k40+?daiI4$2(T*T z>we}bSVev#wE+#en9ZJ)MWlE8q0?B9yD~XAU(^3X{_qFw$Piig?}=B_&-^8*P-{-Y z*`cyQ$F^t(mwZOOKUM~$?K%40_Hx?@y^IE;o!*~TiMYc_`ql{umfgs7ecjN&uwE9OGMpU$67F?`C31M$kw{IP6DWtS<$;kCN~e3TGemh8#Xk><3yzhxF}uUykW?f`G3M|lkwfOtM6L&Zz8X|Xi5(KDp%79zg>xsEv zK;~F;X7YYv`Ui*p({(1*%l`XEeUpnT_wzAo?b#u3fD!_h4_$(kmy|>q{*(Bo(1MFi zp-pCd9{B1J+D>Hy(7u;O6c}xrlm8$Ax*w}9A2|lU3A%Bm>d-ZPG=2HtVnT%mp97y# z?Xpje?qyVdV^>F%r#rJEz9`5H>}n1;MsPN zc(Ib{g#BlPz3>feM2|*H;J$|s1zcFre&chu^a}AXaTyr->PJ?$S})gN?i}Knk-a=a zf?(E4Rr^x|M#VcSgjA&<%>{z9tFNMc+diL{W;ya+rl01vtgARzghR@cdz5j4nFf^X z>ifiYr{$4)%*IGo-niOm{8KscU*k@?qPx3JD~FlUJTw?Yt7DHj@t3wqPTH)mwqKa9 z;QZ=Z4Pa9AcZZe;2$YGr!0thd_-s;fW?4bgsNZmP&6B{pN`v-wS%U*gphDrYF#SjLN~zU~hF#4;7%n}0+zYKnXv(N%Q5&z4ohwH#yRgAs zMSR|A^aT#xoLodE}siH{9r7(pQzulX3vki^Q6ut8A zH7r)4Z1u2psVj?|*G$1g~we z*-1I*ZxrngIobs<&YagDk&1c(8Nu&;+hL$^>{((B-j=l;gd*g(li8Nl2SF_`1O;k# zHAfG>Po0(T90*&W3F8D>7(;Q?XgG%<{Ss`(XeU@;nSG=4$}=Em*AY^p z!b645X_p_>ttSrOT2tCaS$_g)7_SOfJRo!~lEvY;ZZcui8;j(w(|@$}hA9|jj8>Q# zckqFzYkSQYk!sbXh=f~fTLz6gqmkILh5wX6Zk}rp^fM73R<`;EC59+{9j7p?K_(;g zcU(F3uQN0)RK&R}mm2a}(q?kb*6gyK51YOnq6K_LJdf74jIkAF@grwX1ulc?7>8xy z`>Yr+nlkeq*Gi{gXm!DMi-6s{zuheMFWi`sdNPS*2ypI^Jldf&NB|8M6bK_2x(-qO zlDX6d9CF1?Y6#AnbQ4Z9Q9u+*^11YvejCJS-N9y^;gbzZHtVH)a(M(&`s3TBb4w8-Jt=&7oD|3fpvB$0eGq&vO*jFW zId1u9D*1sA)B=C2feVZJsBEIa$mhkraSzV3^U`|tk>{dj$N8G%*bnI^RB-W$4Rf^8 z7izjir<)W=81JDm`l^-3D<1;Kn0CYM47fFQ-;4&xvxc8F`IXbxy_5QX3`$;icC(gH4 z&f}UnThCGQIY5~SsV;Ts3c6}u6t!iCRm1ZI=+sO5xacqrgM?rpvgV4G2la2d zGJ&IA49Pnd)A;oY!fb=!_D~B*OlGV?{V0y;)o&xUU`$1{#c; zv-~c2Xa*cKiw9u3#n-5i#HG2jN4jfwfrT}|8vd1b_QRLtw1l4Z;KZRuiv&`+8NtpR zq>Hlp3xPkJXuYuv9&TI=TdrBO6m=Bw8Fby%J@KQ0JBhq!#EP$6-hzv7t@lQzA_Hh5 z!FUCs&Ug){-#)O2;^0Y}jYm5d2KbX15!MRnPyo8OTvFK1W|-QnJt7^c+t0tsb>7kD zucBKtZ_)z{Fu+RdX*_vVaCNVrnjYKM#L)F#b6f>D{P$UbPD+Z89GwXcwFv*45P1)6 zLXfhdjk}GKVgtvyJmkfu_DqSf)$>)|0$Q-Dd4|q(eW+g5N(z~kE?wiFKp(j!*?%Do zT3B_lQyT?xDBTC}O{9aVI;@|oP$O(J={qVVNtO^J-B9X(zE>l;a!N&P*w>=7=V-Bd zd7sEHVRKFlpiS6wD&QZP&m$MBS>YfA7eXvm!p>vQX*w1XC9d8twN$V|d_;ltp9Wo@ zh|5V5Xfv|%LmErnJ{;}rvPJ~mR~3;0dV+~okemH4IW(7X2QHjtDajWEr_7~}3Ntp$ z-=X_0c=6Td<9aK*D-&F$f=v}D7&B+Qz#1L(13K#k)<_QI*|V30OD*|yB&%!ar{Fq4 zsKxaFer(=Mkp!HbXn_LIR9*>)uXswF7NvLRGkcUxXbu%b*s5S!m!-39F_G)j7#|Hj z%R7_-oY$tojUGuo1Bo(K)c1s^BCUO36eTg0G`2ue#uGXHTZM-l0Vb~b*DU2&xeAd3 z9}+jI7S!x;pA`sNP{GLA zFJUQ1#*NuW6fQ(;z0W2b1f?N9x%k>EUeM-}A055HcI5w)xX2CpWM?rvi)q$*~?fIr{o2&Xrn6W`C z#Sf0BgkC|5L6$W4P)cmh!1)W;nB7ZPxGUfZPXZZImo*JgE`rjW6{BIX0xaTz4O+I) z)9s{Lz7X+}U<)92ai&CpobJlo(*flcJKY5WWP5Mukh+a)VO{9xD|w(mxH7`oD#nr` zmkkx=T04LF=V*R+2W=*=!O#{17v^XRJSr%hik*iZsmrdo#^MuN*ry!>_LGP6uUIo8 zwHmJiV(Oy_t=+jvKItE&OF}=&9Huwt!@VlQX8r`k2T@ZYp*8_jbc?@o=sWm-nnpMnDeh4J zlKZdSys9`#cSq9EQxyFSpD)m;GvbljLea7FhBmD0WEyezpBy5G^KI1xzxq&4Aw5Jc z>gY1D2qY;#IEToY+&8XN+(}PwIHW=YFY9X9=Hj#Le~D%<1vYf3piNkpA?u=lL+9VA zqqF&>eLvXzSq$mXh{8&!t;X=cbHWpF7 z7-i6XmkA>vbJBJn1)N7#I&e|6GcV*mdP%y;28d;=Zql;r*aS$!Wwz)?sZcQcfK1MW zBawz$nYHm9SiCb+9(h0Z^7=~&tOC(c4}CB|Ea=|q(aEJo2)JFbW zziBclh;Qvu{mM7R1?`N#5egJH*_Lya-bRw7_BIU>8lcRKCyeHeh=Se(xr5+L!6bT8 zrZADQ+!xOOg%VM?d&vyvK-sigR5@RLoxb>?RHAfA8suXY@{df#lLFbnA9^%MXMEA! zOUa-U=_a2F-#?Zdk+n+={{t}-EcF1;Z_+ADx0vhV#Yz{%5P}ypt~5haW$|I41H~)C zkq!p)+!2pZ!U4>1r#2D`JCO6%N0Y6$PEje21X$Fj@n9jNfuN8B>O~4f!Q>4V3|uCc z;x`!Se694%0657kH-U_Di~vI#-*aXoR(6d;muOaAwK}?&S$hxY!0~<(`BWwDcEY)^ zQs>DaZt&Yab+ljV*)6o$Krn>v%w?JapZcO;Cl@Duc@s-nr~f>o^Q#DvsswAHMA_lz zu}D!;kgO>3L=RsVWo{ydKVay%)pIin$#!(p?D~r@E*ll8B~JBBA2KZvmgr0DwF_== z-oUufv(co_)|CI`>viZ1`k564J`4M2@})9&y01$IUk_s}4H~Sf*m(c(w(-vy9`M`M z%Bu+MZm=O*y|mkat@AX7Gx{J=1K_;TmUo7v7S%w+H%_x}tH!(ZJg5)_b33&CpSglY zRsf;ZQ(+%ji<5lfJ+p{s7t*SIg#7ZU|Mz64h4a=FBnhTJ>nOk*q2uvst+~+1-!IH&gnW>^G zhLmYKtQ~DAQ92F};L=-9UW8%C-el3T>o2;>0NuwhN!57)a={7CT>YMI$g-6CdiI`t z`;SxsVC>))Ndzu^SPTO}z~nuV#^X%YY+V}4HB8{l9eMya&0WaBY0^%zVjT3Uh+t5- z^q>+oM!m54Cj46BiY>@(_XRJU29=i}fC&cAW?jQZOxi305cRd{KDzU(Vd!w@pI3yS zT#%bUH6>6{qSVn(Fquoxb41J#H89d(H{V&1>6)Po%rbc9P(X0XtvdW(InCo=Y`4ki z3uNC=L~W7zlgsNVOHqT-fYTl2-w8dg`0;{G^{AYIT}Sy7IadBK>Z(>spZ^Ykh`L&t z@L4Wn+~EA4v)AYm?CcQbFMkGC7_wL?ZEGm_FlB2wJqfe=egKlz(?q|_v9dyCyOA)e zA~MsgTOCeF=8|K={$X!s5@1Cle70M(K2OW!9)jG?su;k@J^vxlH`Z?s^Q)C12Ny3h z8sA^A#U=!LuJt;Q5IR4n1POcgQ1-YX>bOsrHGuRvx-AMAirq=7IH|0tleLFNHBG;~ zuunukvY{uXY4QW+Y+F=9I3#0hl|GZU*?b$*4oNwyfNO34D9L^Ubny> zES3s{Z<7}*`7040?byQh;wfxH>vDle_lG}>NSzf#Fy3pyu0AT00STWO*%MyD#bdTW zRUv*zM)oDGGI5~Sc*)`2ZFIaX%`g*YJg)a&Cx{+<=M{OJ5FZKz=MMs2^;@XYP6dw9 zB;5t%SP&=Nr(T({qfNciSppdN3<(PI`LO!ws6fX#gB!;1y0^UbgnccTO?c}+UD~+M zk`fKxMUtL02)nX&P&bzH+_t-b=V+kF(F5tt4NMX(9O)0T6k#5rDMWrfN7IPtpN@M6 znRE`(oaA5m(;ETMYoEAUtV`wH6ptYT>6rV3m8gVJ;}? zLrQwV>Ah=kj^Gs~G#9~62!MR%hwobS$IOKD9xmEE+p~$WP2OZdE3Lm`jr^+GJOxZD zSjT}5LyjH@SlFIBtCEAmU;L^ArM#x9`FGc_v`g|rNZ}5K^s~yMq~z3=<8o)O zEIkSI65%>NU&hmQSy|K{mC6z6@VCD$O_D?<%7^J0&hxnuGVBpJ@lt$}$(}3e^zlrAc<~+VQ8ChF-5gQ#q z2Ts;L7KH0$!Dzyk4Kv5fQ%jV_q1Db)UJrq?e9wcd1k1kNfWOUicpVNRl5xL!d1E2n zbNk~?HrV7PZ7|;*FfSlyDn0myl-F%R2yB8LkeNVO(gEPJr984lbj)lq+#yB!vN>{n zlznwQ3D6NV*r$^278%rdHxGc%w3*EBR4A-l=LCJ8 zHng609#{`9+qgr3axswew;;d? zvZcXOq^&}ODBR-+|LWi8U8ba-6zPC*Xuii~3nc_(C`2fshrec6r8!b&|ywvi}W@XM8+5~?@033zfW z6B`fF_e#$;K=;>Uc7UMGyp+vY&?;tR&eUPkxqKqAZ^87yq_IoE*E z_*2RW|Ke_Gxwdrf2Gqhx{4q=qIl6gV8o*u43KzwY@c^lEm9=m%QrskLdHlSN7As|0 zKnVov)-Y4I*2G@BW|)AejmObb4%|BS%Cta%_nLEM>2&>to_bn_}X&n5(jo7iibFN8twc z`mDufd0+&#g$(>-l>db?oOV5CG4h~jcV&uNl*MHt8^&Y5 z^t^iLZ^Z5U&~$pEsjng^v5pa&L~>~A3nrUgFy-F=ye#7hC}`fX2PCs7%{e2W)T?e% zVAN&!81NCU|%A$v$&{cyVLH>+4c^kfm;WC_%(vYH^9+?VA17>W*tG-7@Wd|GUkJd=) z2&icQs(?60i`1+pnX?J^r*B(1>YEKpQDMa^IC=mKB))1EFve8P4kS(Mx;4SMks!B} zzrLoy@9$RK57AjDL}kp1KXweE!-}V!oHY2px7b@}`3Hfhu*_)zB5=Vpd4Z@4f*U|7 z7J|s4Dr~Q4FnW^v10F1$_jj#86~)_I%|sGr&SvATr;FQCLG~Mo*(4q~XHec2j`aNV zwvFGo#Jws%KdBw|D}wGSg%EeQ;)r>gF`gHk;KIvUna&2TN|$rZeG_@yrB!wqoU zdKx8C4e1JK{s~{jJ}(UX)$YGKa(=z?$a1a-KhGCZg1w6J^S{wnb~!sgXSiwGy;qYW zjW#>QHG;;B$A53H&U|9WhOdWkU^yoaI`{+cz&oDNcJP0H3^TbF@F`{}t=@0j_6tW( zgt0;98en_S%SA{F1>4)O_6A&e;iFZ7g>-GIps4e2{{#&<6TD>vd~Ky^P`oZDvs7`> zQj3;+zw517)x?1SP|+XDavBuO@%|2^NH}ZcQ{HNDeJC`Zc;2D<{TH`-jrBb^$6?jg z-M+FX!)1){YiR+X*aXdSEY-frS`la$Ox{MZTV!E;H#WThaz%&K7Z3H4NR4UzUsxCZ z_4}`MX(uSOi^zU9Fn)2xL~g4}ObO}_mK90}?B^-K)$n8GiC~$3nVUsu!3oRBY|=j0 zh|mzT=SCUxZFg7!;z;GPevTLaKq5SK+n`jA-soy+BWoHG{P4*`G*A`2j_(|;+vcf zu4QY~w+^Uy2dUeqg@5fWut58%XB}wFmjr(yN9p5x=-Jh9l{IUsw1`ez}

qdN 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

bn*Ds4_=~jd|5$lZ32T) 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 diff --git a/Microsoft.Windows.CppWinRT.2.0.210806.1/bin/cppwinrt.exe b/Microsoft.Windows.CppWinRT.2.0.210806.1/bin/cppwinrt.exe deleted file mode 100644 index a78f34b05a4c98b0da925442711c2af8f64ca119..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1204088 zcmeFaeRx#Wxi-F&3}L{588m9tSfWOYf*1icI;a7e1eJjakOZp;TBR|yN@WI72@X!C zX0zNjZP9uvJ;j#xa4cg!;@hclczp6+1Ned z$-)21iEPij_mi@RxeUE?qhxm^E^t10hjqi6K$bS5< z>U;d-KUUwy<4@rG`ES;LuL0lNw`D&56ux(VlKH(8@ICOr#K)ge-$%cgk@y6U$hA}jMim^8BapJOg!4xAGKdP>pGJFmJr^I}X^>1eI)(t^C99)X=5H60D zM3MF{-!N9syz7>mg1}7v^}qwiegnQ&5C^G$#X!hRUCh{dA?|lfF^n_uy&KPfbD@D==O z@kkF^+K*-*WV7e6*;*7vv(xaEY?k*5zL9En+8#DLht1xQX!d7p_HMh`XR&VgR~3GO z0x!RpZNwY}4Sc);kFVQbomqACV?1d*jM44o{bE(kwg1@}tntxbaQ{`_pQg%JwedPn zT|YZ*2qj))iFbK7TbJnO^`{+dy*>S3xfqD_4n+n$72>eDyuev0?sb?O3vxt>Lo9X` zXEl3cp_@f!c&>A1=u4u)G0$97;PD>0t3t%Y#sbguX0fQiwKRUQcb}Nxp5I})E|r%a z$TsjSFVf6)x|my3~57d;S|@f;<@|)KmA?rd2nJ|6aL&)vPA#e zu^5b_+G0;U)GI1-%uu&H>7{I=Sx!~egD$b&X;brwmw3!d0N7HU8&d)!R-#z0^s|z`3$;)Moy1MUEOwa1&NZ=O zS4M`JEqra2@lcOBJ|5~eG4xVADRrT{qx&<^omi5KPG-kV6!CY7c}d)?!ZUxnYic1*|0=c>#XKL!H9k6c2TX@)r4rw$!+TPI12zK=qFohs2d=*8Ox- zWH5us!q9^|MW{y%h3^6CE@6uuk!DXo{(c_^f)1O|p*)0N!`k1J-u}|fn;cI*`Q*gl zZNk?hE;fBcCT7|Ic5Gx`gn1CU$HrG1LwF*bT#QXbz z3IB(;n3FgU*MaW+1G8V2ucJ$>0P)WC`y7V+>*C?$-##XN|9BXEFFZDVoBmF*%mo@J zG59*fMDI1u&`fcS!+VV@bWV(b91EuTDVUswyRyk%4{O}7`+96j9lla*DifE9YnbYy0@HfmC&6_`^QgN3@TzxdM@2u&~k*1@Op{aMTTUsWUf%LI3 zK_w-kyrXX}s9pFv#o7hdhGOs9g~1tEC|oW?g<=y)RP+#ZGuvG3Fe{vqQirSGWr1=I z1uEo;&jN~2oA7szN3LM)R5Nm8AgdWG!%Mf)s5GK>_Btr+_t?P{eyXaoFcBx15FrJio5_vl%!E^YL7kMu;=n?a= zWX$MlRChnq-0v2d?q{0%o$hBc`?K6n^G8HFgYzRY!yWxE03a?AhpID|$vjX)z>40$ zZVv|JKb`{~E&j6RIlQ{L2VX<^_=QzPKurH7iHh%lm!wr}IabBJy5byEw4%48(SV%M zngMEXSr&h0HOKdGzyZ-55K&&m*LtjlF8S`(%;D?kdcC-h09uXZs+KurhGi{46`2cA z^rgLSjmuADq@M&XYqUE^QaN!?|}Tyr13`8ic}N71LsOML7pVvS%NBQC4QA& zf&xW0ql7)b#gmi5ar3|~JWS5-VEXie{6fwOGqhJeG8B(jXM&o+4Fcle8utml9$Ejq zX4W!wQ_A~r6Wo@Qv-TN`-q+#vb-ANoh3$Z4g69$o4oT?*Q^AwSriD0O-~w3n;lmv~yW9Uoi`%fFLp^sOD; z(Qe(ucs9|HY~u4e+LA1l=;$SOwAb#a|J&$jJUR;BUud{%n=l#TpxpCI482?d4>8nk z`dXG_61`8>yI?0j~jS$Fhl*73DOhO*pIaI2BH+4zFO4eT02{^M8ns6*$Bz+hck zsW%d(J{N;eB}-vo?Zn{YXrpQ?K8V5NIk1_K|06ouraQuj4S7eRiO`}ErFQ62R3GHR zWT}xr?@B9mW};N^yw92Tqd=@84tMk;pe=m=g@#q$WBIoSzaks5C^?kA6Z5t0X4}5@ zlL3L{mk;GF=qTmGH$_y388nmo255fF#uuOY-l z`PS&GL7(t%6Z@vW6#3K9%}11Y$`MPCMw-u>zE6uM_k(*eNsGf*oub-e zO|>;oCD31srcg4qierWZc`wB(ru8kCB}xWQi1`LcybzZkqD0^2qbeGJAX)L$V^wsa zM4w|+#az3hBE~;8*s!S{c?&(}v*H0<4+nLcU2!5o-8rlxZ=vEGR{Zv;ip6$C#X#;% zR-Awu3-PG`hT;7L(u)@lE53ro&mUfVb$anB$>NjIdKDf4kyOhqp9JBp#SIX34`}>2 z+)U8-Y0Vi%|GgqKKqd^8-q#4iNAcCq=jf@a4_`Uc{j^)$nB!jXlBn?1`K9-@ zb*EVKGt3f?XpQ`xR$g|U%hS35-o*anVYs!zCWPfy2Cn`$%t)zf$6GTP+AUg#>GRa5 z_UrLHpFW=AierpM_?@E6A@)UjvLX_4gT@(@onTo?0LOQvvI^W%|bSd^I0-KJlH zl?CJ{0=kSin9v^DP}lOe$l@KqbIQV?K@I&*WS|b3s?N9uy1N9`2%toQJOXC<0F+l! zk8FX^rGW1Oo09Tr{8DVSL%#jDcpRemyf`Rov8yVM`c)s|Bfj1v|0ag1J$8pyIiT#3 z57cKH{W(I70z7Z|HKwlzS|TvB(T3%JNdCc86C>9EY2i(?F&kTB(T(7|di905 z`mlJojAFh_Fb8ieeewopK+}yK+j=9C5jM7=J&f9$CE|d)YArjB}4IqdIbE+?_ zT77;QbR>Mp4=x_B6kFe3sA`t49e*wO+Z~X7T*Zq$(-*s@`|Cw{eO865%rk=v(_ zGx|@T?r$us#tPeN`s?NCS>u8GdT88PzO7i2ks9f-e4W5ghWjdCC#DBxAb1)LLd(B9 zeo@t|G9!M`E%>aSU2RA|6la=x(I$8FZ$NK&(;N`{Hq*BY^}xV1$lHK+6Hg;Uv)m8d z1|22RbkOo|iwwox^M~v%*uBQqHBno&eA^WM_6Fn` zP1GzJlx9(n(h%oK&BFaaIqwX!Hr)??fO~y&@u2|u3okwoknLEN0EChafMfxXJPioB zVBcMs<22aQQRPsmTCGrZ15tGmP<3Ww3RO>{fw52(To@Ue<9?t_LDxP8n&t##riPBf zAJB~hbcGtaQwUurEM3*k5~r zIm%fW^no$JtBQ!APDCb3nE_6Q-!U~Nv9U5bl7Y1aWhVBdv9eB;&)qt+=y?=0c zXyDR+*1+4~E*RcC-2n84y&KXd@n>x3*u$Hsh8Ix7Tg2gAh~cdSZR+8LuGe&42ZBtJ zdSs~3{lHJL79&j^V~nXVp!9Qqv{{3696)+VgG2_^ck0+6xfDnX6-WyR(oBH#66ipK z1UN!pi}{pV8uQW2#K@CNFfw$$`+*z<+iPRMc78zag1!&fGEfeUP6BM(G;EYweVdNP z<517JFrc3IpRQ2n?*zwpU*+%2Y7Ue^Op(?2qL5VOk{%#vXr0M*Im!d{Wi(f2H#aN6 zlA+4)C1chs*;fY+O_pi;sTZ}V^$))J6g^ETk(O}qeFTbuB(@!Vi>?}H$dAt*Z^-$) zx||u~^awpgP&a3Yu&RhUWJj-|rL3K(8%>QBUY0_PSRci^uMf35iI!C$%u3;I{t z7N2u&W+*=%Iw~eq?E<+}?Zij?>z+unOL_^gQjF$iCCW6iOhc;7$*D4qM45dovo}@d zg9noBj7yX`z%nhVGKW%SvJ+)qW103;nV+W0j8By5W|_`ZnFmv4oQX1jW|^K;nJ=fx zOh}X&WEq(%b7iW`#6+2t&9CuuTB^)(i84po&WEXXKG~ccyDL#0-N%rnz|)fpz4c!l%INZ zb@I{NJh)8~y@bA36=2C}sghHZC94=auUf(9+wdWOd%n_^G~tY(Hw2&HuZ5qAu!p9F ziwxLSO}Pl^?L^gpwV=QeTTtLcG{gwVhv*1auCXvBv-HAT=v6P@b*5dYh9;$MuV2As}^0j#G9 zrJp^M40}OA&WYq5&9$%o<_cW6eX+U)1(O@+s_Qn4ZgLbB<~6HN)hAkp#;Z9U0*o7nJ!yckK!Y0$8(MfDhKJ6OXJF&^MKS zEY>+@$EVMJmJesWy2d?qfnj`}e%ym{)Q>YqsK#B>^<>w;=5k?hgSP9ai46WYag}3w zbIjL4u%@@#;gEpkxDbjl)k_#q9j$mQ5C0Ur>?((76DLf63F83d$`(DmZk*+q)jxgx z3Kd!7o9FX72hdP`){cr`f;X!%)5UTqIsS3B6S2-dzz0ia^#386X9k2-y ze*hUC~*%_!g@4N^L;k=yTMDX~68MKRXs?RgmxS zE&!)iz5MiyVIGjg`g0-vZY?Ts%E#}8A&#ide77My(@#SD=d=<>V5y9};WSi;Je~V| zj=h}kNw=4s$8xD05$@{D_}vb9_dVIh8mzZZ;9S9y3NFTjEIbew%3V*wqJ_hWOWN}j zfaa(g0-mZJ)%2>`vnXE&sUy~ZQbWct+QE>a_Uxb4bga929Gaf4PXP=4=9v88h*{H% zXoOkQCb9)0Y~!s`r@6#IxK?bSj;L5btaKySW$eK)zwj^iV6DDj+_4=hWCk5457yZ? zV-G%LU&&c(v*Av@9bvi-#Q1#eUSDTuoHx`JoLZexft9foy{y3?J$Pn5!)hg_YDX*y zHun8c%$&Yt?I(S)becooMv_LlLVApdUy}YdHxnn3ON|O(IpJP|X$*2WqYO;l6_7o5fQmt*@Ov#U zaG8_M3Wu#nqWnJim0FQ6K)cPp%Nb_-135_!aTH`O7lOyYr8K1>12OQUa1g!erzDa{LwA-`CpT=_@ROAA1NbCWNCXck0#Zkk6Cr zAZ-R{aa12)#Q>GO6!&0_V1!fg$ivi^YFAYb5G2WO^drYp8U2~FUKH6k*0Hi@cDrnc z%RV8NlOQDe&(|nq|9R{mX*dq>3s0p$Aa$t|sXHEvlY)to(=<@IXg4PT)Q;_mp05|d zf_(8hGjtGAol;dmz@mxAp;^_ZRuyqFUx!2Yj^yprs!y+4p156^yzQ9vVt?jS83Ou^ zFw{s2R^5oP7{?lmO%I4KTmO8$za@@XKDZ|bg6I_-2;Q4P(iX&PHze(%LsS5y3Z==l z6fDk2O}7zTqTE>iZu!A&Nv0s6nN2f7tHSr>yF%B&vbov;&H*uPj+ZVJqv5gOD?t9} z)v{k42Tr(-obZP~1}Ch9tule=Jw{Pk|J4!68#etjzsi-GKNZ^lRJ>W8g}5mqsiY{k z=C)U`4=gqh+1eApa)LwuZXK9UvpjBRM({Gsp9iz&f)78ZqIy-OoR+Qh6?iKh(_`>R zw#AFRgLlogTt(9d&Ew$1k9-El*1`UXm?jsA&CFV5Uh5G1d41#cn65H#b}m5q4*-y) zJzk8NfAT+(FDDcFW6PIC@L4D1OT!N!U&dF}VZy7&50fwJ0oMOczWiT-zw)jz;eY5y zDfkEfUCGCK!arO-K8;cS{|Ntgzdk1X?LSPxU#Q`KY&85IW0e1w;crN>0QmEBKUY6_ z1EM*dey&XECoT$$YM6a-)WmSWrySe4o63yTzR;M4A5O#1%)F#HCR5_kZs&5o&sFE1xZ?kL^A zh~mLH*RFB06F~|aDBn&ElOK56r676}fgQzedyL>Z8X%1J)ZUU}w?=pa*zNl8hWyE) zwQdja+3uc#BoI$A1K*qk{M;_T^<}c&Ci&t`*#?rjx>PK)r-u;WIifL*m<1Ih@%Xmm zPMiF}rBK&1hs^`xr%)iiMV73UO*wH*It%;%f}ejKC9U5~q9pW%VHBa^J4{xt;Y%QF z8AflDr_czyULmY}Y=o`8StIPR)#(Tu9F8z%7Xq6aVRsZ|8+~^G;qpVw4@o9Lk8@J; zs1Pc|vWntXh#jLc9xTX#5;0A@2{AMcYDG>!WP%{)2+!tyRI%lgGclG$1w|kMs5diI z+HiqrMy?QknZbf--sJ^zLKE>Dg}lwd`DiGIwG247ZemI z>bkaCS&6kxp^HnPXby?C{-3B87hk%lpfI#BmW7&z*dMz}DW^1EaUU|wg7o0RfOwoC z4pwJW%0ci0Je<4AoDBn7>{p_0O`;fNA0W#M$Rm%bVjeMs-vt3V;omTs1G!>Qv{%)^ zt1YY0PE`(|uY9f+zo7zr13>Bpn84>S{VcPh5?TZDAde_@u??R&@@7Ia2n2beAG>RR z!tq040}gWJ-AEDv_VNL2UUha=5xSBeJgP_vTI6YXq;)wwLJFAdN<0dE86j%~kcTot zg;c@VVDo#K;?QDtgD@|(!A~K)L=3JNG!8Va0h1@1z|PNR9hOIUVEJNmyoi~1JCX%2 zw+o_Pfr!PJ@LL%P$cGkG>d+4GZSOl3?P(Wt_4UujLTOIx)SQBN-K=eHQ^0`?9c+S7PYp?Z>n1LGR9h&vp+`E zT^wxg^QPnHFS~95)398SOOkQJ_PR6$<(wc)ykM|G3>2Sz} z;cOJyW)}8Bkbjgo&8vo6#x`YgbzN_#(rWrYk|Ku91NA^!k{pKRSDKG79~3KL4->?M zFUO1)sEgcKv=|o(aUQY3DHb|JvCDjf$)IL=o%#F>UPPy{aI<)xt(g9YOlvMKypQl< z$mLa!-L>Dx%AJihrW}@b96#pkV%sraH@~1-!Iwztf{tFDQ6}J?I4XZhwy4rkO<#lM z+lA!WCM+A%k1Jn&O#LW?y-R;ev;|Mpn#`-pFz98mqHVYpupa5aS4{mN|F`^gv1mJP zk^je{e5km8l<{HB|KW0jm$1&)6|V6ZAy2r*X@neLgW0XVH#7Pj_%tFlJ3N2^`37PS z$L_wWS={e1qg`l3__iZgKiZ8;OWiP4>Knr0-cN$3)x#;UTbACMVL-r)kF*wfKM4&8 zRbuw5R!Oe+6SuDexp)QPdnXv7>~PJSMktrjOyS!R8A8h7Nyr(o0vUaOK@^@&>Ci$e z+K9el>T@lIh%x5^rdV_@Zd0*TW9BVA(mY(Lk>2!WHPTk!TL31AfxU$scMsN0o$qa- z2mzTUlaLf2U+ah$%A40@8nZt(L%RVEmPUhU2J4^R>aP7UBqFnhYQJP(M0rQ}b~X29 zUTs=A=+Ck|_#~e%GNZh-?DXcJ!R!SGHbYIb<4o^woc*d<(`eT0Ma~!cafm$|QQ8{{ zyK7&;P()2wSfo`e>cl75dGr=Fc>Yqv5R1BSsYv0K8x$#wLn@@#-xT!5co+GvoO*l_ zHPBQH_mm7I?-zT}{X9>sSU)Y+8C@8dZ*Ok@L?o~K8>L661|8y&4d|5a?hAy){!mLZ7BYb<4TMy_m!qRBumwBm)%_?P1 zxY%4wqi-Z6y|Tp2(EB3VS%`>hnH|Tb1^z;Gf?sA0y^Yyv2z(EB(-4U5tqOtL6ax9n zMxY~s!20Xec*hHWo7dm|zeZr2jldRp2w*Fq9%)D+ko|uS0`CDW0fComodXDrMR%bF zhZu{p8I@8KWh(}8dpe*OHSHqQqBy#umPm6klHI&zP9nMuaT`@zy&ZC9Y|<@ehA+dDIc9?N{QS3%dw!W zM+Q+@FRKq#lT1f}o)zVNSr1>5Zq(O_Pz{B>8h$`lycm!7AFr3B(zdR~ZX9gRv7!MV*sC;cXY&}yrp?ZFRm2t_~=ID^puMx$WV&^3);V?s^TFcZoB2`A9xO0*vorckw;! zU2cGZsvBgIqjhzzEO`i&RO%?|KSAA5PzB21;QSgON!wre-WIS4>@UQ$L!a6~7K6A? zeQJ4(+%R+_md2UiQM|=AZNVN|ef8i1I|x_Iw;i8`yeI%wLWyThz4L^U<$YIRa3j;E}xg=qIe2zX^etc2|hd!ES{}0>X@jf>D!AhxV0=q)$ zBt=0@JNa3U9e6eU4Xq`G7)KAsVQcF4vxNCN&r#fp#T*YMR9TW1GYU0b-IGt%aks9o zxGJ)E_zQCZL}!4$cEf#Bjj$J-e&s!~@ndlJmOM@ZrS*};48k=qH23cxkaD|32$_Iw z*b?=1Q3Jlvj^smdi0w#fFGfrhdLX(-GNbPP)2U;2za3p4Q@GM>zsnip zNUCGnN6)0uN#d;>oDU~ zZdcA2$A~Se<1OD~b~{RAtwK{uO}PxQU*UgDAWPKWg+04o|8`nfJKVKDg6K=INEnUt zAO^S_sU^OLGACw`C&%}Yn_|<0V#_ZqQ|RWNU@BwUJnNEQDN7npY+#QPO)cVi3a4YP ztcuE*u^sXN?NSQJ>@Zmjw?qYD;|X62=p;|&H!!l{j(!21A-XXMi6_m4-nLNR>=$85 zW+3jUq?qXoo7k7?>+ORE1wz|erlngMHZ&WeZY^{qxjz?Z@P&o0ph~lezUxp!jhZku zYM98`>`Ju9VlMR)-78@Zjq9){D zl(%48Lpr|R!y|>SD~PX`2p?2ywa3rgv(|4$Za5im!x~55sxhG&?*D0cL+*HY^e!TFgD2Cy)z=^M?F7)^jtRD?lquW< zo5_S3#~iC6YyH}{x%XOm%C%0D+3$X#bk6LLnO@nj4BK%_bLUPDO@0CNj_|i#WNzLI+@?c%G29CdC+~|T zdEymOnv2aC*U+;njE|eMLgTE3%lmJmqY%D854Nhq2??)g9(QU4a8Ym^nvn&yh;3xz z*$fpPkU97bcV8~*O#4TQPe>{!n+Lkk!Lj`#;#2c^u14i6L^7D=3nxUu9`eqB-dutD zhK#_?NxuY$6F(u;k(?scLa7jk5aQuoc?IS9rX0_2)DRbA$B+3u)qLc&X4C!QA3*#u zwXc!T!94|6ld;vbU{i84u7n@k3U*eHH!boraj+^MRZYdmSv#d^9g&Dy?2)=GQAbkT~e-C9&ue-Jzkcme)XpA6WS$V7)gEkJI zNOeZlG<1Ll09TeQgLxE-QkD<_kwcj&$rw}SJ#WLn)fYF42i@ghKumY!~#%R-#8Zib-q}9(*W{*Z~D)j#Py`l@A=oH_nxK3EM)D ze9^&XMJvJ1YKBZ(8j!DUCUB64z2vZ5D#aesL=TB^29BTj97_B*)Bq*!1T-KD-8Qyt zrLnP$Du$|P)M)4_pyUN8kGRiOtYB@(K#g@%;Q4Q!{yNf7vB_;nv?56)d-ki5BN^`b zN2VV_Y{Xpb$?BNyADCBWxh?}Co_2_Rx<=BLZ3KMnc)vjxx~5{6p3HwaH z0R!{}a$_*=pDj{K17b5XA`17zg3cOCB?mr1XJ>h$S zJQq%<*(Y96Pd-#*YmBdVK$&oIOmAMR#)N)kr3Q@|c<3KNz9QV5V3n{SbfEn!yqXh4z`4bSYLzdIpf^rK{u1u|E zYc=iH>@?i9PhoL#)z@>WA7KV9wz59P9|QP-^lhaU_gt0YEk)t`X{bDoisAe7C%L2F z!j-rLP6k90Kz)z|arw9TWU6iQi}Tn>52BUOD;ki98bEaD+sBdYu0ThoLSarV1wBN(5~GtjYvatv^{_WWV^ zD)%ChcX8phG%gtmL5v(qjajo@P6A7{%D0=o9Y|-B7l8TU*dZJz5D#_1ZzX@eK_LlM za(T{C`8J-T1S#=o;(qAflD@BEsNu^8kfjYr!>p$M+eA%o2{#)K5 zbL9^A{1^f-mTx=p7m#0^zL`pu;I z;lq%pXoL@%><8EK!Q1wORC{IIc;t6h{q(okcCiB=_O^@W#cJC{B6CMq(BoN|8qct^ z%7(9x_XRdZw871WBWJ3fVC!4i`dW`%gQjP{XsZM2SR|EHEbDOIkpHN-LacXWed7Hr zxS0Fj8&?5t_tR6|3%cr7!ZKbrcDDQp@eurLsU-XNkVpo%Q7QaJaNPb1sr<;^|MFN# z`m30vzbd`{&sjf_*gtl+Q-&q!-=iwEAtgV6S%$!D--TgAtLP};1e}NXDqy12{QMmK zb09I-*Qf=NMj49mm_y{pBSm;C-cO@B%ui&%PVT_zaop)c%W$njd@4NRO{Q`*0g4f4 zDa;I>Xv-__OIlRnOof@D_i?z#k+{3|Vbt&*Hp>SsBr~fM6nahnht?7&_6IEj6rlkn z^S)%2crfBY#1CNo!fkl9_ikr!fhfuMmK22YMac|rNnt2gloWYO<{~e>WP!J2VaO>; z0^XA4!93Iy2jD+%kH^&@hcL)0_^>!gK6`^)j4H2MDnrQIeffG>Y8SA{Ihilyj9gxb z1#JYUR^{UxvV)tN93QHgz#?JV5e~G|izHDQ-@spDJ!H3nVjcLf*TYi~B*}G|s6u?J z^;m%e)SSoxM%&_joJi=R*A7N<5gNdE&YA4+=ikgQ%uA4+QtIfqsaWqf8nwPud-f)k z7TDPZ$QN+II7ZGu4Upv!lVKCPEJu{qGwpC>V?d~l%Y{T}Me$@tMzCOx%$ouPA~T9P z8L+J{g`pnGMrKle@Jcp~mZl-Ya5gjMb18pzfz{!f7QO2RfX?h*mE1=?kw0>%sFsk1 z7ZuD2o44UlYVasK+fw8g3E>)7*)dF1?J zCi7HAH6|dpo@0YDft)ku72-RG2~~VVn?%OHqIC-7S}s(Mm}zi6gYHz4_6)h5E`|kq zF1NF(k^k_J9-HNpKuN^v5+W=yt$&5gO-^fq+>`6ePLd*h<_f<{<+S`NLrj4zs}%P* zu>d^c9v2)qc_@*Ogg8&g;f)3T;J=PpZ}*>qyghDouDTf+8C5)Og6DHAS(r(H^El9k zmr}%+$1`qdalG(t0EqUGVU}0i|6{<4^nE6T7bk#CtjA&d9{?X{tU^I2zV1>0(zOKG zy>9@n*5LW1Y;@~tVz-LU@hkUg)$alM^mkOhx#%~ixIcz|^K`#$caK2Q|FZuXiT+&& z^sqg|fy?eb#(5#4RrhVF?ynx%eR6*OhvQH7pO@Z$mfe5pSpC1ae#G$EKl15%(%1iX zw31r?>9G^?H7tK{HRL}A44X{AL6Fv&5C5G@Q z+fMqwck!3y4@(z(m6krjYV&lmg&W8g*5k78G_+uqH-ViL0TvakYEh;@(SOqY>5hI1 zhOG-MA70>OyTF?$prQsbBkfQtcn+9s_d{ZaF&1|%Ilosg zMUhUCC}+T1JG|V|RJof{<#=Kh%F&^0w|8Eu+@+~<({wp5RJ&Yes@#-RIi5#__L!Y% zmwW5h#5kgTxNDDt2T=_#_sdkd=2SVJKsCJFmQ*>q9T=4d$!rCy)MxvJzNpXj3r$so z(zI3+3g)SWOqPU#V zv(c*sz#+~Y6Ls&ihFW%b3hxBEK8#kzjjfnZ9+28Wk z{e1Xq^>Cqj_*lMr$na12K0f3jzTrkv9_oBc{qW!io>1P08znxC(0$>?9(-qp?g}@m zm{I7qaASkIvpU>ZhYKTA8Ey>Y+YwqE#s=~bTm}J0XuitHpQ~~8K`Om%H`vw+{b?*HNQU&E)X9r(Pq zB#F<}7abFyN}sV0tfoGI&8QwLM`^A21!^(1rMec38-%1utq~K-Bcm23d-^P;)(p`X9IY z>bX|hWA4jpuAT5Yp%t{|DBDWz=V1d1RzGWTB4E%^S|k~6FInX^w! z`ft*6<%cClD`jRkRd_#AiF~`@7weggQ}yW#Y^1pfznIF3^ED_fU_N72@UtC^)U+G! z+ILYxSuKA7RxICE_ziJ~S(|K+A?;py=mKtj^J8nNGKA!kFEV(t9S;6X`2n`MSpKbY z`uTue9b6l_NPC$>=d0bQ?R$w69xAHNVStN~C)#w_NJaXS90U&fuh4~uRN)pDrY8dj zIPi=&b>vzbYJCTw0e{#`Re{gFXbbfVw-TIQxpM|U7%knl-EPkj%gzC{VzbOaCTh!4 zstWcFmJR4w{-hcasVZD0cd)eJH49v03Hr=U(PxgLPplqApRdao55PsRu^`t7o{4Ez zT7CUNEM-y-f8`bvcu3*mN7S4{mB*Za_EimCVjJ6UA+4TzSZ3NOxU;0pIxx@mrq#D7q%^NVM+^-#aHWG<7MeD@R2kyvMBW zq9!L>v44lf)!8cNgfGJ$cWeF_C$_w`PM1Z2fc)Ci@W`k0DBT}867?)Uf(>&rxfmRQ zkn$nUMYrsgdYnX#nd%icoD1y-9F4>Q^&0v_e0*j4`k0$i_J{ie;U8J)GFQSc-MFQq z5J`1~XsoXMT_o&f)KO7ZR1G()2;+gcZ)2VB&p4DF36`~IQ~TigDAtWGc!!Z&|7WBB zWT>~|z;F}Nbs3yArA}qZ<6u`=#c}usXj!3H{}=HQ-rzEV z@E^zx`WdyreszRtsw~V4vj)eQbdq8_LGB&+lL7fWNT|P5z6(u5EOFw<{(_9)Oe9Sl zlxHy`b%|5HeRv$x<z|06yRWEtxih?JmJvJ`Mh=!;K%U73 z%_Z7ZkMigan>@RTe)95LYcgpcwpbaH98& zGP3_tlnE8Cz_9Ks2u@>P@VWiug?OCDq@#e9Yn{ke#&izfh9V#C2A+=-Lm;ko4mmg{+bF<3hPTmcB%bYl5Um;Ug6EBUi!pNu zhwR;@XO6l0lmMK$pWX-4a54(261(^661yQIJa!3_C7Az#h`kHeBshMD+Rawf3EYW-xGs^AXg~N}VtF-xuRNQCK+|iXFX# z0u#9d2Cj}^9h48;1~9Pk#EASYOS^y}s{WRV4Z$G%$lq` zUQ{Yn?LvZWJ<4`*9G)VHr}&Hq=;0V4t~s_7U@H&Bd=KU6R_f1SE92SqU(^t4W4_vA z{j5%<7WP-+*+D!5cIXUN*jYa}4LiIm3zj6XgATQKpv6Et#7oI94ICYFa*uMp%M?i}q}v@4?Zo*s>ROM`e+pO3 zwZb3%C$1P;mvF^Y-=Y+z6jIX=tub$7c>~=;8q0sh0>&y16j z`s3z-UUW1TKYL%iX@0)|n6bCtyK5UTAyBc}pRGk01Lt`bLcaMs85(y-p>JWspLZVi zd6~Gp+XXG$J1@um062)@ox~dM+BD7(0|^zSXq=~a?fAQX$& zpsXCg&a;yf`3tQ>II*Te&bc%L+hsz7@H`0|f7vc)cc?%NbWbqgc5kS|UHcLS7HK^j z;o|V7zXLqwEVu$7JcS2fvrrQke;~KKHx47%%WPBZ@m$#=_HexRZqWnEOMEAHa9Gwf zE)D?=#!_1YspeWpLRY&+^bRq(lJstI|41yFi_eGD61UWKO!0?H(Km^18O#OUBte#R zQZQSCn?}EZ02a2^0dA}0ZLhDxtrEgG$cIk?5tMgP_^1SJXKIwbqQ~N|FoNC$pr%XF- z|9DZU()K^KO4S=+7K%^HD&-P19xK_1>g+!DjWDn9FZK;K$$!@3wK5;30go)Q78eAw z%jBO*vyD~O;+z}%Vi=~JqTqsl2>Dx)POl%LdXiqTdo}%iDz^>_hHyF|gQ2sS&vPo} zwB=ZTRF#kf%&7^;cfXq=GHsg_*tSVtrLs4A+sKfpKFHh9o&4P$Sghxv5u{WUy#l*M z?;Sl@sYwCFs!Qx(++e2UV?hk!Mya8%a2^ESksWbcm5LC6}gIe2@7i1b+RNK$0ZX6d1wSg&Z zTTW#q$N<}NM$!SpwvWPDO*#PRBxsPik^wt@MKb3l?q(@6C;3}i)~|ntm%Q=M$ozJM z_w6R1fE>Zf#_~^4dS4D&(CZCjeBwGl(k9RQ^EjZF69?T^D;)CC71>FY>%|n1Kg2!2 zCBQY>W((A_B8%270^GhCfuY>Zq7rp93Y(cOra!h#{GCuVsSBJb->Vte! z_AmIs?^Ba8MlK~IIlXXxsFMr6(mxKzvb{k<+54&z6Dg+!Uu-e}3+%C1x!{rMJg7qP zwaB5ha|w|Zk(Nt1GCTh?=v%98*Galjp?ItRm2}>klD{XOoRq(jf#peNHaLu#(N7t| zi@+M-x#7y*vZ}DP6qf1AMn<2h*5Ia+C8gzQfvU^!1CImhsD?KAILaV#h`1zmbzjJ* z+hGgr#DKZm>yUcCMbn*ZOVxuKOpQZjeL+Ub37BG0-fbs{w58H2N220fprRbJ2bN#A z>X;_hxp=A&GpEBwjOOn*rsKnNtlU_hb^(N#pj$3EJj!J;Fv4W%PaL~Raufc)N zvI5`8)aAf_# z`$2G7lEQfxCUf-#DiICy{{#nuuE9`YBfa-AYjx1_1E! zuH8t)!5`&4?5>>xH8ahN>#>%k$Gq_to9oYoLRaF%Q4nHswLyo)QoI`Ik#m&Cg0ANU zxvwEJn?CM^+%bf*ktVo&@iQRbL!_<`{vO_C0p(^yl^Li)6ALFJ;@4dKLLG8KRjZM; z_*NS^6Wxf(1sTvAafFAvb}u@Rr{HFXgumqEs=MKruL_`g)mD7SJAX%FbG4SvMh&O6 za2kvyZ}^@(BXrT03E?A?gEPZN@`C45@rSET@A}d1FvhC5+~v_qZ0RnYZS*~l8{rKL zGOdN4ve4N8jK1ppCUirt04MONgyrQ#@rUsXg@}-8-N{0QP8Ql}7wW%Vt~^`e?c^#e z3ArTXdpZ^5L@`oB<;5t*A%;$_dN^6o(}{u)*#$8phx9mR6yZKGNAK|*S`7htF?yuy zy_oLrd-AZv;ZNpc?W#fK0zc-evKVvYS0OK2U0$R-;4Kfd?iLj+((d;% zZ^$2?HJlJ>{L6aW+?fe7d?qq z%f)D64T7?tV9zZ`1?TQSA>diD$cMXBh9N7#c6ZR*)(d~Zu(M)!*qlv13I2|2h)SNt zb`C70@cna)V7^+29(pkmSAtiei6jmqr|+8z25gq;MEQwZjJcEXl9Rm9p+toiMZd5( zNxb0v{Wr;{6$CL5+mQ{1i=cyRS z)E50YXsxbvPTlvZa zQTBk>DVfU5Gu43&C^!EXEEiMy*b0b)*df~DJTha3|37Jf{Jb`A7KxClcb0z~i+)Af%HB-M{ufe0VNT{mn0LhwuQEr{0`m6G{QO4qX|kLeRN60U?o_yp(>2%R3j z0x=oTAROp$1Z@7pI1phc{m<{7OAc8?^E(!Td!bk6j0f7%sm>l*<Lt;QWS@RQAcRsOnFImX=42Z5a}n+mZ72pPN7|CH%i)3L>e z1*KHKEjM0>cS~ZWUx=r5B^M$a8SraO?~uItKQI@ARPVY2vK&7Umg=>Zxl$F^TkZq`zs1;7uaCP4=tC8!=cX8;^=xUsi zgnpE#GwwpJN_rgd`XVBHF%f>vZ*7FrUW&XxVmE?*O4FQx^)P?RFP;dtr=K7s>|xLv zdR9InIUolXK>{p_sOit4|s+UE}&Z)-?{ehJpM*sEaR!?sPKa! z235!v z+LZ=|Ud)<)U~fL2TF;vYB*0IytP%bvb#@qbKr!mxjl2^G1nlcjeiVv?ZaD)BvC@8< zWbqFvU&x&k@@4W4$d?=En0sgmYk#4VFC~yK^jwKU$|nA^%Ex1jus0WThsDhJH=W15 z4f;2khi2h0d)47p+RoQTzI^(}iJn`d*P>m+vO?-JmQdi3^+ktY=bRx z;9+}%f=Kx({P0V#5s-r|AC*tS_F5#`>IMq-kg5`0>fR|51HwM7CIPONTyzE!gxj&G z^ib<=oFhN`%V_yUC)wBG!PjcB=I{OK^gtyqNe?6R2{QZ#D(g{~y2xrt0Z92C1 z1tU|9+ICMFsb|{5|Dgm4c3PYyy5eYS^0r?>|4r!f&{0FkXLc5HBV5LX!mhH!~ zqPL(K6zakISh$<#kZi@cFryoFYr5A20n!ttYa+)M0EfF2z;q1DP3SdIhqKNs+-e00 zJGCJ}zidN6l>k9Oqlis`u?8-SEm5M$)=jQLK2qQ4xn*knBiO>5GI{j;UVciNei9sO za#zB~w3D9Z0|6YOVy>*0FEA>KdnB%h0`mUN3cVD!N??;496;_2!@A$O3f$P zZIt!z0U!36LE!M;`W>Cl9k2`RK#Sf=e@G>uUyLju57V3dTg7WQnX1u*66?bOMR>q0K>;>y*n8c8Rn&KW@^-mvDV(i!i2zTiiu&Bwq0c?0 z^tq=xIljkmFpa3$Ay#e|p?XuDfa29ro%A7M_cDiwb1^W)I{kh!4iO~%DbMTj^{OHE zV2HzmGhLxt4G+$QC@&Koz^i!$m67ho?-X49?db;q^e25;uQY!;E*U;yMyoNsP3&*} zQ^KVfhf^*KOPMjff4-dD6Azqly~ z3Wd}8Cd?W*oN(=;ts-B)SMh_X5X4Se_}_aAE}SBi;(L?(PReBB9Q8cA{x&>L)St@w zkB+E+|J$hFgi@^kpQGxB@iGq!IP6`~&Lu zpcLz$JF0#$9w+M0RO7#A`1oJ^BkHe3DK&nqjp5^O$KynO1^=TX>Yw)x>JOom8vm&J zGw?W3|7`YOF{1v;KcoH%lv3j#Rev=eC+aKwpERQWf3toVA8P!g>dUnH1#0{oIQ~#m zVuC#~)xr5Jutyj8L83r$S^;IAY*hu^QA|WUQ7D*JNKMn7x|K5$1-jA-C_FA!1%lk| zqv-Gr6sX#c502xeoWwjNwZD}8a4h-N72vgcMqTc%)g*tXP@r3?}S9Z ziTb0~&!Z#i&+lh_G@|BzRQ&~bJZ%0dbp7PGD+W-%3Z>NiC+jEm-DtY}+c=i|V~nK> z_Bqw;7G#|97nOyb0m*q{lpNsl88an8uc9iaczIRwAzhVikrg#cGF~i^jFc>!8T{{+|$js8+7+3@TczSOm{*Y|f zfrO?0O)5)myGrKvJ!bi~<29nVg%&K8ZNmUm%(sKiEcC;JHcw$!>RHTJZ~T?L!Rery z+4^%9<2HDRFm!`{*&q95|DEb4_sCz_`BwG#Gq4nrVFr>v-i*_$JN9mYV!x{c-y1unQ;7Kkoee@VCw7fhyyF_ce(Rm+cY zXuLvYu>xfWQx(Yf62?68zEzFLGd`tWAp&_BH@;G2GFw zmzr-uMoXFZCP^P~v<>M|# zs&W&3+&tXMy3VD~SFe4Q&Ti!YAz2j4V4C5I1inAI)6)MGK}-2l2S%o1EbxxfwF}QE zR3m5@ZP1>TS_vW%_c^9}u^(U|RgX4-cN=#QAUnxMTPs9^d#kqX2}vg@1SCPZ>cU(kFvo1k^T2G2cTQb&Jrg z>M0Tf^5*$y?7O&x=F7RX^BM83qXY6JBvkfq0z&XA*#$i7Y~%J~?2Ve17dlzNSG!Ha zUdOy&Xq)|4vmzP05u5C~dHyxb6h?2fTj$cv#ueiuT_UUZ?RpmR(4p}uQJy4!8X=Zz?;n89to z#5ofm?ZjDT>oLg3e^6{Rj`&LxrzwA&7AlNa<|bWpqQ;}M48M(rz@ym_D-9gL+Cz^jcT51rEYU8V4NC{F<%9od}x z88Yp~8?+kjB&1#6q2~aM?;WruFo=YAPM;K~gDKkelyEl{5yI%V2_fBBaC_0MgfBi& z&UETOy_|0S4$;qFW+hl=g_o&iX2Y8pc@k=RqJmvmw#SG!{2B6DP2l@KS29@3t6Nj^ z6B(E@#^l(xITf~$%UwGOtQGo2!a`q`oo1mQ1{&=|PVNIrC31G*SHePX$2H7z%q=ds zF$ghToyghCh{>$Slheu5dTV;I(*o-N?}$JKXHSKkbz&levx6C&o$~8&?`snu8JsvP zxa*j)nkHr2|E`7V8oepJdv%uNz(3EDe4nogci1Jk5+e5Ub2(~ZSO|F{=c;|oC{v!(?a>@Ir$u-eU)ow9j9ae~O{ z-YzT#P6lH?2oJ5m^dRW0^~a9DGWcbcr^N#|%XFwwUM8@#ly5kJi`PtbN~>OI@>4Je zyjsXkTU(7qCs1GozU3eJ=ztiMuVZ-*kEybpa&gk3YN~8^P?>U=%AJbc+<*rujVr9BUBkFB&!o4gcyC{F?_F z)8~7{5@0-iIk3l3)OaeS-&8^J#4uExTycw>he-vh=s{CO#AOC#00ZEZ3y-}|O^1*5 zl+~b5Q@Mdh`n5sWy_om_GIJSONkqg|S!JE}@=+BYVJg`);*lyxm5s}PAU$v-7D(`G z=h#@#S$xG~Gd_tR^>c_f$vfq-=kS-alXD38l|Rolt0|>+ZE}c<0nBW? zUqI2*)Wp`r9CiGL)@qR8VaS@xGK_`{O*Wn2R{GqOYh6|IKLESR#YcRdN1mKTj|Q{V z_9y$}i7ap)+Fi{8TJ-tbpx@BxWA--*{psFbA8w~5R#c+>9M%4>GIS46&1iO(k@-SH zQiHl&9I8OnFn8A5(2{Z%091VE(j=lX*H0xbZ#nMTYE}MtJi&QV$jf6B1Y$7s^e7-S zJ^VhM9@5^|H9ViQ++NS}uhy(3Hy@2&Rtsg=ngJpLo@b2qTXs;+H8k|_Ge?)08 zX{7%T3_m~LBZi%yfA=}q$Jd5rPkMxp!JB@7M@q0g`IDqAPn?dK|9pC0l4T*^D^2F5 z=iiH~T+Do42fdF`F|Zz*oxFk~NL07tKEo7EHV1%nM4IOT6q;J?)tLc#AAaG~G+0zP zYY%TEkk=r|D8h3^P#}0JB0{KAp$fsn)5#KTSR?%__-?eFOqF2z6GLGgG?S&*p$_%# zlxOZmI6$Ab4eX_zw>@eX6%7t(X;beUMxuJor2xkkfcCAR6WWv*M#nUi#$`J* z6c#gm;a@pR?R>OZAZ3k&nm8 z5%=XV@%Jj%Kbs}wmMHCnD1T>K`Yinpztj}%wP$HZ{^(h1P=yk+bmk1q(skJ7z=^_U zJUvl~Y1*1;Pt$$Rahi78hq!J{*{h?b={-G7?_ggliM({9c*FZ(7&k*DeD}n@2g%CY z^jTfdbK*U_dE$RTvf-Vk<-K0t-e;K!*GP}6 z8;1ediEkwj$!4mJ1-i>bq63RVvzx~9d-C{0sBK$N3Ucu)rrz=u z;JoU@hFCNQx5IjJnc3jM&wxB%X@N8dF${dh<*#2tw|XO2Ulwi%wUa{muyEk)dB|2% z2hk?>vyDDZS7W_@8s2rOtLme5b8Y_t&eyf?x2cn8-&6Bb%hz~~)lBS!L@`8Lpu26gTN{Tu2n+KW;->TNB($h&8Ca8BW-y0dN}>`q_Bz%jJf~c$9JPZ zD^UUY>U<@vpg~bsDU(({iq>Hijd&AEGN>UILvP}N0EdIuLr3dSy0`afu7VCm)oXw} zymqn&L32Cgd@f$k!&mm66H#6WDKGy$jc|V>*UyDdp{9BnO>uua^^H(_XeUXj2=5dM z-_KR}7J!S~pO;~+@~poX?{*PT8*x7Io!Gf(``4G@%uDzcnm$sTtq0Oq$tUDw{PKLr zrhnx)XTG^r)7<1WqtA2xcfOpAhZKOC^F?XmROk&nK6xm0D)bOw?mt8DOSo0WW{%SL za6U9%P19~45q($wsFIVbs+T=xTD#ML2CZEcv|pO z5JUs`!*0%LgV)y>T7tul!MsAH|I#F!l$->dNi^a}?Z^9gkQkR*r!p1PUh7Ud?+o=W zLR;Zd5Wmi&E4$^%*l1>ZR-j(eGk}GMFz(hIRU#!MbhiK=H(^QZ5p z&(E0o!Q@XotxqB04Mfqni5MiW*04MiN;U>Rnp@<};;#e*6Xa01!JJXPm4VHyD$9s+Z4amyJl!DjMerNDwFDO9K0bh>+7hI1w)EhkC%tlAx zDf$%yb=kJQw;WnIoK5gH1mv_Y06V^(qW&qk1A1r&F9$7@!HWoHhsF#Ug8T;9Hm9|x zD8Xhg_&>b83w)Ht^*+8K8;BCvAOT|qjTn_0)CefifCga+D#7IvLMt~frQ4_#byx8c z3~nM>Usj_9O}_>k1(jA>(>7F4vomxX2IFO@HWx@osJ(MaH|? zWV|lTb2rEG+*7;r+$TCLp8Fu8RN%mb$%=TY0z^U1QCpF$0I})f(}eK=NoDNr%dM#) z+O4VQqI3dk?}HB<%Z4#M)QAd8#ntm;%1IG>V2B^&Q_?GW>nU@Uh3@-C%>0X)r^S=&c%ClmVH*Ayh+~Q zOm(G0Pa{S($OOtwh7RPqm%9fBPQ4PX#Z~%e-gX97A<^BEWaDL=z7ZcNs!c|ZU_^3F z!{I>rSht;t*dXNO0Lc{0gHP!g({(}|DAK;fw9}iUDX2{C#(JbZ9V8GgT>;4StdvW= zVJdS|RUn0sH7ifG6!MXJzW3C}+xyjrTqRWg>Aqs>M5kFZ6dBB?W3!}}`Prf8XGiS( z?1-J8^;GEH&2n@`Gmn`V(5B~Sv-$+=9(kmJ5z{eni@i$j9+S(Y?R6;M$Be6BRh)4f z*XbFj=Ub6I-y)%-L1eXOI^(!aXPhZe zB!YhG5=}ur^k^t2{#{%QfT7lBaggx{ek(A>iQPq#M9sl4wyh=&eQW0-Y?%0W(Syj3 z99kWK7RrMpmgBw%K%i!W_G(skqG?=H7rLBnn~Q$>DNqxFHNaQ{V)E~Z+Bj)rv`8Ng zmSa!S__mf~ecRjKvWEcq24dIrF($V=F$()AosjQBpWm7_Ozcz`0W(9B`U1vn>Wc`T z7K0Ah8;WzhTGg?~10nG-c$n~9eyZaasL2#6ZGQD9+x4BaA(QS8t;Sj`>ee<5DV&>2r!Lnm{-Py6kyG2>SO z7$Z7PtO=L-MfO?wMP&SD4$N-xt7$C!@-d=8PkvT_p`zDOuqddd4lgLC-kNU0kJ4 zkXH+bag{zSqt8LnBd()-f5NLg7nTFe#Ue=# z$g|B+lW@Q&$aU|8=hUJ^NInXdQqo&YX`5W@j_-(iEDGx4}+EN8k zo8=V`I}gec^YSW1URBAfmGWv6uUS>HysD5_E96zB^(skTmCLJUd9}`Z#rY8|Et6MG z@``7;ONGVquu&eCSPw}YdPZUtXmyPYSt*gA&u%B?^ceEscA^f2i3@#rJ70%OTg_MS zb;Ff@#&gzL9Qt15nJ@B;pzCt`BhLu4ezq_2j3Dc0yCTmxfmec^giAR$nl%-17&N^C zzG{>elCl^PsVh{DJ?N`!NxYYKd|E7B|GSSsC$* zCj=MyH%cRdXhIFS8QDP;H=7Mk(FZrXA6iQ+H(Q8C)E00Hct+q-xY>(UG2G1dkB91z z#H8neT1J34_c=KYr|Y!V%)9`9PA(y1Y#(HZ&^PsdbYwRgpC{o1Xy{I3WX8@wXWGp- zOz5)K+we<8f#g=!&j!Th&5BuFdOQ_-Ilb7Abuj?$gJ16q;v}`#gZU-cQpth!r4swd zgT~jkO@f=?1Z*3KwF(Lujy4nfRj{Z9=|iz8Q*^$WgtPVTDsu3jGKA71?@!e~m;=BA3 zy_ftJKgXh8XLy_N#g}bCe|g0|5h-6Es=3q zYA~+?2aW$UbVp+7=CP6en@gR+0ihY4!ONW4ok-5RM|JK73^O_nd^X6KaVVIJ(+Y#R ziQyTY(((*Z*~0^QbKeYSU?&c^selL^H;`Z@hyPPdbw}O5PLBUnEtZN} z+J^vP)p2dFfDe%DtgrXXAk9?RG=n4ZFz)yKO`L``Wg+a2=>um-ArhE6IesS#Jt2ik z8r+pILN@PDKz0kaPz9U{0V(OF3h~>}@2LpVs^M=5y30vdb1`b6Rf#WgBM_(Db7><{ zAfYQdxu|JU=N*gGf_EqB3>&WLh>mOy&548k@V>aIa9cUZC0|h)T4)Lu6?27GW~T83 z6l`1D6kyEeT~o#@EK-a#zMy120K;7=47Z4@ze!l~0}B{)!d8ioFu%5Gtm#m7nQk6ZxXs+ z3xcum7Rv3+c9*+KscFzao?m0muqxZ2&|`)@fmSfXu4l{s7R)dNB;XMSuSR=#R59A{ z2XOd=SIcpj*eVqsfuL7-uYAH*@|5N{Fd*85gQSv1KZe6hc(Z&plt@dw4+gWIyX1TD z(iC4R>s4@;y#X<3^vS=6r$w)qHlqW5@NZ-u+ZBWZ>%1gToG}eKJGOBLWq@&+GdM6f z+Zm>#kOL>E=^x<^u)M)!AoJE^ywWfuB~D$_N+TR2SFQYx`*~z_i>u_vBxW>SUNVY5uH=EPVVCfz`WeZPI>_DL{UqT)t~0HD2)09*{Cloyg?k`jF=+%I zH2u-Yb7%rI!i5P&4Bvr=uj_?Q_WE)dp8E>Ke9NIJ4shC=C5>tAsW|Dc?oi<1$+z8z z#vQsIByg54xG7dZZ=7ik(b%|{YVW{La|7rVJo=rSQ*gxm~)bFubgYBvP>H&mN!X#`` z2Im5Hh7b6zDqeMp14*Oc#Oa$27qzosd8_q9nDj@~4@TVnsiX6%0v5-1N%6y)2^ljsFFp17q1UQR^kvls7j zl@6syU)+q`0~pg5<7K29h#J$_lme$CrNDE8q}tx5_WgJz!}asKqK3=lcOy=T2+Kgn zqKKgE?k|x9XMA@eZRv}f)Fs!_ecM%X8#QbMcr>fDpV(u_zzA5~8?!t0VH#B7w$TE7 zCnB3ze6xCRIXZX1c$KfPg7<$T+{+&p7v!=`aga+nrZ{z$FUdcHB_70A-=3iIZ^gEU`gzrivr8#%A6^?UKEOl&RU{CP+iN8kd7KZ6oYEIRcvnsN#C8#RdC z0Fg0?upG4g73Hb!!2hzGgH?}I9Y#?T1}E0Tum~svQqmOMrbZn$|pKYbcUG| ziGYeW`eoa;eQ00Xky>yC|HD_XX^8jKYU|ogj>p-0DD;jr$?ix z)>yp5*eWd|ACkKTUJkM?4DAMeg*T!Y&DDVdX$Y0+tnEhLri{EQuI#E}y(z=nNWGi% z_63RrOKGl)#e)}5Y&=|#yI%2tU=3~dV+~MLi34q&DrF5G^(an;(ePO~_&Gu$upEVw zlhbw%8Q50h&k$Pbu`Qe2b3-;L<#ALF93qMs(ygf<0(Fgf9JD zwf%{d3@7@QKpPpy9E8aS>OPkOE$UVM_IcW0@m{iAUI42KJ`k#Qxpx|GSs2r}%3()8 z`T;wdqVtmJ4CFdl8GQC=BGb9o;leOoP)N&j+Mqd@TsqEFQeNGIo+E-&wt^(8hWolL zc%XNsV1mFkzx1ednaa}LcOL5<#j_}&VwB^EzLPN~B0szD<#zMWPBQY6nHW;S-HKP9 z0-n%Fj;Kb$$eZ%LJ|5!g!K`A_2E3s*@zztT&GEy;t%*VNX7KP zuEf|$#yMKK!?Jxe5m+f>#1KES*z7pcc#nwR&)}~?#zIqTX z5OQoH72xm*(-r(493Y^PiuhfN*ZsN@eKPsIhg`1P)FcZ^q2#paM)RLLqv@r;`RPu< z2qU`G*o{dFS5IFwn&0M$s+Iig?h zd<#L?N$1Am1<68>SaHz~he$=eQ@3q%;vA%?Ir~u5C|c6Q(yv~$$FuKz|K>Df zLOC2u=ilcWK2J}znX5U~T%`*zzo`r>j3HuvwV=5ih7VcVw5ZzaVwTeov6)&4qpoGz zBSrsOHP&}k;9`eA2g=o>3k8L6Vru@!f+RzEM$uv}X4-SCE^ zyR_uJK6I~H(-KS1xt9NI-_1YCAX-jAjbMol#B2xGA$zm zs^{mBQzQI5&=KW79^;q;_o%#DMj*bW8o*rwMfG6jIP=sINs{*#FiT^zyLlV3!wR{( z_j9{J4(U`pofEMESoV>psmE~=24D?jp&FXLY*H{&#pHaJK*vR7H^5;Rq>d)_Yb?32 zI*ABpteKm6hGq>15dtOXhxX`3S|U0=)gnO=fk0Mbj&duUo|*?+E36$a5iSw|S754s zHLWU5g3~7A^o^Ywr%i3cO)_m3G8NdG)uvBP*pvyIQo|y!;RE17apy(DwvEjrw=sSI z8EK?nFz`d7~PY(}J(X zgs(;2E#TI%eIOnpa<6&qaEk6akc0kHX221FVtDIc422v zS~K#s2#C|hp$4MpaYB>UuIeWq_ij(e;hhVN zo1F#5g*?U+TVjWTd7TRi!j84vxzBNOgI28;`b8k8Z$8esFp4_8DL=jfX#i8MV2%Sg z)vFI0;t*AMi0Ka|EST-^j-5SQ(jSEF=dZtj=UI5kv|LB#kpFXXKo@ zVMo#su&*5FNo+g8YTH%PihHyDu72btobUj^viuCV=hx71!ZJyNgcl-IFN$6i~hVI`U z`}wL-sK;|aP^F%;pI?UwyR!}AL~xA8ICNqmen>WPeT8W}^0jLyH2CO8ns0TJE> zfX-Wt`rG~wZ-Kt3&nD~7$dgoE6C3;

h$xmf&K{>t=ufYukSP)50G(Ih#yW{Q$}m^&bgzWaJEOSY0SXJ4b;Q z+3RoDBKsXYMkEe3%!jTLc7iXF!L-%*46F&p-l>whVWLE+pUt?2>!71C4G2t}3+RhE zg!1YR448X=YWp$R=xJ77*r)Kdw(b9spuhllBjS$dK%NhlJPxJ>@+d7+DY4l{U2EXU z?SOTv3<3obr&lYavA9vJQ}r%cG$1MrfY1^O3)McOUklY8uuz?)t453*PN?xS)k}_E zzvng5{yhRw`tDi@(s$RBk{|)vhrwAwBJ}B-+o9w0I}TcVi+>_&Zuke)hn~jhYOr@Q zGxfrcqph2kezqZ+UiyqT$~WVUV7kx8!rY_>%XGgVqdBj9fjR!Sas2(aqATC)^6v*n z8~>j7eh|5LCH|0ieFnJz9TXC5U&L-tFCzyIoHOnA`~AO-vD^Q+hu!}2*r0#c8m?&D z&x0cZlHV+5@txR6i!uq%6-)C@)6!gkBLX+!JYbA*`#CWASLo{_n*7(00DHmmW%ypO zoWI<{vYwA$MB{g6ug4)k6w!i$ggDqO1{UJsra|-ZY$yi^Kc7EaZpD=&D}n1#R|%&n z1$jM9xYIE5%q-BsoAYrKt@9`>a^#q=Cf4mS=Q`+`q{T#0Xq8HcI_qI-_t*(<#X(W2 zp{a4$5Qo8y?gi7_P0Pd1M4S|L98Zcm03m|?S7eep0Xw@iOmZRhPej_GFvznU;|$H9 z0|$y(TQxafqANN_)SWS@*sd`yJrvk^YDS$oENil4bR}|ZofV;jF>^jm1Q){w!T z2;_ON{@{?&OCLk__$)nSXX3VpuDT8anZwm$D~T=YZaj<(TO%UULU}t-1iLt_AH!xb zW<6|;C@fA7>eh7}HtZGcj~=#W>Uh)KjnTtak6}aNq`XFT^ zX+wBZnBZNJJjbD?ek=%pT5@_!)pEwxN|ewwW?l>~seBN)F^+mBMl`<(MbmGe{M<}d zhouD0QdbXM3QuQFyZ!eytB<*0i>#X@KRVO(Tn>+#;#Khue-=`W`zM5Ecd8fg894nJ z;PeSuGZOqKaUDFP1=IraP}_zBY;Xf%>^YyA`${bcYu|>3K=@U3A7P_K2lif#(-lFuCGTMu)rVuv<`_WAPzYb-ZQoWr(F|j4KeZsH#D;BV(t?$ z@c_>Jqp`qvC*pJ!ImmZPet!N4*P3+TF*G@+?(YLucZmzm_d~g-B3Z}1gYm+n9^`qX zjlg*6pIs&2pl_k6rv_SDf-?`b4}-clxIo<~YfNYRfC;tm0OeV4XgaS|^f`DK4TOG; zWd&3D24~_tuq1?0BWz4c39yD_UNhD&LN^$jnBNha$^F&=+3&bY+5miZqpRdYcH)!Z zhF$1g;9p6>t-Q#7-*=v|o>#^Mq`)V+9c&-NmDhZcoXz&sZ55OZ}nZcC;)=Ud5 zPhxhnf3LBXu6QBIhG(p==XI!teJSOjhJ-MJrR-h9jPY^m1DGj8A-)QWGkr5A3^q9E zC?A%v0zZ(32mFBh9JTnRdh|B-i zr$zLI)g9Gn)TaL!l>sI(@zH`IV}Y8Q9U*zM$8R;{j*m0i)OipYK|FUTKYhvJ!oxeEG zMR#CvVu32YuzLsIZkQI^0W}$*8wd2Jli5q02Smu#DR>p#t19-&+%weOx+J<=@Ig5T ziig>)`6b=DW$yEZAw=1)DE=h&B=eBjdKi5?<7*-A2f<-q``l+1SOK|rVRi>rjdl2v zutl#vyhIr2*)$ouN*)F*eCNL$zVy@KOWy#+AkLdJ0*qP#a`O3;w}Q`WspBfafoU{U ziR9^J7q{&&I|qd!72*72mGdURJxd?aWZZ?bwPvMH2dp!*kofqJ&l~lp2ewGEvnmb{kcV)BEN`KZ?&nb%%6y3w3p~ za@yadgmsmiha#*pOR8M1tDJ}`vruIYs+^B17oy6^y2=Dy<$P4xc2FQ(rmLKfDkHf( zhV;m%;wmvP_loaIAMTK3dc>@^g-D%=KSb&)zZaw2B4|6X%KiPL-o_VWiBo7}htt23 z{3o<3IdFF>&X!B{ovvI{Wkg38pktD>Sg$-KX|ZT1kI{JW9qsMDwb6Q+o?rW-=NI)9 zn?Je}^<(kWzL^)jjHuOW0rESkV9)6%a}#9&5ep zKzm>pD==u(Z4t|>HX;(hTmraC9)!k>lE&L`t*9h#d=kD$Fbvby!nMN!#7AOyDWm9y zg0tQ!p!H_UnfP{j#2<}Q1}P$frTbC9hd76^DtIxWa+N*>l`*-j9N@=?N_iU;1p~%+0aL3RqQQz3sfxftQ8Uei1#qxWq7UMl!pfsw z6v@IWi5vBsyMbW3BG=}$A-EG5;@tWGH59L!fGe>x!Rtz(j}z$SydLI1fS2`-?7S)s z{Tk1*T6_e|Fnu7-GSJYoHlMTk|()JV5a2Ylu7r-T+hKNGmw*E@j7EG zafhe`XiM37<+_tNv%odg1s{H6OAF z+U|8Uf|Xq$*GsJ~Q-fG`d~}zoT1L9u6qZms%24T}taD3Q1h-B4k%Tk?5vETR{ArddGy7 z(_m+t%e8T4mjk&_EMpGL-#@!d*faVCd#`yC>uFrij&b-#dg=WG6T2GyTe=nDVm^}e z==IrOU_8fH4)q}XE&@gSap;G5ysMe1!XmM_>-ZIi9LDeWKZ5+qZ!yhbyZXn`uOLDw zqob8W6GyA@N^rDxPK>r|*~b>z_*&gTr`*2e8TWwcKLr=24WlrYDrpMPP}B_OkR&Xv z*;@Zz#r3bN^b7C+O2C*yZGMcC+Q1lO0oR|>_O{US=jW)wmOnaQ zBjnFmwC*YyMHT}Ylpr(9Rhoo*a43icJS_e(IaDnfHZrs=ZZx*?qe!+GaXBQ%mPssL zJE{l{d>m5Ei1Vs5^0v_5a7!%zEhs0PTaal6$K7?y-biPkpn2kC60aqvf^vfS>40>d zd9f3N9h3}>I%y+THR&j=!~UNEP;-nB5o~6+Hob?0e@W&>kGeUjT`Mt-JjasRssd0|puN+z5J3Rn^foX=bv`Slpsd>U$fdKVWnt!qL9VNqrgE zCtKFs=Lk;1E8!%U9UD`;7hI7+%|f@XsiP&&12+-KMMhL#tvOoNwCpf)SJ&i@%o zrKx`y+A^!_m}J&*-@?=6?Jm59sr3CGpyZqw0p$sTG7q4jm2rC6bKos=B3Squt2r+5 zm2TooCm1KXN;SHqix#?g7}O{mT`4BIpFI7Hh`e3hL5GCCsmmDB71r9yY2hJj4V=39;2^lr4hwIzm3EK*2-(W$J^kp#y4D?>u=zHV_sb!`C8t>OW%6s zF4h&4=*s0e0;TlB7X1_1@v3L8^)cA8n>p$MqrJ8b8 z)6=3%HK{>Qpg~Dr*#wL2WU&5zHaIVGw4YOWQA`3D+2$M{PH?o32o$v@%Lb?5mYbpt zz*$};QLFyF2K2Cja#`omX`fJ-7(s?``kUl{M*$6GP@s$@P%_KrH4PdIYwFlScj zMYu#FI4sdpSk-RrVH@0#j5~}7)<0dr4g8B6q23MriyO*ut!Hu765Nm~k8z~y1}ZWr zK*|hmfNFso?g~_`7==N`bt6WCe%5^KS}zcwxc**LC%nK?Md%Jc3w3o?MXZ2d;(xVy zUFA_zu|xz~oaUA0(yNKJ^114)_xJAE^?dz(}*#=NvVsLv=q@=IbiQM5=Tc>&Yjut;$(} zEmgggsCJkja`^hGFG1J07i2}f{tfIwzc`DN!Z%xv2B^verD->1bVQ#*^iEHosD25?DGEiB8j9r-6pAE}4op&9=!wx9c5f9xDM)ft$w*PR;2wAB zT13fnbxr~0ly9-EjHIZ`t?$NqptGbPW4e4t-6zR+3Pl*2pmIV#NZw4O5fQ)G&i};^ z#g7g;4OEm6h?E$_t8x5z9Y1D4R+XB_uiUGOU`5+PqELdVezt3jdY^1k}^ewL)@-ellS4Ag6WMqHCs>;HH9Rn z6xfRc6FMkq{xIWkN)sN*B37pcLp~=lrzWBl0CA|L2!giOtgs_=(YWj?*@{-s%NptB z4v>fr8#EIl=j~v0P_3)veiW1VJl)5aPu44U;>`e!C3(g5-_d-d~30N zvb9Zg9P+EJU?TYgb|U!${re|iOPV`4Oo4C+Rdxy6*hRK+$vVw8cB#5o5}@aH5>imp zewCO-YD&Tvkh$VPfRIXLZn=h3uqrbs+3>7*iMu~@xJsENNY@a$Jf~|?*KLQoZkeuH zFgj3;YUYHlP-@x&LHr+?l7>N>e&pDOM|(#$1|TuJ!Bz4b!9OI4#{aaFqG-&iQb2N; z1U8M;hw|#xVNf1v>oP8%u8HFE9GxK$L9)yh1ss4rK9vkX#_<^ihrav==|vLzWE@za%I=1t zE}W(D7|Ly8mXp%o6aD`E5P8Tzkk4rO-D>F{fqpZqG}00D9WCEaW*DAx)Y90eTzC$z zL@w;ad8L~FWBt_}&7al+fi{1N*{}Wz3on0_z3P%o`%1ly^VMwUHF?;gcH$ux%J3!| z`+e##;VSXt@5yT`xHuATb-)-vWyY>3J zVUh2k5Z(nsv^%L4!cCS!2!icTA$05d>a-yQIarD+&~=>Y)8Gy})SMh!i#jV%v<+I+ zCPX1Yi`o>AOh|YDEou|As3EaR6iy^@SD;hzm{idADjla%$}&Gk)s4V4pJIt9yBuz& z+@j*R3I8j>&-Ic3XgnHpz*Iss4zR$-jQOYR;QEl_8ZGZw!ImW=s|5gT%WFo zWIrm;!*kHU5Ica!%q`Pn1#zFw_vCL4|xy99WC#l!$L12rv|99?{(wFBJXb= zt$8udC5iCjwDcHxKOK;KOLn`(ar=k&%cRd#s$nt%x z?2JZ){xgvDme5~Dq4FKw3y>qB4}m`i8C>a+xJxzdj1~CD!=BTdz+X->umrwoPZ4=P z9xr;z`vW(Myhpx$$oqM-1?i@|uQres%#`;vTHgOoa37KP^F~I|m{X;L5$!$5t36icCt*x1nST+7=f9Ns>#)DuL*_r*i_E|7 zx&MvK@2Krl=D&@dDE-r*+n znb=vEO$L$Mcn?)`7k%)t;fRGlC6Zbmra%@2)X48JC0%nrk}e(u2F`ni?nK1zgj?6t zA(~YU=DM}SKQmC&0pSF9_GSpD=6D=1hzAf(%{_#Z1{9TZMiNjjs7C`joPfS4nnN_8 zSd&Kq+I>xa4S>7{$BsgbQ{mYGM`^AC-`WPn0j59q+iV9%>DAxGc0%sAq4%7rTbCUD zqd{%aa>d+VJq1>?UG34)|s zgS)K;r}WyOroS7a>2HNif54zgeb7@>4myBeQwpjFF+VBYpmI17g$QS8ysDD$#)n^{ zIDqgV3|LlHok z`A-B^`fF$_Gwkvu0MVO?Mp*wX_VZ6K!Y7Wb+4B5K`+3eB)L%PE*FVjE{y9MLX5Fvh z$*`aQF$49qoUH2^Za-gx@J#Pm3>n+~8Yg9${mlTB-b{o<^7%*h^V1Rb>g@zjeEzEa z{8uNTd?%32=fAg~kG_@o&(Y5xwVw}1aHhBXZ+d(K_VY44@}?s8mGxYwpL;hJqmne# zgoni2JiGki@px5@##uhweqMm^Rqtke$LFWo&#womd6!|3`Fybb{9%xkHx)6zeEu1Z zMl$gbzz}+80@-~2p8Y%%k-^?(1pM;(%l7ko&{eNvf^PR2`}ul=-+C2@n&p3n=Un7; z`768ftGwe*o8x%C2>~*AhDlYTUM}V|N#rb|F0VG;1lF5hVe;;het7rKF!{k2uX|qD zB11bLf$)RZkk}sf)AsO(d!dS?A@EPRQ3}Rhw8WahYB@()aKun#E~;^J+A|N$f5D4u|p`=q-~eA{R~m6Q)#g zgr|Zj@rMRM#~h$8PHnqOq#smsq(P<43qND^&p27I;URGxx-Bc5o5>dqxf6k(AS~zP z>5lLWsZ^bgu7GuQJ5_0*5f10(NV(kU`e!D8qA(%Bz{1)Y{}j3+M>%grf!r)KY3#uy%LGgJw&hW&9N1kEqoa0delt*E+OV}*WjdW`1 zlC~rOqL!Z(K|0SLoWaDt7a6ltG8+4+dAZd5ebgMD!5XB2NCs9uFb1NIDF|EWvyL%R z$H&j14nZPe)OZZfkil8}j!UMX`8ck$7Ar6Ay)bMb>e=rNM4%xD4I$g~^CmAjZf^9V3p zRFbfVqNU>i#MbhJyK|A6n4VL5q6hUKtge? zR1$WVO@;Li{*EhzSH*X2I0IdqKvgo@6XZH&&%(f9)Gl9&%R|;QSkC--vDp zsD^BbS@+pPCZ;KGj&268-+(ZtpXVRpX-HFYoq#vau>F`u&WU_ZVu3 zvGOk1-bAm1{MypxU+Yb4fIgOpKVAN6wJ`v*fx8OIVbfJP4xBkajvImeY|H;DWFyHQ_CxB5(Y&H5Uq#nxv+XOCaE_ua?m-fr)^ zkN@&+?|Y12xA)z@KYw~GeBHkv+3kG~`hq)8G`_mm-{6UT-=lsc`ReccFA#hm^?p^R zaqBoZ;%WRXKzw~Z-Z#kn_|lK_)2hggJn9PgqsNlyGYCWWZo(gusDn9!kmKIHB?xO3 z46$xp!)8^Dn1vwHKe-XJ0Nt|+d3Mw$c(dR@1l$#7s^iDwrl=WJ8yD-71^0joB)%|o zTk-;PLdQi~PcUw^jz*q~;0sc^M}3Mp4dWB$G((bnqpeM+UVORR`#X;FH|Q%)LFIJB z74;SC=)cj{(SOO=Jx={Ym7V5!e>~9lpn2He=lTF-xJ`8xW|DL5kE5(@QPXcAUyeHd z?-~SWkuNu^PoE`U=8+htN*Q$?Mt7Am2Yh)a%A+u9k8Dcpashu0IQdo0`m%Svd^Z~* zU%n3qct^41-t+%pOJ%FgqUQxVyb&H9dw3P%dvIO@+3z*~iDJ<>-xMr*5>AX$U&Hac zAe3KDz51L97CprotCBFNph3*=a!}y>2cjtu0|5@%+Le!t%xgI+)I&zj(W!5ua}a&= z3*v&QZxE;qI4Zppv5xa*V#SNah+2ZQa^~|W%B@l}m~Jkw9R6=SSRrp6j-fEzRYA~l zUPaKo&Tu1M1&i-;uwC_!voV(EGLXDnEx~@j;b-uy4zcsk#VC^?@oxO#!$)Tf?f3ji z-*2#!lnnQl!b}*1HVX_$c8uT|B)n+#s9oP21~hE%p02~7EX0o#lCq)#4~{_y1SzXg zRs5QiwZo>Y&9*MlowB%C@uIv?7I^eFP!uHo4oz8`9qQB1yHS=t@a}ZBp%1)MXX6yr zDB9wsUa$PeCZ<5gwGmqCmVEVH?#_WwD%8l&qKK&)GuzXJ193XkZ+=M+xP0vTDD_t{ z0y{w+amJmKjav}=E%Lqs)O73p(bN>0H;$FYRiFcRrW&`T;OH3?K2hT7+${gaZ==iW zLKc7I`-h98-)rhrU9b#V@_Q2)h&PJFHmi@2A_3H-NeTNFJT(ZZ#t_X#hKPe<$ut2L zn5J3-e>a0uq@r-V`ieJxtT3I$MUOaK>uZhko#&Rh5m|wd|G7p{d4Z<53RU~{QBqug z?C-bYZ{)5nJeNL30+2Fza5Th#LjE(fQ8=FHI}VgbOXeM3(pyxfxSzvlMtW;fV=>q1 zU=-nGQQl(R>5ZJM^H(OlRrK^PQuln?jowTRb1Oa)PF9PvPEGn+a%R-}rwoJ}A+c`x zuHk=6l{^^YQUFoQ;26OdSK?Z2JP<{4HI|B5p|YRm-UExk|2A4h+oBwdHKP5lLaS($ zA92RgB;&Tk?9Y5BXnE$YBt0&T(9dVkKbKB6Zp&(L?~X$;@IRLLJQQ2PtmG8qMM8@F z=qz-_O=cm6+_xJ7xUn?VxGkkyd&_T$t_>fPWIgKcv+&p?+5E~-i0cx)Mp5e`ui}lR z>Benos1Xqm>>nC_ihfR7KM?q>CaKTy{ol6q`d;)4zQ6bJ*!S!|8i>6AgFRn+t$zU^ z?WO(5_g~x{{T`ilc5Ri;t>?g5UC!IA2hux{igvmv+FR6x+@I?6zF7;mUt)NRvb6x-RNuBQc?yQJM&O|*VSs&{Wv$!M)mlJi%p65X;sR+-6WLeevR ziW03k_{O8&N2&~DlhdVAyOp}bDm4?bL$6}-(LD8MxKH3<1%Ph~O%E7Y;dltmO7#sY z{H{BQzUn|xBSdCR;drnxD4dmgR19~0PzFkO#iPp6n70)fbHs2M3elvX3@o_;8a~G; zA|IQ6`lK(x;r$#%&HMa2ut6d=2myP>V)QV-++3uy9$T>XwMZZQl*#P&t4Y_8h3=C@ z`aaqh7rtw?G(U~apAh3ub5QdTwY;4?O8ALoRl4OJjO^Ry`?q!j z5P1ztP%y7p8;Pu8DhcM57=m{_UWU62_9p#lP>`;E1cxcjsX}?h-p4s7*U6kLQFr)2 z@%}9)ZOswkC{3wM`0RaW;(C^ySV&6wWVF47Hzgo^IXSeRue6;;yOF!5y&k{bi-%?j z*R;AGyL#lt+i1KFOlig63Fr~Hs5Oxq=E=P`EA{zk*wf$h4(-ie=()GZN(H>gO5NaLjr6puMTZHj!A>;YW4Vv*l zaNs*5zshDjYwfnWGoD#!XR_IjIq56WI*6%CH?`KGURK?BkKWz*vdUyV14e@N%s$77 z^rbkdv>X39JtIn=>xch*64`10NjyZ99)NfL23^eri^#=>^eKSlE%Wt-FX|haW2503 zWNph&{g!ij7}pOmu4JH!xFgT&Uq1Ffo7V@T=k);f>@DAAUOWGbd40aDzo8I#B6Dp% zuJl|ZYv4u^7zUMClVK3=Hfi->80NhG%VYn|yuSZbYhDlPZC+n-!colYf!4hK@c5W{ zJvaZqn%611Bj0&m@7f>;>3v@R?T6jwbwZ&vuh-$bZ!@p2HQVWHUbnaQIQHJX2tbgRwBKl1{KrPFzx#x(Oav zrgpLYfCx_~NbMF6G;nB$_Go-iK5s;+Lxx zMKiiDdY-Wg&NED4Zfuzq6KDNY{G67beqC|#lnaRQuxyyILt)t?)Ah^T_FvfGE`fk; z?(&y}LRqL>rKQPi+eRV9X|5j!-6cVHvASjeW2B5Y>=Q!H8bHq>E+f8hm&D+RgqG;m8&Slg9G$z%!itbF2Y}qpCXo*?~V1*~ts7zyG)MO-0YQ zxZy`R-+med^^?XA%7^-Ipy5j$8zEzLv zXTE)gv%&v|^X(gqB*0zpNYs2|I(g2Xm4BfzjCT2fssjp?o?kb=WzVnEXY2Vjdw#e1 zbpv8@^!z&X@VA>^yHFmJvG@74;QengzwXgB^_*W<5+us7{b}5)Nk`JNgm+pM%{~f5_(`WFYn}(SyP3}&~yB2 zx;t$;=mcqWov-SD1|nTkA@BJYbHXgL+A8umi#)&>UP>=GMU69Z@3NetM#eftxz@l} z#UZXoh4>5~gx9Ram;4uA!#ZTxa_@qVmCvkeS)X;KTXmge)|If@Cd?OGwKcpebU8rkWq-&XpTBe(|WcFDLkt4M{WYv4_*|gwlC$yBz26g zW+@!GoP$ih(q@3dEaK4eTk^*w!!?;s(n%}eqzjXfzDrzrCLBHJBK-+4t(N9Nxrrh! z{XI5spSJna>JCzvt#8NrgSnH8JZP0v8`-a*BqI*290kKRmu#+*htQ5bWoreR4$FyN zVh;X+YYPMoMVJOd|yva9HmBm3Yj2_ff&?PuIN z)|i%ZM;N14T0ZvDIO2)y0LdOEN;T=*S&gGdDoaQtElzIa%E<;6d+Lybo zn~;M?OixZk(ipa0k9b`K;eZ<;#gGE~; zqkt@OJYjcr%^5tbpoS{HS~1h*>JxZ}KB1!Cj*CYB8+_Xq^>(89Hj&?Mb&3 z#r1&jT+L^c3R0^VZ6_ov)&?{NzdmH%P`if7073jB#R)$&SF>!wXV{+ zr~;ua>jZ6o1_|MMyKHW#>qdf25rJaRUf0i{_dhKcOi1I)o03q5a6n zdhJ+2RzTNh3~3?xkD#uMLq<;4XTxmdLowl+yD>a#WD(>+;UW?h$Z3xBLw#OE<6t$W z?f$VQPt#2C>-RBXW;&6>F|Q;06W@u(L8P>+-cAh`=OvQ58&Yvf!9NU>vsR~bUXmxu z#8WTy_x=0HJ-;9I{m9JaXlwS$kx~v;#kuSEUTX{)hewZZVV{r5UQGtF>T)k{)n5f6 z&cGDjb@|Wprd@q0I9fIC_%EDL6S>-EUa4AeE&cTmH9B8n@%H%8id1;(7v^x(LE)ejPwEhUl8 zfbNd=K}LhLBfj46N?P&}fm%8Tf{&jkW&O_Txb^|#YoDNT%i?sYXvXAp#6pDA?FH>> zPB+}-bc2x$Vx78UDA?R7g^ogyK0Kk<2~Hxjm{h2aF9l5x;X>)9U*euh<=KyOEoG^d zJ(O-QJI!c>|Ev+}4is&I4bi>MH7tSO!GP%Aged)lRNS~qKZC-eiA@BkX490QQG-3) z0^fiAwU2YGjYJvk*s=bijLm(!vEBzppvU^B@^#{Nj`cQDMfHzN>hNG`PM>QHPBO^aU;j}SkS!UD)bqF`qRDC>`wJeMh)g~zM1BKlC5YT|uOO00 zY``EzBa#hkJruZ#b?>V~m7SI!P z0zKr{lE3I7#~xSokf*)dJH<8v>+R_{hG*qC=7#8lXs^D9M9cO2>fMeU%sKxSO}J_O z5iZRGp-DCi1axh??HAG05wgLmEi1ad}AILxY8GVhEjm+pQ)@rJq2fA@U zOLuX+(>s1PA8X==#}xI6pG#IJI9BIvaTKG&LukLy*r9c!&uPs(^Foa$l|-l!*jWJp zfgNgIzz%DOV237>KCpAs{G-Q?TgpbTL+gt0)R_=2XqjB9*AW=Jqjhl2`tKg+gJ`lmOl*^d!q_$(mKUJ z6nmTac5h?Zr1mFbEKe&$CoS!S*DY)z>Nq&%zZ=Bv-vUa{fx z-U2!Yc&=or$XqppO!+m)R2Umz91Nw6?9+kj?UlE^>NeG|BWuK7Gz_d9Dwbx2gA%be zOSTl_Z=92Zp)^Ji6;Zk!A8uo}Kz97;MYrQ)mFlC43N2hz)c%q@K92E0 zvzcbIaN-BEKO3h8beALD*YYdy)mNZNAUO6+8bO1^xAe;&f0hwm+|RBlKT zZ?4yHy23Zu6)Md_CI}KIC;}_%U}>j3oy@1}+>S6`Il?*Audoly-h@~JvntkH8jQ2n zfu;O57}|$Y#-0Vb0gNf^P)&HGo&?DoS;!(5d@+*+OFzd`p40jmSX)Es0o>{Mk*=-0 zrq34Bim0M^nPd76ZLvyKu~()uY%j^EtE_Yq{&L{54f&}1*!5U!deJ7v@4{6HI89zY zhOCxPjklTa={U5~P})J5y0-F1eSytTbRGaugooBk%9E``A{>Y~?VIt~5!ekgfZ`P- zm^llYgHlXw+N0o3WGu9TE&_ zyv%(_Ve`kmU3^B*S*=A-M^yf(>&_ z!G@dFJ0P#syNgk!9uNHr{Tifa0W5{pEUT(sk?z9njdW-lI#^9Vi{cJ#Pk2d7)xh8W zh=(rgv5q{Z zo^O)$19|81&c{bxBeGUpYL*L@jzei2ga&LPsW7fR>O+iE+dQ<)9A88f;#lRUT9Ac@ z7D%87>S`8D@m`OH>BgH)m|UeVfoWRBt#VH9OkFP5F846XfrFaPxiB=rKcog48C%vs z7RF%+k5QwzE9kC=BOz{&#d&}WoVedc$3peUl}`2;2k7A4;I6IY!E?M1`q2puIk9JD$Cn-yqunps5v5GFXjm zO=}Rlp2HA^47i3E1u4cA$s}WEysQ0~_&r9LHv_O20_Vy68W@2?(@~9TzJlFB(3Y!& z%VmAep+0d!jy}xT&0~MqVk8Y=pfm2)_|WX6;@hbg3AeQ8C5O+KiYUBGo$xJ28vCS- zMl^=0xXKS5J|w~lP;fUw?6@DauU0mj7Hon zGU5tRsC~XEAv3m$b+c0Kg^c<(oakyy5#VN`?uRCWK+zUx)o0-iQ*u;?X!t8ZCvg5O zMx*v$!tY$6PztB=5b%~#Ua_a%G!SyQG~K)nmyX4imVr`6oyrA(@Mmbp;3gJtWd&$~ zF?h}DqBnI5#(I8EmItFJOB|6wtwUSr&GK9INSC%?ia{h)c5UUAiK}z44&cf__$nG5 zCXN1ipVg>l*|BCvg1 zgaouHB45L%B^L%0t24Mz z{cT%1ZVQLTjLyvLqZyr_0{s}B;y8<3Wi|{4Bisi1P|vnwg2)g9yc8P1il95-EvZL6 zh__q`4j>yCj$={r(AMxk*sSA-H1+~CD|98K#i{KR&Pg{%Yoe%rB=#-!w|1b;!Nh|JkT}O zX%saDiyDJ@yQ~LzD^Vo2|EK9^iUMgSUv>INl6Rsy^Fg9N0S`Qk5je3F8{y1M-B7w8 zU}K??ga0MOAQXH)!i3P{sFJYRPZp7zh7U(s1KrRTHPE9u(CeD)f!>U_9Oy)%eAItC z(0c(O@UrP9nL$zd=rPb!zx_A{banZH<{K9 z5@`T%P7?l>hh@=!2ir#Ilt7ms9=&8^vObOGZ?|L!f8*(psu2h*Y6KOO4uLE&{JS83 zPtkNT!|6XB+2nV3C7bt&{y}o@aU$mJsLBEUZ^bIxKz4xqg&Y58tP=j4tnnwhM!;jT zO6IqUVw2sC7)&O3p8m!Z|KU`vLD>PY(cHVjSqj%F*#tv2yH8as)b3ja^;` z2tp;@kl=Ve5m(4cxMD0U81H^W%Lds+#Im8VOoVM4s!Vv2!Sxo>X@(2&F z!9!y)7YNQk(Y|Dy{e%63T0|?=2HiD?*Os+Jji>8%bO4L0WaDydd)GpoZ}F%#pUW)5 z#`ZpH>_-SRx);r2=2`Owm33wCEq90-bwu;r0I$hdHaDSrJ;-Jp9%`}~`0dDMokw{-6|#Z(;b_Rl z%vI&oT_@R;zx@A_Y>EmkvcZs(cL>o`Vm#HYABb&~3`6sa(=sFW(Ljf<5Bgzts>;BW zT`(DA(Q_r#5^FH&|7+>3BqKE%ZG&pM89$lxTc}NYK4CZ8zlFQmdc#+*?{uz*YW4ZQ z1=n%LiA=GB6eZcnFO_8+kn9Z)z}3oO%t^+Ep=(-0;C4~SkLmKmbg<(pp)~BKw9Xa3tafe365Vna@egse27f3We~S5 z>Ni&-8G;`X4vlyW9^BaFFSB`?Hls8;)S%_!$}#|pYa}g)1wK`KS0Iovgz)5P?nav4 z&vvvQS9o@VyBt-PV+XiV{Q_sPFgbs*G&U8D>FY+7kj?8xuq$L<2kE?Np(B64$*~&y zQRm;&vo7e>v(CLGw=EHTN(7y|KG2EndL)4fdE)wx(!`lHoVYX0D$JzUY5gP}!eF+i z;q+KwduZ|P$lWoVdLx$NNOH2pOc(TtxHu#li!0lPL$e^=&}|j$M=Vt8V+=$ubW;(P zupa0@ezaLgR8D7SHF+#3!Ci%i8+niPBOB@ZjC=qaSKv47uF~~y(m$K|qXyw4jf@I$ znyaAG-1yhDi&}-6BTzt`sKAs(sKg=OEG~B)TJbK!1CJ`b98c*_tzI}I0s!v`0KKaT zz+L$59e{h~BPES1HokS2Zd|E-pd~73y$FJ5@JhBx{_tM({1yM%S&>5*3tS~>7(C-9 zGli6^bQo`!=p13Lk{5x2sPk2)6az{SK4Qq2oS5eTMviFY34v+wOTfnD+qfKSo;jF< z>v1O%k-O&$usou13HBgx29bL7PY6PX!!FYZ7Z{E&>f-(13)If9Ya4*mh{j!tCdT3P z`AnuFp4om99*5?qPrMZGCgO1xs+gr_UYLMI;q>%{p6zrmS1U2vfiM!-xk~dWZohK| z_J4!+%tPM6|MdBlIIZ#%^egGEmpsVd1SH^~$#H~2PFPGNc9zgVc@)zzF(WnJ97i0y zI}xJ-~OOSfc`0|3g(#QG=3}5$KswF71ElBSu2)DaK@Jg|!YtA&q;HS! z9nxQ*2Yuo6<>3*$0n)AZ9Uy($z5}E`x9dWEzs8dCCr-stq5%-$h=96jg@r+*q2!5bib&b|YrzqIcF>7(`?APwQJS4dU# zjDp48f^-+2g9oGwyFRB6NWaAMz92o(ZXb{ivF`wBS8}8mfbC?yIvu6MB}tC zNK4P@9jAHyKzftiJ|Mluz5}HB_8lP2weJAw1-R=K($r{3qvn1LPTxDbcStv)2Yul* z?26zGkZ!l{0O>RK9U$Fc-vQDGaMvrOW1}I3+i$Onv$ARTSD4@h119UzUf z?*Qp%LnD0xq#xt1S4eZBA&uhvF*sdwR_{2yq8~_avD*ivKeF!tX@PwQNH4YT0BJVv zdWF<;G?4yfToj}~v8Cyg=mBsl5+8~67|&!%{a1%X@B}ztwC@1tv-Ta}eB8bRoIk^z z31_qr%^J!;swk@e;3j%ui*ktJqqzPjL#4j4$WspBfbr8UsgK+M=D+h$%NZA>Ic zI}}=mr!-Wk<=;=h9%BKw#ImP}Za*MUv>#gS8tj21k0h*Hwc<3H2a}Yda8w&1@nIb( z{ZXVuhg|{?I@D^j#59&b&A)wBT8j^bcA#CHl=^rreXD4Vf2)*_!lm^ln4Yja(6HB< z5AD}onYwRmrqH3rrZQ`%dYpkYx^hofX4h7Jr;_ll0gLO9RESb=4@Z8v=>SQ?3{kdu_ZXTS_uJcXe$4*$ufJEkE)Ubhd@7d&c1RU->! z@e~F)0ducoeJ>4%W&#d0Y`mrRJS)Z^v^g*os=#9wz$^8|XdPD~W$}8D+BX>F8rqC9 z*mO86@ZuI+C5B4*5n{;rvpkS>wr_ah*&+EzO?%GzAg1sfv$QVdQHNl^K?8}Q^#qFs zb}xR3XdE|(D@5Oz_t^cw6qu?C@SC(QF#MTABSA(lz6cfrz zWu@{C4I)#TkWmR-j8T-~IiMu6TJ`;9LUD=4`gN#)%X1_$XO;b|(EorhvAq8KLRmi% zV@Q&LPr{|;_={Qr18Wl#gTNqhAJ_yVkViDT73k{AboH{k2(KHCK|lC0w~skCM{M8= z2yVcCMpOgHdb3Cx*o?or2W-$B0M=?YFcX(YY+$`^prJqz1gkISaCuMUFZwaowh~BZ zoGERh8PO;MA36DhcMa}+oUz9u0XD{Dp*UzO%sYp1n~r!% zL#kw83&9~bo=$n>WBTiMr*T;0)z`ut)BX{mTu4x+1in;CS$^4}P%2t3bMI5HKMJ~% zJ2W>~jd=@n27Vbz$9wNSAjG>1f4a7g#l4z%n($ont$o6femgSe?O;akHrwBJBJ3OI zrIFxpa3AfLyU?A`l4N6Aa_G*)?A#=Onvt85otx@UHFDFkbJP9FM(()m+)NlHbF;E@ zC;R3UX!BL*U_5(#$vi!5NgM~=2N3ND)T&Mal?|x^1dW z(WhCoHA3>S_N3=F9KPLUk(jGAn|Dz}-F7A(n8L$%ol1Hb$V&%U&kN}ZUsJi?qkomt zgcR6LQt22`qWxPjLFm+AB7dDHb376twF0}Skg7lc`cIErcT4Q{g!u-|4Uu8cV^D&^ zIHtf@k_k)k1qIqV_ZnQpf#1{M-khDUe8XWAzQP$Cfbi6SyEPF;rS`oAb7|?FXvEXT z)c&%?8T!qy9z@?rAlVnZb2I)Lv1xUXEDg$@3LP-Fb zm{boz));cIGtH9vglAYLpE*e~m~3^ToG2Q``c8BJ-8RKN6ayN>0LEAqMn=PC#fNp5%pIs$x zR9L*q>F^y}eEap_XXoKwyg`6o1aH2JukbClFLChk+ZcyGdwEs^u9u6RdbIyQ6EpY)=I*9|A{)iPo)|SSQ#!O)53MnYNA%+6YODJZd`gOu=CW6 zxH6No;yQP(Uwgb+U8TU_hyljM~gR%tu%z`hvrbO;HPZ#mPZT0=b@h#5d zO^L%4+J@plvO|9k!YH3@5(fAP)YP?jhmDAGO%jZWcBmBabwj@FzSF>jxl>UAcN(Lm*7HH z`YK*E$X~qN0ViO4t;j2FkDtS1s1`Vlp=t+6S6^N7m~~ZAg)ZER0}^n&lxly16UVuP z;NttXN5K=LsziN8K9hbdZoBD|uC86oM`KI^CEqa5Sn5Ph?qMNRaz6BB#wma1|HPPN zT#*>@a=o(ds{!W8;2~#DT}%8F2lhj5KF*kZC{TN9#wUS>LxIC5-*&3;iD!X2ArEo> z)OR^6!^mZTf8ks%IIu2$8QbmXY}>0n;6whBe0zNi-w=3dnCoLGJl1KRb&O|AobX;S zZ$El4)fsdj$XfXSQTOcuQI&cB12f8~qcavM7AECX6jUfy>SzHv;B9me0lTQRYsQ+D zDWg_e>OeW1oz`~Sw|ckx)$Vq;+Dg;_FDaIpmTOeDJqB)AY@$*8KHuj#*O_w=yX?Ea zKR7d-Ip;ag`QD!I{plIX$4caPN=_;j3G4&CNF~YWCo<6!2{p6l$9J(|S98n;YhV(z zs_ai1yGcJ$%SoG1uCRMKBxd<0Qn8Q>5<0nkVY1Y#eW3?1XLEJ8i@kVJFT89KtprK# z3W{$>Xldpl-PvhS?&wX~DHA|Dtw0IFta8SP)C+vhdPSPV6Wir% z7=@lFA=?3&f)?YAKHO;wuT2*z6+{khEF5#BQb!5W26OQ%@c$R@*gs1bU_O+aZQovf zq>DlYu6OAzGwP~8v#XnnuKYAr-ka@$7p``N|CJEh7n!7tt}&3xFGYH`&?kRuso%#*W`MAd z>yRtHe%l}dq~2Az&JyW*#|lTE>0oHUr?5!c%^4DNS>oiaZ8Cc363`?5Hec)fZ0Y!@ zIuFurlx)<*8x-dtGfV-xs(2dKX*yft}P@hn!)3 zQQ_=U(PW(_#?E`wjz$}Cx0m;}*JZ!Ih9vEey2fOjSUW6tDAa(cqmm}uBiDua z9)^}Cx}&n#z=oF+@v*$-+;3ib!!o9Qw+vW`;GNGHG!_oz~j+{*FE-c$+ws&ZGrvHP?`zM7d zIsYdq%_#=1Y)3PSZKceQ0#xcpF*_~DPQ}DPNo0kUH%Liz$}LV|)f4pIf3WKR4L4<~ z#NMoLz7#?7jNfS{pF|<#l06ZBJ>~6Gfw7>d@U6#!wi;Ii9xNob#@6jPS z)&F!X`-!jCXGHS{`fA*_UX34uY?+@!8(H5K=tpIX1_y>eZ;0fzH69PGpl1oYLi{e( zHzsDkPYul-eImsTNUx6cjubi~xeCh&$1nL}nm}c?NHG})Xo3(pH-%6ofpkAYcP23HwLwKo^mjc)6=)&6-6^PxTRpbfo&5 z0rn%MtoL_7ba8`J7j?W7=^k}dQt^$+tbzE8?80+J?`E)9@I1Er-f_M zVMOPoVa@X$4DFQw$UFz8n9!K&_9VG`C%QcaxH^xnE=a?rd1?677G9TycSs1=X3^{8 z)t2n>Eva``rhwV}=}~Q1I+4fhWRH`Q5NHEc zecjgYi)Hh zf4sb2P1Eylj>^Br;El8!dJJmwYT*8pcG3=<-_-DU0q^0>wL~`ZN%F@)0D_3nA-E1= zdWHW3;TXo=c}Lqj;B!C-_RVUn=vBB)=(U5_?tcd7sVnOa)>Z>ajLvy>smPVFP8#pA zS0hswsp-S8^Xb%ZyC>@3ftmGkWK^es*MYy@wxV#@YD_7-u^UioWoe9{#5G0Y%P`XxAk5L5d?1vEf0Vy>}<#_Hl zqJ>HC5TQ0=)}G3Zi>FA_T(>xo`#hcm9_}lIuI{766SL`W2UEDMPB~r5! zW;>)rw2ZQEVn4lZx2AFB6YTYOK;EIG-x%$uriPbsEtMi%`Csr!GpyDc;OK4>=`u~sTfsoAfe@DFj zuT(smtG%v^IIb=A|CfY>f_ze0{9?UH`Utjw{Us*px!feZ^+G-i*uRqB6@e9zL+b|C z8ox*R?wm1w8fp^Q6?{fCAFwerZ5RARo|R-Br^r(|6go)PI%D)%tlA@=dg`g}3k&on z^1$erfxfy0*@eu5IY_jJAc*YDXzsvpLqlXt8yPX!BD!agHIJk@I_O09S~{}ZAm7;b z7iId#%rXCHa!&Qixy8LJYuO$R>Wp zbM!BO_oeZX7awofC6`F^xMjC9nkPSH=XAKT2I-!X!Jncj_(u4-SAs6@LB1ME>qDV$ z3MsRfU_j}<589tP`SXwqP2b4SAk#RD6kY9wdw({Ra7Yz)5)etFY zla<_HVJW-hHlU*`%A;|?nOLkWH|X~Ab}6I9BcqN1kqe=jMsKs>K{F!xPGN_#v-mVr z0N{O)PuY%uM?!nZMWP_bi%MMB<$~exd!f31v`NLuLJ`27>%;$Y%uA8ubCSo`JLCzkb%d)OI6wcJ@K0^!XIFWK_YT#DfBLcf)T&^@ z@WO=98{waRDnFqrm^i#JG4yQsr}lDZRgQglu08Z1249_!{oZtTsXV?qd3;gkpA4@N zy#?sz57`{(LlS5%_#O7!zx47r)y!WL2{cR7oY{y5fVdEhdMolUFJ7w>k8=G>wJZ6JmPGda+ysr`SXkYFK-y zfqemGA77L!J?i9j{8UIRU-g2yK{jR>ftdKJ zOv3XN)@tknx#lTkXX0m^#}!g5Ob6)5Et0=AGAwd&vNWx^XmV*J*Ten+$dpj)CD(vL zR?oo%S6NDpBMAU&k+WymU62@TIr4|umS@E>p^_-kXOqY1GTIqg(kcze_yE46LtkfX zR&_vVyKF?p6SN`p%rm&ici-y6Plc@CP#IkAiXn9E)PdnI8X}{} z&f;SKFsO}y1@$TW6X@Qw9wmptFF>a7XF`GTd(i0CMkdY&0H$<{L$X1Rp6079zYZqP zXd88GvPCDm$ZBbk#yG=kU6FBZzS_`NjT7MmN?U3Edrjyo8g7vTYuxFi=vTXB`GV`a zM#s{4xh)6x(By)V|`mdF6=nSeKTN#G_hseN-~ z5|&|EFJUVna9B2yaoBrL$Dm)9PvNF4Aw)M&Qa!XTECDsh0=G%sq4sw{O1%?5xJspj z@Y=b^t9K!<-rGLc8HAUk9eM4{p9W$@zC9YcBdIJMt39qt#XV`h3Es?5SKnxFR{2Ea zgt>yaHI4ZP5=T3wDLk>?g$PJ{77HRBPw3$N+7~+TTWb3S7&Mh#p!^WZ!02goE~oKf zVd_XVwZhVwF&*bKv$wDvAaoL~xHJ`~(%|&1iD3WZ3Em+yrsMaQ<=;6E2>A@B29}n| z(soSF$;Np3JWz!|yT^(+fWk1!^#*w50$zhSpzyeGT^9~I0vOgsz^mK~{pSdPi1*Y$ zcH96X$U;sNkd4`Gfz2R!U5G?go%FSp}N z5q&AfnW!HL7pOft^IQaP7QY4W5N(j#4K0oo;Nnxj7eVlVlj^Wgl!e|1-2{DPA-#|& zo;&5`d&GQm^z%(On=jcjs5irE<|4ZD!8L+q0h&T2P)}RcaSuJY=26!P?|jBKSwBa~ zmHLzBwU79>jD$zu;jXv{q6kjk=-dQ#j5YL&@bSmWJ{K2q-KC$f;EZZr*3QSc?RzX3 zQOA$8vP70NWYnr*Aw>Xwh+hg>3fCK`y+8$u-EGmi1H=Dph~&3n!QcY0bufX)AvHq) zevg6RR8jPV(4MH{JsLj)E|#WfYK>UCqoan(i?_UR<82WN3bqeI5!-U037Zl}$EUE; z47{X&ANOTo-_61j?8w+xs%P6A@Uj%|!!T6$k4H~-1lb#O(ofs5BN&uZia6HPb8x%q zn#~S?v)SGMf@m821n3aGF;Jh-f`v5H&>q^up2Jt_9Lv7A(Lf~{!3g~S_vugjo+V`H z^rul50tm;ZKiL4BpQk_l&%*}&sV|_{N&U%kKl>#bi(xeL7l7gjP$~8r+X!?a-qrG!wcqd(llf zrPPQI2G-ofeMWKtq;8|wxIRW{cmtS&E5H(Wzq z#M>8$w=ZBe)^a+3{pcj}*#O$mS6|2b6F{Q*^!|Sq?;lu2h_&nF^;S(RXTKk0o3YcG z5zXDOxh`CTgywWKgVGWxV*4?S1UM+somLvr>q$5b+cRXy=sEjJ-n{GM^&{tjQh2Tr@LP( zI(?RJQ)u`sDL;LdZ&Z3{aQG%Hoa1TXJV~kvFTy`T`p1S@)v?A5{(=bOtHaDYah7lU zyza^X^Lh-{X1Y2-y^IUp|5kZhzA8rEW)DARdAl3MdNxcuQL>!%e3C9O%z}=rF0yC5(zheqkkXt>NI8LO8L=2dUYDR2>sKbSEsSAI0L;pjh&4%@Q~2gZ?Qil zc>?gYFF%XYjx@H1pWR1ad!w~d)Sm_&d>4BR?d0^Ef!^EK+C!)*#01y&|*uBU>C7Xj}D6YsM8f^TCtP;o(m>U;>$Mj&M z=QVjXVk?r?)%aTyNOnrQOQVa@0SkmZQwMKc5%?izMd0v?z>#)u<*L_mZBheMYE`d5)mB(8n?gplo-snQG^i6!L@&AyppVnyPpxtiklk;6R-O=~ysZz6D)M1KkpBtPWjW9sxo>c_r7@ z`_)`qBR=WxUYryBbilw*GPMNNWVW&fppMA87bGD*6~-Cxf||Fb$hcT~v?>U z;Ap5O@)|%0J~5WO-g^iLnMmZtuYyCkD_Ryvp76RUW8tc7Je>&ZF$p`yG~qm*f}$!2 zYw}+~SRV53`kN!gO_lGvD{heK>8@l!PbY$&`Vc+!=JW)1;6yZ8At~iVE>0|6@`J5B zLnek88hT==j)p2}b%7Iv(@m#&4aa6E()8`K{! z(u)LnP!Z>@dLmQE_2g@bO3#H73Q?6zei7OVTQ8{OhnhX_Smfj1zv@^%_KkV0#q+Qx z!)H4f;<%LLG2RKn*+eX#0`Hs)ubcwWTzG&#+DpWzislbA(R?o)O!UV3a2AJelZX82 za0$Ze4UY-@=`GTQa8tB)q1-qmJBhE&BSBV35#ceyjmyT~02#9@{{fdt z`(M>%TV)B*3*t$hAv*t^Wqg0Pl+AthpkH{sGIqk*4`WKnPsU;23O<(HR}m-FL{Hcc=vEx-9u~PzJjykqQ$3PWAl2j8cma)BIdi9Ws00}2Y!troDO#u>dikwaX_->onC^~_> ziVe;jX>&=ilzrPkmMpwrEi)sixV70XmMs|CYd~RPWlwwW4gy{pi zSL7LF8N`i87Hb|M)~I=oh$aYa^E8Mx55!s;K1sAK*v>^;R(OL4qAiuQ&XmS&IC_QF zSxus!vyUQAf8FQrq+Og5;;?#t?r;43^H1vd`PHev?faLU-0|~sE0$rG7e#7hW;wvGEbG3Xs1ze|0n**qPS3GPwTST;!!hdmZ!un(Jf4fjYq+;l z^|qAg3*Mz|}<{y=3aEU_S3?YGtc8esoc`ly6WD5q!#DoqgW&@D8O z#7H<9hxrJNiWS{1)@rdnNA>h&x;|6#T{FU{s1ZcoM`@6)|B~c;6Yqp~f|TUT^~~$F z5aquPUvBa|O1ryq+0DF?rhFkpG41TPN2Wh2rD*_wY;0!==7R`vJ#DY-h~$x=jf_j4 zOx+mBWNk;y!8nw_G)MAMBZDLJ9Fch_kjVq{unP1hlj@MVhi!b@VzH;dFUDz>jD`-|6#pfE3vl5xMXSP=asA@-%AV3);CQdUp7W3Ev8TlQ< zKfvMKic4V-XQ4&W+n{$rk67wKsAaSbG@`uH4#~9|$<8+<$np8Agj~u5$=Jq|pBvcU zciC+DzV8;-LUnkDZo)>CfKI-nYD~`+fv;9ddn-1EPL-NL=Ris?^!|WVEf<*Yl?%+j zkV0(fO{g)?h>r3=6JcM`RiXaAz2*I+@u^&0${3$Q+1QG*g^=A^Bmz`!40Rhe$rXaK z8=5GUx_sN=Tv->I4qbWqYP^we-NIYKwQ0-R=^e{^(6jKN`<%%{EgS`R^CwigdDj(P{KhUOJR zi%DG2iLE>LL_)iK&F+e+AVS~;?Ff+6R0l^EavUa9pe}r^6VaQgmqiy%k+$JU-31@+Pqe;w~J zIu`N%@fhwT4&F8avkA(hqC}JmKz_Y zj>?7bu6|FqPus^&My1d$B(4%nLwnqnPa_T_P1}J!g%?qgp}X>7z)M<~5}lDE*e^7( zh)0Y*M@4q0itke}P0^2|*DOOn4qk!sA~Msc6=QjS$Xec$(c@d>gh#y<0+avH49l|* z{&jQN>_YCsVWp!7pJByxYyM0J>ck3Rus2rf>EBXb9_Bg*1Qr~fx43NOE*ML$ciY?d zQ<{M+7~%h*klQ|}5;kmN!b`j43KJfRLnZ@zhwy?%t2_9w*tQ+_lKfC{kDXy}M!!KBE)SyE`Eg+Ee3iz`kU==(q4@)C==XyQKAK zO`Q-*mL@KOiHtnzlE$vovYIwi!6hW;Wj)~}cvWlhFT`DSxg(O5{e4Z2gR~zfX+L|o z_T#73FhnaH+_%&SJQbr)cZ@e5KW4S!lJU9T0`d;I#uzGD7K*}x>=NXeDb}CxFEtI- z{L@sUg51JsaZux)yrKXJjJsxpa~vtucsxt-=KkOjQ+C18+<@VfTTydM zqw?XngPP$%@>ATej!KTsU@PFcu~QD|ct<3OlEg3>^&VxM;uh^bbv`tJm=MheOW0hL z&_-|aNFQX>M~e4E=Q^cPEP4x*#y5o8V^s0y^Mn3znS_xt!g^)ob}KJHe4 z3J+HuTMWkrIuXEZjG&vbaEFK0OO*BLLp^_*$9GU8L`v0RImUxLTGUvRjD*jg&yCBH zAUaSZS{tSM>LzJDqO^8>+S7bbkPU~hR*SA(D7u#KZ|oucgs;S?vflBE6xzpo+Z2Rv zfq7h@#C>@@cr(WCF&PLBGS*WYF?7-jAfzU8VGNIOKOkJ(D9_$7u?dMzf5vk_>)<$o z=x?MR-cuBvM7+#pNBB-kUuXaxYYQ^zmfC_W`Y1)XsYPsOcYw!e+$!@cMXb1%Mb%+gdRio3#z!E1IJmayvRPYY z$Cd6>vz*XM$x>=sm+am$&1Xg0FP(>XE490CuRCvV5qrHm?kz@G51ze76Ojc;78>Km~Z@IV_Uhw{Lt-=xO7%{=Bk|lGYxhll~TN z#P36+rc3!v%FesTNyb{o4DK)gu^Xu-&bSP)a7|h?e;*j<)#)>^ z0qmZe^^3Xwc^Bh($+J+8l)@OM)Y<1&T0VDZG`|VYeU3kOrt)08A3R-0q=U!|ABX%f zX<{j-dB^5sm1I!k<)V6tAQ3XFY3Q67zE6{lZO@;tJ7+a1EZ_ zBZJCSCDbrhQ-J0ccLg$}fL`vq-yT`gB5mSz5Zm`>RQu`|oc=alwB}Uklwb=dL79hM zJ|G5ELob7)j^5HCU#)vovs@J2Q!a{r1=lscD@vbdiQAR>1&YjISHt4gNT99Cwju#@ zl6v^+L+*@fDkSO+@_=F0cuL0h$@n)B|I!tKR{RXPR+xkSG?VF)6v+<5=uEJOWv!6_ z;;tl4Bv?3bzkOT87r~}2t_#qzVZ2k3i*GCjQTEw@aLN@9fD`yCl-2=Y6aYr`%+w<3 z(`ccqBxARz50LU&qLWjkaSc$Spm~gA(!3@qZ(nU*6W$v^B_=-h(MM#$@r?ASg`TQ$ z%_}A)N5{2TUZ9`^)w zT)>OmIEWZ6xG+D-HYt_SmLsUdZOgRSLnoNuCvh@ zNkq|CBJ_%SZo?r*r1Bo{1iVozrE!kvjSln+iC&DFYt*Y$z5!TrJCagKC`}bRA^3KN z3V^Te7**=Z6*)Ve4-K1#>rhh?bcA})s{TWyPb9mszhw7$Lfs=-^8Y;}(3-_hi72$l z$5fLr6U-UA&ZAIO8iWU8dcsW`vPW0=AMhuRi;QlQ%pInD;3@lO%N~d1OsYn)m zqkM#=i}3a*)#SPoI7D=h2|D)QL3byB122@eqdY4YfWblkKG+QovV*@*7tEru7v3a@ zt=%GHuvY*SmO^@u9yEN+8(_DHu7I@)owzsX0`Oos%-tD+k=JOa>Gz6U??A+dChe}c zo-F-9E2%KK1RG>rcmzsy6byP$N^Yl$mOCdN!EI(Gx5vdh&7G*V}7x!O1~ZOJ^xV!8?71?3{<$<*M;}(Ca1SDP^bQJ(XX?dniZD zm+xN!4+PcyP=lm{g=KrVkCxK?*rlI9X6y?8&>rerMjOGDU5<3qvIbnhnz58(0UtJl zDm2{`qIKsLIP6&5+ZVvZbuo86?sZo=`i+?GuB;&8Q{Wim+ZF0p)<+%5I|w5^j*%oc z#;Tgo4`R@>0{Mf!{N(ba70&j2Ph&5XX{BO^VhrgzMBMHOuTS)Cb}xU6#!SlCOwYEj zr}<)6!SLaBcV4x$75}F4R2bG5DvoLyjW{iI;nJJ4s2RE^bjDI_J##8D?kOi|Rkhfw zgZ@b+?+V#fCqeUV^x_I~i9I*&r}oCaWk`OK;czc*VGOGk=8kEN@@<|sh$h4*lWd$! z3MP{be-q(CHPg2I1XiiVK}HDCrypG~JcZ;0c9kuqX|S4Xc#$_GqeGp7uT+jN(j@Sj z$I7lpvf5Wpg|#WZ`o-$a11H%7yLr-FGOINP=Lj1s{;6B<^`550RQ?8 zf^Ag5yWDvO!0*B;uL6EW2Y|m0BgFtdH3sm+HURvGs0P&le~$)uND&$EsT#Es(9-~m z)F5+dKzAuXC+fgWE(6d9V$vMw9sqs8c`DG)lYx#0VN@M|(nDnaJOi4g3~(%6uOpk8 zy^I3^T!A;}omVZpkR=Qur4vzUYz<1eF_j`iF1kd)A%LZ?C~4f+c7`!|q4ML1U`&BSuM+HWMBxohHZ{vVj!> zz$8bWZxgoq)<2&%_LW(I9`D6%SOcTI^q3g{C5D}dgDk9M{50u=k-tTjMR0{_qR8LO zj)&@D!4RvkNCT3JBnq|0@I&239Y648#6l3wz(59mz{;!1p`Ot|o8X4pW<59jMd5}} zGngTS8Z|~TDAb}#27ePTU8T-vs$75o!fUq>D}-7NoX`)`ZS0Qw!3ft3RvBRkX9UAD zVjplW2w8mqd!ZH3eg+2(+8RG3Qwe_zGqC4jv;%i8Q%1-OaYjf{8NtOF0m4Vm2$$8# zjNlTCkV=dY>3|U$%QZ%DX^fB>!w4jYzzBhFI3u_;Mp#8-gAh3rxC9ZZOppvJgabQC z1H97)CPQ6-Yt?~NPEQ}-*{xB|yNPpsz$Vrk&(Vu{TEe8bY*CzV5xtH@*y=%rch!GEx zPYv=}Cxl}4r=D~@N`@cEHB*On&lBpVHFZaZN5n)^Lw{L*KtSvZRie(75Dc|0Q7pSxzS)E34Ain0g6q?xv{UKcC_$5 zs}dJk0j=amMTG+@8dzuMZsgdRyr9|rHO8i7A9aC zpmmZ!y62OWija>WDqp%{q|V8gIs1P_`SQ&WGx>7EwZ|e~8le(t0({y*z;-GQ z3Pm3kzL%0RZZ5x@uQ>{Q-PN6h@8cM$bMSSsUlG3Nf=uHDM?djekQtqk-x9PP4Zc5q z1NgS$5DQ;Q_ZG&IY$dToQn}3q_FZ$1A|YOVM*x;P7Ai@yT4;m;j1(gwu&;{2G))#d z;Yd0_tHOd7OT#mj$5HY-0>39iJJW!@@?QY9go6TXSzgHfoyam( zfc;leq0NDP*3|}JhgxE!@wm4;3G2^h$G|$!sslB&?^Xfnv0v&TeXj;-R21+PNe5^s z*#2hze~_J`!J3<*Cql)J1NFUd2{rb^O-Pkc0PSz#aQ^Ic70&0%a8{mJDB#SW2K)a< zRnLbwKI;IWd>RfM%3L2wvoJzG&R-=y_QDgRw(X}jnLv&o$BooP>168!54r!TB4~I=)(kf zvH(L((7hE%$f~ytiC%h;FJ02g^={R^q&qdW`&3N5v7c&tA{%BiZFmye7i3qR2FT-m zbt<>~)P0%`vKe+4ZV0k|@Kwk}4)8zS2=G6SgCO!ad9C7T_Su5KiAnL(}9nNJHn_^0%Gm3%UJQ3}gVXg)I4zioR5bq6*$n3t95evCVYcetM!7 zW_&X@<68`{os7AX8Q%=>K7OhZypTL_XPJ)vH%;FF^&UXNIAb`-;8pcGoy&xrhgSaE ze~>C{4(oYW8ekny&3CNP0h?QT7Qjx&NCseA`fqRlR1fao%744-H9%hR-)5Ymg1)o< z+cFIW@ZZixHa@!&2TguYp-2Znj-0I)&^9-|(2!vbZ^-a>-jHFf~6_F8k8aV#}p#>k8IQl!Yd3P zn49!%b8J5PdjmG(d|(@1)gkk_4mjsh3}is2g%4~!DoQoZ`3fTvsgrDiR0s1gH2r~a zhPetG5$(D73W?gu2%0kaSGR|DwTE_~T^I^w+Cz2ip$*t@sXg@f_Rt!*!@wRvMh$#q zIWvY-BMWa?BN9jyZ`nlyR9sL0^=1=fhcq2^jE!CVB?w{)4nz=K-kCaY{H<)pS^(W# z_iwpE;7j)1=L3j&cto=JO+_*CEPZ^mFBgP{gqg|`=UUVa3!2J z4-odrX%lLNUqxBC2|rjuNnZ-G(=`#t)zULiJkZL2`QsQxETjU?kS(f^@W^e#4O+vkIW@4Y(FWS z=1{-+awF6=T~$E+e&lP&Px&8G&%;1Q$je$2_m|1KDjP0i)-!X%~tPFhaN27HIC^vg* zwn1qPeGd4~#X*6)@@c6*>DG8GNNgt1X(6f(PdA9Fc>hfbUPo1WQi#>Wu&9HE1E4#(KB`uy4VEU>*l=PV%(mYcx;rZXwmv zoaiId3`DPox1jn}t94Y*ef6}^n^65l7|B5OmTuz5KGM^@3~zE1ySOV?7slgmV$w~i z#|DB-Jz}W8H-7W9XBDx@S5Y;tGhWC%d6}Nh3EtKZ!ZXku?vTMkhIyza6Wz#Z&kbuF;G!sH*Sm z0l?qDK?68nFI8iq19-m#rP%`BW5ldfs@CGGLVlDzql33<_L{)EeQM|6ebongc&{{t zH>gkta?|)K2)hM@9qDUE*z++Ljj%fb>b$)wZ3EO(pa-!@IB1~e-#EOzBtM9-cVkr~ zzooDcKf$R0H8u($e5XCnH*^ipio+l>UqLfG5*9{y8d!kw1l%6RAz_X>bP< zOxgvwkHbM@0!3fRB%1Gbohkz#N&BnCG_#8UhIRy}S22OHr8?K^?M2o5R&x%@hc{sT?d0xwjtLmpB~{pWEVT9$QymJd<5VL*$O z{zHXds%87j^q<~lY%+mYkaSl6xgFkGo&NJ7pqqh%3SHS>&@p_^Bz4@J?%yu#7`}TS z?Ie6d7^pMw{m15C4ZevUGx#>~J;XZ;-wW5OVjs@Y`VRo#%{ausm-mZORCw9HkM%&8 zUzy4_zz1ewpI$7cq`CQ%W8D0U9uZLH(L>c<+7+Me;l@ZZl#!O)QDSRolYp~GY=xUo zNo-B#X^$SwO#qV%qJ)PJd1ZU7y)=C3ErV_4;|q~4ND;%dpwx{$aThwd!n&g9p?8}| zQl?h5$xb{7p+xpi1TW)t|KKELiJ-h>#gL7gkuIEhvL;=CpRD(Z{&6tDk8qjE`Qmt? z6lohUqzQj7>G0;R&etajCQ#GHk&9_a8{hR1?p4ypx&Oc-ZTvcn)VZ|r495zpKLz>zK%oByh$jwc&Z$6ZS5IL8V_8-qw4Z-CQ6O&y<~YQ{d# z1_X*k>NsU&QZ73tg$e11h9)FOoPXG-7g5oAplAgS3W}8VTXktF@i7DcB(sXAE%8I! zkkcYCT}cd&&CeP7Anxrhk_{Q}-RO-GeiCW`6|ssj;W$)ltJ zzKgaY+PeFz_;=%{Azh0r@yXAci8T9{^RY#i7v?1PD@JJrArF((}PvG##pZ--u)N;)SBAZ#)22vz4i zRAd4AiI^Ek3y&oKeP@k?R``Bp@WV(rYYV`C8V+2scM<8qagbx9Kk{ufe7O{l=g={#52i(F+`Yv(#3rU)1!aU$1rE?L@K zL<|Tv4CrM@kge442qXJAUVHTMxvVE zEF-aLEs%(Xz9!MP)xG>50)eSmSGNLqUH~)AUW0F$ctI+7!Pg-`;$#JKvYGr(JrZ$K zigX-oymaZ?=)?qhFG1Yt$v6lfE~@uXc7zbxDfBit+vvqE4xZ>Zw4BSaRVC)}eskM_ z5)az8<0tH|lnA^|azslKkd;eVr3q3gh?i4X%;c20$pltq!0I3CfYsY@kP)ij)5?A~ zvEC5~H?`ldAT`-sh5LTAz^tkw#Aec*a5wH%R0Qq^vB*7m1|!9&*h6$#W8_;Q`yDB~ z$GszDr%(}~s4Dh5X-sLnjLE`&C&vi4-+_bC_?{VLA8H8Z=DTGr*@U}fwSj8M9L~XaV?NslIOwM1`6k(xd%HT2jfv>1=+;-3j{jZQQ%SfgcBs z1BHK7_>;>W$~Trfv---B4+4hfYTf&}0{*fu1%g2}LxuD^c&C6rSL;;xo2YdwFj99R7O8s9L;-FsG(kY+Db|Z^A((f0h1K`^7?^-atCB zIp8lAGt(41&3+MpUxbP;Rk7ptrG;YW#z--Mw{kQ zrBYfmyVANFU>FWUSi*Zl^PW0ZXcwW(cmH=lL8Yn$3p65g_ zF%{k&#g`tyKn8eQ#PgC~*F*c4#+NplI<}4%FD27=C*n(=qos;Q+AV7V>2GjQAuYZr z@?}Jve;qV|MVmYk>6C%S6|giS6gbsY-+Q{|d(V`8?^&wveTe3Md5lzLbM_cM(txda zxpXlAs-g>S9LtbY^N1L9P4JG6@x716+Kn)G$!mIqeWtD5v@~nJ_c1~vi}k(d018ua zA^G34@JUEbM-*+_p-`-jL5AQVoU-`emzuyY~nE9`de~%IW ze<%FoV2XcPKSyBA6LFBK1saFWkwToFN;X)k%;`9pMx2gMFL8P*McL97PETcTLP52_ zbZ}S!5Y0oDNOKlGD3lB!ggvRvyFYa+Gb(OL|Oi5S*SYN7+*OVo0jE9A(QC zQMMsUlx+ll8Y64zUN9Fl_01Y{dx^P~1@ibFW((xBp?bsyFvQP$c97XMWP0KMcoWD> z!@+<|{G;%5$M`hCCaf+~d^SS4wb1C7ULf$PT3s4GMaPZ@5I`e*^1z0QPZN#)e2gUH zQweNXSY7wNAn+-yu8kT#NvlugR+j}nNwjwYpJaKNHk5cDo=(+ad)jxZmaic7*e4KV zTahFqOK2c9h#g1ScpP*{)#1~l`a`f;Aoi-^D{_kL<^s#65<7C2NSeZqUX}^n52ww0 zQM_{=zz!Bx-CU-<$gNsWvwMH6Zs|9CXOl@#_#X{fqouKprJFs2W$Arg3>? zjVoQ%xH1*Qr?G5Oa?MxVy6hM^9BT=Fb*tc8ZVB=vV+(`iW{eagheyQ7;SoaP+V`wp z4x_$U@s=1ht{iKPixeA0J0z(L(1YY@$V`cw$uFE{h9w8{>_8s zX3f792YxaC79uZK7S7<`mtF#LpTj|iTpj;H9a7>CydMy7#zWA$-d7JnkHu;8h{KR9 zj>@A%943ZkRLT(t-WKSN4n*-k&ec$0%c>#Zjq?I6&zTMVa6e?hDpM zrqxJ;+%@T-#*7{kzwxbs^pS?}@)-0PS_8e?$kC@n8ivWDSDOR1<$~BXECJ}x`m)~U zwY>eOvj<2cHTP#OKgXc`#MKr)ybQN0 z%Fk^CM+=wpFbrf+ek^JWA6g|us1}n(3MDjIR7f$ZkZM8I7m3eMvkVy8+kiX3r zlb8gtnpGG!F9k~E3d7M~s|wBq;u%U6mUxDeEUP|ay{4Zg+gRmlfPN_sMsAVwl{ydq zYmkC!0sq9aJBI(Mc$-ea|Mkqy!T*#eeq;F0y+won26l|_f5`yc90JhlM-)9D7_>$6`3^f%q4gFg55TFCV)Fp`1BEz6i|AJ)VFNx&cKB{>Q- zo09x7=|VZyx1!8~J_ z-87{alKyW`0W1H5gTRV{511}Ievg)Lz=mwI05Qq3%_8Syz;~p}$+(3yRdbsq`3!*; z%ji}1jRGy)X5q1W3!7!r=_*>3q$G>jebz$)Euzd7S<2=%i=6PFpoM}dLt#~W$s0U0 z$iCKa!%G;{ESZCYENql?%#ciSktHLtEJQlJ=9)HpD4vHbi;q$KAu|oKEZSB9J%@0R znMT2n>>rBDr$2^x{B}}C%_Z2Z(_)xNvoHk{RW8yoQAhFkRE!kEL>8W*sGl2;|D%RI#N#h~0@xddgN!|cygQn`F$fwqNkP-@iyH<4 zu1C#q+PeT~(q%Xu)!w*+QVsjapC#J5YHOI=xE9MJqaqqdBk71(bwGL3RrFhRR z@?oa`uUXQ7udrmX!L$yi?T5~8ALM-Ep05$LC^X&R~e(A1)4GuBzxU(Y(^;EoSX znLQKF8zD5Cm6)sMAp7%!z*7_l1IsAF>3Pf@4 zK@h~!6n!IAMU=ulnK2oEl*@^XzqGsb+@sS6jT(kdH3Lw+geWR$k%88zA&IMlmYIIP zyH3YNuk2E}NYMu^AF4c1&bqDAumpXu>3(48D;#7j>G6X}YW!rvO+b?=Kh@n}iKb~M z34XE+5iY(~hbEPuOoZI=7%4^(v_R7hf7PSub&a1iYl@i0gtm#{I^ZWutLn9DWK>bF zj_x0+s8X2f=nvND<0cJV@H&sY59k_-gThn_zSQ*xcOKo|J)P8Tb4Gfz-%&91@f;n7 zIrnP+2eR+&zHulU5hMF3eh1m-{j(lr+XYim z=*%dFOhRYGR5_qhGKbaB8P35}eMggpJbY&<3rl9}WZ{z^sAyE;cRz0uLG}|$!sQhV z@w@tafZEMCD9naW1-~l4b*%5bRc?v3$$gH3wd?<&!&*oBo)aT=j?u1NsmI!HrSGjN z(_yE_`zm%itM9FX4Wa3KdKFhc*IzLQy|rZAQT_k_0Cy1_R1Q+`*E#tJ zB|ct4n#;!`QpC-bcy^q?rlqeiX_mkySK>R$Z@3>L$=FovV2k_)M^s=__zHFMk;I?o zwlk5BB)hnL#Am1T8~%#wUDM`OO}+WM%f3TJK6ZW*dLfPe&Kh$`hAsUS-+SWlWRVzunWV?l9W*9f ztGtPruHc${xG9tfMvE32eD%>P9eMvkwTW2IlPvHs6Eo6$xV%}O=|eC+s=9YVO_90C zX=7vl0yvMtLAUVtI>B10(mXWCjLb8-Bp;XqB z)NgZ{_^>-hCTiX!;lr)|oxl#auvRJ9F;U&8Vx$uF$jV)FArYm#`<3*cQ`B;o`e%VBVh=;3K&P4s= z9l-K598_6JUle|_TJInsJKOJO5Gn5F60)Y}Q6%J-mkZo-3CVN)EIfsaF;a|#wD1&u zew&{2bnBf_IQ`OoH-Ag9;K=t~dX7}qyUsrxoJ##}G#p~RyZ=wX;XOF0I28C>)@(C4?p%auU%`mOLH zSd3pY@r}oO(et;$yOf_Bf?*d^r3@?VCJpya=Pd(Yw;f_kv`UlkG0~XPJGmhk6q%UL3}Xr(JVe%#fJ^x!6;7g;SnDx z;v-Fb(9?s_3NPIsWG8BkUGG$KE_p-E1oQ-zbDbfjv8GTO{&E5zU&d)pO&SQYZ~Vl7hSz|6KASc@7>T(SeU=1a)(+4l*c+ig9~chnmN{ zi*=gEyXzFq!@V3W8U9P&D9A=Wr_%CeHuk^@(DMJ{pe}!0e`x}h#k8{DMXD;brbi+> z^`;kA9yO;&5<9wBLO+EUO!TLhli1Op{<_~=5}KonSOa9ovaZHc(3y9tj?VrE5VWGR zHytr_X3?L1;4OM8Lkf)C$5PjyzMd#7zCZnrs2^?V(Vt%Qq5oJT2=4R(mznL_`1?|j z1ClW*YwESN3N_5j7ac8+<*C?@S;HF4xc#>RYx{5@tSRybvyf9_JL6B@d4(lnuC^Nx z6Q4g-RieWTsRCA*IRzudNB|3e@@-4>xcM#p$?p~Gm^AGj6)nf&Pws}M&GLExfAXc3 zz(xrU#`QqpgZDGr4N;r|{gFg5FYi%v%DpUbIpAmA@nmm;K!#<6HPp`D- zcycF3is^V_QS*P~CLlxYctV~Kx!Xx95-d`Aw-Z{rsAUau%hXOMa{ak(e_4-B?R1jK zJDu?UC0+BWe+eXYOt+J4dJ~*&JYDW~GRr++w9UNV$yILwag!YRzOCrdAX>4+O-#uw zmy_G6zn_dWWO_Uv2GSnFLFFGTo^rn1F~m3jM0%?ELh7}}u#x5)5dv;h5$;ve%Sl7C zVxy1SvA?}>Zy<}nSqzvfIdD6_bXzRI~gs+>PU>#IkEc4 z0=-z>Mr0x+R|-i?+p$%zRxrJIOWU42e6iPmJ(CQ>eA6RABD@gTsVF%4qXg(gz^ z22w83Kq{H_S)&Tnk;=5prW7Mo-5LV15*FSJ1Wv#~k3fZgf0leb7b>-deBFRu!#j-l zd=bFCosq9MVx$x>fcmXxi6M9wUzGIcIA3v+Ee2}ltEC!OEz#&Gy za+TlEpBuyoq>iSHOCX=f)9WH)QLrTF)a z!0l!nbPTBHKcEr|r<`wh4EaH;pfp>cawPUHH?U!>zu>ZQI#k}>0V==yJ`R-@YcK4;tS~Wk=)(^}hiqOTj@w8R4r5&K}s`&7|wlhH}_S zuAbZ9J4n%?ZQ>9pB4b>{iO3#Dm_q6YH5>-4yLi`dXm1Gx{o<8dpz0Sh2@hvT_$Fut)}Ueu3m;lvhk zEij^kY`dn%@R$%xF0-o0j|+f2xhnFU7gXGh{aFtVvNzG_ST-aO1e&%G_?wD@0e`=i z|Kwb#*cO=E@SPEJu{CD<@^zT&$bWJZ1~OvKyvFQ{YxJ1=?foYM@dAqfWa0BF+J2V* zx5vOFKen_hl`31xab>f zB;FZZl+MxP;x9BJC2|>R@qT{2-;*%A70CbitP1%d@y}3e%jAN>Z!|c=$j&VXoJZiG z@P-0!V?TaUdgU5R`UWjR^^c^nvq=#*mtE_c4N%wj9TOJzXQOmrr$CIA7O@B;8NfaP z`>_}|^`-)Q*kyZX>jD3e0(dH}r@A|`NvW_MUzKVy${e=XkHymNO2@=i&F`jXR19=B zAFIxQhBxK`4X@z9(V*x9D#>GhE-W;ZW?)@!`8X-l=4kMJ6N83W4d9YI9U40F7aqjU zzJulcq}}cTwvtlT?H0r(Yn%v8 z`o0T&BTZ|TLJUtN@89Icer0DSAnbhk*@d>Ud#i)UZ))NIX#B^~ropH1BZx=y<^Jh9 z;HC-(O=A5#epx_TuQ|W;5cAVg6=V73tc!53Vz_q1FV)z@ymS0=#;pGozg%;nj$hV3 z@w52lumLAOTmzhZkAuc9$FP1JAO+SO5zD`h5nQnz+J{E!5Yf^4F%%*AJ#40L%D|bAW&l4!>aim<1i&0u4W~7&OH4!-;sCPVvJF7^!n; z==*y;8h*?5W13IL533(lQE@Em$Lkt8uzobo20H$UgOMM8mVa#M!F%uh{>vY<9 z?J7K6hn9}w7bjw*7_?Xz_DiqOqvf~uudN%VZxk4zW85FO!6vH@YmoA%E?1$wy!wqE`6DA@XNs193{?qH=0&%sDB*s{uh zpP|QAHO7S68y{^l$p<8l8if#*&YWm~(dqvAF1(1U8_#%1#hQ{2X!N8V?cqVT$+IpA8%7*!$<+lw*lkk9a{XUtU}4MA+%v^K^K95IEpm zYJ%6A&*JcEk+qw7nI5kj1YY9{g=I$3XJjiGj|!I_rGM@RFPY)AKPHN0M8@easqcU3 zh$?2iHumN3fzJjUtnexGs{x-nb_MeSyT_hye;@Q)3mH7PAw~vk*cGN%VYa~TQS?;0hAxW!GQ9Z_0@oHjekwLb6}M0+6B|jaGZP51i5f=1 z#A%lUqbK2@!>EE!;O=Psae70y1_hh<$9Z%QAWT_G5I&_2A7bBp$EcVcz}`L=2s@Vk zH~|{A)BSOtF9GuYL;Z2SI|t~}@BC%xk8|GLz#joY?EKZ){x}zE_<|)kcRKKOH4ZWO zYDy;m73n>+xeE7Hp?J*S%C3WoZK2~hJ`ubm>o_`}xmXIlcpb9(pyGsXv04V-`B-Hm zq25^R?{P-4ei4j-iR7X&e>1#OvTJHHcfPg4HHFyHX)y(39?9QIyD`59ryCqm@r`VT zU@F=|caFvQeC#LBSH+qW^gj(i?Sq2=D$#!vvIXV-gN4#z5eSsF3Ll`qh4mv{-dsXG zx7#40;^KK*GX+%n610rqK!p`10_sW(WDrmm-oN*X^x`QhAd5)Euh8G|RLoV0+b#I3 zDt?aE-|;56=w*){`a8aLDWJOs2Zdx6`SSl$zJ59g#scAQePlp55`EN7p@h=0=PVt@ z4|IU>`54K7@d@5JF+mVHUw?O@9_Rnx=IgIJQ@6gI@E3)^{>$?9;Uko(8TtC(Oa(Q6 zje|nXntdw!7k&l(hqP34=@R_#D8zPMx{lZ$?10$1Vx$;iv(kSi>51(>s{fp!qmO^D zROn;gFVTOtYUuPr|0xAJPr^Y%r<#upeEzKcBHEyWLMbxeFXB%h0PL`QRHevtzlbMK z2Np>w@>DsxuRzVw(e{fNO2c-#-~9gufYJYh{UY8!Ek;2y>=%*zC$1pD{tn#;Dq!>0#jgk4OBJlm? zcs(25qpb5-Z`8oIZa+E-dRy#AXK8L^W76EQN0HWBqbj>8+sxxZ7&S%H*XSW~a{p@@ z=;6RX9;0=31QBiT97V$RkFZ?QLpXScF@$~}ws&h_TafRkOd!T?mch0Ht zI};~P0!EUduQ=x{N;0k*C!jB!bL8-Ym2Pz6Q0hTUe_?8ZkOillNq=E-#ChO|JNaQV zr%l;5{))2GhC&r&OD6NpmUyDQNO4eF3)6Gt6o;ENL?Bd=GZ~2R;hQTc@UX)HgUWxosMyJhAhbUt!rb0n}&D)y{-`l+YR$|!b8*Ecr=(LzUL36ts~#SIx-BTIJidm_{J9NHfV?ZD;hs@VYhy2?-7 z6+dEV-!5q@zruZMVuH<<5okKJe@$_5@d>zcQ}zA<_DvbpzFqFyJSY#AitFVGG}$*F z`ua_}EE3ShlDQn&{i@&f8rSnYN34GqJs$(($(88GM*S`z8M# zdQ7dqjoy+!&0ZY|)Jp*tb>u`H%XoQRz4$H#_64yH;LjCge+In5OZFs$dis6}bt}ZC z0aBo;v5)*k`iS)g2Zc8{q-}`1OFLO2NrAvVSSv+5Z;r9mBzXfZGb26e*%!-tg~yh$ z?a=rxJ=&k{MTXhu5=0fjIuK%2BTV|NM2<#{6QKm&%1B=|lpA0zo$^rn{Zzg)gU z<>yFS*+pYO(Mgf6Qh_6q?~n?dk$eO^SZxwLueQJ;KAiLsZghpeal!PcmVmiw_0l2x zr@kM`dtsErxG-GfLa_f^fC)&jl>!I?7Jx(5gEWcww}?81N!x;;2Idsgls**`-HTDT zu}5gsS{GnPqjtrpMUAVZB@I%j9<)aFeHWCllK~<8O7o?E-#HEd^Y55#n{A6Eu?Nu8 zh-JFyR6{Vx9>$NnEReBUe5H%nVq78x_DIFMFy`c_V{9~a9UX@(FDhZx6L2dYxEW8d z;|V2FU-l!tOlSwtM$elhj}y6o4aP`1wo$(-@(lh>wIP8BL{L1*tL*efu_m}X)3n{C zxU-9wpQ)R@dD&Lzz_`*}TexB~UgoIU!c8aR4RqSV2+|ff(O7Jv-kpYx*B0cyJnEJv z^1efJ`~aFkTWBEUz`Kb$1VsW-H=Q7>(CGNQv>rta+@ zqcsfWyG#v1Z3*0@dv7&p4Wt^z&r9~c%DYS%=B0RFvx2PX0aerY+E|wWXw8O$ig@{p zf`4^A>$soU0VuH+YQ*x5Vj+_&aN{Gq52fN>B@v~={0EE_qefWd&)q)?*qrDHi!D%S z0pLl6zjFQ@J4se0s4~r0sj3p4&3~AxMRY0uVLVU~!hvHzfj^k**!$zpAkErbt!Swg z*ih99EgMCs702VHWQUlW_ua5^iamvqV$=$Y#0LBMN?0{t)|Z z!+*!?Z+RAPMvB3Rg`#(JjvgaV z3H~ruzEV`LrK)@-Xg*61bt*UsnDC(MN!gdDA~~+%ltNqkd=J~40_Nx&n>81Dm%prx z7h;t7r|O=V4zVJ&QeaiWzwOh_{i!+o5+@N>gbZ-r*nf0n=6- z6qpiyYyM%rnK=qYkTmU4{lkYb1q-O&zTODc7S&rQgv@h&RH(WumlGT;8t?cqkP))2 zx~4nWnWhzXBO2~JJ5mo>**^>gwS|DoG-D3V_a>BYK>ue!mZA}|iwGIOZRWt81lYvW z?(6IHw98wynLmIJezn&A2DajTe!%x`9Q5!tdOddZ<4^W12BENopNaXOgl<8VL-> ze``t-PtA4XHyDf{@XgTo;&E^u=0;v6vE|9Jn2bN5J&Klr+jBJV;lx3Y52AM-40MY9 zu3F>}6GMKmm3H&!T0!Zub`uu~*>JpoI*){e6{wp;LN3KXGNt$HC=Yu5Z~=3n+VB)B zUX#H$qM{^dK)P(mhMI+(D5)zea!#|tm*nfDNtY9cp`n@$-lEMv|JX$a(76`&ELiT-IrdO zoC7GbgL|NqJ#t}t`~Dy3&9{;_;1=;JpV?)1z@9>1t2=xczvDqtYsO)z9%RU#RmYKv z_e63XzC-ScztBZ+XDmzxe?}Lu=*>;h{3iPmUu*eX$u&59*fVdCl$5*du+3w$&Fdot z+rrfYGuDOIwuM^2D|Zynk1Xsli%d- zo%Egi=KQuuDk&}2C68u?}T%~bpgo*2Y^hD1%RML24oSO znlWyLKvVX6tmY!j;>&64(9NW{A?g?uq|o**_A;%M1V9H)nL0_z8@$3(kcP@gv6!V^z@WxN~6uT{8Y< z+!fd*74P64h7n_{zjDCCU_TNavaYlwvSbIFO-n8w9oV7sGZfR?g$VyNlZ6_*{3zR{kX?)UQ3@ z%9$L&mD@_9erJ%4fppy8ozUDpdh1%?0a&W&i~kEjQ71vG24UCwci?tgG=Pdvr_@~Q z-$(z}`WeS8eq^Wm9QeNtw~?0O%XgNa==S(`xO>|`5B`0iha68h-;uKaL0o}x3V}H` zZ4iJ{%)&=J?&aJw9@vp5RWCcjNikU(+ZJ9oFr!)_#fNa`R*OvDV*QDVhkS|mSXX6LbA<17K$-=1s zymwLm7C0ojK`;Are>mjzTYCJuO5(h)(zk`tfKz!Tr`usG!T)TV$6+H3MgxpJ0!AuZ z{8k}OKxGS8%48(y=YU~+Gykr1L<*%z)4clUJlM-&E2ZaLh3D`G-rwC}E21;Sx+kA$ zcyc%8$>Jr|^~+wi)UbYi_f7}vSN{ui{^-%_`qgY$zu;Q~7W^(P!=;`@Neq}!4WN+zsm@#^rB4P>IaM-{KOuM18l1NE%##OIuWq~ZSPRS-Qlb46+tCxD;jti46SHR>W2H3Ry37_D2rA!FJh#a zRx}npv{SM`ENX|Z*Jw<%q7iLqxHs6?*((JmL2{6hyIWS&omywFbl%yk%Bri^G&uWt zS1)QmF-?HY<9%5a*peY3Ll+O5n=%gPGW7*lg8b1$i=jzKjV>1gD9U(fq}*5RCCOufI) z&p!@0%z2;pdG_adKTERs#NDuBc|R{$25B4PYSe9z4NKvsB<#YD{=MxLD;5a(79=I^ z#6^*CgpY09 zZIZsG+Jejw6t>{tXO&~^wAP=}EjaiY*v4_xmU*;5yyq~qI4rU3CK?)>Z}lY(^I6vl zr+O2-ZmW=Q7e*%fT`+w><}NbgE!d0TO7Oeb!HD2#qEnL^tl%BW7IE7vT~M*Xii{+o zt&ocpkA$3j$ExB^0_4x7K&7*Z%#d7bSyi%-4gETUKFn?eD`phr(7DY8L9#2F6zqu; z|2P^_u<=YWsUuRUq=>>8g2aDKGNpMbx&iHKeZy^~v+{$hHwm7&O zo{-j7IZIT@M}KlClZ94qxs*3Kz(elgF;>tpzO2a zsA*o>y5e&tF7Oi!EWY$ae|nI9^QSYjq-%?a!C3(yo)ycXhAWv#Y&8$}v1dyCOK<1j|=V(o6 zShY7%aiVaAH@5#2dr?Pl)X*fyC~FZ=n(zU=mtd)HC8Q_x`rLc9mF}Rmg;g5vWb3m^ zbO?k3;V=^fU1+bHa>eh6H*18xle@UZPcCQJWgD!;29-5r{*K~(+g}8!ky;=YVJ#*# zOx_o^Ejw&+2J(gd!dl`~&Xt?Io}hpLPhW87`YlJG!njYbGAEX$({?7Yz1fHl*ydda zKv1xDC||^zEt10vT2N>kaSJ#k^L7GYa}IO1oliGy=By5}?*-fCH8?g;I|YUcBdvCL zlH}jx>E#ED|Lypr_$1UBSo_Or zn#zvCHEu=Q*ze94uL9rr=?t0Z(4WPLHH#5zeH@k!d78wcOMtEb_T}y6oeIuFasgN{ zp;wjgExv=EwfH1)K0)Ph@x?-6Bk#8f&%~Y^f;F-ca=o)FhD;(Ho74Ued%h>Yjjwd?2n2a06KQB;W20c2;Dlq{fSO0B*xETD3#{OzxhjFA$0#IR~JiBn3x3B?<%$wI( zAk4I;1#EMd6YR1`!KL{f0o%NE`v0bnK-06+)(NZAkc3f(&*wjm&*A1%+6KP5N?5yP zU)oM2c%*TgboPp_aBtn>`b&ucn3%qcR?2JijpHxu?R+H~8 z5bwvMeAX*L5dtFmg~7BMcUmyFKrF`R^g_AfWVV@9388iibl0hf_T)-mz|9b?x5hySRhA2xf8t-ZA^lwpP)s&H^yyFY_lXcPz-=Z8=8}VhWn}##~`-tU ze&sP(AMpgY)_+E*zIi?uBsT&;9T5kCcuiYX9gHJxby*=y5%&znA!rrqY@18m0qXS4 zh)G-LEvc(M9Jhl0pqf>uGxlsF?1jaYwPVg-?6&zK?6mraxH*4G231x!$7MEp(eu`Bb*AOKBoW{crq;Tj~=8y1c(mut?3lhvHIQOEA%P+_5?8c0Q$Ok+E?(F zN1}^~RftbpTlQU0;=gdSHiMb9zlX>a zeLsUmE?6XU2h-==IR&^^Jd!%>VYoyjBq1EhF+%2-x3Dp83yiDkBi6J{8VyQcKC~}x z3qDsqZ5TA{;nY)XbDt$N$^H@l;tKi;|2EgRD$XWLINRu`fk>Qln5{AY8v1nL7X;X} z!!U@$tl>WRvs=6w+zybDHGBzuKinD~%>OP~!`V$fD_^jhYaxzBm6z#ZHoFB9*491- z+@4O{o?-W=b7oKH%#N

B$ut$&$AfRJ^TG4-l>uZz~11w_6-QAGYPFzMf1(acCDZ zE*lxRg|i6b!xGZg>tX3j{EWT%+UoCO6-vluk?>uK`yvPr?OOir#Vb_z9V)eHO-tA^9W z0WdfL(F#c%#>>*sWiP9NxN0U3lO5|kRa_Fj*O{RSl29vqBzv{20ofNxuvtNRpu!JG z<>tfNoN7<2fdvOfvfXzokSokg@>x3~Rsslbw81}e?4M>8_SYv1{w-qKTE}77@pLav zQb>bm26}xi)Ra}l*dDGvw6m?O&n}SkY&G7)Ev9x?=w~@T&@%t$#qDxLEC0L9{7v30 z>^0dtmHcfSu>@Sc#MWgcjdoB>K~c8QOMIh~jF{CR-lE(GHx? zHpgvwp*4N9mw$xiKrgVrC4X#x&ZM~%c!uHKC_YRmvk91s(1@p({T1?@jnEWYO~JOz zf%!PaE{<0dsjQa%I?OZ~!?_yUV(?eKJ()EW!&Moy^|#Qy$8+E${_x^hHv3^WBb zphA$JPP<*!`b3su03|&9Y%DR#>dVDQpQ4K>DKHM|PICa7-3X#%hpq6_WJe89eGzQJ z*;k6or9b~zRMAnsN}k1S$>9gcrm#k<75N zq5knMm~n|$0RE2s#b-^N2;*fgNd}AUy?9s6+*b6x7{`A20c=rWwUA?t`^vFuY6shU z38gFB(cdkev(g=_ihe`%nTS5S35OapK+ik?ga4<28G3y&R-B-GxM2e}h3&K@BD@YC z12B4u=JZJZAc--a4-i0lfTlhY;kS@U&f^2nj1-eM%L-WX2X2*99_Qe7SzO*AE5M0` zqR9$)^GqzLBs@y_FDIrxG8TK4>m&28H%tT2B-m^MPq333K~Msyl>gEdboL}JTKZD+ ziwxn5#6C0lUh;fo_>MdfC47H`=86Ws*=L+I_`bMbh3~=ZqK5BG9ef9!3;6cKMF(Gf z@sBeg=d)aeQx6l$-TJH^ve17nZC}5}0B-FltVhWfC15KVEo+-Mh4Er3p(BabQFdW< zY);7D+m*q zGCeRaNfoke)aLp4OQoF}2;w2EsivJC(%qNcgrh4wq!JHlo={W=okv?-@5_n71|Zuh zYc5>2A$q*-w+;DG95b8+VCBCKtWhk` z0$=YM=%>H_8)xwiNp|~2CX0K^Kt^zj|Dqs&Nzk$5-bEBB*x?y)usX)mN4XVCmQ@}0 zHD7FrX0eB9v68y}C5;2dspKv`p93#TbzL}b67((GkL7gb9ntf zuwrsLYJG;&vy|`LEWb1LH{2@K|Iacz9sLvvQj!vp>;F&3Vvxf8bd(esXbGpIL4y=e zR-z9#TO}uCASU9wh<5#}z$mA=KXyT+%5&c$CU-7T4I+?fm$N~pXW=3X2mB;>QvM+a zDLa+ePlJPS=Az_yqPR{>3gVTF%XD9Rii38%6})Rhl3%iNq&UqE8%12(fO~PI$a3E* z2pV*xXrSfBVB|9z!IYlA-pjz zO%c$H=iNvz#7`AbP9sB_<$7LOI;$sDog{fKDD7t{?h3=kKR7jUFPfW^n#aQ~sPAXviN9*)ikKxs^uzQ6u+$ ztdILZm@=&HE1kNyI|s`>+=ogzy$#}dWGEY>`@<(Vy3K5wUBBQ~*`|4&Fk?~;dN&q| zM(6Hqj|CN*<~yv|td;swfEM9MBpv8_xG(cLm&!fdH-tRs=e{Q7K|;XFkY@$l2*@wD z_zbK!NsE>mW%&1yLZ)D%F7(aEZW^)l_K9Tw(W7fgnWMCS@`r$_-!}^_{HLwQqO>^IeVWDVX z{r0I^SU;}t2^5b=;D)_X%lIUqCg;@oP+KUrRw2%^uO*0Y9&H5i4X3K>j=h?g&IY*%5Gm1Q!|J$+CZCNY78fFgAhlC44V(vb!ehdMc&)h$DZ} z!1%rhF#hr3=wO`PP77lMT~&H+M$FtqMY39WeE~u~0c!3u1=Y}SIGY=z1=x+M;aei= z+f?Af!*ZMs;P%CZ6E&mf?uzQb9FIl>WTjy&$gFiHgSMdqQe@ihqUeBg$;3CN?e`vv zOxxS)G;n8Ls7YPNomeOu+Wxw&7Va-LqixLb*rCw@kZZ`|VG?GK4+*Z?`hpaa@)Cvr zHp+;?cP!9?e-Ib(G8Y*>30jps<`NYZXvwhjG@#;jT=en<@t>vI_|Lsc=p-!vZ$IUT zDEWVzkYf%86D!G5-GORz3W0T+)E;pZ9>uEdi6~YI-#da|%owAICQ^DAx5WnjfV;UZ z=9y_`hi!ilSh0ZuD@SlUEW1Hth9L{Efm>l$wZURiEX;P_JnTe{ht+9q9Xi^qg|}Ac z7XOB}-FFqfNNIrkiG7^4@5Z1B`-}vrTXbSiPee|!fHy@>Ju+9}t>kURF&h$g>HKW& z?qciZyX()!T~PE;&n$(IwVUU!SNJ_5PUSNo&yX})C*JiJk}#|6QvM&=a3gN~o06jO z1w_o&lz)k^G_v(qA(`Ym`Q$W77_H9`e+N&_87&UzKx9GbhWI~H2G{Z*8|a5Gdy$xP z1P)I20`YVI(U8w~FPw*G%YjLk^`mx+W6Vq=RR??Y%Wa#TBU`UNX_CPnO#@{M{8VYAU>&>CDrz!O@ z306G3OZ?&%I|9&(dk%Kbq`$$VvA9cT^p0iU@pOV|pFD7r+k&4d$N>ev+F;{dLLU#6 zJ||P819Ok2*fvGSScG4pFo1M_%JRl__NOwri~?VZ~k~i z^QrTAxaPZNFGmF|IrDyYzY7W)BKorh@f-=~!@ncvh8ol;6 z@}h~nPk?>gb(oPZOXP19rG0!CLah>LVM+uN0or<8Gy;U#6Fn7;6=aqhC9mMT-A>^H z=3rt-CTt5t5F|^vWGjpeaWh%G#-imGF9*D=wswT6t@1s%RSqFMOay2WLP)_vdezma zS6z)+4}HW(v<5*!5mMd+{ww@C4R0#bGmLbnsZLqeC?%@Fcp zm@X3qyn9{)%oA^Rz>z0^pVt&=YXmcWn9#!)_MS{iWgj{4o<+94Y?IBGm0qoqBv z{hjgzUM)Mw&pM{JmG>u}i(kbQTr}uBR)41*8PvwS^CBvHuvJAOh5MGPcHveYVY8J- z@^`MqLecO}H42qf-Z=sOPU*Eq9JCH6!xy28rVm&$G<6$4)#uq7WOC19v?T@2m?d0DHQ|9Vvj$d;sN$}mjvM9EL=1U z!0@5y3&ZoLGst8%7F$c^a+)`bg>Br<;m#tTioP(2eBOeEbOw=G|I?!|D3w^)2|eHI zioMDau4(B?giBlIYjnQ%x(Z^bjF001;uW~aAZGCGr}&>dj>5u{$t*0Xoi7Q$GWvMmJRuF2)cB~;Jk>2;sUoij`v0^7^8T`_$dlz&l=y3gJ%p?c z=7WAtrl~PMjhhphpJr{<@RNc+1AaOk3q`|EB~$^c@YBZ%{(vK7p~4*C)oeQa0m@O~ z&m@xk;a4i3ojOS2vwu1tG);%XL2*D~KU{SD*Msq2BP=v_a+-uF5Ji3{qk#v15CanF zfB|!0a9oJ)9;s3kC?KBottqya&emf~^+9+q;LTrZu(d$uHUn(kiiPypl8$Z@=;#*l z2I=T_6ID7X*rKxq3JtTi2MvTR1R!}7sE(Zk)KU}(*b4IS3?iUz5y{-Lh1*36_frD| zI&ag4`%lN#Nf88`Hk$;act&rGt6jk(D_ zD>8n1Zix~<{*vhMb1Bt*{ZH`Y*{tH{^Zx%7KbPw86Jr5>nnG~~_)+{FWXhur7xj*@ zV|d~o@_LfE*Fy{i?x`cMhX+#-$O2o5yU6Y}M$o_RYWPm=n-3!BKUB8AT}D{_~57vl}6n0q0Fjt z04Q>Nl8KApyflP4J`K$A!4VG}pGHSsgY5VO;P_lXgDqLXppX|Zc6_dx$v}h6Qg~%B zc)O)-vMv64FMyPd%0tTYnt4>-qIe#D6}#Y~$RSgNgWX`)#ND-pcPp^L)>vqn;0PrsVl7hhTeK~9q@WKATho#unq|Dkq}uNrJ8+gP$*Bg zkIlFr&v1(m0k=|cBGn@1qNk-e5*Iy2nLLH&m7DMKlRJa?%2{NZ8+%hbW^lHYqd=-& z;|L3`$E~s_%d$I6PB$LJLV8cONncG*dJV@^hmhN&T9HgsvV4&MovJ~5k=+elq@Jqr z)HDc_ZyBA)p%R!VZeAME*cm!dQOFWqWn`Y#$LrbS78hPdLMSK+p#cyq`p5549xpw;7I(VER{vIH4?00^ zKLkX5iHl^vDe{I%8`#kX^5!cthKJm*s%W2&Ix`P7;zTDczae5ya}IZ3D^ z>GJhI0N7V?;Zz*8ee%*qQ`q+7dr_jj;jkUET7j*tTsej{(3-#hD?0cVpb%Eon#>W2 zWIjMFz+ph*3l2_YNH7Bhi7$~BF`t4i_zkqi|^^emUoEDMO|d?De8N}nVlz!Hw+oUc1D7|&3^Ou)`m(m$3%jt^91 z;E==dJCM;A7md6D{mb?v`LRmBC|HXFVPTv3uA6TMuwaly@LhlX1c2B3u1w%ioWj6b zoJA`}=ez!Zf>NFDN{39`Rzv9<*cgVI#z-V@)h!|eQighBOP=cG*t*t86v;@e^Lmh_ zH2ngtr%ElNV4$+6YVw+p?;x^#oP8?%aRTzuuYmu1xM<*iJn_9}V9T1=jXfuGiDYIs zxDFYD4ZjPq877G5#7- zF@yN)xedTf3NEU4knEdd@~_&!8aMN=o|{A*6Vbo=2rWR4!M_?oD@NyEz5P9L%>Tl_ zI`pBQbu|9fz|?=_U;U_J3jWpfUx2A1TqOKJpJ?S557o(WI5`)xQ1pDtx44*Ni9jV8$K{a%PU>A z6732jpO>Dk^Le+ZIDwM?K?F{|#YM|KD*sSaoMjf<`KeNnq7)RHU?B>2rX)qhodMBL z2CA{9zy21zl@)H=-n)X!G^wC9sl=iWI5pS-ItK^rkxvb9u3Af{2JCp1jtoRPRh5qn z8pO}YU^V7|>u%C>K)9dr@8uc}c$5T*2?w;tLV6A`_A~C;qve2i83&+o6LElS>uzRI zF-?6H&tX8XWSkCBA?{|k2<;=YLMojJ$rkU`Z=0~f-8X7k0p|fxJ`_*GbKT+#Dz6Vk^WF`5j!|*MBX--~)o_fGZ)Fg%yAuoP zIVPyLylAckik83LrRA7c6dY;t6q?mPP<)@Cd^fLufW$DWaytk6mUDoLQWVyaypf0x zlb`guiWPVxZ+;J~EXGB~N=y91&fK)z1Kb$!PdS;k#?tJ}@sV*e;2jNanCv0`F~H51 zana$X|4uD#-ZsKbGyVZ?kVCSSlQQt+7Jmq19}^7S`?iXq&1WhYlDJ2Mp~#O!2W=Hk z;GS0B0Z$fOWIV|~8NPZmc?VX9yd%ZVWRs+Fz26;DkLmp$N-hbt zzcZ0~Hy3iOnVq@KUCOb>^gcTtHIaHW-&`;CjP-umcCFO=fMG367jqD5a!CN*J-`}p zM}aJK>|ufr=$8dwcS-QEC|5NqgbiK&8P~ISl|r?yW;TG?a~ZXu|4q;>-lAf!JNmEh z1@$Lbdme9)sDjFc{s=fglKEg$29{dFV%xPE%>QYO%HGEWFjDQ7j z;$oG9d8ghFnw z^JT#~)azU@5!jVH>2`?jLN|?n;Fk+Wjq6E4xZV=cm@*EEvH3- zZQ#F-k@eX1iXLlCCb%&vFU*fj$}3;fkTT^9n~`!Z7K(^Yl z)S&M6dwW^L z`Cl7>_u=R;8|&C;yKf`Idz}!MhH*=^aWxFV)RYbgX2NT$B)m35I)^*}0tGOTR0ZEp zHeQ(5b{YPHOg>cN_H^to?nv_t#2wWzWNNy=mcfkV-_fRrW?l`qx*Qve#?_w@Ub6Ib zE`vnht(p8P z=TT;BD)|-$*34U2NN>#;+nSxe&{{Lcd;Z_Qy^#^qjlWd%=l?gU&_=Ms`Zb^(+8PFJ z3Es&vybbGP4!;F(8B4{kHuleox4&E!)T8NQm+X~-d}qGWL+ImF!{`pD2W zhILnWWLRguq=B_^K5YQ&oui_Ib;dd^tf?A4Vew zOGU2_Ivi0f0qBFqjR5rTxX6H(ejcN|`i9J1V_qm49+?*&eon&+k>u5dSST7^c<3`N zFPsEjDC4J2Sm-8r z*)=ROUXCo(;3ZQ0^dT%14PFkf*5c(P$4>`h_p%mW&`QD4vBys*sQ7}h`q_Hms|puG zeD!AdYCP`v>4RjL8b|0-henoRgP-A8V>T`2l9`hGXZCcu=Z$dg~u-l$+@*QX+#eYCEq1HqOLF#>O$klTLdcFg2Fwi_`TI zJv?V=?IWD(neL60k3Sv@=_R^xJjwr|R-!*fC^)Ws{Oz}!oK$YSN-M{s$j5(H2k*C5 z0p9<`B@Et*{5Gr?d<|x_38b&&`!US}ANQ~Z()STuOiqdayfPfp#=5ic11+SFx8LVv z6ENS3-KbVgOGSfEsW65FA6^X@yKvz!X7W24e>jWGcw>6rF(@)U2N!6d9EqME#6r=~ z^P%^(P(FToZhe~xppOpJ0y+wME>U3(`LXv?z;kt zof|UkL5=}trzq#`2C=+$SST7j>Uoc2fM<4}wEUt^9#C~^hoGWUk0rloxQY=Rxo3X@ zj10v^#t5VT2=;q3>s>nU3CqtrkBo3*+TrH*u8A^OgX4v=-B<^ZYrK&!oRW-cv^&uj3@ag!&i&`akK0qV9g-E=wC32O|WL| zug99Iqq*gudcOv1ihpc?wU7FRW6e0lpxe7ztkKZ(W~ZOc{9}GD%d^68F3Znc!~J6j zccZG?2?9qPb*y>6Q9+#KB5UI1Ej|_JsZENt1{ZnXhrnGOE`&3NuO4CX3^@lZyrYm& zKcV$xn;Pq#8?K0~cS)jMx0IMT#0n)MR`B!etjfDTYm z=!Mc#*|KE~h3u3Xh8o9iH<;+4fA`hupma_ZQ9O}7?anERJ&TH#Q6B&^SK}gclY}3f zC+YkP=2u{f8tT19z_>Q6_p0p!utlzs_`3oqh`!$I0a`J-dapm;0xq<@N=|gWS0=V@ z;#SPxPi}?WnWUw9uc!W{U>x?>`uBl@8eBLI7=N&Q6-0{c>^v`tWo6+w3Hd6>R6$l2 zGF6tc?5<@jyK4o@?pn#RyQ)}r*BX}HwU%Xf;jBKL<*OjOYb(oCL9iFuU3*xjN+JtH zUBeo$qAY=uRaid=Ia#Gaybd<8nJ@WUFT!}ldZo7WImR{pAU+}1GpX=fNGnF?OU5iA zjBDzZk|+-=ydeYc2hl9`oZQN&v#tVYVlzSI(=jc1pq=LFNo5h01}^k^7P`gjeKeE@HsMCZe0!@r zE#+MPGOLrFTA5@{KY@kxmW{EF485+^ktegB&^cGtj!*rnXh%uPnj zHGkgt-!T5W`7eqr+* z!}?iVN~XK9ZL;Q)$hJw{9L^iCP0agQ%*Gb`Tx<%9prI0YZ+K|et_@b?tTl9 zz5|yq`GWZ&e{1K5bXU3)29PHUtF-ZE8k~qJ&URY??1==-oObT;J8S7f*bv@AnjYfK zuElV4X)=bR+BUZuf1S7hM*;ZfNBEunNT44=PfXf?34$TWb6Jws+7++=_rDjVZ9KHE z`beyBr26;HaYqWo{Zjzdwcf%FKI?36TN)H?t@dUm2oCImwovDHHqdgIv+gYsy@d@z z;pQ4=Q*1swmR5Z*sKcL(!O!>;vJC4nWgg$dU)H~ZCVqu>nrfY$h_73`Gp&MiYuW0= zvZ_RHp`BjExfL%^o&oe==!wB(jG`sH5n!T){1>o*{AIlqpB}kqT zH`P)UT|muNnXM)_TWt`Rz(zIG1(_GMs0+rI00R2BKT9<=vDE?>My(6-UJla*RX}7j zbPuwywkbWNQi*rLmC`3fZzk`_UJ%VYlqsK#!D2SCg;tyw*%sP?A{HfIF4FnHzpzj=_R#j{Ih46QB5<8))f(FB?f{}bj{pG3x$Piss!CljFH?Jyy)oD^ua0(XD zR}>g~V|PCXC@U2OZ1ytB3F2x5a)1JwQ(Xj-c)Oj>szJnNFZaY(g=tpbysB7>#Sthz zP1u3*foo4cO63F4nFoZzMgj7g*A5J8UOO~LS(VN{M8%KwVul2d?!g{wj zt_Q3HS3=q9WPGD^MmtM!Hy8}`i>Kp6Tj#-e>nRDIwn6{~6Z>;O2-GLzzo(YogYTR= zae)wnp3!UB-x?iuhj5&ubc8jH`gW%TAFq=L~Se4@zXJ93G1AZ620wd3rWW$e|c#F;6 z+SWe)58JFEb^yX<_YdJ;7{b5MS~ATXe|a7nFVv8^BlbFz_c15>ruo4=IFQ$15Lb6> z@Bnt_Eyhf)nl%3)yqv{$KNUfO2g-Nb9(V`8hS1G)yKh9QJzrdV8~(Cd*qAmVH5uEh z4#sZzD{jY%M^cA9d}trO7q^A|F5t`6N33a^gag&Tb&fl5XkTvJ7JMMAsunxPt#Z_q zoGx60M{W{tB}?#LO#CWNO{u33Q*dvx=%$acDQql7sKJxuz4_<{+R!%K{Nb$@!Ua*- zh}7=AHi*4nX7I-b**4NP9oomAyRLd)=eTv45jr9@am!!yVo&46e7(QH)spr{SxqZn z@AqwX*Jj_ey5YiCw)U7T1|Ykd{H`YYia(yg-_>BLbXoEEiovP9F)l2{og-`l9`HXg z`#pf>n$&(c9WFa!FS?lCBU7lJbA(|zNf_2twyIlNby-zYS+KKh{uwbA%jg_&!AlI! z_;Mn4^&k`pd+)Ntv9|kD@t+kUE+3Iuo8~X8X#&m?)An-u^(FR_0I!8@SrB(VgYV;Q zMBhlUfZinq?~-BnyMpXpTutm{Vl1}z;@ReV(CdhIToQ**h9uKoD&pf%os`I4QF(~4 zNkw6=FWutU<+?Y%Q2)ku{TokD!`r_2B757i-%@veil_OHE6{v+`Q}vjD;qqmVDqrR_qyy+C zBF5`Oz6|1p3BGIuZ4-O#_7*mEQUdyccf?J;q)h4z?l@4~Ic?*_1-AF&%YxT? zTCKR0t!=%G3fc~!zN`c_VImel;LVr4(3VAKEe{@ywcy!tU|o9Y^RY zteUg}pZdzzfLwqXaTR(uL5$$7Pw7=vmi=V9DSG=m?=Swhdy*A&P58X+tT+pV!(4g@ zcGSR#xkU7_Qgw#ik_8Dlwk-Dl0=Kw*8SsyxmjPjyWB>Gy(j6$Ar0@2sn&`FOU2lV8 zsK(;7u~V?V@q>K_8%^}FuauQ+MIZhuH{Q9*m$ytzf>seerkjE8@=$T_UI*Fwf^%71P1%ej z3_qog`6$#Tp%7Y5G9t$f(_r^F+)|TV_Ir%yD_{090);r_F-#iGtKx4VqG7o94dxCb z>BrCxE5tvy6~S>tzZ{G7*-)!5V}W;WJ1$bT;*a9=L9y~*l{@ax-yzC(l=sH+*hM?H zpZ!|f9~9ZN2`C3Et+7gys49Xa`Wf&7cIuhU14dpd-Lo*lJ@4{+-k0xL;CH^k;l7lq z9p^#|@$qE>o4Xp$%HdjL5*~ktw3I=(C<}k$2G^to;5XudTb`!bt|a(ci}zdri?dgI zt3|woE*Ij$c|rKf{lSjD0LK+E_(psBV}+gw-GaIxs8}vOP~8Q z>lgwuH(M$*#R^xlFSDVnCdJ|REa$s={UKQYw5##sXe0dn2dVF0){um#WiuFH@-LKd zFGRxvFqxqbYlSJ+(pfN~dyuAf+2Jx_e%0-9kd?))g=zR|{VBq?pAvM0zVyZ7?Qk_p zXX1{FeZ%cJxJ$ILuX`{)IN(jLp=3)fq{ebJFBFP%W?KDsr?f7f;VnealG$pLQzaoH zW`GogyhM7ZHo|DDcc@*+uJyW;{OQRIAn7UmM;H3xO>ldM;yVe#`hxt4{`5o(@+lsH zpOqc(#t79l8P*u1J%~ScmK+)(!&+Wd+;(!RTm0}TCeF0jl;L@&7M_U);1rI)?TDv= z$%A|LM0Gd38zCm-w!%%8UJ&y+W^(#TnA}Fl=_0HReThGT*|FJ%3TL4F^Wye&PXhKs z!=RHY3@XtSQA^!!xEs}q8P1yliB)yJroLz{=VvHUj)U5GLpvB|eeHo&6 z@MTT-GY{$dUBC*cW~eo8V@|I4bca}4gxM1WG2F_eC%<(8yLG+T*hVr%W{$9U#!gP3 z98(~+MZFd@EZ}qX{WJR69>oyma@t$lj70dO-EgbfCiQZFQMcU!e1PN3&cBL)Y?JdZ zj4{W%DVewG84a&mshfyf`AihgEVHcJ*;pi+c+by1ZM=sJ51!u~jPvV40yJ`%_5D2` zRH}poa5979lpx^07fQEznCCDIIlPKg85!~D>n=6b14m!AP`l!8T=ep^tRY1)|C@{; zOLNH@#4o21aJ?msIIwL#xBX_mDFwc2w3x$p?kx&@ZM^r6NoMm|SV#|J6EAjelglhAXU2Z{ParviWVyRqSQ znpV&hBvL41*`0uwJP4}jQF*sw3Vszk;UeL1-|jKW@AMJlk8pg_k&UolX`7AnE8sI0 zv|$p4e!|X~MV{*=hD|eme*$im=X!Yw^d@t?Mq;68=6bzX31ljBy*AQ{m}X2RDpK5z zV56Jmm88Yy=tpGu0Gr0Myz0DpI7C5IEPR&NGo4U+q?zRPFlO z8OhGE7ZZ|9@@ERLkp9HSIAZ&01?OR&wY?iFHp?+x!A`@P_5NAubFMJy{ll|Pao#6O z)bt3Qetx}yA5u`(X~sI`kYdb<*oRx(bdz$Hk!}%hTmTxl9v3YQaDJ7gZiM`UT%s&v zyorgC@s@y>RPe^MkqO?O$3oHIt@V5@-cEG>!L{R6oV>YK!ATVP2csq^@Wy$@{s#c> z23(rK+suCW{Wbu~*nXJXmctnO!7rQ&^=!*@@%~6$AG{1VSGFH!o7oRnVG+G*N zPq|jNF#(JECYqJ-k|~^1_`Vc7A{@>G3l%uq%Gvxg6FcIoQ=)^lW3Cp~ zWR`Q@*JL#F4lUF_8-{?SrFkP5OtY3j!`f%VZleiy1)$pIAkV;#RJ$$e*4evmREQd> zU@7+l{GD)-h&pQdaT>5_B0m-P8{P&$q`EdreOUL{q)9+k! zEb`-b71WR)Z&w1;Z{X5QejF>kKS9Q?v0UlVIH|knqoH zW1_5Idg~?t(bz^A%r|YCBYATHhd+}sk?NQJic@e9u}A-eSy~x$^6Qsg%2%b%p-&a5 z^N;G6hTNcteAF*pI1gw`#f8uo9lnsU7fnCw5E+KXa_Q07$o#S_PvIA7+^>lq9*%{g z;hA^u)$+^-MtZne4;$0*UEpi0% zDJ-OySjG{^m>F7$McE}v1QJ|!W{qI%PQ2=_B}py!1LUra!-PXa z5!H&noD}noZph({D&%SY(QH8eTU=zw^PgOw=;FT=GNRJIt*`_jugDZYgW)|mfN@I6 z-v~5O@;B1k5s%`LrIHN@IEhQhS~X^otR{{gIi|QdET%YN6mFGciVT=0F~uW)0X;Uz z>&g)@09+XM7Ie6hid$DCgk1J|411%IBO?>Vo2CIhqpZH%SZX5P2=o9eyyJ@LjhQ z-Y$y({4gH$CkKo(l&y;OCBXYnxM=XL@SBF)po0whwSGfpu`xo6jzpGu4`*|JV;0?f z;trFj(}h?l8kzS{u~z1tg#7T@5vsK7{hlK2qRS8e0i8-EQ=9r9-V3Nt!9~w)l0A^D z%DV#a5se#g+NB6>qj(#c!p1W0XfU#jI|px|$hiAtm0XY7qLFcDPu0q}2Wdst zsi%>GQ6kT&l_DY#8YJD2ww$a=w?wUUa}O|)ZWr*^lB8Qp{bODmr&!0x5N|sZkdDVi zL*LQlhsVKQH-Yk#n2ZiiG>t*6xLN~cC7x;kX!8yF1ONu`2TyEqwuErp8)yRz^Is8Qx%m{|Od=J3X^#dO!`{d7L*#{i^hVAgvMvulAADj6#}E_!klMEw_18<+{D>pyw^Nb@?>4}S-^BKHj0o(a(F z>rg95DVx-xPNEf~>lyOJZNP!HX9zn+Ke7EM&%o|Y8pVuz9avGie?-xLa!{(m4KM

NLyP{qj|@~}+qUa(oFB~m_e|7BE4Hn|4+d7(&R-RNkWNC3{r8MX zoF8~q9+ke3+E?d>Hkb_60k_SH!>Y_d=e5QEHMFlo`sb_B#r7Lll3S+nuRd)f#AK{{b zF@tZ9u=5diCIVYGntox=khN+|@jdxoP5lh_l^WKFF&FX7NP_A^G^qJ{pOjN-#) zMmFmo6K%h+N6ehNtFbxN@knoWx^DJF*0H8UMG)%UJKqTeor#NzAcmh~J&$co#aD@5YeVit) z_DWtwBk@PnNeJaC9^h6yfjo5aVO%8ne?0s#(`AYaJKw7*fAn-{aKXH06I}Rzjt&=> z-lW9^spey$R(R-cu|f3)S)5Sv$(^qn39C!7uYb%MMJh_b8rI1`N$55$YpD96r*i(p zkDqu@7gCH4c*CXvAP#6SulQ>+Mvd**$v<(9G4mxV`*SQYXOQKJnZyCl#X`~e65bm) zmbfo*lKY8n=%?DWU0zgd+GFo0nyaEK)gtCi0=nF|sFIBT_K)P*6)?O_eu{Y8qNOx> z*7tghM7<5-#bh!Y>#0?HIrW<9sqZi6)XVe~d*=3;-C7 zy{VCVB5RDhF69{LPg8{>#TQy(p=dP5o%vdgaeVQG7mSRKdw0u{dk7*qEge;EEK&}I z5ns4r8~{8P7Y%?Je3P{2!AzD>u~SeSPo}dmWE*$sA*<3h&vr?=M1ib%KhL+Yh#soO zK5C~tEmV)E9^s2P6TdW-zmMdXMoembs;{DKQPkMB5I~K`g#(qrGph4n81^QxeR5}H z*skcIz}8k?E^7*dNaQFi6b*de&(*^B_~(b*8fyaOPj+ajH;O~xk}--Dr}*z!!1`%i zR03x3?j05%4e;9^zH2J9i0%lEcV&ywGjRmBpX>jsH1e|=dJvy9p8?D932TXg1 z#mbH|AGI1o&kU2jlCecKEbx!=QO{HHh797LuLa(|$3@b&(eTF)=#ycBiy7M@^T(4H zYH$&WKQ6^W(eTF;ZY?g3pFf6R9GW5IpZi)1`6&3~P8H7JkJ)1Y=YQi8#vjLH-;C`A zU>e&ufvp@5vPG-v0B+ydyK_7+i#C#d^B*iE;UQv9y=@f71CP9%O#3G90@c2GZNWda zZ^oCRN(6?ryETbo z#$X{mw-|fPw`FU&g*wmZ&$W=t!X=l+?|{V!zXKizVjPskg*5u_Ri`3Vo5fW*+(c~M z_@$P4j(uomhKemj$a>`gTbJOX#a1ML0ho&BJfp9s_7Y@fZfFI08pKm%I!$SXoC&NYdwndaGuHqb8~yFmxej!Fm4L~Z{~)+K0( zP#9=lYx?y@j^w;XyiFz&$oiSQ2YZJhWIV}PNv)K35Z}rHe*cS07=CfyugkySSY`8h z-hgdPxpJt&KXX!h1rfD9frxZ$3MW^Di2|zwTSIbRgDrDaT(vs~IdPPVS9mUV68(Ih z-@d?#JoBQl@|rd*$uCcmiuMqa{LsUU(!sHE?oi!NR5S_yYt{`iZ}8TsQ4>$TFXC4c-JFtn7U4bW~L3DB;`MI~<@k23SeH<4j$4B4Cc zK1}_Sx#uX5HTTCmV-Y=6jrGQSrxvQm-FfNho(Pq}Dar}BFT6dUGzn$+@p?(z?+`sF2riS_>`FH*r1s4(h zyGt{))PFMlI}eh&A2m_eLCz1y~LQr z;*tJ8Rc9`RoH;3nZb_MuPJMEXmPe%IX?O@?oZq<87xp}V%q1#9kUTwQ2oQ2RF0!za z@$rA>yzpc)t<>-ovW6pi=bkuNPr1QdISV+QgMBVfDAT9U(A2=`Ee7dT! zQfDhndUDPSAIVW9EY1u2I6*o+anX2O{Y7r+KK^9@t6y%v1KjMIPwy>G}25Rmw1eJ5)Qk!IY^K&jyh8u%J<7ACN7wqCd)(rjN0q}xB#6gl0xw51WW30H!|)T? zUpx%M)Pye{_#`r4ENQRdi%9jRPAn7+U%c5*%NNI4Z(4=nb%sXZ`yXq0p(Uqr7}EV! zr}3F|qJLcU^e^?#ku$?3`vMjJ$>`}PB8V(!E_9LDAt25nQ`*?R=*Tyyc$2E`;bD@# zDE(CAQ6&4~iFV2KV1G=B|V^>7sYR}EFF#5NF{+mrL zx(HiTPrG1kgq^ZAf3Eyc`zS?az}kqt3W)jpN*OT{12FnG^XEgbLQOF6=tp|WS8Z>O zfn}#E7%=zeM_~~?)f@Zs@AuI{|9JfQUuT#^eb;=bg>poHzJDi$-f_PE`XGSyRa`Xm z9$B8eM#ir(U0=y}q0lv=y1Fik!=L`g7N8lpMYWm6OwVx6{4^n2`D$F8s zZt#|@bp&m5`yi(3o1WtJuyK|b(EnV?IJ&WQE(O=3&wae`t*yOt4-M+E`_qH;p+B7u zw~4ou&Q7*eT5ON5qG=EfXjweBs>0c5d$gv)v%CK&d(oKb)&bj!MhhkKdZn}LEWX)w zxTF85U{U<^a|UdidZur>D6G#H-TqihWos-_>DgV8l`MQ)kMiX`G-s+W{RIuhO4bUV z&G=LO73itlRq$+GfKfs|7eePFtzvunQhbFg1s|Z_{*U-7-M+~!9;#utS77W;UVx@6 zbQiMssM8g~$078^ID|q6AtHe$Yu2QcRS|pu6o+Snt$ZI;w1C#R*}?JSdVMigOvP8J zx4U@hQa$Vm{<*>)4AY^JP;0Dt!tGY?9jR7oIo{oyy=MhYbYioiW+n)m(l%lw2J9D-oTgeM9Pm5)soyoq@DXY#n(B6CeIm7VJLj zU+LAsIA79d?AFb`ME=X#>hI&Kzl%k~`?yWsyjq{NlQ+9g*g{~MG7nZt9_7Q81k=_P z_^g);+c5u!KE(mW=Cr(q0(TmU@z;tj`YgMyV6?DJ9Dv`;)^w>y@IAl=MqS80Nbt={ z@s@Y*n6@QaURciI8?-B#2~H>8vKuPK~3w=yXOWHpkkcwgV0nwZ`ls$I+s% zgc6*KG&+J)`?1?b+VN$gI2^g)ZhZMn+;*TS2@AkpZ3LxZ7-@>zEVbO2!FJnF~{7Ug0?*+=_j zQ^{wMt3N&&S?N4Fz!@rX(X^*b5i{m4#bgT6WPMs*QOWWLh2nD=rPw-q18jYq~TpE#P zYj4Ba1@_7z$ylBiAC(MT;O#Kk2zLQWx-Id+Y6_Gx<-4vu|u zM?2iiH$~L3vA7?Jro5odehOYO2d^4~pDtQA1OGV{KlAOCuH?#L$rYL4`v$C7F_NwR zJKNSF+uYv~3yu1P=>Ac3|GpKtjkdF;_zIgn2DQI7dmB7^G#(p^pBc1=O#J5*{LHae zrYBck&Gz67Rt!xR)=IB739AUsJ>D7C@!p=}AV7p4#;zuLP4kSk^C5aG(mMd@4R=kR zXS~Z>xCUL6N)kS>0aeoYB5z5RG?@b|PUEYj0T7oT^tZ;hEK6f5J63qUn)_vOlC5*P zrSwRb;#Q?cPVvN7=Eu0|1LzuYB?c#Awo8s9E1|d@nEjrW7|oDnO|DO%84e#^g!v^U z4R&~qm7cF?4wdw{8sr5q;T?}bOmivRKruxD9 z#iQxD6a7~E^_Kb$ldrFFZbVMP#vGbVGxkDA+qt* zd8H*^T8dqeNfmip9fzlO^9|9j>#9iVS2MUDW`02v#qUElDm=BVHO_T-#ya+lL*3&n zSepKh*VzaABqS8Bxx7j!soM7vD3*o~UgXQcD3cw^2(EA?b3T+zus2sS+9@GpF$x6( z1vcSNOsVX8O{Y{qAME@a#p)O-$Ogc42~C6g$Q8e%ZPW;TCnvkb=lII(M7I{sM&YUi zZWeI*8ZT@TY2U3bLvb4~Nugm_=J zm?LbgaZSTO6?@sNDHcz%Z`@$?J3*8%SFA$X29z;@Z?Tll@?b!th>0@A9T!-$R(hE$+Y?@JEQIwu&$BBAVJ*pkrPDoxlH&+V{tN z(B>pUFMmYXd3hB^E>$?|dmR+wyhy1k+)OizMkMzGo?5X9Iyu66iI~Km!!Rq+xfTDV z_aiCn!!Lk9tl-B0A&MZimPVOESlixnCQxgoIB7*8BSo;6e+iMF(W9)NWmYTOdu{4l z(=(v65U27a`0kF~cL~`7*|nZNLR^irK1RJ4w-k32a(W1{11{P+*^P1Y&A-QJYVQ`}Xan52q(pVAjdDsb@gKdxzMu*`sW)6^Ztm!S)!4c*MPG zoO>V)_FxpKIHMadqCCDhxu4)lp~v?XT-bTctR#$CbfpLh8NCjA6KwCDvhPZgjBAA$ z?5x93%$XXQBDAMx#n|49#Vf`O8$<3CN-;U5?b==k_aUr+R2nP*Aa`JET4uGuI`|WX zN%{8y6#T!A{-0MjIcBm|h^2{1>%;-Cfi6}q0bK~_BU@NkT2fCsm{8)0E87?=#IXTJ zE3Eh+ZoQC`*mhg5gZ=OBXLHuHUF8;^`7nmQPJb1go7p5jVMGkacl*%jgl02wo6R$W zbD?ll5JST#hV*VszF>jEz;Y46|g zma`jN_0Pj>;?B~ci)Bg7B@p;_*jE@V*+qxd^U3sN)~cTIT=;sWBhEUBfW^+zvvZ0jY-Y%n^-8C zvzgOVc^rY~1$>Pa34Xf%w=0ZmxmL1CCCzKOc;(icphqdTI50xxmJ4BKxpM32Ta=TS zyyM=4TO96GViE%_;>T%-Nvyy{);A2_O1#G~f8zsmGd01}$is9z7=2LhP;5!Bv9elf}^*@}W z*c=$6ew^8@0Bhse+V`(=SkICsl&CzxBbKq)zY;U9kYR05wel1e(nl?gV{0+za#-{J zInU6Ftd|QWa8dc{Kk0wFWT{ESz7>BtsXQpU20E7^TV3KUoR9nfA3*#T7a8&zd8W`e z`bj|!h4tgy8D|RfyIzS5^9O<&m`6GvIS&g(19M+zEzFPed?bCN3ACShnZ1?-?UtgN z7yhQe85BPA0>F71E*khM^sS+8s1JjFvvVDN~u>^$>?O%LP;VLmA|PeejY3 z>xk#^=bpo1&1L>m&160fKX_(RKx)hhiDKLz$|NIf%0X44tQoIJl<4}Ut@L@#LP(R5cWTGVA|=T$pI;8@{%f^1$R5BlAEda!(Yw6RE!8Tr3m~4|r3w zJaEG68`iyP!WDB~&~nAG*Eh^jF^2kv+*Dv}BrbZ4F?|~WU(K)uJ~HUna$X29GPa#Q zT*UEZme;cD4~{R!N0Iuq+>M2z(aAf{FZyjfF>~Jmq z0+VuKC$Rq@|MEw_2@?&(w$uZ&sPiw&Rcs*tveUW1Mh9HN;g9aa%&iDQxv+D0a0m4t zW<3K^l#}+J&TnA4u8fSO1~TfEt89d^xR?GGvK369R8d;o>$^-@LUxhyoE-3{>Q8aMsWD|$YAEPil961#1U;r=Nzg1{9Jl!s~#-`>`R)rN)BMoi zIm{W&my?}ol6|%J83pDMX?{pY4s%ZP$6rrcfH_Tui6$elA(h&rs3-kcg*56(FFgm4 zz6cjp>M(eBSM)h_cq6qbiYA}6{b5rKy!x~r1L3|y&952^M9hD~Lec2(&yutlIDz?Z zDH!5uh>F!uX;E=3Nv&QLCrC4SCIvWo92bt09K=?}d59 zJfTT~?} z#psDIBa$aMb4W_*covY*9v3cubn!DtB5B?+C0?N|uryhr1f!zr#6;NKCZhj^CpZ(x zUCnF5CX`hFf?MSYB`l_GGNEJ)7SeY$Z`4mH0aR#0NmY9+sB|^oN?^y-V}!S9@Uf=e z5WPU?%o*nq+IqtvV%^uCi6^1nko84HV{@uEoI%6wfeSuVEp*rZ%n(YH!Da=+t@A{J|SU)plK$ zqp0cV{K0nteKp$gXD7fsfQza*_-{;q9IL&$os3RnId#XQ91C*PNwt@F)am}8ITl*9 zSG!>$z2-2MRl=zp3n$iI?enpT+PMD_&H{W+Zq)YbV=6Xauin}b*tiK7)n3x(OS6!Z zu7CN&{YQ~09W<<>J@POB6}f+Tr=I|$==+y1rWK>>U*4`ARzAu7%dhm+po-eh0kDMzkWqVsIf;q=^?!&Qh9*;3>7$aQY6t_ z67wdf5uLG+UJ@Dm4D;J!K}8ZVADu-ICz5^E(+A{qs=Uq+AbCC2k^A+ISlpx=}LA(iJMH7G@ zdXNKL*3{wiM>^pR6iv<2X-zcs5-gdL0LM6g@w4{8RTVB;T+#1F{zfxz0~}*8zw!k# zQH?pKFW<3gEI0o<+$x{nDf#UNUiPoPaE>w7-FXREP~jLl5o~sJ)~tRG6>kAK)jYg@ z4y#E{Cu&eTxIvH0KpRm^}R&T0qDbi{>YgyG|O`fL3~2C6ZKEb!_%BwVjA-NUiM zVu6wBuZLhEJ%PVNQir(joG=nwMjb&8lx86_sv4omI@B z{(4SZVCG(2WL}}4dU@62e3(1Qay90W*ow$J(iN{HMMP}nio7y7-~M2}f{lnga&9cg z2Imo)NzQeKTnXLm{Lgegj8tu%?lP*jz6je<86&!*?Y=7DA*>SG0Pu0RaCpyYpi?$A zMF+__NYSB?xVQXXN|mC~?xieCXD-XqslXAE*LlC-?Cy0g5S%@{&PN4jPp|Vy!P(pE zTqrn^qO%AoI%rHRIMcn(#e#FN*ZGFv9LoASkMKH|v6jp$1m`tg=Ssmj#_OySoY#Au zYXs*FUMF&aZbku%;GBfcV}kPzHd=NHYZ6(^YFcL?Kp{Bqr9`0eQtX|@@X@54Y-I}G zv$o~Z!943+&ZElZGw?Rz0J5%)8F*89WCs3y2PYZEz`xRiO$_sSSST6>{w;*2PKudv z8*<1(%W0Du)472+lxG&Y2m>179u{j4d1`rYc^_*ykJLG|WQ(o|^vfa7q88egdyp)L z=@j3p%|t4sbR(nlg6-Q?>5!HoO9$J1&jLjMXI{uHE9Po9y7#{5$aKixS~C5Euo^D+7c&CY zG@ggl+XJTeITuGkmz>&4)zc|=1ZunOYn9qQzEY;PqMJ|jp4{TU1}X&OwuoD-Aearf zG}Bkz_2(;5`a5rv!EB6S*Bm{DRr`+H+7q{GFdWI>`MWe6!^XDuEq`e-eA4`#C10r) zckCbqb;siG{H5Xq*4>~u;G`ceGESKNkSw1s8s;DNC*#-{?i*)EhWl?{YTzCz|F9ej z=@o!6+!t?!ZL{-<}G+v(ww8W1kPS zoJ?V399%ssG7cth(cmCbzDW!giUtR_1+_Rh$@wO4Y*w*i8K7Y0*z-+Rt9*d$pgtDh zsV6Qnp5&hzeqd3volMiHr(9^Pc_A6Xrj0c}x|gFvo~{g0q?@k1dlT-Krz_t_%7$WR z2Gf;`u#kSbvazeV>mbmfOjrJY%zX<$R8{`}027QgIhdsM%aW4H!phPL!wQ4}Owhpx z*p`nrGb1Zg#>Xa#j;P~x%F5c>-mk5;wydSC`t=gg z>7mMJvO|^C6P4TbCn}##C+=@=Ne_-`!->lB{!!szdaB|7xUiLwB@~vRc$#Kf03nuKKP5{e+NrkxF{@P{OHH*S-TqdC|x=1^apMM z_BDw>tLAX7C|MdUAHcITk8R^zVOg5H6r5%dfnI`vWJ_jQr}F5JoGUy6{ill4fW?#| z>zMc)Df$i;RJCKh7>$CE08})I9Y~jq5+T|s=+*B{5;cFD&F&Im3_amO&Is7}MfPi_ zXxu?Y;MU*3opM|h?i`lBlu#IKtS?{BveuWxtv2=LVGLx)#~ky+AEGbAw`ltE#DGK6 zmyYhZuG-!rHTJq!O%^(!G`dz9%$X&m&v1G0~Ek$P)hgq5ibz&ogrKygI>ti2Vf(#Mlml$McT z7c}>%M<-@i){p-0rE%>Nw)PBT{$Xg#Nzq67-tK3&-13>pkFy{C8JI?^R+-WPqF;xL z;xEz^JbS=;_;CQ(CNlp+g|*C|ut|`4H6LcMhVmQ+vLo}|u>D?3ZXAXD{lu^)?W_B% z(rzz*|ElJykrMmqXOO%N7e&sMM z3I@`924hfF{hjC;j$r=2-$N#DAuyfYqU;t9CVwB)I0FlG^-thTDK4BNj34Rn)be@m zOe0b#v}M}@Y4I*A;!=utTgjC`+-9{ApWg=ZS=UDVwh^q**G8}f6_YM<%jt;rY9scx zfG1*Y1Wnb@lrcNrU1=moi`$UdK;}x^zB*CsTQy9Dr=)ZibHT_?B+a~>UF_0bIdj9L9Pyb)u z(&#^|@8Qxv_+QX}5iX)0D9<%~E$@#g;ozE`?>C>qV`D^-aucV!f+#eb#u3Fp+=9H? zX;J@OuF~8x&b;I+PIDe-1}L&-_1_(|{#(w^=<*`b_1|cbH{g7e7I{}<659HvTI6js z?Aw4z8f?DcJJ7WsE($GG`IhnX4-^~hL>mOD*d={lhB|XpIfrs0h*sd&b|MUJ&T6Zi z5gL4Q$oV^N%8?PSn!9kILn>O>PpVj0=vlb|fBVq7s0O*99^lDy5qaqU@+b3@YBtVTbw zs%_84`OmIxO2_~eYxc44%VWvkKVJTRaTC5jsJONAYROMRbEpg78PR5qCTz5)7-pO5 z2=!V>+l-+pTUKuJ^kZk8jV5QA-u*L9Q|C5{&+X+|@eXOnvRvBTYfxqD+^5k(N&O6f z3Z}3Cx3CN!!!1m}r^eH+GivJ>Ms~oHkQdVu9O2wF_G)o+I5(X>3+MLb554F^eQv6wbaFViAM2wMN8ZJ30viXS zF;7-UMKR`hyUr)+V@lveCkx?Qzkur z>S_Ztle%XV5IO4Y(Xgj;D zpuvKD|Mh^ z66t;5kI$MQbK`ciA3|3jX_!mOqCcqpTF9MU`(?s{eU4;@V|ov%tTRyCC*#*pL1&<& zw`a*!^oM^fDI=jh@s2QU&I9&A6d1F@xi0!bO9FlY%jG2dd6=yZ%p{l|Lbv6Wm{sO1m>l_1L457@3(&8!0Azjag$ecRgC*r6NV~ z3ARm06Py^NayPnXh0!z%|DZb@RdD=Af|ae3zeyJJEPrD~npD}y`lXek1B56p2pD$W~FGbkss zoErI%vzi+B<8sjHs(E^x0}bFbqS20i&{1jVU}}v>$~CY|J)|Mdz})_B`sLVexQ8{ovZbsSH8aP$OaU&0J20juVpvF0w4)Rop8JN1_3Ff38Du1rf@#p2w z!Jij!iQ!Kgvsbh-6-x)nJXsCLZE)nt!|Om&(^`!4ujULftHl`cBEGHEVz8E7Cbbw} z{|OB7K=;@ZS}r@_G?yQ6ibF7uR}aA){s9=G)?(CBQz+D8pcIvd`vBL-PwOi(&;(1d zEh#oDGFG6w9j(YXU8%^(LqFm8A!u2=F9V(8m3oZLJ-{zsk3kPUp`{@S^-*)tWgq%# zY{F8{v7doW$Kb-)#QX{84`9>*>&<_E9aA*+*mqyWnWJQ2qStg@c>!Nl&dOxWG3iP% z6a&fHVp(tg^7~v{coybC%ACXPr#2o(t08`hJ-1*DYrpH3S99zYotNPBOxe4D?Du>M zvfqJ=s2wssQtR~$`>6$i?o4QYDxa3x^&pz&mp?Die1YQ04Up0YW%g)(*?S_*59@r= zKSPXT30;JVXgKLWt<)a*@^?kaP;b=#6OcFq7lFh~zOi1$^Xt_7M0LC|>UYzVf_`Hu zf1y+_<(kjtdB$ze2^5zsD1IFV(o4DV{_U*|BE=uah#aj86((B08(Hm9S52!~ntTL} zlN186hBrzz%LjLv2>LeGidqqL+xxdKI!~2#tcN|*2u3`C%YpDe1)9cm&g1h?B|DnV zlb%)SY<`|hWVAgR->^fZ@!{bAQywv)YXzpF$+cxxcMq_WmesxbBha!G7cSI#{BO}e zXcSPf32n(JYZ-Puqtez>ZPh>MQ4C~9hLg67^gaCkK}(jHP`N9=Gucer=pPhXs_F-J zV1NGsX#FiNngJ2~qaFP68F*)oUv3@A32%m9?tB{Gwu4{J#6WiN%N^T5_&*H4G(3gr z9~i%M>3Wd(#nn?aE^wq*?gEp%xG*L${#g6Zp%kVYTba*sPB@Lg%rMLTC-GGUvn;f* z=J#SCy(Spfq5Qr@)P%$AM_RSWL=BSoZOLkIASe331FF4&6K#196Z^@_a~Fyw*T~FQAW1; zwExLY@Zit5$o|t#zUMj$uZ{CP9mSmHM3G8&ye~!r#Y+lu*&zmgn?w5 zpJY{e*mD!7Ip3Fir1L#DKBmR4|LUT~t~T;LcWP9IwU286l{?v3<$Z3E zwY)#{s7-kvfPw7D`-AmIL*BnCHIes+h8>c;U;mcscOmbywu2MXagpWy(DnyhOQE;1 z2K;=bUIVl^iEBWQM+6P9+E4aR45Zfp<9$shz9VYDQQIFd{$Z{PZCFZtB~ev{gV`VO z>6xnKLABv`+rSBei-Le`faDbHkOn>I&rglx^roa1S~^@&dJ!N;tSkUfVNjr85dBPTB7GOuS+WJPZE@ z`iOhb|95xeBO}gGZOtO|zt{xnpNoqo{j&WZYbg9jX#Y8rQe>YCS;2G>E0{*-U7x&K z+)7TOpx;_B=cnp$-Eu|+3_Rqz9mZLca)dW=cw?V=QIJ09p^Lwgv?N* zvhzIl9F_GE|JsOub;Q34D{e?7`AAU95fxbo*bnz<0+#Pk1Z?`XM|46ya-3!%i*Wu2 zPBtZDaZzN1`6D$RiOJ^eGwfeoKmo2XM|Tg=b2J(ocit;-)T&x6%MXGvj;XsM5ehS)0}kcU*<~c{*z;q z)sJSgo05Y)%cNckkeZg%Tf6}zU4RRx=i#g`-$bFSv1~i|^i0>6)9w*u+iHFJ^($1m zTgH98-wwZ%u{28-vo!aU}6Q8S)4^5aLMpW^U4 zH6Q&%hpH9_6Axx+oS^$(-vTEZaZz;Qko<2L*wn;EU6ZBfgyt7`WIp!}ffH8#w>t*X zbHdpF-o8fU#L@A;;gDvXPX0w@gKhtNmc|2U!&UzR4@Tpn+9Nypz)|;`(wq#krnw8# zr&;d<<^vzaKz3-Jv|6P3kRdPu5!S(yg$=NjSC^~H{#%8 zG6@%z{>TR^`(1hQP^)3_&_uvqdj0}xV*f9C=Y9LdAQ#@-=$6WyIQ3ofAa3ytsbi;k zatPWDcR_c$wl8xYyVTpE9vEb@)Ab2DBH!uSzHIcd?98As@~TgA1Z70YY8g?|%isa_ z#+1ZkF)nM1XW@%9G}LW#rQ3TjBVn5>@2JwL1!pPP=Gqax%@r+SLc`p?(#VWt99RuD z2#vsnZLatJ0IuM!M>vOMZJAEXhPKeMp*mJJ#P_(;-SFnj5~a zO;ySx9k1VXnyR~q*Z=t%q~uv#6e(eNL9H)iyVaAGs%3-o3?HWO*O-?V4zT9s$i)IL zt@=0YxzHXjOa3YH@_`u4){fl=>gIHoctJ*qRox_swSQ>D1b=OmvU{vr<52s5RSwzf z-;i*+N_S}IMQcF!{A zG|X5@nO1yvko5milY7vA&8wjQDqIx0E03VRG=w^@z00mlrOs>F_|!$8dRD%(XtQT! zcu;=w^u$@0Ui$rvi?cqgxX_cF=t(~IN6);G$)0ZUc+5}6CaNL$qbnXulb7YEF8fpJ z(jlo!$ERXcj7Ud$r)oak?ikK0po7iFV7F)eN(YPgBzrJO8NQ!{$02mE0{n3-9!DlG z8}O)&%%LZJ4^1C0Zy?0)WB=e!+Wsf( zMlsp~h25C=Pu{zQJ#3QK>FMUhmbGT~YhJ=1*v2;KJ=7e#EaPxGc;9+&dK_8vG21|i zLf>W_G2ah|f=hK7TLNEp${Y8RrIBpoUR|JuZrqzSsAMGh?S)gCfWq)w_I%?&*@Gr<@6;d&W}WX_PXLKx=wi(Gc6^Rd~m5=A%rZD zR35!9N;mu#HmJFRIWDPI*=;HN^K8^ha#OAJH?-P{#m+_b_TzPxP1uhG``%2CJ0Gaz z)-%=I`oAc=HMTD!&$YHM)6pJPjY=qvHQR~R1q0c!FSk7-+Lz53F(#GGcVfll*7;5> zF}Kb$>DbPsB>4tfWYV9Vui2eWqS~Dihw<}1GC;FO10Cdymtc?5a8c}#@(BJ1TBFw2 zk=3$u9$p;9$HrN$`!YE1l^Qc4nnb ze*Eifd;B;9+hw&Z;}PV?)Qe2`(FZfr5{(DLkA2HjEd@V*dmjAw85e;cYJSC{zV=57 zH;t*k6sM+(RfSqki)+KPw+qx)>#Yo`@~^-^dTlVSaeL+ok@_r?ubf9{aJ~^X#T%b* zgtq(b*mS-5>)#9t^Ittnq_>SyhYQE4WJYpj_`f9v|?;6hWHpUS6YD)X1m5@>E!zx+WTdo;i75s~JHS--rh%7oel zn2jdw2dZD5qtO}l%Nc(MozKLD)0xTl!RBv!E&$n#QR)k)b17F=jx^iO*DJR9ImKD- z+$w*29R`x6+;UBI>qDI4NAtYvo|v>!FL2Z6Dj>C;zb&X#O+E6r&pibWJcSG80HeRP zd_M;`Y+_R`Kh4^vjIXdM-#?|P)V9Qx;~qSM^1b5ECh~m)W@BHz_n=dcTsi>x9`+=t zn~#es-wRro!<%U(Q>YYF&ad$e%##g6P)&FZDrvhzCDv%_m@*x@xB+2J*a4zFR2IwrD49XPyZ7dyPB zksV&MTk_)Y8U%(Ftm0}mE5IV`{2ClpQ-!%BPHe;J=d4~(4i&4&-4vr5E8$tat(CA~ zx}bz#Dz4t3K=AWZRk5&C!u$tBB`k@fp<)$wn=0o!;*c78Yz@l>#vD>Z&kzc+_m9va zHN58sPFqrf%_@tYA6d6)x_##-if(%r-UYJ!PjA9Us!mn~y9)K+k3q0+#)S*Ed}a1y zw6SnQ9MK;J;)wn*5J&WffjFW+48#%rVYV^hZeYR)>lnBbIvgGpChs#!^-D~cWjTMBRy?PHn}KOb;??XsC5q_IVN zuczLkY5KsC?GNRg2MpO-t*-?!klvyhua)k-OSEW5VSOhXGgj7jR=%&ADtqf|KYpj0 zLukVX4}k0qxahS(wnyod{w!4<-CY1#aN3f)73jvRwB&9huT$7+%!Q&JdM-rA7gKK( zxL_4uBw!#t7mVwnZdxI7;po(dygo(q8OOb+GQxIz5k5%;3WzU;-Va{n;X-+FkpAGZ z86cmr4SFxd+6Mh_1E)O8VXN|QV1t4f$c_!#dxvO)j=*`D(*W;ci`lYP>Q19AqI%y>OoDS-9Qq))`m%>?NpVR2!yfe#bb^KY-M0LHwKojr8KzdCy z_Bp=P$4?j^jlQu(3!qPDk-uSAgQ> zxM&myy-~k$!(g=^ZlHCbSvzg1*d6rm3VYi?G6x!9hZE@&RGhE}Zzp|_=D5*)IWbh= zY>PO8l?~MqTE~H6Q@j=S zsO7~eo+Y2+-H|0^(4Dj%ra)9G{tIe1;e9eW1KooY%aOKhBRla)D9%P_u#$w6vQgM0cR>#qxbRt8_MtK( zQ7Uc=7C5C+XRypw?g%Fh#K)yEuCid6o8({vlCFMc0_$1q!p~_3rZRmV9OFunHbQC% zX(ObT;4F|@+Kto_Fn$wqOT5yh8TlpHTS6;c`YRZJplWa52j(@gw^NR_wzo^i3HJ6O ze#?bukblyY9>_dSnRsrAV@mo3B@WUX1KF{+OBRXtb^}I?$<}N#&K+$Fc{d5UBc3VR zq&dd^7MY^jYcxB2V!djIiw^a-ePlup)js!kkeubP7K3rotVMJ@28Zes+2{=OE@2wbhsI=^~1jlv8^m|J|`50`K z=QW2fa=|Flb&yeRqA>|mQ*#q?RA%~nC?DWeu6JqNKveeXGH~NXTtsd};}Z*i`6R%z z2@f(cKP!JZ_D=#27Ag8-fGxjIw8w+81tJd)x1M6oJ4RvIb(o6=7Hzo7yESqHoa6;T z?kjN7lbgrGDn7Bmg99iaH^zgTj=W;G;T{?_2_sZ^K0-IrASW3jT(Ci|5tspupMKu1s=T%k-i$Ri@4R8}`N^ zc5KR$d7?ZYPJhFPhnOJ0m2jz=I9qOo?lMu_3Vr)xP<19QoT`@eoKJzVF+EfG@2iy% z(U^K*sSSGWh_^@2ODaWrK1nSO>aB1Fjd1>tz8mlv+KvErvgSGT%(-LP@jGz{)t1HO z&@R7`>COxsh=)$Uqk_flq^i)!TAxEFsak7GN!kXT3wdaD=?TEuYBQig-Dii{<;6>N!ZC0k;;gxPRls)97XbIRYpA3pHr@yRH;6Lf%JN3Tp{MU zU6hkTwrs3lWzd$5g(735DH?;-;rUI!9EbYAz@jn~!KNaym7V$q6@!ucuuZ;Lt zMEuJm{-qKBBCPT%tvTy(n~INg@2-kN9`-*~ zK^*$y5+x2?9u9VWrY8mU#@OhEPCYj@KO@(FjS#qLwLWtl2GVoWI9IlHrpV2svp&-k zlU5MYO>0$V*^n{c>vU)ds9`t3S9+q8hiZH zf8(4m+jB5vIOoIx*K0ohRpo@``hAXHwC4AzdZm~{#9{jVfNG=^y&q6EyEQdNfx(rS zj%s$XRrdfr?GgF;$YPBFSg+|@2?q4RMWMGE4_L%seJH3mru15ze~uZMVyng?fzoO` zU=V-Zih=Zg(>S;P(F~E&E2&L9lzR4Lny}|BeBPO91f{;{zG!>}1saom@Bg49 z+S~W;nGQaR``&+MN<;Ye^JcpJya@(?rJi=P24;w8nyIYZXo!}3 zqsxbK&1BeO0o5auDzp!NQZ-X9gfzw$mrWDB5v#;uRgmozShN9;gI01MfgQ>=lasXA z$8CWa?k?02!`CmXPKZ{21G(S_j7Ps+Q%O|Eo;w>~n>!4*Bu!C+0#xBtn!uyz#54&y4lgarr z*nFi;Lx%=t#doRe0kF`p%IWH!*S^Z0*M3TD&|k$cn*oJQ^mqIZ z*77yaE65kESTNJy6ETn-`Kp{M%GbY`Ii?Y*5F7B7fSA~TuLSVefJXv5HS^ogLa*P* z)8ww}i>llWjfn*8{IHK?Xe;6U9OSYJ$YUlhf;XHDO@*3J#{!CTtq#ZZROd5 zf9G=E91vg5!9aS{W1KDcvYhjV?`b^(_|ox`5x)HPdv;$G_n;Ed9=@Ec5gqt)({vDh z11=ysv#+4H*q=vEfl>!RwiTOWlZlwg0kBEs5D;09P1u6C2{!3UN3@4cX50vBi`e7| zs$Q%wPHRFPM;T<(>T>jmgHXiL9P~Hi{M_e7#BqV}tIeAKMD#%L1s@so ziJHZu`#)|2@$+%v63^(b`Zt>kqVj?AH_3L;}d$ zdMn8L4KA`l0eu&=(wIiekG3;(-@(v5a-u-@%b8zT!O;CmhVJiY=>8#w?jK|59yw8< zd*nnj(VLg$M^~}@DB=U;N7u6aDB^=679aRnPINTOiH>DCQRGMAgODGE4?=#lk?pU6 z3qpRh3Hxi5tqc`3CF-3GAz&q^b7diDBYD8TCPMIWi(Uw{lm<6+`z{xR;C;mj83@4& z45SwV3eNXvhU!dk!oBI^PN!V8yT6E zOy14nV5c2Tw@!On1v_Jp#5{cD3e8kyqyFJ0uzxTv0{c~e>_*EW8|OKmn{R3s>b}vN zg&6#EsbCi93KGMn24-On2GW}a6Z~_nXcmsh{+RJN4%kqazxrCxWt$-AWsUj(K^txa z_20rpr2awFJG=^5Y+{fL`Q%LVZBqsbl()*aMZSurys<&PVWLR+Bav?#bDfc6zLm~L zb<8&MZQC`HBj4tm0+J8IMIgBy{6m4d3I1uemht_U2$ZG<-%Q5u#Xxps{P*!9r4Mue z{KWAl(w)R_ONRId0zh-Rt7$XlbOjgneZrsc_y#-#)v#x=ukU&${M0{ z@a!z{p}!{ajsxGYG_Q8>q&22Ag4H$BY-i3z2%XtVt`{r%W{{-~X-qUnR??W+NMm+J zxA<%mT72Gokv^zcOM{BlLH}wWdF2rrRCLHKKH+hqCb!yna%=H@6Fi00zJF@jA9$P{ zlOP*gaM2Wy$w!Kkzl^Sbxx!TQCgGfQG4jx`0SBFn2CAB8QU8KL^jc?Z-h0HorZaI7^v#T(^C=QHwqz;%_f37qzyUVsx#J6a z^t|LxM~a@6_nOc%4^yG4&a)Jj^jrtbr5&x1@n_KUOk7lYN;{=uS2&(#1j%Pkhr<`T z(n<0VbWg5)ABmr4iz^`)0|`ldII>Q?X-}cBL=872sDRXN)v3pPb77L!I9vO@}x? zcPaUFg8liqE>r2pyM4&=iChopsY$6+OT)C;&QNFy6^v|m(7Q6^T@frsBg++?14|sJ z@sLT4fCoted7}aPSgruu?4>P59OeD#?gVlLW{MCG75U>@Lo;0Agj5h2 ziL7vbI{g$ra}4$wU{}C#Qe0^yIhdc0Kf_+$D|6g(ywQ^iaWZ}~Ym?{R8eil+`FEw_ z)xx_gw0E(e0)E?1Fj=~ZLz?MaP``;j*^b{OXMOP--L{b=6=QJEBC3G+foxZ#VOb-S zUl(!WBZ_{|PgR@@g{-DjVL#$|4YL@TEZ=8nR?5;x8!$>KDGjK4eJ@^sUOP+u$C63> z<(6xqwGea%8HE=@6MUf=eM`yd>`hm7jsK>=?UUjwlft?1kw_Vlzt4}ym}lXAsUQ!+ z7%s@e>kjN+NcHrtqEDfB(heWF_jWw3um0KpeU$zdw+(ogJTVRfFu5fex5PVqq!=Um zNCB>@Aj?mrTK$R$^Unj>dPcjDw*oc;ibI&+i|=Vj<0~0JW$DVEhQ3Oy-%pM8BNPrB z$NDQjrgU?wRZf~e=du3ke%$}CSfA#$%~mpoVIVuP{;Q+758|;tHonBh`VGdh{;rT0 ztICZC-Lb6bBgn2Q?xU|oWdCD^7TFiv3$^EGD&@yS_6Ph`AGyJ;rg8c@$egR;u_|z( zEM)xZrQj)x`t2DM>l*XI)o9I&zPJ^&ld2j&8suHxMrU3-yf|y5$cuX@cUjVO)RrrTR#dcaC2-p3P~D)gg2IIst>&!LMQ8k-}S{^Gxv8t`FG#*uh&vFBI|Cn`1%M z*Kpxf1w9wERzU)^6eQxtWVTT`CFouHKhKvdrJU1PDQ5+XL9tviTQ+j7 z5!IdB*Ft0AL{bAz(QbZR5u{8eNP`tY%2owwXMa;cn*5%%AT2&a5G1+>%uJ9@!9aEd zsk%rMqz^D+3}<*|JVuasW;|AqxOn_i6OX|b;_+I#CLYJ$p^C?t!=8kXys0sLFzSCs zgXw*7QJ60HQ<`{E8q6xGCuM(pE9rASNRA%x9q4fC?-_l3%$f$yuvt#T6G%M4+ye;K z`bu!_3e69F&D3nG{^_eIvn^yKv$9m#W|!!}aP1&c#%WvmEE`;A~L5u4aHa z8-`<1Pwm-dm9PB@hmGq!uko5h@let89%jC_$;|ndVK!Q_<3Rb^&A+Su7x~((5|H*{ zTvY!XX!S9V+j>y>TBYW6AkWkyG{{tIPN{KYHK&SkBcvS|(yZom>AN7Vb<0hHfi|L5=>N*}Q0LR3-j>m27$eL4HZTf_0>JCu*QQsT(PN+5&(zM3~ zp+;)8DJ)>r%y^nMrW%%~X=AHlTaiCbQr#XbV8#f@!%}9# zCZzI}8n$%Bm-SVB*)hQ2CZOnVTdjTB8>e!eWRV|>4NO2$2?ny`%hq{CUq(-Dig6=6 z28;1!Jo4k7>pvPh(=9w#=P8=!@-0z4SMEXnB+h4Wsa#5Tkm_P^sR|dxPbrVgUs>D7 zIekG;WBb^3i?w|`4|ikBKEAVA<%Q**h;#Ffpnc44HmSV01hcVkA8*ts4f}X<5h&dQ z7eOE9QvAm^JBmq>6%7BaWJ_E3v!$(v*wWTxY-#H$wzTyuTiSYo)kmyi#XPH7G0$37 z%(I>q^8iN{G8|dN7RP*SaSX*g4Xj!2F4im;3OJD^U{K5h-J7D+SxjYh7So`CtbnIN z&AkMGuuZt0iZj${?nUv6(XnXe$pY86Q8R0@uW?5>n(M~kOFSZ}zak!Nf&HPxL)RTotl^xT3kPd3`c_*=awJ9Bxu1~F1A ztvCaUI!Y7ukqb4mJPqd`422lpiHoA>@*~stJS`p(|m)C9vVxnke&XD?4V?aKqM8}8LY}q0pPcZ_1^ssmmRYjoz7G)JIs1Np~#LwuIL^N zq_^J2H9EgtAzE)5B*$dXYNBNa?1Jp@Q+J|dhfBn3nnYyE#@whn=X~6Zvd=BBKsDwg z4{ruOw5d^TdnWe36@b-G;X+x=`5TjeJuquoUKTd0znYmH$TG7={Jnv~USp5Yxxv~t z^y(?t2DX#k#5TN&f%J&k*fyMexo8`9s{9pHE{4C{HeiPjBpcpYv<8kDzqe$C0 zoz;Z1&Z*xp(|yN@g6^{}C??45uNcUV?nkmj-9MV=!+TRSO@E+L)%5HbP3K*Hg+f!v zNC%87>+;)svl_&vImpgjaD5vt3hz|?P7&i-MtQ7Lc{|7s3Vn_Ba#D@8UM}jc>ZN)9 zxHkr|qmxT66?O8k>K|~9tYJaj%D375*vTJv>7~Z6wEkfTs5%oDPE}?vXKVhjO-LTE z_@Cf2CC@j7<@u&6vC%YH!&=E6+>eQd&3j9)VOqX|CyXEICTQ4Z3-5Xn2GVPoal-iF zOi{y5F-jP7z!MW2abzZ%-l!dy7IoFI*+>lfUekc-hKd^Ele(`G@~!Dk~$`Tg%FHk02|S=O1Dq zJF;@y#iFcG>5E|j_tY`6!jYILD_jEJ)+E64{6n-MQFbDB&Qc{{#9{orkIZnYd>x4M z4=)E_({NGvsyrSle}TlJIc#*kDCN zBc6Je#Z!ps5l^jR@%?HR->+ryJ!1O7tl%}9#q@bBrbm2_xD4@q18ZgkY9YP{dL7H+ zvTImeHc^So5aJ^)o1$Q|sVX*msfVdG$Xlzo23kzdJ;$Wu1Zz;QNQ*&S_S@^Kw8%TV zjpMTGE)=anPc^28L@0YFRv5=+w8AI`Guv?@-{dMpEI#Q=nk=fs6i|cx+7dasQ#h%0KuA|ioUN| z%SK@rK{l-Vhkmifo@^BK7iD7uvm{abYBm|m#^Ll2UEtC<{=sc3$BSY(Zu7U%KUA|I z{T(DO6MXEvL~lWk8b3FjV9L+2tF8GtJIN+LJs3#u`Hgjb)_MO6e!iTj@$;BzM}nUt zbo{*FV(_ycE}}1)^4kf!A zjT`=S43`du8#XGQzyLSweOZ+b%bfmI{Y2c*U5z0Gx6N&=fD1WpSQ&#G?6?7nEmru* zNX-vSqJBWZ7F*sl2{}*0{b;KKGdOy*F-hjGL~LPilH_sC3rxcPuK|#@w{Q`qP4)+w zG4TUng3cfCn89BEh#=syi6=O9mELk_vcXZp_Z3KyBZII{fP>^9}!_!q7DH!sd6|4zg}ddqK| zAE@m6hx6|ZhsM9I<%i9`3?2V2>ks~A;-cf?#qd8c zKk)xrhW~;2v6xcB@c%}J|B(Oy{s-m<{)aLH{{!3s|2H!H4{!(k-vs=xV19%E!2A;x z%s)xR{BHusnrO4{1-&#xWBzFoFt6(}CtHiDQ7pXy=1;;vdTB7m0k@thO2ctRnE!rb zT=!7Od;dXVevbChCsRTD6D`nw_5R=0m70%lP=#h%4E8&M^YfAUnuVW;^FPjoZ0*KH zkuCbj?8Cqqybm#eXh94Ps-FHOAY2n!$oq%2EKK@ckOixH`rn?jCkxl5i?VR^>*=5D z)HwXh^(u!Csh+;4W)o0Pe|A6cEghF5&aVg%tO>tXK5Nad)xX)~*DwrZM|WR6{g36> zkH2dCDwuR6`8DSp@T&qBm0weg@%quV-wH+_%P{&i3Pzu(V)Qr)w2gCn_x+u7-wdO_ zwvTh4VRVX`%qlR7F_6rCON_oIjdP#(ii$VF=-e{KV03P|?Ze-8mfOExGuzitvyGAq z+Bo`_U*X$(MxS-L^l3&7c`fMX7+`*+X67UFG=qH&`v3NYAZ6e}1xfyg+3Wr>c%0g6 zj=^o#zfmAX<@%_qN?@> zU;ox!v(dEv?M$$$3KxY>%Ht8@*BA<%jrsNM6W07X7I&9cUs2ID90%c?F zw?3xlel*5*w+q~VL$TBb82d>Kr02dd#y;+3k^2#h7=vLSGsf6Yg}jg1#@HNP-=dl6 zu@>n1tRFRBe)~15kdz;tnfb^p%}kGVkl^W%rA4?<8DjF&FA7f|Onu8u6bKvh+VQA0 zuhV`Icx_eR^7s zHtZ*0J`-!9wD!o&w6T}k&xIBr5!#trDL!f?+ktw``nml1VGz~2pUeC<&{N;fg*7KK z*(H!nN3_?^#orSni~U?`m|{k?Ofl-`(uVuNrWkAp_)=50v;*~RS%b6H#SHwzgG|3BYW5jS1S{Lw z){rA_pA`)4V;Fk0f}zK%82Von2penb$OrY>8jYi-{}*3XvL7@)HQN){1q10VvoVgk z?L-WSULAY~`94_ybiHu7Wfo|U^l~FoNX#g6EgP6l7b;-c{7F!+%}fvqt=KK!dSKYsq! zCO<+L$PPb#>h_25<8sVfsWiHK)FJU>tEMO5$GaziADeK|@#7jTUjglaeeGcO6_^+J zcQwPmz`Ve}z`Ve}z`Ve}z`Ve}z`Xq#<^}$3VEA_z%Qpk_0{;T@0{;T@7Alw*5Ez)( zr(oXED(1b80$1bgL*@>T+ zWsPc-`fN1jg?ZbJU;*|urUpEAeU4UzKZ|^=rj_%$0y9ChNSXwu?ykVkt$TKYmJ~?J&iSNEC{Q)#Z7+UD zrh9(|e!m(fEK9iF)<`A5Op}n*K4=-v^adbgP%DTS-9MCYJM|yY-ecI-Xqr6{kO2 zv#~l4Y7_?2TTbJ6@=Z6VKSwP`=RBw+Oj_9|bM@1L?VGj6uIU zR^;Y)Oq-%`3Aafx81w~ZldLf)N1s8>N)}mQmlJSrim#kpq%!^580>O56Y`OhHO(w? zkjfJv8?$jyEF_bUG-@9y##Guh0A*6xsqj)eAM9p8W)sU8e<$aqSx)}+e{)_kueVg; zrGeL5cZbSL%bfgaT{thf*JBmhx}N6TEGk`)aB#VHY;&U4wIPMF2*)%Nj3ddQ{;#+w)R*3>A}N53_|q^|ktRYpf&GOKNEPzn%9`@0euMr+2LJJr^q|n zN0FcI&_?%McR>2UI1L@Pa&$<1#G{!()(}oXhe_v~sNt#n&SW*T(NO$cO$X7ICUP9L zf4FEm$ms1e#wUlae+ni+NC!+}aDMF5UxQ-CvH7J-Iro%Zn$ei#PoHw`F@#BT&Ssco zFB;9-!6aA3bMA43`6bi5C``h|JqD9-%`?L!9F07vsh!pNv5P*@&`4vhibjsy`LO{_ z?edWS>H{*1{(s-S<+yr}ba_B4ZD##VFQV!h^RyyI5$k&ij=7zVNGS9B2u z(rccv4}93cdB-uxVfHJ^zR*PNo~ahC;eq-UAzPvtIP~L?T%hz~Tm<_5k>{0UQ3!9W zX$_0?nx^?UUQOHf5$6`uv}Y|eZ3za_YnpK^_x*kxaHnRVKV_O0wXb4rw2wo!0(p}4 zN9eqgQ*cX4q<34ks%B$jRss)U9zJrbreoRY|CI>NFULjHF{WQBqJA+n!uL<#`6UQ$ ztXb&+y=G~=;+mEBA?Fn|%Y6Uz7YkKBS?03}e&>ARS|y))xg#MAQ=oaWVmP*ToLO3e zere!R?EC z9XV8_39Gd}@`C2BSc5}A61L-Upk$J;lBz`8D0eutF%72Bv91#>{m_zIv7hMgH7o(V z&c{WtpGUiYOcDk6#y0bz`PMdb{d=6#%w|5JaN3}rViX3lV>92}C)&(Ewtvj`J2h*W zo26RI!|or`Q{yoD$J`hP4o|{`a+ul2>==E94nv=z!_a5wF!UKh41IS*&VJ={ zcbn>P9S#r|R}G?d_}>kJ4y*go4Rm-82C}2WU;ZNMFx}J2Q%{2O)G%)tqr-Ohqsvu` zYjJXEY}Mj>b4A4+aTvetBRw>RVl(>vkvN?HjEln0!Hl1<%&^ZL%szvM;3s$peu9VK zC&KoF+An$?0JDjXcHC~Qqp3Rt9ktpo`Vt1RqoX~47Ikz3<75=B*<_4s4rjk;$#zXU zpT0!Z&Y~DBWAnFtq_@UK>=)hnJJ`4l7jAj^mFZ_@jDAM*lj)?*^MW5}H09)Zf6;SN z(@Bm{hrcUu(rUlgS978{X`G)fZWlTEhwS%SwoQxtKEFt1YigW7yXObdnyyoI5Y|*#?QDqFLB0kH5Q5uBv`$x98+_zr4Fa(P5&(hNL75jU zG=V@%XNi_n-qB&>chz$leB?xpYuM3I_A9tH5*OJY_K(pw$}g^C_UgGW`oL7jw#>BF zv2W27O07e(st;a(f%MkWSjYCXi8^+a>$&@3_R1O?<)aFfQf2hqmQ&}d|?G%Fmf!; zD|*Pp$UQk-dXEfzpvB- zn6H0P=xeM49k*EPKq~HodUS@p7AcfB@Dnd#AUitHbC0M4%=0i)B(8tK8wg8aAupD{ zqR&H;S0uY^F!Bw3_)Xbg`g-C?Rkg76<=hK`N7`Zt4td9Uef?9^^X6hsLX^6YXJ|Jb z?VLdzO{N|?CdJ`!v*XJ9`^aw?96iC*cU1d^@yBTA*#%l%SZ#~_m3`&?Nj-*;+UUV^ z{x;>Tx&Qt9n7NV&&5e2`r(W>mlQV&=g;M)n;-f&phi6XZ`(F$D8A@f zw95g`#zlOt3v2WfUb|G^zZLW;mG(-*`;~=oF5%{i6QyohJ8-6*a-duRo08lTwtp%4 z>3c?n3FGCquAv+~Mc82J@<7{#f%w^a-F+?UZr{gI6U3-oqi2gEA|Ql^Ud4oME@OC9V2B|1rT~gIf}US2_c; zoeqCOa8!1=%SX=QcN3c6LVGfYV@U!c2zDl8A!;w_p^QFfOA>xD4xcEMkKZGG`7c*h z{^+Qz zlDE6dv-jtOCb%;TCi#0zX6Kodjv@<@sA4fDJROEI5IB|5FL&@-LhRSz<(7^}NdbqHv=7;u3nIUmt0Bp^wo12GZ~%PL~{Kq5l{v zR?cvK5$@X|-O-6_=&eRvO@&9=&d&e*8RuD6be-Y=!Ai-C-!U!e zP<~1{aV|#jh4Y>CekO6{?dk7p;1CPzCoZa>Hw7*%F) z1D=+WcUxoz>)9d8<0?(xOANIg7O60>Bf_~8*cV^nk-|_+O#mf!=TzUNJLvspYzlnY zxnQ3IESug#@^uDk`()GwYB~cQy**3V+Gbsek6eOTX*8qkTwH@M(|x%cw&Q)^v5!21s;5!pIX76IpW-9;<43R9Lj2+`QU_98{&oug%#=0u3l=)qPD_mAt#Na$KI38}I>0Sv*;Ym+{20=+g?HRNRakznHw309o>rLlTKr9EAJ8*IXoE z4T?!NC!4!w<_&B0Z6=WTE{Q?Dc^5 zto`9<9Iee*8mM*dnGH;!@OSOl7=8y@-6}^qA-r^VDb5#YH?H5-#AtNjZd5TZ$w!?g;4S%m*4NS`2&rp)M_i$q?gt! zFq1@YBr-D@S{`YjKgwkEx&PxgHktisvhKE+vAF_oP-BDN3$!MemZy-R^p#?lgoxh_ z4wMG{ot|!qGRO(jQ>mfk&a{1bj^IpJ5C$YanN;Ivz!#wCBt|ZmqXcM<@_)*D2xO?Z zji7IDWQzMO{DIUHd0uW)q~0}tU&U+kS?11C^3s2}r>KvyCsG$~c!Ag$;^Xu>_X^ct z81P%?ueM8x)UU$5(jjz&p|+QgcfB?qsAGgcg4eeND&0^H>KkNn@}C2aFpp#UBWewc z6kG*@mQL~g%3Mh*btS@N)X#;A;dWY?b19)vTazC3BWv3+#s+?cu?fs`I}lglIKwn} zCh|Po8Q0qcGNBvQ+h!j*frlvkJ1Q^e6Mp|si}ycJkUznEO8ap0p<)7A0n?f9q@-1V z0X<3FpI0?6+2OxDFyHM6mAPTHDo&E(MwSC_Q^c)uVb2240@f$T?JIZS-#9=@g+nb< zq)JjA7rK)oRC4Y-px=2e__>sd{6I&f!X3^}p)hHE}hfiEHWND@Cgpv^t7Nm90R!rv0j^yUV;_OPzA~Y|&VPXc<5EHe zDZT+eZz~+2zWESZp545Lq)kX%!%9QzGIjZ_;doGkUKac88G%V z9=rj^_T)HL{#ygG%;%QiD0ujA$6M6Ev`oOb2^A->(cQSl`#+(d@_&Lv7&((q<-(dM zab>i6=L=4&WP1AHItr))9dW@CPEX!mnaP>xy91Si?}^aS8lCLM0{@Mx=!J`?dNIBu z-AOGt?rAP_)~n)L?op1X5Ae^!DBT=&Jbe<1OhBSiQY{ZTKhIH-1&M&vPyijQ+=z7D z8&s5JLn>_|kc(36n(G6bAH>zvHUYCZnOR}jyFX)q20HZ$7* zA!Q&MP&8daYy^b;UPa0ZoV_a5Av@AFtFB_Q)BvV^2Qwk5o{iqNU>O{+3FjlwyHdBOA+y`_E*lsDa9y{CTDI1(V`PAzla-K!VqzHUtt3sSJ&9!brvy z8rw*g8KBvy#rUR=RN<;pUG_I3{rYSECd%F+u0t>c6_p(>)+Ut5=10#wuN&DFAVx2g zxCzB#Eb+q}z%8GGaQ;mYMoK*IZhXiQ8k-!>=3!E{lbSUA#U30qZ4?~W2r&bj@|_TH zXwwKt&jFF( znBBqRT~ane=0*^(tF%Sxzzg^b86QX~2*q@k(GihGGyDr&;|WqYSPaTGQ{C~lB0uFS zufVhu$nl@VIm#=fwsHqxV*|OQPrM_XNbMQ~8=#TVmD@jri&WCc+TY^v=0KVNdu2bk z<82OX>{XvX2^eznUK-OBES(z6pGIdY74I$$-c}?HEhH6i z7u?5pWrWR9j3nlr9FrOICxdW2r=?51jCT!F`C;U{x_rz`NS&7EqIlF(eP2VI9REO` zM@i#oKwgFe_ac!iX8lDfb*-h(q^=n|Yk!TGe%<+fMmVcsX42dA)t01$U$cJm4EYUa zC#&|~@e6)sIjR$+t2zU9eKNL&a%hff*7?%bktO7>jmS?iC{8^G&q>Mwco~3qZ@dLq zNW&H~y%<%M+gEm~kr-Dw%nuO-jsx9Cv3^`=mJ<@D8BdDa#!r9g!1LZW~I)dUl|)!%;C|(&POwMalK}T)dgJfZF$Y=T4!2kmJF5 z7_Y!(^e=i~d(*W;9i$5k8-M>vPy!^N@Rqp^i=@X><^hB zZy?>C*H0YtRpT+Lz*yUIm6G20I7Ua7H##H+C6NYGqA?|YXcPG@-@FjI?v=XYd&x4K z(H0GuWD9!7(t{#3mGQ0C>&QOZh(^Qclt0=STprKO5%5bdl{>ol8lWvj79hnQ!bg*O zZ!1n(LdFu@pniG*n1t8jLS7f{u*pYOGw|zzU5u}q=XdyTq^~l>w+!z{i3piM%7{N1 z>J;&%uMLqMsHBdN^>>8 zR3hdhr@_Qxy$^|B&!T1;+{Z;Gx|lo)`4vub6-tf*nmt0%kov z$rCWYzt4Z&sX23yIh5lJ$FbZExdmTSagxFT{653OPWcB&AwGp$mjST5l)Q>@HCf}I z$Am)pP9Ogc_1=I1ff^@L>!~t`=JSdXPp*INl2CCwiG%5ylE*R;*ky1UZ~nyPVWK7v z2Kj@%QX-JjapW;{)Y(R=u$N29r@$je8lEbyE1aNTSD1B~MAsDl^B%QPG^U`pg>aQV z3+JcO2YORVFrwoxwJEFQBUKgBvByBIdru*5M0pYOSM_xh*H@(TZ^dtFG*muI9~nLU zF4+GCh)3a`Zmj(}e!+g`bIuRt_sOcCS>_{`;rk3}LQRW9Ieh|6O~Jy>U=k2VLVd8n z#g}(sC{HRS-SF995?H8zb3hIIxTJlYtk{k<_)qe61_$$@>uspPDs~0Ob>hELDK3~0 z&ZWlB5zgfZEte;$YztD)lDvW&VAB3aa$b<{@U%Sa#G4SbR`!wKh9N=Add z$moUKZv}^8y3z(2gwkLtABszv=eA;AAI7{hcT(oDxiIGO>Bzb64di(J&2ai6et$`m zCnRGH^G67B;tQe@83+PImFI2pZw16$;eHG8O8o)wo432BU(l)a~A0|L%WU`cj zN(@@%a^#vo1;7{d@8%GJoWqd2JLKI)jZtVgAbSX-%hs$F$*SPEHkw%Ww$i){tT+X8 z5v0QXZObVBW$PF_fb55xu1}3=Kp59gDsGhOGPY<-Y{}9{afxkKTFFTA$qpuz%Qgs- zE+?^oSL*VZT!25AUnz7vkt{$gTS}Jkh!(zwn(@FKmfcbTLxWkf=82xO4H zHn(jLEtrz09UMo)Z!H@m8AC*PT?C&Cj>F?0qnSrYng3=K=?tg|>~nfn)?~*p zdjr~7DgS@sW!# z1VM|%2wtJ*=_vT%u`HGTG5nUP#uCZrDiFlqM=F^ON$w%Vmq=T5saT31IKmNbMFkbq zel>R>NgSAy;zBV3kaeXiI5*urJznY(8ki$}i1V>=pAFKMtPd-4R!j~Iy0juGP#d4M z-T!0O&WiIxIs0MG`c4jHo)?<7-|x=)(0|J0z~$%pd$x3!>had`^sS060TQ3p;Qvvo z&Dd0*m+p2%D$?CM_k~8Mrv!`AQ>7ijyz~_E-*cJ#2r!)4*Isf+LZN-JJ2(#b*WU#T zpq|C=gR5oIhG22$8|M$Z@#eP|zSVTXFaMT)KzJu@_~jdz*D>uXUzj@-tK}i6JXEVy4NIZmBw{;ZwQWQlRnJYdGfe6 z&kLW#?QBWd*_}N-<;FV4mcM1ywwwaHpFy{o{}A-MC4a}-ccDzffBCZZ+k|CxHBIrM zUdi#Fp0l;8w*OKDtAX$1{GS1kNaNf=e+S^rl1m}E)7c#@IUi3a$lw2u`h9nD{N{5$ zuG-Ll>8a8u)t~x5mkSm)NF~k^RCsyo;y6~}{EYZhBmNX%vt3EXB@-uSM`k*)x>z%VayxZV zO+|mHtT3yrNIzVmI9%RHa)B_MRF;}m)=U5SRPpmEBMEGw`twp*dRAFq{pZug&!>$f zaFy!kLwV`0F#d0&9tnS>;E!aAe0DL zvHBkyE&iBqB=!qxKPHv+&ng?J|9pS(^ZiDWfx6ER&MM2+e}1s|`OJ}oI#z}DuI^q( zCjNgN|9^x37lD5QzhUn$6YYJ9k-rDPL4BH+09*y{MfqiMTh*N79sX`oQdUm#^kZk; zf@FABPRfkQ3vPFYZ|jv*Q6UY0+n0@1IjR<#K_&-zaubZn2q)|bgIrgppsagHGInIP zhKDdniRd9bq!;~cct{$32woVR?hH|zB)EI#3{j! zUG0=k$odhc{+F!xE3W1BbW(h1rb~kM)wzQC9l_z9S?~K>TJm74(^$P7-k-0$U(gX8 z(Fyz9f(=2^SZCIcSj`&Kk?|qd;k*l7!J-S@fqEByqgBEb#|IHz zvYSyQ1KFbzyiL~M8|MHtIeBTW6K--q>?B=|1@oQ#ei?`yYc|AF>K&|9wYEZ`({~#& zv|OVEdWUAELb35_NBK47$oGKmrC5s#mZgwRv_eAM5`-4BY=|6ul&6vB=orPUI@l3J z)Q}C0&UVMe1+hjih9%01y)MuU=W~<5b7gX2h@2=3=hLhc!kqs6VIY6VPL~vxszrb;=qpWI)w^S}OIQJ(x3 z4Y^V5yFFtQGTP5?3G7Srpze?lFdG9rY&n42 zWPlsA0j{weAlYPqGqnLuwj3bEWPq=ba{>+MEqsEf<}^q(8Q>{xfCnrG=w&j%b=m-9 zEeA+58Q^qnfS%d_p59fEA1Y3e1syljO~&~Icu6M34m>p{MPHKv9?%B3!*YOrCIgJs z20-@TVg~(920%HNato+dwHRQa$pFX`D+6rBQ*#<*nhXGQs|-LJ#hDK<*kpjw+5oU5 z76W9P4A5O0fZ`4F8RVG^@E*iQmV+>!$^)3oQ=!Q?w0o{R&U|eg1A#0u8DOY3z~wOm zya)S~(T4Rvug~-R4}twKj#~!o4D5$-+%n+jti7|kPCsUl&ov`y!uVD3SC89(2PYn2 zZ%dY4?^@s~gd*HUj})UwLtW#dxg!%My0ODEWZt3;Cm*%+Z zy{9@ROWso_2Xl^JcD;L1b49mhUe{7@*QM8c@OoFg?pYL}FGlE#mCB3V7X3_L>`q_w zD=&7(N;Y2XNnaeNym;c(i{7KJo=jgIqrBRadWcjNsdL0WO4^Oo4Gq~hI>$&iIfGNv zoeV<#Cs$1wj9So|3`3wU3$%)54Z-3S(#r#3E2Xk^y5c|KX}4;+#R;#Z;b|Iw+8J`m&3@9PfOJ}ARtmpk|!hTTy!t`G)xY3O!6#|=rgGrCyqwe9S32>p#F0t|8glr z$CN79E~uqrO7}M46QTUR!7=L-Y5~5Ne2p)*j9zyfl$=c@4S!2?3RL9j6u!g@>xQr? zG$9LvDd(w~8B9gFuWU#m@mEnoMcaO7f{N@h?bK!*)wkw{!Hb6f`*|E+!0>s zi&wDrpOcM@VRa_{2y_&Bs_(%dku?tdDHT_dzW8OZJIlMA(@rW($tZLugy{RInZ=St zLOuOyO4kL0yABz33>pK$XGviBhmwDVbO#mMgyK~pXSb}yRCGN{is)@EX0LC-J={StL~!v~T=%qL zZso^JX=CGIY?7-E*T(yq?WOx{uw*P6^Z-(~KxnnbNx$Dq&}E zOjXP2KN0NF+7X@h7<%P(U>YJybizS2s9;RY+6g7dAzlOuq(m4JRuBqk{Mh` zKVQ5tCs@33au(yfXW;;fODmg01xZwWUc@JsjY#yoR$KLD-2U45%}a~dN}Fm)e0to@ zJ^O3$Vtmd1S{xIGcdDuAgbI>jS?E_Eq@qyZl18`#Vf5r^LLFnUa(ULTo+Z6;Cj&O4 zdWaQzZ{+c5?SS_JO;-%q?0LQ}&>-h9(KHzB=#BoPE((vcbbpe`TuD97Wk;D zYwww4NCp^~K?aQ)Axczi&?2EVVS?s0lb|F_fF!;ETP>xj_9D#is02b!5^}N~r7iYi z!Fz4Xy%+nEwu;nJngpB^5qbD3Rj#Hj>Pf?`Q7Hta%=iEAedZBfSHJJ~h2L<_*?aBR z+H3E<_S$Q&nJ~#8|g0dgBJDz z1--W;ogQ%Z2Icea-by}Oi|~K%H2J!oP?P1W$=7S;D@7>1+46NOLr2Ni9EN7_HL$$* zG{Qk}4Ek8UhWN@n^wxEJ{crjDbG~v})myvy%4Jn=J;K)=@)bt}wq9D2&|7itW9$7- z`C7o&jq-I4U)RZ3+$Og5QoTTLeHgEOje4NCZ@J#Og&&Lb*4=zA)LVP_yhm?6#pmsM zYZjJ-zM$SZh0jX8HOObN-g-Zu1$t{6pOf@fGPHdY^wthObM)53d}isb1AKb)RximJ z!iLNqZ}y*ed$Vj6 zR`9yJmn=)OERMV9cg{g<=^4>TQDnkTWA5r_`fIKI-Pos*C)9 zvdYLK4T%{Hd%kKbNpso14$(P-_ID<)-#0gCD3!f4FBdxT+Uc1Czdz=V9 zTL$j6@y3&bNHm@^*k{c^Ha;=JmZ|1{_6(L)CMf7;i-HEz?~8c@lnb8JV&IxO^SiYe zw!Yw|d`7-^ktRnN4w9^oYMod3NAdh5G*C6vQy1-x$sxExkMF9O)i75G0gFztniTz%U7?<3wHMPwAEe1OPkYc}ZLg~FmX=FM=rYhr*S9x%=d zaK;0!v;tI;XsZq14y3f>DI}*FtgjC?I2xShhabdZYj$#s+H7{2EfRgdGvcD`$=2TK zaJ98ALabHxgLoZO_7W=~QFa&sZB<6pA9Y!2=twnLL^5;LsP;~v-Qj3!odYl{MQtLF zc#G+70a-Sc^rXgVVbN+ z8YCU9xydZ9Rw~c@m_mD= zZEJNPSJkRk=tQ#Iw6<^@Etv?B2!E#SfoM}F2MTEy#_Ew#n*X`B)-C8#MFLjbQ&vEN zu78FAwtC2yFk_)9t%aT$&_~w${6o zY34H8|1=4tDqie-gk7N62XyoUO72b~|3wSc`&e*OqU@K5YRo7Oh2*x@hk+NXvJv7@ z4$^o{A4Lc;07Qo4i2N=Q`GS=}8fd2VR5FWy;#Cf@I1Xb70G&6z0B$2u3A;lU1jJe; z(?j=~o!mxoET@j*H2;pazywt*tDb@D+7X!2w}HGhJISn_dmeD4rGe$~Z*Ob;c@jIn zkZ6D?Gqt~;R)LN*puQam5}p35L`0RroD!4qZxCS(Dbxw|Mk8(US@MDBh#ZR3lKnVT z_H9b-+pD%?08qdOoZ>KzGdh#)PU7?h3#W+@U=XLWpW*}PMTR^;GQ&8qaQYI$+WlQ= z7*}ZfGr$hMRDq1wto3l6)YDt9g+Fh!~hNxNx-XqzYJi^18R{LyPha{3TECOlWEQY+u%WaPw z01`k+2k}5|apY17O!(Ka0tr06PIUR#p$RVljVjiv?;lmv>5jCHvm^h6NE8;YYuhi^ zp(QBtyLecGK*pu;2_T-dj<(hwkfK$>pGm2}bYf=vD+9J2Mc%4igj0j!f2^>ycw;_b z1qRJeA0mWnX=@Ry!od@VorVAf8xOe!A!m|Q39G(S?x@hss`hb0N?9Y%SRiwd%4*J) zET)#rOr&~_6^0v9vY^(z9QtyGiG#n4kR(~Tzu%FZ(<2T)(%IS%Aas`X5sZa*)YmsS z%&)u`i?!FT1zy^_()`b~1zZ-9$J#)+}m17O75q-AT!k;;a)nunA?{WXfqNvx?FwS8g1Cwha$^dh%TR1FkVCjf3h<&p?^dAW zB`8Ou1u7>Pg04fD0=-dz=1Ne?P%KbVmdy1?0yIN`UM)c>%CtZ^RZCFNf|cuAPT87k zBq%p~7AU7v3Ho!qs0wUVpw~*!oMf(&dt_a+6S=l1&XOxf^> z5|lz(3smwp1l^JVeNKU1FG0JLpd^2ZqumM6hZX1z67)zC)Qp4nBtXBSK))zKDgUr4 zAo)vH;8X(i%L;Uo1f`JJ0+r*Gpjil0$QrIdZR)OYAPzs?fP`T(3^!@~By8@jeLCLgOpqxu(1=mwNlrktS15}+d$Xqg1%S%n2kCPdcNgBR5WT$NFQa)PePZHc*?uiy~f7MMW5 z>Kq(3cez{1%`UthO3RT*56;NUPd4J_uYB$OH8QZGc&EvH2T{l{3mHZt4C!4*2q(_$ z)VKM21#w9d;#yH>kqlD(17Bpx5{AT=CbtcBxucb(?Se z5ICyp1}>1?X1)*M!NM%&jkxC%aX_rie2H-qy@>m_L>$VpnNO$2eJ2rz4upS>)VKwS zIMBb%T$UPlYa$M_gU!5)aWkyC+>nUFqG2;{NlkZAA`UC5%^c6TzPhcnJ}M`#Rl zLx}%QKvbZ`d_{+eP?Yf!_rD^6|SFzv=if z{Tw{!Tkj2chVg5{PvG}`{5IhCBz}bDZwubH;08PZ%04jfa8CW;KjCg1ZdTz)R=<4kZNw;UBjRwjY=lw9KC$U{WgBHV zd^5^&`G}THkO0>iW#l0MP+*jC^#MRJAJMXM3E(%%s`#znHD|E-&uG~_65uOF**6rx zBBLzCH=}GhAJMXv5}?u0TKJ7WedELU-_XeI^3TxLs~1~TBP&dJjXP~a`;ir)Z`>lk z$)EDi(8#^=FRDGm2a`ODryjrt6q@g0NxSLn8~$zo@pHZ%nd6f~>J3^o?!uo6I)< z(6828R3j%YlTcP|Xir!X`o_)jdyDmLXk^Lx7uCp-%Op^GL6YBE5&Fgs`MulvHneW* zEvk_-mr1xEHMG~Q2z}#W`Q2lEqhGDJsAlqwZRwRDA6gOm#sT?#%KAp9a(TjEl(w2w z63T%MZG;t}Z}iGq8d4PnS?SML;H#qp>JF$zsaog&(O%q^DnBAlb1;- zJTf%60h53F#%B3Vrk#I=MwXs`QH>nEOhWmHp*?Oz=o_Du-pOo2)(m46V(2i)s(^jY%jWH?+sB2z}!w`TeBz zZD`y8@Gq)u;Tx0i{KC+9`oKSZ<97MI!}>O~4(lzdaUUR)P~dB5FIy4%#@FQcA?w@F z4qIJ{>V7*1PQ+#8^D5^KKAr5@vPv1y|7(?S0fPaR@ z4Fdn78ute>31yRpc4Y!&LgH;=;%$=kCjJQKh3O-L+I!}{a%NS8S6)T8M{qkHnaOFx zC?N|56HH#RX;JXZ6^>x+Ci9z*@LCL%j8COuCI&eF42`Oc>g}Gy8#hcUjEaTo?SAV` zhm}6C=P#LWy$U_Pb6in(Dn(*-|7hgGm4FVKncqG03X~{+r_>Cm~HCL z+h0QyMLV#d@#=1L{=EE`?=rVPiqBL7Ei9k+sVAr^?8dd`+&b}5J+4We)N$n*H($j_ z+^?QseiT8{k)UqefA)ZOLshteHY3;BU>952m$-GB9W?i18D%KGa%pU82fp#1CHC=J z>V#muIqV)l&~DL;+}!-V<~3H0U{Zc5Eab8f%&W}xizAV6)^8X&H#hCHQ29|wYk}<4NWcG2*dwAF(9M7sE&ChB5|wRE9T_p z$S3Z{ntNLgr)8?$6DHc|NNN_i{+^*7}UxiNY|r zNwvXvBOk!}UbD=KxA@_t{f(+qb@lRA=4$ua_W>3*+rJU`|8!bLM`1d^A zN?&@-9~iOyDyTxhzW_1>eG&^lL$b)C@!ESmdf-&witBZ7}9%{?~Ner~F9gXpr;| zdnBE8xZ(=uE2n6!|6j4YMHZ1oxZCQDRAxnPcj${e`t7brFjrrmtykvg!HI_L_QD!l zw73$#X*R86fd-%`m*iq9#ykmt`SXn8 z8H~~^i}hf+QA}BzjrTxPZ#-J_O<~G@#&a$cHrlEgw(yb$_|%dY+HdM4%3VO>{02MB zEtuty_lm$2XrSXBE=_7Wa9P=!li=SoS8C9cO8d~|5M1Ey?I>w^6InRnC8rxEpe{Pw zezFU`FH$BTdA;40dL;w(uZujm4mF?*RayZWxo|sP>&%}DN&1%2sl4f@diR6ocn?d#Oz&bQDQnF4jzwzNn^^@l9vhC|Eko!|WOoCWgs53Hp z(7|T^?-jKsr`1$5RjNKuq|X1I#B4g)J|@fxp-8cEQUQj+H|k&)%A}s0Rh+a1b(ONt zI0cq&X*Lj(V5LKp-{?x;r**?}&@I^a1DsT4dUwi;s<4S?nmnQ7f+%WDF$}kI#f(t} z=&&JTRBRS5ai??$<_u|+brLRHNy<|7|LP4KjbxEr?z}1nlC|MC!{Y87lE;Mol&{7OmM6E z+58E5Kc{~PSZAhPE6G|&ENd$#xoqLQgQX|O*!V^RStdp^9r4{6LGB*{^?{i!)H zsgfi;`KIcVlTx2^jXrbf4%s`IVx&o174fQ##F7OPnBi32gDRo_63cZeUB!!4<<%z3 z!%}%J`2{h6E6zRWpm%7by3y3<9zd7q;k|nJwW$9CENcY?wEvjsxY6-iU8v)-akuB} zj`PDtz9hqDECH3E$Cl&jIy6jQidqy0S}e^LPC8u}g%THvz(lRUw(1`DwoCi&L%@wP zz`n{Ib4tJx-N~rwFgRjw=~#79CGHGY(|U8MUAMcprS(}>GqX7|9K#RwjS~UnkDNwW zSr1`)X}dNS%%TY;8V%)0q1}__&1!@=WK)O)_ zt8X}ZE9k;oF!l<|oh7OcM3xUBrz-o=D0k){UmKp7FF``sPNy|BeqeK#5A@xO!3Yye z4v~g2oW95WD*(2SuBVZnMpMj%&85BS<~Zw!{;~JM4VFT+QC^UPK;&B>^UbF@(UF64 zAMytW07SS4Q$z*|*v?Pfi>Yx9|6_iva7BUJZw&7Wnj;_=2Ogv(_b-qFh{i*>J_IY* z=1*|T3oXe^U<9~4=Y(My(qeOL4QcV_V8qaJx6OQU-yo(E^ok`X{}oxG!Wz`0Yj}xk zIPKc4fdrn$PU57UGM*x-^nGsm+)0*ZR7^s-cwm9%Lv0Z%ymqXkMnx8zX;fsZxE%G6 z7&Iy-sIQ59m?w}93XK&lKuA9%eqcth`N?RoTO-1p`6F<0Fa--H1@>o`P0}k0jEW+r zrS+Doerv&`hY)sO(0q1*S}>grIie;&{aCtNn_Z*Us64P3+KHd`$n+{}g8 z5XfeNVd}S79dI~{rjX$Qx3kDewkOW;NEYX)fS8ml&e2pBC(hjTpM$wc&TpzUgJ)E< z2mHVW@B^jjQ;Q$i3Y^xNKh!=mKaesXp9>c-0oM~*)uR^tp8L4qXVNBhX^&n$`LGD| ztC;>EaK$fj3j<&Ujv}3vNO1{0GKyRRCqU9eoJ-jAtmG181BN#&tTzvTN7a7tehh0a zj2KADCxdhISqzTq-wX3MC1&J7Q`XCA%6etU#-Lim;+B$Y47+4r@&{Gxo;uTSRV#Jf zm0Vg%t(K?MN|X#L317sUEJ}8yC{Y-4DzxIu!t1cZk(vQfIw0%m8IY*OmxbC<$3&^h z*rS?&FGeBbQAbiKg!BP(Y_&M2vT$2oXEs4vZ6G13r?kMS|jXl z4#!@oBR-jx<%j|SGWJAVQ^Ad0>pQt*eB{=c?i90gFyzJLNVQ!bhRc`p+cIE|r67^c zCE!}>#5>p}Tpk-wUGgPkw&#EjU@G*KdAvyy0X8<@TEoGA%aSP($1R8v-P7c5$b;Pw zY;V!n%}CU%?|MuKBZB76M7l5MAMcwi)2?=F?;u|_jl?%zk10TIyr{&L*m%Jv$3UGK zd2#su(#z0Jk3LD1<>(%?Sa$*~4!HFzb1^X68o6Z?^+|nW@hxT- zz&=TtE3axGeP7-|2?MMk9;u7A*h61{r5bB*caf+(r5WS%I+b6oWo4oh=8pcl8gorq z5&8$hWxcEjg~FP=Q{0wwm$kYA!EI@3B+Q=&i)qBJrt1+*9!a^%0* zH%bI@Bp>4}tS(rRu2&bpv5T0Sg)LT~fWi>iT%!2G@73qzX5%C!^i_!6LtgynZi#^g zAdbj-91^3hzB|P(NJom&-OcYK{P-?==#mzgP-%I^-9qDn!pQ4VfHxlB1?x3k2!mZX z8NZG3o$>flSQ23m92UHgxfk*WPkN(kG|c>{kgUfG=j3|aYu6yrVux>F*+Yf2t^?>?fI{%{VrVWh$xb)e3dVU6=Mi<;V7KO=bqBz{=^nyf3)u0*Mm2^d46de+ zf;=M|w1*&AyaO%bbrQ%B!xIu3y#TiF`}k$>UU$qWcJMKucPf>gckHKKs3L`w#U4px zUYndBC~tzxRS&G>xzgu)>qh&tz%s)`D(dJxUV$#E$QG33WLaHQ5$~dz?4p?kT(Pli zvww2XKfnf2;&rcWQYbkDBjB~UViz#t4UIY8Wrqd8mAP5A(7ngI6jJU4QatIq7g3J$m0TtZ(Bv|K4rgPBB2g+hx*cf!U9|D{MJA`K+y&*mVY0X{8Trr?E@ zFk4|&42y%d+Dp;$ErtXv1}@-Pi~xrJfO@>99*5LJwjk0%O&#g9OJ+zB7A)CrG5lND zXv4qxc7$O5XrWC5^YUYI`%5Sxiy`ishtPDx3?g5J5xML1<`Jx+rTX*LqbQ}}%6j#Q ztxCEXLlBIz=BY%H2s6P3s2EzN`5lEN1&}L594#ygdk**;2Gj5v%S7*R2W7M@Lf;p# z87)nC3(7aDF(DFRoN3e>N0)kYT5qV~kVs1#V3W9^wo5P)IfOu?h5t(owY-M6AfkvQ zI?pnXe*}t?B`WO5vN-@$m|~imN2~;_kX2M*tgIwY6{aY(dBpt)MuS-Rnb4Bnlh7N0 zazaNUthf2^AG4l(7CX&Hr3MVRPB%N8V;i{YiBWdq)Q5!S$6Dj&j=x2Nx>tan@<_vBJA zO_cO*Uk6d}VEzG1T%^iVg9C~%i25zGMwuoZm`>AiS%bvGmcGjq$@v0H-8uJ%A5x?T z7b>+*u}8X}mSY@T@$DFj*a(}l^ZZBU>6`x$eAD#vK4rVTMA{#z>aUqa)ANTH1E2mw z*6bFX%`>0v9|KLbN3~BpizmQRbgAgH)(nrBK4{Ij1}+_*3Ck73$S5Mc55|pLv|$AC z2k=&ENe#eHaUXzXOL-~?tK@e)0ckotlCG+H4sF~W& z(5AQYcxVCPe7r`&5eW)J2ASzpTHDI(8#2KK_vTBgf1 zSfQ)w=!@q=9wU<|O?c*32vqziND8NZTF)hViAzlPjPDLPn;KoV(5Su)^5sq?+WGqq zyX|LE&I zV26%T_j2ldR**bj!OWK8 zW&|pHySas>Sa`gcJrTQj$4HcZNhA=%cH_1bd2%n6n6!s*Mn-p5y)TZ4qV3D$7-M<4)jNrtvt@eO#-;&EP^J=F(bP(Ww&0XeyteLP3Fv@ti`UFA-3N+lG(C~pZgE!uLfmClufb+idespIi*$Ec<7=}b zwf*>gfZyI(HINbPpquI}ZX$=u{bMt0;s2n}-_7z`+VQC}eN8m(W%+qHn>_-vRHXw9 zcbC<^mS>=L#leVUDvUC}gSku0-5pyp!~88Yx!61po7ZwJCI$LctTnj^tbotiRy(kf zDZ#$gj{Q)Ky+JYtSwV}C6;~~yHOV_f^Gk!OVAA~F&f-0-@qGI`#cm3-IB}q zh=YmxbHtn!fDcVU*-GGnJ-^G>3D*pz{dKeI%@f;Yy^uL}v8-LAEAO;bDGnmBKlJqr z4<8W%TJ}S*g>kVo7X-7AZw>Z3^NOKqwmewp^Q8BS{nHp4{vu=whcSjn1FoJhC!HX! z{eYoyRj@1`h@9TU$|m^(7mn&>7-kTJT4C{SRqGv`ifbzhY?v;98kf77&h`W(?{8Dv z<`b-j=qI=cb3eQp5vzv-cg;VkCh=?r*ulH`OA8V&W6r8BVCSjpi@4w9ND z@)5_JdLn0;MGmwnz^KY;6UNVHm|yxQ^MVf3iXl>Di`3*lfNy9RkmvuC*at5a;8}{{ zXdAe6&oj!TY)Z~BV61l4t0OagQ9xO}ziS-sF&-X!as+TyKe_{YJ_Z98*6R0Y~`;efpgM;%$Zoyw;; zn9Y_%hw`vM1ZDi~h_@0}JA5l#OFZxl zC8li0oZa#$s!vU_rWIaW$YVxuZ0K9=S~5()VI(2K4`P0Eh>!cefivIPUq?pLsJi94 z8-AIj3s{#ZfsR>tSfnJoZ^-tS!G%Jowbjh70E<+$HST*cqrZK+&HN(*(W*MgJ<`k% z!K;dkc~ra)&T929v0Ze;{U1DCK65`S`H$Z$K#Zl<1$@_Gro|B#{YA@Mg61-8q^zE0 zJPr=TDmWCTNEG6Z@$d(69(icJ`8DK?In3I76u>c-3Q+q|c?J?cfRtoIRwiY;jQvM8 z^&)t#A#9KD!lIEH3x7=Au|WYGx$pv>#eIZBGW6JqI3Y2fmsH+JO@Q{u^ANb0nClU* zVmWqV>hhAw;;t2I1eUyqe~d0&jhp1|<_&l=zs_|p$xW5Zwd>|{tihf-o&ik)Ld`N< zf#BSlvI0-!3Jg99>wO<|f-rkS0Vf*?ShuMTE7uq0ae!=if*{C&3eZ%VZPdu;!I4Q_v_Y=6^aLtD-FWO{K2Adj}CWAc*gyNe{!Ptj#pG!(p#H53V|eJDFGBD@UZ{%{cdTE2B!?`#4B=eZ{}Qt9w6bnbWZgFREh-~r z(|1M0e+s|D_#LpGZ@~&>F}X~7-m;AHNo?vw@i-wK*D&RfESLh#*9k;TxpIT|gUX44nLZ%R&m z{GtZHuI07(vZsT#+hlqUh2|I@iL&pO-m{GfMa^;M7?wpS@@%31oe@BM6G50)^fBO z8q{~r$bVTcEjCIO3uJx(<5Of+Q&f}Ky~GFjgJ3FuaBlr1`ePxpYGhK48XkC;xxkE` zj}vWLT?xwg0h%Hi+>5~C{~C)Vx%OhTi|eKzp3dQW1kP5R(TYkN)V8A)(_n8qS6_xX z&HGu@m{h~nVWez+Dtjgx`xU;83Z7?!Qvdzml=n8SsQ}|i9-|-EAEkUV zrCAp&?=$%8i%V=DRE4GF9A}+m13pXrQ_g!UL2EpugLiyjLCSDiFwZ z&pNs7c~sHcxle9YeOglKKlgn6aS7K+aih3{+J{uBmBK^a|C&*vwuvPUj$Ix8cI1`; zo<89s4DvUNlZHd8Yv@_o-TWcInpQb%p^`(8>ll?E~fjUV`RT-+}hf{RhsF=%GL2{3cYwM7poc z;ci~f_F$r(B)%-YKdn@ka)OcSEK|&ZYx^{LeTSbb@ySiJc!~FiaKXrjPQnS;91(Cf zEgxYET?O~DdS1OnZMkB)R}#_6Cg)%>ZVfB^Y2sXIl0>P50<~vgLa(0 zpbw{9XTQ5j))6XeEl&dNBrq(K1%78}XhGn9cguGX7+K}2H!Eay9ndImSx3OY{q};u z(y&{4(1!2qXkaPG&m)_Ed1PL>vJVV*W3$bBloAM|LVvF}|0yq$AgA!11^%PT!M3KV z5ecL!+!OJVq^`U}t!56;(Lq2y&y6^)+nG<`C1@HzDfDc`-g~6T45t%p!RibOzm@g25O zSb{#!kM1*ohruVoJ7*_Pf@{p4Z-L5?{PUeAe>)|Q1?!$e{deN`0^5O~K1!Y~Z{gW8+okXW zK}OnKY%PXhQb=uWJRZFk)H9-RbZz?O*nu1@JRIM4>ogW_juDQeO)IdfIAb@OrT7Nf zDSG>7>U`izu5W{m6MK<0(Uz+^cFp2hm2mR^nlb!pSO-Y}?LTo!hjkry#Hsb%k|X~)zP zH1h^GkmC{F>qFBp4D;Y}Q>q=G>48!Wzo{(xyuF`a%%j2m1t>TeMcsp+cCQ96`Kq-byf}B)&i7V%=OwT{eB=z0NQGhc&_%y}EC^h*C zYJca{iJKzzPLs}?N0_P(c&g<)A z@Iw1i(EM*Mn5V^;BQvwiUtt^45UMwS9K_`1hw{EtGKjBR?4jCeOV7ONFkT?@nW*xa zE&b8Q^ZACA&z;C8p2;DRKA%2R11fA@f`WU0h8iShN4Y-8`bv4MtnX^@w%@{;S+c$- z#4Vya3yXd+)P->r+cThUH(VrYPH7$E^Y&<+r?ivfa7eZ%SYy6AlcXS#Ezy;&(4NCb zLvEe<8^p7kEN2MX-M4<;e8~hu@#~4*$&srnDd#unztx$uQ1OObxW!(qGEiFg;PG*8 z=!q=zKpao7yg1lx3JkUr%;zw33i#RW{X0|uQyPy~^q1T(WW|sDy|6oh4HC8hxW8Yr z4$J}!4%o#Ci2Hfss5S+4mFO~@Z9;yURgY6sm+7dGtpX1^lzT87<%W0TRNV{Nz3;=2 z7kp@5cMbH9HbHv?OuAO#7{KCnwm>Cbp9}b#FMJU*Wq%ZvQBLAd(@DH?5YNM4^Tnr0 z@bI~-3W%R9sdlUNa8hOBJm=iXg4!y0yMG(H!egPCFJ6iimBH&+M>huG0pA}(x4~sS zz1(-C`3!iuKME5DO?lxKqE5Qhw=5VSgwECpHE+K z3B0Kaw0Yhoa9r1!)Cc*qor)Kk!PuB=ELhOj!gbY@Pm4clN#gSY=VPDfjomnA%mhv7 z{=H2_PHeSb#|+AwjwLn02HV2ke`5Pzbs#n-m#ZU$c}F>F@;h*)SBGjQ_wsM}k3b@T z-4qfrM=rQve#E?jUDO?Md>OgbM5Z|DTr7OlY<-MV%n=YCcK#y#T3uXC z32H{M@LsEARV-Mwt72nvPyw8SX#?MOH{%G+Hti0qukPjmUVHOYozola3sJkKSolb6 z%oJH++&+dRz@eSSNe%`CHAPYBU>!vehhk&02;@IB+5fx!E>UTS>~eKbyB59p0hsya1< z=S;hilLg_ZkBynYcqp43O7GN%*NbWFY*z1&b+JFH+I{cL+PS~87|1`PhOP4uX1?(U zh$d#EYt8F3PsJ8)!8XGDE2az}l+qOQ#Otsnxt^gfCqmQAKQnYWL!V28+Rc{`svXS| zdl&9z)Fwnd-+?zsMDH2#&sa*-8bpbzZW(KqBaWk_X@yhr^NQh;{CrJl~<$m;Z`X12;0o_r(%8Zmupg+fN z0zTF8Cd`>&57?3Zk>z^R-{W43(}cM1&6QZYQFv8{XbGW+HJwhvH}<6O8I&u>5*%-~ z0|b88BaWuXluq#m)VR%w2ol|x?tO6AcsQI<*ZXg1cHHmg(THo3<#+Q6W)b(h2~U}x zk{so9)4vJt^tibanFEVIkGtFS?|`q(@GoQGW>MQuvlAVttSYOjKlFom8O^c`2OIwi zie6Jl|C)8-%M`_Jh1x;F;DKC_cFj^TlRM6evFx1gHn;gXSaxHu*v&o2H4*VdA|lQF zRcb_YA|l<~kQ(vLM1;d!of`|NhH~^&F~<=de)m5wu7t-9ZQ0%;jD?R|}{4#mj(ZT-B#( zlJpW-5MB9uD0BNwTDVi`?XJ;i*FEBhb_N1=e?*f4l1R?(W&55&)`AGvO$V+ z44RuM_-RRP&+Uo%^$dCGM_BwJg>G~iek{}2i>Ut4mV2FGdqD8rxby)|x_bi?W{3n&V&%!*_XMvYDFpFT& zAe|j-lQrB9oY`+@-V3@1DL1K4csVY1Md}cvs;Y1 zu-QhSoNq>;l8;Drj``nC)Dkj+*YPy}@N8;Hs!Ys>v``EyfzS%zW_As>sIhVGwfm6+ z#EP`fHZISNwIlDQ&XeilVCU)dgMZ8G@^vrGlyQAd`a<62F5M+f52?niy8=3xH)i4cf%VvEE8f^FJGJqQHHte8F0hn zPJNoPb(07XCHFkV>m|5uKgw4#BRtku6AWi;aY2t_*A_?k3%HrzwB1=;1JU7F=sFT8 z7`|kSGYm!Q(pWqy9Z@)mVUT;?)e0@stB#2%PE)F}kAi-<@6FK7?dfIEd1><>Y0n5?^8Aqyo#sH(Q)_)v>;J zpR$2sLU+>+fPX+lVYCf(xLyw*Lj`i$hl^-UAW}6@hJbb)SZ!;N>c3VIhq+bp1M;jQ zu1gegwC`Qntg$LfZ~JJ`SyG0^7I<(3hnnukMp5N~Yl9}0LZA>bY2IDtyVF!PQ|NaP zKIb|~#Gw?y4HYMTW$$g|==wz5m4m!1SW9C2B35kXBJyg>OK?m%E9%$3Q|esRPg*Dg_>C z*Qlze&3{;u@!>cbn@KW;F(W@s;KZqz7tfFg=sgjBo@lQ{UheWYr5AX7_dW@|Qv3Q$Q-2Zipib=lMw}oE^qFBJIkX>+~ zcod%Q^;rX@76Sz{CzK6vx8o(>JE5^`WPixpo+kE{22kEqJE$3&&3^4i@YP zsd=8BMFXXmSa~UGmiUD}(+jEm+&zieV({gA+^F3IehzCXWE{GGOMa|QZ`^<#)B*f@ zObC;(KyA?*PZciru9^a|R@LSO>tc&sI5YZBtX?#wHc7#Vi$$fkuy%7eJ+dNJq1SFk zKE9JHUq!wU8Pp-Wt@w4A|6+l|ogdcMo8cB3m*KOKrCBR83|+#rXLs}8&<$Ylx0jIP=^$^h6g%OoeqH2Rg{s#E&i0lDi1QxDthMpn1r4ZmLR73Af z^)^es_s>*%@SIa*ipz*NS;i`UgyYJtrw?{2U|j(bH4b1CdVvs{PRr}Ubuho#c{;7m zTz@%?!-h>-FfDo(y@HRUFk=ckDrGLQ1aj?rq2`XdMjSU$idTkvHy*vrV{IXfGI`8l zl&Le0GAVP1g1dMS%SS&(#FxcD-s#R*dcFBgY!37?uU?iFaSZ6V3-%Ch2S8y3=lKv^ z>u$Z?0ev1{KZ<`S>nsVI-2KGI3ZIf+`YdNM-<15)wwuT=o$pKrr_$uRT;#h>CD@KZ zhmOm}%Y42i^KlSSlJCOwO}Ht8(q( zk+HC=&inwpn3Q&6AV&Q!aaXe!1ChVO=3l^=TId(mIRbZUin>MBZjs4Lp5TE->ENSb zM5mT~>qv-r3NiL}haHn&=}Y^yU0ao9YpdO}a%f>7%l*issJ$=XZM?V{H_^U>k77L& z8$Pm90axF*IV!?ac-3*HYC`yT03Y#$=10Is zyZ@zg46fgNNewP4a&!ISeaqDQU!rE=?7IBpxEtWX-2i7jIDmPgBsV|CQy9@D_Wcgy z)~5Y=oOt8azfxtr^KV01vcC(XlDtb<;%LcUhY6x&im37OLV?K66y8gGZ-(o|9bQqM z>F|}0bA)rC#qSD8(q8-vrGtf>a0zRSs@*P}=VXcLGer5vFhwlpeB{VG=sV!vB(=2^ zWZx9oj$L_o%*d;mfx@$WZ_b|w5Z>k5XGNwC4!oniSRl9S8oa4o zVosrK8axZQv|ZlFGA|T3N~AeyF*dJL$F2m~pF-w&yRdue97qS&hf!;TmP^D~mE&wP zgE>n3Y3VP)i6M{9EWJE6e>A4fA1lwp51bS;S7QFq!|PgJT;-as&s+&r%}4IU8YC)~ z!{n%|Qs>kCNVQzLHb^6?8H|SI$$>HMwG;489jC2ui&Jrr?%$wxMwj4ve#H!MIQ|V+ zQyCu-y@Gw5S=m%D3>zE-^feMF82&pF9yD{Ia<`$c0g|sLXlMosT7R}r?ZlRf!Luc# zySW9kXS=iMv&majd}gh4KU6F3uW zf7hE;UUnpSmsq$7d@*F#5l8zhnaVVCpdBUrZ779HDA>Rf{ND`L817HSerqm|E%KU~ zAP)Vess2a9^CSKqz=JocMoQRU&5LqkZ$o*&B^jeGuuAwU^lw;-MPq}R_cgS&-a!V+ z-xjQ!W&ZRbS*oPg^?C&uqGr9qvsHFcI&g<_fg{}W?cp`#_c^g*Hzd!&;%nep=U|lZ zVe`EZ{G$l3;|l2S0YyNbc0@f)K6<~3cH|%Ly^FM7hofjO7AMC+9G4eDaZ@Wt@VZJ4 zko8!vI(vsiyluo?8fIGeZ@OVY!M`4Wix2l+2FRw>Ujw0nooEgZgTxYCri0lAyUQQM5`hAd9Z!jyc_(R&DsgQ(`&x>ZiK7p2Jk(W^Zzuuk_J0gwXK z%#3&s!mRZy2ON$zKY?(N<1A6Xs0I`mi7dx=(EJC;us4J_$s+Hl2YKw^%52U!E>~qP z7*ansg2i}$&uJ&~#%RtK0j!o7m55qh@w3&^`^HI$*7 zS1>Cw;+t5?Cj5SGzV{C)luCn5K;*wP3n-NI9xAfR851oyT**!<@oZ--gf4ZU-jpw6p(JJ$xA5Vz)lS&2>Q7Nu4e%wU%J3iCft z2HD8qM8!QhIoKsetU7w*X%XGtHUwN0z)BK#P?@M*v8as2rHCZ1f{t@Vr>Zd@7G8(|x>wzd|N_t!vj;x@bRw5|2;Ak3h-c%ozwu&zimkO>o^eWM|Rfb)e} zDn9Of;gqNvh&bR|xHWH2=<)^Y3}k{Lid{xA&r9Lk;FL}4wTIuwBKn5FI^7KmpaTn_ zeBI1w8x9BUky$S2A(S4&^rv;=UePHCiwNI%4E)5+5Rxb)96a&2MEfI-;?AD5bE^&I zOSPd*c}kE7VNgDxQ98^D0}ci>Ap=oox97pE6#Uj&;*lFWzf71*%bAFXiM&6_##2jo5WwK^QTZhQ6&fNatXsHrQT|)hHx~hU(-s^$=J$wq zov3hX9ZtyP(1yfx4_2IBP&}cmsLf8V6f>Oy4RfG{Q$+azN1r((o>(1u{v8a4=8#^s z*D})>h4CT1_E39;v%^dWuNS5ePgLN1FXXAgan4rrVn5D8<@#4M8`keYWhfgxiwiSc zXKS~%AHpW9L{x28j7D6>?-{JlvMdNDBOPN-au{1#k>tT0zamxZ%uiqtP?ceRfY@ z<%2w&Ssg#AQK9mr=8(JeQ2vWB-P>Vzf3NezpN7Ykw#QqZbH0ZxgXYF-tZ6;;5cZ1N zpL_I@Q<&1>|DeWPt>Q#CtRTGT-iby8Yp~TpZS{Fx^M{ZU;>IZIj6G7+;j?K2p2gQi zD(xa8fyTiil}n{a<#L&;bG|+ncLL%HnXZkPaJ#R>f4{j(cAOe7H{6yYPdShMez>Ht z2;RD>+Hi|?i#1`!-;Jg=+!xKXnP0yRuRWcqOw-K zCvvOZ*SUDESmuqmF7oYJb`d-#oM!K3!WdrE;k5O2VYEi`-o$Cyp=DPhFaarBw+4e6Gu^f8QIWwnVx)dP=ok0^A%V3t zGA0O^ir_7L?AMj?4(lqGr_S7&%iy@}J4yNKKcpA6-be{t65-$ka%@WSgR|=DXPZAQ zXBw~Q2GzB^xFQp`cW9ggM-eY#O0(>A$nwLk=U;dtdktxsTGY0@6A67w_cljiNq*Ni z4t(Ekv-|cf{$Rf7O1)u(^im#EfDIMTz@R~zQ;&%x0C_P^_R}LUn6Sqvhps99@RX88 zJagE0xDb3dt(i8D_2YJ+BzJXPPD-$+;5IG;^_@u@P)|&O^ z-|!W`%%#S_0n`ezAid7T_#dLX<87=xY#9mdK0oH?1M`n!#*u5zA(VvFhe;|?XwB&1 zBecTeFu%!D$P_CqL>twZ#sOnzsO(s}0M{c=sS8l>gOpBG;}=TKMn(rry+BMejAGJ< zpdi>cY{hWCKYleUT&pEoS`GLm98(ld2x^#Br4%pwwm>o2K zfrIn545SL+pzG*ear>dD4<-YcY@`PjT^+8IU5!r}h__CwnWfmDx32~=hQK#j0T@)F z_0K`}G63K1cP4X?>Af83sp&IP(+@J>5KkXJ7{NE_-8~~Q|JR&D+l;nm;VQ-ll8aC3 zxO&De#BD!IN*@hyDznD>0x-3DARCVyJ&@ZLn4kwHw!tE~pPD4R-ZU0F+@IncRAM=0 zV`vS`g?AT0H}-CbL*jUfKY2dE42A|x%O0W`XHd!R7JbTos(Hg0GJUt8*E7hXob7I36s|Lm=r_&@l*4W!`emg>X;> zn<|+6y2Pb9g+m~zTuD@%t#Q{MD{-WT&K8Gpvz1f+Zbz;7rbE9!*CD%fPO?j9Ye$oF z*wH~}Bug-b^(YfhbAgihxSlo%#+!b$g$5-2hb<#dM@%0e3T4#b*^9tbR$oG-%6M3O z_YF4k^b`=7GJ9>o`P><^*IFVTrFFp8Q-9yehAi{z&~de9ufv?SC`UWLt*7SLUBSDnKDA6Av2=oS6UVLwKqI2Hs6P3cDoF zW+UR=x#F+#4i4yzTmi_^$Z*|)``yENC+6P)bM6U*^gHOzQ(Pu^=3OOqE>?$(&Ud~B zR(RTX&m1B3q7bX%wYU)n7W~o$aMXvp-?{vJ z^#{E4SR_6?fh%xWD%{PKO)eyN+%U|%0wZD?-`&jz*`M>u+h4^Vt>vxoWuO3X0nH~7 z9I4KoWlkQ4%YBmVddh|+1tv{D9qL~DXG9mybGg66m7;K7j=Oa~^MR;wSEmVy<{I(R zU_m2yF`yM6YAm|3QA1bb;K4o04o0KIlkh_8;EI#5%b>U)`*O@OI?j|ZKb64R?F86U z!ZymS*SPpm?9wY4s#m)7>Itfe^b zcu{v)MIE^`Q4|ToNVlkZ;%xIp83iRU%QUf7e|Q{hm?%z~+YyZytQ2*6_>}pVuYz;L zf}l9PfFlzfpzVg6+0?ULBZFDvQ)pmo9HUCywp{nDmSCxo(^KD{n9`goTI0YjTkJ`~DqI@uUX6B)%i z>~5I5E(H}qjKQTnMJt?@uZLkONNVUgTvC`Fs!gE2%Aolz$N)%U+hx0gPuZFZLA3sxr&Kdtc(lKohe$2;~Zck57 zPfN3>rGx(Pn)-*Z^ZwcGGUa*Wkz<_qwB|eT-$e_;BaD)AE+bp*9I-{;k^#e#0gGh- z9Y|OZAsH|<8L(6a3{M11mihpxh2dSUw^Jc~{|gWPzFP=f1NE*)}zLaBj3EJp@BS>6mh{ML|^n z4>M>mhF%IQ#kHq8dmNgqgw5Tu083!suPyx5K*urvt-AUJ5N|x6iQ$CX&^S*~@=eUI z3t(M7bP?tb*tzE?r;o=v`Y;2{$N5w;*jowZn+`gno$7amisY5%aCSqE`Nh$8p76o; zBbWg&1*0H*D27Tw78DD2L3dN@$xJ^8y<+#zI@^Y+8u(9@t@%{4GvA@D$b?*Q?|J!a zV-SD6JRx8n%wJ>Y^m81bh}&>Sgq#WnG1|Hgdjq|8hwgvIVz~bREP(mmO^Adk`a^1y zyc@#et-gcqW}=F>F34}$csysKk$HP~g|r7U2%e)?ZHKL0a<8>M6xFyL2i!CpUuXW~ zZrlu#s%8k{QF-Gtc~Qwz&vZn*8MEqW4g-d%d#Hcw&U+*M4F*MO*Uy58}y2?p}e@=bk?ULT1nb78cM-M-P{Bbd*2PiT85bt63+%L^?p+t!= zItM+oXuWXj=w8$fFicUV*NZdV4+2KNbjK4rHyHSV%ONly1~4dub*qKH~@Y42dWVD7cgq3#gyuW`#JH8pnG zFl=#RPGbaeK*iAy|3oB$eTKEbY~+ZSAdXy}jPn-qQL) zua5*U6Or;zT4SY3D{VJU+6K#&fRy=t*WPCy2?6!i&*%U7!)J14&e><}_uA{d`Yvf+ zAfEL%XkvH}a_*zh!cS4LoF+48R8W`IL2coGLkAMr>2DiOTcz0-L&rnB8&W=T`5g5M z)(QTn+VLy&w~DM3QNK{|7Iq5ptE6jZKxTIPTVLl{U1*Lx8;fOzbo-LPvll;v+Im_RDz59$yi^9KU4ZI+hdKl6Az1R^S`%R&I|2zFu7|?XB8g_7rls57 z07(1^o;<{Br7yuh-Pe(V32%ibQm{tM&GWFJ5z``Jy4KR2o7M+wrrbnudtqhcL#KQ; zJWKOb!o-+S^tUbsICQhWjRTh$rkWGe`$ zFv5C}v|?R43Bm4f+ai7b7-s1v2EtlBgUv(E%EZ;pr?c>z;m4=mNCl}XKaQFXLkCMD zv2S1vw28A@mMeXk-#lMX#9aULjBf+}X$;#xx$_aikc4Xugvd)=@=_wr{M4T%$oli!{H0nCyun2Iku+t9yr7`8{aSs9q` zUH-09(rQ7N6Fv*$sOzbZnxa?~OpHP{FY)4XKyuNb=gORxb0h6}A!I>3RcpSLJRW9f zrwt!0I+nFFz3U1&9Xvp!V^?0&QV@ydNf076GxY)@dvBCeM@p01K_4f^%7%zO+o2#- zj6V)e892TO)B2C^`tG=UJw82N~fMb|^b-E>{L2|x{ea-|!kZ;9KWxSkr2URwUQO*V-OCx=lC@R(i0!n0)BeYmW zq?6Cf!__k`_P3!)mR&c~ODe5W;e;m;wE{<{nIXdn=ZRQijEE&hy$2&aQcQ1eZyth7 zC!8J4Nr*s1T-etym}>1kmq?Mnw^k^zH_3Os)t8HMoRP|e`Uw|$#KtmN$n%r(^HU?f2L}v zz^oiSu>R*`Qk`r=r#9O8VQVa)#(5uHW7yRAjUl>583#If6$}3+9)yUrlrQISBj$+l zd52NHaF;?p_`KjmiNloMl<=vm$D56J4m{p;Aj-yLtOo2n|C6s;n>woOx6IE6h@K^0OiKQ#1)qSJ)mzC`xjn-8r4s-^&&S)+oXmUc<5J0)TZ>2c!#HC1^xXGA+l8y z*soZ91xWrUYX!ICq>N6ZW0-sym7|R(aA+7HM0aHDInrQ9mfn=_h!)g&0JF49qXdul z`bTBQDvV4%TiPD0VBtV{RDg!$VpJoh#0Lo7(Z`A0y&+#h;Wv7y5XLv5z72G-xa=5> zom-1%0B6;U3T-I@J`o!+NP0br0whsMf_fn#U0w{*Z=V5WBvO$_SV=E&lRMY?+g{)s zhN*MBh}S2Gl=^~lz7=T+wU!f~CJ1>X5^CT2EF{#PDT0lMCrG=dJ`1|F+?erN%VrF~ z>2n-8{V7+BTSF<71LF8q&E=8f=Y>y4&-1c66NHkOo|lXRy(Mz|YJZy;`a+w&tlozm z&3t;evP`SH#y5HG>BVXagJivI^{UUo&^O4P^`ju%r{hrItVj~G1)B<@%Y3R4^ms}g zmq;52>bM?cO+;@cMV;1hRc7kA_+fNhJVVDdeLT(G3+sg!jWi^ShFF!py3&`@wrzFx z^nCRQ;#)!jSkv=im2nur(sl?A1GeuD?JW?^+L%QL^mb|*qJF}1Xd0=0#05ko`%CiS z5H!UER}dRiF_@eKsexXC5EIRxT6<*TN>0)%S6{-3=5M>3$9DPmrwnQF`k#L(a-cC@ zXqUgh&*l2(74Z>v`K~FsEnm<-CrUaP{9UHb^8b7@WF`^7J_bUwm^RSVwgzVNMzh7e z*pP{RM$(i*qggr!Q5z(PIQc+2gEfg^9r5DznBdkxRfZNn#B8XVsSaTSKhZn{%S2=M z*B)tqFFF&>Y?=SAN|q0TdbLlB@7uXpBg?f4>mr`K7Yup9XQS3{79!+4S@VV5W2l5X zUO#kwhtMJ@nO6DRglaXlV~)IF3&jYazMq?s)et;wzvWvjIAbLj{m^?r_Lu-WAbgy` z=DhJsepoZdV^tRE%Qvy*BYkMp{+0WYK3t7NuOwtun+T|IW<^j-$>!yhYQB{c@g@T+ zySXU^r+J|~{TH4#*Yj@py7YTh@}x|j1ZW;0X0ICA`U|el^KlJ5*}p6vWM{iQgFGMXUaHuTp*gAV zgM7*L=E{OG`ysKsP<4M@Rt1)Zf|ccL!IYqg{7=UiSL9Pp(09sf`ql{Wd zkrketaL#*WUQhFKPSWwbnL-zmHgQyzf0U@iJvj{L06bA{j)bgdF^8fuzq+fn+h&nfllSK)hhLYwGap8msp478s>U;lkx%$T%v zahdOd<;ORuub!&B*js25fl3dVcV&*xkE|%j!c3s1Fi}%rl@+Y_5ZrYg$1iI4H$?n- zyN9DY(l@jjf8dc}x3wlef==7t_9o~-lH2&(_V5jHq(^!v>C}Yef)gH<<0$N#*jFA7 z0FZ+r42&;!Qk|c(RS;Px$R$Oqp=Nvd+2T4CxX2awY<-CWPmllN)A z^l2#+k@&BQVM6$r?2Cp1t5R>CO13Cjy3uX72hF(WvP&n2F1SsFJ_IJTl)z zSNjZBCtwN&^;QMx!O1&B4oQ*rTBHG@rfEJyD@y@(>PCI$i zx68gS)B9fi?XV1>(4BNYECc8t71V~iMG#+g1$ISNv>bi}S$FL*H#&TD0Z4O*JHVmt zfuLb%4H=mvO!vsZU=ld9FxpTQ3l?*TCNxpv3`+)1$rzNA4M?i927g9+h~R)M`(=cA zBAv$VSmc|ZY|e}HmH6A9mG)pg#znZC8n5T$5OL)rZN|Ri@Mae*guk^}Hr8q(QJeT? z<#dv^Nsg$?MRIV7kps^3qD24D_8^bptaIQz0o!+N80}%7bl|{M3|yq|c7I!euI8T? z-Oiwzw5)Ui5>G8F^|wB!$7_Z)b1DNG>6?IAF(EPf;>$md(ff_~CdwqOYA#CGz7H=< zBdMK+Tt@tXsL##3iYs^Ds&GIuqqklGxgB_Y7I=vi@>WxX_SA7xB}O8+ra#`ElT9LiqPx z681L@5!SgCU8o zFDVK0Q?efVOPGHw1x3RAJ- nM2PtrGnh68tCRBykXe>_zz)%&+lfzY4)b?#_)oV zqc^>WnB^TRiWiX)1c?0Uz^(j=^o{qoZTy%9Eo!RyHZxas)xbs=X>fdR5NWT29+#()D zv3jK!*b)U>4oBpf{!v5*GQ@N8V(6wyLpPaJ(J{9WOhP9k=0LLU7%@)A&{Puvb2SY; z*Vj~tCRcq$>L5mm5!*l?Qx|d@j`51TScRd=D-1<6nAj$kt%<9D$#=?H*O44IFN&=K ze<2|1ARr{=HeD5aG6`TlP|7{)!$`Sv6S;_ahOzIs{D@`25RTH;Yl|4J5NqXm0nY$i zP&Ac3CuR~Oj>+cu=)&>I8*>>3@pc@JKDk$a4IgeQRA2a;9tLs0bmY8AO3a}eKLlAg zH%Va%`B5YFFo`fSy8EpXe!~&7I5axzQ?#ZX42-_RZ|%v21_62vrZhanUXc~gkMs>| z9`=G(koOG_4|zf89cZt|(LASku3Cg`{mhV~w|NGzU0IrB6cglAa#st56q@NVN{97MgWwJO(5d>-WUIG-*)Si|x!%aiRk z{bc@;-+n$*etYvt=3i6rboX_XbFRj*c@W#7Aq?fuGl|G=J~BhNH6fQtpyrBmBR(DDxGgG)_5gbmP1wkMJ6Me}0Qs`Tin47wxnO zR4ILFDiBL4_0u@>nc^Yvk2bRFB>x!nXjx@{-ZJMwVM0taF{^5;4l}nki7H`sFitY| z-aK1^FWQ6AF!pG2992CSAZmQu|Ih^DP?_OC5YZAO#e$vMzxBf@Ojp!Sc_+$%zr{&sNWd9l6SCzbG)vTt{el+ zj4r{<$bN^z8!=9QGb0g(f1W3DJmra$bQK4Y`ohArm?4?sZ4+H{VThCI`y(rq^_h|< z6r23=1eY7@)Rvhk(5z?UKr>1NEuvZVT6tC%$>K&Q;c`}BPImI=q8owUZNAiLSW)-_ z<7;w`W4}4LzsUmQZ~_Or@RZ=CKkT>fW$w4BgYP%|=cBdcJl@0K(Bd<*vyrzi{tQIG zVpihX#OW@)ibdb|FDzG!QdM2V5_EPFZpZR}@l=Y3954LD=|1NT5x!dCUAzA}Gg{S+ zQiioI79Wx0xhG)` zLLLtZDPSFs?99C*AvXxuC71ZHO~Zf(x~%BKbv%|SUa##|7v0QDyP~Ul$WRkjP9@gS zjA}ef2^SDq)r0faE}i$eyUt&^nG_*Tmq>sieX+vZ3AB_~)lC@n?m^vhwNGx9g0R40 zvP#Jsb2h1LTs^yuJ()#*|oFCXVYmde}9YhYbG?bp(x@|6W;S`!SS&O$$Z<)wh zvawH}B^$VuCgOhp(Z_$cc6DMH9y(*oTx+ix);uH#x%eKhW(AGQ|BT{^XiR(lq`QF7 zL<;>;7mB|Lxsqo$5WuF802TR(CG!$XmKaZw9cmUB6&IF3XZR@#)iqFe$A5OXT*t&+ zf6Y451F2ecFDY|bTc?JEqqHLHkjVp3wVXiEzY zmzfZ@ORcgc2uRNpDQPhkUB(svFjOknBl?c-HV$h}r`$^MyG)Bhf;n0j(di))ZLX@=TNUGm58Jcn*kC z`#KsXxDory+3aI{26n!O%%0DaeE!JiAfNLOSGj)1wUH&@!U2FYd@vTCqzQQ;f=*)wC!g34qnj_L#9#5;SbYHoB||AV)s}Lgqvihz|Tq7puXi4 z4!@c%Jb$bDsV+=XQ{BzSvY44OCBkk?K{OY$`)Er(0a)TW>%S*`7=Zcpwqb z5*$5Sb(M(r!DsowViIY$K{d#7$>knLvX0Y!iX?Uub##xbbu9>9k43MrJ)IKi(^DF) z&WOpR-WAfL*XXSOP&x~U%7|td{-b zvBav4s;Js9rPYR%G<}%4#CY#F?b15^Ispe867dD=l_D8Ej zB4n<<-l{5$Ruf0PAX>dRI%{sM`ZH3BNMtA-z1aNVnpb^`#A&TwV%=I`&6-Mx{i95N zZ{Xc!Lv7#xO6mBgmtSsG*GRCXUV<$(*t5#iV^D+fqLO!;&$K3cT5)KD@FydWis z8hRvf)L(J5QT=H%uhbtZA<;lDqGoB3?R$V@*mB#LUAy@fKHc_+n8~HbWe93$1|=>; z^9TxE2m5+VVp07aV_!rX^Lu4s&rz#n{D_KR7Pc9ZB$+(W(-e?10b|5#u7{NP&UZ7D5Df0GLsqTykjWHH_cdZsQ!G=H+ z_w+mo@;u!uNASb+(Q5Ds;#fnZnGXM*_X;XmO>&g6R*rkOwUc02CGcd2WHbOkV4T2i z9O*q9XlMM!Zbwb@R~hleESsRUIO56YbQ)`v7r`#XKg0cbsI?}k z>70}jTD7n3mD|p?HXrWh4Bvcsmv~NlBtED_XC)iKaBZ?-Pq~92bQUQg#=7U=^XE&w zLfHKNZ}swu+!R2QzD~86d$hIRR&W^SvEJrUnKfKg)feZe?31EX?joQbC5R*!**7*? zb!gFsD_8Y}5jOc-MbHmb; zwdzp(dH-Y1x5w2tn3&|oaIPnt|006QVq~!3R#^b`^I)9N_fO{})l-Mcq&ekQDKhj$b4k`PuU9q|!7XFbTM5DYIXmqEc;2TLgO zBarvtz1xVqq~9LnewT>2oteW_vMWA}yPYyj`FBMAG?t+Hfo&XEjLr^!>wn6KbR}Nh z2dJvv!@G1)Q-vK#6`n=-ZN}Hp;`di=KK#n?`krxBz2oZl z58q7GPLnlKmPWoy%8c??$-|!Eo2`0MrI7KbWOr%%Z2X5NXFrnw7%<5CS$u(Bi|{&Q z)3ubgn|f;dbVcJvolwK}#k~;yssho3nULi9to==1H(|C~K7%ODZW)U*aTno?|2l*a z!RQ%5(8adz7f6N)Qh1itThiM=Ljs=wgNQ8G=k8<;5=1b1yD#$RvCBte%(c_b-{>rp zn)51fR}`Zo%*s@lxzY_7d_6z{hSEnM@iB@9$ypVx?PjMTTd}T;R_!6UtYke@(N+72 zTMLF?!d#aeCfIw&pN6=X<=u9cOm=fV+|p|UCK}@nJ^78cV%f?3Or@e8v|FPa^ zcI5cjW$s{nNa=f#&E$pIN1oVa?(%pSMq)8fyu(`6O$?heB+~SWdnYp zd!i#z57RWr=i5F(h!FNh*Rr#$`X0Tt*hv|iD=Q~HTHb2#xJkEewp`Xoq>xr8+f1(g zBq;{@>D-qzto0c!uAPO~zF{JbeAIhBFi@;;U4H&{=68ZY~V?o#j z8exw<0rh&5c$bt6hv+=@%x;h{W<@f#I+4o)HMTo-1oX2<>$m?7>iq|CtmX1E9pacn zP!q?T&hj-$9Glp8W64JZef*Zc;;lI<@k6Pw4^gk3-(|(1X-~6#FUpJ}P?@cIiws>W z6oAPfaZIf||3m^H8J%z-0q_Y;*?#UdLjZ94kF-5U^x6NqIs2Vszj_A8{*V4uAN#t0 zhz6m8h&rxGAqjU@W7T*|-vE_x#9U@gw%#p$1;z$j8J~O0`jNq_yx|0-ej} zh15oview1**{Kll(OhVBcB+u*f}+5zXEvx-%0?mlJ^dfz-zvq)6O=5j9{U!Q{Bgtu zs%ClyS(s|iz<5-DKzZ^(@u;4s3@n;9#7*}PefUVBRfk*P9s}Kqs z*^zMDQ2H=Ua?!!vAgsVw#00e7b%bvv2Pw|U?Rr{@`CCN@QTj@x9lw=*8?1%-fp>N2 zzxPe(zZOFOO?1VptsT~ul5LVGtK}l>VyqaPNrW;(2oG4*Q|I0+Z1-2rmBRuvXW~2Z z(r8Hd&Z_+wwC=BCzwD|I?wK!gx}s>>>2AqGpYUydCBpj>;k}74M~?c}zwi`O8>s&L zz`^Citlbj${Bv^pH*!Na4huAiOXxK2S`zbYE_uDAL&qhQ#)*j<1&B-NB^-+S4Uvp= zqlimLqlin`tK$;(&QSpxH5ganME#QWeOo@U;w7cvPT*;KlbJ1ryDVxL|u)rE> z*AJaD+r~sFO9V$g?TU#;tSHEqJc(r=OQM0=~c5c@jh9< zMZ_~d;f8bIK2~EEWwJeGX2nQ*rVyQzRt$kj`IIy#Pb~jt6E{Trx18GIZ?bl5@k!%O z<=FClrjQ1XcN!?5M`32DZ3~kj3%O1}^ycbhgj_Ts-we(qXK<#-;FK{q6Ow~7AuUML zCWogOoeQb_r|eB5M4NimTMLMHEhDs!n-13cW;IyrZvHqs&0J)>lF2h(1hFD|nPdG{ za>r=_=n-R1`9-+k!28Y97HuHULXiAU>#BN*)W~`jsYY$yI!?;#JgJ}#JrdL*PehQ( zpbq}Fdu7dwG{P6CJrv#~sgsTfaY!`1W5{#g+N~RkTcsB-xoUa+ElK1+@uST})Os#x zlSF9}kG4;Zft$hMvQi$;KNQ|4(B990_Du&G&#l*J_~`&RO#oz9T-6Z3)eu_q^d_qT$Ie;be{&8 z%-?i?vDf*Vo_|nGmQ4PpngTIYA8y5}VTbJPGCfrfOVsF`0m+*lh}J)7k~cjlTEr8Q zH$|bTM1{*UQW(@eXpY{82;Z)b6Y`0hLOfSJr0w*ORDn#Ko!D%LalWw{@)$|9ita`W^Ztmd&p9Uw|RlCGjcK>&E&s_0w(!V%~p9bV^+Cl*d zW&GXy<+@A#E7!quH(kGz{%8i@;5X*~!{uv2US;w%k-6^!@-_7i%-6L47jg*n%h%K! z&CJ*I7}2c=0B3)Md`)#EvnhzyOI?8yog1o$Y>y3U)3+HnNe7j0Ptl?#*~jE>^5sUS z7h21(9}ZHP?bDf|rk^@#(?EIC$%HFL-juuJRPv_3RSZB*>G99pe;+>I(zUS61M)4& zjx@XSd~k?E5u7^T(st;%|5LuD?LtDGkZ3mCs z(0RSIy`k~S%EimCD@A_sJXPq7O1obDlQq3q5-LslCK1S{d*phKHGLB6%F6d!zAFN| z!&h2!CRsDi@C0UD;R%l}lO#%&i$>zXJKHs zPLo8Vl6vDL&IVs=^ACJ{v@jicWJFM#$zOD>rSlhM_s?G>lE}>bMcJp!UsU<>N!Kv> zi~bvWI!E&in+(sO#Q~?6arWMNm&soQKB=9RA^$#E{vYf))><=HirVM7mF!rP1!$(u z0yGSvtrc8hvH;1|f6sAHzGS`;iX#GfO#M>xOq~y? zxtd%+%@t)LKO>(=*eFof_?%v0#Memg;uj>A&qM1;-1)?EQUrzE2ym^D>P8HNMdz6l zenBVpkp7#*9>G&2_Sk?$tSnhlUrO_vw;m1}Eot7m`c{M;L6U~Hrgfz2s#>iaY+0kV z8;r8FfCkiAUFsY{G>Eb^hfKk{NVd7!YAhlZ50b(ffhe@f=>loy67{Z_f!5!-t}nwqIG{S$>{1n>3$!lIAlnYk4UFZA6oakUG3}>7Vfs`EqMyO#$9kza}eb z{}i9N8@GCfC6$_1{f4Aov-KdzD>_D|`@nzm)x!32II;?81n}G5C;@aN(NXPQiPwZI z3~@RKyQDkXAYqyiJ(BLIejNuxIR`^uRLAk@NMtvvc|T>HJh6favAPoBb)yZ&9zq5 zh7!a*spY2W83IEV?A{7qIh zfezCtj~dkm`g=mgqJ&9#G*w<`%t(0@Or|{2AWX`mS*HNt2EgIqXNrnI8M)XmgHlGU zU9D3dX$&PPj}qYJ1HYxWYgg-(M>~|=rx~3Q4U+uZMXx%8CgoA$z%MCB)}s4=jZnd- zHppeTigHo^d1aRCToC=QP7Au`@VS%ELwug%6X#Q&Z=T8XPn>Q(kugEndOq9u_|6Er zZs8-(Z!8G9?&c%kf5kP)UrUk(k-+rNKl8jMJo@LKIf|3N)lfh}8Ee5}#1vVQfd(!d z&OATRy=)j^-aOsWa!>r~7M*tO zUiHKtAWgR0=FtKX)V(-NM|p_p8&VnXceZ_or`WJ+Bb!)Tv;5*;r-^bGYg_5uh*hoC z_p4g5R$C`uV^w#XI~!cKolh~EFhp&9O@GNT9gjR$#)CY6r5*-rx4kq=@{ea%fJTqh z)!9{hOMVkFEp+b=saN07bPv&?TK@-Pud{6eg8}sYbTILR{7`xPfjFVAT%G8~vbCkq z6JqvLl9}{|q^x$;y5(*{aj#wBb&xv@^Tjiz*Llw1c1%jTsHi0FA<3-UnX@K1(by1CvYPa)Md8I|Rbc(wpq*1>)M>lFJ-Bj;f zt{dgE?%PLUr&03W2R3SfY1F%DLl_BZ)LvdQjS^T+qcp5Gsf+4I(x_&hsby4aRs(na z(kO|)rbA@TH7y!x-M5aCPK)HF4{XtHpB|>qm=*zely%=+Dt2H<8$J-mw+xKJ6pYc< zeUGHuA%pvYFlHJU-7GsshIXJDA>^lb>1Blc{J^*K%-i2FZwm?hupZQ^N6d&;$>Pel z?kkY}V-}H2?gzr%G+d8PMG9_PKChYi5?IcBISb`aGsDx5ila^`!?;5WojEb%cR>zkw=C>kzL=Q;DG(YZGuzYXzKoa-5Mrp2jXRSi~Td z4@M}Jcp1?Yoj5JR7y z${}__kkR{rhe=%_@MvR9A0}pv2zEB#1hRayYWJcb9G|jfKi3NHrS6kO{6YTboQ=G7 znuy!IiCtC~KXR-rtmyNs`{ay~RY!bRIc-m|@cst#%7`{UquV(^1!S_=Pve=$SlBK( z&SbFxKX|h4HK5NlplyA0oytW1i853UBmU|@VAudKksL|9KQe~XyOab~77)Vsq$KBaq|`$dJ@GfhPBCJH$7&do7(b zE$HOy+UKNR^qCDJ2x{9X``sL=i6`WT`aOP_hFm!7|3)rsmCB=Sg6h&+&X5aRGsuOl zD)$LPF6b9dEZW)jsBT>S*2EL?%^b6g=-KL57-I6J&^g&O1&BOC2tie++n=Tw&SCro z*Q&*r%9scuKj)+4`==R5=4AF$dQJq1o)q8PZBiH2jHOX> z#Hm*=kw(ec&D|nt)DKSAjhZJlZ#wR}d(YeK~`!dhK$UHhvI5%nJg&&>l`>d(p{l`-?cv7;D z3dU>1tI3G1r@-bT4A37Npo8qWs$&;@bh7y==mB;>DBaYpOrTh2C= zge_$Zwr(pFyj1#L(=gi}&(~<1{H+VA+-ro5f8ueg%hF}w!LWYvpb?x+s_rM-pApm^ zo$F6 zkuv@}KO$6lu?sY>1KuQL>X-JNf1(O?_TS_5B<> zZ#5RI2q`nns#2G|bl~eu4VFfCtne&av?#~KL9-?z0&%49P2(M#DD?vtKZGMEf2_@_wv`q2x1xfCPln1}q@%>E(x1Ff#`S%_klZ_+ z>(B=bVh@Rl`~yxW5wv+66jc7V0-GYf*KWgxy4iZ23C%* zm(1_m{eC>#deio3Apw3Ihw4x+shgN-R4I=mTZ@g6iB^VgV#SDsey9IVB0iDcVhmoBn5J*bz2m4nTAuriT;j!6$8Lpb zjVX_tIt~!#33GYO-GP3yVwYIevY4G5zT3oH><6E8`kQ|_**Lvvm`~(`=hUU-gPGPvz5Sir4o1Ev zF^?rESZN~iwR|t046ORmi)m`MCeE>G?Fp&Jp`9&k{El%Se|_U;ZOzQH7v$Y>M52c- zJv*{GA1h~G&VdDW%e_U>bzb@$AGJw-!F%oy8vkb(F{Zk#HJqdx@%T{3vnnlI z3=k@!NFcs~J6wL{Dixk0K}FDcsd&s9PEP0i%&MY+MN!`hOrvAT3T99NHq4}c;EnsF zEOlHS<8-Ez?biH#iwMq4b*^@*+j3w(w;jca+`rHQRnQi0!%M)A6V)* zR`f&?IZJDsJkP8I$*C7$HQCqLiC!VL%4OcjzPBzecU?u8ma~?Txye*+S09VIZI507 zAv@?L_2r_&@}e)kNLL}y$)goXc$d~Ud7oJ)pl?oruCS|*KLfYq3T$SbCV`e56^&xR z_N-!!CqnExY~}q9Sbx*V#Sa3d4n@(~Xn^Q=CU$TVsP>?0JVAq>)Grh^5L-IWIv7${ zjn7RXr;4&VHP2{O;#A3RFd z$G{y>uddb87t0Sd<5Au1$kp;I5&rbzqR(FEiVfMwFZmZ6@_6doCg+>_BnO3gdn;qh zPTnNNje*_jpXkvRjX2S)+6%C``%>yw5*w%OIlUH!;28HbqCD^sab&%>to5bvk&+nd zwb>G(WE{)_OGq4=GbhpP|F87h|AX4^V%?xP6P;Y%B&#MQYjl2(%0;@yx#;ZnfnMW& zy55)XMlhLNUaIRqq%d|)PM_g^moPu79aOd0^#Uc^PDVKx`7J;3vAq`CPo<$O{ z%`5lIT+N*tp`o09U8G(5fW2D-#!UD3Kjs#w%WCl?IRwE4Vx)hb#Gl*J>+cA9!l#R& zWFn6r3%t|AxtNLWNX+(FcNgDG`!q;k-Is*5OMRaXr&gl*vM6%fgiFF_`JXDkgeHdF z8?#7^aY=Y6_b0kQpj$3$Ptj)bhS|>}W@nt|69!vxQ8H+~9=V-up|1CMV`?$Zghn@wN<@wv*<_ng@cKtpq5baug8u#@wk+G`%vcyz~CCE;J zf=*5(0ithYV8mMp2`{q9t`Fpi{tZa*L^f-J-6<`kS!d(n*w`>f{fuK)pPrXPZ~dOp zg7+K)rE|TxKb^Z0Edad#&IxB2(-r9(626cqIs9RrR!is=+2C*D>G ztSkpi&vsC5VtIi&^fbLhyM4sF^kOWN44s!E-$KVC9pg$iJ8aK++HK`gwi+E|e83@qo?4EsSb*mNDZY<4Xl?`JeWS_ zk|4s+8-DX{GKg?Sr^SAB<|L;bMIWXeTYi-4=tR?wNlrV8Xva?r`j096#v{m7Q)`;` zIfe_QPyhUf9pb5ah_5p>I|D2uog8AAC?X7L{s{twz^T=FxSyD2<(gFNI0gC#w9VOH z&=6o2@Wr+Mr-n87pSogE;Na48N{(`A87CA@f&Z!IGqNL_vuh~8-DPS48iR%Nw=5`a zm%rLojxYLG#@IUWiTE%6*eW^V?i$KRw z$ade^>P<1xt7DjWD-Bee84_vcs zj9E8wUiT2u+8DQ3Z;8zhs3zMQDWBtMUJ>vj`2SwQQPL3462d7OG)t}k2DK{&nZ+r#`}FRGjOwZVNG=YKB>;IwWN#e zQvY+7jL9+LlhpUv`NPyt<#+utNF?~i*0lh`tDd?~cNPO;B}&4br`9@lmpNG%5}?mn>L)OhYTy9|Gq}J|hM~ zvX@nGaI$l5rC{rvhox46 z6*2<0B%^t1#3chxI6Z&j;6Y#lePZL1Cj*RI*Or#c7-U&(j?`ch(YW#&I2;<^p?})P zxAY|#x||eq>vdfX`d{O}3jrt|Tag{PCbH7<+~?(f{9Nm0&DHNdAih`0yGSU`L|{?T zOK_#mjNnR~Cco0N*+*0p);}!0J!vQ$!XfNg4(KM}#wsh`mm|%bNS;Tt6;eyTMlb!O zzzhFQDBfTGyVLqi#vReiL)dDndEeh@jzm~(IY{d%8(_mdz+AhS+G*4Z0WwFoN z*^s0{jKIjCG9EE`x$4_=9X}oYzNQ`YbBSGZvK4RCCkW|^V+f^=$mJI+EA#{cHmb2!^TDZ!+Z09dim%}BL zY}wrx=w13Hd1$0>EZ1sTuH_iyyjq7=17DKp!)S8`FG%1?0xF>Uk0D4{bFYyr(r+#Y?i^cBcwUH%~YH;Dx( z8CM#4`SE=dd)Lh3@u^z`~TUPb9;_tSRr6{)iEtY`C>z&g%klH^*bOEX!lxcW^v?5-cqvR z<&~d=ti4*(T)+Od2HrHjAr>s6M##=$Ed+qd#gR!r)Kv@tfyckSV4)+2Q9mTnDXrG$ z!Nin2rcc}&lR^cLsIu^GmGf_CQ-Wy9ReO+PHT)b2L{Pl1S6a3EH;DoV^8T3wSO3(_ z_;!fr{4kQ0mvb^*?Q^*v3Ku*L)`HWGj$FWLjA$i~mdQL`?KY2x^?!Vj36RGf2Qbo( z{9ce(>eXL6&q4$%kOr#%0*3!d?6p17k-|&^e}VeBQ!0tiGxKqzL}wE8kJq%Qp(aCg zCPD3RN6p{#hVb*vV}!uFuN|CTEC~I22lQp_7%{xlfG=zQ(-RRHsL-g4h2X3RJ-$TC zlaxAMi^KzXvcKlP3m0+1urA2QalaKUpUWTlql~~#BLf#VYU0{R=1J?d6XfLs4^<;8 z*N5t$lJXs@V%yG&Y>zt@#`V*7>yI9LE zO;FCepD!Xj_ln<2AJp=VTGE984YKkAfa#~c6P_YQT{csW@9V5zuZO+U2(wKEa+c+Ro2~c%y)O z8+sTt9MbTc7*yZrI!M7E?h{Q1LH9ZB52<_k1qN^?Sjeb?MNw~xZtBl6%+@pfwfmf2 z%M2sNbTCIF(;Msud$NHINEsetp7r*7LG^85mtKZNvB5XOwzMCQ^xf7n+W+L*y){8` zyxPNMW7d4cD^N;&-^GW>fFJeWM}K3m8q(<8k?)){CsV$Y!j=Q{HRwjV$a6v7CVMqu zem#Od!XsiX@RRGZ_5=UM`iSvW6dkduZuydo%U}YSF4EylkJ+`|i7V6=C@I4kM8kWQ z=Hj$+kU*+Xyi%3HQ*QVtk@8;}&W&uz4!jj+k?#q-PN2FNyy-qh zI%j23KmKdkDF0J)JdvaF+R;nH?#LF8VU5I^xm$Hcb&U28-Q+Ou4ym8~r^vH+ ziDF3{NzX+7Cj><89uRYDyH&N_Kb4qRd*W_xS#QFXwcW-UNy#Au0~2Xd7mQyti>yg9 z+(K$Vcy@mfopBL##&n+=;i;xHZp+OeKOOmY9n=BJ7i7mG{ugn7 zF`Pgwr%U`~LTcMLrFZDQ{H?oX-s+Fp zE5=3syf0dPEIx*VE3Z!dCq=kVDXWhZXQFi>{JsBq5}!+;gS_ane0$Ov#6$`AqF08y z@0*PvqO_q=1@{VWL3U0`qh9sEZ-Jxro(yDp=SlUbGqfIcoNkym8qh&R8DbPs2q^yk zMiOL$s!jm}n6)JuaF7oq&7*gNOYX;dM*V(>%nSHkI9cn4yaxN$yuhpI9|^}H1WRr}p0d48jHv}8-k`+>fe3#CMKjFh3TK6}!cjfmi0eO<q zUKbh>Z=;$7so>mqPIhyle)x;8Wa5W(D7yjpL4uV!N*&E3B77R4nbu7`>-48P~#E}cv&X!cphlG?#>2VqiFN@r0bn-BYMwN4sPz&4C`CJ_OFh##0xkED-^WXJF+9mW0 zfiMI?+`vzNM6z&LJD-u3mUJN)qbSFskUG}R$V+|^gvmBP7B8~4Xvx@bmk-+{rR5%h ze*#_p3idh)5(2(l6C$+l&M33yb<05bGi&jdI&zG7<)T!;}xz)|O zeuHyQXFuvIgYc1+91_~2agJKUoHHy;dy>c=WA&pp{C5fCpec@9fT$O_H+pVAVrPz; zEMR2)`}#kMB=VM3NDQ2-t!v6c&^Uf6sC}}M^^NXdUyGq`T)Oo_-3Te4rf&X<1+Mx@ zl*NDFdWXb0DgU!0y(F=}sY#t#h<7uj3`b>2ZiRr-=B&#bEb zV5$2$Y@aP$0>K{LwcFiYq8wk%QD9f%PZ?6<7BbCMj}wD`GPE|yD`HifC~x8W@IS@vtc7@t%)m zMAP}5RhvKqo1`h@*78QZk|N_diqfWr17#YwaI{QS-nr)oLqHCKiuz60Ue zlSB9<5dL8q2>rJ$hAkXTukwstOU%G6>J35;XCkDNu7{HAQzXnu;_1m!=wae8%EB6J zS7KRyVp*OVj-{TXUc#NQ(P&52>B4h0wiCX5RB(cb^wEe;&>amF|1*vZVnj~a6n1V=|IXqHKa)z z(qm~z#nPrl;6gh{iejzO4#jdNEW6I7M(vdPJZOlb$1?|k^X)?p!9HN?3M)*7Cmn*z ztl)qlIAJ*NO~QH){QJ)i!!+HhN7Il_F$}|Y=wT2Q9h$j$4JvG2b2M}6mVaap4(lUw z+uS_6d@5+e=+GE1lfPTSQiP8UJmTq>!JMKj(Ru}pi16d@Id zFtLMTC6Q&%nh;WN=-*QX@sqh}stO1v(?4pn(1giGpA?^cFWm+3*^0q>ah0{yqZyjl zT1EONGCcAu7&AG9wkse#bUr#qnkTIODK1`c4nv_8N|3NHEpuZVm+$cH>Ko7O?T zd4=~-yU4VJErZ7eZ-D$?WJTk@P6-GsdByv5NTfucq?&XEh$Y??t$$&XNRxQhvfPCW>~hbITP(DV^O}c>rmPJ)6iF{UD`#S@kmkv%xYdlVsN5?h zuMkG;G6LQuc|>`F#_d|PNPU+y`xZqK*M>(gy7D$pm?V{UdCraG$9AtQ%Xnjwd1D^g zSAg{i$`CN&Jcl22bXucDB{f24APD!c?zUJR@^|}obvE6l{Mr4>YaQ4yr@Xa!OG7f= zm;b4y$0Nt*HTxpRg@N3BJg_+&w>GB)`WhL16utlB%)Ns_l0=O;e?;&9y(9f5n`w!T zvO3@;H!`1Ehmf5AA{>$l%%}F!9lrPw@g^p!4uRmOn)Qh>-H=)_deeX}kPY-(3qO^T)nqMbbWP zAM9mh8YMN;X7*!A2l`iuY}MT|6D(wVhC{bIB#x-}(5a$bt|1`)*`f-3+5Z#_c*h^| zhHu_|z{z6*(JZ3WR~Dk+sYxn4y)Gl~>LA?yofxzt?>bZDUB?EIcWu)}wdQYEQUi{> zYt%_p;ID!gw2U$jiroDYBCg1)UP4ax5nn~r;7eDCl#-y5>Lo^*gP+Eqs~b=B>cQGi zewM0ZXc*`Bp)Vv7UhhC7-+q*S%Y04cfBjCqTB1aTcCe>c#F-7LDzSP#$#~6|Trp_Q zb#0x|bCdEibz~JYR*LDT?D~`9vtReaXLC3T-ei-h75)!z|aqY)C)g zfu>>u1Pj(d+U})Ac6l~bC(@;7t|}4|xC_xs7xU`voQe%_yr3z2@k&rrCs9IyjN+py zTaAN&A#e!-r`iXwwk92sUG;!qaXd!4)PKyP;`&F0mc@Vffix|9g8%NzASp<%i|^0_ z>(9d^sdl3wI*_}Q`v$tOol_>VYAaf<)m=hNk{PXbqrVbenwF9YwNkZL2q`$1{hd`^ zt`KTXTAQT~zbNh4$_9_+Y~+-3i0h5%1`Q<7D{0I_>>*wupgg4D9A7L)4zuV?NetYN zOE%>8&6GCeHbNcM^uNsJ=lNrBxH(Tp)TfARLVY$klb69~F>k$1Z~>-2wcU$<#dvcs zEdZ46b@E)jvr?ugbxy&>qgX@2v{{q9Jx&k1Pu{~~dieYr-NU3rDx+6AOB~woA0E){q{DCN7>MkRXw}fU{n}yQmgTV8NMDi;QakG;Ex>%5VeFF}o7GLJlOc2dKU1EX|3M}{ z>}yb8l(q+XHo*ksrHqIuC8&Xo*PTwO+15(z9b&%!>X=~7uv`y-FafEy$QRz% z^kI@dI40z6iavM~A$|sZ@QHrV-Yt?lovA>e z?xFJ0#)|%TloN4MXVQqC@^uJ&rC|6N#}P>4n0gALOtzLT)qhDR=O-Tu&C}SFg%wY& zH>8F%)9YHVkZnyw%Xx1ZI2SUW01RC6iT?;;CrKz%d`NP_fM;bH>o?2=t`I*6tTANB z2?ZXWD~=S_oP3VxC|j(`yMgRKh?%ws*3L!;BcY<}w0N4$6;jvSrdKQR_H%KqC~c1q zi?(>RxuSKs?9pnEcC>irMzJN*n|1NC;5T(=Qv4_DPc)mNT^=~|(kP^K8F6 zF>}9&HR1^;uH=iEk8|NZkk1@wr5;rwD{qBYl>I_;?9o;c6C!I!Cx^FONJ}U&f5zg8 znHoMDB~3{EdrR80u=%slkd8lL^R3q8!F&npX|lv6_pn*#F!7vw5XmmpAa&RFf>FDp z*Wf`&u9)a*@1j`H$HSpZ#Z$1y>f4yL4&#Z==rtLLKShPAY`tadJIYvX=`l&J@5u!3 zCU3Jx%og9GN)im=AlTrE>~n|bS=k*2vLo%+3-j8PZI>tbk|$V-#a@X2y|I?x+FXJb~s`Jh_K*5XAYI+Zcf zIu~m-TTB_o3RlMN=qiGAX)R9RYo3bPJ>ENYo}ygqJLjZq>jMRrPE4|MqWxpFz~9_>E4VW9pf9`as%To0|P1g zz3tS?_=rjVs7PmFAiU4tHkaQACi7=~u;9Q%t}4h22BRg{Pa%6$dx15I@r!l4$0}t$ z^YI{R#+KTil@R4jhr4s_U-y%#gKx@w&@c z0B3=lpDDT!a_D9CCXp{y6x^Nh{OD46@LMPexJl2n@Nd@Voad=&9Xz+69cfo-h?8-r5foXd%1=vvK2Bbm|e5i0wM3R z5lus8V+4IU1?(CWxL)>gzWCoo=X#?d4{52L0ZpD?C*2=;4Ji_q{gI9#-CtkyF8K?i zwa;3&=UD{4p5xQGa-yqtMQe$&V(P;Iv| zY-XhfI+u+_&94>td)a$9(~*#ZMF-fDsy*(m_$RIKR_pR6j{5DqBM6naK&m1Q0$w-J zyR1qq1f+S=ly8Jt=hjZ7AqTBh&x${8w8ax`^hRg-`tN3~QMp3~*l1LwDLYGI(fW3* z4%o_s5MGGiYYdKaw{mxJ$0EIP?S5;b@N+t=GCQ$dJqGSd_lWJZ-wLeo~T$alHFDEVM#`oU$EOZb_|!pm%8skF*cS!Crdf~$EX63fPFC2}Au{Fl@l;3XG4 zkF;j~7GfqncT3Q%XgrBj5kzQlJ0HiV^;wA9gSGxO-`0^Eml)X5>INIsTv=Msf!EpX!MF ztsMVT?Qt)*IAn!-QhsQIt33Z*&#-2&wpu~7OY1UgTN4qDkAB(6RYWcN=FPIV_M;CC z0P3!-lxB9;4_)W&EW?>M(}KVd$4MYhWB~bg5=gcN@?8UDku?qi$PL~Xj@Am_e zdkP@i+0Y_|lhv|OfYk4|E4;cT%N-!Ytl6HZoIbRtzgd6(A-*F6)aUzysvZQ?&{MSP z@(fUC2`E{^rfUTbC^J68P66a#Q@U%vzR3Y%y7o5?9X0|OCF@=PC>I?YehNU3WB|Hb z0Exh5KYoxU+jbw&au)y$IEFNwIzgv_HmU%4O}^IM#vd(hJX}ELS((okq@E3tXJ5^HR*`xp5(_ma^Vug-&qREouE=~gEcMJQ&(6+#_SeP9z7LgW z2|O}VeSanOY?wTIJM-C-sb|CGSuFF}cT&%M^6aNP;|#d!D?!&9KAn7qe>La|@wuPR zn|#JC3Az^Zd5q6-K9#o;Bbv`&GCsfJyBwh>rN{QAj|k|ow1s{@dMsMMJzCptErVb$ zu%`P;juX-zbJ6Iktzzg0eIOk(+FZR=B(Ey)_$!7NV~}U$vEf3mq29DtR|r zzsG&J?Y-5t7=_pG-~Bh+a|Vyhu<0$Zby4Q9IsMMH>i1ZO2VZ3qF=tgp|MU_BZ7OtNad?Duc4}y#YK?z#rT+&!5B>C zlOI@FJU*NgAlrQNWH3h^T+dYP;Lpo&^`B*9B)NJ_HeX!`6qtO`djJgn&|MLK+`@bn z;ivzisl{df=Ys`h5C;#n5b8WAS-{FVrxw?^;?0CXK@RBr&Whih@zfn}$oQ2VujyBI zNPKd?-=6q*0ht>=OD;L_)8sNVK142Fm@l|Q0x3x7^D?p-3qIkA&&BUT6zBygqmVfa z!A;o3KolgFc;TQ!iRR)$^*GBH{&JGgsEl1qUgIBE&7xh2@FARYB?5_NFO~R!n8z?p zG!l(3FjW5MXB5}?pAUJ-zj6tWB_&!JMMyzg!cp&kKAy`3OF+hC-3Hz4xi4 zjED81{e`U88%&U#Sfvb$D^}^1i#3thvglvQ-xadDQo&docOSKmcKmIuo7~aEK8JW| zm+e^-JuN!Nv(Wb3N!}zBmBzjbaaa!Gux#W-h*zT1yphd5gdU2bNp3u8iXqK&+Lu$C z(LU(e3mQ|*Bi_L&-Q@uL*Vm)-yK&%!o#5~K>~(IWAl5Xmq>M!qSK*6R`s~WQnDmS2 zTc(?ko&2+wB462SRbZHmNT&H~boI)6-kvN$ygQEKYwdJ3aVF5{-@>ZTZc~wP5J`WtrmvYk#7A65p@+I+lzMg6y2>n) z&NCu*HR9m}OqbJgdszX`^X*v$>nih69Cii^wHKoQ`SL>9v|GQ%rp;QH!+lqLBB5`| z_?;7->EU-4_O?VJ<6CxojF>XkfPeVqj>A*w`yP=>S=E!Hm6KzYQ)FCXm1X8KRW8=7 zDOPnEB2~f^Uxg~57nL4~bsN;oplIpHlr_bk@`RMsnX<~@{41wg%ceBwd_T!VS!E}T zo!&i*HUw$AkIxuBpWri*&oz8xy_xas${bI}l}q%GjBJJm(yXt&BG)I)^L&I7`=a5! z{wK5S+k7lGQo2-n$e@55H#GH{`GUMP?3 zIg7s(n;RV_OOzv`gLP_M#S%Tm0!7nDT(`aIk0_SxhCCWMWPQakdsg1;b=5w#Mws;2 zT<&@zopa6N-BD+~#+rV70yWO>7SZ(Wx12B$TBW-3CW`1Ok%4#q>GKI~V5a>OazdSv zH#)D_*F+S)M2pAzl=>wHjEMB|gf+OY0YVJqiBBWGEPuWT$OweB#Xnebbh;)3pAb}y zP1#BL!D4}ATA8uV>hYldnxgW^0ax=Z;ioUQYWhH{p<_uzq%lXV ztWSzZ{bF|4=!s6s;?1o1IsUw|J_1y7@%l$qONhX-0_Lx}h{vu-`@~3WqFvJ$cscxU z3((=*m~;bA4zH0W z>y9HD#$C(x?dv-Baia7X)z5`m_2d8gjXbJT%b6Hfkoc5bFJ)5>C5{TH!8|wKB(`Tc znqz>04XTcHmdQBJ9IwZDrWxl3j(m@m6ANk_@8q5~S}ZGkOrx)8gSRutIFI$`<-mCP z^TfAVM`8>XG0bH}z(uWpj8x@wK+t`4jo6yyTf3A5KIWDkoQM?@Z4Rk-#eSj`@&`ZW zFIkly&XHoP`^5D#ZLC>8e-FQHF$txNYU*4~54-Iv>-fDV<(k_+VBl5S(d8=4&4t>+ zcP~J3j$Gbw?~G1|M(%O%L`FM385K>vh&{Smauz9shrOB<&FeLCQvRSfjS}l%5C#pf z`T1VrMMB!5*jNVID@XoZ;$rI4pu&z(qixBhj^eQ6aiL z82jjrW+7tTr(Tqb2!GG;tzo$KTjEG|F`g%_cd!c)?Ah0i_m3*?X5X&%`F=n6o~TB{Jy!JPr&eIz*K41BIMiMn~bYLZ0_FyNSx??RW?GrAWv1)1rRR5y(|X-UPQkc_Ym+WT}fn zOpb^9c>IS)L;0m@%9cuk@?Dam83*vU&%!=J9NzAWbd2}63fsB% zwnA6<;`O5>8p}N+Ws9LR?LYdOq5PS+co>;JuVne#1Vy48uQ;!-EeL}ma?*}xj|L@=&hyI(2jB?gKtcik8d?pHMkgV-^4?IY~1s_yl> z8rfS_4@9dTQh%W+aiAYyQZa?++anUrqBB@D^1vC?vbg(P5pu0nLmFA9wQIo{OsY$b z+0V0e`q_4MKxmJ&0PN`7nfBJ~uR5Z_h;0+`9!e&1G;R9V;_JS3_^~jw^{k>=|5XB-4Yt6w-e~0p%r(!DMnEpP*=2Y)&?{_|Ee1ZI6qL2`~@otZL zigB{TRN0^BDeh$BkLauzPjrxMe;zv?geEi!w*{RQ38Lt40hYu+C)Wpm7173t`rsQf z^}#cYKKL`%YoZA*+3nteoFV_i>4O{8OAyDY7)IVqRjS$U;<~%Gqx;Ta9O)3TDNF=Zhv2sXK^0*qA6#wMjN+!2($KC#A}hQ z1-ewa&5Sqv^ZYb2gnu5ygz%vMNy6FT%01M7SBNDK$9HoS9nSyb?Ooubs;1e1BpmNsyu9grm?LEGd!w5;v_Yb<5=pot-V)UEw-2T z+FROM#Yb&IXab5nlp-o>RH{2pv{5Joh|KT1_BrziB-Y;hzkm2-&N=(B_IvHM*IIk6 zQkVKN{HR7Q=(j;erJzAAr<3^Cz*kG;LOuynWiN>YgOUJJB_fIVPS&JVK&sd!5x+X6 zfK(wyBEj601Z?IBnM)$Uk4a$FFje-Dh+mnEPZe+^;-9qQ!xfx&U8#bCM3VdaBuN!Z z=p@yTPY}eiUp)pkQ8UQV(U-dU1U42vB-8Ue+&3q$KS*Jwea^ge_S54!u2LTJXMO7YS(V&N`<{=nA!}#%E63Wg|3DcWo;H|B>S;NgtvP_L za-$8)%)vn-%&C7Cw1o>9Ic@HR3#;mLY_^RBo`#>s!__hg@p>BWAp|o*%x;kTUX?e6 z)38a()vmhE=4rT(_@;t!gpq_xd)pePyRc1MAY5h)orF4iP0Z*uZouyDn7rphExn;* z=db)4zL1W}-h`e7D&PET_k;W7v0EOI(nr-WpFHnZ-*cT{r>RwIc@}j}lyXkv)5y)q zp8!ufk$V(poCz|0h%;VtEn4G8f4-R7pV_A=ml?w&g?4z$E6)hqn^M<=EN)BSa6sKs zCY6gT0;y$h$UY?VqYJe3s-~Vrm9>&HUfz(SofVqeMypXD>o^H2@?#pn$v$+3@0Gwf z^StX#i>!b?ErLER1f3TNeOj0UwD7^e;LH1h|C)gR{P0}@e-vJi z(-5x@)Pj$o`%_R(Y=0{0t2^vpYtP8A9qpO{J8WIw;?|#D+`rg9%0tFJV0oUt<>d@m z-nmtY!zIVoe);dmjaOldK6D9-=qmWaSUJh}6-y6ip0;(QBK3PX5T*3+L$93D!)E`M zrj|eMv*6!w!?xQz*6PcI%&02 z^iNB7t8bUc^bi3#IM}Av{*|s=zw-x0wvYJp+=m_*f3x^o%HI$8`yGFK_&dzsnaqI6 z{N2P~oGKY`Kl?>;im{zlCuzP^kx01oG2#5d|3hJOS2*}^IJi-c*`rVxnKC=znsTG3 zLF~Y>5*!3I`u{Mc%u^p_LQa|EslQF0=X&n<{~oV8*#AaKN{aDmQ<${nk_(Q&e$~WC z)UNqGd(mTNHx)XY{C@}!ZuCD6!$!6uabB#XKOj*=e$pZDNy8ZOW$dEMG{?cfZ8rj@ z;A5eaF;9K1#1%X9GR47-=5d!QlcXr^FlB!xP2uZaF|zKYW>Vh$JF1NX^bWP23O5`v zf(HZFR{DY}kli%r4+sdVs4#($FmUzIj);!JT1c7B@f@Ad{?bs!poe-C*ib28#<^a7YLaz9m1|w8K|FhzC>7M)9y&=X7wK88kiZIh0KSz zH(49ogtehLAey@G{5k3AE71;rWr^nu|9*8T*`$*nRb%BX*}-s9!p!K05q>>dW`u>G zrwY3{Uuu_HdjKSvmU16m6!_neir_$bF9iCd>iI)jnk`bAS-fIuSPx^X^n1L7!BirQ zaP}4T7{S8rdwrOM#>cL@DsCiPTbyBE(QlzBYSK1qFjO)KAZ!_rna#*M^ z@}Z}1ujDiUt2zgv#RM(%8Y)6BS7fG3$@wBnf#qLmBZ|LOtD}6>cF3r}`$wGi@JJI1Y=11IC#)$KIk)lF}_X%-fF$-e6 z^yxmtI7rOg4|gY#)d2gk(B8;zyEqVOeq0`M7daMLY&o;~P{Ss(t~0e!5X4i3-R7x3 zEMs}S3q7B_Ay&f85@V)5RX*{YL`7YZiG#USQh2n2J3DG>mrQqW!kZGhL&7wgcOco^ zDKA8dCzNxgLgtW3?6MTC(_VHtAFDxZxs>P)0j-;+HA`{c#=^5rU&6B3Ra z2omV;(C3`4f(mXzc!ch6Pa*EC!y9xloLbgvx=7d+>rn+VPT-Ukal)@Sf2%8Paq@V; z{o=~6CP*Ue;clX*2HG-EeBTPgoqOfs(t4Ee%9y3+qBHZflQ&quyTv5uc-e z4>Np+nv4HeTz$Z9e@u3b>E5`Qd@ESJ{sWeAEjAN9_1(b#e47Q(9qJaqVkjBRTF+%* zXrCp75OY zZ5Yu~f0GKX*&V%_QX&y?N{o51-S5dR(V$%vi-*rmY!v=RLduBe^#L}EhK0P#KDtp* zCoZ&&LZr3N`U+iv+f5m3=_V~>ohLF@pD|~>;cw&ygi(4=yMMh|8D@;^zm4*cn-Nqb zT!xBjGdF^PVGk8LCqyr0ziQMXSN{W+$ko4*f=!XDPQr!n#&RxosH@&KO=4qCZ&NB> z0?!M79$f@qaI2?bluYkkYQ`tD=E-e(TlYMPRZE!$cWZG6;>i+Mo{0gD_F3d?@X&$V zDwI!&zpN!b|5nrtCB2jD-8+0GuE6=o_RXnSh6N94oO(`l;QZS{1z*U+p>=m z@R2?E7w$mxS!(8O{}ly{Okyj$`H(2w?o~fT2ahLxo~C~FLVO?79Z9lfp|dOYWF$EO7b`1<4&gf`WhU|Vnb#z(G3;-HKE&jg4f+rpv>wFx27OcNUY6Kq z2Hv2@=neXfsh`;?TYqnL3U`AeGu>(qO<;&RBkVaTqZ{9!A5U%$bzQ4ivdO)nFAKRP zto^l%ajP||y&>+g9etUdXa?h3>M=O7_+8r8(uu>5%o(N>6z6lnF_F7AGSxt#FpKGn zGWE#o2?eZYgp`Y35V=cGlTOmDll(VyH2aLiJ_E)?zeq2q@Iz9t>VShntVA4XO$&S} z5}7L__3o$Y38r=JpKjy}#h~&?#4X8hA0z8jF6gU@PmYWBobyPlJ&+fP$W179m(J6{ ztC{Bk37o3)G|KCR>B{&As{y-KR_+Q+~-b(7Z;>l4y0c0A+yiqCE4cOzJYo^ z4{Xn%z1Cd*83Jn{dj?&i5^QbnT%45M=CE2$-K%r|L@r!|POOiwIm*NSL0|o?jgu4l zTSF0~LI@@Gx6JgG%bk?_j_dWv>no2PjHg-zjL*FCIGqHah&Z1^e;WF(pFw~YxCSwrM%Ox2GVCR z)5j3smznlCjtA5hJQvrEOba&TQi?EZ;iwUN!Z3jiO#m zMOR?nPw#+nn*f>}5zY*|^U)RL8e~(E3x&Z*5!%gP9Z5&7n2X+Eq^Q^D?+rdX|0Yvs zuoe(PthUSWSrd=)g}v`VXkBVlIxEW6S4kzfUGyA{t4QA$!QZ-V?f|U*i#2x7VjS5r z=HKdf&y~ZI2R+DQ=dFJ4TzPRV(C3PO{3d0-A)om$iLX$7>W{x?ohOu$Z&r*`9p{OC zDAVmsYBh0k(6OnU1XLLGXnN`|V$iMA#7-;OW*O)Hbe*1)h(2eDgX(Q??X7D%=89_~ zu>`=JvfY3RwBv-9szr+DQod}iHt|U0RxPL)NOzZtTBoT{!i7yV8H9#DoK0osc&B(V zzk>Q!>F#jaCOe9w(X`8(<&Gx9DjJ~Yoc zoCl&i4L5<2-k|9I%Qxvwxk7@wIpB@P?hZ%k|^ zr|awP7JYCWBOoZ<8J@QT)mE`-l1XD59UHxYL15YA2M9X1m6Ea}ZogFaW`3_5M5?zG0~*=^GoX*J(dvVc<$cGx41Sg5;FCApW_NTNNf%JjM_1?zmZatr*HlbqY+~^402(yLFRzDTi zn7@lPAQGB+y9=11zUi)Ib*J&fwZ`z51-omRw8htXTzxB_ekpw%&`wp`%y#!5YCRH`$|)j=kzpcLqn+O_oSOs|CQl<5nZ^27)6Od8)D_w5RN2P}8vlJ&;S9=hWi zBLmZBamn!rqr8vgxX5@OHzm(Zgmx(Ekq#7sw@9x)6CXxq?o}_3rlK>qs_Q8#GV?Jt zohJvCNYP^udH6}e$IQB4#j#GZ0n`V>EZq2Zsax0)8Gux3P~+!YOTlD*bbvIee5wHf zuQniX9+is|%Gs&K#F6VQCUX5$7Ucf~xtgT&lZ=KmUX%TOr{eqtt?H*xWXY!Kx6V6g zRZ5tqAFI`3LTlG9qQ^$dIDO%4={)!R&Y_+0fwJ<@Kd0Ht?4vL4jO&Zvby$=5Y?yDYYvl~j6EnF%UBC_M zU5;&znaX>`YTX2x>QZ;Y;p~_(Ocf-h=uJb!}RRE zU6*X4_GH=eX7;BnF0U9-fX8_Qtj;p0T5f_yd8JRbc>jxi6QH37do~wD~6LgU4xI2 zTu$kCODaEcNYzvY@X1!yw}dj1+s-7fx`8 zuC%vyHU7>oz`!1^tjiV*r|E%W+jc>_ZhM5blSJY)$Zyq13p@8Sus7Pl zHO!9{Wr;!9Ue@~MVy`IT^vGg=6FXPuRo>uufr}lhn8uidb)U~dZ(}kf%%8H*#b%LS z=)IL{D3!GO(p>7gzr2iuzP-}@6l15ooQR7PIuUnQ+RKU9icNYs>HYt}%gH`!Ql<`$ z*ZnCsQl2NknA4NIlwx@~X(0*WLRnj0PI|+zpmB0yxi>L=oAlnWY_9fgQnONMT(0Ec zI;q>yjzwq!=p51A{2cC0uG2L-&AmyM2^EkP%9Q|!%2Z$XCNEwDF}<11P^CShkr@4p zCZQk{6c!@0>`j@)tc_#F@~pgL#`RbV$FXM5$}dKolciDEZq|0@DkBqJH&m#ft&rZ) zK20>j(s-NU1aG4thF6noSWkWNc6_~#OXAC1OjP4|gsUV0?%ZOXXc(7obJUiLsr)d| zIrtkB)s8?3TPO$yu^)AWY4G(-}HG)@6T8wl^#me+P!U5t-g_- z`uhcK&XQYw2jbcEt-g^YJXM_ejAY@u)#$;#c?Ud&^A600*Pz^J4v14yefp839Ud;7 zT&}N^8yuYag#93A#`|5AgaB(dX&Sw%L4SgJ_J+AIi}eI9&2SM5C-ycL#8|u;-)8cg z5J}l0H@M*u79K`+6KduTc`qlZ_oFk>Djc)E|M<4x`}%a<#RjF>?k#b8h4dMb83J$G zVWUXjNuSnBk?$L84r-;+Yvni;7l0)COJB!JOB}iSUdLl0{pFqGF}2`7l5}Q#TATCZqdxN^ z!T;z2k0$^)+-1^2or-1Ohp32$WU}v@G z4eQH!JFJju*o^t?)W((YI1z`9lneP!5*lhN;Z8o{laJVo(Qd|^rgjW1qJtEQg!&0T z_T5SMIz+#@xgY)JO|m0=21|B5@%mh!xOj8X1q}J^KatT+-apRL`q*-xK6{9+9<%i0 z6wkv6{6?FFRF^yc8TyWYk-p=PHd(RDsPr1Mpub^ZLH!lG%?FDQYP`s0nk1Kd|BXdi zZABB&MJb*rxBWLh&29hU?8c&OLT%A+8^zhitkL13?C{LdgxI4u5yB_$Y0+6`N~3tR zF)JrrG&(#p$0*JX7v&n26O38ojpA|b#T;X#d}tSWuw6*`x%_>T zKgKJe-%@4iw+xp~Z3PQ6=F+LALQCA>!-6FLHg$YY6?$H(g`Q8CdpRdqFkN`ad~%2; zxv9Zoy<55~KlrhXuepA6ZcgD}4#;1|1hGb-9K&|yVSEj%dR};rdZKfycBa!bQZXzk zY3MuM_v>lusm~KEKhtHU=H9l<-u}4EIwFdjEOfv2Pvh=(VM`fXgUV#(!j_G=U&jKR zg&$BBkCc?4z%IA_O5qsqja|l0FG_Z@z^?S22>J~%ZxI+FOYBBKq%1LU8VV0^zp=A` zBbZWi1bzge(rB=FuIKy$Zj5YGE?|M)1za;VATEeu_%4bSWx6ikiNMcc zFXnMAykmVOW_;8un(f#j>-$9T!)QGmZkWxNu?(n%6koxsM!wH{la*NVMv?$B$7^Bg zcuh>;+f(?>f^5TU#3Ha*X?{VN&0+QP(n7{tb!WnoRdi{wZBYI`$+s1Y)i zF=%<`wVX&(Urz(}C=fGf`}y)4Dpg?(0T~=GFk3sG>6^DL^mcDz2kzq^YvmU-)AM4v zS-%xt)6c@!h%zk)PUqbVz;kiYni_ilsXMAUzQ5=*zU-pb5GOZNkx3aJH;t-)Y1LpY zP4+zTQglYsmfYqkwZY+@CyMM^fJ|uUool0cM08AP4#FIqX@5qBl@w_@^8A)}TtoI4 z9(n90)S+MSb0XT|m!mGT<+Mf6T3xNR8n>$NjMlwvEkPK_bhv4I?SQ&L#|g8Ld1X^y zCyp(G_Jz#-QE!c~97g56CL)3@bb3oq+EiBdwVwLd$U+~BX4~`lW@wpk+LCLOqJ zFP{jYxNP5!ja|?}kJ==eO5GeUoIf+>9cDbmN+7_EVZQyr5qT|Tcv8Njnnd$B-MXU} z8m(s7HzbTYw3fjt>y1oDS?xxGyE*4#?4h(L;{HDS zf;Hr*iJZ+kQ7c}JuW0&1_HSv;%IjJ>(oU799-vusWe8@}{*4l%&T`w5WpT$MEx)|2jJq z8sFgNc}nC)Xu94|$9}`Szq;-IR%vN(E8MzUf4+nhciR%PBKT&K!{bQ zwfQzmsXDFbdF_&u4#hO*A3=3<11I?5-nUg<-NuEnQ6eOS@z#;0+h_ zd`aG`Fs$G0wcKQD-!`pdkUTYu(v#=zJv3!@xhh8*qGvk$Vid zUb|V7mDh7&`32^=)FQb16cuf2b9jh&YjY^j=xVR}^O=IKM61oNUVfB4;G@5CtZ8J@ zt>52LWP6vtIa`WsJvOefCS;P5eU-ON{3~Z*(Qj-1=lX5mU>Q*1QwE)zC`dD-#XmhP7( zUNfu`4?(*Dsn#})I@9+ z=klHU$1y>FccO`y~Cs84lL3uXreq8TW?{F=u ze=+yhk*CYbaoQ5bL>oY)XlBIG`;Q)BqhGH{uE*6kb(|Py1*_ZCcZsta%VR+O?EhPP zpSFa(&mq+AU$OTI37%^2bH^E}+5Z>zK8G=ObgDS9m4n6Sw)Y7QEmq`p*IwJFGXDqm zK6SUr6j6Ie^waMDsl89^scC-n@B$D|OGkQWo1^VI{6-36+eiyFFU3rcOZeVN3zu1@ z|1WW*l4Z_Cb50F7pEh|DBo6n(`jwH}^Iw98W8C4ICPtz}$g1tjh}lrMvS1AeeCI;1p1MVZ~}tt1VCm^w+Hd z3RVJ&JDFm45(ai@N3=}MmKqMB)^#mlPg{xUoq*k2Y&ocZK+H(}GV$HRno@XH{Sdh~?!Dvq?w1e7aT@qr>w8!RinlU_ z#~X#t3Nam1guh z_>i+;=oV8Lftgxp1gAbny+e~ZD!{wf-d0VAoFBUMMub@XEZHJ3=MuXLprh5^ctkJ{ z=s6Nr5dHZn!eDLNbv#D2ZkNu6nMqRdT9RYw9`HI*i+jqg__#bAB}8-6lJ+An`xtqd zmXxUnhhZfn2Olg#wV*}N&R++esx2k*F3!?0n4#9!1BrURG`6@xZjGL2SWqlGkBTdA?^&!{(1{K53jIDjC-8cnxcV%elY zD6vcZnP{R29<^Bzs&0R-w4dSD?T^D7RGp1I8+C6YLmxOR6TzdjPxb_yi%*3!ygFCl z6eTkBfpcjhc+_S&lqcZ4O=G1#+BH@p^aU%FVHuy_tOsVZ6_nU;&G{+v+&ON!*j4IM z+u>A8hiGQ?fcW$Oc0W!_V9`4?-SYYEZ>RO$kEis>{=e9d(NvKx{+IXTw3Pk$w}NRB zw#5Gr_G8^`dOyCdPf`C%``d~AnCYQ6;)v5P>p`|*L0qP;QhGNfCoxu*YBn*DAS{h7 zWzxxf)An8Bnh=#Z63g2Xp2LaJ?zu}8$&uYhzH1Nd@`QsuzGKMKk44c`*`xBd`98)` zF5Bt4Xr`mBA3wPkckPQf3WoXnz2~T6nR=U^fSeT-h~E=n%;}9R9TR%5BV5!QwNxOU zlg^?Bs6cdcv^^49)8oa04H^UCJF;$AHp}pF`)pZ-m59?&Pm|v}t*-q@VO93a~KJ@#_pBWSPn;*;F24$Y$CT3Nq6;~sp#8g2P6&R749 zC^|VTsrW$j$5ZKvDgE*j*;&@O9ZxL;4+-zJZjpZJlG}y9rkf*`cHeH#-Oupal-cM% z@qpU zzI}n=!aw&skyhC9w#%{2w=a0evCHv-uap$B;|rgC0yp$dV?PSJw*ah)-2wF>{mC;< zAfLQH!GPSY_9WtfM*pYA{V@^81huKQ)VQA{;`GYdYhA)f#|Cu=d{!9;D zKE7Vtz#v!Wcup&#`SX-nfkf&ND~)G zr(AwWOWe1{O6)+Uj!YHZEUTjQ0pzslO45@4ii+-uJNwr0)bl>|_04ey=ZnT#=mY1n z;kZf42zo;;7&kz})w%rdq2s-QiB0yaGlCa|j(-}sxM`aG>LPpa?9lO(fzeIV(ylH_ z3l0q(j|DtU(;Qb9IRcsIG>5j?Mdf}zDwxhq_Ia(Bc)6Bv4m*)06vF4+H~*Xh=(7NQwil7uIa zNLSiR?lM(w0qfSlrfXox^1B3Bw+42&53o~+ySUs&d@gdE2izb{O3p`A591T^eI~Ot zA-|%FNlr-8iwg{wYL$`q!wTxF@+$Fc(Jr-N;CSri&rclALR}O4#Xmu}<9BnZhw+n} zVY zzcr3cEPBb!LJ}=?*1Irn#SsXm$&Vp6d{dCUsHv9C#uu^LS*oXfn^PRYSQ2QLO%Qc# zo#*a1Wv#x2`&!e(@rul6Bs_Yau}7q1>-Kz*x5c+D9;!uU`#pvGaaP+JYPNgsYdQMr z5Nx4q2K!ix#1fQMrq;@?WND17Bqr3+5iaSC4o5^Vq+Bf|mVH7HCh`QN3B6_1H9S8{ zolkX5*&0T`rP84u@3MoD*DhVvLf-A`ec9CDgMbNi?bQK6qJ>BPqOjmd_qR)_PvIZ zm#6TMDB6TRGPl7@a~o`T62LZi(%c3!*#=Kq+hDP5gD0(RuvoUilh!s^oVpFN3wnL8 zt-#_Srf)Ife@^q!{Y*YRiL3X^`W^wt#2gWs|8gJJ^vUjPTQ&xABCkyjpo4r{IDvW! zcRO|}KaB$K$S#DHaPs;aEPR~IrxFd)*% zWUGP&Fs%CBH;Zg41N>Q)-`rZ0sU8B*j*80ahdISpH+EyWdgP5uXYdNZ*vN13YT(u= zIJ|mCpMXG7wIZM*Hgc(?c7katj2`m~QPv1*KP)`;Vc>0elpj>4@|(-b@U0XZSxtrw z^#s!8?^AebBTMzj0{ZwxB08EQZ^wMe6G$s)}}nu89Rc z9vCK>1*p)M6~-0PKE#>Bt801TuFObvJ6*SLerxOsX-RD4&7_ULFOd4uw|0+n ze8QpQEEEKMUv@7WY!td2g($8pb7M=C!^a1Ze=xwdM2}UdD>+LsYB`G@5i#;}k4a<7 zoKdH5cfiZV%;&p3zZ=Ggb)(|jibG~8mHB83X11koBCTEJFpg^Ub#mV&h>K%r@AS9z z$6zMl7{aTfokC}lv3Bb3$YKjKlHx*RI2(dvQo0A zx>-J}%+Ej`UX&-`EIB+>QiX?Z*1yl{Ur87qx>f&fQ@jaJ8E3j zC7XaZivmN7du^LbzlvJsWTFae!Fi8N;Ze6)KFa(yTktDS4S`@rLp{9qJKsfzDJuG3rY?_skx0x7K7;SIZ#RP!-x!!p;gB^wf*}*2`aS zocF$ryo!NQ8~q0!*+{45Zx@}r`b$Yb88gB|C9t{-Tvt7gALWw@%U}<;MsahD;p_Z6 zKh?RCs*BaHc1u53wWmwwG@_#EO|Md#7wntXIHmT#1Vu zd=bTQfI33Ojc!t%QK7zUrE+0{;%hHU=S+H)*dBEWV`EHEIXo&WViVM847$m|pcxvU?EYBR^$z(RxlMl0-73FVG|TVQ zXZc-n&q$>oLl5Z3xtsMP{c-&myGcJTd5p({-%s!0Vfbwu_Ufl|!+xF-ziY!m`EEGC ztY}Zq;oZ*vM#*KxoO5q&wzbzD^ol~^Rv%fH4Yjuhg(F#42UfOYx*cP|{I7yh-jQ^|0nG~aAm zx^7zM+B(qeEqDQL3Ekqt!kDvwcDLK*h@!U=^E~kyQ>(gulXaf>{k2RWrj0orW~a^v z-4itqwSnGmcjoS((;|Ar5cjDr@-hFz4fin7!;wb${b9ZQK2$5ef4ozE|FnwVCHMUB zQT>QKpdSwf^rJymuY-DcN*sy1F^!12;qwqmAq_a`*?LFCQ zu9S$shlL?a1#IMI8M|ooe*>Y4?V@u!$WhjmkZG)viBFk(m@D{2O$^jc)_d2vo6Wsz zT6SG<+as@`uH4X2FN?rlGdRA?J@vn$b3%)|LFVvF^0!CU9GLC-Iaj8UCZn%A%ay-f z9E)PP07WwY;ku*W2`v5=T&63&`JKf`Z+pN>R}?S)PLK}FZ!R#iM&=y|W4WytMXMq0 zL;O8qobk&(vo4^?@-{7iOf{0;8ucmB+}bWf=}zU>JcsG6{6pg2Roe zz0^Fk%O2J*_;}Y(5twJrg@HBMfB4Qz^S7rIE6QEhbK#_y5^+9wv{g_-U|48Zngzmv z_o+vu7ed?8+S8?DWOi(jkfSX&PN|;yeEl0EA)!IMSLE@P)SJn8ECuW-t_wWA~W-sE(cooTobo z2iTY`zAYS_^mrA7uaJ5|ujDsxhpI2&Z*uyB_8V-TA2ypTj_R_p#kNJUE68j^y6O#o z3-Kj?c^z>s*kugRU&_LZF>}bE^;%nzW(9UH+93H%q>vR_d{}r3p~XG2K|IJj=gww6 zd?IubMn1qNkYXe6H(x|KFg9|%PShPK?alXhD`i zZ*JZE0G-*o`F{DG&B>>_-1dz8_zo>UtJ1iJ;}w>AEehckIKaL`%Q_hjNxNRs%FjPb zE6bc+*!Wn*J_LnjECdf*XT}sPZI@t;63nzO>$DFf(*ma4go955wKXcBtmy4vgJdZ` z(K#O-C})$-X+_6#axSQ>FpjBtk~i~N$!lu7avf7}jV@dgaf3U&rdI`+HdSQ^7^VO% zywYv7o4FRuPeA+_4xuGhQjRMzDaQG^$~-qOMPn>+ZkCE;R4ti!ACozr*ju5dpOTpK zK&WTf%B6^f#(ads*KJf5Np?;^KUSHK4)ZY~Xa<@OXiQ1zTA?4+=3~G4D1q}x+(z>; zZk7Ie)_m+YABXkBi2d$EO6Bj*{I&7-B7b}Nd!4^``0M1ao4=#{o#Zc_TDti=gFhN; zvGeTg)z#U*v$o&-N#^!zM#?c^sKh_K$%;SYwD^l8{y;qb&{gsL-iTb}!i|l@mudJ2 z4qi^g3olXP&lq$vR_%Vyg8v7J-&{>s$`mXwf9qm){kPWih!@8ZV)=5Y{J7-D!4HT5 z`KLA1q!eQW`1L&Y3;r3aT@A6-=NiL}+r=bEczEbdTV1=D)(GG3T&2RRUD0$M`HVKV z(e693?0g)6Y_?swc&lXDLKbv$_t{A9JHh577bd;NTY27da4y z@`66pG5XHfHstx>`DW5bHJX#8piM;2Z+*Mxt*Mey(~;Wwg_w-;chIqAs#9`zN7i&d zRZ!>=;z;+3zbE}#K7Vrb*f&eN6??;i`3|sUqC)CN7lFa&u$emiJyoHXY?s(-ulZ}; zYj6JUA-k1Kcd{JazXZ_$YPx8)`V*LKHbzcrfAoM2lO{8>(rn>*z3kz)wk$$x>LzrO zL_jSJO0%x8wF1KUGWk6aGRWf~C6=sY{MA`eo9(I2Pi;0|OVGjjIW}@PEkC;d9CjWm z3iio{@dne4*4BvQuGq+2=^Ei$L0RO;`)RM1xB5lL#sTDBx)gAAm zi-Y6(=BXGky_U9b-=eDwH599a^PFs}u9t4EuGuNgHD0kw`(oc*fS`l=&tYHbuI*qvAf|V?0@)G zi*jzX2h)swjq`fuvp#RKR;P&Jq#m11(9ZnkXod+@ILM5ua5}9ivB^rKr^M`_iBj~e z;~0$X@0fH9&GKrIU2Npzqz`9=Fzj%t2{P1kIn1S=%HRcNIie)1cpVUv;B|x6g!*GE#ZDsMBqA&M|IvLK`^+ z|0a$5_hRy)sigv&{<-$h+b0|S{~5j>D<5~bImiz;T3S@vMzCH@<=jp~`g(Sj(XvMo zlq2%pb3`aTc%!|^|DORTjJRQ;w?7S6dVvsi5QfC3em1#|w0tpetE6|gd@%UP7Q0US zRZ%TO@E9BUEcJ(i8DjQKrx^CAUGtw%f_t&nMhz$+cyWGnc$U}UKMZ{s+GAr;hraIp ztB8DOpPxxx!+>=H=|2Q&W<;bkfQanF(WXp z2ECF8%W4MEBr|tli{XDzr+zqGoTZZ=leF1^yqauqB^>Hx+8@yvX$dNn$ey`}5 zcc|liy2hCwi#lp9Ux2M*xwO(Qvj;kVfoP>y8^>Q&913x%?w-clg;jWp#ktyp?3{QWLvEh4U#hw zdYJ=MqEdZwzSZ$Tr_mZ6A-Zi(_sjI9jpa_&M4asZ?DOo!t1;k#HhP@z$?0aFpwGYv zu7TK%%TmLUBvqhFmtpMOFh$6s=a`^1t_nI`lkZnZAZ>q>WX8u8X7TDqsuEh8ZL10l zimk|2pL~aY4K2y0cDdBfav=Vy&;*lxfonoOTfh~|S1;&fV{BC9i?!Dx-#Qw|D5^zV zbUg29QH6RR2|(B(tl%M7d{AdzD!t{Nzd+`Mb@t(SwSxM|!GS|YPK6p`*3y*B%3^}w zmrfW$8trGQzA!)Y!BM{XUDi4-`F;!ye zcjlNMj6`dVo=R20v#P54I+_@nm5u!Ym{B(6r9$DUqsbtB?o935MOPYkxOawLocWh}ciC62yCOKY{qrUS_VpxP&;okNL_5T^R@365Op@?}@USu$0u@(nT|CXV)VKAl95d8UB z_Np0-TD8DazhUS?W93!4rB~fej8uq2PC>V)B|R4gLh!7L=jM{4LTx#Z3E7riRd+J` zAB2A-zUc)l)njRdx#Wv*=w=!n%?kCn)_87h&Q6z{W$Gbv#wEx|!{eY=CqP%73cA$* z2YKp81ML)83j|hc^=7HRKjpnxzf+w)sB^_z%pp)`F3)~Y=Phy6`CSWjs)11FtM5{5 zD(X!8AEM500_a~toh*+^_2k)t4A`?i6LnUoTiyhEw^}EUGLDIXK{u$WY#UYB=xNh< z$?)sV)}5#CJ7(pr@dDJNN+ri!r^?|;N6mE_HjW#Y;NA1+ooPlpTRBU>rH+_Li7bWa zR$hY-l!vg5A&LpH=!7z%n%O{I)uIkFTW!(Tsz;M}gxdQ)xZ5_038vL*qK=SC)9Mg$ zw#ZjxJ;g>I6gq~Q#)B924Q6~Fk=Z9VZam`0X0ZI6*}01iFEsVQQD!m}WvOdkr>ODh zm;c};GR+C>E?~EsuS#CcxmyzpH9O19;BJD!F6MFZs&ATSgBp>0sxMJ>2xc>Cv=s$b zkS+L>{O~O;Qiw>Av%8Zi4(k$i4zUllJyrWY9 zUwg}z%5XZ0YWD72>2&i|)Gn-78zo9pxo?)Z!`Z8?ZEALlV{D9uVsk^(Jilb} zXeUn}$H4@9EO-zwdxcAyv3+J_c>1{5^zofjLGkR{3zIoUo}RR? zdrvaTM;$`0cp6Ud9=;yJ$5a0fuSUj@B4=>WD9-+0!pfWu7M0j6^ zkxb8BA>JfuI!V{AhKG!nipmi$SQ+pGOS^qDop+wKE`74UYuN~Xg1;mn_z22gnDkil zlSF+z^|#0rrj<)Mb-;+mq{;G+gebv{KuW6-KQ~O2J~j(_k|Z=MdS42l>^Pvr?yUQZ zWFosBLu}_i=;Rv5+$cx12N)YV(L8_5&wueI_2buNqcTU%#c*NEV%9dm@DuVk)~>;Cf{umfK+PRmG9GF=!%V9cUDSUNTV?7*nJol2#HNi8PaCHJ3aJ*lZM;2r zR%jL=ik)n&i500!p3i9>WsjWAtA$|tV;W|4G4&wUdvJSJ#+&-(eky?Y-{f3KZqUZG zxr_`B?*{EX4lBEx)nv4(E68o~1q6G5z|NDOv*gFikEg-*TjrNtxn!EzqDN~oqKEVf z!G#KkyNQ3?2psjxn{bH1$5uWt{G!CkPxY!l3$wGUOtoE@;B1&&?{DlAu6OqLs6mn2 zs1Or1MmtA&;UdI&-yc^C`2*pnX6$7eah+j~J51`f_6*4g!3~A287gu7JRWXpnQ}p< z#JSm76)N~@3hNsh^Ec9Ev+QYFF9v~ldAYHpOpRKH?#0`1Xifc2{NRBDvdk-a-=Fr*;V0-cg|=O@u|w{~Y))Bd_^urR~*xNA6~bBpI1 z&^ylFukpt2mNMw7&U-0Qquu9p1(x&4+%di<@%b;Yd5po%Kn2x2c!Wz$f z*q%6KXwNK=;lzZmn*(v^8(Fp?TSAx{5QfAw26(iuZDpF#-SS>qWLg$RX^V5pR5SCU zX3AVt!ufQxiBNgy1wve8i&aW%Dxlr@N>barygy&07-N(9J)C(Wlb(|gRS7|E_c0_9 zmy`g|z96B#UTz`!q$Qp(rihx`?J}ESg(J-$FVhV{o;?A!B}F$>Q_R5p(m#PI^$E4y ztfFa1%93WN;@NNdoY~J}9rnqN!ZVz&hDRr3CxM~)9Ica@2s$*|s9rfoXtL95)R0o6 z^8PIraWvkJX%c!2YsyQV+_YvW!g9PrWXuT*W>smoNN&$W#4W|5aGb7=O=6z*y*+L5 zPO1EF`;>ax;20k>(xJs&f@MUQu4W0UWza><2UY|pfbQ@xE>26qMaeQ7q|8*$k14a^ zKuVDVOfTJKGjCR3LW*Rac&jVaS$Ibkv06&!rGOo@FgeNo3E1n{@seP-FpmcS3#y}S zx)=X&RU!{8f_tqz@l_+xNX*H6VTHQ=lt?1f9{SBH62;nCr=(yYwkN9(DvS%ak!&Nf zHpSRsOoU=uX!>ZQz^yrB$|%SRH813t7sU|oU7HrDNJ9<t;Gp`uuh&U5a<<;x9Cd&x{xU9Vxz1 zveNS;wQc^PhO+@U6)Y*`p`?@!-~70auD6P5h!-^}_$ zm8-~2^lHk)+ivQHnCRDWOJd!hzU=E(yS3)g;?U~Rj^F}gT8^oCG}4@O!^}ySsV7~q zz$hQbxw+VwkxOka4}BN%zEGB0U`TA4vt0d_VThh{1YMa?#-K!d60AlTjY+HyH&b2l z3uqVp&#dV+$(o+N4GLz5r;W;uD~{3I{oO1STX!t|ez-C1wg=_6z`34BN=fk@?SBq^ zyoNr}gg&kx=u8n2QO|LUq&akp8)ZA`RrYGBU;8vKn1)A|D0PL)v!P>#9zm1Hh41-- zUZWs8JPl4jz%4zONitFM(xkT>Tft4su%u(s_A(XSmQ-6EJQ5FvQqHl3xLT`I{qtQ* z9YgS7OpxQ-zf-d~V!Btqn~3Qy{jTQ*Htx|%8=pW({mzY{!rV~hEYGT{Xi3dNHStmA zBm~{Xn&du*sZnL_i%7`xdg92on`v^kT6q~0=L|7*c`0oIo3g|;LQNS)ll@J1z&^Yy z-XWo`g~@|4GlR1ctqP8cls>E;0aW$4KMI}vaG83E#aWY86=D69m~cf3 zIUekCeudcGz&FB9Q$lQBcrdP|08sk7^A{u;;4n^$IAsUCCmXwtl-rtW<+r|h-T9d8 zf~K+=E9e_I%{$fm@1V=bF0FRRa9L+TE|(P~F-3nCA?bNJNMYcXQbrgPYP{^LfH2xP zLL3Qx6#B+EoQsdQB5{S**e7y)>Z%lRhFkJ}QuZB+A8#fZK5Y(YB}DR)mPFJ2d5w5|4Hv7;5as!GQ}v+UEHd z#RJ)|sMgRjwPh~TQcIs(EsmVx7zATbQXC2VjV{lsNs}v~`HSP(92L=aR1jW}&ElWd zauPK#Wfv`ur`T4Q5{_fccpTn&;|KmEjR9$3LnS0DM5 zV?4JaUi&nrzDC5B@qN|F(@`hyOrN7i8QhdI%gRqj^VPjfS~;>i&|??pz+Kf7U|p(9 zx@4+`rp^^UW>D3x>4uvrq{Ua^9`(QXamTe+HfEX|8##{ECyFd%{JnZZ(2)o@(#$9( zM^C&SPu9h(ubO~xjMNp7g+LabXTJD0<6#%xacHHwL<;3tO@SbfWa{) zQ{z;%1XNW?${bSadq0wpG|a2&`mADvzN3i|xjgTkh zI6%byES&{&E^tnzx&-D{nflE#20mRnsZtdX!i-YGbp2%hpDp#v&>HYsEIXL)p>MLO zOKgSszKL_sV*9GpD?k$1msP4gXa#a#9N5Mc0()jhU^YQ!-$R4tP8naI+5BoD5i{ z1D;I=JfH)blL3$GfUU^@eHn4Xwq$_5skmWBGGK?!vO5{jp#%0N1A278{$xN_le9%7 z7S?nauLC-g0VO)%U@~B#4p7N}RXU(68E}sd=uQSar~?is10Ew_Ll57mr7UF`Zs_Hm z)vH&zafR*%eSI#${fzAsT`JL(ws3)Qh16QJH%&G)cN5VN5v73Sy=O-uXi!BhD)m)ekK9ZK2+Kx`fPP zgFdf4GhXkVKcU_|FfgfirmlB8o|HwOVY&$(mA_zjpV~1N7fH1z`$q?zWo3+Da5Qy5 zuRynMKck6NAE&6ni#+^V&|ow}bmK(};IO)sZ=)@;_#mfylajk1(-nG?fQCD5pg$>P z4C7?^!f8nY>$GEBbgbcwjPEJ8O)Coz4L~KtMozRk6D4#@tic&d$Ayj!Ubee0bsRrP zg{Deoo2P!?kM(uM*vJV2MrY%WokWJsf^@a?4j|$uvy!IRO9zU)E15*ZQpvBf_!s6j zlJl1ikSQ#BN?BpNs`}CHJVB%!?iffHld$2ZGH*_J>iwmH-+lT6njc% zTRSndMx`zLLhYK5H~@SUIJc?9UcWsss%g~K-es<<_jtb7B%qqpYA4x(?;_sm3`xG% z*IuRbT^!GsW31_jXFW5XbyiANZe?_q@GbhO%(a6xP$kwP3H$d;g~kyZaoZy0F5mO4 z#x0(D5u%x^ag;jI$*kUr*8!%^h3%Y&MM(eygg-*U=06~sD(-fhp4rXl7aa)ucMHrG znvWwD;Vc|HWm*1`C@Ni1fwD+yT@FgVFp;Ts3EUdT3d^M)r>w4}RO0m2wUAQF}pnse3-$gfeHi#D&g_+Hk*l z8bjb3TCA8jTyqs80vtQh?Go_^I+*?}u9kJZdVaAD6+0O5iyom<87xI|lM@L#DHjC( z)+O}cHdGtUV8hh+4s{jGu3O_0P0!$n&0ho#RSDZ=BJBZCXmK-UK)0^QDK@>vM@pOX zakvebY`vza!)~ytc8`(66bmgrK%Nf%4%)(t4}`zn5wB1)=TEC-zl*!7Z-V$CmC=N3 zN57b&=moLGC0;hVR33sVqkw?kN92$xErlOChxVfN-Yv_FfsSD}_<@_~DXlUP6P0o3*6Us^|t7%kErl_=R2}gFnyS*S+MvO@k{Z_OFJuc2{OSAQF zmi{$cpUKbYZ02-ejL9{t@$@pIs5Dvd>oYu;62K!|uVB##I<5tlG^t z^L8i4!2Ba&S6hM8UZHxgV^rqfgfcR1%naLwg-$uF$BxiceRFf!0?!lI<+_aBq8z(>iRU}7ed1aAy3I4{ zbxgK8pYkv((54&n{L3AAdk%SS8@$Bx_m`G<0({%SsDhX%Hv@ywA^R)Q z|9#h6F=W3n_|LJEC)XM+#?ky29Nms%p^sys?pXe={I<{*XWiR2yS*-W!B}|&UY3VF z=&E}U(6zy>F!Qji5Gjmd!n?5d>ej%OXjOf1^}B(K>JJ9qX;EH+MiTT2K^X+?ivD2! z0-Zckc#_Oy{nUK)%0nFhmoaz_t{tmfwB&ftRE}{F7$0&OneoHWXPBqs8)x1P6mb|@N?|S$IH-zn;9mo&CSG>G2bGt4-=HkD{tfvb&b|KOOT2A>$z$D{7@PrBxZT7AgNV8>tp3(9JKS#j8B}X#7f%6P5 z>^Uni4rwgS!6Wpl?8KpzB!iD+x&rCXh_FF~)M6U&a9NF`#$GL`g~K2BJWZ}O>cDKE z=D1=T7^mMX4eEGju2U|#$l3Cn&CFzb=va>Dd#ICQ;oWN( z_R3F={7jIa0{JPEpM~;-JDU%VtCx3p*>i>J-Nb#oz=VU=d>k5bk|E% z)a>8oi9Ye%buXcv?=qMvBlakjL(jg|XwPr^m0;E2uy`kW?&_cyth6>yNbCt5)vi`N z4G+nCn{<+=L5whXo_;@V`A`r@r!#`R?aatJCqa(o!*NeJjIM~RaAA7Z6Itgv+LlSK zz+%tS?>Ri7$9Z4kxozg*$cn>8jJNsTP$vU^TMeR}V{-Cys* zVaUyc{oG*=RNxHpb2KB=W)HR7%^;@Z9z93?o5_MV`9r@5z2k`G{!nMjjZ7r>dij~c zUkQIV^JmSG^#UyQy{X9FSZudK=wpdD!oQzo#i~T7<;HH@mQt{{oVQLp zM8XhUPxF_J34N3k`a3xi#b{JEi*=H7w53DRy>YY!HH%naBwa%Xp_Y`Xv6BP_qim9% z(BJKNc9N!m&Tz3~uK6h3!5v0hsKW#2py6E_!_;_tUCRfVfh87B)AKt+X1lDj3R#r% zS&kY-&yopRNf2!zd`SU6-zno~#X^48E+yg{gwZ~JRuV@0B2P%4naKOg!41@H0Ym#i zI>&$uA{u|5-q6Sj7In^-gMSOXeLj4~7G^@gV~h%)i61Mm*{fTGFFl7j+lz{41dqm1 zGF!9R)QB|$~YW(G@_)8iuq9!1*8;0@@WfeLBMm{Qxunb>X;6~3AJ=mj`Fi zo>0mqSQVa5Q!Gl|RWANU@&3`js@8N{8@KlG>A`p^vU6=ub&o@D_aNv4q&@KL;v8UXm2#GTnc z@S8R8Y+qq^9C)?`{46q^WdUbe6rMc*@NAM_{@wruzfauz{TF<(Zk6&CsyJ|TQ1lAxBvYpa`~%)U7yx*bxM=^tcgO}* z)a5JeiUaSmfPYA)4=vyy@&3^O!2eF%-}?uCn+D$PE9{N~@3w${Os0=5;GgjR$pFAH zrC)fcf8ZlD@WZ~s!+H@MW)U2=p#Oth|FEDR;r++}(2o*#w14PAyctD3zQUeBxrupt zEa1n;bj$*NocH4c06#(8iT;2GZ!(H{eTBVoz`YjWPs#A91^6WICkFr=BQDl2;55t^ zw=C%VtxM|uuCMUjcoFYfMI0on%uGSa*39e|C7Uy~ACw&YnNjq<@Bgv)F5ppBSL650 zWReUpI3orKf*J)C4Qe2ui4!%6B*9B?LL?WJU|SpGpe@22E@~h!iDq&fwQsext-fll zt-ZXhZ56QI5`rP9Rgk`lVihm7I~`i1(hv}t|8MPcCJ7jC-}`;f_k7Ry=6N#boPGA~ ztiATyYp=a7#eYwZ=ilv$6%`9sO2sx-4qLH>rNdP0YbjmqAW-~4vhok?$}x5>7Oa%YZLA!&atlj`t-MuN{&ArA<7DL@ z+m(Zq#e$Slxs8;=R&F8bu$5=)%J&9}_i8i;WmoOBYiF%37Oa%oZLA!&b_+{~t^Lo? zFthZNK=CKZu76@zet^maGo^AHGl#9*!qj0a7vFf)!v9?G)z^F_&xfw@J>|OncLK%l zB-?+-ZvS0M3ffBhHrfu`zJaz4_o>7 zb>;sE6#pYxIn-BIZc$sS^4)v|s5@-s7Ag;0`I)-%e+7#Fm8=}A1FTPYyLe?JwMV*@7samxAoV&O|Rd!8+?ba5L^}fv~hLV1})qjw!xqrAC~?t zQ2e*#*9fN|th3E2=*n$e9ky}{cZaR~W7JH|(w;zZPqK316r^&SQ_z*$xH@d*7VZvP z`44pE{|prWGg-NC3R1bvDd@^=TphM@3wMXDJYQG-VW9X!4RkPhm9Pp@yUi--+HGVV zwss47hpl}laxJs;-+|(PC%Z13f>dsE3c7NOGZ+>>=k^Q!4v(L!bmjX3#ru+#3#TBJ z+nj=~+{V>mdv4+GusuJX%Bd;ICcyQBr|VY1Cit4~0+kNkTJ?M+7HsAC|6uPmJ-b(W zalN%A>y=(yZ*9qXbuao3-I87KIa@NbBaR^hQH3dgq;FkX_Ex#8pw?1n_SSG3J$O0( zsBhf`)LrU|KYduJ&Kud&Mb3$|I9K+aekTOoj{r6 z;oLIEnLPh3uguZH^Cdj*m{sPuh3Ba}e>kJeaU;*C^8DP{WsW;}K9=V{pH=3#j_0#@ z?x4=aJo|ZmeLC(Yc|MBgKhj1c&!c!=M;r5bR?WgwcFP(SPRlRKWHWlmk%H{EE0K)P zlS7r9zVBUZe8*2fkPDQ z3`PGQ;MWq#$|>GC-5gEfCSRR!Do0k@Kh_A?TT!X_ZWtexk#m|vW5-D00H+c!W1_~H zm?dfWjBY&=knE^MsU@^HQc#7saR#+_aK=$V(0j4OqHE) zZ8F~&aTI2i{f}(i)E`xX_?;n)j*NV?1IY4R<00dRP6cn}obcI~O5&s(pNe@Uy@`aDU2`}#> zqctpWklq>cH`J`-5V-2s%&nbbBQZxG8H@x;@@labcM7%yJ@_#5~%gQV{(U|zaCc41^5M$yqyY1tQ`R|$C95t4B`Z_$}N#>kPIhDX; z3|6EpLR_Oq#L7IuiuhT5>CW&ua#-qXMsZBP{~p)Ga%^ic?s^7qQjtyG$m$HYQ6=iW z6;h6a%DFfwsl{wMUP$fv3p0($p!a1A5!(3~x^9)NvjnTu4OS)bv1B=mEV+H@?vUeh z-(8*OM;Gj}&#!UvGm5id@%$YhBj)6Xo=vNxmvFkn5&8;&UgobLL-R3A@K!?7GG*$aS!ZI(h6rG_=PX2UlKTQLjHsvwe z>A3w__g6x#2$|D|idSjRf|)u<4BBSBC}6o*Rq#^kK8EccK_sV&5hQ1|2S^+dH-l`_+gNK=sYt zQsIMCl)rdV_?zlSQgtDkK6}({+~PQ@GP-z@dY!##Z7qkng=XWP{Ih(wN5fb5ndDOp+HRy^$_|Api=b`(ml2#J7V?C`92@86~Rnew@oSZbh9a37B6q zCoRB;o1tW%hXKr5nY_l7{4%faW)UTT1hJB>3|xlzwrUTm;@1UnH;DmtNjs`aM4SrD zf58{|8(>`Y96^cRGaa$UdqSz=%b=t`<-^*KAIdMe$9MZfWC)bp@4NjTfjyRAz4_%2 z`pA}7BKdW-Mo`EL}V2w@oo2g)Bd9*<|E4T>W>G4}*vjjUh-v&lyUPqmvu6py@> z>HruJ*_30V998~av55{=M+V=<_sHk1Jz2KljhTR^sd18oia~GUpKr(%G}BMy-ErEu zZppQg)sr098Ff#^m4J4w_q%Nk8$O;;)7lo)!6`qVNj*eZbI~FV7q!xD! z7))&nst2G8YP{V6-#`bj^GSg|qxn(8;7T*JqRK!xY@hUO#VF`^2v=40b;$$jJURYf z6JYu^`I;r}F5cjtf)gVo!wOHhl*LJFsP?LdNz7mD3Foc}Xf>DYH36;mGTHj7-_sy1tE87gam5{fp#D; zAGdBzWY-AUF9_LfBjh9-A-h-44V1jF`T~41GS(e$yCdzrDIIz#3#T=$BzDN@eU3uo z6f~+h=ARNP@1|*7>kVLy)!{DLt4P$)93~xDvqxi%`01k$OK!G?<@jqYsG%7o^i4ZG zScWEa6Mh-K)8}duYMaVZXnez5=+5m6bcSZ}Hhvm-b7QDpAii^MAdEaPZ?lA!}lWJ zZfB{%79EwjtteF`mgDjA(V%)5{DY4uc|kq(Z}JwRc-gJ~pl?|`VD?dNa;-YSY~+4Cky|rXk6YA1 z9C5#!uIwV1y6HwIbys{u5hVkcc$ahqaZOjL{ot|u=kBCW#|!J`u^FDtB~LP<@G|_E zoriN5;wEGPT0N+=qs7U05@+TWK&5_wE|^)~9i8J>roP<-Of2O$gKWF3OS;4CaJZMO%-lnvg$uudBb6A1f8i>9CJQj#c`~z-lx`m zESt`v=$tIGV?Z&G{eebQ;is5!kZ(Wwl>UZC1j$C-FPwm&sk|PkNiNQhN@%u(OWUnN0xjWMr4iHEMYHkm+e56-NRoz)GtpV1gB}&Ns{71n)7Pgy z5)f;x#XoS1)?%kR@#^G?VfkUh62{luM5X4rxjV5TxL)*Qw#$y7P&+=58L8K9B}&$O z(;l>#TH03yU@cQN3R5uOlUOn-F+He$1?{z1fC-|XTE1rvI=MPGrQifs|0VAFqf_{y z5`{t_>jG!u#={Hi+Qh-BGV5)sEIPT9hU(jBR@7aIg1W8TOdsd-`OIGPx&!K7Rzhg! zR;+&ix`4F#W}HZcfYV5Q97^Y?P&ble0TD(lr$<`#`kX843LW9&t};jK*+QF5o5&j| z@+?UW6uFnBhDKvjNkFvfXZEli%I&kAl~t=Bvc~Gq43ABudiSv{>&lF5&Ws$)T(XlG zS=Od)1`75POikWHCbJfGWmd;Fyg^N@#9|4O7_Ezbkcm=&5nm_~$Sf@9R~Ds9Q81c~ zg3-lOGUv|=R#Y^!mk-3Cu#7=A5#`%+RrEx9Ehp?bW{pP&m7jp?C;|lH_d;G=I%Q^r zpt+vFN4}dy&pS4AS?r2G`pr?%Io=3xLGJ*}XwZAa^F8Vte4H3}zyf+yn1`MRczxCF zGDZ06Octxo7ih-4x5&-3aOmLn;auAHh+1{Gir+40^$nSc#pq7^6X?U9P6fbgfzHEc zMO_=HcQAS=`ioW7l_s&ktGm|A7mX4)*Px45!Yvg^Y>B`!>YD z4?q@j%xn1e+%i@H9lniyh-oGVXQHcIKbTR&2Gd(t`6e+Z>F_h6jwi_%q9#|m0%q)+LQ z7ZZW5a5miaDS8d}tMh=Wwl9?x9p{2#Oh+wgX7??=xcio~Ec0tBs%n@@w;HnKN9;i{ zFu#|wVvOzQQ-y{M8a@GaF_68Oe(0h(Qc9O^lA=!aO+A=?vzKC&KFmt5hH|z_bwi#M z)#b&|G~`mkvCFP?_@cofMGK{opYLYBUoCoXqQh-SRt5gJ=TfBtO&=9LI_0aevg@W{W)~s+hfyb-Ud`}k< zdCrs{Yv43j!BcWVS5`c62jZI^QD~Ah`%2Qv^RYXhVTyngSHS{sIE7~kVylM_2I#5nK&Y>6+BjNvqCdFPB9-5 z#SVrQmeks8g8wr1gHr%*4-^mkZR~*pJg2>KzF^yDDq>Fy zuSlC!hzsRUHCjp5gOJr1h6eo#iPb)F37&F5 zWRU${tVPbT&>hbZ2~k568D!v}+)g50wO&_OHWWfPgX$96Zy1y11gKK1;eIAcP|f*` zkgFU>Q3QVg+6iE~2)2%mJ72JDFEiT&u%U4(z~-Ws>3H9_;MLx!<7<*=O8tX9V^p=& z%2sJ_*iAd2oF4d$>Z)jq;F6mEFzr4hsA8?AzLp5xZ|J`J0)qajjlZyosITQ(N%sFx zC;xgddA=lz4kH>lD{2n@m)|ScCW_r=VKMFdLjmQxatEM-Hi{kpWC)CRx~Qo zU%2dyn7bUrOgt{#3#BzYNrl+rUuGRrp$NB&lJO z1&2QkCSN7VQ!F?h`>~1{L^_A`{I$(` zT3!KuZ2JUG*|&c7WgIW+#BgrxhJz3f>W>vHG`H4A_MZ_R7kGZ@n8*h%a;B4H3rsz>@yT6RHX-M^wX@ZWzmxU09dQX-2wi@;SN zwy@U;g}t{hGyf@PFfcQP-aCHT?q;ho9$t?l2wp|x_$H{X!Qh7+uv6Xu~$Lj;DiVmejRJzHLNoYq(u5%#)5(6qO!Wd;-Huh zL3Nj|JQJ&)KrAM!Ms8vV%5OIQU7h_LktcZ(Ymwh=`+^nL@KlOYpRq`1 zt9O45pS3}nvDP+=r?pmMb%aFaTI}Y_ep@YHmT7<4VJo(J-`RYQljP|HsqP0>bt$27HL^L<-xw>&(0xnx`Y-f) z5EW>7AAD+88FujtITFM(xf5fsB6oZ&##H+&z}h1pXxh$MU&;f`ayj1}FRD^?_lN~e zY`Ld0XwJDfI?9|g2jkrPe#s^~ahBS|)$|GKuL-6&9CZ&%1p01QR6o&_6F08fT~^ad z>^^BRa=+yJ)ao#1YLVv>!ny=r_cbd}9+3#q(%w@S0@-JTFa_RPierFY2SNhhy64TN zJIUl*m%%ya2JTGcepZD&bcD@dYso$lr5wfR31W&3Fnx;2NM z>Jf8Z1=A$V%cd!eIMGYuC@|0O7py`dyJTO-J6KC<-$^4mxrjWVKYyXQQMP)*jUEbv z9;&oKP{!!l0aFfvz};lAARywsArKH*@0UQ}Mrh;bL*VJwuLXey2Q*;_6pHn-`!%32 z1PB%ahHdv@Z?Oh(a?>3bQ{Gt7Gm-uY%Tpp9T3}}Z?a=&x1XM%v-)HCFB?3O3A2+9N zW2|;|I*DIw3f5qUjJ$l=XfeR#0eoA%{9}pht_v`KMVy4cX(YljSzOU0?N^cAQ)A_F z8nf6VM}Fbs;kO~5r$-LDZX(M2lvPudaZ571fcn?R`WSw`AA5>a5w(uA0{DpRPdssd zLvMGyxrt~aqBMo;&k}E2CK6v_+r1I=t;4802rjBZ8q*A+@g`V>z`MWclheeQmX)MG zp4#+DHkR;>-nQe)$Q^C;Qc3$Ww=-7hs`$=^!F) zB0(V8UpLT;+?T0oZy#QP&H4SDhsG}2+O$visvnqPBc1S@MFGrb4!?d&ZY+&{0SgX(tjnr#Wpvj zFTK6`vU|V2sQMA|?!CqOvg>_)d81cfcGQoQcYj%|FI(T&mlt~VrMrHVyxX)`U)t-L zcbrTt)|U&v6P`tnHqXnFUW#rpDa5VeBMB|j6Bp3NoqZ`GH3Ue}kqvk;zaF1hnm zeYv9$E@^YgtrzM`>n`Lnn@gJip)XDTOrBb9;yaJlcPr$Mj}7H$7eh(qPxZxC0=PT2R#-1fR5wz=+SysyKC0p>_t5d|s zLw&$_Z^?SIe3woUAH$@)u>^ORJ9G;Dkd(hH`Mz1s#)%&M(@J?^$r{dJbjnUEWs`61 zBD!Ukx9ikrt<)!dYv=3K4LbFAR_dd^wdd*7M|7&_-O$Q!d}~k9sSoSah?V*?-`b;e z>iwiHxt@IY_|`gg%H5K(kd!-pYd;X&F26%k%1OD^xAw0(rBzY_q%`~1KCe@nB;^#K zC@^1|)$FzV)uyg{~+nI{hocM@RZ=!ee=z7V^mJpwOlJS)k$~BT5VT zCDFHjI_xUg4^_&2dGB7cA1t7|zO~meG@-L=>I1#WaTh-Nap|hOKV|U}dIrtJM5}>@d<7LzIIhue!rwFB89;} zpodWpKERQ||A$V|gI`7pgTF(k=)s>w3WMLJQ<|in$;rV#y5|v6?ZNl0eUJwr|22nQ z)ZAtTN-~ymhJPUN(vp#eJFrpH|53i*m1nR3bc?I`a&Ha8iwFjU7`3BkGHq1}4#2)b z)IG*%QxnbP3Sb%K*>tT25VK&CrR$@R`tH=r>PAIpwL&J|>Ll($m$ftGC3o7{L* zh!TdMI2xO*TtT(IPj6w^?sn_D44d0UMdPrXv4Ncbd05WF>-^S0&L8S6TC&asJ@?T| z{rPlSPQMv)7~=z~m-Jd>m7a#XMXB%nwXCDJF&Q`#gEcxBQ!})l7g@Hl!R&8g8Ql&Qh zT2MIpD;X*JvQo2qM@3elH#R!4Y?AsDBqLHk32j|<%x^#-9f?Gg0X7H{9bC=i#zB>_ zOSj*4q6u zsarB8adwGcLgv|cbXiz~$E&&<24MB-`!KxLfhWf|j_|t-94qq2f!^giVrAOro5K>N zv1_^{GoJdm1ab5I?oA=}AB(DIuY4CYtjv4I!|mZh^d>;7d|&G>NtZ;lpZ==vQNrnG zT~9T;aB3Euht%T2CmF*MVibE%Df49aI@9BeShlXU>l#z7S`eC{x8iI0iPS)oU69Pt zbnrv7D;qV3esQM99{=Eyw9vsCo)O}Ds#V=DDHc=yL&^H^i zdjs2+6jNXPMBmdcWIyi5DIf~p;aPm;T+S-WahkUplLVA}4ixfzDO;oS!E|4XX3|Rh zJ>3i!TcMD@ws(Xl`%Pl-bnZ30J-?Uaq&z`0^=wO>&6CAdIQF7HFgT{qZ=SBVPBkoR-|U%})m^(o>)3yZDU zBjeY?+bZROLTMOf36-0O1FHRLW`E@G=Pi0GFJ+RZgOA^Vz$$*EzL>8K=4iU{6o&z8 zn84uzWk)W0DKEvVOY{|;=49jd{PF>?%%)4BgTw%>&>n$Q%bRp@leb6sYuSe>hfLX8 z31~7fXEOyoh+}j3ob{TG?^UUD<&$Lf$y^U4p1n~9PA2S_flp;k#RD{ROg+Jhtyz&7 z%rtS3c?9zihi2Y8boA>XZ3L~;=;*~I@2Q0MPzzu;!0mo+5*t0cAiqQ2fPeG&|+k-o-m z7)tD3K~2!=FCNeweAs!?t*=M%elB$+$yJv2Itwwt-7I*{$0CPEpAgg!aaGK2JT);P zmg;8G8{5OhWJCdwiOu7BX~2 z9Z{v;)#PuMA!U=G#Y>{l zUNVgcs+hb1P+)XWPbCW`6o(Q)dJqobBTR0Pg8}Y6fLcHfxIfaQ2Ygr|_|VASXmIiC z5*A+LFTDQOU;KU|#py3@POX)Xi52<#LGWrV{k7J+d+%eCml9;=@#Ek-P5k(IdykjE z4}A_dPIBhDbtLbQ3*mNqMldlQ`4U0u*b&JiGUH+D)y^KW(k?7rs`LMR)NZ5Ftn^d_O&8oqM zdO0CAFdJY{m>7%>69W}m9Ko?j+rzX=uMsj@tP}Hrn>`<7WvA(@2bd5Wy zu^W)19igt1I2IT@OR!|GdwxEOsIx=Ps;YTv6zrq9UwYRaIC#@3tKESYmrRCjmUB*K&X2OY zC+@Gd&r#L4K^e}eV8us>q9oXX1`dJXkI3%$QDDA*^*>lVZgK}UFMnH#=9996$NuFn zr@ZutlTdHvo>NwO;#~t1g^$tH7xnr0cauN{4+QN*#Xq#S)}F&?s5kock*I`vQE%&x z_{EOrW|@Eood)4BJnHuK4oAw4+N1X8_Q~Vbtfkaci#dYKI6VOcf||7Q0+M^cZXrHd zUPN{k6%?UDWC6MZj>akCXwT-tOxaQDbpIWwJrXnrZff#I00+}zxJR|e!CZ|&`s)rk z8GV@PIXGk3Rx_!7G*38D6+7e=!P|rxZ zTb>r2E#Fg_n89+l_8rDzex_hr`GM@`Pr1zFJo=Oc{XMrxCThn9t9!|%Ygq9UtCyud zE*Ger7q+=$uhEN!#{A5{^UJ@3)kox;9!CZBR?LgK)SYZ_Sw-hOMJ+ot(GK5011lQH zPb&-hQWae%V{roA?)ffgh=O#;e_8JcfA+pOf}GtUkLLFq58xJ1hNP!LXUgcgK(500 z58#IAvM06J(F1_=Y!K2@ay<>no?wQ?foZ0Z2^q!rx)<&kxsB#=@AxmPH-Ef#05hh& zCYW(Jk83gQb9x8K5)z{1!Sl@;{W1<=l{pK5RgSNxS5_dj zlVfR>8pAI98DZ-+geMC7K8~>A-H~@R33?sYUy~r9(+$JFFU@?5SD#_{_vfV)=zM); zF#MV7^+f|8R=I<3?Y7JtrSSzGF&F+PoiInTedKWM?X;$SX~s@y5sUfgDz&PeZzy$> zxz;=)&~1#0tYU?GLLxS&NwFj7{RPn@rZ~f+@+O2w==AtKtrHTZp3q+SE#`7z?+7+X zo$)BcvO|XDx8G&_>=o^t!OpFFRd+6anydg->aBkb0@|ZQ*7~(}B9BUOo0DKW`7*2L zw$K0|F0|Uh{iW>ch|z9717brhU2UGisJ)-_H}p$)6W@{U+TxE)We(Qjwrc5N%Gg`F zQaWu7BmwE!`isYV5YQbn2f1#jm=0?ox|U0@k~d zybZu%?{!o)Ac85BcS$aEC#Zf%wO=ZN8Jny+Q>wn_kgET-dq~wCoVIPs$ekiG~5-%|u_A>CrP5x(t0|3WRrwP1+<&^GE#xriG<9 z_S78|MGgPuU-O6e)2F1W$Szm3}#%SWWgzcVC4*7)ap%-#om*q zGH9ylsa9?g4VqfvX+VLa%L*!Yx$-O&hL;9YQOl1%o2NDt!EtJE}jaMTRN{_be4S9rVR zR<)@NS;>JvI-@#wP(9ZIF~;ah0*Be>QHL~s9*sYEmB7nx{8AbxiuV_{{#$lo!?eDW zE*#SO#h-1R-RB(fsBoP8jEkrd;UgK7(P3X(iND}mVNb!*!v!RE0V0t&!?{x6bX{Po zMoPAT*s9co-EG}**NiRoFhSo6r^{uj;hNDt18L=;xJAnWp4Nbx4dfwF?v$>$D@7c2 zXav%dg4om&|mw?@D#2ySAF8Gh6+MxiihVGvm)@?~AU=OO(zOo?nD_!r2Ym#42-3{WqdLRqRO(Yd+~!wSM@y%wiED5} zzo7r}JDNIjh)wi*(>@K6j3h*)PY9ANh^#Xk4-5gy79s*$6Zvy`^K<4XJ31RK!*}SS z!#dQ4=tXxZA|3Lr-(tRQ18bm9p9idmb@ztCYoLdiedHVdRoQ5K%IPUrwdEmNO(JbL&lm=m~HIFh<5+|de8w8Be?8D>Yc!XK^3 zAY^Z}Vp6msD_SunS~0b?A}3mr*IH2!{hqGtds3HO6DX;!f<`jeO-Juu9n6)oe0z{t_dkHbZN+Hy#^VZwXAY>cNWz)Jta(!W^SYzo4Kh@ zJSI$;`W8K5n<2+v3v>Tmr;e=}5bb?__t$c^Jxupk!q0r|?$;dJ{rx~}p!+L$_r=}+ z89f=={e_(5NCaFx^2kamIbUgNW!y|ho5*I`L{DQ(+qSmn&fXp#Nd&UOwr$PCxh*95 z0{wD)JO!WXP5Ztb9^JIBBGo(vRKisg3FeV@jcxUQCX2)t4;5-?jK#?K;*N9?#0~QlIDKa zL7K!$|J-8kXWjSeV(p9CN2FjCZ51PJpqMb~MZ4-n$;!vgmp7I)R^&PWFAN8AWR^XR zARCaOkKI&||84R7-B#l)faQS?}jMd6xxWD+fcld3tPkrhD|`6~!j zPLvYjcyVyc2Hm4Ry&O7I=8fc?K&MI$1j_tNi2dM)9b%owxs;K{lI)5eON)c7j!1$B z+I)f%NfYZ9^=8Hk~bC%&~>7+=%C;VijKYjV;#FUnI zO*}lmsFu=Hyd*MrY9d-UrL`_6T9*~Ao7P%a5YOZ7PN+isWNz}29>+-dT3cp#J*>fJ( zh4iC=|3?0A=Kps7@8thp{(sKDbpT_-By(pXfyQhSCfx#)$(IelY6f7m;@QJsbTb(urGA%2 zoI7m9SzkIs5J%#t+dz6k5T^^onS7fD(h32?=K|?1wk;Y+*~GRV1k&+>ZGt%BoJb?i zN$e5@NZ07^_50R4>Z7GI>P5lgYLcX5he4*qhRoSqA*pvWW)JYcj{j%)@8jhaZlnQ<8i)Q>^F07UV1kSyWQddlM0LK zKa#IY246ot_!<$sRr;jC*Y^#+emMC$eeiYDz-zr|Rd8GZhxa3$Gd#Jibh<@iP;5ef zN!>kB8VIK*N;CQ3xtR&vZU|FpmD+06@2cyJm1bgzkt`fkuN^IMyM)<;ko%ZLR;|IV z(gLSiIZUOUv5L&Dq5|hU-};IfYdVDT&r|=cYoQWZ4jLRyEU9(VG0>3nF=~PTeeJEYe_iamv`bEm`N!eL~nzDoz7{aqZ4AueDj>%^D97dQ4Nk@)Gx zaATMmOg8wB39N~SxA7l?ZHzj!ji!~;PmNVf4X4jjCv#rj87azen?)IB;en`2Bqx!P zz`3(NvT{Z;Tln*{wG~Y-C^e4eXnhy9E)HMInasM)MU$94j-EwO>Sibl>;zX)UGiuvT~Zk_}&ohzXcbB&o8(*oLg{dcyd95uVn{m zW|6-sufgyZvaLa0uT_)?l`2c~=AvnkdqeW1&C%d?E8uX!E6k^T$97e)FnMmX7j zY50^-!)5h>jlPzD@ruE&&-WWgz-ikE``@I3uz%(PN@#?Ynz+{pD~JrjVm%S*&ow60 zM{aOwoOP2SiL-Z+C(?hWF;3oUtd+M(ti2)9e-*AF`mYIRMEbugs&xj64;W#fJW^v^ zK~9akg2WnkFAQBP9~3?{(jVpox_>$9Ci`zNa(S;&_*8B*3LnpnM&V5TRXN5;>#K$$ zaUE;Ym%@DvU;4RlfAx|9xCfv7U${dtz8c)EC6zsz`C;zPP))7x>C)+7!s=^%&EE%K z0v)T*3!jB8kFQzwhmrpC!{i;KRZ%ZFkj34q|IpWd71eT za)$iz>WI3GkXb4{TqPWe@opuVyTFY2Hf}0Fs(5##fAQ*asrc$uG=7bs(|1IB>AS{b zWtp z^0mlgWsk6{d38AibfSmm^YyqvYh7><)q%RKVzU#?st)CD-WWcEK%^>-o3yTy1ErlxiF=ufr9OMkVwYD%mwGkaBDOiRGB z_w|)#c?~}S$uT3i4kHoNkWrF|m3o7f75X&5+JIiop3j_%Wo?H_p&Jtk<<-~WG>)pQ zwkitc1l8#jr!2hGi)uUUY$V{g=@_%rb_h9`m6lShtm42dY2YkTrT?cGv&3SOzZ%Be z2^G^Aa~!nf%P{6wY)v%AoF+FzFlIT_PGd|=Y7vZiiX8uc!I*VDpNlauHhW)&G0Q2Q z#F$cM`xju$#a7m#7=ymjpkUNSo}$Y_*msrAKpW($<%@jHvUdn{EI&7VCJW&q1ZSBh zI5!_caG3o=2+sRoNN^Nuhen^XS-dp*EVl^GvSA2Ln@}eqIR6rK8G=4hK|&!o_sJ$$ z(B}ta{i^6wtO*VQVWBzw7QrFhF>01joKV(6$VpC;=(t0t#nT`;M})F#%;)e|AR7CF zRHq)ha-llCzV%fzLMyQ5d^PNWbkqm7eunr&AU@tuk-SUNpUow^bAYr>hE5bkq#BM> z%lGI^o>0-{^?~gif%Vr%Zz}K8w5Zpto5J=XyDl&GwCr@UU$aONu9vc^)iHk;#1e0F zLW*RY0X5oVz7$j=z>^_(MYsS>iH_7;5gcJwtG6*4Nn+JqP=wgrOzh!q8b3gaMpx)I z9=Gy=Qpm2gE0?Rz8<1T8-;P{mjQm$dE>o~URx-1cwBYYQ(CUzqWx_y=-dD@ zVbiw(Y>@cN2H;S;T!>09rEB^e{qj%_{hBSLALOK18YxWG{>Qj3Mrxp}hq z+j5Q1uNhiy*PQ>gYv%Z*LTuG?UoNf|9?vYDiezCt@|}Wju!n|w3Z=2_9bLm|b9|hU z(KdH_)4r?2Xqq(bD>G7~Ra4E4sp2^+wyH2_zNE}IMPdkV`jWbY+tcI~Ma^5}SdWth zf+|EyX96T5uV+-6MX15|n?-WgjgjdwlrXg-hS`l4kjs2a7-KAAmw7bg63eCrE2#PY zx6o+f`cIA!uxsc?*>~YXU}b4mWYaX5z{_F3utJ>bFt9?T=u8!Xj@8!6S6z)%pvu#hU#uVoM5YUb{#`@OJolzfn zUSL}vcxf2ep26qZu>JUrFN5u2pxsD;&wzHuXF*%S5C~}hgZwsV-9H-w+Rs4t6b(1| zuF%!kxOcE5mdSM(5Wo2DR|D}V0dZ(4t0VHj&q7&q!=P-nJ*x!stcf)O06}<|QU&%j zthBz_x4w{|7J^XVgRGE$jDX0KFl)3F&UvoepWOwuXz*cwDm|-=A zyA>QHSq&nx3?i>w?3SHHg>w8rdMCEEV|C|z$<}2i)kiavkAt1DdwJ-&oCPg)02#d4 zbCet)uyA;V{8U{azq!Oz4v$yqg#-Kfrr*eZzDHa-%DiI2!Z1DT)TFK7tT_JPK^?A;mJQW%|^C9}J6#OBheG9vLKp$w6?_mYlAjY@wVTt{2RaDzy1MH&x? z6H>z~G!=DjV+5{bmN5kJv}zRw59m#YN~f)(BdhWpVeBPlHs$4ny_VKYmoq0(3LVx5 zo%YGGHOvgI`t`mq2I#tT2LO7;uQfnN{C^Ojxg3!V4^XsCEr7~|5`g|dV4no&u>#Og z&Se^=h}JNJuoR=}qemVJRGH59R0DxjDH3HCiww2woB{ZK@JoSTe71mnCSvYd(NN2l zpJTMRfyhB_<3-K@e-urRR^y6|Ta+P>AfjKUXho*Bm1ef4%OsM)>@+K~%#D`7V8oi| zn!qAdWNZbCQ&`#=@xJ z>SuX|;Ts$zNsfUACl1r#S{kgaB_ix| zr9q6R;4)61$^^~xQ7qyt<|j|e_sLm|v$V7<(CE486>$xKo*pyI$;cn2ZVC*H{J(!8 zBj1S+2b!xzvWt6x3H+vqk5cmov%P3#gDbSuEHL#ni?sUymig~gSE!MTD6S2gMN!PQ zgXqP){QdK=gI;tH`vz^$j2*;QvsX-`_wlM}^(l^phgd$pc!=e5hT3-aKvyr+eb9$Q zwsMNO%^ZmbYdqhhh+<@D=Y3*uoPxD6Rsn_H__&0_bR`NsrpxrSm3T0FaV0nu8&o*? z(i$cVsi7XVl6v$wToDHh@?a%S%d85^0ep))aqH(WM7cF1!9f|`GSzh)Jpq>5T4GBK zs8*SuQ)+x-x){bR<6IG2PSl?8pVKk4U}U%dP`N{O)2aeT_zEEitE$XZGjn&c6654H zw%Qf>cCRBCN=w?Qs%!4h3o=-6a(+o~_=M!{Ry?GMEvqGM+Xo#zKTwxvtdAcj2afRx z1NoNaS$Tx<6NxBWSDEtSi1g>^2Mp+|{7*W$>GrSE$=`gnPPQD{NmiV}PFgZQ4L+lm zm_w`bR?Rc(W{N5{J|%`Q3$QZVW13mehQfr9!gZSktDJ-S7=Q3|Hf2G7SzuKj5u?5c zb{l1O*FEAK)bL5_t;%2;HCAsbP;^CJih%aBeL}hDykwvD5ZfXP+rVU}vY?AdQd7$J zlu=fC^Gy8M$f(a7$nMW{W+-xI*eH!^D7uMWCy4KNEa-6yU`0jjE9704%qxCHz2<9d z-zvcoSmt#w-=&OK1llyGa|TGLT&u5c4kYOtkq;65D1 z%=7HlcB~M%5r~OtOoPrk=L(PM9BeU@7C%Y0n75F@8=~fmfr`1UiU1)JjR8&8ac2S` zo_eFXXh35EZKkC>kA9f;X0a#mT6iA7Akb)v`5a91Cwl*J5-OnDCVQlMb(YMo49w>9 zPBpUVRp>kw)49U#L^?FiCo!YW4=mVYJYhYR^e?ou$HZ|>nlPzf(7P2<{h__H`WEwE zgdH{AyHs~?z3$$HpXpxS(C(dJb#KaNx`)SZ>EPpE+QB@uUbQRB46(};&yfUQ!S?bE zFb=UGSd3-2HW7bj=D>=O_W*RYTg+Ns4*%V941${n2pMsd@a{l_rI>g{_zULwL^u*3 zs4?*ZfzJ@_Hzc8Qo*yD``|4dN80^Ah_x}&OFz>m6E)2Eh7_?H{{byOv2`!^1+wggc zUa<2h&s^c|*eH%u#oX5RrHXeYSNMcOT==Ks!aw9};83LyZ^I@3DW$#KNywR`BBkfS zn=t;jo2^nOKqDlANO(LGb1?9Lm~Et@e;@|HsC8p5SR=+^t5Mq(yE8m%WzC=)mg^2H zGyxF_a%V~1+h6=Deub#wM5)61{slb;ZlNPWcSI7Po+`1rw9GKiPq9csOe!&HipvL= zx@9E*1@X7A((UoJtS2>AJS7&qHl7x(!Q+!Ru+iu<>pUC2=Ww*=JC~P*&s~!bU2YGb zu_pgExn`}&XF+QZAGs!~5;u-kqB&XaK4Z!&KV3RNDHm>6}(D0?ioq`olW}xcs`QGDxu=WY!~N%o0XZNVO^@*sBC)Sj-XD@4 zxO3arGF`NYL0 z@A)y9*wwQipj4|ZSQRt~kMr~$^gK5Kt$CDf-~&5ADXNan>gI;w5&9>NkhI?}oWtzF zx=1{4bD&jGjqj{Ss7?G1?g1!jyo(XxR4Gd{2>(8fSKfuuy!Z@@K|c^=PR86f<4B+L;0v^f>$SZPZk3z2;up%2*Vs>F;eF^15=XigZYLG@1M!paV~l;* z#{9FxXtBGC^7D*-gu|ny1`!Is6&)*e1eGCc1a(xYMRI3$iYUgKxtK~KL|%|7_J-Aw z$@oO@Y!-)&*u}}_(i6p_FVxXHV@qp!qUpR7jM2?o9y!5xXGa;&@mYx!){4}&^wzXe z?UwnV@9FlS%6x!UDD55cx~#3_AUoL!ZRH6hzK<1TAqyU1{1?TMD6pGzULsSYEnQS| zg>AMoq?Wa%$3K?D|B_CX6B(LL;aZc(Z@41JNH~zYZOCsWE{GBW>pv zj0m3r!*QZ~pZ+@iW#`^+e_7d(PfMhf>EkY|LI)N0%mj7mEO4g3DUss=CtV#d5)vy( za-6p`pEZbl+KWPB2O4(|fv02qTXLM>!Gd6TBI;Cz$V;F8%vq|bJO$f-?uH&E~M zWir<-htpH4)TtB~pGw*zq4&X`Q6e|-pcG^-Po^WdB%CA{kvrJPBpkUX_hn@FAGf8% zGYifMJB!U1V=J9)&LZUQ`?6muP5DqH8peBg`xJkb8Ps6*gVTxdcbHT7OME_d{Xq5? z#cM%Hf7AYR!eyRm)D0+soxv3r+@uYyA5MN$M_EuQYX>nO1EcjC+G>8rfs3@ir!a z>E-*SxMjR12NvfD?M@npvf1++H?d`WmF}s{b;aJoGj>_p7rW}`_)HaDzAEe0vT?2 z_sKHH5jeQyn2;Nb$6{zG=**ek`Z;t{wyS=2MpHs=#+Uae47~s0koUgk zCaRCQe{a4<(b&w#t^R1sQ}$Y2*_$KnDVTK!_D+0x@5__75~8k_O{!*IgT068l6P{u=JIHG?28+2P2J`V|mO~?5Z&4;SX z=%V&IDbpvi+aGdiw|#qXL1yuFy{zGyr(>rYRB2#-l4sJ6YQ^U+lg~+nPh+$mv7|xk z5C>`mvSz2en>wX>92*_VGw!x{##CMR=F}?>R5-fX6C%sC`Y7{tvwMo>mDg}z%NsR~ zg+ohwB^)UHI#Ip9hl5G=)`#-DMHW_ZPIv@3Gh|zxG?5lI_m70Zt$lDvH4;-6>SB1ZyO^{b2{3Poyfbm< z-tCijgeQqF%mb_uqs;Ck<{yC0mjymC-W!~KQocGq-aMCO>4?GolMrKB6b!HN-Vncw ztQuPSQZ#u$`tqmSZNJG6G%=2MM4baD32@GF6v9SKKF86-WfCV%PDgmGN*OGDQ?m5q zQktD!a+f47I%LW0kKn~Ek+x`So;mX=@#5Atd)(BvE5@DTTi3njZK`!(nGJ_T)LdyQ z$W_`Zs^UnM<~5kvZm|b?a0la0P(-kRHG~5>= z1<^gYSi8s_>!uwsi?{6I#kFqLNRsAaDU8S$3ex;L`a~8HeT2{ZQ!6gUs_V@>TrSrK z&Nhy%XV#9bH&+m@?*LL{lQxR&@3Y8IN0G{qWPb=8lPLo-HRqe$S<-hp98 z#Y3nyR!wGdti->KuEWwuIccEuh^|tv^N>Op4HOa|f|b?b!Vs~yJu2f=I>$yi^2z+A zr^UPrz%U|h|8gm*{j$@T5WC1J-uWx4)n@k87PgJVAso9Z&KCv{DBeb=a@!vl@D|=; zpNhixh1{~NYg`de)u4fB`hW_*U_DK4@rfRiV~yT{*XN%V9#`G)!q5zlTNz}>Va08|KzgWA+)|lp^yKbrcn(^C zhDJplGu!aeu5W!B_N`hjas=-}r)%}1(_*Er`uxoBi6LJwc8hHKL;j#zcef1?UrUd4 zGkVLhyoqmWXs07p$m!I{56g%P@;*(5(6q~9-csNC2?+1uQdvH-C8B5Kr@RYRg$k?H zRf9F&B?V4LU3Z6Zk%*HCzlqp`{7aWbK3N#PUJ6*?;UH_D%eXSq?_YX(y$C$&1Fstu zy!TsOWy_MR)+m;p-!#7IHDB`tSR3;Dn*H3EFpOQULc8m*(%1e%x=xqH+P8!p*4~M| zpWdofs(r0Vcvh(o5!{GVcgRGId7I3ez7Ch~&h|p_q@Igx;LON=@e8!y#hT}vG_Yc} zQU~?M$4B1&loOFHuBa{?Pmhe2IhRN-`Yg>tb&g{_U=n9ylax`-(3t%nKNPvri`b?? z04-y!2YAiy0}O=bLvo+h^6E+Kw!N~zM_VRAgAi}uo52;tBLnHMirza_vc{%JV$98NwK^KbC=+{>*d;_5O^9$ z$fs1Q3}$;Q78EqvLe9R)bY)d@&3*ZRDsI zSscoI>)Q!LoMJU-w{$!c2f`pj^-D@tSM`Vkbh|gIi(=xg-Pe4rPSwq+_9Bt`_?l}- zt2bM6=z|!!H{U|vakVrgl3gh8vdBKeAYyK82Dyg3iR=qYP^6fMvkpnFH;$^$zw1nr zjgj?{r}DUQgiqm4l1}rryh|fwkaSTJp6Yw6}`L(iuGc(e@}^$J=rwZne+ zRFQKFGvI3x5vv95uL|mG_Q|BE&rb_a(T6YjErN(k$5#{P_Ax;xwS`@#u0A|EUTLA2 z_s6#x$e3Rw%G!&(J}>3|4OXuq z&gS8G@To03N_^(Cwy8GR;t#l%XNOyfQ>W5~pQq7^(XTGKmIij@wj-JLHIE11s-wBF z8{JSQ)W%|^If)#0*bR>e;hD9Y?O7HivQG&>ArVp{~9<2|>!fcZY6$V*B2$$0Oa4kLBR`0OxwNn#dXGPpynP>6_MHz2s9?uM8uD^X6Y2BubR!;VK2zOek_>q-or3!Zbit|1EG>-xF3CJe zEFp^vShIU8z#6(pXnxzzn&62(mB;7N)8kon{8hnf^*GcK823o1Ym8e{+D-T7o(K=Q z?VDQ)$V^>$cM_^;?ugzyTZ*%=Tt*HSmWzEY4P>Z~ta6?2YY{bdZruxgE%Uf-_!;o4 zQkUK@m=V2qCPg8)pof?*W_NAtkLm_|&B9%T0yXvdDZb`0+?!8H!%qlOY;Gy!mNW=n zB3JdCkenZr%uz#Wfb`D_avsV;L6v6emDY7!h&|HjvOreBH!d!h{mm{lG`c+ zeUVzKl?3cFV*)sh%VA$pR6h|dLtkSvm%^M8r<`G7Pv!EhAIJLVYk7(i9Ame9K#w@h zl1r>bfEWzTkG0H^8{IFvIppAwAJA3^{6;CWC03nfei*$gIc94}G)G$5*O!u8R+imBby1!2wDaj+yuo{~g|@hr}uI^yYiWzO9~pQj}|P_3W=1bZL+ z)YS8Hx5P(F0c)t^>F1kz%u6F1{Z_{!2UC5w)iK3bhvneTEtOZRAF@P>r!R|=&KfC{ zR9!SiNSn1;s9ZgW@9%+(gZOT9L>9i^I|X5wI(3S}kt)7pqAgQ-jIg@3y`%`d9(^&5Uy~Y%_Br56$KYrM>Be zZoSMLgrk%)o;F*g_yCV%q?;Riilo7qMxqLMC?^JNgs+!;7IMp3NJ}A)F?R_YOBlpg z>-F>`Nwebz1=+mk%7I;MCW+>)_uWsvXiO`LUE+zx#57ud28@QNudt%7}s+qyWGS0QB^RsS_}I~dQ3h*rD;I}4phSh z)^I#7w5I;}TT3K+VWfZcl7BWFQXV_rKSk#Fh#YYr0Ziq0@)PqKME@YlamEOF>qZ*p(Q4aad zSPqG1iwtIk4QBNddC?-nicqEu>GZ&~IhZEXX3ahkDNy6b2v1Y`%-MUVY5{6~BD{C1 zT0m)Trl?Eh#%^nlu2MR{H$tVjp(jxbm-t-WH>)!#J2yK4nZtDFMK6A9D#m{rU9Cy_ z+Z&UUG^uM4as?aQen*zo;3DkzqoCmS<+3+i|$BCw>KI*5X-nwVkv9_t?*7^8XF?&H1Yq6@^3^< zM+3Msx?od$WXM$`QUe;+p={gn?%Wjl!0Br~09^FVudSPKxjeOe%u}r71y1utlgZ-R z{|{;J0v}~{CjQT4CdrTs6C_|1lqf;b2%^E7IH2J&Ay%RZF$oa^x~r6q_O}-11ylmT zNi>t!X=&GPb*rsb-D-7PtcrN4CPWi%*(`g-~2`|h_dr_wyB`pxo_n1!W>AF7-<4c~b{0%xyV5CK1__Ia- zty0a2mN&j{z26fpW1x;A`6V>0!0>zd9?r8G$JVeCr&*a^iUG;7-am~2K`J3YKwWiy zVRAQhG_{7oF{P6t6F~1Bk9YBfd8;$dBVlp_s|kROe}S4-9ef2^I5EbFxCkDU#hTF( zh+>C-CAy*(vLl?tG;vnvGD?Yj6Ph)MO3W&686tsIu})o%jgu4PC-NO(MI3_ou|Q5D zIrQUfvhk&&Oub=!ft_ZgST6d8knf}Di=I+r6;-+$enQ_scpzM1;Cx4k7Kw}_{ExLx zhq2N;J1;^Q%ezI&{bLa2QuXouF*KlhULfLF{(-1)#~Np`JxbMg;!X6RyEopv+P1!3 zn(3>kQm%=y=1U%H_ zd#Jv8EA3kc>eW@Tfr31!LRPVI5?~pGRm&W7p;X-m|Eg5I58F;5NEUEAzDalFR%X~66uRf zY!T+j)13o71O6Ov-gK>o6o7Ln9Bg$XAT5=kw^wqIw1v-vCny{lG$zOsOo9VYsWT77 z>nT%*$8nAn&qpeO`VZRK=R#?5h;gnIx}pbIncDQVOn;vo&y*3*^pme;>WF1Ze3WU4 zABGEu4#ODhJZS7RPX=p_nm>AqoWYvTV9k-B@l>$pSy6pF2x%26as_MlpxicIAGtQ{ z+MhzbJ@F5+STrA@j$A$`QL=t|A-oKfXw`K*_!8czW2UOq8Y}gvDv(qnN8QF>v%fr8 z+o8_WNjgN7y57pysYY3eav!Lxti&T~fWZm8IisLvkGtMYg#|T7(Z}S$EIA@gJ(<8Q zfQCLj{zUhEukj4K1Z`jz z$;#{3uXPDuL1Nn+Syso$1XP_bo4_eo>-EOjR`F?m&8HF_igzj4pta4iM3T7I%Sqn-Rlr57(DzZrrf60Mz zwf{WnC}g0!{(RlQ&X*;x6iSrRWu>gG1Ir}9j#a8$Jvvn6IKWKrQJq@=ms;Qrbemrj zU6C6#n*vP5UBAuBN-X=@t@co(peLAunH3$ulFdYS4!u%GO5+Xdg0(L+R zg0&kPC%Et3&SPwlsuHC!<_Tc|G)bkty4PO^!OQ(>VeS_aR`P%-A6>f0(_z+hfbe@e z5+>Q|pp0w)Tnc}xh74yk+8dqjSs`cYOzH00o#ADnT0O@9V%8jOnkQpi>E3iXV;nTz zWSD2I58J@^gB1rt>w#l)wB_zKOWuSG;!Za^wA5{BFe$V$p)u{u#?)EvP4nz?JX_a( zL=Wj6K;bObU1c*KM+F!WO~3D|YTty=M%@>0=dmYwTl!?^57Hs?D_)mA`2=6(4Yn#T zGNnI~3lvKJYEBVN$`_jVZXjujjAp5t2QF;h3**W5Mjb!7?WJnEPJ-dA-^6itWRn0< z<9OskF}-^%t-0X6l5Bck0~7Ra4r;Kb_l2MaXL>gV?-d|m8lV;7oQSbU9by?ojH7BV zf2-6E{nn{k`I~nb$a5mb5%nT(Xzhh(m>N8%qN69`3jR{+0{8f(G`>A)&l8Z$x}wtG z$dlBx=P90w$Xp*t%m$2Vn9|8@s= zsVLfuq<5@~6AVRrOLUBi_>kxr$wuw+gJ9h<}dy zER&NV$okIuPR4z7)D%qsfdFf*LMmevv^?}>#pykL4p2r-SvVaMm5fb zr`8M}blyT5+aU_9A4zOeUjzZ!06el%QN@eH!LATEqVK8UJi$Y`dX8zUCT>QOXo1xB zm^Qdo*SF_D0-k5Ku!|Fnvqgj4(H!x&=cs^8auPN{j^@BE?Kw6nRMG#K$X^=n5gw>P zcQuT;z-acLD^$_dxXv2_QTR0w=5=YbG?;3RG)FkL1#jG)6MdSydwkbe4z-vJ=|!Rv z#nvgoZ;g>wn6fKB5h86H3YW{sybe@@#o`?h?cvA3GW4}9p6kZ?%jq^sf=C4iGa3U*|)W2RfRT-GDVdY>^qXK zA%B(?_|%RDV_YFw0}!|Z~#pR)Y( z(5$}&`bVuw#5G4vYiRvka{ESBd$x{ip4bv-b|H3izIBBBF|8hzMNa@!7IZ0$R3%)K zP6|!~c~xhQmXRQ?%8i_etpwj}RmriWg;r9A#O+=!`NgiNs)5?0^6}sGM`>NSC2(sevVj4)QjlAq zuyNNWSz9_VV`ofXV~lj|3MF&O5xcV1oa>r3Gixwmwh_t9N093^e@HselF#fO-4 z|Lax{2xw{b0{G$46RxJKky@fBw${qlDz35|@*(9t-ZX!5VciTOrybW9O;pr6o-Q zN<-H;gMU2AZ%+qR_dP~N`9!Bh<+kI>7w;2tqPnV64k6wnkjL$pWrH^ zQ$E{*yyjFpr_MRpNCa!tq7A`{W}MEK9M9V)0loBWIhoixC+rS`LM!V3Fr7~}O_Obl!T zvu39`{Xuj7g9GkAwgrtn!IDn@h&LwCj@{U3qTI}k_(jqc^dO5f=~`$!rVpkb*!+@XA6{=gbb7pQ+l zFB7tF(FO!>z2+7+4~IACe9ddZ9W#yyR}JR~D=*Xq0gv*R825dtCEZe*kh%jZKta#j%P&}k-t552bBSdcXpK-5 zu#Vb200>kZ0a*~e!boK08({}I08TUD?7QoqXF$!8op}*-V7B=y^c21+oN5d>OR%s4 z%`m;qeYf_bJMDdqzmC0*espekkNyI!f?iL{io`&>eROYbOVAN$#S_30VX6P18}oo8 zMze|e7{Hr7ZL5lwCl=IhUU3z*OxNrov*JxzQ71ybkV!=bvJxIuXo1sl?ZD_}$By84 z2LgLQO5n~Je*q4?3RLv4hPM_=n?ya*tWXXlyDzW;0&m*_KX}vmU9_fUYe0cWz6!<4 zU@5RbgMVXZV3bYXS!RpJv0{9v+!@NeC!A!}FTVU)P79oc9>?-8f~hn!Jut&W<1o+? z38osygsOQvdMqFSA(Wlo-7y>(1>?#nCk!?#N0P+&NJzoVBe2Epe#V&-{+x>ibcggn zi@hmHe`>S4A9v=g_|$B{t^jNx25slgz|1G?3s9)MG|=sG|L(>dr#UyrIjL@)%{H@+ z?PRzQ&B$45I&+p1rGtna>xh}*G7`IPML_}-;?TBt$LG9zeU6J#X;Blo%+}ELysU=U zG`E)iLdvh7k+UuVrQ7MGt^dGg>sdz@m#A#^taH~3uTfpiCwF~_$EU4SVQn_e&vDm% zP-jUL4}GrQ-)1A=iQPyz)ESsrk3y-<-SB-1hSD=$y4v=NU>aRd@E-p-|J0A_N&ws- z?Q^LP9uKMayY5Q#kDL|0Tt@_=YUGLfhZ~Emj`7gj}=V@JYxKssjtU|bq{ajz~c957!Vq~4P!aq|jmC?C9 z$KCw5vzxDTn%}fI)RW{z${>B+jG`gg^ z0szdy^13&7*IWIox-?t7-@az~Q1xzK#y?xVQDIfxZ8GeB>q{d!KCbQAo)dap`GhKiZbmZAXip#=zoa6ik|BOi7Er(4eg6wX z?LU90{qFkjvgC9h-1S$B^IpNH2!Z$3NW*I5>zN zci*0gZBN(n&%YN&*P_<2gKJrZ9Nh#JR!OMn2y)|Fup=_5`K308wJ1JwgA`Yj1e zZulcalCDM6^7c)0mF@CCh{RuJ8@h6w5uSRiv#puq{^m6UFC78~GsJ7y~MEiuHs`F!2 zWxYaGlj2pie->>#2C&k6vZjMWRsT~!_eo)Ce}}Yx4>}Fjh%Ao*m4U^t6i`h&ke_Ft z{&SF5YseP+uUi7hqq6Ut6D&sdfB|(D=0`jPwYnV-)xN~`!eSW{UX})nZ`Xesms1^D zNzrhg$?d|=*|svdrw$gJEf(3tE< z+dK(NXe6-Z@9i1Vzxe$k6?bQtU}Dl>e@dCUh76=uNA8%RuCksZcT7{$V~^9-1+m9` zb$0A=vKk$GyhyoXkA>>*EPkLx?wG5-h(2z-iGHf1ydf?b>QEwG>DOHuW+zt9S9`Q2oIi7>Fsebd@j+x@ z@7i=X1HpO<7R_JG)+OcSU8D%B2dg9t&oFx)Yo?HRIvZcAE`(`fLhAcdp>K@U@I+6B z{W=2%zUmsj0;g-)Ep!i|+Dz%LHfuIchc6hpOdzRA;^zbRpG{zMq70kc`DTm-P9S_^Xc~AstX$KSf&ce z6h5RITB$xm9h!!^tcG$#IXRMB)pgRce>klB;gS90VLh%nXhXyL5eLUNhjkaZ%GCzG z4I9>%b{pdT1^)S+I7b7EC|<`6&dAR$vOCq5MXxqrq)8wo>e2%2whqDG}Fio6`_rB?#j{X zOZeVa@qe?5yUQyVi1m&73uhWvZ9GtH8F7+R;2&^o5ud`o#>p?o7F*5cVjW9T zR5>-`(aq>>w;+8EOCHqY1*^>#LKCl20(~22=vh%)C8Hke*;F}%(g6NS(WPED47}hq zf+7YJ)K4t^B(<%Vv>pX^?i^} zii}GNU#-FUP@8qa7!(eXgB-#{t&zC}>S?qO-_NB>gV)a*T&R6(NI&iBX(i*>wTOJW zn>Ae{V~=wD(^oeWson$ALu*!~^XS_PBYKk1n~T$oQJUT?;5&qOgHVgmoQh)@_c2`7k{{9_`_ z`n$O$dI_%Yz6j)KNMnTCHx%mO23aP~3CfVU+^+Q~j8QRKI$N53g}NM8O(J*DdZ34X5`#KHtF8OZyST8`_V zXamc+z8WFoWwtP&Ze>xN$y!M!xt^A(toaN(8b68H*oEh*2dk{qI ziHwd=@B|b}f>j3|f0~#=Z@yliR-13M{zzpcmg+xxf!~(?6qp$kljhipXK*)EKtZV! z2zVrGG4R|F6;6p!B7xPu)hIEYE=Nb720bp&AD4O`m+Bt3s`lk9%a3Q#^Fz*<`p=m^&oOCiDkssP)0k{}JI!Lm90vk7Ir(H1sy;DyDFp4@qq=!)FLYU2 z9i4nV_qOzBWl9{b+Y&eGhn8T;PR~}{<=^ar<(d}m(c2Hjp`blR_*_7xb+sSaj9Y*( zRs9^Gkvm+&{FzmUCo;?owprUzSNkz1EuGDj&bC$#S?yP!(r`$PPUHi@VkbaT)of{W z$(~@b)&f3-$ZBPP1Yj$S%4+`J^+HTS&2hu_k@MzO)S5YOw3lHnXNaNvTVx8;zJAt3 zmr_~T&?zG~O%^xJ+Drt{nd%|tvf9&D9lFE5Cc*46Yjc?RRMsA(=W185HYcySz&lx# z@i3>C5+UbXtOy$xDZQ2Ku062(5TuE?M~v4(&eKB0E>DZdW&M}Uv>|$1HCnYMAU`>R zCc)Y5(9LZ9(WR>Wa!PCUf)VYGci-jcXmx=jA(=TWG6+#wS-=4VN`*q3NmWsciH~JZ z*Y-#G>Q!R#C9JnEQ%J@olDoc*46jJV4HX&weACOdV2Lz5J?c_BiJq0D7v;f+zNJ1g$t|THKW&mMH6i6SnNklsjD>Xm(6k1e5d84 zi&*4UW>Q{cX~B%*T7NS1Ll2lp9) zux0}s6&F~gx5=^{&&+`djL!FVg9ms!Ew2uL=N>GUnh=BdXLKdQnXf-oeh5lT_aOayF;QGRON3x(=0SRxm^#RjRk1 zVV&@JxUvdK;bm)>Ebe!WV)#44`>gdNY=|kGDMLB#w~&ymN_Fr(1`pRg7GuAZH&kF(d_HlAJ-&Q!bh>vm*Us+rMtjH&dwV$IlKHRDh?UHuTa z@g794%)D(iU2EtQ*uZMJ`u+epGNfZw`YtVr^UOF6Gyj`}#|!aLf|~S)$;I^ZDJpC|A-~z3w#Sp80IcUz;lJk9%sDv?;5fW(L#Y`H#T2wTeeVsTuGcEKl0>rtMA3WJRphp%a1(yMyrz8m(7y6QGVpfH%8^f zzUaiKScByp$w$P*rLWyk3+J(8&8N1l9H>ciL<=N1wNxD1)Qfg&E3F}1BGLeXKmp=-3?Aa0ws=b*etDgY_NP_ zVY6y(&)dVI+P~d%Q2QV%gLHRdzICz z6&)K7x1Nu9W0TOxvzinWUoLx8N@^H&QrxM2I;=SET!uNb(zCd@CNgOuFrusBDJiaD zG)nPARsKI0FC8krQHpCA4@mJOl{u_9O04 zTAxQ*Ga_ddGxD(2{is9rN_9TP^@50du8CC^&Xj`I)I33{Qq{-_p_>rxyFT#h<;;0h z8h@Iq(sOI=1R9?q(|gL?@?yPT&jth(M5W$T>J{;=Asg~*jUO$Zb(sVuoDQ1*sMY+~ z?5T%i<^IuXVnaq3nEK;?%ZZpqwejAsiWUDqEq1{hXxoEU+oFrTQcaHm|K`wYhsg(N zPxY|zRF}sJjQjSjp z8#nbBk7|?r?2w;M`T0_QQYfM($j@~7`B(Xw%TLz|encg9*=AX#da25jFIoLR-BN3! z3x`e;&E}rAOiA`m`H?4Iin?kjI~LIGVRzL~8Nof#oPAjkgUxcV=k4=sjUo)=wgoaDOQ1&4-wY+j!n!ftvN1l9XYKJsFdMe+zY?*wyNq*$Xm!Y1O z&v+|^8S0-o)EaXu%)<++P@k&pc?KjU?U`o;Gxgca%pK8L`j(UnSKI8n#*X5oimVrMbaAm}giC$!k+;f5RP$YJ)AC&GIokY(-rilWo;AkTc zSvVTF%J0GbG=k=HEDjo-p3Cky0ijU+n4dqUb0e+zt`)B({VDuE>*UDvjcUt6DTai^ z5%C_4WezlFvqBfL>*D!@nzn!iayHtE!Vkwtd4veawBYreN@3HYTct%YlujE;;Hz~* zi;@OR(oab|jl*(J9X(Fg&2Mlu^_+vZYK%dGNw{;5`})BIHssw*o9?GgO9Qo^pd0mb zDn@?LEtG5%&y{8#`sj`}(3H)#Y?vB7LTp#6jn}~dECvy;#*&E?90zi8AnY12U7`>= zH*jLme^t}<6P&$U?EdfcZXsYsS!B#IMxH^NXtoow4WE1`v`;?ofFm;`Zu!vAo1N7( zcY?EVHVl)2d0KUEz%yw4)5dY1xs9uI9V%IL- z%besLZmjtj(M!4d{UCqm3==Gzidsg3Em zZEL>i)S;Go=ej1_{i&5|9}Pk!Jv>qcsJ`7cg7?6#$UjMxc=1xFwn}~03g!fX8gvB) z2aPdm0ssTqHg#bfaQNni-ql{uWwOpz%tV3pZCNvffcjdy&K2n`!YnPo6}K~n$g`uO z>SV?=JWjRjv7qnduhnejok`MG5Si$95?ZxN^{}#K?}EklhOd2022$cUjOeXZ-5!`iM$!YP~E`Z_jS}VmPtfp=l8Y~od5FXj;@xlDyYG(Vo0*V!7^uF{pp#Spex5QB|f!4o=#{Y^95uR;c&L}Lvlc9B_8B;6O+Y6{RRGIdwoIeEL+M2qf$NgLis$?|- zoO``{aKnB^rD~OILb;qYUXd!ZZPuAVOQwa7`|_by(|cgc+mN|!N3R0+VOl$GzixH1 z4-Cr9TIP^ekM{EU@|UGPf>rg5a8;@@fgb*Y?!o$QVbl&?eeliUCdO7KoEU4*u$(f2 zwGRd>UNGm{vx43S@XqdN50-QUy-!5OJj+=_L<(^jsV{foxL;m;#e^Q}n>wRffJdt}4ZDtUXA3Z1KD6na+eX9HQx~=$dD8%w0 zSEAh#k)C`zX;d5eg=rT?3m_fnXzjq0sJ0g@dx2@&H_R?MTqtvgEA z2O?uu>pRt5|Bg(ju`$%E;i+Zq1qE_Reb*WYqlSHJC*gq9`+}LKS6q|RxD<~XlLJN0guuxZV~j6-QMr0D zmYxy8kgCWf`jNE*%XfsKyM+l8OwzLYn4m(c!4T>Xj{%MIwZa^faE16B?&S{Eet+xM zOd}TR3>7)dRwPwFR=N~5=L<}CE}l!6&bTpPp@Bs0OH`naskURx;YKC z7&Wo`l!FN2YKvKs8TjC;mj0yMw&ja)QS@ZsxIJmkb!8zw`I+F)j`Q%$ zGoI}$R+xX3#L$Za{PLbfG=&){Msj41t1T(Li0Bj{?@4q&j)oc}N3bL#wg+izjm!h zcP(thyEMuDlK49c^rslV7~=$$4D%pA1lFf-U7l{nD+ z2!^aFe8&9Bv)3JXQ}*hMl7!zw2rSRw3ZnVCS-pW1DaHt2`VC8i8MtA?{~*61BKox~ zKP;@^WfcgzLm^oMWq3fOXl~2i{!+6Av)N^G>nP6*IbiTAoE>aXWMi3^A@geXU&aW9 zx=G1xWJ zHWRNF&v9oU@yu2qzh#ZV7yOOtAKhjF?E0}>I-t$q%!1B0=M(4yS4q^Svz=%A0dbxGUs zRFW}XP0@vgsv_B!Q4Qt{{%Prwfo77eMM-Sfbmh=F&m|`kRO=Jzli}{EaSm1*nl_>< zP~Xf)|BIq~0E(XG8`L1r(a#A{@RHs)lpeT==)M-jr<)N+qniZKn*}KP4e-s<)c3Hb ztp+_omCaSIBn+N*N;FC!4Qq7Rfoe>QZ7=06K6Xlf&sH;AV`DwM=w^|zLNA=!<54=V z?(x3pr&y0KNceh>pZ~x2_}>I*tj7kzwrXS8|8#oc7}c=R`#O`l&9BLR!6D!#du zXoAUnV8U^A+J@d1#QGa#h6%|O5ykLJa(fC11x#;?v#v(90?ayxw@RE z@eI-{9eWtGHhinNh#nXCYS2FxyU*=Hfxu5`&UZL9O^MuN188z@A$z&imrzx;K+R9J z*(PqW5NhN1!B|p3|3+Wrq#fQD?v+??0$mAK ze)9OwwM{K-199%11}5Rs!}u%%iHpZYtLgfJ+0`qhrt2W*ntp_< zPzXI(T|g5iLAK^aUqp`PQr*z5rRuvd>aSwHMvE1$8Cf7n3uSn&fdUc@XKu5@e~hCA z*GsWmo-nK@y>Zhcph$8 z+S2XWv2LXM{_QlvbIg6u7HJH6UUFwPBX*NV*F(8IX4|;!=H9M8`P?oXHfW&T`Qn7x zx}|aG3~7G>bvDALw&!y4UY+(3ipTG8COiBUC=?Nx6VC)a#<`|-hJp!A!Mmdbfs;0i zPhyUet_P$FD@Wa$1dx~lZUwQQ(}ST?cz7qw88hD_yy8{#qU)EEe^9k3Zzt%5f)-vrCSS#%2Ix zbr8Ii$+YqK8X|iRAXF$X?dqWsa(GuN!7P|!)NPDwJQW#6ksiVxK;dQ4(NbEb3WM{Ec>cL795?h(?mlugo5hCXth>he*n88+Xv*rDGXU@rKa# zS#ru=!`C4OBV}CbI9l_vUl3W`$;OV&g?PcyYgu%o9`YqDC{Q4v&)r)Vu&Wno@+QR*|$Ki^A}2wU(faKY zbKDIFcoM3(hi|x%qs7qw@(e&&7Mr6SDTJ$JvnHfm?be$o1BJ``W&f-b)$DtkcrqW+ z4b;#Y4zIgwjjKSnebpVIKMGVlhV+L*`l+|zXVNRfiNvPBvwOv5P4*e-D9Fu=5Z7`{ z-JSLn!#yjUhVUlJ&~$7KwAlmuY_mKs>Vi8w`;B(1vAJ7Wz7E~n(La-3h7P=pp(O1o|`!Ai5;GZg|Rxf)YZ(rWw+!kye#zp!LPVD!Osw+q_;3Vh@ z=Xl;XK0~7=pLLC!3(1|^mUp;tuafXuRssASUnwP8qy!uYDbwwKV!PdeL+hcNvZgBs zq$!FfJjA0fYuRc!=5KioTDTVXIfF))djBP+JKLr{;ct`{-p1&nj@pYpT=_rgK_o$xes)9xgyE0nyPIFJg!+zB^u> zs9yZ4_2w)Nu8}~Y_uci3_oN@J3_x2S6)37(SUD{@$zp~d!K zO}~-sOW2rF9d=+%O6`ulWHkD_gh|4t_9|{&%^wzj1>LdT?7t;Y3zg2^=!q|t{K>`s z^P4Inp(5DdN9(>yF`SKK!=qpqMzb_tpMRlwlz zQv0nDlkXBKH@%4a%u{jPeGefuBjK~9K5NvQ<`ztTs?czyB{cFBChwU=xyObxVFTTe zO+#Z^$)w4c%3xZ<>Pxvnmiqi;Mpi{fc4@(A8QElOWRqoNuNgM7MVzm`GZ%7y%7S&j zl(N*b)m@)XYG^i|(@VOskq(YT{?nGw)g?piJ-*_C(BcGN3M0LU$VWz!iJP!6ccm|Z z(XNKq=-4ac{i+^sE*0VA3$Zf5c&pfWyX$|lE42f zJvSIgxzy#L;4InbS3lfCflXJLBL+oJlSJ15&G|>uG=h9qncQPAP=`+!!KB!VjETPA zJ`(arZhK*FO_N)VsYKyf%hmKWRt!XC0vfeQz5p9rv!zSiPU0i9GIU3zX=MGj)yZ(5 ze!+m{?Q?HxnT=2Mubit+^Bh|~^4i(%O-Xf|MRa8IcQuXVbM%sc2b7_n|AQPB7gDlI zl&lKD8JvzU2-qV0Fd6a7iWsm93BdvKeXsd>S5A0#x*J$*{f-&3~Y^|5jO=~ISKKO`J5`;m0)Hv2-E^YFy6uv{45 z{b%~82l~^EGeXq~o_AK9re_sqg`M*tWg$y65ihqIm14eF!JI7Hm*cNkZ>cDAfdGop zBXItx$q9>c`=V27DbL82wD-kf?AiJBK(3@J{zk8)KQp$%o_&$OG4`xnPydiTYoCmt zb2*#V*Jf}ctXnxoeYw#BYtvvw8XjI#sa~BTH`cc@aDf2>cQ3`PR;cGK2>&|oO`zh?;C$?-HuVr-wPr=f3b7`P&asS2EwOZtjvVQ;)}*E-NI)NLA<@Yi#ebxD^C zO4e%b-~vXAtZPgD7*1IKvh#x!za2x60YhKSaQ=tHML1RUv(*63ryxzbkcK>zqGZNQNp!C6t z?yhE;Bh4a)OX&ynInz{Kyash*9Lj2YWY^Ymc}5FGzG{3oVe@XkY3e57CJ8EeMXAq z5LAW=!Lxjs*O)-yxBjcSo`?_JE%c2AtBoQll<}_<6oFvBRx*%sH6;J{xVHb54?_U# zz63x-GcExXFmeTk;rTj@i!2xufiWQpK&me3@j0U9fwZJ;uKl8va&;y5gUB3zC{X0C zvyKSOU9S<(`TAOk$`R+&lLX_ta?u|xh1lAw_}r~?yk;>(CdAI4+r$`w4OOZBQ#3yy zFT38BQ4zhgjL?jE;S1Wlof>7(km7JG^xuC2xe7{-u3F%LNgycIP|Jj5ep(vhKYec( z_*fcLTX(toNOS5kG3UE~?`L(jokGkVDfg$S9E%4U{!nEy)#2k-3w?=8K=V#lC!US( z>%%+-^SkB=s@4Akcf;j8`_rJg^YqSr{0(1)5cPfCM?T!^OZRrSJC^pA`)#k+8Dhmr|Q z{j6vni`S;LQ8gc3k~Om)j>5_;_zCdC4m13vN-%%)_t+Yer_?2;Yofye-_%_%!eq@6 zNivqmRr8jV5f#MC@6 zJu~is>x~ne?6|nVwSIM$sFfM#S^XBeIo6*RC3LgU%nDwMMT%Wbqh&;T#=>eKhDW_@<7D9}RFuiqD{?LguFaAdrAuA5C8yf|V1l%28mEmm z_<8qNTDFP7&-_&kB0CF%pSa!8FoU1E-^#+1lL_;LD9R7#uUu|lu>uuq5^d}6u9t|I z;!%7IqakK}X}oJMWL;Po!a^3xq(>D^pugVZ>sMPY=FeGnJtUjOE<3y)Se7oWJNOJ$ zc0JBdOo?C&!^c^Xgmw(9bfTtd97c5DNa2J<)~IbSW}C)w#>l?*0?%USn)Ag((uHO+ zTbIS=til%>ZpaRvMOEa}?$A=nxO`gOI>I1dXs&dI^I~Q4dZiStErRnf0z*^vE6Q1g zMygw%mZ1@B3bO6%mU?&`!0Ky~bj}u-v{3$_fE?R^F^++(+ovt!AU?KP*3cSb3TiV} zX6Ui>C!CXy8U8C&CHE|h0Y@M;5=9m&iCp*2Q>+v1?cjRs4ZA{Q1OW?`C^{;`-3={Y zjCUIC)&C-`KG5wO6S|Aez&{-znHAyUw@~2}Y*& z#E%i+%FD5!JgvaUSP9b$L`+Q+W9K*1RJkEX8hY zOs1}P+9j5SExZr1fL0(?fXm?}bf>+vvP?ZUUfPt+%1kdX28_ok@O01-e$qM@1O0ay z8@|?x-zuvWfBFrr(2hFhWil9da4_l(CW9WO*=5{AdfYRkM_4C+t+`jT^F_)j>7Oon{8asp1tcvuW@=#tVqXC*9c?`+R{E_;-1v) zey1-Xe9Y$veAu~H1BYl*e~XrZ%?eqFxxRPwEP~bGvHp`HRy12u+x!X7+3P;AH(`<~Awy!~iaq$x#I+~my;RobUxDSkWxD%j|aSPnAbleKgv z2AY#WilE^0np0bR(-sIv@VP1s8z0lRQJ6v@yR#M-1{;lv~3~u8;S_pY3M4mk=U439R7^S@pzB; zN7tPw5N7<*x|S=#_?v8Wg&l*17(}lfUB##nXXw@s^(GSCI#}LEaB65I3S+Ck$s2iY zdUI!@vy_o@&>Q7zV=T4`m$08OF-&!C$?ztk)%g-t=Eoal8&XAbL#F6q*=QOk|8xulz;mpzV zm61yRiR%&rCvI6j9+~7VWd20zC$n=J*(G!Gym;2LC2Pv^)5)4b);Gv%WwdhDwM=Vt zH_o%0{dKhmY>O9(3y`g`v#OnwDoWN!P~heaOj|29s*EOSpmNrqok!9?xz_!OkExm!`T?{)u*2d0aH3rgjHFC+4q&d?J5?AVP! zKs`_^Gbu3u65En(!etaAakS4Y135V&s}w^mM`N5jCz3c|W-yIn_QK!>nnx6P(^id9 zEm-kbXQ9WuDbkb{)=$}4t;iKQr|mmMfNGaTb6hZ zu5p=L9_owOieNnre|6X@oq^h{1S7MqU>Z@R97Om-xKeObujS~~jAP|TwT~BWQk>#} zEL-8#t{XYz!yzrNStLqm*&Jt<(WYeZISz--_3kyN&h^Ms=bE9FGgD@nZQ*E_v1FP> z{nyb}s$RT%XnK=u;j!p8S<_3UC?8o9n>B1=L7Bw262^}zeJm4LlZh`Y7)mgduW??T zUxDW<&n`n&n@7)B%hGmd{xlnJ=59n?#)!~$_O|3H;v;B|v!Qw2RIt`LGQLK_AMACt zSvJ43exGp~hDSo7sCT)LVf--DdChJ1X@!m!)JRd)SiqgEGrT4l7)h1_Acu}a`z#Ir z&I|hRx{+mr$<|gYMl=@Kdv&RS%0l0?Qsuyq6ubL6g28h0h@NYAd}87oFH?6qOAMqS z+^m`CK6NI%j3taU0{G~Vw}IO3DYVS}z?Nc;NmgBG`kCBS{zQ01xm#o(l>lj=tct}q z^{%05aM;33RZnrCe_&0nr@i+40&jn93al@*Voo#`!6RhTcGG{EqH=YM#u~C@XGYVl zooRjj0SrF9Gh>KeSraNT6`Aniu=C-zLZp@9OXDTQ*9RZ#{i22`s@zkRC>(m4UO30YBsbm=A?DG#(?LGam{lat&aAH^<6hR}Z! z`9=0t!cges@1@4pISrC%ADnHNPF98Pw4(;A;q8`v6LOA41MTmfdhf)s7w}Fn7YHl& z8#~NOr(iBg)>Q`nqLwr>pv=4brG8^XAmS3Gns9}xS^`g|**J|8Cxhivsg6aJh zNvp9qj^OscsGtZ$eVwx)Y56%QR-C0HRvDSrM>ikWrL6h5AZdj&{K0VLin21z1LS@l zs}4QFIj0fe@)SAex-MnO1!^;FE02O7+5GQG>sEGfn&ZbRFgVM9T42zN7sJ6KzpD{n z<%9DKagv5?JO}T?ovzeYGzLHtJH>iUTkBoS)D$dqu1j0vEXZ1s)P`YR*wI)c5>Ppm z5ucZ-5f)0>^@3mt7Nm^SR^P1DOqaTa5ewfE`1Dr)Y=Q^)Cy=lFTQjz@TEZTI^9>jiPU=+|&i;qBq-(Ck z}?rRn!+Rq6!vEzg7goGSGyS>sT!u0mq@b zyG2QpX3Allh}i+|KewUA$1%t9Juk1f!01_fhWmAlL(l--b*^+p_zn_vuV>B2G9Ka6 zv_fAvRrhu?3!%C?>Jw&(diAGT%BmeJaa3=!7o^`Pg31S)t(to2gym`@F)j>N)%99gTdII*M$kzb5YqP)^ z-WZmT$Lm^|$T3{gO0e*b=rYl|TXb?fmn81WJ0Is7J}hcgi_`EM$Hn{@UAG*~Ws_yd z(Oi9^oFwjs^?cWk=EA#&`!EH5upjRHchTCi_I1Xpw{0H?`;`r&lviW56_ zcY`KKP!(@;20`pGdo!NI^A$d`U_93hdwXJ+KuOOWL0t}UVa=u*&)dekX2o&wqIsBzzsA47WPg=oDj@I(? z{x0~l@WneUJ~(0FYx_gadr_Q0lLULP<3fBaGT+873sfD)R8UQ!*}B$*+4}0K=;57% zP2BLJev;ebV9i4iu)(cexSU3r6oyrwMqiwc5~wS}&!c{L#CVpOKo%LCW*#e7d)SFs z=^il;5`C}YDE+3}1rZMl2hUzF6XL+;Qy1*xmb|l*HLUHzd}<0Z=}`X zR4^?%+83DPbXKXql8g(g#f!rAc@Zl%)mlfa!Rxyp1jx|AEc&^49Hr&1;Ln~w@afs@ zpNM+N#s1T0+~^-Y;|jmKtV(@xzg~-5@eco2Q)g?kH#R&&_8C`zugcid{*$0WkBd7g#GROtsI9n+Z{YiY{9CH zzrlt^`F&(Hzm1QG6_&aTNl0m^L5ktf?B~Cdn$kj{XL%P7{>)7op1&Ie3RmKo7tly$ zRf4c(MP8K7N&Dtn?K3;Nh|yy+8zddpbFQo9L_#oB&s*@3`}OYz{riCa6;HvzM;_+4 z@sUUQRlh|{KvQH4_#*}QBQ6~|mi6VDAuW>D2!Oi$sm7?LVmr>_F04B-)kw@=nBdR0 z8Wnj_`pGTwTmH!2Zm8pdZF^(BuF9Vlc~M}f6j9U&HArto-*&Usw{Gv(Qex2kn=%N)+G=|FY>n6&=zK!fZ$j+ZcUd* zbd2z4E&^TKgE4>Rzy2xtv>p)NPldG`Q{}-EvFIn<@@*d1Uz9??rF$>qhR#+d!SBq% z;y`m2(Mm5{#^tCsVxw&)X*X(R`eUMS&gJv%^7$w7nclvcEdlmmF-aIbIO(Vu+t%l6 zAMm0B{N?k~jU*kDjb9_LhTiyW}aoqWihy3PG zmh~so`jesm#1J`n1B}=&X;EO3pT>!#2h7Yktvyj*X*MpqwjxLiUli#7`>DxqO7a+J zDM$rUPp^fhk88^cCt;j-h^TEEsNbqjj8@yX2LBUrgh?pMP(A{{- zc;*cmkKB_@&dXsuNMwR9L#B-8E7G!E|t(ji~J)+r2e zOHvVPQ2lH*L(u~_*T26;_Ha5df~Fs&2KJgKOPzm!7@sa(AUuRHpQomUnARu$Q# zVv(^35{a&d?0&M$`R?0{{1|1{ zlCmX9sD^~59gX)V$p}j4-VD!-^?66A>{p@L*@6BuR;AR%RDjL4+fV_pW4~g&z1ZZGrri>4n8|b+Kob zQ+#U4^;xwnoB39AJ|ss!;k6`$CPudzFKb+9W%02m&3=a_W!jSg zivA!Uxqpj`Y36YMicf|x=>vT!iHI?CCin`>UO_}49v~gM`QJ|@O0ET|m56t8VtX@9 z+vD}nJ6-?ED;oZr<=kof_n3x%ZPbP1eZrygk1SX<-#@}!Rg9y6AB2f{pi+KB!vr^9 zRV)SpxF*l@pU>B5q=+QLy?)S&6oC;Qi=f)f3+k*rk)+rW2G(l}|2IAqftMigTED4j zs6M#?N#WGhe`duB@p3gpYFN$#7rS4|TwAWF0{YIt$we8)4JRU80u)hOpss0!p zn1#c3l4kbsy!@l}Czam7dwFxe1iNxfb5t)^v>rCg?)G#T=ZR^>>#{=-jxG(Z9Zw)7 zI7@5gEU8q7skKW~;3Pse9#Up#2!2B!Nui=FZnx51ni&#Y43|+QSfGqo>S{lw%%}cy ztgHS^_olt>O)ld2uv46~Jlj|HVkIOD^!GzWXTCg0gX&zaLOHMc*um;LE+E#|z0xim z{LbrI$_N$Alq1&NAR3JjPhHRPcUVK(|D+pooA>B6wA({OUk}6QnmhIkw8LiEJ$qJu$bm#qA7dAK4mhB30U{7_F5g^E z4>4zv<*zoLkjZpf?ZYu9Rx`e&(1rm(Em>-6|Lj3~=;{P%La1N|5JZ{ZeQQN zi3j`M(-fYOjTLJ$$ESm{aslIiYP&mV_s|`QA|j55mKI#$Kc~{%9{M4X4aAasDf%a0 zO1z{{=6A*Ue8CmQ2aC}Q#eJ#nt@wOI&6rJNqItxTR9&gyKng8lc2woQxA!C&s-htZ zax8M@JEiK@_vLh#qy21Q#6t^Jl~o#R6sEc95*!(^&n!T!s)0{HsMO}w*A<-Mza}z$y?P%-1k#R6i;$Z2hlwKC5bt^io5IOB!x)B%}{BAXOH`y*LlYmZzOV+ zJMagdeNI@+pV26Q^=lOf0BB(D`k(S$G|>cH@Ww``9t#=Ab)jnsplI=|KgR^KC;@LJ z$JNc!6q%1+zcAmp(ks=1pXreUmtQD)UTwKv*DS|Y_v>Cw^G$4NtcDy?$JSXQVq>Iw z|2_)rh$>=Ks{N=SRO7m7E6Elvz{e`}nj|k_#fbb%ll2RUVH6E6E%Y#4^+{%WQTR&}Zm~=4t&NdL>1I-s(=lVFe;jwk z=@QUWm_~^Z}Txad9`o87tgs@x3zAmWEJx zwxIJ>=xU^vtG}*gl2CNR<2JsAGZ6Xz2`(@fyo4kQu6J zjf^Q|hc`4oE^d&;t6*S~JlQ}gbUUPN;Mfa~ zRX?YNQO)r?c?@I={u#I8{zr|r0>=BsFY6b2X7jz;0bmV$nre>SV9ikwTnsL253G;W zF*>z#qw3N@ZwKRdy?O*HFg~8_(nJ}wLi7EWzb2I{kZ#sOtC({-wYqOx;bd%k;^Vym zh{B&bg(=e-YLtZ{&QE%L`3nimOl;1ZdW+DGKNHMB23cPGqj-_VW9>*bM^E_AxfpM? zJ><);?mN-)aZ+e{vgIUDEJ-mVjhbb&iIc#XiN=k%8hWqG$2OVQl_i^{MyC2Vb@8dT z*bL0$_oDO2@ru(V<`Jh!9l+GsJ&c#~Y?z`x^6)pjGJ&pb}dYtHQ%K9Qv|k)<+` zr9%^`Aq3`Al%r#;+Dqjz{eK>h4~3vrQ9+lro!#}H$kY|3 zc@l3Yl7Iw_8~>Qhby0>V@s4Opij|V-N%Tik`XAMKvOI~aqbVO*DdRnfYoaL!tdwj| zVqG+4iW98J03N-6XtJ{nEA%SxHc?Hf&5W~CH+ z5}%5uR9Y$XJ&DgoQ|3xa>~;urXUX*_dWIspsKE-YyTE*wu`o_AFoonJ>e30!AYQ+T z;$3;L0(?-`ssJFYW*m(TsAIokR<+~>61K3bLh=YkIY#pIlc%;{?T+S&7$Yjx7G5y; z3%n}zfMANnu`cmfK3FA=t4HD`PODTKo5sOADF(5$*-~&1cBt)L=)m%D#abX5ffh3)bW^$a? zez){-t*zeb_t)E(w=EB`NG8EN&_V)K6CoN9^^AiUM3aCq^Z%`V&P)=dkNf|=zb%=4 z_H*sM*Is+=wbx!tSiL^v?ICnFjfHNdwrQNc)@DoVlIz0S5ia+rSnf9lqDQ;jm&c-O ziT3StSp~+xo4eejV~M{SD3j%KBN8(kerzB*$K_rai}nsgPjtDjRMD^%D~Ggjoy&bi zEM@jUf$LrF#j)r~1JSuI_mWujsDbDkTyD;F07LcB34=Q@$>lDIrMydu)vp^}?t5d= z2L__Q>~dpd-mGWmK=f1@WO*rPV54zJ_0wDovJ^;k8IKGUD2$CW(cc}2o*f%!qL&Ut z&x;Ku(KClse@|>QN%@jW8G)YYbr_&rWE6_j(b)8)g%{sd0baF~5rFp(uY-(>;^L)| zwBWp!igT$OaT9w-O(G)Ck0Rrz72u5h`F=~GDV9#M)o&nJ>S z7;kUiOffseJ%Aa-)dr%QSlEd$KNg-Gm@_#Rz9lf{7VtG7?&lH%n(nKjHn=K#R}?L& z&9GTlLzj^FC3r_h|0qovzx{bM8ePBHc$Qy|Qxu-H8FBMVQZk^jKr@H3Ac);@xMD5q zZ%a93@C8ZtTQSSb7-vD!8Y|{bGiGu@(&JXlt!B(E1xY`$VkSt;0C_;`34R9^T;2t- z8uA}eG~x36M-+|FFuhgO_mZLwa!kyN&ShO-D$5v6H6~xpbHT>&MmaO?P}0)R)BtnA zA|_YmfKJtY#_yhxZo|N7i;VvyjLfDmJd;v^+i5@lWocHcx|0Y>z9c0r%HmZ87jalh zGrl3=@MB~}xPaVKSH;}JMSt6P_ZsABXajdGbZa23=ua7~#HDowXR(K6#^Ux^ag$vX zlzd>{^Ta8#5S(?3%PLOv|5DL{l-Dm(Z;*LR^B+v3x7T=!UpZsp;tzVj_;#j%MrYw;i{uOhqK!~ncRAXQ8<_z+`#qqXWp)XEgn(3s3knmg`SQ6 zf@mU@6vMA0u{N%{53o5CaFKsgpmH_SyVRX>A2@|ZKqQF-y~mxh%2(Txcc`aFKOc0w zC~_HQ1)C)<2xVtyr+q$FwBDoqZV)P4q6JX;SKWO4TziR?jc2 z0?(-EtXTA;R`hccy~du&99whnZ7W3xhHFh~EQP&l(Lf`MRrBN2HiJjxe5;JO2y?m3 zMu6%XD|)#^4>UrGQ&lxBtzN8WtysrsRY%S3WhlNitc!d!bbW}Bq-fB5>!ySYIGyy4L%~MB~|{lPrl5ya9PHeZ{O_T zBc~*px_78#x%QW@=hT zaByOwJ^v+v!<+JQ)=sWG=d3XwYZ^gvTT-G?sC#^ahLqX35yb{3_gQ}ZCB~P@1LcY2 zlr$;|Pb)U#N+L_6e-uPA-hitMs34SiU}@v~b_u(KNI&+MLua}x@F z+Roebk3}{HQddLYDg+%svdh-I1%E;QW)u zd>#quE5;z*NJha&UrLjVVo_EJ8Ac%FL6{zMUx&jVLk4{`QbG}e%JL14z~+OK?i92R z^w_JZs{%#MC6$8-owD(RtZP{$l(U`}P*k z0L|)(7Gmp8wh{P{1if1N5dWwc{PEbpM=@6{^CqsWe6Y8gyF#u2FF{e4@`=6&)q|>q zeX;LQrX22HkG`M~M({e$N0`!s68#a`km${~rYpAP0e#M9zE+A*vs8aX!BfixBAP}u7{KZp*K=a_%iIwH% zAdOX`&Jog_<}wbWixJH;UgJmY(7tj8Zj?S(X;DcY2*>Xw5!&yocla7J(PyMW?+eAo zPb8k{j7_3?Z#b&*oUCvU4uT8eAuC@1fI@tW(oDG}^|ORj<171B&MS1asvl>~4KFs{ zIWIS3(-b^08p3)572-9U+^MR0-q4!CBc^P9S9IP0E~O5}B|a(u$V4nY25>3$Z{gCg z3vg)|N4UYb1e2h6QZYj(qO^BBoa-MriPHkaLcvY<=otpLj{a(OQ=Kfv?7h=r6W4r~ zVxl<{ow6E#BPGUk;9?4RI~14Lqzb6ro~#HKCQnjkvy{2mE%g1RQafXv&1+h>5*2UP}W>ko{|Y1 zpieS)SP`br?j^3u1x_)wVa#RAK?JjP8b*RiDG4q_hCTQ?4DzW|pbrX)#A0Ie>;Hm1907^4-Y=5fZA^Yb&y6a zhyX{m2un_jEvm6`56`m&iqnlvwAVey>4;T4AR5Q#aw^Yz}h z0YALIByhz>`yG)JdR=_7gdh!?ED`$~|5+}?J?P&olUC@`7u?^|epPej@uaS3v@(>K zi2_!MQN%qG(~vrT&eFp0I;LllSpWr}#m2*T$W5PVMW1sJdc}Ka$BllC)alaatQK{? z35isglt6u`AAU-&sLwfm<JQ*Q&&tXmrE!L3QMp2@5DHY!CSsEKR(yu{*MO36At>rS?I6g%JX3lvU??@I1xqWNZGgxKMFhHIM^~a(5nv74bdIAU8`y&_+nQJTvJ1t zo>^9KiTCOztzwQ$TUMkI@%jmMFh`0zXvSpwKqi;!a-;Xq^0=yU zl$)m$29KyJsK;E@yc*|OrnM#fW_6rVlp*8^Tge@wI3~=(zP~xplgnq+37x z=BpT*;mR1($>LZj#ICBhu--XXDm-Q>GXu`Zum_WZ>!T5S@Zp4l{;hvn#(T~~ ztJosqPekxbBZn7b^+WJT&3T95rh{v(?JH1>g<@xLt3wVEuLgY;%tqkqKuTGDrU&8f zs5Pq_@G3tSG}DLEr@TYOW%-wQ=ISa#ig7LKLXjk67eAa?^5;0cHy67L*SOFuH7=!) z8V1kRdJ59-vV80g8=s(_7)duCF$=EZtCaJ=RxH+hMJR?()@)gRfj6Tpe=5oWBb91t zs*I{EY#0kcyfiXZ_M1vzQ6R=H^&lm%4~b#IndL+@=H-E`R&_+;=Jy4EnMF~#`m_&P zB1OI4Phx8XX@YynBIBbI*5ZcFQq*0Dt|}Ci>upr%1Z`!DV(a*21;2~d$o3O_RO-fx zyUO8lySdmr31=o`(mULJ<09jA>&r9JUAV}d5-aeySs=f%Q957Quau5PyOY$aKxk%s zJqC<-Ok}uw7*WN>Fvta*vK%NuF}0J&bOt;ao-=hEE~GT3Xvrvn@ak=bi=SeB*FDgE zBO?hw^}FxayL#GVG$^*avU{lQmAf->@JMfx#-|iU@?zv?{bD1l!0IOl-cO_|20zuO zIRYDSY-o6S zhQ_Mnh~DB(So3tHFg?pHD73%HWF-d1F*6ohBcOF`_{X4`aCuad*MMDcS~U5IZ*Y^b zj`L_ZR=u3&5B<{|Rv#4)&@&4!W(ag`##DY{c=4%hx&Itq_?~sL;z18q8+bejI}-Cv z?9lw%Y1X~TO44Ut$Z*9mOso3g;3{0k-lD!+WxLgXS4C1rG|8y^2CFdZR&fRJbgx9TW7Q>|F&sy!tG#QY9mOs}KeuOglvzB`z z`XUz^cLBcxNaIYA1@<nX@h|c6!_D&ftAv*yym%uhl>|}><7@b6>7X_IH%QH?^$MllMZ~uzIgu7RR3aOkdZl?Q@ED7Y_z1%ZtP)=RtBpb@S z*cV|;%mFe9lhCG%5T@k8okE7j%Sthg$x%DM#GSM%IP;gmdqq2Pqq8#9&fXIl9-O&X zzLP6M=lIrkHv2*?q4ym2GiEvOYoc9c(Exc%R$L-h*nYt%2v^E0Ryh~Etazu^GX1u) zg4>06iVE-a5G`#L-l@)k$`+CEPAzaahd@hsh7~U>t|(Rtt_ay(yi~@ZQgMFEn`N>$ zIyM=EF~Yi0jH+|%SJW4ovd|d!9pQs+7|1BB(4dUU3pR#P5UzOfc`Q40`~|VLQ-q3T z1=Z>BYrM3s#V65-br{4!cp^tY#Y^#m+c+#r`P{~ENx*|s{eX+R4i?=SW+{u+;NY|p z2khnoZy)bk#H!yl`bHOqBg%LzgmWVR_%yoFm3yYO-{?W&B2EfHQfo`J1UgDEmag1* zZo1{~aaqf5F;}N&oTqAro2 zL`OaYCZHdR_%=_q>b*=czvhnr+a<#Oa;-&4l*cF_>dM(&#m0#~dS)tw9@KUoVBSr2 zeoshVo?;U3De48bKOjKnN0_>zQzh;tCPz;WtvXO*9uRPSy1ZU+?$0K z`8qRSl5=lysMB839dddS)9SlJ4o^~sV6eQoA>@=$f`s4_UsgR2i76>EH|VW<)%pDm z&$xouJ);T^d(v<-e_4iYHKZjy!&b--1+(Otlg(ydmA!xEvdVJ=6Fj5UZz2WudoRhb zRfu01UlZ#rqfmt{+)OX-*wT0O1TVJpr}UmhvGOs&1Rk&VarNF>vR5E^ZieSNZD&jN z>!A~l=N#yb?{_}ulpn`)nevnPTo%B-{#+t|-_U-yqL;gKUuP{7t^IDvCwx%BM7=5d zK6XT35jt)1V=;VcNv5aZz9UxBKWspUem_`QA%l^H7s; zz#PN_<{%zOWD@MY17;@OF)uE{FVF`@|(t(gZ?t)pua#)2@1LkD~}6a zFUx(Eyy4n%$(#GC4$zWdy7+EeWx81lh%JCZlN&;Dx>tzyG9F{rx#cq z{p6qS1>iHW7wgGh)sr_a(i63izt9u2AOB1@n(`Xb4m{78+e~z_Rp?>`19MJ;E-Uob z&<76Ri3Gh)mQ6BiR@+H1wvrMBMI{ASS$Mqh%7#d_<@GRzkCzwXIq24sdt6}-VL zye=cl@{o~bCS_!qTfMdN1mg_ylbPJ!;J1E{C?ZLC3dX`8hbxSrAfJem75-mN#BzWNrcgx$-L>xbhpp z6K(bmB4@_0{1_s+@0+}cyFBjn@XbZVY#ie-<5g1P5+QFkHW1x7pNH-nx4$OTJxi|p zHuBn;>ppeqR%8si?mNbi3%&Y_@!o>C6sPjk<6zdnDT=Kh_Kw|uG~%617>)pzyU}#r z&N(|8DBx;A^D}z3H5L4c$x^YEjpmBlhjD%AAt#W|5zUKyij@THMvo~@$}iBWMl(OU z^8Xr~DR0q{0YrIBoM*guk1)4NESyZ9yjtasByKd(^l+iBT#I? zSjX;@YxvazEi_%&g5e{3 z)8Z$Sne%0m%-feT90r-v5N@ayYbMtTdEM~J8Hmd82ET<7D+^$vG9BBvk1UD3ATgpL zrP>-^K|1%va+_VgUr^T=u&OzZ=br)ZC$2?7Oi_4yxiYwCl9~!^wO>X#kv;7P?0nOp z=5^BEXMCgQqwR1Er`d{W!);pC`^3!=N33Vpy&ry)k3}Vz*pSO;cPbn?7u(7{oaTRt zwD`PwS5prrKVYB_vu1yQ`GO}K7Rz|Zn|P6$r9@_0J-Gx4=HT}|k%`5{gCPEP ztQv2Ikr%H5A>~@$$Exe}`6pwR_Xg23HuTsOrOOm~3s4*=V5-!6h7>kZ<{bu*H*I3e zuB(aZsLx+9dZU==n-09?8?H9$7s0=ciY%q*E5;7>A&&qiDaLN^ zncL6OhjYh2+=VaR<@gt)*Ya%9dP2z5LJy53LEU{QSGy7s><|PMa7kyRea@W{$ENGy%SloK)9qyzsun}m$cRHPAUzq=)^E3mULMasD!L@ z8lwfK6`8oh04&T?H^jjb!bwcEuo=GdN!p{oCJ=PoR#2}!`a6PpgLoxBv=xURZ8fu# zjA}=|_^*>wKjvx*=aO1bxA|SsFTuTF(aD0(wC`~Ok48MkITyV-V6DH%q!O~<4p=~it=dg-=&p< zRx1@-T9ggneX-TqXdM5p%@#Yj%e@7Be;+h7lO5tl2KPpO6RVS1w_>6gQ^LHY+cJ1X zW*Ilp0xNO}xepmR>O)rKFa8XIHbnlF)htW0*yx2vvzDaPj%i4n@#$9?cw1y+H{)LU8VfN%G7F`KhK!pa(oT(eEnCI-L4S6|-^VvC$ zNW$EjlxbO>bJM=&xpCS$&-iH@JtGYdtytb?KYXb_8WwAbjmZhZ*J+J&!R{9Pl?aS(yDe4s*ZZc_=aajzFaxHg1rBo5ccuIl@lCMWYf-so11Y0U4-*y zW4TD(BM(p@;v1gz$Ap?!Bg=foV$Xb^G2Bxq^?zAfy4q(XdoEG+3*^PdLzIi$$O}yQ zy*5}R?<`MC?SC-CwG#f{#l}zNH@VpOH-1ZNn(}I^n$g~}v)O3=F<@&Ib`0lM%*gVb zuZnsvnL0!BKLexc@F{xmcU6s(ER43^|6Gh~*w8sI|tWQlA`} znrL%lQOTXMX0=K!kEiCEh~*x>G?<B9&Jem)Gc z=}Z9c1DtHd^FYyvyk@-A@*9{pM*VfjUoMc*7Vitp%;ZZK4YmR77l;>@x&`;&?PT*dE^7=5jd>ZXL-v2^^uQ@R=Oc;pc zeZFQ#;4a6Cdg(!2R5%o}LYDoIjtS(f6R!oiV@Udn@KIP*Rn>~{BF^kWMb`cA@EIhN?(bOgSY$#3ie?rHs(ZxsuI+o{Twx8y&vtw3f$Cw=IDKY+qod*Tn$mkN|I)aT3 z$_b%qPqEo3$E}~GQS;3iunX_5(BD~Rj;ncCa28{m`n_@8^-j;I?xM^DPbTl;8Yx@q zd#@+_Br8U*$F2xNlZo!(@63eH!c`=6*K_;wAM~GcC?Lpb-t9DWvY=T}`l5(GvO}K5 zO8(%vb-JL6=gNYR_v;*++D{+5;_c3kq=|=lTDmXk;d>%j46vtwwi|JlW{- zIOS+wL8$cuUX_Tkn>K8Z+B!%|Z0`i(j?vs6MmyT(@+2KMCYi>BWHm#dch_fnE@Aw$ zJZbJMLo;K!FYufv9o==Av2bE{U6u!RduQrWK#Sq=6cdlH zG4VJZJm$jB>2um6;|1OXUuQpJLF^A)YJGm5Rv+n-ELnY03;R8*AxqhCM))1Vm9V6} z!?n3t{C(uU*r_x>BFOQ@SGw#qq2oz;&dTGR(FEH~Y({{U<=c`ak_akTopqeEdpl_D zY+uTTMCxk(@@BxddNoPTc6<9$SL8OScV?Ea^BnB$qKEHWiF4J1dfm_0$Z5G6m2oE|?) zPe2>S*O?-9Tp`6%rTCTOM@2^I$=P+L&^y%(0ytg?8LO3^l=hjf_NyXE9Wz}WSFMU` zeK3N(37(O@+J1gFjy4+Z5Dw!SmIm*&UsNCC)rYxhEWvbb78gIE{1LCLg_H4MnyPo~ z<};BLJ^d9A5gg_bV=NKXGUQxh=V>6_l`{GvHX{5G2~$TA8%Mgufpjq4r#p_n-B}Dp zdnmP|J+C|bTfi?V)3*%Qb~ZlWRn9K?5Y&?`xF;lDJn)!%$g}3H_LqfZz1;}~5Q>&C ztGj4;rgxmZIWRxnf9SzvZhr{b4=s>*k0JF1mN<8PL_f;1dl3ZeY%B|G8NSSusu%~T z-f)0%+e~75lOi?gk!&J5+7x}gnka2&53u8V1-C2g8kMKTjmRn)yUFnzf3Ey9v864w zP0%XX(pK~a1Co!ss;jomUZ@^wj15z^2U8J1dQu=y`??G9I4AzJ+zMM#OvE1k{Q0CK`< z-Q}Bp3eA3-XQt48?(>|MWeb)ZbB`TLNDvZ(%Bf@J*UqDUc#V4f0mC;z74$ve+$+T* zc%|PP!0Qs>3(Yeq>o$>f5pwJdvnA6Dhd)S&dXf4g^3PL`|h zRJsu8VMixTWv@KCqVEa0@5p@O?M^eMW5p*=@F7&5JhRCoF>(=-+J3s-c za&{%J5#>PZGTz{CX}x<`bYvCAEPnM&!o5gm>tDObf2NUkxW4vgm;&Lv3;?t>*OzIR z&dzc0clv6Eir&7dc#GmxKFd+IRMsX`h9p z8RuE;J<491v5WR;`)wlMxRxdx$+mccKzCu&WBj!VcL@wPsDL!R^cH_h(p{7&o*@1B zSXDQ?5F!dcCM}76AUYcaKvi!L8yjImscT~4nlB&wi3|03CzXYV_SGq<@VDT#- zYs(F4K2NP}WDW7}FZ?@3d<(zt65l|$l{`Jve@{+2&4%nm9p+yHQDdcfB43xtBjkUN zyp4pZbNR<*+KA``LB8qoNAq3I%Bwsf;YnRHxOS`C{Zt_%+cIhGG~S=K$Q7K8vHb&l zDaEO3`4QTfV79Ti9groiu1qUAw0kur%d~xmXgD)s0sRT7(t$Vmcbe%NX}eZ+{rJb) zqrx#reS;=r;V9vHd#(9Dn)+!LP4PSBaWn5h2EUbN_tR|Y8}uT&8%J|e zE3x~|)03sDzb~ll-)Sb-;+%B;HZtXBCQ-6^Hq}jkigfaRP^Oi(^ZN?JTuZo%oSpm< zUfRzuh+oRGSlc7bQN`Mb1kUpB9Vx|WgCFL1=|29E@iNv=2mcUQ%4$-xed*W=1xbtTJtDv#f-!a?K}Vz%&FzHm&LtP)>#}m;?^?yjfW%3x@({Zvl@Fzj&5p zRtodDzI8;IcAmOEI$EZk=JzahZveC3sMGi3kAq^B=S`gX6;-MAGCfK|n*T8tUK~1x z=S6AMtaWjQ3GDh-+LPKZ9owm(AE;f`^kM>)6#Qzezj7 z*RlZNyKCLg#$&{OKTZOcCQ|Nd`c4)VBC9Q?AWQDEo0+vfNg!b^eILGm^wsQaO zt0)l`L6|BabMAkJsP@x>FxKFeGz0rFrjrSHgIz39@GarzfQ&NpPXQBdJY(E|Nv7l1mt~D=|tJ zE3Q?Ek3Z5_DJNM8`*xoO>(oUmH8DEO8w0ogkWAnqbDY!a)a0v$QNcz_#*8L&IFoEg zWCfQt?;b1(WOa(K)bKBnwcyacf)ou;jy)|@v3$BIJ0dW0X-T@gXkav zJQbH2U|94czB&mweRZSxari!P21euphCbnQBks2HlN6~9Q^vC+V{^e`muagj>@_UHg!=YQ`C6~&DTG!JS}?x1or*ZDfL?BG;MbeC)rkd9t92sVTf{QbYaA+YGr zF@rs9GT%7_8nK4Y?gv6xgr)5Bi(lmzDpk@=+DXz*u+_2mWJ)iZNPi9ZdhDx+m6$sI zVKmoPzF?&Q%fExf2z$XECH1{hYa-k3(TuRk98_hpMs{Dpw^}iYe0>2Us7=)(HU6EN z8jvmy)U->k#V^DyLCs#Z7}YjgOW$RKEe@%2VezP-U;{JJTPCwXW?D_^;y3&N$r33a zMAn8EtBAG7XM+{*4XmY$vNzuw&*2#ywNW4LZ7uC0) ziX=)AK7L1@@DHWgg8(iy6FI#7H1Ys%vI$kJ4zo!~_>hEfduQa`j<)a}l;!6#;97bi z2nk*-2I-Kh9N~0TDwb#hX&2yrAB(GRuWdhmbkdCg{Z{*hJ=;cN-#}|M+hj!Bo7;}Z zy%=&A6;A@Z?H?@wf8#rC$gj?*_Jgiw~=B<`~$Xs0m76T8_7zYYEkaajTfFa_y3XFGKK5u!Y<`uxG=^O-8 z%gL6L!}k3n$P7&|zB#riI8(R9!sa@uH$IdxHw5k2?;baQtJGSk?`Y$jZ7Ejd{v6xU zJzr;Rj{a8ucKg4<-$LBLszqqCu+(-e>HC7`5j*GEfws-|E>=F(Dj!L)0&j(4O+J3H z{8{bI7mL2Ingps*{W&^mE$~$A5lUezw;D+p)?6Qy@epjUBHdgb!$TV9JiZTUS!Z0RhCnTn8jnUggai%=5@J&XaF_~2a2cH6iNjap`%po|O^A!i zFmhUsW@r1ioy|k4e@)iLvEz`E&h{>$RPCR4wAaJEI^bSe-@g6jW$*&Y?cd5tu76(X zf+nlQQ-3V!1%Nig`W=o5!rancSGmXDkyuZR@6<3P>e2GR?3`pi^xolrt^7q8GE;9Bnw&v z(syy5wHerriQZS=E;(flkI110&RS-z5!jy#<2=(%c(GG&ReZhF=N%ubc(kh6cYZ9- zP*L=xcH`RvjdUa(V*nUAMvPHBer)V(d<&J?#mcpPpw?I50dcEyNTdQ32Bt4{c zw1cnet|=_6vBXQGGeJhpF9%au#Nk!~`9-nvQwGYXNqI7eM0RLddCe5B`iJTxe}206 zMiF?KPfrl*7G;`%%+#vZvy|G@I85z)XhSh&ZHb+UUUGt#wl*Vr=x6uy-VHx0Lw_ zUnoo4iCOH#;2l;(T^7br8xwQu5TrJHkHjCCBC1sGeDKx1K1ZC%46d6PSlNT-s@C1FE=jFjVlB^{*(UbF2)7> zGU}<*J1fE{reIHe$aPnGtfIK_`zwt@*T*ZlJ61_p2M*~aH+7dAFAU_kE|w$mO;II4 zi}JsIDSCpR_;x)<5t}!I*TqK|buM0;@VA8dC#5rKd`=u8ZD$**7QqdP3thqTMB{y8 zdG?^ciWnrfiNQMR{mZfoeed$%1Mz=jQZ*K0E7poCX=Bo3gk|$?OnRJ9*BQEy^dmxR zkBYOApAyRKt!@F|k;r`c$w%yv=n>*qa+h4g=xr{4^q~KC%Zj&_EL37ydzeykSii31{VgCDDkTEEO z+FP-Tz6G;k%(HRjjM&vlIxg3&r`_^&&h%RRvu$x@W|oO(taK3z@uK0oDRcTsU|yf9 zI}{9q-rI@v9Q(f+#`6;eQBuhknTp-t9Lw(Sm@nG>)plU=*w={=+VI2+86W-#&o!}S zM6KdYM7_5gRe`eubw3eF%d4F_GZEb|Jn*fEz3|2%Fy6D#TFF#PqH3z#YKo@cdB;Ys z5Bm^!L?N9?FMiGsON{xlW0yd$i;3wM%6egHSh@fBuDKrF%JeCYevR)E-K-VMP7KsZFIZ(Z^^(e2i_$?N`O?VL!SJmlaLGgUGc>zoYQ+f2SQ8f`dlad-4jvo6AjLP2#jEpZRMY0_2T`?0{ovA`MvfWS4cNQ9rQqIw%w zowC5Z>4n0}HJiOxS8;(oj}dp-$8?y|xMTP4;@eoogLacEdO(J`)OdLg`T_nQk;XVr7uY;0 zN>n1|gv|tfn-ql>_@zpJcfdbccI<7T!1h}R%nSsdB0dnjfse}bd9b?L_kJcPg=Zf} zX~@>-|B?IvZKMA&LUO_ut$Y#PQ)yL(UKM>gdCqhQgEJk;mz%kGFtc)O?dYm6ztSYGW$F>Q0+MbXn zwJ@MYD3aoPRz{EKP*UZ~uhDYQG0fMyenT#sCFOuC;Fn@Szrg4Us*YnwX3URe8Dxe} z(3RXhQc1xc0Z1Gc+v{Yo1q5o^xFh&rbY5VO%(giL1&tV{pqSp9doHMkESUbHIf4b} z*C**S@sBJ6FO>%8MhoiJJ9M>)XPf;9N_X{blAOKmasD1QbTt@ZGY8j$1mXU@JbCyq}uF1DjUP_ZMH{>p8d71dSLdRTWJPU2Eg~Mn#%Za ztme8V@Z@s-7Q1kVN){sl_CkhcKL`-45mm7Z=T8PI5R?v>^C!R!8txn1mN@4Q26Rl zXJT4Y;4zisuCGclr>+)LWM5#rRQ}Qw$dK7|?vt`CMBOn-?+Lw^sN4qaTuH0%jAN74 zUp?FzsG1@`hToA6qc^L4K=2-?NgJ zoyqF1)zSCat)-*)SRK9n!j9(E4(VuKb0|E{Ui&xt`HI!gTmF7O4`L+g3;pC+pjJza z#K{6?L;+W=@}OVVHDqoI5VKS78#7B+J4D_g_ps7HP_UMV1=Sri-2*{Z6lp(BkqH<=Ka?TTN7EWp(p1Qv4_ z!$pz*9*Qvy^L~4$45&b8$KvacnLvGyj5<%>c<=P+YcfrHBpF8QD~f>s8Gr(Q>0QuY zOPJ!)GiyFd9#`{GQ?JG%oCwqfpLx1`d!&F34@;^f+V6@0@tCf$=b7zN9{OIT0=`4G zIr{zrwPW+TuG#ZPvkZh|y%u;(H5OI1M1D4CM==2!G}IPA4L?u--CV0Y!{jTv$_=;l zOI2mfnUD^>abUgz3Sg^m%vw3s=xUb)+u&~D!pxma+O&zEgJY-3O_Rl{WTRqoM zFitBKYP)$xtcok_QAGH{;%>9J*%f_{2sZ+IcJUXk<)L_&^eVLocxu^m!alfPLweM% zn;_#1o3M!6)RV$FYjD!*D&LAk@0YpKa<`+E(lTZgAOo%Er zv?1Xp6ZY8N<5`6$6-k0(6?#s%huIrB0}I~(+%xs__Z291#@i8442vJiDqY7CoZ3ia z=k)zi&5&#sR#B62(-kZx`>Su;EXiD4ZmTAMynL8)a9h4H(cZ$_hIs{b>(C;SVA{B0Dx)~xJ; zIh&7>UW>$X-J`@4+K=iRmH0|-VRH}S6llAg83Ib~pw|Vq$uK)6o5NVJe|_4t$(*?Q zo33e#*sC44=_=n{0X52;?YuAh&ZTmiNG-LWGodZmBLl4YpJoj6Y7v@N9i;+GQqUH; zZOvmy^1@S2u^CoLC|5$8B{W__9zp{$zAMJk0rfciy1b(mdp1!s*Eybym^@PMf8+t7 zUZ3}uWyWkY}PYKW~Pl=(OK~hnyq#(dm&tJCp0e0ZYUjB*=guotz z<%re16IhGmjd_{~u}3j-M(AO-x|q4!7n1pScSSvKA&+un@kXQHpaQbNnkKGmyHor9 zLHmI~P*nXzUY6U?(^Kf{b!v}_g@A$s+9O|rqX~|el&z?E+e0kMyyi(KB6tQi0l|?-6jgOS{unldQj< z`$o;M>cr~da|EcggHWYnt1}-1tR@pT&v%z zKPlndx`1B|af>w`$vCg8x#wm^f`1FtI7F<*RDJiB42=Gu7IeS#ZtE26d4F7R9wBw3 z)T~--skvyKs(@L8Ikx(n0cGX2pnt>dkrYdZ#@=NPQbEu9Y(1#35L>CLgWKfG8c)^u z;m93UeQMs+_}RM(KHfO4WDv@H5$L1(lQQ0BL;7~9Hr~G3Fa6crwm?ua6}-J+T*)H+ zfCaUv85H*TD_rOBN2A8U@Or(eeB>GCPJef_>Kb#>*d|Uw^;6 z1*8H@-*4h*?g1uRVRJ!f^K=u*3L4js)`PO%1G9rwfjd+rk zby#hDUt%pwmdfVR1>UQ_WIQ}9c31W32FTY%yjQ0*Bp@1yyvNm+qxy=-Uj{j@zNE%+ zS#{zau*hGM`@l22i#!mI8gN&A%5+z4Z%D*W&noX9*I9^+OHiskuzKp>(QEI;?jK$3EHn5 zIqS~^=de<;Vpcx>wu*()(ima<8|_X7_g2{mdPQ*fAb0j-?#f@{+&E0zk%({ID;!?&c3-Ezj_Zirmb)&r9i`U+qwy~f z$ypDk_(vfFmPNMUv5-GBCU=l(3zJRBeHot-a^JAe5MEz0d?5XV~R zHX5hoki9Qc?}|){ZbaMBwNTk$#Z(&ii1%hmViquD7+1urgE+12zp(eK23gMXotn(k zPTu+lRR6SkYO%;-t9LU2!Vl?Fy{Gy>4&yiaw)joSZs~S}-f*G!|VF z;}IqrZ20($(cMsz-zL zj{mpSc*suS?IRcC+0SIQ;{wu$=mva0}3m?3-pN^ljEQi0?IC#zyW#TZ|qZR?0xxUg^F_7c+cn%+!z{9O46R(YDmFo{_)CSDH&!V11G>En7%={IZ>uy?v z(WJV$!mTqlp44D^Ud4k*p|55h`Ltrf~2xpL)-a3xI+ zrZbpokX0U2CBOq|9D8OCRIr;06c&a>XUD>x%Z+gZIer?;5!o!LQwd&R#_w{Y&mITX z8_%-T!YtOW!mQJq6lUqwqIQSN6m3V!To8qu3ulde7D{+nS()^6lfEruAPhZ4 zBg%oU8%zC-&n7?4AlpQ#~E1l@3f8)PX-G#yW80|6vEt ziNN;%uMX(t(gB6H3q{*w3AQw5D2=a)c}GL%lfT(CwR)WH*e0Exy4*QY3toa8Pxt2Z zG}sDx?>-@jMWYpcE@RzW7;zQ*V!d*HFY241l4oJ*xRCD#^*LR_o}%fZ0_M4aFMcNQ zm1y(i^2JXMU)ZxnoubfT^NwvuNr;S2>x%4sQ4GK74dQUio6?ZNyYK38KwwKjMp;3F z-9_nznty|8IukVyTWxlo{;GbK>THD`O@1n{V~23$UX=&aO;{W!$V-t8!=XJJmic;< zH2*C`VY6F^(-F$J?N;|>L)+@IHngp&!39xyC7yi-O5nLu(3=M*OYv-^`Ku{bdG4c^ z_S(F20bgzR?!-mdSacdw?~)oa)9O517nw2F5|dp=oRE}sqns0jZVSIa9qd@#WrneV z4s8xi@8{Uc*1eJpCMiLGD%wxnRrrHTl**6ZIZ%~nyNuCDtC7&)lqXP-Td2L9B3pW& zyr;)3U4nO%I}!T>QsGK`-Pj3B4_1vu6RwUO+edWCu0 zLYO~7h;mKL##(lxaDiNQ>y3-BQ)eJ0iI$2Z^`cC7W@&E7b36a0@b3oxVRNvMW*!@8 zCdq2%N}Pvmbzp}ll8KRtL=?{>DS$6ZF21r6w!ob9#yOc4v{ZHUL3_pU%)K@~{BL9N zpk6Jy%a|>far{lSAibONxAb|)R-qKA{q3HSPp`4vYwKyj8go_crWEP|=`nd!=()6V z0UBF2N96+Mf%oML(j8Qp$=KRc7i1F5BA8-kO6;!B@}!z!XCz$=3Rx+c76WM=5R7H+ z7&@5FQuWul&pDqAoq@QNShS@E#ntUH@c~77 z6QXU@J;->jNDtTx8aQ;=%xr-?Bb892Z8Ts;4zdRXy+?cxbfIT9v$5zDmQie&5JM@r zXhg_J0c%3ECgy0wSGkPB*=LPRxg6-_coEprtB9|Ujrp4xUe!a{b=dNl(p@w{EMcA+ zO&L)qjF!_#V164_>3vouugb~Tszl1?>SmV7YeSJF6Yk><-#Y?zy@ETfs4s4Qn#I<}O?oNqR}c-9 zL}M0MA~Fl~9LEXFg7OFvN#AQLlv&s-{bm+kr!!1KgVmX|Q0Fi@z^Cd=su@mV5)Onq zo#F;0>@fTDUV7+w3jJwNJsQxRr!%dKLLVgRq2dyr_tk2)39JfivgqeR9}KU2Uz#_k zVlt3jM&D!u6)(!^%1lutX_rhA4|-Hz^g7JDU8FZJn{FUpHr+tHEc1rAvrZW?OK1&) zKc?fAv?hs6LXahTZxY5mNPo?2YdyUQLIt)$DMBX_(^?t*6LP{bLy0CH zr?rMo3{R_*RbU;h7cNBXSR#A9*pJ$YYX~8{bM-UgP$V(CvGp|Ll8we%&RHH11d(?WybX57RLhq0RhDs^M8wuSLy6x9$ietB3uks-{h<1EXNO5Tv% z#hQazikqEPo3BzsS!506gc%H8nm8fA@>k5X7wyQ|ZG}@bJ~J5_6q;LG4VrP2)!Q-e2HVN{P+1JXsh?VG+Brq)(m;>nCoc?!#1(UG^n5$L^8f*Eyl;f6-|dau-e zAgX~{l_);?dWV-k;BmPVg)zTPc>e2rMiMstc$DB5WBiRpC+|PR{bvGU#8f6y0qb(c zNKc-$J;7(#J(o}Vwb~yP98v=Sbl4(wKwAYkkt+y1CIKKi`HTeEK~7!(Dd7JjNMXbl z8h_x~Orvc)xg)dbAaq(rWpHKxpug0TW_(N4a*ecE)Z1~j>GJNMGODZ3%EYd2I(wxv z5Znx^|QRd{Bbi4Okn3^8$zLfpu66=WRT(vMbXEfd#?9U4mAt#Et z`rW+h%k*UW&W*yJ|GBXktHeex);o)8JLY66E133<6)yyeYNcp!j?=ZU#Bv#;n&e=AheGRXVp`=1Xn z$jjRl>^Js-DFY@AcS-fg2FvoX3|JLl^f-)&O!$@u`tfQhgq~@{a^d-ZT=?9h4*#;OMN3=7&Y6 z3d0bc(`vnr7ZM{^67HJTN!T74PPlg(O0FN%#}^#cMITiceF&Z2QCphJ;lAi}&9^^1 ze4=LlM|WknL?+ZMaOk6ILN(t>z9Dg1qW0(>3RQfbpndO81a1p!zTfbx?RZ7m8#tL? z)VUt3up*+w@dURf*A*F&D{8W5MT?A@eL1z$D!k>|j(yNkwm@ia5haXuZ|f^M3+mU8 zzW&=M=|q`Wy{E!a1d_vC-|%S2dM9{Zy%U@+S~a{3oI++C16BY)W6>wVJ2V#c%2~c( zvENvCIb)I-xZHQG%~$5Yh|g7rvJW$;+_=2kXd#$#6TInN5oXIF*=^_lYpAVoP1cQf zK~zO<^Q#K=L^wl!zZPEx;k#VvmcBQcTt$)CnXT2MIA` zd9|@b7za{VN#Ew=6y4x3{=%>CfnEr0uNdHT8LSv>V&L6Dt$|B?`^UNP3uHWO#m{`e=t-?FA{S*cm&iJNR zacySP{I5|mm@%38HchED^KIt5JaPm|h)vD0zRfup3>XFLi(vH?vBn|RI+R_Q$Th}j zN<^+Qv%X?xeOdB|B^_lhCf?TSp=}x8__J7uu*L(61*y`*e|k(b{~Z*F*v@KO89=NM zj&#urezE>Eu@~z_E!f=KiXElJNo!TYd2Cl5-v7KT6wf`=qiHtV<}G4WYWmF_Ps-EE zwAb%3%?)D3?8fNBIlI**>#4YXAPFNp<;4Bt5C$^Pob)n?x znD?@6o-qApw)*lH1cpLjz*rQ(#hd9!svwfq>c*}nkW99*l8r2&g{s;T3EeP=d=@#y zmo)Z*+eGS9bOg;h{M&HG9TC{l>F?f}$ve~+BO(srO6*u^B$W$)?Xm0GlJyl?{-awn zxFPh9nl{fZ06%ZNtPuAx4Nr+Q8dy%`dk~1!uLYPG~Ccy0stp1oiq8 z%4do99v1sFC62*i4;cX97T*>laox2QTTZj$PJ71I%uB#u)~K4xZ_8ZgyscGxgBj&8kGmAfuh4k5&`SkY0jqRR&rWu1nX@GV~MAQ_!*#BDi7@d}w3 z86FY)=aC*vw*?nE3-;rauFf;lbai*7F#+V!_d%#7TMs>Iw7mwa7#YpW_S>N-MJMHk zqpCxtbnxS=Wl&CXU)jjzk|foU#FaJ9i@cp&l8B4w_T{Q^NqvUY5^=Y5%$-_n)S3zG z5|UO;+7PJX4)}fmaw-RW%Lg3r{rhxCost^Oz0d*QS7^FewSiPI$G9)nyk{)epg3of zWI!Yb1oeo~obA>xV>$V}Ib4+vm4piAb{Vrjmx0K-P~9MYv_l&LB<8Ale~H@uSF`>5Znt5CH%E@k zwccraWd(`XXGSkC1l^6?7yO=Wq8WE7f<>P5`$C1Gch3CdeLJ#5@8#NICu>qXUqaI*8%-BqW5R9kuS>q|osEf!@7>l&sGd;6ZJpjU zQ6gx~Yrd`1llmfiLUdhXPrDvkwla2YuKdC09mTWuB7*0PR9;fc)lqREB~aop&g07j za{?k}o$JhPf)l!`F0gTQVD1ReuOvP2)l5-PsKZ!>GI?@pBKI6jOPlyNkr`NI{Fp{r z%-Kc9)b&j^3jxL?yXd6)9HBl>>01zb<78TUY%eHTj$(pV^=m@zgf${PFh-+x0qWtY zko%|u?+T9(t+YiRT4Sr=s@XV<=RX9*?1ZOSEt@YXcUDHF;JTDu@*|fcI2|*-J5I1c zuF^fZKg*SUlioKiX~_t~MS;O#M$oh{H4(&1QBhi9X^~n{>E~FMppdREG*u%qO!y^J-^@H?>jThOkbUI{?Bus=YP)VVy$=YwbovH?fZWB>{%Mp9FvZT zB5jU&b)!H|%?qg;4#w&D!K>28j!{X*r}{)=Qr+&pE_?lbCe=-k2P-Qr~O7JHKQavp-&gv!SdsyfZXD%ig_Lm7Jdy#3CdN6uZ*(X~h03aA@h4<8KvczS-i z&!Q%I_2PAdd^5mkIghCuiGoyB;O-`R-DIC*$J2sZbVE!(0E99`%?vK)R@C zfZ(>T6;hMy6U24N(=P!3igAh8^Ol1TQZXN+b@`*iQ+<|P`U~RzD?Wr#OH^K|-V}E* z-th~J`vWbnY1uB6viRL(EU^{;Fx;6NbX~Nx3j<+Lhgd;R$EY_Qm!rmTfb5WtFx*jy z=b+#!Ve|CgL2s#%_MerP1;<>04DR@y4n0yXTk66n9)!D}JK*BS>7R)E34@SjvUDhw zw=s$S*US`I4oJk|aOr5_SllDI zw~CT`DakurL!fTodn#OWZahRgkQq1A!pa-2>ks-pmhL%};tkgsMAY=M_bSmg)sE;t zmzMd+3kY!82NKU1gbOWk$@0So-oxmG$q?@v9oyY81JUjpB@&a6b3fs7|FG@>yl4~& zAQXQ^Hl26B9^pF}Ugf$My@*Q|Hez*8~fZQrKU7L*51arTSz^uORxa9DR=;QG9M7vm9L zk@qoi(G8o38~+M9 z_x*ziUS9sMNSVA!IXpZee{6RQK}*m0H!ZvQK%27Z>JJz^9HA}s(BlZD5S_}RXj6f| zezsP4Zg%kud@||c8Le30;-<2I&NMwX15u8|Kw$jEPSt>;+}w;9(iFe-Hmtq>&gm_d zmIgL0!&$GJc|lRS-{7m3R`}7)riTV!va}w)v@~e&F-x6zJtVtXhf3(1b2X_3XLgdJ zdyG=zH`0~S=z@`eaQ2;;BYcEY5B1W^D@}ELlY&nYmcmNiB2Y`qo8gecWY`tVuxJ^B zp9V#R=1oe2@evta^6>Rp#@A`_Ea_&wD{%KiRkw<~ z@*cSQ?%LoAOY6L{=>>Vp%4Xg71#_%luAEavx|lo-xQ0SUn_S#}6q;E8z9;&{(rRTT z!q9WEjds@K0-bT45f_Md9EfTYNO?y)4nR9Tc5WCd4`a~y5F2ph+>w)_-JU|bMLS2k z?JU}DprhTkN4sr_b{jC?XB@t_{PB2OORceD9_FZZ)22?r*Q0*aEbcHW{D0nLc0HaZ z%dRJoT>^{?6kX5%N*37l1jw!@5FJiu(e;QlwbFleW+kd%j@|A7Nw_#h&v$tccRJrzxRv(%|{b3G7YtKSzfx}9+0<&W^_)t zcrsy0*#n{2g{(eSH(+mX+#p7pn;n^LaVy((;slnh1p^Q4tG>m4Z=`a7r)jeF`Oh@% zU5EeUe<2ueXEQVX|1-r8FSNe#71zDv=MvISDgHN}+J$+D((N$bN*$}|eQCha-~7$~ zxT7BzLR&G{u<}CpgWW1@fxOtgTLrGKX}TZhxx#t(+|vC4=c*y4~ zf9!qr{=>^`KSF^Wt>IcXOg4Tlg*}R9?|TTujU`CDq1&If_F8Ocz|vCa_`CsIbLahc zf8KQOxet(eY@;2x_UoIN3tT*jgZ#PSet+Rp9@h%b+U|!?VBm4aU9J&QNY` zhx1EKE6(ll-(A|Yg4?uh&pjiuQ1-C)vvR0x6Eu4l@s8E)P4J61tw8JmVVkVK`l%mU zyu>>6b^g{XdN%$z*nxeoH$h)#z2kLX?5QAdoeT`X{0dJ`$tMGPBHQ)$HR8#>Rv`4+ zt`mm*s4BJLPy;SntWxVW9JuY0{GQs{wP^jm`NRG4B1;EU)Xk{E_IqRls0pC#MM)DB zbxpg*-)Y0uv1&}kU(i>g)*NW?&{GWQb`CwQsOL2GjMDVv=ZB%PsGA|Gk|s z;;-FM@aLycu!#ynbOp?BA^6?QjbwVCfL+>JM!_lyUJG#AN*R|Dse?!%8LyD>Gs&12 zRk5_pSMBgTRFPby4#L9RJvG+;hbS5}7ozK3(x5*I*LeDa61^!glM=}e2^V{+!Q$(% zXQX7wk1ACoyy#=QIaR6W_XsF^4mJBbGz*(iUus?aT`TIR@A)g<>u0V|$f}-Ah1;p{ zL;pq&%#SKo?W@_I*QzDJ?w(l-;SmnI?xUI-s>#&Uu)MSGyC~$VK4Nu6{a5gupTc$+ zwVtZ&YL9Z@{CLd$)GdOmT)jaAZD7!|49btDKxYWJ*^o;yn6dj4x`(-W2b4W91!mM= z-zYb%zcp$|wzOmIf(fA_IuN*IERX#)fDF~Pl8#(+(g7 z)8!-5oeZQVBAI>p`JGA60G*#7Lo!;BLr8{uF@)^MqfHn>H_oLYzNs+e_3Lyude*NB zwPBx^_RI!)2Nleuf+Sr5Hp$iE2QGT}`83!sAJ7Z%7f|*>3ii_lW%Wk>E7YJ>9(5pc z73AM{$iGeba?1bgr&}%+xU@fJF^7!xWc*k%vOWYMKkoHFjDJGE82>2NJ`G}P-1O(? zTj}2&Z+n=S%Lo*|V(FCbhL*3-a>~ls|F#52#W|zPFfKIgL<%HhF60@)h>Y5?WdIQ>ZnI zTAzYeO>()=CmQ`0D9O(cq`t3lZ<2d{838T+4t>q3ua5dgP#^MH>?sym37J#);S_uK zbZ~ZZ<_Ghv2Koi##r zsENCduZ7?U5lPWaeaS0E+7z9auF$&iDpxW0jhJOhR9Gs=mpKKCP=hh#^uIY$+&v7WG}l zH?d^a#NYg=Rcc)WDm&VB^oPvnaW!OtM?P~GNei7lZQiL+PZu zXVd?}Uq2vsoOR5GR(I>#OY5F=D9xeL2rB&;H)epH^{M(B_BY4X0Nn23rXg}SGB?Q~ zKAPgoD8539L%v$gx=4SQtJxzwx|2xGhqn?fROg}`XKSgMv^<$`I zEVZn3XvvQ{tya(Xp8m~_^xIN0i<09VlETx%|1oE-c=-J|(mPeA=llpL`zFf!d&nPG zliv4CpMGC2TlDhxu)VgOq5|8Bgz1|_ej`G=*Kit$k z|8=VG-Dpg(BfyIto1kZsL(gdH*+xApG(DVOS6e;p=lFHAL#{35YA83}BYor_^7&EQ z)X-qsQKtra$q(mypX|~7Q3lHHXM?_L_+c{X3Edyt)R@2=#Q-^srtBY4WjNAe#UcM3<PfYZRFwZ9aAaCoHw5 zmg_~IX4)W!Y5l1$p8C?<^s&D5^YC!w1{iS}Uy_j1xnDrp3n|{Ou{g%ZDm4l6>=$DN z#(t|8eH`z$I`nO%zH;jO`maXW6Z4hgci4g|)tZyC9tN5{>mlp&42Ql6)TbT}n_0dgVq$O1^G#tqc?=9NYcqqOvYjToO!t2|okuC5a5 zdOOs0rMe2Lo7Gqy#)B%hKif3cuO!rPHFr6e&SDlg3!!d`bGON+co-Yl($tSY*_$nd z?xxVKN%rs}87AA$(+JY>H<& zaNhfhL;5*NU!e5of65%Q{|*$EiN)xTQ#|v{UIbbma%h=EEkTb!%Q{VqC?xTR`l{!8 zx8r7qhPKo&lN!dmY2f-Qr#IabNoo- zcrHSq{pcLtFM;lKp_MNMFnYzMM=`1bLJsYX6^eXo?8hgCKYP z=VgiYbLj6u{SDL~C-hgS6>m|4sO%q*jM}8`(C{0;?i$Gm|9`ndxA+(+d)OjqYzvKo z-SLOxVUkc*t;TvP6XW_*4oxemDTkW&H|X_YlUjU*Io+U^ih1xdHPDNmRj_D`L(eek z*-brnaE?K(z~!RAOUwLJUNg<0kC2223RK^F(<94~=b`<_?a-+#hR)tDI`g@| zNBi4D?OLkM)YMW>jL=uBrhAdkfqYXT&tdoycDC*3DSxj+zEBMm z@^xx|FY+vhecTTh8~?i~AM_~XFaDvI=LWUR;&8Z`SlDYWfcc|E>Nt4*koiKl(A~-}gK9N7Dm6 zgi_H&Z_0p3frKVl-s3E!9uyLy+!S+nh&IBhS zLA{}9n2p2U5qW2O@m1f@$pH1qtw^7t{nZsZ8KExH$yjxsPA*atB)O!l5QeHrQpu9C zB0fE+KNa(7Ll>cSNg2Pvq^`!3FvM9Pkrz-JMr_C11G8cBOBWiOoVPq49uQ8E?|=9R zzldGIueW$kG<1Jl50$cjn^Acol@E7QF6t8%s!u}`mr#H8W)X=>`YTCP;U5I9QojKf zZ>IwsZ>N9eU~mxOco`&QJ|wTS?Ojc5Fg45AA`vSXp9TqK_>v2LPjeZIdx_~hZuS-_ zW+Bpj{*=oM!&CQSi(h6d7?iz&*_!*C(`R|hLoh(N_=}HtZ&i&W^6H)r!cCC+aTYt&dl3X`WeLnEE!P(j+6y@5{N zUL;XaWmT62-X(B_`ZlpFnO6lV61m)q=?NY6f)t@=LAq7kT=<_QviVKDMAn0{$1FjK zocu*E5zbd4M1nPHsK9kz57Rx1Q9RZCv;Oo#h!-@c*e;3Oz}In(K=rNeo6PCM!^QPUyMnP!r} zg=#v&-JQbP4V7yhDxaWA!&0a$uLnC`LbJVXzQC$pt$sNR)nfVf##NS&XyUtB<|&(5 z`;hpz53!0wFf1mBMZ~GA8U<39N7a>G1m!Pc0z`&BU_k54CSCHXwBJ6Bs`#Qvy@htj z*e6A7jXJ23v6U3K_M0Qtidgr&hJpuq-L#GFp~TK%);8kR?c=v->ldSEvl zk<}23qgeDZh;7uxWZ~j3?sSKp&Ou=_AF;~XpjyV^)Iq-74()j#Z63%RZAEZ?egMh- zx6@Az%*l?;9!ck}mFAz_O7qzZp8{pip&gwZc5wb5ltjPPsx^_|MEU!sdX&33FS1@} z;(pFLY6@HqO^1Kdc(okyd_rMQPx%r^%@Fc*6Z;hClHQ73cY)(>T9Ttrl+b97ZCKL(#!4P}D$0zPh6Pr~owy{O;vg3-_WpzXjpy*}VeQcG)^=rf4wzr=pW7niT?ODe%6ATRuQblq%-;h;Bqy;}84 zM3LnLus73#9Esh^#1=8JnU2IDA<9?uY}M*o&pu34^KV~+Xf;KbDZC zfBYb_KICQo-liriHT_)IIDeFn z@gmR6KH`v{NBI)UzvUrct@^%%b}J`lsRm9xN>!7<)#^h6Z&1&^$fjMYehDm&aAFoJ zkBk=XVU@odd>9GH!J{w?vMGCpYOiJPgWSLkq8KWTDf) zV#q8en>dB>-S@%~%zt(3Kiv}$$5kI8b5=fd?vl)+zSgNp?|Jqlb@101@^2#lN(Vpg z%WzHxO!XMQ&Mz%XS4|@^84z@!+6u#>AOqCCVa$51+QLf;ED`k;q)^2aZr4(vgK}Q* zaFE#7c^}+b`BSd*YRLWkoqPFXz8K}1AJ*ST9P;xhA3^!I+~i&STMv;4GFr*_gk)rH zg1qRj0`tv6e*>tt6f2_GcsKnVmqOm>{Gm#%de5_*SkI5W3~6Nzq}#elWB!2kb42=| zaB%&SGO@y)Q+^pwzUpj=xeN6g8j@QLi=?|3QgJ#J+s|rl6Z!evlb!wD7_du!52N6A z3O=R_%I?JVd=NXvKr#w{O_hu;{-k3XHX^=;itdr|`B8qV??Jh4Sc~jq_fe?x zS_t{LrA~j~JitE6SE(hqXi=}9vN6_Urdlf2JNP~lDz0PTtH;1st#(0z?h9RU5`F?x zjAn{!YTfHst!j_(tY38R&6L_esp$?W?vI7M%@R7V_6O#wGe|tws0Q(TUafnJ@wI9I zpXI)3a}iam<|E3@CAnO{AhkD&^wN0+l-;ln>7Mzvv9%n3>(v~g|GZjK;-M^(?L3b1 zYbn3ci~M;t1pak1B9i6On{wrpOLoY)lsAVwU$Thvmm?*M81Hs?>SN_N^%9w>uaiUH zoFJS?jjlU{D9%afMitrNvT$CRr<&7HQvhCBZF8xx^OI0m@r_G;4}l=Q9quv@uR%RI ztyUdCb>LcWg>YDn`j|+mTHTM{&D{YUaPJT)(R2e-ieX9*>nRBV*Y+Xm|BK)g?c*NF zhntJk>Rp~0VdwJ+m}N%FC{{!D*UmI9Vfr)heNTBNmPe`fPeJN{LyGCuy+;Sus`dEB zrF*tmk0((slyd7FaxyopPq@K#59LeM*f%}XEronLhuy8Hse+nDX_`d(rBdGDMSeHr zk71yc`91*3eueTa9rAT*7SeaOoAr3TLv9`A`WHa%aE-ga>eVEq?@fLNrDjsGIB(7k*Xg@7v zJj**ojH-2N5vnEEp+R_d&kq|y9)zVImr#xJG?Ll#bz^_Hq{k`~<4Err$;f$G1NvvS z!zFcPFJ@0QWSAsRNa!YAbclIorvB`JPqVi z{CMptlusi)b&C;e0oD0F2X#A7%NoP}EXLQfK8o@ucNn=>YTUB_3&E|>Zk7w}Hw&{_ zliN}VnaH-7#P?L9Trcxf8snuLbUBfmbR#iEq zUlA&}hp5^GnNITl&bo>oyav#JSqHw_*i0q3J^xys{C2?Y>pVBya#IiwXH0!o?=;7P zvInk5_Hw_Fl?5K5AM4h7)LgNTaWe%I^9RX-al+NXkNB z|F<4*pXd1Ebxm~L$6%CuGj(d$cRjlw&Poa#YICX9cLUT`oYZpQQeQY^CXqvoFRw}t z&V!Qhlc;PLH5Hx-uzwriNT3(R!g5;b5AySft9 zSHlXhyHYxMfWwYnR9_?Vuh~KWRYy`k_WxE>Upc;CCvk~}i#1%N;X)0s)o>25Te`W6 z?lb0E({8rd4o z(y-!bM`R)M5500;(TgcmGlfJg1+l)JN&O{ie_*$Ki0>!;_LMHKg0hFc2>IJJd9H(U z_IlPkj`#1A+e+?BpXsH}a;%u)na*zJ-;vG|N)}Oak3&*e27jDZ1Cbuj{boZC-)v-g z>dWOW7gUBgRQ9FHN~%n8RjHlZxLc@Ns|E{PqMF`;YI&sNhY23m>R*QV;z`{xRiNy? zFG2hDuG;zjK<>Zj>syR~YRoFn?o13wxzsY2S}IOx4rBWogBQ|saPukFRrA3i=5uae zduBE9p<1>VyO(+TS~#P(!`!Y+D2oZr(i4*I75f#Z_|BMb_M536SU60JqcZR4WP9~B zo$Rb`(8=!VI-TsJJ^|9bCULlXeI3#*XS&}Xml@=|Y%bE96Noo0(RI&&LGLerdBd|> zF&pvVk+Y2lsm@RYb%mNb_`Aeqomhf(V!2wED;!g!9v*_+kfE8r`&V+Auk82h3~z$L z&2GIW{j^q3wHB0pCR4plPgQds5Zh^p7sJ^fZWSsx-`GeMMO5+iF}-C-9eFS(X0L3I z(E@K!8#4G@phjCgtc#>WCOPzurrt{GU7_h^#c0^(DOUoyn;mj(DHpI2a^v0X(Hg;7 zbUp5l;gLvaIk84>1fPJi522P;4lUdOsK)zKvB79iKh?=lwaHr^D#h-`a%xGUmVHP6 zy5=%IR3Wh>M#}LIk+8_~`*PK4LynjB#TQz4P z%Vqzmg0fdp!R?v?$~R2)lw*JPzC-S9$~Ai#az7twT;A-@BCr}`KUM-g?AMAt_35=R z$)WOLs_ajd8(dXt-)H!J1&>b{Fh$~9sCze2ag91&;L~a%asEt{pSmc4WP6f#w&Lqw z?1WuYdy>Qf-#4KK--X~zt(^!eP}>Nu?c`DfSwQl4U&>aJ{6Uam)cCa^tqeU*5^b?k z1fjZJQ;l0_Re?HMB+{RWJUW)v2<5M60=-47(7aa23Imr5QW&;SkRlPYAcaBkf}F{8 zraO7Z2~yZL0;F4E=aL=e)-+!)?@O!T&fZTPjfSdPd2<4(b zu%GsnPcN6C@8G)+MF9`!*==w+MW~OZ}$8NU8~?njBpX*Dn!v?pLA{ zZ?8tRM3N-?sKY_JIY69qY)&O9R5AieSig&xd(Llo+7T&M=YhGH%s0vu+27Q)@YGxm z=B;EtPG|Xe}&Uu9V%4YEIa`NYMW~DBN2)-&o@*uyBEJMxTUAZyPT@-u6~8!&0zaUhp-RClS zOQA=s|2*%J(EHOsGFOm!s!WvSYX?8i*_L?9iSgju9Ni5kLD?@*yrX6_)64QA$L6_} z+(EB_Tm3}OA?J62tvo%#&4WioI#)o=qvT{tzU7eA>j&nSF0V=0KO{B9%S?9{vwqw` zHQ7{?q^l9@D}VY4?=yhi#aJ@Gt$^4ziruM;$;9#3Wqf7|6=ba;YYWNh5^qO*G2&$n zdXb#ni@|yNpzaLlx#+F!##8a8M+P{RQl_SLYW;f8D}U$5ah4cBP6TEkVq z?)fc&kxgk@5=|TCYMMJMw~niy(DQQ$l+2Hxs}O5^OjqgO=-J-=`;<_^a$ZR#%IipZ z{{hL1^#VumyHnYY>eV;Wh!GU19tG)c5_fsRsbe5@EQJo9Z)r#&#`mWu5Th~rsU1Ml zv|9|)v>sz6>!)CKSIRAf`sIihN4mcQWlyL2?ljS*eA&fUFt(hrEo26GKT6VLvOHpe z-IZrU=qaI`-O5UecizJMS4czHo`Sr{v9iq|cQm=5)3{N8st{-~#&^z6B1;4dbBF9*L%{^_R*vYaMM3(3OyU6L1lw0}LB2W|!P$^DwS zaz5&XpY3oi`D4ldx(h$P-xbb6tWXumJc(3Ob9Fg3}nu7#nD~x4Qp>H6m7eCUgj>rq^TZ88f72-Te zZ;=-YB|C&%%9mBlmn@}Z87W!3oqsG&@-n_q`rs1U$A(-A${zS8^js}(WS>iVoZ=Od zFN}PjNj~&f^wSREiE=ddvwhnFnvhJ1`jkzMCFYT7_et6WnQ>wnxwLci2_xtD}W z+EKKcq7z(2g+KG6%Gv+!NMs3t3{)Q!r3rF~`qn#K!PKa)34C0A%u52Bkia|Hdbt&Y zvirS-q`uoH{DS>6?z2pRehzu}3sbkNcYD#qp()9s>0xS$p{5N|lQ0+k$8NR3^F9%A zZ%S_=%;M=v;SCg?{_4A^WRdFadWmCDE zGNqKs5Hh}MaZiuAzgYRSA?JB=js_=(+v~S_Zb5M$>&&Cz%zg))T{O57lS#Q*52e~9_>XlncpJwDq8zvDgAI>edl#;RXS6B z4dkx1Rfx=f)ibl)I!mW`vmM}gQxnf{il2bcuAu)Weka8%n7SF_Y_d;7hB#lt%Qd_h z*u8F_h5d#)69`XA=Fh8k{cXiSlRU!2cj}o={V+4#u}!8(k$D02bL?T9A3> zZZL;|xpG%2e)~fG<9qFUWVp}#?qvw!&v8#%dKkZ1U+-TwvYD-8UW>d#*8=eHsPA~( zs*R^v4_}LIHtS)TG1(d5@2(Q+8=0YbxpHGVwUy$xEUwD}#hbhv00ohpa45)#m`meik zZC5lYzOcp*q~L#2|BDlpx*s?Eh2Ne}y7C9;lP{6p6^w9|-`UyKhg1$DZ0FMO(0p{10Dv<0Xzy=4R{r>7w{S2JHVd+zmMB0eE`D&lL4`SM*+_O-T@o}`~bKL z2;ARRxeE{tm;+b@SPR$!s07pkt^jVRfIk2sfCxYgU=CnDAO}zY*aRp6df6j?h^h_?C)M%2N#yiYGL!`fiNh`W!Agp9C;r|A=&$ru z;_;j!RL%vb1zaXP4?w(Y+@utfDSd=FEk4+T+^_W6pvWO zRn<>W48KfJlrezT;Y#!uBNcn3lb&siHyBe=%yCBQRg@H$xFX~&{Kt{Xm7hi`g%n% z(v3*sU+M`GdU|=)Lwo*f`MB8gh|sgxyB=fwKdN%6Ko(jC9G1(j3qHWu2XXwgCQ!4t^#;X%A=zNCg-GWD^UIom&)h!+^^6dNQXp!eYVA|9lxFv8HFw1c!F!N*u zrVp}#lYk3=4Zuaf^vO2hMBq|j`lbe$zPSL*vh{szwD3`9VAjDQz`cMc1G7FP0ka-t z1LJ4AlvTj=#RlLY;1Xc^v;vsz;WY3a!1cf^Z{O_E!pD7p>EjS!miJg-mibIz*0&^J z`Z^1kKF$HAj|+k6<6>a?csFos;7Z^Hz%{^dpHc^$1$+f~A#nR8qeWR5fZ0|C0xtrN z0B!+16PWca3z%&r2blGD6ENHPcHnH_a^S_l$AMX z1zrgp1Dpq(1k5^=1>6yM88GYaCg3i>c3=x|1@JQ9I$+kl24G`+Jm-Ig1Y>G)$^rui zpbT4jy4ix^0W6Mq45hXVG(er7jK=wxRB^gYz7&he7{7pnWSR*xI|>^ui8e81Oi9M* zVl|r$Ddsd(L`S&UX629+Z%)Mkq=>n&reDsBlT%EFcueUm$>~X#A!{($MFvbJRzW4sVup9(P4koE zOa{y#*?wS>H91X8>1Ez)NiHzuA?W42i!Iop=8K#2!K95N!^%prJzV#+eb z*{pP;A;E0Hcx(`}bR~g#$0(j*&5*QkA3O(VGmf)x7ndrIHH2FUCUO2_OGDvctdvEi zB*$Z7!vT~Arkdx|>g1FZQ=%~ilMYT|w80d4MLyHvwREhD5RoiqK~{@7#b8c1S+unc zW%E;0rHe)L9T9*-~o8cNv zUcLH}hBm7i>m#^AuJI5i5;UM9$~qv@$*{uvsgAmkL0K_Rb=DKT)=PfQVO{0S(mkEVUF-6+OTVTWxOfPY)eeiX1(;cTZiB%b}Ux0@JV6a zafUT&VlLs-g8Gu0jG1S=Te!2kaq7twGrrj@8Q6fLM_I-$1 z2F^wcIgW4Q;{(d^pa*&laz_6DfU1}|K`HtzTzS0PC;_Lj@3Q04NM-Gwa3vezod1jf z#E+byw7fP_840*@b)@nOfO~Ew2=9%s1h?@1qb6XEGD^9p$tYziU?E^0o);l}1@K5b zCjpiNsE2bk&ZjnEF2eZ;=Nz0jaL&NF9Oqk{({R4RV(JcP1Bk(%Q9!cXxAJwNw?8}q zKRg+(1kA#o9-x2hNJRle11excXtPnu4nSbU1Z7^UQDUEodstj1YTcj`kGM*|QOY{N zWbmZ_7^ajUjP?>1`^vB@E@8*DFdRn|pWRPjE_MF|0i~eJ0Tmil0#^Z!1F8Y10X2YH z06%QAM&j9+lLL$ZOK;EsBf!#oHt5-)XDi)TV6KUD2tlCx00wF>1UL*Z7BCqw6A%wb z0r2BUM?nJkWNO%`VT*#qM7YF8?U~_}$kZ^y`8+Zu1KW+}ILd$?X)&3IN13cs*-A-I z(&^FIZAiur-9pm{3n=UyPQu&*Q=srHg>mE2Ifsk6g^8px0-c}L6h0p#e|Q!agYtQj zDb<*sWVVoMCc{ zb*Af#pdN-dN<#~D(;-4frr0u)qUG2=4c;&f7o$JBH-%0dn~V)B%Ytc1rZnA{i6*Pf zk_HYqcZAJ?9X6|`z-$?3OPww9sQF0iILD$xo#x7qJYgm}I-X&ZljG)&Fx%3s_Y4#| zM`DULI!(^#P$u=(P>?AQR(b3TuJCZX@!!pRu0IVyWG}cJzt=acSJ%#+I^Ni!eY+cOXxp}JKtO;$KG)07b>ahkqq~k` z;!4sQxyH8wx5V=z?Kuay6`l)#xz;Yy@HSwMCA+ow3Sh3KtF-6S8mxw#XMbpOXfo_k)iX3a*I8c!2Jqo;^V0ZupKHC2iX%dp0S z=EJO6)}&-c;9=IR1Y?F(r{{}(1&xh*QY;P`lW}%3`7<(;6RflD6nZ3mm!Q+F77SXm zW?_|s4mJ)W@2pu^=%gek;#DBmJ|dI`8q!ReKnj*(DcHML?g#zA1E@Pg(2Ie-9|2tf zGak~{gxIvfCm1}vQAok)I9XP#C&3Tgq4WcWs4@gHU{M|b?gJduOYWU60^JkLi$L6g zxZZ$ZKtDhazylB%0^y#Z7Xcmy#LiC;yD7IrHg^7O7n%;aU5Vw2#+<-tB^GlnYRw&{*ki=?1=3Y!r)l^!G-t2(h@<#qgrjoME$= zs5F*kh_^Yyjo#!n{jTDe)nL0tB=3^GL%VCVBVL;BT}$lzWQ)~?+{Y(pq^Dq)L~PVy zHpu*$k_`V~f-8?R_XejKE;|038A@!NIbG};IzEP7 z|C96F`Mf%iwz-yro0puPZp5ei`fs^o;}>A-5Y?TpE9C;h!ktG0^RCBXrGWQ`F4bD+ z0FR?${B05ro_{okdGzqvf6?2hy;{YZL~pio?+E$0?KT6{YI{t0jx*0PX37PH&NJlx z2Nc6(^aF-4$L2EIrC~Um`Ur6%!5M?srG}tJal9QHxf@4$WbCe(5bM<=_Bc>B*bKbYXPuL@Kc`|Z}Vt>Dq`Y*=~H4GQlXz@ zh*6}zHy3*Y$vO z$dlGTdb&DhxO;j!uRA86?ptE_XY#wo^V$7F8!4yf&GlIicg2+FGe5eF`?HL7#_P{I zpF7s$b*#s`>(}G|DO~6KfB3(9K(908(tS?s9?mwa$CKCf=0l?~W1VkSDEw^meFY-F`hS{h3&&by?SE-DYCeJ3WuO9%6>O%HUCa z^m@t%%IWg@GqI~4KD*lED$h86^nOCOOHWsqbA6T)-v6>p_|eP8+cS0P@#J;aP5TH8 z*J<5mZ_i*8A9p=^xQ_LBU6=l>$Ny8f&iDWD-+LekGXWcB6)B3GQv{{iQc^&oK9+Ky zh@V?P>uvNI7djubUM8zu=ru0%S{Hhq3;m=E{gey6y@^xj4j0-FcChWV0`QEyelp(V za>{*#*%FTRoc4kPjQD(9I!fT*HT+Bf*4Aw!6z+W!ZazCo$p8$AjZmTh{B$cDrTG0h zN(lj+YZsx6X&<57RgQOg;NLw>@{o_u{EPrUKYf51_9N0d1|aRzq-nF}En51vYTd@~ zy6gP|+TPHveTN%626npX=FYd=+QrcIwr<^f^t?T&*B!n41o!Rd-2NUk7|XYzp~Hrc z2n!!MDq?ixn6Xjg#z#+>IBD{fsncSnKR9FNLl4i2{rg?_M;0x9^f4vqmC?es*oEOr z2hL>&6!+3*0T}jw`^TWT{|mwzMgDV-@%9{nx9R`w-!h!6bN|i>L{ zfA`N-!{azhsQ+t%aqi#z)8!5Sw->*Xz2xzw%a%W}B4=f8-m3i7Yu2uN@~MKSpLw?M zx#!n!c;UsDiZ;Id%BIb)zE=GDmaW^~c=N52x8Hep`;PzYwC{TF{oNmYxTmyi@4oVn zKHgt(;NT~fpB_3~b>!%=<0n4*y!zx9r%r$Q)z>v=zWKKH?04VSsXv@M|Km?T*Z=bC zZx??5<6^_5KQCYT>*}@t?GEqnJG6h*;r*Y^|NrUq|F`}BPXo^1$BO~y|9JjA`agrC z|HJO)zxen6K@aG&#PQGPUw-r+jQDXM=f5UC|L&hI@0!DZmtR*2(!O5${~LU$zrQ1< zJ>IbfC^9qvv`&%hUuIZibLanexpi^{C{9{ZJg6tvl{^#1^$~${M`F%nd1kyh;5q=; zHJnp&Ex|b^=d;8NBj(;3<2V=A0H23x&z!sP zIT}Eji2(9V(lF1IP(SBMOgja@_*8%akPhe!;EPAvnhl_>OEmmAFvFJusAm~~@|c4w zy#Oz2&l`bh$0h*Nc@03modDW(2*CKy0gRsx2lD-LAe=(~$WQ%HrMAsv^1%~v!4L1B zOaI~%`ooXbkyRV|yd-#yzwg?*XVc7mzx0a3ngXBr9e)jMUVd~%!jqRe3{D9XVM@Ts zwWfkT!)Jf)6MozC9edtB{w0KmHhH>b*~+QiJHPhlM~SHw8K+abg4gQ0{MS4wWyvz0J8r`wDuzF`9)KdefI*On#|yk8%3xty^dA z_X}(Od*Y3|k4$`P=jC4cYhnxN2o$kj?)x1#t$u6j>o1LJanCzr9;%sjI=l6jtM#EL zR~J`h-!!*d9C8{m_O564Pg{Cocx0{dw%1SIA28$t%Wr4bSvyQGz3$ap&ZnHbBjDI~ z&=#=#))~g}X~}my64?2h=w`hKe%bG*+oR*2n|I*V8`a3wL4AEYn$t$#l-7yf4!x^q z=o`(VEw^4eaipNv`=8E8c&6{*mrpJJ)3j~USDEWyHk3@dwCCfkJqpG|ecMb~61?y7 zg{s>oMhE%t{O#9v)7rHketPjk_kH$Ur|AuyL!MMVYya*OyD~Q~G+y0#!yF?@ySD8u z`HB0c8oCq=%Dbo4df(*q4?Z-_H=HZ)x&DQ^#13h#I=s;P*SqGmn-KBgp_k8wPkf9g z69V4PD!ACB)OzzO<)Qi#+sCI~Z@=s0H(y))O=HIdW!_lxN9x{nBPJX^@bv9dwtn;3 z?cWt|c=c`0>Xp#Qs`D4>bGkkDQEKZLbF)1o_B|Bb5aHYQr_R%h{tT+W@afRaeLEG+ z`)v1$u;j%)X_o?Cn0nI!+a|0w&%Cp1h%M*wr*0hj>D)ovSAMnPMcO@t40_`rxnrZ%iv_yCYjk z*wM>y_~=KUFHRl0xpUOcPrpik;fwo+-MDky!K!(M?P@T|< zoiLxDOCB|J&*)(}vgDGz_RZ!UT87RZym0(On+^>a_RaXzRR6BO4w!m&YP+%?&whR` zXxX`Ej%5xWee0XST}Bx~-gxH7p+9p^efrh7CrXp1YNFTebs+MmyK{Plx`0ogg*?|q<;eb2hDwsrE2zi@oqoNISqKWA!U z`(39(4-UQ~D{1{*b5DNs*6+KM<9i}MwHIb(Uw-Szlpl)?k?R|#J-fB_)i-?}d9_bu z^3!{6?bW$_|CXaCs^{;&=ZN2wFP>Wa!v5!rKN-^_aDM%Dt#XPlS_8Tay3#h{>>I1& zrU!ig$+LCIpZ9#gQoH?$Eo*1ocHe*vww4RWtW!q?XI@Hs{`=52H({m^ z`+5w|yL8}%b!{@{by&}>*nNC2b?YZwBn;F zD+8wdXL{A~4==~u`MAAlr|_{&?>i9HX`AvOv+rCnzijB8p@E4mIv*{B|$nPOgCyZ-x=gD-6~&(54MFz@5K>Ak;-`D)1F zm}?_%>#%5A@pRkwJtrk*c8uHk-MLw<|N1uhzPbT-7d0dTPXj)zAEX z^VXL;4NXG#sKj4g{9(Ul2ga2A`1_eJ#%)}aajI4AhM&eKUiVUm*FW2_~W(ub5x?bZFYbpzRkk%f?hy98IigD1I|>@PRkpom!F7 z=7krYR>~q~+@JelHMHSeRYoiDXo5*|6HddugF#-8!ruz9^r$r)1Hk-C-8 zCyxjG((FS^e4t<1Ju5D6&1&E4tqE7|d-hz94*h$NZF7Cojf00=4SMfNPG-!A7wwyB z@6Xu#>&Qigv#o3VyLLMD=6_!4`%e4lE%{sT`(gONXP$li>#u#T9{cTRc9R7~_d>hR z`VG;)ym5MepEvFgxi{+LjH<-cA6gWzpV07Y)AEv1Pwkqdq+I`PSCsf1JJQk@LF_bq!58t}N}a@jKhMmB04tw`>W` zukDx_fBE-g^X{Ktr1opSIAQFC0eye5|F-%%|8~g*V>62Vd&Y*g^BK}QXI^F3;LZ2` zeBg`R?RUOEeAw7apQSX38OsX&V;Q7jSb54}y z2a5_5(5~*Dg&)7z>&6SMhmQX3@T;3MU+MPYrpITzT-nbOaQ9$7 zxccSDL;2m?-TubWZaX`@->kfMWs98$&%HhB^q5vJ9Bgv>qtz3>yEA+0zSYGs{RR%d zwOL;KvwN<#yK=3$|AM&0zwSAaFhBatuGyUY7)ugwYVC8h^i1=r!5KH48rt`zSH5}S z9pg8r*N;q zuCRCivBgsf=h8-ZGM~zS%J#VR;d`D>`{>S{Yw!7Jcu>Xa1#fo$>UtJZ{IIg;b51z$49*W{esBv{<`h?^v`O3K76qG=bQ3BNKxXyefRXZ&1t^H z8($1xW38CH`pUGAt(C|3*@vgaot#!VW5?a<)pjYy3FSAPdhh8SFO2(TWAyizPS1NR zu4V6+`hE4nZA?!ISoy)jL#E!F`EAH6pWHwG#iL95ym)bwb^oP(&wk%|PDt&nZ5#4_ zYx(E-oD?X>b?U*y?})@BcG_n%Y2YaN3$vsQ{vv+ER}<~Jxl zEdrG$EpAnswCtfY@eNj*`rfTHZS{cCv~`5ito1~tS(}HHW`4;^b3dEX{JO`L=GU)P zn)|<`wD5mZX%X_6fGbr`V%Zda6|Cw!F9;r>eY zGldvGe{ZfFd|qs_rJFOE2YhOV^6xS`_6z~50BZpSfI`3qKoOuAPy(<6$^lh?YCtWZ z4sae&54Zqm09*kmyKoj3;0y2r1OVCtIs<|L{Q=|;0S*O30HOgi0r7xzz#>34U>RU7 zU=u*=)0Gm?c0ehh0#F602GjuR01W`&_we0OKp#LTAQ})4NC8*@ivY_2s{jRn4S-F6 zZGi27-GFkyaX=m50)YI=`^Xa@5D)|y0vHR31y})#0LuV{fKtG5z$9Cm5{1iCCgZyg z({L7Xa*_?_`ID7NMl0jujX1u6c!9x_K>~bflEU|wlWZ0di1LD*;DfBqA}B?PG^Qyd zO|z9KqeU5(ZUJ7PL?X>dTZ%HwmZ(fJr7PocAaa~}z7l4NBR|dvE})D>5YP+RxFlf6 zCvzJu=MfHo1@3%nciN~jp zAqpP@i3Rv55fOt@QwQcj%OM&4S!j`C*ynvze_z5E2CuKN#cZs zE*Fm{k&Gtqe3p7LphI#d(k@pHoF5i8HVzvG5AYMM z;V9sK@K-$kF3{5F6aVqF6yy2N;0Pg?8^BsX4IpF>`W8SHfalX{f$ISwrT=_ZjipX6>F2Qi zXV0tgtQ*f->2kc~=`Q%H@wqh5`=L@$CwQ8Or-~K|8{|1GS3P(BZ|Pw<^9&lTV-8(4 z_h)g6&p+8I&vnH?o~6apSUjO+M9DTj+xKtsOnJ8QG}Khx8lDTJHUDG>&js?Vnmm=J zOViu*(m%_~65yFLT~<%|pJlT|&SgEJv`qEC+0AtHH=e<;*(zEl&%Eh(h4JKC=D)Uu zr{Q?cjo!1u6Y_pB`jag+0WrL5Og~T8xMXBmn{eijdFQ)W-3E8d@GW^!BY7HaHtfst zV&A{fBYiD%NE@AJ=Dhhn9(|)Mecpk_5B;UzlIFc$Ff<)`F@uk{rv<|^uBRzo(~&ym z8AOY?XN_qz&IjgL2peWG@e6Ik(vvfWjhiID|G{vvX#gCaW=oY{f|FnK%D{KLIENw6 z-(l{-wFBV0VZ-9A_$J%5Z#{%?mFHhqii!V}0nP_vmE!}Ac zr{)@u{_R4cbP~TXz)Rimp-tlZf2mI0dOi?7CBtM1livoAc^QX$8z|?Zn>_M>u*)|F zr-27saYDbYZ*&H}2bvt;NRb}L^)+o7J7RR$WOE}HhhLqc-~b=k9e#+C_bv=KXAScb zHcjl^4ogpu=2yrUAY+82$p(lFlx z4w{5N-0Q`2PzL^xX87oFVI)O33R=*n-u?UcN0?zB=EQ&yKp0>S+EOrP2GNLHh~7FF zZ{5d%o{P2;tc(%+)-rsuxO*vU|7g6k=R1Ae|KdWIxX{NndKh@lgC2)71j9jJ(ZWZ7 z4yYKdJczM90(788j|Oc3Jp!SVK=*gynd}n2$c4X13!e=B3eb95wV-u7eGf>Q_82sJ zEa*^;radtlO*$S=t$7pHTpr&l^RVu8#J0W^f@Tg8U;E`qv@-eF0>W&NO+cM z6=*bV*sjsEty-h0{{rYRit@sb?hUP>l`; zoutw9)hdlS{k5-MQ|2Js#bkMssdMfA| z(35aloVF>4rEi&EKhX3cZELU5)YI98X4>8H%$caL1N10(j%kO1W<93e(Sm*u`cMyC zcv4*G9MG)0^j9HhoJtaDZxi7UA_m`ybfGIj>-uY4=nJ5uVF7*QS0(c{26Si855h|3 zGX(S)tsX?Xgr~TKF9SUp|5&c{g`TfsgzIz#Xg%-rkxqAnj69Rh`G-8&k06gQdFnk; z%xN>k%Egl>7$Yy|f1LL^dE~l<-yLAMTz%o*B{8-qIznX1oO?QXxI*F@i8$GTl_pqR8)X;QkDhiP?*c z4W;f)m-L)x8Vol=fR-?i-b>3p-m{iAmQO(*v!IXba{28U*22a-8CV;zeXvA%pCC)0 z9_2b&exF9>UzSVbc-C54%C$inG!S#$6;4{f53`NDF~c-ePwjqNRtvSv}z%r`&o`ngJ!Yb1m4 zE^CiBKCY%xVFRs~HH`e+XR;x;vdq27$#o-J2z}<6K37i$SU{h19rky8^sZb1%kuH& zE7`ZQXJely>#lo#*^^~C^5AKYzNX{7*xvG^=btG^n>=;M5|n+AHyw<3%FF#lcRSNz zC)bqTvqjZm-4=o&-7J`fAAbrYq!V!+6W3U*1(nMSu zLYaoMUFrRq-hb)+Rpar3<0x%p`;`5Fth2Jd$BB`FAs@+kD*Xk>6@-tb=9E zQ|LOcKCTA4jI7KX_c%EAuzu;hdjHS8C4=azXcu$Ob28i`akY?PPJeTy&lVv4&DOM~mS(fw(bC?L4t(c$2 z@%kVM&PK8-`gS*K#r}ScHz(!usGqmGt>cQ0rB0bY#{Dg^MOr(!e#cG9$G+S5Ve6#fmMJeKm#EB z-n@X%(!!%)ZyFVBgJf`3#jWt=aQeIWwFeIbGpA|$qii`bzt)CrHtFbPKc z2hztdLQr@V{qcz)Uq5NR((3JneB}x)%|XwXSK0Z6?Ee?2p>Ca{`%lY<$5%@jQ9e?!y-+ zt4DZ$KHdXVbgB7HEW`5S^~;us@%T~F|AkC0XYzQo9{l7>>6i%V3wR2+D!8@&+P+Ca zLw8hFu;_w}9f`ZnE zLkw5lsD7$|NLOEYUXpgS71~%9IsP=IDV6WIBpjLv6jg|9B&(dbi4v_-0ubAJfQ~CaSFt7mY`0b3Ty1UwE6%2im~K5UvZ90qXz_fifVDXFR_e0Zlh5#*r(ZCkK1YjGW64(|v1&DKG60jX`ArQZXoeadT-vCqq zw*xx>_X2Ssse#VGlfcfvRA3iiIuOtCnLzYEWdXYZvw=N;`9OD|a0k!)Fi!!|r=bf( zziS;J`b1>FK%glw5yPj$vve>3YmmzV<-l@47oZjp{etCzo*-8M`T#2e!-3ks1fUKO zpKVtLP6W9MFbP-{xD;3oxB*xlxC^KYR0C@O(FdsqL?5I+@GOKI0Mmgrfe(PSfZ4!0 zz)!%sK zLZAt74X_z-JJ1ZM0-6I)0-FQVfEK_^pd~OL*aE1P=_<4Y>H=+n4S=nIroc8pTVPwD z0%!+x1GWS91KI-vfbD_NKu6$cAOTJRDuDBV9e~Nej=;@8XW&s_CtxbDGw>F$3or}l z3d{p`1qye;et=bgZooRg9zbKDJJ1^F0h9xK0bPK7fS$m7+f$Rlp0ny)F5qK129bhW367Uuf<~<<`s0+*k>H~#)U=P45z*@jMztE9f9G%j=%(97%&M~1}3UxpcZg5up)3TPzQJvSP7U4tOC3RtOv{j zwg(FLAs=8BAiN+iGyrM=O@S4Gwm==A0$2&?2CM??2doDS0JaB417X1slt3-u3}8jz zLZA+C4X_e$JFp5+1*``=32YC{1eSq`F&n4@`~<87)P4Zzfd;^OKpC(-&<Fcaf}&oSN<>Vxq> z?S~K#Gys;dfcgM+fEE}Iw8L;~7@rsp^uTc7Kn%Bq@rmKUI1C3WG29OHg)(p<%5u;b z%E0X?D?nc;15YBIp`J(=s3+15>WTD#aSGHL4de6?=mBT|#FHI<{9w0@AL%?TJquw^ zA~2k8zhFo1OViappm4uO<5%Ii+AKdff2Yq1p!E*zC z@C?VuWb`iLCz_|nUr)i0bmqk8?D%0`4&+cS52Hjc8Gi6Af*(9<;s^a<_(9((eqsyT z!|H{neEfv-a`88B@Pqyh{Dgpi1wX!pK04OE2!6)GGZKEn_<5?U(c$UWxo>CcE{qgrt@Dov}4;CN6!_kwBAJlUg5Z@C(P2dR{ zTZ;Bz$^H3g6PDo5$F&&k!V*q6z3DYR6YogZRXzI$dLcq+lL8^Ut&UbG{uCk#I*3G?)#dmOYYtWSRkN87?YQ4jcz3F;H`M;o(*QgQEs zc81s3UbHpL6YGigW(g^9--9-X_3RGUXm@!16a4Q6QXKDR__c2cVf}@+XbGvYo)~XQ zpM=0VLED8-Mex}trf1h^v(h!%ttD6h))Q?P`wsPq_KS7H`b5w=cc*n`{zTR!+ZT{o$<*Jjy>#0rdu|Sq&u)ZIG(VVvB#xxg}Gqw z;@_lUt#o2LS118(o#`F@m1xtbBQ_3Qg`RND#uYy8Vm>GA53C2ywU~21xMt(ZiRuyO zR2-j}o{bq69!c9HjTuaXPdc&Ati~P?qG>~H46t#lX=fd28^hsFychM$#tG|hC#o;a zzSK-FwZ9YH`AhBWL~VhsIr!vHYBPTCUTSj(I(Au`neJJeJ5u}AY=dTbtbVKwQrXh? z_L+{|Xiu@Sd((O_eY^4U&<0o;tZeu#bf}Y5HtLwoCr-Q`5wMm?Gn3RlXWFN%4E&t{ zseNvIF2FKazq2wr(lO77BUT>k0ja$1v@Yl^Ma#so#q#x_;Vj?o zv2PqAE zheK*Ro-bKG%#v9?-RQZKrSah76~B=bz{h|eH;~hT{eU-s z0l*!=XkapMH1HST6yOEmJm3{zGVl^`GjJntFK{35DDWsS6?hAH3y3~|EZ|vS9#8}d zFX4S5KnT>!3|Ix^B|u|f7|;~L4S{ly{ZWScmI1nejBBtba177~xCdwr@nwMtAY;F~ zfUE_a2r{liNx+|h9uQt0xD;d@+xCU79|4lo3G9T*2Z4zz=QGy*C? z4g^MnjJ~HCAcq4zKsEs`1UUql0PU#+Tm!NjFbU$VfZIWi1u7xFGEfEbJm5*-T3{M* zD=-s?^UibNZeTu81w@|_`l_^Ev%jf@zNfYr4l??Tra-<`fDJ&#{lG$qZviv~IS!Zw z@pXW2C`Zp63AiO!qx*$gY8vrK& zwV@pR7OW}AlY#k=u07Be z3UC2X4e|QGc_7aOrb51LfXN__1)hX>1K?(m`(QlCHGz9U?h8B$T!`Vo8Nf{73Sc&H z127%Z*8&Q;u5{m(336=^tAI>*e9%rg$aO%T1T+S&2U-J%0p-A@z-+j$F3<(!0T>VU zYy$KIIRNMbOaVp%j{udx?Z719USKlt3~)Q}1TY`+s|QqrJP?Ry`}@GNARh)k03HN> z04_F7{8v%EL>;qJT zY>NbWIWQeK3fK?An*p;y4h4P!Mgg_oFrR-N;60E{fk{AH;7XtZxD)6G{0-O-*cliA zj0Uo^5Psu8TEBhiJjK>*KRPF|>j0`Jc8zatNa;hVCxV3!p><-{Vbs3abvSLSbUmW* zUfefH`LHLUEX`1jaQ4m(3&+!kl%AagSvdTCIvS4WE4GvO*Vx0e5cWSlb(YSM?Ck1C z^JKmN<|SfhF!pSm?Mv}FF1|xvbT9K4;4Xyuj_?^Z+7Xs(3EIKFWxj&|x}LK=H{Oro zc&1>_*x5DyFNNc~8%5W2Zh#OxK}XOLhI=ABpW)MZyvDsEz5^s(`_X!^aOUljuCY$+ zn$?e8htjgy^$EVGl{y`1Xu+?N8S~ zmWDmQm#&M_4T|G*>wmVgX}tjt_$oMpS?@znTLsm<69j?;YH;} zQ=4FE@RTT}iPs3nw>2;v&zbn!#CVNobi7OQZQvVHc#Y>?<}qYG2IeJW=M?6dW7n*| zq-)#{uxtEZy2kgkr0WQ(6Lwx_1BRAd=m%O zKx#wG^DCX<*+?n!r!ea;l9}a7K0xLzWdlhGfb8IQ7NJkC(8be0~qQzWBLlD*-_&ev?N)ttXI!!_q% z7LIRG;cSY2DYSGf1N)bS7f+9~sH6wHmfDU!I{Y@P zWw`w40n^uM&TWi}Um1l_Jlu!NT^N;?TsGkRc%SLx9;5OUmv=A(AdymaT=j!Q$bH;TAxs`JI)9vJ8{TA~U z)b0W4H~M97{GB-eRMYBJ4Qr6|-9rL*lWk<<%$$iR4{D{VyN@J(DfeQ$kFkTGP+!}3 z`~c}^66ln*2g+C8x*HRdLI$pCWwg->@>f?Ie{F`ER4BWv#<7mAL2hOL%dJDiEiPiy zjQ)^bv8~z2=10hmCV`(J$}@*g$q|8%lDly~Gqf47rlc-I|0FAwYp`EMTLHR}}7ec9*Ylm@mALT2-F))!8b zz}e!RR&A}|{;m2gtDYq>#ApS(&ytjjTOeHn#0K)K`sr11ztQZjMu`2TZVs z_Ky#~FJ2)(jd|)YFy0m9*m+}nUL{9^?VFfRgZ|WgHK*CVtE64h*lNb^HqgF{iRnYH zk(-g1ZMIEo>L5g$g-sXI$*}9EXY4Is3-qzJpZ%_XKBho`|`_|lEs@6-Pl`7-Xz{DZro|Ey36B(v{S1=zgb;xpHBiEYEj;jLYD}PEh8hMYbGuUbUbh{h0 zr*(s6zuXXeFLZZ*qt*E!ycDywLd_eZa>mY^a|@gg3f60vVB`d6!6&lbsFdP#Jj|Hl`d1ar7QDO_>=qS#Ws z-tk&zXy11C%dJB%ifbm$v_0O_5XvX^Iv-QTwHYn3&>1`Vyr}+Ekh?Cb4YWVvi^t}3 zqK@pB0}}%vKc!>V!pmpHb|>dNIQORfK_PQM!-1d9h<1NCRZE)K4CDzPlTFTudqNvO zSu~(4f4Xkqe-{O6Pl>#+(w%p7RR!ZvgsFcG20g@ucYWQ%=DCscule zCTnC@PKXX`wNsskKzoG5L%X$3h%c}9iBQ@@|0s4Z^=WlnY;b67?WV6=L3~)j7XM@7 zktXvhw$<(q_E9i??XO40yyemQa}R=jB%3weef)?xP@F%0`z0r+-=!f5?+=ScZCnmd z>Dm4u{9(Paxt51Thd~~P@4Hw-{n~rZ@I546tiOBp)xA((!DQ9L`D*d4ucgt#JKZ3@ z&%nw{MX`_H+C39&p*+RQIrFqr#L0AiH^tiz)1U7b zovS_FbVeWb8|u1q@IJB2wM9EWG=u(CCU=;dwny~(?VT$BWe>Q2?r-uQyT#Lvjmlm6 z%?9G1Ug~mum$=7$V2z_4pMgECn%CUvcd^d>V0+j4&>qE47vfbr#03+U>+c)`^->+0)Ni8kwb3_&8eo5pKlC|az1Xt% zww!5gZ6V&PiB;kn@m$2Qxt*QB-jr?Dx{hBdcI%ztU9~>gs~~&Xy8be;d(JM)J&nSZd zC+GU?_ecGf_F?A)MFBexD86uh=KRF@k@ExRd(M2$cbsoI-*Dz}=5pq6zUIv4e8u^a z^9AQ~&S#uYIiGN5aX#jJ#QBi(0q1?rdz^PUGdVLj?{MDcyv2Ew^9JX2&UDUeoL4!o zaHeryW>j9{yvUi#d4cmh=Q+-^oM$*sbDrWn$$5hFIOj3Wqnt-L4|5)36m(httE=<# zBBz2=;8a)R@tg`yfm2 zoC2p>o5yo1IN_lqI|o(d@tg`yfm2<9$8#z;1x|H&9?z-Z6gbsdJf2g*DR8RG@pw)J zr@*N$%i}o}oC2r143Fnja0;AifyZ+yIAP9U=b+N220=O6%)^j)`C7l#(J^#@B$>@y z*^-8NEi-5I)B#!Tvm%9%w(YC*Rh@$Ukl?er?b=Rc^0sEaLQ~jJ3F}g zK}N11XMR`_;z!(DCe?QFX$5lfvY9vhNnpzbdwjpxfSjE+*)5Q?Oc^hh?FIW!Vd2W@ zDM6&e+g9~vdc%Gg-V9%A9YO}ECbSFN_Di)U>m#o?E@v2NKG`U#OMk47OT9;%hLfQcJ1VCh!TYCt z@d!*H)_RpqZq9-IsnBoNp++Ofv9f<0wG(QBY#_HwA3+Rjn~rig=K`{9{;t_0$^HO~ zE{zX4ft+@@O}A0x(z2YVopdn&d52T9Mw8(wt)|#KM*G_Jt6R!wBIXa)?PrPozfhhz zdie5X#x3du5Fy-O9(_**g_w&%<_|#*?KEx(53`z~!`)e6QFqt4aRf3Ax5(x=|%0TW2#-34hK_20sI&0hD_-U%e^ zeVX3RulFjRbO+YHYSR%5STm`GMWYvhpB8}|Rg zlxArblSteB`5XEr8-Z+_k~Vb`>3I59*z>~}@8^{MXc9S^v$<2lXw-+(t~(tklV+P* zCe#hXzr?GwXbnXUn_SwsK z6#U3|nGU5%;IzCMVCuisQ;`beuK; z_d^SV4h@YJgU7x*(RPw4$mwnO)r=Kq%x_bEb$lm~O&4$57bC_Gvubp=lLg3eGuI4? z5g)ltKQe5bJIJaU3(Lfat4}VzRyn#J$XO=S)(#ar3X__&{)p|#J3G>Ks2KJ5^6kgk zm_DuCkQdRS)`sdIH{_r^`b^*1AXh!PRow#jkC{f!t)oTvf=w4%v_d(%?%-AaQEQBLi9erkkx`+bU~<^dK zsV9QPF>NQ@nDe|T$l3)Hst1b^!D%)on{dA`jI!+;Bz{@8+g1NF?q}=NzPCJ39J9}T z&HfD?K(@O)<57T^>pf64V|;gzJ+|3e1&Fnd{Jx=H8|*K|rt9(k;-WiR?^-@Vd&oaN z>Y$%^{}0c@eGkHZTJR}bzr3HAX*Dk>RGv=4nA=KJa9M^Yf<=^75KFO>6#9rd#TB9Sf>`|X;MV}r$ zMKZd};gkUEPoK6^_PdLAyUyFD=VE^-gZibriK|A=NOx+B{hM5^;agWR+O|p4>F?40 zeOg@A?;>8de^cp5U(Da<4o-iJ`qtJ%S zwp?z-WgA9?HKW>!%a&Yj&ZsnJ6wJ8XjLRmBYGX!)5tj|QEaP$`MrA`rp#hicak(y| zx;CSt7MBgUtk2~dj7nWbp*okVa=8klx)P&8hszbYT!B$2&!{ZN<+5BBxLjbs`r|XB z;uDuYaQQu>kk6=m%jGv*&Sg~OFsie;{EEvjxcr<^c*dxF!sRS3KVnooWK`eh@;xqR zGAc6|g*#ln#pRn^zRsvfXH;M1@)a&$W>j8c6fSc40+-J-s?Rbi&T#n@mrru}IHU3y zqi~eVhq-)+Q7tkmQn;+*@&QI+KcjLlm-le_4=(RwRPSU|?BMb?E^lQNwlFF;arrkc zZ(vlcXH>7{@)|C$;_^yHA(>IRoXg9&yo6D)m{Glu%L};tE2DBAqcE4tv$>qa<<-pY z)TQ@a$Is{CoQhw0 z_&i4STprJMW2$4}((6L>tQay$t#k-+1J z^Y~$m3QlD_507IMI2Ex>R>tu7p*)^b5zWJ+csQpblF7;l9v{x*ITc|%eh3feRD|;I z5Jq({kLOeb@%TUMWH#}DG+oQi=wd;p{RCmzqK z=+EQ(@%X+xo>SR}hkNmGPK76vmA!dB_@h7zIvg{V%yMkYqKy&FR?x$r2&E37&U^@yB zclY8mAMv~-_*7EAar8@imocv)o?nH9m4$bXtF+?+p6sRZ##NR1j%lCowmYBhj`3%! z2_GDtRI(m>7t{C|y2_7^hleaRnedsGXP~G4ZW*60; zb}e;*qv5PqS>dthpAZbHBnxEIS-V3QYF9w{OBF>KGEG-@wMGPOzezQrESb62D{g#G zV~p=tU0s%VggVU{HJFyaP*+)wbQyN7?fdyHG5$dfg%%mQHT>?|h~_Al)z8!-hHI>b zw0++KDX#NKEJZg|G?RQkm z>eU3}+t%M+gCyIXAJr`XfU-KHN^~mA& ziJsH$w!!$+#xi}9wz$UeoHI|bel-l0`ef+BzUD^ds694mlB!Qu4%t^}{6H#48(ABW z(XMTOGI~q<>xglZ0U5ln{v%)Ku9#m#lWYT$eb~{WnGLP4Q!_!`F*lb*CNiZey^_gh1z#} zE8W_}_@dvT@q!-4r?iN!O@hr#2aN9Lh_Z`KYHhOFF}TnB{DvrBYiV7F=)2!>I+suH zH@8*RA$}gSwL0Wa!1f+%omq#BtF|R@{X}@a4zE_WRn#S;2aFm&)|~3ITD#=Bh*8+buY^IJ)D>yx!l zEmNsvDEempmfd&qRArUa-)Wktc&zR`_%o+ppYaX(uD6j?Z#k zIhV$ZRv|Kyy}tGPh%>Z*FSS@GBR4L{7HQw5_LOCPQbsoKSf{sr60P4Qn`{|LYO;Ud zU41IQY$-D&su#);YmMP~zM!mP3;y6-Z#|vIjnKZ7R;`tWWYF}y_=la)U#e`! zylfxRg!pyTzp+eB?KiD`QWFwi=3&G8y)a&=?4WK!T28xqYxo$P50uW1*-c2CnAS zQxe~Qt;g`wxIQYE_i$-S4vf>cG{1@SkFu;sLQ^tfL`vh%IaVlJ_DpU{2DYnmw0%tr zkc9=kQk#;Nhui)1DS+CKmZxAs#`f+C-c_1@^pzI1#Qhtpygwh%9pi1U7St4j5AV>wRu}zE!qcl4YKkqlHynCn zsSV1@udS#l4)v{f!ee7clzXN})fD#$=U+B$-wx%n*GWxL@3HrE>rFI%`1Qs$Mcd$} zZ62?s<(b@gWgvE+v$TEK6a}Wgd_y!4?S8W<=rGX<<;0u67>G7U<7+vcF+kbumbZa8 z^T5{1{XgcbK)!gZg@Kqmch+i)#`YMWaJxWXyl8c0!r;S}C^x)wL0`-rm;7q?74$a= z)9!537b}W6Y0J`GQMSxT)E9T@+YfSZM}LfPKEqvKG#c(b1VADRG)pae$f?wU3axjz1q|sc4S5Aisvdk-JI-6 z`>Wj(qAQxjKl-p^hZWv0KB=xNmK)poQ>;BrKRHdTE}pKY^P>Fvt{6Y#ig$H!)*ZL1 z=Ul0Nldcw26CDmJCRo>^_Lp>RMKy7q@noydT|Q!cXQY#A;+V;;dY%4-`Zp(E&!{RI zj<&KjxbPn1&2OxzDrWAUIA;758sF$9sVa79G9;psBfP%=4-9T)R1qheXB^r(#~tNQ zw-T#})>UPz>{n1Z>vrQR;)*3(T6UXC)2H4MD~mmSj$TSHPwT%c!@IIrbG z>MGiwyYH{i5f%A+ygwhO{Wa|Y(GhFeEFBo)^$^?B?_q|vc;xY_jOb6ae@q@FYKxOj zbltlkfwnLEQDbfK+NI6M>#c8q`R{%V)|!ynuti9fwkX?WB~}#OmYoL`htc}SJoT<1KK5Vv=FtvXp82za^5Xo~Cfaol(eao0 zY(;r-=taHv85imObDop(qJ6#Dy|%8U^NHd`hL(71)(Ye5<C06S;=XTkP z%}^frl4yzJQhyuus~>HD*;g6m#N-^~PFsdi`&suYv7G4oWVqezUNn8@?8fE9F8SU= zc3PO>{r9rPvf|d}L!LX`p!y&E+Pkb+*(a?0gK^Zp^>PZzh)tWttgqrk>$@&zMHx{? zXx!z^O8hXb+l6e^xI!u(}3(5nn7tPr-w$4rPbmg9ms>RZy)5Q;@>Sx;l)WLpUOVSS z?Po)__#wq>(W>Jo7t--D@pZxbl(?jy%PF#G`TcUp`;UVQq!P}G*72_&j^Q8S7@`k)kc~ZASqcdhyKbddDHz^|@ zZuh^ip$FDy-rIt_lu?u4U$p!gpSK9|cO);R%VZ-ZsX^y)<#r4zkmr;Gyd7Jn$CGE(?GmH1o_UOJVc%CwT(vpJcz0|(*-z7dviMVa2 z`_YExmzrPjB&FG^Y3m+E(E2C8Ps~bL^ytCT>>Jb`LOv8cO6m6GWq)fmo!?|16Cb9W zT`}}%>eI$p{>hI8_fxhEd*T!nNXLWqr-FMaP3!Jl*75{x-^ovjcT>)I`ZQg9|EXF|uJp1tUNr2JBFBIQ8- zy-9Zis6J!`1&31B>2*n02h;Y!?;-9<@eWC?+O#~akFua(eM*&TvwHXbgU&Bdg`!Wb zy}$dVB_1U&`v%NkcVvX4|E}rgT|E8}D|QI&+|lZ)$Wj))U(mYM$BhoPvdNxvdl#Ge zE|L2xhdVB|$R>ld2lSqhG*mSyF*2)W$7~XLYIxlStCLi5lWJbx-anfJ?uuV?FLtK< z&fD8&VbR&dM84x*#_SoYlS|_3bov>72Xo@iZYh&}0{mWmr z1%1pWqYm~s`eI3#s^R7h>~s+G`>Y zSS3W3SuSsQ{ZkW<7q7|mJ)_Dl%$TjZI>T>D`wBT^-o&os;!n(!&%ZThwrk@Y@?!10 zd1E(@m)rTpM~<}1Au;7o>>j&)k({jC>3+Uv4q20zm*RD3n*8?Ydx4$8a>(^3ibbss zj+c+~e{(luVh$NomCUerTdcZ!r}3L*%X5gA-j;1ydXwcz*KedI?#&^q>)BnsRjGrj za=8cVCSA%QX&r8Qb}5@A@6*C@xbsTe%eWVYCm5UlwLk!>x^8Y(pn^+`Rj7kyA=;@Z?4ZJ_ulwkZSx>r^>Bm!5z8aF z@M0NA|Liu`&Wy5y9&m;Hy_P?a_`#hCX(1leuYP}&Z=N=55H0&4E zc=u&}n%ll1o8>ziri@gos?Qm8dQHzaWbwlnua<_)RNZLyN1HBD5I?tJ8H)pp0TyEzN7(TN2>-&UveykNjNw#GvKLZ;4mH zPJP?kOH|^G%JF*Yx1>ttg5W+=V^l5b1-m06!CUgS+T^Cy z#u z>vhQ|AJ27IJ@M)k)r&dKORk6Hll^bgmgFB_p;{C)?fQvn`NaN@(Yc4`Et20%Hg|fs zIiHwxo80I1llk%)&VSTuc_E+tcK=Ds!B?VHZHCuewDom9314u3mHydD^5X@wD-SSu zPmG%Ovl?-And;%ObKBdteNPUI{bSq-?_gE+UMJ5u|MZ@;%U(NwbhlwDj~;hcj34u! zq)w_odO)3Js{IvDN54*fPg*`YKl@hZIWz9%U;L$`MxJz5TD?z;Y2?@6TF zqlDAO3G%>)gGL2a`9NA;X)wsO|6Elo%dXFtSbrd!+T0p5(0aanP*ca9<-9(SyB%iU zjBK$?)$ey}{pBM*kmLTxPLDmaL@s_F;T5+01F`x1uG*;&N%E1om&LFnA4qEWx&7CExk2T%*u4?s>RJ=CPda%+@ zW#9kd%$WWk$^D4^2Qr2(RdpHsF=trfM`FL(bF6#6cvaU5E3LP${Yb3LJgZ&)v|M%R zP`9K;XFrmO%PmKyI*ga=G`cq6aLz{(vowsH{=8hZwAZBDOX_|iw_QA@2I`KJk4!D_ z-lX_MDjlDY*|yUXdAEywtzHLzg7M{2(0$4r`5%uf%!~Nt6LB7>bWv>{Di2M1bxXGA z6S?X7of@$wHx26*&R<%@>GqtMr&n-Ta z;ggmP9p$o2_4AsKx9ar!Oe(Y;aINf%@$!WePSv`v{7kYkUQ9pKXtrun%bVpMZTw7H z{t*!>7%i3i>?)IMc=9A@dDJ zj%&7if$A-p{@BXn3;E^jM&;Dy6XX-zPJHY+@(Z~;v&!ivSLVoXB&}JsZOs=l*K}!Z zqovDLuY+e2uwW^&$%W%334!`e1)T0lC^sw%Es zIajXe6ggm+M**3(GTrj-XztqF-Y!4O zUl0AI`Qgh2ih*x%4!t7c4C;i2z*ne_Wzud&T5e7}u- zSiVL7OW}+~^)DVSN!A_NmBj1KEs~d|+z352zo(}l$)cxP3 zZ%HOA!H?6^ygtPHAAk2@H6d@tz4mLP4e_t~H>$m!-1NLa>K#P?;EA$Hj=zz~ms3yn zy=3ShD2`aRYPp3pcD|l}b0plKd^Ng;>2@;AW1H#pT#$WUKX1Hr2TAkl-H2pD{nUY< z>(~69{2Dw%OL?y?#2-^Oo4bqTuJt>&`DhEM?~}o?<#&@6V^$hnI8qz(>pF9I*d8)6 zGFdOHTm!iOL66E;_mc5$Jz z2H(GWQr6_DikvxPHQwyvGr5o)erT6d3VG6fW^VO|O`-fDJIc=#$@<}YR;`_7?jXqI z$CgB>Nv98YU(Otd&o}ODcC31cY|WlwilZ2lq_GV>Z(zdKAi_}8m?;*B+YA8JJP=y^v-Kuo<6+;t!HmHPNqM*mafVP?U|vNB_+&!sMnpPV8xeU`**el)N1?rQM;H+|oaHO`UB^S92vXm z(I}{&&)8lLwa$|VbFFehmx2E^x$G^A#plV-ug4|5c?R)G^M>_ne1Ql_wVyuQRuRg- z*;u*g0tuO)^KMLR6KIc4rva5xNn+F9Mgzh?-&r5qDqT{^alL)}<_-aS++f(p=I2zh zHCG&S!x!qecSysb$5RRH8)kNW0`1*!>D={#RH9t=`fat=VDAZsQ(7o4lIi=KILYKt zpQO;b3r1cfiw0U6j>rM~@3+}{emdu-{s_9 z&Eyh!-*}Cw?%0};UyXHsewT<|-6~e~w(B_v=^fQW7hWPG+AiN5+O9d+Z{=Z!u3RFb zcJ-7yPwl}T4y^yZ%4O0reRthOb6`A|Hh*c%e{^c-$>&4P?5rDf{*aidWU@qcVYGvP6$^OqM9ym`>A6%=BWiMAL$6G+v_5HYQ74=*?t_snwY*QF-JlyDj^+6iFU!u=CCQA$nW3t423noiUcypQF zFHyOl$r6PLOqQ76gUJ#TYV-R!qwim0?cvPa$z+M?W0@?`r3aHG?rq3qiOFD}XeSb< z9AUD===n^R*e{gH6891&OH79Ev(o%Hg(s<0mY9B+$r9}rF#OJJ{Sws+m@Ltw zKa(Y9)?>0npZjO&{Svd+Fj-=B1d}BSEto7(`R)w8Um|=3gUXCbcTj~l?qpCWmHN8& z=;i6%sh@{?FHcz{{MFgmXkY(8+3?WFn7B%#D#_pz8W|oM87T9MiVBzEpJw%qi;8h@ zFb#=~i-AAFD)WzujEysqg$D-3S;$HR#)Jlk#F@z=qXHBB;V;|M>{zClaZF%bd`zS) zHZH*4emKj`dst}Ta8u073|6aBqF9dYX-;D*{pI>;mL=8vpH`CI|06Xjt?<9EHoWsc zqNCydA-*x*aZEktvj3WTN|gIw(##K;HSM{``0()PIM583rVRe_a9~_uduD+p^C+JD zTce^xCZ!EC`G0OUM^KiEsf2F5qk@q@!kZd#b|&j-}EmMz1-wQR{oNlTR>U7B##Wxdv3Hs+g4kmKJO zyG2FO0%UT!u70l=`9E%wW=Uq>E6VX77e&`BK743V-_+i>dg=!TbCC}Jh3@)GmL^NmwKv1r~D^}*gq=jFZ9$uD(A2D)ITh$ z^qwlV>-p|NR=A~+PFY1~0^GtB%jg^X2|6|Wm3+Rt`23ZOzO^0rvl`JgzgW{iMSfprd~$Bhb;`$_QK=C7dz#_Ms8c;l*7t8uN_5Z=5$5S&5ns70J`Vv`Q;f zS~Q!`Y4;R4X?)}3qGYk5BLm^k8yn{v7wQjx6E`+a9v>PR*Q%v=oFm;5TVV=QGg)(H z$XqmIMHeQ^)shUi3&3117C{%p|pQe5;Pta%!{%prU_Xo z1ygkw){;qFjbEkKD4KiCXcOb23Ok*r7*h#M=f|CTk_AbAz2<-6&{D!sc)id{?d`!S zsA-YR@R)tE&Moe{`@w2xTCQZ%r5f$OTbI&`{mumS-`7itRqVf@k`g8UPio_DszI~2 znLFBq=42tWF)JKow2!&R?rYjBQ}{VvQ^|roOI^6jIDpPqQst@4xbC zO7|4a48?Ewb0^IAbtL8gb)9~AY5LENa@z0G4D;{wBFm+Cca6b6HAFw(UG3unVNUgp z3zW&@MnnhVzCh;bNVN+OP2&CIWI?bXdxydwoX1BqC8nQv__O!HGAYs=NS}84wlW?d$I!7#mxdg?F59aM2oEG6$$ha8%3)DT~m^==h@2OS^TLZ+Lv5H`bjx z&i%vj(v+H0K%jp(M9V!LP0g&j1jcoUGqsjR8Ls-Q?10dqpum_wsJWC2_~9|oJFa9k zqoZJ70^0)z*|4b4fReE>fjl3KFRT^!;$wNmGzt3|>B$wXc#v;=I21?~{B>ea$zJ@U z!ovgo<3gh%Eo9OziN(RAw1B__ja=;u^TPZhpm(HOO-+if%`8eJquH3U%nGAM@g?=E znwbqLjVnji{99*(NR5pv_Tt|)qtfa|SB}CFT4+zjEsGaed|XrWg2Re~Eb=cI%->Ow zW{a^z%O5DRaQImM({|IA!olPlrIze*X|cC7Ev7JOW{Zjo35+r0bD14AP-@ z?@qluO*LmWe0oANveFDK-A*(QoF(e&2$}Nf)Uw#Y^s97IVJvm29bU99NE$GQxq%wk zH=4)0RkI0}j%)#w>h*&q4H)#zPX60vLyv2!PFjT=O(QiISB=@bm^%hu?)cy6erbBq zu$U4{)3=%+{~v3CywK!-umO($V-0Zps|^63-aj@XKFADB*)%4ZfyP|%&Hn%QOXnK+ zfx^M*_is0y+fV6*2gQU2Mg|n$yB01X&A*;qEJ`E|{qqeP?}^Yjm|4EDfPJqLrL1HB zs1lZ?R3bVibQl~>?2Gp2d`E6xY-0_(OMd7rnxCcl5fakj32CfZEVv@+B>e3on18r$ zY^*HAH`bfZ{xtQd!il?-`@AewdqFu%ay z(8$8WtZ69+Gc%c`W0C5MPFhx-Lt|p&OwE{sx~Lmz)-i#xaQ=hxzD}=kC=3Nhw;@Yv z<>DLLF+K(ku7z1*cNArd5+7N`o!*7^!(&-~+$6tkk^fY2FpCtaZNPvC-w}R+-tm#~ zv4H`D2FXg*qqGbBiwZ5#YCesBZKyKOQrh$bwoq*T1(Tsh_#<{9wWq{5mg=j~_ZBj1 z8Glmo->H7F-YKm!ex%MCw%eOMviVQ7fsGle^HPUk>9wUJKf*UG&>Oq~fibZ#{<&Yv z6o+;(9Tc@i+SUH+9l-~FWWc}Igc4Tx%|PH>KECthPY>$7i zqFhh^URA%PcoVL8^dsZ83mQ|{6W?kMYdX)-N;0#*+uX>gNM_33|MQKOnk)@I&>7p3 zQEM#G)6zcZ-|IuZ`mt^*Ro%4AfWSByA^&=@Y*N5#t`;$!1ri28@e z2f$Ni`sKeCe3Gy#nj@@29A)q_7#s&>_!v+IQ*umrly895H+3DQF(y01s48W$z~NHN zws69T`fA3Y3yg29Ddu7>gJ}s?fqzo$kCj?DPenP(iWN?a9#yH>_|n{6K^e(_27B-q8e7=P; zEFF8|?$lM9D@}vrLj&k$6612uL~bB z{i;J(@){kgq?{eSP}M|=BHwm$rwTE5gt+aRuD9BlZJf;F~!Fu(GB zMo~ozlhJib4cKj<$8YWcFo(hd?O}rp ziQ#>lqL+8sOPU(XE$oUQ4flIuX+_hG#*|XnI_ZL)RN<8h_F(v{GNnhan0H~bi?YUo za4LkYD^7wa;^%uMntZ!3s&e?Ed5CXhaGawW_KmV|9iVHip@YnXX}K^Zs;YR+FytGx!zlbvTL8<|P*0KKS&~xw z1fw+i1x2<9lz3G~BaPJJ(zNh(Hx@Rlc$5BP3i!UY6xWGHqkg2}uqlJ*Bk-)OaA>3F zOnRZ9aAba?#l@F)8FW1Dv!WVl)TT5Qe{1IXW^tuj^N+N%v|~e5k@HL1vi;DD6l_NF zjis9i+ThYBgdZuBubV&kq6*hHs{p(8A65b{j>w5m9ye;fr}0d zpl>Y{}Vk>S1s2=v16I#`&pT9v+6mW>`QGo;1_@v-QC z#EmN@+>a3V>}XKFl$Ms)BdGH#5;(C-5fx@E+7$;IRFUrl9NY zO39Nq?dx2>)h-Pa;ahyPMBLF!3r}c(1@%jt7rI$k%%52XuL>QTUmY1RQ&vfhMrhQ9 zzoI}#M(l9k=)&bt`r(+OnT)+6{b#kIhDUS47pvh_GP)n4_cGz@dVK9AWCK;&fc%&m za6w}8Q{jYKy6JF5bqEOPReXDc$%_n8LrJtc#n$gX)4~r|2Anh+KEYyT{D38~Ej9HY z^>BCX;RcQ)_Gsff+5TD8i?6@D|6reH>DY_yuQW%xhLYIKpt*Hr>!WnU1^*AE{@x*g z@ApfaK}+*bNK@Qja-SA=chXq|T>;?ODteF@aY| zcT5406D|;rd{jG{^4wT&a((@`n}}ZopiP7=-}f6=e3>a+M&K8vhK2fuhr^>tcz}rC zZ3x9zK+uI;w0ab&2uBht2qtIA0NC&<9GpL5Fry$*)KxjxiQS1_>?G*(C3JAdE{JQN1}RR1@U0j20g2@&a~fe>_t9)51+mvTznkfGO- z@zFxhRL^CJZBlH7kV=Zm2d~3A$!CS6xz^>f?*A+=l}DrR9zkHUHZ%K=>}%^ej+sU* zHL{^LmW28?gW*uD2B+K)6*W(o6gUkJ^wl;W*JdKg z>yAp1mXL(}IYCNDMnT192>}iTgVabK;&1%e?*T1YTU*p4P>YCE6ZMrsqmr@C7>gq! z0qA8IYdANGy$K8QQJ;0cekHwMUaYOcSX{1NZc8X07{04cs6Z&@q&xEpyaww+^4_=- zh8xC0QmBvEDe5cMG~anLKjdu5fZ#mP)$4hzqUdQ4dzjnD(-XuNczyz@I-zrEne4%~ zYo(|0qnnZ3u;lUioy+W1by+0-){;n7+m8(RaLciE4-=MfZytE1pRH#gQCT;22wX_}?krrZI1=1}*$H?yxub<#58N<+5TE~YM>Y!f#k zoD3MDI$Zfx?Lzx@>biGmGD{BzN*8+#63r>mKL^kISpFqhJ zq$z>xnm_Ynzd+5VYNQ$FPUVeD%`F>Y!z@Ze26xTYPX?pY zsmL!4z0BInEaptSu0C{|Lj{~9kS4_zjnL)Ck6Sz2kN!`;ck70ozma9tCN0Z<$`oYF z;wIe`ry-C+1JZvS_FWt|NoN58f{l}^psp-XfkLmGWY@#r!nu$EZd^UU0ib@?;E%}K z3o*12!XlK7-pyN?6ou2KP0C}(vKph^Fa6WN?QpJZ))?*u4V}YLRGs)C^Qm(9eimYh)GZd=&K_TxFBmdiX!&5sJYb}^%y82;t zb@g`j#xRhQ^AY z_91iDjf!|YAMTw^MyDUQkKp@Eah8I|B#2GyrHqjcyx1z?;!J-@5U1F%A7Danu_+m) zf~~VwWQ8mjYa-Ycm`b7hDM>&ZL;>850)P~^cAh_bY9fFQQx2IFB9iPmnN)t`C!Pfq z^HmKelQC;@9f8l$?}(pSA2t? zCMtXi){fuDoM(+OT6%=;u)QB0-?^>b)isRoC$CDsWyqSqO(bl|W9S5A?>^Z3^l zAmsWK284BCZz-(UVsClBW|!n>a%@6`@@9OZ$CtfWpaFsW&wDN;ES4=xmUsw}vp&RW*{%bMpd3(gEm`dvH2F8twTfyxk05$-Dg7WPFU&#HTYqDto2wCLe2;F!pY93XGbW& zus2<)1@aOtzZfMdKW(7Aa}Up&Do81*I+Yxkkgd#4|c2B&ZER@k&-M|d55?VX(T z4@a+XDsVCeX2(M!5u_d;0<~Ec@=K|2Fz>Xm`N3)H!&b9sBB6@djXg&KTDF>-o*}@F zYB__$_k)kDSgHYz?5S$MuKq%M9iFx3@=($i_2jA}7m+*gmjquPnBf6p zPTEBjdPZb*z=Ca&<_g95kXXT;G%Y+OKO?$y#L7`U`L%$E>rLEYIPjQ#E~Z+jsQ!AG z-d+#VI1e}(GNHHxnSlN|&FbvA-$QMNZ(n@3B)O#FnNF#Qd^~yZ{T3SRZf)*vKYN;- zP2oC@=3{P0F^dDM%Fsu4(;mV~r|<`GWWTQ|Gmr`9>A_)<75*rCb2tRPgFP@4#%3K0 zq@@0{)Tj~?&1iHClsMXSsE9O#piyR)OZG*GNy=s3C10LtPd7S^k&X2BaszDxJz>AN z4%etrFG3PgS!frR5DQFjAH;1tmx$Vg#QC z2a>BI=HANmYy`^KO5Mk-JcYla0}((q-L8g|o<2@*+e_0S)NCIw0U!UPTpR5X@4WS9 zZS7<*863@kbZ|E*l7NkBYE05dYv|%Q zjt}GO;SV*)X<}wPMsG7_Z~TOoJ`@w4wZC2HF;l(zo7r)3mfzV&-CUGzNk;8Ff+SWh zpBigSsJ3bqJS*N-zP3iQ&AdRJpnU+w8Tf($O2Q}{=Lqf;G?8HeJCEXD$;VeCrQh=t zb}L-)(8i2NaZbA@7z4ulAnaf^fe#K*0*iNps8!7{68dztx1QARMwQ;Fxo~8>9Skj4 zW(UJ8t3-2xNZ^y`E!rg+e@Y_i?3StsHA>31E-}S2k*6!_TfnVQvR3F@AmCRJog*oX zA9K);QJ@P69RD0nu-L_YYOb5iW3IFN(;`_I9jI3^;}$Jeh%$Wqkly`nrZ)q+t@)fyP-2_0?nUu1H&g-M%Xvv<{ottoo$4eR26K3mVo?Dg!`-0{o6}FAAt>b zF-^wbE3PuF{pmt>twjEGA?-B7{}dO}Li91V%^*n_Td9UfSIrKKsCJyuFIa5r-Zt0< z(~rk{daDCAykuIM>4g3o5w;ws3&z=MK=QA3W7>?l%R7e1xa8U5Km zKoG9Rm9##pbF|a*j8re|cqXr+O;|Fi%^i=6P}C)kh+Q~9mlp16P`br;jfaA4V_r^c zNEgq!3QQYp2@$!@;M>1yh^Mty#4FKDUS2qu5k>G@#4=*%X%XHU%7|?>eB!FRrzdXWa&u{#4m17v?%Wd-&qX{(NV|if{?Tat!fcXMHIS4+n_5ZD;+kEO~B7U9G*Ug&?_hq;6 z5->k*KhWi%8eU{TsDB8gkV>6W>Vi&fzIeX->`7U#etLtm6so|@X4ET7#k)~`3^(RL z&)$u2V-D0Is*#ERz$c|-atw+jI;glqk&Z(lQ+XVr;gTJTRpEpPRWE$Kc@t`5>EdJ! zG;^1C^5B0|$Dn2rkfO!m!0US?pSPyqriNC)hA*zIA!h`qCz!sBjK;HL?9MR9CL^a^ zEz#wk@TCc-n$|95Ga35FB11{^#$WTK`mf7s<;8UPM8?)*=tH($>d@|=o#5KDA(F~O z8o|3*?`pr!5?u9-(*oR*qUQtZi!U0SOykOpsefGv`pug&q03lWn0Cp{(u=BuYr4Iw zob)<@phy8}Wu0{zLV>(URJ04Q4_^)T-fCVd5_q>C@HbS>)+}}0`zaFh{Rk3?t8y!8 z1}q+a-Tv-y{AzHx9X4NgnSj56eVx}M~}a6A1UIsSV|-^KCJViK4B?!=XU=T z$86vy@|ajvxcn&u#9XQPP*OBZLahnJ#F4=hBpZi&q-wI<=#BQ5SgOu7DP|gkI#Hz; z6y`H2^(()pz!fn_{N^`)mX!i1ryZBrL#p_C4K-ACWtwy?bi>!nwI}(DnXblE73If9 zsrN=f4hKVyyZ3QuBrbT1GK>nFgc#6^)_A6T3}xOT3)8M6ta%oKh!whu<=N-!OPm?; z3c#r&oVTHa^-Xp2X5M$kE$WYJj2qs&q^k+6nEFPJ4ieyo8^0Rm5qOcm%`vhwoQ@As zD!Jtzg@p!(p&-`e=Eir!(^-QUc}2Kc!QeNLZRRKK*>V4}#ZwcOz(nZ=n-TmcvZ_A! z7NuX4RwTYSrO|$%u#LJek2d^q ze8`c-OfU}d#?=4v7{oqST7K#oQAiynB}`GiVl)Fclo%r<_;d~1A6oZ!SWO_Ga(h8L zQqaxcA`<5Y(@raj%S%PfqO=MGWuUDI_}Z|CRvINOBxKNG((CUXPDlH=RGgJ!R#)%b zzGGEmR@1-yb#wIwo6P#p-Fww9)ZfVbj&XzDlXh6)km^mXqRHlXQ%>5Ttm5h5cn{Vh z;2g7_Z(!JbxxD%K`R49F`rA)`*m<_uf4;SY1v3lF#QC!5uCPW6Ag=K621k(`la2&X z$$`+iH+o*$oHehelyl&$aMYZwE(<78$3@bDVWffh^x9&1@Clm!< z9*-^fJa5G(dHovgt)!O0T;M=n$K^NOeuWC}A991M4^l&I!wU zZ1?$8Q)(-k4P}TD9A>;2?}&M#xJW1|c(^PEcQM6>Ef>_yyc%9TzHSheoFkHUjoXn# zP)S)#RI1%Z6z+RkxDG&;RPVgh&2Z{han}&X5nM;ywj_0tw0H)r1-8oMmiw3#Y{!K$ z;_~Ku@yM4P?hgn1f()wlD1=U=9HLry2y3ZtVX_rj3#yD?v6>Vk94zx8IJ!UvmBgwT z6dE>($@{@HBt;CK#Xg>douKej>A{bq;d=p%!*R7EtNOKhioh2~s3FQpYQ6T1WOXAi z=N?kTCZnyUXf_^y)0zqe8cPSC<+!^ZA<#+fiVG`rSa=(fttAy`Eg1y(L=_tdUWaKW zPQ;w|q;gV!isj>QKUw^ljZv595Dng;f}|)!)7nN00mG_HFWc5d#27)D;>Xk6g{P<*3bzYYj*fRm^m{53}`;AD->(%2IiHf@ANxr_$~Mwi{46 zu>k~Sjc|w+`ug{0Yj(es67qu(hryQxkmIcnBE*f1#;aaq3e zPBlBxbzvqmxh3f08~mNCYdED6TA)VU;1H!g@>aiW?1n*36EEH?PBOhAiu`|o0N zo;6o~4bLWb3+Hfh@)s5#1+(0tKc=U10XAQ$`*T@|{QKLbi%MuQv$24+Y8TmJUH&^; zs@fEivuqASHS_&H?bh0MX;jQ)+9!3Xa``SUpZ}RwYz}!XW>FR}Vl(^p0$dD(nKljK zrj%ZaS+o{kYKhNhG51qe;OEE;pPYp6@uQf`ej6OO^&9&o?uxo+iZj5({+OH zBjx3`cCAsP#+Ht@sTuTbr~8XsWy?Cf}d$}+>`1V0+GWwZ{+0bU*ca_4eI~Zk1j&7qJy9x+G@| zdVz6iTQ>Dao?A!^*sOpEU-~QU7!OgbF$$^m^&eSxstJHw{r?fGzDvnlWVCCNz2)KS zB?VPq|J|zns@JP!O^Yr1y|AxK$`Sj8?kr`mSpzDPYZCM8OGx27NrKhuaYuRyS&Dg6 z#V~IwE&Ze7J7t`;o9yLOK0o7}+`;wyKewOsR#sM)a0O)#H6Ngr{r-;+`VV%#d*1JF zEH5uz_uJ0yH`7H%l9|Qdmt5J0@u^;Di83Qmd`M>6-Fp0Z`}x+>=Ue@LjV8h7!HeBz zijC{YjxgkGt2O85Q6v-R9G;F(hij7RDW`p^_v6Xi0gBY)bc7uDVQR{BcoWBNU?$#S z(_k=>q*I*M*gxA#M{(TU8@Ik%`8%l73piFj`^(8>@cL*F-s~Y2!miT&YW40tko}3U zxVLg=E-dcezIR`l9}cA;i>PsJg5+4+p%wc*7W2m$C?sIVA9uE%zj*TCTb#9e^x~-$ zmVVxU{^AGjzHB|LYqf}H^V!a`7rWa}w{Wuq%3qESL>FMj4{T)V-c3yr!o&1NdO^UZ z>mn4ls*jzZhtGa`-VeX@pFVi9_56nin_K;G#HKjchTAD322DucZhg1?)We&#>r}io zer;`zZnmC2be*`%9SrXPBHW|#*FsUmM76i9PLT@mO5I*NzY7pb{7y!%&QNi(-%G#*8m5|p znFvUDEfnVU!|4GrO*@aMFb}sL0pEvZ`?USy>Gw~c{e-IrwN-$~YbO4KBVM%wMSwYh z(DdLWm7ME)GTNJrr{jZD6t~79t-;~Pe-3%2&zBG|wl6K`w;JqgGM}8|8Xdz{9aRTs zyzUFvBGEMANaApBMCj9%&v2#JaB^H-+r0Lf2JZDf{+yA(KFPc9XM0$ltT0VX|M9SZ_FYOwZHLB*$Zr^}ji}EqM z+5Tely=Xg1N@ws;EfiGuk495m8ngGN*Q5)XiFLY&lmgdI=iE#-r;lkh&*5;R_^r6z zQuS|q40iCTy3om+l9Okew`V-*CGqsGGh=1xWdQlJPigNVSr#Wm33%z{X84nR{G1XI zYnx)ZBNxE(PUZ|ihi50Vr25PB_gq37XVIRKJ%Y!*`gJuT^w`tQ>ekoQ7hjCpdSKEY zX?{8SneRmk@jbo5PII4;Pt5JCA;({m+v!lX<~)|Cq=;Af>F$Nm3N&&{Q#q+h_v>A= z#cqfBQLbH*e5u`Lved56igJDUTVvegde@DcI`Y+-1dxBDi(?$tzeS3ZjO2KpY4(yP zPy12Lls9JO3TX%VtM#S3%NW{qYj-O*ovqrlBH)g9UMJHn4=Ll#W&gE-@OL|O-5~Sh zCA4+E{u?UGRkI{jENJs*l~QAn6+W@{#UwJB&Ezxz?Yua3q!f4|9Es=SfQMtTS_l zbg3AZDp($K`P2<4Dw<;HE)waw#HEpD>gdeCh?$xRzPP~>k3A-*KRNtP;S0&9m!`Ka zoX-1R%Cv_9R~NhT#lcit&?wgBY{>j|s~uP;rpuvPkik`6{Nhk<;lv_$zc^@D&VaV- zUtFIvy#hInLF?vA;kEe}8TN}@0^_lnIj_)Ca5-+)=g)g!>OqH)`t2?hOa7S|spiUV zhU4ba$3^UL->&2ym{M6crv}Y~sJXk5EU!^~HFdll2EP{%Ol#da#4hNEHQ_X#)MuHd zPu6(FduELv+u=q3tntpL^wQ#LCY?Y3-QKa+WXvU8wMaO^pE5_gvN8*ME=|n39jcTw z<6=5A=B~(O?^8Q)9e!I2UGq6PQK7Gxs13NHDzVOMFq-(!HI?ExyIfY8xI+?>edRZP zvOCVALb0ozZw#_!dVR2B^~Jve-JqJG}D!YOzpR{c2pQobBw@B0c5aLbX-Nx0}-_(40u&ru)0s&+~%O%@j!8RDka7qM0%cLzElWH1Sd8ADr+cm2Jd8TqnpWNN7b!m#OyN$BU zsEsn&Cuv^bnXd_&LZo*AeqoOVH+9ENRkm|pkHFU5Zt1#1qPqMvxLuPbPOy*Pqezuh zV(E`?Tk>nAzG%EjPn>C5%N0S0gk zLfv>2JgM9jnNTRq;Xg&`)8RyTp0v*@EumQJWa=smhR25}QR`SN`<0n%*hRZBwg%oA z69MUbwK)MQViY?+s#vfW;&MyAoU7;G>!&0_3;@mR-0vaH?%NmNEmc_Pejc7_q82Oq zKlq;6db?p0Iwa)INCaznmzC_eOy+6~*$T|u(~HdatDayW*?6C~yuH*&ZMzZ-ET0%C ze6Bbk;c6xZlE)U(+1#>abUZm-TcZbRXBW&$9}OnR*sCd(Q24 z3nL3deLHOSXTIYe3M{@wW+;l7hu?)aZBX3e5y|@1b_Oi1F3M+Goa_UF@xT(GnK7~h zG;&I5Z*YntyVQZbLmsKowSXR9!EgGNKf({ha=f?169kA_)X^V80K8%&cDIr0>1>8G zI%!>;QKh|&4kU5y(x4Narg|Cpb%%_)(`3W?F5cQeHT(Q$_874^_rfvO3$*g<#44@KkvU0W!$L7J9jW9OCv8zmLa&;O z%=xk@?;ugrUvyzMbq;oFOUDAdO=V+W-4ZDYbCQ>0dIsr3$Lu;*a&j(O zJY4LpifJTjSJH=KW?lFJkoD@6z6Ir)&7Gpubg3yhF$GImR#dYP@aV^{UNR?@st zd6>Cr3Gb@$XjeH8VKJ=en!~pbZgzpdS0|?vzbvnIdw2r1fCD6(B$Mfz(MkURx0Cddw3`;T z$+)=1$iK1<65NPDdW)2}{S`fssO~3!iYpR%b$+3~lliA6Q)=|GMqIUr8Mbe>A{NI* z&_ImCK>xZ2gT)bV3`=wD`nFBtbsHMDjRG8MAzG{QgecvdOT6fUNRI7xHvnt_H$QXXVz-#W z;@^6xgPI_2`{+Piny{kCFtgbX)2cYNAsw}#_fD~hZ$3Xv#$%{ibeh^(=#M8@O-%{| zKC{hA=Es~Jzn@qMV%;IBjjT&L7B%3^b{26NF3}s_)g`i`AVJ&N?#GN5I}Jc4*9QHv z@QUCYKSO}gJ*O5o1xWb{6T>2Vi2E3@i57*X9G+pJ9x>FECT?oM4uH&tx^8c=Wki7( znt$pRM^FOzL}bow#;TpibGSr6US4PAb2>GN`bJmCDf=!08~ z0Gq6}bRnZA`DUc++CvPw5thS4L(6UR;gmUcaYKEI8LW1Lt$KKNbo3F!+bgK6K-(OQ z;tM)9^3P~Zb=T4Hur_pQk+vzQ+3ul3a6Sa0MXV38rtGA9)n?Es-yHfa?H4eh!FH() zsc{R8u00WrB>KeM@VUH!Lupn_0=(hVqEaH>Irj*2$1(>s%a)}M7j@p}wcCOVV!Tt` zbzE%gvp`k^HIuB^YC*Cx(?!&q5xqskk`Ib}hAcprixF)9AFtY|o3U<}*4B@<`foU9SsQPW7h#itFbJBHqew^5n}6yj(+|*oQwt0moJY7A72goXU9CfkIPMn zhOA?5RE^)l29WJy?F~?b95Yrch6utXvGjEE!E}R?2Jc4Ly8ehd2|90&css*8O!uV~ z5$B(y;n5VAtjJ;twT*ZfdwkH_UE)#yfJI}u(-n~sj?ck~-;h3+9cODeY%0yOIZ=?m z8^~d@c(^PV*rJNUL2ujE)D>5!tt8tHT2?4W{TFl8Ij5ACXdAdol3Sr19nu4CQ^8{R zDC94+>umw=moN8+C^tlZggOf{!jgJ1GKdg~Uw^ovNSQy|syRNG^3d#$cyBy{i|Sh& z%cyxFG-gbhhy!8^Perzi!;Sm(6kzOU19z&z;%OTOg)INBcL^3CP6ksu)EHHP;FUM(I0NCi)vgb zEs8!hPk7s6lP`!G3~{G!2XmNy!iFnRT&I|iZ2g7n1fw{~u|x>J@nfb?$9s4S=s26r zX3A>*#gDyI<6KzSt*wc`g(e|E6`L<6FzVqSaNU}MU~mJ3{rW=tA}p zlWiaJJA3aQsqrKlHLJGn{zOBg$tYRnUpY5x=@n`?Bbf~IhDl=zLuyztoEaWFMJ>d< zoA#>KVekv5SRLC2c!KRhy)h%h_YJdP;rF<${XV6qAq@zwaCKh(}qgqZ8)TnJx&SlCP zZzcIh*qO@9yi@Z6yKH+TCbKIMegXG+Bb2jfG`*ieAx5WoV!9dCEsG5OCS1%&q7Ga` zVcw1tWx)spy`%K`$$ZTC;%p8TxgLxMFrZK0$UfDj92N08(y95c*&||6Faj2M<*)K; z3UzYPvfySmj87N>k;Wz)YO~HRD>ZRkN95Jp^q8$p0x(9lHEOf(cz=-e8Y5ckoXvI_}&?K1(0l zt@}KfS^e*`;pF3XSc~*H(S!Jj4V1cLxXd2lCP}`lHO-~;W-wh9Y#lsEhcWjr%whn1HC4-dR zGiv}C#tCB20rWZ|BLQ~%6309;gH^PVVkm5)(qnaf9O}VUMLY|Wc{7zitpS_KV}EGi zoF>j`lKHXi%v>Q}7uIy$*kv1bSB+(ED{Cl+qk0sAIojJ#$Hxz040t@{__aIj0{dQ6 znsB(qfhM?CIC^j^RvU$DYJWRDLskZ1G`Si#N1$KptzFb7?QHQ_a|2Zun?1$#mu)8- zd;E;r#wi|Euy!#yc5YmoHl;R~_yy{$`D%`_%4sv~_OE2r)cU-V`Rh^$UBP^Iss2Cp z{B|ki!hB~_s7_hl$jWHqh-zwAX<9KCNM@JlvvEb*W&GO}s?<$m_9~BgS*kyHJvziC z7xMRu>F^2eAvqjA9`C))?0q=M+gJxI3S&Axo9qqy!FXN~JY^xQ!}d=&aSZovI2j)A z4WCPAH!61)xPNwn`b)#fdV$t7?FMq!jXQZ`%;9fvPBxjpKLF?CX*Jo)f6AUn^i=W5EWI-AT4(xYk8Z4_%k15PASxVr-8YK-%a-JWR(ajB9 zSz{F=Fw=~WUx)lFZKeM;Nv-Bk++v5#tWkiAB5<;jxw-M1*>o!5Yyuq#VL{*)Y|-{E zXp6Mp#DEAV@y~T!G>w^N^m55!l|rqL!#EAJnWl0%dx?=b8Kns)3Nc8pIqf+SJ3VOg zmo91doKFW+$ifuE{Zz|~g!FaHmxnrwv50L`;+js@qUhnASc?tCc5A{W+U+u0jw*6f zUIgTxk6zny9eEx>FVyeS!RbVu*g;r9*%-29_#oeV1v_+X824pO)tnua-7Y7iIaT8Iz*TbHP29I3?oFY3`H%CW6X&b>=DkReTB_5* zSMky`-OLD5pfUt#xMi(tH0&dKfb(b+bfT279P|0r_@|IlOV=ux z-XtO9-i#054QB^!7oCwK;{uVKx5QAdpuEDq1}s`6nd#^IH&~>AS13r>#iW@$C3ns< z$b7<&jetmDik>6}YD@jE@z{9^;aA7z@Q64?%6WQgFd6oTAGBbbXt=2XQZ7`vzNm_d zKG^%Ov(bci5;DG4l%@PvN%87q1@OpOlcJ2n1HqD7&yu;f%HDje`9j2RH&P%nsi>>^1I4yjfsJdm%+8sF)BdTXOk8jK_hog6MISaL4GDlfYH_Kgv*uQa6@S&jWF z5_<{h@{GAEk(kAE`R_brHgr)2fis3EgJ*^hq8=C$~ie#2d5^my#4T>w=DdQsTBk4iKY>URpR(oyb^8##zhef-C>VGD*(L02p zQ;eel%3ko+BF=@sf;?vQ)sQnxJdYEmvIPBu!5&IqTNU`(Lm~_hIS|k$<>RrY*fi{V zM02gn;_H@lUI`@ZQp<__XxqbC{6r^G8S=_FHW8%pNX-&xogMIvx z-FrD$)moXmrL?Lqun4W{v}-yh)BAN6P;h`#d+dCbu);`-%!>ulqKp$o#7Y)=vd?P9 zEMNKLjrl_G9{oEr7Cg0ej+?}!cguc4sy=FSfe-)1* zkbj8q+vpvS9;c~{Y~|+&2Sen?UT72n^5-0A_QDFgu=~Ad()h20OV=QY*eLK1BkY~E z!j7xA3}cWRp`=&C^hOFK0O63YInk)@5&@>Bf=Zz!Gq+e-0%hYDtd>qx`1$h7>Ica_ z#3_$qI0__phM}x80!>p)x=X0vPz@BD!^1HuOfUy}P;Gwk#g~{Pc6L+YE2*n1=XWbq zQ9pe%y!0qYN4B7T6oKS>5zeZKw zR3F#5v<=u{R;k(B{wXTaj1LZc05hbVF1D6w8e}Ky6u+&_d(M}RD4)l_+#q{rJo?u{ z08EVd!X*%eD;vh8HL0f?L8~LRiZ`kI}6M;TCGa6{r5{2exNEf7en6euaVK0_6`^nkm z5X1_{5`5byjT!pW1=rHQFKn`@HJBWst0o`@jeV_i&$EnudZp6=%5G{^895G zVZ*I|GR8BBV;v;}F&d2-1 z$fG9Q*=aVRAO7oP=^uMWvZhVk5^L}kdp~X!L*tQWnE(?Lb z7~irLhnYWYrAv3Uk;1q5NiL9nuRqCu&rYK8g(gadif$Lj8Ed-urZK^%-klt~#$ zy9Q+hRNHVVPq@**5iyw(b#o9g{LZ~%xPIFOXW{)|%2Gk^M&q;T;m6=O&`TJ?w@u8` zmhVuKlI*@kN+xWJCvx?g>EJc94phf!n^H9r7&q>Ap= zl0Pv;K>Q@d((koHmf>L;lh&R8CS<3!{Lu!7j>xa0M!8l^rzM+jY5@XOT&6!=uVy64 z$BuG(sKhYeAwRS;2K8yOpk$vTL}09Z-HbC2D$~TfAgYW_&6q)GmU3(A(UQ=@WK_!~ za3W&EAf||SZ2|N@KHwA>l-44dfPxnvOz_1PCaV5apz9SE%ZEJX&vGP1J8*O3HIflh zJHLveOch$dC_t3y8z9qrD^m3$*TCG=)fSU-$WBYHNO58;>AM^~4o&S*``@U~F+?~Y z&3wX-k^x_&pURPJz&vobGw_FufP^${Y}za1YddKzj>B@!82$Ez>t=;J+jSl*ib(Jg z+-j1dA%f9%S0HVUcL&qAPliVi7z_zJ>}LCGm^iU zG0-T)tHFLBCu_%hx$N1FpXQvxrvU}skk}iad^EvQRad6)bdM36cG{(nkZtGWf5X7E z$U=4@1ay+}%AQ?K$l`WE^ecOEx!??NO(GgTAE_#H%(&%8UwtPn1;1x29fIM(Mu=*m z>I94H6c~_WoPTTJ-o*P7Bds(9%Bta%0Aag5t(y98sqRS?8!CMnEziYD4QzHFqpru;tIdQBX_%Ytot{aMaApESqen$-W~BGeqEK2acKv z<^c|;9KU>Cxst#Um(>5>F{O-W-HFXE88&d9|0e70MBL2b2{i=y%6qMx7-F_4eJ6G6 z`MtF^5lbnc$ih!(vlI4hLI!LA1k)sYa^ZX322oKy4?lJ-8MGLZ%)il5^(mn_?fk|y z0s|-QsG<%*Euoh04NkGqhyx%frLRBRsWb$v;Ge|_fK3aWE3Lct-VFEN#(6}6%6yfv z&+;@@PR_7f+%j?1p*tCey}pjQrh?z;rv+P3&6j%F0efxjTZ~eHo~(|c*xcpTjJ-zO zEHXIv0}3kq0-?lEpQC=mFzldQDg1(03g>~f)g@G{R3Ac#Pg%EII7+eM9_-*!%2UL2 zI}F)$lsi97gu0>TzJ(_BdZ*&#>=iOr*K#E*qZ+O!i6}Ebxat-VK2<veOQ*`Ha>-<|qKf3I9b-3L-is+;Nw^WPTL=a4C4g3Tue)Mb=&R6Guo&hdgzm7? z%uB_(8-9hrxyg+?GXV)-3Q#GQd;_Uoz=+G+fW!PK60xf6ZWX$_Y?DZwZ^^c88p6kGD46XtsA&nO_@Du9sZb zyhn^(6npytNARUirP5+p!d`twCbs;v6U<-BMDv##;e1rb|LV@5W^}mxNA~JJ$s^*^ z8j20sI73$4!D(tojl$v_>GNS1I({3Jl@+)}x1&|NdfDYni({FO=c4h2){QOD*JN6v zD-&ZffdQFzRV=Gvmwd}MZoyGF!=-Fi93dr52JmTO!c0GzP5Ci`!(0E$(s{>kal)W8 zggbK-804C@j%jYiL|w<|c6Q((60`CG(`P5Hkw!D@cIK=#AaJ9)COf{!EgK(WZ~0(6 ziK%J`M4X(AC#Ngn(oDkT$1iSC-p^%nV1D(p*@EdMHaH@Y6475IkQ&wd z`s;ZNL#8_O20H>`rI-dzUNeiJ^b;OS^?@8OO1!C7d^&4r#@*e(3Ee_0>lcCXpFCuS=EWI_@_}5nASgCh63fous&jcHpD62_K$**`cO(0!$|&E4&1Pj&Wfk`top8YFr% z9GtkC!(i$zkDlNpzo6azx}A-xzb|1-`1-r@db0G|8?Ijg_zZg>{OybHlB*yGZ{|NL zBmG4Vr~ZBk=Vv$w!7+cDCf*mVvG?ug;vPO8VLt=cB5aNi4^dDJAt&8pFq3jb0U!UN7c^-=)~hiRVbeO|b29CuYb?7E@kJY-=y+%|e#^wb6%LBT9>0Xu$=93xzRaMBM~A^Qp= z$&rhLn+lM4!Ea8Fq2{K##Q~61i0`3()8J@rE!cjWCy*48?$L;BMG`TL^yvWQXocmq z`!xtorvfFtzJCV1Zf-mtkKdl1#M`9h)Xt6Sy1r3gCDCKIU!tL4FFEOaVhYT}3LYSy zi?4joxl{^v6Ob;hd`XGVcarkWm(j`~NartpCYYj1PW$d7!iM_6t0ljE%C(%dTv zvHyKCn3#o6roepIl%y<84sg!{?$ipeg@1FKC**D)OZgx%)YwureF|Sgh0W@^K&)?j z60T{Ew#>Us15f{IH+TNVEL*~IB=>f4{@rkh&X-V?=(hgd!dJXI1PE}A-adBALv>H{ zbAP##OXOLi;sH+0s`C=fbdS%jU+1qlpE1?B{aj}K&%^QEnNABiit`drQ3rOddUJYu zGF|)f%fZ{h%F*=8y_1vo%mw%ov|^g>@1y)1{*k0mnJTAI;AXf&Z792eAs)P7?HHP3 z#OY?9?VVOfIO~Q(8t;ZUrJ>uOdQcQaKE@M20p~qxwF)ed#YtJDFFRo(?-9QDUdSAs zx3;f(wi2BIzT8sfjY>CKiefy7&dej7kXxs-oFQ6h3wj}Et!J&5bnf+YJ_HpU267;c zDq4g3_LU@laO!2GYdqz-8ob}wD@o&rAhk~hB@t-E)f+YoMB9yhsOf#KK0h&Oj^CDS{{EXV65~g}A~SV`P5n=1NV1Hi(jjG%iug@r*s;QnuVK z8lf3gvGuRW^jwpo@yK<b)oNnTDczE!qh1Pn3 zS8ky>g89i;0X4fCB;)5^ZSf|~Z;KfeXL$#erdb%7QH|g%JJ}-GLS^8m zheG!OA#tjCp<>kjoc`vjkdr3oPK7tO<;(ApOoIzSDP@I4=O$CRs|!8A1Jqw6^DDg( ze{aMNO7&ROCle4PvFV%5hMu@)L5W&{wK~k$(b`(+7>|oc)DT-+i?3RvMn<2$kr)v| zBk4&UTc0}u%FBT$tg=qvtJ52E=!G2%PEgb-es4|b4c<|KIS>+z%pt1jL@=~GUNck9 zqMH)mV-`s2Jpd~)=XLH(k3`}A$a0zA5%8kYG)PuuFUphUT9NW7I zo{K3&y3*LOr6S)KGaUxwuCDK|huxYyVjpSAsWPU@vTAKDfYSY*3m~M^Kmbz@+t0?q zGfc;17_EIRc!;I!MsHaTm9GefMFe9ZRIitf4U864{5uV?kmFIlV*f&{2#Yo5^+gqz z?Rqv3pP;)ETPmWh6u(i3I_T2j-P*ZxZOfe+Z77nyNWx-3t2m@;oi?@`U9P00R25R( zoFXgEntCGkEKwIysJcerOl$*?8O$wqK6kl_nY~9SGrDh)?RR!ZX`MmwOmo*oAqx(MGli(Lm5}7Of%ec8VJZ;gm=VB8yhfyX!oY&bE?M z4VuJofhM(lWun?A=e0F3G@V*-Gn~;?9@g1Qa*;hIG8R|rAM*OtD`!K(5J7S5`wl1R zI@;p2onGi*joN)PgM|%Tl*gz~26J9@tPE7hBi@pcW>uZw;@k>PuI1Jfh2iY;yxYU` z-Nx)ubaTKARLlA$OU27<%6Fh^u3aoV5Z897Nr)>*-VR-EIvix==7;Hv|LWT*C!q8; z?9#gE74|u?tjPh`Ks|3HYB2p^!yU`FSe;ccfCWmOhM#b4;Q({GTW^^0X&&QI>CB%m z(ZR%EZtCNw*$q~{V=7wm+)NMWS@VbDIf;eNx|*4snP<^KhAC$)J}#?+@d4t$MAZTl zoULzE8Y^dzPDA2a#uWE7jE`gmrH$7&D&!@~vUV4Lzkh>@iBeBVigu(kNwV%l5P!nz zi>$X~RZ%NFbj5Y(jcT~^dIicN^|T+_63)6o#EXkJAAhHgnsAiQ6TKq4FChB_c`-?d zTimjiXu9WFC~kIUM{VuqW{oD;khwuB^R$z&hEh$zi1_8R|FF+zBpQY0_hP+Ma^|yh z8P~?x!_lkB0L7Y7<8pMW`zQK4d(ts)%TKZK4oOuZt#1nZfot8R;e5GbuFA-x$#D2s zv9Rg4sPxvI7=1|ulio(h=nwP4yzWpVN7sTiMwb~mGAeru)Y3iQe0;7t-7MEmUg7r5aK=zD8P-&ayRtC2o*qBSF*d zZ3K)Fw0Soe9qJ;S@`X(iT}b+7d7aOpINM>Ocre{=;H{eNr1lhvVVM*#vWYO`A+)Sm{m04y8^0al!lsZ_nAJYQVEth- z-ovsI(w+LMNRPo@vsXXWxC)K9wmIGom+U^-eei;KU2A0Tli<$<=R_4XFsIDvWc?B_ z=MAux`rk@WQV0Gbo%F67t@&?@NsG|gLcHqtmYIr6SKj0fXz-=f_F$Wr1KT^6 z@;-O3L)lkmB}G-VvaP-o99+h}bA{uZx`c*#X16O7E@FCrUHK~#=i>W0v$Wk%N_Xk< zJMn<5=kL`Q-&BvU$so>u3=@+MzskP0YOeIP#}fk0)BGL}`CE&L;cBzH81xZ&q9mGZ zeI>H^OHLY}fX67P?k^PLQ>PF7D#JO@f}(PV;9q04+AybKR3|HHgFINvS%cep(}Ok` z!VeD*OLKM0F!s1!2?xTcVDRF!o%iz-Kk*wSj(067EQaw_tG{azlHRZ-YTcAdhfV6EOQUK z=(s#iZX`L2`Mlj?zP6KPB!(X&I!rbOFL{S_xoIG)=o_jZ7^Z)~i;hRr=bP#7*>LUf z>I}iz{fKXw)req1Q}AZz-%Z!aK%G49UPchuSz=g}nV#kYT_UG0LWKhVgc)M|e!8~y zi0O-x(uN{7&9N>PSe-o@3&~ju^yyC8Lflu)O!iv62_?|y;O5zr+W%}(c%G?S9};z) z^Jqeyd%s_pjZ+XvKf*!_iyK^I*#GP=CzHYJqX8!X96{M14PGCQr>ORati9=*_FqS6 zHW}_$*KYo_KSVebIrqc;n=H?Qyk_R?Pp`!kJa_V<>Obi}*m?5VUo@%F4h?NT`QdSY z`|0l1&f{mB-)}wa?`%DI*nhJ13{oRXJ>nBr-CcGfAp%y*Tb{^_VfRwkBGw; zFprieXdbYA`a}lV zsByI6+|FOb9j;#BiW50w4#gf!_TGRyd)R5_?;?3J8OA-+XP{t|C(%Q7a6d|2^!M&k z^zxg`Bw5w`xvFcYGv=& z21N}k8xP5A4V$EuT{@l;(2~=P`hnsguVl1gXb&g2 z9S!$+@Ok(&e!rc5|AkIg{UxO`!szM^`v$k}C6Mg4*(Dm?z2DL34jXl}xr;XUe5fN5 zU{sY9VtfL9i04`^sBHH`$ikGsiMKATq!O)y*SCwpZZOZubEaqr=59~XL)Vp{89lnEL4-OE~ywG3`A*+H>BwiUED$FLwI z{+sQEmyWF|(yCNRtpnBsp>L(0Kwm8*FQ7SNip-`bK+stzB2CJ$nnNOV_wHUsQYfMz z7-4)i+=$?+Kq;loik+}4M9gZi;!ayvFh{+Z#5^+1X?l@|duNjglvQy$kF_8K#T(Ts zEqt5HPI&w<8heYuC_k1raS&=S8E$>pLumN*@Ye17-iyK=JpeBMOTN|h3>O!#W+zD{ z`Hi29OE)(P*>G&dbNQjT0KfASyaRO^qx(Mt{cJ2V8B|bTZpFPI)X>d0Rr_mE4Td=i2Y3V`-g*%xXl@{t7sN$27_k~aI_D7w7E(yisPE_ zeKo*oUgSUlrXaw@+y1`vpmZ@agiAX1xksIB-t^|#DGN2Q+fkUS1`%q+p|UaL)pDa5 zv!Z){A0?kQO!Khihl_+!N(`<>8=M<9cQ4`A7~??`E2Wpk`@&L_xbl_4u=(X^L2-CW+=h(zuluf47rG&Bi zu1d)~s`%jFXGl1q)=)0Qa2}4fl>Dun)5@KDDL8c%S|J&pSI0(WTw zRL+eao@`Vryp_lmSg$?{)nrwR8}5#U&}I|NzFLTm70Tx%ouHx~DgQ$ahooq1M@q zw&s!F2$^j)nUtyJ({7m1rbfCP-wYoLG4hQzS=F}f=EIr{2&FE&CQgN2JMn-EY;rR; zVS8&S-%ZV3gxQ&QF$HFkUcvV{_cxtMG-DNw zQjko+I3?|8>+1n?bX%YlUbV3&(drCFf<+$3_ghAh{k}4DG;t)=8=979qb~27-Cs_f zTKb%!RuLWRI6#m|Ax;QiOEc5{k{%4Er@N9m-aX%4scOjeZhz{BKio6R+yvxB9<1sXZKmmP#MGnnO&a$>4Z;fK^qjdY6_^SjSCrocaE8> zZwsjW0=X(eb-_O3$h$fCcFdV22j-k0H?RP(wdJgu{~6=elt319H(A( zaD6Qi_r^+tjC$=ho8A0&UDVLI?ph=PSX;uD>B?a1A3r?X*{y0>HFn%)czkxG$*I)< z(b!XNOX%rs)TU4w)Fg8R8-fH-j5+MN?t_D?HzIzBRJ=wBGxy_d{js*zmB0?;bN$$9 zFaD+7Yvh%JKo|LMYil_UI!u%9li@=G|JH}Fl4z^SPb9K95RHU^onhp_ zh4K4%eVMj*W7$sl=xWen0Kyk+a_5{$nq3oxTPJUhU&w2EC?O;pwa;g*PB^$d?`Rin z#074d&FX@Iy?i>J9MM|BB1>#Zmyy+gluudEj)j^Ld9qP3z#j)UWf=%vQy&1)D~(kt zOZmcs{r#Qc!Iu``uU?%Uog{0EUbi`SNI(sR+1}$=-x&D|$ET>B2WI2?4)%g0fv_sj z0sJ<^`2>x)9S)9O?GGGA<71TE69mqt!PwzJ90KS~vH5Gn_w)_sIP|VGfsPni%cljS z*%BzhrLd}Kt_gZCf9}b0BCaRWT$Kg_Er9_wcPg2=Upif$t5uO1PEV_TXAEfv&=GDC zd$@S8>p}ye9Z7gZ&V9R{+_z6jJ;Ut5P3)BSgkw^)p-h0QnL#{bd?MU zt;@xJp3LNN?ag`*ccR)5Vb}Z=R$i`v7F+CA&832lkjNG`%UQ!G9xLtv$^c6fKb!D_ zaqn)|#fd8&>w3DY$(@a5q^81$!e&|nuTX?Pbe5Ii*WRKd656bA1Y(Z^b)ansg@#E^ zST*pW9IQzC^WhP7K z?3#SO9{Mfty7i#S0&9OO#W2tM@a4;6Tm&}V!>-KFKSP@iNA!OY$cAG%Jwr`qZe72g zAOgMLi+cHFv^N<~#|NitYtKKT^dsuIJr;A}7bxsF}OJjz)%FVC(o&&kSyJ7qg#<{9kVp1A-(Z3~tf7LMKO;Ak|#+^%J6+xLRa=MjNQ^&Gzr;NM7{Xit1GerWg7 z`rUd73#<5Lqr6EfOCK91R%iwhU+vrD!(wrnT}$K8FhK$dc)Hxoe*`J`v% zSgnj9L!R)QalUu>0cF@>jSvIFf(Tz($V!cQ7uDxl+V!Qp_A}86!=^Rr5{Xds#L6Wl z&{blBiz_GZ_#T*IbC{L6dz3T#S=_MKaa~E#{-`Ck1S!=hf zmZLFV%9q!;pIU~kfs3R4o_L3|u)hb)n`&G=#_k?z4tibfj9$OVo=~OON)#+K<3njF zPwUdll_qpieUX5Ra$`d!xveizp8VshA#Qm`^q1~#8HkOF>#{AG9IB4DBT@173CT?F zmj+@aIt|9zFC>PfH@Z|5cP@dqFJoUE!KfoZ>|Q2#i;nBS@*pn9_|j;{fTk?w;do6f zf+F=NXKWYM)*(qZVrLA=K#Wva5FASbH(?TY1{))HA^oo_wV0$uIAzAZcU`2pq~av6 zI_*}*o?yg!3MTp(BFN@+S|#fq7`K=fM6@ZLCDBYl+9VXGw#0BX&DT|H=M;UUN_sIR zxBzWeC8dRsC(dU*B+K2;i32p=1E6{l~;qmh{NaLSm$K&nr z1HbLqWfqAExeOma=Op`FT%GElil-!l)NT9oXs=7Uypw(woi<&sxk`_>fs(-~x7cwl zy6i%j2)DBt(7x@S|FVc%n{l(Kkj9(Kv89WoOaRJf&(6{;1_6qjidsVLGhJx2fVs?c zszZq&d<>I+ilJBKiBm#wzJD&udm(WPtd}C-MP&QDD9?y+SYjo2yK}aU?<%o^*9`VQ zhaa*C=R5Gt2XGpA%Ic0KuQX~|T?NBjiP4?YP(x*ZKbBfmuy+|#9maW-u|c~*>o}j? zF4|f<5_O}x>sI%CD0y>p$u2KBX#j13itFQ7Kdj2<;6Q8vj#2JO60=;+j?-8hJuQqJ zn;smjt}a!$H2(fvFR;12fTAGO_t{-&dwYWgN%AnmY%bldaY+g~Tosq*;*jG`E9QC7 z!3Uq_LNzE9bWNi@^47{jl%>A~1{WUREr6m+ zq_)oaV*2BHb!)ZyUzrYLYxA$Ge_etUIFaIO(G3pITw&+h%EI{X35ra~#305p<5~Jyv43=7 z{G*AusO=G=I66{Xjo)%L#X|3|=YRbr#j@Ch6h+oWilXsqLbzFi&}5lFpq;xM1enB2 zLZFGP*4L~1)qmFv?%mqwH7xLyAhCeQl{wOGlu;rk?D0*ft++8 zAMHsV2MIj@fH)rfmktO2rK7=r8_MrrqPM|D4ej=g=yI@8roQL$=)V2*cl-Ai-5<8S z70|d9@VG@!M}7*O-ueo@OQfvLjg8vQdSQd({`CFeL^NKe6q&6$m{&Om{m~=!=EXt3 zeV59bCcM>E{aL;D`fvKH>TvTn{%WHnTLlDKdaEP6y3SSt-?AkM|TPxW`9rs^-M9wlsGWOA(X+t++2}4v_ zSZK~dEnq4ArkG{d@SU|lx9#>NlGA2E#Jirp8Qkhm#;1pIwtR&vm2_$pOY(j^>6{*M zYYkdax_nt=Ef26N=-s)Eh@m`go5cbi{k=EIfPHW%;5<;YcK__+O78>I`2Rm!MqecLXz+ippgTt^sRnOA^~YHxJH-qvy-|I& z!Lv%Z{BGJmn!fJ8V#(~N4q_o$Iv07oVUTd-Pfq)|F~k&Ev|b`V)ER+jb2ujU;pAwD zDGGz*%>Z>|+d_r`9~~&w_b=gaep8)esDJg~{_Vg0{qKKA(X)Qvn`1k!s zx4!*$^Wi4{-h6QH_U5gJQofd!fS)3<_g6Qnp9mPkB2Kbq2;>xjijMC`jA%XZ3Qk?d zH;~y{^|XC;iqp)f*IJ!^@kL7YJC98X>Zg~dq^52$)khTGzKlFYNZ=H;5$_@}EZ${8 z$Uzc-Z4P4#Kmfj_K=Ab#i z3^wV`&loNG=l%5OEofbMeCu8d5>YW8K&A~1hs&8zk4?WVHoaA9x>;;`yVUeyvFV*s z)2(9DyJ#9UH8Phx1#fT9=B*8jG=+S1qk6!I7M{?Ue|w|C*nG$*Tll{y#1|OYo}(nhlvG;#gS zX%<>RGfF?tGF&rd%vr3BV6U#f3xb8vZi6wC;0_`Carax&9D}tb+k}z$0M`!J=VdIA z@e8Ec`~}gYFF2B$zrcomQK1Ax^B0&=j{0A8;5AYVoabGSlon_0qKi^%*$g0jdZ)!W z-E^O%>lMB7mrhdjml~{U^G-|D-ADZmiLU5sV`{au?k)+ld^u*4$c_ZPAT4=+17)st z@tCZjP*6%Rs=pe7MQt<4HbHxJL%tqW1vh>OM`SqF$di6wogJX6hmX`m?a3j8z)iwT zU!9kkxUP!#srCNwYirTX2P@^qID5MY+U#p`~R0`3i zpbJruE`-}4lZy3H?{Y!I1u?jH zmj~tQK_%lG)^1Jo++waJFI8o{(0p&g9PJL$)rOD=dHOoD%0X-p%@ty zVca|85btyCUl(A@WZz0in<;3J!?5GMzuo=n_MKG;HEuoHeE8to`x1iu`~7bpJluS= z#jxY8)jPMpy8E|#5`w(*@b=cNM{$-H_gc-;2qxA?53Nr82*w}A9@d|Ou5GY4kOQ#R zp*1QEtu&PoC-h3&k{-H{NU5)OJLx7;nfW(*@+8{RF!7I=P}2bI2K*cfb^*gLdtI-G z$GpU7s3`$X0eJYWv^UeLJOVBr&J=i%1T|&j3^RT)@A{f91(7d2&lsXMl<}s~?8LO47)q$(0ch=hrY}Vh>t(nQ~mfVm;57?L_(Q zrqbY~;xS>^2}62is2C-CL?V=Un7qctM5x7vDj{R7w*Wj0R+8hs2s#8Nn-L(yVT=rMjBZdEk`Z^K%4|Sne6t z2-EONL5Xl=i9>fDmGLf1C1JDrVJq(&Nh4oJb#Ci7r6MESPEtgC_wFs+I@gJ9QAJ8t zw-LTpk1rc2tqLL*Ko&*7D2(TxngonuN3@N<7)0>iq-@*egK>B$cL*YwAkff)h#}ly(LV%(#5l6t71|rT-3U zdF@)m=h%Q&Nv*GBGh5zYXUUWeLV0xyaA-D?mMj1Uz5{nA2xxR!K$4~=kZxZRB}v~9 zNOvy@iMI_ab@wj=$wHU{>FiQ`BBaQuvr93GpdzQvF2yN=imW=j6sryn#{*^g!KF~z zAD^NAn{fQ#QV7v}MUL-XisKyrg3;?+_b#JOZ?FbJq**}epO=AFu5supdP+Zg5V79l z)AO||m(cUP=ELUCV0s>3`xZuMI5?gkd4m8{%<4S8wvE3p0w9P~AS@z|ghLoS0^-gB znvp<+K_ejUEuioQ!Wovw*IrzR7v7>Mj0x z7m=i^fxbIB8a_W6w38MZTupZm5k)1$R!)Wn3wM`YWhgq}p8#CL@EAN2T;RK6+C6LtgUkNCk0p(??2^;Vjs4^zz8r9h} z&<$8bJ{RCQjDD@V3)rM$C&9GO!>CKr6U_QzUDZr>+NQ`h1%fz_cM2SYMkY zoviAkQXz2Ps=%39a*ISN#1=AZn`Egs-6fls)^57?c**rFDbGdAWUqyeB(C>*T|u!f z@nS?#fY?^ViLCi`S@zAOZjV`20=SIy(jK2tt|?`lXs|oQUAh>Z?2_OnyCuGDqeID1wbVsc%-`qjD^XcGe~Jf znCp*+xy3U7c!-nb5)S<1q5j9kJjPA`kW80Y;2#fjGF_r`e>~LxxR`4s{*T9T3;h4_ z5Dz=Ve>}`(SL1hqwjdGQ#A-cyxDVB1l(+!H1iW?A9MS%Z?LK|h{n0(>o!Ijiss|7~+ zV^R-(bGMN{*!!=u(Pa31=cmUg-L~~%?-09C?}okWM}5L_>frLYV^=&`IT><5Wd+U` z=<&G%nAx4&oycpQ=cCRn&uaBK7S`KOcXs=7t0t~Ry%4ck?{gD8FB0?6FYG=$o{xG* z@eb5*FujOuwX?a2ZSAv*y2hoi2a^$OZ#8>(QoUr>!sODedL{|eFf|#3;PhDy&~);i zEUr}ZL(YHL@bxx<&5$XNyQ^!40b%LG(cb7(2}sS{SifE!rP1PUSU&2jK{;wWaA6Hr zR1J!B2;1ttrtbv{CHRvY|Ej;6kc@3|BNFflirK)ZAzW_;?QMOj#ACHAGUVrAb))qh z94FZeaXpTQ2B`!k)V1Kzc-$?D#w*>Lo=c=1+sg^2IcwGifiR-kN+r^KUSI{;$xjO; zd!s&;UIl2!jJD`Gi$aQu;dsxOzfpFY}t zy1l!#{3U*p}Re4vZNFc=#r@6Qp7d5BV+41S<5W<|N$K&yPXaI_+YFEy?BEK&nB8SJ( z=lvp0wT+$AMhofT8B-5l&e!Hj$7W5% z<5Qbf4+e)*=jrknew>o%1MThe3u&oeFveJ8hBDq7BF<*#Rv^iYtma2ZHf=aX%J5*nf56M>HR&kh#X#4_Zrl+- zZW=-rEQiH^RaRN{(;q z2;l3f0u!LV9=v$zUlMfUNU)F)hxKqmZubuk2d~dH7fZUZ;U5~lfn0_Y`6Y=kg5%56 zgmZlE50;aK@dv95=QO(hldCI`WpXW7C#RE~zOWLM$VETL7}g_yP$QvkhU$Yo^sVI) zP*^wb+MF_^?gOf*-;n2Ic-wjWH(DHEn zm6?4g3TM8lXOoyNP43+2<)ljWswhut^XH1&9E88Z)B%qR$T&mpC{;jVOhGM@ za)zHwXTGsQmCXh)KHySlu2!MhN=6gfIs2Bs@=`nEJrWKJn*+3|Le0lZ7!KNExoR0D z!Dxx$U)H21ckha+T+I>+ul-L{tMe!delz@z&khfx5$1Ep<6N8C2eNgPSci#z@8n~D z+RGWGm4`6^!$`tF(s%6+()I>U2|5`o2E55lC@ro}$+-?&EOX(FYCbmS6Mtf8W~(%R zI&mZWQR!v$ykY9)y{JsmB1$ZEMHw|b949m-Xhr85Xtx>Ne6C5zS#v|HZLF;5P!SCE z-PyXlf5uR)Gx{~Y#|gBgw>I0f(B7`Mwll0Av#%RnY>zXTwqt&<>swRc(fL~A`Rg`5nw<%vV zE{CAfblBrAXR+QG*>E07RHoz(R(;SojkbQ0=PTXV%-Fp=nyoPKtI?GX(XD^{@Ch1iE^As|2)P9SoG_eZ(UzLF zZ}c#&xIz@vnTM}1annHy{GfX)>W#QHgJWh4>NVsyZ*-4~tI$;%q7-h< z@g(l^X!q5i-`o(7EdU7*%?XD~!dJs5`H6gz`HFnd)+Y)zJidlg=~>xxzL4NKuIOYO z7YT9q_vO!al@UD_+$%X}05n_j;5A(DWi~CR&E}0>$aVZe`bceNV2HV$J8xoYYrvur`5_q_{sA6{CB&c%7zLZvZmK{^-j9vg7T*!48(=&UN1v9D0W{^SI! zhF7q_xO#BP>lUW{_oLG{(LzdQkNwIYLbTLuuz0j{&N-%Dvs|7P-;=`j$hTwFaGwmn z0n#Pju=ctLqRR>_ieZ30AC8KG`O1i}%igU`ZJ!9i0KFZ-DDh7$*wjy#SX0YiPpGNS zZjq+8zmh;xhb3|T1wW4t;>d`9$iOxCXCdwXJWOFlrHKnwbD`%0eFdJ1E=Lkhxs$b<~mDHmlfaiJ;U3&cX1t?LdlRfx^H%i+H#41c76QH%pkba$XT+0xm){$mW%o zGv<>=%bnc8+l~EI<1B$Mgmb4T4X`6O!`KFzQx~WqHfckQysk32m};u&q^q5Tb7swe zwvV~x1ITui!c8h+J>G^Wt9&KR&c~1;8-ngNY_rwBs2!7POft?0*iUw3?n0#0l%<`f zWv`bl({2knCTL3!E$7wZV;aA6BiR-Sf4?`y1Qg=b zCM8zGnwjXDlIC$Ex7H$t(yZImQLj;yZFI_@H!j#NQvq5i0XG-Oykuq$JKs;lEvlo# zW>TKv9exdCG<>%~Fk_!1wDhs#8qfj|89y{}^(cG**9%&tFWWumGq<|h(??_*Aq7&C z4msZ-`tTO*%4Q8>n%?3!(>`$*b>a#Da22A>*CFc49X=He-*kN%pIAW8{mSPqGl}zdG+DDQ-NFZYOC>?Ox%;d4E*DHqV~+c5~~R=1F8=s=e>o+!8e< z@xyVj2FLB)77*Og(MjgU1?&IM-urjAbsKr(`*&Z(O?v93R9mr=G}~1a?NMYo(Nq6g zOHSHvP7V((Q8u4Yq)JkD{AknH{{4Jr2EgE6T=G(q)9!BB#v<jnExc<)x_)(xBB3a*J4|x2(e~ODKne%>x6Yg^QzZ)sh`=$f8)bXY$ zBitxo2`CZd-^RpMAOB|m1>I(Ud0HQCK}fIPL`-5}Mx3QR2t>fyx5bYeP#7|ITpY-mUxEP8`D4g&+A1t=F z^*YV5qjSPDvvHLUTf-CDx!Tv+>?B_HOi~3)&SK#+Hc8wkr~?_5%3LQDh-j_IR;Ge+ znAxy3`MOd-e*6B)E@{l|KWR@r9=r5R<5Y@)mK%79x!8c(-K7CrCh6vtc{Mye9iH}S z^am>{%q`0N+*6r2Z5K3I5l7$UZAs_aa++lO#oj~#zKL(mb zCH6nbAK%ul=B^D~XOz$u!*xjIksI2OEFksK?#14w?e=DVomSWx=9v2xdh=^E6YXRr zb_gK`(}R8JRzfDvayvC`|0&NZ#Jt#9goue` z7rl*K-(eB6Qh6A>wN$RinCe7>&)Is6sB)KQ3pT7ya1*8&>W|KFgM&QC%v??aNXrE2 zb`yM@o(*)@Gco4^LJRnP8Mf4`JuD+UBn<={qFuBf4=v- z`=7r_|9<-B&CkEP&wueE{b>9C%g6bp*}{dbhsf58W47tXr~b!h{>SG(-2XBE{ouzo zke~nXX|3#MwcnrDe*dBN`-|G|fAcrX)|sn>3Nms%K{x9?EJ18YU|kX}0a!!!Tbzz+ zm?elRR26R+utAZm7l?qprX_~~r`DPzih2TDfAlqu>m5(OADs^Ou@dNg@rV2OA0S7@ z{`3CJ<41p#6dB+aKo>oj0B^yvEWsvtt9tO~GFgFJICIb{7CdniM_*~+`t_LcfkQTT zTAQEFmKp-uS-sj(O&Zddmv?`i&YLYB16>)J>+mw6vrE@Hn?A@j|H?9 zPbZHq2D8C=ZK`euMm1#sC9W|gTjZNg^#=3zlM_9(v$FP|92>q%UR%T9d~hKb&p0Jq zz+gEH#pX630mgDfT!ty@z*}51F`aejL$j*leFFemHI2Zfn_aqnm4rqV(^w>6j0_Il zBrwK&_cfrQYduWf$o;fz&kZzdvrZ4p3<59F)&j>3T43STZ>)UAIdpmvxEC3JC(*i)X46 ztyz9zMZs$4XxPJ@L!uHEUc?F6iQC%&U8BqS+YH5U`Bk^N=6a+kU`1z)umRe*m2C~- zFc77kS$hTZvUVMrN^xwwb{SaqRzxT45od4mtLv5!AtPDEyOH4iz5q0iyoN|11WUPhL1WnF-@w6GXQO zxS(8$4nmSKnEVpu@a5A#J$?55)BeK)BrH65$f#u&LE!RufaEQG!PYar5+4Kq>A$@~ zxl4S5ll)jNxBP8%bNDLKt>x7u#Ij>;h`q&R3UX0drEKg*`DD@wO<{f3)OXnVwx!L= zJ%MzDvvo2E;Y~I|+h%1aV9Qh=yjon34w(yPj(ufmR=h)cB(uBanL&!vq3PSG!jHGN zQ+v|H?rvz7&aKX^HrOw!B15A87P=yPBGaI`0oz!cO>Eg9w{$?v5(t#z9JhlSws^P_ zptOMyBUD$dbVmh8g`mDqyYH=J5Ldfh5H@mkF$ z)1L2UgNqBq1CULwe&PaOfCU{^uvu?CTx2*A=MEUCWzvXKPOsaB*78l{2E2bGQzsi} z=M(3YW0aU@JzyPXwGelhkftDYtoj&*%2gRn1hcf!ao$qD_qIkIiOW4}FAnI1L3^gvZjm-(p5HQUs{i`0HtN_V z*URp?=J8pqL`M@`iPL{_wBN@z+s1ExdodflJ|9%?2D1rvJ9`(G^Eb_>r=vONm+j9# z|HB_QDg^G)c7}_c##QwOuFQEQ{+SAy3tu6PR&V;#;5||UoD3ii)w^MJI)yohbocnh zQG99z=hgH~3`VVvh7ksavw>~;sogu~R$0MOhT$3Pqr26&$oY5yYjD^<$MlUz2WIh? zW|G_&VD!F)5bGH>9Le3TzSV6!3?>llbm!ZUHFjl^E8BF%`W{Qp6GXmN|9Lr_y*~`j zvYwAL7@ewDXLHl`Ns}>Lfq{c@)IbS&>Lc#WVF4(AU&% zcF8<0RXE&xJsJ<6$yqyjpT;xW%rW2-oa>6An`wa`SP@otU&cPL4nKRRr!R(Qeubyc zqjB9h1et-Tb^h=PVr1V8#+^_$>;0VR&(5{pa3-rzoOzVqIF&@K-2OIyrY<+mtMRpg zAI@e_-jgXTTyv2oA~=9C<}JxeAWd8oEfoW6?)SexPf74xM(X8F*}Y6|{k60$nFGWx zgkGKxkl6^)yv(?qx82~BE1U%ukX%iX(mTuGtx56}MmZNU-|m*B%JtN-AvWEhe)9lH zBPF))mZbLB@$5=KCF!tQ7xM-EN4fhON-XJ{L>9-+0N-}>G>4*?y;)I zXJb~RC509CJO@?=$fw6qDD!Ue9X|kmZx<%^bc~kV6oyWPGt04`HEpZ_8hq#xz1*A( zB{5#ZSN^T>sFk0qTskk(qJ-qxL;E^Lnoh^b^sTJfH{dJB{f@YQDUKbU(}k^ZsV*!2 zs*RYpquJteFs@!8BJ=I^r(ur`h2RZ#7+kZ-a*1MsNyJr-tg2Qa-oQ~O1z_2DLwt7t zk2nDrEUdcNUJWprQoM=f)kY*0-ldaUu9;*Uz>*Rl|J$7xPBBr2n#0JhjcpObSX%wVSN6*>`XUm%0>Z+8|QBB?Ky0nFqLy_oej7<)lOuK(VR+t_Q%P4l;iW*Ew3ZWO|)q+=Vt6sg& zXR>%R#e)9&c=mdmcJO>_vuEHoZXfGl<38Jkov00V#($bwoQCaP>-#buux}fyyA|28 zTwa%Q#k{=lhJ&BD!ru9H`bpzmmfO6cacZf}A%p1nyshJz9G1E+0K@KmZ=-HWnvo<6 z{8&A=bfQ^;a|{JT)|-O3uViz>_V&$kZJOw?2j4dUH-%lpG4 zx5?XJD{d~W8@=3tee3MqTuXTm;p(+EJCZ!!9X+WBvrEhg~&-@bPH~EH3VUq2gCMRg);4K{hQ9oJ1<1?xpv|vY6(Hd;?A9N zb=rCqJoif(x4m637V?WVp7REa8e)1r^UujF(g%MrI+CVR%{%+t?ErCr$nck-Gc9g# z?^Xt{=Gq}#ezvPW_x=o_|4Z*L`E1w>n|u2532qABKT0-4z0Icx&z+4<;JB7XKMl)W zi56LcfF5uASz- zF?DYak|P|vDhe@<`z)~MNi_LU!TWZ|e1uM#S-rb3OKF89;DbCX*jAa6vOW11Ql*7^ zRwp7zqi;Pi7i{XX7o=dhlq*I_(ha9yN!*Qg+UQN>o)icjR9?-yO$+$LE?Db{PdP5YJN_1tnFk10oCw>FmmJ!UnpJ6Dh6Z1gcHH{3U!b?)w3m zMow+1lBNR&Ghsk?8AYLgNjnKXnMSAZm<~j)clTLkU8w60AbVs|} z!!&@&Or2!7?!xmuMks@uv$&GEBhdwIL7*ZsOknW%V>73=(kA$py!}{*&J7!)9JaQ@ zm$%al$==!wU!oaNBfdK}(S~CW<#1W0R80kCL3au!o&edA@ozezH5@hOlw97rkniS= zb7Wqx`$E|3B49*l(qff4;JI`S>8_g&t&$N6ZhZ$4na)1F9bpVm%|8FEYxAFdkmf({ z+WhAqr1{T&{&Y10PXnV!>CM-tvuh*LR9)PQr(#X&xe;uCYW};6qcpq>O_3M}4{N}eB`fEp3pY9!hcX$-MQlY52j_uu2 zL)^yyWUzQUs^5NWj(FKvND+*TPlG=~)6m8}p^!aG)^^w(7~v2sU`wX4u-z3!C8<=( z^d%=3b;g_DlTZ1{%khag*j}k=&)?w_n{U3tdXhOINAA}8Pz$dl_2KB#Vl~MlIQqQ! zPLlGC{@8rSm`}EMS!j>%q`}KVgE3h2vd|)5N|Tp`CPj9tS)rO`+?y3D>7nB${<^DN z+pQYvj+D6A)zze_XphQ4#|lhszl&a1gpwKq(g20H$q~V+I9PdG1Jm7cx`-Z{NBcC zcpJ{9&Ehx+0SO)PSb?cDO=OG{5TiLLH8|y|iAF0FQ!l6AX*i!82(bL>cdI*W5=mA- zXJiB5kByD$BML2DJUw}`W#p^wRQG>AII#E0Jr%lFmdjB(ILMeiTz!U2z$%;4>@ovy|V2cDvlxM%%Pec&lXK*(=b2Nc^Dj zAh;2-Ox2q14sgO>Pa%WkXf*tJcycN6u8q+U0Pyc}N)g#>km?bJj0~LS!0>IC2Z=91 zHN;#VkUUQEy=2|ghSK&nY?NTH#d8AAe$R^ z-pZM}-W{16J3upF@mxpy$RG~+lyHLCu-0g)R{191%ErV!kScp|3xsn4j5Bfa(nJ$v* zA;M7dw}6=bSjpIo8yKJ8#hwJ z_Moj{dyR&JW%8td_~$=<5zihXT#Ob-4-WmGhA{p={$w;c8DE|bxBF_%SEXvOL}DTwC!#M4l{0yQ59bgdl0QQ2(BebWP`jEIiE_ zLM{-XATJ~%9Ihj@QR+wqZ62q`tjU(WS_%L^dD-ljv88myRaVYlaFxC23ZR$Ox^u^E z0+&LH^3qXyzp8_&>^9si84UZJ7{FgN92i(gA-KVCvFI`x!7hL^**Gemr@^3xnIM5-Fb$l6bhuX;fih&d%DHEbs#aY5d5oqaao?&kY` zCOT3zapeQ)?qbs`ba=T=@#zwkTrBT(d$GW}0DDC!D|LRkmec*^0zhAHME~a;u(-s6 z;kt7`k-FEJ3j!Z%(OqGf|7w#$xkJD5PW=B@AZcV4L0pk;{ ztU-2jU{2YPGiRr9B&@V`bI9@9f?$m4YqcKKUW(Kq z`0Xfw;WE?gHO`u;#j(sF4bl3+)skT(c}nS}4~jCv&quxW(=PWD+5{a6Cz8r$#HJQl z&5rQ1u4T-HQfwsRMMybrd}2#$ny0ajS-D?kRg;s?8K7cj3y(A6bd?@idP((w?%lXt zQbyOL##a!or}8QU3FkVNVJ*0tVd85Lf=F{^P2ZrAYwuRfa=Kx7SF%kzZX?TDiuO3! z$d6m|NCITs^o02z0a=lQ!MXwc(FhMU}SQ!!g`j!qIO;6I!`oZOl!WIjcZIeOYu+F z<>>GzxlJN53F$-3JH@X5s`F0~11Iv41Zk9z7&o1VYRZ4b3{*t&f5A-TsPxY{NL}v@ z_u3kB5Cyj}wU*X1*PDEh;yJERUdXlvHpAkRBVDH03(X*xSysKHYCgT3oeWzwQ5u5I z^h}4`E&u+VT_h9`K(Ip9iZ%q`lXQT1BKk4x<5~gpH>UOQBP(u>7u`WMuz+O&x*$J|y zj;F}37?KyQvfPZvUD7~i@MEOFss_aMp(KhactGe|&i%+8k9)he&Jmd^ZQ5*a$0Zpv z2P~K@CP}u0;MuhjPAAsL%%4WI*qKpc*hyjMMNI6E|=aNAYttN3MoQ}HWyEJBpq*w=y=@ht+5BTB~2hT5GS z;VT)6U~{Qh1y4pKauqLT)Azl2{k(LwN#LmGT&81$tAI8!vv-7VM8YlE(QoYuv`jPkw`Mqs@dQj z6oDI)NSq>^2wX3$3!aeZ4M?7HO#H2 zyeGn6Wa@$-*sO(wSv41Qmoj&)CjOTZ8G_Ue*YR|4+Mi)+ADs{T460+$b?@=V7!nND z-Z~wRKSnT8ozr+`>ArCOqD>r}K4F6)KiJ9i6xP}Oc$qAU<%q%A!ZM7G_4Ai?ez$l3 z=Re}EXZ#Oo*pb&8L6*`uF>v;@$cgT_qqBjoGH^N~res!UA^YQ3hZXrOve%vLXEWs7fj4aVdFctM@O`EWGK+syo z%oiGlD5-v{PvJYU4%d{sz1~NWOB)FAcpwfcqsYBoGt|^TiNe9A`BC?c6;5o?m!;nF zjo4o&(~I|51I4EA?M6$?J=4~qCsV&-!2&g$Km`=?nrfzJl&R$_55y@zSLysp(rwH4 zUIBPrl}m?2X6Bi4dVph0w-x}aHB>_x0@kxhkZIRI1>C4vi|GFZM%$fqei)Czx-A<+J$k#UoDnD3$q+1NKDHHP;W9p&P6Y^V=*6)AsYqXcUcdsU=<)WqW)aVCEZ2W9W+Et@CyIr<{x=fI) zO#?k>$Qw_R1ekX-{c@ZMi-MTh8Y|ts*=t=85Qa>i!F1Myy7i@ZBt=e?ni}`Ls}29W z9$URWA$>D`%E<-6QGm^n)xKiR?WU2}ri(7-;v-apZzn#$k^ zQbpL!UQx&8Bw<;8l9=f4`jhnDh}iTjdLt|8)+i4&*G-0^-M^j-)iuDJmn44j zbkVLqlYB7YO8zft6VB8B+$xH{Xw`n?%-!v5D5zPc{@3fSvap2{jkN8NK-FL#m4 zB94yuMu9{dBC$cF{`_(={F%OTSkf)8bQPs9fwrXFT{mR#VYcQ+e=eqSCtlz7mIdvr zh&+XP%yZ#UQB;Qw7oJ@XL%Nxl>#*9#B(WIcTrK?}*PebCqQUGZXW z&`+6!h8?!mk$~JP+&M0EibI$+_-V46gq4OOVU5Krdsphlx?;eVS2Gu@weN5VVZ{rC zM`xpx>Xb59;q=lFw`9H<24d)eJYm%UaCl(DX)Y;@9t z@*sDgp#86h)%XS*Spd8ZecmOPXBWW!0Ip697fZ5vT7|Re7-vUcD=JLA zKxk)|sRNEvAh!r`4EJp3A@5i_MPjcmf)gOz+eKg= z2cwuIX%7L?MQ-gCHqP^33Hvn|_WN*b^7!3}m$N3RTZXP==n7m{aXi2VuVwvc|@nBn<3u@7s=E?GPbU4NJ{#X;b}_r`tVMLO`h}B`?J za#g`rV65+W9Mp%>gh#BGj3LELHAKh*qt{6`9F(-E6xl5i2ZRE|HV7aG#V03khS-OC zqwqrAe6+-C)DGpkxI0?5&fJ=9XT+eLz-v5LZkZ96n@WPk-mhS}*#=Er>xGMYHmRsE`fx) zI`!Ev94qEd2?IRRaP*}^IV)H@;Sh9Hy*-Sx*__KZbPUW@teD%% ztQV}%wekZXdc+ zGebHkX`CL}2k~JZ^{gD?Gk|9Knq*d^Am+#&h@4yR z0jciSwi>Rr$@HBY6H%fP%gO5~k<}RztMN(rsQ*vW%zZOl9KA=&=j`M28BFQoXbPJVY((mF(MOK_Yc!wurAE~Y1MdK+7^K7z%UkLbuiF9D98vAJIS7WCyh z#1(u5>{S&;@s+U060!WU94*bij-NhpH90?cc1Vrwb06x47qjd-!a5~>jtx{2eD~(a( zT9&a5(=}im*@X+mf}SfX50P60?kz3~()_^)W#}rsu1}P*GI3;C!jLsc6=qnjp^%-( z_V7=PU#_|9cPmkv+%mXXO_yW!tFMU=M&XoK2x8?tL ztN$~YAWY=JzyI6)w9Y}bVm&PilLCr$JjZyXV`=e`>)<3tg#led8>hVxZ*&-Wy%KegG{^&20jMO?KHU)2D& zmiS{G$5_GR_V3B-ui?+o;cIr=Te+S=j%&J13$(^$Yj?im3hba62R#RRw|aMWvb}w% z_dOsWHh=KlX!y=OJOsn&V8Nr^l&HtrqSIxKcF|OnuM8)7nskfux$b42<0=^3<>LA! zY}O4LUc9NtM4%O85ujXs{DgkxSGHwhzQ1>)#hYp-X7(1{#}Tc#R&~_uMR?ftmOAi9 z@zjTY&z*v?tXc8%RSO7Cn0I6k{Upf4YD?5ccR-;ro;keBfYAuZ(QR$A6ufG*jE%@b zc=FfF(G335H-p*GrDI-N7?Dh46nKj@yzrr^j3QAZ(Y426X;YYZivvvulp-^lTwEfL zq>L))W5@5>=z($enk#J?nK-s{0{1d%g_O+Lqk5 zHY5~h5x5XO+Bhi{w^Blh;sR$=FFGh>^d#T;IkJ313v!bRs&X`$ zEw;DA7N~WoY?T(oGEv{AqTxi`*P}D&EzxJ#PXp@kY%fOiYg6F`d6Uxwiiofn+6|cT zN|pP`(lctLT6Nk7N<{i4#mkPn-f~#biQ_VqI|dhex2M_4r?Un+(lteGCkY$29b*lz zTO(>UgnHbJ*-;OKAHNyM)lKc%;#NW$0|!e+uIsIlRaq1d@y+_<(R|^W-%S(52k68u zFc0`f@QHm6-M<;WOGhiI%bf-UG|GrbB;cC_m%sRNdqYl2ob0nuBfxB-K$i zNZ0h4xyE%K&~}9)&B>$IWU;b%jEo8}m6_bmjO1lgj7qtzc%wd$`2@yN77|4 zULJ05@1ubJ`_Q)8V67XEg0COuYWK>|;WV7#T$lpkX=(lGoO^BUhN`&e1gEM7?WM1^ ze3@D@(5@H0EE}y(6R@_3w-5k!GF+nVsQAhOk0sG4&n#G6L-c;&~X5GRPs1fd~ms zP=JJIauA0ST!c|i+)bm~sZQJIasKiBXD^<;JU)DSa3rXDH5F%x6ND*nIA3R|>aa*$ zGMt+#FrjXo`6XNp0-ehpD$I9hkh0TW|H;vQA7|Z=J={`}S38(hW~0g0o88)7O0oy= z;^6q@i>G@JAL8uX5r#nj#gMrgaa12@%n=fREaV=3|C^^T_xpW3&+cU^!|K1f9E~CV zeI#z5A*(5dG=cYdn+(oFhPUo1+q{o;sO3Ii-G&+afgVep9HxHX3~`JF_>30y8=!RQ zB2kOTMUUV++#BO_E|^zGhC94p^I=cQik*|RXO!#2S&{I=r!S7lo5M$c@d1n90-Z;* z;m|+B&I~S4;Pnf9%ajW^da2F0vFWr>!`~!`A+nUWynwAMENPRx!g)7h9>$f??-l<3 z-RLKRcJzKuiXG|wNJB^myOf6qfe z43Y}Z=L6(uuH67(YENI@O^0uI;H<{qBzH9!JOB>ltOfYNSsA`o9Ln~EAsbCws^JCs3$+-yHP!9zTAzzju7l|N7;lM+YykwO=bB$CZ!%a&&y~r1|pjo2SoS z9P|&LG6jduLnJOgHd>R7%ZH>y{zS36|G8oJWbaQ0kN2K_bNH~wKmDf%FOOgBJ;oj6 zFTa)t4-X#g;S_alvo%7mgLd3SYIKp;E%>Og6Ig3I|7jRQg+*~QQ7Ddp02wP5szCA~ z&VK?x_#?3&fnz2RDkX4$;0Sn)n?JV>7DFYR$=~Rq=nfnfIAWST+jc*DEW}H!C;<$B zz*+RF_iqfyc<=?k%ei;HyuTLexKw0qyc3c{icLR|hS7B1w&`(1Bu-~?EgV9@H9G|2 z1}1|s98ZUm8{$xI@;ZFM%p)U4qPnM-7f2^E?4Kjn5x$>7q(%XJz)+>s?w2zzC$`j9 zA2>@4nU?GVHR)o0dDWHn7o2J)sfQHM4Q9HQIqGAJ@Qf>fT&svSN%Ei6sZ(J=;L=q} zg$PDnU_p!GVlf&Go8f*R*IA)>91f{14rY2h;AG>Sf&J;(PKgn_J>Ch3j0&z?G{@5= z@$jF%ocx5)kx8k-;ofTmeLQ>hf8i34_o?$lBS(r)?8+d_CAI-_GJtQXgdgZF!Ki5- zV10f><3 zC$rIoq@TF~HqNqwWiNjABQcEO>M#Ypb;9d)vov##c1GL(sC3*+f5Hr=Utb|p4(7J$ zNq7E!I~-p;f;#*Mpf6F`$5tzr&(R#XCdVCD9pT*5RYE7K@ga^}jK*^#O|Tkb>Znbn z`rS%}!FU&bGMUw@(U`fnIu4o807gwwVmF1!c&j!-;xW6pnc8cuZy4hJ&1Epax*aKe z5rPDMJuz(h_RN}AGp0f0uzFRU9*1h;Lf2Gq!N0&=0iBW3rhxcb()1Q20%^=1K@uOq z?D!r55+a;oq?pc3LMD^nRh$9`uckN=7)@dbzB0edO?O6-z6f3ouKEEaN=vRpf>gC6 zZR@+3+=h!n=E(pBJ3Q@q-(rt4tem$87&Pum$jfHGcn{918h+b*S>+bovMRwmuHDK| zw*RFN?j{rCJYQCFpX_Yf3nk>r;n;rSyVGzP8m(Pw!LI+P*Mb>^*P7M3W`p~mqHdKX3Ny#z-h>sAcFdLoWW+_ShCxw!wp9n=%vHA5HYeA$V zWig-kjc@sBBWD2>INTXl5*J~Cu%8)6#vHv@1R=xd|gGVuEKgt}{@8;)+O zCn~M8d6Kg(3~o|_;VDY)kdh8R6ARPj(x-wHyC{k!d&<=jtS6R&xJhB;M?{>Og(Msn z*7P`P=Nx>5l8XeNC`RhU?h_Af!}oJx^V9u^$|A(dg=r>--TwH=-+{Gf0etu!eky+_-G zrp@zPPS4Pta_s=YFez7Mq4w&0Yg50HtT-@2S67UTtXOGiur+>i6{gSh--ZJ7FK^n7 z$jBA_$jhzYk!JVuCvN<)dl~(WhPh+dtj{l_R5=KR7{lXf3NDl>PUp0)gWK@Q=R?2@ zOBdqo5D1D1XJ?r4rlV@=u0gyWt{EdaiYma)vcW+y;dE^hb+|k7w|tZ1uM2;Kg6vFv4zb&AJlI-1vZh)MSr<1$7Gv4#)~{0Nb7;~Gsy3)w2?ORotK{B z5p+mv_JSG_8wS}DHqkCHPSl{7sJRr4jybXfPg7@*GhOzp4wlW0K)qzn$8nOAE$3WH zjNQzO9sEfd{J<;(zUM3Yj0-jD&u!rV4-Rx z8#}RF#_|sPcEmb&!thOP%!)9$1;jFxrK~A0GdEmuCo0C-AR^gvGdxUkllT^UoC}Jg zZ`V)A{Jhh0`2@)17u!H79^A)CU@RW`{g{3vUd6T;7XdtZOOzyI)I z2=686KtolM$kTu`RomODPR`&D^JQy-Q(EwusRfA(Sq?f7YkCoSOpJo>4)!Z@6$J$Q zgA)cXVHr3XfppvPxu7cCPMo$*<#jNBg_xy!b&IXkUS|zSZVqC_PZ?}?M?|PE?XiWB6n(KZiPWLn9F%oD|}-% z)!<#5Qx;T-oYk)pH7=QoGudbvLiK80c~!4hWLCY2i)3=#N< zp6S2hX_9$Ig_qUo%BrkVkxyBPTVYZLaXE*wqBmww2JPCs@gXi9S>vm8<&3XWWQ;Fx zD}3<)m$Su}yfIfiuxm3#(i`@vFJq4Fj=U+4-)gq?~ z0vBC7PfOxZx94gf8%BMor zBDV_VZiQzBxXU?LsBmNc6=2?&i!#FO`l>bA=&P>FM_+d-BYnYJ<)jDPjg`K}t?|+W zy)iQ_9rut4df>-fXSrsBx&UEa))qi4<#3_=tund*zZ<^`6>p901=!c-{t1)8kGoqt zR=g`;1Nb5n!^>OYSOB)1J)zW%c@Y40CwwVl)9pDteRlZtG0soxVSCvE3&$L5QDQi3 zjC6ClbDliI+?mg--Wt%n0}Tv+EW#}*p^gb$dbkMxGxUn+Ii@^*cBGclE>a{ zcMv~)&%goijE`~WZ8%DY^m@Elwq;|ty_MYgEsiJlKc|Ma6kJqUl{SefZ|=0?;XRsPHEs)wnuD(!BDG4lg-hLe)eV_?t=qyT^VM`iC985 z+rlxJ8Ql;HrPpgcpY(JKS7+*W<3^`=o8B$^fU^vuF=KNWlN8%mXF1k(f1CvqORq9t zEEvbEm_{|9C!}Vrl;>>(ZY(nmyk$e{fu9rJTT=xaP0tI2pnVq_nHw60Hxh+g1lkhF z5)~B<9|PSc5C*ttU#)7x=CK*wXI*;`jFj3O2u^5}Zg05t?#+PN4mLXXwLZ14i%Y$J zkJ5L2bYkq(x_C6BAsBapLA4e-9R`^NL<6qHSJ?GLN#?S#WrfxqTeWKc_+u*)W0l}H zIsEgA@#R_gbCB>Q&EUeFHi+2~J1P{5ebCUh(yCE{40V-<3yl_bL`mT%mTQ5abyXpR z(JDvgpfr*4!)a}Vy*&oJ13B>&?|sPS&mhz;rixD`4RQMd)fRw^Ok1XA<6L2oN`y5< zrzNz2VH%=~)1{1-iC5^RH)_l2}X(f5lgrT2JHOgUWvkRii zqz{d&wsH&TG9}?s%HkH~v*a;nNij+;oth2e#}E&{7~eY|NRDwkg1c2hjCul0dK z-S|=Vu8G%jgrY2)P#UmID%%J0aCWYz2U8edO(bdkBKDHh=mlR)qDkA|B0quz2%IsfrcLkV7ya2FNnA{aF^YN*^!hD; zcIgw25;eOi+01#p}ua9h_RVXgE!J_EhDr5;d zmMar8YS$Etr$R!wdgi`AN#Cs_%aVZe3PPm+ezwa*M4ESc-oKnM?>wK@bAPu|!({Pp z^(-Vxx?4R#d@c7?JJO}6S&Z-PZfdoSUyVR|)@OC!LR>beC86**elCfZmUMMx-u@-h zsc2bvwzXYT#aY@*RRWU00J)*vVFasd2U>7P?FG|7;=pb=Bbx%Y{SAqsn#g;FI*_b# zN`qR!t=zkf*3y-89A-$&1Q_nb?^T?rOvBtRbk@2 zqqL7Di9#-Zid2z8e8rE5GKS-Fe&zjiLxvz$b-R<87x>dI@v+N!cW;43H^8+s4_jpR zy4+Yr{+RkBW}lX&Nyn3(W;m#rKbY=$E_Eo}2mBtdgo6hTT^yis zYcD5McB!;pHQffj8?-&fFH?vyY(WN54!Y?!0PM3)r9b_7r^J>nr)yJrb29AL(U&qpFTcyHIg z9Z#|Fkpr5Ao+LYyv&B`E2mazmNMQ_U1>&tytrq6+EH5kjk2I`PCqyir*5CZq$oSC2 zNoECe7a+Hp<`bfb)&LWn;IC!3-VCrh8j6-LFAQm^oZzNQj9; zpS9`Yn)w|CB4KChNU1;dp>lL#&ZfB@l;Uw#(z>ow@(1^v3HOFD* z1tF9;7R?pXqm$&$oy^(6a(TBiy_lRRSfFykv#HZO6u3I*9qtv{5$}tv{x<-9quPbz z`?^>w$JBY#4ddMRr6PVk#G6cR=E6u4#Wkug_oyB1 zj7qDtNoSayf^-`M`mSo#BB_A-Lc$WtH z9i0o7tEa?1({)z{z13Y7ay=MPZ_@9Z^?9|b>qG&k=WdY%>V*@_1q(#UjAZM9wQs&t zH?1bnQFbjMy=#{<6f-iVcCiW;mv3!tc@;IU5x`nZQ(VVpRdJ?kL7OcH%QX0T%WJ`e zkYQr0M}Ol^HyXJ67@Np+Btuw3b|ivW8o`J0)mM)E!T8IThfW+y>%>F~<4uqz0zul` zujF22vRP~2GLoWZ&12*J+uDT;6zGP_IidL*jO5_0g>}^dn@HJi~s* zSJm}7xCE=5h^s_CA!AfC?YJKAfKJ}*wR!hZ&vEbi^x65aqj2XI2I1~)qbSs>b}CBO zb+p3H2at4+)3qdP_X8j$!*8cH`XKN(*pFYnrLA-H2idVL>t)-VRuckS)VMo~TiY95 zH>p94l9{*r8!<;WtHZ;G{pZiW>+ikz=BUrhBM_Wo(MM_4gcUEREtKWsJX1}p5XT&t%X7dst zx)Oc|vc#NmuuO1sQvZB3$F*=LZ+agqu2};JHfr>s1ROi6OC=r`%pJeEocyF$e#%mC zUJYhLB>BdllQ;Kp|Ln==453x*!1=53`)V%t#ms;6JCRCTRGl%(lIEZJONO(W%vw2m z%j6B0H_6iAub8{;;b1Xvxg*272VWpQfbTw4y~pSLuwH!kS@Yc=QBCT7{=*-C%wJoS zRA!-Imh&z>ot@ge1#Ca>1)rGopAXMZ&M#zJ7U_irkX}1CJ(DKtDQMmD-z`p!aD8OI zI~kK3y~*^g-1m(9pA$Yyo|oj%Pttp++OT#Xd$vMH4(fV zQ9Hoh=bUCMYR46Shw9DlAyW5nbUJqz-JBq}4Es0iC~i)}yQH<+@hSqw-N}p5`EZ|s zN>34}Wzkm^rSP zE*0i@Rmpq_g}cCg^9yE(fLOtBIv*`?bM3`?VR>ud-^gBNM{9@x;sVThr;Y&XGa=XCKr7^aSG5q;Xw(2g zQ_R;D9)M`fv+aE_?Um2K>!RFfPr$8DZ#R{Wu=agLi-PyD)fQ{P1hAfuOk$kdJE;+#?0O=9L& z-!Ur%vyXf1syT{^eh~+%{PD@^JXr z;_}^a@Dq)9A#@^lcwBS)g7CqOoR(%jNI%wVY>5gf;(k@+Yig26aXL2pFP7l*yp)v` zi1hxXfGV~s#uZPI9Pj2vX&Dfo%JKz$leztT`gRx(f4s(4ANz!xN2HLO%2<(~e9GpN zMg$ZeHoL&5P+og*w@8wEtf!}Au?lgA&}=Y&vr$ba&|kyqY>Jy_;Zb{CjYpFq&an)j z;1)PJE^n1!)#()GDlOFc<;4XqrmToJ45zRz+sY`)#`z%voDyK@5`N&{C*0_ST)dtB zG{otp#T!7yL4Iv&UIvwK-)hmVD1ccA+Tr)W?L|OMuOUYCm)td$y+YUodJryQ`m)i5 zocQUNvyXVT@N_gkK`0Mz1CX3yMj77&eArlV%=yA9)b~E~ShG zA{5lY&GB~vBH;$$0wi=rterJ0Nb7J(#CHIpF2|#j5oTGeOyS0vNgQ3*0bq^ToO%Ms z?+zWP3~s_`a>TF}oAG5~_do?UR|DooQoMt8M=60)96EDjH)<&yrq*c%nj>f~yO**a zDZ3j^pp^j1XtoJaF@ryQCqm@t3DKo|v9uFv2&uT$JK@huhCL(E=$RWDAqKALU?Xu; z>u&5hHJ8n(=BCc%BT2ilj6;(#1%z__AcKOVfpPIq&!GjH2kjrtnJ_X&jbs(lv z-sDv?QUvMh#%XLg+&ZVzhW`geFDGkFJvGEHAr;KWn^7%q{rXJ3el$Ylo9c_Ey1@bz z%ODnuS}M3UMcp)Lqy|%<3wBDE?%ovy?N8~bb@iS5zCWET2Cy4>U^bjDKSmh);1m|$ z*YJy}Dl+|dKDdzkW8CH0?4nxLJK^mP8bccnbPf?LIXl_jK72B`kfJ!c9Upu*8otXP z9>U!^cr_mGXqi6^-+#v_|L23zObhPrCf5K_cm=H2z=g;<2pOt1X4KY;ymK!d#Bkje z3A9jO%ze7|fx{)S2vDv*eu9mi>Xqe-;=NYLB`enSOd{X5KE|9GP02Vn2O{?(FdQV5 z3fQ>fQDgnCYqJog9?S0btY}*OBw2H&0BwsqVzZqD0a?S$&^A5Y;POMkQ9!ITYs4NjvBPqQh8rX2~=jYE}9Lt_+mOewS_Nuv|+B#d;X*JxH z{32y?EDZGjel$6qzMF4vKVm8pS%+_L??+PO#bHx1r2!Ba8cuUj)pmpWBp5Yq@&RX<0>79A<$(B{nK_I7B*y+C<#?vz$O#(OL2Hh4UH!kUQ zDNticBC}1rn-+Yu(Ys?6w3EybhA_+J`vcqCel|7R{|)}a))3LVib07u1UbRe9{tJ; zyWFlm{o?a~|3eZ2tL9`#l)q**3-R9hB?sD2&uZ3{XLGW$f_}nUw{B1Lh4V(FR@U#T z%}ym865Bi#0XJqb=@?Wl86p(k`L%_r>HLk_a(pl-M2&Uf|k7NxN!^v6Lt$<2cSE816>8yu&kFh)1!jW{db)(S*WA3w08T3jg-T7b!zX20) zB2;7o3x}%_q&m37S`PY=@wMTIZf$H_Ma>H(%WKOcsOk)9OL=`8Twnq{mP~a-LR#7` z9qVLyesTzW0*gc{Y^7unnMuGh{5Too&p?F~YnX@oWa043Lc^uAv4;fR#F0Z9Yp$@v z80fOwLu5p<&;hip>UjWtAlB^RxAte3F4A1b^Y$_KV8s5}s#>c_)VN`F% zv9^b?W{n3O*bMeea;AcmRcq455c>V^Wh2f4vGb1Bx>0C4#B8qFwy1cWfn%T|^zglV zIWAcbNJPqmtI*K$EYs{MpIY=JXT-dZd|B%!9~pIGV|k@oh31&}X1I7cv4Jgt|JksZ zA;Qs=M0N2tg;Z9j?;Z~4i+%W3hd*QIPIdal+w5WF!ukBo_-s6QJ-1T|)x|!BMYLr) z2>}Uuo|IYFF%^Y5>MjYxsC8Mp$qv@~RqK)Kh;$*R^>PNul>l&Qo=TeHle}sdHkqnD zf`p@B(n_T!w_h1!GRY?i}U<|!YvQ4zaN_# zJ=VUi&8vcySsNNo<=t#VMHR3Xn=l|Q-v0gQTtGUbG;r%A=9}n6+j8R8C~Q-%$;Lyj z$Zej$K=}L7uz(h6*o|;DpWICJ9wK0GI+zNp~@n9ULAH=E+XK!&P$!4bvS;-k*>*KIMj{W;i<_u7Fo7JhpD8iErzRE<~8qeAxiuht*kKe{)K85 zQ5yS=o^H1-|Fg~(I~tZyc~3*p*a((d=V8fqCA;VGC)&sATang(^_(O9%SrDJgV6X;SLj_N61 zy6cK%^KVCIh$zkY`|QQDm&dq|^+>uKHg!^r-otGB6}8d4Y`@{W%LI{VNYy7blMsGi z+I@Yf6~`4!@bKMkZz7peZT^~%N9TR)gZ+dhCSrZfDJb7z7V`y2m9a++W_45N)^ZM+ z&=DuSKbSDQdNBV90ogMin`f`a)!+<%0*S7ceoUE{&&pR9XrMm?k zSJ`@PhF?ysfY?=a;cCnj>d-L~`lRXK4sNM}m3+5e2 zZMKVtI%o#0LQ%w+P-`iq?qzQWdN{NT_-N$y%1TL%b=;uIKTFN&_ zM^Wypoi&^pYwH3wUf?|Oq0gm^5ze2vTg3>1pC&E%G}5o>faYs{a({Xa8)Bj`Rw-2- zfLa#o{*#|xV<=5dL+zTRM&0e&TVp&%YcayfyWdF+wEOyRAP*!>hiHy(9N1-!?D~8d zu1A8#Ib6>_W7KliN>GDqs+GweWMf!3bhCkhG5uTUztLH6pfB~Ghq>OxU5P@@Cj0?a zbeb~4U5f2H>KsT!>squwXwRZFT^OiX-A*Q z@fJi#?i?GyYxXVzYIe#1ckPl3Xi78}U1WPlZQ{H{7$bI`{GrR(6$@P6y=m_~{5DGX z_Hv@Q%}BeC4#r~t6}1};M%o+oW$IPb(y+WWGsj*PYKYwz4oAK`gze2}cCpF_I890I zgSFCRdO5dqP7nlKMa=)0&tm{HX>iKclWC4tj)ueP&0=ve-~Qy2)9J~4>wI)Fo6e`W zyWwPd{>eLCp?q@r?&6b^i;H_0yZ7*HwzxOA7|lO{yW-?>#uPa3e=B(2!^zEi%oKty z;yW>nead#wKVpD6=%Hm|5QfbOC3WCL>Dw?;5U4KEWXMtc?Iw;=abq*yz5Na&-eRNK z)MD8C7NKxDYuQaziQuxKa|%V9!Pp_-S}-qu2N-U_ViVt$J5I~9&y7HbfSp3d=3UsP z#(rQ}W3&@NmAp_?5ROX$@Jd%IJt?B=z&k1xZhJ;|teDIR^RpT%i3BzxHJV(us3YrA zAzA_2{YsWiSG7wuy+cIYAqQOiexLjw3?I9T{78t7MQ#~AE1J3owfEb3OD=Nt`7pcb1JBI8DGx6_DGsFSb3p2V+f_b?gJd)x0_5o& z+|fu8(eK;ar6R(gRvCJ(Gf7S-X?M~6=jj}M}} z8{-PvOk{__>^UY3W2s?c(qxP-PQFkW=nT>pjS-(;WTlAmk=HPFCCPOjv4IN0@^Tdr zoTae#(yH((cAEn-UkOL-+}O~8yruwSRw)Q@y)#QhG9oE58G5YaU`r|FjgSNA4^J>dP!Xt3ngqa_RE%q*v)`r?%V1&0_azepmd*~qJIMf%fDMEM? z4zhySn_3JLQwJH2qLmu=Ug}G^jI4(K-`db@b%9ajLUS89l&J<#U>3VzV}@VrlYN`u zEddjqeuT%*Ok8gL0mAYm^IafHB3#n!b;ks_9dLI7C|D*GqF^R*DzytL7(2qLpK#r1 zXhI2|urZa=a1%r)gXqCvWJ`>ndS?fxxWxy4e{8Mj$s&EMYD?3&)Z{;_S5irUB?GP} z|JI~J@Cfs&6iA&|rF)a1wW?&a5$mk5PWtZk!Vhj7T;KvKOw!o=*Dq~SWv}n;BGahN zKn%S6;m5G?J(wYS6NF6w$mpEye4>r_g%Y;d8^4F=5R|(F5f%^3 zrJAU)8}i6mp+B(4h^|#{6za4opsTRn`Q^tRo4a%8uA0$x`yIQKmw9etw%cT4oZRXF z5|vnyAH&WoH9l^+%29}+1XbM>Sk*$j74srn3ZE5IBa0bl8)}l>MLz8_B!%pQ*xb2- zbF>;5!`vWD`!SCcBfwIhJ#pA zGz*m(wpMqP{R~H{2gOk5+Kl3fA3t|15fY0Vvd8CI?LttRW7mwa`=)f}4rP2O+{gir`$A zYS$E^==okljC6O#ySjHMPZ88IiE^W94N)qzn40?lQWd*$t5o?%5wTmK<~615h0K9| z{9cFBafmcTFu+g3u}l_kN4sT6n5Ofi;RA?g=w@7erT(rVukJ&`A*{z|5fxH=>=^2Qd#%P$)P2G_Y>9B+hF=1fJmF9xsSOqfo3@?0`l!2d>J>4=x{ z#-Ug6)RMrlB~6pjpjmWQMIkVm;k8l5AgvVCSNq6y>K{Owk!t|wRAOx)=P#EI;)p7x zDPs9QZ$RfH34{4=6^Z*{hIM_XC^Q#lPim1d(g}+XJo4fye#^L`9{wB9C@lOydBrajR5gXVrKD zm-rd@7PNS8Gjmg_WQ5!q8(XKyS}>bpZz~sLH-`~nn|C64Qejt6#%kEaJ?#ya$4y0H zjCs&(&!=RW5eFv$w!>NDLxIj~9};6jy1#xB0t>O}s6v(yV<~=`E%Ip|*%Hos1!Kg( z@y571(OKEilRx?4F1H0aMqJEns8N8W$!*5ypqhT&8czqOs(-Tk%Ao3McfGMXKY2`x zqkG&h?n(-WIx%9D>frSV8_0ngF`_g{l;WWOs@yf-rEMjatI>?;H)M(Bn(P`)c;!hb zZRege>gv+x-_ln2FF&q5*|A76UkG8z8(sU@NwoN)3?yneJfa>uJYCZscNg$Fc#i3n zDrSIPk>wQOZ-3WT1txQP+Ic*wA z--bA7i?WtQ8hMc_$tp^mnevdw%_Vjm2|O3?Q_wh3i|klFwwiYVI@;PEYIQK1O=tVK zrffB7SMTJmEm+nYo-$^d+_M3ODjoNhKNK?zHl#f)~MTQNPYmj`9IB2+* z$jDV!mI<&UtxiFM|by&l@ ziZXM2<6QL%0k zDboGJiPaQORtujl2`#f=?M#zIf>;0bU(r}>LA`}b-V+H(94EyecKsK|^FPE2Dk9^$&xWa1}U zaXS4gjP>SwCol>##$;v_wmM1NGOvBS5X`T+Gz*zNCOAAbgOM*8`C}fB4wE$z))5&t z+xWy0#x~s~9cloq`80;Js5-CWH`ewZwYXDNGdR2NJrQCKpHEDS)Z&l%#^KJNqD@L+ zvrSFH;(1FoSPtp-nC4cZH^K9X5zC^-gUHt>N0yAs-=-Tc0a@+IBPfb!^mEY;@0>~F zR=j#OvJxZXXF@7VCczTPHV(Trd@6QeCY-BvGb)qU(_QM0x1$&8SwTUWT%+LmxMRIUx9#guXO zO3==FI(^~kQd2V>d#e_)$fH%o}H3}w~S*o~OXv5|D%O9inh#&w$3 zN`%dc%AtMacHDD=BG|~;;LHIK5nZ~N=fpfSwr1x_|I4hp>nH2lP=_OMboM^XlRK#w zyUZbwR(0vc9po}|{o`RfXm#1*9%jKRNEe92`zmO%cE_fbowRS!BB5*wme~p0D7MR* z=v@wtY20+muI7Z(j_19rtyx>pLpR;lc|a|T%dATUvCOM|Pz*&4XH<+a5)J>Fi^5pp zO3vv=igr@kne?$1Wj+q!RSNr~+A4UzI3@_Ti5{N@$qOpjhlk_?gQfXV!Dzlqs)D6z z!-#!Sf~S$rVojv9RC83aG(Qfo4^+vx83tM&wX$+Az{a|mL|9AH%TMoKfR+zic#(Jk zsM8+64AHC1Z--2Kr@j8egRftHBWLqJ3eR*>e)(%A4 z6Xa`H?bRf)vxg%a0I3heoS$pBJG5dZD}kx%38v2%q8}Y5eyt>fww&E;(AgQ_7ME$H zG;~WGeW^^4V|QRRmXg^a6?LY&X7$jCl4q5bC8?;46o*sXlD*R0E?$#c*|OBv%ENM3 zsfU0gk^wn~aIW(ewtg+&qzkJAwunwe9+~{v_BJL-?C*1Hc`y#~t5+fuO*;d|Pql~4 ztXaTEY^{%JZ?u^27@fZ_C57?v+;;^QVAcaXY>f;ONF<5mOp~F8so8*QkZ>p=m;Htx zEFLe1T!}=om$cJCcEbR@oJ}nAaGS4-HS)Si6@x*19adOPil(zeDZb`*sq6!fT$;6i z2;#Tm7B>sp*rPE(&&|~NHl9mfCVQe>^#o9@qN7V~!6RZ2N;A?>OsmkIu1dneT;%!W=G`(2AoWg% z4}tSj!}w-HG@JGW6kXF7#^GL+KwEmk?vilCtXh)>oRDSVr9Ork*pmpE>b35acS=Zu|uV+e5?-7FBb20`#7Gnf&kcvlD;VTWd=cgaD7M< zAbl>;w#^V||C;Vd@x%6M#jEG3oG-_bGceni0q%iX= z(5kym{IyMrFun`hPBJApz)x=&2SVN(v_6@7`Dqifecb0kE!BwiYq!E;C;0Rihy>?eAP7juRoF_ynzFXh8C~)neUe)$5{5T)K znKf)Y&&HyI^77R=?#IG56b{&2Os8Xv6*~{l@zRUees3Z&LtkuY8qRQCFUzlGn4Lma>#scauUdH%S6JbQm6Z6C*`_e0B}rMm%GX?P~k6b0Q!8)KaJhdd$U z_b+usm>a{Vx{jR-oJ?5}b24n!JD2+w5-MpcL}!wnaISK2dJ4YHAzDhEfM1YELrZu< z21Be8GE1@_*Qktxr)}(PK#g4tX+5_BlHu${PBPiQnZk@RKLWknHMLbl*QGzfP7GWvRUmtKR*7;^Mn4A z-+Wy+z8y*5Vp%EiSytl7-r>_)DM$T01Bz7tG^_rUw2Sb4 zO`@t708lR1ocHegr;)RM1P+Zp#F@^)mI$HJtBPrlyhqYx$rn$*e*8SYk~LnlH2 zLo=cHVf!iccBu)}03V0+_W@*(r?u?JDju0eNTurqkn1o^@qLCkn@Awf#2B!&3 zj@EeZye|eZc1h9OMd)>E*+v~3fKA7slbyqToq>a~!DtN=eDn?Bt(X=s7MHVOv!u7i zW!BOARt%scTbRfqoSr)XO2j^Fu?t|W8f3}Faf?hf$zg}mum+}LqTSmy#s*0#3~Mu3X=k9NyVdK<(P@8r z2GOxM+*NrxeKACE4I*$)-XBl*E-uC+xK^-=#zeHs%XRyVZbG+D)2l2H;Nd$%H}&JTFK#svjDC3udGgj9e>d} zE@V!)oQ(c@i3|(MG;T!%YI3FvM&cJ{0r3+ku?mC=BPpyeoEBNarw+U{D%nk5Ns5GaTgWyrMAnC( zv~tq<1y88X(zLHotw9Eoy8DlVV=3qE$k;HXz(8H7&U8hp70}fr5zU{f?*?JCWM4xvndC6V8&iUw!*0aB0l-P{DB4M+_u9wY6c{tgI>u zw@8Ti@(_gDSFEmk5lm6gM-qouaFo)$j?0m2mY?%?0y3tALh_thC`Ed*z+`tvJm86Qz{x4W96WEc&Rqcj^3uZ ze?gh36U82pbNzDog_kw?n(=$EzJdiA0pv>6&4bin^d_e{o#FaB;h zSx1Aw@zT^TVVNz(j9v+9>n&>U-XP%-PY1;Yx8h3JX6zCMA+r-FcB{!tjbUG=35>|( zbl?*iICADhr?2hp_oLysaA=N&`KfnJn``Zm*h8^1U~;i*InK*^m@~@6&CF?oB5NPH zwm$Noh&THl%DbZ&?({qB_|M_g`oled=uXbQ)w8EjXX#c^vlSUKYdl-0`Kn2wnv`ct<#gEHe(9ZfKMVP6?B~u6OUX zmUCMf=wZX}+Fq~qjjby(=V+9NzqM9#lAQCI;vFC!Y{dqXn# zP&8(k;=k&(Vw-hxj985&GltB^HvWRN`)6_7*VgUCCnrVh9av=mQ=jVc9Xo6CmpAD_ z*>F@)I^C|BvEBlUqE$)FyP+E~ybuH9)1@iSVhyjl8MF`r8I)r0_r%PJO9mJ-+uIV< zW2T{*d`VVvD(ZmeDYfBj(feo>Fj^#x&^doKdVM)XBGDioz{rB1dI%4C1y6IOs}7`F zWZp$sH{p!sMiw1J#@dR+aFG}ev7sckZey#_#`0C`8nhu^ZIm&jnvJ)h>2z%xO-nWn zbIP|6zHY;U_D^wBG%nSSZ)7ve$6KwYs2?YKQjm4{SK_QwINnmUD*IIt(+g| zmw}i>Fb)!NnA`Bk)(|2H8`zqO9d_C!hb`kO7Nc+cZuP?t=Y#jJhW*RQ<$QSh4``A&8{_&_qQi2%9J!Q(KyZu2*dP#%swVZ4Y|eSg`FJ6T_yN8J{osX%^>GFZN4XR((XWZD5-= z-4^0(yV&xVkydOVd}1fJteK#*pKIkiVwnhx{PII1> zc$%1WMtxQ*&G=%a?ul+v-!m)|pnex_LJlF|8LbC}F=w+~&UC-~;2hsE64zEVH|2hmjubf=A^YHu z@NfzJYApI6FIOrhtL8~P%OH1WYXv7N6e4~&SF9iKNLP>B4$e43s7>kSQ}~9Ekh>iH z$oKpt!PZ|9bX@JnCoG`zx{mJ@e-OhBWDQ>T=XKRCG7Kb{I}<`D!zs!wc29$BewkrK z%%t|~OQ=y8W`yGQPyG^rW%&t3lvDK*H35%9F}fFW1X>kR5Q&C2f+z%!1iv>_33V8K zoWaFm7zIrqA{&FdL+FvjAZ-K${D6Ysd7)%L zgAz77zjT5p+9SaEXbFsu3P7S9bk{+NN{;ZgInD8ZjkzpAF4w>2{FT5GVG(qm>V}*f zLB6bTC4mSsuRp*V2JR>m6bY?@Yj#>;NmC6_<08MvJ(~ujJYb+*yf1ElMuL|s26>FA zN%OUQ=p_&asNHK4tBI#W&QYCVFBTU%YRs;_8#7d=Z?&nAnDWykuqllDVlnU#B$Q(%V-jN)5k+J1bRpn* z^!hb!N5aKMcn_<=MqY&!%F{`OY;L$KDYqkPnoW4$l%TF_0WuPS8b&yO-Yj@|ZbGEy zfLBs8t7m@(Jppyo4?7UO#~=SRoK1$~&pzEc9gjbTSG~kEJU7(tGI^f{o|X!hGy~<{ zYD4~2N1Apqv)i;vSBVblZ!&!cJ>z2ERWS75^|Ty7Mb+k^@O$g9;7jABNJPgqqltQF zvG!(1W3M@ya7)*Z!RAmltXL14aV?Cp^oA=mn?}wsa18vY4eXYw0`f03JCPfKq^j<5 zl?M??-5l_I>iE1*SoQf#p*9CaZAcT8@e=EfITojgAQZHai_FewWIL3s5I$whOdXkw zmoNzR`8TX0!n5Jz^1RYeNKyP)ZR#WuC&4fgG^#3>B|vq@bCKshgX6E%HJ76HX(6&ypG zA6;M3Q?B}nys#49ySjFOni zun1eEmgu9P992!^hE5uu0ngxA#bDM7sz<_W{ypz=46nV`WN&Y6scFMBEX$innxVFd z)fRU3SzLOQEm{%Xcc0f0U!qt?>|7L4fcETp+kb`UaIF2h^)(js?L0YG+T;NjvO6yw= z)VRErDSh1)fOREb*b?l2|8;E#;uJ<861!|~Uu!|DOj^C3)p8|ekuPV7zaGkqF1zLz z7YY?*t2xB@=0+=9qKv7_W8_rjH^asL1cMt1c^f4e6{(hhpZ*u9# zw1#|C<;7l;Hhu}LqY{oRvST4vrOJ>n7WjAh%1{^8SbOCHrHi*{@Y-Wbalgvs?FhRE zyxU{zIiO>>Bd8r;R7)p5I4fQjiiYTTgltmtUgVH?gQ_>9*KeHq(uZRx&!{_7k4YA% zcrzPSy;DyHKab8Y&!ManV(_q{jhZsnJtUfIJ`qO=BChRhLL`C?qU&*H0ZRBMH$#!? zvf<;(`(>8MKU6?L3kx_;uOE!0(w?&7C0tP=a`xHJp3q1$j>r;%r*+=4t$>qg2$Uk$jy2QT3 zP=rh`?r<1I&IdMpVNT5gK z!RvV)0!t_hGBAAH1jVNj++%D{KeCI`;Hr3#)0{>5iN&9jJ=jyg9({+xGg4@XlAjf} zwtlJRd1Jp+m-z$RR;&V-p3g?p*=X_p3YjWu!VwWX8vQ@|;qmYE45!=T44S2L@jDc% zCUuL!X#<*1I>wa(6=IVjFuZfW6zKrdMuP0AVpq10dpqI6fh+qT`LeGXw(DFM5e4ol zej~-+jV7}NR5Al|92r0gOPHOm;cJ<$2_=WgC#st2@?TSfGT&&)Yux^o^}~X0`fFY( zegow57LnZ`-ICl0y39~*5{rg|Fe12f%^O@h@lr;XPm7gHr!ZK!#sog<&aLvb&TEN= zi5wym&q1_B%ppWX_^IJn2>U;XH|nM{H>@d(cJ+&=yJ1sd9P;L5Tfd8!HJd!Kxz&(W zV*_F@q=|=UA4x8}D!*`nEcw~L+3*Y@C&=Icy-xIpT%gQ%;$z7-|9$ZS zm=~eyk}~k=AQj`{{dc?@NZF8x7#m4vBh)GaF6Vl4kC{nvWTeWD|HqYp596s&m_##H z8Q?EtDF>+7&(MWqh7s_e&`!rS$x5Kx+s}|Me@4(ntQuyZERqiAPm%0%Haa;%oX`MC zmOG*&>u{WF9ANH!b3TM4SuPb|ZmaN$Tm15{hz=*`KO(LQj=PtK_!`I&37UB1$c|fE zaoh@s?pS@~?kR!?^ao!kctC&f#k%0Fej9kU9^e!G^&1Ef+FC#Z5_bmr0RCs6UZVr7 z-v*w|2l(v3`V9mKZ7rYyiQ?1_{QvB|OK_Y?k|vfiJ$A*FOmiHQ$xMG$4Oj^ji3Y$o z8pIF;z#^w`ID!XW_)|Aefj?7yVEOB!4WXhDU~IIV1RVy^RQ1j|g1X7yTk>t( z`Un>7S{B=s@8d!c0Z01}u{^>uXx!>2uv&R00TA}(+qeLjJCn7)#NTo2=Bm3b1{QOh zl|(h)X9Ac&CCmhX?f01gma8j>u6&sZNG@h%Oz?Lm0QV4uOo045EMz>qN z!08kCTlmeX=;Z2{qGO>#te0=6p+fE{7Pv=dLa3^*(_pC$rh^M?Z>*%j0;;Itsj$t0 zb;@^QxWM-I%^Yk+=S~b&HE|lO)3g)ARTZ3uD;j!oMo_(+2C8~{a;U1S(@?E8pB%2y z;%UHC@{saciKIkZD4YUH0)f(z7tfKyj9LK>E<{GO%BmcGHIx}ov?)` zZ_Z9VBQ<9WPu`r&Nh7r-B`0r)Q`SiBu;Ap)Z~_~t85SJ98Cj8Jw=we8#2xP>pu!HCNVmLa#+pzXtZkSw}*^0o~%{$%V4lQD)w6hFoK4wFgT?yfeHG(sl+MbcXS&{EIc}JL!a-$s1>wp1Yikedt|>Rg*zOR| zDLZSiovg1Um6*80I%^9~(OYsdJQdTAtsp#Ee@E@EDK|xLXVF=U?PPuBkja8zl(7|W z%ye=KC(iU^D+o{4-%-13%1t-6Q+L*4J6T_K@ic5;)d@EFs2bndbfc=MPS#DcoEz3p zEjGn~>SA(A_BF^()>F5{9M)G`aEjjQB6rH(T0AB+DrDt5tgkFIML*4=d&-Uqrjre- zU5XFur*+oKLgMNaJvOf1=>*ndJz1Y~E!)UNFpL^QA?Si@8af3Yi;1`+s6QE%#IrGs z5G*u(U+GwxsFQw`B-r|nX3w(jyx9F}_t`hQm96bZIMKQ#J@aeC!E326U+ipYi4Rhb zYthX5kcEDLvR*8B2vi)-}Li1w+E-2#dC#5`ZYs3 zi7$2{IQk|kfUww2 zsFgfru=W-I+&Gjmb!JAH9pW%E%Ge&wf@j7ijrDiVj5g$&84}0hHw(TI-`|*g!#Xpg z4M<~m^k*PZ;F~GDnO>r-dv<*&X>#h!M$OESDy}!viWA5y4#lBV2~@DDGfRfCu^O{s zm?>PO@!*e58jcGq&5SlwG&3ZQ#cygwqdv=VxJF&AV))Hq+72UTX23MlxL`fY82{!t zR56a(S&>EEv@@Hur*qi4NIB;T9fvZu(#%9jow_rljm2+jQ4;s*IFu2m@2oh+xPWIy zmMNUUUXZMVbsVZhF5+2e7zqlV8C`6brk${JSFMrvcpRb)g*G$k3mn2Tqv=rWryATE?~$GX3(_$?Gh$t?i`vVsIIG7YnRi^zlw{dttKNx_9VHtkH6LF8Fh-n|4AWXn z<4IiKo{qW9ZGF(gS20!J+kuc~Cg2venKA4@w5OKrT1S-Y@dO~5NMZ6)oHx%LllDetEZ-@_sP$Ipagcg^qj&;KZKm()}ET2-gQ3% zauV3(k~8+@9umHo%2aGvxL9yfi2>FRro(_`p_F?C}#>z|XkuqN*k%0PdQk!Hl0>PUs z;nSh}75Ls7-6JHhi4RS)CO`2xgv>GSB32=FF>~}uEA0D7+IuH&m?!x4T!P5Dj2ICGzyR0UxUW5r!aN7;VBza^#C+w+DMfz zg6Ai*H1OcWg1@?6)@r=(J~iGTmSgVJX$y0Z15`os;r>xTnRN60^KLtXnM*XUNT$X& z?w1+Y+2W?$WimZD2KU_s-CfuBkl*Ki5?6-0vWfN0(a54PEVu$?#|(g49F8!?Ju+aBF~?z?&82Xi zGsS`tzD4gcrxv?YLF)>yI8 zsme34c^+BPFrtTYTr?Wjl2}yi%V_>p{`6XvhD0C@B%puEUj>%NXscq|-`TE>4Nnt0 zqpl(?6!%vLbATA+4BRK9k6i5am|)DDPKwda>ZYN?G)vJVZDT&*lYzWIdGy+k#reqs z;nTpJ)bZg%`|(PVPvT#ZaPxH*zJZ-D-}W;=Iwj8?%iEpx^eHu&D*zc-CnwJ z=f#sJo~*e*keNg-o?2eIckkBn^6izoE6dAL?XzgGb1SDXSXsV(d-=xgmD|fNMs4-> zojZ4KFW*CXvztq%;>Yw;mu%==y2HK!#@sQ(gYUi%n}!jNysMF*N4T?n3FcR+ngAeY@7kQr@p zpzGGOPNn6$uk;b`olF7j;+izJ{^93k*HTbJm4hb2_HJ}kPPxz5)=e^V5zn=En$yM3 zk3%UKmscWL3w|_`8QtZ(CEwm*Ea~s%(F=C5z=$+VYJG63gq* z=d<>Z`9~)=-WJ~Mh|1GjXZUkLh0B-dL*1)hw1wnJrX272iD2+wZ@xnIU0nANGKA9a7%*BPiZZO)V_s~?{#B6wx!I`; z(E93Xmv<*rPT>x3p0zI4L=@%O+Vav8mbmhuU2S)aBf@ChosDC_(`ztIGv*E5I!G+6 zSASQ#$GsG5apsXjAW-Lx?%PH^xD+AtZpAA^RkUOmeKtJ%l_+I#Yg?2t(R-bb%M#TGL;N%3bA9g zv5layM-w%+yp((aY|-MzNG(=_7LTTEu{xkdVF32{gZsu`x~VGsWvRN+6d)>E22%X+_)s?GK``uiS$#JQGtN{dRT-&+MJW4YGp;`E>X!Z zFc2vb%m^tYiL#i4NO}Bf{%d_yROOhJh3h&G_=odC$>rO?KVlX#Ou9e$P=HU}8d4Hc zFoGk~sIJCa@E%6*O{1+k#ymH+QS=N~5Y^tqn(ssn)Rexn>P{v#-mKyJ<@v$XM6`yr zHld!)+HPP43tT{1yVb#1)hETv^}xpV$XIKcdl)3K&AI4sa~+7~*$9U8Q%S`^b5^O; zG6ba+5s+!Ll#u&kAHJk{=rB;0P*D|4FZKzXPd#KY^c9ROt6kwL$LKrv(;`<5=rk@I zzHysDIa2M_-Pe5b`Ss8Jqvabp&vMGGxN?3DA#Gv=_++3?6g<2>#7|}gXD$wq6{d5j z4+$(7UH;VZalPlGECR+?fuYAbQYG`oN>qpS%9$s8YOHCm0Pia2y;^#Wi)#n%EH^#1e)78B-cHP^q?w!~1s1e@F-X``Rnt zV<(pVI4qAp5X*ifmPZ_lEL#s`v1L!?mGP;(;;Fm>DqqVC`M|bUJZ)CSr_G9|%?fBU zZrgVqf2`aayY>w))i=f$>l=Ywk1yCaJk@UGQq4O`NqtPZ{KJpYiD$S`qFGz@b1`ik zF@A8ipqg5dh^5Bo!D@u%-SZnBzO|JSmcNNfBbdH9H;q2UOKFFePVj=9+FR1Nf4Y+U z^oCi#Rl{2Zt|fO}tgv7iSRL`TtI}Lq{-5G4K3kDDD>-j&$eSBEZ*G1tgdy`t%&js`+X-#uf@ ze{$M5t(~5guWG>jRjK6sbP@?4uW|EGLG*aou!0JojD|`<(6}I;*X-IXS{BN*8pNH7&kYaw$e_lnbO0|`G z`UsId@<=g^SFASXNYRI!@QUs*#v*=^aX{;9^)K48TliPdr@IQnd{{jk#|K)uEF7wnyM-27O1E z4Jc3AxLJ%#;5je1rR= zzpNZQ-rL^LoS{RSO5NEus8b}`vTbd_%qu$;SRZI6?kmkTza|yEh&_*&eUqZsVAjSa%0AI$FL3 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 XXMau|9ly?N)Piq - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Microsoft.Windows.CppWinRT.2.0.210806.1/build/native/Microsoft.Windows.CppWinRT.props b/Microsoft.Windows.CppWinRT.2.0.210806.1/build/native/Microsoft.Windows.CppWinRT.props deleted file mode 100644 index d7e2c652c..000000000 --- a/Microsoft.Windows.CppWinRT.2.0.210806.1/build/native/Microsoft.Windows.CppWinRT.props +++ /dev/null @@ -1,66 +0,0 @@ - - - - - - - $(MSBuildAllProjects);$(MSBuildThisFileFullPath) - - - - x64 - true - true - false - CppWinRT - true - - true - - PreventSdkUapPropsAssignment - true - - - - - false - stdcpp17 - - - true - $(IntDir)Unmerged\%(Filename).winmd - None - None - false - false - nul - nul - nul - nul - - - - - false - - - - false - - - - - - - - - diff --git a/Microsoft.Windows.CppWinRT.2.0.210806.1/build/native/Microsoft.Windows.CppWinRT.targets b/Microsoft.Windows.CppWinRT.2.0.210806.1/build/native/Microsoft.Windows.CppWinRT.targets deleted file mode 100644 index 16d0b020d..000000000 --- a/Microsoft.Windows.CppWinRT.2.0.210806.1/build/native/Microsoft.Windows.CppWinRT.targets +++ /dev/null @@ -1,888 +0,0 @@ - - - - - - $(MSBuildAllProjects);$(MSBuildThisFileFullPath) - - - - normal - -verbose - $(OutDir)$(RootNamespace).winmd - $(IntDir)Merged\ - $(IntDir)Unmerged\ - true - false - true - false - true - false - $([System.IO.Path]::GetFullPath($(MSBuildThisFileDirectory)))..\..\ - $([System.IO.Path]::GetFullPath($(MSBuildThisFileDirectory))) - $(CppWinRTParameters) -fastabi - "$(CppWinRTPackageDir)bin\" - "$(CppWinRTPackageDir)" - - - true - C++ - Windows.UI.Xaml - $(GeneratedFilesDir)XamlMetaDataProvider.idl - $(GeneratedFilesDir)XamlMetaDataProvider.cpp - - $(IntDir)$(MSBuildProjectFile).mdmerge.rsp - $(IntDir)$(MSBuildProjectFile).midlrt.rsp - $(IntDir)$(MSBuildProjectFile).cppwinrt_plat.rsp - $(IntDir)$(MSBuildProjectFile).cppwinrt_ref.rsp - $(IntDir)$(MSBuildProjectFile).cppwinrt_comp.rsp - - - - false - - false - true - true - true - - $(IntDir)Generated Files\ - - $(GeneratedFilesDir) - - $(WindowsSDK_MetadataPathVersioned) - - $(GeneratedFilesDir);$(CAExcludePath) - - - $(PrepareForBuildDependsOn); - CppWinRTVerifyKitVersion; - - - - $(BeforeMidlCompileTargets);CppWinRTAddXamlMetaDataProviderIdl; - - - $(ComputeMidlInputsTargets);CppWinRTComputeXamlGeneratedMidlInputs;CppWinRTSetMidlReferences; - - - $(AfterMidlTargets); - GetCppWinRTMdMergeInputs; - CppWinRTMergeProjectWinMDInputs; - CppWinRTGetResolvedWinMD; - CppWinRTCopyWinMDToOutputDirectory; - - - $(ResolveReferencesDependsOn); - CppWinRTImplicitlyExpandTargetPlatform - - - $(ResolveAssemblyReferencesDependsOn);GetCppWinRTProjectWinMDReferences;CppWinRTMarkStaticLibrariesPrivate; - - - - $(BeforeClCompileTargets);CppWinRTAddXamlMetaDataProviderCpp;CppWinRTMakeProjections; - - - - - CppWinRTComputeXamlGeneratedCompileInputs;$(ComputeCompileInputsTargets);CppWinRTHeapEnforcementOptOut; - - - - $(MarkupCompilePass1DependsOn);CppWinRTAddXamlReferences - - - $(MarkupCompilePass2DependsOn);CppWinRTSetXamlLocalAssembly - - - $(CleanDependsOn);CppWinRTClean - - - $(GetTargetPathDependsOn);CppWinRTGetResolvedWinMD - - - $(GetPackagingOutputsDependsOn);CppWinRTGetResolvedWinMD - - - - - - - false - - - - - <_CppWinRT_RS4OrGreater>false - <_CppWinRT_RS4OrGreater Condition="'$(TargetPlatformVersion)' >= '10.0.17134.0'">true - - - - - - - <_FilesToDelete Remove="@(_FilesToDelete)"/> - <_FilesToDelete Include="$(GeneratedFilesDir)**"/> - <_FilesToDelete Include="$(CppWinRTMergedDir)**"/> - <_FilesToDelete Include="$(CppWinRTUnmergedDir)**"/> - <_FilesToDelete Include="$(CppWinRTProjectWinMD)"/> - - - - - - - - %(ClCompile.AdditionalOptions) /DWINRT_NO_MAKE_DETECTION - - - - - - - - - <_TargetPlatformWinMDs Condition="'$(TargetPlatformSdkRootOverride)' != ''" Include="$(TargetPlatformSdkRootOverride)\References\$(XeWin10TargetVersion)\**\*.winmd"> - true - false - $(TargetPlatformMoniker) - $(TargetPlatformDisplayName) - CppWinRTImplicitlyExpandTargetPlatform - True - - <_TargetPlatformWinMDs Condition="'$(TargetPlatformSdkRootOverride)' == ''" Include="$(WindowsSDK_MetadataPathVersioned)\**\*.winmd"> - true - false - $(TargetPlatformMoniker) - $(TargetPlatformDisplayName) - CppWinRTImplicitlyExpandTargetPlatform - True - - - - - - - - - - <_ResolveAssemblyReferenceResolvedFiles Include="@(_TargetPlatformWinMDs)" /> - - - <_TargetPlatformWinMDs Remove="@(_TargetPlatformWinMDs)" /> - - - - - - - - - true - true - - - false - - - - - - - - - - - - - - - - - <_CppWinRTProjectWinMDItems Include="$(CppWinRTProjectWinMD)" /> - - - $([System.IO.Path]::GetFileName('$(CppWinRTProjectWinMD)')) - true - $(WinMDImplementationPath)$(TargetName)$(TargetExt) - winmd - true - $(MSBuildProjectName) - $(ConfigurationType) - - - <_CppWinRTProjectWinMDItems Remove="$(CppWinRTProjectWinMD)" /> - - - - - - - - - <_ResolvedProjectReferencePaths Condition="'%(_ResolvedProjectReferencePaths.ProjectType)' == 'StaticLibrary'"> - false - - - - - - - - <_CppWinRTPlatformWinMDInputs Remove="@(_CppWinRTPlatformWinMDInputs)" /> - <_CppWinRTPlatformWinMDInputs Include="@(CppWinRTPlatformWinMDReferences)" /> - - %(FullPath) - - - - - - - - - <_CppWinRTPlatformWinMDReferences Remove="@(_CppWinRTPlatformWinMDReferences)" /> - <_CppWinRTPlatformWinMDReferences Include="@(ReferencePath)" Condition="'%(ReferencePath.IsSystemReference)' == 'true' and '%(ReferencePath.WinMDFile)' == 'true' and '%(ReferencePath.ReferenceSourceTarget)' == 'ResolveAssemblyReference'" /> - - <_CppWinRTPlatformWinMDReferences Include="@(ReferencePath)" Condition="'%(ReferencePath.IsSystemReference)' == 'true' and '%(ReferencePath.WinMDFile)' == 'true' and '%(ReferencePath.ResolvedFrom)' == 'ImplicitlyExpandTargetPlatform'" /> - - <_CppWinRTPlatformWinMDReferences Include="@(ReferencePath)" Condition="'%(ReferencePath.IsSystemReference)' == 'true' and '%(ReferencePath.WinMDFile)' == 'true' and '%(ReferencePath.ResolvedFrom)' == 'CppWinRTImplicitlyExpandTargetPlatform'" /> - <_CppWinRTPlatformWinMDReferences Include="$(CppWinRTSDKReferences)" /> - - - %(FullPath) - - - - - - - - - <_CppWinRTDirectWinMDReferences Remove="@(_CppWinRTDirectWinMDReferences)" /> - <_CppWinRTDirectWinMDReferences Include="@(ReferencePath)" Condition="'%(ReferencePath.IsSystemReference)' != 'true' and '%(ReferencePath.WinMDFile)' == 'true' and '%(ReferencePath.ReferenceSourceTarget)' == 'ResolveAssemblyReference'" /> - <_CppWinRTDirectWinMDReferences Include="@(ReferencePath)" Condition="'%(ReferencePath.WinMDFile)' == 'true' and '%(ReferencePath.ReferenceSourceTarget)' == 'ExpandSDKReference'" /> - - - %(FullPath) - - - - - - - - - - <_CppWinRTStaticProjectReferences Remove="@(_CppWinRTStaticProjectReferences)"/> - <_CppWinRTStaticProjectReferences Include="@(_ResolvedProjectReferencePaths)" - Condition= "'%(_ResolvedProjectReferencePaths.ProjectType)'=='StaticLibrary' AND - '%(_ResolvedProjectReferencePaths.WinMDFile)' == 'true'"/> - - <_CppWinRTDynamicProjectReferences Remove="@(_CppWinRTDynamicProjectReferences)"/> - <_CppWinRTDynamicProjectReferences Include="@(_ResolvedProjectReferencePaths)" - Condition= "'%(_ResolvedProjectReferencePaths.ProjectType)'!='StaticLibrary' AND - ('%(_ResolvedProjectReferencePaths.WinMDFile)' == 'true' OR - ('%(_ResolvedProjectReferencePaths.WinMDFile)' == '' AND '%(_ResolvedProjectReferencePaths.Extension)' == '.winmd'))"/> - - - - - %(FullPath) - - - - %(FullPath) - - - - - - - - - - - - <_MdMergeInputs Remove="@(_MdMergeInputs)"/> - <_MdMergeInputs Include="@(Midl)"> - %(Midl.OutputDirectory)%(Midl.MetadataFileName) - $(CppWinRTProjectWinMD) - - - <_MdMergeInputs Include="@(CppWinRTStaticProjectWinMDReferences)" Condition="'$(ConfigurationType)' != 'StaticLibrary'"> - $(CppWinRTProjectWinMD) - - <_MdMergeReferences Remove="@(_MdMergeReferences)" /> - - <_MdMergeReferences Include="@(CppWinRTStaticProjectWinMDReferences)" Condition="'$(ConfigurationType)' == 'StaticLibrary'" /> - <_MdMergeReferences Include="@(CppWinRTDirectWinMDReferences)" /> - <_MdMergeReferences Include="@(CppWinRTDynamicProjectWinMDReferences)" /> - <_MdMergeReferences Include="@(CppWinRTPlatformWinMDReferences)" /> - - - - - - - - - - - - - - <_DisableReferences>false - <_DisableReferences Condition="('$(CppWinRTOverrideSDKReferences)' != 'true') and ('$(TargetPlatformVersion)' < '10.0.18310.0')">true - - - - - - >true - - - - - - - - - - - XamlGenerated - - - - - - - - <_DisableReferences>false - <_DisableReferences Condition="('$(CppWinRTOverrideSDKReferences)' != 'true') and ('$(TargetPlatformVersion)' < '10.0.18310.0')">true - [$(XamlNamespace).Markup.FullXamlMetadataProvider] - import "$(XamlNamespace).Markup.idl"%3b - -// This file is generated by the build to support Xaml apps -$(XamlMarkupIdlImport) -namespace $(RootNamespace) -{ - $(FullXamlMetadataProviderAttribute)runtimeclass XamlMetaDataProvider : [default] $(XamlNamespace).Markup.IXamlMetadataProvider - { - XamlMetaDataProvider()%3b - } -} - - - - - - - - - - <_PCH>@(ClCompile->Metadata('PrecompiledHeaderFile')->Distinct()) - #include "$(_PCH)" - -// This file is generated by the build to support Xaml apps -$(XamlMetaDataProviderPch) -#include "XamlMetaDataProvider.h" -#include "XamlMetaDataProvider.g.cpp" - - - - - - - - - - <_MidlReferences Remove="@(_MidlReferences)"/> - <_MidlReferences Include="@(CppWinRTDirectWinMDReferences)"/> - <_MidlReferences Include="@(CppWinRTStaticProjectWinMDReferences)"/> - <_MidlReferences Include="@(CppWinRTDynamicProjectWinMDReferences)"/> - <_MidlReferences Include="@(CppWinRTPlatformWinMDReferences)"/> - <_MidlReferencesDistinct Remove="@(_MidlReferencesDistinct)" /> - <_MidlReferencesDistinct Include="@(_MidlReferences->'%(WinMDPath)'->Distinct())" /> - - %(Midl.AdditionalOptions) %40"$(CppWinRTMidlResponseFile)" - - - - <_MidlrtParameters>@(_MidlReferencesDistinct->'/reference "%(WinMDPath)"',' ') - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - <_MdMergeDepth Condition="'$(CppWinRTNamespaceMergeDepth)' != ''">-n:$(CppWinRTNamespaceMergeDepth) - <_MdMergeDepth Condition="'$(_MdMergeDepth)' == ''">$(CppWinRTMergeDepth) - <_MdMergeDepth Condition="'$(_MdMergeDepth)' == '' And '$(CppWinRTRootNamespaceAutoMerge)' == 'true'">-n:$(RootNamespace.Split('.').length) - <_MdMergeDepth Condition="'$(_MdMergeDepth)' == '' And ('@(Page)' != '' Or '@(ApplicationDefinition)' != '')">-n:1 - <_MdMergeCommand>$(MdMergePath)mdmerge %40"$(CppWinRTMdMergeResponseFile)" - - - - <_MdMergeParameters Condition="'$(CppWinRTMergeNoValidate)'!='true'">-v - <_MdMergeParameters>$(_MdMergeParameters) @(CppWinRTMdMergeMetadataDirectories->'-metadata_dir "%(RelativeDir)."', ' ') - <_MdMergeParameters>$(_MdMergeParameters) @(CppWinRTMdMergeInputs->'-i "%(Identity)"', ' ') - <_MdMergeParameters>$(_MdMergeParameters) -o "$(CppWinRTMergedDir.TrimEnd('\'))" -partial $(_MdMergeDepth) - - - - - - - - - - - <_MdMergedOutput Remove="@(_MdMergedOutput)"/> - <_MdMergedOutput Include="$(CppWinRTMergedDir)*.winmd"/> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - $(CppWinRTPath)cppwinrt %40"$(CppWinRTPlatformProjectionResponseFile)" - - - <_CppwinrtInputs Remove="@(_CppwinrtInputs)"/> - <_CppwinrtInputs Include="@(CppWinRTPlatformWinMDInputs)"/> - - - <_CppwinrtParameters>$(CppWinRTCommandVerbosity) $(CppWinRTParameters) - <_CppwinrtParameters>$(_CppwinrtParameters) @(_CppwinrtInputs->'-in "%(WinMDPath)"', ' ') - <_CppwinrtParameters>$(_CppwinrtParameters) -out "$(GeneratedFilesDir)." - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - $(CppWinRTPath)cppwinrt %40"$(CppWinRTReferenceProjectionResponseFile)" - - - <_CppwinrtRefInputs Remove="@(_CppwinrtRefInputs)"/> - <_CppwinrtRefInputs Include="@(CppWinRTDirectWinMDReferences)"/> - <_CppwinrtRefInputs Include="@(CppWinRTDynamicProjectWinMDReferences)"/> - <_CppwinrtRefRefs Remove="@(_CppwinrtRefRefs)"/> - <_CppwinrtRefRefs Include="@(CppWinRTPlatformWinMDReferences)"/> - - - <_CppwinrtParameters>$(CppWinRTCommandVerbosity) $(CppWinRTParameters) - <_CppwinrtParameters>$(_CppwinrtParameters) @(_CppwinrtRefInputs->'-in "%(WinMDPath)"', ' ') - <_CppwinrtParameters>$(_CppwinrtParameters) @(_CppwinrtRefRefs->'-ref "%(WinMDPath)"', ' ') - <_CppwinrtParameters>$(_CppwinrtParameters) -out "$(GeneratedFilesDir)." - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - <_PCH>@(ClCompile->Metadata('PrecompiledHeaderFile')->Distinct()) - - - - true - $(_PCH) - - - -prefix - -pch $(CppWinRTPrecompiledHeader) - $(CppWinRTPath)cppwinrt %40"$(CppWinRTComponentProjectionResponseFile)" - - - - <_MdMergedOutput Remove="@(_MdMergedOutput)"/> - <_MdMergedOutput Include="$(CppWinRTMergedDir)*.winmd"/> - <_CppwinrtCompInputs Remove="@(_CppwinrtCompInputs)"/> - <_CppwinrtCompInputs Include="@(_MdMergedOutput)"> - %(_MdMergedOutput.FullPath) - - - <_CppwinrtCompInputs Include="@(CppWinRTStaticProjectWinMDReferences)" Condition="'$(ConfigurationType)' == 'StaticLibrary'"> - %(CppWinRTStaticProjectWinMDReferences.FullPath) - - <_CppwinrtCompRefs Remove="@(_CppwinrtCompRefs)"/> - <_CppwinrtCompRefs Include="@(CppWinRTDirectWinMDReferences)"/> - <_CppwinrtCompRefs Include="@(CppWinRTDynamicProjectWinMDReferences)"/> - <_CppwinrtCompRefs Include="@(CppWinRTPlatformWinMDReferences)"/> - - - <_CppwinrtParameters>$(CppWinRTCommandVerbosity) $(CppWinRTParameters) -overwrite -name $(RootNamespace) $(CppWinRTCommandPrecompiledHeader) $(CppWinRTCommandUsePrefixes) -comp "$(GeneratedFilesDir)sources" - <_CppwinrtParameters Condition="'$(CppWinRTOptimized)'=='true'">$(_CppwinrtParameters) -opt - <_CppwinrtParameters>$(_CppwinrtParameters) @(_CppwinrtCompInputs->'-in "%(WinMDPath)"', ' ') - <_CppwinrtParameters>$(_CppwinrtParameters) @(_CppwinrtCompRefs->'-ref "%(WinMDPath)"', ' ') - <_CppwinrtParameters>$(_CppwinrtParameters) -out "$(GeneratedFilesDir)." - - - - - - - - - - - - - - - - - - - - - - - - - - $(CppWinRTProjectWinMD) - - - - - - - %(AdditionalOptions) /bigobj - %(AdditionalOptions) /await - %(AdditionalIncludeDirectories);$(GeneratedFilesDir) - - - $(WindowsSDK_MetadataFoundationPath);%(AdditionalMetadataDirectories) - $(WindowsSDK_MetadataPath);%(AdditionalMetadataDirectories) - %(AdditionalOptions) /nomidl - - - %(AdditionalDependencies);WindowsApp.lib - %(AdditionalDependencies);$(CppWinRTPackageDir)build\native\lib\$(Platform)\cppwinrt_fast_forwarder.lib - - - - diff --git a/Microsoft.Windows.CppWinRT.2.0.210806.1/build/native/lib/arm/cppwinrt_fast_forwarder.lib b/Microsoft.Windows.CppWinRT.2.0.210806.1/build/native/lib/arm/cppwinrt_fast_forwarder.lib deleted file mode 100644 index 18e1845062666bbe14e7080edfb364ca6341a10a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 323648 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%0D9~?FZ`^+c`YE;1pmo`&V?f7H8w-7H2ZG` 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 diff --git a/Microsoft.Windows.CppWinRT.2.0.210806.1/build/native/lib/win32/cppwinrt_fast_forwarder.lib b/Microsoft.Windows.CppWinRT.2.0.210806.1/build/native/lib/win32/cppwinrt_fast_forwarder.lib deleted file mode 100644 index 6788f38bf24186d467d0b161ce1ac5314c281995..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 217970 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 diff --git a/Microsoft.Windows.CppWinRT.2.0.210806.1/build/native/lib/x64/cppwinrt_fast_forwarder.lib b/Microsoft.Windows.CppWinRT.2.0.210806.1/build/native/lib/x64/cppwinrt_fast_forwarder.lib deleted file mode 100644 index 3855fe7888f051384cf9bc7f65b95f2f5817aeda..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 259428 zcmeGFe?aW{`2UX&JIIO+gAl?XWX+G~{35grLTDL;&@#JXvzs+b2w@N#!XSh&YzScx zLKuV)1|ft&O9+Dy`?;>`oV{Pyt82f1eEcI({|Z%bzFi&lC6OiTm@!{dwa4JaK=XxId5oX(jyglkn$BT+QF;&*MMh z59rV5kLOS459iM2e$xJ#@=sLUoy$K>{#o)*l7Ei;Q{Xmv*VwfgnK3u z?wLrqXCmRAiG+J567HEuxM#xs!;|hcmUPcn(j7hNe;jv+q&q~?9U|!tk#vVhx^H;D2Oyh`=2paEA!oAp&;@_XDTgAyV!TDR+pJJ4DJIBIW;C?hq+= zh?F}-${oV}Fll#)v^zxF9U|=xk#>hjyF;Y?KiwT7?GBN4hj4#W#vLN#4v}$($hbpf z+#xdV5E*xfjQ{z#LuA|`+;_>kLuB0{vhEOBcZjSzMAjW5>kg51hsgS$p*w{CfICFa z9U|urk#mR0xkKdKA#&~zId_PhJ4EjI&)Ka)B6j=`iP-T&Bx1)8k%%2XL?U+l5Q*6F zLnLCy50Qu+KSUyS{1AzlJB0fQy2Vbo#ZI`zPPoNRxW!Jm#ZI`zPPoNRxW!Jm#dh19 z@Xw7~?8MdlUGAB1i=A+bop6htaEqOAi=A+b?S8qCaEqOAi=A+bop6gyzjb)*m(&Tj z*a^4T3Afk@x7Z1{*#7Zyi=A+bop6htaEqOAi=7DE=Y(7Agj?){TkM2eZ2uIy#ZI`z zPPoNRxW!Jm#ZI`zPNdu?wp;9kTkM2eZ2zisi=A+bop6htaEqOAi=A+bO}~|W{3Vxm z?@n&96K=8nCz4z2gj?){TkM2e?1WqFgj?){TkM2e>_o=B#k$4zpZjjH6K=8T%K?r* zf^M-BZm|gQQ#Rq+9HyTkND;?4(=lq+4wIqNZc- za!I$?Nw?TZx7hyCaf_XFi=A|fopg(xbc>yIi=A|fopg(xbc>yIi|wCKx7bOy*h#n8 zNw?TZx7bOy*h#n8Nw?TZx7bOy*#0%>7CY${JLwiX=@vWb7CY${JLwiX=@vWb7CY${ z+ke`)#ZJ1#PP)ZTy2Vbq#ZJ1#PP)ZTy2Vbq#ZJ1#_MhpwyI zi=A|fopg(xbc>yIi|yWv0=L+KTkOCscHkB}aEl$d#SYwJ2X3(gx7dMOZ1?sVxWx|K zVh3)q1Gm_LTkOCscHkB}aEl$d#SYwJyLbG+Eq34*J8+8~xWx|KVh3)q1Gm_LTkOCs zcHkD~=NqpC$e!=bu0SU|h|Q zeEi?B1Gm_LTkOCscHkD<{Zb%siygSd4%}h~Zm|Qm*nwN@z%6#*7CUf@9k|8zkA++8 zz%6#*7CUf@9k|5~++qiAu>-f*fm`grEw+F9++qiAu>-f*fm`grEq34*J8+8~xWx|K zVh3)q{VUEbcHkB}aEl$d#SYwJ2X3(gx7dMO?7%H{;1=6|lDNeV++qiAu>-f*fm`gr zEq34*J8+8~xWx|KV!Kb{lw0hSTkMou?37#Vlw0hSTkMou?37#Vlw0hSTWt5vlX8ol za*LgEi=A?dopOtva*LgEi=A?dopOtva*OTWEK_c=Q*NSljRmW|5 z-GZmxf~Vbrr`>|5-GZmxg43T`J@&4bb_?#_D${Pk({91jZo$)T!P9QR({91jZo$)T z!P9QR({91tyL;L#c-k#^+AVn6EqK~3c-k#^+AVn6EqK~3c-k$v8>F;b@U&a-v|I4B zTky17@U&ZS`m@c)Un*|L(ry&e?j6=`XxhJD`A>fTndD!V{yFv!*wy^gkN>`Q+AVn6 zEx4Qgv|I4BTky17@U&a-v|I4BTky17@U&a-v|I4BTX26)x8P~F;AywuX}92Mx8P~F z;AywuX}92Mx8P~F;Qpy`3!Ziho^}hKb_3!ZTco^cDFaSNVt3!ZTco^cDF zaSNVt3!ZTc?mlHRZoxBd!82~bGj72%ZoxBd!82~bGj72%ZoxBd!QHz|#w~cpEqKN) zc*ZSw#w~cpEqKN)c*ZSw#w~cpEx3DQ%(w;5xCPI+1<$wz&$tE8xCPI+1<$wz&$tE8 zxCM9brj{Qqh)-8C} zEqK-~xcdanx&_a=1<$$#&$x8PZ~;90le zS-0R>x8PZ~;90leS-0R>x8Uw=FzXgP>lQrg7Ch?~JnI%b>lQrg7Ch?~JnI%b>lWO- zb7$RxXWfEl-GXP`f@j@=XWfEl-GXP`f@j@=XWfFkvB|mx&$E+yl=iGwl+=A!ag6G_V=iGwl+=A!ag6G_V=iGw3_vxHl@SI!l zoLlgmTkxD)@SI!loLlgmTkxD)@SIz4H!V50;5oP8Ik(_Bx8OOq;5oP8Ik(_Bx8OOq z;5j$gehvNn`7QBp%>G@@zh(H(KmTI(uMGb%)6e<;@4N8E=+8f$z6o{?D9VhOto{?D9VhOtFzpC++D|syX!b{cO570uH(erb)2}njuUs+apLYePTXC`@vl>N z9VhOteD?8jSH(~6%V!^+*U5eP?1SNcPsRNf;>msa?BnHrAN%CKeD>jSzmM&HZ~5fDeD?8jzmI)#Uq1Wr zxZlTiUv!XizmI)#Uq1T?y5Gk>xi267`TslCECe-`LOBkcZp8!%V%CXC->#E z4~F|%@{{}W>6`G$efjK5#Vz>Befi8w#r-?@$$k0ki^u&t_{n|wu-7N|<O-SvPNsvAN1Q)?{&~+jf21^a z=|vYl>+Fl4{PfV7cfaa8pZ>1+G4c1F3h`KsemAMRJ3)6q$VnSLv-t9Bhwe9e{qqW+ zyJo08OgH|czs@e5KUs=CAb7H)BlhE z?GFvDpFQz^zhnLGq0qnkL!r-4ocf#oa=lQfKNRafd-DH&zx}g9p`N|}`vdof`uoo= zp8w=apBjDSRpsC&*9b)p>F0QZYs!cIeI5SsI_`V=`xUPGezQ*sg*KjW>ib;vG5&s= z^4A3yoOPSBeE6Jm&l!5exdSiV?;g19+_r&N7NXq)XPnb9aM_symxaH0<`;M8AN{rv-9Tfa7amp^>!tlLb>_x;*B{ft6?xLm!B{mtsvWq*bG zndDcLuDtTfvu@KLq92bQq0kjY^>+4x`t{lK>Nj8y)aj87T@h99V2`NZkUgw^Blgz+ z@Xx<7ds98a-caYqbGVO z)NjKcRqtkxsNa@7tbRN8)_-yS+p{;-qwEd!JFwT)@5o+LzY}{^y@$P`erNWw`d!#d z>UU)?s`s)N)bGZgS3jFQP^Zs0I=_01J)$0G5348GTSqv5lD(-Ous76G>~-}tdrdvV zURBSsSJZRtW%YZom(=gcUR3X6FR0&(J+FRm_CTH9!RY+z{p=C-bJ)Y`_hoPW2j{;Z zds98n-cY|kdtLnj>^1cVvRBmy*emJ}VlS&dn7yR_5cZ<_AbUamq3n6}hp`9h4`+|6 z53xto&t(s*KZ3pWZ=9dsYp-ak^Ly$Q4fRK{*VP}*UQ>SzdsTgyy`uhD_Oklp*h}h< zXD_Ocuou*yz@ArsB72}t@BDOr^-=bSI?vb@Vf81oxBi9mKZU)iUSw~mpU+-bzkt1_ z{#5p=`WSmf{b}rF^{2C!)GuT&s*kf5)StngSLf}%B2d4WJ*v*jdqqV3ne1WpOW0e7 zIRCTQo9ZR@hWe%Kb@gYn*VLcGUR9rDuc$wly{!H`_LBPZ*^BB^>;?4~u;sYz6s~Bfzl^=E{&M!3`YYJ0>ND&W^;fc&)nCP4 zQooG7s6NYHP=7UhUi~%ff%ThPRs?W1m)ZfBhR(~sdN&Ri?MfC;tg8JLp^Xl(l57ghu9#vmtkEp+kJ*@t2_SWBV z{`asq)vN3c_4l&Z)!)ZnQ@@93+f+Y&#Ql!Jy8D$ zdsKaeJ)-_m_OSZL*jp`}|KsdU^%{Fa{S)kU^-r?b)IY^uRbOSVsDGNhto|AHlKN-a zi|T9a1@+Id=hZ*Y9;knTJ*vLW9#Q`ydszKT?5)4y{9k5os@K^Y>R(~6tACZfrv5ed zs`>_dMg8mSW%X~cm(;(>UR2*?FQ|WuJ+J<4_CWnR>{0bC_K5m-*~9AJV{iQx=l?!? zQ@z37Q2zmYUHymbHT55{SJk)KE9yUHFRTBAy`=tA_M-X@dqMqY?0NN{vj^(GV2`Tr zvPaZ^$sSh!6?^M1IRCHNo9a#WhWc;V>*~K{uc`lzy{f*)UQxe-y{!Iw_LBM^*o*4> z>;?5dvgg(R#2%>snLVn0z#dWm3wv1ouk5V@od0j^P4yOgL;dgUb@hL+*VO;XUR6J2 zuc-fvy{!Ik_LBO4*o*2%>;?7zvgg(R#~!F($sSdw`#972)vv)GR=*~D>(4m<8SG7U zz8rEzL;YIpb@gkr*VM1WUR7^nuc%*_y{vvFdrAFz>_zo<_JaEL+4Jf*U=P&KVvnkK zut(Hy$R1X|5qs-TIRA~=o9YqvhB{q=q4TTXl)a{YGxn-_CwoQx=ImwlTdR% z?_w{g--bGNW{SoKCJ$q9<%HB}F1AATlj_ft{JF!>Q zd)O=LcV;iE--W%TepmLQdM|rH{ch}e^|RRn^}Dl2)nn`t^*DQ2J;C1E$N7`&P4$4i zp`K!|tEbs(>KXQ`dX~MSo?|bo--ErReoywIdLMg1{a);O^?S1i>i1!fs`s-;)X!lL ztKXNs^#`2)e(X*4JbOd^{_J)22e8-FAIM%+A7HPjKZw1o{$Tc!`a{@@>VxbB^@pW^nHs*kW2)StkfSAQaVp#CKGsQM^-MEyMWu=f`JM^=Gi>)h}WX)Gua_s!y;-)St;7R=eK8I^%t{;)nCHi`W?>yQud~LnZ2R@GWNRq%h_w{uVAmL&#+h2U&&rpe-(R4 z{WA8V`Yd}v{nhMw_1CZm>aS&ws?V`U)L+LQR)0Nv>$f=n8`zub750Yu8`ThSytG|OiP=6>qW&)Su==~%Tff2i z-^1Qiud+AP-^*TCe;<2I{c`rI`VxCZ{r&7^^$)O@)IZ2xR9|KZ`^ zQS}w}i26s_!|ESnZ#8lLkFz(`YwQj6Pq5e3KgnKG{}g*weU-hU{%Q8I`e)cn>YrsV zs;{vZ)IZ0bSN}YFp#BB+sQNm4ME#5GVf8Puw|Kp78^{=y+)xW`BQvW7sQ;L~to{@BlKM~Ci|RY<1@)h?=hc7C9;p9c3&HtN)h0rv5wjs`?&#Mg0o)vik4YOX`1MFRJge z7u5gAo>%`9d!YVj_Ne*+dqn*&>|yo4vbT0|{=cy|)m!Wh^}n;%)&Id>Q~xJ>RsE2? zqW&-TviiT-OX~k&FRCB07u5gDo>%`Ld!T+LdsIDiP4bBPHQ2-I*JN+~0_Q)2y{R5% zZ>V33y{>+3_L};2*sJPo>=pIvvX|A*WG|^-kG-hg&R$TzK6_rBzY^k#K>aNCsCox` zME!>BVf7oaw|YeNr^_#Po)o;OGQokj8QN4@3 zpnfa%y!x%#1NGamN7cL8BkH$h53Apfz4bGk|Mu)n^(cEo{SNGP^*gfH)bGSzRqtW1 zsNb2rtbP~vlKNfQi|W1X1@*hJ=he?<57h6@9#xOAN7Uo&Vf6%iYX|2~vNzQO_J(?j zy{?{Suc>F)tLjzYu zd!YVs_Ne+0dqn+Q_OSXR*jqor`5(#NR4=eM)E~uOSAR5nP5m+KRrO)^iuz;O%j%C~ zFR4GCy{JCIUQp++>bfGY{zUdb{YmUm^-=bS`g!bO^(V8pevI=!g}td>WN)aS&t6x* zfW4;vRQ9U+7<)ziY3yb7r?Z#TFJv#OkFyulpTVA2zlc3hznDF$KEWPQe^1f0uvgV5*(>VLWiP8gkG-V+eDe+hf*M>zjW*_-NR_J;b)*z4*qXRoQhg1xFf!(LH;C3{)@RqQ48 z%h-$Rv+M=+SF`8UU&9`#zm`3!KF1zWe;s>R{q^jvAL9IPU~j5d*c<9^WUs5giM^)& zX7;N3JbOj`E$n6Wx3ZVi-^N~4Utlk&znwj={tos){hjPl^+ooG`n%Y}>hET6{Q&2G z4|`L+%HB|aFMD16ee5;$%h{{yOY9Z(_p_JPKfqp6{~&u&eVM(W{vr0f`iI#A^^dSe z)mPXf>K|nftAC8W)xh~b&fZk7u{YE|!CqJYBzsN$Q|wjsRrZSdr`gNupJ6Ylf0n(d zzQ$fq{~UW>{qyXB`WM)v>g((g^)IrA)xX5v`aaJ8W%j0eoxP#{752LNSJ`XoUt_PT zZ?IR?zs_D({|0+W{hRDX^-cDI`nTBg>fdG$)W5?XRo`NdsDGC|to}Xr*7tD!@3S}6 z8|)4BAF$Wef5=`_{}FpteVe_a{$uvC`cK$P>OW;Ks_(ED)PKgFSN}PCp#BT?sQNB@ zME#fSVfA0Jx4w(>|C+t2-ehm6|AxJ;{#*8%`tR7Q>U-=J^()xR>c3|%ssDk!sJ_o$ zQ2!%)Uj0w(f%>1>qv{9j5%s^Yht>be-rBi=dhssD$)sD8v=Q2#G`Uj2XUf%=u~QT5On=7&VL4bQ$5Vy zP`?&?UH#hZHTCPTSJm6tE9%!}FRP!)UQ)jvdr`fey`X-5_PqKH*aP*m*rVzl>=E@F zvWL}g#NPTg&VOU}rh0_Ep?(wgy82DoYw9;+uc~*lSJZFLURJ*adrAG4>_zo1_JaDY z*z@YQW)IYF!yZ-dW{;@fmOZR~JNDMMaQ@q~H`Sx;4fQ*)*VXUHUQ@pldsV%My`p|+ z_Okk2*h}hnWiP7tvKQ3v#-3L{n>|p!J9|_;#vW0Rvxn6a?5$0lKgr%y57-;(DfYU0 zn!To;VXvxZ*(>Tf_Okjt*h}j7WG|}su@}_u#hzEcH+!IdANHtvKYK*|9QLsKec4;z z#QE>X-c--CH`MRXURQqrdrkd;>{ayv_KNz0*vsk?o1LuDvdsDr@-cWxOdtLp}>^1eruvgWG*(>UgWiP8gj=iM* zc=n?D2zx>O3G8|GC$b0XPhyX%kFrP9&tng(KbgJtb)5ex>`nC|dqe$v_PY87>^1eL zvRBo|*emK!V=t>eoxP-fA$w7MoV}p_4EDVGMeKq4#q3e_3HFHkGugxHm$0`saQ*~*Duc<$Wy{bORUQvH8ds+Q?>?QT*vlrE;*bC|}V9%?+kUda;5qng9 znmwZaV)n55OW0dq!}(vz-c&EMH`HIoURQrPdrkcn>{ay{_KNx|*~{v$VlSy*#$HsP zWiP0|nmw=n8umc_wd_&#IrfP9>)6BUuV-(473Y5gdsDr_-cWxddtLoa>^1c_vscyU z*(>UAVK1w{mA$0?Huj?W0((LI?d*B=cd!TQ?_`gvFS19}-^CtQe>Z#UD>(mq*qiEA z_J;a<+3V`>W3Q=S&R$htVy~#bpS`U90rrym2ic42%j^a953%RfKg=Gee}p}%zQP_+ z|0sJ{{bTH{I?n%b_NID`y`laI_PY8f*=y>bVy~*NvRBkU&0bdj40}oav+PCnHTHt~ z=h*Y=pJxx$zrY?<#s=u-DbU%3f3d8hcfJgT12u zb@sCQH`q(+-()YUZ?YHEzr~(c|2BJ|{vGzH`WAac{k!a8_3yE_zJ&9CpS`KxU~j1Z zfW5B%L-v~bkJzi~+w2wfAG4R$f5Ki;|0#P>eTTiE{xkNx`p?+|^c3VIMn)c?#LRX<>lsQ-mMto~Q_);iArH}i=U8)URZZlE>%|0^ESUh3Q);6qo;d>i=Aq{^!(3Lm}q2 z(~Y^^aK~xpk3|f38tyXOZ8&PU$8fJ<{u%OL{No2gr#Nf4&v3utyx{@EgNBC;7Yq*@ z9x*&>xM+CH@VMa#!zII$hNlcq8!j83F+6K{&Tz%>yx|4Ii-xO)mkci(UNKxVylQyO z@Veo;;SIx^hPMni3~w9WF}!QIX?V}@zTpGIEyIU~j|_+COJn%2cKQ}J+-A7laEIZD z;ZDO{hPw?%4fh!CH5@Y>7|t5*Gu&@DZ+O7)py46I1;fLJM+}b|E*c&)JZ^ZxaLMqb z;VHw@hRcR$49^;#Gh8t|Z+OA*qT#CHCBw^xR}9w-uNq!6yl%K|c*F3f;Vr`r!`p^; z4DT9l8s0O!Z}`A)%kZJ$Bf}xOG|Yd=>)&vj;da9vh9ibM4R;ytHXJqFW4PCF%y3{h zYq-yFzu~;$0mFlahYS}C4;vmaJZiXTc+Bv);R(Yf!;^-m3{M*_8=f&dYk1CZ#qhl0 z1;dMmtA>{hFB@JlTr<3Cc+K#-;kw}s!<&Y;3^xpK8{RRzYq)86&+xwC1H&!DhlY;~ zhv=6^c>No0Gu&>t!*IlKr{ONc-G-xvdkps)ju{RNXASom?l+t_JYaax@Q~qx;bFrg zhDQw-4UZWfH#}juWO&l>l;LT^Wy3RuXARF8t{9#-ykL0IaMkdV;bp@shHHjb4X+tq zH(WQoVR+NeAS)N`1^F2 zk4Fr58tyXOZ8&PU$8fLVnBl;1)^MNUe#3dg1BM3;4;d~P9yUB;c+_yw@R;Fo!xM%} zh9?bA8J;#=Hauf^*6^I+is5;~3x*dBR}C*2UN*d9xMq0O@S5Ru!*#*e3G~8vl+i=uykKta!F~fo3 ztl>Vx{f6^~2MiAy9x_}oJZyNx@TlRU;W5MGh9?Y{3{M)KGCXa#YGs6~ps} z7Yr{Nt{Pr4yli;IaLw?l;WfkShUEf;fCRD!#jp|4L1$%8QwR1V7O)Y(D0Gr&~?n~-*B7ZcEcTpBZfN-cNy+B z95viyxYuyZa9}uVxX*CE;k@Ai!-Iy03>OR!8y+z{YPe{4%<#D33Bx7BlZK}ZPa7^9 zo-sUYc+POe@Vwy#!;6NihL;R48(uM7GrVee&G5S6y5SAOn})XxHw0FuZ8EYIw=; zvf&lOHN&fh*9@;4t{dJkylHsLaKrGn;T^-fhMR`>4DTC0Fx)bHX!yvm{KDt-uX)1! zi=floX1LvOhvA6fPQzV>yA4MT_ZaRq95Wmk&KmAB+;2E@S))&!=dZzYd&na&2YQn4#N?{orb#%cN>lx z?lIhJIA%C7oHg8MxZiNz@POe#!$XD(hKCK07#=lTG(2W_-0+0qlHp0iQ--GvmkrMt zo;5sYxMFzT@Pgq*!&SpehL;Vm7_J#!HN0kc-EiIThT%=aTZS8kw+-(Y-Zk7byk~gd z@PXl$;X}hmhULpaPrv7f`Ab7jbDQCI!ySerhC2;+8SXY5HQZyk*Ko{mU^r{I&v3ut zyx{@EgNBC;7Yq*@9x*&>xM+CH@VMa#!zII$hNlcq8!j83F+6K{&Tz%>yx|4Ii-xO) zmkci(UNKxVylQyO@Veo;;SIx^hPMni3~w9WF}!QIX?V}@zTpGIEyIU~j|_*-(${?0 zaGT+F!ySerhC2;+8SXY5HQZyk*Ko{mU^r{I&v3utyx{@EgNBC;7Yq*@9x*&>xM+CH z@VMa#!zII$hNlcq8!j83F+6K{&Tz%>yx|4Ii-xO)mkci(UNKxVylQyO@Veo;;SIx^ zhPMni3~w9WF}!QIX?X86^Z%R?;xA}8MSN+qLq5j8$hn~q`zeYLovNKgHLxl> zqeM5RZ)b#hK)t9jBL0!ikgw1`MOoB7qMJzV2jz)Q{m27EH>Gc9ga$!Fs0E^%NgW1_ zppFvp&-;u}5i~}0>PH?Yy1CQ|PziOC=oV6^K+{C0{@yatE$Q1Cp&8ID>KqY2N@s*B zpn22Z3p{^5k)3-B1bJwqT5N`0qqi<`g@y1x2JDsg!VxDs0Tz*sV&eU>JiZ$q=xA0h)+?N=+uwgMs!E1 z?Vt|S2+^ISc7nQ4yNPLDVNT0_sHVBD$B3?VWRs=9RZD^7K!dBbqq9)Izg0|S^`a?P7&Q->NKc~ zIz#jTsk5Lt)C$o9rOtyEP#1{?q*g&osLMnTlDYz_p{^1=Sn3*R9kovM5UCrWP1G%- zL8%SUHtG)1L#6J5ny7n350knNIzVj^JzVM`=m?cQHA6#E!=N^zQ?JQ(qI0EofFh`! zM30c#1?onP5B4M30i%56Yts5ItJzAZQ4+K=c@?!=Mq=QKDg~ zMbH@PIMHLJPJl|NlSGe`It7|WEfYOn>I`TWb&hC6Y6UcpxJrftr7nY3 zP-{d_lDZ07LtQ5tm0AaFpl%YKCv^+dK;0&KveX^WE^3qLDN^@9`=|#*MX4>&A?gv) z`BM3peWxf)bm~>tMs$JHc2Eaugy^YKJ3(Ej-9%$jqo5wtUZST-je!ExEYZ`Y_JR6Q z^F$X)9RLlY4iSw@Er5nmM~I#wbre)Y9V5C(>NscuwM2BW)Jf13>NL@W)G}xWb(ZLv zQs+Pw)On&yq%MFKQL9AHlDY(1MqME)Nv(laQP+qrmAVe9qizsATk0lg3$;P?9I4x& z9n@W-NvTcH9_l{PbEO`DTBwIa&y#ut3SH}}S6!Is`BK|J?Wi3@Q&JO<`(nwFXe4WJGZy;$lHsDL_5^b)Bfpi$H!(MzR{fyPlM zh{{q+ph?szqL)dX29;4~h+Zyr7Bq)iA$o<>dC&stBGHW0DrgCHndp^LS3ot?Rial( zT?4J7)`>2Yx&him-6EQm+5l~%?hw6N>Mp2>x<~XHsr#S<)E3cer5=KgP(#-ah32G& zL2X2*_m}8(QaeBq)J~$;OYH)6qeh9|Ahie7iy9-UNDV+))IOp&O6>>bQ3r_LBy|up zgjyhav(#bG2bY%v>>$tnnztA zdb`v`P!)BF=p9m*K`W>=qIXJN1+Ag36D>-ugEmk%iQXl33)Dc}CVIEj9ndanljuEC z_dxro2Sin=EzlwA5z%|4hOToJg^5n@FVXv?wu3rQBSe==?F4n9b`vd0je>emdx_pJ zH3kY$vqT?|+6U@K%@ci4>HugEb%KM_7rH+FpP)kG~kva*Q zLY*dBky-}Lpw1F~RO%e4f;vz1F{ulnMbs+M$E7ZTmQh!TYEo;URn#@2Pe@${)loNy zJ}Gq*w1wIr`jpgd&<^S@(W=xYXb*Lt=+jaUKrPfmqR&V@0)^VHdew!AJ}b2i)Q;Lg zv?etI>O}1#`kd5mP!zR?=<`y0K{3>T=nGP_pgz=oqIIcx&;aTn(HEr-feNU@L|>9R z0vbgv5`9_f7-$@If~YRF1e!#hBKnHdX;2w;hUlwOXF+qQ6{4?6od+$TE)s1>t%8Jn8_^52X%*hENMcKax5O8bKW;+Ll@bjiHVc{aES*sDwI6^b@I5plQ@H(NCq$ zfM!wWh<2n_K=Y^zL_d?d2&$qk5&c~1GH3<0M)V7*tDrU1b)sFVbKK11BT(pi zSH0@OME{Z625Lv`AUcv70d=Bw5&c(cHzh^{4d8dOG|A-cBIS;flSBcJ)x&~TDtrJ~O>IP^Nb&IH7Y6G;5xK@Szr0#_TGpWO%5!6wlPN_xE80t9D&81F& zN~n`Ww~#sonno=X-BRidXcl#js7q=EG>^JKbStTgpepJT(XFK}gH}*$M7NQ;3R**5 zC+e132W_Bk65Uqn7N~)`O>{e{JD^?ECeiJs?t%7E4~U{tTcAVKBceM<4PE~#3KN~) zU!proZ3lIrMu_etwG-5Z+D+6WH45rM?IpUi)EFp0%@W;3Y9FW{HBWR`sRN)v)FGl? zsRht5>Il)@q>h4$sAEKDOC1MIpq7a4E_D(#g*r_XlUfGNpw1G-rOtsWsPjY#sSBV* z)GAR@>Jn%fb%iL9S_7@3t`ViAu7m2R8$@ZTo1iV!22n=pHfRTRmnbW>3ED&5C(21Z z0JTsLiS8lw2o$=(Rj;}*(LJTMf!a|!i29^PK%J;vME8=~4T_@n5Zzm9FDQl@5Zy;= z7SxB@Pt-3p4;nxnBsxdx5U7AUOmttVBcM^#BGLV%j)BHeCy4S=OQ1>ADWdyJod%Ur zXNVpkbrv*-S|NI%)OpYX>LSsA)GBBRb(!cvQddAV)K#JfOI-u4qt=NYB6S0_iMmBJ zD769FM%^KLsMK9h6LpX1VN&-&2dFKghf6&K9ij4bY%G$OSEnnztAdV= zq9;jR1+Ag36OBr(gEmk%iO!R{1!|yf6Fph#4rmv(N%Rz{d!T*P1EQkT7U&T5i0FK& z{6afLVWQLfOaF6$)OJt@YJ}*iQaeFisNFeNsWO5)GX1{rS^gPQS(F> zN*w?Vq7D&_OD%wgQAdcLA$1f~L>(i#Na{Ff0<}bRvD8V>6zVk5gw!%<26dL`nNsIK z71Vj6OQbG<7E!B2&yureO(Q~C9fLf@BM9-6Y1mZ6$C82-63==(HY8$8>wS#C%Y6R4Y+C}sNsokI` zY7fy1rS^hir~%Q7q-H^VsQpCKQuCkz)Ip*bOC16gP=|?LB6S2bidrOksnjvhIO+sZ zS!xM1i8@8}GO5#`GU^P`%cahO=1?m{uaG(qT0mVSnvq%sEuk(Gy;AB5sD`>q^eU-q zpmo$b(PdIMK%1yrM6*&Gpl#G0qE}1Z1vOFkh+ZRgA9R4)B6_XVL(mZ_e*yEH)G(-x z=+tYno#=H^J3tZCPNLUK?E-b9Mv2}awFlIT8Y8Mm4M17cKB6~D?FZ#i2Z-Jzbr3X! zS|EC})M3yF>L}5?)FNmMb)4ueQYSzq)JdYZN}U2tqn3%@CUpihi#kWNAhiOTM_nL# zyVONc6?KW|9a5J;E2uT1cS>Cat)Z?HElRC}Hc&T--X(Pl)Ii-PdbiXa&@O6|=si;R zK>Mf%L{+IR&>`v((R-!xm&l)@Fwv=3T^rH+q_%@PP$NW_OYH=8p>`83NsWSfPT9H}?&7jT_eN^fksDe6A^f9RmpheUw(Z{7OftFEMh-y-6pjFg0qEAR&2h~wG zh(0NG6SRfeAo`TlZO{(tF43ygCTI_JpXk$44?r!{L!!?}Jp%C`!Z^LZM4y$~25Lv` zAX<|e0d=Bw5q(Z-HzJZJ!Qkm!q2hd>3?VWKZd z9RZD^7Ky$rbqq9)Izd#IS^`a?P7!@Y>NKc~Iz#kTsk5Lt)C$qpq|SpDP#1|dq*g&o zsLMoOm%0L~p{^2rL+To69kovMO{p88P1G%-O{opgHtG)1x1{cZny7n3-Jn8_^52X%*hENMcKax5O8bKW;+Ll@bjiHVc{aES*sDwI6^b@I5plQ@H(NCq$ zfM!wWh<2n_K=Y^zL_d?d2&$qk5&c~1GH3<0M)V7*tDrU1b)sFVbKrAG=W+o`m@wY&=l%4(Sg)5Xa;qb=r2;|Ko!(^qQ6RA04<_ciT);a3ABv5Le!F4 z1FfR25&d22I;f7iLG%x)o1iV!2GKvIZi9AEcZm+AHbHx+`$YeedH`yn9uoaq>JfzL1ok#qH9Z?1OSZIwMBH6)I-n_D*s{F4yj>K8`G)Z|0TMi)DBPtwUg*ZQoBIis8OOD zOYH&mqQ;0KQUg#HwU6i~Qu{%9)B&QKN*x3Zp%#d4CUqDzf;vjnDYXb1Lmel&xzq_z z33Za_7E-4`)2L;lTS}b)&7#f`bxEy&=1~`jZY6aQR7G7Py0z40&(hKTk1Gy0<}bRcd3)0Db#7AnA9?826dJwE_Du6L7gW`NL>Ie zqE?BLQkOu>s4GN))Ea0Nb&V(`bsbbk-5^R!-2`o+Hi$A(w?R9oyF^*3P0$|dK2c8U z0jPy~NOTXWM$3Ww#6GVBbCD0`56w&>qPJ_y* zGei%NIt!XZtq?s>>O5!xb&+U5Y8AAEx=i#SsVkrw>MGHLrLKY2QR_qxk-7oeMBO49 zl-dAoqwWwrRO&9MiMmJhFsb{X1JoAL!=)aAj!^lQ5kpeLpf;k@`%84L)DBPtwUg)( zQoBIis8OOvO6>vlqQ-~{QUg#HwU6jgQu{%9)B&PLOC1Cap%#c9BXt-wf;vhxEVT$4 zLmel2tkelm33Za_aZ;y1)2L;l$4i|7&7#f`jYzG4=1~`jo*;D*R7G7PdZN^2&emdx@SVH3kY$vqVpq+6U@K%@bWH zbpSMoIz%)swE!AM9U*##)KO3ob&TjDspFst)DqFfQYS%EsMACfQp=zj)LEiuN}U5$ zQ0Iv*k-7j{M6D7%OX?D68FhuIB((-wMO`DhRO&jYj=DkgY^j@|Ez}0lbEIyAc2IYT zCZ#q(d#L+F&y{)rYM~wyJx}Tph;MsydVh(YFSQNSj@m&qB{c%-MC~Gafz)nL6t#!w zg;IM#G1P$QMN+e%KGc4qX{mY80O}yoi=_^M3aGLKU|m2a#xCp8ReBRajm zM6Z+D0g9k@61`q(7pNOGO7sS)J)mCH7*R!P0Lr5F5xr4rKPZnnK=dZ5gPJ(@iwM_IjsWYHi)H$LBsTI&X>H^W*r7nW1 zs7plekh%<7L9G$JQ|c;c4RxJpQEDBufx1cbE~#6f2I@A^yQS`cc2S!|?~%F(+DAPg zs!DBv4pEPY-Yb=F-F1q>M5p(c=zUV#K^>?OqRXXrg1S(s4GM@sWs3l>Kf4}q^^VNs2fC|l)4Gp zLTwOzO6oRf2X&WdRcaHohq_PnX{iUG7V06cT{ymD&bsN9`b5lNtea zqIMB|PHHzOirPc;d8xgi7-~TD1*ut3A8J3*y3{;q0CkY)i&BR`1=L}pFG(E%jiMHb zzASYNG>$q!RF_%;O`=W_eMRatsEj&8^i`>|pgGhE(buHTgBDO1i8iEGK})F1L|>P> z0;-{|5`9DJ8fYE0PV`Nw8=y_pEuu}S4bV2~4$-%y?t+@Adqm%sx(_-)Z4rG(>LKU| zHFR70{a>kJP#e+d{U!RY)DBPtwUg+3QoBIis8OQtOYH&mqQ;0CQUg#HwU6irQu{%9 z)B&O&N*x3Zp%#dKBy|`xf;vjHEwu<5LmemjvD67r33Za_CsLJ_~JL{p)I!5#-spFst z)DqF3rA~sTP^XCwq?SQ5sIx?Wkva#epw1KhRq6t05w%M6H>pdYWz-d-med+(6?Kj1 z?^4%6b<_=_e@NW~ZJ{=Z{wZ}Ew1c`!bSSk6+C$wZ`j^xLPz&{t=-*P0Kzs|;Q?I%( z(SM}2f!a|!h>oO2K%J;vME{lA4T_@n5dBYTFDQl@5M3!X3+hAdC!#OTrvIM@4WJGZ zT|?>+sDL_5bWN!vpi$H!(HT<5K;x(rL}95V&?M><(Y2&bgUYBgMAw!&3z|c%5M4*= zJZJ%Rk*G~-6|{u9OmtnTE1(+cD$$uz*Ffv2b)xG@-2iQ(ZV|OhZGg5>cZjYpbr;k` z-6Ohz)P2waYK!PBsfVB=RK7`Xhtx2rjY*#NcA^_f?EpnkJBe;2wF}gZ8YQ~1)E-bT zYK$l%H2`H%`-pBLwI7s69U!`?)Irb?YJuoxQink!sG~%kQj4H5)N!JlOPv6fP$!9Q zA$1BgjanwUrPLYFEb1Ilm(&Vq9(94}R#F#1Rn#S-TT5LAt)SM3ZXPDM0b$NH-A1wVWQLfOLRx6 z?Vt|S2+^ISc7nQ4yNP>qmt`G%MYoJxsHKLT%bx<93gD5R^6SRfeAj(MH2JN8k5@n?}L3^nCL^-Jkpcd*O z(LJOdf%rz_r}vlWo>JRD?Wi3@eNrQ!PSh@O<`( z>X(`a4WJGZog;M!R6rdjy06p`&?st==zdbiK;x(rM0u$t&?M><(fy@PgUYBgL=TWU z3z|c%5Is=pJZJ%Rk!V0_6|{u9O!OeBE1(+cD$#?bu7TE3>qHNcx&him-69&4+5l~% z?hrjx>Mp2>x<~Xdsr#S<)E3dhr5=KgQ2AE&LsG+_Hlow}OLVT(4p0QOljspryFlHj zQKCmm?E&?o#)t}115g&VkLXcS`$2is0is7s9Rv-b7Kk1rbr>{)I!ZJwwFnwR9VdFM z)Co`tb&}|DQl~)EsAZzZOPvADqRtVGNUeb8Q5T4wAaxN`MO`9#qSR&33Tln$Nm5rq zYpCl)qf+aj4b)Ad^Q3Np8mQYuPnNm^+C^;=Jw@ssXdm@}s3^4sIz&ApI$tXP#}ZCa znCSHW5?vs*9n^suA$qFRPEZ$WH_@2XD5wXum*{CyW1s*vOZ0T9eV~5SJkfl zhq_PnT&V}37V06<^Q0bu_&>*SdVh(YFSQNSj@m&qB{c%-MC~Gafz)nL6t#!wg;IM# zG1P$QMN+e%KGc4qX{mY80O}yoi=_^M3aGLKU|mH&e;b5g^gHlow}OY}Oa z9iRwmC(-Mrc7eK4qeO3z+5_rEjS*F(2B0izAJH47_Ji`M14M6M&>o zb(CmcY7sPsI!^Q!sS}_Q>Lk%yrA~pSQOiVclR5*MMV%vBkXixFqb?A=UFssJin>Jf z4ynta71SEhJEg9I)=<}p7Nyof8>pK^?~=L&YM^cty<6%IXcx6f^d6~upncQ>qN>yu z=n(aY=)F?;KPhyI!bGR{m*{;`+d&tp-vO6NG*eA zP-lrgDs>K2L7gZ1nA8Q(B5IZB<5HJE%cv_vHK{ewD(V{1C#0@}>Zlt;pOm@@+Cps* zeM;&!Xa{wdXjN(xw1>J+^l7OFpcd*O(PyL{f%rdKb$Wk^J}b2i)Q;Lgv?etI>O}1# z`kd5mP!zR?=<`y0K{3>T=nGP_pgz=oqV@lWy)%!qa(@5+ds@&PItkgG$dV;z_8D7~ zP$>*WA)2%(ZKFj+I8-WG29e!l&636vWt}7nX(CHV6IoI*RAm1>&(-xk-`{t+=3IaL z{`x(5d_A7e&+GoaI%m$g&voDT`#u`kdSco-rMGs)7Rc7pv~^E!?TNiETYIIgEWNcK zwotYXOxuw3)^h9(**Yq1W7Av5V~b>KGHnynTc==e%GT@CR*~L19eYc*-jTL@(pxLB z#j^FGw9QIyeG*$DTdUIcTzcy~>}}cla@wlXTi?Lmk*$l<_HKG>4fd{VU6Hm=(px{r zmde)Jw5?5V{SJFiwr)sUU3%+gY?*A`nzldFTT{Oltwy#sO4|;Y9)GdrvNe{rUDI3l zz}}aw`=l+N-r5@bK(-#5wj8%ym z=dyKr+U`hiy$4$*TPxG{P`%1Qcm$nV*t##O1*}6GxThm+r#J-lTsb9Re%^G2P z{KdYJtvjYImfpH6_N{E)BW?Snx5lyWWNYiR9h%;H1h!7LCeoId-dcoxFI$gITSa(_2fi4YIX++Ipt9_QE#G*0QwqOK%;B{UBS1q^&%?brklaY#p1n@#(Ee ztWLI0Oxu+7*6XpKWNSs*rl+^wf&DC7?@3!_dh0{jCfPbGZBM4RR$-fE>vL(Fm)`m^ zwnes9r|pgO*2UN_vi04x)ugwszc^wwHzt887Hw(rtgH(Tl`$M+wkhUGuTVvRtvUS(A?UCNP5B8UAji;@3dh4Os-?H_Hv?bD8 z^RRzpYf;*cO>Zs1LL<5Vo3>8rtzEG!*;<;m?&+;Pu?DiWSK7+bTl--RW$VDS4M}e; z#~R7jQE3~S-Z~y@EL)Rlo0#4@1=~)xUZ1v#^w#Ov_OkVkwB3{5T8Zr-TOUf>tn}6= zu_m&$Ds9iDx6Z>N+4^$Ys?%Guw&S(p#r*f*e_w-t_kn-+fq(abfA@iZ_kn-+fq(ab zfA@iZ_kn-+fq(abfA@iZ_ksUE_5l_F@&1qL0;QI!}|U|`Qyg^ zKmFr|_UZedf8PImIrODSJ$L@u%)ev#H}%rRvX0*6k_*mQzpk+DSuUTibzxh7rC6f1O^v`LBowVbQEe72<=E6A-u+CO3`HYF*OzoT4 z`=ya>yN+77*U)QHe|GBM$@3~Z9r)@AvpWu)x9722D<*IIjdWwB~b!%lEFxHIIh_zV0syQ#k*C*Z07P&)9}t|bqIWT`K% zg?%Bnf&<%93#p+M%!93A5#;|TSq%BQO!8>R*A|k;LORLgANcBx5l3I>lk?bxJ_~^VMVtjKfmc3YNhGU^(P9P9|Y%SOM8Rl9ljaSOrtBYc)*0 zt~D_Ay4J$f>skl7J(^6th}@=1#$f7ojziv~WCF6Nmn?w^SPHXY8O(v@Fc&5v?`5(A z=EF)@0IOgjtcJYD$r{LeoUDbs$H_W)3=EC<#xab+<6s=}o+lHKT{2k$OJFH%56j>Q zupD-PNq8cxfG5F9crvVl9bq->1Z!YtSPM^qb+8Le?KE9s44w+(@HCi!r^6Ch3QOS` zune9F%V9T|gxz5UJPTIBvtbqN0jpt8SOd?2weVb62hW44owXN?!Si7pUH}uYH!Oi= zuoU)zW$;2+4*S9+><24ge^?0zz$$nVtcC+&4IBh(;l;2H4u+`@$q*QWLtz{ag9$hs zmcVjY3Yk60GB^U3!;vrvN5Kj>8dkzfVHF$$tKnE!1INKycp0pNm&4SDb3BZ}D_|U6 z2@~)tSOSy$Un#sAmceUaIh+8Ka3ZXLlVByh7FNN@uo_N*HE=4dh1bD4I1Q$T!u2o) zZ-8-lBTT@XUI9ISwIVI_PXR>2owHJk@);CxsM zUxan=C72q%FT)so1;*j4FackKC9oQn!UeDlz7EUbLYRbazzVnsR>C)76?_X;!^N-$ zE`hc1ZCD52fvKVYE{wsYFb>~?3AhZFz#3Qzm%}pnJ}ieHz$9D&E8vH)5`F}$;K#5U zegbRYN>~d&g>~>Vm^#>e4r6c?jKeQr0frh(jKRNP9R3Xx@E=$LLl%z@vtSu)0Lx)Rn1qdB z1#Ao};dZbJZV#*B4zLC`fweG#b+9Q+9n^P(F}M?q!<}IQHiIQF21{XcSO#~2<*)@z z!d+nn+znR3-C-4M39I2AumuH zY*+?!U^&c%Ntg#KU_Pvb1+WSh!fIFqYhW>~g-63WcnnOPJRJ*T@HiNU$HN3{2TNcH zEQRf189V`&!wxVBPlOflBv=VghE=d5tcIOn4eShS;VG~Vc7dsrwyrP+Pla)K8ce{` zVF@gSrSJ?`2G4}$up3Om?yv%$1uNm%unP8o)vzb5f#<+lcrL7i=fTv;VlNnj=fgO> z0488>SOUvnDeMEw;DxXp_Jv8<4_3hbuo4b{Rq!HM4F|#+I0)9li(wrc3{xkmLtqRJ zg>g6xCg5;b0?T13yablP5wIMNgh@CGR>0A)5?%_c;22m9$HE#o4%WiUU>&?1rcRE> z!x+2*#^IGP0k483FbPZH)vyd+1IytAn1mBy1)Kyc;kB>|PKMQR3ao)sVJ*B4*1>5o zby9vkjKLdV9Nq{M@FrLSD_|+S8J59YU^%=MCgF5g0dIqq@OD@QXTWNB2dsg2!diG2 ztb=#M)WyI(Fb401ad;n0!24kdtc0a-CM<&wz;gH?Ou~m?1$-D*!be~gd=ys0S+E8^ z25aHtuns-}Qx_pm!Wf(lxID8K#;4)YOYhWo{4$I*CupE8>lW+yBfFHt2 z_z|pvAH!<+39NxDVJ-X=*1^wU>SFJ67=x=|9DV^4a5XG}wXhVffo1SZSPs8}Nw^kP zz^`E?{03IRZ(%k34%WbRuoiv~>)?8ry2#uBV{jvk!yjM*{s>E89V~@E!7}(WEQgz5 z5^jbSa0{%2zrZT^E3AfFVGaBZ*23Rm9sC1^xcrU($r${L{~d>a!vy>XmcY<}$A?+4 z3^st}upvysMz8`lhLvzTSOvF-)o=$`1Dn8F7{NN&6oytD|6vU71mkdLn1Ib-35>x~ z*c_I@U0^wE0h4f7SOIr~m2h`h1zW;uxCg9(d%{|{7p#MO!_>w6J}?INg>kqaOu+qN z35>&1*b0`x17JBk5GG-3SOE`$mGEF#1rLGM@K9I-+rV0Q7_5Vb!_*?e5ikaigmKsw zCg4%91SVi9%!Xw!2bRNJn1p$-0_MX?SOBYFA*_Z)um%>xT6i?9gU7(oTK>lAWDFk1 z|Bl1sVFI>;C9njR!uGHXo&d{X2bhE>!U}j2tb`}SD%cTL!%naUc80a^6j%qlz|^8i zR~Un*!Z1$)41*b~;kb6_nz7uLb^ zU}~|Z7mUI4VH{on6Rd@@{}JxDm$T4=@3Lge9;J zmcpN48T=WR!%Z*=H^U0J1y;geU={ooR>Q5Z2L1+X;qR~x{sB{q%YVWc{0qk6-!K9H zfh90B~7^U?HrAMX&}I!&-PWtb@nE z)XjrqVGJGzx)?4Xb+e=wjKT9^99{quus1A$Wv~?Xfo1SQSPuKbB0gU3=V~HI1DD>a99G%VJW->mcbFQ9FBxZI0{z4(XbL;3aj84 zSPjR*8aNKt!pmSCyd0)(4vmK~cm<5ZD`5g&1xsKOmcpxH8N3FT!wE16C&CIi30A^u zVHKPVtKk$_1E<1Tcpa>R(_reR)b%h1Z-8-lBTT@XU+8GHbi!v|p! zJ_IY^!>|%Q0;}Mouo}*SHSjT53m=Dd@Clf@3HKz7!PzhlpMnWE2bRDpSPGwpW$+nT z4xfcd_#CW&b73WX9#+8@U^ScvYv6oX3txnF@FkeK`S&u6!B=1$z6ulYHCO_xVJTby z%i!y<94>@O_y(+ii(n;u6IQ{uU^QF}Yv2-C3*Uxy@Ew@C>G&>;!KE+`--8Lb43@we zSPGZJGWb3$habQsTmdWKhp-ZU1gqf3uo`{>Yv4*)3qOT*@H3dY+4(t)!BsF0zkmt2 z8kWFXSPIv`GWaDdhhM=YTnj7U*RT?P1FPV-uo`{`Yv4Lq3%`eTa6L@jWZeK`a3hSv zA7BFh2uolcEQLS8GWatrhnrv$ZiW?b3#^2{z$*AFtcF`*4g3w(!r$Rf9M&J-#4#ph zHAjuFkDS?mNdG<~`~Sz+NQPf{aVQMOHg8CwCe@OEb`JZ7o}(GxgZhpbK63bgQSn31 zY!g4V5C1FPe&ophLoXcCe*~YFa9s1ycTB(k`B0(%*#6e{N&fQ>J$ul|(S3%*yNw#% zZ_w~wIf?AzUMCG3)qh0!h(SEVvpe+aK79C)k-bjshGyrr%_(l1n@Hpq_PTJ;uwI>p zj~vyrs6f6FGjs^wU`ajV$Ps@7X6_zhbqg|g z+gRQF%-zGSZeHf@kybZ1bN48#o3pK(|KBDaS9;85E}v5W{%5!IuuF#z?tk*|5o7v{ z=*Iyn(*V!?&+7je|G634`F1-ybGy)PC$_cg`#=<%?ShOSh-0j7apvxER<|f~x1H53 z%-n5nbqg|gJ6PTP%-xf$ZeHeYN2{Bgx!c+5=4|WMH|D!o-Rwkm=7Yqkb~};z@N~M_ zF3h-Jo?&&1Gk3dL-J;Chv#f4m=57zGTadYXj@8Z2+&$0g=4I}lZ*_AscY9mioNe90 z|2C-q@00C5RyR90Av;HX<-TS)Cv&;KSJic!DhKAb9ty)F3emW zZk7u&moG8P`I*Zj&2nDm@@T7^~>;XyS{h&Caaz6_+Z>@mK`6ATg|fLgK?W#c8uN`X4$cK-)WW|d-vUD*|B%uYnB~* z_x)zsv3Jij%er^hcR})?Rn9KTc;ff4)h*84ebnj}W$r#^bqh0hpRl?GnY**CZhq$O z9IKm`x%;%$&CT3>*6QYL>()1Y=33o6$Mku@EIX#pe6#GBJ};SN$Mku{EIX#pYi8Lo zeHNHy$MjifmL1b)ky&<3pSR4iPM`Yruq9SG-?4|iW0oCz*iy6X*u$2YWyc=2+$v}1 zZo7R@-wXDES=Rd=^_4#~%X-_RzVgRrS?_w(S6*qA^Bte6&&;ypQ?<%0J3dvb&9dWD zwZ<$vK2=|tWyh!LYpa}HoOuuX)+`rgF0V7og_+Ci&2mBJ@_SdsA zIA+);v+S5*Tg5zE^t>J&($o{X@0>}7kY?dA4Z+o-s7=KO7vSa);HOr3ix06|RjK5}9Ima>nnww?E z_-kR79pi5|v+NjuEzPoH{OxI$b^O)0z_GVgW_cv@J&%3ub|Uja*#1_#&@p;jnPtc5 zJJ4Wx}X4x@%k2K4U)5oK%a-m~>W}9Wl{LD4Wj`^8y zmL2o6&@4OVXR%p!%+F)2a;{^3^2M_M_~*YK>T(_Pvz=LX%+K~_*)cymm}STOJjpEU z{H$*QuA^1XF3z|B*V*b8XYO{fx<#40r&`^@%-z$iZb9bm8CEwxbGMt-&CA?9%j)K4 z?)I>{IorDRT{fR%b&DLwxAV-h zGRuzR+aRl4d(&9mluPRyogcd>dny9mltE zX4!FkyWA{0j&E0(WykUDDzmJ|xB6z-)mFLKF~cU9WycJgWR@K>Y_eH)%&@6eIo~nE zrkQ2O47EbixjoY?JLdL-X4x^fAGXT*j=BA)S$53r$IP;0Za-m` z9dmoOS$53rIcC{0x1YAk*~OVZ&(E6WqRi#FX1OqP`319FkhwhHEazt~zhsv4GM8Vm z$_0)i#%pHTal}|)mK{fog=X1t#8_mNa~wyEx6HERh_S>hJB}Fdm}Na;)OQnMsa4MW zZH#4BwZJj{mYZeA`1`;tJI3FKX4x_RJ~qpa@wd_}JI3EmUaBqcN5`TtISP=ZMWCzYp=80iOe_W)?4jD$LQT?mK~$_N3-l0 zy+4^{$LQT;m2(}VcZ*qejNV_(vSalAW|kc%>wj3~LdX34%Pc$Q=RaoIF+a0*`H%JV z|Ms6c7dqx=L$mCdpN-A3V}5RLm2(~Qvx!-D%+ID~*)czNGRuzn*~~0E=4W%W>^OaF zVU>#~&icFeFsv+S5* z#b((t!;Z1a#f}+voLP3vuy$tIF~i!MWycKbV3qS7GwdX@?3iI4&9Y;LbvDb68P>%r zXXkGF@8|1VaXr;6=VUIQZkF}G`>*ej&oImSpZ(WY?q-#X9dr9Ev+S7LJ*Zw*bgss)bmH_a?N#@`KQ*)jfZ zGRuzfce7b`jK5pWvSa++W|eas<8Ovpc8tF}&9Y==Ldn`Iq;^)2rB=DfF~gRbWycI#Zk8Q0>;tpxm|-7U z``9cyX4p!z?3iJnnPtZeTV<7t95ZaSS$52@HD=i{!@e@hjv4l~S$52@Z_Tn}hOM*8 zd5#&j-Yh$2*haJLm|;JfWycKr$t*i&*e0{=m|QiB7cSRVZeo`8FXF7P z+|(@V-@{p7c_*t}?3mll%(7!{H#f_Ux!uAnJLdLoX4x^fTbgCZ+}_hF=R4;1-e%b` zxA!&6j=8)%yhU->ArtbbX3edTPcT;Moj^Qa?3iIEnPtZe>u8o8Gpw^&cFeFYX4x^rPPNK8 zjv02kS$52@Gt9DMhIKQ`jv02AS$52@9%fl*SbgiY=U8P{d$-*Osjq#W-A-h_i*mlz zE_BS#-e%b`Kl_+v$NcPTmL2o6zg5n4%+HI=vSWS@GRuznIoK>a=I2nWTI6vSWr#HOr0}Hq9(MX4nl@InOb}ZZgY`8FsT-cFeF_&9Y;L-DZ`G z95ZZ&S$52@JI%6VhTUzJ9W(4+v+S5*_nT$M44Y|{^BgnmL9^_bVGo;S#|(SaEIVe{ zV`kYg!=5n9ju|%FDi=Fu*c`L$m|;(wWycJA)+{?_*j%fe@0ejPm}SQdn{SpKGwda^ z?3iJ%SmkW}J!JJQcD!bm^%s%VS6*P2_4hl}S6*nA9lzdTkyS2s%6xta6Uyh_T5mJB}Dz%(CN%@vB*O95H^g$_0)Y_J>(^ z%&@=AvSWt*W0oB=ENfTe4s?NIhBY+Hjv3b2D(5(6*!E`GF~gdeWycI_YL*={Y$vnq zm|@M#vSWrdx5|Z%8P>uqJ7(B!X4x^rTAF3Y4BOKx=Q?KC-e%b`!}c}Hjv2PUS$52@ zR#v&tF~bft%Z?d#kXd%jutUtUV}`Xc%Z?d#xLJ10up_N~IS zcFeGRv+S5*g=X0?!-}nPkz^QURm|^YAvSWs|x5{~r8P>rpJ7(BPX4x^r zI+|t24C`!_iySkoi&=Keuv5*lV}_k>mK`(f472Q*VcpEKV}_k&mGc}ktcO{4%&>FJ zvSWswXO##X^Bps6uvvD@ zu%TwzF~f$NWycJ=#42a&FS@U9!C|CX*57nrUwO1y)?XP@UwMpKcKpVeaaOt5F}E)_ z%Z|Byg;{pY?W@ePV{TtdbNOzwoR_(LuT?H^95L=U z%Z?+)Otb7bVmxS;9Y>6Zt#Xdzi1Dadb{sJtGs})6#uH}Qam1Kyl?xm*Y>ruW%&@1; zvSWrlYnB}|Y_3^$%&-^CvSWtLx5_z=8TOJ{cFeF>%(7#Ky=ImjGi-rbcFeGaX4x^r z7Fp#&#|(SREIVe{60_`>Vegn_#|&F)m2(|4Y?)bh%&_HV*)hXDFw2e^_MufSbj+}i z&9Y;Ltu)Jy8TOf3cFeF!w>U$1ebRW5eS?W4@HV{T`g zWyjpkHOr25lR=L12!}^+K#|-OlmK`(fBD3t6 zVS~)FV}=bj%Z?c~)GFsVX4r7E?3iJfm}SQd8)=puGi%&Rjv02fRnB$HunA__F~cUAWycJgY?d7}Y^qf*bj+}6X4x^rZZOM^ z8FrIdcFeGw&9Y;L-D;K{Gwe32oa>ljGt9DMhTUnF9W(51v+S5*_nKwL47=YfJ7(BS zt6b!mVGo*R#|(SeEIVe{qh{GL!ydEBd5#(OgjsgXu-RtWF~jDVWycJA+A0@0X4tc4 z*)hZBnq|ifd%-L_X4rhQ?3iIMnPtZed&Mf}IcC^vX4x^r7MNwn3|nZH9W!i^S$52@ zx6HC*hApwm#f};Fj#+lhu%%|%F~gRbWycI#Zk6*LGwcJi?3iI6nq|if``9cyX4p!r zoSmEb7e0JumUA+fSD9t~MHTg}xUM$Kj^9(U#wr&(=Jr=+*)g}jHp`B={jFJc%oC9dmn&S$53rU(K>(ZvSSLvx_r-B>ynW zMVZTgndQRF<$ug_LFRJS?#BJ+?EK8-hGsc0bGflqE^r(%wl~X;BSsUm>^NdHHOr18 z#!gl_$8p4HW|kdCjOJ$9al~k0mK{fo-K=tfV}`Xf%Z?egr&)H)u)WQ)V}|W(mK`%} zf3xhEVXdrkj$?)$XqFu_>>#u3m|=&QWycI_W0oB=>~OQ}m|;g+~ga zcFeF`v+S5*`BpjCF~bVYvSWr7n`OrgJH{+KX4r97xzI7g+L>j?3~O(e9W$(hS$52@ zlgzSXhIKT{jv3b3D(5<8SQoSGm|>@yWycIV-7Gt1*coQoF~howH z|0Bh-ta5fDGzi;;`no-=ZgJ-BIaaqQbN4)}TbQ|fzSS+r-0f|3^D}q*SlztL-M&^g zH*>eY)y>(~t#7H|BCA{EIKB-s%Z}sQV6*Hvz6~|Yj^o>KtDNUJzFlIL9mltkX4!Fk z8*P>y$G0(7xyW&R8)uds$G6MPvg7!6g;{nS->x#tj^o?aX4!Fkn_!jm9LKjwX4!Fk zn{1XH$G53w*>QZEW|ketw;Rl|;~f1at6c1uVK5G`VO%Vn`OuE5qZ=q7dz(m zV`kYgx1TV}j=4SCEIa1*9JB10+fSQi$J~C_D(5@q_FS{^Ne4V3l(mM~n~6vg3&Hu~~K;F;<#o#}VT*t6boiVXMrtV}`9Z z%Z?eg#wK4*)hY`n`Org+h~>@GwesR?3iIcnPtZe z+hmms9W!i;S$52@U(K>(hW%!i9W(3?tDNhYVSkxr#|-<&EIVdcR?GBqlj4XtvaV}><0%Z?egy;*k5uqI~NF~gdgWycKL$t*i&STn1f>zHB9 z&9Y;LwJ^($8Md2QcFeGrX4x^r_B6{n!|Gd6-`gr@XJ=fE-`DCEXYTHAb&E20TUp)0 z%-sX6Zb9bmK~^_EbN3Ldo0qxU#_Hx~?jCM+bGCKsTPirx>J~YUZ%3JB$MG%OEIW>G zxn|jMe9O1Wd5+^-p;>ku--^w$^Q!i zWR@Mrw~l7naeV7+mGd0Ow=QPcaeO<~EIW>Gr<-NR@$C$=>^Q!4Gs}*1^s}sTv15ky zFw2e^c8*zg%&_y!vSWswZS#<$T8s8)=puGin`Ou6d4gGXe4ZznWyc;i*(^Kuu&HL*v4>4F%Z@$l2D9wg!)`Lm zjy>#Vt6b>V!)`Upjy>!)v+UTzW|(Ei9(Jc$cI;tyn`OrycCT4>>|yttWyc;i(=0po zum{buW1Zn)tDK#aah>5&t6QA8`K111&bGP*nY(kWZhq$O(^fYxbN5-R zo13{i*XrhM>(;l<@PgGXa!jB3X4x@)UNXy$>GO(Nc1)kw%(7$pEHKNC>9f!*JEqSf zv+S5YZ<%Gs^jTt-9mltKta7nq4_j)M9eda^v+UTzmYZeA9`=D*cI;svnq|ix_OV%Z z>|ra-vSSbX%q%AzSq}XZ*}z-zSq~?Xm$1Xz1P?M(dz22d#|tilhxJV_Fi9i zlhw`5{2pzwx;fjrA-s_lLeob48y2fYVdQ}!>>$|~wJ1D|{oOG2|2J1H3O{0-CEKJH zh22_*5aWJp)3B#n6i&kSl&rH_6t2bwNj6C>3a?PJ(3i$_x&_%Lh zwJ2PIwU=zPS`=nug_1q37KL@#k&b|^5^ZZ7KI+z#gd(;7KK}}GRbDBMPV6swqzfuMWN}TA#|0j znOYP&Vkbz}MJ);wup-GOt3}~8tgU1V)uQkR#*4|%_K#W=3fqLxOtNFtqA&uB$$%d#!;UTP#WV6(wP>c1DY^_=p z_BlL+QzeV5MWH9wL9$+IQJ9VuOLm7^6l$=eBwL{tg&mIwfgOO?Af^_DPFR-wY+co& za4q(${A|~$Md1x>AL%Yui)5!7B3UDLuargMSnNW{O4On-7V9b5c(o`zhn*(bJhdp) zVJAwqS&i3}H}Yu75^B7rSVFQPYP_ZxJ0m~aEHz$J>;}o!szqU6UX%%vwNi`1x!5?# zE>MfY3~ab$cdJEV1-3-8Pt>B&oG0>{WV@+F;WTWnWM`^HVH);?WH+frVKFvSvUk;@ z&^SAU8ImPJ(3S5$f=8_$)#w@{( zOijZuS}h7sVFya~j9L`dV|z;WqgoUW&E<0>*%4|{=#Mp)Y>-+M9>D&P$9+UC3ahaO zvj2Uh#(R_(!dBV;TB$|hJnSs_^LndA;SQ{eWcR2=;X|ywWGmI8uuDEOQL^3DqHsEP zvt-@WqHsMnS+WYXC@jIQkZh@16t*h}VWeb{S`<29gCy&y7KJ3%Te692%zJEKc?}k* z@g8AAx4lPd%zK7-U&;8Uxft&ec8+AD)tL9#>5@II#=OT)l5C?I^PVAjjAU)pnD-bv z1@C!(wJ6++F@(uxszqTXHeY^@RccY#oq;n)vc1%z&<%T7vL0$tsKD-)Y`R($mSS5Z zTdo#`h!6RC$#zy_-eYSd>!KEgiP*=IO;L-&0&J;di`1gr@dFzpS&3Q{#$iJxyFx7r&trWhdr>V4o3Nil>izvyEeeVD zA$%uUo>~-!VqZvhiCPpM$5u%8lv)(N#deWwy;>9wI3a{r;H9kk!G|76X@j1fUW~F|%>1uqAu-1|-SL1WU0dz0P zc2?tagvBK5qQ>V4+fK46YJ85cKjr6Lq{in6YuG6DxD6O7DdRoDeruS@O4Ooo8TPe2 z=PT8s@B;RkWG|^jVKcT|vaM=S$UZrQwX1OYEk$OJ3+Dy zYRtNhoD)jcMlA{#Vy)yk4^ZRW7HcWlgKAOu9NS5TAvVGN}a5navJm+)O zIJd=qlx&6?=V90_@?2J^MPaATAxx31xmpxX!LF3-G_@#9#zsjtO^x#~>|)6lt3@H} z6waw7YpfQ9aUO=Xlk9Fa&cm>L z$v#ozJnYmE4wq~>|njQsX>~1NZro9j(T7DArA~F=||YV86(7c}^_~ z8?g0cxCw zVGl~yTaEKD>`uwz)~drXbb z5q7d<->5}l|FikLNp_%G6nbGfl9j1N;ZE#O$?jE)!bjLU@)~@q7KIi)c+QfwREt6> z_JU;H)uM0%He0fr)uQk=_Ml|%sYPM?p6nZvHC2nkiP$yrTso<-HiC_nY?4|OUd4t< z_PQF^@mN2}{!xoU(K#V(lE*k!EefNtb&`!!i^4P5YRR5gV?77^P_j*GTyrw~T1b{q z<8y?)Dvvu@jn5JGoMf}q_#9!6OZK%IpQH0asFdsgH9kk!?UMCY<8y>vFWEh6e2%cA za`jn7dpuHz-!U5(EXwzp*6)c71>%_XZ)<8y>VZY11J4ubT7VH~&&I{F|@F(`UWZ{Bs7KLK$eaVhfi^8SYV#zL3i^8*54|#qs zsIe}9ohsR8wJ03fn{^P$veh^qVa1XSQ;Wi**a7mKpHPd!T5J!=zEg`rtFjPwmh2$4 zC|rOwlI%jYDBO+xF3TsTPH=u@RE3Q{&vbe+UC5J6Mf#Z|nle`l@m6jdho-QjK$O>{od%tJFC69uUGt z$@Ws?+#CB!vL0%jdt)mlo36&WH?~Z&Y#AdvOTg%X2SK8rQJcJjr^haSe-|CqLV5YFxu&XGr$G8rQHxLg*-2 zGc~SZvEwA`s>U@emMhs*HLhW?Hj=%m#x*SVuDk{fhi)^jkFeJzD^cSb7Mmy86>6M& zV^2x;q8it**h7;2s>U_!F!l|}^3=G7#U{vexkQa?SZthRPpNSYiw&1-y;>An4-cWg zWQVG;7KCk<$LOyXh5NAYC3`?E3ZG%MlC4&Y!XD+kmy+$H7KO90T_rn5jn5JGnmq1w zH9kk!T*;QJ@j2qe>f8&t(I4*Oc)& z!VZ?Kof@AbY#+(StMNI)c9Cqp8lNL<2g!a><8w5Udqwi|=Bn{I!WuV9eYVQgc#p6@ zWZ!*CjcZu!TY1hK)VPKn#agapZPd7i#XgX1fEw4Z*b>PeRO1>J>nYE#R*h@e(X6*i zwyzr3u-J)`ovX$*EOxYHGt{_-#SWC`yh4p@*h^UlmaMrN*RWVK$xc(_8Ww9T*)%n- zVX;5tIWJb@8g>k8+>$j`;~Ey5F3;rzwJ2PUT_@R9YEhVnB_(@VEecz(OC|eFEebhf zxl18gfm#%XV;4#`QY{KkVqN4pSE;e4inW()qgoUW9>=<}WQVCmp)Yo%WEZJLp%Qyp z9^)Z3?xA7NNVY~T3VU4^!Ys-5Q{x^QcAsSDsd2vtn=FrUhguYtV^>J_p;{DnzMOSx z$#zkTLKke1WT&e|VG7n;vg_5Nun0R#vL$L!Xuttrt2~$O)S}Q1`$4h}YEc-Et(7dP z7KQoPr;@#*7KLB18p(cFi$d-dA-pMBp;{Emu{rWwMyavxjXf;c(`r%p9=ltzAJn37 z$d#<~OLn+g6#8Lt+1CcDMPVkkyJQcmMd1r*YC@szqTcwnnlW)S~bv_OWDdt3{#V z)vSd}w!K;uO0b2Jov0RtE3o;JU9A>{7qMRQv%RVogT9@=W>@?6h6Q%lk8))D8weQRxjDEYEd{98z9*k zYEifj+aix~qgoW+!q!Xnj#?BNadNdrvK`c-&>s6(vXj)Ja3xkPk8zD!6kfufm+UpQ zC~U=^l> zQ5b;jE7`?rQFst*A=#s9+=s=QNVZmudwf&5pCUhRD>c^tuX^* z)L6H`zLV$tsT%7R*RiHASxYt6EwB}mbys8E0()Dso7Gsiz|N89_nsQ-7Sp)zB3V;4 z)-AA;BGl2D7nAZ(gsL)BQL#jcj@akVIXg^iKyTeT>}Z{)s< zWUbYra6Z;ovOa22xC`ql&-p&JD13~aAlYYXQP}k+*5xJJLoEttU~MHkODzgFVz0QMd-1B9C#c8tWF=m69z~W8DH9C0S~m zr;K$A>|)7|Q)Ar%E0gRpHP$V#vn6{$jdcs`H+e3b)mXQ|>%Y|yJTVRh!cE1|y7T7(KeXhp3#dPjh zNVcaM>lRom+1JiiW8DI4DcP-RtXp6^NmirAy2WkWJCSTBHP$UKegHnxr>L=RfiWD& zCabY-fpOp^dqa(N3v85RS+{R9)-A9N@|=%XW8DJ#QnJg{Shv7Fk!+qC>lWC1l5J6A z-C_o7;gaR3v2KCADA{l|)-AB}IXmm2F9*c+1dP~&SIY_=Nf7T9dbzE@-2;$GIS zB|AiobqnlH$@;0WZh_q-*-SOoEwCK<41S@;y2X90w@bFS8tWF=evW8GpV>(ug@$x~z90^3`%OVqd~#+pm^ zlp5<6*!GgGS7Y7c0oJMIIUlOVx&^jLvi@qUTVS_mrRK&1YOGse*GslqjdhC$xep=P zK5DF6U}GgaM=c7sV8bN4U5)Q7V*MohK#lL$J;XY7!_?!()S}QC>mb>wYJ9&AE0*j! zwJ0paj*{#xwMb54UzNvb^e}fHuqYgdJttXvHSX(Tk4tu?8u#9@O37YQP>pp9>>J5y)mXQf#T^96_Elru0()PwbJbY4z!pn3LydI{>}h!}E7VxGc#L&w z$(pONZh_q^*=cI5TVS_JHcgFn3+#XfsrPrW8tWF1b1y-%#%iovU^`28f*R`lWBD$u3f3-2z)A*+XiqTVO9qwnmM0i`lHf%g?r-8tWEVcgfCEW8DHf zMY228Shv7RB>PZ}b&IFCBO%!?YOGseM@V+M8tWF=GIMHP$WW@SG*v zPK|X7>}kn5sIhK=vE%W6B-L2Az!>Ueuc)zZfn6)l<##pKEjXx-m#k2Ybqj2SWTVtr zx4;HU_Ou%77TB-y7(b}7Zo!k=DB0m^tXp7TNj6Z8bqj2zWDl#cZh^fnkMX4%>lV+j z{w&%4YOGsePf6BGjdcs`A<6DkW8DI~OR|sDShskV`v#J=P-EQ!%azYysT%7RSR2W1 zP-EQ!+h4M`)mXQ9j(ZrAZLb!E60E6YC#tb-fn`Z{wHoUd*!S{WUR7h=0;`qm4>i^; z=CV#LS&?Y>Ww|J2iddZ5_Shv7llgGGJjdcrbu4K=uv2KAqAz7Uo>lS?Q zXG(UY8tWF=b@CV&tFdl@B_(@Qjdcs`Qpwh;v2O7)YsiwdQe)i$yHK(V)cD>K)>E>( z)%e~L_J=%|Pt^F{(krZcOSYRD-&?}ImF!G4zPE&}lI$imzPE&ZAlbWWd~fMh?gvQL zM2+t)Vb92OIa!VGEn%}Ho1n(`mazLIt5)NCOW1VD{!-(6ORsT1K=!qx)%e~Lwx?uc z)cD>K)=aYJ)cD>K)>yKi)cD>~HIE@PtgRZ~x4^EGY_J;Nx4@E;%~Iq07TBedeXYj# zEf%mQEzkJ?HNJ0wt(B~|8f#0~r;^>H#`i6-8p&3w@qLTeS(BD*cQw9mfxRqQH#NR* zf%R^XI#yJu@qG*IEXkIt@qLSh++UC^Qses;SbNDjs`0%gtWdIvYJ6`AJ5sU*YJ6`A ztC82>Z#BNR^ajsavSZZv-V(-+$MYMj#`l&mhC10?HNLlmal%CQvl`!9;-Gq;WJjs- zy(Mh2JeMJAd~XT6LbAuy_}&sWQnGK<_}&svZjfXLs`0%gY^yv*nHt|)!hVqKUNzSL zu(gtXs>b@?TfCQ&wNzvM4_hdY(Or%8KWx5aH>!il|A9k~3lhj!M!}79Huixuxtp8z$N%oH#>winQ4i|?)mZ<-K9=lpHP-*IrILNC#`@no+z*h)XsyQj zA9ki>ebiY0!#YWJpBn3b*zuBmrpEf;yR0EMOua69sImTs?JL!?sA)S&j8S><)P@*Q&AphutXILN(U^u!)kTmRC~7`X6?g zWXGwo{)d%Ic9|OMf7k%YUQlEG4?A6+^JX>H|CX_aELpZ1>wnlWk_}U1{SV8Q>wnlZd5q81SpQqj+OTAMso(iW=*G*w2zpR%87S`%bbq z)L8$+zK|^IgKft8AGSiW>Qj2(~pQm)4OAI4B8o2|zBAI1q2+4pL!|8ekmRwnn&lFd|O{STWW&*cj>*8e_Z?OL+E)mZ<-MoHFFjrBk5V##h(WBm{NO&;TY zHP-(==e?AynHuYV*w>PERb%}Rqr}fPRgLvO>SpUNgm+TTX*8i|pl0Buy`XAO( zvh`}L|E=c!f@FuPvHpiOl&rrR>wnk=c`gsAvHpjBDcNc@*8gf*LzZkGHP-*I_ar+< zjrBk5e0hx9)mZ<-x=Hqd8tZ>+Sm&24rpEdo)=sih)mZ<-4wcW$b!x2tVf#t;mRcl> z-n&ZH=u1|KG1mXENV4{7tp8y_vMbeC|HFQ1klGJkQe*uOyE7}5ZB=9a?<>}`CCgW1 z{STWY*$6e(|FFv?o1@11A9jgk8`N0;XJ~HELYLVkb-Xni|)z*s+rRsm3+zx7-hqtXPd}SZsm3E|;ot4U4@X*|Ta~ z!(y`~t5f3|_B-xPNOq(e*Ra_2@)#GZaSe-IBiW;BT*G2xC0nb;HS9Xpvn6Y##x*R~ zPqGWtxQ4~fmF#Xcu3@piJTP@j5YFxu&A4>MF z8rQJvxg#N26E)r=>^XTZC#!J{i#;yc1U0TsYFxu&k4yHm8rQHtvu{Xtlp5Et*i?Bg zL)5s2#jcXU@ecCTce)VPMl zZk2438rQH`fqVvESK}HMJ3_L5)VPNIg?l2B9jnGQEVhSa;Y^WO7u-Hn;9#`WU7F#CSw`yF&Zsp#DJVt9Zu3@q6lJ!yJ z8WuZ6visDyhQ&%G`%H~%SWe8^$Y*8`HLhW?{Utj~jpGrvn`F1BaSe+#m28@qd3VX=Xdy`aW5EVjGslbh9ekN)IZSF(f}pChc7WJA=Lb=aAb%~Iodgmsc^ts3jz zf3a2|SzL{K6Ih;Pz0|mWgdHZ?9ctX;!{U;yP~$x8Z_XLyHI1op9)@+4>{K<*!?5Ed zyH1VsFf3QHx6~r}qT1{7x-|NSJ1ZFHVc0y$+N*IMhCL-aVGl|6k{ah>*bVX+ zTh%xZ3t3@;Wcg~GhhgI+8==N|7&ct8Icl7TVf`iBpvHMvR#rGqvNmd*hhcxqa~Yt< zeOPR>WDlxw9~S#wvRXCn!#2nYwUX_t#(h}qBgxKH<323*u4FURc#p8T@?2J^aUYhG z_9rB3uEu>>Y^G$Vsc|0`n<3dWHSWV=2g~PUu^RVb86^8i)>w`Eu-Gn=ouI~jSZoK$ zu2SPZEcTN;#>;BlhsC~?>^C*;!#2(et0XH><323*fn+1qxDSghk*rFM`>@z+l5JGu zKJ0c`;X-*XhpBNN7V9b5MQYrK#ZHs#AvNy9Vkb(rMveQh+h>KNCEHJp`>rSAF6R5c89ERsbssTaUT{NBH8I`+=s>9l;*2 z!ZVU>r^bC)Y?fpl)VL3e-6vU6jr*|Jbje;(<323*gJi#}aUV9y3Tq`RRO3D@_Nio} z)VL3e)kyZV8uwwb!{j~sL5=&cO|wE=vcuK54~y+C*+4b!!(uy1_OKfFVX+31eW}KM zSQc`(%H!^@#;n6yZku&#yhqqY+h&~_pCj!2ZL>~|S;qx&H_2jZtP5bBCF`oj+6~rD zvMFk;uVML;y`jeO13O%@)Zsd19OJQ8k{zqYc^G!4{A^>@I1j@*Nj6uF^Dyjq$$nPj zJgiw($dl|SHI5(Hjgk#f<2($TDA{9boQGkTN%oBz=V7s|P%hblYMh5*10*X`<2(%O zCE2}doQGl0OZKT6=V8sW!jqDZd$ znyPUghJ7JfCpFH)uoaR`QsX=fdt0*C)i@8sswMkJjrXWUR@lB#>U{E8HIDJvU-JKV znHp=L*e1#5sj?IG{)FKVoT?wS<_N|vL>IyH8IWW&@r55u}k_P84F5q64X->7jt z!_EB?$qrECniDIK>;g6JZDU7Bc9$C8Kfn%<>?1YqMf1P63t78>uyfcU#*eh^pVM!ubq?_lJSk?&~aI~#e-$agXFU5$KqBj3Zw_cHQ*jC?;Mj~n>`M&8=U4>s~c zjr=epKf=h{8hOIVbBsLC$P0|T$jFa2@?(wscq1<{@)L~wL?b`h$U7PNDMsGa$WJr! zQX@ap$h#Z)*+$;e$j>$MUPgX_k(U|yg+|`b$OjntKqJ4{$cGsDFe5KF@)1Tp%E&J@ z^07vKnURk-@+*xzY2?=!`9veX*2t$A`E^Eqy^-H&d_?{4I08+lJ7Ki9~6 z8Tkc9US{MM8hJk>A7JDIjr?LGA7bRgjJ({)M;Q4iBfr$h#~S%%Mn2xiuQc+ckzZrv z6OH^@BcEdA*BSZsMt-A_R~Y#%Mn2uhZ#VKgjQlPmzsJb$GxAC!f56BeGV(`^e3p?v zZsboI`BO$-W#rEo`Ey48yphi{@)wQ#Wg~yp$g7R~bt8Yn$lo;b#YX7jeM<-oQtH!||=jC=0o9Mt-o7A8O=>8Tk=L-qy$yMxJBjc}8AfccW$wuDE$WJlyu10>Ek(V0znMU5-$j>(No<@GIk@qt43yi$X$S*YVenvjP$Ojtv z#YR5F$cGtuxsi`B@=->9sgaL0^2>~TypdmNgic`L#wq#mKKS^6QQKMkB8< z@>`62x{=>*6+Jl}7%6kw0YQj~MwZBY)h;pEUBPjJ(RopE2_1jQn{c zpJ(JR8u`mc{;H8z8~N)-{)UmiY2=HI{B0wD*T~;9@){$5-^f=O`A0_niIIP5WPk#9EgUyOXKk^gSwe;WDUMxOe`4gc%; zzmYdG^6iX#2P2P+d`BbS*~nu?zKfCXYUH~c`5s2Tmyz#d?vqND+t((OPRP?imN}5hrfr-WvDTxVOeF&bVq_^?%2<|9HQ*57!mt`J4#9Jm;Kz z5jc4bKiu#m4L{oOV-2qveuCjA8Gf?iry72`;b$6tw&8Wd&olf2!!I)YV#6;r{Bpyu zG`wN>HHKej_zi~NWcV$H-)8t7hBpnr+wgl0zu)i&4S(41M-6}6@Rs3E8UBpn&l&!L z;V&8fis7#r-ZuPA!{0XiUBllu`~$;3GW-+6JBEL5_?L$N)9`;8{;lEP8~$&@yBD4L z#b5s${wu>5F?=z@moR)u!8X|Jv~17`}qxD;d6u;j0;5FnkTe2OGY&;p-Z{ zzTq1fKFn~(aL@3-@W}AQ@C^;$*zipaFB-m?;hP)2rQur{{#(PhHT-vmmkj^C;X4@q z2g7$Z{EvqJ$?!iLUN(Gp!zUWPhv9n~{ujgdGJLw>6~kv5KHKnp4ByxAzZ(8G!~br0 z)$o59ez4((8h*IpM;d;#;l~ay{A|PPhM#Bn1%_W__{D}_ zYWU@bUuk&5@M{de&hQ%yzsc}h48P6rI}C3cez)QG8h*dw4;uck;g1^rxZy3spECRz z!=E$!1;bx5{1wArGrVp1n})w__`8O`Z}e`NS4hIb7A-0&|A|EJ;qGW=V^zc>8f zhIe0R>=%FiZ}_haU&Qdm3}3?VB@JK7@Vw#682)R+e`ELxhOcD!Du%CSc){>B3?FRx z+J>)d`1*!#VE8b@9m74t1H&W36T>$&d}G5mHN0r}W`=KW_?CumW%zFm-`4Qo8D28{ z_lECa_#X`4+3-Ia{wKr#Y6lMO%B@Y4-H)9|wmuN!`z;TITw zk>M8`eyQP?8-AtX4a2W7{5r#LF#IONZ!!Ef!|yP>Y53iS-)s2&hCgWd!-hX<_~VAR z41db-XAFPN@D~h!$?#VUf6ef=;cpuLw&Cv@{=VTK82*vrpBUaT{By&c^}pf2GJFxk7c+bb!HGEsc ze`k2f@ZTH0gW-QLd}qV|X!xHD|Fhv`!*@4)qTzcOzNg`TF?=t>ryE`|e5T>E4d2J` zeGUJs;eRvy?}k?m|A*lR8-A$ahZ}yR;YS;Otl>4oPcZx>!%sH+RKrg<{7l2oHoR{5 zd4^wL_(g_aZ1|;yUvBu7hBpkq#_;P5zrpaE48O(j+YGQ~`+%r5dJTg2nd_%)GHhfdVi-vDz_~wRhY4}!# z|JLwr4ga0tCBuJj_zs5u!SJ08|D)l5GW^emmkrivIyzhV3K z?$f;1R3$kKQ;np1E$BMQC72o{w_s|LJc6l3@(QLl z$;X&FB;D&Rbw31p`x%HSPg20tz4h+nV(MPCrzhQO;ucB9Vk(hL#8f8fUa_u1aww)M z$tjp>B;D)r)JeKmOmC1pjHyZTGNu+u_ZqBik{>X2NS6BPllbS4w0kAB?&UmskKMsk zAQ_3NtG)YluSHWN>0XJtL^2ywndA^m6_W0CBC8||Fx5zI!c-^eUhSzt@)D*d$%mL) zB;R9dlMKMqLx*Iw?h^)Xy+=A6Q=X)VsX#IYlS8sQrtbZEKh7*nC6a?Nl}YAfs*qfS zsY-GqrW(nEnCc`iVrr0lfT>CH9i|q^l6YcnldKBqkPPcSdE?f5Tq7{$NlKUsB;zqT zBr`D;N#i$^0pX+8!6_Q6VRY_jOR3rHm zQ=Oy_y4)aH7SbeH3(_KqA#IYaAsv!kAvxT7XP$;BPjVop0?F~19Fp@f6-lngR3do* zQ<>yNOcjz3F;z)^z*Hj{xES_BG6>Qj@gYr;Eg&tDogi(JDUc4y{*WAQz5N`6DNk|^ zrUJ>;m>iOOFcnFj#Z)4B4^x@s8%!0F{)=NjB&$MdB*P(fl97-G$yi8}WD=xBG8fV& zIRerlIRlczt+$^mFy%?^#8e=85|cyn7N#P}SC~p9i{et0Ws(&k6_O#4D#<308p-yM zI>~rQgJc$@Npc9JMRE$HO>zmOLvkwwmyr9}ejdY=CwU!Hf#fqx4oP493cpCQ9Hd0D z4x~(yLMkNNK&m9WL24v3Aa#<1APtfeAx)ACAuW;{A#IX}ARUsIA-HJU&-U{%raZ}y zmlaNSkEwrLZ58l_5FYueYC}kUYrPPlu1s5 zR7fs^R7q}!)JUFy)JfieG)TUHG)em5|KVFC%R|~E>p?ms8+HHBA3s)aKifg_B;z0j zlD#1g$vjArWIm)svH(&hxfxO+c?41=c@66EPNS1{(N!Eh2NMcBvWNS!= zWLHQIKVNS@(;#`010e;H;~@^o`H&*X^^g+D1CTPwi;xP*hmb1C50DzkK)m*Ion#QC zLE=N2BwIjQBs)RcBvT+AlKmmw-^%Ij=NL$y9+3aOB61F4ei2C0$EfYeD2 zf;31@gfvMmgtSO*gtSQ>f^k%lObi2{U8;Rqaan1vmiB+s~~lfyC4mcry)&}cOWg2uOV%c#qp;N z9g>wHIqaynpP`UE$p}b+WDLY1nE)x0%z>0h4uh0QPJ>iPE`wA_Zim!Jo`BRz-hebn zzJN4I`r#7IEt2ISZIbmM9g>Z@7k0)Td;8fAk|!AlDUj?9aY*JtiX`(PC6Wb@GRe)5 z3dtjoD#@#m8p)@SI!T`uu^*CUAx)CCAT5#@(k9s&(jnOulEbch`i)1HAn`8>4L$W`l zdvWmIevX0UNzQ>3NUnxBB=h*$en?h@)JTRy>Leo}4U(~t zCdnj7i)1dOO>zXJLvjWrhxbr#KUYBVBzHmzBu_#dlD8m5lCK~ol0{d+en?h?R7i$E zswA60Y9!l3>LlYK4U$=qCdna?7Rf1)HpwNB4#};M9Nvq){X7QAle`WokbDMlNc!TB zREs3bK}sa+K*}U3q(ZU{q)M_Iq((9WQYSeG(jYkz(j>VM(jvJL(k6Kb(jj>nlEZtt zx1Wz8d6FL?1(Ky#!+uECgcM0aNQq=Lq)f64q(U+kQYAS6QX@GIQYSeV(jd7O(j>VL z(js{t(k595>5zN}$>F1+x1Ry4V?QLTLkc7=#3304DU$36DUnQulu7o3R7j43R7uW) z)JU#^)Jg7wG)SI?G)dlpv`D^&v`H2(U_T@)L%M(6ptql)kUYrPPlu1s5R7fs^R7q}!)JUFy)JfieG)TUHG)ejm!hT4WhqOu7gLFtXg5>Zq)Z5Q? zkUYsaNP%Q;h(j_DQY4uVDUmFIlu2%eR7f6yR7qZi)JQ&s)JgiRf&Gvy3u%(91!NQ-1ANSkB|q(iblB!`d1-hPgO|wh2FZz#Cdq}67Ril}HpxSf4#~@q96ri>`}r7>C;1UlAX$1H?1yAcNRcFjlt@NH z$|So$DkM`ORgwcBHIm~Xb&_)-4U%giO_KW{Et2OUZIXqM4#{_r96l3z`x&q<_CvBd zq(I_A9FkFxBFT=B63JvpnPfjmh2$tmmE3dv=VD#`7T8p#uoI>{T5 z2FVwYCP}~bu^*DpuOiR3*5$wC$>H<4x1Yx#d6L&51(MGo4oTnP z*bm8akP^u{kTOXMsgP^~sgmplsgcZp)JYD4G)PW_G)XRmv`B7*v`HRO=sBu7E2BxgZt zBv(P|BzHj?Bu_({B=104Bws_?B#V3456Q}q9G)q9`xy$!lZ=2ANX9@Mk_nI^$s9Z$k{Hq^ z*&5Oz*%gw*^Gk0((;#`010e;H;~@^o`H&*X^^g+D1CTPwi;xP*hmb1C50Dzkz!3W( z83bvN_>d;a7LXRnPLMXq6iA0;e@G6`LB0JP1Id$|11XSP4RJ{BffPxeg_KC%gOo|W zfmBHPN7xU^s*oDVa7dkGB&0zy7Sbe{1Zk1Xg|tbIfOJUCfaLHz)!WY%kUYtqkOIk* z5QpR~NRi|#NQq?882cev5mF%;0;!U00;!Q~52=%khcrlLL7F6oKw2cHK-wgiKsqG1 zLUMR6>+R<;NS@?%NP*-th(pph!G1`VgOo_tfs{#7NQGn@NR?zaNR4C$q)u`Wq(O2b zq)Boiq(yQgq)qY=q(kyDB!}m_-hMuYjDkPUdswB5VY9voU>LhPK8YEvpnk4-; z#(qeahqOu7gLFtXg5>Z_+S|`|kUYsaNP%Q;h(j_DQY4uVDUmFIlu2%eR7f6yR7qZi z)JQ&s)Jghmg8h&z3u%(91!NQ-1ANSkB|q(iblB!}nU-hPgO z5#k($>F)ax1Wz8d6FL? z1(KyV!+uECgcM0aNQq=Lq)f64q(U+kQYAS6QX@GIQYSeV(jd7O(j>VL(js{t(k595 z>5zN}$)N|m{R|j|{gA8UHBe@DvC%FsK zAbA?nBzXtYBKaE9CRu!Q?1yA!NDhVQ?Pn+?Pci~hAQ=O3NG3pvBy%7olEWZnlG7j+ zlFJ}flG`CQk|!W_k~bg?k}n`ll73rYKP1aT+9c~iIwTuGa;QjeKifg_B;z0jlD#1g z$vjArWIm)svH(&hxfxO+c@$D5c^y(C`5aOw>9-~JL$U&-Niqb|BH0wuCK&_ikW7T+ zP@3L;=0fr$M?wlDXF(j22Bb)G52Qr$9HdOL5K5%sS%izJzPv5W)Yy+?MlRF4+A2)9DobfX!j+?OOqzO~UO_?x$uf4|YQJFn6 zxApXWW=x&5<&2qg@#aZ0bAx|+(VRo;1#$6n_Z74?oVHG|rwh&Ym>R zo;1#$G|8Sc$(}UHo;1mxG|8Sc$(}UHo;1mxG|8Sc$(}ULo;1y#G|iqg&7L&Po;1y# zG|iqg&7Ks$HOudpG<#Cl$sW~pvS)Rj>|tFeds^4Y9@llU=XIUzfn6tiV%NzY*>&X1 zzmO|AvnywI<;<>}*_AW9a%QcTW=p!|O1NApmn-RVrCqMX%awY$k}p^K zbERRfM9h_nxsowgI_65qTq&6=DRZS|uEflhnz@oQS9<13&|E2+D@k*uX|6=gm8!Xt zHCMXkO4wW}n=5H^rERXn&6T>jk~dfS=1SmPDV!^bbER>vM9!7Uxso|oI_FC0Tq&I^ zsdJ@uuEfrj+PRWDS9<44@LVaLE6H=Ed9FmymFl^YJy*KtO88tUpDXEerG2i%&z1VQ zl0R4a=Sl!wDWEF}bftl=M9`HAx{^UxI_OCUJ?Wq)9rUDwo^;TY4tml-PdeyH2R-Sa zCmr7XYa^rVBHbkLIydeT8pI_OCUJ?Wq)9rUDwo^;TY4tml-PdeyH z2R-SaCmr;pgPwHIlMZ^)K~Fm9Ne4aYpeG&lq=TMx(31{&(m_u;=t&1X>7XYa^rVBH zbkLIydeT8pI_OCUJ?Wq)9rUDwo^;TY4tml-PdeyH2R-SaCmr;pgPwHIlMZ^)K~Fm9 zNe4aYpeG&lq=TMx(31{&(m_u;=t&1X>7XYa^rVBnbkLU$`qDvPI_OIWed(Yt9rUGx zzI4!+4*JqTUpnYZ2YuUL0>xPO9y@Fpf4TtrGvh7(3cMS(m`K3 z=t~EE>7Xwi^reHobkLU$`qDvPI_OIWed(Yt9rUGxzI4!+4*JqTUpnYZ2YuUL0>xPO9y@Fpf4TtrGvh7(3cMS(m`K3=t~EE>7Xwi^reHobkLU$`qDvP zI_OIWed(Yt9rUGxzI4!+4*JqTUpnYZ2YuUL0>xPO9y@Fpf4Tt zrGvh7(3cMS(m`K3=t~EE>7Xwi^reHobkLU$`qDvPIv7X?1L(gMoA~kPZgY!9Y3~NCyMyU?3d~q=SKUFpv%g(!oGF7)S>L>0lro z45WjBbTE((2GYSmIv7X?1L(gMoA~kPZgY z!9Y3~NCyMyU?3d~q=SKUFpv%g(!oGF7)S>L>0lro45WjBbTE((2GYSmIv7X?1L(gMoA~kPZgY!9Y3~NCyMyU?3d~q=SKUFpv%g z(!oGF7)S>L>0lro45WjBbTE((2GYSmIv7X?1L!~m4u;afP&yb&2Se## zC>;!?gQ0XVln#c{!B9FFN(V#fU??37rGue#Fq964(!o$V7)l32>0l@w45fpibTE_- zhSI@MIv7d^L+M~B9So&|p>!~m4u;afP&yb&2Se##C>;!?gQ0XVln#c{!B9FFN(V#f zU??37rGue#Fq964(!o$V7)l32>0l@w45fpibTE_-hSI@MIv7d^L+M~B9So&|p>!~m z4u;afP&yb&2Se##C>;!?gQ0XVln#c{!B9FFN(V#fU??37rGue#Fq964(!o$V7)l32 z>0l@w45fpibTE_-hSI@MIv7d^L+M~B9So&|p>!~m4u;afP&yb%2P5fVBpr;TgOPMF zk`6}F!ALq7Ne3h8U?d%kq=S)kFp>^N(!oeN7)b{s>0l%sjHH8+bTE<*M$*AZIv7a@ zBk5oy9gL)dk#sPU4o1?!NIDov2P5fVBpr;TgOPMFk`6}F!ALq7Ne3h8U?d%kq=S)k zFp>^N(!oeN7)b{s>0l%sjHH8+bTE<*M$*AZIv7a@Bk5oy9gL)dk#sPU4o1?!NIDov z2P5fVBpr;TgOPMFk`6}F!ALq7Ne3h8U?d%kq=S)kFp>^N(!oeN7)b{s>0l%sjHH8+ zbTE<*M$*AZIv7a@Bk5oy9gL)dk#sPU4o1?!NIDov2P5fVBpr;TgRyilmJY_!!B{#N zO9x}=U@RSsrGv3_FqRI+(!p3d7)u9Z>0m4!jHQFIbTF0<#?rx9Iv7g_W9eWl9gL-e zv2-w&4#v{KSUMO>2V?1AEFFxcgRyilmJY_!!B{#NO9x}=U@RSsrGv3_FqRI+(!p3d z7)u9Z>0m4!jHQFIbTF0<#?rx9Iv7g_W9eWl9gL-ev2-w&4#v{KSUMO>2V?1AEFFxc zgRyilmJY_!!B{#NO9x}=U@RSsrGv3_FqRI+(!p3d7)u9Z>0m4!jHQFIbTF0<#?rx9 zIv7g_W9eWl9gL-ev2-w&4#v{KSUMO>2V?1AEFFxcgRyilmJY_!!B{$&NCy+?U?Lq% zq=SicFp&->(!oSJm`Dc`>0lxqOr(Q}bTE+)Cepz~I+#cY6X{?g9ZaNyiF7cL4kpsU zL^_yA2NUUFA{|VmgNbx7kq#!(!9+TkNCy+?U?Lq%q=SicFp&->(!oSJm`Dc`>0lxq zOr(Q}bTE+)Cepz~I+#cY6X{?g9ZaNyiF7cL4kpsUL^_yA2NUUFA{|VmgNbx7kq#!( z!9+TkNCy+?U?Lq%q=SicFp&->(!oSJm`Dc`>0lxqOr(Q}bTE+)Cepz~I+#cY6X{?g z9ZaNyiF7cL4kpsUL^_yA2NUUFA{|VmgNbx7kq#!(!9+TkNCy+?U?Lq%q=Tt+FqICb z(!o?Zm`Vpz>0l}yOr?XVbTE|;rqaPwI+#iaQ|VwT9ZaQzsdO-v4yMw0l}yOr?XVbTE|; zrqaPwI+#iaQ|VwT9ZaQzsdO-v4yMw0l}yOr?XVbTE|;rqaPwI+#iaQ|VwT9ZaQzsdO-v z4yMw5jAz_mVG6ccg~6mwaiuBR#~u^b6{xi1?a+J-sv$_tMi#6>%>;y>t=x c($h;BaW6f+v=OgQpr@BQ;$C`s^l^#*13WI~XaE2J diff --git a/Microsoft.Windows.CppWinRT.2.0.210806.1/readme.txt b/Microsoft.Windows.CppWinRT.2.0.210806.1/readme.txt deleted file mode 100644 index 049ab13b8..000000000 --- a/Microsoft.Windows.CppWinRT.2.0.210806.1/readme.txt +++ /dev/null @@ -1,22 +0,0 @@ -======================================================================== -The Microsoft.Windows.CppWinRT NuGet package automatically generates C++/WinRT projection headers, -enabling you to both consume and produce Windows Runtime classes. -======================================================================== - -C++/WinRT detects Windows metadata required by the project, from: -* Platform winmd files in the SDK (both MSI and NuGet) -* NuGet package references containing winmd files -* Other project references producing winmd files -* Raw winmd file references -* Interface definition language (IDL) files in the project - -For any winmd file discovered above, C++/WinRT creates reference (consuming) projection headers. -Client code can simply #include these headers, which are created in the generated files directory (see below). - -For any IDL file contained in the project, C++/WinRT creates component (producing) projection headers. -In addition, C++/WinRT generates templates and skeleton implementations for each runtime class, under the Generated Files directory. - -======================================================================== -For more information, visit: -https://github.com/Microsoft/cppwinrt/tree/master/nuget -======================================================================== From 6aa6b8c950ce8df681a6c3deb6eecd4c3e4bb403 Mon Sep 17 00:00:00 2001 From: Tritonn204 Date: Tue, 15 Apr 2025 10:39:18 -0700 Subject: [PATCH 191/193] gitignore fix --- .gitignore | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index 05e1f380f..b61c79144 100644 --- a/.gitignore +++ b/.gitignore @@ -21,7 +21,7 @@ #.vscode/ #CppWinRT manual install -Microsoft.Windows*/ +Microsoft.Windows* # Flutter/Dart/Pub related **/doc/api/ From 89f55c7fece0802be54b0c3763f30746945906b4 Mon Sep 17 00:00:00 2001 From: Tritonn204 Date: Tue, 15 Apr 2025 10:40:07 -0700 Subject: [PATCH 192/193] remove libtinfo5.deb --- libtinfo5.deb | Bin 100086 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 libtinfo5.deb diff --git a/libtinfo5.deb b/libtinfo5.deb deleted file mode 100644 index 06dbc4822258e8ff880345e7bf0af67398c2076f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 100086 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 Date: Tue, 15 Apr 2025 12:42:26 -0700 Subject: [PATCH 193/193] switched back to native path separators for Xelis --- lib/utilities/stack_file_system.dart | 4 +- .../wallet/intermediate/lib_xelis_wallet.dart | 4 +- pubspec.lock | 74 +++++++++---------- 3 files changed, 41 insertions(+), 41 deletions(-) diff --git a/lib/utilities/stack_file_system.dart b/lib/utilities/stack_file_system.dart index 217b33eeb..795ea9720 100644 --- a/lib/utilities/stack_file_system.dart +++ b/lib/utilities/stack_file_system.dart @@ -151,7 +151,7 @@ abstract class StackFileSystem { static Future applicationXelisDirectory() async { final root = await applicationRootDirectory(); - final dir = Directory("${root.path}/xelis"); + final dir = Directory("${root.path}${Platform.pathSeparator}xelis"); if (!dir.existsSync()) { await dir.create(); } @@ -160,7 +160,7 @@ abstract class StackFileSystem { static Future applicationXelisTableDirectory() async { final xelis = await applicationXelisDirectory(); - final dir = Directory("${xelis.path}/table"); + final dir = Directory("${xelis.path}${Platform.pathSeparator}table"); if (!dir.existsSync()) { await dir.create(); } diff --git a/lib/wallets/wallet/intermediate/lib_xelis_wallet.dart b/lib/wallets/wallet/intermediate/lib_xelis_wallet.dart index c2b810b6e..901223469 100644 --- a/lib/wallets/wallet/intermediate/lib_xelis_wallet.dart +++ b/lib/wallets/wallet/intermediate/lib_xelis_wallet.dart @@ -182,7 +182,7 @@ abstract class LibXelisWallet return ""; } else { final appDir = await StackFileSystem.applicationXelisTableDirectory(); - return "${appDir.path}/"; + return "${appDir.path}${Platform.pathSeparator}"; } } @@ -319,7 +319,7 @@ abstract class LibXelisWallet static Future checkWalletExists(String walletId) async { final xelisDir = await StackFileSystem.applicationXelisDirectory(); final walletDir = Directory( - "${xelisDir.path}/$walletId", + "${xelisDir.path}${Platform.pathSeparator}$walletId", ); // TODO: should we check for certain files within the dir? return await walletDir.exists(); diff --git a/pubspec.lock b/pubspec.lock index bae7b77f5..ffcc7e9a8 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -588,10 +588,10 @@ packages: dependency: transitive description: name: dbus - sha256: "365c771ac3b0e58845f39ec6deebc76e3276aa9922b0cc60840712094d9047ac" + sha256: "79e0c23480ff85dc68de79e2cd6334add97e48f7f4865d17686dd6ea81a47e8c" url: "https://pub.dev" source: hosted - version: "0.7.10" + version: "0.7.11" decimal: dependency: "direct main" description: @@ -628,10 +628,10 @@ packages: dependency: transitive description: name: device_info_plus_platform_interface - sha256: "282d3cf731045a2feb66abfe61bbc40870ae50a3ed10a4d3d217556c35c8c2ba" + sha256: "0b04e02b30791224b31969eb1b50d723498f402971bff3630bca2ba839bd1ed2" url: "https://pub.dev" source: hosted - version: "7.0.1" + version: "7.0.2" devicelocale: dependency: "direct main" description: @@ -653,18 +653,18 @@ packages: dependency: transitive description: name: dio - sha256: "5598aa796bbf4699afd5c67c0f5f6e2ed542afc956884b9cd58c306966efc260" + sha256: "253a18bbd4851fecba42f7343a1df3a9a4c1d31a2c1b37e221086b4fa8c8dbc9" url: "https://pub.dev" source: hosted - version: "5.7.0" + version: "5.8.0+1" dio_web_adapter: dependency: transitive description: name: dio_web_adapter - sha256: "33259a9276d6cea88774a0000cfae0d861003497755969c92faa223108620dc8" + sha256: "7586e476d70caecaf1686d21eee7247ea43ef5c345eab9e0cc3583ff13378d78" url: "https://pub.dev" source: hosted - version: "2.0.0" + version: "2.1.1" dropdown_button2: dependency: "direct main" description: @@ -718,10 +718,10 @@ packages: dependency: "direct main" description: name: equatable - sha256: c2b87cb7756efdf69892005af546c56c0b5037f54d2a88269b4f347a505e3ca2 + sha256: "567c64b3cb4cf82397aac55f4f0cbd3ca20d77c6c03bedbc4ceaddc08904aef7" url: "https://pub.dev" source: hosted - version: "2.0.5" + version: "2.0.7" ethereum_addresses: dependency: "direct main" description: @@ -1268,10 +1268,10 @@ packages: dependency: transitive description: name: local_auth_android - sha256: "6763aaf8965f21822624cb2fd3c03d2a8b3791037b5efb0fe4b13e110f5afc92" + sha256: "0abe4e72f55c785b28900de52a2522c86baba0988838b5dc22241b072ecccd74" url: "https://pub.dev" source: hosted - version: "1.0.46" + version: "1.0.48" local_auth_darwin: dependency: transitive description: @@ -1462,18 +1462,18 @@ packages: dependency: "direct main" description: name: package_info_plus - sha256: "739e0a5c3c4055152520fa321d0645ee98e932718b4c8efeeb51451968fe0790" + sha256: "7976bfe4c583170d6cdc7077e3237560b364149fcd268b5f53d95a991963b191" url: "https://pub.dev" source: hosted - version: "8.1.3" + version: "8.3.0" package_info_plus_platform_interface: dependency: transitive description: name: package_info_plus_platform_interface - sha256: a5ef9986efc7bf772f2696183a3992615baa76c1ffb1189318dd8803778fb05b + sha256: "6c935fb612dff8e3cc9632c2b301720c77450a126114126ffaafe28d2e87956c" url: "https://pub.dev" source: hosted - version: "3.0.2" + version: "3.2.0" path: dependency: transitive description: @@ -1542,42 +1542,42 @@ packages: dependency: "direct main" description: name: permission_handler - sha256: "18bf33f7fefbd812f37e72091a15575e72d5318854877e0e4035a24ac1113ecb" + sha256: "59adad729136f01ea9e35a48f5d1395e25cba6cea552249ddbe9cf950f5d7849" url: "https://pub.dev" source: hosted - version: "11.3.1" + version: "11.4.0" permission_handler_android: dependency: transitive description: name: permission_handler_android - sha256: "71bbecfee799e65aff7c744761a57e817e73b738fedf62ab7afd5593da21f9f1" + sha256: d3971dcdd76182a0c198c096b5db2f0884b0d4196723d21a866fc4cdea057ebc url: "https://pub.dev" source: hosted - version: "12.0.13" + version: "12.1.0" permission_handler_apple: dependency: transitive description: name: permission_handler_apple - sha256: e6f6d73b12438ef13e648c4ae56bd106ec60d17e90a59c4545db6781229082a0 + sha256: f000131e755c54cf4d84a5d8bd6e4149e262cc31c5a8b1d698de1ac85fa41023 url: "https://pub.dev" source: hosted - version: "9.4.5" + version: "9.4.7" permission_handler_html: dependency: transitive description: name: permission_handler_html - sha256: af26edbbb1f2674af65a8f4b56e1a6f526156bc273d0e65dd8075fab51c78851 + sha256: "38f000e83355abb3392140f6bc3030660cfaef189e1f87824facb76300b4ff24" url: "https://pub.dev" source: hosted - version: "0.1.3+2" + version: "0.1.3+5" permission_handler_platform_interface: dependency: transitive description: name: permission_handler_platform_interface - sha256: e9c8eadee926c4532d0305dff94b85bf961f16759c3af791486613152af4b4f9 + sha256: eb99b295153abce5d683cac8c02e22faab63e50679b937fa1bf67d58bb282878 url: "https://pub.dev" source: hosted - version: "4.2.3" + version: "4.3.0" permission_handler_windows: dependency: transitive description: @@ -2088,10 +2088,10 @@ packages: dependency: transitive description: name: url_launcher_ios - sha256: "16a513b6c12bb419304e72ea0ae2ab4fed569920d1c7cb850263fe3acc824626" + sha256: "7f2022359d4c099eea7df3fdf739f7d3d3b9faf3166fb1dd390775176e0b76cb" url: "https://pub.dev" source: hosted - version: "6.3.2" + version: "6.3.3" url_launcher_linux: dependency: transitive description: @@ -2144,10 +2144,10 @@ packages: dependency: transitive description: name: vector_graphics - sha256: "27d5fefe86fb9aace4a9f8375b56b3c292b64d8c04510df230f849850d912cb7" + sha256: "44cc7104ff32563122a929e4620cf3efd584194eec6d1d913eb5ba593dbcf6de" url: "https://pub.dev" source: hosted - version: "1.1.15" + version: "1.1.18" vector_graphics_codec: dependency: transitive description: @@ -2200,18 +2200,18 @@ packages: dependency: "direct main" description: name: wakelock_plus - sha256: bf4ee6f17a2fa373ed3753ad0e602b7603f8c75af006d5b9bdade263928c0484 + sha256: b90fbcc8d7bdf3b883ea9706d9d76b9978cb1dfa4351fcc8014d6ec31a493354 url: "https://pub.dev" source: hosted - version: "1.2.8" + version: "1.2.11" wakelock_plus_platform_interface: dependency: transitive description: name: wakelock_plus_platform_interface - sha256: "422d1cdbb448079a8a62a5a770b69baa489f8f7ca21aef47800c726d404f9d16" + sha256: "70e780bc99796e1db82fe764b1e7dcb89a86f1e5b3afb1db354de50f2e41eb7a" url: "https://pub.dev" source: hosted - version: "1.2.1" + version: "1.2.2" wakelock_windows: dependency: "direct overridden" description: @@ -2338,11 +2338,11 @@ packages: dependency: "direct main" description: path: "." - ref: "v0.1.0" - resolved-ref: c685c5d3550cca414ec30d4b61259761f129dda6 + ref: "v0.1.1" + resolved-ref: ee7a5756f5f403e6a371990c2817f38eb21a97b2 url: "https://github.com/xelis-project/xelis-flutter-ffi.git" source: git - version: "0.1.0" + version: "0.1.1" xml: dependency: transitive description:

TI%}0#{0l{UVD)lRZS|Wkv+u3G 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%0A!_Bbz7jZ!fx`-{&TWuE3^X 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

7w-asv6A%A@!>tp++5Hhjyjw!61EYu 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 delta 7453 zcmai&2|QG7`^RU)*yq@?FCj}B9=lc)k0)h$$WpRpPbh1oi55%AGB~KAu`3Y?kyIkP ztWhbEC0RP?(rydX({$fMxB-h&;y zJ%uF8OWVxq{a(@nmTE0P=1t#p`KCZ8fy&G&57=$MX@aHhB7&BKi9c}E=mXM#-OmqP zv8T#uk^#$}nxbq}F&P!Wva8H95_O(O1F)>kD?p(7ifaM_dm_Gyr~0uf0d_xRHNjJB zq(I`#(tJ2-E`vH?_g987EVYVjKfpE@_b`@PnyUy{Ud)xpQV-@R0G6-j$Y7}}xb1-D zUHFqY>M2oGz;e0hT`W>AJk-xjVsdCPUfS&3F&Gm=Jb?#;zTAy_tzc3BR*~N_%irb3 zCOBH5Fl~$gNJquQ7(p`?7PMwj-8^3vC#+faC%~4q1T_FauOsjm~kR;y1>`i34qe7=wT;ZEP)qliJF_MRp>q;dS8T_1F(Ps zso)F5G98Ac-Y|nqc)npS3WdclFn|<1FEE6gQAIS_;nMxgpv0~0XO@HE*S<_3m2G}Z zM;>op3Ken6MCTZIM+~bv00@d<6%K^ebJ;-Z;kj(nR)7>;T4NJ%hDDxZK~>@Q9BY?D zy+&e#6FP990N-@rn)XmvIoROb&nzINub)|z=&&S>aUUR%KpLZ29}z9)Dl4Rz-2$+G z2z)^b`73gvzyITd7^e6`rU0Q)e<&3TUnN5t0N@oF!ZN@r8juzM2-AQ_*!6(=RUp8J zQ-!oD#DRxJ+emu=Dn4x_3p}i73GD^|7c3!V94vDP0-f!dLr^>pu$kW&lEJ~N%_L9| zhApISEd22=NDZJsJ_vos!lDMiJb4&E!C06@511z_J;(tIH@pP;z|%>ZF@_Dzfk{j; zhhQ9hJ`m_bb09Q;TR#e%1W?6T0=o12y!M#_p=+j4Ee?LD56lPtPe=$0ms*3uEk6of z6@uGjAzeU1rR1P{IJid}(&0r5_P>g@LS6^z!E=~f_FAE3j=mVw;gVp8m!e(b@3QI5 z9fO%Z_C7XClk0p&tz%EeD;3iD*<-kmpJvLs?v}+iN*IM-!6;{U*WCI3zC+!<+5Seh z@sfH>PdEK>u?-n+ao+W92`;v?d#B`nwJP}g^quL|i#7Q#dAp4jnYZqC`?h)R>FO&7b?`M}zdot}Z8XYd3P)cN4xtsBt zdhXVEehsma{BHIc^BH-A9X+#kvi(M-l0%m}pYA=YZIO|ayR_27lKI#56WZm4PhvE* z`+2kyU)TyizhzfhZ6EIa%JeaN`ClxFcAr`HQ|@Q=FnOvAzbtEfH}G=%(hrVL?p#Oz zAZbMU>DfkKe-l<=cx&-?UlRxM;8L|zN!W0CopV&A(c2HTlNLdqvu{>b9i^7Cy{e&+ z2p+~qUG|6UYiU8QXUT50PCujioP+?`zL~eB=f6V8DyZwFmoAz$0x+ z$zPw+(CZhSIB|mKb$Lz6i~h4ZXRqHOkI*wjnuSCiyo7%^COY@0+S?qi?03+DETQOOZ&43y!vz z@xdD>aK8;udpa3E9=RAW5nc5BUWaM3s2bb+uDOA%u&0l`vravV>3w1r$}K|dZoIB8 zX!CX3e5V(qPJY9K`fB2#8+#l}-&PeBDXY7dUg5Dku(v0kBWy>TO)sQ-T##0x;~JoF z)K4~#5)`1@!I8*DKi4#%74pjRG>4j&W2skA>@oTB!I)VAqOo64yVWN>|7ua$n`W`g zm%MTsZ+cD4>=wcZ`I+NKfA#gGoV1{8aPYO|`t{eP*6%iOse8AUe}PqTf?nl7(f%Gj z;=QVw!lW?1TWKov-C3tcVGUK2VGe;Ed7y87qzv6Awr`T0{)X;Uby!cCCMcA}f3}F&zUY{yvkHbDa8kAtn+*K0QEo zzTs6ax16EvA$t4wes8L#!3aabv7IL=>a$Y$TG@nT<4P_OpMtNJ^;@>6D)3In@CBG9 zuyogK*(F$L!#*82quwQcbyBK1g(g&edn}?#m*VlR^rqX1llT7qcHYT4nS=R8MPXZ6 z%f;{4ckz-vv4caG(m9&W-yJgvYbEZ1Ji=`PcPq@4v>4LTZ43=4l}m`_zjiB)?jkiRB*?ahS-gYVDHn-3*;buDM-nfc7c zjxQ%ua9V{?q{*uIaoJnDCov}1LomX+0@|ZZWj%7dBAsnv`@Ir?LOjX_-CTo)6$DScn@^S5p6#aFCG2)!v5#}p{Mq8GR6E74wlDd z>92k=uC~Q~I?y}Ppd-ASUx3T3#IEP^mFFSy>Qa<3Pa0_;v(8fRfOn-+fnGdkcFaqb zHj~VhD8J%DvKRACz6C3`CF_^>W?#~`T)se$FYzgm3a5)4=05#Qw8lBKcg3w(Oe4>3 z$<^o8!tnZ7YZ`r&Cv`nfs!@ZB@zoTOtKx9!lIH|&Y;O|6H$=(6lx zv_c|=@^t?G;LD6F_kM+KuPV3se!Bn1*&Dc8&48;}&%6G(AhP!^n=reFm3n(@e&QnI zyKU*i)KfMqpY{!M%+>61Toip;U0k=rvDh`BUg?lWc;_D{qE;HpwB9R-?@829ZhGt8 zC;mgr(U!cx>*~$$_-gytkc_oztX;$Vw~1SNx|H#6DM{hgor}{yX{&>ItFzNd`W;Kh z71#7HZ_T@~^0)MO1|E~(0_W$J^E3YaLAoFTX2Te8Y2+Q$-|3BimvdVHue~*l)k4i3 zqumvBq)=+AfE1p${iyU$I~z9UAq$J9<@@k{mPZpu&ivYg5oflUmDj3WI-^H$QhhjI z5vDRs*Q8MPO=Pt-Zf}E@3~p5AtDF%qh>q;-yGNdDRbUA|t`sq$tfD62CPhnhaLcyw zr@J`~E_`tNc;rW%>RejVy~J0g9fXP7S0Z#5On0^FRNt;AJ-+icN!xb3IAXqv`kNonODE6?T5$*``bcab~JG#HchwF|~zNdZY_ODyB+NE8!+!q_wq2tSt zA*UUj*)*K>tY`dovauyOqsTVB$bRpU`X>YP2c#w2=&rW~G=0WTFrwy+=p9y4t9whs`9}v|G4p*6L0U3xoms$wJv!qyS^_{=1zp~wO|3; z7NxYDB}&-OOgk^JCh~>V;9%v4vdL~{M?ZX#Nr?8~wKJ5fN($ML@Ncz&!E!W16q%JMtx2;Q+mFfjI+#rkz77mmS=r=R`Oct z`J9ZL!~EM$9j9MwU;bgkOY>O}58@5CJXT+qznWs!ze}KvJ+bh(L49W>eLrD5sItj1 ze}=Z-HsTeFQ{PbZpqx8@@kOipR?{Ri%0l2x`59(jbC!a^kSp)MwJh%=GIlLT-&gaw zOyfH2ESqh&RPHulXm-qI$Iga#e|_-fmNZ;DH(EWdCo?9($L>AW_NgJf$$WK0cv{vc z*^x+Ij*bYaKHAE;NRhUE=oWQ~=%OLQ_S&2)@w`*_mvJ~_jlsl_iFnTQ@=6x-`j@=v zE08E$j=X_qOEAJ{Z1wSSRXk$Oj$s1MppxSt1>AKEOpb%3HXk>kN(wvvY{g(4e0`n$ zd=-5I{y$N8C>m10$F*Xp86=6#9~NP`YY6hJ9YeJjklFkjFnktO>FdT&Nt}`Zm7FNV zedk`dI|^}s({UHvbRAJi@5fN%4~PN~TNJU?!cvtqWdO)b41(0^p$HFkrwl&;dvF!O znk1T&yY#`9P>u42~cB1LDtZgfcP-t>(4>x+q90uX)N3sfZd|>PX_=8UsxOu z{@+Glw(*c4{=x6o8kmaTPS7X*Os6A{pzJnt*_xaYPgZwS)zlnY||Kj1YV)6&QzVG6Jf$Z-D2M zfmT1F?s05o{v8K76$0h)DvW?(51HW)zDywZ)=*|PkOgH#U{7TtC!khury<}?2G-wJ zjbm6r)tZQ&9zJvfe0KvF2N69urao3!XN?UoG=~$=414TigP$fqihxrHqauv>2e#jy zwNN200H}e6uvd)zH`w@@1ys#KXj1B*Y=F)%1RdD4fzi40zuF5O#{JWx$REQ0(Xl=- z2Mp;!BFPC5!~dApapohYn>Sdv+8@c@rlw&nIs%rY{uYIc$w(D!4sOjvz+dScuxTcw z3}Eh}Vs5uK#D1zkpu=^iAz)qB2Kaym2>=wu^APZ4-UjHI2k`^I!#M~zQ@{at8X-6S zLx+(5*gTFWC>US34uazNhL#j#@rIZ-4H(CpYy^}k*>I0|5NOpE1wHO>fcLY3X{KZ$ zpwfeN5aiwnn!Wes8)Ay-z{9dz%B}xQv#|8uJF283=UGIvsV7eFNMk z0aR2+O{;QlfG13W-~t-3HrEC?s1HnGDq0FT+#6t@H8ASl3;Oaf7&5z1#b zPb(G;bu^fF?{Rr7|38uhc>fb7<(Cj7y$3Pi{hxyWQqm|5GKEW`;QRV7*nuw}HW3Lo z39E$i|Fb-RLjN!GyHSkbk`}nW{0jzgBf%&6BhdZ}ZbP_+P4W9HL-C2iwNwO z7WlNkt7r&G6axSD3AO^Out^o9|Awzfe_ZM^PlGz4lE3F+7uot3E*JkU}|sS^`EzylZ_+uKY8_^w2}?r`j0LDWe*I@ zS(jX`!;nYuQms*a?`aWnyY3}ex(K-rayl}opbi^W70!p0R6s>xqw>jS^!1Ljhjm|& zMJ1xh!h)AcFUV*6yxDZXZIIv^@9hD|0`B+DAV$yID@HG;NxlXPG!UbJ*8vs)dRBOY zVdVe1(sO@I2HXyNbT~fGjK94?jQk(=CIug$T0O7NNh?CHYiT{N`&N0+$16_2bzb1( z%*N|2ge-7H&>sqA0Y(ai;xPQLfLF4&hcw7!_wzQF(8GAC|ItOy>y^+e@NQ&bql)#l z@rfUQ7EodEbFuXL2kMMkQ zo@hJsy!`w8XObD>TI~T;Qg*vCoMe(|cEx%BP^%mzTfk$vc~D<(1PHWzk}vj-PX|4jz^~JaThh{9BP6rqiSd$*jlLnR0t>gVI zt2;f>7{TBqQ>L11tO|!~%1eI#f@Tz?P@@CTo(jV@p!KZ;B5xlK2+9~rK4q@d9zM5L zr?2`PT|Sr$?kqG5%0I5|K+C$o1jA((1411aJMMQ)0}F-_0p7=Ph!Fr45{$1g)T*}Q zf8C;K6B~iv04zQCH(5pjkI;p@L0#en2mM+pi;1gz$XU64R=Ckkx5OQDb;jjZ(~350 z?^J?7K^iM^;lO0$It>n)+O!ht{5jYDYrkwd1Cqml0U-LT!7eOw3ow)9L$#wjHvb{o+T{o|c~Wnrq7elCy9&v+@C2#h3A4JWJ2d zPum|}Gok*6sO@A=EwqRuxYtI$)PKf*i=zWmVVZ&X=t=@__*PsbUg`(r z_??OUOSwMFoK`QoT=IyE6Z#Fky9kpV%}xTKs@mxSBLYM*UwqceF9=eu_zJH~WekMg zMlbYLge~gDan5^;nI&H^47wXtonWSU40Q97?b|C^ z6e$%81-_bLL~T$%c|^dJ-wB!~n8Am)et2+ooZKUNseue#(}Y`PKe{-E)9s!{0Y<>( z3&9G>HWQNIdKLsP<|W!UcO+)GI{rW?7wbuA*+X;c$*QrwT&M)LZOF^)l0R+dlTG}P zP^zw&{(0%7-P2uZZHg~@yzURA-kGY2o1ZrwFEGt5&%+ReScEtoEKet@M?qhdaGsR|J0T`tpt=q zZ^j{SHx`T?Jx|+Yz|}_2^YcQ_{qRNrG-mQ`X5-~0Z6ok9i{)ILd?Y7mL+~Y&Yj=VK-`=%g&YwVJnKTbuq?85((*$m0l~Tnj3!GKCY32$nO}rAImDhzjVluft8(# zez)pm88Mj$Zs!Fv$fN(sWxvH*iI3NeM@@9IMK7ky8{w+`HD=QQ5RJ;AY#OlBimFG6 zBG_@a+Z^!j8Z@h4B%T($6^+wH+Vif;uHh*qaC)cusBLD(g`jYH(soNCP1K+U*uEwFoq3ZugH&W9sc5yO%hM&f;BcbN2raj)mLkKnhT;5Oby>$>d?M<>fyzWfco zlk$K&-wIer4L*u50B2O7QE#gFGii{pIYzgcT8jM(EfJQq*WhFrVKkvYXZOwZoT)_f zeSnMU&=tIkp=cBA94CJL*5Rd|5YcE`gnIN;Ovd5e$bu;5?4Sxx-iK{0;EPfZM0>xvmu~xR1a&Sx zRzxJ4yh|G+=~#pn`x9flu-#PjB9e=$x~5$Vh2V94^F2u?4hp%mh20MyBH~KM*A+Md z_+9#Bs;?%e$pjVJn&cT~HUaij-Pkc5lF;7N^I%4}psOYAoK7-ml`smYZiG1UFj<1G z&`_&?RXr*OU`ANUg%10n_}8LKO*n1A3{@(zyY;|&Ap50|Cl7RkGS}DMg*sD04^Ff> zUDY@sc`}j^apj9R`6uxMI6BsPavAhp;cU3$P~+|N20p!iHOj_08m-N+( zW8QA&NqXzo7IwAM97B|U z*T%n8hQni1=Dn8NA8!;e&vxtw*kJ;NCSr=hr@|?+J?)-iq~DRnYGHMz+?X~l6Qavf z00#}2u@}AWPM83#>jKIwjvvCaUtjhhG1(}PSQQZY+>?8I(9Ch*@$&rG-OK?@>Ta(h zrfY;sjnO41#i_x8s`*@#2@%cu&ntL!X}>**`46syMNq{FxtfFM#7aT~s_oGOG0L#v zQ1iQuO@xyrFbap{jYT?ssI{<@XS<^U((bJ&sq+;Ji7&q?!Cw@sv`<1ddU5?Y0{XAo zKerTM7>w3aBJmti)7N6MyT^$I)nfGLE5GcXT>3`n&W(%sSV2829)rDKq+9wMlGe|n z&orRV=Bb4slI?@)NqtuR8=Mp%p3I7CU}q-wHTr1l&$ox#qYc6#9*FodqIS$T__<`; z4PKOk@5U@YT)>tiQq>FY;%&a=Lj^^1&lCH};>A!{W$s489J@7WTY>9~aYD(r{GY$d z1a&(iMzh64j^`M5y(-Uha08Q7*ax?B9-aoSF&~caN|F5buQj0Exm6dyW-7}*G#&S2 z{X!YoBUocs_gbqt?@< zBaTQ24drUCNzI6CFwgA)W^CY3{k4&n-Sp}sZ;e?_!n)^Roi=-IM zvr4#h810xR;)SAr1}uXIzIdlY7P$J{_1iT2D{XweBtPnkkcL%?d{XIU6%8IQO?Yx= zNmcR~kx=cL!j2~55RU{9mp{!`jzlq=NxUlpr!kBCU_)#!0EtZk3#KxZ8=Axq{ASqj z7dQpSWFOy~J(?hy4g9pb9LN|pjoR53gTk_j8xFQq>WY!92~wJiMt$Q1vmZAsQT>Fm>8A9! z+0azDy=Q`6uPnTzS}^mQ!=>;E?0vEh>y6^_skgzwIs9r-rTbfF@ zaC??QqIX1381+NUT;px=jA=FfmZZ)J7HeLQSMHFwhQa){Wfk~jp~9O}>q7BF(p#PZ zFVT%}7xWHSA3mdzCAbJq-f}}l^3&nZJg*c^=d;74&UlBimSSo(pb`ne;#H@rU_J;XTWYq$jePOj(wdiCorzF577-wm(&x}Egwy--rq6Niuv$o zq399$x^$Jwmd=Q8ir@m}mFTT5+AFs156HT;gNLzDrK#16G?eX!2PsR9pt9uIISHGh zI95YckyGI7Uw--WR(_6U%DkSYFNTxzPdK9{6ijS?0Q!n~%UFw1tCeY!h;CD~v^0*| zneoVmd5q2!OD;kcWZP6Ku)oi=DanNPc|*$=+j?{x3)B){RyXX&E7u&D8*l$zkW_|1 zdxQi`tz8@<(uz*ky!_ATv)aZx&mZV?M5!vM7Ua&eOcm=^A7wu=z@&O2>UP)M1)yr3 zJ#+|`0#x{vVfrOJy4xbhX~#X!U1&`|AT)W9wT$!fyOj>VEZT}ysQ?Y8t* z&tONN*D}N3{ZtI@DoTI6Y^cBR(PaFbu7}WM0&KB%@7{|6$Rg}l3c0sOc=N- zy{Kp2@(%ml)o)WzbfSKsC5sIwjtzkgz`!fiIFxA&j@xz}>VN9suoAB^W z;KQ@=Cn07zJy#jdhyEJjjD@cc!1tQ>X1VKtv0>4NNwQ%TlXXX18a;==kEPT?7#HCu z48ZN7~DicbQIRs=Drf@JfI&t6)SbTn;tOboX zZCLCw3C+@xnF42We>6iyFkrCKH#|gL_xrhI=KzxTfjD90$9vc?# zz**;>#Hrvl#G0HuDHOSO2#_c(bX6dpKQp1A@u2y=z^_zkiQa|81aK%0W=(!>GS?X# z%gH8UmWM!6&eUr)8moC>3FMsWt8c1CZ%iFVQ8HP;=&#r{cUTG;TSNYis?WlMbHvD6 zF%IUP6)Q718PVSg!)PUIus=PG95{>=0>^?DsaVL5;_c~Sn%fG;GxS!i;iJ0vwfn~b zpHY)!n<5Us$rv2P0+fyG76Dk+^&DwlT$x35Pg@+mgblyM_NH;IaS0n)5n04EZeqUh zoXo9Rq~}7zmOMUlT#((|%NON<3Uv*Q zeFin<+TJ^95?iR0cu)dU+mA3qYA6|#gz|D&B6j98OeJhhfM(t|fsFxQsJrm!Y1X46 zmZ-*VWq#>ElpQ*Bihe;E4Ul8pnNttIuxZY$57QSu6)8q2G~38CPi^|)(HJ;FlzM-m zSVDETaJ+%Alx5`#kL~jjk0_MeJi-!0$fIyQ8)s>8ms(CWN}W#`vyIV5e@8uuIJPVC zBkH)>7(3Pk_>;5^N1$r&S;edgd9D#n8eSXGUQZd);&LotAD6&69Zy^udrKx-Y~zNz?VJZk(Fnc9I@3TNngnV;YzwW_Xp2lA3BmG z5pY@L+KOsH@2;WSfU~Jm?^>be>;ZF=8JpOT* zlzZt5Jsv7VRqpbSRKpK|ar&%iX)!h``=j7!^C4nlX(uY8V{?I{hjy8Xwo1ncx0p(i z6H&>_?6o+Jtc-wU!+?xEy2T}Euxb|jn<|SFn~kkVb8tWv0W)vL(Ta4ke)xFbNwDjk zfmwbcpeRrlUUBcHwwJ~Z6-0K_`c-3_wz8?hvD`2M6i+ISvUVZ^ z*B)*nB_cKXqNfxGo6O{oR4x-IGX@{;fI|#%{pLU#{A@=A-qNEBpRy>(LrwA~ zt?fXL7kzm3UXdHGbBuc?%7hxvjqut|+_ zf&It21z1jOOuIxAew&(HiAFNpgY)r-w;eXp1#x>B zH%-==S$Vg`V){8H?{}w1#!lfQUPK4u2@n+Nn%*(?UFF5pC2(7NRP5)I=<&=|_+y-R z8oZh^74^1)9CdT44oLE_w4>_e%WsC!0oD&8Oq~-Hlw%Sx&Wgl|s%uD}QmY$NX$G2L z%u}jhYRHx_=5QbQ;aGNSx{N(WX8bpVLZ;`2w4V61>R z%@`c8(uE&L@)u{qhc9M)&*RL@ymY9iGugA}+uIfNe=f428;VM+Z&+}TrT?;6z!0Sw zK-X-DDshmj`w{8g=o3Dnp;5Zo&{FMD?1_m@9)QUY!c=d9L~Pebj}`z+bD0S(4iEUX zXUs8}nhzmgV|i@OQ+lJ6Gi~tC6Ag7&`2xbr4Ru4b{y82}GC1=!6O9Sk7248ZN8h)p zqoQhD$s%yE?I(M*>VGx6Zrb$uEiP#{hS0|LPs#jA*=*HuL!rDWK4hVw^M#{Z3raeZTGUf-O% zuXzH2e+{AANa7q;(>!ve=LMUM1x>tBIpX<#D0|#^Hbi_Li$ATWkjnDQ^o99wZS&sF zZHBji(ng=6(yuDIBRH$?CN0F(KQlr-F!x3+@}ZU;H{aA?>GiGvg?zU$WnUq3M_N(1bI6 zpff~2-1E{&XZ8X3RKz#(6Lo9WZ9~#g{Y>|5=e^l-mHW*- zgd*8&|7$-$432Bg^uI=iVuii_yA zIrzeLH$?FmaE9}MHm^`d=`A*IeKrXF!RJN8ze=+TSOwS z;#^8lC!AUp*TfKCl{FfqLcRZ4jj4;;rw7f>a3CY?q<$u3IJ0P@KF&-qd2z_<-EM6g zt=r=*ZfO(%UYtwZ)ILE;i>&J6X?h$k7JW_Ds>o5Gpk*l!P72Foz-vrPCAX+-vzuNQ z?^&z#8l`OFY2s@RJZcaZBWbd8<6_^Mb}1bh+ipX5#>81i5?}w+Gdo!qTK>is3bQ%@~dL?7ax^u@KKWk6LJW9ac%LO_MVh5)oaCyF}7nr;A zFkT7>J$h|j@?UICHwryQA<>s5b#_n}O$zJVJ)01mzcSPLsGe&{f@7^SYlkSxHmXNxgR~0lx_g$^vbzDQF&E2RenHj`5leNinDxwDt}2nbCzr7 zHe^n?OS_g@ZoiWbTLHMqFXE1nxI;W#a;n z*i=9(b~pvP;~1>oQ5FfD$L2$RiFQrWkv3`Lk^+e)+((isVY}!^-k82B=&1M)Ok8vd zmGU`_FiiC=TEmhN()hAU2T#+#$53HYuz@ybwwx8tvUlN=yxzoO6;$E*oSMjI)Jbz! z|5Jw=uCKH+3R-2Ik7oFiU9?=0bG8HbGGN;c*H2_T*N?<2;OZ{yr9>~{;r}nPgQ1dc4)90Q37|bST>7KWeoB|U2`^_2UwZ-X^2mI_) zBXir~!3%jn5aLHa-m~p*RheEDX2l@{7+&hn=Z&sn8_ZFx?VOacIB3*HeTp|gn?@HT zqp9{wZ^VTp#E70GDe#{RLI>?%c{TN-hQdff_|lLn+5(H`e0UT#`ed4~{#b95e^C1l z{j|nCp zOltW<&Ty{s`+KYE8h%pY30-F3X~`qRLTve+*wLBJ;!$(QcL2T#VYND(;3!7+K*IM9 z{+YDa@beYNw)(GB2TU{yyrBt3&FP+oLDFvGdr1y2Cz?;1{Cf=~p$+!&KSz%4N+qv% zuRRz1|LG3F8~*;znnRIaliK1-nMxNQoYmB3N~@*dP>nV@Tr8Z-sbi@C$qkrVV4znqZm3BWN2C|cQL9%x46j9xF@PHG#Z1< z6iU}dakCpzdTeCMsWet(=Ywl2x18KKj4m&KY1hwL%PWA|ljc0(w=rz}kZ;ap z-;Q$dS2KGs*q!bC&-#mjeA}9?=9QBuUqIGGj;owAqBU)p3VDr=xWwy+=xNL-QHr6x z?AHv@!VY=1u<;KbdL^bzob8=&n<+<6G}JEpy1Ak_)|~wiNO9S7sG5=+uziDTn>{foO|Zcb2pNodrGn$^-qEw za;yy*vk8u1m-#5up0?94D6!1#R$*bT^W73TALrt$y&A_@N}Gx0-w#k@JWZ^bP-wNOqbpK>)~trElCYdxm#*wUw!hAONuS4V(djv++0ZX z%9ijozq2zGS#aFWo-Ziuc1-*i#nQ^IaP;Dlv!aktQ}01bxvX^CQXn7BvZsKN+9e+w zxnX7pOVGj3$~rb1C6QIf6Nu4=O;bubIpJSVEAq=Og&JUtfm!;zqI<_ zn5uJ3C?tuww3a(Na#ph|cH84sjl-dHHCp`QX8R(O5rv>N zLPO_&Lnx}G=&=I){~h-qtb zY2Fuh_`T-^O!iEl&J>*)%v8Hvo5syK^v5@n8aDULyM(I6klt!$O+3BvY!y+SWo<-M z-$_tXC|DDid+@7OuA_OTN)|7@U>6opqiv>rl~V9^E9f%OR}lT6gJd<~;-(Crt%ka3 zl9*NEBoKU?iQaU`WQMh1Au4j%$f%a;Uqm_kxvHQG5M7b@offy-m6cv);YH)RnE}7z zS5>H^4em6LW7TA9P@2iDx#8GveO#9w{n~a_GI~Wc&{bjikiJLXhY-@4nP^v)68!6S zGY7g-@MK!CKGc(zMux1|N#Td&M{k0FlK{Rj7B5cbF$5b+OLmLRm9UnmdV-#YLqs^A z4uZXbnH%RN45fsRq0h=@N_KLCoYxO>mEnw*qPH_&XH-BABiGVhD)x0MVC*l>KCZdO z0caLKzI^%^%6L>0GnjN7Y&hO-r=v+KSVo8}2gQ(%{Yy|x6)G6sBvC{ZsvDt3fc&R0 z2@zH(o2$jZ?Ql&#bnH2PR5bV?KG&(lU?or=AgXrri)Ql|(A(%!??NDs{&Jt>aJ&Ak zFG{CqQ-eBrUM-k!6}+o8a;4D#r$C9<1bcGhA3s5%-JmbN zidU>1L~9M;yA*Fk6;=Hn{PDVgoAzw?y?noU)L8c!#ALO*!*cYmP$CR6b;XZb4jlT; zK;Sz9>Krmp7qw{EassbANwpGTRJWs6@{RWbxw1b^Pf*1nyBBMr`c{th=<@I$j!IKu zEYwFY!}9VBN6j6fm3J}0N_SWJjAQE#Kp-Z=W-&irTA}u?cZd9#xN{~G1|}C( zrM>5G5)2JbGq{#LUo|j!;{?N~s;PY=keO;}JAGtx);mR*biK=;PvRvjYKMb7;yR1? z^W#&8tlUb#>fiR1H36Bw@F+?wYhBoU|1?HH2ipyk*yD3|%A*Api}+JPI>q1Ros=Ks zQ1x6_;8z{pT;rR&ARL-ep3M}73Ug0~ki}vA))+#qi8`d9228_w^!z;oW?N%pV2Y-E zj-wmbumjXH%?9&r8O_T9pan}~FQ3^|&rasP^Zt=q0V*HoJt<^d&HxcwrzC+`?`Xk9+9u}`t z(;Z>z$x}2lNxU~L;2|`_KkAtU9BN7yi)T2j1lyI^#5SlS{nMcGOFx#8ICsCXO50FZ zGJ8Iq$AZN?Befgngi+PpbL>R_2^tniVLl%5=XnYCa)?ML+@$Q(n=zMBQk>|o!y(w~ z8WZqKm8d9bX4o|0k<>hb4Vsw|EH6h&Rd53%ETnpw_o?jHFxWh}7tzQ9r~a$FPQ;Mk zV6!j$o#CY(bF%VWtEoPyiUS=HoLbXko>Cr<4`w0UpbCmQeftT64~`a*AkLv>us%`c z&V`LeXJ*Ake#O^UuMDr#i{)4t3-HD~RxoDs(+`;@dAgVH1`3p848x_yzN6+mPq5w& zkv|WQ^qm#kUzKej>W?5mj%kD`X=02~F5d-&K6-Km*MT}+Za7#uDhe-L^@SGQH~7vR zkFZDj8V@ODq$D>ce6LOp);iW~d{=8QIyUp$>9HTB!&>RVbxYl} zP-xD`(2LLqXI3^5PtMi8B8|QjsGUh?X7zGsNy%t_s2C1~4Vs5GVQPxb{gNOmUIJe2Gf@Y?|@qRO9Zw-WBo)NfsoC$C0 z2j{r`n0ee|-%GKEMp>Vn6ILh88kRCvu!1j3FOYccc*1jpKaic-C-Hlx-Jqigc942r zq*1of$wJ`=tF9!la-Ler6M=5gT)aEO#+*Pe_1&@5&eS9IL+(2DKBXvLz(=O@|v@7bL9lu#;i#&XF-s? z>n*9hnp}lE_qGGW4qfedVD4e8JPxCbi$unAJm2sU7xC`G)n?9s=LUa2$?plS#ykn_*=bP3hk}Ms5bBRdK7{Ba@3<;oGJR$@T5>OY<=zBVVD_4 zyrm#l5{yJ&IV1SXzbg$Xhli67i>&Jo_3^2(O!1O$6MuVj_S=)p-Q0y<2){d9n#GI^ zeSc`Xe1ke@t-Ifx33q}D4-)-|#?vUDXM+zEyAF?IV7*xxYa>qPgu4lM4kX{8@dik* z9B_adk|J-@c=VQG{fRTl-&g8^9uQMZNZns1B_&Rx{cbbFRyxo%xu6UMi@ckop6{dZ zC)wzMHqx9Ln`RzciKJ7wv%(<`IFi^T98e?G1aSs3?mV|-oA?PZ#qHk{sT=YSTaIdq{54A|(* zb~9jST{Xvyzka+hbCX*`Rc$j5@tgQo0oIIpODL0~vuH{;zg`GH`t>@^X@e{0)dX0o zTw?$1*makgOS3Pt6v}RttHG3VvEZ=aOGsI(+3@S?IzJ@iw){lx2p{xQk>wp4QAqnz z$K#bd!?(t&eT6-Wz1aM}B0@c0w;k=J6#HrJo>HDmxBQqf*&DBItyS5>GnSYsco@N+?{mhv#ob7Wc`KZ ze&b^CY~vOR)$Syz+#no?{8ma@1N;}QjVIaMzK^}A!#z))A_|An+l+iG{)k}C@rD0G%B#SB{Q8$qi zZj)Pj{0y%$?-C(}S6`4DM5>2`R>>I;Hv;jJZk+9sjCMv7kYTfQJYbgb!M!<8?<|y7 zbN~=1K%FvGBa?VXqj^p0?)L)(zlS0y`{as+NXY3Q8Bf^!m1{W3fQ3L9BmN?pxhOS_ zF2}K%@N=!Pfs>R9w8+uEL>CX=3cJ+ewAS6GY8++^tlADkh*gP?0khS6Oqb#+Vi$2s zMlgL~bJdQf#(Mb!^E#5l?JAO(g%kWiBR8zah+=7nD@UpzbIwED1Xz`SUSeS8iUUb1 z0c@d_)?5W^LsL2kXlp=}%1&o=wCYsmd6~&<*XxULaM5HTbcI~aCFU-A>i9Yn?G*0r zq4cVyqa#3*(39&>jHr&bTNWOv+!?m?;7v7EpgD7<>yz-v*N(2?{&Avp%J?5`>gUKU z%hUdL3Vw@jpm-Kqv&_~s8Ty^<-BQlK?r<-6EJ81*!1EOFxui;^U7*f7OCLFN?ZgGs zz*S-+og|F#tVzyOW-Xlcl%?`CX?Z?P|NQq?odC3DlNv}9uT2Z$-=|bmJPi`TyS2T& z4)pkB3MrY4TUWvUty2p<($%5rs6jfa8vB-Qm@9gDO3TxMxRag4VNFTrPp^qdl$Wq7 zJX#OKadq?nA85&Nb)mvQ94S@KG0by$bp(FHp}wO;Q0T7j*TIB)R2ey*pxIq0o1DtV z9+VpwttMYhdN~1T4_8!#7{>W_7Kwva<~$sTK{Oni3K3}vf$j^Hld#CgHK>ZWwK#nu zdOyR`tqy%iF4H4NmA%6CZO$gUrZ&!+yjkL25`_W(W>-U6uh;0efH&WOXB5bK!0nM! z;O+2&(aTFMa5uKCGo zrL=FRpd#}Xx6;LRi_*HTj74l+$KZ%#7MdvNwdajP`*n((40TOinZy&R_Lw41P$EK4 zn6^hUjRtn_R=N<*LK0?;OvFns&GpJo?F&EwZvf?tZ6sRaWT*JDQsd&pmNN}``GSWZ zf6^v|8iRU@yXz5RB_J^E*v9Bkf*qwV`o-VgJCTk+l5*#2l=Gp-``h~*G^KBf0}eW^ zSC5hwRt;6h6M60rnmVgFg3FEEkAdmWw<>b@Q-i@RII@P%g8p*!#39FQY~XJg9ECui z$x;(~@nB9{2|RZu?041VBDvDCRjS468?Cm|iZl5x0K2Z0jYspdFS)RJ$=%%{{T=I! zbD%n@7Q~C^USw-|&K6wU0?tj}5XiViPVhx?Do9EYY#G<24z*J4^bj#mah*LVY`jsi z7i3QQh>T>LZk3u>dNg1W7V-A7Wd{t}_5Sf0tq*oX#^@yOeNwQDqZIq@uGZ2jpQ9!l z7NQGjhLj z!f1mBB7bPl*o?MkO6lM<&oM;)Vm!f84P2;Wbx-x?c${U7(94n*KZa=~7_f0Kr$}vU zgvGB$fV)T4STvrMNo-*65xvs5_kKEnJ;pCjPGXKssX7%bCFhl~WTrLHW-xCoQred0 zFiKlH59X*Vhum+M`Z%^i!hoC!*;P(0U6+$~E!~u}zqB8QG~4mzt-RUPm<1y|L@fQ4 zNcrJvkx!`*UpZT(_&y^g<D8>~2 zCZBa~shuyM+5|WWj7w~{MU*4^ zsLk0+s^?UQ%5+;-jB8OJf0RE=D~1(*!>%q_RGH}!DGVu)c-kINq=H6uAi zSxIOS&Pqd4PNm|%Y|8fe7qagpEQHu{hu1^*H^-JKf()Mo1`VejmEFZBFTF;dxIWWWckp}H zRQflSMfEJavVhLXj5?pUMf-cw?;g^GmT7+JFw1!;jujtK8YBLH3&< z?fti3$P#6480~8Y$`TCY){mIeb`REIkiDPxF?-rJT$=o4aTP|JrTdI%&Mkb|dDd!B z$+j5_ZLQ)9?GF~9uA4)*GaRjg;v0q$ zEP&Q{mAa#{*(nc39YB-Mz^`Q>iOr3;^pVw!%*%t2U2GO!7>d`;plGV9v>)X@06M~? zK{damnx)Kq1NyZ%uDN$=N^-y3Eh6-nM}k`U+2+&}XAmFf6J_9XffE_M&Rg}p3AtoR zIW22Zj_59EO6#F&fPNX&(-$c>a*=_j)0s&+mYl# z?Dwf>!=G9&dsK&~DDA$_B^(-kQd&3!u>sUNZ-biD|*?|SCQSlHB$Ct zlrV%&D9~s??7B5tUPWY;w?*G`Cr4<+2KyYNFM^`E$Y9L=Co;Vp(P<|VfF5mCf|n2* z0@=tFYh>PFh{;Q$(0pGYCwJdO;KUGzIA<{+m4@ovh`r1+Ot&C~9hR{t)jC}GEd4w8 zBF1sHb8YJ~aCCI^3(;Y0)kKEhUU6-Ai)NmZPT|T2TDjnLwypl#_$3U9Urqbcgy7Pg zAtx^#1&y)F2$POhH}%!;04j9!kEr?`IPJP@g=eyS`KqGc*RTDfVWbY70BPH*pQU$= z?zyc07ts1qM?u#_iss+_j%=Oa>;v9EIoNt_8%`5ALxyVtNuGQQ2v)lFD^1u}N(U#C zO=JU~MPZLp$N0=(#^z-KgeJZj0!X*RN2*d^>hBxqyOMutYp5wXfL7ddeu}T)QS`UT z6Q?IA?p8iSS0=k+dA6&={x!C~Ph4qtUJqY&PSqm4+)CZqu%5l0%7aQ?s>FWJcC^{M zZ2bxA#C2*7gZ4NSgVP z#McZ-xsxiVl(NS)?`a;fX^Fx%+}>Y>QF3Z$C|ajjhlz-drmJ7DVwv-dplk3GID{!t&B~Kd$VA7QyzJ0PB9N-B(DL zUrR#24XDV=>dljoyZCr~e^L~|8t}wpE=xUA@xZ)-)gV;VAjjFKdI0=vL(M+#(y5iI zlHC7n?Xuk`1MR6@Bk|U>W`e73!#**YndS_i&;?xo*5h;*csT43qw_3HqS@B^AkgUz z=+Jk6W$ha|djHVuVJ&zrUp4WmQmsU9_|wZ-p$)IAtgWeS?&5%SGoQuiiQ{wrH#Yx{ zX_rG{g^|O@z(KQJsxxM#)2gqO=jPwFWd5l~k$(4OChxgNwl7(7=P%b0Ra*)_Z*u(I z6E`I99{UZ_t#P+aN0e^4YJ)r-Jaq#>K;WJiGkrT9V#g<6H9*fY=GuTY1T+$JmCaYJ z+r`!FST9{EeC_G`NULRGNX+3OF)_9}XQwl@t0XAvA1}`M+KCFM#PlTg6p3@xnnN{E z@SUxS*2HqMGyD0_9#qy_5~#59g=k-^2NR{!F!kG@fem3v?0GMRb|CD#u`N3UAXUA( zwLdwYCHlqOR|+_Z%(cRzn=}{l+8oe+o_igADNI=mphw3!7zXb^ay&t3;14wdVQGTz z($Fj_bOg0{Qe|*cwiu$PWIes~ex(HyN^jG5eGO9}D1Tkl<$w0sRk0U4K9i?;Z-4u; zw=54kRS@G1HvTOw_37jx#ZPe$U=);s(?*F$OzAmid3|`O=W^<*Qs?TkSV~V~u;jd5 zsB_Da!U*g*9K>hc3YV?uh2U9$rC?Wr<`}h z(dw@QhmMLTa!e!{w;&YWD`vfwD6BaArBuOA62&mH`{tb$QYY;HqwAcaGl{x19NQh+ zwr$&XI<}oJPIuC=ZQFLowmP=?#hCnS*36olxv0Cks9m+sIlJ~b@B2s&b2P>PT3H3E z^I>9M4`z2@B!4DD-!|BM;ZBP?p?^f7iijk(7a8*IK!SWsv=$sGIZ1zdZkum&*zztN zFx4QkCOKxOZ%jMB@H+}3zMQIJW|Dja{o^5`;mfJ~JimTj&Qt(e%m`c#wPrp{Q3h<3 ze!(U{tP~~scbB@GPwYoLqcd>>2m~L=dL}F#$2lHXV=XtTJ#aBCG=u~LKjMRwZcm52 zaV3#-oGrrQ75~of5m4=?!!fn-a1=KLAmrXrEu8Rlf6}Itb$J+hl$>`9_Pk%gtF2)y zox$ZAn#7hc8+bpq(7^3(c(D4tm7HW_w#~`|$;^nLoz>TrzN zw{*`my96!CBLBX5F$Y)alGW$NY~gD0b0|d2O;Pd#O}>2BYxXrh^s7zTVC9}_`|pE5 zpvqT%z(=YWas3mKt@keyF`zLTeMmPcKhaii%sIp3oD+U1NIXQ-0Gp$CcMuuNOs~3G z1WXs$>ioyoDlRb~IRb27^}Zj2dE|*7nHl5#Sc1+lqDeqk1z=3~X&+kGZOZ=j7%UVZ z{`9GBxcH@;UG%jH{R&7&emK{7A@}^;gj{Ew{c6!q@BM-Bj#pRwMUyf9rJytLg^1np z6?(Dy(qH2ZS?(R1%zW~pTN_K&-2ajt)L)#6^{w{B? zmbvnuZ}YPcVwcij|Da1>9IsDeE|A-Ley#%MgG_X>r)_(RD&cON%TXM z>lu)~yEH^%4V8IM)8Co_sSDyl%izZk3{)|qdswi@?z}3GxtfYj%feJycqfM?&*i&^ z4D@zN21@jwvTQtcx^8N_FmnnpM|+;Z@&)NqESe!3OTYL6_x^4rxr4icb1kz{z`&OL zq666K=&Q+)sQc%2zQNRqg-_CU+sV^-q9fwg8VhXt;s>_7m@_Q7N>~_6ym}x8q~dla zkh62LG!OojIPzH(JcOAPj-L{V{2G*o)pVg?8!=f5Yo^xI`IGc`m=m3Sh(d2>#a%hC zebs3PIwS;*)McFoR!fsn#|qCxb-H=VuK|!b|4VNN zuN)_hp`X>36)R9WijgsF5X{G`TMdv6HB4Id?J~l~?y3mhRPFWP=DtYkRE1+L9v$i{ zgd_c_sVq38N<18a-;=}#{9!#LecGdIE^ZRT95W0@%q6+9!O4N@yoha4QyG1{)1d9Y zTl34uzvbIvArynqA>|UIe zhV&MuGL-gDrNvg@wLupQZQ8?GYh1dy(1qw+Q5kjE1C`arvMg<>x@n}9OAUBcrI=qj z{2R*{`zwNACk^jSS!DoMCU5j3uufvrxcFE`X!Xi8nFJO?5Iu3?&0f``W3GH7xKMC_ zsc?7a>?H5%F6I)R?oU4%E;N7-XI(5Ih8EXyn7BX|v8?u&A!V2^(a7w*uBl#n1uWsf znOu>$T_9e+^o20HAn27N97eG-#L&=99w+H}PVf;JF6Xw!In0Q^ZBIo?8^XM&t0$L^ z+3go`v@uz{gR2?$8SXli&GGnbS@@j|OVW5BZm-$y(!Bx|j`XC4US}mGo^qyECf#^CO^bpq_O*`+bP4PAb?B{LK!u=A z@caCOB0gml@Q0~%Dxs=SeFzCVwWEb(YofbAtvl51k$(arLQbyi`d`Q+kw8a%S3k(N zqsSYDH(@eoauaf#uvB& zzz%l_S~qe#(yGW6MA8h5%TA_h-TZsSABB#`w0q>zl(O807^wu1zmdD%NP3UU`PxNo zW^O*EuTcOLZjjraf4B!4OZG!eISg8%y8BU{ZlqwT(zpUj11t0+`I6Iub;XR;L%--& z`?H%_LUAkRG`s_W8=2`oSm0X6r3qkukW$s$H1r}O2Q=cW&*gEX>9{nBwLi$$YSRzS zU@R5;_&hV&DtlTn3F=vx;$MT(&ry`oMlo*5!DRq`IVfgc;y*&&cw!)bQGEwBRfKX) zBkyk=ZIaWYiCThG=f2X61;R~HfP4X4Vxl@0t;Qy9fTY%Jm^R?M5F@9iilZ2HFX@*|ChEmI#Fe5t`o$1c#3(Bwz@9x ziWgvdNQ_)wVgiAXqT5)_aApL#sW2Zh;}LyEX^a9AtX_WwjPpW=Oi*`+}c69 z?Y2y)Vkq;rSE;KEHjBLhU#7NqPl|ztizsl$dGfgJ9H??~W;lbu*I(9bS9!ZLsbOsl zrYkW9qLhme82|;331^rFT|&LyQzv31CIL?S>k{UF;+sBIKQ@x$GHv(kcKy}4BULfI zA+a5!V=(I%(WUyl6k4V9z36bYJ=w5Gv~UaGx5LM@as0BS1}siuuJiJ4@lxvSDF0Gn>g)vz_l%jyk5D!4_hVK`2fZcI7mB^hFHWnzn;0+8@kn~^Fv*+< zLPJXIiu{O;`Uwd4&z-)@Bi$hIl8+gC8msx+tpKw<41zPON4euimrB5nDWg#FD=E^# zfy2?Va73nKb+Qs)wvBbO4{F1u9!T=|8|oM9dki-=sExJ%7=V?mO(A37 zEA1h!!uAwJ15D94;y+W}NO#2{mU~DC(zEA@e2G3Th*y*lT`rY9PDkot4SAwG)f%F$ zika~M$h^$V*#3my-lU2tu?$TEVw_pjeDiuEb;-n~sGj*enb^dNi#v42j4(?sJA8Bh zf8_e2skp>mSaBCfK^+zVtatc6*US#F0$9R^Q|iJH2tiJE22yRg8??(B`GlpL`}L&C zCvIR1DcFbra&YSe1aezn@^+swBt%^~s_G&WfwdY>MZbzAn?g^y2kmblY8qiksb{b= zqwX(fa8DRNPZ}h*Lzaa|p8DY?S`4`E&LY=?mv9)78dC5_a0E{Pld&nGIwc2cbbk&s z`{9L(M~-bJzv3SXvlc}2D4+02Et;adeFB6cEfDi6L9aFr@25N8RJ2e>8QYuhCF+n} zxXUYvuIlOEQ}G}5k70}@@?E1y8yNYB+2Ef1o6C2@{s5U;uoROUkVdl-kP?~?#-9&X znV#iq;{fIlYTUnfle_c=Xo@JfPdlnQ87x5Vh6`37152&6Cbg?d%%vk+LtF zIwe1_a-wY*`8v6*KaUvlp-ZBPk4B5J%{#NbjIN}zO=%jNFg@ygoNG0IFc!DSrFcE5 z8EokG1_-#G%^3Afb@{6GSu##&J+#ur(zd3qSm%*4SHleff$}TpT*%YaucHz*bCJJ` z>8JY7*L+gvjK}|J+%S5qcAJ??ILq|#LuLK#v4(dGJ!WAa{k~+yS|g%B{vT9U|x-tVUU;hNT!%GMCLU zE|sbnSOQ)F*n+KM#&+yeze>fF9kiz5=0;^YJX6(1u7LK)S4v7T{pUx-Ax&gbwozgI z2isg-@bDe^8KUK+!8VTjCE)a}=}KF7oxqHz6P3bp&0~A`&}G-1V){oDV$q~D2q$$R zSn|I1?F#q!*5qPmqU_n50fak?(qI;@&qP?YO_Y=-z-_zjAiKmR-voYYL(#>($X&v6 z@Y)y84{14_-@2-Ks1>Y{o5TvNGy8aK4cW`Sqfh?SjTljlShOqAy_)sR-lMqAZG}<& zPtsOyhZWp@yZfk|pF6d%d4)eD+JKLxX1e_uw3m$BpK#JXm<(}XPh>MCx}><#B9i3y zTN9@O^t+fh2`j;x$Ez;tuIpTzwr?7H5QD`o*^7=V_zP{~9`Z(U^ZW`~=Ok~Lpp{X< z4OvkGGCmB&#pFQJAuqH1v*E^$VnO~_&IK;sl0%=h(#7MuBkRx{#>7|F?Lbhrqht~F zx^|Yg$<6sQ;ol^!Rcpq&hD8{;tTN2q5p(4;;Bh29P)QJ)#~fjo9J69F!9`Ccb zgm@F<_aIL!OziGRwXX7|tZI<%vCX`WXN4tEUJ2MpfxYk&Af`@`7GU|_Wawpo=9oY( zJUhRM@8z@*_FIELH3Ub(K6Va*#baQ*;!N?jU>G4uAqrtndEWPH(rNQ9)x81LR_l<7arUdMwyGLq5AwSgSByJ zf4tUGxyx*1PlK#(IS)g_+>LJsC6@Q4R#rA_CjN^k*!kBP-`5p!8ki{ zyCS}QCKK0bKMAqN3a{Kt8ZLul$yP>2OFaJ9Lh%MFu|hm8iN~&5B*yGmG1A*QPK6WS zE_kTuPiEu}=>Ula?s=T}Q@Jm1Cj0sc!3%)`LtHN1Leg5L4%sByk*_pbAa#64la##I zgqpf1>twa5^mb>O1D9;igKs?GSjWAgDXK8LhA}AB&4`-RA`X8$*ksIy<8XkI3E{$%6tw8o-W6uqXX^ zf{U?5IK`SF`e@y6D0_|NCNbHxBJ?KQr|)JesLR_c?=N>E`G*pk5c@O#?mmR15={6O z5j0_f*$r#^a(GnSgl_&pb`pU^;@^|`AG|c3cIr&J4QlGTeele-Jn*6Z%JlDoV2`s2 z(tr-rRW*sVoOKx)bvzQl+I!wZro(5A4eENL^S7a3#aj!q*R`GSc28@MGsq-|bP6ur#;6Dh8xY%ZVE{J46r}|3VCYkCEBE;Gd z6WT11(<5Vp+(v{8$UFzlIcguo z{y0*scE2oX<*SpAIogduPur7+=cV>Ng8Nef?=dav$hIm|s?hV;MSro2)iDm^C zPlHa&NB{v+>dI?Yg~?rtCBc*oW9q=D`{rMM+nvim)aQe|&_mJ!Y9fsp$wrr!5o1wT zNcVO@-!fNL?(?e~(j2;wxvZk_z!^YJm`pO?P{& z1=-PY_n)MH4-okOc2I#+F`VC-$-6WcUu|w4R5AmqW$E>YrVu<>#N~C!k=OZWua?9w z`*`YO+RN}Ly;x$n&4y)!MT@{GZ8c32I+{6BW8YPhnF;9W_c64Mr12pDc=P_q97r(L zS&;HJBd2$xSj%vGln+DabsHsb!QnPsn3CPll@h!-e&eemM?MxBD?d2u|0z1o&MkXj z&6oppgCLjaGwE711Pj`M4Wj97tN9Sm9zr@O&~tqiGdk8cE*0Oi^Zj7UK&vs%J{mpy zoYz@kd-6=P-0s9yVo;*TShN*Yv#w}rgD9K#s=_ZLUd}+9+6jQkuXd94P>0sv1mcK< zkYRmxQJr&twQQn1T>`jp&UT`E29j6euVew$e(Jt>&$^nGvF+xMM|gynzCp;4=9A{s zm10O^M4Iezh=RjYEBuc6e*ZL_0vSfmj4|tKLeW{jYiTY?axb#CN@+$yFyW;@d(U`% zP4b=}K0P#8LE~~Qn*lh|&_O5^RFugs%?wz1l9%(?T^VJbrRa^Oe5zj47M3=Ki&RX4`T-#gyo6$o%C3OGqUDZe%<(lE-n@idC;N zRj%v?i4#}+L5g6e$_rCfx_OIJ4QyD(roFZQxOI?=sf60w%o!RnA#S=BWe&76HJpQX zJQL~=(RnpKG6KCaEB{LMI#2P=vm5|`_jtnMLNjkTAWIP`r=1T++)X>$S~;H_jduO9 z*zovrQ(Tf0WKVN-M!@KZJ_=-stsFcl+!aMjwa@N9KlQ=-NFhaq8z!T}I)MElhDB&p zkbo7@T7wtzOLreRyz5ccg#%LTtc8eyCj$hx{J zrH^F$uI{ZYpda)b!zyySk}2xgpPWCQDJ`ko$fJrkIU`~Qi*#7MtF~gm3dc~Tpm@tX5NU-MkNsZm{QFo-#aUVQXlv$Q*~?M z18?5f)0w5JV-{;1e3U-b{>u<>lfAgoJRR>X&2G7 z;9N|OFU%xpI}y$;<)Da^5p#bw5LEOFWz$t1G@ zadDo7OnFaDFZ3Y5xg31-k04;s2-G9JdfODzP-98L?ka{@RW1cGe7}Ltl4E7$;dBRi ze0|-*o1D1Es6f^ntauOzk?4e;cKGtBPmm{d_sGVxdO)2r`5Xm6{8uz8$y8QFp4gVfb9@bS zEmPhW)M7JK=!(Du;OgW@$qF-I2Fsl?BcqTgs;OPXTOMl;fLg ziR0m7-=R#fgPF@E_HOvFc%ozJbDlZ~0|mDM3<>fd8){I)XZ zos4{QXf9#+72NuU$R~P-V@T1J6!}-|Q-wqYEp@_x60dgszal(;H=NU=P07FA2!l{x zBHl>*d^qqK)xrW7hhtGvL(HTQP!SSH>V1RUAETGbrFGjmfov%{PC~d)ekRdTD!2X4 zmo+db6p*k}K|jFNgCy8JUB(NGH(Ao|?yQ-iw55F$KC$@T~&)`FIz%lNhNm=v>o?YAz&YqCyCd#Dy91b{mt?F z6M@*hxEAgTfm;tIBE&LdoV-q?Ln+M7RI3)P?8GyP64SdN^EkW$0Aj|YlqHU(J<*XF z0z@d2Ri;^7sYmMjgRKbqlS~hRo2+{R0Ff0%-xI7uz6G;0X@xEcpV~t4R&OYoQM-}Z z?vvZLo(L1~noRqpUEcq*Zrd~k6Gv=;tdOcAh!lC`r|#f1IcqQyPD~MJ;+&gJFPZ2O zHmm9$by;WKU-2lnXjv=B{4#xhYj2`VNqP00#nh*2Fe;@pe6#fUD8yia1BtE!z>5vV zK|>?U6=qrIjlnQa^B9W!J^Yf`uT-+5If*-7PF)%8U-VmegJ8Xb5l+(BDYL&AGQg2l z)A%<>_U)Nu+~$G5o*S}=+m<%Pe$+JVNz!SxR{pE>>UbYFe@%w;?sTC+HJn-Me1IZ@ zn+q2A7`|N@WvBFnW=7z=)FxRC2h4E=V#S$lI9rn7UmFt!;~&u7RBFgejGq6*sR9=9GtFeA{6%xrL~$n=+puvmu&$e%Rs*7Eqp4BHD!t^m?_T*8GF5@m?pa z(`w0ysADF)d=153U4$W*0Vn}*-l*@>j@fgjm_LIVT2~T*g4RQC0J+H7m|gjp6tO^M zpUNY9I?S0iy69DuoIe1$9CJ;FCU$f`iV=g;+mx10KiqN5*v_IQDBU}Q2{;Mo=d zqI|o0yz=xNC11{x&s~O8``jPHU%@C7*W4y8i*#C3xl1k{V<;0KhdZb;#2moFrG&u| z^AE(=ufvyhx+S+Ez{Ig|B$$Bx?jeo!M(1UU3wcRE)|L;ggC|0%zTltK36HOz4?{zy zt99EIx9-N!&Tb~i#gf*lA+o-7dTQ<6-{0amxy?$G_K4^irzhFPx9%0HsqrP4aW98< zhF!{Wk#SE?%}b5J5IM7c^SP`Si_T?aZO@f6h0Z_RK5G&I;H_%KN@;BjU&42`EjX>w zgP^7E=t_)nV|MyMa*rukrAe=3`>4cXL&l5s0y1f0!BVUCRlXPThnp{PTdsnl$v7Fu z%trzv%tlr&2>1usY2Ti-m3CF=cG*sRq)c8WOu37ih@y z&o&sGWRcTHfJMtz*dPcDb^7yrTw|3yGV30^LmW9|+bC41$rvnHZCY}u?OBM`%Ym-k z8?2-QXS@w4Ew=aX*N<~Kk=l{^`J)wv#9(atum*+LiZNpSN+Rz*nFjd`U_yzAW`kNN&v`I8I9A5OMBv=v zPh0&}`H3jkJhj8A8#)YaLxmoF=_@4(mYTU z=uTNGVBTtVQYMbPXKo7C>cXp0jB=Vk-AtTlL?O#mGm+Wrs%7IiboFh2(NE|`UxwUDHG?+yJ?87H2X4|-7Mlem z%MEHOPX6u?X{KX9RN;VoE&gOQ%1M$4n>^xqIw7GQDiLQwx}!1zpF>qiG1fLQN$g&g^i(nJhZsvPVAi z+Kl3$>I;|UE0I8wG5BxU#>w?kn*W1uB z;7#E@!f!P<-~-_Qamv*5{Jyfi)${8V@Htg#^!~bW?)X0O9}WlQ&vmL+0KL%L!NvX9 zW$s?A_RK94@RsRTik;*0G*xE~@CL-%4!HjYZG2|V^nL;W_otS*U)#N(j@y2pGJe;Y zj=ir_(O*xAGd-_&m9=9lANS|ucJ{BgmAxMuj)GsDwC@K%SH7G#IZNr!({q4k??Uul z_GVmRJfF*>i&UHMfB=tF@26{ri-gwI_I9#b0o~=3+hOB3r()`BaJujZdQIu@NUagz zbFH;is^jGO-~R=c@VS1JU3JstEH=&;rQ`>y1vc>NOGUHOr zTj^cBZx0)_z0V_Gzfx=#<0iBV;R(T%0PhE;qR6j8TVhB1N^lY~;dcQt%KR+Kwt^-~oj6R+-0ST(FM~{_` zy>D+uAG@?43!dAbw^Y3^$3%cchtm?F&G)CTr_Sr%uUoF(&#BtpkE6$#ubXd~-q*fk z05C%6{jvAsL<;b}Pqh81{hg$pyzPr} zEtgRH7m!Qn^-ea&ag*tC@nPnEz3g=aX!w=c+kw2L#^=!c{(aM?fdQ}5=ERkw{k5L; zB}25|IZb!6fkR_V>*8{C&HXmJL+6a|>3MZ&z(ki1U$wxH%LITex>d)ayF_hT>%~8M zAxE9)P=95A*Z1??BB!t``F^`c3FEl8GOM;}>B_ruUa#i$V!Cu-Ls1WaW41NyP+`^6 ztatsPux(R$vQpkk*!{kii~D!P_`rGC>2yZ9egy0ti;mjN*PV!z1d_F}($zjbn1-L%0iwz8Btf3IiT>W!N`(vizMz5miO{XC_n zr1;`znRT6gJTEv?yKv<3S&60S>!aj&|Hszwt$MZwSmM#7I-RxI)AZ%`_yl;~bo^Xt zJ#%=g>^0nf9W)wFm^r;oHTryi>V18=4tTn6^qV&RhS8Y+TqM)=(ybde*snXcHW6Up ziL$tSP0_e&&&_YU^uSzDMV=l7`fckW@-Zm5=H$0mSB2-MhZbiEz{&exoRX=CUpu9=ls!QjT#FTh7s4CIM-QnjXGbzffo%@FSu9tgy7{{mqGKyrZ?TcG*}6fuYb_T#vv~ z2oT+P*5o*?x?nT8|4@?qQMpw0u{EQN{5!>^hm8Z=l70H#KfB&YD(j&!<9sdFKG)rg z&-dA0;qhtSYO!(sO()!l_lZi9>Z@|@MLQjk{rUR!lG*$6gYI7H>&QDHclrmEj?woz z^RfR_I_&s$x?%Knl-m0~TpRF`>G`753y`}zs7hbjYMc)A7XPHVir=1T!NtAay3V0; z;3iSe2W@Fi?+GoR#vR94+Vj6uOCznf;(a5*`&y{Imlq)wVC-j(%=-t?r$plo0D1f4 z-sp4Yy7vRf^mRuRa6jSrwITGr|DC~Ct=nG{T&>&hkH@{wSIAP4`1OxdYEfs?yj!np zbM1%Y^>fE-6d_Y>+=zFl7x73E!CsHPLYc32ul}4}nhl>@Z-Nu8ch@O1WR|bf7M;nB zA&<+BZ`IlDZR1jRe|)XiAa}z6?$gvCS`mkrYK@C?l0LPHOf zBwkQ%XEVq0eu+gZnpbOwG1oCmdB*j@g>wQm*ZyA~ z-oCsgkM{W=eV#tYKY0)X;|VfrLw?#4m=so?LT6Xg%)8l$lGQ-@}EYIT47qh2D?+co+YqCJ5x6W@~5}oOu5P$fbbwh4niBdc&b$s&BQCC zXyu+J-x_w0f5t_xqkVo8fa&Fghk zR4@ku0)F%cP{OGp1D+h~ri{m$oO`FkXd^bBQF!0M+(>RS1LX#78`bI!^suT}Cr>Y0 zMnAbOIzJ{-aMO;63U9Eq5i(EF3ZW}+gF7Tse|J64SR~tOHdf?O>6Ell^EUwsPA#6x zB%g4{MtTtvBZQ%Fac}seYf#`GsdY1-l=^w3IyvA0fQmZ%9-%jJ>`QMEQptlXk$)r3 zR$dd;RVI`KbT>qEz_6H+5x+?aW)kj&4-_pF9?lzr()Lp z@^8`mjbDSwve|;*J>rGHByPHHg>3x{6;$UnhL$Hu>7`0Jx_#Wz?mT|5bBXUT|2WJ( z^jAy~|7cl>xv>TX-SnG`TFppnkx{bUqE2ZnK=DI=Nj^CfvvNH83|_6umyqaL;?9Zu4s# zRX?hw^H&y%zDbehmcx|J_TD75#iFjiBA5~UGm5oPZF}Ta`4cS@hf+h2DyHo8YaG-Y zAStmArSR}o4xBk4r+g)m7RQC~5)9fVvgJ+TtMz=f*0Pmoj652JPw8v64}Z;>c{}?~ zN3a=kc<~;ZNJGY;t|WBE+eo$DPC$qpw33{B7AVaPJjm-0t+4$m(?@L5bJ1T!JZHSc5pPCQ1kYkJDV<{bc|Dn64QPPa3B3FpIZ^n`rFfQQ}Nb79m z9bm6eNjRD0yZhANAaVx3A~dyRJDb@6np!q*?X#}QkhPhU!mgU20v0tNfsxt|ND!m9B z{!IjbqOZ+u+;W-{Xi1=G+7>r%e&%_=4`UmtSQb$IEcw=WZsd64I%8uUfKOlLFUnI_ zhhCt*-8Zc&RBScP{B7rxgGki{@R{8pFxTV^$mVC-{1$3L>k2ZvJbOZwvaXgU!S!Ma z8FZKDP@Mz2mdy{`L6$>vk;+Z`9YL-mBc(xV4)T&LW#H;KXr6*KVe=3JeUlks5#S`M zKs}q!m+l&sq}X~m_9tQbs;vX>I0Te*q=KvrC0VvBeAv46eJJk*?QGb=LI&4ve{<M#A=_O7x_LmwQe^cwty=C*}U`;8rAb_8tkGsX6%lYY4u}_!*$mp+Wk_<->TiY$2 zQwYqOU|mx9?1tlsVzXU?c`MACHFh6g#^L`?B5HbC^EN7Cl25Nknv`TP0|^oGsx%Yl z^)do_ov;wbl44|}1tk*?>vh>1rMT;KH=IUtXjQhmss8&WtMHQDl7O@~W>ND~C-50uZYfayNkY;j#m z8;#kv2|G(d&ro7*tUE@hl5GxnE@=|wmkZ`oXK~WTiP#w#l=icX)$&E2gm1fkZP;Iu_6JDW)bot-U&)dIaFssMFb1sbi z>X#22GPq4?Jg0Y^#KAgGl;;Ra2g1pxr}VQGOmZPO6v?96db#oUKWkEHPpCOHtr&>S zGE5H+Rly&^9~%q$&>4pf`HMdO#;J<*{jQ%6fPkFki;#(#7pky=5+iOsTr+GLQDya% zg1l0YJ{)ZZ0c%2HRm6WnT!(?fOSanE3#4M;B4$kkokd>_YZ^x2y*BioPYag6Hrass z6hT!DLyd^8Ty6orMa2%w*SO`=tyKbE8RaV%lHzCl9YrsOp1+b%9ug2s(lv7oR5-Ly z06Z)u3+&m*m|Q+&FoiT{tb5gw)fO1v)<8s5Tkv0Xyln(d>6 z`E#>Yxv!jAy~M;CEl9i8Erxo3on$~xG;UwqVyg5(gBAMtvdI*n^A{0GpIMu)5aRfY zz8n_L!L0Uh3yx=e%OWUN=3#c|T>o18WMHR+x=Mtop0o~S{H01@*O)TThOu_}1F+Oi z3RnqdRU}Mi9VgyBt7)XER_0^NE9K@+l_)@qwcVGVST8r&vCUhoQI$Tug*wVjGz~PR zc`fS#E4XL&Q86pw7((d8r6Xu#XP%d)z=aQcGF(~yn);F<;h7@Dauoaoq@T?7Zr% z5V*?1&C)f7$`j5D;yjp&z;d*vaM+P*2{F2Uvch6?Xz}!uay?6Ifd*>IB+3G1K3UsC zuXIjSu)F$Lm%0$}=6s;*9V@V2&#WR+p>%7Jd5r>3D2Q(#(Wd7)IfPHJ0aNH+5e;e6 zmL7Pox-`W*T~PI#GkR>Ra}0AYm$~pMN+MH|?${md>gl9#p~vMu0+qaIi1)Od4VuiH z^fXf?G8D8E2i+0rY~W-QX+-4bRh>{iEAbs7`LJx(zJXf;nU@J0X{`_=KP)g4f@B{q zMq(jm)8jfVbtw5PB+>@+0IN||OqjdnJ*QsdWJxn?a2xy$$qQKRaVgN7?u9zm9RHTlSKl|_3Hl2|9*&sjidC0C%2?h+)Oh*o%AOvUJ+sou@ z|HV42LH-0~+5NPXt-(Z29j4JytG9}I`DOb#JqIgs1!QRcUc@0&ARygHvZ`Zbq1Xb zVk^EHAg+ub_nWc_DfRXdC?;qPqzys-Qx2L_zlfYT=6VE6;*m)lC3!e%s+YZF1iJWw zIjJW7(KllOFthG6Sfi*|)8p#66uABd2kakymL?9oiiP+ zCp@?a-kbpSo@8EeT@o)fJcMO)EIZ3omduYKhg~!?bL{4LH#wl%QJm2}7UVf* z7f7MrYrA38BLCrV84wTdQpl~zb&jvnl6Z7lWyo2aB`Q_1AxVEa3%|`s0G|hS-h@a7 zD*+S(kRyi}qxq=xD%+i3I!Dg8N*+ofahZ_+QW_wu858Afc)8LErgbcfTp~dnrRY>2 z59rwi6vmut*&m%c5ZM(ONf{mO;r=`=U2f|4>hL&+%b`5wh%euWdmM!)a4lcY*_h?d z*+aQ=RP|NmUf;3`AwnSl{zLyNzt#yDFU)}Fj~;1`v(!`Qpr^E)a=IpIs^W&N>0`>~;%0yJ zmsm8{){O@rN@-uh>9DmWgMt~-^7ZuF_Xn+KT#!{;IC@BUs7ULws}U2@5y(63ZVO7% zGs(cO7`h`Ae>hbMlVrA}A0WWxH~cdJl$32|lb#t{ld+%S(PadFlnpL1Iei(!66-*6 zu$V?IIfyB_v6(gxT!Q(i@)X~kp=dnbpL_}r-zd@uyuYEaVpaps&5xWua@8FX`xnH! zB|D%G5$SkJV|Y|3*32Qp`&JVa9^I{4I4RNFaJGk_lN0{vGL&gv8Bc}BGvciS#$TE3 z{`?!9T^=5_Hl`m#LY3!dM5gKQ9rzvnJI07l7}C;m{0BxHdT?6R_+TR#zMqpEb#CI% z;Bo)FFM~zH-!E}sUh>j3nCw7-%pyi8%0c&o2jp3Z;xd}G@g2!t3Zly9`gyKHr!$mz zhW=9bVa)IaPW`W}pdn}lkF6XO00jT`b4D__QsaY<=wXr#b1F-?wHZ^NA*cyglgRvK z!zr_^VqHP?goR3QLW`hTiRhaw{;#u@KfBGd3iAi_WNU4~f35pr@4308d2|2BAU5eA{&f$oJr{27To!J+5^jmQhqPGL5}{}zFS+_p zVeX7Mi9lp`F_EMfggQs`FMztBa!tN&(uFdxWPC?29v%|LKJdC?!LTCl%0{9JJt*Hp zvHZUPdq9N0x-1DHw>niXHKrKf%2qEH+@9!t!dQ@ue5FdD`mFV(F0E*dR=3pb^qpua zt6_277M%sF))ie-*Vne!j7+y9uq<6o9%(stZCh?73?l1iza|WWToMcOd0Qb)oxRjNbut08OJ_pu>^1hVT#LHjhDM6&ugjC zIW*Y9d`-U};c9*g06xNTKz8JRX~0mSpjK<<1c9yLWMA!N-JT~9l z!bc5Sy3M^c(oDd%VYs_`>jj=>>h+`!EdLGanC$~Atc)#wm^3OHL@I|FKCv1Xp;3&= zqEhGm7C2L7Ve^CN*h&L^Ws@O9h5^|-HRlqJVXst2s%8P+CV8b|5c4AWVCOx|Nn14*oDleUtl6_PM0H>}E%^O^F2vnJn+^Eob1 zK@3b;`r5*3{WMQM5cRZw-mK5fa_ULR&gDyZMaWCisiV(bauZNlV10@n%77qg2B<6} zeqQ$8U063#KwRNBnKKezc|hDk)T$NNL*z{F=jP|-RxccwIlNVFxW1Ld%XL%0MNpMj zok*!Xbjhe+lOPPbUh{}z=Uq7>Q@6m@q-#k!rewEN<{3jy2?Q*Ez)1BOz${eW2n>Zl zV@sy~%sxZ?DlJnA{|%j9ejZgH7+J?yl23tu?_gvh%RxEIg27l->Sr@O&D0NsoOQs~ zk zrgK^`=U~bZhmK%>S2^h*NOoy2nB(|;$`M}L2o{(`NC!aMLNy)^6a!~QMR{-V_m+ZG zWx4Ol#6k4}ToX-omzpDmQ>xAtbJf7WN0x~8C>(tNJb^80O|tqIm5ivZJ}3RF6iq4o zH{>HxqIb)%7&jS_+vML1tJi2%zPEz4KW6HG^_+?^-5lMmb}U@Wh5Yii z8Bmai+Plj_>$0xYi%wx+wndXz794SR5KSPiLRzQUn!<#IX;-j0AaYeRZ;(Hpms7o{ zBQsnv#X%JnZ=ttqhnNnQpS&HlEq3@$EGu8--5Pr4hDg|U+->4^+1{_Hex>4__GXnL zQC`eDykYTw^+;a5y8{lj>QXeO7>6$UF6T9a;+lBgt{XBW@w}jrov3k=!Cvd%J3|@Z zQr>B3BQ#c(`mH1QJWoHsOgGwEX*Xme(UNE=a|hO)j6O)XutL_fNbJslAvqY8g3?lW z$qJrJMPd8rX3p?VnC5F||A1;o@HzEkNNBX-9@EbS$~S9 zt5D5u3|_*ASRsKM3~n+}EhPvZvFj@uS=rEse@3%ii1NkN6%Z^X9@Q6?m=@xS=4gE@ z@FGR5ramVftb%hyoOxbRkkPwh?}P~bY;ukR*aDM{E>#}5L~67u-wQ3lr@8t8dMb0j zpj{$=NK|;Bf&4OnyQ314QkSiV0kfdg-O{V5JOP%rGIyd`q<5XRe+JBztznq5wQQIR zOSkU&Pysdc1_Kl}6o;Vt!7NiYB_sq^?<3q5+qYc5%~P{jNz5K|XrNWjb@4cYqT$KN zebwDT2pV=DGy;h8r ztF5=g$hKhy4|oaH$hOxuS8r9p=ec@4tKv-uPbt!_+T&G_S@v6eP&Y~;VMA{|888dj z(RO5c%>XUOh@XYfId{XpsaaE)t^E3A-_)#2M3x|R>c@e$3HspJ`le0fI7-hl#yBW{ zBXO{Lo<%0lnPeP2Fo58_2+k%&NG4^7P&g?MR4!`0oGS@1#7N#0*=A2v608X2Z(^#_ z0}0~`Azv3QG8w>HG)IOB+2$cE@?YDOCw{f^oEf0m;^&hj9auTrdbWDL?yZm~n!um5rjq9;&BU8$_xbF-}df%yAD#%J=O&OkSB&UXIZy1pUzX?D{d0Hyk5jsKkskc_W#z;y%`-SAhM^-U9zp-)e~;CaJ+Cm( zEjf~{A0F#Gzbo8CU|Uf|dpmiJz__vqsjS!t+>ceike3w5QcRFdqvG8ssK4{3{)tvs zI=$0fnLy<_DypK~J5n2M!(k2lUTihgvgM4X)cM6|_N;!oH&&F7pi%dKH)t8uaGp<$ z8u5Xr*$mgVn~9FIFSGR;{}Lqw;N956G7jZ}feGNPu#$|LcRFnk3sP#{UCV=A31()1 zdnTF%A6(2QIWVuJi3}Vv5G-Td73>botj|I|v!9nEH*AuF9JfmH!w7L06c=Etq)Dd! zERU{K?LRTCn@u%eTIdRY52^Oq6&IuWnync=6W6h7*%?)~GUwI^RJ>WoN-X5?w7wnGh38$8X{>xm@{ z1bt`2D%NDa6%y>QUXnzB6bs`H?gvOVc`jW9OM({s-Uw#F3m3b8sG5}Rry##R5xCPs zaPA0#r*(sGJOpqVC(Gxwn13dh7ZWo~rlrwfoeeDHgc~;a=jBF$epbG%=%O!rG3>T0 zpHo-AtQ{6#Bdw5q=;d=dBh3)NSU#szPf7fb)j zvD68xCK$EeCm>XTe$(~af+f{5$av$EmincSE^D~F-2AkEd3;z!EZ_a*-_d`IO5=kW z&{(~23?@i=2Z~A9(NGc7dz}#7O4`vKb;P&V?xO|(a>21M_FxZ1uN>eGlgiVfxVNq<}44yTBnnbkYCObi*xrPB0 zqtkg{ zDmtiq(l+ATP*!(1D;f!u*{C1&Jj!n+2%#LXxZos_t+j6C@r$;|VxcHWxC?!-j+PWI zqPzuIoBg~vn^AKPWA8N1U9Fm-qZ2+|#u!|%a_M`2)*n30(+_0X!4*KrcM~}(uUN1k z-kJk#k)YzR(J?VDD}|L=ENcKYZG|3$v$WZPT$mk!zEU{ggWH(%Nn(sJV(NDpvm>93 zpyDaBzNV)bYhA?eB_n08FnN%<`h<;K$!<2t*e=AUogi&Nn(lIO^ApBEZ0Jh)i2hNp zcm1q?AjIM70mgzV+p(7b>E)ADlvfm0aToMnJ|P|Gnicv3!Ql`ThNPGvahAmN0{ zRlr%4m(dn=EjAbr*KY;F(_H;Px*gmBx(q#7%HP>o#@>r!>yEw~1KO}2o-}7UY=d@Yz6@vw*V^eL zyiuE#%0xrS-X@+zp0n)oDtEI3e#bLYy{kA0PRC-A=q$T@W|dSU&hlt=Jc-V_zb7y7 z=c#%*t7OqC_HIo3E`UiWEL3v?Kr^$tjTq(AYX3z6jl0SOs>pva04(VYh)uMA=5{*4 zjr-VImGWe$94(?j$5h4sd&(r&m+j$fQM1KUp#FxEC;` zmAGANT@`CrNqD9*AYD7U-&IU~I}p*n3(7%B?Wb-_bvp;p{WpFcjBK0ud^>u=r&;VBe)ebsCgHjES5H?D$&%_2fH$YmvI=w53G4 zCFpWR13RwNJk$DKhfE6B-O&f<2$`%a9H1G9jUO>KX-Y?CG(`MxL}al;G-yv{DUk%h z9e|0yH`;1ayh#5U%5-61eQn*o%+kvVC5u+RlGEG;TOpmW%LbI}Oz0q|n##CXC=-ra zq6Xt1J@Cy0_A)MgTLD~uy~mw}=8i7{Qwm5#pG>4Su>=$7Nz5)TTuNG7Y^|Ye1uT=) z$*9nJMEN=C&3Swq$?Ef`8%-I{dUviHO#>Ovs+)hfb0gzfbN7Ir+c~(jCz{N6e%5-^JB3(p}T;Ib;xDsK! z@r_gU-shW~XTqA91WL|j*6bYX6vEw5lZ_22y9bnXSzJo#HkhVGiiYNlXXH=SqEXsx zW;G}v8PD`O31=yPV_Z=N@S*C%Q4*%S`90}iK;Y>8Zp{k<=d6Mqj8^;TtOhlQGY={} zjBML>dA7TdGK;b~Edl!V6=khTl#0vGZ#^%s@~96LwM0+x_p~maChOI-3fUq+wa-$% zciH@zR|Rnb6>-F9_Pke_Oy9~FeHxa zVxCWv_e@=%SaCaf&(zehXo|3?Eu0AeM1=cJTFU=-tWW=clpUO zHQiGo7ZXV$3D|w=C+}Hx`3y-Pk;zKWYoW=Nl=tO-fUCsGQp)gsd=okXOYd9R*GYXw zB4a6a@14|V8oEhbO&7%^E&C)UMD-8aBMy9)fcd?t&A}`PB|g>MD5MdXvL{0A12gJlK64X=9Mw>*|n zh13Xy9h~QLoaXlMa!wc{YHV>Ic~!`HbC;FFh;9NC;e*eDmtCah_oUH zSv#mUvW!#*?Q(piYA>;;NqS9GmtE{do7!PxcmPETMv*s(s2M1+*fx@Am@Kh5*wr@3 zvuHgi;RlOd!u}3jG@XI?&)J3=Pqm|xQG#@U}Hyr zBBi&KtY>7D@63ro9F8nJlOq*Iq*H0lnKMMoNq0u??5pB*XU<+Zsr`|t<1Ai>=^BM9 zEQ8qm$n#-dY%ovSkGptoU4f8EizpZPz_?nAjt(=#UC?qPj_NpWQk^w_ZQ2v;(@edb zRMKZ%!&O2>-5~+LiiC>Ee)5T|pxt?BB(t1dQi9}; zS3h|-J${vBXMosh7oO}KJa}|%cqgYgWg9wjB(p5`bT58g=hvP5CQNF#$Ivc;)du9E zlIyIw`J(0II-^YRz22YPW-=T`A_F60sndZS72lBT7%>k`{k{K(^ zjf4*j+kx7JnJY{;F|ov$!OFoL(D&^a2rk)}q>BAATQ5PdQ)mJ6jqd=uakUEfl0qcLt_^KA={~&J4-z2~D!IZb&W=NwzaUu&FuO&gdPvE%iQ^ z)Cls!haaF=`OfZ&E}bq9JI^=sVS&`}P$H?I%13sH@lK;wqW07~#6O@pJ2Z9$s9p_z zZpe{r03qL5@%KbAo+j%xXLUOBhUw!j3W=+gPQFI2vu2Da+m}3kXqEhbFIrHnX^ff7 zKk<^)a12{{*y|dO-l1@%j=;PSJn(ZN*_rrYol&kG`iTn2?p?P=va{~DwZfe3jLNlO z1lC*~c?}xcPF^>!Alq4S<3-M~=mLOAN2+qJ0AT!z1g;9rk&@vo8D%?TO67V}Xbx-` zmfv8z1jPuj9?1dNTLF-NhYdFv7%1Bi)0k2s%^>Hb_)&crek6H{%P0>%Pt0SvP)EOIF0~HYez9r1lQ{DJD&}vu1pnDhv+GjJs^7 zp8@_QF;m0KWVpNv43uaidw8ASmAs<)ech;{d}n?ikMpiQW;~vMbqg2i&YI!)w1FTo zv5J*D@RxLFz++ro^?a?+FiAvfTXOljJ^7 z|A#FX*xS_K75qwngSfY?8qDa%Nv@Yjbs}9sKTMcZXBq>E#{s!Rx2WzNv8P+uCNrus z+!IBR-Mh}u!>PCRx{Mrz;4D{v7ED*BGlqC$6z^m@<9#RviOw=Dzjv~n(Jj=ldbevf z)opmNT&#wNAbG6lg;~oWV*Q%x@|Cy*;{IVV}l%ua%~S4?M8cZxHsXT_F# ztVa@m6gWFmx`1+}@4JOIS@tEe=?+&Xf=!OI>askRo~P>Ntdch?8{E}H#gyX=>FF%3 zl^kaQ4&^i0!evO{vCLps%ivN8Qm?e30-x!M!Wo9T+g8cNw61xDvfwp`7gl%h2-B*> zU+4KA=XVWLosb6ew5D^+FJCRCoD6pn7psqdCA-g}A;noY5Z63Np+m;TZB|Z>GxWpG z;Uz71V~7iKtc);e8mqcuEd5EM)~L&YByiS&)Aicb8Vva&nwec9v7=&h~QW#e)?WPIIJRIIBQu z&Ww&7ezn6k*&^+z(wvP;J$q!wio3jj2qJJ~4So=m?U0BcEWx}5T5iPAh%l+-IV&zF zhdF)B)oY%*EJGXFSniE9XWj6xauuC!STsDu15XiB-SDy0pjOlHvYB`iTPn1xsEPbQ zyIS~Ax3VvE>%>4@4B73!s7z-Jqyi8s%o8`HM;m=pQ zt{HnjJll2x{F;`N>5Sfy=u^LAm=)F^T)=mMVMR3EAw$gT#7(b;g;Mww|H0)P3o4(d z$#iCHOwVcxY%5=Vk-8SonvgHH&m_?&S*)1R$$eB`=IP~>N`y>M6^YIodCq{g-Ju^5 zV=atG40dr;8JA4vpjNvs99~_t)fh?fgVLK*M5>AmCdT6Z5 z8Rkh2los|nQk^xwuN9_L5PrX4!BVO-Lve0cXrwx;Zk|2WNO{(_DLJXmK)@uy)8m+B z)q7En89{Oy9W7vaAQ&N&N573QPj)Uf=Gs+m98ETVlkF@3ve=;lWK)!XwIC($+YE%e zpyl{<>-}Y`G1=vM#O!>Ush5)~38F3CW#Bn$3&pqUZOL}S;`9|P)#gk9nh?HGIre=?H=934Q|^k+kMRh1IVl%0eRS- zybxUElDmi3oXTf^YvpHYLwdvd4aueT4#!sSkpI0oS%h{%8~z z6wj0OlGl(=D_i4vB#a_^Y+V?>Xh9Nc2TJVZ6x%5M2j=NgBORT8aK-Ya786|82@~eh ziyivjLpyZ*^nkeH5h%6=)}=mKq!Z>cK$Y{UzQrL<*=fPH)yKuxu}M!F>f?QA6WMK+ zF|oqZmHEsF+}wi9XU+QHv&!rx*R2ocIyX|E(Rl^$OXamg9ehMbA@vy;loVzuEEbck zSe*IH%30lws%X}KK*(Gl(w#94#9Vz{NOm#n@nXC|5bh>B8<2q1H2d~tqF!^=;X5oF zMxMJERJFPi@Ip35=2XGg&X-I2cVNT}iWSPzgLk{)qA}pBn z!OY6StDajXAhV0)XCj}R;dRA55X)|WdcVmsC^z=(`p=?&+2sP{&VwwMxEc-^gj-cd z)d^&Ynv?sixqC7k%AB^1_m$5V54vSOpe3yAIY!8F3q{x^n^XG~CqJ`tR?N8tt|Vsx zowK<)4JSRzVGbtf?CxyC@qBTDiplYjns4-Ynyi-y*lD#;d7g8UqzFtad0HJNhSs}A zhKM7>Xj#R7Fl~;dju*$KXQBrULKQTVABfl12zgYX$P?yu6d4{2q_wmk+HyI|4^^jl zcbOZ{x?KPXQcx04t7A-KyZ7;xOVVQct{w@A-Q@-q;#xjD(t=$tJr{CT_cT-f$N z#3G`1jEp-Vs1Pllyu*lCeKtP zUom+8-gY|TkGXm|t4^&2#LK#seTCo3bmlS=paCIqEyvDD!xTMTgJDfW%xd~s8whqg zh%0%s+kF8Bhi@PVcR61e0M^&T$(d|Vmt|HTagMhz*pUIP`*k9x$bgoe3g<4t8Omd& zK&!rgl;us#Z`1Z;FbbP4_G;ogDMuAi_y=j^5&cAK4$4PPhGxDMj+rwyGs7E zW=-$(4Hs)y14L~*@}G4BNLiZUR-x^+NwK$ofS-}Q%ex%gCe*E3JInQ}_>D=kNQ{B5 ze9-)kC}*fAxeQyR#vlP&bD6AJ5z{M#C#zAa7aFgGI*Fw1op&8a!N?`qP2 zfxs=eoiMX|B>`Gg7YT&1O6qgc89YzbOZ+Q0-MS3$a=$zORxSZ)i3bfh%d2)J{;AGW*w1O09;9t{nQlLfm6rUp{8WUTWd9e2DFdaCH z7(E0N+nfllhHX-aRJ2>pAs7__ z=>4wTN3wiYCxn&nRk7t0{UW|sVsMJu?k>wxDm$2T20iR`WJ0U{eK|=%=6zvW++A_Q z=}z(8NQ9=>hp7dL&@@uR?3_esD*GaEy-)J4?rZCC{GvJ1F`Siv;}^d>uk#G^WS`Cx zA%(6CBPvUNs9F{#$qVQn*WIdrtd%K|pN7k+LC?#M`iAYs7>Hz{o3}5s^%4ei!%Q~N z%Lj>J+#d#lN@q(lv~I=k@(ncPm==ya15c_)(Er9!*jFJgYi7BrQLuMhJ`8t7K>6m? z#nt15Y-qq(F5Fd&645g%pM~Q)xx35FR~>G{>aI&<$cGj#6bHmB9a@cluPalq?C1vZ zrWfQxYgSvIWky>28NEBOw8Ujth*;Ooh0YSeM}8v9r{Z*I*3%xE zDF2QTAXzjqUq)wV_g1`>jlv4(J!4Ov-S}NemdS=zUA@w(JBC(zoGjahx4^a zRAt>8oU-;niq-d#7n)Xouuq$40bHG;TNE82fHlzfnfFlq77?>y$3TEDERTGJxU~3I z7VcHV38deB$G6VoY;q;s!TFox-bBue?5sFu-3Zt$J0$ zyUBM_uoh=U%g%~_bCH&B2&_@gaFbs=;FQh2;d*3QYEY9285RQh%M)j~NyJkEDG) z^uEOm4&T5Q`Rtq$Ez5~R7Q_;v`jj&Slw-Vw*^ZQG@w_7PloG9l8d;VsQi%-X?zj!m zylg`+$cP3KHaRCHTD4MJys5^8d_w)Q71swc?gacPC0bvGqQoX<^I<{N3f&zX@`nmGQ&5`A9M(&9CgvFs)&znOCHs9#+jxUtP#fm+E#xdYa_uXk3BwoHw$bDv*-4YU@?*~y8P-Fne;QZyC!PV`Az zEKe(jWi6JnkLCywX96=3BpR*djC?R+6vfM#NY}gKijkr=AZgK>k)%w|u&rUF zIm|?V3A_>#6{RLGS~XD3VrL3XZ2^3Xjhby4=qhqb<{&7L9MdLDw2$JlI0Sjos-GwA z-E!oEfc3=XHE=nJ(VWYp8kdV=kQWUg3{P+5MFS|4!cy-OktW;^G5!RM&pIYx%4O30 z`(~DAq*~04xt~pCMNW|yEr6{&9LbAz0q2Z=&6muxdVV*EdSn8dE4^8GZ40uqw>em&Zr{rjuw6+5mNsiY1dGhkDAZXiv z48zIMXuX&^xzXsIlQt_zUGq9*q{&pj)SMxm!z4@-fij%YfCwi+nvoMsTpLUCI#@t= zsPCvQ%hQzHXeG)U>YFsLDz^et=OS&DlTFAgs>cNUG+8fGLPWwXbf8KT73tAX0PF9O z9u2H0tQ6_dvi+&=IntwnHFcOodNij{Imm&t3J-kCvSm=bj@!8pvBC6#3CW=2D49el$BQpZX&|8VYVLu*i=F z^4Efh{AgffWf_b7Xn;}8Xyiu&tg4;Pk7k{1z30e}W~Yiu_iTtpxk2}BDAt01*7GR< z2$x*ma^y$5A`-t$*Gnwygj)i9cTuUHBHm4LQ=~=%Om=Re#MLqUeHAwa)mjFdT*O)& zcO@0=gsE|9kUbji+#_d=t#4*`X0$9Tyz*zu9})JWWMQJAahj`qq^r`;mma`bH=#N) zT6SWbyAmgcI@#A58L@SfiyCQvwbb%_>aO|H7TfZI-zt%H6GHqz#nSfO3vTP-EFoN5 zM%XVVu1=!76$B@hM7~3LOTc6i#S$iH$`i_qjTp!4yKhmApOqw?q-f=K#UXy0qnA_Z z6kBLO+u?i4hlcDVsVf&5kyl4JQM^UMi$;;pB?#6u%#?eh5~4AiSj8ZJXx`&^GeF?* z5(MT>TQoB$_a-jr*k5^jX1FH@xXMy!kPNLG5^H72?J_M{gn4D_)qvXD zVcLc$iyRo(?zG)`zX$`~L9vEGCQ0Upqpo`KwYDTf3+?TIz!fWN3%VQB++bMGgB)W( zDpKNX*eB;V<;Xv2L|sTGBF_}R->_w+cIlG4lfm}@YGqy7+1Dz6ZoZ6Caq1L89Uo$%@AB3G*{Fs~ck`vrq!Bx|2IsvZ8@mu}@U8qP4)hwresk z+jo4)iy2b8NsES8bSW;A@3Px3P_O6fUd`p|wQR_W)(wfZ1IdcU`_ngP67ERrMbXKM z1_Z|XqSvv1(hfY{BaeIc=x7y7wQq>La2lRrvJ@sIFT9cxOk-9F5VE2Lh8^zSxG*hu zF-gTTT&@L<&h@;iZ`+70rJ{;hfuAPpby6N_#MBb(J~+x^Z5Uy;-;pF`RBolm$D5WZ zI-my0QqL=Jr;-(|sq8d6WJS}uD7H?J6;1D#?mL8kn$?V>_*P4@qBWOSC63Z$Ak27V zMJs+^F?!01=JzLdEwZBVzVf0q@}24NYHs1QXr~B6Z)8QIcecGqqsF}I`ZFruOe=}8 z?k&fS4@3K$wm^tS<04uS-YP}9%BLx$MANsGc8kP190C-bu!xKidU`?5xok%mj^pfY-*~3mia2myxM(lBao-RB+aul-+z302bFKd8LanyKt@vy=# zR2)1!dv=jK(GLH^_G62)7m5old=n=2G@6MOiDaA`F(8e8wQ}LJd3-3 z;%pf2hv>RJbC4+Rl!;V2Ylz6$^E_7NGsgWi>e1TR z@9b`*4zAF5%HAwWU2}@$)MU5>)<*_^Qx>o1aA!vFuOkLEZGRS(^wV&E%*|hK{qJLL z^yk0)-9LW+?T^3t_Mg7}^>2Rp%WrOfzxe*U-+uj@l?xh!W^G<#%#>f1A=6zIvvITV zluLyMj4RSul)k$Kn&>v2XVaLO4A*_oioIcrqGTm;E zSjtZ;xE&;O`CqX*t+DzogZi>Xf- zw!8XOBm4|ABtx%tSA7XDt;R)kaRbVA{5s}}i9Q13o}Dkk=z;3@j*S+b=3;?ZN17~c z#Np+Ps<#jCb8XBL>+(9ISjHvJEP~!?29tzY^~O^Z;N?<=QZ_WZi|~C zw`6wJ__FJU#hQEuKK(wq{mx=eyHR_1#hxDXZ1F;tYrBqU%NN3)t-x3C{zCQ9P)ZyPDUOEWiKt#! zgw}0;f`llfgtx{k*Wlt6w?XV(gTrIT{RvMKLdv)YM4D(0mEM<%YP8?&&dHO4>OTIk>D+xt; zoy2!GP;{4tvF+D*L$cV#IQu{-(r$cC>#-y>XC`>*$Wc0w9yTNJ;YHGU|-(6GAFBp4RQ7 zAlf`F+^jdq7G|XFa9MYNQC=?Z(5`S;`_Pqsfn!NBjK_=dvg!1&&o7M_fwK9i?EQD2 zQt{XYu67)mW<|>c8#DU(Z}v8u7O*-3z*swu4#zbdsy_vP>4uyEbnuSi@gD{Z+E%E@ z%#4?69q%9f8NaVnb`na;*~LaNA?}8J1D20@K0ZiJ$k$lAw$Y(?sAwmu5AIz&tM~-p zsHbqA+0-Z*!nsD)U5|-6HOTc46Sm#?80pUA#e181yD?VRBI!O=SL_LiOO5QfBw2iA z$MNa2q{aS!Ej|mB3yD2|-xr6eP8jouWYKvZP-@JoA7bjaH$No;)>m$BR zNOgDHj2o;4${{|2X{t<4EpA`+3F0iY$=yE^Wyp;+Vf9FH@5ly85!{PaB9e)~6I-B12K z;T_^6X=ro3VQ~o#PIkEnGi&mMYtQ9c{uYF#8zSny{_b10>kiPHy;nrqcOW3zm74cb zHgtx6phuIhA4Nq9 z;6feTM1MC`;b*1dxf|fYT+qpZE5l^dEeLq{oci7J2V9I)p5`PgPag?AI7us4O#q5U zALP7~>f=}3?S;q-H|pArNRmpvsRv=hur=C$y0O-<85le*HkD-;QF3*rh04lcN9Yud z6%nj6)K#&Co(A{Nq^+XwVQ(q#mdgwiSYS-Z$Rat!4KWEDY5DUoWe*ZOgoIYpBt(i= zK<5k+B6Ie9XMQ=l7iLi)es?z=pAkx`X+F>4)g@w~+ znF-4r561VH=)+gEj=^VgxV;lFzrz%Np2A<2+Hx{)ndU1UF@ASi98A-lld>8$;!@bX zvs1V@p5vd3CWnhH%8Zn-eDyG*p5nTU8@Eo(u#*w7oB}kW^2ni^YTim@AZ}irmMU?Y z5|DIvsxFAbbmb+KQ_~~Dv~-uZrfG(9YT8f{ULM|tu^gut94gabH)IyEeYyF6p^N1a`O)S zfzv2v8-Njw3U_!1I6KTCKB&L!cuH}vFk(}!yRA>wC9xJ$$j z!$CxRcajQ#)-buSr@dvo;B~#=d^e?08tF^MbEi#<<|!e!#dg1N+wDpoefE;Q70H8! zvxWOgV7Wz`FEwe#*aO^KgWx!!{N1S=(106@k|HF)b|_?XMro~ob_DF%Mnh73 zCT5104U*QrlBin9X41Ncc6?lQL#(gH@;$PCySTH<_R87#o#N!Peg1M|Q00y$CT>^= znd+A}=ESO| zv{A+^+zZ0!#S7ZS`GdduPj*>bZP9uudI zyZADC@=(NO?q#t{Cu(+tvZMD+al`+!1}yI}8-fLjjG4Cx&bOebG3oZVv;TgVIYhf^ z;8u!o?g3jISd&A4X!jtjI&kj%7nvNYP!fyZ5Tk5|)-12Mt>Es@W@G5fv|$x!LV-X` zek_*4^Vzcg$o>{?olc0s8Qz1U5a(A7pTf(#$H%2bkS}O74hQpW&8GSUAJSceNFZw^ z3i%&zUsergMfNh#bgJ{tvy$cMUc!@;ZCfJ#W>_ecLcTYD1IRU&F^g#AStH}Z?E z7{%tsw^#`)?ct7cwU%vQ6-*H4yv8+O!r#*1P>A8o6 zw%k7K5!u^+tOtBmdAX;P-8F2`-6pBhL6X(4dr@7^88$k2_mXuu_Qr^dGTF^w>4~DZ z5?+DmW}_;fFiznZxU_DzCE?SudFju_qnk`#cOWMQ?&g4FQAN#^Bd2eVhZTnbcYslp zEZ&jWmU$=p^Xp%-VfE{8g=hIU=}#ZEa9xHft=7bUmvA}}2EdGlbEeLr8aT~awK+*> zl~XRT+?oFEg`FHJa{JuJ&*J^;w(=hp?}-4&)14xE!aTcoZ`CM7-^)&QGx^uwIL{T0=aIw=9x{!&9-Vnl!io*{wOO6#69mttleooo29G zm0m6s7fi7@MLZ~xD;*W;WL6uVPQ}}z-~q{q+3AD#!F)yx~FB`6v7~Mh6H}Ygi%a?g*{z)6a-hZ2V;btzFx}j?qIE2Y=Kdk z=N;z@Ng@k#X*O;3B&j+$=8tM8N7~B8#$!@1sLb+EUf*wLR#JmG`0%&v_ zaEPE8{@oEZ*Rf%ujI#p5q&ecw=^1Gjwp{y-6KLR_u<@$tvqgSJa~%Q)OmQ3vJA(oR zNS@30CdpRHsF{$nUXi^9C<-vyHYc%vJy#r_`g!{1WorxUvPa@adt&HmZawvs&F0PQ zFyL}YU{nXwej$Y{2>zMMa}Z(Ya-iISAvFX~3)iw{g5ao8W>%Yqd$`q_YQkK&fcu8+ zi|-M3>|?b~-%Oo_szRltd%;sUPBj%xfu5uuBSfEgH;%K?4mM)yvzUyIj>%GXLa^j?ph0PqQ~bO_S$j>3_pc5ldb zWo+%}aw6}QfmFDIIw@2v7s-8p&}i|lZ?Vgro4^Ybg#xGbeDi@VG5{)m+2r zKM+AFhFDf!u9WZIE$ou)qeMP8&fOL(Og0|b-BvV_Y-~4Y<}TKm`bL}@R$3H?+%Ofs z1)M%{iS_&EE9&$`Fa*nQZszU-2x&rfeJ zH{Pd`&RucFS{LOXMXR$kIc?wFI5g@mek~)Mj@MrLi(61TK|-u;`!{MAi>$U7m#L zYwpmE>DideP<7ZJ#@A@()Cr1Y!AWwZWZ;Ai>QOdgK2&gbgD=ujp5hMJ#Lao<=>`ua zIjv5I;!z=uzRE;k-hBv_K_PdP$yVEdhBa5F?oXh)D_5ao=|NA&eWiuzmUc=5U@l-ZDZ=RAJ zdYIbSi0N8$)f%d_y|cLOh~Moo5%IG*l4jy<9F>;0sE{$}4Tn!}M#;Fk8~urOt= zlc)Yv4SoeCRKA{{@jVW+>{~H1mpcndIGv_C*T)X6%j1yK2M>CJssoMKinO^$yWvw7qQI&ySGfV=pG@m;EZ^!@rJ2l)RXjcj&!3@@x9*tnB zhkGU(?|6QC0!(u{Y-`qLs*rhYmo`I|#WFlYr(eMl?^)Ky|SOw5|F2`Q~f{ z;pHcPhh)x>8y3Q0M+*#n-Ogz`|LIF_VH~xeJ(Mse;G^$9^YU`yt!3&P7Ly*{M1452 zqdVcZXE4BVU+>P>-fs_8rrgJJl({f@8;VKA`N&L3*%2YY;&!dSJKd$X%>*L?LR1dT zJw^ikT;Cs|mcT-VM}%na+nTxQdnK4FiQGwls)ZYYO;fw!srRoX$PUh5r5#*hs>~or zoTS5&z`2@2|69}lu&(j$3zUM4N1|uzlve;LGo!BP2-U;0PH-K2p~cDkXvYsoj)$@m zqgiV~oDqJ`>_6~d<=?HM{zBDjJA%^(-Ei4tDM2u^J2S=uo%rv?8g3WPn&FF#G;)rA z6odTzMy!VIA~Z~vRrZIobY${u&{5Lapj9R2$YH%CU2}9D-P>&%8x5K?Zfx65V>Gty zG|t2}8{3U-Hnxq%#*O*i_xJsC*UVaH&AMmKIs4hqo(HLT{xTL7X%ImKNubs#fFim~ z<1-9hu$Ov8lT&jWGnTXATk1dqIodOm>^a9y>H%rGNw zmMY4c77`W1sq^2Ssw}PDZBpK(xm!)LHiz?pF-D``n2-gMnak*#6whquP8*_?!tYzy z>{NDu73h}J9w)Ettsb~`Y98g${nRdrnwyMDGY}~2W?}($piH7 zWV4}%HI03WC&|5Zy<8oE0b}QvkVu=CediY4sec^ZQctN_vxgFkv<+<3bem-%TI75# zn8=)c+9|c5syMxU!+=FqC}En#u7xnjFNXD2139PidOL8JMt>A5bm#n=zCS4^o*DR$ z{gUl#J1ZjJ+jqI=RJH5>7X)byJl~S>`Lt!OK&SS#KKof81ZzMPa}Gu&{{c5MS1}^j z&dTnHB0x$PXu|op7&$Fol04gZZ`c<%65Xlm2zET0MN13pp<%TaS;Loq1-(W9*~QGHcW~e7KQACV1ygILTpjosLxMu*rUc;*KdislA`q z9w$<26>&1lbUwoIQ^q1{fU;NSQtNX^(+rn~MPgQ#43|tf(V|r)vBnW}@LCNNV`OT= z_Y_}Gi=So|XAM+bVvOnL zoaI{1{03vs1!a0&NDG>E7{p9eO}toX3a(>-O^PUUZ;iO68pVjs0;mGReb#9r>_ggP z3s9!o@GeooLH`o6yuY7$MsWAo|EeKA^jTA8yQ#zTkpzQ3OnV<>HfMKi6#8A?$=d`U z>Hz_n;7aIDAF(k0jNh7CJA)`RkSgf>8zMH|wRGMKDR{mY=jXBA7*;9;^!k)|7xnf5 z3QJvB3NVH)w%Qj7K+Hx#tO5&-P3(IN3k3pv#>oyN4!Bef{mX;a&|GHx<9DMHeSDT+ zq)wgDGu@?O#n<=sx16`6cMObRThU!ZNo5Z+It7SL{vFHWrL3)alJ@-3;f77yxl`V{ zQ8$$tfh~dNV#&v^+W+`p0@QX1=^|G9b*&Sl<41<` zattX4#PQp?jQh;H?{40UE`gLsLvDe!D)NO5OT%ACj1sqQuZ7yoBJxR<5T8g7LGDgH zYj=+Y9M^RZXKd@&+TBTeZ3vfHEwVMEnV0wfUe%LJrK{&OeBL%yvOZ1%bBKI(FPH3q zx5-pPci;C$pix+_WQ8Lb`=TYIt|IQ2$g|ZJUw>1wvWrVbOEWlhM+0}Y+077-C|1UR z+~Z~kpTkek^4V^Gvgod)qdd8^ze<_r@~TS`zI`?HG)Jo>k=$>*P=MFKi9K;1G}pyq z;Zo79-=B72wRP0gYgIl+6>l=w+gg_D@au(-2Otat0?OCl2iUi52Ps2fbwuMmOVyG@ zJUoXTDRcz*+4pFn$~f}c1`bpsb`KbghqdzNvr)dNYi4MfLRF4l^U(-yAn%~NxE4#L zGw<#GV_8zk23JVe)r06Z6)}OSMsN6#5^-Z2&tdCi_g1!esY7g4t#xi^S>3GaS|*pF za3P=psLzrfdD<#zb&UC5ij7lG3){>P+XKVDRE$?Ke>D%$HEct@!el0#VkP(4Gj?4Q z8nLq5#7FN@WG+2d{Jx4FR@u-$#DT5C)ybii`2B58q^ZPFlh=E;_LnHCd*wL+jRA}b zAEiQto zA;tL7nT$zWpllxByw6D)@_gP>c!p19!KhFieWd-|DZYh@9VPRm?yr1I_!YCcNG<`h zoxa&|<0hN;pM=35&%uQM3dFUp%m&guV*~9xLPF=fxvM)L%#aZ|B7NKyhUAh;_=-L( z0V39hD%NgKxU4T3#B6e5vR<>ho`>$Zjc^pxr^G3?zp@?FJDo#+d?Uov|3#2t?yl)n z;P8Y-w$7l@>6x|lceDpnZ+t2cWFGHhf|gU;pMJ-UbXoI5x*=(&9#>iw(Guxy)?sL7 zw>{_H_z#3dL`(S38ZV96V$;9DHKjHlsQ~M0tsm~iO2NNF!=g+Sm#36z z-8f{Kpv#u6mskG$ve{KCK1F+T$&fR%HC@!JCBsOpPcte1bp&1^l%8@HT$ zg~9_f!5XUO{9U35u`P1HE{Aw@Yh&mSS&R}IB>SC^DX!5_=By@61(^si{^_q$ z8V_>dEyC{M{WkQ-H$VGMp~Yq6m7`mRB{@F@QeGHXj|&=v?}~N|xEbOR1Bc2sX%tc^ zdD~(;tBXoX*J|$HSRUz*QnVJFe+4LVX^WK(piDk2#^pBPG_{onKn$YhW zk-PQ=Njn^(n)dUv?E* zt}Ul!va?rnf)=g9=ysU2nSKL4q1+DrJVSfaN>-s`#ijgRwvQ2~j*88?F@)SM>SSbN zKUAlYzU?we4~BZ0bJ*613ZPpb`SmB(ma;$-_0u;MehF~$zV#n9+f$>4$Bt*y^Sf5%N8Q9$Hh zk;iBhSv7q3({|verWV&U8Y|m1#6sD>UB0AgOX6SZ#G`xbnwgWzko>Ot=0*lmB8{b! z(0n5Jf2%>Y64##1!+^c8)_jFsCCWup3pD1v2iyo|{TPfBJ4$Ke)^R$y2fI_5Be5>5 zY8u3?dSOFGY~Gx_(i5K6A@0q1BV1~E%z`M&SCa)Q6z&P{i^m*uOYwloAm%9nXQpLr z8tyIdrkYaPWT>(mq6w)EB@z{@EP+$HwY}Kn6@IqL%|WN}2Qc&%cB=XZV5Lk*Gb3r2RRKzwv_b_80i2mJ)24 z#k=H-#CuwWyi}Mz%It~z-@wz#F!abyuEtDfOj;v z@cj{U_I+|RxsY@!CZmWu{w2BxDm{_3hvdEtKmFh>zD9VTKwj|N>axzMO3dv63ypb$ ze{10%Z?Cd@fqtGuIqJFMBWoevX3R$XNmPX8+04?V9uP?;|n2%Zo*d>K>rBL!Ff>RMQ?2`SoCc)ii*I_Seq}rir{`;cQPT^61 zXbVNws|M+{JoWA77vyoar)?rNt@9LU@2z|KeLZ`d%n)gf3LhmPviKB>Fhbp3>1x&H zzY6Rrg{HhQow)mZ!5UkfEFsK-Mxc>iCjXXH0WU($$}xF)^p4w0cr%~mErt~(*5XS4 zpyVXbj+XM4`=F`bC)+LlW1jyjV5jFZ!d3?p8Eumh>m1KE-ZaeWYG@G9${tJJ%q&Qs zwUiceHkQ(NO!MPcTE#Gxk%w@S_Og@=bspQ-yngBPeqAAPz7eUAujKY0@7HTFb9=j6 z_dv^5YGJ42QY5sWHPJ8if~?E5$VIlfhk>r;~`576Q`?iiqrA+_9-CF?c33l(M6^*UP&Z)h=Ls?qt|ldI1g z2#b_(B)nERJrVr4h32W$FfQcU$;iq--#~9qhdDl-cw%;~_v4BTGv)j5-l=~TfNm3C zpjmqW=})l@kNPIGrPTqi9VX7Lbz#!`YZu-t`+}F_cA5(X>35o?nv(NMr#Lv4kuJbP zA4_0ALOqp$jJi2{%bcGP~GJ&o;pAL@bu)?d6h))zHz*rI#%I5L0FBGZHMMj z62fA6-Q=;k5}1U}w^rryPF9*j8p8qK42qP$ttbc|VVx*gD0UUEix z-pRYY+zyJQwfr9#yIDzdzVsN6H&(Z0rr#_0!Ib=Jg3#3C{V;8dbNT;2_P1xA`#dW<{7fe#2Hb@H&Z@bBTP- z0&6m?IKOr6-i9RY?3wWjG`vYC?3J&wN6G({tdW~nUgKRMZfoBG5e-lLB!(b7%7V{q;7@3*u)ibR>5aJb z#)2Ugjud=R`v?}V{@FtX;O%{@?GQ@&c>N46u7~pN9~cTyGfn}%92AL@RLprN*u_JC?(iM+S-=Tw0>}dc z`g{wX9)hwIT0^OIIzv`K`Ov*3BWs%bi>e{d`paR}$E$b2j^r*-HaE4MY<7_23VqKKk|S}6rn0~UCQEIu3odnvIvfbl~yQV`G$uci3Fbb z(e_AbSG0DSXmZ7*I$ZnLv~veIfwDL99!2tXwK&w`-O^eqp8N zc;a6nN(S_ST87Z`xJKRHBnNv#$@1#Q_q^B~p2|v0`0B}AQn)|=A!HD|OUWcmhm!sg zBqtH{3*0R6RV2yJcvxsr>ET{$%GkR2$F#KT33R{@gb{0<`aLd1<{OQSZ}rV-(s>{; zVl9Y2WJ!U*foD$oY~OpUQ+F$dfoPqU^U|}(ewucxm?C|{{2;Aw+2Af~vItIq309iF z(Q@%g9+#{t!e<$AboC=;-U{46%e+jtR?W*EU+yxX^sS7PNI$)x+rAj)L_?g&s8k2( z&reMS$<&g?i*pjsBeBuZRJ{+bkGpPOl7T~WV{b*^mSA!QhA?Zo`FUze;whI%B1}c9 zN`31@P>}Yp|A8{c`f0>`5*C^;LHP5x+}lcDDoUN}YwR{DVZ1*+40r1+tf&25rtdB5 z&4(dsD*DC1qpQ8Z!saXLTObFo>HU?>dxDbW}^^vVJm zBrghF?C0KfsP0||L*&oe91xj-aGA6NKP-uqnD2)Pv1>3RyhJJ#CA zUgM=76R@FFL$3>VC#N0)rv}|{1v(SSspIOW!Swm8$su)UEM68wzfV^TiXw+i=-<>C zOjB6L%1b0TINb?l583&-+$p*GWa;w64)y@t;r-Y#AFqr0S_v1UFV`hKXIL+TURU+A z5-$IGo6)^sv;Nf>LP99SxuJaHuu8Pz<~(ez`5cau!S1(|p(>98k34~0M<)oa(9_zg zAOsoz@)#MgR;+WYih*w>id|i2?w816SU`Vg!6X{%7B9U`n9prhRj|m#EaPHmLn#N8 zN4n8(c?LjVLa|CtefoTW%&8t*&(>|Hcx}WAlMkcWgd5oPO%oRjc8x0EcURv2ai?VB zE5~i+U1k`rK?g{CF3R6;)EbtUsNP?Yt&7PVGEqtLxa!u^n~SXB(_fCDuxmkvhjVVW z%n>pkXDfG%e!QS$Zgpo81rv;{5sw8R97f7Xv;66CoH8#MAKwVk*oNniA4yH8#djq4 zije0bevY%x44b%}Zb%Pw94E?Cmuz{FZW5yG)-O;+*;X5Gkf@s@jziS~lc7bvp+uK3 ziwQ=7kFn5l&xaYteH@5;D1G2+nDxJjK!uDtn4xmmVfqZu2(wmSrfiF4>wFdf%Z3KG zP}H_#7S&gF*k-Rm+#!956sEU#x%C#1?c=FHy>iqd0<3o)R%aE9eP+-c}d z_#RGn#FZayQg(RV@Gph+3$ib;OJ`bN|BFmwaMKkG3_e%<{HOW?z7+)Fw}_w;(zlE zeU#qKaY6=Gc?RgTb?!L<@vYU{b;y>guG5zQc+z$b`lr-vKe$+Hs+V5 zdr@o|E#(fjglWnv;8W~e_04OC+T}#uH2eT1TYm0Eu@*yAnn@mOUZyev3fpUDQMQb| zndbCtff4F=jZ^KnWmr@0(E+R*eA9ya`fIe?j3spO!k8+DS3y=Re}&rO4*e5;1#&{& zFt{WU>SaM4L7$4lNCjD_h-}$=m8Ee8D!;7R{ut$AqK&Wucvmwa0S zZ+q!KAcCEySKIv?NUE0lJT=Klykhg}WU;6}d_(ImluEy;@85TVmS2yef}T2MatO4gp7Sje!YyxGcDeJ3 zHvhNrKcD-=@%ID0oT}UcL)CaeJUOr1Ufzg>1st9*&mOrd<%LwsMSK|0_oVw z1!0|wUiJZ&5L`w&nIYzugs4<@K@vOPA)neuDZ_|;`BR+%JIF(673qkC;F#{ z=RRf-@TK~t*qh()2di=eE;-@v@XG29VG#3}5E0r-(H8I`+oD^ipD9vIAz-6VQ>F|q zwpL-gykHe)KF9vxet5@dpyhwCbrJt$ZLWC25OKgn{O1M7ta130M5sC8?I)kAJX5=3 zCD@Qk0Enz%VX;MIOsnpQxqchIT9{Jj0QUDR zH8>5q#9BUaVLJ-6X<{hEkkHTjMcJeisitLWyPYbpb|g} z&CiC0eMEJC_ps$Szf-%H4T4y)gbz(N9Ugru8~u;XNRMQjDKJnAOBa_;uJ0LD(4}TO z>rgP=T~e&{X;88J8PqrMlu}=mFBxAQ&|Urpm>ZeTZ8xeq?@#DJWpUD{AZ<4S3Jk5S zo4*!9<#Jj19bdOI!OV2!7yyd6#U zLD^ZSK7xWBux+`LX^buNAZYWGKzTpLkPFc~Baf=)>vKavzfYuovF_xA2-f`K*=Zj_ zBrZ^FqN-3l8Yi|%9$(S$;VZc3yK`|Awtw7|jYmkAvkZi0!g6dUh z#mEE8pvx8IL|2G~s4HTy|A}2}fb> zQtu9c5wpFNb-J;gr>qD`Rpu}M*tJmKJ6>dP{e-dcslO=IlTBk7lP6C)ww%xsM+;2d z%~XzD7$ZJGq_1|rH``Cu?#Nb5!uW(KNK2&ObxjnTQ#wWS?9YGWl5Xl>G-SM+^;<9j%#NEFp&~;Murn@+IOLY z3ytg9a@TsAb*ZqSz=a;}%banA<^yZveoK<>koj0xy*w4`=0f(vp}aoRvi435jxhm$ zd2{NFtMBZXSXo~ex62-~t`s@>Zums(W1s&=4MJ!`A@9Sc*?OBn|J{ck>kJd}tU!qg zl^CQpW+SV0g*NsQrM}#+OJ*XWG6yA5LtmJCK^%AjIpInE_k58PSDEGOOG5&@4}q&i z@$pyR1p7wsbF0~E*v1TqTTX!ugJLg(&BSv^^R4o?pF})xmbR8q^-hLktBnFB$aQF< z+q5?Yq_IDVlDAxZPeAool1HLw7EoOMJF#Q5V?o`gvfurk9B)#v`*Z}m%-uKG&>yo^ zA)GzC4s}0PJg5pI!oM>gAJ%~VgGVb?h+sYPC!AnV>=>_7FwVocm_N|M+E#}T*R<&M zjb9b3?bBENeazNIUpU7o(Mh%8$a?Wl760KY|HIRY1${%v?@Ax)bCXK*z~rTT@}12Y zliqrhst-CFY~5jvpDAEr-#j8bCv9Bh^xt3(N;(^Jy79tWWaxX#-*wF1D&Y01dp>}4Baj#XIu;kX;88C8TriOVV)5B6A$C4@*o1u@-a@HSi+AL{%=`H_OzIXWXum$#o zM8zo&>S~ZP{vjNkbjLCxVPz#P6fAGjVR)RYe*FO@rK;$Q?eTrJ2&pE~P)^4D9%kJI z101JgNvou9Ey$}0{d)QDN53hq#^%le&T}}!GyDtB^oR0<0vP`kw*3!e?oE8hlqcTJ zpTp$^zV_LQdThHpza5%?&z;`;V!g@5Z_Q6>VV3J|1_vBs(%q>Vn1{eaYm23jOuag` z+D|zahFj&&S&1>R9?7;=FXZGzTZsr}4dxe%#WrSJJ5yvF&94M@-g1r9iNq}q2?%~W z6~j4mRpa&415&_T$%As6J^6@f~fOk*H5rK z@eUu{5XK6@bMW6L&5YJSMGvN9U9e2;cfXql{Z0eYsCZCglwbrtjTZjo7KcGB4l^+6 z|MRaWci=|5y&sW&94kUh)j(W@XKa? z!aP$1UK`U9e^In5V(;dj(971yVC1D9wy>MEMfw^uU?ef!Rf4Hs7vfXTS1MH3i`WPs zuZWUfgDxS{G>+%T_SnME`+UR=`{5O?v8eJ+0q{Pu(c77U z2fvH7KKBgx$o+?SLE z(w`W4R{W2Y0#MG;R!iPN6IPDtpLCc6d=7!f6$?hc4*<^|*K>#{)y)%$ZJmor2%ngt zonkn)XtTIKluUF`C}gNFMqVZ|I%Le*re($yikXObAmren^%+z@W9gFpGiX=bg$9Pk z>|7)Jh021q!_F$&2-D7n8<4tkJ_pZrvu9qyVp6I!xExI0o|5nX$&Ts_mh?)uF9IA| z$gaaYlggS`&a)c=KynEh* z*NkHjc@C2KGduV?$Dw#HPCvm}bo>AL1JIY25$M1mJ`Ko*3jR~Ml+Iq^yuyMnB5)=D zkIQdB<|ySVKxLHcBYhP#+y_n9VPvHLTGz4<9qKz$k~Iw>Uek{N&2cpFK@qc1OO~kU zbJX(P+0-ceZG*%q1B(S2?$4PSTGD95PRY1AcOKiPR5z)`mmSEFE&rCrwp2{V{SVTL zKbHYN*;J#rIy2SAsFI2mS7=(~1{u6Tzh2LDNa-`b&${?YaapJ` z$ZV0tJg<}Ti}mRAJ#%vTa3{qXmJFtrtYwIoPK& zdmN3XD_JmI4Q5Er{h@t@G6=m=4))*(ocdl_qgf&wmkLVj&hBtc*;nBj;&&RS-N2Rv z*ynM>S==;8-2!FC@(I83|}fS11j@n>|>CJ#;^k zV*3a(q~F&&Q~RjgBF#WdJL69Jz9Q)sV zJYt9#66Ie)(Ndx7Y8PK#9LM&&WYB#cIxZO9)t!CDO(@<-Sh=%UYJhpK^2hk3b?=Cy zIBm-NqD53e8wwtw20lZ(*QJm9^VTVO^;u19#-LnLj=`9m=xQ;mCZVU~pytK)UOA0_ zhdwDYa02SP*J-td^`(~V0)0Ai{qN%%v-U>XE}`KX{}C&?+Up$aw=?biL-PW}c$J?~ zF!2>8l^xiy)bCm+w)zvvvJA1|C%poWP?*2W{V22i*S{w2m(8b=a@1oelM>u7&nq zQT~50n#f#@VBngi`^U&8lRDxg(knGPhWFVru6#IhcC}F;Ypyl>v3={iVc7Sm3v!h3T%cJHoPv+qfY5!aC zDhY3PbwS*p#(?8(q6(bH_wciimb&Qrk%ENwV`rlP$y!;|UCELc zD?0x@jpCBcNV~jOs(=uZEeY^DKRnEc+l_$9nF3E?2o7;yyadrRiQ30U$%qcXB+4@F zTR3z93*YUqYB8~=4EkmEcXn5Cel8HJt>e~?Wkfhvcb*zTii<2=k#6jimS*tB`I{DP z=8{ik4`h{mB-aeAY9?hLudgC7PW<)5FwSp}c8nm~N7kL>T4D(g)%K52ox(2}cfNV^ z&7L27!Mb}aAztm-)Gep{C8)q#7-g+RebkN0RCN<5cHofqnsw^V&Y?Pxf$Tx4<5`P; zQP-UxiG1=Wd40cz8(5By&*zI}{QI-$sGiE>QVy(^nS~s=B%&vEbB$V>#>8d6D#n!d zAJo%uGyW?B%Pr1@K=-!J`O7v5!OB*y{hbaLYnGHgHQTcqznZ0Q8X#Yom>YO#EI;vc%E%hjsV`WHvhNI?73KIc`V@Y|V9lPBL(Si&OwEAYIWL$= z=m~j?s>6T!sK9RD1*FXdE=7dkus`W&WWQ2LUgkXxCC(@H5155I~k;gQ92 zQ3oIRzJ-@Z7av22C3yJ~>@f4X!|`KIkbaIKWi?S2+j++SHaSk1)jM_4%ERr&I5kxt zn06xi9f}b%0$qRq>FH?@7mMPMEJkvTfOR+Dhu++3EZ$wTKLy7MvI*GKF%mW4HmVFa`o?&EuoR^OFac2qx~; z!)h0?`1F(lXMeCzUf(iiIiEWhocAjIHHX6qws0d5(16&Zw%lE^@BXRyU#0-7vxF4A zLq1$wNwbinQdT+I%y&7mk~9+yiOVZZef#7u%k1S2s;n7Vpy9dg(XFiopYj4Gp4UH@~NVO7xsZ&=tFjN=V|kb>T=IpFKpOU`wK zV>`+RxDoXZiBP~4LD_IV zd=1m+Szp3$3w|OI9wX^H`IY8pYOVzlK2r36cqgZzD|1qP?eXADbI}g5Ls9VRrUVsL za$kuHgTuunXZl>Ez}>9~bF9Qp?Fxw)9^btTT$VY!+8d>LydSw`0zEIjy{yBWTlq<7 z?gh1U=t|N4Xsn-7_ROdnS;HM0P5UX#kJl^V#2)BO9xZ=LDVSs7>s#N{XHo>&%AqGv zUdL~}>XLF|~U z2V|^z5c@6)q)1qlDj1t|&eu7l%zLCVo=+G-8KH^KK_Bd0Pw}-RhS{jS9YL#eo^2wzPZ}lqR)8oqW!| zU*}n|v4B zRr?ac6|m+o$fA2^UwhL|{57jg~{l4P8i4Y1m#e};GnS^HM>3P<+DpE=ZZG_fHT_@rnEzi=pQ9-6;E zTpmIvcJcV4eKUC)vra66t%I)iB}>0{K0T>a-&f~C=c^SU>!!+-4dtPWN0D5n3Av65b*7Iew?$veMYxfBgiwMw*fbH+> z{qiqK-p?x#gLXsN9zpJUc3c^*wQx4z^pk#JIxa>bR12qLN&-ZTH^9P^aebMVIoU`z z(dF|rHN_!lpIwzXMRi<^`<)PkMeX|JETr`p6^Zn%BY}y~K|?*&!<~p{osq><#0qoj z)^v5q^Vv({uat3F^wU%uFG9C3OGF6E7e-M+VT8e5%3It&d!>*>74#S~(k&~$?E`e^ zU}d&YvN>n?OO+IdodNHSvIUwvow&~}9^Z=`ZZ5X(9zDuC2sC_>t}{$L$0>aIx(ESp zB{sUu2CB%qR&Mm0&*T_(wAvR+gf{q(%v37GY-!Wt28^}@vZJO9_9p8}2SP_u-nP~N z+$22M^Al07Uuq66W z;dy)stQ+>uV2yHUkU6O7L-|P=ebbFe;cg_6^_xai0?Q8?{)hh7Wg}ALnAfqoC+)b& zL(3;Jl*M{R`Xz7azXrb##-%I^!Z2}1DSnRF?VexEwND1ezj86TZ(R;+UrGBi z(+k>*-n0RW@vnlXJwHkP+)`2Rv+fh>uo)!q8MHYE?oS8B@J`-o@rY2tO+`Koz$Z!a8tDf%2+(C!>l`tIC; zHCeb9Zf}Di?q>bP8ENEPkC30f)S|fpaDY#v~t4>{g)8aiuaVsmR=lnml$lWd<*eM}riekeKb`+YIH>aGd zbLPO=)YK2>XEn4L4L=ReqRslG!GMmnhej`Z*y>-GFvU0qZtk4ZRKJ6IyO7?WR)$r! z+*nel`Sr(Du;J418Dw6%Tp5M;RnZlg$5uM^leA?)U!cWnV!%VWG`EZhV-hf93der_ z%gsMoM0w@__hG%Ko}(L%(?)?45)VMfg#u7n-RXA0I+?tBIKx2IBQ36QrL+ipP@xLd z$XRBc^M`$Hfu8UC{0nPSw+=&&Je(`x70at+@7VZ=f1^N$bdtz;jHsC7iXrbXCH!me zH}i8%*`!&n-cL2ZTuuMw_dbfmPuG2!pDcK}@qn}3dX+zeT^uF0Bw<44zPhxA^#Q&K z^`U(UsuH#!_s3KU#CS646Iq?8c@x;xj&9S8BRQj@%7BYtoQ;|;$4D#-a}(HTeQCb6 z<;!WPzFO@G3S3;(r5x|;!K@FVFKeSp{C(0;FR z#gC>UqWUrX-*dB1^7p)`|Itj(Er9GD!}o`wQx-Z0dMVk}QmfC_b1L!p3K!eAfp9~k zA4q-=?8hX*<#4=;)h69`$FL`Pc$XGy&>UcZhu(!>qp@V`!SqP}IQJVuhb+g)-F z)CIc!UUS>#Ag>C2fgZH1iS54qIItwKz$f=F;u!x`m+ixhHr2oDYBspTsQ|Fj^aH7& zvN^@b2oI3+T9@lviu|HWom#ezKzV_Y#tfh4428!KUxR(EwUnX853`AJ(r6(Jrb{v5 zFdrrIsjO~~Gi0kPZ|QDZY&?>iz1?}}5x519Jrd%@RF4GL@1taS!c@d+u9G@ljD!a> z%|)X6ZzVQ@|3=?<;O4;IQn!Xzx6j|}YgGqLyUmIJK*qj7S(B&d#PK?3Sm9{$&xzT3 zuVv&hX@#m_(>PdXD3`DCJE?(?YHEPSSj0=uVQW;uyPo#GRM*mb0`wm!LF4h+*Ks~R z8cGGbPR4C|68i)oISDyPk)My(ob8P>;SsYci}$ZmpwXmHq%Q@s~-vCZIteh701nP3lPv35oZkRP0a>P=Do<-IY z;AC0%^D@j?S-)Gq*?!1*pq#LySo+uisgZ6#!$oV^&=ndK&9GCLvJ zT0us1k*Qm$a7*xh0?F#h0L8dGi{e1pZEWnp)uB5o%02ZKU|b~vlzMJXKcpd8IeJ}b zNvieXR@g5N%}os+?8_I;2JLU``Cc>DTc$R;?A;+>JB(!yZc%>AQcD!0EC>z5Sv3v!#~AAud>W@adcW@hbNifZoLJB$TV zpo~avJVbNLDMo&0=3sxQ&(Et)j=p8G?N%EVyTBn z-2t8ieyCI@32#R66m1jP#zY?rc!l-UI9q|ox01QCz*~o9!G1uDkYY(JL{W&tEyKSRqc$)kWkXLJcvL)AH%zmpjmKHiIIV9Z7`B zAi323a&}R0db-eDM7}nnkq!rKYS26-{FmgVd{FN1&3`ii$J7c^tp>_te4s#h>-y?n zN7D7PYK$M^LXme&U1{{OgYqXaY?csGDlQIuPIcqmwXS!UmXV=1HfdAqRR;*_V`7%d zcn;9q=kc2+qXFD{06(pn(etl@b&H5jCvyPljLYIxk(C1rLwKESA z5k`j52eDC(aJg(HRD;dJo(tIa|Eg{gmAIH^YuTO0DzHGvD`!%+^!c_@-RE~j%5;6_ z|Gv=07aL18Si=2mjqqC%iCrvLYrjpR)g)OVxEM>+cqS82a~Y$i zHeoaew=o76eQ<8!=)Zw`yb&O-CJDxl5aIQ?zBMT{shDgPzc6ezjm&nEig^t086iHI z!j>8jMgncpWN>dhB3*VikpJRokpmVHIRzQH-EvP3Bb zK#tAEmVDyuyp&Mni>b8Mxx9Y06=(ZS~ z`lNhUzl4-MCi)p^kUTg#uas^(XyaGSH}$S4oOVa!dICDg4to=5x&xUeBu~OX`U{P8 zP1Dcw0Iqu9u|smV*YVr(4};U*OJ|c^V3}9HDY*z(QM>hzS&NWO^x?8WsP+1cM=P+* z*AcCm8m$!ER8mWf84~66t%(vZw)o!X^nIevOwwIo<-jr}W6U<`twUempxgiOWj^x- zaRZiLPgl^aB-_~iLkp*#aOr)CQ)ly662E5U^Aod<&s(a~7R3~Y_TPq}2b~&ifEvKr z{HP5HP$gU*7q)D)Ub!n78<7v%cA5e09`V~`Me9|Crbbo_wUe!h2DFbcNMc29F?gJN z(2})JrstR;jbG`JT=#YA`#$-fdAINjOB*|p`ggo?Q|Q~@1Y^KIE4Q}1?e|B<@|se? z^`Y*|r0Tm~x)xH4eW+ zK^~cc7Yr@@a;Mi0LX`h9H|b*a`=xf>*AG*dq;A#*@`nOLV}-2;3t$-&#$rJ=9CGAD zvDG8a24o;bI(e2XTHdm>m5H4EoY2UQ9!+)tB-b`K|PEm;2Gt>O9^5R`w$%*ER z%_(L_V}kYT2)*H3>e7RJHcJ!zyQws=Y`qA+RK?SRSPY!%Dd2bc(3C4{7kEC;qj)6Wf?L6K9f%ZQItw&cycZe0Qz$2E_qZm4ilwed0qBT0!%-zo6|}52Dj>O0EAQ5y`$k zy@*zbT}|Q=f6oA`1Y~(i&P}a!&F}^WM3{?ijTvwGstg_B-XAz-hY!nBmCAvvfzwm* zEFu&|K8egq@iLe&t4gb7Sfspc4F|JLMomQ8tc=u68P?oO>!j*1L0V*9A6p^nWxC2XoslO!{#*a&KQN2981<{cQII&NV<7%aoy|(l651l^ zPqKEEYzf-VgdTgy97bzPlG>#3*x;!9Zyn5!E!HO>KKNi95b20z1|2YBK_KIuXa&xu z#)>77K#_wUaAd!1b%n9(bWUlt0?sLtK$#px$*P2~(WhO*3E^9s8C!FvR&F^^=)+bRLa7z$7H3<5%+9V?u4uwKBz*QF8bf_R-yXEOa5Wt=JW+NnD z>7du=i}^%LmJByb zBDzrSi@p0lKri3^jYjADPEII`P?!mic-4veK!vg< zC-UP1;QRbY3~S~~09$3wQV5+AY>-=u8#CahZTZy$t3&2l3Ku4fnqhf9!(xMVJo?ey zZtW>&!5zsnx_&I-53$9l#mFb-1j$YjGf4H^m{4<`7NTPBsg8hq+NimFOz6!Ekd!D!E394T0`c?8=O7?F3#(* z+@&MrVAoF)si8R2^3{DxeGIyxuDFS;wQ?;5D1%C+YGw)h97O{3^0&DTW`Ey5zO=r; z{u@^1LE5$5IvNQQY#Rz-Kl!>OFn|`0tF1J2#@6#nz!0N|4?c;w z#$2d|hBM$1q#nF55-2MbT(loJR#1i#VT14!BG+Or(4`vx^;4 z9Sg1C-rj4AW-^0cxOOyYE~-~7N{AR#V&2vks0AojuG|`+hI{7rXQ%*hBvWT&XzFP@ zC*Rz5vD8Km2&~q$(V1c09fmyN?7suG!^M_59k*YtM@lxQ$67#EDyIjJlP~W3?Uf>l z0wR(08-H&0OhLsEYNz72^TNHy#ON*DRJyi*Wopz}EY>x51f{HR(WCH~d(v;gYt6H* zt2t?q9x`x^z}b}?(gMoUsx1~W8-c|DNqO4*&QGz3#Oe4sU$J|lw_Y!Hsp#5~KhaU^gH{Ogsx|;TFIp<&3}b?!*zx>5OhZ>`_d_6C zKLDoJw4;X`@!>lCV~d~B?VZ*SHe|G4Qvn3Auyp&4Z`qMn`<#O;!)cC2R?7!hSFO8JhHIF=j=9!$MB7o7$#NJ%**_ZY{nfXM zWy;UtZ}Zd^|ARG?9V>CsPKG`2AGJC^LGi#h$}~7CzRct?I4p z9}%UT0AvYdk5W26y0sjq8g)ol^&G!)98<)Q7;bKBP7HO0u>ugBNCn#Us3>xTS6AVH zm6iGFG}2I$W@m7kS#+vm4y$pZ5N|ves;gc?{}Bo6{&& z05)gi@o+!47DmiD=6=~g7>pp%_}`8A+FkHx{0=7?HFEDH61YjK5;#fpyzTO+qGdE2 z8%ohdrC`;e=d969)`uEie=-iF@^EGwxrjmXDqXf?%iug%6WN0DLPyNb8b-)3m(4C; z>o0F+x>?)=Ea^eUBquZzbs9hd2&7hn7u~CGVDP1Z|r}3=;C76LMlf(@% z@z}qkj452uEXxoKu1S3K(%^Wk`IC7}N%+)orh_V&_N4*0>=PY>Nz^G_`~+Qh03i^` z6LnX=YKyBac0Fziuck=CYGzGK_ZvCo4<2=6AI5zxuxrF+1lowMULD<}a5 zUrIE=@PbJxdnq+++if?U+z`xAV9;UoR8GU8Ap(Zpz(-r$dP^cNe^cZxAN;su%q8cba(}SZx1%f>Y;_Pu(g>+ zN?vI9hzJyP9XEqaoDp0dS5dmGF&E|$A^S7AYUCWGG2@?`BZ!NUAI`cQ0ov3xWCYa{ zhk1vatF%Cg#Mj(Nk#u7Jb30V2C1#qfj+ef6c0G>G%AB?i{7R_+T$UOjch+^!l#Y>i z@0}^7+8Si*tbZJbAv40;1li1fhuR_Uj-s7fPm{rc!%Ki#l=f9RAxX;!xqRE}IrLt{ zzzPP>tLM0Dv3PSHK9WgvZPVb(#i!LxzNP$ZxYYaXLYgm{G%(%CT;$Q44cBo;_}FS_ z{b#_AG5TvV_QC)B?-)S;4S7uegE)nU0qo@)?(V&&_5BtxI;gFpQo1}ds&VR?D#|{Y zVyCG_%wqTkW7u>Q58t8m#pH@OmpbOJ@Yx#I<=OI?iT7^r!)@ib2+^I(MD`y(I}Eg3 zY-Bo%m*6HKmufUH3J1Rlp?3l;)*VSkZr%&?l$c(naTWtQS~dW8?3yUiDvLke)9S}g zn9iP$H_Ou*>zmVGIq}^LCxjjqYEiT-?AAdzx3Ed z(XrORoRVUkQM{moWk~*&PIt`RJz7O110J+YO?uRCH#}(7BUqhMva>8N! zD*>0)7N>2%)nE=FrJ{&;o=>>vjh~5dbK4|}<{N+r=x|+JH_?zPco$v{#&YJtqo&c$ z4!f;{`DMz%#u-#!eOBp6e0W>`zQpy3X}(k(nw9nAS6!fcbRTj?#hM!fyBz7HmPEt% zJi8jIAf}(MNlxpul;+pcU|u59+NFh$`_IrG-%;)OEb@f`kDw$+khs45mf``p2Qgv` zW@7@|>0Z{DxlpaV54%^?PEW##^FNI$eKI7YwR3HC_h3yQ*RVvls4j2oyE=vU3-)GD z8esdP!rFcx3lBpNm3DlPadCbBdC`{o zF8H|Y^`18f=$abrQD_BJ-caGFcxq6#V?df>T9xz3fLsH5Vb~D}zm0rL9#gVGT-5D# z6@R>k0MOqEzB=bz#-x3p?QJRzmP9{afH5_7a>Om4j^ppj_O9`Z?0V-mLP^9HHVs1S z52!)yui2Kv5bJ!HcXyPp^U$^3N1aFo!i}FPm7;V2Z_N7Uzl-Wsz0?6J8LIyF{3a?6 zO~cFitlo0z%Lo3x8}p+K12hAl+M#R0g1jloC|v((F(&;Dn&-&P{k_RRtm~RZ0lYX< zqD@+HGae^fif8;Ra}S*RA6`k==@U;tGEg6>UI!taZ)Natsfl`%tIhy#ST|bMGgUI4g=yyNgoA*J4 z`p+sK-pm7c5)}L)ZrbBZp3{|eQAmv^_AzmM9zQv4>dO9DT*7%zng)D}{piZ-@pCeL zjn$q_GUaT4q;P}{3kpkSV5t|#CB_EuA{;y$3KsHLA!vdfF-{-oZix}^Zt=3DG z`+*-!B>k^+$Fc;`_={_9ak89RCPKJt->AqEy&OCSPMU~2#_R~~LJCmQsDMN^_hywU zF6{)p(y!0EG+*c)wH;D~THuofPui;pA=Qa5nqvbAT(6KRP1hi;-TD4(GQe@!ZF3i6 zI)LPK=P&fIBtf1+lv@uj+)7+AbJ777C*|?QB$~6qCbCrj@O~{}ECY51N`o@VY9X6XcC!G(IQx7Y| zMr96$dYB(5iS^yaj{~xP!Gx4Z-_B#l+{jFYrxbN80TI|H1*PAc+fX|4q4gCqx_fFF zyftBNP(CvOg)en^zF4A4P?oxwbQ-%Q(-+eK)xSY#8CcZGkwzHR6wW6%Vfqw9X!G_O zI|n$InTV5t1pZa-U*X^M`3bSr>TlGJU3j7l2F;1l9~ZMC!I94^TX*m7W+-&~gZUf! zV=&|A1f@+K7;CD<*Pyq8T&3$oR9`v=E^*ba=d!AkyJ9bDV4&a|QAthj&VQ3AhODAu z))nE0CIz^e^^uw9l0vBvvCFpVFi*Tr0rrEg(M(Xr)On}-8zj@9zH@>ar(nq_-DmC1 zj%1!r?hM1z>GFTywHSE+S;5p3+}!*mb@F1Gp$hefO@_D7z5#^~Xl@ktRSd7wEIIqE zm)tyYoU4QNJT*4dv754%{4luGM{GOaym^_GqoCs(1Jf}i`wp`xh=PXnaK5fx2pBFV z{N;l%jvX**0wszcxw})(3#UO5m;_&Ki!R2ZE9dND)$%U{G<0#xqn8#B7uOilLgMyF z?qgk87=)nbhganraV6U-uE7tqbxKD@$s>RF5eF1u^BrL|#S7;S9H!n3fd+h=L1PP( z2RfBQ72=?stgP|UhJ3nvuC=&EMF6H>R)7I$zUb6)HI0jXc=uUCkVF!D1g-IA$Kt6I z>^e7oKGV+|L?RU3YxgIL;rAYdNfKyKhGDUlYWa?#7v3PWg}DP{H`abQoV-Xibqw`c zbDKp!pUl^Hy?-KY!`R}k=CwE<$RDO@(JHws%IHs9=2*;@_%N4`XF9B>^~z6ehTe zsBryL^22d#L3IUgJPc-jKPoGQpLl6cc2|^mMOx~!S{jqe!^odRqRIT3B$UvbHnn|E z>dcs<(0IiRdYIi+9loIhZ!8E-HXMT~nczk3wM)&08atc1@BN_=@`N0oXd}sAl#Exu zLBO((@Q?8!9=FRd&c&C0A{(G`+2)U`G%8FLO%)MTY5>-d;+4mZlCz&H(r~y_SMXua zS-u-8r7mzzl+v@sV3m&RgAzNW1tH#Z!!vgIr(^l@{O_l3&gZ=Kg@1>FdM6pz{*#hWL4xF+cSmzuw81wu|Zt?HlRyl0fMBl`4!Oc!Ou$VBhbF}Xv#hcH>3oy=wR`xQ6 zy=2zVe$E7z%0wikp6VD9(>iW?z(6@|BvLb>;d(k1R}n3H)xUWt|D4|YG?l~ovT7?x z@{A)&DlP72aa198v1LGugxez+*&#u$Y_{g&=JuXXN4r~yVciLF2nB>I{SplME{&-4 z0L_qeI1I_0(6bo{*i3cuze}5b{X(&n+LThaXk*;)H?C2BbU?MzsgMjER2MR{Sb0)M zD6Jvy6)~5@(m`26%nk#5+<8rjD^2-DN-FfXDZ2n%k-=Jxw`;(4ZTy1RzxKeyG&PZ* zIW|QY7Sv}l`-s0a5k_0t)RbTg%>-B*IBL(1P)E)u(DsB z+6lME5~773(U6Dy5Hft5&B_pM5Od|RPmc`x1=C9^Q_nKbWg@jl`+ne}TTRf>+K}ZQ zVNIG|vo!|O2sa40WQ4#J-@xK?%hGsYcG!%~YH1-tj=bV4rJ;R*J`W3j{&bj$$A~Ml`qqD=><3=PIV>!a!ap z$WhIXgseBz1Q=ZF_829V(_Of}6WONd@sjGYhf)HvD3&Xee?G@ZG~+pk$I@mcwFE}% zUjDws*SG-8yeSM2-3|`?I$QQXwKzB!?H!C;hJjV6EBlUEv?qhCRk-v46re`BkByFz zp;BquKN+x86{3WT5~KPGK4uF{oPH67&D*FG~=C>I2ir zUlBnhyq!TJlu35D#jOa_Eb8wL5yUYs^2-VW`gRJ%vG}z+2z%LIC1RB59-M1}4A?ie zIL-NP;TF6CSIU__etx#fHF5z989gx{Q=B#7RW|C^uc}x%>L6kA`3Hlo8Ye&nqZ=UM zT9Q54f9sC`3YjjU61SM}ks_i?d~(^?2z=L%VRuS=mRvJFbJ-#x$Ob=5gfx1)jmZqP zGS-n4@0c>M4v1=N1b;`q-1z#>P+5IHG24HEfR9ZuX5p$RCqM@ zlwQgql~qnK-~|ra@u0Adj}lZF&?HFd?ZgFPHYcWbvVQEB<97sp=1u@%Jql(~0!TIg zYkZMk{VvCmZ>p9o{@53Z z{?z1lbrdGU60oU9p8#nRIng{jMp;9WQ?e>ai+D{AE0(j?YsFG)!A}L)o&b$|>HRK! zf7#uVkN|FoQ)?s%`5RbxHgN9b)C$@sOS2H_iJX|NF?ijR8 z<4@Y$h@C1L-WSQUE_X()38z$=Vo~K9l;_~(34ltm@(gwt!jw1Z0~uzfTopPkx5&k$ z&t_NAcJk$ybG$Y8q(sZ^mp7D^{h~O_WhKsyP;uuWU-Q96>Q`7=rbH`+7!wP?d1JS+X z-|?qVM*@fmBW=$y)HXcI7fx2g1B6FWbE{IVYZyz%wv7B}qD|E~zpP-*-{4$35^56& zooKaxTZOF_nUn$74{OC;h|`ZU@zb?{(~g!$>)G6n$1?xSuaOujcD;tQG&n7z@8VW1 zetnF`A&)lLddlflK786W+lVz`>PymETyGf;Gl1H75$42{2rtOZv&CQ3|Fq&k_;mKgJkA;J{rT=JqAGi3W9HV27Cv*g2Hd_~L+$89IeFcv zpNUS58k}T>mXybCLQv?Jk593CamYv zOMMCII0oQ8nIf@NcPp8cY}+q%L~*$YI>XI%srShGOl3fiL|}{6!35t}Ihho$`Z4?) z6g)btqK_JPYz;oOr(rznhSeEs_#}U5pN4J^8*3hS7Fz@t;Pd^jxm_ZBCt4oAU7bo}@?blAt0HZl`m$ z{g9+00SLFvr?b*p=xGx$M#mA?KmTvvzX36H)%&%Ra#WRo5l{`9wc?}IX zpmL3jrV!~>7FC6bb<0B$g+!?oc)sQn72SsH;ruwc7%AlOVLz0VBvnUOLV`2XY)uJ3sbCy&lNewB0+TbZ`W|Ah?$0f1LYJ$` z$5*_(M#HTTJZN;WARQuM{GeA<^PKd{z^GOA`?v!&cgT1>q2q6DI;}8L$RNCY(d8Z3 z7|*|9iXR<&9f&zQ?&0DS-ZEdY8s^gHbMt1kcg}h$TrfvIV8Ca`{wKvEwCPefzycMS zpf6J?n73ubs`)>z>xlu<`4pF!AMoTEjBW>2gCOH!ji;M_ZSy2Vp+lxoM*I5amLMZw zF+xQ)#nFd%_{AjG`aht>I&a=nC*j~b7HnQ4R=jYtouHBkw>*t9qg>|TTl>|1lD5}f4cHIlj!rO*o8NMmEfEm4;hiZ)s4+4!w786X{u`gOk z8lQ8hG${m+>Xa}xJ&JhZHYOLMHCOK z2YAP#K&^@-5W?!PUzAxS{?u$-Z8o5tdLdef4|oAm#!u7Y5|w2d`;N)^=F^R$21 zdJ(~seD_c7t`1k9PsFD-GQ@kc>vzl0Wzn14*P` zA~is?2+nGejrGO?VIaCI>|L31#`FkqH{jtvarAxDl?^CGIwY6=4bp_!G-pCX=ajxJ zMF64R5z_9ZABESiF&=T-FPI-(b&g^YxHmcWez@N#7I{IcvJD!6^p*~~YHrS>BJSKn zanwx*1Fu8J+ZuJnQb`<)20fjNz#4?&mxnl4S@C-b%qUv5yJ021K}p3_${}?2>q{WaEJM+NF;as?h!qY z+LM?ed>s3SaP6D=J7-v7YVQcOc$_i@*dT;9@$i#u>(l+W)>UtEZqEn}4>~u>n2w+Q zrqUH$h6vp%t{#sriudOPzVxC16g4g8LfdhJ7}xj_*-}mgVOeO=o8SDW08hl~KDz`= zg8H9X*%t8w@q?ZUx+<-iBvr>V@9lIW@f_7bU6TX`TP|mzKOiw|9$~>N*+%Noq1b0g z*|3)&+31)~EVO%AT6=ech(qB+yvZ#SV6Ir*oDE#w^FCRUJSyF(Vk4XYSn#U9&29{x zsyvJ-*sJ9UY7&3(KjqAJncH!zTZKaibw|T^Mx_j8xtwuOPKOs+8+6#riYJ=i>}$(} zq@@Gg(=beqFO>)AL+dk}c_0?d$@S*AemS9IRQ$N`;vzYxq>u<_{grb03x?sw0Ky+M zm!#Csixke1Bc491$jSc|U_kt>jn%PO`rWLdr`%h8mDLMPnIO0}8K8fz_xfWlc>Wdc z?NG6Nc#{dKY1^=C%zpgfB(@@{7b{AF*XfsL>$I0nHWYc}+ATjljT{j_`fAsMy;nQ5 zGZEW{?kp-W^H%w|W8ump@AaRS47weq<3g-nwwa<&W4`Z6bO)SXS6F+k&V-)gA@z&# zC}M*;l~*&{j&r1@89(}@4bvjb!0m;H|IiQwviwKKwCT!W=I+=`d_{VDu4W3 zVl6DS4QaSeEly@mJD1AQQ7FYWoi7EGo0|_`?ZfM=2UYv}&E-h7cBu<7{;`*-n_aNm zL4AlI&3Dce5GiQXuyP0_nnuI8o-STwkx}Dr70{s7d+sMYx?xAJPwY_S`HS4SUF2Mx zFao>~dyfAR%^XwygPt)8MrG_16V@HMEjF4!H^SUYvqyVnR+PWZIu>J!A~Tq8hF@>H zFRyeg^EWIj3KH?m6#U!k%E3u#)_2_8v*9KH9eIw)%0P=P# z{kn6jHo#ezeu44%PAv>&OzXy3%TN#6A7A*lXy-xz$ZySu(vcif_Upa6aDUt_9J*=u z>$F$Kv$y+K;Snj0SEDaYW~3<5tl%b(x3uM~NxXb(ztFrRWV(C^Yo?f+jiC=UnX6*J zuEP;7qBY(LQ?T%Nvj0lG2ksW2ZzNwpC~Ya5f^zHujjeb(MD8fo2E@rqt%U*ZOyr&bC3cN#BEM(ypItZaovX5B(1k?_1 z#XWew1@649tMw1$fV>n&0Hd4)-!lrG<^-#nu)2I)BaJK*Ez`R{XbbTC4eQxT^@Dr< z{ixXBA^He9NK02!If!5Ah3Jquba9~7BpboIP8ed96WznKYkVmZbYq*%?9gVx${({D7I^<#YdsNBqmJO+D||&c%Z#;zR28&B3AqGAia0 zugUqW_qNsQymwxu_ZL5%if^Z?n{D0U#0Q=Je{;9Oi0gUA5&$7-F8W5@C7o}Ed-(VP)fX>*J!`K@)8tDqOn7v@%CdygWf9frY>PW756s= z3o*$BVZ8&=3x}c0^?5JzOUA+f(ge@<*mfI%yW>?@R}V3Y)$Q!CmAQFVF<;4r+d@00 zCXY)jvB24qt9a19dSlO@E$@D~ZTJu$yy!|1JF>m-8QDI&w3ZQU*?x0aw4wiOKI;Em zeHZZgyXlZO-uB+s_Wsf|skmrCVn!ykZdl?tN5WMk7L||ouMuX5_TKx`8u!Bx1Qhn%;wQ8@oi~0Q7uI)9* z#2kSyFdb>IhX~9a16eaNCKPT)?02r}FNpfl&csuzQlf=`F_ZE(^~%W$)G%-sjB=Vh zm+eBWpU&%$>A1nZQ3fCf;|G?j!H0wZk?+5(o9Q~H&+M+CXi74_7e#3kAN%_DC0c-T z(?qy9C<@55dXK6cHDT3kl0Joq%Xla{_E*1myZ2@@K{ry<&PCwGkENsKivwXw6~coG zHqPJl(~m_wU*!clmwVkPvH@|4=3KMo!(D&mKXu8 z7wuscC>F$dW>j8bm8E_9f4lLRtt7YbUiZyZ31%37BVocBgP#|yfb)KP5)tK8d?;;ApFMas7G$Ub zGb%#p=JE5wN>r-(7hT6LAjGsupdlpqPUCZc6911THvo^4TlZcRo{mc>_x{d1&f+&S z0AVY4{MNj(`(e_6gh9Tzo%}O*Ihl=g8;VH!nB&f#l_438A`klfL--SL3Sy~ls!Cak z%y9nK3p~2!ruY=#!OP47iZ|a$Wh_d!*&O5xzYE{UF9*?3mp_{%?xTOSBXX0 zD*Phbg^U7^>Q4+A(_zJ301l)0xGs+2&CbliPx?XFw(n=-APqM!bO^D2ORYTasml5> zFTSIwqMq%^p+Uy7#+K-0JEPX4c8Tx-@ccv$g2@wVCPi@AW1)bRpYj~CV^bsGh;}`G zh)tNUq0;5s{7@fBrx=IF%{G>UQL0R?ww{~dIv-PRrOoge(@$73&Qs>^@XYOmFPyIY zP*O`<*VS`oA1sx7+@FJ6A5Wly8S>b)Xb>OlTRDClzPnN1R9)Qri06oT&iZogU5;lR zC+?Z8b@9?$sn7t3V9!Z?{SX1VuCd{Mype}EI0gzsXNl)4iul$3LhSPa1jsMwsG?PF z!4BUr?ik__>u5VuUk&#rH21*CxezbY>o0@9%eFf0Npcx2jWuB}4D$LTK;-~>^qg@7 zNxTvvsh@ecF@{X1E>E&42S%h6ernHl+GbNowTB#$k0k=!pIjp%6+5aP1@Pn@gNpol zv7obWBw$ZaxL2HT{=k_rZ0WzD57; zBtjfWlIRj$3+%dfUa$8u1AK5!5{JB{ycgIO+zomCUs(})(&mw$2V#22R^VmfdXi4) z(eO{ABn<#sMfmEv1tn69X8D0E>zuef$7GDG1Vr)!E#^$%xyYhNJA-3zf2=Zt;$9lXebYezu#$W; z%thThXXRBn{1F9fvhAUwJ{4ZG zp%9Xq;B`qQL<#W=0;i+V&F=6^XSGEkoI;4K=i$_mr5B_U^F@APPjjRXp_=OVeN%FV z9!XGcP-FQ~tjF@S*Idys&Hz!#v2A>@_zY@nj{8 zViN^uDCChAAzl6UZKcQuz8{mM45=>wwrhaw-pF+HJGN>QqU@;@ck4d}QSY${0x#DL z69scA5ps|`pw06xha@mQ0Lx|kGg$-XaUsPdp+1B=sFlh9bpu1A2uEjSSl3oY__Xi} z`c^4^;cb4~oZVgzV`TVUt&kN}W$K|5byyQn6oo`DYEUA?{8-aKPL1iR%(WucAVXcIvcFofXmAaOSM0EMbZBWXy`f zD|YF};q;L6M4gu<-WuLiW!`Nh!n!eFc@5jRGuT0Xi4~c`&(#&5lk*_12X6RHuJ~4Af z_wZW{q%k`r6~D7OK5&4vxI1ToKw%38`0zRyC;wvy9_%c#QmBF_$#)WZ2&?SZ&JsIs z$F1O{q;1mir02XQ&F-a~q?hiG+g2|Rp#S&b5d)eFDD+US=}bJ5;KVaWfLe1AKoZI3 z3LjjSEA@A~fFXl$`WR3vA;{%=znt~^Mv*}h?YKk-(t~>$9&BT$*7GjrO_Uo+;bBqr z(!ZQAc*~Gz`!4MN>I?wb^DB6Jp?$LCk`?q$P!Va>oP}(Zx{BqQ1R7CDoJ* zB7`xiP-ojovs06-Dvgo~a)-eRcx0U+fe%LJDH1ucl~=)tCsEZKfDG6yXEI9~TJcIB zUtvtksj?eDJQB)1gyRU`nCqy{>CVvXX~>(oSn=#5gd+7Y0`rJsC%SXD`^|EW#i+=q zl#*Jw;yQ91go&(Jl?~M9zMpAw=weQN6`SmC8b|6ic2fA0{M=SUUYo-J5qNwE{E}9V z!GCOPo3oT?Za|*5)(s5$_S1sn+Y2kyk*ftMfmVpqY5L=DS|MDIU;lkBZ%_c;^^*O* z?;IV`ceD1T{$WF(@_V^AMrN!WvD71>VQqdplKXqCCQJV_O;*!|@SW3w z5R@2--ypP6Ta!Gs^3fy)u`Z_G*L~3wY>lIt`GnqFOhpckKFX}mGWf{IN@J#VVmoWU ze>sBthwM!wjhUDSh@^-K)nqGOK|=yFXq|tWHFKzFeme#6zx8cD{NPIwLb9Mbp8Q}W zb*O_{5kT#r&3_IbNJ&1nRLZKw8JMe`3O`}9yi65NKOGYA4xF?hT(XFwgfiCoA&l`b zviKHOJIvKqN;TYHD8NRjYWEd}9c~6)2?Owi>cT(Hckj%TKo4fCM3?7koikkz?9Y-nzV5@HBd+ui={`l~UW#`~c+;4(ghLZvEQG!M$))~Q~$|@s< zL3{CKGox%mW4cMbP(vT?;Z%!_@)Tde!uS&9@h<)%$0|_uQ?p7?v>F*J{0YF9S(}&x zcGkl4yhy@^%KJsKQ}Hzs{GC^W-Aq_(-igE^_cMw}hS`WOHLWPW7T19;|6@fZD@=Y+ zjAZ*5`60=Jgm_;UG=Oq7jy0Nwh{G0WmEUk@@76I@0MY4~L_lMA;Qp!KL0P=|1;x|5 zhK+A;*&SNX+ftu@S41r~17@Ea*9vF7J(%!`Sp>_Y>;flMsU-;2?;GvVDG^X~@mC9F z79#&3*eA)_*v4~aymE4H4OxwsrzrFHY}c~k0BU$-RQLhFlPvJJ8K)F=@ex$kIr|}>G!@^o7K1qwU$DvWXlQ6sm=Uo(Sx0+V`Qr~v zqsGo_{+><0v98pn4qA|K!UGlEobe8{-%9trys^7mU9%B5`){!n1(=*4BOe zOy0!ChOgV>5J(>Zx*wf6q zu*NNOycAJc#0X`jwUWec>?aDpR`vH0p*NX~yZ4iE{ME~DFw|cf`h=sHS(?uJF8{Ih zGk&#%$2404)Vg7X3*oX2mG!(#_X~;5Sw;m*(w1nkEmDy? zEE{8209+84f$`Q^H%%SdgV1!u#w4ww9%lwI^a0n(`IaEUFs1SpYz&}uFICNg*IZj0UF(&%4UymG_^4E5{FwEo z96&eAlI3dr<@1l|Qm3o2o+#bX-L>*|{9)-|xwws)#%9H3`W3s+m_|e?g0R6gsz~h| z`kyyjKUvG*$s8L0D^YzlaYZO;$LXA5ZysIlGMeF>IcISeiow@(b$YJK@x2RhpX};^mSqrlAfFrHTl3>7E!3V`TkzTSo=U{<&vj7Es!cw&La<+r&Ae#*uZp*Y(}T*C zE=2R>(wN)68d3=&`?PD~M`|gTg=%f!yYRDF@RQaSpV=P7WailVFhh+=`xrOHCT*wH z0LeE>5z2t#D2d97&dk5AaAg8e#O?_Mgl?|z$I3zXFdLApW_9>^XzbcZEhdN8=h8Ke z?Q?b>8%4QCXH<>RlSrw+J+dwRWUGMLlMpGGM9;TgU!+UatE_YVqW76qayPEm8DH{e z{2&M`9DX44_LZ~Kf7~?lg?34*SCRFDt-{yh$8jZD1~9Tq3`!>fxJOdP1@YmRtLj%| zgvzR%d|i8eH9UjKCuu#knJO*Z0L9pSVe|wU#L3D`VP~sT)cm$w!?*q>z0osU7c2wp zhCVk?CD$zH(aaJ4~s_li9C4u?$KVIjN$P6!z@8Qt61%q<`dO7xS1Z zK0X+|>xAU5KfX8HHNR7;dDAQIx1@jqJM$kN#{(nO)UUcm#R}M2_DgoOb&R&tk-GU- z#zdqYw`I8q*qvRHZIB9kqJNu+K3p$f1mIV{WLAm@l>s6s!kgCp-?m=X*8!=B{2?_$ zB4bkU^mog9cd8hH2D|H5a-Q8W&5UJiP+6ObnY6$oGfo_AJ~Y3@+{hg~<&6ah+TZ(n z0|G7`iJ9%Ds~7J~-ZZOxvI|7i8x}te0vyi)mw-G%?CEoh>dp>D%XjAZy!DN|>aBp+ z<%N*@zkpA(R=er+&JTcJz*&H<=eWpy^S!WhbX|YWEEZmN*PHVh?_cDm`JIbn{wrtteO4z)va&7YKo`0b&=6Ha%6mkV|j#~d4~pgBd^evp^Dxd~ev zngvN;Lx;z@%~Pd>gEV&vyL`+>f9NwpQH*IwZUS=rtFdMbM!yY1Z7cJZgwv787#qNx z^RINAeLsEYkV%nreJJl0P)~y==$hQif9NwfBw>It;~}~gb|lkv5%@KV-Zn8{^QRVg zY)9?iBlPML8qbZB2G`0buipgz#`-A+em|3xVDwsO1exe&KG?g!f>l=Y1R%J{zHbdZ zE?U)(BtE5skkx|TQnM4-Mg*OpJdyubj#?C-e+#>lViLkDA=37E{c3~etj~xTNPa5u z3mwltJ+!6T+|hT%;g1N}f55`UIUxnbfJv0u?WXSinfzwrAe8H9`ZlV7W7c?T9p)J# zE8|60#<97OT`h%7TKC%+z*(t)Qkg!2c}6>6XPnWWr99aY-)Ag+bbxr@@xLz_FHGk$L00m;RoK`2J3XWYtF~#+G~>` zU)7r!-@H7b@4^jz{2i46#U1hhzJ9wUN7Z@(SASkEx&FSr);&c$@-ERx&} z;F0_ucF+QlmP|Fy>emKTz*}LD%XFJfIIaG?2`*7#5LdbFg%257X%)mzF@SzGlL&tB zFdHE7E$ToTVEU)40;m%$%Vz;q^JmAAjIlZd?LipDBta!5U~5?O1nVuNAo1KiSIxk; zbatT1*!*UQhyO!0jl=K`N`|=Qja}oP9)3z`n>E9{6nw97jzFR|%maM5PXO_~z;c~i z_@c~d*6&yAnX8B{f&nQh=<7nZ8zVC%f%y0_v!dC~UTB41Q2>_J{<*MZsf>Dh$m?0( zQ~4%2e?xD{+%OJ%OhwM#v#27szH0DTf8)y$#P2^yVPZPz`*8r&NSvsN%6f_JaMF4% zwPta@o>)7rtagtl7dp_ickKh~>W;8P9v2s7QWoUW-o2GoRuD>WigB3oq&_bSA~Dga zZ~V|Tq4?0>+5wU9=p6|aHMcE^d^vE~b|(xhUQ?BXxlz5w>AHm8zPV%Ptk}8PQm>-N z(90shXm`)Xx=YrVc@Dy748orpQz6m*k>SqvIGHh6zZRXrk$!1G^iQEhlK@-bOjpR_!sduYj8kdwT47M#W>PByw`F9ipyBn=e$Uo?Lz6Ni$7Kp|7`+e?8Q+Ym-=zKR zikd6X#N9p@)5NQ==YfkO>2opp{=={p&jAz5xSG`{7^dCC5%y4LMd}}^<(0H-Ra`tY zdkNlnSP6h1**(jq`|WS5v&D?r!KrmxL112SP3fYRIl7Ayh#&=d^CQA~yXN`AkxtJ{c+sn_2m(O_k|)FP>jbtmM+F|D)@> zqv3p_{&j*7(K{iCUXtim2_i%<5iNT3Ue|hvh#DoLw}j}ucS}U?y<5Gr`eN;Rec$u@ z^Zh;N%wKcooSC^Z_qm^$JD+Q|nyAzh_v-QYc|FdBhHWlMUTAD4f;#k<^YoDKtK53YhU-xUVm$!ap z2@7;^V{hmJEiWsM1q=QXw7a~k>^ZhcMnP=SVnzHs1lR2GZ%;Pr!{vHY$O~#+SIKI> zXk0d^A_vAhU?mX$^s}i|q}UQmnm5Rd6(ILh;NAL_EBS!|e<^xx;^(HFo%?7u{Tx5e z(6e;B4hKkLn@t##sX zl8Xt$&!NU`TEC+V9FT~GYok(vv4ISiC3d+OmVaZyFPC9f7WIJ^CFiBKc_H)zFW!3F zG?MPOPp>!DyG~`UdUob@maTizDe6x&1v@#L`H)#>@}~3aC-InN)QL1nWc^@kIg~>u zpj3Ka@uXzvh?@=~M(@z@JM=sFLUsUB?dA;91j)a{KB@p|sxMm0!!Ixh0d(fMbehN; zrKeUnV()J^@2LHv<1ejLJ_|Jkvszo5NoOC9rUq$qYtr}-)5?_$6*H&MS!Al`-Lbgb zJbkxrGC-ca`9J`$v?jW2ftHzF+3tCcsb8}dpOic+ZxClK1P*>HHdkv0)x|nKEGm8P zE|Fka7OBO3@B{-%km9{{1WcTv2n0uv}Ai~r6Q_GVl)P~cB2Q4%eazc>lgs?D%eNF=)&IjO9GcaE}NvvvKQm=?v zAXWtbCmgq{55d*~&7q3l*84@x|88vtk)9oocD|g>JeB_$pwA3oP41uhekw<=U`_Qs z)0+x#y~J-in#gSVMFv?GI>XR{Q;og2SCa}z2NS_t^l07_<$gYnPTGJQ%3ix>Thjf= z$V@0iM$(!eX{F}A6VzAmN_(-f!~Q(;>#C|tkJM&OF@>2DcGz6mhhja$^5P(iY7;Wo zZn=yci)8~EnF?W`maT+xn5Jaud(wJkot-ZYd@5V=vBv}lS2-qBKq0*Y9g7xkvAlAw z=w6ehiY?jLW^n#TpH7m$bLvcedpMTbfqKjQh(n1zK1Y{ukf0nCA}Wj_{aAMB90 zcvk%($AC%ab9b>9-39saAZsU&r=>I#%Y~<-dS1sxz7MzHa9F~0#8OCz)H$|XSG72jus#v@H z(ZERqL+}n>JrU+})&z<7pGl;MO!>1R_HM<$ggEzs&CKc>Ee~PgHWH^aOKj9n+Te)T z+r_23%;0gULUp9-NW*@HTT!w0w-7Qx8}po)edi8OFI`r$i0Bqi*x7$LW^zju{PT^4 zCp;??XdZQk>;HcKj#0$Rr&ofiJybJBL5Kbi0Ji zoz}Sl@89tBWYVs6N2l+2!tKL3>i%b@@9UpS?Yksjh5qSzRJEEK`XU;fes!l8!}f^* zKUb_!gnKo>+iUzsAg%Kq72BYz7)bQNq`d{=ekt+tphW&2mt7jrbf>;@q&~}H8lYYK z98;>4B1Al4Hr*T)v1uKXERd@|rh0&v=%J+YlDg~lHg~tzBVnu;bDw|T1U&q~bmg}{ zN8ytTd8bASi4KHv$x67JtFkJi9%g2oW*Bdee#P1jPbWXL!6;PAYr^*IF!m0TJUtJ@ zB^|cWSYL?j9?HWqimtrvQ2Zj}Pu?Cl@rx!yG;!t;T(g4r>Z`dPO+!Z&OiO~W6yvke zsqFWbY(_P2`h0p(vQ}S%{&W!Ex6?gxw}063jf3j}xg8n2?I*@%6S?MYUnq5V9}=bY zDeG^m%A6r{UMSLzxYZqli~|2N>HxvpK*MQB4>=7MxM z4$3TcNuIfE{=l0_twXx8Q^ciPpZhij&Gn8ZynQK(zokA z_YcPnwi$&`%R*c?p(M$>nk9GeC+rXFnRpZXdqaM2%qL7gXa7D;8{r?N==@Ga=b_(T zk-@fDK9MR*QF%4mcLAidY%sIm2~#4)}a^V(|!mN#V6T77xNH{pzDqVkG-2Jn03TFnm9(tcV-!PWs5{8$o^<}#tl2ZCIuqCd*ZLC?+!RMDrPF26$ zU)fvzd-lT|-l8&*()@4Av;hSY8eEGZ0;?9^-R!+Bskr<9VjLXFXLDO%8VU5Ar-0_N zL^W}~H?iBUW$sTJPf2gSn^NX5C0;-Cd@^z)_<`q9R~|NbFcK43i>S`Au+9lvdS8%M z_|MGha>_7!Z!v48EQb9J`l9oyHF%Cmm8n4$vckAB&d01DwkqtT)Ngac$qwl zo&C7HmwC1Ei#tN6==RCkx4zDKw^Gfp*ho^cRE!kGA73Pm6zLhKx57A_9zp7+%g88v zIY!Y_ma==d$g5HrOU%-HWycBK<;7qmssFv?vfcb5KTv1nwas(;WO_02cBxs60$MNP zgs?2=*L`FA5IZ1%mRqz{v@;A5Kup3HYZeSYXUy4I?#S3fJxM&68R`D~u%M$(e;Zk& zspkKLG+4=G_F3l$`%=j@}UmRcB4kATh$6c0>4rv@S?ug+-8fv10Vx_A2dy)!7wiGjC{} zr$r#`suX=BdieZbZ$ggzu;&e|&Ja4NstF-{ z&UVc$mLM(PnlKQ;^vawZ;`7#fndME`-hb`aPNh#v3vL6xUUhMXabWHGg~i5nwOBQp zGOl>-b-Y;}IkT{4FCoIh=}ppFl^xQm(isfMcTN>~Y+?fqtduSxJ?Z?Gm8+h4$W+hy-2gFX4*6y}Rm zo9x$g2Hvr{ef{EKsPt{Kdtlcp!yWHgNdUt$)6^2uDhz+ke7y=HTUuk;6Dv~x)h=>B z#14&YV_>DpL9TB!$SHY$gYqu|i~tCE*SoIb6zw0qOMOr7kq07=OD$Y1ih#$N-tqp> z;N8{2th%zqm)b@CBNnKx!e?f79Hn<1Iqn|E_JCyV`7*FBL|8JA)cz%U8B1ed#DgkA zNhS)+n>y;MKDXGEC+ySbd2FwSC#vP+gGXdHD)X=}do`jt}S^zV=VA|Td z@0aoB?afsNda8YROs|1(`cmaeMp|+xBo{v28G`Qz`#6aycHb^tA(I(`BaOZK`bldd|G{YSM0pCKz=w_&Mk8NS38-}(coR|W(AkOQ>XxQwhI7SLv(&sTnt zg+tioQ!w~LJi+<0sO1nC2mGxhfr9-TK3(6uZJ#pBC;9(jnU*t$AAyv<`blRg<-KxQ zDxKT7?U)>A#~RFoJe-PIE>O7Pl|O;|r7_S_E5NBZ;5M%XYU*44g+mrs?CT%C-!wcG zma(A7zi8`zDk7a0;CkM<^}m=$o<(ou8xJoP9&3o!n|JlgEC5H56ZKiNg6_ocP?C|3 z3LUx8o$ZKU9v8Y^EiWOWughM`FpG|-$wiKas1-w%qoP5ke}Hd`MPKX0Op(#n?v5%l z2BU@Q2Kg)nWOYn`+Wy#J{Gp!Lam{Zeu+?tWDPEpVmr72a{!z^Op1MWE=7rsVu0?`=?T~u#xYo40idg3oHtI zJpEqbTbu4Mn}x$DDRE!@bdLO3=_jwM2%piAdlf@X(q@+%Km46t7Fb@e2sgOPTCnrc z*mOcorYrf{RhFkBzBip#r0sb8=d6|A?&caFnmro?ti;RFjx*$4-oHnV=Mb??2DK-r zY9Qox-wOWDf2xoioaS!()Zdknt}&zdo0hjm(so|}Konv~wdxru8z^|nzYbg5?Db`S z>`0CE^s;&|Dd2GQ*;L)u3F4_~P_~c$tnl*`2Yi)kU5<{kw0c!r&Jl9Yj0Eq`4i{#0SOL&1#j82GUlQNzbO7lBRn%qgi(21QmaN59OJXii{yj#JKPJt^P{5r0;BDWzw z7%4(jt(fogAB&MS$cO*s{Tfud61T_EqUZy>xYEqO-T!YP0l;;-O`H44UwC_FBWnxe z{;!*5{;7G!=TF&~W9>D#NodtIx6j48*~nnI5BL*CSgaS2=HYM`*q$ZSpq^Bt`DKZJ z)6UG|OZ0Pz4qO*~N8YYh;U8SZ($7hxXJPzDF!A({2Nr;Cs%Y}3McTV8ty*|zD$qY?IcQ?PRZvlZJ!Xk(?qZh$L2m>jqjKJ86y13=f_XM zgVyWJAdD@Gx;9%yTG!Zt#XRf1lREb4HP3f9wHRvPL{CK`khXy)T71%*B^ZYZlbQ#+ zNQUOoL!t`tA0QdJhtma$tKSEDGv|N>ff}K%ob_!MXVC}STar6ph7WucTLxAxaq%JR z&Qk{t)dZ|;KL7%+ z5;MoCk9<#fZQiO4G{39}WbH}~Urgux$ksRRg}+C4L~nikZIj?n(SNw#;8_Ufk24`5 z9uCeHRf)B_r%onmpC_Nudf6-|+r$p<{tHq13clF-UzPsA&2=PI%Z?14#wf zf@lIS7;M^+1ZeXUi*o{C?Kdv13vn!H8pb~inuz=5=<;+Wp~tE_opolKWyliZslVsB~Z8+^TcA)ux9tA2dH>{QFVkvdu7& zYgxUfyz@gKqrV0e!yi5V8(&6JzC}-sW#$V>v(C}cL~~F~_hmIUh(Ta0h;Unhw_T)A zPKsP~$4?N2#Ek!X7EhnIr@fXZ^y&ddaY=tyPyVD3Bmkqk#y{eyEX;I=S3*2a}+1 zZBfScUkg)H`XPlUyC=o#3%G8B!Llb&e>1kWRvsS_Wyh4ew=l-la$V_V>*P-0x^+|^ zZF~{C;#X+e2WQQfH+Qgw z5d2^8d$|Q;eJI+;tGU#r@xj9U)jIBp-}2@s&kAGlLYC0f&1VK%=_YZcPoMU4<3Yu? z?2M+8+iF2i%*|hRU@A3p1%I}lCi!Z9HX`c_l*QmI|KkJ3JTTTjpO(MDU6UKhV&mcu z$P2FPDuYJ(WrY&%@v1z{E3g1c}S`Dx! z5zU*fkX2L;HWKK1^iPx-Hnh#!7<42r5AoHVs1jD!a{Y5G^ZX&3M)lz7BePmF1LW$- zCqt=!KeXLH{;b%*(E5NQsU9{Fc(`0e4^SVuIEvT{^-Qg3c<@6yg`*iik|Lw~v8y~C zi1y&q-($2htbZqm%~nXSHV;x9$Ga96mhS3h50xI0aQPezlyJ&qGSW5wHoG>RF6Nsl zEjOKZ94?mHraD-dHS>rMRY7tXw;Q`)avg z|8Uo$ccN6LSE`3+{spTz;k4_-vqh!v5bNEbL=kV+K@K0=%GrzW<-{fyKetLa zO47fieEyEJw&yC;Q5v$)-p5$@&cg2Bt0O^*I5IstG4R)@20h%yq`tuf4toGrmAS`N zX^E{xASsm>rCgS`bfBQN(x+^Sy=0l&VBBjap2S99o8${@8SGdN!UQkbR9& z>wk@D0`7e{YAXgv#<2#2bDVOcS6E|(@Dthb@0e0`>&NlFozbPBa`phQA2(}5U%QHg z$&z@BYuE9=Pwv(2ZC^tj)n8V-@Y1Xg#{UAL*N0S307`l^Sl*4bZ2ND!Le;{yu2o|CqUnWImaKGjqBk8XHUUgeDMhPglH z=cFmeNLr=pO^>qnZYpOX0A{;V+M zKCU}B*tf7`;fWK|@>87ZL1+K+d8Z(?DP1};zVH;}9Q9@_KO9)8>wi0ma?^XMt)Z(s z%P;SgM`gEvA=GMi=mRs$3uIhyI zro%uhrf{}@pd3iNjm24JP{7T) z26NWReHWsl-T$_w;r@DUuls1!ti40U*9|#{j$K-aT7qH>T-n@eBc~|`dnIxXyDrZ+woIyl^pm5IvmiS! zjk|IQ*_Zl@b`OyTQ$>c~D zdX~;h&aWs%>Rv5~IplM!z9%T%w4=z>7pc`NY@HlJx8CvIVSrTkqxFT!uKak}vo)eH zEXg%72AegjN^uMC^$c8`lBbCZrh$Wi_cO0}d|s%fb`$mC^4%9rBfV`tYT1Swrd;ac zo`)ZVNBwBxUw^Domv6d8Hhm&o>dvn4O?b=I;0=DD!M0}8{F|>BN`}KKBR1?<@QEVL zy~Mre9o@(4F!wq7h`sU5eR?$kb9|#-c}mkdCED;EX^=15nU(PKNT<@bzqNszwqGH? z2)?Z|2!Ka~uof1bvN981HZtd2FZOz>wnEi>T8&8wo)nb*_O^?)D+tnW>$6leEGrRd zjYO~+(EBuLABQUDJ4-qE1ZT<;-X)V)@4Lh^pTm5KlX7XTynBm#*g-GZ8*I=7w!Ru_ zv!PzNv#T8J{Mpr8eab12t^t5u_=C8*Yc{vrU!lHp&!fd>f!@tM%qy*d$cyO`_=AB# zFK4d=N~3P>+rcRBJCtyXVu)#xB!lyGUJEIhI z>#4^aj#Ucb)sK7;aZe)6KcQSYgg>~e)RJGNcWISJnao8t8*asmNC2pmQkeH0TtZ@v z_bYo5hvvnjBJp|5UHWjxyb+0Avc%3%d3Rm$%piIGcj3R`C)x}7+rY(eB&pM{D(u#w zPXq4pHJ>+NV^%m^A7uuA27a2i{cFgt_M1it3kf|d8(bn1!+F29jeBTsyAQQpksC=O z-V*yrsGq>>$D2lN&JR@Kb*pVeXl<8~S9As(gKe2^)VrMM z&hL$`U^!$1yYCx?IF0L8@$+^ij2m!0aURE$q^97VvpfcU+%dO*@0T9_mp+sH2v<3N<#ju0LRN;8h%8;eMntG`pDdY*zEz z-)33}hQD_qK|xjab{l%w1)dH5xBm+QM(z(Ez@Z%hAG4IjWs-NsFR0=7Ukz3#p;B!S z#AUl|ssBwn^FPI!kD)s)5>9+J0xxN8~EPB!3MPkemzcdflXjouzy*u&)9}Z^)wZDlaystr+tE%H~ z4!s_x9arrov&Uf$WCN{aF|&J%79X<8~Y>anf=MrnIM;GnT?v zRjctx9R_wXzs_1!(fU(nnKE>~RVp2 zY?7Yqf=cNlUC@tlV?rqG4`+0aa>8G;@92)8Enklj?&*S;llYp~7U3VkLo?0~c`rOE z-yC5AFGPd7{p%YH5~v+(91NLgYIf#tNYyST(=#gqe48P-luvQ{D}E^~2t*=!%~p^C z%rK}waxL8leos446bm=IzezS@F`q))4>t&`!kVFNvy;#m<`)a~m^}x@ zW+Qqd9`~Fy!J)S*{$D+^F$QO6{g3AYE6VoH+Z>Qoa>?GojQQ)650ZP5Oo!fa>lz2k zH~kh;oM(TnR?8h3GAKxC!g5qCXca?E>Lx2xy|&z?*kgP*M=y%+YHiis>iyOM{k{@a zL8_=k_5Cu>m2Qj=QD-<}eInd6;<0IjD4K}OvE$M6XKXggBDhttHeoNVYZKz*(GDi% zdE@FLDjn^cBtl}|%VhrX@~4`Rn$zq8C{+XLtX?AfG-tKlzWV0#cQDWr-PnVzQ~A_i ztvg}UPQADpme*_Jp!_J=7IFw=9cwypllQ&~t|_2?ggQ46x0Qf9|{&=G#Rs%|W(q2HDLJ$PDgfM@R!R zXrMnb{&gzctSu1fb`uilH)n%p@UHfB>ES&JebUi>RdnmIM3lH6k4kPEJ2f`EstP#p z2069N_XF40$4GiK44^h^1D_vDyX4&(C{n)!0uaNZ%vpkW)X8x5ja2+owp_w&21@o! z_h@c;IMiSFlSh-C?%0McO>^Kvp;E8g#!rVGpC95N=1u+=D2A@+Yz7-P28BsMk=w7V zGU&+D^3}VW`&`!bBLrf#iiUxZG%P$S`U&e0LxEzRtw8Fy>Qcc+63~=;%E#k8W2@mw zxlIskl{YDKJh>I>2vQYAKUog^@z4ME#T)aiZG~g;dDwNw{dO1hu=gH@p{a^b;IRmX z{y<}3(5+)7oYGS#e|5nXp*&2TxBahp`4VAZ;#^{4VBk<-Gz_`mJ`g)J<-hvB>uazJ z?l_XoUgEs|zv~-{U*d?RCa+=Bc(Dn-=#V`YXEMb2f8SpYER5&Lu6hiOu9*b z^5zNqNA|QNoXBNISlfo5en5*oHC@Xm-@n-|M?=@^Kgk^0dhbtM?vJup&}U)5-8mdU zrn>_svo0%v_bs5iN%;NU5A-5)AR_txTHqel0Bu?+7e(*!-J=22S}bsPWlL0CqkGx?9t@Kk0?Fp}Np*Er_eK`|XED*~^K| z*HB>L-d_W47Kp0Y2N+POn_*Z$U`;gIzY1}1-xXE1&qK6~S z100N+;iv+r^Js(iLO{#TtM=iunS;9fTh{v{I;X)=)j(*)>zn!WYm;o`;^yhc_Tj7g z#k;k6zgI1dz~;ieNlTbvd;_w{o7CO~zO`^r-E%xr*FKCoo4f*M7nkmv7Lt%mD$sI7 zi^-^wNlS$AEYNVK?=9(oxC`^U20=3_rB{(g%a9`^>c9_ru#Y}#MjU=`;{@N#&`uu1 zkCzvK@|LaT8W*S0#n#yda9dg1#}-b+hoi;PiENC~9m=+19+QV%K(e!NiEy8_!b z9d*08zJ7hRG5ZSoec9g*dAaPr2Y%+m<8gm(TD%N&qXo0U();IEIxvLn{n03Jn|y!P zB0Y7$ZGANhy1Tp~h97L0p-?Y<@zd{Vgw{1z|L__=jT(m^A-`WX z+uUDGHOL@tk7G*P0=!1$E0CkPt)w%kcGyAiyw&!R@Tt8+`=tQdv{l=sp|( z+R|Ygi$_1(zL%f9E^l)hVB$*mtTI4^AgoNYT)bKlw#TQ(Hw%;ZP7R|gf%{2|Sy!j6 zs43L_J^6VH=$L#9Hj?a@muitFV%)tg-A2C6*{Shw5 z(|n+-K%ny_6ztYg+t9WRx3<0*l3&c0>r+rk2V>ttnxw1N3x zLzovz|1)@y7vHkQ(ILPA4S{U5<~w;SGcL(Unbk;v%de z)P#@d$G}XJ8AR|xz@6LUIFtQlWco~ll!FrI_CiHPqGkR#GM!wgmpGy8*T~M_qBkz@ z+Bsg^!IB@l)Ip{_K3uf?@hT5whDt5P&Btb1qVL*H?_{>Y5dq?}C@G+YN2X$Wc5q->V( zL~Xe+e6NN1*FUypCvUo6-a*h_j|GATmvBUks0?pg7fTV2U5}lYUbmQe?_5dlNsH<% zRx~}4?tQbUd{lXZOSO2mp%oQyW4?q2!$twW%)|3Blh&|3{>3m_<=4x0;@=~OVK+^f z&7W#D(qJ&!xae`ebfkns(S$pb6av)h7YNu?^kfU}DL5*^V>;y2V zCmiWTWzM|jJj*AVW@h`nVMufVA*UkhyDVK#I^dP&GkWM;e%B0Jktt1z#qVYTYagz_ zUP4D-!^y!`M>bBiA4fsx}_4LkP z+D?j7-;F#L+hR@c738#|a9P0rXAs|J|KyR>k;-r%gWvF1(h=mt!#eVNt9%EgLpAA} zs-n9Mc}P>fYzd1|CAx(Ro+by(Cfv*9bTW-i)G!{%m}j@WeF$DvpPP(ffn>*RJklka zSU&GNXCu(J;&DF2e?bk}2bx*svtZ|g=OWbN)m&Z*FD^c;AbtgP6 zX=O|n67z}%PjvmMvQ>B0!ntqU$&kwk_0vFIniHdEJ7h}I*w1NmbOg`yg!0A`9tR#{ zo7&>d+>#~srv8%F+|IMk>J8Q$($Uz+Ye&_pn+fcluWKN)vf()b0LknAE#g~u8sr}` zTbcPNmOk(MjuQRd1@aMWbgOMg)(0PEcF`d6$Fh^B-)B;FP^Z>`40NLwFTAi zSk7tga|d_*jf3zuVk6dxuY1rL*xfD$xyxaC<(h<75+JC2f4oU61nk>%Gz%sgOLkup zkTPEGV5#4w9}$ND_%DSHyCUEsDhdNqpuWPl7O~C@;X{Fr2A5KO)m+varKb&=X}6EUZXd7+`OsIj3os;$sGv z0ZA)&xAIN#r`(Ld>)o?<$U|wezzpIvB@AzeUSo&!XFC4^uE2r|eON`MyK9L@GMhQf ztcgHzoe|hcaH`Chz#kz)(9|xBk{^TKGF|yK>CE#3Vnvh6^J)BFZra8kraj zcYLy@O;0?5?J(Ua2|p`er0pvLlNV*YuhY>S|~z0g(!~lHWJpr&h;NIge;9;6jW7x zmQ-@XAn=4v*kUzjpNzO8z})0Bcv2pcu$;P^O*#UY@Zl_HhKzLV9q-&IILh$N&Wh3S z>tR8}?^ffpd0Z{D!t^ZpMl*zDl*qX~ z;4uSbMyuHY>u*H7BGH!XKI)c_-(fzqq}idvt#iwql~K*Z_EPc3RtELx+U}}=8^mp> zPaOmlZ%K}E_xaw+1rvq*!G5u;A=#%((vIYjY2_z<;+k=NCNXv(gOUyWg1so$T=zBC zwmCb5NOh!l=OkLg;gV>@|9V3S%m5L55g|20)jX9WfW^1+>dcbZbbQEW>+-&`%?3uQs0Itrd+wp7CjA(9&r50YGu3Y!G?f8}l|B+<%rMxw*%qGwigh3mT7@s*E00y}T@z&to_~nG1P$V=l-TX1D-^ z#FOIQ_zxeOf237Mb6CM|2qb6nCXpj@7{;gY%LB;xF~%vF6)Z5xRz z(``Pv6!^U!3OXu!T4)-HO|yQ^N@JiNIU*gqs!{!7m3wz$gr9&luvIXXN>pG$W-ArI z-)|&Jx&s3%=qU`FR#o3~-(yRq?HxdBgnzC8<^L?1GBC@~be_^7L%Ku)dHxLY`0D|r z(%>@fpX-wv6%68U*n1rkG!<6NSkHN6Q?Q+J?U*D(!yy$l7}ez(ot+bGp;q`Bt%qsNVOZIaEXjV8Eug&W?C*}cg}uq`X!HPQLdgX4R#a2`El1Y zTS0c#!}kjus#(Di(d@HDbPhE8ZhhJ|Zu6=?zi3y;9@D5ev8=?lV+cPa*}(C0W2hhU zFUmA}+e_H>$72LPT{;{kj_2%V77@8G`10GaeJS;`ta<2x41s@W;m8M0J@Se}-Zl0} zvZiyf$Td}({?*pi`Q29`zzA%RKy*}hhseA9xNo0ChHrY7;Cdh5-5lr)NLGpnP_86; zIdGqoloF2%rLx})I&Wo|O)3r~*C8=>XW~JKN-0bcMD3u#$VSEj+%TIh zwnk>c_RzCDZiU0Cg;GfadSfva? zuGOW=>K$NOa=vLdB_mCIA#nyNB{;&c5S?%5MGE!VjVz=K_ySTATvWSxDc-F9BavR$ z;+3)iw3RbUFTk7TT>^qq)xluUs$UNkESC(2ShXGeQ?%I5dUV!KiXS8TNM=3Z`-jo& zak>U5}F-`Hf*S+^J7CUj-Lc@z_Lh9CM z?rm+~U@jGP6fOI)gcK8nD|zaT2eD#0QK)2i!EG>JX}N5p={&TNr8a0(60+x0S=5^D zB*S)o5w+uIgCURQupGs+yffa_mrEA&aY3c|Tmj{H1Hhv$h$7Qk@=GEh$!r8EvEQ>I zEE$8tyqR=%j2sOS=6c#cjzKUj8N0N!)a}(JqcY;jCDKyHRGZ#$`Odn>3_5zmdA43= zT$=k1yDH}0Qm>)EE@&&7P1dRR-3*PhmeYBRiU?|xQ0RQ0D_ij6vWhWg3zv2ox~ z*(*~?Fn{yv zz{100YBY&G|618*{k-z{<9#kQv}2^lQskkqNX z{x464RiG=u&4~=v{Jt1VZ3EoV?w@ePA;T(#utIX}bf<%n)gx9UUX@MX+&h0X!})PE zD{;M7Y4`a{__ym?ZL{1J%QA)e{!Z;I%K<)2-skz#*t`P?nFQ{iM&d)XEqk`@-e>ia z{{p1&H+v{B@98^nwZn2J(5{HT^e@*RbG40Rq9%S~3y`quSB(0(P5n*T+eawAGD?HU_;e6nZSIKkE8Vhb7i9(!M;+e#>d88; ze&04b>gaL(=*x1E`N1lArukU=dS>oUec;87T{|-dH3X-EC>s2WuPjPX03p!R4KQ^S z{VrBK4Py{!46xm|v>xa!vD~db7~97Dclv|p)Zl`PkQ`Luz-gIpljfru@UgIB)>98X7Ua+QW|OEYu%kffEfQ_PAWK@L@eT!TYk4k1#|7Mi{#Q z2MS8%HpoFh8l{Z4L>&X4d%&V8uz=v9-@ZB4KRqJ`?6NB?HP2H%goR^!;EK-*Rd&bq z%vn}|g@v3=Tc@$IJ!OovZZIqU%<~LL=~bO=ZcGMG{#%=7a@7c+c(s`Yg*|`Sx^wBL z%R740MB@(_=U0p$Lw0T_igPFZgA~O*Ahy5q;xPbE#V{Dh<_)hmSCVo=MUziKuBsO*( z5@1~~^|!s(ubJVfpC}vX{)gP4Lw$+s!468#v{Y9XaJl_O$!DtJ?9F(!;0F0ybs!^E zytOa$`c0KF2nSlW(dShZymn2#&E#YZ-YY-tymW-ib&2F(WOYMQw@fQ3@)U=I|M+M6 zexu@?_G4KPyDHB0h+$FM3-hw|M{NZT)-ZQ#lB@&=k)GjM*x zfI`mSO$r(dB6om$&OSD){tGncEF^aL$-YP z&PGHyvz~a;`!ILq%wbHQH;;c$zhV-wWcXH;25O<)mqI(L)@XhoXW}f^T;wVJm618; zuC&_DaqnD}6k8pmV_=~~6Tk((tB>iT17nC{|4UBfP3qMe2ULBQBWnz8K%>+R#6q7@Vs)-xlD#@y zHtuJ0*$?K{2X4z%+fnD&-Xwgh&vF6LO?D49gjplHdK54I ztS^g?=dOt{!724-XsZ1$j#)cB+c7t>W5(c@n%W_9d!fjMPaN|8uPlZE- zZVqplb<#!+kD0T8FTD}A?h!ZsC{wP@>ZxH^VCIesHjbyHbTy7Wpvza$(tFFpl4Cu2 zkqrBq%@va_pjT5O7_;+MoPwdlOTFo#u#4-7h9x>?Q<%+&h_&qMjziu^VTMMmCw zQugI+Sd$8045kao1u?vO9;WvDI-NCjg`$wmw(x^A-LiXOn$PDbx`K9!*~Y%l(%JY= zN!hS}MU=Y|1y876_QPIf*I0vDY9)bh54nG@9(#_C|a`$ZwA(>Yb`C7wl*dw^U?zH(W zg*^hZV_d|!^eG`f=+*m2G}zx-h-)%Fg)8*fet6mW)V{wjR}<^J3xKkj0|-GhF59Zk z`v5GE$r;af@2T)IgXI8ClgnzOA6lHi@p+J~6lbwxO(C0ao0s7VuFi)^ubY1l;eZS=6*_=e?ejn4-#S| z@U4koNC!pwVV`PkIS!m@u}&Kp?RYeqK?LT3FL{c{lR$*_n&)^=Xyz*)x@Uh^;5lx(s84A7 zDaQ*rAiKPLP)iRDem?xZ-M<(uUN-qVUAd1+p@!)CYgo4{cBZpT(@Fw`MddL7^4 zogRxl!7%kix5Pmq#O;4t2j0$Ot@Q7p!NZDl55L1YuOo|fODHs0*z_PJK|^3^4OQjC zc|uzzHp(6-E_f`*QI}}wJN~ZG2Oq0SIS%vObH4w=!gpf%_ByZQ`5~Asu|Vnwe23)v zd#GjMhUGfX#~r+$z#{!6dMvs11#VY3dDOr${yA3%?W!^Ov{Zk;V5!eh<0epBXV?J1 zSO}vX>d*0w9hn%FwTD`b;7d74OZ-Y-;Tp6axU2oatRCy2-FB>%Iv1RE=p$PdGu#u_ zSzfZV^KfWX8SJq$Uj510GoybyE)beC$M{e|yA0zT5$jO$5yvXDz&Zqv<1hcj##+Y< z4UcT$Q4e}PNlAZ3jF75@pRini55??ENN1jZ!Vj_0u7j3qY`OiQTdj}>WzybrOvB~0 zACq4gk~`e{vWB5bxudt#>=&v-7a45rEkb_Y|k!$MJi;@NVo7 zu(x(JxoT}*D((BM#PdB;dChRocH~#y3$aVc6tR8Jfzy8@KB-3ytoit=M+u$tj%+xF zHJ8wG;?q)njebiu=Fq$of7coWcpb+MdN9ssV!$6gGt~I7 zs}Y2G9rAxEOh2C?rp5r?V~8lxRf~AvVzlJX?L5nR$zqa*ShUX;EB^apE283lR4N^VMWa0uU!HM@*6+ zQn~k8Kme<8l#tyLd7SZ$b>t`Ge-6OK$OPHVbjN?8%jr7p$H@ERYW*U~PQJ6Li61+;z>m?*2$VPl3i=87$a11v#{#~ij4s5vC45! zJ}bQv)IeCIEB&(7%>=}b1GoXk)#rOQ&W!){SjI|#i)9MyFpC+WJDx+%XC{0+F}3je z^zVNfXxd40F-YvdKA6d)G)d%;&M?S%(#=73`88zv0@wBFXvs(P)`~M!mnr4x6=Kdz z&zGD0h=GgWdMWq6FVxpb9ug+|!Vp6>-JAZDu1z!ePXo7BDm>($Hv`sCg&=Q^Zh#vM z7gwCQ#r?(m(KJIEwSh5*vQDzksh#H&+ZTVM1~eCjo2DpVHr@pkn7kg(@viksi`YCT z$l`t6YI)wQQ=}~!THuCJ7Nj+K+?Rxc(09_M_;`n21F!l#2h`rL##G%U^t=_P<}!iA zFguJ;@kQ5}xe#GGyDtar?UIRdPNf+`+^Vb{@nrdh69MW&aNXAa6 z2&W6*>OS2_FF59tZ+U+O_+`3c&z;A)%$V{=ETP-x>!^5!uV;IimBi)?D)*@X6PwxX zOu=CaGch1t`aIs1_d+nRtDg_A@%MjyzjAQX_F&*>h8gK&Vi@M>xlUj9|2j8rFETgZThC{-Lr(=$PK+O)4(K?B&N(9X+DovP=EWpMqjSxOjN9>0T4cmo+?0| z!J#&96AA!%_=FHQ2m_LI&QRn%XCRni8c-Z@=9Zz4956*tIne5GyUd~=(zt)P9C*Iy zMl!Cj;aOH5-y)aYjD>z&iL04aA5H$u-kQ~b>wyZW`ZS;Yfa(IryQ-k3=HXi&G9 zrUik(DLssMdG{DN^~^hs?}cJwuEI!@97Sxn{Cj&tPg)#yP*ZH~%wjcL8rZ9>3~TRR z#EK$$CYFK6A8ho~I9}xe%X5F09)D{AQ9duy*X!9;YKj(6oliZD-aIaVjZ-Vk8(_x| z4tbvg9uMF&WF`&%$?e1Y`>-2QNVX=CD1*`s?s0#S;%ll^PtIMfh=M#CK4s?J1w(+FGV{jK3 zi`N%_C(cb-B_l^^cJEZDBr+W74HCz_LoxIhpjC)coWqPF$ZoHp!@D@FC=0le8vuL` zgRzk>TOTHNp!wqN{j^eFFY04HNRa|cr1@yx0q6`c{(NMBoC?KBe+*XS6lgfSATw|9 zPp~5I*J%Ra!tp`->_2}4_;_3^&X|0glf=BbkPOp2EaaNUQ8?~tTuID{yjYfn)8g=X z_t@HBBzq7;Ac}#7b#{wweOky}vzH9sKSsKZh=l4ZK>(^Q_ew9ivBv{H`k0MsByWGcwuu39{(%ou~Z*6!^SS zUoYxZaXL|o!0{J$g*U$S&b7aW?2l8`FK-##vt=xTjC6mPZ))~~F?oLDqX~I57xh%z zIh~Mwysv3$ugM8H{kxHnlLW5ZBx{rwP?qO(hCPnH z5M96`GX8($#zy78=9A|!DXk2S!E^9JW!KbUmFE{03nqif#`<0SyS@PY-UKs$UaMc^ zs+&Qz#ATR#jtLk1U2@1<4yk>+zEnIL-eG^oYfBYR5nJBkUVM-Ns*vTQ;}Peg)F$6s zv^)aam&sL}%t>61mS-t9ZUmvlqg>Svm;~APORs-N%`ZeAOAeDFyBc#TAStcv}W^Hu=DQ4b-FWxN9QYF9Wb7hVb{sEcL%@D zJg>vK@;D~mk-xX(t9t^aukuofbz3jyxBIkMU$1N8VzF>H{5ytTcA`K7<)DyUg}8g& zhf;s;Ey?n?YkbfuFy^?9R%cZ)=zVlb!dP|Aagyaz8%JW<1N`P^4 zkrOpkjuOYL=>2T7Vf;F9dT=|DRvkFbF|O`lN-2TkOT&HwLfn0}pLBRkSVOhW`@M5aq_&zvofEPA^rNyfqtq>SU7y3Ig5T1){jSq?i)>M1A zj1W~Hq2BU2xR)bE2B+hAK^i^>qxkR0!Yw1i}h@}+LzTUoU$0v%Ni2}v>3wb@rcw`@2ieZV2=Sxp?1)NIb zE5iDinpGyDm#fmukq$6+kIiNX7{I!7L2>PZ%h5Q1V`d`Fz~wTGM2DbZ={BE? zc#!=n9Y%T9g#BR0n_C@ZjEZ5|yarchyR_3CHqjH6K8%-Nd!o^Y@X|WY|2}_R)li6> zC8bp}-q68eg`2Zw|MfELFQ2jCJ* zM*ARIfX%Bup`iN?oY0DEg{W1a@$N5}W+s2JSXc5sbSar99U7z%u*er?U5}*cM3&}F z2{mtX!q2HyYwAGD)9Vf{M~8pR;|VpJceMF4@gY-xT^}!yLbNUmr7-da&?o?^=fFD1 z7@e?;RhujORtQ6HT9D~*?9-TF_c3Ze2({10w$9iXI${{F9<0b!=6B#G;it0wc-2o+ zt+ltGR_bdYd>N+)*sBLG zj}Jr&1dUIQ2)wE-nkXimbXDzdlbFt{9-_71C*_|AzUo)bt`}}CRqb!=`c4GfQmypH zu5Y2C=3ijf8~?eQzDLR^bXJmdA{UoMUAynQ$tX{ArTweQLrs6Q$49%cS+A}y6#cuO zCvr*uFWXNl-x+nRukYKQ;Y;Sa>3r0#$cMT%*ZK4)uVKB=RKlsA!;1MeUCNlvw(>lY zPG@wZDGzCB(~otUfOmwXJKK9w<@|B3M~)8R(`x-9SKSEkB5H#WDQ2Jw1lube0~aC4 z`abCv_KpNdRz-l;I#a?7t10y32oX*39Y+ekw@|c`Y)^mXFb4WFxE_#fG*}YGi*c8! z{ESwV0vUz3W*#rO&OR^I*BCfavtZuUrCA27!Ac(CcQL(ymTqmj#SJ+uv9&&k7W&sm z_+HFT4hrpwDLbGSvqVqc@dJ7_As;n2u5z-8;t`KrY`%JtE4wTpj)3Ib2sjOQHho zk-~jOUz-%}cbZ4p*)lpbgZ-FslP(^yX!$H7bA5cnQ{o9R3WQHf_4TTbE5M7u4NZYd zV*?%)8iVl9s=`FSJVC+!0eCB-z|R%WA6XvpB;ITyxs>CqvwMM-NrCZYbn(9 zrAA%cv?DccRI1^Te>rHI2uvnuAXZ^)<7p zE$UsI+UZI1NlmTvQZUs;z{D#?NIe#Sk+C_4V*xXrv}!adm^W5O(^^OaK{GJ88iaql zjzJTV6_EYi0mzulN62T1JZ!v4rFq@`1=5~rz2VLR5?7TxqOF~YKjX0>6){+3>Xyxl z_7Y`riw2TE6yg5h6qxM*;+5T-dX9q7`#Qa0caLQAS3x}$J0TBJ-6p2J@^}1_71dW% zU0H>=&l6&i`5o$dz%ZIDTbF>W5nGx5=V1&!4GYX~n}8Xd03UG;Ufter|BU(rBZ9BQ@fX5Yn*5e326>l@ud0#7D zC&u#$8ouNKLw{#bDq96p&T*`m@eVh;D1EyeNdiOA0Gl^&miS!&Lh=5d)_^n2O5gMm z@QX6f&X5`gwAsh$%RGPT;B`_Ig4|Kaj+QKYHE6Zvd9BT2V|~Mu5ME?yh7B~kzCNE< z=x=oI&pOc%-xulY^?clT;JH$*hh_Q?@Lts`d>Jo>g7=vx@d_v%J(^2;*c7J2asCc0 zCyu|qyxx!N!bo=UIRb8z)i9duNq}lQPU(sw>C5Zd0?q2N0TzFOzAXWq!_5cceI%M6 zjuk3ob&F~u?@)+DhoGIVHvdE&j5fmfQLSjhT<;^zFLD2{j1!@5LQRd>u-Yfk^BE`0 zAh;cUEGnmQygDqC)-$vjB&_qy$q7HquU^8z^LjDbz_ZonqapaTP`{w1R$$P}$;w>G z|Ac;bC7^Q%b5MUi$kfV+0$1O~4=M%3TFw7rf?I>6YI zU7|O991kg`v3g@`qSNK{7O0%U#W&;^6_AxTc)WdhR!FuIXGY&HV=@yPGCkR!IKZk8 z-ixMkp=m*5?04cSGcmVZ2j!$dQhXv9OpXQFubiQ2k zb-4o;8))j=Q-V;hJl$T(fge}t7mRd7cZ)9!9Z4oBeaY7GO$XlNHlzp@*d1BT#l75+^R^+K}W`fiUh-D-82i>@LZaFN=q@jW0{& z(R%GVSAKu^ROq2v1EV1iHS!$lrE59=$igIx8JbRZ+x&qDXI(?}D zo{u9>wtj$Vv+x3RHXajsT+@y6j5)Uj#*XU_^&WY=9P2ImL9$k;82GeIU!&Yh`#+k^ zky7oZlA0Ri@2GhV8yiJvH9XVL`IyNeTHCL{#4 z@3MKnM%BKm7x}wtZW4LRPJ?_=CD=TXiaOb?(;Id-CAb{>ZAh?cSX{TIvtre{&d?Y- zD$alQ#FRS@mZdL&l)OFT;2&!ii6w--pH}MYMQvLDm&fHD7g#FRYmJ{_j2E@nOFlcz znM2HYp-Y*m;I+(Fe_Uqw8MeaRH7^Qou{&VFkx2&J#{8)I8Zb8`3{*XRi(O`hU-pR3 zniT_=Ld9+Tuq@hn9b| zv3^7Qb#kIkDXGzYc;J;|uVf(Pf7ip-D$%?@@)(mFJBD%rA8EyTM*Lb~ z5vUY&Ce|zSP47Ybme3gND%0j4?d6(bJS85ZMHu^K=kYUeYT^`uR&I+W>S_4wK1J6_ zO3K*rYwGKX|?{ePQS=k z$KKNcC55cwTu%IE3SAi?He~lBGGN_0GN&4J)VXDxKd*T2E(55`fwuO4_)$|a!Mo^9rMK_5@mm{BeHF` zJC4Z&Ga2@*yP^?QN&k5eFo4mF>ob6P#a?Yi(}2*G0?vMCs$Wy!IsO|~M4K7gsKLkv zizgqv5o8wkEk-3G-^mncHZPdYapQj=+!arCBA!4$^v8cg*Pb)F6nemzlM7s(w``bEXN)E-~1m9psyOMUH>0)7L}>#-vKKYu!mA zDK3gJPOvg+NR$t;C|XyZt09KuFe>UpUdKxocuuTaVxdi85$}J58NRl^pWMiY&oK_7 zRFYGt1Qa*Z{AlMy#1QA7Lz~fE)DvOM{xb+hXUaS3;dOk7lPwqw9x~B$N~o8O>#N#d zZ0I9@MzgI_Sowfplz1{(bCq$&)^)nW{wDC^I+aVvh7tD=EmZv?%JRj6$sPZjmD+ed@^(@J8z~2 z_I(fck<`J)xfsd0R#137(aq0Gb*#g-1m>gMhtY~4J;%cKxWDh+{ z3|K{VGn1baxsDUS2YUhixWjPXOZ&H`!C{74em~B`!~8c!z36B{R~r;F~u1g%P&o>thvUI-v+)B<&16w9P1u)a>VoeW0AVYbkfK@^~--+ zo-eu0J}=hS@HcfG*;bF{u%bUXDDe77>~*WS@f| z-UY2CS>fZpfrEsP*XRL}HFPCSy#Cad$F8Q7jvCCr-+6u>t-+_&`UO{=;&n_r8pTW~ z1rY4>!e(6K z<$oO9MHudRX&oy}T$|Dvh%JunsQ9<<#cQ=l~Gacx`HnCr-h(Kh1rsf)*{5Y`2JO?{$WE#aBT`87;X7 z=bB(lzGM+bBV5)=+qKgD%jV4~{ubB$mA|Y0hDo2aULt?vW}Y*C4Zw(f zELp!aqp2bO$kNrLqcwetMR=9RIHP0q0Ozn$6HY9186S$i0(Bq#A}@_xx@|mfKdsd- za_p3-bTJ3^IKJLu!G2gJib~WHS{&=cOJ_1HfJz689^(6|y4w%!?-yIKuFS0zk6@DfuoI|lQd>Vr?~^b5+WCjh|rF>rqr&?yu&%yOzM0x1sX zd|K;nt#ORZDdYvxj1hVo%|bl&h<)@RU-S(u5=Zq6@(l%zZku!)^`w&lDPmgaVW1;o z87F-23Q*1t<7i9smnQP32bEvPgE%>a7Y@mu3s24o9F|R-qY0g8a@CK+D&c$Zz{Zj0 z#l;|%C!v>YF)V*%hW|d=CV{5I(c==*MXooIKQi8;JYLCiIOdQO32MHHWm1e1g3fH? zswUxIv2zjPss7;8TK$5v>J9K<=Xq+}Ui%iYSv?_@`v85=OlWt!iL>4E9b5CESr0jD zV)ryJ!9(Pm_LSS~T8|}GM+}pD-Jjds7{`vu-%)qV0&9Ps=LUNc9l6)}(PHP{jfv%b z4|qcSD$mzr#;PW(eQp!F5+GQ4dL~E%xzT%c_&%*A{eg-ad|8bdc{pGbO{q`WLzV~m zP%)v>Lsp0D1QhOV^blL_=!;45k;i2$s2R~7va{!T9buId3u@8{o?ll9MQ670SqrJv z)b;qY>+OH1#rkSpm+6+qTVV#CcQ*1yDqGZ@%#FM^3?iQa4wH2#?oXR-)AqHb_+*=O^UZE|D6hqZqqLxstOb>1h<2nP^XEyHRVah`~&bb;QNcNi$J>o1_;c%6{sy^|n7`rl!;T zl{^t7#;zWRKd#c3>nUd6zsyNKc1Ns7R#2wgE#}3&GR0`c;5K4K6SS`ge4*yq zCIo*4*Jdox#!D<4U-zCwA`Z4xb=o0c2!o?OQB{ZX7%ESFqp`mtWE}9Rt3#+1Zx^O? zCd7Y@VSqY$qAN>;Cm)?fOWb4LBxRWSj^6Tq zo-kQT>2e7YI0>YoKrHU{%bEjy%LEkAT-78&6(k&Zb+z5wM)|tmqn@qGU485@?;r20 zBr}s)wf(#9?w~)|mn;QnNmd9)*Z}yALcz1fZa-#G(_JS5d*EUofTV z9v6Ol41^PKP35-H5Bh|Ci$s4m3?loXsza`C3FJpc^S{c>G4t)2gNLzBQzI(rv9B3*1#r`J*`xqK>%lfd-XNag z-ApVp8b7oq3|BIPi(r>k(0p0DJ7{J2;t8l9$$CUi8M=oBLT&P!HKc#&Jc@jO9ZsAa zORe(j_)I1T6Uvp^;&-j?x;QrkN+WK_W+HTST%VWf%T=xMNvLRR_Sd9O**@7RO{_BS zQ9D-SzK(&K$wDL`T>XD5kw@}W@#)}jjf#oxy;;@x+B1j?lTCM%C1`nHJWT}QqdA-8 zM^yVoH>%8nq2M{e{nvlKWlR&!3W0L=p036+(|%81Rp1}@)O}!7HAQhSb%P<7eK2vv zGp8%wi6my`+yE^Sc!lpupEi%*GBHVu?|cz&iK!pwsK@S+0|q#~0oWU5naMdY^~>S! zm!XQnZ8pqYCRO5n0u8Fc^2_$QbFF4f_f;rPr*D$N;`2&h8OlV8;y7;AR>}&=3O%QRqp}Q2ZDmvll&8CcJ zv@wlJ`*?Uah2DSNBacK#f_;&%7P|rd__W@3=k;Z1{x~TwF*8&fzdblLQ|#M?!p`J+ zz$}6KsTn$O%oG=c9|mn1r+H=YmB}HI&z=<1!P9yEy>usU#f|-kmHHAf5e5v{$M6BX z9_HFD3;@6cBm*fj000fCL0XLrU;>!liYz9H>&Run>s5bc!L6Shtv>*QX#%8T-Xb2? zI`dZ0CDOVnb~fC)btv|6QtT9F8N8%&c;gWQN;T5mrot>zYRBCa%M&080=}hDs>^?m2hwK4YM0U>?oqO$LWg zhkl|PM3iQ<-TQ3E@1)y4DI|BH?~otS|3W3+YZ7(E`mDQ|_IDOn_Td4$Dlt=0UzfM!{4w zHbO-$bypN8W=Wfxy08gCzK90Y1B|whAsqvmTn+=rquhL4qVhgh95GAE5o-4XcUXU@ zdnK6;6hLZ8>w5cD6AHXSJ`|ssU}mM%Zb^p>rC@YJX15qfT$MeUjony2PoS=}m8&0DQx2#T?)`a@ zzFba@IH2mC;OnGdhxEXO*iq+;_8b0i}^gaui(WeUiNM^~)hY7ZyI+uleMpgMnf&FZoF zU*XiaPa)q=hQn84Cir&CS{EouV|s?)R0JIv_f zThbW%NQGKYIt~;kuukmwfLrc%<-XpN68TXE*P*0FaUzwP#}65lt~bJ-NwWs={8CY* z7qm3*G9F0z8WKG+Gb2xFW6Xcq@pA6c#>z?&T)<39E2m)D{tknj6R5b5Z<7iL&e=F4 z(FP{;U}ljG(k!0yykG8QjFz?Imv>d+GH#KURu<3VWjUp-<%$nGhCyiSr2nRH3URHk zEPW^twAIBAht#Nyzr&jJ3hENq`-ztj;jPRUsi}WjudkLik$cdiYkz-H`aQCRNi|>! z$t358dlH0*RY^AG2llR;Wj*pbakK5PsrDp+4Bt13)_T92y~XCIS|V*`OY-)tOicv5a+yZR<)ry5y|qMDQpKy}!Z!9KxWsL?v?siqFq3IT zCM6Wyp#0NZ(`};V=@aw$}Y6O&ihyo znH+=p(O9qhJsIS0e;*u4#%PSq1k~dQ2m?sgZ8FR+D`0d7LsYf0x!s!zKjdLXK=e#D zewjkA7*Z+kxJ`dXh_A`p=au>z|Aqk;BOcyO`v?)ljSiH4w5{+?&Smf=h6?2UT?j{| zQe7{IyPJAUCRO6}je9W63!TX_4>XTkWIz{jXd@Z{8(+r%LG&;+FH^`(St&LH6d9lo zS}}HUn7BN=@)0XzWGUEtaWpXAXE$eH%!!4B2U_Q`2;F}{^0*coSUJ?$7ge!A{)nhc zHdF#BqxUXWt8eO+IWlCe7#gp*0K!^PgCOIDQIg}&zqi%HS}_KqQJ5J#p5x1?j61BA z-UHb{-kk8d@%*?@Uqj!dFo7FgplXseXd=yySJV13iBAlh^a} zLVb;Y@#JnYBSN@QrV;=E6Y3|$l{yowq70V*AW&o9WtJ-0ewBFNOoC@(x z25o<#-NG0AsG8kk`aIsEcM`2A*WhE6^}LVS&iV~c%&u4i^<(EtClqd_UPH6}s`d;y zR$RQSifm%t8BXibo6G4RJ^OgPXeZ^Y9>Q@<9L2l}L-JA4j#)swz5TRUU*lgQB8%Md zX2;;g4Zp@!0Db0Bw#F`6;#hozi{b^WBQt-D3i(9ssWvf0^GQ}VMrxJ3J(CzRXAFyX zOO1~%qvJM94G*&1!uU3xdPfGHl8?ZWAmE=Sf9y#arTBq$BM|Jd?2joiLPI`8 z9)5G_W8&mOBLmW7c?SNxd;5-q)+3u*l5nsrS`+D%DQIvP={7$$@}W|i7T6N*U?nx# zTr;PJ@*NZ92Dk5~pNBo3G}gRNsz`s?BPo^i`0s~Z(tb~OtzDYrjyN||97D)b3pQsL zAm7h>!ikGAp=v_=^L{h@x9i}C#T82+U>Rsnpma5OnGhejYmcn`76o8=N4%d5W?aec zt~u8d7|+|uHzISrnr&YIaT9PgX$QA7%$1$=d8NKwQ|yvZ3bL%gI7msNee{3ietM!g z(H#0_?Zdeuu6GMNv{?Kg;1;65W@9SCy~La>C5iMIV z{aAUu*QBLl_w|?o$x21`0U3WW3)GXnKszp6roRlg!?@pJmgkIx>>{JrW5}(lPV{)a zSM0`f*}jCF^h=LPu-FdfTNrOYt20+2zQKeR0|1l%f4^`{UWrV+!!Q?CQ z;`ynT1Ni|Ek|o8QSlG7+7%Z0KuBuGT3S#SARZWi$Q=EG7o`6E1M=O80^zblMy0t=^ zZq{)}_S?b9d>J5^sBH6e=zTd%(n;s4B~na48mDuEV#%hqasHhu(Zh^mLgRH_7u!B5 znh64a1j<#H@00{ELwa1sndEq!Tc(3nfU+~$Ve!;m@kqao30YDwT|&%HfO4+*eDaz} zn&lk4-L&BUv`$|m-?)GKz!(cCN!zZOGIYaw=~`i&YI{~!39sCPO)vBDJnkZc6ifyA zNcRaEXd$F3OQ3$m0#_uQO02FVE?!$Y-jV{+{5k|TB6o|Hnjw-cLz)jBFUbmT){iN!zs~Cfz%hS07ArFXxQdkf6+%1& zvsNL2ueK}x7rlp16IrD{Mt3k>ojK7+mgF*ZiS8iFEbAESZ2hv3K=!eu<1&$=ZXG`@ z)t9S!pggRxfRR#{79uq3{h@1(DfCW=4%hhQmnD=fkybewQlHSMmXZM!^`r4o-%~tG zQby@Ay+9;+^;Lf{03QQ5UISlXmyjcpIV`2P2+@Z#TB+-fd86Ecu@-!p63~%|dLnL$ zpL#MMv?I1AWXEt;PB9BJz@E3;TBmqI%&ZG=#NF|P4o^YsGGb4{I^%z#&Gt_HUi~rr zdw*r4r|TLY z8dgo9cu1LVEgrl3qY}aDG>gnIvGqNNM4?Ns(H7A@xi@vIw*5!FkbWRiyjzWnejP1# z$zFV17u#;Y1tQ0_gb{L!)ssn-Pj>OKz3uV&w)6+K?Vg;p;&HYY^1a0CBy&fuD~PzA z_xlLmm#cp_z0yR;;C_A|c#rA>cn)9f@x6%AmgJ?f2Ym9Ss}M|NZMelktJY1?Vc8r8 zwypyxe3jm#Om_*i{^oNPH#^%?u0 zrLf{b{9GwN#PO^Jmzq@;&Z@ESK27ql?u=&6q-u`^_i`s$cuSio=kyYNlaN}ndasjg zr^J6pxF#9T_l5d$NeR4>J67wxQjM(4IGs|)?qsr$8MKLMNnfJec|0i%kn43aBF)2} zO#4|>iqQP(sHtnruFwr~&O_drDCiE58eM`ez?`CcpeDlal0VLS-sh8pEUuP}OcokFztLl-cbuGWT@m zho$;*Rcq=w=x@t@iED}!2%92lF42`}3S}HMjtSN9KAvC3@hF4Wn;!5osCJV5-nM^E z<;G+!i6s%mkOknd+mM8l{HMrz|4uU}AomjQTM(FqlHtNQ+L*65=~creY5z)Z$v{pe zGi?yNy_(99^qx(o+%{|Dc*m|(Q!AR$lU;!KCtQ_i77VvF_CK!ie4|bbQOR9bt^fRjQ=jf_I3SKkHhnim$d%D7W??LT3=qQ zt0kF5dFf?GvN&MUyu?j= z&uy&NG-}t~SWWo;6Fb+9l>@ASOsYui66SlKn)hysrj?ZVfqtMTjf=HCJ>`Fl9+MHj z-7T&)qH-)T$N;64FIYLS*kbA`VOOdVf!fhe&!K+XfO%p901%eO;Q6its5Qhut^fu4 zj`?Y1EHmnItPp$3REhGqrH+%VP#8Y2+>~VPS|<$`o&g}G&#Uw`?rkXn(o;gfTH|I> z+r#f4I@a49)jiqxd;U&7`LNB47=9e_Ka+rh7v;lW0>l1&AVe6)mP_9N5bLYH&&%A#Xv#zp92OhDa z?jTRbenFK8vq^F@y{)7iCLQkvfc>;mU&CKgznB7^Ok*aVNs(|f!M_x&+CafF^<@9F zke%rCl0{txxpV5>AyM}epJNjPE^SNtb!c&2NimR=P*66!PxR`rTARedr!AcIBpsgV zkZbrNI0=AF5J<5dR3w*YpBsxr|P1f7S4eFDWX3(8pU z8yWzm$8r_2A+&ri1#8TpReVccQ{{i&#Ir14IXSG7d!>a< z&7@8_&b$v4ArQcCLhy?9JsF7>XeL3$R-wOZ}&EEhev?434_?oGJNx)4x zF)yhNROGD{q(pywa?Nl69?BSZ(8sl8TsP`cSIOXUoj*;an^N}A6HY&_)TaMowZ2Bc zN$sn{Em&y;JHm&sA00)jmQcV9<$~|H>rz(QG@dI?s?-x6=8`R;Q!QEa7g1WeQw`lZ zw7im~5U^xj)sX;CbBI3r#A7;LfDP4Fals`n)e=-Irc!^R$!K5uhU9XJnCUL3-AI;x zdP8nrppqF&YvjOpwEK!z@No;V#T5nck3%VKli7BRxQg-HSOSqT<&_ii0(p4i9o*DqStu4=a0RH8pMjtl9r2qjGZ6r}ou_pEA?^y9{f2blN?};W^VmooZGA@2- zGv$A{gC|M+syNJQ>mxQ&;^oMTqJ1NtH}Au+8D7U%rdehY{Z{pqf9yW{3wf>GKBv1L zz)MY(RV~i@9IL}p*s-x{{ku|8N?L45NWyLEiFZMc#gzDoW}mKy_IQ zRN{}6u~!Zaxc7-`#a)meBg|0;;hM_pKdgV%*XTF3y5r+Y{eoyn>zteB*jdc%o%=XFNO1A5W4V9j9w*t}{U;o*}px+;}>H zHjtqKOtWc3HI{DqiDRiX6*l^@+)!Mh&EAR)T2*o)ZIGv$=98cvlQw9{a3ET~al3ffzz4j9o5RzE6Nh-WkK&aCB% zAm%##Om8!8wv)2=5UOd^pxKo$7x#a-b_`p8T%8426jAr^6+}uvkdl;cP`X1vX#}LZ zyE_L#L0UjSLOP_Ig73wpcWeK_A4FVfe~0isonPj>p)YDjGP<9}clvg5p^kqE=km9&CRfaO0#T zbLN}hZNewih$tdR|Pz8R@g#Oa7km`q^KZ;M1wcSBQ`fz-t5;T+aR9-faQV^4l z{q@WhoWfy-dWOrYp~q2WW0HYSEvy?#_nyn8pE;^w0XeEF-UPFE!G$t8WU6LmWK(ZE zr7!UrYb;QrHAEwGxz#mGIOn)FOM*t*A;YG{ueNaP_A-g%_}LbagTS9ptIJ{+e)7#> z@oC!HZW1m5rg{z51{CBqMq1dO)iPtV-TZSAtzPToF6ATwZ%+YU*!<23AEk>C8-bL- z;{hWLZo^qvfbP{t1&O4M-{dJdq&tp>fpwk9-jA}Zp1KFAX=JsZR@O!^%Swvl`y0uW zq+-h06z0ZWAC`)_^aDc{c7dvk$$SI(qYj_F(7X7R8(iyCRP*0ztv#$P(8pFp@D9xJjJX1X(k@t3B|VV)p}XETAwTUQii)8oVIDJP`c(@*?@AW~?=<{>$}5JW%m&lMSA|)o886-eqE5f{@3=7Bji6 zWg@FBahK>rok1o$@>}tPXZL6`EN10;$&i?M#ek6mp@&XMbg9plEb{M(a3r?drgLK- zH~d&o$6@XR7#28cN%=&6IH?gMoE4G%xU;M}u_jBp+vUBC*c;eat!IMUU}S&SSI(BT z$yPO;0zC1hALcanfZFwT5l7ZOG6ipg%uKm9qD0(T=#@ zH=GW3%$ep%jL0Shuk1nB(g&4e5VJt?V$DU<}ruy z`4V#%yWGd8b(=s!(6~s(EN?oQ;OtnZd4|Q|IXqU|!KRzD&yzAeLeuG>uZr6Ho-6^` zhR9ef8OUf(X!RApP$4c8n_R@Wi5GC)=Kx4jQ+FVldy_j$+>SP>jNkSUuE5px^>?G_ z(peuNZpUMR%x{Rj5}A8`DcAe6O{rTba0y4H70|ukzEZ!R2ku6yfeS>(%`)x%&GpjV zMtfE_5O5tSb+>GKpOOAIX#yhW?&9DM=kg9Rd$k0IHQ(L3N^Y+D$7aprzR3lCK^{G2 zfs{Xwe`R_}R;_jU!@$bqs`iV(WLXXncIMcoD-6UW`Aaz0U;tE#JUgMKRechoU6)WsK!Nu)~=l7 zFu-48cqp(Vc_ZDpq}BCJozgQmkZDOxu1IB94eWdWQF)7XOY!SH(dT>HDwP={!S?}K zPlJ$rdUdvZIfOee%iPt<_av6`_hjsyLq*T~tpj?_RkrtL1JgmG)aF2aI0m)|`6g%D z*>uAqHgCUqjFaACwJ$xQHl_#j*P__xg!Y2`s_L_mgBaIrP)@)-@|_}{hI*ANCl@p* zl5WI?;2}Zwv1+e$XLgnf_bYwg;s9kM{hFtGvFLrZnyfx8n8j6Gk4PiEi zvT}B>L_5@^O?th8i7|m8kk*lY!D0<~ZgUur(EKAKrXNL?t>R1dMloB4j+36zF#oc~ z$nbefPEu&6n`(>uk5BDr&Vh0EG$3y6i4y#^H<|}#ToN)G%`30b1JVb2dm~{ZzV^I` zU>-LePXeEg46^rnn*+$1i4VXVyD|mxt0%It5vIq< zJS5+8h+bSn>u*M1%Fg||6ta53dl6&(;dO@FhVLQ%(X`T8FfK`;!f^tj#BOz6B&wGd|*cRhO(Cq^L}cOvSnv8>Qn%NV}%}IJ|2>QVawl4URS>b zA1UsT*;Ta&Np7W<_1AZzDS-2;U{O##9j*s zg`XY;ou$~P?Q(Bz5RIdPrVlAvSgPW)9%X*N^nH`HnA;L_Jkc-ZeMiP1;j@}&;0iKU zN%~{|ewGZ7j@r?1%_EI6O)SI15&4;Zy2=h#4#})D!~b;dD>nX^_fGa}3#Iq_wQ_~x zv+Q)~rU&qs-=E6{S3u(O!4PNK7@}0Cbkv_ERNlHDOU@-)y8xeMz+G%{Gi_j7koQP@ zk-jwkEU(KaXo((V7yqK+EodXA^^?z0)3+dLVtFQDf6`FgL#GHxa>uw`_Gg2hcOag2 z9`uLbLUzkKIwJ0ZoG2vQf<#@V@Q`FeHDplBoo#zH_(qU8l5zaif%MYJSAjqeLE5A5 z_xrH+`^&8Mgr@R?wPUm;1wl~nOmj7c!_O>^qG=D$g`bu!#G~fHCY=}nq*)=uq2FUymCKGKL zVZj@|+_&umxJg!D*?AC`D(D60t4t}(X@MBhT~b?iR&g-lf=y<{ z0B5Jq<-(;Y4VsQ`=iP6ex42?G`MVbqTHgVCYWX%39$5=FNzDeEK%H>fwt(M7*(BhY z2NO=~al30w=K3Q@(MP``nua+&Mrtd5@XSFlacZhiL8B#QM0XINklia-Ptc+Dij&x9 zhoyVAD1%`ZucA@%fb_B!L=!%5WZJqOowTmq-Kkb@dXVWh!)lPu)8~yL_2ojnt89=D_38MxHOeR+9^UFtcLuMHXM8rklwl(*(_lZ=q@7%74y2JQE63e9|9# zSgI5kLD_6yhVF89EdQuFOO$G&Cl5FXN=8iiuA zhM&88o(I5Dlu1j)neX9U>zAup<(6k%0tuWnzIGnS%jUW% z#y2ax`PM@Ws05^hZhL0an}LrJmU|Fp@ziVG*z}gcN?kFv-W;8lTo=)%e*JH&Pv*>7 zeoY0q`)hC+g%TyB4XnEXhWfnty(Kz%3AHp&(o6dvmmrrzLh4m`5065ug*HR1?fhYP z1d>eyAL}VgUR|_bzafA)EzdeC4*f86Q}k+5w4T?PAHbO)&U-2=74{=mYGD4;wDD|a zn&9iJ*1*)~UuEL`ALhB*(q$RbY5_5`PwUMo=WvbFbm>Q&?|TM56@=o2pUdp&nOiXB6f7xgIDI34V)o3TpvS|KPliYf$k2742Q(=3B zI1VjhbVD5*b&KvpIY4$npP7v&%Y0@$y;to1Agx3h{;a}WB)6rOuyKZD;GJGpBYiK5egdW8l?)#_ zd90PAXyaB*CRE8L;VB$Buf(DBzA`(@qCn+s%j6f6W-5XNUtJ*TV9$77N-w~Es1iGP zWSofPGitHE%}+%KuZgB)eCY(MwszC7KAQ*Wi7s!h8J{B^*U|)rEFL|n57=VXH+^ez z9PMN?5tE$X`#bpi*~cp3?|2KtW0J$4++Sc_g-luMjmKM7(`FcvB3o4@gAi{?7irjf zqkRO=wY%vBzPk?tCAiCe6p3&2SE~g@%}K`nC_UP`E7Hr?PJQCZ`1vR4&3L{$hd$JB zNo+;ujo4;tJlrEw)Kl}Hwu?McOjOqG{44>wEl4?!e&53Nroa&gkK4{?m4Oqjk~PJ@ z;_{?C!bD=h|2(v`Yi(QxdtH_~+MkH>w7Ah%k;d7wO!ciAAUoIK%cgmtXX(dNZ@So{ zlhJ*HioaGA;Bx(zmI8;(uAFO|;_w8)3XSeaLwLV$%fMV_J3%nb%SAo+EngGJqHT=0 zGBrpkNSZCLE~K*2HxD-u=yRy(V@t3R@ZTdGsN1)dP5xwCgr`Dv;)cKEG7@(`Y9%Ml zkYF>q5L2)N9Nkvz64Sob^5i6!ppfrN&{K7si%Q+li{7NTPHbzYF!(cNR!ACK$B9MF zQryC+_S5WZHN$rmY^O=f8jeJmk&m3}+Y>!B+RXd69ms<_h#CuUk4iN*h00xZJkoJv zDs@raadidjxag9)-yk!+-vsW`OmCOdI&P;rLRxNt4Up9JCC~j~wbV@=Dc8HLZ zrL=-?&Als%?FAXA9E&36G&VY`osqbHN%42!Hor9H&5hdE1T=2k*@vPm=R)!xSfwjT zo2prsn5sNW>o)YIsm3krms*brw)6Ct?q;iL3GG-bZmQDCda2sOR^_Fc232eBUDRZo z5uq2r62mooaf)9i>$hKbYIO0Fnb-FnY!Y0C>&EJ8p9arVf0q#Dz&=BRgRcz@??a9b z_WUll8!q9?$F#Tj%X-UKx=5y2S=qND_lu@=u)_Pp^L0oFcE5itj8pb(+VFWqZu-aqe!L9#qGgYyF{sOV+xjT^}I;J7C(U^`Of#q(bM#DSw<7 zxn`+)_M*6b+_=5_SoQKdk~mdijQm8CvEhC2@JD@&5~B61?EKhZEu`buYMPg3g9`60 zuBFYwRvYCkb$8y7tHyXxJC_^DG|IkRQmW*PTyS^fx*)X0Ts5g)KCbW}D*8ElUbM*p zNNV08?DV63t(l%h$vx$j7iv>}_1Zi`t!xCVTtq&2lRRG{XBnikMkBBFlK809Oy0xI z6Qe41p*|l`fLfH=U0~*{eXyi2zqTDCH5bFT#9b;8xR*KZujK#KO3m!@8X2#S(-!|m`(_$h&KRqI!* zfj3&uGx2z&t9u|@B4Odhl1v}>GE8TJjD#e_G#@Oc+)k|xzWZl-c_BdrJ*VVRgihbm+p#`by*6%B91EkBdk-bShIDRV{>TkN6tN6mefzy9&oPc;;thH=V0iQ< z`hQR!^F`-7I&#_6N)% zaA%nXVtmGc@r}+lHdXuNI2@^!h#U=rS6}AvTsCU-_psO3d(>|GhdT~NOBc?=mu_*D zyQ=RuVI6lvJRwI+RItU{H=9CCzIaWOZRFv7B8k&Njnr?Q=c1LFoK4Mvka@~EvJa*8 zGyPUeVnbvonOhe41>8me^||pvRH)`dF_?eC4U=Yvw>w zE=9Zv8q?&6=gZ_D=>Xr66K4_4FGW+NS^JNMUy42Y_%X3r>`me*_hD&(b%Yy{LgH~=GV!cDwY(aTW|ToFC0Yjtaf zer;WMHK(X^yU}Zr8;hq93%`^cw0CS0Mn2xTj0dkHe670^l~92x?3222G$Sxv$%bag ziw#M4_0zY#Ok(i~nFI}DAH)g?i}ihekUIXIP&y(A z598Y7$RB8~MK`bg37f6N8TA?fNBrE&BcC5$f9U9B&|>#C*7o}3SKp|((Sf?ZKTBG* z>>0{GjD*}t-L*ahu5*C1>wEX>b(*M4hPD9I1MzU^K@M<;@*#V$`%Bx7t39dPU1%Kb z9kd#_j9j`ugm&EAA(n1C0+sKP_qT}q9GHJVSuus}0|v|$zU3d!T2)w){^{>>bg=`j zdPM0OH&b3a98BY!_*Z^`o*3j!_BVzZUV}~icH0g>HWy-YN@omrHI~=)!h^NO)2S@} zL-+W=aX=9dU9NWD$FPrR2nQLl8JiR8B#r|04L$>WRN!|-)kw4YC6oT3-^jtPj!#c$ za^)R~89sZn(!2O1DA~(f+DLfu+n^%80Z`q0$%tw=YzI+Fo3_6be6_O!p9(w@;2v_d zuUZ^Fuu=6yZh+pys!wW$VLeJ6#o!S4+Z7uU7*B}0`>n^${V$2Na?@mE2}pn>awX{| zb!}&0D%mi_NJ9SB-?&}PG_raKwo{Jaftf;eVM1h^9=F~*{p-jbn2K&rl_U^T?e3m1 z;%?Vr-K^a+1z)X)v_pb?U?4qp-^<;S5TlH8Azjx^UtQlcb*UmSI50>@x4L9uDi|ad zM5^l>IkK|TI|X0ngR}<**}z7s4rp>NClg{Ct(kRwQO|eo>>t_vY)-9?+;0~&MRldW zxwEssUuy){6kUK@g4?fwKoyt}ZlpioMky_s! zfd9e=WaE48_g|bNCV_+)5(uOpLIN?Yg#<1bkHVMX8S|9}aO%a%85Fqm;1WylB6tRT z=(o$zeu@5O@bvCJ_rdh;qWW#KUOfcT3Oa$5L!ewQ;S!6Lv#1>rY`)&8E*yNzeSFjY z7p5o))pqU=aySp#>F+Ir!`I=c{G;$Gco}tvps!!O0|;@m7{t}yH<9TLX(>TLACwu` ziUI_T0;&y)!jP5}_w=41{vK**ZGvkw|600$LPC7K5k7ng87YvK{(1lSzZ*j_)VRQ1 zruQ~zT>nDK*ASE`_V;*y!KE{F3$K_5{*fyuz~w8dgP#9%`d7aSa~P_c-rd2k{tJ+s zuA`4P@Lx2EXu;uA8OHxmIXeY6M&b4!j4Efnv##80Enp#bpuuQk_|ksPj!RW))!gtw zNK9a7wBZQIuomHuaBL|ztSu)2AmEO25(qd4h19l;v}sY@%|JgHe0L)`m(=T`0sX(!s#yB;*QsQQt`6!-oP3Oaki zaLQ^ZGwDM4OU={I6so&ngM08d`;_s9OGj=Qze2>;OxJ1F@&@dJ*!p|z^=XDaDg#`qch7APEJcTnU<|-zXbrJN2dt##~&hM_blU_h6ec4S#-#A zV4ABlm4tII@%uWdvCq>u9=!6+It@ISZN)p`GOTl^EJ736VV({gr0$+zYTjti zkbK0T`V>R+eO^#|xm2Il?Xi+=%I1D?xRhuL-+JY`vfcKPHQ#s;3-EjvE)Qvi=L~F) z?*Ma`Uo^z7;k~`9UaQefPhjf0Gl7`}uWy{YCDQax=aWaL4%q88I;5ahnImhNSb%0n zjp_&~Vc-MY<-~*(Jc>i@L0xQ^g+8yxMG$xDC*KP0KOWKypJVYJOd7|d$JSaT|4|%< z1l=zM(WVav|5;-p=%wC zrm3iez3mY2UoE8)KcZY$MyKlp%OYi_NhFE~>qT)0TH_DaZQ`L_QuH_L3pBmFgGZuY zwL0Tq{%vK|ey!pq{;lKh7?-aX7X|Joes^lRJU`fD+Va_g*kKEpj5gT(@~Twu9R{TT zXh`z^enjZ@$k42_trsHQgl|k!zk5b%9ZfuW04@@i0Ms};yYU{_JbEw8EjM` z@Hm0POGimDma%8i8`DzN< zbiJ*3=blYR$Lf(l%w;0ofAr&N8?k1FHw|xjIL0Vz{Pxe-&rcoYsMy8Tqg)R@${SUW zKxEjZl-TR?lks%6dZ&TdkrL3nH&R6dpbfR?1jjC3^RM_}d{gj*jZI zntLnUPt?{a5i0}4GnOc&P^smZ2}s}b_dMWzyB1?VESJ-MI}xO^?ASRgy(-Qn&ktuX zKFOPE@}9kQ8%<@(v7=@VO~`MJwQXrO2|M%Py#Favd=AQS*Z*Z9BYc2%1QB6ZnD*YH z#gGW5M!B2v>Jk$pR07H>sP0lb$j2SIHw!wb3^H0x3JN^l8*o)^m$*Cw)?iFaCHIy^ zafrOgzi!y^NMOIuh*Ec{Bk2A(xcqYG8rH(YJpoc*61<(;o-c9bONfy2fi_i#3?JV1 zoa1%)T->?u$0(og!9mCqi0eUn<#i(*B(wy(ncKL|Ja7zgKDpgnAWPesFLNyqah6zb zue@qxj#)AYf~;eE0Q-)ytP+zirxI_A)qT3xAOq%P0l5<@Kwn%gL zxe-0*>1?+RpleCxcc8V?{cBE_^eGz)c+(O!8eh&$|`fl*@URzup4{CeHA zGyj_tSLIxK66M&?H9(zSxGMiQc8?Zxmp1cC3@yM+MS)w}so(bhRx+%M{15F@Q*8AA zq4uoNyQ+PtZk&_jA2$5!fAA*=4CRk=(hpgx)_-mWVltSD;$*J{l@;n!QShwADAbqE zV9IS#&ipIQT{ch5olq$&oO~JQq$B;-rgAz}ee`8~hwa=s^~(t{0ozd0n0O(-@*9ql zY{N|m7x_@w80TLcmu}Ag6aGQ`BR}pN@gf7xvdAwEwLf5N)$KN>s}}CSkL<9r-n;;u zGEz*0W~1=?7}@_t_;Vu(vq{vYQSZt-2{V)i8LGiWFr}s1DE=Pd&?v4~U*4N%fP(^f zsXVYSAooWk_9lW86DdC8@s0~KvVrP7RHpGSxJt53S0P-O0ubu1DD8oJ`%MXNE53WXk=iIJ=KAbK<20-H5kESf3TZ=W?a zbfu+7oSo+BAj-oTqM;h~{$HG;JQ@uas=eU^Vrq$vGC*0APNG1A9Sv!nM5(hGq66Er zU>!gz>VnBHnw91us_yrQ^>XsWZ~@uNAngt#^9^=~rA;8O0H1!_ga@J zm-|d96oPA~_LjuyP3;a^$3Q zF8|$0E@l$;gx&aj+IQXx;Cao7=7RbUUrsu8*LuS9ASN!T;e7U^k|P0jbT3{j_A+4@ ztSvW95P=z4idRYMbTy++d!Y<_Y5H{HUMZQe08YC_H~*Q4D^7w@TSu5ekXRK_gO>xVGcuM^_t-L!fCy^a#>9( z*7{4^x2u=X!^y7x`K&fM%^=o1|Kb(&2t7GDo{c+I62Ta@;S z`w^FgJ34kdHW@S2HZ_Pg(4L3IA*;x62`AcAymKJ5?1Ofwskn{M7ci#Uee$K&=^`8I zp-X#hFT5+!Q=Rl}zaVKJ|LkLQQ=GG54>q;IMmpWIDU-1H!-Evaw%djYKpv9UvkDpm ze+o~RjJNVU@H-)^xi(q-m}9Fi`$-`AG?6#*O&Pk{bc9N|M;hrjp41uTmgzGE^<)0o z;25KU%g@^*hWdpaIwxi=gy z+>Lmk-y@+4MV{xstv~9F0StD_oifRXxvcKrYUZ%oSS$w2?G~LMy6Hd-z)|&&1Xk zm9Ml-fqa_v)z<@kJ^xasCMwhIvwVFIoVFUS=hH6HHCusL`nsVb5@XN?1G17oR>k4x zx^f$#w{tEB-_9p!0bh(m^3dcNDmx@oB1Pg4*%w3!UQIgom#1D*1S*M{U(R5GUl(_X+Gi}Lj!=`d(u-E|y(7GBrrIxLl#@Xa6K8BEuO&%521JRNUP-+nZ0@-)+^WXa;)uOeEC2la4?8B&=OO({}-qflUj5r5pOHc*^vznlciZ&LL+>)S1ps{LNn$$m6NHaE}2NsdUcvz zCF=i5%LRZHE3?Ku!sUHeA4MrcR5+J;p81nVZLg)uzx&;6@<0Jg7Heu*WC?!Edeu(i z%to~ID0lzwdH1r>`T91-aZN`Hi;cUPW2A1{7ym%m)kqbKKxxD0C3yMcUmUEJDY}KV zq-}B>3GrKbI|f|Q`x+){w^(u0IBH(nw^*IkuVa8`dltL+nH5lw@6>*xo~$YNOFfv& zSaVUQgTn}{Q+7-j&%kWH5hIb|%`-CGbev)-F^bgTHa-KQnXS>wv){#7?J3~TCIKd2 zcKc0N#BRY77msuBjaS_TGTz{0j&=Edpb@g}L2UZZd9t4Bb}BCBUU+B*~9Qm(JQVC#H+N%Q`5QBGPPU+@q0Oi<*mVIaqZ74oSB zL2!TWcOC|rUyNDmVI_I~Q6leg33&$1)mpMOB3<8?oKVM zNq$gh7FZt^-_Fn2U9P-b7j}+6nzG-?rcW_coWG;?>TO-f$gPfM z(>ZL(x`6g5%2?}!Px%fl8y;Y&^Jax?EaOFP;ON7(hY#%hLLj1V(f)8c3J(vW0jl2m z1P?-uqtZZ3g`hVE7xWrouG^p?jtJ0dS~Fv~^csc$Kues*Q0-Xt4tFJ)x55FC`=-|8vhhu%b^mA|e-aW3EY`_3-Yjlgr z&h~i*GaOu7WO_y~5sw#HaX&cwyIRg@L>2Q1_%HvNl zCdcWOy&%xx1Lh6cGC%Q;pSc^34r#9!ZIV$dbdSd$JIB_;UV5!mtZCc?DYUJ%spR0qx~_o z7DW<`%uA`ZL-PvBoG1}zT(=V#{V{M(hr4ixMLNZiq*42ZDAxS;XD62wKC?OuMS?@0CNjmx63yreVS3o_ z>|_2D@}K@&Z+U{QboRIPuYqhuz$q^LfpVP39$8gY$UZPx^Fff^^w z8J@k6a4*%T3Jkjz^Rh*sD_+dL+Qn`Q@Z4zobOb;i->d#=&-`+Gn)zLrA!cOI{fyL0 z8?C9U%4!4VvTVZijrp0330)Imbwg48)2D zFjR;;jzqSfcF7JEzdQrd)So{bxLSBl${v$%w!s;U;xMyUw5=$};{JirR2v5g8`u zrRWk&{Js50V_I>AMlwOz^0Z|m%<6GDAtoJiWMf*G&{5S09?hrhpo3V;{XF$vRf`{c z1}~ohHuHj%J!sG&Ih^C|^lxp%#S-2Ede_3E?pfV-1?uZRJ)*qrPWHc&ynl&G89`-9 z7#_2*6gGyo-XLa-%=ylUn+EnD{vkME1bxgA@V1B(E2GdgNh@OpPJ?bi&m(b37g*7f z(s4!4F+Khunk8~gok0y&OV5uTm;3g!Z5LWOz!1e|uKpzSiNtf!Y1-pw3LWhJL&;!_ zUbUCx?dt_UsG`Y)leen}!Ovf^CK;JY@4|*+TW1R5-9^}pv7fIAU->(Y*a}H3ZO%() z07Zf#AHE`0y}wQuvnSB71kCUm`J5ZBv~N~lp0w}LlHRu?KyjtBu~dF!?cQsBTB)b( zyM%xA$g5_4dn`_}1E$T_II_vLX+bJvZ?tY+e(lSw_4_pC^&0n!9`~1KP(_g$kqF>T zn$O|$bLg^n;Cp4qIywLQ1U}h1+B%$I7_e~wwz$rY;{KyN214iRDh^Peh+(uX#~{Y2 z=$eTLX3Z@*+kD_^mi3O88V&DvG#RUHJ^M1IkVU6)_p83aRIEr6geHDDwVI!DY9)~t z-CW!`zkNnvjYbV=bL=>m5|+^V`~Crv3X(UGYAHO8B)}`Go6vA$zITr9hmc<|ae%zS z4f#_;PQOC<;besU8*Zg1wG2KIF+3T3Pqu?vL^n0Z**r$inP#PxNkw)r2i~LOV?97? zl1%zA_@pkfs*QosbDeJqpa^BKs@i>k>+}Yr9o-ev!%)zzU3DdM3OoQ}JF)+U6zHUjj9RM^aUrEPtOxq+z+(od@ ztMNxSd1-n^nomZ_GG4#7(2L&)rLN0S{~`eg+&PCORW3!3R&g->gO)}M=^`)kcKJsY zGq9u&$3K2~RG&Zw=mz3QX8$&=NZnHY!{@a{wGxCa0v?RBsfDc_rcUYWumDf%X-hwb zbMI;iD^O_@g)7r0RD0X`DnD-7l)RSo>vT2z)%9FSH*#I@(cuWG;&IO)zHN26{Vusd zRqwZ?wWbd_YfoV;Rr*v7qq`)ZCs0wVJ)#ecYhLZ}jrz`hwH((z6Nz=xBxGW2?O&3w z*?pjDNiF~IkTt;Numfr~_30jvDzY*R`}9fGLP%6PTU5VX#4G8@pQFWy@<(dX4(xxVDBCM=DEA(r8dspdLqh(OR)PdCU+>wT1TDN`S3x#m}6+5~) zh~W?G=Sh5uo>9{bbncI95xQLZ%UF_X!F){tmx4XCYL*mn3?&#AF&?~en(<_XWdw1X zR<@3>77nPVl>4(eMTTQ503Kq`n;-kiX@}RFMmxsC zp9wp^Srnl*liU(ck*q!S92{oD^^7s8W$d@?<(yytDr_OswXFhrT%sIHjSKq84nfah zANvW`F4yP#^lC)$Q-m{^)>xIMX;v;yfkisFwfom#Vz_4oSdnKSAINrDD}4C!jF?{$ zJ$Hbz`6GeOd(-e5wKAh6#|S1K-h7g}pC3yTL;5n!*r?588Rv?W@X8Hx1U^GGECwfg zu-Xf~cS~Y$GT$(nU!bB$uW7%)oY%B?RIkaC5PT*!4U|!4+N8cL&F&EUtjF=rE5?c66xtMMf4f4Qnrk31P)SdT*s1JYvNZ@E zl-H8{9#g#bOFsETuX@1l?C~Dgb5*WODDC?9IBAG?~{xs7AT=AqO>Y$>v_T}1Vm|YVW+q?%i3 z)@T9WI4Dl}dpo!p+-%eiZfy>6_xJfvDNlkX8wM|?vDzY9f~ebdOpV)({+9im%@!Y1 zWARnq;i=w&3yQS;mBk=$cSw-8zbC4A`y)NepyiatMkYok3uPqA2h+^$o)X}W2d z_Ewjl9gU)6Vls_~58MY_w0+zqJNlVgW~dnSF?Ex?etKWc1$nom3v!uwwk(W%x0%c0 z1_cdmAJ+zXU%H{%Ay6Rjd}^I}sD2iI&!&ZBszMjT$~mQp4wSZpIyoc{S2_y|ZFB-`4 zyUvgaqCZ`k1RtLoSw(HwXHgJG=nS}|?Eb@sK1j(x;opvdA|3s`D^rz85;;q&7Ad{_pixOjS+7y4?>ddvHVhpPghv{r`0gWwUxaD9tYH!XYnKRf7Am4$rd(=jdM+a4{9D4Xk z$=#x+sWzzc?)E%#?=eoD4Z*LE7Ku?>bX^#xd&Y(je=!U~!HE}IFNOpEFf%8-@9ZAg z+^#G&O4Lnrd-rQMbNvyp>*?|)upK2cd#t4Ezih)#suoCw^bfGZ#T*`{N zSa-B{HpUnF`9z<^|H#Gvd*txP$=idtn>I*$)Pll`y=JZ}EB^8b&HkQK|J6tCEKN8``j}6>ie6M`MPIbBcw7h>f_I z+?#Ehi@Tp0>Lqmpz@3+w-CWF;hzcy1Kz~1loFC&^5?1~~+3zu;=lB~!!5BoZ$+b+w z+EMy0eC(^?RgBbx6ivl<;4Bs<%V1W7B6sSmMIKucDc5s=3HwO=icnvJ9-o-Dtc;Vr zR9}{Y&A`CQOGftaI^^m~y~ONKP;jrbj0KJT)amFKSCR#QE?uVaQ0vLt_zzaQ#U=u1 zrzUk>wYJT6o%*`e@?J`8>_aYKYc#&i}YmS zbcFYHVr|QlaGq7CQSc8yG7A79_@5t z8(Y9fw9C503p_JRwqqt|K7K3HXRY4kzK3!to<`@<+*K30Fy*SWA1s*CrX{F}@fAm- z>0|E;)cIV1Y{b*Maob_Sl`>@Ea6V#5u&lZYW?T(1IrjvcZq8?z!fwDD4ntFAv|6{{ zcCO1zb#K8d0lmoR9IYEF(>l|%Tkx*KY=UBl%CRMoWSVv(dJ>dwh@klI60r%`z9Vuf zA-zh-c;t8AujjDlCmqfg&KpSH>NNkh-w10Ho|CIqc&o{V0P{%m)vLb>MK>y4slKTg zTCJOJ9wFzJb+pO1g)T5%)+nfWbV zS<~mMYz^weoZ?Iwx>`g*b5P`0km7fN73RVwO+G8QYgQTQ!Og#B}BoklLxfAM$E zMuOwUvWdavj>kz&dgPF}(}sCD>XX`-^WkRd`(;~@3f9-Gqt15~GeewCI=g<_jZbwr zd<1aebq)Z&4%AElvm6zNe#Ziu+fichxO}R`;IU&(y}_gMx4#^`n{;$WBnsW*%46Wi z6A@bQiR%_WBb1loLJf`{Dp9u%m#+!sd#JI%MAziFX}+IQe@ z2jkJ{I-K@L_fCpXn*F*+$nG+CU^6sZ6eT(_4WYIv{DC{abWq_q84MNcQ}|K91fw)G z7JoIlP@Qq7+X0`_sGlgB#X@x^+xkf#6@M{J;q5Y*Ok_!~fy!Eu$le znRYQV^O~8NnVG$2W@cvg*j~e$*|X*~ubJ&NGcz+YGgJJ2H@Ue{^)Sfstu#JJjbv@GGv5iTV1r1Ff0oB;zJTpN)!9O`&%CbmoLq05=0P#Gj}1?_Sl4nxCSUz{ z%45m(7139>AOSW7_5PDK^chhzHvWFsHgdOTbo{UMAJl3VxAQ4xH4ly{%h1=mSUhyE z>ccXED+hg5Y6TfK7tInY*cy-I++-42Em#S&_C;%GB+>*k15?avygIW+d{UT(Hr(JwUJa!f z;Lr)NORDP?zXf9iHwaz@QuX~iQ8hn5pE*XDbPDMfJ}Hd394Jig(K74LltlD{1-Co= zeFo7m!t@XAUZfxiR&|fs?`uKgC@;k=&O<6}C(#CjFezYFP`yV8@rfusMF_~UoU2vT zRPzp^*s{_Qw{>vO-@}e8Z$>Rv>7q3>0ob9Cy^#@TU~1B$a}a5HVqhV^O{9Em-YvaF z+{(V^r@_o%S>^r|n%Pb1&;+sVqYJJsRtx+SEDzpXeM~`gtOpY}?s>#(-$vESE<+wl z;09aLU~#KcwDdyi^R>kzcG(?n2Dey61bD>MpVf2e6m;(bBpb_L-xL*tKym>m_7JN_v0+^ z^hoPEII(99h_8q#&xF_22czH(qy_J>8npY)_AIPmN|RG6Wl;760=WqszoB>k{t?4^ z3&#Orl1J-XeOPtf6{2&4pgcCpM*~3LlImE(PRZ9#jEg&_U?1a4poBFYVprp~Orm*o z(vU@|TU;2oe(Rkw7*yxhi##YOcR@J^mRvAZtY)gLuCr~`y^(J79~ zAOy%^b+foXe$>^cB}G+^N&LhidFLvyhmiLgj4 zDzk<(-n^7+rGE~ASay2|8B*-6QR=^5YRW%(-ptBr1Rb$#a?pThlh;HgHC!)b-lvM+C3nXB@^q3ow#78Kb z>53HbQ2qGK@p9?*SdW(CpjOr=6fGf(fk>zNZ%wSicasr+m*LRtrPnT!2_0p9G8H{r zYgzFgwVjmmG+F%uW);w2Q96>x=pS`?Lyi*io-q+-WJGy*v!R(sWZZwJ*xLLgn0@3O z=#6V8iEgc{Mf!a&fW`nQ@1VJ$eX@%F94q5H>xUrBcs1f0JD*6^jECZaaZPH1CqsF! zq!65X+?)UgNG@2m%p3ITXy><*vExV-*?v6iE+LE=?`Jdl`F;Pc(FAMOaVu}n~jo?e3+cIU-=K270ID2P{A{j~9|0L*9 zGk71@|0&1Ez9|D3rHbYP{R}nSoilXcf`oprY6AwxynR0^6^R6G(`7}4Uc389 zKwm||*#x(@u;svX)1V)wm<;F;eZ^lhQ16}LVuDtezc%ymS~XbHk!xQo8QYhz3zs()OzL6K1bu-m zrTr3?-c{Mw`0oT))VlK9n( ze#X~62y9~T!`xMUh(*IV6p;msH36En^afV73MG}SW?cz zdQ|;dUh#ovwCt;U-g}E%8eviRK(rjG0=6rMrlubO_!XJy*V&gQQaZ#Fmd8EezB>}z zc(kqp;Vas;1N;?rjlXF%{KBs)Uc+gw1zCXR!EPDk^I#4!8K5I-Qmdn<0$Z|W)k~@9 zV};((w%beSn8(wyH9*2tcxr!2MxMavP|oT(gb@!uAmq^nV8uGdvYRIugE0rv&14R*QSSTT zoIUoL-&pL+7cX^*O)`Rf!@&dDg2pbIzp_x(36!q>gPO&`*NXjCgi(x0f9}A)GU$`C zbrN}97Y3=1aMPh{ya!qRwinIY>Rc_)s8w}o+w0V&m27*9S1lxABotCtZ7MJZo z%WIyg(^#*u?;Fbc|NdkB62|S~7AT^;Im@$8mdd|WCJ)uxL0(>p;H3g<2Z^H_NLKOk zR!~S`1QkdV{23*Ctfb;aQg?h^J9BT_9~r82$C@n4lxRm!;gS35<0{PyBLoIGLHr(A z*#V^BVOop196_O}b}p);U3;`<(x|QwE=*jc9V5L62>Bq@5|i$B*2;T&%xf@N+~t0z z*`_XyCI(}h+EK85C`Vj6C#VvF9%7DsYUwJQ59&quiR72}j7bT}+>@Ty>u?9p4F*ER zWIi=4juLf|&|e=EFlU0-z54)IkZCH$Jf`T1)mh1sXq3rq-M&Mxk%#jmyD%izZQ08v zr9UXUIM4?pDt0#_g9i{DWuftC=Lj7*AB|{Uero)&mzW-E9sf-fuU-O)qzNyF5_XSk zW?BsM;pC7f2mcBMLuB+q6LpHBZjPO>>=7vtu}hGFZ%jnZ&~pO0hU5g$`JJSSf>m$V${ppq6zV1Uifc+5Ujf z%U#aLFXM1Bylors74_2Ej2lq=spB7Aus!{R&O4#RebhAjZUctY!g|N&D|x=%u41?l ztW;(fZ(wRT+gBaN_Udz1lJncW-4932BfcG#mT&A2L?t)Ls+=X*K*KOiSM{; zaxV{dqls4y&wnXS<*dP!3`S14`tfUZyQA`AnR@bqv&~E>gxFye zrbfarD8;8oIzrp&PQvvt)^r@;b$R0^U*LxFmKlCm{KmUt!oQjV09W!6tt*FV`YA#8 zDSQA|a-*^gjmcInbq~#CLbCdV40 zEiZ5raWv6=LZun-m(X72Y^Z2*Pp+;`t?8eXIewT0XwnKkyh_@M3n)o*DG#@a@w=$d zE4oQ;YEw`=U&9ou;3dH%w7$_yzHcmBiznya}p` z^T6}o^C$rDVw#?BiYKV3QWfo*U@OU_NYyZgL4zIH>T)qp#}hyXi_Q69C1-{_Gvm#i zBdx^3<0L)>?HMzi2RSXKtfNMNRZ9%erqYFVSA>b_A@Dnjv&9x zQrC3Qm~shm`lgL~$|C`ywzk(R#ft3Gt-oIEVsg`f=i=Ilf}#}SMsxE$8TJUJ)WRRJ z@U~`9yDo4iOq}exp@GC2U?j2c8uW5NF$_?3yZ&bo_o-4f997cM2NPIyCGSA4;sTdQ zK;n1eHXTgQ#<1pNFOu4=MwoA;p$jvnr}z7Pa9CQbJ41 zRVkkVwe%FtizOJTCKZ06LuiMCKW-1HKH3q%0G&^d1iq#yM|E%YYM0<{4v@@^*j-wB zv@mdkf!?Obn9D?utl#lipH-=8k+({vGvq0a;C@uaB-~YI;wQw(hNHI0JReDHT1m&+ zh1ykKOw~?UoaO7^0%Mc!{(c=5yyD{A1MF=AJhN1OrpV1Og6epJbVyJUzX3S2+Lq2szzQ+dSrjE!8=QuJN(XQTIyaknZ z>~>Ri!gmE^LxM4xYNJVHBhDyHQkT)vO^c0k5M8|5;q5usdU-_HrPCaxg^|}bXR7fJ zO?Va7`GAL0{N?9K-)QUU>%+B0DC{c)G^HP{^jjxOxWS%x!HQmD0UR$^ZtHd4IxXJi zT(kr-EuHuXyk9sk7KS@7`8Oq)SjP=Kz12jH5kS;t5cs&U`>_SQt3j+PwME8LDKQgnDzz6CvSE0Mnw61&bX7;cr*rxz2Q9 z<= ztnVMr*!NV}8Y+pn5SjFCV^_;H_ijvt8gtgncX0%4_q6sve`qisQ4BfGQ=Y@}_^U+R ztf?!|7L~kki~zHXd4$Q3htD2Mp||bADQP0m2&j|j_C4*SXeWck{`S8Bio{Do^nnhj-)9fvzFQf!XOC8Rz=opwsoDj@#rcN789JsbEEqntwDy zL=rrJ2EvHDiBqHu5;I(IhhjW=iME;|!M$*ix@oO%-(MMg3A=XGUDO#h?&Ihr|dMQiQreuAIYNfhTFC!5j9~=Lhx|= z0ct>v#Yjy4J=ozl-^+Yw56p~a7yAVm8a1ex^(UYa%;<<&^yDAF4BXHz-@y-oSm4!( zrRktZRlIiV%<$vMPp}GR*)yGAh-B^VevDMhy{je@>K?9UAxeb5D%V9=*);c5ku=i475boX3@c%#kO@vN&YZdW1g471gtLkOeg zo~pF80ihfHO+nuQL~)(6= z0k{+`vGmDD>$RHkM~Q=Y(r((vqnqT1pU8=~6;6xyx?7ci{i>p8&tvL3T2GWUJYLb> ze&o(02n2cHW`1;=%r95jd)Ws%dja^vzX52T^&jt9IBgv&NwMuNQa5q)f)5$lQK z+Zh^W(&ak9x3W$O-olF_&1P@<_01HaR-0iM?R^9A@)+)*UVg%59)4MhCOU2F0d z{1St^TAj+Bp-BNYF7GKs(2YUlao4M@2cO4|p>g6^HG+Tl-Xo=$RHW5rqC;dOj;UEW zj+Xd!-7~wRBrYg2rYJ6TTwEvQkZ|0hZZ?PS&8R&A$QR($;=5}#3({EQ-n?;#UYc;O z&M9?OH`sa2`(BG9cDx$W-D0OgM;gXB`$P9(pYY)niBtF_&N5CJ20@tTtogbTT|ISx zUsW{XDCPGUocinZO(7w--#d53#8i~Cjx2fpFb9X|^7+m&f|B~aQRGZm!M5gHftug{ z<|+;V_%7Zc`>0hU?P1Yy@@*~$Qwm0tk)`E1D?}r$nPy5VR~ljidvrjCMmK)}FUPJ!qDIk&x?@l1#zi(}2VZky@C4NQ{FF zxR5{O0F;*~Ry%^iyH;*M$KcvA$BcW{h24Q(Slvv`7Y10@%IBj|I@8qBDtw(XIK z0;Bp!=<#G1a;eDF%~vBIDfbIFCK5Q%HDSX@!&0+*?Gq%PcYehnOq#9qhZpzP=$i@} zY+1Q9it~VQ2<-TK#<3Oa!+m++c?3lj!!+&4XX}#sj0|kkw zh(8$vt;1sJX;pYEzx%4?%VTav`8c`O@}`+)T$k>qC;6BXM<_WoqRY1P%O8R zO-?c)0r4Naq+1|i%z3aBgF5sn(9T%jw5pA^OriUr?N0-v(v`^Phl&z_Ly#EuQJFg3 z)vKbr3B@O_HF0vw^mmxG)t$!99~YDf-pP9c6DBuoI0m2jcGy z7sYA7psI?-62hC0!vf8c;?k%Cc-Uo(`IIl_qu-<1d~v5jUX4emV92V^%)WM;69aus z&$qz8DgIex@<2XpSA`1QdsgbFs#x*4rRx6X3ps1ei>AI#Lr$=pI3}qwaX@i4A0js& zUm;Y+TT~~VSTXw@>brvCGmcP8!CXTEQj2Z;9JyqqQ7#NI*{%wlaVQTf;3SKDt#ooA zcW6O~qr{v?yv_Cl8mwwfQ{br$=()EQJ5X0{G&;Sxfa;QzA^*dKv|%Sw&AA-7x7sU7 zHhRaUj7e}CMiXDyRSwtIjD8nBi-9B~rvaBqp39QA{d0UvFy2^liH3%v^!vwYy;^vO zBE#nvTMf2#qK>>NHfqNSKr}0yT1~bi)>`s=T2ITL$!V9k^0@T7pRMUDvct-3uq$GM zTD;G{^`?V)_z`E&xdY#fzK#Z*sr1^)-bWk`xhO@=gLV7@Hd??*$jE6`U#@(157O?h z!hjx&4fhwh$yCI*>PL5d-`{?xCW=wpCznf{%R@~a0+)32YuGq|2Jquls_c9uaP(05 ze;>OU)35zO1Zs}D*cO<)d6LMtbxJ)jEKhG95s=ti+7IS#)1NCb;zJh>U1MZk| zP9%TVH?B9$)@*xYtJ4&N$;1_GP09_Kma{DvKZL)$k4x<@#bvZgcKNSobnSx z1$p4=j50^jpE^L+rE<>!DlJdB3SvAV6s>rWnhOI)V&f`z9zZZ%bpNGIBvQ24zroGh z>?Ms1N_nK5^x#$0mueo@KXWb#{fCX@?pJTENClOuIB{I%HKR`Wgs{VW8;=O_!f+WR;I_uhKW8fUe<4*qPjR%hm0pujQ#H1+ z?ub3~&TkNI27OW-s^93-MILM)2R$2_#QWL2N=4P6O|!|sGfA`zI*54>VH{_x31U2r zp~;}?j>(Ic1?IE5j_EJOqbS+$h4pX@k8Ol&0$9FWIomP%#7Y|o>>Co5#TUJr77sd8 zmozz}@STw6mymWa^X?7dmhuBcHdB0^e=#~=CDU&hObPg%OX0EgoV$1h2jfh+K&V_w zL~vR}wgMOJ;MvOvQ%T;wUq=E9gAB%9Tx0&Y5fJZEkbpbH?wVyT1mQ)k0E4Np7x!@n z0m)qbf5>6Uhgj+M{Zk<+AMO^XB3ttd;KB!g=G1 z&_!QTpWFrU83Z_)(9)r^H&@p?Tx_3dV!(4{RfUWSw+|Xvh6*5A_utnqgA`}InC=R3{)H(F zlB!cl>}_k$Y#2HPWe#y_#D}+a&bZCOlMOFVXxn1F>D|rIOi4%snecO0*p(l z_nM|$86%o6d-$6}+xdy#M6XlX&!(lt!WL*o2TaO;=5Ib@nwP}&Bje|{?8IJV5|Jyk z^72*EJk@r=W4i5}l`sPq8vxan+9Bs$9vUq4zb+a*BYm{JAky4Wj&+%K7H;qJ+C zap~?6uniIbxf`*3A6{jZ@w^cA0CV$4A4@Aj{?!%RY@*8XRFuK1J7%cF_yna=;!_n5 zxmzR?i$ouoU(pzNlDeh}VA@vCC}x;65s2&oYO2C4poxDKzK4R$Fxh?*l%&^q5Jxfp zroQ(@t?o9{Ty5o#=5puv*o$qs3~Ts{&L(yqCY6y*{if}1A}i{~<7m{j0Z@bgkA;d3 z+ysuZOiesQ`p@h$7!LT+^=tT1OxW=>S1>^3t_%Z_6T*Jvfa?F$|~B~;ydJ-*0@NfbZ(sbPV!-MjP2NbaVu!(X2#hT)-plVi9(LSEIGhi_-s z+mhcV#f64*KGoi$px36tE%K;5m(+%qXXHViXZ%#+5K~h;!qo$ z%RBYSOxCq-w~0Jh0M+V+wnFBfofH?o4re)wcL1$7U!s@MfNbMX)iCZ^3cUblK>;x1 zh~Gq%(FHLOfNxP+W&^5gj4;XqnAN_h^oM+$T;;+M47%`25-!u8_Geh2v~yUTSQ9=h zr@yxO_w0#fT z5mapX?WyJ_s~v-|wT2vXi{7os$>E<*T7pd;=UEtGc>SI|q(7m2ni^!dK-8_rHui|~UA*O?1 z1EBfc0V@z-t2D#-Oh72Ur4(1u4|rOi40wP2e8|{*XM=kS&w1ZI{oI8XW(JwTQ*3!A z`8?*yK6$r&G`ViOjSP~%JUeuM&u9X$rM&wLnQy+BGWsILY`82>UZ;)*EO<7bRfX$4 zynlu8_8&6;j34P}FRV4ZXGjqc(Hs^AeP&7WpKk-)E$j%f2Jw6QHz@l0pDU&;V�C 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 V=ozSM_0aEAK@5gLI*1kh`46=rRLcMW diff --git a/asset_sources/default_themes/stack_wallet/dark.zip b/asset_sources/default_themes/stack_wallet/dark.zip index a859175051f203b4e828eb032ad2472f0171b8a7..8b31f4278dad0f955b95ffc1f518f76b28ec9643 100644 GIT binary patch delta 5537 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 ae`g^8P8S0FP`|CwFzEx(2wNhsN&6Se|Dl`! delta 5366 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 Date: Wed, 19 Mar 2025 13:07:14 -0500 Subject: [PATCH 151/193] Xelis updates. configured Unix line endings repo-wide --- lib/pages/exchange_view/send_from_view.dart | 4 +- lib/pages/pinpad_views/lock_screen_view.dart | 4 +- .../sub_widgets/favorite_card.dart | 4 +- .../sub_widgets/wallet_list_item.dart | 4 +- .../my_stack_view/coin_wallets_table.dart | 4 +- lib/utilities/test_node_connection.dart | 3 + lib/wallets/wallet/impl/xelis_wallet.dart | 82 +++-------- .../wallet/intermediate/lib_xelis_wallet.dart | 131 ++++++++---------- lib/widgets/wallet_card.dart | 4 +- pubspec.lock | 46 +++--- 10 files changed, 118 insertions(+), 168 deletions(-) diff --git a/lib/pages/exchange_view/send_from_view.dart b/lib/pages/exchange_view/send_from_view.dart index 59cf20a47..7e97017a3 100644 --- a/lib/pages/exchange_view/send_from_view.dart +++ b/lib/pages/exchange_view/send_from_view.dart @@ -35,7 +35,7 @@ import '../../wallets/crypto_currency/crypto_currency.dart'; import '../../wallets/isar/providers/wallet_info_provider.dart'; import '../../wallets/models/tx_data.dart'; import '../../wallets/wallet/impl/firo_wallet.dart'; -import '../../wallets/wallet/intermediate/lib_monero_wallet.dart'; +import '../../wallets/wallet/intermediate/external_wallet.dart'; import '../../widgets/background.dart'; import '../../widgets/conditional_parent.dart'; import '../../widgets/custom_buttons/app_bar_icon_button.dart'; @@ -277,7 +277,7 @@ class _SendFromCardState extends ConsumerState { // access to this screen but this is needed to get past an error that // would occur only to lead to another error which is why xmr/wow wallets // don't have access to this screen currently - if (wallet is LibMoneroWallet) { + if (wallet is ExternalWallet) { await wallet.init(); await wallet.open(); } diff --git a/lib/pages/pinpad_views/lock_screen_view.dart b/lib/pages/pinpad_views/lock_screen_view.dart index 5d630ba4f..c7d6bb254 100644 --- a/lib/pages/pinpad_views/lock_screen_view.dart +++ b/lib/pages/pinpad_views/lock_screen_view.dart @@ -29,7 +29,7 @@ import '../../utilities/show_loading.dart'; import '../../utilities/show_node_tor_settings_mismatch.dart'; import '../../utilities/text_styles.dart'; import '../../utilities/util.dart'; -import '../../wallets/wallet/intermediate/lib_monero_wallet.dart'; +import '../../wallets/wallet/intermediate/external_wallet.dart'; import '../../widgets/background.dart'; import '../../widgets/custom_buttons/app_bar_icon_button.dart'; import '../../widgets/custom_buttons/blue_text_button.dart'; @@ -119,7 +119,7 @@ class _LockscreenViewState extends ConsumerState { } final Future loadFuture; - if (wallet is LibMoneroWallet) { + if (wallet is ExternalWallet) { loadFuture = wallet.init().then((value) async => await (wallet).open()); } else { diff --git a/lib/pages/wallets_view/sub_widgets/favorite_card.dart b/lib/pages/wallets_view/sub_widgets/favorite_card.dart index 26e11624a..d9f730804 100644 --- a/lib/pages/wallets_view/sub_widgets/favorite_card.dart +++ b/lib/pages/wallets_view/sub_widgets/favorite_card.dart @@ -27,7 +27,7 @@ import '../../../utilities/text_styles.dart'; import '../../../utilities/util.dart'; import '../../../wallets/crypto_currency/coins/firo.dart'; import '../../../wallets/isar/providers/wallet_info_provider.dart'; -import '../../../wallets/wallet/intermediate/lib_monero_wallet.dart'; +import '../../../wallets/wallet/intermediate/external_wallet.dart'; import '../../../widgets/coin_card.dart'; import '../../../widgets/conditional_parent.dart'; import '../../wallet_view/wallet_view.dart'; @@ -132,7 +132,7 @@ class _FavoriteCardState extends ConsumerState { } final Future loadFuture; - if (wallet is LibMoneroWallet) { + if (wallet is ExternalWallet) { loadFuture = wallet.init().then((value) async => await (wallet).open()); } else { diff --git a/lib/pages/wallets_view/sub_widgets/wallet_list_item.dart b/lib/pages/wallets_view/sub_widgets/wallet_list_item.dart index 767770ba9..938baac71 100644 --- a/lib/pages/wallets_view/sub_widgets/wallet_list_item.dart +++ b/lib/pages/wallets_view/sub_widgets/wallet_list_item.dart @@ -25,7 +25,7 @@ import '../../../utilities/show_node_tor_settings_mismatch.dart'; import '../../../utilities/text_styles.dart'; import '../../../utilities/util.dart'; import '../../../wallets/crypto_currency/crypto_currency.dart'; -import '../../../wallets/wallet/intermediate/lib_monero_wallet.dart'; +import '../../../wallets/wallet/intermediate/external_wallet.dart'; import '../../../widgets/dialogs/tor_warning_dialog.dart'; import '../../../widgets/rounded_white_container.dart'; import '../../wallet_view/wallet_view.dart'; @@ -99,7 +99,7 @@ class WalletListItem extends ConsumerWidget { } final Future loadFuture; - if (wallet is LibMoneroWallet) { + if (wallet is ExternalWallet) { loadFuture = wallet.init().then((value) async => await (wallet).open()); } else { diff --git a/lib/pages_desktop_specific/my_stack_view/coin_wallets_table.dart b/lib/pages_desktop_specific/my_stack_view/coin_wallets_table.dart index 8da907ca3..aaf1d1402 100644 --- a/lib/pages_desktop_specific/my_stack_view/coin_wallets_table.dart +++ b/lib/pages_desktop_specific/my_stack_view/coin_wallets_table.dart @@ -21,7 +21,7 @@ import '../../utilities/show_loading.dart'; import '../../utilities/show_node_tor_settings_mismatch.dart'; import '../../utilities/util.dart'; import '../../wallets/crypto_currency/crypto_currency.dart'; -import '../../wallets/wallet/intermediate/lib_monero_wallet.dart'; +import '../../wallets/wallet/intermediate/external_wallet.dart'; import '../../widgets/rounded_container.dart'; import '../../widgets/wallet_info_row/wallet_info_row.dart'; import 'wallet_view/desktop_wallet_view.dart'; @@ -101,7 +101,7 @@ class CoinWalletsTable extends ConsumerWidget { } final Future loadFuture; - if (wallet is LibMoneroWallet) { + if (wallet is ExternalWallet) { loadFuture = wallet .init() .then((value) async => await (wallet).open()); diff --git a/lib/utilities/test_node_connection.dart b/lib/utilities/test_node_connection.dart index a211dd97d..7e8616ac2 100644 --- a/lib/utilities/test_node_connection.dart +++ b/lib/utilities/test_node_connection.dart @@ -305,12 +305,15 @@ Future testNodeConnection({ final daemon = xelis_sdk.DaemonClient( endPoint: "${formData.host!}:${formData.port!}", secureWebSocket: formData.useSSL ?? false, + timeout: 5000 ); daemon.connect(); final xelis_sdk.GetInfoResult networkInfo = await daemon.getInfo(); testPassed = networkInfo.height != null; + daemon.disconnect(); + Logging.instance.i( "Xelis testNodeConnection result: \"${networkInfo.toString()}\"", ); diff --git a/lib/wallets/wallet/impl/xelis_wallet.dart b/lib/wallets/wallet/impl/xelis_wallet.dart index 0bb95e8e8..466755bae 100644 --- a/lib/wallets/wallet/impl/xelis_wallet.dart +++ b/lib/wallets/wallet/impl/xelis_wallet.dart @@ -4,9 +4,9 @@ import 'dart:math'; import 'package:isar/isar.dart'; import 'package:mutex/mutex.dart'; -import 'package:stack_wallet_backup/generate_password.dart'; import 'package:xelis_dart_sdk/xelis_dart_sdk.dart' as xelis_sdk; import 'package:xelis_flutter/src/api/wallet.dart' as x_wallet; +import 'package:stack_wallet_backup/generate_password.dart'; import '../../../models/balance.dart'; import '../../../models/isar/models/blockchain_data/address.dart'; @@ -31,28 +31,6 @@ class XelisWallet extends LibXelisWallet { @override int get isarTransactionVersion => 2; - @override - Future init({bool? isRestore}) async { - Logging.instance.d("Xelis: init"); - - if (isRestore == true) { - await _restoreWallet(); - return await super.init(); - } - - final String? walletExists = await secureStorageInterface.read( - key: "${walletId}_wallet", - ); - - if (walletExists == null) { - await _createNewWallet(); - } - - await open(); - - return await super.init(); - } - Future _createNewWallet() async { final String password = generatePassword(); @@ -61,39 +39,24 @@ class XelisWallet extends LibXelisWallet { key: Wallet.mnemonicPassphraseKey(walletId: info.walletId), value: password, ); - - await secureStorageInterface.write( - key: '${walletId}_wallet', - value: 'true', - ); - - await secureStorageInterface.write( - key: '_${walletId}_needs_creation', - value: 'true', - ); } - Future _restoreWallet() async { - final String password = generatePassword(); - - await secureStorageInterface.write( - key: Wallet.mnemonicPassphraseKey(walletId: info.walletId), - value: password, - ); - - await secureStorageInterface.write( - key: '${walletId}_wallet', - value: 'true', - ); + @override + Future init({bool? isRestore}) async { + Logging.instance.d("Xelis: init"); - await secureStorageInterface.write( - key: '_${walletId}_needs_restoration', - value: 'true', - ); + if (isRestore == true) { + await super.init(); + return await open(openType: XelisWalletOpenType.restore); + } - if (libXelisWallet != null) { - await super.exit(); + final bool walletExists = await LibXelisWallet.checkWalletExists(walletId); + if (!walletExists) { + await _createNewWallet(); + await open(openType: XelisWalletOpenType.create); } + + return await super.init(); } @override @@ -507,20 +470,10 @@ class XelisWallet extends LibXelisWallet { try { checkInitialized(); - // Use default address if recipients list is empty final recipients = txData.recipients?.isNotEmpty == true ? txData.recipients! - : [ - ( - address: - 'xel:xz9574c80c4xegnvurazpmxhw5dlg2n0g9qm60uwgt75uqyx3pcsqzzra9m', - amount: Amount.zeroWith( - fractionDigits: cryptoCurrency.fractionDigits, - ), - isChange: false, - ), - ]; + : throw ArgumentError('Address cannot be empty.'); // in the future, support for multiple recipients will work. final asset = assetId ?? xelis_sdk.xelisAsset; @@ -596,7 +549,7 @@ class XelisWallet extends LibXelisWallet { final defaultDecimals = cryptoCurrency.fractionDigits; final defaultFee = BigInt.from(0); - // Use default address if recipients list is empty + // Use default address if recipients list is empty to ensure basic fee estimates are readily available final effectiveRecipients = recipients.isNotEmpty ? recipients @@ -816,6 +769,9 @@ class XelisWallet extends LibXelisWallet { @override Future handleOnline() async { + await updateChainHeight(); + await updateBalance(); + await updateTransactions(); GlobalEventBus.instance.fire( WalletSyncStatusChangedEvent( WalletSyncStatus.synced, diff --git a/lib/wallets/wallet/intermediate/lib_xelis_wallet.dart b/lib/wallets/wallet/intermediate/lib_xelis_wallet.dart index 92178d93e..62876565b 100644 --- a/lib/wallets/wallet/intermediate/lib_xelis_wallet.dart +++ b/lib/wallets/wallet/intermediate/lib_xelis_wallet.dart @@ -32,6 +32,11 @@ enum XelisTableSize { } } +enum XelisWalletOpenType { + create, + restore +} + class XelisTableState { final bool isGenerating; final XelisTableSize currentSize; @@ -329,7 +334,7 @@ abstract class LibXelisWallet } @override - Future open() async { + Future open({XelisWalletOpenType? openType}) async { bool wasNull = false; if (libXelisWallet == null) { @@ -345,80 +350,66 @@ abstract class LibXelisWallet await LibXelisWallet._initMutex.protect(() async { try { - final needsCreation = await secureStorageInterface.read( - key: '_${walletId}_needs_creation', - ); - - final needsRestoration = await secureStorageInterface.read( - key: '_${walletId}_needs_restoration', - ); - libXelisWallet = await syncMutex.protect(() async { - if (needsCreation == 'true') { - Logging.instance.i("Xelis: creating new wallet"); - final wallet = await x_wallet.createXelisWallet( - name: name, - directory: directory, - password: password!, - network: cryptoCurrency.network.xelisNetwork, - precomputedTablesPath: tablePath, - l1Low: tableState.currentSize.isLow, - ); - - final mnemonic = await wallet.getSeed(); - await secureStorageInterface.write( - key: Wallet.mnemonicKey(walletId: walletId), - value: mnemonic.trim(), - ); - - await secureStorageInterface.delete( - key: '_${walletId}_needs_creation', - ); - - return wallet; - } else if (needsRestoration == 'true') { - final mnemonic = await getMnemonic(); - final seedLength = mnemonic.trim().split(" ").length; - - invalidSeedLengthCheck(seedLength); - - Logging.instance.i("Xelis: recovering wallet"); - final wallet = await x_wallet.createXelisWallet( - name: name, - directory: directory, - password: password!, - seed: mnemonic.trim(), - network: cryptoCurrency.network.xelisNetwork, - precomputedTablesPath: tablePath, - l1Low: tableState.currentSize.isLow, - ); - - await secureStorageInterface.write( - key: Wallet.mnemonicKey(walletId: walletId), - value: mnemonic.trim(), - ); - - await secureStorageInterface.delete( - key: '_${walletId}_needs_restoration', - ); - - return wallet; - } else { - Logging.instance.i("Xelis: opening existing wallet"); - return await x_wallet.openXelisWallet( - name: name, - directory: directory, - password: password!, - network: cryptoCurrency.network.xelisNetwork, - precomputedTablesPath: tablePath, - l1Low: tableState.currentSize.isLow, - ); + switch (openType) { + case XelisWalletOpenType.create: + Logging.instance.i("Xelis: creating new wallet"); + final wallet = await x_wallet.createXelisWallet( + name: name, + directory: directory, + password: password!, + network: cryptoCurrency.network.xelisNetwork, + precomputedTablesPath: tablePath, + l1Low: tableState.currentSize.isLow, + ); + + final mnemonic = await wallet.getSeed(); + await secureStorageInterface.write( + key: Wallet.mnemonicKey(walletId: walletId), + value: mnemonic.trim(), + ); + + return wallet; + + case XelisWalletOpenType.restore: + final mnemonic = await getMnemonic(); + final seedLength = mnemonic.trim().split(" ").length; + + invalidSeedLengthCheck(seedLength); + + Logging.instance.i("Xelis: recovering wallet"); + final wallet = await x_wallet.createXelisWallet( + name: name, + directory: directory, + password: password!, + seed: mnemonic.trim(), + network: cryptoCurrency.network.xelisNetwork, + precomputedTablesPath: tablePath, + l1Low: tableState.currentSize.isLow, + ); + + await secureStorageInterface.write( + key: Wallet.mnemonicKey(walletId: walletId), + value: mnemonic.trim(), + ); + + return wallet; + + case null: + Logging.instance.i("Xelis: opening existing wallet"); + return await x_wallet.openXelisWallet( + name: name, + directory: directory, + password: password!, + network: cryptoCurrency.network.xelisNetwork, + precomputedTablesPath: tablePath, + l1Low: tableState.currentSize.isLow, + ); } }); } catch (_) { - // Logging.instance.log( + // Logging.instance.e( // "Failed to open/create wallet: $e\n$s", - // level: LogLevel.Error, // ); rethrow; } diff --git a/lib/widgets/wallet_card.dart b/lib/widgets/wallet_card.dart index 4981dafaf..ed49e5ebb 100644 --- a/lib/widgets/wallet_card.dart +++ b/lib/widgets/wallet_card.dart @@ -28,7 +28,7 @@ import '../utilities/util.dart'; import '../wallets/isar/providers/eth/current_token_wallet_provider.dart'; import '../wallets/wallet/impl/ethereum_wallet.dart'; import '../wallets/wallet/impl/sub_wallets/eth_token_wallet.dart'; -import '../wallets/wallet/intermediate/lib_monero_wallet.dart'; +import '../wallets/wallet/intermediate/external_wallet.dart'; import '../wallets/wallet/wallet.dart'; import 'conditional_parent.dart'; import 'desktop/primary_button.dart'; @@ -111,7 +111,7 @@ class SimpleWalletCard extends ConsumerWidget { if (context.mounted) { final Future loadFuture; - if (wallet is LibMoneroWallet) { + if (wallet is ExternalWallet) { loadFuture = wallet.init().then((value) async => await (wallet).open()); } else { loadFuture = wallet.init(); diff --git a/pubspec.lock b/pubspec.lock index 5df33ec99..8bdf56e80 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -50,10 +50,10 @@ packages: dependency: transitive description: name: args - sha256: bf9f5caeea8d8fe6721a9c358dd8a5c1947b27f1cfaa18b39c301273594919e6 + sha256: d0481093c50b1da8910eb0bb301626d4d8eb7284aa739614d2b394ee09e3ea04 url: "https://pub.dev" source: hosted - version: "2.6.0" + version: "2.7.0" async: dependency: "direct main" description: @@ -223,10 +223,10 @@ packages: dependency: "direct dev" description: name: build_runner - sha256: "74691599a5bc750dc96a6b4bfd48f7d9d66453eab04c7f4063134800d6a5c573" + sha256: "058fe9dce1de7d69c4b84fada934df3e0153dd000758c4d65964d0166779aa99" url: "https://pub.dev" source: hosted - version: "2.4.14" + version: "2.4.15" build_runner_core: dependency: transitive description: @@ -247,10 +247,10 @@ packages: dependency: transitive description: name: built_value - sha256: "28a712df2576b63c6c005c465989a348604960c0958d28be5303ba9baa841ac2" + sha256: ea90e81dc4a25a043d9bee692d20ed6d1c4a1662a28c03a96417446c093ed6b4 url: "https://pub.dev" source: hosted - version: "8.9.3" + version: "8.9.5" calendar_date_picker2: dependency: "direct main" description: @@ -412,10 +412,10 @@ packages: dependency: transitive description: name: coverage - sha256: "88b0fddbe4c92910fefc09cc0248f5e7f0cd23e450ded4c28f16ab8ee8f83268" + sha256: e3493833ea012784c740e341952298f1cc77f1f01b1bbc3eb4eecf6984fb7f43 url: "https://pub.dev" source: hosted - version: "1.10.0" + version: "1.11.1" cross_file: dependency: transitive description: @@ -750,10 +750,10 @@ packages: dependency: "direct main" description: name: ffi - sha256: "16ed7b077ef01ad6170a3d0c57caa4a112a38d7a2ed5602e0aca9ca6f3d98da6" + sha256: "289279317b4b16eb2bb7e271abccd4bf84ec9bdcbe999e278a94b804f5630418" url: "https://pub.dev" source: hosted - version: "2.1.3" + version: "2.1.4" file: dependency: transitive description: @@ -897,10 +897,10 @@ packages: dependency: transitive description: name: flutter_rust_bridge - sha256: "3292ad6085552987b8b3b9a7e5805567f4013372d302736b702801acb001ee00" + sha256: "5a5c7a5deeef2cc2ffe6076a33b0429f4a20ceac22a397297aed2b1eb067e611" url: "https://pub.dev" source: hosted - version: "2.7.1" + version: "2.9.0" flutter_secure_storage: dependency: "direct main" description: @@ -1454,10 +1454,10 @@ packages: dependency: transitive description: name: package_config - sha256: "92d4488434b520a62570293fbd33bb556c7d49230791c1b4bbd973baf6d2dc67" + sha256: f096c55ebb7deb7e384101542bfba8c52696c1b56fca2eb62827989ef2353bbc url: "https://pub.dev" source: hosted - version: "2.1.1" + version: "2.2.0" package_info_plus: dependency: "direct main" description: @@ -1502,10 +1502,10 @@ packages: dependency: transitive description: name: path_provider_android - sha256: "4adf4fd5423ec60a29506c76581bc05854c55e3a0b72d35bb28d661c9686edf2" + sha256: "0ca7359dad67fd7063cb2892ab0c0737b2daafd807cf1acecd62374c8fae6c12" url: "https://pub.dev" source: hosted - version: "2.2.15" + version: "2.2.16" path_provider_foundation: dependency: transitive description: @@ -1662,10 +1662,10 @@ packages: dependency: transitive description: name: pub_semver - sha256: "7b3cfbf654f3edd0c6298ecd5be782ce997ddf0e00531b9464b55245185bbbbd" + sha256: "5bfcf68ca79ef689f8990d1160781b4bad40a3bd5e5218ad4076ddb7f4081585" url: "https://pub.dev" source: hosted - version: "2.1.5" + version: "2.2.0" pubspec_parse: dependency: transitive description: @@ -1782,10 +1782,10 @@ packages: dependency: transitive description: name: shelf_web_socket - sha256: cc36c297b52866d203dbf9332263c94becc2fe0ceaa9681d07b6ef9807023b67 + sha256: "3632775c8e90d6c9712f883e633716432a27758216dfb61bd86a8321c0580925" url: "https://pub.dev" source: hosted - version: "2.0.1" + version: "3.0.0" sky_engine: dependency: transitive description: flutter @@ -1845,10 +1845,10 @@ packages: dependency: transitive description: name: source_maps - sha256: "708b3f6b97248e5781f493b765c3337db11c5d2c81c3094f10904bfa8004c703" + sha256: "190222579a448b03896e0ca6eca5998fa810fda630c1d65e2f78b3f638f54812" url: "https://pub.dev" source: hosted - version: "0.10.12" + version: "0.10.13" source_span: dependency: transitive description: @@ -2339,7 +2339,7 @@ packages: description: path: "." ref: "v0.1.0" - resolved-ref: "966469f2660226c33a1de77d1c5efee5459a2d4e" + resolved-ref: c685c5d3550cca414ec30d4b61259761f129dda6 url: "https://github.com/Tritonn204/xelis_flutter_ffi.git" source: git version: "0.1.0" From 8f5d17d026549579a395180cf412ef9e4f1eb6ef Mon Sep 17 00:00:00 2001 From: Tritonn204 Date: Wed, 19 Mar 2025 16:31:50 -0500 Subject: [PATCH 152/193] close on restore for all ExternalWallet instances --- .../restore_wallet_view/restore_wallet_view.dart | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/pages/add_wallet_views/restore_wallet_view/restore_wallet_view.dart b/lib/pages/add_wallet_views/restore_wallet_view/restore_wallet_view.dart index 82aef0d60..972012c00 100644 --- a/lib/pages/add_wallet_views/restore_wallet_view/restore_wallet_view.dart +++ b/lib/pages/add_wallet_views/restore_wallet_view/restore_wallet_view.dart @@ -50,7 +50,7 @@ import '../../../wallets/isar/models/wallet_info.dart'; import '../../../wallets/wallet/impl/epiccash_wallet.dart'; import '../../../wallets/wallet/impl/monero_wallet.dart'; import '../../../wallets/wallet/impl/wownero_wallet.dart'; -import '../../../wallets/wallet/intermediate/lib_monero_wallet.dart'; +import '../../../wallets/wallet/intermediate/external_wallet.dart'; import '../../../wallets/wallet/impl/xelis_wallet.dart'; import '../../../wallets/wallet/supporting/epiccash_wallet_info_extension.dart'; import '../../../wallets/wallet/wallet.dart'; @@ -391,7 +391,7 @@ class _RestoreWalletViewState extends ConsumerState { await wallet.recover(isRescan: false); - if (wallet is LibMoneroWallet) { + if (wallet is ExternalWallet) { await wallet.exit(); } From f77950de685d1e3225f53409e054d4456abea7f1 Mon Sep 17 00:00:00 2001 From: Julian Date: Thu, 20 Mar 2025 07:53:38 -0600 Subject: [PATCH 153/193] ensure fee amount is formatted correctly to String --- lib/wallets/wallet/impl/xelis_wallet.dart | 8 +++++--- lib/wallets/wallet/intermediate/lib_xelis_wallet.dart | 9 +++------ 2 files changed, 8 insertions(+), 9 deletions(-) diff --git a/lib/wallets/wallet/impl/xelis_wallet.dart b/lib/wallets/wallet/impl/xelis_wallet.dart index 466755bae..4f6a3b271 100644 --- a/lib/wallets/wallet/impl/xelis_wallet.dart +++ b/lib/wallets/wallet/impl/xelis_wallet.dart @@ -4,9 +4,9 @@ import 'dart:math'; import 'package:isar/isar.dart'; import 'package:mutex/mutex.dart'; +import 'package:stack_wallet_backup/generate_password.dart'; import 'package:xelis_dart_sdk/xelis_dart_sdk.dart' as xelis_sdk; import 'package:xelis_flutter/src/api/wallet.dart' as x_wallet; -import 'package:stack_wallet_backup/generate_password.dart'; import '../../../models/balance.dart'; import '../../../models/isar/models/blockchain_data/address.dart'; @@ -384,7 +384,7 @@ class XelisWallet extends LibXelisWallet { otherData['asset_${transfer.asset}_amount'] = transfer.amount.toString(); - otherData['asset_${transfer.asset}_fee'] = fee.toString(); + otherData['asset_${transfer.asset}_fee'] = fee.raw.toString(); if (transfer.extraData != null) { otherData['extraData_${transfer.asset}'] = transfer.extraData!.toJson(); @@ -473,7 +473,9 @@ class XelisWallet extends LibXelisWallet { final recipients = txData.recipients?.isNotEmpty == true ? txData.recipients! - : throw ArgumentError('Address cannot be empty.'); // in the future, support for multiple recipients will work. + : throw ArgumentError( + 'Address cannot be empty.', + ); // in the future, support for multiple recipients will work. final asset = assetId ?? xelis_sdk.xelisAsset; diff --git a/lib/wallets/wallet/intermediate/lib_xelis_wallet.dart b/lib/wallets/wallet/intermediate/lib_xelis_wallet.dart index 62876565b..51d2b58af 100644 --- a/lib/wallets/wallet/intermediate/lib_xelis_wallet.dart +++ b/lib/wallets/wallet/intermediate/lib_xelis_wallet.dart @@ -32,10 +32,7 @@ enum XelisTableSize { } } -enum XelisWalletOpenType { - create, - restore -} +enum XelisWalletOpenType { create, restore } class XelisTableState { final bool isGenerating; @@ -370,7 +367,7 @@ abstract class LibXelisWallet ); return wallet; - + case XelisWalletOpenType.restore: final mnemonic = await getMnemonic(); final seedLength = mnemonic.trim().split(" ").length; @@ -394,7 +391,7 @@ abstract class LibXelisWallet ); return wallet; - + case null: Logging.instance.i("Xelis: opening existing wallet"); return await x_wallet.openXelisWallet( From fe437855461b3ff4cb952f99c00a41cfaf1540d3 Mon Sep 17 00:00:00 2001 From: Julian Date: Thu, 20 Mar 2025 10:04:16 -0600 Subject: [PATCH 154/193] more logging --- lib/wallets/wallet/impl/xelis_wallet.dart | 105 +++++++++--------- .../wallet/intermediate/lib_xelis_wallet.dart | 49 ++++---- 2 files changed, 76 insertions(+), 78 deletions(-) diff --git a/lib/wallets/wallet/impl/xelis_wallet.dart b/lib/wallets/wallet/impl/xelis_wallet.dart index 4f6a3b271..febfc9463 100644 --- a/lib/wallets/wallet/impl/xelis_wallet.dart +++ b/lib/wallets/wallet/impl/xelis_wallet.dart @@ -77,11 +77,12 @@ class XelisWallet extends LibXelisWallet { try { await open(); - } catch (_) { - // Logging.instance.log( - // "Exception rethrown from recoverFromMnemonic(): $e\n$s", - // level: LogLevel.Error, - // ); + } catch (e, s) { + Logging.instance.e( + "Error rethrown from $runtimeType recover(isRescan: $isRescan)", + error: e, + stackTrace: s, + ); rethrow; } } @@ -129,11 +130,12 @@ class XelisWallet extends LibXelisWallet { ); await info.updateBalance(newBalance: balance, isar: mainDB.isar); } - } catch (_) { - // Logging.instance.log( - // "Error in updateBalance(): $e\n$s", - // level: LogLevel.Warning, - // ); + } catch (e, s) { + Logging.instance.e( + "Error in $runtimeType updateBalance()", + error: e, + stackTrace: s, + ); } }); } @@ -156,28 +158,29 @@ class XelisWallet extends LibXelisWallet { newHeight: height.toInt(), isar: mainDB.isar, ); - } catch (_) { - // Logging.instance.log( - // "Error in updateChainHeight(): $e\n$s", - // level: LogLevel.Warning, - // ); + } catch (e, s) { + Logging.instance.e( + "Error in $runtimeType updateChainHeight()", + error: e, + stackTrace: s, + ); } } @override Future updateNode() async { try { - final node = getCurrentNode(); final bool online = await libXelisWallet!.isOnline(); if (online == true) { await libXelisWallet!.offlineMode(); } await super.connect(); - } catch (_) { - // Logging.instance.log( - // "Error updating node: $e\n$s", - // level: LogLevel.Error, - // ); + } catch (e, s) { + Logging.instance.e( + "Error rethrown from $runtimeType updateNode()", + error: e, + stackTrace: s, + ); rethrow; } } @@ -420,11 +423,12 @@ class XelisWallet extends LibXelisWallet { // ); txns.add(txn); - } catch (_) { - // Logging.instance.log( - // "Error handling tx $jsonString: $e\n$s", - // level: LogLevel.Warning, - // ); + } catch (e, s) { + Logging.instance.w( + "Error in $runtimeType handling transaction: $jsonString", + error: e, + stackTrace: s, + ); } } await updateBalance(); @@ -707,11 +711,12 @@ class XelisWallet extends LibXelisWallet { case HistorySynced(:final topoheight): await handleHistorySynced(topoheight); } - } catch (_) { - // Logging.instance.log( - // "Error handling wallet event: $e\n$s", - // level: LogLevel.Error, - // ); + } catch (e, s) { + Logging.instance.e( + "Error in $runtimeType handleEvent($event)", + error: e, + stackTrace: s, + ); } } @@ -735,11 +740,12 @@ class XelisWallet extends LibXelisWallet { // "New transaction processed: ${newTxIds.first}", // level: LogLevel.Info, // ); - } catch (_) { - // Logging.instance.log( - // "Error handling new transaction: $e\n$s", - // level: LogLevel.Warning, - // ); + } catch (e, s) { + Logging.instance.e( + "Error in $runtimeType handleNewTransaction($tx)", + error: e, + stackTrace: s, + ); } } @@ -752,11 +758,12 @@ class XelisWallet extends LibXelisWallet { } // TODO: Update asset balances if needed - } catch (_) { - // Logging.instance.log( - // "Error handling balance change: $e\n$s", - // level: LogLevel.Warning, - // ); + } catch (e, s) { + Logging.instance.e( + "Error in $runtimeType handleBalanceChanged($event)", + error: e, + stackTrace: s, + ); } } @@ -813,10 +820,7 @@ class XelisWallet extends LibXelisWallet { Future handleNewAsset(xelis_sdk.AssetData asset) async { // TODO: Store asset information if needed // TODO: Update UI/state for new asset - // Logging.instance.log( - // "New asset detected: ${asset}", - // level: LogLevel.Info, - // ); + Logging.instance.d("New xelis asset detected: $asset"); } @override @@ -837,11 +841,12 @@ class XelisWallet extends LibXelisWallet { ), ); } - } catch (_) { - // Logging.instance.log( - // "Error in refresh(): $e\n$s", - // level: LogLevel.Warning, - // ); + } catch (e, s) { + Logging.instance.e( + "Error in $runtimeType refresh()", + error: e, + stackTrace: s, + ); } }); } diff --git a/lib/wallets/wallet/intermediate/lib_xelis_wallet.dart b/lib/wallets/wallet/intermediate/lib_xelis_wallet.dart index 51d2b58af..78caa6c87 100644 --- a/lib/wallets/wallet/intermediate/lib_xelis_wallet.dart +++ b/lib/wallets/wallet/intermediate/lib_xelis_wallet.dart @@ -260,11 +260,12 @@ abstract class LibXelisWallet case xelis_sdk.WalletEvent.historySynced: yield HistorySynced(json['data']['topoheight'] as int); } - } catch (_) { - // Logging.instance.log( - // "Error processing wallet event: $e\n$s", - // level: LogLevel.Error, - // ); + } catch (e, s) { + Logging.instance.e( + "Error processing xelis wallet event: $rawData", + error: e, + stackTrace: s, + ); continue; } } @@ -284,23 +285,21 @@ abstract class LibXelisWallet Future refresh({int? topoheight}); Future connect() async { + final node = getCurrentNode(); try { _eventSubscription = convertRawEvents().listen(handleEvent); - final node = getCurrentNode(); - // Logging.instance.log( - // "Connecting to node: ${node.host}:${node.port}", - // level: LogLevel.Info, - // ); + Logging.instance.i("Connecting to node: ${node.host}:${node.port}"); await libXelisWallet!.onlineMode( daemonAddress: "${node.host}:${node.port}", ); await super.refresh(); - } catch (_) { - // Logging.instance.log( - // "Error connecting to node: $e\n$s", - // level: LogLevel.Error, - // ); + } catch (e, s) { + Logging.instance.e( + "rethrowing error connecting to node: $node", + error: e, + stackTrace: s, + ); rethrow; } } @@ -404,10 +403,12 @@ abstract class LibXelisWallet ); } }); - } catch (_) { - // Logging.instance.e( - // "Failed to open/create wallet: $e\n$s", - // ); + } catch (e, s) { + Logging.instance.e( + "Rethrowing failed $runtimeType open(openType: $openType)", + error: e, + stackTrace: s, + ); rethrow; } }); @@ -440,15 +441,7 @@ abstract class LibXelisWallet } if (wasNull) { - try { - await connect(); - } catch (e) { - // Logging.instance.log( - // "Failed to start sync: $e", - // level: LogLevel.Error, - // ); - rethrow; - } + await connect(); } unawaited(refresh()); From e4ac7d85693de4d50775d59b8ec0352f2437ce1e Mon Sep 17 00:00:00 2001 From: Julian Date: Thu, 20 Mar 2025 11:34:50 -0600 Subject: [PATCH 155/193] add missing continue; --- lib/wallets/wallet/impl/xelis_wallet.dart | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/wallets/wallet/impl/xelis_wallet.dart b/lib/wallets/wallet/impl/xelis_wallet.dart index febfc9463..8be779fc8 100644 --- a/lib/wallets/wallet/impl/xelis_wallet.dart +++ b/lib/wallets/wallet/impl/xelis_wallet.dart @@ -395,6 +395,7 @@ class XelisWallet extends LibXelisWallet { } } else { // Skip unknown entry types + continue; } final txn = TransactionV2( From 8c48930feb7df45db87d935e64a3778e8c9ba4ae Mon Sep 17 00:00:00 2001 From: sneurlax Date: Thu, 20 Mar 2025 12:56:41 -0500 Subject: [PATCH 156/193] fix: update flutter_libepiccash to main --- crypto_plugins/flutter_libepiccash | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/crypto_plugins/flutter_libepiccash b/crypto_plugins/flutter_libepiccash index 3644a34a0..8830be2ba 160000 --- a/crypto_plugins/flutter_libepiccash +++ b/crypto_plugins/flutter_libepiccash @@ -1 +1 @@ -Subproject commit 3644a34a0a65759b4d70b5be931a34e8b5fdc430 +Subproject commit 8830be2ba661828d743be12df6f33d560448ed6a From 176ed0f89fd9a6d4eddadbdf3bd8e469f8c4c596 Mon Sep 17 00:00:00 2001 From: Tritonn204 Date: Thu, 20 Mar 2025 14:51:12 -0500 Subject: [PATCH 157/193] Xelis init/open refactor --- lib/wallets/wallet/impl/xelis_wallet.dart | 152 ++++++++++++++++-- .../wallet/intermediate/lib_xelis_wallet.dart | 132 ++------------- 2 files changed, 149 insertions(+), 135 deletions(-) diff --git a/lib/wallets/wallet/impl/xelis_wallet.dart b/lib/wallets/wallet/impl/xelis_wallet.dart index 466755bae..36ebe2812 100644 --- a/lib/wallets/wallet/impl/xelis_wallet.dart +++ b/lib/wallets/wallet/impl/xelis_wallet.dart @@ -19,6 +19,8 @@ import '../../../services/event_bus/events/global/wallet_sync_status_changed_eve import '../../../services/event_bus/global_event_bus.dart'; import '../../../utilities/amount/amount.dart'; import '../../../utilities/logger.dart'; +import '../../../utilities/stack_file_system.dart'; + import '../../crypto_currency/crypto_currency.dart'; import '../../models/tx_data.dart'; import '../intermediate/lib_xelis_wallet.dart'; @@ -31,7 +33,46 @@ class XelisWallet extends LibXelisWallet { @override int get isarTransactionVersion => 2; + Future _restoreWallet() async { + final tablePath = await getPrecomputedTablesPath(); + final tableState = await getTableState(); + final xelisDir = await StackFileSystem.applicationXelisDirectory(); + final String name = walletId; + final String directory = xelisDir.path; + final password = await secureStorageInterface.read( + key: Wallet.mnemonicPassphraseKey(walletId: info.walletId), + ); + + final mnemonic = await getMnemonic(); + final seedLength = mnemonic.trim().split(" ").length; + + invalidSeedLengthCheck(seedLength); + + Logging.instance.i("Xelis: recovering wallet"); + final wallet = await x_wallet.createXelisWallet( + name: name, + directory: directory, + password: password!, + seed: mnemonic.trim(), + network: cryptoCurrency.network.xelisNetwork, + precomputedTablesPath: tablePath, + l1Low: tableState.currentSize.isLow, + ); + + await secureStorageInterface.write( + key: Wallet.mnemonicKey(walletId: walletId), + value: mnemonic.trim(), + ); + + libXelisWallet = wallet; + } + Future _createNewWallet() async { + final tablePath = await getPrecomputedTablesPath(); + final tableState = await getTableState(); + final xelisDir = await StackFileSystem.applicationXelisDirectory(); + final String name = walletId; + final String directory = xelisDir.path; final String password = generatePassword(); Logging.instance.d("Xelis: storing password"); @@ -39,21 +80,84 @@ class XelisWallet extends LibXelisWallet { key: Wallet.mnemonicPassphraseKey(walletId: info.walletId), value: password, ); + + final wallet = await x_wallet.createXelisWallet( + name: name, + directory: directory, + password: password!, + network: cryptoCurrency.network.xelisNetwork, + precomputedTablesPath: tablePath, + l1Low: tableState.currentSize.isLow, + ); + + final mnemonic = await wallet.getSeed(); + await secureStorageInterface.write( + key: Wallet.mnemonicKey(walletId: walletId), + value: mnemonic.trim(), + ); + + libXelisWallet = wallet; } @override Future init({bool? isRestore}) async { Logging.instance.d("Xelis: init"); - if (isRestore == true) { - await super.init(); - return await open(openType: XelisWalletOpenType.restore); - } + if (libXelisWallet == null) { + if (isRestore == true) { + await _restoreWallet(); + } else { + final bool walletExists = await LibXelisWallet.checkWalletExists(walletId); + if (!walletExists) { + await _createNewWallet(); + } else { + Logging.instance.i("Xelis: opening existing wallet"); + final tablePath = await getPrecomputedTablesPath(); + final tableState = await getTableState(); + final xelisDir = await StackFileSystem.applicationXelisDirectory(); + final String name = walletId; + final String directory = xelisDir.path; + final password = await secureStorageInterface.read( + key: Wallet.mnemonicPassphraseKey(walletId: info.walletId), + ); + + libXelisWallet = await x_wallet.openXelisWallet( + name: name, + directory: directory, + password: password!, + network: cryptoCurrency.network.xelisNetwork, + precomputedTablesPath: tablePath, + l1Low: tableState.currentSize.isLow, + ); + + print("Assigned wallet"); + } + } - final bool walletExists = await LibXelisWallet.checkWalletExists(walletId); - if (!walletExists) { - await _createNewWallet(); - await open(openType: XelisWalletOpenType.create); + if (await isTableUpgradeAvailable()) { + unawaited(updateTablesToDesiredSize()); + } + + final newReceivingAddress = + await getCurrentReceivingAddress() ?? + Address( + walletId: walletId, + derivationIndex: 0, + derivationPath: null, + value: libXelisWallet!.getAddressStr(), + publicKey: [], + type: AddressType.xelis, + subType: AddressSubType.receiving, + ); + + await mainDB.updateOrPutAddresses([newReceivingAddress]); + + if (info.cachedReceivingAddress != newReceivingAddress.value) { + await info.updateReceivingAddress( + newAddress: newReceivingAddress.value, + isar: mainDB.isar, + ); + } } return await super.init(); @@ -88,15 +192,37 @@ class XelisWallet extends LibXelisWallet { @override Future pingCheck() async { - checkInitialized(); try { - await libXelisWallet!.getDaemonInfo(); - await handleOnline(); - return true; + final node = getCurrentNode(); + final daemon = xelis_sdk.DaemonClient( + endPoint: "${node.host!}:${node.port!}", + secureWebSocket: node.useSSL ?? false, + timeout: 5000 + ); + daemon.connect(); + + final xelis_sdk.GetInfoResult networkInfo = await daemon.getInfo(); + bool testPassed = networkInfo.height != null; + + daemon.disconnect(); + + if (testPassed) { + GlobalEventBus.instance.fire( + WalletSyncStatusChangedEvent( + WalletSyncStatus.synced, + walletId, + info.coin, + ), + ); + } else { + await handleOffline(); + } + + return testPassed; } catch (_) { await handleOffline(); return false; - } + } } final _balanceUpdateMutex = Mutex(); diff --git a/lib/wallets/wallet/intermediate/lib_xelis_wallet.dart b/lib/wallets/wallet/intermediate/lib_xelis_wallet.dart index 62876565b..a20868e74 100644 --- a/lib/wallets/wallet/intermediate/lib_xelis_wallet.dart +++ b/lib/wallets/wallet/intermediate/lib_xelis_wallet.dart @@ -335,125 +335,15 @@ abstract class LibXelisWallet @override Future open({XelisWalletOpenType? openType}) async { - bool wasNull = false; - - if (libXelisWallet == null) { - wasNull = true; - final tablePath = await getPrecomputedTablesPath(); - final tableState = await getTableState(); - final xelisDir = await StackFileSystem.applicationXelisDirectory(); - final String name = walletId; - final String directory = xelisDir.path; - final password = await secureStorageInterface.read( - key: Wallet.mnemonicPassphraseKey(walletId: info.walletId), - ); - - await LibXelisWallet._initMutex.protect(() async { - try { - libXelisWallet = await syncMutex.protect(() async { - switch (openType) { - case XelisWalletOpenType.create: - Logging.instance.i("Xelis: creating new wallet"); - final wallet = await x_wallet.createXelisWallet( - name: name, - directory: directory, - password: password!, - network: cryptoCurrency.network.xelisNetwork, - precomputedTablesPath: tablePath, - l1Low: tableState.currentSize.isLow, - ); - - final mnemonic = await wallet.getSeed(); - await secureStorageInterface.write( - key: Wallet.mnemonicKey(walletId: walletId), - value: mnemonic.trim(), - ); - - return wallet; - - case XelisWalletOpenType.restore: - final mnemonic = await getMnemonic(); - final seedLength = mnemonic.trim().split(" ").length; - - invalidSeedLengthCheck(seedLength); - - Logging.instance.i("Xelis: recovering wallet"); - final wallet = await x_wallet.createXelisWallet( - name: name, - directory: directory, - password: password!, - seed: mnemonic.trim(), - network: cryptoCurrency.network.xelisNetwork, - precomputedTablesPath: tablePath, - l1Low: tableState.currentSize.isLow, - ); - - await secureStorageInterface.write( - key: Wallet.mnemonicKey(walletId: walletId), - value: mnemonic.trim(), - ); - - return wallet; - - case null: - Logging.instance.i("Xelis: opening existing wallet"); - return await x_wallet.openXelisWallet( - name: name, - directory: directory, - password: password!, - network: cryptoCurrency.network.xelisNetwork, - precomputedTablesPath: tablePath, - l1Low: tableState.currentSize.isLow, - ); - } - }); - } catch (_) { - // Logging.instance.e( - // "Failed to open/create wallet: $e\n$s", - // ); - rethrow; - } - }); - - Logging.instance.i("Xelis: Checking for upgradability"); - if (await isTableUpgradeAvailable()) { - Logging.instance.i("Xelis: Generating large tables in background"); - unawaited(updateTablesToDesiredSize()); - } - } - - final newReceivingAddress = - await getCurrentReceivingAddress() ?? - Address( - walletId: walletId, - derivationIndex: 0, - derivationPath: null, - value: libXelisWallet!.getAddressStr(), - publicKey: [], - type: AddressType.xelis, - subType: AddressSubType.receiving, - ); - await mainDB.updateOrPutAddresses([newReceivingAddress]); - - if (info.cachedReceivingAddress != newReceivingAddress.value) { - await info.updateReceivingAddress( - newAddress: newReceivingAddress.value, - isar: mainDB.isar, - ); - } - - if (wasNull) { - try { - await connect(); - } catch (e) { - // Logging.instance.log( - // "Failed to start sync: $e", - // level: LogLevel.Error, - // ); - rethrow; - } + try { + await connect(); + } catch (e) { + // Logging.instance.log( + // "Failed to start sync: $e", + // level: LogLevel.Error, + // ); + rethrow; } - unawaited(refresh()); } @@ -467,10 +357,6 @@ abstract class LibXelisWallet _eventSubscription = null; await libXelisWallet?.offlineMode(); - await libXelisWallet?.close(); - libXelisWallet?.dispose(); - libXelisWallet = null; - await super.exit(); }); } @@ -521,6 +407,8 @@ extension XelisTableManagement on LibXelisWallet { await setTableState(state.copyWith(isGenerating: true)); try { + Logging.instance.i("Xelis: Generating large tables in background"); + final tablePath = await getPrecomputedTablesPath(); await x_wallet.updateTables( precomputedTablesPath: tablePath, From ae0631adebbcbe309f7ca68cc87e08059f68e229 Mon Sep 17 00:00:00 2001 From: Tritonn204 Date: Thu, 20 Mar 2025 15:11:37 -0500 Subject: [PATCH 158/193] reversed investigative changes --- lib/wallets/wallet/impl/xelis_wallet.dart | 32 +++-------------------- 1 file changed, 4 insertions(+), 28 deletions(-) diff --git a/lib/wallets/wallet/impl/xelis_wallet.dart b/lib/wallets/wallet/impl/xelis_wallet.dart index 36ebe2812..06ee5147c 100644 --- a/lib/wallets/wallet/impl/xelis_wallet.dart +++ b/lib/wallets/wallet/impl/xelis_wallet.dart @@ -129,8 +129,6 @@ class XelisWallet extends LibXelisWallet { precomputedTablesPath: tablePath, l1Low: tableState.currentSize.isLow, ); - - print("Assigned wallet"); } } @@ -192,33 +190,11 @@ class XelisWallet extends LibXelisWallet { @override Future pingCheck() async { + checkInitialized(); try { - final node = getCurrentNode(); - final daemon = xelis_sdk.DaemonClient( - endPoint: "${node.host!}:${node.port!}", - secureWebSocket: node.useSSL ?? false, - timeout: 5000 - ); - daemon.connect(); - - final xelis_sdk.GetInfoResult networkInfo = await daemon.getInfo(); - bool testPassed = networkInfo.height != null; - - daemon.disconnect(); - - if (testPassed) { - GlobalEventBus.instance.fire( - WalletSyncStatusChangedEvent( - WalletSyncStatus.synced, - walletId, - info.coin, - ), - ); - } else { - await handleOffline(); - } - - return testPassed; + await libXelisWallet!.getDaemonInfo(); + await handleOnline(); + return true; } catch (_) { await handleOffline(); return false; From 78b4e2d6b70d42a7776b9f65372817dadc464f21 Mon Sep 17 00:00:00 2001 From: Tritonn204 Date: Thu, 20 Mar 2025 19:50:01 -0500 Subject: [PATCH 159/193] Added initCompleter for Xelis --- crypto_plugins/flutter_libepiccash | 2 +- lib/wallets/wallet/impl/xelis_wallet.dart | 137 +++++++++++------- .../wallet/intermediate/lib_xelis_wallet.dart | 6 +- 3 files changed, 88 insertions(+), 57 deletions(-) diff --git a/crypto_plugins/flutter_libepiccash b/crypto_plugins/flutter_libepiccash index 8830be2ba..0bb1b1ced 160000 --- a/crypto_plugins/flutter_libepiccash +++ b/crypto_plugins/flutter_libepiccash @@ -1 +1 @@ -Subproject commit 8830be2ba661828d743be12df6f33d560448ed6a +Subproject commit 0bb1b1ced6e0d3c66e383698f89825754c692986 diff --git a/lib/wallets/wallet/impl/xelis_wallet.dart b/lib/wallets/wallet/impl/xelis_wallet.dart index a57f03a02..42c681579 100644 --- a/lib/wallets/wallet/impl/xelis_wallet.dart +++ b/lib/wallets/wallet/impl/xelis_wallet.dart @@ -27,6 +27,8 @@ import '../intermediate/lib_xelis_wallet.dart'; import '../wallet.dart'; class XelisWallet extends LibXelisWallet { + Completer? _initCompleter; + XelisWallet(CryptoCurrencyNetwork network) : super(Xelis(network)); // ==================== Overrides ============================================ @@ -65,6 +67,8 @@ class XelisWallet extends LibXelisWallet { ); libXelisWallet = wallet; + + await _finishInit(); } Future _createNewWallet() async { @@ -97,68 +101,94 @@ class XelisWallet extends LibXelisWallet { ); libXelisWallet = wallet; + + await _finishInit(); + } + + Future _existingWallet() async { + print("EXISTING"); + Logging.instance.i("Xelis: opening existing wallet"); + final tablePath = await getPrecomputedTablesPath(); + final tableState = await getTableState(); + final xelisDir = await StackFileSystem.applicationXelisDirectory(); + final String name = walletId; + final String directory = xelisDir.path; + final password = await secureStorageInterface.read( + key: Wallet.mnemonicPassphraseKey(walletId: info.walletId), + ); + + libXelisWallet = await x_wallet.openXelisWallet( + name: name, + directory: directory, + password: password!, + network: cryptoCurrency.network.xelisNetwork, + precomputedTablesPath: tablePath, + l1Low: tableState.currentSize.isLow, + ); + + await _finishInit(); + } + + Future _finishInit() async { + if (await isTableUpgradeAvailable()) { + unawaited(updateTablesToDesiredSize()); + } + + final newReceivingAddress = + await getCurrentReceivingAddress() ?? + Address( + walletId: walletId, + derivationIndex: 0, + derivationPath: null, + value: libXelisWallet!.getAddressStr(), + publicKey: [], + type: AddressType.xelis, + subType: AddressSubType.receiving, + ); + + await mainDB.updateOrPutAddresses([newReceivingAddress]); + + if (info.cachedReceivingAddress != newReceivingAddress.value) { + await info.updateReceivingAddress( + newAddress: newReceivingAddress.value, + isar: mainDB.isar, + ); + } } @override Future init({bool? isRestore}) async { Logging.instance.d("Xelis: init"); - if (libXelisWallet == null) { - if (isRestore == true) { - await _restoreWallet(); - } else { - final bool walletExists = await LibXelisWallet.checkWalletExists(walletId); - if (!walletExists) { - await _createNewWallet(); - } else { - Logging.instance.i("Xelis: opening existing wallet"); - final tablePath = await getPrecomputedTablesPath(); - final tableState = await getTableState(); - final xelisDir = await StackFileSystem.applicationXelisDirectory(); - final String name = walletId; - final String directory = xelisDir.path; - final password = await secureStorageInterface.read( - key: Wallet.mnemonicPassphraseKey(walletId: info.walletId), - ); - - libXelisWallet = await x_wallet.openXelisWallet( - name: name, - directory: directory, - password: password!, - network: cryptoCurrency.network.xelisNetwork, - precomputedTablesPath: tablePath, - l1Low: tableState.currentSize.isLow, - ); - } - } + if (_initCompleter != null) { + await _initCompleter!.future; + return super.init(); + } - if (await isTableUpgradeAvailable()) { - unawaited(updateTablesToDesiredSize()); - } + _initCompleter = Completer(); - final newReceivingAddress = - await getCurrentReceivingAddress() ?? - Address( - walletId: walletId, - derivationIndex: 0, - derivationPath: null, - value: libXelisWallet!.getAddressStr(), - publicKey: [], - type: AddressType.xelis, - subType: AddressSubType.receiving, - ); - - await mainDB.updateOrPutAddresses([newReceivingAddress]); + try { + final bool walletExists = await LibXelisWallet.checkWalletExists(walletId); - if (info.cachedReceivingAddress != newReceivingAddress.value) { - await info.updateReceivingAddress( - newAddress: newReceivingAddress.value, - isar: mainDB.isar, - ); + if (libXelisWallet == null) { + if (isRestore == true) { + await _restoreWallet(); + } else { + if (!walletExists) { + await _createNewWallet(); + } else { + await _existingWallet(); + } + } } + } catch (e) { + _initCompleter!.completeError(e); + rethrow; + } finally { + _initCompleter!.complete(); } - return await super.init(); + return super.init(); } @override @@ -191,7 +221,9 @@ class XelisWallet extends LibXelisWallet { @override Future pingCheck() async { - checkInitialized(); + if (libXelisWallet == null) { + return false; + } try { await libXelisWallet!.getDaemonInfo(); await handleOnline(); @@ -247,7 +279,7 @@ class XelisWallet extends LibXelisWallet { final Map nodeInfo = (json.decode(infoString) as Map).cast(); - pruningHeight = int.parse(nodeInfo['pruned_topoheight'].toString()); + pruningHeight = int.tryParse(nodeInfo['pruned_topoheight']?.toString() ?? '0') ?? 0; return int.parse(nodeInfo['topoheight'].toString()); } @@ -928,6 +960,7 @@ class XelisWallet extends LibXelisWallet { @override Future refresh({int? topoheight}) async { + if (libXelisWallet == null) { return; } await refreshMutex.protect(() async { try { final bool online = await libXelisWallet!.isOnline(); diff --git a/lib/wallets/wallet/intermediate/lib_xelis_wallet.dart b/lib/wallets/wallet/intermediate/lib_xelis_wallet.dart index e494d68db..ce84718ba 100644 --- a/lib/wallets/wallet/intermediate/lib_xelis_wallet.dart +++ b/lib/wallets/wallet/intermediate/lib_xelis_wallet.dart @@ -32,8 +32,6 @@ enum XelisTableSize { } } -enum XelisWalletOpenType { create, restore } - class XelisTableState { final bool isGenerating; final XelisTableSize currentSize; @@ -330,7 +328,7 @@ abstract class LibXelisWallet } @override - Future open({XelisWalletOpenType? openType}) async { + Future open() async { try { await connect(); } catch (e) { @@ -439,4 +437,4 @@ extension XelisTableManagement on LibXelisWallet { } }); } -} +} \ No newline at end of file From 4431d8c689091059e5cb25cb98de66c39574a62e Mon Sep 17 00:00:00 2001 From: Tritonn204 Date: Thu, 20 Mar 2025 19:55:46 -0500 Subject: [PATCH 160/193] re-enabled null checks for Xelis afer open() --- lib/wallets/wallet/impl/xelis_wallet.dart | 4 ---- 1 file changed, 4 deletions(-) diff --git a/lib/wallets/wallet/impl/xelis_wallet.dart b/lib/wallets/wallet/impl/xelis_wallet.dart index 42c681579..1d113090a 100644 --- a/lib/wallets/wallet/impl/xelis_wallet.dart +++ b/lib/wallets/wallet/impl/xelis_wallet.dart @@ -221,9 +221,6 @@ class XelisWallet extends LibXelisWallet { @override Future pingCheck() async { - if (libXelisWallet == null) { - return false; - } try { await libXelisWallet!.getDaemonInfo(); await handleOnline(); @@ -960,7 +957,6 @@ class XelisWallet extends LibXelisWallet { @override Future refresh({int? topoheight}) async { - if (libXelisWallet == null) { return; } await refreshMutex.protect(() async { try { final bool online = await libXelisWallet!.isOnline(); From 03f4b2fdea5e394c9411d3065f7ebf841dbfcd8f Mon Sep 17 00:00:00 2001 From: Tritonn204 Date: Thu, 20 Mar 2025 21:22:51 -0500 Subject: [PATCH 161/193] removed init finally{} block for Xelis --- lib/wallets/wallet/impl/xelis_wallet.dart | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/lib/wallets/wallet/impl/xelis_wallet.dart b/lib/wallets/wallet/impl/xelis_wallet.dart index 1d113090a..56b774194 100644 --- a/lib/wallets/wallet/impl/xelis_wallet.dart +++ b/lib/wallets/wallet/impl/xelis_wallet.dart @@ -181,11 +181,10 @@ class XelisWallet extends LibXelisWallet { } } } + _initCompleter!.complete(); } catch (e) { _initCompleter!.completeError(e); rethrow; - } finally { - _initCompleter!.complete(); } return super.init(); From 42d7275b511d78ce943fa284d0a321d1657581a8 Mon Sep 17 00:00:00 2001 From: Tritonn204 Date: Thu, 20 Mar 2025 21:32:44 -0500 Subject: [PATCH 162/193] removed print --- lib/wallets/wallet/impl/xelis_wallet.dart | 1 - 1 file changed, 1 deletion(-) diff --git a/lib/wallets/wallet/impl/xelis_wallet.dart b/lib/wallets/wallet/impl/xelis_wallet.dart index 56b774194..d9511c379 100644 --- a/lib/wallets/wallet/impl/xelis_wallet.dart +++ b/lib/wallets/wallet/impl/xelis_wallet.dart @@ -106,7 +106,6 @@ class XelisWallet extends LibXelisWallet { } Future _existingWallet() async { - print("EXISTING"); Logging.instance.i("Xelis: opening existing wallet"); final tablePath = await getPrecomputedTablesPath(); final tableState = await getTableState(); From 37f318a902e380ca035a7f568275490ffede554c Mon Sep 17 00:00:00 2001 From: Julian Date: Thu, 20 Mar 2025 20:47:10 -0600 Subject: [PATCH 163/193] linting, formatting, small cleanups, and an extra logging call --- crypto_plugins/flutter_libepiccash | 2 +- lib/wallets/wallet/impl/xelis_wallet.dart | 42 +++++++++++-------- .../wallet/intermediate/lib_xelis_wallet.dart | 4 +- 3 files changed, 26 insertions(+), 22 deletions(-) diff --git a/crypto_plugins/flutter_libepiccash b/crypto_plugins/flutter_libepiccash index 0bb1b1ced..8830be2ba 160000 --- a/crypto_plugins/flutter_libepiccash +++ b/crypto_plugins/flutter_libepiccash @@ -1 +1 @@ -Subproject commit 0bb1b1ced6e0d3c66e383698f89825754c692986 +Subproject commit 8830be2ba661828d743be12df6f33d560448ed6a diff --git a/lib/wallets/wallet/impl/xelis_wallet.dart b/lib/wallets/wallet/impl/xelis_wallet.dart index 56b774194..87de162f7 100644 --- a/lib/wallets/wallet/impl/xelis_wallet.dart +++ b/lib/wallets/wallet/impl/xelis_wallet.dart @@ -20,7 +20,6 @@ import '../../../services/event_bus/global_event_bus.dart'; import '../../../utilities/amount/amount.dart'; import '../../../utilities/logger.dart'; import '../../../utilities/stack_file_system.dart'; - import '../../crypto_currency/crypto_currency.dart'; import '../../models/tx_data.dart'; import '../intermediate/lib_xelis_wallet.dart'; @@ -88,7 +87,7 @@ class XelisWallet extends LibXelisWallet { final wallet = await x_wallet.createXelisWallet( name: name, directory: directory, - password: password!, + password: password, network: cryptoCurrency.network.xelisNetwork, precomputedTablesPath: tablePath, l1Low: tableState.currentSize.isLow, @@ -106,7 +105,6 @@ class XelisWallet extends LibXelisWallet { } Future _existingWallet() async { - print("EXISTING"); Logging.instance.i("Xelis: opening existing wallet"); final tablePath = await getPrecomputedTablesPath(); final tableState = await getTableState(); @@ -135,16 +133,16 @@ class XelisWallet extends LibXelisWallet { } final newReceivingAddress = - await getCurrentReceivingAddress() ?? - Address( - walletId: walletId, - derivationIndex: 0, - derivationPath: null, - value: libXelisWallet!.getAddressStr(), - publicKey: [], - type: AddressType.xelis, - subType: AddressSubType.receiving, - ); + await getCurrentReceivingAddress() ?? + Address( + walletId: walletId, + derivationIndex: 0, + derivationPath: null, + value: libXelisWallet!.getAddressStr(), + publicKey: [], + type: AddressType.xelis, + subType: AddressSubType.receiving, + ); await mainDB.updateOrPutAddresses([newReceivingAddress]); @@ -168,7 +166,9 @@ class XelisWallet extends LibXelisWallet { _initCompleter = Completer(); try { - final bool walletExists = await LibXelisWallet.checkWalletExists(walletId); + final bool walletExists = await LibXelisWallet.checkWalletExists( + walletId, + ); if (libXelisWallet == null) { if (isRestore == true) { @@ -182,8 +182,13 @@ class XelisWallet extends LibXelisWallet { } } _initCompleter!.complete(); - } catch (e) { + } catch (e, s) { _initCompleter!.completeError(e); + Logging.instance.e( + "Xelis init() rethrowing error", + error: e, + stackTrace: s, + ); rethrow; } @@ -227,7 +232,7 @@ class XelisWallet extends LibXelisWallet { } catch (_) { await handleOffline(); return false; - } + } } final _balanceUpdateMutex = Mutex(); @@ -275,7 +280,8 @@ class XelisWallet extends LibXelisWallet { final Map nodeInfo = (json.decode(infoString) as Map).cast(); - pruningHeight = int.tryParse(nodeInfo['pruned_topoheight']?.toString() ?? '0') ?? 0; + pruningHeight = + int.tryParse(nodeInfo['pruned_topoheight']?.toString() ?? '0') ?? 0; return int.parse(nodeInfo['topoheight'].toString()); } @@ -539,7 +545,7 @@ class XelisWallet extends LibXelisWallet { inputs: List.unmodifiable(inputs), outputs: List.unmodifiable(outputs), version: -1, // Version not provided - type: txType!, + type: txType, subType: txSubType, otherData: jsonEncode({ ...otherData, diff --git a/lib/wallets/wallet/intermediate/lib_xelis_wallet.dart b/lib/wallets/wallet/intermediate/lib_xelis_wallet.dart index ce84718ba..901223469 100644 --- a/lib/wallets/wallet/intermediate/lib_xelis_wallet.dart +++ b/lib/wallets/wallet/intermediate/lib_xelis_wallet.dart @@ -14,7 +14,6 @@ import '../../../utilities/logger.dart'; import '../../../utilities/stack_file_system.dart'; import '../../crypto_currency/crypto_currency.dart'; import '../../crypto_currency/intermediate/electrum_currency.dart'; -import '../wallet.dart'; import '../wallet_mixin_interfaces/mnemonic_interface.dart'; import 'external_wallet.dart'; @@ -153,7 +152,6 @@ abstract class LibXelisWallet static const String _kHasFullTablesKey = 'xelis_has_full_tables'; static const String _kGeneratingTablesKey = 'xelis_generating_tables'; static const String _kWantsFullTablesKey = 'xelis_wants_full_tables'; - static final _initMutex = Mutex(); static final _tableGenerationMutex = Mutex(); static Completer? _tableGenerationCompleter; @@ -437,4 +435,4 @@ extension XelisTableManagement on LibXelisWallet { } }); } -} \ No newline at end of file +} From 3fbc6daba0c0cb22a677d585c9e42b3f9aa8d155 Mon Sep 17 00:00:00 2001 From: dethe <76167420+detherminal@users.noreply.github.com> Date: Sat, 22 Mar 2025 01:30:36 +0300 Subject: [PATCH 164/193] feat: use _applyUri for paste --- lib/pages/send_view/send_view.dart | 135 +++++++++--------- .../wallet_view/sub_widgets/desktop_send.dart | 105 +++++++------- 2 files changed, 118 insertions(+), 122 deletions(-) diff --git a/lib/pages/send_view/send_view.dart b/lib/pages/send_view/send_view.dart index 1e6f33970..4bdcef6e2 100644 --- a/lib/pages/send_view/send_view.dart +++ b/lib/pages/send_view/send_view.dart @@ -135,6 +135,44 @@ class _SendViewState extends ConsumerState { Set selectedUTXOs = {}; + void _applyUri(PaymentUriData paymentData) { + try { + // auto fill address + _address = paymentData.address.trim(); + sendToController.text = _address!; + + // autofill notes field + if (paymentData.message != null) { + noteController.text = paymentData.message!; + } else if (paymentData.label != null) { + noteController.text = paymentData.label!; + } + + // autofill amount field + if (paymentData.amount != null) { + final Amount amount = Decimal.parse(paymentData.amount!).toAmount( + fractionDigits: coin.fractionDigits, + ); + cryptoAmountController.text = ref.read(pAmountFormatter(coin)).format( + amount, + withUnitName: false, + ); + ref.read(pSendAmount.notifier).state = amount; + } + + _setValidAddressProviders(_address); + setState(() { + _addressToggleFlag = sendToController.text.isNotEmpty; + }); + } catch (e, s) { + Logging.instance.e( + "Failed to apply uri in SendView: ", + error: e, + stackTrace: s, + ); + } + } + Future _scanQr() async { try { // ref @@ -167,35 +205,7 @@ class _SendViewState extends ConsumerState { if (paymentData != null && paymentData.coin?.uriScheme == coin.uriScheme) { - // auto fill address - _address = paymentData.address.trim(); - sendToController.text = _address!; - - // autofill notes field - if (paymentData.message != null) { - noteController.text = paymentData.message!; - } else if (paymentData.label != null) { - noteController.text = paymentData.label!; - } - - // autofill amount field - if (paymentData.amount != null) { - final Amount amount = Decimal.parse(paymentData.amount!).toAmount( - fractionDigits: coin.fractionDigits, - ); - cryptoAmountController.text = ref.read(pAmountFormatter(coin)).format( - amount, - withUnitName: false, - ); - ref.read(pSendAmount.notifier).state = amount; - } - - _setValidAddressProviders(_address); - setState(() { - _addressToggleFlag = sendToController.text.isNotEmpty; - }); - - // now check for non standard encoded basic address + _applyUri(paymentData); } else { _address = qrResult.rawContent.split("\n").first.trim(); sendToController.text = _address ?? ""; @@ -1353,27 +1363,24 @@ class _SendViewState extends ConsumerState { final trimmed = newValue.trim(); if ((trimmed.length - (_address?.length ?? 0)).abs() > 1) { - if (coin is Monero && Uri.parse(trimmed).scheme == "monero") { - final parsedUri = Uri.parse(trimmed); - final addr = parsedUri.path; - sendToController.text = addr; - _address = addr; - cryptoAmountController.text = parsedUri.queryParameters["tx_amount"] ?? ""; - } else if (coin is Bitcoin && Uri.parse(trimmed).scheme == "bitcoin") { - final parsedUri = Uri.parse(trimmed); - final addr = parsedUri.path; - sendToController.text = addr; - _address = addr; - cryptoAmountController.text = parsedUri.queryParameters["amount"] ?? ""; + final parsed = AddressUtils.parsePaymentUri( + trimmed, + logging: Logging.instance, + ); + if (parsed != null) { + _applyUri(parsed); + } else { + _address = newValue; + sendToController.text = newValue; } } else { - _address = trimmed; + _address = newValue; } _setValidAddressProviders(_address); setState(() { - _addressToggleFlag = trimmed.isNotEmpty; + _addressToggleFlag = newValue.isNotEmpty; }); }, focusNode: _addressFocusNode, @@ -1454,32 +1461,26 @@ class _SendViewState extends ConsumerState { } final trimmed = content.trim(); - - if (coin is Monero && Uri.parse(trimmed).scheme == "monero") { - final parsedUri = Uri.parse(trimmed); - final addr = parsedUri.path; - sendToController.text = addr; - _address = addr; - cryptoAmountController.text = parsedUri.queryParameters["tx_amount"] ?? ""; - } else if (coin is Bitcoin && Uri.parse(trimmed).scheme == "bitcoin") { - final parsedUri = Uri.parse(trimmed); - final addr = parsedUri.path; - sendToController.text = addr; - _address = addr; - cryptoAmountController.text = parsedUri.queryParameters["amount"] ?? ""; + final parsed = AddressUtils.parsePaymentUri( + trimmed, + logging: Logging.instance, + ); + if (parsed != null) { + _applyUri(parsed); } else { - sendToController.text = trimmed; - _address = trimmed; + sendToController.text = + content; + _address = content; + + _setValidAddressProviders(_address,); + + setState(() { + _addressToggleFlag = + sendToController + .text + .isNotEmpty; + }); } - - _setValidAddressProviders(_address,); - - setState(() { - _addressToggleFlag = - sendToController - .text - .isNotEmpty; - }); } }, child: sendToController diff --git a/lib/pages_desktop_specific/my_stack_view/wallet_view/sub_widgets/desktop_send.dart b/lib/pages_desktop_specific/my_stack_view/wallet_view/sub_widgets/desktop_send.dart index 0c8b9034c..009893e7e 100644 --- a/lib/pages_desktop_specific/my_stack_view/wallet_view/sub_widgets/desktop_send.dart +++ b/lib/pages_desktop_specific/my_stack_view/wallet_view/sub_widgets/desktop_send.dart @@ -660,33 +660,7 @@ class _DesktopSendState extends ConsumerState { if (paymentData != null && paymentData.coin?.uriScheme == coin.uriScheme) { - // Auto fill address. - _address = paymentData.address.trim(); - sendToController.text = _address!; - - // Amount. - if (paymentData.amount != null) { - final Amount amount = Decimal.parse(paymentData.amount!).toAmount( - fractionDigits: coin.fractionDigits, - ); - cryptoAmountController.text = ref.read(pAmountFormatter(coin)).format( - amount, - withUnitName: false, - ); - ref.read(pSendAmount.notifier).state = amount; - } - - // Note/message. - if (paymentData.message != null) { - _note = paymentData.message; - } else if (paymentData.label != null) { - _note = paymentData.label; - } - - _setValidAddressProviders(_address); - setState(() { - _addressToggleFlag = sendToController.text.isNotEmpty; - }); + _applyUri(paymentData); } else { _address = qrCodeData.split("\n").first.trim(); sendToController.text = _address ?? ""; @@ -736,6 +710,40 @@ class _DesktopSendState extends ConsumerState { } } + void _applyUri(PaymentUriData paymentData) { + try { + // auto fill address + _address = paymentData.address; + sendToController.text = _address!; + + // autofill notes field. + if (paymentData.message != null) { + _note = paymentData.message; + } else if (paymentData.label != null) { + _note = paymentData.label; + } + + // autofill amount field + if (paymentData.amount != null) { + final amount = Decimal.parse(paymentData.amount!).toAmount( + fractionDigits: coin.fractionDigits, + ); + cryptoAmountController.text = ref + .read(pAmountFormatter(coin)) + .format(amount, withUnitName: false); + ref.read(pSendAmount.notifier).state = amount; + } + + // Trigger validation after pasting. + _setValidAddressProviders(_address); + setState(() { + _addressToggleFlag = sendToController.text.isNotEmpty; + }); + } catch (e, s) { + Logging.instance.e("Error applying URI", error: e, stackTrace: s); + } + } + Future pasteAddress() async { final ClipboardData? data = await clipboard.getData(Clipboard.kTextPlain); if (data?.text != null && data!.text!.isNotEmpty) { @@ -751,33 +759,7 @@ class _DesktopSendState extends ConsumerState { ); if (paymentData != null && paymentData.coin?.uriScheme == coin.uriScheme) { - // auto fill address - _address = paymentData.address; - sendToController.text = _address!; - - // autofill notes field. - if (paymentData.message != null) { - _note = paymentData.message; - } else if (paymentData.label != null) { - _note = paymentData.label; - } - - // autofill amoutn field - if (paymentData.amount != null) { - final amount = Decimal.parse(paymentData.amount!).toAmount( - fractionDigits: coin.fractionDigits, - ); - cryptoAmountController.text = ref - .read(pAmountFormatter(coin)) - .format(amount, withUnitName: false); - ref.read(pSendAmount.notifier).state = amount; - } - - // Trigger validation after pasting. - _setValidAddressProviders(_address); - setState(() { - _addressToggleFlag = sendToController.text.isNotEmpty; - }); + _applyUri(paymentData); } else { content = content.split("\n").first.trim(); if (coin is Epiccash) { @@ -1439,7 +1421,20 @@ class _DesktopSendState extends ConsumerState { selectAll: false, ), onChanged: (newValue) { - _address = newValue; + final trimmed = newValue; + + if ((trimmed.length - (_address?.length ?? 0)).abs() > 1) { + final parsed = AddressUtils.parsePaymentUri(trimmed, logging: Logging.instance); + if (parsed != null) { + _applyUri(parsed); + } else { + _address = newValue; + sendToController.text = newValue; + } + } else { + _address = newValue; + } + _setValidAddressProviders(_address); setState(() { From 815c16a736bcebccdb6c0e15aa5c3c31d1dddf81 Mon Sep 17 00:00:00 2001 From: julian Date: Wed, 26 Mar 2025 09:32:26 -0600 Subject: [PATCH 165/193] NDK and gradle updates --- android/gradle.properties | 2 +- android/gradle/wrapper/gradle-wrapper.properties | 2 +- android/settings.gradle | 2 +- scripts/app_config/templates/android/app/build.gradle | 3 ++- .../templates/android/app/src/debug/AndroidManifest.xml | 6 +++--- .../templates/android/app/src/main/AndroidManifest.xml | 8 +------- .../templates/android/app/src/profile/AndroidManifest.xml | 6 +++--- 7 files changed, 12 insertions(+), 17 deletions(-) diff --git a/android/gradle.properties b/android/gradle.properties index 7803bf46c..24863d218 100644 --- a/android/gradle.properties +++ b/android/gradle.properties @@ -1,3 +1,3 @@ -org.gradle.jvmargs=-Xmx4G -XX:MaxMetaspaceSize=2G +org.gradle.jvmargs=-Xmx8G -XX:MaxMetaspaceSize=4G -XX:ReservedCodeCacheSize=512m -XX:+HeapDumpOnOutOfMemoryError android.useAndroidX=true android.enableJetifier=true \ No newline at end of file diff --git a/android/gradle/wrapper/gradle-wrapper.properties b/android/gradle/wrapper/gradle-wrapper.properties index 3c85cfe05..afa1e8eb0 100644 --- a/android/gradle/wrapper/gradle-wrapper.properties +++ b/android/gradle/wrapper/gradle-wrapper.properties @@ -2,4 +2,4 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.7-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.10.2-all.zip diff --git a/android/settings.gradle b/android/settings.gradle index a38bba1fb..02fb0cfb0 100644 --- a/android/settings.gradle +++ b/android/settings.gradle @@ -18,7 +18,7 @@ pluginManagement { plugins { id "dev.flutter.flutter-plugin-loader" version "1.0.0" - id "com.android.application" version '8.6.0' apply false + id "com.android.application" version '8.7.0' apply false id "org.jetbrains.kotlin.android" version "1.8.22" apply false } diff --git a/scripts/app_config/templates/android/app/build.gradle b/scripts/app_config/templates/android/app/build.gradle index b9cebc7b4..dc1cb233a 100644 --- a/scripts/app_config/templates/android/app/build.gradle +++ b/scripts/app_config/templates/android/app/build.gradle @@ -15,7 +15,7 @@ android { namespace "com.place.holder" compileSdk flutter.compileSdkVersion // ndkVersion flutter.ndkVersion - ndkVersion = "26.1.10909125" + ndkVersion = "28.0.13004108" packagingOptions { pickFirst 'lib/x86/libc++_shared.so' @@ -90,6 +90,7 @@ android { task.doFirst { println "The compileSdkVersion is $flutter.compileSdkVersion" println "The targetSdkVersion is $flutter.targetSdkVersion" + println "The ndkVersion is $ndkVersion" } } } diff --git a/scripts/app_config/templates/android/app/src/debug/AndroidManifest.xml b/scripts/app_config/templates/android/app/src/debug/AndroidManifest.xml index 9aa98e2e8..399f6981d 100644 --- a/scripts/app_config/templates/android/app/src/debug/AndroidManifest.xml +++ b/scripts/app_config/templates/android/app/src/debug/AndroidManifest.xml @@ -1,6 +1,6 @@ - - diff --git a/scripts/app_config/templates/android/app/src/main/AndroidManifest.xml b/scripts/app_config/templates/android/app/src/main/AndroidManifest.xml index 204663635..07f7a3ef0 100644 --- a/scripts/app_config/templates/android/app/src/main/AndroidManifest.xml +++ b/scripts/app_config/templates/android/app/src/main/AndroidManifest.xml @@ -1,10 +1,4 @@ - - + - From d789ae120bf1b689b794b9733e1d6395de42c0c1 Mon Sep 17 00:00:00 2001 From: sneurlax Date: Wed, 26 Mar 2025 13:47:55 -0500 Subject: [PATCH 166/193] feat: use NDK 28, fix epic on android, remove automatic cbindgen use --- crypto_plugins/flutter_libepiccash | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/crypto_plugins/flutter_libepiccash b/crypto_plugins/flutter_libepiccash index 8830be2ba..569dce4b6 160000 --- a/crypto_plugins/flutter_libepiccash +++ b/crypto_plugins/flutter_libepiccash @@ -1 +1 @@ -Subproject commit 8830be2ba661828d743be12df6f33d560448ed6a +Subproject commit 569dce4b6e21ce93c5e85789b29319b7bdc4629b From dabb2aa1b317269ce584c0672181218e3ca02c9d Mon Sep 17 00:00:00 2001 From: sneurlax Date: Mon, 24 Mar 2025 16:49:02 -0500 Subject: [PATCH 167/193] fix: update scripts and docs re: rust verion, ie 1.67.1->1.81 --- scripts/android/build_all.sh | 2 +- scripts/android/build_all_campfire.sh | 3 +-- scripts/android/build_all_duo.sh | 3 +-- scripts/ios/build_all.sh | 3 +-- scripts/ios/build_all_campfire.sh | 3 +-- scripts/ios/build_all_duo.sh | 3 +-- scripts/linux/build_all.sh | 3 +-- scripts/linux/build_all_campfire.sh | 3 +-- scripts/linux/build_all_duo.sh | 3 +-- scripts/macos/build_all.sh | 3 +-- scripts/macos/build_all_campfire.sh | 3 +-- scripts/macos/build_all_duo.sh | 3 +-- scripts/rust_version.sh | 11 ++++++++++- scripts/windows/build_all.sh | 3 +-- scripts/windows/build_all_campfire.sh | 3 +-- scripts/windows/build_all_duo.sh | 3 +-- 16 files changed, 25 insertions(+), 30 deletions(-) diff --git a/scripts/android/build_all.sh b/scripts/android/build_all.sh index 60aa13c6a..47c36fd79 100755 --- a/scripts/android/build_all.sh +++ b/scripts/android/build_all.sh @@ -4,7 +4,7 @@ set -x -e # libepiccash requires old rust source ../rust_version.sh -set_rust_to_1671 +set_rust_to_181 mkdir -p build . ./config.sh diff --git a/scripts/android/build_all_campfire.sh b/scripts/android/build_all_campfire.sh index 60aa13c6a..ccb8830b1 100755 --- a/scripts/android/build_all_campfire.sh +++ b/scripts/android/build_all_campfire.sh @@ -2,9 +2,8 @@ set -x -e -# libepiccash requires old rust source ../rust_version.sh -set_rust_to_1671 +set_rust_to_181 mkdir -p build . ./config.sh diff --git a/scripts/android/build_all_duo.sh b/scripts/android/build_all_duo.sh index d67e700a8..cd1ba0174 100755 --- a/scripts/android/build_all_duo.sh +++ b/scripts/android/build_all_duo.sh @@ -4,9 +4,8 @@ set -x -e # todo: revisit following at some point -# libepiccash requires old rust source ../rust_version.sh -set_rust_to_1671 +set_rust_to_181 mkdir -p build . ./config.sh diff --git a/scripts/ios/build_all.sh b/scripts/ios/build_all.sh index bcb03e991..b9eab976f 100755 --- a/scripts/ios/build_all.sh +++ b/scripts/ios/build_all.sh @@ -2,9 +2,8 @@ set -x -e -# libepiccash requires old rust source ../rust_version.sh -set_rust_to_1671 +set_rust_to_181 # ensure ios rust triples are there rustup target add aarch64-apple-ios diff --git a/scripts/ios/build_all_campfire.sh b/scripts/ios/build_all_campfire.sh index bcb03e991..b9eab976f 100755 --- a/scripts/ios/build_all_campfire.sh +++ b/scripts/ios/build_all_campfire.sh @@ -2,9 +2,8 @@ set -x -e -# libepiccash requires old rust source ../rust_version.sh -set_rust_to_1671 +set_rust_to_181 # ensure ios rust triples are there rustup target add aarch64-apple-ios diff --git a/scripts/ios/build_all_duo.sh b/scripts/ios/build_all_duo.sh index 89e6f4641..24236e8a7 100755 --- a/scripts/ios/build_all_duo.sh +++ b/scripts/ios/build_all_duo.sh @@ -4,9 +4,8 @@ set -x -e # todo: revisit following at some point -# libepiccash requires old rust source ../rust_version.sh -set_rust_to_1671 +set_rust_to_181 # ensure ios rust triples are there rustup target add aarch64-apple-ios diff --git a/scripts/linux/build_all.sh b/scripts/linux/build_all.sh index 423646185..bdb3bd527 100755 --- a/scripts/linux/build_all.sh +++ b/scripts/linux/build_all.sh @@ -2,9 +2,8 @@ set -x -e -# libepiccash requires old rust source ../rust_version.sh -set_rust_to_1671 +set_rust_to_181 # for arm # flutter-elinux clean diff --git a/scripts/linux/build_all_campfire.sh b/scripts/linux/build_all_campfire.sh index 423646185..bdb3bd527 100755 --- a/scripts/linux/build_all_campfire.sh +++ b/scripts/linux/build_all_campfire.sh @@ -2,9 +2,8 @@ set -x -e -# libepiccash requires old rust source ../rust_version.sh -set_rust_to_1671 +set_rust_to_181 # for arm # flutter-elinux clean diff --git a/scripts/linux/build_all_duo.sh b/scripts/linux/build_all_duo.sh index 78067b478..91d2127cd 100755 --- a/scripts/linux/build_all_duo.sh +++ b/scripts/linux/build_all_duo.sh @@ -4,9 +4,8 @@ set -x -e # todo: revisit following at some point -# libepiccash requires old rust source ../rust_version.sh -set_rust_to_1671 +set_rust_to_181 # for arm # flutter-elinux clean diff --git a/scripts/macos/build_all.sh b/scripts/macos/build_all.sh index af608846f..2212929e8 100755 --- a/scripts/macos/build_all.sh +++ b/scripts/macos/build_all.sh @@ -2,9 +2,8 @@ set -x -e -# libepiccash requires old rust source ../rust_version.sh -set_rust_to_1671 +set_rust_to_181 (cd ../../crypto_plugins/flutter_liblelantus/scripts/macos && ./build_all.sh ) (cd ../../crypto_plugins/flutter_libepiccash/scripts/macos && ./build_all.sh ) diff --git a/scripts/macos/build_all_campfire.sh b/scripts/macos/build_all_campfire.sh index af608846f..2212929e8 100755 --- a/scripts/macos/build_all_campfire.sh +++ b/scripts/macos/build_all_campfire.sh @@ -2,9 +2,8 @@ set -x -e -# libepiccash requires old rust source ../rust_version.sh -set_rust_to_1671 +set_rust_to_181 (cd ../../crypto_plugins/flutter_liblelantus/scripts/macos && ./build_all.sh ) (cd ../../crypto_plugins/flutter_libepiccash/scripts/macos && ./build_all.sh ) diff --git a/scripts/macos/build_all_duo.sh b/scripts/macos/build_all_duo.sh index 8a53e5801..f4114c7ef 100755 --- a/scripts/macos/build_all_duo.sh +++ b/scripts/macos/build_all_duo.sh @@ -4,9 +4,8 @@ set -x -e # todo: revisit following at some point -# libepiccash requires old rust source ../rust_version.sh -set_rust_to_1671 +set_rust_to_181 (cd ../../crypto_plugins/flutter_liblelantus/scripts/macos && ./build_all.sh ) (cd ../../crypto_plugins/flutter_libepiccash/scripts/macos && ./build_all.sh ) diff --git a/scripts/rust_version.sh b/scripts/rust_version.sh index 8cda1229b..8cfada233 100755 --- a/scripts/rust_version.sh +++ b/scripts/rust_version.sh @@ -16,4 +16,13 @@ set_rust_to_1720() { echo "Rust version 1.72.0 is not installed. Please install it using 'rustup install 1.72.0'." >&2 exit 1 fi -} \ No newline at end of file +} + +set_rust_to_181() { + if rustup toolchain list | grep -q "1.81"; then + rustup default 1.81 + else + echo "Rust version 1.81 is not installed. Please install it using 'rustup install 1.81'." >&2 + exit 1 + fi +} diff --git a/scripts/windows/build_all.sh b/scripts/windows/build_all.sh index 191a46cc0..6daedb861 100755 --- a/scripts/windows/build_all.sh +++ b/scripts/windows/build_all.sh @@ -2,9 +2,8 @@ set -x -e -# libepiccash requires old rust source ../rust_version.sh -set_rust_to_1671 +set_rust_to_181 mkdir -p build (cd ../../crypto_plugins/flutter_libepiccash/scripts/windows && ./build_all.sh ) diff --git a/scripts/windows/build_all_campfire.sh b/scripts/windows/build_all_campfire.sh index 191a46cc0..6daedb861 100755 --- a/scripts/windows/build_all_campfire.sh +++ b/scripts/windows/build_all_campfire.sh @@ -2,9 +2,8 @@ set -x -e -# libepiccash requires old rust source ../rust_version.sh -set_rust_to_1671 +set_rust_to_181 mkdir -p build (cd ../../crypto_plugins/flutter_libepiccash/scripts/windows && ./build_all.sh ) diff --git a/scripts/windows/build_all_duo.sh b/scripts/windows/build_all_duo.sh index 3e27eff02..f6ce810ef 100755 --- a/scripts/windows/build_all_duo.sh +++ b/scripts/windows/build_all_duo.sh @@ -4,9 +4,8 @@ set -x -e # todo: revisit following at some point -# libepiccash requires old rust source ../rust_version.sh -set_rust_to_1671 +set_rust_to_181 mkdir -p build (cd ../../crypto_plugins/flutter_libepiccash/scripts/windows && ./build_all.sh ) From 6f8c6003d1b980dd6c0ff7a6ceae90185deca6fe Mon Sep 17 00:00:00 2001 From: sneurlax Date: Wed, 26 Mar 2025 23:47:14 -0500 Subject: [PATCH 168/193] fix: Windows Epic example and build scripts --- crypto_plugins/flutter_libepiccash | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/crypto_plugins/flutter_libepiccash b/crypto_plugins/flutter_libepiccash index 569dce4b6..238455f2b 160000 --- a/crypto_plugins/flutter_libepiccash +++ b/crypto_plugins/flutter_libepiccash @@ -1 +1 @@ -Subproject commit 569dce4b6e21ce93c5e85789b29319b7bdc4629b +Subproject commit 238455f2b3fe39564cc617ed0ea45f22971aa644 From ec2777b9ff2797589dfa8293d8b93550b591266e Mon Sep 17 00:00:00 2001 From: julian Date: Wed, 26 Mar 2025 17:49:38 -0600 Subject: [PATCH 169/193] update coinlib and sparkmobile --- lib/wallets/wallet/impl/namecoin_wallet.dart | 367 +++++----- .../electrumx_interface.dart | 606 ++++++++--------- .../paynym_interface.dart | 632 +++++++++--------- scripts/app_config/templates/pubspec.template | 24 +- 4 files changed, 783 insertions(+), 846 deletions(-) diff --git a/lib/wallets/wallet/impl/namecoin_wallet.dart b/lib/wallets/wallet/impl/namecoin_wallet.dart index 64dc23801..bf6f43e41 100644 --- a/lib/wallets/wallet/impl/namecoin_wallet.dart +++ b/lib/wallets/wallet/impl/namecoin_wallet.dart @@ -41,11 +41,7 @@ String nameSaltKeyBuilder(String txid, String walletId, int txPos) { } String encodeNameSaltData(String name, String salt, String value) => - jsonEncode({ - "name": name, - "salt": salt, - "value": value, - }); + jsonEncode({"name": name, "salt": salt, "value": value}); ({String salt, String name, String value}) decodeNameSaltData(String value) { try { @@ -76,25 +72,26 @@ class NamecoinWallet @override Future> fetchAddressesForElectrumXScan() async { - final allAddresses = await mainDB - .getAddresses(walletId) - .filter() - .not() - .group( - (q) => q - .typeEqualTo(AddressType.nonWallet) - .or() - .subTypeEqualTo(AddressSubType.nonWallet), - ) - .findAll(); + final allAddresses = + await mainDB + .getAddresses(walletId) + .filter() + .not() + .group( + (q) => q + .typeEqualTo(AddressType.nonWallet) + .or() + .subTypeEqualTo(AddressSubType.nonWallet), + ) + .findAll(); return allAddresses; } -// =========================================================================== + // =========================================================================== @override Future<({String? blockedReason, bool blocked, String? utxoLabel})> - checkBlockUTXO( + checkBlockUTXO( Map jsonUTXO, String? scriptPubKeyHex, Map jsonTX, @@ -108,9 +105,7 @@ class NamecoinWallet } @override - Future parseUTXO({ - required Map jsonUTXO, - }) async { + Future parseUTXO({required Map jsonUTXO}) async { final txn = await electrumXCachedClient.getTransaction( txHash: jsonUTXO["tx_hash"] as String, verbose: true, @@ -136,7 +131,7 @@ class NamecoinWallet if (output["n"] == vout) { utxoOwnerAddress = output["scriptPubKey"]?["addresses"]?[0] as String? ?? - output["scriptPubKey"]?["address"] as String?; + output["scriptPubKey"]?["address"] as String?; // check for nameOp if (output["scriptPubKey"]?["nameOp"] != null) { @@ -145,19 +140,15 @@ class NamecoinWallet blockReason = "Contains name"; try { - final rawNameOP = (output["scriptPubKey"]["nameOp"] as Map) - .cast(); + final rawNameOP = + (output["scriptPubKey"]["nameOp"] as Map) + .cast(); otherDataString = jsonEncode({ UTXOOtherDataKeys.nameOpData: jsonEncode(rawNameOP), }); - final nameOp = OpNameData( - rawNameOP, - jsonUTXO["height"] as int, - ); - Logging.instance.i( - "nameOp:\n$nameOp", - ); + final nameOp = OpNameData(rawNameOP, jsonUTXO["height"] as int); + Logging.instance.i("nameOp:\n$nameOp"); switch (nameOp.op) { case OpName.nameNew: @@ -193,7 +184,8 @@ class NamecoinWallet name: label ?? "", isBlocked: shouldBlock, blockedReason: blockReason, - isCoinbase: txn["is_coinbase"] as bool? ?? + isCoinbase: + txn["is_coinbase"] as bool? ?? txn["is-coinbase"] as bool? ?? txn["iscoinbase"] as bool? ?? isCoinbase, @@ -231,30 +223,34 @@ class NamecoinWallet await fetchAddressesForElectrumXScan(); // Separate receiving and change addresses. - final Set receivingAddresses = allAddressesOld - .where((e) => e.subType == AddressSubType.receiving) - .map((e) => e.value) - .toSet(); - final Set changeAddresses = allAddressesOld - .where((e) => e.subType == AddressSubType.change) - .map((e) => e.value) - .toSet(); + final Set receivingAddresses = + allAddressesOld + .where((e) => e.subType == AddressSubType.receiving) + .map((e) => e.value) + .toSet(); + final Set changeAddresses = + allAddressesOld + .where((e) => e.subType == AddressSubType.change) + .map((e) => e.value) + .toSet(); // Remove duplicates. final allAddressesSet = {...receivingAddresses, ...changeAddresses}; // Fetch history from ElectrumX. - final List> allTxHashes = - await fetchHistory(allAddressesSet); + final List> allTxHashes = await fetchHistory( + allAddressesSet, + ); // Only parse new txs (not in db yet). final List> allTransactions = []; for (final txHash in allTxHashes) { // Check for duplicates by searching for tx by tx_hash in db. - final storedTx = await mainDB.isar.transactionV2s - .where() - .txidWalletIdEqualTo(txHash["tx_hash"] as String, walletId) - .findFirst(); + final storedTx = + await mainDB.isar.transactionV2s + .where() + .txidWalletIdEqualTo(txHash["tx_hash"] as String, walletId) + .findFirst(); if (storedTx == null || storedTx.height == null || @@ -267,8 +263,9 @@ class NamecoinWallet ); // Only tx to list once. - if (allTransactions - .indexWhere((e) => e["txid"] == tx["txid"] as String) == + if (allTransactions.indexWhere( + (e) => e["txid"] == tx["txid"] as String, + ) == -1) { tx["height"] = txHash["height"]; allTransactions.add(tx); @@ -418,7 +415,8 @@ class NamecoinWallet txid: txData["txid"] as String, height: txData["height"] as int?, version: txData["version"] as int, - timestamp: txData["blocktime"] as int? ?? + timestamp: + txData["blocktime"] as int? ?? DateTime.timestamp().millisecondsSinceEpoch ~/ 1000, inputs: List.unmodifiable(inputs), outputs: List.unmodifiable(outputs), @@ -456,10 +454,7 @@ class NamecoinWallet final data = decodeNameSaltData(encoded); if (data.name == name) { - return ( - data: null, - nameState: NameState.unavailable, - ); + return (data: null, nameState: NameState.unavailable); } } } @@ -485,9 +480,7 @@ class NamecoinWallet opNameData = OpNameData.fromTx(txMap, txHeight); final isExpired = opNameData.expired(await chainHeight); - Logging.instance.i( - "Name $opNameData \nis expired = $isExpired", - ); + Logging.instance.i("Name $opNameData \nis expired = $isExpired"); available = isExpired; } catch (_) { available = false; // probably @@ -508,23 +501,22 @@ class NamecoinWallet /// Must be called in refresh() AFTER the wallet's UTXOs have been updated! Future checkAutoRegisterNameNewOutputs() async { - Logging.instance.t( - "$walletId checkAutoRegisterNameNewOutputs()", - ); + Logging.instance.t("$walletId checkAutoRegisterNameNewOutputs()"); try { final currentHeight = await chainHeight; // not ideal filtering - final utxos = await mainDB - .getUTXOs(walletId) - .filter() - .otherDataIsNotNull() - .and() - .blockHeightIsNotNull() - .and() - .blockHeightGreaterThan(0) - .and() - .blockHeightLessThan(currentHeight - kNameWaitBlocks) - .findAll(); + final utxos = + await mainDB + .getUTXOs(walletId) + .filter() + .otherDataIsNotNull() + .and() + .blockHeightIsNotNull() + .and() + .blockHeightGreaterThan(0) + .and() + .blockHeightLessThan(currentHeight - kNameWaitBlocks) + .findAll(); Logging.instance.t( "_unknownNameNewOutputs(count=${_unknownNameNewOutputs.length})" @@ -539,9 +531,7 @@ class NamecoinWallet for (final utxo in utxos) { final nameOp = getOpNameDataFrom(utxo); if (nameOp != null) { - Logging.instance.t( - "Found OpName: $nameOp\n\nIN UTXO: $utxo", - ); + Logging.instance.t("Found OpName: $nameOp\n\nIN UTXO: $utxo"); if (nameOp.op == OpName.nameNew) { // at this point we should have an unspent UTXO that is at least @@ -646,14 +636,10 @@ class NamecoinWallet switch (txData.opNameState!.type) { case OpName.nameNew: - assert( - nameAmount.raw == BigInt.from(kNameNewAmountSats), - ); + assert(nameAmount.raw == BigInt.from(kNameNewAmountSats)); break; case OpName.nameFirstUpdate || OpName.nameUpdate: - assert( - nameAmount.raw == BigInt.from(kNameAmountSats), - ); + assert(nameAmount.raw == BigInt.from(kNameAmountSats)); break; } } @@ -671,9 +657,10 @@ class NamecoinWallet ); // TODO: [prio=high]: check this opt in rbf - final sequence = this is RbfInterface && (this as RbfInterface).flagOptInRBF - ? 0xffffffff - 10 - : 0xffffffff - 1; + final sequence = + this is RbfInterface && (this as RbfInterface).flagOptInRBF + ? 0xffffffff - 10 + : 0xffffffff - 1; // Add transaction inputs for (int i = 0; i < utxoSigningData.length; i++) { @@ -683,10 +670,7 @@ class NamecoinWallet txid.toUint8ListFromHex.reversed.toList(), ); - final prevOutpoint = coinlib.OutPoint( - hash, - utxoSigningData[i].utxo.vout, - ); + final prevOutpoint = coinlib.OutPoint(hash, utxoSigningData[i].utxo.vout); final prevOutput = coinlib.Output.fromAddress( BigInt.from(utxoSigningData[i].utxo.value), @@ -746,9 +730,10 @@ class NamecoinWallet txid: utxoSigningData[i].utxo.txid, vout: utxoSigningData[i].utxo.vout, ), - addresses: utxoSigningData[i].utxo.address == null - ? [] - : [utxoSigningData[i].utxo.address!], + addresses: + utxoSigningData[i].utxo.address == null + ? [] + : [utxoSigningData[i].utxo.address!], valueStringSats: utxoSigningData[i].utxo.value.toString(), witness: null, innerRedeemScriptAsm: null, @@ -803,10 +788,9 @@ class NamecoinWallet OutputV2.isarCantDoRequiredInDefaultConstructor( scriptPubKeyHex: "000000", valueStringSats: txData.recipients![i].amount.raw.toString(), - addresses: [ - txData.recipients![i].address.toString(), - ], - walletOwns: (await mainDB.isar.addresses + addresses: [txData.recipients![i].address.toString()], + walletOwns: + (await mainDB.isar.addresses .where() .walletIdEqualTo(walletId) .filter() @@ -822,22 +806,33 @@ class NamecoinWallet // Sign the transaction accordingly for (int i = 0; i < utxoSigningData.length; i++) { final value = BigInt.from(utxoSigningData[i].utxo.value); - coinlib.ECPrivateKey key = utxoSigningData[i].keyPair!.privateKey; + final key = utxoSigningData[i].keyPair!.privateKey; if (clTx.inputs[i] is coinlib.TaprootKeyInput) { final taproot = coinlib.Taproot( internalKey: utxoSigningData[i].keyPair!.publicKey, ); - key = taproot.tweakPrivateKey(key); + clTx = clTx.signTaproot( + inputN: i, + key: taproot.tweakPrivateKey(key), + prevOuts: prevOuts, + ); + } else if (clTx.inputs[i] is coinlib.LegacyWitnessInput) { + clTx = clTx.signLegacyWitness(inputN: i, key: key, value: value); + } else if (clTx.inputs[i] is coinlib.LegacyInput) { + clTx = clTx.signLegacy(inputN: i, key: key); + } else if (clTx.inputs[i] is coinlib.TaprootSingleScriptSigInput) { + clTx = clTx.signTaprootSingleScriptSig( + inputN: i, + key: key, + prevOuts: prevOuts, + ); + } else { + throw Exception( + "Unable to sign input of type ${clTx.inputs[i].runtimeType}", + ); } - - clTx = clTx.sign( - inputN: i, - value: value, - key: key, - prevOuts: prevOuts, - ); } } catch (e, s) { Logging.instance.e( @@ -879,17 +874,13 @@ class NamecoinWallet ); } - Future prepareNameSend({ - required TxData txData, - }) async { + Future prepareNameSend({required TxData txData}) async { try { if (txData.amount == null) { throw Exception("No recipients in attempted transaction!"); } - Logging.instance.t( - "prepareNameSend called with TxData:\n\n$txData", - ); + Logging.instance.t("prepareNameSend called with TxData:\n\n$txData"); final feeRateType = txData.feeRateType; final customSatsPerVByte = txData.satsPerVByte; @@ -944,20 +935,17 @@ class NamecoinWallet } final result = await coinSelectionName( - txData: txData.copyWith( - feeRateAmount: rate, - ), + txData: txData.copyWith(feeRateAmount: rate), utxos: utxos?.toList(), coinControl: coinControl, ); - Logging.instance.d( - "prepare send: $result", - ); + Logging.instance.d("prepare send: $result"); if (result.fee!.raw.toInt() < result.vSize!) { throw Exception( - "Error in fee calculation: Transaction fee (${result.fee!.raw.toInt()}) cannot " - "be less than vSize (${result.vSize})"); + "Error in fee calculation: Transaction fee (${result.fee!.raw.toInt()}) cannot " + "be less than vSize (${result.vSize})", + ); } return result; @@ -1028,19 +1016,20 @@ class NamecoinWallet final canCPFP = this is CpfpInterface && coinControl; - final spendableOutputs = availableOutputs - .where( - (e) => - !e.isBlocked && - (e.used != true) && - (canCPFP || - e.isConfirmed( - currentChainHeight, - cryptoCurrency.minConfirms, - cryptoCurrency.minCoinbaseConfirms, - )), - ) - .toList(); + final spendableOutputs = + availableOutputs + .where( + (e) => + !e.isBlocked && + (e.used != true) && + (canCPFP || + e.isConfirmed( + currentChainHeight, + cryptoCurrency.minConfirms, + cryptoCurrency.minCoinbaseConfirms, + )), + ) + .toList(); if (coinControl) { if (spendableOutputs.length < availableOutputs.length) { @@ -1050,8 +1039,9 @@ class NamecoinWallet } else { // sort spendable by age (oldest first) spendableOutputs.sort( - (a, b) => (b.blockTime ?? currentChainHeight) - .compareTo((a.blockTime ?? currentChainHeight)), + (a, b) => (b.blockTime ?? currentChainHeight).compareTo( + (a.blockTime ?? currentChainHeight), + ), ); } @@ -1061,8 +1051,10 @@ class NamecoinWallet spendableOutputs.insert(0, txData.opNameState!.output!); } - final spendableSatoshiValue = - spendableOutputs.fold(BigInt.zero, (p, e) => p + BigInt.from(e.value)); + final spendableSatoshiValue = spendableOutputs.fold( + BigInt.zero, + (p, e) => p + BigInt.from(e.value), + ); if (spendableSatoshiValue < satoshiAmountToSend) { throw Exception("Insufficient balance"); @@ -1082,21 +1074,24 @@ class NamecoinWallet final List utxoObjectsToUse = []; if (!coinControl) { - for (int i = 0; - satoshisBeingUsed < satoshiAmountToSend && - i < spendableOutputs.length; - i++) { + for ( + int i = 0; + satoshisBeingUsed < satoshiAmountToSend && i < spendableOutputs.length; + i++ + ) { utxoObjectsToUse.add(spendableOutputs[i]); satoshisBeingUsed += BigInt.from(spendableOutputs[i].value); inputsBeingConsumed += 1; } - for (int i = 0; - i < additionalOutputs && - inputsBeingConsumed < spendableOutputs.length; - i++) { + for ( + int i = 0; + i < additionalOutputs && inputsBeingConsumed < spendableOutputs.length; + i++ + ) { utxoObjectsToUse.add(spendableOutputs[inputsBeingConsumed]); - satoshisBeingUsed += - BigInt.from(spendableOutputs[inputsBeingConsumed].value); + satoshisBeingUsed += BigInt.from( + spendableOutputs[inputsBeingConsumed].value, + ); inputsBeingConsumed += 1; } } else { @@ -1120,17 +1115,17 @@ class NamecoinWallet final int vSizeForOneOutput; try { - vSizeForOneOutput = (await _createNameTx( - utxoSigningData: utxoSigningData, - isForFeeCalcPurposesOnly: true, - txData: txData.copyWith( - recipients: await helperRecipientsConvert( - [recipientAddress], - [satoshisBeingUsed], - ), - ), - )) - .vSize!; + vSizeForOneOutput = + (await _createNameTx( + utxoSigningData: utxoSigningData, + isForFeeCalcPurposesOnly: true, + txData: txData.copyWith( + recipients: await helperRecipientsConvert( + [recipientAddress], + [satoshisBeingUsed], + ), + ), + )).vSize!; } catch (e, s) { Logging.instance.e("vSizeForOneOutput: $e", error: e, stackTrace: s); rethrow; @@ -1141,23 +1136,20 @@ class NamecoinWallet BigInt maxBI(BigInt a, BigInt b) => a > b ? a : b; try { - vSizeForTwoOutPuts = (await _createNameTx( - utxoSigningData: utxoSigningData, - isForFeeCalcPurposesOnly: true, - txData: txData.copyWith( - recipients: await helperRecipientsConvert( - [recipientAddress, (await getCurrentChangeAddress())!.value], - [ - satoshiAmountToSend, - maxBI( - BigInt.zero, - satoshisBeingUsed - satoshiAmountToSend, + vSizeForTwoOutPuts = + (await _createNameTx( + utxoSigningData: utxoSigningData, + isForFeeCalcPurposesOnly: true, + txData: txData.copyWith( + recipients: await helperRecipientsConvert( + [recipientAddress, (await getCurrentChangeAddress())!.value], + [ + satoshiAmountToSend, + maxBI(BigInt.zero, satoshisBeingUsed - satoshiAmountToSend), + ], ), - ], - ), - ), - )) - .vSize!; + ), + )).vSize!; } catch (e, s) { Logging.instance.e("vSizeForTwoOutPuts: $e", error: e, stackTrace: s); rethrow; @@ -1168,18 +1160,18 @@ class NamecoinWallet satsPerVByte != null ? (satsPerVByte * vSizeForOneOutput) : estimateTxFee( - vSize: vSizeForOneOutput, - feeRatePerKB: selectedTxFeeRate, - ), + vSize: vSizeForOneOutput, + feeRatePerKB: selectedTxFeeRate, + ), ); // Assume 2 outputs, one for recipient and one for change final feeForTwoOutputs = BigInt.from( satsPerVByte != null ? (satsPerVByte * vSizeForTwoOutPuts) : estimateTxFee( - vSize: vSizeForTwoOutPuts, - feeRatePerKB: selectedTxFeeRate, - ), + vSize: vSizeForTwoOutPuts, + feeRatePerKB: selectedTxFeeRate, + ), ); Logging.instance.d( @@ -1250,12 +1242,14 @@ class NamecoinWallet recipientsArray.add(newChangeAddress); recipientsAmtArray.add(changeOutputSize); - Logging.instance.d('2 outputs in tx' - '\nInput size: $satoshisBeingUsed' - '\nRecipient output size: $satoshiAmountToSend' - '\nChange Output Size: $changeOutputSize' - '\nDifference (fee being paid): $feeBeingPaid sats' - '\nEstimated fee: $feeForTwoOutputs'); + Logging.instance.d( + '2 outputs in tx' + '\nInput size: $satoshisBeingUsed' + '\nRecipient output size: $satoshiAmountToSend' + '\nChange Output Size: $changeOutputSize' + '\nDifference (fee being paid): $feeBeingPaid sats' + '\nEstimated fee: $feeForTwoOutputs', + ); TxData txnData = await _createNameTx( utxoSigningData: utxoSigningData, @@ -1305,9 +1299,7 @@ class NamecoinWallet } else { // Something went wrong here. It either overshot or undershot the estimated fee amount or the changeOutputSize // is smaller than or equal to cryptoCurrency.dustLimit. Revert to single output transaction. - Logging.instance.d( - 'Reverting to 1 output in tx', - ); + Logging.instance.d('Reverting to 1 output in tx'); return await _singleOutputTxn(); } @@ -1365,7 +1357,4 @@ class NamecoinWallet } } -enum NameState { - available, - unavailable; -} +enum NameState { available, unavailable } diff --git a/lib/wallets/wallet/wallet_mixin_interfaces/electrumx_interface.dart b/lib/wallets/wallet/wallet_mixin_interfaces/electrumx_interface.dart index 2660d60ff..e393ceb9d 100644 --- a/lib/wallets/wallet/wallet_mixin_interfaces/electrumx_interface.dart +++ b/lib/wallets/wallet/wallet_mixin_interfaces/electrumx_interface.dart @@ -36,7 +36,8 @@ import 'rbf_interface.dart'; import 'view_only_option_interface.dart'; mixin ElectrumXInterface - on Bip39HDWallet implements ViewOnlyOptionInterface { + on Bip39HDWallet + implements ViewOnlyOptionInterface { late ElectrumXClient electrumXClient; late CachedElectrumXClient electrumXCachedClient; @@ -54,9 +55,10 @@ mixin ElectrumXInterface try { _serverVersion ??= _parseServerVersion( - (await electrumXClient - .getServerFeatures() - .timeout(const Duration(seconds: 2)))["server_version"] as String, + (await electrumXClient.getServerFeatures().timeout( + const Duration(seconds: 2), + ))["server_version"] + as String, ); } catch (_) { // ignore failure as it doesn't matter @@ -74,32 +76,28 @@ mixin ElectrumXInterface } Future> - helperRecipientsConvert( - List addrs, - List satValues, - ) async { + helperRecipientsConvert(List addrs, List satValues) async { final List<({String address, Amount amount, bool isChange})> results = []; for (int i = 0; i < addrs.length; i++) { - results.add( - ( - address: addrs[i], - amount: Amount( - rawValue: satValues[i], - fractionDigits: cryptoCurrency.fractionDigits, - ), - isChange: (await mainDB.isar.addresses - .where() - .walletIdEqualTo(walletId) - .filter() - .subTypeEqualTo(AddressSubType.change) - .and() - .valueEqualTo(addrs[i]) - .valueProperty() - .findFirst()) != - null + results.add(( + address: addrs[i], + amount: Amount( + rawValue: satValues[i], + fractionDigits: cryptoCurrency.fractionDigits, ), - ); + isChange: + (await mainDB.isar.addresses + .where() + .walletIdEqualTo(walletId) + .filter() + .subTypeEqualTo(AddressSubType.change) + .and() + .valueEqualTo(addrs[i]) + .valueProperty() + .findFirst()) != + null, + )); } return results; @@ -133,21 +131,24 @@ mixin ElectrumXInterface final canCPFP = this is CpfpInterface && coinControl; - final spendableOutputs = availableOutputs - .where( - (e) => - !e.isBlocked && - (e.used != true) && - (canCPFP || - e.isConfirmed( - currentChainHeight, - cryptoCurrency.minConfirms, - cryptoCurrency.minCoinbaseConfirms, - )), - ) - .toList(); - final spendableSatoshiValue = - spendableOutputs.fold(BigInt.zero, (p, e) => p + BigInt.from(e.value)); + final spendableOutputs = + availableOutputs + .where( + (e) => + !e.isBlocked && + (e.used != true) && + (canCPFP || + e.isConfirmed( + currentChainHeight, + cryptoCurrency.minConfirms, + cryptoCurrency.minCoinbaseConfirms, + )), + ) + .toList(); + final spendableSatoshiValue = spendableOutputs.fold( + BigInt.zero, + (p, e) => p + BigInt.from(e.value), + ); if (spendableSatoshiValue < satoshiAmountToSend) { throw Exception("Insufficient balance"); @@ -165,45 +166,41 @@ mixin ElectrumXInterface } else { // sort spendable by age (oldest first) spendableOutputs.sort( - (a, b) => (b.blockTime ?? currentChainHeight) - .compareTo((a.blockTime ?? currentChainHeight)), + (a, b) => (b.blockTime ?? currentChainHeight).compareTo( + (a.blockTime ?? currentChainHeight), + ), ); } - Logging.instance.d( - "spendableOutputs.length: ${spendableOutputs.length}", - ); - Logging.instance.d( - "availableOutputs.length: ${availableOutputs.length}", - ); + Logging.instance.d("spendableOutputs.length: ${spendableOutputs.length}"); + Logging.instance.d("availableOutputs.length: ${availableOutputs.length}"); Logging.instance.d("spendableOutputs: $spendableOutputs"); - Logging.instance.d( - "spendableSatoshiValue: $spendableSatoshiValue", - ); - Logging.instance.d( - "satoshiAmountToSend: $satoshiAmountToSend", - ); + Logging.instance.d("spendableSatoshiValue: $spendableSatoshiValue"); + Logging.instance.d("satoshiAmountToSend: $satoshiAmountToSend"); BigInt satoshisBeingUsed = BigInt.zero; int inputsBeingConsumed = 0; final List utxoObjectsToUse = []; if (!coinControl) { - for (var i = 0; - satoshisBeingUsed < satoshiAmountToSend && - i < spendableOutputs.length; - i++) { + for ( + var i = 0; + satoshisBeingUsed < satoshiAmountToSend && i < spendableOutputs.length; + i++ + ) { utxoObjectsToUse.add(spendableOutputs[i]); satoshisBeingUsed += BigInt.from(spendableOutputs[i].value); inputsBeingConsumed += 1; } - for (int i = 0; - i < additionalOutputs && - inputsBeingConsumed < spendableOutputs.length; - i++) { + for ( + int i = 0; + i < additionalOutputs && inputsBeingConsumed < spendableOutputs.length; + i++ + ) { utxoObjectsToUse.add(spendableOutputs[inputsBeingConsumed]); - satoshisBeingUsed += - BigInt.from(spendableOutputs[inputsBeingConsumed].value); + satoshisBeingUsed += BigInt.from( + spendableOutputs[inputsBeingConsumed].value, + ); inputsBeingConsumed += 1; } } else { @@ -213,9 +210,7 @@ mixin ElectrumXInterface } Logging.instance.d("satoshisBeingUsed: $satoshisBeingUsed"); - Logging.instance.d( - "inputsBeingConsumed: $inputsBeingConsumed", - ); + Logging.instance.d("inputsBeingConsumed: $inputsBeingConsumed"); Logging.instance.d('utxoObjectsToUse: $utxoObjectsToUse'); // numberOfOutputs' length must always be equal to that of recipientsArray and recipientsAmtArray @@ -245,16 +240,16 @@ mixin ElectrumXInterface final int vSizeForOneOutput; try { - vSizeForOneOutput = (await buildTransaction( - utxoSigningData: utxoSigningData, - txData: txData.copyWith( - recipients: await helperRecipientsConvert( - [recipientAddress], - [satoshisBeingUsed - BigInt.one], - ), - ), - )) - .vSize!; + vSizeForOneOutput = + (await buildTransaction( + utxoSigningData: utxoSigningData, + txData: txData.copyWith( + recipients: await helperRecipientsConvert( + [recipientAddress], + [satoshisBeingUsed - BigInt.one], + ), + ), + )).vSize!; } catch (e, s) { Logging.instance.e("vSizeForOneOutput: $e", error: e, stackTrace: s); rethrow; @@ -265,22 +260,22 @@ mixin ElectrumXInterface BigInt maxBI(BigInt a, BigInt b) => a > b ? a : b; try { - vSizeForTwoOutPuts = (await buildTransaction( - utxoSigningData: utxoSigningData, - txData: txData.copyWith( - recipients: await helperRecipientsConvert( - [recipientAddress, (await getCurrentChangeAddress())!.value], - [ - satoshiAmountToSend, - maxBI( - BigInt.zero, - satoshisBeingUsed - (satoshiAmountToSend + BigInt.one), + vSizeForTwoOutPuts = + (await buildTransaction( + utxoSigningData: utxoSigningData, + txData: txData.copyWith( + recipients: await helperRecipientsConvert( + [recipientAddress, (await getCurrentChangeAddress())!.value], + [ + satoshiAmountToSend, + maxBI( + BigInt.zero, + satoshisBeingUsed - (satoshiAmountToSend + BigInt.one), + ), + ], ), - ], - ), - ), - )) - .vSize!; + ), + )).vSize!; } catch (e, s) { Logging.instance.e("vSizeForTwoOutPuts: $e", error: e, stackTrace: s); rethrow; @@ -291,42 +286,30 @@ mixin ElectrumXInterface satsPerVByte != null ? (satsPerVByte * vSizeForOneOutput) : estimateTxFee( - vSize: vSizeForOneOutput, - feeRatePerKB: selectedTxFeeRate, - ), + vSize: vSizeForOneOutput, + feeRatePerKB: selectedTxFeeRate, + ), ); // Assume 2 outputs, one for recipient and one for change final feeForTwoOutputs = BigInt.from( satsPerVByte != null ? (satsPerVByte * vSizeForTwoOutPuts) : estimateTxFee( - vSize: vSizeForTwoOutPuts, - feeRatePerKB: selectedTxFeeRate, - ), + vSize: vSizeForTwoOutPuts, + feeRatePerKB: selectedTxFeeRate, + ), ); - Logging.instance.d( - "feeForTwoOutputs: $feeForTwoOutputs", - ); - Logging.instance.d( - "feeForOneOutput: $feeForOneOutput", - ); + Logging.instance.d("feeForTwoOutputs: $feeForTwoOutputs"); + Logging.instance.d("feeForOneOutput: $feeForOneOutput"); final difference = satoshisBeingUsed - satoshiAmountToSend; Future singleOutputTxn() async { - Logging.instance.d( - 'Input size: $satoshisBeingUsed', - ); - Logging.instance.d( - 'Recipient output size: $satoshiAmountToSend', - ); - Logging.instance.d( - 'Fee being paid: $difference sats', - ); - Logging.instance.d( - 'Estimated fee: $feeForOneOutput', - ); + Logging.instance.d('Input size: $satoshisBeingUsed'); + Logging.instance.d('Recipient output size: $satoshiAmountToSend'); + Logging.instance.d('Fee being paid: $difference sats'); + Logging.instance.d('Estimated fee: $feeForOneOutput'); final txnData = await buildTransaction( utxoSigningData: utxoSigningData, txData: txData.copyWith( @@ -406,9 +389,7 @@ mixin ElectrumXInterface recipientsAmtArray.removeLast(); recipientsAmtArray.add(changeOutputSize); - Logging.instance.d( - 'Adjusted Input size: $satoshisBeingUsed', - ); + Logging.instance.d('Adjusted Input size: $satoshisBeingUsed'); Logging.instance.d( 'Adjusted Recipient output size: $satoshiAmountToSend', ); @@ -418,9 +399,7 @@ mixin ElectrumXInterface Logging.instance.d( 'Adjusted Difference (fee being paid): $feeBeingPaid sats', ); - Logging.instance.d( - 'Adjusted Estimated fee: $feeForTwoOutputs', - ); + Logging.instance.d('Adjusted Estimated fee: $feeForTwoOutputs'); txnData = await buildTransaction( utxoSigningData: utxoSigningData, @@ -443,9 +422,7 @@ mixin ElectrumXInterface } else { // Something went wrong here. It either overshot or undershot the estimated fee amount or the changeOutputSize // is smaller than or equal to cryptoCurrency.dustLimit. Revert to single output transaction. - Logging.instance.d( - 'Reverting to 1 output in tx', - ); + Logging.instance.d('Reverting to 1 output in tx'); return await singleOutputTxn(); } @@ -466,36 +443,28 @@ mixin ElectrumXInterface }) async { Logging.instance.d("Attempting to send all $cryptoCurrency"); if (txData.recipients!.length != 1) { - throw Exception( - "Send all to more than one recipient not yet supported", - ); + throw Exception("Send all to more than one recipient not yet supported"); } - final int vSizeForOneOutput = (await buildTransaction( - utxoSigningData: utxoSigningData, - txData: txData.copyWith( - recipients: await helperRecipientsConvert( - [recipientAddress], - [satoshisBeingUsed - BigInt.one], - ), - ), - )) - .vSize!; + final int vSizeForOneOutput = + (await buildTransaction( + utxoSigningData: utxoSigningData, + txData: txData.copyWith( + recipients: await helperRecipientsConvert( + [recipientAddress], + [satoshisBeingUsed - BigInt.one], + ), + ), + )).vSize!; BigInt feeForOneOutput = BigInt.from( satsPerVByte != null ? (satsPerVByte * vSizeForOneOutput) - : estimateTxFee( - vSize: vSizeForOneOutput, - feeRatePerKB: feeRatePerKB, - ), + : estimateTxFee(vSize: vSizeForOneOutput, feeRatePerKB: feeRatePerKB), ); if (satsPerVByte == null) { - final roughEstimate = roughFeeEstimate( - utxoSigningData.length, - 1, - feeRatePerKB, - ).raw; + final roughEstimate = + roughFeeEstimate(utxoSigningData.length, 1, feeRatePerKB).raw; if (feeForOneOutput < roughEstimate) { feeForOneOutput = roughEstimate; } @@ -511,10 +480,7 @@ mixin ElectrumXInterface final data = await buildTransaction( txData: txData.copyWith( - recipients: await helperRecipientsConvert( - [recipientAddress], - [amount], - ), + recipients: await helperRecipientsConvert([recipientAddress], [amount]), ), utxoSigningData: utxoSigningData, ); @@ -528,23 +494,19 @@ mixin ElectrumXInterface ); } - Future> fetchBuildTxData( - List utxosToUse, - ) async { + Future> fetchBuildTxData(List utxosToUse) async { // return data final List signingData = []; try { // Populating the addresses to check for (var i = 0; i < utxosToUse.length; i++) { - final derivePathType = - cryptoCurrency.addressType(address: utxosToUse[i].address!); + final derivePathType = cryptoCurrency.addressType( + address: utxosToUse[i].address!, + ); signingData.add( - SigningData( - derivePathType: derivePathType, - utxo: utxosToUse[i], - ), + SigningData(derivePathType: derivePathType, utxo: utxosToUse[i]), ); } @@ -564,9 +526,9 @@ mixin ElectrumXInterface final privateKey = await (this as PaynymInterface) .getPrivateKeyForPaynymReceivingAddress( - paymentCodeString: code!, - index: address.derivationIndex, - ); + paymentCodeString: code!, + index: address.derivationIndex, + ); keys = coinlib.HDPrivateKey.fromKeyAndChainCode( coinlib.ECPrivateKey.fromHex(privateKey.toHex), @@ -594,11 +556,7 @@ mixin ElectrumXInterface return signingData; } catch (e, s) { - Logging.instance.e( - "fetchBuildTxData() threw", - error: e, - stackTrace: s, - ); + Logging.instance.e("fetchBuildTxData() threw", error: e, stackTrace: s); rethrow; } } @@ -623,9 +581,10 @@ mixin ElectrumXInterface ); // TODO: [prio=high]: check this opt in rbf - final sequence = this is RbfInterface && (this as RbfInterface).flagOptInRBF - ? 0xffffffff - 10 - : 0xffffffff - 1; + final sequence = + this is RbfInterface && (this as RbfInterface).flagOptInRBF + ? 0xffffffff - 10 + : 0xffffffff - 1; // Add transaction inputs for (var i = 0; i < utxoSigningData.length; i++) { @@ -635,10 +594,7 @@ mixin ElectrumXInterface txid.toUint8ListFromHex.reversed.toList(), ); - final prevOutpoint = coinlib.OutPoint( - hash, - utxoSigningData[i].utxo.vout, - ); + final prevOutpoint = coinlib.OutPoint(hash, utxoSigningData[i].utxo.vout); final prevOutput = coinlib.Output.fromAddress( BigInt.from(utxoSigningData[i].utxo.value), @@ -699,9 +655,10 @@ mixin ElectrumXInterface txid: utxoSigningData[i].utxo.txid, vout: utxoSigningData[i].utxo.vout, ), - addresses: utxoSigningData[i].utxo.address == null - ? [] - : [utxoSigningData[i].utxo.address!], + addresses: + utxoSigningData[i].utxo.address == null + ? [] + : [utxoSigningData[i].utxo.address!], valueStringSats: utxoSigningData[i].utxo.value.toString(), witness: null, innerRedeemScriptAsm: null, @@ -741,10 +698,9 @@ mixin ElectrumXInterface OutputV2.isarCantDoRequiredInDefaultConstructor( scriptPubKeyHex: "000000", valueStringSats: txData.recipients![i].amount.raw.toString(), - addresses: [ - txData.recipients![i].address.toString(), - ], - walletOwns: (await mainDB.isar.addresses + addresses: [txData.recipients![i].address.toString()], + walletOwns: + (await mainDB.isar.addresses .where() .walletIdEqualTo(walletId) .filter() @@ -760,22 +716,33 @@ mixin ElectrumXInterface // Sign the transaction accordingly for (var i = 0; i < utxoSigningData.length; i++) { final value = BigInt.from(utxoSigningData[i].utxo.value); - coinlib.ECPrivateKey key = utxoSigningData[i].keyPair!.privateKey; + final key = utxoSigningData[i].keyPair!.privateKey; if (clTx.inputs[i] is coinlib.TaprootKeyInput) { final taproot = coinlib.Taproot( internalKey: utxoSigningData[i].keyPair!.publicKey, ); - key = taproot.tweakPrivateKey(key); + clTx = clTx.signTaproot( + inputN: i, + key: taproot.tweakPrivateKey(key), + prevOuts: prevOuts, + ); + } else if (clTx.inputs[i] is coinlib.LegacyWitnessInput) { + clTx = clTx.signLegacyWitness(inputN: i, key: key, value: value); + } else if (clTx.inputs[i] is coinlib.LegacyInput) { + clTx = clTx.signLegacy(inputN: i, key: key); + } else if (clTx.inputs[i] is coinlib.TaprootSingleScriptSigInput) { + clTx = clTx.signTaprootSingleScriptSig( + inputN: i, + key: key, + prevOuts: prevOuts, + ); + } else { + throw Exception( + "Unable to sign input of type ${clTx.inputs[i].runtimeType}", + ); } - - clTx = clTx.sign( - inputN: i, - value: value, - key: key, - prevOuts: prevOuts, - ); } } catch (e, s) { Logging.instance.e( @@ -839,8 +806,9 @@ mixin ElectrumXInterface } Future fetchTxCount({required String addressScriptHash}) async { - final transactions = - await electrumXClient.getHistory(scripthash: addressScriptHash); + final transactions = await electrumXClient.getHistory( + scripthash: addressScriptHash, + ); return transactions.length; } @@ -885,20 +853,21 @@ mixin ElectrumXInterface } Future updateElectrumX() async { - final failovers = nodeService - .failoverNodesFor(currency: cryptoCurrency) - .map( - (e) => ElectrumXNode( - address: e.host, - port: e.port, - name: e.name, - id: e.id, - useSSL: e.useSSL, - torEnabled: e.torEnabled, - clearnetEnabled: e.clearnetEnabled, - ), - ) - .toList(); + final failovers = + nodeService + .failoverNodesFor(currency: cryptoCurrency) + .map( + (e) => ElectrumXNode( + address: e.host, + port: e.port, + name: e.name, + id: e.id, + useSSL: e.useSSL, + torEnabled: e.torEnabled, + clearnetEnabled: e.clearnetEnabled, + ), + ) + .toList(); final newNode = await _getCurrentElectrumXNode(); try { @@ -937,9 +906,11 @@ mixin ElectrumXInterface int gapCounter = 0; int highestIndexWithHistory = 0; - for (int index = 0; - gapCounter < cryptoCurrency.maxUnusedAddressGap; - index += txCountBatchSize) { + for ( + int index = 0; + gapCounter < cryptoCurrency.maxUnusedAddressGap; + index += txCountBatchSize + ) { Logging.instance.d( "index: $index, \t GapCounter $chain ${type.name}: $gapCounter", ); @@ -985,9 +956,7 @@ mixin ElectrumXInterface addressArray.add(address); - txCountCallArgs.add( - addressString, - ); + txCountCallArgs.add(addressString); } // get address tx counts @@ -1115,8 +1084,9 @@ mixin ElectrumXInterface } for (int i = 0; i < batches.length; i++) { - final response = - await electrumXClient.getBatchHistory(args: batches[i]!); + final response = await electrumXClient.getBatchHistory( + args: batches[i]!, + ); for (int j = 0; j < response.length; j++) { final entry = response[j]; for (int k = 0; k < entry.length; k++) { @@ -1149,15 +1119,16 @@ mixin ElectrumXInterface return allTxHashes; } catch (e, s) { - Logging.instance - .e("$runtimeType._fetchHistory: ", error: e, stackTrace: s); + Logging.instance.e( + "$runtimeType._fetchHistory: ", + error: e, + stackTrace: s, + ); rethrow; } } - Future parseUTXO({ - required Map jsonUTXO, - }) async { + Future parseUTXO({required Map jsonUTXO}) async { final txn = await electrumXCachedClient.getTransaction( txHash: jsonUTXO["tx_hash"] as String, verbose: true, @@ -1179,7 +1150,7 @@ mixin ElectrumXInterface scriptPubKey = output["scriptPubKey"]?["hex"] as String?; utxoOwnerAddress = output["scriptPubKey"]?["addresses"]?[0] as String? ?? - output["scriptPubKey"]?["address"] as String?; + output["scriptPubKey"]?["address"] as String?; } } @@ -1198,7 +1169,8 @@ mixin ElectrumXInterface name: checkBlockResult.utxoLabel ?? "", isBlocked: checkBlockResult.blocked, blockedReason: checkBlockResult.blockedReason, - isCoinbase: txn["is_coinbase"] as bool? ?? + isCoinbase: + txn["is_coinbase"] as bool? ?? txn["is-coinbase"] as bool? ?? txn["iscoinbase"] as bool? ?? isCoinbase, @@ -1216,10 +1188,7 @@ mixin ElectrumXInterface @override Future updateChainHeight() async { final height = await fetchChainHeight(); - await info.updateCachedChainHeight( - newHeight: height, - isar: mainDB.isar, - ); + await info.updateCachedChainHeight(newHeight: height, isar: mainDB.isar); } @override @@ -1252,23 +1221,24 @@ mixin ElectrumXInterface numberOfBlocksFast: f, numberOfBlocksAverage: m, numberOfBlocksSlow: s, - fast: Amount.fromDecimal( - fast, - fractionDigits: info.coin.fractionDigits, - ).raw.toInt(), - medium: Amount.fromDecimal( - medium, - fractionDigits: info.coin.fractionDigits, - ).raw.toInt(), - slow: Amount.fromDecimal( - slow, - fractionDigits: info.coin.fractionDigits, - ).raw.toInt(), + fast: + Amount.fromDecimal( + fast, + fractionDigits: info.coin.fractionDigits, + ).raw.toInt(), + medium: + Amount.fromDecimal( + medium, + fractionDigits: info.coin.fractionDigits, + ).raw.toInt(), + slow: + Amount.fromDecimal( + slow, + fractionDigits: info.coin.fractionDigits, + ).raw.toInt(), ); - Logging.instance.d( - "fetched fees: $feeObject", - ); + Logging.instance.d("fetched fees: $feeObject"); _cachedFees = feeObject; return _cachedFees!; } catch (e, s) { @@ -1383,9 +1353,10 @@ mixin ElectrumXInterface } } } catch (e, s) { - Logging.instance - .e("Exception rethrown from _checkReceivingAddressForTransactions" - "($cryptoCurrency): $e\n$s"); + Logging.instance.e( + "Exception rethrown from _checkReceivingAddressForTransactions" + "($cryptoCurrency): $e\n$s", + ); rethrow; } } @@ -1434,9 +1405,10 @@ mixin ElectrumXInterface await checkChangeAddressForTransactions(); } } catch (e, s) { - Logging.instance - .e("Exception rethrown from _checkChangeAddressForTransactions" - "($cryptoCurrency): $e\n$s"); + Logging.instance.e( + "Exception rethrown from _checkChangeAddressForTransactions" + "($cryptoCurrency): $e\n$s", + ); rethrow; } } @@ -1472,47 +1444,25 @@ mixin ElectrumXInterface } // receiving addresses - Logging.instance.i( - "checking receiving addresses...", - ); + Logging.instance.i("checking receiving addresses..."); final canBatch = await serverCanBatch; for (final type in cryptoCurrency.supportedDerivationPathTypes) { receiveFutures.add( canBatch - ? checkGapsBatched( - txCountBatchSize, - root, - type, - receiveChain, - ) - : checkGapsLinearly( - root, - type, - receiveChain, - ), + ? checkGapsBatched(txCountBatchSize, root, type, receiveChain) + : checkGapsLinearly(root, type, receiveChain), ); } // change addresses - Logging.instance.d( - "checking change addresses...", - ); + Logging.instance.d("checking change addresses..."); for (final type in cryptoCurrency.supportedDerivationPathTypes) { changeFutures.add( canBatch - ? checkGapsBatched( - txCountBatchSize, - root, - type, - changeChain, - ) - : checkGapsLinearly( - root, - type, - changeChain, - ), + ? checkGapsBatched(txCountBatchSize, root, type, changeChain) + : checkGapsLinearly(root, type, changeChain), ); } @@ -1574,13 +1524,15 @@ mixin ElectrumXInterface final notificationAddress = await (this as PaynymInterface).getMyNotificationAddress(); - await (this as BitcoinWallet) - .updateTransactions(overrideAddresses: [notificationAddress]); + await (this as BitcoinWallet).updateTransactions( + overrideAddresses: [notificationAddress], + ); // get own payment code // isSegwit does not matter here at all - final myCode = - await (this as PaynymInterface).getPaymentCode(isSegwit: false); + final myCode = await (this as PaynymInterface).getPaymentCode( + isSegwit: false, + ); try { final Set codesToCheck = {}; @@ -1648,8 +1600,9 @@ mixin ElectrumXInterface } for (int i = 0; i < batchArgs.length; i++) { - final response = - await electrumXClient.getBatchUTXOs(args: batchArgs[i]!); + final response = await electrumXClient.getBatchUTXOs( + args: batchArgs[i]!, + ); for (final entry in response) { if (entry.isNotEmpty) { fetchedUtxoList.add(entry); @@ -1673,9 +1626,7 @@ mixin ElectrumXInterface for (int i = 0; i < fetchedUtxoList.length; i++) { for (int j = 0; j < fetchedUtxoList[i].length; j++) { - final utxo = await parseUTXO( - jsonUTXO: fetchedUtxoList[i][j], - ); + final utxo = await parseUTXO(jsonUTXO: fetchedUtxoList[i][j]); outputArray.add(utxo); } @@ -1695,16 +1646,12 @@ mixin ElectrumXInterface @override Future confirmSend({required TxData txData}) async { try { - Logging.instance.d( - "confirmSend txData: $txData", - ); + Logging.instance.d("confirmSend txData: $txData"); final txHash = await electrumXClient.broadcastTransaction( rawTx: txData.raw!, ); - Logging.instance.d( - "Sent txHash: $txHash", - ); + Logging.instance.d("Sent txHash: $txHash"); txData = txData.copyWith( usedUTXOs: @@ -1742,7 +1689,8 @@ mixin ElectrumXInterface final bool coinControl = utxos != null; - final isSendAllCoinControlUtxos = coinControl && + final isSendAllCoinControlUtxos = + coinControl && txData.amount!.raw == utxos .map((e) => e.value) @@ -1811,22 +1759,19 @@ mixin ElectrumXInterface } final result = await coinSelection( - txData: txData.copyWith( - feeRateAmount: rate, - ), + txData: txData.copyWith(feeRateAmount: rate), isSendAll: isSendAll, utxos: utxos?.toList(), coinControl: coinControl, isSendAllCoinControlUtxos: isSendAllCoinControlUtxos, ); - Logging.instance.d( - "prepare send: $result", - ); + Logging.instance.d("prepare send: $result"); if (result.fee!.raw.toInt() < result.vSize!) { throw Exception( - "Error in fee calculation: Transaction fee (${result.fee!.raw.toInt()}) cannot " - "be less than vSize (${result.vSize})"); + "Error in fee calculation: Transaction fee (${result.fee!.raw.toInt()}) cannot " + "be less than vSize (${result.vSize})", + ); } return result; @@ -1862,16 +1807,15 @@ mixin ElectrumXInterface Future _initializeServerVersionAndCheckGenesisHash() async { try { - final features = await electrumXClient - .getServerFeatures() - .timeout(const Duration(seconds: 5)); - - Logging.instance.d( - "features: $features", + final features = await electrumXClient.getServerFeatures().timeout( + const Duration(seconds: 5), ); - _serverVersion = - _parseServerVersion(features["server_version"] as String); + Logging.instance.d("features: $features"); + + _serverVersion = _parseServerVersion( + features["server_version"] as String, + ); if (cryptoCurrency.genesisHash != features['genesis_hash']) { throw Exception("Genesis hash does not match!"); @@ -1896,7 +1840,7 @@ mixin ElectrumXInterface /// Certain coins need to check if the utxo should be marked /// as blocked as well as give a reason. Future<({String? blockedReason, bool blocked, String? utxoLabel})> - checkBlockUTXO( + checkBlockUTXO( Map jsonUTXO, String? scriptPubKeyHex, Map jsonTX, @@ -1948,9 +1892,7 @@ mixin ElectrumXInterface } } catch (_) {} - Logging.instance.d( - "${info.name} _parseServerVersion($version) => $result", - ); + Logging.instance.d("${info.name} _parseServerVersion($version) => $result"); return result; } @@ -2003,9 +1945,7 @@ mixin ElectrumXInterface if (root != null) { // receiving addresses - Logging.instance.i( - "checking receiving addresses...", - ); + Logging.instance.i("checking receiving addresses..."); final canBatch = await serverCanBatch; @@ -2021,24 +1961,18 @@ mixin ElectrumXInterface receiveFutures.add( canBatch ? checkGapsBatched( - txCountBatchSize, - root, - type, - receiveChain, - ) - : checkGapsLinearly( - root, - type, - receiveChain, - ), + txCountBatchSize, + root, + type, + receiveChain, + ) + : checkGapsLinearly(root, type, receiveChain), ); } } // change addresses - Logging.instance.d( - "checking change addresses...", - ); + Logging.instance.d("checking change addresses..."); for (final type in cryptoCurrency.supportedDerivationPathTypes) { final path = cryptoCurrency.constructDerivePath( derivePathType: type, @@ -2051,16 +1985,12 @@ mixin ElectrumXInterface changeFutures.add( canBatch ? checkGapsBatched( - txCountBatchSize, - root, - type, - changeChain, - ) - : checkGapsLinearly( - root, - type, - changeChain, - ), + txCountBatchSize, + root, + type, + changeChain, + ) + : checkGapsLinearly(root, type, changeChain), ); } } diff --git a/lib/wallets/wallet/wallet_mixin_interfaces/paynym_interface.dart b/lib/wallets/wallet/wallet_mixin_interfaces/paynym_interface.dart index 9d1935bec..5c0ace879 100644 --- a/lib/wallets/wallet/wallet_mixin_interfaces/paynym_interface.dart +++ b/lib/wallets/wallet/wallet_mixin_interfaces/paynym_interface.dart @@ -42,34 +42,28 @@ String _notificationDerivationPath({required bool testnet}) => String _receivingPaynymAddressDerivationPath( int index, { required bool testnet, -}) => - "${_basePaynymDerivePath(testnet: testnet)}/$index/0"; -String _sendPaynymAddressDerivationPath( - int index, { - required bool testnet, -}) => +}) => "${_basePaynymDerivePath(testnet: testnet)}/$index/0"; +String _sendPaynymAddressDerivationPath(int index, {required bool testnet}) => "${_basePaynymDerivePath(testnet: testnet)}/0/$index"; mixin PaynymInterface on Bip39HDWallet, ElectrumXInterface { btc_dart.NetworkType get networkType => btc_dart.NetworkType( - messagePrefix: cryptoCurrency.networkParams.messagePrefix, - bech32: cryptoCurrency.networkParams.bech32Hrp, - bip32: btc_dart.Bip32Type( - public: cryptoCurrency.networkParams.pubHDPrefix, - private: cryptoCurrency.networkParams.privHDPrefix, - ), - pubKeyHash: cryptoCurrency.networkParams.p2pkhPrefix, - scriptHash: cryptoCurrency.networkParams.p2shPrefix, - wif: cryptoCurrency.networkParams.wifPrefix, - ); + messagePrefix: cryptoCurrency.networkParams.messagePrefix, + bech32: cryptoCurrency.networkParams.bech32Hrp, + bip32: btc_dart.Bip32Type( + public: cryptoCurrency.networkParams.pubHDPrefix, + private: cryptoCurrency.networkParams.privHDPrefix, + ), + pubKeyHash: cryptoCurrency.networkParams.p2pkhPrefix, + scriptHash: cryptoCurrency.networkParams.p2shPrefix, + wif: cryptoCurrency.networkParams.wifPrefix, + ); Future getBip47BaseNode() async { final root = await _getRootNode(); final node = root.derivePath( - _basePaynymDerivePath( - testnet: info.coin.network.isTestNet, - ), + _basePaynymDerivePath(testnet: info.coin.network.isTestNet), ); return node; } @@ -101,25 +95,29 @@ mixin PaynymInterface }) async { final keys = await lookupKey(sender.toString()); - final address = await mainDB - .getAddresses(walletId) - .filter() - .subTypeEqualTo(AddressSubType.paynymReceive) - .and() - .group((q) { - if (isSegwit) { - return q - .typeEqualTo(AddressType.p2sh) - .or() - .typeEqualTo(AddressType.p2wpkh); - } else { - return q.typeEqualTo(AddressType.p2pkh); - } - }) - .and() - .anyOf(keys, (q, String e) => q.otherDataEqualTo(e)) - .sortByDerivationIndexDesc() - .findFirst(); + final address = + await mainDB + .getAddresses(walletId) + .filter() + .subTypeEqualTo(AddressSubType.paynymReceive) + .and() + .group((q) { + if (isSegwit) { + return q + .typeEqualTo(AddressType.p2sh) + .or() + .typeEqualTo(AddressType.p2wpkh); + } else { + return q.typeEqualTo(AddressType.p2pkh); + } + }) + .and() + .anyOf( + keys, + (q, String e) => q.otherDataEqualTo(e), + ) + .sortByDerivationIndexDesc() + .findFirst(); if (address == null) { final generatedAddress = await _generatePaynymReceivingAddress( @@ -128,11 +126,12 @@ mixin PaynymInterface generateSegwitAddress: isSegwit, ); - final existing = await mainDB - .getAddresses(walletId) - .filter() - .valueEqualTo(generatedAddress.value) - .findFirst(); + final existing = + await mainDB + .getAddresses(walletId) + .filter() + .valueEqualTo(generatedAddress.value) + .findFirst(); if (existing == null) { // Add that new address @@ -142,10 +141,7 @@ mixin PaynymInterface await mainDB.updateAddress(existing, generatedAddress); } - return currentReceivingPaynymAddress( - isSegwit: isSegwit, - sender: sender, - ); + return currentReceivingPaynymAddress(isSegwit: isSegwit, sender: sender); } else { return address; } @@ -158,9 +154,7 @@ mixin PaynymInterface }) async { final root = await _getRootNode(); final node = root.derivePath( - _basePaynymDerivePath( - testnet: info.coin.network.isTestNet, - ), + _basePaynymDerivePath(testnet: info.coin.network.isTestNet), ); final paymentAddress = PaymentAddress( @@ -170,20 +164,22 @@ mixin PaynymInterface index: 0, ); - final addressString = generateSegwitAddress - ? paymentAddress.getReceiveAddressP2WPKH() - : paymentAddress.getReceiveAddressP2PKH(); + final addressString = + generateSegwitAddress + ? paymentAddress.getReceiveAddressP2WPKH() + : paymentAddress.getReceiveAddressP2PKH(); final address = Address( walletId: walletId, value: addressString, publicKey: [], derivationIndex: index, - derivationPath: DerivationPath() - ..value = _receivingPaynymAddressDerivationPath( - index, - testnet: info.coin.network.isTestNet, - ), + derivationPath: + DerivationPath() + ..value = _receivingPaynymAddressDerivationPath( + index, + testnet: info.coin.network.isTestNet, + ), type: generateSegwitAddress ? AddressType.p2wpkh : AddressType.p2pkh, subType: AddressSubType.paynymReceive, otherData: await storeCode(sender.toString()), @@ -207,20 +203,22 @@ mixin PaynymInterface index: index, ); - final addressString = generateSegwitAddress - ? paymentAddress.getSendAddressP2WPKH() - : paymentAddress.getSendAddressP2PKH(); + final addressString = + generateSegwitAddress + ? paymentAddress.getSendAddressP2WPKH() + : paymentAddress.getSendAddressP2PKH(); final address = Address( walletId: walletId, value: addressString, publicKey: [], derivationIndex: index, - derivationPath: DerivationPath() - ..value = _sendPaynymAddressDerivationPath( - index, - testnet: info.coin.network.isTestNet, - ), + derivationPath: + DerivationPath() + ..value = _sendPaynymAddressDerivationPath( + index, + testnet: info.coin.network.isTestNet, + ), type: AddressType.nonWallet, subType: AddressSubType.paynymSend, otherData: await storeCode(other.toString()), @@ -251,11 +249,12 @@ mixin PaynymInterface generateSegwitAddress: isSegwit, ); - final existing = await mainDB - .getAddresses(walletId) - .filter() - .valueEqualTo(nextAddress.value) - .findFirst(); + final existing = + await mainDB + .getAddresses(walletId) + .filter() + .valueEqualTo(nextAddress.value) + .findFirst(); if (existing == null) { // Add that new address @@ -312,26 +311,18 @@ mixin PaynymInterface Future deriveNotificationBip32Node() async { final root = await _getRootNode(); final node = root - .derivePath( - _basePaynymDerivePath( - testnet: info.coin.network.isTestNet, - ), - ) + .derivePath(_basePaynymDerivePath(testnet: info.coin.network.isTestNet)) .derive(0); return node; } /// fetch or generate this wallet's bip47 payment code - Future getPaymentCode({ - required bool isSegwit, - }) async { + Future getPaymentCode({required bool isSegwit}) async { final node = await _getRootNode(); final paymentCode = PaymentCode.fromBip32Node( node.derivePath( - _basePaynymDerivePath( - testnet: info.coin.network.isTestNet, - ), + _basePaynymDerivePath(testnet: info.coin.network.isTestNet), ), networkType: networkType, shouldSetSegwitBit: isSegwit, @@ -351,8 +342,9 @@ mixin PaynymInterface } Future signStringWithNotificationKey(String data) async { - final bytes = - await signWithNotificationKey(Uint8List.fromList(utf8.encode(data))); + final bytes = await signWithNotificationKey( + Uint8List.fromList(utf8.encode(data)), + ); return Format.uint8listToString(bytes); } @@ -411,15 +403,19 @@ mixin PaynymInterface for (int i = startIndex; i < maxCount; i++) { final keys = await lookupKey(pCode.toString()); - final address = await mainDB - .getAddresses(walletId) - .filter() - .subTypeEqualTo(AddressSubType.paynymSend) - .and() - .anyOf(keys, (q, String e) => q.otherDataEqualTo(e)) - .and() - .derivationIndexEqualTo(i) - .findFirst(); + final address = + await mainDB + .getAddresses(walletId) + .filter() + .subTypeEqualTo(AddressSubType.paynymSend) + .and() + .anyOf( + keys, + (q, String e) => q.otherDataEqualTo(e), + ) + .and() + .derivationIndexEqualTo(i) + .findFirst(); if (address != null) { final count = await fetchTxCount( @@ -506,21 +502,26 @@ mixin PaynymInterface int outputsBeingUsed = 0; final List utxoObjectsToUse = []; - for (int i = 0; - satoshisBeingUsed < amountToSend.raw && i < spendableOutputs.length; - i++) { + for ( + int i = 0; + satoshisBeingUsed < amountToSend.raw && i < spendableOutputs.length; + i++ + ) { utxoObjectsToUse.add(spendableOutputs[i]); satoshisBeingUsed += BigInt.from(spendableOutputs[i].value); outputsBeingUsed += 1; } // add additional outputs if required - for (int i = 0; - i < additionalOutputs && outputsBeingUsed < spendableOutputs.length; - i++) { + for ( + int i = 0; + i < additionalOutputs && outputsBeingUsed < spendableOutputs.length; + i++ + ) { utxoObjectsToUse.add(spendableOutputs[outputsBeingUsed]); - satoshisBeingUsed += - BigInt.from(spendableOutputs[outputsBeingUsed].value); + satoshisBeingUsed += BigInt.from( + spendableOutputs[outputsBeingUsed].value, + ); outputsBeingUsed += 1; } @@ -534,8 +535,7 @@ mixin PaynymInterface change: BigInt.zero, // override amount to get around absurd fees error overrideAmountForTesting: satoshisBeingUsed, - )) - .item2, + )).item2, ); final vSizeForWithChange = BigInt.from( @@ -543,8 +543,7 @@ mixin PaynymInterface targetPaymentCodeString: targetPaymentCodeString, utxoSigningData: utxoSigningData, change: satoshisBeingUsed - amountToSend.raw, - )) - .item2, + )).item2, ); // Assume 2 outputs, for recipient and payment code script @@ -836,10 +835,7 @@ mixin PaynymInterface clTx = clTx.addOutput(output); clTx = clTx.addOutput( - coinlib.Output.fromScriptBytes( - BigInt.zero, - opReturnScript, - ), + coinlib.Output.fromScriptBytes(BigInt.zero, opReturnScript), ); // TODO: add possible change output and mark output as dangerous @@ -859,32 +855,64 @@ mixin PaynymInterface clTx = clTx.addOutput(output); } - clTx = clTx.sign( - inputN: 0, - value: BigInt.from(utxo.value), - key: myKeyPair.privateKey, - prevOuts: prevOuts, - ); + if (clTx.inputs[0] is coinlib.TaprootKeyInput) { + final taproot = coinlib.Taproot(internalKey: myKeyPair.publicKey); + + clTx = clTx.signTaproot( + inputN: 0, + key: taproot.tweakPrivateKey(myKeyPair.privateKey), + prevOuts: prevOuts, + ); + } else if (clTx.inputs[0] is coinlib.LegacyWitnessInput) { + clTx = clTx.signLegacyWitness( + inputN: 0, + key: myKeyPair.privateKey, + value: BigInt.from(utxo.value), + ); + } else if (clTx.inputs[0] is coinlib.LegacyInput) { + clTx = clTx.signLegacy(inputN: 0, key: myKeyPair.privateKey); + } else if (clTx.inputs[0] is coinlib.TaprootSingleScriptSigInput) { + clTx = clTx.signTaprootSingleScriptSig( + inputN: 0, + key: myKeyPair.privateKey, + prevOuts: prevOuts, + ); + } else { + throw Exception( + "Unable to sign input of type ${clTx.inputs[0].runtimeType}", + ); + } // sign rest of possible inputs for (int i = 1; i < utxoSigningData.length; i++) { final value = BigInt.from(utxoSigningData[i].utxo.value); - coinlib.ECPrivateKey key = utxoSigningData[i].keyPair!.privateKey; + final key = utxoSigningData[i].keyPair!.privateKey; if (clTx.inputs[i] is coinlib.TaprootKeyInput) { final taproot = coinlib.Taproot( internalKey: utxoSigningData[i].keyPair!.publicKey, ); - key = taproot.tweakPrivateKey(key); + clTx = clTx.signTaproot( + inputN: i, + key: taproot.tweakPrivateKey(key), + prevOuts: prevOuts, + ); + } else if (clTx.inputs[i] is coinlib.LegacyWitnessInput) { + clTx = clTx.signLegacyWitness(inputN: i, key: key, value: value); + } else if (clTx.inputs[i] is coinlib.LegacyInput) { + clTx = clTx.signLegacy(inputN: i, key: key); + } else if (clTx.inputs[i] is coinlib.TaprootSingleScriptSigInput) { + clTx = clTx.signTaprootSingleScriptSig( + inputN: i, + key: key, + prevOuts: prevOuts, + ); + } else { + throw Exception( + "Unable to sign input of type ${clTx.inputs[i].runtimeType}", + ); } - - clTx = clTx.sign( - inputN: i, - value: value, - key: key, - prevOuts: prevOuts, - ); } return Tuple2(clTx.toHex(), clTx.vSize()); @@ -894,13 +922,12 @@ mixin PaynymInterface } } - Future broadcastNotificationTx({ - required TxData txData, - }) async { + Future broadcastNotificationTx({required TxData txData}) async { try { Logging.instance.d("confirmNotificationTx txData: $txData"); - final txHash = - await electrumXClient.broadcastTransaction(rawTx: txData.raw!); + final txHash = await electrumXClient.broadcastTransaction( + rawTx: txData.raw!, + ); Logging.instance.d("Sent txHash: $txHash"); try { @@ -913,10 +940,7 @@ mixin PaynymInterface ); } - return txData.copyWith( - txid: txHash, - txHash: txHash, - ); + return txData.copyWith(txid: txHash, txHash: txHash); } catch (e, s) { Logging.instance.e( "Exception rethrown from confirmSend(): ", @@ -964,12 +988,13 @@ mixin PaynymInterface final myNotificationAddress = await getMyNotificationAddress(); - final txns = await mainDB.isar.transactionV2s - .where() - .walletIdEqualTo(walletId) - .filter() - .subTypeEqualTo(TransactionSubType.bip47Notification) - .findAll(); + final txns = + await mainDB.isar.transactionV2s + .where() + .walletIdEqualTo(walletId) + .filter() + .subTypeEqualTo(TransactionSubType.bip47Notification) + .findAll(); for (final tx in txns) { switch (tx.type) { @@ -978,9 +1003,7 @@ mixin PaynymInterface for (final outputAddress in output.addresses) { if (outputAddress == myNotificationAddress.value) { final unBlindedPaymentCode = - await unBlindedPaymentCodeFromTransaction( - transaction: tx, - ); + await unBlindedPaymentCodeFromTransaction(transaction: tx); if (unBlindedPaymentCode != null && paymentCodeString == unBlindedPaymentCode.toString()) { @@ -990,8 +1013,8 @@ mixin PaynymInterface final unBlindedPaymentCodeBad = await unBlindedPaymentCodeFromTransactionBad( - transaction: tx, - ); + transaction: tx, + ); if (unBlindedPaymentCodeBad != null && paymentCodeString == unBlindedPaymentCodeBad.toString()) { @@ -1005,14 +1028,15 @@ mixin PaynymInterface case TransactionType.outgoing: for (final output in tx.outputs) { for (final outputAddress in output.addresses) { - final address = await mainDB.isar.addresses - .where() - .walletIdEqualTo(walletId) - .filter() - .subTypeEqualTo(AddressSubType.paynymNotification) - .and() - .valueEqualTo(outputAddress) - .findFirst(); + final address = + await mainDB.isar.addresses + .where() + .walletIdEqualTo(walletId) + .filter() + .subTypeEqualTo(AddressSubType.paynymNotification) + .and() + .valueEqualTo(outputAddress) + .findFirst(); if (address?.otherData != null) { final code = await paymentCodeStringByKey(address!.otherData!); @@ -1055,8 +1079,9 @@ mixin PaynymInterface required TransactionV2 transaction, }) async { try { - final blindedCodeBytes = - Bip47Utils.getBlindedPaymentCodeBytesFrom(transaction); + final blindedCodeBytes = Bip47Utils.getBlindedPaymentCodeBytesFrom( + transaction, + ); // transaction does not contain a payment code if (blindedCodeBytes == null) { @@ -1113,8 +1138,9 @@ mixin PaynymInterface required TransactionV2 transaction, }) async { try { - final blindedCodeBytes = - Bip47Utils.getBlindedPaymentCodeBytesFrom(transaction); + final blindedCodeBytes = Bip47Utils.getBlindedPaymentCodeBytesFrom( + transaction, + ); // transaction does not contain a payment code if (blindedCodeBytes == null) { @@ -1168,13 +1194,14 @@ mixin PaynymInterface } Future> - getAllPaymentCodesFromNotificationTransactions() async { - final txns = await mainDB.isar.transactionV2s - .where() - .walletIdEqualTo(walletId) - .filter() - .subTypeEqualTo(TransactionSubType.bip47Notification) - .findAll(); + getAllPaymentCodesFromNotificationTransactions() async { + final txns = + await mainDB.isar.transactionV2s + .where() + .walletIdEqualTo(walletId) + .filter() + .subTypeEqualTo(TransactionSubType.bip47Notification) + .findAll(); final List codes = []; @@ -1182,20 +1209,23 @@ mixin PaynymInterface // tx is sent so we can check the address's otherData for the code String if (tx.type == TransactionType.outgoing) { for (final output in tx.outputs) { - for (final outputAddress - in output.addresses.where((e) => e.isNotEmpty)) { - final address = await mainDB.isar.addresses - .where() - .walletIdEqualTo(walletId) - .filter() - .subTypeEqualTo(AddressSubType.paynymNotification) - .and() - .valueEqualTo(outputAddress) - .findFirst(); + for (final outputAddress in output.addresses.where( + (e) => e.isNotEmpty, + )) { + final address = + await mainDB.isar.addresses + .where() + .walletIdEqualTo(walletId) + .filter() + .subTypeEqualTo(AddressSubType.paynymNotification) + .and() + .valueEqualTo(outputAddress) + .findFirst(); if (address?.otherData != null) { - final codeString = - await paymentCodeStringByKey(address!.otherData!); + final codeString = await paymentCodeStringByKey( + address!.otherData!, + ); if (codeString != null && codes.where((e) => e.toString() == codeString).isEmpty) { codes.add( @@ -1236,14 +1266,15 @@ mixin PaynymInterface Future checkForNotificationTransactionsTo( Set otherCodeStrings, ) async { - final sentNotificationTransactions = await mainDB.isar.transactionV2s - .where() - .walletIdEqualTo(walletId) - .filter() - .subTypeEqualTo(TransactionSubType.bip47Notification) - .and() - .typeEqualTo(TransactionType.outgoing) - .findAll(); + final sentNotificationTransactions = + await mainDB.isar.transactionV2s + .where() + .walletIdEqualTo(walletId) + .filter() + .subTypeEqualTo(TransactionSubType.bip47Notification) + .and() + .typeEqualTo(TransactionType.outgoing) + .findAll(); final List codes = []; for (final codeString in otherCodeStrings) { @@ -1260,8 +1291,10 @@ mixin PaynymInterface final notificationAddress = code.notificationAddressP2PKH(); if (outputAddress == notificationAddress) { - Address? storedAddress = - await mainDB.getAddress(walletId, outputAddress); + Address? storedAddress = await mainDB.getAddress( + walletId, + outputAddress, + ); if (storedAddress == null) { // most likely not mine storedAddress = Address( @@ -1343,10 +1376,12 @@ mixin PaynymInterface int outgoingGapCounter = 0; // non segwit receiving - for (int i = 0; - i < maxNumberOfIndexesToCheck && - receivingGapCounter < maxUnusedAddressGap; - i++) { + for ( + int i = 0; + i < maxNumberOfIndexesToCheck && + receivingGapCounter < maxUnusedAddressGap; + i++ + ) { if (receivingGapCounter < maxUnusedAddressGap) { final address = await _generatePaynymReceivingAddress( sender: other, @@ -1371,10 +1406,11 @@ mixin PaynymInterface } // non segwit sends - for (int i = 0; - i < maxNumberOfIndexesToCheck && - outgoingGapCounter < maxUnusedAddressGap; - i++) { + for ( + int i = 0; + i < maxNumberOfIndexesToCheck && outgoingGapCounter < maxUnusedAddressGap; + i++ + ) { if (outgoingGapCounter < maxUnusedAddressGap) { final address = await _generatePaynymSendAddress( other: other, @@ -1403,10 +1439,12 @@ mixin PaynymInterface int receivingGapCounterSegwit = 0; int outgoingGapCounterSegwit = 0; // segwit receiving - for (int i = 0; - i < maxNumberOfIndexesToCheck && - receivingGapCounterSegwit < maxUnusedAddressGap; - i++) { + for ( + int i = 0; + i < maxNumberOfIndexesToCheck && + receivingGapCounterSegwit < maxUnusedAddressGap; + i++ + ) { if (receivingGapCounterSegwit < maxUnusedAddressGap) { final address = await _generatePaynymReceivingAddress( sender: other, @@ -1431,10 +1469,12 @@ mixin PaynymInterface } // segwit sends - for (int i = 0; - i < maxNumberOfIndexesToCheck && - outgoingGapCounterSegwit < maxUnusedAddressGap; - i++) { + for ( + int i = 0; + i < maxNumberOfIndexesToCheck && + outgoingGapCounterSegwit < maxUnusedAddressGap; + i++ + ) { if (outgoingGapCounterSegwit < maxUnusedAddressGap) { final address = await _generatePaynymSendAddress( other: other, @@ -1463,25 +1503,24 @@ mixin PaynymInterface } Future