From 41c7fab59bd6ff825f84bb8b886e62dd10fef1cc Mon Sep 17 00:00:00 2001 From: Christoph Herb <52382992+chrishrb@users.noreply.github.com> Date: Wed, 9 Oct 2024 22:49:34 +0200 Subject: [PATCH] improve usability --- .github/logo-1.png | Bin 0 -> 42118 bytes README.md | 2 +- cmd/root.go | 5 +--- pkg/parser.go | 16 ++++++------ pkg/webserver.go | 60 ++++++++++++++++++++++++++++++++++++--------- 5 files changed, 57 insertions(+), 26 deletions(-) create mode 100644 .github/logo-1.png diff --git a/.github/logo-1.png b/.github/logo-1.png new file mode 100644 index 0000000000000000000000000000000000000000..0a545afbab9f5d36d751a5643e0c1d134f839c47 GIT binary patch literal 42118 zcmeAS@N?(olHy`uVBq!ia0y~yV3Yu14mJh`hW5UfJq!#C3dtTpz6=aiY77hwEes65 z7#J8DUNA6}8Za=tN?>5Hn!&&zUNC1@pbY~916z`}y9>jA5L~c#`D6wL2KEw9Usv`Q zT%00Y;>j6ItqcqdjQK@=A&lo2mCs^eXkhSkaSW-r^=5DRoVlTM?f=<5*WB*!udkx0 zs4{U@i@*|dLB_(^*YC7mcl`;waKR);T%+B+7tiSttrm5Ze{@Qf?%$-j)pIbgJw)^^*QESD5CN9c|gc*uU zP27J;flPVK6J(dMWs6CiTI*)Dt9R=@zq-15?Zkb{xU^P0uyFi6QJK5e{Bzrsbzkn3 zc&Dd-{=Ia{F^~9gR?!fHV;d_!Kilzm$-JqTrtX_QaoyxeK^E3l(b4B+UuLgf(8P7j zAZ&eHZs``Y`!B3kt`X^*a%ked=@So~|1~q@`uynV@{s;7reOh&tjQv8b$h3KzI-?N z(ByfuryV-~Ez9sysnN`L@8#_F*qL3r9_h#`+GA*9X6EOybdo;TLr=}6K5Dy{OxbrP z?eZn@NX@0%#(w3&?$;;wduiVEh|dQ(&TT{P?QN@4HodlQ6zi3FnL5-Fvmojo~KLwsI-sY+K zcaG$m&0qUK?%_>#vdRjoc&noA2()b3uL>RbMQ%ig_(VMk+DEokBr zSu$nK=FLxKH2=;GdS)V~*fJ%^>-^^>0#0%k1rGBHk4b*Is#ZO=(Dp1onYOu-Y1z)5k#!%tHVWahT=Z;W%vYppvP_ z@W(v%bCwJehrWx4hF||#WI^;#|*V^7nofd$;2;9|J=&&z#~d+qXZizW-Zp)~s0xv(zM#cgmkrY+*3h;fUAU zbm-yz%D7*_xw)dx-&+fcGJfW3oia()`uv{^n`t}xrEBJ8&f2qjHFsO$0h8h$o;k%b zb~O^;?-cXfoOf26e3G+Y&T&ibZL>db((O-ks+>E>%j{>yeN4jUI_vW}lFKYlJ~;MW zsI&9_%Qtu8?Js?gJ-E@;^}rtHi#KjqXwUVlx1Qzk=g1bP;#$UvdF?JrjX7rAiYyF_ z$4@?}|Nnje#+sj>3-0RZoMuo^SjvCcV1kd@#}9}3A3toDXJbe)lDx4{fah{cX5<8h znCtFpudhk8{e0=M=H1SB@3#4G*|H_1_lrbGK~8|6!FvS{&9l#*Jv(~!YUh96R;PG| zgz9<6TLdNqF*RIDh`D}Lzy7E9pQrlujhVA11SyGdId;t1@5<3wV9~Q~o!+1O|NqKw z%elGe-uV=x54G}691+u63oLlff8TNN?B%45Kki<=dU1F3uBd0>PB)L+Yw`b(Wzba3 z&b(=FnWLV^2MgQf4t?ME-FAtw=hvBYUMeTt zHrsSl$Kttxuk^atN&o&#F1%m+ec`fYZna@voW~?K-PFmseQs|5(>cd@))+ocd3S!v zuK(+or9F~6HbdrR;i`lmffp0{l07tUPE>XmnmadFe(kEPAE_2XKZTOl#Bp3qX8Xz| ze*e2*ubX1afyMoHUBBP&m%n?`@2gxgPv7GMn{=MCJeza4P{!cchQz~ce_s062mO;& zWV!UxgyF!pw>Aqe7r*07w5}<(3H*H8XW8fXw{G3aa;w^-B~ce*GUKtx?y|S5R<8Gq z5$SZZPrY^RY0v>NCx;VpXBVk2;bA!CQuVO)>5pgT`#YK0zc1XiOX_8bRF5Mk`{_*+ zPo^B0*;!!GbM9Q8L>uGnZ5Jw;2=w#MAs+aAXM{~Es``??;-%gp(&MLpKNKDbFI#dzJRsflMA9$S2(WEf2%<3>g{>9cXno6 zR4QL`d~4Ie#Yzc%!X@wS$M>&VwRGWxul;jAmwRijE?(yAxBG*Qzh$=PY>(xaJB}tz z2wJpyHTU+rWzzHNet8-kOORlzx!?Z0azl=Dro|U){z=RyGPP#R@*AsjP3+Kkz@$#h1-I6?W;n#g%=H=(+RUX=Aoc;Rs^OC+V z68&Nxnm6Cw-R-~FU-d&zp;jzGwi}hE7JZkqso3y%?t+^hnm1>eX8YXU_E^||M#T9R`?C{j=4D2u&z@GP^t?u< zVS_-Bk>WPB-IKqUF5T3BevYNF@ulm25~WOO$NOZj%KV$UEH(BlZ?al?!GR6V96QoUhvKj%F^`*ennp~7+iKg|Cq-RdA#t_ z%Mz>I1rMF(Z)|vI&o%KhXJp=+`}Vh!dR!S@4kgap@U}qq`7xiD-L5^GFZ*7el`7#T znyjO>)TC9w$BXlr@85_@$(?x4c(KksfK( z26~}ORy}uT`ml6Lq@v683I7-$p3I&1e4T((&Xk}nshc;={v2{_Q_8Zyb#FQ0Eunt+~ByTUlMnpDCKz{a0(hwFfFEY|FhJ zmKyoP|FVI--qI((o-A(BW%%W?m{W7E+a8-yzvf-=sZ=%2i5^F0JovropuvwNE{oFky#FoS zGC{cZ{%oD4E0TNsAI!OKaO}~t%vr5}}j{~v3n)H_8KxyoZWt_LqJ>B(WzD0bR@e`x! z#TPTqe=OoGXGoZ(wrbTXgX(WNd!F0AKWchCX7Q#r-P26ZWoG(tO-ns!P_#^}_0ZJj z8J&AtT@`%W4b@r%Jnw(EuDPGjRVi-RtF-GwYA_NZK__YVz>POgJr;Tpv0$F;a}b_0qKWvkmXN+dfa5n|hOX;e^oK z*=e#n0@*dQEgqZh`>^Pccqr4Rw#KUl$5t(wQmDC<^_;|A@w>qf=CJ->cD}NY`}Q`* z1A_bhzwMoUe_yRh#`nc;2lo8^_UyA$*$c+gM(P){O)faHCl_p3IwfoSH3iA!MbD4B z=UxBIu!Nz6*@M}`yV1|V%=<){$IY{r{!E*sC#fHtAmq?yIL(YlbIBATgO^Ww3=JAS z-noC~Nzg5!6^~>BPgb-TiX{cLNj?_zui$K!-rANJ@|~lXC3%gMgG9s3Qk!POW0J{i z&*!WZ$m>^Fs=;&Ddhfm2CB&zO#jBOeFWkDds)gh#LG@9~QM%6SKN-}|cf=k5J}x_bM5 zB!z^Ae*KZYz|MPi=Re!SXYTK9u7AxPG+X`)J139g(l1M=#JzJ*S>h1oWTj?)sb`}} z@)^bl9v=Ru=4>#uNMHB7sJZa40S|Wr?=dHaLp_GG3&omTA~*zJX1b++n4_EFp}A9_ zsqoy)DU)7mGVO9ZmD_kYc@F)^gGrOzp3d&1)C_u`3*K=Oti3w=d69h^?xOEHhSaE2s8*%JFT91~C-?bigMeI)wR%qx z_e{;Rjq8-BugunRT++;1WU`Y{WwK`hbH`C-57pv*!j}R(JdP#_=G@yOx&2<1wp{fa z!Ad_Mmt9)=)$sDE--lOROxTupcaKU+`@f9HYfBz1 zT69t{WMb)CxBH3QPb**a9bPa?_Rk-OfA8mBaod0Y;`;Ry#2#@6KA2ItEaBke*Y5)@ zZWYSN*i;Dg+kTUftNjuvV^!j@^n3f^hcSUkeskNNKV9Vf>&At2+w;yQQmxM`D<6lx zuu`d+`dw*hi-^z692JeAl_Eu44tYE^_uVaIj=j0L`QuCfdaiD9eYe=y*n7XLRyOLD zG(UC@T=#F?<_T(Rjs<@ETl2ws*Lmd?hA+?WzwlY>>#p02YbPypn#C<^|6)1Uz2%u3 zBPGY%a8>F@}l)b9xS*e|>!U@1-la-fla1Qsl}54VE*O$G7F) z{xE(2A69?cuOfUh77LD@DV#Is@|Nd6c3rsEKlAjpvz8eztxIgfV@pNT&dzH6|L^_( zw#OB-IHxc^-kIcay|j3zaoV~M6I(pi^S3|Gj8ics;r*zit=%r{5C-7QLT*a$)w4Uw1AX-*|y-+5Wf}k>X-zwegF8`dq(xyz^eMe9EFr z#Y&Bf?N>W}zVsj^?v`~_l=ZqR zu3WqJs7*TW0K5GU#~=Ip_f~&@H2>dA?;BgQr+=D$BuQ{f`IbW_zAj3FJN({P2CbZO zX@Cf2rLM>tcXO$0kn&)dj?O9qGnW4PI(&hY_@3lvg3{#9|E@Em+_#$&o z{E_uUk4LK)s}@!7rw(=Y6km-@SX+Lq$ly>A+{3ih1ofH~Sw-xBndp zstyCcKepg2dwZ+(|DW^!k7%#obLn%G8|Secv(@t^CrVWERPJiHc(8K4eDA#E+FDyN zy_k+xZt+K5+Up#2#F}&4Kbwi3y1X$r*j9a)zwN>aElcg(OB7dUd)NLkW@YjG@N@RE zyXkQkKfmhz(rNepdtSr3UwhWQTyi;csp~iO1PKCPH(!&*MXo%?5SM1Qe4N3GF|z*SDi zxq{?bOyy%U1iqYnvdc1UR>csUz85xTLhWvd$)vm3N@86nzJ?VI#tjE$I%YCBf zPu^x+$sl-wQ!HxFlDf$!7p;EtvBKv0il;K$avv}1);lD=?}Mw)Oe0nYy&PXDZrjPf z-|vtAS;?@_$0+K}uAh^nFCY4+qxsjSw`&W(mE3cg<#WrV&RIT>(TUi=aCy1^@fJ?u zDIdi3nruexTmH=N^OZ-3qHb^NF1E&Hw7J8_;hXTo0#hN?>j zRq_7IFK6WD9_^F0R%kh}^ZC5n$B(?OPTZ$`@SRP?hL6(4&(56WE7atZcAMJ3*l^c+ z+rIN#*2YV<1xjDx@VMINwz%TSME48VuC*1Pvt+-#%(pr7R%HmIqdnW(EXTyfWgi=u z{l$eCKKZPF(05EC_!;+J`76u5{MOjAI(&l+bc9p&^`0*i8 z#JP%_VWMs~5HUPn0s6*in~wX^H2LAII(c_-h_8uUNbG{Nqx^ zAWcn49_8|RUteE;eBAz@p;^w2hI8lqS`H_sRIf00R^*=PvuwfS-2z`&{jX0x9ng2M zP^RGAL=Tk<7cMkN8mB!tV|@O|pP!!#Ki#qHIR1E+=Cx|Q*ad9ITO9npB_)ervHG2L zec7*h>l8&j=AZE9pAe)p)obC>rySqj+-&~(`g-!+U8OfRCbQqVeY@~5ula-gf6wx- z)QSol@ci57V^-~(`}Rla@r;$zS_9P+KnZQVmy4Xa?`Io@`|*xJHgf%szg~|&{{Q>` zzx4u63wG_2N}sorE<`E1vPchx6Vr#}#$|AXb(`T6&iCsfSKT>AV-#k_{hq96NOUZ)lQ|NH&% zL3Vi;clY)p4d%UHT}}S6{LPPLcv)jQMf6SOUd57K{C8Po?AOT|r=L5rr}DEw_B9=! zc{Y+?zkXe@cCBk@XlP#Jswpjhp5Ol*@GD2-*XL```~JmLE6>|IYi?cruVYUv_&{Oy zdsEn6OZczF26zFO^sH>|C`;pwVA``6_8e^fw5xhOUIs6GE; z>MQ)QLPl8K??|WmybjCaX96==AbEri<+4uf%Y3z=5t0&!)l9t|B{XOr^t*zX>y}cP$cRJ3U^D8MW)tu~B{%@jx zv&^-s5GSwBHM38iwp7%0DDMl}(rdWvPlU<>$>bfMPHBUxdnsWxp8(J5zQ-%?PF5^sUbMwcjHDeA~YN=^?7se;F;?jmc~~fU7Ek~v4t&PRPap0U6rQBnmk#2DtC&{Ul0GkJVPnvjJD`o zEOVtK{>#0u*W>%6^L8%nXS)`D;6&`okmv2kdS~xRTXH>5U~$laH#asW`BGXRJ@YvYi!pFxJE?mfHYHGS-sC=+UELRN z-naw@3tL%RU%Ygw>D{}$trs}i9vk?uu`vtTN%X{gTlGZXQu9IGihazQ5<4cY{`;|& z+k@|z>X()A9<9?hnfLfSp6It+u>ZJW`Ma2!H_7scUBzRUWVL!&D}_f~D0jWpJ!R(- zL!;>o3pQ>P?6>=+Ay@Y!@y*T6-kI^WMO8BzM0kYkTIS2kUfOC>)bu)SxtBh}`MJ@* zyp$C`H@8^HI$yW&IN`Q9u;p;#m8;heZ_5>}y=<;%RQlq_yypi?V^fSImt4-Y=xe@q zt!&BV%#!kQ?Spf-U#L3gdtBw9|35w3q9c~>rKP5Izi;19IyFVJ^0<~l0*k`G?W?n& z+xyR{h$@1G`K_(mIk$iGrQS04(&WAWT`|&st*;jMWfQ?(w~dvb(`r6;$Fpp`%}~Yt zT<3HUXKIK}xWm?v$#x>!KKZmh$V-b({2E)kXyUd9m3#ece{lu{e-rwyr?42emnIxakyWNvsb z{_*#hDHcC2y;gSNuG{0_Cv;(UxMAn-+-!O5_ z`ePUWfBa-0tubZofB8FCn)Yd2lF+RFb+7vU(L=4=pBL3s>4~3ZKL7b%PSLFMGb61x z*Lv`O&`7*;MTzy`&aaE66q!E%BXn#_U!$!Z8^enA>yNjJ$906R4%6iH=kAf2`D-1Q z$bC;AWqU4xD`ifKyU&+@Nq%W+v-7@6Ox6Eu3$HJn(!3zQ>5qw4Pxg#TVSyJ{HFQn~ zExQmJ9^1;TzegZ6G_!57K0uH(6EA_`Dq@<)i^#A|S|Ks-lztJ{-zg+%tSpHvw zZS}VUpZCa}ix-;5pfHtRNrX!=#l7e$+qQ}Cr?jrOyvpkldOKK0cD`8213O7hwzwzN zM_13{-fKVMZm?vV|(k<^F?5t{;^4j8@^WxAQ42vV085{oo zF8`Z+g70qtM`GjmCH2*ow@rmQ8w}gFZ8N)5@wnHb=EsIp6<1^@K9S+o+h@moF!kW~ zscn}hw~LC{X@y322Z{cQJyQ}Gc|3JWFN?BsmDkQUkrunw#)pTuM{Z6_{PpE!#I6!e zko{M#Ul(83C)dU%{KQ_v?A((j{%VsWwq}Wf+G@7d-x98`i?t|u!60M4_>a8H3|Ccl zl|4;$+hPtbW)J4vzVGoG`{fU6SGC4Hy62U7;OM+;%LUaRZTLa83TV_@)qC0so)n{r zUmkzUSv1?qdbhn%=A|XN&UF>;oQuPn85uPHrnd;pwtT+)XHY=unokp#1Zkd`VaN>X zI@SGoEU%re^!D4j*Q?lrHA?Nv`JQ&_PwdKNRm<8ZDRO4Zn`-^P;@s0_JzAnTfo*bm zZX2Uw@xlkYc3I7-{dRN5pHHU?pUq5P^~jN-GBNJ%&Dp!xFSOUc%kOqbZN?vWwF6J5 z$M>Dq-!C)Mhpq2%!uffzpicdVGsfo^EZ%D@KF_RL_WPE@s|!n;!%0Twy&%O$1>d)a~_v)R+@NVo^5r(-O}rdGksPa zva@|7{-u7!?CY(p?{~j`y8i%omg*Pl9WT1&*j>wPZ`POYmHT^PbI8e=GQFxF-j(l{ z4v()j71NJf6ZEh2es`UW?MprL&h}*oMXq%fam-rztGvp0wanRP3!U3P{Cd6qF{sD3 ztMqjUtHslAE6UW}-W#?E%wiLk`Tegu@M^lDjapE>`vlYpM72N1f{P0_wzXIex8~lyrgBWn<@z)89{o?=M|=h&kJPW)M#$_pax6_lYb1 zj(^a@xa{U>6ZMt@M>>T!W?WR7Q+6wJ$D2>uAsMl;!q2r1PcdnjQ}8NvHMiArcJA0} zMcv8A9Lu+SS9|$&+2_dkj<*_&8L;CW3XHvq%2T z9fgn0cupU-?vl95#Ky41G#R`s7=8=h3vTZ)vZpG=f&TU41ZD4df-%mn(<7YSFc`eD0t{Jr~2Jai?3IL4O35v z9C=j8ak1LAYLV>R==dInUuye!e_DRkHM-hr#wlDicb)Ewp6h?pw{G3KXdt*nTa$Lktnb+6WI(vI}@8Z9`O|g2*!la9{oS0PpZ*HwMKKT3f`+wYa*Bgwt z-zW#o5uDcFAJf~JC~+disN?wK7w_JMNyVJse8%gct<|kfW!#BZxMyTuUbd89?#}P* z$+Q0_O0;=qZS`|wVE~PjrJbMG`}g;EZFy%6k*4RBUIzrY($l}KKV)=mJJ*f?E6Ysh zhXoQVL;5xb*zeDad%FDX<~^Ps)^*O#%xXR}8ZP_W%X&}KIr!*kw_yMA&pvbSJbF_* zrFDfehjXu(sI%h3D4nY1`~B+0cdd)z^I12e@YlirCm<^;8?ir8H?I1v z>6-Zca=*X5b*|2yUG;2PrWTuxt$deBe9^Dq>#XNL|FZepXp!0ceYt#d-{VTTq>VGW zCa|);YZZ^{5%!2TafS8DEf4>E zK6kwG`P}wv*TQ5hi&)n0|0Oj|KfaGw+U&_s?G}L!x5c%m)L+clcd4fD-Pg$r7VlsA zrM04V-Hu0GPqR;x z>oyB#Et(!*CmH|akoWugEBUYRxcC0INZJySV%zD>W%6_F8f%m; zW{8A_hR(1oR=f9gUHQX1#pjQnRG;4yp>yqcejvx*S!ZV4&~9VgJIByry;{aBwVLzJ z+1c9n>VD^jPTZ4zUhd7kz0x;xqHZMK-Cuk@aG~s5lV2{EK9}j7cB-wl zeRgJMbNSxau`{g8^_Ka}Y}&QU>Z$*N*NXP7=QM@RJYu~kDdqEi@1pazmn{m<8Rp%w z=#e((^PZ;D_}Jpbix&>X#m1oik*xK$#KUd88Ch9QMl)T^X1~>(a`wsBsa8?f{fk>n zgpHp1Sw0m}ZO}P=>U8O)V6Gxn)it*ZFP(P(RXL^GP%%Lwx#<4BT7Gw)pZPr>R~@K6 zwQb$Xl?N@K&uM0tt5A6VP~_2*3x-o{1g!Qyuhd%Qs%x$0H>YFQE-O&IC#>dkfKz?W zf>pa$s+-6<^FMvHN3ZIwKEUf1ql6_R&eyyS7bdWB8FQmv;y z>C+TVi?3TQPw-qW*yr*fW%G^A>HKBy?sS6si4`A@iYM|t4iLLFrzG8MW>yH-#)5}V zOV_^o8C{h-`&j9gbqf=3J)Bq<^)$(cLxN$3Rq3lf<+JT!v)X>zRq4+7^2CBqZ^r{B zn{PLgSDiBbv9riPf_;9X1URvC>+N7LPCIkp&CSh;5^Sqhub!F~^rG6Nv#F=@poYJq zU*zAt54p_y!&tnfGNvzI;{EXF0~e=zlYeGioZ)?-)R^P@mZMXHlFoUmKYVbox#II# z^WUb9?aWm_xeDbcA2TX_6>?^_xj(Dii7jfrZMSxQkvaa^=Kao%0=7y$l8lEXgnN5` z%crX8O%+mnTgng+bp(`dZ*ERczP!x0a;L$s^xuaaTDcV`7a9~kN&yYB9er|gGNVK2 zv1b;}DRF!pzPn=&LZRqAl@h?Ebh5l{H-AQO-Lzas@H63jpj{}95I9d-^{NS%Y@O}UP+LH3}=UWyh?t1m_&{eCoTDI@M?|E)J!z?$d zzl`mN?MuF2pRev{jcQR3>-{oWlH=HvKHa4i6ARzygl#-!>7JXb>u2}#iH+`p2wBhj zkNN9nMNVryE?3P{ey>t}*6i7$#`ZJ)elaaL!RTt@(agC`gL9fH%Swlr*6&?@)a5xc zop`+HVz!6m`>$6y)?RraZvWr%-QMqUTefaxwAf|0=E0mxou>{zG|=1mL?|RY{Cmr~ znOqT1Oib+8|LtnnZq57s>_oZWjR`(y&z0P|pEv8+>N^hpb`JUPRgyM8pOgIV&dyT@ zy?486dR)Bhy8ed0=M#<@Ve4WV@Be*gUhBpFCHuwN)r=)oObh*&|Hog(szzdAfy5ny z2UAxlFD~YPqW;5nRo(LE>9f>8ZPGbKr!-#`@4aK7*WqyY^B%b*J$|;wv-#dz-LWw8 zulnF$dM4r7nVFK;3;!LGSd!NtEHUFyb?`EuK+Xz>{M&p98Bt#K3pl6vE&q5r{-4nI zyXEq;X3w5#z?rs=$-(S(!$ukF7*^-zck`7FeY~^z+{~G>va&ypneS_y|L@E454G|a zGfd92$a?Ln7ifJJp&=3!`e@(#!`pIeejJt$TmQ9A-9X%=y!-uc{rBhx?6opD(5kc8q38>`m3KGqkOm)o3vPcD)XWj_&qR3pNSYJ}=L{=4{H5a}(vBHzu9ooZ;FnwsYTe`{TUxcy8@_Qv7hv zV^D`#Y2u5O67QsSq~FC}{a$zf;KmZs&8kEnBv%*dsG5pQf&VaL)R@OLFq!qB%jaLNkM=Y+JurX7Wmb zm7(>is!vXA*WrFXw_NU=<#QQ^pM1~iOzbojuKCO|$-H6`qAi~6cYwjc?MJr74M$tc z-a{9s$nH!y$TX+oQKzbLWqWp^bX()QcX>~X7gkBEdh_pXetq}syj`4Y*RExl5Z+}! z=iC2`qZ7_~7nutdK`d^nTzFrMaoTcWpaDtGIOS)s!vU@7)V&cyvbR0e5 zvu^e3!|ryU1Q`Nud2f)|exT53-t+azJzxE$Ot=iySbH>Yee*o_{gnwz)n;QwmQ|}( z6?{A@zS`%+KLZ)zIZmBdsyQ6|KSqh|rx8E(3{`ThP;#Id+?l)#-zVvd7m*|3mj{yNE@`Xg^nCOe?$MyXD{QUXW;DyiQ z&-hFVD&szW*ZxwnjYN+pqjBAzraZnqi>xb3A3B}A0xI%Dg-fL({0}Z zUTL!j#`Ayjl)bsJaMF6N)SrE(Q>3@qMokEM#BTqCao?Av`U^K2il0%YQ%;L9_H^acjz;Q{CW=Lr0LuL7&9Y&`+)~+-8s+N8FmndVg&qIrMr?=()c67?< zdc**#02?YlKU+C#NruU)GVZ+@1r`cRre`-S6V!hiT=wjb?!o{L&}_oLpY#7mnwqm$ z6(_$izw2zMb?ze5-?;u|oGx}^R`N3!Jn{Z{I{sf1yL?T6V9M*37hf!IF}$eQB006_ zQPAH2L*3SSJLj>i6xW%wZBxogA)SZ~4z}rgz14dY3v74~Hyo^-ERc5D!~XTbgfmu_(3A)l4UuXJrW2OdqzZSFc)Bd{D6a zJoEg6rPJer{xSUGRXG1e`mNKm2t}#hRjht$?&am?|NcC;fBf(Fd-v+<-CaVdMv_1F z^?RroY0N+Au-|!~NLH!$)z4E-&h=0!IBR-cqj6EO%J*<>^`$NPdvk-A`Mi{P`B9$d z*qVlyFHV#hov=L`Qn>2rjvtS@L33oPHIF{-xMln3yp{v6b=lZRFA=I$v#WCxxG7jvmQ%X%tO&@{=Vq(khw(hO|t|ZmF z%7d3v>Q`R9#=`{NU-SN%&rI%gVG8m(YUvy+JWVgQ%UgeMNap3%UBWC|_uliW-8t1T z%u2RaB`hTz1Kd|8AIqYCGGi2eLZ{NyXlqM!` zYRLQ~@G`(eigkkbj^DSg?`yOF_pzVh*ZY7EerzAVPEy;Ed)w?z)$6rC-sab@7BhPu zkQjAtg@UEP9;Th6bJ6-Kzeu zcN=OaEc2WDisRvX2midS=K{U=zhvC|zV?0a7tSgCj#4}m|H$MD9BpuSYMB3(8e=|(Fa?H4o7lOL?i6NDB1g^VI z8v^hCUSZ!8$;j;RW8HT71}{4$;pSh#!Jaj>wYK{{_U0%2`ttHbiqR^8Ni1hKMjTK% z;<5VGix&YCm(Q9d1)6yO|9k)c?%dnk7#mhC(!F;117x0-RpbxDy!y^@caW` zug9_uKov{NNW$4m)6QY{~1Y>ZMao&ij9L(UtPLPaEgdd^-8# zV}E^5x85#~z^F;W6O0`C&$WIFs}26$8Mi2NWn6wn#sTU4J&jYf!&j{jli9O(gAQn- z0KC4h`g>mLJ1)hL>8$s^PxMi%{+V6mRNCez#q}_NBL$i=R$el}eY%8mF5_7#?tMyl-F?q-^`I`REMAIa(~|i}@OVdK%nQ z_!F~2qCrTeYHg%Z{7cdZ@A z{qGNV>47>O`~Uym5AN5kTBS9W+4cS9&C8s;Z*QCWGDO2ix8{F=nY8p|zPN-Q?im}J z|4z%4{Sxz?C9l9k^8hbf!@;jb(%_%--`Qxd6eP_E|701bx zAln+-9uLogs{RLyG!9BCUz~lN;mb3}FWYW>5a5cuu^~~`=KRZ<4RQThwx854CColN zoqLrDUy*R}JnL_>^YaeAulp|TviRY=74sRMTfP%Hroz*FxODRa8Cw_Morb!lzPt7} zcL`<|FS7IQd#o{EjA3OaYY&xyy92z>ciz#jHoPPg9;jwnSlMjmP zNwCN0b02<_>3zxgl2d?PucCzUH#wUfUKrveGO zvG2iNw%e0HjgXAo+_T1w-Gw5rHOk+tILiCfW1{oSdAyuFr#DTR=8_6t+-kn>BX3Oc zS<{Ra`3<>W%_=WPa-42eTO+IXcQ3cNo=mZ+M~k6uf<*L_s(Jh8{(GNq)cWS0m|94N zM$3UkuH6Oi_kMpg`~Dv_G2N&oRZcKcCOrum9nEPgCQ|8;{$! z_t)FctNG;lRi^3B9%jq5jo+JR-rY9$^sZ%}!^|tR}?3asO`KOhrwF&)W>= z%Cj)+ntZq8_@fWC3#+1;ck-O6u<2X9ZWmYj+)}Y^d3U>_^Y@C*^l{tzR^|3SiKgdL zJYP6>CLQJab2a|2sG84=fTDK0H~}B6H@Ezo;?d{!3y-c zJ=~?YYuBzWF%`aJHJU~}oMNBkon`xZ>Nc#Q{Hb48nC81|tS@7xXZkL|*oMpl5ov&t! zd6{as1&RLfIptjD!#%?=SBbIV@ekdgQ|p4}Uw&!)^OOmD5qhcBM^?N>@^5B1K*gDV3f4}eLBcMs+;^%%>8x=j~`QE>3 zIN`aF&)MrQ!<`pS;Hp&@;so_je*F8szdzXDHnfocrJ$mws?Gi8*E=g~=X6bFVwwDk zYr)}df2U2XGjl#TL)@UJGf&awpo_}i#7itMa+TgGzh3fihh&S>v`>{6T6R2}mHpxB z`a0A6>oR#P>gESG>FoJ zC1-QYx_9leimCZ{6jY)bR)2eAGcWzq&6m&Bk8haQ9ehgW(*D(d?}rr|n5GpcG(2`V zup{r7pi{}TJs0PBdjBy9*_jh5CUZUT<+Ce1XG>#io+!&7d~WxBXY!#;Cn+(@Y5X!4 zpotC!iN8~L-Lq{r-PDPz|68h>@THGuOF`qp_7jX6#T`x;<`kzGNgjDzIH&&K&mB*v zMPImZVS(vxv_E^Vso0WT&uId zVP8wjNeli6)xPPMv1}@ReeJ2~h08B_zhopB=1w@a^1}av*T4ELnCZi2YHGUU#iDLd z*ot1gdbQT+xyV^AwQm=HTPa3q?vuH@aLqdZir!?)CKefXCbh{YD}-J+y^JwnII1qa z^1+cG{=O#`U(~Ssb+P}^t?c!#(b2Q7wZyL2^1n!G_f)3|SAD!XOJ866Dy?KcZ;`i3 z%!!p+OOJHx?_2TDPVD*eBbGv3-QxPkbhqDWs<4^&{btdbxkdNizqbzB^lWk6V|U5q zxC1Ieobo=;PE@d6>D(y3h56-`X$(^itX#kTxc#5Q_6ZjkxmJ1>F4;Tf%qLxDtItxL z>wRaNY1;c3%H%t>P4H3Mn00kkqW-XDdlb=W2Hm%4Pj*~MNi7ydsp7nay46|G*yRR$#6(@RVlui@+ zUgCB1U{ed%(}aR^7cX9H)Q#RY<!7_y=)m9 zXf30k#Y2{s6tv+m5nGzr9c!J*OBn z?#s?66QKBDajBh?g-lp1N8XNyY@oi{tC;~EdoGl-Yuj|~T`%j;wCC>%{y%}oW{4ZS zEQxYD#dGSzL6P&$6HcAE_*<%S-tvx~hL|5eK=U+ezO$yJUt*b^&MWq$L2bF(a~Wx~ z9Eb4m>xBctp*H!)g?77^)$4Y7UCfwpcy7SD|4U=$ z&8++Py~VJsGJzvG?to6rjjP*t6*edscO1GNa>eZycc#v|*Gb>r+^jfXeQ$9{I+s6R zC_{itSD&*~P;s%bS?;YR>poYoxdzOdJ$qx?*;zJ^Ry=fBSa>FF^9-9xqkj+O|2b~` z+I#%5$I_rz|Nm{75%gR;#cb-2zSA~0YquQx6_I#`dxjiO2HP_^z03Pf9jM6vpTMw6 zmaXtb(6MEYEq**;x9@0cW4p0!t%g)Pm*ux9%)g~W&y?(#kj&G0ocO}%nTsnP% z-}0%IMlxziD<{Lx$-np`2|{eoKg5U&@UR&(o=lvn=ukAHjaO4*2}{lT^7fLwI&UU$#_w2_ zc5)N%k3+3*J~H3f*1Ixz*@LFf=h>IIXw7W7dbznhAS39jdP~V9#b5J_`*O^>GfcX^ zzP`SA^=jszUzK+9bAujaG*A5@xn}b0cXv%J85(`mTEpWiJqz~+_&+b|7tUc^v|RB; zspFKzPEBv0On&}&lDFRJ-*Jwc);nD1IHoEw{ei)Q-AtF*dD5CZ`6fpwX!gWEut7O?6T@D3nv+cI)M(rQU&|p-Wpj^;VqnU9vQCYf(K)YV!TDuf?F1pve2tiHR7-%y75%A)9Tw;_EtsycXX#Sb)6;Z=*Yl=#{mEdw zd$>zfJ0$wvubt@BhB{y=zv* zQLR-=r%X8X-XM1KqJupqK9^G%j5VfsOm6Kq+{CS(tJhyJ$`m`?Fptj!4*k~q? zT;&r%Q@*O%_ZKQfcsbb5d!G32&Q6PuM}&VrF@D+Ef3$C@{A89XQ+ECfKRsRl_^Qy= zBG1?T`+F&h_jQ3x`kCkIJ(Y~i3`_>42c5o|&Ge9!mE~wZd?LljOLdv&n(fw!(HK`O3NA3+e&u#7dnLBZ4T)!v3*%0C2gK}=JK?@8n6p-aqT538?Cvwtv%em#t?%bKG@IBAln|s&p-52lPotv&SRdU(1Af=bP zI=dPqGb5%Ql}z5Y&*SC8i_Guey>rtLX?nfOWBKK-=&cdVIt$h>xM<4$h;L%hqr30x zzHj)l?OJ)3QN53@)l&<;YilAG`)C$@lhdzVefgz{S^m8>TDLfl-sv_ z+_JscL(J7biCeekR3KwfN&C9nr;Xg6aqPVoFA?Hjb2&6;)7j@|W-k6w+s?FCmMt_R zI8EP_KYDwfY@dwfqL8B6?eecrq!@uZ2EtFid@pb?U)UJOTlnnE%oVFwpU$40B;h6( zS#Eh(R^!oeOLr47=jdqZpp_x}qtXoRd!__&oj5mb+BC!e1;_U^yxgL5PLg}G%$3(J za;#5Scv>qu*^Fm!PYmyr{V}nLQ6Ry`iGzRNdnYgX1_x(n*;lW!y5iz@+A-brT)X}8 zh5fVrmVdmJy?*8YuS^Fo^3AQ#lrUl|S{wfT?d|1J?E!3S{d7!4SPq{HVJo^8na=n^ z_0J{QH&%rq^ELbrOkcG92xG&wYhkV#%iJZoGxe+*E%)lQc<9IMC^&QbKyuuH8Ou(p zPJXEHk>6J%zIa+tMv(z`5I^s0zXKU2U4@U2iT=IkaPI2-z5Y=*z4iAl3CTNWdFkbs z83mu%d@ZZwwp2t%MNRNq9(u&}y?)%9udf}B1)tAf_}Oi7;F&p=o8KgV`Chl7uvTko z(Dxhjr$s*b5#(k0%=yZJLWKk!?PQKdjtTdxCObrN+rDwiy#Lfq@yi8+x!PjgiJzXF zbpLDDnVEZenJ;Mn4}-?Ey&GAiocEfWC-da*`N%fuWXe3xRoNx2eZ~STH$N7IR#NiBb%|G?$%Xt+2R+VdNu9}H zc)skQ#G-?;Tn=&40<+HSvb7Po?9`w3Vn6R;2VY;``RAuc+XbvMSoER7YVI-V{5==j z%3BpL z+Wu-T{q$=7)x*n~&o)b*X;GWcBA6Wb-2K+nepR;Ozm5le>N>xDD+4Xdo#~^d|1&UO zKX~2F$aBA|gpyT+8Z&2k9hU7{aPhtF?6a$iMD`y4%CIifNHgYG#8DTi%!2zIj2l{~ zY{-$0Jl>cY`JjzaQFYQvk(%7=uim_QBV4JO-sn}(AUWZ|hZ@eqTNDpI{4F#wV^2bA z@xm`({`oBYcW-fu_2GnqyEv&J5h_`$&5St=#Or_|x>w)jFGt}6Vh0fc2771FJ z*K#;<>*d!aqAC&1$r0}?*zDcy+G`OKK$9w=24cC;`2Mg7(6Zo?%(np0II-fRwi zVXaX255NVe^L|2g_7(@!a%jdE^JS3TGz-}q17=keB}h5luq z!Y}ac2hF43*qH32a+7hd116_=;lg6EYUUoXe)Drhrk5vV)LZY*`+;IWtdnk!-_9PU*UdaK5~ zG>l`@!k119raazpqmpaoqrXoJC!F$)I`$XAR8@?>H-NF#QCZh4(yLXeO z%wWFgbBcB8NB$@KxaTgOux+Z}@~M$7Ow0ENH8-W7zPhNV5>%t-`CRya_41F#drs~} zVtmtT^(6eRoS*8qoPA9ie_FZ9bM-*mcXxM--`{I)az6?Qzwrm_iNiED@v zl-2bTGHBg0AxLA1>IF-UqqQ5(}j#3HbVJneXg^ z4-Xulmgu%T6tg(^!94bS!Ih$wZ&G}n7k?JJld~>j4;``r!tv)tMtO;9u+2Tdu z(!amIuYPp=B9E=|&jXFj6@R~8PrO|=pVj`tiHiyA9L>|)xT^{rzjwd9`Ivdfw=VuP z6NQN$GZ=)bA{lg@f{sc{OMgDGv6IhX{WIO?2ZNoaovU)&$FJ0QN$`$psgln5&jMVn zAy*W4ta!0w$;tp_10lU#6EgGijy*d&`}c=s7w$W!-j??I$Je{Lu72M0hikXrJG9Wb z{Zria))jR*wLTsvCP%u;*dIL?`Qq0KlLn^r7D`%`Jp?N$RA_ z;oqlVUztE^p23FGnTk1YBY66gcxlw&T{?$ssRi9*m8RRo(B; zlc_StBlnu;@s~T6lm@=q^ZqwS`{Ay;>%RXhUX!oC|4-5UnmG$LS1)nAeoo>rsCJ$6 z_Se_I7SHm1K`os=e3v*p9t3dD3gQSW&_0*;CI8vfY^F=KEXq@#JdxG@>2jnS*F<+?%lihd=B&8MyYJWE!xXI{fOr%yDh6 z?@wfoeyEMqUdr?Om0F`(>%I>wrn!e7Wq&2CILj+a;%1K6+qZ9PXMAZYkYS(b!SZ~5 zy`A0vpXV2E+ZN`!^^1()C+WY(>;JHW7G*_DTbdzLYL^%_=V5`w+qZ8)JD)&Pm){pI zR#}^|g=3cQY_o?48ks@6!MZo(O1CAhxRB@W&YrYU!tT#Q{>Ojc*V{k(xFaj)S*4uO zOrCAIx7(`U?R4Mxjs3m;j*BewO*u=qW-fSMeAvL}WQx)I`b&$rIcFw)ep+#GhM2*$ zRCS33T-{A6!681&FRQ+K^~#~FGPe2R&!XU!A(3iAwbwq|_{=i#%rxA!L3!Sd0*fBk zZn4C(vrISWc)z`6<*xfv-s8cVsI6S$@im3>U(4z)VEuN8TmQ+${!0;)7!=>S z+asYqw`7u$Zs~EI)c>zy?3en?UGQyXeff?<4}wnFFgjNn{#|PDWZ&)I-#@Ap9NW^F zB9Ue)vANmQiABiZm!6+g&%c>P0&|XRF}QX6_Qk7LLyHXAZ!eip$?_#EZT7O2TAQcq zL^2&V5b?Cs?OVX+w)^`s-`N)~U7ECf75n;Hm4gz_-rn5zDjxH;98P@dzEQ_}ru~tn zNs(e|{_{XHx!P-8^W*%RW*loVn@}WkiRJ$H&q_Vct#vY8T5Q6G-mUxk)ekyJJZ3t! z;v%=~*Q4ITn^&*aKJO;4^RnFFmCNM4J9kEA8vK3Rw(ES$y5RCNub2*gwmCD$QW(^3 zVsh=A<`VhQHajYF!HY^7-`_mSvgGOq18IT6M@%eQryH4%-5A zpX^96pUY>u8w`$tc36RipZcq(_1Q{2sFVXud|kU1CaQSZ)ckm%LQ8B!K@ZCT-eWvp4Ls+X@i6!H z_Exes9ZXAeu)ChO@egP1##hHT>2ODH&pZ42z>4>qb{Q;sy`U}g*Upy}TRK)8KQ~F$ zd&+yq^Tmp%nD1WMq{DpP_B#(xv!j>1Qw4(yfB2b;;zqwBUS9Wcnqt@nT72=aAc8aU zuDCKw!tKNz>-s%Z+CHD#%`i`$p}-)`fy2Rz?HEr%9@B#lHjJma6lcG+zurDi+qPQh zf~>6UUR4R7Cv`>f4J=psPYCnbyjM5>&SSBT`|_p){C{1CiJ){y?FDcC36;NU(eKKVQ;LsMCVT1WoLWw>?R!(bMw_6LG{O_H0H90 zzQ6oBsRy0=5x;{``byT&n*p$TbR0V4zEzf+qZ9T>?}^d_m}V5euEpH@g5&k zCwu<+dA{DwXyzMXr{(V_924$!`}ptse*1i%W~ZVBrA}WWYju1sAK6#?yDKc1KVc4p21!hFU)tlbm`Ki<0Tgt^E2zZ@XXQz?R3h` z)%89w#pv*f8l`l-x7);H3L3fmzl$p_{C#t8wRyuIp~mEg?F*|n>1dz-vakx&#L~Px z^<8+rzf+|XXk+4?oyCa~Zu?~wesxQT3O)Jq=F4|}S*t6@UGz%ppV}k~8I4udZfOl9wXwgFAi&M-)Hio2G-uv%^5&g|>!?2gO7$g`1n>-zNv+b0bP zr-cGx>tZ^$Z8JOCx+a@<*M@Q#_UCho`Gh)M?v=9Fia0(D%3HSf-<{g~;Zk{q?)i#} zSMNu>l)c?0})8uBR z30AgjtUiJdkIgu*#gwL!=q;H(CzP?ZygA8E!l;lsIWFps8 zGm%~MGEBOR&sjJxy*xcC!n*w3k!`uRue^S`=`L^kVnYp;#+XcojqhHHK0LU={^uM& zn~z8KRBK(4&NOJ6z_Kl`Da}ao&F$^^H$Ek3{PA@PoNqjL?%YbXsLsOlIo*bHQ~f12 zGqJT@R9M>c%1*HM(64>#7kT_*)>ZEcc~KkNydZC)uCDHhw9S9NxoVXw2F!@!-@5#A zX2i7C$jxahv)&|4WdHU5#6;yA+j67lT`SSCsP;_0=q^_MF8U_IqZ_=^hGcg;WT)@K+f za~^yua=p}dE{j(_%lwlm7jE91IlXfAdmWRP-L4uOznYenl-=GIdPGgE`|E5^FQ@)F z)2?_LXlQ(4@={oyb$c7{_0qy?k?Dz#j&y4E+P&z%_&M2Wp}@S#XEXOW?JL?cqwz;3 zmt{oe!JubrrwHll>VlS^exBF=N`6W2%FI~?zQUmT^jGxxV|;GWD-0&ht5x)y`{2jx z^YiDqTF4yRmV2Aa>frCoGrlChx@Fk9;_J@^vtKU^@W}Mv6)8K1yT|aH0nl~2e z7%cv>CI5P9=*&M3rZbWj#71y59&YCsU-Lv)v{Pf70N2dQCnC!Z*)Q0BrSX%?mt%=r zZh*F@+E#yCk<61m&$YhPBJlwYExQvch>xWX|KEpOp+aFX3)%KSpI^R-jU7_wbXT?0_x%mp7c~2eov%UH( zyQWQl$=WI1PN|GNPrH)7{=Q`Tn(6VWr6#9V*GoK=n9Stnb&~gR#s&F4xq}Hh?!7a; zmU6YN{HI4M);j%4`y zxV!ByGCGpuJ{cd(o24DTE<`s!Gm!Oj!iy^5PL@}%Utg7&aM;8`?dUvr%j^D4eJu_u zLXO47#!}MKzwbOxIP|AyW7D5AJ%(5BI$i(NBpti2vt`1WuajjjOH5`;J3UQzS)$bA zu6rWSJ(dP_o$;LC;lgWhLqq6eb%Y5AXY1=?GY(p@e*JcZi44Eq znS7~tcW-}Gel_rfi`JBY&=VnwjG$evpwlf}El#~%8{D@mHp7rpae{|R!LOIgpK}_| zJ=CynqS)s~X7&xWzsndb)B;s(y_8!HoSLdV@nnj~!ENW<*H~9|zJK=T^ZECeMSQPc z`z5`+$dt#*zSOuthW%wpRH{Au{HqR*OlmKVsIS$W>GN#jneUrV7HU>X96q$(e3Qgv zrelS3vd%@sesFwQJMq@7TfYRjUT*dHmHo8o+~%^kQB(Qi^yYhPywmSApIhzeM2DCi z1&XUyt(x-Fp`YFvSmd#bb5rT-YkNM6MITrymbCG_c$XQcB52F@({{xy-&(;J zS``*D$6l}BAGaYU$w0$2?bo6^`|IsNRlJ>F?5E=w^!$$Yetve=IW~6gDyM73GrM|k zI+#ja>iBXmV#=N$-)`rxPG)O8?Qnc~gh=P2Syo&#*W3OtW)zIyoOX6b%>2sl7MH{g zBqZFHi17r@+F*58Np-KRT}_0q(t>b?m%m_|zHiOGuD4~|wr959v!s_Wvi(eKnNqp_;!fG)C$-ftTGp+Y74!bCXwL0R z#kF?~&g}a2>zCpD9CI~RpCj9jJ1Q+(eRo%-LQBBJMknq{g^TP?YLf$_4xXE9Jyqd! z+GdVcr&Rg$4Yyc0FE90;zG&C3sMK$h?l+$iObUKHXYu02%;)WX>s)%d<+y`1QP+#cFcUwWCQZ4d>^WKV#{cGO6|OLpFwoNlb31 zWO5xB?wTL8h25&8)KZ4;aA~Z~$0Nd(z5Cgci+I(3_S)^wxTthyj%6^XVC|tv{u~Xb zg5vhoSk9U~`*YvIOu_&W4Q^J`imzPeN zw(i-pdoM&ST6frSS!#NxK72Jf_y51Y5&P?GlQv2i&Fne#S|gq5RpP6IcT4ny1iO!J zsQ8#P)zPQa`^#(=?x&TYf-qu3dZHRP?$+ z$3|xpU<29J=SRY7Z>YKtOmz6)ch=(Iwf2q#a1RwD4EB-Pv+pUUTHzT z_K9cHKHuuS5b?5RFX%Ld%;j^#CJC&*FoS2CbxYm;U1A@vMdvTvyEitrctd&c&f`}& z_rEOtrO3EATlX)=x*3^iT1?L(7Vp|M%lSue)tf7OPI~WOIXO7gr zRNQ4}`W)$q=lbir%xOMv)12OY??HPBKy6St&#Cv0&tj4LDFWJC%FNF9#qxWB@m*P) ziU3uMSF^h2Nv${EH`~76?$ztpzirz8&12uY{PS6!BjUm~VzuRw8;7W_mbY-rM0O{B_TUUc){^^@OC2GZ>E@V=v}xxaaDl;&d>Bv3A)U zPRTp1pfT?0@pX}*makQro*LbHd0hWX`Of?ON0TBprF04{y7Jbc-{*o}&MdWCw{C5y z`ub|mXWsI%^#V-!`+hE4^!>`_In9Tzey?>=5?tEJ>(2fmI_J*$9Z5308r*(p9rMf6#u3Fww!PgGw!B+hKg^Er)4`U*5BKE63EA{L zPPn_Pv~sfiiToROApwjUy_QomUvy6~TxPQN)vK&IrPm^xiz+T}meFcj_OeS<`@+SG z7u72_g>b~oZ?3vwuW=#B_O15|>(*zB%I0+ll>K~oGO)`~J)!2l|BiXn7aZD}@M=$@ z#47UwgIz9JRcez@M#p@y5`D_J_sP{c#h~*jc0QlytRVs_byhxG_gYD)^U2M-M}@YQ z+!LA`x;{d!py1Q%lDYfdC*RvsIm0N`D{j4f)RkRg&euO(^45QPHSOipGf#g>yx39o zr0?C`&o*yvZg%fg7fobqwUJGKc&K&7>ea#b_1#xrVO{uduhTQP3p=Avm|Xnp+?Kdt zt3u1#@b95FxAk)C?Qjsy zX8T#i-t^GuYsS1k|Gw{ckB*ksIoncBhE8X|V;52tx8z4C0??-fma59j6I zV(8~TeYRKO*qnxkGM5EcT;zDRlch4DNkeSi5-Zii1_FHT4=d$@R*Ha*TL2xTvA-#= zj`zqO39l_`8Lt96w%^&dr0?;HTPlC+PKz3}dg+y126YI!94GXxH?O}Oy)EcVhQ`8A z2WRa%njpa@)X5UIKCV|hzDCf&ulwrmfGMBmzD(t4UAKPsZt1&s?^fPQT^O}Q?ncm} zx(m!EUIx!tdQSfANzyX4-SO^S9>dYC)1CTEPg(E^S?ES@McYe|jtieB)pwdz@c zCXcDe8gApFIdLTyT~meQTo(tfiQR41|2sv2?|#DVm`e?lPO2Eqi`2 z`Kpj=sl^KxT+7}FTF+i#v;1#xC$sJBBEtaQW&5ictBQM8^yP zSw~+=CskMPmg;tzc=o^_9iIutZ3fF&e3FxsZ#+2G;^gV`OYhRnn>XJ-(Y|t^=MQ(# zGcFa&=Rdx#ukS5=eNA(7$Dv16jI-z6F_W0G+ruOKk~bs6gE__LG_`wP{kFUG(gZZ# z$M7>&=+sWOOE*riJ3GxN?pr>uitA-bl;!@fg{l({n@{veczJ2*t65*d)R!)>f4s0j zTijV`qJ!03Hw}?P`gI?FMH}?KE@G!Pog&SwY_g-h7deF+Uk#yvE#uNg^2B zo-{CH)cE93C1+qM?VWn|)%urnIcx79e|2^B#}9}3R~JwCxwPC+B4gf>fCbr}CGj_N z%>1Qa@RzJzzxSJzm9_QfcY9?-qEdpqKugir@B5|Yb2((rK}Y#!y*c7~F&%}Ek9~dl zF5*Sa(SPz?--KkGK?R3yMhDNI>HGgIEpie6lJUM$SIz0ENFoQ%&bla)`tpL}^nrL09B2W{BL(5#zV}p%At% zCelQ5-G!|a!lEKb-{i*J*&OY;fBt>v|K^j%c)wgR_2sFQzrSA2vORzJ)6>({5kFZO7*87|%-UHa zu!{c!`w{o=M0^*fU4CKY{(=-8k=`|P)ZYdd~C-8)6TkiVK4VQ3sQJBag%A*QN#9AC4()yjv*6t-U4_GQuWqOATltG1;^g{24cZ<{Giw>{ze# z$Nc}_@+0$wrU0o)oxADbSXL1!YRsFyhg#M zkc+{32Jh_KiZum%CZ@8-9v)_Q^vP;FsL;ZGj`4i)g}Zke zNOay#)|DY#ZHWpZT%vb1*}D&NX&+s)%s1@TMRDDz7GXb&h5VM2<~?2IzGqwh{l4q* z^|cO5nU-a0J<>Y$qW0Cw<)41lvnyx+V&ZN;3|=-UB-!}K=Xzt`!vgMFqt@E{;cFWY zKQvI9$N|z`|9g8qXeYx|HRsNmDk)s9=bQf7ty=N!&6_iqTR46#oA8^jn_KY^^X|zP zTMbncR1Vv0^8DJqOubjuqQGI}_Scu-wi3R){KH55fQyh{opsr} zJ2RKt23?srFL1-*mVf3;14_!uo?XlqDb6t7AQjzVD7#9|m?`c4zFNWCoBXvzl&+}1 ze0O*E=NF1!V`D%^s;~LQ+Ilzof%^=wdvi}LYXaFw?6$jx9cwVV;#kuF!L3&WmF}MnU?9vtYb9Liegxx$9;*o;{&&PM}G zB~B@@O?Y0j?5J(^w;Z2&Haq#tIXS}~9a!3W7&J~He;>#`qsmVHosmh1|8V=@u+@XU?9(gy=%<{UcY+fq%=_?EObxAl$9bS&lR7? z%q)0Pux9=GGdvfS;qd$+4{ zSH?vppP5Fg{+}@WMg669UT{HDl9<@3tZgsqPBj{JXuP-lXG<$tquYUc{(-p7R zZvSNE`l2uCuZ&8L=GlcSS8Dq2)=`;I^(?PL`q>OUaS372C>hV`m<6Bru!W{-s_xpo z`{Jcbm(>5aDv9p$SDNd$dJp@on3W-3SCuR0wXa&Gm8#!waw109>B~YEh9aqBE0@ok zC2q<+t7zB#W~~L*R#vChu`cqt+beCpXzSL{pQ}3Lf|p-daP*|*@kd9yCwi!S+G21i z<;#XV%|^osw^lYPiEwH1>U(Tp=&GQnTE;G*|pLgQ(${V}O^AEl`>2x&3A^%@%YGgvp zp)D3FH3iHDK5X$jHsml1)m@Y~nD|?hG4=*4xA+@f??Yx;I)^GF4W1iU3>3jhh@+YRUA4xKdsd~9I zi|0#~R_qJjB@ZUCOr6IY&2{vT9?SL9hro+{C(NsQ=Twyt(^SZr$FOh%E2n(u)xtHg z+u7#te0aIy)l2md?wC{m7jC>}ZgxxN`Wzg(4XYShc_l>9`c)KBe_dKEnW4ev&JkIhLs^) zudlB^zq@>HQG*z3rt-Y!3zsf+EzMnW)UPl0m#^rhATOQRU0W0$-w$~IGoxkI@8;LL zw6a_ti}t!*ymhN<_xpX)`g=YwfllGfFj+O}oyUaBY#zzCu3VXNe7;Q1(#4rs%k&L% ze}8+MY$l%O6H}oiI7?yaoR~MY$0Q`C-`H3z-SQ(Gyn!k@V$zdnBT@VRdEwiN-o zvccC?UPwGSzvDp@_mx9BAIQ_xn^eIHu&A1s;d zcW7Vj?*s`prHLK8+-#3F7`8dL^F3Ya@Iy=5*8Y{s(v%5BL0VId7*pC)7s({|aPq3j z^!ZH*G83ulm-Dcidu*OUqhgD!TqZ+0aeMyyUZ5qFK?%OA~d|uV74R_)Vx=bPzjc=qo zl!h(Y>7hAwnHXQYAYc2%TeoJZS8Tqyrfbi{GWVN%rsRa55nr5X{P@wwA2R}2xDs#1_-}+@giW(hJ)Ky91ofyVx7Kl&P=De#)C~Y@|)Ano?2ac@oL^)1^?x_ zFlu>cZ5($}N`g>&we#E!G$O?#e!~I_Ev> z-KyC1IWxTS4S1YqJ~!E>;_&5!`rrBo2O8~4Q(F^e9Ai0bu;_5r=Hmj%P6rAm&(~dQ z!mXzK)u-Xxw=&Q~rcSKwETNuBGQ5q(6OzA`%m4NL5M;o^{J!e??vVRALJa%fKX*NI zVvf?)+PAm1X5{9EuKcv?oBMIb23~11(2+J^ruPEo(->0)~J+#jw0E7&T4grH2+^IHszeQ z;ATmVSk{XflZOB$S=={Is@lQY|9V%)@yDQ(k3ubGbA8HiUm7E|O7qbi z<*8nYUte9V><;_BR-&y@*}d<<)$sVx-RoZO;%Gm-D&^oNoh3n5+bpiGQj|~LuH(+}qC0v$o;&iy8V;-q)!vwXUT=n4d#dCEo8yMbk!(x8 zD5^H6wmzt2`dA@)@B6;hiMJDf>~qnRQ0l(t{?7E2y4Ig$37&PcL+f}S<#3j{z3Bg* zs&OmDpwmx$i;7RjHmCFVc*DXbPp~g|z%Xm}Y{n-n0_@C_874P;VYQIpIi|QYWm)E2 zgB9I!tP)q5(!RdB8m5voH(jF5bFyc-#iXjA&t~U8J~2_*OH}o1TzrV*7j=QYw#dc7 z`mcTpE(}=lCTV}rb(imU`S)yeVs;2D4Dgt{et(q4v7)tw^J~A|+*4r8;Ckrm>-hgs zsS7Uk$LX#OFFQZm+<)sf-Tvb6%Q0Oldaq3FE@p_V49Q|RE^pPQwP3}c29~7cWaT~? z%S+3@mo7{{a=1n!M+XB}wU~4;P zXCHIun2GOJjgAJ+7v2J)eF87v+a50z=ychTa#Dz)R@1Qir>({F8(T6bdsSbrWnRDk zpB1Re*tKhyP2-~S@+I$6Hb=&kTy$NrZrwR$PJL-s6R%x-d$pJTi|Jpw(&e$u1UAq>v zQvI@s?D2!3O=4mksVgoOX5Q&6+OlpPpZ9dVv)rB2<9eR@I)5sDaVvZ0QZaXC=9>*) zc(N`fndRS`vprC(b%O9xpKE<5eE9?yM;!BjAmxV+5w^y*5j+bt81&KI`LU-kUuix(%f^Ch@1 za9dkGzp`t5|zPxpcqQ+An!OZ;P~bUvq&)&$DM~Z*FX4X85F4 zQ7YB=a9%^Rpa*C&m*f7gYuiKYI6toDxgw)I?Zoo$J#l*~3U7Xw<7zGV@Zg}0kk(!k z1)-;KuH9eTFZZxfatTI@nfUULRC@ zd;O{CN30=C488lfUtA-2czHH&N(>dCUr~9s% z>$m*lm&^XEePR?@;;LS%ifS(WQXZ>)$@H}6WVMH1F8i}L*!X5xwD{<+oN*vJKi9Fi zSh(c_1BXmDcjkuAF6XP3`4$~+<4tuDOg(bo#+zWX+ zIKwozefp)%r#TbZ3@31gynDWa-#9Z_J8aDX+44J$&z?O~GVL(UXBx-`Hz~_IltGc3d^6W!J}81`Iv zIbp>$Wv45p{YGm1G8PS>1>=Q>m`-@N^M88D^mDSS@2q(*SeqBteX*IDWNGqhbE?yN z&#GT9mw%l5zQ)~k`j^){lbog({kpXGmFVS#0UYV`D%0cyMP`avh4U=kTV7haaP?~L z`k$xcFWkD-W&i)@`4?~AoOyhQbJ?NSFB#P5*BCLZ_}=hGV`kmngYtWKD~e`Jn&0IU zcfE9D_H{j*Z#R-pEqDFCR(|(|O0Pu+ir<;%ubOYO%1J?Ze#iBfGxKh3;e1(Ql^@6Q zT#MoKlV@+9o}MoMSM9~&o%?!oZRg@ z8l`87&fm>HcOqe-_?e4+SMS|hSLDC%*VXmP6Ft5pF4q43r|PHu)l)4_ilFh$j-yE) zYLhFEUo*8m^=#?+zki2ARprrBZ)Ph4F~6eDwd zJeifcn1#}=ShehkxOMAR!Rxi#lkV@UeHB+FtatkLdy^SI1Np8xTdM8&H+##cYuCa| z%*_|?Teocg^RovH%3obs$=2{m@{&8F+fug8wZF?wZ&;J5^E~CnW1TIz(l>L&USC`5 zoSvQ@nfSsf%6lQxt_SJu+*M6d$vhK1SUO#pWMyS5{{4LZ@$33}*|lrep1Qu^w;7jZ z3Ab;>+=KmRCI$Q3iatKx|NgL=`+Q|xHL>oMQ~qz;W|nhzm+0NQcR^<;9J!=iJSD@u z?`eQW%g@ixpBp~DXz9h7qp9k&kVEEp^Ly`tyhA3rEr%`B3pGRzy}P^nOTBgCvcxhVXaaPq*HSKl#~aD!*{|(FeQq=2bl6 z{PTd_-XS=6a?nq2OV3hahxL;$e%6(ek}7z$a``vGu!Ai7bIiKetYhECPU7Q`5vufaf8z&q^jNNg6Brx z%OS0W(^6MH%bV!I!f*RUAg{+zux@$`Pne{mdVrE7r8&35O+9! zp_*x8nM2crEt0XTy_SP+Ftd2S=ku?C)C)hphC9mbSzckYu5W+U*Q`55r*%QgO|!DI zMOW9CmX^k~6f6kbu{bcw;KC=yy{vEl{r&Bomg}u)`TW?Q#Qh%@_XKJt9D4Xc=l*x; zFS23&EB%%RRlM8ze2T7J$P^)s!-^?QJn2=Q_O7u>8zro)tO`D#HGd2`q4Z2<>$>GP zOj(65tw_H#N!9z)j)W%ec=Podzo*@*a9MnD&kNy|zf?9nJ3G65vY(Zv{^VT&U%Z!} z<+#`U?zSNh^ZvhY^9x_E-M(n)QdTF9lJfG^&*%CrPn@B1{Kxqji$3VICe>|!xaPpS z_n%vpT;_bX`Lwd`xq$ie{M*}fO*YIl-y|`Wsm-u#+Us3m=kGHV@$C)KVm-ZSL-BLJ zH+OalGYIhAE|_!1q3`bd|L)woK5q`V5t)DT;?0|#xAXVQYKN`S*nKI=e~WT(&%Ztw zC5y*B#-C=q`*MHRwu2JECKDbOMD*@{r+krH@$p9s(9votLYxc%t^Kz`(@!0;6_5Gd9 zxw*OwRi_1CRFw2S3=r9;o*13D!>{mB&aZ_ZFGb%8;;{K~N5jbN(A{mhEr%0ZoD`=n ze{9ir$;I}3bEd=urv^p?UgkN5U+tL{S{pvpO3Zn_LUJh!^8ra`_iAgo`ahmG$|Rf^ zw#kN_SD(Ig?&UkRifL}T*~dKAUu;ac^7P=0jy>ImW{&2X3|W20HfBHf1GQJQw2dZu zJQ0(4ANxZjRiSkLri{!WcO^le83v5TX=e^h(F_*oKb{yVcIcr&&Hdx^Y^ygEK6V35 zwmiM#q9h3FRVfLUl$R^Z^(#;H;BidDVQg&GV1d|2dvp@qPFGwSQz< zZ$19j9-z?z+WIPOo_8iW>b35H*Y;Izc5<-{shcA~hd<1)sVtg*UYzOas|gzvjCF)M z6Rxk@3!X^WntfeKs#lBAAm*Qt(3>xBY|evrW3F1YDj{;3kW`QtXwCWiy6?LSFL|mf zPV`Wa>eWh|1YVlh32H*#-!FfAd;al8X7&qLC-=Lityt$dsX;B#jmiHy$Nc(#m7o(a zI9i>u)?Jdh=5c3rtD-vZ=>{2P&;@l5n)#(3R{W9Cj8szJD%rxobNGzm;!3%BRj(vV zN=m*yabR#_=zHAw^~X=0(?OYU`W`P>wu~)!na{yHJBvZC0X683pP6Ya*ngCf!Rgx% zIUjDPXG+3s<_an67QB18eEzY`=k2=J=I6I(&hl7(`PGk!9xgu>+qi0zCh50)ss$}M zn4P~*GXB@4=^y@m-yfgpdsJrSQBb$V#KhzQWM@RQ&ITy^|?Iyu7@iZPyL^|GnN1YV2PvZdrm_1}!6#c(#MjMM-L$FWq(Sb9$!{f+ zLO5p_pR-UF+je+)^}h61JH_S{ODyX=cDViHlga){V%;lOOnMckQLN@|HP;QaJy|cd zi(798xc!!ul?6H-WDD>4&l9|sU-3I*>25W7{<_>*YH4!}n6Jl{%dXq^E6e7`f%hMG z-~X$(zN7yS^HZI7LEYj0AJx^hEhBgjA6V$zUhsbJcPEal~9lBwhDh#*-QGvP3F~~ zD$Q4r>tD?iyZ3LWoSHn(iKihzg@NMUl1&zFcPuIR09`Bl+t!*^3XO^+!^78a_bX|82b8G>75{tnq7M|oB8}lDY54o1<$DFg=G?QmuY(I3yEubM4Q%V%-ZjZ!SK;TE1n&mpa#Z&o%8mOr(xAGXMT? zHos07v_9zT_4xVa=ZdzhxOFQ^Cw7;}`aPexHr-sK#j8>BwpFHgXOnw0=l;`ryM31O zP5HGiPMz(^nJdTT>t*i$JXe0<-o14%6oOVxS@cW9X~nWH&1+9wTi-nCi-wfvT*>^M zPsKo|S-sl4Fu>y~yWn?T&NhYj0zV(=^crnhxR9~5wAAA1l;DD|SHqbZKm)H=SBF2| zdOZ#_u~qotfn!NY$qGHz+}zxXr&Gg0$Ed9=T+r+Gn&%{=i~T96QGRK5vEm zcAeR0qpJMnyg2{AaJTP@-CcIj#P`Ow-j|n`Kb}*3?%<(TZo|}9Ay=+meQNnGajGam9hWv)HiwT};F_ z-us^$=AD08+o1V)a!6#>KffjRUnFgl9CnN7mVLc_`ezhq<;42hx7j;Bp99@TvPkV> zfMtff~274 zEaCp+Q{VR%a%wJpZ_%gTA~2^oZI+sUS-EsuqQn=Omz9ALvv(O^*!;nUKi0N&S7~V} z=qRhISC@BO>hZjNnTa!#ZH?R|2bts^Eym0D?(NySuIvxvu^T3T7Y0{0ywhGF>pS&r zbeP`zhT@35Ef@Np|E{h%fBUdS{pIg}_wIXa;(5-<$ADX=ltIn=zV*zRHGPQ^#;pPu zoz@0RzE3?qIqy0HgR-xui(|;k7}EJ6ES(zf(}{(v*<8o-YS17;a`; zO>~>AT)XMQ)vK-SazAwWWUU&k-~HfQwQALbvuRWLoy~J!)YaTS9+^J3_2gvr#Tz#U za`I{Zty@2Tm(q=Gy`W*8yYK7D=R5h_`uVj+_}0PMvu1q&^^`%2;_oX82dGZU^gZE` zyx_HVYm(%7mg9vXyM;fk6g@TXs%x-@ zlG)O8=1nQ$0$nyd;myl7$K-|T8kde;wLWiKz~}qmc`=hDTl-_HY~z_<9y>>+9G6(^ zbzn)*zjq!gpSv?uiY6yYm|eJC5VQQ~m3rn^jh+ni1Qt1SZ1n%}&v@PYy>E6U1#3*n z&9$22d2XKV?c|=Hx4!?FrW@^Zd)wiS5o^q3%+7JQ9-42U``Lye(Wu(zGE0iStIBg3 z&AffL1kq8zo+pZKpptY%l+9K_O$xl zKbZo$7j}kKsn)Y|bGw%$%H}ceNOO)u|k$A?;V!dF{u_aTcU5WbeqBOBe zdm58&RgK~izn4|p&&{zcza1#QBJs!yAp_6_Ztw2ze_MCk=-js4-$K_*C!Vc3_3u2d zS#8wHcR~)^1(N1I|9!gk@xCXg-W>b&Yh}Ac@?R^rs(a;CbyiEKR7XdB)9+R&oShjd zKRHP2AMf6@)?(0}k%yo{6Vxavv--c_LNWKvHP;W%zBJp{t9#Gx-O{J0>$kuE4Qg9Y zNfWs9b7hEvT>s;}?`!qL)mGhD{=z!cy-uk)$59cjjaAKyf(7fr<^{d0y z9@@VDZ!T!Tq^pn7%q_db&oSOUXCB<=_LD6$e_O8h=XK^HIpU{}O`G@rO@ZzEGIQ;J z5%KZ&BcFU=YT#DjT)=r?Hp9Q7Cnusg@AuD3Fe)z7kcvCd@LBTl@|nwSDl9d5@uzBD z|2oU>Hmn?)@nx59{-0q}d#$)%e_6H z?SRes=7YLRt(Yx)AN3fYb5Ie|Ji%jsXF-7V+ch_H!k#8Q(VEZ*I>>nckE8kpf4^RT z{`As?`&HscKA*GZFD)(2$jj3^U7vE>Y|=>;y&Vr0*>z^HoI1c-#Po7uyWFAkb>EDq z-f&-k`Nza(%b)L%SzEZoRi@X?F#q13JsWkV{eS%X-@BY+J2&pCx^5&E|Ag<$oX5xJ z-eFA;Zty)lO}F|>>}0jOkHcD*wX8ic^Nx|;v!3(jzQt`*HeLJvH{jj3;wE2?iC=8; zm%p~GFO>Q7{>;qH-}+1+GW9qyGBZ3r?tgPb{{3&#s~%mg&z<$HHKEAKLgw2Nf%e$* zx967Lxf*A+b*c61{P~8-ZpRDw|9mOD%x`A)?&r3|D={gvp5@&CesJcQ+gp7vAK8+5 z*`V-|OG#PTH*Ze^5sk?cyd~6v0}YIfJsw#4^@YAuxBtoc=%a<*mxcVAy{s=(*DsRY zv}>0XXv^Nbs#h!L9Sys;6?BST<4t8N$@1}@IYZ^gt5>h4NUr={+q6$b(Zy(X>HBr-)>Zdy{H3^g+V`BAScZE{AFgdm zJuNrKJU?n~;t?^4GZ6_9HG&OM9GbO?Qnlyn&x*fWm3#YJj{K=*mX{=^GA(mYcrzjB z-p<5B0}s_R;v6!%_xwn8!d*@T0jt6$blnRki7LHxj_??+GfJ^thP z{U)z^Rg0T&gPP{kPo~+|W?a2`Rfge;jC`|{x4`0{0|HewDmNA7GbVT}-LstcaIL0H zXUyZOx_QifV%M8kxj)=U?&rNMsoM3_?$)-s-D^0OiD~@gXVB0+Wx%uKa^{~e%k5ot z#J~rGU%B>dSKq5CbK4RhObPZo2)dH*>}>Pz548fruP7f#+9(0Kg-b=K)2^wtulmIW z#XEJs-$rc9kre7=u{j?+fB7F_A+;&9U6L!e+}?kw_GRnLT?toYzXo}o|9wT4;AGUmF@alz>oA5HfxwjteI(L4_6g^k3FS}$JW*8p8p)d8(b1C2}R@BJe5=;IEduq$4wFG{XiwwzwOREkR@JoD0$7(=74<%`NR8YgU3 zUb=gdp;?;mHGh% zn%}EXzE|K!fG7$;a^eui;wmDw9vHaGicOEig2+HQ3LRH9WR->Z5Cly^B|_ z+Z?^n#^JSx=^HQkee1V_`t;lzYxABfc3XdoaF`+sJL-7a(Y$I>Bpci^w9+ z>ux3SJ(;sAFV33SG;giumh}0xVzRQbt3J)X)yr^Vb(s9gt*i2R zLUyc(k2f^ZR&;Saz{9M?v4ht1$o639u=KoQJ6H3O{CWiloHBMz4=%x4_f83@7LA!NuQscP3T#;Zk?Y0 z>cw|tY@aU+s64*0B~Plfq=eyx?mwMNp$#9C19yMmb8tN{#X)Ieg44HxzYLYV7n*MI zEWB~wU08)d!+C0kcqU`umCi$__y7C4{$sQJABNc2*bg@RpP!vQ+$tWoV$Q;4nU4-} z>mTVe}p*r&}IcNF@jGsANb>OJDu_bn>$22NRTE z+E{@iHMPO9jp0kA%a#?T^N)F0Ry9AH758F=a5Cdw)+Hb-3xB`ezIgX;={dzyUEI%J z0oM(;nts3EFJFGQR2+2qMYF{WSs$jJKL$sYGLJJIRq|x#lW_%p}mQO;4u;E3_P_|9iduVY>Zq$uBVqmjbFLKlx;8ZRB0DcBMqy zte-J_FK)_O7O~8oJGW9+h5N(bTl?~lFl^~Pve{-{z{Lcw1KV=dR3ACyf783*ed+Bk zy`YsLaY{4&YFCDz6l(e@b#zk(d(#4bwTe9nw*?<eCxWVjmEvMGD_u3ZW(AwE?{)=WQ{GQ}*=Z(IJ( zv?~Q4&c8U$)UbShos|0A5}|22kxjR5MS-sH0d=?jeOYe*b!DiQ4Cmy(a`ig`wWP#F zOt$4NUcH)oPBCag+x4jNiQz(nIZTUR*os)}f45%n(BZ}X|5&HTRT-|^|4;tI zhr|1i=huDKmT-HwH)dy##*g4NYVRXBrw7en7_(s2DlHC0&`r2gC;IGL>2PrI!JUT7 zsvP>mLQG}|8AwS>u3v2=BF>Yp#d)?g)@QaAFQ`ZL?cL3O&>jh$>uqgpDw923LmfDN zNwe+dX!q858MvYL_qT`r^?#HPJv0E_Xt0{eHCABi?Bm5cb9Nofh*kXT!Jawg_O@K- z@Nn_0?Ch!eS|VLfW(G}FTJq4*wONy~{t!!M!Msb8H+3l5&-HV5N_ux^CwROV)QGk; zy?y)k)C5i|!S>60E{fOJ+kctqbU(dkrJQH|zt8hO9=HD|7#kZ4I$h9iy3=usYd>`l z?ppkyf^Biwu4A5mXZu`sDK0kVlegnJy=j7v+SHXxYW)rF%Lc#syI53|F_>xY+`0SS zcki83?74ft&wB?CT?f!qB52ZhmGOcpn-cuzH*!pU7_s5# zj<_%THN8Z-pE7AoOMQAV;amBdhkLFyDxH|_GmG2x=~xGY_LS{GI9PkpC&RFT-~AuX^^`o4-D{x0-fHHA73( zs8^%eQikvGtn76Mr|pH)(roSZx|fA5p;JF=)pZ1MZw9d3&%UOt^(@H_YZp+;tQ zky56wR`2d+E{yoesXTXSoJWVu>!zblP0do5C&qVh86AFT5Tnn1x5c#LoQ&1yGsfU4 zYvZ&t0lXJGe)>OOyiwXsQ&h5Wv|=WnR8}; z4N^*zsA)U-Gt%x!=)wSva}voZSu@%?w`N~|Jg@p4=#boXvsS4KajHx{DVNnEaqISN zLB8+5GTkOOEd1ZUv_bPp{=z2TEW=4YYJ#0E3AfE|-M$?dI`{QH4<>i6w*I;=i+_N| zAVKT>C(NAnbWSPrnu&##7E^s}-&UTR|N6E1-ddZ2hkarpEN2WBtjsL7k(&F5zb&&y zb9U*n@X%1hSr;Z2@a!&se~iEWhckFV^ucX9t2J(Z^Wd5>Q7rE$muu;xBHJte^B2~L zDY6{vm+uE1st>x-hv#s>)-cJvYZv`PknYo5e~A zZJg}oh#J>86fT8Oy=|4qsp2iVp|bKZ3dpUGmeoIGq<>2+XcF z66g{8w$rKp`LE{hms*3&nXZ=#b|1a+8+4XQ?)JNFphHIB>7u)&D5G)DgrH3!t3J!CKB;HO=x|Xwk+!)&hW%>jRsp96{PjPWL04Cm zl$0DOjXl~{t~0A&^l*lt&cXlPUuUbu^OWxNSsKJ(VfS^V|HJ%$&+-G}!0@?&kT7MJz34SI`>H4581Y^2FbLXyjwE!#pZsoJiTS#tKW5VDk3&XhHu=r z_s65|AK$j`2VH2m`qZ-o#)lgZWeDmm{dcWinAcTpa-e5PcwD6@_`Iuy3mK=SE?m2o z^Ga{0_WCa`-D|c8U3D{B6Z4{q>+k*fY{|2hozhE9 z`hPFmFJ8BfO3*Y$|ntMg^IH|@KBaq6FsS5^i`yS-_-!fgo}9=R(}{S{bK~s3=0MLa)?PpE zec$)I?!)?jRlz1wmKl-PUiNIZCSB85uZiL+w4`}w$AEkbz11OXH%tx7!#X@Z&jR6^TG@P&Z{|Q zpv@x@I&D5`&BfMpSzCvG-Tr#l1|RLIUd#V&UcC7Ax|^HRmnFeW$mdclPY4lG>ati`Fot1H#}2sFgC@7vb(iQnGbd}VvtL{xoK zYNV(7?0-`qZ@FJ~h*MqGa+P`1!G?f~32qF(zr9_(dTsCBq^NJ{vDbSG&n3=OeA>*> z>U3jYtu^RE>zup0OwXSe>U9fc)4u4+@>lHXgADFDjZb!5xUXWe;@XQPll=~XMml2Z zem>n9vnWUGVS$9Mt}aKbQ^@VBs!R9m-n{wuZ}oW1vQv%(=a7?W$c? z-=;>`e0!Op67}9f&RcErinVK9jb^rF&bqNZU;f>$*LrJWcZY4Yy;|)e{IMec^@M}T zJ6Qa7^1k?0{B72$YwG6K-wE z6#X|Xu%oL%(lO`uHr**6F8by?b=4|Dv(Hn6j!=YE^@#df~bY>0kFdFBCXu|G%c@%VPPXp6YX1E}JAuw4EwjCd8=N z^4j9u>W3R@pZCdD&x_cS5va;z>lG+ypv2_``dy{%^K65h zf^(qNBp}CE{CL=Y@#4ja*$b6aZS;>Xn||`kwY%U|0zXx*JFt}>Z@wyBVlA&6sQq3!eUernaXudLi$W^n9? z!@A8)$=zKIlBzfMR-axHvF4fd#fUe_JsTx5HF(;(WM(ewwEy#vf5-cMzYCt6m^klx zPDy$B;#FGfel)JMn*AxKs3-SnqJq;h`?o4TzIVy*OmScAItx@09AzB zwwYZ`TC#ez_Ver{rg_h|Ti$$A&o%MS!7D32Yi0gVW)NjG?%GiN{2b@its7?_TKM6) z<#S74we_=GVJEv~piIS^B)vdQQ$a_Oous|Iao1 zxP|NNAqhv<13gA>?(8gfimm<1f9TqME2g?6&f0<<#YSer6$lGX3$bR#TJLs zQd28y>#6sh{EtZY2=55FvGYduU(5WJD<-qtpP4?d^L*{QV$j4e&tV5|Z*GZX$j!cO z?|*k3RrXkZIokN;8}VJcf=+9hx+ZgrG8%Jj%)Y*^^Xk=)`mKk)rSl%{Fh1tc)Yh?T z<*Xl|OTUu)ZQDRg?%Ljk_}sjDwe{7jtR+D!_ZWOjxHadCx<}K0@n5t1++{4}e_d$* zaMHg{=#8J@~!WHu&b}*56KAGk2B#`Vy%h`bRgJUzE|knNGk6$aq9(%p@c_nCx<i^Y*K09D}erw*=+=_YZ*Uug@ zIqP@4^u3>2biGaWx6G+q{u_b{k*5*ca%S#KIC#ff`QnN1Ik)HWpPZWS>TT7WC~;$R zI{&|a@BhoW_sP8Ej7<+IdlRri>Pu0}zaLS*e*adM|H)zZ^Q3>$t1Bx(7c)>@8#aX&yD^LVbIVf3Lm#y=tX$ zsK;zWo#<^m_y7OObl1Gquz^YE^RreXmkGdRNwS{drFVLJFd6u#Uii&KOckg zj+?^LlA&1ROIGe*ZDMO(7a(Ym%yWBN?rJIXjo&_R^mwCo|NH8xY)VCZ zcLOw7&RO!w*>r%KtjBkizMkNtmUw$x*Ch|l&@IQdexfCGRE#M?r;J!F;s)Kp;x15@X-0=rm#p60WRGL5~*7=TCt4)kg zP7m61Mq=N!3kDyLc0DWl1Bz;mX}ZyAdNCEZs+BLE=(jyTJ4_5w2r%4 zwR7@ro2f^&XPB%q5k73NA?vEvoyzBPLACOshZ`2zYothtc8UDl*Pmh1RbsXFl#tE& z)2%a{70=8xW(O@T?E3ln`QdGE<%HJysR(f%Rpw!E;?Qi#_+I;e`pc4UeKU>I<>X!# zu6gicp;AI0vrLYi#d@nrKiX0w-@n_RqmckM0(hMjk&yzWh&5u)BV4p`EAKNyY|4Wqm_E5kBSFCm%eW z9)E26zOTA67F$3E9P~YI*dl+b_@rsi>8mEOB^OPfvex}85^@X)fxZhiZu$(FExVkz#I(V7So^AWqJ)6BO^Q_{2551@> zw?7>*;E`C?xix=JB*^RDm6C$Y($cfrdCyHNI@dc#UqxI{ z=~Kb+!i09Gj7(cdwfXI4IwJ$**oJw}6OZ*s{+M3>Q+!V4vzcA1TWfSyhH!0+;PE>a z%9naBLTh%Z+~)e){+@OHp&gv|A8P(5DYBTKmDw%( zGkV4Kttm{^-`^btt*J}8yQ{PVd^OMi`s(rvw_HSyFxG6!-+j|$>&mrGU7j5g0Y|(S zK4AaA&9S#qK+9FI$$ja!SE?E7o0`NOS?rw^H7W$S_GSb+&%WdmB^_<Y_P z?Q5}B8lp{a{_Jx&A=h@i+W3Ft%a@rmX3lJMS}3qj$y1Y`H-^oTp>1Bs^gVoKFFRkK zYCoD(xcUD5hOgq{GbC=@TbJ5?Y4PV}nfD50EN6HvJv3dxcxqGMlnExhADHEJPB#_p z$OzK$Iq`VnNcg}j>*}A_H9z)247SZk`5Q%W$*Z6GynYVzyI#9`M=}9kt3fz zeLAtU`}uQ|g;N<40`8ucXuH{6YT$C?^&+SFmtLAEC@CbZ?~q_q5#pQ>s6;VPV;%lB&_W1?akb3d^219xSKdb!kX=mT)ve>Uw$ZiW8QN{!LOU5 ztYj~g+V1%fI{A9mGLDV64;+}k{`&T~Pkl;arF%*n-t0FrHGNwDBck@9)w?;%GI`H` z_PESo!h1+F`|4e9m&7!mEz05yhk|(p1GjsZ^6atH(|e;))6}_g?b=^Y&vZUace<{x zu;@aGAfNK8v^^OXQ@FNu^@s>4?c4tSt@X~BkG$+fn-_oJR9m*`=AYej-|yZ$?|Ep8 zfW+LAzI}WvWoEo6V^HF%xgTGW^E^y1yyooD*1ufy6Oz_lT=C4!&CmW)OPMIcBnEru zg(30XQt}oWHtR~BuHI|={N0fwEbK*_?>}NXoKRbvTJz@04_n0}z6>5K!|JDQtu`q1 z?Z_xkNnd!kOuo144GnY+EJKV8tPCuzOf0kw46FBQ;SOya|_V)7#dg^8AB|Y>k{9>z`(%Z>FVdQ&MBb@ E0K1(+cmMzZ literal 0 HcmV?d00001 diff --git a/README.md b/README.md index ba5bd50..d07cc35 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@
diff --git a/cmd/root.go b/cmd/root.go index ad7eb05..c7e1a41 100644 --- a/cmd/root.go +++ b/cmd/root.go @@ -18,10 +18,7 @@ var rootCmd = &cobra.Command{ client := pkg.Client{Dark: dark, OpenBrowser: browser, Port: port} - bytes, err := client.MdToHTML(args[0]) - cobra.CheckErr(err) - - err = client.Serve(bytes) + err := client.Serve(args[0]) cobra.CheckErr(err) }, } diff --git a/pkg/parser.go b/pkg/parser.go index c8a1221..a8807c9 100644 --- a/pkg/parser.go +++ b/pkg/parser.go @@ -2,7 +2,7 @@ package pkg import ( "io" - "os" + "log" "github.com/alecthomas/chroma/v2/quick" "github.com/gomarkdown/markdown" @@ -11,12 +11,7 @@ import ( "github.com/gomarkdown/markdown/parser" ) -func (client *Client) MdToHTML(filename string) ([]byte, error) { - bytes, err := os.ReadFile(filename) - if err != nil { - return nil, err - } - +func (client *Client) MdToHTML(bytes []byte) []byte { extensions := parser.CommonExtensions | parser.AutoHeadingIDs p := parser.NewWithExtensions(extensions) doc := p.Parse(bytes) @@ -25,7 +20,7 @@ func (client *Client) MdToHTML(filename string) ([]byte, error) { opts := html.RendererOptions{Flags: htmlFlags, RenderNodeHook: client.renderHookCodeBlock} renderer := html.NewRenderer(opts) - return markdown.Render(doc, renderer), err + return markdown.Render(doc, renderer) } func (client *Client) renderHookCodeBlock(w io.Writer, node ast.Node, entering bool) (ast.WalkStatus, bool) { @@ -42,7 +37,10 @@ func (client *Client) renderHookCodeBlock(w io.Writer, node ast.Node, entering b style = "github" } - quick.Highlight(w, string(block.Literal), string(block.Info), "html", style) + err := quick.Highlight(w, string(block.Literal), string(block.Info), "html", style) + if err != nil { + log.Println("Error:", err) + } return ast.GoToNext, true } diff --git a/pkg/webserver.go b/pkg/webserver.go index 3c67ae0..15c779f 100644 --- a/pkg/webserver.go +++ b/pkg/webserver.go @@ -1,10 +1,13 @@ package pkg import ( + "bytes" "fmt" "log" "net/http" + "path" "path/filepath" + "regexp" "text/template" ) @@ -13,29 +16,62 @@ type htmlStruct struct { Darkmode bool } -func (client *Client) Serve(htmlContent []byte) error { - // Serve static files - fs := http.FileServer(http.Dir("./static")) - http.Handle("/static/", http.StripPrefix("/static/", fs)) +func (client *Client) Serve(file string) error { + dir := http.Dir("./") + chttp := http.NewServeMux() + chttp.Handle("/", http.FileServer(dir)) + + // Regex for markdown + regex := regexp.MustCompile(`(?i)\.md$`) // Serve website with rendered markdown http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { - err := serveTemplate(w, htmlStruct{Content: string(htmlContent), Darkmode: client.Dark}) - if err != nil { - log.Fatal(err) + if regex.MatchString(r.URL.Path) { + // Open file and convert to html + bytes, err := readToString(dir, r.URL.Path) + htmlContent := client.MdToHTML(bytes) + + // Serve + err = serveTemplate(w, htmlStruct{Content: string(htmlContent), Darkmode: client.Dark}) + if err != nil { + log.Fatal(err) + } + } else { + chttp.ServeHTTP(w, r) } }) - addr := fmt.Sprintf("http://localhost:%d", client.Port) + addr := fmt.Sprintf("http://localhost:%d/", client.Port) fmt.Printf("Starting server: %s\n", addr) - if client.OpenBrowser { - Open(addr) + if file != "" { + addr = path.Join(addr, file) } - http.ListenAndServe(fmt.Sprintf(":%d", client.Port), nil) + if client.OpenBrowser { + err := Open(addr) + if err != nil { + log.Println("Error:", err) + } + } - return nil + err := http.ListenAndServe(fmt.Sprintf(":%d", client.Port), nil) + return err +} + +func readToString(dir http.Dir, filename string) ([]byte, error) { + f, err := dir.Open(filename) + if err != nil { + return nil, err + } + defer f.Close() + + var buf bytes.Buffer + _, err = buf.ReadFrom(f) + if err != nil { + return nil, err + } + return buf.Bytes(), nil } func serveTemplate(w http.ResponseWriter, html htmlStruct) error {