From 39e867bd3560d5f5106c2cdedf17fd3c5db45335 Mon Sep 17 00:00:00 2001 From: Humza Shahid Date: Fri, 25 Oct 2024 21:10:53 +0100 Subject: [PATCH] reduce code duplication in app-update.sml by using higher order function --- fcore/app-update.sml | 199 +++++-------------------------------------- shf | Bin 1176152 -> 1176152 bytes 2 files changed, 22 insertions(+), 177 deletions(-) diff --git a/fcore/app-update.sml b/fcore/app-update.sml index 58e1d9d..e46bf3a 100644 --- a/fcore/app-update.sml +++ b/fcore/app-update.sml @@ -19,13 +19,15 @@ struct (newApp, drawMsg) end - fun moveRight (app: app_type) = + fun moveBackward (app: app_type, fMove) = let val {buffer, windowWidth, windowHeight, startLine, cursorIdx, ...} = app (* move LineGap to cursorIdx, which is necessary for finding newCursorIdx *) val buffer = LineGap.goToIdx (cursorIdx, buffer) - val cursorIdx = Cursor.viL (buffer, cursorIdx) + val cursorIdx = fMove (buffer, cursorIdx) + + (* todo: get new startLine if cursor has moved out of screen *) (* move LineGap to first line displayed on screen, and build new text *) val buffer = LineGap.goToLine (startLine, buffer) @@ -37,13 +39,17 @@ struct (newApp, drawMsg) end - fun moveLeft (app: app_type) = + fun moveFowrards (app: app_type, fMove) = let val {buffer, windowWidth, windowHeight, startLine, cursorIdx, ...} = app + (* move LineGap to cursorIdx, which is necessary for finding newCursorIdx *) val buffer = LineGap.goToIdx (cursorIdx, buffer) - val cursorIdx = Cursor.viH (buffer, cursorIdx) + val cursorIdx = fMove (buffer, cursorIdx) + (* todo: get new startLine if cursor has moved out of screen *) + + (* move LineGap to first line displayed on screen, and build new text *) val buffer = LineGap.goToLine (startLine, buffer) val drawMsg = TextBuilder.build (startLine, cursorIdx, buffer, windowWidth, windowHeight) @@ -53,181 +59,20 @@ struct (newApp, drawMsg) end - fun moveDown (app: app_type) = - let - val {buffer, windowWidth, windowHeight, startLine, cursorIdx, ...} = app - - val buffer = LineGap.goToIdx (cursorIdx, buffer) - val cursorIdx = Cursor.viJ (buffer, cursorIdx) - - val buffer = LineGap.goToLine (startLine, buffer) - val drawMsg = TextBuilder.build - (startLine, cursorIdx, buffer, windowWidth, windowHeight) - - val newApp = AppWith.bufferAndCursorIdx (app, buffer, cursorIdx) - in - (newApp, drawMsg) - end - - fun moveUp (app: app_type) = - let - val {buffer, windowWidth, windowHeight, startLine, cursorIdx, ...} = app - - val buffer = LineGap.goToIdx (cursorIdx, buffer) - val cursorIdx = Cursor.viK (buffer, cursorIdx) - - val buffer = LineGap.goToLine (startLine, buffer) - val drawMsg = TextBuilder.build - (startLine, cursorIdx, buffer, windowWidth, windowHeight) - - val newApp = AppWith.bufferAndCursorIdx (app, buffer, cursorIdx) - in - (newApp, drawMsg) - end - - fun moveToLineStart (app: app_type) = - let - val {buffer, windowWidth, windowHeight, startLine, cursorIdx, ...} = app - - val buffer = LineGap.goToIdx (cursorIdx, buffer) - val cursorIdx = Cursor.vi0 (buffer, cursorIdx) - - val buffer = LineGap.goToLine (startLine, buffer) - val drawMsg = TextBuilder.build - (startLine, cursorIdx, buffer, windowWidth, windowHeight) - - val newApp = AppWith.bufferAndCursorIdx (app, buffer, cursorIdx) - in - (newApp, drawMsg) - end - - fun moveToLineEnd (app: app_type) = - let - val {buffer, windowWidth, windowHeight, startLine, cursorIdx, ...} = app - - val buffer = LineGap.goToIdx (cursorIdx, buffer) - val cursorIdx = Cursor.viDlr (buffer, cursorIdx) - - val buffer = LineGap.goToLine (startLine, buffer) - val drawMsg = TextBuilder.build - (startLine, cursorIdx, buffer, windowWidth, windowHeight) - - val newApp = AppWith.bufferAndCursorIdx (app, buffer, cursorIdx) - in - (newApp, drawMsg) - end - - fun nextWord (app: app_type) = - let - val {buffer, windowWidth, windowHeight, startLine, cursorIdx, ...} = app - - val buffer = LineGap.goToIdx (cursorIdx, buffer) - val cursorIdx = Cursor.nextWord (buffer, cursorIdx) - - val buffer = LineGap.goToLine (startLine, buffer) - val drawMsg = TextBuilder.build - (startLine, cursorIdx, buffer, windowWidth, windowHeight) - - val newApp = AppWith.bufferAndCursorIdx (app, buffer, cursorIdx) - in - (newApp, drawMsg) - end - - fun nextWORD (app: app_type) = - let - val {buffer, windowWidth, windowHeight, startLine, cursorIdx, ...} = app - - val buffer = LineGap.goToIdx (cursorIdx, buffer) - val cursorIdx = Cursor.nextWORD (buffer, cursorIdx) - - val buffer = LineGap.goToLine (startLine, buffer) - val drawMsg = TextBuilder.build - (startLine, cursorIdx, buffer, windowWidth, windowHeight) - - val newApp = AppWith.bufferAndCursorIdx (app, buffer, cursorIdx) - in - (newApp, drawMsg) - end - - fun prevWord (app: app_type) = - let - val {buffer, windowWidth, windowHeight, startLine, cursorIdx, ...} = app - - val buffer = LineGap.goToIdx (cursorIdx, buffer) - val cursorIdx = Cursor.prevWord (buffer, cursorIdx) - - val buffer = LineGap.goToLine (startLine, buffer) - val drawMsg = TextBuilder.build - (startLine, cursorIdx, buffer, windowWidth, windowHeight) - - val newApp = AppWith.bufferAndCursorIdx (app, buffer, cursorIdx) - in - (newApp, drawMsg) - end - - fun prevWORD (app: app_type) = - let - val {buffer, windowWidth, windowHeight, startLine, cursorIdx, ...} = app - - val buffer = LineGap.goToIdx (cursorIdx, buffer) - val cursorIdx = Cursor.prevWORD (buffer, cursorIdx) - - val buffer = LineGap.goToLine (startLine, buffer) - val drawMsg = TextBuilder.build - (startLine, cursorIdx, buffer, windowWidth, windowHeight) - - val newApp = AppWith.bufferAndCursorIdx (app, buffer, cursorIdx) - in - (newApp, drawMsg) - end - - fun endOfWord (app: app_type) = - let - val {buffer, windowWidth, windowHeight, startLine, cursorIdx, ...} = app - - val buffer = LineGap.goToIdx (cursorIdx, buffer) - val cursorIdx = Cursor.endOfWord (buffer, cursorIdx) - - val buffer = LineGap.goToLine (startLine, buffer) - val drawMsg = TextBuilder.build - (startLine, cursorIdx, buffer, windowWidth, windowHeight) - - val newApp = AppWith.bufferAndCursorIdx (app, buffer, cursorIdx) - in - (newApp, drawMsg) - end - - fun endOfWORD (app: app_type) = - let - val {buffer, windowWidth, windowHeight, startLine, cursorIdx, ...} = app - - val buffer = LineGap.goToIdx (cursorIdx, buffer) - val cursorIdx = Cursor.endOfWORD (buffer, cursorIdx) - - val buffer = LineGap.goToLine (startLine, buffer) - val drawMsg = TextBuilder.build - (startLine, cursorIdx, buffer, windowWidth, windowHeight) - - val newApp = AppWith.bufferAndCursorIdx (app, buffer, cursorIdx) - in - (newApp, drawMsg) - end - - fun handleChr (app: app_type, chr) = case chr of - #"h" => moveLeft app - | #"j" => moveDown app - | #"k" => moveUp app - | #"l" => moveRight app - | #"0" => moveToLineStart app - | #"$" => moveToLineEnd app - | #"w" => nextWord app - | #"W" => nextWORD app - | #"b" => prevWord app - | #"B" => prevWORD app - | #"e" => endOfWord app - | #"E" => endOfWORD app + #"h" => moveBackward (app, Cursor.viH) + | #"j" => moveFowrards (app, Cursor.viJ) + | #"k" => moveBackward (app, Cursor.viK) + | #"l" => moveFowrards (app, Cursor.viL) + | #"0" => moveBackward (app, Cursor.vi0) + | #"$" => moveFowrards (app, Cursor.viDlr) + | #"w" => moveFowrards (app, Cursor.nextWord) + | #"W" => moveFowrards (app, Cursor.nextWORD) + | #"b" => moveBackward (app, Cursor.prevWord) + | #"B" => moveBackward (app, Cursor.prevWORD) + | #"e" => moveFowrards (app, Cursor.endOfWord) + | #"E" => moveFowrards (app, Cursor.endOfWORD) | _ => (app, []) fun update (app, msg) = diff --git a/shf b/shf index 57c3a472f9b6819ced8d5108a0af3295b4ee7861..3a8638e601bbd0e780b3581c1236020463f5802b 100755 GIT binary patch delta 25616 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 delta 25435 zcmeHvdsviJ*Y|zjbMKL}GssC47(hW$QBYAaWx!IzvyE1oI^Z!YPpR2S2kc-zk0yq$ zv_~88kouHqnG-&xXy#*E-*xrR>vhp)t=~SZ zz4lsbuf6Y0C(rjgdA{GaAEc01PPdM~QdjU)hao4k<}Rrlam9Lk&B9BP>yjkC>SK%> zT{OI4o@d>bVHFjhWFJX##NDH z=xm5AY3DdrA_+B4qfleV?@m9VrZ`BbakqUVd9cBiJXp?aEsd95%b$}+ic)bjU70Np z=4JXE`7TOV+FW_D#B1!ECl|=ldW);?EAlQ;+F)@>3*=}~st9t$IphRUa#|=SU%tp0 zsRbHi)IvFxGnOut`!dNLL}TBS!|At0@^la`5a^)9Lh~2P$EA%H*T}!gr$t^Zb%}gD za-GF-Y#n5cw^(b|1)~f=879=6!-z}ebP?L6v2V$hT&S#NvQd(NXKzYhRI^ zEb*~#u9V{>sn|kctK>t{CX1_bm0T%CmY{bjK&Z)!w$?}{lzu2fgc>yc`CT~=%CJz@ z8ce<-h>on0*FsL$w6$_NvDIVlx9JhAy{vU^x=nc zj5w7Je<-(*Dz?y-4>8-R)OxGjr*-jgsaw2Yt%;MZHL=3D>I@&D>H|TrjelI)QE8CA z87Bx;AJUSo@^n$4`mJ)f*nvVnlGllQsq`bcqiCYbAIT@eisKx|iZ#)lc|xH*2{t0p z@ojQC=10NX6~_88@TtkM@hmPhht zy+4t&L@VWgBFBsCXu~IRH_0v0&!1qK?NraX7K+^=ca~bm(#RchniL;POLxe91LI$8 z)XbMuu|sYrmQmoR@^hgR+B=TPuZq>{V8F%D@iJOYSLI+R~_9a#G+rmp-xZt9__&mmJ?g7%X*h^tF}>Gqh3`hB^8QrDY#W zT^&arF8#w0zQys8)b&maYt7qKu?tIRpqgEByABhfi`LM^dgy}N+XCpKEJL!D#0iBH zVGk2v7Ykuu3k30MJPrGo93ST0g!?{k;~T_j;+i5KI2ufD$_36 z1jyh{5^64HiG}t!ivB`Q3M!G{YJyN>l;K_y-EG36xdlY}u#SO7?Bz?Evj_HaF_zZumBVA5 zVwJE!vSq9nt8!nKY~#^OCVp-iq%D6Kge@fr)cb2WfvWe&MXD1<3728NB!ep%EQh3{e+OY1w#4phKBID5F~+m?3dqwU+>*7Hw&(V z;yJer=EB7(dxIkXEk~~WO1>b6NL9IX`73!yVEihBC)9mOj~sxXo-3jk56CaJcFt&A z7kfc;b*>a$J^g`B9n}2a@=Kx4r~h2FA8r1(+_SCaDQ_qWy+l=a)@=g6>o&2F0uRa= z!`#!o%!!-oEchjNLRm0#=i`p&oGo>=V;6wZOUq`f&gqO8V)CuRcM&!G+d=EuT$6h9=t#3y*~kQ^R`3EJnY z6Rdbin;?AaJUn4z0;PU~ZQdS3lfID;AkugER*sL2ovPa3-8&88&t(baOMO+VvKNfS zVvVbQmu7w|KQFmA(BR8*H2EBsUuM}P+2ZKU!*XXahrT#0zazGwvE_1C`r8pXMRd>? zN8|y%!Yk_1S;+jI{0q2M-^uSXANcA%Dm)59yYd3I+*B8fRe^GpfzW!cb$oI9uKgd&gx$6gc6p#90Kgzu&dutl`qdd5^0B^Cp z9NaAfT{sXC_|9A5kZgNJ$8f$-&o9G5(bqr9ID#Mx0dl-PcdbS*AWK^sOZH>bWAx zM%JfUEUo%c_D^>V#0dRV(Ja}jXu06&qP_Q)P}Cb?#WCG+%w7;vy#itIZG=FK*!z^c z7>oV&DJTx)y;JgPu|2IijW~u4f9GjrgJ2tflBZ!8n)8#K!O5LJLCkZnshi~A>GDtN zCh2zuo8&r}hx5hzH_5%&-nC6K`m!8D8_vj0r7|mD`EWXXMqVhkrD12~anhBpeCcAS z{H#0=+R6D@{pzsM~_!8PI+Bt+8R-=jm{BWPc9%TH?SokX)MWUIF5$#lL#ZqH{JTq$RW ziG1PvHW#MdFM#tcRe)mJUWv_l3VmIPHIJnZ=dk8Z8gx#6FX$<(p}yvp0=jz~sX-34 zJ?~j`$vTfNo=~%`xC?TU-ga335VWVn zcONecg})#|^R1#13CJJVn9yeMuWFmMzhcG4Q{W|a#Rgx(5PjyUD|T%*UHM6l=3SOt z!jc)L!R?>Df5~E>^ctR+JEm++*C!no?Ma3a`a5|E>PaSeL^C!M_}6I^c2Z}Lki!t3hJ z=6pjPi6?o*$dcpq0J%-9axa%`c6}40*z0mf-!gdWIPTu`#C3T=7cO6Mw3;ZFAcH6{ z2-~uR-i18(;)f{E%d)K93QHgg&%sI%n#uIL>j^-$j8OCbht`xXY4&wD6%Bby(+nzm_%teH{2et*r zF&=GJ(B7Lc=|z-s3zj;MX5Nw$#edVPTS&5((-*hon1oTU2}O2;a6=HH3V(k?D7y7% z=H@>}XKk*3Y5%6Lm?{|deCaW-WdY1ziQiCD}yStyT%;x}R#eu4?yPC3=c$t*Op8jCww>+K))Hf#db z$XTy_SZ_OL5O!1;#BVat;2FAHEhh##SJm6};5LP#YUFkyZfazW`mG_nVspKVu2sve zLM+5Z;a9Yb>!@B)S z&F`YcUCOMJ+sI4nZOv%rUCgjjW&Ew)R!ik~5hqIM@?9*>LC#NPjz#sh3hGgd=(Ltb z)M8KAqBeN7-u5MJua%pjhp%eUpiph#%&)g?q0l;v^^(FdyXV*2iXh=Wm>oBXcJuhQwsdRs60x*n?$PnS91qXLc@^|n~*aSy5Uf96t9t(*`nOslsALNF`*M??l27fUPe z$;q+vAwnK##l_%_4+HN5`V;UgkV#CY3-{!nh?B7ma-vkK_Qsr(>TSnpPJ?1Kn;S6B zJ1XMm$g8()zlw3%Q*whGDZMtAddn<x;mO8@erZKH__U&m zbq{Q=W?Vd*S|34aA{!Z5Hlnd=e{{{WGag+hM9@Z&_3VHoNi+&J9NBA%0l7JZqqHoG z)jUF!XeS+>*H=gsB(d~B_mIXeBWZ-hGLjsF8d*&+iUdXQRG%MH+$~h8iXjz_D7z)r z7wJMTnI*EaY#2SI7}(^%c2^q0^Ch9iflzdSHh>izq_GOX+Kk_w?P>l8I2XUHG>#H7 zFecb{S_n0FAa*{K?%?512)~*|`7(>git}OUTbcPZJ#(2?wbsl-lb9lj&dF?yc%CvD zYbNfe5sbBJvq-FRL<=^An4^NdS78jojRi^VpjU;WGDImm#N$0|r((vkL!r6i!Gh;} zcu74U-eW8&$O)}kknXmD)^J~tX2kh05jO-z7AM)8(~CxyjwJ0~ zY+ql@)|NZ5-gcZOHqi#@+c?Po+aWYLs8xL9DRg~vehM8a`qGC!Y;=;ldE-(|g--Mn zB|qcxrE(|WtXlxLilenA7S^H$cF&j66Cio!Y!LW4lE(Y8wtnrQcU}QUzLmZ#xob3N zy;D#Ajz-Qz!8UF^a`FTLX^s^h9=hdWsFka9F4g$5p1y8Zy>b|FQZGL&-!01ZgO#`g z>umwF#E(Tpm5Egrf1Dcki&Ygq*!^H;v07K_!svB_F^0wjuqJfLkG1Fddze2PEN-HS z{;Zqy@hggUV+6V0_Qj=!@HjNIV*6AMw~V`LhvHo`uo_SVkxC9ZgiZEf`Rj zdjjMhig_xgVvQ_(Vxej(Z_sA63UuGC^F-}g^hW^eh$z`QkhN<*8Uyoqo)4RT-0Sxd z^i&`lEk^Pgw~=qw**a5IAWIB$L;K?)Xr^|~)=uilL2RsaX_jg(j%#%`kxGNucxk`N zN)Rs9+0Oo|HAQoN$j|#PkLXF#maDX@C5xnOO<6$nZ7=8bwunorMVxNRvV!t(?-18U zsA=0tsELcCBoj-PHb^we#1f*XqrJZP-t8MLDoOm6zBXZXhth8**3tLSMb$4SQEM~n zXD&P5sJda8frSp65Z_uUm4nu5mD7PZIw(O>4B}8CvzFJ{5-Bzqm1`+8nA^>fI$H=m z%Q=@6j<4feXbMf8G&7jB5Pwv-9W00HY}e5-7IT~6?o!y=aer!2TYpc*EL{qBQio=Y z`Yg*=GLdb9CAe^j{<|}^@aBU1n;t|{kK-UkE5ntC4|kqTA~gwNGkwRSvD?sWOD^Sy zutYJGHixk8(ixF{$z*XdqUU1r4P`NLOeI>V~9igm^7)ED9S%xSp6`Bj%>TFT^ob5deuVKzS)To z>*B{fp|$Gv=fYS@;1jS+hZ1f>uNF{jIE$Bd&7kWr0#>%M&h|ac3}=(26&lM@QfJ#r zEQ0k3bidcw_i7pe)+6>cjjY!%cx@jz>RWJ|=Y7;)7lBLkbfIQ_oK(0DR=KV>cBw3( zW+a`BU=dtQD;$VY} zF?2`mhu`_O?>5L=5E!;LN0fUR{pf~%Uz8KID2H@FjTZ8jN-Xe1M2u`QN3wC^?=&-# zCC1s8)Y*K{v*O+eWE0?@GBypq)iU)8ZC4~q64U7ds>7%QTfmabl*Yl1H|lJs&g)`@ za(~>ASe2h}j*Zy3c ztviNZMHQ$luA#ta*5Xe|o{M@!16@uNqgm(Br_ZUY!O!@7zhG!Ti9U>G$dF&F@8a(4 zI97(mT|tH4%Hh)CX^I{CTAr%2T|`SKnUCT?U#hZwoRjKo$H1m1BiKU`jtPwu+XL<` zY)dx~#i;C-9FoFMDf$T|XRc7R0;jxuTy~{7gmQ}`rn;@>1-upi3Q|dC3p`=|H0s@s zC77+_>THBgVR6d@XY;~`=vfQv+1&kP&xo=llAXg(6sFh<@vmLa}iy#@BvMT~-VA2PsxjaVwT+b`Gku`Jn^7@=Pj@W6gX& zLg4xdhsHemB90{*oiEjQ5xUaS*@#tND-Dg#>^fUzCEe@5dWSmtHY(=3%7*aU@SGj= zW;`4HCj-f*KjM|qLtC+!))RU1|1_)sha2v;Wd%YZPbIyT)lpFvJ=2Pra1?o^6-;ux zD!aR9o$X}|r!Ui!bgC8WlTw2D4-$nCZd$htVOv75*jzucntoCr(9a|q)SATvm6fRa zag@||v3FBaJF&GokflqVtv3eJm9&A%TSH0b(9vlqX(j#EnstOxOHuiQl5xxCQsS)e8)Y;af2KT!XUc%J*x=e=Aao!s0-v%qN6QmQ@ zab>tW;45&vL?~SOzzW3Ck~S~`XgT99i6xG3``6j(Ab`GT<8gugGggZqazr2Xdc7FDQ{dUq zAv93Ruj0%0HmKjl^zUI-%`U9TSRNxV@gjb z96#sXTH7qNv!!IAlWR~puV#rrz0t3q4p6_7Y8bCvkI zZ`Il!LW4C_-T|EtQLHT3dZX5p_C|5xdMJ)A-I%IG!zjmZwKiYyx%DK#m&$^mBuOac zVXFgePlh|6r}AVL9^~z|i)PU%_$oE;h;a3}+Lc-Owbu6IFO7Ec6V2)PUj&IkRM8Q= zb|tYBYh%S-t1|_;0q$ChJMqo&{=3%2FW^$y%iR}2L~o5ur>8ox_#nqtO(R?DyEuBP z?mdQzQ=k^hPqntWkm>|o?!-D8ElW`&U9ItuQloiAfMDZJv-9Ws9k_sANm12{ewh1v zsFx0>K(+g*CIt>`Kia6;XnG_S2-1jDme|~WxYp)_F})plA1;FMy(0xvKcUo$wI8ar z-N2Z9?CZSLocNaJ#FwdgXBLx?g(?3}PCRWUEp5XRj0JDj+k~E~7Z)p|(9zCt;}+U5 zE|gY&TZerwjehIQGR#J>yxkb*ye_O~5Bu)M$t^{d2N&k)c|y^D?){nnEN$obnJ7pT=dW-g^!IQtE zsx-cSn`>>C&SL!@@Z>m3=>~~*@>*@=jkUJ#D8Cz)-KjM5bF8bim7Ym~-r73f+sl$toz&P6 zmuEd7M?0lbsJp1v_AvUN7>3ONdE-Js`seHPMGw|5Nm$<4s2!@{{Yh!8AhmmaS-mYw z5d8D}gwjZ!fb^olaV%1*nM}P?a9VIKt+fTyoOIUCWLeVKg^Vu9kIOhxkRWIe{Ny^q+&#UFRZZFnP+)nwu5S_QsnqI6klG*ZJSm6~^ z)r&P7y$n689?-GSj@@f~!MN(b={$D_5ASuISJvLc%Lh-;ZzuTWKC=24l-c~FIZlt` zdb7}8v-O6~&Yp(TJ-ieTZ>r9-H1a0W_TDT)LRa7PX0f;=`Hho1a4yXNxr*9mK+m5} zQrE~bsn&LcUdv$d!P^iqL>yD{vAt$s$B|y3T^YF7DpIRP33;`)4>6vOFT^n<3pZ+6 z_H7wHQtqFmY7THD(+(+Z=0kJebBwN@wjq?C$)41X&5uMK#McJs{V4xVFlP4sC-TmenFSGU(%wFBt3kCk ze=5wvI-a0YSvVel#rcV$mh4*F&!=Il!Pw$)FCK$eOl35p4_aQN7f=Hqg^T+@;&+w$ z%$-$h+d;npkc>78dl<=^g?c=U3Uky7mfp3trS#gvY&O0+-hCKTZbk`@u#I8_9e#va z@QUgBBW$c#P3HazHLWkM2;Zg6ec9i{-8yq*KQ>r$2GYiU?4~$T=kChJ-|}pl2ym~G@fxjqpmsZG3nBHI>N7; zO|&(K&6W0f$i4%hf|fLO085o(o6y<;EJw;U(3JsfD(+=R3}pB|<*9scASQ8#dJJN3 zOA#LK^+9Yot|9UVqwd#v`Z!5Llsi$>9YEWLuxx2b9xZ)L5g~FY8oWRs4rMkBEe&Jo zlEqBDhq0AXn5WY1VJuCu2UGHJ78zU_g-3#L=e$%zDVzx6+R>=tz}*H~jxuW34527S z7E+u|WZU2I`%?TY$B%uvQ2I7q7|sTWdnn~mWhI6`$`Zt$^unX;E%8mAnPg+nWBVwv zvED)T({XhYA$PrvE!AS6>o&wTCnLWRC@UBxj9}5pu|~(Sz0o+9#Nj6aZx%q8CE*y-O!c2Ggdy)1y zsYjV)D75F`?$$ukNX+eLh{NY*50-7)@cYO3*@++fQlZpEBSvCw$ZJO`bK5r(N*_h_ zBQdv4I&tyI3Z?c@!2PKA7URj`R6YjRV)bKn z;~q7ZB?P;hsh>!=891R@cNi@ni(6HD1nnCOf6k-U<5)J1FVn`c1g@}^<5;382yV?? z7mfMXvf*@i9MXzlsvpN56`!YJc10Jn>?}>p)u}^v)*G?THy108!;V^IS1wxsYfjID zHC(4PEe2wxqCcI3M=M!B7EL)+Pq=Vc3-+Tp1mhZv~~iwe>3gk zrQ1x$C$RUyo?Zdi3B#6W8lY$ zg}E;xaQV{WNozR8t{sr-Bm=Mz0DVHmYy&T?YqSU7lZE~B^p{Lk1 z$=Q_Br?NcB-IUf&g_cfG*Qen#PRf5)>H5giEWNoqkgug!Z7<>9D7Xc1s|nfiPgm?S ztcfUQ>a}y8#R9d{sgh^e^UYhU=D?eBbFgnj2@8f+Q>U@rCTJHp}?Z6a=hRuK6<=iN1J=SoW%nmxvVo z9RE5MLs`$^o5>m~d=B4C-XBlN^OPWbPL{{Dw zX8ujKI$hs=3}4VPMZ$lb57&f&8$&j5oh1LdYBD4zlCXRy&W z7hZ^1=Ch&vo$RdnY`mG*oCb}cZ2L4yJdT+UeHYRE1+1^MdZZ#@lxBF&)~ey9nPGTk zQn?acEF?MDeDP_@cPM%&aj+L9XD~(QvoPbNK|)b6TsEIOTN4_Y&!Xchn!pvX$>fez zzU9_96QE`AoJn|Ck|*}C_|VFHmXKhH0S~w4&JwZEnT0z15nc{lY%q9|ROlQIUURC< zXGg?eXnTP&`mq8wxiyT%GJ+cm-bf6Wm1nC_xF76n5zF6+L@5}`VL)RS!hlxNhYMjq z&T+K$HN}98ul`R4G*&a9Cp81g@;0DE*OFJ!57H`CAlH%C*m3>}-nDTNn=4APO&_TD zVm2J#m2}CJw?CG;;8*wY@1XxTx;mM_ZGvW>xU_-khgU8 zE@VH8{3$-_28-OWiWL6vB96gI6QL+Cj5cvysxNArxJxdf#eH7SD%a4tvPRbu2Pz z%9HqvHdF4(9VeD=%REO}Dpb#bS&J6zDA*zRgNzabja`S0wL+$)>)7z9*=Wa;CChZ# z))&8L<7Xg#>>GvBK~%qv4Uk^&j5KvUOE=ya4K$m2Lz%RHJ+nx|J-BfL8+qT&)m0na zTg%eOxq%IoOrCl{8)2aMw!M*A+G+uy>_(lk^SsrBdlS59qqTG?MpAYlxT-~_EgMa4ZA4EBu*ivzX zA_TJhyPFV{EK#nk&9FtuJwVs>ku5Aq+7L~5x3Hh36(088f1;CTbkeo<1GI`Eoq1cw4G4$dNoGRQgv~ve6v=!al!QM3^lPE(-{G~)F z{bjk-!x>I%KV`{rc4Qo7(~!sSlM2gb@sJ4`8B1A#p|A`Y3O2OspF-)#IKp-!fM2A- z&y<<%+{v=U!#Wk|!qK)BrMa+Kpa(HTsEO$$l*SwtdK8D#78gd!#YkcoSg;@#iro>Q zdA)}~mw~pzqVcB(E^M8#u@wCon}t_p+DIRN#zw)xG%C3ix=Yrnm8GygvrhT#;+b+= z%G$;9d`~{6egrnshr8gRM@ihR2p;q=B#ocx)UL8^Dm zhuC`%1Bw&rz#h!=6*BKr1RGTb^K2bMua~g`ToY*Aq`e5bHd?h8$6I_pds0ahMek=XA%R-GAJ&QEwb~-}D{Lo`I(6|Y zoDEYc@Bnh;yY$KdrPH+sc#a-V2M(a&=ahd?;g0<`7NJC^4sdFbP9-12z}V;2nk5I} zP1!n?{55pnNvD>6&7wVjrNy%_o))?jUAw<#SH!4>VfWv4{P-On2Jm|jJX}~tUwy-@ z!Tcr(&%O9fk`F$U^P8mbZ`s7Qd5;Q3YE`7d`tNwqu>XNBSJQ@X*?8X!RN>DSdXf1s zdrVBB^25q37azvF!gcBONYRh*} z%-?DIQKf_Eqfo_cotl3X$>KPjI(C%x^(e*(#qi_5JCTygVQg*mT3gH6tpBD~5fuT+-1Dp!@eJI_!y{D(Lb_;`!?Y!8ulZMH$ktk^GEhEzO&|@V3tpgz(Nk?bOmV<2* zR~a`?z**)fHAA#vgH!Vxq2{Ndf&Wm|Pm0j+w3cV$pxB`y)GDYX(I z=psE)$(|95Tn8!<`lR{2^hzVov+Lq%dgKBd5LD^wbzjq#)?Q%yq>46_caiPphW@Lf z=d54ZJ@F--%Dcpli@kJe)MXYKIRX18f2G2&U-*sBIJ_RNxX@sWji;rTahp=yoHkxY zjAmLZSNav4x?yh>zbOM8zX~P4u2X5(kcEuWsf*W;N;lIf={l_TCPn?Ow0r$JPJ#P% zs`u~gfVi0QZzx#84QzLapDI;y16v{t!BS8UH&ZP-cf`( zeH&dL)T!hEmj6TQj;_ z&C(*>{12c~F?^V{#+inFU?2W~DjjqL<M>oze3O~(b$gXSzKv*rV6EdJ{EaKw^cN%867|LIxBG?#^oN*=$tq)I7_5L=U649 zyC)izJES#`;JzEM>;X z;PDBLV+MGo1h3?Oewk-+?PA6_5qm&N6GhZ}Mq?_!)COhK%*%SEMlr9^zvJzU#M6Y9 zg+YDp-%8Gx-BU4Zi^3)kU}tsA8CCcWZD?YQiLzUf7x1p|<>im8`@8yvDw-JMqlS7_ zx$r=he^IQDk$)f3gr4MMd|Lae6Gb!teDIA_o!tRn<5pZNke^G`Qw^-6zZviOEVwa``brK*~EJS$Qzd9V_mOP&aNIl%Y> zMA6#M3j80}ePe19VT`EqcY0St!*c@v5U)lq~9ui$qCgY<<{ErP>v%-w~L?rB8Be=#~ zBO{E_{fc2;CMk_r(K zt5qtwGfWDxTBQm)8|UM?M5SDDU5wGnWl&aEW4eeCYVM}=ur>_~i|kdUQo9)!^K;Uhlce?0w42j7r62EwL8=n;F&FnXjzaQ%p*K1y^Kb`efIFHtXBaz6 zMIP?G4C6{%t*@{eEzLC-vc#xsAmLdSzX!Ja<9`Zb+$A>exgF1`8DhjkeQE?z*irw| zp3U_Jp|C9#XBpRpTDRXLUcVAQ6}T^V8TJfiGg!wz>t!%?Bkr|{X^4Rp&OBw@T|LYF=@?)ruuzo0&+ zW4ah>uHq5L+kJ%)VTuqU!^7~P<#KLWnNgBU6Q<`j_@@Dl?2bK4z8> zQVGl<;JNtGrmo3P8UGO54Bv!6X%Lh8phV)fEY{w>@Wq)zi1Pc44u$)M3n4KU!;fz` zo;KpA34VO=$#ir8+HT7M>df|UMMHByDm>EwG&?iUKLB4_V+Z)R_=gaxhtReD{=sUMF4^cYWDvTzmJJ}Fzkes1l7r#P_yGT?GW*f> zLFnos-hn>6Ods@z=$rbZ=j%EC(PTB6WSTL+e;Vx`1YX1-|A3W)(31&bQKv!vVYKL~ zIfzeFAtN|1g0>CDf67poi|iN;u0RWtXA>L80 zBKu%}3ps~iprM1I6U$)#bgr=g8ac#2hdSjzM$=WZOfL_C78Q}_4fLO(k{CRWPfgX$ z&Y}LBnlyhov#-GaIkj@XR$g-Lea!z?p9QZz{D^}8MdbqFFB(`IcY*NN3V`wdQUUn* zf29D*_5(&feXE1KMi(z;Jx1PbPc}bfvddXcn$9UlRkEAm6znP8tm}E z!@Oa$2A6r@d~djg1`B8O&bNER?KC*s16O#%&uQ=?4{W~aC0dvUAN9bQ-tbfnHl5YS zp6Ly@(cqyTxY!$x(consxZE4g*2nh1;w>-HCTMWP&-&OY-ta^Xe%u4+dc#j?u+sw< zdc(~$*zJM$dc!^%Z23hWyUH8xqrr9$9Qz+H$&>W4J@7DZxTOYP^1%7t@IxBh#;uRN z-5Y*dgQs}l3U4@3gEx6#^B-QKjnl{Wz?t5#Q6IZPAA6=ZtTF{*h6gV8hAmp_Z63JX z8y=&d5j-ht%&u7v-qzO8oJ=8jt8|I*_PAJpK-J#fA^{Eh}M^1$1@;VByY znFp@$hP!L+H+kT4Z#Y|n zPkLan#!Iva4fd(gMN9F9Fa1YlclW@#-tcD{JjDYSdc%t}_#F?t*BgFZgAaP(DsQ-r z23LFF*t=emSKm@aYjanZe3&{F+U zmf{Uxs#4kAJ#el!{Fw$%@xX=N@FER<#{=*6h9B49gC4lb8*Zb))gCyu-b?c88>(n+ z>UGJ7dBX=a_;C-M?+w4B!HYcbc5ir!27l&(E4<%r&JH}HCV7TsIp~f6_#nT>h&`yx4}PL`a_@>8~l?OoY30c(1!a_qa)6%-RN}p z2WY!S>*6lbXnh#H-KGcHoxGnOAeb)PKalkSdddUzvIpog5B=$^fM{{JK5)cEwcl^_ z32Iu`1 zKSwzMO6sn{||}P;Nun9c3BHfhgT5@#js#4V1HU9>sz+t!`KZh6&|AP+CxKL)i)C zew0>}Cs7VXc@3o_N2|{15t^LCeM4t}ewvZA82o z8&eYWJwDZ?tP5(^>&dlu8d_<_!jD0Jj}?Sx9^g5_d)bS}bJQK+{hjjH1;vQVsCZpa zJ3I(H%&CL)+q$5B_K+;J^!Ym^zDWq zpB}SOQ9oVsvL$pq;{jeL@Sb^~!-uIHosnf@ko>1Up7}5OaAUj=%d$! z2gdvy_4y>c>mLP=Pgdt~eVhmHaoWByC>$&L^~Rw1P%gcXmpZz%hRKuoeo!;<$u~mZ z4|0XR-}I$1V!W$RHoetT48R}8n!=k0WT~H-(4F!xps658IP-U+VSw@0@F}b51Rf1% zW}2SIAIqW$r=yvsY%#*sJj*nFsMyB!=5kY08OFS7r72PD?%KQ3^t?fQ($!G`JO zR*{ta; z@nu)>KGR3CxXCr_-=={gA1fC{A%*{>J2z#2K#QBc^e_ zkW@Tr>L*Tc^*?FCUp_6OVW%*S&s=R!n}|PA+53~}cl=*xx1Ry`Ro9zmO_N3O9aq)Q zrlyh@;1VlLO=NMu%lCrmI|=+#znZ4|h*nqs8>Ws1%>0F0rpdB+%~f&7^q7x$>C+x& z4E>O+N;12c=yYxNG5>B9vt6s2n%@c#Te;e{G-J>muDwy_JF z{sEcWn4cG`U2nEAziu?<=Hxs#;ssY|NAvB#R(aXur_X#WIW>8_FzKmhCXVkjYHG^t W