From 96086efe69fb232706eb0c207d5b179b3ea332aa Mon Sep 17 00:00:00 2001 From: linpengteng Date: Sat, 15 Nov 2025 12:04:36 +0800 Subject: [PATCH 1/2] chore: Upgrade Flutter SDK and third-party dependencies MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1. support extend dart extension (eg. size.vp、size.fp) 2. open android (Android Studio Otter | 2025.2.1) 3. open ios (26.1.1 / 17B100) 4. flutter (v3.38.1) --- README.md | 1 - android/app/build.gradle.kts | 2 +- android/build.gradle.kts | 2 +- .../gradle/wrapper/gradle-wrapper.properties | 2 +- android/settings.gradle.kts | 2 +- devtools_options.yaml | 3 + ios/Podfile.lock | 72 +++-- lib/assets/medias/pay.wav | Bin 0 -> 194098 bytes lib/configure/fluttertoast.dart | 84 +++--- lib/configure/get_dialoger.dart | 26 +- lib/extension/size.dart | 11 +- lib/logger/output.dart | 22 +- lib/pages/card/index.dart | 170 +++++------ lib/pages/home/controller.dart | 4 +- lib/pages/home/index.dart | 271 ++++++++---------- lib/pages/langs/controller.dart | 4 +- lib/pages/langs/index.dart | 90 +++--- lib/pages/logger/index.dart | 44 +-- lib/pages/login/index.dart | 186 ++++++------ lib/pages/notification/controller.dart | 4 +- lib/pages/notification/index.dart | 101 ++++--- lib/pages/operater/controller.dart | 32 ++- lib/pages/operater/index.dart | 182 ++++++------ lib/pages/profile/index.dart | 146 +++++----- lib/pages/register/index.dart | 247 ++++++++-------- lib/pages/scanner/controller.dart | 39 ++- lib/pages/scanner/index.dart | 32 +-- lib/pages/settings/controller.dart | 4 +- lib/pages/settings/index.dart | 266 +++++++++-------- lib/pages/stats/controller.dart | 2 +- lib/pages/stats/index.dart | 210 +++++++------- lib/pages/webview/_popup.dart | 61 ++-- lib/pages/webview/_scaffold.dart | 5 +- lib/theme/light.dart | 5 +- pubspec.lock | 180 ++++++------ pubspec.yaml | 20 +- 36 files changed, 1233 insertions(+), 1299 deletions(-) create mode 100644 devtools_options.yaml create mode 100644 lib/assets/medias/pay.wav diff --git a/README.md b/README.md index 3c1511f..6a0b475 100644 --- a/README.md +++ b/README.md @@ -36,7 +36,6 @@ ## Packages -- flutter_ringtone_player - flutter_inappwebview - web_socket_channel - permission_handler diff --git a/android/app/build.gradle.kts b/android/app/build.gradle.kts index 3e7ec42..7a7e654 100644 --- a/android/app/build.gradle.kts +++ b/android/app/build.gradle.kts @@ -20,7 +20,7 @@ plugins { dependencies { // Import the Firebase BoM - implementation(platform("com.google.firebase:firebase-bom:34.3.0")) + implementation(platform("com.google.firebase:firebase-bom:34.6.0")) // TODO: Add the dependencies for Firebase products you want to use // When using the BoM, don't specify versions in Firebase dependencies diff --git a/android/build.gradle.kts b/android/build.gradle.kts index 12bb5b5..fb354b6 100644 --- a/android/build.gradle.kts +++ b/android/build.gradle.kts @@ -1,6 +1,6 @@ plugins { // Add the dependency for the Google services Gradle plugin - id("com.google.gms.google-services") version "4.4.3" apply false + id("com.google.gms.google-services") version "4.4.4" apply false } allprojects { diff --git a/android/gradle/wrapper/gradle-wrapper.properties b/android/gradle/wrapper/gradle-wrapper.properties index e603bd3..8600ef6 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-9.0.0-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-9.2.0-all.zip diff --git a/android/settings.gradle.kts b/android/settings.gradle.kts index 45e4b27..c054267 100644 --- a/android/settings.gradle.kts +++ b/android/settings.gradle.kts @@ -19,7 +19,7 @@ pluginManagement { plugins { id("dev.flutter.flutter-plugin-loader") version "1.0.0" id("com.android.application") version "8.12.2" apply false - id("org.jetbrains.kotlin.android") version "2.2.20" apply false + id("org.jetbrains.kotlin.android") version "2.2.21" apply false } include(":app") diff --git a/devtools_options.yaml b/devtools_options.yaml new file mode 100644 index 0000000..fa0b357 --- /dev/null +++ b/devtools_options.yaml @@ -0,0 +1,3 @@ +description: This file stores settings for Dart & Flutter DevTools. +documentation: https://docs.flutter.dev/tools/devtools/extensions#configure-extension-enablement-states +extensions: diff --git a/ios/Podfile.lock b/ios/Podfile.lock index 9e3e685..c3b9702 100644 --- a/ios/Podfile.lock +++ b/ios/Podfile.lock @@ -16,36 +16,36 @@ PODS: - FlutterMacOS - connectivity_plus (0.0.1): - Flutter - - Firebase/Auth (12.2.0): + - Firebase/Auth (12.4.0): - Firebase/CoreOnly - - FirebaseAuth (~> 12.2.0) - - Firebase/CoreOnly (12.2.0): - - FirebaseCore (~> 12.2.0) - - firebase_auth (6.1.0): - - Firebase/Auth (= 12.2.0) + - FirebaseAuth (~> 12.4.0) + - Firebase/CoreOnly (12.4.0): + - FirebaseCore (~> 12.4.0) + - firebase_auth (6.1.2): + - Firebase/Auth (= 12.4.0) - firebase_core - Flutter - - firebase_core (4.1.1): - - Firebase/CoreOnly (= 12.2.0) + - firebase_core (4.2.1): + - Firebase/CoreOnly (= 12.4.0) - Flutter - - FirebaseAppCheckInterop (12.2.0) - - FirebaseAuth (12.2.0): - - FirebaseAppCheckInterop (~> 12.2.0) - - FirebaseAuthInterop (~> 12.2.0) - - FirebaseCore (~> 12.2.0) - - FirebaseCoreExtension (~> 12.2.0) + - FirebaseAppCheckInterop (12.4.0) + - FirebaseAuth (12.4.0): + - FirebaseAppCheckInterop (~> 12.4.0) + - FirebaseAuthInterop (~> 12.4.0) + - FirebaseCore (~> 12.4.0) + - FirebaseCoreExtension (~> 12.4.0) - GoogleUtilities/AppDelegateSwizzler (~> 8.1) - GoogleUtilities/Environment (~> 8.1) - GTMSessionFetcher/Core (< 6.0, >= 3.4) - RecaptchaInterop (~> 101.0) - - FirebaseAuthInterop (12.2.0) - - FirebaseCore (12.2.0): - - FirebaseCoreInternal (~> 12.2.0) + - FirebaseAuthInterop (12.4.0) + - FirebaseCore (12.4.0): + - FirebaseCoreInternal (~> 12.4.0) - GoogleUtilities/Environment (~> 8.1) - GoogleUtilities/Logger (~> 8.1) - - FirebaseCoreExtension (12.2.0): - - FirebaseCore (~> 12.2.0) - - FirebaseCoreInternal (12.2.0): + - FirebaseCoreExtension (12.4.0): + - FirebaseCore (~> 12.4.0) + - FirebaseCoreInternal (12.4.0): - "GoogleUtilities/NSData+zlib (~> 8.1)" - Flutter (1.0.0) - flutter_inappwebview_ios (0.0.1): @@ -55,8 +55,6 @@ PODS: - flutter_inappwebview_ios/Core (0.0.1): - Flutter - OrderedSet (~> 6.0.3) - - flutter_ringtone_player (0.0.1): - - Flutter - fluttertoast (0.0.2): - Flutter - google_sign_in_ios (0.0.1): @@ -130,7 +128,6 @@ DEPENDENCIES: - firebase_core (from `.symlinks/plugins/firebase_core/ios`) - Flutter (from `Flutter`) - flutter_inappwebview_ios (from `.symlinks/plugins/flutter_inappwebview_ios/ios`) - - flutter_ringtone_player (from `.symlinks/plugins/flutter_ringtone_player/ios`) - fluttertoast (from `.symlinks/plugins/fluttertoast/ios`) - google_sign_in_ios (from `.symlinks/plugins/google_sign_in_ios/darwin`) - image_picker_ios (from `.symlinks/plugins/image_picker_ios/ios`) @@ -175,8 +172,6 @@ EXTERNAL SOURCES: :path: Flutter flutter_inappwebview_ios: :path: ".symlinks/plugins/flutter_inappwebview_ios/ios" - flutter_ringtone_player: - :path: ".symlinks/plugins/flutter_ringtone_player/ios" fluttertoast: :path: ".symlinks/plugins/fluttertoast/ios" google_sign_in_ios: @@ -202,34 +197,33 @@ SPEC CHECKSUMS: AppCheckCore: cc8fd0a3a230ddd401f326489c99990b013f0c4f audioplayers_darwin: 4f9ca89d92d3d21cec7ec580e78ca888e5fb68bd connectivity_plus: cb623214f4e1f6ef8fe7403d580fdad517d2f7dd - Firebase: 26f6f8d460603af3df970ad505b16b15f5e2e9a1 - firebase_auth: 069b05a861a7c2f7a73112dd616a49a40f35ae52 - firebase_core: dfc4bd142bee4bc53a5d482397ca322c2dd3165d - FirebaseAppCheckInterop: a1b2598c64c5a8c42fd6f6a1c3d0938ae4324678 - FirebaseAuth: 059c11702bdb759bb49b6c7ec6ff67abf21f39c4 - FirebaseAuthInterop: 217702acd4cc6baa98ba9d6c054532e0de0b8a16 - FirebaseCore: 311c48a147ad4a0ab7febbaed89e8025c67510cd - FirebaseCoreExtension: 73af080c22a2f7b44cefa391dc08f7e4ee162cb5 - FirebaseCoreInternal: 56ea29f3dad2894f81b060f706f9d53509b6ed3b + Firebase: f07b15ae5a6ec0f93713e30b923d9970d144af3e + firebase_auth: 9225db04db5d8e3b46dc8940e04bc6aec6833e27 + firebase_core: f1aafb21c14f497e5498f7ffc4dc63cbb52b2594 + FirebaseAppCheckInterop: f734c802f21fe1da0837708f0f9a27218c8a4ed0 + FirebaseAuth: 4a2aed737c84114a9d9b33d11ae1b147d6b94889 + FirebaseAuthInterop: 858e6b754966e70740a4370dd1503dfffe6dbb49 + FirebaseCore: bb595f3114953664e3c1dc032f008a244147cfd3 + FirebaseCoreExtension: 7e1f7118ee970e001a8013719fb90950ee5e0018 + FirebaseCoreInternal: d7f5a043c2cd01a08103ab586587c1468047bca6 Flutter: cabc95a1d2626b1b06e7179b784ebcf0c0cde467 flutter_inappwebview_ios: b89ba3482b96fb25e00c967aae065701b66e9b99 - flutter_ringtone_player: a77c42464250845611eaa44c27e8714acc800138 fluttertoast: 2c67e14dce98bbdb200df9e1acf610d7a6264ea1 - google_sign_in_ios: 205742c688aea0e64db9da03c33121694a365109 + google_sign_in_ios: 00dfa94252eb10278b64828c81bcb7158a81a53a GoogleSignIn: c7f09cfbc85a1abf69187be091997c317cc33b77 GoogleUtilities: 00c88b9a86066ef77f0da2fab05f65d7768ed8e1 GTMAppAuth: 217a876b249c3c585a54fd6f73e6b58c4f5c4238 GTMSessionFetcher: 5aea5ba6bd522a239e236100971f10cb71b96ab6 - image_picker_ios: 7fe1ff8e34c1790d6fff70a32484959f563a928a + image_picker_ios: e0ece4aa2a75771a7de3fa735d26d90817041326 mobile_scanner: 9157936403f5a0644ca3779a38ff8404c5434a93 OrderedSet: e539b66b644ff081c73a262d24ad552a69be3a94 - path_provider_foundation: 080d55be775b7414fd5a5ef3ac137b97b097e564 + path_provider_foundation: bb55f6dbba17d0dccd6737fe6f7f34fbd0376880 permission_handler_apple: 4ed2196e43d0651e8ff7ca3483a069d469701f2d PromisesObjC: f5707f49cb48b9636751c5b2e7d227e43fba9f47 RecaptchaInterop: 11e0b637842dfb48308d242afc3f448062325aba share_plus: 50da8cb520a8f0f65671c6c6a99b3617ed10a58a sqflite_darwin: 20b2a3a3b70e43edae938624ce550a3cbf66a3d0 - url_launcher_ios: 694010445543906933d732453a59da0a173ae33d + url_launcher_ios: 7a95fa5b60cc718a708b8f2966718e93db0cef1b PODFILE CHECKSUM: e615128e67103d6c13341e7c9cf615f3bc73c500 diff --git a/lib/assets/medias/pay.wav b/lib/assets/medias/pay.wav new file mode 100644 index 0000000000000000000000000000000000000000..7bc033f62bd60f7b469b1ac95885b28a8fc5af07 GIT binary patch literal 194098 zcmb@v2Y6If_dR^uB$M7NAqYzE(m|y6F46>~3W8MWy$K@Hdq*jPbdlbh6zNrILPALI z$s{v#+kc%oocG=YeBa;qJfG*;Id?LXnLFq1v)9^d?~9+cYTmqDp1^f$)U{dbF74Yy zasU0lLBq#>;E$K^oWRXIg@bf~lQ@5FV85~b$g#kQc#ax}S=Xs)n2D*n@E=of%uLpK z&TLMd;|$Yvr_M~nv8Fp*rebEM;Mi<39vkMwF*PSC`xU z3*Kcq&Yl?gmK@fAcbNq%;P%$s@r>1F66b+uJva;J=`uIY3$J44&AD?0&5Fl{dEuCu zCyqVdniYRXj0`uJ1wV;NFcBu;5f9^Fx^BT)OIUjeYc64}MXWD12fl?JmhUp2%fmOc zxs2m-aUH1XdJa}02P?uX8*4&M!K~o-#N_{2E{>@=bsN^4Sl(O9$4tx)bG$Wnjg0G| z;2p_zphLr~VdyTyg#Ym6T>tU-rp6F(OiaX2vq^Ytn26*5yNP(MdC+&J??$gZ^#S4w z%*d)U(_B}8Tm@<>W@_}RkSk*t*(uD79i!r^P~$KYUnEA?gRBf4%v%*aLriuVhih)$ zQ-zOt_=90|FLLk|YUI<{Cz4fXE6?M*(tSX8y7cz@y5YRs-_$7KA@FmD_a^LlHZn2CAd@2qdl9kUyZtSehf8gb~JrDu)B!1>daBj1U~Ul0@U zZp6&{LgE~FCkNh)iU+R+F{A{WEv_v13%DFz<1{b0ld8Xsufa9|}ISR-l-kIBsNSjGA&CNt2sFb)^Q z??h)ge)iMklhH>0TEwQ|7^9F+oD!wJv0B2sTrEX4w31`0S4L zHH_gh!(%oRTrP;sR{Vw{v>Rq(7MKJhpG?kxe`_3`)v@z57(oQGn}}yQVKn|oh%qAk zl9+%!A;4dW@h;zG7)|lnjL|Bvm>9!miq8fv%l{RZ3u3dGGZ|coTnjT#A{fo^h{apD zE50i;7NZDPWaHm4+Q4hVte6=XZahzZXMP`YY#wG-N;#XsPDwOnk(JE`{<2s`X9cfi zyQJVuk)$w2(~>vzZSuUnlEM*PeNeYxxmZDN+;9B|c|f zdjp>-HXHaX0!t;A5q!>iYYcbEobewMacnjLj|E^f@3Jh+S@`U1SdPnd<5tmr*z<3^=4YV{+kwvS5b3r6!h)QQO`jTU+GZ3wT>J0>~=_88bEWc*? z%eymUp-d^F-|Jll#8e8xO&B)Ql{5AP*%vx;TxuSe%{Wc4nwb}lS#C{cmT#M95B#2( z^{u&MCdROY;Ds40i1uJ+7z~|h{zlh>au;KTnT|kX63yutZV;V`aM^-p;5XyDEbk^9 zm>Ju1WM-I5W`@g5Sz(F`ndxd$MTQ}+*^kYN4$YP5vy5rdoPp#GW+T_+eP(bf#;x8z zGYqFQV-qwkGR2hbPqriIULZdSJ~N+VJdx(kJl2(3K4z-p(Oe-H>rQfAVkGa)dTW`O zi4pw$U&ip6%nY9yMpJy&5xexa_)L+3W@{uvpjs-;)#%<75k;l9SC=p^qKtUJ3S%_G zX+J#Y?=mBgruj6(X^PJQSe*c@5;2-L>&U?i=gsfOW_QFWqM$N-CP@9Rj!J!w`5^rk z%qBPi9s(Av4oyjG3(kosG&)!Qa#MqQ5h;V*{&=Ghmox z%vkOM{~1aIjiQDc!IV^7SQ94=@K zj|*dRVO%zHXNJ!N5&l;#z>LvE$1}7&g3krb$gf$RO=lM4=uBcBGZsY(MiLq;3u80m zhm12)ZHK9qbY}SxiN(xlb&FNFsD{V1JUUbTlPGL7VwkT7yGDhvo8q>SYg2uM;WC-o zPGP&m$ej)Cf~|jHZp3yz$&5&TW`Ao2Ml&6c2R`%v(WVPyw1Lw+u)45uz;R}}o(2EU zb{VbLk(|SZotfu~V>E^lwE{w};&FQ++-9(jOR+phDM-Y$3 z4VDwI_`)O35Hqlup}HyR+lcwpBQ%{ItS5%3{8lxHmw}cthlgVO|gjK z4U39~UcoAXgc}((EtVI(Kcbnl4VGyXtUxo2X6S83bcXWp;xNTyGfOaQaz-Z0z70cM zs>~C8%=q@k(YtjO!$+B~l9_SI!ZYKRtSf`fY%PtMDY)dU4XiRUWFya^8U(3X5;Nz< zY~@(yW>oDh@Ncux&IhWok>i5cz#dbKFyjN&p3Jylrua+|n4vN4^&*eVHDy*;rnTkw<;m~jv4O?3tAo|O$V}^D6qjkw3+a7f z*i2^gHKO_kjZ0KvAi5vTEodxbDl3U`G~ThC(OeHT_9%;)Z2z)Ml*L$v!)#_Tpx{hm z1B(+Z+h8-xItWfvOksH*^;i0csZt;zL&9}XBA zwplf0$ZKd7M7N;WK#yo-Fd_uQ31eoghp-`bt&Kgv@@W>^SVqP2Wip#JZ9~_lU04NG zILbl{kESc||2IC94izIFv12nnvz}I#U$bk)a%*x%w4P_E?**$q=G>Xpb%=Ju2H{4m zqWdmBQ?AeQFsjk9+8V7BQ%oiJ%J7=jl8IJrn1SCU=Qh8V_0zDr9n}Jzh>ZI?|u<@7PT6hj3hq z&&J+m@s7nhqZ5WkSC;({)T4e|P!}?=z`*E&`C37YrcsH;Lv!yK+f!`M(d%z!YQ}yg z`1~$5Q#N5}*equzGs{3p-HT&e4^Jv<=MNpQQ!EqV)rTy2G`AVkDgJm1< z%aKV2PtV9u{{9;_7shASoBD1JV7^XT)I{CA4J2eb9K&W~ zf19;_g0u{mDGEFAm|`wz!Go=C1wdyZ(|5%DFe z2{6vbJdrU)GSho7jG3Y{#cDHNGt4lm4onkaGh_Deiy*Z3n^wbUMU2HhmM^nhnRvCi zf=j)ZGJd8YFf?T7NM^=z%&Trh5gIqheH_$SRG~BbExXf$<<~~Eq3=qs8OzeiY+N7a zBj$>bv3r;fW9)CT$Juo;=g)+_8|%(GPYgwgDM<#;HCQUEsgarX!x-329#iZ#@@|U3 z1s|Jhbq3pIm_n5*GoF||h4>QjDdq{rUMtAXNcO`rA=b@L^lzqtliZrss!6@Nps^lE zGAk}4_bC+Yy?*J`G*HXTCTMS{(WA}!Q)q3$(BBGTvKf!* zG4(j(8j)+oB0s&B1v`q_&SYIta23~oteVNZgY9Y7ZAE6*YiH!d2IexY;@@V5$!w;) z-iYZzDa)Z4M`XPbtlmOuS9#dG)L4%kxu?wW*6f(6(0~(g9$N4MDUrdJe^sDF=poZlqpdUW_zB@EDn&_jGD%ZQbaW( ziE(78-|WuI_ss?0iE1H?JF%HnzsWT+?<=Oen0FGnJ}eR#oZNhE*tIZU1C~#*{L0*& zVy^N~?UXT7!iib0(*J!nD^GOyn5#vG-p}lpjgm+VXro5I#x`Oy@zFHKc4b9uEdow>a zIHwW+S%fiWmhsZr*dK&JGnQuTR0J*8f2{L`b=ETG@Nd{mc8>YGQ;arhVFpGRnm^U# z7~>@~jd8~AVt&qI66@?RM<>=*!&oX)kIbuY>}!LI7wiQkT%Braw4=??Etr1szS+3v z)3_F_GtQ_}5KLwmMrOvp7<2yj{$9F|neUL9emm+{2J2wB@xJvoe)sO{+56F%eGbEA zGP8Or^Hg%KEYh=R!m6|8`m$NarzmKS4NP^W{Qmve%utr0?)x#?jz~kzKy&(+@5`lW zWp(C zwZW)yvukDWesa~Qcex1Pe}1r@;J2IoKND4M7)SqaGpj>0&F9_Oh%GeEu#BC}<~?EP zFO>Z==Kt<&L{xe;3VN^+1Bj|&&S1@v#LRZsv4PI!Blhh7nvHiiu92aYl3G#0J;gW^ zjrhinVqMx4pJ|R{tSrN4mPa$3W*E(8swT634u+dX&4F}IGG_YjY_3BTK4!axA}i~_ zq&*16=dtsk=SLq==Eihx`j>_AnRKAjs^Gib{^ly8`IzB0oy{2)i{^$J!&o1~Fgmj+ zOy_2v9WM({^a*KkPVW1)1 zDJ&ObGpmakvl)-+alv~S%)5&DIIZKcdm>mwG8idC79+D{6*m@P$!xw->&ZO9SWzRQvK*DntjcTV+~oM**V@46cQN?=&ly-l zBOYBjGlyhn$&lIb2<9&opPAoLO@L|l4Dl#Cru+K+`7^<4g3~O^WhymOt{r%enH|VV z2E}CdTZZIDzDyCHb(NBLXN-Wc1gf&r=)^L8gXOZTNw1`V5)2*8sPKQu+WuPxXXIf8 z@z~&^Eao%+Xa8mb^%TR02%Dl;?cHm|v>9V&3R&U#zoD}6T*1Hk55Sua7{h0?8HLEP zu^;F$Q-{p6v7cFG;oZ6Lt}q@O-4q6H7mP0N!*I6R|6gbG)nUi%3bEa7@ZEw}itQ*e zn{(%Pb?*PWzCqF4&^G=})1bNr+qVU0V@HsD&z##C$A&&ad6;pAhPSZ06q!={ZdW0# zF&ViuWd;TD+Kk=i?jDwR)0rvDX4R6Oy`k8!jDpN8%OJC{I~WcYoD2IfdtBI;>0_3M z{jd4my-@J|SR`gM^&%RV&AZ>s0nN1(V@JFnqZwBJ`%Gh;v5Oe;nzcLT;}pS|lE;*y z|JFy$qAi&V#!;uoBus`Hsdpkg6u4*cQ7t#cqoe^#FLqavwdpb*9Ebe)>jN|j3FeMSx*bA zlhOM#jE*n*@1)U6GpRkZBQhIxXM*Gm)y+L(1o7EBQ+zhppUs&AJ7acLnaBJaJ`P4AuPj-Dtt0#{Xq5$VA^=OJi*f?r&5m|JU!{ z_kQN@N{-FLygqD~6~=0_+F9_JA)%AV$*)E6c=bX3w-OIu};v&5vm(mC;8+_B7MY*=+PR7iJRln-@HL#wH8SMhrBL z3=V9*ddBg)Id|dx$?(?jHN$U=eQx+oK?GzGfy{=-2jSl&^}(G_e)tzyLbw1f0zV^R zVO$^{dAWKV$r_Q!OZu?G@%w1}48`A(-zVv>^#}Sb{i1$aKcgSlujm)_yZTN2wtihd ztDn?=)pzKN^&jcSWAeI;V3w;Ga(D^U;u6(whsvp-5 zXbZL3+B|KVwnzP0{ZI*2s>&tgp>i+zfqX^YEpL_=$}{DfN(H5v`lx=pR1mQu&6 zBh?mq3%wcNiZ3fv7U~L(gdc^KLM^eeSY2!&)(}1wmhtQOKEe>;q_S_yhgepuDcTT-(>NQ~i~ow>D;yW9i;cux!tX){p@)zzIE7Ed7Gim!x*+kM`~ZF^ zpD1Jre~Yo=4DkoiLktkV6BmhrQk2wP>?_9ciTv06H+(vu#b4pC@r}7g+*R$O_LH_j z`$+#lf1usgwyPUdP03ZhQTwUe)%EHgWs7oNJ|s_8hAS1d4>fQ;5MI#3;~_0qDnMD0thvvxw=tH!HORawnYFDXZqYtEz2V~%Z(^3HH4 zFK0T#WH*dF=X3eCd|SDwY*Lmg>*OEhesX7dld@ci)$b?QnrR(+vuaJF=O;s|h99Bmzq9JlQk z?f3I9=g-fdoL|je+WyRb$9@aHJ80iwpXHd~usPG6_v9P$W%;apN4_qfR*ox=)rab5 zS|@G0woO~FZ_v}YEbe>$N1o?Jz6sY9KG&H`=Q6pPd>y_bUzuObFXKB1p9#x^Rf0uu z7e??S`IY=CzPwOL_(JF{cniLQo8Ter5PlVEz#AjPXz`M8RY=1%`%)Yr4idi+9fB&H z6)p(DVz@Y6oC8m3AubV?;~lEPTN=TK>I<2C4u6(E&nNMzysr=-{DEuv1>cJw!H?#P z3MGU)!XpG8cQFs|6(xQsHWS;y-#!te#FFB8ai-W->LvwRidlMEhFW^TrdocqT(vy5 zys)HOj^SvR<+$aZCDxK-k=!0z5-ck%J1qSz-&#JjRI@CXewHqXx5Xl2X_5G!ml!5S zilxL*v4rS{PskQDVUw^+_!#HuD}>`)e=R%_-U!iRIeg!eq9%BVS%M;#_rMgRo5q5sC9zIWMLy!&0@fe?iA{XqOkyopsRBa{=S z@>BU7E{9u+@fogY6|Ry?Nm+$B^IUtP`Dj*c9QHBU&w;A9YC)r4zLJd{lA**aG0JV_ zx^fo2a$Y%wqdzd8R(?`8D)W?C%1mX7GENz#v{zawo{FTLk&ntF<*(&vIYfTwyy4vG z+~oYxIotWA^K+-SlXvcQ{N$ME80MJonCiIXIPP$B%8vTZkDYz+{80QH>m1_T;au+w zmwoU~d*x=zC(0USiLzVSs;pKPV}}kD*Ddm+MIYHhbuXV+% z#&UHzO7@m*&Nt3i&b!X%&YR8{=RJ7;KTc2C=_GNjz5J=%4ZCQt++E%zFP0TKT^^$J zQf?_1lu~LDb&UG8O5)&C^{!e}3)W_7leG*jNvo&V)IZbPVYJZO=*@vVJ@jcnpM!|= zS$c+EhAYiAz-Wlk4rnu*o5S4&(iG=E;>Yom_`mq)d=sISuv6F%|Ft4w4H2)455(e9 zd8xZJP@037eMY*Df{Bl%q~&9auO-rQPkJtWhu>F_YDzc6hvFD<3ZmwxqMPU=o)Iny zorUf~3ZKFM&L8D>^ZWP%{2~4Xf11C^-+{lxx%N;hBBCGm(GX#n@DF^lmRL{x3ZFeq zoDFo?CY}(_idV!x@$P?%*;ugGSwm4604U};gy~KZnSm7_> zneYPd^%9<*AdrZzVz+Q&3?5w-ZVLDC3U{1i6Z};#?ET*O#O`7rv8C7%JGMObkyE&i zSM3n?Vh4>B6kZgj@pE{8;Mz&<95;{~0zY-<_UH%nq525Dw*HCkqX+1AP0`5QL~p6j zM6^5vo{)|X#>QMLZaue^d(OS#EW9sYf-le4<{JYmTk=&9zase$d5QPopK-5oRenUz zhbK2vpQnccfiG!Sw29gjt(sO{%TaUHLm1zvL)EfsX;o5r)l2oj{wS-qR$Bl8`l>V3 zDe5Lf=VR*c>P_{k`da-57?7uWXriX7`RYsciF!^wj@PVGN2p(^CE-(dl*`H_cyJk| zi1I|f2|S%HHOAIL=A7vq?(F6K#`%SFzH@@}uyeaJ-uaia2zWMsJK+!2RReNvx`_HN>jU00x}|+amuSS{?ZE4Dh8Zh)xpk zg(y@5>)DL2&o{-|HsEXFQEk}A_*sH4jaT^d*<3#Nl>3Lf0d{qpyN9chi0k3Om*mUf zFI&1|_%HmgF2AfM)I#i<51)(`>WKBlW#TIFHGHnJR9zY=jgz)W+oe;|dFhVyP>PY_ zr3@)YN|w^4Thd)=t+YYvBz2Zlu!>z6eZ()tGKkqS{OYRk2i|wK&=4`&3ZzQp-ym|n z;&Z_Zg0K&&0c%&G9@hw{OL3{|G$R)#5FM^e=1zQ{qwCu{Y!M^Xt_2edSQ@Cy1F08==AZQ-ez>5!t z7nb5HxYn;b-v?_k4pDtNKb#-ScK{bFjx|i@a=}0^g7Gcl+HxITdG;=SkKP&)Csj)Y zFIld&(3)$Wh}%zb^?z3nzzY_u6A`rrs9&mG)lO<>wH=PStCR4%&FUKUf_hSYu0B%V zz%&0=@8i+$>I!wC`Yn8%{6$Cjbse>e>Wk?ACt~1u_-S!)z^7me`{ix$y%jFoF0Ye! zA!6>9f0BQbcglarr{y#`PA;Q-po~xkDTkCjN-9tzN)1(;stvGL`lyrD@#;Kv7HqaU z4QDhMXW3kBq=u`(>TBgC{^A#9v@#4)y_OQB_$XO&s{B~KE1!~&$Un;)<>m4sc{P0h z06sNNekE5^ssIrdDv3&hQbVn-PQW;=o>6@?Uu`IS{g!qYT)L*dKwqNYK=zOY9fsUd z<;w+w$$!9A;w)xU4Sxp2XGeh?0ZBk0v21FB4abd&PtJn+IUAAynYgp;~VUkZc;y>L_^69vHQ08m$(w2*c+^?idaVs z1dCAxH!)er0WV9x5>pz_JDI=5U$~wmqMJ7g2}a$~ui{Gl8!2gsqapIlo0KyD=0m3zvcyPjW%J#zy) zL{c=l0l3O^ME{G*8ASxYss%>>h1vyYJlwT6R;f!7%U7x!)z#RqYh8Pm?9Zv{IP8|5 zcx5}6^~IhZhrd~i*I&dgPC|CzhdA)5RvW7^NxP@rz?zoOC+cI7J72=RYTn=>Z4kq! zBfH(t#bFfTiy(fr;s+s9n#fP#=OUgh2MLT7EOXmH&k&O!X*#iNDT2 z<74?eUgblCqG0K*gek%t;WXl`0-ve_20lrgD;^auifN)#EDAo;R{8>dIbYf&?UfEn z=cL~d$9GA`r1jFT(ht%aX@oRY>LB$(Mp{pD2j6%q#*4efBgpF(i2blj+KS!4=$ngG z!Br~b6RKgKkjKrzAG+Zcqr}PLkHCwq*eQp^)8aWWDZ-_$ig$4y=frh*W-?d{;T)C3 z8sO!U_$PdMrLa!uDfGd&_&|sSE*t`LT7>UE5~CAFEsT=jYhj4*K8V?#yp<0Gu9W~! zuM7mN4z#NVMo|@y%JXIUXso9@m_;h0#!c=zw}sn)$kG>)rYQGJ|4UzujGk~sO>=0+ zv_rt=@j&TD$ovAdG+e>EU=XLl74{*k-VV;W1G)84^$31@Lw$vKorQsbgI5P?5n7}c zj-P>Akmdmd$XD&^V~pKktCKO>Vnl&!Br8eENpSXM;LJmn!C=Wvl+wzFO0eRu1SsB0 zI3jH+MEH724W%1c^jJjig<$kQV@DiUesk@E93@Th2k$AP76&$btTtBbVSm+7%c~!% zA*v7dnO(_341S?Jz@9m!>;p$%u6z&d7^?Kfd$v^?ASc=tr0uML+jayRU}HzJ!nDCv8J*5 z3ur}gV149YPgM0_=tt$jy_+Ml_eW%(jySZ5+sOTa;ozLeUu*G`kq2FZD&PbB?sTxtLri;x49zO~!$)emqVP~K?CH=J=8G%f(Myp}&JqVAW_Lm)ZHzpVXd9K0+g89) zdHfBTtH4L=VGp#2rZH3;2fth`{sy1?8*GLH0(^w{-CXJjhCf1@jy9S%oWl` zX}0vEG(;LDwZiiyfE!Ny1&RBc;lD%0;o`^eT_<+gW#I~9^=e_1FdApy4eX^Q_F-di zlSVFn(o|@U-?b9jK{@FP?PP%P6<#|A{AIc@4ahYX9H%$9PHo{6Wa!?)ef}|&nT>pJ zzAt>ZIRAos1svSSbpdHPYOl3(i2dudjoLS0q}8+{b>a{tn0J0S|2lZ)yW?>ZEi~`YK<#BKk~t)B@{%qIC{6n08mr4g`Vyz)EnAXfPc`@s#YrY0irKrs7-U{QOqOD`i&ybqP;F`(O%{O&rkg(s?ly<1KzrS$@Gy@=n=?*unFiO77Df6BiA5)-u~-KBly zB2p{7&J&HsUkHR^@)5L^hQgP){xcD`cY)ddEj$%`;P;Khrs8P$>^5)p6+nFd%b-ni}ajZB2dFw3fs0HF;ykniFiF19y|)!;vnRO{ng&c_WHm-z6LA(7JPRi zynBi|U!9{aQGW!&FLljx@HYhe2?wYLe+pFt)GWlrn~09v5GBXL@0-GNBa}cTU(S@D z%a7!1@&)+}JoGr2_ffFn!(irz<$W%md{e$E$KX{?WQZijSAizd67SGW>8$jDt}zIE zVHkGAD7-JR5nw~Zl&^sd1C*XhcldcLMC*FcRjRw}6Qz#Q0)O9I`2xFXys{1|%xT2< zH%gomhO=#tF&E=3h7*}@ZLG>zZJf48+lQ5U1r0S25u-jlxet{2$*wrE1M7JVx%wYq zCJ&&Izs9g3f|GkI!!Rmhw89w1eFH|m0vXUn&W=$Hh)Z4F{*ZA23d!ZR(cO|I~ zc0v&;9gO`NeE4Vh_jv4rHsa?{<0^_4sD~L)NuEP1yovns47k&8!U^af`@l%Hf|qP` zaq*4N2!Dotx)rtw$4lYsld)@iVei((E)Ex>gnZt~-{&790_=h=IG%5W;Q^j<7k<0} zx#$S2VM}0PNv=3F6xD^7m-Tb{UR;AUi0R*hnNM}G?P2;?xJI9$uJH-#4}sf<>%E zES{@O1;d_zh&&mQd=}#L_uvOVf>$p&Oa2q;HOUM2Blp~njC31v(f!CsFG16O1$~@TWVwV=6xv`zyvqQ5 z+V@~H`<3U)6UB!=%^zzIG%wu)wV|fSTxRQ6;on}+mRe#=!`O{+ zAA|UE6u9Cid_7=pFGQyCVB0@HJzoJFCVYDnuI5huIHLL;3=+xx5xpy8v;?mA1ENoZ zAN+)z?N8x0yj>H@gB|w(znz9E$SUM|JH&nP-BaRuFyT9hr_aHu#zaqu@Je)B=EMuh~3>$0cg*6gzD4?N>W+g4XpbG zbf&%BK4>iyTzYvB>WPV{^_@hVnF}4OC3v?d{P`BL&Q;J&hG>JJdNoG`uc8&xqBINQ zcsz2b>$uv#sieZQ#pMfI@pCUc;sAK{FZk^;_z8*UU#dO8RGNSVSB6^t0V1J4vN=2a z>k<6ySNQxi@RRQFzxv9@h{0vRu|HCx;E|z-@XvqRWiROEQTTmjr7XO) zuF@Luwk?=?OQkWQaT73|R^UFJ;l;fWr~4`cUD3ERUe^TgUIVPAl8f84b;aqf*f)c) z)5d@UO~*c4036u}CFdkqe7sUzjfCHKfX`1uuCNW9J?mz(LZX4c>!Ncp5zF0QTcf#P2OYqLtX6bHGYQ2%VtGe=0P^&aDCN zRYnLFB2jI%Am2=YuV3Vs^J|cO4?`8Vsf&lGoWMWFx*g+ALG@dP>~SDh9X!Mr{+xk2 z@>AqHf1<8^3cBnrMDgXwhe++XH|z)^wZDs1bcC-qf}d7YiowqLIV#Wlu#wr1ye~7y$-S5v;v6-fJ{6%8kkmXfx?JHxFo&#nqy~ zo9gi7HtG;CuDQ?@e}c+>6p{N6^%8RCKf%B6fsg+Utuqcvd>-@>Uu2f$pqaMN24GCb z*r;vNE}-I?3U4olHS3Bx&Jy6_Wkl~BDBscW>Xy(5$AEkPgqp%FXxaJ5B%@HRtA_~Q z33a=H7!xoSW9-7Xgz*9+55q_B!FB%-ajp&&<}S#+#=}Q82q|pMNjxsS@=~m zu_yA%v0w^I5P|nV%ea8}dLQiLDg5`D_(FUP9q$(EkykJ-V4TG`fw3QB3&ujk>&Y0y zFa}~jeC4XL4uj`@>v~`E-o(aXhfD$opN{(I_h8}V^Ohs>FT&AG#B8EVb_JT$$L{(N zJI{(bPpXgsu5#CvFHDD?{yF@*0(3uj=%I<=+_w?CkMgI0UE84}{Rp*m6jla33E2Il zCQt@?Ni^y%zEHlMoDL6v16Fs1+YVj)d(>ctgK>X`jI$~WC`H5>JJqNTinZ$CvI_NRIUippVE z>|TxNP5Ac|mvS~p?FPVDTfGO1F^W7@+q{A_VE2);MZTHE;E9ZR9N>_8poIQYv|@dniLN5}^M5nqXK!~`)Fx?;ANCFbF0o|r6VfZN32 zb+^Dpj)HY;b$RqecsJ=W_zdq}2U%lLc(QiuY;~V8_Z-Bbnbro0KGH1m>TJg z5xdKQcl+v@xPEuFJLtyQ2TxxJJ#084cRQ^jqPLsIYtP`@2Z7-8QBN75_Ck%NKJ>Vc z)G*ag6;-FJV*gaRul$J^eikwO7?f-h$&Y~ppG0+r*ijrGPH(W8?4>(gIz_Hl=Ml#b;T1a&?bpI{7a`2f`Y#r#t6G!nNz2e#FBaqCd@n7JXJ%tOxdhD$&d_db}(X|TJU z=ptDTb#)r|6*}Zvqqa~H{UqM#`b*Fg_4DYJTBomvcaK4jM0==#rF5ba{snF85U$%| zc=d2x$Bx=(Pz>s7A0dYOL(NuHO-(@re+Cup7Syxz$h(f9y1o~g=Fi~YE0CkjgwGGb z=zviJBT|h(WnNd3Q3<>c4?77j-vYky9sG`H-d(^VNFG?%#g(hVldHfxt3ux(_Az|B z2AFg`WSY&Oa&&^n_C<^yfn6{edtoNH&Rj&~AFw|b;$4>^GOtp0fcNZzSMSCr5hJcF{~6KyBsv=ZLg%DS4@FO9O|Ay2&0VZ`Qys2>&KEk>{xP zrJzU4i5?|)Xec456&43Wses5`9a=Z>t@_a58lhLKB|Ppku;MS_k>9`~s^3BWc@@u`!7C0y;oAYFd@cCMd@%TNc+WoY z$!ssM+W^uT;eDCs0eS;Cv4wYuE}+WI5Q#9AO;3$x!sP^hMO};?l%h1EcB) zCBeA^z`9jvphOqF1#kZiJAFB_ZPG*5if@a^{SoirRCx9yVBbL(9~sDfjmXgym7C(| zM%A(2FR|{IP=VY74Qn;3nRC#KGFtBjWvdBtqKc?UhCv||5sNawQ=V!u+GW(>cB4CV z5i0e=5Vcx?eV0Te6QCN#stNGytH{81fsxFIiaZ3`cN@g;%0T*Xl|vNIQS!icQ_y+! z8vgVgOyH4n2jd3DRa9CoE0-`XAi|%A$DLMAAfg|DC+>hRu7mQj2)tsJi)oC4%J&t# zx(D=>HpnbLb>)q}&Lc%!Agp6JB%; zkug!=MaiWRR!9A&9n`;p(3vO0mluJFkRIBd@Z#Nw=EQa(R{sJGWGnoYJhuj_3E|Ik z;kkrUk3cnY5dOZuD^~Y|7x#7fa&P?XiMoDQ?3d5Lc{<>8+Tmv#{A`Y$R3H1QD)v}0 zuq6-V1ew@_e?gf)hfLuYu#<(tA~2Fss8@Bu-mQYz?I)xmk0zSQ3Gi-G16T_Eh+x?u zXe6EZE{NcbfN~Z22;?fBVBRu#cM|aL0eYQJpqqFT_cQ9jvr#1*0AFu{Os9nFt~|oM zN&ocssKEDzf7jG&p?(txzs>|Fx#x=CtF+b7y(Xb+=u53B6u~N5RV^Ay3W?#OCTTY0 zTW=8G9-y!EJbYq56qJp~&wj+1g!<%Qj82G%wb8p&6qQOI9-jpNdVmOi9*ku_{CE?* zZxPt>H2CmHa1oMCehE%ZtRH@Ug~#6@T8~1k9tXBE1q$_S#Oohjv3ezT!4}kyenrjZ zAbj|+3m3>PA$#RA_RS6D8b0r?@(dOK*UBs4M*?~sv+)n%sEQxznjfkq)K8EhbcJH_ zEmZo&(0+EKHhT^GHWB{qiOOqbtr8f?=cwgQ(l#TTJd57lm)Z+dx@7ou5&cuB-+j>2 zFcT4DGdSOA=uwZMdS{_ijr7NtM}KDQT&$uV3@Tgn~)Z&_B42M3j z65|X;9EKI0Or>e_Nv*027agId0Tm?q* z13Y^wc-3(DHmOOqhkw@x->L{Nk3wbM6Zs|C$1nJQ_zM_YF=k`*!)S<649uIX)iZRO z9pjFIkt~J!G#vd>gpZU*_0kXjf04enq$IQfS^2!4~_2cX!YmLh-Hy z-dzM8fNnacr=h3&0lJ5dA$D(opU=Y8{YvW#rMD>*veL*kJ+urp8SLawaPYmT|1AT5 zodgwP0DQVVn0P&)eHpNlaIjntRaF#tRW|%98H^wfk^BWBImtF}L(#YbZzl|$vGJYo z+AUxht6WTchB5=0;y8H!Fht}*&;a{k^o8g5bsZ1Ft{93vFa~+$4CJhf;r%~@%^!u= z-vSefRbHaTo`bmUf$X3d{J9pqxudHtH5W{Z^qCxhPhS8Zc>u;057sS%bNi#Gpfn;k z=_lz5mNpWK=>jm6Ur>|30>vari_?6eb=N?C*$XK69l8bgAY;Fe{D%BXGsS_NExBg6 z7DI7Omf&8BgWN-8mDyYd;{^5fwjCaR3K8udpN#%}9ygjq z3K59h)ltdrfXF=rs_`6Tn}n|%6>h=HMpli>;E2bguoCu%)7T!A?5qbz>^Zi65Gw^|*b7B(m%fHdZcnKY?`;aND0K1w55AOrt zZicFSd3ZL-pY!;9^wB(b`83gtmSF{^U<|_Oj6r<60!9Re1tSZ6;mw9)hcO+a zKL+U!FOETOn0tSL6_2*ThoveZnd zCo!n*+(Q<23Hr7A^iFx zeEJZw%k5ywB(o%JG0CY7!zDZj%UGhzX!)Av3>>kHK{Rf2GiaKPu>MKvkwgW zFxd4eL~+t{eg*GM>Z1>^f1Y9=#bQ6DA$B_zo8kq2QWRM*xlf`MI#v3iGBp`zyb95q z@Doy#w}G96fp^z~;@un3d!{x4UcDA;a||o=H>jpV`w)6l6R_`oVBgbGAKQSaaU7^f z?n%njlM%bEh%TiNxtk*Y>5o3*nW!57w>JN4z!aZxF4V6Vvx^YL(k7a{V=l1P3YGC0p2|pv8NC8!4`<$RrGLNGY$+q zQA+_!d4P)LY1AyYY2V}i9nufl9&wEHn}nfnN(MWPftO!J#b-aF_$qk!6h!fXsM>eJ zXoyh-T)c#L9D%>?1BclK z&)tr!@F$mky%`$Fdhqhq@bQ({5vwq7fUj@E^ZUV6h}KRtcfv_tfbo9s0Glww_tA`#y7Z*isVc9buRkOJy6Xm;^HMupqO;W7>O|-V>{O3 zJi2fG!H_j4^2>0SZqiHt0#)D{h~7I8y>B9V=jc(mW3M^lN-x~^HW>armzxF7cm!7} z0rA@t{JR`DW;^J-gTXl`fO#%~{(A_q`wqIRpX08b3_jRZvn&s`N<6(R*h&LL@UKw0 zoQAAzF*44>@auT613NlQ#A6*s6RbU*;;LGD( znWz(gM|!;5fJN^DCx7hfvU-Cq+!Sbr50Oo7K)n9}s`)dqhE!K7E|ro<^g;y+p~6dahLirsO6ch05p#Xf?N=E+2hI65=<=({KS7Og0u+ylh`XhU@n=`c8-jz5&&0lG_oj zEfXHu3EuG!YTLn3r>}t9lD_I%&^eNvFP+<*Yn@Nf?^Fc+sUOM_@*rnV=S*;AUtoMq zc=;>mV`mFqyL0>JuDql4=>?jE@3{L@)fDl6HLuWz#KvjkboSR1-`c3x!$_% zkK`D1Tuz4uqr3ULw*w}S9{7epsXNdut)9`I+r7_w7xS&}8|+oVYq$F;_kS#@mfarb zJhpfq^X%_6)vJPM6VDCecJWs*h8$d9Cp3%}sJ`bwPu+{IpmXvuxk+w?+$ov8GPAQD zXZ@PHJU15CzoxC2tz5QGwwCsHT7&e+^q(@OXS~S!GcVl{<9O+~=U9_BJMT&Eh1?%= zM(5PCm$x?o%O?L;K_849R1n)a8aQI@5AEbW)QiaLD|s~XIA*)NC@(N?tgWBzRn{L_ zQ!{#J)JhLcKa{;b`&Rz>{AzLqxu`SPc_M#L{+!$qxnJb9%4;JxlaD}=>*hAt?F+Xd zZV`xix$vFo=vX^yxojEeJ=1%T?_6JBpK?AuJVtmlb?fZ5$Zexraj$w_QGTELwF(#! zu+;Z}@AuaAR!>x~KY$;{B8n=K)zTZidPUKLdDVWxZqIs=H88VT=JD)J*$-{!Y*X?E z8WW)GgoFR`HA@& z_F6blokInsA~1Url*Sf_x#O+hSr7Z(_Vo{}8rZf-ODw!(5+Sr!CP|-d@zcH-BUPzMPdgm(zbvf0(j2 zrA1otwB9*Qa!NYF91qbMbQHaCI~;2r>+C<+>&TVm1&E_r7R9pK`ipgp`z-fZOPVFp zt)$yTj~_jr`Z@h-hYSdjL&}7%4LTn*!~bW0cfV48t^B|7pBVIWP_58Gq4~idhII5B z?U!%$_LyZ^YKfIHrC|5c?r~P9^`Tq5TS;gv9h|M4TWu?BYEDW{m)xeggL1p(cFk^_ zT`AQkRfvD|X720HU)$oY#EnR7k+?Z!T8cg8@09Gs8;Kj|oB0n_$WZvF9FPkHGecq3GjiJ|({+$J$KY5<@_=<(TV8%)XJGl71yUGQ*Z`!`|GVvpnbXtdFy_)Q72c;VByu z1}BtG%1d0AHY)AU%$=E=GAC!2N!QboQ_rQIPG6Po%z2RmPnQSs{rT#^?JejjKFS^9 zx}e_hfqPl^D4!}m`vPtRR19nrc*^ggUn!ruK97A;eJTXB3g{U!D})O#7d}07N9d@4 z#Q{;?RlWOpjP@wvQQqT{$0Ls!*2UH~xW}s*l*g@kOY(Z*djFcUEXUJk%k61vVH=s< zCHqY3+SJ7feG(eI@q4o|epr0FSOzr%iChRg}s zUgS}cZpD@q)1qq>3y*3YH7DX=M1FXQh?|jeWSOEpi=K_r^KY6P4~!2&u(q2Zrh!^B6oWBfb6bWb+QKMw9om>-o*YIoKL`e)q=|Z8I;lt zrL@fHFM&1;NT zo_|!p<&d0^_^|Nszd|ix7lTuR&j!5-`ZQ#4$eQpg;kAl0(yipXxEGeckaEB^hx zCwdR{oZ?x*v%Y6Pk5L{emRt+b*w#3{cZ{?3ww=k@meVS?O75%N>$#0`O6PcFB&07+ z9+3Pd;YdPIVq8MGWG=a0YDntV)Tyaz^26i_Nv)ImCf7**I=xx?qny(@z7EdehMuim z;OgYQq4H4jM?rZz=YG>Y&&$(0-beEp;q#r(=iXm?H}>h~v%&wEzi-ILA!%V@;qKv8 z!yAPR3KkzU_h7F+s5XXSDK=Q77^$7aV8$3y#N z`!2+jNts_{UP@kW-3Z)Ya>~BT?w6aJ zlb&%iqhosc^stQF^pCRKvi4*z%kG!mBKusjq)oK&^o{~phCbk|0Ms+fS|x9!9vK1u*9%u;ocE{ zgyn`63uzTHE^uAo_<*$m^#Z>PydRh!csk%!K$vfJ-&Ct^y^8FhELVYRjC*gkkUF7b zila|%yWB)A*wCXX4kyZ;ziA@12;Ka5LpV%F3+SS(Ed}O$ej=^ymG{YA|6q{N2NsNMwTh^McBMB_uvY_ z4FmfJP7T-;FxG#C{}i8YaKod2e!~l<1V_DJN4}rIbt=meefiSi+)&j}zPz8YG1$4M=N}b~$T**3{ggxm#>Y zY{kJ}_UHecA1(*VuTec;hP$=KxPRxq(z?^y(PN-TmZ#M#(6^HBq`=LA6+*j(9tw*I zBN!eT(m3RYpnXA~2aON95|k7)A!vP2hQD_}Z|~9GW8J5_liJ=K=(ST&#qrm@b#fQy z=)5oU+_RE1b5d`o?oXbV{AbcnNf#1VCyt448lM$=GB)hhvzKjN`o6sQYW}O+uh+l6 z5x*&ZY+}pA!-?|~D<_FbHBx+1s$~RbC^>OCv+dv77sxZ@rqEm)qW8@W_4rxVh1MD1 zAV-282OSB09(p}2E38xa|f)+uT$R_TMy#h(^$U3_lw_~@u&(NP_ujzz{t zo{db8Oo$9GayB9@;$-OS(3=5i0d2hdc}H2xS?^k&S}vn%|D1ctk$(rl-EPmH4=x&% zm7nRIm6ge7CuLc)Gqe84+?|=3em}i^TE(=EX_eEKWsJ?Zn|&g?xXssAAul3tYu?hl z3;Dn0cXBp!#vl)G3rt&R-C#Z8dBgLSSGHGKpZY!x{kr*$4O|v@I^tGi?S&~$`?shl1j(h-z<#n8vEqsmX{@8CjS%pD)!~< zn07HCu`w~1V-}O6m?p74v18vfebX(uYVxv-aT!Z7 z{5x|@cF*k7w%xWC&ic-g(11LkU35e5+5*%yj$2M!R(ovqnB=?IcR}FJz*E7`f?ouy z!KH$m1V0I~1)akqztGB|KZNcHeHQEp9uhD!pbw&aDbLEDL#(5$n}Jm&+)BIMKp&BU zd-K-X=h&O%mdYKR)jaD$#^#L6Xos+r>v9Nhgm7FM>hpke6bpAv9yA|1}VLZ0P zSt@xo_lou9{oDh}2JAy*s~plJWI_1J@RCuzqc%kU9X+Vn_G0s*FGlw+y1Hmk(Kbc@ zDjFEQEjlK;WAx(akD|Ve>Kr~Vym)Zi;4S`_{A>I6@D2B_>D|=hOAmKT1n|ux zY7e*HL+~h(m z*?Y6sWIxQknETv*-##9CE6FR*pyprO(%ABw+iAC&9?d8)o|^r&G>_tQ}cjfjcLqTuQl`urA?~IBQ&w*b=dBv3FwH#D>Ir z$3Bknj(Pa%#mlWPufAOPa(PUznCLedan+N2lQyT$NKM0j{Uvj8=AG=5*{$>H<$1~$ z*%KYNc2SgOxGi?;W*uT(=egfA!^hLNMqu~A-l6kDweU(2mm~5bT1HHaI1!!@ehi$i zS;V-Akr6*dlnw75UOJ>>NbP_g0egL}_>}i*HXyWkz{9q3oq?~wlu|5^bZ z1Fi+c29yZ;G)M`K3Mm`fHuQOj77`U)H+Wva=75TR4gJpf-1W&u)5v#T%e`({A6bt| zM;4Z=4 z#@emAx}lFal}-FwbHdw)m$Pn{)?lK%`(3#SL~1sep41PTN){F4K{ z0>LLH@sQo8b9=@4rh6QPqCKmx0S44q3S>xR+OX%kwT=@=!EYEbA@}D+v9!ctrD~c zYfGi1&FU&Oe@?yzv!QlKhPEWS5fqck^buwVGfjIjsLB*YRnCq7DCo^(BF zW%BK0Yf8J6#mWCBUr6*O*0v8ppM1kI+_chk#qiZ|3H_+V>bY7}3o3*p$_M0im&WGC z9;sK=_HuoBLby-3Xs|#~hoAkw?)B~yt_7|Ou9dF3Zlim#yPx|{e2weff4IAQDtnTA z5$~qJlt6#6rRbMFN|Kx|%c@h|0(Hs)2SRD+erBo|)tc?c9_4TIze67>Y^-mrWB%3L z9QWW^+ZS71`yl&eTZZkR^_g{(<+9~C&d5)uT+skwjLfQ$H7K)OrYYlP`sK8#X(zt_{(buQ8sBTC z1-|b|@1Nc+(+&&wovba+e$H*~!S3DYi>HNt2{|J7BW4TH=*#p8 zXlE;o`;1NtZQW$QVqcVaJh4b}>*Oyfe4%%#Y~k5O&K8+m^kmUiMduZ*T4Z>U!Ks^4 zhox*tnUi!hX=uXgguT`W)(YsA>k1u(vP^AeFL9JOj(4X5CQ&PMmgek^Zi=o}W+}I& zW6~UPh-e6j!JmSqg3ALV17H2u{eSq|_?P>C_s)>ihZc2`2-#O;YM62~PT zNc@suN=!;-xn}+#%qsc$l^(?Z0npzfJjC`)kFo-Y@UJZv9&1d&ak2X}_hF z&IqR8$y}3p$FadN#@)<)8h26cP;zLaG+Vl%oKT$6&(VDDO&QD@29hJm70^qH=zr8l zjmf6Emfn`)=nEu!k%Z%TC$p0(C-+KTo%}wDPdw-^k(3b4@1GQ79E)x1XU2G3Z}NB22* zZMVr?$<4TFPlkKCx0knzzqY?B`mzA-%Tpj(GnZ-1}pg)zsqyg^T~C@b=EQ4F)y=a=0E9U z(&wZ#PAiu7?fdAoN@@D^r)kg9*Q8&_n2}K~E0{UTS=YJB(+~AFA5g`&;#}y5FSM&# z#hk)9uQ9K9rF)_KNPnYe^2_+ehHZun^JaYSg);?@7f9bt?1)HOSGz>4n!8 zepomswN~NUsiRZ76j}yduz5-e-1wvHTkZ9sePuhHmER=DyY?*5$VIwqo`U zsQJ#@1NK4*@d=d@*5F<3V4G?yW9eX-WZYtWAUK4++$7G#lwu~3^T_5%`!9yOejpf$ zW0gS)D}}>E$Qd;GeLkzl?WUY>9rZJ*%(CgeG&b$w_dDMge9!v6=X;T~&)>(URY_yg zAEcGbaHpqaea+nK9O3Ne`N6~bzxcKXrv!V48--WPQ{=(mq8-4L`V~C(Gsz|79_Ab~ zl3&D=hEj$@rpKmg)?U`e_EGkg3DYD0qWB$s(tuhmQz}fORxuTRL^%8#;9|n&HO9!aHIA13p z?{#>Zqo=Hm{_CP=m1mK+w|A(ok*~YIntxkhYG7?>Lg;6yoYY@wqs)ztiw;0W&J8bc zKjalD!a$@`LFxp1lQjzEgtvNGpMM5Q zR?xTC$G9Z^2y>hHPRisWxI}MaMwu5Yki9}(q;89>j6}q5V$Wd1;5y$p-zE1tcR6Rw zQ6(!oGb7`0Mha?^&FMYTtE30h64T$MElY2e{w3qD4Bqi1>yhhE*J;#$%L9D_UBpV_ zFQ~;XtGm>haMTQq`!&vrMA&d@6g7sO%}y0o3%iV0jH)Hsnv~EqVQQ>GU> zQ>a*K@6@HKw^L81`cnI(Zcgo9Xleb|VY5SzDvEQW`1&>8o^0JTBG`l?Y7;b`Q=&?`8=3gO5T-LbJqv zV(V~)@Mz4%%E*j7P;IV$h~A2}hKp`CX5ok7pRwr7Iv439^B4x7b1~r`!(GEarYELk zOCw7?>mX|j+gRHV_MTAwzS&pW|Fs{oeYTZ_RzJr4xB0v=(xZV15`Yxt1rm>cFmY_8eYG4uj4ZM}>6K*H8Pn?suF!5qyIH649 z2K#;cVf1eO%qz?}hEm2&!X+WZ8o0+)Ce;S~)3b3m;(8#DKN4iY93`y0iQJ7G46h3h z3AG7z4b%)A@h$Yt^>+1&=pUYW{_=eE9P(Jb-#r(-i@cKWrtf87PoS2_i0RTLX`M1! zF+>B}Z1}E2c{bGP2YE%iNNA-?7f2xNf_e zc+K8>=+$o zXre8-Ve-I~RVhOXZ739%T0J#dsA_8SLbD6$QW~cGmh^YhVdy^}Z3cU~#b!k%Xu6{h z=>LLd{wqC&u0;GqRECSM3w#Ch;K)3w9o7s=0p*=^TWSz45pE`y7XJ{{RC=3)mqMGu{N_7z)iWs^xSmb;4;(~MhH#W z(QGzZlG=w{Ml)#KU*H?+q5Y;Ek6el{m_eTLpYnh9y!329t$Nk5&rv>0pLGpq#-j8A z=@-&grOim|koF>NciPVMk?HR<_GkQ(RV2&g{O)M#wz_%WcW;+q#o)*Ah43Frd&M1n z8Epc0>>Omg-|OD!YSMM-Ufd9_n7+Dxp>c~`E?b@IK+)ie<;EFsKi14$4T_0R^{Dma z>hg*3-{DdCWS5}sGx+_!9Pc}C9n>Z#JPSOF(Mu|xdmh5~#=F@+-2W%emuuoWF(f^d zYAI&rh_+noj(5EjvSazr_DVoyRo9atNsG_g$vVm#zxj4+rVwH092XH@ET4)e^Wv!t2_-q z3hxVU3%>T<@(uR1^;CA5T;-v=j?ZkJSs^1QeOh`8{J&XxN=8O{In2nWWi`#xIUhT| zqkbvj^?M%rH~U|O_J^3rH>rV|q>hdK5_<%9avz){#qn$h86UG=*epCZem1VM?6SCQ z@pdJ_ns_nkV^UGn9(D10XTSUe>XqBAr))FD(oWDJc8 zwG0&#qoG=1V|YF4u%dEq^? z!2tA;%qEY4;n@uCoxkBk3S*Vfn8<|4k76BhFnZk2-pAhM?g{Qem_<&?>XPNoxRsHX zelERddinHv=}h|c^p@#d#=G=_ng3?Y^T_O`59=S8hj- zN6UahwFTbAh)&em>15i&%IpGRgP<4$V@P3l!n&#DpD~4yh%I7e}*h*AeY7m%U>);4InNJJCOgCN4P%F#jA;2(A(PdJgBObU#ZS;1}Po(k#0QNulhfZ2l1TpBmx9kbhPu)M(+bQ1*9hl@-rOvXVahRU$YW$$!B{~zy!GedCL0_b5lvE(6*24$=R$$3 z?l0_FL18R$!wLmIcq>xDW}ho>dtbF z^EU7bfzNoh4~OnZJEef~ROtoIGm{t2eGCWnY;p>j%j7ZDg?d6sV>RPDv&Y;TGwflQ z8KfjNPU@08D>*r(Rm!B411U38PNd||%GM>{Po9!=JSh!7gLgL0KE-mt^1)cpB~tp*=XgXTn)< zB{T_h*Fl)YZjq)*rDQ@D)PV9!w086b+?t~?)8gUb-KpECD?}wwE14CH3-wQezL-A8 zz#G??_M6_C1LkKIw`GO(kd?BPu~oHov3<4bY$RqMhs;mSA28cHhM8G?zB|7JTJ1`5 z57`L`4JWcsQ{W{n0$-9A5hDe{vREltI5^2Sz$d!jxX(gMeVcVGYe;5Y+>_NauA`@! zhT3m$`q=a~8TO3XnQb!bI0(mJS1s2E&k4^we;q_Z~q;ep<|-e>+p z{>7moq1Dnj>7#N>=^JYoD*(^!RwRi@k|#Sby_hNd5`KbVnW3V&wRwy6s&$Y3iT!7& z4NH13M~!7oP4y%7y}0>Y zXL=Idj2J+4hkt56{G;XI4t@u%;EZ}&y&+$cjgf+p)6gStiATiRVjnRKoelXNC z+&6wORyVgW54X&*bhD1NreQ`YTCKLp)-BehmP3}h=I-Xz#-peK59w?3zwir~?aX3w zD>(>$-MUEQB;{vfFnjmO4*7HVMfgMTevm{zxy=yp=^=l)sMvI;ogI6SUfE-UWI$^Op%(jg+0EaislC?%C);0kX9^Wg@FwfSyI z2KRe$wi;^?$_V=mw+-)1G1CsqZA-kZf=zF)Yrks`Ly2vY@X;v*}6j$4mwpbRH-QhvC_lG+7&<^id?qBi+XwOb&hvu14*@ z$v@d2@Bikz?AzqK;@jY3@z)ppEBsFay8;bDrjRT?7C%Ynq;&W*4AA;VgOeYZ>&!WU zBv?P>RD58yH>I1>-PoRN70fVR3ZI3#hUSJg@F8hNz3E3&CsTr{vT3vNgzozwjU2g3J9fxXTCO3*0KLl#YeA!vp2^AMh^q?s3m` z%gz_hEsk-HWm)~RUS{skT#(s0^I+!0%m(=U>tdd|**V4}way7b1~U(+(ga>p1l7SjKu@5)W)R-%`DLZlOR zfb>>udJ2V8Y?xFz3>q9l$uGs!#{_Qh-<~}nAiL!wh?{eQ!y=kGh87e zL@vnN<;iMawLd&eW5DY;4km^kYhkA0S$t2tCQ8ty=&o!Zb_n#m&icXnL}NwccGFqY zBeToA*>VZhNil02re?b^0ZubhmMfSuR4{fj*3$RV`#1x9JhPdD(vtlNj z^*Ph(aAi$)wsY2U3+}eK_YeCQ`dfy|h3rx`a2;;BU{umdA`#pjewaVuwLJrG-x1~# z)1RNj-`A(>({SgVF~2kC>m?m*Gf)xMu>WkIVo$WUvoE$?vHfLzZtY`PjUG)leKat} z{g{bV;yQEl>A&f#_$(aIxH-7eYr}syJvu$=Q8Jayk!6^XO$omZT?>s3b`ACn{1{m8 zALlO(a8tgIuD`#QpAV$@`CxjWC#piHcuTx2ZIPbI$7Qn?QD?=5#_}-Jng_RU4BpYc z#IM9&%ocAjcbGlgQLc&50lu7l`qhR5hWe~- zJegl;l^zd$=sB1OIdLF?!JAtUnZMJnSCtzU5uzts006d<~rrU6D3Q*YU1o z!KaameCI&ikq2};bT6p?sCVpV_9Xmi-Hg8(ubJPNGpq${moS5`nbV( zA!_Gn{b+aalxAQCd=-0Mc=!Z*VLB%jNn>QLAny>O!cN0^gT++ERL$Jk95E+a zdg1&YY*`AgMs-VPXoPi4157v2M}`Eu{v8+P=AwTNksMVupMnT}W_#qg8-V8i13aof zL`p_FicQ471FHhneaSwXM{&1vm2;&#E;>GE9nWfzC1k~CJr6LICk>wri-luCG45w> zHGP!+2)|S!vexb4r(KP^J^;OSI<(`an1{B){A;7QSga6A3eiC^P%V%UIP2etuWr2m zssA7U;J{CTPQj|d73g+MVM%-ot>L|VLuNHa?Trl!*WrsUg?!Q+m&~SF z<|UiOj>bKIU&w$S7}0MuoHgi-rHrZ2z26#Qm|V6q*!6YvyZCGTf2@Z+M?azalHa>THXB3}YfiA%vN~;oJ^$?PowyX((h5m6k_IQ`C00!unz$wL_k47+;U{1D}#4LMDw&%)vV5x zN6S?rsgb%;F=SDWXXbP3xWU3yfie^`3^mR-PBU#aH8Kw{A2t7H{@0vko@Cx> zerd`!y*1_<7Z?s1z6tR-w|V|J^O&hZwW4N%Qo9qplf%etABgRb9Z+|w7b8a_0r9ig zBiJNJ`CYzv?`KaZcNw?jyo)a8ildQ(bp*05WW_n|W{r2$cC>VI&T06(3C|<Y>L7K! zE^a>}JWTGa*n(I|t)!;Ok{lP2rN;1D+z$N{+8mr7yoAYbwSYcQF!04+Ghhf@4{QnS z3(g9D4P6NJ57!G9j$})W;*k@zT(udt@XUkX{4P9R45(g>kTK~)_9c7KgXl_ZJ@yIo zkBUN5p_P81-fpO2_|tIGaK!M;Fx0Tza1D3SX}Dk8@uT<+>{)gTeSscC&LVRPT6Nga6QXZ%NfqDAV5B=eNE_`!5^7a+ZS*oc=|7+b zbwu7rL}=Y@q#AI&eg)#_Tet&sg^=`I`V_ew;S{$#UG1%wiE>dY+aEI`u~jp!MBE=p z>+Az7`5pP1)aV$kAye@Hx<_AlDvud%8O|D?8Yh_6np`H%Y&O?1yG$nYV9cuL8IKrS zz&m&rb>e$2jz7Hf=oz%|?Da9(!KcXoEpbhdWBbMA4jbMX}<}gP}bPQ zSPp&J2ZUW~Lr-ghnVDoS4dr!yLi2=K3F-FKgwpo@b^~U`hb-SMIi~7nyRo%V5=!d# zaL>3J%&*K@@)cPfTJ&|K-F`zhv|c_DJyt(9Q5&QAl{Dpuyj4Dp&z_8Uq}@2Hmq^2; z>(XCRn@DN+EVCnxl|ss1b)MQdS}e+C2V&Xa)A4a?UL|lUI)nZ_hWvw^Oi!kJvjbTh zUzFb={3G}Qe26n9;pz4oe=$ukEi(OM8V*0PY%FG~XzXcZ3^ffag^R+!oSQqy{Ks^n zCQ(nYAEg5FrQ)*nAp3C23gX|jm99^I6g`UA%a2U>zT+qz^MxL@4vTL=~DrytCn!H3BFC~Oy zVkq<+m5Cf&9UP8{S*75FV9TH*crkb+G$V9gTq5S7f1V!c7%8S`a!7rorbn+wL&$8J zK)0<4_Hzehy1Nq{i6*!&Nrq*%v3ppFi{}X;QMf036>91`;(sIciTc|5HSj{5=il+m zxnrD#t;KfD|2dH}@H}+Tr5A`57>{JC8ywIM(H_yW%0;Deq(bD8cwO8KKlX08FMQq? z-g%xuo?-5v+yK$GwVCPhw2 zXuYTr+qgp5OXI`*Py=^Jr&9_RBx6L7@=>?Z+f3l5aZ#QW+Ufi0`x+)0elWH&o;1EN z28?FYcOz+<1+UCagU4_PcT#O(fG~yI#m!)LGi@;g3hD%66v+KA!Bi`Q4Eprw;^JEFp6-%SrQhbBejGxt3{|Dc)G!xDa~&eLlj!#eH>|{!Y)s zysrkHnNP@q&%`FnGSH;l*i7~UyZXHFJvBw<<0I<+bMTnF4gCv8Y55QhPeC&L#xp`a zLgg@JNP_0sR4OX%iOh@CLS`tUzQa8Ddh{KrK$*yhipc6}*zpq9g>)})W-X`J(I#a0 zdT@Vmz4`Hc0`fRZg?++l;W?(;CxjHCq0p6|$~WW&avzv%rWW0m?nzE0TY~wghWS>nr>W zTA8Mp<{6F|RtRT>ahO{*gvV7Ot<+K7ZQU?1uWEx$Q9id?ZVRw=*G5-IjT)`pQ!Xpl z8zE#zdV^jV#C^%%U&rpZ~9SFKVo79BQ0v>|>l}j2aS+jST$^Rp4)U z#fSLnTsy8CGm>dab*J)lCL*5#V2djfw+KmZC8|Wnt0UEdvKl!a-Wi^cK5KbkY~Ype ztnW8(Gj9h^8P8I8U$@=ua;dI|uIg@``vEc|7d%Tmn)iWs9{Qmc!PH=5Fuq#4mJTdLFxuoyD)`>*>4cj~bpBo*Ki@dv2Q&F$MX_ zJldROZf@RcdVu_eVmx4YZD_0?q2JEmQ_mj8Dp}ILbJ7^a-K?Io&I%}s` z*H~MvwKho^rM!wfh>Vu{NiD-Q!heXJ#gBNtH;1PDZ>Hc4JqXPf`-q*xRl~!j=F)}8 zCft|B6j6Pv-iiJbJqkL+UJ#u3fOEDRdhwswZaRP*K+?28&tw)c7uehES?&%ukzb4y z6A4ALzQ7A5gkAhaK8wrazOx#;fjP=BbSmA1{Do|Ydt5-a@iKUI-LO-~6Lm%xsk78- zaw%C0JHr{F|3U?V&Ojf3BY&Rv)Bn$zJevD}d%AnFyS00VdyKn~$LAJ3H$AE7BRBeg z^LGpW5bPvY5a&w+B!~P^9v{E-7;<`cUpKN?1Apu z$u!k;(d;n4fj@A+^#c@@lyVY}fpRMsd`eLkaqxnfk|qQ&`IH<>R>&t{&5wX@DHK37a)< zfHU_im{SfgbVkQU#nX5OszNK- zPV6O|luR+mUPquw{*AhoHB>f~H+DA0nJSo;n$9D69e@k=t*HhotFgxY#v$nQ6Y%{l zM+WdAE3zMu9lA?8$W8ef1<<$(gD@1p?v8gzPN!+#G&?fnGvu*yp$H#|g)_s2p-C-( z53`D>7mJH|p=FH)YYNN%Qg(;2M9#tTV;TTdG{LbJ>@l`j?brhJKs` zZ(Y2(miY)~^{LQ(`U|UY-|yijFx!|u$PqPyCR!36OgpybrGjVkGd3`8z|S}#YKp#8 z@2k%+Q#Szeyg{BT50u-=6XibgbNQS+R_UU2RI97QFk?F&-3Xn8flq#WP9HG)ih%Io z2Xo>Yc2O-N7m)SnhV*mhJ^YvLxJAfqt`YVK`58_hzWyqP_J#_E)`oYOp*7I=)^`^s z3FY`!{6+RX%V7>&mimcGBq|Y^*gmltbj-S7Z@hrlW|THsOH?dMn)FtBE#48cgU(>T zK+Ay6@Ad^y3zqN}^d9mo^yGW|58&4#Ue%L{Jgww==4%xw8Tb;s6g(!b5Kkcg`2{|M zAG9QGb!;B=VmW6#=t^I~hN(?7AjVQNsoBh0rWdl4Iq>!k(9hN9XUzs0ml`ARp4B!D zMPj5U&TI``L@Q%)Lq~%{ubRnPg$~IWsZ$ ziPtjKL(x^y-@w(ZgUqA>TMWN}aIqV{vQ|WM;uY$WTJ(?f2xcNP5}vc_&?C=tk2r-B z_y9-oJGgUP{`pY|wRVtZn7Pzu>K&K^x!6paSAdVtz<#;&*wHW-nocYDX;T%OLPesI z4P{T;P|eUq4hzxnqI;ihHp0;d7}1#qJi|_+29#* zsR);s~d<%6!$l+H}>_8F&9DJWDl%zQPc088?O5%uJ@%QX`0Y zM1N2(`+@W}4lMV*U?;?7XUA4V7eqU0&9qT)1;`<+qrJeUtCXmGDemQ}!rJ z)zRuQZJc%qln)yiyc@tqt&Y8KnPAB60VivauD>psOd+pPH>p-kN9F{3nRRg*=R?lp zJo5TYFr!(j->YAVIb<9CZ~7a;cfrpag*TkaO=GvQ>2w^ENL8bX6152(zW+xct9t9*{;}uSm|6u|&mz#i?qdh8pOi=+ z<{CHH=j;G}B7ax-CIs|?;XgyzFxqz~`0I7p?4)fp+ z;hNz}VRN`Md=FRg=V4H*+D58GhRCgvmE52d(-`ekbO*9Gt+I_^9zF&ibP+f%wQ%3O zgrBD~$PUM-OVlUYPrqS2%vQ|*i*a?iq1+s97&nhg<$mOrvxnK!%yVWFeTHs?JNy*! zfKUo@IxBb%7HH<#Ib`m~*jLOvE8x~cLDJg|Q%GZY^A%A4vj^@O%vdmg=tdYjE&211hsJK0ZS zk4i6O_$X{}I8K}*np5qlTl7;pg{{E0I^SyWuHQyF=HZDP@S8&eVz%%ocFi@Dy z@8qYTAE?20V9#Kl5C>mMDp8fNVSX9{NAN1BtqY*lb%?e`k5gDplsWkaDOnl;4eeX- zc5p59kNNP5T)=%<%}4pd$YsU(UU++g2a<;~+mAc4crX%J6B_nE&leYQO0?pVOKYsw z8*`z20%jWe;lijn+oARx0PjFoFc}IXxqhB|$R!F@h5E?l6*4pcqvVr;gXhm=tYdtL zXT7drkYRv+nZAWET8MDT{8-fKcj$CFLYgRnD2?v{d&j|LDv3QE4Rf01jERkn-O~Qm z8mP6@4Eeo$Gjb~O9+{%b&?Rr<{N5g(6FwW>95%wQei-xW*^z;frSb^mQ}-#Unoiq{ zTCf6W-%s&A&H$;r97wrO!L{qJ>!*85d?d=_Tve|v? z6}BkO>>lW8I?w}Yjw(d0C3X`Y>_jRAc4hUrALH^_TxGz_Pm01|rIKp0%*u_yhFLC- z6Djn%7Xupu2jMe*?>p{m?#w0|eTNG0xaotb zA?PIY&8N*X%_rbU9|&FQvFR#$pM!>vhTi%W`ft1-{KyUdUrn-^x`KE0KjI z&aVYWfFt)69J-mvKedati+0x9X=~IaDy!zAIyt4BLI3Db-YPxRma0w@RfqOk)6j3! zfPS_H^%;kadRsvOtqEe$OJvl4C;lKpWQ6QX52cSV=b0DmH}*02nOn#2U2a2U>GO`tK|QqQa7mBC7P`6qdFq(|hobQt87dPpG%__eUKS{fr2 zj^s({;8(nZUKv%sC{47o+9Av$Du7o1FZi83v3XVk8FvZp8v*-YrlOC(Lp~s#RDk+G zXVROXcc=Kp)()NutqL_pCy@tog#)vMFzWY|m=Nm*-q#M~*BoG4m(AY^Ob#T6zGff9UUQtaiOnFd^ubFsMgg+Zc85(mDV{yFfi<@1?p_$~ga z{$KqhSRn6^`}72#2J`)2=b^C-inNbZS4t=)G`m(lRxH*8x>sNL8K+{G;3Cj(=YXr# zhZ;xOnaa!__8Obb!A=bQEJrA=->$!jbW5s%H&ioxz%qv+`X%~f!ZYC_I5Mlbf4Ev~ zC-yA;h&JQd?nVqGmVilm0!;D`*zS|h%kBXZ{WWMEt+X0i9!`u*Xb5p~dZbIFW+Vge z>q%)9DyEH6p7dFo5$P4FBAaB3BFiOITJ5DZ)lNpYq0iB0?*fzi2h@U>KwoVN2Hj=s zAuU7{C3=&C$O*_R^ruJCNlaPhFXkU47c@peX5=pBVm+7<%u)I}eV2Mi?I+KXUGX)( zgP){2c%FY^!d zH}Kp1HKF;9!LuInKk%P{AL3$gLogdzxQXE&;i3^L5{o)f~A$g=CUo(8*hN$;|-BXSmB-T0UpXf*oB;!XUqE=Jz*!1(aVC8S24ab%yGNzB*eQsWp$*iq-?ut2gE&U{Apr+dunjKmf z922}9*oicY0Z;P{{}<>YDPXN^2V13Y@W)`EQ2o$)ak7{L2f@0?%t(98fy-$rTA`RV zRt#Cb3Lt3avkdbIy2XgLoO%|;ErEx3b;=#lI160Rr@Ro?UbK)r*^`=#CAb{vs<_$T+n~fuYUv+HMw8dp=>**A7i6S(#PNnD1tsCe^cAv*tv2GyDUCHM-Rk4$M~qM z)kV!c3qNy*bXS@RE<%0LCe}pnGCbHQ_y$~$g<$JV#H`^UJPj#9HSi?(&;K%?U!bkj zkcvp>BKsr#m9BWUi)(C*j$yc(9R};vgWWtIz==GMXJi_=mQ1E=(QBC#%m+5c`Z+WI z1Z;{i!bag0JYcF&SpP{Vpr0e`6&yS*Sim9^a5ug|o@6q;6m^x3>O~ADj$?ab6#F;x zIjLK5CKkw%vS-Ie$BIPxXomV!eGQMAEPn#+uaf*6T+222eR5z3_>2CB&)Q-(kQ^3#2z@FsJU@2X}j<`gSQ2S!T=u%<>v5wqLPNEi46`@s~ z1Sc;ZJjoR12PT{5m_2y!jC2b96V--lO12=4go!wX?HZLa%Uc72>lbVmNd?EY8)nsO zwTapX%qQ#0R{0F_v|YmG!bQb!C6|rWV*XgrSi|@gmC7u`KZft<>jlhNX`!<4mWy%o*xjrEeQiFq zg>n-yqMfdX?i9927Q5s{{hr zRIOlC(N0A7M;FKD#O7m1Kt4P74Oj)mu`7H!_(UH-pRJ3{+^dKk#0z}Qd6bzJkj0MR zPCUilV;iG3*#=MIzxW=GVy@jEI@{~I=lr;_!^ zQ(%)818-$8yPTbj`9fEIHXr3n34?HcuK?q1Dtd;pLOWqQe06WY?fHV4$T{W-GZeW? znIx!D#AG6W<5t!9s_`qa5iE$={y=O?^Wq)d5S<$xptaJvtM$|=N-yP+{EyrTvv^+i zMUZTYl#(fsI)}&x_(&e%o;m?<-bL-8_BHxES_E|3(b$Ll00jB6*n2P+J3F3(mM-WL zbXB2Y)*^o!3NN%G6UxW z4+4J$Jb{~mw!zXtH~jUt!I60b4{3^|lU7EiN6Lb+ny!9SFTxxCH#p>5z)fEd%J*{Y zS(pS*TzfDEIJzRek9ou-!2jNhU&xO@-mIB^ygoy3fg63I;SXd#I)gWwt1oL9qu;DQ zidpM<{yo2uJI!?hGc8CLga){f3KAMIP&ZWf3VX>qVJFQuXatL~v9SYqhd+Yz)d7sw zwb2<-BI-k$a;-LB`yGklsUV|X(wamoM!!U#L=VKa#5RDTz6Z6;BkT~O!6@%kpj(0b z9m1i4IR)zyEs1f^xz|&NscrNr%*!@1`L*aR_A6VItIxHDGS!g#m5Z`gZYH~teaL)g z(rB4}h@Zzoa8!~|JFdXClT75_%0ZtSh^)yL{P*61DO(&lxCP4ZNpZC>XpN+#K8mCesc4S~!#!JQvy;S|W}XSA)TFM>;E&mJ7*8&>y$gI%r(X z7<&u;^*^|a=f!P^>jY}FLHC31Jn^3Ri5gBFrk~Re#>7VORX^jhx$)=^zCiIY2z7;m z=ov2a-}t)Ffac)Y-w4fZHong$^e=P<86Zaz;|T=Y3U&am{8HTMxC+?Wa}<8pCg9D9 z(Ra~1+5zofyr=2P4W$+|*30rHdA!^~?gy61Y|Ip%$tUDrFtaJ3W-0G+cfNwY;)#BU zCZpc&joo|)v4KwmN2vway(>WfzlQqtoz9_qiJJ2Wd7bP{jm2~(LRF{pslLDA6z@!j zadwQO=2KU}Jbeo<|83n9-C{60^Ennrp>-wYSujH#o%0$ykE=$LqZ`%fDzA9u?UAXG zcHm8w3TKPu;aeDpEbTLVzT<*F2RjB!1pf#&4&KD)-W9o~;$jXol7ivx(vP?!cSag2 z6_hOXy?QwMcQk)z$}sE#=!ndFEs)&Jm`{Eo6k;_PfkjYPEQPLfkMnac`E33$Jd15H z6FG(YX<9~BH9~Fw794fs>oIClXhD(M{~4kI5+ixl|PRC8~X>O z^kZNg-OIg`8_84hs)ETq9xUq

FMJ#xE(bgUzaZx!1s?{V;SA4&zpG}5LE>UvXr|aj z920I6UWYtcTI3F9s*RN(&h5XU@eDsdhbIRxUZp9fGW$bKK zt`qko-c!_F!Pmp6IX%rF$LK}^i{eeHGpyw z5n?L54lMS6>;|v61@=|Aw($md3DI)Ye@-90>ZMoq*f z+n2eIbAP}F-KDWa!<)L!vB8-kL&3;7lHV6H1fV1(Xp<9;WJMcj+fnUfS=CZ(=Ok!)ZMVa~tuq4yB z$qzWUXAuP07Hi@8NWng<1K5O@znjL9{U!SlcE2x+PK&Mr$Md4PM>VJl2!&HIO(+ki zF^6+JRhgpn#T)!snV}9=>%#k;fSc4B)5XeSpJh92&zuGA_6&AjIpUmg7HIQT3;tNJ zKI*~p&`&jjf?Mk(S&XU2gEh4mnWrK+6Q(d*m_zJS_Bi*JTgV@SYq&F#**Aqp=y4ti8fc<7Kw{}EEQj89 z1AdOD=szzo@0dmO9=ajEI|mUZ79+b`3L8cqU?^RBaQCd8=aBeYdH)@J4ipyd% zW7*LF6sMKZ-;gUD9PNr}@9bzs^fmg(?lCUA!2dQKT}1}uUu@)fmG?X^g85sK_+s&` zum@qZZi;T%|N5F;VgXCp$0GPZCSTlRE=dB+0HNM7YG!^>-D`Nv$4F1D( z)OH^2B_{vK@vB|bkn$4gtGP=4e0>RW_}9U0ErI#Tadm?_03NFv@D-N;$F&^1;El04 zWDs@~EYDk>cLw{h-r${dW4D~AU>GyX&${izL82+y5$U|=WCG5_##Be@M`S(f7K1r!MHB4x4?Q$=-I zbWyY-bmK4ZMX%4>mDjpJuL99{W5I3U5tb)gk=v>3RDiZYlmD45gv@P-D-0#=Ca=Tn zpfPHY=E68Qcbf?3_|JSPcr=DXGh7Hy?_79E`q2~V(o`MlGvOhYgKbd<-lqH=3J2lY zn2H(K0Bl4Wf;w&m>XLV{8%QtJjCs+!oW~P>9Ow1(=-Fry@F6#XIa>{zpF^k-p1^-_ z0~-zR!$bBNd&pu1ath?{8>p>otZPYhAzG5%$*R=PP^2tKYu=)(<9uEV&Gjz4jgO&c z?_sVmt(ig04f;LJ(Z%QrR6}q@tC3+{9B~jC)uzY{Ji>X>0$URE-=mtSRgqSOK3q!^ zl~2kAyf5;7VaJXF|3Mj#E0TR@flb`Y}g}C3HJ&oN;zQ%{JQzxuXsh2 zn}a`jK-;Yq#vQaD`HVW?AwS0csQ=^W9KhsAw=mpQUDfXCL2Pqk+qRuevau(&J@Jig z+qP|+n`GElRo}Ps%#-Ba-E1;b^Vj*$`Ob%~!f@dSZvS1udM?Ue;C&U+=jWZv#pmtB zpJA2hhRMS2x(R#UPUczW(&jGaw*ccxyPXf3Dx4JEZG{_gf|@mvl|M zDfTCaG>Xi-@Uxn#3{_e)7uO0D3bgQ-@lQv;{?2;_M6e?JvTvTRo^zgGcn@U4D{i#6 zC0Qdcy<5OY`uQ9C8^L3$O?G8CX|1Q)PMu1Y+j{tbN6DW#Ph#RxGG3OUM{Ea16OhfQ ztm1VKbYFB{omKBbs~5gc`sl{%-pR>qP0Px4@ZhZhZkvT(?1SdBCLX?gK@w>%lE>4M zo$YVmE8imTSZ_T~QBNk=p=Nmfxtt+K4@c#{bz}fO{}t?!C>Ubw!|jbxMV+#bbF_2R z#dEP5nu>1jdhQ+ENG6}(JJ&zapP4!M4ByA@yh8>dO4!5hy{gngx+K4n3+U_UhZ>d| zmK)C+m%`QPWnRoqq%^GD9hOs;@0P2UWXpQXElXX?5X&WMb`(#)0vhNV>|kRJwTPWc zqrZtxbvnGrs_gxOf={>>&Uz#ld7(Oy+?ZL)4N^kW;bk5l7#b)ThzO+kpHZ)G`Gvp_ ze*^qqPX;yy8U{-TRrnDPIoqd5F+CRA6S_bG&|~s_e!wwwGfygHO}M~YU$Xz&h@Pb$ zz3Y9$PeZJ+p0S&8qH%z64*#o{(PfAMH(O@7tN*EYlPltrBXw_>-#3t_S)UZz&+wE7 zg$9Ql^s3`Yb2J44{#|&(cZT;;*c0K&3}3N0I^`kovftscGRD!|QJ0-q_{UgBOUDPi zc80^*DCdzQHP`eKq3!B=QHkxiTFIdeEQ#SKc^k>sedrdOjf=*zaa}B!;%enuj=~n4F zfNy7!3NW+36=w@`gi4xn8iH%o3*Yt;Y&CH<@|;H|M70^h0ijJ`DO~p`#R?s=SQAt6TF&!+b`Nr*yq7ooMZpW zxvuTV=y>7S?^uDC%@lm~|HoeQmgfL`0lhDt9?Z&pzg}6XlqL`NK1rk9$p`y|KgvJy zDEYkZ6}Vb9LpHKm(wnNn6Nog=0S5_~^I57|`q2T7w-je?|Ae1@Pxy=%Oy5inV_K6Q zpFItIVE7F_CSR8);>S^otTHS8>}Sn;%~kTg&(SwOgr}fU63Do%9J~`a6zGdzYf*L$ z*#ZJRc*ekJaP1F)D}lb@zDe;1U!(g!sqR#FlP9)|?6!kw9M6yie;ME6i|~#PF|W+m zZO}E-_hg>27{>8lzBV`vQN|+1?DVD@w716%PYu-!o$!J_seeX){*7+&vGi5iLgq{- zv8Nc$ky=9%c2V;6u8?2Xg&RfZclfS(_j=cGgD=L1c8_a@D*kf#%yOGadir5@*Yw{dy`2J z_UwoOhpeaTsq4fH(3E{g2Drv&xNC~woi!Xxb)M<8X(%VX0O$RP@jYEtMPpOE33}uC z-ksW53%+HHlvjEMF1kY4Ahgl6(_|(uEQy53CnQWg3|wGle@bG8(LcrauTS)S_3rn^ zd#6yrC-ClV_D=RDp|$x39M(?nvfV$&9~WpJXwBKKPnKDIaNDLNx3wkdtpoep7WmOt zBpJ&pWtMJAucRKFmv^#5E}?6LqH-Kx$z;^d9dyaEfnEE2`HA!&oBC{0cCwh#ig`r4 zCa5_bx)2&p-;|rYv`2v(fvLPtRoL|#@uW$FtC|S!-0J#)OMXG;75coc=sxpvQ|54_ z*c-rI+~OGFC`?`dFkLm_nkq_n!mh1dFiT`gk*D?<`?JylPeltEd z2*$U1t>K<7Nw;6VMcrN{wPo*DSS%|V;itOrgLA8?WRA*eO`h9|;4C%-K@x6O!S3l4 z=t7QA__^-ISKo}@W&vrTMbYj3R$eO?cqg`T_EwWCyMlzam1I#ahj$q-Et7`JQ{;y5 z(+u!(_QDM;YN%&eK>vEf@D0aSHxuSN*aWK#Ci1(6vBx~3yRUnQ=f)lBgS4B>`k~@D zF&|u`2jn3RCL7eINXiMc!Ts^6EDrxV!kg$ZvAHh5=6aB;hU<-UpK}EJ%1TZnDo>5G zJw7}8;XoGypM3)_>41B#dnee#1@9Jbs_(6@B7H#^%k;x@?FEkUkj$`>?6BvO>2^>0 zE_vj%Ak_u*c6|mg;xEj@GmQ_>tfV#7!JWOEDYL1O>9x^d8pI6rif5eFP}@+0_qaYc ze>wWuG}P^Hcr6^jpLeWgyrw~@PAD(Ac`;mT>8W951DOIN_*$NFhqU#Tp!0r(GG`~# z#CkS)=e&h{0x0YNUsiNc*TB$b;o;B)ue!QQ5v3A-rRDJUDXl4_DIydQvXW#=Pz#P+ zPqdSzcqzS{UtT0{0qOI}F}gyqGfV3HazyQv)C$86~CVo2xBM6PrNGSP?Q&w7`Bt4=UB_!VEZ9f3KZ zf(js=R4YqyI;+-l53cIB0F4xDur`h;oV8KX!c97vX0IBB~neN=IJIzeZ~ zb^bQ>Z=n7y9Ha{1tRoDI4B^>!m|?M@4FCTD^H){!rsm-9dq}=3pOhX-+c?`}NF}aF zx_B};?s_u!8o)IV20VXxFLS{dhM-H1WB0MlJ-yg09!YRa#u|5!gOrL>MWpE|AqH!VH^F&&828}Q?$hTo6o3O+3B6=l zxuu+4Dk}v=D?6z7!VWU-rgAs*Ccn5diLHG|c#jW^2;7Ck6YID7527h->njc-67Z(? zC3=g)3mpRI_z^gG3x7d>3VD9J12Y4of^ES7D=1Yt+r>iJLb)_)HPM2R?$RYZ5uZ>8 zH)!iiEvXKFq}FmTrpj}m^+_Za_^E22=(N_$8Q@vYLf7>eAD961oI%Vi1~nGp9U8uU z>Irou{LTub(F-67kJv^Zz>9UGXQ5{|to|o(0kXL?u7%D)R1U54kK?-IExn+RJ!CCs zX815m$bl-w{z-Mkuw%>V6}^ppC4GzONq%yInvmytRz0c~=AB%{>>kcuY{N{uhI4sC z_fGc=%<_`qqhSv7djb5|H?s5lZHh6Q%q7i=DWCZo+NPdhZ0|s?N*UY1L7H!vtKXqt zO4l_{-YAcf=15&hTdhw*dj)tDWi+KUwZJxe;|H>p+*~#IhosvcDEfn_Mb0rbu|-w^-gIZ>6TJC5vSOxvdSDr_Fd- zUsoTh6P4*orC^ny2v_U1@0sr=zU^Txg$E5{4gB^FyH>awxME>sBsu-gH_o&!hqI%r zyz8!O7uunk?wlS358m(S;(mIwfT=YJln*S#m+dXtc|}77LQ}wu9>NCnoIvM z4|eBssta~%G~^?Z?S>(Xv5K*uaULv<{l;nFKFwfkIGFE;@}Ay>$sy^pF%MT@w_2Hg zJ64iNT>dU32-nFb+#T8xT8VeY|CBk(7E)Dj2Tlbn0grz$I8-Y9;+4K}zV7Txn^VJk z!g^T8`|IZG9O`f8*9Ct1k8zKV3H}po3{FynE8x(#BacLs zBDpnpNJj4ZuJk60c&6*+Go0(Ks2F;Y2`7M&jFAp#?`pr2eHjqa@<^kFA0dC}n);Mo z$5y2;xlt8)_oMwWexKLnwR?Vhv@irpxU;(_x%#_OoUfg8>8l$$i#p5WzuX)Tn`Pj! zTGwaiTK170+!fuG$OEb3&E@UF*Rsq%$^U^flYiRe$2|zRaVKH2l%ahEr@8y6MO3zvAIvlX^EvUMa7Wj!B#FCs-hE5c`rPUPe<@ z<5vZ+l1s`=xZG_6&6#sz{juD2716Es^fdDvbgy#fU{`(8wazu#)sc;SE!Y|DT*o-? znW-Ur@PO#*spTo{&EzfUi}IDD)9oB+7+8#-?IY!ek`69yS4}6)Ci3WClaMS*7Vh_I^i%2a(yPLJUf$TjXf_rmm+}SZY$tY4=k+iRaJo^@_9?opJM7BuF{gY1MYRRhK-)k~?x8KD+2rwm@!en-yui1@H^#S} z{JxjIlfFWJGf34$fBt}(lW{aKlQY*G?qWVQttz2+{{g;pO>;rB4sKmP_Nw`)EBCce zwO!afKLQWT3#YQZ++Xf1kC$8Vb7r}?d>)VYO5Cff;PJm8vDYVBA+h`%|nIvctQ zxn5D*WH9@2+Fs&tu@AW{Bj^PeliPX;{iL2O^uFYr|3pVQgTA^ZnwQ*YBlB^}!#<*m z&@tHAKg20rah35hOYTxflf7COUzMyv+P`;Wc%Q$Q=QdWFB$bz|vjt9;$Ki$H*6BFi zz4c4jBkZUD-hobJtbQRWiB02`CitEBNP&_$YtI0NA0_R{fJ{-;97U!V1Ori_A zgr~!rz{$yX728<7Vbv; z&A_MxaF z)2hh1||s1+FgM=@_=hCY{lYCGKtRr@UL;>Yg2?h@q9dYquf5%S?0*uo;XjO zw~Kd_uQzpjw*NYw3Oc%iCg`tMhgOBYv3DvYmK1xD*1kyEByE#V$(wbjbW`9dR!1N5 z&Y&3D7)Kj-Fr2{9t9hmH>U{_p&*9D^#ADWvu zC9^83SHJ+rfmc>T=U^37&1d16aGZ4O8QKZjMp7NNFoL{W-YZwsRo5M1rxD3}*_0g3 z0s3*U8%J}hTj=dNy?#2lnUi^V;wG5OE^);-BRlxJTU)`*qKC%wA^EW4wms}%?PdyJ>(Qtxc< z5MLi(ANcnpz&V$Yw|-hVtNc=v)l8Z^ntDPTVURdUoXz=IC~cD_lgrc=Z!w#`C=B7- z`s{`pxKAyGgLDxk>s7-P{QoK#I`WK@*=GL>wtWix*dfbwwV9>DQXX)Kykapik5Ev^ ztI4Y=Lhn;eEvt5Cm#{K8JNP~D1mve&;FHS~PnP&i@d{_9C+X42+RkYF4ob&C zof1eS66K%#d{VkWMIR+OwUYENXX+Tg|F_`f%}Xz&hr5#&-irxuKwmHz{0~pPcW_wV z&@cVx{RI9V^3-8#x(-ct6nOU@*D_acS2L!|;;xp|@oBDp%_j^1a_cMTKk0q? ziJV;*s9Hl~Z%+7f+#=V*)tw6auA1=zHM^3bonak)z;}FQGN3K4OkdL$474wr$#Hnf zEyjO(KRlV2?9HOlhxNcG@Q!jCg+vAA4+-JBc$U-2bO?L)ui@us!BfG)ocp!P6eSPZ z&hXie3v~*`YBJ$Y`Big~JwiNMke1rU+9)*G*TT;dEsjf8--x|{SSvOb+YkG>pi zwetFqE}i}i`?FT~?cQTwl2@(-my526v$b5@DgKWhVLJNJ0ilth=IkrVaUbV_)0GWm zvYe4LYEi$_8}AEk2o2Np)s!Sh`8Rr&72+zf82Q1+wCA-s>Gy|8Q|Y`<(H%Y_ zMg5jEo83+&b~cZgBkMBrZvxN%#Q8G8OUb1v1E;G}r~vO?P9;{!6wDP&4^EoRpWR=Y zIkyx0(={jzo%rewaCc%lw{w#Bxi;hBxsx2s$MDc|(ibi#<31Mt*H_P7&neK%ouEDY z{A>Kz0>=Zt+4*H+@7^rbI5ZPp?J=~CZ^f^o6Yh;45A8qr&0S`GpMalxT70z^(w%%| zijQGp&ta@>G=d*LFr*rW8o%SxIlONjM~|)9lhL0%x48&Qgae!@(HPJ%NW! z09V>Vclr_JteiKm_aOS!y6n&d&ky%UGKIguJTh^v+raO?=GoN<9boit4}=>#*0mRGoQ28g0of)z8D+U?d>l^ROJ;qA_o)=JaqMmkGF zrF8TohqX6IDypqr%H8;ud;lB0Zwcm_TIie_v7>Iv-_e4Js~x^7z5U(%)8K+0_HGL& zYoVd71~2ynEZio{I65l$7gvZMVQ%gacXJr&=iLL?BV_aj;J4oNg0%Rq;>Y`tp5zbH z8ji7Qg;4R(znZR^xx!pw2lxC5?IrDT>8i95U&f)Fh`cZb&hcDJ8QL1=7!Htb_LUCY zVK_-YIL)vZR%~0I`&Vw$R{DAPh(D22WfQn(S?Yfm>h@G|nYc?hDLiM+wrbL7T8G+! z0qp~UO|Nba^D&vnRkrIdd7}5JF`t8v=tn|uEE_79m4iwZFvGj>Nd|^Ghcd8Jet=Ks zJYkAZk6b=ctBA*`9$nF?dZZwC`)vMpMQ+TUGf%e`mi8sxLEUxT|G;kA>4xeQIh}60 zyiQJpCsjpiEsfO1YgdW;#C^gA;Rx^EVSJDFf*oyF_9)wV(+=|84r?eKzTdtw>=%}J zr+STWjy8Mddpde*b8}|<%Q5b$Ux>%Rdr?E`$J7#Q_E;0@lwC#W_$-KXHQ!<4p4RQ&*P%#i<^P_rzx0nxu8(ISS(jCh0A!3RMPKFjIZ z-;~po*0d5@3w_y7#xei(<-Tq#|08E)?z*S@q3eM@?ls6!0i**h35)S$zZs2BvLD=*k#HdITiPw)!r&+~}XD4~mJ)J6!sghFCA z@jdfoJUif`Jk9HTG>{w1r`c0RGch*Tb=D2nO@;3;4>jm;U18463;7o;h%xdD={FNt zO=*aBhISoVfz!fW;Wi!-k3%0qPst&ENtXOaa)(j^c1}VB+SYyl13mw`VE*jK`h^-jY<1!``0owln&5{vYtZZh*m^z$5>NvR665*}lMD z?waNnc-npV8Mnlp+7s+SmPj?30TN^x_U$T|*%p0GFu{@BnX}NJj@GZ`v=7t=*gPzP zduL>;-Cv#qM*mcDXf0B1ZFy}2v6DCuZ@`6`m71fWQ=u170*GdSc*i;9usRKX}hh=T6N}KlqfhJso_j6#iSE zG>sg1#sZs@_yQ+j8y8fu%*jLIy4M-_@_g))4;Z^+JVd#*M%1# zP&U90uo3^dIk*mmH!13fa0sy&oYEx-c1nsF}ejXU~*GO*6LsCot)%Y7)P}X>F5HP9u3>{H>m90^_Stx z6xB7+&6c;bYfS+C%rDi~cGgZ57l=oNi$W55s#5SBX0U_#$#d_lw#J?Rof7tFsK=f% zJ2{EbN+6g+(JKvewYu>;gu)jJxVI zI?N~3q_1fIQ&a#3#h_Zj81e-R1slV!n9eTu0of)csNDzHH#UHCBzjXkZ#*|()}8kx zdY*d2Y8+e(%#b;9~&)>7_aF69=HSUAMP^TmkZ(k z>AXpvwPa{FU~d!U_xlq3Fa2-W<3EQ-{YJT~d{^J7sqBgZoV^gAwMPtypS8cy+ur1k zUqt^}MHimKiosu;MSVU`fAX9&{(#-iZf5#E{8JP7$Z`-0qb?8iWCqygGf69DfKSp| zJ4IY5o~KI-Y4kz^O;gP#^kuq`6q=-tRn7E72bFC&9Q*^~RFaPzOmPLMG>w$?aH>++ zx3`Bs_msNbB~+i2_bIeoGhI`endZCjN?0IH6N`d>-NNs?4L4%gAEqifY0KCmJe9+0 z3t1=VqTn|Oy35R7qq+B^!K#)@yCuIiT57_qKVRG;o`rw)L6eGGtU+T9WrmAeL=F4T zc4CJyhn?wlrmeL82>*Cr92>nv*hMp`7M19}BT+<2q^f1~_5t@h%S;oC7T~0BgRir{ zmOot}`Eq)`a-99}99e=5$s%cs^p1`<3m8Cau^W7;#lk6Y=)_P8 zNJ)M;1pWW^-1)f&H-Xg@g_r#dj>-R+ZwGOny9H{|r8EyL4~&A@dmP@jkqzqbpjk-@ zE>p&V0Y)+*98&v++JwxSz+W7&F7xUuc*~uccOLUm3cl`S?X16Z9@H} zS1<+C*WMF9ksS69_3b8SJG0P){&z-bS?Ca0@C$k-A2)S&(BDQ(15=r7Z{S&;8Lq=j z^f-EQMz?Y&cJ?&zl;S)W^hDA9<@F5rbfBv2^_25w@m}@r2HS4oE8vgx2VmTNAlK?4 zo4>pC1ouH99*6FPo^jtiNsye{s5A2(K-A%%5YU-0LT)6JqYQFN8@h#Un2eF;3Y zu*c3|aO0Btmil+#BZH{#znJ!0!YSUztQ^3DyOy@2b`E>2d+dYLuy^mJ8KSvNzZr{9 z%r5v(<>)uwad)f+4;-TW3!2?r>7}$`x*q`=yjL-SZ4YFR`H_9$zoFJ4N9bp0A!oY? zIKxA9j&b5(Zagc_Z`-u7QVC}D1Mt%_(RU1m<#3pL=M`uC2h6S4blHdHc4Rzy`5lv) zcT%)Esgbsu_J80ccZCmvTVoJ1q75tyH>ef7Toc?~^HhdR)dH2Av^LoE{d-xjpez3)!4whVoyWS7R^?+x6K-sLUz`tr5 zK3hY`gKaOg7b=LAMVmIQ_9f?GfwWpG3O;<2t#v+bn{mv;N7zQ)(|zUVPr6;8DE;ZN zqUlFA^Sd&k)1M+Om0qAJ%T7M^KVn~T4R^s4_$m=hHqF5Z)}fnmD*ur{*+h92yv}so z0ycva1p9DcE8X}1*vGGjM}Hx(0cOX`KwZw*Zg^c;nRhlS)2Q3g>Q!|wb)^B@#Q#Fe zG_y2?glsTZ4hUtzjCYDVM4i^4ZGo5jEbT%N)&1I?Xp@()lkcV-%vY9Idj$Ni9J9bq zW-dvH5t?(h7vdjsMZK@4;9-~rJxIe~W4vo71Wq&MiuiYQ^0oBcg6q;4&f;&+E6{ z;4x1Az5!tBBpyrosA~UG1LNhjOkDfqh3tX*u}>-}SA+lelgV?W^pbj45e`kfxQTb~ zqaX;;LJ@XDt?;%Ot4>$9@N6El*TXy{*n*m}8xOa1a57f=7Qz?J@B4!;|01mZL%6D3 zfG_yV`@&lSZM;iK8nfW zW~yE*G~}stCSkqSf3gUo(+)IqDIW*^{us&6VUAsbtYaQtD@&a2IBBNzkoO{owy3r* zJF>mPVIhGmmSXGyM)UXFCZ8`K8GuW}yg2&3t#EW2QoW7AKWu?72JXXgc*;3X4Lk_s z3u@U$Hlfqr6D+4>P>$d)P(jTON^)53%(J(LK8I$JVU$*|;HbL-oI9;JgR}A(4q_oN z$gcDzASwxgH38U?-H8iJ(4M<3u!$ zCt)^w{cf~ZHT*kZ0;I!}YdyQ1irzx(;yP8T>~HD+#7=J_KKZ46d6{5bupqv8HNFIIJ~+^QeQi*E9`RLVD{_+>)R&!P7Id{A zKcMR6i2nsWI}@zIM)L&UkFuP-OX_ZT zt`(WGAA|;Ky7Q+eX~qg81WbkLOS+0D#PjssMoxEiDn)l~J8ge3?M|SxrL^zx?w-ND zoen+OGW1;I!2 zop=7f_>{-<4c&60Cm;DTeZj%6Gq+b}2DY5 z+fz#_3pIocXtsWdZgC&D{6C~AKqw~i2v;#$sTE^RLD zCOVTSP}N~%ie6!dpphe~)0OyW0#mR7>cm+26G-6_&VCW8wse$tAusRVEdKkK>?5+! z!*{>~YjJ38=ms7dDomD2cwtQmP7FQs1)~nV(=?>8`-ve9hbB* zoTUC@9CO1(um}@hM_bJSI8&yOio0uf^&3yO58B>f@H-9%@tokgsQNOnH4*rs36>A0 zXM(JSd(1R;3(teC!DX*;Z&jh{U!*6g7b?rv?P{o_rWshtD@|9p+)wDaD^ib_!Z&_R zPi@6FG?v~w>_eBIp9O7{_8K@=95ay#Jy}>wCxUSI)C|>}f#)HIBEYy?s0)=P+>ej> zY|;jMGXY$nCgk>K^sj~UlFyeGuG&$~cRz14_68N;L{;||0IO=iZ8?j&@*Yg82?*_T z-wZr$N--bX13v;6z%awvhr`t&YD;#_B{gL=5$yZF3dz)x3*ulVge+2VD)$4aGF;q! zV0&8XMh#szU2if2hw2vbzoszTwAXp%3}6sfV5PN3v;Q8~oz~J`o_Qp@iSXCYrbi=&{>6bACzy!qOI_HoeuTH%h||3h)Z`5gLkh^Hj30vI z@AqJUJWEbXue}$Hq$oGg7PyQ?&Q)LZ4wsqN(hC{ExCd%(^Q;Poa)L+9;bsi71)Izk zFh+S1Jj*6&G_FSVgU!R*F*ujq;5y8u8^6kYVFQEhuQXPkP+#g&S+B5*s1qtdRXG)E zs;P#<$`wsrzLzKIF*0*zV%{umf1@N`H4!$%@?WLBWK5JD6I)qos zcb=+;nw?qIvAL>(v%)Mm4Ieq%^?1H#;7gSQ9X_jRD%650dRJ&8wt!LmSgfyYz-c{6 z?M^RsmHOZ`u>EiSe$LeJj342B@Ir8fMs(XL@EoS0aTmGGhtV@W6~4j5C?|~8Ow*hX z-2g5!gzBn|)FsrEFJSJ~L5Fw4F3$~Sb`U;Y3wk>PT>e*_@XNmazN@~2DC6(oK@swG zL34PColONa3D@W$yTPG0(cN6+ot?-&wmO<SlR=kTtfOEXq(7c>I=?xi&~l+ z4Z&p1RL#fGd)}gIq2tuu@bf*37e;F|kfGoYHe_31ISk{3w+9tz1>fOcHdV8N@A)@* z6d6>uEA{27(nKwVd&YjX2Gjqg(EdessmuHH4SvN^dZHF;HPoSzYzmx;q$ViQs!u7UX5!R0fdRNw4bpLkXZ73U!d2tH zKg08_Ae0bJ zo;*B9hW9pZ`ow|wojeo1@TXM~W@r}ueePL#@A{Ezc^b}36ug!=as)ntBXl7%H^Kjr z3NgiBpG@ws=Yi_`<5Rd5)8a!>2S17h@Z*2ud(%14h|ceEU^o>ronqyVzo3l66QL~k zyAxjVAv6ko!2vVkC3cCovlE++pITMhT^dK%{YAuvyw=%xtoD6ko?a;h^vgjbJBw5)b@_zM(FmKk8e$x*qH(UofwaP&%>+ zmX+T)rW}BUc^(93V{j}?wGHriTx^H4!GT!HTwjfTWDvLNa4;hSJl8#F`odh-o|-P2 zHthDZusfT_owtKou`IqCcR>cH;F0%~@4#59$Q;f=OXh)*3YNZ`cR~hj? zbd&L#6`CL1$ZKE_)y7*mGyKGOD)U;lVgK_?LnU_Jv&XZ-vj+F89jolCl_XS8V}~w3jKkfZf39MoTe0b=2JSd zHt06=c)m?kC#&6qU4mD5hP&wha)KQnrw*j2o;T#)ZO=P@UUP(9?oZ7)ylbZg2Lu;_ zmON+M9!19+o)4&GbD_TN7>j3Ai6sLuHr`TGF`eLTRQ{CA6zW_;SP2G-Q_a5txbQgjPnCN-t=>yw;u)l-9 zGkDf?&ah8SQJ=w4&W-9h2iSPnlPnHZz(G2d4a{kkc()ae7Q7)R+pX22#C^U9F8MKb z{|A}1?y@H}@x4f(6MSKC8dA{U^hR$s1;5VMxTba{U;H=y%0S+Q7x<)3fm0*uBlQi* zimPpGX`E_^$0azoVHF5~kNY=4_$-`5hx;{nJ9r%ZK?XL#OW85xz`J5JevNn7ncff2 zns7Tl_%HYigHzPSi}nZ_@?-daP7MqUlxBZFSpAm{Qlq9sxOiq#KJb?KA+$E}V1cihWlF=}N>JTu5v8>9F7OF7eGJMEO&|*#sV&?g2hlEng>CVg zx%LZv-&XL{%IV-%04X$>aI~M)&S9+DzXoEuRv5)Xx&SLZQ1QfFbSmGDv z|3vk(Iz<>KWRbE;r>Vr1^!4;TP+xU`7k?lA!c5L`*bgh6p_m~jKBKSj@~UR(Wx0vQ z{V+Z}&GEPV*Boyy18-i@Wzl;%_a({M4Rh<_&?FpZ?^lx^eJ-8B9K5z3YhJ)>OdE;@ zPs_<}BjowxQFsT7;V}Ox?BxpX5a(;p4U^xON+-3@Gt}e4WptNomMZ|Gv8p?p`#Nv& z9Oi}P+?^xngZ=P-f3VlA&9)~E&p0QHS;M(gf18M?4dl4Yy2EOo|H)oJ2n~kEyGgrF=t^3GvtHyrm&_?`xCy-Ir-W-W~xeT5ZY2ed2c_+)@(U`_k z9(UanmQ9vxmWAen<{EhZu4ETgjCxg&T7D7DkOkf0m(cf6HcbwyO+EIPL-AJ|spLoV zc?5l@$Mx2Az%k!(#J<4($i9y}>E?g4sOsZRyPdNV)`@I%PR7eS$-XLeL~71dC1p77 zU#0MWxaT0eOMJ&u*C?naf$KTOx59E^01ierkMf{DiOieex38QJ?Ce zb=!oarHS;n_tsSF9_vNxSTcon;XQE>59mbpO*O%Oltg!1Zx_7%v;p>_X zU6GADs zcDRtu&<$6T%1gKdu(eY07>Q>FIV@#D`?FtMBd(@Lufg}U9C*bude?$%Q40Ab7=xqy zS@E=(6!?d2Prtww|2BUF9!}wm+rh3Tt_jZ0Xub-Qnsb=Ev(2tBk9~$`6nOL**zD;& zx6yD^!W-b8{Q_B+Us7|}qwG~3r5xwUO|1$Gew}9x{Ojc~q`t#hnBrZ8x7$4WkPx?nyfzfuOBA+Ez<3Dy@Zqd5dC;!53cdkjwhE8Jt^=*3sVBSFBQPd9lN&DKuU3V5crv}; zA*RX}QZFgQuGEbK!9aE%@hDi!;DMFZSj!kNXX#h zsh3jM*r(c`;4hKOWpb58fA|L9COw{#k5N$!fj3$MKc-#o>F%d^d)xr!X@lNLraNy2 zR_hkOKw(YQ{*T@CJ8-h1>?}Tls~3V1pBeA2vA7<*w*IuH@p z5oxi-+Io{Xl%KSrE;vUzNjh0c2E=`v&sNUX({{z0Xx)NubRPU`x5CpLj*rb#{AM15 z(A5xH;AQg^c2kVzG5Zg1&=(vJ4|hLqSQ%WBE2Bf>_=wBYh}71p`%>dm^V@Z}mh`pH zpr-tndM))HzJYU-yC#oLYCxvQ-b78((?o0X*Q6^c>rzhGm)qmXig3CLud^%#x=Or z6RDNM^z-#aaKY(rnn22yU_NfTM~Zw7Qx}vwg3*d|b2+2NWHxm%_cN!GeLI3@GT*k= z_JGWhQnsqLtPy!5e$fxTHoqeotFF1Lxx3koW6CMZWlI-pU+XL~dXg*w%Sy7+4j4}v zhoQG=Ngr??Pt5CZG3$Xv7{zGu8k_p`?EY_n);%3Yeun|~fjGx(XMbl2v^guON^{|HEJveSPpBhwhs*K~waR_C zA)|EDboumU^o3AFo-;l(zBl{LWy!zk8@V*HNOb4uI^<`~jX58aHKut?yXd*mlcNqr zJ&hEj=Hu~yI`U^^@u)6Qo1^YW?TLCG<)pSxux+$WAo-^--Ww0_^tq#Zs%y_2GK`MV zgXh^c?RvU2t5AVR7sG;NB z_1(2ynOuKxXSroxXE)kEq`pi&kXp~4)1HqUv^-8dnt!`F;Q(Gp}N)1Wi=)=9jF z$2$5u-Z<_%t~t-*;cRy`h9j~B-oiM1ML+mHqi%W$o;uZ67{B=%XeSY``a0n0k%4|* zMaOyy|E6esAOi5S`m*^Pp&dh7=L{wZw>DLBNMm474nj>Z!8FTM+tR|a+`7ZsDxxSoGw0Nzj9K&tkz}Ady;3?1|Ionw9BpW_IT;I#?#r0bI@kT zNLybX=+|6G^< z>bIhB0qN&aQC>VE+od!(P&u?RJILV8f$w8|e1ASmzoc*Y+z;dIoS{GTquPqo&&4yk z5BmK*M!mU+c{W)yhpg|c)guN+6d~hmDPQ+)%QMRb^A9|;%9+oR$MBF$$1>)2=H2AY zJvBS=W?64uY}$wKWI5vqxMDxRo_BJ;ztnz!R}rsW&DpsQUVR5WWH0y&!`X*h*{V!L zs~<#y(9naIbHS;#M*Wm{(}VQWARVgp-i z+YnoOQa)|AqP7+hLnA_#tky#2I%X3(#OF*wC#5^mZ~Wiq!U-R)nFvo{a_Aqmr%KRX zP{)4YAucKtxn(Ll3pktG%h}y2ukk*QOnH}lHu+WZaXh(iCErcnk=&YFer-}*(!<1U ziA55HM1R8lghq+k5;G(vBz8+Kmn@}zO4(13ZX>@clS^Wr1Z9o+$53-%;1E#W`Y`={VlQw@r^sWATSPf!2O8dCVrgS>Fi!Wdq*BW$?s} z74i%7$)U)Izs4B&^)uMu*Tw^UPheZ%47>5e-1QG#mt8e*(J95b*l1r!f^JPx5+wWC z)IF)ushZRb_{eL?xe=27B*v1VdM060!e?^IHYLtVypwb|sbESp^Ges$v1F50brf=Z z!834@bAYpftE_7(m99LPRTp;kuh_lC!Cikve#aZ8lfkfY_o92eg#O^YA;pl@RLZmj zU(4p?kyR$eDUwW~S>)4>j@cgbGDb)K;jft5F(YFRMt_Vh6x|{EbCfOmG5JH!qQvO) zQNKu|oEbHoObcH`Hd{0m%5O?%{)sQ96$a2`Jf5ma4WzpG@(m(ub(jz*WM-ey3#Rc9 zHj=&Z=9z;Vrrz_14)Hm<#Nw_fCJ(Laz4I3tIjgwKeSBR}j_>x2_5^%YV^jU)(x@qq z$uOv$TFD-5FNhzu-ucb38`p&dwCQi17tyCL;lG_s`otmpMC!X*;&Cw<7T+0mnWYJE;BlM2tv*n`om9=3+&xo!Oqa(}_c_KFA)8EM&XYIhVU1dE$ zCWVcp$@URd$z=XSH=c%S{?Po*oX=Fj)XdP`Fb`}g9of24n5oTfy(%|<9-**s9TYk< zz7|FK9Mk)4em6XRBbwwTmNU}iRn+Bz93u^ZlQmh5}FzcDT*=)f6ww%w{ z9ZKtyeM{+CE_(KRZn%%Q?^34&&hO4C^fQBTt~!9fPga)!efJoAP)?z*-{%^RgM`8< zn&celEQjx7YiCUoUvD^%xwg3;qjmFn56ZDS2+VY0Q==DW;W^%SN@DooRta6-Fj`)Q{#2Y^!J zC*;6CAzoJmKdOwV%v#|bbJ_IDl*3ZdQr+6ws*A|YZ9f(V?|&oQ)|iM@WI(pz9cs(F zw8MJInlqwu#MX%Oq;h4n1<4?p7O|Rau4~qW{!a%rKzu0uvVPDY`E_NyMq4u-K@_Uj! z|F~Pa9nP=L+m4eC)t+EqLU-NPUYpL*W`B&YdF9jssRL5lrmRYyN}A`3q!~#A=#+XT zxsu){T~FSZ{50iUir#Kdjdf&jWWqE0t@E~Xp=;9L+SCa?{ayBGOL0wD6Z~KBDO|5; z_?=ndG`(dn(?r)+Hx^I7nP}Pf<1?!x`*0pk@}(jgMtmZ#yM5H?s8P`?qhraf9Tc-T zrdmvon3u#c_KS{>wni7FUOUJ}d`y1a#;CMWWuyLyoDx~v*28v|9KVmG^nNEdEJZIE z3c~c+jXJk4eA8O!DYL*&eFhJ+ky=-s4NqnhTFJBcr%BZ7z36N&JGVH?IMX;29Jd{3 z9V>AhZ|6wou;Vn@3wPi%sby1bsn=50rtC_Yl44J}o3bf&eCiVNBI5Bf>p_OSh`&}( zS0mSQvaC+KwzyobPp(0@090ZI?gArZFYlS1yroF6qMz(X$HEbRuDnFMmILO;aGWO; zGuP;GTLoRY&Dw`UcT9cDe z3J2CxmU|?+CE?9~693BPmS^Vg=ILZ*btV6xr+FmKXiLpYn9KU$llzTaOs7#c?Lr}0 z042yK_P}M?`-#jVI?*f^CZDl29*dpWf#n86+5wX?(f`w*7A8Ow{OoU%8nlVrw{VZ$ z$x+Xt=UE-Kug9akko`dFauPMZllf3O<#F;cvXSP}L)}l_k}@OZWa`?~ko~*8v9mP! zp8Z^NNV6D##;At3sJDPGy|0$PwEsY0b6^m>?}6w-W(%{0c$mYDVgDUr{=SV0ZinF% z`OH&|Rq%=|j>lVlOK;0~>pJWHh{qATN#U&a+KE>OqD1H&!@$YGlwx}9D$8l(_uChr_ix$5T zTGzVpcO`aw8_71Q!4A{v)A;gu)BepvZbY7aDf-}I%xG!Rl-$IxyN0`ndo_NV4(B_Z z*t$FGf}8bV4m(GdKy7-27hu*cxYO6W7on@#>|W-c)_y8>kXU2U~kTd3TxNkxXPKsVFYxDz*A8{yb%blEN|Zs926(ay@&`M{wV6lT$Mn z@2Z^S7M(I)F^;6)>rGzJOftn!SZ`VHM|_UhNS__K_9`p5t40n#ButdG4wj^B1%UzVKQyXuT3LjnBBGK4?d7o&rW8oMEa4ONbGiJ&;~VH?6g0+|@{=nx*fQ60 z$NHZ&kFAbv0D0H5qxMC0ik=qzG8$n3iQ{i6__Lz-MQ0_8c^|d9JebJ!$UmH|K9O^5 z`)pIV@k&}-TDO`nnctCU<-s2=BkIr&aB8lK_rQ2|BW2PWC(sB{S6(_&dkrgPWH8u8q7`)s3yl2DIT3bq|H_ zAj4~FQx0b2ShR*lw0t+U57G6`z&o!IJJeE|^6b6qtF_e5=%ITAI|i!;N|UAW9WD4Y zZ)p&t1YE5i;Yyg`c;=|-DB!q*5Bo@a2b}QD_E+3*b5i@IR!q%AQsBFkRQ4YEd0xBu zrvvPb>^*U|o(^6c_9hE^HAQ)So&xMM>-bCfC!>b?2#((molqa zuEiO~8+ICx8js`aw%2^tywP&lveA0Xx{b`;6}H2+9+8tHJz%m;qlQNP6E!ueKvd(X z(~<8;6>JtcpI-4RnVA(MI@2TWx8AV)Bp=LUK5BYm>S~-|{EW|Fb6sEEDKOu{+A7+! zaJ5FmNpHcORR&H>Hg?iJoZl|NmYM{%)r6em3TRfFqtM>qTI|Y#`|efe5pJ;wbkc3v z?BsQ-j-T9U`yBrRB^&AJ=$PQ>Mke(dM>_J+R?$rtccsTY?69jf@6ba~{W3h;`J{O` zJ)b?(;5L`?<@O0E@qfXo{Q@ulIX&w+*w+i-|J8w)Tc+h9`J`uQZl6)gmeA8+n&AaHKBBSMRrMwVovJsC&elh~$X!^v`W< z{cV-0Rz7C^`ON(?2-_HIyfpzdpp~VkWsCWk`3~tOr;N9Z!wgdmqCP_38(z#_m~4rH zU8q9V`UZ5Pk!+Edq5NUX3Xf#A*Wpfdx29H{bsTb3vbI(Zl0^K$L zk_%KZls@e11~rMied0re>0Pe6K3LPnT@^wKKA~(bbaX%ce5)E=e#;h zCbJowD7UquwJdj5bz28piO9xmA1zUFQ46AuMLmi-AN4wF8C`W9-oUq!PPUE1BX8I~ zFz=QlXM9*hU+W}mElYdLFLKnokneN^f4C4nYGDtBo#Fw}h7MqUXi+E~_}*4H8{y33 zExxtBwA9m8+|5<&z%9pC$6flRhs?FN+&kSz;Vdolj>NmHBfgn!sX=|dh209m3{!hzfA{A9FE0H!`W=sK-o4(np7lgivh6>D)6Sw!SER@L2}-*P zXRVUBrSCLc1my|F4X2~A3%-02xPFeITF-({vz7da>*UUTB-`kZ(QJCbeYFYa@}_v* zzG0``8z+Vr;Feu+7W+V+d!#rG-yDrN47TcJI8*6x<@Fjr4e}JJR0GKG!zVc7?CI2p-i(tgA^Tu5Zm{^;$l0 z`zO$AudqzA%wRrQNQk&iIM*M;t#k-AtO!0c zFSz4pItJr0qk_e}+S!bJSvzii7p1+@26W1bN9_m-qrn(ktD3;Tl2u3GhWBBY zmJ{#mPjK_D!|^$a&VLii%h@PiI~fLn^aLB@jfe1gEM1&=l_GyBMrno5tI z!p^$6e>fZHc>hJrAN~C&ktJTlej?DX&wmq@<_3N~uEkeHh$i@V_?yx|7j2 z0W9{AWt}C%`pMeJR?)VCO~5xi2pZ!qbBdgo+MWuYciv}Y;VhH8umcU!1Za*kYlotl zoU31?zlcBGOWv5*++B%eJ)K}TxWa#je_v{ee_)ZoxWK(s7dz8_)}U|XVjl>+nTg@2 z1^5Ndpr-2r3I)t!p8Mk``d4Fr)Ym-8+}{*qYQ;NOoLVg~1OL!D@eui;eFf|D7nZ-W z+9YJb+aed-Z+{RFr`P5E$(;Sm{S}3rmr7k#igzt>8OS_Yj zw&$TO($;~FAPsiNalGK;@C021qhWo<7;npBQ(Wu9}oQ&IM$wOdu7jRX}8bDzI?i9PYHFKx^R7Kx5Fuz|_Fy zfky(Xa>v~c_!7{Bo*;oc(d-}MU)QgTUqkjtxlCnE*YW>vrSGA?j)!*zX2M;nn2kLRZ+mJHgw-1|r2KDT1tl-UVBBmd#0^)|DHGjqmprGHJ|o4z7_czP!) zcTqS-VtW2`0bC?cdNgSEFZ%DLma*Jnb;*b*nbC;*t1-QGW0dFhoyDEi(215OZLT`_ zT?g_o6u+>5D7I8*Z~!IQ;D(E#Vy*Hx7Kjt*|}bng5ti``z|i$j-TKKzM*UFk4`J;K4v$ zP;gL#pw2;I%=ZC7MS}JPUJNV{SSfHS`=L8<8&x3qrTpsp)nd<7)>NOUYJcNC{RJ}3 zT8by(@0G;gW(WM*vS=e7_@4V_c;|Z?c$#^PXyD(lH9m|kI2LcI;r5~U{tvUQ;r;nz z{YE7k%AA(nn!>I1oO|m&oT2-cOMHHt-shvGC>xP+bVq-!udGW!NLt&flSOT`J7EeX zk-4-J=13&^ld_zhzwkfL;{6m)md#RX^>GVeQSzh0%@fT#%;(t1$|QKz zfTh;UuaRFLKLyKuX-=bKTwu141sG0Z$yHoW^TG3*XqaobrBBkU*_-91_sW7Mj*6t& zCF~U1;fr1 z>4(x*r1_D%y!PMZf6e}t`IjATk(Bx|H6!(1s_~yCwGqFz6P`mwxNE6&P%qN&q<^)% zv;<}7GCF}1>;g@4I~@eE)_;KiW@ft==HF%)_n*cTY_j3Q`;sKC|hFCljx) zEzDMn_pO{Q04LC35`gM3*^T0N57+|jskTn`D)tTFC*SRN?F~p@Jj^>5N-o@el8&a6 zSzKQVl}z~izeW$fPw|WfPis%6UPZJc1@I-!kEcX=p_b56(_J$JPU8&SD%~Qu2($6I zA8v>>G$KddOcv8a(?8P^()Aj{S@`1@K*zMh-{zkypfR|AL_lmnzknG5l>^!beDjy- zrq}Yms39m%Jwq#orSFsx}TyKvA&k3t&ZkP%DXE z$#aT#U=V$8PS~vf@s6y47Zt_6XF^85j1BZfzu;93u(YwrROR#OJK2y;PLD|+m_D5( z$1TkCAJP-kn_4PzVytW)R)wVA@QFNU|hjfSC*%!qV0PR{$ zxtu&wH9)l;UCv#!iErV6K4bPiiOzGpI94p6&#ynnM>BfJL>Qe7snh$6M~!Z9=4z&f zFgg0d?(A&}C2Pq8JMApq!I7}m^MPaEH6(KiXB%{EHkRsl=~en*{Xo3TPV@fyv^jMR znKc%IwY(5gP<+%A6t2^2{LIRsg`0$q@hlikDtCTiZ)tB&lyqCrQvH)srM4(dF2W0` zghKNmJp1BcwOipM=5omPRovV8$%8ou=V3H{vh_d&ije7$$L7c=4!^UptuRcI7N8ze zVPRc?6OjuJ8uJVoZ#w=HS8(^(N$T}Fb{%WclyC8@#Xs*LdBC@Q-|!>}#NDKo(3y;z z?f8RRwH0xQ9}CNT8<_h=;|t?eQ?g0f-^ajRtjbpCoxjI_9Pg7YAZK7NI56?NY5N23 z1}^63M(nen1f&MkW#<~}zuEsdOo01vL7$s`kc<7sxZ7|FkNhZoAih-F&~24Kt-l{X zj@MF&TTA?Mh;CgTn9`q#qquM!JI?J=0D2OX}30oms8<6SMaExV(oelmRHu%*o zdDsVKwdgHHEx}|9*U98yJs^LpBHXOg@QAu|tL3zbq`<$nJ%X2Z9YuiR4{^@5pKSYW z(oXOMrB<)NGh_uir8VsFHlY#P0@pJhZ=-p5CJfg0(^k=y$A$c_Zata2^>Cy5z;KySUqvfet!x)101r?%_10Ef!a z8J+M>W@ZU}NpCcB_wi6@N(N9OJL1klcOjX+s5iPi61l}LAx2aiu2PxFaj*w1CBi|;FAAif0KWHX8Nvv!_8C4 zR$pqGLf%CLi8OV=FLh!z@uoHjj@2^qLplk;_?XyGxP8DK_nG&N_bEE3SME3NuXrd( zF3DBcRnXPj+1+^ztwI4uuw$Qno4pmA54GKHyJI^~onAzzJeX927O;zJ+uBp3N7%aX z*3Gtku-&#*AqzF0G;Lm(%Pwr5Ioa$rhp|Ii=XahBewyD`=8l(sPQU$RT=ydB&}t6yn?Ua2XZnOXrp~50 zWH_B7NkP$!B#N)ZLwKW4By+hu8i$YYLYJwQW#UCje&BJuMWVq-!=xHgZbe1w_)f<4 zfB4|vWMlZ0QzTml!{<+?ABwj0vs5Dg)!$-I*TH_sX;JYWmSYDQWl1N+ak4eSS`FZ8uVu9ce}wG z8j9{~3j2|fWTvfTjRG7g>g1aPh9%mjM99}egj^<5PIQMgy5Nrd`?_N=FA2yBqM zoSt0N;*RDBs`Ny7XA{Z19mL+b2??!v%@xf`&%GP|Sr;(a3_7TpJYNaV^#P>3oyQ?h z$r5UXN6iBAR4&2a`-Aod0cO403Yoi$xfHx`yZfU9fcEm&vDsd!^2z6iJ#kdr0`BzyAL4IxLSIah={D(m%Q->y{k!`=_y6bLE?{`T;edMq zzo^_kcp!h-c_aipf^|GD;H|%v%HG9)q2Fe|i}3uCO(~{Sa^?OQoQ7B2lL`2L#e!+J z(6-YW@jOdZKTt2F{`8W2vID8iIm+YBfnG5$4v6LOc5j1E*)+U=uRG2-@{!E36l^Dt z-OqlF%)6Pkv9|7T%o^D$k)&SM)`a}3aPYGQRPXEP7y|5W+h}`lys{tI!{OPcPAQauvO}$tHLYd81%BD0SM4Ti6vm_NJ?+tE=PR{ueFx zHq9PQXKgQ>-2+fTU(*dH^B{FR(F|1~%;#Yj+zp+em-y)*etxy>ca zjo3!^~m*Hed>|c+N1>D@!-}DeJS0iJ0`l53Nn_h3If+ul*+%l%26^i8?$KZ?F zUx*+Zs}|WBW-!P%zEilAFGpuL4v&f6bdK%eK6h}|bN1mJMcez4X}pl+qdTP570EaU zU#OF{3iwDWIi$BNuPqlWDWn_chx0$o+S>Y)9{P>gGQ$t zyPJla&XSj;gFjQp+@7Z}nx`sbp=?;dy>%|xGf(t8p&!&FjcDte}n9ebZl-eT~d z7r;()I{$&dM>^F`yJIstP$efo?{L~5quba?XFbgxiPoi!y(N79#`X#zlQryv?Ct2D zC*rbx%}J74fy&>0ItC{yUzbC)9!44BkA+Y$)&fNv-s7gj~qv;;0kcv z%{=!t;4G71;WWps$$&rSITA0z)x()#Mb&2CcCs)Vd(+&hcsCrx>v96~eH&+EM|DRd zrqwP?5(=O78hgdURBP*#;qkU^`on^iE}+n`|l`z>e!3f zH`rz|iG3$+tQ$!FORK`OstL-kwtj>?bOYq*ip63{vgEP4EZyKX9DqBTm0jBk{*6+k z!@Yx(e283;t3KIg&|`QopK850uFD4-x5KC6FFz)m>*<^5aw zZ-IZ6ZZ`Opr9O3H_c6>k#W>0^om_=+`j+^96~Qqu6}7}k+_omFqj~3Qszh9--oppG zg|7U(`-uArZvIbQx9IGCz<$o{97kWAgbQ66vm=__S=0I^(e*lHqj@we)E3aI#&B zk;L-_Z^T{l5Y=E+34A_2p~zFbHyXfE{|v4*gIz>UGUxW=n^_ZP%PoA~TajON7x(7c zhE}A~oG?gaFNMKaoC!jElx{nTTKv=KWwW6-rGQhuH2&k)*+-MGR}i%J92j*&vTPE# z_w(ti=qHNH#2aux6~Dh4?Ctt$#*%@#K!_zPV!mpX3dB#I$~+kjhi)S2KvU3+FOcR+ z+rZtgq0vZT7hjwSU%9L9+D?Kf7P4I;vp5`{Ufv9KhJ*V&g-w|crg>@l=`rk;9%Y=$ zXby^`|s2&Rq)X6v&+s-RgZLpJ03f(qn9pE(#u|_;+1#abMOj44|0O0vMX&#PH3PZ z2Xn|%xWuu>Jf;$+19Xt3z+=~$511`x(XS>++#~$v_{~Q}z0hwb)9w<#+R8qf-o`i{v0I$?tqOfn8!3uDaV>ni?=^J@hkzYNavE`3(Ral?J?`%!GtJjNcJpsVyf+0EsdKt`iz+`w0U z+`LiQ6S1f5Plp|Xj_3t=&_rsr9wyOZdTIgmV>CVWW8Tl=`m*}*;w145%>NAh7mx7N^k_M8`9qx`I2W$>n_zh_FPRoa6#dFM!PB=e& zhr0M~b zspET??-jiE7KnctX0u7AwWgzBl272eeI`-vlV}r@a5_E(e}5TjtN!E@R>s3gREer& z`o&A|diHoW~{ZDAq`r?Q91b$H+ zeQOds4(sh?SB9Y$j-}3=H{9W^NreMpG6t~A&T7nSG#G=7Y0Mb+c`w()W9xx_-E7Ea zILg%5Sl<%dBMB#%*5XOdl5!u6#9#Kj<~p85Ix;>Q3M0wA+@RX7x+>q1zu+vRAz3d3 zfAZ!e6^_A|V+$Ef&-mJM(9aAYzxX_7sW6lN8W4UZL+vy?{2}N$%5%R3fXC`MRXJ^* zjE3BHb2&F3*_(6(+keZQ7z1CT98cZmeC_-X?Zg>rD|sgI?vuFkT&6BQ0SoydzmsE8*#q_C9owisuD?q@(GT1{-FV*VNdX9;7Yju18U$}J z3;L66_~z%utEnWu;tklN55z-!l{AA|eGwGRz-%_i`4?^PDDG^5ZfGwZb6;w7aWr;n z`wv?xyTZR<9}>PN!FH`Z3|0LM?yEcK)bl$6*l3T%_27eJ0C?ONT&zZddw5+g*IHa3 zs=6z|NPFR)4bP&2w>(?L&)#@;upRN?fXcy}^+dITJGK*^vDxvmdx|gSa(o_}qX+Zi zt$vu?i>_qoIjFD84Qmbgjm6=|>@#ME(-=d|c?8cao4GJ)@|~zh82zz{|26`72>$3ylO9I%wNUznDgs-901C`r5kGI>Fl9T8`bL zV9jB5paIrfdsu5&_gUvzv+(~|moX8JRW{pC+g;lUZo8#Cx2etn&dII;u2^Y|w2|54 zJU*uH&{hj@ib|-8sG5^~{C}Lisq{e$$--Hr8!1i~+vo@A^MU8Qg!en0JzAitoN1A1 zKdkZqb8Y5`G4PAysMQw4@BYa&2f%~ub&N;@-5dUX`VD3Z=j~kiDk)=$;-PQ zBzt`({)QqB>PnV|iYe2Bf0YFe)<=5m+xW3=({I&B8b%q4lR^84eaHaQ2vo3tO--3$ zm09GD`K|eb*#k2It?#?bphDnR8az)ZVn5+3Y#b+(5o(Nvcu}{J3l4`c+=r zRGW`IqejS%e}N4T#;5WT-zhSWH+mQ22fYZj+&b{&lVpm2`Zph9~E+lFqGCgTH|PIC)?*R*#)E67gQy^ zNKGI17!U02@ZiT$s~h9LM!LM}4IVvP)Q9of9VKMJb@mGH*g(9tymZxz$u{v9ONevC zEn+H4kJe;!Y-6AHLobu4UenN?#Gi3w|12ZZj1LxBn}t9;rBe4d*HqH6S+t2wWskg%!TXbXj~(2sBcr5vSsoew$S%~ z#w#wwR~paFQQjlyhaK=|n~*acFKvd^>R=P!%XI_2Y;6)Wt~jnR!MAf*IZu1+TTx97 zpdQtvA{FB{D`s!T%s-xAOW2s1~bA;pkKNpU2#U=F+7ooH-M zqbtA4_u_`|T)2wY?FH2>RRUgH$ML>WyfH7~Wtrr@Lju(okZOOaJ5IX0@#@y#L_dKP z5hson%c;XP*%3Oxr0?-Y9k(sB9ptS#i*LvarZN%qHjH;^4g6QD{k6R>8nYMZ6uUF~ zenYzugNJD@{_G3VNof#nd0BXuui`W|9#3V(2UY1CSIKMS7Gzbc)EYXrbLwH7qdeSa zci`}i>>xY3I{nqzIllcIwzXG%Se4arPzB_(Q^flSVb~g0{ zDT*M4yDtb^m??nW{eL)##Te%qa~O*lw@|0E;}NwLs^0 zj2*WL9bR|+82tv^@Sc$=VZgn)y0$TVqDc0NtI7U3ul_<`9fZqM1N!O-z7f8|XbMvC zG^>V>z6hjh9~wa3nps>`&2c9)jDkl6`+H zJczmcSVzX8|7p8<9Ifo$UGkC z$b&cECFe%^qBi87m{H^AUmf5)lV<0aP)g4A6Fe$%^;_^DSAAS?ZbJT z79!w)Xn4og>W=F2;kvA3_b3SweW|)i{#}Ybz);Z8z|e@Q+>M^FKb-sCq)@ju3`1qy z(jao~9_zo6lfrW(i|`LVPK(8LFo(*DM?t`=;of{2|EP-ED%w4yX5^%QoCOd42RKX% zzBl_+yHq;%or>S!C336s`f~bWn2+AElWmB{@j-O?x!Hp(_p}&SuXMzcIdv0H_MFZo@FcbPqAqbwbQNPq zlqem?Gis2#9(y~ZH_h{b{n=%_^>=~CEXQ+o8s1>T=^Z=c9ad9Yk{ivS`;DLPNqpEN z^+VCe=BC3wZKwk>e;f{VkSQO0CflsBmleYM%10`v0-h}j(5DtJRH;asBthCj5&rm=spwM9>U z(7wQ)i}!D(V;twl?KlKh-P~1HHt-=>*j&SMLkU>=31Ekz+*2z+ijqNRgUq4kvgX$23e0Bt*#=qJ4V{E7(ubKO z!vgP7RT*v~oAJS2B+Zh7sMA|; zbf^q>@3H3&J-{$;KJ+K|NN|{n4@YHH8C43Ia{KXF9VGM=^5f6^ggQE#`cxJq{-N%+ zZm8Iw>S7gV;KAf1cWj`cpW!lE2ZK=$vRx16+5lK2W0`nIfY-J&W&w>&)eozIsuRU;_$83kno@uw898=Bza3o zp!(IxY}+jB$!r_z8|C|eZ)baWShvB{8hYw_uJf+7aEFm8|5zG=1A~gUZo6wUY@_C| zAbhCkFLAOKk|EH~8Rl&4tb)dCQjSCZs#;b8U0w!4-c! zvrTbM>SfMrf86B*NK?3pzG5!#c`Lc5oEyiozwD{6!RK8|&fZY)$Lg7xj8^Ss{C>xi zQIZdi{TcGNoANYnf)7=~gJ=nOeiD75&uBDd!!s<1A2u-k>-3V*=w)(JjkcoA&c;)n zzzugD?W?TIBbFg=tp)Y24?a;t$T1&@CU+E>QDez8iSo_&O+$~e2=3e#c#W6fg8ak} zTHzE8CqL^Jx`xVNsb|1t+jGy$us&|kRc~TST?k`;5kI!FxxNeEQv@IBP6vLG9;u?@ zo8^diG-G@6g*R*=85q^sUH&BxbT|9yfn;74^XBya@V+GvYKLzWXQ+azH1E_e)oyZ@ zx(Hnb6}iZ}sF{uMS9l5EdLVA5-$|M4Pkzf2@q<{Mo$?C(7Wis^na@JO$Oan}+pdI&4)86HpRwjZ`)ynmya(H`MS*wj%q(>FTO z*~6K~rRANw!k%c66!ZV{SqpDPayCl%YRJXNt1YIgjz@b{bg<>|b|{D!tRAN37aRmn zh{wcn`tkarh7x?`_rTP8;F$W{Seof#qG_S&py>(>k@q;yePxIJlr8H)c%hLdmob=q zE3+JT+5-G&{^*T{`uK~^6}OVx_ey60Q!7AU)P(aooStYowePg*CO)-)NYKqGH}W;{ zO<}*NcrzP4T2DXndTvP<>8#62XIuxE*s8fcGw(0uPHW1W8YiPT z_`&O8^B*O(`iUbeTA^0({+5#D_KH;5GHfbi!KQz>-nlx!E4|L7Rtuf&Irk}dUHtp+ zklfIjH~c%eS`0IP5ck?Xd9U1uK;F@{)gbhL857>wJUL7ljkKoY@D=BKN?p z8^zgr4#%$wo(%K!3+N~x>NRXyOOqX5pDkG<`hv=a>V_;Nq`s$*+&~}MlzHZp_?x#j zO8gGi+kuRyBjnS2Njz?VU(sap2M%OrTYn+F*Q_cgSCU(kF%}Ikb2qsfui-=GfdA7I z?BWpksUMi^bacZiQb^Z2*3d82VX|)Say8MGl~;sm=_1p8lsQ9<=+k=fTj5YiGb|{DHQ;4e$2}^;vZ=I{fKmN`8|+ z1G_n9Y27XwK@Nkn+^U`!w0I-Jg~FehI#sR znY`H6Vqb9$GudNsA`iZ!`SH`Oig!vg?)lED2=4hY_{vP>9b4#KL4SQ1H|8g3G6W2M z>)}(hklX4Tb7yBzp_fdgqe;Qej~ezP2;*7$={>d;pdxWhX}jSJKeUx(YQx#U{>gsR z-kmw*BX8bBYEN#L$9V@n(G;mKdZE1Z*2(S*_+88flWOIw<;y_|YBIi&J5=$if$CoB z0%RdS#y4OJH8Y>K0PY=UwGGLryh#^S2mgWtc!c?(a~McXIz$TVFLpb@yiv6bZMgdf z8G3R5_W(m{!?acf?s^umj!$~4emCbX96pI3T=c`@Irbgx$&F9O^=F{&WhR!^mE5sg znv$AwU?9tw(SDI|*Fe2OwUV0jNe(5mehM0u`{d~4gTpeG8S@_bOeM)@S`6-m2@@G( z!(Ct5@kinvrgn+rZIp6^pMyXxL@8@UO&LKX1a%uA1}A-UnZ=C$T3 zj^%MAW_2M~*{m1gTpiQ5U`Bn!&L<3x=Pu)6oafxe;_yDh*mbmmyI-41ogH6UWrrUN z`d<(ve=mB!0zA#Rpq0s@69luNI2do}jeIBWp_)u5zaSWY?|SNvWPMH|w`!Ywm7GVr zSLLhht>ukDdwCzv%i{QSFP9cedV1hxRN7*$+^$4=pqV_ICiFhJLEGGP&cDg|{=xlb zalCez(cCE+vV-8;>|$a~A;qHszLgu{lKSW)21}i&LN}#mWYS!5pLEypRAx(k#uMhP z=Y4=DSXW<1T;Y>_k@7IvjyiuPxp_udD{*ktbK#%55#N2qyJ!Pmi`kUC2$C5r+6-+s zPQfXVHpHK(u)2T)#EbvIg^n z9<2HWJ!E^59xl^E7AAjavM_~=mHX--v;&>-;$BTA<}-GUIhgdjbLVem#{7f+ydGTN z_0mS1Ib}MVF?fZfa!XA?EtALjz;Tb8Y>8ti=cE%|KnHe_gP83XGV|YXBsj8A*T*>r zW@3)R@t^m({<^l&Gq!WraT~}1y+__!oOimn5BW4@<@~ZNr^`v~7{Y=B^>v2+9%q=coNUm#FOuAXCiDbY*HUkJ5@S$S2F9) zk`$w4jLi2fB%LaQ$tVJS-g`F1eet&Z0pd8>U632?wsan+>tT4E7m+gX!ng)j7|*$w z#7?XqiLISnjqq2ikIPy!-ou`*x!mms!SLU@9=fuFo^+8~N!#J+WpI;qfGd+gZe&qd z%kiFdWRm1$o3IJaOiAB)ymvZ~-St;akr$H8Q5xL(KlNjBXeVUu(GoOg$-3;4>9IVW z_rgR%+9J4QYP|q^Y7|fF0oX`>Zn1E-Kgw3@I6dQK6dmUb8{q9l(m9rb^ZyKuXe86U zm6>cPImiFe6BUDV63NWBpFGXC!gr>RKz#PftLu~T-d!HV+%e6!1itkl&iqsNJGa_x zbk{@;JDpUx$Ihort(BZRm|2TELL8Uzvlzw(q>Q~tCU^fYs+Sa)R2ulzWx=(F;Tv`y zEI&Vq@GJ4W2*&U8Fut+vP}jIY^G`@?r7?IBR>teo?fLAv#e5b=j$AM9)nep(|53e1 zPrU<-sGm>}Wa}O{$T00-x*wl*KD#unXrhCePDlJrtVr7G6tu)=VHW*hdNra8$`2ia>1dQ!riar7}b;a_O@G18(KR-ifDwArdWV!T^hs#UwyS+_@hLO~X zF7$JUcozcTL`@^#QKFxj&v{b#3Xjr0a}gFq(zxY@J(*%{VX3nd|Fv!!acXyH4P*?jH z47e*?!KcD~p*fW)fgH@d>MYD><5aKYMY2e~az(U2wrTu1~{Dr-Y#@Xh6X}hH7|POfJM`HM$Js0P z1V^&LZkvs7zLqC7RkxK4O@Cb{W|&j31%l{>X@`QEcU8#CJmNulZTd*KW8L9;)!fH%2B7+z%$j5WfSckpZRW$ z@r@zp&E}gTPnUHnlWGP1V?l7xBRr=%_>M^6iBUYf z_QHSgv6pSdowZoMn%Z+42L5kwBp@DcJR6_ArbZv;d5(tbS&;YZvUr_;vjep{Nmma| z$qwyatwc^$Gv=~I^o+QGsvQL06eDM|Ej)~9GG(`uXZeT(WdTR9y5K`I!SWxI8(A99 ziq-fvo7q>dVlFGg$4ffIb?~o7*axHDY)yr32G6=1tdS{n)hEDTz4kF6k00m>!tvox zC4+Ubl6Q-q`Ui;q4t!%HsB~q>>B_)|{W96u^YOoE4|YQxD2 zehkmKF?+NG-vM74kdPf{o${j{R%%5NPgZ7d7Ag{3Xav!oll%Baj8iqKy@QvxgB@uNQ@auUi&NX@Xqeu+@4?E zqe-;$qb41P$JZAR=^${2JMsg079PoU$sd$RtUFEK;wU()MZj?$qoa#LGZQ2RfnsbG z3-h(FVcwE>-`auLuLR@22}<-C4S$NkYWQmSgJakuoK?3P+A*0p;At&|v6UVCaS=Y* z89IGte$@``Y3*-~3=-Qw6CuP18^Q7(l4U8Vg7E@tD~|_PJ4t`*0sU)BUvv;(;OyKt z3*f2w!3@~~R@i{vC!LP@6#K^caHL1T!wP4HA4o491%|Yie)1OhqTu@CY{}`{>Y7fk zm`qRIgi4k`zZgo_e$d?p9%T|~Sl!4Zde2U1Fnp90a?>Wr5%AMeoreGAUJo}ExTdTBS+ZaW;fx@6`)WiA{5KK=)7*C=&=^&b*H zBiPBjk?%4U)nbQsz!yqyy%h{HJHC!fNOLoI?5KGs^Sm_f-Ei;f!MFd!u4g%STnlj4 zz|0h(WL$NwgVCPh=Zk2}lALa4{qj7gajsD?8?L#EQ_a>&tE3#Bw$qVHcs{j9I4Ny6R_@+_9&)m)kz>jL$sAye!bu^=vR zQEZ7W=&w<;o%$T~K_x(hN*Jnv2o*P^^Uhtwk046FlqsZ!{tTX>jo1TRr-oH$X4wh8 zsAo4f2*3V|^g>yL3c^73EOi3hFC$f`uRIAY^&?+yGDl~UO__#@XDB(2f6xv`^GpKW z{`5kJrGC`vd|=IAsY~Zvdt4jnp679^DRp`dZ_rATtq!^t(n%jgA^OTy0UzcuXll;z zL`3&@^8M;@A~(77faTBh3_}I;($mx1f|=}!w~?;~9rY>h`pWW2eD^AWqn{xAuo4-A z$H@&YkB9Ri;ffHVsf|ndDNP_>&kVl%zu3&S;mjOl_n{W^itXrSxJ$p z$`fe?yS6jcsvR?09a7Qq>OV7^?S|df1FnpUn{6G5j78|Iw`sS7YGy+#6r*`b)?_(2 zX_LuvzDAy%0Fu^_oVMxYnq45H)$MVR;aS_W7_Y))Dn?B>YFn8?v(V$LWG*epjCzTg zeFW2c8G3CW4i{hT$slMi?0@W^?PfH<_1VKJIXiD0_Z^Ms%g^!d)dyF4%4|PD3YQAt zIrfD7t0kmCtcSlFvid1Ms)?#OC+DJ9`i>6-s7Qs4-e3{l?FFHLOy6U z(r<4tUv}fpNprskiJ#`K=`P~_1+KQ8o;aNRyyDDWHg5R;sKQ6^Ay|(u)>7^)<=$G& z=ljsy-@$u6oz5`?-K3(2^!m&^YxYcFiM;uy6^!TP4c9&gQ`K+&T^hrGJD1l zp^`9+T6loJ#c$aO%2$gFo#~vTdtN_pZf^wdTcZ0p&!v(36!>)=sWJS}m&~nGI1Qm- z{1!GEw_wxk2lLqMJV@5UHLCazu#dcKBzrT@9&oL4X{A4|p;9~P1vqtU7~F~QDB6%U z{EX+{*V}+B+y~_H_3#NK%P(c8m{aAGH*$~VQ=6Ie7lAiwx%nsYH~xzMMGMVNw0arn z(&}iNajF)B?%d)lb85}x?UZ6yTaWtEimKcW9(zmvw+{P^;`H5me*Or`eVp1p1&vL8 zZ4YX6HtjKdTEaEs$te!j9OBMwfmgy8^&j;l^a4iy4(n8F_)g_l9g=sV9xNeW;2bq3 zi#pMpK+bGE??>_q$DozhQJr9LxEqk``U5|~wNea>`%2vWRw~aG&d@qeOboSYI6n`i zK8>edE#`NQyDZ=WmC?d|-vwfxM?G+E{ zS@gA`>QMDtKIWk-C<`9)P?Mw?N>Y==yg7$CLnZRPXGVX*yA}clGz^Z=X5Oo7`a~wy zWPW@=;rIv!)J>JgOP@WTXPkKb%9nVcvgj)TPx8?xv z(rhM)p;YUhU`IW8E)l$AQ(af-3DT+9WkKM^f_+@Z4?Y`-tz+EHNn$k`ilCu=oOS)vs&C_uXQeJbsV+20JVCTR!uKDjm*sq9Fm5i z_jpIA+7|udRrbJD$w56RUxRg7L*B{$qc~~KN6e3?VgNwVf zQLmq}z1WERTqK+8CQ?)0p-S|XCD;WNg?C(<-nk~81RbQxDA>D5n|Q+>N~a_P49b@7 zYA_q-xWAJL+`v->*PVEef&A);c<=o2{-u8$h7Royv+P)qM>jh3`4~)Rhnc=pU66j| zfN)8ugdXh-oX6^Vw$=n$=-NUfMG)-kQUgehv`$&}aE)i=TasSP@{Fz)@b z^Z{B>{rmJrbHU+4@dLZheAYwPU#H|ib;AGiDqM;X=Gj@K^u9s`S6W>~9fP;*Jv`cj zl!)qF(fH9rXJ_zQ~^VP8%a(b z+x-G;i<-dpo8pROIyvkLVD~?q9d43zPHN~b!A^0DyQU{!X1;K9bQ90e;tudN^ricf z&@G0u#Y>UbfTiaFrP%;SEjtc)3&@JLq5$be(!_E0)*AeSTEVAZh~8Q8qWp#C$3$*o zVLHL`LQ?9Sz}* z{lRN#Blms>cvJrFRKDgDoR4YLsSYHYhjNZ`P_6XvY&HC^nG;liZCRbndF~MZ&)?EJ zIM$`yi}0=c#qP2r8sXcXYo3Oj*W2D(-VV$kU-_6KPvNf5N$+@4)gGV16!kxz(PE*H zrYK$G8TR^NxH;a}Hf2|IPIpmPSS&_=Gy~T3L-rwo`r3HW^k!=msh_|WXd<5v;n$jB zj1dfG{R$=30%}odJRGj@Je%qcpcBfgt*V{Fd-hdOk$KWvSWCwCA2tg0nO#@Q$K~I! z3!C`*`*wS;lHOXvJB=N_!|msp>Rt*ClE=M|x2l8Gov+?3-A9+UDYG(1adU-JrMod% z^ky?MnjUBw9l?257Af7;gO3b!wvfDGUT_fg}bk0 zSWU$<#08UM8n=|0{MQ}a?@gHPt!!S8lHEQTPl68Mk2TrxS8$esEmHy1vAHwaIf|ZX zH&falXDg=PBW!OAQ1v%46Nk8S@y;D^ckwhK#qS6HGI8FHXoR(L8W}n}eg^5cts zAFL>f`88N0a)x$lnrW*k%yDgNx}S@niv`3SY%(IbwNBwWlPcz-{#3}EI~wXMQHS!; zRXf3uZgGBMx!sf$%C`jfZU-L~c$jxgJh+urOS`Q2kcrQniJn zdxISDIwV$~^WA3~+QN68{bC0)s(*NXd186TN|W*Riagh4ydSOIwV7j8Ok59f!QR6; znMeNm7DSd>M0Zw${^&6HZyuqbFbjUsH~tPy@CeyWuCm=m>UA6D(t0`(bmS9V z!b$Q3rZI=rqi1lzz&WCMrs;#Pg&tJsFdOl9!WiM7+D}-5r$li!(^trW$N#H zc5648*iLYo_Hm~6^5ZD)(KXJ{J5HL4PP`m0*@N8eNHt%HGeWYvAx;t-J44YFWAKJfV4rU}*Aegu)4__Ssb{N=?6Ov~fz3y~-lo~7DFAUhx`Fv6t=*^-ST! zKE?l{v8J2mpm0?PAS-hu|J}Rnsfws-sHXCaUitp{s^bT^k^5KAZ6Cv3Z+Dxi*KzDW z3gV}Bp6;eUvqnzz`maDj_JM=UqrV=3QfauP zaXeR#`!%>?E8J?Ydj@bmKhdA|r}lg$*DwOl#_u4E5zP0WRQFW9&@?33!k7i z{Q3Hz?Z9oAmW9@V0zF zHd8BAbJbmX$HwpqFOdveja&a1nx}Fw9uD!{uD~>Mj*Q#p?y7KS?n_hI#})-QdImnW zjG3b|JJ=9=zr-QSL?CnTy@WYEERZ zCkyk)R!?oR<6qH>O~z*?znoRRA)l3p;os_yM&=kkA?<`P5?kNH2^|X~%A;ApK2X-$ zwIg%`cpleud8ygqVo!GXE5r*VI6k2-e1m%CnfRK-ncJjb3N%c+u=g$qkHARRM-U=3>hNc6lJBN5X1Zr$2PSqBY<353n6ogOJ zkta7j^IUD=em{)M>IqKNAs9EC_-rQ6rzaRd2~N~+dd?l%!*CpWu!D8eORi>?4dHz| z0wbh?a0o422s-!;>|*@c$xNqb`^UXMz!&a&sniE=J7$na;6+_M-^s0<#_eB#k3@DC zv-oJr?2(Ii4fU!4?`@tYPeXIFi6+#1lK($U)5#P;I?5isZg@k=VJa@j4zGxi#p(mQkV2;z+ zdtC&FPt&F_$>!p@ROgLr%|{phw-aA|Q@ZVP_zatLceKgW_C0jtL%_`nX-|L`^wLb# zsCXLNglj?_dY~7umq&uTX!!5Oqdh6B>^PaJmHn&5r;?X(*Ov8FVb*`@jph^;r5-)^ z-1jUd&#I}XD!8>3Ht1O!E}V?=oToq-RCdYi{w8T~E>^o=GlP9(SC%T3<)k&| z{u&7jc>^9A54r12p1)v36=66`qYFy%)T8s-;9X3{P`Wq5*T?tN_s|!{89L7nR>5Tt zt4^s(kvX)RH?1%T=?0!u5Ifj8e4o>~?R$cWT%<$F1wu4b7ej}1jmqPtYYb)E+6l(l z2yr+!{ZQVo9^xS8|E6LVu-n(vrqy6@4VhCuYkz8^dD?2Nf!=x%$|Nm#<3!;tUVDwH zLwk8vCin#-zOs0#f7reAD@(9k8&6nnz;fwZ}eKPEj z1x%PZycejZ9l)?t(1KgK{eTadgZaN5IaRAc2EKu)HQ-O#4ROiXV z2)gdUAVeLh;}y`Vso;{_;HHbAzbvM!sJjWLsHb+g_NPW75pI^|A1t^LpqpR7tb4K< zdW1%=G2PL5{G}@4yLptmw<7cQIea*qgEoGkx1Pb@za+Te8~0o4$SRPKuDD_pg@5fv zN0uzTp?7{tPxz7_U-(?26AGr5*XKEoL_@oSO!@cV_k}$k_fYh%37!=m5#~})y!=nF zYw`1?c!&C0;~sm+SBwn5Ip7~(KpY#eIK=bKQ^`?J3qrLz(n@bo(e|K8ACFoG| zwj%*}jphi7Jqu^6BI=o8Acq?{Uw80<_^tf`J6mECAcDmjbtUoEDNJ3;s{25nd6_

zgRi+yxq}BV8(4T&^LbiDJ$XHMLF1$N>dS!5{>9bn41Lcs&c;~$@%u}?I9J^>wGY!l zO?EJeJ>k6hyY*DBwsZ|!-3oVN2>Z)t)Vb#LM%UT9HslSziKlH#I6IH=ZtO-E@(%Zc zzUof6@g%|BZ^bVEicnQk7T1myVAd&`Ca^b_f`r`D-sUTI(d85dF{%T4*oG?Ip3hoj z-d7@Z{H-<>eDXZZq-n58t7#u}TjTR|#b$%Z_>_n!2j= zdgZ}HX2Y6!2o98un%$1haCYX#^$NXGGRl{KY!YpJmPY6J9u?#j`hYb&!9L7ndFdS= zaPlT-MQs-C2GkQF?D6*r$A#j&)0@@1;5Ft_&qVu?3fHoaJV3rr_g~xBfSxhITMCZ& zK9cRqg9%=R7u5qUhfk8(HXf#H90KP$l+l*R+>KNORZf>kXF%hX$7qf}8} zhS#KUKYyWXn8rso)D8R5s3_&hn1-f$K(c zj&=z>1Vp{UNSn$L`;!&i2`FAf*^oXlz4+4xoVCX%}~ znveXj_n*<(tl>TDM^&i?`#L8TTTTCCr^~j}87i}Cb`YhCa7Mea|A}=EhC#H+?S!9H z8w_?1%uc#4!Jg1BJ zZFc122UBDWyZr!qlpVg!oTQ4rN8D}0$=Nj0#~kJE?}=8-57yCbzWN39*`3_Ycv^XR zT9TB;nfgi(t=#F#=X$pXuAWkxT7!PXx}P$C6!hevx((-DyXUFFcVQR&*j&CqoSWwP zjItU;Zw9<8pFD>Qb~Sg|R5pE9b((qzKAcbasKq{iJy=K@6}v9aV-{cYIi`*uTB}w$ z7X_JU%fJgM4F-}Q?;eqShtEv93EKbIN3PY@VixIj}odn$Aoy>oqcKDM;^c?u=meZi6@@;hs&(--Ive(+WXdu;CZ@MD&; zMR^D(KL_trKX!^o>AKY1_ua^&J%)dzS(fqK?MF4bE|-MAw@|eRzHF+h4V?KS>eK1~ zG!7%!#omUaR)Cs14*te9@E$X>M0;+kWt@}S=riqXW0hx9hl<>R+T9x#Y#&gzPJCXU zUn|5jv};9h{v@i|N|44D+FxK#%RuK!bH82T=4=gS_Y91xo4TL+1z1Q&YS9BcRGP}I zYX{z+F>DvS z@-KOYY9#kqDj9l_B-s5>N8oR*@O)}&s>2xH!1=Lh>Vu`lYU4oUA8T!Vy#;tC^_a^# zu@wu~O{H$nVn&_9tslt~>8$hrA4~TE9#z@A4SY8Vy-5cF1w;^#-UO81i-3UAL6Is& zdV6U~lcLgbVRDs6hw-YWcT}>{r=avHrXVbWY3(Ld+xbsp6B@a zg@lyJ*5E>e#alUS@kV^6gpcvhCUk=bl$OPEWljIOH59gd%H2L0kI@q)PhFsM-;!Hrjo zTvN-ow5H*E@1cCOf*sSoj6M}Ah&?Vc&6_+DgIF%;rOokIKIW8QF1Q$78|dmUNDSx3xz ziF|X>{=`A7HIMH~RsDb(vOE5e>~_Q2sN|S(4v14gRxe@=aN&f;3Hezf3!V^-e=6Y* zx$Ao?{1(P*iVx>d&gd_pVB{?inIrzBpK~vnsv?46|26c zVE@IevpnQV4&+TadD9M4hrM}IZtK#1!DpuE?=-ZFNXEpZM`tPZ>rGD2d^Gye2%X3` z9<_o~&Dp3GOzIZv1+2j~&tRRI5>u%2>d5i$x%<=E#Hx7FLVG5}*<&}z^C#uBhS9pw zZEE~-q0*rh_HfM0+h>NS^PIT2zV@6sY96YbczYKwK4%?c;e_G|-4pt%MnA)leo?Xi zn~*4;lJlc@^E7wyfZymO8&o6jBrGte_j*D)7TbXf^_Igj*&A}TJ$36_8*qjW(nkhM zl0_%8N_I-fXIN}m2((B4ysaMo9q2j3yRM+;cY#td%bfL#xKM_~G>Ipn^$PX=cxT>S zjn>?(SzTI4P1&rjS^nnMY<9J)(OdQx{FJ>8(B2Zw+mxad^wR%XkvJ~#CV#A8&hu@3 z`@`&BAd-xF*N#%XK2pg2#l}Q?f68@kp?Z*U` zt6E3#ss@zHv?+^3hNS$T<)vDP9I@)WAEma?z63ZkNO!`bt%Z-K2v44GLYxJf^$JtjdfqmYx z2SzmXwtHzmknek#$UNfSxzEWrv!TW{M|t-q8}2;6R(D;;-* zNzZfP-HFtaBMG-;yq(mgDR%N}l<+6J&X51jlu{2f4q4*oQxJmw>se?w+B8!h+5bBn zzm@*Sy=X#cjx}f%V8N-#?<%FSvH7&)_IjHHL#tTld|zaIoA_Dch{Ucc_2MR99_ck7 zw6no7b?G}YT|Zi6M;-qbx{=LbRZDeTCwhK=Xfy>ITBYZ4)LsS2u&PRIJ_Js0(vOW# z>X`IW(i&Z&={Yb2j;%y=2(FZc6o5o&M3a8Ia!y(p&G>+Pl~wPsN1OZg{- zbu(>wz%px!Zo=H+6zDDq17z}#@SvTPw$sr2YQhCJJjI9hLGu-UGEVi|%s%T`RkVlb z)njS;Mf4Z<%beZBb5b}#{V~g0hWz2B?oV6NdcjQ)ptcJCaO4O*wzKtm_v|+Pt}3lq z(h)2#*hjD;-SNH^hdVKz+4xa^SkneBHEPMay|PYTADI`YGv^NaR=cqTEs zHR|^t1^1%3V5;*J{63}jx`Y?pmE9l1I)nX&JBY6tdT~FSaL5Sv+xdH|+>b7S@4QNn z-N}0jnMZja_fRV9Gj`SG`!!TWzi*l2vAD z%r#UmtmC7XVm?zBM%S15U(&zsg87VwIv>-ue}wE0@q?1~8-7Dwzmjcku}&rX4o*z! znsiKkUxcbT%8bPk8qu?==W#g4ZS46CE~J+k(IMh#xVf4^36tf$|EWB>!RY$( ze*t{@zxeff(j!c_SE6CwihF=he1Q`MzI0cV%@Wxq_|e|jnugnIkqLY#r}w(beo8fT z^-sd0fl0k&pfpJv^s8UPu`|nU`ytRYne7#IMxd#sRLS0g%ok~m=hS9b>C}m;+TeZ< zwZz^~5&7+-HIE|f{Gy!yxz271Yhrp)>Q0y&s26#j60*ix^McV8cu@g;p@o#9%w`=X zhW{tC+_2|mTUEg>^ZEtwpwVLLaC~ka(N48G)7ZhzwT|pD>PQ;ZT4F+` zWEV~O?c`5$X#uaR=nCWImtpl{G1ruplT4c|Rn;_9AK%cce%Jk0i|a1#w@+d({i!se zyyic*+C9EQ^o}0L!pLVP9$t(*OiENkt)h5!#vh+F<#LXmx>V-wZz8moRla#(HqaJd zSE0^teC(JBkKpl}mB3fUS|ZkzMGOY(6+zU4S=ZGO2>C3m!%W7m*>Lp80@pRd>cPdF)D)3u%v!==CD3Yf+2 z0+l{8|8N9X3W>d72Bta|)Pm~TUWV`B(ITOv?=|8$Y)^&igaLuz45 z$K#1P6R()Q+Xk~gGKn?i(KwSLL*%c4G@ucxi)no3b6j!1$)pF5YRZ3aiMGA`FthoO z*OMAhKo%usHh>IZqy3L5IV1M!d!kMhcJK#=`6T*ef$euSzFxP%*jp_Pfd)|CY2knKo z<%dhBaNL=ZsXF_$Wt_0ue>+>fg(1~**Z53Hck~8>b_deL-$Yy$QKy(nL_$WLo z&vQNu-M2cXO}M>j)h#A{azUbjar>+<%;|nNud~n>?qB@}4LX;YtA_`^K@AGlq0cr; zJzxDbCt)6~Xo~L+fIv;n?G=#UZcty>;0oQ{RW%2lai@vcF0Mj++?4Qwa9%yTbuwyA zb4^ERLtXUF?o(-|MHblsubi2pUqn_v=#xEZlYLFz#9xYus@sq5$@M$=$XuQ>$b3gz zSkw@wuH|zby!s`|Q5RnI)}tMm(oMPTDIBPS_*z7(zG%kbS+&_Pmi|$O%q@@gkGyPO ztJOGA%IGi^;xExHG?46ew|`Tn-D_W`+!X6K!#m{Qv~vDS&SZAn0vYX0Tsr%h)_^4a zA=85R)qLofdgPuiPsW7wwAS3>>?!@D0(ep$T7E_dlqCOORPpXqd(5Mv^@eE`F~_LC zww>KaSc6lFN1Zq0_^zD*DmZ>K)jT@%KN%z!oqr>x<`s&~UCPmHx@>v-gq<|?Ge)cx zmFrJIk@xvVBUwIO;(2qf>+r^@@>d@gY7@(G_0+a?RVPhjeg6rRrIlhXSQD8|MfZy7 zn~(8@+lhbM7qzw(flKskLi6Eu8rf`^>F`UqVuQG^ ztdL1>vc7YC2eY87WTZPZ>@spy512g%&)#VA@vz+o&SQ+1)gKoqZAa|(xS4Owr+)Nj zy{gujB}@3+I_>tdS$h0oQ`|}H{jInZ6#Zo;yz8s)uZB{DCxt#!3Dpe!Xdji{urafI zvN^J!-w)R5E1+k6oPFN2`&A=3ErWjAaag-ly*?rqTa6PdBtB=&W?>avKHTR?>w=!r zB`HRcd|n@^nVv~6)$SBHw1#a@Qd3eST~DkC``Z7QRu|Q!8RjbPRR?5M&%R1OTB$#J8#+}qw=q2KowyBZ(BR(81+jpZPzt2O6a8jAOgSqHrcgqDGv8B~4)Ufe9n2WrFjM@LGkb{=HZ*=1 zC1fF=+9-YwV3Mby_IZ=oXW{g5(X=mqj!Ji^%C5PnEF!KR#^s9NYXavz>uj3CwybgG z=!^eS6ISWocMT^~oo&Tg2ZtuPpXc+|Ye7db~U2sc$OBqTaH>I&wb2O=E_>LblhgM$Rb|{^GMry-6_3+M~VN) z@i~)Tg!f~T{->+>jcj>0sY0Zp9TUbz_S&B$t6e6#QHj5c?xq*zF_|_fw8MSk9@nMm zud3WEFpEmDYjcGxAlNT1+0@eZe89uzE}je{>ijgci0!UC&>r)xGctZcIZ*RtatWT zh;zbzaFbHt4bM4miV)K-h7TXzoY&dq+;y>pSxk&eQ@eg zs@J*p!`?s%IgedumhT&gx=HGkpR8NRoOCO(BOh8VdgJV1_lo(G)$(SF=pT_zVr!%Q zNiwR>y6K^9hD7P@($Rs=z8n(@wAl*o0XW1p|H^UAy<3A>zWO|=uS(>7+-9W+3N)Z! z#MNoK?ODiu1~wmIyFKw2dD71~&{q_X8Gh>xaruJXYtqE;pdd^%lhc4!odO@);c5i; z@GOkipA4O_V&Lsi8P@vU{LDMndzZnCe%EW9Ob2|FHy16TD`YlZ9ZKN zZwIrBL!XrFa79ISC{~?(%|2g>xHYjl_b46UpGSY;jv4WQs=5S&+(Bnu;yp+8r0RIY z4AtLNYtCw!0R7ZlQ3`hw@2yfiYTtq?W{Z~6V$3=nI_!q2NR=bF3v%l;kD!=3T+ z(O&)&rudZMJ#G2TaJyK%=a^4nTcFmT?b+K2Q?bT@G5s}{ymlGNuf(f+ux(y{=NBut zMzK+$xEgW$?M?J%cp8nUWcX`)6Sl+||BGg^*Y3B`YW4uV8i}{(?ka4kEpDAYvfd>9 zApE5=CX)hQpE48rm2;e_FE|t%=%OBZMg7&x`3LuNZ^aU?L!ZIA0q^R&Ef;V5DQW+z z@N=_o0~+rL3e;LSeO0CZv^ef;*5MP8eaTc&LDf%BS@lahrrj3*74hm(uHh~-hAHf? z&;Wi;rmpSNxsG>__R6~OZ{m_4L+k_Wc2~B`NzbSNqngHdvx(0JP0SS)CW zY4a|)LZjHaju18WXxs^VMtmxMd-BpEaevA8OZe@}czkmGsdb^xP3Emh-pP}Sx#$?>~0{#-^IDtkA@5KBVs9P0d(x@xw+cen+s z{FWaZs-k!MnoRaC%-WF{vQoRIIGfDo!5l?lJ^azK{c$tirRl)$>YZIzanv(&wZzT^ zNxDPLRRBxXl6U3&YR+JM+#rhJH*rbkj7m7mHX>#eJIohBt0D8|Sgh^kA^T$W>8B>x zr-{M7dPxm2g?#w%X@QpX* z)Acl~ut~xudNPYbU)s+x8hTz|f3o*~3_Hpz_jI!-#&Yu^SM_2Gm>h3qUzkal;2KDD zIF{WXQr6O#Hp`rlN<|-+kcMXT(2iN>bQZVLyk}Ys(+QG29e=^v$a!Xz8`)9rKeI%O z)H>Dd18|leJc34)J(N4NMvOJIKhR~qGtOMd(~%O9eYi?LddQR35B;ikeNS#`27PkV z#crzAf23i5X}_xZruk+#rc>}gH1)cS3bG3t{ecH$FauJJk~>uW@s0i19()@K7my;VDw0xq|V~4hN>kG9qo2p z=J@Y*QKnNa+w#r4IQ50_z3|83b*i17w6wh81GJd8&4W~s*RDmc$on5y*-(#q{E#lO zGBSXU^DItx#mwVUlVjZ>c5yYy1NGTHc(ll*(NK}pM$KPc-YTK)e_G|A&x~FH(N}^! zYrv;=@M<*8X_@_LPbHqFrDajww}3_;Vn&zr^UKnKCsFXu(LyTWjB}&^*b%HLq+Dyp z@iG1UJ`nT=>#Os{<##qgtnCslY4JYyj#I_%!hmk6yRz|{GN$tCn5Ai^9(&2rK>n|& z2Fa@uiRiWciaUNH=XZxt&!}b3$K6!ZEH$b8ikba{xDRxFtAtzHJN}VewwTgb)7}?X zRcY@>pR`Wzr(k`P3brI|?W*a_FI42cAZ!J7XR4&flFlby!U4D0HSZ%B^A097L|3&p zZ0g~8Fa9l5$$_#_N!z<-9)7?-PF&zeKeM)hr~J3iHH^^Y=ts_3mq zJ)M|I-pOA5p%kHLw66Cy!LbXo4nfXJ;aW1=80zCj`RyMy+f(>;b8K>ym4}~MLADRe z{zLaM;%-G5dTeFiIQ{?cBz%e z)2C{NpM%u@n7~?!pS4z!k)fnU{bxT^mSx259hdKU`^gSIU zoo;U%HOGob@@OQ|UZz+dU1st-9O|ayuni7nG1c1*etrY7<5c1GSY$FB+U?vP!RsQ> z_a%`wK-QXS7Hgqc`dl_&h5;>sOmjuu+c7;GI_-@1{<13}vskN*=T<>wV7+MC8zO{CCi+Uv3qkpYD7ck3-e%?)X zt7@(2V^%Pn!mAgm%UU}EU3>>cp^qcGIo)7RrV~qrW&0&+k6Lp5<;XQv$9ufLLgX~t z*!5B_s-1L~CD!Y|j-U+H<1Kk0%|lb==b-Y>^p4#o8NT=NC&zC%$sC`^^{>Fn_b*mkisFn!{t@ywU)I+iOY@ z=28jukzsd6)5*54hx)jK#I8_AJ^ilg`wii(w%JR^O0DGS#iHfBYBZ>2n`4J>$zLmY z%};tne_+r5(Po1qtWWe%g@0Z3@vB_-m8>>}9?*_;3&HB^ylA<(z1L~6Ipa3S30<)H z$Ml9auu;H`Qdz^eF8YHCc97L)`R!fsE9GW_iBRi$k{;R#<2$;=SUA*JPvl8e)_uz1 zabC661mp^c6zudkkFU&^<(5$3*1(?c#ow94oN%iu#@Pd(nhULez=>cnkT(C(>xN^9v2pAk*46XNvPsz?H9=w@%O+Q91`k4-v7=O}rJ3 z`$z9}hm852$$?gU=m|RBc}l}4G>}fgdP?^kJE4a@gI?4)TABKH*R;cGXx+<%QPD`8 znAmIm%KLay`{3Rj?35zuzr;T<#(n%~9V>leieaA0?E{ZR6z&!BdvMR3)2wBjA+eA( zwy!v*IeswjX7h4*^rE{&%#}eeM#`G@p5XtVG-q8*M{lgo-Vy7pp5{LTc+fWLbqXsm z>#H~>vBq|aNU+BGN!hBFYU4GLGz`W}(pP&AZodb;C;DorwH>cP>)KYi=8G>D|6g44 z_q_?1>g7LtERIi@^U5SkG*%r>)|=XERaJ1`!#dVf zPSDZcqlQcd6Kdfo!7S94@UMI)y%ivJ`N049%$I!SblhcYHPT=>MP;qp`WS8So$gTS zO%WB;X1!G?ullNq*eY+8dC?E^SjjsIMW{6USKu76f7@~`zOOGQ~nl|vrra}MGzm%&G<@tdnwOVb;3Lhh9G z#i)*Ssi`>%YlWVO{|(B2Mfsi}=f5o0@~Q2w=})g=pMey$@}`OY zqr!X}`jMVCLDsJZs~=f;{w*bI0BOM1>S=1pNtbY0&L;4$Tlr+83H&&;8 zgC}0Mrs#1NsHN)ah5-eui$1`MK9l_ej4iR>3}UgQ6{?U%S88Em%}Ml$k2qOs)SeRQOT-5s&Lua*g|_ zpB7t(zTcfL?wNtejT2YJ|Jvi%LsTVG?f$e-7GEC2?U_*fefa&3uSd#Sz5L`AudCwq z`Tbsy=Yx5xZ{)Bkw2yZ7Zz^h5CfJj3JGFC?*`~&!x}i+``lx*N0W@gKN>9oy7jf%A zPwuPR_#EtrSBdgU3z^%kdxzF?V-b^^;9`r00Vy-e^FG*fg* z=V6Hm>!w00p*!@*nd~=-_=$e?NJ>Ztz4w}8rFd*tgPia>jnyFuJSvVNoeYMj=V7^7 zqXccKE=8!b*{X5+Wy>i}za~8?USCxCjj{jW*O7U4O8J%kkEh zOKm+4v)!fh5Du4uo;}0EdCynS`dT-Pmr@jp>`mI7G(n`)S6gMm`_4g|^|JhXG_wAx zvo>aD8$jk7v06XqiZr4@w#6X(sn6bn?q7+=GyEwX>(<1sMv2<3NhvXjW)!JKra=Fe zN2|cV_f7C!uzIMB`GU8tJ^O`vod?V93O`qP_kYSf{ zKO{$d8FQi4Om)^Vaa2b=QqAWwDvf-m@l#>d*ZI&7_|eC9KNu_m>xjvhZhe7~};YOwcL+4_{Qd&m5sJ3338y{5)212T_OJTw5Tg6_KJzG=ghR%6=Us8w+*sJYlh$YT4(4K zPLxcIAN<{5edjzG^sv=2>0osOn%-o&^(V@8dOB7!%yzaq`y}l#mpZK-J!FA(pC=)9 zu-32vOc^O_uP{e*6i0fX%b!C>qm-Dd$wn_?(9NlBL7%K1e|pZ5&yf%x7k|zK*EcfT z1h#HUOUtIVIc_#*mYmjDmk1>{YrVkdV_2{gjQ5Z z?hl(!KLD*4iJXBH{-$QIO0&x26pmD8AS3j}2ej!&iHV8vyd|TbKkao@p;mj!$5`v} zmRW~?G%1UoYXd!@w@fT=i7bQFm&{e?HR;d+JDV?yox~fn!RqEQtUg5p$zay81`O@b zn-*bsd))i$x_C<~I-XIZS7)h~SW*|*@+Pz%qJA63%ZAwPpdVl9rnAu+*Q^uQ9riTi zg%x6ZfERTMVg~dr5_3UF+{K>^b~l5KFZ(U0jW}@hlzb34W86$7JM7nLW?Nhupsz zrgy*~hePW5yl;oOiNCB6%1y6sCX(M#FYkud30P|#Q#+Hri$f-5v+JC9q|kgGT0@h) z8!Cgx4brdqMxB4#c@+~Iuc>BdIJWSgi|VvED3r^jYjJo}2^IzWVm^;^2eFqQ7fLI` z-_SMrNu+)3=x@@kis~a-TuOWBAE0Z#i=Q^a!cyWxyHtk%!|=<6&e)T5j{CAS#o5xj zf9_A_!h^Yo<~kC2)E(E8?qkG1I=hcp<$op>+KH|jI8HHM@+8Y-^~l6$vcT|Mvimb~ zd?hTrnatOV!Zg*)@ER-qPbL+zx%tbYc9Oa3&7$jH(N$RPe3c3_53fFA)**f9Aq}kp zwRj+;T!WQdSARUMW@_(R&omdZS10Yhbwp3A&70sdgT>j0jt#1j!?d)kveiR2OKx^C zef;0p(sg%LxoC~+F&Mp@Ex)9>&4APW_*NsUk@BnYg1+|-d4DpjZUU_{Iet+YzH9YK z1M3;%y|2xfVjys&6CE?blStLo}q@VlcNlwxReOEz50C6W_DqqXITD61(1wHD+L| zcDkL*=vMb!x0=+4_aOEu^=p3bH_+6+FeCd1tau_e8&bo1)&4MO0Zn8F=6H@DJ&>)^ zs`_(4n?(;e6jOl1-iMl|SsBrs4-%|O0G#_f=FFhT1l4pL5QFO-`i{bIN@anIu zGaV%JSFkGPK{Qini*+$$c~f1yHUn04%9_j1%{&fq1`Q*PX(4%)q5r|zUu3t{5PLfB z7%F}`^OWY8KwXGaorhJ0;nnHe^~7Nd+5UCY)WiJ73`oD4miCLT+`Xi-EZ+eqn!-Nc z;qZUMqkMGER=DGPW-fn_U*k>9Ri&y8ryQ@>*Z)WEFJd0*H4NzkJ@@_L3ntVu#}$P{ zFFWIrwAIBtX^WZcqq5vpQ;`4hooHOj_^=pDV!_+|DCl(r3}Fp#dY5|HO~h7G$EL(0 z5A&lBRQhe~vz1f7?ifFsZrZYeDlMKyyv6L*5S~;@1#;8c^Do&bxQBfOdPtnL4ZpC^ zQZX~etU@R1V;!;NZd15Wz@Q6?vH~iMXJoiCzFQLlwWbISjMcy2$%L2bbJ_T0eYM|c zU4spC9U%4_&UqkI9!mKcA`S=0RXre1Tl;?0Q>B)M)7kjVeQUIj$y{sj zt%>?U?NrLe!+%<}^lfOrtMY-aLT6o=;-P=68`^4;XNoRbYkS~4!-wu;bU)ya3!rH~ zXk8!IdrH=i%1A-2zSA1VFJ!41B5w?9_2)-DMA7Sf>2>U>yDFuh96y>JXUJvCA@v@y zb=hyH^>@nab#%rZXVXA_P{D>NFO}`-Fq97R4eoId2dO~QABy{LRLMS2=|2Za2kHW@ z#;^Z06Pi;ur-8E{Bu_2iJzMnCPO10*afGnL)S@eGd}>@M89#c2RbGctN3fv{dfjtk zYe=f|zw~t2<7(pt`eyCJoz0&=Wv1~$Xr{WXaj1={#;oQYexVmnqZ&7i{ufDYf8w7+ z*ZX?auS7Dk%mu7?10ECHFLnTnv}T3c^o{b^P%)@oM0N2j-zn#-8nReRG1gnuO|gr{ z3Ke}&vpi&*g0!KQJaU3ry-lot6AvmBO-13Xq3#*!U3?pxMX%wy4VUrP%DR85&K}nr zYKY5?(2rOqzJ9eY=%a9o*m~7K3+up7hREyF%m6Qz+g6F9Z&_nA&a(wRZBn7EW1FRr ze2yvPF&K3>JgB~WSO^-$VM8aV;Vbl0M)1+P&^n{F9w#udg=W7x+1DYTdy8Mdi9Ufv zongUK(JawF%s77G8u#KuW!Nc6p8nBZxbq-TU-(lW7c3-`rNI^NU_=+yvM1DMzpBrU z`23r%uc_K1iOHx&`RGeE=qcUhxLLgE`=o#5$->m}uJ%q@s`qgf8Wk7egRs{vGDmVe zbtYURlX5U8!{ z^$C5U3$(`1#Mv7Z*;49{M=*2`PBcrGu`8D6-cov|cia>Cgmu>2u)r0pHD9c~2eT*9 zHpYpx@i7~`!QTd82&2t3yl<8Nr|#~!8PcC{pR@b1HD_(`tU$|Lp+|j;{*e%UKyQ3D z`noxXxvtZXusWgxQrgT@SGj+_l~%z%6mdEdW#pUJ`O^$neT!P;vRs|c%w0)1(}Z{Q zl;wi?``L7$C3y2nUbKeoR`aYc;PV32>l9kRAimcI%2!nBWnro7&}}n}o1%_w$!Bxh zclBR36($7rJTA>T!BOeaw19WVpY*$~x)`@>ou} z{w1+C6))Oj?NG?h4wazLfY27UxvkPK2uWYI2iDurXq8I#Fm7}QyUrMwnkPLiTAo)u zya=z`sYYHGd);yA?pSnZp3+*jYA7x%y02n>x>-v7va8tiUS9JFg?c!YZW4~O2Ih$W z_L(_{!SvYL*5hPRyuLPde81s>qXe0Xi@9pgBi6oDv!ZXwYmx+13q-Y z8E&FC&Q)U#gC?)?kS4sRhH1RYkUPMcDsp^Xns%Vw_lm{bXc0DFKVXyS{5>hBx~z`8 zI0PG7uI4yvy=zuiqp_~<1YN0Z=5_9?J4(57J!F!_yyyroN)f&tdd~b_H&=V6?$&0Q zanZd2lE)@picnJ>NCD~KppZhDTT_WBJSQ>Mp&u}Ij47)M}^jo7P7!R`fsMe@|cuw4>1>*pgZNB z1ld#tO<~0Zlh>Qf^IZ!+sT!?I4|~Hozr#kKK%n(7XeZnJ0Dpdz(Sn|KfJVz=wwsDA z4G@nlAy8>inkMcHd#}{@7-~kKy80}Y|8vkf^VuSvE5o67)<=%Uh(0wPxSyhSk2mF`r!}ThjiBl+cMsp--aaYivkJVtt5}-f*X#$4wp9f=a!i$jn&8{ft2d>g;1C6Q5P{*J80&a4Eo|0a){JG4(%>VWP3W zpLFGQFULKH59O2blZ&&oO9-6m&^JCpminlS7Ec4dre`! zOD}3^ZsrLSvsX++eGM_*W~r7Yi;GaPQ8M+~1vc0Nu~)OqLiubu^a=cGA{A*e?QMpf z_7R({qniDQk^f2gPN9Z*R>jc*3XSnsSF_G}v6hvV-+M=%2+lT07s@^7j)s>xv)>~(Y2{xYlegvY3f zn#s3M%l8k=I3ALTmzgUX=Xecv)U^Jokd9hBq_R%}rhv)EP_?Stp$Rx4dM&s%t!a89*)SrtjFvqoe1Y)v~?R zBExx8kmrIOj(5s`7pUJs%~3+d(KcqEAF!^7ozTnrkG-(5Pa)75dQ~?0{zVZsKGwtk zRBWAef2K4t+4C}UPuG5qZt_;z?4@v;7+weYzPj}wt;EzDCSZoE&c@@~Qz#_wve^{X z**H947@z9Nn_h|aJW}8ZS0VmBf9F$wZ=}E5g0f%O)J&rJ#sj=}5v8iPD62$IOQ{Mu zLdE)sV$&Nds!TsltxI&uMAS-}&KMl;W!bGnY?c0Pv%iP=&)2f~JaIP8F~Dwp-P9Zb zdv52^k)^uQmikjY-iA;gdhJ&t?l8Z)>%JbjA$1*$bWjYdfApV1)(JdkEpC4`+A8e& zs_a(Kg!5}`wMZZ0q#j7Hze7Eh$VkU3v33e?jE{?ipMfgDy~;X6pW!mwWVk&?H+w#Q z7(8ZEUEhI6L)h?DI8+CRDyTOQ7xzfEKjLpKkNwStyeM1vakGtoP=Qyo&rt868kH!O zeF}e3!!DrIbj29Um=cSN?$no<1F`$4*6L$2g{?nGXGY;JW$e62JM7r2j@T}zZ-vm? z*z9{g_Oq{kW5K`qTzuquQZCq4flXSn${_37KA?SU(WSnKcct;4%Bk@?vdt8A$G5!c zqHOjUWPIK#=5Fw4dT1(+vJtcXgW8_K%FE~M6xKn!y{+aCb}sy0KkXcBdLZu7^Q^qs zQt=p1e45<~^RZ`qF2I9w`~G8o9TSaBGruvG*D2|^+zOn}PyuNEj6OA?P+%y;t ztq^PHzjQca}H7A*WtZc zbv-UcL;7b2W%@;wnm#I|YOInudQ#o74tIP{6!f9#G{qmwv(1xGDGl6xNO}HC=D)x` zr&+??%RIJtzRmY`^Pht}?KhgojikIXU}dF~xdV z46B!_KaSJUQeh&MV=?wV2DuG({%ykXaUN7B*8P|uuYIXLJHmVJ={shXuS(!Kfn8cd zrEV&aesFm(t~eMz^^@tl6BdF%#R zVl*784T)00$Dd{Und*-~@5?LOUr}{`&3oR$uU`@yg`iMW=lwLbXR{buB453W3yp@! z!90IInZCcrP^k2_pUlDomU+$hUVBkY+BR8lplGC(zcx`t^DTtCMjwAd-O+*$62#a} zlV16$J+cP!0>s=dT>#btL$<+%F)bKEr91fkk<~;lb1n{xAk&frOsBf4kVaWOD@CR zko8YOqJ6m0CRST3&#i#o%T;PC+2||TZ!3H{fIpq%VQ#CJlu3*R`$jca^$qt|mryki z;a*YQvyy!HHS-p8&B*N+^>NZ_4I{Gi@EG9bzdEOL>;>dgLn%LwG_z(#M>=d zbhBfEPJR<}mN~HN^QOR8K+3^Z#@A5EW|W67n9KY|KAQ$tyTRAm&Z!VANvB@>k3U_G zY1lz#J0seTi>#xu9{q2=zRK4gs_8PYWFawDgTB~Fw2l>NpV8@lghT(RU2{Z3*id1$ zVGC;PX!Xwu`&}H@8%n^5N~(?8sbMF=qqSBwpX5&==THzgs!zM_DF?kn>Hkc`ZDp&V z%Y0ef{iiC4*Pl-tcQ2gL41VU==YROkm2gZp7gDRNW z%NV|Hp6GjB@&*2TKNEy?tjoPAx4M4Q)o8EN9-pJlrZYYBhbm!k<2?e3{@$BKq$)E({Rk@x8|yY!3ihVI!PW-7dio*n*(8S@ zSAqV+3du!JcK%TShkO=B2U83sc}!79J~)+y*TiAsf3f2)stSC3_k{G0R?oPLgdnz}1rPt!>gbfrJ@ z_jc>5Tw(Wgy1ixO`!+f*Z(~ENu(A`eo=2jYnIc$iYdLMA_2=v5-}4mrw6bwIYFc|0 z!&}aADgW7{TX7NlOVW)Gb`g16?kXG8T1&bIMp+eZS)YR$q-UUcE;dXJr|;kgr`@q< zE7f2jdk^DD&0uvwD%t}X^anM_T-NF=&Wek(`&ime6FpPm&?{=C{N`l;(I47|Ur(nx zc9HF$cVxFh_MS|2il6Mn0>6w+1h2#kKUI-^9MiQwgwmhFpMW9lljSb3WK?DgYO{K* z)lWWKWHr?RYE)D|ytIy8H>`f4Z1Jm{kqS$z>Rk=g!~a6=JS^~Y^}^xbrjxn^a1T3Jvb9&p;53#q)EzeuBAE=PZP6|;X&ylv%6f7xX&H(NEr9Y^RkE{6>#T;F7J zTS?icHDzZsB>9BJc0!l4aOgf?O2-m;97T9iX)#yMG-O%qu{irYMLo+b-Xh}d4-vP| zj_aS}SZ~XdZTV11SREh!S9SkA6>pY2(HZk74TVBx9S-vH#h6iF)~PPuvY5TPrbD#T z^vpu@S0hyU?bM;wc~TM8RyJpzoOK>yhId5VEuU}UL-$}))KAi=RB~eqCGhgP>Wo*# z*+>fGLJ_vjK4}*tkLwB5l*M{u8gte7J7M+T)-PtqVXKR?VBTT6e)_jGt)SLVl4tV3 z(#n|LE282}S#5&e*E|ytE1=6p9DBF(J|KP$$GWvweZD5EUzWAb^OzHI{C+sLS)Ttw zY|Sv^FbvOXuXkBR6_^K3KlGoDsy)6mr#nHmXwQ#In`%yJf6L$K5bJ2i6YZMZUbK}} z^QXfjuh1*LcUDVewxH_o9(jYcTJVQzF}9S0Kc!=jHFFUjX)0f>~}=iG2Qqwj~Y#J|1nsMl|xS$-&1 z2jhxOWU@lyD^YwMq}hFJNA`Xu399Q)Kc>U@|8r(!V;@ zS;bg+_5RB`MFZ)B@A02t9np5)@~iW|1cPsdQ|itJ(e$`1_k>3t&vU3&A2V|vZ;jb) zR{C8w+{2$%;M7y~QhJKq+K@VrbuqUocYFQU580}RPG?2amMQhmj`5(+c>6%Su@=0} zY9jqA{<4+t%#qjnL68?Qz7jAyi~1}vw$Aq$t9~7(1G|z=bdDEgwl1bF?O~WIdj)0^%z&l} z-?K(PFZNr{IR&$_?>ocQa{f=OatZ!CfZ3@bPIic$SLO=tG+7V|J>|$vxy@uZf&@AL zU-iZrNWU9OFVkh30@HfRl6BpYF28%{Jd(+N#Wj{;9HaPhbG}qaU+9sp-XR&~Gwfuz z36_`CAVnx43DMKI%Vu_346n!Yr`}Mdl{l*-&MM$WMMYSE+qs}q4mm!Dnm!jV%Lj{! zh`0)VT1Tw4^07CM8V{!zn>G1Pw4GALKH^b%)H^l&*B+4YeUZM=`k@Q@A8Eu}x!5FT zf7y4T37S3d`i9(}6+@~BL)y~&N2o>T@`p9zXD_5V$pTk&j&5U!57{qC&-M`seO(it>qmX`Nw9ywFOFl=ds@NRlfI$ z@6O_PKXBy9RCwvGyLWXR@!62;Saeom_08N!|L{;Y=S=dT6NhODq3*Y<8o@FSLOO? za?1v_?0GW}sYO~)=Qo$_2dX?~V2-Qc&~AQllIL7i@!z9mM<|K$W?e%TR^WK$wqCUS~>YKoxA2;qPJ|ouBVu`YVUs+$M2(7QwFngAG>}7p-??) z+7r}}yW;B*yQ~xqQ?ZvI-?!vJRp50|87fySva<4-)O;twBkXyY7bO#Q>EKQd@l}Wg zD`K3D*{6%zWek*FXnpx+9lA5HI)qs~&1W0(-2SoI#*;ibWHP=Wziw<+zdtmX>-~PG zemx`CkYMEeyn0;KV|d+Hj7@N^^VR8rrM5ufAH>nGY;{Uaaz>;Dk5eKnm_PmzbK0Wz z_)=$JKDB7PiJ4xqT2qs6rDC;NW;Ol|QMQK{EmYz6cb)3EUODy8{!$rja~-FvW4n0Q zm3Yu&>ijFzw4EyPMQk-vb=3hou8B7mRmo;!jpVY|1C?07hyH@j!Sv!kzP?XEOYrk7 zUiS=pRihQPW9#9tdV##Qg9>sbl1#N+N?)j>toE)dXe$i5p_iA(1V&@;?tk{SUJf^p z={APLNueSt*ruXvAbok32wTgGessQpHh)V#i^7|f)Wr0>Cxbknjwc2Fln9glcARFv zJ+Zi3&jaVja$Y&R|1~*EnLOX-+uXTUF3G!Kc z@3*Y3b$YAMui|%moz>@XXbLU0AKY#0s3+zss@aOmRfYIe0T@&eLKkJ9vb?4`+clHp zyEsNTW}7Wp$2PyH%Wl)4vhkni{g>DDJtosY*11B#OnjWmx=3usx+c5ykn!K8H?D(3 zN7&_#ILkz}F2R@TS!>vd!ZV0%Ci1B{EcA&!#tN)?t;g3q>?`{18Vqr{D&-@!$}F|- zcv)}&JnQJM)Wfn$;Eb8|6Yt6h$FTVI>gJiW&Np$##@N|2)-@!Ae&a*m$td&8s|<$= zZL!_wUE3$&X}oIos@!}Cli7qvE){XJVx6NNm|$DEs+la;fLGOl%60fneX2kc{JXX6 z-W3-g?Dg-cI~McBZ(-4|X7+CBOJ`Dflyfy&i|x^-tUp(O9E|lmGKsT*TX&|3PT@W4 zs39lpz8Cau^2VyOrmWKkr+J5EK88f=McZE4>j>OAi!1#hw_owN?D+-XJK<+P@u2Tm zYpIItUA7&F553IZw)mIkqMTk zDMTT7ea2PaEDtThjo)(qJ;hH896N}nvJktl3M`-eo(F#ChB;68P5}{CT-;U0GaIl| z2dd%#C_PoJ_l3N;J2row%d9{Zy}H-@zo6P#iQ69*VgE({P`9Ra{mSSLw=u;#8Y+Bh z;&89(^{T9#nild522;J_J%084knjEIXF)G| zeM~1F1i zj_aEbUMJx%r}3EJ-rkGk?BINR@||E!NDbB~1B(l>O`!Sb!V@3Iqw}y=0Y?e=R7J!! zW!J8(H5zN2&kr}nu=@GJ`Q^yQPK7+6l&#o8)mMeNgTs>BkIei z)ZuktYgchHPCi>CcE08rd*M%@(O=*%*P!>`{OE69bWNtepa*oEz4qY->%ICT$3*`3 zhAOx*D-~1Gq@k!?R(I^gz!u05gRIMWQRXj5YmC|{;Do&|*75RbG>D!svmTAK5LT2* zEc_k0BQj2~(N;0G6z0xgr!k`EP5JG0NYh4)wGdxTeQx6GX1@Ol7Su6@(eH}J#o}x& z>+JRMcYU*9KmCl+NTitc(+%X#?jn1lDa$V?4g2K%Yj|uLbHvZ$Y%fCVK04O#$ueK+ zr0tjcuVP3EdK6E{MCIv6jpU?GFsUB~Fou6jiCJzbKDnIVtc1+V)vTY&VGE%8`z$+# zefrP}T44{>cx3?|ltQdsRtxUtx1Yf3k?`o1SRXGdFS?;J+QW+$^P*wADAe2bt=R=Du9&`^Z@PVZ@eyz zXecN*SH)oh9lkq;Jq-3vP(!>g-sU>yv(J2SH_v0X=Tm)ete*|=n$Ga2sgIRa8wKRU zG-|Sc^g51;;&07We<+g;cQx9$Dity79GLZe`TjW8AFPA_&@~+H9k(~XR~=FmRHdb} zjwq;Q&&ovmo#Q5%ZMp2Ukn%GV$C)g{jTd=uiKMYS=xtqqNxbMiUi2X^`pmPh)h>H{ z4Eo;x@Sjwo_bL8UmH)KoKmTK+g>1CVRl2}N$*meJs_PN##WO&p&7p;CFt>jSo<0m^ zFehFd!ZviSU2yD?uxN(kQ`u~t?6oCUe{7TAcfy}wf3MA+eGQSmkn28lOpwz8o#_=E zy)rM%#UCGr?ug|>Sj7t0WxUzg_OY3rbbR@uRi~TO9q&^ky7BmG_|W5eL;tBRk2$Mv z;q`py_?FIBFZO5+e}lbdUx*=5MT&iy80M7nxk4=0SM}2dqO27k>fyIW#%k70<{6KR zv3s=M?6A6`E6`pf8?6(@XpVgl@0bZ$&TTb z6d83yNE>m|%ejtVrHN2@x;Xk!zFLTBFNWQV*la$l&0?F$6xd+T^EX9dC*6U@s^90# zm*m6LQ`+P2Z=IDx_9qH*XHcK@Q{y+~O~uq8sZGyZmTA9-0iVcgqhV2dSoFM%oEtL= z<~GjD_<XJ+FwaCiqb>1zDGk>dAPGaOoB?JG~+zyNk>b^8WN# zeYV?Qx}ZV}<6Ob~Nge&VH}uVBU>uwH@&&!BG}M{0)X;Xa{y3a*IU60q=OTEwTNHT-GDal3hk1=gVs(-D0IVpo8oIdR8`6)Tru z#{pSw1Kn{cL<;UNGg%ce7ULQ2+y{%PK|E#%tNjn}ejENw6Jztd>I+J-)H{Gv0S^CoR<1S}5pjfwE*9gj)AJ1*97d(~Gj%ZBx0e5e-wP+X0l zEgbAw`#VqF$zwm|L*sdH7qM0oJIiN1T*NBo(|GL$de$5{e*m`fl87q>i!#CMAT~}r zzn%7kSt;f|koza;gbinxzGA7ny!N_kwX>tEuX@RKgW2wFd2AL-ea`!~vhOif$G@^! z23lPSXx&uRF+kNZmxVUdW6wKMP#vCykxgOcKvmLQ%Jl|4#^b!`E-ZS?TvQPlTOHO0 zc-@sAGElUQ#*ZdK<*Dp3O)O3In8ZF~sP=>TOb^<9Yk99O1S_rD$R$?e)Eig$<$l&# z%{tRf!}X_CH&;8C!5lNo__y5!=?Jd2UX;zHr43hobZ|{;y0%4}MP_*?0+X&;+jBxs zZ693P#7e6%q@{9y;7#*c;zN-%kIfeN{0ZM$rc(I|rf;KG{><-wXWd(nDA?~axA-c{ z_AiR$9(eV5alJ&Q*dfZ!se({6*X=3Xu?{t&2VHiGtGZGRav=1ZymOx(lG)XNR<5oA zabJN&Jy~ctESf0dW{9Q_Vb8)?9rk4`-_LvvL>K={bOrI?7-fLx-SEUAUL9y?AM?A7P(P?(0v+u!Y^xLuY7VOh zi|KikkZq<2gL$G9>a(IU?Tc{eP5Ep(e_so+53`%}9B!pK7f;#@$(Tbz;3&MPC>8>BX9Zz3OfLHPi1b6>FR6`oEf#xe-Ze`Yo7! zuSK)&0<9;~7nWnMKf7YLUAG)O>4lgd^@I!4pwMdS^)FU6{-Xv-j~f*cYc<7AaOcfF z{9`m;G>y*$-TlRw;u82BRJ5POGF-sHXRugs|B(LJRC_k6tw&Ilx|<$nycyfc?kC)I z1+SfK7Ni>-s;!32uj?6Mozvdk#+YW@7d8a-KxsYpY^vBq%HSW)>5xd<0#8rLlmo6<5_Bl|aX^MBq} z7cTanH@iY7DUSCr>!872`u2Oz#QG6&7b39F<*(9R`nPoVPXyY7$te-bFn;z6@m!WN-t!;xXt3}Vp zka!OJybF8Y;V~27&_rGp=p{4RZlPm2@7ct%2k_3I-}+E@It$iSl3x8HUeTL<0v&A) zo$4@7bXSidhxb%Tu5E|Cjf6xC`Tb`8e@YzOwca3u3{;R+D)WKHtkK@l!!f`y%rR1J zI*Lz?@NBTJd&_LE;Xp0;TTRhf5?=_`nZ@H**ZjqUQ0OZv+8o(_D6DR6opL2O^thby zP&e zqk>7u+3Ycw_2xsJPgrt=SAQ#m?PlF$EORB28K-^*{#T{@w!((`>n%>htG{qvcJtw2 zjaO96=Yd6)vHxJ+VX${S)0O>_|NKA;yr>F!#CtN~dWA6TO1z^X|7au2ccVl16LCYu z(@01Z^sz@mreT;vnz+5%<9XJ}O(%-F@|XC)k7DL)ezTa*yvtig!+OvffjNB7kU)a)Jm~XEoa)Cg*u6?H^kEbm=tJ0!&zmxV~EfF z)wVr-zoVbO@KNB4(VKMbBs`OZp2r&3}f%f5EncymT$Bo-Q}^lhFcRR@}8p>zZ9td;CCw z_`)&Cn%LkyH?sbtB=(YBMvLl&T%)5N7d3nE#|_SRm00@}`&rBqLH)MCvqdqRErrml zMA$cCGMGj_#IomT)c;1(s>_1fwKD6p)II1clLdP0QdedtW_{Mw%p;zZ&ATd13vFzI zw;Mbf!}C9|zF{@hXt(1O?Dz}2PJ**(#Ys+8RskHj7>p?!W0ZBFR6}{a5pQW2!{<`I z{|t(s%zt|EpUD{S=cocjC@qWvRHC$k@J#_)m{vBmABsTu{Uq&<D^<27M%Jj>A>E*{Ps`p3t*cemb?;P4Dd&eB>**IR{b?*G20f8`p*w z#VC&1b zel76g8JyQW z3eWG5#DA?9xUR`>MRw#iJWb1zy$Jcia1EOa9h?eO~Ze#i4X=`{<`q+uvcI zGwidQ%D9rxPUpFUV;V?VahBbCc|;>V3n6#KuxN#>|30QNh|1O0S=4adi()ZZtxF5D z)eUGHSSyI0T`aZ{Dy{W#CEG2FJvPYoTV(!Sz6xfn0?v5JZ~Tj$C&2vdtX`CdR_Cd$ zd2D~4JCz52u72L7#t+_0qKWjJ7+ZPQF}UYwUsyCnW?LF#F9+25f5htigcxruATyPN zGBsJMi3+uqqa&-lCeL;D>{Wi$o*%X3M-5}_GQjBqkUEoiO%%6(u+e^4v<`!xEq@NB zH@0D=%JM~S+Fla2e}<25#oazKkMS0jy{nnS1|p)ASPODb0{i?U*3PoeA;2VvwL7KYA528m{u50gsls%3DR-FV5y7&EmERh%g{c@5mABIRMYnTXs&lXN@e*vG;KtgEvMekE3XCF=pn7=8V2~A;}9OXhlgzQF_;qC zz%Cnn{*HdXoptu{pTm@)vn+c9Z;VDV;tmDGSS2ysET%~H6W7zQjAieH0Vm84_`u*_bdx*T1&jecbCeOd~y{&%s zJ>5;ceU%}!Xe9s&ic#+S(O3uXHGKF;@fp|6)fr4?fE8y>cc zKm97_{~@nEz^gOx$U^L2jgPinP#TkpTQ9Y_?7o2FUnqYx5 z_(oj(j0Im}od==EoMV3HT1rH{z?15-MiaJZ!JA%Yo0c9gdES`KYO_xzuPN@ePqJwc zn~&7Mfvpd*`bN?A5l@|fGY0oNYo_`rFJnATD~ftYm-HKckoQ-+mUCEXq-)z1cWmk` zD)XghplfjNt>h3pShN2Z+&#}rPRi%M#t>&OuiEX|_fUL~@BM&-9~5K9z4koL_&22> zQU5-zzx70nH#Xr-!5#_!<4v>hqF{D!kF0tQS_k)H%)-lyi?(`D;WbxvgiJh(omR+e zJ5>6|Fzjn`QDP_=OJ$AKq=oe5OF`|5*mf0>S3`6Kk3e;Mo)yc*;;aZ81=F_a<+CI) zdrhnz#o4#XW=lo%RFy|Rne=6PUPa!VCpJfX4F(*LOV+xYv*okl-ghT?zg`TlOJKvf zWd2mq|D5d==zAKz1o0N^5wlA^-!8g>$4<}p#&X?ps>wNC_m?Pph*hPQ5p%ImaoARq zih#MY*-Dz%Hh6Sc=Dz@u zZed3e=o_pQ&m@cI#3rBMTlqZld!CQ&o?yWoI8;XHlQMjdRj;s2ur4yt@z?X8kJW!u zWwIfdV<-QwzW-aw|Ig`t1ozJi`0OF?a0A5rNFDnQJR0EWz(x&N={Yq>kcWa9jv((p zRP*0tsXt@c?F3)?m9>Hu#)o3~eA=_~(EMsFwr)b{MC%vQ#x%?lDw>+?-b#%1k?kko z@rz;LMj7o0RJ;kTQ;Ytmc~Euyww*W|?0vtF7cEmg?SR+EY0TG6%|;-02HYsHNPtA; z;LHoWr)Dho2k2ePQ4LG1>?fsh>StmW%f#!#qU;7sofKoc*l2|q3)V{xmOI<3o~z3C zPq9yOYjlG9GX%M8onx+Jq@#*SY#g4vBICF~Y7xx_N3oPTit*dV9>z;E`& zJ_a6jz;_S(X|Q9~MX$c;w-V*Cv>0e^HAe|HufacC@zUO~dc4|fA?vJ%g+F7}SM-I# zd^?wHR+gtX#!kAb2u9(KL4CHu`D~B%^)Ew_|9DX{cbdw`e{zYPAmbNiiQ?>0lEs2Y zF?qkRXHUubxmYM8bPsajJyr0ZEPaHPw&RQ|^`B z|9jy;us`|??|c~M*vWOS?~0dJq2-bBQ^yedU*2;;oE;TSKSG@y@Hoh48yw%tZ5!mZ z;BJmPS?#BocLmXQleIz^Lng>yC>CqAWz6=m^_`Q=!+qvI@9+-JVEGRz``NIyGO<2v z3p43`R3DRKGaBFEL2{7LACv{To%lLOu)T*^P?89x)RQsPwyjzd=|{j1U~+qclim-oZ>wX zf<~SAQbX*eVr;tQS!kVGZ$CYMiqpFeFgxJcfyFLDo&SGa5MjY=?O(F}Z73A*#Z;m* z8$R?jk1WsPbusofI8h&HG*0%MhpVooIPPf8aY>!Ppg$ z`3Z?y4>SJ=3%O^^ChVM;?d26mcx5Wyk&Sm21fL3UT79_fh9Ex!;GvOx+eE%~4%YrV zv}`Y4(c-9k{?+@YFuh6wMcr)8z>)+5A`$JNPv1fyo zFNUEmCU2V^n`J&gSvw1JDR+B0euB$ZV(I6hVeg{7uV5#KBd7LT-3&Snv7+VCGOxo; z`uD@tYsu`-=Xe{0o=4N{(db3S=z5|A^MX}~%Zr1OaYz>Int4dQY+3uafW|JY+|Gd8 zK^`3?<~@V$OAEK>;2i~s@UFrKt$|nF0+#E{aW}^kctn!|SI@dT02VDgxm4cay z@N9mxEIU$^26;P**SQ_<>U(UxI8Eh~pTpYUi)Yc9S!o1HWr=`tVmD3@5&eV&Ekc6c z=6Du+@A`t|@5Wv}g$zx`f_{z^twDDO(OJC642(MmvXckPpP%UB@^eRibSn>jKo0aP16W>w z)fb=L=-7I2UJ4I=f|gCj9~uox_mWfS!mP;E#vhlFP4iX{`AJ8-2gqSgjFj9n`9%Fz2NLIIL7_3wh_;6K)=>v!@kGff5*9+N9(ZpKXL5j5G$IB zi9a%$1A_hqd0yzRUdP2pCMoRLtBrH@sF!|-6bO|z)8I4OtJ?ID+?EvSs_*e^x z?Pq}g%Sh^D_+Y*9#oEDvHQ~ZyWUaDrkGP{)Gk51$960l3GB=OIqIVG)+|1FG<64fZ zI10ch)~++aNpg&J+T+9&M}y8Chq8tLGw?GFIR5b$AMJsUHsLj{zzh96)D>UBFC9T_HUNxn#zHgz zrE)|;c|hqbSG9{cb`=dzR^hR%s}jo{!4S_{8~n6ZtXJk%{uc%aM2m?I0|nc zB(^w!R2_hcWTwL$r-DCyA(E3dU{r!kK{Y<55uer(P3wond>muA|WZq9&-|NHwz$X8~(s9e0V z0J?Q0JY5ZKZ2;Eok)iG!_i{YVF$p%BjfStpp6$S*odKhqctuyjm36pQ?R{@BdIT*P zi`{t#37U&;tb~g;W6$cxj#Yfh zTx95Nju(jj9>Oa0AilqjuDGk|Oe+*(vo!cb`{2s&;mkQ)?IbvK6gn^nw(f-Ou@ZYV z@>3FRG1|`zDyiV?<3W1%BRhKnJG*MuT^NnW4uO_C9;N2>S$SW6FuD>;c1_^_PJFJh z%?OUyIX*(mmeZNGjpGzjlmi_riG0_B3)*E<%PffK_HR%`+o9mkwmi;hqLb*ZJ+nqxPQ4E8*$+AY?toy(~weWp~pZ zdm9m2GrWzeSd1&kS!JYVegv<7Gub|U>-UkQSK*@J$Wec^p%YxxoRQT)N6NrO1(6D6 zC_T2#_0Y#*A2IorLv8c_gZwTxo#F2n@w#lhK0mTl3Z$#^IgRhczk+ALS3amJoa6>_{CF7h4?S&*YEuq9QH zc56h|^!vi1L$No{q7f63Ciz-@TZS~O#d>cBtDVTx0p#Qm%yT$M)`{@{A!N+wcfsmg zkUTlem}4FY&E%NCF`DB6j$TOZ^+<0$X2<$sUe+;PNbTbQD6Qif7l6`qPa!9A(5Y}RR06R)O)oic@3EDKm(f;V&pELH|K zOM=y!!Ed(&o*NEEuflxqlc8Ed?M~lJdCrL6Scs!4T+oa|KW-2jFcMAB2cFKHe+GYi z4LWNXtz+H|Hot+)k-*yCRa&h&1yaX(_Ar07!u<=#tOuEuAoB$ogAc%Z5}4b$G!&a~ zC(@I`)%juTv{Z%;QuEvtbZjvdv=5N@@i6FUJlA|C;UXGl| zO18jGnZZP_Co{ii<9YAgkq>09K!)5EvMRQ|9=W+z;N6M1wJ%k(p~$Mcvzh~$16QxW z+HXUKP9Q^B@T`kq@2ew0&B3TMp5q|cdL-KL3Vb~soAx<2&79hL#=axeWVQLHuxV%U zw&iYZe`?ONL?)+r*1y}6WDeHYelhR=1hl8{iS|=iU+jgnw#TZ~Mv6*>d~9xNLw|5> zJK@V!R6b^d(IhPKlkoLme3!21Mr+1b7kgF-`697qIznGA?%lUj$pP3cR}m`8dGnt%V#%a!v-UPVm#;j)00;#XVrT6**dmC$s`7 z`T{BX0Dt`r@Od74`3OE^Uv&B=Vvk0Adu1fKARcTc{KjKov^C75J=br+MPtyjhpGMb zBaZC^v$ld??N6`5XiK3v1<|!U$Vzs2Clh$2L$9>+X*uO_?Y$CqDX%JwPhJLDx&}RM zh}Add>rVb)FthLkTsc%=-2@ z-)ITCw&pxti!5{uj836xXTr}D{B{JSTpP5LV-JCwY>LNM6TYrQ>~JN~R$)-O3vVj79b$GrM7^9sKq)dT6|AjpHj={!@5tIu_A*Z!}!}AY9!W zucG5$I#wmvi_FwujPbXlW#7U>?zcUSIR7QA*$8aSVECd3`e5FxIX1s8Bdx}Wty`CX zVXg>Xb3X9Mi|n`qL0+^kKU!4)O)MH@s0z8ES{%lB;&VHPJfyvU0gL|@7Jm+Y_3{v# z{R|Twp`R#y$k8b0b>PglAs2E7Ij$jS*{GmrZy`h0yB31d3ixOp5~5w(84$92;Wv(h z;s5>MwL9?8_Ml_mBX3KM`@Y8eDJ09k2=UvTQu!L*@}j@1R5X2@R$jD<~OKZ`;)!4gL;Ia&K z7NM8wmpl)F9c?esbOBC7@-N3)D)?~b8;#E%Wh4U`QFlgmBXL#BFj772s^DYRuq5(Q z6iF(~qbtJyrTM)qzscy=@G51fDX6vwU1N?u*hYPJ?Y%j>X~brqaah08A3DTbnMcpf z+?8MsuVyZrhWP9jSi(CcJqSWi1^-$Z&}M&5l=c;N&6<%pp!FQ~_?f%+RQHTIR`XZm z4sGD4A-30Nd=pR9*mV@P;65a^CmMYNnr+Uy3R(Ta=vg*o=nNGZ>x^r$EDNzQGq5$U zVRN1YBm2~PV~IL3*49`i^Ruo-uM`j}f&>)`9#SFxFBG^*Ia0bR!&o)YwuX2LZQ!w6 zLAoz&{UCDrH1atfjI4`)iR7+B$M>S^e_~&A;4>B_S6r1!abxuCM)a%~mgaug;)xJ{ z*nc$zS$IF_jAM4}`bFxNzR`Nn@m$Aay(RNX=BK{^AvIHb@80mwlYP<`)mC;#lCDRR z8gS@W7Xcr0GG~cB%oS~9HNi4`qB%q$Q(>cVpfnOLx)+-!Un>Lc7^(5TzLB;~U8{gJ zl?4&=wH{^otvt`V&h;8zRfktMfsNWCNuBtVUVPdR`nrbm=`Vtj{b;lK*01^YjYNtE zuxh0CL(QQWNL6Dl8*|M!a`n9!#l7&6>o8x$8=j1w%pkU!gT5_9F1}{`t6-efAhI@O zNkmOAdL=UE4ozQy(L6Bv7>uTa(L_FF3{lN6y!LzW8Sg-bu7|4|z=M_H!z;r2Mf-|& zpl#;V7ocl1(6-m{9G@os7>dm?XQAD{k)svbCKuHXUUs#>+A>llknyw*eKkz2_ms>} z_lRxJd(_lB`HUe%_rqXo`za=)&mSU1Um~|_`1YM##c_`G#Q2vY;ibsbT!Ynb0(;&7 zN8Ev)-HjwYicXAX?q4Q8pUgPl#io6PwtWUl3qaw^fW`74GfUte{lta*oC{}t0td|? z@1c&qhP8hVpYd@J8Vo)?`37@D_7Ww*f>+^l<0iWmuzS=H)#~+9Q^iMwGx~G8A zSnRR6iYQ0D7^fA-_KaKG-vFJf9pt1cK0p;PsT?@Utk5-RVoi9c9un6C?Q8?n-wdbS z0onsW{ozo9GM``$WFdaW>X4891%!;v(ovJS6fP)@J*$B|Yk@uM6!Kg{;i9L5fBiC} zd^70UrvV*z!u&eu+bS%YKD6w;g2&o9ahuCev78QnO~BgQe={7k2cP5W8^}jBA{SeY z?<~f5=i(YtW6chN&t|OI3apvy2&Z9Rj0v71x_k)R+#mM1oyfc+=(G+Vwq2n~fwPqt z<;Fcwq*pIB}zwueL`E|MK)*$2#;Qaz$kA#t4K+`55NAKYK=|j3+L;q+o$FhKx*)qK) ze^bL2Aw_maeu5Oe2fkB4=w+;#cUgM`JsXIgb;BoWPfVB`YQTkIqwJyo^8)H;zrsX6 z!9>epqR)__chH5G(Fyy~AApJa!bDvdZwKU}1^kkXq!{yG4eL|^CA}nBsR9U9LZYgH zVG^&Z$E%z1uJ$0*nMy%#aK8^7wmv-$KmKhhzn>yO-yp?5k!|=5Jxh(hmJ2yAj+VLZ z++2vO<@&w@p9M(L`^eEG?3w*y!_f+Ru=>KX zUC}dT$+dgUK&khTvn>E=jKTi$UKJl&00&x(+{T(}zV1!Q#+ zQuICueSsXULXNgzHGT`V4|B2wg6~+KIJOozwE(A^i8Fg)nFnKm9tS0Nymt4($>^Ig z?JRJZgCwa@cEKzNr_%F9;3~VdedRk?vPt+v<6WdSbeW^PN?UZv)W`(bNsaOmQ)|(wudD zWT*{x_%>`=Uv%Mq#xtC8J;(T74SYR~F`E_pgyVCpxfMfE^85nrQ@1_^y^oN&_mG}9 ziS1uQPoGCyM}W`$NKilgq1*VDwtSmAeOHBviU+RF1Q(s+y7ppCHo(@}{Liq!)6uin zndN7ZqsQj9t++d(_)<$k~lTWZDp1jNFu|WPXaCR=y?N)ecK`Gw;%~>dWWc z%jXTlFMS?sHUXxdfmb~*yP(16s!Lv zD2-!`lNjqXSY;MgY7Sa7FYvZi5u<-KZy_itL34wS%|M3ULWW%P_gwIYM)7IJuKkeE z&UmP;Vd^^Qcm?n&6zu&;*l{;3xeh5>0z&q#=%>7d6g|OVUx@wmcQ8il`tD2Bg7G&3 ziTcQk>(pw&N1j?Yedz`~D^I(B_zk?{Hs0BbPq;hSvZ0{^uXChYafBqY!LYry!4>W zZfogf^!Jb>GrALzqj9|34vNPDzx4y9E@*OFtYQ^fmy)6=SBP@LzET%miz^B-sEaop@?b$gu|u_G6O7GTi?T(n$`!Vystw>IE+14!y?nx`IswyLw{4PFGH z$#C@t*s=xKGIO2AufK8p8GNE_`27X&tjpr#)(Clh^VY@&cfr>Wz(&IvpS8x9(KG9f zZ=q-QaLz~m=!FY@rDSRr+ghRVJvd@B=YwN zQe^Df3s2$}{OVR{v^n64Xj&00sy!DMqG{UM?IGXz0~uL+W@f`eZwEegZyxQLwTgal zi8Y;D(X<=DK;AY7sirkYnws;!HP+VrY!6P>CdE=2lJD>57=}NjEqfgvng$Qq2eO#x zbuD=qYt)CimQ-+Kb~vCQS6POuy%xD|j8A0UuS>`X_GeTN;13UHoTGz}EoV;(Sq-g~ zS%38^p3}%Gy&V{966m}NrY{8jG!A|Uvfo(bqGP5gdX^iMA{QOS zrtQMF{t*v%S;+5eizjiIdmn|iJ%qP+H#ljxl?xe0TizZV+VE4`?%4+He9pgh!qVRk zLVds|Aw%{v8rx4sM&CzP=c8vUIey~U&vBX~BeHEjPbp-*Ix^n?25k$Ec4nS?bJ!31 z7zjO$Z#0(i>f=lXACVB786iql=ZrG!&Yq5pO$EbAAoMCcKL#y*0v39hnD}mFs3$UX zGZNGa|DrCotPVS@Ge*300c&tak&FzF=ZXe^dz6mvfm7SUqc z`FneiB)#mLfq~cr*}KDDcIDrLo(@GGUG-{IGZ8I&7lb|qBUiw> zv&42X4Q7Wg;Ht86b(bSWS0Y8#v1rM`U%8Qy+zzkag{SBKppU~Q#t-%b8Ea|D?Wxh% zew#;c^Z(Q!TSjt9+KXWNY_Rmhz~=$5?hg;ScZB(<=CEEZxUT|svOVX+xl_bfn1oIzlFoxh?pojQF^rSHwIno2132C zWcF{}hrjqZ`l>%J<5%;Z))&)~dB}xtT?DVF0-R72ZfMHm+-t-A+A1Kyt{HG$cRKvolh~1cAwpY?ZCOlSVm5s3N}dUD#tSfq8C0v* zdf0Y7I&x*{HYBA}@B!?DG}obasb5`?pYBLpZx9*?KKfOU!~3HHQ%^+8rZWq!e*FsF z{+{_U<9PrkI?c{N8JN91AwDwBufbJYt8O2B$1aSi53@fw=!s)}7VD&R*gG`=ws`|Y z)H_e(u!%fpUg#xW^*pb3e-z{TdqGI&evCWfb1V3$Pj;4f;JhBJIv_tCgXd(OtT*!JJG6!N z<(pgazPNJSdmQFK7NckSt6R}C_t`xSTW7%1UJ~@IG_2{$_y+KG8*G|Zrzgk2VEG>i zR@+R!BY!ENWUWW$9)Iq%&MN(C?1P`=sP~fNL_I_2+fg=dV$X!;L;6QGWz$Y9n`lYKRrRG z4?5=Eg6{?0N5E$k_>2Lc*TLs)@c9sY^chz&HyfFw-60Q>ifhWswOxi+R1$eN7vkPv z&CmnuTdrqx9p)fp;QnCwt%f{@RWsB7O7H+)L~_O-@u(*Rq%9Q_$&7A>5>$ggsxu#*@^ECSUB3{G_$ux|2=F7xnIW^qhqEU&{HW6p7reET3WF*vZ1cb4e^8m^etws#5td#_8q0`VIH zf)Bw&!+6)z{2Ys(Su=YZE}Df`F)!q+mxLO%d+z-TBc3Am(B@x^lo#MiujGoWa^-ax zK~ucPc8sVKBfEq7?+2U6NUo!Q6b%}Vq{!P(fr{+pX-(VA+bA9lL)sqZl}g_r4z;Ws zT6+`P+Xkj?gl|z3CQ{FeBg6T)imdqgsjz5A@oD$Kmz!YgZ?P|5F~4*0THH@%GAO+a z8$E}%nJat*|L=Ze;~q4wKUnnz2jed#r#FxL@SL8s>(_>W&_ihGF!c24Ad9aCk8v72 z^l{+ouh6pZ(6gVA;yvf|>_V(rHuUT=X40HvW$>vD4>d*4tm)s%$a-MU%o*Lwh#zL; z!$IIlkaz|}v@EY&00X2uAklxz~?z$7jJKTE;i(S8oHOXz~9fo2KWOJ9Iu>6*3{! znBTh0bF+X_XU5eNf7q_*!Eo+_j98@1jM!1`?gLK+Or8vnwR%SMkMNoY(6D$w$I#~QYHuk_i5c?}OB1OB< zbNfH7zuFIGUtuw%-F0$FT)AG+b?DiRVbU z-b3!)r-yJKSjzK#kiy&f6uotGnN7jJ4zo~=!=63+^e;irGNNZ^@k9=zXS>leE!y|! z+0qb!d=U70Iy3(UQuIo&*CPUFk6`qVAtOV<;z2OFA5`uO{|^KecY+@RHV>d*kHYdJ zLFXA{XdIs;Q@<0e{in##mvHq;bX&jLeF1(WRy<9e!Ty4r%wmBc@n$7t(T0rUI&{J) z&1k!Z?NAj&#TLWnx{A(?=)j%sn13~Ft#{3W?e-xyK@yMO9N1;=r zg4{fW{^=XoS2YMJ>c>ylA9n>I*L1eyaE(Vjq{x~_`M}kMm?5iYR;mBMhS&kRlX(y`(33WR#%{MIMr?%nXU=KoD{zd&I~d)5ambuN}Np*C?Cs z%z>WSBj-L7zj1Z;%DcvD1y{X@8J3G?GM=f7YXYNtiBWpr*r$*q8R>Dbc@#t*Mrwuz zof{k;`wA3f1f<9w?inB?4=v!(zgPoTi;(f_VWh}=Mx;lIE@l=lL*8X0 z_rJ3OQZMkenNu^&-O;w**d%pkFhB1HuZKWDMt%eaPn<*f%L6=bC&?h}Sl{q2b04>& zv&QzVK&TF6z6^f#k4Wxz>MpLWFdv(a ztIEkykmE{@Djde%jXB&O$6ntqXh~1F*7(Y-$h{yUE<=OW8o?v;9NPC0{AF0+Xz?4s zD~(%Rf82?mu1RW%o;5(vlF+k?aJBw?0oXbx7BvHG?FK^j?z!jx7W8awuxN{e)mP8V zUQYv~$>`bZNW@FX#27~Y40>b+$$j%ig2@Q9YXtv~M53NRx|E;iz|(A;dmq`$_!ejz z+kcD<%|nKkAVc5sjT`vp?dSB&T-t?rv{|qwd9e9~(KI8Fs$f(bKGmwZ|BJmF?*DcN zBX+(103_(1ASp8UL+2gFV)uiQSxQ-2TW=Sanf#kW4(&Shw-GX06Irc{pIQpGE`S8* zMAOotXXZeiKj+bW+Dfi^5sWM^T-_tuYYxX7} z11}>I~b)2{?6 zvV(g%n)_k!xxPfxR^nO9)z&v%@8Q}rYo1w=qDw>Gx(L@?Ce%NS(V7IlZq4{^{ELaq z8ubI8f#VZL$Rc@TeQ(Rn)?6R>gjn zMtbFH`}Q)SWvN1ZwjYdKU$p^@zQf9V%^bUzyEbhW2u;WCo1vY=c;#&U>~VpMM}fge zBqg3>!RAHKleJ#sFB5t6CK5P}pYI1-{}D1Y7jz;%KY-AdVDI-M%g5j%GevT>yImDv zHqED%N7Jt6sEfrBrR&fQHN=XJ8Av^(JCP<=jNcXTGBT0D`*Zk=fAJMYWL-h16Eb9f zOlxGwUhcZc=ru@c1$eJy$P!)375pm`?F!My4{)b`k$suo%gXh0_CrtRFefsO!*vLw zIiBPg6(mWyF$z<9wDC`Y&@&)32870ekhW|xIy(*BofYyQu1o%wZ?aEkJKuZ&EvYck!9^*^X<`W89Z!P8@fu?l~+B% zMBCpFG?bnJAQev~$!tJEimY?U(|U|;z}mQ@K1f~5VQgk?Tz@P#Qk)69%8ebVpPk?e z^{uxvryJ3;??M!7)=?kWKGtdQtZbxzEFURJW5H((5@Xii(|duMy%n!lU~BW;`cl@I zW`Oa>=-FKO-`?}(=-C>W=qL1SN64e?JBQE(;FA%a%tZ`Y0NZOMpcGvLAK5*lR$Rxp z+)eEkkm|x%yQ6Qt7MQP`I z8PF*T3+0CgFD5qAnqfYI6|w5DEqFznkp4ATo8>UZmmoA3gg!>kW`dC3(c~Z-W>&`p znTa@!2BT*mE?AAy%tzn7Mlt_-rwLOw0Casy1qfntO{*{i|q6^Ph{73Dm=A} zT%Q1Wc_r;iz%kWpN-(`Ri^ z^WY-0YO>LLL0={y4Mw6-*Sycw>)`S__>AX&SBp#nyUCz86%?oQ%*-G^(?Mod;Qu9j z?n*x2wOoFm{;C-eW3w}OL}`%i%t*Q24%R-3zzyMvx+R1S!E$5b3o#<*IHo z4tmzV!$o^SuIT3w#oFcL3g-n#k{HbjwkYbF@vOGrn06dUSv!)IJ$$76BqYeYQCYKp z6Rf6zvsKsG;Zt2t>OKh@_`Y9Y!2NLbQBZOZh4e^K4s40iu5WE_OP}}Jz^Z0Lnu1Mh zP;!OF&4G_@1%unbs4KX1MV7iEH^#TO1>ONfM`b?6@5S^$lEI z){)n@M~>`5b49xyAT?mR=rvx+w_SmL$Jiq?*Ww*4%r_on7Olf>VOD?O`d2c`i@|4J zn0M!2IWPvD#MsR}yC=gdV4}bM5*QhSMLVXAR~OAsPYRy7Ys}Qw`TX=#{dB)&GvBr| zaP{8cy(&W@WL`fnhduk|*yV^SjN)2GV-2K17+pJl-WYsrv;7@FLEi2NI-WOj-T*e< zf2uv2rZ29YZ-)G66YKFgHTgVy1KoqrwaG=1+RI_UOM(=e1M#2MEHcqn$;jmwvyfB3!Ho7q5SqX_p2yld5qyKcxPH?L+;n8fimP>L z<1(ZBrQov)?_wQuvW20MnsgQ5?xHKp0-f6}kS22c!ra898jM4msYsFkM zV-K*bZ9leh)D0Pm=N(8-cm8Ue(iz-t=3O^{RU33oPBV6`jRalIJXAn}tWOt$3G={* zS&^WNV4^cH(P3n0Z-|rR25Yg)8HH(=ix;&;)ecg|t-78rT&6wkLfr}Fzd zU?+w%Kxr1we!_3A09e4IC1AdSPt_W@HrOn=d$*X&JBGghflp*Fh|!tWEPr4kR}EK! zCG>pFnKooZ&9T*O!0CD(b!5Dq_^mUt(uHTb2DveI>%i|F!t=L)Wk=Y{-m^Br*4tBB z7fGrCzqx)(O;*ROy!73Ev!}uCDtX#nd_RJVKEsb#023`mPQ5d>@$1jb z&TeMO{@9b`K~i&VnYhNBTG5Sgp(~UmN7euHxD- zivD90&~bH|zgZ)*2iBg3cX{szXxJxw)?9G^lF$AIZT_Aav2L~vE!!8k+WU+t*?J>Z7~L08 zzfra>4?5PXuVvny|74J{&&ZreOC&}=yES;IZ*7np|Mz!wum$)u1)oNsSf6KV^V_u` zY!1`NuQY6}zi1u7`n~!5Ot7KyEIP-KqThl~w3Vw}4?^ED!`4O@@pCS7Zw~$gWWlk% zjYOC;e1q{%2=?C<{85gSA)lKBlJ<8_1)u4>`+a2aV~~zIw(J~JD@SUza@8?dp*dW z0^j|Drn#54ecrC4)ZW{(n*}CPhKxO2-&6v8%D~s+V;q~r{3{2_LqkU11TAXL_`MHs zEAUWm;%UzQ=I}SW02&1jYK3k!3mBUV{^y|W zov@d{L@TfeYxo{3_}h@7yO8Kl%=*oW^Ur~O+2UU+`wzv^XfLdOMj>d7$u`&u3a$yQ3-9nif<|g2VKrL z=LVlF!QP)iu8(k-g|Nb?4b~PLf3IXTUo$FejbAXv&%;>tvE}Tk;AEfc?fs_komx`YRM@w7mTY6%kbN*?Y`3);c5|dwMy-z~ zfl^(h$vCYkk6H%X-zbbfAxj+tH_1=>l`VsewMTOF5n6$3GcdAR=AAmNm{sF*DJ3+~w>-BKyYUIdn$E6^&h!J}q5bH&spgZcD zb)%W!VU9z2^8cAIxO%9Z*)8Gg=kmzR+!8*={KxnF^z;25{c5d*onNPsqSVNB2IMHIxmW%pU)#rLtx+yAN7yvj?naDVyJl`gebZ0!Y{uD?-y8G1D^#{TgRXtW z$jq#LhPHgnXlEfuGa0#g$Z7m$jH+#ahv(kmZ_|0rd%X62-t!UiHwQU1f3^_GSqd`d z(AL7zo8X{dkX~c6-?@sDXqi348IYjJL-shjPlpvE?}2Pi%{bPYbxp=uhw;kU4H&=n zyfOILO`AAfktLreWB06aTN$t?*^Wu~gSP7AdPVPXdNXso4vfBIu8qYPGwTcZDc8E!ryP?exiqD5U(#LrZjP#q;C-<(1=Nx`__s6;5XWXl9 zdT;q<=-5g=;d>-<9iOTUxt2?B-h94shd%z<5TChQbF^mig8X2u+U&m7*b0HK?HIQv z*aW#yZ>*!5J2ZY*mJ+AGYr|Z-*@D+K<@JqtUwz(RE9jW^UVq5g)qC|CHJh(C&tOJ2 zHFD%$PUf*>>pf_iG00DWDa;wU`-^t%OSH{c&D}cP%}Cy!#Ur`<{h)X1o{#mTKMPpu zE6xF#x$v|x*;g=-c}CZk8^3N0Ty4kKVYpEL-fCXD;1_uZ?~7rCOVKo=CjINHnC*%| zhV=EUSJVP0@8#yInFiqGJqg7`|Hrc-j~noux>yH{w1L{fs=TWrzgd|xK6VvX0lp(I ztmn5X!RCcye0G}aI}AGRO1>jVkujQ8wAGBtICdE$UCgK#fq*{XJaEt-{1mTnAyMXsluhFf^ZE8#`JH}uwE3ryBUhivl6G60jc`^AbC@fY zuPcI6HE^;c+RACYfKwe1(bq{vml}YVob0K6PX-sWlt#Yhr<0H*F;-v8^YiaAbb0tz zrPy8&_XM&|Z4N>%Fc)H_#=R!BH||kvjY}Wfy0YsVl_TrS+HqyY_+PuOPwC^iJSSh7 z_b~pIr@!I1Z^3#ENUcYP>=&@dYY!;tuezc_zr)&DdJxjL)+^GQxp#p)uE+DNpGa zs9&>ro$=T_uwBUe7xOuGp?wSTYhj@ce9zB(-_9UI?vrMX`cI@tu6CWL`*OH{fnAP; z7)3F-Lf^=>M3s;u`yZ}FD$E(yX59MP+H$#DxrwsVB*>OBrcNqz`qTDHiuF~XWv<$F zZgQSpm|Yg;s`OvYT%F>oj)0OGM`Hl(ONtDcdAB!2-_ablcK~yz3S$ZJFs_{$PWf4% zX+Ao*0L&Hzo_4=;_p+Lg)_w^xOF?EO+GUT-2EOlSzIPYjA9=|5%zensHfr<5M=8>C z)ZSRHHm9TA*XOGSD%UV>{XjWJS(0z;H%^@T1jcgu2g=;lU}S7x33Rn(rTH}DKm7{h z9KSIq(V@Mc>9J=iHs8)G<;c~ZMog}>a>q$`rLfD$JioD;yB8X-xfa2kzj-9rka;&* z?cJR4oVvJ(XTIXMr93j9qQAJBpMK^he!9j)%iwqV-PWk>l8b(kU9#pvVgw>z7d116qgV@*;F%`d5A#xC-7SL0ekev^C zrFMQc@A?#M=JMVJ$WY{=AHm29-OtF-4t{Ds-Mc<=^+_b!ik>@MW(J{X(OlVJ*6|AT z%zHJt@>33pvQz_E@(x#Z!NB~g{-m57Pvca(YxSSRQeVowBGglRZ{5SvDzEi>YY1k6 zqrErAH&>K~Dy+49Yad!&ZN3>bEse3P84(%V459jFw~?JL#jsE5TiyrzwErbd3O z&@-}A%xa@{--@IC55{WlfN#8JTx%}Uda8HmFvg9izbEm$z1r%fulIfW=zflIhdE9C z_e(*_`gB$>vbvx=>sz}%*Zo`Vci4>-CHOkZkiMfi5j%b(7cD{G#KHWLE7gp@^t-M5 ziXY4rD?zJ6lnkeN5 zC9S^RQPegW+m#Obe#+3*$cQn!HAwAx61ZH;c@3vFtQt7#3%T;xI#X$$DFJFl_|0zR zd}v(c>U^M+n_0@nm1H39uwTad*)gs)+I*wfpa0_PXwO`$Zx6q`@^?KmzhPZI30Ma)w^liDwrh#q{lR!tUq^m2PZCdm_j&&w^-Et`K9kkNTb_1*apU{E ze3SNG4VSCke@7{D?wmvC(m9QMZ3lw2qK%Br*;n7}fmi`f?uu*7wisN#?3jwzH9P!qT}YQ4+RfDHCN+mrYxZ3eMYSi<>$)n&@dOM zhwa$R&YGWf++rXe=KJMtYhqD$>hqkvFz%~UC+L~^O7myh`Vt^(TxLEqKc61C`ciZ( zC(>glh*j!TLCf^5Wot8Pd${@?fv@dD_yN}bKG-31B67BQd2?(lz`@*)KDYYjsqPu4 z%Fio7@Z0bnYh`|hpXJ?W-Q~|}hb!{TPMNJ%&s|yJKRrjYG_t|P$dTDmJ42KscUvfd zM(9I&7mo6b*LbZmKdpdSO|^qc+&q0;o#%|_s_+_j{jj^L9G~Eta%HmEKgf{wJ`)m@ z_8dlMxW40D=kMW)-Q&R+ZA*}$$k>iid!${mJ5>2lPRwa**UkNV>NmMF-3p%9{(aBu z*6_b#L*`>$oo5HAzO|Lm7=73WRSc^Epo3M zbA?HaTOO8Ylofed-_Z35#$oou)Zn%5FI*joai69NU{faOt@^7yknxOm)G@!`N@wce z5jl6(KO;2YL<)3)UQF4`>WuIhe{$lP!f9MKi>2grJ6r5Z$nH_n}%=hV)SuM9Fd=i^~1TH!V zPW$-jzGdzWwuN!XLypb8LEXd1+Nl_5&*bf>XJ7EFvg1A<_QDv?n|u8dd={f$UxV** zaQ>E0G%ouQDcyv;Zsprtx41v>kdd^k=*-!vlE5bydX^U^b&ogWaQ$m5`z4SJ^YL=_ zRUlFp`OuboiiKyn@SL(%mDiY;c0GrAGw8|Ar15;@An$^? z4vaQ{k+NxQzn%Hm6?|2*czUkZ@yw-ZLG(wmBJCG*#nHcxOypkfcFo$yYE{Qb7j`YmhrCTplV*xyqUSh^?a)J zGGj9P8O>9>2LCYMuIG9NYj4M{4B*{RTp5!SxzEGT{QPwNcVTARII0wn?2#(NZ^l>3 zhVmpoDN~8l_{-<5jVW{5c=v25$@{hQex9FehfH3+M_ccHAVxpN_mPQCb9LG?^TzIb zw-1b*V?84^&8(XJ;>NSCyE0$+J({JTWNf<%ToR`~r5(tt(JiqQCv#`6(%!+?1 zZT{l`-(XLr-q$AqMqeNf^soK?jP%Vk91&^nl&GPGK=;SA34X@`xwP8X4>6v zt%PXz^=hoX%R_R_@*qdwAuq~}Iu`ZJeHyHhnS1?)_pamLPW^jRIH`h(;^!cVSM(8oUdo40uFL=W&Y~v zIw{viSKzhwdXzzat^^I^F?VXZ0_`$KZRfeQ4*O*ESiJ%n(G0QGGgmMxMP{ud8$~(V z#+Z!vf8wVx|BsAUURuK=xyim7Pi=bQvCpsO@A9*GS62b+H`vo)y>%$hV{8A`}c6(pq!zgOXJ%8+

V_!Nxd$2jkFpG5Uzum=kgQ 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 URs5AJPCRjr^@I6|X1dV-17e*2d;kCd literal 0 HcmV?d00001 diff --git a/lib/configure/fluttertoast.dart b/lib/configure/fluttertoast.dart index cc15bf3..2c42f12 100644 --- a/lib/configure/fluttertoast.dart +++ b/lib/configure/fluttertoast.dart @@ -35,13 +35,13 @@ class Toaster { child: Container( alignment: Alignment.topCenter, padding: EdgeInsets.only( - top: 640.wmax * 10.sr, - left: 640.wmax * 20.sr, - right: 640.wmax * 15.sr, - bottom: 640.wmax * 10.sr, + top: 10.vp, + left: 20.vp, + right: 15.vp, + bottom: 10.vp, ), decoration: BoxDecoration( - borderRadius: BorderRadius.circular(640.wmax * 32.sr), + borderRadius: BorderRadius.circular(32.vp), color: Colors.redAccent, ), child: Row( @@ -52,14 +52,14 @@ class Toaster { behavior: HitTestBehavior.opaque, child: Container( alignment: Alignment.center, - padding: EdgeInsets.only(left: 640.wmax * 10.sr), + padding: EdgeInsets.only(left: 10.vp), child: IntrinsicWidth( child: Text( message!, style: TextStyle( - fontSize: 640.wmax * 14.sr, - fontWeight: FontWeight.w600, color: Colors.white, + fontWeight: FontWeight.w600, + fontSize: 14.fp, height: 1.3, ), ), @@ -74,11 +74,11 @@ class Toaster { ), ), SizedBox( - width: 640.wmax * 24.sr, - height: 640.wmax * 24.sr, + width: 24.vp, + height: 24.vp, child: IconButton( color: Colors.white, - iconSize: 640.wmax * 24.sr, + iconSize: 24.vp, padding: const EdgeInsets.all(0), icon: const Icon(Icons.close), onPressed: () => fToast.removeCustomToast(), @@ -90,9 +90,9 @@ class Toaster { toastDuration: duration ?? const Duration(seconds: 3), positionedToastBuilder: (context, child, gravity) { return Positioned( - top: max(640.wmax * 48.sr, mediaPadding.top + 640.wmax * 6.sr), - left: 640.wmax * 20.sr, - right: 640.wmax * 20.sr, + top: max(48.vp, mediaPadding.top + 6.vp), + left: 20.vp, + right: 20.vp, child: child, ); }, @@ -127,13 +127,13 @@ class Toaster { child: Container( alignment: Alignment.topCenter, padding: EdgeInsets.only( - top: 640.wmax * 10.sr, - left: 640.wmax * 20.sr, - right: 640.wmax * 15.sr, - bottom: 640.wmax * 10.sr, + top: 10.vp, + left: 20.vp, + right: 15.vp, + bottom: 10.vp, ), decoration: BoxDecoration( - borderRadius: BorderRadius.circular(640.wmax * 32.sr), + borderRadius: BorderRadius.circular(32.vp), color: Color(0xffffc107), ), child: Row( @@ -144,14 +144,14 @@ class Toaster { behavior: HitTestBehavior.opaque, child: Container( alignment: Alignment.center, - padding: EdgeInsets.only(left: 640.wmax * 10.sr), + padding: EdgeInsets.only(left: 10.vp), child: IntrinsicWidth( child: Text( message!, style: TextStyle( - fontSize: 640.wmax * 14.sr, - fontWeight: FontWeight.w600, color: Colors.white, + fontWeight: FontWeight.w600, + fontSize: 14.fp, height: 1.3, ), ), @@ -166,11 +166,11 @@ class Toaster { ), ), SizedBox( - width: 640.wmax * 24.sr, - height: 640.wmax * 24.sr, + width: 24.vp, + height: 24.vp, child: IconButton( color: Colors.white, - iconSize: 640.wmax * 24.sr, + iconSize: 24.vp, padding: const EdgeInsets.all(0), icon: const Icon(Icons.error_outline), onPressed: () => fToast.removeCustomToast(), @@ -182,9 +182,9 @@ class Toaster { toastDuration: duration ?? const Duration(seconds: 3), positionedToastBuilder: (context, child, gravity) { return Positioned( - top: max(640.wmax * 48.sr, mediaPadding.top + 640.wmax * 6.sr), - left: 640.wmax * 20.sr, - right: 640.wmax * 20.sr, + top: max(48.vp, mediaPadding.top + 6.vp), + left: 20.vp, + right: 20.vp, child: child, ); }, @@ -219,13 +219,13 @@ class Toaster { child: Container( alignment: Alignment.topCenter, padding: EdgeInsets.only( - top: 640.wmax * 10.sr, - left: 640.wmax * 20.sr, - right: 640.wmax * 15.sr, - bottom: 640.wmax * 10.sr, + top: 10.vp, + left: 20.vp, + right: 15.vp, + bottom: 10.vp, ), decoration: BoxDecoration( - borderRadius: BorderRadius.circular(640.wmax * 32.sr), + borderRadius: BorderRadius.circular(32.vp), color: const Color(0xff52c41b), ), child: Row( @@ -236,14 +236,14 @@ class Toaster { behavior: HitTestBehavior.opaque, child: Container( alignment: Alignment.center, - padding: EdgeInsets.only(left: 640.wmax * 10.sr), + padding: EdgeInsets.only(left: 10.vp), child: IntrinsicWidth( child: Text( message!, style: TextStyle( - fontSize: 640.wmax * 14.sr, - fontWeight: FontWeight.w600, color: Colors.white, + fontWeight: FontWeight.w600, + fontSize: 14.fp, height: 1.3, ), ), @@ -258,11 +258,11 @@ class Toaster { ), ), SizedBox( - width: 640.wmax * 24.sr, - height: 640.wmax * 24.sr, + width: 24.vp, + height: 24.vp, child: IconButton( + iconSize: 24.vp, color: Colors.white, - iconSize: 640.wmax * 24.sr, padding: const EdgeInsets.all(0), icon: const Icon(Icons.check), onPressed: () => fToast.removeCustomToast(), @@ -274,9 +274,9 @@ class Toaster { toastDuration: duration ?? const Duration(seconds: 3), positionedToastBuilder: (context, child, gravity) { return Positioned( - top: max(640.wmax * 48.sr, mediaPadding.top + 640.wmax * 6.sr), - left: 640.wmax * 20.sr, - right: 640.wmax * 20.sr, + top: max(48.vp, mediaPadding.top + 6.vp), + left: 20.vp, + right: 20.vp, child: child, ); }, diff --git a/lib/configure/get_dialoger.dart b/lib/configure/get_dialoger.dart index 6c727cc..8f073eb 100644 --- a/lib/configure/get_dialoger.dart +++ b/lib/configure/get_dialoger.dart @@ -1,6 +1,7 @@ import 'package:get/get.dart'; import 'package:flutter/material.dart'; import 'package:dompet/service/bind.dart'; +import 'package:dompet/extension/size.dart'; class Dialoger { static Future show({ @@ -45,14 +46,14 @@ class Dialoger { if (cancel == null && showCancelButton == true) { cancel = TextButton( - style: TextButton.styleFrom( - tapTargetSize: MaterialTapTargetSize.shrinkWrap, - padding: const EdgeInsets.symmetric(horizontal: 10, vertical: 8), - ), onPressed: () { Navigator.of(Get.overlayContext!).pop(false); onCancel?.call(); }, + style: TextButton.styleFrom( + tapTargetSize: MaterialTapTargetSize.shrinkWrap, + padding: const EdgeInsets.symmetric(horizontal: 10, vertical: 8), + ), child: Text( textCancel ?? 'System_Cancel'.tr, style: TextStyle(color: cancelTextColor), @@ -62,14 +63,14 @@ class Dialoger { if (confirm == null && showConfirmButton == true) { confirm = TextButton( - style: TextButton.styleFrom( - tapTargetSize: MaterialTapTargetSize.shrinkWrap, - padding: const EdgeInsets.symmetric(horizontal: 10, vertical: 8), - ), onPressed: () { Navigator.of(Get.overlayContext!).pop(true); onConfirm?.call(); }, + style: TextButton.styleFrom( + tapTargetSize: MaterialTapTargetSize.shrinkWrap, + padding: const EdgeInsets.symmetric(horizontal: 10, vertical: 8), + ), child: Text( textConfirm ?? 'System_Confirm'.tr, style: TextStyle(color: confirmTextColor), @@ -84,20 +85,21 @@ class Dialoger { ]; } - messageStyle ??= const TextStyle( + messageStyle ??= TextStyle( color: Colors.black, fontWeight: FontWeight.w400, - fontSize: 14, + fontSize: 14.fp, ); - titleStyle ??= const TextStyle( + titleStyle ??= TextStyle( color: Colors.black, fontWeight: FontWeight.w600, - fontSize: 16, + fontSize: 16.fp, ); final mediaQueryController = Get.find(); final mediaQueryWidth = mediaQueryController.width.value; + final alertDialog = AlertDialog( title: Text( title ?? 'System_Prompt'.tr, diff --git a/lib/extension/size.dart b/lib/extension/size.dart index 06e2491..9fb3d09 100644 --- a/lib/extension/size.dart +++ b/lib/extension/size.dart @@ -1,3 +1,4 @@ +import 'dart:math' as math; import 'package:get/get.dart'; import 'package:dompet/service/media.dart'; @@ -26,6 +27,8 @@ extension IntegerExtension on int { } extension SizeExtension on num { + static const font = 1.0; + static const scale = 1.5; static const preset = 375.0; static final width = Get.find().width; static final height = Get.find().height; @@ -74,12 +77,12 @@ extension SizeExtension on num { return this > 100.vmax ? this / 1 : 100.vmax; } - double get wdp { - return this * width.value.sr; + double get vp { + return this * math.min(width.value.sr, scale); } - double get hdp { - return this * height.value.sr; + double get fp { + return this * math.min(width.value.sr, font); } double get sr { diff --git a/lib/logger/output.dart b/lib/logger/output.dart index cc8b700..4ef5346 100644 --- a/lib/logger/output.dart +++ b/lib/logger/output.dart @@ -162,11 +162,14 @@ class SafeFileOutput extends LogOutput { } for (final file in files) { - final name = basename(file.path); - final path = file.path; - formData.files.add( - MapEntry('files', MultipartFile.fromFileSync(path, filename: name)), + MapEntry( + 'files', + MultipartFile.fromBytes( + file.readAsBytesSync(), + filename: basename(file.path), + ), + ), ); } @@ -191,11 +194,14 @@ class SafeFileOutput extends LogOutput { return null; } - final name = basename(files.first.path); - final path = files.first.path; - formData.files.add( - MapEntry('file', MultipartFile.fromFileSync(path, filename: name)), + MapEntry( + 'files', + MultipartFile.fromBytes( + files.first.readAsBytesSync(), + filename: basename(files.first.path), + ), + ), ); return formData; diff --git a/lib/pages/card/index.dart b/lib/pages/card/index.dart index f68c80c..6b671ed 100644 --- a/lib/pages/card/index.dart +++ b/lib/pages/card/index.dart @@ -46,7 +46,7 @@ class PageCard extends GetView { Widget buildBack(BuildContext context) { final mediaTopBar = controller.mediaTopBar.value; final mediaPadding = controller.mediaPadding.value; - final height = max(640.wmax * 40.sr, mediaTopBar); + final height = max(40.vp, mediaTopBar); return Positioned( top: 0, @@ -58,12 +58,12 @@ class PageCard extends GetView { width: 680.wmax, height: height, margin: EdgeInsets.only( - top: max(mediaPadding.top, 640.wmax * 20.sr), - left: 640.wmax * 20.sr, + top: max(mediaPadding.top, 20.vp), + left: 20.vp, ), padding: EdgeInsets.only( - top: (height - 640.wmax * 36.sr) / 2, - bottom: (height - 640.wmax * 36.sr) / 2, + top: (height - 36.vp) / 2, + bottom: (height - 36.vp) / 2, ), child: Row( children: [ @@ -71,10 +71,10 @@ class PageCard extends GetView { behavior: HitTestBehavior.opaque, onTap: () => GetNavigate.back(), child: Image( - image: const AssetImage('lib/assets/images/auth/back.png'), - width: 640.wmax * 36.sr, - height: 640.wmax * 36.sr, fit: BoxFit.fill, + image: const AssetImage('lib/assets/images/auth/back.png'), + width: 36.vp, + height: 36.vp, ), ), ], @@ -93,22 +93,19 @@ class PageCard extends GetView { duration: duration, onEnd: () => isAnimating.value = false, margin: EdgeInsets.only( - top: isExpand.value ? 640.wmax * 103.sr : 640.wmax * 136.sr, - bottom: isExpand.value ? 640.wmax * 6.sr : 640.wmax * 61.sr, + top: isExpand.value ? 103.vp : 136.vp, + bottom: isExpand.value ? 6.vp : 61.vp, ), child: Container( color: Colors.white, alignment: Alignment.center, - padding: EdgeInsets.only( - left: 640.wmax * 32.sr, - right: 640.wmax * 32.sr, - ), + padding: EdgeInsets.only(left: 32.vp, right: 32.vp), child: Text( 'Bank Card'.tr, style: TextStyle( - fontSize: 640.wmax * 24.sr, - fontWeight: FontWeight.bold, color: const Color(0xff130138), + fontWeight: FontWeight.bold, + fontSize: 24.fp, height: 1.2, ), ), @@ -124,15 +121,13 @@ class PageCard extends GetView { return AnimatedContainer( duration: duration, onEnd: () => isAnimating.value = false, - margin: EdgeInsets.only( - bottom: isExpand.value ? 640.wmax * 56.sr : 640.wmax * 48.sr, - ), + margin: EdgeInsets.only(bottom: isExpand.value ? 56.vp : 48.vp), child: Container( color: Colors.white, alignment: Alignment.center, padding: EdgeInsets.only( - left: isExpand.value ? 640.wmax * 32.sr : 640.wmax * 17.sr, - right: isExpand.value ? 640.wmax * 32.sr : 640.wmax * 17.sr, + left: isExpand.value ? 32.vp : 17.vp, + right: isExpand.value ? 32.vp : 17.vp, ), child: Column( children: [buildCardImage(context), buildCardDetail(context)], @@ -160,12 +155,12 @@ class PageCard extends GetView { : 1; final width = isAnimating.value || isExpand.value - ? 640.wmax * 220.sr * scale - : 640.wmax * 240.sr; + ? 220.vp * scale + : 240.vp; final height = isAnimating.value || isExpand.value - ? 640.wmax * 311.sr * scale - : 640.wmax * 340.sr; + ? 311.vp * scale + : 340.vp; return Transform.rotate( angle: animationValue.value, @@ -180,12 +175,12 @@ class PageCard extends GetView { fit: BoxFit.fill, ), Positioned( - right: 640.wmax * 38.5.sr * scale, - bottom: 640.wmax * 21.sr * scale, + right: 38.5.vp * scale, + bottom: 21.vp * scale, child: Image.asset( 'lib/assets/images/card/visa.png', - width: 640.wmax * 29.2.sr * scale, - height: 640.wmax * 44.sr * scale, + width: 29.2.vp * scale, + height: 44.vp * scale, fit: BoxFit.fill, ), ), @@ -195,24 +190,21 @@ class PageCard extends GetView { ); }, ), - SizedBox( - width: 640.wmax, - height: isExpand.value ? 640.wmax * 13.sr : 640.wmax * 40.sr, - ), + SizedBox(width: 640.wmax, height: isExpand.value ? 13.vp : 40.vp), ], ), Positioned( left: 0, right: 0, - bottom: isExpand.value ? 640.wmax * 15.sr : 0, + bottom: isExpand.value ? 15.vp : 0, child: Offstage( offstage: isAnimating.value, child: Container( alignment: Alignment.topCenter, child: Image.asset( 'lib/assets/images/card/shadow.png', - width: 640.wmax * 206.sr, - height: 640.wmax * 79.sr, + width: 206.vp, + height: 79.vp, fit: BoxFit.fill, ), ), @@ -229,42 +221,39 @@ class PageCard extends GetView { final bankCard = controller.bankCard; return AnimatedContainer( - duration: duration, - onEnd: () => isAnimating.value = false, + onEnd: () { + isAnimating.value = false; + }, width: 640.wmax, - height: isExpand.value ? 640.wmax * 172.sr : 0, + height: isExpand.value ? 172.vp : 0, + duration: duration, child: ListView( shrinkWrap: false, physics: const NeverScrollableScrollPhysics(), - padding: EdgeInsets.only( - top: 0, - left: 640.wmax * 25.sr, - right: 640.wmax * 25.sr, - bottom: 0, - ), + padding: EdgeInsets.only(top: 0, left: 25.vp, right: 25.vp, bottom: 0), children: [ AnimatedOpacity( opacity: isExpand.value ? 1.0 : 0.0, duration: duration, child: SizedBox( - height: 640.wmax * 172.sr, + height: 172.vp, child: Column( mainAxisAlignment: MainAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start, children: [ Container( - height: 640.wmax * 20.sr, + height: 20.vp, alignment: Alignment.centerLeft, child: Row( children: [ SizedBox( - width: 640.wmax * 80.sr, + width: 80.vp, child: Text( 'CardNo'.tr, style: TextStyle( - fontSize: 640.wmax * 16.sr, - fontWeight: FontWeight.w500, color: const Color(0xffbdbdbd), + fontWeight: FontWeight.w500, + fontSize: 16.fp, height: 1, ), ), @@ -272,30 +261,30 @@ class PageCard extends GetView { Text( bankCard.value.cardNo.tr, style: TextStyle( - fontSize: 640.wmax * 15.sr, - fontWeight: FontWeight.w500, color: const Color(0xff303133), + fontWeight: FontWeight.w500, letterSpacing: 1.2, + fontSize: 15.fp, height: 1, ), ), ], ), ), - SizedBox(width: 640.wmax, height: 640.wmax * 18.sr), + SizedBox(width: 640.wmax, height: 18.vp), Container( - height: 640.wmax * 20.sr, + height: 20.vp, alignment: Alignment.centerLeft, child: Row( children: [ SizedBox( - width: 640.wmax * 80.sr, + width: 80.vp, child: Text( 'Type'.tr, style: TextStyle( - fontSize: 640.wmax * 16.sr, - fontWeight: FontWeight.w500, color: const Color(0xffbdbdbd), + fontWeight: FontWeight.w500, + fontSize: 16.fp, height: 1, ), ), @@ -303,29 +292,29 @@ class PageCard extends GetView { Text( bankCard.value.cardType.tr, style: TextStyle( - fontSize: 640.wmax * 16.sr, - fontWeight: FontWeight.w500, color: const Color(0xff303133), + fontWeight: FontWeight.w500, + fontSize: 16.fp, height: 1, ), ), ], ), ), - SizedBox(width: 640.wmax, height: 640.wmax * 18.sr), + SizedBox(width: 640.wmax, height: 18.vp), Container( - height: 640.wmax * 20.sr, + height: 20.vp, alignment: Alignment.centerLeft, child: Row( children: [ SizedBox( - width: 640.wmax * 80.sr, + width: 80.vp, child: Text( 'Bank'.tr, style: TextStyle( - fontSize: 640.wmax * 16.sr, - fontWeight: FontWeight.w500, color: const Color(0xffbdbdbd), + fontWeight: FontWeight.w500, + fontSize: 16.fp, height: 1, ), ), @@ -333,29 +322,29 @@ class PageCard extends GetView { Text( bankCard.value.bankName.tr, style: TextStyle( - fontSize: 640.wmax * 16.sr, - fontWeight: FontWeight.w500, color: const Color(0xff303133), + fontWeight: FontWeight.w500, + fontSize: 16.fp, height: 1, ), ), ], ), ), - SizedBox(width: 640.wmax, height: 640.wmax * 18.sr), + SizedBox(width: 640.wmax, height: 18.vp), Container( - height: 640.wmax * 20.sr, + height: 20.vp, alignment: Alignment.centerLeft, child: Row( children: [ SizedBox( - width: 640.wmax * 80.sr, + width: 80.vp, child: Text( 'Status'.tr, style: TextStyle( - fontSize: 640.wmax * 16.sr, - fontWeight: FontWeight.w500, color: const Color(0xffbdbdbd), + fontWeight: FontWeight.w500, + fontSize: 16.fp, height: 1, ), ), @@ -365,29 +354,29 @@ class PageCard extends GetView { ? 'Available'.tr : 'Unavailable'.tr, style: TextStyle( - fontSize: 640.wmax * 16.sr, - fontWeight: FontWeight.w500, color: const Color(0xff303133), + fontWeight: FontWeight.w500, + fontSize: 16.fp, height: 1, ), ), ], ), ), - SizedBox(width: 640.wmax, height: 640.wmax * 18.sr), + SizedBox(width: 640.wmax, height: 18.vp), Container( - height: 640.wmax * 20.sr, + height: 20.vp, alignment: Alignment.centerLeft, child: Row( children: [ SizedBox( - width: 640.wmax * 80.sr, + width: 80.vp, child: Text( 'Valid'.tr, style: TextStyle( - fontSize: 640.wmax * 16.sr, - fontWeight: FontWeight.w500, color: const Color(0xffbdbdbd), + fontWeight: FontWeight.w500, + fontSize: 16.fp, height: 1, ), ), @@ -395,9 +384,9 @@ class PageCard extends GetView { Text( bankCard.value.expiryDate.yMMM(), style: TextStyle( - fontSize: 640.wmax * 16.sr, - fontWeight: FontWeight.w500, color: const Color(0xff303133), + fontWeight: FontWeight.w500, + fontSize: 16.fp, height: 1, ), ), @@ -417,7 +406,7 @@ class PageCard extends GetView { final isExpand = controller.isExpand; final isAnimating = controller.isAnimating; final mediaPadding = controller.mediaPadding.value; - final mediaBottom = max(mediaPadding.bottom, 640.wmax * 30.sr); + final mediaBottom = max(mediaPadding.bottom, 30.vp); Widget withInWell({required Widget child, dynamic onTap}) { return Material( @@ -426,7 +415,7 @@ class PageCard extends GetView { radius: 200.0, containedInkWell: true, highlightShape: BoxShape.rectangle, - borderRadius: BorderRadius.all(Radius.circular(640.wmax * 30.0.sr)), + borderRadius: BorderRadius.all(Radius.circular(30.0.vp)), highlightColor: const Color(0xff45197d).withValues(alpha: 0.05), splashColor: const Color(0xff45197d).withValues(alpha: 0.05), focusColor: Colors.transparent, @@ -440,28 +429,21 @@ class PageCard extends GetView { return Container( color: Colors.white, alignment: Alignment.center, - padding: EdgeInsets.only( - left: 640.wmax * 32.sr, - right: 640.wmax * 32.sr, - bottom: mediaBottom, - ), + padding: EdgeInsets.only(left: 32.vp, right: 32.vp, bottom: mediaBottom), child: IntrinsicWidth( child: withInWell( child: Container( color: Colors.transparent, alignment: Alignment.center, - constraints: BoxConstraints(minWidth: 640.wmax * 160.sr), - padding: EdgeInsets.symmetric( - vertical: 640.wmax * 15.sr, - horizontal: 640.wmax * 18.sr, - ), + constraints: BoxConstraints(minWidth: 160.vp), + padding: EdgeInsets.symmetric(vertical: 15.vp, horizontal: 18.vp), child: Text( isExpand.value ? 'Hide'.tr : 'Display'.tr, style: TextStyle( - fontSize: 640.wmax * 18.sr, - fontWeight: FontWeight.bold, color: const Color(0xff5b259f), + fontWeight: FontWeight.bold, letterSpacing: 1.2, + fontSize: 18.fp, height: 1.2, ), ), diff --git a/lib/pages/home/controller.dart b/lib/pages/home/controller.dart index 0e3f68d..72e5c60 100644 --- a/lib/pages/home/controller.dart +++ b/lib/pages/home/controller.dart @@ -34,8 +34,8 @@ class PageHomeController extends GetxController { scrollController.addListener(() { final scrollTop = scrollController.position.pixels; - final isShowShadow = scrollTop >= 640.wmax * 42.sr; - final isShowActions = scrollTop >= 640.wmax * 296.sr; + final isShowShadow = scrollTop >= 42.vp; + final isShowActions = scrollTop >= 296.vp; if (showActions.value != isShowActions) { isRunAnimating.value = showActions.value != isShowActions; diff --git a/lib/pages/home/index.dart b/lib/pages/home/index.dart index 8957137..b4d97e8 100644 --- a/lib/pages/home/index.dart +++ b/lib/pages/home/index.dart @@ -17,7 +17,7 @@ class PageHome extends GetView { return Scaffold( body: Obx(() { final mediaPadding = controller.mediaPadding.value; - final mediaBottom = max(mediaPadding.bottom, 640.wmax * 30.sr); + final mediaBottom = max(mediaPadding.bottom, 30.vp); return Align( alignment: Alignment.topCenter, @@ -32,7 +32,7 @@ class PageHome extends GetView { top: 0, left: 0, right: 0, - bottom: mediaBottom + 640.wmax * 92.sr, + bottom: mediaBottom + 92.vp, ), physics: const ClampingScrollPhysics(), controller: controller.scrollController, @@ -76,11 +76,11 @@ class PageHome extends GetView { left: 0, child: Container( width: 640.wmax, - height: max(640.wmax * 88.sr, mediaTop + 640.wmax * 56.sr), + height: max(88.vp, mediaTop + 56.vp), padding: EdgeInsets.only( - top: max(640.wmax * 32.sr, mediaTop), - left: 640.wmax * 32.sr, - right: 640.wmax * 32.sr, + top: max(32.vp, mediaTop), + left: 32.vp, + right: 32.vp, ), decoration: BoxDecoration(color: Colors.white, boxShadow: boxShadow), child: Stack( @@ -102,26 +102,19 @@ class PageHome extends GetView { return Container( width: 640.wmax, - padding: EdgeInsets.only(top: 640.wmax * 122.sr), + padding: EdgeInsets.only(top: 122.vp), child: Column( children: [ Container( - padding: EdgeInsets.only( - left: 640.wmax * 32.sr, - right: 640.wmax * 32.sr, - ), - margin: EdgeInsets.only(top: 640.wmax * 42.sr), + padding: EdgeInsets.only(left: 32.vp, right: 32.vp), + margin: EdgeInsets.only(top: 42.vp), child: GestureDetector( behavior: HitTestBehavior.opaque, onTap: () => GetNavigate.toNamed(GetRoutes.card), child: Container( - width: 640.wmax * 310.sr, - height: 640.wmax * 140.sr, - padding: EdgeInsets.only( - top: 640.wmax * 32.sr, - left: 640.wmax * 38.sr, - right: 640.wmax * 35.sr, - ), + width: 310.vp, + height: 140.vp, + padding: EdgeInsets.only(top: 32.vp, left: 38.vp, right: 35.vp), decoration: const BoxDecoration( image: DecorationImage( image: AssetImage('lib/assets/images/home/card.png'), @@ -135,30 +128,30 @@ class PageHome extends GetView { Text( 'Balance'.tr, style: TextStyle( - fontSize: 640.wmax * 16.sr, - fontWeight: FontWeight.bold, color: Colors.white, + fontWeight: FontWeight.bold, + fontSize: 16.fp, height: 1.2, ), ), Text( balance.value.USD, style: TextStyle( - fontSize: 640.wmax * 20.sr, - fontWeight: FontWeight.bold, color: const Color(0xffdfdfdf), + fontWeight: FontWeight.bold, + fontSize: 20.fp, height: 1.4, ), ), Container( - margin: EdgeInsets.only(top: 640.wmax * 10.sr), + margin: EdgeInsets.only(top: 10.vp), alignment: Alignment.centerRight, child: Text( 'Citibank', style: TextStyle( - fontSize: 640.wmax * 22.sr, - fontWeight: FontWeight.bold, color: const Color(0xfff0f0f0), + fontWeight: FontWeight.bold, + fontSize: 22.fp, height: 1.6, ), ), @@ -169,11 +162,8 @@ class PageHome extends GetView { ), ), Container( - padding: EdgeInsets.only( - left: 640.wmax * 52.sr, - right: 640.wmax * 52.sr, - ), - margin: EdgeInsets.only(top: 640.wmax * 36.sr), + padding: EdgeInsets.only(left: 52.vp, right: 52.vp), + margin: EdgeInsets.only(top: 36.vp), child: Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, crossAxisAlignment: CrossAxisAlignment.center, @@ -185,17 +175,15 @@ class PageHome extends GetView { arguments: 'Transfer', ), child: SizedBox( - width: 640.wmax * 80.sr, + width: 80.vp, child: Column( children: [ Container( - width: 640.wmax * 48.sr, - height: 640.wmax * 48.sr, + width: 48.vp, + height: 48.vp, alignment: Alignment.center, decoration: BoxDecoration( - borderRadius: BorderRadius.circular( - 640.wmax * 20.sr, - ), + borderRadius: BorderRadius.circular(20.vp), boxShadow: [ BoxShadow( color: const Color(0x26272246), @@ -208,18 +196,18 @@ class PageHome extends GetView { ), child: Image.asset( 'lib/assets/images/home/transfer.png', - width: 640.wmax * 28.sr, - height: 640.wmax * 28.sr, + width: 28.vp, + height: 28.vp, fit: BoxFit.fill, ), ), - SizedBox(height: 640.wmax * 16.sr), + SizedBox(height: 16.vp), Text( 'Transfer'.tr, style: TextStyle( - fontSize: 640.wmax * 13.sr, color: const Color(0xff8438FF), fontWeight: FontWeight.w500, + fontSize: 13.fp, height: 1.2, ), ), @@ -234,17 +222,15 @@ class PageHome extends GetView { arguments: 'Payment', ), child: SizedBox( - width: 640.wmax * 80.sr, + width: 80.vp, child: Column( children: [ Container( - width: 640.wmax * 48.sr, - height: 640.wmax * 48.sr, + width: 48.vp, + height: 48.vp, alignment: Alignment.center, decoration: BoxDecoration( - borderRadius: BorderRadius.circular( - 640.wmax * 20.sr, - ), + borderRadius: BorderRadius.circular(20.vp), boxShadow: [ BoxShadow( color: const Color(0x26272246), @@ -257,18 +243,18 @@ class PageHome extends GetView { ), child: Image.asset( 'lib/assets/images/home/payment.png', - width: 640.wmax * 28.sr, - height: 640.wmax * 28.sr, + width: 28.vp, + height: 28.vp, fit: BoxFit.fill, ), ), - SizedBox(height: 640.wmax * 16.sr), + SizedBox(height: 16.vp), Text( 'Payment'.tr, style: TextStyle( - fontSize: 640.wmax * 13.sr, color: const Color(0xff8438FF), fontWeight: FontWeight.w500, + fontSize: 13.fp, height: 1.2, ), ), @@ -283,17 +269,15 @@ class PageHome extends GetView { arguments: 'Top up', ), child: SizedBox( - width: 640.wmax * 80.sr, + width: 80.vp, child: Column( children: [ Container( - width: 640.wmax * 48.sr, - height: 640.wmax * 48.sr, + width: 48.vp, + height: 48.vp, alignment: Alignment.center, decoration: BoxDecoration( - borderRadius: BorderRadius.circular( - 640.wmax * 20.sr, - ), + borderRadius: BorderRadius.circular(20.vp), boxShadow: [ BoxShadow( color: const Color(0x26272246), @@ -306,18 +290,18 @@ class PageHome extends GetView { ), child: Image.asset( 'lib/assets/images/home/topup.png', - width: 640.wmax * 28.sr, - height: 640.wmax * 28.sr, + width: 28.vp, + height: 28.vp, fit: BoxFit.fill, ), ), - SizedBox(height: 640.wmax * 16.sr), + SizedBox(height: 16.vp), Text( 'Top up'.tr, style: TextStyle( - fontSize: 640.wmax * 13.sr, color: const Color(0xff8438FF), fontWeight: FontWeight.w500, + fontSize: 13.fp, height: 1.2, ), ), @@ -344,8 +328,8 @@ class PageHome extends GetView { return ClipOval( child: Image.memory( userAvatar, - width: 640.wmax * 39.sr, - height: 640.wmax * 39.sr, + width: 39.vp, + height: 39.vp, fit: BoxFit.fill, ), ); @@ -354,28 +338,24 @@ class PageHome extends GetView { return ClipOval( child: Image.asset( 'lib/assets/images/payer/$icon.png', - width: 640.wmax * 39.sr, - height: 640.wmax * 39.sr, + width: 39.vp, + height: 39.vp, fit: BoxFit.fill, ), ); } return Container( - padding: EdgeInsets.only(left: 640.wmax * 32.sr, right: 640.wmax * 32.sr), - margin: EdgeInsets.only(top: 640.wmax * 42.sr, bottom: 640.wmax * 15.sr), + padding: EdgeInsets.only(left: 32.vp, right: 32.vp), + margin: EdgeInsets.only(top: 42.vp, bottom: 15.vp), child: Column( mainAxisAlignment: MainAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start, children: [ Container( width: 640.wmax, - height: 640.wmax * 21.sr, - margin: EdgeInsets.only( - left: 640.wmax * 2.sr, - right: 640.wmax * 2.sr, - bottom: 640.wmax * 25.sr, - ), + height: 21.vp, + margin: EdgeInsets.only(left: 2.vp, right: 2.vp, bottom: 25.vp), child: Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, crossAxisAlignment: CrossAxisAlignment.center, @@ -383,19 +363,19 @@ class PageHome extends GetView { Text( 'Transactions'.tr, style: TextStyle( - fontSize: 640.wmax * 18.sr, - fontWeight: FontWeight.w600, color: const Color(0xff130138), + fontWeight: FontWeight.w600, letterSpacing: -0.35, + fontSize: 18.fp, height: 1, ), ), Text( 'Money'.tr, style: TextStyle( - fontSize: 640.wmax * 14.sr, - fontWeight: FontWeight.w600, color: const Color(0xff130138), + fontWeight: FontWeight.w600, + fontSize: 14.fp, height: 1, ), ), @@ -411,61 +391,61 @@ class PageHome extends GetView { final order = rawOrders[index]; return SizedBox( - height: 640.wmax * 39.sr, + height: 39.vp, child: Row( children: [ buildIconAvatar(order.icon), - SizedBox(width: 640.wmax * 15.sr), + SizedBox(width: 15.vp), Expanded( child: Column( mainAxisAlignment: MainAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start, children: [ SizedBox( - height: 640.wmax * 19.sr, + height: 19.vp, child: Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ Text( order.name.tr, style: TextStyle( - fontSize: 640.wmax * 16.sr, - fontWeight: FontWeight.w600, color: const Color(0xff000000), + fontWeight: FontWeight.w600, + fontSize: 16.fp, ), ), Text( order.money.usd, style: TextStyle( - fontSize: 640.wmax * 16.sr, - fontWeight: FontWeight.w600, color: const Color(0xff363853), + fontWeight: FontWeight.w600, letterSpacing: -0.6, + fontSize: 16.fp, ), ), ], ), ), - SizedBox(height: 640.wmax * 2.sr), + SizedBox(height: 2.vp), SizedBox( - height: 640.wmax * 18.sr, + height: 18.vp, child: Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ Text( order.type.tr, style: TextStyle( - fontSize: 640.wmax * 14.sr, - fontWeight: FontWeight.w500, color: const Color(0xff909399), + fontWeight: FontWeight.w500, + fontSize: 14.fp, ), ), Text( order.date.yMMMd(), style: TextStyle( - fontSize: 640.wmax * 12.sr, - fontWeight: FontWeight.w500, color: const Color(0xffababab), + fontWeight: FontWeight.w500, + fontSize: 12.fp, ), ), ], @@ -479,7 +459,7 @@ class PageHome extends GetView { ); }, separatorBuilder: (BuildContext context, int index) { - return SizedBox(height: 640.wmax * 21.sr); + return SizedBox(height: 21.vp); }, ), ], @@ -500,7 +480,7 @@ class PageHome extends GetView { onEnd: () => isRunAnimating.value = false, child: SizedBox( width: 640.wmax * (1 - 64.sr), - height: 640.wmax * 56.sr, + height: 56.vp, child: Row( children: [ Expanded( @@ -512,19 +492,19 @@ class PageHome extends GetView { Text( 'Digital Wallet'.tr, style: TextStyle( - fontSize: 640.wmax * 24.sr, - fontWeight: FontWeight.bold, color: const Color(0xff130138), + fontWeight: FontWeight.bold, + fontSize: 24.fp, height: 1, ), ), - SizedBox(height: 640.wmax * 5.sr), + SizedBox(height: 5.vp), Text( 'available'.tr, style: TextStyle( - fontSize: 640.wmax * 16.sr, - fontWeight: FontWeight.normal, color: const Color(0xffbdbdbd), + fontWeight: FontWeight.normal, + fontSize: 16.fp, height: 1, ), ), @@ -552,8 +532,8 @@ class PageHome extends GetView { return ClipOval( child: Image.memory( loginUser.avatar.value!, - width: 640.wmax * 44.sr, - height: 640.wmax * 44.sr, + width: 44.vp, + height: 44.vp, fit: BoxFit.fill, ), ); @@ -562,8 +542,8 @@ class PageHome extends GetView { return ClipOval( child: Image.asset( 'lib/assets/images/home/avatar.png', - width: 640.wmax * 44.sr, - height: 640.wmax * 44.sr, + width: 44.vp, + height: 44.vp, fit: BoxFit.fill, ), ); @@ -582,11 +562,8 @@ class PageHome extends GetView { onEnd: () => isRunAnimating.value = false, child: Container( width: 640.wmax * (1 - 64.sr), - height: 640.wmax * 56.sr, - padding: EdgeInsets.only( - left: 640.wmax * 14.sr, - right: 640.wmax * 14.sr, - ), + height: 56.vp, + padding: EdgeInsets.only(left: 14.vp, right: 14.vp), child: Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, crossAxisAlignment: CrossAxisAlignment.start, @@ -600,23 +577,23 @@ class PageHome extends GetView { child: Column( children: [ Container( - width: 640.wmax * 80.sr, - height: 640.wmax * 28.sr, + width: 80.vp, + height: 28.vp, alignment: Alignment.topCenter, - padding: EdgeInsets.only(top: 640.wmax * 2.sr), + padding: EdgeInsets.only(top: 2.vp), child: Image.asset( 'lib/assets/images/home/transfer.png', - width: 640.wmax * 26.sr, - height: 640.wmax * 26.sr, + width: 26.vp, + height: 26.vp, fit: BoxFit.fill, ), ), Text( 'Transfer'.tr, style: TextStyle( - fontSize: 640.wmax * 13.sr, color: const Color(0xff2f1155), fontWeight: FontWeight.w600, + fontSize: 13.fp, height: 1.6, ), ), @@ -632,23 +609,23 @@ class PageHome extends GetView { child: Column( children: [ Container( - width: 640.wmax * 80.sr, - height: 640.wmax * 28.sr, + width: 80.vp, + height: 28.vp, alignment: Alignment.topCenter, - padding: EdgeInsets.only(top: 640.wmax * 2.sr), + padding: EdgeInsets.only(top: 2.vp), child: Image.asset( 'lib/assets/images/home/payment.png', - width: 640.wmax * 26.sr, - height: 640.wmax * 26.sr, + width: 26.vp, + height: 26.vp, fit: BoxFit.fill, ), ), Text( 'Payment'.tr, style: TextStyle( - fontSize: 640.wmax * 13.sr, color: const Color(0xff2f1155), fontWeight: FontWeight.w600, + fontSize: 13.fp, height: 1.6, ), ), @@ -663,23 +640,23 @@ class PageHome extends GetView { child: Column( children: [ Container( - width: 640.wmax * 80.sr, - height: 640.wmax * 28.sr, + width: 80.vp, + height: 28.vp, alignment: Alignment.topCenter, - padding: EdgeInsets.only(top: 640.wmax * 2.sr), + padding: EdgeInsets.only(top: 2.vp), child: Image.asset( 'lib/assets/images/home/topup.png', - width: 640.wmax * 26.sr, - height: 640.wmax * 26.sr, + width: 26.vp, + height: 26.vp, fit: BoxFit.fill, ), ), Text( 'Top up'.tr, style: TextStyle( - fontSize: 640.wmax * 13.sr, color: const Color(0xff2f1155), fontWeight: FontWeight.w600, + fontSize: 13.fp, height: 1.6, ), ), @@ -695,7 +672,7 @@ class PageHome extends GetView { Widget buildBottomTabbar(BuildContext context) { final mediaPadding = controller.mediaPadding.value; - final mediaBottom = max(mediaPadding.bottom, 640.wmax * 30.sr); + final mediaBottom = max(mediaPadding.bottom, 30.vp); return Positioned( left: 0, @@ -703,40 +680,40 @@ class PageHome extends GetView { child: Container( width: 640.wmax, color: Colors.white.withValues(alpha: 0.88), - height: mediaBottom + 640.wmax * 92.sr, + height: mediaBottom + 92.vp, alignment: Alignment.topCenter, padding: EdgeInsets.only( - top: 640.wmax * 10.sr, - left: 640.wmax * 24.sr, - right: 640.wmax * 24.sr, + top: 10.vp, + left: 24.vp, + right: 24.vp, bottom: mediaBottom, ), child: Stack( fit: StackFit.expand, children: [ Positioned( - top: 640.wmax * 32.sr, - left: 640.wmax * 24.sr, + top: 32.vp, + left: 24.vp, child: Image.asset( 'lib/assets/images/tabbar/bg.png', - width: 640.wmax * 280.sr, - height: 640.wmax * 52.sr, + width: 280.vp, + height: 52.vp, fit: BoxFit.fill, ), ), Align( alignment: Alignment.topLeft, child: Container( - height: 640.wmax * 78.sr, + height: 78.vp, padding: EdgeInsets.only( - top: 640.wmax * 25.sr, - left: 640.wmax * 40.sr, - right: 640.wmax * 40.sr, - bottom: 640.wmax * 25.sr, + top: 25.vp, + left: 40.vp, + right: 40.vp, + bottom: 25.vp, ), decoration: BoxDecoration( color: const Color(0xff2f1155), - borderRadius: BorderRadius.circular(640.wmax * 30.sr), + borderRadius: BorderRadius.circular(30.vp), boxShadow: [ BoxShadow( color: const Color(0x19272246), @@ -755,8 +732,8 @@ class PageHome extends GetView { onTap: () {}, child: Image.asset( 'lib/assets/images/tabbar/home_select.png', - width: 640.wmax * 28.sr, - height: 640.wmax * 28.sr, + width: 28.vp, + height: 28.vp, fit: BoxFit.fill, ), ), @@ -765,8 +742,8 @@ class PageHome extends GetView { onTap: () => GetNavigate.toNamed(GetRoutes.stats), child: Image.asset( 'lib/assets/images/tabbar/chart.png', - width: 640.wmax * 28.sr, - height: 640.wmax * 28.sr, + width: 28.vp, + height: 28.vp, fit: BoxFit.fill, ), ), @@ -775,8 +752,8 @@ class PageHome extends GetView { onTap: () => GetNavigate.toNamed(GetRoutes.notification), child: Image.asset( 'lib/assets/images/tabbar/notification.png', - width: 640.wmax * 28.sr, - height: 640.wmax * 28.sr, + width: 28.vp, + height: 28.vp, fit: BoxFit.fill, ), ), @@ -785,8 +762,8 @@ class PageHome extends GetView { onTap: () => GetNavigate.toNamed(GetRoutes.settings), child: Image.asset( 'lib/assets/images/tabbar/settings.png', - width: 640.wmax * 28.sr, - height: 640.wmax * 28.sr, + width: 28.vp, + height: 28.vp, fit: BoxFit.fill, ), ), diff --git a/lib/pages/langs/controller.dart b/lib/pages/langs/controller.dart index ab730d9..7ce23a3 100644 --- a/lib/pages/langs/controller.dart +++ b/lib/pages/langs/controller.dart @@ -26,8 +26,8 @@ class PageLangsController extends GetxController { super.onInit(); scrollController.addListener(() { - final expanded = 640.wmax * 152.sr; - final collapsed = max(640.wmax * 40.sr, mediaTopBar.value); + final expanded = 152.vp; + final collapsed = max(40.vp, mediaTopBar.value); isShadow.value = scrollController.position.pixels >= expanded - collapsed; }); } diff --git a/lib/pages/langs/index.dart b/lib/pages/langs/index.dart index f337c03..9eec9bc 100644 --- a/lib/pages/langs/index.dart +++ b/lib/pages/langs/index.dart @@ -19,7 +19,7 @@ class PageLangs extends GetView { final mediaTopBar = controller.mediaTopBar; final isShadow = controller.isShadow; - final top = max(mediaPadding.value.top, 640.wmax * 20.sr); + final top = max(mediaPadding.value.top, 20.vp); return Scaffold( body: Stack( @@ -39,8 +39,8 @@ class PageLangs extends GetView { elevation: 0.0, scrolledUnderElevation: 0.0, automaticallyImplyLeading: false, - collapsedHeight: max(640.wmax * 40.sr, mediaTopBar.value), - expandedHeight: 640.wmax * 152.sr, + collapsedHeight: max(40.vp, mediaTopBar.value), + expandedHeight: 152.vp, flexibleSpace: Obx(() { List? boxShadow; @@ -110,7 +110,7 @@ class PageLangs extends GetView { Widget buildBack(BuildContext context) { final mediaTopBar = controller.mediaTopBar.value; final mediaPadding = controller.mediaPadding.value; - final height = max(640.wmax * 40.sr, mediaTopBar); + final height = max(40.vp, mediaTopBar); return Positioned( top: 0, @@ -122,12 +122,12 @@ class PageLangs extends GetView { width: 680.wmax, height: height, margin: EdgeInsets.only( - top: max(mediaPadding.top, 640.wmax * 20.sr), - left: 640.wmax * 20.sr, + top: max(mediaPadding.top, 20.vp), + left: 20.vp, ), padding: EdgeInsets.only( - top: (height - 640.wmax * 36.sr) / 2, - bottom: (height - 640.wmax * 36.sr) / 2, + top: (height - 36.vp) / 2, + bottom: (height - 36.vp) / 2, ), child: Row( children: [ @@ -136,8 +136,8 @@ class PageLangs extends GetView { onTap: () => GetNavigate.back(), child: Image( image: const AssetImage('lib/assets/images/auth/back.png'), - width: 640.wmax * 36.sr, - height: 640.wmax * 36.sr, + width: 36.vp, + height: 36.vp, fit: BoxFit.fill, ), ), @@ -152,13 +152,13 @@ class PageLangs extends GetView { return Container( alignment: Alignment.center, constraints: const BoxConstraints.expand(), - padding: EdgeInsets.only(left: 640.wmax * 32.sr, right: 640.wmax * 32.sr), + padding: EdgeInsets.only(left: 32.vp, right: 32.vp), child: Text( 'Language'.tr, style: TextStyle( - fontSize: 640.wmax * 20.sr, - fontWeight: FontWeight.bold, color: const Color(0xff130138), + fontWeight: FontWeight.bold, + fontSize: 20.fp, letterSpacing: 3, height: 1, ), @@ -177,10 +177,10 @@ class PageLangs extends GetView { return Container( padding: EdgeInsets.only( - top: 640.wmax * 30.sr, - left: 640.wmax * 48.sr, - right: 640.wmax * 48.sr, - bottom: 640.wmax * 35.sr, + top: 30.vp, + left: 48.vp, + right: 48.vp, + bottom: 35.vp, ), child: Column( children: [ @@ -188,28 +188,25 @@ class PageLangs extends GetView { behavior: HitTestBehavior.opaque, child: Container( width: 640.wmax, - height: 640.wmax * 64.sr, + height: 64.vp, alignment: Alignment.center, decoration: BoxDecoration( color: Colors.white, - borderRadius: BorderRadius.circular(640.wmax * 15.sr), + borderRadius: BorderRadius.circular(15.vp), border: Border.all( color: isNull ? Color(0xff8438FF) : Colors.black26, - width: isNull ? 640.wmax * 1.4.sr : 640.wmax * 1.2.sr, + width: isNull ? 1.4.vp : 1.2.vp, ), ), - padding: EdgeInsets.symmetric( - horizontal: 640.wmax * 20.sr, - vertical: 640.wmax * 20.sr, - ), - margin: EdgeInsets.only(bottom: 640.wmax * 25.sr), + padding: EdgeInsets.symmetric(horizontal: 20.vp, vertical: 20.vp), + margin: EdgeInsets.only(bottom: 25.vp), child: Text( 'Follow System Language'.tr, textAlign: TextAlign.center, style: TextStyle( - fontSize: 640.wmax * 16.sr, - fontWeight: isNull ? FontWeight.w600 : FontWeight.w400, color: isNull ? Color(0xff8438FF) : Color(0xff808288), + fontWeight: isNull ? FontWeight.w600 : FontWeight.w400, + fontSize: 16.fp, height: 1.0, ), ), @@ -224,28 +221,25 @@ class PageLangs extends GetView { behavior: HitTestBehavior.opaque, child: Container( width: 640.wmax, - height: 640.wmax * 64.sr, + height: 64.vp, alignment: Alignment.center, decoration: BoxDecoration( color: Colors.white, - borderRadius: BorderRadius.circular(640.wmax * 15.sr), + borderRadius: BorderRadius.circular(15.vp), border: Border.all( color: isZhCn ? Color(0xff8438FF) : Colors.black26, - width: isZhCn ? 640.wmax * 1.4.sr : 640.wmax * 1.2.sr, + width: isZhCn ? 1.4.vp : 1.2.vp, ), ), - padding: EdgeInsets.symmetric( - horizontal: 640.wmax * 20.sr, - vertical: 640.wmax * 20.sr, - ), - margin: EdgeInsets.only(bottom: 640.wmax * 25.sr), + padding: EdgeInsets.symmetric(horizontal: 20.vp, vertical: 20.vp), + margin: EdgeInsets.only(bottom: 25.vp), child: Text( 'Chinese (zh-CN)'.tr, textAlign: TextAlign.center, style: TextStyle( - fontSize: 640.wmax * 16.sr, - fontWeight: isZhCn ? FontWeight.w600 : FontWeight.w400, color: isZhCn ? Color(0xff8438FF) : Color(0xff909399), + fontWeight: isZhCn ? FontWeight.w600 : FontWeight.w400, + fontSize: 16.fp, height: 1.0, ), ), @@ -260,28 +254,25 @@ class PageLangs extends GetView { behavior: HitTestBehavior.opaque, child: Container( width: 640.wmax, - height: 640.wmax * 64.sr, + height: 64.vp, alignment: Alignment.center, decoration: BoxDecoration( color: Colors.white, - borderRadius: BorderRadius.circular(640.wmax * 15.sr), + borderRadius: BorderRadius.circular(15.vp), border: Border.all( color: isEnUs ? Color(0xff8438FF) : Colors.black26, - width: isEnUs ? 640.wmax * 1.4.sr : 640.wmax * 1.2.sr, + width: isEnUs ? 1.4.vp : 1.2.vp, ), ), - padding: EdgeInsets.symmetric( - horizontal: 640.wmax * 20.sr, - vertical: 640.wmax * 20.sr, - ), - margin: EdgeInsets.only(bottom: 640.wmax * 25.sr), + padding: EdgeInsets.symmetric(horizontal: 20.vp, vertical: 20.vp), + margin: EdgeInsets.only(bottom: 25.vp), child: Text( 'English (en-US)'.tr, textAlign: TextAlign.center, style: TextStyle( - fontSize: 640.wmax * 16.sr, - fontWeight: isEnUs ? FontWeight.w600 : FontWeight.w400, color: isEnUs ? Color(0xff8438FF) : Color(0xff909399), + fontWeight: isEnUs ? FontWeight.w600 : FontWeight.w400, + fontSize: 16.fp, height: 1.0, ), ), @@ -301,9 +292,6 @@ class PageLangs extends GetView { final mediaPadding = controller.mediaPadding; final mediaBottom = mediaPadding.value.bottom; - return SizedBox( - width: 640.wmax, - height: max(mediaBottom, 640.wmax * 30.sr), - ); + return SizedBox(width: 640.wmax, height: max(mediaBottom, 30.vp)); } } diff --git a/lib/pages/logger/index.dart b/lib/pages/logger/index.dart index 19bb575..5b98748 100644 --- a/lib/pages/logger/index.dart +++ b/lib/pages/logger/index.dart @@ -18,8 +18,8 @@ class PageLogger extends GetView { final mediaTopBar = controller.mediaTopBar; final isShadow = controller.isShadow; - final height = max(640.wmax * 40.sr, mediaTopBar.value); - final offset = max(mediaPadding.value.top, 640.wmax * 20.sr); + final height = max(40.vp, mediaTopBar.value); + final offset = max(mediaPadding.value.top, 20.vp); return Scaffold( body: Stack( @@ -113,7 +113,7 @@ class PageLogger extends GetView { Widget buildBack(BuildContext context) { final mediaTopBar = controller.mediaTopBar.value; final mediaPadding = controller.mediaPadding.value; - final height = max(640.wmax * 40.sr, mediaTopBar); + final height = max(40.vp, mediaTopBar); return Positioned( top: 0, @@ -125,12 +125,12 @@ class PageLogger extends GetView { width: 680.wmax, height: height, margin: EdgeInsets.only( - top: max(mediaPadding.top, 640.wmax * 20.sr), - left: 640.wmax * 20.sr, + top: max(mediaPadding.top, 20.vp), + left: 20.vp, ), padding: EdgeInsets.only( - top: (height - 640.wmax * 36.sr) / 2, - bottom: (height - 640.wmax * 36.sr) / 2, + top: (height - 36.vp) / 2, + bottom: (height - 36.vp) / 2, ), child: Row( children: [ @@ -139,8 +139,8 @@ class PageLogger extends GetView { onTap: () => GetNavigate.back(), child: Image( image: const AssetImage('lib/assets/images/auth/back.png'), - width: 640.wmax * 36.sr, - height: 640.wmax * 36.sr, + width: 36.vp, + height: 36.vp, fit: BoxFit.fill, ), ), @@ -155,14 +155,14 @@ class PageLogger extends GetView { return Container( alignment: Alignment.center, constraints: const BoxConstraints.expand(), - padding: EdgeInsets.only(left: 640.wmax * 32.sr, right: 640.wmax * 32.sr), + padding: EdgeInsets.only(left: 32.vp, right: 32.vp), child: Text( 'Run Logger'.tr, style: TextStyle( - fontSize: 640.wmax * 20.sr, - fontWeight: FontWeight.bold, color: const Color(0xff130138), + fontWeight: FontWeight.bold, letterSpacing: 3, + fontSize: 20.fp, height: 1, ), ), @@ -175,8 +175,8 @@ class PageLogger extends GetView { final mediaTopBar = controller.mediaTopBar; final mediaTop = mediaPadding.value.top; - final header = max(640.wmax * 40.sr, mediaTopBar.value); - final offset = max(mediaTop, 640.wmax * 20.sr); + final header = max(40.vp, mediaTopBar.value); + final offset = max(mediaTop, 20.vp); final height = 100.vh - offset - header; return SizedBox( @@ -188,10 +188,10 @@ class PageLogger extends GetView { constrained: false, child: Container( padding: EdgeInsets.only( - top: 640.wmax * 5.sr, - left: 640.wmax * 5.sr, - right: 640.wmax * 5.sr, - bottom: 640.wmax * 20.sr, + top: 5.vp, + left: 5.vp, + right: 5.vp, + bottom: 20.vp, ), child: TextSelectionTheme( data: TextSelectionThemeData( @@ -201,9 +201,9 @@ class PageLogger extends GetView { child: SelectableText( controller.string.value, style: GoogleFonts.robotoMono( - fontWeight: FontWeight.w400, - fontSize: max(640.wmax * 11.sr, 11), color: Color(0xff303133), + fontWeight: FontWeight.w400, + fontSize: 11.fp, height: 1.4, ), ), @@ -237,10 +237,10 @@ class PageLogger extends GetView { child: Text( 'Loading logs, please wait...'.tr, style: TextStyle( - fontSize: 14, + color: Color(0xff707177), fontWeight: FontWeight.w600, letterSpacing: 1.5, - color: Color(0xff707177), + fontSize: 14.fp, ), ), ), diff --git a/lib/pages/login/index.dart b/lib/pages/login/index.dart index 5f1bcca..c0d8362 100644 --- a/lib/pages/login/index.dart +++ b/lib/pages/login/index.dart @@ -26,7 +26,7 @@ class PageLogin extends GetView { width: 640.wmax, height: 100.vh, child: ListView( - padding: EdgeInsets.only(bottom: 50.wdp), + padding: EdgeInsets.only(bottom: 50.vp), physics: const ClampingScrollPhysics(), children: [ buildMainTitle(context), @@ -70,11 +70,11 @@ class PageLogin extends GetView { padding: const EdgeInsets.fromLTRB(30, 20, 30, 80), child: Text( 'Requesting...'.tr, - style: const TextStyle( - fontSize: 16, + style: TextStyle( + color: Color(0xff707177), fontWeight: FontWeight.w600, letterSpacing: 1.5, - color: Color(0xff707177), + fontSize: 16.fp, ), ), ), @@ -92,10 +92,10 @@ class PageLogin extends GetView { return Container( alignment: Alignment.center, padding: EdgeInsets.only( - top: 640.wmax * 95.sr, - left: 640.wmax * 48.sr, - right: 640.wmax * 48.sr, - bottom: 640.wmax * 32.sr, + top: 95.vp, + left: 48.vp, + right: 48.vp, + bottom: 32.vp, ), child: Column( children: [ @@ -103,10 +103,10 @@ class PageLogin extends GetView { 'Welcome back'.tr, textAlign: TextAlign.center, style: TextStyle( - fontSize: 640.wmax * 24.sr, - fontFamily: 'PingFang', color: const Color(0xff2f1155), fontWeight: FontWeight.w700, + fontFamily: 'PingFang', + fontSize: 24.fp, height: 1.3, ), ), @@ -114,10 +114,10 @@ class PageLogin extends GetView { 'Digital Wallet'.tr, textAlign: TextAlign.center, style: TextStyle( - fontSize: 640.wmax * 24.sr, - fontFamily: 'PingFang', color: const Color(0xff2f1155), fontWeight: FontWeight.w700, + fontFamily: 'PingFang', + fontSize: 24.fp, height: 1.3, ), ), @@ -136,19 +136,19 @@ class PageLogin extends GetView { Container( alignment: Alignment.center, padding: EdgeInsets.only( - top: 640.wmax * 1.5.sr, - left: 640.wmax * 45.sr, - right: 640.wmax * 45.sr, - bottom: 640.wmax * 1.5.sr, + top: 1.5.vp, + left: 45.vp, + right: 45.vp, + bottom: 1.5.vp, ), child: Text( 'Sign in with'.tr, textAlign: TextAlign.center, style: TextStyle( - fontSize: 640.wmax * 14.sr, - fontFamily: 'PingFang', color: const Color(0xffbdbdbd), fontWeight: FontWeight.w500, + fontFamily: 'PingFang', + fontSize: 14.fp, height: 1.2, ), ), @@ -156,26 +156,26 @@ class PageLogin extends GetView { Container( alignment: Alignment.center, padding: EdgeInsets.only( - top: 640.wmax * 22.sr, - left: 640.wmax * 28.sr, - right: 640.wmax * 28.sr, - bottom: 640.wmax * 38.sr, + top: 22.vp, + left: 28.vp, + right: 28.vp, + bottom: 38.vp, ), child: Wrap( - spacing: 640.wmax * 20.sr, - runSpacing: 640.wmax * 18.sr, + spacing: 20.vp, + runSpacing: 18.vp, children: [ GestureDetector( behavior: HitTestBehavior.opaque, child: IntrinsicWidth( child: Container( padding: EdgeInsets.symmetric( - vertical: 640.wmax * 18.sr, - horizontal: 640.wmax * 20.sr, + vertical: 18.vp, + horizontal: 20.vp, ), decoration: BoxDecoration( color: Colors.white, - borderRadius: BorderRadius.circular(640.wmax * 15.sr), + borderRadius: BorderRadius.circular(15.vp), boxShadow: [ BoxShadow( color: Colors.black.withValues(alpha: 0.1), @@ -192,17 +192,17 @@ class PageLogin extends GetView { image: const AssetImage( 'lib/assets/images/auth/google.png', ), - width: 640.wmax * 24.sr, - height: 640.wmax * 24.sr, + width: 24.vp, + height: 24.vp, fit: BoxFit.fill, ), - SizedBox(width: 640.wmax * 7.sr), + SizedBox(width: 7.vp), Text( 'Google', style: TextStyle( - fontSize: 640.wmax * 16.sr, - fontWeight: FontWeight.w500, color: const Color(0xffbdbdbd), + fontWeight: FontWeight.w500, + fontSize: 16.fp, ), ), ], @@ -218,12 +218,12 @@ class PageLogin extends GetView { child: IntrinsicWidth( child: Container( padding: EdgeInsets.symmetric( - vertical: 640.wmax * 18.sr, - horizontal: 640.wmax * 20.sr, + vertical: 18.vp, + horizontal: 20.vp, ), decoration: BoxDecoration( color: const Color(0xff4368c7), - borderRadius: BorderRadius.circular(640.wmax * 15.sr), + borderRadius: BorderRadius.circular(15.vp), boxShadow: [ BoxShadow( color: Colors.black.withValues(alpha: 0.1), @@ -240,17 +240,17 @@ class PageLogin extends GetView { image: const AssetImage( 'lib/assets/images/auth/github.png', ), - width: 640.wmax * 24.sr, - height: 640.wmax * 24.sr, + width: 24.vp, + height: 24.vp, fit: BoxFit.fill, ), - SizedBox(width: 640.wmax * 9.sr), + SizedBox(width: 9.vp), Text( 'Github', style: TextStyle( - fontSize: 640.wmax * 16.sr, - fontWeight: FontWeight.w500, color: Colors.white, + fontWeight: FontWeight.w500, + fontSize: 16.fp, ), ), ], @@ -279,13 +279,13 @@ class PageLogin extends GetView { return Column( children: [ Container( - width: 640.wmax * 310.sr, - height: 640.wmax * 54.sr, + width: 310.vp, + height: 54.vp, alignment: Alignment.center, - margin: EdgeInsets.only(bottom: 640.wmax * 18.sr), + margin: EdgeInsets.only(bottom: 18.vp), decoration: BoxDecoration( color: const Color(0xfff2f2f2), - borderRadius: BorderRadius.circular(640.wmax * 15.sr), + borderRadius: BorderRadius.circular(15.vp), border: Border.all( width: 1, color: emailError.value @@ -296,20 +296,20 @@ class PageLogin extends GetView { child: TextField( focusNode: emailFocusNode, controller: emailController, - cursorWidth: 640.wmax * 1.8.sr, - cursorHeight: 640.wmax * 18.sr, + cursorWidth: 1.8.vp, + cursorHeight: 18.vp, keyboardType: TextInputType.text, textAlignVertical: TextAlignVertical.center, decoration: InputDecoration( filled: true, hintText: 'Email'.tr, prefixIcon: Container( - width: 640.wmax * 64.sr, + width: 64.vp, alignment: Alignment.center, child: Image( image: const AssetImage('lib/assets/images/auth/email.png'), - width: 640.wmax * 24.sr, - height: 640.wmax * 24.sr, + width: 24.vp, + height: 24.vp, fit: BoxFit.fill, ), ), @@ -318,19 +318,19 @@ class PageLogin extends GetView { enabledBorder: InputBorder.none, fillColor: Colors.transparent, hintStyle: TextStyle( - letterSpacing: 1.5, - fontSize: 640.wmax * 16.sr, - fontFamily: 'PingFang', - fontWeight: FontWeight.w500, color: const Color(0xff909399), + fontWeight: FontWeight.w500, + fontFamily: 'PingFang', + letterSpacing: 1.5, + fontSize: 16.fp, ), ), style: TextStyle( - letterSpacing: 1.5, - fontSize: 640.wmax * 16.sr, - fontFamily: 'PingFang', - fontWeight: FontWeight.w500, color: const Color(0xff606266), + fontWeight: FontWeight.w500, + fontFamily: 'PingFang', + letterSpacing: 1.5, + fontSize: 16.fp, ), onChanged: (v) { emailError.value = false; @@ -341,13 +341,13 @@ class PageLogin extends GetView { ), ), Container( - width: 640.wmax * 310.sr, - height: 640.wmax * 54.sr, + width: 310.vp, + height: 54.vp, alignment: Alignment.center, - margin: EdgeInsets.only(bottom: 640.wmax * 18.sr), + margin: EdgeInsets.only(bottom: 18.vp), decoration: BoxDecoration( color: const Color(0xfff2f2f2), - borderRadius: BorderRadius.circular(640.wmax * 15.sr), + borderRadius: BorderRadius.circular(15.vp), border: Border.all( width: 1, color: passwordError.value @@ -359,22 +359,22 @@ class PageLogin extends GetView { obscureText: true, focusNode: passwordFocusNode, controller: passwordController, - cursorWidth: 640.wmax * 1.8.sr, - cursorHeight: 640.wmax * 18.sr, + cursorWidth: 1.8.vp, + cursorHeight: 18.vp, keyboardType: TextInputType.text, textAlignVertical: TextAlignVertical.center, decoration: InputDecoration( filled: true, hintText: 'Password'.tr, prefixIcon: Container( - width: 640.wmax * 64.sr, + width: 64.vp, alignment: Alignment.center, child: Image( image: const AssetImage( 'lib/assets/images/auth/password.png', ), - width: 640.wmax * 24.sr, - height: 640.wmax * 24.sr, + width: 24.vp, + height: 24.vp, fit: BoxFit.fill, ), ), @@ -383,19 +383,19 @@ class PageLogin extends GetView { enabledBorder: InputBorder.none, fillColor: Colors.transparent, hintStyle: TextStyle( - letterSpacing: 1.5, - fontSize: 640.wmax * 16.sr, - fontFamily: 'PingFang', - fontWeight: FontWeight.w500, color: const Color(0xff909399), + fontWeight: FontWeight.w500, + fontFamily: 'PingFang', + letterSpacing: 1.5, + fontSize: 16.fp, ), ), style: TextStyle( - letterSpacing: 1.5, - fontSize: 640.wmax * 16.sr, - fontFamily: 'PingFang', - fontWeight: FontWeight.w500, color: const Color(0xff606266), + fontWeight: FontWeight.w500, + fontFamily: 'PingFang', + letterSpacing: 1.5, + fontSize: 16.fp, ), onChanged: (v) { passwordError.value = false; @@ -413,29 +413,29 @@ class PageLogin extends GetView { return Container( width: 100.vw, - height: 640.wmax * 100.sr, + height: 100.vp, alignment: Alignment.center, - margin: EdgeInsets.only(top: 640.wmax * 36.sr), + margin: EdgeInsets.only(top: 36.vp), child: Column( children: [ GestureDetector( behavior: HitTestBehavior.opaque, child: Container( - width: 640.wmax * 200.sr, - height: 640.wmax * 64.sr, + width: 200.vp, + height: 64.vp, alignment: Alignment.center, decoration: BoxDecoration( color: const Color(0xff5b259f), - borderRadius: BorderRadius.circular(640.wmax * 15.sr), + borderRadius: BorderRadius.circular(15.vp), ), child: Text( 'Login'.tr, style: TextStyle( - letterSpacing: 1.2, color: Colors.white, - fontSize: 640.wmax * 18.sr, fontWeight: FontWeight.bold, fontFamily: 'PingFang', + letterSpacing: 1.2, + fontSize: 18.fp, ), ), ), @@ -443,24 +443,24 @@ class PageLogin extends GetView { loginTimeout(signInWithAccount(), Duration(seconds: 5)); }, ), - SizedBox(height: 640.wmax * 12.sr), + SizedBox(height: 12.vp), RichText( text: TextSpan( children: [ TextSpan( text: "Don't have an account yet?".tr, style: TextStyle( - fontSize: 640.wmax * 14.sr, - fontWeight: FontWeight.w500, color: const Color(0xffbdbdbd), + fontWeight: FontWeight.w500, + fontSize: 14.fp, ), ), TextSpan( text: 'Register'.tr, style: TextStyle( - fontSize: 640.wmax * 14.sr, - fontWeight: FontWeight.w600, color: const Color(0xff81c2ff), + fontWeight: FontWeight.w600, + fontSize: 14.fp, ), recognizer: TapGestureRecognizer() ..onTap = () => GetNavigate.toNamed(GetRoutes.register), @@ -481,7 +481,7 @@ class PageLogin extends GetView { radius: 180.0, containedInkWell: true, highlightShape: BoxShape.rectangle, - borderRadius: BorderRadius.all(Radius.circular(640.wmax * 30.0.sr)), + borderRadius: BorderRadius.all(Radius.circular(30.0.vp)), highlightColor: const Color(0xff5b259f).withValues(alpha: 0.08), splashColor: const Color(0xff5b259f).withValues(alpha: 0.08), focusColor: Colors.transparent, @@ -494,20 +494,20 @@ class PageLogin extends GetView { return Container( width: 100.vw, - height: 640.wmax * 40.sr + controller.mediaPadding.value.bottom, - margin: EdgeInsets.only(top: 640.wmax * 21.sr), + height: 40.vp + controller.mediaPadding.value.bottom, + margin: EdgeInsets.only(top: 21.vp), alignment: Alignment.center, child: withInWell( child: Container( - width: 640.wmax * 160.sr, - height: 640.wmax * 40.sr, + width: 160.vp, + height: 40.vp, alignment: Alignment.center, child: Text( 'Guest Mode'.tr, style: TextStyle( - fontSize: 640.wmax * 14.sr, - fontWeight: FontWeight.w500, color: const Color(0xff909399), + fontWeight: FontWeight.w500, + fontSize: 14.fp, ), ), ), diff --git a/lib/pages/notification/controller.dart b/lib/pages/notification/controller.dart index 920417b..5279905 100644 --- a/lib/pages/notification/controller.dart +++ b/lib/pages/notification/controller.dart @@ -30,8 +30,8 @@ class PageNotificationController extends GetxController with RxWatcher { rw.ever(refMessages.list, (_) => transformer()); scrollController.addListener(() { - final expanded = 640.wmax * 152.sr; - final collapsed = max(640.wmax * 40.sr, mediaTopBar.value); + final expanded = 152.vp; + final collapsed = max(40.vp, mediaTopBar.value); isShadow.value = scrollController.position.pixels >= expanded - collapsed; }); diff --git a/lib/pages/notification/index.dart b/lib/pages/notification/index.dart index ccfaabf..f640c70 100644 --- a/lib/pages/notification/index.dart +++ b/lib/pages/notification/index.dart @@ -21,7 +21,7 @@ class PageNotification extends GetView { final mediaTopBar = controller.mediaTopBar; final isShadow = controller.isShadow; - final top = max(mediaPadding.value.top, 640.wmax * 20.sr); + final top = max(mediaPadding.value.top, 20.vp); return Scaffold( body: Stack( @@ -41,8 +41,8 @@ class PageNotification extends GetView { elevation: 0.0, scrolledUnderElevation: 0.0, automaticallyImplyLeading: false, - collapsedHeight: max(640.wmax * 40.sr, mediaTopBar.value), - expandedHeight: 640.wmax * 152.sr, + collapsedHeight: max(40.vp, mediaTopBar.value), + expandedHeight: 152.vp, flexibleSpace: Obx(() { List? boxShadow; @@ -112,7 +112,7 @@ class PageNotification extends GetView { Widget buildBack(BuildContext context) { final mediaTopBar = controller.mediaTopBar.value; final mediaPadding = controller.mediaPadding.value; - final height = max(640.wmax * 40.sr, mediaTopBar); + final height = max(40.vp, mediaTopBar); return Positioned( top: 0, @@ -124,12 +124,12 @@ class PageNotification extends GetView { width: 680.wmax, height: height, margin: EdgeInsets.only( - top: max(mediaPadding.top, 640.wmax * 20.sr), - left: 640.wmax * 20.sr, + top: max(mediaPadding.top, 20.vp), + left: 20.vp, ), padding: EdgeInsets.only( - top: (height - 640.wmax * 36.sr) / 2, - bottom: (height - 640.wmax * 36.sr) / 2, + top: (height - 36.vp) / 2, + bottom: (height - 36.vp) / 2, ), child: Row( children: [ @@ -138,8 +138,8 @@ class PageNotification extends GetView { onTap: () => GetNavigate.back(), child: Image( image: const AssetImage('lib/assets/images/auth/back.png'), - width: 640.wmax * 36.sr, - height: 640.wmax * 36.sr, + width: 36.vp, + height: 36.vp, fit: BoxFit.fill, ), ), @@ -154,14 +154,14 @@ class PageNotification extends GetView { return Container( alignment: Alignment.center, constraints: const BoxConstraints.expand(), - padding: EdgeInsets.only(left: 640.wmax * 32.sr, right: 640.wmax * 32.sr), + padding: EdgeInsets.only(left: 32.vp, right: 32.vp), child: Text( 'Notification'.tr, style: TextStyle( - fontSize: 640.wmax * 20.sr, - fontWeight: FontWeight.bold, color: const Color(0xff130138), + fontWeight: FontWeight.bold, letterSpacing: 3, + fontSize: 20.fp, height: 1, ), ), @@ -176,28 +176,28 @@ class PageNotification extends GetView { return GestureDetector( behavior: HitTestBehavior.opaque, child: Container( - width: 640.wmax * 312.sr, - margin: EdgeInsets.only(bottom: 640.wmax * 10.sr), + width: 312.vp, + margin: EdgeInsets.only(bottom: 10.vp), child: Stack( fit: StackFit.loose, children: [ Padding( - padding: EdgeInsets.all(640.wmax * 1.sr), + padding: EdgeInsets.all(1.vp), child: Container( - width: 640.wmax * 310.sr, + width: 310.vp, padding: EdgeInsets.only( - top: 640.wmax * 10.sr, - left: 640.wmax * 28.sr, - right: 640.wmax * 20.sr, - bottom: 640.wmax * 10.sr, + top: 10.vp, + left: 28.vp, + right: 20.vp, + bottom: 10.vp, ), decoration: BoxDecoration( color: Colors.white, - borderRadius: BorderRadius.circular(640.wmax * 17.sr), + borderRadius: BorderRadius.circular(17.vp), boxShadow: [ BoxShadow( color: const Color(0xff000000).withValues(alpha: .058), - offset: Offset(640.wmax * 3.sr, 640.wmax * 3.sr), + offset: Offset(3.vp, 3.vp), spreadRadius: 0, blurRadius: 20, ), @@ -209,20 +209,20 @@ class PageNotification extends GetView { crossAxisAlignment: CrossAxisAlignment.center, children: [ SizedBox( - width: 640.wmax * 220.sr, + width: 220.vp, child: Column( mainAxisAlignment: MainAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start, children: [ Container( alignment: Alignment.centerLeft, - height: 640.wmax * 21.sr, + height: 21.vp, child: Text( '${message.date.yMMMd()} ${message.date.jm()}', style: TextStyle( - fontSize: 640.wmax * 12.4.sr, - fontWeight: FontWeight.w500, color: const Color(0xffafafaf), + fontWeight: FontWeight.w500, + fontSize: 12.4.fp, ), ), ), @@ -231,9 +231,9 @@ class PageNotification extends GetView { child: Text( message.desc.tr, style: TextStyle( - fontSize: 640.wmax * 15.sr, - fontWeight: FontWeight.w600, color: const Color(0xff363853), + fontWeight: FontWeight.w600, + fontSize: 15.fp, height: 1.4, ), overflow: TextOverflow.ellipsis, @@ -242,13 +242,13 @@ class PageNotification extends GetView { ), Container( alignment: Alignment.centerLeft, - height: 640.wmax * 21.sr, + height: 21.vp, child: Text( message.money.usd, style: TextStyle( - fontSize: 640.wmax * 12.4.sr, - fontWeight: FontWeight.w600, color: const Color(0xff606266), + fontWeight: FontWeight.w600, + fontSize: 12.4.fp, ), ), ), @@ -259,8 +259,8 @@ class PageNotification extends GetView { message.money > 0.0 ? 'lib/assets/images/notification/income.png' : 'lib/assets/images/notification/expenditure.png', - height: 640.wmax * 20.sr, - width: 640.wmax * 20.sr, + height: 20.vp, + width: 20.vp, fit: BoxFit.fill, ), ], @@ -269,14 +269,14 @@ class PageNotification extends GetView { ), Positioned( top: 0, - right: 640.wmax * 9.sr, + right: 9.vp, child: Offstage( offstage: message.isRead != 'N', child: Container( - width: 640.wmax * 7.sr, - height: 640.wmax * 7.sr, + width: 7.vp, + height: 7.vp, decoration: BoxDecoration( - borderRadius: BorderRadius.circular(640.wmax * 3.5.sr), + borderRadius: BorderRadius.circular(3.5.vp), color: const Color(0xffff3333), ), ), @@ -303,29 +303,29 @@ class PageNotification extends GetView { } return Container( - width: 640.wmax * 312.sr, - margin: EdgeInsets.only(bottom: 640.wmax * 20.sr), - padding: EdgeInsets.only(bottom: 640.wmax * 1.sr), + width: 312.vp, + margin: EdgeInsets.only(bottom: 20.vp), + padding: EdgeInsets.only(bottom: 1.vp), child: Column( children: [ Container( - width: 640.wmax * 312.sr, - height: 640.wmax * 20.sr, + width: 312.vp, + height: 20.vp, alignment: Alignment.center, child: Text( msgYear.tr, style: TextStyle( - fontSize: 640.wmax * 14.8.sr, - fontWeight: FontWeight.w600, color: const Color(0xff363853), letterSpacing: group.year == nowYear ? 3 : 1, + fontWeight: FontWeight.w600, + fontSize: 14.8.fp, height: 1, ), ), ), - SizedBox(width: 640.wmax * 312.sr, height: 640.wmax * 15.sr), + SizedBox(width: 312.vp, height: 15.vp), SizedBox( - width: 640.wmax * 312.sr, + width: 312.vp, child: Column( children: [ ...messages.map((msg) { @@ -342,7 +342,7 @@ class PageNotification extends GetView { return Container( color: Colors.white, alignment: Alignment.center, - padding: EdgeInsets.only(left: 640.wmax * 32.sr, right: 640.wmax * 32.sr), + padding: EdgeInsets.only(left: 32.vp, right: 32.vp), child: Column( children: [ ...msgGroups.value.map((group) { @@ -357,9 +357,6 @@ class PageNotification extends GetView { final mediaPadding = controller.mediaPadding; final mediaBottom = mediaPadding.value.bottom; - return SizedBox( - width: 640.wmax, - height: max(mediaBottom - 640.wmax * 20.sr, 640.wmax * 10.sr), - ); + return SizedBox(width: 640.wmax, height: max(mediaBottom - 20.vp, 10.vp)); } } diff --git a/lib/pages/operater/controller.dart b/lib/pages/operater/controller.dart index 8adadaf..8fa7c4f 100644 --- a/lib/pages/operater/controller.dart +++ b/lib/pages/operater/controller.dart @@ -1,6 +1,6 @@ import 'package:get/get.dart'; import 'package:intl/intl.dart'; -import 'package:flutter_ringtone_player/flutter_ringtone_player.dart'; +import 'package:audioplayers/audioplayers.dart'; import 'package:dompet/configure/fluttertoast.dart'; import 'package:dompet/routes/navigator.dart'; import 'package:dompet/extension/money.dart'; @@ -18,6 +18,7 @@ class PageOperaterController extends GetxController { late final mediaTopBar = mediaQueryController.topBar; late final loginUser = storeController.user; + late AudioPlayer audioPlayer = AudioPlayer(); late String type = Get.arguments ?? ''; late Rx> options; late Rx operate; @@ -27,6 +28,7 @@ class PageOperaterController extends GetxController { onInit() { init(0.0); super.onInit(); + audioPlayer.audioCache = AudioCache(prefix: 'lib/assets/'); } void init(double num) { @@ -173,7 +175,12 @@ class PageOperaterController extends GetxController { ), ]); - await FlutterRingtonePlayer().playNotification(); + try { + final source = AssetSource('medias/pay.wav'); + await audioPlayer.play(source, volume: 0.5); + } catch (e) { + /* e */ + } Future.delayed(Duration(seconds: 3), () => money.value = 0.0); @@ -205,7 +212,12 @@ class PageOperaterController extends GetxController { ), ]); - await FlutterRingtonePlayer().playNotification(); + try { + final source = AssetSource('medias/pay.wav'); + await audioPlayer.play(source, volume: 0.5); + } catch (e) { + /* e */ + } Future.delayed(Duration(seconds: 3), () => money.value = 0.0); @@ -237,7 +249,12 @@ class PageOperaterController extends GetxController { ), ]); - await FlutterRingtonePlayer().playNotification(); + try { + final source = AssetSource('medias/pay.wav'); + await audioPlayer.play(source, volume: 0.5); + } catch (e) { + /* e */ + } Future.delayed(Duration(seconds: 3), () => money.value = 0.0); @@ -271,7 +288,12 @@ class PageOperaterController extends GetxController { ), ]); - await FlutterRingtonePlayer().playNotification(); + try { + final source = AssetSource('medias/pay.wav'); + await audioPlayer.play(source, volume: 0.5); + } catch (e) { + /* e */ + } Future.delayed(Duration(seconds: 3), () => money.value = 0.0); diff --git a/lib/pages/operater/index.dart b/lib/pages/operater/index.dart index 2deb864..1f8e31e 100644 --- a/lib/pages/operater/index.dart +++ b/lib/pages/operater/index.dart @@ -48,7 +48,7 @@ class PageOperater extends GetView { Widget buildBack(BuildContext context) { final mediaTopBar = controller.mediaTopBar.value; final mediaPadding = controller.mediaPadding.value; - final height = max(640.wmax * 40.sr, mediaTopBar); + final height = max(40.vp, mediaTopBar); return Positioned( top: 0, @@ -60,12 +60,12 @@ class PageOperater extends GetView { width: 680.wmax, height: height, margin: EdgeInsets.only( - top: max(mediaPadding.top, 640.wmax * 20.sr), - left: 640.wmax * 20.sr, + top: max(mediaPadding.top, 20.vp), + left: 20.vp, ), padding: EdgeInsets.only( - top: (height - 640.wmax * 36.sr) / 2, - bottom: (height - 640.wmax * 36.sr) / 2, + top: (height - 36.vp) / 2, + bottom: (height - 36.vp) / 2, ), child: Row( children: [ @@ -74,8 +74,8 @@ class PageOperater extends GetView { onTap: () => GetNavigate.back(), child: Image( image: const AssetImage('lib/assets/images/auth/back.png'), - width: 640.wmax * 36.sr, - height: 640.wmax * 36.sr, + width: 36.vp, + height: 36.vp, fit: BoxFit.fill, ), ), @@ -91,20 +91,14 @@ class PageOperater extends GetView { () => Container( color: Colors.white, alignment: Alignment.center, - margin: EdgeInsets.only( - top: 640.wmax * 130.sr, - bottom: 640.wmax * 44.sr, - ), - padding: EdgeInsets.only( - left: 640.wmax * 32.sr, - right: 640.wmax * 32.sr, - ), + margin: EdgeInsets.only(top: 130.vp, bottom: 44.vp), + padding: EdgeInsets.only(left: 32.vp, right: 32.vp), child: Text( controller.money.value.USD, style: TextStyle( - fontSize: 640.wmax * 32.sr, - fontWeight: FontWeight.bold, color: const Color(0xff2f1155), + fontWeight: FontWeight.bold, + fontSize: 32.fp, height: 1, ), ), @@ -142,8 +136,8 @@ class PageOperater extends GetView { return ClipOval( child: Image.memory( loginUser.avatar.value!, - width: 640.wmax * 20.sr, - height: 640.wmax * 20.sr, + width: 20.vp, + height: 20.vp, fit: BoxFit.fill, ), ); @@ -157,8 +151,8 @@ class PageOperater extends GetView { return ClipOval( child: Image.asset( 'lib/assets/images/payer/$icon.png', - width: 640.wmax * 20.sr, - height: 640.wmax * 20.sr, + width: 20.vp, + height: 20.vp, fit: BoxFit.fill, ), ); @@ -170,26 +164,26 @@ class PageOperater extends GetView { value: opt.id, padding: EdgeInsets.zero, child: Container( - width: 640.wmax * 375.sr, - height: 640.wmax * 48.sr, + width: 375.vp, + height: 48.vp, padding: EdgeInsets.only( - top: 640.wmax * 12.sr, - left: 640.wmax * 30.sr, - right: 640.wmax * 24.sr, - bottom: 640.wmax * 12.sr, + top: 12.vp, + left: 30.vp, + right: 24.vp, + bottom: 12.vp, ), child: Row( children: [ Padding( - padding: EdgeInsets.only(right: 640.wmax * 4.sr), + padding: EdgeInsets.only(right: 4.vp), child: iconAvatar(isTopup ? opt.from : opt.to), ), Text( isTopup ? opt.from.tr : opt.to.tr, style: TextStyle( - fontSize: 640.wmax * 16.sr, - fontWeight: FontWeight.w600, color: Color(0xff363853), + fontWeight: FontWeight.w600, + fontSize: 16.fp, ), ), Offstage( @@ -198,27 +192,24 @@ class PageOperater extends GetView { mainAxisSize: MainAxisSize.min, children: [ Padding( - padding: EdgeInsets.only( - left: 640.wmax * 15.sr, - right: 640.wmax * 15.sr, - ), + padding: EdgeInsets.only(left: 15.vp, right: 15.vp), child: Image.asset( 'lib/assets/images/operater/left.png', - height: 640.wmax * 26.sr, - width: 640.wmax * 24.sr, + height: 26.vp, + width: 24.vp, fit: BoxFit.fill, ), ), Padding( - padding: EdgeInsets.only(right: 640.wmax * 4.sr), + padding: EdgeInsets.only(right: 4.vp), child: iconAvatar(opt.from.toLowerCase()), ), Text( opt.from.tr, style: TextStyle( - fontSize: 640.wmax * 16.sr, - fontWeight: FontWeight.w600, color: Color(0xff363853), + fontWeight: FontWeight.w600, + fontSize: 16.fp, ), ), ], @@ -237,11 +228,8 @@ class PageOperater extends GetView { Container( color: Colors.white, alignment: Alignment.center, - padding: EdgeInsets.only( - left: 640.wmax * 32.sr, - right: 640.wmax * 32.sr, - ), - margin: EdgeInsets.only(bottom: 640.wmax * 42.sr), + padding: EdgeInsets.only(left: 32.vp, right: 32.vp), + margin: EdgeInsets.only(bottom: 42.vp), child: PopupMenuButton( elevation: 2.5, color: Colors.white, @@ -250,28 +238,25 @@ class PageOperater extends GetView { clipBehavior: Clip.antiAlias, position: PopupMenuPosition.under, shadowColor: Color(0x88000000), - constraints: BoxConstraints( - minWidth: 640.wmax * 311.sr, - maxWidth: 640.wmax * 311.sr, - ), + constraints: BoxConstraints(minWidth: 311.vp, maxWidth: 311.vp), shape: RoundedRectangleBorder( - borderRadius: BorderRadius.circular(640.wmax * 20.sr), + borderRadius: BorderRadius.circular(20.vp), ), - offset: Offset(0, 640.wmax * 3.sr), + offset: Offset(0, 3.vp), onSelected: (id) => controller.find(id), itemBuilder: (BuildContext context) => itemBuilder(), child: Container( - height: 640.wmax * 66.sr, + height: 66.vp, alignment: Alignment.center, decoration: BoxDecoration( - borderRadius: BorderRadius.circular(640.wmax * 20.sr), + borderRadius: BorderRadius.circular(20.vp), color: Color(0xfff2f2f2), ), padding: EdgeInsets.only( - top: 640.wmax * 20.sr, - left: 640.wmax * 30.sr, - right: 640.wmax * 24.sr, - bottom: 640.wmax * 20.sr, + top: 20.vp, + left: 30.vp, + right: 24.vp, + bottom: 20.vp, ), child: Row( children: [ @@ -280,15 +265,15 @@ class PageOperater extends GetView { mainAxisSize: MainAxisSize.min, children: [ Padding( - padding: EdgeInsets.only(right: 640.wmax * 4.sr), + padding: EdgeInsets.only(right: 4.vp), child: iconAvatar(isTopup ? from : to), ), Text( isTopup ? from.tr : to.tr, style: TextStyle( - fontSize: 640.wmax * 16.sr, - fontWeight: FontWeight.w600, color: Color(0xff363853), + fontWeight: FontWeight.w600, + fontSize: 16.fp, ), ), Offstage( @@ -298,28 +283,26 @@ class PageOperater extends GetView { children: [ Padding( padding: EdgeInsets.only( - left: 640.wmax * 15.sr, - right: 640.wmax * 15.sr, + left: 15.vp, + right: 15.vp, ), child: Image.asset( 'lib/assets/images/operater/left.png', - height: 640.wmax * 26.sr, - width: 640.wmax * 24.sr, + height: 26.vp, + width: 24.vp, fit: BoxFit.fill, ), ), Padding( - padding: EdgeInsets.only( - right: 640.wmax * 4.sr, - ), + padding: EdgeInsets.only(right: 4.vp), child: iconAvatar(from.toLowerCase()), ), Text( from.tr, style: TextStyle( - fontSize: 640.wmax * 16.sr, - fontWeight: FontWeight.w600, color: Color(0xff363853), + fontWeight: FontWeight.w600, + fontSize: 16.fp, ), ), ], @@ -329,14 +312,11 @@ class PageOperater extends GetView { ), ), Padding( - padding: EdgeInsets.only( - left: 640.wmax * 15.sr, - right: 640.wmax * 6.sr, - ), + padding: EdgeInsets.only(left: 15.vp, right: 6.vp), child: Image.asset( 'lib/assets/images/operater/down.png', - height: 640.wmax * 24.sr, - width: 640.wmax * 24.sr, + height: 24.vp, + width: 24.vp, ), ), ], @@ -360,9 +340,9 @@ class PageOperater extends GetView { child = Text( text, style: TextStyle( - fontSize: 640.wmax * 24.sr, - fontWeight: FontWeight.w500, color: Color(0xff363853), + fontWeight: FontWeight.w500, + fontSize: 24.fp, height: 1.0, ), ); @@ -371,8 +351,8 @@ class PageOperater extends GetView { if (text == 'Delete') { child = Image.asset( 'lib/assets/images/operater/delete.png', - height: 640.wmax * 27.sr, - width: 640.wmax * 25.sr, + height: 27.vp, + width: 25.vp, fit: BoxFit.fill, ); } @@ -380,8 +360,8 @@ class PageOperater extends GetView { if (text == 'Clear') { child = Image.asset( 'lib/assets/images/operater/clear.png', - height: 640.wmax * 24.sr, - width: 640.wmax * 24.sr, + height: 24.vp, + width: 24.vp, fit: BoxFit.fill, ); } @@ -392,14 +372,14 @@ class PageOperater extends GetView { radius: 100.0, containedInkWell: true, highlightShape: BoxShape.rectangle, - borderRadius: BorderRadius.all(Radius.circular(640.wmax * 20.0.sr)), + borderRadius: BorderRadius.all(Radius.circular(20.0.vp)), highlightColor: const Color(0xfff0f0f0).withValues(alpha: 1), splashColor: const Color(0xfff0f0f0).withValues(alpha: 1), focusColor: Colors.transparent, hoverColor: Colors.transparent, child: Container( - width: 640.wmax * 60.sr, - height: 640.wmax * 60.sr, + width: 60.vp, + height: 60.vp, alignment: Alignment.center, child: child, ), @@ -423,15 +403,15 @@ class PageOperater extends GetView { return Container( color: Colors.white, alignment: Alignment.center, - padding: EdgeInsets.only(left: 640.wmax * 32.sr, right: 640.wmax * 32.sr), - margin: EdgeInsets.only(bottom: 640.wmax * 68.sr), + padding: EdgeInsets.only(left: 32.vp, right: 32.vp), + margin: EdgeInsets.only(bottom: 68.vp), child: SizedBox( - width: 640.wmax * 250.sr, + width: 250.vp, child: Column( children: [ Container( - width: 640.wmax * 250.sr, - margin: EdgeInsets.only(bottom: 640.wmax * 20.sr), + width: 250.vp, + margin: EdgeInsets.only(bottom: 20.vp), child: Row( mainAxisSize: MainAxisSize.min, mainAxisAlignment: MainAxisAlignment.spaceBetween, @@ -439,8 +419,8 @@ class PageOperater extends GetView { ), ), Container( - width: 640.wmax * 250.sr, - margin: EdgeInsets.only(bottom: 640.wmax * 20.sr), + width: 250.vp, + margin: EdgeInsets.only(bottom: 20.vp), child: Row( mainAxisSize: MainAxisSize.min, mainAxisAlignment: MainAxisAlignment.spaceBetween, @@ -448,8 +428,8 @@ class PageOperater extends GetView { ), ), Container( - width: 640.wmax * 250.sr, - margin: EdgeInsets.only(bottom: 640.wmax * 30.sr), + width: 250.vp, + margin: EdgeInsets.only(bottom: 30.vp), child: Row( mainAxisSize: MainAxisSize.min, mainAxisAlignment: MainAxisAlignment.spaceBetween, @@ -457,7 +437,7 @@ class PageOperater extends GetView { ), ), Container( - width: 640.wmax * 250.sr, + width: 250.vp, margin: EdgeInsets.only(bottom: 0), child: Row( mainAxisSize: MainAxisSize.min, @@ -477,11 +457,11 @@ class PageOperater extends GetView { Widget buildConfirmBtn(BuildContext context) { final mediaPadding = controller.mediaPadding.value; - final mediaBottom = max(mediaPadding.bottom, 640.wmax * 30.sr); + final mediaBottom = max(mediaPadding.bottom, 30.vp); return Container( alignment: Alignment.center, - padding: EdgeInsets.only(left: 640.wmax * 32.sr, right: 640.wmax * 32.sr), + padding: EdgeInsets.only(left: 32.vp, right: 32.vp), margin: EdgeInsets.only(bottom: mediaBottom), child: Material( color: Colors.transparent, @@ -489,25 +469,25 @@ class PageOperater extends GetView { radius: 100.0, containedInkWell: true, highlightShape: BoxShape.rectangle, - borderRadius: BorderRadius.all(Radius.circular(640.wmax * 20.0.sr)), + borderRadius: BorderRadius.all(Radius.circular(20.0.vp)), highlightColor: const Color(0xff5b259f).withValues(alpha: 1), splashColor: const Color(0xff5b259f).withValues(alpha: 1), focusColor: Colors.transparent, hoverColor: Colors.transparent, child: Container( - width: 640.wmax * 195.sr, - height: 640.wmax * 65.sr, + width: 195.vp, + height: 65.vp, alignment: Alignment.center, decoration: BoxDecoration( - borderRadius: BorderRadius.circular(640.wmax * 15.sr), + borderRadius: BorderRadius.circular(15.vp), color: Color(0xff5b259f).withValues(alpha: 0.85), ), child: Text( controller.type.tr, style: TextStyle( - fontSize: 640.wmax * 20.sr, - fontWeight: FontWeight.w600, color: Colors.white, + fontWeight: FontWeight.w600, + fontSize: 20.fp, ), ), ), diff --git a/lib/pages/profile/index.dart b/lib/pages/profile/index.dart index 2c8473f..df3c189 100644 --- a/lib/pages/profile/index.dart +++ b/lib/pages/profile/index.dart @@ -47,7 +47,7 @@ class PageProfile extends GetView { Widget buildBack(BuildContext context) { final mediaTopBar = controller.mediaTopBar.value; final mediaPadding = controller.mediaPadding.value; - final height = max(640.wmax * 40.sr, mediaTopBar); + final height = max(40.vp, mediaTopBar); return Positioned( top: 0, @@ -59,12 +59,12 @@ class PageProfile extends GetView { width: 680.wmax, height: height, margin: EdgeInsets.only( - top: max(mediaPadding.top, 640.wmax * 20.sr), - left: 640.wmax * 20.sr, + top: max(mediaPadding.top, 20.vp), + left: 20.vp, ), padding: EdgeInsets.only( - top: (height - 640.wmax * 36.sr) / 2, - bottom: (height - 640.wmax * 36.sr) / 2, + top: (height - 36.vp) / 2, + bottom: (height - 36.vp) / 2, ), child: Row( children: [ @@ -73,8 +73,8 @@ class PageProfile extends GetView { onTap: () => GetNavigate.back(), child: Image( image: const AssetImage('lib/assets/images/auth/back.png'), - width: 640.wmax * 36.sr, - height: 640.wmax * 36.sr, + width: 36.vp, + height: 36.vp, fit: BoxFit.fill, ), ), @@ -92,8 +92,8 @@ class PageProfile extends GetView { if (controller.avatar.value.bv) { return Image.memory( controller.avatar.value!, - width: 640.wmax * 96.sr, - height: 640.wmax * 96.sr, + width: 96.vp, + height: 96.vp, fit: BoxFit.fill, ); } @@ -101,16 +101,16 @@ class PageProfile extends GetView { if (userAvatar.value.bv) { return Image.memory( userAvatar.value!, - width: 640.wmax * 96.sr, - height: 640.wmax * 96.sr, + width: 96.vp, + height: 96.vp, fit: BoxFit.fill, ); } return Image.asset( 'lib/assets/images/home/avatar.png', - width: 640.wmax * 96.sr, - height: 640.wmax * 96.sr, + width: 96.vp, + height: 96.vp, fit: BoxFit.fill, ); } @@ -124,23 +124,21 @@ class PageProfile extends GetView { return Container( color: Colors.white, alignment: Alignment.center, - padding: EdgeInsets.only(left: 640.wmax * 30.sr, right: 640.wmax * 30.sr), - margin: EdgeInsets.only(top: 640.wmax * 110.sr, bottom: 640.wmax * 18.sr), + padding: EdgeInsets.only(left: 30.vp, right: 30.vp), + margin: EdgeInsets.only(top: 110.vp, bottom: 18.vp), child: Column( children: [ Padding( - padding: EdgeInsets.only(bottom: 640.wmax * 10.sr), + padding: EdgeInsets.only(bottom: 10.vp), child: ClipOval( child: GestureDetector( behavior: HitTestBehavior.opaque, onTap: () => controller.pickAvatar(), child: Container( - width: 640.wmax * 96.sr, - height: 640.wmax * 96.sr, + width: 96.vp, + height: 96.vp, decoration: BoxDecoration( - borderRadius: BorderRadius.all( - Radius.circular(640.wmax * 48.sr), - ), + borderRadius: BorderRadius.all(Radius.circular(48.vp)), color: Color(0xffeae9e5).withValues(alpha: 0.85), ), child: Stack( @@ -151,18 +149,18 @@ class PageProfile extends GetView { left: 0, bottom: 0, child: Container( - width: 640.wmax * 96.sr, - height: 640.wmax * 24.sr, + width: 96.vp, + height: 24.vp, alignment: Alignment.center, - padding: EdgeInsets.only(bottom: 640.wmax * 3.sr), + padding: EdgeInsets.only(bottom: 3.vp), color: Color(0xff2f1155).withValues(alpha: 0.75), child: Text( 'change'.tr, style: TextStyle( - fontSize: 640.wmax * 12.sr, - fontWeight: FontWeight.w500, color: Colors.white, + fontWeight: FontWeight.w500, letterSpacing: 1.0, + fontSize: 12.fp, height: 1, ), ), @@ -176,14 +174,14 @@ class PageProfile extends GetView { ), Container( alignment: Alignment.center, - padding: EdgeInsets.only(bottom: 640.wmax * 30.sr), + padding: EdgeInsets.only(bottom: 30.vp), child: IntrinsicWidth( child: TextField( readOnly: readonly.value, focusNode: nameFocusNode, controller: nameController, - cursorWidth: 640.wmax * 1.8.sr, - cursorHeight: 640.wmax * 18.sr, + cursorWidth: 1.8.vp, + cursorHeight: 18.vp, keyboardType: TextInputType.text, textAlignVertical: TextAlignVertical.center, decoration: InputDecoration( @@ -196,61 +194,58 @@ class PageProfile extends GetView { behavior: HitTestBehavior.opaque, onTap: () => controller.changeName(), child: Container( - width: 640.wmax * 42.sr, - height: 640.wmax * 42.sr, + width: 42.vp, + height: 42.vp, alignment: Alignment.center, child: Image.asset( 'lib/assets/images/profile/edit.png'.tr, - height: 640.wmax * 22.sr, - width: 640.wmax * 22.sr, + height: 22.vp, + width: 22.vp, fit: BoxFit.fill, ), ), ), hintStyle: TextStyle( - fontSize: 640.wmax * 20.sr, - fontFamily: 'PingFang', - fontWeight: FontWeight.w400, color: const Color(0xff9f9f9f), + fontWeight: FontWeight.w400, + fontFamily: 'PingFang', + fontSize: 20.fp, ), hintText: nameController.text.isEmpty ? 'please enter your name...'.tr : null, ), style: TextStyle( - fontSize: 640.wmax * 22.sr, - fontFamily: 'PingFang', - fontWeight: FontWeight.w600, color: const Color(0xff130138), + fontWeight: FontWeight.w600, + fontFamily: 'PingFang', + fontSize: 22.fp, ), ), ), ), IntrinsicWidth( child: Container( - constraints: BoxConstraints( - minWidth: 640.wmax * 240.sr, - minHeight: 640.wmax * 44.sr, - ), + constraints: BoxConstraints(minWidth: 240.vp, minHeight: 44.vp), child: Column( children: [ Container( alignment: Alignment.centerLeft, - margin: EdgeInsets.only(bottom: 640.wmax * 10.sr), - constraints: BoxConstraints(minHeight: 640.wmax * 30.sr), + margin: EdgeInsets.only(bottom: 10.vp), + constraints: BoxConstraints(minHeight: 30.vp), child: Row( mainAxisSize: MainAxisSize.min, mainAxisAlignment: MainAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start, children: [ SizedBox( - width: 640.wmax * 56.sr, + width: 56.vp, child: Text( 'Email:'.tr, style: TextStyle( - fontSize: 640.wmax * 16.sr, - fontWeight: FontWeight.w600, color: Color(0xff130138), + fontWeight: FontWeight.w600, + fontSize: 16.fp, ), ), ), @@ -258,9 +253,9 @@ class PageProfile extends GetView { child: Text( loginUser.email.value, style: TextStyle( - fontSize: 640.wmax * 16.sr, - fontWeight: FontWeight.w600, color: Color(0xff303133), + fontWeight: FontWeight.w600, + fontSize: 16.fp, ), ), ), @@ -269,21 +264,21 @@ class PageProfile extends GetView { ), Container( alignment: Alignment.centerLeft, - margin: EdgeInsets.only(bottom: 640.wmax * 10.sr), - constraints: BoxConstraints(minHeight: 640.wmax * 30.sr), + margin: EdgeInsets.only(bottom: 10.vp), + constraints: BoxConstraints(minHeight: 30.vp), child: Row( mainAxisSize: MainAxisSize.min, mainAxisAlignment: MainAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start, children: [ SizedBox( - width: 640.wmax * 56.sr, + width: 56.vp, child: Text( 'Date:'.tr, style: TextStyle( - fontSize: 640.wmax * 16.sr, - fontWeight: FontWeight.w600, color: Color(0xff130138), + fontWeight: FontWeight.w600, + fontSize: 16.fp, ), ), ), @@ -291,9 +286,9 @@ class PageProfile extends GetView { child: Text( loginUser.createDate.value.yMMMd(), style: TextStyle( - fontSize: 640.wmax * 16.sr, - fontWeight: FontWeight.w600, color: Color(0xff303133), + fontWeight: FontWeight.w600, + fontSize: 16.fp, ), ), ), @@ -302,21 +297,21 @@ class PageProfile extends GetView { ), Container( alignment: Alignment.centerLeft, - margin: EdgeInsets.only(bottom: 640.wmax * 10.sr), - constraints: BoxConstraints(minHeight: 640.wmax * 30.sr), + margin: EdgeInsets.only(bottom: 10.vp), + constraints: BoxConstraints(minHeight: 30.vp), child: Row( mainAxisSize: MainAxisSize.min, mainAxisAlignment: MainAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start, children: [ SizedBox( - width: 640.wmax * 56.sr, + width: 56.vp, child: Text( 'State:'.tr, style: TextStyle( - fontSize: 640.wmax * 16.sr, - fontWeight: FontWeight.w600, color: Color(0xff130138), + fontWeight: FontWeight.w600, + fontSize: 16.fp, ), ), ), @@ -326,9 +321,9 @@ class PageProfile extends GetView { ? 'unavailable'.tr : 'available'.tr, style: TextStyle( - fontSize: 640.wmax * 16.sr, - fontWeight: FontWeight.w600, color: Color(0xff303133), + fontWeight: FontWeight.w600, + fontSize: 16.fp, ), ), ), @@ -347,7 +342,7 @@ class PageProfile extends GetView { Widget buildUpdateBtn(BuildContext context) { final updateUser = controller.updateUser; final mediaPadding = controller.mediaPadding.value; - final mediaBottom = max(mediaPadding.bottom, 640.wmax * 30.sr); + final mediaBottom = max(mediaPadding.bottom, 30.vp); Widget withInWell({required Widget child, dynamic onTap}) { return Material( @@ -356,7 +351,7 @@ class PageProfile extends GetView { radius: 200.0, containedInkWell: true, highlightShape: BoxShape.rectangle, - borderRadius: BorderRadius.all(Radius.circular(640.wmax * 30.0.sr)), + borderRadius: BorderRadius.all(Radius.circular(30.0.vp)), highlightColor: const Color(0xff45197d).withValues(alpha: 0.05), splashColor: const Color(0xff45197d).withValues(alpha: 0.05), focusColor: Colors.transparent, @@ -370,30 +365,23 @@ class PageProfile extends GetView { return Container( color: Colors.white, alignment: Alignment.center, - padding: EdgeInsets.only( - left: 640.wmax * 32.sr, - right: 640.wmax * 32.sr, - bottom: mediaBottom, - ), - margin: EdgeInsets.only(top: 640.wmax * 42.sr), + padding: EdgeInsets.only(left: 32.vp, right: 32.vp, bottom: mediaBottom), + margin: EdgeInsets.only(top: 42.vp), child: IntrinsicWidth( child: withInWell( onTap: () => updateUser(), child: Container( color: Colors.transparent, alignment: Alignment.center, - constraints: BoxConstraints(minWidth: 640.wmax * 160.sr), - padding: EdgeInsets.symmetric( - vertical: 640.wmax * 15.sr, - horizontal: 640.wmax * 18.sr, - ), + constraints: BoxConstraints(minWidth: 160.vp), + padding: EdgeInsets.symmetric(vertical: 15.vp, horizontal: 18.vp), child: Text( 'Update'.tr, style: TextStyle( - fontSize: 640.wmax * 18.sr, - fontWeight: FontWeight.bold, color: const Color(0xff5b259f), + fontWeight: FontWeight.bold, letterSpacing: 1.2, + fontSize: 18.fp, height: 1.2, ), ), diff --git a/lib/pages/register/index.dart b/lib/pages/register/index.dart index 5dff248..ab7e0bd 100644 --- a/lib/pages/register/index.dart +++ b/lib/pages/register/index.dart @@ -28,7 +28,7 @@ class PageRegister extends GetView { height: 100.vh, child: ListView( shrinkWrap: false, - padding: EdgeInsets.only(bottom: 50.wdp), + padding: EdgeInsets.only(bottom: 50.vp), physics: const ClampingScrollPhysics(), children: [ buildMainTitle(context), @@ -62,11 +62,8 @@ class PageRegister extends GetView { alignment: Alignment.topCenter, child: Container( width: 680.wmax, - height: 640.wmax * 36.sr, - margin: EdgeInsets.only( - top: max(top, 640.wmax * 20.sr), - left: 640.wmax * 20.sr, - ), + height: 36.vp, + margin: EdgeInsets.only(top: max(top, 20.vp), left: 20.vp), child: Row( children: [ GestureDetector( @@ -74,8 +71,8 @@ class PageRegister extends GetView { onTap: () => GetNavigate.back(), child: Image( image: const AssetImage('lib/assets/images/auth/back.png'), - width: 640.wmax * 36.sr, - height: 640.wmax * 36.sr, + width: 36.vp, + height: 36.vp, fit: BoxFit.fill, ), ), @@ -108,11 +105,11 @@ class PageRegister extends GetView { padding: const EdgeInsets.fromLTRB(30, 20, 30, 80), child: Text( 'Requesting...'.tr, - style: const TextStyle( - fontSize: 16, + style: TextStyle( + color: Color(0xff707177), fontWeight: FontWeight.w600, letterSpacing: 1.5, - color: Color(0xff707177), + fontSize: 16.fp, ), ), ), @@ -133,21 +130,19 @@ class PageRegister extends GetView { return Container( alignment: Alignment.center, padding: EdgeInsets.only( - bottom: 640.wmax * 32.sr, - right: 640.wmax * 48.sr, - left: 640.wmax * 48.sr, - top: orientation.value == Orientation.portrait - ? 640.wmax * 95.sr - : 640.wmax * 60.sr, + bottom: 32.vp, + right: 48.vp, + left: 48.vp, + top: orientation.value == Orientation.portrait ? 95.vp : 60.vp, ), child: Text( 'Experience the convenience of handed trading'.tr, textAlign: TextAlign.center, style: TextStyle( - fontSize: 640.wmax * 24.sr, - fontFamily: 'PingFang', color: const Color(0xff2f1155), fontWeight: FontWeight.w700, + fontFamily: 'PingFang', + fontSize: 24.fp, height: 1.2, ), ), @@ -164,19 +159,19 @@ class PageRegister extends GetView { Container( alignment: Alignment.center, padding: EdgeInsets.only( - top: 640.wmax * 1.5.sr, - left: 640.wmax * 45.sr, - right: 640.wmax * 45.sr, - bottom: 640.wmax * 1.5.sr, + top: 1.5.vp, + left: 45.vp, + right: 45.vp, + bottom: 1.5.vp, ), child: Text( 'Sign up with'.tr, textAlign: TextAlign.center, style: TextStyle( - fontSize: 640.wmax * 13.sr, - fontFamily: 'PingFang', color: const Color(0xffbdbdbd), fontWeight: FontWeight.w500, + fontFamily: 'PingFang', + fontSize: 13.fp, height: 1.2, ), ), @@ -184,26 +179,26 @@ class PageRegister extends GetView { Container( alignment: Alignment.center, padding: EdgeInsets.only( - top: 640.wmax * 22.sr, - left: 640.wmax * 28.sr, - right: 640.wmax * 28.sr, - bottom: 640.wmax * 38.sr, + top: 22.vp, + left: 28.vp, + right: 28.vp, + bottom: 38.vp, ), child: Wrap( - spacing: 640.wmax * 20.sr, - runSpacing: 640.wmax * 15.sr, + spacing: 20.vp, + runSpacing: 15.vp, children: [ GestureDetector( behavior: HitTestBehavior.opaque, child: IntrinsicWidth( child: Container( padding: EdgeInsets.symmetric( - vertical: 640.wmax * 18.sr, - horizontal: 640.wmax * 20.sr, + vertical: 18.vp, + horizontal: 20.vp, ), decoration: BoxDecoration( color: Colors.white, - borderRadius: BorderRadius.circular(640.wmax * 15.sr), + borderRadius: BorderRadius.circular(15.vp), boxShadow: [ BoxShadow( color: Colors.black.withValues(alpha: 0.1), @@ -220,17 +215,17 @@ class PageRegister extends GetView { image: const AssetImage( 'lib/assets/images/auth/google.png', ), - width: 640.wmax * 24.sr, - height: 640.wmax * 24.sr, + width: 24.vp, + height: 24.vp, fit: BoxFit.fill, ), - SizedBox(width: 640.wmax * 6.sr), + SizedBox(width: 6.vp), Text( 'Google', style: TextStyle( - fontSize: 640.wmax * 16.sr, - fontWeight: FontWeight.w500, color: const Color(0xffbdbdbd), + fontWeight: FontWeight.w500, + fontSize: 16.fp, ), ), ], @@ -246,12 +241,12 @@ class PageRegister extends GetView { child: IntrinsicWidth( child: Container( padding: EdgeInsets.symmetric( - vertical: 640.wmax * 18.sr, - horizontal: 640.wmax * 20.sr, + vertical: 18.vp, + horizontal: 20.vp, ), decoration: BoxDecoration( color: const Color(0xff4368c7), - borderRadius: BorderRadius.circular(640.wmax * 15.sr), + borderRadius: BorderRadius.circular(15.vp), boxShadow: [ BoxShadow( color: Colors.black.withValues(alpha: 0.1), @@ -268,17 +263,17 @@ class PageRegister extends GetView { image: const AssetImage( 'lib/assets/images/auth/github.png', ), - width: 640.wmax * 24.sr, - height: 640.wmax * 24.sr, + width: 24.vp, + height: 24.vp, fit: BoxFit.fill, ), - SizedBox(width: 640.wmax * 6.sr), + SizedBox(width: 6.vp), Text( 'Github', style: TextStyle( - fontSize: 640.wmax * 16.sr, - fontWeight: FontWeight.w500, color: Colors.white, + fontWeight: FontWeight.w500, + fontSize: 16.fp, ), ), ], @@ -313,13 +308,13 @@ class PageRegister extends GetView { return Column( children: [ Container( - width: 640.wmax * 310.sr, - height: 640.wmax * 54.sr, + width: 310.vp, + height: 54.vp, alignment: Alignment.center, - margin: EdgeInsets.only(bottom: 640.wmax * 18.sr), + margin: EdgeInsets.only(bottom: 18.vp), decoration: BoxDecoration( color: const Color(0xfff2f2f2), - borderRadius: BorderRadius.circular(640.wmax * 15.sr), + borderRadius: BorderRadius.circular(15.vp), border: Border.all( width: 1, color: emailError.value @@ -330,20 +325,20 @@ class PageRegister extends GetView { child: TextField( focusNode: emailFocusNode, controller: emailController, - cursorWidth: 640.wmax * 1.8.sr, - cursorHeight: 640.wmax * 18.sr, + cursorWidth: 1.8.vp, + cursorHeight: 18.vp, keyboardType: TextInputType.text, textAlignVertical: TextAlignVertical.center, decoration: InputDecoration( filled: true, hintText: 'Email'.tr, prefixIcon: Container( - width: 640.wmax * 64.sr, + width: 64.vp, alignment: Alignment.center, child: Image( image: const AssetImage('lib/assets/images/auth/email.png'), - width: 640.wmax * 24.sr, - height: 640.wmax * 24.sr, + width: 24.vp, + height: 24.vp, fit: BoxFit.fill, ), ), @@ -353,18 +348,18 @@ class PageRegister extends GetView { fillColor: Colors.transparent, hintStyle: TextStyle( letterSpacing: 1.5, - fontSize: 640.wmax * 16.sr, - fontFamily: 'PingFang', - fontWeight: FontWeight.w500, color: const Color(0xff909399), + fontWeight: FontWeight.w500, + fontFamily: 'PingFang', + fontSize: 16.fp, ), ), style: TextStyle( - letterSpacing: 1.5, - fontSize: 640.wmax * 16.sr, - fontFamily: 'PingFang', - fontWeight: FontWeight.w500, color: const Color(0xff606266), + fontWeight: FontWeight.w500, + fontFamily: 'PingFang', + letterSpacing: 1.5, + fontSize: 16.fp, ), onChanged: (v) { emailError.value = false; @@ -375,13 +370,13 @@ class PageRegister extends GetView { ), ), Container( - width: 640.wmax * 310.sr, - height: 640.wmax * 54.sr, + width: 310.vp, + height: 54.vp, alignment: Alignment.center, - margin: EdgeInsets.only(bottom: 640.wmax * 18.sr), + margin: EdgeInsets.only(bottom: 18.vp), decoration: BoxDecoration( color: const Color(0xfff2f2f2), - borderRadius: BorderRadius.circular(640.wmax * 15.sr), + borderRadius: BorderRadius.circular(15.vp), border: Border.all( width: 1, color: nameError.value @@ -392,20 +387,20 @@ class PageRegister extends GetView { child: TextField( focusNode: nameFocusNode, controller: nameController, - cursorWidth: 640.wmax * 1.8.sr, - cursorHeight: 640.wmax * 18.sr, + cursorWidth: 1.8.vp, + cursorHeight: 18.vp, keyboardType: TextInputType.text, textAlignVertical: TextAlignVertical.center, decoration: InputDecoration( filled: true, hintText: 'Username'.tr, prefixIcon: Container( - width: 640.wmax * 64.sr, + width: 64.vp, alignment: Alignment.center, child: Image( image: const AssetImage('lib/assets/images/auth/profile.png'), - width: 640.wmax * 24.sr, - height: 640.wmax * 24.sr, + width: 24.vp, + height: 24.vp, fit: BoxFit.fill, ), ), @@ -414,19 +409,19 @@ class PageRegister extends GetView { enabledBorder: InputBorder.none, fillColor: Colors.transparent, hintStyle: TextStyle( - letterSpacing: 1.5, - fontSize: 640.wmax * 16.sr, - fontFamily: 'PingFang', - fontWeight: FontWeight.w500, color: const Color(0xff909399), + fontWeight: FontWeight.w500, + fontFamily: 'PingFang', + letterSpacing: 1.5, + fontSize: 16.fp, ), ), style: TextStyle( - letterSpacing: 1.5, - fontSize: 640.wmax * 16.sr, - fontFamily: 'PingFang', - fontWeight: FontWeight.w500, color: const Color(0xff606266), + fontWeight: FontWeight.w500, + fontFamily: 'PingFang', + letterSpacing: 1.5, + fontSize: 16.fp, ), onChanged: (v) { nameError.value = false; @@ -438,13 +433,13 @@ class PageRegister extends GetView { ), ), Container( - width: 640.wmax * 310.sr, - height: 640.wmax * 54.sr, + width: 310.vp, + height: 54.vp, alignment: Alignment.center, - margin: EdgeInsets.only(bottom: 640.wmax * 18.sr), + margin: EdgeInsets.only(bottom: 18.vp), decoration: BoxDecoration( color: const Color(0xfff2f2f2), - borderRadius: BorderRadius.circular(640.wmax * 15.sr), + borderRadius: BorderRadius.circular(15.vp), border: Border.all( width: 1, color: passwordError1.value @@ -456,22 +451,22 @@ class PageRegister extends GetView { obscureText: true, focusNode: passwordFocusNode1, controller: passwordController1, - cursorWidth: 640.wmax * 1.8.sr, - cursorHeight: 640.wmax * 18.sr, + cursorWidth: 1.8.vp, + cursorHeight: 18.vp, keyboardType: TextInputType.text, textAlignVertical: TextAlignVertical.center, decoration: InputDecoration( filled: true, hintText: 'Password'.tr, prefixIcon: Container( - width: 640.wmax * 64.sr, + width: 64.vp, alignment: Alignment.center, child: Image( image: const AssetImage( 'lib/assets/images/auth/password.png', ), - width: 640.wmax * 24.sr, - height: 640.wmax * 24.sr, + width: 24.vp, + height: 24.vp, fit: BoxFit.fill, ), ), @@ -480,19 +475,19 @@ class PageRegister extends GetView { enabledBorder: InputBorder.none, fillColor: Colors.transparent, hintStyle: TextStyle( - letterSpacing: 1.5, - fontSize: 640.wmax * 16.sr, - fontFamily: 'PingFang', - fontWeight: FontWeight.w500, color: const Color(0xff909399), + fontWeight: FontWeight.w500, + fontFamily: 'PingFang', + letterSpacing: 1.5, + fontSize: 16.fp, ), ), style: TextStyle( - letterSpacing: 1.5, - fontSize: 640.wmax * 16.sr, - fontFamily: 'PingFang', - fontWeight: FontWeight.w500, color: const Color(0xff606266), + fontWeight: FontWeight.w500, + fontFamily: 'PingFang', + letterSpacing: 1.5, + fontSize: 16.fp, ), onChanged: (v) { passwordError1.value = false; @@ -505,13 +500,13 @@ class PageRegister extends GetView { ), ), Container( - width: 640.wmax * 310.sr, - height: 640.wmax * 54.sr, + width: 310.vp, + height: 54.vp, alignment: Alignment.center, - margin: EdgeInsets.only(bottom: 640.wmax * 18.sr), + margin: EdgeInsets.only(bottom: 18.vp), decoration: BoxDecoration( color: const Color(0xfff2f2f2), - borderRadius: BorderRadius.circular(640.wmax * 15.sr), + borderRadius: BorderRadius.circular(15.vp), border: Border.all( width: 1, color: passwordError2.value @@ -523,22 +518,22 @@ class PageRegister extends GetView { obscureText: true, focusNode: passwordFocusNode2, controller: passwordController2, - cursorWidth: 640.wmax * 1.8.sr, - cursorHeight: 640.wmax * 18.sr, + cursorWidth: 1.8.vp, + cursorHeight: 18.vp, keyboardType: TextInputType.text, textAlignVertical: TextAlignVertical.center, decoration: InputDecoration( filled: true, hintText: 'Confirm Password'.tr, prefixIcon: Container( - width: 640.wmax * 64.sr, + width: 64.vp, alignment: Alignment.center, child: Image( image: const AssetImage( 'lib/assets/images/auth/password.png', ), - width: 640.wmax * 24.sr, - height: 640.wmax * 24.sr, + width: 24.vp, + height: 24.vp, fit: BoxFit.fill, ), ), @@ -547,19 +542,19 @@ class PageRegister extends GetView { enabledBorder: InputBorder.none, fillColor: Colors.transparent, hintStyle: TextStyle( - letterSpacing: 1.5, - fontSize: 640.wmax * 16.sr, - fontFamily: 'PingFang', - fontWeight: FontWeight.w500, color: const Color(0xff909399), + fontWeight: FontWeight.w500, + fontFamily: 'PingFang', + letterSpacing: 1.5, + fontSize: 16.fp, ), ), style: TextStyle( - letterSpacing: 1.5, - fontSize: 640.wmax * 16.sr, - fontFamily: 'PingFang', - fontWeight: FontWeight.w500, color: const Color(0xff606266), + fontWeight: FontWeight.w500, + fontFamily: 'PingFang', + letterSpacing: 1.5, + fontSize: 16.fp, ), onChanged: (v) { passwordError2.value = false; @@ -580,29 +575,29 @@ class PageRegister extends GetView { return Container( width: 100.vw, - height: 640.wmax * 100.sr + mediaPadding.value.bottom, - margin: EdgeInsets.only(top: 640.wmax * 36.sr), + height: 100.vp + mediaPadding.value.bottom, + margin: EdgeInsets.only(top: 36.vp), alignment: Alignment.center, child: Column( children: [ GestureDetector( behavior: HitTestBehavior.opaque, child: Container( - width: 640.wmax * 200.sr, - height: 640.wmax * 64.sr, + width: 200.vp, + height: 64.vp, alignment: Alignment.center, decoration: BoxDecoration( color: const Color(0xff5b259f), - borderRadius: BorderRadius.circular(640.wmax * 15.sr), + borderRadius: BorderRadius.circular(15.vp), ), child: Text( 'Register'.tr, style: TextStyle( - letterSpacing: 1.2, color: Colors.white, - fontSize: 640.wmax * 18.sr, fontWeight: FontWeight.bold, fontFamily: 'PingFang', + letterSpacing: 1.2, + fontSize: 18.fp, ), ), ), @@ -610,24 +605,24 @@ class PageRegister extends GetView { loginTimeout(signUpWithAccount(), Duration(seconds: 5)); }, ), - SizedBox(height: 640.wmax * 12.sr), + SizedBox(height: 12.vp), RichText( text: TextSpan( children: [ TextSpan( text: 'You have account?'.tr, style: TextStyle( - fontSize: 640.wmax * 14.sr, - fontWeight: FontWeight.w500, color: const Color(0xffbdbdbd), + fontWeight: FontWeight.w500, + fontSize: 14.fp, ), ), TextSpan( text: 'Login'.tr, style: TextStyle( - fontSize: 640.wmax * 14.sr, - fontWeight: FontWeight.w600, color: const Color(0xff81c2ff), + fontWeight: FontWeight.w600, + fontSize: 14.fp, ), recognizer: TapGestureRecognizer() ..onTap = () => GetNavigate.back(), diff --git a/lib/pages/scanner/controller.dart b/lib/pages/scanner/controller.dart index 03189f3..5f39c44 100644 --- a/lib/pages/scanner/controller.dart +++ b/lib/pages/scanner/controller.dart @@ -77,40 +77,37 @@ class PageScannerController extends GetxController with TickerProvider { context: Get.context!, barrierColor: Color(0xff000000).withValues(alpha: 0.55), builder: (context) => Padding( - padding: EdgeInsets.only( - bottom: 640.wmax * 100.sr, - top: 640.wmax * 20.sr, - ), + padding: EdgeInsets.only(bottom: 100.vp, top: 20.vp), child: AlertDialog( shape: RoundedRectangleBorder( borderRadius: BorderRadius.circular(25.0), ), iconPadding: EdgeInsets.all(0), buttonPadding: EdgeInsets.only( - top: 640.wmax * 10.sr, - left: 640.wmax * 5.sr, - right: 640.wmax * 5.sr, - bottom: 640.wmax * 10.sr, + top: 10.vp, + left: 5.vp, + right: 5.vp, + bottom: 10.vp, ), contentPadding: EdgeInsets.only( - top: 640.wmax * 30.sr, - left: 640.wmax * 30.sr, - right: 640.wmax * 30.sr, + top: 30.vp, + left: 30.vp, + right: 30.vp, ), actionsPadding: EdgeInsets.only( - top: 640.wmax * 14.sr, - left: 640.wmax * 20.sr, - right: 640.wmax * 20.sr, - bottom: 640.wmax * 8.sr, + top: 14.vp, + left: 20.vp, + right: 20.vp, + bottom: 8.vp, ), backgroundColor: Colors.white, content: Text( message, style: TextStyle( - fontSize: 640.wmax * 17.6.sr, - fontWeight: FontWeight.w600, color: Color(0xff303133), + fontWeight: FontWeight.w600, letterSpacing: 1.2, + fontSize: 17.6.fp, ), ), actions: [ @@ -123,10 +120,10 @@ class PageScannerController extends GetxController with TickerProvider { child: Text( 'System_Cancel'.tr, style: TextStyle( - fontSize: 640.wmax * 15.sr, - fontWeight: FontWeight.w500, color: Color(0xff606266), + fontWeight: FontWeight.w500, letterSpacing: 1.2, + fontSize: 15.fp, ), ), onPressed: () { @@ -146,10 +143,10 @@ class PageScannerController extends GetxController with TickerProvider { child: Text( 'Scanner_Go_to_settings'.tr, style: TextStyle( - fontSize: 640.wmax * 15.sr, - fontWeight: FontWeight.w500, color: Color(0xff303133), + fontWeight: FontWeight.w500, letterSpacing: 1.2, + fontSize: 15.fp, ), ), onPressed: () { diff --git a/lib/pages/scanner/index.dart b/lib/pages/scanner/index.dart index 87f1b1b..33cfe64 100644 --- a/lib/pages/scanner/index.dart +++ b/lib/pages/scanner/index.dart @@ -27,8 +27,8 @@ class PageScanner extends GetView { final scanArea = Rect.fromCenter( center: MediaQuery.sizeOf(context).center(Offset.zero), - height: 640.wmax * 248.sr, - width: 640.wmax * 248.sr, + height: 248.vp, + width: 248.vp, ); return Scaffold( @@ -93,11 +93,11 @@ class PageScanner extends GetView { }, ), Positioned( - top: max(mediaPadding.top, 640.wmax * 20.sr), - left: 640.wmax * 20.sr, + top: max(mediaPadding.top, 20.vp), + left: 20.vp, child: Container( alignment: Alignment.centerLeft, - height: max(640.wmax * 40.sr, mediaTopBar), + height: max(40.vp, mediaTopBar), child: Row( children: [ GestureDetector( @@ -106,8 +106,8 @@ class PageScanner extends GetView { image: const AssetImage( 'lib/assets/images/scanner/back.png', ), - height: 640.wmax * 36.sr, - width: 640.wmax * 36.sr, + height: 36.vp, + width: 36.vp, fit: BoxFit.fill, ), onTap: () { @@ -123,16 +123,16 @@ class PageScanner extends GetView { ), ), Positioned( - top: max(mediaPadding.top, 640.wmax * 20.sr), - right: max(mediaPadding.right, 640.wmax * 20.sr), + top: max(mediaPadding.top, 20.vp), + right: max(mediaPadding.right, 20.vp), child: Container( alignment: Alignment.centerRight, - height: max(640.wmax * 40.sr, mediaTopBar), + height: max(40.vp, mediaTopBar), child: buildAlbum(context), ), ), Positioned( - bottom: max(mediaPadding.bottom, 640.wmax * 90.sr), + bottom: max(mediaPadding.bottom, 90.vp), child: Container( alignment: Alignment.centerRight, child: buildTorch(context), @@ -153,11 +153,11 @@ class PageScanner extends GetView { return GestureDetector( behavior: HitTestBehavior.opaque, child: Container( - padding: EdgeInsets.all(640.wmax * 10.sr), + padding: EdgeInsets.all(10.vp), child: Image( image: AssetImage('lib/assets/images/scanner/photo.png'), - height: 640.wmax * 30.sr, - width: 640.wmax * 36.sr, + height: 30.vp, + width: 36.vp, ), ), onTap: () async { @@ -223,8 +223,8 @@ class PageScanner extends GetView { 'lib/assets/images/scanner/${torchOpened.value ? 'torch_open' : 'torch_close'}.png', ), fit: BoxFit.fill, - height: 640.wmax * 48.sr, - width: 640.wmax * 36.sr, + height: 48.vp, + width: 36.vp, ), ), onTap: () { diff --git a/lib/pages/settings/controller.dart b/lib/pages/settings/controller.dart index 2143d96..30b9e0d 100644 --- a/lib/pages/settings/controller.dart +++ b/lib/pages/settings/controller.dart @@ -19,8 +19,8 @@ class PageSettingsController extends GetxController { super.onInit(); scrollController.addListener(() { - final expanded = 640.wmax * 152.sr; - final collapsed = max(640.wmax * 40.sr, mediaTopBar.value); + final expanded = 152.vp; + final collapsed = max(40.vp, mediaTopBar.value); isShadow.value = scrollController.position.pixels >= expanded - collapsed; }); } diff --git a/lib/pages/settings/index.dart b/lib/pages/settings/index.dart index fbe97fe..4a8932f 100644 --- a/lib/pages/settings/index.dart +++ b/lib/pages/settings/index.dart @@ -18,7 +18,7 @@ class PageSettings extends GetView { final mediaTopBar = controller.mediaTopBar; final isShadow = controller.isShadow; - final top = max(mediaPadding.value.top, 640.wmax * 20.sr); + final top = max(mediaPadding.value.top, 20.vp); return Scaffold( body: Stack( @@ -38,8 +38,8 @@ class PageSettings extends GetView { elevation: 0.0, scrolledUnderElevation: 0.0, automaticallyImplyLeading: false, - collapsedHeight: max(640.wmax * 40.sr, mediaTopBar.value), - expandedHeight: 640.wmax * 138.sr, + collapsedHeight: max(40.vp, mediaTopBar.value), + expandedHeight: 138.vp, flexibleSpace: Obx(() { List? boxShadow; @@ -110,7 +110,7 @@ class PageSettings extends GetView { Widget buildBack(BuildContext context) { final mediaTopBar = controller.mediaTopBar.value; final mediaPadding = controller.mediaPadding.value; - final height = max(640.wmax * 40.sr, mediaTopBar); + final height = max(40.vp, mediaTopBar); return Positioned( top: 0, @@ -122,12 +122,12 @@ class PageSettings extends GetView { width: 680.wmax, height: height, margin: EdgeInsets.only( - top: max(mediaPadding.top, 640.wmax * 20.sr), - left: 640.wmax * 20.sr, + top: max(mediaPadding.top, 20.vp), + left: 20.vp, ), padding: EdgeInsets.only( - top: (height - 640.wmax * 36.sr) / 2, - bottom: (height - 640.wmax * 36.sr) / 2, + top: (height - 36.vp) / 2, + bottom: (height - 36.vp) / 2, ), child: Row( children: [ @@ -136,8 +136,8 @@ class PageSettings extends GetView { onTap: () => GetNavigate.back(), child: Image( image: const AssetImage('lib/assets/images/auth/back.png'), - width: 640.wmax * 36.sr, - height: 640.wmax * 36.sr, + width: 36.vp, + height: 36.vp, fit: BoxFit.fill, ), ), @@ -152,14 +152,14 @@ class PageSettings extends GetView { return Container( alignment: Alignment.center, constraints: const BoxConstraints.expand(), - padding: EdgeInsets.only(left: 640.wmax * 32.sr, right: 640.wmax * 32.sr), + padding: EdgeInsets.only(left: 32.vp, right: 32.vp), child: Text( 'Settings'.tr, style: TextStyle( - fontSize: 640.wmax * 20.sr, - fontWeight: FontWeight.bold, color: const Color(0xff130138), - letterSpacing: 3, + fontWeight: FontWeight.bold, + letterSpacing: 3.0, + fontSize: 20.fp, height: 1, ), ), @@ -169,32 +169,32 @@ class PageSettings extends GetView { Widget buildItems(BuildContext context) { return Container( padding: EdgeInsets.only( - top: 640.wmax * 12.sr, - left: 640.wmax * 32.sr, - right: 640.wmax * 32.sr, - bottom: 640.wmax * 32.sr, + top: 12.vp, + left: 32.vp, + right: 32.vp, + bottom: 32.vp, ), child: Column( children: [ GestureDetector( behavior: HitTestBehavior.opaque, child: Container( - height: 640.wmax * 44.sr, - margin: EdgeInsets.only(bottom: 640.wmax * 30.sr), + height: 44.vp, + margin: EdgeInsets.only(bottom: 30.vp), child: Row( children: [ Container( - width: 640.wmax * 44.sr, - height: 640.wmax * 44.sr, - margin: EdgeInsets.only(right: 640.wmax * 26.sr), + width: 44.vp, + height: 44.vp, + margin: EdgeInsets.only(right: 26.vp), alignment: Alignment.center, decoration: BoxDecoration( color: Colors.white, - borderRadius: BorderRadius.circular(640.wmax * 22.sr), + borderRadius: BorderRadius.circular(22.vp), boxShadow: [ BoxShadow( color: const Color(0xff272246).withValues(alpha: .08), - offset: Offset(0, 640.wmax * 4.sr), + offset: Offset(0, 4.vp), spreadRadius: 0, blurRadius: 12, ), @@ -202,8 +202,8 @@ class PageSettings extends GetView { ), child: Image.asset( 'lib/assets/images/settings/profile.png', - height: 640.wmax * 24.sr, - width: 640.wmax * 24.sr, + height: 24.vp, + width: 24.vp, fit: BoxFit.fill, ), ), @@ -211,16 +211,16 @@ class PageSettings extends GetView { child: Text( 'Person Profile'.tr, style: TextStyle( - fontSize: 640.wmax * 16.sr, - fontWeight: FontWeight.w600, color: Color(0xff130138), + fontWeight: FontWeight.w600, + fontSize: 16.fp, ), ), ), Image.asset( 'lib/assets/images/settings/right.png', - height: 640.wmax * 28.sr, - width: 640.wmax * 28.sr, + height: 28.vp, + width: 28.vp, fit: BoxFit.fill, ), ], @@ -235,22 +235,22 @@ class PageSettings extends GetView { GestureDetector( behavior: HitTestBehavior.opaque, child: Container( - height: 640.wmax * 44.sr, - margin: EdgeInsets.only(bottom: 640.wmax * 30.sr), + height: 44.vp, + margin: EdgeInsets.only(bottom: 30.vp), child: Row( children: [ Container( - width: 640.wmax * 44.sr, - height: 640.wmax * 44.sr, - margin: EdgeInsets.only(right: 640.wmax * 26.sr), + width: 44.vp, + height: 44.vp, + margin: EdgeInsets.only(right: 26.vp), alignment: Alignment.center, decoration: BoxDecoration( color: Colors.white, - borderRadius: BorderRadius.circular(640.wmax * 22.sr), + borderRadius: BorderRadius.circular(22.vp), boxShadow: [ BoxShadow( color: const Color(0xff272246).withValues(alpha: .08), - offset: Offset(0, 640.wmax * 4.sr), + offset: Offset(0, 4.vp), spreadRadius: 0, blurRadius: 12, ), @@ -258,8 +258,8 @@ class PageSettings extends GetView { ), child: Image.asset( 'lib/assets/images/settings/notification.png', - height: 640.wmax * 24.sr, - width: 640.wmax * 24.sr, + height: 24.vp, + width: 24.vp, fit: BoxFit.fill, ), ), @@ -267,16 +267,16 @@ class PageSettings extends GetView { child: Text( 'Message Notification'.tr, style: TextStyle( - fontSize: 640.wmax * 16.sr, - fontWeight: FontWeight.w600, color: Color(0xff130138), + fontWeight: FontWeight.w600, + fontSize: 16.fp, ), ), ), Image.asset( 'lib/assets/images/settings/right.png', - height: 640.wmax * 28.sr, - width: 640.wmax * 28.sr, + height: 28.vp, + width: 28.vp, fit: BoxFit.fill, ), ], @@ -289,22 +289,22 @@ class PageSettings extends GetView { GestureDetector( behavior: HitTestBehavior.opaque, child: Container( - height: 640.wmax * 44.sr, - margin: EdgeInsets.only(bottom: 640.wmax * 30.sr), + height: 44.vp, + margin: EdgeInsets.only(bottom: 30.vp), child: Row( children: [ Container( - width: 640.wmax * 44.sr, - height: 640.wmax * 44.sr, - margin: EdgeInsets.only(right: 640.wmax * 26.sr), + width: 44.vp, + height: 44.vp, + margin: EdgeInsets.only(right: 26.vp), alignment: Alignment.center, decoration: BoxDecoration( color: Colors.white, - borderRadius: BorderRadius.circular(640.wmax * 22.sr), + borderRadius: BorderRadius.circular(22.vp), boxShadow: [ BoxShadow( color: const Color(0xff272246).withValues(alpha: .08), - offset: Offset(0, 640.wmax * 4.sr), + offset: Offset(0, 4.vp), spreadRadius: 0, blurRadius: 12, ), @@ -312,8 +312,8 @@ class PageSettings extends GetView { ), child: Image.asset( 'lib/assets/images/settings/card.png', - height: 640.wmax * 24.sr, - width: 640.wmax * 24.sr, + height: 24.vp, + width: 24.vp, fit: BoxFit.fill, ), ), @@ -321,16 +321,16 @@ class PageSettings extends GetView { child: Text( 'My Bank Card'.tr, style: TextStyle( - fontSize: 640.wmax * 16.sr, - fontWeight: FontWeight.w600, color: Color(0xff130138), + fontWeight: FontWeight.w600, + fontSize: 16.fp, ), ), ), Image.asset( 'lib/assets/images/settings/right.png', - height: 640.wmax * 28.sr, - width: 640.wmax * 28.sr, + height: 28.vp, + width: 28.vp, fit: BoxFit.fill, ), ], @@ -343,22 +343,22 @@ class PageSettings extends GetView { GestureDetector( behavior: HitTestBehavior.opaque, child: Container( - height: 640.wmax * 44.sr, - margin: EdgeInsets.only(bottom: 640.wmax * 30.sr), + height: 44.vp, + margin: EdgeInsets.only(bottom: 30.vp), child: Row( children: [ Container( - width: 640.wmax * 44.sr, - height: 640.wmax * 44.sr, - margin: EdgeInsets.only(right: 640.wmax * 26.sr), + width: 44.vp, + height: 44.vp, + margin: EdgeInsets.only(right: 26.vp), alignment: Alignment.center, decoration: BoxDecoration( color: Colors.white, - borderRadius: BorderRadius.circular(640.wmax * 22.sr), + borderRadius: BorderRadius.circular(22.vp), boxShadow: [ BoxShadow( color: const Color(0xff272246).withValues(alpha: .08), - offset: Offset(0, 640.wmax * 4.sr), + offset: Offset(0, 4.vp), spreadRadius: 0, blurRadius: 12, ), @@ -366,8 +366,8 @@ class PageSettings extends GetView { ), child: Image.asset( 'lib/assets/images/settings/langs.png', - height: 640.wmax * 24.sr, - width: 640.wmax * 24.sr, + height: 24.vp, + width: 24.vp, fit: BoxFit.fill, ), ), @@ -375,16 +375,16 @@ class PageSettings extends GetView { child: Text( 'Switch Language'.tr, style: TextStyle( - fontSize: 640.wmax * 16.sr, - fontWeight: FontWeight.w600, color: Color(0xff130138), + fontWeight: FontWeight.w600, + fontSize: 16.fp, ), ), ), Image.asset( 'lib/assets/images/settings/right.png', - height: 640.wmax * 28.sr, - width: 640.wmax * 28.sr, + height: 28.vp, + width: 28.vp, fit: BoxFit.fill, ), ], @@ -399,22 +399,22 @@ class PageSettings extends GetView { GestureDetector( behavior: HitTestBehavior.opaque, child: Container( - height: 640.wmax * 44.sr, - margin: EdgeInsets.only(bottom: 640.wmax * 30.sr), + height: 44.vp, + margin: EdgeInsets.only(bottom: 30.vp), child: Row( children: [ Container( - width: 640.wmax * 44.sr, - height: 640.wmax * 44.sr, - margin: EdgeInsets.only(right: 640.wmax * 26.sr), + width: 44.vp, + height: 44.vp, + margin: EdgeInsets.only(right: 26.vp), alignment: Alignment.center, decoration: BoxDecoration( color: Colors.white, - borderRadius: BorderRadius.circular(640.wmax * 22.sr), + borderRadius: BorderRadius.circular(22.vp), boxShadow: [ BoxShadow( color: const Color(0xff272246).withValues(alpha: .08), - offset: Offset(0, 640.wmax * 4.sr), + offset: Offset(0, 4.vp), spreadRadius: 0, blurRadius: 12, ), @@ -422,8 +422,8 @@ class PageSettings extends GetView { ), child: Image.asset( 'lib/assets/images/settings/logger.png', - height: 640.wmax * 24.sr, - width: 640.wmax * 24.sr, + height: 24.vp, + width: 24.vp, fit: BoxFit.fill, ), ), @@ -431,16 +431,16 @@ class PageSettings extends GetView { child: Text( 'Run Logger'.tr, style: TextStyle( - fontSize: 640.wmax * 16.sr, - fontWeight: FontWeight.w600, color: Color(0xff130138), + fontWeight: FontWeight.w600, + fontSize: 16.fp, ), ), ), Image.asset( 'lib/assets/images/settings/right.png', - height: 640.wmax * 28.sr, - width: 640.wmax * 28.sr, + height: 28.vp, + width: 28.vp, fit: BoxFit.fill, ), ], @@ -455,22 +455,22 @@ class PageSettings extends GetView { GestureDetector( behavior: HitTestBehavior.opaque, child: Container( - height: 640.wmax * 44.sr, - margin: EdgeInsets.only(bottom: 640.wmax * 30.sr), + height: 44.vp, + margin: EdgeInsets.only(bottom: 30.vp), child: Row( children: [ Container( - width: 640.wmax * 44.sr, - height: 640.wmax * 44.sr, - margin: EdgeInsets.only(right: 640.wmax * 26.sr), + width: 44.vp, + height: 44.vp, + margin: EdgeInsets.only(right: 26.vp), alignment: Alignment.center, decoration: BoxDecoration( color: Colors.white, - borderRadius: BorderRadius.circular(640.wmax * 22.sr), + borderRadius: BorderRadius.circular(22.vp), boxShadow: [ BoxShadow( color: const Color(0xff272246).withValues(alpha: .08), - offset: Offset(0, 640.wmax * 4.sr), + offset: Offset(0, 4.vp), spreadRadius: 0, blurRadius: 12, ), @@ -478,8 +478,8 @@ class PageSettings extends GetView { ), child: Image.asset( 'lib/assets/images/settings/github.png', - height: 640.wmax * 24.sr, - width: 640.wmax * 24.sr, + height: 24.vp, + width: 24.vp, fit: BoxFit.fill, ), ), @@ -487,23 +487,23 @@ class PageSettings extends GetView { child: Text( 'About App'.tr, style: TextStyle( - fontSize: 640.wmax * 16.sr, - fontWeight: FontWeight.w600, color: Color(0xff130138), + fontWeight: FontWeight.w600, + fontSize: 16.fp, ), ), ), Padding( padding: EdgeInsets.only( - top: 640.wmax * 5.sr, - left: 640.wmax * 5.sr, - right: 640.wmax * 7.sr, - bottom: 640.wmax * 5.sr, + top: 5.vp, + left: 5.vp, + right: 7.vp, + bottom: 5.vp, ), child: Image.asset( 'lib/assets/images/settings/link.png', - height: 640.wmax * 18.sr, - width: 640.wmax * 18.sr, + height: 18.vp, + width: 18.vp, fit: BoxFit.fill, ), ), @@ -528,7 +528,7 @@ class PageSettings extends GetView { Widget buildLogout(BuildContext context) { return Container( alignment: Alignment.center, - padding: EdgeInsets.only(left: 640.wmax * 32.sr, right: 640.wmax * 32.sr), + padding: EdgeInsets.only(left: 32.vp, right: 32.vp), child: Column( children: [ Material( @@ -539,23 +539,23 @@ class PageSettings extends GetView { hoverColor: Colors.transparent, focusColor: Colors.transparent, highlightShape: BoxShape.rectangle, - borderRadius: BorderRadius.all(Radius.circular(640.wmax * 32.sr)), + borderRadius: BorderRadius.all(Radius.circular(32.vp)), highlightColor: const Color(0xff5b259f).withValues(alpha: 0.0), splashColor: const Color(0xff5b259f).withValues(alpha: 0.0), onTap: () => showAlertDialog(context), child: Container( - width: 640.wmax * 64.sr, - height: 640.wmax * 64.sr, + width: 64.vp, + height: 64.vp, alignment: Alignment.center, - padding: EdgeInsets.only(right: 640.wmax * 3.sr), + padding: EdgeInsets.only(right: 3.vp), decoration: BoxDecoration( - borderRadius: BorderRadius.circular(640.wmax * 32.sr), + borderRadius: BorderRadius.circular(32.vp), border: Border.all(color: Color(0xffe0e0e0), width: .8), ), child: Image.asset( 'lib/assets/images/settings/logout.png', - height: 640.wmax * 36.sr, - width: 640.wmax * 36.sr, + height: 36.vp, + width: 36.vp, fit: BoxFit.fill, ), ), @@ -565,14 +565,14 @@ class PageSettings extends GetView { behavior: HitTestBehavior.translucent, onTap: () => showAlertDialog(context), child: Padding( - padding: EdgeInsets.only(top: 640.wmax * 12.sr), + padding: EdgeInsets.only(top: 12.vp), child: Text( 'Logout'.tr, style: TextStyle( - fontSize: 640.wmax * 18.sr, - fontWeight: FontWeight.w600, color: Color(0xff5b259f), + fontWeight: FontWeight.w600, letterSpacing: 3, + fontSize: 18.fp, ), ), ), @@ -586,10 +586,7 @@ class PageSettings extends GetView { final mediaPadding = controller.mediaPadding; final mediaBottom = mediaPadding.value.bottom; - return SizedBox( - width: 640.wmax, - height: max(mediaBottom - 640.wmax * 20.sr, 640.wmax * 10.sr), - ); + return SizedBox(width: 640.wmax, height: max(mediaBottom - 20.vp, 10.vp)); } void showAlertDialog(BuildContext context) { @@ -597,40 +594,37 @@ class PageSettings extends GetView { context: context, barrierColor: Color(0xff000000).withValues(alpha: 0.65), builder: (context) => Padding( - padding: EdgeInsets.only( - top: 640.wmax * 20.sr, - bottom: 640.wmax * 100.sr, - ), + padding: EdgeInsets.only(top: 20.vp, bottom: 100.vp), child: AlertDialog( shape: RoundedRectangleBorder( borderRadius: BorderRadius.circular(25.0), ), iconPadding: EdgeInsets.all(0), contentPadding: EdgeInsets.only( - top: 640.wmax * 30.sr, - left: 640.wmax * 30.sr, - right: 640.wmax * 30.sr, + top: 30.vp, + left: 30.vp, + right: 30.vp, ), actionsPadding: EdgeInsets.only( - top: 640.wmax * 14.sr, - left: 640.wmax * 20.sr, - right: 640.wmax * 20.sr, - bottom: 640.wmax * 8.sr, + top: 14.vp, + left: 20.vp, + right: 20.vp, + bottom: 8.vp, ), buttonPadding: EdgeInsets.only( - top: 640.wmax * 10.sr, - left: 640.wmax * 5.sr, - right: 640.wmax * 5.sr, - bottom: 640.wmax * 10.sr, + top: 10.vp, + left: 5.vp, + right: 5.vp, + bottom: 10.vp, ), backgroundColor: Colors.white, content: Text( 'Do you want to logout?'.tr, style: TextStyle( - fontSize: 640.wmax * 17.6.sr, - fontWeight: FontWeight.w600, color: Color(0xfff34d4d), + fontWeight: FontWeight.w600, letterSpacing: 1.2, + fontSize: 17.6.fp, ), ), actions: [ @@ -644,10 +638,10 @@ class PageSettings extends GetView { child: Text( 'System_Cancel'.tr, style: TextStyle( - fontSize: 640.wmax * 15.sr, - fontWeight: FontWeight.w500, color: Color(0xff9f9f9f), + fontWeight: FontWeight.w500, letterSpacing: 1.2, + fontSize: 15.fp, ), ), ), @@ -661,10 +655,10 @@ class PageSettings extends GetView { child: Text( 'Logout'.tr, style: TextStyle( - fontSize: 640.wmax * 15.sr, - fontWeight: FontWeight.w500, color: Color(0xff606266), + fontWeight: FontWeight.w500, letterSpacing: 1.2, + fontSize: 15.fp, ), ), ), diff --git a/lib/pages/stats/controller.dart b/lib/pages/stats/controller.dart index 2fb4af7..c8778be 100644 --- a/lib/pages/stats/controller.dart +++ b/lib/pages/stats/controller.dart @@ -39,7 +39,7 @@ class PageStatsController extends GetxController with RxWatcher { } final pixels = scrollController.position.pixels; - final isMaxRange = pixels >= (640.wmax * 298.sr); + final isMaxRange = pixels >= (298.vp); isShowTopBar.value = isPortrait.value && isMaxRange; }); diff --git a/lib/pages/stats/index.dart b/lib/pages/stats/index.dart index a486da5..882540e 100644 --- a/lib/pages/stats/index.dart +++ b/lib/pages/stats/index.dart @@ -19,9 +19,9 @@ class PageStats extends GetView { body: Obx(() { final isPortrait = controller.isPortrait; final mediaPadding = controller.mediaPadding.value; - final mediaBottom = max(mediaPadding.bottom, 640.wmax * 30.sr); + final mediaBottom = max(mediaPadding.bottom, 30.vp); - final bottom = isPortrait.value ? mediaBottom + 640.wmax * 92.sr : 0.0; + final bottom = isPortrait.value ? mediaBottom + 92.vp : 0.0; final width = isPortrait.value ? 640.wmax : 100.vw; return Align( @@ -79,12 +79,12 @@ class PageStats extends GetView { opacity: isShowTopBar.value ? 1.0 : 0.0, child: Container( width: 640.wmax, - height: max(640.wmax * 88.sr, mediaTop + 640.wmax * 56.sr), + height: max(88.vp, mediaTop + 56.vp), alignment: Alignment.center, padding: EdgeInsets.only( - top: max(640.wmax * 32.sr, mediaTop), - left: 640.wmax * 32.sr, - right: 640.wmax * 32.sr, + top: max(32.vp, mediaTop), + left: 32.vp, + right: 32.vp, ), decoration: BoxDecoration( color: Colors.white, @@ -98,20 +98,20 @@ class PageStats extends GetView { ], ), child: SizedBox( - height: 640.wmax * 56.sr, + height: 56.vp, child: Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, crossAxisAlignment: CrossAxisAlignment.center, children: [ Padding( - padding: EdgeInsets.only(right: 640.wmax * 10.sr), + padding: EdgeInsets.only(right: 10.vp), child: Text( 'Balance'.tr, style: TextStyle( - fontSize: 640.wmax * 20.sr, - fontWeight: FontWeight.w600, color: const Color(0xff130138), + fontWeight: FontWeight.w600, letterSpacing: 1.2, + fontSize: 20.fp, height: 1, ), ), @@ -120,14 +120,14 @@ class PageStats extends GetView { child: AutoSizeText( balance.usd2, style: TextStyle( - fontWeight: FontWeight.bold, - fontSize: 640.wmax * 25.sr, color: Color(0xff9038ff), + fontWeight: FontWeight.bold, + fontSize: 25.fp, ), textAlign: TextAlign.right, - minFontSize: (640.wmax * 15.sr).floor() * 1.0, - maxFontSize: (640.wmax * 26.sr).floor() * 1.0, - stepGranularity: max((640.wmax * 1.sr).floor() * 1.0, 1), + minFontSize: (15.vp).floor() * 1.0, + maxFontSize: (26.vp).floor() * 1.0, + stepGranularity: max((1.vp).floor() * 1.0, 1), overflow: TextOverflow.ellipsis, maxLines: 1, ), @@ -159,8 +159,8 @@ class PageStats extends GetView { return ClipOval( child: Image.memory( userAvatar, - width: 640.wmax * 39.sr, - height: 640.wmax * 39.sr, + width: 39.vp, + height: 39.vp, fit: BoxFit.fill, ), ); @@ -169,59 +169,55 @@ class PageStats extends GetView { return ClipOval( child: Image.asset( 'lib/assets/images/payer/$icon.png', - width: 640.wmax * 39.sr, - height: 640.wmax * 39.sr, + width: 39.vp, + height: 39.vp, fit: BoxFit.fill, ), ); } return Container( - padding: EdgeInsets.only(left: 640.wmax * 32.sr, right: 640.wmax * 32.sr), - margin: EdgeInsets.only(top: 640.wmax * 50.sr, bottom: 640.wmax * 15.sr), + padding: EdgeInsets.only(left: 32.vp, right: 32.vp), + margin: EdgeInsets.only(top: 50.vp, bottom: 15.vp), child: Column( mainAxisAlignment: MainAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start, children: [ Container( - height: 640.wmax * 20.sr, + height: 20.vp, alignment: Alignment.center, - margin: EdgeInsets.only(bottom: 640.wmax * 16.sr), + margin: EdgeInsets.only(bottom: 16.vp), child: Text( 'Balance'.tr, style: TextStyle( - fontWeight: FontWeight.w500, - fontSize: 640.wmax * 16.sr, color: Color(0xff8b98b1), + fontWeight: FontWeight.w500, + fontSize: 16.fp, ), ), ), Container( - height: 640.wmax * 44.sr, + height: 44.vp, alignment: Alignment.center, - margin: EdgeInsets.only(bottom: 640.wmax * 42.sr), + margin: EdgeInsets.only(bottom: 42.vp), child: AutoSizeText( balance.USD, style: TextStyle( - fontWeight: FontWeight.bold, - fontSize: 640.wmax * 36.sr, color: Color(0xff9038ff), + fontWeight: FontWeight.bold, + fontSize: 36.fp, ), - minFontSize: (640.wmax * 24.sr).floor() * 1.0, - maxFontSize: (640.wmax * 36.sr).floor() * 1.0, - stepGranularity: max((640.wmax * 1.sr).floor() * 1.0, 1), + minFontSize: (24.vp).floor() * 1.0, + maxFontSize: (36.vp).floor() * 1.0, + stepGranularity: max((1.vp).floor() * 1.0, 1), overflow: TextOverflow.ellipsis, maxLines: 1, ), ), Container( width: 640.wmax, - height: 640.wmax * 21.sr, - margin: EdgeInsets.only( - left: 640.wmax * 2.sr, - right: 640.wmax * 2.sr, - bottom: 640.wmax * 25.sr, - ), + height: 21.vp, + margin: EdgeInsets.only(left: 2.vp, right: 2.vp, bottom: 25.vp), child: Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, crossAxisAlignment: CrossAxisAlignment.center, @@ -229,19 +225,19 @@ class PageStats extends GetView { Text( 'Transactions'.tr, style: TextStyle( - fontSize: 640.wmax * 18.sr, - fontWeight: FontWeight.w600, color: const Color(0xff130138), + fontWeight: FontWeight.w600, letterSpacing: -0.35, + fontSize: 18.fp, height: 1, ), ), Text( 'Money'.tr, style: TextStyle( - fontSize: 640.wmax * 14.sr, - fontWeight: FontWeight.w600, color: const Color(0xff130138), + fontWeight: FontWeight.w600, + fontSize: 14.fp, height: 1, ), ), @@ -257,61 +253,61 @@ class PageStats extends GetView { final order = rawOrders[index]; return SizedBox( - height: 640.wmax * 39.sr, + height: 39.vp, child: Row( children: [ buildIconAvatar(order.icon), - SizedBox(width: 640.wmax * 15.sr), + SizedBox(width: 15.vp), Expanded( child: Column( mainAxisAlignment: MainAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start, children: [ SizedBox( - height: 640.wmax * 19.sr, + height: 19.vp, child: Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ Text( order.name.tr, style: TextStyle( - fontSize: 640.wmax * 16.sr, - fontWeight: FontWeight.w600, color: const Color(0xff000000), + fontWeight: FontWeight.w600, + fontSize: 16.fp, ), ), Text( order.money.usd, style: TextStyle( - fontSize: 640.wmax * 16.sr, - fontWeight: FontWeight.w600, color: const Color(0xff363853), + fontWeight: FontWeight.w600, letterSpacing: -0.6, + fontSize: 16.fp, ), ), ], ), ), - SizedBox(height: 640.wmax * 2.sr), + SizedBox(height: 2.vp), SizedBox( - height: 640.wmax * 18.sr, + height: 18.vp, child: Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ Text( order.type.tr, style: TextStyle( - fontSize: 640.wmax * 14.sr, - fontWeight: FontWeight.w500, color: const Color(0xff909399), + fontWeight: FontWeight.w500, + fontSize: 14.fp, ), ), Text( order.date.yMMMd(), style: TextStyle( - fontSize: 640.wmax * 12.sr, - fontWeight: FontWeight.w500, color: const Color(0xffababab), + fontWeight: FontWeight.w500, + fontSize: 12.fp, ), ), ], @@ -325,7 +321,7 @@ class PageStats extends GetView { ); }, separatorBuilder: (BuildContext context, int index) { - return SizedBox(height: 640.wmax * 21.sr); + return SizedBox(height: 21.vp); }, ), ], @@ -336,7 +332,7 @@ class PageStats extends GetView { Widget buildBottomTabbar(BuildContext context) { final isPortrait = controller.isPortrait; final mediaPadding = controller.mediaPadding.value; - final mediaBottom = max(mediaPadding.bottom, 640.wmax * 30.sr); + final mediaBottom = max(mediaPadding.bottom, 30.vp); if (!isPortrait.value) { return const SizedBox.shrink(); @@ -348,40 +344,40 @@ class PageStats extends GetView { child: Container( width: 640.wmax, color: Colors.white.withValues(alpha: 0.88), - height: mediaBottom + 640.wmax * 92.sr, + height: mediaBottom + 92.vp, alignment: Alignment.topCenter, padding: EdgeInsets.only( - top: 640.wmax * 10.sr, - left: 640.wmax * 24.sr, - right: 640.wmax * 24.sr, + top: 10.vp, + left: 24.vp, + right: 24.vp, bottom: mediaBottom, ), child: Stack( fit: StackFit.expand, children: [ Positioned( - top: 640.wmax * 32.sr, - left: 640.wmax * 24.sr, + top: 32.vp, + left: 24.vp, child: Image.asset( 'lib/assets/images/tabbar/bg.png', - width: 640.wmax * 280.sr, - height: 640.wmax * 52.sr, + width: 280.vp, + height: 52.vp, fit: BoxFit.fill, ), ), Align( alignment: Alignment.topLeft, child: Container( - height: 640.wmax * 78.sr, + height: 78.vp, padding: EdgeInsets.only( - top: 640.wmax * 25.sr, - left: 640.wmax * 40.sr, - right: 640.wmax * 40.sr, - bottom: 640.wmax * 25.sr, + top: 25.vp, + left: 40.vp, + right: 40.vp, + bottom: 25.vp, ), decoration: BoxDecoration( color: const Color(0xff2f1155), - borderRadius: BorderRadius.circular(640.wmax * 30.sr), + borderRadius: BorderRadius.circular(30.vp), boxShadow: [ BoxShadow( color: const Color(0xff272246).withValues(alpha: 0.1), @@ -400,8 +396,8 @@ class PageStats extends GetView { onTap: () => GetNavigate.offNamedUntil(GetRoutes.home), child: Image.asset( 'lib/assets/images/tabbar/home.png', - width: 640.wmax * 28.sr, - height: 640.wmax * 28.sr, + width: 28.vp, + height: 28.vp, fit: BoxFit.fill, ), ), @@ -410,8 +406,8 @@ class PageStats extends GetView { onTap: () => {}, child: Image.asset( 'lib/assets/images/tabbar/chart_select.png', - width: 640.wmax * 28.sr, - height: 640.wmax * 28.sr, + width: 28.vp, + height: 28.vp, fit: BoxFit.fill, ), ), @@ -420,8 +416,8 @@ class PageStats extends GetView { onTap: () => GetNavigate.toNamed(GetRoutes.notification), child: Image.asset( 'lib/assets/images/tabbar/notification.png', - width: 640.wmax * 28.sr, - height: 640.wmax * 28.sr, + width: 28.vp, + height: 28.vp, fit: BoxFit.fill, ), ), @@ -430,8 +426,8 @@ class PageStats extends GetView { onTap: () => GetNavigate.toNamed(GetRoutes.settings), child: Image.asset( 'lib/assets/images/tabbar/settings.png', - width: 640.wmax * 28.sr, - height: 640.wmax * 28.sr, + width: 28.vp, + height: 28.vp, fit: BoxFit.fill, ), ), @@ -457,20 +453,20 @@ class PageStats extends GetView { final mediaPadding = controller.mediaPadding; if (!isPortrait.value) { - top = 640.wmax * 10.sr; - left = max(640.wmax * 15.sr, mediaPadding.value.left); - right = max(640.wmax * 15.sr, mediaPadding.value.top); + top = 10.vp; + left = max(15.vp, mediaPadding.value.left); + right = max(15.vp, mediaPadding.value.top); width = 100.vw; height = 100.vh; - bottom = 640.wmax * 20.sr; + bottom = 20.vp; } if (isPortrait.value) { - top = max(30.wdp, mediaPadding.value.top + 10.wdp); - left = 25.wdp; - right = 25.wdp; + top = max(30.vp, mediaPadding.value.top + 10.vp); + left = 25.vp; + right = 25.vp; width = 100.vw; - height = 165.wdp + top; + height = 165.vp + top; bottom = 0.0; } @@ -487,17 +483,17 @@ class PageStats extends GetView { fit: StackFit.expand, children: [ Positioned( - top: 640.wmax * 10.sr, - left: 640.wmax * 3.sr, + top: 10.vp, + left: 3.vp, child: Container( - height: 640.wmax * 22.sr, + height: 22.vp, alignment: Alignment.centerLeft, child: Text( 'Balance'.tr, style: TextStyle( - fontSize: 640.wmax * 18.sr, - fontWeight: FontWeight.w600, color: Color(0xff130138), + fontWeight: FontWeight.w600, + fontSize: 18.fp, ), ), ), @@ -536,7 +532,7 @@ class PageStats extends GetView { isCurved: true, isStrokeCapRound: true, color: Color(0xff8438ff), - barWidth: 640.wmax * 2.0.sr, + barWidth: 2.0.vp, showingIndicators: showings.value, dotData: const FlDotData(show: false), belowBarData: BarAreaData( @@ -580,26 +576,26 @@ class PageStats extends GetView { sideTitles: SideTitles( interval: 1, showTitles: true, - reservedSize: 640.wmax * 20.sr, + reservedSize: 20.vp, getTitlesWidget: (value, meta) { var index = value.toInt(); var year = years.value[index]; var padding = EdgeInsets.zero; if (value < (maxX - minX) / 2) { - padding = EdgeInsets.only(left: 12.wdp); + padding = EdgeInsets.only(left: 12.vp); } if (value > (maxX - minX) / 2) { - padding = EdgeInsets.only(right: 12.wdp); + padding = EdgeInsets.only(right: 12.vp); } if (value == minX) { - padding = EdgeInsets.only(left: 30.wdp); + padding = EdgeInsets.only(left: 30.vp); } if (value == maxX) { - padding = EdgeInsets.only(right: 30.wdp); + padding = EdgeInsets.only(right: 30.vp); } return SideTitleWidget( @@ -611,9 +607,9 @@ class PageStats extends GetView { child: Text( '$year', style: TextStyle( - fontWeight: FontWeight.w500, - fontSize: 640.wmax * 12.sr, color: Color(0xff8b98b1), + fontWeight: FontWeight.w500, + fontSize: 12.fp, ), ), ), @@ -626,7 +622,7 @@ class PageStats extends GetView { lineTouchData: LineTouchData( enabled: true, handleBuiltInTouches: false, - touchSpotThreshold: 640.wmax * 20.sr, + touchSpotThreshold: 20.vp, getTouchedSpotIndicator: (barData, spotIndexes) { final indicators = spotIndexes.map( (index) => TouchedSpotIndicatorData( @@ -635,10 +631,10 @@ class PageStats extends GetView { show: true, getDotPainter: (spot, percent, barData, index) { return FlDotCirclePainter( - radius: 640.wmax * 6.sr, + radius: 6.vp, color: Color(0xff8438ff), strokeColor: Colors.white, - strokeWidth: 640.wmax * 1.5.sr, + strokeWidth: 1.5.vp, ); }, ), @@ -649,10 +645,10 @@ class PageStats extends GetView { touchTooltipData: LineTouchTooltipData( fitInsideVertically: true, fitInsideHorizontally: true, - tooltipBorderRadius: BorderRadius.circular(640.wmax * 8.sr), + tooltipBorderRadius: BorderRadius.circular(8.vp), tooltipPadding: EdgeInsets.symmetric( - horizontal: 640.wmax * 7.sr, - vertical: 640.wmax * 4.sr, + horizontal: 7.vp, + vertical: 4.vp, ), getTooltipItems: (List lineBarsSpot) { return lineBarsSpot.map((lineBarSpot) { @@ -660,8 +656,8 @@ class PageStats extends GetView { lineBarSpot.y.usd, TextStyle( color: Colors.white, - fontSize: 640.wmax * 13.6.sr, fontWeight: FontWeight.w500, + fontSize: 13.6.fp, ), ); }).toList(); diff --git a/lib/pages/webview/_popup.dart b/lib/pages/webview/_popup.dart index f876a9a..2c426cf 100644 --- a/lib/pages/webview/_popup.dart +++ b/lib/pages/webview/_popup.dart @@ -85,7 +85,7 @@ class PageWebviewPopupState extends State with SingleTicker { right: 0, bottom: 0, child: Obx(() { - if (mediaHeight.value <= 350.wdp) { + if (mediaHeight.value <= 350.vp) { return const SizedBox.shrink(); } @@ -129,11 +129,11 @@ class PageWebviewPopupState extends State with SingleTicker { bottom: (animation.value - 1) * 420, child: Container( decoration: BoxDecoration( - borderRadius: BorderRadius.all(Radius.circular(640.wmax * 15.sr)), + borderRadius: BorderRadius.all(Radius.circular(15.vp)), color: const Color(0xffebebeb), ), child: Padding( - padding: EdgeInsets.all(640.wmax * 15.sr), + padding: EdgeInsets.all(15.vp), child: Column( mainAxisAlignment: MainAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start, @@ -143,18 +143,15 @@ class PageWebviewPopupState extends State with SingleTicker { crossAxisAlignment: CrossAxisAlignment.center, children: [ Padding( - padding: EdgeInsets.only( - left: 640.wmax * 8.sr, - right: 640.wmax * 8.sr, - ), + padding: EdgeInsets.only(left: 8.vp, right: 8.vp), child: Text( 'Webview_Settings'.tr, style: TextStyle( color: const Color(0xff303133), - letterSpacing: max(640.wmax * 1.2.sr, 1.2), + letterSpacing: max(1.2.vp, 1.2), decoration: TextDecoration.none, fontWeight: FontWeight.bold, - fontSize: 640.wmax * 16.sr, + fontSize: 16.fp, ), ), ), @@ -162,22 +159,20 @@ class PageWebviewPopupState extends State with SingleTicker { ), Container( height: .5, - margin: EdgeInsets.symmetric(vertical: 640.wmax * 15.sr), + margin: EdgeInsets.symmetric(vertical: 15.vp), color: const Color(0xffcfcfcf), ), Container( - constraints: BoxConstraints( - minHeight: min(640.wmax * 150.sr, 30.vh), - ), + constraints: BoxConstraints(minHeight: min(150.vp, 30.vh)), child: GridView.builder( shrinkWrap: true, itemCount: panelList.length, - padding: EdgeInsets.all(640.wmax * 3.sr), + padding: EdgeInsets.all(3.vp), physics: const NeverScrollableScrollPhysics(), gridDelegate: SliverGridDelegateWithMaxCrossAxisExtent( - maxCrossAxisExtent: 640.wmax * 66.sr, - crossAxisSpacing: 640.wmax * 15.sr, - mainAxisSpacing: 640.wmax * 15.sr, + maxCrossAxisExtent: 66.vp, + crossAxisSpacing: 15.vp, + mainAxisSpacing: 15.vp, childAspectRatio: 0.60, ), itemBuilder: (context, index) { @@ -187,7 +182,7 @@ class PageWebviewPopupState extends State with SingleTicker { ), Container( height: .5, - margin: EdgeInsets.symmetric(vertical: 640.wmax * 15.sr), + margin: EdgeInsets.symmetric(vertical: 15.vp), color: const Color(0xffcfcfcf), ), GestureDetector( @@ -204,10 +199,10 @@ class PageWebviewPopupState extends State with SingleTicker { 'System_Cancel'.tr, style: TextStyle( color: const Color(0xff646e93), - letterSpacing: max(640.wmax * 1.2.sr, 1.2), + letterSpacing: max(1.2.vp, 1.2), decoration: TextDecoration.none, fontWeight: FontWeight.bold, - fontSize: 640.wmax * 16.sr, + fontSize: 16.fp, ), ), ), @@ -265,41 +260,39 @@ class PageWebviewPopupState extends State with SingleTicker { return GestureDetector( child: SizedBox( - width: 640.wmax * 60.sr, + width: 60.vp, child: Column( mainAxisAlignment: MainAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.center, children: [ Container( - width: 640.wmax * 56.sr, - height: 640.wmax * 56.sr, + width: 56.vp, + height: 56.vp, alignment: Alignment.center, decoration: BoxDecoration( - borderRadius: BorderRadius.all( - Radius.circular(640.wmax * 15.sr), - ), + borderRadius: BorderRadius.all(Radius.circular(15.vp)), color: const Color(0xffffffff), ), child: Image( - width: 640.wmax * 30.sr, - height: 640.wmax * 30.sr, + width: 30.vp, + height: 30.vp, image: AssetImage(image), fit: BoxFit.fill, ), ), Container( - width: 640.wmax * 56.sr, + width: 56.vp, alignment: Alignment.center, - padding: EdgeInsets.only(top: 640.wmax * 9.sr), + padding: EdgeInsets.only(top: 9.vp), child: Text( title, style: TextStyle( - height: 1.1, - fontSize: 640.wmax * 10.sr, - fontWeight: FontWeight.w600, + color: const Color(0xff606266), overflow: TextOverflow.ellipsis, decoration: TextDecoration.none, - color: const Color(0xff606266), + fontWeight: FontWeight.w600, + fontSize: 10.fp, + height: 1.1, ), textAlign: TextAlign.center, maxLines: 2, diff --git a/lib/pages/webview/_scaffold.dart b/lib/pages/webview/_scaffold.dart index 47dbdfa..90a9217 100644 --- a/lib/pages/webview/_scaffold.dart +++ b/lib/pages/webview/_scaffold.dart @@ -4,6 +4,7 @@ import 'package:url_launcher/url_launcher.dart'; import 'package:flutter_inappwebview/flutter_inappwebview.dart'; import 'package:dompet/pages/webview/controller.dart'; import 'package:dompet/extension/bool.dart'; +import 'package:dompet/extension/size.dart'; import 'package:dompet/utils/empty.dart'; class PageWebviewScaffold extends StatefulWidget { @@ -200,10 +201,10 @@ class PageWebviewScaffoldState extends State { child: Text( 'Webview_Loading'.tr, style: TextStyle( - fontSize: 14, + color: Color(0xff707177), fontWeight: FontWeight.w600, letterSpacing: 1.5, - color: Color(0xff707177), + fontSize: 14.fp, ), ), ), diff --git a/lib/theme/light.dart b/lib/theme/light.dart index d031193..70b03b8 100644 --- a/lib/theme/light.dart +++ b/lib/theme/light.dart @@ -1,11 +1,12 @@ import 'package:flutter/material.dart'; +import 'package:dompet/extension/size.dart'; final ThemeData lightTheme = ThemeData( - appBarTheme: const AppBarTheme( + appBarTheme: AppBarTheme( titleTextStyle: TextStyle( color: Color(0xff000000), fontWeight: FontWeight.bold, - fontSize: 18.0, + fontSize: 18.fp, ), scrolledUnderElevation: 0.0, backgroundColor: Colors.white, diff --git a/pubspec.lock b/pubspec.lock index bd4b023..af2fa48 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -5,10 +5,10 @@ packages: dependency: transitive description: name: _flutterfire_internals - sha256: "23d16f00a2da8ffa997c782453c73867b0609bd90435195671a54de38a3566df" + sha256: "8a1f5f3020ef2a74fb93f7ab3ef127a8feea33a7a2276279113660784ee7516a" url: "https://pub.flutter-io.cn" source: hosted - version: "1.3.62" + version: "1.3.64" app_links: dependency: "direct main" description: @@ -213,18 +213,18 @@ packages: dependency: transitive description: name: cross_file - sha256: "7caf6a750a0c04effbb52a676dce9a4a592e10ad35c34d6d2d0e4811160d5670" + sha256: "942a4791cd385a68ccb3b32c71c427aba508a1bb949b86dff2adbe4049f16239" url: "https://pub.flutter-io.cn" source: hosted - version: "0.3.4+2" + version: "0.3.5" crypto: dependency: "direct main" description: name: crypto - sha256: "1e445881f28f22d6140f181e07737b22f1e099a5e1ff94b0af2f9e4a463f4855" + sha256: c8ea0233063ba03258fbcf2ca4d6dadfefe14f02fab57702265467a19f27fadf url: "https://pub.flutter-io.cn" source: hosted - version: "3.0.6" + version: "3.0.7" cupertino_icons: dependency: "direct main" description: @@ -309,18 +309,18 @@ packages: dependency: transitive description: name: file_selector_macos - sha256: "19124ff4a3d8864fdc62072b6a2ef6c222d55a3404fe14893a3c02744907b60c" + sha256: "88707a3bec4b988aaed3b4df5d7441ee4e987f20b286cddca5d6a8270cab23f2" url: "https://pub.flutter-io.cn" source: hosted - version: "0.9.4+4" + version: "0.9.4+5" file_selector_platform_interface: dependency: transitive description: name: file_selector_platform_interface - sha256: a3994c26f10378a039faa11de174d7b78eb8f79e4dd0af2a451410c1a5c3f66b + sha256: "35e0bd61ebcdb91a3505813b055b09b79dfdc7d0aee9c09a7ba59ae4bb13dc85" url: "https://pub.flutter-io.cn" source: hosted - version: "2.6.2" + version: "2.7.0" file_selector_windows: dependency: transitive description: @@ -333,50 +333,50 @@ packages: dependency: "direct main" description: name: firebase_auth - sha256: "735f857c9363376eeb585e7ba57e67e5f495202cd3f609902b8769795fd823bc" + sha256: e54fb3ba57de041d832574126a37726eedf0f57400869f1942b0ca8ce4a6e209 url: "https://pub.flutter-io.cn" source: hosted - version: "6.1.0" + version: "6.1.2" firebase_auth_platform_interface: dependency: transitive description: name: firebase_auth_platform_interface - sha256: "5badda0ea5048ffbb1726169cf5530539490de8055c3bd43f4f9cd5fcef8e556" + sha256: "421f95dc553cb283ed9d4d140e719800c0331d49ed37b962e513c9d1d61b090b" url: "https://pub.flutter-io.cn" source: hosted - version: "8.1.2" + version: "8.1.4" firebase_auth_web: dependency: transitive description: name: firebase_auth_web - sha256: "07c889d2c56e648ed30225e819801d7e45542747a658d9c385520de35d312dec" + sha256: a064ffee202f7d42d62e2c01775899d4ffcb83c602af07632f206acd46a0964e url: "https://pub.flutter-io.cn" source: hosted - version: "6.0.3" + version: "6.1.0" firebase_core: dependency: "direct main" description: name: firebase_core - sha256: "4dd96f05015c0dcceaa47711394c32971aee70169625d5e2477e7676c01ce0ee" + sha256: "1f2dfd9f535d81f8b06d7a50ecda6eac1e6922191ed42e09ca2c84bd2288927c" url: "https://pub.flutter-io.cn" source: hosted - version: "4.1.1" + version: "4.2.1" firebase_core_platform_interface: dependency: transitive description: name: firebase_core_platform_interface - sha256: "5873a370f0d232918e23a5a6137dbe4c2c47cf017301f4ea02d9d636e52f60f0" + sha256: cccb4f572325dc14904c02fcc7db6323ad62ba02536833dddb5c02cac7341c64 url: "https://pub.flutter-io.cn" source: hosted - version: "6.0.1" + version: "6.0.2" firebase_core_web: dependency: transitive description: name: firebase_core_web - sha256: "61a51037312dac781f713308903bb7a1762a7f92f7bc286a3a0947fb2a713b82" + sha256: ff18fabb0ad0ed3595d2f2c85007ecc794aadecdff5b3bb1460b7ee47cded398 url: "https://pub.flutter-io.cn" source: hosted - version: "3.1.1" + version: "3.3.0" fixnum: dependency: transitive description: @@ -487,18 +487,10 @@ packages: dependency: transitive description: name: flutter_plugin_android_lifecycle - sha256: b0694b7fb1689b0e6cc193b3f1fcac6423c4f93c74fb20b806c6b6f196db0c31 - url: "https://pub.flutter-io.cn" - source: hosted - version: "2.0.30" - flutter_ringtone_player: - dependency: "direct main" - description: - name: flutter_ringtone_player - sha256: f2bf99cf984d754a56bc8ac365eeef8c609450ff4f7cfdfa7bd21b0416717840 + sha256: "306f0596590e077338312f38837f595c04f28d6cdeeac392d3d74df2f0003687" url: "https://pub.flutter-io.cn" source: hosted - version: "5.0.0-dev.1" + version: "2.0.32" flutter_test: dependency: "direct dev" description: flutter @@ -561,18 +553,18 @@ packages: dependency: transitive description: name: google_sign_in_android - sha256: "7abdfa0088dc8f7d08eb3dbb1665a72bcb5b37afa256c9ec5d21e1e2d7503e5c" + sha256: "80edba834ae30b058eaeef086e1dc68189b6e49db20ae85b309adfa2fa6d9b02" url: "https://pub.flutter-io.cn" source: hosted - version: "7.2.0" + version: "7.2.4" google_sign_in_ios: dependency: transitive description: name: google_sign_in_ios - sha256: d9d80f953a244a099a40df1ff6aadc10ee375e6a098bbd5d55be332ce26db18c + sha256: "0ba0b276c91e80edbe28570ee8c54237c095dd7b909db46011154a49f3af68a7" url: "https://pub.flutter-io.cn" source: hosted - version: "6.2.1" + version: "6.2.3" google_sign_in_platform_interface: dependency: transitive description: @@ -601,10 +593,10 @@ packages: dependency: "direct main" description: name: http - sha256: bb2ce4590bc2667c96f318d68cac1b5a7987ec819351d32b1c987239a815e007 + sha256: "87721a4a50b19c7f1d49001e51409bddc46303966ce89a65af4f4e6004896412" url: "https://pub.flutter-io.cn" source: hosted - version: "1.5.0" + version: "1.6.0" http_parser: dependency: transitive description: @@ -625,18 +617,18 @@ packages: dependency: "direct main" description: name: image_picker - sha256: "736eb56a911cf24d1859315ad09ddec0b66104bc41a7f8c5b96b4e2620cf5041" + sha256: "784210112be18ea55f69d7076e2c656a4e24949fa9e76429fe53af0c0f4fa320" url: "https://pub.flutter-io.cn" source: hosted - version: "1.2.0" + version: "1.2.1" image_picker_android: dependency: transitive description: name: image_picker_android - sha256: "8dfe08ea7fcf7467dbaf6889e72eebd5e0d6711caae201fdac780eb45232cd02" + sha256: ca2a3b04d34e76157e9ae680ef16014fb4c2d20484e78417eaed6139330056f6 url: "https://pub.flutter-io.cn" source: hosted - version: "0.8.13+3" + version: "0.8.13+7" image_picker_for_web: dependency: transitive description: @@ -649,10 +641,10 @@ packages: dependency: transitive description: name: image_picker_ios - sha256: eb06fe30bab4c4497bad449b66448f50edcc695f1c59408e78aa3a8059eb8f0e + sha256: e675c22790bcc24e9abd455deead2b7a88de4b79f7327a281812f14de1a56f58 url: "https://pub.flutter-io.cn" source: hosted - version: "0.8.13" + version: "0.8.13+1" image_picker_linux: dependency: transitive description: @@ -665,18 +657,18 @@ packages: dependency: transitive description: name: image_picker_macos - sha256: d58cd9d67793d52beefd6585b12050af0a7663c0c2a6ece0fb110a35d6955e04 + sha256: "86f0f15a309de7e1a552c12df9ce5b59fe927e71385329355aec4776c6a8ec91" url: "https://pub.flutter-io.cn" source: hosted - version: "0.2.2" + version: "0.2.2+1" image_picker_platform_interface: dependency: transitive description: name: image_picker_platform_interface - sha256: "9f143b0dba3e459553209e20cc425c9801af48e6dfa4f01a0fcf927be3f41665" + sha256: "567e056716333a1647c64bb6bd873cff7622233a5c3f694be28a583d4715690c" url: "https://pub.flutter-io.cn" source: hosted - version: "2.11.0" + version: "2.11.1" image_picker_windows: dependency: transitive description: @@ -689,10 +681,10 @@ packages: dependency: "direct main" description: name: internet_connection_checker_plus - sha256: c05c34d3b9fac404c56139864545b11a643cfc16c88874878392a699cbbdb5c5 + sha256: "66dc124f9b58a630844f61c1ae6f01f100f5fe63d9410506218d81d93d86ead3" url: "https://pub.flutter-io.cn" source: hosted - version: "2.9.0" + version: "2.9.1" intl: dependency: "direct main" description: @@ -753,10 +745,10 @@ packages: dependency: "direct main" description: name: logger - sha256: "55d6c23a6c15db14920e037fe7e0dc32e7cdaf3b64b4b25df2d541b5b6b81c0c" + sha256: a7967e31b703831a893bbc3c3dd11db08126fe5f369b5c648a36f821979f5be3 url: "https://pub.flutter-io.cn" source: hosted - version: "2.6.1" + version: "2.6.2" matcher: dependency: transitive description: @@ -777,10 +769,10 @@ packages: dependency: transitive description: name: meta - sha256: e3641ec5d63ebf0d9b41bd43201a66e3fc79a65db5f61fc181f04cd27aab950c + sha256: "23f08335362185a5ea2ad3a4e597f1375e78bce8a040df5c600c8d3552ef2394" url: "https://pub.flutter-io.cn" source: hosted - version: "1.16.0" + version: "1.17.0" mime: dependency: transitive description: @@ -793,10 +785,10 @@ packages: dependency: "direct main" description: name: mobile_scanner - sha256: "5e7e09d904dc01de071b79b3f3789b302b0ed3c9c963109cd3f83ad90de62ecf" + sha256: "023a71afb4d7cfb5529d0f2636aa8b43db66257905b9486d702085989769c5f2" url: "https://pub.flutter-io.cn" source: hosted - version: "7.1.2" + version: "7.1.3" nm: dependency: transitive description: @@ -825,18 +817,18 @@ packages: dependency: transitive description: name: path_provider_android - sha256: "993381400e94d18469750e5b9dcb8206f15bc09f9da86b9e44a9b0092a0066db" + sha256: e122c5ea805bb6773bb12ce667611265980940145be920cd09a4b0ec0285cb16 url: "https://pub.flutter-io.cn" source: hosted - version: "2.2.18" + version: "2.2.20" path_provider_foundation: dependency: transitive description: name: path_provider_foundation - sha256: "16eef174aacb07e09c351502740fa6254c165757638eba1e9116b0a781201bbd" + sha256: efaec349ddfc181528345c56f8eda9d6cccd71c177511b132c6a0ddaefaa2738 url: "https://pub.flutter-io.cn" source: hosted - version: "2.4.2" + version: "2.4.3" path_provider_linux: dependency: transitive description: @@ -949,6 +941,14 @@ packages: url: "https://pub.flutter-io.cn" source: hosted version: "6.0.3" + preact_signals: + dependency: transitive + description: + name: preact_signals + sha256: "8bf3cec7fe784d224f1a1132ae7b2f9f3852609046ccb71c4f450a13dd811abf" + url: "https://pub.flutter-io.cn" + source: hosted + version: "1.9.3" responsive_framework: dependency: "direct main" description: @@ -961,10 +961,10 @@ packages: dependency: "direct main" description: name: share_plus - sha256: "3424e9d5c22fd7f7590254ba09465febd6f8827c8b19a44350de4ac31d92d3a6" + sha256: "14c8860d4de93d3a7e53af51bff479598c4e999605290756bbbe45cf65b37840" url: "https://pub.flutter-io.cn" source: hosted - version: "12.0.0" + version: "12.0.1" share_plus_platform_interface: dependency: transitive description: @@ -973,6 +973,30 @@ packages: url: "https://pub.flutter-io.cn" source: hosted version: "6.1.0" + signals: + dependency: "direct main" + description: + name: signals + sha256: a7f5fea3f27708b2705cff501aa0eb32f893552943a7fa8b2851401164459d13 + url: "https://pub.flutter-io.cn" + source: hosted + version: "6.2.0" + signals_core: + dependency: transitive + description: + name: signals_core + sha256: "10e527cda3c400703e4156da16aeaea274644ecb7db11abeec7dc7cc9bec9abd" + url: "https://pub.flutter-io.cn" + source: hosted + version: "6.2.0" + signals_flutter: + dependency: transitive + description: + name: signals_flutter + sha256: d04c973e3feeaddd7d8428f3a8af911297febb3c083091217e1a1fc0c4d6504f + url: "https://pub.flutter-io.cn" + source: hosted + version: "6.2.0" sky_engine: dependency: transitive description: flutter @@ -986,14 +1010,6 @@ packages: url: "https://pub.flutter-io.cn" source: hosted version: "1.10.1" - sprintf: - dependency: transitive - description: - name: sprintf - sha256: "1fc9ffe69d4df602376b52949af107d8f5703b77cda567c4d7d86a0693120f23" - url: "https://pub.flutter-io.cn" - source: hosted - version: "7.0.0" sqflite: dependency: "direct main" description: @@ -1078,10 +1094,10 @@ packages: dependency: transitive description: name: test_api - sha256: "522f00f556e73044315fa4585ec3270f1808a4b186c936e612cab0b565ff1e00" + sha256: ab2726c1a94d3176a45960b6234466ec367179b87dd74f1611adb1f3b5fb9d55 url: "https://pub.flutter-io.cn" source: hosted - version: "0.7.6" + version: "0.7.7" typed_data: dependency: transitive description: @@ -1102,18 +1118,18 @@ packages: dependency: transitive description: name: url_launcher_android - sha256: "199bc33e746088546a39cc5f36bac5a278c5e53b40cb3196f99e7345fdcfae6b" + sha256: "5c8b6c2d89a78f5a1cca70a73d9d5f86c701b36b42f9c9dac7bad592113c28e9" url: "https://pub.flutter-io.cn" source: hosted - version: "6.3.22" + version: "6.3.24" url_launcher_ios: dependency: transitive description: name: url_launcher_ios - sha256: d80b3f567a617cb923546034cc94bfe44eb15f989fe670b37f26abdb9d939cb7 + sha256: "6b63f1441e4f653ae799166a72b50b1767321ecc263a57aadf825a7a2a5477d9" url: "https://pub.flutter-io.cn" source: hosted - version: "6.3.4" + version: "6.3.5" url_launcher_linux: dependency: transitive description: @@ -1126,10 +1142,10 @@ packages: dependency: transitive description: name: url_launcher_macos - sha256: c043a77d6600ac9c38300567f33ef12b0ef4f4783a2c1f00231d2b1941fea13f + sha256: "8262208506252a3ed4ff5c0dc1e973d2c0e0ef337d0a074d35634da5d44397c9" url: "https://pub.flutter-io.cn" source: hosted - version: "3.2.3" + version: "3.2.4" url_launcher_platform_interface: dependency: transitive description: @@ -1158,10 +1174,10 @@ packages: dependency: transitive description: name: uuid - sha256: a5be9ef6618a7ac1e964353ef476418026db906c4facdedaa299b7a2e71690ff + sha256: a11b666489b1954e01d992f3d601b1804a33937b5a8fe677bd26b8a9f96f96e8 url: "https://pub.flutter-io.cn" source: hosted - version: "4.5.1" + version: "4.5.2" vector_math: dependency: transitive description: @@ -1206,10 +1222,10 @@ packages: dependency: transitive description: name: win32 - sha256: "66814138c3562338d05613a6e368ed8cfb237ad6d64a9e9334be3f309acfca03" + sha256: d7cb55e04cd34096cd3a79b3330245f54cb96a370a1c27adb3c84b917de8b08e url: "https://pub.flutter-io.cn" source: hosted - version: "5.14.0" + version: "5.15.0" xdg_directories: dependency: transitive description: diff --git a/pubspec.yaml b/pubspec.yaml index 8b1a5f9..bc60473 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -18,37 +18,37 @@ dependencies: get: ^5.0.0-release-candidate-9.3.2 flutter_inappwebview: ^6.2.0-beta.2 - internet_connection_checker_plus: ^2.9.0 - flutter_ringtone_player: ^5.0.0-dev.1 + internet_connection_checker_plus: ^2.9.1 flutter_launcher_icons: ^0.14.4 responsive_framework: ^1.5.1 permission_handler: ^12.0.1 web_socket_channel: ^3.0.3 connectivity_plus: ^7.0.0 cupertino_icons: ^1.0.8 - mobile_scanner: ^7.1.2 + mobile_scanner: ^7.1.3 auto_size_text: ^3.0.0 google_sign_in: ^7.2.0 - firebase_core: ^4.1.1 - firebase_auth: ^6.1.0 + firebase_core: ^4.2.1 + firebase_auth: ^6.1.2 path_provider: ^2.1.5 synchronized: ^3.4.0 fluttertoast: ^9.0.0 google_fonts: ^6.3.2 url_launcher: ^6.3.2 - image_picker: ^1.2.0 + image_picker: ^1.2.1 audioplayers: ^6.5.1 get_storage: ^2.1.1 - share_plus: ^12.0.0 + share_plus: ^12.0.1 app_links: ^6.4.1 fl_chart: ^1.1.1 + signals: ^6.2.0 sqflite: ^2.4.2 convert: ^3.1.2 encrypt: ^5.0.3 - crypto: ^3.0.6 - logger: ^2.6.1 + crypto: ^3.0.7 + logger: ^2.6.2 intl: ^0.20.2 - http: ^1.5.0 + http: ^1.6.0 path: ^1.9.1 dio: ^5.9.0 From 95106277df41766f260096177c7a8ead03865105 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Sat, 15 Nov 2025 04:06:17 +0000 Subject: [PATCH 2/2] chore(deps): update plugin com.android.application to v8.13.1 --- android/settings.gradle.kts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/android/settings.gradle.kts b/android/settings.gradle.kts index c054267..8477e0f 100644 --- a/android/settings.gradle.kts +++ b/android/settings.gradle.kts @@ -18,7 +18,7 @@ pluginManagement { plugins { id("dev.flutter.flutter-plugin-loader") version "1.0.0" - id("com.android.application") version "8.12.2" apply false + id("com.android.application") version "8.13.1" apply false id("org.jetbrains.kotlin.android") version "2.2.21" apply false }