From 7dd032761cd52ce18b211d1a2a23a2f9a7b20b5d Mon Sep 17 00:00:00 2001 From: Hector Dearman Date: Fri, 21 Jun 2024 11:02:13 +0100 Subject: [PATCH] Allow queries to return redirects #26 --- bun.lockb | Bin 336863 -> 337246 bytes package.json | 1 + src/http/http-response-to-express.ts | 6 ++++++ src/http/query-get.ts | 14 +++++++------- src/queries/all-equipment/index.ts | 11 +++++++---- src/queries/area/index.ts | 11 +++++++---- src/queries/areas/index.ts | 3 ++- src/queries/equipment/index.ts | 11 +++++++---- src/queries/landing/index.ts | 3 ++- src/queries/log/index.ts | 8 +++++++- src/queries/member/index.ts | 11 +++++++---- src/queries/members/index.ts | 11 +++++++---- src/queries/query.ts | 4 ++-- src/queries/super-users/index.ts | 3 ++- src/templates/index.ts | 2 +- src/templates/page-template.ts | 21 ++++++++++++++++++++- src/types/html.ts | 16 ++++++++++++++++ src/types/index.ts | 1 + 18 files changed, 102 insertions(+), 35 deletions(-) create mode 100644 src/http/http-response-to-express.ts diff --git a/bun.lockb b/bun.lockb index d2cdedaeaf023b09120246bc0a7763b19426c45b..59495be5e360294beab445549947af29eb9b45e2 100755 GIT binary patch delta 58192 zcmeFacVJc3y7j&H4jcBOND-wskrE_SA%Q@)^bR7@q-cNu0YZQT0TmM)2UJvC;)J8v z^$-*V8$}Tn5m2!gP*KDJQBko0D)RounsY<+dd_>l``!0HmyC@0jQPx7)?B;!@wTcT zy;Sw47ReuW9x}J;>EZQ74^rJb3o(>5iSo$;L7k1OLjEr z)3dbAYw4{E@{S;VLt;ruX^$32a z!+%b95S@R8KT!zz6%@{<0A+mnDXtlrd3iH(XXRH$l;e!d*?DTuX#8qmm!r+{|AIg2 zlLxWY4U_ZpXH3tZmXnUC2FRY3H8XS=KUMfV(o65{I3wV4p~8tXQu6aCAj8j$RO_>q z&Y&iRH#;6iTJ_Hp{82Gy(I~a^XBsKK3tjzo23@OaP0O8-nKwBUn(IFosa6oJZVNq3 zta2^D79S@UHLi%%%4J^WtVwy)p;=95w@#am8LI1Sua?bckmK*sHJ1BfGxXJqA# z&zzPyA#41!?Ah7$ZfH+!TfO>qtYbE;;aU%?H>#0~GMJt_BVPq(jvF^C>*7#oObK`$6`ZKhpIek@ zX`)5z8rqB!6~B)RmCvp-ZAEtatxHuaxUi8ewpC-B`;5%|$thE_=G{m2)vtM3ITvTm z3WXBYtlGp@w+yV>EOUOeO05hHXllD<%Ixf55qZgW@+^imZdbwTwpz^su34B#pbA3% zth3uIgPiP~VDbHN_!GmPm=1HvM!lZnIB#0^_^C>rH9c=UlP6Kl@sqQ%W@YDwzDo&( zXg_OVR$f*+CYKwvedwyz_`JN7Ig>N<&uVF_R|I=nT;p9AJw1&#;9O5Y1se(A6V zz7<@KIbPV1fLdN%0$dSRg79hn&7~U`bnIx&r#smEv-47dDSsGU`919PE7EO!?!{I% z<7Q=!&tk<6>}36JfmOdRU}c{|*z+5X@#!*n|RA(d=BiyH&?l z`hN`dHYu2B?Puv+>Ktd5&2i{tXWY(=kttFt>5{?gMfp-H(jCa5VnM5rfj@(0J7cnAB~`qnfcsQ@}^^} zDdS+J$_w%gg@!r1t>3__=2dg4p7y(VO}vn^4*N5`CT;p-X_|~0VrzMx;|z4=oRgJ5 zId?){=nQOia=8KiOJ0i(`}^C$9iN*!HJhdO0k$fz9X=J_1goMfn3Qq36XuN^W{dgE zZ(X)tgEhofAU1RS_^cV+y51jdW8Y^4Rp2h*amwkw?x@C^fou$5*g|6XA_$RSND?VY5^;?&(771nheakm4cq`jZ z-wm)9;y_o`iJ5u%GnHA^?7ZxW^FkR@ZDAFs*~~}5>eu7ws(LHZ)rC)kYr#u%7(2Ke zwkrMW1=de%PnCP!a(dww0-7FUb8Rj6;i!Ro0ak|NVckrcz#K;kZhTrE6ZHqUs9oNL8I9=w|il>)U|u}q{4%VJH^6G?{m#A-RtA^B@|y&!2Zp%#&MrRL z+0|gBZx^;Le`1jx%Bt7W|LXcFdAZZu(c&0_x+p&{WlC0Fekk~ZE>7V{+VXlkGnYD^ zm6bU@pS>k<#{1mq4=lC?u@z-8nL`VmUI44SbFQ;<;M5!G|MCbI+-O_!+YPoSO5J4F z-d=32nIsY@VVNa1;rQ$nc81*0nPjNRM1`m4PRI()Q)yiLZ?-L-<=gn0q}R|+$ezg7 z5DM)k{uJ!YSp}11hw326A!(_t`4_jKVQ0;nl{+gXYwi(r74#0eCePAat^YN!=0@Du z3XY$gIc=&k%(ew^b4_8-nlyHl9m+&cojAr9P>Kq!Lk4HSRj7yxO0-}`%Czj9?EFyH zKdqj~_&03z+(^f}Z?i+w^mdzH7K!q+X3g7)F2BU~9HYn7fJrNCj~DD)ZWDGQBSnn6 z!xogN@wwPl&pw;3%u$Hsq#t?h6*>D02v|7GKs!?m#A zAzsTlabwzm%|=t0R1^v|hQC;8hxTQ-me&7^F2O2<1~{BY#v0QpoG`dOgwb3CdNnehwYk>YYzH=RG@0n%UA108VpF>0E<0@FVBIfD z-)zgOyTvwYR#sl_w2QMsJFzvqTVU1o30RF~snY^R4!bh;<~wa;AAu`j-|6^fSfe}O z#UTHJ!f#oDN^k`c;=0@HuwMcz;SRVQ+>BmTqxaFv>Wqrm%IK%D5CS=OU=9yThl#Ihj*=;K-g;<87PKaCFUy#C&UuT^YMP71h}P;)koX zEJ(cglh|uJ?Xtzsavk1#x6SPqSk*~~RlU~um4g%MxUEh|q0ptNa}uQ zC%`SRYJCk%vkD5U5Ky}l%V7=))ZSO#w_9E!ql8|LjFrJuoz-(EhR*)jrq7%;ODEjW zvG;8AzJZlbPUei1+;LMvpJA&3@4EPApJ)Q{Qe47eo8O^&lY(CR?7Zp(t9=u*C(ULR zg%Y=x6m(_FcA#kyD*u`F=O#L9LRNn0OqaeUtm1wpUcFt8V$~msC!)lY(10&&diRLZ zCU~0Av&k=?+ll&rJBokmSFTa5;O7IjxVv4dXNqmMN8h!xFwwhXzqGw|`6xSS24br> zXJt*|CO0GW=lDc*6Au812fM`iJwI=De)hDyg3zB2_+>7z+w#lwQGE({?i;(_is0%h zkP2wn6OS|VzqRvfDy-RkJ$`lIW2CPQw?Aale}%31L_Rj%smuqLFj3(3eutVZF9`o+ z+c_Q9aISSc8df$(ezg6x3syB>{n`4zh^_ePhwbpqrC2SVaj^1fcf^0bX5;X6j}_Of zS2lL#FSqYI>*D7}J{D_qSEcYOzo=b2{DWW2--dp2`?xnIDHMv6s+`}tLu$B{U(`Mx zzT7WvACJ9QDik`07}NS*^u1{@uXHpN>WdQb*X~L4i&Ep^2mE6Ge&i>o#l0$}c^QY; z(*B`uiA{@#uknldyV+0f5cjH=v1z0Jp?0a!aagVVln&|MoeGgE?5|Bt4Zr3mcZ^4p zV*Zql8Q~s&QOCG4Zs2brtg*DJt zvwf=PG1WU_CHbvM-_0-T6b~2p#hv2bMq<*5DeJdRPmMOA?|KGR${}w$R5p|@L1^xY&;~;3f!4Yjb@g+`ck+{a#k~z!8B~ZKPEU-Y3l6o9KX0vJp3;|xo_M%wU*7Fxl8Abbe5f~ORu_2rjI>}bK1fJo6AQBX0!y>c&ZV>1Hk1K#d1P7)!%ig);`4rS|9E($pFAM$y-?Rq zxiXqEu^+Ltu1>ViYg#Wcr4PkZ!?XP4f${Jge)hn)*S5axHBz=u^NUd)Kv4xe|4>G% z_bryDTO?S8-5StyeoDvm@IUURY}F{_&m5Q*JHsZVu^m&rttTyp<2Y6)9BCC+ zdczW(N4I7Vj(c0t)KZEanCc~+X@@9SC|)lt#n}~c4OVaUT=Y}v{_1x-#Tr?MGQnss zz*2`Y+8tA4>zx(!#?rlEuMC2kbfSBrog32(4Op~*kR6q6gtSz{>V|MLzv%pUbZiq^ z=pSsC?kyvfPHb8KP`|VoMh6Tk+def?zNx=zXhwLrUp!PBTJo^C_fpePsBPfQZWFDO z%=-3ozUUMq&>cA`=-ZF6I{7)N>0YB|wtMX6l!w(n;pJ_{(&j>sGq1mO7A@_X>eV~T z_ChcVy)jr?4=iuCv88_Th`6^CO~b%+%1DiP&HX7OGok~UtKgKh^ynf&EQ1c|;cb5M z1@TBU#h-FPMwq?%g19#=#SU*U2<+p@qvBr07NO8Y^0Sk5HkRfcqcAwtE5g#C+3Bz! zOKqh#*QCW-+NzZfW7?SI)nBl;>)&HdFK)4g8^Y1ktEOm0ui5fw#V!&1F@ zSgHjbOIJSOEQV%R;HW6J#tTxTsf?uElx7j?9BfaI5Q+z(Z%%|#=!y=3Hj$8xy`PXx zv5yeBOz2dqopv_ufD=xH9wgK+(0(Q~%Fh|ssT6msVEc^TN@#Epx&K5cEj3Z6JVLgF zHH7SjdWeuMzZDarTaY%7kkuX~WZQF)kS(JP(>bWSH8c)JyK1sFJ2$CYCmUB!4D5k&mU7?D;b={_vU%&OUr^dZFM;&Qo#m)E{tls{?jC60OLJ8eFjr?uO z*0gsN7So+H+RARhQW;Eda(Gj5e$L4BaEhOu6ZbCT_A;7Swi(LY2a?w z^IUlbJ8$@QzXGJd#U$|bS!-7=2NJiO2nf4{#Y6i zYb`ioQMd53e)g=mSFe{nX3^GxsnO+FBXlo`9U`P1?&P_#GhM4)F6fnL4%WH;!T#yt zO@476C&NCre}hdR*3(%hwsS8ZMRjJ{bV-XjgT1C}YV>EUj(*OdPO-kW@9^O+cQuwK z4D*0l@g$a=BWmS7EISD`N9y(~IYH0EQojZpS!@NC`r~9f_Pcnd-e3-lH1a&{L*aRT z(HzEpK%$kzh9B~i=f=ZF{A~WV^NZ%P;|{d>h5XjPro}L{=>yJ7XQ~OQ?NN@j^d)emwRl zw)*-+j^0NoYABVRNY#fV_KumeQo|Gc?91cc9cY?qq2SKOnnA05zTI)`%sdZ^VRQ56 zb}YJunf4)}vxCyy6H55s)Z*XiUZtUS-BZrgRBr^9@?(U!X2TH?OKq|(ybPcU(LOk-@f1>RjB252IfRhr59N~ERan|X znWXgP%UHHfhx(^R!ejj@3p2caW9=r$WJpc*mSAb%*^KF=m;K~L4E%+O;&l)ofu&Am zA)lY>EyJ3HWv6oWi);aG8#HquR$5TF(k;MJGlOm3dkIUEH{??lFP3RLgbkdnv=f%y z=Jfb^v0rpu+*^mnEe!wGSEhR3V<|P;Yp1l>I9sSa%Uy=0s9@*vHad&lgNM)~SgMfq zY&G7dW4vxpi(%OMsOFDgsoThZQCe(*Z9abNW1X=yc1ix)O+l18o5AWB7)oTjqEuF5 zjnVV5PFTwR#J&~2#4oxr?yW)B9f*5ByW-DS8XrcB-M;xmYcVjrQoU(dngi6GxRqF{ z1-l-z{c}Hg3C|gmY`1aqemX6N!8u7!Jb9_!7OZoys3*6hKW0^avQ0*Zk?|kndJ@N8 zWjix^D^^-?_;{6&raFfY-K4VZ$l4p>d06V?U;x6``pLJ%z5QsaF8)l)T2rhCH#|xl zf~7Ko2^+l^YjkjQIZi0<=cK1c22b@@EzR(*o|@>7LsQfITGMEjb{%gDA@w8Y z$G)l2HCUXy;_2SEgxE6dm_)kg_)|=Vw>F349b&N0M(MWcS#ExngwYLhZ#|i6OEY_uq z8!^*XgND#I_hGp~XL{_#YKJE;3-Q`WGRv+_@I*C=(AhfhcsCNVwc+6-`W9BF;3!ow z&-OS|m^z<}C9j}8(QC1S2Xk*bA$3-;^+f9A`%_kAut^lH(CbCTE8>yvv;AgwWO(am zb9Tm$wHr^3Bwg&Ux+5df=VJfMJ2Euhce3$bZ0j9t+L57i{8e{mMAPQ-*)@Olo$1kQ zPK4eh)GyHL%+r}$vC|0+3PPI*^$0?dOY|ZJv0gtyT1ob_vpb3Mq{77M>(GMKNasTT%Lg)IixJhVlNH;Gl4|p2PyFP{#BD@7 zWTUI>g0TDLR4mse#65=9{Y1LMe~61;T{7J@SSLMqV4cjR@-?b{rtN)2S@5j=DwlSqSf(eoogAZV3iFg#Cqdsxya9cIPPu1R`1sd_P~p-rtkuYIJ?~&yn+}BBOQ_HDJaML?$v7OiU7MP9IIY`23gI5BJ*2KLd zXl>B!t8dM2NMwqKmxI-jIPP;yx_@EW;)#pYyV3u0ZHAX~qwST`f?MGeSc8JhXlu0Y zO|1N2XU`)v5}mz~o82o|y6e{QTMthQFY%{5mf@Yd`p{w za$*@pKS1f~=d9}#GbQ%L@Rfe{`ndNvnr0+r_DYQ&!LoP2R?F-vr}ptwuMkU{5?ct} z{|r{wpcX7&FSI<-PHyp$PRspf8#BCn5l?hmc!poJG47o_k7#?}^iSQxR)5$jcAKq1 zEO@!5KbG#~ClB-2qjW*BbL|T(mCfnw?zB?3Q*>}PolZzIg07gs{J>HsbT)h9em{9r z+&g21y(tCRL@&V_7^K`z$j(F!aP$tlL~LO>SZa1~x{N)DbuN~z+Fdif7($OAT6652 zJA)TXp6wJPpt)*qKNasvEC&KQBXIY*BGqer_lXJ3!R;cf_K76ktylxFY$ZO$N+o{j#MJPGe$f`*ph1)GiSdb4S?M=>AtO3vC4KIvypZlC7uiW# zPHzf?^Znu%;^8%Z^455y?ka!E)(r2GRXnzn2j{8lcsT=$L(Z1;Xq5+fJJ?Uzm>!)& zsH=aF%)Te2O@Z~=H8pbPL;ja9W`ytelee*7JY=gE>=)6ltF>HKcT11nO{k}y6{7nI zaqHij9&Pk+D0GpZL+EKjBZ5%XM?#?sg3xqA6XfTevc?Vz%Ymn(-dH?o^2Q18PVISBLBlDiqXSE41xn{+BOj zMAtp0*Y>GPq{8F=lvgsMmpslVcm14K(xZn6-Gw8`s=xRS@ zXL|H4LgNFi{W|RnXyIjk_N(z|bbTl^JV-s-FUH=6-NjFNzmq|Z~o#h$YBlRfFBRIdk? z_Bp$6%*L_{NCiLU;({0Pyn|TUs93V8sgdNT{V8u|#HK&}r|IQwL^%&PCLym0jNW8d zwte2Y-C5iuIX-@fH4IP2j!ml9Gq#STW23(mOS!OtQIVa_;()@Tw&iAbJa}Ac-YU6fd+1tP7 zOr;k~?x!QMPNa+8g4M&%`K(h+ffL!a*=DojJyAOHTC6y6oaK3~6+;t<2M%6!tg^kt z#u&X2YlxroNv9YATLEq1Njq$#>@lJjmU6Ql^e-%RC~vtjDgJOn@;)K%WL0aw6s%!h zVjf56Z2urHJrogY9#lpL?{~127k47^s`zrrX6It{3rba&yn!|Rgq87%Jv;J-$A!G$ zgVmEbYaPeZ&X2VuHPU~l-|UkN@3x&MGCL)Gm+6cB{X(HNJGY(^EQP^Ib{5tO_oUpcFsm?a; zk9}I{4Vz1_oyO*34aD=ry(9V}3Z)NDkN!r8lSg{GclMjMg$y}&)qE`8S3`f2km_gO zF8vY3x(iS6Cyk zf+~33-m&|NEqFPW)(q>sZ>qP)S)4TJ+6M31DM3dsOpT0s*Kd}d;XQ%af&{?}8`0M9 zsh!+XV%dbGpXd$GplF=zyZ(K4*%nsyXFisy=gzNqhZC(U9zheLWp-<3>OIHv332n~ zZIe3)xlv@pdLK*v!BNDk{k~mHyt$T_7Q@i=~G`VVKmJs`&#pPAK3!!+IsBtrP|?F!EB%7lbsx3^%VOwf!Wq%GJOeEW56> zQ{9Udw;ABM4@+IhsfHJw&)sJ|Y5dUC@B+X1hq(77THC;XEw`3pEDeBdbHh*V*f1Py zbeUKx$KI~~cosLrsXvJOoVQhfibqfTjGThQ>>xr)#{}eteT~(b6`KiZR@gn!``otB zS_7~&yv)xFQo~#Q?89-d@)y>hNzUXLhNYTvyT38jy9vvVpZ2{Mu+-`b{@N|6(ciFm zX`^F$q~Cu3%Oe@y?fVliMRAXe9Nh0uIh^60aUikS^xEh&ER`R85`(vSl7ESNq2d#_ zL0*GxgJoOA5g;}hYZ(3~ZfM>%6k9)yO885=9|f->l{f~po|IOKD3%GE$tptHikJx` zIfA8GWp{>izADlA(J6nCh7VHs*~jAH2ZO(R{o-TsXw$EC{5yCoox#rjJs$0OkY>q_ z{*zG8Ahegzuprd_8yE84A#`p~6OKXAM&CML?^;6Vpa)y0_Y#%{kas{@&{qpVN$He>Y) zYRya6kBmHpk}IFaQzjZLJai{E^!$2wB{eU6k1=Wm*fZ< zcd6hi$;yWTDhMJ7gyc8~D1wO+Tw>XSf#Qb%UH==b3J-VX>(~-p;&NadP{HGYuKx)u z{e&R3pt9W>eX4wE`v23!E*NCOi*Fzr^vS zur6^;uoS36mIGDic2E{P0Hm)1y2P>{mcb>K|5~8@A5DxXfgs`uSeIB8c?y&P&jVd0 zSs85w%IHO)>%YTFw*!b@(TFO8ok095&?Sz7w}AAwfv%FQcuo>Qhku|*u9B>D-0Xw& z+{uGWtO4TY8(bf2MysWt1J#IaKS;pl9b97RUt9ApSs8xg;>Gf3Lksd@w+b$?D)fUj zPjG<*jnQEjA(kV%L2#9174(bKOR{?6I8Z~PO6*wvWw6Db)BnT;L4+z$!8wT4f=aNY z%FeFp?9(K2{dZV%r#AkoKwX!<9<1^j!liXmNhY96td_KZCADCP6beHo6sIPUJam*c*U2RPQ3`IK&m<6(|RhMB~Q80~}$9glOI z<#@8=sg9>Rp6NK>@f^pOIG*pg5H3$S*TXUR7FgFUVbiQ)xQaQuVz_=dWCm2^w>uPd zn~N8#16DX&tli>Y&i?0(Ws?XaXB;b1~2fE5V;m6hOC;#I)gF5x?l-*x;RtcvRE)AHL3 zt77|{{<*XF!^-b#Sl8F;e>r{wOZ(PEh!yUXtq(Uqw!i6|Bl1xt`|q zKXXAzL0we?#|m&`mq4rx^jiSBO0rtg-0A;A9vEbx0#aN?C0SBSr~h}jjOkn@TrXJ9 zX)f7+Vinr~KdqG>a4EBbzRj64Ogm+6k6=k25eTJ>h{4Kkd@>{ zC4rYXH?j1a9s7=Naq(isFNGx;XD@@*hC3uWR`4!om*B2}LkS_sP(N*?ORUv&pR>g( z@P22DBW7_`*N&A=7R#+j(eQ)Len1&<-SFEVVoZsWlPpsgRPG1*s$4mmj zRgzWzjZQDg9{Lt^MQwHQVpaS_XP0D2+xa7Y$;FGcufG{#`%=QUT!dI7u-n-sS&Q`} zbVcpukJ5eO{7SNl;&iT{QbA9H?XUAl74za%Ta@-DuDi~kcBgd`}gl5?!=9L3epn>zdd z4Kx1#Z!)&|s_tj;M_t|0HAJkQX(hX<3+Rr~89|e*E36%LAgsxFKAdC*RCkXsBQSOS zCswkt_^F%=oxfQ2MUFF_E|&i!XP4ya=mqFH6fQ_|tCc`7MHadQ{~cBbT<`o#vMRLL z>0(W-8=WmyI^WrT5~HQ?t^83!<04A3^kpu7xr;B!rxE`!x(Zt3{MN!M=m}>(3F{JT zn|KD6|Fh}}UC)+a75JR9#mZ=_v&HJ#mtpN&Z^QC`$HkZA)6u_jy0|L#ap$j0m98MH z+_}UGMjd-j7i$Wg0xLm9SW~MuToFDC)>V?_*WBqPS#@dYbjJmOp#7+Wizvy;s3W>K z9afihhLzDd&R?uxcV~;`*VEZ0S?T&XT^!86{sc58=ff&!sN-R?s$gdS&s7^U+j3U<4YW0=J;}0L$ui0H^RC~ za_fYk?cp}(AXZP@?s$dM#bGnQw%a!Da8qVxlBGZDbg|n1xUr~)Sih^Nt0XJI)9B)7U@e+$&QGigzvS$ato&a_7r)|or}KZk zl!lG#btk+9^Dp!se^k(JXYYYEg+7Iq(Pxf7hjoeNzaN(0K^Omxix+FvM$}!7l}}Ou zg0z^65G%rSc1hOUu8gjhR)v*!b?09L=3l5Te^inBPHzCquaVQ6IK3&X%iL5qTxzgN zOm>P`dwMHaIkjEgvI<{DViwN5X|^1lvU4ZbnT+^R(2PUl#XwMHIv`d_gsvYL2h_^|UU$*Ra& zr;AnK6V4XP-VkMODWj(l#G9N$NtV9Z>3_w_XbbVG$P2Iv-sb%O6D!{xXFJCoC0H4} z;_ScT3TA74Mh>sg`_4_Q@;`94SlN8!^pBnXSFChJ>Fg3*5VWJOizvw|xWCg&vN9Ur zbg}#f0qOtW-(+z&m?0$A_1|H2&?T0hD}(Fbaa0k1zsvIXyDS`$|9+Q6@2=<)Ya{;qT^76h{QWKq6GAt?zu#r~ z`(2j5-(}&z@b|kc>;`|o%kuZTEPwTGiw@o~PUqsk-(~qv@6zZI=I?h|=mkAgmV9>w zGq80a{rg=Oz1#BlyDXX$f4|GJn5CkPwdA`i>KWO8zso{LlzewZ9V1)Y$lvd>{QWM= zoqAP+ORSf;|LWZp#Y@*B`}Z8CpGQ;zw2Ljk|2ZvRgiD zee;dijeKZss~JbGdZe()9hLb_%-kQdOr6!?>SoVF;eO#BCV6#uxY@NjT;6oLH{3tm z%j}l0@ZoR;)A?aM`j|xzBcwfo$JY@4oFzB5h2GEOIY?4 z!hoj`a?SFm5PCn2a7@BX)8}b~BNA3WjgV)KN?5rmkz}?h+JrFTnS?OMjC=+mwi#j5 zGbEX3yv+#fCFE>IxYTTrF!@=8I?p1^H`&i3RDTX(r-TAi<2i)w66QaLaD~|+Veaz? zDbFKZW#&DP&~yvJ9tqc&PK1=52=|(KI}w_`im*q*{U-TUgk2IAzl!iLvs=Q#*AP0thEQY{ zy%ruGUS&QJJ!m?-PV|A-iC*zK(W_0dgk^6a40r?K5wrXa9M_mbqP3>an?xUZljzlN z68)GtDq-bY2xHztc)}FDg)ri6gbHsXtTQ9uMu@$Gut~xO{;VHUkllU_2Ph+Z}wK7d{^OGG%iWsX8-;&(z#cDfM%c{F$07Vew}O z`^|0%3qMzLKSwAwi#|t4`vT#hgs)78FAxq$Sn&nIK~pSY*?xop`w_l1%l9MnK7epc z!XeY=0KyRos}CUjV2(;yS&T5I7~v;VRE#jf`Az|(}2r1tnB$;{NAT<3J zVUL8UN&XgLmxRUNB9t+^B`o}oF6{IjUFexb-yx(O!sFm~c$7084j~+nu;LIx1yd|x z+4qD7e2-AkEdL&%_YVliBvdwien2=PVf7CPr<$V@R{n@E=0}9nOwo@BBYr}t@DoBc z^G2fx{qZxxCJ8l+_cI>rCFJ~!P|IwPF!?Y-ox=!qO!i@f>PHZEN~mXQ96{JFVg3<> z24;tZxknLFjv_QP^Nu1k{RLr4->$r4=Im!l_F~sx!ivn=m^VFO0oD94T+6g(LmL>H2K~`XUmcFCut! zHrWw8swW}rln^&Hk`T5_n4g5u#q5wUw-iE3DTHojUMYm8QG`7bdYI%W!Y&DmqX@ms zZV3xZBXll}(8nw)jgVFb;h=Ng`t38Av=BR{~Wf8`dMHp&|$|8&?hftv$!f-RP973!-!X^nLjaMFFy@Z_d2&2pf z36m=z)KLeHG1(Oms-J?eQ^JL&#wiHfCConsA=B)TFt;K?N=1b6W?n^vrj-!(NXRnD zl@NAGSX>EVlG!a`VP%BQl@YSdqRI$qRS*tJm})vyK{y~`MHPe`Q;ZOvZn~Tb<(lP? z>0OoRW2X{5)AXr|a74oDst9@JsDzcLA&fZQqOVZ?dZ+RIh=sQ$m5MQ3GMSg!wfPt}r_!%&o};3wD94 z%)FWiO>5z?rzRfPnB-aryCf{Gh42rvTf)NH2%T#qEHaB~Bc#x`hz1B1 z8Xy=mvH?Qu41`S*mK*O3g!K|~&Oo@$Y>+UyAwr#o2rEo>Lxk#QBJ7lKr>Su!!gdMs z&qTP}?2s_G5kg8MgnP|AZBI=bBkYlIze#S4uuH{ z!a)fSnhs474oFzh6k)X~mar@tVL&p%BW8IrLhoh>$0V#ZeVQR0k+8ZM!ei#Bgq3F@ z1Vj0RDLM;bM011+&GA@gMm9%?r66pQu)%mK2goT|EI(J4WHj6qVq-7u+l<<}5kb!VO!io%pgQi%*vN(2$!T^M7X5;{b*g%9$5^5N4Ai{bHIRg=DnGF&q4??Ij2%(P29)wW+T!ftx z>RFHN5(19~X2-dB%pHu7G8m7BX5L_grspB-k9HE^l8jdi6^MYNQ88=LBiw<5b9ij z(Ai{PfKYuD!cGZsQ)3jub_w%GA#^c2B+MO+kTM#fo0&Hnq3IZeJra7DhMUktbU+}tS1=C=1 zq#FN|s#4*_>ps6I@@bSi&EN%*hU+dGAE^{Jd#{R=x^;4-Hd|wz$q{}?tRCNTTi504 zNI_VMDok$_e7CP~E_{kPG$k@ba-I9?2Cu3Xu4{~Y$bP{!@xLppV=|{it_wf6?%zKpbm$_! z4z2pO4f3&#PLB+|&fKsdQWIX6adqTM+x~T}7DgUQVp3D@0zuN5KEC`45 z*4_Qj$Ze7Em8SEG$mR;4;>#O|h2st|a3^c!T1R7IK}m`KN8FX`>f9NbcfVP4f4Fto zT|M+JH6QRFWbW#o)TuYY-;di%@_P)OUdGdx8Fa~30*z=D30&_xAL*wC3ZK_E4SFP< z>V4>di6f1=^I~1 zou;p}%1<9u=KB{x_%k#`>&<|h^qmYj=)10}Y6Wn!bNt#R*5|r!aT)3>ulx(X{IuL@ z-#Sg*p|3^iI^@#o8`&97)7N8FmbxhMHJl$3U+PsK{i3(Txqftx`hL!@PW#De`byw$ zPW#zudY?G#Ds$Lr`ZnryPCMc>eL*tWRpuxf|3WqNaqQs=asBEX^_+IoA7bx_q)^dO`LLsbscvao5YDq>md zw*lcPl&UdIeBt*D!c(25kE1BVhG3f0%Al$7X99f}LSvoya&IHTBb~7}v^SjJsZKi!?H;F9by{<^|9&T) z=EM{nA8^{~XzGv_An}E#>dvnvT4(21!)dM1;!dmS(&|0p?oO-iG_9`Q($xQTUE;Qc z`#8sXPCFY-?;`4|@3eM=8#}Fm)7qoy%W1mKaGJg)@uAZiIxP(?@zv2Y(Sjdf=zy5x zGHm1=JEG+|tudNm&UTvi;{|B-;C4>yLwE(y)!u3PZpqz&!WUMY)(=}h z`JgLJnl^?0K;P^+1MYyR_yOinUv}q#1TQ73A>7I3F^I6fn$#H9hNtSC3-pCF&0TGH z(guS^+-Swoll{a;B|Zw* z&uL@O-f_L#-)Upfz95tC@BpV>Nce4_OW&MV85eEtFz1&=_)!|7p&5>*{3e3CT`!DuX(yrGi&miV8toEK zCaetA<@&#(s@BLsP`As9d2k07)#*_-a#q$%K z39>c*Dr7o%7pUb^Tw;BTCrspccq$tILNfqg;SE|o-TBQ#dl*fv%yrrjP@~5i}IZ|hwxsf&34*c>`$C_vD4;Zf9kY3 zPP+vAGie&HxrqD=e&($l)l$nZMbOw?1~epU<$RZTK4JaJKt9Y83R-eGVfBps3!L_y zW*OIaW6Y}qlYVL3p73VIKwq_61s((s0lizh32X#kN6a^alA1;DAbh~oIX9_c_>=s&QXW(Qr+|u}5~vLHTU6`7qvqh?q=qT?6V${}S8HBq z9%$S(&RRm6Oj;omK$huzUea07OoBs9&Us0-3OW-!2Xp~lL3g0iJrw4a&*Lz3!6#}ItQ%p8)`F#0aR zU1s@^q$U+s5;SC{lS@0Zb4XIPF*=-d0bM~ipo57HB06{U1=@iw0NQkP?$9|yd$_h! zoiB8rc!6*Pei_~g-UGY9N2bg9N!2=hOYjFU5kyFS5y%45fKD0HK`xj9bi$YobgDSZ zEIB`ER6!GxRRTKs>ZGevtj_K~03E}1?A9?`$7&s;e*ro<>ky(thYlG-KtIqQbO4<} z9CQWUK~r!RXbe(73!rb>G|(?X=?f?NZLtr44ikHT4iNg`v!{W6nN2%{&I(rnoevg) z6=-*WyUpsMN#hG{A*c;Wo0qon0YJC&o?tbuGVQq?QFW33dlPz&|LV09+09BLmNnqYe^!XwgO= z1`(iV(zn3dK!=L=!1vU=(+kFbbVUJI@Rx+@ieE5Ox2zX+mV3(*f(JdC}JO6V6L zT7&JB^C|igbp4jfa4-_+_f`ggfnX451KI+8gt!#GQLvYa2EPROG8yg!TfvK98_+NH zMS*^J?^dvff<6NJk-3iG2;rmP2k;hH1y+NG#GMHmf#cY^=avG`P+9%j!Xs3m7F-+D z0hKlW*HfE2h`1dr$N4jO3>XV81Q!AQ6yclTEl>u;Kq}D3s~#i%pKvkdZ6K^4H@T5~ zc~K*H4dZ+48wl$KkAdJ9e23yY3>4@m2#XN!0(!dE)3lzRbHPlYr{)nrPs(S5CZHK8 zBEwZ66^x<*A5h4L@b5t9y0^hZ;+n%Pz-#2MhpAN166k@62cLq_l~h0vG5tmfgU`XgNEQ)3ed+Cw}a<^9zfQB7tx2nOQ_sG!5!ES0UdbO zgQof=4E^xP$3(sgbl_ivy_U$w!KH)`Qn4?=yWj)5tS{UiGzVW&ah>V+f*XL2jxxCZ_@Y?$H(al|}o23{}`c zGT#k;1V4dyflk2@kOXwb)9-z(13LBUl)Dx@1QfRee;sHGZsCtkv7-@na@`9)0sFwG z;4^R-s8wajSO?GYKtGHVv;tOG2hCf-m-xK^4uH>r3VI2=3@VVWB2WdE;Y+%5q59fv zx$4i;>9cXc08E_&b)VPcR9~QHvIj`m3)aJDI_L=WjH&~l2igK11hrG{$5#iOH-U!d z6YwI?5`O_`m(=cf54an22i-vDaA=)BCh476!ChGT0acxde4xJV0kn^5KfNAY2Xwn# z2(AE^fq6iOKl#rEb3h)L0dheOmYT+ueWG~gc5s8!%DYKF>Z;mklr(Y*ixZ=#`-XZz$MN|< z+qwaFf)(I4paT90mIGDl3ZR>rwA+Dhl-s}^gcEr`K=@wpfLgZ_+y^wV?gv2x{4W=N z4t@eW4pxE3z@sj_7G47$0S|-K;34oJcosYjlMY53IeBJ5mZ1i(CZXRpbQQHIe!Pf1z&=L;A`*| z_{Q0X;h%uo`vXv#AHmN+amq_^(tiO*fkyIdz3#5(COPPNDdC`dq85W3wUyinREcS@ z9+6H1i3)3Kl)_f!mIKX874{oQLXUtjP_O-tb_}SukAou04|znC0i{6{#6USv7U-0x zC(!cFt_L!g7Px_B}u+2Xp`YKU&~YDf;a1Dpv8)EYg8s5Q0V>Yy4p z9RxL`g4!n3BKg!r*WFtyJ29S$tB0oEQ(^L}4c7tMrRu|~pem)|IKzcWR}dspO_WI8 zr{0ib6IdCl=IY`^_clV;^O9QoPhh~U;ICS)XA~8d7)rHVW!(boP}2X+FcO6)6FwXC z0D7po7IXw{K%!gQ5>~}p!>XLlGnyNEcuO>7psVm%Xw5+iP@06V8Y8=vTBF1gRLGw* zl07M62IeF+D;Pz*Dt7@;FR7B}f&rjE(3531pr=e#x&zRGOPi>UELy&4pcBx%N(YI2 zx)bgSx`1Q(&c^4QmzY`D+$orA?&Mid5QyTmsX<3@{VqfqbBZ zYT4#GQ9N_C~M)Gz2dK<)sR{UMV=S z$LkiF$Y2u=%0vaKcQk7?woil8K*`?Hyr_j%ay!@kK|P~%>ebCaJ@yQ&p44%AE8!P3 z{>L$DVr&7=0WF_r!Smo!;$DMQ`;s-+#M1nj2Xrq`#S`}ft%O&>OJFD10n`XpK+8@& zSQ}O)w`u%UQ)Q^T*mn38pv21PWpD}lS+KTEX+8tQ z$Zi0i3Tl8DP_GmmPkH&s>g1|e+j69T^Z;tf`!;u0KH{!8LSHZm*=%`owcwAAI_Qa%jEbzMvl%1@uC6fhLvqa@9~_RYV1xHFWBsX3|`GElHJe zv&O$AhF;GqS&8P(Sx!6%2OkztYb$yUMce~)16@G|=mH+VCk~(E z!m<_LJ&7N?R7B4b5sK{NY~7=Ems7?A!MS<~p6m6drtaLN#-{h&qH0*k8RbWU5nQ3Lv2j_vZMjw46|5%z40rH-*w_n@oip}y+*`M5!GEE}X3Tut zmzg>E@fr9Bv1;8;3+3(|UvlR~`JaSwZ-aL#=LPez93F8F+rRtv@^iNBn1e&xAiL0d zbL!T+iK6-m_@zaaGyb2rH%r<6BOqt>cfo{frh zzkL1s^q(JmZb#6(wk=w#dEeq#yCn`4aL8!3@6@kX{!%w^Xs?W27U9cH=PRj*B{Sp7 zq?(b+70vZmQsx(?!c{~aHkG$ z-TX>bYBj_`oiVEO?7{(8)gE-xp_OTQO;U|^={V3~g*(mLuif`cI&W$($D!Dc>5Yh8eY#{I`R-}D>u$yH-cI!rffao}U6FU#*H{A%Era!rle3v$Z- ze$tPQQXMwppt(Hxw|;%6y*upUlMXvv%<%`h7Otw9S8y_Bml?2tyg$J~mE1PsmXsw; zmtS+z;VW~+0!Ha)b0@qq8dx7_rivbO?s2ZDRCoiFR;Lh;EkDUzk+I`_a|mxJhRg zM9Nk(m*2_Mt7dW+GN0V!IfJ#KKG~OF(7W@m^-8q-kCW%P%k0%kKWyCBEwgPT+@?iq zP4>`S6JJCJ95&@{rIcuOGh=B|ig{{LQa!%7^ueNFmM5YrT}uV5XNd%;rk}^f$CNX*6kAih z)}j5xXjA@r!UaS3bb7WsF==+s_}(02XNh>V%x~+-X^?4sJyor1`avhuJ*EJ&R{c6Q zmw_#xzo*7aTdIfJ!)D%Cd~ zZ%At9)u_*LiNf}p9OPQ<8rao4eDK=?#(cly6LKLB5EK4Sd)FBd)$#3@ zdoO~50tyK3uAsr7SdfLqhN8w2BVgB{C~9K++psrOz^}r`EZ>(XJ*cve$LF^1ZEzHvq~@(Ov3R7x)FATnl1(s zyU}C>@F@4}ky{&ENig{ZZ<{*bET_n zH@2?as-3UUXhcQ3_U#zOxNA)%n`q3$DT|*h1V@Xl%f7G4rOcK#MT`DI*;@228nX755^?}oCVeh!=BSf0O*Bg+|^EYyzA>(R@2i6V1piJBNKA>gydEju?RiPzjz~A zq*M$w@uCZ>;r-^3ZxU8gwcv(-yl>3pW^X#e$TC9@j8#>r=>~vvIORe6lSD5bMLL>% zOIE)C+&+32aA^#xCu0UEx>1z2YW1}_G{%u*h_U$ z8~I2#%prctvW4rr>Xb#G)+GlkYgwWW!vfjDU2~(BncrbvmWA{nz;IFn8GQaiMon3g zkD`cmh$g~m6~ngl1vxO^l`VZ-Cz^f%IGdc-!+NyA^$8{@Jvy&ceRx{LOtnWn@SgEw zH~<98cC>mu%;0~=KML6Z8NW>FjHO6wL?lx)=#LGc+hlV6RSZ|hwCAp;<>I^JLROn0 zbe5Teh4U%%S75f)kNd!x9n44g%vc7IQ|z7!9xfTv9--Rokx#9YG3`B?lng zWtsccvi-|hZWBzVDLk4-*S2Ad-zKDV{S~Mcp><5}WWGYo0{ozUI8&hTO>nZvmvT12 zHQfRri{ttSt_$CKcQIHF&0=t>0@7{Qh_%8%!9W`Do9J2THo#fv`lfvKop#L=3I%**CHXh8nn?kj_zkFBqI3$h9Yh z?MIyA3kVlLY|vgga&CKT*hK@x59G8HY(Gdg&Jr{ka4e0wF*kqgwt!>i5Gt>F-b}mR zQsPd?g+(vgw^MY`*!4pB4uDMqLMCZv9q<7ltPmLJQNI@z0zwGrML`uM2de%%$j{?6 z8vZ-NgFa+a3DP{8(tpPur_q)w(ja_Ipv5k<639a>dBP|y-UZ@rC3jo2QYgFtLSwxf zf_9KhGW zt-a((p(&Uyi;kyY*<9Mj9!jhD^q{+9Fa_*^ z!fdASJv6_`P_UO1=)j zv&=r=xsj^v!>j%@av$cqJdoR*pJSUJJiGgQ2h4|*p9zFaO?x`CPqZsHd=U2(;$V8` zjP3U)i&QMaAJi;WtfKjBZX+ijsv%V04BU$Z7-x>X1Sv?N3^vCZ%1?!YHXBNAX`-M0 z<52GX7W^2yZQrG%2y0ois)zhp4dW6%$E;SIf714K3h^4Dh)l_8m}v=hvX|^BKMet( zykUE?N*8Cr168XGK6B0*s!5sjJ{<-;X9S=0@$3Fqf-9MOVNxX{>q8#NZe6MWRJ$QAO~XFb_^9BfLNBm!;yS4 z#Q;GZN0FK6t1*t&WvkF46A|eJR zP<|6A3XtmgfMB^;!&*IpG7oCMks)A=Psd%oHxV^8&owD}N> zPpc{N4W6*yo-A`%x&BX9O=BTC#3_hwU~+*Y?Vz54^oT{`Q7_jd?9qx50QBT?y@}ip zBZ^ALObozx?Spr^sw4iC0X*2Qj-tl~J>~0pwY>3Xt4`=)GT~8Ql}=MJRNXI>1C0JI zrJzn;T^6A!8S-e_1^`gv_+ilHF@0pMm*kkmBtj;qgWxlr24{f*9$~Z+Pkg53R2HaG zIh@BXSFfh8O4g+|Vtd!gmbn&sSX6h!tRuC#Km35Pr)fA{X%6a|SPDL(7H$_&421URlNkw0T# z8;_-zGK@Xf=m~~;KUd~XZZo9!XkXWrMga2&E)cni*4l$LA9OJGI7N`pQOKYtAQ)c5 z`mX+XK02j^5u#lLg#bd|8xR!%ac}9^=ZU^A_ZlHaqK5@>bES=ggKZj5H169Vd5YF^HtNt$MNLyx}Ahh@s7tsDIqAh)YT&$|GT)?B)Ls1rseY@YUz-n(CtjYq4 zIWFote!kSiqHjIMvJhp*o2r+h!s2$@nz-N%6UgRD&+}1L--T|kvcVP^Nh8_#w_iZE z*+}K1sb4mfp!otCaT!&S6*T<>yxrz(gh&T4m}zm`>WbsHqzm0;bc`gw6WBSQL~w~*5(-Dix9K3bM^cyx?AzTFu>GaaZNOwY=}&^Vb7|Bo zAQW*Do?r>xxCXM{A*WM#I8!bF)N2>=tvam|u6tG7aSy5m9YBDgQsA!B`-=d7M_o>V zOO+PmTYkW?C+)=~YAK3y=l!Y%)9Z9`uPvCk$-H3~0-pjvA&eh&&w*7oi>3;uaAt}v z)i0pt&%i+IC!&P!+N3l4s-Q1`zAth>-;2~D7t1OmX;Cirag$Qd10%jQ_}x)gFtAJv zMP7kqSB&Az%&8hMGsdYP2m1lbkp3z1QcOs0*d5hc3}9wyus(RLdz~jsFhCCj2Xidb zs|vm|h{gDk2wgvo!2Tk+p8@5nfSYXKkoH6E++*gU=nkWV|8SyBQ_sNRkEY{iK%U*YR^TCMi8|gF?J4`Ls8Rb8k2dbFpKo>kd>Q6! z6nD#^AqLuWP_sV0xXD|TxV_u^si(RDj#*e11`MIj=irn+Qz7-J2W4Ot(s)dvzPXIc z`?bJrJ+E%c!&f5=lz&RO`9RDd@2ch0OoC){Ui;CA^G4ZFTP^3aL|FCsd5C{a#LI?R zINJrya@zU_80`i?W}td)*_(25Z{BSqpwDs&y9B*bL_+XiPR%c%t!R=u5F=USo}+#7 zgDR=)B;&{dwD1Cy<{o8S06qVae{$sKX_yx((i?%G0D?`-gE||w%eSdR7=7)d=*f4h zpaN0q2jvoKuB6b5zz{(%t48zC)6N;WsH$|T8Z=!|&_R?gp`fi0RWJ~NucSj>%w)~X z0|Mizj1)S?k&q8e4SFeuI!umWCltBwPpiN>^=HI`MTuZO=PlCnbl4enOg!hFy`SaN z9cfce7)cvXPM1rU0eq2bFS_yNH?|2XxNMXN1H%nF!pAtvzXoVYy+=Om^b+$c+tt|4 z=W@S0I`mr0gb7hVM3MVXt&X~L0+0S4{b$PTvW>mt0oDM<0vg+&T3p2{lc^VbETc~E z@K{5O(Gp4uumh5kD_0TdDP&Y%z@)6I@YV1)!LwU@*T+Z%#bjNl;5V42B#R)QJO$$P z_hhF9AIihv*Sjuy{qvmMxYO3_pj_3}lzkmyq%5b{eU7~0<>zrwdez;MP{G0$esZ1O zuUkRDYnd($S*$jhPTfGzw9YTMK!Kimof;fH^i2SZHI<$q8j7Ln2mqk;AC@!V zMMBKOKi(MuHc&hOyw3svrw3uz^e+nE*tk430u-Ug1wEpQU59dC(}dMKc)VLq?Wg+D(J-F{V`Pp3oa zFOo*y0&H;1)$%h;7-1W2LiJEEN_t8*WwR0ewvuq;ij@_P7_4ehJXH^4Sj zEu&`uFu6@m5Ab+THExTo1*^3*?6&BPGRDH&u-(hn@vx%Cp|xFH)&D_N5nI#YZiGs4 z1){G04$228w*q!$aLl3NyK&I}ieKoljl5cEbz}DKV+##y>*^mz4+~e0*%#TBvwC*U zFmHX;UFv-YXp0*-wXKprY#g`T1wj{En9)GqB2yb+Z%6y@hzD2mD`P!lewduG zDgnnU>3GAU+C16|iBvyUn!6khUCzn*AbVk!y6IGJ=;;IaQXXdL|B8gQ$&cIk;-&Dj zzQRvOd_^+&F@z}Lp(qK!tHL8#wpEn=5Ek^`HsuLI9(`$o|0M{9{Yx|$vc=)9AvXSlqpxBB3F#TL^@S~V0AuepW>|{6i~dYVF5WXa#TWQ+WizKLioI8 z!Ba%&x2Q=W_`Hfn7Qz5qrgEFHF2pYXWreBi7L$^xyP}81YdLp&C%+!GXFGZzC(PA0 zN~N?yM06bi!Q!%2TVB7QzWMtBp;X#jQ|WmjvJPHVQz+@cZG|meGm}g;rBAO*TWT)V zHuvVy^mNL2hJ?Z?onAh}j5$>6IjXeH_VXD1r|#=azFlLo&se1$NYT&147t` z;X`o}X#aw_`ApKifRgUSFy?8J{xg2uqz}Ecz()s%3N_B8=`Vo%30n37ERs)E?49tw zObn;AkK63NM>|wmU|pQHDZy%SOv~jHWnWgCE0zu(^lAJL^J&H>ov3F$!9Z;bhQ9N86tTRiess>_T%tVW>3XT|JMLc68( zu?Xxj#HD`6Y1liY6N*&<_XfTFB#GYf7QzEj&4I;H?>WvLWhd8qU+rAp%aLOaWl_md zt!&)n@aV7-qqOYMt%Lu04jyBjR(hqvZ}gfHm@x;J#1dHi+R>g8BjhGRlI$D z1U^a(#Qyoo+tc&}VYdE(GJ|DI>#jC4@ln%a@%;PTZeTk5lP9#L4(~-%9xm9Hk@FLI zc3U&~-v$o;#hOyy6{I_b??IJzC&}^y{7Vki_yCG2RHw)fpJ;2zx(vPeAbNREKgI3G z>PM4nj}7``4)(01&!y*Y^>V1sN5&<(+FOSRpZ46 z4g7ymJz&)Z#f!B%LqRBise7E^CG{UdrgiK$cO^@6l-zVAEjC3o@R!68A4tDqit`ku zSfCUM^wTj7Gy4^u$4B<6JBY~~t4+eZmtGx|QLn7ksje@=O??dhd9B-%S9b?K!eExr zV=#|CG>&JvZJ)ScY-**)MJz2)GJa(nh7FUgnS@`_$VX0ohL@UBie8u>h6iELf91S& zU#J2@ivrA1OybP4rBHJz0WpcTtmLS9bDpcr=D2gmmyN2CibHBvp@Ya+T%gWnrIUg- zg{qg6bn2`NJOK-76n}P#%gR02E%Us9JWnIbNsjv40ANMDquw7A>-{)DZv-e%hVIP0 z_x^C-``&Voya;ZaW2m=99(cFhCf%xMtlcL+~guH0<`+ui=1}@uV&8MzWrBrD?^z# zmNG0Lx_r7Oa*U9Di5DK9hi+<~-bt7ZU>(lAfy8If)8Sq`dbBar$Fdl$GIB9<0!3R& zt;^2N=eu1>*DOJ|ikCSmlbhGR=~=g{g%Opi=wXLajkoyqzUSX!tg&Yn)h&;M;aHl2 zhq`n)1z-YJWXW?+*9`CQsII3m5mP6K+D_V19(u!3QR*o=!Rs37Do8ry)B`G@R}Kgr zX?q1ovD*zgSpoZ!OLg^l=w0O|X{?~vE;qT0w~r0995ZJuyDg{?weC&oXeIdxJ~t^2 zkV4y=wA%^`l)Pd}Rjnm2xZ*C>STvC4;2~JvrhV2}?=77}voxE9_%D&ZvH`&EJKP4o znK{XDXp{{Y`|oZ7*qfq|gUbLFaKvBwWdN_gTn502%r!@>@qgkv zKo+gA0|EW-QVwnlD0cuzu$QVRR|L3>D`(W~EE?zWr5{hTYv4&Zv(~3Q;9Q=(wZ+T; zpF~~(%GE7y{Jy$FPMeMf%UQ^a z;)XKqU-yF}gH6s->*CEQw>LEXap!}vb7<4pxuecp&XP@(Txd}U!4VrIct4}<)g-@4 z8wz-cU=}cCLP)KGmIBTsY^q}e_o#Mt$+PUMXFLU!QMN@r50W9{?TFLu6#)F_YekF) z535Ul`p*)NU8lw_OS_sBNkhMaZT>r&tfmTFRQ!GhCv-hCcAHS8l()&*1(ufI*6{nn z-KGtc{$^5>;7ksZcH?<|M19t#gfHi{dzw$7L(&S=sf0Z^;XobrsRuXF3jVPqctU`ey&LU8PJm7wOj4y zY^|X~n?;essz=#R%NV-4IocJ`raAl99NFe^vNPHYiC<3_#BB<8+dmj>=C-pRTstsj z&`-yvqRncET?cjzDmQb-f!WlqmgLlSZ91R!@_~1Ot=_#z+JQFHfLmiDhFJgDE*CO^Z$U+kdFgjnn0@i>XYEaz5i4Hgoo%`V&QmU0JoHBPNxaj~g*2WLUp3gWboB y8(w$pq>uq)b}gqnlgdz<#Zja) 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 (res: Response) => { +//// switch (response.kind) { +//// case 'page': +//// res. +//// } +//}; diff --git a/src/http/query-get.ts b/src/http/query-get.ts index 4820e6de..ed87de66 100644 --- a/src/http/query-get.ts +++ b/src/http/query-get.ts @@ -6,17 +6,14 @@ import {Request, Response} from 'express'; import {getUserFromSession} from '../authentication'; import {failureWithStatus} from '../types/failureWithStatus'; import {StatusCodes} from 'http-status-codes'; -import {User} from '../types'; -import {oopsPage, pageTemplate} from '../templates'; +import {User, HttpResponse} from '../types'; +import {oopsPage, templatePage} from '../templates'; import {Params, Query} from '../queries/query'; import {logInPath} from '../authentication/auth-routes'; const buildPage = (deps: Dependencies, params: Params, query: Query) => (user: User) => - pipe( - query(deps)(user, params), - TE.map(({title, body}) => pageTemplate(title, O.some(user))(body)) - ); + pipe(query(deps)(user, params), TE.map(templatePage(O.some(user)))); export const queryGet = (deps: Dependencies, query: Query) => async (req: Request, res: Response) => { @@ -34,7 +31,10 @@ export const queryGet = ? res.redirect(logInPath) : res.status(failure.status).send(oopsPage(failure.message)); }, - page => res.status(200).send(page) + HttpResponse.match({ + Page: ({body}) => res.status(200).send(body), + Redirect: ({url}) => res.redirect(url), + }) ) )(); }; diff --git a/src/queries/all-equipment/index.ts b/src/queries/all-equipment/index.ts index 40edf25c..fcd6ec58 100644 --- a/src/queries/all-equipment/index.ts +++ b/src/queries/all-equipment/index.ts @@ -3,14 +3,17 @@ import * as TE from 'fp-ts/TaskEither'; import {render} from './render'; import {constructViewModel} from './construct-view-model'; import {Query} from '../query'; +import {HttpResponse} from '../../types'; export const allEquipment: Query = deps => user => pipe( user, constructViewModel(deps), TE.map(render), - TE.map(body => ({ - title: 'Equipment', - body, - })) + TE.map(body => + HttpResponse.mk.Page({ + title: 'Equipment', + body, + }) + ) ); diff --git a/src/queries/area/index.ts b/src/queries/area/index.ts index 5176e64b..3cd135d3 100644 --- a/src/queries/area/index.ts +++ b/src/queries/area/index.ts @@ -8,6 +8,7 @@ import {render} from './render'; import * as E from 'fp-ts/Either'; import {formatValidationErrors} from 'io-ts-reporters'; import {Query} from '../query'; +import {HttpResponse} from '../../types'; const invalidParams = flow( formatValidationErrors, @@ -22,8 +23,10 @@ export const area: Query = deps => (user, params) => E.map(params => params.area), TE.fromEither, TE.chain(areaId => constructViewModel(deps)(areaId, user)), - TE.map(viewModel => ({ - title: viewModel.area.name, - body: render(viewModel), - })) + TE.map(viewModel => + HttpResponse.mk.Page({ + title: viewModel.area.name, + body: render(viewModel), + }) + ) ); diff --git a/src/queries/areas/index.ts b/src/queries/areas/index.ts index 5336d162..a24b244b 100644 --- a/src/queries/areas/index.ts +++ b/src/queries/areas/index.ts @@ -3,11 +3,12 @@ import * as TE from 'fp-ts/TaskEither'; import {render} from './render'; import {constructViewModel} from './construct-view-model'; import {Query} from '../query'; +import {HttpResponse} from '../../types'; export const areas: Query = deps => user => pipe( user, constructViewModel(deps), TE.map(render), - TE.map(body => ({title: 'Areas', body})) + TE.map(body => HttpResponse.mk.Page({title: 'Areas', body})) ); diff --git a/src/queries/equipment/index.ts b/src/queries/equipment/index.ts index be99f51e..7e25534c 100644 --- a/src/queries/equipment/index.ts +++ b/src/queries/equipment/index.ts @@ -8,6 +8,7 @@ import {render} from './render'; import * as E from 'fp-ts/Either'; import {formatValidationErrors} from 'io-ts-reporters'; import {Query} from '../query'; +import {HttpResponse} from '../../types'; const invalidParams = flow( formatValidationErrors, @@ -22,8 +23,10 @@ export const equipment: Query = deps => (user, params) => E.map(params => params.equipment), TE.fromEither, TE.chain(constructViewModel(deps, user)), - TE.map(viewModel => ({ - title: viewModel.equipment.name, - body: render(viewModel), - })) + TE.map(viewModel => + HttpResponse.mk.Page({ + title: viewModel.equipment.name, + body: render(viewModel), + }) + ) ); diff --git a/src/queries/landing/index.ts b/src/queries/landing/index.ts index edaa7c03..418c4c5f 100644 --- a/src/queries/landing/index.ts +++ b/src/queries/landing/index.ts @@ -3,11 +3,12 @@ import * as TE from 'fp-ts/TaskEither'; import {render} from './render'; import {constructViewModel} from './construct-view-model'; import {Query} from '../query'; +import {HttpResponse} from '../../types'; export const landing: Query = deps => user => pipe( user, constructViewModel(deps), TE.map(render), - TE.map(body => ({title: 'Dashboard', body})) + TE.map(body => HttpResponse.mk.Page({title: 'Dashboard', body})) ); diff --git a/src/queries/log/index.ts b/src/queries/log/index.ts index acc24115..6f3b2aba 100644 --- a/src/queries/log/index.ts +++ b/src/queries/log/index.ts @@ -3,11 +3,17 @@ import * as TE from 'fp-ts/TaskEither'; import {render} from './render'; import {constructViewModel} from './construct-view-model'; import {Query} from '../query'; +import {HttpResponse} from '../../types'; export const log: Query = deps => user => pipe( user, constructViewModel(deps), TE.map(render), - TE.map(body => ({title: 'Event Log', body})) + TE.map(body => + HttpResponse.mk.Page({ + title: 'Event Log', + body, + }) + ) ); diff --git a/src/queries/member/index.ts b/src/queries/member/index.ts index 0f43275c..107c93e5 100644 --- a/src/queries/member/index.ts +++ b/src/queries/member/index.ts @@ -9,6 +9,7 @@ import {failureWithStatus} from '../../types/failureWithStatus'; import {StatusCodes} from 'http-status-codes'; import {formatValidationErrors} from 'io-ts-reporters'; import * as tt from 'io-ts-types'; +import {HttpResponse} from '../../types'; const invalidParams = flow( formatValidationErrors, @@ -24,8 +25,10 @@ export const member: Query = deps => (user, params) => TE.fromEither, TE.chain(constructViewModel(deps, user)), TE.map(render), - TE.map(body => ({ - title: 'Member', - body, - })) + TE.map(body => + HttpResponse.mk.Page({ + title: 'Member', + body, + }) + ) ); diff --git a/src/queries/members/index.ts b/src/queries/members/index.ts index 1fdcca32..6690f449 100644 --- a/src/queries/members/index.ts +++ b/src/queries/members/index.ts @@ -3,14 +3,17 @@ import * as TE from 'fp-ts/TaskEither'; import {render} from './render'; import {constructViewModel} from './construct-view-model'; import {Query} from '../query'; +import {HttpResponse} from '../../types'; export const members: Query = deps => user => pipe( user, constructViewModel(deps), TE.map(render), - TE.map(body => ({ - title: 'Members', - body, - })) + TE.map(body => + HttpResponse.mk.Page({ + title: 'Members', + body, + }) + ) ); diff --git a/src/queries/query.ts b/src/queries/query.ts index bdbb6862..929a916a 100644 --- a/src/queries/query.ts +++ b/src/queries/query.ts @@ -1,5 +1,5 @@ import {Dependencies} from '../dependencies'; -import {User} from '../types'; +import {User, HttpResponse} from '../types'; import {FailureWithStatus} from '../types/failureWithStatus'; import * as TE from 'fp-ts/TaskEither'; @@ -10,4 +10,4 @@ export type Query = ( ) => ( user: User, params: Params -) => TE.TaskEither; +) => TE.TaskEither; diff --git a/src/queries/super-users/index.ts b/src/queries/super-users/index.ts index 8ea70d26..4fd47df5 100644 --- a/src/queries/super-users/index.ts +++ b/src/queries/super-users/index.ts @@ -3,11 +3,12 @@ import * as TE from 'fp-ts/TaskEither'; import {render} from './render'; import {constructViewModel} from './construct-view-model'; import {Query} from '../query'; +import {HttpResponse} from '../../types'; export const superUsers: Query = deps => user => pipe( user, constructViewModel(deps), TE.map(render), - TE.map(body => ({title: 'Super Users', body})) + TE.map(body => HttpResponse.mk.Page({title: 'Super Users', body})) ); diff --git a/src/templates/index.ts b/src/templates/index.ts index bc063c2e..42771f1e 100644 --- a/src/templates/index.ts +++ b/src/templates/index.ts @@ -1,3 +1,3 @@ -export {pageTemplate} from './page-template'; +export {pageTemplate, templatePage} from './page-template'; export {pageTemplateNoNav} from './page-template-no-nav'; export {oopsPage} from './oops'; diff --git a/src/templates/page-template.ts b/src/templates/page-template.ts index d919d34e..3c10b644 100644 --- a/src/templates/page-template.ts +++ b/src/templates/page-template.ts @@ -2,7 +2,7 @@ import {html} from '../types/html'; import * as O from 'fp-ts/Option'; import {navbar} from './navbar'; import {head} from './head'; -import {User} from '../types'; +import {User, HttpResponse} from '../types'; export const pageTemplate = (title: string, user: O.Option) => (body: string) => html` @@ -15,3 +15,22 @@ export const pageTemplate = `; + +export const templatePage: ( + user: O.Option +) => (r: HttpResponse) => HttpResponse = (user: O.Option) => + HttpResponse.match({ + Redirect: HttpResponse.mk.Redirect, + Page: ({title, body}) => + HttpResponse.mk.Page({ + body: html` + + ${head(title)} +
${navbar(user)}
+ + ${body} + + `, + title, + }), + }); diff --git a/src/types/html.ts b/src/types/html.ts index fef854d3..2edcf66d 100644 --- a/src/types/html.ts +++ b/src/types/html.ts @@ -1,3 +1,5 @@ +import * as Sum from '@unsplash/sum-types'; + export const html = ( literals: TemplateStringsArray, ...substitutions: ReadonlyArray @@ -13,3 +15,17 @@ export const html = ( result += literals[substitutions.length]; return result; }; + +interface Page { + body: string; + title: string; +} + +interface Redirect { + url: string; +} + +export type HttpResponse = + | Sum.Member<'Redirect', Redirect> + | Sum.Member<'Page', Page>; +export const HttpResponse = Sum.create(); diff --git a/src/types/index.ts b/src/types/index.ts index 7ca8d6bb..61086c22 100644 --- a/src/types/index.ts +++ b/src/types/index.ts @@ -3,6 +3,7 @@ export {Failure, failure} from './failure'; export {Email} from './email'; export {User} from './user'; export {Actor} from './actor'; +export {HttpResponse} from './html'; export { MemberDetails, OptionalMemberDetails,