From 2cd51ec0328f79f2762bf60ff01f26f063172111 Mon Sep 17 00:00:00 2001 From: Richard Powell Date: Sat, 13 Mar 2021 14:21:54 -0800 Subject: [PATCH] Adding sprites to Animation screen. Using the default sprite image that we have for omniview. --- .gitignore | 1 + CMakeLists.txt | 101 +- resources/default_sprite_strip.png | Bin 0 -> 236384 bytes shows/Dance Show final.shw | Bin 37211 -> 39564 bytes src/AnimationCanvas.cpp | 11 + src/AnimationCanvas.h | 8 +- src/AnimationPanel.cpp | 10 + src/AnimationPanel.h | 2 + src/AnimationView.cpp | 185 ++- src/AnimationView.h | 12 + src/CalChartFrame.cpp | 2 +- src/CalChartPreferences.cpp | 111 ++ ...preferences_ui.h => CalChartPreferences.h} | 0 src/ColorSetupCanvas.cpp | 2 +- src/ColorSetupDialog.cpp | 32 +- src/ContinuityComposerDialog.cpp | 6 +- src/PreferencesContCellSetup.cpp | 254 +++ src/PreferencesContCellSetup.h | 64 + src/PreferencesDrawingSetup.cpp | 371 +++++ src/PreferencesDrawingSetup.h | 81 + src/PreferencesGeneralSetup.cpp | 117 ++ src/PreferencesGeneralSetup.h | 54 + src/PreferencesPSPrintingSetup.cpp | 214 +++ src/PreferencesPSPrintingSetup.h | 66 + src/PreferencesShowModeSetup.cpp | 270 ++++ src/PreferencesShowModeSetup.h | 68 + src/PreferencesUtils.cpp | 75 + src/PreferencesUtils.h | 89 ++ src/TopFrame.cpp | 2 +- src/basic_ui.h | 1 + src/cc_preferences_ui.cpp | 1417 ----------------- src/confgr.cpp | 4 + src/confgr.h | 4 + src/core/animate.cpp | 25 +- src/core/animate.h | 10 +- src/core/math_utils.cpp | 11 - src/core/math_utils.h | 15 +- src/mode_dialog.cpp | 36 +- src/mode_dialog_canvas.cpp | 2 +- 39 files changed, 2181 insertions(+), 1552 deletions(-) create mode 100644 resources/default_sprite_strip.png create mode 100644 src/CalChartPreferences.cpp rename src/{cc_preferences_ui.h => CalChartPreferences.h} (100%) create mode 100644 src/PreferencesContCellSetup.cpp create mode 100644 src/PreferencesContCellSetup.h create mode 100644 src/PreferencesDrawingSetup.cpp create mode 100644 src/PreferencesDrawingSetup.h create mode 100644 src/PreferencesGeneralSetup.cpp create mode 100644 src/PreferencesGeneralSetup.h create mode 100644 src/PreferencesPSPrintingSetup.cpp create mode 100644 src/PreferencesPSPrintingSetup.h create mode 100644 src/PreferencesShowModeSetup.cpp create mode 100644 src/PreferencesShowModeSetup.h create mode 100644 src/PreferencesUtils.cpp create mode 100644 src/PreferencesUtils.h delete mode 100644 src/cc_preferences_ui.cpp diff --git a/.gitignore b/.gitignore index f6e6a113..24482beb 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ +build/* build-macos/CalChart.xcodeproj/project.xcworkspace/* build-macos/CalChart.xcodeproj/xcuserdata/* build-win/README.txt diff --git a/CMakeLists.txt b/CMakeLists.txt index e7822bed..42977bb8 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -188,8 +188,105 @@ source_group( add_executable ( CalChart - ${CalChartSources} - ${CalChartHeaders} + ${CMAKE_CURRENT_SOURCE_DIR}/src/AnimationCanvas.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/src/AnimationCanvas.h + ${CMAKE_CURRENT_SOURCE_DIR}/src/AnimationErrorsPanel.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/src/AnimationErrorsPanel.h + ${CMAKE_CURRENT_SOURCE_DIR}/src/AnimationPanel.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/src/AnimationPanel.h + ${CMAKE_CURRENT_SOURCE_DIR}/src/AnimationView.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/src/AnimationView.h + ${CMAKE_CURRENT_SOURCE_DIR}/src/CCOmniviewCanvas.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/src/CCOmniviewCanvas.h + ${CMAKE_CURRENT_SOURCE_DIR}/src/CalChartApp.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/src/CalChartApp.h + ${CMAKE_CURRENT_SOURCE_DIR}/src/CalChartDoc.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/src/CalChartDoc.h + ${CMAKE_CURRENT_SOURCE_DIR}/src/CalChartDocCommand.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/src/CalChartDocCommand.h + ${CMAKE_CURRENT_SOURCE_DIR}/src/CalChartFrame.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/src/CalChartFrame.h + ${CMAKE_CURRENT_SOURCE_DIR}/src/CalChartPreferences.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/src/CalChartPreferences.h + ${CMAKE_CURRENT_SOURCE_DIR}/src/CalChartSizes.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/src/CalChartSizes.h + ${CMAKE_CURRENT_SOURCE_DIR}/src/CalChartToolBar.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/src/CalChartToolBar.h + ${CMAKE_CURRENT_SOURCE_DIR}/src/CalChartView.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/src/CalChartView.h + ${CMAKE_CURRENT_SOURCE_DIR}/src/ColorPalette.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/src/ColorPalette.h + ${CMAKE_CURRENT_SOURCE_DIR}/src/ColorSetupCanvas.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/src/ColorSetupCanvas.h + ${CMAKE_CURRENT_SOURCE_DIR}/src/ColorSetupDialog.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/src/ColorSetupDialog.h + ${CMAKE_CURRENT_SOURCE_DIR}/src/ContinuityBrowser.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/src/ContinuityBrowser.h + ${CMAKE_CURRENT_SOURCE_DIR}/src/ContinuityBrowserPanel.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/src/ContinuityBrowserPanel.h + ${CMAKE_CURRENT_SOURCE_DIR}/src/ContinuityComposerDialog.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/src/ContinuityComposerDialog.h + ${CMAKE_CURRENT_SOURCE_DIR}/src/ContinuityEditorPopup.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/src/ContinuityEditorPopup.h + ${CMAKE_CURRENT_SOURCE_DIR}/src/CustomListViewPanel.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/src/CustomListViewPanel.h + ${CMAKE_CURRENT_SOURCE_DIR}/src/FieldCanvas.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/src/FieldCanvas.h + ${CMAKE_CURRENT_SOURCE_DIR}/src/FieldControlsToolBar.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/src/FieldControlsToolBar.h + ${CMAKE_CURRENT_SOURCE_DIR}/src/FieldThumbnailBrowser.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/src/FieldThumbnailBrowser.h + ${CMAKE_CURRENT_SOURCE_DIR}/src/PreferencesContCellSetup.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/src/PreferencesContCellSetup.h + ${CMAKE_CURRENT_SOURCE_DIR}/src/PreferencesDrawingSetup.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/src/PreferencesDrawingSetup.h + ${CMAKE_CURRENT_SOURCE_DIR}/src/PreferencesGeneralSetup.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/src/PreferencesGeneralSetup.h + ${CMAKE_CURRENT_SOURCE_DIR}/src/PreferencesPSPrintingSetup.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/src/PreferencesPSPrintingSetup.h + ${CMAKE_CURRENT_SOURCE_DIR}/src/PreferencesShowModeSetup.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/src/PreferencesShowModeSetup.h + ${CMAKE_CURRENT_SOURCE_DIR}/src/PreferencesUtils.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/src/PreferencesUtils.h + ${CMAKE_CURRENT_SOURCE_DIR}/src/PrintContinuityEditor.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/src/PrintContinuityEditor.h + ${CMAKE_CURRENT_SOURCE_DIR}/src/TopFrame.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/src/TopFrame.h + ${CMAKE_CURRENT_SOURCE_DIR}/src/background_image.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/src/background_image.h + ${CMAKE_CURRENT_SOURCE_DIR}/src/basic_ui.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/src/basic_ui.h + ${CMAKE_CURRENT_SOURCE_DIR}/src/cc_omniview_constants.h + ${CMAKE_CURRENT_SOURCE_DIR}/src/confgr.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/src/confgr.h + ${CMAKE_CURRENT_SOURCE_DIR}/src/cont_box_draw.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/src/cont_box_draw.h + ${CMAKE_CURRENT_SOURCE_DIR}/src/draw.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/src/draw.h + ${CMAKE_CURRENT_SOURCE_DIR}/src/draw_utils.h + ${CMAKE_CURRENT_SOURCE_DIR}/src/e7_transition_solver_ui.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/src/e7_transition_solver_ui.h + ${CMAKE_CURRENT_SOURCE_DIR}/src/field_canvas_shapes.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/src/field_canvas_shapes.h + ${CMAKE_CURRENT_SOURCE_DIR}/src/ghost_module.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/src/ghost_module.h + ${CMAKE_CURRENT_SOURCE_DIR}/src/linmath.h + ${CMAKE_CURRENT_SOURCE_DIR}/src/mode_dialog.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/src/mode_dialog.h + ${CMAKE_CURRENT_SOURCE_DIR}/src/mode_dialog_canvas.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/src/mode_dialog_canvas.h + ${CMAKE_CURRENT_SOURCE_DIR}/src/platconf.h + ${CMAKE_CURRENT_SOURCE_DIR}/src/precomp.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/src/precomp.h + ${CMAKE_CURRENT_SOURCE_DIR}/src/print_ps_dialog.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/src/print_ps_dialog.h + ${CMAKE_CURRENT_SOURCE_DIR}/src/setup_wizards.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/src/setup_wizards.h + ${CMAKE_CURRENT_SOURCE_DIR}/src/show_ui.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/src/show_ui.h + ${CMAKE_CURRENT_SOURCE_DIR}/src/single_instance_ipc.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/src/single_instance_ipc.h + ${CMAKE_CURRENT_SOURCE_DIR}/src/ui_enums.h ${CalChartDocs} ${CalChartResources} "${CMAKE_CURRENT_SOURCE_DIR}/calchart.rc" diff --git a/resources/default_sprite_strip.png b/resources/default_sprite_strip.png new file mode 100644 index 0000000000000000000000000000000000000000..54199a4dd5135916d3d833a45ec93a7c39fa5d5f GIT binary patch literal 236384 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

~ZOV+EQJYdnkzNy?B8 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

hK2?7I%@@unbTl4i1RD7u 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

3d~?>9~b_fEt!`bo zW8R8WUo480ex%jY?D4o&pBn|CAa+aGgXbVKY$GV{I+W@scc)q%8PEf z`r}`l|5usi@4WidlHKoayi%>K#S#^4$%SPJGqymE0%8co??X}~`bH=J7>`c90GmK$ zzg|{R{gDl_JCE#NrTdCL} zHi^ETIlVoH8=9Ki`-hJ0P+AwC_mKca!BMrmZDZyOD2hsTa~q3StifH;fbI%29L;lZ zaEQsNZeqz4<5N-eZ0d)8>5ZLz{R6uj8|ugYS^58ax7_%0_pyCvEIsWK>KlsCodT0d zlgNTK6j#+Up}82rjcR$34HX#|mMP%~pa>Q&HB6wk1+g?nHaY^PNj{hR!{(QtsCx9b z_vKccboSG&Ewlcq&olt5mM`9JP8~a;xG0FEstEkM{hKOcn>K=DqY4grQzNStkOXkB zW>i2$HKdZ0G|yY}b6K)PLpM}UV!FgJG*!Y8i%Kd-3)ADDicbvU^SW?hqN0$?>ez)8 zqGi#)e=|+(E%-bkX1YGA*iL}7>0sLdMtl2kxda^3q+q~E+#su&IF3eAvoIWCMj`C- zQ0B8~YpbVnaWhPOv`zHOFFyCVCtuq!|3XhSOP8<265S995-e%LTRWFT-(Gt6>>xHh z0g{4k8n`?@7M*h1?}J6*zx3`HAL;K7hCSKVGkK5r;|LpsOoE{i?eEb5Sc1tBl8@4F~pYZygyLn%CGg2f-7h zd}$Nm=7sbh*h63UAw*llrMR)tap9nt1-5Q}!2SK#ZZHGj>Kx`<9 zZDnvYup}8@AcWUU;r4(>_7G3&Olf&^F@RQ37>-6+zVvwddwS@NCXvki-+>%6RGiDC zLxx`PWfJl7L;E&g)VuSQmeRVG6S9(@R1TtJQA+$iG}{ZI0J zl4VltlhJW-%L;W7hpMKawEg)9z9lIF7p$#Aa0K!N$mC3tnn@zBlSoC$WHJ;I7U`5p zCS4$-JAjQxmGJv~)YP}q(AtbET!K4Pf*`qR(rl&&I~eXcNYGJeUVSc$*PL~dFI?W^ zEvfkn@osvgXV%a}=h5E1-3Wq!$K}DX1VkLHd;!C7&S;h*s?`1;9`7al=(|e*x0gg?OCEInPa0v&adzM3YFdv z^G>;#%WwSAscvt;?%28c#QkqSw*^lTE|(Y8v9U}W&6dDbL|$?;V4CE7H3;>y$@%?A zf=zBTM^WQE!p)2KepG+U`D@R4`Nf0pUn__P!C;t%mU&doo=;JAD;Y;&DrL}>NE07O zlh2Hj&1W$4DWdv27XUl{S-Ekvud|_$%lZ3`bu1kj8EW0VYtJg($ot>lv3Xl;YVu3n zBS~@tc{Cx8;twOJJ`|T5QB_bRfuPGps3=HHSuvriFkYXJsqta*nGC+53q;7<4&Fc* zw=93@wHKeL``JBroOZ?4pT484{2y-#bn6Y5JC8lT8E@qvm32*=uyhHPWyL6pfMFU~ zY7oU+Mnz>au5cw?J2n%anjo(`ocghAsjQzRY}>frNfkbNsJ%T$o%ddP9Jy{DLz8LL zvQi9p4Ngv{sHTc}lM@KCgkd`JJqaUV7*rr)SSL_H^~} z@Y`L&17E+)dF!1m3?>T1qFJ)fzsnTnzhj^O%O??^_I>XgpL+J;XEvU`bm2VCJ?A`v zm9>uW#6n%lc&)$7kcea-UIFWKMP z+WxFR7|ir_c04&T+P%(^T))btrrQp^`_?(7?Moc`IIx;vlw$f`^>lM!?2WbuKWThC6! zqm`*_*1zS=SHFGYSr_25G0=)I~FP9E=cU+pyn~FDFbz`8W8OL-GB?U_mc>l#GII#6K=B_=Jxyw$$ zr^-0lX(T(tXwP9zyX>>b0`0R`fBeYLzj4K96GNT9kqVQP6_>E)i@#>};?+VXHW`df z4A)18duI*z9-aHfYfpa49GoyL>Tx3iSx>`g*6mbd}T;yq0bZT2Xl!mJ~ zyzdw%U;D);FaP>|SNy%l`TpA*D(}DbU;fP}i5Fx9iTcKN+ME20^>h=9J5)x}92-h9 zFlD0aCdR+Bt%In@qJS?HBpCEl>~~|4Lv;BF7MG$SV;KrfbB;re)PU+nv~6r8Y(Tb6 za5N0PfN9z{&Yibp*NU~LeIQBgdiRZ0&;Iy^`$ILY^I}seCMRR`PQ;jqXJ~7vV$p&{ zG_)UwyQB)o5*e7B=BejjB&bhw`B}?AmevcBtI#-W$-DE8KXF5Keapay*Lh0*(bq12 zp{^nl{nYJ`UiH5opPn2GJ^7O_|Mtpn-1qThGR6CwU%V}wN<@srXzh64;U!KX9V%~_ zv%9Qm!OpB^$azcnM#ix4dc1fQ3AYUHKrtEJX7B!kjE@d7XTdziI(HFB_TW-Qnirg~ z&n|1;pBYJ%6?Dzxang~NC2iZ+U3TkdJ_HQx-FC|Lmz@3P!UgT*rzV*_e<7_4PrwR9 z7#`@s=PG^Ftc(NomIa)t9c*ZeWB%%O zEIF>3y<0XCjU^b%nEx(!ccX|ZqQ{5F?M8N~2$F&#LPc3A%U3O;#v_uCjuOvnWbyF! zTW`_Xv5TChan@PqzkKVh-}&6ES#3lAhmUBq+s{7wK0ss%!iF>d8>YcY8>Da#FfxB;g z{_IO{_(AL3`R^auv-OPEpMUhrb#Bp>&BLf5{DfyON0QZg3?oEo4$tsEUFpxDf@DsY0%+apn2XUv=d*54F!f{t$px z$jyJ|_uo0N?8M7&+5i4K??$6j?}REEv7MQ&s*Y{*?%SK_djCxtt1GB!swX);joXMa zt4c%_W%7kQmhHmhmFXIYp_v)n0@z9fuO*>t; zFJHc`BL<}kH0^V21Iae=iWXXa`dfke<9DrI z_p!hDGOYj2?O*SC>$mrGOv^M>Rgg{V`&HQ8Y!joTJy6*fZeIL>I`IhU>dZXB-xxReQ`qSKj4;BSS zhx;oY{OY-HfAY?UTB~O*Q2}0k@x%&zq55?p*)jU26|) zc;vLRKk?;9=bUuG2NVFK{YRQUdFg3AE=k7cm=r}KEIauOiW}!KH8o8tI!3Nw@Ysu+ z85tT!DCD@{%1>;3=>A`y_P<*L-JJ*8I^KQbOut*Q>*p=nIcw3{?f-G??M<(o^7Ngb zd$_9HSCcT@luOfCmV&#iu3M>?^`axHH@Q4sCh{6bx~7QCson5c4 z$4E_36bupe*p#-;Mh-UoCO0+EGH21^e?9x^TRx!H$mcTRZ+>$7FMs~42R~Qkmsq!S z7UeZ{1e%tjM4H)ixSRLi+sd&c2g&Ag=(>S`i7W`HIDpB@wQIND^3@yfsH<%}TG#mZ zw**Q?C)~Y94lN((IkxcVp}lMJsd!1&wAUUOOi|w0Mq^DWy&dl`H5p@IEXGt?oAHo# zq#5?MC?N>KjG9~&@p!|uwa;PR+$L&E1BhB0OH|qN&USh`w^LeL-gm~C7e937S!X_T z+>)i8|16N>&EMa7dnOtEPN1j+)#JtzR4mKF(Q_0u9jlNdpNbP79bkN76v4=2I|90( zyng0Y-}u3vjrV_k{u$T2uy;GA?%2O$Y0u$97m1QU(B~qS zPBRhH7>Z_zgnj5?7gjpMS*M)IH-7x#_usGFaMkul9{tnuWyde#tn<&uQ(Q-+G>k_U z$Z8g{prc0z*!9W_j1P37C^BN8lzSd~B@~X7e85+C=8hQYx zMu%!*V|~k9-lDN|Y`XqWkKgx1j&aDO+$@MPc=-AjLe&y7@D_p(}u54PE7_5_77v&BB!5n z2GtEsn1CXH+bYm^>>yhY$I%oo*PM4IRgG=5%wO{QvXyIo^1@^H zycX}<)0Y}IcQh?seVO6$gC!uj{7lBD+4It)L1oX@>naN}5X^r;f zt1!~jTt={{bY0)>_b*FN4X#yfb5?Yumzbk470VNB zsb}rkm(%mwLu}jM%ly+XFrma|Fmt1*3sSrt3BR8qhpI`)8njJ zu?Sx%NKPsxZ-^ukaZD{oaZwSL5hL5ZnNd(E2^FHxa-um9jyuWLZiHyK#UO_iO zc68?YWfm=IWBEn1i5)q{tIr*#arGHEz7Xzk7zg2ZUSG-B+@+`dxum?NCtO~W{J+`T zyEZ@XtiR(rL{UJK+?3TeQB__>YG5mpT8-i4@jGdH##0PO3mEzg^WL<kHB#!oVljCZQ%!0 z;KRM0i=X@H)w{Uq$z2eXX*WI*W z?ui$y$fS}D`?kLJQwr%XI+9>(`EWyD!}OIaPiic9=$TvyLr~h*L?Sh=Jr+Z zejxw%9Gd-=Pn>>ORRw&Ac)V^FtvH#=#jD8bFg(ypToZWu)y?!B?Lsi}R5jEZ+uzz$ zR2(k;tAO!~PyY7$Cmw$2vqoZ|sink|t!$lr=!%=}{cLG%%W&6`L(LEW{CnNT@J>9k z7hib;wXF+(>ZpqDV9J?-`L(|3H1Sj(m#ok{tBsP9Fpg<6(A&@McVD9>>?cxQOR&g; z?61Ixbul&FyWz&$p1!QSt}X)*jZVvbNA}O#yz%98Q-fWtKGnQ>I+^*RR>7fA}%fN7KBvS{+LO{S#Bz|<~U0*$O-AT_@*EJ9P_uusg!TgRH3f@94zb=)@lP{Qbb{-~?OjA@|PCA<>n#zM?Bin!@ zV2UyV0=77l|0O{LMW(E>jya1K)80};g`K64i8Gc-kxpc&tgIqqDr|Xc3)4e=Xm)|7 zS+nAoTz2KX7hZVDZ|dqB{vj6OH-Gk0=jAuIFdQ#nnI@K~Qc}~*%9SgaJ*$<{NEo;5 z!Xrx{3D{-^BRt6+cU*G;IXYuJ*6Do=@yM3;3wCAX^=gk*5 zxaCM?A*DJ=eG3;0AD__)QP4F45l4&rpY;HpTix$UjN}Hz#AU< z{&#l1^7QRHj-_ay-Au!rxpeeI>6_9x>727@Z>~eK4YZt&Xr$@c`wnkxc!{>9tDpPj zZ=bsGqbBm`&P}WT{NNA2-!iZ5;PTT>tR3!*pO-lDHtF0HVxSVuvY8ZI(0OOcV1t>{*P<^ z@T-@;JfV5?pZ@CM4~^-SKmP0+zx&x8cVBVc=eYQWyFM@n`*v?V@$jA>uzb<|arAP6doOJQ`dk3T*BFeAe~lvLE>^|MSyq@BAK}Og590Vj)GRp# zS8*jipBI;^VrFBEbZ)2pxaD{QMGcDVRut9kNlpzMc>kSOm|av#!t!&?9rsGU|1=K( zPuzF&z5Ux?xG9k=AcfrQ*gZ_7*x@VR`#meqy7cc>0EkUbgaF2l?O*lopYHvkuVL{5 zS8+Y5L=1g+H;LX|NX8^5ef1Bx6Mek!(_7dxsgf>;q#Xsz7IBd9lVx#<$=sF_+(jYw z?CPbswT&g`-*8)X^MY-a^(_Y?<<);dfE!1b@kc6{vtk9yPCk3p?4|48Gqi##%Ch##Q$MG(vy-CQc}$KB z;}jA!&YA_X4+I%ORIz8MEtrmo;^c7|8lqy8%w)gjQoXsN(yGyc?jy7Jytj2tvC-Qk zINF@oI`h=F&SoT$;OLP-bi?A@Gfw96k6(e~i0HP-?v5^Adge(I@iFGL)NsLhXAlUu z5wtvZA&n`h>jR~=y(gXfFTbd%Z~g#q8lM~uXOq!LP3!y*F{_9AyK5f!&Q-d@M*al7kGoL}zGbn(&V*X~KxUoyO9nmc4E-Rl72%d1fqPgW-MV5JQZwEW~9AtcC z1VJxQSy#)Ph()oGBpmkQDDy_jTblQ`)VQ;*KW zPS*eOfBbl`=g`9H`qslm;gShakZfd6W^8)0>i&lwzqzY#6dMp^8&j0fG?UuOYEEy9 zP>2qZ*9^2m0om5@`#pF(UP`N5$re>Tcc42~a>kkyHtXX@=h(T)ii(<&Red>y!SMu> zL(@o#M7X4!@$m_KibHz17e$!yi`7kwT*1aL1Ps&0r8tzADAZP!GMp6gS60(dU4~b7 zt*>vHzw_ktFMFV*wBm1O&Lm?~uCD#>t?NF#?}Wr?PrIbLbB-t*xlHOB0T%@uQn@_1 z6tbBth9xjKHpO6f53(ynMOiV24|R~r>j;V)L9h`d8w&y377;85%bo#y1sp6vp{QvN z%Z^__Ly4bKm%!66z0OE~H%n$!<56XjX#*P}e*Pu@@{2Vmo%&pPRb_v5&3~T_lujmG zzqtF3Uv7GR{ilKfKegpS+;V|*JV$gogUT0N~ zY(f-evZjL~*jUM7x_7+A(LL`W2%sq*e)90Eb+rv2yth2{Z#Un+XYaw!Tz6$^Oo{X1?Ig+LAeNbnjw)yzBHpMGLj_PdI;I;K+(S z<8I3yeD5~$;{;We%3=>?Zk3u7PUDJO9{N!J8y@IxIMT7}5qRhKA8xevhGxtEnkTuNtigOvch23FFSFaK%}8 zTsB%_0y{Ux#6TZQPy0Bsog_qMK=s;eHm(t1m1o7 zEj&JlNLe{nHbE|%$7hN7!fuqxQ|a$~mm_<(QC(h6%5 z?=3yJd@<^QAYt>fjY&OPq$*72D$ za@;jJaaSTx+$mP9LXlnyMJ_G%mKs$kg;F3$p}0elAVK29Jvqs7mvNuj_WqIk(#tJ< zo8H@Z{+`d?Ywab^v!3-6`o_iplWVU03db*Bj)g!rm1EtekJ-6n8;X`D9UG>;p^>RG zrW16^R0eGbmO#-^9-Xx8^cUtYKkHL6Wb591=0Yo<^ezAVH4pvIZ?j?j>JvYD_KtT? zx#$M`p;m@F_wfEp528B?=)Hr;s*0z6CZ4LvL~}Y5ktC6k!HuEv3ax$Wr1}05uM^qE z`b|6ecQ&k!bV#$36M|OI|||{jyHu9d&=nu1>_N9IdQ%dc4#$bcW1k$xikkxZrV*cF6g9EU$Zi7UuJN@Ld9*WLWpYp(nKC-Mh7w#>e|}pYpUvc zOY0}?S$h1L&w4)N66jcehqkOfWqh!Aa(CyUxyfwCJs!)Rmq;53f=)c1B$>}K*f&Hn zV=#Y48>zni?Cu^XC#YD8j39u5j45(dKF&0;WD7;IkS&!=QNR#ws4g$_W=|m>kFaCY z2F^WWIm;Hbl24^U7oPQb{ZWtC7qbA#)D?%nY}ixXe4wUr(!Scp|2s=yd~7IiXzThD z_iTCRoZkMy`ij;$OG6d41Vg2Gy*?Dd#MDg+rip0jpcm1z8B)WC=-aoM!M-kXMfJn` zKI}gJoyUH0@uB_OPyNQPU;N5{f5+hi+gsj!>{qwB?6#{!M}V%bPO2u)#-kL85BE`8 zHwjgCqvsPC&JrZmhbT)Ra1>0W7bz4nR8^K;y!@;$e*z=@;Mu#c+W+B;tA>*Dy6b*) z_gCM!`^JZNe7tGda8aQ%l1CO~CIub2pFR4Ke?f6^%6SMDod(|(tuYK+t2YS*{ zWBW{OzEa-aaEPMhVdm_)ESf(P6@y}-fSwJrWApp0|KLN)8{2t#_4?0@B_F-~*tfQ< zf9r~d#+FElPbwy&(V9TOYLAVC(M*|CB27xH#vKe%T3L@`vm+=nSQg22j%+GU(I`@k zk1%`gGD?DFwi)w|`%L=Y=sm! zmZmml&tJgQ_EsDYJECl-qvH?{J@O#=bdsvd8se!WkyHv*6qsHUq%7dYkX24Q<01-? zE{cO&kg8g#XkCUO*f3226N!%9n;Bj69CB4HWm6XstZqhe+K!qH7gIzBjx4wFhoD><$lh!OI1={q&Rmq#|Qd->!|#tM2>d2Ca|_3As2$Sz~-S zMwQ>o(u;25^6S5QO!2?J^I+rnz>%5Ainej>nhW=D|M*LSuA#b}baV|u(d2WBXE1%i zLh#oxF*-&vm86)CquT9Qk_%DR@n*VE2i9|7EXCqWenOBV#J9YKP+G(0HCr(<7Jk3N zf-iiHus^`=Ki*Dbsfikzi+B3*3=Txt`0*wJ!4R_3j!-NR@CDwr`F!C}Syg{UUGu(` zXI}cmF*AJ+?yw%Z@!>4dT%J2+9ofA4=EG|q`21kTi_7k!dw7hkM}|>U z7gt|=1`SiE;VG%0D5}H~1>Sq_UEX@@HIADznM==Ffnn*SW9hY)1uY9tdUE#SlOK2c zO8zbeuKnxdU-tP!<1>#t{qN*SUw!_OtJgpK>j#&edfo#kTy)$1&F{VRhb=Gv37?c< zB$~!)m#Lex0@*)_yaC~GjM(@%RZXpwR|ip58BunzaqE6Q_;3U1#3*wY%%_$Syw(^l z(IRcHdrlKQX(2ZeGDMg;>vIR2=Pg-1b?%A}{|<59*Hw4Ui7Wd`d@|FU>zK3fL_(8i zk+Wn*cdnt-C$VYsZr)h48HWstr4uz}{`BaR=bUuv8L$1*Ghk%YCrOg-EcqK_a^1VH zo&Lm6u6?64!M@p`uT^qy>nqYH&Hn}7`Z&FiyRr6Ae+nLk}bT!Qp!VBNUB9T5htHFNX3#U zG6cLXh6lRY)!C1!+YrP8MO~$+2^fNjO_q0h`KO;ibD0ap;U$$TV0So>3sJgvtY!V4 z4o<%08~o@8N2P!M`s9Pw=C_|EGB!l9XyEcn=+Oz%S)H^dfv97**^%Als7zoJT`0}- znK@@MHjf`&OJV3HrU`ag#3>4Nt$&5_?jv~ToWfZbeUT0Cyg+)apZrSQ*SsKE!{;6D%z}F!Wfcu<+_{t2Ut5E(s-4Q_ zNz7j`i^l3o1j{6oP4LuXkJ8cA6JN7tU3)`g<7di)GQ zs92^*%d)fX`qGVe+yby?+q%Vf-*WjH*W^X(e*U{vXL>%v6!Xp-&)P6=*~v?mUvR@G z-{7y$K5$FVjt!^AG~=WrN4kln4KxJO$s~3~z+t!JP#g%J5~j?Y%ZzDLP!uP9U0wY8 z*FPgsEFg(8Zif@QWRcCLaM|pfv9O)-@d=tH&8D%XmfnL~@dnHB*GqX=5X3&0!|gb`=|*^&e4d=6Jq-ZYq;*N zrT7LfJl?O`Pf)WbY_-OYyC8c#^cRlmL6n|ND^nbHRHhuWk8HQm> zM>_V+9~l{Lh>s4}Yr3ZRoWi0~sffR<5~;iuQ}!}3K7=)X5OHD`(Xj!%lNNK<)!%3L zsvFt6bDZIb!Ei2zCWzQ2fk_UX6^lbmKIdW*JJ+(|s$9WPM)>vf4krx`Of(-g%VrOI~Xl+Br4%@1gW*h!B?~8_=~^!v(lQT z&KK{x`Tl9k&s{$KxHDPz*3+DM`Hk3}?h;Ka=K6aM`|_F0__|jfB5m2w?0zyMT}as! zYN#4h^-^6|kH;GzuWOhlNa)C>hSTmKoQ(0>yC2ZEcN-Npol3WeOVZF3fsebAbVe*3 zssmL~NM(}9qRiFTT*usb3y7x@Y}mY=LwmN-QtGClrRnJ$#O@8!R98w>X^6U-5O#-1 zHXfsH_DR>BbMcjb`j=P|@4b3j|Nf7UQ!qtEab^^6Ad-qkf~s9K>nF|H-aPxb4_sdV zrxNmxz1ye$MO?bC+yC)^Xgmb^UQ4y!6;jdv|U;->{-gt@q%Oi^y^TuSX%^brJB{7#bKyG!=9U zG+iW`6d6kx432B$0#hlkuA!#VkHhZ9F4|CJ1E&pQV_}B74lx!UX5*egx|2mTL&GHs zlm&w4HTYv~0qcj3<3n&8;2tSDyB=%k9(u)%o1DZ}ZZ39{bLV@2=lhUJ|Hh z%9L3Qj;0tax|zLnAqxCMcfZa^-^$iDS#+_aH{W8=K`=9b3hme$@+F$yCi{uwE_~=0Mz({yy*Km~a zXdWw@Ae+k}Dk{O!a$2X(WbW*lgaYL#s*MdFZ|C7v_k)o~vfGeN1I@6|v^-PmL(FSw zVkDAa`qXw%46?)fX=?C#K%voE{;;JYt8(7fiUJ3IYVQ*q5$%*E$iDwdX4Tc04j`a7lHfA8vh zZO-J^#s}gUQh~mnFf|^Tldt*_=YRE^$5a4Vzxw6#4{m+^g;zEnX5+`Z5hRhCpbJsZ ziDxx#y85fslzQ2>X&1%HN_>@-xJ8j%!62N-AQtoN*tvrl)7w}wqYiCoKhb0aO*ark z3k3tq$`DW6iHuAjNKn~0nNg)3r>_L3WZ|zYCFm6S_=EL4{+FjHad@b%3USKui;1NY zZ0#7JzS>Q>zx2IOMbp7$C!Y4qoP{ek9#f2a=!VCiUbX6qqUy#fD2*Ci+no8>(dzv>7zllo0T_ zd1hlTcBh@Tst}Xvn;0J*#AWw!%7vFuQC30!KtDS+e@rnKr>QQ4$E^|%M>*Uzg4-d| z*i=JRbp>|2gJdjDM`!QmTYvq?x#iV$W1q^;QwiDO`TPAM8Xobz`Iq1RC_b=nR;mC# zmp5KsS}`1nO_a%^teY6JF4%HK(VIX3RT53RqFiQk`$I$V#DRfGddkP!_Hy9hK155$ zA&P)Sb7LvjUU@ZsxAeWn*4Z1Yny2mXhsu-xY@F`=*>~@}``$m^eDX=B^SKk2A-jF_ z^$xLp>jq{tc&M!^<2cO5!}&uyb&_HtfdyP2-8Q7-(#WviARzx*AKkah3-==F=R8K(u@K03z? zw(Z=)#PB$7uZLMP+Yxdx?BvnnLpU84ZjS>?P%w%DSwloa#HE1Cu8~R==@?Oo>N2=I ztXO%%AFjOWhM$#J)Jz;pzX$einlm09YMB@xtJ$-E|NOp=uIb5WVrs$AP;DxuAwO=% zQ3Kn8ZXlR>oRWngD>$tb*|9;2mPjgPku?NT8pJauSUOcfJBp%`&8P9IMI5Gq;1tm< z2hn(etmMNR2w@Wi@Rm_hU5P44xD-2rp%X0gV;TmCB6=Z*Q#MFuQjb)HYI+)HEq!m+ z!j+r<)o~sj>MMWase8XO(6wu!UojVL>5B5v&OQWLMNu8t{AJ9ZHH#&4X3$z!gKD=U zS~_~sKr8BK#Vm#72+^KB?A!Rk#(AH==DwK=maKpO#Rq=q^;HdPxwPBicBhN^q<8GV zrbWegd_hhLkTvaO3osiu5Jq10#>#gF*S%PI`&zT0E&{+bkPXawcY*2 z8*YC)R95u~u;KQvp7w?rXzscFH}_uu-`g?Kcd+sGKYjoA@4oZl*;jt^N1S-cH$I7f zFFpCkr*~|8?+eLHfjxUV$XN=dB_#-E9=k(5x&`u-GifS=mAJ}lDXFSQcKV5pjncDk zJymj?(V`o%yp_@39^8Qvyn!I2-G@o{cHnU6G**-ma5bLw=gdO9)DKlBpDGWr(0xJ+l1db02P-yYkhh$+Hd})A|3_(|<8p z>i*8AgTss(c53R%N%y5_ojnbk?D%%uqT^qG@!{V*HUGHN56?UA`tKgt{N}=C7ysuI zpU#_ioczv<54~+GX-2onWU^s${fBV}tB7Wc)Yml7(9lA*prPgS*cA~|v=EE}KDUjr zi73xJ|0)hML6wpv9?cW*8gxd&Z0fZUsPHm26egY52v$~e$M=4W-)lz{Wcs5K9)IW& zVk7-{oD#8IiqD;}f+aI%qH0N0p+Hd=iD&c=Prl;D>uX!495WMqbg-xL#Z|Z89q!vR z-{vZJ)z{Q%vM5*Ovq=!aC~8LD7W|8DDTP8d@35(g=5;x8jMsJYYUg2e-72H(-|0!GCJ5rg*`!OX^;(TKIHJ;-7K0Npt0Ib&T>%EI^)F?F8kd@ zs@-k=t1%&)PRgqvzx&&gX^N#4WuubIRumLhYR|Tbb6CFivbD z&iF(ahfAfQwwiQaq>zl@lTyUT`mx(>czj+2Lm;PXWOa*7-o)(yw`$>3A(<%>lj;Zr zOYjB**aZ1QhsT+kHgD-0r=NA{1OKqDxBBUe2Rn8x?T^KS!;#FTyLKF;zo&6QJrK87GvQok*vx< z)MU!M>-Ia_vpL^z7q=hXxsqM9Jnf5DY5ItC(5q z#g&;LTF{8(G_*n*pTCl}*~f9lW!L`Gz5P>v*!{sn*Q9z@JrEfm$m*&&fi^l&iNO;aI7Eug-7qY`Io=^ z$(=bA7Pr^aH<04McpA`gxjigfdK{Bm8fdOAyD{Wav|K*#?CU-_L(9a1qM_N0V$z?A z4A)75SsG3h<2AERd@T_0#m9HPapAtfT;&ND-SDkN%Z`7erG3WV(M8koup6Uba|f#< zecc_+YhQWl#$0r)deiRxpN}Rol)7XlYz|b##=@x$L?`07Twc5$J40hpdIw{)O`lEk zq$!j*?Y!~Ib3FCpi5HZ z4m>r}DCj!<2R>vpo1}2y5Gg}NE~F6@k({VvGm9uT3yp~fOOr6B7!uS1q(D%~b+ixyM!xl8%@fJm?n~9d&^(maM&;{nx@Ztf6j5Iz4k91?z*;4fBTLzKYDTfn7=gSLpOAc zbdm4>`Mt%H<{qVjKlq)Co^|?aF1qZt-?3}M8dR^Bnz~k=y8jpSZg~sQ(lN7H4Ap_% zsWNHCB1~5hO?FezWpV~2GkIJt521h`MU}AI?CkI8W~{#tr%lGLia4w^C(Li7 zV>H3m!x37_%b3*OLR;G``umO$D6M4P;+4cR3ASwBL?%2!T}26AuNSx5#l+|Y;qVw0 zb&vxyDn~@K7YsmpS0;mAG-VN-~ZnC?#&wV(coxlxD<&g zJ||^rfq^VIDq8sdPwqH->B`ref+`h#6&*6NeIIbNQ@3c zE{-3KfYZY5Q*qfe6tjRTnmA;ztKfEm?2?deM@`TyOF$M(6sLvD>BjCVK@IpJS){u+ zPBl+pn!@Z2LPGu+BYOW^8!n{vQ&oJ%1>c=irVVbRX_xEHZ?k zX-q4(Q|Z)jI81Cdjv@~Y9mNn30YTJpx@A;J#G#lt6_6yAqG4g8f@mY3H$exNU&iSI zE1gG?bZnwYRyQaLc5+3ToGy^dLDt)d;HaZuDU8J9>(&-tlT5}6Dxn?_}YAK7N3 z#OtQAaWZz7m*LL640LxPAdt=Hh>jH*9EcN*!2S`7@qzVP(v79~}E;oVFQreoT zsjez#^9LU=vS%}b+mGN5aj>(Cp;(sEiaI8h74V3l*qj6NXU^I>Y1Z;JXMX9r`#wR_ zKXmtvzxd^^e;-a1C};&t1uPw=Pifz^cEgt0|JS*^f7gcPhu;3yYXM);cc3GU;9iKo zx{*VNkMPbLYmiD>sA_JbedZ+E8yYYGtB~ULm!4(Kh7J7W_FsSNKd$@wZ$7gC5D&Wt z2YM$d-oSXzt~V}?4egts9FLtZ*(Gd}jfv4HV`eFezZ%OdQsN5`^t+J|7#QfIzrP

L!sovHpR=yK z>W1B)Drj}=vi5XJj~m%O7Os!s7@A$}miwhwi_ZE!(!@bGtd| zbI0R$I7v(l(-ed$?e*;M7@)qnjXnDh5{{*r-CU2Qdhpe@U<*_*GSJQ7mUpqKMF!#m zwm=1mo=*IsGV(ST*~k#~Yz&8LP~uRia;v*t9#hH}Atjeg6GPM3uzMRN}nY+JYF{nwwkWy_9(=day$ zh+N)8wZK3_!zAeTas3T96DTjG7$0KW2W#-wHd9{Lgq9qq^Y9^t`-WM1+yXj!kKie* zq^7Kva*u+X3v+PqW)!bVMPM>rUHb^RbHu{}L-@!jjT@hp;|<97;JT9HKJD4R)= zCB_5~(Y%1i>ENax{OYu-#^wVL{_vXjx;hTF%H?%bH%+BCX7S3aFX51jsFEFBkZ>49 z1i{1-0JcC$zhJgcBIPKdzOfotAV^d5OiD{a_)1IAWtBtwc99<&rI1WeRa1&TlZ9u zf*^<#wF1N2K4i;=jf~ktST=?6kzp1E49-|75)9d?oi>YL<(x;V=6vhxs-qR3XhV==h=6# zi!#w*=G0n}mc_1peGnO-bV?g}-9b-RH`>@ZHY1DAZcyr%@OeZOQAZLBl&BU?H`p8! zicLk4RU}nF5=~4~N3q#(d3|JyE;{-$boLj?7Tqj6{rum3?Y5ua`VZ0XgNJJ(WBqNr z_wS#-?t_h|^-hef813w)kV-NsC{ymXkmMpBj{`vw(Fz4HOeD)f6?7a96^SfPS;uKt zz;@LC!m9j$0lEI>i9p{b=rvo40BMTRGm zq%sD&33k`Pz$^RbTOP;W=WlXu?wNN;EF z@e+^~WY+H)pin$2xno%-mMD?6RBXNwH8r*P{Xx7ol_^a%wABPLWC=Z!$0lfmdv@~j zTOTr9keJb4&x~p>!yS7Wh-Wd2CbeaLL`_3g1QK}zi~<3dop>@wXi5{cfpQMStdEaB z{hViu@kq#5(ePbCk}{m%<(87Ug>nZ9rHyE~tI;?D?* ziIy#Lpg+fWs(?*4scD(QiUkYssTO@5doXhoI1~$qtdh?qC>G+l>;kH6p_vLwXvXW) zmYw-pu%dcE%O?Ey{^;gEuDtlFRX2Y7SGWDo_h;f0t~Gm>+#y<9Cs9@w;>{PH z=lxBam_Bt9ix(|H&@>D!Oog1rU+QPu_5)~=%8q^A6a@ztd~OAm9+9DN7`bW&E+I#J zqK8O0LdV{H;Bu2o#&AeZin@d(>UdNck5j?p7MW6EM-}qKk{QxP4`%%gjAD)>Ly_#N zr&oIdfznU*>Apj|Jb$|7%w)aKpv0&0-j*;^PyNF0Z~4W;Hy_iw=s8^T*3)<1^YVx5 z&pmu-oOCgdjEH4vjkuehAGPAQ!!F;$lE$E9eKdDR(J)IyB@>AjqA~=HBOR5muK8lKhO|pThp~y#BA5K+a z>z)ptc;*=fhkB^6!L(9|S*MhVT(YK2xMMd{+zDFi zGBi#J(l%`#fr14YE)k*KKj6B$nt9*mN; zbVNf!D7YCuQC0?TGEHyO^1bs3gzXzA9JSy8u zVk=KRjfX@|y$#0U9SyB0APXE@6@?=)~h=h((P|US{2{ z93Sq>6R4`ErmhxGAVhh28MRgAxD^whpt1J7_xN~sFJV)pRgNPfvNa|U({w~jN7PMZ zRb|GkIg}TA2}eeeWe0`4MzNUT7Z3cEB`2OCtop;xtW^&`PT$Z71|UnINHzwB!~Z7* zmrt1hCwtyKGpp&OvJM*RTPb?WDHd~_JmYKxLnDVo*YG%-*YBWrVg%nV7gJ`;qot{t zQ_nnup`o6ZW0H!AOt>Du@7F*5%e{AeZ8Vl6ZJ4atK8Ti2W63JAV33IxcD)e z;XnQHo#|7jf97p&CKFw=e z-9SI}Q)V%D=`!N+7|pFysIF}yo{2!v4MmN3BF5mr7$5HJBAUn$&q3n-gIssj6_lsD z*tO#$%A2M$d)6X4cCKfiP(Ts0*h`!wGC6FX5S3Mpq_bJB{`xH!*v(`~e4=Yo`0&Q# z`+9rl6-HvT`knL+r`fyX!&66wE_e+1)GhC#^S}P9bT;ix%Nf@Vzx~z2ZHrHN@0evk zViD)-kNx52hRv0}_?*)()siDk^Xhz@cFD;Uu(5mlHf&ar>gqD|Yzo0qhUoN>%@@h% z(iDq1lDdqpR#3nAa|k=v)4k?d1{;D*p4^CGB$+y|8J8^K_1GD6d074UlX$xi5e$^$ znz9nZRf{Ir=*>D8vY1Su!O(-cJ+rMo!uRd0ZthgBJIe>x8 z;gA1{*UFGe=O`2`Tpk@wP}$QxLbRA5o5?YK`ZR+6Ap170CYg*;TGvWRO$%{N4>@n``ME8Kt(Sl7(}oF=z3jmh~?@blY=(`sLwSD^7W? zZOZJu|Lz0v{=K`}&pYGfpK7LxBx#t2i6RTkDRJomNV-}%e? zPdw?=ho?=S^$#g(=~PmA{>cZgtf((17_cL18r%1EFflR4akFapVnZ!EcXzUTaDpm_ zfw$I8WvhzYmc>+LkYTiU+lj!x?E>Kb+pl_Z{|B$1ZRr+@>O>G>+^`s&h~f>DF>m3L zPt1MaeEzYk-njoq7peX-#`Dl0OR{M0RQB(Cm$8W?W4)u;(3#&@iKn)SYIz8cmB41p zV|RdP$yiv3l7T3Iq*y2}1yKS~G>`*;7U;SO zm?)xn^gdY-krfS92Gyxzv&kqj$g+i9Dk6(Is3vwt07()tC}8)Mq1YYN)-^EJJHWnO z`;k%#PAh{|A~BKJM>N_Eh7)I`Kq6WoW>}2u-Hsqw=!S@CDA?^zbV&i5iqGr#rk2m) z@Y$I+rR|NuzRs&^>RUdOofaAHm=zNDoZlHfgsLd`18&-9OvmjFAt(x3Ho?%?Ajzyj zabf_c&qg$yWxOv+A*bU}z*Z(w5rTBqB9cxqkx3Ar7$rLdM-GYXSnt3S2vX&DQd!qZ zC={TfZ5p$uwXkRJ0XFaLVn@b~TYaQjbw`qLl%@CW~w`P{qv{R{oJm@hV#=ivTPqV7r}d&U^;>Z4XF;`Zby zRTA{?-bFl;X4cFp2#yf57oWsO8@Cdf7;5@Q&;GA?`~N22zZ&lEYI<=v|EVrOBo*84`+Yh(g zaqCxWpMCTm^@KAoxn}k2PmoQGQc+RycPQ7|NwW%@U%v0Mhky0$y-iaVr~s+xg!`oj ze)2$kaNy#R@d!be1A?VYjEy4r+$>u>jnSbfK8K5{+Ing#6YSf6h%FmGq^@ZOZEZ~~ zTC#|d;eM9RU%=FPOGu~V)Kr(?)JD+I5fqDOURzE7V3drgGHu2@8vQnU4sAmyZ$UKD zRQSE@>gXn0NRx?;V$WrW=3`_n3y)nsYLab&%k9GBm1gRhFtKC-&8L#;+JrY9X0WrX z4fxarz~os=M`lf*zPi*FJ=GUf>FLo}aQ1bdKbGQuA{LeY^5`GV-_RieZg|dY#Px-k)+|r zQ(lcftsomo+?6dak1A0X2;jC!NQ%l>PcI=~Im3|@S;NFBNm!adU-vkN zJEF8z8q5<6)@<6%DJL(ZzNLNFDd$~!57&I-pU!=o)2kJ-$+JH9#c#LSz5el%vf5A0 zos%xU_7^o()qNY^SasXz$V5d;)3hCddVx@7)4}m*wCv4Sp8dkKrYQ(|3K4-irvq0! zLkb%urJ<3k`lkN(9>4SHc=whcW|G}(`e=~7Ls@(_3s5mF9nrF|5V1_~ssdH2fUfGq zBXMM34KA+_(WwwiCK>GPA)gu}6!hS#@e?Yqq~l0GJ%@MEP+dxGeI;*xw3TPxSVvkH z*m1Cv#-;{NJZ>(N>Pt@k`0Zy>Z#?~{rZX=2kNb{wfB095{~x^n&hcOU@+AuuNjNI~ zVt`vTm|bO~+NBcC%DnO5ogCS}|Eclu@h_E?l_ihmx&BZfI^E%>kcog`Ff=qmb88c= z4SrrNdYz*4c9~yX}X8vl&d0NICCW(qXYDhk5d<_Vq|cXBf}%4 z55;ge1?B`@1nmVXJVnX_3NE{jLlF_s5M&Wq1WA!_IRpe*#}YKmqDEPL1GST;;B@;) z<#XsogJ7tilNQQM#1uNyBQ=A)N9t-C{@xcLIx*yV^|8Bd&+6)xgM$NznJlrs9?D$` z_2o9o?J=B65lNDG3y3xCyAYSUSEY}`O}G=-`NC`JZ7AH!iul-NyLsw8w&as{12+D1_q$Y}*~ zMT>k=KybORiaw&rMC*^febb}g_|I!sTzlyi_trE{+T#n9YX4a3Fzou_O_x2fW&PHr z?akFpZ*ika8bN0*oxL%teO`iIfzFX6(L|PLAxz}R2*a9yD%)Awb^%g8i*A~DoIxn) zlm*KxDDdiw&qN0X$A7!^;~gCC>m!rPqFQNWub&w;{xAOQ7k4f32FgZ@ z>4e`CEFUhd{WKfDq^kKJN+V4S_f4s-5K5ydFaG)&%&jiPu=yzY++r~D6to=CgvRSn zJcsD=F+4sa#DgX5&HPx`b1eL3SXD z8d}a`*Y>>(^p5k5>#yM#tA3yqvT08uJW^Z8q&y=7hugyw1C8T79qq~R;Cb=UF|vpE zo;lcgIdiGbrx_R+VB-gGQ(51_veQnYx}loN@(Qq( z5FYNtt-49&G7KCz!uEp$bd9AjMH@xEz=LmZ<<{%2CLkT5r++`b>2tqx$#1dpQ9d;ZXU{^;! zE>*=L>g?Thfa*{wm!8UH#^j-rYfk0pgEj^PmlYb`3WXL2F!b}JujZO%Jj4+Oxwne4i!}594`PKX2f7|I}=}6CMdXMj5%IpQWTwz*=V(e-;#&CZ({d>9zYZ{X^ z6U{Lw3FN5t+xYb?N;U#{8yyLn0*b_Rz^_R(%|h2zgj5kSiaQ|j`NQ}^WfQh~t^(?3 zdTA&+3RKO(=TT8z8mcZ(bnyA1w73LaFThq!N{S0f zCsJgxX>z88ss~WQ77eew^y5D%tEl>4dxQD)Ry3E* z^y&3@y%Kk@fUHZ$^cRvCZpV@iW6=cZ(JZlX1D{k`TIXhPw3EJ}E;6_=6&KRur@Fog zMHO_NXrtIkFmK9arZg?2v#*ETz#%|Ks2-$hVptBl_8p?3NKjQdnRqJ4zd!I__}w}S zR$V3lIy&2F>+7T3>qQfiq~l;27L)7iWM^0R-&_RvT>+r&ky=ba%G#|^qr z#apYZCq)1<$*9{ja^7@&tSmD=RGmzw1JR7(nlWqs|B!eUl-CXepPKmeqpr;rb21h7Zd5fBg@Vt{d);`gBa^KVKCk{N&IAg(I#B^^w_wGkty#J1c zZ#?tt9VL||L%09SkMH#TfrZABi*9`4@ScsA>|FgwQ%+hGDJCO^8^zHXNb!EBd!0-y zi@(r?HPA_7Jc*$NSaR1Lth(@uNkMz)AKrWYsjsKo-}S`0_wr7MMNUe5UWcqL5mH5_ z^VkABib|y}(5!I=yRuZc%dwm|iL6aaODh9yCz#S$Pf=wBB_$<{rwra${|4p7rOckw z1dh#<&%Mg&zBnF_&dF0PoIKshAbe;t0mFYRao2Z8M0p^FMN&4?1D$mPN7Way8jNMt2zAG!bT2k!sD-7mfL!aWyVe90rh!0)~P(s2cC=Z)L%>NnCjO`Ap7d5!nPuORzH< z;o|vTN{T`xQgOxxJ7@eo;!C9x`eXm`k56t{^U{s&{Ygem4WTMjc?9KQ7o&Lam)Evc zR@V&ytbOkBdm^2?&hE_zFL?fm4U9#G2nJo~n#PK=&f?tj{0s~Y@yhD8RLz`E`&f+S zjRs{(f_P41S|%=C2caMUT@gqz;UTGOE<#0qY8vVY)yzTh2eAcYG6s$n$F^cjYMf4> ztddx~kD_>rdPQM(Z|lsl$Z)9m4{R5Phx)@`x%2v$7B5>xB${OP#vK@$95-FEg4yNc zSdnoQZ34`Zw!}i9pra`gMcCL1__5kl$HdUGIKh?vY9AC z!4)VV+P#f|rZYy}04{*g3CkDlgO+X$_rY0x~VhQVWNxAN(`?xwunLu+?0_03bM zn>z12|BxbvO{FBy->MvBL} zj-Hh~eE5ovp7FD*!hS|9jp5Eyzj^AH_qTuYuCMIHzbGhxs#)|!BJ@Yb zsIRXf63@}nHiDLpFlS07K0Sa?U7WG3f;Ts9X7fwWarL#=GO0L7UfKvFPVJOh6lvks zH3r9nwD%`jF?%M{X3oIKWO!xQE*fVoq;dK*TKaq0wr3Z*qhTp3La`B=jYqTTAGcXL z-AAE_aA@xiZk#Lb;p*p~f9m$up%{*%AvK9`CcNr} zBQa2rQgCLapO9jZaOvc;2ASh~IGG$oE3L+(C{z{~Qq)|JI~X7y&#~dn_i!nKf}#*9 z$0D1_vwq`yI0AxR4cjp|ezJx3t{&>D%9z<)|B;$0nU4TJ<3kv)zw*K-GKS(+6o;IY zSi)g>rH4A*X2i@ADh^RNI!4dCuU~!R1v`4b@lRj*)xZDX{?GksQo-TrZ*O?<_Wu5k z%E^sQbo33e=8X-s^o-&Sg_tv~j*Bn2oa+N##z%%pn+9D{qpV0Uxhg~=Gs4io-gE!n z1%S3)Z(fF!6}`hTB54~%C=~cyR0l(JkLL*&7XGe}!HJf(Gd6DA%;hW2ME7bu_2Nd3 z9zRJ%Wg++6(#$32&1LRT4Wp49tvxMNRg_RrIh(l^{dkfcnAm8lGGUK~Il;tJCW`Kk zkOT`{6xU3pxON&^AVgN`c)TSfhWZGUmEkTbrzRVxG%Ify>}mZK(DOfu7MVacZT>^9 zz|a2f5qf$?sSFoz`Koy+18Z>E2C5WTmP%fgD5{DMXb2PqgeuT=1&>F;bFL2{kEn=f_mNd9gwE~j4Jke;Lv4l#`Xr7jq zlbDTDsV)v;0O8_dl#rK64fQNqZZO>2!|id+Jzs^ntB?23(YyuGXO z`b8^u0-b-gvO6&{DH!%LXiTOz9_Dms4?>L+PbW!6Qxq2za_xm@vue?qJpS67^mg@7 zQP|GV@F?f3I-4a+7jg2$@nzi|ZB2CzO>KYff9-g8<2B#?>@BbK_4H5~_Ao!_!L$XV zX^Z}>gDrFdE{E9o2v0oo0vBI)S#|T2=5FA(@7(PZs;!h_WK+R(Dpq9KmX=MVf{vAU zTZZAf>I=nVrL~Qx;LZ=6!*9WVfNUyW_U4`rcI-P&Ly4E0KYAGjK|gLqpn2R3jYfHK z^?EKjcL`-hVfO9XLDS?ZG)v1EaJaKZYMkzz2?QQ55!Ij(5<}(aNR+UF2;Q zp-$NSd2|>b>F1GWU*hhYucO8j;;bd-tS>AnGq-P98yQU7XpTZfSrI`EoInYLs;QbW zi)-Jv>`TSQl+^f$XLz8uXf!fZo*3zC+P8PdT^ZZa>nAt;4~56{C6{)`MhA7S# z-T!(fM#m%i+Z)$?a_^fjeBp@)zB#K(qzPFDCk*v{_P>pkAfzCdv$1Up&2*uL>M36u zqOYZ&N_UQ;0xzZEdbSrmTKTBZN#k`n4UsTY&b%5 zT_Lm2oQ`FC*x#QboXKHkQv{02Idb?onVf;5DyW)@l#nq@3fv}(3U&HV?5E=5k8t^Q zw|&naF8Yg#)>E(i>fV-h53L%0;NRYK38%7t*^(!2zW3Lk`ogd3CyE3M&K^9nYvY%9 zJoUY&EGcli6f7Yy6KM)PZW5V16%{p@nHW~up>6LGI^u^|xbpmG?zsE&-}HJtnRkBk z(0^=w^@&?g9N9{LRW-eK3ETG{L6I4B1j3rg>ktZU?T{^2odXL|4!6jNN) zgzcCd*?$l#HbQMl0q#Hn6_w>A;|bp0zK?KNXUW33^z;w$*wbt28;KDrEn?M~^Ehwi z`Q)QR_q_V^Z`W?$_|mJ(F1YTozxUZc(BE5n&Z@IMo>TnjfGstGn!(~q9|eAunChie z6O`Fe+PaTbf99r-?fBUb|Lw;&-Sx$%FR$6eiBqST zH-8@IEL*_mmYqW?m!qex1?ln%>W7fPVmrx6PJ=!x4Lj>P%aKYo&@*6oyA-`&L4r|)O>f-|t)VK!~w&8!)d zX{s!tP1A_!Zv3e@Q%W=@O>V{xgjwi5jh^kt@u(=eM8S=)K*2<)3Yw5ew+rC{q>ZBH zzztItub`xSI%q1{>_TGCAYC`4p-N2;1OjU|1+9NZpMp9Ha_TXy^*~ybuVx@cBzoH3v=2 zQax!3!BCK7I)|%x7Qz!Gm>NdcHS)<}j_-S$Ncnk zJ5*RYCMH4!Ar*wBV>veYoFJcvtPmKcmt3%(j)53OlS-MpY*jdB$S<5ebQHr<9pDFl z?wM}<={YhP>0D=xbFkL~%Rqs%P!QWH?{yHpe*h-4-0(Kwf1dZB!M-CKVXj`zC)z+n5qB|(p8 zrMs}2{RcIkdFBZc*(fM(9K%Eki^F^NP*YsUqBGCn?d=E1VK5#UX46}5U?t}>r>XLj zJ*N-!KJ)O8n_9a1>td;lcj?k)Th2ZAy!B;eWyz-={pqJ~{^+&;p3Ni+gd<2wFOvdp zs*C)T_#}n8pe#_vdwqHOQyElE;?@*?^UM?f@W`W&?7QPrcl`XrNLFmeQ98SZ7>q;- zSUIdrp7GT0$#EXHLM)Z!g>~<8#W_njYsq|$A34fsSvfOiG*ekoN<5XLr#nJ-+i{9Y zi#dJdFtM)VD3KVMv_@3=@v08CbjV8ums_Rxk!lnDc?d5c9ADtatXu1n5 zo0w^n$V%K~DfbAf?Gf_cX7Xj_BnNwL?mc;A?|)}Q{<(44UH5%!oHE+qmz1ue2_4ewgZ+CKr>&zABy%jE<)Ky;F*t+ArH!u6qz2ACh)%h1tUKn7g zzm0r0O@YV9fsPpCqZ4Gp8^3)2zkT7V**Eq_yQlU>GUN?`t|=2uKphZLB2_SLhuI}= zLasbn3%q_8(NjA)G}Z>;O3I2WSailL3d%~b4Vwc;PH^%>3$tcSCYsK0w55}?=g+`Q zW%0OGT*Agt-8fRA#?s&@I^Lu~I%D(c&wb(NQ>Xs)p~FWGFH9y9C9l1<=F>};FS|Mu z9p<7X&CHxVgP~ZON1t57V0;XZ$Au&AZF}{RoAvVAC2zm|7Lm~be42|~+T@k>@3F0<2zSWCMT_R}xliB8!!K{5 zrLCRIC;2FlGw3L!>@#z0k2g}`l$gx@=gUgiZwlFdkj<3RXDMU4inKF>32{`0!5F$@d z7=%iSDVlj1TJbdA+oW{y>D#AWexjZ=pQ|rqM-+tleUrHqtn*zbmU+w*$PR2aDUbrQg z&6eSmH8G~B0NoL1_j1_Z?&JzC(ly3aPDc;LOF#S#|zJ4EMG- zy!ra8*I#t`H81{IaB%gDH-7gEpLk{@mcdcn%&+ngb`*y4Fq}0(HE_8VqW$eW`P>-O zrhP+Rchzm}f9m@pgWccE<+6(A@;U>3?ZMd4U_o``^x;R=F8IK|ub2S-zxCVCr;i_A z^6+cB=k(N_6t^Bh3zMcfC;sQ-Wl@_=qk^WwO_Q*4Q@iVufjK(?D z($3N2$58DoeJKYcXHZsN!u0wQlyE&MS1Bjkb};pfv%BkR>wlZnZUgQ=zJF`bP9@x3 z9j9wMdiv^?tvLV4e~-EOj8zHX+<2s4giC(kBjCS}6UPrv`^iH;`mZnF^@&U77Y9KV z6ogcA$r#-+9TWw}mMDUWWEF*IJj$kxo0&R)J{_k{k{|42`lJBC1yfLj7o-9%xa^Yi zcBWzy(CL29& zI!>L$b+!e<#Tnp_ z3SD{AR=lBN@~WSV;%3N7uxZyedb$TGD)3WN+i(IPSXi2RO15^ zgo6||wh-Vz(4!DmawH9#F;AGug$819h_?Ox3f1mv%ZkJ9%dUL+mDOvm z&sYS7Z8IgTQS7!Da{CFmK*SStr5%P1iIt9oe))@^fA+R}?kT_R6E{70_Oj*M0N#D? z-Q{m>+<5iDgU1(t>+4^3PcBy%PHCD(Z(k3OJiUg|(Ih^%LOMFe)@>1bx<)83FCt^) zIdjfzDlLaiWBd5%WeYG&hjetX_U{V*pFA}EA8)+uvQvX`Vz$6QN5R3D%HtL$w&KI* z5B?5}3+tAC$&%R&#AE#W@eN?*aCvV!!a%frD)2{rfKIm@ZG7NAzV&d4+s$akVE4}5NK0kzidlriUSu?j&+Q?XHP8UB zP*B|ps&r6P6`_a;X}U`#Q0Swmq=10Wi_0G-P}YQ{RU=e|bS{aa7UB(iNymC9t7s-0 zOOhIHr@-wZR2raa$|A-hJ(yX6WxD||4U4=Xk*L_xMmiIIySfgl#s1HpJy)WVLsuM1N_2_~CgBOVDXg1?W#mW? zbdipa5sfABIs%v9MCpm)BpnVOJHVk`2k{0y_NHFe6Emj(C>ww28m4m~1T0HP>AA!oU9TXE%BMzdy?>YwAWWU$Mxl z_i0Qm*6|APDh_!xy3>*efB3!c4v!4KR$f+~{HsZDPC6*{5S?Rw9(>{z^6_z0sglRU z(IprrW;V(#*ImW--N)z}8f0`V!sxDT*y(Z3nmYxLS6sOHwO@bd2lswc?da>9T3S-p zbK{LSe|yHvS%(1HPM@6d@8A8`wV(LdbqyXhk1iD^mlx7lq!BO@*iL|V2D7w8v#6?q z%jMA3c9biwyk_f(6GtzYF=KY?9~W!`4iJC;=WomXZA<;>_rLVX6FvQ8QgJdQaoIMp zoP#A46vx7=X=E*j7vI>-c}o{?!OCSEIdY1=!66pRpU&LEFzK{OcULHg zwR{D6!)EWnlWf_xo#Q8t`Df0Ul@1gXJMW)E8KCcdX7lp^4?JG}fw2~pR{pQ|!q$^V zrtW%o(+ziCcmCJKV24L|6-oj=(zzH1#{fm(C=*IGq{OXjytjK7zLH9&&7RJQeFqq5 z>)^uqlc*^zCMQ7^f(w?+N9NPK`|f*8y74*!L5X7tq}xJKH1tqC9lgD*edZNr)l^P2 z6V`Ryih^sflf%73ESxosj{XSm?b?m4syIR*-@ge7De2FsoEVR@xYFkE<~PuDu@}2f z9sWk$w7Gv#FMz3+e)ec;e5g8~O)JIKjrQjsssFw5thihz#z&rB_xSgdT}QXyP%&fW zuV*c}Xq(sXHNW%a+ftgRgmagyATu`1$VflFKoM4Mgh?}I@2;BM)CtgaWalHNwmx&K zmU0*zY-4xFX%GTcs94fL!3I<`M-afKxj^6y3^J*9Du;G&L8fL>Qd7-|{rj0*Q%PMz z9o}FNPdLQ>J^R?RXCLP*JClNvA~d1%%rmdiHWbI_R*4Sv^TO%@b{ss$lDRWzswuzB zI=JUD;O|}lsH&bcdc!pr@7ua#*Al5)Sf-09B|0IGAmR!V&ZQ7JgJY>2ohgec1zBGB z#eH9RYR%@GUSGfNuFEgE^p)R!S4T%j?JKXocE@n{=^2mw;A>8E)8y-RpBm=Tr=KB_ zh~ag)*}3}w2ala%X2WCxp)i4vpQQ^MIdZ5QCDp^?CFfyF1;goJZ~|F+j?j@a)47EeH=S* zjOjC*shcyCxl0$2ipA*e9i_(*#5()Aa47_Ig}kX?n)U=Ztb!vnP*l{38#4%pfZt6) zStaFD&LmJV73nI%GSj&IMaV=9kv%|7(=>`E&mbQkVtk;VY%)rtcZA_w+4UpCgV+Bd z0o0MuKM+B4AnbF~)Z9Qw?}HHq%W;G4$B_<-W`UFl95hW#*jamA_zFD)gMxxUC2G+W zl+YBiPKum)5~-+oy;T#+Js}8G6jD;vg~v5Qz!xU(2&$T!iH-IVAIgLDArzf_-ol;L z&>R~fCM<6)kBLjM@cI;N1Ei+o0I|Y)vH^!xi{^2-wTowd^*kxn!>5Z%8h-eXcf2_L zoJ)Uw`4!i^_JQhFElK(GMoK3&kjP8i9uID>m%7GAipt6u?eC+kqLhMwpYcePylEmF z8*Ft#x#Ux*s4b&-#`R?VRh(!WqGLSHP-iQ)_E5{CQ%w zM2HEpY^cD?7w-8qXDwU7(xqqr(fmqEO3)M=(}av6DXl1EUbUN<={$$p{&rEz?+O3| zU9Hp3X!g;cF5%6$*OJYQ5_D-;Sm0Ao(a5C?P9AUNqD#-iAMjzNvY@G?(<$D4Zzq{} z6VsX-{v{UK!)u#%lQbP(c;UIbONxv7Z@%%m{r~a(d(VrEC;X14BW+1zp~{SqirX-; z0zqQB3q_B!qDJy&yF4ID$ zf>0EG@}Kv8r}gxybyJ$Bb@2bg*!k|8*Kgl@;4{Z|AEC(QkVhwLSq$bioS`HoZVT^} z8bX!R5T->oXAtQ)N=ZpMVZXr4jv>+(W2X)7jI_vD00g z=(-}nFR>tB2Lkw@whDGO6^PbB`fgChjueFl}Tt5|uP=AcbL(a6d|gyy1> zA(B1g97y+a>m9eE_`I~X^>Xm=5khW_D=u5b$<}tBdu2Th)26X<#Uid)v523o+lr}r zaVri&IB2RMpU+cWT1<6i-G{bs&cFO4Yah7p-fw^F`}ci&Qdo6~KoDKgh>rEMZ_FgB z_)s*kk@ROIimsE-r8sfiQdD+R4!9FoB>8TY``- zTml?jl1juFO(mHi)hF z8%1}66bRcw#l{gjaZ7+>)7jNF?dYL>3*LJ22VV@8)hv1D)z=vw>ci#oV871@O-qxO z&Q503R55$XR9gCn>FQ{uz%7|Me=?Ixvm7|kNG&clE_O{~~Hp2E};zo)%y)Xqs5hzXJFV0o?wuqt+RdC zUdAFR+}B~VdD9!>M@WqilZ=kA{H!x5^^2=J zj=mee|K5K(KbcpY_U_K+tFFA}iR-Vw;nx7ijvk)%gMa__BVYR5oo8X0#PcrdOM}d< z@DflG%)!Np5tVI&2~=G{(=}u^%7Z_C;4$FLKQ;G~%DM?3s`o`he=Q(TT3FGa%w(_~ zn}8-s9BeG0dj`J4IjCby?geuW7|&VpD~ZBNmWd$uVTEfpCbnj zB0L_tTaHth9HC5t$K}It0LQ`>3P=S_*BR<t>?S2tR-Lp-X|+|8V{@&sdoRlJCp@4}9_4Kl+ogeh~OSFwhrX|Hi9# zZ&?5O%@ug-}|hqtgPxDij4B!kz=G{aavBckxWO>G=*eZ z@{ND`(&|s$^3m|Vqeqr}{oDVlD5{2njUugyJ{o|O6U;wHI!p_z_*KcUKS*(L7-jGj z_`LK+p?_qM2cKV!%Q8tM(kKXS``E>}y&4Zb{4B}5Nqa{>t+6y8z4SbW2BMsdM?v)< z1z3hjp+{x$%tmyV>%%+$FS&BvBfog?8(;s|Z~xFGgu6ZV!(07*naRK9-e)-4x3|MJUszO!Y^rPp5nky{+oqAcuT`QjM} z0Y$}Syzt1c85>RD_q%bVfrdoY1VepY^z?LM+YXCnO^3XsKN2UG7$uf4iHzi${+=>zNvG7eUwJIyG)?A5-~AC%8mMj; zrXx^s7>UH_8;pW+kdIw`0cT!uA1Zb=Z(sB3zwrb!D22oXs zFC3s|`q}u(XD~L}N-Ekz-W6hGbcAd=NyZA}_3Km=72s$&;$!1P)B5y3isiXSKYho? zF8^tX*GuCySF`4&4Y-AYqUjX)160*C;MkQI#wg){i<~Wyii1m0zyYZUbeBRnsH1r_ zTmdh^;#$I0)5+UDk~sraL0pwnNe+d;p0Lt#+Xh?S z*>=TG9{j;SMLUk2Ih3%KyT17Kug#q^yB(mWAX?IC9|K3FxX{Psne!>Enu2NNa0FQ1 zTCzk)C^1sGAymJg!H!x^B>gWFu{QvFv_{}#x`pQqf z{eauZV4~r63BsCSd4-oexw@C1_{EoifBUO9vtxKPZw-5oo+KR`A?$NuC=Oo7g|0{} z0mJ1GDGjl!>FkwzS43+-Vh?2q|zlgoskHkF>zuEECjk@acJ*O zvatvqL*tVS!@xm7NF5g%V?%MaZaV^&L3DHgN3nVEf&ctI@cF;@I&`(S)IIyu&%gKa ztIxYJG8SWDMUWbwO{)yz*QlJWfz$9yAS-oZrwR`t5x!6sk-(fI1 zNJDci!m_a)2VJ$f?838ocJ&6{*>{SI&Rv3SS_mOfq>Hhf$?CNmnbTCyx#uq>Z#g)& zKy|qY`*j|BX#T;(r4rNQGPHnu^*c8-B>%E$fO;bVWG({Hu|HTKvUT zXx+8l`i-ce?Tq!W~QFM zgwBC+o_gYGGPw+1mj~fYSkRf-40{e9BX2`#agYmF%;VH(l=1R3sdy)bqmxc0k+!Y> ztuY-vw0F);AHDp|(P%Dc3mu7rq6uQAATe$dOvK46UgF~;Y}>Y$y2b|H+kc$h?`~u~ zohRkE!Aa5c?mmnydpUDzHDA2@HoC|6u>GA)G*_z3m|jXEe=%cT=64pA|68s+t?$U8cb@g9mxbY!ZJyfDZa4rNp3PUM+^3S7Q2LZuDlvq?N& zH{PBA$>`W0;(X`+8=0agyjQL!us;eaYsRKJBk z7)GdWbk&1!DTwm9xPlGjVy9?n@8#g`1C&+w5De@m86Bpkrh-f^M{;D4(y{=)QWs`4 zhwUk#Xi^ZDOULgkVr;OR{*HFinuX~Y2vlqn+<6n}2sF(mFB}{*PhnLEC0NFYk%d4Z z9o;+WAC95B+&uHfraQlK({()XFJHcP#mf2PS6=avM=rnQ$|t7JoYM+$aQ%;EspkN$ z0x!MMVYa_}4B;3^%VfdyLj0w5XwoEC9A=<@kZPZcbUH~kXCh4v%SaKbE<&Aj3q3{^ zKl|mcXg$#i0t_pM5HtIVsLP{y1#!zHDW?C zDiElemywJ~DjlWNC77n>DKg!pl_H8f38q&HwsoZtLPHuBZUG+#_zw^pAE{2878L~n z7A;xKn(ar(6e-TKyJ|R5^e7Vxq%CJon0Kj<@$=7CzVrW^r7h*2O^S@yu%ZZ zK7+2QMAIpXi;KDa#w%%Q@8a1P*MXwb*4E8S>vnSK*^9Yd(^<1+8>0yW$ED%qbIh!( zWoknmq2lrnwRrT!uYL1-pTGN-sa-qP-O?L1sBp$On39Z%050qa>bRmH6@de2%7o9I z?HC9onl6x1r+p|v_i%z+W`lJrcNZKwvEsfHg4Q__Qv%a z_TPEKrHn`7>^2KmgXB$x-KR`6Z8@<~6)S5ZR2!+qaqJw! zz5R@i#2FolzaFlcdJJIgYtP;ArO(~-cs4KbxqNIr*2VGOF+AEtgHa#vE3egp+bU%lW>$UhFS=o0LkGa`1AyBcRlaze4EUmNp)j6 z?!XA+ktkJ#rHqd5B%a8jsZd|%uXJALvMUqLDRkDns$Of*!M zhCmZA)E#HglOyotPreFV``7O4vBBv-q6&m`2I0-Q9%z8fVUI#O-x|vah$5=U?AS&QjR4Y16qY&RKr%=kNK4jk+vbSZ=cADp_u_jlsrrVp=W) z0tti*q1<(ERxX76fY3q!6Tmd%-f=Ios#Ppoy_e~IPCw_Zd;k7;j|}&>es`?|+d2AU z)~qR-z0dPL`+1&k*|b`4;f3eXKUJYtsUU^Kn1tyr1vqYsZ9Dfcy`z;IuV2fFQ+@1u zWj7r&y2-; zDU3+0U@Rdpalnf&Jc}g-QMHCt@ZfKL`Kw*8Y@2oNc`Ivg*80Eq-EZ9S%RBFUw>AQV zg%CDr`l(UQ*s84;&!FdhOY8CGM6wLyr)3gD)zE@JK4%fZg#$AY!juja11ALP~j zM_9RH1=>s0E@{W*x^>s_>)+hV)@?hvZ0#BjA34d^7oO$4*I&l$h4Uy?Jx~(c$ud$b z^1uVna#l|_pZklOc<8C;dF9|KY9)=GO6n;gNeBTt#r@M zp6}lA^PhhCh4t&-wdTqzH@=ziGdePSMlP3Q{d3QNju$W5dHYYWw{L`rVwv`~MsB+LQqszRlYL9i|G)g? zXMgzN58k$V%X81ZGo7+1nKV{@m>q*9Mq&q7Ne~8sLK%bYxD-Z*n?C;W+wXRjg^~hk z86p$2^R@l7w{@}dTumJKC?&Asn82vI@jMtyA%mEUmoH`IvPJy<-bcu04W;}fm4YPj zz2<7UXlELl!Z*6MvC-k?8`iD4MO!WsgE6}PzDjH>0d#a6@elv=?;m;pE$ecZtytXp z?zdmXV;f&3@H|qki-|RnFrZ^Z95Sal%eAYo;EJ`^bI*g1ajJiSRK}rY)(qNa3MQvc zF&-&a-tt~@lYL~{y0M%FjB+uy&E&)ZiW5VaSh02M7{zcJ!n6=Yg060#uJ(|Tfk93j zJBrLS%{z7C=$yIp7WRGb>!1JS-+tlmK3oYbK6>L>Jp2464jdUEoyihbO9;ne&azd| zxSwiyGeS#LSS5}WaTEduDFd8_Mq0ZTqm%?1P}#YVnTPgEMDZzh?L0vte+J{tjiho_ zjF^WTK;(lAE@tf5%Pd_(L3u=cWx7#SJkz6T!R#J~_WFJf^v;H*}QAdabJ+L*3FW=qYna+C;G5%tTY1xi}@ zwKCgx?!>YZCb%$Qj7B1m7$%2~BZNd*63f`U`qC4hdH$KlzJJv_uolplB={3~Se{=8oS!NXkxg)#{5;T9ET={N}DlxO~}S&RcaZg=!2! zU|Sk3U50ac&Tr3RHNa3`87ULye~d(;k~kEQ#-kj^RD^{uB-%>RHr3Dl|MHD*-gLv2 zAG`XhYwo%A-5>my?pbqkZ)Crc;eYbVHaB^(QjFDV^p>mi9vo!r)-8+=4I>EI_~LW# zzT;oNBm4S$7k%Wzx4(OEw1hSmmg68ulz++L1=2t)69<4fO%g93AsX6dzQwy{kFTJxhH{owOI{N8szFN6T8kt$*|mm|~E&hevtR7w?8)P8S+8btaQe&c+FfxDkn!fRmU;Ey8E^L%aptZ)-&wF76U{llr zCza-Zefh6BZ(bKoJ?HS;3onr?Mxau}(n8A^75j8II=p?&r3kx`qbE+`s)(jWi+OK5 zi;1yDcC6ot)6mA8h20cJMsXaC<2E9tgUkr#EM1A3xspIMGugL;h6cr^4bM_57O<@> z<(eUgtIS)}#Dz2GGc}dR%`_8+hFornsgi!m^YdRib@Eu(BM;sCS6}?%-~7#yzLDlI zlBDbPbVExQ?Q^?`+tB50_P_Y(9hJ%i(_0i3PqA_H7;&u!EiIscR~yCiYBFhWt+NeV2y`4$Ef$d2l=8#$T=r!SjkL4nfyX&;U_VW17i~0_Z4(PC0ZUDYV+poy z+Qdc6m+-c8R`A%?Jw#ey3BltJ-NR3R_#M+Va~5qKopg3}v1IX?0-&vLoPB6OskVIo(?^L#)g64TSeRwS0Km^otxy@NxPy$~g2 zf`TCs$|lwpr-llNPQ$TKmW4EixXz^4b;gzwiPu?KTU1S!(VAxXSc%nh12XL$Ook4r zcnam(_WTJ91$01HZfT3-4QZ`K`s_6Roq; zF4Gz%xDn5us*(33jsl&`J@JLZ{!=3y>+NGkcQ?jP(YE+P{K5oKCUPv&MkA(mv*hyY zIJ$i^n_t?&$}6u#SQ27ErKVZGX&a4&LDsCk0;{E!TI4csw&0evm-4`iI~kjtB$KvK z!cGR}#?;Y&h!9k;sKha~7$Or8)4|@S?qBojGf%D=Qf>Up|M=Y9w|@8&|MQIbOWt&= zq_Ls?xl@yqY}l{`Ed;~8$8aK_lmac_Xx|6|&{BbkF!g6j2$>Ww#w2zC(hvp_3#U0W zxrV51CZUk{g$X9Sm|;)hN+|eM!Wvj;M#m@k;lKYD6GsF_U|9mR=Edh;-2Rcj{Lz1=pYh5d0~e#zu&MC^i@aR?_hk$8~0G zLiR-gl~6ISyNlK5Ehk?rk(P$0=4R&3nZs3=uR^7>tlxc*haP;4iClrSW1)>9j18rH zo=~Kid(H*mOk=W^M+%2bQ#Vp*suKfDO&-ViB|;2GkJPBCvuQ~?oRR5;z-ROJBJ+Eu zF*Y*H_~-=rTu5QEvMx0}z8By}Kls+&)xaR6MI48m=pDfo7PbN-6ejSoQVqzK(wbO$e(EDFtCUAZ@iVk&oHC{Ui+?Hx>@p$C5q z{G_q5p?GR=l1!Y!F&@`q|wanY-I}&#UMjDv_XS zv{gJg)DuM!d-s3mE5H8vkH2C&DJs&%k`hw~Km~%B6ulM6FYkTqoj>~FcRu&&&-~qY z|1)u|;>cEZ1Erirtx~{N5`%@&2{S2{l8kH7+SyVEF$7u*q?Bj_uk1O({*(9$3= z!~|3fv`T2UBxMs323ArO>pwP7LVyv1SSqG0IiAa7eZm$hrJ zMyr^2-S$2%9~|O|=hw6M$SFb+KTHrb*qW{;mpE`ak()qfU1m5Ak(8L&V{Gu`w2yq` zLmM7=&uD{Np$O`ZIld&l%5;_qf40UamyW zH`vNT3zO`Q5lMY*G(recww>H3U)QIXs{w_4M5#8xXnBg|3umzBWIt0fjT1|Zjxi>t z!F9Ol`m0#G=5n5R{#iEfc#YMU&n8!#q*_UXNM+uv8;|b%#g9MVJ21FF8VN=x_gEoO zN&(4mAV#ud?;)f)(wepv#%bij#Y-6M?V}QhI6{yG+S*#U;*ynIaq$YAhE{&}@Y6i` z!bTj|B_T~U(%XBKrp_)pW}Ja(UktI0Zs^8p>Y!Yjq&RYfs5T05KyFH+ttF&0jdV3j z4j$;EP>dKI8zwheU}7jo5L%=gT9CCeL2aCxU%_>=*lq*DZpB#b2;maQm{_Fn%VUVx=cP@@ zXz#p+?laD2yf}tZAu@8%GA2$LB0I~pwK$DzTS80MVuGMX z7zDU>W3uN48YC2R0- zlMIfIAT5j5(p`fQlX>hb%K+zRMI~qC<{S>6l0#vR9}HhVvoj- z3?SGr2ditw}{tQL9SZMWX{@sEGEOQY_{PH2sw|(^PR+`&ZO0xQ zB@t2}>g2!IRazvq@)J+L#8|P&qMkD-mn-;TjO{q&H5fEjTxB3`!VW@aG`loULauJ< z0U+yrzBVzAEr{d9DbHa3#FRszlt9*N#RkWaiHnR54a@=F6ae6{hkp0bFMj5)ZmZTb zMk%CBRx1ohDT#tGxtqyKhFDtINnK(<2tgbg=5#dikz222=DY=z0)vIiiWSRw{`n20 z9h;>K=OO(nwMgPLw{y$&SM%fxTWIU-VET-iJoD7EEbQ)N*##>o`3V8il@1YtCtln{ z@3C|0sTTkMAOJ~3K~z(G`1adqNL!q}{WYH2{3-*ZQ%FnJO+djIMPLMt=@`dY4CFk@ zWoUJ>*pA1xZQB>VykqCrp5L%>T`o6uL2GNDYQL9b4rl~Z~r7ax6b|fdu zlHqE^_zN4^x?v-JwTj!=$XVwso?-C1(v5|p!z<=5ja?8f&FT3ToTUSNG!O~vR%SnNhN&OZ_ z1|bZQS7qNU`S?6-aWmlk6Dek!EA&w6Wp_ENJ z)kMX1ffTFOT*b+ghnai!C8REDCh|if9U*Ojuv(Fs*?4|LRNPP6Epw_@v3Gxp)~*ZD zK|mNrm^ffEH-?DEmYJ(?omF_% zGD?I<2}arI7%UayMUv33(WG;vX1|MSufvw@-(bF{#Fv`i-+T8@fjdwcs-8#L_b3%Cu2|7QvFx+u)sV62(>W*8MJzjT+8UVN z;vuC<=8k>=ODQ~G<7HRi1^w7@MD}$4)=7V4i3H$_OmbzD3~LOW>}T#pXJRXxFp4Nu zeSUraV^|M84kktb*``LWyLy#5d;T1LcIPk1M-t`81pL&7<5fw2Ib>#`%3QPmjR64d zZRuL54VK$TD&^u;6VD}?WGA91U_o0mT{F9Q>4_H!e4mDtMWhq|B5gEUfN~VdD6}xx zb!!u4Cz5ul6T1R~ASOZxncN@^=I_pPuIYOE2NRXE!mGnhB3xS{Rr1wB zEO8qYZH^!(Bw@OhRC$VwbVv+xGGR8dH+sBL$OgzRzn_n_#v*o z>76(YtsLFEf!e?UE?BXcGnOnN@_i73hUwibx$G*oJ@GVqU)#moF200{(QMqhiH3;* zF1qe=qJ}oYFhp5`Y-cB(wSZZzd+6z2$dTSbiq#m)5y`d~fe{H)A~rEfNrGBTEf7Re z2CE_nWR)Y6A-%u6;3xsoMw3)^ zMkISyj~-$}{Sqa^!r9$;p2xuG1YltaLwnZ3wj)B7!4!tkp`jc@Rfo8ijnv75Ym7ii zLAjFnk4qsiu>lFn7WDTI@~i%Snj12lwfGFKzius26!XM$>lv>I8nO*<`2gU&m6vV* z?mztP51#(@zkNPu(!|!f>a4mDvhq^3y@NvV?i9p{NaVITybg0O*gJ3ow6}lNXKD(s>nl|cd>W> z0eVmNqlvK{8*MbPhDxbQqb@N~8pGF;wzf%1g)uD4r7&?AZ3IC%hgU6umBJW7xfl}~ zn;;lr?y?G29H50^&U8utp**!}K&2cK$4EhJ0etZGPrU!DfB)rgDdlwgQG!}nbvCUL z7C{hGtQ0YJGx>>#9Y^k_qiY6TJ!jM0F&oE~xWXYQ4^bG~Po-9+t#cvGor}ni9m1;( zv3p+)(Q+GB=VJN}Z(+$C3)gjVY!~hOoXBN3+HY9AY#o(TO|;M0MAorTrbgs8;#WL` z%3_ouR~jPpDqxj~gBm^>$5u=Yj-X5h- z#xu`7!@0{p&E;=f!eBl4BEQ-Ydp@3!_{xw;rSL00`N@7#*=byV zC>`zdC=`3C=En#%h*;3p(oV5l!frl~^qfYXd3GZ!SDeZGS+h{C!Z#X$1R*eW@E0M7 zjHFhnp(C*D6h;V?m3&_mhlxzua>!K;qE<_ub8YHOC{YKU3`SX$W5G+?c3cAdrvLyc zjS|YHRIZ|9L##>I-9n(zn9wk*XBJBrEa0K1Uc~bQgr!~|0BGgVJ1~mY0YZRfxmcDY ziV~HB=STQ{h^-VtN&;gT(Kh{F$kEX<7kWND(^@zlwlmGCk+nl=frKccd&aaQcl_ul zpY55q;7!j@Lw(133$>W6@wwoZgC2c3nVr|TyRC6Gt0^8xa^;;Pj9>Z?T zQ1t^W$3hxOK|l?IsT4@J&4Os0ZWr1e!-OxfWFmVv0wQga`bb&C#0mSao(xT$87-5! zBHBR4mZYqRqlXVJf3pC90|)lqUyEXlOrdpzkOG9J8VGDR#u71m$71{_#FJ@^iAiPz zGGS)|o*&RVFv^N^l3~2IY*ZA}*4oC3<;!{Gu_v(Yn_1E`o6wI4qnMeqy14$TYqmZ@lS-8~^ZT?BRm>^A9yz zf>J_;MkiOLA%y1iH0N}^But{%F?F!VwInxOc_BOYALQVvNwTiSwj@Kor2oKf+FK1r zLXY8!!BUAWWEdysrzI4^2vW90#4(|X>*uOOS&%jYzg%Jap(=g3GH1@7#^_Xz^hOqevasssf1=z->Rf|K;;)_?wE$&6 z3x#kb`AUh$*T2FC)?7|Y^9=SLI!vxwCX>xFt9u4#E?bP7Y2cA39_QJOTM48~5GiWa z3gwEXTC=ML@rDOKrDDOl?9%i90uq*UXk^|0-bx4^S`+JJcq(P$?_BgkUf8ya_usUZ zo;hulY5`d%MY_3>hQ?;>be0Xf_p|xshd6TN0MfP5Mj*AIQuYY#BGp0>(=?k*?=B`L z4wGq_NpT`eP$^K!7cf#0`gtnBbSk=;CV7|@i&_xX5o)nbP_7VFYUrv(6oj<2w(;_o ztzXJjLL57dWkO2T7-XDeo=6}p#fcMrVB1X8GW2fQPS2T((6OMadl~8W6hbwlg^gD{ zMSfrhJ{Fx_OL3im{J?g~g*+pZGnuh)38SM&Foi9gz3OZ*EyOxPi88x(9;RR|K&n>q!R_=-eTsP{>)DQgM`O#Y1A@S9~nX(6V3+LwYR} zp5kY}eVEtw93-1{iA_vs3>b?>TVV^$;lqdd?yvs9KYix?Jo@0zzxdtnfB%cqTU{b7 znj10`AG+be)G}$@A~n! zcfJ3w?)ZR_-C_@T$rnO$7E@?w5)*OQbhRnjT9p49Z~n6R`} z(kIu|PO=ULL~)`Nlq#tgq)xt`*y;uh)5x}5#MMnX4h)5yH!VfhjwzRXKK!8%{QCPp zzVr5<{_^g(BtM-zaTq(*#NzH2uD*N~kH5H`sqt}ADOGR76Lrt&JT8R9NJAJ4Hf`O_ zwym$#eYzFW81h;%6)76Z6*8?FVYLv3Wty^*iKz%FlQZAcl{2V>WGJPq0|KY}|2ph& zx&{$o*--HfwIH(Jto1+g@Pj`u1j#RtOqiS>adO94s}muWWPedp!$+YYHuZiMBuVX8 z^&&FuUDS*sj3Q!TICI%q*p}kaN1uarHcJ-G#MA>9B}c z-kKsXA!8*dYM-#v!jA<;NQ6*q+_drB_r34d{bOUJ=S`b7{f*lJM#=jXcqJmQgk>2l zsQ`gCIvMI~i6$X@pj8r6S`#actDxeCNXteb(Q(Y&rZi1Xgi5zj&ZMyWr^q%r^bVFV zmW?!qAkd&}3e_ri-Sa56h>@04?;|BIZ{5b8{rfm~!9s4l=5orV0=st~XVKz$T(x=? zFFdn}i?6-qEkFN1^2tyC)9$B!`>A53!nhYR6dI&R&P^j?!qbEoQ;&Bk(Yo$_VL)h! zR2C@BrtPnB_U$+E$q(Jk15doj$W$4HAlul;yxCo>y?QmX7cAsAzkir#H@*y(MXeIz zRYLNGDy2$9M-aGw&N{Yi+kS~Q(nZ#YqJ+dGMDjOA+9Y*47AA@Ti=nXzZoYCQXU^y# z_KP$$HZZ+&8lAId<4cE4JNNVCb1yMA&__CxkRd=ILZ6ATlVm&QG5@@4uv!;WtmMHq zWE!R;?IyhH80E3oFu?>-7!ijdCr&mHrWe!Ds9DrmCI|vv*g8zLxq;%;Df&(v!z-1T z8qJe0dUVVSCIDvjEaa6vhmxK|8idgpZQ=PoqvL&C(6SD1%Hic*Kc{_08@0LTkZG7k z%k=q3D~$~Dn5mr%4g}0ub|um;;g=3moXX&7Mb@~C4Zq4cb3GO>yOc`JL5YZ|i2}QJ zZ^BH5w56e;v4PNW5u%04x>FE$QLF;Q?Y>Fgi2Qk}%e2B({>2%O0=2x{tkk_7V!0lw%Qv zVUkM#q{5RaPWmBJ$4B270AM+WQrV-qrJZ>_v)MA(i*oXu`&`Hy%>ujG`2#6)Zfw=_iZ^eQ^L~z(U)NG-hJFTnT9; z3NSihu~BbrBdIuY>==Xp{tKqJwK2ENW!bzg4!rUT4Xtf7&6q)4E}?3MhK5$ozjifS zU)%&OvnfnXkSR^D>h0HI>?ZuMnhZiBi{6ucyt?HjZn@?X&RDdJU3>QP?E05EG%$h| z7Ph5c9~^@wYdcI<3?ns(WQr!C5fVyBa-PELALlz?{p=5(c=-2~b?Z8U=M50ihr=7?RkO5-eL`w4z+~+49OkUfX}1IF2Zm%6#Ip zU%+)-{wrSZ{pjC*Yv_?>(QV0Tqf=4AY2vLAn^--3>8}3C&2dOOLI07rgQVxD76FY&hz<6&j zacpR7ZzA?4C>3jjfuUTAkj6$t#(rhTmX`A_SoQmF{^M7B?z!uCe=%C{7RxyCC{I$5 zpcaJ`a+9Q8m(DY;R;e&?d^4?c9Hw_JLRgJ>wGy2jilc`rSotv;n)+$&JeyQ%4&~|u`HAPStpSuu z;|CRL#R*L4<3|x;Euc^?V+)H~F{Dzf(J=oqa$d|x-ziQVKg|7)Jjo~DeFL}Na1E#K zxQkDOgMcA|u z_#Vf%-c56RBa?oWsGOrXHA-=+L>&2)r?p~;QPsJm+#)+Szl`JBynXe>oH_ptUOsRF z*L4#Hkp7eVV01)BOC!XZFo<4nsCAS8;L?%_0ljV+Avi4&|KouA^x#$r!L}VcFB=*i zX`MN}>pv`YR!YQ?kqJwoes&uYS+W#@YUr_O)(mpRB3riaO0t*~#Ia7KpTZz4ffDHi zG|+~WvXBy@C?bjiEUD_Mr-TV@X^ApvLTt89g>+=g2pmS^fR?nyP}Qe7lP>=DS9h)G znYSQ*D{@oci9<*uxp?Urbk6SKw|75@GKu%UuIH%4>pmIULvr7RMzH7LF+y!{-86L? z1SMnBm^PHd3K)yD>(FckG^Zt#zD_KDFhpSl0+dP`9)m{6y5&&421q_PuM+_z5oJFn z+uS+)X03nzyv5gAQvN(N(JU(oArvr>*Axl?{hlN+Hc}WA39I=uG-0$xDS=}N_U+xz z>MJfIQWhdk6pVq1Sb6T*U}EmS?_oan(T~v8)ke8oBFvSU-c;kJbEdO+ZU=tNM`|0( zap{|w;NAxxX6dXsTyw)UlxsmUwzU&>U@cUo9-*Z062v;nl;#?0e-EJY&d(f)*KIl%c=o;%kkg>TE}uu;XNX z@F9#zKsu2qN6-l%qA&<4aiw5oUp zb}=#;su`{8b{EOa>yIqkKav7Y?_o@g5t=P8@1+_Gu3q^z-f`AqA`=p8@X8_k4)yZH zh8-00Q#ffGRFa<}5B#b}7^*OvZG6LdWNc(;R=!Z3Ye*VFrR=(uQvzlfU9b04!i08^ z#3p9vtNR%knPlGFS!6OPT-T*|@C3PBiN4+;Ca0#5Qj>BV;yOqi8$l&srX(xW%08id z1vix;49W!M3PBX3ESty=iIqecNzL=9cx9}hms3Z2(Z=J9S#vpYETmS8@Pd#fvlcRM z;Zi>FnJ=9G+{O*hR;s!+c2c;qLL`#8mNpVgSd0!$Fw{4|^jXWyV+W2XVTDtS4fGP`M(A0%6rn2w)gp1NjVLnsQ+aCr&*H2~Q3=}+MiK@E zE;}cS7mQQ&N032`@k2`a!<;&?ooP)r4OTaWs!y#pLF8BQ14A)iq+F;Hg&L(L`GP~w zk`)*e(tGkGuF$;r{PQfBGn*BwF5lNefWO<=cF(KpaeA zRi`-cY9EffjB3@Rt#vN_#}6>GT*AQ4;D60kSm1vy>QaUtCK~%{hCHRF2YJ{Yg zzK7~76(X<7$jB&7jTxjg#F0h_gH<00da)qoDnAis%}}L>*rHF57m2-)AyMq%zvFQ=_8HO290^$ zK1Rn0>(?S;B80qOBMhJ#hY)z&c%KXov%cj6!t;HWE?!7wO~lJDZ=-w8jbv>H zLPHn_bj@z&lEw4D67(#aL#5_J3^oeiGCcA4GdMxa`#$h~QZ0>mz6Lu*jgZ!+Cc^rC zD@pO0tR?Lzbfl@-7CAp=Zd(fNd!QU*Es_Mw-@$Hy+{?40Jmk^Pgx zh;|o-L>(A0qE6)a|KQC3NAEAtF{Dx!w_bZC`wksr_mNYC#zl*OHmZz_83t5Vj*lXYPc|(R<$wl1it$PT#j#1sg))_(MoV>+N^TfC)r99JKzry- z;g<^-%ffQAl&41UYdypU9CMHvU7Bh|vvy@f_q-0qhmMdR&p|9G6#{}H;Ti*HUS9cvqYJkENPE#|o!DVb< zfbQv8mS1u)QFV-68y}^i$)=^bjbd(`($o}QwM27A7dogCwsbMX6YG40swJj(6&Q=-!L~^bvd#;#lfS;NjVO4=P%^OtJl!pvykunp%Je$c*W^|hSwQSQJo!l8r?Ie2Ye*#MWO3MKOG|w1Q@E?#}YBUQz3W!`{e)^%!f|Y3oiLAu6!k(YaRP{So#`tif!0_m zDHakdB!fcGI}y+kg_Oz@jMX&Dx+RVTqYYu?GiSyO)~>mTrnJp(?tL8U1KWDXgE_r7 zLi|aSW-!KPGVn>a%{ujFtv{ce%B;Kb>fJ{VA8i*R3B(Krzfz;%w4lP6FbYXo=Jf(W zn8dSP2ofJQqj6NkiY}L{t~{5H#XV?Tw9~+*=QptC<{Qa4X+#vDiODukW6AlK@Y3@y z&@-cnwO6giax(Z~fYN}p*>|j$9qXUv>Pwb0f9VQJQNWpJFJ-}kdA#!K0iJqsGvlQS zLMbGM1+6YKvoKW=94-XRizjg!1jezch9L&SWNhL10eAiQJKvj}7<-_-V_M*MV|Ho1vkyfgu=%_-KcUB$uf8Eo14Dy4FWi3L>@rjkRa z9VRLvR^l>$`Zp&a!k-ivT9`yqS7+53ArjU>UA7wd5kf+Hdnb$M&rcW%{{^oZv*(UH z`s*M5@2`F33;&j+zmU_M8f_B0p9CZM6I|=G1wdV4WK3d(rGo?&-Tm7B`mj71raEO2XI7&GEEE(@1y^<7fHLCwzdv}IENqjgkFuv_bHUBREst643z)^ArRIa zI_BL-7!}#IbsG&?o0m6jpdr)3&1=r%gYUV4{X^b!pZn`i|F5NIo^=wwL#POtTt^s{z%Z#J-(Rh9z4#`WBo`cLG#sbb`#HyY!S27s3*t?gU+_?7(J%z zNwXwO3R__e71H#1f}Tu;qlGHAn^R zM*9aySysKeqaI=FD6=@W#A~o!7hA_juXz1}a!q5q4tX@&21gMYfn)pR9XA>LKot7S zpEHM5D;Be5`%bDsgs|#&hD69Xj>pY_1QBQqRVAsAB9+NjUas}u_}Vx8>R;8sSM*Xv?RHMT!D%JPj@lI@t!@v%`JyzghMUATy= zue=0b85}o_YuSWhhz3ib zp>Qmld+)vPVR-4HFsn{mx9gfKFFH8({0l3EFbEUp05L*bC%3h3usO8`Ei{%9%`U3Yx-)*pW1FTUz(kI=+2Ak@Jw z^+9I6m_Rg`uv&sZVN@Mu58JlwWcSWJ%%4983&G4xiNZ{gFp=#_Wnxw>D5Qk2stIZe zEv%Pi!R1n+P3zd)Qd;qMY?Mjr0?}ylkmNJ*pW`QWaB!G`{-IdvOT^JWC@(K~yObe{Gsdv4D;gPO1qhB^9rRv>Xf;e&ErRQxs-O2s^{X z_!x!hkWwiGtyy*IX-Fwqzv+_apLq0VH-79RAG&>HY+|{x9JI0Gp^}K@DW+;gwmrX< zOD?|*r*l1}J@;bg6~W|h$>%JB$v*O33+U>ZORl4v4!^{)BfAK^8RjoqOujXsIh{h= zU>r%lrGx3dT})3+)7jcVIhewke+KE64zdLwD?Nu|)#Jd<$H`~XWShDumP-_-X7IfL zDHN5NBBikcLCxTY@es9X?qy`>ttTo^b7=32q%#KNP4d-mf0wH+KaYzpxrBAK+U?ih z{PurcwPszzP&V?4t)oNx$u-+3Us0a!z*in?R`xJ-!pF8>MNL7zeJRD-6q#&0w64YX z=40DwBCSbxHKY9!cJ3H$nJxy4bCKd8&G{x;o0}+BtFh$|65DcOSv@Tz@Tun0uIg?bm&qI6~=N9(gx#$(HLW)w8oYK zthfiTZ_hr~uRkN1g=lPP6Gocz&RIucW`c))_A73_`6hy>Ozp%7z3mP;GfuuKPgtEq z$re(sjTa~$dF&Z7j^Hitej8dEs!GK}V?auW{_#m3e`Y(<`FtLEayuh4V40AbaCz?d4D&mDmgNCQ3xYq;RCo?iUYoY;c6tr>>&CxrNC0DHluh z505f>Vg#Y%fw(~l~E?**qz_KiiHs~l!zT@P( zl`@g`Cb^3P9{lBF{PM9aq}((b2)uwu*RZWLwiUA-8}ma9+CZgT!!K)0rHpJEL8yqZ zRz>+0rh`F{ZoDpSP`-~FNmL}M)k37ugw+{_2Z~f`7MWaA%rM*2kF+&~VusfasLCX2-U6DOJT2J{4({L2@unQTOBN#S6r^%gBgLHgb6B>*<=BB2=xA>zpKqfW z*x0Ew%}r^Pst|fnKFy)XGy7#)nb0GCGK8$v0ti z2EP{Y+nS*MBZ!VFDmmnbp>VE|HKOMxQAIdl(x! zPOc?IQ$A0jCithX{(x=IZ>7nNjo?fY$b^UyNex*8X2WU&&6Whexbd$MmYr;jX}m8U z6lluTh&TS}N4{|NYj6JXA3Hd0yy)6{Cr%7MWjn6_-MfGO!qD*1Wf%v6jTA9jt3H`G zNz*k>3Sz{Mwi+t0v2m#oOnMs1C1qM&FZCGdeQkbx8^C&OvVi!9bXhu z#+Qb{AS@6@BkOV~@wAyB60BZx>aLe-{V(p^QQ3ds5W;|^K?y^s;wkcp$uhObqpKsN z-Lc5J7PSauvM1U=$}-H)SzLATC9GS&9@CU3@)eN|S$f(U#>Pf@;-QDR?7ABgc_@V| zEqc0JxnT8NntOWjQ_UD%#UN3Z!;!vW_HKQO%P-u(iqp@c6#6l--Ey!p4(Dy!z>Zz} z7%5b6gu#*;DPW{18LBF3+G0+NMOy}rO>06eu`EphOoT2+5A4q0_oF*L4See5*u%3f zxZ)Qkou8Iot*!1)fDsKen`sPiX62-eHV6sLEiEW*NTnPWESgKt;1Ht|6R5z)5e8pb zj23;0LBc@MvjyhtkRiT2bTXup$*`f`I0u20aWkn>s&M61*D$}QBQbD$WnP!O`ptJN z`p)ei?B8){t?f7%nV^TH6&r17-OzHz=tSB{%p#1E_#z}pgDyr<$OL&|$5jQ&m>8j> z3=4XC>1fL{Iy{IUYED_R>F4n9|MeP_Hd0I3U^fY^8mOLn$ZN#1dcv0s2I}X#p5z!U z8+xDhL7z#6i^@o}v1n~;W@4s*R}8T-5ly))k)^PVAgl!hkw985QJ}$&KpUb+Q}fDL z%@&rHJiB!WucT>fbqTx}ohUSP&Rsn5JB85s7wrJve9ztAzwwiQ@zLA7K=q;owqx`B zju$9Zi&P>_cJ3Kehn^?&V%C<{HL9f=(o)oXP1bdBEQg870u$2}a=9j?<&sLdSW>WT z^-?m~Nsb>oPIpf??Hx^2?1&0kT)H@MVh_V(k25(q3gsGYD;7|x6{!|$)T*_3uau!O z6XI7jQdAN}Cx-t^VxmRbGJ z!pu~&6rqm%Dy69!*(Ql!k(jWXQl*3rrrG`Ib}XT2&xGXL+bGXWQJtD3opCT);HF%B zPvc5Wq3F?UvJ4L#p&CU@SBiZ3J3r!sZ@Y=V`HNe4qs9d$4Q>~WMHUGLv~G=xR<0P2{SB-H(Dik2Lyq~G0<=Xh}m+nl;4J%GgOd>^8FJX0zATdS| zB^roE)6kBW$cE>KZ7h^lXv-!O`jmV@*0u302T`f;?|0s_^!!&{Qv74arOvJ{(ymL8 zYG?B^50MdxM3XQ{j24Xsyhx<_w2qNhN+~R1&$0uICNP4bQpoZam>eI*IEHMi#?}sz z(xkP=xocN({sre!@;si}{vtYw4+fJo0P3=TaoiL2DYB8AC`Z&@=DF>ke*7=LcJEJr z-1ni6eDJm~P>Z$J2x*~_P5DqDc1BYHYo_WtUzr_cZE&-~TrANbjW9}+@P^Fxjt zI?U?TtEq+&g4o9-(gvYIF1+X*hVOrnZ+-oCEML)NdsJt7nbX_E!Tkq$bk_vuU-24_ z96QX_o6cq3>8DaL9$w&s7Fe!}ls3k|*!UR5Vx_LBgVCBuhhWDsFQX-evSNEw!wpgi zjGyz3q>ijXL@h;u=OOjwGuGZZaj znVzO}idBmj(wxgtDpbhIh)mjL+oZuW4v~>$Y>NO3A)@#>kOFBS5)zG0P`GguN+dak z7I9@7_eEkK4I!`w4$qf4$Y|%#-nMp z<@ztjTC&-uQe%prpntXDck(fk%%IL}kd{oE7y@IPL~EN_-D6{@YkA@REWHX>!xuNFhCSWgpr5kICvF}mQ{3Gl5zyLG-TZ@6IDas;X!QU;Mc$b(wS^y zJr`Ye-BWvZZoT3E{ru-X|HxxcT~bp~o3>(;Mb{WiXxO^>X*Qj+iQIy7sqKFh;S~vd zi64cG`GZW4O=7$m+UCq5o$n%-9%OoCnD+J#v=mrrNu(92REou?t;VnJBA3n3w&)D< zwnC~5e$8Tfri>R3P&qM%RfX31bEsA-Oihndnk--m8%t_xB@gWjLQf!MiYQXFEZ9h< zInVgO00V;~M3zm)2tvQe0}uZa`?B+Y{fS#X@%59N{{U{2>ldb`ab+`7fM4@zZLM(n z84H+KZes7VqqKLQjci#+GC!dwv@3%R%5s+uw9!ljGDgly*ob$y!ZEcrcaEH&vi2`JoeaA-1OQTxbb=qCnJ&4 z=J4PYw|?b&9Nv47j2q{$DnT;}X(eCg!m{f*|vX3nUufBK#E0--oyEcahPQryaHla|Qf59ex z@Vy`L!@D0Mmvb4}zmtxXMR%u7wN#>`=Qyj+xtK~i!vhchf)>l>#v8A}lM!0jq_WMZ zND+oULTDa+d<&Ds8Y1PQw7@a}O4t}k_wUtdxzm9F$g^d(Jv0C#Kjx zFw9giMJ^pN6G~R=5^e2SPMoM9L@dE15^#!;GG?6sLd3PBse=KNfs|$JI7hNIp=XfN zFsFAer!JTqdzZZeucmxUcxca#k3Rp~8@9_r%`piZLP&wBgZM*u)LC=mU zq`^&F)Cx78dvY6Esd&GwnCa-)0%=?E-x&karoFQV6&^!{2BmH6bf)}=e*P_6p1!DB zt+q*N#ph9}gz0%wTuAm_3W-7^(PR=yUoR*lh~@GtanpFEGKE4J*Uci+E|#03R;f{l%B0dwc!4IHb!lr(Q7e_eYQd7Qch7dF zr;4;RXDH582z^aUD#clwF4voGcwZUdf(tL%4lI7|nJ3Tsm;e2bfBV$aTdofs#fI}P zB4Z2OOgp-5CF8TPhog)S_tV+42p_@N;4x~2DWWjIk`{pvr9uVeDFQ$C zhA2!%G%r|B+lsUJ?UpUrKs*rgzCitj-9))G5%3v%RzsNTkp) z^}&*}5(YwG8^idN=5N0A?RQ`I#{Y5qD^;9y_RO6CxZ{p*fBE2{1794Up1`&eJCb_w z21#KRYna7`WinZCg2py+&<(W25|9#tsfyys!3v>p$=E42ZakaLt~Sa=4@Wq3wB%>B zv@<%=vgQSjZpbPn+Odg5l50sa87Ew_bnV_7uDkB;Pkij-FU#6*`|4MaCZ=g>t%-nX z6|p>@r#tXDG!ZdTwQyW$&03U8v8hwt7cuV`I$cBWg8BHV45k{A5)#Le_|oF6i(kc~ zKe?A@pL~*YFTaAQI7Cht=)_~rf{?M9gOtZ|wDis+GJ@Uv_Oo;A(_DJanVhz9BelpT zWz`@u1d$;Wu=nr)hXzJ)91FA|(2^HMBbptXKnWJM0-4C@9$Q z$OAvPrC6B$TysmC_fq$8-h#!W?|A2%etF-05B`ZkCJh_YXo?9#1BsvXcF+QvvpH5Q zTaHj3A~NK2S*l)*@oI>4AR{FeqcEYsH+Fns)`w6Dvizh8L!!-WW&?=QAY`N141$o= zYtQ8R>u*GPB~0N>NKm9ULOL0 zL1-PDlqG0XER(1!h(_%3eVQl#0;Uw9T3Sk`m|k&h8P{wy60bf~bKAK3Pkl zj)rbDXHS}j8m$vdlx|Q&wXP!sXFWztWTCW8s@cIw*_4VAsl1|WS7H-YH$zmdL8N0; zthNYLL=XfZ48>`mk=g|1g3Uy9D%wn;i=#NUM1%?#1(DbEpRMtAH^1fngZuaFc}w=!9-K)wxILPy$=M?ZD>wKsqB z2jHzE+Ilm6#BTX z70bh`IDrkrG_Hv9J;=8n4` z;PBC7IO!CTj&FfFXc&|DoFq-+*-#=Hh*Q--^9n3Wq9Xqff&{d5&Oh$s}{F-}frk9mi@s|0IkaEx?ijrDA>g zSO!pHtfVt0WTT-8V5@+sisFttf82ZdmDf!EvE$NJuYX^Q5LUE(+m2d`Ss$RfB#=f&D^{%Nd%5@FwKu)-7f(L+$Q!pj^YnR>V<&nZ ze|GD}!$%HYDup4!PK1A8K~MXOKfdRI8x|~FG;`zYu4~l|kcVVsXb2Pe=qQ#nva}Dj zgCz`>lcu+G4yzYVan8ndln*~kr>j|g@!71YZscoUyNe(G`!_l5^bMSK;U?# z&3A7+=iGfS*Zy67?W^y7;GVnQddHo2eC)BOpWdKIBqT)wfUzt>>dibGtrX4qCQdtL zMdEc8f|X%-aEMFRb#c!8G(X=q#pZ!BrIN0b%MeB(gcbiZw4#&vpc09S`n_TdmL))G zup-J;kDFh2GjD(A+ZpRWoV@>)d)@GkKmCUvKe}yGu~=@gq>HU%DUDeqW8#CAFkfVY z>j(|$ev{m)!r<7}EXbk`ziSNBA)U^$c-a!l)uU)7Xzg9}vV7kiU2{fKnQULl3lluui8 z4I?GC;}AreC{zRrLM1UG#6$|IeTr3|obfqy6vm33bmR&MC9#bmmHl1+r!{A6+z;Gz zXwPq#e)G0}`Q&{M|NQ!yYBr}j`a0zM~c8br1$VNQ;5vBdqLhBHy!&$#RvbR%GPZ0DJa~V9NkE z>#%UHOLI>B`A9-;@F>nP-4$G;^#z|I%6aO;u(;( zjX|?_*RFNH?=#)jy=3pqi3*#y?PSm4qby#y1S1>4gP(l= zo1^Q`-oW;)Tc~-}SmLwp$#c?Bqh4RczyKO~fv5wpw4kO1p^8XJ@B>YMIieZ}=FXkZ z%GIY3dNsUSKxbF?!<#m)-?(r8{!ZTy;(f90hAfIPDv?%>_q(mFnYX|FU2kp9H@~cb zd)29Hj}G=9yYSPW_~`d{?tXDYsFa+XF0|^vLkj`M25n)CrahakefN7mKD#N`RQcxZ z-##WxtZ!Y8pjz{2>*yv7J;J~z@GEEot|NKVTi(Ez{_S>-O-(VcNz zvP%Xy#9&GqeXfK-t_+>|W^!o<&liMBFt59dsZxn!g8?IhRU!i|wxL)oGhQ;JgoTmu zb0&3M@5WWAMw*zJf{4KfBFS}>kjcGbV>yO$Me(NVuV-OL6Vh>Cu`{+}%~>!0-KRhL z-JRdM^WCwoFNu#-3<_2{1~{5xY#)2OE)A2oyE~D+N& zHM3^zSrkY2qm@mdB+YGIf3ONb|Iz+sF>ueCZT=_KRlSVSi7e}E7a*2xjXA0oRszgW zXzY6bG{F`r6$2h?UO*<3p|zulss51SRF!-tM=sZl@oa?o`}aEl03ZNKL_t(=sFppf zD8kA>i0 z3u@$>nrY5u@JFgl4Gc0NJ5gCkyDlRq1{q<1OnWCoQ=9Q?CB{ZZ=|5mtIHwgqC^LUy zhPKXbS~}Vo9Xd*Ns)AI0%oY(Lo^McL3}7@W!bl6(a%q~kiBvwruH8E+)I4M^4_aZ{ zHkERbhkx}Lzkc#L+HC#sr#}73-T&*$ci!{R6Tj;LZOIz7as|H@8#@2?g(LXI6U-Fb zS=cqrnHzc;pPa;aH6klQU=bm4g+ZETw8$VsA6FWF_2_RHJTb*v-}qWS@cy?`D$L-8 zKB-ieY&K62#%!D?p5DsD_&Dj5oecRK)8+Vg5hs!Lytpo(Uk91g{b}QFQvCG2GzNgm z)Ep;Is7e@Vv*+LucJDb58hcEdHs+1Z+PW%%~NlG=X?0tH@-}*Qb|x#qS4r|n;pj!n_0Rq z#Ek)gArKHso8hw0v6+a@Idf?hKy{cJ89YBi83*ZVs-us>pe8J76{LuGPYff9clcH`j7R~zF--VrHE`7 zE0w`9AaV|u-f%5H|LFtV^OK+AO%9RQ9;wzQy0VbdW%RI5clK%u8exAwas!M23{q2&D<_90M}}Q>1XIUnn4m zC!-}hoXN*z&dRGdIJkbcRfXG~*CXcFpB z9eJy@A(d|Cum0+@v@|)CCP#2y!2|$c{dpHZ^Waav|E{;c^IbnSwws)-hP_sU3MY|B zZ4!DN$uJ;ZPTcF4^)5k@m_lS!gRLWxXk}QkcoDWW5F7Sb8M3*y@t5-X*Q{N)`?asV zddp)^J-aD3c(meu7AC&n6SmGtK#!OiRcA-lrCRDMJxTSTUhD}Z${75>#|wNaeu(y= zR`M~np}C`lqF=?b1YRwq8u&5NLkdR6d{T?kM74R0mh))0m29R1FL)MIgpz4w6w#Tp zAu6{2SLE-WZLJU3KJL&egIAiDl;Kim|?7V8VeVmgvnA0CGEQ5!UgjN-txA$edT>0 zyyc7CUH>^KzE&&mu%cj{i8SS!Pj^=fWvfah+JtG7n3iUaA3cDNp;D~i7pq7ua2!d5 z24%3Npi)(&I(sSkHkKffh0|ml7#Z&88(;q(&8;~yO(|UIP^=X314Xqwjcr-jDK|N{ zbCfeHC zI51x2m)jm=-@yZvD<0XDJ3E>)v#h_m8M{du=CO%)-5Db;n1xKLmxg0T!kEzpB@Lm0 zipqHZ_Vs^TdHFT38GR*UQfqs65#aePk5n(X>|zcdIY6~kKw7ea_@5o%%?<)Y(x~U8 z20`2g*UTsf-x%h#q}e}Jr4|KPc82CAi)E`$SJGJ^*m|(7~0)#Cstum(kHl%7p?V*Mci-kOpDfG_|&| z>)=r)$7guko8Lsfqmw7cN4fu(zhURGDU_WfWqi(BHkT&X;=!N&n#-=fgrHnS7&~T& zI50ImNv0{w?tS|c@V};1t#Q>AmvhF_C4BKK|B4?8jP1sfidM`t0f8k!YBjWJ!`a(z z`^KGb>zy~R{BrN#t6%qq?*rfe{=a|ceNX=8*RPu{6kGfHk1vh1vO8Pb$1`raTCG)c zH@xPCA6#+uwLcm@-oI?(@RkP)qesa%<=DFGD04fTnI~tcj#pT}D$i#BG}?CWrZQP1 zawG^VZup_Ggd{St%%9OJzUoh6;npSeEF?jwS+HmcpZLo^qf{+XEEFi03a{w>f9CmD zJn@VBe)Qh=yzkw2m0}Tbgi2U0f(C}E4uO#;G3Xi+qK1=1xlS_YOd6`%m>7kpHMx9_ zrAro3+Z|w84(aCZp_gMF?VVkfTmSYm-~E@beD!Z49c%xpI>@Q61Sr5H48eMSqmpz? z*5ifI2w^7|e_i?@xi?IVYK$TUO5jy}rYA#G3evTZNPF0B8sWtz@s&yyrBY>b7$h0j{*`?$~3Ki@mg`_FvkjrQPi$=}5qreA7hx%I%?B03Sk%I?T9UmN8c>lfk zzwS2=|7_(IS6+oXcRl67=WwOL_XR-!=?Er9X0RMVdq*d}Fr-o`$}=-m$|X(=Wy!Cq zkxix8_Q*k4VNu>TKy}7L%8-GvX4YMC3+;2~viS#OZgz}J)7;v^+urg&ZaaI!hNqUUS@Xi`HD~Sr_8tGZ zB3{O|Ln#!c=_#s}F^p+N(nMGZDNpuORcUG`_HpQ`JMl*Qsbmzz(4f64Udh9+`RK@C zYa5J9sgkB_6&OA~%9p-*C!hNGyLso$ujb$GxQpS6kF;e&;w=nAnvCX}i#KuR8LPPK z-iH~Sm~J$f>iMKhBr$}TJp*+Vx~U_LlNzAvc_0Ks#|IY{3I)5Rr6v0R1pu`79`yze zBdinyLt`91K7!V#F{LC+s(g#F!XFrZJ!dLa3xpj%#F@4Ep0- zotV88hNK)T`uMG1djA{W`kveQZ+KZk*{Q6{#TQ@7Zyxp#VaWbz!$eur)82+>YUC`Ro}6U7?2*f4!LM@RMHk<8`};nA-9Z0Q_qW@( zt~_w?(7I#&{p+=g(w1#`Jv}`K@=f{aOg39wy=LtT>&`suL`zHSA7yGgf6;T@m+Fit*4 zwOGNiT`Wfu8bjduSW+@QHc7SW$5PV9pjE&{7hXtnCdE&F`5SCEmPm0;T$34eY&L6b zgpB{(o^BfX!4K}f;oS2sdj93uyN}-T=eIuh+>W;l7K+`L>n5PTU z*(gPGK8I^b0v#YChn}7m?*G*Q?fD$WYNB067#T8Mv?!?vW2wYTXm%i22cPO#D@v@;K)KLow&i7)JaGy z9ug+kx|E`^4w?9FpyTz0vMzln02%uTCQQ1RSs3T)xqJ)r7tCj%KLp{RbSCU*@A!l3 ziZjkS^En}CrxlExvhP%vTx==&Oh3p^pv4>*`UkjI_x0Hn!-^}7uH}Lqq zw~?8Agw~z~j17-6b9@4f!m=f{Z4qcgsT`ss5Q%)GEdx5{pN7fKqck=_Utb?m2+}B0 zX_ux{>b~aIw&CT=m+v_3w6(vz;_B;mow?zh;6GclW6Ef+L{PQpZZ0x5v4m9fBD&@- zW@_L8YSj{6p@dKxl@^Goh6Mz^kJH{kBy3vST4FGPWAWmy7x}9reJq|ohk3odq}&vq zU!zzo)7RHWp)iewMaFT7Ow_o?8xYXCE;O^gEcMP_BlA@%PK$L6GRZV$UfKYlxxM#z zC=GKvyO3!&mRzwNA`=G^r8Jg`DY!zIS(LgEvszwtQm;{oMtpK8g*a(Appwb9O=M=} zJ}%gJ_6z^~#V_Bye8s9G{5QR(3lnpfuUx{_S6$29KmHN6E0gJMJmIU;0(G5+0a%GP zole#sg#lh*n8~-&x}=pWuDBe3>I6Ud>D{bYAek5)qA8!Jr?UmODbMmXXKV#nwqj); z@b}3_`G-PbCe_l?>i@CV{KbFy%7$yNynJgUZE0H;8co&M9Gxi88|4VKTP^iYCv( zYHnky=<@uo9f+e9=C(C+?KPJ$XW>G;Fd}6FR2blgGBG?=_<>^Z_(=SFa#+HkhBP)J zWfK|0-jZgZQot8(YCqwPb#+rKW|*9r!i^5lY9L5&Z9OaS zQ%#ghhtVq5C6_2HOCW4Txi&+ooLu8lBecX#%(%5yF*+Vor}La_A~K6Ys}KLEOUA_` zGGXGx;GOSy$89T?uk8QBpYCj_Qu7#}DRSS>9zhsEXe1JY;|S6TEl$^2erDF!CvIHp z#3*mJ87D;D95DIJ5{xnpdSe|gBaA_&+x!3d2luW%dwO-A(-b zf%}-AnQG|q){Cm&Ve=$|8S}dYAQTcM1V<-*Cd!&sE0)pTlH=Hc7irFEni)_Vof+UI`ntDcfQbZ@bJ-j)oL{(gfLPH+S=Qu=gpfxv2f9n;)<24 zq9-4F>J{0Kj?S(C`1ODM`%iuL?`9hyDn5f!2(&a5Y8A$(Cz;>Xg$Y$m<4#GQd3Fao zo_dyRuelJBO)*ogaN0Q+Qk{`h%mm9$S;aZ7%c4a~sd^E&-}xg_7My?n1|nafOoW@s zkWFQ%6pHj6>x(@lFxZaEv7u4k{noc~>zu9+cg|Wd2(l&Me zd9Qlv%=PP^U$SiZp$jj%Y}{Fef zf;CDd(m$d;Mox^w6C>bSwaP^oUqVM)8;5rHfzhZadd2Vmt6%dccRzg358v>v_rBw< zz>2+4>HwR19FYQ|I?mW6ab-4xYe)#K2Kl4#=3nYJ^Ep+@c}g z*pQ6UhH_EiIyPf){ zMT1ugsAkG!b7`E`R=jEj?FpJ>g^}X}ba&5T#hLG+=#SxcxODa8scFUHQ(DliD;b(9 zV?sm9u^1a1VP?F7iVRLZMj(4NO|1kflvp~#*bXuZ2$Qk7gLok-fo z+V_)VQ*k4}&QqM4LJGmt&pprWKkVXtZ+;D*?e5_Idw$NYzEP%YHL^_^&R8;^YcD>Z z#j98G@Dp43{!bqwkP=H;@jWR_k_XS?&yA@g1{HP57J){n7+|7=LL;z*{JnJnf*^7_ zJ32|HTuK#*ld@wuKc&znA~IHDJZ>7A>olZ$6LwXd+bZI-V8>9Llh_W)&@ZvX&<1=z zqBU##U-`;c-~O7L-~8VK`~&Fd=;er7jbnFn#u4K5cpHog<6@ymV+D`y1T(mR*b|*jI zrHNB~cEx2nmeB3qop@3bqAd zBoR`ggheXT#IfU}Jo)J3TzA1mELydism>HT4-WGDlP}WM-A&a~oW6KIxz2ff{Ra>6 z`qy7eZ(B2w=Ys{Vn~n{mRme=CM8yk`t`pY~QOMeLXL088c^ufgm(fCna-fsv&_*RE z$FejTDaOw^>zr+${ro?E{PcC}Up60w^{={OX5Y?ji~i!HAHHMzz5_RUVVE`%C@C?K zLSsnV4vw@yM`T@#E3UtRg>yUct2HbW;z&4fXn<1}bn&4ZmN9U6h^NM~92z)*DVC@S zn+ziHj)`-whU|6%mNSV7JyOK}GziNy@Gl;H^tHm+@t{9;FC!B1fRIE6 zG=f-?&BRjKas04ng$|N|Sv_jR#6>G+i%N$`*_5XXOix8<0bZdB7;>$h)XEi7X@?+; zs8s^|AR?1>sT2dID=zs~#psB`w7rNhO4Bxf8MWF7<%vPsb1}%*iZt!{)F0GWv@A=B z=3bgRSK&= zH{Z?D#Y^$M@Z)#gbMLoXTib%Rw)Sw@%2gT$d1m`A;9mIa|5{NlV+%5_WMZ^PtJ}}~ zxgAXV?HoS%A{&-9<5#922#H7BE|wKx8;B&-M3&I2a&%}IKT=rIChZ7JZH5B}X4tcD z4;B((Nu&nXmRMHogc}(Z`{dU9=%&u}6~7A(trwih-7ADhy3q;?iBS>PTzw_q`sN+~ z_XB`*bH_wAD3fb#CzHuit(N0U-6YMny2)5Fl`wiXxYUscGBGSn*b50Vz-l0SW28UH zVjXOuNn3)~z4o;~{HwqI+(+m1&Yk@4y7a2$qI2hWzm=;B!KtfG6iLp_9x{Zohvv>h#tUH}W3wznIYd39eEkwBtYnGkPij@oK>TIKL@Hoxc z6v9NL)0zLY+3`v={{hZE=ltjQ@7s0C``-JmyLRo~ccx`a%191XUG{r5l!gph0%NcY zSX!{{+0BfVeT?lAXoVNW2qhJIC@pXjc7(JnL@EV#hKZ3WZn*e7&Od)Gho1fwdtZE! zmZg^cgbZ}^4Nnv?A-lAAJVcpy!SB67tW=-H^*b!By)PY zIpu%_V%Nd>62ZVUh#u|m{os`0u^!Dma!iEf& z(I;tApCp^pFdvUYqnk>Tb{%TvDxs%{B8%phmhqSR+2_q)Fb=%4Tq?eA@4nq}4_qVRK?jP&j zdq(6Y*Am1tdY@-Mb4KTk&VI{Y<@fu3KVPF@d}89HQp%A+s`0Ur*?Ye9`48Uz$P-s| zkzw786mu44#287E3TllG%`ikd0;vqBlq8IC9Nz}5iG(!Pgv9h$t88AYSd6DA=T9NL zkbJU8PHL7<2N)qyX-ZBSgrkUq=Fn?iz^&SF*z=Av?T^~P2vYl(uC;?M%q%MUUyFQPoO0XM&$QmKOH`lL}r6`y7&;5%RbTUHkiGw2!SPPS>s z0VqwmQXrSl5k&!UXh>p#OaMoba~-r>MweHzW!vVLR;_yPp6BwP~xTy3GF874{&eo3=Dw}|K3kSDDLacXd-MmmNxNim70(7zILx$J>;kVHN711i(p zbp5Kvd6kmh7L*;din9fwv`r;U77E`b{aJXV<4BZAaU4P3_k&#*Uij=!eDJ6L^nLGp z|LfXF`%b<+)L+K;rELx>kXm>76`8W%&Ur%GdEWBxMNbJRGPRLiv`e~(m@d0ek~y)= zS=L^aaQP*defp37=#PHpTonHS!k|@EQHNElS98U+Z{mUb{=o_r#2MxP|Ca*rtc*ju zDoCLdB}}_TL|=(_-E=*Lz9FWL9bvGqf~z&h4j*RSrnRI9r0Z*d(eX(GEM%`Y#$gPu zV^I!TK$IvJXBSwrUXdg*ex< zL}Wjed~fA-O=FO7Oq62yu<2ad2~!#eVXJex1N zgzXpZX65E>)E|3{Mmx`YZoh%8Th{XElP~bnffIC+OnIr(GcHqqQPchH{@Rxc#%Z87{f(CE)!tr>6&= zc>K|uUVi1Ji=Thy$txSpX5ZpcZ9oXQ-oPQHlAGqDUnHW$_A$nBG#xhAxKk%D{!TYE9|`<8y`Wq9zlMNN=0(w z$X-;Zh3|GykwC{WLnD2t*2&j&zWqa^F>u$hBl{-i=1x*swTtGS6C}oI6V9A|iJm=&wnFn@BId|!=YOW$NUSc&mH@=iaABZ+bnttB#Tv$+2s7|Jhj+m(vr z`4S1DLFDR{F>O7I@Qv1Bta)e zD>VZz7reQLEfBGE*2FjC;T60N}(nr2gzQ_?m*q`@uZ z`NF+lrM9%pyKlRNAOG-&Xf4-?!+=~VPqkR#)MAalzUO|v`ru<|;oxNI*KS_k*(T+# zz^Av5&c@+0r~n%%Y03ZNKL_t&vZ!?3NuD zozp?u^>Uq}%rV!PXVaEV%$z>Kf&EAET-n3>S%hcTg`v^P;^i#DOpqoK{lz?&Uv@3p z*a-N1xyZ)#8z~p^Y}~SinbWgO9Xraz#3)ia$@x6JuUxfe>3<~>>eLp-q)0P_n}bq@ zcDsd_bBJ}G)F^U!kCO`x9{u{`+WW`5-OsS_JqspL@K;B0kZWIl|d+_s$;?BBZc!iCjqH>f}S z4?k@@FOO4@yzs(H4EGJNx~llZUq3=$$)PZ@lZnZ-TzumSI`@8)WAzq}YpE16BN{;0 zonkT!x6O?KgAp=ouqzxl$M1afqg=Fo3;XxIh>%W?%<=s^wrsy}@AJ<*b<;n1X18*(wmP%0K_HR?E?PZ%h+ zUvkX@@cMd;fA-%${v-F@f6sd#{ObMhK!f8-jgb14J$rW?ICStrE5^(SA!wxUfe^Sl zMH-1xnn<5jsL0l6XU1_&rxQ_cG#MJ`!%0IS9 zn1topGTy*e3af5KsfeW0A*@YP3HH-TQ;eHOwG~CrFf!u4CgsPbtrt9-B;gI6^5$B#Tf(bU87!7)wPTi! zpJG#ahLH^^a|heBTOkGq;enfXkU5u5tBp=|Mvt-hXIDfxxnc5SJD6C#il?4_j^F*S zfAS}`=>OUeAzge2JeenmB1+|bY#N_rqTHn9Lc6XJo?VnVct~OrnUEMsu{eqE6p<#& zuoM{%UkW_O!4nSMHoS2x+LA2y!t~rNR@NeQf3`qmG*3KnNU6}WZ09@ z#-QQ=A$?K-o&?u(&_*&cP;G49ym8OJ`p7T*_D#3G?fyUcv%fs2lU*EjDm%7p{q=)W zr}6w8Z+YwOJparKwBuIB0NX$$zg!j|WH(whTmRTJbByh{UU$`Hy#1CNa4UKCy|mXZ zqS6Fcr(AN)r3{R&z>7Qd*E>A*Ul$a<@D7r3AuE@Uq`ozewSmm+%?q~NcZ>Ll(lY|P_^C_0ANZF=U zU*f4}o+eBcj_)AR^cOsSmGeWFI1dG@4;A zP5;#|{L+8^KT-TY`&hef!!+nE!sFr_uV-|8lD_@{ zp4)SPLnmgrZ1*lESFPfOmydAYBj2JC23bh8L8ZFaoD;IE4$hRf5`rjZ$BqlxxN$8f zjvhuOF+?$*=bf`>?v~r${T1LV^;*q8e(dn3=JL|e{LJ*q#~!}_j``UW@B7Z7)0{jx zi|fct@h347GKZgC02s@J7H5q+Qd(=ca2@i#B#A=W&4he$h3e}c`e(z6lq=N)`0i`{ zcc1;#A6Fmw*0WbcNtCI&EgD6bF1`R_t%;Q;=Xpf2ww!$+YKM4IAY2EfH1*|(#&Sxr z2(5MpKj*V%FvRGTxkd*+aadY1gdyZ|h9m*$fp22spw<7H>wQ{F=^6%xSCQb7h}1GD z9XmY6pIMPA7&dH(S!G*P})*MaZ#M`iO!@(_E zx4*diimM*qvUU66uRidN*WUzhxBCm#DiROUu7k*`8@1LwC!dp@kLhOOn9TYLy=T~J z1-scNvd8k4mfeMMvOY)>^AqoX--mzecmC6#4~>kOb2T1GBecXYx46jo_&7T*xQG{? zd6In2?FEo`$C$I5t}+V^wuPjaNx=V(O;tI`Mj|2 z0H>x-Fgi3$8buONya5ltkc+!WJJ(253QNm1gi6U3@=Q%HGky3l@44d^s$*4xI6-Pb z!Si|M*@Hat%|{^eSvfey=56ayCZgSm7#Sbt?Qg$<$Di86jtjOi)>o$4Sw#9dp4;=X zRZeHEU)Ry-G@#uMsFusGT1)ly59ssx`gNMiL!Cy4J^KzbJk(GBK!sYZ$$_IY?7n0d zLD*(!sGt2uPt#5`TX$?@3^2uXVOJ$}P7f8}`SAV+W2j2Jjm!Erj|KEJ#FMjdS#~-~ZjLe!aiRKJOY5_j! zaI7T@wN{22)tQ^oD#5ijmN_mn@lDo@w7Dr3eNd?mkhBAm#E_&u)qJ7z&wU=_6DyX1 zyRsKx9Uo^me@>k|G2}UpE) z#?tFL-&bCE`ihO4cJlJnGe{?o)FDDRNU0IV5H>)o7{n}{pp923Fg!9wpYmB1?xmAE zjxw6OQ$-8#CFFdcPCFn!n2`72m8bU+G$g_U>0|=3L=%J&K|8@HgX1_j(vb5KlvAKM zw2ES}+!&cy^_oNDJB?1+H3_7K$Y_MyK&wFx92&&L0VC^fqn)$}c@{c~xNYzx#F4ha zlfnw+(omyI1#*5Lm9ky0rf8geo`)X$4o|+akKwUFcC6ckLC_3iP8^@2wlL4aa)X@j zXH9+mY9Wt!bpxP_&^0}@u6l1D$aFb#Hq3o_oLgJzax#r&H~O5rur=Ohdug z=6Cn^n+!7|<(U9+C%Zqd#*WznWRfJL!UYtrlq6Xu2Et{ulB@sxhkx$Re)7Y=^3lHj zq2OGP#Zn5^tXsuWtA!^uTeofF(4k{z9F3VkgEQ^O48dqc5g5aUl@r|b=Brt~dNmI| z_z){suO{epShZ@BvB^oQc^k<3+@1qe$|bZ?9&ga2P$;&IQ6OD%#?TVbY&J;a1QZks zc@7_+<p6I@Zc;ty^ zc=uawKqM`qIK~kvQ5f>d%X@HrkFH5p3d!8;DHdvNCf04)w`RlUS>W%o7trl1eGY#0 z-~S)KE|*<(T|4`wdx6LPx6fQ0;^hXIJ-x`nY>g}4bUp3aL$uuyhE}cOk}Iy|-fw)1 z9ox1r+CR#tzI;FXj?IDZ*o+8mQJa>~q3qwYijBx{vl5#XFgP;G)z@6jiQ`kGQB0hi zI|1NDmtOw-{M_uWfA^~&zU$!!AHF4yjdjK=+w`xN3WQOc$Uv&-$>X{XXl?Az8v~x> z*zj>JGY6sFXekZ-1O3ENn>b2ocO?DeYhJhOqp!a|!n$)_<~&%R6-V(mvLN4C)OmP#xKFd z>VX;f-UR^Ffsu56=Ey5EFRl3vS*ZMujOr*MklK#*se<}~B1r-wKV+$?Sg~S=YGHvw zpFyWbiQq-M}+h*s3oOD2$3|E_Wc(L=i~OqMkh=@kw#| z*5j5(X|!v6`p&=MhkyKEzV5Yt7%M!X@I6To8AK-}i1*?! z4Vr*o8NnosrI9jgcq`lB>1OqvY5H`9o-%u;4X*2vCW#fmN~h<11#q&)N3XeM z41Uh#;)`~%ZR>Xa@c;R5;;RpT{q;A#dtXFRp>K4AcIzOOa+T#pk3?mff-IcljOs>a z8(@R$+C^(N=l8;YRBFiQ^StT0tB987`Orsx>Bl#2-tlas(HKxF^(I%YKD2(r#^YbU z=f3k|LQA5s_|i)+;S~BwwPAR4m|NfaR_?z0vuMvfll3PouggdqfFzI@VM7kJNpXB@ z^*Da`CdP-?VtkC5xmk`KKZPUZd9nFly=MJ%tJU23(AVyN z=b!z_AOD*dUwV0$kfyL=WccKpue2o=%7IP(L@{@ebyWA7A{?RtVxKB%kwWx7%PG21bUs@Zvo8KJ*yYVrY7d>K+bAX6~FU zSVTC6LaEA+fAFV3DZ(HmFJZo3Cr;vXehvEi`(xmh?%zN82fx1UcmW=L@yM$NO(8VW zNUJK=x;GwaZCS|OZYkO>7F^G#zgi?Xp$HaAvH+^rm0Cqf}2YS1C2^-14L?r2@Hv&X#|?qa*R%L)Eg0v09?=7 z%RB}B!wzdU598^D*UZ6KJUzAMtM`1FcfITFEIv}EAZx@1B1fR&ESye&tZ7ta@H$O& zk}xLjQ;5m@b=TT0PG&MMmYq_7M>q()E9m*e03+Q0qH>#n=; z@pii1LOi%-v^;0B3^CO@_ofyD;7@0~nFn zk#TyNCB~7Y#)gthk#N(s*Z=;He&ApH$vb}Fz0?2g&p&l;3jm&%j7+TH_)-%O#mzU} z#KPPRv(v|Mq}RLly-a|N`K>b1qf(j`W5c}jtv9fF>n2`&aX%$D#qoSx6XUrKOC3dJ z)MwqsbsXGxh)StIp;UT97XJY@Z`pj{*vV5@XO9GlHY_eL<5&AQcx0N--}(3a(7WHn z#P|TMFveiW6DjSZE{kuYP643N%rnJ z!s&%Mf^ail&ShY5kfo?FMA16YI<1&a zCn4uKG#fFwyd-TjSXu}%%B8j(*|A+%i}}Q49urNY($~KJyYs*O!LR+yzxzEVH|-|e z`(=vFqa@PK{b_28G^v2*Y(yL={CtzR-DYfb6@|()1sM~kie~*NQaS_;7q?nK=$QGr zkmc!!G!!_lL1=?<40%V=skMj`>;5xJkP1VgXvlfsR9E9yR)7?*s|XMU%}U-)K&M23 zq;If}9E|A<--7SuSx|<#m!4;}lUPJWY)Cw5Ge(lchQhlx3&G8gXYVt#NGGL0X#Ao_ zt6itIzs3Gnj^Jd?e&Jg5Mb7tZNU1hG_Vt6UVYWq zf9Y5M^>1Hy!;RlFFK*u}&%Y`01{fV4WoG&`og_HZTn+UOdOM8Gl_TK(9X23-drq!KD}PVAZ-wrsw8Zsx5Kp#TS54blMFb z{q~c*>6)vkmP)Lg80FA`L)>&LZ`dPWEVYnbM2lS$wb}_u6p{A?`;IMf&zJ7ywi~Wt z%jWgek_bm@icX&6^K;zy#rtT-2_u75F5IyNX*6jVgXeMM^;h$myYA81Ugm7?#A&wJP4v(LHqg=m*nG^D^zxZ7ghL>MC#J0^_@MKD5 zaFSc!eLJITR+4u-`btF(&n~cI;~IYTLqE(@&+Xw$kA9cMR)7=^3P{tWS7_{+QjM`$ zBT~?8$J}xK4U|iHP8?dm&u}?u8lAKA9~m8MG;7Ou9NhQP<+Wy~WE?j&TFYX-&^oy1 zxvL-j`aS>k>AlA}dh9gPv6(47KwjoP(#FQ03fX0(b;nGL+s)_mNTbk+rW0t2rM~5V z?(G^a&9gY)MkQ8U7X<+Y*9GaK z5d=ZZ(n3J0BZ9a^rPRa$hATBxoX`ndcuLUfI4rj`rILpZ5`;3i4oshz+P-k)k@E2R zH-FDLSR>=>7oL9bu4n77jL_eyvxFpW7+h@-MMxtEmNg~^UO3N^3@P_j2$PUBN@>kE z={OR%DDjI$nvE8%rGWNw<|J@!fW3$njt`wiffV3KJ#<{pHXV${7?(~f!t)JjoDkO)#y6x|gYOZW7^K1TEPm9ljN#-wn(Yos zYaA@v&Is#x11z>GYhc+BaHrcnCP@R{eDhoR!d>^irf%H*4}6{bANcw|`T6ZN0E{rK zUbPC}e~CgNPqkWMc4-;+tO;Hlf#XO(qqWLx#|~Os%WXIKFN3qt3EPZLj5DxinDMc( z>75r|^z!*SAh(+J0i_jbP$yNk__}q+c1rh`h|}1fYc|n!x!t{j4&b^jCr+HA)d`TU zVrjX?_HCOHD8e`(Z(MS5hogs&uySIE_3I}&c;FcI`tk_piS55!u4v$kz!$&u=-03H zq|_TXZ+T^KY@!Z#_I~cOpS?4Uv}Imn3@L&rRz$5PxxR=rX`}o>o_+CI`jQ4$-f#_C z`sgUY8oCQO(r0*RjIm8Sky;V78|Yk>9amk)lMmg`bKm_gSKoLuI*e$ymeFpWdc8@j z9V2nhbWamaqqa=a9+B( zk(X%)A>B}|UQ4Ygi_G3T6+ityuV}}kI){u31j`{&0AW*t(3A!YK|7|t6p#iGw7?bM z=M+LZ#7f!V`B0-$h*BFIFSJ5rMJ~6Hqq<@T|CCl%edg#|qYb%yf#sl$R4Hlb(ovdH z+2Cr8NNm`q)`CLGCDs~=iwa``onmr!v+TM#RH6u5oimJWb7tdsM$f{l3g^byXLZ+w zms6?sFP~LN`o5`{h4c~?rxZ#>f>wgo%04$|sor}q(ixwLu*4J zU!>v}Xap@h$D3NSX6@rY^8WY#-Uol`U+($r7w$bT#-3)US)HCbMah@6!jyGG{ak+a zHGJvw$8j|e|BXIH# z)6>g*`78JF_8YHaY;v3dCD}f=ohQHZB-dPf39hhLtP{YN&71i4Gq3RXpTCev+RMib!{ZOC>Sk#}6)efu3GNx~cLLU!7X{v(HvFw|cppU?5)D|=bBdL>@DNWE33 zzpp~2QX%iToSvI!WPFHyM@}%eTthl8S%NN(5p;O~-5^#$u6c( z9;MT6gG!K6;(GphaUDu_-PyZ+vr~I^I*#P%iIY8t6dCAEoJNw2?%CL1GPXI)SjBVj>5TF0+J#Uvg91qWzNNu}P($NT^@cUMh zt5k`mPaqtLBOIi(%3RmDIF3Pk*7YG!y<)PB&b3ZCt&Gk0aBc3IBFoalpwbk9A@50i z&qumWd&~MwdnZ>;o|s&-_VAmozwv=v-ukwO?!Nc_@A>?X9^A8i-!qT2W9gIgeI_O* zIDFzrmS16Wg|soau4@Gy=kVdUV7)QA`>fApzK5?QOLa$`@d2iP7T$iR(;Nb_p$lI^K zf-Rd@(@sK!G2}gu#d?d+ede>g}M9VF6%vUboi!%Az-byr_O6b9t;x$q6s{8yS%rOKfL2N)UYV_>9$ zR4ETV@f2HkY-2b{k&eqyUx~$910}#87~tj`F5?@|?PGeW37#!3p1qH7r0j)+8f^$u z#hMLU`T3vwFmba+U$sbkX^~c|bCBI)8wz!T&DBCENj$`kc z(WI%N-t0iX!O#0RA|?q9aWe(cLF7DCDu@C|Vh6`H5E&v9k{>AIq!CL?9a8Pl31j9? zcWj6|iYPG%r77iLD@%NL-?^GNF8u( zEyg4^4={)=4%mne{bPzCP&DTiswK%+U7WzMyxgSIGQ$UI~9_2S*Oi@x?EEhTDJOeIMU*=o7E|-UO`%+9*<`Fe)VuB`W9PrZ(hI z3rWtiPRukm7-Pe@Q^%#$H%u!DSgO@g+F<=|!s54#MOpTU9K90%Sr{lhhQ?Q(v*)tc z0BAH8M~|O4MG^%Fl`uLq#A2n>93wwd>ZgfA1cQlkvt)H}+6wg^=#e zl+>2mwA%qQi>Js}D-4efqmqPHqsfYO>$&pc?R@b|_aU9F4EOgj(pRNcZ&uF7>v7GS zZv5u|>U-nkquPi)iLJH{5(9iIzx}VuT=;E(i7><=JmO zPM;rv(~mvD;MgQPckCoeB4V8|w_KwYCU`m7Ta39v6Ly-Y zH2$~{rl)GIRQpma3-~MNZd<2o001BWNklmp!jadEgYzr@PP5$es5si_mZ`TA=) za_p$(!)eXRl`DDXrB|r8TMQI^PM(?})dtrQXDv!aFHoi%F(ajAzE`XL-2RSt)2b~( zs>t~sjZO!oLmZz!>!p)ZM^=37KmE$jjSLR&dU3W%6i1XiAB60Mj_NGf$f}=gI4RPi z4rKT9h$Kxy)~=ew7gnL1m^|hFkrU@f(Wg^Rqqvu8Af!ZO;lM@+Yi)NmL8QqQJj!KB zv!g+Ep%;cUg(TMaLJ}&2&UozY1x>1`Af0|57YN(7eB(HF-)fX?L`BLn0)wzYvErjTnxLUD zQjpI{qPC$m+aV1gPV7M9x>jW_eM8Q7F;Rj_?D&c?n8e^n@CA4zsOAxac{7U$plABsMggF%{n`ClU=>OOnLqRTu?Y3*5+%Y6wJ1MSA!} zpJua3lqMjpTS;V`&Qzxu+yBT=dYOvP7;=Ro>o;vgr-}RhelBNE9b377|BDGarEjp0 zs8hGxUdO>IYE=*S*X0t*tNJ-zbrsRsrHE+l!z{J?toXLRHA`^bh zEiLiTegD7}ySB3XnycwVO_1QaIi{vha@Xe{<;LCHxnSoGIzd9LBs+Iqz-K=5MV@L@<$HVbl(jZ0R;kf4?fnv|I-@fD%fAFub z$@h=5P;2zuQ6eiwX5>^mCeaK2$%FthYYZqH*Q2kmOd5xzMp7JEzh`K8eCd2S&xP9Z zz+$WYDmAsqvI_(PN4iL95qOEnqhv&qhNw&r;3N`HxkOQn(#nR+DS=8foiIgf$mJxB zR)&PYfmkyz=wpZxIwfqr_DG~PTeiRaxqH97{)0dJ^Q^z}og6v&Ewtm(Y$y^1zH76A zk`$x{l`4`5f?$zye-RbN)Rz-LP%OJNmYTHdnob9z*z_79Qi1D&Cnae|qXFr-IKuLt zaiA&<1>Zpo?_{potiE~W>ep4#^1OkiP$vwOJsNd|)(%0t0j7xv@~kKbL;;o;J9rKl zS3;^u;sghU>w!)cNdlG95Kg{?pU)wrAk7@Ay)bKIY^I(t7}L$L5=i0NW`Ih$a`)xm zzU|gq?pt158mu=OeT$0=qps`df&RXwa=Fy*9~z$9wqw_`8#irvC6~)ZtJkid?w-p> z|Kopo?ZxkAZA3_ZYk6S~0fb51Q!Hv5H-zKZ;=fil7e_iy&mCw?7r|xm8$wFbG^JKs zrq=Fo?C62*WMR_hZ9!HGqDGx+u1FL|v>SEGl|H;&0i#oUzcAStEHk zW|>aAMYGvv!`d~y(C@{?WiG$`GNz9m;n=a$Y}qhDx$Mzuw)=U59yi`{+uh?szd3tq zp+1%xjbjY0W|MYDbN3@(W7npYY~Q+pP84Dc_->v?knr&1kMXwaui^45E+Q~KyDz_j zC!TnQ8{T{k1Jw#fCj@cK=FOWpJ-@`4@BRYsdG{TR3>7$h_$aRLS(bL1Vv>YQF5J%c zEt@!g=n#$C(hzXujd1;p*7$yoxZPrMVjLq3&%eAE6NR+uO@x6c)eMviEHop8@W|zI z>_2dvshK&DlH{y4xh*owEGNwLFkQKFh2Qv%UuS%%O0zZ($`CZ0BuPpX1?Sy$X*KHJ zZ~b2%xZNxCvA9%2IA`4b+SmrO%<3JEv8sVo=?oQ|?U1#hkSj1TIzrGnhSHE~7e7~7 zK3C^eELYQ?c;8!3u=n^Du;XWH`9{{=AS6)`(`-pv?T}VG?y?*SI|}6m_<%|TvC?>X z2M2*kHK{Q~Va!}Dq1iMP3oZ+%Ly|}$b2ifjt#Bl)+Azq-nkq}l(Mgp=$o&qZAz7X>a(Z*#q-a6`^NKiKz5{~g*JG?rLo)~?u2aFw2{lN+@0khbUQZL z*T!DH?x5>PNt7lm&dqap?_SoeU4`fPIMO9eQ>uM^6#M$Qc>5ZbXJ$y!6u*?CU0)i0 zqfP$(eFMuy&nDU%qe-YQ1&@5WpAi`}*yD#X_fV*V|y-n~6e5GoE{@Ay)R4Do7M05hQh3 zJQ1_BV4D)IZ)~BWrU;sXB(`@^x>>@C0If7Cic!km?J8y~%W#KqB{HYrREu|!1F4FF_zVA)pIOtS5LHKv12_7QT8`87f8qV;3 zyT!KNAR@QWY1iR*5< zj(QLv-7?b2Q>j+@q4&O%{RgIa^4XX0eIJD(3`2$oEBxR)-o}BKU*VN~hw%J7t|L)e zvu5KaZh7asIdWR!eX6^F1i3bkKw^V(#Vj@ z3i~^E?c~_u<4n&i(r7kOnJP|Z$s4IwXsvo-+rk*M&^SWi3Q1J2A%%nQc{l=E%@(EbNO7JwQE*lbPKILHtxLf zuJh#_+s(Q=eQavo^6dPpLR1~sMM#O!kff;%KtyAlB5p2EF6U4Z2E6iWgXrv%G}qy;9in|;UW&apP| zDGH-3^b*oolPFs>DCX@P?X9?)r0)WfM8EFE?9i%h&$l}vz6VAbTxp17NfP=5%K>pG zq_Nnc-86JM5C`^s1+A2@tx-ve&QPS%t>Ae%gs@{2Sf%IL7(c_S)u`QP*g=veDZ6)H z{NykFn_vIvZ~gus{>mT!kB@)o&d+`6j!*sV-S7Ov|NhAj{`P#h*fY_L`*5M*MH^=VR z($vsj9pRPdpSp7T)YRztJRXNpR8YbOj@IWE7#SU8?Z$ODu9G<$MbC+hu#HzwNQC1c zv%trx=^0MXFOjO4l`BS(8g!f@kc^Csv3b*a!mz<&twn#eO1se*dZW($1B1iKkN)V7 z{e_M~d{;0r*vC?6xbts6&yWeZeD{TP;uNJc1r(ZGSxX5aXf*>$zE7dxF?H%B^=6yvuDz1x(h`nJ&3~~725rQxxCk!vX zvY$>nK#H?+H-tD#oYQTVIwWbzj-3~C)fJZ!M{Smumnas?L}36z;GKs8fR~^B)-6G8 z>H4L1M3gE-=7w{!oV@N>V_pBIr>a)^OiroRhGH?ts)Y)}1URk)ZEFHLF*N35=4VrKzDKhb z5XH7$>qfKj-`o^1YYyOkwzv&kc%8<_+eBZ}$1VJYzjs>X!BOH5f zX+#`r5|z~~l#Ao$aa^Bvvu$T~BhO^Ub$@}@R@5l7oC=-cfQ+G3a4p5*Ts8of7U!yQ z)T$_z5Jxet?^3Cj7#bb6sGm%wpo~G83|-N)=89e!&MwRaI07x~&7GNuVs8>kQ0ZF;7iG=lZUsx(I)?iiOJ)ArQE!W4KYO< zf;3^S(c#FUDdzV)%azw&OR+jinnX4z7>B8&QyhEgX>PmW3f64d$mr$^*tmHohhBJr zR7(UNc`1;oVq)!jMurCX<~JUq(QY%pxWLilC-EHDKDCa6Cj`ZOo>I9?5XK03?gN#- z*JID~-@V#Tg0}=ohl2-?v3hcpwVOAAS0w5LG}|$blf!X5wr<+U(Wz+`mX?{GowFFO zvzVK`;<&&nQ!rLyEDXhRk!rb2n8buSrBSOBv;zA22YQXYbA22=_{#d1pM3O2gkZTH zF}GC1bKLH}|5Xc|GsXUH=lqNlqWisE&Zk(&Q79JZgfV@UBEIjR7j}o!bEj92PK=Z2 z6qQX3LI|WQvkjHCfGh10gvMIxGPb_wLJ}FGKocj5*w}MVVraE2gWCv!z$H+ISZHFU zh$Bct!^#c)_{AKZ#TZ>Xx%u^;gC~@$rBC&eA4TSe@v-)G`gvRf1fM}Y6;aNPo)>tV8Hmg`IWoI^1Og_28Q^^HV*7xKajFXDOL z>-y{;eBxu1otBZUWhfRUj(|ASxQ-#`3v#X?jIjaA0-{)xBsTceb2Wv6u#553KBr29 zP7-E)>dOnO=4MZc^Lac@qBy5ggX{W)tu{k_WhMp( zx%84t@$z|l@6N^{N?|{1-6AAbp}Jge@!hANrjqx`mn#Sfu}Uz~BBrjmcn47&GCMOv zF_)*)4jkT~$F?22j{WRUec&@!T(FLv>xbDo+0V|+YgjosNjnG$IsvU(olc`crxoCi z?IOSNI^yOL^z;iHe))M`JTS%asS{M?64&nD%Ax&xnO~Sirzs>UjYiCtjcZvmxq<`x zkD-7hj*&v}t;ZhczklpbYD+bUf}fR+`-YkSXQmGBm>4S1Y1U|muy!DaFC{A0jP#dj z)@meLVx**RsGk+%!+iHUPjY&33E_Getq>+f)14m#CYvYdjlGIewVxZVzn;a}8EQ*Q z#O)T%dJQk<5k==0G2wH6^A|r=UznLh`Yg9X+YHw!7~LCtw9@}mv+?Y?Un$!NDHV&1 z4-TP~Bvc-gtF}CUzMSXmsi_UF@4vg+UnNzR$K2gXIgS++DIn1rjLpJH;*>Z_dut-c zw|O|J5@;>$M%-u`O+yqx6d6ovaHMsf8Kn^}3=Vm;YYEN8|ChS=4z}yM?|VOMt=&#P z=k|sU5CjO401McQM2jLRSyEz^NU{_c*?vx3WIJ#Cl8K_&PAnx>>?E#Z$95vcPb1l} zCCif4D2h#_SOAg$N%V4YaeF!Uv|ZO)?~i=|QW>(ck3aFb0y#fMBeDU5s-y> zW5B`EUNf|t7GosJQ#fwkRL@lpIk2p(#ON?Kkr}C-tow@H{$MLUph~saByjP-n;1P0Y{E zAxs7)xojq_ez6tKH)C z$yx5W@g^R4%UyJvO_WWM)&efK-Ek{p12qmGK8jL40!5a^gh|4^KX3~LNAl>?&(qVO z91k03+;Y>+yyflhAWRdM&Q9Z?QEs7oxy;?OkA8K>x1V~7Qnf^@6LIGB47c8REyLqu z#Bmp61WH;4hK4Y4#HpEiv@t9$tYSnCimLwS?ZW5JzLFG*lmg{AG}}GanydJQBA!x& zNkkI&@chChMF0etIeTjAuRrxW|GZKtu)5YFj#ID(Z46p#biW3;XuWl@36OU~be{wP zP^wfIY}9gMZj>;#ard*e#!%<=9A8l><2w1eDrDXOxL~7}TUh2zd*wi(oHrH)fU$_w z67>=?4Zb5WaY~{Mi7-UHjFs6uG&l|uS{+SlC4n#Th0dK4G?XfW%0Q9086!+a*zFAb z@80_x9{8azU%hYNGfzMM7&~wON4Q?zgja4q$57JGqv$vOvwS~v9Y|sby8=)bNe;Qq zVLw8}K$aPjByUz^TIY>tM^Y%c1c9RHK`D^f@mpChUdvP8eu2(fn;(4p+duQYJd?*i z{|Vcip9d|dlwIP;pd8aDbPJ4x)Z`XQN=TIJ;JOYb1LYKGcVp626UGtBadPlN28d(r7wP&mtQ=@`sy;>cANFJwSmiR;~yOxU%z($&5y-dJ_oTCEcXm2 zPoCkq$G*t^o3EiVIz^;2T$|fx%q%Q&>d;f%e#0I{wqFI>MPw0^yRRfNno~z!%tJqr zD4A=6_S|p_>#NHgeC{A|oY3heeft-KCk!LiGI!qfMh2?`wAPw*I?c;Q0r2c2U;e>@ zpUbjp<$wXNLzY-v&yZqiHJkWu9*VeQ$99rLbNJ=cbi%Y>kY0$Pdd2%r^yS6U<~Az5 zDCO4M?__*zklC4e!d^(4M8rvgavWAxE{W&~4m|nDJpuM+B^`w0(+i`E3Wtjc>V3H} z7eUik2cx~h2DDbAT$fV8rBG=gRGEnZjj-wKPIp*ZoUcFs;*mXz3-c%>!sH5#EbBAl zl|uF#9?C7^N=dn_a6Lh0AdART>V?H*8l7ZVBuPh*WtMWqr&3S|tLa9$EIHAVG_iON zjBT#dS?b``ODH!iwib_m*G+&Io__3_-}tqUeC(00d=qbE8`W#?r!1lD09oz@sQQ@& zX$Wxyv9?GDTm?x6j_@f}3K)^I`sFKGYMA~w<1isjV|1kZA;|_$860T|9B@Z(qc`#f z&Yhp(*ol)b?YwHwGq36JH}kETTE)9_Z9XFD8I` z8cUQJ5)IM?BcWIwKxc+HNig=62Ai?DvO!3Rl8QdI)0fZZ`-#ak=TDvG=;6bAzu)hs za@ad9)%#dXz6!hy?M0_kg@iE0dC|U$ke15V;CM9A?kJh&B^00Ub1U*b9ugj zPJ>e5W6~7gmyC=Kv1QvEp*ZclHdeRuhF_px&U}yks14SX*5#J^9Tq{ew;zzRd{1 zsp$n0?I47Mk`77;z9VM*LKvyZ4`$-x8YIz16I6=$#Q?7~fb}X&ZP{_jGytA{^uc>0 zlLIuWA7GeiOPc0&fRr*nJqxf#tR$LqVwYKKCxLW(8ShD7Hf#Zu-qKpbhpUP_i~x``&u9q>t0jdCFHL5;tO zkOrqt9{>G)`)_{DiFln(>PMXn&lNeKs|8kTy1j%rF~pIEe!y|6!R;#mF?sNB*v;#l zBmv>%?8PXI$kMc5zrMm$rQf)EH3-1P3f|xs0=913am4Zb@0(TbxicrO6<&$B+oS0F zRLVs>&$~#pxlqSk$l9`|U#NY@{a+kL9&Q+Q>9#urUVu(gzWvBI@0mM4eMzbSP91q+ zp^4ycpaP;}ZVDxudhuc@I4h^}_dZSWg$J7X0$49C90aN1>tSm0k z?eysOdJL9}y!_k&o_zdCrca;2Mjg^<9bw}Nm+>V9+Y`B%JGDfXXx|~3j&eQxph%}1Q>`{$cd%pgmAhZKZvS;?t1&tQY_6v2 z=Qh|3I!R2s)uG$fc_@<274rs3*w$E`=g?)^kXb{L2-cfG485i%>Pm!FxP9kg97_GLvgtwI+)r0x}8#WP`V|Ub~Nz=N5S3 z*=HyXl%IUl18+b2y*v|-CH!)o`MCs)Lz-9$MTbJ5$Wo2Y^8GqazzT^H8i__)@QNj} zEG3D07~2Q^js6a|3WPv9s!#AUeNw~)rvpKh2+o|E=EU)%ugg2>07TthX<&E?gF+aM zUo227mRPqACQFc_&jwH`@ACJ70ej*2YI7evE4c{JC1J=FTefh=t+#@el!qtjbh|wJ zW8r3qVUw)AjM~>nI9#>zp8`pJ-qwn5}`%<`m{o}v!Gt)=k zyiY{!n;4y6001BWNkl7??%4z__xqmE-Tf-Qj(Hgo2U5k zANw)3ZrjA^BS$bc#rr-M&EM-4hn-4l4MUUL2^>xH=r>uOp6B*^Zf5UP5x1;}q6Cbl zSS~R(GQ@L-j`W%DxitQwAkNA@$oPsMeiEnLc;kNF|HJQN{`@(X<`$^es}wvZ2gplB z8UvSx0`=^Pm#%J9OC)hb)YaHH!4VphiCiZpBvu$MSZ-U9dnn3&=&|6{L8SRV^=cL6 z7BM)4YqMl=dk~m?UDufPwSjZTj=pDot&8-0NVAK~B5U%BS}FxL!wqT(uS-yINIII% zN|uND1v%3*j&m=%Bo%m`r0grYQATVvVFV`2t!hkWDR`1bP2!QTvarhF)CStEB_*a0 z9tFND0P=}PzVQRgVOsv&=fA+z_9+V2ydAUhGS2a5=mBBhZb&$}EHKl#7$rX}=F_K->BCc zuT9RP3N*7a!<#2C#>I$5+U7;&%1V55%b7@G477%a`@rAuZ$)>jwD6zK!qZkK_92642UXN|dFY%Y73 zwjaD{=@XFbMS_6rAEHHHmE#2-j^i*eFi54`(4&)^<}Q`7&d;6OID3A9<)w9e&+TjH z^FyPy7NNjF_AP)Fj#EacfMPW!S`A5JixC!y#AFs7Yi!^C$Mq$ya>%lfUN2`S=eazV z4I2hf+9NAyQk}3ed-^rq|EK@xH-GBGzx*%Wy!X0WSzc^1aNS$T77k-h9Uw_9Q3hcI zrBcrRkE4s*c>diwU?t&d7oFy|K33%6!CK`F0wEyIa#o=$`hbU#R6N1Z7&y)qbc$YnHP{t1n-jbPc7dpWm!vK$g+Dl1@t52bKGbaw(Xa+Hj^&EPr3*x$XA4 z`=5U0XRh0L#kJ@(A@DtrGFPV9Jlt0*)%P*ZL$~SIWlFq?h}8eTHk!cq*muoU3=IsD zXpK@1&83wedEvm*e+B&YrM4C?&dzL0qY$T7M+yhWq*RMVuHLho^XJbpGdF+H&MD`y zUdZZla4_7ue;+qox0f_dFhCPds&= zxw9`ZF)_}ros)Fe=I}}dJeB8RtSt5Ll+Vu18)!#uG?I*frKM#ad;D?U^^OPL^AA7t z;m2zOLraap;pB3eyIMK;(L|>hr_AW+AnPkL%+J)=xM7@H(PwRGo`KpH($sL{t@}Cf z-~OD3pL~|N<@JlXVF-&hua>6d3}b~LNis&qrufN!{C<*Nn`W!c+QI_um1VNbqFk45 z=hAuox}A0RBR~DFAND<;`A$rymyi>xWq#i8o03XIKUh^=Y(gs4pO1c~N@g`dP{2w{ zr7=cgpysT;?#;(YgY=8o)RKt|l*;YHmCVnVfEFGS59OvPm7#5(r;}y|Eo7bnsPlkm z+k+$otu4xxlq&&_D_C5KF;OM{v3Z2n%37{mb`z?DQxAVP_kZZnfg2zG z#={(X{t%n)|7n)fm)I1vdGSPt&T588AhY?Su_kYf%TyBf@`i`+TV!AFELC3iWI)z0 z>n^BSm6PKJWT0Fa9FnNY9%hH$Ol&F~Kl&s_$4~$Izx%{{w(Yp`d)g;`B{;vnjx>_y zLXRxfm>87I0s1%*IKp79pld8b8cYI?f#T2*7N0mu&^osPR6@RzgpOJ!Ruqk>Es3J*{wmPLA%vPVi>4Z@LUHyALh(AnFmfl?uD$3z{q^w ztwBFwWUj$ch7{(pY_!E;BR{qf=PI>PmE z0uQN5tal=$%@8U>8%d!y!40?F!PrEDC%^Gmhy-M%f>#*AaecBZWqj)njy?Y@#d1Kg z(m-NK;vSWw)rq1Wy-xf0x9r&S{N*x#o#yhe zvYK9;L3@!jH7w1a=82~ZOl;i2@X!eJy%2>ZT#XqUXmHFuMV$-DkV}AB9$ZwL*UYIpIDqfx6ySirjs$$ zDDlqw-oWBolj-w|oSR!_ZGAnrB6A(EPR^tjh9pTYGUq*4p_GGbCBE-aEmjz84A2!;ESf&dC7NoS==W-Y=otgptD!|$FHv3uYCCx7`P zzw%3ylOqdd^DDBYYe>RB4E?4Kfk%O z@s9n<^h(kSdXIkQgYxKeH$?4LrP~b&3b{2InLuSJS(ajqB~5ZLfDAk@w=}BMCs1xN zZ*F9|&w|WdA8p_6NgIn5xlyvw2G8{?ZRmnjIFs}?SJjOH+S|3KVl#>)%pI3fChNt!H9$P8HFaq9T-|M$snee;Vq z-+FiJQd^7XPM^3cjUrT#D>8JJQ7Kj-ir6|i#uJq?VK2-ScA{>E^EYd1cV<{9Rrk5kpN;;%E z#Yl^f#3@<^%9fS6c}hcLbQdG)n_im*#P9yWfBr>Hp>pVj7nqwq%QgG<(YWa+sa1cA z5xd0MBORh{N|so%6r9{Oh9rV+3zBYz1w23B>xG-|`%wl;=T)ib*E_afN2Cc@-!L%c zQmSvHS$`+uQib(qg?P%LecAmASA9bSZmNmf-wD^|3VI1hS3&l^1L$7^{G`$ z?AX4Q``+{>q;%f7_d&Owo6#l}ng3uZNN>LrRCn;4obJcG}QS=KF+jrBRKf>7;pX2$b4szE$x3YP_rz>N$&JadYsMol9 z`$isp;sC8E?Vt58DF03W44LnTx=+Z7(u|*e{|DHyVUp(ZJPQj;*r?0s&>(Yjixf&F z1oo1dkEMmV4cP3aLZN`u3F)=lXe&sCi?lhL{Xz@QVz9=bY(7?_^H4P*)J3+L9|V*N zB|KR}B?=wC{`rvIPP=mGg%@-CSMu|q6&Z-WeVQY|sbOWt;HYFZ?$KL`FcDZ6q$~5B zolK*(AWQO`m7wIJtVEcYcFU4xfD*Z1eFCMTqE>}c#bNQKWg3%HIP$x9%RKbrq3hOH z7dUz78TQibDC$YvNC;NSj*$ zkw0K<@^f{Xf#bs9coBDEJFDW2tVEJDT}IfH_rLdDzy84=|G%cc*JpCgTR$$o`uq3U zLSvC`yF=^bEZuI1CpAUSLAV~;Sh7eH^*sQy)DpPhRJW0cfFw#VHocgdC#A~sxkNud zx3B&;S(anvQW5wrgVhS-!voX`k~n&Oj>Qf@Z*65%`Xx*+MF}W4ioMrf`{57&;xGT@ zCqD7-{_V`%`OPmp|NITzPFP6N9LyFvFJem7GUalKp@AXl^*YsZfsye^1_lN|2)bc} z>o_EiM4Obw#kmi5+ReYX)E4AYrLnxe^a5LUPmp8+CHSL}!GU8}UAyn$#=G9L`aeGT zAAfUoap7%Vu}Zl-gmQeczCW2Xnl#q9o$ur%z-I zOkK}%a~WT0MkdFZas>0|&NIHzLt#j=gt*(|>fO6Id1i)onjnoKP7U*GZ65ym*Pyw~ zHP>JB`&aDVd$3R{o6BL|4m|nLtzZ7sZ~67w5UZ<8c+9c3+-BR>DSDMjs)G}(hZ)77 zM3P0st##6{#|_t9!_7C|Kq8^jYO~&K(pp_(b-hCzXLNckR@c|5l#Be_&;HZjdh44X z`0Byu4qn-6wm#TvtxmQ(&5y0l&rly6q0?R`3@;4{V7XB0#z`CD2h{3A6pJ-RM#tH{ zV=J97V!hen=#dkgJUc_DmmsCUD-_wfWitie%d;T-fLLeT^M*T_ojyywUZvS>bKU(v z`-?Z<^Ugoz*Y>>b<8&NphK5Sqe*I<^9$Y0f5=Z5QT%sdfA@LmtUj-;xAW2=?D;jMa zv^IT4gurza#foI5m52MJMv%lBH%M7t(yTNyjFGs3U~ITZx$IJ_rzppu{UXYhtgW<( zlkZ+IbH^L+`xfx6`I$3~7Y{tjmTePEzdXT-^)UvDs}vlM)pm?>zz=eXpH4-eO=c;U zB~HObDTzr9Nt9eaU^3K0|p0t+SUEc>76VuETH4|*!Ked0}PJu zJPVwC)sOz`sptRp2d1C@+9>^*9aWf_Wd^@6PD_*hmsjKF__9O zaLTxD8zU6Tb#YxMXU_|XryMG^I+aG1TBV4i6pcoM@zHUl$XH&Uqi7ZN#sK?ozx%7- z&v)~M=MLPRBr(3D@Liv7C&Fqj0u?!vfxKxbE=F(nn*h20s5O>Er;H2^aQEH!vw3O* ziu|x*GR@rV%m8r7H2}h}TNX%K?H2XwAdPw%S2;vci%pZmyyb!WdHkUV>2Y?4w20L%$1Z_$H8PFX%qnpV=i9{pqZJo z^`H8&_x|h)&mE;1OLV8lmMgY0x%G?3Fj79Z~#k2soAPtuJg9CFf;t+Pkp>PzF~ra zI3?|@5Q@D-)@Na53FVjRg&K+uX`JG@0e(RfkWv~L#OV_N#)bzGZq5`>jUbK^qA20y z=`$=Z&NDT&;q=h(XuH#CA2@RO*_UU}p4fTz^yxjrqZ8-4&9&c@?xlmrX|1Ic0!K;O z-H_cox3hcaR?be(a%N_ph1GR>VN8-HNVgvxBL!Ng*et_w9315$l|v?=Tr4wGZ%`D@ z5AV6>L)(<=_b!#OTAjLAZyRN5sLV45k8<$LES~3HY@)_#N|vN#))1#DQu(;03EJ}~ zkTM6zbt>qk27^F&s=t9cq*=Tz|hZ4H|CS({xDHnke#!wD&QikXE?={XX4t3ThjbpO7pM7R>$m#+^ zJ|}ZXq_|-H_ez+z1jsUu96J09kN)ldm<2xZfBIc)E-z4S45Kp*Mi97?2kyJ~quX|D zxoT}?Y2u+r9=+XU8OCZH>0GoM^MV3F5Kt~w2nu z#WJ23Ajlg)R_7TVR;PJ>hqWYW3MMB&BuPqZeVz4{7EzR-O-2@lBw>?QuQPPH?qLso z?Qh@k^Z(>SpITa2Mkp5@hupq*8`ocd9c!V@y|9e|DOp~aW5@1YsMc{#&Gi^*R9QQ| z%+tr`SYDIt+q8+ZGv^4TMhXX|Bynm;Gq6$+6kTei0#c>eY>h3OHl6wh@BYAF0(|nb zpT8{UPdmkCXx2$|MyItz+>01;Ez66mY~Q()(OQ}1^$5q+q*;$`yRP8dFP{VrzEUJ< zOpbf!p()ZT5V>?JO;WDE^)~+DJKnC<#N>l6zG{AwB9$t{GEEWw&fCo?&TW4~A~ zA*`laDs%nr9n3AQGP}G=tJNWibH==MoqUV1rXRLy`sc^of)fK-mQwT`25SvOyFy{0 zfj2O9>h&I@OrnB}x(HVwwaSCzx!`C3(g=i8C$?>>r34XJlmJpN9tdHHBZILLZ3T`m zC{#R}O^Y;|VjyXC47#t76q%r0b*NMg12vDRvre~XsQCpvk#YLqXU=We_nr;^yZ8Su zf8`TD^%MX2-CxPl$S;#ITfc^{{>_81G!KzOtTS{5uGept3n&yMnKf9M;rc$-I>d3D zd*Mrg6uFwr5&Zz+6dXrTtx2|SAHWG*&g&~Vm6m8P&rmE>C>MQNOVc~P{m55JH{JQ> z@0mPx?@xdE;u-AVgTG_XJo%?APansonzhvk$Jm^t=meNVQ>hpnM-#~@(kQ}nAj@LX zEbXh}1xhF!N8mXQuH)hr1FGc`gOxg?laq{&k3brt!yZ;;DE<2Iz#V|qxw*-q&D$v# zT}q`An&^-3z3;7`o!Gc#4)`FzPyXmTzc{>9kvDtx=A6bi=0YFI{R2@||yc-*1j=-ubK%%J_wHb7*+v{Mf|Q z#m@5Y|C^tW){R0KL)cqG_+?z*%ey^NU`0xl#B_T-Oq!xRAB({Y0!q~)SubI7`z{71 zw;-jayYt|d%UluAiVNV^%6tSl185ozKg z{SsI2+sC&a`v#r^^-6)rl~ja7!S_g#e38hagl?`)jag|&EG{l0yGtBB z{9N|FpZV}t-uS?~E}KeV_U!RpUb(tnELA9nO|oXlrmc#a7t##`>$9h@@=s2A7lE=(JO&3@7ufY2ykR&WvTS? zOD{ZnG>P^$hK3hbm*yuB=IKjeK5o0`fzLnlwZC|u(uz#DBtjyj#g#<{{4&EsBW&5Q zfz?*X%g0Xe)RRxJZQB-p;GVllqAu%eO~O{2<>m@^-ft zML`mS4pX$q^8mE5c&eWp;JktXXp?&*TV*NLT@ZrB?iSYBLFgE+*?A@3{OVs%efpDs z^b_y>;7|O~-{*7MdhPvR2fn^GfBaX@9Dei%UViAe{zaM|-;s7RT$y_{D-Q|VtQehEK5LVwAPzQD_C7! z=KS&+oo=@Td|w!=#}7TT|KNddE1hKMEFg>L9C%gCTK^aSTy@Tty6g-Fd^XDdjGnd?gtemtL$D~S9EESMx`kyB^ zZaFqSvFX^z$ms0*-uuIgGiQ!p^QXW2v9A|`61DmOL9vR=5g!t5b5%&1~toS!ZJ*pI#Mzddu{<@=-zaGeCdR^s51 zQ!M=9Cvn{XBXfDSG#WQ3vEz!Z%r3V{<2GL5Bn9PQP`Hkd)(L@9;8ZxfyoRx>NMZAa zl#)!(%<}kC&*HoJTJY=($L@d6yMO3UKk|`}{_8zgUvu_yn!CZ#siniuJp5n&__sdt z0Y|`<8%LSiy_KS4*i@LL8B6d=lstzp>yc>(CkQBcc__LvCTEFDFe1;VQV82`b)3Q@OZs1Aq0*9tuy=}pj@j`EEE|YonYTJ zU3yVQlnG9sJDDkAM!l2l@> z!F42sAixhK^NS&wwm6Q!aU^lK#nMvFzAu**6H^sx<8|DM#q+Aii&Oi)UGsxzwW(hd z0`%?={McuK&wlYUfB62R$6mTc*n}&0ZDH>CI)DDDFVJwhC|$rLA(_en0UYo=Nx@N= zBqP%aI?9L>NMlW)a@oD(_mzK|JZ#qH-DcM@%*^*FYqbBZqK&vu#IS;F%j;#A{#Q1GDBv1BH@%?xgm*;1w4NVfb4%J$N^-h;}{KFsm z(~XvX5ydz^pBh`_(e*k0)zEI%B3P!Xrvq9I11M-;J6a4a}`dSCK!`mvGNedB51eNR06wT~KL$CX!|85x~OFZ}*%pZo7fAu&P{$0=Ha z>*wP)LSRuuS`$SPQ7?B6$TCf)H9-(ywWeIDbHn}{QPNT^xF}cAX|+EJ{OikU?>c?* z=;Ysg{;%Hmum0sf|IqR2`N=dBB-TI@5mblq>q86=6j2zo$WX>$G@weDqJxeG>DC5_ z!<1cD3~_~V86O{}9d{8r!Y@_x&xohUGDVtXgqdZj-9~GJ$uw46)~<=1I`V?|t-t!c zQ&AkUGJTA2ZJF+B$k?V)f}tUL!a;_Ta>XZ0656d6?bbT?+_s-66GTbIO0&u0%AU-O zkpKW707*naR0>NgtE{%$q;X1|YNS+@8x4N`r+(@kjxlGvz@4DW@cP~>9Tw&mnLapjMydZ~No-t9c}%n^FV;Y z*gRuZfVCNE7Ldd~?e*1Mf$ipfG?Rf&GeibKIiMXS6sjIN(L{-5d_xUCFo%pPd;#d;IX;gU>$w$a>T! zEp1{%FHzkT(wy%Rb`7SliciUNsp1IY$gm!Uc_T#R1Ue%O%FCM{MuSy3Q4o`77tEYr zBduIbud$h$SLTMh_i_C6QC3zZZtDE|1J6A572t)x&u6sno}Uo_2fy~acJ&M;)h2h{ej|6>c?S}k z7Y$aR!;mx?r_=7RytKgS^E1rOFL17<_g}6X*@Up2SfLhBATjhWoI8Bf(PIzbf* zL>Y8@DWyV%O37ns?g)ONL@$x}-Ux?|PSadiV%v^QxE6%t<#KK%$*cekj_cyPl7W&B zj!Uzh;JQ9SO9A%(h$9D=iu3})I z&Mi0J$fk)QVi^!cJ;)4FdBj?SHdL#1%B2#kt1E=9COfXW>XMP!o}XJ7|ME8va@E#J zuHChP?VHDW@x%KZ~M!C_M4ym(f|K*@jrb{}J@0<+Xa3%Snz0=-z<+)J zeK-EX`gz4*HDIKaFj7(|PgAK_(#%pQI2hR=a!08ZJ#^8hSS+)#)F9|HJCzW5!D9uP z&WNKJX`$c;tT)$~J3q_Jx$`u`9zXJbC1sFcf;N<~J;Mj0L)LMcTW z#TOM25=j;(oIG~)THsrk+IoD`UHAX_$i&p?D9+r*@YuQ0vB|T8LnGgzR0w;WhsGL} zN8*$_O%@Y}Z5-_*9f>C;RtU7PBw@_b$_j-bAn-j>0;-KV*73;Vn9bWZqXfiJ$n5MK z(=#)p!2IR5_y6pNKJcl>pMLIbN~xUTWAk9ElV@i+d2$Af!8m;!NLw5!DSop|H%fB$ z61Gne=?7{G@-R2?s%#r9jsPhQMr%ALz!=aNVq-RZ^O0}-$imMrjRFr`Zu7V0%Ih9` z;`wvT&(Cwy&IuMePf=(LGCn-a@IZ}50|qK3{6dkz+5pW~i^m^(hWYtr3cin(5-IaT zFvieLGL$2!m&!;b=&r8v>Hq$zpWyHC+%8w^F>v%!nvX)U*sTr@ATo_e1yXrr(#2wN ziZvSL+)HJ2beJo4?%?F9Q#|_Ex7f0I3s+yemsY#U;_@<`c9*Ox7_Apb)0EcQ>gc8R z?A_wP@>4GyVaJxu4A-i>^S-+{bYh0*UwWD9;3#i@+glkdmrzoXWGS9wF|tjs1xaWT zMi3?z-OFf6%j!x73an14m0eurQW_jw+_-hy@zKc*r#J1~dti9e)dz+~Cub`4sk45e zn*Du@=C7gC{Ad0 zy0{oV@b0(M7#t={GYX!M)+v$EOeHC;<{BrCALHbyGpw#Y&4H)CJ#gKPH?3X{d)7;b z4_@)X_rB|kFC9I;-3p0xB(|?easr=+4;r>lO%`bW6LKYK+s(VzN}wYsdIQ1E6Cv13^&2bz%m`YZS_L&<35wB-#)r3C&iE z_IjI{*?Fd?r@{BQ@6Gprp_Dr!JP&Z}r5AR-_{>8;v%0qOJB`tCqE4H@RhP`1_ij8iCKr2|4xZMX~$46x^#tGT7Q&P#`0;^^sVPESu`9ghdz@&FshhKS;bcDF|u zrL>o(*|B9K+Q#%k{V#5~vMmb{YJd%N|Vnf?1?=A3(8M87{xBscf-$tNU)aL=5XJ$tXc_FAZ_DubdN;z9x< z38?`;=edmk9CV&Cb^7Rn_utGd`QQ~KORAvb)6rkf$U7q_-^z!hau^#-LwPxrh&;eP zHk+D+B#FNMeh@rB=b^P}p0n1_1b7}Fp@g0kRj26?5>Kfn;> z+asmoND#pn5_{~v7lads8)LYx1D6~~2goTO&>HEHQ7Dy%F9bNR;b$^X8tCclMq~3@ z45c=X3akSF2Oa(0`_|Mq%unaCf@0#Jop;~kqv#*H|K2;!T~^n;*Q~vFMNCStmxrHC zBNlT|l1Rb_A)C#Eb9r?2^r5S}3!U9P= zN)Ti`0i}E-9ER&keB)c+dw7q1KR+Lv=;w%Uo^s1IH{5NsH%2QUh1N9LJbmS<(R*CIhHJ)2iKJ#*D>rHAt1k!RQubyW?L z$pki=HVtE*wje4Yoy(!OuOIDeTQKK?dHC@e=Q*RpgOhtYTX!ret>`b7$9(0L7mjP} zPNAcBB_`E3WBYAqVE0|NLwQ*RD$C+V4^T*ykOS@eNCO~Ug0jgjDv|=ipMX@)07kTj zd@hNsL+DO1x<-6tHIUAF7|c4zuX*Fh%dfoj{EIKT^y&@y{kuEXR$l+t%Pzh0>TAE1 zW_Qw(#uhBEUyDR(9OadhFtLQ;Y6mrOg=C3isk3?L; z(bBNwv?>?@=QT7F;;xap7|m%o!*TR2U4@F8eh>&xJohpNaty@ccKdMm$yu#{pu=B!ruQ z_KgXW0szf$v;wq3&P!u>cofV)B9SOct^1luQw9ON@$Ui3GJWY;-$p!{0EC40a!BX0 zNGl)dR0gSZ7NZ#t%`NR1?C-;=Cw><*x0;5WZ%m*wSWzoR|;rogx@N*}&O7_|n{U7Spq;jvfsVdWRMym>w4@Bl&G$sRKM5nbF;s866)I)` zqp2)>KMzL}N(CTeKukIq98AGic?kGW%Kns5 z-H!mtawJO1(6Dp~M$?3AuDjt+08aRCpJ$t|-gJ6usO`esNXM2^kgD4At*pqwg#*$8T6th!LFX8Gf@uI4TNvca6OhR*pfWxL2?z=#fQ*r~_7#L?<5?9W zB;pRrO3E;8^0wG^>zSBXRe|(yA7YNe@aRzWl8@dwV2}L|o%_Gsi#zPT&#p4ruuILv z>i!*kZ<}5B*gLcNv@IF|AQn$%vZEuYDlLbQ5-bITLlERZ3&-R#KEuoV7|9GGH9Ug; zfj*3+Qy3W?!`iiN5Uzt?pLH7ANBgna^sO5Ss7)@9nYqjGZxQ&obom3TX8y42|K>QzhT zt;prPc+HNxb#1=I){VuoCN-0$v?WW*pKwd6zuTSF$n+1PtgIZdWE^lE01{Qz)i~gg zgRtlR`(nu_OR!|s8f-aZD}S6l8~?(M*z6 z9*6F~8%h!`8d^J%PGzw5)?4GKFCT{Ls&Y)Ks75UJGDh1K(qjVBA*9oQQXX_nVAN;y z^=6SzX((jiCSs5=A1(=G(hg*aKt+W_)#S~w_Yq$|BUx72m-nStQd%*PjIk7sn=hX* zW9>GRc04~;I=K$G@IQKnrysuexHsN-ZTGt7HdI%6sG3*3cWbb>HI;{x9Cy15dt(&dxMu))2Oski^bgl_2J% zQ89HJl$2Fs(&R}P9_m8A-GdY{i zo=#-)jI+-=3zuK<=Z(_<*lwr2mH}91fA7)g9~d0yPabmc{>Kjtr7(B?5>!u^fQs@` zBohh5VsZFdV0bizfq_8`5A-9I&LZdK;43!zWCUa0sRiD6`+Y21zUl-3Ki-rA_TBg1 zby4R~7OXXlk8|KfCgDf{M;aY34GkiJkC)bB<+5c+=X~USAn8g>Dt9oHW@Oonz&LIk zf(V&xCjRU*PoEfcYK#3dJTw@)_=59pyW`F~en?JIC}w1pLMrcLbyEkb(-N+03@}^* zlF0<7ZoMl82L~Z4C!r*fKv{Vuq!Ysy+J(y#kjv*$URi>yVmOWqW(Cj7!A-=F$opt) zX+lF?BVw+LxWg!M1Ug!qX5uqq$o?-rQcCT!K=VKzjeQwpJ&D?uexuzcTqI(IlBA2t z6OFepgnn#7RYMGP&%N z#rx*8gqQZfTETGz00A!#baW4(t+N-7Na z(Rbc?#~G)ezG0<+h6ehRhaGy*vE)!ZrWAZpf($e=K4WdSz}&WBlsb%r&f=J3sxV_h zC)SjdVD5)=@!?1FAmSxRBuWq{=I8TSc=3!66W*F*-bi+SY#LJV1ls zxDx(oc8fRPe0_TWn*?}$&DB?4^xTWD{Fp@yf_*cw2Zn&1arqx-=^u2!UQ?Uawqf(lCSh$;E5>{eao0i2 ziKD!x3R_N@gejA!qN=(Yr6qBcmRBL`dq`!n$a)_7`v=k9(TSSM%JS3BzOX0_qF;FG z;qRSz#+iFktOO%Dh5pt)tZW;=(#EyeW!G&nb<&n7Aqf$4p`qcEKu1?MCW|~Os-}SA zKtEMrG@rw$@1biNBJK5f95OJ)7e&j#U;P}^DFPn|2ClU{>LjI zmexW_7s7E+QdWhD)e{h}s74|#kVqsU-D)$r3Jp(r@Yn~uEK(yrhDLM9+v9 zd@lp-nZ_ZpHZtPmf^`zwABN_S07dX+49S=SCl<%k&pmhi?RVVv&X3Rd$$x$SmsU;h z1JGxGxg?(+xPIB2|M=a?XRrIc%H)yra~K*jamx`5N0=JWae&g27@+gu_yqKf8LuY9 zTvSz-LFCPOE=$BvRaS=5WGSl3%TQHbf(bQMNS2jCI1(;Nj1Ki9?f@B|(K#@5WJg!q z-2ncl4S<O?@)}5`Gf0hPFg7-Z zOeO=ZH1fW0d@BS&N(Taj$DVo~sgV&(-G1MyP3_+Q(`CPZe$|=|Xl-J$w5HA)62c|Z zXtnno2?0+jJpA0NP`-vz3cg~LCM102Bd;X{IS_8lNJKH?(Z?RSt-rtT&IuDH7PWuf z->$p%kNpFg3Lya~9~#EM8ZfdJAcAxqxTb?|EX<9IIfxk!6nrQ!c>oB$T}XwzaRc=P zvP7n#qJS(kQmGt#U%{0|+DvEScgZA4Kd+fS1YHL?xx4rho=94#r@)blp3CR5f?EChv38#h$Rw;O9xWAkgf|71SyR~ zI@r40uxV^5rJ&(Kvxe3Lum?xy;VFja`^YLn-s^(OEI`gP&1SOo0!aorW zj*?sqF-VXU@O=+snGAB-EYf467#JKzS9cfsdwY@3<)J|kj>HyIr{MA{{=89i&Hhgf z$fqB<_vanm0~1{Vbo36PwR;f6#`sTKw`ZS$nCn711b`rfgP1f0ie}^dEUZiSNGhFN zv10j-yX>-S?WPc@7cZE1;IZHR?!kf#$d3@tF&BTJqe^THI+--`+8A?^n?O8n25maV z1W0H|;_&Yzn41T0zf5f;y%gYwccKuXA19I<#DE;(>XL%0sem2gQQ=14d( z2Z?wB0)%C?EvR4Jg;*>GM`~0#z!kqa_x5KWxhwX~ADnhSHo;F@YxB&mo?a+OXcll? z1~>sG(_qSJAU~GJz|dN-YB5DZG6rTNi@+=aXfOaHA}yhyjIo%MfE4&>!QzAOxb5b1 z0Q{+#*W&$m-#yG@0kCHiN*Nw9NdgkW7^?Xm#zsAi45y$#Mqk?M%=sV)A;7Hg{EN^3 z1i)*>^o*-kF5f!`k&KfGBw8qtBQcgy__(19devG8Ck{bIN<%(0;IIa} z!X$g-LraEBB?eT}8d{jbIgw0aXrOcFyY9N<3;@5~5a0jL7hiDgyC1JUL^2>b3lW`)9CB&z|iO@@>&5bLX$s`h7_h)B65rYplb{qSt~Fx$Y*r- z^iKIK_vW@c@A)x+k5i)~?$^F^!qpX(RapR7x@_hC?E@)H>+QzYmE~}yVKh1rNF)-_ zjsunVkjm!J*E@ir!9ny6^kZar6n*{u=fJj= zgIg&mUqdS&ntjNav-yp;-u#DOocXiMis>1096W%1bL7+xM01gN1~4;$~8Z37q$l>+Ql|R~PbZ2vH0J z;!Bujy|Vk)fwmx_FcLeaVFd_tH=6jNz`}UV5D_?@0E9+N$3gJH@S!*du*8iw{O$6N zj*dsBPMtcoA)Yl>Qj-C2anq^=Pu}tCV-`#*fm>RkkxS*_5)8r3`Wwi&hs+pIUbYz$ z)fE^U7=soP-}uHc5RMDijiD?NN8ELw1i_IKUM6GYs`4JB&`5bH45UU3%dw>sQ)g^9 zf5POgHmX$a$`vd38q5LxZ3FOBq_0Y38@dwGPID0mBm^8OAslIDz!@M-_+)tV`V!cNhNV_vf8|!Fh08eA3j7yidsMKFs^17LMy69(Pe4Ph!%BWp`Z|%$0SlI` znDvDtj((|Va_0}x*S7k$|bdis3~4Jh>Y4WoZBk3r9YM+8U4(D3pHGghu# z72A2|oz~l3wy(RR^ulv~{P5imKYD~mPExYT**&dI49qGZrJykikPpq)|2x1sn85%X zVJ4__n6t8p4InTHOBR$65KxjpP>5+`1WrPlqCyG)hImAlXr!2C-FxqSuYc*FJ^yy= zJrDnCyX|+{Aa&HAECk-2rz^V0A1~USa|70hzkd71(*Te_Z@*CcWXZ<|j13LI zl>%TkqhbO8IgrdCSHLlp8Avj5gzbBjh*^fLw3nVKz6^Y(pxFnL0o((9abkfvbLJd2 zFffp)sj11X&v(E0{IjmQ<(~VGBIOwNlL)?tIjamGL;`FZz-;51Aj_6wwj=RI?~k?F zqf#44&_Y@8$xcUc@aGt=5MXvd&=3q`Y(z#^oLCyxD{FLj^-jL!wp)J>V1s}@Bf~@S zV~+g7PZTpq17KkqZ_@1Q&{E zlfRH@=xA-hPR4@y^9~vu9E?|2SAV7k@ulSz9ssWZ_%8U87I7?E(TJw5UQC&`B`T|` zk%-4Z!a+KlLtl3f+S)si&SjDF74mt{0Kq~+NC7|RH@ zzwzoz$Ncbw6TT!}7sN6IUxOSVP`eSJkj3`r@G*BY!D4ou-|5?>R~7A;wN z%0<8Z^)dk07wZ}{t!bQi+UX}>mCgFw!nQq>W%L9RJ{H*rAZ=_mjXbap@223n12rEV z-gwq8fWs@y#KLhgo+LyT`1s?++w8gLUaO0JPj$4nZw(aWj=&ZK zwF|-F&t_3b*c&e_ZEV9kLP81FkRpqyiLtV_VTWR0j}PB_>!`Ku?OO|N?mVp-jy8EE z2yh_)N0@uU_nIkm1(pq*xkjQ{z!tM_NgD4H zWl)fKNeqdW*PR@OJ7Zgneq21lUC!3k%4^_l%<9kfv=<{Ij2KS#_EF&C~jgrhK4 zApmKO02$kck5)Esx9m?T2##>zYesW(^ER8(z5n_v&mUIb*l3zfENl+00jr%Y$ow9M zu~$QoAtW(utwtKqBCKPAsW`U3W)^5|Y2LC}8vxHe`Ox=%_S2u9qirW&vmrkO@s{l! zW#{t1_QVHwJlUx}1tSXtz{m#KD=KIxXpp@NZB9VJ8k)aI>0r&swgwa+sQS^z9y{?b zSNx&#!rx!^mtx;f_uP8J9-lwtfVaGiuE}eLbb*{G0bB*wwv50)-XrwobLbpu!Q#5r zaG>BgF;FaqywdQMMpgr01!e^Tqi=8oY_Sx_A-wY1oWmb{;NBBXIPv5MH-)p-P`7f= zzM;Vi$915!f@Z*pxqu)$QKFH_<*}-^4l7sHK?>Jk0R;G3L280 z|JbQvZ4AZ$5b_XMR$G7WSC9JAHgC;-^@m?P{HXON0^D`yUC6TpIAfke3u9g^eZ2A3 z2jDk9gkpy45TxUPm4X%$U=3moKtKqBkPgT;MajlH)*6}>*w@GsWAfx0X60kQS+nrs zi?4rX(*Xar0Z_a0lU=@i)Db%|2@nSowH*0jUaDpdP{GWNEThY?GZ7}MB+QF%YF@M5 zrVx}yhKJol4?E~of`SqTtd4%jf;fTpzd`o}Vnkq4VR6gsK#&GOge)&%^LPOuoz0@5 zv3{3gZU9{T+w-oy;g;J^iwWT{X>(x{!)JoS9)$7%IB;N+9fkq%g%l`FChd-~iD3YO zfFU$PQw#yD4Ps*u5>Nt7iVtExWLxAQ(B~7xSf=vgvrl`ZZp9}D?6Aw{HW~e209f1B zwk0A75F+45P~fv&BetwQ;sU$UkR>!g(#QeW|5CFZ!6X6+V8zPX10H$gp_2gISd8oN z&YU+6Iqtac?k2RAis3;10pUI}i)6W?mThVhNz2OCuosQ_WHTOCuU`E*01JxcIp2Th z?XQ?7jt<|euxG`y&C;MKAT}4LwoMOvJKFco792Cp0+0d4gTmPoZb3qzwQcRJ`yYDX zM_3Py(R**Y=FAH&z4Wv!ITIu+`&tZwAp{k`Ckp^lfCMsyXP!afbb_`8kO7Ge!eYD^w_ z=;yZ-@R4^)v9@mvtvxGkL1r1t+B~Q0#K00@ArVhF5H=?;(@KQ&Xc{C0(wVG_P4M&h z6A%5|XAK$TGAP99C?Nomy$ZmXv|7ZPB7GmTM-Z0GtO?J*`0AxcA9=`5mtAqyx%=*S zK)Tr0;N+8ze`wkA+9Pd3V^rof2kHlA8o&^E5v-DtOti7tHn5`yLaehU!TrysLl^iFFpIz4|7_WJ3zB#j}@9B z8a(d2nOZ}xa~~pHpT6F{&HMWM%O_5lP!tWvp01ASBMv*@T2H6o3JE_fqsHA3woVe^ zBnKpc6~mR%Ob45Fb{yXP@^z;12I7`L5r+y35YO0 zFo4INc{y8^Zch&Fyblp|k=6r#UE`bkvG|GfVl?%+6kic#;l9-gp zqcoO7>E>I&p#-+vq6Y2F4ajCQAd-g6AtijRkk6)(%X-MB^XMPyL+jc$G`F^4Xk^6X z0gi(hB)nXDqk84Fwlq!s@|TY|Rci(ubC*Nwun`$Fp%_-Ok=Rc88{&pi3Q9BJh)|xi zy{&CVLw((h?Y7^cWmCBKdwTk|COeVES`->n#9^bAB7v94%C3_#WB{gc^37ar9J%N0 zM4a!Vv1!e2#Z;?AKY#i2l~?7taLEX87_vy132ftoU}`hXg}mJW)aF@*l%_Ed=0+l1 zJ8e&}fSCaHgM1*mUUtb;&_H3^9B`cKYp=Wh{D<$qXUz|Pbjst!yq_L=__1Gkc~O%m z4=gnVITlybpkT_047rMghLi$~7)aZzLVKp+%M3*fb4?gBnARpA(l$P8=JKbWdFFcn zHi-tnqWNtL`keqIYQYYgb^WYp%KGkIl_Zn-}9c+oJ^cfi$E1}3aA&%}bgy5-TM~aNx z66`n?7k~if0%MX3V2aX)sUiiibotWH73(@IU%GTp&*##h34-t)+Y!-VDnQuZ1A$1I zkuesARR#x|$u^D%UN(()-hJm=#qx|RmVL78M~fC8K(=em%mx@F^PY&w%7-BW@*9BM z*BVM2JyF>4+Ct$UTqIlo$0C;|Gvl?l-uUu=4Se2r>+yfM?2;>TIzA!hlVKW?IiJCW zCWNrkOKkU?1xU%3<+d@*3@Fw{^1?ow`O*d|;BZPngm*^pL)&rbu*DOyhX?}FPDW_- z_xDYD=-~&B-w^Mtx2J2GCt{|9FUWXr6e4zj_Zs6J0H1}BMvp|G^1#9Yqb;hbNb^Y>-Tmd+^VedT#xLR+omkgyLJ78P^Y zo3R*!L&{~8!bHGE_+Q(&A{_%zl_0EO{`jdCw zefKY9o>0Orq~kzJi4@{!&6ncC76-S!HH5#iqN3BisLzrI^nI>Hrd$g(1>^z{UeQjea0KN$V#KQh;{=5Ki_uY5h zHRtU&rWf1u-*wwfXSTL=O=BV`o8N1tjOj6~jGxwF4S>+&#}c(b;d+Gxz##5Lr`GKH zXx4UEBH{^zb*I}3AYw>*BdWgosy|=S(Z05_Soc!>sugZ+)9S+&c@PXpWf;xEGMJf6 z9TO4)wUGrS9l6(7fV2d(2=j!1JV3VQ4_MX&g#`=eA6Qpkzh$wXv)1M{({H=|j$dgA zXl2hy0HksOq-1+$5ZpZ^!gHs=Mh*~$WY^Q%HLZ2++9}2Gd~dz}!g-BN%|uq-Hz2o? z)F20N;sQ=wLdFDQu0%W*M-l=h(nT`vBH+ZwD|v2=$EF1+vtkYiQ2giY#g2bK%KErXy~!Pk-L2N3)q z889?as{_VilJDEDs3`yoy0(Q;$)M9+NC#Lma=yT@uQ6}l`(J+jg-3t1DFI7E!^71| za|i?ptKTau@GWc<2_#Mg0*1H%1%o>*gSJY@xYa=y7)Clpv&O*SP<64c!|I0mos=5? zd+WxHb#b$TR1if9;YeZ18h71&*Khm#`%5?admbE&-|~;Y{UMdjgIIte!+5CzDW|ZY z9xpK_gwczOu1EBu=K_3Sz(*Zn&HwmK!PiAVY4uOVi+Nge27^XLko-jNhu}O@gv}ZhL=>Tr z5fPMa26@?Zd}Hq0Wy_Zxl=C#wnOvA~Gi!)|aZ81}kYND=j>xzKqmE>O0#P zecjf@vcDfpZY1p^q>&{X85e( zvo>r)%ee7XAf2V`|BvA-g@(q)BThK+2ah#0)J-YYeWi6o-Y0Tqv@S$e&5?UubJ!HO zLl|a4EG(jQ2$L5kZvj_27#$hH!w=naX0fito3FlfSTCc$!FTy5>;gpb( zkO|Kg1M3u(Kml+QL~3I{TiwbPGZ!tGzsKy^Z+z8tU62;xRAaz=)d(6k7W)aa0;4!0 zgtVBD4sr76{i3xhFe2^0%Vox@Kb$}R(DnK5AJ6}A*Ry|d=DmGsf10BOq|yazk4S8b zUV0pn@d%|rLS|xN)W1+XkIyA2(((x#fq^MVlznXXKmbAj1i=am7cH3e$m5TEXM>zk zW>K1qP4?g;Pd+qzASI2dsmQ{K`=GKUMq~+^vl1&-_oB9?3wPf82v)D{M*m0_9sPr7 z>F7pVcP|D;Mvzs$wM`*N$3-j_gA@cJZGm<`K_Q#VZPfaB)vEekGz%lez=bAmFtr2` zx$7(d90f~)f9JR^q;#M`$ZO!f`|th9rgHZ$Us<=S3P_K_5E=qOs(;nQ4tFv|@;q(t zE!N}yys)6z(9jru@Pp&lE?zXhs7#XAtZv*4!h!gDXZ z@V#O_V=c{VrvLtTzqz}kx35Yo1w}CNaNWtcNc=a_KO$@(M~M%?-IN|nVfLGE9a{{~ z`1q5LT|&%=xe^|0D0}Cdh7Q8nIL(gr2lSw%!P1yCv}4FFT1zmy&=3&1;EfopMJPy4 z#xtw6ty$DJH2han*DY)6r(F1}pFY?+oZZYwa4NGG1M*!^w_98@+I$G|RYbw_2#88T z6!L|2##e)!K--w118gT!H|Yq`P7@hqf&&RH4W)V3Bac3E>iWF1f8202D>5;99O1;y zGe+w_j^Z-m8IG`VqeP}?-N+23Jt*ayA6h~A3R(lTOIP9OFMsKO-URrU#rUF+-k-H_ z@v^;0t8jcnTjv+HLD+0sX}j9d4PaPJngdu|h6fm|F*H2lzWnmb#}#v68XFyz_uPB$ z`K&1nDus+wgv>2O3Vj^{A{=QG6j~xo;~`BBia;CSUU=b!?=Sh}<6Vkn4cgYWO#0<{ zXWyC4>m-Q+12#x(B676hp@61v6e*Y*(QJ|*#(3rr+e<&xy^RzTp>b%)CFDp9F@Z+| z7*d2GpKBf>}OAg(b&(`19TYA(H zU#NfRiD$oSH0_iHHXH~xX1=DmYMw*rg1(AIV616I!z4)?J~g7+dIpO#ntYlyRM3pH z%=_NByDG3{uy}G7h<=!Tt z78uu6S_kM^7rY$@Oer0{Lz0BK^A`N%n4^xI|EJ3@{nAS>KDXJX5U1CyZrELUg;De< z11(_RgoOvjvvLVQp#mNs+oKIl^J`_3SHhx23lA-p=RfbnH;9AT;+1 z?<%0sfEJOxVE-Gj&hrN#fY#%+6$9`{2r+K{pCZ#in%TsmSQ^%Af=7zwjnI+4-zKSN-4rzDQFZ362_m41m2iE`zs?O z!$p|`Jb2$-XZaujrhZ+vpY-*37+Gd2onXPiHFlo=cBV}xZzFhy)q9|0Me_=_;>3@RIvBLE{CL{j|M zW_a^In6vjOr=9XhXV2J7M=8j#p%>Bq*4lm_ZOuJ{`as*#QiMjou#+sttH~D2x-h*O zfc-iu`=O0QC^JI~Bl%QVH3bEeJ1NVmlrZ_oU$478 z06PG?MiM|sj46#fAAJ(n-*z`1dFoj#scirp3CDFHV=mm71J@Cd(nvT!z(}DMAmwrL zo^Q{2>!?>=dhRP5W8W^EKX3oX9)0{I=0ek^5S)D_CSCvlAOJ~3K~#k`vkepggq=L$ zP}YX1zyuBUixdKm>tOlHmAiL#b`~vDJNTs2DN5%uVU-(gRekC`MUneF(5wzfU6E-( z#=2}>b8C*K^LXLK7mCKTb>91P_IvcvhfnuyJP~r8CXk)>G3?cV{c9$c&2?_3d85;O z9BCRB)&t|}8NzsifFJ<@sYfWHEv9@+l!H&dMoiPeZcS#dyA&n^sT1 z^R|DS_th^Q+W6}0vybq@+$Csc=m^mYp{HDU-XaO~xRXf*_Vve~EZOMOMlEX^roa8( z+;Z2E@RSaTtkS+qpBWksn2iLkW&vo&)&r}Z<7Qcz9N_w06_wVPvmYR1grpEFt z)zF@Y6)RT!e_w_xmoDDsv{R0MynQ6SjS}YnAxT15i)s#}CdT3VrWvPn0i73I@B=Ux zybeKriZJ~Pbn4)oj|bGp$$=Q{95YD}013fa4Y;o+*Mo_YG@^?7ew&D^eSpM5{K z&<_9(+XS~b%eX=&NWOz2ufT=~{x-ws3}k@Jl#kKrjHFbNm#o*FeE!Toz1^KPA1zpP z0Id^j{=K5jcu+f#q0&~ znnG9-;0OzXQ{fIJ7$f;~&I2){VfC6_Z@THm3yW%C#k)h7c-M;B9!xj^(QmZ6(S@-2C`&fBQKbGu##?pv}Zt0;s|L{WBeM8dk@S| z!Q|yQ-xFAqdjSmrO%fjK>Ps%V@Y=dn%Qw30P3xM~^7g-9x7RJV-Ey6$bp^2xun!0- zC`JTpW{sl}i3NbgAS;0uGzCNe@Pmx%0i>x- z7-mwLEUFcxKw5LQ|k2#z#I{%#Y zMhQMOK}@H{#M4hb@gq$Ic^|UueG#2O<$~T(6oeap;pq_gk4owE4-UI`-+R}uiZubK zU9s#yRsq|%06P}+FO3l{BB0*5X_vqRDCnRuM*uSb5s93DysZdWP$U|OzrEnRTR)gP z|1cq?mFD3>%Eti^7zHZ}+FxXECkDC>&*D%i0;oX0pu!$=YUH95xOLY;YQn zZiA6ijEoYfZ(Os}ZP#9T`KHhS@Dxk3$rFD{(mbx17t!uop-Wf*<${sH@uN~fV!)d5 z{4>veyV%y?j(=QtVNdVCbYUyZ=y-SZhm6$rg2Pvk*(jl1GAL6)@o0nvf9}0Q02b|Nm?|s^@R+iT!6G6HNEFIyt}CPS&v^hql8{Yh{$m-LrysrV+ozrSqeq+C z`gVo(;Ry{T1q6$b@u#`a{0v`=4t^~PT|BKU2(H5$L33e(F$D2V#T_zNLLGIo9sp!T zFIgdQLa>OxO@)IPW7(rx;f=TFd}DpzV>+EFWkSSUkqV6)78aN*G+n}6fD2QRh}?+5 z?$zt$02J|43iiGf67%OToR#`7pth}Z zEF0bt#y-x}B2OOQ+1@s>nCmkWV+?ph7Lg^eZQ__`3?@&4c4XiUKqSM-D?x?-9z4E5 zYg;Q25RjVD(b9^ipMGpsF+BgQgAQJJ!%a6IcgW}Wd#5bn=7ds)fi3?+sL|Sx1J4;&LO^T?I+mee{1 zH?>>Y)`lVO6`Yw+QoVqu2@BAMjejep9eVK+0i;cB$!<~295t7(?4MaK|;0WPaKu8(!f{EN7VLwM3egDw(DMI22 z)GSDZSa4x23XFM_q4zEpKt%*Z5R{@IARP-RAd0<#ir0b_g^Sn~8(2W3h=5`TD=I2V6#*&I zOMoP2X1*U&_c`Hy*DEO;AD%~%gzVXS&#d*Xw-n{I&zUvz;+Zqv7z_&RP$Q7u8aNZ= zuqU}@zrr5oI{iS)+JzqtDB~vmLN~C?G{as29b%S9Aao!A#3YVzi6b1C_x9_ypWeUh?89kflZJ^*Uv9pi2Sf4FSJ;Y{bPm| zkGLEQA*37j6(JAoi78J!CdpH7NDARq0cpDt0|1#oCTKr)?QU&$I%Nx`OJFV8CP~Q2 z%_(zX_Y3w7xUlo&72keU>@tB?ull*=*6ll^u<%CWz%4&d`-FGac?eohVB7FQdc$7D zER{kaCV=0!{dMxlkymcG@tP|x-M)2mq1Q>xnzz{a#FQs*n=@yA_iM*ob6rMS>M9n% z0`H+AHMzZ+v?YKvwUBOpx!vR3nh;zwB&;8>24G|yd?uX@pw!AQH*6tv?9_SjMZGRw z(&D6(*BAHm|Bv5)Z|GDLdLPw!0A!`dWP|SvGn|q49Qw@x$kmi4u#zMgxMo@A;pde< zp7P@lD~b*K_JMou{MXaZzc8A|f&6ZOYFM|HRpSkrWH|I#XCMFs$s{5{;m`fotX@_7 zno*a&*zLleAI_dXcSz3B?D8?L6)Z}=5V8lAp~0dI)dCzIz@_UyZhDQl!K|++vbi}@ z;@356{?@(zZPm(}*IqyNshtOo)Re?5mapDh2e?QnG%)iYjwu`HOCdWjGPS=}5%^#z zJOJHf%@Naf5GEX&g{@eOZ2j?%%(!Sf~Ily7-cJ-kH0&{fh5@ z$$a637kXuuO3e-fU>+bwNbvr4nIGzj=3dyFO^@=_z6utXD6;fRvz@6%)ero(cj z*n4ub#)~ISe!TaDiH}@U*lYFY=0Dig!-rgT`H110-+6E0!@Kt#szv&FR~4}u^+5OV z>N@n$Qg0Ig(~45PZ(4#8v(~mDY*4#PfMC00CcUXLN$lUZv*zR{CKZ|T@24NXZ#v@?wyL@tHf8?35M2gT}jB98z{ zah(B^!rJrwozFMRKWlN*jW;|kWJEoKI&Z>~e!ZN5kRQMIP7C3yp;acAvhFn`AZZnF ze*T9!UuEd`)V+@|LWBWd>BvFKb zYkD6o$j7+_X9@}WkPagc|Z)>$<2XC zP@#Vb85$M{lHPDgtpg_oGI0nTJ$e+|wr#6X6xZ0Oar1A|Q%eYdL9zhGKHvD_DSv-q z6*1(?{tdtdKN3HJgHVp%YsQpnmOF44i zpKH+HXJ2!;zw@u{+sl9Q>Bs+wNws(H{!%!2bQwgZmFfkB#euGdhSELO0@AUkCS&s&iDGe}{5okp&-q zGNwz{a}W3Jeg4CreYChtaoMB4|L&`E@;HUOx$_^gv0K@4Wl*50@gjXNn;$p@PGSkr$U|^dtnyR8;wq!$->f^7E=9w*>fc#kbA7 zb?NZ=BU2{d6q77M0*H|a0X(k$@k0K{YLPw0ym8 zUw(F2&mLVrduir7!wzO2&6H9=nzI9r=)qY2=d`Ki%)nfjp|MxzNRo-`Lva~2USqfK zz`o4Ca~%yEH{Uq%p-H1oZr=36B*u3#19s}~7hw#)MR`}DdWQQ9D`nX zHY!g20ZR^vk+4>f(#u_uUI?@SQ3w*>fAiIuUw!@6KN@z`u2b)q)TAV5K?$;Uwg&jN zc8LDZMTw2R3~gBP_J=Od!9|@)h*&QE+_JgQ?M!lVa#BgiP|f9P6j%bF&3yxbk(W{C zJ(GdndwiQ54&YF(Eb->-`TZ^(G;ra-UR}OiykK^Z{rmP5D-uBEN|kec#9=R)OZ-u^9mbtp06vxv#%mR=qf_L-`67k6hHd-#Zn{mf6X) z-?Pxn>+n#{AM#19hK<0OMupt}G`m=e1Qg5xWzstdJq&^vgX97MNmMLbdPBFaU0!)` z;=|W2{NR)GE*U&{cB#^tg@!48xBT<8;RE~K*!uKSx4l05-Dxoqs1RNaU`x~Y2oFs3 zY_grruLk^#O_({~LTX}!EN>W7O=Z|nI!q8?1bqJa7ws1=oPSJF z19~s+)~(A=PdxMN)d!B|A;#5y!3}vxKSx}O#NI+XYZyYL@EK!vP^|Y#aw;^HoUHzv z3yFF2<_fkV&Iz54@+9n#3>;(VHlQZ<+>%`?ni(d z@~~b9GgyKkPfV!wc0wXGHREsn>{Y7PT;G4-5bTPqx^&v~0uh&vkkYw`()Gt2^0T;vKuo@BY@%4Tg562%?n+JE`! z`p#ESpTQxEu}R#47|29o(Oh zloZYVJ3s$jci#QTSD!EMF!$ZLU3&KH_DqQg`;$pk*aqf#6R->x`yOk5{s_#q2wTiX z2(VG&k}TVgWa!q~Lp_jQ_6L#OL(K1yEee!3J5iuAie(lBTQmN{uE}hQ- zOA6eu(PM&JkP~r%ZeB>N60^iXdgPiQqjU-v4&-t@ir}+$&2Oje-FF}?&-9uUc#=$& zW8k=~mZ0jhLZplXf5--xSyo9j1vxQb$p;_Z*!SX|yDuHw=Zye z65&oA-(pQO0finw#TS6#L4YsuHh_qedi#SC1N<2VnV<+ZY~9oNvde~T9(TjYK}EG5 z_3GFEYs{GIUU=ipIYWQ`b#2S`?b?4V8MCrrKadS%*2Y07%rDqA^NZ`AO>+HqGp2$) zg>b+MW7-GY_}_9hC(#2*BattentJ#|8343wb>*z6K$9M19^Npgs?xl;~>pZYu?2o?Bf*24f$HdjS@wnzfly7kXGhYlSo&>`xY-+rn6%#%-yZg=MC zKVLKUh8MT*I#5Lox&*+TZ$Bi1q(EN-!Nxob7YJvSo6ITutgEq>egturG6F7yE zOM%UQ{QkGe4+94cd;7zspPjpS(FbRCyP*5CNi5jGLRO}3&4G9YaGZQ!2y6M{=UF-W zoX`DF{CW~nu^FXMBoVDPRAh1)Vk0_nvZ{M{-cih+J7?HGxxZDb*IHM$Z00s$6io@j&KoQde0H*{u&!j)(Qa!Xs8ejpA#2CK%?w1zBhYo(XXXi72ne@P26V|N$ zwN`Q1qsx{p_q9@32X;tn<~_FOBC?7r@|$Cm`@@`qgfWIdE0cT|TeDVKl`G?w*IudH z>Ads*D2``V1g;;IiL+@9cA4jZL+Cxw0kvAa&JnUlHW8xIm$pmw9#~5>A=TdxWgpq4 zbEnt-J>}oMKl%LYCevSgYsh88uX?4h*WkWj?jdUQl^aztq9pn!dh2MvS>QD{Jl1P93jhTf~H!gX9ez&Wy8n$4} zHDjkQ_+V+L{W(V!l|{sqPl4cwiLe6BDC13k>*uGLZq~Vo7~F>}p(gzQoG-qRgzQ7v znT6>B@b0_s+#jPrVH8q^tZx|e&QN332a}`f)Kp9lK%^9I?=%)OMiuW{vU<)Oeokhc zx^=Vv&d;7zt=hr+CO$a+lh3}aKV|Ziz61MTGPQE0vg@4^AOIn-c{^%YrQJP*8n_5c zV9@msxp&(I%Bq(^z-53KcME&&z*h-rAsrZmvECC<1Z9(rqzBCR-}k^(b?VeRE(5^y zw34V>yEdetxc=VYQ^LES9ueFO|NY2PKkvm3P>nsh$-j~z8!sR0kV4l!+TX*RDJ0Yr z7G=t!kqd#C;D`x<{n>}Hedlg`x@))O$-u0PO?qB% zrdMDFEVT}b>e)&Qg6xj%&R%f;q^AbIzGQjp>NV?ZEzSTyPHtW#{EB=3u7lFl0Lqg? z*rUnOM7V$4{iaL!SwQu$Tw+qRjXo>pQ<=`xwS4<0;FBU!G@A=$w&v&m?t@m|K%E5pK;d8mtK7J z${_=Kzaa$Iz?}>Qy65+c6A+UE+hv(-0PeuqSyyghgRy%${2C40>9VI#j@{%Lwqy}w(w?Wz=LmNiFw)`KQTm}c!5A$ACl ze{{j?SYE2(5mw5LxOxGk1EeDi`(qS&`swFhx#NaWmlTIHtW3GGdqM*(kCkJ5upPrE zQTECLrJRw5&87zd#pEeZ+`4tofeIuAWGoL-a3zn{4V@bpIYvK01wE7B5V5d2&{_!U zGcPCSXdpN*kp1(gA67IOGNAYD_UCl?_U7Bi|9jJ4J8Q-ygA|IDYV9zj8QAlXk1OIr zL1Dmw_`(NH8Dhyp$>qU+@vHEaC-zg}aDlTTeY{iRn&%zbB0=P{#4-O->? zz0X)AvIB6Q%~G>8odu&iBqRxS$TO`U;960vfqVf8sn1rjiI#ECJuxWQFN%nW+7Na# z2r|IGBxM&!2Bg$|)$6a%7`18BrqciG8l;shDKauj9t07%j6sq|u<_nY)7!clz$jV6 z$`$|5SW*uq4$4g}F97_tJG=%? z8XMpy#MK{~g8;z+;)sz1k3^9zqWERamRb`Zdi2hoT{?XK=)}7xY}~N6YEkad4I4I? zWqVep>~I58?_^BZZ-(Fzs>@BytX3luC> zB?Sni>aiGn8>nLuAG~b9P>rnmTq1^mIddi9k^OvPkYbJt2$D!kN!$4Fq{$=u4j3}K ze1%F!3ws?_|NLW8@9yV4cHd)@mTvp&Kw}{Zj6++XI`k`)UuH85EW{ z>juq)mj3If)ihdN4WDS^RH;OS2uXbP?YCzhICwBpP;2ttS6{Tg^0I;N4jnRd-og() z>v)tYTd)WRB3u(lSww}oYeK9D5gNiOBStP~M1rjCtWOSf1Jy)F31>ydKtzRB^X%QX zzl21f2iTef4T&HKob@HVP~Z4m3^-+#B|%yRy*J8Yb#ozOF zZiUcUUP9k2t74YIsw9LI;G`{#gm6v>-k{kjV5KDonfzqUf>QOrb(Ha}l|&4Jb8rqE zK6(@zH~)#6HLA=1cL1=(3UC6P`IZz2!YBHp6AC#ey8({S@XMH*mvNY zCjtP_s8NI8BnkJd80Lfq^8?>@!WIs?G0-whzd(ZUfMlWK&;)?~{Rd5-{mz2!bKY5S z&IgM>I=xHRZi|ch+N)Ntx&74{?_Budhf7;ed+OgkUYY(%no(Cy;?f6%5!zeBO{6L66kKRYbC3Wt zz%jGA8bL^!CY>Cfuzm30q5qg2Q>|+C%`9LcX*1%(y7K8087X@TCLNzcdbVnc(Q6LH zu+w^o5$K1egrtRJ)c{O~vIiu$nb_0gzFv$YKxH2$elX2m}UL1+MDi%cQon2>Rd zcMAf^I3~Quc$N7N&-WcT(0~^Zfc2j~_3G9CKC5zN{qqS6L|K1L4cH2j+N;tp`W(X@ zS|Q-8CERA^?2-_3ndZv&iojSDIUIQPjklld+5P+j1NwBI`1^*ng=&fP&fBjK-MM#P zc`3P7WyObXngCnl(;6D&ubeSJsSl`03#>7J!s+%&QUgIQB}$~FV(-4a znK(f{r?hJMQCeymz}4O*G&4wTiNXor$uY+Wjy-5pG~CFB;aI6DNy$gDlO!@f=FC^J`svCB7XfUVGz1{ow;fv+VyB^PL`F;J`s(0UU^MjZ4z4*QP?=QJ1 z`)F<^7%7>*-s8-Dlq^Ky0_R*^hhfF%b6%J;)iu42DS9lXeIlr)6_CWxs8Qpe|LHZK z(WdRn3HRK0|FSQ>I=e}OTI&S3+t>XtVn*;)QqHPU{l1dY`@ylo6|H{FKw--Z-(k?O z{NUx!5i@<2RHroKkW3(;0NDq#OU#<{&ai(}_f)B}iAjmnY-xaWlghZD%Nj8UsmEvCC4c zl|us#xC|Jn20t9y0zs;*E5QkpYjz_s@F0pj7R8Q(M@rrQ@MCwL-}&sHM-IDq_8Tuh zbH&E>YYN@UvwX#hYoh@}Mp`m5GEzW{EW=gmJR7UDh1c7Y)S#|b%u9lAWyZXrZ>jWD zJpb%dShnn|^39qx&o0hqR)zBAw~;u+``|J7g;Uw6hEJn2>siM)uri!c&0513+~(6Mztr z0*r)Kj{{N$4kIETD1}R=kqi)AgU^Nc*|lp|vg91f+8EZoKoTr7-qo*(;nr>u$m<)N zjiw<}#iRscN-D;^lT>BrDG;Rl1>O4o<9EJ7#hfWqp1yk7r^_2oe*Do(I-PUY{G=DClxUaE4)44H>x&4GOW(Or&Yo;9nWEgvZsfQ)58#`wH z!xQg5`FPyRyC&R608lowl+Hwmx8riwZ>0AsA-J~p5jvv-3GOF;-5}Y20OCV?Xt>UU zugdo@6@*m#uJ(|KK}dmp2g2KCzJG7I3KjoMOHbeB6q_1hlp=x67!UHtXH=2vo~=J( zT6*c-)vDFlQCttYe*FhNGUbUWBQNTH{%0hm-K67nZ+@T`$P1+Mm=R$=d>8yDi6Ny# z3Cx)JcKa(XAMsSllIfzju1C3Y<+E?R>DGr9ytk-L>C)-WZ;l+}7$I*%FCm<~@Q^sh z5_!*sKNU9NR#2r!{EU zxcTbyyZ4$`t5&_$Dapy3tk0XCj{0z+^~v)=WY7Q2pFVRTQKfPvoYb`Oo}$$Ngg=cN zHu*u=MmB_Jd0V72Su?sAic`+$o>xse$Xg3LkW-Cna%zc@t+zsYi(`Up~E8k zo|#RZfKa@hbfIEW>cBw5_VGX$)ig6mf*3k<$TJ-}ocl>pU*j9Ey*OmRCB2v2ao2>$ zzh1TKw1c^#M8L__io#5D$u{)5l~)b3t&7a7;Mlh0oj2rxMr0dGiD)!>T!#N2EMCy* z(jooc=+L3f%157?cJr2CXIjZiYX1 zemt$P-rMTcYi@0OR=ZCdHE#BUM4&CIG&M(tLtqnzZ_?S_GUnL4{_ukfZUJEj5OaG5 zN~!ksU3(9gdh^|d7mdB{x@Rxw*zU(0Mhtmn!|GLa3TqvD_U!%M`wJIVTJhbF(I0>K zHE7kUCAe|q^0ca6yq)zXmyij$NDl0B?|Q{@6;QE4nG@p7>e#8vyAi$r2oC@YK^&o> zWPW6baGfMgPpf^e82tUy0Gra+m>%le)^etTt<|7SvW}3 z$A0{rCl&lGLiUKpQZgVN*c!?Kke(2VJQcePWsWFRUG!Mg|W6dl|${4MOShX8Iml86T|p@0wJpRM6Y zMf)!@&Ia8mOfA{ae~(Pxq#3kanwmrY{{w(JbsKD)@#gHaTbCef7gK18p&sHcUCv+d@zPJ4Oq=%ffZ}}6rKhL!0Rsm=)#dzdulUEcv20*oI7L|Y zs3&j;r(@e9HFQieM54(kRjTx!6QyZQPfy>U9A$9_yG&q4`o+ADZkoxTA9PC&Ik1NW zqzlZkRzapI7RpBsk|SAgL_CDbbkq?AM;mX8k#jX+T34czT~C9ZD@30|!%{pPC;>n!O<)wVDSZJGGGK ztiEPp09WZ6MPo5`)s>^~ee10`o$kH&!RrPM8uoJ4s@0B*jarZt2xx|b2(i4#w)kXN zIr;2^wyS5ZL^VO@j76;VnNhL?08)~Z4|eHt-rQ29O2vxeIpr}PP*|mGYaJn+Jexem zE)tqQ=Tq)mM1-ZjTMNcx6P8azv%4 za6qU*MG#3W;G&9m<#JbaeIO7w5Z8=u_;sW{&!7QKA!P{IQbRK%Kb2M~CItsEhF^Z) z*lEBeeYVb+{!D|Scus29uCwc^k)x(kV1hyk?ykj^JE4LdUW4rSdSOOONKza+57gQ+ zArXLq2|~`{BPo?DS3Y4f003Z6|Nhg$q1y3aD1{qiE&C-MFzCzZ6=RBGW3L%I@sWoo zjV;RS`f}N4ttQ@o&z+AxKKa(wzi+9RYbDOQI`;N(LuzogIQse&JIu$#rbpu&(OhKHcVDcEzP{%z1BN-+kFfGgb4-EfW|l&}vs> z-Qp>Hjq(M;W&Ef_Pzz%C_b{}#NaL68SsRkF$7ICxAl4{H)cK>QCV)ij>XD-#ZB)O( z@5keQF8ge0%dyvuowoDf(JTo8&hr4yZTTXEP-+c$Vph}q3+)td2c-;-{V&2ztpSJg zX=shLDtXPN5Q+>_sY;cd-Me>x`=(oN9{=#ek6gZB-uo?n{$)*t#~yopRQYn{{?QPq z`-K<3T)S%JZ5MRw`TC7F-*L}H7o0aQkUZc04c?WRY!f5uka6S{Umm3y;R*Ge2W{QU& zdZbM48rAeQdSIN_e@V@{jt~3I5Bw$~tlzK!0|)lSP1jyNY4acJlZ*3t)ud_jZ<7L5 z?=qWY;&33}_K`d=)_~O3w#8F+Nt2a;I7+3-(vnOu-=S0{Ny*Wj9nR_WeqmnsvQL+m z8a$xiqLr)HT?}p8LLrdW3xSR!0-4%AObpQsX)Y3KY>Of3_2C}*&k_Lz@=;PMn=J{# zgbDZF_^*2>-geXNOZ06J;vEA9{Jk$2okZXx;iWZF#6Ot31-Kx_2IV!_@6k=edD_k=e&o{iamC zF3i{tIlZZ}eg3&SPn2tjX9ecvESfx-u)UVC&I#Q~(G;7v;6;6=P#!VX==0PHWu!%j!am^I= z4uxakX$`r+C+AD18lX`6bs_qb9gmOjC$5sbnVetLd4m8G+y&3U!}DqfbFm-B21Ghz zbW0Kwp#T^MdQvnQC+bH^9wA9eE(WH2%?*G;;pWePLV*q6l3_b3KL7>*1p#vMINq84 zc0T|=6!*2LRH@Qdq8}50#Khq}B{0Nn(70xn-*xBs+Z#7&`crYcMuppO%WMfdtTGFv zO5zIOvg`maeID@q9{s_OC&iT#c@n!ipWAuKOV2)cTz>YH63Iu@5RZXKA`&4;5rjZJ z->b{`;e{pc=3wWV>PGg60x|dJJcCppAYc{{at9v~fPkTSi<7=7hS2wz3|fO-~aIAc>snL z(#%lX}0*og?<0nyg5U%03>8WAw}_YxcFwDxq%(vdq_LD z+*g9QaC6T+NRqQ;(0?vFPo_+`=kA3+{q#elX3bjU6!x>y_u@-tzWVBG1AqTx)7gLk zarOK=m8^8v5@&O!-f5+Di$s&a^YW0MRuV_@av@^5`ne;Qg=0Y%(wRcagA@eBa`Teb zuU}WLPMx~DPL%Wi(~p*RgEv(5huFf~E7U3q3l6IH#)Zg%5z3Y=yM6o}<8B)|^zxUA z>Uuu;aB+txCqFuVz<_=&_8mH$sjM>9&mBlojha=plU1&Tl!z+J`*VtOLkphI|5=q&8F24A+ zOZxVI>Fl%HEk9oOHKSCiy=kR0_Gj-oQYwH_qHxokvjCh6TdNw@9y2wnxrfMuKopQ_ zXlH>B=x0Kot4yCYYJHTSt^;=zpl+U*fH80o9=PYe%X|0gJ+C01>8z^Ncf9uEGxxMO zwe<=Bcx2Ml{y%p-YyHM;e^n$s^ssiE(&azcS*E8_lEMY$I^~XH0xKqTyzQYH0!RsP zDJnqiu7&m)ciZjPegDJvXKdcQsqW0T-@Js!OrWy}W%>w7Hs~=v)5vEtn^KN33fWp2 ztA~IwP!J%O=Rydk@*<=JSH2+-GJ@5A?yhk6y$}5B`4?Xp{l=@$-_~zX;q7JWno?OqZ98vtM7omvvP8I1;y572&A^zG258*RIYIYePw-u(B96N>G?UN3=kl2 ztZ?RrViv%&_Cg8-7ut->Sf81U1l3P+lq*-(D*bEMt+xfhan0I1aA1G5bEmVWAB`~x z8B70`)0Wc28@PADw?2)_ z&kHFTi0MI)!mfBM1|s2wU;Dk5QO#)zo^?TxU<}_}cKL|c-0*;{oFrN#$UHI-b8sGW0aso_?@JR*_(T1A z^-dV@9{`#*X|^mW5>d(5aGp*Uz?K9ipu;|-&b8(s2m~7RFu@fBHSLCAAVeS_ksOWg zA)*szJ%|V_64?*}J-quZ{7^&bd)j#gA?&_r2TEK(S>5pXuNUf|^ry+*F9||=dd81I z5S&m$6!Qrf6K;wp!(gfn{0U2JZS(AV--Q}SHEmRh;6PGJ>X8#+Ei%&6_e<^bNO8b% z_!&%;jWf-#7DA#)lV;h&M~rx&I9_9JPHr-w8e0i%3TVAFW7mXw|Ca*8}?XopZc?_F8ottY+p0XzxpN0Qv!j@js98_U1f>SS$~Dc{$*mBNmGx z7E>WLF)ol7PUf)eZ!0wRC{B&Vk2HE2-3K$@n1-E;pnty`Y*ncxyU#uamk za|kX%Oda6|9(iGakQ6!_?S~8G#bUNOFwc5S2$U^fp-4f@K7IR7N={C8g^edmR!RpM zVkxWecM4IM3`>P5Jft#BpuZlzG~U?%aLy6a9_N4n(`PT2gr9z1-F?-stD*(H4y{|C z{?!#%TsisSM;;wM;qLn`lY$WAT!XQR-rMgc)7PzC9VzT*rCPP>2m1HxKg0O-T2`>+9#e(#u|y*Meh4HbMNzG4 zRU2x@g=zZj;i&&C;L~J;S5q80aeJ6(A!Jx5V!C4ck7@F? zWrk7)O3N$)5wa@Ovw`RU03ZNKL_t(m*z(*nFI-$y;Qucxe`qv(SpPQ%4jugNqA$Mf zu=miBOd+HtGC(qz>>FR*C9QL|V*4`-q{0S5t2`r@EunxRW`m&vMqmL$qsI03&wPDm z(;IKR>Gqp%zV)WN?)ulr(_5eMw{0PR{QjF}0|yUz`_0+!4Et^U#wO~BRzbxAVOG8g zbh85)ZxE`0QK&1c}HBdnED*>dHxOQfdn7kWsMn1$!=KiNzV znZSs2=ba)|iMU#q5pyArkjTl+!Jk|Hs8g8lb?44q-n-@I+s6NU%C!D%+q79OxjFy! z{ZB-v;IaLKr9w>ju&vj=!%TMfFKEZED0O7?x=LlHDg|!c=sLm z73P}Muiqeh;rky@mrkAc1Wb9jlgD@^Dd7p4?0_R7T7FMD--)xRoe!RsVfvlWP&`U&^?6E0ItSS z)cdbJ{{f}^GXL020p~u!Ko$`FdF4+h738{XSiiQ(AAfAEEM)``fepKbwRv>P5Oqez zv^9{~?}R3@sC~p`9XgxvaJ}fB5j$9wT1m!8V@S%5FUBSAxMTd)GiT0f^VY1nt){>9 z>Uky8(h3b9I=%JjvjdL>t`zdz+C>?ad^pD^4j;2Srp{OKdL(75rm#jvgh+&tk{Y#Z zQ=xo$y!Psh60KXEeyE_Xv38w$e_eLjuxH@qTL@#_>gAlcUQsJl49VA~<9am@=g6v3 z`Nd(whIBr+!#S6A?cDK-=8fw=nvxv-+y{PqhY0EA0Wxh(+q`+RMP1MDe&Bdt^EKC8 zPuE{}J@RBspH*>xKqBOb;-7}`7Cj+#Ji&9+iIW4xX9I=$OA5Un7W-oiK@fz`9Q%FL z(BzZPKl6r7|L=ugH=$vJhQFkxmCRNl2!RFsO#%AL^q^*rLK%q6y_2o|Kf7lbTlYgd6}!AtAIR+(?@|nM9nw zrjfyGKWZSsVoKTuO^r%|NOXV4jvW`B2y4-(VZ+}@2FD1~^n*`00eTIRdC#oM0b%UWw}3F5x=2dWmdTT*j5(e^d*f!O zeqAmzeJzBrL9o6DtWi9fJc|5+KE2M)vL3ls`EdKolk;g1(fH&lyA&A?OJWSsNHkWz zZvCwVanH(?E1%u7NB3Dlz(U}xjFYdLw~=XkB!DRysEMH77y^3F+(+bC0AHAgKU)$+>MeLNayKuW~hIf%rNPI66| zVR{>o+|PXR^K(KWak^j*4c2V9lYvKKkPuk8>eqgq&uh2g!zBv~-B9?PbIw_s6rqjK zK$h{R|F6zK36w5f3a?Cmx!%dAob*ZdkwXW$j3Gt@t{u><|8HC&%snd@7O+3gY;)FU zC&F1b>5=>Hd+h0HBV$b8Ws+V_sIwOH{Zxo)mY^_U+(46t^?n|GszPPhHJx$MZ9`+fWA@!0J3AtbtH|T_Bi3vg0 z`<^@x*LZepyh6rT0vKyd-#Wn$gZtOrci+&sQRDRmb+21AKV=0Y*YEl35CV1W5F-Z3 zB^oto@Wr!FKRx944clwH_~L6<^uD;y3^h;@;MVHFoEO>}Lhx$MWP&5hqV*$ob zxOZls9vyyJ_4A61;&yhOb8eT}zAiBwU@PK)%s7%n=-l@#Yqetn#RY4JRTC1K8EJoB z*t_4Wg>|i~R{eS=ATp%ns-D;Oi=6bCApL7WzIKN~2r$VJFr5(t0@r6d(-yDBPTB;> z+i+2RPBM!S>zdELKF$`;T89Zjsr_j&b`s8@Aoc!m5r~GRlO4#Us$O!gDO?3ly`dT)*lqr`*D8P9yeuGtfT{( zNh_NrI8)ho@%w_c(9s{&|4Ns6C>^#F$_3EGiu?X`?}KATk6cu#Viv}Zz5b&`i5LMGraUoq$?RFP zUVQuQInOU!zT(EwBSzfBc}#z;&I<8%S^<@{Af!Z0aMY<)r@+)fcaFcC%9YN96i%%t zG=9m22w@dg9c7<&wLfysEt$z=qs2J)_7XQ3W|9)D236LA%2-k$zXSVKusrirSklX9 zbc#F*g8zO1(7t`gPnIwHvgz1Smp{P~gOD+puukR61RdsOJROAv%FU!o5>TQUZb1_TBm-#~wv(NsZ zxL#vsnbLbe0U|6w#ADB>LO=(i3P5n_Sq-RP0Wlk#WbMef2o=lF!^g^5Rkk*3(qzN& z{MpNtEf;HjN{bcHLna$qtbq_87+}Qg&_dxshApT4(!HXUd3hluxhHLN))(e%A#W;T znouSrl327rtxtOO?)!4(av6US1!{O31Pb6(FR2>d38#FpzMYoMj8Ln5q3^1eBBPqqfobtdAoVrc z21NrSQUH7QW>>p<^r(;K&Y4xIFxTa@(^{>mUbXrr1x(9O;qO2DzQkL4HfBeU96{Bp zRX2V9>GJlM^y&M0ln9Ik2sEq5;o@O{$%MlTDUqC-ah!MQ8{ z_0VItOTn~aR5!QMSC={qAQ0KGbrql|5rELXecKOazA?MgeG?zMzGki3TMPSIwru*N zLZ6;pmft#l+~keh_tsG0T?`~+A@IXmz1Y3M1AXkjBOHVnH%PPhoB8QtZa7k*QpKYU z8#G$;Pp|3w@4h4gdgL4c}Ns{B!q_q%P|4vUG2y`ehagcS!YG{E#&p!=`6 zcFbe_`}Lo1zR%9>TeA=Z2qJp;9d|ZbFqyGXW(;IFKvzhKi+c2Yttj5(=1rTfUl7Z`j-2*%z*sFm<77+^X(^HdqAjRO9ncJuVR&|e-zc;Rjq3Eb& zY?n|_BXqqKI{lrJ(3Q5*4cI&o(2~gXx(EmyWfYn4zytTrc>UG>g}o+&1`YY(h3B8E zkeU)C_I5=1DgqM*e%c#C*-8)siXvAgVbLdFHy(8Hh5J{nEM7x^ij^vE_X24g8Npe;Q+I6ydiQz4T#ef>H4I<|q|`lAz?f4pAh7rk zhjY3O=f8PCxvd4XhCpy@yQwlaA}C*>vUqv=^fonX)cmuk-jA|n%Vjrg+~^3GF`W%Y z2q-|50#z4;dLQF|C_)NXsmX3S8Ws>LR~R~PFHgjfS*8qbx%s9!!-rpW>$q_fx~%!_ zH@f?-3Fp+TS*uX&jw)8HeB`mm9vhyTn!F!Acf7_WPn1m96*K*=7nE{0+pl}^yLiVh^eu6097bOK}e0V+_vX* zT6m%k02m{o1i-K$fVp0Y_$-aE-GrMM3dgwc-$lj_4j(>z+6grfiMIET|Fk#Ma=s(1TRz;T=XDVH4ovWMhm7pa>e&X|Sdse*TkN zp1zC)3=mwi*Su-G1R@|r7}Ed;EKo^W=4l;0Nb2*0tb8xRR1k1Levzm^cE$(_ZOls(-Y=pRvYbvj7 zbsvj`qN!=q<}1gKyW^ge6jiV@7C6Qc^Ziak_yxi~kYNDWJ@d@6ITfqHF&X?i!dDv_ zKuk!1AR6$(UXMDp>-@CMz!l@&1{nv#r$4eKK*Iifx88Dt<4 zkPIm*4f~7YhHC~=lE&9j=#$})X_*<)(U|=Fo zmoCZ@BOd(oYvC}!?}ei#Fg_E%hYNnwZ5F zq=Qu|RW4B0=Xu?FepIG>xt*bWFK>VMmAi~F2nn=kang!`1BcG`zt4sZ8*56>=RXnz zUiho4lZbiNVR7J>l&aQg*S6h)qImYl-}Au87oK^(*QgO!PCBVc<6kP2Ep;FzISMca zK~YO|uy&n3VZzp|>I^j*I*<~A3&dhv*?bwcpkCGV^mLqeUe~!rSDO=pXaJ|gaa^Acnjx`x@sb{3489`B>{osVAjlu?z_YMXCuW2qD4$s_ z`;1mCzpGraT(1rts6jH2u6YcwQJW})w)&dZ;JXI$n3`4DIFYvs z(&AzkDrtA< zkbI&gG?h}QesSm49e-~CP_0(I%`MOB{BEEnK9DkTDjCPnh%X4LW>wi#s#NI{ZUB&; zk&#!mYSnEN;&i~i)FCE^+3rkZpkvXQAK;~dyg&dA>eT<`L|czKb?UAap51|+WrloR zomAQQ-U+J*^Nid)4=+eR72U81-B7^&qt-b&kf>I@+VAIfD_H-}g8Y<9&)82!HcVmg z$Y;eEZ$ZBhCUQZ*!pM(>OVq1Tv-hml3x)~n zd{sLIF=wNED}3n9-xJz3YW%pC1UJzzM@x zc0QIS{3)MO!UKLgckXW6sWd-DzmsZ=f=SiqRFpE{Cr zG^w!HqH47o+t2IVd6x8{4DVe|R5!>_EkrulGBqt}^Lq;xvibAoXLRp&{;i-WAS1Q` z3_oA-3NhGcNcxr_#)mG`=)4ElwZ^(#sB4G6mSTuP)5Ui-K=d+JLX!rQ!$u~>E6*FGC`h%R%1=jk* zFzKbA{UkM*uK;~J^Q3ry*)_lhSRp9@&h7KWg2-_h2JYFrH`AJrc|%xKoEn}gKowms8FHO#`YcBFSv5#m5)3*b!z{fJ-WUrwFLxYnmHK+$F|la z?~Jr8afvg}I^&Zjjhn15==)x)dbN$D-$P;5T}(H+TB}Pc|AQn$n=?;O$Rb#^`j_Sr zn1D}na`@IaTJLB20>SJvrG}pZL;+HgOXSrpqD;BcnVC7=diHwf?)x6Re(9&nn|}N4 zPvw?=@JYRYO_*?fdTKO}YfAw0UI;^&(DkcneS{Q<@fc#7RqX#cJK@aD z%T4C`{5RGDN|huaIfv9BX#CIVXB~tbbiI1j`C>y`J-ECJ10gD~D69-HSyU0h@!hxI zp0R1urV2&!JY-}foxqT zV(H9XBnVOl+T$A`rKhjzRmvu1RU!2GMn(-KeX_8cbjDl1OCmsUbZFOZX`Olvw-wfP zZvJy~R!r&yDh<#IZ9OA|3i4zm5z(Qp#^Q!cmB~`2a+PHR2Miec4@8IAOCr))@K~{|DIN7w%=MhqvY>4+YSy(6Iw}(I4mtZaMkA_0cmL^ceZYI`sW3? zF6-B?skwRU*6IY%n<~2~C?cUVU+|Ub7y1^r6w;efM4Y z4;L>ztxvCurW?hB$-_$6L!Z-?>5CVW5_6#vF}7%i%#cuUXYv|IU+s#BmcgKy0~LZaS;dh zNiXdkexYb=f(+QF15N|RkVFDaPi?&%C-5gLtJ)^h)ccG$Gf;Cw6Su4Su?kFs!DQIs zL}2eX;#2|!3ghf!jdewEsf65Vw`E2j}KGr`@hv0fS z!FHcvzTckjwJjxBAph#vq5aZ=`0=CBXv`>aj3m}D;KK~PFo@}kd8C&GLUHWoM0T0m zD?&lBrjQ~vT&Ps3;+BHGb*Hs#y(}6rIRwa8+U*D9!pmm}H8gfuteKL+4Yj0HxiTfw z(~FfdtYyp7-!ES-Q+t&%L)1}#o(3s}rv@>G7uvW9V1%p3T=URNFTMQlFTPmbck9;e z6{k-9cdh;d`VFsGsp3jWfD~LQI<#$)Fkz=80aAgGN_C(jK-aBaSFI@4qF%#BKOF1K zi+?7ZZ>ftw$79F}NzKX2eJyzp)R z?{i=YAOw&XFN>|{hT%{b)xol*n=X2S0EJ&y5Mk=ca( z^wUo*4rCwBBoXrlRBm(;Vz=sNf%HMZ5@%G4sA**yb3C90e*sEW}GM$hy~S!wEo7D z1i*}SnzB|oc=%A}!X=A)6!yC8-nBE>y?ak+ze}ipkCBbwR1LxrxHPsP^e~kL0bYFJ z+2@PPSyrJ^Zr1#VFPDE^Vb)u-I=}hGo9BN0)i;&C`25R; zFTODS;>#`@@nmLZnIiyDyH@RWEQo-U%675_&>ks9k*}Dt$Q9DK=KugUZrRkJxV$5= zycj`yu*YYE34+b8f({4=RDBeH6tEmW{M0p0OmKAX-s9KWwQ6$|qt9Iv?!PWMIdTxk zu)wl|s`&lSBf1g@u~=Sm{P(U}y{618U22DYwi5E!!o9?=tA0KEw^ctEsQS6(X{P|- z9{Jr7y?nBlCAE6szwKM}+~Bs`Za*%3zpJmmm7N=-Fx$+=G|I%LA zOou(I!b<}N6o8=o*dc*fEC)$R$w!O(HI^@1Zbx!TL^EJSLSU%HfQ$fE8jCTLgrOS* zNzPu+wob}Zc+lWsFQ41-++_vv^Or4Kb|)j}(-`A12t9cZ*|%8sj}Gh9zl0RZz9An^ zOUnfF{+}6o_`{J{EaogS0F*9O>QK*a-3vSztahzh>w`!VxDF?Eg|7@T{?*UPZIR-i z1^({=@VNu_cUZvCu3h`Z#p$_CO)I%SNQycpW{9yb|3lHI{<}m<%F&uNYJ|@J{{08V zus^o|03ZNKL_t(1OMclc{yG?d#|JnfjG@bU=g;@Qa?qf`fBgFEZ|xp>Xkyc>tV-Woe@qj! zjd%dT1fluTYrBm=N`c&*+-PC0OUI6#7AK`7tqTD|K&VEDADZNMmaX{in}%Dr{Z)|# z6jBNq>9}eQjW)mm=sUJ;&Dyo=ucYF(=Py|}_oAgqgOFrx{>9NUUuNZOV^Q~H){(VM9Mo6V{YRfY|O-oDNZ2(bUNzJ^y&psQPDXqW( zM*=9BnwnkE_xzKki@NRJd$78&bw{|C7jd>ud9ggKSn>54@!x0PfkP!>LUYaF$U8d| zQ^cgJl>mSk(lau0Zoc`p>ro6pow{_L6^$|wlMs??A7I0nm*6plh%*Y*F9cd8WBj1Z z&|BIemyi-QYSvj@x^!ldDd_j_+f&{~)97HsP^ODib_h%et!P%ipC@AAQXr*76eUuU z5n;v-CZcR)j2%)S!2%8zD4ux4v(&SFv}e6YalMid0xMUpJf*PL<(HpV*4(gZ3j*zX zp1=ytXCRPoZ|7ZOe4fTfpL~4QoY`+RE-ue_nQ~=!=sAtGEH$=WCf7p|l^CQH=-d0E zN1l7;nRX=tzLl(jo3ES<6Nl}TR~MY+%4Y5!FzC`k#Y&iVBnTuBctNZH5JUp7Ab^ws zVulC`hJL+!KQLv=v{$bjG3swQJJhLNd%1dLSZEde9*Dyv&BS2{Qe`BtAjodh=B$qk zVc=ESTAFAjs`C6-f#t^5$tcvTW>wi#wOX~E=bqbnNvCr=eORMLjUD-Y-&(cnt_qB; zkR^dh#LYQu*nuHWsQ!x~Hzzl_xV#^cNMJWFm6z!PaY>Vejm046(yHA|4jOs6C=A*b zRxl(*l5lE^lb$PXXWnToPye}H+qNJ0!%penGUH1xO@HTIqhZpEW822nty}jSt`%a2 z^cat?+H;5)PfAWM&`J5*?<^$Aq$MA@e$U`<%wCtxjPhz6^XJk^mOQRMSILZYFw*W2 zKK2~44JVKku9yFBzxm-qhtdW2?OB``mx!Bk0m3rn1u02Xg9Z&(;spJyS-ZAH{^2#Q zHSw)668^vMd5Cj{%EU56gZ$MYgAR$jKDg?k7D@KxWnO#{mA(z?pnzE6U4XE-$Y*<@-5x>a@0>{OrG; z$RCos-Xr9C(Z5)%?mj2JQU zXm8*9^Pj(KQ+@r;vETXbcP6K%2KS4UTWykIux$||D^=H=aez5t5XtK)u42R|EEjs8{d!0!VaBj;|GrWW_}_Gb_Hc)a+*6|ME_z!Z6j(wz zKsk|l89>-^Fn;{FW!c%;;drd^4j(>L6r=nDVr+5&$q-eU5}u3`L9TEd5eVw16vKxN z+dPoxm6RMjY1$Twk|(-XiC)*FtqV9lcjssBU$c5`+5-&YqEx&GghXz+`IcL6x$TZ6XY*M_1w*!T$(%R)3COk2)(W~_)?4`_UUumvuTGnG z;mY%UT@LL(P)c-0iwS5l`MA6Hkh2~PtExCHJKF4=oWqHJTM#>pY#nf>71f?|m%l8_ z>QfRxUmSrzK-)O;7!X!EfoMe&b?qLNn$TG1RJH>MM<^|XTW`7T=kd7jRhO6U6i66bv zU=bidIj*_!=0}DU6g6THA4NsQd#Jibry~R+=v7ALS_K&Z3$@r_x)#YPLFV`SyOohZ zbgHAvB4n{rE8B;%@``owevX;hIfsM6mG%IDGiJRjBqgGWx)~+{>!apfUZ+UMpi>GHPjI^ zA~9sUv2BVAT8jJ>_e*cP?URd`Wr13N?Xz4vEudHB9aNAk zCGZCV{SJ^_J#YTAHl_Q#D3G@XhzWQFKna>BPMZ7<09++x8k>lofJq;9Jp@p-oiQmQ+$4*Lfk8qb z(0M-Z`I0wZp1N-HmXU-)2YMQfkk{)={;c5$Lt-Go^K*r}I}^FX%M|DV!c^+LzNQ>f z{i*67m60X?oe~Q(XI}Io;`G?JZ(kYb-rC5_jZol#!a^d4ggdS8@6RY z>+|H4W}jtiWt!OQysS+}CR!6C*NB24$)C`^Xwl7o95Q4`^Jnk;!fzjW z-=F;Z#XtVx5B}{t_uX^%x4!kw`|i2t?)&b)|NnjQ@kjqU`$ylu@7n<%={BwP)cdFU z9ao4VtTR@xUOl0urKMkqPgxn6ZOH+@2JV&rJ!7sa#(fS{pfQu{zf2tAv9*)Qjs>-_ zW9P1m2I}7L*tWG`;WhK#{qnc(`|UTs_x)cUZ){1k;AmQ&s0j%~bb%!LF#^sUSQf?O zk3G8RS3mpl7rHt-lPp3-)}I3ZiK>spAc1pgWIl;uZ1wQr{XYCU*4UWKT>X*J$H-hG z0EBWRCHS%U#aGh)`!^5$H9x=btoEUr>fxKHw0J7 zgJq;dz@;kOA~7NNZtW}1jY8Y12oi-^N2zsyaCCQfV%M%6@k#7796mr0g$H`i+uRdX z&%_82=DiO9QiCbYlyEt8BB%IxL82%s&fnS}r(0E32{FHwpr#@_6G?(`7%ao0flBft zCqRTd;FO}cq_|Iiru4K_!+zHw77}GwFP~kRPeR z)Fz8iL=chBj2G1L_(>Z<9@1sc2v2i?U?xMld^Tl+?Rq36By^dsz8Hq&dC!;pFGrXEM!Wu^t+Z@z)%GaFph|WDu+2X zfb$ZHIc3U}lYQ!{{8!lnVw*Z>+LWW-q^72C zx2*UY-gS3%CUN%VD?>jW!tHz0~h1_>rT_1{t*Dn0!lDGf0Lswy85d-k}`yagj zOyjYm$v^z}?;T&ad8;uDi3QXJnMOQ=on4)Y{e5jd@rm1>88Lj=w+|jVRLoWHW~iNd zR|*2b)KK%q7hk4*%rCiQ=4&6WeIJV#zXBc!Yp~p921fZSbAoVp7XXg-o^GV3rkS{&kj5wxMyz#;Xs6Q*p%zFPA!>epO_+|L4yh_~(kX8zu<#hfcXw1UPrUQ-f4W!3l%kZ}*A)pJiJS zLb&Kg;i~Pp_~XmxUu7Z? zLeSCPj%T0$=S={9d%o`Zi_brEO=D|kuCU!Qgk0QmhjiNdLE3*<7J7Odj}2K*cXxsc zbr&F)$dG`{G|(Z@22;=+`Vatq*y!kJPeGg>;fQ1Fdnf&{w4d`wJSQYd4B_r25?{p`|;ktA~43jVUQ948U9RcW=kb3vak~ z@+&XDI!{VQKq*CpiR=WM2u3A?%fM`JYs=faZ|_h5+xzRf1QHS)%eKYOK?S2#G5bx> zORSY#H#W*L$D&41x?)fh3(Ee4fy1IeC@pQzK;8Sqq~!KcPHw}Y*1aLywm~8hxegQ8 zjx0L~#l4=f49NDV?oJZh*BGKo^q{&my$%1XhMVD<2CMBb_y~CyCQYyQ7 zZUpVR>#NGoAsm3^Yb`Dr+AnxgAThB$5{c*6IBl=$bLj>BYRf^amGMFP&cx6)suK4F7|-bwDd3`@Pi2qkP=}Dr=)W(IZ6&o znMixm^|6?x>BwxQ5Q~Hzw6?bR&R1`Lj@U*cRd&`q*1|d(BlP|^Nfh__dV2fb6_r)n zz#|}p!ZGU&&b=0qoMTwkun*sQ4yXbIkr`I*pGldNMJYy)u3I&j!Ru+$rY&Vo zY#^pt^h7fvJ+>GI_1|O*M=uW0(s&A=1teGuJe1&}tE~Twtjwc+6F^(}8jC)Tu$8mG`e7+tEZe&kz4M3Sg z8?L=RToqR+HFWg)>uxx$y>80nDJzB7yYNRQQsttpUW~nhQZiuIC@&{>|EU0--V0v= z+EPkTS2y~M?42$ce?ix**>f5#A}m*W^CwsDgkqM10~JGu4hUfIz)$|;ZeroUsj8z` zVZ|R$SDx zj>C1<6PKapipMu@bluwD|L)=2fBxXlzjpWC_ul`lZ+-hG3m0DhkMZNiuTM|+dYT6U z{%#8N8YoZ994I2avYAi==I0OD*B9s39S-}|`sGeF#X80!4!Gm!;TvZhjuXKrK6(3Z zlatSWy&h3J`on^P++Exf0|qJqCS{9f4iy>ah$!Z`ekM2~;qw~^y?))gao~P1PT(-< zK4f^`8f-BAHMWm}THZCfr>EQRM8W`Zt1vFU@2tx&e=1(nJ5t)FLAKT%s4Uua+mQT?y0cI8~=DS+a_nKS=5Q1`x|u;}Ff{N{HHLjlI9 z6VV>;Zr$%HL*4umf-o#N4#U*(br?Bf1bVowzs~DZ?Lq=-(8)PaSzfaKcMm_ZC^v6N zdw-wvu04ClaOw@1XN-HuI#l*(=M3DHRXS;@$!i<~GojM%ma$k%V7GGOh!CK-xOmS6 z=kuPQXg--vEe=XWa3KfjC9lX;fD7Mx>(~`n%=Uzx+qN%4iLh95 zSVY)`7=CWOVQG5LkwlXjJE!0q+h`ZX*!Jw2l*IWZ~b-p1eovcDaYmx~|&@cT$k7T}S12aK9Yeyy^IA`%$P z&CWhHkoSJv_=y`n{i)CV!t7DhS|qHj-1N@k|-s|H{rq)wkhD4-OpIPZ5X5oO##0 zJgmHAHzfG2_CAxWXsUKiTRhGMS-QKkE7;rj9yMlsxL`;Q974gAgNRf~C}$M`6>_w+ zc3krHuYBoi{c+A&8JVI=r81|KiJ=YE_RZ9@{%a*C0L!Ad@4oN%sf_&_-}ol+QyYXq zurxe9IfdhhEC3h;qtkwv($dpT*fs&PB-6}br}XA=rCwNzQjDw_u^NN)=m|%B7MKoJ zIF*dkEqa6&nrJ0}%l=n3S;MM^ZO+KZ=)@pC3JZ((*tTE3)J(tV>Lu5H;Kqy3j0J#j z^g1DwS4y+ml^hAFmw(Bt@Z^!{9`-4#o6XU#<|2Zq+9`5_30qtqO|49~o# zy2`(e#aKe2m*+%V=bXpmx<$AAg;FA|3LqrC=KYck2K7vX5aU0a5@#-a^cVwk90C4I z4@?5(6)OEyOEAf&FBV@=|ET^ zCsxyU7%V#Ven-Ob7v4<>b!AF9^`Ob=qBT^xyDk$Zb?H!J*>r3HqG<@On zcl}R1y*pti>?5+FXWRh(<+`r)GOB)3Ub?-KN>n}NIPepKgoK2CuOVM}{<&)$#u0HC z3>POvZ2_X;0Yzs7f%cBmv!e=yQk&76jU*7W7HF{%Cunc)NbQSryWoO}%Tt2E21=mi z(nL1voC2H>6#)!NfaIhkR1K>>=Yj3?sng!(-0k|gd|s#})zU|H0w&@grYq1X|Bo|2f@URO8TV@r`73^n@`{Ckw0l0~h5 zoquJJqaDsMea7^c3B&0RR;QXokQ>uYZF0AbKcDs8|z-umLk={1zQ}OV9CR z$F5Ln4MM5*yEo6z1w8~yGchrtbJncc&z{Za?ccYzw5zKdj4@c0!X}pP8@X1SN|C8# zhMsI`P3_NX^6KIjr|&v=NYJqu?-e6Z_u63$bLY;%qD8mBXWK?Vx)F*ii=KGm001BW zNkltTU3B4FSIxh6K;HFL@2wop9VdZ+X+^8HEH!I>#&Ol$tMBa_JSBfS2=!!& znO57q4O=;ch1AW9Zh54?u1$M;d$MKQ8pELy(9}wFvG@s)lc1ZPft_hh_3*XP>%OQX zq^G%o!RY}B7oodDhYsBmFMGgEH{E*O=rOepBNRjp&dokSk@Y0mL+yv2`>f4Wh_Df2 zKv!D_UVQfH|BTnY@0tY*p5R;%Kh&^>QgTYAw25CaFdS<-Ubbc9x|sg=$M=5aqCI=| z!6CM&oE4@(1gY926f;7xl`+$ zdOZf|kr)VcFeWx{SH>g5=eXfb3g}Qe<fblsBXG3=0a)~uqlR*9KPn??)}j>@G&~3PoMq$g>(OE}#?9EF8N`>4r(_khRh`EX=CX3JucBNPgq7%b;Fb=u6uIk~wf z0BTsjm;tw{!1IFsy*?B0dg^I5&Uv;+zx1*zUaYMudlyW2yjsMHVL}sXs(}RXE${)= z;3&B>H;P>&9M?10Vg?vO0Ak_upa1;*{dLcFZ{JpP;zV;6H@ryPaANNuKm`Mv|J@u8 zi-1YT17xXpnKO?3Awv$t<8y1-7KkNe$yOBWPoJ*>YT*`u~sTqD+ z^=^7b=FtSduQMu7)&*DfKIsh}FUZf|*%#+mSWwhB>4Nd^sjzkqrh^!jrIC@xi(qo% zzP=blju|t4Wq?vJ>G|zhH;Ah?6P9}}xXLL(Nm23c^L^jzYDcYx129f?2r*TJ6)K)% ziwJeN*as+1wzUOUu2^1YexHo2oSv~`#;jHlh^keH_DL41NJ67LEajGbwcr z2S@G5k!yz!A9+>|0QL17M@Kl|^95j2TUr7#4YVug1-4Z>s(bKzDfH2LOJb9ai=wnvlgA zEH$_^Yh3^lt!!uD$}2|aeVKOACP~miQlkIJ13&rcmj~)RH*eWE(IEt!5m8@o0`5TD z(WtZ&%L2xZy`WFn_mxA->IpY$>4*b3O!xJQ9H_1{QxlNT7m3!i456H^OZol`Q z`);)f0Wly})7~h0IBf3mQO$(R2oU>ic1~_w)wkv`V$|4Gen0J0`5$H|^r`Yeg=H84 zC`Ct4WYWqN%VV4?cI??#+U?k&oWRo7x~H(ols)?P?c1u(_xZMUb_iu}#L?%W)Cq`E ztC+nk0}u@L{Q%(gSKsvHhzeUNIhZz-Rs?4;01%s!4HyAbZn`j{3N~oqX7s30D?*`A zc(4MrW#ttc#5>6}yU_)Kq8?_(Ju*(y?@p1`C?OazV&s~^4qVp^AGxEpcK8NQK^w&i zjghVa@cI2nN=cS1QTOke|5OE&_%nheN|E9NW?i-5$xv!~&&O#1keio(n7Y|HhR0wO z!x+j+L>2&MyPyNOWg|rhT3cJI9LKQ-)3wOU%RgXSrvE8C3n$T@i|(+5aNzOB{yJ!e zLcw4toR%6qsWx^Jg#>%IH8bGT9iDkM7By}6cxsaK+AL;e<@DTf$DI!)+QP%u9gY&u z^BWxoxF9(+@WB{EggH=QD#}_XBQw3_)|+nWH~XKo%*;lAAkeNt zfJxLd*;@#@W=I*n-dy_QY6cWyi=vW}p*!R4nYAp71rid$nY6Xx-gR3sbSRV(oPZGq zU%c3lVzU2oT1Qz8W78SpZ5Htb;YFQ{PEgewL&)kfRqrDBXPjw_GC7rl& z(Jf2PYF*4P;A84WK5N#{s(Em@S0M#O~4}V zK4tk6JBR|4fT;W%ZU%_B15^%h?ldgA{`$w_Zcoe2-!BSnnFS%)O2iD!1+;t^pfPGm zuGyt>&EO1;Ehn&P`t|~u;HMDx=bf7Gp;CuLmUuLa8O*kV8P?L zxw);U^Zkd9sNG(iKjeT2zf?>mXvuPKijl0mJWQE9`K7)($4f7{bTNp^n-N)FTxQXD z+0G6Y-FWjOeUWW8th#1XLcrgo6fTUL;DC335qpWt6g}B|GW~qt_eD2<@(-3xn;3uy zQ;Igj+LUvxTv0D|ILtDaE?;_a%=fx+(O)c0X5n7Oqul(N!`wc~5)wm)0C#@&&R;E@ zf9*4f)1!XN#;QO6?Ju9B#I?m!8y6?;{nK?lbx9A}3Wd6gPq#wgpaZM`Sn=+%X@7d+ zsrfdglF~+W=%*kw2!aP7z$zx6*^=U+XKnxMlhrVbIDjG@%4=eAC9dbNxk}X{cxUO` z7xmXQNlHrQlO{}DuAWyl%;hk$pY%IIP+DAgV&a5JwCUu@RK_^GbU690gBpO1+#fiH z6NwCXFPD^@(n_eMUss|@jxHI^185TCZ$=M|KLThf8IpCZX86c`19hHFCr{?GsCwQE z;Fahed_JpdWL;gK5K$&gzi6%BR(|l*1xJZ%g~<%|xb6YL@xse5&*`sgL*;(NDG~D= zV}L`b%E=VNfP#X8GrET*C8gVwk`e{!gBmvO#0bNUdd@fpZo28F-^ANqkeQKQAFyrF z5lK5xZ6QnDeUodemR=k&wBiqNz>t`djEPgGJ{hn3-{rIBy`Gzwdq^l7sHZ13ok4n4 zc7q@s=4d|I6pH@7)wQ*2A+4{qDvkq|B%`@jtGZmou$mF)RT1*7uinMO3i!8N;wB^9 z<@qQV1jF`7t%x<%m3{s*?bv?+kQu#H+SYS0aPD}9vxEbwndxUX0LaY9I2H)_B-kVU znWLWaObesSqe4B{h{ns%Jp2HSy~@=e45*DNZy$^(EwOo^&0E4Scd zaLl@5_VW&pWw&^*hbY`^n<8KXH{Wm_UVZsxl$I33iIPkz0MJt3gK$_DMbILs9X?{! z!cTnmzwj|Ta&z+zQ5gyqeJ!HBLlFfH_bRQDO;sS^+eZi;RKeR9Oq{el6iRI%1cF{c zEX|5h*Mx%toPcs7*(C&TzWL^;ty{MY8!YEpT3ozSM#dW*0t|MnfKsDNWv10d?lYl- zCDk`!6oj1rfYe!Yul`47TJl~Z3qkGuN@>)yt2iNITO@>|v~+0m-FM&fz_7}ygS|c1 z0M}MJf*D9P;Fp=6fv_&2 zC@_gRD+$DL{?IVHupWaji2RdAEX*1&N9#$hRDm&SkyMh+kT_pzhLolzKT zdPe365Wr!*`RR&hKPe??Z)tJSfQ7vN@wdOc_m!7lz0#!loyrQK(#*Q63paHnUhmYJyC=TdQXz~%)hyxMF1vm0?bB_dk zwl18_ELNEeAwUP&2q+>-YADov`={=RyXGjEo_>r{fN)3ND;1C_n+6?j&1B;&ndWk! z)|(v=B^(44kN)j1cl77Ebar$mJC18*sTxD&LKysW&>z@pmP(H~HYcE-NL-ddGX3cugqC)PXF!$T9`Ot!dWwYO;O8;!!tyKVJ0YdPZ+wZtOB_+t2Y z0CsON{n@0cZ>FXOk8{Q}SxqY*)GzL4c6j~$g&i`XkdvEU?zg;t&8;n=fjrNqrlvw} zSQbWy(nAj9%SwutjUGF`Pin2P6DD`$=Vq;evA-zL-}~8sM}`KD?5ymg{kFzgR#>Z> zB~xEn+;AouQHu(T*NoJ(Gg9WKrez$<&PY9`vt$gwR4LDt)u`dGg6-S3*2UXi;Pd-? z974b%5pV`DLcnC*E>?L43MLrjO4-Ea@Y`V?n-*{m3qWgg3;z1&NB$Yld*Gr)H$CDo zw@3D@-Mzd^YP}S8QWg#$IyfZyd(NM~aD9GG+Vf(#tS|;+&6GA#91L(GC@RSRzb}62 z8|O72D?4Y1@cXC4?Qw{gw98}$M6`;XaE|QM%s&5_s;Vmh=D=YN9L^Lc2au{IrMDuW z7*;*}%mx5|`osU+)7adm!v)Od)@;-~RgVRXuB&^0FaxyVo}NID;dknGKim_9b*e($ zWp{}GpO~D;h7K*;_Hh8OE31cZ@cDfo34jnnK`BA956BBr-1f;&1V@b;J0{?>+7LBB zaf48qWK$3XEFj5_pt5Gz*0l7@PJGOcA$j=+)U(tZ(EkzTv4=^Cs6x4VSoP*mC^V>o zk_(GUj%B8&HE|-WeT0`B)!yO~`2pb++;KE%th>7h+w1Eu7%bh zC7C);)4It65Xo}^HEhqgdu@n`e!`XXQbLfKk=_`O&um&++6f&TWXM!c<>gL^jpCx> zGtU00sTtAW_gNa?Hir#VUe}Q$YyX*>lfwt5Lcs3{J?{l3(ZAGN#2KTBFhXHe;?+M%(`OM^Awi$ zf7dd4(>{h7OnXj19D>zr*Nty!Isbs?ga7&KyWe~7!B#{lUbJjt-%)kb9+B>%g!MRKxR;BSvoh#m|0zTTS)w zeTd^j5N`sy4iGsGmSE#Cw_ebSz$lwQ#hle&PXvj;q86$uD+e_AI5|0~EfBDDt;raJ z<1kO3ro7d{jUHeY|;4Ue4l^@N)(6qA2tfW}c@Q_^48i1U;AE@(8Nl7`5D6n0hAA~~7;SAFzPyK6Oer`oY<=dP` z)z@-;ppxkvohvnN{P^Yf|M-Eg_8YM6^LMLSPPq|KB0TIB;K>O`1PoQxXJ&PsoSeeu z&YAlJmxExXp7y9f4f7Y(UoL+6rFpw|?<$I?yq$c%g683KaG9{=0Cc-{j)_n9yLY;^4iI1Y(%u{f2zHKaNo z#KD&OZ85`~n&Gw1?8`6zBa4I)mKK>@VJ4gjNLnf;dN{|;x88K#iNfFf_IHRy2^f>s z_mZ-so=#@Gx6xt95jZHX?0dfI>#x2|g2_qZ`B8f&BXR%$?Op&v5tJDOr!@e0{I7q! z{lQ;9`~@mKj-wlYJuB7TOahz?rG+qm?)*OwW`K78zCAS#gGXlKI<@rf&+YNDHUI(+ zVAd70pDHOSJ^XP1ucu6!vNR(-;}DOUQhTj2I4nw#NICK|GB9S`6ZDAerp(HH=&Hw8%y2+|AqrU+z#Ktk7GydF7Ona4Qe zB7DynENY)f^ezM3xoc@0Px<*m6!HrqoaKE z_03i919Q;b*@>R+?m&OuufP7^LwBzFaP@d_!E{$%%qHt!sQ^R}qRx=i`8d&5XuZAD zj4_0J;xoK^&6+hch*6N69lGmiq-?r`mw8Ri@H6(S%r7YH&PYksa!)E$5gI7voMY;= zX#>WBX*_-`<>29lJe}DB;vIY$Y)>tRwt#VC$DEVx-{{d}cH5R}4!mBdR9*L{h`Q=bG ze(9=sdvA(MO1IfQzbL|qVUxyn&mt_r%m5z{&Dt@r76rnC$@QOs(8CRf^ZO6rgtl=Y z)HJW)-ZhN?0K<*f-SFq+N6EuMS0~mx2|&x_Ivce%w^hBLebsblXv>0k#jq$s;Up) zxbWI1uD*N*uDyCL7RRTrc~u3qw6KbEfO3MuA^E#M`H9=ksE<6+c-(ig=|sP(={non zLg;Q4Aei)Q7HhR2ub9BUwm5>BmBIwL!G!{jafWat44>u4m9wsTdLY-a+??D)>B&iA zfay3;N+7STk@(FR0ho>PwRP`jW}ZE1i*d?&BTMu~I8fO*PB?=8cpqAtPtwO8fAqC5 zu|WxkMJyfGO^9g#Bo_LVP%^5jhBXR+IVob>w!2pH-Z2Ex1Bm^eP%AFf+=O$=v;{49 zb7>5fHl%Hd<(fju=U({ggBw2C0OXD?{JlZY%?Rxtz|iBwgyfTA?G+4dXmzvNzbPmu zc;SWTfAH2TFZ5ZjHMFp3gEG_v;oh7LNrrP*N^Qb~?ChM@{<=0vNlEP-B9s=AxWr^e zo11^ekeii-%V%Br_cQ(e<>eJye3s==R>%0_>uVy`)b@@J?A^B~?i>Ivx%i_0y#1!x zxN*TO%%3$A*UY{I^RAqYYpb^~8xRAP9#|fq*}N!lLqed<>7FW#!wFlaiV^BOYJBnEV9p2B$H_sOH}3u~y=6 z0*1k5|D!?WtgNG;%4fVc7Ni$2RRP@*=J*E7IaXBI=VWxI3XHHr5Y4RO2HRL! zu|WS_Ba(?ToM=4WF9U!VUV45WxT6Cg)sVsq=tG9wSs0R+8=gID_7ebb^yrbKW5*kF zz+5$h2>PWSKVd?tX5A3Z0mngSS65Ph-mm>fj^%`5>GM%x%L@3lEXy+(C(_5$WCC~t zVPkdz?`UJ@+jgsB3Yu=|px{cUb1F5HDsM-OI~A@cVpSqehKBC$HFX7fkNR z&B|PF#DKcB7jc>7*;(0fVY!%{ozr8f_XI>UsiUtA=fKIv$h$h-qPMCJoA;0 zwq)ON;$~;)@{5agGr~Fc?b}}*e>GC}A)h7JFPI*tQs&JF2qW4#I>H?z*x0nZ(Wci1 zz{v6b>i4Gh-vEHiVTFr?tHGZkkp%}}QG&YKx-(V)6_=Lov~0_Rw40KDBZnP~bM$oe z;KYf>+`c@|yxbv&Y|G7VF3oKKF`dY54!eLMWnEJ$IAL(!hOP4L3U0+{+MuV=5%&c%)dPcw2z_w*En@ame zDZjU5z7Zra77dChi=PN1NJ>aVW?CvT)6$Tgm5I!pJd~7`p>uWtvA%)&DB1j*v6E4dTlSULaHqKVIH=8$?M}^ zcqPXa{OgVdOyXbQpr=ER3J zWOq-*XZB*IAWJcFb=Std89pv=gvY4Yh02S9ISdQ0p7ZqNX*1Ri)Hw>Jn|xmhGu&p} zEJrY4UsK!An{T~k=h8P{OY4izEh;YA&LR3)HE@8=my{N&)WruVA=p~Kz2@Y}ll?X< zNlZ-aU~pASD)+*19B{^=@=rp6M5Kj6C(n5QFB!UBWdLi%ltCs{YH9V`aU2;YAAfj< z-{9z;|Cm1_++)8|mj;hM??NI((=$*0d zI1a)L=-qn^d15jh$Tj#59jKxhww_5U@f2gkn7;1ayJy(oIZF-(M=ZaR6{Bt; zC6=@}0=Ofk{-7Y7LjNMv1)GgQ5O)CPFdRIvuV3Vl34VW%(BBz~Clzi?h$pm=bB+rx zxL`?9QBe~B?A^C#*wMzuB-OO>UOnICkVi3QK@i~#9i1J?{du=iQ`4I)0uXA$;g0mb z6k)WMWqA|;nw`nS{WCp{HS;;DLFGgg_klp5J#-dD^Z7mw?%!Y4*3quR{>=MAAXu7a zI4kEI!IVVQ){Z(OZ_>>h*ZaTwgYUhfVzErWWU;OR*IYC2X9IaHx;i^kBHDtb&u87jX7t(@bP2EJ<1#hOb!5D4^6=mqLjjk#Lpl!F)^t_$W9#)I5G8s z+UpumxC4N2Bx0+eaLzfXX2~Mf^3Dv01;K`m8%M<3yAw)HYfMP?i|7wSy6&Eeo8#j5 zTMuTYhVBFS|0pjp3qNYZM)#t-TFPmM&S)*XQc7?$nLAMzz2g!#|#VZsFxK zCcoF(2Npb4!)i9<=Va~yp5pUMHarxw&|Kpl)|_1817e$9JRJ6n!{v^F3W-AIYF zA}QR2&ZGNrY}ala*uDeDjvhl!UctfGwX-`AcA!BmVp`=Cw`)F@; zZTUzXOuz8LH_olTv?JQ|jF@X@?*v2!z_xq`2tEI(!@m9d>xd;nC_TMw47N=`iG}MI z-f+JQ91&QAdVv|Uyrw>=>-ImrBhKzCP519orUif8}+5B&b&NATn`ui*W)+YnJC z2PTvpmTVok?1$mO62-5>4acy(eoNev9apY;e-d*99%x$LQL2c20I0MwRqF&g^^*ga?^;+!NxDlzm2iZQLxFELf zI3LG7cYlS4BVqLv!lG0t&>W#06@)-n9WE5w0+=5)dTgKnJi{x8^7{Ji0xKahklQ4W zD4Yl!gcEGpyy;&L09LR5VAO|e*G>S3p6n{1pHereTZDfQ8PNv)VHKt2o6l4N9B;?+ zcbCtG3~0kgc>b#w)wD;5o^huJQ&3e=^|7+D$;!xR6jC{NbN7PO1Rxd|C18}|wma^6 z7XU1qIvVWe%zGVmzeivZ0%DOS%hxx7Yw>u5ySn|<^tA+$O_3{yR?NXusark8Fz48_ zYe&^!ycVNt>()>ZFi;7MGElYQOY~H+kJQl3vMju^_~k2GnwtlO3gD%eU%ZaX09c{| zp!Mw+{`Z1ZqyS{^kVkE(%5KH{cR~nS+S*h4<2*il=jZ>M64Gccbc7PXrn+Ep8I%MY zHf|bs;K2TL04OOgt%h{zo@>YK&g666UB0BI;pmBSwb@2nL!|{nxbfQS-y6tlv1j+rn$E5+&1N@k5S68cY1_fL zgSy%gZ=dVu?%lo1+P8P_coB~50wILE;o*z{0iQ2!a&o@-#V`GuLJaX;Su>)ZA7KB1 zgGDP=EUyEAmgbY`!a{-xAXIsT5&;UDA%iefB8)R^-?^hQ-rk+AuFe$7i5_Hl04rn2 z4-Vwy=4{`;|H%CcTwz>V0Z^~DM18%(9BkXWy=K>r?fn9dc6PP}O+_A4nI_t_742A-W6M{%2f_L6sHm5JoGvM?0aG6EL zr4EA$aQ%9`_S)-s;;Ep?ahjzVvtTK1+m0?uF4@MLB*Wx?2~Dsw7AU10e}Ms_GjIG`>l)LTDD>mrAqba z<{Ov*o(lZc0}#T&A_SSC6jT+ZA;ae&%MT8Cy&VeT-# zH=7+Q76kwVX=y1<h&A-4hSbdPZi}5mTY- z?qkxIn?&Itr+8MhqXJP1FADC2@r|#3`N47HCJboa#nHn@i&f2GW__vNT)odWVHiHF z{EaKFoO`@4KDXh(-U^4g>Iw5=xmgR!4oF<+_SRNB^N+_q)nC`f=ktYaZsZZj_nj#F zAK?fE$EMhS;LsTp(aI~T_EeOWZs(j!&|hAELSRu#T5)@ExJxg(WZBp;W7ovv-r!G3 zZe6pc9)ExFEiBu-6NfuE+KCU`7l3X1K&h9kNr@OLM&m)0h)klkj!yjGd*3;VI6c1l zwQu|w6x~FE;;t=}P|Dl3EeC0a!6lW(&W>0NxkKPYA|7noA(V6m($JZhjz}N~ZYRMP z2!aJt(9qt4WgE8PP)qlbZ+!d5{gOHR>Z`99{XLQ4&EgyhwV(sPjCx%RJAf0%`>vGv z+-E<<=Up|ESB;!O5(b?I9uI_F`oQQS}VcY@(kdP8YOH(WPmji%5|Lsp- z=<4pG=7MfnW&*Qhds44Nhd{917hJpWk--eizO(GDOINSkl&b?3hza2IX5>Il3C?nG zR99B4wtaR4AEP5PBcqXdat>lc5h(>M!cbm5R8Qxa<5(uRqpqI`WLp3zi(t&;8E*tb zsUNHBW*!F{j^xV+ML#Ph(;XgPv5)><>iuhN>qzR4aJarcQi7??M1uX&AKFtOyUcR$ zgtI3cMt?AW`r>dHqpG;!2IGTL;~j#_7ytl4|Gv{8mkAi@uR=^Q-qF#~FBUmh&YAmm zL1E#3E}09IQV`1$(m46kIgSH|i;48%hNJ17ot;Slkdu?!apmk;kDCpF>#I+VKQR{) zj@v)^$zS$+5$CfbYMSpd;9cM``u#J(J#&5Y><6A;N3jjxxbV8a#oM#`o%_E2*h3FL ze20>$Ta@<7#&g#y6>7}3?ccxmjC4pV-d%Ai0|zCRu>#6Hmr}H~w&Dlhx$kQOc|F!| z*)$$pFd%z-C!;0&0I+RG{p54`%zyvhJy(tyJtDGd-NuCsB&I1fKX=dWZ8PKL*;%yc z=0}6U;8t+kQyWFU58*IRedCQcW&yyq?dITGs!AyZi&n#N7<;A2N;!P=P=36=UAicoI%~6bh9R$hbaDp+kHn-vX-?{t0 z`(^E0x3+Bcrft=0>ks0Y*H+<`ch+M4-bNhk_MtT)i0SMWrUN`TTzFGco`Oi9H|XrOp_`^cfdE8VZGYJUr_& zFS_Ii zx;BA+ar9 z_l7O?`>t8CwjPaL9Nd=#$F^lKyu4m;U^S$|| zPyGGnMK}MEKn(Rwr81GzaVqx-wNHxLQ8*$9l|RRU1N$<~?`u=i!6hkoPuwD!)>8I^5r~s?C20~ z`nD36#iUb>J(5PZv9T#det!Pm!3@laRVEek;o~|T8U{eC0 zMNvC?!U}whk6ClBdYTYXL`e&OxT3EpZ&aPN_0eEAb0TGf@ml!&c0}1pDIe%)#)&;(o_yM1d%E~G|1S}~o+2#gYd2OAv%vKh>gaBj5jNUkZ{(|TGeE{J1 zcM~b`GgS#n`E)9PKlc4SL5lT+M4U2C6eSGbIE2sYckw4#fys1Sq+f~jFrBwUY zs)0C%45S56R8+j8sHo(O)PGA>uDBCCf^Z}vpBwJ_U<;;{+!xX1ns*I1oJjkEa&`z?7*|mWiU-5-cH$=ysTS#zF!I=7b2=A?K*6 zu8Ax4OlxZ^{r(TW|4@XxY6hZya3i;YQUXpX@^Z44EP3nojO4_mjoN#dNxPk1fHwjH z$|xTF`%|~9Tf6$azY_&T#d|CrWXe3Xn>QmXg1S+)XYJukDP;tt7sZHdAeHri#OT}G zJFs)-&OWh!YHx3&TX*cN5O$`n3XMZ2HtQT0!X0ehx^=`4zxVC`cl5}SbFMuaPBdj` z#7FPz-q08#8G`P6#PH$T4=4A>^So)}`qAM?I2--|daPvdghcof6X3ILSd7DV086Sh zpMT+{s}CPK=mD)~T{-XR+F`?%MF-;Q+C|IMrM(bZbZo|uKw&B(Fd+`4DL-_E+ zRZ|Dz+}?lxz471s;SYb}zz4#4jFQn~MaQ_V|MG_99Xi*~E-WtDSz1!8KQ9uAL(D!j`buCgDPcs`h`XfyYEm;?#c>rheSK@L)GzV)_0 z6ciQ>Xv*oT_uff9+0-i1WkGwJHciQ{D= zTa1G_3iwy*cc%V8W}*qZ9Rh;x?w)?j4GRPUos38oj>Gh(uX^xEID&9T1nuqJIC$(> z@=MP?dHb1u#+<9>K4HoJLifW_wwH=oP6)+IFTFT>)20nI@w6u#K726!iAVqR(^r?R zPl*JQVEO&9IN+lcKDlltCIv9OrdkBxaxo60R1hBB96)G*SrI@xI@_^l@9yj3bwB*n zZJ&C`XS<{wy{74W6zHrL(;`f*nG#I*G|5g^M~aXLD11cbt$=~^2y9AFJ95NJ{dJDv zo^B7uA@TqebV&^RF6f{XwXO%#Qv2j*SiWo}S-9|e96r{Dr~mOh)-8P6>rF>?|H-%!b8JDf~7;N>Z=|01h48PZJXZodAa;hXIr*UqC8s#X&$RhmSH853TrE z1^}yL;)Kb|?SNmrJ%+kQ8%i3i3DJ1Q#7)K)pBCLS7_Y_f5w&YncnUZdECVBDol7Pa z<4iJxEKm@|$hHQ2SNbGWH=0eVmf{%gWXF zObMAXYyGO{NzV73iGq7Mvbn+kb+z!CZ_Bh=78C z6XBuBrA-VmtR^xuvvJA+{nxcSXE}I_p?hpwAGTG>Nw6^^8!iz3F zQJ9}Mn=zMp-rK<61c^F2+k?xOzkS*HKA-&j!oBHfsUEV2S{Jkp9R)&ZK~z;$pS5Rs zC^fao7x2dnJJepn1^OY@VL$+^)anzfQN|bzI}slwF!VF)t^T|GVM4u=sT zmVfaZuig6}5B~6h)$3ND(-7ji>u&gqMG-YrmgnnkE-~FjOIvg5;lqd0&-eYmaOOp? z{rr~?Ex7Q~EB|Csac!KigGg65BH=K?%t4qjINZS%mtOShko`u|M$DMWBZQ!(VabESP+4zYVgM-!A;fZBI7`U z9@N6Umrr-7XI~z{4 zbwINIV#A1|?0k+lHhSL8*I#{Q%*oa^X>BPhXBJHg5f71NS@`|K|NFZSKUftP>7S!( z$F9uF455cOa5ypQdkIQQ@{ZrK^f{R|lCq3+)bId6gi=_3yLsl!i(VV(^XuyFv3eX1 z#vC|K1k7O|aG6aC<=;#V#=Z@{)zxS(m{$t)1)Bbq;_|dbLp%)YutXH1;y%C0Z zG^iwZ#z4T=Z_MXOlc&FS{{#Q=<(V^QEKf@d!RPbA9|*wbvyhOKjDnIfjF~(IGp@J- zH{P-cuRQ!*Z9nydQ>NkC6Rq?A|{|~wD z#+%R1{)#Q@RwL5df&{{lk(`L^gwuEIa!$p z*uM~YdY>^b^O!^_acZh-Hikl>L1&v(Goo&FYHFy#9C?uF@LvuQk_#cDBn| zX1y6vQ@x&2rVC3~?eFyljczL3|Iffp@E52BOTcAhxZWuRiEbhAJZj2j0 z4#S2GMgIWn&BGPO_)^;Q56*>qIK)m%l&EnBqTOIq#IwGfdM}6h>CCu z`r(J~zJBMOe{z?*RxLJZ8zb>n3VruMt*}nGDvKfsf?u6?0fF`^i`A+kXowmabLhNPm1pGX4r*62ZFpk~3cV2PitKIIX3=FgugHUin zRp18K85-(dKtaJ3g4){JfQ!9PN^1JF&(L;Ft49QJ^+x>BR&=6KyR5dcn~ERET_clQ;4{&De%m7_+F`>9J|_um9jWg#h= z8NB`xnbw#YIAG9^b$@>Mj;&3OA3qtVB8Ig_IK2QfPWxqiT-+glkLA)cn{A2+3s-$1 zh~N{;7=(^GdcfvE5<%7GRTY9bL_w8@5r_)9(~4i$1l)42tSkaxMuQ)9&OC44p;qfS z=LiY1S9b2$`I5nZZ@vA`=Z>5>1%*(}SAiPEKpj!)(*OW)uA;ngNpbNN^Md*CqyK!f zt!OV86r-?HHx@A1@8Adsw4zzF7C!P-3x8j7Bj+X$l{#ml9$)Ee#A>r5IVIIEn%hSX z7H8B{)p+9%PK-t@ffwPgS@--&GHdor^x%fB9hVmrcK_pAk1sPbtFlo<_)e}%z!88z zmo?RyZwww;L57vu35Dr`eN^$+_>>>!nsdV)F)o5XMC-i zq-UmQUbVVXXh^8*-aGGo=dlOxd-diK{V?IS@wj=yI83Ae?X}B zeNh;LB#C|n7W1j$G|$`Lu|vD%W{GBB7K0|?4C5~tcvrQKPVw_kKiqlbP>HdFG|OrE zaYAB3O?+IuGb|*STdWd9L1WJm4nd$ODc%=E)6J7 z2m#{^cil1JvdX!=^Uk~ErqN>{Qwz53E5lHV1^^|RBXwO(Dh;_v&!f4`00`hnPfls@sBNdy6-ayzD{knt`n<5jYj&wi zSk#$Gj2=Dev#6-3>g%m|O{w6aRP<`Jnl@*qHH<_8*lYoaNk}TzH~6H+$@|O;ur6|v zP@-DF5>+$(dTs!OgoL{DTjp${@D@ne`HYkPL~5k23`|&PNO?n?i{Ri8IXpD9jOZP4 zjd2Ncp;0fCYlUY*DO{df96Nrr!N?xH{`yp=ui&A5}BI^KF6RMiMo<8JvjTZyLgFF9yn26TW{&w?WTwW4nYE%OsJ;ePDwNC@0M|jTF^=%C&<#zSHvg|!D63bmw7>Aevui9Csh`~zh~&h0M2CeUBG`u1 zxCrEBHbI*f>FCtD1={6iA~XPSR+n3^)tuzFY`L16idN=5*X!8M!9gJk6#e@3zi8IV zLl540i%oO~Bqt}J+T&5ZG>8lWSvwoGctraW2}jG^JipS)4hauA2QI7c^m*j3)al~j zgks*3C3ybjm*94J04N43iqt6z)?IfRXc{qbu_yd#?3tNa`+9cox{zqBE>+Lpobzyl z`2}z=DrHRh{Ii}TZXA6oCMI@1Ox{{*Ou&pd)I5HL6I7H}gk0(I*c}d*mz%p$MdJBN z)S1~{m6cW4TeRn*(eOb*!Lr>RSj{zGoO$3UYOnU5@=kA&~;k`cH zyP&XZ2lN}%4+Dk{MUURyFk<8|Ot}3HjJ|m^h7TQryk;2)4hlk;JsbfHBVYdei?6O+ zxxDSg+_zoZ_M5tP>AFz&_0cutbtyz2v>b8&BoP$#e zro|#e(M`z-sw>OuF%te*v$Eh!g)^Sl**nc^+`OhlK|tR=y}$GKSg!nBX=Hg-wI<2I zHLnJ0NCB8Z5QdKhbT%P_g%WT@)iZ{sCohN;L;$EjAW$G9BkP(VK10L8&Vq3;cugC* zNd^lh@PiHjNlj_8ziHEEmwXPLIDRZay>H#~RyE6{lp1mpx&f`z?ZmlrW#Lz9KF*#! z-HOQyh$0*E4)x*ytx2!TcT`tb+RXn(O?73A;^X1tm4(t}l}v{tEEWl(C|z?8fYQ>l z(qm6OI^}GY3q+xynkj1Jx`m~EbW^Z6@vJ1E8>DJh!3?RE>MEKrWC7Ye~%CT^%iC?UWIBV zA~q%KNV~$GKm9NNzE!f;!YmQT&d;#X&kW{q`<35eaG;f0EEG{u5r}FOiTIdk-XbGY zdE(K>mra{GZP21cD0*#B-C(57&gr>YM&S z)uUpH*BFum1QZs@g8qH`{ct@Nubob}RS<>qB4hRB-ok-KVbPkbiF)Pa<*$(}7URY7 z4WQHjQ{WsHixmk;$p>(qUt>p){Zt^{ZYcrvk#_LPzrdu8cVQ&5-DYz(#CbS-=8V0v zyxLBg$#~lwKteTQ0@c)J6a`#nkZas1+P$k?Lm6jSctmY>R_0ddba%!~VX@f|*Ei_V z-w#e;w2KTG9ZgC|lBBC90VD{NF$ztG8+9msTCs+4Kv8{Rl9H15n2N=eb5c+K$LELj zV3#n^YuE-nRB|BQ;8I03OD%e&ZHQpZ+5j%=!uYw{1rGsS}W^tH9h&FxdmbWLPZ{ zYHKR+`TK7^x%~G9;n!kL(lRo))eZJYoyI>?NgXKc+~K|c{Rf@?U+=MZ?{0BG-yZ*V zR-F1GJ1uEa*MfE^?9>(((TWV5+NcHd=MBEtdv`1BvRI_tT~|ir z!W$?@qo~lbl$5k1S8Gid7wyjC6kwEs8^-Sxj0&KlgqYZvt(jTPw$>{eZCu|@X3Su} z=tVY#16(tHC*143&>|;yOIlj`cKG=<=cgaWmsi(no*jw?(ol0`sx@(RA0(A2rkjXz zv~Jk~T|2gi06?@zYP_H*n!F_k71bo&9%!$;7Gq0plCql$RFnHL#iN=LD1q19m1~X6 zy!=*|#j{PIlxZu(CsxvBWa`D5oFg(K;#hh{#uaOplpH7yR~Q8+qK4?yQeRV(hfp;h z5=Dx_!on}o(lUG)?ECib??p5@3$DcqMnhBaH321*qF%ZN#)T;vG0?D7sLxh6t0@o=*en63v$C4{&3m4inY|VSP#6b5AqE5>J~;*X zZQ5eM;Gvj!`|Y^n)-mW^*dEd0c5L`#4T?*SLl7u9*hR~G^cyhbWMXXmALhN^3nC)M z`^7X+6{8B;wQjefYxmw)wboX&cW1i0>P!@uWe~*!3y~p-3Mwm3W8wU{_^^t| zZU{(jl5$}BwCUXox^(-mn-tYmRdna>-8pq@LyTR(3sB*hJLjj{{OL@1=iQH+&HrUl z?z%Obr8O(oNh_AGu`F4#QhfBWrwhCH=;`BQch5cdcaI8lXwrAYl+Sx>jQUH%6a@+g zw(r<7!k^E?oR+QD4IMFTih7)r`f^~*i-hAu*cW%Ao!K)ho2iXI){o6bi&D+$J>#L1wbq)vz+O)YcWvUs|zbCPcBETtu zU<-sx6j3Qi*mv?IPM#@+C{Qp(fg>ao|9SHz{{L+NtX=y@fw|CaE_SE|k2(}Q?cug= zowucVPM+TfZvVe4E-tP_61>3%>Pk15!y&!9qe(jG<}I8vq@^U4bm-J&<@H#&cG&IJ z0?`8ZI?_j)h$;vHY?6o|N06cASyOo~oOxsrP%om{ge;)~hd_X^(C|Z{VG*aU_Xa?h zZa2)!NKe}(8_B)*!1K|)(>4}!^UeJC^eZAF@^nL-hlPvg4?I~`nxs%uiPVgyHX3l= z4ObxyE~eo1f4=gcs;Ww%p^P;vBWtU-)9-y{ptDc4bx<$p(P_6_)z;^lrXJCXkA%{z zhLjHq2`w{gH1P8vq6`E-ArMTTjWI@jXsy0gWxWfcCJF>dNJuEYR?o`itg+)f`u9FT z4d>_8g7=yrsT>AsZXh!byTe{NV&v%0{cU|FC#P+Vj*8R_s4Hs(${N7rO}7KHOsEL>9-^Z9%^dNnqwnl=`s)th2tXET0wy5Ar?eQ zx+?NV^XL6CR0TKlI_qEcvH>_0h2zYr6PHBCZjqb6juTZ%&Ol8Qz^oq+?mZ~o9+&NM zjd9DmB^~$fUfYpT3PBLT+_Kt~A_4?(xXzt{=y8GY8dRJ-jzW;_>@G`}EW9zb#tUszpxAdZ3+6n>XdF5{{~;hmkm&n#-!>gF4m@ zZQC!6j*fQ0&#z^xR(6vW)vJUlnkl;`kHa{JtjpyY0fDxb1>lzPx7`2U$6thIrKN9m z$}W@a2!YLNgGI7{f#TN%7vEI6lq))_(b13~haqdgbbyl1!Zjppw1O`MdK6x|mV42j zUC9Ub@5_{B1p?)uT8<5k1tl{ESz{vUcv*lTCNknoOib(*VLw+_Rgv<_Du4k*4de_d zD-gXuqJK_;X4x70zxaIGt%-?A#@@Vr`_{l?Cr&itjH&WYrr4j?^A=K@N1Y40e19$1 z_ujp`<8K;0a`Bhbrr*hA1`3Zx?X3@lG}Z$Ln8p%QSq*g&+}dfufvAYc(=A%$l=#d0 zeE0ni&%R~!(0f`pPr$l>IPp0Abm77o_Sm72VWTht`nDO;Dh1uCni~g5?-|ld*#;K`$P-o5P#Z;fTL)%J= z50*si*uJH?zpSCA&2sj%YSm_IP;jsu6dWuE1zlK))6B{9P~=W!Y6ms10SR2 z%7G0VH>RFFbDF?Uukgr5uBV=U{wcfNR<6ftKI<6_T$68RoEbiHUa3q9m&;{=A77bi z8QO4U9hnQ%c<^$WVKtd#e9BD>HphTwKB#e_NmB<>iqT6;-I) z==Y&>>toiM-5pxB|FC00*Z=7`-Fxr-TiUkGTUJzjuon{mrpTzNa^iSJ4Oq!BNSr|w zDS{jh#7BlBGdT`c@TkMZMX>;`YVoV2cz-j!xKsBz8Yn(6#72Z3?$)*EMIHKwjvj3y z2qKD)p2qxN7o$g)PKbz3Kx`uidPcW_#|bDzLY3@BRe2Q@ryCBtgcdDw{Z1Ejtp_?{u=_4y#+vB`TN)07tP*@=_0#K+r@*q&ubQc0leFKvo5Qhu~0yhY37O|LK z#m49Vay4&}w>mV)j0oRHl=gP|?FLiu7Hm}Xyy=6t$<-g5N5G4CUjB!wl4UDNx z&LFEDl@Ksz{sKgVhoii*3dJQSQ0a0)v{@htmb0(F^2S5S$*IRKtq7E|Z|xtOJ8~0^ zg7|2#6XW*;K)ZHb7XLDL#Z_C+t=o3o4&aIZs72@(i_#UeqmideU4bL(9@wq#~E%e|^h!IZR&;?AAg96NpXTpTBw zF*~@I)!?If&kz|NUe>y8`%ChndG^VNCqHo4E!~=BWu%uJIf=4!<*=QLE=7)H_qijM$_{TTQ%^k8$KeR_2?Wc_N(0?a zmu7nk#)3N*Mc4E{#f7E$how@{(S5tLcCm8RR&mB zQ82O9sV4ow82S(B|MRXrll|tMj*UxTJ2$WY{Ok8#dcSG&#t^MGxD^*_YRXYjUIAH_ z5f~7FBYSsX{_m@B)+r%2%CYy;Po{RrXqt0L?CZu&lD3j1tIm_t*9V&r0MU_G*B^1m zw$06FPI+~RJs<$q00Fht<@kN&YOMKV8{C2g2(Uxo3Wf|C^23WS{Plsxjhh_5nENEe z#~#v|K17cL&TEXUuB+gXFocCi9!CScl9Q8nh?F$uU?7~TvY4h?hgo8g0NAx-FFkyy zBmh8--;OCI?bOKOgBJht>*ArjZc|J5jWPxGOxynia3~!3_PcLhTE2MRqJr*ytNd|% zi3tff?V4m&CTDG(Rx7HVwOGD> z3&M(ukq{Y*7C9{d{0ReK*Uqi2PM4kyt|v8OLO$|32?+-vP#`li>$<3RyWOrpx6HxR zmcK@KtgrRtL)+uN1uRhzke-pg1J~&l7#LWsQbd8es3rZ&$tcdaJlI*Zw;2H3`@p@^ z&z6@{BZJ|-+JKC6FonbIu^~AA`j`LFufaox&v00&43nRPIS^o+<9u~RvrLfw{m{^m zvW7SZ5fPEq9on{AA#jaaPPAi!5FgnDvm6WIfXE3Tb11SRHI%WYXJj2nPfadSzzn90 zJ~noNa=OuF)(=rrWlZ4!B@D?;Qm@)Osw#thP{?(jwQ9^OV?h7DFEwqEcTwooO6od;hngj)+dE+=_WhS9wy9=c83G@kRZe)H%4yjRw(G+4ISFI!HLsH6F&d= zKlfbhy-uAx5zQF~<66SOd`+N@Iba-$tia=TU9vC8mX!+zo<4SHvPBAdj3^Q)B#5F2 zF+hTqDyTV8j8!X^V&mQt{Jv%rHf`UFa*qOLu|Q_1eR|SUFZAux?~>8aqeqST!eW&G zsv>~7Cbz0^<}IUfgL{RT*aW{f%ANDm_aog34IxZ6WN?V#@1U_qbPyE*M3Ew~apS%I zKCZt#_t?jKi}oiH)45pJ-$3^`@|vU)fHQRJ(0+MxO8OB1XqJ<=>(M8kd1dkP^|@0% z{bJb5e|!0^=U#a6{->XP_QAjZ^_7XQ{_T~wc`xfWwI@(#{@B@9gxhx%A!W1>&Q zCnR1pn4!G9T>SROpGIxpxjQGeQ3xLY%N;1_(iv2g;F3L%WsO}=RY?Vfakv!*kL-ac z0Db!PpLr$c!X^r8!}bEXm^xn!H}vT8&7ff;>w&N;D=Gpx=b(aMis9=^ed+7wma$_e zHEr7BntKPn@cfI9P^#u+)X?Je^`r4+!utNcZv4xbqDfZY&=%=zjoulMZGx$7kZloFGYcN0?~scsFx z009s{5*cgVzTK*;IWNl=%^DME;r%2c;Pk$53S zM_g?29{^hAw^>02;w6DooL53pjSndT1FSV6Aq}(U0RU~=w0|iqH~>uX?gbp@mssau za5`N$d-imazmKa^=YrpfRt&9g(HI*7BYL$1na`^UdNB>VOrBriYz43gp^Axai-F#u=JRb#{6L-=F6nkrqe0kC7o zj(oSAE)wm9>Et@tJx;@O`UwbJ!#Ap1}Bu?$6f~cCP zjT(hlXE)1Pf4vs1XZ|#Eba{DM{py`j3G`C^|M`zM{@SBQ;f58fR^<~>&~(hX4{Ami zQc}PH5pX;Gn+9}QH_I;FSA6inM>mIuIm(z;)TNX_5U6G>=ABQ1^A{ZTBC_4#sA{P5 zkdv3Ui3r;AAq1QfX#D_Hc7y@ckWA15N)X6QX>en`apahfsd0vwXk@1D@rBUj_53z8 zQ<_7Eikn=m&+l@%EtF8r9G5{ChO1{1%K*v=*00~t*$8$M5{py=an1BvqX8NcbBuvO z0S7^PYDQ7hrp>Pz5-Ke%bC;0-b6?$mqxgFstx6xQ^SXf?R}Py#B5AXI=YFbKK% zZECO8oLDRtSKZ=HT}rY<2}X^&>7qS&)_e9+xD5V-jmLe!bK+Eg| zBqt|80pNDJz&)}F@l2pF1qx$e3WK7kwBfL@kUe)z9RJ!&Fa7mdf8FCxpFS1G>x9~r z5J1xemlXv}QNS2Spw)^1dvFB+-1WdC|L#`Ud8xX$s(Yj$PzZuxVg#xv{K}fzfPcUH z&ZKjtX9KRp7?v)ccf;|L?RnigwZzz)hvJ@lZpU5sOvJqp+>YTx`rxKfLojGqKNJ*n zKzc$VA|k^2%v&&L$lLEse&}NESG4~?28?rsU$8K#OObsw_47v#9V$tsD<#E(-|>(kSsJ$pbCFVDO@@2?r!m@c46#^ZUX%h4X%$JBV?Ba@lBv!IT>7 z%EyGNjL+P>yzK>@3pV)kxGKueS(mO@-Cfr*sVCV~rx{@U$3+AN2Dm0ny#3wt{kz?6 z=(}kA#CtxPc*p(k-G1kT?~WaR$CR<-Z=Vtz9C}UUkZNmd9461kdNGVwzZpo+NWUcg z{g99lIX}PEYDJK+bomO{s0X)<9)x>upMc&ydm%A71)|lW+M!ShHirX^QxY*@{7q9o z|9tAOyYGGI-77T@3+Bvhy=~`i_<&t}Cj*>w2m(iT)66Axzy0xt?{@zCU!PhfP!;*E z%R;Kfa#}B*r<5WyJ!7puto5$ld#t?e*6|-05>@Akea;u(Ug*-nG?Y?UERx^tUy+R> ztHL50flvz|NZ`~05Q+es74EXLm_2tPj@K|i5-Q%E{8o$MBX7PeO<0@N=Hgl+uLJtH zsjg%+O$kA>?Cfo$Zo2iWt2r-cj_l7oxc@NbE?SB&ewc^7r>npNgFyrdkzt|L@4fZ* ztuMXs$|IM0pRkaSbAl%O$Oyc7C8_TzLBP%xc04EAS z7`&Kk-+h4-0+|!co;`E6zmKb1_Z#L)7E7h>`Qd$L#8AS6Ch@4(cVy1Mz~NCC_V3@9 z;ICtQ<&C$9NZ}*lrpq!Ccy)peh8*W;oDg?aKjVWBJwmo@-9tjdf>eigNd%W9xU|~E z1toy0t7`*@b~rJO@(1%XG)7Ilza>D+mbvS~!oq8D9b7ZN|NdTZrcu&W4>khkeYmDe z&^r1GXGViS5C|qsdg7V%jO^FphQ%gMLq$6nxyNCqonv?bV>2SXn_c7 z;zme)l@qPfD=-317$PICF2(IyUn57|{O#&h%MLyN!gK#vy>?wkMPXEDg6n!>+*cc= zo@o>%6p|!*8tNPnMHUITO7lgXC8AMhy@t|Sctils1(csFi)u(?jf{*qDQFs*#6+z% zd#w_XKSh!o1tr442*sH*XCtrL02rf;n>D$8&Eg0l8gh|CBmy>V+Ek!_FS=38VT(mV zb&bbV(BeJ?9!?1)LJ{l;x~Ar)3R6Tz2s8&SlT|a$n*f>Rfa=P{5KRx=Lm1Li()JG; zG;BI>oBzFsrsno}DafW^Twx61At9wbdh}fI&buF7)ctaDTDpGzd1jB-UVr7I?YoKw z5^!*;Hi9Gzg{#_yAiMpV&WR*S9)pEchqAA}4jh5@07OMKx@ewfOiV2QW8Ino{Ri|p z?)JEY1%bdx197a%jWZi|VAuBj$V^K{`%Z0Pj|_*K0g@01SORCS`(woo0Q^dS@oedt zNR~D*+dcl|sbh^jE{}@hmn;Zwu z&S-+;hYw=!?(HoAYzBZwAARDLJwZIl938ZE!e+jJC2?@g`nU_1UUjgpkQ#{fuD5h(qs9Rnuo&&ORR-m zI{b0AywV#75oiEOV#I@-5aj1H+kVF#_kH&FSG=+|zx?uZ(gXKST;9HUCbsbdn(e## zGhRGB2dKBXKnX>3bgbXVnoOK{=UZQX{q>zLw~Gpd0-98xF%KFuLT9$>F+2g)S2dUiuWZ=9Mik!p54W$lnEf&KrI2V z2omy|Wo>=!jem}B*|PQK%Wje z=_?3GQ^pjCf}rKm^_yy(aBxm>_{iZne;-p$Zp-~CDG8M)-OeBiazP1e10<*A#sXJU z?d3}r4F%x0Qh<#bMFY(qHUI!107*naRN~0dGvI{#)@i6F`v-5GlYpb3OE=8@b=g(_ zocoIolUHAPkrx#e!R>bAt7+d6;7=F;NlEdCiDvPqA5Kg&Y|y(l;5su`9iT`F1`ixG z?RqH0?kn1px@G6iXiB}3Bl!R5I{O;65R4x?`s+LIy8rF#xnNyhS{A7=&D|2dCZI;K z%Yg_zV>}Lk5&hS|o5?TUs+0`?E_A z$lXq7Ktmn>kl`c03J!7@`hEt=pLO+IeC_i^Lz9Ee@JGIXF%q=Il7QmW>9gTi>+@SIR;M=!&)n@a@>kq96lICSLbHKjZLy5N_g3R4>`0;P3|zN}tB{Cw}Fce`Uy z2nXi^Cf+*XgOHF=zcf1BUsRM^Sy^SQzPfvlAp@ip1!AKcZ67@3#!J$_9yDm^iLa)9 zJv1*n^Cv<$2&Is0Hh2^UnGu{kbpl&AZ?IjnNg=wPBRA&6hwVWLoGv$hnDJGwJ-fGG zv>aKRw(V;sO?tAo0xDBMfCVx{DuG$;I1P$5yZ7MR?`L8C(q$+sJq|^7LIOYqvS{kZ zZ{_*ZIw~wIT&B(s1tLPZ*DZgZrRsLA%v&yz$Q$Zolo$8O@vL9Q5}+zMwlYtCWMuI>13$x0kLdJ17-5oZDd0{&+}P2-g9 zuglJzi|{hOee=NjxuKRPQ-Bf=3OW}oZV2(I%jFELbvgqT1N5L3e!1C{Tw^nWA|^WK z*rnbxIy$EOoKYn|!+wDPoR48Jj!{AX& zj2`0sG7Dc)0SJqT@*7{DoZOashYTDvLr|cacyrZ+8Bjn4H6zmj5lrDmoJl_WK8;#blwv!{QOaq?(!GN{TxbGbYatriGMEtW2vkBxguAd41^A3N@@ zd+vRB^X0sENJwav+Cb#q;t0IWU-QOq5rwOYc>ny<_n+9Y|5$J>wE>m@P|1SEiHS$P z{Ot2S3l=WTyHwHmK3CGTzy8`zW?e=@gwV^gbE{ys#SF~H_x5O*2 zzIprgUaY1RMp55P3ls!F)A02z7U4XoNv|26hH#=3lmgLFp~%c?x()wFFNq3_$lBpo zPe1sA^(iO{Ls8M*tcE)7*x0xu;o+er^-B(7>kj~F&&WADBLKWs>2ZPcjI zvEZOUX7&$7axeZ8lOKVHvXvEASI@!WK@U^+NRzeuc@uU z!9yjP0I+}m{%mHL=XkwTjI|B|%GE^cOlfJ!eR*C8(^b zM%%XSeRO?;fu+-@YR+ zCvVsPdhfKDH}#&&v+ys;aKBtDq0HXr}Kk0@U|LM}_M1z`1`n0E&u=vRrPJkg9{o z%*|wTjAOOf@aV&jJlzo9>v{9$4&|m8R3D2OnBi*(tTM!sljDyK9X6st0OgJxKA2Wo zR%V!$*KIzTW4!>owYGVSyvrhY+pc|wjn6;(%rgKNLFm3jwA7xcaANw`-{XsqKEbkI z7r{kESRLVTdng3af&iNpM~)tBvVQIIwpU^fwr$xM@zhh3b~DZlHje(RRT(?4T#H2_ z=+(RTta^DF5u8qs2ToTl3OnY)VGo4It$=_*1RxR>@vo*gD(flO5r~M02){D<96EH^ zG$-e9DXLj1^#aua?cH{HoJegFhs2mDD4HxQ)kIuW@TdR|5g>p?vico+>3GS`Y>3i) zk4uKtW`)CHMfs^?_<80mtlY8(uvy`-T2GC=Y3!WKo)5;vos%f{IqQrZ&(z>1oFF7P z=&Htf^M749s8+E+5iE#^h^T$&-uwQ!;Fn*U_3GVs!IijQLTr2q1v9*U2+ZJ8uL=SO z;P$w!Xy8{~e%s9{DM^fL=e(ga!hOB}bO7YxBd0LyryuM-@HcuM)s(ttzmZQF zO)mkJRn@&p&z|+$h=0bnvk0Zk@GgQTTV?oD8aXn9-DdN<&ws(dv8=Q-k}=u0fT0&> zOoyLd=w*x{EiGmD^-_G@UsRN*(r?v*v>*x)1OWmSK&jvpfE$t!98hEhimYJo?!7p$ zPc^;0o-d14^a!E^&V1=g#6%U9zn>L77kipn^vG z*MN`&;1FOD1>AYp{f|UML{&DVu_h!oIo`idpC9TLmg~yK)cs!F_l%ejN!8Ug3G?R9 z?RPakzb(M#E08vpajHr@SRBIU9ZGmXgIC;;hlP3dbOrL%qvC{D-X;c8T-Eay2|-+J za9Q&fIUD_TZHiV~4ddM8kT{=!4eT3e#ywTx8Hv6@z~htRSF0s z3q^oU0wHQLC{XaYCuC1YFgit_oOrErJCPY}^Bz2w1>r zL)qU?94U!Ab##B0&EbHnsumSz%HXPXf;nqpfdVKVxNBTcJZ_w-aG`NZ`sOjWO#Ha+ zzw`5tGluTiyC;hfZp7a(>2EUt9{KVn!DT0p$JN$40jmR4u|j|V3m0IOEN}$aK;>F& zU$+jwEnJG?6V+I{W-Cfcs~`skfivcM{;8**7&36sMHNX>Qqzt^MMs`ieQk8V6sj@) z6oW3#i5eeq0*DsNWn)rJ|LU``FTV8R>s)3ag8FXDvI3C^DCpd2-rU&>IyKF1dPSr? zw{G2*s}|Fs70pcYcxEF=sLfYdkww2vkY`LEFlgBD1+wA+2#3Omfo?VLq53&m>vm%2 z&K<4&{k>kX^tZzAXU-gI_;C@`YXFxZk6X2BSC0kJt5@$CHEs`% zo+?9nQanZu>W-+W5V$!g z{B0lm+nVR@>JXw-1Js3cCy!wL?~CyDSJSa#R|%>G2SiD5jv6-P$^2GrF8i~Ih>UdE z?KU;}(PYJRhC4SIE>i(WNlo8#HRol}kYUr>waMN3)MJmnymayM9gYBoI-UveS>I!ZL%@a&8+-cun7ZB2 zb9Qi;azl&Ajsx_q8t}Y zq}Huo-BnSjQREOBBG9uLAJBG4!%`uM)0U8&c@i#U7soN)vU;6z1RfvDP_ zCT&MbMNlGuS}YK40kDS#BPJ;cjWg2FszV!0`{Mn_XMH<${PkR@9?);l50VHO0@rk} zG#s!h-K#(FQ(4R3@2W`boG622}0398o8zwT&pBR4F!JqkBX8M{{yh3*r>5@>{OD zya_<2{I|coG3%2LKWUzyoAZT5ROfo@jy=65zx9tBuf?2LtrnLcXo0JV{lR^}5fq>z znk1*5ywv-prlctoZn@`SUD!(j z90UvkS7TAeiF!V2=(s(5in0$LxO}E*gT~zTcI(dlx>_XV8NtFK1y~@645i15v1-X8 zd^KeXe)#@J>_1WpCWs(`f#8xA9@)d5f9|=b?z`u{_b=uC|9tbUJJM4Uju1@`)+n|D z#`@PbBt(QckeZyb<8qDtUz7j!GzTaHgRB6Y5l8}e59r%_#>ek}HY&&wbVbgh>gp=$ zbh)iC8OwR=|0WOs)zM`XiXTe=&6zuQ5R+M$D$zthIEA43RDlq~(AZp5{{8pg2KxJZ z{n?ZcAC+azpGp1Lbu|A?&ksb+mnrbZYj6DJsb~N82pY&$Q&a6wm{E=Lk-yX9Z>>Iw z*7>b3yQje$Z@l%Fn{FI7T@pyG&F(=z6it7@x)Km>rmka95&J{`3U0;kghSZpXL=m-mC_k8umM^C)){39Ri+qWmVA-{;h zp`mAF1~3RvIETU%lh(6Vcq0lp2y)uyqtB4O7&dwsM&C3NBZdz_$JQ+oA0Ibz>z1_z ztC#;?aJ?3*M~xXbqkE^$zjK*`atV~ENKJ?U5tu>wBZR7jYOX+L3{2K3Z3+nI;ED_; zyP+uR)({;PetPuHH+>cy5+dXO&~@ZUNz5l7|KquY_{fR3Pq+mGhujETP!MX|wQwtL zD2fb`00I?31pxvWKsg9u5Ge;C6buBh5#gl`c^*Q7gUTbr9q`B=Qwdl%T7jW0&j5fc zPyl@N=_g~0_U_7TXk*RFZn{a5sHTz0eB@ye^CzM z#E|$g`@0z9hT3>cN{rvxyLbPsSK@Q@=`-N;qJ_&QJpb&o9U3PkY>+G>+%8w(wV0EX zw2W=>F)<#6b8v%oqZjIk!4L_wI}jQgc3BW&qetJoDk&j$6;n7|PLC>~BdDsV0wHj_ z+HD?Q`bxMacbsHk`ZSnZ$!(aawiYMeDt6oSA& zJKWW0vG$LR5G3(vhmM`5`;*LR>#ub%TQl$=!*MP>IWvKFr>U|@9$01N^+%FdOC`un?m@bJ+ly6LGN+xU2& znHZe9g=ayRg5Mu_;4g1SL_}3Ll-P9k>{;Uo(ZCH%(Y{PY4gx5IKoSLX?$~+hmG}&k z-~IH~hwi!OE$Z>e5Ukiyd>GTFO~bY|DL7ny^Nm}yI=rpijkPDsP~rx-BLX&i5F|lFTzt%`*Ixa{3s>^~wY4>e1wjCzf(kV9 z+WtV7TMe|?Dm!)QwgA`hHEhJ_uUoau+XYk8(F=C-?z@b0?Ag1k<@GS;)YSB8l1Rac zZ(gZduMmR|s6w+9l$Moa_Rl}h_V;n+<>hTOBmaqsF@0We8Bu*j8Rs~2_DqPsj_V(9 z{GAgbs!a4#0y@9>gV7B!K<&n;8zXZ3!4BpPTofa6>+B*-3)XCQBjSIaOAgd ziIHQ5A*FE=T-DXE*{pX2ippK@zVX}#6UN=R@P%h5{b$SO4Y>{NMSS4?haR_xstF9J zDr+GK0;oU@mwV0uDv3x__sncbpk`mU%(5ugEfcqj!U z1c44aV&kIGIH3`mrzhjr-Y%fQ2gvvjPQeaxik# zD6}akKt|K1h>nYeQ{iwa3S1sHJhB4jQ2?2ND;%=IAqa4H>Qu0#A&q^*`n9=pW_>q! z^M=(eH?01>#CX%fP#i1BPu&U<{Tc6+t$#YdsL%F#{&Xv z8iRuxZT`9xc>`gr{hXR?`g%hUt{^uzdv}kXeXfet{D~7s;~5lhQ&iV%*5%;@wfUza zt*~qAN6VUo@QFtf?E& z=rnNGCJAsvWYtqoKk*n9)x?7e1VsO$YS2nKMftgN_~hgF zM_rbLv~eQko;rqIkOY>%Z@y z2vl4M6c}nM&mlB82!WvySha3D*8jE!&a!i$q5?oxDQG7vtj!#JRLG`U(_FKp0 z%NF!$)3JjsF{v>mn*)pqkX;J8Yi z=KxMuc;JzOzypK91Q8qzA|>7c`)SC&q63i|H*5;ux^Y|Md2<%_7<==rUtQ@nW4Ak)K&fK(JYbC1^PN#- zl_6Kywe#=&`VX1oukXOvvA6s*4V#qcl%{a7oOLD zYs8IXcJ~`L;-v%UYG98|gu@Yln$ojyo<0qwvI16*2X+Ebw+l5@6@GiB3l?jwT%`n2r}?Ei z!uMZ(*1yujAlhuI@jFwXcx1%JMXvhrgHQToW;MN{K%|h6&|;U{4X4`$SyrGhW_)qR z0j{7;tDH?~8QCS*drhQA*RFE~N=?jn-Cb3yNkRo6eLZ8w-R0-X8oUfpla$mw;bFl5 zBTy9Pv*&7=wE=(tS5fDcl@-DMKCXzcuro$3th4($d?a-B|1*{Dsp(me3;JF9!zGCp zwH`pUVmfCUC`FSrCKS-}G|m{l`{rxhH(@ZpbK)32<WR!}l1otd^CP-btl}5_<1dK~zvdbZ;9f7IfRUiio{z1rZAh z_FfT`rXV%+5=wxC5Fov;-e(!({jmb-KJPx~{k~&K(C50iE`DULIq%WOQ|>z$g3sed zAmD?E3V8M9muFuw^P0~ezw_!(Ji3}6Bqq4+PB1Nuw6s)+qJV~~Gia`FK<%0G&H(Cg zp4)~W)=XIc!E8 z5M;F2-3Y2-gn}W2y`XSzkS_a+F;goS9~>L!syG)GNsd}PC&fP22m1` z7-c}O{7xt-Ekii0g3_NvWzRXlc|;$8N7gK4WMrLaZ(|@Qw{yj$i6f6}*|o2Lv}$JP z|L#C05uOXN_Dlc(AOJ~3K~&>&O7rJv$bPm#5+FI=R`KY(#~+(`;qOyLpPQ3gZWJgq z#z8>AxduvgFfM?!iZ^k>z`#Lxq+p)0h-x#T6vDaQ`=vAeY<3yvfJ!)ILO})khfo0B zJm;QgZE+MH!RWKawm+vh_{kBc;nJxW&A(vs#m&FRHzg&fZ~%WO<;_JGO?|)r>kAhb zpQuMD9D*RUR<|(*RZ{^fA~QV&d7X00eyw*77%;dgHpX_O+2JhU8Uqz5bf!bqG?bq_ zkq@A_t&XETTUJlW?vQdJkz`O=h8~er1&EGtC5e2uNRkALKyduP z9;{rw7L5uJ6%$uGe%!=$XP@=BUGkS7ExmpJ=I_$G=XJQLNB4aA6&-aAO{i?BM?;Gp zp^zT}2W&ki8dA9G+x2aB4mh0- zdgonpH4*ys%5Oe0Kl;!=>gL?_;L?=T^j{=JTzTcpr7M?z@mNje zX>`a)2bD|^1O^TjfC$+n0!&4H^_dI+ZBi#f4Tnrz3qcS2AsC}zG8^CxD-l}XRtgM* zQ3gl=njVDCMHq+xssmIMVUCW5Ohr_dAMeo?@wM2SG8tpgdF$PT>7hiHd>S?LjCUMj#YM$R7ab3|(@w_RfFo*}K16GX&?ez4_|G z2OpU??>=2;5U3cT;-+VL03uFg-dZ^C^M~PZ*i!*iv}epwQC4qsw3#_ zF4pF2tGHrgZ6K6E)i^||gAfS}1eEIlbTAHZB0$w5)WNa{_#90*bfN~Ief=G-ziuXf z|AWuTANBqJF#upRnSz`!fYS)i2Ei}r*w1F87VRxUWobFMz!463ps5;yOau{4-~xxv z8Qi`g>~?z!fTQhcG7cIte2qz7e5*gGL(@Xw5MYpHSmUfnN=!ocp52g^mWWkfe2GIP zCt(x?7%5csB<&Zr|1a>n}dLaeLwByN8b$Q+U2C*2X|% z+KkbCp^H&qf)R=!ArSDvVRxgZt_e07+s00qvoT{utc4h)D96cPC*c9kog54E>N&!MR?2UF1s$$wD)4pD?;FWgK27bSf z4jR<2uLgmJ!a8ctR3NK=ABff{94$VMmEUcJR|NzDaDjs`0zw!-1Vr4y3>=Y+ve~n5 zT@-DL3ALv&;P?Az*@in_`goGv*I zD*Pl2{O=Z_L~3;uXdHEoE`0LgTX!8iw10JGhwM}F@d@YX02~gxDK0KP*k&$5%}uGg z4v4}p1>S#d1QZ{A^4SOX-*Y=#uxQE0_!HQ{qN3rB#unseC!oB_4u3EJ*=U5-Y(|Hy z40O-$imdb`wA5E+AK16+NWWj<(wLl_!XJO)k^2|F_Udu&NuLOXmhT7PV-+gHgH1#Qy!33gcFv}X$ zuoubE5>lfx!8>(;E8v6QsqQy5188U4DZ_$R!mMnfS5L6>2@r0dQbHG|DBndzX zMNNGRPLv)W0HCxztRaUF?(eyIRory+_W2wEv1 zfOCNWMgZDc`alUmQesk@o(Hk9aqPA`ZgDfF{Uns$dLE#NP!@9hGVq_BlT$Zi`iyVd zDkf2+jMAS|zx~u7=kCVm#3~~qfulzZ!u=1z80f5#!`Q9Ukil)w;`@oW2`wk3LB$L6z08cnV73wHG)n(y} z&pi#`fnVc&2lnksz4D?lgHq#Sk(ZZ-##4icn}o zgrlz7cB<@ndS2&lwQULC&3D|lR3}o9Xk$tiw?ro?0`rC zQE27EZ`A_~D+*$)F?jTmNB)_U+p(g(_+LLtc#5)gkXf6C{H4SPN{4`AA7fKz4c((lgUxG+V*L zegwTPbnVs^u8Y6q0z1XGv=$^1j z=@pa+;EX~R0E;yW@rW}KPhMLozx@RRJC#wT|8pA4w1G=uC3jqAr3WlF&a7O5kQnGU4^f{hc@zwj! zm@U!IFI~E@$sn0RgC?CCD=X<;;|d^&Gi0U2ASZtava&M~A7w#I zlo2MA4XUof?{s|j>3grY|pPsUA{^1sgJd;GCyHr#*zKdyQ2{SV(!bQT@)!VsLP zsU7g?NAHXRu(_?ZRZ-D_{u{RLnPQ~`k}Ly)1cT8COOy;zGD1@s8Xd0kseik*X5{E` z``4~peaj8kUstFG!eB--&L}#ni;h9wQw)ZqD>`I@41qFSaN#8@mc8>C-d^(Z?a$tO&86MD zl3JgGM<2^$-va!|x5ExuzPWr>aobY=_Gggi~kGMHyCu0gmRTlwS+OqJ_^r zRd%W>kGJxfG6v{e2c-mASshNk_tv{t6!a|kO{(q|FMRHyN9I5JcP^UGO0E86KcgXu zIF&`T*qbxj%Nla)Z8v>#w4}6Wc4jK3T`&rSaKy)$k&%%BQdIgAmEOOX$VcktK{y4a zK$O+$ZR=R4Oupos4?p-G3Z-RfP(zahi zc;UQ2AZQIS5#StxNFW)6UyX{;=MR`$6pH#v2a3-$!eo>XWt3pEnqadrwa`TJNJd(d|?RS5hH2IP$0O-`IOX#x8FZp1@`t{cpZrzDV zQzwBC6LejRP)RTfgVBJfm>5r69T!9pHIq?>sw&VpM<5u077hZM21*FbCNnDRb{wqo z;7G+WWR+E;N7rm5rX)i)nm|Z|R@x#8Q@5`DY8QYP+LW`hpl=AkvOnV8NA_;BuKVK6 z&yu2Ip@f2vbsYlJU=av(nSuJ8@LS?+IFGHY^jN1w&(D9Vf8RcX;*v5jdfWu;-mx3U zijSbOwg%x~03szYnQh3;%|yRWIfXahGUvtij@#bSXgztNxbK0z+m(VIU2x<`DX1s| zoPtsg)++u?Tkn)y=OCQJk>>xC0slBBDdbZt#V4 zI9x8cd@d-82A|slEgXPF00s^ic|YLsS$-O&EnS!w14-ATUQs*uQ5#0{#Fj<|t%z=up))zw6=YQ!jhJ zOV|8U?QKGGU6sOW5Y{lo#DU$Bk(B|aDKJTq3@D8fa8X8=oDL}H(+>j&jksjfrcINJ zkCpVTsjAFsZfr=_IfE_`2%sPg&^dul1QhfhP`GLHu6Dg(RhJcaT>9wM?-9W`oS1BY zB!S8T2;opz82)e=jOj3#3|lUmHvMDVa>u!6FS_A@mp*^t&R6Vpr`HM5sgoee&^D^3f(=BseDlI?Lv8lN^lT#TgF``ZjBf)5G7&T(} zmH`6>?d;aQ$Kj5-d1X1-ISr3I_SoPLst?{}kgcGC1aKXaQGgOuplK?sRtYU98*$X( zYgd{Zue`csmUQnu%Em2QC$u=6i93#0qJRMx_UwU-m?Y#!Ct%E|QP{nAKlT+JMoV)O zpfLyr3DF7B$jnSfhD}D*nG<~hv{|0jy?b^J+PQQ41X*D8^@WdSSd7xmk|4uuFoHnG z#4!WW>w3LuEWxf0r#qZGd2g+~dsXK=sJVhY669hLx+x__-Ju|{6PT#zt2lA8QJfe9{F96k(CWlf`Fq1 z9OM@i0B4;w^k*VR0H87kV^kEzjvWKD$r`yl1ws!wc?*~tLVaZg>Rlc<++{r+Z@zh# z-|u_XVu|{LGrBbighA0cL>A$n=R^l38aSb#8besu(XCejCQhC_#^duAKKb~Amt1?@ z?6uiBdHVT!K^Ze{!V1&#&pp%RbVKrbF|=1FbV-eh1p5^QVciE%0zo#wV6wct^0Q^J z->+Hz=7kqs{=d%FU9jMluNS|(@bnW;J+VV&#HgzTL z{{g#ZUORj7jko_gc@w4OC-YT}wYoStbV5KS$~t6rIQ8^X&))r8IR8(TmE>&vVa?@7 zj~923Pf0~xeG6oPp3|8D<3FQ}IZGc02!hydXf?x(G8GhB&+xg~&RVk?B6J2i zkJNB-#y|ipdvn>e%deQevQ5wH+S)9}fU}H$XDb}}&%~M|dPc3gsLo(_da!Ndstr3g zuYTjbr3+3Aq7)7V!X}T~XLWlVv8gF(b+_L;_u00Dv!I}N@rEB(-SFC5Z>(%~1rZDe z5eji|Ees+EV3Z>vE(SfibVh1IG!XLNbf)YWDrzbgyz<)f_MwAD{@8!O(EY#F_uY5@ zgD>pevvbpj@4t1Y!{fD@O{P%Ko;?p;bIq*R=g)ucS9wSG9t9PHhYZE8-Mhgc!NUl= zeiaRFJ9u?71P;g`uv(2sj*mw|TpSFt2t`p42!?Q`u5tJ^JFl#~@1EQ5oqfw4Z*=L} zEp+pZvv1zAb=!3%71ii{x&m3<3!sG=Oq4*BB*>Bh5*4+!I{xiV^&L3VVYC_{iY5g7 z3Ic%;1W|^8FlZqs4jexNw=O_5$T-&MMOoDW$WkP$mr@Z%0|gN%%-asksjI14nwF92 z#$SeGMZ3CL;}QW;0B0IR$Y6>Jzt4{-qX89XTF?+OXPmG2TbdiAUw`@O2Xk{eUdcEE z4~LPJnvVDj#$w=rzBp8J0u`sq!PNkI^%?}5&5U5<8P-r+m6DR4+0Y&_J6f8oI|{$Q z^y9Y|_L3yS{U%AoWm7JMy~Tx!>Ke#`d`?JS*Hx&R0>(H5g9%YK8*;cVji~z4w9D9XoYp z?WG_4W~X7$zya{99D>mbUDM(BIw5ibXHz4N9XyKis(L5@1cQv8-MV4x*4^Zf{O11{ z0I*ohzVV~`qpsPFn!08vc;iCkM0;Wcp%1%7!G%BCBh*;CXF47?Bo>e zJg^HhE}ikO2OpaM(B7T<@ZmcjwadjQE+L`bEF0nUsMxmtdt5Ma3{uiFA#gxf6>vd- z!5V|8KoIVhN+c&<+WhjO#kZY({;ju{-MVVssu|%x&}1=Me1uY_XsR@M(&TS$yY=?h z+WTUC;y~dzM{V8kgv`zmMFFBgfC?2v2V|oOUX?-dX&YW#_~xvnq~!mSsWkJSul{4} z7t3zk@y%P4%qdwAqimpp07iAhMO)Dv6`fsIUz-8oybJ(ba>=wcb#=A9*M7g|vWA9+ zR0_(nvvSJEj~~A-DLL8u@rS>x;#Y$~V|r>L42cPVCV+4a&=@qPBg$fcv!NRMkC&nM z;1S;T)DDReij}|ld_H=l_=vvbjhE1?YbVHp01Xt(?}1q|;KB)G(YJ3ORM*x+5Bd=b zhmeq*4w?C3uPlSx>^xu3AC!$OSj8ekL&CNzaN+twzG&rFU3?>9Mf>6+llcmKdJ5z;_ zF9=Oz5J}`;q?QBFIfup>I5^B^GZGWx;q*9grlJa*ivSV+FsHK47;SK?hNCOLkMM0% z0Tqq*2+!|1s-~YDQo5!CttE{*XE0dIxa^9{k<}psR11O`j1ag0qbwodXn?(`0fG+b z;4qmj{y*ON4}`rfX}!ATp}ejh0apl`!odXsS)fo91;*%T3?DWOQ!lv~R8!!0w?Hr( zzkBz+WtSW*+Vf+dzJr426VSwA)*-Zrx_st7fyxvHK?LO#U^*DrTPvM8 zqAX^7_uV&79Vj)PTAI8t4YXaH2@2y%ij;fP7kXc~0El+Ag0olo@X-FHuF zN@`7RZtlsm)L~yQUxf!Ap8u<1n0@1|i%yoG>eSrSl9ZjDb85!)D?b`GZ1|>u0|ysf zJmr#KwY`du9O$um{mLu9`1ti$fyi_6a{;U4VRS_r1=pfr+s-I@rGvr536 zXh=>;Yd2NKPe1lj_5G3b2NwNv?*HctX>=g2N4N+_3H(jH3ng?`?jFH85&nmRb7b{-~I@@F94$? z;nkO(XLsKF(DQ8xYh%T+{uBBY0M-NqnFgi<;2IPTFinRH4x(z{OaU`VfHwdZa^GKG zREDoVet-5g*Gxaut5=`>)22=TFfXrD&9D7^0|yP=58xMKvUlC}&tL8L6A}`20A%^{ zuLf`3y7j&@m1nL9DGC%tLuFMpnwy%Sa0aicqq(64w4oUU41`c<3}B)Ffm6Km{`)Vj z{eJCB0LY}tQ`D>fKJ(0~)!*i9*tiW-Ef!?uc7#fG=rnRxJaS<7C;(ry$?;!ty0gRK zMqX+MNJbGN1VD)RL>j9quw~0uR5U5L=#r`L2_j`{)~%kZ%cl5%4seYDDj+Zoj4<$k zEA#8+U(W=v^v~}6KUH>ITK&(0z6k6_;Yf#XZlb3>iTgK@0#*0(6OC`{s4I0Lt6T_|*iC7+C_<6bRr@MS_s3pt8Ia zdk-8&ZIcsRHbN8ybm`Oy+YA3#=l_2j0H~>~$*wCcL3U;)dJZjsThVdgPzieW%t!x` zqmZ7M3NhqGlt4g|($Q2^4iOx^dgLP`DGIB<{c_f2(F>LtyX_w7hnw^_h)7}=O zVI#)<@cc9L-(0-pf#pg!l$&+~Fl^31`F!t>8 zH{Ue-O#pBH`|qy$cJ+C&VDBm_&0o9oG@=jI!EBLWjk3aEj)qDFa8X88T_gT}{jFPa zJO1Z`U+;-meERHD&pz(iQI=sbnLz{!PgsGX0dBt!JGX6~0ASVmy6LB-r8@z<^Z)X< zb+xsbrN_$9g+?JEAq7TB0AV5|rlPsJ8auY{u;=w2uhQv(gwQQ31)+c!CB?-cUKzD@XK?gb2}Vqs(Ix{QCC88V z{`8Blrh`OyyGzR}(O6N1#JpTEE`W0efs0Ue4N(ReBL?;YSP*5!M-dhb$jr$B5kzRJ zj4C}Y-M30(U^zE-9DKi^Jvk9^&zyJZz6-0>?A-5Au5Ye-54^&py zBIFG~*CNh6(ICQPln@^m4VyIzUbh3PKZyKZeUHEQ?gtY(cI@P3c_9fDSsk-rx4Yo>_@F8pSSv?16(~emgd|B22tWjau@lB)K(FrL;Sh9PgBDg1 z@HkLfSB?9$q>##RCV0Zh_ zZ`e=_A3qM+85s~16$A`H4iK&*I@PgkL9Mk=y%IzWoDAske3x}qATm6d4n1V$b@{?du4BA{3Q?b;82*zo-YyLaxI0m7l{DkvwADTPEu z$bwKYYWVOSAAk4>0HCz=csIs5Oa=pV4iHg{IC^ysP1T|49A2+4@7S>;z0k&K?sn|h zc40^%pbX%G4v7d*2?Jv~L;xz&ks24{eEaQ>FRrMp$ot3L|9D5BMAR6dnWCU-I{Zur zmpQ0x&~Ci$nl~Q$=iEn<|1ZfDzm;7u>EiDJ6g(HU}Gc^g-b@eDMD~GGajk9v_Oo&vBrNu`h z+G1%pj*-cer~FWQqIBT9@4bE753AN(wr1n*>;s2O#mw{+B&8-|Wbdx%-Z2lSYU)r~ zRg0D;2f|7iT3Cm|7#Ihd9CjQ%eyBfyy=@)u*wI4^zg@Svv&Z3prYZmjL`gj(v ztYBIIQ!bkFSz%$@u8MAHZi?>Jw`Z2F>mW4ZI`aFuc9)_m^Kj zeK&w#q}Vzf4!UyXHy3Ry-1fwQ-TV5~*ViG$B2-BtC6Gi4P8b+t&@>KnbS%zll-_mc zUBfnQ+E`cRcHp~jzsI=I!;sab6J&Fw%4f&Ut#`X!t}ksdF}$s{MS6DUWA$Eff8E9% z{i74g!2}7KuA#oJ7RM`UQR|JY$>YY3+c0a^O`pBFbV=cZb01v935%r?Ac+Dv6T!4d zkwaKj4EW3N`22s)?_iF>S$#)D5ja!2gNQ!dHXnFJv!1_A&ztU%)onp**746+2cs>@M!=m12?f~NXL zRMypEROyL6Xa@m+C9l6UZ{fn1=7t%8LEspepV`G49Xmx;c|=s40fcdYYe-K{#I;vn zg>b-yipn!EM90G#ZG%ZP01yyXg5X*RB8@_Ab!9pLM_a}ol#}ZUi?@Ii9VT`HL#P3X z2?+o(f{Pp+VHgYqR+9|fWSWtm-?P3wjpLKYPr^jZV6uczD1@rY)7Z1O2xZj`&_E%} zMnIq_=-v(6xBc{6wm3cX$dk7%dF`c^ z7Z$!aue`+t`-&fsmXv_l*chlfhtuUolidY-SOt?x$GrUVf`{(D`~K(gC$LXet(;yN z79l7U%o7IJeE_cmfdEBOk=L?Q>I*0eDKE&8I*KZ@^5C29Mq%Fq%nihyZ-|&~)A=@#W^_oiG{=2!ulrC`F^)gU`SI4*mKS zATu)yCZhq8Y=9sMP&ER7LkNz>I&9y%1DeqWeV`i#L4>YzD4GhV*NMi8DwI`J!3`1h z4ljrfFhK$=c3UtUGX5U8l2cLxYu0>s{S!|;_RN_xr}I3zHF;Ng1CCa#LY&2fUQ*|u@AwRr654;{P0zNMsVFfA|AQ}vaGFiO${^RavAAIoPHnD%i zBxaQFKU|t$Yj+^pY(|{T3W6{!CW`#5B&4t)Bu5hrHXA}p5GI2FrYZ2boH(#+?+1Gh z9fQISPhGic?bDZBJYmUqt2WFzpVs8TLx$}-b*e1)UkjdH^xg7rE^P_x*m%4G#^a|U z2m%zw5CQ`ijgVy%G^XSIk3M<(#|`UNjGr*cfj@!8#l>q44fQu1EZX<_@)ciC-?3x+ zaHA|Mf+#D2aL9P&$QsEoVA)>T;qj zb-Bkz(G4ZckXh$XU~EYix&Jb(jc)hvA=qz`J;31U-Ic^pIy(X z2&QY`0dHRaK0T1uArq#kD8$6Xz|HN@y*~8lnu%UraxkP{0qnsLl&~5RBw$LU)Vie+ z0wwKgZglO^wF1C{03IwlSk!&b?ma`dtY3TSs?9q_iiBCSQxcJ#-2pwv3gF}QMiGa{b8>S1`zJ2$wFTeO~`iv{D`s)1I+u|4^$!V*6 zJ})ULEloIe`c&tN)2Bx4+_n9=W2I&Ax*X65U^bdD`=(o`-?As7TQg|TkovdZUON50 z2k!ssv`0nrnoY>weFzqt4X$7i^-Ya~4<9+044}-m)q4?<00sx=gdduw}?Ay0@&w>~KHE;cfAEt2VHcldR(l(o|YV4SC z>+vVIx8Hgr|L*(mo|iy@^3rm2?A8Ox$w?5jFdQv*?BBN^&D>P;);k|e&+pd#^!b3< z>9m_}n|=NF*W7U3NKIp~P=fX|Ophf1*Lz+RM9*C41< zKnFz8h`9Lpc0vC$?XsEgfB4Dg*ETfOXXq-&mW{g+8=HumT&4@9H6^J6cKZ&!Q8k&=2G++PaGVuCjmMzhO>phiJu zBV>udB#X#Q&uBBwe*pN8A9CVEN$%K*V~+a+Ap>Kqm5&t=R1I;m0m%t5NKHvZT2cxO z1{uU4!{>0L{M0ENtg1!`BB%gpstOSze%!dZcb~rf4!76Es;FrHfMv_xcxvT$t1k$6 zTo5!JI;Egg1Ox$)L})sLBmi4CZS7G|(EHf=zG;md(C5g$qlbGE(Ew4BK@rIe35UY4 zTBDR7H*6d@VBnztvClvM;@zPs+}?1#_S&L5ADut%B~7CuVLIYu z9m59oMX&w?V7A49Qvo0x;gAAva|>!Kt8lEW3}@=<5Y!2D&Os>wD8*Y#mfn8ll~=dP z)QCqP`RA)kmMyzO(-?HFgJ>GejGfyUL@Gptei((yR0LHG9!|j-g^_T`go6-+uee_y^`bw6L+Mr9k2;R89d^0|=lo z6`biHf&>UM1WsV1VI;>z!62KVYaH&N0&iGDKvAHBL6#*99Xf35qD8Mx&&|ngZd(Ue zhv}}n?s)I})hn(P34zIEhC!A9Du6Q%RZ*a*Dl}C?NN3Om3a+ToG#!FSVYXNxn@rA_ zXqziOCAF?wmoCSK4jxiCY}kk&bFy>V%t7|KXC8lZ!J?OL(RBumb4Z}z5mjm!!a>AZ zO-M^hLQ-5ZY-SmnMB(%LaJupgPBz%V3}$c!Xqt{FlY}i>3Ju-67bxfB`n>ebS08x( z`Db2m`Ga7Z7RlskJzWV@h9C(Dsv$5{$G6LuCrq3;`A;3t{!iB2+$7JOdD)762Z|@_ z0A!;CvrM3<8k7(N*EMwO-lcH&uA-4`8Hd;7mPQWfrqtM70K`^qa3B;`pz1(gPDbS$ zOP2j@_=wRv{;$t_z0_*8vh%sGXV1R=gD<{beyu17&{Z9R7KT9r(h}m35|@bBm>3w0 zBABkjr)W?V1z;MuK?Y+COw$n#2H|$P(d>5N-OpEEJa+5_?Y_LW{M4z8#fumHbHln- zm$%ebrdeef8Oce=$jd@(QZht?3^m|IQSmWce$`En{`0|kPq%eUo7R6n?AiP0ylsoK zbyb-Fr^kzWdo!GFKU5I(EGQ`5v3*Z|TgUO;S07xr;{8SMCuC&7ry1b#2N2dHRGgAX z!37aMhZ{$Z6r*!qHU@Xi2MYz^4tU{ly5M)a(ByQZ-sOWsVIeh$uDX5%M;zRTqhJ2EqYL zl-d8?%2gu=4jf$cXW7d<9uH|~Y%r^eB4lKA@Y!s(|FWKsA3vJ!-g5wi03tMiafBHI zh=Bh6dV1Ea+Z4ytJ|Qy@x~ zAR9$^lrXz|=HK6W__1g1OZpwF|9)%RylKO@X;)1Bkr5eG6dyR>W@Z3_2wi6g zh84J69yB!8!)%K|;hz0MdU}U8e`YKzD@zFk{g&qzJp0Vr6<=S;RSwDlB1Wiyp#mA% z*K+fPHoZA?wHs(d*_awOYXSiA1`EOW&J-n?&|95VxN8XnWv5x zAMPU=B+VZPSd>7(Y%-YxLk17p{=&jn?*6koMy5=;V140^9TP-Rg03l0H67p-DM?8c zbLT%g|HkWYY?neCPdqvQiG?q}^pGftvLJ|1G!;@fjNF(QWM`(sXfi@kgQ%=)LQS0u zVKt19C_svdMP^b8j7DP!l)!2=yIy~F$;eI}JD+T;Sl6vvZF_s!o3oFdC>={gY6d3* znp^B9UDYF0#?ZhS1=n;i!XZf_IAf7bk++KfQ3^sR00zPt1d-zAn{NI{)0ot?YyPTP zH{A5;ABC^3t~P4x*3IMAe!u$CO`Eok))g&>5kLcj#xxj2Lup1@dQDA3U4{}0bQPdO zpcI@7&;V$RfD)j4=Z>dl-Eh;3S6p%BTd}ciQ|!~_avD~w{N}0yhYt0xs;tNh1_Bl} ztQdmfuuKR*1j;OCi$5VTp(!ajxvrpl&qLXnS!bdwR(EV%tTQ1Yp(#E-!Qa;B=l*?r zhg4Ra$yb>!5fI(wb|+TX)^sc{KUuJE&#wM0O^u+GKwvsJAz&2X5W$E6gm7>~s1UB6 zamB66mcDyl^SqXqm*u?w-m-^2|Ky|DZhr_mXORFUk8ngY4kX0KmTlQsn4g)IeO^0v z|F`SN&9iTMt8ho*NKS<`i&2EmID#P!OjB^(->-h`_}7Me)QGyOH~%B zUf_&FmIUqc%cg$*$h;>X$jr=c_%rvj&*!7xez)?k1_VOdtRkAj<;Qt^HxxfB}Pdo-gg=cDu!|zFq$JR~Ik7 z|MZEne2M5(5(H3zK+_nE7OQ{F4?p%R=-KN;d%*M2hwoqU==_IA27~@A4$49-a%t?4 zkyiZK$Dh4d(6iuFTgPzxXmRJuCyhU<2fR|0#Q>wp3@VC%9-%k$>l)m_5W9S{&n!l4wAWE@Zc1d<@YXpo$F**Pa4oICH4i4!jT@vq(Om$rM?j`aDD z&8^vAbQqedf=~($KxYgI@o_k?w@64xNNkg51-rdPx@GpP?>21Oc%dMOu*eabQlFxD zZ@gjF(wAR;?Sa2~_AOaCv7_4 zaF>;p=3Y2?;!(HTYm$s|WYu5!{mN#vYQp+XkLtv{~c zG`^sqm)0JzyuIvoK6n1S2nz+F5&fUmEU=#WT~JuKr%jfp{{Q|cr_*U@Xlw}8)KsIf zr5PTV8+NAyPKOggUjS9r6|j3;7%^lR<~{PLY>T$3=hNaT#R)eY~$uTiHI=WdTWXArzdrc?H%P){kCRZpFilG2h zri7huXo7w7ct+ppsA zp`y$$zxup#^VV&stE&Ma9I_-KJuMZNUq17mIdkrM`L7w@_N~R{Ten^rC zTa*nKPQEB>#*DvJ{WW_2XIr`Q>+vtYws=EJQv*anf;lP*BZdvfKkmH8mY&|h)7HP= z<8~QdS@f?^;r4CF?br!J1`R_&?>@bH_vwG+uipKom6xB);Dl6zbNB-RI2?B9ng#*_ z4ubgjcmNzFCC732$YE4gR-&b)1wOwIT3E%{v7+X+xMO=E z>KYpm3x)&u)?@4~^uhe1IR8*76tE)Fqq@fbCH z1iI#TN7;!|g!}=-CL|y&IR&;D8{*;f$Axr%bu@WSgH4`}XuaeE9H@6DLa0sZ(e4>{-xj$dF-w?Q#Df z?2&m7@f|x05ekG53@b33jF>#>V$7LyhdC}T?!28pr6)>rSFTuo>QM0^)YaA^s6^a^ zB$6zF4q4e4JYX<7cJ6}QoLr=)q!?pjV#4QB8~A)a+R)gj+wFEZoetPrTHy0~P+MDz zCWjMtdka)01ee=|U^om#Q9%d+6$F5BQ0Ta2_N{$yoHhGkd&B+_>fTA2sj3g!|D2a$gCDAAv zlis{wNIYmF{)~Di#)B6&9r3WKP4M2Gj8;sx+e6VjD zKA;GP%b}Xnz1G_jr}@?yOGYc`PGh%HX?-WPJ1uT6SLI-;9TgUg+hQk-j0vbV=7x&v ztX&)RU1=0kpwRXVKv+_O#g-DN+;SZDIt46&;1c?W3j|PHrgUfmYQ$b{$T+F-?pM@6 zDDz`?SzTK=(nXa*Ij0-wnm+sEF^vuY?+(K$8kkc&-SFLXiZ_N?{|BcyAmBSqX>58kkbRtD%5GeXWNO}h$C14CjO zFj7vwUKEmXSxn)!j6mM+^vPJ+{flg_oOBvizO7qXgIX(F3c3kT0f-e~HRVE6ER3|6 zhV3BvRu!?RXsQLW3`W|y(~?&xB67;tiljiCH90XV^_nZ{Hao><4(@&}5w)&yvUSgd zVNW=#+p}DG7x63Cm^8QY@b%H=56{6P6P#QY>E} zFI%S83Cq`GGAw&elf{_n7;2|kfmV|cd`iAKE2~NMskwuAxftgCbwP;&`w^Y;N@1si zIC5koBqQb*SwSei%iim2#d094N~=zWafJ6nViju5mZUI$V4X7|i7QfdvMS?A1;}_$ zrx`+XYvPY$70fD7Hfvcj2J$(XF(ET$gI^^Qv8R=IQeLy;^O^GH8!=)5E>|SI)-2Sv zLs{!Wwy{^kjFu}jM2BiYZ!ZjlEBnE*ZxYJ(j*!{ovn6`t1z&V!_p1EpsG#{3?(%GE zod(!4jDPc^DO=)7FYs*1qnu6caXVBb(8r#1l;Y6w7qAqEt%Z4b>Xn3MO6tj_(KGID zem4OvrW^7Qpa*h20@#$h7n^dq+0>Go8>M1wSOVHpOKy$L8xa6+b?6lAVV#>DWCK?k zdu=tXZ0S%$W>(^nC+?J@!yKg|3j3GAfxK|IF78auNa&*ECJ9}9;*RQO2GcOT20XCniB zeaNkO4MNw6o+!NwyN{y+M-vXWF=)YaFD@=V#_<8?cX4P*NI*AqK_?u7ICMZe#2^Y0 zXoE1+1^iGK1V01;XMrFz_@N;PjeckhLX#hwf)HfCIL9~m9{cr$8DOiUy=c<^T8#l)NO1P2q;y9ci(&g{-^>HZWB<c{AU8-}}Bdv-E-8 zc**+vV$uF+@ zNLc&&L0Xk(VS1WZvKa-+AQJ0=WX)J-HGD895ER@Xn$ma~NB!%1mX) zvodTu)qx`hB^PYLL*q(^vEBj#PM#DvpcThNC2(i-s+x@T4Mzrt`VyC5938GX&g7@W zJq_9>5=bf@>Ww7G4**_73$+J0gQpFHhh5^SzQ9uv3pWZa*loIyA{=7;78a7|tvGD5 z@VQJZxK&#yRxq@o_uN$*qM?m#G-MM8T5D>zR_pzXJjWJ1M$cc+YDJ)Ap>z_;d})s~ zFf|y=Q`YlN-VQ3tnbq22~{-AQMCop zdWdL)__*TwIt$~O=I1p6-F&5~8*z#IHm9zkmE@c!N#z~gA*BLwC@Hi!vqECJoz_Qx zS+wqZm|sasXy4end2=qBm~PqYRdN{9$#Mc20^1K2k@QAmlfoRdsX!FwqPcqy3wnpv}C#{EOD)LUFTZJ+kgAc6*^ z`*LM|%yN+L8QPqG$Bog0255OPtD5Huq6nC__-6nc-Iveg0uR^Ez1B=isME#t?x{` z)E6N4hvQDVQFYnKVQUtPRwtrv`GJK9?kD=Vyu$U+4%Aa3Sm34#y0Z1frN24iBmV&s CsKaLf diff --git a/src/AnimationCanvas.cpp b/src/AnimationCanvas.cpp index bf784d81..cbb806d7 100644 --- a/src/AnimationCanvas.cpp +++ b/src/AnimationCanvas.cpp @@ -56,6 +56,17 @@ void AnimationCanvas::CreateControls() SetSizer(topSizer); } +bool AnimationCanvas::GetUseSprites() const +{ + return CalChartConfiguration::GetGlobalConfig().Get_UseSprites(); +} + +void AnimationCanvas::SetUseSprites(bool useSprites) +{ + CalChartConfiguration::GetGlobalConfig().Set_UseSprites(useSprites); + Refresh(); +} + void AnimationCanvas::SetZoomOnMarchers(bool zoomOnMarchers) { mZoomOnMarchers = zoomOnMarchers; diff --git a/src/AnimationCanvas.h b/src/AnimationCanvas.h index b9fa9709..7d40f4f7 100644 --- a/src/AnimationCanvas.h +++ b/src/AnimationCanvas.h @@ -35,13 +35,15 @@ class AnimationCanvas : public wxPanel { ~AnimationCanvas() override = default; void OnUpdate(); // Refresh from the View - void SetView(AnimationView* view) { mView = view; } auto GetView() const { return mView; } + void SetView(AnimationView* view) { mView = view; } - void SetZoomOnMarchers(bool zoomOnMarchers); + bool GetUseSprites() const; + void SetUseSprites(bool useSprites); auto GetZoomOnMarchers() const { return mZoomOnMarchers; } - void SetStepsOutForMarchersZoom(int steps); + void SetZoomOnMarchers(bool zoomOnMarchers); auto GetStepsOutForMarchersZoom() const { return mStepsOutForMarcherZoom; } + void SetStepsOutForMarchersZoom(int steps); private: void Init(); diff --git a/src/AnimationPanel.cpp b/src/AnimationPanel.cpp index 77287f06..632e69f4 100644 --- a/src/AnimationPanel.cpp +++ b/src/AnimationPanel.cpp @@ -109,6 +109,14 @@ void AnimationPanel::CreateControls() AddToSizerBasic(boxsizer, mTempoCtrl); mItemsToHide.push_back(mTempoCtrl); + mSpritesCheckbox = new wxCheckBox(this, wxID_ANY, wxT("Sprites")); + mSpritesCheckbox->Bind(wxEVT_CHECKBOX, [this](wxCommandEvent& event) { + mCanvas->SetUseSprites(event.IsChecked()); + }); + mSpritesCheckbox->SetValue(mCanvas->GetUseSprites()); + AddToSizerBasic(toprow, mSpritesCheckbox); + mItemsToHide.push_back(mSpritesCheckbox); + auto sizer1 = new wxBoxSizer(wxVERTICAL); mZoomCheckbox = new wxCheckBox(this, wxID_ANY, wxT("Zoom")); mZoomCheckbox->Bind(wxEVT_CHECKBOX, [this](wxCommandEvent& event) { @@ -183,6 +191,7 @@ void AnimationPanel::OnCmd_ToggleAnimOmni(wxCommandEvent& event) mShowOmni = !mShowOmni; if (mShowOmni) { mCanvas->Hide(); + mSpritesCheckbox->Hide(); mZoomCheckbox->Hide(); mCollisionCheckbox->Hide(); mOmniCanvas->Show(); @@ -190,6 +199,7 @@ void AnimationPanel::OnCmd_ToggleAnimOmni(wxCommandEvent& event) mAnimateOmniToggle->SetLabel(wxT("Animate")); } else { mCanvas->Show(); + mSpritesCheckbox->Show(); mZoomCheckbox->Show(); mCollisionCheckbox->Show(); mOmniCanvas->Hide(); diff --git a/src/AnimationPanel.h b/src/AnimationPanel.h index 9e1a1db0..0f7863f4 100644 --- a/src/AnimationPanel.h +++ b/src/AnimationPanel.h @@ -54,6 +54,7 @@ class AnimationPanel : public wxPanel { void ToggleTimer(); void UpdatePanel(); // specfically to update the controls bool OnBeat() const; + auto TimerOn() const { return mTimerOn; } auto GetInMiniMode() const { return mInMiniMode; } void SetInMiniMode(bool); @@ -82,6 +83,7 @@ class AnimationPanel : public wxPanel { wxStaticText* mTempoLabel{}; wxSpinCtrl* mTempoCtrl{}; wxSlider* mBeatSlider{}; + wxCheckBox* mSpritesCheckbox{}; wxCheckBox* mZoomCheckbox{}; wxCheckBox* mCollisionCheckbox{}; wxBitmapToggleButton* mPlayPauseButton{}; diff --git a/src/AnimationView.cpp b/src/AnimationView.cpp index a3cce449..ca42c823 100644 --- a/src/AnimationView.cpp +++ b/src/AnimationView.cpp @@ -51,6 +51,28 @@ AnimationView::AnimationView(CalChartView* view, wxWindow* frame) : mView(view) { SetFrame(frame); + +#if defined(__APPLE__) && (__APPLE__) + const static wxString kImageDir = wxT("CalChart.app/Contents/Resources/default_sprite_strip.png"); +#else + const static wxString kImageDir = wxFileName(wxStandardPaths::Get().GetExecutablePath()).GetPath().Append(PATH_SEPARATOR wxT("resources") PATH_SEPARATOR wxT("default_sprite_strip.png")); +#endif + constexpr auto image_X = 64; + constexpr auto image_Y = 128; + auto image = [](){ + wxImage image; + if (!image.LoadFile(kImageDir)) { + wxLogError(wxT("Couldn't load image from ") + kImageDir + wxT(".")); + return image; + } + return image; + }(); + // now slice up all the images + auto points = std::vector(mSpriteImages.size()); + std::iota(points.begin(), points.end(), 0); + std::transform(points.begin(), points.end(), mSpriteImages.begin(), [&image](auto i) { + return image.GetSubImage({ i*image_X + 0, 0, image_X, image_Y }); + }); } AnimationView::~AnimationView() @@ -65,79 +87,114 @@ void AnimationView::OnDraw(wxDC* dc) void AnimationView::OnDraw(wxDC& dc, CalChartConfiguration const& config) { + if (!mAnimation) { + // no animation, our job is done. + return; + } dc.SetPen(config.Get_CalChartBrushAndPen(COLOR_FIELD_DETAIL).second); DrawMode(dc, config, mView->GetShowMode(), ShowMode_kAnimation); + auto useSprites = config.Get_UseSprites(); + if (useSprites) { + return OnDrawSprites(dc, config); + } + return OnDrawDots(dc, config); +} + +void AnimationView::OnDrawDots(wxDC& dc, CalChartConfiguration const& config) +{ auto checkForCollision = mDrawCollisionWarning; - if (mAnimation) { - for (auto i = 0; i < mView->GetNumPoints(); ++i) { - auto info = mAnimation->GetAnimateInfo(i); - - if (checkForCollision && info.mCollision) { - if (info.mCollision == CalChart::Coord::COLLISION_WARNING) { - auto brushAndPen = config.Get_CalChartBrushAndPen(COLOR_POINT_ANIM_COLLISION_WARNING); - dc.SetBrush(brushAndPen.first); - dc.SetPen(brushAndPen.second); - } else if (info.mCollision == CalChart::Coord::COLLISION_INTERSECT) { - auto brushAndPen = config.Get_CalChartBrushAndPen(COLOR_POINT_ANIM_COLLISION); - dc.SetBrush(brushAndPen.first); - dc.SetPen(brushAndPen.second); - } - } else if (mView->IsSelected(i)) { - switch (info.mDirection) { - case CalChart::ANIMDIR_SW: - case CalChart::ANIMDIR_W: - case CalChart::ANIMDIR_NW: { - auto brushAndPen = config.Get_CalChartBrushAndPen(COLOR_POINT_ANIM_HILIT_BACK); - dc.SetBrush(brushAndPen.first); - dc.SetPen(brushAndPen.second); - } break; - case CalChart::ANIMDIR_SE: - case CalChart::ANIMDIR_E: - case CalChart::ANIMDIR_NE: { - auto brushAndPen = config.Get_CalChartBrushAndPen(COLOR_POINT_ANIM_HILIT_FRONT); - dc.SetBrush(brushAndPen.first); - dc.SetPen(brushAndPen.second); - } break; - default: { - auto brushAndPen = config.Get_CalChartBrushAndPen(COLOR_POINT_ANIM_HILIT_SIDE); - dc.SetBrush(brushAndPen.first); - dc.SetPen(brushAndPen.second); - } - } - } else { - switch (info.mDirection) { - case CalChart::ANIMDIR_SW: - case CalChart::ANIMDIR_W: - case CalChart::ANIMDIR_NW: { - auto brushAndPen = config.Get_CalChartBrushAndPen(COLOR_POINT_ANIM_BACK); - dc.SetBrush(brushAndPen.first); - dc.SetPen(brushAndPen.second); - } break; - case CalChart::ANIMDIR_SE: - case CalChart::ANIMDIR_E: - case CalChart::ANIMDIR_NE: { - auto brushAndPen = config.Get_CalChartBrushAndPen(COLOR_POINT_ANIM_FRONT); - dc.SetBrush(brushAndPen.first); - dc.SetPen(brushAndPen.second); - } break; - default: { - auto brushAndPen = config.Get_CalChartBrushAndPen(COLOR_POINT_ANIM_SIDE); - dc.SetBrush(brushAndPen.first); - dc.SetPen(brushAndPen.second); - } - } + for (auto info : mAnimation->GetAllAnimateInfo()) { + if (checkForCollision && info.mCollision) { + if (info.mCollision == CalChart::Coord::COLLISION_WARNING) { + auto brushAndPen = config.Get_CalChartBrushAndPen(COLOR_POINT_ANIM_COLLISION_WARNING); + dc.SetBrush(brushAndPen.first); + dc.SetPen(brushAndPen.second); + } else if (info.mCollision == CalChart::Coord::COLLISION_INTERSECT) { + auto brushAndPen = config.Get_CalChartBrushAndPen(COLOR_POINT_ANIM_COLLISION); + dc.SetBrush(brushAndPen.first); + dc.SetPen(brushAndPen.second); + } + } else if (mView->IsSelected(info.index)) { + switch (info.mDirection) { + case CalChart::ANIMDIR_SW: + case CalChart::ANIMDIR_W: + case CalChart::ANIMDIR_NW: { + auto brushAndPen = config.Get_CalChartBrushAndPen(COLOR_POINT_ANIM_HILIT_BACK); + dc.SetBrush(brushAndPen.first); + dc.SetPen(brushAndPen.second); + } break; + case CalChart::ANIMDIR_SE: + case CalChart::ANIMDIR_E: + case CalChart::ANIMDIR_NE: { + auto brushAndPen = config.Get_CalChartBrushAndPen(COLOR_POINT_ANIM_HILIT_FRONT); + dc.SetBrush(brushAndPen.first); + dc.SetPen(brushAndPen.second); + } break; + default: { + auto brushAndPen = config.Get_CalChartBrushAndPen(COLOR_POINT_ANIM_HILIT_SIDE); + dc.SetBrush(brushAndPen.first); + dc.SetPen(brushAndPen.second); + } } - auto position = info.mPosition; - auto x = position.x + mView->GetShowMode().Offset().x; - auto y = position.y + mView->GetShowMode().Offset().y; - auto drawPosition = fDIP(wxPoint(x, y)); - auto rectangleSize = fDIP(wxSize(Int2CoordUnits(1), Int2CoordUnits(1))); + } else { + switch (info.mDirection) { + case CalChart::ANIMDIR_SW: + case CalChart::ANIMDIR_W: + case CalChart::ANIMDIR_NW: { + auto brushAndPen = config.Get_CalChartBrushAndPen(COLOR_POINT_ANIM_BACK); + dc.SetBrush(brushAndPen.first); + dc.SetPen(brushAndPen.second); + } break; + case CalChart::ANIMDIR_SE: + case CalChart::ANIMDIR_E: + case CalChart::ANIMDIR_NE: { + auto brushAndPen = config.Get_CalChartBrushAndPen(COLOR_POINT_ANIM_FRONT); + dc.SetBrush(brushAndPen.first); + dc.SetPen(brushAndPen.second); + } break; + default: { + auto brushAndPen = config.Get_CalChartBrushAndPen(COLOR_POINT_ANIM_SIDE); + dc.SetBrush(brushAndPen.first); + dc.SetPen(brushAndPen.second); + } + } + } + auto position = info.mPosition; + auto x = position.x + mView->GetShowMode().Offset().x; + auto y = position.y + mView->GetShowMode().Offset().y; + auto drawPosition = fDIP(wxPoint(x, y)); + auto rectangleSize = fDIP(wxSize(Int2CoordUnits(1), Int2CoordUnits(1))); + + dc.DrawRectangle(drawPosition - rectangleSize / 2, rectangleSize); + } +} - dc.DrawRectangle(drawPosition - rectangleSize / 2, rectangleSize); +void AnimationView::OnDrawSprites(wxDC& dc, CalChartConfiguration const& config) +{ + auto scale = config.Get_SpriteBitmapScale(); + constexpr auto comp_X = 0.5; + auto comp_Y = config.Get_SpriteBitmapOffsetY(); + + for (auto info : mAnimation->GetAllAnimateInfo()) { + auto image_offset = !GetAnimationFrame()->TimerOn() ? 0 : OnBeat() ? 1 : 2; + auto image_index = static_cast(info.mDirection) + image_offset * 8; + auto image = mSpriteImages[image_index]; + image = image.Scale(image.GetWidth()*scale, image.GetHeight()*scale); + if (mView->IsSelected(info.index)) { + image = image.ConvertToGreyscale(); } + + auto position = info.mPosition; + auto x = position.x + mView->GetShowMode().Offset().x; + auto y = position.y + mView->GetShowMode().Offset().y; + auto drawPosition = fDIP(wxPoint(x, y)); + auto rectangleSize = fDIP(wxSize(image.GetWidth()*comp_X , image.GetHeight()*comp_Y)); + + dc.DrawBitmap (image, drawPosition - rectangleSize); } } + void AnimationView::OnUpdate(wxView* sender, wxObject* hint) { super::OnUpdate(sender, hint); diff --git a/src/AnimationView.h b/src/AnimationView.h index 12934372..de85335b 100644 --- a/src/AnimationView.h +++ b/src/AnimationView.h @@ -23,6 +23,7 @@ #include "draw_utils.h" #include +#include #include class AnimationPanel; @@ -45,6 +46,8 @@ class AnimationView : public wxView { void OnDraw(wxDC* dc) override; void OnDraw(wxDC& dc, CalChartConfiguration const& config); + void OnDrawDots(wxDC& dc, CalChartConfiguration const& config); + void OnDrawSprites(wxDC& dc, CalChartConfiguration const& config); void OnUpdate(wxView* sender, wxObject* hint = (wxObject*)nullptr) override; void PrevBeat(); @@ -90,4 +93,13 @@ class AnimationView : public wxView { std::unique_ptr mAnimation; bool mDrawCollisionWarning = true; bool mPlayCollisionWarning = false; + + enum ImageBeat { + Standing, + Right, + Left, + Size + }; + + std::array mSpriteImages; }; diff --git a/src/CalChartFrame.cpp b/src/CalChartFrame.cpp index 9bcd433e..1f370766 100644 --- a/src/CalChartFrame.cpp +++ b/src/CalChartFrame.cpp @@ -40,7 +40,7 @@ #include "cc_coord.h" #include "cc_fileformat.h" #include "cc_point.h" -#include "cc_preferences_ui.h" +#include "CalChartPreferences.h" #include "cc_sheet.h" #include "cc_show.h" #include "ccvers.h" diff --git a/src/CalChartPreferences.cpp b/src/CalChartPreferences.cpp new file mode 100644 index 00000000..6ad34e38 --- /dev/null +++ b/src/CalChartPreferences.cpp @@ -0,0 +1,111 @@ +/* + * CalChartPreferences.cpp + * Dialox box for preferences + */ + +/* + Copyright (C) 1995-2011 Garrick Brian Meeker, Richard Michael Powell + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#include "CalChartPreferences.h" +#include "PreferencesContCellSetup.h" +#include "PreferencesDrawingSetup.h" +#include "PreferencesGeneralSetup.h" +#include "PreferencesPSPrintingSetup.h" +#include "PreferencesShowModeSetup.h" +#include "PreferencesUtils.h" + +// how the preferences work: +// preference dialog create a copy of the CalChart config from which to read and +// set values +// CalChart config doesn't automatically write values to main config, it must be +// flushed +// out when the user presses apply. +// first page will be general settings: +// Auto save behavior: file location, time +// second page is Drawing preferences for edit menu +// Color preferences +// second page is PS printing settings +// 3rd page is Show mode setup +// +// organized into pages. Each page is responsible for reading out +// on TransferDataToWindow, caching the values locally, and +// setting them to the system on TransferDataFromWindow + +//////////////// + +BEGIN_EVENT_TABLE(CalChartPreferences, wxDialog) +EVT_BUTTON(wxID_RESET, CalChartPreferences::OnCmdResetAll) +END_EVENT_TABLE() + +IMPLEMENT_CLASS(CalChartPreferences, wxDialog) + +CalChartPreferences::CalChartPreferences(wxWindow* parent, wxWindowID id, const wxString& caption, const wxPoint& pos, const wxSize& size, long style) + : wxDialog(parent, id, caption, pos, size, style) + , mConfig(CalChartConfiguration::GetGlobalConfig()) +{ + auto topsizer = new wxBoxSizer(wxVERTICAL); + SetSizer(topsizer); + + mNotebook = new wxNotebook(this, wxID_ANY); + topsizer->Add(mNotebook, BasicSizerFlags()); + + mNotebook->AddPage(new GeneralSetup(mConfig, mNotebook, wxID_ANY), wxT("General")); + mNotebook->AddPage(new ContCellSetup(mConfig, mNotebook, wxID_ANY), wxT("Continuity")); + mNotebook->AddPage(new DrawingSetup(mConfig, mNotebook, wxID_ANY), wxT("Drawing")); + mNotebook->AddPage(new PSPrintingSetUp(mConfig, mNotebook, wxID_ANY), wxT("PS Printing")); + mNotebook->AddPage(new ShowModeSetup(mConfig, mNotebook, wxID_ANY), wxT("Show Mode Setup")); + + // the buttons on the bottom + wxBoxSizer* okCancelBox = new wxBoxSizer(wxHORIZONTAL); + topsizer->Add(okCancelBox, BasicSizerFlags()); + + okCancelBox->Add(new wxButton(this, wxID_APPLY), BasicSizerFlags()); + okCancelBox->Add(new wxButton(this, wxID_RESET, wxT("&Reset All")), BasicSizerFlags()); + okCancelBox->Add(new wxButton(this, wxID_OK), BasicSizerFlags()); + okCancelBox->Add(new wxButton(this, wxID_CANCEL), BasicSizerFlags()); + + // This fits the dalog to the minimum size dictated by the sizers + GetSizer()->Fit(this); + // This ensures that the dialog cannot be smaller than the minimum size + GetSizer()->SetSizeHints(this); + Center(); +} + +bool CalChartPreferences::TransferDataToWindow() { return true; } + +bool CalChartPreferences::TransferDataFromWindow() +{ + // transfer everything to the config... + size_t pages = mNotebook->GetPageCount(); + for (size_t i = 0; i < pages; ++i) { + PreferencePage* page = static_cast(mNotebook->GetPage(i)); + page->TransferDataFromWindow(); + } + CalChartConfiguration::AssignConfig(mConfig); + return true; +} + +void CalChartPreferences::OnCmdResetAll(wxCommandEvent&) +{ + // transfer everything to the config... + size_t pages = mNotebook->GetPageCount(); + for (size_t i = 0; i < pages; ++i) { + PreferencePage* page = static_cast(mNotebook->GetPage(i)); + page->ClearValuesToDefault(); + } + CalChartConfiguration::AssignConfig(mConfig); +} diff --git a/src/cc_preferences_ui.h b/src/CalChartPreferences.h similarity index 100% rename from src/cc_preferences_ui.h rename to src/CalChartPreferences.h diff --git a/src/ColorSetupCanvas.cpp b/src/ColorSetupCanvas.cpp index 9e3309ce..1a09c140 100644 --- a/src/ColorSetupCanvas.cpp +++ b/src/ColorSetupCanvas.cpp @@ -1,5 +1,5 @@ /* - * cc_preferences_ui.cpp + * CalChartPreferences.cpp * Dialox box for preferences */ diff --git a/src/ColorSetupDialog.cpp b/src/ColorSetupDialog.cpp index 96176fe4..e9623a7c 100644 --- a/src/ColorSetupDialog.cpp +++ b/src/ColorSetupDialog.cpp @@ -1,5 +1,5 @@ /* - * cc_preferences_ui.cpp + * ColorSetupDialog.cpp * Dialox box for preferences */ @@ -56,8 +56,6 @@ using namespace CalChart; // out when the user presses apply. // convience sizers to change the view behavior in all at once. -static auto sBasicSizerFlags = wxSizerFlags().Border(wxALL, 2).Center().Proportion(0); -static auto sLeftBasicSizerFlags = wxSizerFlags().Border(wxALL, 2).Left().Proportion(0); static auto sRightBasicSizerFlags = wxSizerFlags().Border(wxALL, 2).Right().Proportion(0); static auto sExpandSizerFlags = wxSizerFlags().Border(wxALL, 2).Center().Proportion(0); @@ -124,12 +122,12 @@ void ColorSetupDialog::CreateControls() wxStaticBoxSizer* boxsizer = new wxStaticBoxSizer(new wxStaticBox(this, -1, wxT("Palette")), wxHORIZONTAL); topsizer->Add(boxsizer); - boxsizer->Add(new wxBitmapButton(this, BUTTON_EDIT_PALETTE_COLOR, CreateTempBitmap(mColorPaletteColors.at(mActiveColorPalette))), sBasicSizerFlags); + boxsizer->Add(new wxBitmapButton(this, BUTTON_EDIT_PALETTE_COLOR, CreateTempBitmap(mColorPaletteColors.at(mActiveColorPalette))), BasicSizerFlags()); - boxsizer->Add(new wxTextCtrl(this, PALETTE_NAME, mColorPaletteNames.at(mActiveColorPalette), wxDefaultPosition, wxDefaultSize, wxTE_PROCESS_ENTER), sBasicSizerFlags); + boxsizer->Add(new wxTextCtrl(this, PALETTE_NAME, mColorPaletteNames.at(mActiveColorPalette), wxDefaultPosition, wxDefaultSize, wxTE_PROCESS_ENTER), BasicSizerFlags()); - boxsizer->Add(new wxButton(this, BUTTON_EXPORT, wxT("&Export...")), sBasicSizerFlags); - boxsizer->Add(new wxButton(this, BUTTON_IMPORT, wxT("&Import...")), sBasicSizerFlags); + boxsizer->Add(new wxButton(this, BUTTON_EXPORT, wxT("&Export...")), BasicSizerFlags()); + boxsizer->Add(new wxButton(this, BUTTON_IMPORT, wxT("&Import...")), BasicSizerFlags()); boxsizer = new wxStaticBoxSizer(new wxStaticBox(this, -1, wxT("Color settings")), wxVERTICAL); topsizer->Add(boxsizer); @@ -137,7 +135,7 @@ void ColorSetupDialog::CreateControls() auto horizontalsizer = new wxBoxSizer(wxHORIZONTAL); nameBox = new wxBitmapComboBox(this, NEW_COLOR_CHOICE, mConfig.GetColorNames().at(0), wxDefaultPosition, wxDefaultSize, COLOR_NUM, mConfig.GetColorNames().data(), wxCB_READONLY | wxCB_DROPDOWN); - horizontalsizer->Add(nameBox, sBasicSizerFlags); + horizontalsizer->Add(nameBox, BasicSizerFlags()); for (CalChartColors i = COLOR_FIELD; i < COLOR_NUM; i = static_cast(static_cast(i) + 1)) { CreateAndSetItemBitmap(nameBox, i, mConfig.Get_CalChartBrushAndPen(i).first); @@ -146,14 +144,14 @@ void ColorSetupDialog::CreateControls() spin = new wxSpinCtrl(this, SPIN_WIDTH, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxSP_ARROW_KEYS, 1, 10, mCalChartPens[mActiveColorPalette][nameBox->GetSelection()].GetWidth()); spin->SetValue(mCalChartPens[mActiveColorPalette][nameBox->GetSelection()].GetWidth()); - horizontalsizer->Add(spin, sBasicSizerFlags); - boxsizer->Add(horizontalsizer, sLeftBasicSizerFlags); + horizontalsizer->Add(spin, BasicSizerFlags()); + boxsizer->Add(horizontalsizer, LeftBasicSizerFlags()); horizontalsizer = new wxBoxSizer(wxHORIZONTAL); - horizontalsizer->Add(new wxButton(this, BUTTON_SELECT, wxT("&Change Color")), sBasicSizerFlags); - horizontalsizer->Add(new wxButton(this, BUTTON_RESTORE, wxT("&Reset Color")), sBasicSizerFlags); - boxsizer->Add(horizontalsizer, sBasicSizerFlags); + horizontalsizer->Add(new wxButton(this, BUTTON_SELECT, wxT("&Change Color")), BasicSizerFlags()); + horizontalsizer->Add(new wxButton(this, BUTTON_RESTORE, wxT("&Reset Color")), BasicSizerFlags()); + boxsizer->Add(horizontalsizer, BasicSizerFlags()); auto prefCanvas = new ColorSetupCanvas(mConfig, this); // set scroll rate 1 to 1, so we can have even scrolling of whole field @@ -162,11 +160,11 @@ void ColorSetupDialog::CreateControls() // the buttons on the bottom wxBoxSizer* okCancelBox = new wxBoxSizer(wxHORIZONTAL); - topsizer->Add(okCancelBox, sBasicSizerFlags); + topsizer->Add(okCancelBox, BasicSizerFlags()); - okCancelBox->Add(new wxButton(this, wxID_RESET, wxT("&Reset")), sBasicSizerFlags); - okCancelBox->Add(new wxButton(this, wxID_OK), sBasicSizerFlags); - okCancelBox->Add(new wxButton(this, wxID_CANCEL), sBasicSizerFlags); + okCancelBox->Add(new wxButton(this, wxID_RESET, wxT("&Reset")), BasicSizerFlags()); + okCancelBox->Add(new wxButton(this, wxID_OK), BasicSizerFlags()); + okCancelBox->Add(new wxButton(this, wxID_CANCEL), BasicSizerFlags()); TransferDataToWindow(); } diff --git a/src/ContinuityComposerDialog.cpp b/src/ContinuityComposerDialog.cpp index a5f764f1..c22ae5f4 100755 --- a/src/ContinuityComposerDialog.cpp +++ b/src/ContinuityComposerDialog.cpp @@ -93,8 +93,6 @@ class ContinuityComposerPanel : public wxPanel { IMPLEMENT_CLASS(ContinuityComposerPanel, wxPanel) -static const auto sBasicSizerFlags = wxSizerFlags{}.Border(wxALL, 2).Center().Proportion(0); -static const auto sLeftBasicSizerFlags = wxSizerFlags{}.Border(wxALL, 2).Left().Proportion(0); static const auto sRightBasicSizerFlags = wxSizerFlags{}.Border(wxALL, 2).Right().Proportion(0); static const auto sExpandSizerFlags = wxSizerFlags{}.Border(wxALL, 2).Center().Proportion(0); @@ -612,9 +610,9 @@ ContinuityComposerDialog::ContinuityComposerDialog(std::unique_ptrAdd(button_sizer, sRightBasicSizerFlags); - button_sizer->Add(new wxButton(this, wxID_CANCEL, wxT("&Cancel")), sBasicSizerFlags); + button_sizer->Add(new wxButton(this, wxID_CANCEL, wxT("&Cancel")), BasicSizerFlags()); mCloseButton = new wxButton(this, wxID_OK, wxT("&Done")); - button_sizer->Add(mCloseButton, sBasicSizerFlags); + button_sizer->Add(mCloseButton, BasicSizerFlags()); mCloseButton->SetDefault(); mCloseButton->Enable(mPanel->Validate()); mPanel->SetOnUpdateIsValid([this](bool enable) { diff --git a/src/PreferencesContCellSetup.cpp b/src/PreferencesContCellSetup.cpp new file mode 100644 index 00000000..69f5cf5a --- /dev/null +++ b/src/PreferencesContCellSetup.cpp @@ -0,0 +1,254 @@ +/* + * CalChartPreferences.cpp + * Dialox box for preferences + */ + +/* + Copyright (C) 1995-2011 Garrick Brian Meeker, Richard Michael Powell + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#include "PreferencesContCellSetup.h" +#include "PreferencesUtils.h" +#include "ContinuityBrowserPanel.h" + +#include +#include +#include + + +enum { + BUTTON_SELECT = 1000, + BUTTON_RESTORE, + SPIN_WIDTH, + NEW_COLOR_CHOICE, + DOTRATIO, + NUMRATIO, + PLINERATIO, + SLINERATIO, + SPRITESCALE, + SPRITEHEIGHT, + BUTTON_EDIT_PALETTE_COLOR, + BUTTON_EDIT_PALETTE_NAME, + NEW_COLOR_PALETTE, +}; + + +enum { + CHECK_LongForm, + SPIN_Font_Size, + SPIN_Rouding, + SPIN_Text_Padding, + SPIN_Box_Padding, +}; + +BEGIN_EVENT_TABLE(ContCellSetup, PreferencePage) +EVT_CHECKBOX(CHECK_LongForm, ContCellSetup::OnCmdLongForm) +EVT_SPINCTRL(SPIN_Font_Size, ContCellSetup::OnCmdFontSize) +EVT_SPINCTRL(SPIN_Rouding, ContCellSetup::OnCmdRounding) +EVT_SPINCTRL(SPIN_Text_Padding, ContCellSetup::OnCmdTextPadding) +EVT_SPINCTRL(SPIN_Box_Padding, ContCellSetup::OnCmdBoxPadding) +EVT_BUTTON(BUTTON_SELECT, ContCellSetup::OnCmdSelectColors) +EVT_BUTTON(BUTTON_RESTORE, ContCellSetup::OnCmdResetColors) +EVT_COMBOBOX(NEW_COLOR_CHOICE, ContCellSetup::OnCmdChooseNewColor) +END_EVENT_TABLE() + +IMPLEMENT_CLASS(ContCellSetup, PreferencePage) + +template +static auto do_cloning(T const& cont) +{ + auto copied_cont = std::vector>{}; + for (auto&& i : cont.GetParsedContinuity()) { + copied_cont.emplace_back(i->clone()); + } + return copied_cont; +} + +ContCellSetup::ContCellSetup(CalChartConfiguration& config, wxWindow* parent, wxWindowID id, wxString const& caption, wxPoint const& pos, wxSize const& size, long style) + : PreferencePage(config) +{ + Init(); + Create(parent, id, caption, pos, size, style); +} + +void ContCellSetup::CreateControls() +{ + auto topsizer = new wxBoxSizer(wxVERTICAL); + SetSizer(topsizer); + + auto boxsizer = new wxStaticBoxSizer(new wxStaticBox(this, -1, wxT("Color settings")), wxVERTICAL); + topsizer->Add(boxsizer); + + auto horizontalsizer = new wxBoxSizer(wxHORIZONTAL); + boxsizer->Add(horizontalsizer, LeftBasicSizerFlags()); + nameBox = new wxBitmapComboBox(this, NEW_COLOR_CHOICE, mConfig.GetContCellColorNames().at(0), wxDefaultPosition, wxDefaultSize, COLOR_CONTCELLS_NUM, mConfig.GetContCellColorNames().data(), wxCB_READONLY | wxCB_DROPDOWN); + horizontalsizer->Add(nameBox, BasicSizerFlags()); + + for (auto i = 0; i < COLOR_CONTCELLS_NUM; ++i) { + CreateAndSetItemBitmap(nameBox, i, mConfig.Get_ContCellBrushAndPen(static_cast(i)).first); + } + nameBox->SetSelection(0); + + horizontalsizer = new wxBoxSizer(wxHORIZONTAL); + boxsizer->Add(horizontalsizer, LeftBasicSizerFlags()); + horizontalsizer->Add(new wxButton(this, BUTTON_SELECT, wxT("&Change Color")), BasicSizerFlags()); + horizontalsizer->Add(new wxButton(this, BUTTON_RESTORE, wxT("&Reset Color")), BasicSizerFlags()); + + horizontalsizer = new wxStaticBoxSizer(new wxStaticBox(this, -1, wxT("Cont Cell settings")), wxHORIZONTAL); + topsizer->Add(horizontalsizer); + + boxsizer = new wxStaticBoxSizer(new wxStaticBox(this, -1, wxT("Long form")), wxVERTICAL); + horizontalsizer->Add(boxsizer, BasicSizerFlags()); + auto checkbox = new wxCheckBox(this, CHECK_LongForm, wxT("Long form")); + checkbox->SetValue(mConfig.Get_ContCellLongForm()); + boxsizer->Add(checkbox, BasicSizerFlags()); + + boxsizer = new wxStaticBoxSizer(new wxStaticBox(this, -1, wxT("Font Size")), wxVERTICAL); + horizontalsizer->Add(boxsizer, BasicSizerFlags()); + auto spin = new wxSpinCtrl(this, SPIN_Font_Size, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxSP_ARROW_KEYS, 1, 30, mConfig.Get_ContCellFontSize()); + boxsizer->Add(spin, BasicSizerFlags()); + + boxsizer = new wxStaticBoxSizer(new wxStaticBox(this, -1, wxT("Rounding")), wxVERTICAL); + horizontalsizer->Add(boxsizer, BasicSizerFlags()); + spin = new wxSpinCtrl(this, SPIN_Rouding, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxSP_ARROW_KEYS, 1, 10, mConfig.Get_ContCellRounding()); + boxsizer->Add(spin, BasicSizerFlags()); + + boxsizer = new wxStaticBoxSizer(new wxStaticBox(this, -1, wxT("Text Padding")), wxVERTICAL); + horizontalsizer->Add(boxsizer, BasicSizerFlags()); + spin = new wxSpinCtrl(this, SPIN_Text_Padding, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxSP_ARROW_KEYS, 1, 10, mConfig.Get_ContCellTextPadding()); + boxsizer->Add(spin, BasicSizerFlags()); + + boxsizer = new wxStaticBoxSizer(new wxStaticBox(this, -1, wxT("Box Padding")), wxVERTICAL); + horizontalsizer->Add(boxsizer, BasicSizerFlags()); + spin = new wxSpinCtrl(this, SPIN_Box_Padding, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxSP_ARROW_KEYS, 1, 10, mConfig.Get_ContCellBoxPadding()); + boxsizer->Add(spin, BasicSizerFlags()); + + auto canvas = new ContinuityBrowserPanel(SYMBOL_PLAIN, mConfig, this); + topsizer->Add(canvas, 1, wxEXPAND); + auto basic_cont = CalChart::Continuity{ "ewns np\nX = distfrom(sp r2)\nmt (24-X)w\nmarch gv dist(np) dir(np) w\nmtrm e" }; + auto clonedOut = do_cloning(basic_cont); + clonedOut.emplace_back(std::make_unique(std::make_unique(), std::make_unique())); + canvas->DoSetContinuity(CalChart::Continuity{ std::move(clonedOut) }); + + TransferDataToWindow(); +} + +void ContCellSetup::Init() +{ + // first read out the defaults: + for (auto i = 0; i < COLOR_CONTCELLS_NUM; ++i) { + auto brushAndPen = mConfig.Get_ContCellBrushAndPen(static_cast(i)); + mContCellBrushes[i] = brushAndPen.first; + } +} + +bool ContCellSetup::TransferDataToWindow() +{ + return true; +} + +bool ContCellSetup::TransferDataFromWindow() +{ + return true; +} + +bool ContCellSetup::ClearValuesToDefault() +{ + mConfig.Clear_ContCellLongForm(); + mConfig.Clear_ContCellFontSize(); + mConfig.Clear_ContCellRounding(); + mConfig.Clear_ContCellTextPadding(); + mConfig.Clear_ContCellBoxPadding(); + + for (ContCellColors i = COLOR_CONTCELLS_PROC; i < COLOR_CONTCELLS_NUM; i = static_cast(static_cast(i) + 1)) { + SetColor(i, mConfig.GetContCellDefaultColors()[i]); + mConfig.Clear_ContCellConfigColor(i); + } + Init(); + TransferDataToWindow(); + return true; +} + +void ContCellSetup::OnCmdLongForm(wxCommandEvent& e) +{ + mConfig.Set_ContCellLongForm(e.IsChecked()); + Refresh(); +} + +void ContCellSetup::OnCmdFontSize(wxSpinEvent& e) +{ + mConfig.Set_ContCellFontSize(e.GetValue()); + Refresh(); +} + +void ContCellSetup::OnCmdRounding(wxSpinEvent& e) +{ + mConfig.Set_ContCellRounding(e.GetValue()); + Refresh(); +} + +void ContCellSetup::OnCmdTextPadding(wxSpinEvent& e) +{ + mConfig.Set_ContCellTextPadding(e.GetValue()); + Refresh(); +} + +void ContCellSetup::OnCmdBoxPadding(wxSpinEvent& e) +{ + mConfig.Set_ContCellBoxPadding(e.GetValue()); + Refresh(); +} + +void ContCellSetup::SetColor(int selection, const wxColour& color) +{ + auto pen = *wxThePenList->FindOrCreatePen(color, 1, wxPENSTYLE_SOLID); + mContCellBrushes[selection] = *wxTheBrushList->FindOrCreateBrush(color, wxBRUSHSTYLE_SOLID); + + mConfig.Set_ContCellBrushAndPen(static_cast(selection), mContCellBrushes[selection], pen); + + // update the namebox list + CreateAndSetItemBitmap(nameBox, selection, mContCellBrushes[selection]); + Refresh(); +} + +void ContCellSetup::OnCmdSelectColors(wxCommandEvent&) +{ + auto selection = nameBox->GetSelection(); + auto data = wxColourData{}; + data.SetChooseFull(true); + data.SetColour(mContCellBrushes[selection].GetColour()); + auto dialog = wxColourDialog(this, &data); + if (dialog.ShowModal() == wxID_OK) { + auto retdata = dialog.GetColourData(); + auto c = retdata.GetColour(); + SetColor(selection, c); + } + Refresh(); +} + +void ContCellSetup::OnCmdResetColors(wxCommandEvent&) +{ + auto selection = nameBox->GetSelection(); + SetColor(selection, mConfig.GetContCellDefaultColors()[selection]); + mConfig.Clear_ContCellConfigColor(static_cast(selection)); + Refresh(); +} + +void ContCellSetup::OnCmdChooseNewColor(wxCommandEvent&) +{ + Refresh(); +} + diff --git a/src/PreferencesContCellSetup.h b/src/PreferencesContCellSetup.h new file mode 100644 index 00000000..c47e717a --- /dev/null +++ b/src/PreferencesContCellSetup.h @@ -0,0 +1,64 @@ +#pragma once +/* + * cc_preferences.h + * Dialox box for preferences + */ + +/* + Copyright (C) 1995-2011 Garrick Brian Meeker, Richard Michael Powell + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#include "PreferencesUtils.h" + +/// Continuity Cell setup +/// Handles configurations parameters of Continuity input system +/// + +class wxBitmapComboBox; + +class ContCellSetup : public PreferencePage { + DECLARE_CLASS(ContCellSetup) + DECLARE_EVENT_TABLE() + +public: + ContCellSetup(CalChartConfiguration& config, wxWindow* parent, wxWindowID id = wxID_ANY, wxString const& caption = wxT("ContCell Setup"), wxPoint const& pos = wxDefaultPosition, wxSize const& size = wxDefaultSize, long style = wxCAPTION | wxRESIZE_BORDER | wxSYSTEM_MENU); + virtual ~ContCellSetup() = default; + + virtual void Init() override; + virtual void CreateControls() override; + + // use these to get and set default values + virtual bool TransferDataToWindow() override; + virtual bool TransferDataFromWindow() override; + virtual bool ClearValuesToDefault() override; + +private: + void OnCmdLongForm(wxCommandEvent&); + void OnCmdFontSize(wxSpinEvent&); + void OnCmdRounding(wxSpinEvent&); + void OnCmdTextPadding(wxSpinEvent&); + void OnCmdBoxPadding(wxSpinEvent&); + void OnCmdSelectWidth(wxSpinEvent&); + + void OnCmdSelectColors(wxCommandEvent&); + void OnCmdChooseNewColor(wxCommandEvent&); + void OnCmdResetColors(wxCommandEvent&); + void SetColor(int selection, const wxColour& color); + + // we can set up the Font, colors, size. + wxBitmapComboBox* nameBox; + wxBrush mContCellBrushes[COLOR_CONTCELLS_NUM]; +}; diff --git a/src/PreferencesDrawingSetup.cpp b/src/PreferencesDrawingSetup.cpp new file mode 100644 index 00000000..9b25583b --- /dev/null +++ b/src/PreferencesDrawingSetup.cpp @@ -0,0 +1,371 @@ +/* + * CalChartPreferences.cpp + * Dialox box for preferences + */ + +/* + Copyright (C) 1995-2011 Garrick Brian Meeker, Richard Michael Powell + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#include "PreferencesDrawingSetup.h" +#include "PreferencesUtils.h" +#include "CalChartDoc.h" +#include "CalChartSizes.h" +#include "ColorSetupCanvas.h" +#include "ContinuityBrowserPanel.h" +#include "ContinuityComposerDialog.h" +#include "cc_drawcommand.h" +#include "cc_shapes.h" +#include "cc_sheet.h" +#include "confgr.h" +#include "cont.h" +#include "draw.h" +#include "mode_dialog.h" +#include "mode_dialog_canvas.h" +#include "modes.h" + +#include +#include +#include +#include +#include +#include + +using namespace CalChart; + +enum { + BUTTON_SELECT = 1000, + BUTTON_RESTORE, + SPIN_WIDTH, + NEW_COLOR_CHOICE, + DOTRATIO, + NUMRATIO, + PLINERATIO, + SLINERATIO, + SPRITESCALE, + SPRITEHEIGHT, + BUTTON_EDIT_PALETTE_COLOR, + BUTTON_EDIT_PALETTE_NAME, + NEW_COLOR_PALETTE, +}; + +BEGIN_EVENT_TABLE(DrawingSetup, PreferencePage) +EVT_BUTTON(BUTTON_SELECT, DrawingSetup::OnCmdSelectColors) +EVT_BUTTON(BUTTON_RESTORE, DrawingSetup::OnCmdResetColors) +EVT_SPINCTRL(SPIN_WIDTH, DrawingSetup::OnCmdSelectWidth) +EVT_COMBOBOX(NEW_COLOR_CHOICE, DrawingSetup::OnCmdChooseNewColor) +EVT_COMBOBOX(NEW_COLOR_PALETTE, DrawingSetup::OnCmdChooseNewPalette) +EVT_TEXT_ENTER(DOTRATIO, DrawingSetup::OnCmdTextChanged) +EVT_TEXT_ENTER(NUMRATIO, DrawingSetup::OnCmdTextChanged) +EVT_TEXT_ENTER(PLINERATIO, DrawingSetup::OnCmdTextChanged) +EVT_TEXT_ENTER(SLINERATIO, DrawingSetup::OnCmdTextChanged) +EVT_TEXT_ENTER(SPRITESCALE, DrawingSetup::OnCmdTextChanged) +EVT_TEXT_ENTER(SPRITEHEIGHT, DrawingSetup::OnCmdTextChanged) +EVT_BUTTON(BUTTON_EDIT_PALETTE_COLOR, DrawingSetup::OnCmdChangePaletteColor) +EVT_BUTTON(BUTTON_EDIT_PALETTE_NAME, DrawingSetup::OnCmdChangePaletteName) +END_EVENT_TABLE() + +IMPLEMENT_CLASS(DrawingSetup, PreferencePage) + +void DrawingSetup::CreateControls() +{ + wxBoxSizer* topsizer = new wxBoxSizer(wxVERTICAL); + SetSizer(topsizer); + + wxStaticBoxSizer* boxsizer = new wxStaticBoxSizer(new wxStaticBox(this, -1, wxT("Palette Selector")), wxVERTICAL); + topsizer->Add(boxsizer); + + mPaletteNameBox = new wxBitmapComboBox(this, NEW_COLOR_PALETTE, mColorPaletteNames.at(0), wxDefaultPosition, wxSize(200, -1), kNumberPalettes, mColorPaletteNames.data(), wxCB_READONLY | wxCB_DROPDOWN); + boxsizer->Add(mPaletteNameBox, LeftBasicSizerFlags()); + + for (auto i = 0; i < kNumberPalettes; ++i) { + CreateAndSetItemBitmap(mPaletteNameBox, i, mColorPaletteColors.at(i)); + } + mPaletteNameBox->SetSelection(mActiveColorPalette); + + auto horizontalsizer = new wxBoxSizer(wxHORIZONTAL); + boxsizer->Add(horizontalsizer, BasicSizerFlags()); + + horizontalsizer->Add(new wxButton(this, BUTTON_EDIT_PALETTE_COLOR, wxT("&Edit Color")), BasicSizerFlags()); + horizontalsizer->Add(new wxButton(this, BUTTON_EDIT_PALETTE_NAME, wxT("&Edit Name")), BasicSizerFlags()); + + boxsizer = new wxStaticBoxSizer(new wxStaticBox(this, -1, wxT("Color settings")), wxVERTICAL); + topsizer->Add(boxsizer); + + horizontalsizer = new wxBoxSizer(wxHORIZONTAL); + nameBox = new wxBitmapComboBox(this, NEW_COLOR_CHOICE, mConfig.GetColorNames().at(0), wxDefaultPosition, wxDefaultSize, COLOR_NUM, mConfig.GetColorNames().data(), wxCB_READONLY | wxCB_DROPDOWN); + horizontalsizer->Add(nameBox, BasicSizerFlags()); + + for (CalChartColors i = COLOR_FIELD; i < COLOR_NUM; i = static_cast(static_cast(i) + 1)) { + CreateAndSetItemBitmap(nameBox, i, mConfig.Get_CalChartBrushAndPen(i).first); + } + nameBox->SetSelection(0); + + spin = new wxSpinCtrl(this, SPIN_WIDTH, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxSP_ARROW_KEYS, 1, 10, mCalChartPens[mActiveColorPalette][nameBox->GetSelection()].GetWidth()); + spin->SetValue(mCalChartPens[mActiveColorPalette][nameBox->GetSelection()].GetWidth()); + horizontalsizer->Add(spin, BasicSizerFlags()); + boxsizer->Add(horizontalsizer, LeftBasicSizerFlags()); + + horizontalsizer = new wxBoxSizer(wxHORIZONTAL); + + horizontalsizer->Add(new wxButton(this, BUTTON_SELECT, wxT("&Change Color")), BasicSizerFlags()); + horizontalsizer->Add(new wxButton(this, BUTTON_RESTORE, wxT("&Reset Color")), BasicSizerFlags()); + + boxsizer->Add(horizontalsizer, BasicSizerFlags()); + + boxsizer = new wxStaticBoxSizer(new wxStaticBox(this, -1, wxT("ratios")), wxVERTICAL); + topsizer->Add(boxsizer); + + horizontalsizer = new wxBoxSizer(wxHORIZONTAL); + boxsizer->Add(horizontalsizer, LeftBasicSizerFlags()); + + AddTextboxWithCaption(this, horizontalsizer, DOTRATIO, wxT("Dot Ratio:"), wxTE_PROCESS_ENTER); + AddTextboxWithCaption(this, horizontalsizer, NUMRATIO, wxT("Num Ratio:"), wxTE_PROCESS_ENTER); + AddTextboxWithCaption(this, horizontalsizer, PLINERATIO, wxT("P-Line Ratio:"), wxTE_PROCESS_ENTER); + AddTextboxWithCaption(this, horizontalsizer, SLINERATIO, wxT("S-Line Ratio:"), wxTE_PROCESS_ENTER); + + AddTextboxWithCaption(this, horizontalsizer, SPRITESCALE, wxT("Sprite Scale:"), wxTE_PROCESS_ENTER); + AddTextboxWithCaption(this, horizontalsizer, SPRITEHEIGHT, wxT("Sprite Height:"), wxTE_PROCESS_ENTER); + + auto prefCanvas = new ColorSetupCanvas(mConfig, this); + // set scroll rate 1 to 1, so we can have even scrolling of whole field + topsizer->Add(prefCanvas, 1, wxEXPAND); + // mCanvas->SetScrollRate(1, 1); + + TransferDataToWindow(); +} + +void DrawingSetup::Init() +{ + // first read out the defaults: + mActiveColorPalette = mConfig.GetActiveColorPalette(); + mColorPaletteNames = GetColorPaletteNames(mConfig); + mColorPaletteColors = GetColorPaletteColors(mConfig); + + for (auto palette = 0; palette < kNumberPalettes; ++palette) { + for (CalChartColors i = COLOR_FIELD; i < COLOR_NUM; i = static_cast(static_cast(i) + 1)) { + auto brushAndPen = mConfig.Get_CalChartBrushAndPen(palette, i); + mCalChartPens[palette][i] = brushAndPen.second; + mCalChartBrushes[palette][i] = brushAndPen.first; + } + } + + mDrawingValues[0] = mConfig.Get_DotRatio(); + mDrawingValues[1] = mConfig.Get_NumRatio(); + mDrawingValues[2] = mConfig.Get_PLineRatio(); + mDrawingValues[3] = mConfig.Get_SLineRatio(); + mDrawingValues[4] = mConfig.Get_SpriteBitmapScale(); + mDrawingValues[5] = mConfig.Get_SpriteBitmapOffsetY(); +} + +bool DrawingSetup::TransferDataToWindow() +{ + for (auto i = 0; i < kNumberPalettes; ++i) { + CreateAndSetItemBitmap(mPaletteNameBox, i, mColorPaletteColors.at(i)); + } + for (auto i = 0; i < kNumberPalettes; ++i) { + mPaletteNameBox->SetString(i, mColorPaletteNames.at(i)); + } + mPaletteNameBox->SetSelection(mActiveColorPalette); + + for (CalChartColors i = COLOR_FIELD; i < COLOR_NUM; + i = static_cast(static_cast(i) + 1)) { + CreateAndSetItemBitmap(nameBox, i, mCalChartBrushes[mActiveColorPalette][i]); + } + spin->SetValue(mCalChartPens[mActiveColorPalette][nameBox->GetSelection()].GetWidth()); + + wxString buf; + wxTextCtrl* text = (wxTextCtrl*)FindWindow(DOTRATIO); + buf.Printf(wxT("%.2f"), mDrawingValues[0]); + text->SetValue(buf); + text = (wxTextCtrl*)FindWindow(NUMRATIO); + buf.Printf(wxT("%.2f"), mDrawingValues[1]); + text->SetValue(buf); + text = (wxTextCtrl*)FindWindow(PLINERATIO); + buf.Printf(wxT("%.2f"), mDrawingValues[2]); + text->SetValue(buf); + text = (wxTextCtrl*)FindWindow(SLINERATIO); + buf.Printf(wxT("%.2f"), mDrawingValues[3]); + text->SetValue(buf); + text = (wxTextCtrl*)FindWindow(SPRITESCALE); + buf.Printf(wxT("%.2f"), mDrawingValues[4]); + text->SetValue(buf); + text = (wxTextCtrl*)FindWindow(SPRITEHEIGHT); + buf.Printf(wxT("%.2f"), mDrawingValues[5]); + text->SetValue(buf); + + return true; +} + +bool DrawingSetup::TransferDataFromWindow() +{ + // Data is already transferred when we update the controls, so nothing to do here. + mConfig.SetActiveColorPalette(mActiveColorPalette); + return true; +} + +bool DrawingSetup::ClearValuesToDefault() +{ + mConfig.ClearActiveColorPalette(); + for (auto i = 0; i < kNumberPalettes; ++i) { + mConfig.ClearColorPaletteColor(i); + mConfig.ClearColorPaletteName(i); + } + + for (auto palette = 0; palette < kNumberPalettes; ++palette) { + for (CalChartColors i = COLOR_FIELD; i < COLOR_NUM; i = static_cast(static_cast(i) + 1)) { + mConfig.Clear_CalChartConfigColor(palette, i); + } + } + Init(); + TransferDataToWindow(); + return true; +} + +// when the palette changes +void DrawingSetup::SetColor(int selection, int width, const wxColour& color) +{ + mCalChartPens[mActiveColorPalette][selection] = *wxThePenList->FindOrCreatePen(color, width, wxPENSTYLE_SOLID); + mCalChartBrushes[mActiveColorPalette][selection] = *wxTheBrushList->FindOrCreateBrush(color, wxBRUSHSTYLE_SOLID); + + mConfig.Set_CalChartBrushAndPen(static_cast(selection), mCalChartBrushes[mActiveColorPalette][selection], mCalChartPens[mActiveColorPalette][selection]); + + // update the namebox list + CreateAndSetItemBitmap(nameBox, selection, mCalChartBrushes[mActiveColorPalette][selection]); + Refresh(); +} + +void DrawingSetup::SetPaletteColor(int selection, wxColour const& color) +{ + mColorPaletteColors.at(selection) = *wxTheBrushList->FindOrCreateBrush(color, wxBRUSHSTYLE_SOLID); + + // this is needed so we draw things out on the page correctly. + mConfig.SetColorPaletteColor(selection, mColorPaletteColors.at(selection)); + + CreateAndSetItemBitmap(mPaletteNameBox, selection, mColorPaletteColors.at(selection)); + Refresh(); +} + +void DrawingSetup::SetPaletteName(int selection, wxString const& name) +{ + mColorPaletteNames.at(selection) = name; + + // this is needed so we draw things out on the page correctly. + mConfig.SetColorPaletteName(selection, name); + + mPaletteNameBox->SetString(selection, mColorPaletteNames.at(selection)); + Refresh(); +} + +void DrawingSetup::OnCmdSelectColors(wxCommandEvent&) +{ + int selection = nameBox->GetSelection(); + wxColourData data; + data.SetChooseFull(true); + data.SetColour(mCalChartBrushes[mActiveColorPalette][selection].GetColour()); + wxColourDialog dialog(this, &data); + if (dialog.ShowModal() == wxID_OK) { + wxColourData retdata = dialog.GetColourData(); + wxColour c = retdata.GetColour(); + SetColor(selection, mCalChartPens[mActiveColorPalette][selection].GetWidth(), c); + } + Refresh(); +} + +void DrawingSetup::OnCmdChangePaletteColor(wxCommandEvent&) +{ + int selection = mPaletteNameBox->GetSelection(); + wxColourData data; + data.SetChooseFull(true); + data.SetColour(mColorPaletteColors.at(selection).GetColour()); + wxColourDialog dialog(this, &data); + if (dialog.ShowModal() == wxID_OK) { + wxColourData retdata = dialog.GetColourData(); + wxColour c = retdata.GetColour(); + SetPaletteColor(selection, c); + } + Refresh(); +} + +void DrawingSetup::OnCmdChangePaletteName(wxCommandEvent&) +{ + int selection = mPaletteNameBox->GetSelection(); + auto v = mPaletteNameBox->GetValue(); + wxTextEntryDialog dialog(this, wxT("Enter name for Palette"), wxT("Enter name for Palette"), v, wxOK | wxCANCEL); + if (dialog.ShowModal() == wxID_OK) { + SetPaletteName(selection, dialog.GetValue()); + } + Refresh(); +} + +void DrawingSetup::OnCmdSelectWidth(wxSpinEvent& e) +{ + int selection = nameBox->GetSelection(); + SetColor(selection, e.GetPosition(), mCalChartPens[mActiveColorPalette][selection].GetColour()); +} + +void DrawingSetup::OnCmdResetColors(wxCommandEvent&) +{ + int selection = nameBox->GetSelection(); + SetColor(selection, mConfig.GetDefaultPenWidth()[selection], + mConfig.GetDefaultColors()[selection]); + mConfig.Clear_CalChartConfigColor(static_cast(selection)); +} + +void DrawingSetup::OnCmdChooseNewColor(wxCommandEvent&) +{ + spin->SetValue(mCalChartPens[mActiveColorPalette][nameBox->GetSelection()].GetWidth()); +} + +void DrawingSetup::OnCmdChooseNewPalette(wxCommandEvent&) +{ + // we set the active palette, and now need to refresh everything + mActiveColorPalette = mPaletteNameBox->GetSelection(); + mConfig.SetActiveColorPalette(mActiveColorPalette); + TransferDataToWindow(); + Refresh(); +} + +void DrawingSetup::OnCmdTextChanged(wxCommandEvent& e) +{ + auto id = e.GetId(); + wxTextCtrl* text = (wxTextCtrl*)FindWindow(id); + double value; + if (text->GetValue().ToDouble(&value)) { + switch (id - DOTRATIO) { + case 0: + mConfig.Set_DotRatio(value); + break; + case 1: + mConfig.Set_NumRatio(value); + break; + case 2: + mConfig.Set_PLineRatio(value); + break; + case 3: + mConfig.Set_SLineRatio(value); + break; + case 4: + mConfig.Set_SpriteBitmapScale(value); + break; + case 5: + mConfig.Set_SpriteBitmapOffsetY(value); + break; + } + } + Refresh(); +} + diff --git a/src/PreferencesDrawingSetup.h b/src/PreferencesDrawingSetup.h new file mode 100644 index 00000000..50802641 --- /dev/null +++ b/src/PreferencesDrawingSetup.h @@ -0,0 +1,81 @@ +#pragma once +/* + * PreferencesDrawingSetup.h + * Dialox box for Drawing Setup part of preferences + */ + +/* + Copyright (C) 1995-2011 Garrick Brian Meeker, Richard Michael Powell + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#include "PreferencesUtils.h" +#include +#include +#include +#include + +class DrawingSetup : public PreferencePage { + DECLARE_CLASS(DrawingSetup) + DECLARE_EVENT_TABLE() + +public: + DrawingSetup(CalChartConfiguration& config, wxWindow* parent, + wxWindowID id = wxID_ANY, + const wxString& caption = wxT("General Setup"), + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = wxCAPTION | wxRESIZE_BORDER | wxSYSTEM_MENU) + : PreferencePage(config) + { + Init(); + Create(parent, id, caption, pos, size, style); + } + virtual ~DrawingSetup() {} + + virtual void Init(); + virtual void CreateControls(); + + // use these to get and set default values + virtual bool TransferDataToWindow(); + virtual bool TransferDataFromWindow(); + virtual bool ClearValuesToDefault(); + +private: + void OnCmdSelectColors(wxCommandEvent&); + void OnCmdSelectWidth(wxSpinEvent&); + void OnCmdResetColors(wxCommandEvent&); + void OnCmdResetAll(wxCommandEvent&); + void OnCmdChooseNewColor(wxCommandEvent&); + void OnCmdChooseNewPalette(wxCommandEvent&); + void OnCmdTextChanged(wxCommandEvent&); + void OnCmdChangePaletteColor(wxCommandEvent&); + void OnCmdChangePaletteName(wxCommandEvent&); + + void SetColor(int selection, int width, const wxColour& color); + void SetPaletteColor(int selection, const wxColour& color); + void SetPaletteName(int selection, const wxString& name); + wxBitmapComboBox* nameBox; + wxBitmapComboBox* mPaletteNameBox; + wxSpinCtrl* spin; + + int mActiveColorPalette{}; + std::vector mColorPaletteNames; + std::vector mColorPaletteColors; + wxPen mCalChartPens[kNumberPalettes][COLOR_NUM]; + wxBrush mCalChartBrushes[kNumberPalettes][COLOR_NUM]; + + double mDrawingValues[6]; +}; diff --git a/src/PreferencesGeneralSetup.cpp b/src/PreferencesGeneralSetup.cpp new file mode 100644 index 00000000..4463f5e9 --- /dev/null +++ b/src/PreferencesGeneralSetup.cpp @@ -0,0 +1,117 @@ +/* + * CalChartPreferences.cpp + * Dialox box for preferences + */ + +/* + Copyright (C) 1995-2011 Garrick Brian Meeker, Richard Michael Powell + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#include "PreferencesGeneralSetup.h" +#include "PreferencesUtils.h" + +enum { + AUTOSAVE_INTERVAL = 1000, + BEEP_ON_COLLISIONS, + SCROLL_NATURAL, + SETSHEET_UNDO, + SELECTION_UNDO, +}; + +BEGIN_EVENT_TABLE(GeneralSetup, PreferencePage) +END_EVENT_TABLE() + +IMPLEMENT_CLASS(GeneralSetup, PreferencePage) + +GeneralSetup::GeneralSetup(CalChartConfiguration& config, wxWindow* parent, wxWindowID id, wxString const& caption, wxPoint const& pos, wxSize const& size, long style) + : PreferencePage(config) +{ + Init(); + Create(parent, id, caption, pos, size, style); +} + +void GeneralSetup::CreateControls() +{ + auto topsizer = new wxBoxSizer(wxVERTICAL); + SetSizer(topsizer); + + auto boxsizer = new wxStaticBoxSizer(new wxStaticBox(this, -1, wxT("Autosave settings")), wxVERTICAL); + topsizer->Add(boxsizer); + + auto sizer1 = new wxBoxSizer(wxVERTICAL); + boxsizer->Add(sizer1, LeftBasicSizerFlags()); + + AddTextboxWithCaption(this, sizer1, AUTOSAVE_INTERVAL, wxT("Autosave Interval")); + AddCheckboxWithCaption(this, sizer1, BEEP_ON_COLLISIONS, wxT("Beep on animation collisions")); + AddCheckboxWithCaption(this, sizer1, SCROLL_NATURAL, wxT("Scroll Direction: Natural")); + AddCheckboxWithCaption(this, sizer1, SETSHEET_UNDO, wxT("Set Sheet is undo-able")); + AddCheckboxWithCaption(this, sizer1, SELECTION_UNDO, wxT("Point selection is undo-able")); + + TransferDataToWindow(); +} + +void GeneralSetup::Init() +{ + mAutoSave_Interval.Printf(wxT("%d"), static_cast(mConfig.Get_AutosaveInterval())); + mBeep_On_Collisions = mConfig.Get_BeepOnCollisions(); + mScroll_Natural = mConfig.Get_ScrollDirectionNatural(); + mSetSheet_Undo = mConfig.Get_CommandUndoSetSheet(); + mSelection_Undo = mConfig.Get_CommandUndoSelection(); +} + +bool GeneralSetup::TransferDataToWindow() +{ + static_cast(FindWindow(AUTOSAVE_INTERVAL))->SetValue(mAutoSave_Interval); + static_cast(FindWindow(BEEP_ON_COLLISIONS))->SetValue(mBeep_On_Collisions); + static_cast(FindWindow(SCROLL_NATURAL))->SetValue(mScroll_Natural); + static_cast(FindWindow(SETSHEET_UNDO))->SetValue(mSetSheet_Undo); + static_cast(FindWindow(SELECTION_UNDO))->SetValue(mSelection_Undo); + return true; +} + +bool GeneralSetup::TransferDataFromWindow() +{ + // read out the values from the window + mAutoSave_Interval = static_cast(FindWindow(AUTOSAVE_INTERVAL))->GetValue(); + mBeep_On_Collisions = static_cast(FindWindow(BEEP_ON_COLLISIONS))->GetValue(); + mScroll_Natural = static_cast(FindWindow(SCROLL_NATURAL))->GetValue(); + mSetSheet_Undo = static_cast(FindWindow(SETSHEET_UNDO))->GetValue(); + mSelection_Undo = static_cast(FindWindow(SELECTION_UNDO))->GetValue(); + if (long val = 0; mAutoSave_Interval.ToLong(&val)) { + mConfig.Set_AutosaveInterval(val); + } + mConfig.Set_BeepOnCollisions(mBeep_On_Collisions); + mConfig.Set_ScrollDirectionNatural(mScroll_Natural); + mConfig.Set_CommandUndoSetSheet(mSetSheet_Undo); + mConfig.Set_CommandUndoSelection(mSelection_Undo); + return true; +} + +bool GeneralSetup::ClearValuesToDefault() +{ + mConfig.Clear_AutosaveInterval(); + mConfig.Clear_CalChartFrameAUILayout_3_6_0(); + mConfig.Clear_FieldFrameZoom_3_6_0(); + mConfig.Clear_FieldFrameWidth(); + mConfig.Clear_FieldFrameHeight(); + mConfig.Clear_FieldFramePositionX(); + mConfig.Clear_FieldFramePositionY(); + mConfig.Clear_UseSprites(); + Init(); + TransferDataToWindow(); + return true; +} + diff --git a/src/PreferencesGeneralSetup.h b/src/PreferencesGeneralSetup.h new file mode 100644 index 00000000..33140499 --- /dev/null +++ b/src/PreferencesGeneralSetup.h @@ -0,0 +1,54 @@ +#pragma once +/* + * PreferencesGeneralSetup.h + * Dialox box for General Setup part of preferences + */ + +/* + Copyright (C) 1995-2011 Garrick Brian Meeker, Richard Michael Powell + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#include "PreferencesUtils.h" + +/// General setup +/// Handles general configurations parameters of CalChart +/// + +class GeneralSetup : public PreferencePage { + DECLARE_CLASS(GeneralSetup) + DECLARE_EVENT_TABLE() + +public: + GeneralSetup(CalChartConfiguration& config, wxWindow* parent, wxWindowID id = wxID_ANY, wxString const& caption = wxT("General Setup"), wxPoint const& pos = wxDefaultPosition, wxSize const& size = wxDefaultSize, long style = wxCAPTION | wxRESIZE_BORDER | wxSYSTEM_MENU); + virtual ~GeneralSetup() = default; + + virtual void Init() override; + virtual void CreateControls() override; + + // use these to get and set default values + virtual bool TransferDataToWindow() override; + virtual bool TransferDataFromWindow() override; + virtual bool ClearValuesToDefault() override; + +private: + void OnCmdResetAll(wxCommandEvent&); + + wxString mAutoSave_Interval; + bool mBeep_On_Collisions; + bool mScroll_Natural; + bool mSetSheet_Undo; + bool mSelection_Undo; +}; diff --git a/src/PreferencesPSPrintingSetup.cpp b/src/PreferencesPSPrintingSetup.cpp new file mode 100644 index 00000000..8e455bf7 --- /dev/null +++ b/src/PreferencesPSPrintingSetup.cpp @@ -0,0 +1,214 @@ +/* + * CalChartPreferences.cpp + * Dialox box for preferences + */ + +/* + Copyright (C) 1995-2011 Garrick Brian Meeker, Richard Michael Powell + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#include "PreferencesPSPrintingSetup.h" +#include "PreferencesUtils.h" +#include "CalChartDoc.h" +#include "CalChartSizes.h" +#include "ColorSetupCanvas.h" +#include "ContinuityBrowserPanel.h" +#include "ContinuityComposerDialog.h" +#include "cc_drawcommand.h" +#include "cc_shapes.h" +#include "cc_sheet.h" +#include "confgr.h" +#include "cont.h" +#include "draw.h" +#include "mode_dialog.h" +#include "mode_dialog_canvas.h" +#include "modes.h" + +#include +#include +#include +#include +#include +#include + +using namespace CalChart; + + +typedef enum { + RESET = 1000, + HEADFONT, + MAINFONT, + NUMBERFONT, + CONTFONT, + BOLDFONT, + ITALFONT, + BOLDITALFONT, + HEADERSIZE, + YARDSSIZE, + TEXTSIZE, + CONTRATIO, +} PSPrintingSetUp_IDs; + +BEGIN_EVENT_TABLE(PSPrintingSetUp, PreferencePage) +END_EVENT_TABLE() + +IMPLEMENT_CLASS(PSPrintingSetUp, PreferencePage) + +void PSPrintingSetUp::CreateControls() +{ + wxBoxSizer* topsizer = new wxBoxSizer(wxVERTICAL); + SetSizer(topsizer); + + wxBoxSizer* horizontalsizer = new wxBoxSizer(wxHORIZONTAL); + topsizer->Add(horizontalsizer, LeftBasicSizerFlags()); + + AddTextboxWithCaption(this, horizontalsizer, HEADFONT, wxT("Header Font:")); + AddTextboxWithCaption(this, horizontalsizer, MAINFONT, wxT("Main Font:")); + AddTextboxWithCaption(this, horizontalsizer, NUMBERFONT, wxT("Number Font:")); + AddTextboxWithCaption(this, horizontalsizer, CONTFONT, + wxT("Continuity Font:")); + + horizontalsizer = new wxBoxSizer(wxHORIZONTAL); + topsizer->Add(horizontalsizer, LeftBasicSizerFlags()); + + AddTextboxWithCaption(this, horizontalsizer, BOLDFONT, wxT("Bold Font:")); + AddTextboxWithCaption(this, horizontalsizer, ITALFONT, wxT("Italic Font:")); + AddTextboxWithCaption(this, horizontalsizer, BOLDITALFONT, + wxT("Bold Italic Font:")); + + horizontalsizer = new wxBoxSizer(wxHORIZONTAL); + topsizer->Add(horizontalsizer, LeftBasicSizerFlags()); + + AddTextboxWithCaption(this, horizontalsizer, HEADERSIZE, wxT("Header Size:")); + AddTextboxWithCaption(this, horizontalsizer, YARDSSIZE, wxT("Yards Side:")); + AddTextboxWithCaption(this, horizontalsizer, TEXTSIZE, wxT("Text Side:")); + + horizontalsizer = new wxBoxSizer(wxHORIZONTAL); + topsizer->Add(horizontalsizer, LeftBasicSizerFlags()); + + AddTextboxWithCaption(this, horizontalsizer, CONTRATIO, + wxT("Continuity Ratio:")); + + TransferDataToWindow(); +} + +void PSPrintingSetUp::Init() +{ + mFontNames[0] = mConfig.Get_HeadFont(); + mFontNames[1] = mConfig.Get_MainFont(); + mFontNames[2] = mConfig.Get_NumberFont(); + mFontNames[3] = mConfig.Get_ContFont(); + mFontNames[4] = mConfig.Get_BoldFont(); + mFontNames[5] = mConfig.Get_ItalFont(); + mFontNames[6] = mConfig.Get_BoldItalFont(); + mPrintValues[0] = mConfig.Get_HeaderSize(); + mPrintValues[1] = mConfig.Get_YardsSize(); + mPrintValues[2] = mConfig.Get_TextSize(); + mPrintValues[7] = mConfig.Get_ContRatio(); +} + +bool PSPrintingSetUp::TransferDataToWindow() +{ + wxTextCtrl* text = (wxTextCtrl*)FindWindow(HEADFONT); + text->SetValue(mFontNames[0]); + text = (wxTextCtrl*)FindWindow(MAINFONT); + text->SetValue(mFontNames[1]); + text = (wxTextCtrl*)FindWindow(NUMBERFONT); + text->SetValue(mFontNames[2]); + text = (wxTextCtrl*)FindWindow(CONTFONT); + text->SetValue(mFontNames[3]); + text = (wxTextCtrl*)FindWindow(BOLDFONT); + text->SetValue(mFontNames[4]); + text = (wxTextCtrl*)FindWindow(ITALFONT); + text->SetValue(mFontNames[5]); + text = (wxTextCtrl*)FindWindow(BOLDITALFONT); + text->SetValue(mFontNames[6]); + text = (wxTextCtrl*)FindWindow(HEADERSIZE); + wxString buf; + buf.Printf(wxT("%.2f"), mPrintValues[0]); + text->SetValue(buf); + text = (wxTextCtrl*)FindWindow(YARDSSIZE); + buf.Printf(wxT("%.2f"), mPrintValues[1]); + text->SetValue(buf); + text = (wxTextCtrl*)FindWindow(TEXTSIZE); + buf.Printf(wxT("%.2f"), mPrintValues[2]); + text->SetValue(buf); + text = (wxTextCtrl*)FindWindow(CONTRATIO); + buf.Printf(wxT("%.2f"), mPrintValues[7]); + text->SetValue(buf); + + return true; +} + +bool PSPrintingSetUp::TransferDataFromWindow() +{ + // read out the values from the window + wxTextCtrl* text = (wxTextCtrl*)FindWindow(HEADFONT); + mFontNames[0] = text->GetValue(); + text = (wxTextCtrl*)FindWindow(MAINFONT); + mFontNames[1] = text->GetValue(); + text = (wxTextCtrl*)FindWindow(NUMBERFONT); + mFontNames[2] = text->GetValue(); + text = (wxTextCtrl*)FindWindow(CONTFONT); + mFontNames[3] = text->GetValue(); + text = (wxTextCtrl*)FindWindow(BOLDFONT); + mFontNames[4] = text->GetValue(); + text = (wxTextCtrl*)FindWindow(ITALFONT); + mFontNames[5] = text->GetValue(); + text = (wxTextCtrl*)FindWindow(BOLDITALFONT); + mFontNames[6] = text->GetValue(); + text = (wxTextCtrl*)FindWindow(HEADERSIZE); + text->GetValue().ToDouble(&mPrintValues[0]); + text = (wxTextCtrl*)FindWindow(YARDSSIZE); + text->GetValue().ToDouble(&mPrintValues[1]); + text = (wxTextCtrl*)FindWindow(TEXTSIZE); + text->GetValue().ToDouble(&mPrintValues[2]); + text = (wxTextCtrl*)FindWindow(CONTRATIO); + text->GetValue().ToDouble(&mPrintValues[7]); + + // write out the values defaults: + mConfig.Set_HeadFont(mFontNames[0]); + mConfig.Set_MainFont(mFontNames[1]); + mConfig.Set_NumberFont(mFontNames[2]); + mConfig.Set_ContFont(mFontNames[3]); + mConfig.Set_BoldFont(mFontNames[4]); + mConfig.Set_ItalFont(mFontNames[5]); + mConfig.Set_BoldItalFont(mFontNames[6]); + mConfig.Set_HeaderSize(mPrintValues[0]); + mConfig.Set_YardsSize(mPrintValues[1]); + mConfig.Set_TextSize(mPrintValues[2]); + mConfig.Set_ContRatio(mPrintValues[7]); + + return true; +} + +bool PSPrintingSetUp::ClearValuesToDefault() +{ + mConfig.Clear_HeadFont(); + mConfig.Clear_MainFont(); + mConfig.Clear_NumberFont(); + mConfig.Clear_ContFont(); + mConfig.Clear_BoldFont(); + mConfig.Clear_ItalFont(); + mConfig.Clear_BoldItalFont(); + mConfig.Clear_HeaderSize(); + mConfig.Clear_YardsSize(); + mConfig.Clear_TextSize(); + mConfig.Clear_ContRatio(); + Init(); + return TransferDataToWindow(); +} + diff --git a/src/PreferencesPSPrintingSetup.h b/src/PreferencesPSPrintingSetup.h new file mode 100644 index 00000000..4a03aa2b --- /dev/null +++ b/src/PreferencesPSPrintingSetup.h @@ -0,0 +1,66 @@ +#pragma once +/* + * PreferencesPSPrintingSetup.h + * Dialox box for PSPrinting Setup part of preferences + */ + +/* + Copyright (C) 1995-2011 Garrick Brian Meeker, Richard Michael Powell + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#pragma once + +#include "PreferencesUtils.h" +#include "confgr.h" +#include +#include +#include +#include + +//////// General setup //////// +// setup pringing values and colors +//////// + +class PSPrintingSetUp : public PreferencePage { + DECLARE_CLASS(PSPrintingSetUp) + DECLARE_EVENT_TABLE() + +public: + PSPrintingSetUp(CalChartConfiguration& config, wxWindow* parent, + wxWindowID id = wxID_ANY, + const wxString& caption = wxT("Printing Values"), + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = wxCAPTION | wxRESIZE_BORDER | wxSYSTEM_MENU) + : PreferencePage(config) + { + Init(); + Create(parent, id, caption, pos, size, style); + } + virtual ~PSPrintingSetUp() {} + + virtual void Init(); + virtual void CreateControls(); + + // use these to get and set default values + virtual bool TransferDataToWindow(); + virtual bool TransferDataFromWindow(); + virtual bool ClearValuesToDefault(); + +private: + wxString mFontNames[7]; + double mPrintValues[8]; +}; diff --git a/src/PreferencesShowModeSetup.cpp b/src/PreferencesShowModeSetup.cpp new file mode 100644 index 00000000..5be4b78e --- /dev/null +++ b/src/PreferencesShowModeSetup.cpp @@ -0,0 +1,270 @@ +/* + * CalChartPreferences.cpp + * Dialox box for preferences + */ + +/* + Copyright (C) 1995-2011 Garrick Brian Meeker, Richard Michael Powell + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#include "PreferencesShowModeSetup.h" +#include "PreferencesUtils.h" +#include "CalChartDoc.h" +#include "CalChartSizes.h" +#include "ColorSetupCanvas.h" +#include "ContinuityBrowserPanel.h" +#include "ContinuityComposerDialog.h" +#include "cc_drawcommand.h" +#include "cc_shapes.h" +#include "cc_sheet.h" +#include "confgr.h" +#include "cont.h" +#include "draw.h" +#include "mode_dialog.h" +#include "mode_dialog_canvas.h" +#include "modes.h" + +#include +#include +#include +#include +#include +#include + +using namespace CalChart; + + +enum { + MODE_CHOICE = 1000, + WESTHASH, + EASTHASH, + BORDER_LEFT, + BORDER_TOP, + BORDER_RIGHT, + BORDER_BOTTOM, + OFFSET_X, + OFFSET_Y, + SIZE_X, + SIZE_Y, + SHOW_LINE_MARKING, + SHOW_LINE_VALUE, + CANVAS, +}; + +BEGIN_EVENT_TABLE(ShowModeSetup, PreferencePage) +EVT_CHOICE(MODE_CHOICE, ShowModeSetup::OnCmdChoice) +EVT_CHOICE(SHOW_LINE_MARKING, ShowModeSetup::OnCmdChoice) +END_EVENT_TABLE() + +IMPLEMENT_CLASS(ShowModeSetup, PreferencePage) + +void ShowModeSetup::CreateControls() +{ + wxBoxSizer* topsizer = new wxBoxSizer(wxVERTICAL); + SetSizer(topsizer); + + wxChoice* modes = new wxChoice(this, MODE_CHOICE, wxDefaultPosition, + wxDefaultSize, SHOWMODE_NUM, kShowModeStrings); + modes->SetSelection(0); + topsizer->Add(modes, LeftBasicSizerFlags()); + + wxBoxSizer* sizer1 = new wxBoxSizer(wxHORIZONTAL); + topsizer->Add(sizer1, LeftBasicSizerFlags()); + + auto refresh_action = [this](wxCommandEvent&) { + this->TransferDataFromWindow(); + Refresh(); + }; + + AddTextboxWithCaptionAndAction(this, sizer1, WESTHASH, wxT("West Hash"), + refresh_action, wxTE_PROCESS_ENTER); + AddTextboxWithCaptionAndAction(this, sizer1, EASTHASH, wxT("East Hash"), + refresh_action, wxTE_PROCESS_ENTER); + + sizer1 = new wxBoxSizer(wxHORIZONTAL); + topsizer->Add(sizer1, LeftBasicSizerFlags()); + AddTextboxWithCaptionAndAction(this, sizer1, BORDER_LEFT, wxT("Left Border"), + refresh_action, wxTE_PROCESS_ENTER); + AddTextboxWithCaptionAndAction(this, sizer1, BORDER_TOP, wxT("Top Border"), + refresh_action, wxTE_PROCESS_ENTER); + AddTextboxWithCaptionAndAction(this, sizer1, BORDER_RIGHT, + wxT("Right Border"), refresh_action, + wxTE_PROCESS_ENTER); + AddTextboxWithCaptionAndAction(this, sizer1, BORDER_BOTTOM, + wxT("Bottom Border"), refresh_action, + wxTE_PROCESS_ENTER); + + sizer1 = new wxBoxSizer(wxHORIZONTAL); + topsizer->Add(sizer1, LeftBasicSizerFlags()); + AddTextboxWithCaptionAndAction(this, sizer1, OFFSET_X, wxT("Offset X"), + refresh_action, wxTE_PROCESS_ENTER); + AddTextboxWithCaptionAndAction(this, sizer1, OFFSET_Y, wxT("Offset Y"), + refresh_action, wxTE_PROCESS_ENTER); + AddTextboxWithCaptionAndAction(this, sizer1, SIZE_X, wxT("Size X"), + refresh_action, wxTE_PROCESS_ENTER); + AddTextboxWithCaptionAndAction(this, sizer1, SIZE_Y, wxT("Size Y"), + refresh_action, wxTE_PROCESS_ENTER); + + sizer1 = new wxBoxSizer(wxHORIZONTAL); + topsizer->Add(sizer1, LeftBasicSizerFlags()); + wxBoxSizer* textsizer = new wxBoxSizer(wxHORIZONTAL); + sizer1->Add(textsizer, BasicSizerFlags()); + textsizer->Add(new wxStaticText(this, wxID_STATIC, + wxT("Adjust yardline marker"), + wxDefaultPosition, wxDefaultSize, 0), + 0, wxALIGN_LEFT | wxALL, 5); + wxChoice* textchoice = new wxChoice(this, SHOW_LINE_MARKING, wxDefaultPosition, wxDefaultSize, + wxArrayString{ mConfig.Get_yard_text_index().size(), mConfig.Get_yard_text_index().data() }); + textchoice->SetSelection(0); + textsizer->Add(textchoice); + auto show_line_value = new wxTextCtrl(this, SHOW_LINE_VALUE, wxEmptyString, wxDefaultPosition, + wxDefaultSize, wxTE_PROCESS_ENTER); + show_line_value->Bind(wxEVT_TEXT_ENTER, refresh_action); + textsizer->Add(show_line_value, BasicSizerFlags()); + + textsizer = new wxBoxSizer(wxHORIZONTAL); + sizer1->Add(textsizer, BasicSizerFlags()); + textsizer->Add(new wxStaticText(this, wxID_STATIC, wxT("Zoom"), + wxDefaultPosition, wxDefaultSize, 0), + 0, wxALIGN_LEFT | wxALL, 5); + wxArrayString zoomtext; + for (auto& i : zoom_amounts) { + wxString buf; + buf.sprintf(wxT("%d%%"), i); + zoomtext.Add(buf); + } + auto zoomBox = new wxChoice(this, wxID_ANY, wxDefaultPosition, wxDefaultSize, zoomtext); + zoomBox->Bind(wxEVT_CHOICE, [=](wxCommandEvent& event) { + size_t sel = event.GetInt(); + float zoom_amount = zoom_amounts[sel] / 100.0; + static_cast(FindWindow(CANVAS)) + ->SetZoom(zoom_amount); + }); + + // set the text to the default zoom level + textsizer->Add(zoomBox, LeftBasicSizerFlags()); + + auto modeSetupCanvas = new ShowModeSetupCanvas(mConfig, this, CANVAS); + modeSetupCanvas->SetScrollRate(1, 1); + topsizer->Add(modeSetupCanvas, 1, wxEXPAND); + + modeSetupCanvas->SetMode(CalChart::ShowMode::CreateShowMode(mConfig.Get_ShowModeInfo(static_cast(mWhichMode)), mYardText)); + modeSetupCanvas->SetZoom(zoom_amounts[5] / 100.0); + zoomBox->SetSelection(5); + + TransferDataToWindow(); +} + +void ShowModeSetup::Init() +{ + mWhichMode = 0; + mWhichYardLine = 0; + for (size_t i = 0; i < SHOWMODE_NUM; ++i) { + mShowModeValues[i] = mConfig.Get_ShowModeInfo(static_cast(i)); + } + for (size_t i = 0; i < kYardTextValues; ++i) { + mYardText[i] = mConfig.Get_yard_text(i); + } +} + +bool ShowModeSetup::TransferDataToWindow() +{ + // standard show + for (auto i = mShowModeValues[mWhichMode].begin(); + i != mShowModeValues[mWhichMode].end(); ++i) { + wxString buf; + wxTextCtrl* text = (wxTextCtrl*)FindWindow( + WESTHASH + std::distance(mShowModeValues[mWhichMode].begin(), i)); + buf.Printf(wxT("%d"), static_cast(*i)); + text->ChangeValue(buf); + } + + wxTextCtrl* text = (wxTextCtrl*)FindWindow(SHOW_LINE_VALUE); + text->SetValue(mYardText[mWhichYardLine]); + return true; +} + +bool ShowModeSetup::TransferDataFromWindow() +{ + // read out the values from the window + // standard show + for (auto i = mShowModeValues[mWhichMode].begin(); + i != mShowModeValues[mWhichMode].end(); ++i) { + long val; + wxTextCtrl* text = (wxTextCtrl*)FindWindow( + WESTHASH + std::distance(mShowModeValues[mWhichMode].begin(), i)); + text->GetValue().ToLong(&val); + *i = val; + } + // write out the values defaults: + for (size_t i = 0; i < SHOWMODE_NUM; ++i) { + mConfig.Set_ShowModeInfo(static_cast(i), + mShowModeValues[i]); + } + + // grab whatever's in the box + wxTextCtrl* text = (wxTextCtrl*)FindWindow(SHOW_LINE_VALUE); + mYardText[mWhichYardLine] = text->GetValue(); + for (size_t i = 0; i < kYardTextValues; ++i) { + mConfig.Set_yard_text(i, mYardText[i]); + } + // now set the canvas + ((ShowModeSetupCanvas*)FindWindow(CANVAS))->SetMode(CalChart::ShowMode::CreateShowMode(mConfig.Get_ShowModeInfo(static_cast(mWhichMode)), mYardText)); + + return true; +} + +bool ShowModeSetup::ClearValuesToDefault() +{ + for (size_t i = 0; i < SHOWMODE_NUM; ++i) { + mConfig.Clear_ShowModeInfo(static_cast(i)); + } + for (auto i = 0; i < kYardTextValues; ++i) { + mConfig.Clear_yard_text(i); + } + Init(); + ((ShowModeSetupCanvas*)FindWindow(CANVAS))->SetMode(CalChart::ShowMode::CreateShowMode(mConfig.Get_ShowModeInfo(static_cast(mWhichMode)), mYardText)); + return TransferDataToWindow(); +} + +void ShowModeSetup::OnCmdChoice(wxCommandEvent&) +{ + // save off all the old values: + for (auto i = mShowModeValues[mWhichMode].begin(); + i != mShowModeValues[mWhichMode].end(); ++i) { + long val; + wxTextCtrl* text = (wxTextCtrl*)FindWindow( + WESTHASH + std::distance(mShowModeValues[mWhichMode].begin(), i)); + text->GetValue().ToLong(&val); + *i = val; + } + wxChoice* modes = (wxChoice*)FindWindow(MODE_CHOICE); + mWhichMode = modes->GetSelection(); + ShowModeSetupCanvas* canvas = (ShowModeSetupCanvas*)FindWindow(CANVAS); + canvas->SetMode(CalChart::ShowMode::CreateShowMode(mConfig.Get_ShowModeInfo(static_cast(mWhichMode)), mYardText)); + + wxTextCtrl* text = (wxTextCtrl*)FindWindow(SHOW_LINE_VALUE); + mYardText[mWhichYardLine] = text->GetValue(); + // update mode + for (size_t i = 0; i < kYardTextValues; ++i) { + mConfig.Set_yard_text(i, mYardText[i]); + } + + modes = (wxChoice*)FindWindow(SHOW_LINE_MARKING); + mWhichYardLine = modes->GetSelection(); + TransferDataToWindow(); +} + diff --git a/src/PreferencesShowModeSetup.h b/src/PreferencesShowModeSetup.h new file mode 100644 index 00000000..1507a675 --- /dev/null +++ b/src/PreferencesShowModeSetup.h @@ -0,0 +1,68 @@ +#pragma once +/* + * PreferencesShowModeSetup.h + * Dialox box for ShowMode Setup part of preferences + */ + +/* + Copyright (C) 1995-2011 Garrick Brian Meeker, Richard Michael Powell + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#include "PreferencesUtils.h" + +#include "confgr.h" +#include "modes.h" +#include +#include +#include +#include + +const int zoom_amounts[] = { 500, 200, 150, 100, 75, 50, 25, 10 }; + +class ShowModeSetup : public PreferencePage { + DECLARE_CLASS(ShowModeSetup) + DECLARE_EVENT_TABLE() + +public: + ShowModeSetup(CalChartConfiguration& config, wxWindow* parent, + wxWindowID id = wxID_ANY, + const wxString& caption = wxT("Setup Modes"), + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = wxCAPTION | wxRESIZE_BORDER | wxSYSTEM_MENU) + : PreferencePage(config) + { + Init(); + Create(parent, id, caption, pos, size, style); + } + ~ShowModeSetup() {} + + virtual void Init(); + virtual void CreateControls(); + + // use these to get and set default values + virtual bool TransferDataToWindow(); + virtual bool TransferDataFromWindow(); + virtual bool ClearValuesToDefault(); + +private: + void OnCmdLineText(wxCommandEvent&); + void OnCmdChoice(wxCommandEvent&); + CalChartConfiguration::ShowModeInfo_t mShowModeValues[SHOWMODE_NUM]; + CalChart::ShowMode::YardLinesInfo_t mYardText; + int mWhichMode; + int mWhichYardLine; +}; diff --git a/src/PreferencesUtils.cpp b/src/PreferencesUtils.cpp new file mode 100644 index 00000000..c2251912 --- /dev/null +++ b/src/PreferencesUtils.cpp @@ -0,0 +1,75 @@ +/* + * CalChartPreferences.cpp + * Dialox box for preferences + */ + +/* + Copyright (C) 1995-2011 Garrick Brian Meeker, Richard Michael Powell + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#include "PreferencesUtils.h" +#include "basic_ui.h" + +IMPLEMENT_ABSTRACT_CLASS(PreferencePage, wxPanel) + + +// how the preferences work: +// preference dialog create a copy of the CalChart config from which to read and +// set values +// CalChart config doesn't automatically write values to main config, it must be +// flushed +// out when the user presses apply. +// first page will be general settings: +// Auto save behavior: file location, time +// second page is Drawing preferences for edit menu +// Color preferences +// second page is PS printing settings +// 3rd page is Show mode setup +// +// organized into pages. Each page is responsible for reading out +// on TransferDataToWindow, caching the values locally, and +// setting them to the system on TransferDataFromWindow + +// convience sizers to change the view behavior in all at once. +static auto sRightBasicSizerFlags = wxSizerFlags().Border(wxALL, 2).Right().Proportion(0); +static auto sExpandSizerFlags = wxSizerFlags().Border(wxALL, 2).Center().Proportion(0); + +void AddTextboxWithCaption(wxWindow* parent, wxBoxSizer* verticalsizer, + int id, const wxString& caption, + long style) +{ + wxBoxSizer* textsizer = new wxBoxSizer(wxVERTICAL); + textsizer->Add(new wxStaticText(parent, wxID_STATIC, caption, + wxDefaultPosition, wxDefaultSize, 0), + LeftBasicSizerFlags()); + textsizer->Add(new wxTextCtrl(parent, id, wxEmptyString, wxDefaultPosition, + wxDefaultSize, style), + BasicSizerFlags()); + verticalsizer->Add(textsizer, BasicSizerFlags()); +} + +void AddCheckboxWithCaption(wxWindow* parent, wxBoxSizer* verticalsizer, + int id, const wxString& caption, + long style) +{ + wxBoxSizer* textsizer = new wxBoxSizer(wxVERTICAL); + textsizer->Add(new wxCheckBox(parent, id, caption, wxDefaultPosition, + wxDefaultSize, style), + BasicSizerFlags()); + verticalsizer->Add(textsizer, BasicSizerFlags()); +} + + diff --git a/src/PreferencesUtils.h b/src/PreferencesUtils.h new file mode 100644 index 00000000..160359fe --- /dev/null +++ b/src/PreferencesUtils.h @@ -0,0 +1,89 @@ +#pragma once +/* + * cc_preferences.h + * Dialox box for preferences + */ + +/* + Copyright (C) 1995-2011 Garrick Brian Meeker, Richard Michael Powell + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + + +#include "confgr.h" +#include "basic_ui.h" +#include + +// the basic class panel we use for all the pages. +// Each page gets a references to the CalChartConfig which will be used for +// getting and setting +class PreferencePage : public wxPanel { + DECLARE_ABSTRACT_CLASS(GeneralSetup) +public: + PreferencePage(CalChartConfiguration& config) + : mConfig(config) + { + Init(); + } + virtual ~PreferencePage() {} + virtual void Init() {} + virtual bool Create(wxWindow* parent, wxWindowID id, const wxString& caption, + const wxPoint& pos, const wxSize& size, long style) + { + if (!wxPanel::Create(parent, id, pos, size, style, caption)) + return false; + CreateControls(); + GetSizer()->Fit(this); + GetSizer()->SetSizeHints(this); + Center(); + return true; + } + + // use these to get and set default values + virtual bool TransferDataToWindow() = 0; + virtual bool TransferDataFromWindow() = 0; + virtual bool ClearValuesToDefault() = 0; + +private: + virtual void CreateControls() = 0; + +protected: + CalChartConfiguration& mConfig; +}; + +// should this move to basic_ui.h? +template +void AddTextboxWithCaptionAndAction(wxWindow* parent, wxBoxSizer* verticalsizer, + int id, const wxString& caption, + Function&& f, long style = 0) +{ + wxBoxSizer* textsizer = new wxBoxSizer(wxVERTICAL); + textsizer->Add(new wxStaticText(parent, wxID_STATIC, caption, + wxDefaultPosition, wxDefaultSize, 0), + LeftBasicSizerFlags()); + auto textCtrl = new wxTextCtrl(parent, id, wxEmptyString, wxDefaultPosition, + wxDefaultSize, style); + textCtrl->Bind((style & wxTE_PROCESS_ENTER) ? wxEVT_TEXT_ENTER : wxEVT_TEXT, + f); + textsizer->Add(textCtrl, BasicSizerFlags()); + verticalsizer->Add(textsizer, BasicSizerFlags()); +} + +void AddTextboxWithCaption(wxWindow* parent, wxBoxSizer* verticalsizer, + int id, const wxString& caption, + long style = 0); +void AddCheckboxWithCaption(wxWindow* parent, wxBoxSizer* verticalsizer, + int id, const wxString& caption, + long style = 0); diff --git a/src/TopFrame.cpp b/src/TopFrame.cpp index c0374a69..1a754890 100644 --- a/src/TopFrame.cpp +++ b/src/TopFrame.cpp @@ -25,7 +25,7 @@ #include "CalChartSizes.h" #include "basic_ui.h" #include "calchart.xbm" -#include "cc_preferences_ui.h" +#include "CalChartPreferences.h" #include "ccvers.h" #include diff --git a/src/basic_ui.h b/src/basic_ui.h index bbac9d46..25b9d178 100644 --- a/src/basic_ui.h +++ b/src/basic_ui.h @@ -156,6 +156,7 @@ class ClickDragCtrlScrollCanvas : public MouseMoveScrollCanvas { virtual bool ShouldScrollOnMouseEvent(const wxMouseEvent& event) const override; }; +// common sizers all in one places wxSizerFlags BasicSizerFlags(); wxSizerFlags LeftBasicSizerFlags(); wxSizerFlags RightBasicSizerFlags(); diff --git a/src/cc_preferences_ui.cpp b/src/cc_preferences_ui.cpp deleted file mode 100644 index e26e2295..00000000 --- a/src/cc_preferences_ui.cpp +++ /dev/null @@ -1,1417 +0,0 @@ -/* - * cc_preferences_ui.cpp - * Dialox box for preferences - */ - -/* - Copyright (C) 1995-2011 Garrick Brian Meeker, Richard Michael Powell - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -#include "cc_preferences_ui.h" -#include "CalChartDoc.h" -#include "CalChartSizes.h" -#include "ColorSetupCanvas.h" -#include "ContinuityBrowserPanel.h" -#include "ContinuityComposerDialog.h" -#include "cc_drawcommand.h" -#include "cc_shapes.h" -#include "cc_sheet.h" -#include "confgr.h" -#include "cont.h" -#include "draw.h" -#include "mode_dialog.h" -#include "mode_dialog_canvas.h" -#include "modes.h" - -#include -#include -#include -#include -#include -#include - -using namespace CalChart; - -// how the preferences work: -// preference dialog create a copy of the CalChart config from which to read and -// set values -// CalChart config doesn't automatically write values to main config, it must be -// flushed -// out when the user presses apply. -// first page will be general settings: -// Auto save behavior: file location, time -// second page is Drawing preferences for edit menu -// Color preferences -// second page is PS printing settings -// 3rd page is Show mode setup -// -// organized into pages. Each page is responsible for reading out -// on TransferDataToWindow, caching the values locally, and -// setting them to the system on TransferDataFromWindow - -// convience sizers to change the view behavior in all at once. -static auto sBasicSizerFlags = wxSizerFlags().Border(wxALL, 2).Center().Proportion(0); -static auto sLeftBasicSizerFlags = wxSizerFlags().Border(wxALL, 2).Left().Proportion(0); -static auto sRightBasicSizerFlags = wxSizerFlags().Border(wxALL, 2).Right().Proportion(0); -static auto sExpandSizerFlags = wxSizerFlags().Border(wxALL, 2).Center().Proportion(0); - -static void AddTextboxWithCaption(wxWindow* parent, wxBoxSizer* verticalsizer, - int id, const wxString& caption, - long style = 0) -{ - wxBoxSizer* textsizer = new wxBoxSizer(wxVERTICAL); - textsizer->Add(new wxStaticText(parent, wxID_STATIC, caption, - wxDefaultPosition, wxDefaultSize, 0), - sLeftBasicSizerFlags); - textsizer->Add(new wxTextCtrl(parent, id, wxEmptyString, wxDefaultPosition, - wxDefaultSize, style), - sBasicSizerFlags); - verticalsizer->Add(textsizer, sBasicSizerFlags); -} - -static void AddCheckboxWithCaption(wxWindow* parent, wxBoxSizer* verticalsizer, - int id, const wxString& caption, - long style = 0) -{ - wxBoxSizer* textsizer = new wxBoxSizer(wxVERTICAL); - textsizer->Add(new wxCheckBox(parent, id, caption, wxDefaultPosition, - wxDefaultSize, style), - sBasicSizerFlags); - verticalsizer->Add(textsizer, sBasicSizerFlags); -} - -template -void AddTextboxWithCaptionAndAction(wxWindow* parent, wxBoxSizer* verticalsizer, - int id, const wxString& caption, - Function&& f, long style = 0) -{ - wxBoxSizer* textsizer = new wxBoxSizer(wxVERTICAL); - textsizer->Add(new wxStaticText(parent, wxID_STATIC, caption, - wxDefaultPosition, wxDefaultSize, 0), - sLeftBasicSizerFlags); - auto textCtrl = new wxTextCtrl(parent, id, wxEmptyString, wxDefaultPosition, - wxDefaultSize, style); - textCtrl->Bind((style & wxTE_PROCESS_ENTER) ? wxEVT_TEXT_ENTER : wxEVT_TEXT, - f); - textsizer->Add(textCtrl, sBasicSizerFlags); - verticalsizer->Add(textsizer, sBasicSizerFlags); -} - -// the basic class panel we use for all the pages. -// Each page gets a references to the CalChartConfig which will be used for -// getting and setting -class PreferencePage : public wxPanel { - DECLARE_ABSTRACT_CLASS(GeneralSetup) -public: - PreferencePage(CalChartConfiguration& config) - : mConfig(config) - { - Init(); - } - virtual ~PreferencePage() {} - virtual void Init() {} - virtual bool Create(wxWindow* parent, wxWindowID id, const wxString& caption, - const wxPoint& pos, const wxSize& size, long style) - { - if (!wxPanel::Create(parent, id, pos, size, style, caption)) - return false; - CreateControls(); - GetSizer()->Fit(this); - GetSizer()->SetSizeHints(this); - Center(); - return true; - } - - // use these to get and set default values - virtual bool TransferDataToWindow() = 0; - virtual bool TransferDataFromWindow() = 0; - virtual bool ClearValuesToDefault() = 0; - -private: - virtual void CreateControls() = 0; - -protected: - CalChartConfiguration& mConfig; -}; - -IMPLEMENT_ABSTRACT_CLASS(PreferencePage, wxPanel) - -//////// General setup //////// -// handling autosave -//////// - -class GeneralSetup : public PreferencePage { - DECLARE_CLASS(GeneralSetup) - DECLARE_EVENT_TABLE() - -public: - GeneralSetup(CalChartConfiguration& config, wxWindow* parent, - wxWindowID id = wxID_ANY, - const wxString& caption = wxT("General Setup"), - const wxPoint& pos = wxDefaultPosition, - const wxSize& size = wxDefaultSize, - long style = wxCAPTION | wxRESIZE_BORDER | wxSYSTEM_MENU) - : PreferencePage(config) - { - Init(); - Create(parent, id, caption, pos, size, style); - } - virtual ~GeneralSetup() {} - - virtual void Init(); - virtual void CreateControls(); - - // use these to get and set default values - virtual bool TransferDataToWindow(); - virtual bool TransferDataFromWindow(); - virtual bool ClearValuesToDefault(); - -private: - void OnCmdResetAll(wxCommandEvent&); - - wxString mAutoSave_Interval; - bool mBeep_On_Collisions; - bool mScroll_Natural; - bool mSetSheet_Undo; - bool mSelection_Undo; -}; - -enum { - AUTOSAVE_INTERVAL = 1000, - BEEP_ON_COLLISIONS, - SCROLL_NATURAL, - SETSHEET_UNDO, - SELECTION_UNDO, -}; - -BEGIN_EVENT_TABLE(GeneralSetup, PreferencePage) -END_EVENT_TABLE() - -IMPLEMENT_CLASS(GeneralSetup, PreferencePage) - -void GeneralSetup::CreateControls() -{ - wxBoxSizer* topsizer = new wxBoxSizer(wxVERTICAL); - SetSizer(topsizer); - - wxStaticBoxSizer* boxsizer = new wxStaticBoxSizer( - new wxStaticBox(this, -1, wxT("Autosave settings")), wxVERTICAL); - topsizer->Add(boxsizer); - - wxBoxSizer* sizer1 = new wxBoxSizer(wxVERTICAL); - boxsizer->Add(sizer1, sLeftBasicSizerFlags); - - AddTextboxWithCaption(this, sizer1, AUTOSAVE_INTERVAL, - wxT("Autosave Interval")); - AddCheckboxWithCaption(this, sizer1, BEEP_ON_COLLISIONS, - wxT("Beep on animation collisions")); - AddCheckboxWithCaption(this, sizer1, SCROLL_NATURAL, - wxT("Scroll Direction: Natural")); - AddCheckboxWithCaption(this, sizer1, SETSHEET_UNDO, - wxT("Set Sheet is undo-able")); - AddCheckboxWithCaption(this, sizer1, SELECTION_UNDO, - wxT("Point selection is undo-able")); - - TransferDataToWindow(); -} - -void GeneralSetup::Init() -{ - mAutoSave_Interval.Printf(wxT("%d"), static_cast(mConfig.Get_AutosaveInterval())); - mBeep_On_Collisions = mConfig.Get_BeepOnCollisions(); - mScroll_Natural = mConfig.Get_ScrollDirectionNatural(); - mSetSheet_Undo = mConfig.Get_CommandUndoSetSheet(); - mSelection_Undo = mConfig.Get_CommandUndoSelection(); -} - -bool GeneralSetup::TransferDataToWindow() -{ - ((wxTextCtrl*)FindWindow(AUTOSAVE_INTERVAL))->SetValue(mAutoSave_Interval); - ((wxCheckBox*)FindWindow(BEEP_ON_COLLISIONS))->SetValue(mBeep_On_Collisions); - ((wxCheckBox*)FindWindow(SCROLL_NATURAL))->SetValue(mScroll_Natural); - ((wxCheckBox*)FindWindow(SETSHEET_UNDO))->SetValue(mSetSheet_Undo); - ((wxCheckBox*)FindWindow(SELECTION_UNDO))->SetValue(mSelection_Undo); - return true; -} - -bool GeneralSetup::TransferDataFromWindow() -{ - // read out the values from the window - mAutoSave_Interval = ((wxTextCtrl*)FindWindow(AUTOSAVE_INTERVAL))->GetValue(); - long val; - if (mAutoSave_Interval.ToLong(&val)) { - mConfig.Set_AutosaveInterval(val); - } - mBeep_On_Collisions = ((wxCheckBox*)FindWindow(BEEP_ON_COLLISIONS))->GetValue(); - mConfig.Set_BeepOnCollisions(mBeep_On_Collisions); - mScroll_Natural = ((wxCheckBox*)FindWindow(SCROLL_NATURAL))->GetValue(); - mConfig.Set_ScrollDirectionNatural(mScroll_Natural); - mSetSheet_Undo = ((wxCheckBox*)FindWindow(SETSHEET_UNDO))->GetValue(); - mConfig.Set_CommandUndoSetSheet(mSetSheet_Undo); - mSelection_Undo = ((wxCheckBox*)FindWindow(SELECTION_UNDO))->GetValue(); - mConfig.Set_CommandUndoSelection(mSelection_Undo); - return true; -} - -bool GeneralSetup::ClearValuesToDefault() -{ - mConfig.Clear_AutosaveInterval(); - mConfig.Clear_CalChartFrameAUILayout_3_6_0(); - mConfig.Clear_FieldFrameZoom_3_6_0(); - mConfig.Clear_FieldFrameWidth(); - mConfig.Clear_FieldFrameHeight(); - mConfig.Clear_FieldFramePositionX(); - mConfig.Clear_FieldFramePositionY(); - Init(); - TransferDataToWindow(); - return true; -} - -class DrawingSetup : public PreferencePage { - DECLARE_CLASS(DrawingSetup) - DECLARE_EVENT_TABLE() - -public: - DrawingSetup(CalChartConfiguration& config, wxWindow* parent, - wxWindowID id = wxID_ANY, - const wxString& caption = wxT("General Setup"), - const wxPoint& pos = wxDefaultPosition, - const wxSize& size = wxDefaultSize, - long style = wxCAPTION | wxRESIZE_BORDER | wxSYSTEM_MENU) - : PreferencePage(config) - { - Init(); - Create(parent, id, caption, pos, size, style); - } - virtual ~DrawingSetup() {} - - virtual void Init(); - virtual void CreateControls(); - - // use these to get and set default values - virtual bool TransferDataToWindow(); - virtual bool TransferDataFromWindow(); - virtual bool ClearValuesToDefault(); - -private: - void OnCmdSelectColors(wxCommandEvent&); - void OnCmdSelectWidth(wxSpinEvent&); - void OnCmdResetColors(wxCommandEvent&); - void OnCmdResetAll(wxCommandEvent&); - void OnCmdChooseNewColor(wxCommandEvent&); - void OnCmdChooseNewPalette(wxCommandEvent&); - void OnCmdTextChanged(wxCommandEvent&); - void OnCmdChangePaletteColor(wxCommandEvent&); - void OnCmdChangePaletteName(wxCommandEvent&); - - void SetColor(int selection, int width, const wxColour& color); - void SetPaletteColor(int selection, const wxColour& color); - void SetPaletteName(int selection, const wxString& name); - wxBitmapComboBox* nameBox; - wxBitmapComboBox* mPaletteNameBox; - wxSpinCtrl* spin; - - int mActiveColorPalette{}; - std::vector mColorPaletteNames; - std::vector mColorPaletteColors; - wxPen mCalChartPens[kNumberPalettes][COLOR_NUM]; - wxBrush mCalChartBrushes[kNumberPalettes][COLOR_NUM]; - - double mPrintValues[5]; -}; - -enum { - BUTTON_SELECT = 1000, - BUTTON_RESTORE, - SPIN_WIDTH, - NEW_COLOR_CHOICE, - DOTRATIO, - NUMRATIO, - PLINERATIO, - SLINERATIO, - BUTTON_EDIT_PALETTE_COLOR, - BUTTON_EDIT_PALETTE_NAME, - NEW_COLOR_PALETTE, -}; - -BEGIN_EVENT_TABLE(DrawingSetup, PreferencePage) -EVT_BUTTON(BUTTON_SELECT, DrawingSetup::OnCmdSelectColors) -EVT_BUTTON(BUTTON_RESTORE, DrawingSetup::OnCmdResetColors) -EVT_SPINCTRL(SPIN_WIDTH, DrawingSetup::OnCmdSelectWidth) -EVT_COMBOBOX(NEW_COLOR_CHOICE, DrawingSetup::OnCmdChooseNewColor) -EVT_COMBOBOX(NEW_COLOR_PALETTE, DrawingSetup::OnCmdChooseNewPalette) -EVT_TEXT_ENTER(DOTRATIO, DrawingSetup::OnCmdTextChanged) -EVT_TEXT_ENTER(NUMRATIO, DrawingSetup::OnCmdTextChanged) -EVT_TEXT_ENTER(PLINERATIO, DrawingSetup::OnCmdTextChanged) -EVT_TEXT_ENTER(SLINERATIO, DrawingSetup::OnCmdTextChanged) -EVT_BUTTON(BUTTON_EDIT_PALETTE_COLOR, DrawingSetup::OnCmdChangePaletteColor) -EVT_BUTTON(BUTTON_EDIT_PALETTE_NAME, DrawingSetup::OnCmdChangePaletteName) -END_EVENT_TABLE() - -IMPLEMENT_CLASS(DrawingSetup, PreferencePage) - -void DrawingSetup::CreateControls() -{ - wxBoxSizer* topsizer = new wxBoxSizer(wxVERTICAL); - SetSizer(topsizer); - - wxStaticBoxSizer* boxsizer = new wxStaticBoxSizer(new wxStaticBox(this, -1, wxT("Palette Selector")), wxVERTICAL); - topsizer->Add(boxsizer); - - mPaletteNameBox = new wxBitmapComboBox(this, NEW_COLOR_PALETTE, mColorPaletteNames.at(0), wxDefaultPosition, wxSize(200, -1), kNumberPalettes, mColorPaletteNames.data(), wxCB_READONLY | wxCB_DROPDOWN); - boxsizer->Add(mPaletteNameBox, sLeftBasicSizerFlags); - - for (auto i = 0; i < kNumberPalettes; ++i) { - CreateAndSetItemBitmap(mPaletteNameBox, i, mColorPaletteColors.at(i)); - } - mPaletteNameBox->SetSelection(mActiveColorPalette); - - auto horizontalsizer = new wxBoxSizer(wxHORIZONTAL); - boxsizer->Add(horizontalsizer, sBasicSizerFlags); - - horizontalsizer->Add(new wxButton(this, BUTTON_EDIT_PALETTE_COLOR, wxT("&Edit Color")), sBasicSizerFlags); - horizontalsizer->Add(new wxButton(this, BUTTON_EDIT_PALETTE_NAME, wxT("&Edit Name")), sBasicSizerFlags); - - boxsizer = new wxStaticBoxSizer(new wxStaticBox(this, -1, wxT("Color settings")), wxVERTICAL); - topsizer->Add(boxsizer); - - horizontalsizer = new wxBoxSizer(wxHORIZONTAL); - nameBox = new wxBitmapComboBox(this, NEW_COLOR_CHOICE, mConfig.GetColorNames().at(0), wxDefaultPosition, wxDefaultSize, COLOR_NUM, mConfig.GetColorNames().data(), wxCB_READONLY | wxCB_DROPDOWN); - horizontalsizer->Add(nameBox, sBasicSizerFlags); - - for (CalChartColors i = COLOR_FIELD; i < COLOR_NUM; i = static_cast(static_cast(i) + 1)) { - CreateAndSetItemBitmap(nameBox, i, mConfig.Get_CalChartBrushAndPen(i).first); - } - nameBox->SetSelection(0); - - spin = new wxSpinCtrl(this, SPIN_WIDTH, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxSP_ARROW_KEYS, 1, 10, mCalChartPens[mActiveColorPalette][nameBox->GetSelection()].GetWidth()); - spin->SetValue(mCalChartPens[mActiveColorPalette][nameBox->GetSelection()].GetWidth()); - horizontalsizer->Add(spin, sBasicSizerFlags); - boxsizer->Add(horizontalsizer, sLeftBasicSizerFlags); - - horizontalsizer = new wxBoxSizer(wxHORIZONTAL); - - horizontalsizer->Add(new wxButton(this, BUTTON_SELECT, wxT("&Change Color")), sBasicSizerFlags); - horizontalsizer->Add(new wxButton(this, BUTTON_RESTORE, wxT("&Reset Color")), sBasicSizerFlags); - - boxsizer->Add(horizontalsizer, sBasicSizerFlags); - - boxsizer = new wxStaticBoxSizer(new wxStaticBox(this, -1, wxT("ratios")), wxVERTICAL); - topsizer->Add(boxsizer); - - horizontalsizer = new wxBoxSizer(wxHORIZONTAL); - boxsizer->Add(horizontalsizer, sLeftBasicSizerFlags); - - AddTextboxWithCaption(this, horizontalsizer, DOTRATIO, wxT("Dot Ratio:"), wxTE_PROCESS_ENTER); - AddTextboxWithCaption(this, horizontalsizer, NUMRATIO, wxT("Num Ratio:"), wxTE_PROCESS_ENTER); - AddTextboxWithCaption(this, horizontalsizer, PLINERATIO, wxT("P-Line Ratio:"), wxTE_PROCESS_ENTER); - AddTextboxWithCaption(this, horizontalsizer, SLINERATIO, wxT("S-Line Ratio:"), wxTE_PROCESS_ENTER); - - auto prefCanvas = new ColorSetupCanvas(mConfig, this); - // set scroll rate 1 to 1, so we can have even scrolling of whole field - topsizer->Add(prefCanvas, 1, wxEXPAND); - // mCanvas->SetScrollRate(1, 1); - - TransferDataToWindow(); -} - -void DrawingSetup::Init() -{ - // first read out the defaults: - mActiveColorPalette = mConfig.GetActiveColorPalette(); - mColorPaletteNames = GetColorPaletteNames(mConfig); - mColorPaletteColors = GetColorPaletteColors(mConfig); - - for (auto palette = 0; palette < kNumberPalettes; ++palette) { - for (CalChartColors i = COLOR_FIELD; i < COLOR_NUM; i = static_cast(static_cast(i) + 1)) { - auto brushAndPen = mConfig.Get_CalChartBrushAndPen(palette, i); - mCalChartPens[palette][i] = brushAndPen.second; - mCalChartBrushes[palette][i] = brushAndPen.first; - } - } - - mPrintValues[0] = mConfig.Get_DotRatio(); - mPrintValues[1] = mConfig.Get_NumRatio(); - mPrintValues[2] = mConfig.Get_PLineRatio(); - mPrintValues[3] = mConfig.Get_SLineRatio(); - mPrintValues[4] = mConfig.Get_ContRatio(); -} - -bool DrawingSetup::TransferDataToWindow() -{ - for (auto i = 0; i < kNumberPalettes; ++i) { - CreateAndSetItemBitmap(mPaletteNameBox, i, mColorPaletteColors.at(i)); - } - for (auto i = 0; i < kNumberPalettes; ++i) { - mPaletteNameBox->SetString(i, mColorPaletteNames.at(i)); - } - mPaletteNameBox->SetSelection(mActiveColorPalette); - - for (CalChartColors i = COLOR_FIELD; i < COLOR_NUM; - i = static_cast(static_cast(i) + 1)) { - CreateAndSetItemBitmap(nameBox, i, mCalChartBrushes[mActiveColorPalette][i]); - } - spin->SetValue(mCalChartPens[mActiveColorPalette][nameBox->GetSelection()].GetWidth()); - - wxString buf; - wxTextCtrl* text = (wxTextCtrl*)FindWindow(DOTRATIO); - buf.Printf(wxT("%.2f"), mPrintValues[0]); - text->SetValue(buf); - text = (wxTextCtrl*)FindWindow(NUMRATIO); - buf.Printf(wxT("%.2f"), mPrintValues[1]); - text->SetValue(buf); - text = (wxTextCtrl*)FindWindow(PLINERATIO); - buf.Printf(wxT("%.2f"), mPrintValues[2]); - text->SetValue(buf); - text = (wxTextCtrl*)FindWindow(SLINERATIO); - buf.Printf(wxT("%.2f"), mPrintValues[3]); - text->SetValue(buf); - - return true; -} - -bool DrawingSetup::TransferDataFromWindow() -{ - // Data is already transferred when we update the controls, so nothing to do here. - mConfig.SetActiveColorPalette(mActiveColorPalette); - return true; -} - -bool DrawingSetup::ClearValuesToDefault() -{ - mConfig.ClearActiveColorPalette(); - for (auto i = 0; i < kNumberPalettes; ++i) { - mConfig.ClearColorPaletteColor(i); - mConfig.ClearColorPaletteName(i); - } - - for (auto palette = 0; palette < kNumberPalettes; ++palette) { - for (CalChartColors i = COLOR_FIELD; i < COLOR_NUM; i = static_cast(static_cast(i) + 1)) { - mConfig.Clear_CalChartConfigColor(palette, i); - } - } - Init(); - TransferDataToWindow(); - return true; -} - -// when the palette changes -void DrawingSetup::SetColor(int selection, int width, const wxColour& color) -{ - mCalChartPens[mActiveColorPalette][selection] = *wxThePenList->FindOrCreatePen(color, width, wxPENSTYLE_SOLID); - mCalChartBrushes[mActiveColorPalette][selection] = *wxTheBrushList->FindOrCreateBrush(color, wxBRUSHSTYLE_SOLID); - - mConfig.Set_CalChartBrushAndPen(static_cast(selection), mCalChartBrushes[mActiveColorPalette][selection], mCalChartPens[mActiveColorPalette][selection]); - - // update the namebox list - CreateAndSetItemBitmap(nameBox, selection, mCalChartBrushes[mActiveColorPalette][selection]); - Refresh(); -} - -void DrawingSetup::SetPaletteColor(int selection, wxColour const& color) -{ - mColorPaletteColors.at(selection) = *wxTheBrushList->FindOrCreateBrush(color, wxBRUSHSTYLE_SOLID); - - // this is needed so we draw things out on the page correctly. - mConfig.SetColorPaletteColor(selection, mColorPaletteColors.at(selection)); - - CreateAndSetItemBitmap(mPaletteNameBox, selection, mColorPaletteColors.at(selection)); - Refresh(); -} - -void DrawingSetup::SetPaletteName(int selection, wxString const& name) -{ - mColorPaletteNames.at(selection) = name; - - // this is needed so we draw things out on the page correctly. - mConfig.SetColorPaletteName(selection, name); - - mPaletteNameBox->SetString(selection, mColorPaletteNames.at(selection)); - Refresh(); -} - -void DrawingSetup::OnCmdSelectColors(wxCommandEvent&) -{ - int selection = nameBox->GetSelection(); - wxColourData data; - data.SetChooseFull(true); - data.SetColour(mCalChartBrushes[mActiveColorPalette][selection].GetColour()); - wxColourDialog dialog(this, &data); - if (dialog.ShowModal() == wxID_OK) { - wxColourData retdata = dialog.GetColourData(); - wxColour c = retdata.GetColour(); - SetColor(selection, mCalChartPens[mActiveColorPalette][selection].GetWidth(), c); - } - Refresh(); -} - -void DrawingSetup::OnCmdChangePaletteColor(wxCommandEvent&) -{ - int selection = mPaletteNameBox->GetSelection(); - wxColourData data; - data.SetChooseFull(true); - data.SetColour(mColorPaletteColors.at(selection).GetColour()); - wxColourDialog dialog(this, &data); - if (dialog.ShowModal() == wxID_OK) { - wxColourData retdata = dialog.GetColourData(); - wxColour c = retdata.GetColour(); - SetPaletteColor(selection, c); - } - Refresh(); -} - -void DrawingSetup::OnCmdChangePaletteName(wxCommandEvent&) -{ - int selection = mPaletteNameBox->GetSelection(); - auto v = mPaletteNameBox->GetValue(); - wxTextEntryDialog dialog(this, wxT("Enter name for Palette"), wxT("Enter name for Palette"), v, wxOK | wxCANCEL); - if (dialog.ShowModal() == wxID_OK) { - SetPaletteName(selection, dialog.GetValue()); - } - Refresh(); -} - -void DrawingSetup::OnCmdSelectWidth(wxSpinEvent& e) -{ - int selection = nameBox->GetSelection(); - SetColor(selection, e.GetPosition(), mCalChartPens[mActiveColorPalette][selection].GetColour()); -} - -void DrawingSetup::OnCmdResetColors(wxCommandEvent&) -{ - int selection = nameBox->GetSelection(); - SetColor(selection, mConfig.GetDefaultPenWidth()[selection], - mConfig.GetDefaultColors()[selection]); - mConfig.Clear_CalChartConfigColor(static_cast(selection)); -} - -void DrawingSetup::OnCmdChooseNewColor(wxCommandEvent&) -{ - spin->SetValue(mCalChartPens[mActiveColorPalette][nameBox->GetSelection()].GetWidth()); -} - -void DrawingSetup::OnCmdChooseNewPalette(wxCommandEvent&) -{ - // we set the active palette, and now need to refresh everything - mActiveColorPalette = mPaletteNameBox->GetSelection(); - mConfig.SetActiveColorPalette(mActiveColorPalette); - TransferDataToWindow(); - Refresh(); -} - -void DrawingSetup::OnCmdTextChanged(wxCommandEvent& e) -{ - auto id = e.GetId(); - wxTextCtrl* text = (wxTextCtrl*)FindWindow(id); - double value; - if (text->GetValue().ToDouble(&value)) { - switch (id - DOTRATIO) { - case 0: - mConfig.Set_DotRatio(value); - break; - case 1: - mConfig.Set_NumRatio(value); - break; - case 2: - mConfig.Set_PLineRatio(value); - break; - case 3: - mConfig.Set_SLineRatio(value); - break; - case 4: - mConfig.Set_ContRatio(value); - break; - } - } - Refresh(); -} - -//////// General setup //////// -// setup pringing values and colors -//////// - -class PSPrintingSetUp : public PreferencePage { - DECLARE_CLASS(PSPrintingSetUp) - DECLARE_EVENT_TABLE() - -public: - PSPrintingSetUp(CalChartConfiguration& config, wxWindow* parent, - wxWindowID id = wxID_ANY, - const wxString& caption = wxT("Printing Values"), - const wxPoint& pos = wxDefaultPosition, - const wxSize& size = wxDefaultSize, - long style = wxCAPTION | wxRESIZE_BORDER | wxSYSTEM_MENU) - : PreferencePage(config) - { - Init(); - Create(parent, id, caption, pos, size, style); - } - virtual ~PSPrintingSetUp() {} - - virtual void Init(); - virtual void CreateControls(); - - // use these to get and set default values - virtual bool TransferDataToWindow(); - virtual bool TransferDataFromWindow(); - virtual bool ClearValuesToDefault(); - -private: - wxString mFontNames[7]; - double mPrintValues[8]; -}; - -typedef enum { - RESET = 1000, - HEADFONT, - MAINFONT, - NUMBERFONT, - CONTFONT, - BOLDFONT, - ITALFONT, - BOLDITALFONT, - HEADERSIZE, - YARDSSIZE, - TEXTSIZE, - CONTRATIO, -} PSPrintingSetUp_IDs; - -BEGIN_EVENT_TABLE(PSPrintingSetUp, PreferencePage) -END_EVENT_TABLE() - -IMPLEMENT_CLASS(PSPrintingSetUp, PreferencePage) - -void PSPrintingSetUp::CreateControls() -{ - wxBoxSizer* topsizer = new wxBoxSizer(wxVERTICAL); - SetSizer(topsizer); - - wxBoxSizer* horizontalsizer = new wxBoxSizer(wxHORIZONTAL); - topsizer->Add(horizontalsizer, sLeftBasicSizerFlags); - - AddTextboxWithCaption(this, horizontalsizer, HEADFONT, wxT("Header Font:")); - AddTextboxWithCaption(this, horizontalsizer, MAINFONT, wxT("Main Font:")); - AddTextboxWithCaption(this, horizontalsizer, NUMBERFONT, wxT("Number Font:")); - AddTextboxWithCaption(this, horizontalsizer, CONTFONT, - wxT("Continuity Font:")); - - horizontalsizer = new wxBoxSizer(wxHORIZONTAL); - topsizer->Add(horizontalsizer, sLeftBasicSizerFlags); - - AddTextboxWithCaption(this, horizontalsizer, BOLDFONT, wxT("Bold Font:")); - AddTextboxWithCaption(this, horizontalsizer, ITALFONT, wxT("Italic Font:")); - AddTextboxWithCaption(this, horizontalsizer, BOLDITALFONT, - wxT("Bold Italic Font:")); - - horizontalsizer = new wxBoxSizer(wxHORIZONTAL); - topsizer->Add(horizontalsizer, sLeftBasicSizerFlags); - - AddTextboxWithCaption(this, horizontalsizer, HEADERSIZE, wxT("Header Size:")); - AddTextboxWithCaption(this, horizontalsizer, YARDSSIZE, wxT("Yards Side:")); - AddTextboxWithCaption(this, horizontalsizer, TEXTSIZE, wxT("Text Side:")); - - horizontalsizer = new wxBoxSizer(wxHORIZONTAL); - topsizer->Add(horizontalsizer, sLeftBasicSizerFlags); - - AddTextboxWithCaption(this, horizontalsizer, CONTRATIO, - wxT("Continuity Ratio:")); - - TransferDataToWindow(); -} - -void PSPrintingSetUp::Init() -{ - mFontNames[0] = mConfig.Get_HeadFont(); - mFontNames[1] = mConfig.Get_MainFont(); - mFontNames[2] = mConfig.Get_NumberFont(); - mFontNames[3] = mConfig.Get_ContFont(); - mFontNames[4] = mConfig.Get_BoldFont(); - mFontNames[5] = mConfig.Get_ItalFont(); - mFontNames[6] = mConfig.Get_BoldItalFont(); - mPrintValues[0] = mConfig.Get_HeaderSize(); - mPrintValues[1] = mConfig.Get_YardsSize(); - mPrintValues[2] = mConfig.Get_TextSize(); - mPrintValues[7] = mConfig.Get_ContRatio(); -} - -bool PSPrintingSetUp::TransferDataToWindow() -{ - wxTextCtrl* text = (wxTextCtrl*)FindWindow(HEADFONT); - text->SetValue(mFontNames[0]); - text = (wxTextCtrl*)FindWindow(MAINFONT); - text->SetValue(mFontNames[1]); - text = (wxTextCtrl*)FindWindow(NUMBERFONT); - text->SetValue(mFontNames[2]); - text = (wxTextCtrl*)FindWindow(CONTFONT); - text->SetValue(mFontNames[3]); - text = (wxTextCtrl*)FindWindow(BOLDFONT); - text->SetValue(mFontNames[4]); - text = (wxTextCtrl*)FindWindow(ITALFONT); - text->SetValue(mFontNames[5]); - text = (wxTextCtrl*)FindWindow(BOLDITALFONT); - text->SetValue(mFontNames[6]); - text = (wxTextCtrl*)FindWindow(HEADERSIZE); - wxString buf; - buf.Printf(wxT("%.2f"), mPrintValues[0]); - text->SetValue(buf); - text = (wxTextCtrl*)FindWindow(YARDSSIZE); - buf.Printf(wxT("%.2f"), mPrintValues[1]); - text->SetValue(buf); - text = (wxTextCtrl*)FindWindow(TEXTSIZE); - buf.Printf(wxT("%.2f"), mPrintValues[2]); - text->SetValue(buf); - text = (wxTextCtrl*)FindWindow(CONTRATIO); - buf.Printf(wxT("%.2f"), mPrintValues[7]); - text->SetValue(buf); - - return true; -} - -bool PSPrintingSetUp::TransferDataFromWindow() -{ - // read out the values from the window - wxTextCtrl* text = (wxTextCtrl*)FindWindow(HEADFONT); - mFontNames[0] = text->GetValue(); - text = (wxTextCtrl*)FindWindow(MAINFONT); - mFontNames[1] = text->GetValue(); - text = (wxTextCtrl*)FindWindow(NUMBERFONT); - mFontNames[2] = text->GetValue(); - text = (wxTextCtrl*)FindWindow(CONTFONT); - mFontNames[3] = text->GetValue(); - text = (wxTextCtrl*)FindWindow(BOLDFONT); - mFontNames[4] = text->GetValue(); - text = (wxTextCtrl*)FindWindow(ITALFONT); - mFontNames[5] = text->GetValue(); - text = (wxTextCtrl*)FindWindow(BOLDITALFONT); - mFontNames[6] = text->GetValue(); - text = (wxTextCtrl*)FindWindow(HEADERSIZE); - text->GetValue().ToDouble(&mPrintValues[0]); - text = (wxTextCtrl*)FindWindow(YARDSSIZE); - text->GetValue().ToDouble(&mPrintValues[1]); - text = (wxTextCtrl*)FindWindow(TEXTSIZE); - text->GetValue().ToDouble(&mPrintValues[2]); - text = (wxTextCtrl*)FindWindow(CONTRATIO); - text->GetValue().ToDouble(&mPrintValues[7]); - - // write out the values defaults: - mConfig.Set_HeadFont(mFontNames[0]); - mConfig.Set_MainFont(mFontNames[1]); - mConfig.Set_NumberFont(mFontNames[2]); - mConfig.Set_ContFont(mFontNames[3]); - mConfig.Set_BoldFont(mFontNames[4]); - mConfig.Set_ItalFont(mFontNames[5]); - mConfig.Set_BoldItalFont(mFontNames[6]); - mConfig.Set_HeaderSize(mPrintValues[0]); - mConfig.Set_YardsSize(mPrintValues[1]); - mConfig.Set_TextSize(mPrintValues[2]); - mConfig.Set_ContRatio(mPrintValues[7]); - - return true; -} - -bool PSPrintingSetUp::ClearValuesToDefault() -{ - mConfig.Clear_HeadFont(); - mConfig.Clear_MainFont(); - mConfig.Clear_NumberFont(); - mConfig.Clear_ContFont(); - mConfig.Clear_BoldFont(); - mConfig.Clear_ItalFont(); - mConfig.Clear_BoldItalFont(); - mConfig.Clear_HeaderSize(); - mConfig.Clear_YardsSize(); - mConfig.Clear_TextSize(); - mConfig.Clear_ContRatio(); - Init(); - return TransferDataToWindow(); -} - -//////// Show Mode setup //////// -// setup drawing characteristics -//////// - -const int zoom_amounts[] = { 500, 200, 150, 100, 75, 50, 25, 10 }; - -class ShowModeSetup : public PreferencePage { - DECLARE_CLASS(ShowModeSetup) - DECLARE_EVENT_TABLE() - -public: - ShowModeSetup(CalChartConfiguration& config, wxWindow* parent, - wxWindowID id = wxID_ANY, - const wxString& caption = wxT("Setup Modes"), - const wxPoint& pos = wxDefaultPosition, - const wxSize& size = wxDefaultSize, - long style = wxCAPTION | wxRESIZE_BORDER | wxSYSTEM_MENU) - : PreferencePage(config) - { - Init(); - Create(parent, id, caption, pos, size, style); - } - ~ShowModeSetup() {} - - virtual void Init(); - virtual void CreateControls(); - - // use these to get and set default values - virtual bool TransferDataToWindow(); - virtual bool TransferDataFromWindow(); - virtual bool ClearValuesToDefault(); - -private: - void OnCmdLineText(wxCommandEvent&); - void OnCmdChoice(wxCommandEvent&); - CalChartConfiguration::ShowModeInfo_t mShowModeValues[SHOWMODE_NUM]; - CalChart::ShowMode::YardLinesInfo_t mYardText; - int mWhichMode; - int mWhichYardLine; -}; - -enum { - MODE_CHOICE = 1000, - WESTHASH, - EASTHASH, - BORDER_LEFT, - BORDER_TOP, - BORDER_RIGHT, - BORDER_BOTTOM, - OFFSET_X, - OFFSET_Y, - SIZE_X, - SIZE_Y, - SHOW_LINE_MARKING, - SHOW_LINE_VALUE, - CANVAS, -}; - -BEGIN_EVENT_TABLE(ShowModeSetup, PreferencePage) -EVT_CHOICE(MODE_CHOICE, ShowModeSetup::OnCmdChoice) -EVT_CHOICE(SHOW_LINE_MARKING, ShowModeSetup::OnCmdChoice) -END_EVENT_TABLE() - -IMPLEMENT_CLASS(ShowModeSetup, PreferencePage) - -void ShowModeSetup::CreateControls() -{ - wxBoxSizer* topsizer = new wxBoxSizer(wxVERTICAL); - SetSizer(topsizer); - - wxChoice* modes = new wxChoice(this, MODE_CHOICE, wxDefaultPosition, - wxDefaultSize, SHOWMODE_NUM, kShowModeStrings); - modes->SetSelection(0); - topsizer->Add(modes, sLeftBasicSizerFlags); - - wxBoxSizer* sizer1 = new wxBoxSizer(wxHORIZONTAL); - topsizer->Add(sizer1, sLeftBasicSizerFlags); - - auto refresh_action = [this](wxCommandEvent&) { - this->TransferDataFromWindow(); - Refresh(); - }; - - AddTextboxWithCaptionAndAction(this, sizer1, WESTHASH, wxT("West Hash"), - refresh_action, wxTE_PROCESS_ENTER); - AddTextboxWithCaptionAndAction(this, sizer1, EASTHASH, wxT("East Hash"), - refresh_action, wxTE_PROCESS_ENTER); - - sizer1 = new wxBoxSizer(wxHORIZONTAL); - topsizer->Add(sizer1, sLeftBasicSizerFlags); - AddTextboxWithCaptionAndAction(this, sizer1, BORDER_LEFT, wxT("Left Border"), - refresh_action, wxTE_PROCESS_ENTER); - AddTextboxWithCaptionAndAction(this, sizer1, BORDER_TOP, wxT("Top Border"), - refresh_action, wxTE_PROCESS_ENTER); - AddTextboxWithCaptionAndAction(this, sizer1, BORDER_RIGHT, - wxT("Right Border"), refresh_action, - wxTE_PROCESS_ENTER); - AddTextboxWithCaptionAndAction(this, sizer1, BORDER_BOTTOM, - wxT("Bottom Border"), refresh_action, - wxTE_PROCESS_ENTER); - - sizer1 = new wxBoxSizer(wxHORIZONTAL); - topsizer->Add(sizer1, sLeftBasicSizerFlags); - AddTextboxWithCaptionAndAction(this, sizer1, OFFSET_X, wxT("Offset X"), - refresh_action, wxTE_PROCESS_ENTER); - AddTextboxWithCaptionAndAction(this, sizer1, OFFSET_Y, wxT("Offset Y"), - refresh_action, wxTE_PROCESS_ENTER); - AddTextboxWithCaptionAndAction(this, sizer1, SIZE_X, wxT("Size X"), - refresh_action, wxTE_PROCESS_ENTER); - AddTextboxWithCaptionAndAction(this, sizer1, SIZE_Y, wxT("Size Y"), - refresh_action, wxTE_PROCESS_ENTER); - - sizer1 = new wxBoxSizer(wxHORIZONTAL); - topsizer->Add(sizer1, sLeftBasicSizerFlags); - wxBoxSizer* textsizer = new wxBoxSizer(wxHORIZONTAL); - sizer1->Add(textsizer, sBasicSizerFlags); - textsizer->Add(new wxStaticText(this, wxID_STATIC, - wxT("Adjust yardline marker"), - wxDefaultPosition, wxDefaultSize, 0), - 0, wxALIGN_LEFT | wxALL, 5); - wxChoice* textchoice = new wxChoice(this, SHOW_LINE_MARKING, wxDefaultPosition, wxDefaultSize, - wxArrayString{ mConfig.Get_yard_text_index().size(), mConfig.Get_yard_text_index().data() }); - textchoice->SetSelection(0); - textsizer->Add(textchoice); - auto show_line_value = new wxTextCtrl(this, SHOW_LINE_VALUE, wxEmptyString, wxDefaultPosition, - wxDefaultSize, wxTE_PROCESS_ENTER); - show_line_value->Bind(wxEVT_TEXT_ENTER, refresh_action); - textsizer->Add(show_line_value, sBasicSizerFlags); - - textsizer = new wxBoxSizer(wxHORIZONTAL); - sizer1->Add(textsizer, sBasicSizerFlags); - textsizer->Add(new wxStaticText(this, wxID_STATIC, wxT("Zoom"), - wxDefaultPosition, wxDefaultSize, 0), - 0, wxALIGN_LEFT | wxALL, 5); - wxArrayString zoomtext; - for (auto& i : zoom_amounts) { - wxString buf; - buf.sprintf(wxT("%d%%"), i); - zoomtext.Add(buf); - } - auto zoomBox = new wxChoice(this, wxID_ANY, wxDefaultPosition, wxDefaultSize, zoomtext); - zoomBox->Bind(wxEVT_CHOICE, [=](wxCommandEvent& event) { - size_t sel = event.GetInt(); - float zoom_amount = zoom_amounts[sel] / 100.0; - static_cast(FindWindow(CANVAS)) - ->SetZoom(zoom_amount); - }); - - // set the text to the default zoom level - textsizer->Add(zoomBox, sLeftBasicSizerFlags); - - auto modeSetupCanvas = new ShowModeSetupCanvas(mConfig, this, CANVAS); - modeSetupCanvas->SetScrollRate(1, 1); - topsizer->Add(modeSetupCanvas, 1, wxEXPAND); - - modeSetupCanvas->SetMode(CalChart::ShowMode::CreateShowMode(mConfig.Get_ShowModeInfo(static_cast(mWhichMode)), mYardText)); - modeSetupCanvas->SetZoom(zoom_amounts[5] / 100.0); - zoomBox->SetSelection(5); - - TransferDataToWindow(); -} - -void ShowModeSetup::Init() -{ - mWhichMode = 0; - mWhichYardLine = 0; - for (size_t i = 0; i < SHOWMODE_NUM; ++i) { - mShowModeValues[i] = mConfig.Get_ShowModeInfo(static_cast(i)); - } - for (size_t i = 0; i < kYardTextValues; ++i) { - mYardText[i] = mConfig.Get_yard_text(i); - } -} - -bool ShowModeSetup::TransferDataToWindow() -{ - // standard show - for (auto i = mShowModeValues[mWhichMode].begin(); - i != mShowModeValues[mWhichMode].end(); ++i) { - wxString buf; - wxTextCtrl* text = (wxTextCtrl*)FindWindow( - WESTHASH + std::distance(mShowModeValues[mWhichMode].begin(), i)); - buf.Printf(wxT("%d"), static_cast(*i)); - text->ChangeValue(buf); - } - - wxTextCtrl* text = (wxTextCtrl*)FindWindow(SHOW_LINE_VALUE); - text->SetValue(mYardText[mWhichYardLine]); - return true; -} - -bool ShowModeSetup::TransferDataFromWindow() -{ - // read out the values from the window - // standard show - for (auto i = mShowModeValues[mWhichMode].begin(); - i != mShowModeValues[mWhichMode].end(); ++i) { - long val; - wxTextCtrl* text = (wxTextCtrl*)FindWindow( - WESTHASH + std::distance(mShowModeValues[mWhichMode].begin(), i)); - text->GetValue().ToLong(&val); - *i = val; - } - // write out the values defaults: - for (size_t i = 0; i < SHOWMODE_NUM; ++i) { - mConfig.Set_ShowModeInfo(static_cast(i), - mShowModeValues[i]); - } - - // grab whatever's in the box - wxTextCtrl* text = (wxTextCtrl*)FindWindow(SHOW_LINE_VALUE); - mYardText[mWhichYardLine] = text->GetValue(); - for (size_t i = 0; i < kYardTextValues; ++i) { - mConfig.Set_yard_text(i, mYardText[i]); - } - // now set the canvas - ((ShowModeSetupCanvas*)FindWindow(CANVAS))->SetMode(CalChart::ShowMode::CreateShowMode(mConfig.Get_ShowModeInfo(static_cast(mWhichMode)), mYardText)); - - return true; -} - -bool ShowModeSetup::ClearValuesToDefault() -{ - for (size_t i = 0; i < SHOWMODE_NUM; ++i) { - mConfig.Clear_ShowModeInfo(static_cast(i)); - } - for (auto i = 0; i < kYardTextValues; ++i) { - mConfig.Clear_yard_text(i); - } - Init(); - ((ShowModeSetupCanvas*)FindWindow(CANVAS))->SetMode(CalChart::ShowMode::CreateShowMode(mConfig.Get_ShowModeInfo(static_cast(mWhichMode)), mYardText)); - return TransferDataToWindow(); -} - -void ShowModeSetup::OnCmdChoice(wxCommandEvent&) -{ - // save off all the old values: - for (auto i = mShowModeValues[mWhichMode].begin(); - i != mShowModeValues[mWhichMode].end(); ++i) { - long val; - wxTextCtrl* text = (wxTextCtrl*)FindWindow( - WESTHASH + std::distance(mShowModeValues[mWhichMode].begin(), i)); - text->GetValue().ToLong(&val); - *i = val; - } - wxChoice* modes = (wxChoice*)FindWindow(MODE_CHOICE); - mWhichMode = modes->GetSelection(); - ShowModeSetupCanvas* canvas = (ShowModeSetupCanvas*)FindWindow(CANVAS); - canvas->SetMode(CalChart::ShowMode::CreateShowMode(mConfig.Get_ShowModeInfo(static_cast(mWhichMode)), mYardText)); - - wxTextCtrl* text = (wxTextCtrl*)FindWindow(SHOW_LINE_VALUE); - mYardText[mWhichYardLine] = text->GetValue(); - // update mode - for (size_t i = 0; i < kYardTextValues; ++i) { - mConfig.Set_yard_text(i, mYardText[i]); - } - - modes = (wxChoice*)FindWindow(SHOW_LINE_MARKING); - mWhichYardLine = modes->GetSelection(); - TransferDataToWindow(); -} - -//////////////// -class ContCellSetup : public PreferencePage { - DECLARE_CLASS(ContCellSetup) - DECLARE_EVENT_TABLE() - -public: - ContCellSetup(CalChartConfiguration& config, wxWindow* parent, - wxWindowID id = wxID_ANY, - const wxString& caption = wxT("ContCell Setup"), - const wxPoint& pos = wxDefaultPosition, - const wxSize& size = wxDefaultSize, - long style = wxCAPTION | wxRESIZE_BORDER | wxSYSTEM_MENU) - : PreferencePage(config) - { - Init(); - Create(parent, id, caption, pos, size, style); - } - virtual ~ContCellSetup() {} - - virtual void Init(); - virtual void CreateControls(); - - // use these to get and set default values - virtual bool TransferDataToWindow(); - virtual bool TransferDataFromWindow(); - virtual bool ClearValuesToDefault(); - -private: - void OnCmdLongForm(wxCommandEvent&); - void OnCmdFontSize(wxSpinEvent&); - void OnCmdRounding(wxSpinEvent&); - void OnCmdTextPadding(wxSpinEvent&); - void OnCmdBoxPadding(wxSpinEvent&); - void OnCmdSelectWidth(wxSpinEvent&); - - void OnCmdSelectColors(wxCommandEvent&); - void OnCmdChooseNewColor(wxCommandEvent&); - void OnCmdResetColors(wxCommandEvent&); - void SetColor(int selection, const wxColour& color); - - // we can set up the Font, colors, size. - wxBitmapComboBox* nameBox; - wxBrush mContCellBrushes[COLOR_CONTCELLS_NUM]; -}; - -enum { - CHECK_LongForm, - SPIN_Font_Size, - SPIN_Rouding, - SPIN_Text_Padding, - SPIN_Box_Padding, -}; - -BEGIN_EVENT_TABLE(ContCellSetup, PreferencePage) -EVT_CHECKBOX(CHECK_LongForm, ContCellSetup::OnCmdLongForm) -EVT_SPINCTRL(SPIN_Font_Size, ContCellSetup::OnCmdFontSize) -EVT_SPINCTRL(SPIN_Rouding, ContCellSetup::OnCmdRounding) -EVT_SPINCTRL(SPIN_Text_Padding, ContCellSetup::OnCmdTextPadding) -EVT_SPINCTRL(SPIN_Box_Padding, ContCellSetup::OnCmdBoxPadding) -EVT_BUTTON(BUTTON_SELECT, ContCellSetup::OnCmdSelectColors) -EVT_BUTTON(BUTTON_RESTORE, ContCellSetup::OnCmdResetColors) -EVT_COMBOBOX(NEW_COLOR_CHOICE, ContCellSetup::OnCmdChooseNewColor) -END_EVENT_TABLE() - -IMPLEMENT_CLASS(ContCellSetup, PreferencePage) - -template -static auto do_cloning(T const& cont) -{ - std::vector> copied_cont; - for (auto&& i : cont.GetParsedContinuity()) { - copied_cont.emplace_back(i->clone()); - } - return copied_cont; -} - -void ContCellSetup::CreateControls() -{ - auto topsizer = new wxBoxSizer(wxVERTICAL); - SetSizer(topsizer); - - auto boxsizer = new wxStaticBoxSizer( - new wxStaticBox(this, -1, wxT("Color settings")), wxVERTICAL); - topsizer->Add(boxsizer); - - auto horizontalsizer = new wxBoxSizer(wxHORIZONTAL); - boxsizer->Add(horizontalsizer, sLeftBasicSizerFlags); - nameBox = new wxBitmapComboBox( - this, NEW_COLOR_CHOICE, mConfig.GetContCellColorNames().at(0), wxDefaultPosition, - wxDefaultSize, COLOR_CONTCELLS_NUM, mConfig.GetContCellColorNames().data(), - wxCB_READONLY | wxCB_DROPDOWN); - horizontalsizer->Add(nameBox, sBasicSizerFlags); - - for (auto i = 0; i < COLOR_CONTCELLS_NUM; ++i) { - CreateAndSetItemBitmap(nameBox, i, mConfig.Get_ContCellBrushAndPen(static_cast(i)).first); - } - nameBox->SetSelection(0); - - horizontalsizer = new wxBoxSizer(wxHORIZONTAL); - boxsizer->Add(horizontalsizer, sLeftBasicSizerFlags); - horizontalsizer->Add(new wxButton(this, BUTTON_SELECT, wxT("&Change Color")), sBasicSizerFlags); - horizontalsizer->Add(new wxButton(this, BUTTON_RESTORE, wxT("&Reset Color")), sBasicSizerFlags); - - horizontalsizer = new wxStaticBoxSizer(new wxStaticBox(this, -1, wxT("Cont Cell settings")), wxHORIZONTAL); - topsizer->Add(horizontalsizer); - - boxsizer = new wxStaticBoxSizer(new wxStaticBox(this, -1, wxT("Long form")), wxVERTICAL); - horizontalsizer->Add(boxsizer, sBasicSizerFlags); - auto checkbox = new wxCheckBox(this, CHECK_LongForm, wxT("Long form")); - checkbox->SetValue(mConfig.Get_ContCellLongForm()); - boxsizer->Add(checkbox, sBasicSizerFlags); - - boxsizer = new wxStaticBoxSizer(new wxStaticBox(this, -1, wxT("Font Size")), wxVERTICAL); - horizontalsizer->Add(boxsizer, sBasicSizerFlags); - auto spin = new wxSpinCtrl(this, SPIN_Font_Size, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxSP_ARROW_KEYS, 1, 30, mConfig.Get_ContCellFontSize()); - boxsizer->Add(spin, sBasicSizerFlags); - - boxsizer = new wxStaticBoxSizer(new wxStaticBox(this, -1, wxT("Rounding")), wxVERTICAL); - horizontalsizer->Add(boxsizer, sBasicSizerFlags); - spin = new wxSpinCtrl(this, SPIN_Rouding, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxSP_ARROW_KEYS, 1, 10, mConfig.Get_ContCellRounding()); - boxsizer->Add(spin, sBasicSizerFlags); - - boxsizer = new wxStaticBoxSizer(new wxStaticBox(this, -1, wxT("Text Padding")), wxVERTICAL); - horizontalsizer->Add(boxsizer, sBasicSizerFlags); - spin = new wxSpinCtrl(this, SPIN_Text_Padding, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxSP_ARROW_KEYS, 1, 10, mConfig.Get_ContCellTextPadding()); - boxsizer->Add(spin, sBasicSizerFlags); - - boxsizer = new wxStaticBoxSizer(new wxStaticBox(this, -1, wxT("Box Padding")), wxVERTICAL); - horizontalsizer->Add(boxsizer, sBasicSizerFlags); - spin = new wxSpinCtrl(this, SPIN_Box_Padding, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxSP_ARROW_KEYS, 1, 10, mConfig.Get_ContCellBoxPadding()); - boxsizer->Add(spin, sBasicSizerFlags); - - auto canvas = new ContinuityBrowserPanel(SYMBOL_PLAIN, mConfig, this); - topsizer->Add(canvas, 1, wxEXPAND); - auto basic_cont = CalChart::Continuity{ "ewns np\nX = distfrom(sp r2)\nmt (24-X)w\nmarch gv dist(np) dir(np) w\nmtrm e" }; - auto clonedOut = do_cloning(basic_cont); - clonedOut.emplace_back(std::make_unique(std::make_unique(), std::make_unique())); - canvas->DoSetContinuity(CalChart::Continuity{ std::move(clonedOut) }); - - TransferDataToWindow(); -} - -void ContCellSetup::Init() -{ - // first read out the defaults: - for (auto i = 0; i < COLOR_CONTCELLS_NUM; ++i) { - auto brushAndPen = mConfig.Get_ContCellBrushAndPen(static_cast(i)); - mContCellBrushes[i] = brushAndPen.first; - } -} - -bool ContCellSetup::TransferDataToWindow() -{ - return true; -} - -bool ContCellSetup::TransferDataFromWindow() -{ - return true; -} - -bool ContCellSetup::ClearValuesToDefault() -{ - mConfig.Clear_ContCellLongForm(); - mConfig.Clear_ContCellFontSize(); - mConfig.Clear_ContCellRounding(); - mConfig.Clear_ContCellTextPadding(); - mConfig.Clear_ContCellBoxPadding(); - - for (ContCellColors i = COLOR_CONTCELLS_PROC; i < COLOR_CONTCELLS_NUM; i = static_cast(static_cast(i) + 1)) { - SetColor(i, mConfig.GetContCellDefaultColors()[i]); - mConfig.Clear_ContCellConfigColor(i); - } - Init(); - TransferDataToWindow(); - return true; -} - -void ContCellSetup::OnCmdLongForm(wxCommandEvent& e) -{ - mConfig.Set_ContCellLongForm(e.IsChecked()); - Refresh(); -} - -void ContCellSetup::OnCmdFontSize(wxSpinEvent& e) -{ - mConfig.Set_ContCellFontSize(e.GetValue()); - Refresh(); -} - -void ContCellSetup::OnCmdRounding(wxSpinEvent& e) -{ - mConfig.Set_ContCellRounding(e.GetValue()); - Refresh(); -} - -void ContCellSetup::OnCmdTextPadding(wxSpinEvent& e) -{ - mConfig.Set_ContCellTextPadding(e.GetValue()); - Refresh(); -} - -void ContCellSetup::OnCmdBoxPadding(wxSpinEvent& e) -{ - mConfig.Set_ContCellBoxPadding(e.GetValue()); - Refresh(); -} - -void ContCellSetup::SetColor(int selection, const wxColour& color) -{ - auto pen = *wxThePenList->FindOrCreatePen(color, 1, wxPENSTYLE_SOLID); - mContCellBrushes[selection] = *wxTheBrushList->FindOrCreateBrush(color, wxBRUSHSTYLE_SOLID); - - mConfig.Set_ContCellBrushAndPen(static_cast(selection), - mContCellBrushes[selection], - pen); - - // update the namebox list - CreateAndSetItemBitmap(nameBox, selection, mContCellBrushes[selection]); - Refresh(); -} - -void ContCellSetup::OnCmdSelectColors(wxCommandEvent&) -{ - int selection = nameBox->GetSelection(); - wxColourData data; - data.SetChooseFull(true); - data.SetColour(mContCellBrushes[selection].GetColour()); - wxColourDialog dialog(this, &data); - if (dialog.ShowModal() == wxID_OK) { - wxColourData retdata = dialog.GetColourData(); - wxColour c = retdata.GetColour(); - SetColor(selection, c); - } - Refresh(); -} - -void ContCellSetup::OnCmdResetColors(wxCommandEvent&) -{ - int selection = nameBox->GetSelection(); - SetColor(selection, mConfig.GetContCellDefaultColors()[selection]); - mConfig.Clear_ContCellConfigColor(static_cast(selection)); - Refresh(); -} - -void ContCellSetup::OnCmdChooseNewColor(wxCommandEvent&) -{ - Refresh(); -} - -//////////////// - -BEGIN_EVENT_TABLE(CalChartPreferences, wxDialog) -EVT_BUTTON(wxID_RESET, CalChartPreferences::OnCmdResetAll) -END_EVENT_TABLE() - -IMPLEMENT_CLASS(CalChartPreferences, wxDialog) - -CalChartPreferences::CalChartPreferences(wxWindow* parent, wxWindowID id, const wxString& caption, const wxPoint& pos, const wxSize& size, long style) - : wxDialog(parent, id, caption, pos, size, style) - , mConfig(CalChartConfiguration::GetGlobalConfig()) -{ - auto topsizer = new wxBoxSizer(wxVERTICAL); - SetSizer(topsizer); - - mNotebook = new wxNotebook(this, wxID_ANY); - topsizer->Add(mNotebook, sBasicSizerFlags); - - mNotebook->AddPage(new GeneralSetup(mConfig, mNotebook, wxID_ANY), wxT("General")); - mNotebook->AddPage(new ContCellSetup(mConfig, mNotebook, wxID_ANY), wxT("Continuity")); - mNotebook->AddPage(new DrawingSetup(mConfig, mNotebook, wxID_ANY), wxT("Drawing")); - mNotebook->AddPage(new PSPrintingSetUp(mConfig, mNotebook, wxID_ANY), wxT("PS Printing")); - mNotebook->AddPage(new ShowModeSetup(mConfig, mNotebook, wxID_ANY), wxT("Show Mode Setup")); - - // the buttons on the bottom - wxBoxSizer* okCancelBox = new wxBoxSizer(wxHORIZONTAL); - topsizer->Add(okCancelBox, sBasicSizerFlags); - - okCancelBox->Add(new wxButton(this, wxID_APPLY), sBasicSizerFlags); - okCancelBox->Add(new wxButton(this, wxID_RESET, wxT("&Reset All")), sBasicSizerFlags); - okCancelBox->Add(new wxButton(this, wxID_OK), sBasicSizerFlags); - okCancelBox->Add(new wxButton(this, wxID_CANCEL), sBasicSizerFlags); - - // This fits the dalog to the minimum size dictated by the sizers - GetSizer()->Fit(this); - // This ensures that the dialog cannot be smaller than the minimum size - GetSizer()->SetSizeHints(this); - Center(); -} - -bool CalChartPreferences::TransferDataToWindow() { return true; } - -bool CalChartPreferences::TransferDataFromWindow() -{ - // transfer everything to the config... - size_t pages = mNotebook->GetPageCount(); - for (size_t i = 0; i < pages; ++i) { - PreferencePage* page = static_cast(mNotebook->GetPage(i)); - page->TransferDataFromWindow(); - } - CalChartConfiguration::AssignConfig(mConfig); - return true; -} - -void CalChartPreferences::OnCmdResetAll(wxCommandEvent&) -{ - // transfer everything to the config... - size_t pages = mNotebook->GetPageCount(); - for (size_t i = 0; i < pages; ++i) { - PreferencePage* page = static_cast(mNotebook->GetPage(i)); - page->ClearValuesToDefault(); - } - CalChartConfiguration::AssignConfig(mConfig); -} diff --git a/src/confgr.cpp b/src/confgr.cpp index 2dff28bc..6578f277 100644 --- a/src/confgr.cpp +++ b/src/confgr.cpp @@ -449,6 +449,10 @@ IMPLEMENT_CONFIGURATION_FUNCTIONS(AnimationFrameOmniAnimation, bool, false); IMPLEMENT_CONFIGURATION_FUNCTIONS(AnimationFrameSplitScreen, bool, true); IMPLEMENT_CONFIGURATION_FUNCTIONS(AnimationFrameSplitVertical, bool, false); +IMPLEMENT_CONFIGURATION_FUNCTIONS(UseSprites, bool, false); +IMPLEMENT_CONFIGURATION_FUNCTIONS(SpriteBitmapScale, double, 0.5); +IMPLEMENT_CONFIGURATION_FUNCTIONS(SpriteBitmapOffsetY, double, 0.5); + IMPLEMENT_CONFIGURATION_FUNCTIONS(ScrollDirectionNatural, bool, true); IMPLEMENT_CONFIGURATION_FUNCTIONS(CommandUndoSetSheet, bool, false); diff --git a/src/confgr.h b/src/confgr.h index fda97474..eaccd38f 100644 --- a/src/confgr.h +++ b/src/confgr.h @@ -203,6 +203,10 @@ private: \ DECLARE_CONFIGURATION_FUNCTIONS(AnimationFrameSplitScreen, bool); DECLARE_CONFIGURATION_FUNCTIONS(AnimationFrameSplitVertical, bool); + DECLARE_CONFIGURATION_FUNCTIONS(UseSprites, bool); + DECLARE_CONFIGURATION_FUNCTIONS(SpriteBitmapScale, double); + DECLARE_CONFIGURATION_FUNCTIONS(SpriteBitmapOffsetY, double); + DECLARE_CONFIGURATION_FUNCTIONS(ScrollDirectionNatural, bool); DECLARE_CONFIGURATION_FUNCTIONS(CommandUndoSetSheet, bool); diff --git a/src/core/animate.cpp b/src/core/animate.cpp index 0e6e27e3..d44e9a2d 100644 --- a/src/core/animate.cpp +++ b/src/core/animate.cpp @@ -359,10 +359,31 @@ bool Animation::CurrentBeatHasCollision() const Animation::animate_info_t Animation::GetAnimateInfo(int which) const { - return Animation::animate_info_t( + return { + which, mCollisions.count({ which, mCurrentSheetNumber, mCurrentBeatNumber }) ? mCollisions.find({ which, mCurrentSheetNumber, mCurrentBeatNumber })->second : Coord::COLLISION_NONE, GetCommand(mCurrentSheetNumber, which).Direction(), - GetCommand(mCurrentSheetNumber, which).RealDirection(), mPoints.at(which)); + GetCommand(mCurrentSheetNumber, which).RealDirection(), mPoints.at(which)}; +} + +std::vector Animation::GetAllAnimateInfo() const +{ + auto points = std::vector(mPoints.size()); + std::iota(points.begin(), points.end(), 0); + auto animates = std::vector(); + std::transform(points.begin(), points.end(), std::back_inserter(animates), [this](auto which) -> Animation::animate_info_t { + return { + which, + mCollisions.count({ which, mCurrentSheetNumber, mCurrentBeatNumber }) ? mCollisions.find({ which, mCurrentSheetNumber, mCurrentBeatNumber })->second : Coord::COLLISION_NONE, + GetCommand(mCurrentSheetNumber, which).Direction(), + GetCommand(mCurrentSheetNumber, which).RealDirection(), mPoints.at(which) + }; + }); + std::sort(animates.begin(), animates.end(), [](auto& a, auto& b) { + return a.mPosition < b.mPosition; + }); + return animates; + } int Animation::GetNumberSheets() const { return static_cast(mSheets.size()); } diff --git a/src/core/animate.h b/src/core/animate.h index 7cd3101f..80c49cbf 100644 --- a/src/core/animate.h +++ b/src/core/animate.h @@ -120,20 +120,16 @@ class Animation { // For drawing: struct animate_info_t { + int index; int mCollision; AnimateDir mDirection; float mRealDirection; Coord mPosition; - animate_info_t(int col, AnimateDir dir, float rdir, Coord pos) - : mCollision(col) - , mDirection(dir) - , mRealDirection(rdir) - , mPosition(pos) - { - } }; animate_info_t GetAnimateInfo(int which) const; + std::vector GetAllAnimateInfo() const; + int GetNumberSheets() const; auto GetCurrentSheet() const { return mCurrentSheetNumber; } auto GetNumberBeats() const { return mSheets.at(mCurrentSheetNumber).GetNumBeats(); } diff --git a/src/core/math_utils.cpp b/src/core/math_utils.cpp index 4a66769b..2210796e 100644 --- a/src/core/math_utils.cpp +++ b/src/core/math_utils.cpp @@ -28,17 +28,6 @@ #include #include -float BoundDirection(float f) -{ - while (f >= 360.0) - f -= 360.0; - while (f < 0.0) - f += 360.0; - return f; -} - -float NormalizeAngle(float ang) { return BoundDirection(ang); } - float BoundDirectionSigned(float f) { while (f >= 180.0) diff --git a/src/core/math_utils.h b/src/core/math_utils.h index f8ed0059..053dfd8f 100644 --- a/src/core/math_utils.h +++ b/src/core/math_utils.h @@ -46,8 +46,19 @@ T Deg2Rad(const T& a) { return a * M_PI / 180.0; } #define SQRT2 1.4142136 -float BoundDirection(float f); -float NormalizeAngle(float ang); +template +T BoundDirection(T f) +{ + while (f >= 360.0) + f -= 360.0; + while (f < 0.0) + f += 360.0; + return f; +} + +template +T NormalizeAngle(T ang) { return BoundDirection(ang); } + float BoundDirectionSigned(float f); diff --git a/src/mode_dialog.cpp b/src/mode_dialog.cpp index 771b6a89..02cf3852 100644 --- a/src/mode_dialog.cpp +++ b/src/mode_dialog.cpp @@ -1,5 +1,5 @@ /* - * cc_preferences_ui.cpp + * mode_dialog.cpp * Dialox box for preferences */ @@ -27,8 +27,6 @@ #include "modes.h" // convience sizers to change the view behavior in all at once. -static auto sBasicSizerFlags = wxSizerFlags().Border(wxALL, 2).Center().Proportion(0); -static auto sLeftBasicSizerFlags = wxSizerFlags().Border(wxALL, 2).Left().Proportion(0); static auto sRightBasicSizerFlags = wxSizerFlags().Border(wxALL, 2).Right().Proportion(0); static auto sExpandSizerFlags = wxSizerFlags().Border(wxALL, 2).Center().Proportion(0); @@ -40,13 +38,13 @@ void AddTextboxWithCaptionAndAction(wxWindow* parent, wxBoxSizer* verticalsizer, wxBoxSizer* textsizer = new wxBoxSizer(wxVERTICAL); textsizer->Add(new wxStaticText(parent, wxID_STATIC, caption, wxDefaultPosition, wxDefaultSize, 0), - sLeftBasicSizerFlags); + LeftBasicSizerFlags()); auto textCtrl = new wxTextCtrl(parent, id, wxEmptyString, wxDefaultPosition, wxDefaultSize, style); textCtrl->Bind((style & wxTE_PROCESS_ENTER) ? wxEVT_TEXT_ENTER : wxEVT_TEXT, f); - textsizer->Add(textCtrl, sBasicSizerFlags); - verticalsizer->Add(textsizer, sBasicSizerFlags); + textsizer->Add(textCtrl, BasicSizerFlags()); + verticalsizer->Add(textsizer, BasicSizerFlags()); } //////// Show Mode setup //////// @@ -135,10 +133,10 @@ void ShowModeDialogSetup::CreateControls() wxChoice* modes = new wxChoice(this, MODE_CHOICE, wxDefaultPosition, wxDefaultSize, choices.size(), choices.data()); modes->SetSelection(0); - topsizer->Add(modes, sLeftBasicSizerFlags); + topsizer->Add(modes, LeftBasicSizerFlags()); wxBoxSizer* sizer1 = new wxBoxSizer(wxHORIZONTAL); - topsizer->Add(sizer1, sLeftBasicSizerFlags); + topsizer->Add(sizer1, LeftBasicSizerFlags()); auto refresh_action = [this](wxCommandEvent&) { this->TransferDataFromWindow(); @@ -151,7 +149,7 @@ void ShowModeDialogSetup::CreateControls() refresh_action, wxTE_PROCESS_ENTER); sizer1 = new wxBoxSizer(wxHORIZONTAL); - topsizer->Add(sizer1, sLeftBasicSizerFlags); + topsizer->Add(sizer1, LeftBasicSizerFlags()); AddTextboxWithCaptionAndAction(this, sizer1, BORDER_LEFT, wxT("Left Border"), refresh_action, wxTE_PROCESS_ENTER); AddTextboxWithCaptionAndAction(this, sizer1, BORDER_TOP, wxT("Top Border"), @@ -164,7 +162,7 @@ void ShowModeDialogSetup::CreateControls() wxTE_PROCESS_ENTER); sizer1 = new wxBoxSizer(wxHORIZONTAL); - topsizer->Add(sizer1, sLeftBasicSizerFlags); + topsizer->Add(sizer1, LeftBasicSizerFlags()); AddTextboxWithCaptionAndAction(this, sizer1, OFFSET_X, wxT("Offset X"), refresh_action, wxTE_PROCESS_ENTER); AddTextboxWithCaptionAndAction(this, sizer1, OFFSET_Y, wxT("Offset Y"), @@ -175,9 +173,9 @@ void ShowModeDialogSetup::CreateControls() refresh_action, wxTE_PROCESS_ENTER); sizer1 = new wxBoxSizer(wxHORIZONTAL); - topsizer->Add(sizer1, sLeftBasicSizerFlags); + topsizer->Add(sizer1, LeftBasicSizerFlags()); wxBoxSizer* textsizer = new wxBoxSizer(wxHORIZONTAL); - sizer1->Add(textsizer, sBasicSizerFlags); + sizer1->Add(textsizer, BasicSizerFlags()); textsizer->Add(new wxStaticText(this, wxID_STATIC, wxT("Adjust yardline marker"), wxDefaultPosition, wxDefaultSize, 0), @@ -189,10 +187,10 @@ void ShowModeDialogSetup::CreateControls() auto show_line_value = new wxTextCtrl(this, SHOW_LINE_VALUE, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxTE_PROCESS_ENTER); show_line_value->Bind(wxEVT_TEXT_ENTER, refresh_action); - textsizer->Add(show_line_value, sBasicSizerFlags); + textsizer->Add(show_line_value, BasicSizerFlags()); textsizer = new wxBoxSizer(wxHORIZONTAL); - sizer1->Add(textsizer, sBasicSizerFlags); + sizer1->Add(textsizer, BasicSizerFlags()); textsizer->Add(new wxStaticText(this, wxID_STATIC, wxT("Zoom"), wxDefaultPosition, wxDefaultSize, 0), 0, wxALIGN_LEFT | wxALL, 5); @@ -211,7 +209,7 @@ void ShowModeDialogSetup::CreateControls() }); // set the text to the default zoom level - textsizer->Add(zoomBox, sLeftBasicSizerFlags); + textsizer->Add(zoomBox, LeftBasicSizerFlags()); auto modeSetupCanvas = new ShowModeSetupCanvas(mConfig, this, CANVAS); modeSetupCanvas->SetScrollRate(1, 1); @@ -308,14 +306,14 @@ ModeSetupDialog::ModeSetupDialog(CalChart::ShowMode const& current_mode, wxWindo m_setup = new ShowModeDialogSetup(current_mode, this, wxID_ANY); - topsizer->Add(m_setup, sBasicSizerFlags); + topsizer->Add(m_setup, BasicSizerFlags()); // the buttons on the bottom wxBoxSizer* okCancelBox = new wxBoxSizer(wxHORIZONTAL); - topsizer->Add(okCancelBox, sBasicSizerFlags); + topsizer->Add(okCancelBox, BasicSizerFlags()); - okCancelBox->Add(new wxButton(this, wxID_CANCEL), sBasicSizerFlags); - okCancelBox->Add(new wxButton(this, wxID_OK), sBasicSizerFlags); + okCancelBox->Add(new wxButton(this, wxID_CANCEL), BasicSizerFlags()); + okCancelBox->Add(new wxButton(this, wxID_OK), BasicSizerFlags()); // This fits the dalog to the minimum size dictated by the sizers GetSizer()->Fit(this); diff --git a/src/mode_dialog_canvas.cpp b/src/mode_dialog_canvas.cpp index 601c902f..24e97d04 100644 --- a/src/mode_dialog_canvas.cpp +++ b/src/mode_dialog_canvas.cpp @@ -1,5 +1,5 @@ /* - * cc_preferences_ui.cpp + * mode_dialog_canvas.cpp * Dialox box for preferences */