From 793f8a837019535f84b0df653c567bd3d5949a1d Mon Sep 17 00:00:00 2001 From: Tristan Krause Date: Thu, 4 Apr 2019 13:19:11 +0200 Subject: [PATCH] basic ui --- driver/Makefile | 13 +-- driver/cli | Bin 63216 -> 73640 bytes driver/cli.cpp | 172 ++++++++++++++++++---------------------- driver/main | Bin 61936 -> 0 bytes driver/ui/view.cpp | 58 ++++++++++++++ driver/ui/view.h | 42 ++++++++++ driver/ui/view_info.cpp | 33 ++++++++ driver/ui/view_info.h | 18 +++++ driver/ui/view_main.cpp | 62 +++++++++++++++ driver/ui/view_main.h | 24 ++++++ 10 files changed, 320 insertions(+), 102 deletions(-) delete mode 100755 driver/main create mode 100644 driver/ui/view.cpp create mode 100644 driver/ui/view.h create mode 100644 driver/ui/view_info.cpp create mode 100644 driver/ui/view_info.h create mode 100644 driver/ui/view_main.cpp create mode 100644 driver/ui/view_main.h diff --git a/driver/Makefile b/driver/Makefile index 6978a7d..df21db9 100644 --- a/driver/Makefile +++ b/driver/Makefile @@ -13,17 +13,18 @@ OUT_CLI = cli OBJ_CLI = cli.o CFLAGS = -std=c++14 -O3 -Wall -Wextra LDFLAGS = -lcurses -OBJECTS = drv/usart.o drv/b15f.o drv/plottyfile.o drv/dot.o +OBJECTS_DRV = drv/usart.o drv/b15f.o drv/plottyfile.o drv/dot.o +OBJECTS_UI = ui/view.o ui/view_main.o ui/view_info.o COMPILE = $(COMPILER_PATH) $(CFLAGS) -main: $(OBJECTS) $(OBJ_MAIN) +main: $(OBJECTS_DRV) $(OBJ_MAIN) @echo "Linking..." - $(COMPILE) $(OBJ_MAIN) $(OBJECTS) -o $(OUT_MAIN) $(LDFLAGS) + $(COMPILE) $(OBJ_MAIN) $(OBJECTS_DRV) -o $(OUT_MAIN) $(LDFLAGS) -cli: $(OBJECTS) $(OBJ_CLI) +cli: $(OBJECTS_DRV) $(OBJECTS_UI) $(OBJ_CLI) @echo "Linking..." - $(COMPILE) $(OBJ_CLI) $(OBJECTS) -o $(OUT_CLI) $(LDFLAGS) + $(COMPILE) $(OBJ_CLI) $(OBJECTS_DRV) $(OBJECTS_UI) -o $(OUT_CLI) $(LDFLAGS) help: @echo "This Makefile has the following rules:" @@ -33,7 +34,7 @@ help: clean: @echo "Cleaning..." - rm -f $(OBJECTS) $(OUTPUT) + rm -f $(OBJECTS_DRV) $(OBJECTS_UI) $(OUT_CLI) $(OUT_MAIN) .cpp.o: $(COMPILE) -c $< -o $@ diff --git a/driver/cli b/driver/cli index 664d5db24b1b438b3f9be30a957e8c2bfde3183b..86ca5506fe779c5d41237d26f295182ea04840a7 100755 GIT binary patch literal 73640 zcmcG13w#vS_5b7rQ6Li)G`?3|YodS&5KYABF4@4WY%nDOqJl|CHY5^~nCwD)pur@{ zcG;F%TG3jiR;{nL)cQlDis6-@RvYj|1tlu#tP2tmA->rE_j_k%Gg-2&{eAww^+WEQ zbI(2Z+;h)8_uR*fcNVy&#>d4;#xFs-N+MJ~NyFIm4E3}D8k>|OogmqybER{nVaQL! zKZ7nh?bnMLX)ooSMuH&pV_1`TVZl4KDGmZPl8y99{T zA|8x%88L3h3rzl4`f9x++C!DF*7fUZKx?YUb=!Z+|YUf`z>C(EYadoxz z-j;DKIhT#QY|{AVhVc_byUCxl(`L*PHBoF`6(WB$VB(nn^@Q8zd(Yne*op~fe-Xc| z@Z{e-^I;?N8u8EQH&}>0uJzhc#5LpJV*FcspsHl_9S^=ZzZhCRp6}v83an^TN zjd=H=vl`dWba~!x>TsPoX7$K?kjDJ&fKVq7kvs3iq46|>q3Dxh@JWrq=W-azP<+mg zL7x``?-@QcpMx>vOu*n7s$O>t`hzj*Rb$YPM~4l?{{?jDQ238vUqj)&G5G%-@|=&n z=$|u&oH7Q;Q2bwuAV$k0ggMU#B`aq2FrN*%Ti(>GZ9i!f7W7vZngU<^w z>isT;z1#u`%#tVzl?37<#)gMnAqDqg}s; zfJ4oX@5iWjP7J>>4ty-pjRpJ;{tdii8p({+5K&ZkwUZ_?}Si{ifk49}NRBYKLw#AZr=rPIR;G~-Nw{e7 zlG=J{f!njF!Q1SX>KojZH4V~|3Xi9$tf5|7f}F}42~>?uwe_AQlDoc&1$2VyYDtt^ zRMEUpTGHgMZgMx*NJ}c~+!aksnmi5ehB~RuWvDl}(Z+Rb@k6Lz6VWp+!Q& zJhk=J4O+7nx^HQ$sFEt@H@PboN^Edhv)hA0RV)iyJXKzD35hS0%C4VL+>l#VSXNu# z>~8Wns|pHc7B`fj#mMkvO>FYkdukWC%iK*(4Ndu31x3>S{f=lr7HGwD4o(nAFhduBY1B8)Z(Y^I9MlHB`Yy*>@8gy`BQC zPe}2f8zzJw)P2-dbM25lIK9}DT}kz!6Ht9&*^=5ScRhNz)?;*Ku2v;FI+h+`%LR~a zf{-39U^i;QXD?~0MVF#=bx>1fOGR0ux5-_$xVFjTtpMu!s=6XrjL4afVOn2SS;65{ zc73sjQhREe8kUsRx$75rYBUoy?6cVOALP=xR@BusfG0Y(rPAF3xXqJOP(=U1?$&7S|IZ|KlK<&DxMv;Uip85lG9+L%FM3=`e`G%SDw zVuIAX&kVEI%&BV7oThNn7#UH9V-k6=MZq#>PXAwwBwgu0#+)_d7kWY9G1v$GFKTAL zRl;S$qt6tht=KcEvcc=oI_rOB1vPh}M%je4oRqQ0TI&h2iL z81BH>FiTY~EUTNK z#1FT+rOImXZfoMS14M>rdnrFO3lJFlnTqJ3$%+T8#&}k!KRp6!EOpN$!b)H_MZjvLy-H zMAWN2v9wlJl4OA+AB_W+H-ZCC8Hm&VW1IM29R6v)I6SLZ!|=Sqf`3InxdkUcvh+39 zclz*6PcYR#TpET7NXuVs|9z-GMVg`0R|t5NG*5?b z+3^=Vjgabe*mq|J=ueQ?YVvsVFAK4v9xmOZ!#9iaNz%PK?8&$nE5Uf__kj5`&d-eX zW_h-TU)g054+g$>f`(rmg||)A@N1&*jXM5`DEt~7zcvcrqvO{{;U)bXvoi{xspGdt z;VruSyQ1*QD_VPcqwtyfdRUFZ_vrY(D154pm-O|up`UV{e{wWlr%#Q-uhj8rQFx1v zPmjX4==?LI@GE)Hf?rM)zEj8BqVTOc-eSnB6_-xFUwg=m!k?z&ZBh6%9WIK(ul%jX zrzQ%&R>!wS;fsE!(XWZZuh!2`*GA)YczqPUXr;!dGYX%|jcojSqwqaCe>DofT8I0i z@Vj(adetKMC5ylCH+sFvQFx=?)F^!4ue5?`QTR2hG<I}Rw zUdiWb6TaL;Z^pO8z#IJ*&BxGFG``ftrxx`Zzs4B&-G9DmtnO}c*~mreK_6W$ne%(j{ECz@xe0%T314HvPd4EjP53+$ zzQu&U%7kw<;cX`TaueQe!ml*pri zG~pE!e!B_pG~s(p_-jn~T_*f=6Ta7kcbV|2314W!_nGiBO!$5i{#p}W(&us7e~}5F zY{LK4gikf$XPWS7CVa68Z!zIZO!#yYezpmpX~NGj;d4y*QWM^0!e3{?D<=H)CVY_z z&$|!CuhfK}XCRT5oA5W9@HHlUnF-%$!dIB^EhhYY6Ta1iuQcJ8oA6a8{7MtvZNjfM z;j2yfH75K56aEPkexV7!)`YJ&;gz=i$%;Rz@DCPA>FD&thkKN^t;t&=6yfY|AGS#0 z3%|!-`CJ>G2-h$_*c-<0!b5}^A_aQ{{5j!x!kq&Ch;RbowE}*RFhil>8UgPl%n&HJ zQoyegX6O@a74T-lG~-~SfHx3ks1qy~@Uw&&;slEX{1jn^HbI+!A0f<;CYUMU2MCWO zY!UFigc-sFQw97p!YPC$0pCSfCfs)nhzoBe%uprRE8r%=3{iqT0=|hbLz7^qfaeqD zQXsfiz}FLIh!R{Q;F*LOngmx0_!`0tNrJ5co-ssRBNc@HvDf0ml<&=n?Guf$jhHA;1>G zy#hW&n4w0nN5G#GKA&)>fIlL90pYa*evdFiir^Xn?k(;3c{S?gXIFAK$uf|ut>lc6Xuj2vbE*!m6!5ErIYkFs1-zN?G{TJn-awdBa zQ-nDM2WQb45kYBM8Y=` zmINFRxOydE@#B1<{t@myE39_Hi>o0%cZx}a^Mew|`#lUskkQ{L{=7IaPy%DfR|#ad zAy@qrnyr=(b^`s?g92T`LV>(IIBKOkiDQC4IU{MZ;I=h6_$qk&}SWR`gYu?_&!qF_VpE&xB^MnS3#wLQ6E<_$-9z1eavi>JuIJ#Q3%vB0JD@p z(k*0|+pqXO@tls3;9`OZ2}aEe_g0UW&uteyGH(lec>qRvI|&2XR|qy4$539`bSy#f z^(mXwtChGeWydj38W?{0fW~kn8OGw*nwJ5+N#0A9w!C{#0FptTk!bd-fYe1$nW~@( zT}g4Ei=#NL6zr=lV2SpSd|t2`6dEi#asj$ZoqseOhS7fa4W7G*_z(#7MPiS<4Eo`! z4OuUvN-67=teqQM@t_{)hsqHUDZcJt#r2Z3lKdddEDF;}F0VoDqzLXrY4k4*=UuQv zRUBXTl3B&bZmm-Mi5GI#QhW|;3kFQL!)gHt&CRuDx&l?!WF=5%Eef4%$bCEV<&M#a ztkk0z-jG231%yR$25e)YZ5Mjkw^#8u_ACBj;UehRVXaa8E~~9tZg5$P6n}|TVMR7k z5lSi~u_!(l{(vqWbPj7KdYMv{E4~tIx}4zx1{5`dNvfRTu;LHcd8`{4#worp6yHI_ ziC|?D2BM=sfH2`6V3XVW!*a(JP=ewg(*{i`fhqmUNI_F|CG{DrKUkIPWy*w)KX2_POYD3G$9q0v`TBnJ@$ozD;-I+Y+0d zZ?F10bcvdbPBrY$KF2=$T0N6@ojs7K_Pn1cknCaY5Y}f z@XG8y3kHw%UbO9nDei{(6_qs}>Mv92F5omFy==oD#a95@{8S*tG6!in&~SDIH6lfW zEbHC%l2q->PXi^2JFMx9W4j#ID1_K!cKPb8Y4SaH!-)folRI9- zlU-hSs(pEhHMJ1A$y2%#(_w18N?WHz0SCE#7id_YjTI^6p6R6cs1CL0HEhyY8a41< zxK_hWdJQggTpFv%WHsrc8fe}s>ha%>R{9Fcg(7mhJxS_UU(=j0D1;UTs+TC}G;62J z2e-3V0Us#XVNE-mnx#nUiyXih2WiR+we@a`6F0v^28=stWf`epwg+kXFnT3bK1u4f zr8QMoRCd|Ua?_MBs!C8Pn5B0m#!KpLn3|*HC>3&y`YC#ZIjJy*Y(A6qNGp8raA^B0 z`3|%V`a{jzVfgZ?$nt{-V^Pi+X%*v6vw03k&!|D8O6NP~cW^o23m&6UdbnT!@#GB1 z{~rqLV=ep8Z!D5BIr}Rla{Jd*RL2pI7=)>cZ^IuWI37iBD*h|2qBGP24jHOl7>1MTb@@Jb`Hs+yJ@FOo6^7>oYfJD4 z`1HtpAo!5SXXsP)7%W?7lV~NE)B!H@2e>3!gFgim&P;_J2jq4KfY94wJ^(CO%I&`a zGPndzN#KbLLaJ6;ZaS3NsvM46^u#sU17UROO=i=EI9)N>`&W(ai6NA zEK1v!R3&#Ws1k?@B((?N=lzRpiho`XeTXynea~5nACBaB8)@5O3GG$bWO^?h-MtzNPnm91OPRwKNG@nV6krBHm&-0ja02;E|BOcVV0pmW*ORp=7pZY zpWs<^_a?&4g9-np&(pJtU#3%pD^~{j*&O)UOi^byxTs@p01aF#1j68i7s9B<;H_>D z!<(*8xB=e>aE?|CA~-npLj>L0IEg56Bl?Rdn7205WFP*Oh1UNy63^s_<-_C+%YPF& zuzZK`8xCtu#PYr8!s?Y97;!jQeF#VLDNZX-^P1~VU|~X!?QX$-e4O4`Wc!Mfqj=F z1M!FdYW99|a7!O8opDhlcH{WqeCPBX;cVyh9Y$>8`vH9cCwDD$bgtst?#%c=$=IcA z>Q8`$$?Y!+RZo(f-QCbgSjp{^@9qT7C2>Vp}7q5c^{LW>{UR(m9!_JDy>__;8GF?t zSfm<)7+NvAR_qEb_++tbQ7qK0J8d@%_aB-`l|#n)vl;LKBbQqiJF)ty-(-?<|6fDuG%_{^%L42D|8-s2WCU zH6#txaE4aHM6CvgUc){V)@!&>XPOXig&I?R8Jyo1QqCDgIG2_O-#V|+*vrHwo#{=WU+DP8m7y7%J2|7C34fH_~SL?r;tG$u7 zUM2#c}R$6X++&> z1&Op~x%6gt8AfSt-_=pnzCjx)R;7 zia3w$M@3G*)_!bc4{HA-aPM0CS8GH0JJuA)c3_7~x7HJ&GpO!-6h+3wb_+803VTtH zv3s>~mrwPhvJm82IWULKD%QG@)_QfdPb>iON3{xZ*>6@#SP2Ubz zGG4XkzP&iz?!QVb=f6;&LV?^}zRljP)V!}}(4;11?F^~aCVf!80$-OlpNGxz*id#JEK&ZApzkamV~726-{A}Oub)y-yKkF! zGbMHS)Ip+Z^RIteBBGLk{*%{D8@a^<`<4vOw=G{XD4*?PZPwV)B>QIjrZ(9Sn4pWm_qkNdX+> znJ;GosrG*Y)nc#0g3&703}Sr)8(KP&k*iqgTQEyVY6|UNtT#8#Z)&Klao3L*6pR=i z!5*?Jun_*JglpqQu2nhhTUa2IWI0@*A~0NY2iFW9AhF28sv$uMCNhbFdI7u{J7x#N0(#A?=XcZ>FpmfIuq9U14oS zQ9LJi*-}MDi{is>fGrtlNio8`JC$7QzhMsp?Sr7Hs8n}(VRg;NY{N6wl`IgL1*WUC zXH%`uupBBAG^My)Ey{HRs1>&Lk@p_vXc9%-2OgjoVl>66;`eIbE25s zzLXVUL(YF2db${0)(knOr^)S&qULt3X5WiivF>(J49ui1lxy3D8eh~%au1?gUfM^4 zq6*u((NkQ0KBc3IoNZk|9hKX&uyLmT3h3ZP+(N^O*{90w$znUrShF9dZeUL7SbHW1 z_hWrbi^eX~ZOK_X)!Cmhw*;^c?ei6kVPqVu{T9!ImqzBa(g&pSkabTma{3sm$N^Y=W`?6iA zD>z%UXK&xI}J(IFew zf%3X7lO5L4@`~LcP~SnDjY-MykOPy_$?${K_S|>uzPIGNp9Vd=A&2Vc8_&c2!Z^$k^->5!ZuBec*|OoZP+z zW4QIU9C&ShuS?$8jL7Stx_U1QbgPyRv5k(A;IXC+_}q?FpoB8hO}-W_HTH9Wkj`kgNwrz`3S7G-)Ym0q( zLD;vet?!pdw#3N=yX1AdcYGIt9ngK}j(*?fwnM*s0@<7Y7vPq*uS8k0@@?7i9qVc5 z%&{ZX_LWkY`-$9f6UPX&5HBQ()c$`VO{|vqXC;faar0qn+qYGB4DT)wZWIfu%QlAD zdl2wEYz?i4lBM8v7#aHh&Zho&v;t<@@d%K?iD-<7gEk)1ONFrAk<}Uei6~;D4^D7_ zUm)-NWiTS%vrt#}LIeJ!lYqdKav~GWaN;9|^E1%Va6EH_(FF4LwOS;#?0wB}KKnq_ zu~`hyy=tl8hgopU9azMh!&SL`g+?Pn*5I80^mZ^LwM5EIjVk8}AYUufiWaIuBtDLCn&_w2+pSYD99IlOpTMCjS)H0+n-K5Y z)b^#YUDUu~@P7pQHtqQ4$R>=62^ivQSP`6l6PPLi8IIBt)*?B#>?wYBW2O@)3j`QluY|_$K_yvs7Wli z?Ol%HqgoN%syCqD9e1oaoNGbkw)pgAs=IGxH5W0+PqCT2FVo>e;T^lBmy)C)J z3P#7r+XMcGCZk)+R1E0g>-YmB*485mPOBP(im=D$e9_Pn2LLuep=m=8kfEVfeI24f z6A0Ypb`jPEviD9EZEwCEZRgTk4MJ=vV?GdAEnEWKK|}A7%CtD&N+M&=p&b73De0v?Rf(lY#%QiA^54hjQ(SurF?g3|Q z-hNl@eOHsZ29jaCjaFXNQj^PHfS*FIGepWjE`UNL?juy4jzCOMSQTAD-Vl$3c7+F7|6>-GK`h{~0~Az=31m-UCAhW%u{MlkN35s4`;)SSoMSF#5TonPcsjUazn?pRSOlugf+?4SfjqvFs!NFVz)WmReJi&=ieUii@J@<$ z9{|x0kXX$TMcK3)2MTgKtKZWhTEr49bi9a{{By0?0~brWQKEzZg+R6TfB{^&bF zqs_2y13<(u4CP*e5au3#hzjv%FKB@Z1EZGZiypW8R8x=t7QJQa@y9`<_xOhxH+qks zDmqtRIB^jr7Ei6TXRcNTPURK})Ra;>R zQn06K$tKLoN9U4Cy@6;9{gM*sWfA73vLJ1vyl!c5B_A9 zlRn}d1)jtA38Us>r|)|N%_>^hjx}dT5k|br7br#I`H7s-QH}>WBhV<4S*>!$yp?i> zdySm2Xsw*#?UXZ?_L!8{kq$blZ|XTpAdm_`Y3uFl?%}0N1J^CW_ORXPvdzOdZQ?1ZFVeFhbeQ&|Ez7`|ssCvT=a#wu8tRpy4rN6mf zbXhU%?v#Q3HP3j(H$vN4n~pg|fvHW$zsQD~w#kOg3~?RHhU+cdXE`Z9HMDb3{|ftl z2|iepGz{&;XjXi)(l+qUS+~uy#NAYd9p!3Y5pO6Z9ft1ZlWgdEj`CTkpa46-++H5@ z3XU0teSzU7jC1s2H6}uFE~D=0p;0Ey0s^Enm<*0>JWV35$GMUOnscRZ0{Cz zw=klE>c?*owO926Ht)xk%o0{2+z?IG_p!;HXy#dp9WKK@H2XPKm{dd3Lr@0~^iB4& z`yYet@l3Q;*yDixJb`_#sOFwvGq~@E- zU#^#LIKI4)_p`m4ygb-ePt=HS2--odwWnLp7w+eC_O=gE%XyLfKkE6|Ws=lajr=&~ zo7>l_lX0!4{sCn2^P+jGE?y5*D>S4xkN)3W-lmu5(YjhWQ2q(M{L24OUee2tWcdqF z9?hVN)zkQl4rH_D1;0@tw=q7rzwLX46FV;9oG>7b;=<8QssqO#t>89jh~a(>ms~hd zbXXG|{zt_LhXaRi%RxCkka&W_|BQYLf^bH?=>v@ZQOIIX2Veq5uP?*1170K%8JLs% z)J7oe*kmK&a}XKNLVp~8cs@-0gLtkk=)g{TJc3y+<zfVc1vnJ07 zc;?5?2#md=Fz#6B60wfL$@-Ff`tse|sh4iG@>NC-+v0I1gB{T?tNkcE{zSY4p@PQd!lQ>qU}1xymAX_-WyI#0tam3N?99-42vtZz8@J zWKK9bSq49c&pyoKdh~^XEuW7SEJ_t$k8<=wJi$ybPuA{KxnRtAN2xu+eOYe6CWlUm z#0%<(sP;}L%=jY8gX2CSCaf*$Zy}^a|`eHw8E5GMt)U!l^M?O%yHah;BL(&?!X8;$v+jVL6H zVLZ$SVtDW8$g7|^;PjJ{MnZ1Ir+PiuEo9pa>)V21b<;%num-dOC24F{QFtlNWRKy% z@osb~Ex(@T3Hy`ONo;T+`#Z#<7vBnpA3MNqf@YkFx@z8!HvT| zU|WpidN6~YsC_{mCr0!6sC;wBF6)t0gf zYpRrMIKe)fvX>aMC=KPqZ?Ol zpDR!q=SiaDEO+LZ_IT2s0K}V{J&^366?#Fr`K3wsaCM%OmQ|0zgAPTQ| z-l*_h315QCU&YG{gfBenaViiEHsTX)wz>z%ukS^-Bezf!K!mKrO}W6}%ZEN9?cR zw3BMutH#kIf((+P1zexuF#c2e{RLZ@qqQw~?qGk-`|l%x3iZGY*}i0TIVNl}Tmy?# zN1&a;f9}4m3^Vx0<#%)btWmd;XGrD*g}K-V$-y=4>W;M@&qV${n==vc0uDa zwT$Bj3+5uHxGhn_t{S+Yaezv}EDt0vXt-dGTt|x4iVK@$QH#kyQtDicA#H1sn~dU( znF3rt;Y%#ZO5DHnJ1hIiS1i5fTGO$J#G>1C8;r(V&Hlyq+N@+uyr@xMv1onF+Yo;d zjU9Avx8YVkqZ`tN6j(8d6*z*3ZguZw==oofj6Gg)9+|b1?uN0~4{$cz z?PK4UbL?AAr!uj7ZZpl9?V7Xa(I8*AfPX}jbT86HAX#+_=SSOo;Zl$1mRZG9E*4Y_ z5&i`u5{9~0yR)OcR?}rmyNLZ`q1fdlt`YCkEX3lCW?HUosbFL8e04a)51py)Pos#U zA5864uJT-73DEmCklHE6UiBRV*$E`0YEo`8kWVW(j!ly}w^HCCLqhE0BF760Y|P{g3L} zfV2LHD!{oO54kc$-5WjDd~nGGwfZ!|2I^$u%d9h^lhMrkg;wbYsB{DFZKCaB=4}BQ zW~oXjVt?6#+@&u z_i4M6c9dU%M|&$=aYqvvJ92vEj#@mRf|*(cx3PlDP=Twm_kOYXEv(%ahxINPIX8Vj z4s{gN?&FHrkXqd-{FgQ)aZ-82LzNl$<2Q|$Jfv0MoqXZ)A zevE_`RuRZlsBr7EGAV-2EP_HvcY#esQ}C4yPGwG>dvK`!x3x?*Wbe_^Z$1v>PM9jM($`1 z!`H2dtS{_{x9o_wXm`XK=*CzPwRTm;x zeTRUUqy!1>Eq*4q--e!3=ORbMZt4_>s8yV-Ra~1Msd$)H@h@m07&Usuy->J1f-TcV z&L&;>65U&zIwcNI7VPhma#P!G<~R@zIntE{ci1YX*2sKKm0eErmU*u&Kp4qekm zCSl!B1S>?d8xTf)*FCM~hACOu*k?%WDi~%#ZaLQ)UDFyQbr1Xitrel-ZKY1UKP*lX z??$~;O+6%}wGOQ3L>%EidmBPE#_7;jiUY|04V>T zq1*x4wQ(PH-WW)_|EDp|7h5%!Hw6C(HUsB{wXx`nGgsNnzedEc*S;#klPdER$~75axd?|Ttl%z5g3^m;3)$YQVR72FQ06@LTf5xjf%zUKlx&YP@o$p?2l7M|9kCXjLN``%BT{NW%wiEVquWO@iu{c&yARwxdiFB37t`pbtG5|1pQv2?`Uu#aAJFS zEs(;DLieiQu?kdm%HNoI#FN2=%H2S!_I1b!rHw&k52-M%?!W9QRu1l_V`TCU|{fhjTO=1M`z1qm=%;5Ox-uAsVI@OOT zGEGp7OV7!6_%FL}I5zrmB!J!bX^D6_9v{5@Dg_0CcZ5`%;B?tiwn6^k5%L87{|uHl-xI6f%0LVDkU%->~Qz# z)kt$LR(5<2$#*E25XA3J<-Avwz{r`dfJ4EnfFDNc`2`GVpc>R7DnT8t+)dv1u@aw| zP#CZ}wAcLKd)8!_Zn%g=d>0yrX%Qn7`hAI^ckpAFfYvYTbsb+U>}IQGE@Jh{c(8Ec zfnmXQc)*e}coC#!d!23l!|;L%pce$Q>vTM(BH-g9_ zF}<90-ex6`I1^T9A8D$G$2ksv9P6R&IZzSo&Q80V3cKrq-Dx&ahb5Bu#>BR@=(@O1 zT)qpm_r4a=CI&P*Fi17C;Ceu>FJc!8{mI{vfwwF0PLSNb4bKYg;!mdjE%bdD93$+2 zV}f>YGazw~<#-1Rg7h)nbsizwq&(`Xo@1^T=x7lAFxu z$AIgi;QA=I(F`kX-7Uds5JrFBM_Ja*1z&IyP-6Tp>t0XTIsoq?JbD1;OdCubfU&18 z1rPs8EAO8+SRZ&_vc_D${QR^*@&g_uKj1;~10E#5e(=NLI4JrNcgzrF_=dau)h&wu zp;kxJ@$BV#!|wF^W!&2S zl)Z9+7?0v+3ObH2+wt-{XCfa|p)lyfE5@P6jCl_8@cp6pFdsc~8s?)hpiynm;g4z0 z0U&yej2KK*ao6VLW|L8GogqkdF-c4_VD{l9F_-(W05x99YK z-<}D$Jg+|X6x!1R!XMS1eyu(H9|sH?LjOPQ?PD=YhO##&WQ~lU1pG144 zAKM;!DA=3j|FS)&#B9$kkoDiR=U%*kq9(CDnP@oU4IE#6j()--vmP&y9+2|yJyMet z`kQwA{6Bw$4g%SKfbY|%zhYwiV{YfXhZl0DAc2qp+OjtN#XrGE-1h=%V7}-1^9CN1 zFw(|KoToxxD}f~~u0UR=4NR8p=S$$GxuM;f1_X`)e~)R~8PMKS7TfXMqzd30P3k>* z4)rXUbMK`|M{;l*IR|uW-Qt?VV+_EKW<5YdP62StLdUEc%JLORj}p8!E037 z5p_Qd)5(ob;|xo^2IZYt@1;Aj(6g}9a&(MBjE$I|5W@p}{hK9w)zLa;egwn*72Dla zEK&8SR-z_S&qt7oJZ_4V=+QBC5zIy%Qy;-RqhlH)mKti5ya2Z@x3~pMnQa@j;E`1`k%A1yNSP0$J6ByFFX+NqlkwM<^UgQY5(I` zc&2LcE5DnxSDpO_+Wua31`J2Z!`&b04(uc0tzVo0B)f7CcorM$e~u6ZM=tWZt$5^l z&Gmo+lR8j_lGsl;3?&~{69vbE>RF`S*hl7HKEg^4s;3K-xIOlPjv6*V^%_xa+wcXf z1KxXSGis0+nn)+B2qe95m4#miOuG4Mi*ACN?vsLJF$(R_*-cAI?Xo_A!x-aKz$fSNpGZ$oJiHB ztQv|-1v6>{B&tKmJsWZ-{p(7LHd@i5(WxOU#>JN6X7(jYy$4F5LOaBL8qI%kI}ewo zaG3Eb{LYWWdL;lPuf8CHr)I({J$tY=JtH{e)eO~8RZI~Sm-G{QKu4Q z3q3pF`#C?geuJ;(Twd*)6Tkf0#3k`x4O(PftJTsvP)i{d@ImW2tUuxhtzXvhgD{a#((!v&rL)&rW%H zD+WE6>+zTiUb!Sc86SGeb3s-Np0lfv0?u|It(Mb6hvbX5ACj;8C!RmVza71(K=ysdcVwHWnj+I(d(cI@~W*HMjF!77&&TR`%AkcbP~Xw{C- z)t!O~ZuaaA7p1E0!jAHml4U7baDO5)F6EAO^c8LV5);A~?33baTx0QS_Q6-s=nLnd zl4^O@d;CNfrT_Afytxk>73p1Q#@0jfTp~AB%d@uxCtzH%pI9E4gZof^%xPNrAj|iH z6h$^~Liv)-0Nz4*sAKlq!7fb6nmPXDVMrLrz6-&OZjM_YqRe9s*eo>1Q?Eb*b3BGt zsrOSunzhuk9IWM37`EnD?6cv*9tOF%qM`&E(h-n|SH1MRZ#ctB!-uTqM6dEm3H?tuxM-KN8?D@szBNf|!PH+oHAQdP*M1ehots zZNc`C+W$Mzmh-f>T$4+8^qD#VZNW_tm%rKO@>k{*=6>oqn;$SWeTfqbSWt$0xak}E z04HktmpCtHv-v?6@imhSK)lj%5*UJg27^K%A1ZaX!z_+)3I2Z9>gS3gy{n!Hbu4RCSsifP& zBTIb!tF51Vvq|8GT$kE5HbNa3Yccq_q z%X;zEr+)b)r5DJ4J6ZysJ>KU<|7E=AWNf3febkFj*q&w)r)Ie!4?Jxv`RF|;xAS{0 zig-1O<-|u?p`hH5_k9LP{0<(vS(7gu$=dH;;300jB-3Fv8iF1wjY|1Nl7P z3&|amkssuav*tG@cqsY5R%~Z!h1Kr+^L%46VVZcfu$BI9p5_WxC_k1j-?uh zCh8~eIQ@q4z-Ug?zgkP9q5ry{Y!7%walGFATR5|^!Z!$oXeAB|ln8yueaX*BfwB`G zf~+{NpXCZ%coSA!#aX+t0bZ));@vmj4_evU^sJv{(ekjL9 zX)D+P$U6@>gUk!=p~ta*B?i6eemckRz->V>a%+rHHE8&jW_9}G^TcG@z5oLUZyCxz zACHH;1pJZP-$bQ(_w%vi6V}hqw5wM^<@`heGsT(LkDZ& zT$Q*T;s_}5{`}FdjDO(+0ZE0GuQ&oWe3lm9H`!iTi2!;93Kr%Dad%mkZ1Qiq+CEC& z02Hcx2o;A?(LUH;ocLVWAAoTNuEce=cWv^jZky$(=VPbuU7l55>-S7fE{uDlF!$@` ze=51fMc6>VEg{^w#gpTxV>y7(I^FL4Q;U=~6=#am%au!}mty}9qA5plN3|Hep-tx) zEqKKnv-c$Jk}y7})sct#F;;4f*+;)0+}3}hcRPGFm`yDe-p>y{tRQ!@_k26v1c1ql zxxttZSbt|+@HU{?zD*w`DG9|njD2lvyW*dMH^Sc%4((;Yyq}w?yF$!P_&6hng!uG! zDn8nqs^FR|tSb$BuxYrx>9FE6&rmS_CjxLeg>V(Pe<{9AE}w+MlJ?V4E&DPvV)i?N zNkSA&zT;H-#bSKquDHmy{C2Ax>5o@Er$zO}XQ6E(uE9M)8U1&Jqm<_i;?8BT7&WLr zT@8?Tn$c2@RqYGuI8za=LK{poF|N45i)n-SNe&5Iq9fnAae!&eACF%2oFS~;dxnBoVK)2*UQ0+h zf@wCNbBjsmwq;?+xbs(uf%Yyz% zxWODxo918mom0nKcuQ#945Y<&-w*imvn%5ho~0_Aen?QmzXBh)H%r!T!{6fI8DD94 z@IB|zdxXcq<%-WCrujh8tLxqMmMV9%WtzKb%cCB5v#1Pz%yceyv!H4+s2VGpDi*mt?xw+X#ct27 zI^mQGZ&g!;$32LTDPON{fYIRk+)cVzc5m~7iuwi3jo#{NcN3(GL015^#H1^(tf{MY zZ+UpArkeQ`yX&jm^;cMyG}U_CQ*QCN(=!IuHz*(f=L2NVuWP7W*lh7Mcq-~J3@jE) z!$K{suBfeZSK;}>3~7#i=8Rc0rd?qu0oN))=<&d2+5`TG7wbVVySGXa-&`$n#H4)1zcSL87=AP$|}?- zp?hlUEt-@2X&{#qOKE?)qD`R_M}7jSc9z z^bEZl&XcAzR5VqI@A8WZVFeX+)t)Ovmtsk$OIcrw|0RlLfxFsEd!?vLXt_o!(9jY? zHeGk3QTEw0EmLco7A>i0ipULGi+2(J%&K9Jqkpm;O|^^NO)Y)>d-1IL1zvZZr*;8) zY}Hut*`ae!rR{Jt{Q7uRNLGP_k&J?fwp+gV|CIb77$PT(|fh{n3=Do zeL5_Oc??t8of=+}a#*eqLsP1O9XDt&|3?iVh&wZ3@-FD@Ry=PFgu_-0maUj_Tu9$S z+M6UvhmodZ3NBfN86Ht`JJNKlz@9@|j+3f=NYBEF;^<$8!_OggARUWS5D(JB;NAY4 zaCi;*AzhF3Fw!2RiI`9m!T(Xr<|~knMl{}!bkf849tZLrNL!G4kghyhq5`W8~_-@%XRi)bJCw!eh>z%Owl+JP6ppX-EtNJ}<_!=pz+ZlpG( zlQyHhNUM;xBYhOj;?(yd5akS16J*^krp9c zg|v$KA3^^}Cw&|a{{v~_K9oNN^&_2x^wCeCf25vIQ9sgEpM}GFkXG%-=V>qwRvie3 zZ%29<=^CVoUqEk2M~}IC)Sg`MEyt|NUM;RAZ(fTGe#nP(E7D%1CEtX@sT^-e9Z2^fU4ax;iC^5UGo`qe)VMQ84o_YgH$0X2 zv+%Fwm*Maw8j1KjG(F_i=~w%p57@1gk~%dd?HYN+lH^wD>N6%^JkfeS8L+$q{~CW0 z4r6#le&}jxF8*zQ09PP&EOCwaw-vbYCR{t7dx3-c#g9B!On5 ziN8SYQ&Lh_#M@KS?oP0$SlSXDDQn^ql(-X9EWp`QQm3ROJ7DUPf`2^da8Q*!Jnnf8?QDJd3Eq6D}(M~MFi z^fO?Q3V&M*KbLrcCWp>%T7(};>--!kYvU3wN*I!(kdJ!W1-bSI;G^+OeawNL#^Nyz z_|dDw;Zu<&%BTzNx|?loOK_%?$N$fXqNVnf_&NJ5kboXpk%*qTJEjLnG&H~igiUi1VH+9yQM0GuPVoEx61uN3*8dgYKYe#t% zyKal{oH#j3w#@4XwVh*%^L;wvfmL{BUH@iG&A^zNj}ef6+?Yb$?C)LRbvt;i{?EKh zz^ghX2Lm>0ctT>y0z-Zae85iph?@jl4{&B1R{;DYif%4&+f8&(&eUH55uMPAg=~FRTwF5VlUmA1g{s7C;ZDH z1Xz&$zx6NV!^c8~xMXk{t-t1^q~(iAOPe=yKzloA8%R6g1L1SxD~u_G z`YZ?CR?r!C*A`zXdVn^0JMwlRFYh=W4F(G_M?VU>zW+eSy8Z#Wh*Ay`>J3M;R^18;v~r!@=#WA0(p!y0Jfkt`T$&&|Q8Uzxjsq6=R_j^3DZa z4eek%ta)H8pg;8SkNHZE37jddaS30?8jNfQ{_RKIE$hSKU+ZZbx0qvF>oQ zt|#O-f_J^%y8a_^Bx)=y%3~ zg|q>-oCtm|$KW?LqU&jBRKoV5bsh0#tzdK3#&GxzjKjpI2Jsx|KePYtiAyL?8d6B~ zj3jYPzXdj{w}rz^cuwrnc&><_&Uh8=hEL6pC{2{1%_gJpK9qTuWgarhV5Zh%+@eSk z=ZN^42q4OHOj$-^t!5q??AAuMt(~_F0%>OBfeRWu++2Z=uw^ zjrTT{V^gaYv9^lgsVrc-aJ__q(dGx4=Pbg%eX@R#ix3)~z$ zC$5G;6`JB;5U|`?aKAO6!L%fP#AO0k6@_yES005c1#WH>t`4|T;80tHUn_7Wz(Je{ zZWVAvQMf07b4B4^1Wt*<^#JFH!tDdj2At7;wxb`oD}gh&Z6v1LoG6?HxJgmCNx)H` z=CTTK)Te>VL>+U1O9!rpEsGl8^gK72=ODz_EVB}2w*H$ki_B#Z>#@vMlqv6tUC&Tu z`cdZl|FXZaW4766fKz}o zYz&~(i9Ze#j>)j143axx_pJCU*zP5jf`~$0bJs_p9!z)y(V+!M^;J&;5P7HB(bv-CbQ> zU0pNN(}{T544TirgVs&-m;Zd$8F|{@mM+rkwm*X3D9X4Byvw#5e$Kc?c$ve_FE1YJ zxr<^46gS)VQFq@h0RC@*KkzJkQye?SGyGD_Jv$~Q=~i5(XBAgGhnN=mFK4*gv352RcO(KzFq|PcWqGxSYOK# z(|bQ+fe5{6+AG6J?Qf7g-h*ouo^qRje?RaGkS9ZV{Q7Jejj?4E1H$|_pw^&1O|l|z%P-Q}TMCtFXKhps9I-5uqGI8<&uU#>2ndM4c+ z)_mU#op>59&$r$PsSVcQkh<)%xPq!o+ZkGh(^o>ciqoq3fIkmeH$~J-gt|U#;mZ@d z!`AMIIuN$*ilDyMJrVWsi1metx{a!aT+^xObFGV10tN!-<#B6;TFS>Y)@pT;Ij)%d zbCmkYu=SO&x-0xHllK(lz0lgA))<N! z!`3Td^<0=PqR-C?oz@BLXD#cFNujS#vL2bF_D`Z?bg%TFW_SLw#+S;}L!m{Fl&h~q zEF5nyI~~Wb(|wowE$d6=>QT#jNlOS9@0)yM=*DujzuW>1YSZ5VvRxtTi!;=o@ZF)u zPf%YivmTzIo-6xS1SkJo{#59WnQH&E_u}OD)832Y-P7+SvLh!Tu(QZkb8wT{A6YdPpCmyz#(QrB`1eS|19&*@d+ zw7LXjA2TJ+y7yp6i&$!!jis$@P)(fE;yG4%Na8Cff z^;S2X_iX3q+?btQUh9~_SKQ#f?mZjl{E|t>-e@NfX1=)+M>;H}T- zr%k>+3=sv=$qS$I;AzujN<#Mp2aM(XSDteVxArJaH$aW)AgEHf&7;%Lb{hB&KEGyv zR3Dwj=Zy^C$?yPQKb_CZ8UFVh=9d3X4pt&kp%Xo>K?!j+o#?qFN?a{S>2%klQ4N`mqWkxhC>~1*cSUqMh2dR@Vp0-(BUfDNP0tKdlDNAL?%@30 z8jJg+3}5F*8X#wldV|ju3+hcimv-W@P6VaUZWi1h_&mn^{?eeA^~}q6Klk?`hA%LD zjp3woOpZAW=QFHh*vznlVGqL*hT9nKV0b6Py$ts=JjCz?hOaT4!~&Vaa6ZF2hRqB+ z81^t6VYrRq4u*F!+{i>9m8gZ9SnOIjxgNDa0kOX8SZ7cpWz{fFED(K;iNd1&u~7& zI)=>*I~evb9AUVP;SPp(GTh5>Kf^-|Utste!%6JV%wag6VI9L}h8+xh7>+R9#&8G2 zI~kf*{pJ44$D=N0OP4G;FS=k&7hW0~j@HMjW0mJr)eq~__($UnvC5jW4ce8<|0Duy z-XI3eK@w46)$WUrsDdxPOo{z+@cC2#AL=IJBkLY7pPe2)`vUm$hyzVXSavXXaJw~vT<4ecIZ&pW-7-E_4PjE*N@LR zpjUV?$!i}PHJ{RP+M?-CDjDw^81JqBfaX&=u5m9DwS;}U(nw&O1+iP>`NRRf&-90v z8{}Dh?ePG5`XU?gAESpskc2<&mqz&3%iZ`3fu9Gw#0l{DfKF>QJ)bzhR^~I#ZyrwP zYY#Dg-y(yc_ZcYt2k>*%9M$?zRG*uFJgbdIG^jp}1&vli2B@=ur}{{oLF#h>(|0oe zi1IFGv*I6^KlGInJ>sI} z%yPh~P74`-WQjSacPS{*s~vvzSpdzsP!6)77Q>rJt02n?f;r+5B(lIh3l4I#Y)Md`%= z{*$qen}wc{`5oP-(;VRa+EpEZZ`OG9W0%Q)2J`7;d}F6UbTj_%1wU#KTurqjfd7L` zA00FFvc7yefPNAPwEiqM^qt&aXKK8`IsX>{PyKb*!Kg-8^2Ox=^p|M-3>6(Ugd(>q z0_bl8ejf95f^P)S|3vt6{aLK)70n0p-H74xDl_{c*2~mh@#`ecFa?f?Uq8k)9`=Fd zDeL%Q#_#DgjI+%D2H?qVRIWFOvl)Mfrsop}7-xEkdy1X;&j9*H1UCHYc`@*_!tYSt zbp-7+G#7d+@vjrP?8`Nu8R|%_LG0vyzmD-a#;<02dIy=>Rk6V!M4n$_`h83cOaH1aqX*Qvv*c$NWco3>`iDPpKXO9paOFD5}p#^}kXd0-pL;G5s*( zuO@oPr-JP&)I+D+H9em=z=O=^2pbX^cUhEA{2STNKbi9!4B+$I0Q_`J5LEx)?~iH@ z3z*NDz|Z1iCs+f#pFBSnfZwI@u!o*`;RnD|KdQ}!dxi@+{Y>Itx~`#j@%_r3eS)d~ z5te_H`78(CkN#5Nsoc>E3}KA>@iE4G$IFShJ_~-`uEz{#>91dF{@~+jR|HL>ei=_0 z{$f{8XZ${%-@n53q-V*AzO~sPWZ9O~cqVdy9Meac|5<$PrU3dc08jn9fb~4e^j~5= zoudXJdi68Ld;O5-1NhUk)_!uXn8|Wx#TWkP08j0$WIHDET*~x{?G@Z4ow|g6sW~S< zhSFw@H^uc$+5eSOINLGM@3#R2$r0r-yw;2+d@=+CGrQ2O^t;AvcU^0<~d{DJ8Y zUvKDT-k$;js=wUdpy#wH&0~Djqd(_qyrFUa+rZPjCijP=KE2Fml*|1fXSx9Pgvyos zD|aw{B!K@X1MoM%VVI4(338u9>U1}k+n6wz0lx5U;7PCKeyHgAzXtF>!hDWgVHk`v zpA#{0)BNsT7n}h+vXrC`2jK4w!2d|&As^O5OcOetc9M}>jvcG_GrmUS`NRRXG5r|Z z$q(?gT>06HHFM1b`($@m)!xfmIp^7DGFYu%f-g*2X z;E8_)+e6VS>NgsXxyPcKm-OSmX+98_*6hIDb;DbId=YU3gAN@ zWcBO!CxEAMA@?3MBYHA~L*ui+Y?@8~vP`X?2qx!UXKk#*p zH#q12N(hj~g~TTp@Wn31A7MLO$@m=bv@Z6p<36J4u`Z*)9TMC{oz}pvR6x#qxW5>! zt^+;wuh;*%7X;KVV@xmh_DQDi^!W3y>T>6(hKHk?wbV0&Dw1BQUQ;5y+evAz;CVpE zy7*j;H#E-w#R2$b@A2>V&H(y?lzW5WF8z27UXc5d_eQTxaRpq=A*|LKf29S zhTdJHbS6UBGIk8c{5JqkdRuWIsu80Gt#ZJVe7t({3C#!b?bU{m_86da5q_j6doI+c z3QzLubO+Oqj+*mv1JnVH=Mx8bIRM|R=P3svA1>1CsZxAK)1y8-f8ER^S2DhHr$J;G zza4mz!x+n*VSScy^ep2m7%zG?;|za3bpiOBH6Hr8!c^3K;`XYje|?_Cb?p~jW(f5=)i|6RHFB2cUnZH$>U|nNM;+#V zhZ)pq1@P35xeuE2yaDPTfhYcz9{=Hf#vfrk?KeQ_$*6xl=gl?zEB;QCDZP&g4sQY8 zufOgOz&{g!e-(JrD|x<1+WRNQ%X3AdGqdLr{TwCF--sNdjF;!y1YZw4npTpMz?0mf z7nnfc?lG`h7{6hf!-1iv%-ne%Rc;e$7*Go0Mvqk2(Cjfsn z^Y^Y7wgWGH?c{bJ(;sOz*fPHOFz`_)As;`f=}RxX8i1dD7VFhRhMV|B3xGEmH?PIO zll)sp4PNZh#f;x&8~hH=wku%1&ViovS+UC1DyX+PlJ5pj-;8c2(vNt3PD;jLOFH5^qs^NTUsNk2w z-mt1x@6j5sq}@lGG9!KIOk!2CP;cAmEnDL8c$IT|*_L#&5Ra#OQ$uzETgDdhE$Kuu zg}+2Xb>SoE0Y%i%#={NR5w(yS1bgT=?bg|YJ#hmv#4B4hNi#_5Qr+E6*+QbN8vkkp zJ7NZ8(z|R{Lk0;=We;HE%mC8j#+o(QQ*?7;#AN8h&YEwPfp*?pQU&VtP$6HyCd9F{ z!sfi0jeXes6%rY+)BV}OOkUY`ch=t6pY2NZ+ueoiP~J`rZ&B&&K&~GlW7e z6WKlJFFQ3fl-g=%2C?0)>Y?40?e5`$fvw2mIJ2o|U8LPv?qj>TZPChvomkam+sL$Z z)fzjojFHQl+LYb2e$}FtElY6C#iZMfKz9uliaNHsxjC6=x7!yjUXcLT4Xc(rdnq2@ zm?^A5jasoC^x|5rJCGE}lG*Cqa3PUyY+SmcW$}`A>+I@S4P7vbS5LbPWB+6#wz1jp zVAjSq$|>3|m~+@wv8q_De~C@lg}0 z8Ge0P47Jj+mnadc9%@=isjlArdv!A>ij6~G^BErWy0e_Ei^tJC>C$6vAu3&M+CbyI zYq-a^9kse9iII}_l=LN4XuYE^GqkfZb&MYVOX5c9ob9MbGukpe>l4sr(Yl4jZM_q{ z-d;t!N%4&Z`hT>$0i9-}=^5${cf$r#gV}t4CX*{saaYB2*eV%&94Fe2#US^Z4W+#$ zw6_$EA2s~wE&W35H*Yo>PqZ#i54ai@tBR|17e@4^i2>B!vZ{G?$uQEDAcNYlDYF&r z%;ytreW=jFd~bHMHr;fF>J_EfR3b&YWi_U|ZcKW^d2FgZn9Zbnvl9ioMy~E}uPj#S z(GssF6V%j~OK$Efq=2Y1k}eT+QJLelIeZDAkSxGz<_mr4 zJk=A^cgpU<+%#yznx=aj8)14EEpD;nF|uRr9cEMNp)B?dFOiF@iSb&rv3Yny{IO^g*v7OE<3yU;rXjYgw47J5y8 zdOMRky>u&lvDL>oLa`0`#=%6}@??!&qB)zjm;-ySJD;_C@qvi`3@J*ov}!=t_R(ZT zW3+}`2s3$jw)>Y(+Mv62a5x7)D?g}pwa2X$D5gb!q=F>j<)XEpWTeGkli89UQl-d)1zs;3UKL(O$?Je|Pss=Ngv2qHQf-bD8GKEQC1g18b z>F=TMO02}^MNsHKW+0v0Ix(i>QE&0!pzri` zj+|HD^INgl60gI#H1PVmHJf`=dR4)$VZ0i}I_6w0lI6)lZJGuI*02p&v~BLgM>Ga*%pKECKPE#V0+bwWBR|7GC-f^qDVHn4UG&Ztx(S*6GgvL2~W&N#}-^i~ufeqmR z8A9r5<4llBxf?hz@>W{a-QVgdJCB-`+DvD4^r}QY1_I|D4q!g*Sg-kdU4xrNV~Wd9 zDjUcN0~j-A7V>jBU%v8rd!0h6Tq0WcP@q+Fu`yaBgUpTCgXJ=RkjshgD0=fAN4gl- z(O!@KW)P&69!4+%n2CYzE3fvX%*Iq2+EFNAnPg&1cDi?yO&|T4=;<0&NTVTSN+*!K zW;aHsLE9W!<{N$ST04br*1VObxGjjR>7DC9yM5&niFhFR6|b}HteFMGIQy-i+a`LF zsap`@sI(KwI=gi_EVQ)J=#9}4r_sP@TWPEYis^&Badmhs9#(5d=>i7n3AK7>NTKon6dJi#DIGM(LzsbLA;u$ATFy{@ub=V zFE40TEw2A00$1eboX~hRKQSg?4v)4C6rj|OLePXwPQ=@ouxssPy<@`mx>uO*a|pKT zKwyxAWd^GbBXY}@dk4bAtYviAtRC>x-^zigV}1kqbgnn z4*=gbqiAb-Q}tjL0bEy05w9cV^o}YWIXdQ1<+j^(Fn4Z`RvTkI4I-kML+F`(4`(g( z+$AB)W3I`c4GQWNS)vsRTj z&l0!NwTw9U9j;Q@`$a$K@1)V7azq6=jzp`RKGl~^7ev!0JVsQT!Up}B(iwi(KQ^bQ zUYdKnK5M+v7+dneG0En1Fq5S`QDBK?o4Af553`imaR-E^1XA90$EGqgFS%SK_w=Kk zQ+(Qw!W2$_$aL-7T2hrtkZ#lHC?0gD3u{hM9q~#iv@D;6OkAq_-O=E9Tw93tEZzS( zwni7ydbRA8s}2CXjd-+oi1?``D=e?7Ds`0?lS$G`Dr%Fy-T-6ePm9xBe+u{81_oeiOXqLYN3UptCuwe46=|qvy=dG0eO+lgogdbI4_d25 zd-Mx%Z9v}6ErL=d(^-#pYJzn}s0B;TQh}JN)Yua1)WLf=c#GixL74~fu}7@j$umx9 z`7#P2o5DhS(co5XC3VCNrWdZ0$zfw@hDASp{;~%m&zGpAv8MVnf4T+|Zh&gwqmDZ2 zs)J+Nk*R_U66DCxwYTBORN06LIwKF>l{1@SA8$eG6BI*2U~#CB&17M1gB(BCd`JNe zPb5HlsxG2h5J{Kl@N>M%d8+M{GlJG!LZTYb{l`aFp-mn=i3w6Xm>;Q#E z2C^fbWwD6}V9nzjn>XR=dffM3g6LABL=Rw7OJj~6)7_plOLC0M7HFe$#qX**q?at@ z`u!qh=Ei=oaP&f{ox)vMDb?DmlMOnM#S^n*`B7<>ALc@hxnRD43ggt3d3NJq+kZ~1-p>im>5Vdwl721(0!Mn$<)~mX7+b=2J2BW+n-PLxvr3X zO-eWoPO>LPPM6JnJ@SL}S*ahT?3VVG_QV4VSTNJ$3hk*b9q30#!?4K6;u`=%+VZrb ze-b84J(As&p}PtWi?O$DVfh!AsYdy8c! z#u+}cN_XbSah#Zr=m`p}jPxgsS%won*wN3VRGWce(y*X;6h_;qwrd?+X>Kg*E5;$$ z?kxmYyh}xnt+$ua3u6D>;bu0<)Jsrj6X&Ko>Ihu=&Ww8a;|`2*s!L2fUD%BK7nlu$ zZ{z7HUb}AEmn)H`4h~hB;E=X66KyML7yA+v@G3ff)NdOHvihN=p#q*&>B?>inmP2i z$_)=??2*2q!f*;x%tY*tG`^$6zcval&*ym6-Q}F|ZCt)5qdTp>yDy){7nrpKwGnj( z2E8q;BgM=2>f6@KOGn?t!X91d_W4TtPsQ?E2MVb!z`~G$y>g^u3^^6Ur-w5!+|WG- z#)r>v!y(o++}GcI4nF-JqqAOoQCY>hw+@1zfrTM+1)p`MZ&kZaY+M_{9WKhiN4frj ziqQ%}#c&wgh)1wubjw=B^f-$RW%ctHu}m*No7CG4CUOSuY1~E9w`E}@$?0(QAA815 zLMF-k7s7NE4)7{%v3%KYNMMdGBGGfZ)ON`)&oOoY7r{@;mwkx@%06)*(a9^nOMs<4 z*d)K~yC(2=oKNa6bOJZwI_>Eu=f!=FsAG{Dxj?Ev{iObMjS@YcO){1IvLBK_*=J75 zm;BQHt2qB+KuWT2l0ez#j`C9;Z~hyBqbgF}D9QV80`Z!UD|!3>T3mJJmwlK778x@a zdCpWIy^r9^Uu6ho-zKRqXD`-Y@V9#M%lrQVXZJ`>1EpNS{*x!a?EfTiiV!mNw*PL< zFa0O`NC=!Ng5~_)^6&HHm;GV{K10gwNZ#_lgKH!|DPQ)TDnh*f=S(6u!5zebGr#Ol zC2)qPK+maq8u{^7lpce`^P2rp0)QH*MgxlfQog_!aRsmV74sk9{0BI{&cRi}f)jDBp zPK)`4&lF^K<}bbnH*PY>IOpue{Bk}MnTeMaBkvWT%K68Lxg$j#$8>lSmtX0@Oa8y{ z;DwzNitaf{mvQ;Kq6UlCc+_J2q}|dk8edX(Luvkhb;Q8u&vIgotehBnmftV`L4FbM MT~blbb;lsN^wXjOHF-sovkdftVm69J~tdF(;9~lPZPPAUGNQK*@5Bm6qW_e z=h@GAe$VZ+ktF35!Dxtyuk?FZ1;Yk*89z)xgv<;qnu_9v3hD7`InM zp34%q`aFML;a+d%I^D<%R#`7x{)kGh_6cV(0pW5qOAhEJH{y-FPKth|=-I~Xq})^v z;Rd_%iYD>=d%O`1d4qg7vW{1wa3q4Bs~d*18bq%j_vu9*+Y0}1xqw#@&-rTb>p1@< zH?p65xSq#AIpxbn`i966yagk;Je>FFFZ{WL+x<7k)7Z%d-DDeU?1wlZ-i+Hx=g~XM z?LSG{Yys*ULC*Q@^A(L_6%E7X!&;4v!sSTbfCMUOUxEO%k(x=dn-q*GNh;t^NpjTF z@G^m?3;c+mhAU!2F5AE~}%!hiLU^TmIG$P-GKujIqVN491KkueQSk{{QoFZr>LBcoYmWaJnbQ-3N} zs$fKbTASW(VFO7rOVb0vAd!5uL7pF(11>!yC}q{*pbAjcMM>{(7yN zk5nkkBtbnSC#R7lHI%kPPDR(evKDJ&p!BiewQ76})zp*jh-yHjoSG6;6C@oH`dOTB zBz+_Jg(tV884c{xMFBYM9Z;aYbW8BxY@d$4t|#3W{A_N(PYOUWa>&+UHTu>hg@LD} zukQNLs_d@e$HeNd<5H}Kmvh`sq0&;i*kvl}6etjQWgWas;A$Owy{NdR4xX@C(JCs{ zD6bdwOXcYr9$*vz%6nSFgX`dBLSLzar;7?=>fn;F6I%z51y1!#33UW+QGvA%o-Ha! zuYYREgJ%jnvktBZJZZDS>#ywsrAQbO73p1*B=EdCc%?(r4=7W3M%UN*0-;Zv zXAb`8%aq;~GPS=C1i`#GCYPar5!YKzhK#t?p#Pk(K_v4p@C9{ot^Ja;d%MDm`{NnH zbK1jgz#|O!F$3P-fR`Kat_HlqfIn-%?Ue>WmO-Eza4gTYsoH=~sYNBJ#(+O>z=K8C zP~=7$@H}ly*sQi=qkK;O4WT4TVmhd)T~ zDLhXVkW+dJFyJ(f^b~Bssf?b&f%EZ4pgwg-s2B>=*R?@o3^-Qh+7xTR8`Pp$R}6SV z1D^B%w@Zx-0_y_-wvGoW-GG}Pz*2?**QYRvGYxoSgMPLFZ^Cgg|MCoiriKCw40xyk zFEHTE40w?N4>RD!23%i+NW9K&5JVaZtT*7z4S1;mZ(+d840uZezT1GeGT?53+o|tc z8wAG;1r!5bZou0Z@CpMSWxy*9cv}Om8gPr)f4I2XAc!^;s4?K}47jvS;T$y}#()PH z@D2t%*noGe#nJ!a20^D<0cL>#?`*(h40sm<9&5n68Sn%H9&5mp2&eH!Er>G+tcC*O zEWxGe2E2zsKf{3cG~k&AJl=q38*qCsgCNf!c+7w=FyILWyug4b8t@_m-rIl|8}Pmw zuFb!720=eVf%OLbaRXjzz@ISSWd=OSfbTZo$p+lL&8~2kx}d*7aLiC(fB`Qz;3)>Y z!hjDn;FSh^kO5b9oZ3IwAgI;_z^n$m#(<|9a7k>t)PNxdJivfIX~2UGcp7jm{>X$I z1Var46a)U00go}@!wh(=0T;(eE=@4tPe0JNOGyU7@CO3PYQRSr@N@${%7AAW@X-c5 z(||u?z_U4y_EYFG41zpEfiVVrfdLc2 z@%%95sq`X6A0VC%GoEtJ?;)NJF&;PPKOmmYE}k;ZZzi73ES~k8f17we;)^-|I`RJC z?VbV-tR{eZ!js4ORm9Vo#FNSSWyI52#FNhX7l@}bh$o5jbBL$2hbNZv(}-_Kyu$hC zh^M25Cz$hNh!3Li?~yn#oB%T^RR0%1^bq3dOyQ~Ie1GEUEa55Vd~f3E4B>HezB}=B zbnujMz9aE;lJ~6Vd=&9?gzyw|K9cxmH2*vW9B4uSof$lNoDU?P&I+DP&YOs*R{&2s z=l>`KPe%q%66b#*o{kEhSkC`MJRK1{3g<5pPe%h!Fy~Jb--^bcN8-TO1hgi;`aVVA zbK(`^D>;9Fc-s0s<(%I`d=&9+&VN8WZS|fq&Tl3jTRbAb`L~IWCcc>SuM=-?M?e7w zRuj;k_&m<9BA&K(PbTM=5l>sXC!O;z5KmjVCyDcOh^HOg6U+H&#M930Q8@n`@w8)m zf;m41ygj=s0TKs>lR`J*tN-L;%O)L6mveZP_awdv;%tzIM9R?Xy^6haXyfE+HpOZoHr3qJFO?3^M5P@ zPdlt9iSxe@Pw%ImSkC`MJngg|h4UAQrw!H<%=y#Hu>WP#&gzjk@HHtsL45T+J_d+S zBEFLI2Z*N~)Kkv+J;e7X-p%PaCCYJ?GyhejxG1oPXU;z#sw&IIx=d z!NlireiiYw5qdH?zl?a=06poPe}Q<~_&iCRpF=!tc%E3!Pa~c-I*-En=ZL5M%@fRd z`xpYAB0%E6aN=o0^Hl%A#{luPk$EaP-=BEez&z!g?@c`ITOK#(yAx0Qm8XpJ9f_wG zU(b5ZM-fl^mZz9_dvqiLv|)J)xIz=+X`}MwaXyfE+Mhg`oHr3qukfC9&i}C#Jnd7S zB+mZ=erhpzo{~o;k4$qtA3SP=)p0M?aR+-qc$%ZV)$!Y8tJ60+hUUN3kzxsmbF0Y+ zfVHs3Y;_#AI(#kj6Try%iHG#JA$qu(;f81R-|0%7=u-qP&)wf{?r3aw2*EmbCdX4u( zd=W-Eb^HQ2ZFMbDtgiSM0jb#T4<|4!qR(w%T zeS*Z!<(A#B^kDRcS(hGi1EB$Ykjz*UtMcEe+NYNBc5PWt^Mpon;SI&=TmoyOQ04bF zKQ&fVcZJ6ECG-$=sH6I7Bh0xbIiEqfIhXOnw)L2hJLq1k$&ZK5Dv*Ogi+x4J3wn z_bg#&d$u;sUc&D8jPAGzWu*LW*1~@EAVzVNX$aqjfK%_oPt}Tgj`%Hok)_33Sg^}t zUkCqIxEIVY@3L7;=3NafpVFbuHTt3}`EKFOmUj=x=7HZ8dg_;g?suI0q!pz5J+0-F zjsyFDYJKu|`M}9PRCZU4c&p=Poiki%IoU#CH4}P(V%gLrY)gvN(>zev26%UxdzBq#}6s4MJDV13x3Io zM{GmWoW6l^?mZ@WoaXSPIR1;8tyn?Sax^;C8G!kqJkdCBRxZ0fww-PAXs90r85oT2ONUs>EV96;(Ybs?L8<^BRhj zUh_fovcBlws-?9NVcvNiTa2J^(S%HOwy;=NoUuhCh~%3m@eUg}zgq|E{)>JTv{Z+e zwy8U*j$f^gZ_->nn;~W~)}!=VAX$$N4q)z*5WCe;jy(0CwxX_Zo0pqqFndrprFz!H za`WFfgwERcD|HsODyw`jEfKcsr8*{J8#-uS{yv#-rC7lETB^EC)rNlIec8NXB}CZw zMoC2@Af1j4FGfl&Jfz@->7X(+@v3bhHRR?{XJ<>QGZ)5b33B)#Tvpj*t3Pzb4fFCc zGGBNf+i9*PcwVX1+0&x!il-4jt8*mP>tl6L1+*t(2&x6QNdk4N)2FIPI7GG zg@{rDTvETG+Fku#!f8m|$Q6&O-k-@M3SVLc&Hse%)A<4Ono>u!R?Plkc)O}Ps!1; zx8{F6THUd&YxcWpHtY{-UyO4H_K#Qbf{2#g%~N=jc2W;$i_&ya5p`lQ*+<9aUvaBIxd+m4mnLusT%J>NIyGnLnW^O&}$@H4sWMT#0ME zr)j)K8hvQ>6;bks$}i?%T0I@-k@2dO=%ZSdWu za%j!iYSv?5^oUcawy?&;M;zV>#Grm$GyXl^-h}a&xYf{in{wm+!uSzB1o%$7NZ7q} zi)|Sg6CHsX2d=nbo9s-pG_=Y;raF$Acm7b-g)evNJv1_{Lk)XtP)qZ-^J0>nkEh|l zgEgl2O=cN1$~5-|TQsPZX~Yfo#-LbJ)=%uqK~B?}>uk*6_NM9AS>fPV)28d}qrp#@ zc6->}!7-*6Z!pCgX)amc=vk`QS2~)0@Ls4bPRKv*VvBL7hu}i&;qy&u;VM$p|U$^-2$zb zsLG>i`Q;s5hhCA}+)mYtmiOGs}yjm`GQuot%9ZV%vtr)cX$h)u%7*_;J`_xyv8Wqz&hHe{`Ai3G6VcK>V<@ zn0KaF`VVzI-^i8Wqqe@tPCOk|?;h$%>rjnB*t~Bdw)lCWC}(w?rny%Cyw{tYc-V0` z|3G4{B_+javjmt|_~V@hI_h*(oa`K&?rKq>zIlNS8{W}0_X1l4vg-odIJ|Y6SNrjn zo|uA`V#Y}7ib~$nPXM5$yQZ*f!(+@YaB9YnT1zX>u~s8qd2$I@EGt+b%*)rIBtm`y zw?v5THN~@5D5TrzD)*Q@wR(wWtCLGRSqJ*f!&=U0zC{8V0Y)K;j^P{W!X=}u#bF9Ir z_NI>KS7v(r#0_(!AnmB<|*Fx=;V_E zYfXP-V@D^ND$cUCqiv?=&a#Hj^beju1)T9mGr3Q*6WD}jqMlisfC?R_X{ud7I5CUq zZF4R4vU8uMn1WMy7^kvZn41d4gH{Z@B>*}Ps1b)kr*fO|+s7za`md>f`;mSBOq%`o zAIQU7Y8F|;a&9boUUkBqstRK*snFpSA_RcBQkt7g#tTV{TRKV74cT^BGQ8*Ls6vaxF)@zNdq59yODI8*n_%@ zcD#O;{hINFy~8tfd*Qfeb=0#u?Q}p7r#k{1dAZ*Cv7Y&;*W9`Q!9!>IwfQUkbX|Y& zL;63D{tNpG*B^df4X4rNIR8m3Dj4hO4fw&S7!^AH%0MNx6YEk1^%}~@@bZ6DFyAq~ zOi`m*-!T!U!QZoI#tb*zKFzj_Y2Ih;_t4~TaMJ^-*7KtUR@M@n%F}qv`uX+1AXP|9 z+poW+L54neo!%jj?JS#S{lL17Yhh~q9UD5Xd6z@qY3CDM1Eo4n(Hj|$<8Ny7Z|ObI zig&`hsSa#u*VGOb?A39L>@ST~aG65)i4;r>?r^*{J_a*1g;6)HAw9Y1sHzZ56Y7%s z(J92lJS((OJf>NP5KC2K(I0B_Z?JkK_~zr?=p4mjEb%p7+f`Khp8!}=U&Atw7o_FL zOYHCC%};)X3d|iETB@1|R8qhA`e7>#bSp^(H{^WY02Qk)ZWS-U6D%)(fT)MRW}fk5 z8saochd3s^_SB9?lZ|{%h8LVp~(xDV8=d zI%+SxP z9MVmn^4V&E2bo(o|X!5|eXCbAlLdDzxYhP8My5)<9{j2(dU7FlJ z?d`8nTT48&NzbT0SA2eFZj&N#lApXn$8Zww9EyNqfHX&I#o#XIF5XfT%Gu~C)4T8e z{NZ};5l=(u;rHl#e;m-2u?N*YU$Wa%p6cGGPO(M*pJIEDv$<2FOs}_NB~xQfp`WwQ zrslWa_8Bda7e6WBAvv#Z`x0K_ZS^&pJ3k+1ogc7t_b)V>eNeH_tK6aS0V zsvV+4?K_8(+O^fMu!)FN;fF9p839*U6XFaVn~qSp;@=sfE$@q|F2}*D9cq8r5XRf1 zo~pNsX^BY2WmT%&-6^E2??b>4Y7p%*) za8uYZHh5Z>&J`FH(1E2wW=jk-m%_0yV%c-!F|u$#^r z+OhYVdh0WGV%kts@j%vU`o!VGcp)4y>AeFR{FhX1BBf%#RCn;wi!JGC z*wBuu??9!>O)>ilb9ZMO^vlV^GZb|p6{V z%#P29>o@BF1c=RV2T5U6rq!9Bf#wxq$fyG}TYpBuR`df~odJ`DLkC&!nJ>nK970J~ z{C;Sm;CHF|`t}mxPQSwd(p>SMq_WDHoyQh~Q^)St>byjCKd942vTmBSuc%JE3+e+p z95Bt0G89Svj|l=SP?O*@Twe^L4&Kk6pEV-Lq(RLIy6R@fW@ScZpr_#246E)~TL|IU zI4kR)*V)_^xcd92nnz3bvn6?vc0a=06;gm!$U7lyh*$Ertp=-0lEN zm>n1BBfNIH+1%OfJ9kG|(-N=bU!nU##frCLjQ?9|bBZ>Oa7hnNe*yd1k=e6N@%vfg zoLH03el{KCq?`Q{PozXtoQ6umX%J_6Cfq}` z^W7A#e%m4?N&V~-3MW4}8fu-(-MyuDf@y6jPbNM5xP#`2h0Bhv#rzJSzexf~;uG4+ z^_gfxCanaRj@n|-mK!{;o`F=IM+}-NR1QPMynK-tl0Q)kU%b?>p`+D&>_5EbXIrux zbHjSMAJ?i$Cqr)tLkQkswJX*GPg_{wtL0(!Cdzr5l2zNMthX&UupNxkz&z(>WwtO= z%Yp1OTT7GwCrq`C?ebQNB7Q$|F3OO5h2o}8jU_GZ$asbK@-6kBpbyRubi123Kg;CYyW^Yr<#PCIAESYZm+~)L zo#XMBjLy)YJg*jh%=RuEZu0JB<`-I<{ZgQei@?B(Uo zfwy@Z9%bn@X#F3S0?AS|SxVZ*Caf4|np4L1t;kLf;0Ar@XQHYd+BxmY7Fcq{`=F1+ zh$|!nzxs9OBktAC+K8J$QP4(Q)K<#gQdezfwv{oavX1OuD@$7Zwu#K=<@YCK+7%!DqE+aQu{xGp0-&jW&OMonmzKRW4Asq4 zz?sjr_t4v^n!r7yU!L^CTA#{Mce%+ym*1us zMY?T%(J!upB8G!D3LrYy9uPM8fL`Wic+!hlu=+V!bS=tLWpoCVB1y@$D2Wuq)y`;1 zs&kNPbv9bsp3PX*!gPBBbFS)Xy1$w2UlrBx2gp4Z+99`>vRkV{lNJb{t0B-v<6*TY zH!>PV{61?(d#?=x&5;rkT(w^e`~w)`H1PLqW+~1grmr@!VrOLE&A4Ob_rVm5ci)AI za}?Hn3|#Q9a=x!cZ9xHW_O;M~2h)gOcx7y4SDi|B8jfdb8}dlVsXDH}3!%bOs92o^ z3u4ZaQCEC4D%R&LuO>8&CaWv{Rk%-;&p@%N&B(!^s%&60U+UJ+u9dCCF;A53LalO! zp6kTRnnl@qysiA_jeS%EURXA<(=YYvroEAUul<#+=$UQ#U%=?{GU$k8$Nf~t-Lwu@ z==V13{`)@a{C~5*uN!3_nL2F1;Ac{w8ZkzhGH1@LIa2goX+ZX@oJmuZI6c!{&-BnU zJ*9yQa%>ndJdK(=Mae?p`O5Su3+F1fS<3UXl>9s;YvyES@~rtYJ1gn<2eEUNDKl+T z=8$;ql-wzkY)Y0gX$Y@MH#8tSYtAIn$s_$Kla-vgNX%ZVHs}Z*HNKHCJgLJ*hprvaSmo{#uhAeP0XnvvZSjbDuu+59z0X3;(CrTY!AU z+g@)es0vyGy6)dzZ#nuo9I;IElca2PcW3Mz>p*+r2Z3Xtx!Cn%2D?%zXg2n_ z3eW)Tobu}`hiEZT==s3`IIDb{xk=cFN>n%cy zj)DFIv;wpYR0TZ*8h*srX3^bh%44}E7F(=S6&}`6s zprxRfLBqfHdK0ky?FJnOn(z%GK|HRr!tpy#46a0TL2Gc=?*?6P!R!4MG~uGx?zO^G z>qQg!cObT{Z4qL;khV`T6e96=u^cn~4bj4F%?&}`6#xF0$O8VgzhngXhVW`Nd! z=7I)XheM#@pld*5KubXruG`TPWUK(nK{G%vgJy%)fGz-Shr)Y@RxiB1}Q6j zlY?Rk{e}c3nVt;{ib)Pql7qsb(LX34xq;Mz^pWHj($j`Z@`B)cZ(L9msd@8;^#Y2q zO?HONf`MRSpoGGD!-LXI(*jqQhCFX=!2casE>zv{J0H|wH$6!436f!V0JodcAPwT< z_+xt)en8iE82msh{!Z860jV(t9AS6AvcU0W21nFv!HASFyBwv%+e_Hhp_o4D%%9=+ovIWvozVi9O7}?+11i0{~BZ`Z)ZW92GviY z-QZKNcP^hNd7DDar4a7Mx*v(<)pvOV_VK1^e^1@lDTHA1rp6E0*-R3qR5SM0_C9TCSIju`VAv|Kau!8K0(*um{^`%W+e7Wgp+~=C>w|=b zcO|fw>R`VDE2@J9U?W^!2WtVW02mt26WNOewip;p)M6>X7M$_g9|AJ~+Uh9g0?Vs| z(N>;Y2U`Oy8yKQpTS+Of$-s<_+XpPO7PD$gVmZKZwV;Mw21XGy7OnwC5!A6*RMimY zhV(P+<@Y0*?fnq{B(T?s?doqsw&*O+mLhBUk!Q~$>(;WtSh&ZXV-r5;YF+@e=A75t zjE^o~_QnTs=H0+5&U?LI&=AJp}Z4*{oq{C@C}&_XSdjp%ujv|aXFZ<3Cgpa-bII@ww&OE+bW?cQ!jw_P67 zj(7L;^|R|=V9~$0qJLmT|DcNg0Tum&DSA!%*E#g>qUhg2(Z745>**issQtdl)0#wl zzND?LC+T1B(7#inf0sm=vE!{h=VX&ogl|7JGbL%H(m`BFMJqXkzlMA!?C6oWQ-`OI z?@-d^^syczPhZucq)$Axy~bk{^Yr0zjpFZ@@}z&rrnw~H4i+hfKP7y{NK5KQ*5r$> zZPp0`*b#VAMUP{};;Ajm`l4IoV_Ox@>BFIjz4b-ws7$`RYyb9@#FfG})?uCseA&e> z9*C@!f^HCWr=Uj!{Z7!Ug5DL>zXNy5E;Z9KQaeF=2|7s7(SlADbe^Cq1zjuX20?cU zdPLCg1idQgT|xajk^>k#&3HzV+6mfA&_RNZ7Idnh^8{Tf=vqNH2)a|yBZ7V>=v6`Q z3hLiUt6yqH8KicC_7ZfEprZwyD(E~xR|>jT&<%p_6!eIo-wAqE(7S^Acb25lRBPh<8 zd>9Xq^fCP~UcYtejj}0O#cSq!v&g1%F9MX%lk-8rPwzgg@@FBNy{kpkwWp0 z0u&>}^FEkmQuU(*SiG=3$zI6fz6pyf1VW|seTwho!1Pi}>y-MDm%1uS z>APCpQpI&j1+b@2g~j2cg}g3(53F12l{%#cP$~OUqEv8qRBA}+0#C1lPZD_D9d;pb zibHyxT8cRSzdgNOv(r(k-O@$n^iK?Be6UL2vvi+Mle;o^I`AUbX(Dxglb!yyoxK_? zeUq>5X!XGkB|l=&G~_#1$p4JKmIAL^bu72@zk_TL@Fr4F6RG+I&C7D(>K zEENpU;AkOzousL|h19+1;j-uTQVSl&O*rGx=Lq$q3xBa!%tVc!C~&&(eAHJJ&j|g>>6+pkp|1j`+VyjeUb~F5CF;c{Au6C(drFa-K#Hy7 zP%eFP(!K>!ZZ2NarrQ!q&2Z+UW~49Fcs-zrz=JWJ!|P1vB%$w~r|E;`X^g;&`)EAf z6i}LCCi@cGRoOTqPv{gZ(`0n=rgVUR^70}*BYxNIEY@Unil=1dU+^5upJnun*xyW& zlt(N$-*D+|9CI2Q7Fsl)Clmh+XKQ+xWk?&FA|(BreVUFW{S3SfdLgMuLvXvvQ$V0rSDCP;dmcrf zGqorFg>(dP>Mv!2W`*t#D6IufQ%nEqTmeUM)gkoPiz$*X@XMqRZ}rdGAzWH&K=vi} zw;vlvg!4S=TCR!ozK&r_e+-k;=@~H{I#h3Xslt_FG*xLC*V#(XtS^O~$~yDqXC3dM z6~d(`Pk~rRs28f~QWt58Mx=EZoK5h>(7FeTR6g1>P>MVW-lTAS?I}sGu;g=L_A+6! zZqFVA&c}Zp-!2L~ug<)PY;yN>HlfdgPjytK8e3G77SD-@?Q)Xx;^`0_eZRWEhUBj`S^3)PIwYvOq zji)<9O5Fv%Uf{Z&A?%g&VG;P7v^>K4YiPJuNP2;!@)um^maw4MG$C%0cxu4juMCUm z$X7zBh|&0}u<$rZF{0=>nVzZhg=V_w7qJXUYk@!N1H6ZuX)UUZ(@b^}mOth;kMrk6 z{tRHVE5cF-1Z(=4b)r2<;K5?d>nqY+fxGKO#!1%V%7nDKyH@QbQTq{rmlbLN-J4K4 zMWy6wdS<$Y`pj(seH#Dzt%Ke>aV+a% zSlm;>no{S`FdI0nT6OohB~(g2&7Tcen@eG-ov&hM3{wrY-)=-LUu%v&b6%FHQ0!dRD zq|}n&I&rxm@bz^@n7x=4)p2#q+-%-*pp*jdlJt3gxtrv$lx`3uMl3ln;Us$JS32S^K zOkP3xxYvY!te8N0SG*_ibTLdG)67VRs8mD+q`YIrD8DVFw@KR44`Z2psGg_6*im^J zK{)TS*|j;Ro=ZK79EGOt(Ef%rV699{WqpcY*YPEqb-E~}^f;5%F#8C^o;oI0Y%c{| zhJVuyoII}^w|9Y4Ed_%$Mfz!l(rWx6JY57}n;3p>p|m^_P~5zFvGN-ffF z8TFCy21(=gLQ4LZi@wnNw^HCq0@tG&%ud2`0zD(vwh)mYpjCcCOy6x>=W}}6+aVrg zUzwxn)QI?0p)C0?ZC1DdoyAkbmYTQ0BQ<`mz{dcmfu1P_x~`uKocsT*rl>DhD>NJ@ zC^10!XW^i;g#_cNHiNxVMZ=$-+vpj8xD`1YEGb2rCKg$qPIJ6j z?dO?wr+x-bca2TyYyPkjP0zT6{Jaw+6^o|PZ)KET7I>NHVgXD4;$?U6vVn@$%<2qY zMCzvz$s+LJ$r?bv8&T@Xr|>9xMl4YtJpk5n9sDl{ZiKZw1sw`w-JR_sa9Tw}TC~v= zitEg>2;f>%V^}f_^#@P=npBFCNcw_De*vEB#my0x3dGFNN1RLGNzd?t(prs3hxt0R zUf9*YhOCGBAaLqL{oCNWwF~4;fHWyLr|YCVoXEm@H674>VEU7jhCex?$HcBVbLV7r z?fw|6t`6~?F=b{xtN-)q9ofH3_hH-b4{8HVd`7=l&deNJPF8Nt3sdGy%*~l=OC1qE zaUja~n#fMv>B>(1x9N_Sck9XQR9FI=_FFRh`nRpo6URLA1N`%nk_M-x_8*XuF|kM2 zo@_}?`;q}BxiR~`X1L#+S@|<3vlF*lvuA#P-FHS-&P-PQdqBd@qp5yf^6-%Z7fhOxXUmy2 zv!q^AIeym*P31JXt3C< zEpbH1-5Tq+y*j;I@)_X3_1Fa{t&b=%MasRJRAM!!q|*Z5k|B|>s$cTzw5Y@piQ@WC zHER2k15~_rmWkQs_A3c&E_V&ouXf#CO8Pg4o_-&x(~F}^R*|0m2KM3dk^|6dtY78o zG^V6}3p7T*8q;adl2pJ=^m|;L1~)EQ)k5ytM8C(?>2RNt&w)4AZ^qmkwMN5wOKOz3 ztyMRc^lu4g^&?ZYP+MmzS=AEG>bJK=n@bKrulARuV_P+I2_^Mg$+7jz6pbw_>EB9z zOn)y9FVoNkC5~2df?QT|pq2bYhydN#^C)3okb0Mdww5~u1{~*z #include #include - -#define width 30 -#define height 10 - -WINDOW *win_menu; - -std::vector choices = { - "Choice 1", - "Choice 2", - "Choice 3", - "Choice 4", - "Exit", -}; +#include "ui/view_main.h" +#include "ui/view_info.h" -void init_win(WINDOW*& win) +std::vector win_stack; +ViewMain* view_main = nullptr; +ViewInfo* view_info = nullptr; + +void init() { - struct winsize size; - if (ioctl(0, TIOCGWINSZ, (char *) &size) < 0) - throw std::runtime_error("TIOCGWINSZ error"); - - int start_x = (size.ws_col - width); - int start_y = (size.ws_row - height); - if(start_x % 2) - start_x++; - if(start_y % 2) - start_y++; - start_x /= 2; - start_y /= 2; - - win = newwin(height, width, start_y, start_x); - keypad(win, TRUE); - refresh(); -} - -void print_menu(WINDOW *win_menu, int highlight) -{ - - - - int x, y, i; - - x = 2; - y = 2; - box(win_menu, 0, 0); - for(i = 0; i < choices.size(); ++i) - { if(highlight == i + 1) /* High light the present choice */ - { wattron(win_menu, A_REVERSE); - mvwprintw(win_menu, y, x, "%s", choices[i].c_str()); - wattroff(win_menu, A_REVERSE); - } - else - mvwprintw(win_menu, y, x, "%s", choices[i].c_str()); - ++y; - } - wrefresh(win_menu); -} - -int main() -{ - int highlight = 1; - int choice = 0; - int c; - initscr(); start_color(); curs_set(0); // 0: invisible, 1: normal, 2: very visible clear(); noecho(); - cbreak(); /* Line buffering disabled. pass on everything */ - - init_win(win_menu); - mvprintw(0, 0, "Use arrow keys to go up and down, Press enter to select a choice"); - print_menu(win_menu, highlight); - refresh(); + cbreak(); // Line buffering disabled. pass on everything + mousemask(ALL_MOUSE_EVENTS, NULL); - while(1) - { c = wgetch(win_menu); - switch(c) - { case KEY_UP: - if(highlight == 1) - highlight = choices.size(); - else - --highlight; - break; - case KEY_DOWN: - if(highlight == choices.size()) - highlight = 1; - else - ++highlight; - break; - case 10: - choice = highlight; - break; - default: - mvprintw(24, 0, "Charcter pressed is = %3d Hopefully it can be printed as '%c'", c, c); - refresh(); - break; - } - print_menu(win_menu, highlight); - if(choice != 0) /* User did a choice come out of the infinite loop */ - break; - } - //mvprintw(23, 0, "You chose choice %d with choice string %s\n", choice, choices[choice - 1].c_str()); + View::setWinContext(newwin(32, 128, 0, 0)); +} + +void cleanup() +{ clrtoeol(); refresh(); endwin(); - return 0; +} + +void finish(int key) +{ + cleanup(); + exit(EXIT_SUCCESS); +} + +void input(int prev_key) +{ + std::function nextCall; + int key; + do + { + key = wgetch(View::getWinContext()); + nextCall = win_stack.back()->keypress(key); + + if(key == -1) + { + win_stack.pop_back(); + if(win_stack.size()) + win_stack.back()->repaint(); + return; + } + + if(nextCall) + nextCall(key); + } + while(!false); +} + +void show_info(int key) +{ + View* view = new ViewInfo(); + view->setTitle("Info"); + view->repaint(); + + win_stack.push_back(view); + input(0); +} + +void show_main(int key) +{ + View* view = new ViewMain(); + view->setTitle("B15F - Command Line Interface"); + view->addCall(&show_info); + view->addCall(&finish); + view->repaint(); + + win_stack.push_back(view); + input(0); +} + +int main() +{ + + init(); + + show_main(0); + + cleanup(); + return EXIT_SUCCESS; } diff --git a/driver/main b/driver/main deleted file mode 100755 index 0cb40b6626a65986221f2720800b34206ad5117c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 61936 zcmeEvdwi2c*8kHsDdE;9uz*!jBL-{{umy^(%G%Hto=Ct7MXP|Nv?;BWwzerC-s-l& zW<#{Dm&ILO(e;9;E8d`@U`wGzblrlAc%|zFo=}l0F4P+duB6C-I)ob+3XrII-&Q)HwZ)+i(?Q%aZm(y+2OEPu-2eS(8U2#x%60$2!|sDodz`t2^vLSBrx;|j@6(fSr~%Kk*rngSrX8~ zUNpGAAII<41Qg{+JSvy|G|x|e+QMEmXc6*jP%BPtqyKp#KOAN=E|R1{qNOMIOIILY%qO#Nn=tj=foHgs zfBvn4=&!4fCnK9B8g9&#H{?Et%jYo>}hTZy?eJ_4I>AmXL;xGR3w*%k*%gCzc zIS$u*)o#a`!`BYV0$IdoI~Wg*kTbh~Wc+c^Mxu|2LZ1Y^MWRoLLO&r2-ic0)#AhTr zJ`#R^6h0MEj!sl2NJ+F_#XJ8ckHBtCXj#4j0 zrAU5YO%yvk5JjJ5QN~?Xl>Y6BqPGj9$p3m2KXVS`w?weFLs96@ih_@iqMt{i=;w+k z`rj6%UF}i$D`;<|@j~;4NbR~L3f>omzbA_PZ==7?l}1QiPw`snKu6C{ke~32Hdt6X zm;IHb478W~#Nf`3aGpM2QiC@DcoxtLc7 z^J7n;iS%}cWZ7t8X*2k;2lKHSS8>q=7tkDRid0arWLafJL5-`h+Eq{>71;A;6%;$G zolDAUT+ZseSy|fv13T73QRn$1EUH0OfoH=tV^S}-nuGC4@ zwH2&+mX}v) zOj9RuW+i3i&c(GQk+|ig6_r=kI9Z82JJnWQSg}M14xV{e0hbn#$yvB88Y5Ed%9RCG z&gz=Vio)_T*Np|sQ+VTkjU1CJtDF_2CsJR59a_2qh-H<<=mt{uq^eq14k?jI^eY<1 zNN1;}FvS)wE?b^D5$`o+1x4kBH8lmU8>^h?y^_it;y-h)E3Jr7&@HN;Rj{J0*ja)6 zGMA>z46X$9Uo<^B3#)S={X`}`T0p(Sg-=^iU51`Q>&k&BF3&};qrVFa7Q^f+3W^F{ zMWx7?>mm_drPY-y3d)@oOI)SgfVlNg!~cyCf@@)Uc_nzF7grWJt6XK36^wc6l!5|C zRgF&6>^6dZ!I04dys?7Xo>!2UQjjxuN zQXlX!;|dJP?1@@mhm3;2@TKvQp;swt`cLJ)sM-mKu^gi|&?UUT7Z*|sYFz(Ae~=EF zbymZ#z#VWM2b#q^4H_XhYkm7mPC;}Ga|ofnjPnj^LFgX`?uq2GIIpEXk!Fdm|DPG$bW7N*%;Eq`^#1jj-a9}8%4M!+Lg zE`bCrqH%{5;x*HYE4kBTP8uU4EC}jE4z(y)=A4=TgOMbZ{%g#c8$Z)aNwqW7E&dN` zrhY4e7llWk!$upNVNqqRi+9$4YQoG4YHG@sR6q}NC-W&pWm-vjZB3~dvz6sFIb{;& zG0XTArn<7WqL|W4iZD|kT&h$suVMvUV!<3|P3m^fkL zgtWl>hP)#KSzh}(c$On@Vz>`Fj=JfGcse`L9&Mk4@YL_xqwQM|{#p$QsO^6c zK3|8|_8|y=oep31tc9hpjluk#mbFrc=N_5o)amfrUI*ng>hRby3Or3ZJk_l|Yjt?C z742E4!;?(fvtEbS#s=kW)ZzPU#DL8@`~V%kMTZ}#!|&4J2kG#gIy?eM;MuRk%K|j}EWj=j_$tf1{(9{$^n*(#>!k-lW5i(BaKG{AoITq7JY563Vvd z@TcqOlXUnqbodk<{!AS{U5D4shABH!hd)b4ujue+>+rccJnf}wPreR+u7(6$q{ENW z;Y)S+^K|$s9p0+Luhij3>+p3t{P{Y3qYj^>!#C;h$vXU69e%71zfOn0K!;zi!;jP9 zH|p@?b@*l-eu56)qQj@?@Vj*QR2{xkho7j!@7Lic>F`}T{A3+o)#1~0_#Pd8iVoka z!(XJsOTs^s{io~jCLKOQhd1l+VvCmLChG9CXRSRJ9sW`c37DkAPu1a5bok%u@aa1I zWjcJO4xg#RD>}SQhtJjFr|IzdI((K6zetDA(cw#V_~|-)l@32chhM3~D>{6g4u820 z->AdS)Zv?Sc!v(ZR)?RZ!>`lfXY26mb@(fE_>DTenCh`yrT#0E;x#_I#v&>17FTRv zr&7Pe)D|e&mp0({7O8LaApDij$;2C_ODW&q)rV(vETt*j`#V|s2M^K|3jHlC{Vk;_ z1o}6!^kGU<=<}~*>CY%lAkrT0>r%-CPW(z_{bqVyt`-cD%>Y5rW6 z-a=^#W&TW-eu2^hDV@U78z?=9(iWC}l+qNk{AQN^6QvU#t+!y_BX9;;&-q-IPwE^dgqtPU&Py=d$z` zN>ixtXR`DQl)iw{DJ;E#(i9r}7M6aL(i9T>W|saFr6*8YV(C9n`a(+g{KWd7(i9T> zT`c`ON>eECce3;d2%x3F|IrOEaCH?s8glqQ$&U&qpmDNU~4-^9|_Qkq=6zmBEn zP?}u3zlx#t(z-IP`+y@;i^BVE#jG<(ROsr}%7 z6kpneLIP9!L%=O2WG9f!(VbJ&iZe-@xftar%ce`f82-0gax<8|ZDE{&G%#lSV&H zqbGx5@^q2--l;=4{TZCzq0tXz^r=Veo;}wop3ju}FM4wG96sZg0@A|ZEC!~2Ok;ZZ zrqvedJNX>+0_6WE67v+F@dH35qgU~K={g-D;rEn8NEp1ZuPdmZg>4iCf@ze0gb00U ze`0KsPoliidNNM&^eCZX>VT~h6ZO8wMBZoJJS zc?O}`V^Lfk4DnS3O=vfg+G4199d+EXHn2o{hdfY8U+1wY`7e_mEN{71%2oe-|hgrD>Ya^2F z?zKprB`3Q{G-URQ%=JXu;a-m<1vA^LSFyrxJ3NOJ&zm4jJW6slSa&flTRuybtU-cMWrTZ)u*2O2Kta31{RQ4=c!FiVpfn+;-K`P{SV_Pl9~cw8fo`Rs zqssvxumlK_7(s_SGk{S9W>ElBDll~cOe4d1+-m_9pUn)G>jIhU>8;(}3@{iypg<@{ zzZ@S zs%m%d#T!f+Yio(8W*7;@>xpO5?jvc{3nHm+q?{3uQqxy6wW7q6H7tUtEs@xI!FC%>|G-L30L3qR2A=ou|3FE+#kset!QW6P3e-{ zkc>BZTTK=?9J(E@Wz@gWK2L{w?Qst006Kgxx4`fmzOC27csktK_)8Myq#hA|2O1%V z;eDC16wd+m5=<2wUS_AI*vXe{L@!+*bG?-M#`Tc?+tlMkb}z^fd@QLSaX+Pa-ON7a z&BM;l_V^v1K6&%x#N=<~&3o0}d`Pp{{m=bn_m>pfd})uN4EWyx z{=DkJRLD1VIS}eM-_g5o5sCl0%UR7WAg^Vf=Bdf!N!AMaF!z)F}=#(2aWAXu- zzD{{tkADLtL|=H?9G+gKzD2m=hmJAhRqq1_;`w*S!Vi2G#bKtyG?e6Zs zcYoI1)%|Jr$K4--s(YJy9Q2Xm`^(fOitlS9#P@G7$%VOOG7U{nQC<%Z?^`Ln2O>Dr znQuA;_t`AAZxivfh4dB(?GDcgFy$eAHS3OGtPhXstJgzkBI2VE@7>kANRh!v-|h~L z<(QE$D_E^^x?QMVge$!1LOD3*b4s$jU|>Hrl7n(3rzGRm;`;w`An%A0#ML*ZqrE=X z#kS_~=&6Ne8nvDuF;>YdDxQ;E&14p8@(h$0CgRy2v@P2=WOgjfzfMtJL?F^ti58Sk zL=N)DNu&rYzwQaJ+(wc@iW1Mux_JZChqi=F7 z3TGwASwwqC`Rk*7|0ry~fr*3%d`wHiWc{Up{|}l`M^Nh@!CA!o6Y3ct5;6aTdKM+d zL93`owNT=8u6Ff2;^j*lHcoM zO*lfv)uEO!BkNEpl!{<)+e%_IK>_42vOQmuySnatNalN-%?Wfdo}#;m^N8{e&u2Ww zZv-`u@!h9u>m6NimK*LO>j?(_kreVvGQM5@q34^DJ$`xf8)a|YggH;Ee~8cE@fqr3 zT1qn7YhNpIA9roW)L_#a5DOCoOcvC4b5ETkoQOO}IGx5uaE>6mZ^UXTAfGSoD1}nr z)V(XUpq&o|u*Hqf{Vt2^Q#T<`n=9-EIn5P51XO+08@{v`@UEXLj9~gbpq~7S%@t0! z-Tw1?7?-m9AwEyInO9j5sPaqd7~j;{K&Wq^5d6g=;<4qFdBS}(PtZkgg?kRWM|h2} zdBQU^LDFKA&UqM6A)6`$YG6|Z#vQikAYa608qsD8=ka+sld`@I;qCwe>)%LpZK|+3 zI8(Tv89FL8V` z$L}J*df-8hU(4~q9&2Fun^uB(V}Q7lBQp^lL|-lB7z;2doZ(D{xr91t;C%m7q}V>l zd~H7j4eCLgw#8xw4Q1pj-t^QKY<&z8TOSUqlKO^vpTDoq-QtOp@AOdZo-b*R|Ft?B z?A$G~dkoYeZ^|0vtuZK`qa|{saR>ZOd$#p7NlrFc8?&t=)L6zscE1V+-b=^>9#*dt z<##gNHgJ*D0q7TZOYMzBqyEeYYG*6nY^xHSerBMz^5-vXdp(IttW=?UU)uAu>f>vV z<)`D-H~g+d0%<)J7G@~9;H-Kf1}|pg#V)3S$%|cvV%;4)_dK5aU6ARyl=~FVHS*j$ zgSl~(>*cwJ4l#k6g1KKp694t^qnx0f6PzC;*g*t#5GbCVWYoi`0?$#E?5DfC+uwbt z`^)anOPc1*C5!c5rv8SjsUO*GKob?5?_EK@_vkt2btzi(a!5FMz0I%UZUPFVZ;R_TNHP}TBF;v66xvZB(6=z4P;;Dlu z>PuVY2=vR7jQ8-C5v&pCiYiDxQN=+jf=2uWsL=gK=*#mXTgKLZmFS(3hu6K|%I3kB z&O}sFu$=YI$o*Cx;;@=1)rrMzD}vQ_f@;r~Opx^?h;Qm=Hz3|6z}`S^u&PC9mA57r z8E+s%oy>*yf_6(k5HX9|sZQlo7u4jDcrqudAR;<(5=4oNh*2EjRX#-&G%*#1c^m~H zHKc@X;Kg8tkk~!tRydXf^t5RO)Lm4KH;&J9o{8%rKJFu~E9!1Zmt1Gd+iJ7O!sdJd zs`?#?sAB#?e*-Ee&5@XES@|3qK|lY1nV4=R=Ynw_WvjUESJfua(Y`5*!8d=mvxZCb5LD{dg^;)OX1R~Z4NriHjkRr>O>123=b**J?O9a*`nuIIl3Ii+ zytnXK2Z{ALC?HlXxst^B3u!5fy<*HO(SB59_wx2*YcQn!kAi@=e=Q%%KT=J;wCu}C zShn%;J*H$(-B1S7YOc2+Q}F$Ch!41iPVqEx`Ef7FU*_EyOAlf!~-2FKKxN9 zGjU_tXoR@J^WDlTKSYxjUirqnH-*_aE{qly!0qBs;mDj_i?!)j%2U@Synvd)+G6k zB=}S$V`TSn%r$KCrufFJM2833T54`LBq8r6vy|<*DanH!!Cp1ugJ@#SVg9NcnCu zrS4U)qTYuYCMh1Y&oei%8{_XLynU^n$qI6@{SI_OKpZ$+F3~PVaVmTF+|sQMZkYg4`17)?!|^z|K+D>Kb4qv%-Sa&AkhP8T)LWcjeVjgC5?HhU(#MXXc^s=_rhI?PoF0 zGqPZGIR99Jxe87F5M0#jp+oN=E6|-ld)`)0hh;%aiWh@~ohBK3K*~;&+AxOsX%c-O z4m(Xk=-vMz73fgSAG0e4@MMWWpXCMwh($QH+;{k9=8u za>KKzFI(PRZcUIkwWNOJh#O~}Az^m+Ez_uPHFEk@4S zFK_y2&yRt0Hgw;zr`NN+{@c6PBYXS*AlX)bjFlx;p0+(dQaue6IrendA5&&!d?~xH zr!fL8#4?Ejwf{GyiPjSDJQHhM{SPs&>GeMp-`cMuhq+O#JEv@;!)y}pT%0|y!#V#o z7#ZR`ueCQ8t$>-j9|h7s35{X%plv5bscxKtq_+6Sup*hTp0qd{`1z(jim0_k29=uh z5j5a6-VFpo%I^t;Z%O_hbYwWLtHlvyF{sps_jAK}{{vRXb~Zc@s4CeLCdR(uv$4^m zpRURcYd8%*c)1M;?OYO5(v5*~Bf`qLd~ip+OdVRNJ^@PgO8gP?#cu=iF`T7P_bQmF zDxQ6*dv&8)o4Yh;PLriZhjp5~`S^(y23!4%+!#m9KI{%;v2yt|pKNVCWTz?nA zw_;RG#5nitQtG$I>{07`6y=gUi0F2aL2ZJNw#M5AQz%KQ?=#8uP9v^-AMY^8?wcUF z8v}^lnYr1TUw<%G-gFvK<~E+jvlW^f*&4Gi0t3vN*n->Ep51S79VWNx1{e?R*?bR1 zNMn;_t-u(uaHTolv{}9-gMImN>QUGmlw`(KuG_s=ZdeE@veDBRJs;UU?cEoYG^uZb z#*y6f3)AWhaA5Ol#q%Mpyvp`r*_g4D=G7VH*6eIZYm(jZ;7#KF2w`kkl>0{3sg>Xz zgPL~03_hjP`Lp5k6!`oK`&MnO(LILstD42+=wkEUBf8Z`#yj%rL$FZr7CX*gt1CcD zYrowkO|XZGKG%%^SyHVLwwV`$A^Z4Ls%PraLJV1~q$IWWeKur21p>qDeFEV_wi*rK zzWyX8onqKN3rbaemk(PD8qVq?)5jc??kg%@K1>38Te8~f ze_+H7kdvg&wpKC~;SPfRHBC!20C0~Nn%49H87k}4PaqmJfr-1^z@~M+v;&tAm#N1V zq3yKvR&RvZKzs%SRtpzEchJ!LM5SAt=Mj;%=g=Vb99rat1qNtkCEceWdzZIWvAu_V z?|>Q+FyTFIdA@^{*U6_&WEb3p$NGXU+?T<|~5kzRE#*XlN<%S<142ueE0Y~Tf zDq(zS)2I^P)a?*!%OL6qg|RX|&*U7wfk60R$$>Gj_*NhWN&~3W*Y{8r9qNg_5b$(x z$NoHRYhV$m#xbU}9P~|Hf_*O`A=U$Pu+#m6-0&EUCQnD-UJ~t(NU(l@#Of}lH)`61 zU_rW=(Cc!u7Ey_nERsXg1y<~VvnAbc6yL2TrT$Q_;u+zY{03>qh+c)R zGJZ>!u9Ej<$LwxB9Ov0{OnKaY>kmv%>Kv`s;mz333XRI2vAMH|u_h8(J9v{P$Cl*e$h+>PU6sVc4 zR&d$}6dg#N#ZbeaSU?q~J$yA5+H{`^#kF|@R0I7W+IUBJPNOA}*D>NJkK?qT{O<2r zw7?1qB=Tm*h?7i@B~aE$e~6?c{7%8ngj>bKO?t$e_)jdVQI62 z$yg6Ra<0Z_&5>rv4`z@Y(F3&w9n0pT8{*C7PU{g)m7+7P$j&|tzJVNo#FzHT=noddk zjLCTxevIVlr+9C}fApJLUqwvq<^lCG8 zvgg3I6zFBX|5{*!M_kxm@kA>xiSjE&`6O2UjF9sDCM~WDS0>WVJGSSrz^pXsriBPZ zxL55njzTqx8;kFLa>Jj%$>Cdp1@#HL=R5U|w;^DCuS`9UCD)3Jk%*}+$9~N)YvbHR zEW*w0+2rXky#Z_OQqmkOo6Op>Nt|yfo`bX-bwa&|SsnOc0q>=4Kxo}_6pKEZlC)EW zg!L{pb+2Rl;8+3vvHKHs!9S4Wn>uWZ_0fWkeKb>bMpRiAXr|^79 zv*fvU&rg^nt7u^Z)|l>GjBtm?mk;0?g9|{5@FFMssu-A8Cnqm#l9Qe5cBH zIr)}Oo$}mCpdVE|3LnfjjwPyhlQ+o^4K2NeWVit#^YN{U^zm#nd z+C2-brglRjoJ3dc0$d4G*_E(`x&fg0UM7BQM^KeJA%yontpYm&53B=|!mr8e+x||u zyn6IS_uaf7K5{j7f2h8TOiJ7Gpy796TK^*JLch*`i?}Nuf9i3&2MRu<`l*|IbHVvH z!TmJX1jRFu@1)H{I~17OO#BaQpz%#LY+l$Fup8`rBV z5F@W%q%hdH3-`Ti`TINgZgb~r4X)<*W8f+o7=YZn*Ts5K<*aRIu9w*Uq z@-S=n5HX(BS9fE2kZ!0&b8v_DfZ9#z-agksG;}K{l zMzi9Xm$(JrZ6bAKT2?r#i?M@T;>ooVg@H6NBokdvqkJAJ$ia>;Z6^yHBhK0c2SEu)C*b5I@I$C z!dKBYkAaPx+Kb?;ECF9d9XpEEM63A51EKQ;*OSQShfWWvZ-SRPf@rC|ZE82V2e0bq zZxBTML|VW9mN$=C33Eeas-DkJG0#%$Lu>ZI?Pm-#sY>JDpbk2~*V)enXq(<1=Tn;O zF=#){Yzs4_x&5`~wy6WqfZ&kAc*eQmT$tM*&;aP{X#n+L2h0tvVirf{HqwkGXYxC$ z52h(^Iz|ot9bO4;VP{)MZJr(Kb9lAY{nRJlyFGosd~eJAb317~>(6J{IZG-X8<|uK zuQ7vabfHFY^R#WFv8|3K=0$BDnmQ|GEisFvMXf)aqqO#pPwp&hnKw_8lH26XA7MQ- zla4e<|A+hfe8c8r^CDwAsz!V1SiXsZp!y_j+9Kd$LMExZp>67@SO|M5L~WU`-!En7 z)o^YkUzI3^NGGZHpcsuaDtd=t@jAvEW1-c??gw~&6y;MydCdGJb*`@b3{n2JQ_C}X zPrv|4UOLED&)~%K{a1pTx95G4&)m-s)Y~4+T2ce~n?*jZlt}7_TK*8q*SD`pkkQ&q zeGz2xX4br3Azl|$t8X6pe|`B}QGOtmuL+iK7UkFdoAPE+o-JA?aWP57>iP7J4y0x+ z^wWB%NgE%upY3^r0=vU^Y5$-!iUUVA=4>2y)Ipk%A%^=jw8X*zVz$+g?R|`$Xk_EC ztr3(neTM$oUU4P^0+YJxQ;hz>$fBNp2wkZ4`rUZXh8Hm)12MTrtpmb_O*JCi0g>^} z^he_l@81#r8N8R|xUq8{OOs(t*b{B_U&YW-hdD>y{Dl%%ZZ*yJxfaLH_KmxER?Nxn z3)s2|C+RD)$d_NRgSxjvE!s&lhn=xFgTW5y*K)%PLd3&#TJJefV)Nuk>L*B);HAWN z`z=ym+=}>;seN(FI~4C+1jrf+kblm#Na~n&l<}oqH=ZqMw$Py%)gc3IXAU}3o#lPa z&;$G|H#WE*#*3})Hf$rfi~149&bM^i>|@Gq;7e&OK!;KG<*Z|A|!(ThIG;h z`?$2P_G*d?KS2aqU0dX2tS!3-s59F_{o75HCjZ9v(t-|r7z{+w95~Ld)!#uNbv*v? zsP;L^p^3h6tZC$__n4`w;ny;d=Dpm)diYgR1)o$}n5uC;0F-8LY<>}9PB<#L{U9!O zORj~q{(L34#q+s>MX2KGR8IU8Z!iM% zZv}t0p`>P0gMDenu~cyf+O2-pLe&j_+F^l}rad-;Fa1X{n{4ZTQJn)G5Q~_vK;iC3 z;1e+)XZJ@=kV9mje}G54{VS4K>7eKVFvG+kcJxh1!1$?Cu!hjxFkFcnhA-k!gvNC@ z+@DYBYiPlV0ak`H*%BUG{B+E|h_-^z!L$p6H|*#WE43L#Xl+HCHn?h#PgP)hbCKjL z?W-NtT~2alH;zlB5u96pBqp=&XH->e&2P`fJx-T{c(}j=S3MXB+XG@pHI9rPhp#Bc zWhBSB$e!`;^3AkeVYabzq0~2M;qj@O&vXsm-49^B4SU!dz3kreKlp=%7-#rhxr8+5H0&eC3PDYdLMmVT>=u zvJ2N00+rRbK_jS?HfHF8ZoWDf-C0*|?H5Bk`uz|_-Fr@Q4SPNz_eV!qJE$IPY^{WO z4dVAbiKFa(f--L3LH(#18M~g7DTT7U6)d}-CjF9vutdSO3-p2L<-Y+VhxQk-8I(wB zI-m|ABLo>FMGI(sMr&{K`!imr9NsqnIVh+bZ*;?J5K!Hnusmv?No_>HCWaefhU%** z%RDZ-kfN4vBUWke*)6c*!B>nX%AGjBXk%MuuwQJF=J$ZcH~94Pq1fiL&_;eCypVB(l!7P^BwfgGz#M5E$yO^4Y>I^~CVj@HX&6I%E0H!85f&A! zV;r7u*y<(b193;?E8@$R-V3ZrSVUsc?Yap@Q(Hp)i|w>|CInv8C{`@IkLmV9C2MTR zJ(UH7@(uqN-RAYBjmfq^}p?U{+^Q~y|~*dih>rS+t`lr}oih(&x$1(&)?B-| z2@bQ_Y`RIsy13k0iXNNBd?fgvwuj`SKEVbdzgIJvME0e9Fbb0Srp7~JzTRKMnqvG{ z4u-BT?P~y9@6Yl+CbR)({TXVu;T(?+wNhB!+g#QxaA^Ux`eQTK$t2QEP$!R3-i5qU z6_suors-sdng}!nd`ofm{u6h&p z=Fxgg_K&KSw9OCrBsyFO2R3sJ z?;%a2SK-9IR$V735ir3tB5ZjDIA7YGsCo$76U`0ofArnfmM~MPUW;7d|!?j^h|^?j27_#w&n0X#x4xa zqD30@zSi>im_W3^A5rRaZ#M?Zf?t!L69aByz@f;U~*YPMz9917?B`8b}H=I&p;Ez-X zzx?e#`2(32o7zxwrm+6R+M2m77ADxq0*k6;=s5>Ei_Je5`L6>XbslQMaCrL+3HQxd z&$4qcU8mf`ut(K5(Qdw?y!&M;lU4^?V$O7jNGsNIdvp**xXHh0dKtGL|*X?m@0{i<9Wq*k%jouS}x%g z_n=YgO@cLyZKwJv==|q_FXW>1Z^6m`8>%M{WH>WxvgPrst97I4yIFjdrHJbNnx`+s z9xh)vw9go1#JV9DR*2dwF^&4MV@B!xX{l-0XE3zq#9NTNs2_6MXH-h+$0z#w$XYQ~ zyeZ%A*}+c^r=wm{&8?7-tTi~lWb+8`S!dZSY@Uu;mUafvKs8FQuf!j93~2z966g-I zYKW@%mX=}~%LUD1E1dQ$2#VeOjw~VT()^CBFhR4ppji-f5(GtMis!6HGA(R?g^GO7 zOO$_L8>@d45+wgNXe}r^ANOJBjXvY)>Cw*rILrC|&0rHeFZ5p&h2G5R)kf-4h>`?V z%=eE4HYmfdKkxe;s)=&m_s17d!T<7k-(OjmMLF-=M-_S_o%fZ$h#Y)=7@s&&>xhbP z&A1u2qv}+^VB@jAf&JisZ?594L>xIs$@s)|o|xxdqKNOA7za;lQQL@F#wWE0?cR}A zS`v-rj; zAv}sHJxa!|+O1gT;Am)?xqB=1=T=B9*;~If`u&I_O}JMcV{biVgeo8&7GfP1CSpBN z`5cJAG~>jDV#V|R7^!W~2Hr`9ftQadq;II#s^bF!>bU3~UQ5G%2lJ zMte+$!|TKr&&RGLO&@merB*HyCIWLX-?garjc^_rpVxkYa?Hs=MF-SLz|M-nv0W{K z1`gcN3rT_C@9-=$%kGV6BX<4Lbv-UkV)C9^MEfGo$W5s83TBsOr4GQRZ=1GA&f51F7DP7Gr2%iwk|~ zH$-~rW1kOaeqpmGUzcwC+85ESZuBRKX%d#}dU&edku+0<8qyz!n`dGmBb ziD#MtR)z*&ZDQxgd|&K+TBs_oJiUQG^Kc4>iTXRVaK!({+T)>@v5?_90J4s{X z10~}fhi_55t61^P1UuYy+8t=lSY^*)NWMqGW z!D>(os|0m8GFodt!Ag8i+$^6pn}3k}PtWQM(+L-`%uHu7IwK^$wyiYv_J0l&;Qi7p zbUc>X%?@rZZ1qa>!C6a>#QQhl1xrf*`H+^{Yp?H(#|Ki7dWA8&M&J>OfR72_KVX&c z`GAObwCxSc=C;5#wO!-MAY`&3GKp;KAiYhX1;LvsB){GBp5uZG1G?N`r#mA*(oV6? z94=)2I1Zf(XFZV;+#F~gf6p^y4s&4+J7&dv=^9EE(-91>8gDR%OR)QkFR~KW01L2t zdda6UgMc;6@;S2Og`c8NOVRx%8wMrQO-sCI`VX+K%#$Ua=_l|g&TA>zL{Ou_LCVd7)&ruxfL$o$PhLd^K23qo z0LcwI@ve|vJge*9S)PCThci2%F+p}f8=2dfec174uWy0fd=LCll;Zd|bmcuOibKwu zebf6cjay;F$Noy&=FR1oIq7V7$5W`>m-Y~x5xf<-qV23hho6^bp*gi71ptoeLBjGm zNX!O$J*vI}RNy?a#Ixdh{rNG{zi-mjfhJ-86KGEnSzE;R zJn*EhJ?nMtd62c|2OP(%IiOK3zqUPOVQ5dwf3rRJz#t>H=Zz^-l zAZ*)x{By}{JDxVFd<(2*^$w9kdS=XN@1e=g>Oz5}5fY$O1d_}wKsgCW#mBxN zNImTlnw}hOad^`vL&o+7s|r%+);JzXx`Owbm3@T}KK|TAIe6sc25S%ALF^|K9e1-2 z{^G~3B)j)kRf#!(Xs6C3HTjHdsO{_{%CtPKZ%Lw$`4Ufc6;pi;7HwRZGpK+Uw(yh%zsuKomSJ8gVwXISbM@Uw$D$&Q7dg*t7$z$k>tB+UJU zL8(Rj%PoLu5SYaQOf@iUqraF+y!0?HQ5vXcjwo?`phTv?lm{>q1g0W@87VMT0n7lx z;A87`XetS~lB)X`noP)b49RVR@Sg~Li@=jb5Pqk?cL_Wh1>v6+cyg6??@Ly)3&P(g z@Z@p`&pZ(Dw-6pSm=1iPrKLc2oB8~ee^cBOe?gCce8M`wskr+i-HLrAe99Nw$|gs~ z5!Z5U{ZAuA!I6u+X$M~EyyjY@e3RWMLz39~e+MOhr{*z^N7a!;yRCVrKejLFYaGcABiW)~! zc=_NC>|@kAaDYMMU-Ol?#lZFIU16zz+n|nzs{P~Go&sOrv26s!yOQi)(DWx7E9U;{ z6);NjMw$?!>PBh-^lkwmZ}3jl#pJ#UavQHfgM`4@!_3`SjAK{wfI5`=5~U6^xU+i? zyHCUY7j5U^vJ@_}@U3O&N$h4ms$E!tNJmu1$#(zIs`d0=tDs!sMdX?HivW*+#{+@ z!MqWBLv;J-C)kG?qbo{nWM$tHx-md9RR$yB|EWG-+I#U5s^|WnNicj|5_NLgXfguG z^$;}Py#a4vs7m0~{X)?9Q+%rX{<0F!MJ1lAV;iq9tcX1pvdAjnwKN55Sx7zT9lniu z$Fzq>@mekt{fY`7q$22*JfMibyt!Yo-7j_ur1SL4(8(6nKT-fwkkwsV>3qVLL4|ofQ@3_?=s)1;5~pUqZKBSzCzT46SfY zm@pwS-KrH%{Hk>*;hFPOXAYJ|OLL1#@dKtctR$7bCX@amyk;^W-I&RL(3bzs`NbC( z;3ripE0C%!a#<>B%gZell`hM2{0?X_FCa~KmX@Qk#m=&2mbUv#N-CTcmSSg(Wrnl5 z?J<0rqaX{RbKu98iK<$osw%85T;_z(QV88#r)!lUoK{$iR^x}e_4VoUMRh?&dOC*_ zKP1n^venis!7r)TRMnQ0K%t@a>F9FsGw)I9NQ-68wud7%RbTI1{D!cz;$jQ?P1I>O zx|~VLVe;$p?G-L$FQ%WvuCcf(U4`WrTO^CcQn{4F68sLVvl#EAlclR|b7s$*J>z1_ zskK>>q~wqq$5~dCIic&)%5o>!%;;h%55F;sAI7!dr(ugqoy8~;+Uxw+kEIIygfo7k z+fsyIdq=%YGzN$ARA)F`nZvbAt2nSgc@kT}3{t1GKXuyIJcs&BNM z#|sCT@=_vKvltFjC(oN}o0FFl_{sFpY$tfIKKVu_`; z0u~pZ7GG;L&Vs>KUhcH$@++LRmQrUmq{cJ%lC zc|)zUVilKONGnzIUkFZ079DV|G_A6*y4Yf`D5+#sqW=raOVDl9nHEWtv!bl1)MZ)X zEWs}q<8wCgVs{J41ea8QeSINYFc)6 z*>Y!fl5Qp@-v z%lYLsmJ5rW%jZ=rsdbjS%9fy4G}kFzTWeWTT?zMEZJF!B?;hQ-qn1ara9B z%msb^pZofTfi4|$`CPz!Y+bDZTnX5M{6@fci4Gf$%|`sXFHRm*z*4|O#L``K5&@Ww z1Co`1YjLph7@&$nlrI4DaSSvJvyEOrI`CeLGu8Eg>j7T_YzFKE+y(dr;C?_0##bX| zE>(cdfNLrJ8u*|c>v#6`?WcADeg(J-5I+Gd^#YCrOlt4zODFjN^8nWaRuSyz>+1!7 z(;KLV_yG>XS~2~tzP<&3`vIE(6@2#VHNa-TF920Q{7AEu^mbog5@0D{E?^^IIpBK0 zM!;Qwj{%zg(bxADpaS?EU?bp2tZaMtKn}pQd;9wC1x$Pg`lR%`D33d`rVr3Bfcv}f zkxled{y*{AO6srA(7$MR65zdn`G6Y%*8;vp@N>vV<-b6?0UHmY-%zg6-`6(?X1~50 z{SVj-cr#$)SABi!0FwY;0!#P*yPsDpZ(E~q$@G}$4*8xut>BWV-T`hfm7_#gk zTqDuzaKz(5;97u7CMtz=wSaMIs&|*2_NZfO&nxdO**SLlDb|Rz;p#Ia9w5dwtt86KjG+M z8Oe4S&Ml}bdqT>!A#GPcvk|ggigZbmtRcsS@t^N1B^1!PkAsx)oAU!Lx-E0Hw4SWFDL%4h- zz5q^d#3IQst6}Ev??;r?kMrRy$ z23;cP{sH~z`XExBGZGfXCBtSS)=9Qs2VNsFR%`H1yw=3RLRQDY?&}S)*YNJg$jX5W zlXCH&zATCEY@LC)Xy_Nx=14X$18t7GIxeCB3h^Z0X22XqX$tjK)Q2O1Z`vR1L-IQ* zz^wr;l239VZyoZ&{Z2N@eGIvGAdmT$$5Aud`k(q1;$uY}<*<#%F>VZ%A$*j8kAj)j z$7d(x#-+!e>ZEJ~Q^2PeeBOnxyC3g5y<^PQ8)&%RJRre>p1^2?_Ti_-Sx3Bq*%`YEmjdt3TS=;O>GEGS%8LYbQfgH$DI5o ziV5E#5wvxTQ4vR(jm}AEiHZFbVFyE7(kkujo>G`*8(OlM*(vkq&IYP=g(ah_{pXOcgK z-r-NP0!m|L$YxzA^A*axKxO7=Wtb1f%%a1p zkkd zjLQLU3VQn4+Dy_L`FR7vNczXY_-z4h4KgPKcQxfZ&`Gmso~`*GUhYzqs{##NJ9~&% zE^y^xxMJW+!*DBsD-Of00d5g+FpU7eb-*nE4j_Pg35onL+%Dkq!f+o0mm7xb0nQPI zGho`K00;99)R72WHgNj3jRP(-43`PqrD3={;7FhPvh<7Eq)!b;_IfjLDZq77tzqMv zJkRy|7=*bsmDz|gZ~a1g==DS@lZdG-eFt+i*&>y3pv=1euuL7w zTzcTw*F$4A31#-9%n0(Yv;h?KuZZ9J@qp1AV)8l6pOvC~b5~#Ao8-^#;^l>Z#9Z%` zdGx%5E<>DTi0FIJE0`DH|7+km`OCh(Q6$qc@C?TM8JIgi$vp>O^N`@nl-TfpT4r`Z_cx`1=&aM{3p2b=<&lS)E& zr^E(@{E|Xz2>7MyNP&U*jZ0BM75I=#(jI()sbeez_&UzGL6%w!#&%iq7>(F|=`tF3 z%hF5nMu_R{XM9_hp6&N-T&FA@8fffIz*i|6|0+wn6UG4Z7a1JhlZ|)_G#KwPOLrTMcblbdqwyZIv_0NJl`+P<Nk7IJAL%c38;pDVNssq4 z?lnozQKhe%2yp~|O-x7I4fkS3`nJBCQj1C8z>Qrke|A+xl9;0bh3lWcs=ENzgD z|1e80%SO)-*uW!@=$RqL`k~VHAz=9F5aazrrJsfv*AA8L9tuR5j?lrt44GU9b|+(v zzc)(n$Gr^}K$;8b3&OS-jQFr@C%zqxaHFOhzlfE##tgqZmUM}~&&Go38?nZ(W2FPJ zlqvQ7d34N~i-3L5XnZ_AW=p*B&3LIjp5FJx0}bx%0lQ0-%x;6!5o3GPM5ciEdkiD- z{-XhOFB*-1Gf8h5jonN|$b7!voiTTsq;``LG$>wv70A}b7@tg#HpV^`^ZsDzC4+Hy zf^@*JH4cfVO&`WQE=%nL&qtzn;Q4spFz8t#>luuKYZ8o`W$DobBM>bKK=|3KTP9Qf zvrOo9vJr(k*gNVoU17XNS_VqICyWMMXfCL`Xx{V!ovSf>8=^%&_k z<2|vsRAI#H`&3hJjPbr$=}uBRi8R4zm$FgA|2_Ywf&Zcg#&X`7NgP%QxK6-M0b7zo zWl%R*7@{tZ<1OU8DLMB$j365Jtg8rkg>B0%3$Xj zoP_Y<6#UdNmv=O2cI8hPreXT!}o{`P3}@LVb#`nT0p{wyxF7C z;X~sHjBF0TP$xyYX9TC~6KQS!iz78gKSAWRsi)R*(S%78QpQibsFo#DZ%s{~ zkTN-$qeDtXPQ+oRo~}6v9Z8%NE79)&g+FmpoaBm#H%OX4)0c^pjFRTZLh3yBE*8Yf}XAW6@GzsE_k zq{Rt+ZX8zKU5$E-Mvpb$ossZErJlPZ;eR7lJsJr=ED(?Mxp9aNS{w?+kC4`h_!Npi zO^W0n;}C7McoIsFXc%UnlpiOZAz32gwP+dSLh;xjeM48pLmmouvCy+NADtj_rvS!) zf9mrVhSB1A4pNc$Tmd}s(dM(^d?tqRc`6DY+Gi#{+I%>iPi7dOccbw6T=3E6)8Tw< zVSMPL&ym`72Jj?LN-`Mg9{Sz{*4{8YeMFb=;q!Mo|0aE=gw>nJ@Tb}josAG5X{@eN zyxzg+Pqo7*fR7}9w06XY|8P85iucDmYcu z=5<=@eqwx1wf~{;gF~SQ^KG26QxwQxc&&60&JpyPGdNC!NvR|XeS@Iy3giE@z^}WR z^U>;k8~9O>M_YfsvTh(*xZPG)t%BoZq4+$F>u1Z`Uf0Hj3P51wQvOj-c^C5ACBzs<%zhuUpOO zXy2Hg;b0hvJ}nB~!SLADs$<0^+7qYe&r#_A76m^W6M75U8}5hW;v>s*9`HkS@d(Xf z&%`M7ISij5EfO7gj-W3P_@?d=k3qEy1p2dRXcE%?`%DsUj=spBJbkiLQ6K(zd8&Sv4g8w41&!g$#wEmIpZ36Hle>gpzbyIsg3przoEA)7QC;yZAl!c}1 z*k4K7Dd=+rJv+xo-Umbv`ORXyLp=7-7mG$3kApF>pn5YKIh|&oXED4etOGew@QZ*a zId`qMFzO^xW;6UmW_>DG>SS#>H z1-?qy|7d|XBVa}9$Mb+E`NQMIMT{PPHB6ri1wK4}T_1(NI|}{*!KWvc3rKfT>DdfC z$)oL4YIgOmz^90~hVaLpqk>PAS1>ef>(C13do!wW!>n8%gaS_Mg$AR=s6h3iL;^t{l@M9Ssaa`CN-CLk%4&oZ= zK}zQ73pkMMQTQx~g0GH(UmFGg4#UIWhS|?Cflm>BLyIqQGMBS1tiR3__|7}H;KHn> zWQG@w(Se*O_+IS84aFt@@OA3~!GB#QXR=K2x&e5y2W?+ovxn7!K9jx+0gpCcdJ1^* z|Kancml-{$)&Cu8CV5VMvKSurBlHIIW)F^fSwFT2zj3L+Z-~O@CqdsO6ehy3G-3$n zlNsiJE(D&&U5oIOH;4hYL*TV@2yGm7F+M^F9WbI%k=iv9$RWD*tXagVNer)JAYMzO z@Yx&%{~quZXSMxoB-zs)h2DZdOyeRYOwSbp-x6lG_Xzx=F#0bUUR0(77h&9y{b>6G zT3mAgPxI>VdFB_;hZ*`&p10_@;1idir+)c=tz1orBuN!c_M`|htgDE+OM@b!Y}r{| z{kIF(^AvS+%>%9@#;Q8p$!E9+;wslNf8ey-{K z+I(6+()s!OknZ-@D}YmbYrZO;_Oj9ShJ>s8|Jw!dl@BQXoBekaaN^rg z+aa2spT7J`2PT> zcHR8(f`rsGd=&;WPftb#@K+1qzXP23!{0GkpWl@E-)p^P_*d^k*CPJh)Nq#9mV|5K z63I~k{54(9@Pf)L_qyZuje`9DEr9<6I7H9JM3p1=LgMz34=KLAsQHHG$m_F!Q+r>& zrk*1W{|4Yx&Mm|KKcnFrx_{ArV7h)K;p#s5|NalF@^4;MPpD9XQu%E9SH}Y4^&ySKc23iX!sqi zw;F7{R8Y=u3*eu6Sn>b%7gf1Do;n)-a$CV^KQCQZBwXDm|0f0T?*pEv=RYgR|9c6C zpKSO=e+Ha+o~-wQM-=@v!;XCz@P%YXeg8?osb9bKta|$i4c{ope?yml`^zdL+yAkK zzjZ^wzpcxu7ueyi>HOy&QyGy>Uf%_r=(%I`mzMx1zVZGCuJ=!}9F3ez`d)WX@`po9 zT)4EqdH#|R(fCkQg}6~(I^y67j*Oka=YJ=bxZ%c^)`aMW2(1uX`1Ln=r>dN{`ekRcZtAsZid8Z;6 z;1s{rqM!|;IqvsQfs%L<#MD&QW~kXKcIxLZJHpx976M2Y_O1x$q6S{vu3KXJ`ri4= z)h)bB71B%tz^PF@mH7V7j_Wi;mWsx8Sr3xQ4yPL(psc3=TpUL3+)xZ7kH!U0BqQl5iw+4jjL|FuJpPa zLWi?T?PORcb$F|+X*Cc1b0c(TvZ0MppnH=PMY46ajpnhy=5ArK#BE#Ag@!Dtc2Va# z9Jg}Ywk)Z0CYd&7q(?+vPe?DIPz|IG$;wyJntIT>?m%H#wbrL0L7a}6AI&H2Ry};~ z=DYD4WGB$tfTWUc%fK6iQ7;IF89h!BK17%W#7A)I^BBC23Q3Wv;q10^9Z_ghND`;E z>-SSlDV1&FU!t|!nbwNxzKG&xcOb?Q0%%CqXULNJYcElk-|i0G<8JJCl+vg-6^h=m z6%Gc7!T|%IUZoUb72O$fKA5T62%8ZQE`@AIINGv_`aI%wr&t~$5=HFBFfdWv^&=_= zgN!E*Va5jnhR5%0Y`{vL->eF|v}BD!MD55lBt?_G45D_%14(n^bQnwvg*8VMpC^Mf zJ|g|}f~xRLKZyoXomy%6 z<{?PEq~=M^Rf3bipV#Wpz+o>>Jt9c6$i^D7)s?R`gC5+AaRghreXTSKS|uUcCnsWv zSWO`*Y@kfZ+O234T-*L6P($$Y@KLa>->-*M`0*f5yAPK|fN zs5*}|h8OBC3&$brNZQl@`4uIou%$cReU0;`zUczxayGQX1Co%z^FP5toCSh zPlc?i?D|SyKwFz7X{dz`IOWtjap#GtnwA$m*t7{Eg1JGjML~)#Bd`(L)(`sr@N}m2 zwsh!{3}%YchLWr|aUEfeVCN~gkJ2AWBy6{&3`#;_pN6KAM5l1Gd0?74h2_e0{&7Ra zWJ^v!;G~*fQsubgNpBM#tQ#-;F$^{)4{LDQkGqJ^4goBS%lM>02K`2Y|t$! zV}WL;2KU@%5p(YCZIW(fIFi;)n!rpcm5R8_R!(~xEPj{{7Qgf>DH|$?V?4nJ^86#= zca8+bTbuE)V#Pjc@Zxwh1L}E=RyNrcX(~iMEL6uBbVzejB=giJ=^Ts3?AEN(X8?vak+HA%X*RQiRi8hR?4W26tr=+sL&1lnAKzIS`cY85$Xlm zk!PGgvzJ2#*=5tYu@{x0BF_xt;83o9WCntaI;#1sMQ%tob7Fmx%qeNy!JML(?lZ!M z(hSY)kr4L%II&qC32}(7J{7bcK55;F1I;?p*G%iN?5>TFR$b?7Ozg`!hRH8EZMqLv z!BpYB9F@|_#twlbd6VpebfBdfOE!uWLP}?*a8mK7i$|3zWS8rsoZTA2=F*rk?0Hz_ z?)PE$a>q1Hdzn#AzBXd4 z$PlBng+G+0b;X#|>h*oSt|RJ0FBN2n-_7dq zZ1Mv(r-$M!kF8R4+K;_Mr140l9lpZ{gBWPX{PZrSV9;LHuqCPM&%YcsIgwEg|T;VK25yL*H<^kj#vG-rvMv z8#hV(SmSg0G0vz{6Mq}p*U#rsIlZXyc%Q|)jPmyI{2u%m|8;%C>EAR0j-Nu zqLGK_C*CprxRuwF_$T-jAN%9z;`6n9{-5h-d~W|&k(cl{2?-aUzvYzU4-h`#nD|ct zMm!<<=;Hm(oN98^OZ-z^$?NNQNaEK>A#rhf+dw#{USr3Xx@f;(5}(iga?14T>{I#~ z{yhVq&jWG#o12WOQm&VwKg3P4em+OcsoqA(*)#2bPUExu_`ETve_+As63qI4YT)y^ zWKQY4VDd89X}x6N^Z8{?Zy6Ob-?+@z417N4%;^vAQU4!-k1hJL4^o+Yj&t}dJxz~i zsR#UX{ha<4Fl>3B;`6!br!_w3;{y1ZQ`+xK@?$c2|MYE*&vuCM4R%Om(tXC~bJ%Oo zD~ts#SneNOFPHN)vL);1^V$b5DEwzxG1OzG{qF{H5`VhS`$dJo{am9@@%fp~^Ab%= zKcD~ppvI>-?8$2(`GEU}bp4A4obmPXqUl>ME}0rllzA`e`hS6au5@9Wp|y@5^N-s_ n{flYG?eseLOLhAIAAHnrxL(dkdl&QYAN;$@@vwnlJX-$;V~s1@ diff --git a/driver/ui/view.cpp b/driver/ui/view.cpp new file mode 100644 index 0000000..9ec8dda --- /dev/null +++ b/driver/ui/view.cpp @@ -0,0 +1,58 @@ +#include "view.h" + +WINDOW* View::win = nullptr; + +View::View() +{ + if(!win) + throw std::runtime_error("View::win not initialized, missing context!"); + getmaxyx(win, height, width); // init width and height + keypad(win, TRUE); +} + +void View::setWinContext(WINDOW* win) +{ + View::win = win; +} + +WINDOW* View::getWinContext() +{ + return win; +} + +void View::addCall(std::function call) +{ + calls.push_back(call); +} + +void View::setTitle(std::string title) +{ + this->title = title; +} + +void View::repaint() +{ + // get screen size + struct winsize size; + if (ioctl(0, TIOCGWINSZ, (char *) &size) < 0) + throw std::runtime_error("TIOCGWINSZ error"); + + + start_x = floor((size.ws_col - width) / 2.); + start_y = floor((size.ws_row - height) / 2.); + + mvwin(win, start_y, start_x); + + wclear(win); + + // generic draw + box(win, 0, 0); + int offset_x = (width - title.length()) / 2; + mvwprintw(win, 1, offset_x, "%s", title.c_str()); + + // specific draw + draw(); + + refresh(); + wrefresh(win); +} diff --git a/driver/ui/view.h b/driver/ui/view.h new file mode 100644 index 0000000..8cb620e --- /dev/null +++ b/driver/ui/view.h @@ -0,0 +1,42 @@ +#ifndef VIEW_H +#define VIEW_H + +#include +#include +#include +#include +#include // sudo apt-get install libncurses5-dev +#include +#include + +class View +{ +public: + View(void); + + static void setWinContext(WINDOW* win); + static WINDOW* getWinContext(void); + + virtual void addCall(std::function call); + + void setSize(int width, int height); + void setTitle(std::string title); + + virtual void repaint(void); + + virtual void draw(void) = 0; + virtual std::function keypress(int& key) = 0; + + +protected: + int width, height; + int start_x = 0, start_y = 0; + std::string title; + std::vector> calls; + + constexpr static int KEY_ENT = 10; + + static WINDOW* win; +}; + +#endif // VIEW_H diff --git a/driver/ui/view_info.cpp b/driver/ui/view_info.cpp new file mode 100644 index 0000000..74fa330 --- /dev/null +++ b/driver/ui/view_info.cpp @@ -0,0 +1,33 @@ +#include "view_info.h" + +ViewInfo::ViewInfo() +{ +} + +void ViewInfo::draw() +{ + mvwprintw(win, text_offset_y, text_offset_x, "%s", "hello"); +} + +std::function ViewInfo::keypress(int& key) +{ + std::function ret = nullptr; + switch(key) + { + + case KEY_MOUSE: + { + // http://pronix.linuxdelta.de/C/Linuxprogrammierung/Linuxsystemprogrammieren_C_Kurs_Kapitel10b.shtml + MEVENT event; + if(getmouse(&event) == OK && event.bstate & BUTTON1_CLICKED) + key = -1; // do return from view + break; + } + case KEY_ENT: + key = -1; // do return from view + break; + default: + break; + } + return ret; +} diff --git a/driver/ui/view_info.h b/driver/ui/view_info.h new file mode 100644 index 0000000..22d4f27 --- /dev/null +++ b/driver/ui/view_info.h @@ -0,0 +1,18 @@ +#ifndef VIEW_INFO +#define VIEW_INFO + +#include "view.h" + +class ViewInfo : public View +{ +public: + ViewInfo(void); + virtual void draw(void) override; + virtual std::function keypress(int& key) override; + +private: + constexpr static int text_offset_x = 2; + constexpr static int text_offset_y = 3; +}; + +#endif // VIEW_INFO diff --git a/driver/ui/view_main.cpp b/driver/ui/view_main.cpp new file mode 100644 index 0000000..e1348e4 --- /dev/null +++ b/driver/ui/view_main.cpp @@ -0,0 +1,62 @@ +#include "view_main.h" + +void ViewMain::draw() +{ + + for(size_t i = 0; i < choices.size(); i++) + { + if(selection == i) + wattron(win, A_REVERSE); + mvwprintw(win, i + choice_offset_y, choice_offset_x, "%s", choices[i].c_str()); + if(selection == i) + wattroff(win, A_REVERSE); + } +} + +std::function ViewMain::keypress(int& key) +{ + std::function ret = nullptr; + switch(key) + { + case KEY_UP: + selection = (selection - 1) % choices.size(); + break; + case KEY_DOWN: + selection = (selection + 1) % choices.size(); + break; + case KEY_MOUSE: + { + // http://pronix.linuxdelta.de/C/Linuxprogrammierung/Linuxsystemprogrammieren_C_Kurs_Kapitel10b.shtml + MEVENT event; + bool hit = false; + if(getmouse(&event) == OK && event.bstate & (BUTTON1_CLICKED | BUTTON1_DOUBLE_CLICKED)) + { + size_t column_start = start_x + choice_offset_x; + size_t row_start = start_y + choice_offset_y; + size_t mouse_x = event.x, mouse_y = event.y; + for(size_t i = 0; i < choices.size(); i++) + if(mouse_y == row_start + i && mouse_x >= column_start && mouse_x < column_start + choices[i].length()) + { + if(selection == i || event.bstate & BUTTON1_DOUBLE_CLICKED) + hit = true; + selection = i; + } + } + if(!hit) + break; + + // fall through to next case + __attribute__ ((fallthrough)); + } + case KEY_ENT: + if(selection == choices.size() - 1) // exit + key = -1; // do return from view + else + ret = calls[selection]; + break; + default: + break; + } + repaint(); + return ret; +} diff --git a/driver/ui/view_main.h b/driver/ui/view_main.h new file mode 100644 index 0000000..7792575 --- /dev/null +++ b/driver/ui/view_main.h @@ -0,0 +1,24 @@ +#ifndef VIEW_MAIN_H +#define VIEW_MAIN_H + +#include +#include +#include "view.h" + +class ViewMain : public View +{ +public: + virtual void draw(void) override; + virtual std::function keypress(int& key) override; + +private: + constexpr static int choice_offset_x = 2; + constexpr static int choice_offset_y = 3; + size_t selection = 0; + const std::vector choices = { + "Beobachten", + "Exit" + }; +}; + +#endif // VIEW_MAIN_H