From 210a4823c9330966c4a418412eaff1083a05143f Mon Sep 17 00:00:00 2001 From: Andrey Shovkoplyas Date: Wed, 1 Mar 2017 17:02:48 +0300 Subject: [PATCH] implemented custom title for toolbar with search added dapp icon to contact, fixed styles, fixed context menu warning, implemented search input clearing, fixed styles, reworked styles fixes for https://github.com/status-im/status-react/pull/826 code review revert toolbar contacts styles. global toolbar styles toolbar style and small fixes for contacts group contacts edit mode groups reorder screen --- .re-natal | 1 + .../res/drawable-hdpi/icon_back_white.png | Bin 202 -> 284 bytes .../res/drawable-hdpi/icon_close_dark.png | Bin 0 -> 469 bytes .../main/res/drawable-hdpi/icon_grab_gray.png | Bin 0 -> 219 bytes .../res/drawable-mdpi/icon_back_white.png | Bin 174 -> 236 bytes .../res/drawable-mdpi/icon_close_dark.png | Bin 0 -> 335 bytes .../main/res/drawable-mdpi/icon_grab_gray.png | Bin 0 -> 138 bytes .../res/drawable-xhdpi/icon_back_white.png | Bin 233 -> 344 bytes .../res/drawable-xhdpi/icon_close_dark.png | Bin 0 -> 622 bytes .../res/drawable-xhdpi/icon_grab_gray.png | Bin 0 -> 237 bytes .../res/drawable-xxhdpi/icon_back_white.png | Bin 370 -> 498 bytes .../res/drawable-xxhdpi/icon_close_dark.png | Bin 0 -> 841 bytes .../res/drawable-xxhdpi/icon_grab_gray.png | Bin 0 -> 371 bytes .../res/drawable-xxxhdpi/icon_back_white.png | Bin 467 -> 716 bytes .../res/drawable-xxxhdpi/icon_close_dark.png | Bin 0 -> 1149 bytes .../res/drawable-xxxhdpi/icon_grab_gray.png | Bin 0 -> 519 bytes ios/SF-UI-Text-Semibold.otf | Bin 0 -> 327904 bytes ios/StatusIm.xcodeproj/project.pbxproj | 4 + .../icon_back_white.png | Bin 370 -> 344 bytes .../icon_close_dark.imageset/Contents.json | 21 +++ .../icon_close_dark.png | Bin 0 -> 622 bytes .../icon_grab_gray.imageset/Contents.json | 21 +++ .../icon_grab_gray.png | Bin 0 -> 237 bytes .../icon_options_dark.imageset/Contents.json | 2 +- .../icon_dots_horizontal_dark.png | Bin 251 -> 0 bytes .../icon_options_dark.png | Bin 0 -> 362 bytes .../icon_options_gray.imageset/Contents.json | 2 +- .../icon_dots_horizontal_gray.png | Bin 250 -> 0 bytes .../icon_options_gray.png | Bin 0 -> 330 bytes ios/StatusIm/Info.plist | 5 +- package.json | 1 + src/status_im/android/core.cljs | 4 +- src/status_im/android/platform.cljs | 61 ++++++- src/status_im/chat/screen.cljs | 4 +- src/status_im/chats_list/screen.cljs | 4 +- src/status_im/chats_list/styles.cljs | 1 + src/status_im/commands/handlers/loading.cljs | 25 --- .../components/chat_icon/screen.cljs | 27 ++- .../components/chat_icon/styles.cljs | 26 +-- src/status_im/components/confirm_button.cljs | 5 +- src/status_im/components/context_menu.cljs | 10 +- .../components/sortable_list_view.cljs | 20 +++ src/status_im/components/styles.cljs | 35 ++-- .../components/text_field/styles.cljs | 5 +- src/status_im/components/text_field/view.cljs | 48 +++--- src/status_im/components/toolbar/actions.cljs | 23 +-- src/status_im/components/toolbar/styles.cljs | 41 +++-- src/status_im/components/toolbar/view.cljs | 20 +-- .../components/toolbar_new/actions.cljs | 47 ++++++ .../components/toolbar_new/styles.cljs | 82 +++++++++ .../components/toolbar_new/view.cljs | 114 +++++++++++++ src/status_im/contacts/handlers.cljs | 50 ++++-- src/status_im/contacts/screen.cljs | 94 +++++------ src/status_im/contacts/styles.cljs | 76 ++++----- src/status_im/contacts/subs.cljs | 5 +- src/status_im/contacts/views/contact.cljs | 9 +- .../contacts/views/contact_inner.cljs | 2 +- .../contacts/views/contact_list.cljs | 87 ++++++---- src/status_im/ios/core.cljs | 2 + src/status_im/ios/platform.cljs | 78 ++++++++- src/status_im/new_group/handlers.cljs | 35 +++- src/status_im/new_group/screen_private.cljs | 73 +++++--- src/status_im/new_group/screen_public.cljs | 4 +- src/status_im/new_group/styles.cljs | 157 +++++++++++++----- src/status_im/new_group/subs.cljs | 6 +- src/status_im/new_group/views/contact.cljs | 4 +- .../new_group/views/contact_list.cljs | 34 +++- .../new_group/views/reorder_groups.cljs | 76 +++++++++ src/status_im/qr_scanner/styles.cljs | 3 +- src/status_im/translations/en.cljs | 12 +- 70 files changed, 1070 insertions(+), 396 deletions(-) create mode 100644 android/app/src/main/res/drawable-hdpi/icon_close_dark.png create mode 100644 android/app/src/main/res/drawable-hdpi/icon_grab_gray.png create mode 100644 android/app/src/main/res/drawable-mdpi/icon_close_dark.png create mode 100644 android/app/src/main/res/drawable-mdpi/icon_grab_gray.png create mode 100644 android/app/src/main/res/drawable-xhdpi/icon_close_dark.png create mode 100644 android/app/src/main/res/drawable-xhdpi/icon_grab_gray.png create mode 100644 android/app/src/main/res/drawable-xxhdpi/icon_close_dark.png create mode 100644 android/app/src/main/res/drawable-xxhdpi/icon_grab_gray.png create mode 100644 android/app/src/main/res/drawable-xxxhdpi/icon_close_dark.png create mode 100644 android/app/src/main/res/drawable-xxxhdpi/icon_grab_gray.png create mode 100644 ios/SF-UI-Text-Semibold.otf create mode 100644 ios/StatusIm/Images.xcassets/icon_close_dark.imageset/Contents.json create mode 100644 ios/StatusIm/Images.xcassets/icon_close_dark.imageset/icon_close_dark.png create mode 100644 ios/StatusIm/Images.xcassets/icon_grab_gray.imageset/Contents.json create mode 100644 ios/StatusIm/Images.xcassets/icon_grab_gray.imageset/icon_grab_gray.png delete mode 100644 ios/StatusIm/Images.xcassets/icon_options_dark.imageset/icon_dots_horizontal_dark.png create mode 100644 ios/StatusIm/Images.xcassets/icon_options_dark.imageset/icon_options_dark.png delete mode 100644 ios/StatusIm/Images.xcassets/icon_options_gray.imageset/icon_dots_horizontal_gray.png create mode 100644 ios/StatusIm/Images.xcassets/icon_options_gray.imageset/icon_options_gray.png create mode 100644 src/status_im/components/sortable_list_view.cljs create mode 100644 src/status_im/components/toolbar_new/actions.cljs create mode 100644 src/status_im/components/toolbar_new/styles.cljs create mode 100644 src/status_im/components/toolbar_new/view.cljs create mode 100644 src/status_im/new_group/views/reorder_groups.cljs diff --git a/.re-natal b/.re-natal index 8f9b7f3b7c..bcad9e346e 100644 --- a/.re-natal +++ b/.re-natal @@ -26,6 +26,7 @@ "react-native-fs", "react-native-dialogs", "react-native-popup-menu", + "react-native-sortable-listview", "react-native-image-resizer", "react-native-image-crop-picker", "react-native-webview-bridge", diff --git a/android/app/src/main/res/drawable-hdpi/icon_back_white.png b/android/app/src/main/res/drawable-hdpi/icon_back_white.png index 6bd5aec7c425ed9cca7027d64360ea32ccde6fba..1f8c88cefec59e7d63d911229947a845828d2e55 100644 GIT binary patch literal 284 zcmV+%0ptFOP)Px#)=5M`R9Fe^m(2>oFc5@miwZ*D&Uf*D-(reYQiy^naR|)EtuKn i_owY;N=*d*6ZisE6bcGQc1zR%0000p@J`NsRJvc!yoRBgAB`)7U*<2Df~AHI~pMp$I{iApdqKkRonQk zg`Iyw?_Fbs`;4md84Y#@JN&>&;M#IFX)3%@8S@EWmLGkBHt yXZ`qJulMaiW7nc~p}3<8o(tN-6#nrZF=wo`ub7p2<#Q^~Jq(_%elF{r5}E+Qlti%r diff --git a/android/app/src/main/res/drawable-hdpi/icon_close_dark.png b/android/app/src/main/res/drawable-hdpi/icon_close_dark.png new file mode 100644 index 0000000000000000000000000000000000000000..34ee7bce50e83896ee9a9e46e79589848af647e7 GIT binary patch literal 469 zcmV;`0V@89P)Px$k4Z#9R9Fe^mS0K(F%ZU+#cOzl9>hKg7N4ZBcnm=b9zzPnC#m35J%|Tt%;z|4 zVkWzj2tLg|>?V_MW`6ye{o|Y+=72e14wwU(13sHoChMEK&Dr?}Ke+eP>tW};4;5(^ z4k7sU?e;O8-SyzY)9LNym%m*Ep)`YVuH-?VUx{zBeY(1(#~U_5`Qfbcytm8rw9MuN&~ zu(G_Wfbek@UHSBb-$`%yvTRiUIE5VKQVmIIF>}BiFbB+mSqHuVjc@@LEz4FX00000 LNkvXXu0mjf69Umu literal 0 HcmV?d00001 diff --git a/android/app/src/main/res/drawable-hdpi/icon_grab_gray.png b/android/app/src/main/res/drawable-hdpi/icon_grab_gray.png new file mode 100644 index 0000000000000000000000000000000000000000..0dbfd5a066c41943d702fc8979770852ec5adb64 GIT binary patch literal 219 zcmeAS@N?(olHy`uVBq!ia0vp^Dj>|k1|%Oc%$NbB7>k44ofy`glX(f`O!ahe42j@; zJLMp6vjLCm+ZBs1B<^CGey+_WvN6@l+b$yJ;7P{L)1MW)-pFg$^(D7CGB61=Ft8{T zXfvMQ0NYSSrQb2k1wT9o$m z%+Dq3SEuGled7wwUEOhS+SX43{RB|IOz=F8t@y6uIqcKo>K3y85}Sb4q9e04U#Fm;e9( literal 174 zcmeAS@N?(olHy`uVBq!ia0vp^96-#+!3HFS!eXZZDaPU;cPEB*=VV?2IT@ZVjv*3~ z$q5IT{{8Px$2}wjjR7ef&Q#%rZFc95{g&$fkprxnK(jKiWobgZ=&R9@66n3_pf|dhlt0fcj zh#6!j0cNmFiUf9F-rKxQi2U#l^mRbE2sY9FOeE%03U*0ydD?JMbeO%VxDv_yp2SBR zW?%~b)C7|tH(bpN^a1oi6CbPV0xE~jV| z;N*X8vW?u_mZqFOVKqB@@O`1>J?B46+D hz?!&Uy#xPu-~+`_pAv3-ot^*y002ovPDHLkV1f_`iz@&C literal 0 HcmV?d00001 diff --git a/android/app/src/main/res/drawable-mdpi/icon_grab_gray.png b/android/app/src/main/res/drawable-mdpi/icon_grab_gray.png new file mode 100644 index 0000000000000000000000000000000000000000..afd9670f895905538953cc8680b99034c50dacf1 GIT binary patch literal 138 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM1|%Pp+x`GjjKx9jP7LeL$-D$|Ts&PILp*qs z6C_v{D;h{Knea2Z<(TP2Y$`qd|NsBJ8&5tIN=`|+GfUv{+h)DPx$5=lfsRA>e5m_Z7{Fc3w9f)-ra3wR$9+!VTX;ZeMR$MX^{+=w8?KVl(-G(sUv zMt)!@nbzdZn<8zUN%%`8sy897By(R@+8nZ;qgL&Ohe@_11H z|Gd-%&Fd-Y0B)+#QSoSYCw0yuhD^ qys0C=8^qcaG+}9g258_v4ZHy*7axOJ!PzkY0000$ f8YRM#Ef^TCMfKf?kCK`ObS{IZtDnm{r-UW|5sOu5 diff --git a/android/app/src/main/res/drawable-xhdpi/icon_close_dark.png b/android/app/src/main/res/drawable-xhdpi/icon_close_dark.png new file mode 100644 index 0000000000000000000000000000000000000000..331c130b4a6213f075bb1f4efac682010bc1dacf GIT binary patch literal 622 zcmV-!0+IcRP)Px%C`m*?RA>e5SUXO{Fc2MQMGc350wDw^pyyLSfwn+U!x^B2J5Vp8Shj$IPtO66 zwgANE5O9FqVV;p8it@3&PJx(6tHiPA&3n)GBv~Ro)B$xs9Z(0<0d+tf_`eRAQ0eR4 z-FY6HQzD+G%pBeJd)J{D`SEMry$u@kF_HN+8Smfp&z|%BP1jk|fMP$$GxG{FElJ|5 z)$P4*ag1-<#tH_oET%QaH~M>AxB#XZmqHSE4Dor42*e;37!J?Q>TkpADp-K&(4jFj za_BK4%E((xS&|Od_ncGj7xMNve4SlbevyP*65$NU(8m4ur{QBAQWbe7vvYURyR3^X z>kAeD5Ri-!QA>W%>z5I1x)&uNMnoIr!6RBgh={hxgG2Ch071p0jv&Sss|_}+UGtI4 zCZ9iv0035rKwrL8rX&ySiIxxm+)=f$rQcO5N=+WQlL-J=g$Q)DLLRt3?x67(kEAnD zwhwZqct7lNF^!kW1eB4-nwK973pdlrMI@<0Rpe1BVPTtPbmAGPBY!7#zG7o1n~8}8 zG?8};xJ?n!0({B0Eh0)lDET%;1Pj17tYIF+z8=&qr@6)D2Yhch!9HhK-h9T|F+8G^ zSn@6jHa991%B;I*G402_yW@8b79dGK95e{TzEzfqkb?W^uzk4+g<0Q!mD-?`XV^z``8gDco4hWvJNJ8aDY*hOG&(9yJh%s>}G%&!4 z1C~r;y??(QPM)^^X`Ji%KOyO6syA1!oS*!prb}e4sosB){5tMWS*N+o#OfSA>^pq= z5Whj>@;`fzTAz`ecSY>HB12<0hXMP)e-kSMjM%@0%w(?CdZUPB0RvOHSOmkf%X-}9 TnHS7~PG<0Q^>bP0l+XkKO21XN literal 0 HcmV?d00001 diff --git a/android/app/src/main/res/drawable-xxhdpi/icon_back_white.png b/android/app/src/main/res/drawable-xxhdpi/icon_back_white.png index 166bc865a4588a56795a9e66e53e00ed57fed9ed..40801489f463f40f8cae4fb845bdabad50ac213a 100644 GIT binary patch literal 498 zcmeAS@N?(olHy`uVBq!ia0vp^9w5xY1|&n@ZgvM!jKx9jP7LeL$-D%z*Lb=(hEy=V zy=~~l>?m^VTfRO*J1m2Tg{5d=Md*@mD^qMEF6C))9KNYG z)A9epKU-oY-^MVg&UsRDT_=FyxqG(WY!mHi9W-I(Pb)pblDi&y1kLrBH)zkJ*sUaJ^y%6PQ5IB;<^ zvIO}kZ0IuPT+-l>z&VvA$U$L4ix-oof-YNjv`cT7U;OSN{dJ|}xx*&&{&o0kPRTyHw&|4RBJ1r=42&!S f4iKU-khQG5%dtdO;?OE!BrPx$EJ;K`R7eeDV4wo{|Np-n5HADb8$i4ch}EcIECU13AZ;Li1;ohU1&|}eOoF=!NF%BOO_-@=8C?rOM0vrmo4~igia-IUvUHA$i^3pNLB|wAMBYcj*0vSxY zi(y^_Y6jIB*Z^e)LtXwBo5?`23qZ^ba|Bs5(15!*3Pf(l)3rYwY zf=>Yf3+(afB}xuzK_`&@2gEQi0i>CcC=-ZK1T<9>sLTL}uQ4(*UIb|Y08X8X1*a~y Q8vpU}pAoaSW+o ze0$5jTi8*8?ZeF8goPPP6Os!jxe2mdymahY(bVu4qD?oVTtqhd%L=sqU_A0J;KHdN ztT{zjMaz53w}or`U>D>&+go|1QRPien%es}GWRy0RoiU*{`a~5vnl40OLqh|Fo`T+ zVAXJ7dV^TT1?ZTV#0nUj@_JlK*E`K0duSF28(F?5on+Vhh-cuqHkWEvG@07*#HZ*hE5;(+28jHvo{usapxvE z{D_!(bqdo;A$C`bEX~#VVY4L!uE~TOc`li0u~=zUR^inbS>nuxntDu+PxW9r$B*dNm+_F&RQEGd&|GrI!n5(2>n(nZlZ{Ce zzj6ENIxO^f5nuJYf%*ToE87js_`i9Iz5K}XZR`8U#(z7~Ha%YUz4Vbnd9H)Uv*wn% zb!+ovt^{fe2pv;;df+6JNb?kKb?E?(AU~Nanq`~268=99`z^(C$ji)8Jz!BF-nGx-ha#^7`>QZzmgE0yMU2@tXl`2~zp+xy>U@Of ziWCPS;VB)4`e8x}Cp$flbsZF9_cB~4VpzM;r7_4)CH0M#&cxGtP4#|@rfqs`nA&iG(7tgarhNLRI=`Sb* P<_!i>$8;;VuWOVx9wQ>AT5B*AIva%BZHkbN1EBYY@PD@OOW*c#oK>(6f3v)sK=D3;t@yYAYqlTV(XNP9km zY1U)5&B-pEC$4xfx*pLp{vmU-PX1KSKsoZKl_Np~&Fr>gTe~DWM4fw_1@t literal 0 HcmV?d00001 diff --git a/android/app/src/main/res/drawable-xxxhdpi/icon_back_white.png b/android/app/src/main/res/drawable-xxxhdpi/icon_back_white.png index 8992428891cd90e9368205e08d22812f38e90bac..c4ae1d0ee6726e01dfabe039d2608e2e6e3cd0c2 100644 GIT binary patch literal 716 zcmeAS@N?(olHy`uVBq!ia0vp^2_VeD1|%QND7OGojKx9jP7LeL$-HD>U~2PpaSW+o ze0#@M-^EenSfO@c$8?vcs)C(P3&l;MTF-C2@Ay_)BQtdMrBxvzN*OLH*Ni7ky=_o@ z!#LgepSh*Z_mp#c_or*@@bN8FXkcLCz)C#OyHGseK#{ra@WVBFsqR}>?RxdK>bh`I z=G*wT5BwqKtKJnZ;(vB~|L+IZBA+I{+NyoOvR0<1GPnQygXJ>!LcMdfS?MdL+b_%vk5MEU$rW_uG&A7d(rHC_40M~{q-9^{nb48$8*60?T5a$ zFD*m(^c#IRYS-^vb6YTgPx$jY&j7R9Fe^nN3OrK@5d$MRe=9a<+otIn*2JR(GDlGk69OZ=m>xC@5}p=ik!y z3rs^3f=SsKM65ulu2ky1O6K*@Gu_Ng(b~3M0Dc?a!sqd0e7|X$SH|fWq$~I-uI-k< zXl@#`0FS{v!q*M_C1N8ZJ}d;ORCcf5zH1Ozp*+$F@wLUGVnQkp<#`6+qaxAMd{T}tPnk`i zjL$$$SqkOd=n{>&RJ~D#>|_JDXAoJTTyhxXcDk^bj95DP7?Oy(U@`Y}aSW+o zd^^WG?}~v;`&-U66INW|z0+t~(5w`o8ey=aW4b{41Ccq5igAk;cQ#~-`D?tgUu^fJNgOEdV~leX;s{`9T;Wy^)%R0Ruu zADrx;q_pjpqqio%OX%I-yZ%0NudaUe)H?cne%G&x@Pqq}rhoUyssH`w-@`lGIJ7Ua zE_il5>C-~vGR=P{ULA7N<7~Kp<@kM9WxevF;hh&B-`L+07=BD~`@)-%v*u}8F!*FY zywv>Y&4z>S>yF)EZWWDXxK)$9Mp9+R0rxZ4ZuGJi-650tD}>1ORzy5m}cve$=3``*x_bCPDr z)QT)w_?wBt((2UA?Rx(=RT?pJD6n_PRO&U~-Dcf4@={OF$g zmER0IXY}RPa(oDEd%`qf<@}bkwJZOsoOy8l_vv*7f`?yD`I%)?DO?g&u=PQ>_tS}M zRz+{SEtdXa_SUkvxu<77R9?1*Nx;E_)44gmr6EA5jbpzAW34KWXk8%FIh6&UOEUMT z*D{@RR)1UEw^rV9*2-mXY7Zni{>|EKGi%;^#WgBFI`&#Ha-8yJ^4s8hDVHVHTkY6C zCDsKC4yuUo$UoHya}eNcJ**$+pwG$NV9&v*?J2=gGe!6GUWJr5#=Wn0eYBK2zOJY* zUrw=4e;2<4qxo_F{3}i?+}&l?@!oQ|vVMV3QgZ(DyXU_>yELs^Y=cpaZzY3Jm*@rQ ze-0`lnhFws7(F!B2_IvfQ9OJ7EQzll&b=vXX}fD0{+Iod%dObm#d+GV#2=J?t-iF6 zd0xN4boFm3K8vp1z>o+_!kEcEirx ziR*)ERUT~B`r37A>y7-AF7j>X?m3+2mtR!dwqk`rNA0>MmxxY1hV}oWANR$4zWwvJ zXF>Q+1NY;WD#a_;+#&@&tN3p1)+ba#}pu@7JDS>VT{;y@xQxX1a2o!3~- Vq*!sI4X`|6@O1TaS?83{1OTH21GNAE literal 0 HcmV?d00001 diff --git a/android/app/src/main/res/drawable-xxxhdpi/icon_grab_gray.png b/android/app/src/main/res/drawable-xxxhdpi/icon_grab_gray.png new file mode 100644 index 0000000000000000000000000000000000000000..640e8c98bab2c33eb9e996ae2f3a60311db85699 GIT binary patch literal 519 zcmeAS@N?(olHy`uVBq!ia0vp^2_VeD1|%QND7OGojKx9jP7LeL$-D%z4|=*dhEy=V zy}8$y*-?P)LM(TWr(y~J4i=q>feaH>R~>Mjq2X57Zy@I{V+HZN=S<03c z^4u*j-=>W4XaYOSp?Y_7+nxLo^_w0t7szk0tJ`e!C%ol%gD(GqJo`NH#PwnA-^Kp1 zy%9}6z2O~mRFkWIxx9extwr;GH;6?n^uEj9Ql#ZZPRN16yU|(b2fLta+->R1n;gKH OW$<+Mb6Mw<&;$T(FuQL6 literal 0 HcmV?d00001 diff --git a/ios/SF-UI-Text-Semibold.otf b/ios/SF-UI-Text-Semibold.otf new file mode 100644 index 0000000000000000000000000000000000000000..c11fa416de9542367457f00452382308dc992a28 GIT binary patch literal 327904 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≠*Jm(ae`!gH zo^R3>PR{Bsjzl3G0GojS1M&}>ML>v-cI*&nC;qYbxhLdHhNnbeOQHUjD^w=*Z zMw<21J+Z-U*%RM_YI$nKap0H8c!klfZ5a|LBr={g&vMEN)c-F-#}BKAS=_LQdOBR2 zn*kcS2x@MyH%#x&%pNNCT{~DZ?b$s%dF(6NI&zHNSTL3^lHMfwCVUq!CEJ|fT8--0 znM~@$q)%;};}ncwgya?+lC-4{#cKAA%5m6poSKI5K=~l5vBjM1JU0ZZTd`9HNkr{Qp`AHt-x{W$Bl6s)tURtm+X!5eyk4y z_;=N_XwHKjqq-oGTdmGW6OHW*XBfa8)$V|k?A*Ni_?^YA3IA!;b zXSe^v&wo%yTapI)PZTgy8?Lcd_}HI2hh`k|U}Q|v-X8n9Q)R?`{nOgP$#$-y5eJa4 zGa)X?vjf@6ICPgPa7jp1qH4<7NaPnyoQ7l@U1Lgumv+L|$YWg%lpxt*yUMK%6R*O_)!8v@eVj5Q zoMpB!Nc&M{jnc7Y&R5HXi@CkbD{7hNe>wK_2eTBhb&j*t)x%u+*a@&}7lEmK(J9`~ zs|#P#iZ5=(*GTW4nRHW)H;x~>dL{T+fPZkaYJta_-BdlXZ`z;v2iTw8FpIzV??ygS zk93v&RJeHQ$$gXD8Pk=sioD(V7?b<`;S{kBi`{O?*^Ocu(il~SyW~Dz9cf<<`C5VC zA3en&idU_OSjvnQZ*q_6zMjq()ey$dec4jTq(f9*5}}gDcQDP92H-)Wc1sh)G^%Oi_{cm6xhUll{7E`}88r=%R5nIe4pX)T<_@VUTvB zYc`r=Vq*W_gzPIMH=(oV#GIk4N)V2)%vBiB>S@Mkdy9)G|w)RhPiDB`!2cD&8 z@L?wRqmHG5^&TH)#6gt%QB6LqMf5R0h?NjtJKn@=@i19%x)S#_jm`o|7cL$reTGrm zaqJgM;W4$RGbYy4au!IKQ0+FONN!BTRlAB!4JMk=z>MAsT8b>Tj^`5b%IHk;9l4WN+NwXDIby3Po z*A~6C_#|%Qp;)Si;yy{TS&OU7T}e3e?P75qlX6#?r5gIw8YQ9SrNj=zH8W)rZE|QS z7xtjK2(?N#Yw^THSeXT7^_h+1t7CQlEK3ld=_Xh4c1g;s(&w6$SL3(yB`3EXFWTZQ z;FUop%LQY~3bVlC2cN9i)j6D$)UJz77o0R@PPBwu5PX+ zT-`i%tZt;6$_$g`Ml1!=EhJ1!oICO6msz|6`mGyyYgwLHzloP>za_V2j_tT>p^5Ic z#7j-`l3T1}(_-&RYuZoEq9QbTeH(AONv?=lx+bmJ`RaHRt-WBAd%swHx>WW`23Oz-9KP3i7NS;ZEts@@L@AUrwF!vZ z{Bx^o=>hX)#O=UmRb5g8P zd{d1mZDw?H(QDZGM(_=qZcA)xG#R?OJBM#7>ASc>(^efPNm>yF`vPKAss}H142C&X zkhVgp1aZI3kfl4Jsi;+ISc+)r=DMrKy`_5TdFXEC0+O1)e6J=o_tOWcIkJ5mNwTGT z@LY|PCmYy1p^jYHv6BS?t{wh(PI)r9Pfx;euAZ%As>zOHdUz2FSp*t(Yp%Oxc7STOOs|RjQ>9Xee)IyZIrP}axEh5<~bM%8gU zQsz;+j!CV(gitKqQv#yt?7$aXoetqoStj9ps7@~iICTILMU*jMN|NU(SyMELsi0g1 zQ@z7qI2}u3*D;Ci#tWp{GRAcYrLMp=o}rJ`01jB3!#Q2-t}6@1_9 z2oVu3rvWfXX&8k_uI$7p`~pk$&s~Pbj}}qN+e)SO$atd3-9 z`~7rk@zU>+yV<{Oi-0ol4(Ftln!IuCwp^UG`)-BvY-E+(C#P)B}Jxid;y?;Wg z?T$)?(cm2yr1%&DtN9BWj82cDg!cjXtKF*!?zt?niPB#Zbxa4501 z-2G@<4#&3TUP{^mcxUYhUv186yFm(SUz3q-p&t>FZB-Ma@m$r961gojmdY!k$s-f- z;_)v6!0WBpb&p&{!^EHtylrNiK-U`J$#k^ftkui_baq@U%(wzmoU<6vTKz4g(i z{v6xVJIQOPC;t?wCAIZ zL)UEg!>MEYPDWi#G`=4(rDRD1yiy;$*wZ_aM9M9wYe;Jf(}IY6!~e&98#*OFjf!q5x5 z2^npE&WrToMW3o@(9kX0c}2Mquec?~E|psJDVDlU@H=%uKUZPMQT~)Op4%)c>T6Ez z*{6+9;h{V|<}cMOm8WPfQP9jQ>d(&Jyz7{1milK6M6CkA+_fD92z*)cGsUeaB#3s;eKyLd2l<2$XlkQD4=rt`0UMF!0o7x|7^$wW~=L2D?e+z ze)z!o-&!3&%KCP7>KC;oaZFb@OnfG+I?TZMfzr~~( zP22FEDi9uo?U=IVzltXYyN2|sj;d>Ru+PhmEqE%8DQv-Oem-(&>;U@5j&Z3H2ou2; z{Ij1nrV@Glru!!_Fr6b=Wt9rCsLcfvdF6`GK33}|=7W!;EV^PWY5G8@($cYKp3Y6c!E4Vu9Y%r93qbPIHA{ zihaU&e7W?@>9&c8j?XL?;1(sV8573q#Hr5-0i(4+?iOzerd(E9sjxJkU3cv1N9>xw zq?;=Ws?iFobXfIz{=s|lHQD6uB8>m2l-11g`;;C^PwZnOWWT>3F57V3morgRrx5|8ai%#x*58$bk-8%l0UR;oG>Uh;N zFEOx!v+-~d%&Un=U*(?0483dFu}Bc9S3U=}LDJ|-p6?va9AB!5^6^-&5LD*K3*z7> z2SkM?rlO2I6Wuj)Dqktth$WM1M6(hXD;kNx2N5_n?4@#EQbPX|^HGs}-0mZ2KxK9# zfJTWK2Tq3`0>{9y{Rw= z?T%7ktjb>TT&_GXbmx7n7kO_A{JN#`6}aDXciDt}(oz`C{P=wz9NqMV5B_#OKxE{e z;=p;Fk?+=t+7Z=`BWFfN&Tex*ET!Em32CJ-pP}b7Lqva7llqA3qL-*9mcufZ5x~LA zgUq~fM;&k2@m8bU*+d4Bv5W{1^~G2BxN)>^3?bS%=l_-#xrWI-JW1d?&kHf}bZ+oM z&+OnIf64>Ts2F4gEFX-i&LZR~S|TPRE&>VV26fE!buvLdcmAd0k?XOM_vcHp#q?q< z!?mLtFdUo32poBU`oKg7mGZku0G{;!UNAJxZY{y*=2K*PDOHA-V+oybSWIFZNb44k5!;NhAIgD1`&cnxY&Z0M>wi`;T1 zf2*t|fBQ=OW`r~9LYchG zd^8^2wt*&V&QH?!1*p?j0sp^flAE@3aez#rNbKNAQJDEMIcL5byz>1oJM&G1jk+}7 zIj~c~uak?!d{xKKtl>=%K)5{K%-7l4gm;SVdaQZU8O7|SfY2_Zu6bmHB@}~pYypER z6MN5@MVTEs(R_ckLwB>ie|rW6mgh83WU{Y#CWVN;*s7lL5w}D)Q3AQJn($08EpBRH z=2g2P6Ye*sJ0i`HyC8K%J<&*fb&F@VuXr>vqWH93e7;?K<%Ej%2Os|z1aV~VsbIW% zGV;=;pvb_$pr$oyoNS5%>1<-V5oZR|bn3}N0bx=#W&t>f<0Fm~rs+HnAXdixIG}*! z?Wzdu^u{M7W*BS|lf_^;$RsKoJP$Y{9@HOtJ&}vyr{QvGNw)tSU}rIJ=p|WuNzdmb z8ts6rA5Q4y1KONc*rvkKg>$l%H@Iv!Xj6ZE}BrNWOY}k)j}ZN2 zDpNiJ$wV&rT5BQBxtKw;#0Dt~_D{WpC$dkqL|(lxM>+QBvY4`>$;MJ}1X~jKt*SYa;n3O=t#T2kXbT33FMY*QYGMIliO;-`UKDN^P5KaIBZgn6|k}?W?$J9(@q(7icLDnB6=w; zK3}LXepW(jYvacu)DhT}M)U!FZ&Jc7DT?c(8)|^u*BT!$UoI%PDiY>BP#g6CN%XD- z9WMv7YgNsc6?(~m!}5m<1&E|k(SsXjrAaoPckHaG!SOg1XG;2@l}XnnSq}Iy z0;-|!{HH1bu$(NHeV4hYxaPg91yP~umi8d37U=dnp($xKUun_}j2kaSl8TqQl}Nl4 ziHVmAbJ(C_XBMOtK*yHwG=W$fZ?i zc;rqki`=Quv-vnN-aLNt+V$X*{{BsZs#HA@1k9eQ-ZxL+Sra@9#iXkPSDuWxmh>E_xjwf#S7P}zSq-22Tkqm zQ@72oU(f8n^ceX^EAl+Id2Zeyn{yf7UKm9tI8t{JM!etN*IG>Fh(TQE z&t&yVUWV-eeo9?FkI;#Adf_WP)#bA<_f$Xfoni#C1l#AQ<96&gb=wfi*I*&MCIp;{ zl24@^LGF!`*{1HIQ`U1DlwCY>v~~ICcASG-$wI*^0}wnUQPvRfkVLs(40}#!?!}r1 zCpgsF?p_R(J?TJ7WJyhAdnAsp=B*@MHTNcPB)%2nM{MuDt8gNwd~SU4x`efbZmBA^ zCDpYB#FkS{ZZ0=Hip=cItGi}qzZ`rNnc49y5}DbhOUix)0qLLFdnIP@qhgx|`sM{w z^;gmWi{dR$g)L1dHtD5ZLNUQJY?NO7YjPi^6T9{DOt^A^%`PuGaUKy5Wlupf%o3fX ze(aY}Jq~k1AN8BAA|J(4u;b$tX!BS8So(oa8v$cu=foy1UQ7koi)q)5kCkef;J~Q* z(`2aOW}RZ4Z-hnuVDx+)pQ4vlU^AWgUN2@upVW;-vQFzsoxlLyg^xJco1uPOqy7vm z;#2jW&eAmVqE@2ibv)CeFe|50w+gFgJe!}WY_p|G6)GH*B^t1H*4c@g-X|(Y{#!lH zlLr-^6%{QOBl!~Pm320H6!?~>kl7v^b+hy;#vN*+Nw?xtRZ35i)kUhUOztmt5qr+d z8Rf2G%2}Mc0@SUbQF?Rt^y%BT8=bCbmY(@FY*eYznMQZa(6vpxrDw5UMa6t2Mk&95 zDmbC4f&;_%XNnG9bQK=e5~>LgAg7WxgDR!|n=tVJhx9)(x&Q0-$eVB1^C$9hU6`K# zsVvv=!+K?arJFp$@~uwn(~F17MpZT3l{f0d3BBCI))9)qQG^QGOyvgb+)HMvMN>W?4)2hjB&YzW(4VHXrRDELO^(u&*e-n))1{u=%fTA?s=DdA?k%4- z$g{0(D(tBEN3p4lh>~sUM|pO%n@%|mEN#a-+VD^QdkMg)Q&>&{(CL_RRBS={q!Um( zS&jKP(l+;U9kwYbHZgr2!#gkjBo?7Md6a$*baf0%oK}sq8osgyR-C-r{tJq6Ozr9r zPriVB5*|FJT-7v^{Bq+$Pdf|IfT7hwga!)A@?JTerWKMgCg+jaOwkGTsDeYpvlq zI*OCteX2kc3Y3i^gjbb)9{zQ8%fMY+Fl=sj>?bx|rd_I1vTx(9{Sd8iGp<_kmNFWT_?(vB8{IZ*+dSYW# zIiO-mCaaS)A7j_@5?wzi2Q(PTq)N05hp51Hwo@4IE@wp|@vgk9mvtbYEJaxdn%plN zZRwRF2EN{sUdK%)QPgNfhGJVzy%Ztmloj4xQRJ+aoa#AvQ-dP3b=pE;(er9@E}c9E zE4D<+*Sz+%I$k7Q$G)WM_~5Jq06Ok)mvev`BwC>=(`tn{z#lFBXwo%{C(zPMTVY#) zkGA#4r0C#IIy|l85fdw#$EKFU-y^+Xl3QVQ=L4i2mSZOOhekw@H=?J9P@=AvwuQc2zlFTce z9eJg*eU|YaR20h@AWEBob*3#!kZZZ4{FrZ=FGS1^cA{);kTC6m$G)OYfyB5x|*?5s`e2}QfeZ@v!8f|38lt|MGv4Omj!O2yyMniVTSep%`SbaUV6$gFhx>^Z34ow1Z?%Nu7H@Rn*JxsG zRY5oAE4|QFn=Jl(9~3n623{2}tq1h3&Rr*d)GKi9Q*?aOS!0-i|6vVK^SR%P4$zH4 z#zdE_rS>Y4%u*Vo-9KYOaArpNoD@IS?tGYBj`x=XI8gf2;()P|yq8y2_1-S*}y z_0mPI;IX=T|6mg1bbPBGhmER0{s?B zXWV!$Z|fO8D*BB6A>t&gKD=+VkG>4t2OUon3yVud7%)%%y{q_J0+7ilW(Wkp)lN&o zgDE3U%%Rp%|22m3x7d}B^-T0$en)zst_03Nl}G)@%geb8&*vCL&?9&mluYUVqt@le}vd1<}1c*ijm_FIsXV>-p5@mSRpFG z6Lftxpt@ATK5@YcUp_fHtl|*r|J{!hcB~eT)fKR7$OG#6{E0xq_(nbEkqkxP z-#R)Q+~mvin!tWq4)4~QVwV_QM3l$8ngPmNj^usB0VvM~(CQRu7&EdVQ`Hu}K`E>h z5?i23@`xFjMSCIlle_OIaR6J)o`}{|C!g6e0sA+3-7x8DOHWMhXjhW+&y9HVkMu+t zD$h3ZZhD?mjc~whESp@lw)_J7-iOw+u0K&%CZh7k^A%gbb~Wu9A1f287NF%_i(iNy zc^=y#b4g5^D=ndeGclFHQ_NUB%zD;Qf}7=)xB62pMU=86Ey;U1*@*1M?&jV;}Xo`U2Eakzfg(OT=QgbcU-sj})bOb=gp`)tVo!MD71 zvZ$)7@Jokr2L45*U%DrrS^&!9BC|Z$F&^xTu{-v~*xOGGh6IbTD>E=Xb>-gz;Ty?V zgWx0!$Xqv*`z^Vd5%@qpKYM*Or;B*$G-94|8)jMS0I{2oljrKC zR{{~c$D_OITiNc1h!(v>+PrnM=27PI5WQ!Jt13|$>Sq0bMZIfE=a>ZBR=>Ev#{w5_ zjCe4A-aP$!slDaPkMQojp+D!z4EVRxO~ylOegl@Et{JTWg+y*b4Pb9 zEt~Kjauwdg%bFdo_gxV0{X}kSNn_-#^=J~QAhII$lA)-mj>*8|0slJGtoqHZSc;&+ zKz`MSUql9wx_k}}x3Y3?(PWi53=Z&stR?s-qs*`scw{Y zsaOPgKspRdL+fHJ9%J5uTYEvZ9~KQ?YH80G!T|1XGW0b??Ak{1BM!CnbWC9c(|XIw5d6~X9@=AA4=BN5JQ!IrZ|3vo;c za`b+Kd`5}ZVZyc*wTx6VBx;GG_Mjg;d8bf5L3D*LTd@2z-jv7xaNv_sE;&(#eo3`i$CK}KRRxx+ zTIS9^Dm^9>)%nwQvl>5Gu7^Ox%>~UxMRDg+Vvk>?&-t^y*wiNnXXKWI=u_~v>ZHt)&#Q{XqdWi-}vJ` zp7N~8!$4&}%Pa&OpJD5IFXNEC;$a%46@0+!-A_=H8imTU?( zmLo+;kwZ)f^|j10@JSN@jG9}F%w{twh!!l$7x1D6Im=RnF!hmj*<=I=VNdF_*q7%A z5M_RY@^y$GP&KnBRBP%K9=38H_7(--P7&WjWszon7a=6D5~e5klY>$9FpZIx$_Qb(tC%5&_qDG^ng_9 z9Rdjm5u_#p0)hom5kXL@fYO46rhuq`bWob~4zqi+7ysY4SCd>I!SM6{@uTrB*?se7 z=FQBTii@!RLPa>E#L>e0PzDD?NpHIlB^0xjE9O%UxvY!Si=b^395q}m(Cd!}c)P&a zle~+>p;a1Df2AxAt~GQdeH^03_BAWzz@VFy{z^ZdM;o+qd=br2`}5Yp`WdaW8u<&^ zsI>*MwG4b_^OxGS%iLeNBJrnVak;C(qb>X@7rR5{`{_r2<0_iPo$0E@q}~v|$tc$d z+7cAo*TsldgM~hnH(3q!uy$qi8*|N~c^9p4Drq_RZGKC8z6Zp*BoFbEsWi?gZ_-MC zg~3d7l>C;NR)b`QO09$(!J`=UQW2SmbKuyl;GSAj1$m9LV6EA}!po^A${5hep%(gi zZid2i^i@ZjMGC-6MJ^)irrfs`Ra7$ccdqHoPr&nLK zYgTQafi~e{72AP^aO0RCV$@nl+&Um?r68)5%TQU1t)UA#m}wUb$>LB z80EzYTVgNUOdcx`x%8;h)h)r{R;jrE{44(5ie{~;tiu!>0MY$1j`IwqgIUzVm+!|f z6yw$wj)RE?_gSnRd+D!Tl<1wMkf{}DgoRpCVa~>NT+(~%VDL+SK4;M?f?+mj1JH+e z0ZPy+(Ira2#y5UtH=Xx((WvCUDpXC@X| z(>t+qCS<^cj8E)zL<-Aij88g+LB9%V@*#SGey{8@d#sxAU>D_gqo2I$?v+=`O(fk$ z+V)r*Ngl6G=j%e`Bp9i=SE4nyn;h{%=2W3!$~l)rQ!4J<=bRN3{1k=>q`LAE%qjP| z3D(bzD3W&EQfry1%{lmN8rij+SoV1%ZNljp#V6rV3T@M{fh|sH?st0JM@QPR>@3_m zT~JjBH>%tEg!;kZz+mJM5ll>RI5bQ0=8T%89xFpw&cQG+;8r}E5tErqSe0r2&LW{r z{yLL}(^UKmYp8raT-T=3Iz=BSC$ye3%A>xGUg4k%2IWPXf@>n=fLSe|yaS)!ItaoEIIx) zNfrt})UuGhypdPO8F=wH81WK!4wtuaG`x*@sjn?CNa#a$%L`Ug=D?cp_w`) zsirmbdcgD@Px6j0b0;9HLVDcFGglGz{I((mZ#jdGSuJv{l*R7+3<(oZS2|Z)gHati(j|z z@%0b(>9kdNhU6V{s1vDJZxvfon@}2GQZj5JIr3PknA}!9vXbS!*4x!P>#;qg{ zp3xwZ^H?}fgJTpt!%hc3HggL)YT$7ajp3u|NqHH!$LC#g2OPZe2O)DZNwf+7f@n#8 zMBCv$ji+|)Iewz`o?5k9x2zMftK}&>DgFXRJLnQ7r_<5+(_I2)7M> z0_J9F0dwYG2pBBp6)-pA$)s)13i(1;si2qj{u9GtiB)Q1=7kck;M)e8EJ5QA6tVou zJWzZz71Fb{%mJw4f&B_W^w7LtL7B5I%A}S19-*H~;zMdbu}yZ?M-b9CA)ooqZy$g~ z-wM9B;odRPYQ{i>0c%ShrIou1nBo)KT7= z5$efX3i;X8afP^)Q63j13~T8L4C}2vBFbAn5p=9$hPMe(=<^1|{!{F6ilnVmcAHOs z!$qm8Mc!73N?t((+avvZH@DP$jfyaSwdE5oSr$&*w%DC?EAfks=}LbfW0{YzJo$>e zH7JwB4f+?<4f2uqFNHQ(!T#k#|ZMd3H0_@>vR};=PsvzSj&^ z<1c1*pM0B)Cxq#a({B%8x~FqM4*b{RYo>lxZY5Fh+lP)(9t-6;6v@GF+tIy*x-hl_ zkK7c7aN{oNdB5cU-iQ^~{S|cEz>_6JF$RiwsxV~n5#s@Fr*}=NN!!KwLzY9*x8S+$ znNuHcJUOFn_wm^dT<8t5`Okg(&z@bbzlU{S7?K-Ko2H#|XD6EaUlb@v6D=As*xV9GC#;qN+O} zb@#@9VIe6~tcKD)SEAnH&JW*vn+sfA0h4@eZeVv+`3ST+I8X5fvsfoI{5Rl z0qJfwd13rzt&*8#3aUuu^|_oj?_AFM-M`*>;^^-WR@vp*QOn*j2+#inu1XeMF5c&t z{XGB2z9yrE3Lb97K_1utC*$}<&dwdf0R(r1J}iJ@4p%6_27S9cic1=?ddVJ<<%@(v zwKaT51s)y@a7h-Nzgw@K2wjCO-TE$b=k@G&Pkvx;edj%~yLgy+!Rj@O*G^nJ@uNQR z{U-MBJGSq_*B6dmyKr^(ecaxB>%@_pHzSS|FCI~^M2X||ZVTxn`h6r|OI2e&e*}?! ziFfTNeIl(1x~w6fDpPPpDyNU;vw27JHSD%-_o4lJC}<^O$?cpMV#MJkotz9PBu~5K=V+&?d~e}$AXjO z1LsU;!10j)vzgGtzA!2kKXH>{3$3?Gqte!5D?_YmTpEb%^6M$dykUe1m3(I8LjWfD<FF<0E4WEcXCKrjH8l^Yv?A` zOLyTvsV4Gr)(x?D=A4EM&ivT)fMUKNI~Dtkx)*#rr=v(|YdQ(RO~$IC0(fDZ4CU zU{uX3$H?@c{$9>E$DY{@G(-d^^u~Q1qh9dO(@DVoteotari1SEKrXnjpi{PUT+b7wee0i&9bjMOXHS77#07FdS(RS{_yIocb@8`%K=`P9tqLE zfX834-9UlVMoPp$>~Eph%23$v$bAr*4`Y$!{g%~m10_dS;*6BDH9vQVOIi2}%=j6? zH!(t+Z(}yw5L#h7CNx{*eFRL0@USA#Y;`%ZC>)BzY1lnTI-%K8$#Jpjr!G-0Z*#m8 zP>gGXg&3Dt`U5rKaX@YJ0wu4^09bnG<9t4C=fTFQ)Y#bexP?!77k=!r)G~S1qnadt ztPi3J1eIDZb%Xlz%A^!j%St%Y+9O`{IKJ|kBS@)&IpW7TSqcMn@Uaerl+LVZ3|Cj) zhEz$gr&*gyb&cDVsfOgXR!49OK*m3gXg+RvEYX0BRF)Bd5nT!QQxE2gwA7=Cu8MAf6o*3es2)Ci=A0cHVN zwPUK@{98rf)(;n1$|Vt_k(BTgMrkajPLQv&l!YjuR7l9Bk~fNQwK;Zep+r>{+T&t<@iJ^O_e>T-sF@*4cwf@uCt@f(}?O6T21!=qo>Ec5fB=F&vw8hz+ zZJ#bWTo$F99I@6%T9sO9KK68>@r2ae?8w;>Q*)}ztkR{d32kX*umenl^)VQX6n_?% zle2`$-QiC6HspsYFk9*oAvZZWP0*27I_p1mWV-{@fD?|FNTnlcPTqt#d>F5v4EbS{ zKc*hWr$AL2L>ck-kO)$G62T@vi1$hbJF_*^`3RJxh(SBz(~Utth))}Xj?nc^9-n;E zQz)=Yq}>N8jO#Hv{+|1vAoB@3xnDh z_ed!<-H8!Ch8ks+syr%7AvtxHf>u0v%2VYhSQ@j6xid*I;u2l_pMoxtuRFUq>SZuh zGz}XFH3t^h0P=?@9LW4YOUWuv6-y`&sqj>_t@9rTm_~=2KQrm#R(; z7ai23f5U4HqVl#3RT0^3o^f$0(1?72rwU9mC>rVw?0bUx0aJP++yh%~`S2u!6>3HF zp)LF($h$pAUHFKxEpeicd&;>j+k-rVTgJzu9lxR8)0O=$C+aLzCMVqyDhMYmIIaJ4 zCWEVe7HU?os42qFf2quLUHWukk8#Y2K%J9rt1p5yw+Ndom2Wn+U)C9w+AkYun|P1!;%vlDJ0tA( zk&m0jL8JcEX^7mZK{AfDRFa^$h4(z5mD$2OpfXUp(|HWqbcv_CN@J zlssFye$JftZE?mLox4QT3I}|y38oYhlY(E)P@P4Y<`?u9gdSNr*w%$Zg~M3>=g-yS zdiH&NY@=Qn1~^a*1Dv#C+mtPq6b{-AmuSEedXb*pNR86vmo!j%*oDr}32wDQ01Hch z=VN*0pCBKv6ivY^-b+w=yyD%S{7;a3hw1DOpk#iFB0fAV(~Oc}<{S?yP{kiN%v-Qr z4+O`Lm_E?bw9~2sza;%g*)G^G|8d~{`$sa*C~I7dQoC!HmmM6VG0B-@gg|>HpqvS_Esr6ZNL&87ZI{tYR>FR^R+6-)0jrx)VkC+c1+kcw+HaL zBfs*anfnw$Eo(ilR}#Z``cR)6@CVkTsQYN^(#OUtl6#ry5Smw1rg!Y}DaRR%v274% zM9-5PEjiy2;RE~<4-etx8f)G+_oZqm?1a3;w@g9}W6y`1auFZ#5M381w40 z&I$i-!0d(GMKCz3rjii-PLyw{hJa=p`ij1uDWK1KPvxyFKb3=&ARlhkaH|w!=8_uP zTfHMuE;IyOo_sP>us+38NYS*`57sKoCs zrTAqk3ZMKm{8JRR$jdhLoNptQs@GK1AlKV}-6r4V%@k_RJU1fvYlagv2bJ&vFdA0Q zQLOEt3fd@h{Mzkr?Xh4KV$I7)H@P2qfb%BWWyklF-=O9&W}NkrEp|a_#f3#mj{NZE zy14E=dykIl-S(Y%qwJnjK_#iMk86}tj*@1i`bxVE3NU1_vSq`b(E zofKwJaNp0cxB$*hOC9(*L*0GA8Lkn%UVnXT!=Alo&mC&#>_*u!=?igDGC2oBG@Td& zyL(v}RMT$$f)eD*R9=|gCpZD^8$sij%$I)Jb>c+xT@@<6(z;HapIcu<&uaIBLal)j zl6WZ|yiF?u>NHr{xvh?Wgq1B`>U|jYsc5{L5Tevc6TwBVJwy5r_#j+QsE2)IoYVuV zcQvx5vV?iORb82SF=5uZp)38Efad2`E|&Un5Y+ehV|>hW13VvwRvO(Yp&PB2fA#HF zzWgGU$e`$U?_2qr_W8Z+GF7!ot<5w*!hp~ z$_FZcq)g0^H3@d`h-4opZs!fOUFXKTzE`5Rz2HXqzK0*}vf^b)v}98UhRTXB40hiq zkv%*>0pMIj5EdDXba>taqcin>m63#|h3*C%*is}_egjv$BHr`G&nVxD9X+6$a-83$ zwg*09gn5wN#1!27)Wps;r5C658rIEHxfl9sMp)1tCyf)*?Su53F7%=+9wts#L#mIH z={?dt&_c>xTXFgEkrU5`BVDZ}5K6CmixTdmtHdeaD<{(quiN@&x?by3X?r{XO~QZm zBU08qQfM*tD1jz2^C3>QK%9gsX@!rxS%?#-S>9HqZRgrm!a3|-S*l@^w|w`_`~}Oz zxY=oOqo)tC$fsWJux8&MKkdJ=(JpWPbdEttAERJ5;R{(Ev-A;*Ui^9I$&;__tXQd8 zo7%PawYh*7U{TH?7VXfvcGYlx?tVF{ghls!J#WDm`XtRaM(B$+X}{{g{-htTevN0o zob6lmS?a{~VyuSEsl@FDrMTmS8PntbkxKOL$=PgEMsmqH;9X;ZRqF1a z6fA$Mhq8TfY!g~yfn2)24N>ZJ;}?^{Qp@q zT9vFd@EoZeZdWGfYoB0BhE7mn+v;hn(D3*cyw<9;gw^T&b2mh3-h@9&B?K@{P^-JZ2qAfxJw00ZHWjL%3=WJ(-lPGuB!biEZ zg^O`$J!Vq5K z#>Qz!&49+R^Hbdv_5o&-Pr6WL|M#fc>VeH8$o$Au5Es#p+`!#%)C_b)oS*6k#7jb( zd@ajBJLv)qqbdA(rzcL^F&E$Dk*MnBJ7^AD`nT#_+va>8ywuT1@1w{0i@3s7=WJ1I z>Hr>rLTVrw!uu*8KZw_zQkSH;O=t!5>qMfO@kO>hdJ*NVR1BwGbTiz)Si)^(3D!o_ z!@5d4{G0(>YhRG^w$(7)Yh)dcPuI%Y7nH`#k`Dy&1FK^;PH-mnzbeR$fV8aiH*Gi# zMBh}O3&cd)SQisz91mwwquO(z&Qa1aEObVN(GwuVt-)l#tuiyaN=m(y2t4Sb#Kk)A zJTCIU5B1AhX4dp@l1J35}Eq zzHqH>>hCc~QokMc610}Ty}|Q!J@zDPh#Ys=DQVWQrP5F6@h%ip=9lQ>D=D0doASI6 zHI!PIxn2o)%VKHlO;_aZCL(uZIku#T>e;z>D4j%4+5trL5H-64`2@z`b>%_)fC<6M z0d&f4^1PSAFs1_a3T0g>jiQ$Gx>5`?Lo#^Z{+&l8Z^%M;kRRaQ=Q(w;`O8*|BFcul zH`bx+!XbE!@5N@3u@Bxy}aYhntJ+ZBf>+wtkh5OIW-c?yv{#=z~kz zo0q=ZbkAi&-$Q?my}WuPuJDPvQKc@DNZdS~TouGD!qQKme`(^M*XV^*&1zf*NV8m)OP`AAl- zhIDql)0LYA(SNC)>`+ljoJDE*vZj^JTKoWF(QnKRuzXzweIA*Bucb}EUtx8O&I&B* zYB-O#0D3OEeQrROijY`=w6JmwQ!%nkiltzbERm4atp<#_c%N%Dz!9-@6~mTv?dceNf(SDfH4Q}-PeZGq5$ynR-X z%&lACKJnz)W~Gkd0#>O-x{0h_oA@CoHN7T& z$VpAz#19KlxK%~PW!5pGyHl!AV~{2*p{27*Wm`kYSpIv@2v`dkksb7!tRHbJFZqcP8;7clkYRZ zcbugP+?C$!A_v81G>3+wt&SO4c`{rTAz3M4wEQ>|84itj*i#gM=*ROI)&DljPAAv0 z8qT=m7LSiwcwm8kbTxE`xQK8ybgu)!_fRP(u6f6I?*8Lwo81u+ty|TN+STf~9is`4 z@4|Pj@m(8yw-ev__f?mVlVU~PP!`HFmqC0F{>Rjs?L<5>_WbVrH`1>M2&BeN2Pu>3 zV^2UzXf=QynU$cs($MF^(U*h_1tEq5Uec3KW`!Z*Z~eH-@Pq|qK^fjMVFjVSQ@5RE z_OHTo>X8ds6rQ*nBx_k>LCa3f5-PLLJ?!+lhkZ9cZ?TPZzgcqa_}0;~efW2k0V!V9`AJcs$MqTKkBzam;l#BK^& z1;ZqYqHe-r5X-S8@FU9JQmc)u`+Mc6@`1Gr<}dNfy6?1l|IYRMZ~kScnpEgGy+pmk z=>a?ogWy>>ff0_vv+xj}g@JVH^RMR2c~8%;?=14``}o5nI>+gf_dkV6sbZBRkK8eB zaNEG#9v!S9;)IWd^HUG`TWjb9zyMnlipzUre_g?lz zDZQ@Z?BDU5wD1@y_XV~ zZr=vRiC618&!-{K#;5?eI1-f}GB(7g!p7nFbkMOO-h+=6JdVC3qN9_K&rhgx()d-- zC?vacP#Rdb1OW9!dXR2Q1?Z`C;M|r$FqILh99@{#R6BXk{~E|XaFUBU6`z0|3;~OI z1wO}Yel&1PalqX>v{P>sa_$s`DtbDGt5Bumssr1<`tIJ}c1-iJoq|yAm7Z)pxpdu} zISU|LT_q{5x)+=2UA`8BT*AI;N4?TRj}>fyri4CsV1j2UmZSK&S45oh6gA<=R!0j2 z0+%f^a`qo7S7WMZLH$M)+EL!I!_$9{>tjCY3R^^SX){L@#<-iIGwn1a@quVVXraiv za5N9+;l=PH%ARUz3?f9X9YRAFU~p9g1UJ$^aQbl&+{hdR@~wf6!)Z$kQv)XIOuTrx znFgvekAv!F=Ahyz$1ncvO;Um5K7O;{Xx}U-BpT`rxQ95h()%NMY@ z5XRJA^}Px5(G`x87b)8w8;W|t9g4z|`%^BtNG!QO?UG-4mh{AiQtV*AcLx_zzHYyG z-G#KTJFLG>iSf@=(O&fg4BhXhQMlcpQ<0tqE&oEx0_xX`Y;uJSb4n@KJ|Nbad`B^72qgSd`~&jrdDAEcg!*?P8M0y9*GJOlO2i&0JZEPZaF{C5?-gO zr7m)xEf@m-je)Z*?Xd2r@DqQ2PX@|Bfn?CK-QO0PSe?L@&bVM zk>TtCLT&n3akW=NORN7KnBH3TJTZ>O)GADX3U^RFRIs2c$ue=X&fuoqK-<&B?ILc1 z#`^{uHwFW&3y3-eEn}tZ2GmN#d=7zEfLeyT>0$FjvGB17xVKW$FaK*wD@~Q@0nQLt za^InRT$n@~jsQAkPaw&zy=)C#`9Gz*IO3R4{vRF^rIFQfFJ%%0i0Y3w-1K40>6HBj zsqR}rUHP1jK>32tt#r=oR+8WN-{MgxzC6M+=D;qG5|a+>@*85ydj zT8VU>|E)YynmR(wr*`c<<{4HOxvK?+)tR+wW`u{%i{|^7<=xE?iyxT4C3^9TX;pq_ zOa$Ql#n>aucb$L!Z-tm!*yDO|i~n}B47x`qVIFd#eD!}S`IRQhK!3Aa{zH3({|+c2 zJWz|kj2E^4Q(!4cv}g63TZ`i-6!U*97us97LCXATz~yc}k>`94Eofu~|wh4U_ ze7VuCloA4=hqw6dq1A9C?QxX%qSiD2lkH&=GPXsH=d*sa*?|t~N-GVgtH#yilq zXx^?&Gw=v)n#4|eBJ_>M%V|3f%@ofGQTr)xno)>66JNR6--izPAR3@@w*hy3)WM+_ z#DQ^x9X8RgM)1i_9}4J6sjJZr3<=kdvu{5_0KB-hDoMRT z-cpZf@SZ}}Y`JHc`TqL}A6Rs;p|ep6v4PzWN-Hju0jcsq2U(5To`4|+kES8qKor@C zYLZ0db;#gv9T!CTRH8GF#MLU7;Hq5WrPEZ~raq7Fx)@QZRtVne$yEE{@08~|o8G^@ zKEbc!dzmXg-Sfh2>bq$?!pad52g}47GlBh@rizz5bs%!aQu3d{3OcjGri^jeNE@90aK?@AibTo@}wVX07HeYS;b=mjJ&Ls24#Cs-}QqvkLXz+Kfo6UIyOjcm}lF7N2S2#l^d**DPS# z4LUA9F7w8Zlmf8JWOnhCKU^3ETsGkQ1HHT=rt{Krx@h1x#Qm_h>wefqf02`qgm>T%v>U0`s!deg z-EID~%O{jp`TpFEZ(HrG28TgZ-92s2g899zE>pl!)7|N^GT>Mhq%L|yr^^9pJ6*2w zcDfvdNU7CuJ5vaX_8`csW?e<<>GfTT)2U`O@z0-?(T*SsmR59?k--iIejBgoORLrod4#(nqY~(_Ix5qM7#yWj zLOYu(AKR6Ty(#{2DMG8GJSjr*swk=}$%CVACw{RR!@ynrA@Za+P=C<|(JSrZ|@8sm|wprfX$8#T4Ch1(GHB@3>MP>gn0`XvO8>lc zc|g1e4?f^T*Ry}kw4BE;L&~2o2jR9=0a;@D-qXlfsVUOK_V}evwsfaX;yZ8ZB))?T zMFXD0o?IaHICsnxNxbsZx9tctsTodrbigL#aypXCZ-FFFu9CFT;_zUMJX!AFMmXM5 z*k9dnrKfkVK_QPGIKN&O_v{U*-pKoYhe2ouDCcq9l({{{qQQmU&6kFcsJOUzmb+zx$Rzj~04Zek}X zQQ+aMnlq4S;t<7>0+1b#Ma9{SqXLEa==vfQ>UOF>)dk2_1zi!n%5nQ+mE#Vpnt&tW zkF0Tzg>h>j80GC8m}g4)$<|Vkt*v31Pl3cO3cP(8r6l;v$qnD7Tfg(AS7kt7xP&Bh z$46EN2CDgy+NGHu$!)8m0>STt-qkZ^8dT8Bu4XkZB)iY~0rkN=v;0fRz7d#S>KdI| zUW`ut$~8Jwoc2at*X_2;t6kGmZSqHJ^>#G+fj^M3^KRnY2`F(rHzs(eV^zpbI3<*V z$tMi-xuoQGoG|bQ63=#?6Qi`>QO_a3;r?r{9&7E=Ve%=Zqd$7Dr;FXR4SO^@?|9s* z`k_D{bpfc-6b)3A6M>F__Nma&kKBP`PoNdbJldTwCTyQo$|JAEok(wGBXJYwF0s>o z>MjGnDe>#Bk4?qLSrTm%cv&E!b5=j~3j?yh`#Zld(EF0f@0Ge!Mt|+Mj$vs8mde5* zlaSGcj%92iwM{Cqq?Qx@imX{iq=&&9pM*iVX98y8s~>X9f47*MwjQFW&EPvfrk)H$ zUv;r=fn|7Wmmh_}Iw+!6hPnI)P-p)HbOHo&0Vvyrk0QfBoO%Qhx?{-AFRwk?DWn*L zizdUXK9YGn7LRhnW$wu6SD(2q-dNMsCF z>R|-z6TfPa!N5 zf-r-gxkyVd+ZDURsSD?M&Z`1D^VO>cUMeY;W;U)vK^2?)Ai3Z`cuTdd(=W zo&Mo3Ge5ATc(2QWT%Qgi<^4%tK32T^Ti45#*R9g@loRvPt|#`AHOtY95L{WZIXY~WW(DAmqC$G{EFZDd&mq1#KJl701VTHy5Guc?78{o~fS3ZQVHD$* zU|F-z>sG1n6Y!|l9_Z}02Ub5Z28IX>taf35T3e-LZ-bgm=^7QQJ(qm1#g+m|F86zV zrEC^4gVN4w-09!VE_E-v6r3n-)mg{(Y7KN2^W1(@?y@edbhQ8)GiD7dP&uoyU4{!X zQf%3yU#LFq7T0Mx>5184f?$UvH#^`E_A{rwR6kP56i=XNwJAj-G0O2Q@1kvJ`7 zA`{#Dwv41VifrtRz8=W|sb2q>w4)5YTo02ENsYwYj*7lmc?A0XJQhf|o#!HkQj<2! z1TAhWKLs-Mw5G`0e(W3FltohY_AsRiB~5X?Frb~PH5F~09`j1&!f4cf?ffTbS$xnx z|MZFvqB^Mf?#7*{Q`jY%sdS)8%4{^HTLTvtydP7+-zMt1)y@;7>OJfA}Cso=2vcL;b|B!l9yYJwbKMiK6+%yk+11l z3*|f7lAp2HH1g^=11}!OC0XLm;h3LL89}D0^a>R{MdsroAiRe2?4vT(sJRw1{+ZMaX*|)$^nOE*VN}~3-8^d5*FuY&f%!N6~l1G;vE!s z6aVL~j*YX)LwT%TAZs)Az+7#$GPMmBd-#T?g{THNa(<`RaF(;vf@(AaUGX}?U3suG z2C%+YwdcleU-$T`An%s$Mf}$GyAB*%x4>3Zm#)5irp$geEGtoPoOHG$=iJ44Ec_Wa z=l&QleU7@LMb}~bYzL}TYf%ttbGvho7dRi+;W~v;r_z(UKcM_n+ivFTk zl`WzOZMv)GE03$@OS!~Tt;!BcP~Q7U;_N?=NiXJ@zm~VlG4NywF z!k&cE87@^4?OX@bFfpvWDpkJ6g}EOOLn^%5>PvEWiXA$ zEJT#uQyC32=taew#Gy%)vjLU2AjR%waLC8>Ix5__`!@SW=s1t$m}5vKvxI|+&Ct>D zGv19cMlJZ7O?E1)oV(225UGhdXnFCIwpZa zq2;+gmw;d_jDmz*d;zzwFX3*gfm>Hmnh~PZU{&0}jw0Dt38fI)Odp5uee?8$oi>cp zc)#VmSF46|OcU}3t&OA68>%YSD!uc19=I(SDX_BGvx(6dowHNiJXAtcufk2D_ zC1+i^7YA_|SHy-(ji&A>;%HBc=(VuhD5ZUara?Xb4(L9kp&-$)uk51PZ_topE!m2i zvsyd;I(_&%Dr!gX*!EmlLe`h9@wVfColk;OA^*89rO`Eexzx5HCcY~?gkl_uXqYKq zqKTpnEvBo~yl@NbQ1noBj<6+9qeRCKMv$!_rmIXw%h_k^u(>0MKkXv}s?tn@EB}Zh z^XTZQlLp)6Ke)Yd&Z3XrUSv72VnBJjDS9+@QR1kFG8nmhS1>$w3(X2qgMjcWkgcC8 z^Og58zy3qM$d|#=A8Yfpcd02_!CtrXa)-%Grx*MUNTMuM=PDQCzZTeenX@rCzC6y- z&B=CUi^MnIDvw_^K(-?zz0Z*k{k2h>6r#L2)x2@j?0N2#%CR%XS_=2v{=lxrAzHN2 z$bJ5f?L?>W6KoTGksfRNM9D=<1GR+85$lX#NRRQ63>D6PaHt3_SImO8G= zHJ0YXTpjvC?Jh>EL};@Na!0Q7JF24tXG<{s$wDFb({g#~@Wan+_ zQ3D-fL-~{3#nOAo)JgqNd1Rcu?7g=?v{0_q1G)Kc_OB`$OkWF`a}}QUo-SE(+TZ`8gEaj(Qmo;hRMVzfInf9)l0Y%4GA3Bv4hf>Zl#kvgx=X8RAtc9% z3A=>kc(2v`)-}R;WHU&P+B{Q8j+rXFeeX$h4=!gDMC|n#$4}Hd&VGqQPT&B~lBob&FBpkl32wTwwFjiSpG;_~5$)dWL^ z{LVob2Gi_|fwjWr3vFV$wy$avlFe0FEmX^5C^Y3Bc=%TgPZHfM6@V#JcjhAq3S~7ec6yAZ_K;=Q?aDqHLjA0;pZn2RqiKw%;`%k} z9ZYs;*Oh=2O&*|V5|m{wP5W$PDk4g&8`D72V7s@XQ5cwa0NpbBX~A}74&O9$d6Z;X zQ0EqZAIhyZ)w&B+F@`6K;d~Jgqt9a<3>d&7muNOx5yXc$dbBlDoq9+3-M=BL&b+dh z8iqs6hCrwnp#r}*=bQljO^Id>fo3ntpIUeu#BvWl#mh;8J~+kMMMr~G1L}moI=X#_ z+BRz4$Z(nr>#yDlH~li2dZ;a_A6A>Epi6X!auc}UjRfw&bdKzuNv`#qeGz?0{j`Th z$dTbZg0JvpAhtjKY@ba%u%W`x3^CN_AqGU4@hQW0*=q=xjJ?Je%6_AB$`-5Mp_T zk&njlEN;hIIG;r;lp&;!!T2IU{h)W7yr-Q9E7g_a>PQ36lz4$QRk(GlAcs(vsd&^& zN&JH4wEE5lQ5N>&zH)x-?j zW%n~}mnmuOvNX04H35uX`{?f{u#XO=vX73Yw2yFlFv`OZMIIYQP%txg44<)vJ`DJ# zFieH%M~UskJfw`-MDk^=oi+4q23_Pni0Kpl1o*;L>~nNE$EdE)<(nB>QTtIqe{A=z zqsLn9jErd2CbI7C*2nE?U$m9Ocdd6uc)yd+XmRW7E>c1Zij{AxH>k5&>;I9o_2AM6^C`!2r9c5<2}3Nn zr?jR4;Ef_&&E*EHvf$nWxB+P{+B4PaTdkXLK2|S`QoE)e=i?1ro_pci@f%zY!}&hn zhnJ#1{Xq+G8G4SoY_X+SN|1V1F}L87fZe-KV@dhCvkUy0X{t&BrJ0zNPM^eJH0n!A z3)~+k($tVW`Dn95my{ufAGINH9uC=wPudUzZILjB>YP$uNi^^(iO*^+4DFN_JXLGa z4xf}323{>G6|~v7OcostM#DrGxYIg^sS{`__dr17vhph|w>98tJ7$aLY;=hWtrDzp z`{vSL|DtT+)S64-V(=Ni4?jwN?iM3%EPuXte7iVWxqoO~xB9DH1gDkZMpO}=AS!&Y zOR4g8TH_A!Y^|-=M%sC*#FIY3B{YcM!c1{j;)l-7V}#vUDxdPYI@qwtIhbZ3WpxIo zd^!6W;?#aTBl(2n{(E|fO6n&7Q#U)p-t2(;s8BGAtWqsAT-LaJBae3&y$G*JXB&5r z3e9L*wXmgd)4v|hw99wfS=HU*knrty7Qe!((q^z2#jb{=M&`u_5_HdyGLQ!oO5{REfa)1Sm7(I(|Zx+~mJ zRq0K2H(W5Ml*0MYBy9X*BYp2|VxX5K`ax}C_{ce)CIN3a=Et2=MA^wPb&7$16}X#< zP4%YEN<-JClwQ~vRfRK4>8z5?#dMFxy+9Dl0=%oI1ABdH3n zvhZnK8T-O{p+Sc9qtm!oMZt9*yUfn<5=+CYwqUb`BZ|TLiK8*MaYu|K>*=~LEW!PG zkbB<>2Iz)3#v;`)xg41FA~*t)lrBo98ve;Xzv;<7tFt26hyE1kyo1PXKloy zo6f*XdYa~hsEsgTjJwT&_6w(x;pj<*$U1eMV^a=rvKejyGaSUxQ*CNLBXylhc^NLM zaP6SB+st=pI^8kSow?ZUK!PXs8jnSo;odwO{%<;8GxFWHaN8cpm&5rgjRnT;O~!@! z8P};lCepqBeA09;p?Dm5^&^p}w55cWG*-TB4JBS@R^b2E)e6QQ=GEFd@`{5CVdRi_ zon&hFNenq@kn%q8UKnUuH?LYM_<|f6HhGn1KIOLGk|^HD*f#S zTj3i14|!h#@b6mo(rMT)MyVjH&Da|ErIH3@H z2xTptx58e^Hry`Kd`BU&#uaFl#iTTY5a61+yhMDnx0po-5#(qN5wyv1MqjfttTYu) z%`R|i9_BUN8WFzrz3u#xBo7f1R96+f2{ja`tz1rRF)VwV1@A&<#?p`r=rVa7fyz2m z=Q?y_EXS3GIu(AyToBXQs1?*&r(lqH20ETk4^e(qlFXbV;@9gGeC#0Qv{Ng-CTU5b zG~IDR>mczwtX_oUxb!77;VRkP&YQKe23m_g^-4Aa6@lh-5Aam1`dnx+(mD*XD^VE= z6DLWjnsTP~jI=YY|9$`(yJyKq8O1EoVB3^YiPJ3d1TpC|Y3983u34hbLAs2zt8e45V(E@W-USV4Iuh_;jaw>(H&RGVHO0-Hlk7s zmMt(gf+?69ziC$*QzNaRL{%2wzeYtZm`xG&;!?O?B^o*uKGhn$QiPkkp<&}KSb^Pm z7_7jRz(NHYwH&B_-rZRy7(q*S^Rwswm(9J zxSDxpXm|3P_nH!(4N3()Oa9*tlvNfBJ86JVl7*?qU6Kr!z6l98b^PtL1!GX@ke z&ZUxWL~RRbM12h->a@##49bG4~vrMCnXS``|zAI?91@@(O_Erz^o`IJ^tYp;}ai-1W= zd!uO{=#vkwXnl~pICW?f7ot>2dFY;SkbG&cu__XI-3DvdRL6?9CwI=E1?z8xxGe2g z5PyZ0EpH?AD|ozx&E>30%_mAx9xrnIwz+crOcPz&(xqP!K1McGLWtvrP}D-LcXg?C zO2$QUEbf#kFRBQyjdfjCl`$BuwoZG;b78egFDKAQM=XsD#_ks2?)oAA_z$HC9SXrv z*?f-EG}8IuA_>VD3k}pTc_WWhW8#d?gye+=tE0L#^q$%3=&GzUDh;70KT>)rosjnX zfrim-Yj~uY-j;BEs*P*=LH+|tV2$}}JHIWNtcGsLQiGRaByv!qDU3#jd6vgDVVg+2 zALdO)43s=*b=0>SvS)N{JEXFEd7Hj`=q!-{($1B=ho61*Mz$Lf%Kitd53w3Pe&p)% z>g3#9&y4VI*zfSS2yaU_t_OZF+<*~qCC*4WTk~^=xReDQaqIICzKQTCn&Q?&WMzd- zUVKd4+9U7lO>PlU3g@~USroxOT+{C15JBeLMw-M#36=Ig8v>9NgUO_dhbk8xzj623{15cK4;T|YrL6vEs_(&`Gwn6@e_xk5<24WnO zH4W`ye-unX|JBO3u}_h>Rzn}U`sj@e&A>(+$NR#y*O3rq`yR3yct#ZvEs!xq&w;t~ z2m-%PEw~QiwwvIav7fP?FYY|6ww<_L*85ROKEl>k7(Gd>_7 z!b*F9fR%Q_J;}Wqt`=+D5NvmJ3$*?lV)^ZQzgK+xJGu6}*)d>|QSF!v|Hw$3Q)t2dagwv619RF(0oRgA zJ(^~dE=23=(oXkQzlpLMmj>GGm?*K^Z=zCfcWZn)`?WeIiw*n1g*-(J8F0a7^oLFP z*bg>+E~v}+L9UF_6Lk344cwY2s{{(63@eoxlpb*3qz~L;7d0|5U35*9KBLv7%y$tE zTXA!0C2<;*mvIOEOy_K)vM>_|BgG5REc|Evj5)+h$NRrDQFNm~cXQmlem3wL37Yt4 z|If*7td7EF_|!9W9Mf>U-tfJ=o(Y)uJ9yA`1ZMh)f(>@0;sWO{Rzp$$Vjwy!26Ro8 z(4Fy?0kg!MTlJpRZaX*Nfy?6}GJWGF_Lg`m?=``<#UqvGCG(}9cAYrUd{>2vue7dH z=jYZJ?dr??Qd)LEjX!|gl5xRc`gJ^Ro>4K#r5b{S!@gm#U=yf0tr|;H_<5Qw$0;51 zIX*X1=`&|>skNQ1iX4eT)gw5sP2S##ha8lUkriAG*(U|dRpdHdy1w&nKlD}QK9CQS zHvBYYpM^H!b@k!68ORpoxpw`)zStj77uhTh6y~ZO+_rzZ+LAk>O5DMbV%T66^8tQ z1ejvG`3t;jl>>QFE=tLN1V+2_xPE#P@S2H8SDtiUk`LV8{>|OBYo|^7#751HbGr|i z-PwY4)v)qB!d?jWSZ8W%G#z!V43`dCU5hn^LGEY{e}`_-NX|a`$a}x{X5_8c-;ene zd2Abjiv}QD53=E&KONVPci3vCeDKvSMe;8Ef8nsja*>(m?zWZq#GsUf`84iq%~?gW z(_~~kjz*4E75@0M>||s7gILu_B(s+1_;45)dC=@ zZ%gEOdIh1cq}c3iHY%aY7iNC8dVMZF$)*%HQl&wMniUGyepAbu@B9T#IM=4-GIIFx zh6k>No30N~a)Rk zgr_iy!tXTVkgvo&dnEPXT4>8Lcy)GajQosdMqbzrIPb|j!+8(B>O~8?+E5BHm|il< zFowTGrjhM4>Y3ei9d5Z;Or9u471e3Tw%tSThB!_T%#w<{4Bsxp&z?r5sfxylt0lgs zIfZ-snu7AjHImZQiLcRS0>Ry4$deO4W06=JE19k*&@h~&R!TEh_Siy9r<@@p7JY<< znVkb+$X=$S@b$W_(txMkp>%gBnHKj@u-eZyxWl_m`5u+gCG+}rV&QQu%E zs*7x;fl489`?yF8LeM+BlNqBU?!)1*g9d6lltPMv3y33m4_D>7R25gw1=I;okHkH* zPK+9fK(2}U#*GQPW)1xWX}||?=U9MHUUpit!M>Fa8{jZ%%Zjv&8W|}3uV;_Y6#fXZvrDIYw?>2COF|`paw7k-6{>LrR znVE;+nYe@d-ulxbaET6bU&BxM9m1iqa7>NQhg#c3^p=uMByYh3RT(z^D4X(%5%*)G zfe@^n&G^||e3lGU)%|$^&lTL)xuSuq8maRo12=bls)A1!4caaj!ny-tl^_v&P&efb z8WaXk&;q!uK0wmMCTl1{-5n%qaitu{P`XSxZei#4l2TM#1(a$<@!&!u{DrR~$oU~H z;^y=!ueNJTCHaiA9k=3caH3Vk&${^89XRZcB}dR0`Wm;K%J_E^jd=q{VLi=sQ0k40#qP-6L<}qs?2-==x_gsa$(ou|DR1V| zh^%G9IjR6(SqPOzbRw8T(1ff4vhK5SIXm*^+L-B0#}cXmCvgqR$5WARcL!Z2@9;;l z((NW3{Jofm^)6cSx961*#LXZw=g^CHk|^8n;^OC^R$48@V4Z(+Nu5gnWUC?~5W-$&XkTCX+578Ad;1G#nCAkozR$b_rK^DWxv zS{Y!!E|qrPr+0N2m2$Z1Bdo%?$$)IZaDEOy!;#=1mIgo1mygDa^^corg!J%e#~K^$ zT3bnZgIk-&%!r*4Ytv$>0D|PRN4`CLc)0ck?=_QM>1eFdy=DiNEXdA`Hq#PGz7~%p z#~P5u?e^L6-*66=-u@u*gAc<$ov~yF)L=GzWs|6FbMO^18ZFv47_nX&QoJ<$y!uaP zj2mRtj1X@Wl~-T}>cg!(9AMKE|HfpG0ky49VYjqbHl~&4S1FuEit=7T$tf8X% zETbXDF-?WZ(3;9PA(BuIt`@%l%qM`cPQ|DV!EJeNi`T-h7A!}rktn?SK-$i~8Q3Vv zi%{R++uVu%0ivYV{Eq=)Yh)+&mgGScqBb<3wxA?GBVAYS8n}xjN7ulzTv{rj;ztvy zwD?p?swzI=w}Y;0_%jJSja`R0@igAEh=SE<0~G@v_#bm?u~IInGgi`71oEgWqHTUf zG(YbbjJ(-}2!D7q#NA!H{#-!WvO}^~)U48kAIE$j^Fwx}4L(hhrY@PjbeTs*+`BMw z#8q8Ilq&bG2nD)TM6Wr0=M4~1@ru+#`lS7*?cQsh9WtOIEt2A(BXYoqt31S~Clmt? zZbeY%c_b*@rmvupb)=n8>smt-%xF0hipxL0CDC8J)vVQ(exSMr`WWFcv|@o z96SouC>LR7=Ec9qh5Nk)%~5*LY@{r!tIgI>Okm~?i==JeF8}GLaAeUorx$oFY{wQ* z!lNeI=q>5$yO$3j)s+fdYE-;_|87xz?apeF@=J0%GgL?m#NXmSu!~+6L1QYl;-VIQ zvDo2zM|bQ!yTp!C-J({GM?=plaZ>Bo1~#sX1X1M3*l4FsQ0x!>K1R(Cqaf@G5{?fD zqoo}hL2RLsauI1Rg1&=4XiG4$kV_1{R81-N483 zTW5ZL5j1(xnV&|X^_5x;iWkY>_sv-JzJV(6ec)tT%#s+ziKLfuW0s5wdjP$$0`FWz zZ^}chhG&(VW@@9&P+CHe#h$9Mge}==n$(RxgIN~It3SyOle>fwrEV4@C-;S*|4?fg zt~I8XyqIqHv7zb-zgXAgw4zbgatEBgzUOYF9E4a4+*_WZ;_642sIG8q4&_66a@<%5k={Q zrYI4S-a7~wih!P(y|a10=g#&NAPD}yH$UHy-I?3(x#ynqoaab0CVunn)bGvk5(X^# z^iLZNH&z>#e+4i5QcWNuT^$GSRwBlfe{;6xnZ$Eg?;QlYrg zK}G;lUuF&~&I%0-vad2yfdTgmtYd|OXfAete_Dg^j!ta*x**ERiWwnXvKTc(Z-gCe z)IJE+8X#_Nqhja<-J0-iJF*#R*J_*zE!NVipyXkMLD&j&b4%*D*_!;hk#+h8!DB7x zd#K46T}1wNL4G`FL7AY8yiNTeDz3p!H{4ijSkaGJ=BYu13tGXeH_5Vo$3*1lqHe}H zg9gtUfPAv=Rf8678;KrwcT|8YVIRwbiCh&*C*U1uPj_(3F^wAao0SF`KdZvtSi-WJ zwW;hEwngg#q)!6-N?GO{^?OhUKEo^@geIx$$~Xa)B1RhVMAx}S!+ptYup5@#F9NW_zV>N)3~>6 z!`9lPJjBjt2OTCstz(of(_25Cxc6s58zxzmB1$Rw0+kV1Sy9@92$tKz1gKi~qbvT- z{)J2%aKh$bpIEggRbZCG2IHip8DbakX`pUr9{V^n%|?9SR+*#tF)g(r_vI*PR9AB=y3b7X}>u>pU8 z!+!}TW(kcj&>6)JBgZY&7_rsr_?!Bwe;cW4=iAV&;zKn%jZg!P${Pq38O;v-U`1d> zUrx4uup>0g(b^lKjzAizpN5^Gh%{0P5o~RxXfFPygYH z%JRGy&Zr=GS{rbawEW}O&K8JTcD77FsFZXJ z;XSiKt7VFxPW|m0_;LIWFm99K`K5R4bL7c1X_gV{=mVUQ`JR+yQo#=+f$VE%)rM$s z0;^*mgJaNwrL&(72#86TbROqd$xzr&x=?lYjUH6fgsrlg5_(Xy(h>0|)u?;0-HJKr zj5)ZY3{?Sf#A2*X0q-HB9t;e{ahI#a#H$nvj22F-Ws4Eb97!;y9EI_qAq;~p7+3G2 zR@s&TdP47Qd;}0pcqk2I-QacJz!IQJS7gh_SZN}%*e`f+g^HS~SW*Q9{>z2Ru);Q0 zQ#9Si4R|H!lqOJjP8~2F5HtiSABG78AGb!xT5Ed~EfakG+FMXaPeE%RAH+teEsa`t zibZ4*?V>Om%a>Eo62}Csw`lsd2kx4+=_9aSK)>l1Y;TIN?QLpVOy@}ecDm3$`Wks^ z+an^=R`A338`z|?Bg9QgQ9&(D{T!+o={PQMR)TFe6YeC?8)if_2eB+TwIZ1j>Qy+d zT`<7s9;u`H<}L!tvOeuKn=bT3wMVdCj!<77Z8}|1F?nk9o-)R35Om+&a9*?rRnAv1 zC0MGkcj_QvA@E3V0@Tuja{gI|1+2G%VU5Oi!X>Q~TWZzkMiy!&{c^0raZ^gkRMmX0sJR>|g=*MiEvW*G4rmkQFX;9kx07;Y}zSg&&pyAWJIr z9xG(y1Kk&c+!=$7?JCh63^YQs^7oV#18xN0qBjkCQi;0shK)W5W0fB=`pfJdn}Vuw9GtT z9Ux;fWYq`yeGGdJ3_E_~mGT(y?0n#DrZ4oh9AmE^3qR8apckjJsff+Gqpox==Y}*8 zh$hwqMyH8dHm&Fg zs==*L16dC&|6}kyf-21FI5I)Tbw3A|PC5MKL=Vd1hyN~zAO3k+tLZA7?6c8~gIGhj zgwIAh5HwiSj+}EVAv>dJ-o2;a?Av8sI&tjq;r(I<0YJr5kLhTRFm+4P{%ku38U-EpDfOblKb-5rmx)pmh_{usy_d zGX!3>M@aEqSgAU*<}P)@DV)`C+>AG?;UTmjP2r4iDrn#?;oK0Wt0`PKH`ImmL@t~k zKY%F8_mm6gs0fDBH*MiOg(hBrp!5jmEo>(SLl@3Te!{spgmV{K2H`w`3+K8%!r53H ztFaOjAe=vT3+G-=;ruJiyI$e^p+`9Xx0h6VAgS zoM&LCM?v0FjwCLgZ7>(m*v`6mUS`$|Zt=X4mH3T|=Y|l^g;I;>Y>*n2Qj2F@ljY*s zUXzRGVynv^4nN7v?d&T_m&`B~anU>tqInX;E#j%C z;j0h4qInWTbCG4D(!yR*V9Qd7<|JRyToNaxQ#2p*ispI6i*#=pWgR|y(aKeuR;|yy zekWa4s;t=%1WuKKyy8sPeC*fNG+PnJ7u6tMwa)AW^~9anv1zb zb1|=Io`2`zH~V&5mroo!Y-pdM{c`vDkX_fRNB0b(L*kbk5dUCbv6hSGc3d>qc#dc; zhl3v{0)F^!eqy*pGxZ(-On4!f}FWi9gUECtKKJJz^K zT?UVv90W{h6Q}?=SmjVmURzcU))ZJF4E?hVZICVK!o%+n!iCYV+ zGUHvcB^|m%S$?+tP4Tj{DgUGHhmVIQojCUB@$tGvtkU4Vu=kOJxcuL&!qal6e?7| zVHhujU9t$f*>O7VSH^6_C|?2`M2x}fY@{f4ilQXBXyONW|L6OE*8dsre^3lS@!GCN zAdJ3SFs>EOR{Ss19W*5yEtX==+1JSgJdSDJ<#QyPDfmic{vw@Qv7C`MsV}ouYFc_e z3!70V7mYe7KG?j6-add0BB_>0w_lL#wUQW<=vu zg!CFW*9PBHLv^CeNAu76M=%-p7Hsfv}wh)~~VR{(bX9)R}`*a?Jd_r-j;-~JnK<8HQA#uTE)==(4~+zq9B6+x68 zMYFAJh)4xlmB(-koDF5aMzT+_c=n)xK5POtw+M(W=o_IvCAYp!e&OZQS-7Q+X}rUGn;E;J&de$$JX2d{)kQEFUa2` zq!8XHWEO^w1F)9$1~u;>vI@=iQ5hR;F{1opb#AbbMd(qA20W#>uGB+Xqip95c*H_J zu3MHB3uRl3tW49Etb(-zYkpINi%8-c7bRFm+o*>T*M>JK zGuvt{!;5xi5yRcS(d)MJVH-h_B&3o!q#|&4jxv z6xKiFKa;M+*~8U8WXgJ~I4f?G_QtW|k%)MYx6p3i#xU%Qgx##x!MbjASq;Rb`*kQl*R%hCsq^lw2@iEn*W`GV50h^el$@ z-M>3-Q+6UCKl^aw&8}q=@|ppdwm}L_*6W@_pl*U$IOyuWzqVSJi>N6kDGk^~+OG|?nGiXsyaOvhBGpk$u>rrrbqL-4nCg%>QwxFh6wfIp0Uo=m8h$Mn z&+xxmIREM{c4sXh58(>fBCzgaSJp~^DW|gbjzBHN3krTMcK+2$JkS5?DQ>1#0_!3E zNLvK0^J3V7#QLx(vUSkia2IN-jH0Fiu+uhBKBfi+rMYU8G1Lb9gyI}Dz(37P=&!iMeFHcy`sdM{N8_?9L*{!dFVzlDP8B#n6jG&U8)08r;AEJOR7Z zJO=uT?U$7ZiwLL4a8avlQA-LY?Xdnm7DbFfiDn063#b}mENThtGrzCYPh_<;i*b}T zQcUvCvRVfJE`x`>{$@!I% zNiS?J^;Y2vU#J{0z?9xwR*onJ?T8YH2*tTL4ofRFsB{1#`HI7iQQV*`CbX~<)etYKkbA2Q{24(1>= z#$a!zehqUy%L`%GpnT;%E!$X!i$7ph6v6Qwf$Q2^MpkeXD_AG2NKm1IEwL<$aNelW z0KUdzrH4@=in96^NQ3NGWH`X`u|ib;%Eb-)_JG2!BbHSWEUT&mg4kQIRDVJRf4l!6 z=;2@cu<~%y&&Il_hLgSn6!t>wL#s(0;A)~pEM#~kMXKjRUTv#h$;hEq|9bGTNam{f z0&s>{`Qn%h!yU{71);GtKoDpFz_9D-)|3Xg{D6^(>e)<=JkH?_RWcitH`V(x{9Ts? z)>~x7wabFv*L0tMU6Ox|OmtcK*ZPeZwg_;eJT(yU@2&iMgro59RRmP}{aw!c_Z$3u zh7fpccCxB_U*L65Ypi5Ho?^z#~5d6CIsP`SfF#T`fK=iR< zZM8ber2uk1uGNA6NV(*C{F0#RkK=Fs@k@N!YOdA@2xxHtg zM;e?_HU;EZ3&e7o!oM6!$JoxH!SJS>lseI^q4K@N-)`BY&u-U0TKwI5bxT>LPNjdX za~J3Ca6B5opTlMGB&SK&3+FZN&O0t567H+O@N2?UA?n@Elsm3#;B-z3aXp(he0W=9FyshQbOk$ z`b#S*VJd&@EchWW7;p|=ur_6pw_@M#-4*+mrnoBpi&qTD=|gA5k9oz@MfIju!nawj zZ}nzP$HBiC3uYMn)t12VG+TC5plbra$@~{BHYS(VrV8-U*!ge$S-XY%wuj+Swiq8P zQw3^|$M73}s}(MCt^5pM81qGCC(EP>n>{zMMKGFBkFajx2rVXibsAa-+(B z(LiJJGImg4QAYbRb^z7rZ`ZUhW#{-Ne6WiJ+{fZrX?9 zO^QXkfspK{lmjsDBK0+>-zoiMpz8W*6_j#7Zj{q1A~8cntvvO`sPjhysJwkEns^Wo zQa?n|^yBT%X%7nk_9!3BmP({dhuA@!qVIx?`$sy2zrv^lJA@zn1=m6e{J-F? zU_bl@xnP9KO}n`RX)_&=&hiR|$rObOqM-XLU(#jy=Ff+(-}vBgnKBI4B*}GbLRE>8KH2-FfKKCF+H?uD!-fibF}t-%6sar6MJ4VQ>~|nX6c7eTe0+{ zK8?f8?LS(xzo|`X_e<^in*eHRSQt9@fEhNpn{LkD@XKkl)+_LbZ=-n$%X~}d?<%3u zb4oaJ+H9%?YwW;@G${BQbyDA?j?w_-N7abiRH;8s_PA+=Cn+0_$Wha5^QO<8AIdt4 z?2SpC8douQ?)LdF4Us0|k9TWqE@Ot#HakwvQ8R4gr;nd8-b!$fzA=02j~C3}Zyr)F z5$0ljmhCVCVdOTdb>-wqte?733#Dk>>+V9`zQTp<4Ty4Ol>ArX(fdjDj}aA{?8|7UP;AluovOacE3SOOzMFU~gtrDF3mf%+NQ=Be?tUtoR3c($Ky z2J1sVBW<2BMY}5Sb&vNmFThLfXzu?q{p4Flpi*0&0=dGAflqkLv|04lWLzP);O}Z=3O z$`Jh2!Ou`zDXI+o=4B(W8$dN#MQ|=R5st0cl5i&UcC{nv!k2Q{#J-` z4_@MV+GY+p10HX)uw1)Go$bYdWn*7zhdI9ZE9EeBjO1ci(nfVYl~uA)*#O)Q-sAr; zDD8RLw|2NMybFX?D~#Q{ponY>b^l%X6k6f3_b#=yQQ1HyRJ;82?^7UaB=K~`y!j$4 zAez*~zE!3JC?5a6Otbm2JBGE>0CZ5pV8+2sua8l&Dc>cfhb09;F5S`Qt2IbVD5+m8vxE$j<8 zJcq-tp9ix*!!f>Kf4vI(Nf!BX!p>vITJ5Y*v1QxZwfD8XgfZb9cN8@YR!0%wr#ER7 z3}YgHaip?dq&F{I#JbCRxHcdn+P5@H`2+ojjVA{@;(3ZRWdZF#n<@>!$j2B>1h5d4 zVBol>z#cx?U=L$cad}?MmKw1nd*PLJ3WC4Qq9HVye?OUTW*}c1TZAxb z9DD(rpdaeW3zo_LG(gY`LTWo7pYEX$_0TaJWYI=i1+ zY|gc*x(Em$K#oQLpqqn@H6y;iDj;4_Ecj?SD$tNqCf{N2bg5W`1&6YHcgj%jdR8jm zTA(bwcYo9%v|^R!aL@;q-+v*F+w!EFtocIRG2f<1;5KN7Wm+1Gtf;a88+kaD3b=@n zgk@A$JxV1FNKIBmM!uYf(6pK;P1pnIgiW-@2$+AUHP-MsRJg|a4O?OB5j?NpXB~c2 zvcsvrmZ?m^sIFtGO)2xb>)i-TuqFAA65i`qK@+LPQ+__06n|&)-t5{aV)8r^#Z7)<5$%=ssyz<+r4Rk{GGvaYo41JGXf+r(Caiuzh(X8w`A zWd>TZDZEkJ*cQl-cGy{e!fCWc0bJ>m&7kyp(zeR4Hnw;w{L$4}Ju@p%oC4sb2!{xI z1LWYQwQMsXcsCn&OE;x24fen5$&SJcMCBtuVHX)S{%e6+n4*&_uxO*w!||5zu~Fl{ zSU-COY?0$m2pJ%hQx!89m;iKV-^&)^HkvWmV!s3%Wj~7@wCeasG2>r2C$qv?(ZM1N zrVcT&!B6eYutOKKpJeJq#wXMdfgly_2u(dk0n7I6{=>ZW>j@J+vq_tmQ%iifE zo0@^dGv;Ug`q)^dWQ1j99@#poq`7mCxpQM}!(i!?HjnxC;J8C(6TlRc=wnOZ@95uV zi_qDyS#1bbz~rg|;G9Y+i?B<8OFLSFZz`9?-in9Ec2b)QrUAVu*4~^$^aAal;tZ#j zGK*JYz#%r6C+v&Y2D5lAMo{J`F|sDBFdPDSAUj$qvICn4?rnB&AVNlNB0A_gwCH0L zYf$~fh?8q-}T81!?SJ0mcx zHI0zAfnO}QOrj`lxwF4h&DxFIy;r8m_T!Um(je9gAF>AVFq^$W{mr;SmxLlv-iCLw zRl35Yg;p5uzk9Oc*rlhiaIrj(VcY5j_*oFEJH-ks?ul9Zwp}z|*xR{&y*8by;59(| zP3%4#lZAoMszTKjWHSj)#KHPGAVpoMr*vMafdFzgm|dyN(#HQ?eiv08|iDP6Z;Zp;^zpthWgXcky-4bZQ|D>Y1z)zd%pU~ zeCu$d_sTSGQo2ghAC8WNUeBUAls$456=#Uj0o}Sd2q*kr+;R@j54Zw{AmAqk^$h(8 zycR$nZ?Z~F>JRP}Z5=sl+1jO_uUwsb({@;nTWsALG#{r_&mJ&F*XY+as1nQBJzv34 z5GaK)8)C`^z;O@?S)MET0m#B0}&)-PYKZvFS(ubX%kORY1OS`2gvWeJTm{LV+N zfzo`qQOoJ*A^?G=i0S|i4>hsh2EszL1c5T6s6_A`K;+t^iHm43eovGhD6g1pOICt4?%pkE9DQQk zvOJw@ypC_Q^0Kh#DxOD~~#=*>@tjZU2M=`{zDp(6HoTx%`_5Oap~oL!laziyyI7qRV(l#5windJ+Hrre#>YMl zk#^Qcq@7Ghq)FEy)TEOs#oAe?SX0ZUBhQrP?sJREu#+weQlAYC-63 z18fz4k#<(;#b?lJHu$t%|E(lf-G{-8^8@drI(P3`9|)>PQ?(iCe- z1&>@)Dr88o>2EqE8{W*2XmgYRs+V8zSV4P!11pGh5F#B`qZC0MByc#!K}Q|fOzvs< zQwcx~QuJR5K=#y6nbWd7PXuaN($wc@>8sS|(9>rsbW8tJeGX&vEQL<_KBef(utFDv z4yUWp@i~4yDxH=uE$N52i`S{r@fGLQ>G%p(VZD)3Y9 zz#f#g9MlGSr& z1jnlsaOkM6*`>OzKBC(eLDa?D%@@+^9{K2Xchb@8(zvQVa_V&UHP6uLjJZ+@wv6j^ z=xCZc9iP_Mq|>QdT2c*|t=B8pKr!W2>iE#5C)O||&lGEXX#QidW(njsd%wG?MY#ET zwL0KVys`{`JVTl}A9cwy{ZWrZv)}NSX!aZFNHle$N1~}4GbGXUH=PmI!Ov8EqUVat z368zCKiECJrnghoJvZi4!7n6Q@rKt7cq(5y!c{t5o!^>IOJ_V9#Q99SqBCKO6 zY<|x1GD=%(y2opKb?11U{Uz=3dWW4#d*+njXbNXphbqgdN+Ka|HC2g@4gMXWQFGAw z0r(HUrJVq15ZUDL4^JWNI?Jw8=g#e{!QNn5qN+vMSa=}3ez|}G>MWQ5gZPkw>ET!*)IF7FbkkN%4;wa)ZH zU3w#vZKgdmu7SsI3~5Whfp2Lu*=GQKT!*?n z!sNb5RbsKiIkjOK1nY)jcJE*);P8wHu}1?DR4F-{`_QF_NNvq&0sDgRwUQka20CS- zMVzmWmNCm^L0B=shW8LWP!@63y%8f>3gGAgR=f!|>C!OHcDGV^V8Qxmw*Fwnr} zro#B{!AOMTcn{2MCT%V&;EU=nkWo~>^KBQZAM|%4Gl=TXlM>V~ z7EKe>?|IIR>BnFA@DV>8GncsD7&()i15T>JRK^exQD&fX0g{K>ar9+pBJ1 zKS!*yZ~({yc5=x2mn=LD$U3VElzM<0vtHE?v+nnu-Ifk$-C4zMRG|z+6)92c_k2+6 z;Fk5G*7Yx3sCE8@2er<>aG}=u=Wf)x{;?ai&cE=Y)}3FuQ0w|vZq&N+wik7*y!`^G zV*r&O`T*S@`UBnXr2%wDeg6vRo%N9W^qCj=5tKMMj0R#blsB=S9F z1O(}P-xmdm0$vyf30I9j3{nYjLm&NNkP4_*I0({n52G!p|`s*iS`&jOd_Bpd((oF?Ee1?N-`5_`ez_{Y)q2^{;=OP*voLT z3azLmaG1b$idqp1o5GRMHwna{#X#kyn&c%S;0?b4>1!b@S^q#r_X0B@& z5uld&{qqR)7vHafKuE*2N+jASAn?N;n|5sfdgHDcwq2Wgwr|(7=ZAjP|4wh*qilz$ zc!1KAf*(+DM(a1(8_UaYORP4zUraZ%^q_VxM7NsFENg`_2)d+V;>np`ef6DL`sd6#uw%Y$_H6;C!v@q= zr8w>ckz41$H=1%SVsUZlI?+)1!b}o__m0tjXx}5F41V$nQ4Br z@suVcVKE|d3Bhz3+UQsZ>*Ui3djOx@6B*g6P3_tVZBEs@v#ZbzfuE_2}il>L7|fdzk_L z!hS#ofDyE^p8-2Iuo6%4YzU2%vkslwfGYJ@p?Twx`I{R>WL_^J;KPnc6)pX&YI)kTn=` zE+0Ksva?m2q$iPRiS#5c-SY%bq&`w;y*z!swT#!=?`j~;gHO@~MIj0R^wj9CsLR37%!e~7hG39y7*34RM-m!K_k3KQc9}cr!t03Im zxa-$zp-B-xvn(AtPaGFxWlIBnC-{MTJpXYIXG#I}5_^YLvhM(+ke@6n%Vkkzw=BBg zFN^+#AWVQ9q=pcIToeufeJ<;pAu))m-v&B)&^F4|g>nUhWh)=hhZ0-0M!Ki3*?Z4e zv-i?ivnEBvc^k*c?91+ff`Lf+M^UJTk;V+(AR|?VYzB6g;s#g|QLsXW zNilmt1n{&X(_d5wpNX|5Htkr%T%^elzfXb$N+}L;v<1^~pt$ENA7xY=`mG%1e4M`!btq0cle*+Qk|1hR?H1RMq*I7XY}0OB%evx zcj8p5eGye#x2#rUZ_Bf(r!D}eScX-CFvkYjJq>Bk!6}jh)Vv6!&sd|!;VL!nvrTh0 zn)huS+^tv7zHNrv&Xg1$eRKHu&CtKf|H|HI)qdRA{;y&ZZeR{Te1tg|AOeRvM^N^J z0F8>jpP?C;s9EfxKG!O>zGI(E zZyP7Y#!ek-Zrp9%&I3Q}zxab~x2P4i1R`oH^~LN8TO=G3%Qov+yJBdbi*-oazH{E9 z)mBse>A1+BpbGR2Pj`XnAGjW-B8wzQ=GEpQ6c6~XguPZ6K`qEzw7|B6=jG16{Pt5a zg(A+u49zyysx87T5IA;w6NDe(!K1Cpl&;x|h43&zEjAG4cLkw3($(GIS%@dTH?V}QjDwkqc^3{S5qBVMj4 zfBQ70lD1qvyBo?|)b^@XoSNHtjE&Ef;3%4_Ps>cuQJ7p!x|?2;?*02FRkZI;Lmn)N zrhbSwgB>Xchz8a7qY;BhAAucm)(V|$^UcBeDlw}W;Vl9@OXFxPF#O=0AnVijS;#6I zIHzgW2xK{Lz}A~V3Db=Y*RlYD)*V?f?$}K3(r>~*@H#4BMvIW$@5=wWYeaHfULltg zT}1>Myu(95g1GGNA|iSVV#C{l&t6NPDbOP3)-Nl=`DFzdZP#Tb3%{%&VX(Ua7igZ| z0Fan0det*)5ds5G@7s6sWXt`LRa>>FUOj;yE=x2J+*BP(jh|dXk}vSU@;Rp@Xt;aq z)fB7DUS>71`-p%UM7#Rh`qmWQ-DNzr?&ChueMdFv-EsDu5j_210FuIvU$b@6PBYog z9scWD^W6n!+rIpXW_$@TRB;)N$epTTSdZ?u{mvHMl|Id6|J))Z$r9Y+i$p-%b&C|0 za;UGS&C=dXDVp6eliu#Q=QMoPbn345CqpVL9~tQhz!hDUEM!MS zS7-Lf28VEWgu;oSzRd~R-dIEqWkYapZyT#7n%rf1B+oQRo_J8LoqXvsr6iK=t6?6{ z)eNizs2Tc7SOo^Nf#9usRgI@v41_n}{}{;zaxzLtp=<)Iks`~+|1_=A3e%=nSzitf z2`b*9O#+)JBEVsjU|Qum*j`nal$zRV&uQhE8*WPd_j667?Fj1ArIc60)TNYL!(8P$ z9`)Yn=g@Rops$9Qf3+I4Z#|l!_uTses~Fh}8iHCME4h|yB`Xnx#kv-UNkfq4ETwA3 zRLfSYY_BA1(FIw^jYu--DeGX*{g6@S>)O!275!4t9?$ZfX;8NO`=80 z=hPj6!fcAl1MYlZ&=q(-+|PbV8)*^#)NR%CoRZ=bX<5ClaqCSXm-VJ9x89_z(Z}$GN)i2&544ear6-x5TRW~Ddgoj=u1xOU zrETM4dBsMPxq&NucoKWtEIp26#!5a0E*P6V1}@gny{X+BLbp@$QCWbHyBL~)yZN&Q zM@n|C0?Cp7I>0l3>c&aOIj35=X{yTkuzXDorYskN~>tWBX zM$>Y$YqER5(i<&qxZnfzY+>X;%5B)*tBU7m{s>FO-4vFJ4j_ie>9kb%4-LPP^U^^g zfou7*mVvgmHu1b%$|d`yuM@C8R0atjjC+>BM#Dl=ct* zV)^C!`QuW~BA7gvZT|vtQ-Oy(y~A_Iwwxspe(nOeK^8EAuoyx>qMia9B_bTQXG$TE ziwZn?(NZ;cseoDl@Q+*}VZ7imDP*(Txnheff!E=gy6pB$O^J@_ z4ufKyp18kT%q*xp_e@FmDNH;W|J7IA9^Skb~?+=QGH?yPnQjOOkvj|ur*bBQLqE==X3h25e2A5s3h-V@)s+4)du zR8$)E%%PHYvqkICyiXK|KUu%|VNzaXGHgd@*>AWF5Ro?QO zZs%nP)BOW%EZ`4mNOxU!7Eqf_2B>B$XD~0M#j%DIZ=5z%V7VumEO z>5#ec+^vBEdEwjT|E39AMcxGWq2e;CyRSUDVaC5rPUFn$9Tu%Lca6cV?6%Z^aUK3u z(k(S`EBm(SJmt}?HLtftjz8?*I3;anY=ZWn)XK~yZG>25TB9fc2O94_4@v9WF4!gu z{s#?XgVf(Vw_)G<&(nOT6)O_fiW0AL-)O4qB4(Vl%al+H$2M7~9wsT&(*m%eDSS z_v1<;IrZVDI`C;8Ps{Z9nQux-S{p9KQfa?jBX;ARoLVyQPOesgme6Ijcy7yBDL>^e z#Xi-YU*1BU_f|wsJg2*?sNdbyi{Ef>w5z(}{X`-E+A+!5ZLM>#Tv~&3@g@b z*9oK%(kx_%;Feg*q?fFp^S$U@^>o*FwB6-w+hN;^-l9n+^@^hmB<%!PI_ zk{{bU$E|jr+UE~HzS?Ye!8tZ*_qTrtN^ic%Xr|Bd^Q<^%Vpa4((R*R9tyYt@6KR{&$>lFIz-SoOvRe97v+&)EaTp@;dm^2B(RhTk970 znnVz?I^(K;%=ZB>y#a@OONLqc#Hp71A|pKKuk+0Zt~F}#ed#ORu(MbM`KA+u_>5-} zqVo*%jqWmh#@h>=>)vamaX;%a&iJ;9#_8+XjYonlCMymOm^Po_;%!U8WGB7OHL|{ zj9f8Vj919KPzA25gm1YF#Cx8bgBu9vxjB?Dzw5j?II6q$KVLcv5QUJ&(!oymxU`+t z3_z{)z6sskx0n=Fd#~Yl(*z8-uHnu?OzumpZy`#g>(cs|dx+6Y=LLt1LlHF=wx8nn z!>-oT_YLG$pQ~SDuIQJTFkE8#4)0->hVe^GsF`K)y~F@Uvf;wo0v!D0Y{YhwoeF;t zZW&ko%01RGtxG?g?+-nf{x@1VFa6FLzwSg-MpLnU&UUWxD-Xiac{BCJOyXv`tv0`z z;<}YZznOB(Wc-&LGnsgLy%RI(sID0)U+^QUTmlo7phPf0+hx!dPaZyG%20FDkJj(r z^X={nyKJx{4B^6IR)Q!clyBLoX64X)aDeCdVaMFX>tLJc8%+ZP)Z8$r+@*UmbmX!S znv)PJ0=6caZdF&ac*hq;mbqn5EE1hk)hiv-a-}KTyl>l& zaAY*P#Y-5Fx`aDvm$1_!w&eylU3Q_gQ#$S=z0Q<#&dOts%>YQi>8?xfVeOr?2VeO@ z!DWO`fO3($LA8QZ&iJiT5WIrP@24>zZZ!gvrPKt4@Sg%zHnQen0$l+wBN&oR9|)|H zkxV}e+H$}k`hckNCve(LQF8HDN2#CED1%ZgM4ht8NIM}ZjlR3`~+2UHcX)Vs=XyO&Ka*D%oU=19P^Z+4hv!zC5ouipRUHFiWcQhI;YHQU-fLQ3m ziRUp8&Ykt5FDW*+%g!BM@=~Rk+%upHQn=RiQd~zLR>-(&PSax@8ZT{mepjTEDlTqb zdu>s7B*D5Akpxa_El$Ogr+Fj+thI-HgzPvVw-(?Gd6Cgm#-%q0n1AOg%2;t}FPoPd z-Fwc_a}N>s3A5F`5Y}TTBiDq&!KY2=TLdk0+dl)qFMQI z;=a;fkEUpKA?LmUN=9*T_!Sa~FO=DR5J`^Ef}jQUWh3b?WWxO;>DeYpruq z?wC0E=F?E2P5n$pMt`gdV!$6l0=-7GE{a3jP9#B>_pFD4Q zs^|?D5CYK~K^;1|qc;E*aEIq`Qhz->=RROh2+u+41;2Ld2ng3?Nw;5NlaZTgo(@`Y zx8$_DCAZxzksjy)FMg1T>-@yJ;3MO}u)Y8Z8D6QJv)KO$Onq;6kIU=YFx9bN{J`QK zAdee7?ry<(7`pP(5Eept_rN~FH`7RnmnRf991H7o zbQ&I{t5+y54_cIN$2FSFB~EzEJsvBCbeqO<6_DN?F3+Fhzg!J%<8zUM(?n!k5D1x0h2S`!?DBLZ0UHkHhevY~H$+Ub6 zei{hi!A=-3SH7eb_T8>4g9rbcNh|+6wPaHYwPb~lTGH=XYRQThQ%hdgNFCrK)fSO1 ze6R+JS^`7pg!}ISz8er`*VnL6*m>o!H)^mQ9FaQYBLX2`O%TESZetzt;a)FDFZQ~c z0p(T4QvI|WM%*9usILef^~H1Qw(~}Pd0O%Vhf(nzd;)^D@T)z{ShzCIg}X}Fg!rc( z{_#&0yzx)&=A0)^GN2zT6TmYNLbJzVDXXvWRAC2^w!}q5ApJvupdvWwq#dYUy)|eD z_Hrr$_y+fao}jgp3qhwR@a%P;6YwS#c&#TO9Z*5g;(~8gW9R<;`3J%X=WN%7i|-Yy zF0?B!HE`ZnX}Wc< zM_0Y_IaRMbZq@6qu6pH!>Q&KS^~!l}Wie(qsE304;%F4QpBMkO{F|ctIgN>spP*KG|y*dVg9>u6BdhgpF&k+2d zw#je2s2Df#bfc1aIa{Y|cEYI{PbYaDi61GrKV@lk+q!76FlF|#$xC4FyR|>@9~**z zo3WzC27~%WS*7p7Dj{n)Qghv7(QJ$sh=Ge{qv(MRX}=x-mNH7ojI0aVk35MEw+eYj ztO;w9a>Ss9xh`cst-=J(2i@^J-ZGfv(r($^)Ga%gZp-d@TXy-yS~d|EIgcC23y}65 zL16aaz2ryluVCdY=4|if^xAtVb$fTG+uqCG_U?JH_OcrKQN4*nq&MKG?!}L4FGRW= zKdPPHQok+?rGl+phhRMHbbnEiKF)q5#--Ph#K_b=*$|m-R}$mAefci##X5t8d5vXh zYa|)3+#s8c6%m_Gi5?7R?YhXyqyFG-Wn=mGIjKfb@xaWlRs%%*UEH~4B`6e$vwW5~ zbXC7q4i`<@Yw3LI9_>iCLl?dM+4W-G$<8HX6N)v0Q#1l;lE%^mn%B(+%@;eNigc_P^URR@Nt@GZIlr9Ku(e#p&7F0Fa+ zqwHb^8QCb|N6+#w5uDwfLX{xoO&r1gbQ^+kK18!&^yuWVg)0tQFERttp3)v!my1O( zjBz+gU@Zs2HaoYb=j>bqibT9|d4GDHm%hOdQyMa(}a_A;5Q~@YsE7>ztdSs9y=U z*8<6(NZHQT&C4>?XuwQ1p1{0GAP2hi;d!XP7THv#wLqbJ&%$F!5G_?x>$v zHtnntchT`n?F{`=ivS@ce%3FwPAZcQNXw^FnfNxtvu$71>RY8RK5St(1|{VJ&>;uz z$sh4bCOFHX65 zG__N=QM&+0ws<7kooRr`JR!5*Fgk+OW1|^)3F{%t<0z_K=pp-fhmGZ1BQWz<&A&Ys zdiBCSNW?5xo0M5-uTD04x356?q7Qbh8CtGv z6Bf)Y#ecjNXEnKN*X>sS2MwUR_8QL?dBr`@*o#B$qp4jmA18!o6#oLq*yYM~wXyuF zMuQ_A_s&I@%VJ0wF>XlTnz>5s0)GL3wtYu({(`ySFX*U;@r?6?@jSi?{(?E+FA${V zH0LvDx>o8H>Y6L>`09oUH2gR%y#3!!F~uP^$rID$0ofLJUM##z?^l|C|37Zo2uB_- zh|?|kO~v^Ry#0T;DJaH)KzH{h)uCj*qlKx|*B}Or&C;h+V*lZml^m4jxJhh|MJ$un zOuGck`A3DQ&t96KH~s|8{{#Ey%755!!jrRi8D*=a?o$(0Re9wFe)J%wYo#vt*!J+7)9?>ISISMm7mwX@x{UI0=umYx8wP zO=ovqGM?2tCEVw#;OQ4vO4FG*X@TmQil_ryi5_4-+sZ*fbj~73|B9wk66&DM_xfC!KlO+ zM)V4b+{24>`z3w+l!Lh65`Ico6%gVtJ=%ZU5gg#=JxLATe+8X*ppQ!$ZfQ4yeh-&J zxBtzuqyK3L?3|K{AjvJI^j_@ZSU`+ZRVNlO9N`r=GrGQ|v%A$(vWGCkLx-MLc%Zvd z9vPIP-p3iOmmb=m%1CPjY|D5NN%2|=Qc_{|?f*qf@}VX4AsWFO0~J3>4`#~HkT|`z zn2HFR4R-ih5txb$56K6Xz<7^qHp$;L>tTrx4oT&%b#9tXGs^> z0_7H1AFh;56ij>@48BSI^+tsQES8fNyzC-%#Di~Tdtzdn9pP2mw5wl#Py4gHQD>c> zRSkE3h8V9suAr+Uu6oPBFy)}4WiS|nGP+2m?-ZkB28VdMDJG`q6cfE`^hyz(HFM2M zL}z`+qq6|F;v2;hsBvfk)&v~+#V)+W(R0$iRG#-KcS)p!9>~_($)4)kmw;5ftk5iP zzvd?FND+3|gcCw^-m#zo0#s$v+)r}LL;YZ5rim`L`$RBHmO3OR3cI7ac z8<2!6V@El?$2YncQFopr>NaMgAP=JM*GwR10^bTp)WLPT4CGAZIigPbB#wjXoW7C` zapzVQ=P`JDoL6M0asf4RKK{$Nf+QJ3z0of_=gL+!*+b-`7k82hT%pmr zRA>qgQWK4Df^HqpXtzF4?{jepdW zHS`1rJgvqa_%RBAbp@dUs2;QpmC=HDgL(o!_ibSNUF-C@$4(t)ZrpYKP8(HJGA*a% zP`7?su+;l-3x}1uP6e!LPp-=v*+S^D6>0zS6*FfovW_-3Y}>DSgU~`3Ym>=pqK_eu zkdwV0t4BjR0;%tsO58e|Nh>UY)9rUC=T#~cV%gHTt*u8Q{1y#wJ0uQ&D!m}k$7PAyjgE+VXw1UE{Wout2NHqa!VI| z#(qjrOQm)1l#V1Q<1NA}SvrxBk#W0`@a%Crl92AWDcQIWpD$wP8K<{zR)R7`4?cc@ zvrAf(pcd1*V@xyDnch!JsOk-$*+ks}A9rd&IlWX0NjYt^S5(ey;*yop zyi!U4%PUKtm&(ZSA1L+g;h$H^J^TnsUBl)LMRJherB3SF5G5B5K!L3krO(&`ha!v; z*(a(ZuuY<3g+o#>xn4k@Tzx)(^OL8`Y3KL$hBV)%)%sXu^-z)NN2AnE4{h^Mk$H*8 zHk{!B-#8cDVXS&v6&{4T*{`}|X;)W>uW1(tp%*ctbec|&*oC3NPb^{pdi{?&MqVsZ zf5#Ysdo+I5M_?fzf!dDE!WfbDQ8x>$yU4mb|E$aZ#0$Uh0iih2Vl?FH*YvX!*xaNZ0-QY4-dEYh3)%iD$r zfNs93rEL$b{I0yE z{3fvVBAcS+;epB%lsr6-fMV2+2>fOA4=7gz<1T!uBB-ibK|ba5dsg%MJzWJO>Doo- zRJ>H-LwMP#Qm=W*IX&@)rmh$TWir=_#)c?mjY=^!T41YSv(pA}IX6!k!2eW=Iidxv ztkKlX9aH?`?|i9mS$EXfQ1NBT@UXzRo#J{s_*PWLyGd0;(d$6l<+6g)C%7>hjl^qiyVK6iFfn44AP#cE2E zZUn)V+uVWGS-ioOPP!5O5XRlxwGuwd!0Mr~ZoVluv70XiKZxCUnF42gdGXcdPX(hF zz}Z@O0SM0oTg!`$!?8|YO-ctQrpTd!7=mmZn1~!IVJ>d@V1NM*A#CLU{1f>@ke9W) z_U9*}a$cP%P$kFzSa;>vD5G}K0RxTu6%Ly5zNS3qHM(WL=(P)TtedOmj1{Bo(~I#p zqxz-I@hKO`d3Ud#*F5ECi_k)5L%lS8zOFdTW|)iG!o`*TqUEZSwUL~NM5nw6bDf0V zGFH(1Ss3$}=M0{7M`@!?PUFDybXEtnpi#?dVLS>v`2q#nPo&}3RiZF0C#ZQm$kf4u z8LXbASZSMj)?QbZ&T9SH0VB0l`U_8z>&oh6ERruoX&bFjCW2&rA}v+EfM;!%QH#;_ zrs*Qk$vF`1u4IMI;a@OR%EHdVcR35cn0Dd2o>BNkcj4+#JNTeo`1F(&@l~q#;uTax zC+t1FZcr>@H4~3!Z|tQh#lL~_&P8+8FzP04Qk&SD%0L!o)e+erGyb~~(#K~<|9PB# z4!E70+oYlND7mQ&MXbBF4wUsXFq$(!S-%cMq$63a(V~R31}#|WYpjBqU1n|AU@eE1 zo!TJr;ANNr!miR=KiZZ!lRJ1R_Q8;%CyP+RofP{GL9x%-_tU4?FU%S~1jT+DIVDU* zflM6&ZqXZVWa^tKkf}rHVyeIs*;W2ti(?N(wfOW1?u9!)00%8WT*xv_zRg z>mf~pL+oEreo+gukJd9cWl0__(2}F_Cq|kA5*esz6TvAn3XW)B8f_gR_H2f3j|BBf zx#!C63^GVk$!O|@oElx|d+HT{Wj&vQm6Duz#Gouxy2k4U?qq078^kQ5XKP52C{zITUrieJ{YVRY&u1m zv+uq{Vw?uc^XUtdK$&7ORlyV=kYqn-ND84@BCWFPit&nMD8|Th3~FXQ&#{RP|9irp zLm6bW$u}L89*eN2W^tQdm|ZYXSco0Te3Aw6cUmN?!>OHPxLAv3$*xaLPk1Pa&K3d* zqa-5}jM~t}7Si8`E#wi<@_kdWg*5SF3uyw=TQ-*za(I@QE%F z|6mP_^aJRqe$vWuV1cXE=|BXy8kPYK%tS}mQhU`N8vqOQRK#}QuW~s1@EA?kFv*rH#~TB;~}R&@L1~ru-kRMq2;fRgSRc5hU0p0GPozu-uL1{~6Ta z5d3SRNC~rX7}ck(p&-;7t5r9$iseeP3Ljh557=182S!$5QMp@GF;uC};H&dG2R~O6tUR4vyb>J%7znVPZEz@@wFo76>X?KtU&4N3Q@Xa zVI|c|ekCa#oV>h9rgtEK7XsSTc!NdE8v^kHim^1fc`dA5ibB}0kU*DQ1sK#V&UaC% zQEQvxQ784{tD^2yxC*1@!x(VYMJeE-XNq9i{aA}(2cd59k9JVdD_i!TpR zV+5%=7z^?nGrHmGuBu_I?EmQ3^)R37I&2gvuIr9ZQ;Y+@AHi(#y6>clz?c48?g7e8 zvj$`Nx1mWfSpMsj+#$}zzl9a`E`F11@#k7<$b!zaz;FuydD?UB_h zb(+a;Jk4ajb4W88p{JQ-gCYAXQV+cs2BlVry&^Q;9*(Je+nBCTrygn#?CW1?sPYHJ zSEeD-Bjsb|V|ks@SWp5SJ+xj+#GMD0U7tref>>MaV;O+GISh)fQcsi~v4ZxBjx%Bx zNA_{7RLpyon&qyj)gzdESQWSA(9=y}1P%5U&rCPv`vQE3Sh0A?Cq2!x-j-eP9UC)Guk8LH$xKBzG0HOv(s>eJLW_SfbWJJ1NjMQ4y7H!nayCnx=I74u5Ig z1VUcX&dNEZn(`AjlWCc>5yD5x2*4gq%oq(N@DLJj?V+e(C0xlogvR5Dn~xCO>c!#6ILB(;Y{#dR$-7Tn3>mZ_tmVe{uLfse?Xk(abH>N1&?CR1UA z#eP6JA5v*6t1CuKY2Ch>xq9pEXQtRp!!X!gsf~O6sYPVP$yAL^)pd(eDWP>0XrHJ} zQ!XfdltVhdYf){OVETM4!oWUsLM`n9ICciu8JGBuJ;q)RkeO{}g~ty-%DJrOAw%Nh zKen+L+tFH~*e3fOvSGm|oJ6@Qt@{#ip z)BEB)zyiN>9ztmyV5Y|&RrGC~7=EhgixAi8p>_!C&W;Ol8pL%t9XuObnFCeS61bW- zCV2v%*m&&oIms1`rb>{6o_I+v$#iA30UqSZ5g~Un7B9KklLr-jGN@IN2leY$ln3>$ z&6LlrsCMT-*)Q6#{I4@U1f&{f`M%#Z=%+|h~}9=8)-6|h{VU6X@+qT zloN=KO_;@mClqZ$d0?-{RBg6R{+fLyvS{WR%Hqe`jC(;pCW9R4E;Bh~h=>>LfH0#BxvYjTj6AWE7x-i;i_)G;?4%P|c zK4zXUz&v5hH&2X*c>-VQG*9eM(GtuP1WBo*i>zQPRHlK(GZwBA8z{{iw+6+orpmolEKT_vx~x#WV^mXSFtbvX?@_Qsxj;PE z1^8@NWYuXYc|BZv@RV(VG5~rjm_uD;lHiU7I|js}B!3I%O#F&&*)_FW9IvWJJiq4k zU|&BU3%c{b!XL^X@RQdAe*aD9z#mw+((1@b2O2G_b&#B%>n4mp2*RGj%^$pdB??2_ z)=)Shmu6Fd8RP;=4))L&uVP^Fp;jW^ixbFpEs5!wzH&0NNe22Ozda4I13244T{L`1 z1Alo4^ba3tl1)Wpui`(_nEftmC93FF#j%2+!kd;=_zOVdXH1W))tLN&R&x!spIiVF zMAKZYf`PDIbq+DsIYbrqXgk=dZ&4q|Q5hNryC2~17sy(JWu2@8u^Gf3unl04>ay`e zoJEJdmy`B76*W@?2}M}-C6dybHI-ZQtnM%-z`3xZnSH`ESIMit#K!Y%{8E%8u0~tT z26>mNwu^BVMW8QLp$3C@Ob5TR%i=N0*=^T+`58wP*~w*XSv{899`)#Dl-b~o!<_g9 z)i|mM#$D{xchnlSy1qA0a`Y0>7DOFqT23!uw`9ENl`m))fVwYHGPJ|S3_~dK6E#4u zJVKd^(`2nZSAHO}raTklPM{!*+vV@cPeK$ii&DN5DM|^W$(VJe56>2{N=Sv#kClH4 zJz|MWi5*f>IQkmfWjb~pm z?{Xa)*O!LV(YJ^QU#1HCvbV6~%d;1#u$gS9W8urTi+NS8$2=0d&z)>z&4tOEhF?ae z^nCv7x$5YS8T^n1gNelB=6m|m_f{D`uk(P|H_D=@E|1rM!j)N3Gpo#Wux{2IF3GK^ zsglW4wH)&NgDRRSqi{r>;Z4BU)oA=u$q@S{ z2(lcurZWgK;Qb)Tom2-b$^Uf_WNBv*WL|j}lj58e6<+cySm3ftYC#s(H+2_kx)75J zQN|DKWgjVv@Rr?Una=d~g)#TfTzX$=l6$R@szYA7fKikK6c`O)(CW9mpyMoTLK$yEw@X z+eItdKy6$c$2g3^1f8|WY)0J`R(FvG;)g-p5(K1H3Z%1D5Yg`F%)G zsl8(-SknJ@ir?76DJrMx?c!9uot$dz_c_(uZ>X3Rh6gLALO$gWQD-D%Bj?_Gmx4kU z{jOw%Tsk8F+Kx)1JYBAfOgsaXrTMdL@feMU-z!cH@KX(mxo`7Ue9WNm--=W_GEu<# zjS2Fq(**g-?OhY(+iu@R?xQaD{|{ZiV}E>G2;n{ZqkS$w62!ojkKf_}57Ce0(??N( zUq!I_|E(THc)i2-C)o^+?P`N@163o3Gt;ykuwu;m`$XdwkMGn@w*74MWnpC?&K^edlmrx8!n_QmrJ;=Cc0UoI0?-Yc8*vBg|4;I+?ESM^MSu+!>tj4%EX=S@Lh+`Xs z(7Cm8voCqFQ80HRl)DTxy0eGdj9H-qt&(HJxCYINd}^bm0(lJD+q$MnsUj~B&m7%* zYr2ii6iO{^y7h#~P^%UFEH9(m8Yq3nqo!Ym*0D~GR>MDIvZ`kUo0)IuZ?NW7dh{C^ zf4|r`8iZ~DKLmu@g2W_=t32rwmcdF1tV=sqj8$aWCWM6IAL`Q9hQwzXR9v9?D`BJY z%%ONsL#@f+%`Iekj?92^mU9o*qX=v{pv+#+!M%EI0 zzRK8J{ZGJdjX;e;V{d}%44Ur*St5ZBP=+t9gEpfujW9lOY^P45a(p55q_?*0xs&~? zXU>F$*$ZuWB0*KD+~%{k4corg^!xpz6nf+A*uj@=lp!px8aA2P%=ftgAaV@0z(SyKnfM_>TkSUA!&$H6ChxhfwV$EMA)-ytiu zJcUDd9VgeKmP#!sa{EJ*)g$i#3lNN1cnODX3^)*HWJOb1l))kf%Adg}b*cI}1syHW z#O^F?H1c~wgVsu`sSQWRKql7kOHp+G(W1jUNo(G|fBYB}WXu$1w@#l{#|&}S63jYv zk@~YwIJOpHg|qo?h*2svEV)G~bMuT@^D`y%pNZZ_?#>-|#;krse+?MW37DUeTDgTk z{Yl-x^PiH~NS;+;9+9k?jV=h(^cG@d1lBYPd1T%@%U~1ONr8Qm#4+6XW!b%u8yivH{WH9=jqNeOa*cBPFE+Z(O2mVZ~WJDh|7DalzOVz2LBheWGrYo`h;f zwFcsq#t=5#@ta9qHLxH;4%;>YszxEZOT&rv%&a!^JxztuB)J;-Ded`*OC~N|YRZ|K zGbP6cO_rZhgD3x7^8116nU8LpFm8iH9fet)Q)i}`*-O@yg|a0{5{BVNe*B~%lZFg7 z4VscQHOmIgs~?5Jx%DJ+%oU^O=99ap%~&THYNe8RmC|J|O1+5uK7ndXffR2H;Je{=J#eX!FTUxG_VauzYK9}_W0%Le|b zSvkt>Pq!JP+)&UV9K#9IP=ei|l?TYN;#}l=T7c{PLMjo2ym#Sj96x4P_ie3LcrKtz z6qe^;kpR!f7n)X`FDa#1xE#jEj)-c^Jk2bfxj|K+VDql!)s7(e*MVN3jz&cZT6Nfk8Dv-r!Vw#%F`(?4TwmQZ#Z)D2)9|Gd zd&IL19@rj_g%U$*H-grR6=j)fcpO43`XL4-gj%eWexWj@cxu)Ii(zG*%}N{gGs-=b zA`!`B+c1AKyFK2iPV}m{x*uzz!7^=%pQr{UzFvi z%$qWA^1R6lCoP(^aCdKTuvvg^FAUL%Z4cf@7~SQ~url8{C!GAX#!WZ_HtJuvt3NEbboPmd)bm zDLX7uI&bWLTVBgycNPlgFU$QomdG13>namDCh)N`4(0eb^^D_dsb@)e0kKP5S&%L* ze_O$;Xd~yQoXe3LkE&R+#5U;TF5ek_xX^n7_(U%-DlI5OqoR228|?n$nym*uJL5?k zv67ql(Hll=7_z~WejhG3q zgC?vds{pxw0vpdFkXorR^w&fAA7`D}`J4Ii>5S@W-MZ8nEGb)gd1&5jk(R(B!c(g` z5*x!;8Bx2nO8vA|_MShyed~|&B>6NIc-04m9SaQS+jj2Pq_K(BqRPyJ7TeU7S^(aTv{6iuj<~&?e?hd?HfY6VMA3`OcO%SYW2r30VF1CV3U}5VKiS zVgw5q;z>&YI>_z8(gv;>_{Bg+Jv!_Q^fc9IvF~>ziyPKYoUle>Q}PBkpW8a8)3P9_ z#OrbM=1!SwR;nxBBGq^Z50>biHr7?1oFn@b$@WiDHA?lKIsed zz58?Losm!vs_CdIVTro3Id-B-Gv7I+^~~loGNuNty04ygE6K4}T|tk! zvj-;D`zGS5%9gNIV_iA5*|1!S+&E;*i0xy747J9o9P16FupC4I#@-f>KC(?!fD9^L zGap6?cCa_-WncEp1a9mp;-~u3!Cp3F z?-CU7NT3;Cf*Y#5n6fdeItlwsQkZtkik zYn%#sEfb5magu1DrMqj{wOO<_Idnv!wY zeN5~rP~z7L@qAiDrv!?>=wx)_t8!$)*@ZV}y<`E(^8Szl1$IYZ6>DJ91*&+KV;0w0 zAkKc^SW_q6vTvn!n!7MrO{a3;bz5uik{(-2Ud`X%df@Djn_8E#g$ZnIW%!=-y7Q36IOk3C5`0w} znEo{CqNQ{4AdzaF04?xcYs(9!412IZzMW1$1zO9b45BVFeDk(}ZY8rx8*Hd~lffzp zY*Kr$_{nUWNf}99ox~^w{w~q9o>F{4%O@gyjE4X-&xspueDD;kyiqxUt9HC1ietn>&QRRwevSp2@dcMvG8 z`r}Zi!VygTAFFwz1AM9KVAcZC4u^>kpX=1)wXkni9S<$=dP2?(t^5Q!+O0@gJ3uzb zKCCw6<4tTcAfpc)BYl91`_ooQ^}Pv-fj?pnExHb#Du4p7Vcl|AP7Dl;fs#RS!v?g{ zSPkR^=yGboQ0>%f^Xvd?#jz{_+NnmW`H+1wncBeb3W*G!(gI`ha}QQnFW5J4`p(YQR@FdZdAwwQKKrT<|H$ovOh3&d=Gs45vo>$lCfT`eeFAGjB%TM z9}Bn~yl7>J!u_!`BUwMVi7?OT)-{_;!}u?0GbeAM)_H^Y)V$IhA&Jwr;~P(}ziTG% zTb1A{Rj@(~E5zI@9DOiCVn}G&dKS2^Fq&;PRPISFWr2fKmi-VK(+Kn3A6rz1+&zh>hFvjf{;a>59fAUXsN&5c zRx{K0B_tMbjVv{&ig_Zn6qye3v|z&ST!)dZ;O%Ib9kk(5OeYywXKbznm1Fj>Uqwou z>F{f7w$4SLO#A@l<12+KA&}gne9(_P;{XM$Ou80 ztF>5RE1;ry5fv!Dmax7L$#3QL->IO9lE5AWpp^1dKtKRXVg+u7l3!2c(>6Y1<+>Eb zphDna2Jz2KYiv~CgZY*}`}FCZvsho_?Ha|3Mbv;g)c8>T!lQ7t<9F|$Kk)~-olgoc zUo9zEa?YoUY%r%z2plgrr!iXj3g+_=NXQV`n<6@ssqQ1hAIC7uSr%&sjMazqI+pc> zJuM0@pB8dELYn>36n^rI$y27zoD3tv@EM3kW)bFc)wiF6eFnLe8h!_5hd=c<&yb&q ztU$zd;2-V1pP}N@-HT-4Xv#;kf|6nB0IJ2z106%CqA&7&4=4_HWDaG1K`o7a9bHue zBl;b{9sg+^?wU*&Sj!Zl?1<#vnKssk`f`wIE8aT)8|h4tq%bhn2>#e1Xg<8chMIpc zH`}KZ+xE+z=xN--O2*U)XZ|ME6uYGm5K|E{Z9aR;2JMa{&Y7`j*6e9ula>c&wy4w# zrY7HtCx1V^asTyg(mfgk(Yf-Ey|(Nz{jh)6g$sL|*RUD4)NS1?q?yf-=h2r|_`(Zs z4_i*z#%0vp;xSnKJZ~;Xz4_1Wb2;Naw))j#u|jT>`wtH8y?LwQo-*NSO{3H|?f&%D zd#{3RryPEOeU6$4$GEROEf%A4o8rAaw{E)Ls{lLAR`h7kpeDZb1MU6u)eBYFyfVt| z7}P?Sep9K^0RHCmqX+Jr?;dShJ)wKYka`mHNNQDM9uudu4Wyo%`3v8yC(SV%3Ev;O zu1;M&R+@aF3Z9CoGqcQWIQAjy#ZB>kE(V;oCp*YHy}~vnNek zfX|*ry^IeWfyhTWfUhvVexq=6+4{TB{rK&=7e^)XIJxEQC=xw4vR>_kxE>vuTRj`& z>olmubSCH;!r^5+96rWHu&FX<*o;pULH=HJeeYh(Qf;ymMW-= zY;ha|6P?JW;>K7?65f3bCX%6A`GNWvWW^*J`>G{CI#GrVT4~2Vr`mEGkh^Ls3tpI- zHlQKKm2_9`4UL}DjmC4{{-fk+qGW*zZCZydXM_A~5f^9aw;^Bdh&0Pg7ppr5=)M^YQ*}(=%)iLbp$fb=gEdlFH_EDe^O$ zYKvsG*CEI9#*S)4K(fF*_tz&+Odg#BjWhv;TY<5{h`>m-rvOz=Qwmno`p`R8rVdof zcw>}(t-XYJbAKI`eC-{DD$cc|qMM!~tqu1`yZif_wiWUSQ7Oq*v*n6KDNL)_B01*f z^|?96B?=UVwTu`YrJ4{`B6Xfl!vx)nPQo7A0tjp)i)b2Jsd=yO4oY$)t6X}xaJE~G zO?bQ_9CHF#V`q<<*c>LR^5E2_tE+85?l(qNU2;D2i5bMw8>Zdq^qeiBu?n~i#)Go% z2bNE#x|*AgVOqyp#5Jy_x*V&*AEAvLOXgD;4h{Ij>RDYLLqK6#z6-0XmYi+N(m59E zI*Y-*{T$Whj}s0J_+<4gi9e>E#qs%VZl-ij@y-#c6W^S{&AlU-Q@BDTVWVMFW>YQM zK()1Uv^-aQbnC{mXSXVbhDJpfEgE(Gk%l}6#$PY4XZn!(Nv5Qn1}mG`;BBD8f)xhR)pOnV9~*qi{QdF8-|Sa&G2#ZAf?1dQ zW?#!7#!BanAm@$M_8+wN=g#YSKd9Ghxh`8gM!B?wfgh8I)1c(!b@i!i2lqzpV<`8+i+6-cn!k`8;fafU%pB@7X!;d$#0Ht6_z>&fbiBZ!YB9G9Zx06~m ziFlS+OhNekApWL2f_wk&6Vx(%iK}p3iNZ66hxuw5 zZg~He`T=cubpqr(|98&bd-T75D;{O!oKWZ2G5XKbg0IVeRGs@Lc=X-bRa#R4J1SsD z$uQ!Iax;-u(}DOSPrBZ z?c>F^g1j2Y5}ZEj%|gwa06#y9w<}u5H&jWa&Up&!EZ7y<|MmZ>W&{ec3_RKF^^@{W z5iCb{;V6ZxsJsCS=ah!5nauOGSpo-%H3LjsO;(#juBsoXHYX=S(#+#eQvybeO17Of z2vX~$wYMaPNVljnLQ&5nSmivs#X8e1b`ew}|2c|tXtXF|kLNnS(qL$YTIcP^t=Pl< z1sEwhB|329`AAOz`l2`rC)>6V;>~s zZ$Y^bnbc0}7{3o~Ky& zm|~$~?<(IB*RJW)Zl`4I-g^JO9%sx{;%Dd`(j?H>vQY~E>(pT0tW zj*3)I^VHr;E4Ox3RAXg|Gx&yg=GkZRRE~AQQJJcq8n@)cAwh|d z5NkmiR8>!j5Ptn2#?^u_?8kVjEm1j-s?GP_xUpl;rE5EyRj8QJBvzvDlxUF}q10g` z;Q2I*2cyRt`dnVFrO$C9Lgxxo$79t~+rY-SZl7~_YvoU!cRTYCHF0+wpJ!u_0U&SA z-!`@mjoJ68kF%++mS`P&j7YV2n_KU^KgiVtv=nM!6C$9FP67(+2Z9L0O)Wt{02%t1Z$TH z4@mx#Nj+QEGsk8E1(Y$vJD_w4u!(7Ed5I@eR&GCLRzH;sqG%1p+B3Bd51fb;otMd? zG3S_tt5jA)Ry#bMtrotVh(M9z@LC&(pW=|~AXKIBOf#{194lmIg{s32I}z;jH|l#O z@E&Y3zfqId@51i^#>qZlpFV-|IRpAqK6qkcRERkw@zx)c@E(Suq1_r;PkXfTGMtDv zPn^7QJ?UhHsN}@xipLXg;h|Ku@j_^(kOthp2(_1}mAB)fNahy^93XR%$50npLOy}C zYkpCjED{y+NX*=E{P>QYCr|9iOiIqoOnTkW+i6!D_=cXS=}KW1>V_QT@S#9bax8(m z6b34!uJJOqOm_3dI)5dn(^r`4hw4IKI(+EjrIg&bDk*7kRS&0Lmh7GUFCW6S)Z8j> zt{HnPL;R^Bm@+p|I6$h#aYA;(j;3eW(T)?&)P;rBn~T+DR>nXr?L(6^@-Gyxm5Z@# z@i6~ze+JMz z=e+$E68{33Zyr~CR5&m01ikk_^X(J6&|pR91MkA(Utm*x!MVekj2%v3Gv4lSXJc0Y zxQcr|;4-8}y7CVJ*ZH;zAW9$rL<#)I0OB0dT=m5O^~C_^=1t*AGxf(yRLD$)evD(9 zsS+pzHD`b`(CBfn$`xVFZO#ejexl-?|-`uTbt5$6i2TDIP zcaHR1FWr4%BJUEHS@G0{qegbge^tdaN-1C(68{F%95gn4HT2e zo=D!15qEfy_pkR=t#Q}`h+f`dWkAOZ{u&MqOc-?$_ix^`Z{Oy&jT^OTm!95c;{n?Q z2;|fZ{u4BuW5akCjGT7P3rw#u11owoGLq{%ONj(x1liDD*%Ap3=P<&G^|K8X+ozp35zs7|H0IRi;1_4SK2HKhp zos8U!{qSGjV9qyG&0==`ORE)RJ$+|(oIRAKihZ^Kh z39h-Oq-wQXT!VVx+8BO(BPW7BwcI4|yBV5#?8BWG(Y)72C# zSZLB$5&lJcpunobCRX5`Zv}c#m;ddzzFq#e-->G#^1<4utvx_4<^QFza)ed*n(nGq z=vg_|o*Rq>+ngG4UyfRG zi*aBr)l+4?d|3QxD>#-Yv+)v@_ysoG*DO{0dge;4fR}M+8!J&7#@mJxw0V!GtlSKi zN`)0}4ViN2qOVfKu@ZIz9}6ETvMD_Kn%&{xC;47qNE&mKrP51hb-F=Fo`Aq8S0fnr z3bm0^4j(k~Hv=}_yo||!JF~L^gy39!`}I)D7Sq6QE?!Fs7XBVc#)jFO%ttqOZ_&C< zo1}r#Ef>i+fA_hGd`e$rVHxRTM|82ZWHM9R$PWiF9=-G$7~>9s z>m^aCAVQ0OTV=+vNG)B9)KWc#2IO`=7jcIk!{=nTFZ+e|7?(}5c-(oH#W%KAlG*)_ zFoaIb1S$;6>_rzrW!T>}MM_i6+n9@?JQRh$iL4pe&tmzkYcXo}QP%aZje$C=eD6Pa znNBYiS$$WJZ)YEyyDXx4KG=N!yw#J``=9T^XmuB!d%FwO&QZuLSTl`cRX&3+rS6Y+ zr=g)b4MpEF@Xsbn6R9)y$NJeD&4)L2Z`H12`?>?98zHdpZ~pPd6B88(KhHv&HyJyk zo0Fq(1W@YNgM48hZezUZsN^wl)!q?%q5XdZmrTfTonU<~FO=-rruIaev32)JJ?Hjc z;;C*NB@=up8x6j6u9Erh*;2KI*9`J`Y-=b){}=vPZKejT(ZMp*$7?wCd4PC6bxMd8w2$Hvn5lJSWuqY!`c zp>vLual^+?(c$=U84@YpO1JoW?y-WeaV*cjtt zl^SfqUfQH(eU%!b+ROzsQz0d-TGhj8Hzhg6|K?#_OUbQ(rmMYe8Xmh&Y3U7fq@4cu zypiIoVtd8jUQ3GNtCFhrs)(r0UmQgYrwCs~q8NmMRf0@ZR*4fSRmnq}#Kws8 z)~sE!ZsfX=i#v?!JhDrttWKYG{48tTXKOr9uypb9mGh4tRXJb0c$N6j(97{pT(emN z;;#pd)Z}8@L(`Bcp5$+?8QQi}$E=#|I!v3@O=5yD=9^vPc9^N+Zzsw9*V?(vFiko} z&^?xemM+4Hk}&I~HE;>8t^FJmzH86y`AFPd7?M-(3Ej={Ex$XkXYKAYJDieJEq(|j zC$GpBb)!s7|7%q$=~{SoZ?SaxUAq7+fM;39u^D_BY%g`@fLQ3bh9TW22B~5h_%qUZ zIu3_)7yftNhwd>&d(3%z2#*ZixIK%{OJm1HghjkQf7_grtTtE9B6Jeb3>1gQRX53Z z?kkQ4+VW1E_LZwG+Kp%I#r@gq^F26sy^#5K(Jef@gx{{Zg)i}e*uqimet4%ZkbH<$Pp4iyNd=Lt;9_Dimz>p*g~Bgm zEPg^^Fl^`&mV{!UnoFswmNl^mg@6<{&E9H0wz+%D)~(tm50q{)Hp@2e2*dJf|wH!YN5bE8#3jJ$=127L8KGz5y0& z=TdJ{*9L(F;m{a^r3r^_7^k%9&C-NY#o^EaIiap4#i&qc;X_rh!_J3KKn!0ryF>R( zbA@)$_{O>54xaJgQ)2kX)4yB04}kak8VFV{zymKtn_V~x|9V_Mdi>f?^^ZqaY>-?j z=18&&Nm=*;PpHWg4QutBGM;0c1w4qqa}$a^uKZ2aKdgKODE0U|6^NIfc%-%2bTD`G zrrg}kZPOaHZIkL+LGBpfI)uz;C`H3M!AxJ2ByDXAzgC>TZo`rd!!`_G+HQEq5gprS zwO`nN!JrKb)_b02LqyU&xC1W$ukhQd?XpY+^I~2P%9Bo7YA-7S)gq|20}m5fO8&+z zN##3J`2#f4R|y1KO2GtW)vyR?Xef_pn2~DAXydl^%4w0L$1f>Tov*m;j+n3FLts^l zHY4~$`lJ|(QK#!XrfV-ay(c-$o1$I(9i~g|0e)hU?{qhyLPzA83Um$s zV+Tc@9h{*d&i1j(7eInpfMbkt1C_AwMb(!7a1Fi6dqeO0m!WUSA3DUeSFmbc+P~xU z>Bc+a;?gr~*WQvtazx$Pe+ejzFhxE zrAqZ1RH<^b!A}w?a$%9m;FHTZ>4Al>Pf;K_Q(uz{TtHAX?nem-?cX4xNC8yV^LgsP zrsgl#e|`h;HXB5O+gAtIORiC=&%4p*???=a+Kaut+7EQ&aW)0}3ywy_2>eA0{87!Y6Xlh}3h31p_!Gv% zXj-jh*kqg4Z^fMRWK*__SC1UNa;3rH$}tU6Vq=e_K+l}wf6a9*rn2kW)%^7grq2)3 z*BX`wemn-!GwW;NgTzmhf}Yr4gBTWCv;hLZiAu%atzeTDqaeu zGU_RowKVsAL$Bm7L+sndFoH7qB|oW`?1lO`zJQ5lNt81gqF-~F8n3F$7up4X@ zLRZ)e+GJcd%t>h8vK)}G2C!A)e?a{p*r@F>K3~GZEcZoR7>^jI@v1%o64p$VX@8H1 zr>I1{#9Jc%`)hjqUQ_CVfjl;IwS&Mew0B_izi6ujfTC0nD&>nbtC4aob-yWkivXF; z3ayIjfi~Rf)or!GPp8qO>M2g1qWa+jliM-A_8gAe0bk;Q{^DFi?KkI>Uxc6ZzwUQCB8X9<(22e2hYwKG0gW~+P>vPr*UpIV7`{A8NbnY;? zm+l$nQUj3e z(n)ZOmJVShPz;AZF>U3#16Y9H5b6Jh;JUi_MMW%cx=`sYk_40maVe|P+Zl@c|K33m zm1;pH57Gc<2QW*{0ezo?V$()d38(#)lLK1bpbs56V9pk$~z z^4w`FS7GEEe)}o}0|&Wv&h5cCQIgC0U)+al>A2Pu*Y@C= zYq^7H$y3+`T#8LT$m1#`x{E2fK+F&p52syKsjbKB4|cs02VIgE4R}j!A$yg>gp?EH zAu!p)J#PTV=0Y3I2IMc+e|`htjCd?8Su@v5t{zIE2Mx{8u;1a9U4e2`3It68C=mML z!LVz@3kUcA_+!KU)vBg7u3kO2F+MTY|6(q#rR}d;ts$-*Y?g!tS>(2~abUv^!q66d;hNn&>iI$G#pGpMKfO|Ien zKQtJL_K-%;*%*8uKrPeF2#oXm+MOq9KiLYq^l zFXa4+kOWK?0eT6rF6&t~M+?;@GOOe^l$q62q-b448?l>j{Hg+CMeOF@eHxm>J3Ur+ z^Ey_fVmLAdQbm5-v~RxKZ#JI!?YmE)1byAvjBPYVqf|tqUJ9@X{vun*Bcua#eE|qM zBxomHx2mTIzXy7SlnOU=PK`~=AMWcGjDOogE*iiBIp4+tjd}CMGhi3@(a;SD_VyGk=jBh>|I`qj z1woF^hy9EhNrI>A>lz`<0FNQj^a<2l7(5s=)c5L`u&xylC8I1W_9pWyDB z#Ann@MF>Zsnum7T==pjPIqQpEdO`jY%*^%1_v+oyT&~$;7K-|atZ?NLaQvqTe#f*` zUt#ZDda(Hu3d`R+{@~14l9xv9837WZo8UsC_8TsOSuy7;(acbym9U}H_?q>dogO`J zTSf+P-j^$8Z#VB-IlOcG)_uBVOJ^gvtBZcTaNYDv#e+;}*?i2h?_LxhVg|=auxCA zty?c7d#vzB)Xl;nkrje%d9gys&rvUIC^Oj*J_5q>!Att}&&uj=W8VmH#`J;wSz0~9 zU>Igo?`JLP-!K0@ijCI8nuk&Cfi_kR{%`%V2KDc^BHZpW#dFjgr-y&ST%1H^-9~ z;)1S0N1;6@-6wGsc~76=Ii3ysg_ezxzzsEgIeUhUB8#xtCCO$(r?rkNpVQT~yi#hn z(0{q(_%d4Zxu;^w^;%d!H@SeGy69*c{uU@e(+U){y18+@xZkLWaCg(VrMdNSyW{pi zlcq`6wAV~=*SPcU72QX;?{Yt{_0rbSexdzE`_M!3sNyl!Bim!L$1INn9=~(ZTpZVo zo5h{xC-FbJ(E3Gdj9UE^NR9H_Db^_>b1e^PhFs{ zny!;>zHX6jjqaA-P4A%>^pd`)zLdU*wWb5xY4-H&&|)nucTieze#>m{pR>B z@LT5hjo)U!=b|W95M#vzv9&l*oGi{0mx-&yqvFrvU4PzR@9*PZ-M@){Yya;4S^gvZ zXZbJiKk5HxfO|lpfFc2<0-^)r0ulmJ0@4H82aFC_7_c;8U%v_=nP!_-nf96vnogUpnVy5V(_csqUPc<(!uQ%^9e{a5KzH5GI(OL>wM2lo8VJTyY zvcy^vEUA{3mX4Ngmfn^@mf@DkmIaotE$b{>EITYmEaxm&EcY$XEOx7#m9y%sMr)w8 zsI{y$)>_A!YHez5Ywc?7Z5?18VjX9lVO?ZhVO?+CVcl!ZwH|}6{`VrR!VF3IjHk$X z&tFognP$N>9Mh>nOXiITgb?V*630pN?K7?-i3>6}w__*S4~Syv!(KoTOGo6`1;mEe zg|AQZ9X9>X_8Lg${E3dLT0fF)Qx9r8A3m(3g4ej&8+4O(+lul1Gs zMNIH*@Q!40h)wgmPU29TUMy@ih^*41lGL%ejnZ3k&-?FaU(Xa1*$C*_CvNApel|9d zXU&%&yQGf3G9wK@W01Fw6jkyr>###&jkj{l{mUlnkD0FA+z*+;^IS$8Ml>8`ZZN|8 z1UBEy<{@>0m1RhJF+}ZcN?swpq!r|HERRqA{k_E2PwDsf5?lZ7Ol;i%&vhum0^wdC zUjihg19kWvmdSXk_JRem4#3r~+NmM1Ex|a8(CQAbkVof1Z^vvv2WYPh>U! z3186_R4R=0C&=r#l*8Kb%oc)uXT=8xx z?Ly2$I!>83Tw<++35!lmT4>gbdC_vH-H3cUM%ieOrhcztGOUgmOn8P>UN6Wsz@;pf z+rcqn8ZA`fC5)q=h~ygRzcNO2nq5G6O>MSO!i-=j+mO-eaX8`xOP7vd(GuH(z*7&} zfPJ@CS+6E6W~XJijaNJN7%Pxwf>T|Zx*2WC^}AO6RwUn&yNFa=8HK_p(}YO_5i>rH zY09&5X4Viw_a|USMj^RGQN$FPAJ%0YlKDXIG`1^igTz$dn34Fg8ylu@$Sv3vxvHMf zIb=g=NJrI48iJHu2n$?oWA8q%O!n;&hYQu@6h*u(c|mkMHo-hmr$CO73vof!)#^%otpe&3@QL{ z;FS`|_9BY;FL$OyzFzUnyNPYE{E$sR(^-{} zxlwluAstX?6d>%@x3mbOm+u4yl{Dv;7b?w4&gn^DI$KvJ0)%u2)w$ zn#WUT`%2Y6woBehRpiji@0O6HSSuatWu-LT-xUu$YDMixd|@_Rp$*hxr^H6^72C$Q zWys8fATsQ{8sntp_Us!1-A0{-c5F9zzMz^VYTAbIkLok8GpvRg`9xH|=9DZ6l`GFL zKfjT5X7az-fO$!k5HvA_V@rlYImfdM6Z~i+AYfzzl8as=@v<$4XN68sSOrQj4|c>O z%hQv>EF4q?g-{~qJbg+f&3V~*!$js4d*J@PleRYYo>eSg0)dnzYG0=qo81aj+gv~_r4>A? zT0G)k`OyAXk6FFyroQ79(%@txvC&Z-TgtP^uMVpv4L3Osa}2WVI-J5VHd#IW91l@h zD~;z3iFV`(|41f!D!BOGJ9+2_*_6+og8y@*h?L2b@YgK#?FA}w2|4JisX6HNr2#4R zL0_=BpuzsDk)L?oKQTl?&G(P|E%oqBs}ACzn*8$p)X_5}#*YijxK{<_*oR^cpZsFY zH@1b@L%R>{*S}{_+r~&u)u3Ys&oQ)6SOdQzs=jik=TBr<{|5|@omnZ!7lT0|OTpi{ znN9w3rWjqPZd7EQlQ(XDfAaRNQ;7&GM*f3N(}j!s_FO){uX$pFE-jH=p@0o3dKYsn z(q5aA6`#cdh_=Wf>b`L9ZPFmsG(xW3Q4gdeV%EG_vQ6*MQKs^J4ln20o8mdd!eq+l zh6u{#ypEi{Ba#OGgK|F;tbj7OiBT=<8}~4(t^TivpJGXMy8fXfY!ltP9$FvzXXU$R z{lz&8?e_(S4FVrf9dm79HOtlM*`T>JnEwLK-cVd7=ehH3l{Kn8ap%{2RvbZ`b^XZl z4N}U*rfxko8mtD-s!fMWh=Dqp4HThMy~jwhLPhr4c?@S*%LP=Q#e$F60v0WfcH0~i z*t}QSNC;4^64uGP(q+<5RH62t7^C$sb^k6sy1o?1)xBefu3V{isBF39)Y#bLsdqsN zPwC_y^gR-cpy*3ecsy@~-n|*yB(X~jxq;^JRR2X7s|h*PtrSa^*leuTdw~vrb*=_k z2-g{IT0FjesAE%I>F2+-%Dv>pN-sg5m(WqC|HHo4KgOz$0blozlwNwdN>`PR?S)TK zrW{Ji?I^t-Fd4k!F0$k=k&CLoiA{(^LbBqlc-5aN*=85mm^{QyAEh`XDcg+gj_-Qc z%ju)eUi!Sq?rJ|SA5Q$EJFmu8hE)qg2@t;K18@f6XYP}yv|7F=D&s(QA1Gs$sdR^3 zlNW(LYZiWaU80gg|5Tq`HGb4bjeW61zqR zls=LH+04J#XBG70|Ci#i_(T}V^CJxO|APhbpJ{0U$Y1DbvZEjvSg7o7^G|kfeYS4h z`0>kZR8N@Iy6f}|GaJWz!%=lE7!)&uY71Dgxp^DGB2pGolxPt5oP_}I(>D7?HZO0H zz?wiR34qYj6>t|oO;o_?0e^Y29j8{*(?mVe!37qgNE{@?gE=EbS9#HgF5IjO*H;L=*$^5{&E~H|oe}Clp`00M&@K7k3k!moWWnmYT z#8%G0N9B8nQsjI1B+~k!cc{K2a$(BNoaGolR*dn(N{qbH9}Esy@%$2xu#dgx9t5fL zfua+4?wI}A*T@YbWDm@mIMAHh@!MSzT-~aVmsgpP%c%zqgDCbGV$yIh+Pss|e!S@O zY14C%zodR<@04Uyv1_#nbS2utMIfi36(2SdY-9n@rUpphRuC4m5%^J$sgj<4lPAOd z-TLedm4Tqev(m?() zjb5S-&r5+7sZkzKoB9;lPkJ1Ja?wbMHoU~#Sx6$%&;wyS1VTuqNjAO0}A-(+Fc%ZpnsUqICJ_(_0O97n>n% zq{_OM#W?-{v3dFb))V-R<>0m1K-J)XU^e)`XyCFLd|)wfnG5uAO{ihj-@TW3Dy($f zI%Ug!um3;u4^tMD(-}BB(yWbOQLs9!0s*K42DkAbiqxH7erY2KW(qo&!rY{Am(;dw zC~8w6&83=Ms5qg|E|L zt3O(=W1c&7;_IqplxY>=N+tlYeL-FllC>^$rj@>ycU_gW@7u3C%THy!`jv}JuhXrR zxk`0Tev?G*mDW2Ej7z) z#+nJpRCGh6ruZMJ1eLxt)WW5S6|H*zY%8X{R;DUV406?<*8f+(H9h^%QHQV)J$Tsn zbENB&)$R&jNkEK;wn{Z-K(cFDKy4r8dr@x5uZR518_r+T#p_wy2&?{ouoeC_3@OXX ztlUsk*;uaIYkgZNUc9{7S|yHbI{4;MIKENOAwvonQI1=L^uCN!PxUSCPJ-4n;kYzTv74qCUq8px+Ndr0^}vP$%^^ls!HGga{jAk}FSC*X52*-$%#k zshRF#IQL}z(X)34yArGC`o-vohD6J8)l7--hw1cWhuuz$KG26|J+9h{aar0tNGjz$9y&y zGd&HdK^*g-hBN$O#ZEv4MNaSh&rAK!Spfh#IQ_o;Kb}wDucwXhOiAiYW$KV#qIxA+ z<;Sd(8I?r)qTgL?mA<-;9aYuS$n}{cKr?-dqxr(C2sK4=3&Eit4L4pu&y+YcV-h`UEvK5XUQ(Te=nee6rH|`&H!8}vX)d!C-3oxBUE+J7a+l! z0NqyD00LB%NX;3G#MULDezj3+&jop(DqVTQ_9|7HwWyo4I}NfruBnFHF_AG-qb-u zn}hc1^gPok*ExXhx8m$&t7opEx_~5$y}P`T8nS~H4tckc*u@||J$d@~hl!_)6{}mj zWQp%kFzu^v^kCl0Lv+i*oKAqrnaWrp-jCu8 zO|ckzGF9#QZd=}oPeqs$ydhFl(65~SwRy)k13Go<-yQJyhm#{Zx^j2;kzT#1lKb*vIV zu!UI}^_Y0GS^s{i9liJ}oAtD> zRv^;y1{D=K{8Zt199aQgt6+7 z04EAa+nb`W15e0W<%H~ki~`QoKYEp__Tlv$+r{f8RuY@Nx)p`NL3v(USF8Zv@v}%? z*8yNaVbU>;Uk$#;3(tGH`McTNio2C@ ztKb&rR?DqE+QB&8s=1EE>bQ=@hq;cSey-z$FI~s`p01=>7Gf`WXGW0=5E?1!4+3DVSjhGsGC? zdspy|^-l1f;Jw8AjQ15EKc5hvXrDNr8a|2e(Mb2n^y%u;+h?H9FrP6#6MUxm%<)<1 zv&?6O&v!l>e75=Q@yYc$?sLZHLZQGyB@3k#$}Y67(67Fcz8Ss~eCPRIGa@UvaiH;2 z<0RurKX<=sezp9P{W|&$^Bd#0&+oe59noDZD`tqJ{C)k82KWZ_4p<(rE?`T*(ZJ$? zk%8&(xmXgoF7SAeTM!>qAjm(cbI|gjUGS~A8T6~Esi~u>yQ!}!%QV9DscDjFhH0KD z$F$tE(zM33$+W|?&ve*y(sb5z$#mUx$E-8^nah|X;a!nsUSZy5K5o8aerEBp6t~o{ z)VGYXY_ROIT(Nps6RmTs2W-){zBX_`QhRBd^rf^)%9Z{I_6fEHmkrJc&I&$U*sXBf z|Hs~Wz*$iwkH6>5nCK?wpXVn$K!{(v4J z2g)6w9wLGu;F4}ZaFM-*+ml7@|F>&qUVgi8mmuEn=6$-SUr&eX>Rer2Rj*UMJL?Ur zH>KX&^**V$z25G6ne}q&pIiU_`s3)0= z8m0)QD5e;uIHm-qB&IZ`4CZ3}lywQ_Qp{zT%Q07AuEbo0>4dpjKV^51Q4?22vFbz`#QxsDSQyfzQQxa1OQyNnSQx;PWQyxHWKP;v>{6w`=2L+xRwJ-^E!cbtY)%B56T#+Ou=xzwdp(1-FY>-Sld!pI%@M(hKZIWhB_ocvGD5rnoou zmbCinO@zs{24V*3jKFTag4U27_(30}MH~nm;GL}x+Rv(r_Hw;P)wJ%{ivrv9t+bto zX*-VwGW0dX`Y^DE_g+1ln0FGh7%}f8=AD7V`>h~no z4|E?=evBTS6|BcN&_Z7pJX60A*!Ssu zK)WAk_uKvTRv_MBj|TD&^jiBv-b;9!UQ(CbTIi&t5S1GBE80p1qW0sok6RFufA&%mzDE!Au9RGLb&DLw`<;rC#~x z6C;xnJVptYCdGlNtrgVP6k;zT_IuRUZ1UVsZOta7h2UZYDRn2M5u`MN+S-_)w&nxR z!@yIY@|)Tkm$bHm3Mcd`c57E>*3#scW3>I-9^eZm$K}p1!Yi{Uns|6%JI4VFz-hQ zJCyPc*OMv7M#_zi8)!0sW(|xKgHj~_Q$TgFkvcb|G<=91-Q%cZV8spPMU12xX*~+q; zstT$FxnzTbOmOf4I9Nk&i@?Dua!j{o>7C@72`;vRi&f;FP3|kmeG<9nko!z>e-B)2 z1A>F#Vw*tGMIcGHdl0^--b5XL3SKgRESq{ZxXGZNH-Vq^K)RlKHqh?0$MF3FRv7bm ze@L9gz`R5+0Y58)O?5i>*$8g-tLoM;{YPsA{dlDQ3LGs5>a9SW3AAH@_8`#a+77+4 zC^#xc>UHp|hr1EE+ylPu<$G`Z7#Dyd0|-pc8RTke2_Fuo=d*tuu9&vdQrS79`<(I}rhFerUzh|Yr&6xz_|Xq2*G9^- zm-1|tmgm-cF6B5Nb>0~my3^Lp{L&kDe_$VuS+19=CZu|pR1Ma)(z>!qc?&78k-D0t z_mX;s*SfZn%Rw)ftzc{w*!qxMOi$ZDPCLQY23l99hoKw~L+ij$4j4KJhRoQN1BTLp zVlTbU)T!xd>0l?*>uH%DCboM$!0iX+tP!d-&}Pw^egV?mKx$f#>1kV~t=9zSo%!FL znZe8u{efsGecvr>Cb-Q>($h+k?oP0fOWJ!$cfBb+rTvBUvq?Xb^v$?}R0qLnt_n~q z+rZ!)fys^_*l3U~O50(K0XF=Ii~e zFYjjru9i>O1S#1|p>_EFtWa_1X%oJ*vY4aytFp}6In3H?n6*F0XA^VEI_8qEnM-n+ zOZEoLyxX1L+>?6fO}+F17p4{TXEs}|H>e=7b1eRmLYDOiV_`9T-r`>->3tg5#VRX< zw0_WQNN+3Y<=D&Ba8-&>BMG%Au!FVNZf5lKHe-|a&tJ4Y9pHSI^I*(9&$Y%i~KsxO^lXjg! zsor8%=*EcGkG-~Gb6iW-9bk8!Q`1vo-Wj8o*zrSx-)Gy zd1nIsI8}t$xe{}dtaDaV1G$7WW8hYxV|FIYAbKtH2{m_^T02aw9Tt3yW*#d+9Ulfh z)33iIRJJvV6sOX|vdP1Yv7IS}J4WWxQwPzOhS5{qHC7HGb13&Ogg9twfm%0vt-sMr z1`=uzvsZLzcYbz5%~TEfI*`(TFF8L+ADBo>cW2Lg0_9ZYzz)3txEBC-E^sfPwpMs+ zlr=J|y0!HSwUsNgY9rpAfV!vD`D7UbdaI`1>d9a;2dvDam1eLCco$r)0p_M)_I`W$ zuV1ScDyVlW2a|>=f?*}3ieZXlN?=N2N?}T4%3#W3%3;c5Dqt#NDq$*PSZS)Nm};2n zm>QUxm|B?Hm^zrc7*<%SKBfVtA*KhC*dLp3p zj78f?c_S%jlkyf)KIqkXF7=&GeWz2`>CE(*jEn|`sf@uj>8%$3a+say55zWW$Egy^ zK>aZ34kW#7Z@sjD^-?zJ9wt;Kz0Qp8h90m~%G(8~y6Z1J2s3F92kF)Op&;e3JIZ0L zlf}wp7kjilz)%Wk%{Vwnk5NU*eKPr&75+>+po$m>Xp1?tKeO^&BNV@T3Ezb94ao6B z@N<~lw)6EfS#kAeUoniCx(N6%qrx6SnR>{Sm49#QV;JM4DQCKr=rz{DjL<60>ZfX0 z19=Z(bnWhqyuDQ^nR!1YwQN#b79eC`42xsi zDS3WIp6Rp;liFDFdPL@JL(4Jso-H*uQh!Pc>7Eb-Uj0{E&OS41*^cTU<*LRA)S3N67v_iV zx+U#=CUrB3mNb*Poyj_CrnH#-?nm>zu)Y<^A+F7vRNL#f{-hN=BwdJ6yE1LIJ#8BXKdK_e1>EUQSG~^Zsh2ywF<3v7c2|%7h?5~NPL+qEm*b|6djo1%Uf=o(au>2FLpk2TjrjIyJ1Nk_;%9)^- zI+OH|&I{mTzMk(a7QB2ysy|YqAHeloQb{M3Lun4Fr0Kn+G>Vi)sS?gmpd3rS6Z8U7 z*z3%YRJH(P7O@YTnj-WOLLcGk^H9DHBgWI@IZkgP)++MeK+IjvH1I!zZ}asQVAxCw z8I;o0&o)ZA26%oT#Y2?z2TJ+_B|Sjud!4QL9i|=Sl9Q#s0LD$gxRP9dB-bBRX=gCF zeux?!N~-J-$Tfo;50Kj|Qr<$!Ka;Y-ok?jgshCn80ege>v&78y;6CKReS{Q_0QZ+3 z+$N=Q&OB0C3_L4&ucqXm>6b|Ph*z&iNPQEqqT7S|wDcSgm&;Wta@j~ON62NV)XZ4m zn?UN5@H4eCgB~!Sn5LzgHukmtSydwR5kec7GQi~_V(cQuw^Ficgqi^?^LZ}@S1V~( zt1+K}%g=eQ(LYIBbL({%upBV;s){=g(awkJf0JUSz%ZYXD{0gJpf!*$Slt6wp|=rg zANl_bMzaX{oyk{Ol!duWU>nDGQ;L<;LlONQvA!ei!TKG_x`hy1yx2bh=_DY_kQz+!(6U(ztxcI#vmHE!x; zKd`?GR%!35j@LTPIIs*TOzT_>w3|q&4&{25*4UNYdxFtknBMvmQqLsiZRES2d`*20nZUIV`6?sZ5znH10K^>3?_auJr``1 zp%wLHWa_P71zUsZ)kA@AhW<0~f6KU8MnA*%E_}b06f*JsM%oEjrWSfpK7(P?4o$E8 z2YIYzUNI@{5{PC{bD!xS2-}m^*~`=jW+mn`^7#iGAw@`k4JjQWr7uWnIr$uNRuSSK zv^~qDE%qTs&I!`yk1*nuq2+Z2i#_#N;=V!LhsiUY8re&}D``c0!Cg8nb}zB!fRO`W zWEUkfdCVg1DfBUS_Q)jWAz~gN<`={=Bj7GC)-GawL9AWG+Ck-CZVBVli(^wBEMnSevYGte_c1QbSyOZ6;?r!(6@3HT-d)dA1K6YQbpWWYn z*nY$wY7es?vxnOw?9uiZd#wGe{hU3?{=lARe`qhZm)J{f=rZErVwU+Xtrw7dd5| z>zx~&o1CuB?M`>6htt#P<@9z2I}bWTou{19&eP6VXRb^KT z-%RYhpVE1Mmanzp8T*AZMx|HiH}yRI|MYS_Q%~UEVV$dU^d>`5fjV@Sy_6mhPyy=f zELO2gp>6U{_}W_0lFv}*^6z4Pmg=hp<9=SfKqhoaH(6cSlXbPavdX>1x`h?*yVhr_ zbYNlNBUL8wm%uVrHn2SKsVWEm*BX4j3~W&4;R4%4e+tkG4DPb5*7Py>)ihiQ%p!4* zKA`^{?WvdQy^K@xfa{nikx#6jo)#0y`5i{t+=yUC&UP*s#RKZY@>NwA3u(qfw`C)h05j5*?I=V`{?Y0fmp;l<8k zM(nM`E>8UN))>p|rzcnw!1Qz0b71`?>m}T;Td(8)ru8Q7x2?BTz%FH%Vy9int^|F) zncWO`3%doWk8nmXrjB+-GvbeN#;}H%>`cZz)0v6?%g)QVXF0PN0RvrznEL5@`)vvt zOWnc2GTl$FqmI77-boE?((mY}bbWoD?yet#y7FJ~=r#IT%_+A2QSZVP*Sb!YLIUSr z>SSj$Jd6yS$4C2_e>yuhWPF&D(MNyF?m-??+TYWoH|7Pc-aw7Oy^yG`@``t|ext{5 zvUD;*r=Qfb!0gpXdtjIzl8q+ipk^q=ti6TdI@c79n<7f-rJf24oV zuTiS?se?wTHl!Z6H*LFFjj7Rq2r%`hf$OBXOj_mCRmfjf}l&p`Xv9ax9AUb9sPXr5GU%3 zKE&$dfZM7HnPp8(3>1%W!Kb$_uzNVONj=^?)*{OSv zzC}Mlj4S;AzujA3t>^2Zz*3Nr_9y*OB*glDZEo_MxTk|;RX?Q+6Yo~fN)oq%+2cn1 zk_0>c-teCn=<)Vw1&UMnz|{CVw3+Mlb=U{>SJ7Ulk_M(z)iudN%Y+K)O0iap@N6M=(W%tR_d=X z#{Q09j=#PqY*pP5`=N07-^xWRdxukPm48bQL#TH|_aZ$_-yHsW{9MUKr05)V376gg zwL9WrEoRnZ33@9l0$QT}V?^NJ$Qg~*Fc68L4u6ey=@;}l(LTrHpMKS>n)GVZXZAL{%=$3;N!It>Q1Fb# zJm#b*_F;bHE|l?QZ1{j#cMv1T94{2JWonOJL40_37@@LcuXm-sG91%VG82dL;0?qyJx|UtVtA$$aG|f?^jBf0kdf`mgM{K86Kw?QNw-c3ipP>>7T;*I4WF1$1xWC`(}S_==QtxEZiZ= zzsWQaJ*ptUkn%}!zG+tLw9JpNU&DAaR6$B2*kHanF;9Wkv>A*s5%duaKN_=ehLrig zZB6^liNQZ@WEH#jOh&r*7~$SwT)Ix*>E(Efiwz1M#3`O96 z%DnAZr+=){8ts6klEI}r(rma^h3zJyIn8y|Hr=# z4F|rVPu(xHfJ6FWcr~WShYb6W+d)>j2MN8DyS0UQ%v@_8M$OM%mv6I{ewbgx4%h!; z-n7#QT3h&wfmcs;S0!NV5OcWUhVn`k4tM-qv1c**Cx0!Jcb?`{3`*BZcmYFC*=XC+!Iz?~bh%442N*iH+YV`O-G z+qeG8G}1pmH~k?;|1(jjf>5}k;}>*H_t(E>4VL#4Ua|Ob5`_mBS&To-O|tihp=K4H zgF#o<9TVl}`nlsMdz)o`m`K{Q?-zRCAg;8~|0suvsXryH1@K=ce4=;vg#3ze;re8u z6DE<5C;OT&^d-px#qcTw-EfA=3*4UyMdBXHa3B=l3laKX0EZr2fWQ(|-{Qvb-vx~y z8(t5F#_&L_@6rEvPl%GG!~FRR>yi!0zDN7JJB++Xz33RJ{R{8xlZDrxCHwN<>K`75 zPL2|qQ!JN5)8`wE9v@sN852L0lQO6>o)0q?RExb`v7C6>=*1nJ|98NF1Jf=JNRO#Gz96g;QWo zJcT{=_(vNOy2+~rr6B5sVCk>=o1@M9Xyg0)Q~w>G9(U$LPXw(wlls-h6|?Ebrvu z2opND%xjelr~9M)SVt#nqk0THU@QH#1-TY#y{+HSUnGN6sA|tA`x^EaN~1SJ7(O=W zanne5aX5r=nK>kM8W#O2-+#~}64YZ}(R4fatN%_OHrzAyAMyxwneMA+m=MB09K(AD z{kv`QxP|{x&~x8peIg7&JV!wITk0-%_bGH>PE%5kck+Z}{{7{6LgV+#tC9q$|K13t53 z{qp*++jBC^IdXLU!VTuB#+3}`m5|=f8 zHxf?4clqTu{}at*ez+6+c2@z3=?ST?>*Mz+smCo$dG+{$-UKU5F2^U1%zAP{1UGDr zF z@$i~k1W2MjW)Jg_>>U!%hvp^%`F*Hg@-r+vebvNdW&Uv@>W80t02I4$q2_uOmk%=v=1W`3o~jb4i!!%b(cH7>&dY*MC^Z)qULPf=M3|6V1{Nd zgIN%oab<oS@qx*B)*PP{rm@@;8&Ecl`XryOQ`k*y(v3MgBWJOr(#;A-Fx# zFV@X2F~{tX^gm+1;Kz)U|D*pA8;*1NJ=_u86YKA$< zm<5W6JR9id@Tz9#-|xdRSyIV@6;r-#DV1~z6DA*yJ2Ze$-q0De$-%TFBYP@7H}C#o ziZq7!_{n^tM_?BM6E;;DNt8iK;M2(@u955)I$e)!k&&U2L6pcp8cT^n6wD9#SKlU% zVfc9ye>w5Kemh_l6xB+O9unbKzU%1IITk5U7kiMueH72}mLG+by>Zbrd;_fMk%n8? zNY99WbQ@-decWPh<9{QSHS*h#Dwl0ICb^8`w(r#;A30GVwHSU~*(0vgckr8|R)s<* zNYjaukh(GqF2wd?b!jU|$PayN{~ZkqmyT$oMuAzFqm=M!L6= z>+Q<)HWIyG5=q|MJjvV%<#Kxxxs5dLSXtbzByL{@_b8-r8yVb2`nJg3Myj?ePurEH zoxdb)BS+iF&`u;ldowb$jRb8YJKL3;J&;m9$|>LL{3=k|QmPguzE#zu)VCvj`VQ+3 z#ht&feZ}(aEp>3(J)mK$R+PUcUaW(s(+ouwEdDLiHu|}$9$UJ`*Da=Mn zavda}PegL{Bx{mtB(jo=g0t7q^=4!xH$dw7Hq{RNO;YzD-F&k;2MOojsWXvrzC#T_ z&iO9Y3t8tGsuS|gcdM(BdA>)X`4~NH{gHkCgX)6(^Zn{hWT5}3{(v0x1F9#o(6iOq z;Jv6Ch&1$y>Ru$GS5cQE5xtRWPd#*07f~0T)P2ZC?}Coh?&u}D5gF+{RBz;@-=jJr zEB#(|9`e$Ascy(j@2ze}YIhxLFhI*Z+E~aijRM%3!%hYAaR$s3AAzyv1x{|uCqHd#Ea`pq^SM`yuej`$( zZ*p!jdKH|mswtAzZ%4mLcc;6mip2FEsyb5Fd#aj9Uhjo8>)z-jsEh>m!N|9M(0LG< z)I*)2>J+50KZR}zBbmA`GTFzf#v+-zn8>7VNV}S+`qH*ms+*9|zDo5$O8aN(LL{|+ zuFgkV`#;njNNoR7-GJ2gwW>Li+t;ZMNN@jI-GT)7_3Acfv$I*9MLXQ0TGJNORd?Fs z4t2Vd>*T6SXqT4iOxrA?TBH?4vU^M9ZU4wVua&wKO8V)ln@CZ=Ky^?T;Wo0=uT__* z`*0hH>KCX7)iB(TsY%#Iy84xBGSdFLsW;SoY$Iv?0<}l&#ckxRU!ZoSOaiBU_F5UBi1AM7-{0It!J!fkQzST8jo%IOh6=y z+tOPC)+^R4o_z7v(q{r9U)&Zs?^j!&TWi$a)|b{V>Kf};ORKvOJ71I@QY=tb-5n?& zsDRxVJ)E}(ng-h9K09zWcDul3>W;wWfqsPS9~g*xP+$=5`vb#pKN@&i-5eMjm`Lw> zJ}?=3N??KNDl+A75t;J0icI+%MW*~MB2)e*ktu(5;9L6eHGwUGE#$H_uvIk*qzBT` zZ?!G34GoIh1KU;2z|O!FdDBL2YwFxN*Eo`=)^+>fNEmfc2IS;)9fNDXcxCj z;x@9_PqRzgWpJ0Z%i>?oE|0r{T>-a|(eBul?aH{T+EwwdZr8xBW!J{8YuCkYU^l>S zXg4HGWAs0E7Mbp+*{9g2;BIa=$2Ria9lNF73U_P!G{%lLb{ln#eY$-H?lbK(aksV4 z!hN<)E!ges_PEcn&rx^S=h_``o3ZI``$GFdMx2Z6iy3R~w(myMq#23I+E3U|s5|W^ z?I*F#D08Ph!JeRs*^}+b>J)p5J(cljnmrBobbGogY0t1;?8h z^7_dB2>UPgB78ovKUK}`753j$Y5VW?O5CgLRk&B%U*O(oXQ=D!oM2F$9&~~gR0%Xh zR8!r8HG(yi(G^h(yH2nUcH>}URXo@#*hZxVPY<4fyKS&7_F2KR@i`~hRb3XmC3w4P z7rZ0bU0oRL5$uEezTkc8>|o#EXxw9h6Yzg7I2HGc!FRCd1m9(>d@uMH+>3*&uvZ87 z6XwTY7Vduq|Ajj{cm(&)PMYfE6md$c_D)%+r8>uH<(#I@b=o**Gk&#m&Qa$%=Q@|D zdd{UzCq}xfoom$b=grxbJiB!~cHgetbqaBh(qrNM|HEUPd{iu+8{eUNi$#kny*?Gu4@jztInH zhK$AKML$3V=QZbT)z105^LIx1FPty1cR9Nl+4nj7m=%6-epDTu0}dJzoqsw1!YA9w z#^<1Oh*9|8&cB&Oa-1Br)cnW!5AL6wpKu>>epM|U4WX}cS|BZeZKnm%T2?Hrm}-~y zeA@Hs4=Qj|H^yak(>GmjXB>Uo>=jt^E#tQizV44%lXim>W*a==k3l6J$C*$!{14*4 z0!fA|;DLLD-$C}+w%NmT0$BTkGpr}T<{teLT(wiU8Pi)ol^VFn2J*Q7@(&M9+wA1Fsfz5$ z9)w3GlY8@{*cD~M&+!eMYoFozg#F&0{L}is9OC~<%M90X?5^@S@6#HFb57zajuxQ* zqK6T2Uu<#0^i==cCYswSHhlPh9545|;cv-ZP)4?*ORG5AgMWAZ-*2CO&*Y}=j^rgh z>Mw0mIDu*i_eB*Z_%RZ2=BT*#8TmcVT_e&b6<)o_@QK~5J(h6W*|g8s zpcnpNVDc%=iDR5RzN~DdJqkz2Ce~9gC8OWP!kj`&i;ZG5q(wfJBL9Tk4HrqXQ-pwXVh5XL6FD% z9_Cr{q5bXO(KmY%^&?i+D`Vk|zYh{Rt*OWuk(86VaP5;Dd$#~VaZ-Ma`SA_j+3dzR z4S{>+BQ$}W&bh)~WZ0!}mK|G?7%pIoZ(O)|pr?KPEh~JDC-p(U0rX;J2tsycz6kjMmCG4bZ8buSXY;v}3p% zB2zJ=D(T8d<;Nq&8YFeB1DcP0zZ3f=_kD3tAD3~6oEB65`&ALCjnUG$O4Eu?cej>Ew}8qVaI7nHsvw~!h}Nzsj4f65rzka`Wt4F;QEU}Cub z!cegv6)rb_mG6H!QIgi!dt^%A<1Kl&RJD8<{I?m+nL!V7dS;||n>#KC;UqIpaa9WY zOtZIE=c#72g2w!KBwaJ-n)Lm&UHu>hqYO7yr-7p>w9g8v8tKgq-Gwlz?`I|(=Z;9R z7&K6r{M|QpDU${cB~}X`khBn^ARZ%Q+=uXuf&qOq}$egN1{)u%P+Cbv_>9HXr|LYdW zR~MvRxqW@_rX}!T%PzU{XD_LL7=Ko;|A z=Nj`CvnY)1yi+RJ`04e|X!>W=eRF}vaPl`~UvR6RH`rXr__`$rxaBy&Hm6 z!a^WF61}#^2YSSB`2h1FF&p&1=vAc|KM$z5y}6J5R3VL~U8NdJ!ue8jLy-!;P6$Ok zfes%->@6}F>od4{8lvsw4MxG*rnK`P zOxfb+kC*@n|FXMS>W-i8XJGqJ!hk2Cr(Wj4%(*f8zxJ_D`e$lj7Os7!kak1*N%R@^ z{uEku3JD*dAYpBo%$0M!S;(J_^D#%@`Ib6{UhI&U%@cP<2|U zwo)FG?s#bU4>H=0@g?8OyK;d_#2R0h)g7VIZo{l({Cv>BMY`O=)MrCqyh0aamH*G! zTi=Avgfg{|vT-UviOQ;*c_ZyuRVEEnGY>Ks7$YvAYGM3&DnPel7_xj&TM$hj+-ka?&E*;{}=duVMGjrnWPW1 z-w4{=ddBvdv_GNMQ6_ITbfcLuUr&(sfSw|1{d-p;i!Z&ygz_W-iLNuDM;TuFN8#)k zgM9b7NJJFrDut88smtqoJV>sFL*ymNuanH$V>t6VRW||l)$w|UIIr5uDq~yZ`BD7J z#7#Lr8+teN0{2N(HZy!{TcR-uo{rD?(M#a?J0#%L_8@fEmvzi35M#t^aDn7_z!z7w zsq;&`e+ruHjF5X3bJ1(&AK3h}>&xnClK9XfIF0fs_($D7-NaL{X+N`Rd!~IZWBs`} zQ53Iz&H+NdeXheDr8U$&`Jxpz<;yxoByMrgK1Z9G#PGxNTZ3zPqV)6g)7SdzR#sW# z+;Nf>+ThjWkk_IVrgprL=uh-LI^m?xB)`}a87+=+P- znqr30I1GGS6J^CHv=80H>yUW!B_rV?Hw-SRF%t(ous`CxK{2P8u@s+aw4RG`-H91M zYu&)RkgX#jRHl!}2_A1FePAbfl5_Z>ZDvD%I2bj4#;jh$p^v=_cs87%_W3^NR6j8G znOT^J@y2K#u4wk<=JXmn*VsIapROa`2Hr#7JQ#UCx0iX~M^g^ua{Swkl`0J)K97R> zFg87anS?!nv&^S}A{&$Ly^TAYQEQF9l$GDNtisG)w|Qn3FzXtVoAj=|vh!y?RrT;$ zLCct@KVa>0n`o7PjkdazHk1`9T|9M2bzMeCAR*;8K+&6bwr*%vN=S9Q5&n}7+(G*b zE75h~Q%}Ba1l||nO?gDtpAsM6XHw5MG9>4cll=emzGp@W%r2#(vobWxDIn* zrVe`S+>&}sLNdRdBu|R8G&w8UX=>dwU83QKzf;UvD9$np53GtHagenf1$O0 zwD(EV-=o2b{uds*qW#@}?waN3F_b9n->09*ira8v&%5}qBgyD(fM4%3ME`q{7NL`_>#_f&_J#f`F zpAtM*;&;BfG2)By$@{sFyf=n}$Y~rfK_fNwvpxI;myHB4|1t2#K4W4%3iZEHM67co z+zFk!J5ZW->aUk>jt)jE-9Rhzc1ymzT+yh+KFEC%)tj_g+B_)>CCUq$(kr}MByZMA z`cIM3!mTeh-&iVL?8#_kD#yw#^Z4h$$ht1kBmMTEX>qhr({B9-x`#Z?q%~IXz13~5 z%iI6>`ylT#xtSBq%R-@>gBbNqQb%7<>HK?%R~u zJbc-VZOk4|a(r#?TSa_!;crqWv>(Hb7j4JZnWW6v7ouvu>xLH^=3e~2#T!2_z8-Css$u33$5r2TvKEZVS3SBoPe1XNmRQ}^^7M5 zy1f2+yF&>Q=}sEQjFE<`#yoQRHivgN`D=VcPPE~x4c*O_wqd^e{ofCp_)VRd9JVC> znu;&|ow+4hUrHr~6A?yg+8+_UT9$Tc+U8#cf;4(ZcGUhzylH{%&ORZSk#oKqAW`o~ z7&T8%S;MtXtq$`{=mdP!54)Mj>6uwGO_u*ju;#AN3kFuf`+JJ%o7Ks0{+O{zDD38) zXjFIi@3mQfZi`w6wG_}Ra-LZa(==2NZ(Nnxg40adXJzuWBEQ!3)Mnxe1<%*fl=*0Y zABr=pS6w&U5bV>SNE-=!_nLMur&)10Wt7Sd)gY%?gfnBUfk+A8$AjW>d*!L#EK-s6 z^OtauY{oDb`cz>PGW>-4nkkw8lX*yJ4CG=S|MbxGCNbtzb_;wb8^WWe8&X1tR)!&% zBT6J|n~#YfTEQo*v2b!pT>hSblyQ4TRG$1G&d&deWaGqr10|@ZHI%ogMk* z_`1!BxL#)Rb@K_~lNvO&D5u;zk$jXGpWdiTI3H#YpVDGJ!{3yY*5jofa``@~yuH;7 zK|Opf!nH#1`3kOqobwwDe-)Wl2%l(iG$BvaBeQ|6aeT!8Dsm~j&8?5j6jj(nEDq4>RDhFCx3j%EeZLKxPb)IN_iOlA2k@k!X z=D+~t5T73yXkTDo6c~Xd-Kl|*$jALlV0&<}Q`)wWcYB?ElaV8f?BD>hw2hqYpvc)y zV{dQ?Bl@MPH+SXw@U6JW*)Az^wo8kg?b0G=yDoCJXTZfb6Ijb5ZTk)EH<7tr8kyT) zlfruSt*WdxBY(T1$ltCi^0zCB{O#&0#|o;NB89uQNa3!H6z-;~uGP$Hsp?y;thTt% zvf3dxyS>#>H5Q57O+_O2DI$@(xk%&=h(zw9B9XhINXBj>lCj$&8GEB@Y4C;2?Hx$T zZY5H(TZ@$J(~y!~LA41~3{+I7gU2S=O#>~}83vokpf^&o+aM+T9@RE*Z=kO_E6@*F z*=w-;I2?U9xJK2q#I2+UXK1{NSU`y7#*-9hALpC@v&&lkDb z9Yk(+N91OIt6GV~?6%ZaYa}P1hScbeNR2)n_Zdiy?ugWA@L->X)acWZ8r=?ed!$C6 zE>ffG+UMEl>1`N^k>{NxrQKiL-f$;Cu|awXc|>#BwG2GWe{A^SW)3v8us zk+wKp+F}ur`957_zIPOv@6)9%7Lm3%UGx}SCoOWiw8(BE`F*-*Hn?8ozfTwW??t5j zO_%mpMB3kUX@3Kx{S^}(2#uu`786nAPm25EUkq~&!K zS@6@P{Z)|mH$)_}SCTeYQQBN3k<30MP%cnTjTZUrL!|x9r2REgGeuVWOCqa%NZ_o% zS?U>)*gizs;uMkCUP&ajPmxwwNm}6)X@!-g6;=^l3g<{$tRiyTt4jN;Chf1fw7(kC z{;Em)t0{8ZD~R0oO4164h`xoVMS}Tskzig)B$!VZ3FehVg86ijU_L}7m`@i8=2N6C zPM5YgQ{%5U@ zU1)FjvHKv?{670Wb*5-wxL-6dJRlkv+KL8-9`>X5qiUAuVHhcT7}|**h6(oL_T%am zk(vHSk(vHS`ziY=^|DA#|D)(<7$o``?h*YA&Ft~^cr{TZsyp^`_H*iSd!jv2J!wy} zC#m7~^Y-)VMf(N&1vO6Ot=ATL>vcrldTskf`$aWOq^{Q$sq6Jb>Usl_x?WeLuGbT( z>)l1_`rRUR{b7;1{;Eh_w?*oDP^7NgB6U4ze_(%r1_>j3-4faBj_8g!T_mtOB7xnq z7u$=~BlZ$|3DWI9wm(+S+e_`G=)U-?{Z}(q1h*Y?+HyuIFDug2IL>#QLvGkB+}v2f=z-=)Dyv`!KUh|V6$K|H6nOQ@D%lE zutl(iYAv$k10p*||PArj=%M1p)E*e=*kwGr(ZEoFSXRmR8uGCmd+Y4ZI=n*2>7 zO}@X3k40sC>>r#KoQ7TwBU8S=jFNYWO!@wzg`u4hKLi{eMB$EWg<=fe32%9fk>0TP^8IUB+}$B5NYxkiZuD&B2B)7NRvNL zq{(*>Y4Ybehn>UfN|7mluE>->U$lI563O!Ci)8t8(|FWXqW9wx(fe_!$eQmjvgTh^ zfwEPZ4^-K4?0Iyz%2XozGw&odZ|h=jL4JzyE^=-V zHOcqqbY<#om?(ck7mU5&t<6DyVeWJL?mpov zH(b}-;VQqL+uUChc01hV=3dS-CPj>S8!3h#CC)v$uW*t>XNIS|s&3|n1Cst>O_C;c zc+B^}QNDt^iIe#4Bg9kD9Oub%IQCz->uGAy<@%Q7!Kn04Bn18h=XVbG+0FbYaso{N z;Ru)-4~f3n^~;MlpL5YH)+F$OhvUO>e}L52(bKYd8#=y!&fCF+;vBk6MCfmQK69T# zF81_RsBva~G`Dqj(jp`B3a68o%Zvt+>So?DZyWlZFK^0^nTT%ce~W$VXI&q6%n#F{ z{czE<3LNE+d*LJaoBgonEo0U%^cqvn2#vjwVe)r-9B^j*S_js1r8k7QH}a34CXCXQy_Npl?_)YL&HUZ&%0oCE{v>BL=1eSf1{jX-r=Cwenz`&SZ8ZtsMNAn- z8ICXW__MkD&$XqD<`gZLGOmyOQc!nP8O_SeoR}59jNJq#cD0G&h$-X95Ens$ekNr! zoJ0r1^_V!-{Cp$IINyXtqjO=(XsNT&xp}Ac2efVWw0fauvp@PZ??=1lVCy04Vf1Sb zMgL?vdMCG|Z}Ok$ncNr1M7QL>&?$KcU6TI^{Dl6<+`tj^NB$D{HK1*U2EUt~F6i#N z!|8_BzI)Kt*9TpFeVu{MAhh*8zzIo9@4Ki0BM%BX}$(lTtO^oP!(!SgJk$et$@*(-%2J5VUH1B4=bjZkDS5sK`2LXqtx6xselk-b7F zvVDajdzH{%`w9K^PNBbEEcDm*LVrC+=&$Dr{k4P8U(XTx>$yUIy;bP1XAAwcozP#; z7W!*Dp}$@#^w%?m{@PyXua^t`wY|_^&lLLWWkP?wQ0T80sX#5!?^!Fi&O@rE8pR-8 zgITo(cBaUOt-;E=BeQ*J{94Jk`*Hv831grVyZr;Iis86r^;#wT;lInp-gJelhsem3 zfl_gp73doHVhlf#tY6~yC+rPAMRrXlJA_|YF+myfS8V@XxJgtRN(&`VBor9Vql9Zu zc27q*;W)s%P<&X4@;%XhoS=9T_kQ{+>i#i3A|57AAeJFd zARCI+2$6E%FER|@W^=al6sgof4$W%Tp}Cyc)FH*S?CHM3J(^rI_>#?8&a1SuT+T7Z zf=RREo6i1kKVQ;mbuXi(AQN|p&oDBd-@*-5=?BiHo~2LxOdpE5I}nD5zLoA%3&Xz0 z#zopMQUmkZ!~YE3>l*Mm2dEBl?z0PA&EfY3|BRHLLxrbeMALE#4tZhvL^#g~Nzy5v zR1_S-V;kdm)%MXtsgE3e8h#42FEe8-($~2@w8g{7w3B@+qov`@jH@sD^~H<>hW2Rg zT1}(fMpHbXJIUR_eVpl<)D2C__-)0tmeFJtQlWAg2aF`OO}L;J;(n8nWC?WVwTwif zKNLEMnaK>*vw*ZxW;S#3ku75llt11%CJ(>Vg@4lnH=(D-Nc8@DvQt^|-9&FT)Z*_7 zpHuRfLdp6ww0aqH$z>P${mdAP{359LEBTjhPNw7xBtqok09F*ie` z73lH2g^G$_PBfj)K{V9VfK zXKk3CNjajRG%ckdDTc!u-gWcHjoE~BA8H4>IW1>za{ggAjo;Fy_3Yv&eGh1%JVigO zJL#2tnZ->1vADhhud6)Y*W%lge?sY=q{-QUq!69%f9pS4cYXoBwovm4D2jaXT3q-Z z>F*C0)W2Cbx(h}$7Ak(Y(pj%8nnRL8cr4Fk-iz{v$((fk&IKT;85B^%UsKE38SGo z6WPm*wu;$hP5fLInO|bJdp1UXG7rYLZWD`=$IX(7Q}cbn)B*T^CIj7%%yyhX#6M=9 zXD<9Mex!{LTNoeCwpXIF>OJ!RfwSMog zxbsFu|FnX-IZXX?29xOVSB&847r%!j3YW;wj~n^zSj_&B=^bx(va$M3DNq22%SZGaI<))$Gx9}C~aBSu`xY2s5q<_<3R z8j0T_F7z?*NHk)_YqlE14|OM86VHg zG&0L1Sk21J%laT<7Gh3z=lY0ShK6IutfJdK}^Sar>g%v(}^$Ms2EgR!9_|AY0F zdVAQ1I@=dtU*YeOE;v*uP3%}jiiUm>hs|)=X*=*=^PhPr`tkNE9~oc2EPg0*^VadK zmC#cpVGf)5D0(h&by;i*9+pH3RP48c{-@ogw10GK30_8Xjuv`o6=v13B(Jtbt+GBRR1|H%B;lpG zDwLe@^HvbVO3H#q5%HS-ZSl!LDRiwyWAT z?3#9MyN+Ggu5UN68`{n6Q|wdi=5`Cal{3Woqw|pSu=9vB%o*;CbVfO2oM)Wz&ID(o zGs$`0nc_@!W;!o9uQ;=u*>G~44`h$2vOqT+9v0w(d*w;%Nqk0Iqv2tB#(GAT1lsZN zwmfG&r%D6yR8<_PU&ID-zP@a|Ox#zjR|rEH@PEsCi@0xFZxeowHAe+0k)Xqc%1;;cI=nK6y2;8<2iOyCHGG5MNKVPsP8v-JJAW*eyt{mEB5J24_Q5 zIq>#JIA0!e9)j}){K4}w%o&FNaA!E2FC(3isub891xL&nXAJx`&p6Kza=bGhdxA4T zl>oyNvB5GSr#MqcZK^Ys@ZcN&SDaT!XO=UIxU<2%;iLJ`8fFaxQzNVqU~QyD9)kUn z));GyvIP653ieO6CRh`^I;deyv?i)r)+B3^s$;!iy`YLot(2fXrgQIkrZrR5wqCMc zBD|@UQ>|InEOmzUn)RA$OAWnF%5Pe4^3~K(4XK;6q;AeJt&UsBrdCQzt+cR<+C{;j zshfs&aq6bIUCJ({Y`e5w2DhoF7Ir!6skzis3%jCSQPr2)3QBFYu&dZr)Fo19&FyM- zHFd6CotkSdHFv39i<)ar&DBx$Xwh|X*R$)XGE#rdrT$vjjqFC;fo^O!%jR|`yOX-n?re8f4eTy<7j>EN;m5g9_;ET5KTcWuVf$hAfc=R5i29>F)E=q^3y03x!lCn^ zJ<=Yjo)E5_r|dEI7^!h=&pcyQ8$2d9nP z6m2a$IHw5@PHW-8IZb$QF1P2|^VCJciPJLTzUWmE_eEREebIJuU-U}h$0;YAIQ@kO zr@!3ud{Ve?MhN%KqrvLI>gsX1vH6(X)qE^iJ6Kx{k{g?k32#n&;mx^Dcyk5{Z%$3Q zt9hQ>)jVJBYThs0I#&c+23x9&g=eRg+|{fpJUg9)XQ!s{?6h(QJA>(grq@+*hB`x4 zb?J50oDt3lRY7{)P15Ubaz;C&RYmE0jhv^Qr&SYYtTR?MbH+L2RAcFZRq1<^)NRfS z&I_ukGufF;c+&%Ka;7=c)UD18XNJ0+-Z+z#Uv^&RtLcr6oO#YXZdA^9=Brbj#m-{Y zU3h$M5gwnR!sF9Nczk*bkI!Ag=o6H#`2qEVrHALKdfCv!Sw$;k@};Xl%9O;g8r6e&UOCxoLCI7%h-V|r-f*^dKG#3gQ=B8(3N*U&&*21aeQK-`#t5x`Qrdu z`scLhcWCEN>IZ!2aqp9FNx3Whki_3b=;_@1coNsEd9CQeasIEmI5{yVvdb{suE6G> z|1i#Y|HAtZ|6BB%ll)hRyVuyf*P9(Ad!#LxY>eUM`3l?oV+ZlSClw5EX7iTR$R?3M z^_Gc)o+kGlw~xvzMa~T8bLRB}z2OI3=DdC{?)jYef5*E(Y2}sA$@+~s(#(}+rW}K& zmRbCp&%b$`3(nGm_{W&S_qg3>ba@C}2kO!?>{-0uVa8obJlVI?+BZQTF%&(xReTyx zbo|JFhVy~mk&9VF4P=tuJmSye{}$%*5Ar*=h)nDE?56ZXFsm7*-{I_a2)unCahf

pqK^_B2eqCEin8Q#}1V$UX?(5S)YS3VvS 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 literal 0 HcmV?d00001 diff --git a/ios/StatusIm.xcodeproj/project.pbxproj b/ios/StatusIm.xcodeproj/project.pbxproj index 181680ec94..5889ef5053 100644 --- a/ios/StatusIm.xcodeproj/project.pbxproj +++ b/ios/StatusIm.xcodeproj/project.pbxproj @@ -68,6 +68,7 @@ E0AD9E8F495A4907B65104BF /* libRCTImageResizer.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 2BEE3436791D42248F853999 /* libRCTImageResizer.a */; }; EC8998BFE2C04023A860C065 /* libRNNetworkInfo.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 74B7BDFF464F43D3BA8EA040 /* libRNNetworkInfo.a */; }; EF2B5857B4A34E0C9707FB3F /* Octicons.ttf in Resources */ = {isa = PBXBuildFile; fileRef = B3B19223008342D096AA356E /* Octicons.ttf */; }; + F9238D6C1E5F055900C047B9 /* SF-UI-Text-Semibold.otf in Resources */ = {isa = PBXBuildFile; fileRef = F9238D6B1E5F055900C047B9 /* SF-UI-Text-Semibold.otf */; }; FD4F213C3873473CB703B1D2 /* libRNFS.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 674B3D9595A047AB8D518F4E /* libRNFS.a */; }; /* End PBXBuildFile section */ @@ -468,6 +469,7 @@ F090E261B9854867A728CE4F /* RealmReact.xcodeproj */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = "wrapper.pb-project"; name = RealmReact.xcodeproj; path = "../node_modules/realm/react-native/ios/RealmReact.xcodeproj"; sourceTree = ""; }; F3548417D8DA4362B6796A54 /* RNInstabug.xcodeproj */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = "wrapper.pb-project"; name = RNInstabug.xcodeproj; path = "../node_modules/instabug-reactnative/ios/RNInstabug.xcodeproj"; sourceTree = ""; }; F93B6663A59F4B26BD4DA525 /* RNNetworkInfo.xcodeproj */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = "wrapper.pb-project"; name = RNNetworkInfo.xcodeproj; path = "../node_modules/react-native-network-info/ios/RNNetworkInfo.xcodeproj"; sourceTree = ""; }; + F9238D6B1E5F055900C047B9 /* SF-UI-Text-Semibold.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "SF-UI-Text-Semibold.otf"; sourceTree = ""; }; FC1CBCFE6C906043D6CCEEE1 /* libPods-StatusImTests.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-StatusImTests.a"; sourceTree = BUILT_PRODUCTS_DIR; }; /* End PBXFileReference section */ @@ -671,6 +673,7 @@ 2028E0111D4275BD00227DCD /* SF */ = { isa = PBXGroup; children = ( + F9238D6B1E5F055900C047B9 /* SF-UI-Text-Semibold.otf */, 9ED2F4601D9D577B00B36508 /* SF-UI-Text-Bold.otf */, 9E0B01A01DDC5DA7002B0359 /* SF-UI-Text-Light.otf */, 9ED2F45D1D9D52DD00B36508 /* SF-UI-Text-Regular.otf */, @@ -1471,6 +1474,7 @@ 9ED2F45F1D9D535A00B36508 /* SF-UI-Text-Medium.otf in Resources */, 2028DFFA1D4275B600227DCD /* SF-UI-Display-Regular.otf in Resources */, 2028DFF91D4275B600227DCD /* SF-UI-Display-Medium.otf in Resources */, + F9238D6C1E5F055900C047B9 /* SF-UI-Text-Semibold.otf in Resources */, 2028DFFC1D4275B600227DCD /* SF-UI-Display-Thin.otf in Resources */, 2028DFFB1D4275B600227DCD /* SF-UI-Display-Semibold.otf in Resources */, D28AEFB4C39548EB80416889 /* Entypo.ttf in Resources */, diff --git a/ios/StatusIm/Images.xcassets/icon_back_white.imageset/icon_back_white.png b/ios/StatusIm/Images.xcassets/icon_back_white.imageset/icon_back_white.png index 166bc865a4588a56795a9e66e53e00ed57fed9ed..66efe8d2167382cfa3b8037b70e46241709609dd 100644 GIT binary patch literal 344 zcmV-e0jK_nP)Px$5=lfsRA>e5m_Z7{Fc3w9f)-ra3wR$9+!VTX;ZeMR$MX^{+=w8?KVl(-G(sUv zMt)!@nbzdZn<8zUN%%`8sy897By(R@+8nZ;qgL&Ohe@_11H z|Gd-%&Fd-Y0B)+#QSoSYCw0yuhD^ qys0C=8^qcaG+}9g258_v4ZHy*7axOJ!PzkY0000Px$EJ;K`R7eeDV4wo{|Np-n5HADb8$i4ch}EcIECU13AZ;Li1;ohU1&|}eOoF=!NF%BOO_-@=8C?rOM0vrmo4~igia-IUvUHA$i^3pNLB|wAMBYcj*0vSxY zi(y^_Y6jIB*Z^e)LtXwBo5?`23qZ^ba|Bs5(15!*3Pf(l)3rYwY zf=>Yf3+(afB}xuzK_`&@2gEQi0i>CcC=-ZK1T<9>sLTL}uQ4(*UIb|Y08X8X1*a~y Q8vpPx%C`m*?RA>e5SUXO{Fc2MQMGc350wDw^pyyLSfwn+U!x^B2J5Vp8Shj$IPtO66 zwgANE5O9FqVV;p8it@3&PJx(6tHiPA&3n)GBv~Ro)B$xs9Z(0<0d+tf_`eRAQ0eR4 z-FY6HQzD+G%pBeJd)J{D`SEMry$u@kF_HN+8Smfp&z|%BP1jk|fMP$$GxG{FElJ|5 z)$P4*ag1-<#tH_oET%QaH~M>AxB#XZmqHSE4Dor42*e;37!J?Q>TkpADp-K&(4jFj za_BK4%E((xS&|Od_ncGj7xMNve4SlbevyP*65$NU(8m4ur{QBAQWbe7vvYURyR3^X z>kAeD5Ri-!QA>W%>z5I1x)&uNMnoIr!6RBgh={hxgG2Ch071p0jv&Sss|_}+UGtI4 zCZ9iv0035rKwrL8rX&ySiIxxm+)=f$rQcO5N=+WQlL-J=g$Q)DLLRt3?x67(kEAnD zwhwZqct7lNF^!kW1eB4-nwK973pdlrMI@<0Rpe1BVPTtPbmAGPBY!7#zG7o1n~8}8 zG?8};xJ?n!0({B0Eh0)lDET%;1Pj17tYIF+z8=&qr@6)D2Yhch!9HhK-h9T|F+8G^ zSn@6jHa991%B;I*G402_yW@8b79dGK95e{TzEzfqkb?W^uzk4+g<0Q!mD-?`XV^z``8gDco4hWvJNJ8aDY*hOG&(9yJh%s>}G%&!4 z1C~r;y??(QPM)^^X`Ji%KOyO6syA1!oS*!prb}e4sosB){5tMWS*N+o#OfSA>^pq= z5Whj>@;`fzTAz`ecSY>HB12<0hXMP)e-kSMjM%@0%w(?CdZUPB0RvOHSOmkf%X-}9 TnHS7~PG<0Q^>bP0l+XkKO21XN literal 0 HcmV?d00001 diff --git a/ios/StatusIm/Images.xcassets/icon_options_dark.imageset/Contents.json b/ios/StatusIm/Images.xcassets/icon_options_dark.imageset/Contents.json index b74610d665..86a16e4e7f 100644 --- a/ios/StatusIm/Images.xcassets/icon_options_dark.imageset/Contents.json +++ b/ios/StatusIm/Images.xcassets/icon_options_dark.imageset/Contents.json @@ -2,7 +2,7 @@ "images" : [ { "idiom" : "universal", - "filename" : "icon_dots_horizontal_dark.png", + "filename" : "icon_options_dark.png", "scale" : "1x" }, { diff --git a/ios/StatusIm/Images.xcassets/icon_options_dark.imageset/icon_dots_horizontal_dark.png b/ios/StatusIm/Images.xcassets/icon_options_dark.imageset/icon_dots_horizontal_dark.png deleted file mode 100644 index 846998d7558a3c4549955df6ced0e746b64e7a32..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 251 zcmeAS@N?(olHy`uVBq!ia0vp^Dj>|k1|%Oc%$NbB7>k44ofy`glX(f`Z1r?;42j@; zJIR)>*?^~2w#BND>)nx4rY}Mi`wq>rF6{D)y%e=FHMwq?#^uvO`mDbI-q$oz8m>RHn03#%0xd mg=i&LFJgmP$k2F-W#2jHNXo!n~MoRsiR(!}H|kK7^S8Ce-y*gvo|NmMWWzvN*rGo>2+t* zHM2~CKfKQV*Z;eg?wy&Z#3R7Kh>j}!ncmIZ_WSU~=O3r|a%ok)DStBUYm`yknPt}6 z_S^n%OWVMB?~LN67zUTnTZ?*{>y@ z=TIj-_e8e$=A=p4nPG1x#+%G+j(6x;Z^bVCfcf|RXS!#*Johb)+~{6+F@?|Uz;<5w z2+tko?836HA9(K#G{8Mn_QLD8X_j6g$R;4yf*`njxgN@xNA-9d>3 literal 0 HcmV?d00001 diff --git a/ios/StatusIm/Images.xcassets/icon_options_gray.imageset/Contents.json b/ios/StatusIm/Images.xcassets/icon_options_gray.imageset/Contents.json index c675431cd9..99ebd99f46 100644 --- a/ios/StatusIm/Images.xcassets/icon_options_gray.imageset/Contents.json +++ b/ios/StatusIm/Images.xcassets/icon_options_gray.imageset/Contents.json @@ -2,7 +2,7 @@ "images" : [ { "idiom" : "universal", - "filename" : "icon_dots_horizontal_gray.png", + "filename" : "icon_options_gray.png", "scale" : "1x" }, { diff --git a/ios/StatusIm/Images.xcassets/icon_options_gray.imageset/icon_dots_horizontal_gray.png b/ios/StatusIm/Images.xcassets/icon_options_gray.imageset/icon_dots_horizontal_gray.png deleted file mode 100644 index 01b2320081f207da0249810e0faad2756032b022..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 250 zcmeAS@N?(olHy`uVBq!ia0vp^Dj>|k1|%Oc%$NbB7>k44ofy`glX(f`Z1Hq)42j@; zJIRo**?`BDb5+6vk-63KZtEC@o%=6M{9W=+QzC)$XY*41)rnn3e|0wQugiIT)OWEm zlac}yg>tsUY|s5&_WNUXyMS6nQqTN__3Ix0uzKsO*?;x$-v=$pJd;0J@+N(nV{)XM zbE!=jfB9+7<8IIVw4XkdyV-an#P}Rv%iNF66=$D+s6PArzs()>-OdpSZ+dFExtt## mUuqK*ypf}$0g6J@3K)5fN~F^6Ft`ET&*16m=d#Wzp$Py9FkvVF diff --git a/ios/StatusIm/Images.xcassets/icon_options_gray.imageset/icon_options_gray.png b/ios/StatusIm/Images.xcassets/icon_options_gray.imageset/icon_options_gray.png new file mode 100644 index 0000000000000000000000000000000000000000..cd0f71346e86690bba1fd3bf09142c7210c53c44 GIT binary patch literal 330 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA1|-9oezpTC#^NA%Cx&(BWL^T@U;GEFr2h6 z=Ot@5hdf6E13Jo?%&@e*^{;^qX%bYI8o%y^}dC!dJ+Ao83-d$xYx%Hy??4~OM@jWvgviI&>_m8dQ z)Qc^N&jPPy$1OH*{PN*i)oq3x0R~2NbVI9Ae$&b_&HX#_3xI*c;OXk;vd$@?2>=90 BgpmLM literal 0 HcmV?d00001 diff --git a/ios/StatusIm/Info.plist b/ios/StatusIm/Info.plist index 2a71f7e0f5..28aac58eed 100644 --- a/ios/StatusIm/Info.plist +++ b/ios/StatusIm/Info.plist @@ -46,8 +46,8 @@ - NSMicrophoneUsageDescription - Need microphone access for Instabug and Audio Messages + NSMicrophoneUsageDescription + Need microphone access for Instabug and Audio Messages NSCameraUsageDescription We need to access your camera NSContactsUsageDescription @@ -58,6 +58,7 @@ We need to access your photo storage to give you an ability to select photos UIAppFonts + SF-UI-Text-Semibold.otf SF-UI-Text-Bold.otf SF-UI-Text-Regular.otf SF-UI-Text-Medium.otf diff --git a/package.json b/package.json index b56cea2ea1..d67c3adb00 100644 --- a/package.json +++ b/package.json @@ -69,6 +69,7 @@ "react-native-qrcode": "^0.2.2", "react-native-randombytes": "^2.1.0", "react-native-share": "1.0.17", + "react-native-sortable-listview": "^0.1.1", "react-native-splash-screen": "1.0.9", "react-native-swiper": "1.5.3", "react-native-tcp": "^2.0.4", diff --git a/src/status_im/android/core.cljs b/src/status_im/android/core.cljs index 5bfd5d6fc0..556f124009 100644 --- a/src/status_im/android/core.cljs +++ b/src/status_im/android/core.cljs @@ -25,8 +25,9 @@ [status-im.transactions.screen :refer [confirm]] [status-im.chats-list.screen :refer [chats-list]] [status-im.new-group.screen-public :refer [new-public-group]] - [status-im.new-group.screen-private :refer [new-group contact-group]];; TODO: confusion with names + [status-im.new-group.screen-private :refer [new-group contact-group]] [status-im.new-group.views.contact-list :refer [contact-group-list]] + [status-im.new-group.views.reorder-groups :refer [reorder-groups]] [status-im.participants.views.add :refer [new-participants]] [status-im.participants.views.remove :refer [remove-participants]] [status-im.group-settings.screen :refer [group-settings]] @@ -114,6 +115,7 @@ :contact-list main-tabs :contact-list-search-results contacts-search-results :group-contacts contact-list + :reorder-groups reorder-groups :new-contact new-contact :qr-scanner qr-scanner :chat chat diff --git a/src/status_im/android/platform.cljs b/src/status_im/android/platform.cljs index 2875810d98..a6ba5f302c 100644 --- a/src/status_im/android/platform.cljs +++ b/src/status_im/android/platform.cljs @@ -8,6 +8,9 @@ :main {:height 0 :bar-style "dark-content" :color styles/color-white} + :gray {:height 0 + :bar-style "dark-content" + :color styles/color-light-gray} :transparent {:height 20 :bar-style "light-content" :translucent? true @@ -15,6 +18,13 @@ :modal {:height 0 :bar-style "light-content" :color styles/color-black}} + :toolbar-new {:height 55 + :padding-top 18 + :padding-left 16 + :padding-right 16} + :toolbar-title-container {:padding-left 30} + :toolbar-title-center? false + :toolbar-with-search-content {:padding-left 30} :sized-text {:margin-top 0 :additional-height 0} :chat {:new-message {:border-top-color styles/color-transparent @@ -35,6 +45,12 @@ :font-size 14}}} :contacts {:subtitle {:color styles/color-gray4 :font-size 14} + :subtitle-count {:color styles/color-gray4 + :font-size 14} + :info-container {:margin-left 16} + :contact-inner-container {:height 56} + :contacts-list-container {:padding-top 8 + :padding-bottom 8} :separator {:height 0} :icon-check {:border-radius 2 :width 17 @@ -43,7 +59,43 @@ :alignItems :center :height 56 :padding-top 10 - :backgroundColor styles/color-light-gray}} + :padding-left 16 + :padding-right 14 + :backgroundColor styles/color-light-gray} + :show-all {:padding-left 72 + :height 56} + :show-all-text {:fontSize 14 + :color styles/color-blue + :letter-spacing 0.5} + :show-all-text-font :medium + :contact-container {:padding-right 16} + :name-text {:fontSize 16 + :line-height 24 + :color styles/text1-color}} + :new-group {:group-name-text {:font-size 12} + :members-text {:font-size 14} + :members-text-count {:font-size 14} + :add-text {:margin-left 16 + :letter-spacing 0.5 + :font-size 14} + :delete-group-text {:letter-spacing 0.5 + :font-size 14} + :delete-group-prompt-text {:font-size 14} + :contact-container {:height 56} + :delete-group-container {:padding-left 72}} + :reorder-groups {:order-item-container {:height 56 + :background-color styles/color-white} + :order-item-icon {:padding-right 16} + :order-item-label {:padding-left 16 + :font-size 16 + :color styles/color-black + :line-height 24} + :reorder-list-container {:padding-top 16} + :order-item-contacts {:font-size 16 + :line-height 24}} + :confirm-button-label {:color styles/color-white + :font-size 14 + :letter-spacing 0.5} :bottom-gradient {:height 3} :input-label {:left 4} :input-error-text {:margin-left 4} @@ -55,8 +107,7 @@ :toolbar-last-activity {:color styles/text2-color :background-color :transparent :top 0 - :font-size 12} - :toolbar-title-container {:padding-left 16}}) + :font-size 12}}) (def fonts {:light {:font-family "sans-serif-light"} @@ -86,11 +137,13 @@ :tabs {:tab-shadows? true} :chats {:action-button? true :new-chat-in-toolbar? false} + :uppercase? true :contacts {:action-button? true :new-contact-in-toolbar? false - :uppercase-subtitles? false :group-block-shadows? true} :discover {:uppercase-subtitles? false} :public-group-icon-container {:margin-top 4} :private-group-icon-container {:margin-top 6} + :group-chat-focus-line-color styles/color-light-blue + :group-chat-focus-line-height 2 :public-group-chat-hash-style {:top 10 :left 4}}) diff --git a/src/status_im/chat/screen.cljs b/src/status_im/chat/screen.cljs index a1c4ab5321..37f4b6d666 100644 --- a/src/status_im/chat/screen.cljs +++ b/src/status_im/chat/screen.cljs @@ -117,8 +117,8 @@ [status-bar] [toolbar {:hide-nav? (or (empty? accounts) show-actions? creating?) :custom-content [toolbar-content-view] - :custom-action [toolbar-action] - :style (get-in platform-specific [:component-styles :toolbar])}] + :style (get-in platform-specific [:component-styles :toolbar]) + :custom-action [toolbar-action]}] [add-contact-bar]]) (defn get-intro-status-message [all-messages] diff --git a/src/status_im/chats_list/screen.cljs b/src/status_im/chats_list/screen.cljs index 35bb1e1b0a..31c3666e47 100644 --- a/src/status_im/chats_list/screen.cljs +++ b/src/status_im/chats_list/screen.cljs @@ -37,8 +37,8 @@ :title (label :t/chats) :search-placeholder (label :t/search-for) :nav-action (act/hamburger open-drawer) - :actions actions - :style (st/toolbar chats-scrolled?)}])) + :style (st/toolbar chats-scrolled?) + :actions actions}])) (defn chats-action-button [] [action-button {:button-color color-blue diff --git a/src/status_im/chats_list/styles.cljs b/src/status_im/chats_list/styles.cljs index 3524c7d69b..0de3732b68 100644 --- a/src/status_im/chats_list/styles.cljs +++ b/src/status_im/chats_list/styles.cljs @@ -17,6 +17,7 @@ toolbar-background2)} (get-in p/platform-specific [:component-styles :toolbar]))) + (def gradient-top-bottom-shadow ["rgba(24, 52, 76, 0.165)" "rgba(24, 52, 76, 0.03)" diff --git a/src/status_im/commands/handlers/loading.cljs b/src/status_im/commands/handlers/loading.cljs index be3341493d..91472244f8 100644 --- a/src/status_im/commands/handlers/loading.cljs +++ b/src/status_im/commands/handlers/loading.cljs @@ -166,28 +166,3 @@ (reg-handler ::clear-commands-callbacks (fn [db [chat-id]] (assoc-in db [::commands-callbacks chat-id] nil))) - -(reg-handler :load-default-contacts! - (u/side-effect! - (fn [{:keys [chats groups]}] - (let [default-contacts js-res/default-contacts - default-dapps-group-contacts (mapv #(hash-map :identity (clojure.core/name (first %))) - (filter #(true? (:dapp? (second %))) default-contacts))] - (doseq [[id {:keys [name photo-path public-key add-chat? - dapp? dapp-url dapp-hash]}] default-contacts] - (let [id' (clojure.core/name id)] - (when-not (chats id') - (when add-chat? - (dispatch [:add-chat id' {:name (:en name)}])) - (dispatch [:add-contacts [{:whisper-identity id' - :name (:en name) - :photo-path photo-path - :public-key public-key - :dapp? dapp? - :dapp-url (:en dapp-url) - :dapp-hash dapp-hash}]])))) - (dispatch [:add-groups [{:group-id "dapps" - :name (label :t/contacts-group-dapps) - :order 0 - :timestamp (random/timestamp) - :contacts default-dapps-group-contacts}]]))))) diff --git a/src/status_im/components/chat_icon/screen.cljs b/src/status_im/components/chat_icon/screen.cljs index 4d943e4a02..95e576c848 100644 --- a/src/status_im/components/chat_icon/screen.cljs +++ b/src/status_im/components/chat_icon/screen.cljs @@ -24,15 +24,14 @@ (get resources/contacts)) {:uri photo-path})] [image {:source photo - :style (merge st/default-image-style - (st/image-style size))}])) + :style (st/image-style size)}])) -(defn dapp-badge [styles] - [view (:online-view-wrapper styles) - [view (:online-view styles) +(defn dapp-badge [{:keys [online-view-wrapper online-view online-dot-left online-dot-right]}] + [view online-view-wrapper + [view online-view [view - [view (:online-dot-left styles)] - [view (:online-dot-right styles)]]]]) + [view online-dot-left] + [view online-dot-right]]]]) (defn contact-badge [type styles] (when (= type :edit) @@ -127,19 +126,19 @@ :default-chat-icon (st/default-chat-icon-message-status color) :default-chat-icon-text st/message-status-icon-text}]) -(defn contact-icon-view [contact styles] - (let [photo-path (:photo-path contact) - ;; TODO: stub - type :online] - [view (:container styles) +(defn contact-icon-view [{:keys [photo-path name dapp?]} {:keys [container] :as styles}] + (let [photo-path photo-path] + [view container (if-not (s/blank? photo-path) [chat-icon photo-path styles] - [default-chat-icon (:name contact) styles]) - [contact-badge type styles]])) + [default-chat-icon name styles]) + (when dapp? + [dapp-badge styles])])) (defn contact-icon-contacts-tab [contact] [contact-icon-view contact {:container st/container-chat-list + :online-view-wrapper st/online-view-wrapper :online-view st/online-view :online-dot-left st/online-dot-left :online-dot-right st/online-dot-right diff --git a/src/status_im/components/chat_icon/styles.cljs b/src/status_im/components/chat_icon/styles.cljs index 9f30e1159d..de0c8248ff 100644 --- a/src/status_im/components/chat_icon/styles.cljs +++ b/src/status_im/components/chat_icon/styles.cljs @@ -89,10 +89,10 @@ (def online-view-wrapper {:position :absolute - :bottom -1 - :right 0 - :width 22 - :height 22 + :bottom -2 + :right -2 + :width 17 + :height 17 :border-radius 11 :background-color :white}) @@ -109,8 +109,8 @@ {:position :absolute :bottom 2 :right 2 - :width 18 - :height 18 + :width 13 + :height 13 :border-radius 9 :background-color online-color}) @@ -130,13 +130,13 @@ (def online-dot {:position :absolute - :top 7 - :width 4 - :height 4 + :top 5 + :width 3 + :height 3 :border-radius 2 :background-color color-white}) -(def online-dot-left (merge online-dot {:left 4})) -(def online-dot-right (merge online-dot {:left 10})) +(def online-dot-left (merge online-dot {:left 2.8})) +(def online-dot-right (merge online-dot {:left 7.2})) (def photo-pencil {:margin-left 8 @@ -172,8 +172,8 @@ :height 44}) (def container-chat-list - {:width 48 - :height 48}) + {:width 40 + :height 40}) (def container-menu-item {:width 32 diff --git a/src/status_im/components/confirm_button.cljs b/src/status_im/components/confirm_button.cljs index 799d82b36d..1becdba24d 100644 --- a/src/status_im/components/confirm_button.cljs +++ b/src/status_im/components/confirm_button.cljs @@ -1,5 +1,6 @@ (ns status-im.components.confirm-button (:require [status-im.components.styles :as st] + [status-im.utils.platform :refer [platform-specific]] [status-im.components.react :refer [view text touchable-highlight]])) @@ -7,4 +8,6 @@ (defn confirm-button [label on-press] [touchable-highlight {:on-press on-press} [view st/confirm-button - [text {:style st/confirm-button-label} label]]]) \ No newline at end of file + [text {:style (get-in platform-specific [:component-styles :confirm-button-label]) + :uppercase? (get-in platform-specific [:uppercase?])} + label]]]) \ No newline at end of file diff --git a/src/status_im/components/context_menu.cljs b/src/status_im/components/context_menu.cljs index 293eedad60..3719b3c88d 100644 --- a/src/status_im/components/context_menu.cljs +++ b/src/status_im/components/context_menu.cljs @@ -4,7 +4,7 @@ [status-im.i18n :refer [label]] [status-im.utils.platform :refer [platform-specific ios?]] [re-frame.core :refer [dispatch]] - [status-im.components.react :refer [view touchable-highlight]])) + [status-im.components.react :refer [view touchable-highlight text]])) (def react-native-popup-menu (js/require "react-native-popup-menu")) @@ -43,7 +43,9 @@ trigger]] [menu {:onSelect #(when % (do (%) nil))} [menu-trigger trigger] - [menu-options st/context-menu - (for [option options] + [menu-options st/context-menu-options + (for [{:keys [style value] :as option} options] ^{:key option} - [menu-option option])]])) \ No newline at end of file + [menu-option {:value value} + [text {:style (merge st/context-menu-text style)} + (:text option)]])]])) \ No newline at end of file diff --git a/src/status_im/components/sortable_list_view.cljs b/src/status_im/components/sortable_list_view.cljs new file mode 100644 index 0000000000..bda52af1b4 --- /dev/null +++ b/src/status_im/components/sortable_list_view.cljs @@ -0,0 +1,20 @@ +(ns status-im.components.sortable-list-view + (:require [reagent.core :as r] + [status-im.components.react :refer [view + touchable-highlight + list-item]])) + +(def sortable-list-view-class (r/adapt-react-class (js/require "react-native-sortable-listview"))) + +(defn sortable-list-view [{:keys [on-row-moved render-row] :as props}] + [sortable-list-view-class + (assoc props :on-row-moved #(on-row-moved (js->clj % :keywordize-keys true)) + :render-row #(render-row (js->clj % :keywordize-keys true)))]) + +(defn touchable [inner] + [touchable-highlight (js->clj (.-props (r/current-component))) + [view + inner]]) + +(defn sortable-item [inner] + (list-item [touchable inner])) \ No newline at end of file diff --git a/src/status_im/components/styles.cljs b/src/status_im/components/styles.cljs index f0df443e8e..9c04928129 100644 --- a/src/status_im/components/styles.cljs +++ b/src/status_im/components/styles.cljs @@ -3,7 +3,7 @@ (def color-transparent "transparent") (def color-blue "#7099e6") (def color-blue-transparent "#7099e632") -(def color-black "#000000de") +(def color-black "#000000") (def color-purple "#a187d5") (def color-gray "#838c93de") (def color-gray2 "#8f838c93") @@ -24,12 +24,12 @@ (def text1-disabled-color "#555555") (def text2-color color-gray) (def text3-color color-blue) -(def online-color color-blue) +(def online-color color-light-blue) (def new-messages-count-color color-blue-transparent) (def chat-background color-light-gray) (def selected-message-color "#E4E9ED") (def selected-contact-color color-light-blue2) -(def separator-color color-gray4) +(def separator-color "#0000001f") (def default-chat-color color-purple) (def flex @@ -45,8 +45,8 @@ :color :white}) (def icon-back - {:width 24 - :height 24}) + {:width 8 + :height 14}) (def icon-default {:width 24 @@ -96,17 +96,18 @@ :align-items :center :background-color color-light-blue}) -(def confirm-button-label - {:color color-white - :font-size 17 - :line-height 20 - :letter-spacing -0.2}) - -(def context-menu - {:customStyles {:optionsContainer {:padding-top 8 +(def context-menu-options + {:customStyles {:optionsContainer {:elevation 2 + :margin-top 30 + :padding-top 8 + :width 164 :padding-bottom 8} - :optionWrapper {:padding-left 16 + :optionWrapper {:padding-left 16 + :padding-right 16 :justify-content :center - :height 48} - :text {:font-size 15 - :line-height 20}}}) + :height 48}}}) + +(def context-menu-text + {:font-size 15 + :line-height 20 + :color text1-color}) diff --git a/src/status_im/components/text_field/styles.cljs b/src/status_im/components/text_field/styles.cljs index 99f8a8ae71..abe1148428 100644 --- a/src/status_im/components/text_field/styles.cljs +++ b/src/status_im/components/text_field/styles.cljs @@ -29,12 +29,11 @@ (defn underline-container [background-color] {:background-color background-color - :height 1 :align-items :center}) -(defn underline [background-color width] +(defn underline [background-color width height] {:background-color background-color - :height 1 + :height height :width width}) (defn error-text [color] diff --git a/src/status_im/components/text_field/view.cljs b/src/status_im/components/text_field/view.cljs index 6fcab178ab..b1ba7ae6a7 100644 --- a/src/status_im/components/text_field/view.cljs +++ b/src/status_im/components/text_field/view.cljs @@ -29,6 +29,7 @@ :label-color "#838c93" :line-color separator-color :focus-line-color separator-color + :focus-line-height 1 :error-color "#d50000" :secure-text-entry false :on-focus #() @@ -38,14 +39,16 @@ :auto-capitalize :sentences}) (defn field-animation [{:keys [top to-top font-size to-font-size - line-width to-line-width]}] + line-width to-line-width line-height to-line-height]}] (let [duration (:label-animation-duration config) animation (anim/parallel [(anim/timing top {:toValue to-top :duration duration}) (anim/timing font-size {:toValue to-font-size :duration duration}) (anim/timing line-width {:toValue to-line-width - :duration duration})])] + :duration duration}) + (anim/timing line-height {:toValue to-line-height + :duration duration})])] (anim/start animation (fn [arg] (when (.-finished arg) (log/debug "Field animation finished")))))) @@ -58,6 +61,7 @@ :label-top 0 :label-font-size 0 :line-width (anim/create-value 0) + :line-height (anim/create-value 1) :max-line-width 100}) ; Invoked once, both on the client and server, immediately before the initial @@ -80,7 +84,8 @@ (log/debug "input focused") (r/set-state component {:has-focus true :float-label? true}) - (field-animation animation) + (field-animation (merge animation + {:to-line-width (:max-line-width (r/state component))})) (when onFocus (onFocus)))) (defn on-input-blur [{:keys [component value animation onBlur]}] @@ -101,14 +106,14 @@ label-top label-font-size line-width + line-height current-value - max-line-width valid-value temp-value max-length]} (r/state component) - {:keys [wrapper-style input-style label-hidden? line-color focus-line-color secure-text-entry - label-color error-color error label value on-focus on-blur validator auto-focus - on-change-text on-change on-end-editing editable placeholder auto-capitalize]} + {:keys [wrapper-style input-style label-hidden? line-color focus-line-color focus-line-height + secure-text-entry label-color error-color error label value on-focus on-blur validator + auto-focus on-change-text on-change on-end-editing editable placeholder auto-capitalize]} (merge default-props (r/props component)) line-color (if error error-color line-color) focus-line-color (if error error-color focus-line-color) @@ -125,21 +130,24 @@ :secure-text-entry secure-text-entry :auto-capitalize auto-capitalize :on-focus #(on-input-focus {:component component - :animation {:top label-top - :to-top (:label-top config) - :font-size label-font-size - :to-font-size (:label-font-small config) - :line-width line-width - :to-line-width max-line-width} + :animation {:top label-top + :to-top (:label-top config) + :font-size label-font-size + :to-font-size (:label-font-small config) + :line-width line-width + :line-height line-height + :to-line-height focus-line-height} :onFocus on-focus}) :on-blur #(on-input-blur {:component component :value (or current-value value) - :animation {:top label-top - :to-top (:label-bottom config) - :font-size label-font-size - :to-font-size (:label-font-large config) - :line-width line-width - :to-line-width 0} + :animation {:top label-top + :to-top (:label-bottom config) + :font-size label-font-size + :to-font-size (:label-font-large config) + :line-width line-width + :line-height line-height + :to-line-width 0 + :to-line-height 1} :onBlur on-blur}) :on-change-text (fn [text] (r/set-state component {:current-value text}) @@ -159,7 +167,7 @@ :auto-focus (true? auto-focus)}] [view {:style (st/underline-container line-color) :onLayout #(r/set-state component {:max-line-width (get-width %)})} - [animated-view {:style (st/underline focus-line-color line-width)}]] + [animated-view {:style (st/underline focus-line-color line-width line-height)}]] [text {:style (st/error-text error-color)} error]])) (defn text-field [_ _] diff --git a/src/status_im/components/toolbar/actions.cljs b/src/status_im/components/toolbar/actions.cljs index ecf66d40e1..e778f8646e 100644 --- a/src/status_im/components/toolbar/actions.cljs +++ b/src/status_im/components/toolbar/actions.cljs @@ -3,34 +3,29 @@ (def nothing {:image {:source nil - :style st/action-default}}) + :style st/action-search}}) (defn hamburger [handler] - {:image {:source {:uri :icon_hamburger_dark} - :style st/action-default} + {:image {:source {:uri :icon_hamburger} + :style st/action-hamburger} :handler handler}) (defn add [handler] {:image {:source {:uri :icon_add} - :style st/action-default} - :handler handler}) - -(defn opts [handler] - {:image {:source {:uri :icon_options_dark} - :style st/action-default} + :style st/action-add} :handler handler}) (defn search [handler] - {:image {:source {:uri :icon_search_dark} - :style st/action-default} + {:image {:source {:uri :icon_search} + :style st/action-search} :handler handler}) (defn back [handler] {:image {:source {:uri :icon_back_dark} - :style st/action-default} + :style st/action-back} :handler handler}) (defn back-white [handler] {:image {:source {:uri :icon_back_white} - :style st/action-default} - :handler handler}) + :style st/action-back} + :handler handler}) \ No newline at end of file diff --git a/src/status_im/components/toolbar/styles.cljs b/src/status_im/components/toolbar/styles.cljs index eabc5fce60..b111d3acb4 100644 --- a/src/status_im/components/toolbar/styles.cljs +++ b/src/status_im/components/toolbar/styles.cljs @@ -2,17 +2,15 @@ (:require [status-im.components.styles :refer [text1-color color-white color-light-gray - color-gray5 color-blue - color-black]] - [status-im.utils.platform :as p])) + color-black]])) (def toolbar-background1 color-white) (def toolbar-background2 color-light-gray) (def toolbar-height 56) -(def toolbar-icon-width 24) -(def toolbar-icon-spacing 24) +(def toolbar-icon-width 32) +(def toolbar-icon-spacing 8) (def toolbar-gradient {:height 4}) @@ -25,11 +23,6 @@ {:flex-direction :row :height toolbar-height}) -(def toolbar-line - {:height 1 - :background-color color-gray5 - :opacity 0.4}) - (defn toolbar-nav-actions-container [actions] {:width (when (and actions (> (count actions) 0)) (-> (+ toolbar-icon-width toolbar-icon-spacing) @@ -45,9 +38,9 @@ :padding-right 12}) (def toolbar-title-container - (merge (get-in p/platform-specific [:component-styles :toolbar-title-container]) - {:flex 1 - :justifyContent :center})) + {:flex 1 + :alignItems :center + :justifyContent :center}) (def toolbar-title-text {:margin-top 0 @@ -68,11 +61,12 @@ :justify-content :center}) (def toolbar-with-search - {:background-color toolbar-background1 + {:background-color toolbar-background2 :elevation 0}) (def toolbar-with-search-content {:flex 1 + :align-items :center :justify-content :center}) (def toolbar-search-input @@ -85,8 +79,25 @@ (def toolbar-with-search-title {:color color-black + :align-self :center + :text-align :center :font-size 16}) -(def action-default + +;; Specific actions + +(def action-hamburger + {:width 16 + :height 12}) + +(def action-add + {:width 17 + :height 17}) + +(def action-search + {:width 17 + :height 17}) + +(def action-back {:width 24 :height 24}) diff --git a/src/status_im/components/toolbar/view.cljs b/src/status_im/components/toolbar/view.cljs index 9210c9c735..bb6778bec2 100644 --- a/src/status_im/components/toolbar/view.cljs +++ b/src/status_im/components/toolbar/view.cljs @@ -7,7 +7,7 @@ image touchable-highlight]] [status-im.components.sync-state.gradient :refer [sync-state-gradient-view]] - [status-im.components.styles :refer [icon-default + [status-im.components.styles :refer [icon-back icon-search]] [status-im.components.toolbar.actions :as act] [status-im.components.toolbar.styles :as st] @@ -34,8 +34,8 @@ [touchable-highlight {:on-press #(dispatch [:navigate-back]) :accessibility-label id/toolbar-back-button} [view (get-in platform-specific [:component-styles :toolbar-nav-action]) - [image {:source {:uri :icon_back_dark} - :style icon-default}]]]))] + [image {:source {:uri :icon_back} + :style icon-back}]]]))] (or custom-content [view {:style st/toolbar-title-container} [text {:style st/toolbar-title-text @@ -50,8 +50,7 @@ [view st/toolbar-action [image action-image]]]) custom-action)]] - [sync-state-gradient-view] - [view st/toolbar-line]])) + [sync-state-gradient-view]])) (defn- toolbar-search-submit [on-search-submit] (let [text @(subscribe [:get-in [:toolbar-search :text]])] @@ -68,7 +67,10 @@ {:style st/toolbar-search-input :auto-focus true :placeholder search-placeholder - :on-change-text #(dispatch [:set-in [:toolbar-search :text] %])}] + :return-key-type "search" + :on-blur #(dispatch [:set-in [:toolbar-search :show] nil]) + :on-change-text #(dispatch [:set-in [:toolbar-search :text] %]) + :on-submit-editing #(toolbar-search-submit on-search-submit)}] [view [text {:style st/toolbar-with-search-title :font :toolbar-title} @@ -81,11 +83,9 @@ style on-search-submit] :as opts}] - (let [toggle-search-fn #(do - (dispatch [:set-in [:toolbar-search :show] %]) - (dispatch [:set-in [:toolbar-search :text] ""])) + (let [toggle-search-fn #(dispatch [:set-in [:toolbar-search :show] %]) actions (if-not show-search? - (into [(act/search #(toggle-search-fn search-key))] actions))] + (into actions [(act/search #(toggle-search-fn search-key))]))] [toolbar {:style (merge st/toolbar-with-search style) :nav-action (if show-search? (act/back #(toggle-search-fn nil)) diff --git a/src/status_im/components/toolbar_new/actions.cljs b/src/status_im/components/toolbar_new/actions.cljs new file mode 100644 index 0000000000..7153620901 --- /dev/null +++ b/src/status_im/components/toolbar_new/actions.cljs @@ -0,0 +1,47 @@ +(ns status-im.components.toolbar-new.actions + (:require [status-im.components.toolbar-new.styles :as st])) + +(def nothing + {:image {:source nil + :style st/action-default}}) + +(defn hamburger [handler] + {:image {:source {:uri :icon_hamburger_dark} + :style st/action-default} + :handler handler}) + +(defn add [handler] + {:image {:source {:uri :icon_add} + :style st/action-default} + :handler handler}) + +(defn opts [options] + {:image {:source {:uri :icon_options_dark} + :style st/action-default} + :options options}) + +(defn search [handler] + {:image {:source {:uri :icon_search_dark} + :style st/action-default} + :handler handler}) + +(defn search-icon [] + {:image {:source {:uri :icon_search_dark} + :style (merge st/action-default + {:opacity 0.4})}}) + +(defn back [handler] + {:image {:source {:uri :icon_back_dark} + :style st/action-default} + :handler handler}) + +(defn back-white [handler] + {:image {:source {:uri :icon_back_white} + :style st/action-default} + :handler handler}) + +(defn close [handler] + {:image {:source {:uri :icon_close_dark} + :style st/action-default} + :handler handler}) + diff --git a/src/status_im/components/toolbar_new/styles.cljs b/src/status_im/components/toolbar_new/styles.cljs new file mode 100644 index 0000000000..f56874efdb --- /dev/null +++ b/src/status_im/components/toolbar_new/styles.cljs @@ -0,0 +1,82 @@ +(ns status-im.components.toolbar-new.styles + (:require [status-im.components.styles :refer [text1-color + color-white + color-light-gray + color-gray5 + color-blue + color-black]] + [status-im.utils.platform :as p])) + +(def toolbar-background1 color-white) + +(def toolbar-icon-width 24) +(def toolbar-icon-height 24) +(def toolbar-icon-spacing 24) + +(def toolbar-gradient + {:height 4}) + +(defn toolbar-wrapper [background-color] + {:backgroundColor (or background-color toolbar-background1) + :elevation 2}) + +(def toolbar + (merge {:flex-direction :row} + (get-in p/platform-specific [:component-styles :toolbar-new]))) + +(defn toolbar-nav-actions-container [actions] + (let [center? (get-in p/platform-specific [:component-styles :toolbar-title-center?])] + (merge {:flex-direction :row} + (when center? + {:width (when (and actions (pos? (count actions))) + (-> (+ toolbar-icon-width toolbar-icon-spacing) + (* (count actions))))})))) + +(def toolbar-title-container + (merge (get-in p/platform-specific [:component-styles :toolbar-title-container]) + {:flex 1 + :align-self :stretch})) + +(def toolbar-title-text + {:color text1-color + :letter-spacing -0.2 + :font-size 17}) + +(def toolbar-border-container + (get-in p/platform-specific [:component-styles :toolbar-border-container])) + +(def toolbar-border + (get-in p/platform-specific [:component-styles :toolbar-border])) + +(defn toolbar-actions-container [actions-count custom] + (merge {:flex-direction :row} + (when (and (zero? actions-count) (not custom)) + {:width (+ toolbar-icon-width toolbar-icon-spacing)}))) + +(def toolbar-action + {:width toolbar-icon-width + :height toolbar-icon-height + :margin-left toolbar-icon-spacing + :align-items :center + :justify-content :center}) + +(def toolbar-with-search + {:background-color toolbar-background1}) + +(def toolbar-with-search-content + (merge (get-in p/platform-specific [:component-styles :toolbar-with-search-content]) + {:flex 1})) + +(def toolbar-search-input + (merge (get-in p/platform-specific [:component-styles :toolbar-search-input]) + {:flex 1 + :padding-bottom 10 + :font-size 17 + :padding-top 0 + :align-self :stretch + :color color-black})) + +(def action-default + {:width 24 + :height 24}) + diff --git a/src/status_im/components/toolbar_new/view.cljs b/src/status_im/components/toolbar_new/view.cljs new file mode 100644 index 0000000000..885afbe5f9 --- /dev/null +++ b/src/status_im/components/toolbar_new/view.cljs @@ -0,0 +1,114 @@ +(ns status-im.components.toolbar-new.view + (:require [re-frame.core :refer [subscribe dispatch]] + [status-im.components.react :refer [view + icon + text + text-input + image + touchable-highlight]] + [status-im.components.sync-state.gradient :refer [sync-state-gradient-view]] + [status-im.components.styles :refer [icon-default + icon-search]] + [status-im.components.context-menu :refer [context-menu]] + [status-im.components.toolbar-new.actions :as act] + [status-im.components.toolbar-new.styles :as st] + [status-im.accessibility-ids :as id] + [status-im.utils.platform :refer [platform-specific]] + [reagent.core :as r])) + +(defn toolbar [{title :title + nav-action :nav-action + hide-nav? :hide-nav? + actions :actions + custom-action :custom-action + background-color :background-color + custom-content :custom-content + style :style}] + (let [style (merge (st/toolbar-wrapper background-color) style)] + [view {:style style} + [view st/toolbar + [view (st/toolbar-nav-actions-container actions) + (when-not hide-nav? + (if nav-action + [touchable-highlight {:on-press (:handler nav-action)} + [view + [image (:image nav-action)]]] + [touchable-highlight {:on-press #(dispatch [:navigate-back]) + :accessibility-label id/toolbar-back-button} + [view + [image {:source {:uri :icon_back_dark} + :style icon-default}]]]))] + (or custom-content + [view {:style st/toolbar-title-container} + [text {:style st/toolbar-title-text + :font :toolbar-title} + title]]) + [view (st/toolbar-actions-container (count actions) custom-action) + (if actions + (for [{action-image :image + action-options :options + action-handler :handler} actions] + (with-meta + (cond (= action-image :blank) + [view st/toolbar-action] + action-options + [context-menu + [view st/toolbar-action + [image action-image]] + action-options] + :else + [touchable-highlight {:on-press action-handler} + [view st/toolbar-action + [image action-image]]]) + {:key (str "action-" action-image)})) + custom-action)]] + [sync-state-gradient-view] + [view st/toolbar-border-container + [view st/toolbar-border]]])) + +(def search-text-input (r/atom nil)) + +(defn- toolbar-with-search-content [{:keys [show-search? + search-placeholder + title + custom-title + on-search-submit]}] + [view st/toolbar-with-search-content + (if show-search? + [text-input + {:style st/toolbar-search-input + :ref #(reset! search-text-input %) + :auto-focus true + :placeholder search-placeholder + :on-change-text #(dispatch [:set-in [:toolbar-search :text] %])}] + (or custom-title + [view + [text {:style st/toolbar-title-text + :font :toolbar-title} + title]]))]) + +(defn toolbar-with-search [{:keys [show-search? + search-text + search-key + nav-action + actions + style + on-search-submit] + :as opts}] + (let [toggle-search-fn #(do + (dispatch [:set-in [:toolbar-search :show] %]) + (dispatch [:set-in [:toolbar-search :text] ""])) + actions (if show-search? + (if (pos? (count search-text)) + [(act/close #(do + (.clear @search-text-input) + (dispatch [:set-in [:toolbar-search :text] ""])))] + [(act/search-icon)]) + (into [(act/search #(toggle-search-fn search-key))] actions))] + [toolbar {:style style + :nav-action (if show-search? + (act/back #(toggle-search-fn nil)) + nav-action) + :custom-content [toolbar-with-search-content opts] + :actions actions}])) + diff --git a/src/status_im/contacts/handlers.cljs b/src/status_im/contacts/handlers.cljs index 5a6284e9e0..e61557dde7 100644 --- a/src/status_im/contacts/handlers.cljs +++ b/src/status_im/contacts/handlers.cljs @@ -46,8 +46,16 @@ [db [_ _ click-handler]] (-> db (assoc-in [:toolbar-search :show] nil) + (assoc-in [:contact-list-ui-props :edit?] false) (assoc :contacts-click-handler click-handler))) +(defmethod nav/preload-data! :reorder-groups + [db [_ _]] + (assoc db :groups-order (->> (vals (:contact-groups db)) + (remove :pending?) + (sort-by :order >) + (map :group-id)))) + (register-handler :remove-contacts-click-handler (fn [db] (dissoc db @@ -208,21 +216,29 @@ (register-handler :load-default-contacts! (u/side-effect! - (fn [{:keys [chats]}] - (doseq [[id {:keys [name photo-path public-key add-chat? - dapp? dapp-url dapp-hash]}] js-res/default-contacts] - (let [id' (clojure.core/name id)] - (when-not (chats id') - (when add-chat? - (dispatch [:add-chat id' {:name (:en name)}])) - (dispatch [:add-contacts [{:whisper-identity id' - :address (public-key->address id') - :name (:en name) - :photo-path photo-path - :public-key public-key - :dapp? dapp? - :dapp-url (:en dapp-url) - :dapp-hash dapp-hash}]]))))))) + (fn [{:keys [chats groups]}] + (let [default-contacts js-res/default-contacts + default-dapps-group-contacts (mapv #(hash-map :identity (clojure.core/name (first %))) + (filter #(true? (:dapp? (second %))) default-contacts))] + (doseq [[id {:keys [name photo-path public-key add-chat? + dapp? dapp-url dapp-hash]}] default-contacts] + (let [id' (clojure.core/name id)] + (when-not (chats id') + (when add-chat? + (dispatch [:add-chat id' {:name (:en name)}])) + (dispatch [:add-contacts [{:whisper-identity id' + :address (public-key->address id') + :name (:en name) + :photo-path photo-path + :public-key public-key + :dapp? dapp? + :dapp-url (:en dapp-url) + :dapp-hash dapp-hash}]])))) + (dispatch [:add-groups [{:group-id "dapps" + :name (label :t/contacts-group-dapps) + :order 0 + :timestamp (random/timestamp) + :contacts default-dapps-group-contacts}]]))))) (register-handler :add-contacts (after save-contacts!) @@ -326,8 +342,8 @@ (register-handler :remove-contact-from-group (u/side-effect! - (fn [_ [_ {:keys [whisper-identity]} group]] - (let [group' (update group :contacts (remove-contact-from-group whisper-identity))] + (fn [{:keys [contact-groups]} [_ {:keys [whisper-identity]} {:keys [group-id]}]] + (let [group' (update (contact-groups group-id) :contacts (remove-contact-from-group whisper-identity))] (dispatch [:update-group group']))))) (register-handler :remove-contact diff --git a/src/status_im/contacts/screen.cljs b/src/status_im/contacts/screen.cljs index f56dc110af..099cfe729a 100644 --- a/src/status_im/contacts/screen.cljs +++ b/src/status_im/contacts/screen.cljs @@ -15,9 +15,9 @@ [status-im.components.action-button :refer [action-button action-button-item]] [status-im.components.status-bar :refer [status-bar]] - [status-im.components.toolbar.view :refer [toolbar-with-search toolbar]] - [status-im.components.toolbar.actions :as act] - [status-im.components.toolbar.styles :as tst] + [status-im.components.toolbar-new.view :refer [toolbar]] + [status-im.components.toolbar-new.actions :as act] + [status-im.components.toolbar-new.styles :as tst] [status-im.components.drawer.view :refer [open-drawer]] [status-im.components.icons.custom-icons :refer [ion-icon]] [status-im.components.context-menu :refer [context-menu]] @@ -31,31 +31,24 @@ (def contacts-limit 5) (def toolbar-options - [{:text (label :t/new-contact) :value #(dispatch [:navigate-to :new-contact])} - {:text (label :t/edit) :value #(dispatch [:set-in [:contacts-ui-props :edit?] true])} - {:text (label :t/new-group) :value #(dispatch [:open-contact-group-list])}]) + [{:text (label :t/new-contact) :value #(dispatch [:navigate-to :new-contact])} + {:text (label :t/edit) :value #(dispatch [:set-in [:contacts-ui-props :edit?] true])} + {:text (label :t/new-group) :value #(dispatch [:open-contact-group-list])} + {:text (label :t/reorder-groups) :value #(dispatch [:navigate-to :reorder-groups])}]) (defn toolbar-actions [] (let [new-contact? (get-in platform-specific [:contacts :new-contact-in-toolbar?])] - [view st/toolbar-actions - [touchable-highlight - {:on-press #(dispatch [:navigate-to :group-contacts nil :show-search])} - [view st/search-btn - [icon :search_dark]]] - [view st/more-btn - [context-menu - [icon :options_dark] - (if new-contact? toolbar-options (rest toolbar-options))]]])) + [(act/search #(dispatch [:navigate-to :group-contacts nil :show-search])) + (act/opts (if new-contact? toolbar-options (rest toolbar-options)))])) (defn toolbar-view [] - [toolbar {:style tst/toolbar-with-search - :title (label :t/contacts) + [toolbar {:title (label :t/contacts) :nav-action (act/hamburger open-drawer) - :custom-action (toolbar-actions)}]) + :actions (toolbar-actions)}]) (defn toolbar-edit [] - [toolbar {:style tst/toolbar-with-search - :nav-action (act/back #(dispatch [:set-in [:contacts-ui-props :edit?] false])) + [toolbar {:nav-action (act/back #(dispatch [:set-in [:contacts-ui-props :edit?] false])) + :actions [{:image :blank}] :title (label :t/edit-contacts)}]) (defn options-btn [group] @@ -67,16 +60,15 @@ (defn subtitle-view [subtitle contacts-count group extended?] [view (get-in platform-specific [:component-styles :contacts :group-header]) - [text {:style (merge st/contact-group-subtitle - (get-in platform-specific [:component-styles :contacts :subtitle])) - :uppercase? (get-in platform-specific [:contacts :uppercase-subtitles?]) + [text {:style (get-in platform-specific [:component-styles :contacts :subtitle]) :font :medium} subtitle] [text {:style (merge st/contact-group-count - (get-in platform-specific [:component-styles :contacts :subtitle])) + (get-in platform-specific [:component-styles :contacts :subtitle-count])) :uppercase? (get-in platform-specific [:contacts :uppercase-subtitles?]) :font :medium} (str contacts-count)] + [view {:flex 1}] (when extended? [options-btn group])]) @@ -88,10 +80,6 @@ [linear-gradient {:style st/contact-group-header-gradient-top :colors st/contact-group-header-gradient-top-colors}]) -(defn on-scroll-animation [e show-toolbar-shadow?] - (let [offset (.. e -nativeEvent -contentOffset -y)] - (reset! show-toolbar-shadow? (pos? offset)))) - (defn contact-group-form [{:keys [contacts contacts-count group edit? click-handler]}] (let [shadows? (get-in platform-specific [:contacts :group-block-shadows?]) subtitle (:name group)] @@ -100,27 +88,36 @@ [subtitle-view subtitle contacts-count group edit?]) (when (and subtitle shadows?) [group-top-view]) - [view + [view st/contacts-list (doall (map (fn [contact] ^{:key contact} - [contact-view - {:contact contact - :extended? edit? - :on-click (when-not edit? click-handler) - :extend-options (when group - [{:value #(dispatch [:hide-contact contact]) - :text (label :t/delete-contact)} - {:value #(dispatch [:remove-contact-from-group contact group]) - :text (label :t/remove-from-group)}])}]) + [view + [contact-view + {:contact contact + :extended? edit? + :on-click (when-not edit? click-handler) + :extend-options (when group + [{:value #(dispatch [:hide-contact contact]) + :text (label :t/delete-contact) + :style st/delete-contact-text} + {:value #(dispatch [:remove-contact-from-group contact group]) + :text (label :t/remove-from-group)}])}] + (when-not (= contact (last contacts)) + [view st/contact-item-separator-wrapper + [view st/contact-item-separator]])]) contacts))] (when (< contacts-limit contacts-count) - [view st/show-all - [touchable-highlight (when-not edit? {:on-press #(dispatch [:navigate-to :group-contacts group])}) - [view - [text {:style st/show-all-text - :font :medium} - (str (- contacts-count contacts-limit) " " (label :t/more))]]]]) + [view + [view st/contact-item-separator-wrapper + [view st/contact-item-separator]] + [view st/show-all + [touchable-highlight (when-not edit? {:on-press #(dispatch [:navigate-to :group-contacts group])}) + [view + [text {:style st/show-all-text + :uppercase? (get-in platform-specific [:uppercase?]) + :font (get-in platform-specific [:component-styles :contacts :show-all-text-font])} + (str (- contacts-count contacts-limit) " " (label :t/more))]]]]]) (when shadows? [group-bottom-view])])) @@ -148,18 +145,13 @@ contacts-count [:added-contacts-count] click-handler [:get :contacts-click-handler] edit? [:get-in [:contacts-ui-props :edit?]] - groups [:all-added-groups] - show-toolbar-shadow? (r/atom false)] + groups [:all-added-groups]] [view st/contacts-list-container (if edit? [toolbar-edit] [toolbar-view]) - (when @show-toolbar-shadow? - [linear-gradient {:style st/contact-group-header-gradient-bottom - :colors st/contact-group-header-gradient-bottom-colors}]) (if (pos? (+ (count groups) contacts-count)) - [scroll-view {:style st/contact-groups - :onScroll #(on-scroll-animation % show-toolbar-shadow?)} + [scroll-view {:style st/contact-groups} (when (pos? contacts-count) [contact-group-form {:contacts contacts :contacts-count contacts-count diff --git a/src/status_im/contacts/styles.cljs b/src/status_im/contacts/styles.cljs index b3841b33b2..c7fbd79ddc 100644 --- a/src/status_im/contacts/styles.cljs +++ b/src/status_im/contacts/styles.cljs @@ -5,16 +5,15 @@ color-white color-separator color-gray2 + color-gray4 + color-blue + color-light-red color-gray]] [status-im.components.toolbar.styles :refer [toolbar-background1 toolbar-background2]] [status-im.utils.platform :as p])) ;; Contacts list -(def toolbar-shadow - {:height 2 - :background-color toolbar-background2}) - (def toolbar-actions {:flex-direction :row}) @@ -26,6 +25,10 @@ (merge (get-in p/platform-specific [:component-styles :main-tab-list]) {:flex 1})) +(def contacts-list + (merge (get-in p/platform-specific [:component-styles :contacts :contacts-list-container]) + {:background-color color-white})) + (def empty-contact-groups (merge contact-groups {:align-items :center @@ -40,18 +43,11 @@ :font-size 16 :color color-gray2}) -(def contacts-list - {:backgroundColor color-white}) - (def contact-group {:flex-direction :column}) -(def contact-group-subtitle - {:margin-left 16}) - (def contact-group-count - {:flex 1 - :margin-left 8 + {:margin-left 8 :opacity 0.6}) (def contact-group-header-gradient-top @@ -74,24 +70,25 @@ "rgba(24, 52, 76, 0.05)"]) (def show-all - {:flexDirection :row - :alignItems :center - :height 56 - :backgroundColor color-white}) + (merge (get-in p/platform-specific [:component-styles :contacts :show-all]) + {:flexDirection :row + :alignItems :center + :backgroundColor color-white})) (def show-all-text - {:marginLeft 72 - :fontSize 14 - :color text3-color - ;; ios only: - :letterSpacing 0.5}) + (get-in p/platform-specific [:component-styles :contacts :show-all-text])) -(def contact-separator-container +(def contact-item-separator-wrapper {:background-color color-white}) +(def contact-item-separator + (get-in p/platform-specific [:component-styles :contacts :separator])) + (def contact-container - {:flex-direction :row - :background-color color-white}) + (merge (get-in p/platform-specific [:component-styles :contacts :contact-container]) + {:flex-direction :row + :align-items :center + :background-color color-white})) (def letter-container {:paddingTop 11 @@ -102,10 +99,6 @@ {:fontSize 24 :color text3-color}) -(def contact-photo-container - {:marginTop 4 - :marginLeft 12}) - (def option-inner-container {:flex 1 :flex-direction :row @@ -139,21 +132,20 @@ :height 8}) (def contact-inner-container - {:flex 1 - :flexDirection :row - :height 56 - :margin-right 16 - :backgroundColor color-white}) + (merge (get-in p/platform-specific [:component-styles :contacts :contact-inner-container]) + {:flex 1 + :flexDirection :row + :align-items :center + :padding-left 16 + :backgroundColor color-white})) (def info-container - {:flex 1 - :flexDirection :column - :margin-left 12 - :justifyContent :center}) + (merge (get-in p/platform-specific [:component-styles :contacts :info-container]) + {:flex 1 + :flexDirection :column})) (def name-text - {:fontSize 15 - :color text1-color}) + (get-in p/platform-specific [:component-styles :contacts :name-text])) (def info-text {:marginTop 1 @@ -162,8 +154,7 @@ (def more-btn {:width 24 - :height 56 - :margin-right 14 + :height 24 :alignItems :center :justifyContent :center}) @@ -231,3 +222,6 @@ :background-color color-white :align-items :center :justify-content :center}) + +(def delete-contact-text + {:color color-light-red}) \ No newline at end of file diff --git a/src/status_im/contacts/subs.cljs b/src/status_im/contacts/subs.cljs index 6d34d6fa9e..64ad06d2fe 100644 --- a/src/status_im/contacts/subs.cljs +++ b/src/status_im/contacts/subs.cljs @@ -30,12 +30,15 @@ (sort-contacts) (reaction))))) +(defn filter-group-contacts [group-contacts contacts] + (filter #(group-contacts (:whisper-identity %)) contacts)) + (register-sub :all-added-group-contacts (fn [db [_ group-id]] (let [contacts (subscribe [:all-added-contacts]) group-contacts (reaction (into #{} (map #(:identity %) (get-in @db [:contact-groups group-id :contacts]))))] - (reaction (filter #(@group-contacts (:whisper-identity %)) @contacts))))) + (reaction (filter-group-contacts @group-contacts @contacts))))) (register-sub :all-added-group-contacts-with-limit (fn [db [_ group-id limit]] diff --git a/src/status_im/contacts/views/contact.cljs b/src/status_im/contacts/views/contact.cljs index 67cc593ae9..7f319d9129 100644 --- a/src/status_im/contacts/views/contact.cljs +++ b/src/status_im/contacts/views/contact.cljs @@ -18,7 +18,8 @@ [text {:style st/letter-text} letter])]) (defn options-btn [contact more-options] - (let [options [{:value #(dispatch [:hide-contact contact]) :text (label :t/delete-contact)}]] + (let [options [{:value #(dispatch [:hide-contact contact]) :text (label :t/delete-contact) + :style st/delete-contact-text}]] [view st/more-btn [context-menu [icon :options_gray] @@ -26,7 +27,7 @@ ;;TODO: maybe it's better to have only one global component contact-view with the types: default, extended and toggle ;;TODO: at the moment toggle in the other component new-group-contact -(defview contact-view [{{:keys [whisper-identity letter dapp?] :as contact} :contact +(defview contact-view [{{:keys [whisper-identity letter] :as contact} :contact :keys [extended? letter? on-click extend-options info]}] [chat [:get-chat whisper-identity]] [touchable-highlight @@ -38,6 +39,4 @@ [letter-view letter]) [contact-inner-view {:contact contact :info info}] (when extended? - [options-btn contact extend-options])] - [view st/contact-separator-container - [view (get-in platform-specific [:component-styles :contacts :separator])]]]]) + [options-btn contact extend-options])]]]) diff --git a/src/status_im/contacts/views/contact_inner.cljs b/src/status_im/contacts/views/contact_inner.cljs index df185d5310..752c7a3752 100644 --- a/src/status_im/contacts/views/contact_inner.cljs +++ b/src/status_im/contacts/views/contact_inner.cljs @@ -6,7 +6,7 @@ [status-im.i18n :refer [get-contact-translated label]])) (defn contact-photo [contact] - [view st/contact-photo-container + [view [contact-icon-contacts-tab contact]]) (defn contact-inner-view diff --git a/src/status_im/contacts/views/contact_list.cljs b/src/status_im/contacts/views/contact_list.cljs index 0025f6c045..61779192f1 100644 --- a/src/status_im/contacts/views/contact_list.cljs +++ b/src/status_im/contacts/views/contact_list.cljs @@ -3,15 +3,16 @@ (:require [re-frame.core :refer [subscribe dispatch dispatch-sync]] [status-im.components.react :refer [view text image + icon touchable-highlight list-view list-item]] [status-im.contacts.views.contact :refer [contact-view]] [status-im.components.text-field.view :refer [text-field]] [status-im.components.status-bar :refer [status-bar]] - [status-im.components.toolbar.view :refer [toolbar-with-search toolbar]] - [status-im.components.toolbar.actions :as act] - [status-im.components.toolbar.styles :refer [toolbar-background1]] + [status-im.components.toolbar-new.view :refer [toolbar-with-search toolbar]] + [status-im.components.toolbar-new.actions :as act] + [status-im.components.toolbar-new.styles :refer [toolbar-background1]] [status-im.components.drawer.view :refer [drawer-view open-drawer]] [status-im.components.image-button.view :refer [scan-button]] [status-im.contacts.styles :as st] @@ -42,14 +43,20 @@ [text {:style st/name-text} (label :t/new-public-group-chat)]]]]]]) -(defn render-row [chat-modal click-handler action params] +(defn render-row [chat-modal click-handler action params group edit?] (fn [row _ _] (list-item ^{:key row} - [contact-view {:contact row - :letter? chat-modal - :on-click (when click-handler - #(click-handler row action params))}]))) + [contact-view {:contact row + :letter? chat-modal + :extended? edit? + :extend-options (when group + [{:value #(dispatch [:hide-contact row]) + :text (label :t/delete-contact)} + {:value #(dispatch [:remove-contact-from-group row group]) + :text (label :t/remove-from-group)}]) + :on-click (when (and (not edit?) click-handler) + #(click-handler row action params))}]))) (defn contact-list-entry [{:keys [click-handler icon icon-style label]}] [touchable-highlight @@ -63,23 +70,36 @@ :number-of-lines 1} label]]]]]) -(defview contact-list-toolbar [] - [group [:get :contacts-group] - modal [:get :modal] - show-search [:get-in [:toolbar-search :show]]] - [view - [status-bar] - (toolbar-with-search - {:show-search? (= show-search :contact-list) - :search-key :contact-list - :title (if-not group - (label :t/contacts) - (or (:name group) (label :t/contacts-group-new-chat))) - :search-placeholder (label :t/search-for) - :actions (when modal - (act/back #(dispatch [:navigate-back])))})]) +(defview contact-list-toolbar-edit [group] + [toolbar {:nav-action (act/back #(dispatch [:set-in [:contact-list-ui-props :edit?] false])) + :actions [{:image :blank}] + :title (if-not group + (label :t/contacts) + (or (:name group) (label :t/contacts-group-new-chat)))}]) -(defview contacts-list-view [group modal click-handler action] +(defview contact-list-toolbar [group] + [modal [:get :modal] + show-search [:get-in [:toolbar-search :show]] + search-text [:get-in [:toolbar-search :text]]] + (toolbar-with-search + {:show-search? (= show-search :contact-list) + :search-text search-text + :search-key :contact-list + :title (if-not group + (label :t/contacts) + (or (:name group) (label :t/contacts-group-new-chat))) + :search-placeholder (label :t/search-contacts) + :actions (if modal + (act/back #(dispatch [:navigate-back])) + [(act/opts [{:text (label :t/edit) + :value #(dispatch [:set-in [:contact-list-ui-props :edit?] true])}])])})) + +(defn render-separator [_ row-id _] + (list-item ^{:key row-id} + [view st/contact-item-separator-wrapper + [view st/contact-item-separator]])) + +(defview contacts-list-view [group modal click-handler action edit?] [contacts [:all-added-group-contacts-filtered (:group-id group)] params [:get :contacts-click-params]] (let [show-new-group-chat? (and (= group :people) @@ -87,25 +107,30 @@ (when contacts [list-view {:dataSource (lw/to-datasource contacts) :enableEmptySections true - :renderRow (render-row modal click-handler action params) + :renderRow (render-row modal click-handler action params group edit?) :bounces false :keyboardShouldPersistTaps true :renderHeader #(list-item [view - (if show-new-group-chat? - [new-group-chat-view]) - [view st/spacing-top]]) + (when show-new-group-chat? + [new-group-chat-view])]) :renderFooter #(list-item [view st/spacing-bottom]) + :renderSeparator render-separator :style st/contacts-list}]))) (defview contact-list [] [action [:get :contacts-click-action] modal [:get :modal] + edit? [:get-in [:contact-list-ui-props :edit?]] click-handler [:get :contacts-click-handler] group [:get :contacts-group]] [drawer-view - [view st/contacts-list-container - [contact-list-toolbar] + [view {:flex 1} + [view + [status-bar] + (if edit? + [contact-list-toolbar-edit group] + [contact-list-toolbar group])] ;; todo add stub (when modal [view @@ -122,4 +147,4 @@ :label (label (if (= :request action) :t/show-qr :t/scan-qr))}]]) - [contacts-list-view group modal click-handler action]]]) + [contacts-list-view group modal click-handler action edit?]]]) diff --git a/src/status_im/ios/core.cljs b/src/status_im/ios/core.cljs index 6c3c20fb67..15e6b409fe 100644 --- a/src/status_im/ios/core.cljs +++ b/src/status_im/ios/core.cljs @@ -24,6 +24,7 @@ [status-im.chats-list.screen :refer [chats-list]] [status-im.new-group.screen-private :refer [new-group contact-group]] [status-im.new-group.views.contact-list :refer [contact-group-list]] + [status-im.new-group.views.reorder-groups :refer [reorder-groups]] [status-im.new-group.screen-public :refer [new-public-group]] [status-im.participants.views.add :refer [new-participants]] [status-im.participants.views.remove :refer [remove-participants]] @@ -93,6 +94,7 @@ :contact-list main-tabs :contact-list-search-results contacts-search-results :group-contacts contact-list + :reorder-groups reorder-groups :contact-group contact-group :contact-group-list contact-group-list :new-contact new-contact diff --git a/src/status_im/ios/platform.cljs b/src/status_im/ios/platform.cljs index 6a2d8d4627..8b39a797a8 100644 --- a/src/status_im/ios/platform.cljs +++ b/src/status_im/ios/platform.cljs @@ -16,6 +16,13 @@ :color "#2f3031"}} :toolbar {:border-bottom-color styles/color-gray3 :border-bottom-width 0.5} + :toolbar-new {:height 56 + :padding-top 20 + :padding-left 16 + :padding-right 16} + :toolbar-title-container {:align-items :center} + :toolbar-title-center? true + :toolbar-with-search-content {:align-items :center} :sized-text {:margin-top -5 :additional-height 5} :actions-list-view {:border-bottom-color styles/color-gray3 @@ -40,34 +47,87 @@ :icon {:padding-top 0 :bottom -4 :justify-content :flex-end}}} - :contacts {:subtitle {:color styles/color-black + :contacts {:subtitle {:color styles/text1-color :font-size 16 :letter-spacing -0.2} - :separator {:margin-left 68 + :subtitle-count {:color styles/color-gray4 + :font-size 16 + :letter-spacing -0.2} + :separator {:margin-left 72 :height 1 :background-color styles/color-gray5 - :opacity 0.4} + :opacity 0.5} + :info-container {:margin-left 16} + :contact-inner-container {:height 63} :icon-check {:border-radius 50 :width 24 :height 24} :group-header {:flexDirection :row :alignItems :center :margin-top 24 + :padding-left 16 + :padding-right 16 :height 53 - :backgroundColor styles/color-white}} + :backgroundColor styles/color-white} + :show-all {:padding-left 72 + :height 64} + :show-all-text {:fontSize 16 + :color styles/color-gray4 + :letter-spacing -0.2} + :show-all-text-font :default + :contact-container {:padding-right 16} + :name-text {:fontSize 17 + :line-height 20 + :letter-spacing -0.2 + :color styles/text1-color}} + :new-group {:group-name-text {:font-size 13} + :members-text {:letter-spacing -0.2 + :font-size 16} + :members-text-count {:letter-spacing -0.2 + :font-size 16} + :add-text {:margin-left 14 + :letter-spacing -0.2 + :font-size 17 + :line-height 20} + :delete-group-text {:letter-spacing -0.2 + :font-size 17 + :line-height 20} + :delete-group-prompt-text {:font-size 13 + :letter-spacing -0.1} + :contact-container {:height 63} + :delete-group-container {:padding-left 68}} + :reorder-groups {:order-item-separator {:margin-left 16 + :opacity 0.5} + :order-item-container {:height 63} + :order-item-icon {:padding-right 20} + :order-item-label {:padding-left 16 + :font-size 17 + :line-height 20 + :letter-spacing -0.2} + :order-item-contacts {:font-size 17 + :line-height 20 + :letter-spacing -0.2}} + :confirm-button-label {:color styles/color-white + :font-size 17 + :line-height 20 + :letter-spacing -0.2} :bottom-gradient {:height 1} :input-label {:left 0} :input-error-text {:margin-left 0} :main-tab-list {:margin-bottom 72} + :toolbar-search-input {:padding-left 10} :toolbar-nav-action {:width 46 :height 56 :align-items :center :justify-content :center} + :toolbar-border-container {:background-color styles/color-white} + :toolbar-border {:height 1 + :background-color styles/color-gray5 + :opacity 0.5} :toolbar-last-activity {:color styles/text2-color :background-color :transparent :top 0 - :font-size 14} - :toolbar-title-container {:align-items :center}}) + :font-size 14}}) (def fonts {:light {:font-family "SFUIText-Light"} @@ -75,7 +135,7 @@ :medium {:font-family "SFUIText-Medium"} :bold {:font-family "SFUIText-Bold"} - :toolbar-title {:font-family "SFUIText-Medium"}}) + :toolbar-title {:font-family "SFUIText-Semibold"}}) ;; Dialogs @@ -96,12 +156,14 @@ :tabs {:tab-shadows? false} :chats {:action-button? false :new-chat-in-toolbar? true} + :uppercase? false :contacts {:action-button? false :new-contact-in-toolbar? true - :uppercase-subtitles? true :group-block-shadows? false} :discover {:uppercase-subtitles? true} :public-group-icon-container {:margin-top 2} :private-group-icon-container {:margin-top 2} + :group-chat-focus-line-color styles/color-gray5 + :group-chat-focus-line-height 1 :public-group-chat-hash-style {:top 6 :left 3}}) diff --git a/src/status_im/new_group/handlers.cljs b/src/status_im/new_group/handlers.cljs index 836d6858bf..15835f4293 100644 --- a/src/status_im/new_group/handlers.cljs +++ b/src/status_im/new_group/handlers.cljs @@ -218,8 +218,7 @@ (-> (fn [db [_ new-group]] (assoc db :new-group new-group)) ((enrich update-group)) - ((after update-group!)) - ((after show-contact-list!)))) + ((after update-group!)))) (defn save-groups! [{:keys [new-groups]} _] (groups/save-all new-groups)) @@ -258,3 +257,35 @@ (defmethod nav/preload-data! :new-public-group [db] (dissoc db :public-group/topic)) + +(defn move-item [v from to] + (if (< from to) + (concat (subvec v 0 from) + (subvec v (inc from) (inc to)) + [(v from)] + (subvec v (inc to))) + (concat (subvec v 0 to) + [(v from)] + (subvec v to from) + (subvec v (inc from))))) + +(register-handler :change-group-order + (fn [{:keys [groups-order] :as db} [_ from to]] + (if (>= to 0) + (assoc db :groups-order (move-item (vec groups-order) from to)) + db))) + +(register-handler :update-groups + (after save-groups!) + (fn [db [_ new-groups]] + (-> db + (update :contact-groups merge (map #(vector (:group-id %) %) new-groups)) + (assoc db :new-groups new-groups)))) + +(register-handler :save-group-order + (u/side-effect! + (fn [{:keys [groups-order contact-groups] :as db} _] + (let [new-groups (mapv #(assoc (contact-groups (second %)) :order (first %)) + (map-indexed vector (reverse groups-order)))] + (dispatch [:update-groups new-groups]) + (dispatch [:navigate-to-clean :contact-list]))))) diff --git a/src/status_im/new_group/screen_private.cljs b/src/status_im/new_group/screen_private.cljs index debb4d4a20..eeddd43de4 100644 --- a/src/status_im/new_group/screen_private.cljs +++ b/src/status_im/new_group/screen_private.cljs @@ -3,6 +3,7 @@ (:require [re-frame.core :refer [subscribe dispatch]] [status-im.resources :as res] [status-im.contacts.views.contact :refer [contact-view]] + [status-im.contacts.styles :as cst] [status-im.components.react :refer [view text image @@ -12,10 +13,9 @@ list-item]] [status-im.components.text-field.view :refer [text-field]] [status-im.components.confirm-button :refer [confirm-button]] - [status-im.components.styles :refer [color-blue - separator-color]] + [status-im.components.styles :refer [color-blue color-gray5]] [status-im.components.status-bar :refer [status-bar]] - [status-im.components.toolbar.view :refer [toolbar-with-search toolbar]] + [status-im.components.toolbar-new.view :refer [toolbar]] [status-im.utils.platform :refer [platform-specific]] [status-im.utils.listview :refer [to-datasource]] [status-im.new-group.views.contact :refer [new-group-contact]] @@ -40,17 +40,19 @@ [new-chat-name [:get :new-chat-name]] [view [text-field - {:error (when - (not (s/valid? ::v/not-illegal-name new-chat-name)) - (label :t/illegal-group-chat-name)) - :wrapper-style st/group-chat-name-wrapper - :error-color color-blue - :line-color separator-color - :label-hidden? true - :input-style st/group-chat-name-input - :auto-focus true - :on-change-text #(dispatch [:set :new-chat-name %]) - :value new-chat-name}]]) + {:error (when + (not (s/valid? ::v/not-illegal-name new-chat-name)) + (label :t/illegal-group-chat-name)) + :error-color color-blue + :wrapper-style st/group-chat-name-wrapper + :line-color color-gray5 + :focus-line-color st/group-chat-focus-line-color + :focus-line-height st/group-chat-focus-line-height + :label-hidden? true + :input-style st/group-chat-name-input + :auto-focus true + :on-change-text #(dispatch [:set :new-chat-name %]) + :value new-chat-name}]]) (defview new-group [] [contacts [:all-added-contacts]] @@ -71,35 +73,50 @@ [list-view {:dataSource (to-datasource contacts) :renderRow (fn [row _ _] - (list-item [new-group-contact row])) - :style st/contacts-list}]]]) + (list-item [new-group-contact row]))}]]]) (defview new-contacts-group-toolbar [edit?] [view [status-bar] [toolbar - {:title (label (if edit? :t/edit-group :t/new-group))}]]) + {:title (label (if edit? :t/edit-group :t/new-group)) + :actions [{:image :blank}]}]]) (defn chat-name-view [contacts-count] [view st/chat-name-container - [text {:style st/group-name-text - :font :medium} + [text {:style st/group-name-text} (label :t/group-name)] [group-name-input] - [text {:style st/members-text - :font :medium} - (str (label :t/group-members) " " contacts-count)] + [view st/members-container + [text {:style st/members-text + :font :medium} + (label :t/group-members)] + [text {:style st/members-text-count + :font :medium} + contacts-count]] [touchable-highlight {:on-press #(dispatch [:navigate-forget :contact-group-list])} [view st/add-container - [icon :add_blue st/add-icon] - [text {:style st/add-text} (label :t/add-members)]]]]) + [view st/add-icon-container + [icon :add_blue st/add-icon]] + [text {:style st/add-text + :font :medium + :uppercase? (get-in platform-specific [:uppercase?])} + (label :t/add-members)]]]]) (defn delete-btn [on-press] [touchable-highlight {:on-press on-press} [view st/delete-group-container - [text {:style st/delete-group-text} (label :t/delete-group)] + [text {:style st/delete-group-text + :font :medium + :uppercase? (get-in platform-specific [:uppercase?])} + (label :t/delete-group)] [text {:style st/delete-group-prompt-text} (label :t/delete-group-prompt)]]]) +(defn render-separator [_ row-id _] + (list-item ^{:key row-id} + [view cst/contact-item-separator-wrapper + [view cst/contact-item-separator]])) + ;;TODO: should be refactored into one common function for group chats and contact groups (defview contact-group [] [contacts [:selected-group-contacts] @@ -119,9 +136,11 @@ :extend-options [{:value #(dispatch [:deselect-contact (:whisper-identity row)]) :text (label :t/remove-from-group)}] :extended? true}])) - :style st/contacts-list}] + :renderSeparator render-separator}] (when group - [delete-btn #(dispatch [:update-group (assoc group :pending? true)])]) + [delete-btn #(do + (dispatch [:update-group (assoc group :pending? true)]) + (dispatch [:navigate-to-clean :contact-list]))]) (when save-btn-enabled? [confirm-button (label :t/save) (if group #(dispatch [:update-group-after-edit group group-name]) diff --git a/src/status_im/new_group/screen_public.cljs b/src/status_im/new_group/screen_public.cljs index 30116df920..1f2f8bbbdd 100644 --- a/src/status_im/new_group/screen_public.cljs +++ b/src/status_im/new_group/screen_public.cljs @@ -11,7 +11,7 @@ list-item]] [status-im.components.text-field.view :refer [text-field]] [status-im.components.styles :refer [color-blue - separator-color]] + color-gray4]] [status-im.components.status-bar :refer [status-bar]] [status-im.components.toolbar.view :refer [toolbar]] [status-im.utils.listview :refer [to-datasource]] @@ -45,7 +45,7 @@ (label :t/topic-format)) :wrapper-style st/group-chat-name-wrapper :error-color color-blue - :line-color separator-color + :line-color color-gray4 :label-hidden? true :input-style st/group-chat-topic-input :auto-focus true diff --git a/src/status_im/new_group/styles.cljs b/src/status_im/new_group/styles.cljs index 25615149f0..1ba85033aa 100644 --- a/src/status_im/new_group/styles.cljs +++ b/src/status_im/new_group/styles.cljs @@ -5,9 +5,17 @@ text2-color color-light-blue color-light-red + color-light-gray selected-contact-color - color-gray4]] - [status-im.utils.platform :refer [platform-specific]])) + color-gray4 + color-gray5]] + [status-im.utils.platform :refer [platform-specific] :as p])) + +(defn ps-reorder [item] + (get-in platform-specific [:component-styles :reorder-groups item])) + +(defn ps-new-group [item] + (get-in platform-specific [:component-styles :new-group item])) (defn toolbar-icon [enabled?] {:width 20 @@ -19,12 +27,23 @@ :flex-direction :column :background-color color-white}) +(def reorder-groups-container + {:flex 1 + :flex-direction :column + :background-color color-light-gray}) + +(def reorder-list-container + (merge {:flex 1} + (ps-reorder :reorder-list-container))) + (def chat-name-container - {:margin-left 16}) + {:margin-top 21 + :margin-left 16}) (def group-chat-name-input - {:font-size 14 - :color text1-color}) + {:font-size 17 + :letter-spacing -0.2 + :color text1-color}) (def group-chat-topic-input {:font-size 14 @@ -38,31 +57,46 @@ :position :absolute} (get-in platform-specific [:public-group-chat-hash-style]))) +(def group-chat-focus-line-color + (get-in platform-specific [:group-chat-focus-line-color])) + +(def group-chat-focus-line-height + (get-in platform-specific [:group-chat-focus-line-height])) + (def group-chat-name-wrapper - {:padding-top 0}) + {:padding-top 0 + :height 40 + :padding-bottom 0}) (def group-name-text - {:margin-top 11 - :margin-bottom 10 - :letter-spacing -0.1 - :color color-gray4 - :font-size 13 - :line-height 20}) + (merge (ps-new-group :group-name-text) + {:letter-spacing -0.1 + :color color-gray4})) + +(def members-container + {:flex-direction :row + :padding-top 20}) (def members-text - {:margin-top 10 - :margin-bottom 8 - :letter-spacing -0.2 - :color color-gray4 - :font-size 16 - :line-height 19}) + (merge (ps-new-group :members-text) + {:color color-gray4})) + +(def members-text-count + (merge (ps-new-group :members-text-count) + {:margin-left 8 + :color color-gray4 + :opacity 0.6})) (def add-container {:flex-direction :row :align-items :center - :margin-top 16 - :margin-bottom 16 - :margin-right 20}) + :height 64 + :margin-top 12}) + +(def add-icon-container + {:width 40 + :align-items :center + :justify-content :center}) (def add-icon {:align-items :center @@ -70,31 +104,22 @@ :height 24}) (def add-text - {:margin-left 32 - :color color-light-blue - :letter-spacing -0.2 - :font-size 17 - :line-height 20}) + (merge (ps-new-group :add-text) + {:color color-light-blue})) (def delete-group-text - {:color color-light-red - :letter-spacing 0.5 - :font-size 14 - :line-height 20}) + (merge (ps-new-group :delete-group-text) + {:color color-light-red})) (def delete-group-prompt-text - {:color color-gray4 - :font-size 14 - :line-height 20}) - -(def contacts-list - {:background-color :white}) + (merge (ps-new-group :delete-group-prompt-text) + {:color color-gray4})) (def contact-container - {:flex-direction :row - :justify-content :center - :align-items :center - :height 56}) + (merge (ps-new-group :contact-container) + {:flex-direction :row + :justify-content :center + :align-items :center})) (def selected-contact {:background-color selected-contact-color}) @@ -115,6 +140,52 @@ :height 12}) (def delete-group-container - {:height 56 - :padding-left 72 - :margin-top 15}) \ No newline at end of file + (merge (ps-new-group :delete-group-container) + {:height 64 + :padding-top 12})) + +(def order-item-container + {:background-color color-white}) + +(def order-item-inner-container + (merge {:flex-direction :row + :align-items :center} + (ps-reorder :order-item-container))) + +(def order-item-label + (ps-reorder :order-item-label)) + +(def order-item-contacts + (merge (ps-reorder :order-item-contacts) + {:padding-left 8 + :color color-gray4})) + +(def order-item-icon + (ps-reorder :order-item-icon)) + +(def order-item-separator-wrapper + {:background-color color-white}) + +(def order-item-separator + (merge {:height 1 + :background-color color-gray5} + (ps-reorder :order-item-separator))) + +(def toolbar-title-with-count-text + {:color text1-color + :letter-spacing -0.2 + :font-size 17}) + +(def toolbar-title-with-count-text-count + (merge toolbar-title-with-count-text + {:color "#628fe3"})) + +(def toolbar-title-with-count + {:flex-direction :row}) + +(def toolbar-title-with-count-container + {:padding-left 6}) + + + + diff --git a/src/status_im/new_group/subs.cljs b/src/status_im/new_group/subs.cljs index 738b55ac04..a7a332db47 100644 --- a/src/status_im/new_group/subs.cljs +++ b/src/status_im/new_group/subs.cljs @@ -11,9 +11,11 @@ (let [contacts (subscribe [:get :selected-contacts])] (reaction (count @contacts))))) +(defn filter-contacts [selected-contacts added-contacts] + (filter #(selected-contacts (:whisper-identity %)) added-contacts)) + (register-sub :selected-group-contacts (fn [_ _] (let [selected-contacts (subscribe [:get :selected-contacts]) added-contacts (subscribe [:all-added-contacts])] - (reaction (do @selected-contacts ;;TODO: doesn't work without this line :( - (filter #(@selected-contacts (:whisper-identity %)) @added-contacts)))))) + (reaction (filter-contacts @selected-contacts @added-contacts))))) diff --git a/src/status_im/new_group/views/contact.cljs b/src/status_im/new_group/views/contact.cljs index 20fca109ff..7097a797c7 100644 --- a/src/status_im/new_group/views/contact.cljs +++ b/src/status_im/new_group/views/contact.cljs @@ -24,6 +24,4 @@ [view (merge st/icon-check-container {:background-color (if checked color-light-blue color-gray5)}) (when checked - [icon :check_on st/check-icon])]]] - [view cst/contact-separator-container - [view (get-in platform-specific [:component-styles :contacts :separator])]]]]) + [icon :check_on st/check-icon])]]]]]) diff --git a/src/status_im/new_group/views/contact_list.cljs b/src/status_im/new_group/views/contact_list.cljs index 69d08511bb..3de834a44f 100644 --- a/src/status_im/new_group/views/contact_list.cljs +++ b/src/status_im/new_group/views/contact_list.cljs @@ -7,32 +7,52 @@ list-item]] [status-im.components.confirm-button :refer [confirm-button]] [status-im.components.status-bar :refer [status-bar]] - [status-im.components.toolbar.view :refer [toolbar-with-search]] + [status-im.components.toolbar-new.view :refer [toolbar-with-search]] [status-im.utils.listview :refer [to-datasource]] [status-im.new-group.views.contact :refer [new-group-contact]] [status-im.new-group.styles :as st] + [status-im.contacts.styles :as cst] [status-im.i18n :refer [label]])) -(defn contact-list-toolbar [contacts-count show-search?] +(defn title-with-count [title count-value] + [view st/toolbar-title-with-count + [text {:style st/toolbar-title-with-count-text + :font :toolbar-title} + title] + (when (pos? count-value) + [view st/toolbar-title-with-count-container + [text {:style st/toolbar-title-with-count-text-count + :font :toolbar-title} + count-value]])]) + +(defn contact-list-toolbar [contacts-count show-search? search-text] (toolbar-with-search {:show-search? (= show-search? :contact-group-list) + :search-text search-text :search-key :contact-group-list - :title (str (label :t/new-group) " (" contacts-count ")") - :search-placeholder (label :t/search-for)})) + :custom-title (title-with-count (label :t/new-group) contacts-count) + :search-placeholder (label :t/search-contacts)})) + +(defn render-separator [_ row-id _] + (list-item ^{:key row-id} + [view cst/contact-item-separator-wrapper + [view cst/contact-item-separator]])) (defview contact-group-list [] [contacts [:all-added-group-contacts-filtered] selected-contacts-count [:selected-contacts-count] - show-search [:get-in [:toolbar-search :show]]] + show-search [:get-in [:toolbar-search :show]] + search-text [:get-in [:toolbar-search :text]]] [view st/new-group-container [status-bar] - [contact-list-toolbar selected-contacts-count show-search] + [contact-list-toolbar selected-contacts-count show-search search-text] [view {:flex 1} [list-view {:dataSource (to-datasource contacts) :renderRow (fn [row _ _] (list-item ^{:key row} [new-group-contact row])) - :style st/contacts-list + :renderSeparator render-separator + :style cst/contacts-list :keyboardShouldPersistTaps true}]] (when (pos? selected-contacts-count) [confirm-button (label :t/next) #(dispatch [:navigation-replace :contact-group])])]) diff --git a/src/status_im/new_group/views/reorder_groups.cljs b/src/status_im/new_group/views/reorder_groups.cljs new file mode 100644 index 0000000000..803fce4683 --- /dev/null +++ b/src/status_im/new_group/views/reorder_groups.cljs @@ -0,0 +1,76 @@ +(ns status-im.new-group.views.reorder-groups + (:require-macros [status-im.utils.views :refer [defview]]) + (:require [re-frame.core :refer [dispatch dispatch-sync]] + [status-im.components.react :refer [view + text + icon + linear-gradient + touchable-highlight + list-item]] + [status-im.components.confirm-button :refer [confirm-button]] + [status-im.components.status-bar :refer [status-bar]] + [status-im.components.toolbar-new.view :refer [toolbar]] + [status-im.components.sortable-list-view :refer [sortable-list-view sortable-item]] + [status-im.utils.listview :refer [to-datasource]] + [status-im.utils.platform :refer [android?]] + [status-im.new-group.styles :as st] + [status-im.contacts.styles :as cst] + [status-im.i18n :refer [label label-pluralize]] + [status-im.utils.platform :refer [platform-specific]] + [reagent.core :as r])) + +(defn toolbar-view [] + [toolbar {:actions [{:image :blank}] + :title (label :t/reorder-groups)}]) + +(defn group-item [{:keys [name contacts] :as group}] + (let [cnt (count contacts)] + [view st/order-item-container + [view st/order-item-inner-container + [text {:style st/order-item-label} + name] + [text {:style st/order-item-contacts} + (str cnt " " (label-pluralize cnt :t/contact-s))] + [view {:flex 1}] + [view st/order-item-icon + [icon :grab_gray]]]])) + +(defn top-shaddow [] + [linear-gradient {:style cst/contact-group-header-gradient-bottom + :colors cst/contact-group-header-gradient-bottom-colors}]) + +(defn bottom-shaddow [] + [linear-gradient {:style cst/contact-group-header-gradient-top + :colors cst/contact-group-header-gradient-top-colors}]) + +(defn render-separator [last shadows?] + (fn [_ row-id _] + (list-item + (if (= row-id last) + (when shadows? + ^{:key "bottom-shaddow"} + [bottom-shaddow]) + ^{:key row-id} + [view st/order-item-separator-wrapper + [view st/order-item-separator]])))) + +(defview reorder-groups [] + [groups [:get :contact-groups] + order [:get :groups-order] + shadows? (get-in platform-specific [:contacts :group-block-shadows?])] + (let [this (r/current-component)] + [view st/reorder-groups-container + [status-bar] + [toolbar-view] + [view st/reorder-list-container + (when shadows? + [top-shaddow]) + [sortable-list-view + {:data groups + :order order + :on-row-moved #(do (dispatch-sync [:change-group-order (:from %) (:to %)]) + (.forceUpdate this)) + :render-row (fn [row] + (sortable-item [group-item row])) + :render-separator (render-separator (last order) shadows?)}]] + [confirm-button (label :t/save) #(dispatch [:save-group-order])]])) diff --git a/src/status_im/qr_scanner/styles.cljs b/src/status_im/qr_scanner/styles.cljs index 7e92540003..97e81d5b95 100644 --- a/src/status_im/qr_scanner/styles.cljs +++ b/src/status_im/qr_scanner/styles.cljs @@ -1,6 +1,7 @@ (ns status-im.qr-scanner.styles (:require [status-im.components.styles :refer [color-white]] - [status-im.components.toolbar.styles :refer [toolbar-height]])) + [status-im.components.toolbar.styles :refer [toolbar-height]] + [status-im.utils.platform :as p])) (def barcode-scanner-container {:flex 1 diff --git a/src/status_im/translations/en.cljs b/src/status_im/translations/en.cljs index 290a41f1ca..912cc2f8e8 100644 --- a/src/status_im/translations/en.cljs +++ b/src/status_im/translations/en.cljs @@ -146,6 +146,7 @@ :delete-contact "Delete contact" :remove-from-group "Remove from group" :edit-contacts "Edit contacts" + :search-contacts "Search contacts" :show-all "SHOW ALL" :contacts-group-dapps "ÐApps" :contacts-group-people "People" @@ -189,14 +190,15 @@ :group-chat-name "Chat name" :empty-group-chat-name "Please enter a name" :illegal-group-chat-name "Please select another name" - :new-group "New Group" - :reorder-groups "Reorder Group" + :new-group "New group" + :reorder-groups "Reorder groups" :group-name "Group name" - :edit-group "Edit Group" - :delete-group "DELETE GROUP" + :edit-group "Edit group" + :delete-group "Delete group" :delete-group-prompt "This will not affect group members" :group-members "Group members" - + :contact-s {:one "contact" + :other "contacts"} ;participants :add-participants "Add Participants" :remove-participants "Remove Participants"