From d845f7822fcc39271d54224527bc9b6e27a409dc Mon Sep 17 00:00:00 2001 From: Your Name Date: Wed, 3 Sep 2025 13:13:07 -0400 Subject: [PATCH] buds 4 and 6 implemented --- IMPLEMENTATION.md | 68 +- build/ginxsom-fcgi | Bin 196248 -> 197280 bytes build/main.o | Bin 112400 -> 105832 bytes db/ginxsom.db | Bin 32768 -> 32768 bytes logs/access.log | 49 + logs/error.log | 12802 ++++++++++++++++ logs/fcgi-stderr.log | 2 +- logs/nginx.pid | 2 +- src/main.c | 1449 +- .../{delete_test.sh => delete_test_bud02.sh} | 0 tests/{file_put.sh => file_put_bud02.sh} | 0 tests/{list_test.sh => list_test_bud02.sh} | 0 tests/mirror_test_bud04.sh | 87 + tests/requirements_test_bud06.sh | 310 + 14 files changed, 14114 insertions(+), 655 deletions(-) rename tests/{delete_test.sh => delete_test_bud02.sh} (100%) rename tests/{file_put.sh => file_put_bud02.sh} (100%) rename tests/{list_test.sh => list_test_bud02.sh} (100%) create mode 100755 tests/mirror_test_bud04.sh create mode 100755 tests/requirements_test_bud06.sh diff --git a/IMPLEMENTATION.md b/IMPLEMENTATION.md index 4c8af50..8cc278a 100644 --- a/IMPLEMENTATION.md +++ b/IMPLEMENTATION.md @@ -88,15 +88,43 @@ This document tracks the implementation status of ginxsom, a high-performance Fa ## BUD-03: Server List (User Server Lists) ⚪ **FOR CLIENTS, NOT SERVERS** -## BUD-04: Blob Mirroring ⚪ **PARTIAL** +## BUD-04: Blob Mirroring ✅ **COMPLETE** -### Current Status +### HTTP Client Implementation +- [x] CURL library integration and HTTP client functions +- [x] `write_callback()` - Download response data with dynamic buffering +- [x] `header_callback()` - Extract Content-Type headers +- [x] `download_blob_from_url()` - Complete HTTP download with security controls +- [x] Memory management and error handling + +### PUT /mirror Endpoint - [x] nginx endpoint configured (`PUT /mirror`) -- [x] FastCGI routing established -- [ ] URL downloading implementation -- [ ] Hash verification after download -- [ ] Authorization handling for mirroring -- [ ] Inter-server mirroring testing +- [x] FastCGI routing and request handling +- [x] JSON request body parsing (extract `url` field) +- [x] URL validation and security checks (HTTPS-only, SSRF protection) +- [x] Remote blob downloading with CURL +- [x] SHA-256 hash calculation and verification +- [x] Content-Type detection (headers, URL extension, file signature) +- [x] File storage with proper extensions (.png, .jpg, etc.) +- [x] Database metadata storage +- [x] Blob descriptor JSON response + +### Security Features +- [x] HTTPS-only URL validation (no HTTP allowed) +- [x] SSRF protection (blocks localhost, private IPs: 127.x, 192.168.x, 10.x, 172.16-31.x) +- [x] File size limits (100MB maximum) +- [x] Request timeouts (30s total, 10s connect) +- [x] SSL certificate verification +- [x] Authorization hash verification (when provided) + +### Testing Status +- [x] Mirror request with valid HTTPS URL (HTTP 200) +- [x] Hash verification against downloaded content +- [x] Content-Type detection from PNG file +- [x] File accessibility after mirroring +- [x] HEAD request metadata retrieval +- [x] Error handling for invalid URLs +- [x] Security validation (private IP blocking) --- @@ -112,24 +140,24 @@ This document tracks the implementation status of ginxsom, a high-performance Fa --- -## BUD-06: Upload Requirements ⚪ **NOT IMPLEMENTED** +## BUD-06: Upload Requirements ✅ **COMPLETE** ### HEAD /upload Pre-flight Validation -- [ ] `HEAD /upload` endpoint implementation -- [ ] Client header parsing (X-SHA-256, X-Content-Length, X-Content-Type) -- [ ] Pre-flight validation without file transfer: - - [ ] SHA-256 format validation - - [ ] File size limit checking - - [ ] MIME type restrictions - - [ ] Authentication validation - - [ ] Duplicate detection - - [ ] Banned hash checking -- [ ] Proper HTTP status codes (200, 400, 401, 403, 411, 413, 415) -- [ ] X-Reason headers for error messages +- [x] `HEAD /upload` endpoint implementation +- [x] Client header parsing (X-SHA-256, X-Content-Length, X-Content-Type) +- [x] Pre-flight validation without file transfer: + - [x] SHA-256 format validation + - [x] File size limit checking (100MB default) + - [ ] MIME type restrictions (policy 415 not enforced yet) + - [x] Authentication validation (optional via rules system) + - [x] Duplicate detection (policy configurable) + - [x] Banned hash checking (via rules engine) +- [x] Proper HTTP status codes (200, 400, 401, 409, 411, 413; 415 reserved for future MIME policy) +- [x] X-Reason headers for error messages ### Upload Policy Configuration - [ ] Server configuration system -- [ ] Maximum file size limits +- [ ] Maximum file size limits (currently hard limit in code; move to config) - [ ] Allowed MIME type restrictions - [ ] Rate limiting implementation - [ ] DOS protection benefits diff --git a/build/ginxsom-fcgi b/build/ginxsom-fcgi index 7c41f6d9dddb66d8c93d9c8fe0296d26be95a5a6..d67fe13492e2eff735bd44fd3da4df9b25d6ae67 100755 GIT binary patch literal 197280 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 literal 196248 zcmeF)d0-RO-ar1ZNl>v-sKy0}S~MbC=h@uh@WokjnaxtR7_jBgFGfdyw`+M&1`+Wbqy^kj6bv|?E zY%_CalK9-wzi>e7R;?V_zc!9@9V%6}NlO43)jM0`ox>4u_#GYP-yTO-$9|%1<(~j@ z`89>jvae3WwUJk~om;*6o7bZ>JF>6Y8md>dT}yxU-{_p|tHY(!YP)voZCd?H{?g{Z zt=Ahj>vZKos!x&wSOo4-2x>+QT3>DTObDoSk^SfJwr zA2omV=%ge2n(a?jNA-^%{mHLB$y0yXSKcm+?fA8y-prAGRr^qXm;F>a>i^IFLfEeU z0^JaP-DD1u!;yW>?(ZM6o$8nW=^uvOaVhrK(l{j1ux@$;Pdv4!Sp`)ukNl&md%?v+9MYP&GIXP(b(v0Q%Tsxsk+0&{Jip&v zFHURhF=qBLm-^Pfe)Lh@uiBwvRK3+UDn|XO@-XC9dXT(RF{(diIGzc}Rvu*+%ReFc zXVvIW$KTcT$ZdUI>)mnI1s5z9YVmJ}?BI~U$sH^^{X73vV*k!pwouL`E%@jbyrKpF zsRdu$f~)@V{7t)VZz2Bj7TWbf3-JS5h<~w#etWTn_&cPcf7hRzTiEZVGD-d}KG;Hh ztcCI~ZJ|EXTkw}#C}%+n`<>fDIa6Bjq85BW3;R`;XifR`MdfQw@}X8E%*s7jPL6$l;639_$ylIpT}F+@3SqGe|`()AJ;2F#n=ZY5mKH27A$B~XeQYt2Y*>#v>_`tz~hL0LOY4mktCzp<%GhhH~-;)LOoOGiv99X?!#{%zoZz84G}UNCax=#o;0`F_l#(IZCb zw1ezkGj7V{Fy13*_?VH`jU7ID0CZx>=m~f`a@@qpqaBlP94FhK zKD>EKg$=){rIxC`N(&&;AlSbQ% zH8+|tW!yL`Xw29NBgT!r#a1tCXI2dMUphKcYMEKmUq$NZm^^x9NzeRVH}n`ja^eIP zB4abTbkf9|Z8@Vy4lkKy<%;%FK46-fb{gftjQz86DCfYG<<4@Xm)RtMobtralAQZRs(EZ^OqKk9yuy3$HB4N%B8e`U9inEobBON2d<8?JgN~^9LkHE2$Cywmhd-&wZBS%aaW42<%$Qx88hL0IB zcAP`nt`2K;@8VMl9K`$5*?~}!uOddOcfA}J6b?MU@9>_do^HK6(|XtA4D0Rb`|@pQ zdwc4>_dR6?^4D7KUs}n%O>4PlZEgOqmG!FLsejs;uPRRGY0v(3C4C3EBI|PGiS*bV$sTu*1x>)A0h*4?pmT+>W(( z)FJ(rncmN_0O`(Vd^^W7q~A94+d7g+mmWU0gSy*WgY=XmRJyfeqombe_W42fzP)&} zc0ZmgWZeS~kS}%V>rRmT8+eHP$3t~|5&1gA7n5&b%+y}2G_rv4lec%c50q`XG#qbn)eka`zY4Rb6H^{Gs zH<4cp&yZgacigM@lbu&L!ky$(;V$x9;coIf;U4mP;9l|v;6Cz4;ePU`-~saI;X(3O z;UV(3;YH*N;Kk&N;bHO>@DlPAj;{#$XNWH&@6ZMFpZqJt$H&P46_2gUNaq@q`6Xd($N%A&_==!I~dv(^HCV#h&c7wb=UwadI2b7;7cflQ1 zdb{lWKNRjHKML+5&x5lrl6(d{Mt%>xn*1Sn4f*5nTJmS%b>uI>>&f4Q$I0ix z6XbIb*Zq?uUxfG+`Eq!g{4=;g{x!Ub{5yDtd;{EZU-S9z#&P5%{{`_b@~v<;`A)cp z{7<--e5Xg(!$;m4*FitI6CNNx2p%Nw1P_rP0WTsy7G6w#B0Nlf`ze_JVrPV!gbF7mhFZt{A#hx`M$mwYMQNB$AqPyPiw zK)wbZBwq&)ksIge_7{z309)zdJFM+4YFM}K8SHhdfuZ3sGJANY%TGd~y z`TQS?cqjQpxQqNIxSM<$+(TXt_mWq_edPDU{p63r1LRM`gXGV_L*y^Ri^%KX#pLh8 z!{iI$CFINC5%Q1WW#p^imE^18G4i$WYVr;68uCVXE%`Qh9r-SJJ$b8KJ#XUV9pDM_ zj_@S;A@CIWVemA0SGYl*2X7)j37#SE0e3vmeEy#acarykyU6>(-Q*X+J>>s@d&w_{ z`^bmE{p2Iz0rIi%Ao-2(5P1Y%L_Q5(OnxUkOnyRk{ZC$r_z3wYN9%qsBdl4f1c`P2}Ih zGvq(P9S=62|BY}b`Bu1#{5QCpd^g-f-UiP@yyW}CedI2MlNS+4|k)H%F zBKN_I$$P`YPmvFXr^&B^ z8|20CCh{@x4EcDte=^)j9)Y{ar@`Iicfvj7QMi{p2KSLa3ip#g0S}Nr2M?0J z1P_tVfftd_gBO!O&{_9am^_a767mE*LjDQ7jQlHjCHZ&o82OLzYVu#;HRRjiwdB9U z>&RQ-^M!iy_V74)M|gtVh39)o@5AK-NeE#=> zJIT+1yU6>(-Q+>Ihx`(_mwX7^M?MVhCm#t9kdK82$!~;*$RqF~@;l(gTSHkPa?}OKq&w|IvAM32=Q-b^{#3#w0ho{J2fv3smzzy>G@Fw!b@C^A%xZ~00 z^Z#?WlY9-_MgAk)O}+{4A>RS_lJAE5$Xg$w>*ptL4-b$Z1P_vTf``ZthZm6_4KF4? z4jv{y8D2u}gGb2EgqM-`fmf3EhsVeZ;nn1q!E4BO;`5GL@+%QvM?L~xPktRdPCfyi zATNa{$!~_I$nSus$t&On`MvNa@(1A=@@lxFy7~Nn8tx>29_}K41@0!VgL}y9;a>8E za3A?nxS#wZc!2zpgLQj?&Wxq_2k{*aq@h4g1iqrN!}lxBEJZpCcg}Bko$0d(L_ES z&oMIOSE3xpW6kIPHE<{SXt;~~dbpds1nwc93ip!V4)>9l!~Nvxy5BmW9sP5v#shI~D|mb?L8NB%3k zp8Q|%IQbv&1bLgI^tdF+_lKv*4~D17-Ef2418*Yl2G5Y60(U&#eEy#fcaonCcaays z-Q+>Ihx`(_m%Iq>BOea;laGN1$ZvoL$tS}@k(8^0(pDT$hX4N)s~vuMwXi{|@eWviba94|kFq za2NSzxSM=C+(Vv$d&yt&>U#LdcO%|U-WuN@2#~jj2gwhFhsZm@i^$#ZV)CQmVe;eP zCFCc-wV zz2vjuKJpjge)2kafP5Z2Nd5slM7|VWME()HnEZ2inEYFK3HdsBguDS>M&1OkB>xoO zSB#No5MNEc7hXfY6UR#}dAqK99@LR{gx8bj!sFye!V~1j!jt4D!BgZt;AwI{+#nCY zo5%;iGvtHdj;EW?|G{u4`BiWi`L%F2`B=Dzd?MUSeiPhBejD6RUI7n~SHXki55Ys^ ztq#-eFCu>o@x|n`;bHRU;U(nN19bTj^4AbwM*bGOl6*cqMjnS(lPBOclW&B_$v43hC9`XTjFZsoAANgRopZrRAfP6SSNInK0A|DSgA}@s(livytlb6Fw$nSwi z$RC84kv|5nB%ckBkv|8oCVvH9L;la+dc14N=ODh0d_KIM`~!HL{6lzx{3Cdhyws)Z zlOj(dK281=+#vrB-bDT*JVU+_?x<-#|2M;(Tz=Px`!9(Od;YH+U!;8r$9j@CIChv>*67nECLOuvyMm`u`Nq!|fMm`c= zO+FT0Lp~8+OFkK1M}9NBo_snyPJTB$L4F@RN&XN#MP3b0lh1}5R!zBX4`G9*;`$4)7Rx4!oK?7hXetB)pdVSa=<|7hX?( zDm+f!6P_SH6P_gR15c3`z|-XW_tE`hkPkq76Zs%`hWt{vuSa{xdv5{tG-w-ULsPXW(h_ z-Ef1v?QweEHj%HybI}a>0f=`z*L?mT0(X)h0e6vig}cd*gL}wNf_uq(!hPhu;ePS} zJU||V2gwWJA@YB~i^zwrEXegQm2UI?!y{|CH={Bn3L`7n4L`AB#@`B-?Id?GwSJ{6uMp9W8n zm&4QKm2iXnK6n%PL+}jw6L81#&FB9!a3}c-a2NTja5woJxQDzR?j>Ic_mMA!`^i6o z2gpBz2g$#HhsayIb^D9Rzd?L4`48|g`A_f?^3CuF`N3GnmXU8md?k7Ask)vq^4}3( zO}-aiLw*X{TT4C%_gQu1?Yrsy){`FykCT6m^+tlc6XKKPN5E6$9(bDkc(_4+8oY_T z7d%6L4&3oV^ZDNw?j-Mp&rMw9LBzYs2f;n$gW+ECE8srzYv6wJ#(Z7x0QpG72g$?m z5P1o_i2NpaG5J``+c5bw#FvoY36GH911}?g0A5M{2s}pqB)ppZ8F&r(3-DUObT!f7$>3j{$d* z{|a}J?}WR_cf&p8t&i9H^OARf`^a z_kx#@pACpE~kXNGvXuUN5RX;kAqi|p9GJQ z_kdTE_lDPy7r<-DgYY`?f57X>hr;9J!{7<>QSc=BICzTuMtGV$0yoG{Ia~LC6L}fp zGvpO;$4kxU|4g`({6V;j{4uzj{3*DH{8_k{{AIY0ybkUsp9>F=zXuPJ$KfIJ58*}R zE8)fD=i~WsnEZ3ZmyoC65%M44W#m7?E6IO>$H=$BtI6-hI=qH_C*o_#_rmMQ+j{l< zs3-3LkCWf9Mn7jxkROcrB>AE66!{VGH2IYSbbSo+V-Vj&ej+?Wek$DYa`XA$6YeBG z3+^I65AG%(0QZnz1ox7M;6C!9a6kFg@BsNIy>xqm3liBtQK-J+ETq4n$hW}V3e^WhQlv*2aq=ff+>FNDX) zFNIf=UkTb-omO`O~bPmp(nC&^RzeQt{U5X7g+-Ef1v3%rT^$MbYO zGvs-Qcf8ho{+|qYlAjKDk@tqX$qV2f@*vzxelgrfJ_PP3zX~28zZM=O9}5qWm%xk2 zZ-y6>-wqFxm%~fQ*W-Kp5%PNwUq=2Aypp^c9wVO(uO@#1UPJymyq5eecpdqCcs==~X?&U%b^f=a&--`G+c{w~mem6WxUIkB)&w{7P zpM)Fa&%&F?UxH`IUxPc|Xg>enhC9jMgS*I=z}@5@!9C=w;9l~t;Xd;3;C}LT@Bn!O zJV?F`9wJ|l3C>BA*N|CchOPCchJ2LVgcCLLP&ckv{^jB!3zn zBYzHFP5vUhhWs^nE&1E zB_9p1BflPAPyX9EdR*e}MLcELoNw}N*8Muf1MYxyzHMo!bEx4b20X#sy2p%L)z(eGp!HdYhgcp;q zfrrW0!Ar=0hDXRZ!OO_E!Yj#thsVerxNcUHJK;6t2f=H}JHhM7kA&Bg9|Mn*uR27} zrv$kd@kw$YJVoC2bX`uG+>dyJJOFPZzW|;gzZmX#yZQVd0(X)RgS*H_!QJH7TF!^40J2pZ|xzo#cnXUF1i>-Q>r@J>*`vm%KaNM}7v}Pu?3IAU_u# zB<~9kkzWKaBEJk?Onx;yOgjQnPJCHZuCjC>oOUsaP=BEE+F0eCHW zHN1|z23}A8B0Nt120TIjE<8!T5S}7m22YcJ3^&L>hc}Ub3(t_J;f}e@=YIp-N!|o^ zk!Rp;@;z`5`F=h0{=DP|!F}Y1!u{l3-~sY(@F012c!)e7UPOL2yqLTnJWO5)FCiZc zkC0ypFC)JeUP(R{9wWaIUQK=zyoUU4tdncWZ$*3^c{#kEJPMDK-w#ia&w?k(pN6N% zpNFT(UxORuZ^4_$AH?@^GvxJ%cf8wt{(k^>k}rq5$UlR-$ydWYkdK9X$!~=F$Rlt+ z`5o{8`Q7j!`F-#Z`6KWm@~7a%)B|9~gSSK|0ek+;HqN1EITH^_6~P2`8dGvr6Z z9rK#c|88(6d3U&r{0z98ybs(%-Vg329|ZT24~6^5hrt8nqu@dEaqtlNWOxzzt?**< zJK#sh8ewC3!c*$H-5DSCgL#uOZKe*OH$NuOmMXUQa#%9w)yTo*=&ro+K}V zr^v5?r^!dd4e}e{P2?r;4Ea>JV?p!ze;eFMUJiGWSHj)oF}R1k8tx^38tx;10q!S% z59hrA`74MIlD`QLkgUQGTJ zJWT!^yoCHEc!azTUPe9_UP-1&9xl4}yotM;xWwUqpTx;)}_zgonw8!%N6V!z1M5;AP~c@JjMq z;W6^*@M`kA;5Fp;!fVMNg4dBh0k0>Y4Ud!m6P_S{8J;A66P_Y}2c9Nh05{0v@FwzQ z@C^CKaL2;t^M4iGN&Yq5MgAS!O}+u{A^!#LC2xZJ$bW{YycnJ&9}Q2DUk^`{m%t732)v2>c6f&TZn)!v=JUS_?j)ZDcac91cazVC zd&r-Md&ysh`^evb`^n#d2gnCx?|;eXBR)hPhZm7AgBO#33=flk2`?f479Jr_!^_AG zcqRF-@EG|Hcs2Phcnx_gzaH;e^7imL@`K>@xSMb@&n)rau+;Fei%GOeiS@Sehl0o?*?xoKN+4O?+JG-Z9f0~a3}e>a2NRixSPBX z?jaux_mUUEedHtHe)2FpKt2H;B%cBgk*~u#u!#J2#21rSz{BJlQBDbY72+f0_hX$? zM*a}uE6E>&$H;5o)#NY0Ysg=R*OI>ruOojCUQfOl9w%Q3Pmr&IC&^dCQ{>;l)8uKm zLH;wmiF^}0L%sv<_^|o>{{!wMZ*`82bCK^4ca!J9J>G1>1wkROF| z0_4ZQgXAZ`L*(7zMdYW$i^+S#!{i0<67m7?2>C_uGV)8|mE>2#W8{ym*8iQfYVu;l z*N~5a*OE_w*O8aP>&YXyuaA@8g7^ga9q=T%7wg*;`Q3<5liv$B$RC0?kx#(<$&f#e zc*nBl^ZyyRle`x0B7Xz!CVvO+A)gQTlE>jb@}+P;`3iV|d=)%M{xv*Az7}3Y{xiIo z{8xCGd}kU{ttMXya;ZP4~I9AUkA^SPk=j?H=qBL;ZE|K;V$w!;BNAlaa?=I zYw-OOFZn~+^FR5JLv;Q8D!i z8TtG0O7bP}82NH|HTkFT8uBmUwdCKy>&Vx^>&Z958T5ioD&qdfe0G z2fz(-7rcr5FnET%E8LN2KL7LJPV$rCF7ngiZt}C>9`f_yUh)g!KJrW9e)1W(t_8@8 z5FaEjhKI<*@FMbw@M7|*@G$u_cnSHP@CbP&yo~&QcqREPc#QlBcs2Pm@EY>(I_dGQ zC4Uj|b>wfr>&YKKN|zHSpNsee`TOuB`C@pAJONLWe*!niKZiGwuZCyHe}FqyG@t)J z!ky%sa6WgDHzM9mz8&r%&%nLpyWu|aHs|U3`N=!L1LOwAH%NXE;zQ)Q@FMbUXm2t3 zQHT$d9|tcXKN%h&KMh_+ekQz<{5*J!yg$5}d=R{b{8D%=`A~Qr`PJ}x@)7Vj`E~FF z`FMDed=flG9)YLHr@;;K3V0LwJ@5>94DMLjeE!dZJINo1yU6Ea9qT5ajd&0F3ve%a z2dtBQi zk#C1rlOKxytRept|J}A)@(jwUBi{qBCvO|T`Ja4$c!E3!o+QtOr^vg&)8xm&4e}G= zP2{J+GvsH$9UnEH|GnW(@&MdL-Vg33zYy*r55c|UL*YL18TfsipZqGsJCn`ppH0_& zrhPy8|7~`$`TyZe|I3Yd_0+`f^|pAmP4+Kt^Zm0ZuL+wUXY-`ZFR{7HwqLuaZ1Fv8 z@g7^e-P5-C{hHuu^52%GzD zex%IMw|TvTHuu>4ESr06ezwhhHb2Ma zew+8PdBEo9+B|6U^K2fndBEmHHZQPwvCYr7dD!NCZC+yYem0NTe1Of%Y<_{wD{UUM zdCcYmZC-8j3vFIw^NVa=Yx6>z|M%^Gd*Hu4@ZTQzZx8&p2mWt*V0+HdyMpDLoWYsx z=51-^2v)>PTklN<%a=Nrn8ohRKYw#8$F{xQ`pQdASBHuZtDJ2O>-O&58#B}DMrm8a zDl4s)>f0I?S!s1+w5{PyE3IybwlzFsrPYnlwuT3+w7SvU)-c^lt3}VYh8wN4x)Ive zFv3c!8=!3s|FF{PhICs)ft6M_Lfaa8SZQ?ww5{P7E3IyPwly4VrPU43wuV+#THWYu zYuLIc+g^2pBki}+>c&ReZ>7}@jkMoNs~Z_((1-U+Ha-R4T-ehN~;?YX}^_LHz3k}E3Ixkr2SS}-Ec_zt+cw)koND+ zw%=o>*I8+GVV`ntZ>80ZfVAIAs~Z4m|DW0RtA)Re zzm--GBBcFRTHOFh`>nKE_{;cPX|>>&_FHMS(3kdGX|=$Y_FHMSu$T5*X|wX|+I?_FHMSFqiiKk!^p#Os})jY9TJ| zx6*0>F73C{YT+&Ix6*3CE$z3`{mt|PR$48*rTy8ooPF9gsZ zkDo>9DoR&SdK#stP@5T*N5x(}uEDczmY-6-9K(z%rGNa=Qz-o3GT z|NV>7n<@PhrN5{2SCsyQ(jQX#eM-MW>DMUzJf)wa^ejqOQM!WC(F$*7M(Hk;&ZTrmO1Go*?w@J=DZQD}KT-O7N`FP^PbmE%rQfIY zJCuHn($7=+DN4_xbQPs5C_RnRQz$*&o-VjNSe5_9F|8au;srwsh7=4Q60GXpMtbzJ zV04QtuH428aw?Vg#t-VXDu1=aO0q}Xs1h)0UvfC2{qhd1i04$?E^8-==yGf};s(8G zVO4(b?JBEFfxH;AL<_6>tlj8vj4{uP##?f>lmaR{%3`cA`kS$Rm)hmpVDv-7khcS) zOM?}gb7quEwk+~;X566Ss=B*Wq0udc(O-?}Ql`o|T!mESzrWSYF|Idx%3(s!3Kd2- z8kZyTNnOSnzglJV(K!`Q$r*gUTE@v%pKa4yt&(b}CQcU~ST!zhzlG|$qPpdBsk>RJ zwA%HFMzE^m!-q--RON2kY!>mgdMVEYa%Mat5g)|lU&e!Sm6)gAN!TrtUl{$lP|CVh zp3WFA=v_s(%Mxa$^sKCB-B%4OxVm6i!8HZLm&iI+n!a^kweQlMS87Do5VyJG1q@!OjDlqR~Qa@?C z^rP(eMz!CF+Ha$*UW|*2<=r}YC)+&sletZ!G*uU;uHWLFbXi|Ws^L}Hy^Pp(U9+=q z^Y452E|(6JeK;ECn7JM2sobjEy-li?`E#V}8?Kj}`2mU1)jMHBD~IuUX7Ao*?XHry zsw<7RRHcThs>mP>kYXDSm5t2%haQ^;Mps=EjIIxsZ)ge)?%yNcV}(@g8EM_#+)h8X za_ks$YEIV~QoPwOH;V+T+D%d~y)&h`a_h2ly}XxOmkxW=IbF+CoQ$#gD&-6`y;0VuzijK6a`KR1d7n8F zDGmCm^uXZEKFcIw-29vL^eCz8vUXi0uGKI#zwFyLOqER3r(kH06$7Jt)Of6SI0}Xg zjQ*=YTD(C{6<^F(y)5So@2KF+w%ybsHz=nCcaM0msx;4OY&9o!Y4@PaX!oe#$vPyb zVt}ep`BHDcX!ejXkmB~~&Qt}IP`X%I$IdCV+Hm*e@oQ6|X=>?gM#zM&* zv#;}H9QTb^L;61)uL9YD%*p?S@!BhADr2$K^52fv)@%>SNH!m@)!7{5eQBU=ysnWl z^?0?FkiQ+TM%kj-cuDU&%+ayN%bV>}`*?M-&^BJGe`UPBU;FRJ>t)HucwN0CJ6?0p z2&Yk`s$`DWLH}xbyn0I^|IzXFfb8IZXS{~1@j66``?up&knN$rjMoX-9HXN&&^BJL zBg1J7mW;n0ud`K#{rLLpctx^(Y9FtW7TU&3^{!fmjH(uAMgZ@7{A8wRum~pKXr^oA7b9(PP zAO2$Ylkq^dhyF5NQ=8>%o2O2r3)Mp}V^}uF=qpWEBiYL=+}MB&r*V&DH2BRkrMm8C z&y$lCt4CBVpC{|GeQh7dCoHs$;{Yj4#!=17e>aYkzq7`1LsNDf&$4QomZBT(Q|HM? zwr1<4&yUvlEnV|JAHQRy;QyWRdqa)iv(mW6;wtYGl{lvLedPZ(ff~RpYl_YF7~bP~9P1B3lot*kB$h=D{S_@HV<_ zX|u1)5nONV&Gwa<#<;0&Gk$88v)*<@ew58I-jq&IBYKoRA}^Kw>k-XJM#D+w5vi|q zdezfPZE4;VlzuW_J!0;$(|Aon&0DMZ?el`YjcIQ$SBJfIeSBXU;xL>NWbVU0&f9;@ zqS^xMnWt4`Rqo-^^8=#|GUD$@&&a~oJZSZ5Ca2$GwX`vZEF?FagN@#sbx9uMezeVP zg5aaG_50_^~7vwy=s65jt z=izukheiE!=593(M{V842WDKqJXye7tMeCC70Q?T`$e0wM}pje%AnwWM)j1jQ#G$D z|6=KDxd@v>@Mt@bB zYQH(%gVFv$<3Y8>9jg1PriIid)2&U+rNtrECTh+HqZLVcF|Jk`U8Zh^^MY0Hr^M#( zRT+I{>jlyW4)b#)Y-fn&Z+38266gQRhO&OZFWF9Cx3+O zS8d(Hs>u<$COH+8WL8VWg^0+pBKCY?)-|Uhq$7GFVzYFgZq2%E#Hl($m8tgfkrlBt z8*!kHXpM-MtcVx05x>a!R_f6xX;sGER>aI~L_$Y=iHOlw#Dr{wy5W&B-a~|*f4PHI zvO;zL7WFQt|Kf&e>g2v-qq_CR@jG~)`ozaPp-C5e1r%v6fQ;(?B%o%yADBHQOy&f*LM>*uo@zPJK zjOX_Ldfuop;)lbLypM z)D#{fr|-t&)p%81m@NCf!%ZEdtIF4{EpI3&`@P-N+{(_rV0pZij7UN0K{<0fx1aI( zl&^clr9&Od+Fc>rN*V1Ak=G^qdafTrUnWPb!zFp;2j;0`(ba6!osuILXsOC=>Ts{v zSz0wX-A4Z~y2wP(i)vXXN+;jCUtx5oapuFS8dDR{s=Sj>qWc^(7b` zEN6#`y*V@Plfyn3-7a;k>EB9DDt{UaOV!EcL#ac~4E4hX^`P;dyB!XdK1tH*f$-y! z-j;Jpyw99#9FCj{^*bn;=u*gYt7KenlM=E|deuBNF2d&Wfg<8Al${xa%{|F8bSXKh zI$ZWthtRmB2hJR)YAI`uIg(P3Ol4$cO|e;?dC9Z;^JQOp{VO$!nA??>_Aq;F{$$k# z^{lz{T2<=)I(Mi%q&1F~_hLD79p#zQoQnIU$g(@+lbMPNHE-lBD*KY>y;6d1L#fAn zVrVS8OGK?Kq`DRP5@en4gEPm=`C@ZU#boLB{;IyMB|BKLru2ZF>N#)DjBQe+95HQV zJY=D8dxwF&m*(92y~4PWVUCj)+ z?i(LU2W2~8hEv%1LIkUJ)yq4iELpfWY%&kqfE*u7z4dD((AGXK%EYpZ`xO#<))0T&J#VXHH6Es8meN#QBmo)#1R06B=f0i5xkB=E^o| z-||6|?B1BQPP)JM+9^qWD7IBq-CB}8;?$)~4r^nrCBJ>5WSQ}aB~KOTsyU5$mes&q z#`BgvXWA0uAxplHvh=jPL(J^H+_lQ8@{gAOky#-_u_LW6D_e})%5_iQAd4&sHTyRt zQN|Z$z;DJ?2v}hYxLXCxkpMLXokr$PT}HVrWT^_dA0aN|D}?m1h5W8U#;K6#TB9F! zGD=OYmhoM=eAZ6dyVn3g_Kzs-6aK8nmbq|z4?M! zkbEAcveoB!6@SQC$L!1{x)w&cWSRGDt<9pg7{_Ld`bCQR$|~wAv#2db8>=Y2evu&0 zPiBJ*zgd*r*2x#zq*fb^)jyzC>m{nE8Kr9FGK<=1)T``1WpWJWRD7Y%hE@5~bWsx2 zs4}Z^lOLJ>ytwY0FHFyW&k9^D&?DaHl2dIziPhKZKO5>NBy6kSRqdqQ=}Xnw!*-U!{^axF zv}DVa?X8NC<9cu70=ZwQ%8y!A?5gWrXTd?b&hCBpeA#;E%-ATqk?Qqp=g3z6$86=l z<;vfuEC0dwvS*n~dmGM`f0_NzV?~e8Re!EG>n8pAgv6*Gl&2W^_gh+_wp7h-Xlrii zz;@qT5hHEe{buPPYmXoAF|QNYZjc;1dTyU=+wM9`bJcch)&3rq?W8K5tv=cHoe5`K z&>$cKo4apZ^<0^8hRhW;x^1%^v_9KG-*5+Y(H-=(6s33DMelaETv&BI%T<;dwT9M` zRWNgiTWU2|9;~Y&9iuYM?)hoAe4>4s%4?0`zEI`KKYJTiNS=BS=aSre<ha8sM^Kd*!@PiFzRs~V`dJ{Q@K4*ffXuu zt=cq*(pBzT_R?QaA?oVd&`pI@GPXuX4XA= z6Y~PRE$85Va$>ziVz%YD%Sdo9xB-?OQXnt*+C4@}ldsR=K)MH~Q;3wNnw% zE%rJskQl2@Yot!8oV&l1i6ZaXT_BIVa_;_AQnDaTN}X41%QkRXPmCe7YeHK2Uy)RSh-vm3dfom=uh*ZQE!!{)>Vt7mBE=;$+A=uZ%aa! zqp~iTYZkuN*m|43EXl|D(ulR{!`VGywLDiR+=q2}xd>}9Cx z?WhFn3GDns_3x1dmHGe)9nt;6;j36;t6=`yp?NqNx&GeEgo?;4wK6_ck` zYNcL!fLiH&o07cfA~nWU`MJ7T(x^^mQTeA>&{{)Z3%1IJJ>m_McgYcVkyKlCOMhJz z<15M2bsj9)k}*!7lFXT4ysL6$y6tV~rE_<#Q(dg*iSd}qH4innMVAjo0Ywhw;`eW}ki~5mK65-=&YXtX9XyFOpV!%Ku#Qj5T6CK9?(X=>g{Y zNRs+w{;}RtHmg@Q^GK;h>BQj7%lyHL&r4-VpuVCaxsRJ$tTm2RJB+TCCx7L}*Ei#R z=_ST5>U~xItZZ>O)GbUynAiI&NaHcv~x{gtY zy}Ij?GlEmV90#wT1F^4YTHHm2sS8*q)JMyrQer zSPhi2Wl~Ea>hsL6g3(UpEwZFe@`?97>QfcZw2&aLH5u>71nhdlKRmdpKuyjko_=2SGa zl?=7GPOCRnxmPSvFZs7fi}idAeJQ7pizcd7xc;izJ5rQfRpQ3Z8&sX-z+7gm87bF0 z=}$>-F)o&;81NL z6t%^-QrF+isUoM@<+77X*}y#F^^{h5MyZ&2XLXFU-aG@XHPT}0flgCvRhj&)dW9tg zT%h(?mAh3HT9w}_o$b}r#MQ8`ma$SbkmgUsDXY08*Oddc; zm;6(%bmo*?Y@9qoy~UHWb9MF|ORVezCEMIoeTTNI&c5Y+D_hM^RXjen*`ppHROKJs zL!CF&bPde#nRp{5Uf$^m@ z!uot@-}Cn7pBVV%vE|va$ZB>i_PW$`k&Cuk?U?IMpF9DSZx9%9Dbu_>Z`6Gty;1Rl z?6p?hygWbLLE2H3`<7(OxlOWvmTXl1=Cr~hYzDt5|?e7a%WD4R+2bE>ea z{68dAAM;m;&sQI8$g@N>9v$Q}3iSzcPQ_{ZO5wK-jZ<|IV|5WBab3ir;)|KXCE%T(9aGLwR!z%E5>2bBsd^1RY@GwyARi0;(v#{IPb(Lv-=9#8eBZig*rME)tU9$gtwSVZ`8H@0Ue{yxvxr?x|MA!^^v^qt?eJu1@5rmP84|k^ChOttD5H=4FLWKgvvzDP(NR+${qBsS>bhZLeNt!thS#k&qic>Im#Y;JX_!I z%?Ld&`bv;GY7bSjdD->)u-YS&L| zr|SLF@?OqJ=DDy&9U0PH_biu=QO{G<^N=cCf(-c*;l{^eYOAnpC1)*jt1s0wm6M|^ zSLNiT+f!|pu+|8euj)Ba>>V>oin$GWdFs{tq+o)%+|Do8gCikVsI02K`wxt!%+sCO zZ}PxZJ@)LE-HAHiIistLQzTfO@tgzYfqY?aIXh1IQsNfP$yVk7v$XudR`I)*$p@o7 zR?L&b!7(N_K%Va&&@Z~Opem3&r^8LB$m{HL+TE0=9`LGi)L5zWK|wT8sJm0kZuMbI~mIlp$x~D&r@$dGD+9oKt>~?D98}ZG0l$@J}hxn*VBXY#blf z4`GuH*O++$bJ6TH4pJ_UJ{xjP?x%`bYxqT_whhVO)#0$k@FM+?nO<(Vksc~(nShTy ziuoT|qqbY5CskjmiJIiE43tUUSLRH1-fuBd*X^6dhK#D3#Y>l}zLIY(G)Q~ium*p( za6?kI&bCKFPt5MGM(?ljzU*mG`RDJ6oPP zKDpQH?S7DHFWXgSw~JcaO;Otw>h`|$2-+Lh`)@cv4q@5r?l)9Z)amvD6|H_#)ni3r zRriikc*8JhgS>Ag?|XdSkgK=2<7;fOKpvd$HC$>lw|eGUm4Avnjxh^cAUS)De=U)$ z-7-kVEAoz?cMa~b!u&dy+?{>#ntH6fK^|&(Y^y|BVW<;~`qk3eGP`6Aa>8G}A*=?X ze5psi4I*C+vYtno%Yy!DWBJLF?Yn}nO52SOWQ?V(PI~R|52=1*ZT5RQ=DhnsDyzQI zd$_8SDYwZcji2p%1ZApxAMXs=*nBt>Fa1KAf1eyM`1R2(Qikj#-nhVcV{x;#XV=T} zWf}FXrs8w?DyTCtn;6#y1$QqR#qPWN&K<0KK)PPpOv-# ze-htQ?*CefUs0MPjg0Ky@QK`So9A2e+edQzn$PnF2cwxGmlZ}ol5ZUO<%AWSw6Sk}m>!)G?6L?=$H~d08!;Brm_oMdKgy%n!M9`Ypdy zW~4dMhAvbjzv`07eqmfjP9~1z8GGctd~r?Q%2OP9!f#BQtS)?0ddn$tp+{zzIwK4m z?{F;Z8<10wT+Pke;mf&G{Bk8%^;Oq#H3j=gjU*@}q<+XKzn-lM?KL{69fFtjYqQtU z_>M74%#1hNFF*NJk9Gfg1gNKXaZ(q`Uq}trp>T~(mdci9xyBI^(s)4j zd?X(U@satAs<3%v8s_f__4h1Qoz(Zo*GRdIA2&N*)%RQT%udQa7>TwqI$0psJ;!qM z_j>Y1zUglMobPRw9W}qFnrnWaeXryhPcM{jkCpHHNnnBg0{y#amD3m|o0(q;GCF;r zMnKO$^ZRb*m&N{a4pJjfCPnKJD2+((s~?xjnQ6YNmrTrqUy>cql0C@0xx(xsbuViD zTvA^lep)T(hlO%O<}l7OLvv=VSDWiziA&IYb>5US$sZDF9BRgt_S8LID^=xA-m11P zm#&cLd^53?gJftjEdeR4-?dR(IlA% z->Jg%x7ohP{z#%yOnwB=m@ux9o!U;1GJg8IeuJvUw$(p9DU5z1zd89sP9zy=+?bq+ z?T*+WjZ{mk!srV1T|oIfMpkjQf!1F;l}8d)(>tpUk!-saLNLJ$Byt8P5Cs$k1cY!=E-{$_ydc3O!s$2_Tm4t7ZEdyHwrcGS z0TmO#1Z-8rE1-f`&KMCC<))JNxAs0~W)iUdzu*7;p6C0X=k<}yzVEfyUVE*z*Is*{ zO+vjT*5RZbqLwd0XLCM)z|>4ZV2bi)NlJ5R?!0*m7b~ihV$&tDsdTWSLto3!w0u%C z74j+48OxRoSJPYrY6wQ5gV?2NIhFu|!l+Rf1P)cU!*ONrrtB)Wx|GlG7(Yp4^{b}T zf>w?Z?+0bK#~j$NCT7E^zk`;QEm6Ux`gr?Hv8eOU`Psjn{D7N>&Nn;1U7yZb^lT9pvr#!qJKa8VE_WKUe8udGY zuQX2{QBc$5&dcM}2W)}%mu^#n!+I|h5W7Hlu)?cq6z>!!0sPrzG%a-|NFBjwGB%@^ zlKOvaP3rfqT)1Px#bn>3>8f76R?$p4(9=*8b+hkd*u#nT+O?qw#)Pbt?1d<_T6WbMP1B}b z_>7jMhESGizeh&w=QO9HB0pD)tZb}rxc&XaO z4OlM+#m>_jy2}3B9-++8h2pm;#ghCM(TId4_9gW=ei)2CmyJ%&Q!L)r=7BT6xlMLKFMLV{|L_0%3>B zh!yfn{0~>l9wC%38;Iu#J8Ebj4m)0X#H+7MNnYmPzHrFZi<3UAFmleSK zrm{%wyC{^T(dhdZ6a3a;^{_|4!q}8G_4n%X&CAPMAE2$!0OKblpn7JF<#&1OFC{U1 zdF$8wk{Bcrx9SPrP^NyRWq>ZWgVZS$8AQ}S8B5lbSTjlPdWmMOz#zT6brsMVbqg5t z^45Daq_>a(q<@khAXN`As{N4YrTPHukL_k%<6 z*29BDoF{Jnt3#AL7%0z1>=x~e zao~a@#+}n&5vqWQ@DV7Q53=p-zscoT;V={9f;-#|ZG4(bo*V7I1BAQZ_g~HVS%4lz zreqBz;OBP6G4*DFa`3r`BysSO8#gBMKWUhCIYUWcdOm`eh<&!ZShy~eA&NDw?q8Y` z&V7`@3W|YoI$rb^saXCCl%ztjt|0Wvc-QL0BAxghVqq*O8lwz_?^|=bn4cHOvFBp#~ zFaycwpw#$Dseq2^bN6k~j!Kbzg=mi#!F8MJa9MNF% z)0{H4^|T-$Yy58@0^xy*GA9$WFBL?>&t8&5J5R^%7PK|k=c-tKA3cn9>@rY_aKSw7H(TN|cM7Q2s5@X-SzDJIg)(RMQ9vaUH*2S9wxLym1Re<$~{iE1W z*UX$cJ>&z`rd5~I03z0m=W{ZBd(h5n~iB!PZ6 z?xNp~KTO*Kj~joQcx)ca6mD5grm)%U*h6R?c{`!@*f>H`-s5zZE0GRPL;={*i6{U& zI}rt7S0_>_RQQv7VGvST%Ab(<62OmC73eH)*FYra-&n6N-?!KOj`1Zb920Q4+#=qgfHon>sd--XWuA zVlnY_(f7Uk!VyxXfHbGNlvDbjKIx{Y{;ZAm?s!TEfq*g#;wd0T;XU16Cuv+^{JA9H z0oG(M5e9*pAStpm8l-Hr=+R#bFzWiFov*s*A|w)Ct&b82$UcWuE%KMDvi8YR%z~vB zE!PR(OJ_Fl%J?BD6^>z(Xlf{kcanwx#6&K~1r z@6y>V_c@Ty*4YJ4c7x7-O=q*XvT*@G57`LnS`%Z9idO5MwBGG`yZS~h+_NI z32N4X2OS0rK;ILF(BGF@(V|y3sn}K>8^|cg+n{3kn;v3J(V};Cg(r35dJ<#5P=YHf zB+Y7#u;}-?)C%3u65Z_0I`%eoX!b_k!qvLjdR^fvow$z*^mT_$^y_+esu)v#gj~Bn ziHdYjn=oOhm4kobVS|T^EF_K?kCG(G`(ouPv#Zs zI}ge3YCjc(LDFS^RP!=qqlyjHvH#L&IbX%{hiL?s=n7dnaga{*>qL)E3}~zl*NH8V zg+ky6;`V#Q1c3r>lJ57rt_j`mY|0_;Hd8{G<@P0{UhHHBrs>?Ya0fU}@B7NAi!jI^ z()$L$kKK{qsCcs-6o8QD8`Q{$>)1mY^jsCoF9r`38Lcavp%aJd#8Eo2qfT51{?s$> z3H_9cTPS0{@jI=|3BSFIX=On%mkfgaV>JJBTC+dcucghoaC6zFK20&l@9dClQ}4n4 zE&S{$$!AmO9V{CSInprd%2|c9^CP;FEoaY*-JPjXw}oaTtv3hNQgkhGaoVN{Ax{z3 z^4sA2LbWQs+xgw^{L0gYQcgC{^6PVcbDiH}=eOMX6|=RJt8{*AoZnT>@5B7sPniN6 zDz1h@?Z-H{3UyO&hzQi*Jt_pll?k>)KI$^axr#~!122G7v3Q?%KC|bjufmQ%`k(Hm z`3oU^!PtC30rtwiuAtZUH+i%%e;lnzzZv#xkLl9yOKD+|F4JS0v{|L~_X3QFrcdZu zL{nXN(au!T9aLBC+kK@N7iEyI>+fZliu}KYiQDh1oT67>P}H_n#|GZ7VjEN}zfPtQ z{zq{Z=94<{cAdCgC*H3Uw?ng(d`lc*UUVPb2gZ@q+o=6&h^6-ev^%kM{>X-O}+ z#A0JVk(Ev*m)8!{{hXou>8gj&O~-Czs6g8aRzPVBB?0U-UEwpGSj8ww?5Pvq)QKG% zRpKc+u|Xxe_5MmsG1mAH%4otqi6N-x&j4>OlF$Y3LBfD=n{H$NdKFusWB=0aPgAk{ zATc1hMOV07Cw@!?5*O>li*>zQRg4jRL9X44L^YL5NVZRrBFA&Got@xhjyU*p3gSR% z_0g>L_a;EyPZ&^N6Vi?rZFpYAHtJX}4eCEsEdMw3M3Gl@g@<+G_Zt3x>BNXmyo>pu zfW0#pD&bjX}DNb2WH5I(CP~Pfr!gAFCnB z)fK!t@uwP-19al&kElWBsTi1iR51BAi3*bgNw&90k>fFW4|`4*li$;AY|jzB+6#Up zL(Q7^GY4eV(nG}TWxBJ<=M+Y7(lG}KGgK^pEIop!r4(lh#^}UnG|0E;!~&hTK_@QO zi8;D4r(REDZ85rDXky`BF#3?ze!lrB;K{y@-dYLM+wR{gT)g(Iifz*|2YH)REWe4~ zsPMk7@MoRapc8lM#9!!oyNH3$^%}f-o#@nCOib-5LDQ#{(<{i{`Z?fz@2GS>d--qF z)CVb$*awd%W)IP=_0@p()3Fu0r!!P6|11qtKE)YXN1Zr|MD<9h;)v{GhD#U19i3fF zligo;x*g911Q(9jSn@WDA)#&)VomK7mBlUpkp?B@WOBLs0v_$xel5aZ1Q&kbyOe|w z0V8?x+u;0eb$)j{zx$nEc>qevWjMb+=Qr2+Ep~oIluEg2&TpmjTjTt$a(*9HzjDkX zRt>eCmOsqfQ~Cl`UJ zAV<6wPLje@Ptoh}U#bA|(6qMe3~?rB3jRihvHo6#jaT(>R6*)TgVkhK!!-p&Mn z#(F~H)@k>Jr|)QMrot!BS3y+yOmV3tLW&Xzph`_L8Xbhv^B&nYGN zke6DpM)SX+h+Xrr7N}<>3Dnvx><=Ar`ZNIP!Ty(O2RdO_JB(VYIeRy$wcl14^=pJQ zaAsa903Wi~P(nYN^$;oG(5PF+WXNIp)BIkk-T+f}taA12mwwvtn63@fOCHjUWEH>H zKyBAa3+GXjKI-CQyZ)Cl_M$PCLT`@18ZF9NqhdXEEX35(Ub>DoQkB?I8H?HipQRT^ zOcJ6+Bhg66-bt+O+wCQystk^?Hm7rB0=j=fvw+eWHpcu==WPJhD0x`{mGwBwXZ_EZ z4aNH&CT7>_UP8~PUcx%|y6$tfisg^GN7^k~PH`H&QYRMc#M^aZkxp!4*c$={_JaW>$qg)4OLE@xR0|G!$gvC-eLXY2Z) zOi}(XL6DxCOGt>lp`>X3s5>R~kbNpB(gf-uMF_NhsxFc1l=y~u)FnQycS;oL64_3P z*W)Fc-4bW$64Ivh@|SptKe{E303y)Y#HGaD@e)zD#M`>WYfg#z@e((=CH|pHtaD0S z9xpN8E%7s5;bF>SefGGB8VQh{>lMFg2eZ6>7@ryiR`dKcd_V%HUc2 z38)*7RM)iq?1%*Qp!4-^ow;zx^l zz@@eI(vHRo2tk(0$Lu@peLqL9VOOVJ(bYYjXqK#d4UIikx@JrM80B0y_mjFv{cbt< z6}XI1_C0S1WCbr8b?2&;w$GkH9r_trrv`B!fT*=!M%-Q@V4*?D2$OczpNU!@E&5Ux zGmjXm;V1O_*cH^`d?Ksh$1oE)6r}6~!tjQRrNL;?d4E%}zB+a%LnQBX70bVt`Ju>Q zT_H^;cGP?$PbcnwK(&&uV$6Itx%N&H7370RwqKSa$3vbA zIjVb7uq>_}>Yi#eD^HCwe>IRRpnoZaOerLLQpWVLn^P+}1Cw$-6*|V-yvr8BLjD1b zn#mNS*9_$>-}+zjd?@0x6o>u#n>q>^|6S<|&hhjv25vvVVSz}f0*EqiCr!P%TqtS} zB>xa0`wxOcDIn$|UQVU;a#}5{W)l%XbC9}Xg8KWtl)VJM zMx*YCQ>2&bvuM~_MMkd+s-i_vMgUR0sAHe%yl05D3~~HXxZfddMT@*T^B214cwO-> z9m`-KG;_Pejwh!Nz^tBRj^FVpoGoj6b@?j%vuKXLnIDRMl(xd5!rLSx^;LY2QG zn{j${7)i$u;GBO&lb7{-HS)lP|31RNxJdO}H2cpgHb=*rGyvDCSpEVQ5}<~3g;Je3 zMEds)(BJrJ zg5|M|Cq4h~(iyBSMmH`uTuPR)y1aAE(cVU#a&3!Nc0Raamr?hw5Vy6z=IABijM%G0 zv>lLms2eqStg^vN!SEMmzy0E5%<3*`rM1NaFrCf+}Hg7Wz$=HMI3${c*sOMXRe@tqms-wYOw zKWyghlpR8IPbi?48nd`>b;zE0kLu^9f2e-C=w3H5b@ck(&s1I!@DTfgSWJIWYM0$e zn~v|x<9t_Y8*}2A`F7b^G})B){4!QyOH|W){*l`RY+-Zj2-zE?A7L@4Y0y83Xa7dB zA91sf9#tdT8qZ!K*>!IAPM!U1JbS)mSGd{F>FnRfv&TvHWp4H_b@or=*~29JJU9Dx zoqc;e+b7xSZuV52Jy&Pj`xUOTyhIro=Q(CAA)eI5sVH_4W${bXo8kZZI~n-l+$!Jv zvNx{+t3P-1_u1y%3g;haX?+VTjk1Gjm9q16EL*Sr>xjh!11ug*@2rIqb&sqAjfgBt z_ecGG{Iy4RR`r0l%x50W8L4-e-mSysTSxeqzN*SIftgI8ecSaE!2iWrUAxMq4KCv- zf#dp){T#^b6gs$uCZ9n&yev89-#2;B0gfO2KOkfi8iLIb4x2DGN!_1xbS2c5gl|sCKe2a=bs$(b1FprZL zb!Q!9YjV?1kO#a+$6MAtjA+%?;+kWf7oQz1$>8(4M>=pLitB-myHk^L7kwD5dVykT zi!&(3XBUoi2yfSNF8MzEjH8=&_d25FE z9v$tU5>V-+Cx<_6c`XjFs*l*Q-r%3@$fYHiT_j#@P(9#3JfMctz1?+1)W-ZJj!BVAf=3pjn% zd68LrH0}1iJiMM_Uvf+wG8>{bo}AX!qE+8gf6{k_#j85q2priJ1+U zS=w=O_=%dOoxMo5G(}f-mpOd|xg0G6PYW-Q3KU4^_NNJiblE1sYYkWrK>R$K!vMxXyaa-^3Hl z7o5o>^CP{uu4iXZs?3_ebRw14fD%t^17pU0(O-Lb+2Zbuc5O#e6(drvg68sLt({N^ zPS@!I?i!BN7_X{*lJEhFuzcMjf(P{up?{5(j@jg@B6#eskcm<)sR!;|e#*@>@lVY) zBSYjM%QPcbV;mcsZWg>$mC@1*e{THKtnv)A;I+^hHHAHWi}p$|gH=~U7xC}7nYA&> znelY@{u>{A948%wgOT&Nx592U#3iCp>5z1I5(=`X#w>WH`f8Ks^UUb@ArS4>>PeB2 zKC(v$Z(`HBn0-`#-a{D4Lun16>kzSMAFW%RH|%aVtsA)#ac;1~40zRU(U*bEV_q^U zWAU%K<~V5zsVYsu8}NRYNP*6ur-x-S*k8A7Q*zwe*E+7R({^t<1sfMhm(g;sz3<21 zGjd7mxZD=YUFRxlHjfl4;K>D<0#B@(R<*w8jNhnxP_mtCZtSqx=*`Zk-xj`EFfulA z{wnWeGtRx-jpE(1i|vQ*k}mN^k((93D{3Q_(zA@!g&mC5p)}e&8X5eTg28J;AD2aP za%e96Y!V&yWU_Y~d$$ zXp^=qZ0j=wNz0ioJr#CZoExZpG0j*#0!FmKTh|cEh0UG0xMyJ(*thw0%@OaSlMByT zw4>!+!8d&A4Yw@yC?DPmlNuAvIX{5Kxr6;Ii^M%Oo~k&>5^ovKuu$8#Wn6+yQO{Y( zWs4?HZ-ERU_H!f>eh4)%3fk+_a$5qwg_A?)uIvCVgaZnvG^0}m$ZHDEF@D}y*xR^o zL)~lP?M)pfmq=q=y@P!m?!EXN{&re)1=rgT7oNU2pcy8&M|LZQS?nQua(Iw5*fi2R zSsK+?3O_coDRp>nwPXpM%mlW1fe+v9^|G8r9Y^5sW(TCxYX1XDQ@7*+AT3r-k~2@V z-aA&@CSDcGZ4;jr^RXmpm*ck3);JW9a8EQuQ{W|2$F zJHPT9=f6YpM&rjL)5xeV;;+2f>O%v3hTZbI(`h@eL6HzBvX`zDY5bzU_WRR}J1?RY zU=v4fGs(>M0d0V+iSh3Y2)|^!#YSCE#D;(QcQrH`e$k991LD@ubM`ZJFd=yqUFP9a zyRRs?`X0f+6Qy!?Z1`R=Oxg7Ca~N#!-AQ(g~- zW4jiSiE``p5wO!9HBFKRYBc@FS{bObE`(h(eMa4%sISm1z@F`Pejlk#o=IkHX$D-S zG}|kD_}Z8-dMyWPmkP()XP$P@tZnL`VyEpyBTTV(9Ci?Ng=(XJNn{F2L%Fw3suE9>pFul8MZ!L-5jixmv zBcR?-tX~X@wD%{lU+?z2okslYrU0r&920|5J3rg26qMt}PwCp*e`qk>+(zpt*5tW0 zG9gEyL#_&XAueYCM!k5C#>$YEPWu527|1E+MVu!Yo_z1qq7+yN%S(*mVFv=-ZH4O z)u`V{Gm2G9J2h@QhZv@RZSUU5NKTEJ-}KlYDJbg{{^V0@=6Oip(^Qg^;|a`oPf#g? z8}7F74_e?!yiiWwHpPD8`xV|@?b>5yR|rPnc|E+(^uE*NQj%agwv?&~e#r!M5u(t9 zY}CsFRV2w9xO}3ll=HSqSt$0#ZyY2Hqkg0;2NYaj)-KKV0>hT1_B@~iw8?%4)yRxq z#WBQdRrb2233_(PSw8u#pjTW|En+2?;iU`yC_9`zyrr9(!yjzr_8?h4QI4P4k6)#; z;jEY_0?-A#J~gNIus1x6(BzzKVdYm)h!}NY=pTJ$Oonrh|KKZQ>W5z$*YvrZT;kh# z=lUa~c9O8rXtxv+6Tkp~g2#Ra>ZY$)KBeNb`PZ)C2M7?Cu0;QWAbF5 zeabSKU>@3)lT0m8Ul3v&r*0Z?v8SyFH2S6Hh$ldX{PD@3+}12(t{0dWcI(8iH5v9} zrRIog97#(fMPysLG%1G0p+;sfr?2p)38KC7%^Z2o*j@@hVBO6%BmHyC$Yi-lEN-6B z+s^XX({E=$!k;8LlJ?g*;w@Lr%hqUP)QxNS{gqzcPKaT_RGivTb^TME_bGx}2M)ao zGLe0)S>tH7r7=#grgf+_YY1tMivOyJ0Jk|KWNSaYRAvO0wM%FXMI&KUV9|&9Vzs>NJYQ6qg118z^2iY2C{NVn#-%Yf5DmoMT$2nbzgF zNnD#QI**oB?tTpWL~ts2=I8kLT-2Sf1M}FU8w^)8+dclZ>|{N9=c=V=v|HE5WC}k| zzoEO`1hGzJDzBAyMiRh5zp6jMF~?CLrjt;|MQl$WL?H z_58?xp*$Ba!0eSgUGriIQZqo6LAuI?P8IW#tTh#0PpFWZN^i*e15tX|AV1A%o!oL( z)?q2v!!4J#TnboeAIeW8?Li%Tmmf+&VtCj} zD=n76zsCdOa7$~$!A)NF9g(HN|3ilTFJ>&Bemdz&g$uN1T`oN|m-+-Pd_1A%Q*2yh zE4n+mHLJhQ9xBT)SWe2AF#0>&UVUE4#W?6-WIU=e13%`k8 zo)#$hmr?sFRov2_--ucECzO;@pGubnA5|9wqT|mJ_i8qFbpeQ9U#~OnoWRm69AMOy z$?qhiZVGvYw;FYOsi@}N(VLUMBQHuh$WY&rk00r}cyM4ct*$v$^?DdeqmAYdd=$XG zSt3K|DnqEB!4&zMFUuAZ)$H4}$};4pF7zf}EMkE9haZu_%Z^Ymuv%3wgoTnKZFHoK zmUY74X^1g64H4@r%?7Qd8S07lRgw?fPQFUVPM2g)hgbs35AR|8#)?kl1Tcb{R%v$4 zuv?A#gGdr>w&Ve!DH--FI1D1BdCz>4apxJ-@z>mz=2>dg-AUN2wY_p-3Oi$IM(hPT z713j4dW_8C4F37}hX)x-&vqaVSZvj;IU@5>9+2FZl%^ZCf1s9B7uhjgI+J6pUG`<4 z>3RLJ%I1Ekf@7o)yNiz`s$d+FhG?XE4*b(oQX6MOvIi=-4C1;pc`h8dTyXMFh^$OrhARiBC)((N;e(n$?@o2ygh zSvkLTRo`Ggo*LPw=}w44>{e_uGcU_Ey`>qg6Z*zdfgvF;F3YG(%SPLifIRTZOI3bz<6R8H1@sLZ7XqxNh`jZ;Lp=s0Q! zM`B-sDkNviZ$PP_ZVN3EkDVve$Z}9C;V&c>PBH3VR*CGZ0%$xO*3QaE%z}?Gs?B5U zPD^@y4$)4J+a}MTp~N ziBeAyM^zU~tQVQ1ayPD$F9E6`Ng}t@eV>F5`KBX*uqPzxk3%`b>6e-lw|yWcJ%|ta zkKp$+bugh`Dy36m&d5`ZJEeThrTcg%UINR!&l>e2FKU*hykOM7 zOGw6%0Yd|fJ@!uMS5!mpA!ax`(i*bleefBg%%Yr8+U&sa;b<)=tCEe@gYXRTjgP%- zYoa}{I8LCsv-ZxA!KHn{k0W7*CRt|0T)-kS6H4tW0bwE_=w2>CH?5j1d zMR6|tK9Kr(a>Clxnsw1+nF(eMSx_zH*IN=ISr@2u@p*7LIln$Zl^FDxcbH2?aD?6)L2`mq>_Ux%J()3~nz zfO)1>zW(a)KRTB8C<_j$4~K;NOaHvL$w3$J|ESI83XCwPW6-*)(rKVLJ`U4b?CzuZ zl1sCk)G57Q({JpXFO%R~E7*>GNRk7e>|ZvLCi?pU+42B^QTH2CAjlVr`EAX5<=2ZKYYRC{G8Bg(n%A>HLgCnJUj9FbR!nqGZg-U2bN}PTa_xh6TFVIg2XR+I%w& z(o?~U^4{JAHE6#KTJOfhwse+hA*xJ9Jwk0MIg3=Ej|PAE$O}H*lq7tVW;hL4#UMoY z5ic3%Cl0^B+)4>|hb*I){fz94)h3xchD04qJTMVV=tJ*u|1Th7lDI1IV9*xUW2|Vu zGjEgf)X9Oo|D*ZUwwAY&>3y*fO%*4joP>TED!^qxjxdFudz#pnAf!@-z2?g_@~!@WEimvTabHbOtf!&Qdb%jcdcp}Z zd`e4C1$UWVPb7uX)Ox~?BQ`|wTGc=8F{Ldr_qyTJ4Y})!x{7>H4WBg zA>FHGUam~wD~X@XRO1(HUuzaL3h_hXR5{bMQcP>KMt=l~xAe+xyWXi5R5cQXwF$<$ zI%8v^KbA+qQMg&;Cf7o95DUBoQB=|J6~aUm9ydy{-#3+1N#tTEfSv{gW$lumYFbcM!4c?D#>OykyuiRUNHY7G z&0>c^!x^Q>)c)l@zO^RoN~Q)_lh*eY>A0mJukboqmQJ&93_!Hy~|WPOf`}?d;*U=MD&d|f!a^d6|X?c z27s*wo@<-z0ycr5sT*3CQd$%pID5OL+&OHMF6{~89eDPRJ02dH)&B`Re?Xb|A$az( zkNtP>OgRBOGQIy3cuxB_@Ju-oJmaiy9rV0%rAAM$+Hbu|YRk0M?r0S~-73#cf@+c@ z_uI`EUrqVr@iVppl?4o)630YhJv#IDB6FI^O=K&5lKIP40J703$w_a`I?n;~Vzx#k z$bRWj?m_|V79-O{+?u)2nXDKjFfkt$i*u_^X)f*yaLb^$YN3?cM4Fc zMitOkLot7aaUn&~JnE z>K5y|Of#s^R;nMY|NYo@{Zn6*Yx@4-`p3=3GqeKd5gfOhkD7M#vG@J|-h8|Xjr?!S z$7Or|!+g}!UShJ2Uq5mFH|BW$=W9C#AtG7ants~R%Zd2$A5iRnh~D=?NO8DadQalV zQ%(R+@&6E>)BX)SQ%(erd;3c^o}$-^nk!p?8p75Ado9|LGy69MXSC!sU?>>LJ5w#0 ztfxS26ZRo23S|Xfga+uvy78+K#`z`x;Jq*GJ3=&rs9E#ZlhXX{{i04|J(2$7-3v1@ZK$_od3_^_53&C z<%Xpi4Z^LDm$7kUvZqrz{npe57~!)Hb+R)H7okFo6tsCYr{4DHaiNZh|L zP*X7cb{x08kH@V{tHN(Ngz}&8E2}`m8@dfzcoMDIfpxx13w~flnb+&34ZP~NIwIAnNUpqM4txq_XSXWRVA=@5`zwu$+Z?O0{eE1t) z!P0OWbzd_i&5nhC!Ui=D`XUxM`}{5k~{El@K2Rvc;P3({J0w7j-&+^(VHpp0`D4Daxt zJ$A*%3Wbh@y`W`vd--L3g$3&owI@>YQepLBz~00B#?O|$g3MG1(jmA zh?XC!Ir^i;8OG{uff+r18uV@(-ufZy7=LB)?KW1A!r!4;+$G;s<%8Bsc$aKkh1)S+ zkYq;3dc_-=0zF$kNicAAMeZvc9{Hl2pHfxcl_^{m2v}d@r8&Y_eKT(1*5U9w#Wk(H z!`qrhczaVW#aQi6p=?S^gS1_EVW@B6`JwRwK7mEP4Lv+XIFYM4(j{~y(0vi}Q#ww6Zh3ODW9KE>ky?VQ9wb?f;xSrt7<$cq03Doa^$mXG-c8DNg!werW@gAY6+Icz z^6xmod#(C$)yBOf(Yf&x;S9hTz9$%2j78>P=;AO%l~GAMOorarV*r zXi0hcDu$_Ag&#`OeH2vcV0AuC@D(8e;!T3WIaNdOLr`EAv&SxMrsOK3BLjD* zEVJ=`)q5U zr`p7s4{a|MpBk~5isx>2WK?z^QS)mLXN0E*BMW^FjSY0sk8lYP??wD4@!y;zW9A&09bBA=*D$5%2?;-F(Vqn0 z)37m%@c76j8bi$K>Gn{Ce?lBXw{1$@+>~HMM z1#a?`Y12Oi@^|gg+vIyiyl9!XC3YjgQ?4z)+7>!h^1EwGwyBD^{36NNLp}f1ruAif zK`;N@RLTMeZR))kx#eETl|ZfmCmm+gH(Osee$k?;uq8*5+ycuX zy)X0BzlEKt(DkTDPA6-Z)ndI|Vr?n4UMsbB_^ksL-xT3ndDhE~FP+r5xud_=-n^~W zON|>k$^u3edgUdvO{V|>#IO*L#p?%b*S;Bl*U)Pm3ViTTJPo^wGNf`dc*H+ zY;5k5_jZXzg>AjQD#`oMd(^uXKMpwr2-jL0^r;}z;N5C4C=Gxn|?;p~21# zlHTh49woi66aJR4&k27=INJ$-PdLK~A0wPj*t9M?4Brml4<(8F9p_J@E6oVD+S&~) z-^~H6%8jv(fyRaoX5;2lf^x@iznQn0Vu#HRql*KLo6}A2W@w%(W}VE}wgmGU&AcyF z(ugHORZqE86?m@qQ+?ldC~LygB5HDjk%{TSNIAYwCT|^?J~J|>uN-n?pPh)JTs$-g z9r4IA*Z$-N1$oWl1e9w+VnfAIvRF8d+0rMjFO7}lP-GXk6ixZqz!q)^mRUOj95c!N zO#pp~j}VxRFLh@)CkJ}%HS@NTW;Sj()d?NiX7<_<%=?TRvzK>BrH&9Dcj69bPrEN237c_uz_eEq>S z>p45AgNSr>-W7}%R&hJ&+S`$zs~~FGX71woeRb^ZTmX_&w~Z-soyh(pt14LVZTL+t z(JWB>JZWHh|E^q5MV5Szusk60#7-S2f}`Q`C?2~74dG$pnR|J_`!2VmK3&S?;>7#& zTuQBdF$Eu=&;|4=&v%J!+@1l(aBvR2FA_vNM_L^LsmH11ikp#NK9(IH1`YIJ8?%A7A^-jHccPtKkT9v$5hO3CIDW z+|5x}kn|QWde%*>F*(StAp?|d@Efa3y0^jucwc`}SMG;)?e1^P$kg zyO$WB6Y)33x{sp3Ntdnc+DXT|`fES9)JY3=^7_{nNvpKPR~Myx$2R#XZvHEa(rb5L zDxGx@25v@2bbz%mlZ_oNTN&(xbNXAxim6~T=xuK51S34b`JU@jsojaS$ESVK6-xQw zJ_Mw#7WXc{`a~PwVqGWBD*hK}wbj4=Qo=1k*M5LkOOa9c0O&JTzst@sW#q~;Q)L(@ z*DUK$6iOetGPSF^EF2vn(iB=~P7NSc<&>#*8`VIhvEC?&Uh@KC)?f22_lj_U_C)=^ zE+mNmFTt&Ody(CI{`EAj!Chd~HIqu{!V**iK3QID-1lOMv3``dG&=DGPLg#i-6=%E zuXSv&j&1dWG*W1)kcNIjYT<>Y)_%3zN{!NHqtxb&2jJ(!v!hZ9i$cRoXw+E$j&A0A z22X<1=y_BpwzYPnZnL|zd97-*#5w?IyH=Irq(^Het#zQa;*#i`7l4)KLF$GDfcK+Lb{VE2g05m069k8~9cH!_QYAVy82a4jtFV{CRt0>&e#Zt~NG`_*3yX z@6yw6JqDxd1e(HZ##nV*l#C7!darlHEIO-waIe|4TNm2w$a^|qWSyvf8NL3HZ?Bl*laf;ZJFe(LeuCUi%q?k_Vns#M6 z*pKR*@IqlJ(Qb0H0$(ME*PX{pAMh$R@A!=zdPh89<{(cT@12n#Y>B&p)YT7SElgCm zX&dh!xkpGN^)=w4T=lRqYWt>2z$e- ziyyTF*3AC2^9}V+&3-mu!Qa0Yb-)*l_Wy?RWL6zmP&n+HvA>h#zUG=`SDt*uU31bN zlxVKG=1<#e&pGYo-IF9b)T}*rsc~l+Z9ZE}-C%Svc$vr556wRV(ZQIJ_t|H1>qH)v ziB2j;L@cryb(y!Bha=Q%tW{Ozn-B~JGxYxBh@ylF3?VD zB<9$IjJg#>-2Jms31maJ02Lt^&FLA8vVF!?t9uKtTBv$rLlzz2QXF9C7^_cNIX=zj zcu&uf*Vw~+U`?HwQ_k-66%(<%bed?;+$m6CP&v&061ZS5j$WV#|3&TQR=}$h@DlLt zhw|FPXVh&K8jp;cgLl?61?y~~Za$A*?rkdR32Y z*>8jO7Ka}g`m7CTuuZ9%o`U^V2L!%i3Tdw&JBVvZ-nN9lTWEsVK-UQIsm-oD*in0I zDCCvp;|fqC{L*TyJ&bGm28ukMYSf<&i1PfI@clJI_(K(RV5ww`+Mu-C(m7_dbfTi@ z6VkH-O9ReF^2teSM?!y!uoFRTfTkN`*(*nX7csv>UaTDbJ%N=s9FxDJQ3rR2-!geN zgTVoSViofFPG>62e&0vSD)q-ZlV(H7mtb^MIyP9>4Wz_4EcFAmyAKEZHAlM+t^MF| z?U8ijj^0o-VUXEe+kmrj*P%RtazK4rTeXAka~n@bEa z)_Gz(-6f!&L=ZwqvWCR@p*HiheJfF~)wq*!UCxq>I7`HN84)3NL!<6zgt;#<{b6od zj2$fqeNk*B%lPcE80zohfCcv`CS-C>WlP2?ZihzUl=iNGe2Ol-uo;OOGkQZ0N z_=)bbA0iIrOC3Lk7vUlTNP>%;1s7RKibL{JXAX5V>2I~~BAhg2t*^WMUnJu4&!1)l zZJ7V#Bnb28``HaRaw)GxqkcS#jZ*?86HFC8$kwimW8~Un#m1fT0)lCMXv=+QoIwjY zzu=%BF6nca6(Q33ilxK1Zd2bm3aV83#3*JlmfT^=u+8M}%$#zZf5hi{n$d5(JQ4g* zP7RP5{T_8bN+bKJn%s+pP1FpUthC31&EdUe(WS-m3fE1gB099u^XEWEn{Y+(y^k)T zz-PpHQkcJRa{dZ4&FpJrRP+z&^v6t#ZnQ`=$3l86V zOjH<0U-|Olv!=S*%usX9Yj=G5q-ZpfTWqd5XWsA&T;;|z*WCEL|65UTB)8mLb91lT zPjPjfiL8)i#+|%m>3OzBCLy}G#?f`Sai;a063nGa&v{Tv1Pb1*{-lknGi|M^*MTUnndYiGyJ*T)C>GiujHGN7YXzxFHkf>OY%3A@&y|lSlo!yU=syqR)a2+t zF(I^R=s#v8Q_N(nLA0W`R#qOvE;SUr3C#x!&RfKC2_DhGz69A|ORA6Hw>p?j@H-uJ z6sA|hk86^bX^oS7_*%$arawtxit9_u>=YTE2J{f#JZn#;q}=^H#3!UWF(S${P{;IGZznq2rRW;t|O`0M%_Y72`!xma*60?(*>f*N!chh4qIw?;~m8V4O& zMpT22!xLc*Jpl)59NvgH5NDRd6(_~iPnKd=^WMr;frG8dDtbXp7`LPXW9FGlmdA^WZVgbPaHVHK*@q59+ ztM*%LC+ROoL=8{E@i*j1TP`ill&!)%*(!uYl-`z88N1)*yDh)4Zva&Z{m-$VaVsdU z`mmK#)E*iqUfpA4_s~z2`5gPt>H-jtvL!%-S~d+$I-(IRV7-sQaq%a9H>Tx9HY-{m z*XwVc{V_v6A-`X#>e7e$_@esCavRu|$cN?qJTJZL9MJmnB!%S=hJaY5Ms{Kd*e69M_0x>g(Z`7v<8A-(n;2j!@9152g86TR^o z-8vr?#5|pWSmxoe(b29$M2BbpAPT=lt|I1fN`^=&BefC94 zTW_;APM5Xe=;>|g|1JAthH*mr-^}=v2%b-Yk$_x_Jg0cKQh8QE4TvkH_0$pOgVLt; zPxS^?snvuQ&)YM`uNu=g8})K65<)lXxMt?@A8fwVsK@!3+F$eb1-|=Sh{1{y;`Qo5 z7!?#_A4I;|eD6@lL8&?RY>=lEfglf{RX*M+Xq0RYH16vNW{f%>knjW=_jEKn@c1AG z3t^p}fR|IE$vHj&-s_KEha%153Zg{hvWSEPeL{5EWt?{57$518V|A3Lp5~(k%Zm9O z^%SM&DylDLNfH>Z$e$^Ks7r;s%QE;g!N;E|xlGt_>?ziMM;GQ0_)`%Qr>iEzSLyTL zK%_@gAaDGO9Bd%oSa;#Qe&n6MU{{!LRAX-8igRcRFT)j^wXCLMt^W|@oh4bhCRZZ+ zh89_ejm@!qMZsK`-!s%vEJSUWAt(5wkhDx`5V&w>@LNO)PhjPx}e1uEL5fz#jF{%6%-K>wC+-fl3zhjlcSkR0b~~QU}Qd& zBR6%8%tv!RP`^*)e5ro_p5tXic5f^zLMkJO$gKOwL;G4 z)u`Wlm2zmODyYMKPXwRMB^>MxU2FGZJ%$g#h_I_`eq5)>CBc#_pkJY=66+n8gt4s^ zd)A#vZ~jPXroSMyd)0Yy`EINbelN$H7|gyi>f|bzTdev+hQQ{V<+@ZT{HHSC`-Rs`}(oy*bc9MSo@i` z*H@i6A#3&;&+yX~o>S+KngqYnx8;N5>q*(D;(|YU9xk zwR<}G3*NZBCpFflQ&UcH(>(o-yuN!@pVm&CP?EcBc}YPiCw1BV#%e~Ti_v4h?bcgz zTH<;An6*6)iwj5H60l0|R*xL}(~DYLwe}ayzZRfoS>w}yu?G+D-Ij)68T^(#jv^%m zxGorXPoSdghq?Kk5F|oprn>~O{OF0?VLwQ{BpZs72g&vmxvrKpg>^hhpm(#dem=Ya zevYk^M~~6hd05qcVi4RZnm?wu;w_RvPP148?to&PC-7&O(E&e0tiU($V!G!Y%J7Ex zb({lt4HWDP%?Lz>1ZtZx5bUy_13bOpux}j9YxRqZ!H{@U;TL#1vTJAve~nO{UOa@e zm-R858(Ld;9xJh8=Ie)XvGdn{?DZddx23Dr?{rad#*pzOmSYzDN`@R?k^bw%RVd7` z;`}9vzPSwypV3=;p7-YDSe*%e%COz7gz$aW`1>n`jze}&g{38E$9$En)jpIfsL|Wv zKS_}_^A}XiU$|iI3~>(^H_LMW3qo9?{qD#U{z#|t<&Zr$6mzy7u(tcxcqkCGj@X}l zqsRuN*>}_K#A}&&?nCcRntQRsV2#%dz}^BdEx&WtiR#9l6$gmR8F64V3<8p}jw^gP z{OUnhKNb2J2YAOlbf9zv-X(<`I%yEc=Nmtln-iGT7Kd$a2M06_KU7EP4X{0ZO zCwOMkx~F;MJo%AT0*i9bPW8(NN&8W~Ot#x0FyivNB=^DHG|^^tK+DS3!|ITS_uawP ztMK=@eKT*bu{hQ72bvQ_`W-QwN6e96ZKHDvvV7^xR^q((L_NRtHM-YI(L->)DMpx7 z`1mtFcV%5pjg(@?j?Oa=&&8-#0-0^**T1$8xynwC6jxe+u^F9eIjOeT4|&y1l!h2_ z(CI2$^6@{ScjYvYZe)%Gr1iei8W)M09g#kzV*E*g=TGyoM|urfTzLO zo&xkp4%oCIGO<#NSgE@yU1HfTX)Axxg<*u|!lfDP&8Go!C}+Bnd0Wm+G5NST{;bc# z99vtSwjaSUnRVdmzxoErrkbS5wMxDIpg;-YPypb^d zUYdvA^@)+mmU`hbFm-c=1bhT!&X(m8$dy1bfno`i6DXI!Gy>Dm#}{_sA8LYlHti!g zPAX24N;9Owjo4*Ua|l#V^G60hCA;_xIq&cp{lt9K)_P-?v8#mg`-x{(py2bx4-37^ zj#;bs^3uoWHF5NT50~ES1|;acwz*GjYoEpPy^1G!m;`_Ib@<2W?^WB> z-Wq9}pUxe#_5AdjAa{oix<&SI^zo%XKOWWmN z-Y$N1yZGdG@wx5d;db%m?c#DLFB#su+r_OPx6NOk99R0VsKTdkF9=F7L>eUXH&#V! z3ujwN=iRYRls&ONxBTLzzj@e!aP($J`T ziU40o`T1E=;V5&!SZLnPYi8M-tI*7+pnrjQNc}%mK%uT1BvO#sJjE)!0NkM09NMsCA8R()q=kY|&S*odh_M59! z>w<)ro|Gr*nAG2>=|2?2oSJKY-B${r;b2{AvKQ@C#CwZS$!>}{B*H1vQL#9b+xc$_ z{#{?t*#}hd%Y)G;)WHPeX??M3{WJR{N;)(X&7XWWR1s5{VSaJa$-gs;l($vNA$#n3 ztc`4?=ZGjPCdypd*+49}O%O>!^a+tvD8?E!A#Js-5>`g5y}X~YAIC<*ljG~no&@En z$E55`h7A8#_rHv~0jSRI!P586{l;v2z(3WJQSU&?tVQ!5U=7%JKBLe{wC;4F*B9+j zJmoF~wOlc|KAtjYrKB|3)s`9C7Nj?U)7~~vIJU#$5Z`5BBj;qlp|cnLYYmEzT#|9F_^2I-%bz7#eKN%r+U!n5 zFAZ9I1JS5-FCX40#tQTzr*E;)K=Id(mT#>&+Idk+tv$UkZPCZ7ja~GS)W(_*MGpK} z$h=^);*#6A2(@+bGT{a1=@g#myYQXGGx(cU7UUA^HS+i#9A*oglxtN3H{UWU%quQ8 zs{3H_B(i-S6*&Xq%_^QS=hA9sOM$x|=jN8&cNNXiZdS|n^EK}RL#zXT*1RX7Bgm#T z?@LJClyq*4J(ky?bvd;z*T5Ng%~DFr2-N+;r2X0Q&-*gxZR8aDPFF)eBw_?}Ni=^P z%f>GLJ7|yQ`;j65uUPT`on&UJB%zWsbjlZXPRfgRXPt7uO=+?Z{Y^D=Sf|J``b1LH zdhJ6~A_`uY6#e|V@NABS>U@BsNbOV=V2PZp0xYUDfmE#}5eixc$a+w_Dw}|P$_vti z-a~exv~YfVJytn2lqUNT`cv#!mRL_@q>~;Yoduvd^)V&Jl#r-Sl;``EiS$Wsy3E`w ziS&_fx)99jMEV7!)0O?v)9RN6X20{8aD0X*-$zkgi~}?~7b|ucV89vaVQ4id1^v&Lv;lCTg|&Zu>#l!d;(KDbE#2}VOYF$glgOG*=xw+U0k(LUv&8a zP5Pe`9nStO4YoX~;=(`dpGy3f{^yW3tu6Pdbg63JBI)&d->z;$tE}CUHI=N`Yza*u z(wUYiv1J@_C60#U<=JB#Zw0I^dRQ2I z=xh<8Y8#$pthyBzWh%b*f)_bxf2wFBZ6P(}Oo@K4RFBK9>n3%rFB6@v%>eNzPAe zj_wVAWxuQ_A^e~jDH=p&G@-8c7RH92)Rm_`PZtpQFLoOvg|CEV>=yZP`K;t|r05$? zrC4hrA7e?kS5Si5@2aCJ0H{@OQPoIGZOzNY9#vmXtcw2XG|^3r$?362daM2CiQY?d zZjhE!X(^SGxK~MzskWq{(}a2Uz#Bvw<0SS|`){;|et!=6ZA}`(0Iysgh*9vdvv;j1 z3h^hlqp)9{l-sh}zWp3fkwC7qUv}WD1itr-cJL_&`PLJ_cM%knfNxG>3pxh)D*s#X z0V}=<{FU=|ZA{1JqhK{MXRxEbvApHC_Dg3c6QST=!K?ii0r~v4AlE5BIgQop1gqBw zO2@Oo)?WOad~xz3JMXJxBYvH1#Aiu#K{;rbqo!ingR?8gXGQklmEv$HxHkG}R~6el zOAVb5@Ezxt7Z#QAX$rgVNin*?V&&qfP|c5#c@Z&=JB`d+#ZQ9+P$RQiV!17UvEQfV zADkbdpQ4l7&Cd_h4>X;apCpsm|Ac;qpAbIQ(8K_5#zl&L)$PRK`NeajP$pssnAQ`4 z`wn4e64;Ds?~pdu4|^c=+R{<8I^UjgB^bavLMhCgYU2>eUfPo8l?_`#>ZKc?%6@p%pKYvASdc5^r&pqBua3;OQ0 zK8TP62Y5IOz@GqK`w|e?a#EZ>{t%u^fYY^?GT%5n2z*bS)DFIh)Q7DKe7w)We2)bN zXTDi>oF`*uAjz3_z7q(;7Uwq{1=4$|MJC=UEI{mEcm>M>EVfsi4vd|Y{L%1DOt2fl zNbYeO9lzt-!G&tMb{1iXOtIub?O z|HO)8%GrKv=&G{%ZG8V3-4YNriGLMl9qtSjf`1_mGlQF7dKH!niBHUh-h?2I3e*$-s)C&rn1j@0>LHRJt_jw073;5?PqPE*zp(~|x zE#YM&98A7Im7YUeC1O!|(JmsW_@+FURLtYTJ=pW%pFGf=KXY!w{4q^_Gp!(3GzTsQ zb6X*pg$!5U16sU`*RFR%WLhghu@LcgiV6s2!essH!S|HZ)nH!$Gk zj#Fj$`Wq{5_AQ<>H&iiiZgr?)rf25$7tWr$U`h4D`2%NO@A1!@w{UUAOyBiMg?v@v zc@@KaeX8B+*Uy_i<3^`?NyUP>x_mq}QGU+!>N&o6I-QjT%1V8qn=32YfRIQ{E_=SG zdhRV1zIk)!&kgx1mdvQAm`MvGr!P1!L3jsuorW zq+L7%Z>XH@8MwIO`by8h$^`^x&z@?EwtykI7kM$oNq0SU7tAyIA+ zeUH8TxGwutCnW_d7R(OK0h#lprPA@!XAkrB?o-{H$ixAoG{p=US5dX70*qfay*e~< zRG>}X__^~L*Yx?7ZW|K^jIEjrtxcad;Ig^%Di%ziucnSl3l>&~s(hXqRTa}A$*I#r zo{A-vbE~F@<}O^|88`mQ2_wf3$a4dOpo`g_aT7+4EFCwFuIE@Z*HA|^{EGQfekv*_1_>2gZ?=2rXEl#wf_*P|Hf1`1Bt#SBdX zNxgvgNquHck$=O~D7$$4WBkEut}O*4aaa;a7?xDm=hLJ#E>s2lZ88{E80-t$+N8&4 z{g!Z>bluRH@cip5s@h~Y4QT|#;c*5(RAsF6KTGz0#d1rbE6C$THK}gWSMHZeXxmfi>nXF`4&S)1g+TP*1olJhz6>lS?NRRdZ+E zEX6AnT?9&!1~GE_ycywnLfgJT38RNb_d z>T%-&V@6#V7;}|B7%1_KE4}in(ko>h>cAj3a8Y6~qsNUM;|neHRZg#p^JQInaH5dU zH`nPWjs%}iOQv?X@%dQl$EC?SBr$m{`g{rALDoE3aJt`oD5G!g5}}oTK94gN-}I2L za$z-XP;){EgEj8 zz{QFDa>30^pP)(?kq^Uq`c&VR_3D;04V7Y@Sfgu(lKy_KBot@(L>l>)1-Mglr% zp8j1ZHM1fFQV zY6&(~&vaa%=_nFPM49J`38hzFGZkhD<-z9{%%~{xglTzRk;fcAzI>{G!gzD+m4Rz< zdK^0@xnCs3RJ~9=u3j)z4byX(TE0S+(`U?Jm~p)!fv;*M#n z_Dm8)-70^;P4%4Vu!v+7N+J_P66B|lN{XmD?Fxk}W!5TY>VgW>6rAMjxUX)UGc4d zqeUoW3XLhLJGBb6WNsC+3AbP#W>1wlPR5N;vCpMTEveP2cW1%vO0k5w3)&TRiQ$H7 zB)r>&Lm8qhO+{;&sRnM7Q>1HS9-knPaIqjzq zshXf+XvyK?N(})Cil2oe+&6*YkXLAD4{aVun* zBm+riOfn?F4MmY!RNPvus8}~#s<@WAqIIE)75%&Lue8ObmR78|RB_8Z-|L*;J(+}{ z?f>cXdEfVWJ22-v=eo~*?sK1Wo$IXkoxm3)9^>RKZl*F*HzV}1)1sg`NEd{UD^`^b z(J2#yiV$2w^`cAar0Ijac7#e#DhrLAG_h>d#Ik8+r6?~NGZiYw2DH`3lTD!s(fW8}Tcn&J0~Oyg%_nQS zP>J>XE7j;_9&k}9@hue@>g3IL#HsUAd+Z|Q3IRX21Kf& zO_hzYgv-^@lP67Z)n}Rw#F`?fl#H4@$_=unnSF^I8#&n5oN4KC-NBKfiNy+HW!Oxh zqoHSQIjJhPEFrkq-e^>0T~Up`6J`UP8eGj8T{|fkMwZz z|L^%>#(&!X6}iFUXL`oL?y6&Yp<~*?RjYqXy{bo@T_x*UweqbhPHXO{TU3Tlvhicb zjbeB;sJ~ae<56$~lSh?~FB&;2Gb9zIztxt$)D>U%{@-6kT?S`N6?IJDq%DwjZU0Y{ zLl-5^%*nu@b&~zxUk)Ahp`#emxzte%-PZ@F#!OQrqyKW7W4+yJZg$SAc&BW)=7uWK zxt63`m;VPfd}Ps-QPzS^?2@+QBV{Hmh>RLffWeVb6N@|A1QbIBi8KF1V66p64=^rn}>eAVy1d*K{|R*D&K9}{& z)+04nAyHxB0nQ4BaG^bGzp2mh{51znnSkMwzPgeWmRr1!xM? z5%ADM5ADzkEx2_G!A&uPuj%8M8=c!6^1*#84~_)0%rc)H`M=p^sH{=HHk2{foK}?0 z)9Ec)cWKSgld)S$ug>;U-rtkvuKLpH#+$aB=FQVf&DBao=Qv#U2Kuta^md&6gGsjA z@5tv4{poz!EhpWd-%UGb(->~;lEUn`zx48CBz>G#%`N>AQ(#Y24(T9~{Dx=^U4dEA zei@-N(p?r@EOW_lv-UN}FKZr5d2IR4t{us*Pc}72Dx&CSbF_x3yn=y83>|v-&_JQO zs~^@DsL8+#`94dax9R(3=`jezNSo$6!o;%8Yx%UL^(7-*IZMBAZRAC(4^x zMznB&ew4c9Dpyb)<(hGd&#s`n0=-c4&`BHoJ;?;6=OEq=Ew)oTPHJ#zCa#l`M-O2jQk`3~)!%nfn z^21kk6*@frl``mlv7l@?8zGO9R|SrYWRZ7Qn5F5gif()JRAKw1YjHMcQSV@pt4 ztF~&CUmvqoa?4*fm^8a(PF4>qk~N1``jXUrPh|a=Q`0M?!NOUvFcuVBM}Gl3(fP8r zBxZ{$EwSd>NWEJZGE*_YZRYYuBQyQ%8gb?BmsLAme41aibJtY*in>i4BM`eazvRXx zy36M+$M4%L+jqy6()A)pSEU)wX{BxHG!G$u$vt{U~6(+W4vsotJwdU?J z+9}mQKU$6kb}D`HmTG!X&)tT#lUQlYNR`(kSIs)wrzz(^AFq6k&`Br+6Ik`*t@N!!F{TA^kZV~b9Qooo$7`GPGvjpbMtg(-e+3>CMO#j zOrO%~*PUXe`|s)6(p{+TQl3uF_n(8!8^il*4|_^a~*?^ z0a8sX`H7R*X*Eq33=Cwt9OzFD%t&wdR+8)c{R>VP{ThOAZ`rEUP#vq$b_LsZ&PD}m z#r!sgY1(4I-#qpo#Y3ZKJJ3m{t+3jz2={}&6I+FR{4SD8TaHlV?)Nl*3BS$Zhc_nt z57O-~)7)I=(ya9yR=KpQ>z8&i5|^J&*8sOmW{bB)qh|Y^qqe=G`;{Fk-R65MB8Nnd z?-$(1$Vn$nEX(iTFC&XAo$@U=ywjhsv{OvLO<0sB7yQJea_t zyYF+Xs!Lx~5tgCWL8p@aM3lU22QwxyKe-g>3zdV|s^XNgTX0bqFdAvDC2+d5e8g_w zVzRN$wiwnnHz$rBG{`n?)zxx|qmL>m80?-;IDm~*{!?PRE57IMJC1+fUGwNxr;cf` z&rHJ=n;PjzsM|46?6xmv2m|BFf|4^w$`q?;9ldeaqjU-Hlz*KARmPL7hgnuJUFLg` zq0sk+cg2~`ch`AU_Jq0&peglE7yG_=(7`0Y!b9 z-OP4Xq`EO)@3M!kVX&KDcC^dJQNO(WLuYxIq6J-9=|+!GecfX?Y-U#dL^ zgtpSKSmo++eYbJdCvkv_)NiY??W{qE%4h;weH_s%S31! zhn1Krcjukc+4VZU&F4Cp2746Bnr}CL@-cVZ=MSvnhcY%@W+cjnqvf`7y6gR(Qr_q~ zi38P@viTLAm#Ag5gaL7z5<2d?^LGlP#SYyU^+Upm)v`be=j*8>r6L z2{wKE&Dtu$ZuBrv8PjX0f@$sRWCvWIUUt{!ozoWEKiJa{kJQB*Y_i>1Bv*cRz8}}7 z=YqN$y`;C2b{+<$&vEt7$0O^&Bz!|)`OV(fm)F^@U_WpTwj29;>(67VFl}Mno^aZO zXnH>`=W$21?mC?;RxqRCw;bDax0;(y7j@^2%xH6i(}Jd=!*-I?t^&B)HrJi6Cs@#mOYvo){n3~Eyn7(Kua!|Lt)>)xsblvma zV+_Po<@Qiu0+^K}>8BJ;p2$-Y_V68f>}E=v*y!sn!eA;4?74QK zvrE6pEy-jg*vAu0I%Q-|)IFp?%jXTDDYcp3pabX6>o$Dm)JG7Ud6}ZgWha%UA7+eX zbR}sS%KZvNG7+4R4nMYmRaILTF`Mj*P}8qXZEU=$XVSpV8C_IXG(NJ~tXM2KJKEj3 zoS42&H&IhVb!}^VGfXY#v3=cl-(*J8-KQgl3`{S1yH2Vz2ca|glXFYPc6?{yAI103 zF7nJU|0jR%!F8pwp>?T`3z>lR0~%-2xZi=a57p(g)V}H#b*?r(tS^B`RjkSHXU{lC z{iOem{c&CT5^n#g?Yj?}b=xd|T(I#zQ#jmjkJP?+9dQr7`ta#3^O-04;~l5kc-lr~ zonx`5XX!Ie85ug1zxuf+f2%Y2?$^a1$ODGE9BJ z|95>$iEG!%sni0#kMp(P8$|nU-{uoN1AkZUGv)h_cMadwe+K8*wD|9IXkYUOzyEg` z#5L!C5a&A1`Lc~XneD&9Z)5O1_Uw+|fh?1|a&D&oU;fScNuI-P4fU-G^&NcZ;Gs34 zzIA;0c_fG(>i&nS%j=q=s>HlN%Rc7^b=rGBmVepsP-q3BKNb1o>z?-9biO^hY0vuB z*0zRt-oJro-9jT`&6RORTut^Mm^&+qYwd_3-dJI9BPRQiY_v0yB+EZZ zX5jf-3tY+g(9<8TjnSV%%(GhM9Afspk{|B5IM~P(Ah5+)15aAw(tbH%vb-)te>y>| zRh(T_WlwAZf4pi2k>Tad2Dn%-+*#%9&@{#j(Z+a%U9Fl~LL#oF=_H!!#&Szb4O0xb zF3r|(h6uxwBC*7p>NuIlws<8$T}9H|%6M&@wA8VJjvI?|W?el)eqaxCme(a}%WhD%h_RuP5xIfOn777K(@?|1 zljRM(L4jm6%ygm#PPf}^XmAzcamk~R$CgOGR z8uKNh);~gfmv5_EWwA|CCH))T_-rt8QCexSY;bu>6TbVXA+FhH)sfah5I$`Uq235pc`Etih2)UGDA;>!PnRGOwqvl$+ zS^YLQI@>%kyRpWYEA_^htgm}CT0UPxRc{{`9@!5VT&Dd zHuj~xOmSRJ~Ptm9UbbwtblCwHKs$^|AvxlgRJT_VY|iq2m@G<$Zavb+MVjT*UaT%u&sovB>lB!cIPE*ju&~OeJMIal{qzWa}(Si!0O@JPqZAT)|^;_ z1!=M>0nGSSq78h>q#7d{jT^1u$y)p2117C(s4mVzR9bmfMrrdXD(=9ZO|NwO@<2nA z-8$Ac>7H_g zarahh6|RycTvHC{4#jwN0l)bpB_yggZfzNeyK~VW>_TO2l9vaWIN4wkv)d$88LP3( zjA8X@Uii^y^|X?q&1{R?8u!ZBENV<8Z_}YH>nvfka%|5rwwPnT%)H=Yq;av4z%(7# z+9Oa+@_A&b!d#b_x|qcjcY&+`Sl8pibtt#FNp1#nW05B9oTMoamDpufUD6d++zeY~ z+zdix9GgiO#D?lP)zwjhC7Zqq4vJ610WrL|X34RAXs!jT$Mo63dds7Dy~_ti=I9_^ zG}Rq!sG^xLKf4de2byBnq2Nb@kGi3WzKq50p3*VSvX?0E1Ji(f?OuoOZZI?^OS&7RDKeFcGbFLlNgn?aAe_mOWTp%QEZxTHgg)NY}{%)=L5LCQ1cTA#knXM!&3kktQBK^*E9(epMbD@MpPh=pT+GW{+l$E}9~;`Gt%hdq;FFo*Y?xSWYKRnld&qfI_5 zV^%`E8;6NAqi=!v!7IEhZZyUftL3D{V{h#-#2a1eW~0hgaW@VC^a9bEDojch)!rO7 zyO2Badb7j~VO%N3Y5eT01`I-#S)QsmPt_SLgIx{6twGa(-54#p=|612v3gU55#&O2 zd$|glM&|S00CQXvmd(_H5O#wjR0kYWB-GoK(mI({&W_=d61s`ip{h2_FjtA9(2eGj zBD&gi^l;Gwax3OMoXl^;n0OrDkAe+x`qoh{X*U_Qu?qotAzHMqf?f=dq*=6P3#sAu zqlTWo(d8LrMB)Xr=s8ow|#n(_{bs1Q7iZ+lOC!JxjHna-FHCXIP8nP#wEEZJ;WaG>uGwN8)2xhJ&J0D{IM9X}L`AC0v4)kvY;zkVVGM*( z3S2ahE@d4K%>s_;A~0)RP5aNc(gdvBqMFq<6t2ehTBcUhtKmzg;o5)`#B5;bW)X3z z%a#|_?02_ zyLlKOF)!nk1;)rZK>68Z4FwL8W>ad&GSh+@+k6qKiJ86Q<&x&qn7PI9m6k)46m`_|5&}y0a;|8XJ$+m3j-|qlIC1S3*wg7G7AfOSYm{kh z?NT(kb{hJH!%zX&q^xCI>gdXG0jv5ojW*{|L$xC$FX6(SB+CoD`0Tyg>9?C!|2Rpyc5dYS*ED9%!c61whJ)Asl%KAS}5FEZMbMiEy`9K zbv1@*5{9q1tbiF3IE@HmWL*QG5vaAcm)4!*R#n-0L#sth@d{>IYN=(k@yx+-gwb>r zmK<6gspLN@`8-YLoQq z%(cz~uydK%ve$P(n|}i&k5RS@VB;O|K;3nu`(i(CGCAH?bHV0Z( z0N<&_21Z-)((iK-(^hjw_-TMhd91;#yMb!y$hsn4^uQvad{7E4j6r*(-e6`R)?m|_ zpaI2maoB9G$(wA90(@W_MVZgFUXV6}+onlzQPJ|6CgG3cIIRNKasb!l#;{Z&CSxsc zY4GjUk0FkeN-T0)XojDxnNe$2=JKEzZVQDzBVNImp5qK_*Jq#t zrZqEcjs@4c$1`kfI)lO{4*>6xGRzFkq>*QuGaj006%Z$ZLn}pnn`vX?nG`!;i_YF1 zKnE34>t>RNd>QO>mfac-tu<(gg=RL;q|9uHVVY)=lf=Tio=FP}kC)m!n@V?MbCX2goeMv11fkSQ%( z*C&P6X{|4}Ze%^S)q{$R$7XDSzha|}+wt*ypNowlVZF6dI9A|R2kp^6`(Yg zo#-sMjkE1KHh8pLw)>2=VwQ28s@Aj2W5MbBbL}_-TS8L@`I>z~Ut=}|g4T)vpMms) zNO;`t%uV6oS|o0(7HmTMuuY7ItZxEb6f^-g__Us~1)dedwYi;o=4egMZeeqpV+oXz zl^u5G`%W|)GRM*?3Q90qDkia>+oB1 z*br@L!r^V+Xa*tUrl1XR8@(_hMKg_YD^?23v>jMtt$ktz%1!b@=b`G4lc_|X^Azp1ZH$Ib21APZ>KVH|yylrKO`)Ll@v>=YDBpZ&c>e;^IklXi* zi+@onJ{{ZM9)|cqnV(!u+&H0G^*`tvMvL(5&_nP zB&=6wE|oA*>xTEimd8+n&OXvurMp2oFs3N%owWq;UUR-ti^2MoICgW^px9i!P4y*W z^bwguXto=&<{5YPY;ujJ6`Kp(1QA4!NvF*$0P80ttN}5Xi_l=0Bu0*l8>LFeREbg$Y$oMgv?zDKd9i?PlDr`t(iR7RaI|COo$iEvk z#O`f!4Y1sg`5>>zvLr)>1f4Upf(h47Cz2E_zZ1;BCz4hNEf<)PvkN3y$@gC8(mo}U zvu9h*wvj$sZksr=kdRfLdLs+fjS$OdWr6LdoUH{gXEu)A2m>~&^5i|M01c3NX>((7 zT#|zs#dL6q1desi8Om`r`a5>6tA)0ZXlKsGQdvjcqKR6U50}vyftkJLmO<2P6*O%H zws`@#)mKW}@}0tVMjl%49ayW>$jYyamhmEqjn+7IYmB-wVQsm*6`|K^XyeF6CSu50 z;AhPFVN)motpf}tEVZ-^xRjy=b#v3edJ@1{AZXK++J*|T;C6l!(USZ8u$eAE-`gd> ziE80eYu$I>J*|~N{yhGX?OH-UBVRNlfM!T)=h4#8B0^01EH1o`unB#_NXe|9~ zTvH0yv20}B)}plOKif5jLt2szwvnJQY3*wh7vpPI8@RDwQ#pO#CexfIOt>9pS4o4x zyUq5~uF+(@035p!?5c%ixq)sDj599>O&@UW1>}%ovso_Z5+Q4-?x*V=Hqr4mUoFLL zFr(CDyG<+x<|&!9Z{i0nmSsCXu;;u;m#H0G8vyyY>KYh3Gw*L-YM{aN8E}G4VUx}% zr#PRhR(O3CWzW$}4%WDqgT9a10YE}b^{7>tEgOCTa@}m0PagfwD2by(U>2+iBjnPE zb+da#VMwIexDY!Mt=9_}S>U?K0%-Zb^n^KfH5=#BUmy#aQ8&2I)(hY_an(`>Nrg>7 zm}_F2ufw&2rtG*p590$_uGeBu?N}pCL{lxjLQ7aJC534>gT}TFqKYx7!nNr{=JU)Z z1CyHp!F5-qhinZ+6A@Y@4DFq3aZnj?T|buABWWhOiGH!|xDGYVbY3??#e;Ipw1yCu zb7tE5P18)Xs*J2DKE{+dHl)RM6}`!|TDYh(u1h1sGJeOcX9I}A=3biIBqx6d!J;Is z1h2QDHLk7wHZgO^Ej3uD9hVC**d?!RnA;RLKYcjMxVT$&1cZ*$dugJ_hU4y?S+$r8 zLvl>!m+$#uc}@S``Uof;d14kB)uk!Jwe#7ugJVi)6Jt1*CgxK(!8MM!w&mD-43TM) z=!e?2Brmhxw9VYvaU1M5(SJ7Oq0`}9SL6vBvLdq6V>TpWoy)m4%j=Ar=`hW{1#qdN zJ?E$GufetLB*3W!?HD5tr=PS!w!_2*AZ{-Z;~q1gpejaV1uYw!T}`J?Y_*kTHKMZp z)#egav%8ySn`Y-Xw@>pHjRU8C{4D^Jy9+nFd}j&P*5K(AS%&i7ayxF;-!}cRmBON= z@>}$c?xyJuTCVfhx|?ieD%NJZ5TNqrI*ae#77=Pn`i?!c{v9x@sGZhEu1j-oD$U7O z+DWEc%(W?A=w>CGFsOX#M&a6av8JT;B5-Y}1+4jkjjVV$S`DKoKu5;?z*<`#+1j%O zx01Fv$Sy0s7FmcEYrOF}hc=bXbe0qzeIRg)GY>6R7g}82@$ir(o^cd0x3Qo`t}(W- z_3WlLR-bUm`1+9TTB8IhGQO_5gPHuMSK4gTy_B5Isk7W-0?xr@=Rh2^#zGV(m%$|_ z(@2b=b*=%68-R4$dpB?xxA9<<#cI1x=y8xGxDDpmSl;>|PGUdpT&$N>@a9@u&c(Gp z2cU{J+f=Bz&M27PSOU!`u--$)qeJF*Gbr|+E`C!s41D?8q$v$l6Rkg6^z6=EE6XU& zx=#3P1{asckccp=&2etu#;MKJ9J`L&EoDkc9~k((TPUZkGy!Lo$RDaSb71rram`3F zNVl9~5N})hAn{TBG?LsaZ8v#G-@|$#&2iU(0Pd<-fM!-EZ66_-=f+65Hh?sr&HMlq z1-GHebd(?5DZ>&jXPr7?c3Eh>C4QO_!DR)(27DGJixTcMv=to zYMx|ChB#SMLefM>mvgM&K)KQ+xX%2naz>iXA&|sM&SG9Tifio#ZXHp5!Y{1VY`~0Z9UOh?3c7#r&wokSvnLpvtVN<8)!m{I?ASK9Gh*j8?|zQ=3$Y! z4p1@eS}~WWvuxhek{7FV^A`~HBs4WDj!X7qu-Iti>^gHC^cL{42uLnLrnG0V?ZO-~ z7uU;8rDxeTijZw%<+s}|#soTfLA16(idgBQ5_yXp657HNFb+1z44*kRYHzUwQt~YL zT4<&ox$72Fah!xX7^W7Q1Cx@K*hX9W0aj4J?i;w8%-?k5w;#n}KH1<_h2J)aqM~lC zg8j8zj{I$Ls}8vK(|V7%7Lyq+97~M##&EFOT-%Hgj$PVjk6Ucqgu@vOTQFU~q?kb* zn?V6C(YCZiJ+KLS;C@>iei67O&JpN-KyfIIH{O}tKe)9YcPwyCA zd{4`&o44ACe8TJB6g{!_&ShsjJY}c3zn}lrth@hI{rAZy z9=9m(u!jcLKR$``)qL)nl%_i_I%-_{S9@TUi_yh{h~*~ zh{wlO@3r*GpKV&5_{q3u3Z5+6`j!*xUg$OX<2UzQf7PpbcScX@v-Ndv_K%!(%Ed#& zpD%y)vBMHeX5_70{o3-~pT2d^DR&p0m{WJ;e%F0?`JcwOlpMUYX>BYsT-?IFHH$RIXTKnw-AD{X63$JLNK4_1T@ygp; z8}HtD^RBHcFWPWa)m}MSFD%I4ukygJQ%^4Z>k}9L@x!{(TX$=F{(&!V`Rd6-rZm3y zY3o_fFD^gmZ@)Y4;1{=fW<~E8md|^2zYo{F{N}m8|6A*;4Szp>(z*Y5G`>gUT{RoG zzJ1ZkUp#ki<#zY(@YRz&7ahOT-edOJWoYhMdtY>J&jbI_@^=2!eO@R$`|cMHd;H1Y z?zY{NHx3`aL*C+NYxW)a$cW=!dh+$>#`ixj`t9O==byUa>oDReXQpGOU#458SEf^@Po_(zN2WujKc+jTH>NYDFQzM|C#EB&AEq0o z7p4=Y52g#I2c`p7{#N!@?pEej-d5ID&Q``&zE-wYu2!a2o>rDtj#h?NepYr?ZdPVi zURG9CPF6-%K2|nXE>zIH~l+$y3TsI{B2T zr=C_`QOVZAn%dZmnRWFI@x)o|MM=(TX>FTbF!->;hYUU9$YDnvGN@~f?$PC=C&5Ew z^@7w`gH0T7>5mA7#txd)@eYUxEjP26p^1LtzncSNO9vJViLm}^t!BhpbZqfNFJ=3r zz50n(E*+0QV7t?KhMUe*y3(Z z@Kcl)Z8rxyoQmu(@j z*Mhl4jLafS=S)yGw4}C0fgyHK++G7+p_984nRtq@gu_v~e`HyNKL=Y^H_-R!LZQ`- zsniO-%lIzgyO8f3z6rk5?R(Y_e@h8h$hUxRgl`_-5Z{fQyN>T_zAN}H|-`;6$(Ah@7hJ}smRu$(E7#gsS?=hhW6BS zIREDM)YKhAp_R9`r*iNwzpXvh3Ty9ZPd#Me?rcwOge&iAPYu|H@b|Q*YGKK}?WtRh z%i2?)!`cVhQ-wL9(A0<8Q|G|^N7_@%;qqU#r{0IXmba%i!8NdO+fZoHW9_M>aLseb z;rticQ^h>%ynJPQY5^=+-JV(tTYul4D#(Rzx2MYBQdkSuz;j^E+V<2!I1JtjYvFP@ zAFeX~p*^+h_JsQr_YGIBYfoJS^VgFuSOPb}MStb^4)AZ>Kdk+b^WoHgw5NuIxqeT| z0xsP#m0C)E^~&QJQ<%R?DwUJRb>Ke6T~nzlSh8CxwHPknBbDm46W8y>-xD|PpGqx) zwUJcnbvU(mDm7qd;)jKBC9E|bkV>5cYY$AN?twY|crJAp;)VHe>LFYQE`kf;Qg|y| z4wu7~a1~qw*O`0(=kLmS1JOA+9~Q%va4K8_>)?7g2j(0~I$&T5bKrb<4O|MB!jOFoU_e&8_J3~S+h*gA&m*m0hr&)<*u;c(arOW}IB$o%6{ zsrTU`_$^!t^Y-UDJPY0j&Yy&Bf{S=2`yS(D!of{2FM@vx8YEr39=7)I)lK$FMYCK#H=fjn7F`Pex z{DVtprc%TDAg`nR;nMn4>LJ(~C!KIn0)6bu{bN_l;Cz^Xi{N~iGmG@Xk~Y$D5a*vm zI^Y_(8ZJ7Q>zE(*Ject3VF%z+I2=wrpYveJoK)%}xE?Nrtrw(H&%$9BqCapA{MO`i zIX|EKfdk;wizpAc3D!aTP%Yi3$Lz_W9<6yj_TGM*oP|BSoT3jczp*_z=EI}Wj#lQ^A~JY94?r*^|Hj5s2+{eQQ#5!Yo|W={yO*s3YKa;vf7)mz125&r7!!o7;Zc}3xzQMn;g=T)3r`^)y! zWxDQyEL3w|_6gyIJ+m5pU^He_t|{^+!mgq}GL7H%DdxL+f$*9YLSRUuSIR>$oy2vFn@=UXqo4 zT+ePVG{)jH9oU}wxQ0H~ZOXqZEbliYl z$G+)2+hW;_2`{IhH%7AewKzv^Rt{q=-y(dAx56I2(w_Q+-q2F#FIyr5SM_lbwTXSQptsWMy4sw<1e)ku68Ipo?r3vZcsq>fOi6VI8uEkbPqk zm$qW76PSa!Jx>U)&Z!8m$vHE;F6V^s`W$XHX9}{caodF>R7@%t^<_+M0jK6~9SYUG z+MYUB<$0OajRiiQ;&5Ts?>L2+y-}to_av%bg55su_>il_hSb#jT5=* z+6~Sf{(5`rG%I&vy~3_1T^yaZN5x*Zm-WnA9A4gYTzEy#N>~(L)-(IF?k$ulg5~`t zi=XiT-CXxEUE7{(l^`ol>ukq0yVP6Ljq%}i2V_m$LX{dod}mmEj449tJS(w08)tSf z>qZRH*l=EPIA^@+Q7K>3@m`EQR`J`)O8Mp5Kkj*+* znlWl6>XIDv`!DUO{Tbi*>-<38&FP=@ZMWANmzzB`dkfdf{`J=3`TfU*7xu4!#o;;q zZ{>2&a_tq2xdvHAIveo=*Iw5Zr1HSRT!zvmW@51${|J^4)YMJ?29dlo3{(ac9%|v zA1A&|srFQ*3HX=|UyZCR#Q4&#(WTxv9d>Pk+MdF!QQcmmB-h2i4>qz_b}DtcMb5|U zNddAdWM7+r_!nehC}dBv>eG#EaqbEJHzu$ow>bTqR^Im?TZw0%o~hJ>-Nlp4h^Nlk zA)@hmwv6*`<-96uTf4hI*S3!F?Mi8OQTKURl$&)8cfNV~m*i%h*j=W({>1*vAR`9d^dj*=Nae+%kf%=iCM1RO&;1 zhsLGT!?ovG-^OflK~`OtE0^Ss?jkA9%_<4!{O0*pFB6T~(ZcO%pLa~9?PwolWylJU zjo`QG`GTx^YZ)S>*5?vpJNF#IO(ooC7LLyVz6+5R=cQ8DnP8&z|Hy~A+2nCn!fOTn zy^>s)h$@1tApApw|2gg4mh~a%Yi0eJQs+*)bhS!yvvbVkY;O3d2|lg)%dn&b+`gxaGe^ce*#w*rSKC^2PkI2pET$?Z2z&y_}7MUxLQFg8?kCUG# zyH=r3FNbZKD0C}fL%mWdgMCc49M89$pDDAsr%lM1a&jLFw+`9o$m~AsQ^5CgWE+va zW&&3}Tw8UxIGo73E3^3@ksInouzVt2Od1y3IVIugS(k4Y&cXQGHHtYF*)x?o#E$VX z*;Hi1k-7VmtPWW%vLG!MZVs|4WWarFe0U9>>B#mrNl7?w5|!V=-lOx+G&vuWtw8or zmpETXwk#t~vs>$t-Gl5)JF&A~-GpADm*~~#Tso=#XYp^IXS^~udtTP5fymoG+PA8` zm|wAYCYf$`^ry1U-|jaw>d#YhtE}gT=8kk$VFVS%V(U3CdjYy)>24*SwZt>m;^AYm z1<0oE&0LI=_%ZYnWY-{Ly2$0lSn|TkV>$B0f!vLg#+!+B$6n{yl5UP!-fraBt-&$! z*5Wg{DcU_<wFKBXWjF=c|9vB7|fg-vrP(q63o)Oob&GKCcf3k zU;iJ(m&3g3hHm1EAm4Sre=U7hK2tew0OuXeZyU$X&1!b#WB1(5u~Lqe*|9G798KTz zxZKQpju7-7&THko1$G|#lvPR{EXh3;cTDcMaE`^jnlSJGi|I9cl*4@Sx13jRaXXuU z_Rh2M+IhZuPzpBSv1<$=Y$0>f-KF0K<-W{L=#+lTlRD0;<-B2b4VNd4E>G;(e2y*H z!m(R9wyc|DmhKfCd!1wdOu9D^wpZj|OZTo^qYs0GLeA@|yTg&&oczD4yUm<8rc`nW3%HxLn^#1q6bp~ab9NMEa(em_vzYh`+1`R z)*-46?A-1aBb$yaVf`{bn4r*9WRLez8zxyDvXxzAbCA8>MRpCcbzNjjk!|QAdmP!O z44KuV)yR7GWj>tWzK)&d>X@Zz1IKbW=Gs;KX3ImYi|mTb`fWb^iI|fUaz}EOonz}P zeKO85*$`v}U1TN5hG)oz6YdOTCCJ`;u6>$xEsvPk(jBAAL66q@E@2i=(mJwG_4t8Jjkv)#=K#QM` z*_6e|)*#DEk9CN7v-vpJw`DYuoxK5-?PkE3o-f=$e2Z8My#AkwZ^_o#En6P)JKY$L z!mU4~b04o1*{-Y`vW(?E*7vGH7C{y_33{NpoQ^q&%=yqlCX2hd2`d9zYbzn1ixrQ` z+4Y&#-!90SL>Y|EDAh44gLJ|B{=+8XT0mT6iR+I{l)l^g-8INXYys<@FRJgKIX~59oQ?KnPqM7seBe>+=F2Z4uDk-)<}^>Vnf)HaOi$J$UV+oP zRFrEvvVwEp=iF~~?q=!e$lEdD)jhJ$>t07j26Zlvg1hFhRO(dXwof77KFHP~TV#Un z>(}OE$0GXD8Yo&EwZt);b=n@5Ut5SH`!ut;nL}TuW6t%lm_50NIC5CCeV^aH-$Z6; zyyfinnDA0&<(Bo%x~EG#MQ%=d1LxbC@6B5(GnZEb(s{1^5cFyX@MZ{Og+VB_M#OKytG^arozZ^a4HeIN5Xch5n8qOX7%b${P zAq}frA2U5!&#^O({U_7BqDOY9dxdrLH^Yc;7>&m{$Ez<&o!-pmva*py2fkBr(t)(J zG;{81&ON@H``v7wbxv0He|4XKt~@ONo+Z8&MXA(FiZ65C6un5V+pNyYo^1KoWjT!5 zYHt&^XAQfgIF&j8e`rED&uoI-Yais(k>6nQ?(dcQ*~-mgiqdwb$klCIFMpPE7wg>2 zx=lK4PM33SRkQQlt=XN$oSQ$Y!xmZIEko7^*~33v-L2(ZpChGv5YuM+1p@iwDz&OS&Qu3@u}3oCSd$KL3NX^Xy_u228^0>|AcC?$!q+Ql?^Lo-VJ7RNKn>RA9&R#?m8;CEzlsyU-A2v9%t>~~b znky^K{^v5C`9)N5;va2kt)59_7A&X_Ehor{BloF=ulvL{Wj4({frUO}+X2NVF z%)99@Cxln@$hyu)G$z-=EF#R~Q@4CA)2YV^Gwf9Mf>=B@Cx;oaIXOGFhGX||>>+=Q zB(Sc*K|A(2$4XDzd@j$9LsooaYFXq7Xk9?{l;$>o?|_i5B1zu z$MeM9#eKv+Vn1<^c!YSII9ePpP7zNNE5w+1*53a5XUX3po-1A?UMgNK{#^Wpc&B*3 z_-pZzJ$?L7%m0G-iuk6uR(xOVrF{9D{GW(lh~EbOh>t%@dX*!F#a+a`!~?{B;&}u7 z`OSNH7D#@SSSZf!?~j+rKS?}AJX5R^XNryDZ1H??o_Lw~Q}IUecJUtZL2h4A+lo7gJBxdW`-^?V{^DTqNby*4q&QAIQ9MOFQ>+wY;#p#=c&>P%c(CgKeEDDA z&!_(~`L7axCN36#A>JYWQhZ2!OngRsLHwQghWOv&AH+Y4ABvxdUy9#}*|OK$iFx84 z;=W=ZvA?1B3?DP8&`3uA&#Npydu|%9Co+O?rR*Et4EU{HQ zU%W)TLcCVIUc6bnOT1tFwfLm?toWk%iujheR(wbNi};cFx%jo%L;Zzq#2v(4#XZIS z#Xe$xu|PaR94;1#W5h|~$>JGeg*Zcui?hVD#W~`9@pAE6@jB_(4f5Y6-Yq^LJ}N#V zz9_yXzAe5dZV*2gzZ0|e@_Mw57#4RC_Z0UN4-^j(3&bPEW5rS8cyWsOh58ex$zLwk zhz(-1*e0GYUMwyUuM!uDH;T83cZHg#v*JtQB=x&j%m0@62l3D1hvKK=*J2N~ zi`$5~;x1w@F(UR62Z}?*W5rS8IB|+tAp3BE?DA=n|459AGsJ}0BAzGC6&Hx}`g(o1 zQvRQcH;A{2cZ&~+kBPq#SBYP5iz1uJ||c6Y*=Y zhsK#(i#v+F#E95e94HY_-47{~g5L#J$A>#Qx%7 zahO;rjut0~W#Z{#g%}g#;wuxP> zFYY4lE%p}si-(EFh>hwujg-GcoFJBor-_wfOpJ?7Vw-q@c!_wqc(u4lyh*%Gd|&P5 zUGm>AE*D=`dY_R0H{y%p+v;z=BL7=~T;yp}H?Q)6xIz3x+$4S{_B_Cc-&WjF+)dnD zJV4AB4;2p+j}(s;i^T1Y_3@9Ee}Xt!?4x>eiu^wkqv8y)QEV0Gh?j^@|K86hT`vDs z;?Kn;;+^7s;v?b{;xpn(@pt0u;@jdo;s@g2#Es%6@jJ2Sfj%EzR6Cd}|IXrG;{M`+ zVt?^4@hGuSED^_xCyFPFXNr|#t(Xv7#B;@q#0BCt;?Kn;;%(wR;)CL2;tKIO@kQ}f z@h$NW;(OwU;wR#l;&)Xp^`6q~F;;G_~ z#1Du1^j6AWD<;HQVodjWuKX8@mx@=4KNS~?H;cE6cZ&~*%f)M@mru+8g1Ab2O?*>) zTYN`cFaBNpLi|q5Qa^lKaYu1iaUbz9jWZ6EKVKXu9w8nho~HOm$bW)3S)3|P7i-11 zI7>WNyjZ+Uyh{AJc(ZtyxJ>-DxI+A`xLRBz{z?2m{JZ#t_?_7EV6PV+DnD}NUs&wr zyUM?hc%ax{94sCs7KtU|iQ>uPnPQb#C!Qs?iUW@E*PkQ*#o|xItHkTX8^m9TcZtiy zN5sd)72vUrC0@)17%a`|h-da+q-6VDUpiVMWU*ZTXoTK?d>GNmue=TP9^Y@!0?jY_e?kV;b z^Tk2pQ1NJSgm{8DSv*B-S3mI#`E%4iEtkJW9Ce6KSDpMVYkYn-$-iQtKR#RjH>Ech z$UjfKT-;07xkmnr?cgsD_$aACSEHp7Jnh$DgIJ? zNPJxUjrfxIs`#e3R(wbNtN5w-uJY|G`BP$!=9xa$eTU`WRoqjIh<(LF#i8PGag;bt zEEP`?en0kMdGDmU$q-o%KuaGdU1((r+B~kYjK76ytq#DaxcmMU*g;1 zJK_i8hvJdSzm4*LA$}|NlwHdecNTkz`-*+V{^DWcQR11h@5jqOMw}@2QTof|pDLay zR*5skCh=_XLh({@q4-nrM)4N$4)K@bL*nIHmw#0LT=lP?lK(mJW$`s}kJyZBf6KNi0f+r_OkPT5}ES-e;A?@exJhgm zw^IB5hRU%*>rgvLzKgi0_<`)^Rm$)EB<~~k6Ym`({gs^7PB1#F%)N*eaecULsyD{#3j{yj8qgd_a6ud|G@#d__D-^IdPs z{|E5{@gwnb@f-0)2 z;s)^u>G$XImni;kn`5EgZ#UQdx{aU{}Dc1-@q>(Dh?Ho5sw!~ixb5u z;#BcRVpNOv@mcXj@l|n+xK8}5_^G%_ zY!|m0>ho!Pac6ONabK~I*iS4Fj}(s=U(fULmB>FqJV`u5EEi*9LYyU@FU}J$7k?_= zAl@S0DJ~Nq5uX&F6@M$fBEBX5QG8$goA|N#h4`)5L;AIixV^ZuxVP9_%oh(8j}VU* zM~DM7A2&w+31YeCJ*UWjnmA32igjYMc(!at`MIW zSBbBRZ;ETh_r<@78^tfhZ^i5*y&mO=JBYQTynGk=_Z0UR`-%g^!^C0YvEoRvM4TX& ziKmOx#i%$#Oo*-GdEzDFW#YBs&&8X>+r+!X`^1OE(XxM!%D+NhSpg&$p5MMjhJ%>Pj@6as&+2Z-)#o_|-D)Bn;8O__> zEdQP2ed2QQX>p~vT3jQp6F(3?6h9Ha6u%R*RZcl#SlmtATRcGQFBXXVYd+yf`HvIN zmHiwc|5$ONI7OT)P7|xd8RA*uEb$!i0`U=Df1do8i9eCvUL*f?;*H`h;+^8X;zQ!E z#TDZ7;s9OmCHYs2Ys5c_e-=L!KM}tYLt4k$O3W4W#684)#NJ|G@euJaahQ0VI9ePp zmWflva9Ns#oX9f3f%%$uE=t3hDjT@?R$|5pNgo6@Mi@EM3^b#M7~ zo9Xgbiw$D4*eW|ZTmJLKeAUlOxI%nZ{H^$^_@?+L z@dNSi;^*RL(&KOC@1gn29C1f+4{?9-An_1!h&WsvDUKCS6sL;Q#2T?dY!chV^ToTA zk4x15zFOsf(#~EFE>^e&;yCddaj|%dc$c_Ld_;Ug{Ehg6_&f1+ajp1{_!seG@eA=g zajWBeI&;N5aSw5Sv5$C&c({19I6^!@oGe}>J(?>2bg@>9i!I{0;)UXT@e1);@p|!Q zaqTYtKJJkJKJn-Kc=;ppKOsINt`uJuUlZRF|0upEZcurDDF0{TChFU zUs(R##7`C9KJp(Z9wH7Bj}(s=M~M@}$>Pc48DhCuBi4(JVyk$rc(Hh?xKO-S{JHpu z>g7%H-!5*edV9D0%fw%aPl~@0Uld;vUl-Sk?}&d9|1N$e?yl?oPU}3IBySgc7W#77 zPTW!4P25*JQ0ylT5{HOKiG^aZc!F3eo-AIZ`K8n4_trWTs_g0C3lR8&znK>J=X5!K zmHgZL(|FOE|FMJoRqh3Op%AYPb)SNt`1|GcknWQs@~TYt8K&d*o;CXf$N6(B?scxq z>>X}=?9VUQXO6v0k&pe^3;V3s@!%c4pDBF`=H69i;dnK1r;knxO@G;^&%3-ITM@f= zw{Zr4-o}00dtCXI=UxKbAz#Y-(CrhXyY^}C58m%;?>w^)uMc#eAlx^4T`l?SMD6n1 z-{rIqZ#8!JAC$vJ`J3&#uOAln~_D8MeTyYOcJvUvM*Lhoa7f0Gi~ zFv%ky^Mg+yKbhYae)UEtPRko5pYy4gyTA3w&#NUb{JgW=-q&dHgud`{_wICluHxGx zw0CIT8$Lga{Na$j6V<}c$@e+w{$3igFN5%}EB}?z+dvmjP%e`18OUGj9KK&5|F6#S z!a)9NXZd8w=P3RnrLzKgcllh8+|s{ng8~Y1$=7v}UnqI-o}A#UMab>G61py4_qo-{ zcMk>aSP=dt#S^@DCy>A8!tWLe+QmTr1@i9F-yXzs3P1Q%>V$2{7N-xAyT8Z9vE3zK zcbX4>y29Hq-oh82?&V)gZo>p8Kf}x2donp@%Z(-vo$2LO`0aCs0e5m-Jck%BXDtwb4eAEnvOl_=O z3MAiA;s2m`=FIT%TqpTIB#+GWa`$(gIK~^P-TiL7$jjZ|Za^N9y!6Lj9@Lkk0{H?j zKTq+Wg1ozOoTl)R%Y67ee;c6$@*bg`Ly?gZ_`{(_g)g|m3$EAUxeC9e&p_e}Q>EtGwVk?(BvNP2RI7l+P}eEOX}pBG48hj;H8Cj8S|xbEv)kbk@dxplnlenXplT6a=5?I!t(^Zj+L-LlVM z$qVOudC>1a&dGh4Ot(zo6J{{^T&07}TL^!p!mrRDLpfIA?~uH}{Q=QX=xE99@0fO% z&o3$b#@qdM>vUg#*h2VE6n^4B%z+sG|6|{#>?~6F*#WBh~$OtkGF5V@Ao26In$nz-of-dF06^738ZH3DBOvS&KlgpEVgA~4NyLR{%!k@SWdDRx= zNyT4k9UeaJ?|#4wB`@sj<;tee)q#ADm)EmY>tl^YM(=pfHkh~BRq}-HOVb>oev%h<$+u$3*L5k!$&#;l z!e7_@EdbJcmXl{BTtClI_~~8JbCu+YW*<+WKX*yKO!^ko)2Ad~p>{B6N7gy{=GXm5 z;aAI!1@WJ@1^XYu@LIkVjQ8nre+!sscX#s5yj75ynKY>c~|lkUD}avCC~fT z2VCV(3++t1)?GVzyt9XjGz0s&@Ohzitv-UFJ`R&SG26=@(K+@vUoGF3DBl9RQM-lf zp1lS6rHW^n5+00q?nZ9*xof+;d<*g1xrOq2N%1H0eEQwrmH%I@U2BXaS9QKX;0F*f zwj;4TVvUSVkcd08GrMaR2W4h=_R(Y?lbx|0g2dhG>f6(msjjN6s-E4p4O+>(ECCuB zM390d8}W*eV3CY)93jjP#|aQ=i4^_>SsR2SKqwd?A&6p$@7!}vbyZC_;zvsM+^SRO zoO|xM=XGyYZDR~S5%`TiWB4sHt``Nqy324{SJUwZIOZ&U((lC1g0Fcv{Q4mCG1A-v z_@d|7{L`PqXEF!=@ErK3Jsf@^@@t*&1mHKl^!28_Kl3fYUl9GP-+f=;7awK8eH`eFOW^MoxLIQO zIydG4g-hXf2jUAIdkSyWS8qX=v*dqN@E2SD`;5RB9&F0 zU4d`BjO95Zdi#Wj3sSB5!W{TF=fJ-s{LLli|8l7-o)`GW-!uFr0{`_KJ~v|tMDb^F zh4KCG-9xT73;bfs-rnKiHNoZdyx{NsA@lhhH>NM}t4}cC2ZH}Tz!$K;@z=6mR*nw| z{>GDxFO7Lb;0qGx)o#BkapvmJn8TZe(PssJPyFlO1x~+zOXI!xapo`6WBys-OJ8UB z8@Vyh3H++q`J(XorNG8hY7dA1N*>qs%bj!ZPYM1tsjogI{l0q+ek%Ca zKf;2mzdQ{1P0;hI)aOgW=Mll*5WiEqrRP30FYS8%3BkW6_2)?VJS*_kpD^Gru-`$) zca^{B8D*P4{!8FDXhRamSNvZr!v+3A%ieB=GH2=Y_BrsQ9u9k!^}E(lf2HtNyn2to z_a17>vn%k&{)OT17dapGaJi^8UlII;XBq#8a_@t4>f7%L{>BFxKjX$cCvYQmpzc5X zW=_9z zKH2A4o(Bd0Ie~91GyJ;(|LGh)FADzBZH)g5!KdF3rnt1!@{2nJ{+06HZV|YV{Qi*0*#Ue}&g;!-<=Uj?=T8azMk_vlPv9^71KW?heqnwp@WuaS2LHpi z&Ho8}RrZlI4!qL)Bkb*88Sx3}_gP<;)-}NAe=7J!)|Iyj3jKbuuODPTLG#YL1itzj z<}c=MdVni!y_feYe~Gt`$jvWN{Cp{r{Ea%cF^>s;_6g?yZPEXiJ-mraSKk)=tF3+A zhvwk__Z;|dgwKM+J-D+!KJE1^7q#Y92!P(NWuGmTd$)Rc4N*@2d=A`fhIx6glNxJ- zUS!K)+l+!J>4YX6x^Ty42;jiQmW zqFNwG3+2pA{*p+FtIKv^NAVcG=TniG@5{< zc4dKCHc-QNZk|5}fiRhcvqN{~ken7}9wpm`wP1^#DC7AlvLJNECB-;*X4{oE?ftC_ zOAD(QnG7_gWm21!xhmQBLh$}L>x5}ilv$o;7?6y1n5H|0P}5X7CG-p%6hXi5`?6&! zT{mtELqA7m*X2c&CS;^EOuOz#k)1dVgE)wz0A2cF`z{q{oW)T{wvxNBj>;^KV>W`k z!6SDWtlqIyQKC|bdyGq12^1_QS>{1f4AOjL{*pk44=&pp2$!ZH;c{C*wY`;PdKWw+LjojGAeg~xLT{cU;!S|hWRZihSl0hx?Tc2`fG=^i_7 zmpjXy!#qSNBX@laJIq}dwSZ@Ti_c+_+GX%}ZMZ%A}3O=B}o;wYJp zjfTSAlDe(Ck_AcMKtoBGO)B<;#qytWB@e6%2R;sy+JtXMWwh&+ErgU0XpfcG7Jx%3z73#KH8Ukld7vYgTWw2?lvOvb{-(fH*txkX*CJLUTc?lFl|L z8c8Rtd3d&^BK>e{t1bXnz?K9C}6NF1pdHk>Ge zQtpRJkk*Q(KeSy`N6j+ubo&%tA0vm83&CZ@u6ixPVUp&E@!J-mJ{n9!E8U`-_?c-9 zl)|gemSjRm^NsmpcfiouhANdZoKpvBWH)uk~4p|DZA6yqX~8RnHl z(-@Ht!XroTI%+Ekchq;tUgR7h=w3?7;6f$Ae1%l%KN-ZJW|5nsP!TW=ODZ0`S$V&y z_enN-#wFY3P@&|-8&Cpi2};yZf|-I%RMRB-scd5!YDIzE9cKeoHrtPPLnG=$`cH#? zrOuHXArsHg-0!q~%Dh?bilUMhVb(j-CV2*Hu z3P(_SMlFhaxeStUIxVNGQr_3DNEIkZ3ws$8;OlXjpg}w?bS|1+P#5|F7eOS}y-~1{ zV$P~Kd^#wmDW*!(VH%G|2_@+Z0qDyQ%O}O%BFsm7f=QxIdj_d*`SrAxHhM1 z0`WB0n{|lL)5T^dObtVhD{*dw7Pa)@t8P&YrwxvhQ)`(Hk8PC7Op!<&g}k&hFBPNXz*u9yUs{YCT>l%-7xt6~qB}Pp~fc z)eVxai~Cx4P=&ZWt;2kIh?Q$!jTHt;OKceiE3vLtU)LS;YkOF%EQ3&zr+sw-?g3>g z%2=BPRW8Boad!9lOgrEuorJqIbBPL4MIa;-Xq+lXsWT|q`-*yB6lmn>apsFdNnVv| zr!HL!o83feI6DZpBU_vl@nA7z$(6-e+barmk0pZ+z*h*HoSkVEA@Ya$Btsb(#x6+4 zSp)ebk{lGM(3%^RKJLY;i#&UsYw4JuEq)9x{ zMbfmE)ClbD%e!NnP|Kx?fsFSoYNe_$tl3f(i| zr(G-+PW#;q7EtEE7i`d8na*0NHOw^}MseS4kLKvPVKL40gnb~cyt!*x|M`Ut)~DN* z534d!q0nB2-Cgz(nD@oth_sl~DvLGNP1IQYVghc&b6t0%hG4S_WDFnmTSJ{va}BX} zs-#o1;jwX8yPQW@1678`+$%%#YiVCwr+IXL;P*&~B?=H7DorGf(^{-pWqYG;lHz*W zH;+y_oW}QBW#iYuGgrZNwp<5S6)^S|iUL&(ulTCrP%fzkqauhzZ8M)nqVlo}c5Kks znL?cK-Bp~JH0xm-VA&33tw&2Bs;8RU9Ac{yDB6A2mRaN$*py-nDzT?)Xbp{=A*Oq> zhE}84i=@gayb{p*%Ufx~5ZYZ>#;z^aA{CPr+$}hO>`MoxQ%pu>&_fIF z_w7*6e2tu$PLg6%ayuD!Xj2q>P?H*{H%2tLGwKUy?O69t+L`z0RFj!bf0CdJZXvtB zgDgcGpN$KPd%24PB9OBzE=|XWrVdU!+bJ&T1j;oXA7wkVw+!sm?+$d_PaHT`~B@wBDyi0E5jz1Hu6wcQi?w)_G%AH@mjRO$8m zWNr2Pq4)sejm?V=^Y?GwEf2xy}s|G z?VE&On_jQK*`n9?-nG^DO%%VS4)cuA>-_6`joNGYK#Cfl#*<;DBee`5I;x$*Ib@KtWL zpDzJc?_d9Yf{Wi^!aboUS~`?o+gm_fr?1{;ewqoFn5_D%{VL#fASPaw{Q5qe&>yHA zn<*BRP}*Ci|8_r1LjTqlKFLZ)y=@KA-@hpIPyVsL^#7j18cucG8o%hh4V9fS`R{?} enCrcGZ=il?zY4?aPBZBf`fwD-pR@>Cm*%&Md)(>( diff --git a/build/main.o b/build/main.o index f1d59045d1dc2227586270ace6d052415921fd8e..526f0c3961094bc3524ba626133279cc439efbc1 100644 GIT binary patch literal 105832 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 literal 112400 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 delta 470 zcmbV|yGjE=6ox0uqESd@iWK4nHVSXsT9OMwFqW*E+~j>5y8$)X{VVomcD?d z5V5ln-$Ibof|aEcR|r~(-8t|d{_lKc8I)yku~O??u5Q;lH@$0E2M7SDo6ioR$VDg| zWAxZetY8^6loHJ1gmNRfv6KlV1hZTx$`T7keRJC1D30Xe@xk5x(6w8edjNo|K_h5~ zg9ad+Vy=|t)Zb-T#3a|6S{-AVOOh~=DXT>+X` #include #include +#include #include "ginxsom.h" -// Detailed debugging macros (matching test_auth_debug.c) -#define LOG_STEP(step, msg, ...) fprintf(stderr, "STEP %s: " msg "\n", step, ##__VA_ARGS__) -#define LOG_SUCCESS(msg, ...) fprintf(stderr, "SUCCESS: " msg "\n", ##__VA_ARGS__) -#define LOG_ERROR(msg, ...) fprintf(stderr, "ERROR: " msg "\n", ##__VA_ARGS__) -#define LOG_INFO(msg, ...) fprintf(stderr, "ℹINFO: " msg "\n", ##__VA_ARGS__) -#define LOG_DIVIDER() fprintf(stderr, "═══════════════════════════════════════════════════════════════════\n") +// Debug macros removed #define MAX_SHA256_LEN 65 #define MAX_PATH_LEN 512 @@ -30,10 +26,31 @@ // Database path #define DB_PATH "db/ginxsom.db" +// BUD-06 X-Reason header constants +#define XREASON_MISSING_SHA256 "Missing required X-SHA-256 header" +#define XREASON_INVALID_SHA256 "X-SHA-256 must be 64 hex characters" +#define XREASON_MISSING_LENGTH "Missing required X-Content-Length header" +#define XREASON_INVALID_LENGTH "X-Content-Length must be a positive integer" +#define XREASON_FILE_TOO_LARGE "File size exceeds maximum allowed (100MB)" +#define XREASON_ZERO_LENGTH "File size cannot be zero" +#define XREASON_BLOB_EXISTS "Blob with this hash already exists" +#define XREASON_UNSUPPORTED_TYPE "Content type not supported by server policy" +#define XREASON_AUTH_REQUIRED "Authorization required for upload" +#define XREASON_AUTH_INVALID "Invalid or expired authorization" + // Function declarations void send_error_response(int status_code, const char* error_type, const char* message, const char* details); void log_request(const char* method, const char* uri, const char* auth_status, int status_code); +// BUD-06 function declarations +void send_upload_error_response(int status_code, const char* error_type, const char* message, const char* x_reason); +void send_upload_success_response(const char* sha256, const char* content_type, long content_length); +int validate_sha256_format(const char* sha256); +int validate_content_length(const char* content_length_str, long* parsed_length); +int check_blob_exists(const char* sha256); +int validate_upload_headers(const char** sha256, const char** content_type, long* content_length, char* error_reason, size_t reason_size); +void handle_head_upload_request(void); + // Blob metadata structure typedef struct { char sha256[MAX_SHA256_LEN]; @@ -111,35 +128,24 @@ int get_blob_metadata(const char* sha256, blob_metadata_t* metadata) { rc = sqlite3_open_v2(DB_PATH, &db, SQLITE_OPEN_READONLY, NULL); if (rc) { - fprintf(stderr, "Can't open database: %s\n", sqlite3_errmsg(db)); return 0; } - - const char* sql = "SELECT sha256, size, type, uploaded_at, filename FROM blobs WHERE sha256 = ?"; - rc = sqlite3_prepare_v2(db, sql, -1, &stmt, NULL); if (rc != SQLITE_OK) { - fprintf(stderr, "SQL error: %s\n", sqlite3_errmsg(db)); sqlite3_close(db); return 0; } - - - sqlite3_bind_text(stmt, 1, sha256, -1, SQLITE_STATIC); - rc = sqlite3_step(stmt); - if (rc == SQLITE_ROW) { - strncpy(metadata->sha256, (char*)sqlite3_column_text(stmt, 0), MAX_SHA256_LEN-1); metadata->size = sqlite3_column_int64(stmt, 1); strncpy(metadata->type, (char*)sqlite3_column_text(stmt, 2), MAX_MIME_LEN-1); @@ -151,9 +157,7 @@ int get_blob_metadata(const char* sha256, blob_metadata_t* metadata) { metadata->filename[0] = '\0'; } metadata->found = 1; - } else { - metadata->found = 0; } @@ -195,13 +199,10 @@ int file_exists_with_type(const char* sha256, const char* mime_type) { struct stat st; int result = stat(filepath, &st); - if (result == 0) { - return 1; } else { - return 0; } } @@ -214,26 +215,20 @@ void handle_head_request(const char* sha256) { // Validate SHA-256 format (64 hex characters) if (strlen(sha256) != 64) { - printf("Status: 400 Bad Request\r\n"); printf("Content-Type: text/plain\r\n\r\n"); printf("Invalid SHA-256 hash format\n"); return; } - - // Check if blob exists in database - this is the single source of truth if (!get_blob_metadata(sha256, &metadata)) { - printf("Status: 404 Not Found\r\n"); printf("Content-Type: text/plain\r\n\r\n"); printf("Blob not found\n"); return; } - - // Return successful HEAD response with metadata from database printf("Status: 200 OK\r\n"); printf("Content-Type: %s\r\n", metadata.type); @@ -296,18 +291,14 @@ const char* extract_sha256_from_uri(const char* uri) { // Parse Authorization header and extract JSON event int parse_authorization_header(const char* auth_header, char* event_json, size_t json_size) { if (!auth_header || !event_json) { - return NOSTR_ERROR_INVALID_INPUT; } - - // Check for "Nostr " prefix (case-insensitive) const char* prefix = "nostr "; size_t prefix_len = strlen(prefix); if (strncasecmp(auth_header, prefix, prefix_len) != 0) { - return NOSTR_ERROR_INVALID_INPUT; } @@ -322,12 +313,10 @@ int parse_authorization_header(const char* auth_header, char* event_json, size_t if (decoded_len == 0) { - return NOSTR_ERROR_INVALID_INPUT; } if (decoded_len >= json_size) { - return NOSTR_ERROR_INVALID_INPUT; } @@ -447,618 +436,58 @@ int detailed_signature_validation(cJSON* event); void analyze_event_fields(cJSON* event); void hex_dump(const char* label, const unsigned char* data, size_t len); -/** - * Detailed structure validation with step-by-step logging - */ -int detailed_structure_validation(cJSON* event) { - LOG_DIVIDER(); - LOG_STEP("STRUCT-1", "Starting detailed structure validation"); - - if (!event || !cJSON_IsObject(event)) { - LOG_ERROR("Event is null or not a JSON object"); - return NOSTR_ERROR_EVENT_INVALID_STRUCTURE; - } - LOG_SUCCESS("Event is valid JSON object"); - - // Check each required field existence - LOG_STEP("STRUCT-2", "Checking required field existence"); - const char* required_fields[] = {"id", "pubkey", "created_at", "kind", "tags", "content", "sig"}; - for (int i = 0; i < 7; i++) { - cJSON* field = cJSON_GetObjectItem(event, required_fields[i]); - if (!field) { - LOG_ERROR("Missing required field: %s", required_fields[i]); - return NOSTR_ERROR_EVENT_INVALID_STRUCTURE; - } - LOG_SUCCESS("Field '%s' exists", required_fields[i]); - } - - // Get all fields for detailed validation - cJSON* id_item = cJSON_GetObjectItem(event, "id"); - cJSON* pubkey_item = cJSON_GetObjectItem(event, "pubkey"); - cJSON* created_at_item = cJSON_GetObjectItem(event, "created_at"); - cJSON* kind_item = cJSON_GetObjectItem(event, "kind"); - cJSON* tags_item = cJSON_GetObjectItem(event, "tags"); - cJSON* content_item = cJSON_GetObjectItem(event, "content"); - cJSON* sig_item = cJSON_GetObjectItem(event, "sig"); - - // Validate field types - LOG_STEP("STRUCT-3", "Validating field types"); - if (!cJSON_IsString(id_item)) { - LOG_ERROR("Field 'id' is not a string (type: %d)", id_item->type); - return NOSTR_ERROR_EVENT_INVALID_ID; - } - LOG_SUCCESS("Field 'id' is string"); - - if (!cJSON_IsString(pubkey_item)) { - LOG_ERROR("Field 'pubkey' is not a string (type: %d)", pubkey_item->type); - return NOSTR_ERROR_EVENT_INVALID_PUBKEY; - } - LOG_SUCCESS("Field 'pubkey' is string"); - - if (!cJSON_IsNumber(created_at_item)) { - LOG_ERROR("Field 'created_at' is not a number (type: %d)", created_at_item->type); - return NOSTR_ERROR_EVENT_INVALID_CREATED_AT; - } - LOG_SUCCESS("Field 'created_at' is number"); - - if (!cJSON_IsNumber(kind_item)) { - LOG_ERROR("Field 'kind' is not a number (type: %d)", kind_item->type); - return NOSTR_ERROR_EVENT_INVALID_KIND; - } - LOG_SUCCESS("Field 'kind' is number"); - - if (!cJSON_IsArray(tags_item)) { - LOG_ERROR("Field 'tags' is not an array (type: %d)", tags_item->type); - return NOSTR_ERROR_EVENT_INVALID_TAGS; - } - LOG_SUCCESS("Field 'tags' is array"); - - if (!cJSON_IsString(content_item)) { - LOG_ERROR("Field 'content' is not a string (type: %d)", content_item->type); - return NOSTR_ERROR_EVENT_INVALID_CONTENT; - } - LOG_SUCCESS("Field 'content' is string"); - - if (!cJSON_IsString(sig_item)) { - LOG_ERROR("Field 'sig' is not a string (type: %d)", sig_item->type); - return NOSTR_ERROR_EVENT_INVALID_SIGNATURE; - } - LOG_SUCCESS("Field 'sig' is string"); - - // Validate hex string lengths - LOG_STEP("STRUCT-4", "Validating hex string lengths"); - const char* id_str = cJSON_GetStringValue(id_item); - const char* pubkey_str = cJSON_GetStringValue(pubkey_item); - const char* sig_str = cJSON_GetStringValue(sig_item); - - LOG_INFO("ID string: '%s' (length: %zu)", id_str, id_str ? strlen(id_str) : 0); - if (!id_str || strlen(id_str) != 64) { - LOG_ERROR("ID string invalid length (expected 64, got %zu)", id_str ? strlen(id_str) : 0); - return NOSTR_ERROR_EVENT_INVALID_ID; - } - LOG_SUCCESS("ID string length is correct (64 chars)"); - - LOG_INFO("Pubkey string: '%s' (length: %zu)", pubkey_str, pubkey_str ? strlen(pubkey_str) : 0); - if (!pubkey_str || strlen(pubkey_str) != 64) { - LOG_ERROR("Pubkey string invalid length (expected 64, got %zu)", pubkey_str ? strlen(pubkey_str) : 0); - return NOSTR_ERROR_EVENT_INVALID_PUBKEY; - } - LOG_SUCCESS("Pubkey string length is correct (64 chars)"); - - LOG_INFO("Signature string: '%s' (length: %zu)", sig_str, sig_str ? strlen(sig_str) : 0); - if (!sig_str || strlen(sig_str) != 128) { - LOG_ERROR("Signature string invalid length (expected 128, got %zu)", sig_str ? strlen(sig_str) : 0); - return NOSTR_ERROR_EVENT_INVALID_SIGNATURE; - } - LOG_SUCCESS("Signature string length is correct (128 chars)"); - - // Validate hex characters - LOG_STEP("STRUCT-5", "Validating hex characters"); - LOG_INFO("Checking ID hex characters..."); - for (int i = 0; i < 64; i++) { - char c = id_str[i]; - if (!((c >= '0' && c <= '9') || (c >= 'a' && c <= 'f'))) { - LOG_ERROR("Invalid hex character in ID at position %d: '%c' (0x%02x)", i, c, (unsigned char)c); - return NOSTR_ERROR_EVENT_INVALID_ID; - } - } - LOG_SUCCESS("ID hex characters are valid (lowercase)"); - - LOG_INFO("Checking pubkey hex characters..."); - for (int i = 0; i < 64; i++) { - char c = pubkey_str[i]; - if (!((c >= '0' && c <= '9') || (c >= 'a' && c <= 'f'))) { - LOG_ERROR("Invalid hex character in pubkey at position %d: '%c' (0x%02x)", i, c, (unsigned char)c); - return NOSTR_ERROR_EVENT_INVALID_PUBKEY; - } - } - LOG_SUCCESS("Pubkey hex characters are valid (lowercase)"); - - LOG_INFO("Checking signature hex characters..."); - for (int i = 0; i < 128; i++) { - char c = sig_str[i]; - if (!((c >= '0' && c <= '9') || (c >= 'a' && c <= 'f'))) { - LOG_ERROR("Invalid hex character in signature at position %d: '%c' (0x%02x)", i, c, (unsigned char)c); - return NOSTR_ERROR_EVENT_INVALID_SIGNATURE; - } - } - LOG_SUCCESS("Signature hex characters are valid (lowercase)"); - - // Validate timestamp - LOG_STEP("STRUCT-6", "Validating timestamp"); - double created_at = cJSON_GetNumberValue(created_at_item); - LOG_INFO("Created_at timestamp: %.0f", created_at); - if (created_at < 0) { - LOG_ERROR("Invalid timestamp (negative): %.0f", created_at); - return NOSTR_ERROR_EVENT_INVALID_CREATED_AT; - } - - // Convert to human readable time - time_t timestamp = (time_t)created_at; - char time_str[100]; - struct tm* tm_info = gmtime(×tamp); - strftime(time_str, sizeof(time_str), "%Y-%m-%d %H:%M:%S UTC", tm_info); - LOG_SUCCESS("Timestamp is valid: %s", time_str); - - // Validate kind - LOG_STEP("STRUCT-7", "Validating kind"); - double kind = cJSON_GetNumberValue(kind_item); - LOG_INFO("Event kind: %.0f", kind); - if (kind < 0 || kind > 65535 || kind != (int)kind) { - LOG_ERROR("Invalid kind value: %.0f (must be integer 0-65535)", kind); - return NOSTR_ERROR_EVENT_INVALID_KIND; - } - LOG_SUCCESS("Kind is valid: %d", (int)kind); - - // Validate tags array structure - LOG_STEP("STRUCT-8", "Validating tags array structure"); - int tag_count = cJSON_GetArraySize(tags_item); - LOG_INFO("Tags array has %d elements", tag_count); - - cJSON* tag_item; - int tag_index = 0; - cJSON_ArrayForEach(tag_item, tags_item) { - if (!cJSON_IsArray(tag_item)) { - LOG_ERROR("Tag at index %d is not an array (type: %d)", tag_index, tag_item->type); - return NOSTR_ERROR_EVENT_INVALID_TAGS; - } - - int tag_element_count = cJSON_GetArraySize(tag_item); - LOG_INFO("Tag[%d] has %d elements", tag_index, tag_element_count); - - cJSON* tag_element; - int element_index = 0; - cJSON_ArrayForEach(tag_element, tag_item) { - if (!cJSON_IsString(tag_element)) { - LOG_ERROR("Tag[%d][%d] is not a string (type: %d)", tag_index, element_index, tag_element->type); - return NOSTR_ERROR_EVENT_INVALID_TAGS; - } - const char* tag_value = cJSON_GetStringValue(tag_element); - LOG_INFO("Tag[%d][%d]: '%s'", tag_index, element_index, tag_value); - element_index++; - } - tag_index++; - } - LOG_SUCCESS("Tags array structure is valid"); - - // Validate content - LOG_STEP("STRUCT-9", "Validating content"); - const char* content_str = cJSON_GetStringValue(content_item); - LOG_INFO("Content: '%s' (length: %zu)", content_str, content_str ? strlen(content_str) : 0); - LOG_SUCCESS("Content is valid string"); - - LOG_SUCCESS("Structure validation completed successfully"); - return NOSTR_SUCCESS; -} +// Detailed structure validation function removed (debug version) -/** - * Detailed signature validation with step-by-step logging - */ -int detailed_signature_validation(cJSON* event) { - LOG_DIVIDER(); - LOG_STEP("CRYPTO-1", "Starting detailed signature validation"); - - if (!event) { - LOG_ERROR("Event is null"); - return NOSTR_ERROR_INVALID_INPUT; - } - - // Get event fields - cJSON* id_item = cJSON_GetObjectItem(event, "id"); - cJSON* pubkey_item = cJSON_GetObjectItem(event, "pubkey"); - cJSON* created_at_item = cJSON_GetObjectItem(event, "created_at"); - cJSON* kind_item = cJSON_GetObjectItem(event, "kind"); - cJSON* tags_item = cJSON_GetObjectItem(event, "tags"); - cJSON* content_item = cJSON_GetObjectItem(event, "content"); - cJSON* sig_item = cJSON_GetObjectItem(event, "sig"); - - if (!id_item || !pubkey_item || !created_at_item || !kind_item || - !tags_item || !content_item || !sig_item) { - LOG_ERROR("Missing required fields for signature validation"); - return NOSTR_ERROR_EVENT_INVALID_STRUCTURE; - } - - // Create serialization array - LOG_STEP("CRYPTO-2", "Creating serialization array"); - cJSON* serialize_array = cJSON_CreateArray(); - if (!serialize_array) { - LOG_ERROR("Failed to create serialization array"); - return NOSTR_ERROR_MEMORY_FAILED; - } - - cJSON_AddItemToArray(serialize_array, cJSON_CreateNumber(0)); - cJSON_AddItemToArray(serialize_array, cJSON_Duplicate(pubkey_item, 1)); - cJSON_AddItemToArray(serialize_array, cJSON_Duplicate(created_at_item, 1)); - cJSON_AddItemToArray(serialize_array, cJSON_Duplicate(kind_item, 1)); - cJSON_AddItemToArray(serialize_array, cJSON_Duplicate(tags_item, 1)); - cJSON_AddItemToArray(serialize_array, cJSON_Duplicate(content_item, 1)); - - LOG_SUCCESS("Serialization array created"); - - // Convert to JSON string - LOG_STEP("CRYPTO-3", "Converting to JSON string"); - char* serialize_string = cJSON_PrintUnformatted(serialize_array); - cJSON_Delete(serialize_array); - - if (!serialize_string) { - LOG_ERROR("Failed to serialize array to JSON string"); - return NOSTR_ERROR_MEMORY_FAILED; - } - - LOG_SUCCESS("JSON serialization string created"); - LOG_INFO("Serialization string (length %zu): %s", strlen(serialize_string), serialize_string); - - // Hash the serialized event - LOG_STEP("CRYPTO-4", "Computing SHA256 hash"); - unsigned char event_hash[32]; - if (nostr_sha256((const unsigned char*)serialize_string, strlen(serialize_string), event_hash) != 0) { - LOG_ERROR("SHA256 hashing failed"); - free(serialize_string); - return NOSTR_ERROR_CRYPTO_FAILED; - } - - LOG_SUCCESS("SHA256 hash computed"); - hex_dump("Event hash", event_hash, 32); - - // Convert hash to hex for event ID verification - LOG_STEP("CRYPTO-5", "Verifying event ID"); - char calculated_id[65]; - nostr_bytes_to_hex(event_hash, 32, calculated_id); - - const char* provided_id = cJSON_GetStringValue(id_item); - LOG_INFO("Calculated ID: %s", calculated_id); - LOG_INFO("Provided ID: %s", provided_id); - - if (!provided_id || strcmp(calculated_id, provided_id) != 0) { - LOG_ERROR("Event ID mismatch!"); - LOG_ERROR(" Expected: %s", calculated_id); - LOG_ERROR(" Got: %s", provided_id ? provided_id : "NULL"); - free(serialize_string); - return NOSTR_ERROR_EVENT_INVALID_ID; - } - LOG_SUCCESS("Event ID verification passed"); - - // Prepare signature verification - LOG_STEP("CRYPTO-6", "Preparing signature verification"); - const char* pubkey_str = cJSON_GetStringValue(pubkey_item); - const char* sig_str = cJSON_GetStringValue(sig_item); - - if (!pubkey_str || !sig_str) { - LOG_ERROR("Missing pubkey or signature strings"); - free(serialize_string); - return NOSTR_ERROR_EVENT_INVALID_STRUCTURE; - } - - // Convert hex strings to bytes - LOG_STEP("CRYPTO-7", "Converting hex strings to bytes"); - unsigned char pubkey_bytes[32]; - unsigned char sig_bytes[64]; - - if (nostr_hex_to_bytes(pubkey_str, pubkey_bytes, 32) != 0) { - LOG_ERROR("Failed to convert pubkey hex to bytes"); - free(serialize_string); - return NOSTR_ERROR_CRYPTO_FAILED; - } - LOG_SUCCESS("Pubkey hex converted to bytes"); - hex_dump("Pubkey bytes", pubkey_bytes, 32); - - if (nostr_hex_to_bytes(sig_str, sig_bytes, 64) != 0) { - LOG_ERROR("Failed to convert signature hex to bytes"); - free(serialize_string); - return NOSTR_ERROR_CRYPTO_FAILED; - } - LOG_SUCCESS("Signature hex converted to bytes"); - hex_dump("Signature bytes", sig_bytes, 64); - - // Verify signature using nostr_core_lib function (avoiding direct secp256k1 calls) - LOG_STEP("CRYPTO-8", "Verifying signature using nostr_verify_event_signature()"); - - // Create a temporary event structure for verification - cJSON* temp_event = cJSON_CreateObject(); - if (!temp_event) { - LOG_ERROR("Failed to create temporary event for verification"); - free(serialize_string); - return NOSTR_ERROR_MEMORY_FAILED; - } - - // Copy all required fields to temp event - cJSON_AddItemToObject(temp_event, "id", cJSON_Duplicate(id_item, 1)); - cJSON_AddItemToObject(temp_event, "pubkey", cJSON_Duplicate(pubkey_item, 1)); - cJSON_AddItemToObject(temp_event, "created_at", cJSON_Duplicate(created_at_item, 1)); - cJSON_AddItemToObject(temp_event, "kind", cJSON_Duplicate(kind_item, 1)); - cJSON_AddItemToObject(temp_event, "tags", cJSON_Duplicate(tags_item, 1)); - cJSON_AddItemToObject(temp_event, "content", cJSON_Duplicate(content_item, 1)); - cJSON_AddItemToObject(temp_event, "sig", cJSON_Duplicate(sig_item, 1)); - - LOG_INFO("Calling nostr_verify_event_signature() for detailed crypto validation"); - int crypto_verify_result = nostr_verify_event_signature(temp_event); - LOG_INFO("nostr_verify_event_signature returned: %d (%s)", - crypto_verify_result, nostr_strerror(crypto_verify_result)); - - cJSON_Delete(temp_event); - - if (crypto_verify_result != NOSTR_SUCCESS) { - LOG_ERROR("Signature verification FAILED!"); - LOG_ERROR("nostr_verify_event_signature returned error: %d (%s)", - crypto_verify_result, nostr_strerror(crypto_verify_result)); - free(serialize_string); - return crypto_verify_result; - } - - LOG_SUCCESS("Signature verification PASSED using nostr_core_lib!"); - free(serialize_string); - return NOSTR_SUCCESS; -} +// Debug functions removed (detailed_signature_validation, analyze_event_fields, hex_dump) -/** - * Analyze event fields in detail - */ -void analyze_event_fields(cJSON* event) { - LOG_DIVIDER(); - LOG_STEP("ANALYZE-1", "Analyzing event field details"); - - cJSON* field; - cJSON_ArrayForEach(field, event) { - if (field->string) { - LOG_INFO("Field '%s':", field->string); - if (cJSON_IsString(field)) { - const char* value = cJSON_GetStringValue(field); - LOG_INFO(" Type: String"); - LOG_INFO(" Value: '%s'", value); - LOG_INFO(" Length: %zu", value ? strlen(value) : 0); - } else if (cJSON_IsNumber(field)) { - double value = cJSON_GetNumberValue(field); - LOG_INFO(" Type: Number"); - LOG_INFO(" Value: %.0f", value); - } else if (cJSON_IsArray(field)) { - int size = cJSON_GetArraySize(field); - LOG_INFO(" Type: Array"); - LOG_INFO(" Size: %d", size); - } else { - LOG_INFO(" Type: Other (%d)", field->type); - } - } - } -} - -/** - * Print hex dump of binary data - */ -void hex_dump(const char* label, const unsigned char* data, size_t len) { - LOG_INFO("%s (%zu bytes):", label, len); - for (size_t i = 0; i < len; i += 16) { - fprintf(stderr, " %04zx: ", i); - for (size_t j = 0; j < 16; j++) { - if (i + j < len) { - fprintf(stderr, "%02x ", data[i + j]); - } else { - fprintf(stderr, " "); - } - } - fprintf(stderr, " |"); - for (size_t j = 0; j < 16 && i + j < len; j++) { - unsigned char c = data[i + j]; - fprintf(stderr, "%c", (c >= 32 && c <= 126) ? c : '.'); - } - fprintf(stderr, "|\n"); - } -} - -// Main authentication function with comprehensive step-by-step logging +// Main authentication function - simplified version without debug logging int authenticate_request(const char* auth_header, const char* method, const char* file_hash) { - LOG_DIVIDER(); - LOG_STEP("SERVER-1", "Starting server-style authentication (mirroring test_auth_debug.c)"); - if (!auth_header) { - LOG_ERROR("No authorization header provided"); return NOSTR_ERROR_INVALID_INPUT; } - LOG_INFO("Server-style auth called with method: %s, hash: %s", - method ? method : "null", file_hash ? file_hash : "null"); - - // Parse authorization header (same as server) + // Parse authorization header char event_json[4096]; - LOG_STEP("SERVER-2", "Calling parse_authorization_header"); int parse_result = parse_authorization_header(auth_header, event_json, sizeof(event_json)); if (parse_result != NOSTR_SUCCESS) { - LOG_ERROR("Authorization header parsing failed: %d (%s)", parse_result, nostr_strerror(parse_result)); return parse_result; } - LOG_SUCCESS("parse_authorization_header succeeded"); - // Parse JSON event (same as server) - LOG_STEP("SERVER-3", "Calling cJSON_Parse on JSON string"); - LOG_INFO("JSON to parse: %s", event_json); + // Parse JSON event cJSON* event = cJSON_Parse(event_json); if (!event) { - LOG_ERROR("Failed to parse JSON event with cJSON_Parse"); return NOSTR_ERROR_EVENT_INVALID_CONTENT; } - LOG_SUCCESS("cJSON_Parse succeeded, event parsed"); - // Print complete parsed JSON like server does - char* parsed_json_str = cJSON_Print(event); - LOG_INFO("Parsed JSON: %s", parsed_json_str ? parsed_json_str : "NULL"); - if (parsed_json_str) free(parsed_json_str); - - // Debug: Print event fields before validation (same as server) - cJSON* id_json = cJSON_GetObjectItem(event, "id"); - cJSON* pubkey_json = cJSON_GetObjectItem(event, "pubkey"); - cJSON* sig_json = cJSON_GetObjectItem(event, "sig"); - cJSON* kind_json = cJSON_GetObjectItem(event, "kind"); - cJSON* created_at_json = cJSON_GetObjectItem(event, "created_at"); - - LOG_STEP("SERVER-4", "Event fields before validation"); - LOG_INFO(" id: %s", id_json && cJSON_IsString(id_json) ? cJSON_GetStringValue(id_json) : "MISSING/INVALID"); - LOG_INFO(" pubkey: %s", pubkey_json && cJSON_IsString(pubkey_json) ? cJSON_GetStringValue(pubkey_json) : "MISSING/INVALID"); - LOG_INFO(" sig: %s", sig_json && cJSON_IsString(sig_json) ? cJSON_GetStringValue(sig_json) : "MISSING/INVALID"); - LOG_INFO(" kind: %d", kind_json && cJSON_IsNumber(kind_json) ? (int)cJSON_GetNumberValue(kind_json) : -999); - LOG_INFO(" created_at: %ld", created_at_json && cJSON_IsNumber(created_at_json) ? (long)cJSON_GetNumberValue(created_at_json) : -999); - - // Detailed pubkey analysis (same as server) - if (pubkey_json && cJSON_IsString(pubkey_json)) { - const char* pubkey_str = cJSON_GetStringValue(pubkey_json); - LOG_STEP("SERVER-5", "Detailed pubkey analysis"); - LOG_INFO(" Pubkey: %s", pubkey_str ? pubkey_str : "NULL"); - LOG_INFO(" Length: %zu", pubkey_str ? strlen(pubkey_str) : 0); - if (pubkey_str && strlen(pubkey_str) == 64) { - LOG_INFO(" Character analysis (first 10): "); - for (int i = 0; i < 10; i++) { - char c = pubkey_str[i]; - fprintf(stderr, "%c(0x%02x) ", c, (unsigned char)c); - } - fprintf(stderr, "\n"); - } - } - - // Pre-validation pubkey analysis (same as server) - LOG_STEP("SERVER-6", "Pre-validation pubkey analysis"); - if (pubkey_json && cJSON_IsString(pubkey_json)) { - const char* pubkey_str = cJSON_GetStringValue(pubkey_json); - LOG_INFO(" Pubkey: %s", pubkey_str ? pubkey_str : "NULL"); - LOG_INFO(" Length: %zu", pubkey_str ? strlen(pubkey_str) : 0); - if (pubkey_str && strlen(pubkey_str) == 64) { - LOG_INFO(" Character analysis (first 10): "); - for (int i = 0; i < 10; i++) { - char c = pubkey_str[i]; - fprintf(stderr, "%c(%d) ", c, (int)c); - } - fprintf(stderr, "\n"); - LOG_INFO(" Character validation test: "); - int valid_chars = 1; - for (int i = 0; i < 64; i++) { - char c = pubkey_str[i]; - if (!((c >= '0' && c <= '9') || (c >= 'a' && c <= 'f'))) { - fprintf(stderr, "INVALID at pos %d: %c(%d) ", i, c, (int)c); - valid_chars = 0; - } - } - if (valid_chars) { - fprintf(stderr, "ALL VALID (lowercase hex)\n"); - } else { - fprintf(stderr, "\n"); - } - } - } - - // Detailed validation analysis (same as server) - LOG_STEP("SERVER-7", "Starting detailed validation analysis"); - - // Test structure validation first (same as server) - LOG_INFO("Testing structure validation..."); + // Test structure validation first int structure_result = nostr_validate_event_structure(event); - LOG_INFO("nostr_validate_event_structure returned: %d (%s)", - structure_result, nostr_strerror(structure_result)); - - // EMERGENCY DEBUG: Write structure validation result to file - - if (structure_result != NOSTR_SUCCESS) { - LOG_ERROR("STRUCTURE validation failed!"); cJSON_Delete(event); return structure_result; } - LOG_SUCCESS("Structure validation PASSED"); - // Test crypto validation separately (same as server) - LOG_INFO("Testing cryptographic verification..."); + // Test crypto validation int crypto_result = nostr_verify_event_signature(event); - LOG_INFO("nostr_verify_event_signature returned: %d (%s)", - crypto_result, nostr_strerror(crypto_result)); - - - if (crypto_result != NOSTR_SUCCESS) { - LOG_ERROR("CRYPTO verification failed!"); - if (pubkey_json && cJSON_IsString(pubkey_json)) { - const char* pubkey_str = cJSON_GetStringValue(pubkey_json); - LOG_ERROR("Failed pubkey: %s (length: %zu)", - pubkey_str ? pubkey_str : "NULL", pubkey_str ? strlen(pubkey_str) : 0); - } cJSON_Delete(event); return crypto_result; } - LOG_SUCCESS("Crypto verification PASSED"); - // Finally test complete validation (same as server) - LOG_INFO("Testing complete validation..."); + // Test complete validation int validation_result = nostr_validate_event(event); - LOG_INFO("nostr_validate_event returned: %d (%s)", - validation_result, nostr_strerror(validation_result)); - - - if (validation_result != NOSTR_SUCCESS) { - LOG_ERROR("COMPLETE validation failed: %d (%s)", - validation_result, nostr_strerror(validation_result)); - - // Additional debug: Check specific validation issues (same as server) - if (pubkey_json && cJSON_IsString(pubkey_json)) { - const char* pubkey_str = cJSON_GetStringValue(pubkey_json); - LOG_ERROR("Pubkey length: %zu, value: %s", - pubkey_str ? strlen(pubkey_str) : 0, pubkey_str ? pubkey_str : "NULL"); - } - cJSON_Delete(event); return validation_result; } - LOG_SUCCESS("Complete validation PASSED"); - - // Run our detailed validations for additional debugging - LOG_STEP("SERVER-8", "Running detailed structure validation"); - int detailed_struct_result = detailed_structure_validation(event); - if (detailed_struct_result != NOSTR_SUCCESS) { - LOG_ERROR("Detailed structure validation failed: %d (%s)", detailed_struct_result, nostr_strerror(detailed_struct_result)); - cJSON_Delete(event); - return detailed_struct_result; - } - LOG_SUCCESS("Detailed structure validation PASSED"); - - LOG_STEP("SERVER-9", "Running detailed signature validation"); - int detailed_crypto_result = detailed_signature_validation(event); - if (detailed_crypto_result != NOSTR_SUCCESS) { - LOG_ERROR("Detailed signature validation failed: %d (%s)", detailed_crypto_result, nostr_strerror(detailed_crypto_result)); - cJSON_Delete(event); - return detailed_crypto_result; - } - LOG_SUCCESS("Detailed signature validation PASSED"); - - // Analyze event fields - analyze_event_fields(event); // Validate Blossom-specific requirements - LOG_STEP("SERVER-10", "Validating Blossom-specific requirements"); int blossom_result = validate_blossom_event(event, file_hash, method); if (blossom_result != NOSTR_SUCCESS) { - LOG_ERROR("Blossom event validation failed: %d (%s)", blossom_result, nostr_strerror(blossom_result)); cJSON_Delete(event); return blossom_result; } - LOG_SUCCESS("Blossom event validation PASSED"); cJSON_Delete(event); - LOG_SUCCESS("Server-style authentication successful, returning NOSTR_SUCCESS"); return NOSTR_SUCCESS; } @@ -1732,6 +1161,780 @@ int authenticate_request_with_rules(const char* auth_header, const char* method, return NOSTR_SUCCESS; } +///////////////////////////////////////////////////////////////////////////////////////// +///////////////////////////////////////////////////////////////////////////////////////// +// BUD 04 - Mirroring +///////////////////////////////////////////////////////////////////////////////////////// +///////////////////////////////////////////////////////////////////////////////////////// + +// HTTP download response structure +typedef struct { + unsigned char* data; + size_t size; + char content_type[128]; + long http_code; + size_t capacity; +} mirror_download_t; + +// CURL write callback for collecting response data +static size_t write_callback(void* contents, size_t size, size_t nmemb, mirror_download_t* response) { + size_t realsize = size * nmemb; + + if (!response) return 0; + + // Check if we need to expand buffer + if (response->size + realsize >= response->capacity) { + size_t new_capacity = response->capacity == 0 ? 8192 : response->capacity * 2; + while (new_capacity < response->size + realsize + 1) { + new_capacity *= 2; + } + + unsigned char* new_data = realloc(response->data, new_capacity); + if (!new_data) { + return 0; // Out of memory + } + + response->data = new_data; + response->capacity = new_capacity; + } + + memcpy(response->data + response->size, contents, realsize); + response->size += realsize; + response->data[response->size] = '\0'; // Null terminate for safety + + return realsize; +} + +// CURL header callback for collecting Content-Type +static size_t header_callback(char* buffer, size_t size, size_t nitems, mirror_download_t* response) { + size_t realsize = size * nitems; + + if (!response) return realsize; + + // Look for Content-Type header (case-insensitive) + if (realsize > 14 && strncasecmp(buffer, "Content-Type:", 13) == 0) { + // Skip "Content-Type:" and whitespace + char* value = buffer + 13; + while (*value == ' ' || *value == '\t') value++; + + // Find end of value (before \r\n) + char* end = value; + while (*end && *end != '\r' && *end != '\n') end++; + + // Copy content type, limiting to buffer size + size_t copy_len = end - value; + if (copy_len >= sizeof(response->content_type)) { + copy_len = sizeof(response->content_type) - 1; + } + + strncpy(response->content_type, value, copy_len); + response->content_type[copy_len] = '\0'; + } + + return realsize; +} + +// Validate URL for security (prevent SSRF attacks) +int validate_mirror_url(const char* url) { + if (!url || strlen(url) == 0) { + return 0; // Invalid URL + } + + // Must start with https:// (security requirement) + if (strncmp(url, "https://", 8) != 0) { + return 0; // Only HTTPS allowed + } + + // URL length check + if (strlen(url) > 2048) { + return 0; // URL too long + } + + // Check for prohibited hosts/IPs (basic SSRF protection) + const char* host_start = url + 8; // Skip "https://" + + // Block localhost and private IPs + if (strncasecmp(host_start, "localhost", 9) == 0 || + strncasecmp(host_start, "127.", 4) == 0 || + strncasecmp(host_start, "192.168.", 8) == 0 || + strncasecmp(host_start, "10.", 3) == 0 || + strncmp(host_start, "172.16.", 7) == 0 || + strncmp(host_start, "172.17.", 7) == 0 || + strncmp(host_start, "172.18.", 7) == 0 || + strncmp(host_start, "172.19.", 7) == 0 || + strncmp(host_start, "172.2", 5) == 0 || + strncmp(host_start, "172.30.", 7) == 0 || + strncmp(host_start, "172.31.", 7) == 0) { + return 0; // Private network blocked + } + + return 1; // URL appears valid +} + +// Detect/validate Content-Type +const char* determine_blob_content_type(const char* url, const char* header_content_type, + const unsigned char* data, size_t size) { + // Priority 1: Use Content-Type header if present and valid + if (header_content_type && strlen(header_content_type) > 0) { + // Extract main MIME type (before semicolon) + static char clean_type[128]; + const char* semicolon = strchr(header_content_type, ';'); + size_t len = semicolon ? (size_t)(semicolon - header_content_type) : strlen(header_content_type); + + if (len < sizeof(clean_type)) { + strncpy(clean_type, header_content_type, len); + clean_type[len] = '\0'; + + // Remove trailing whitespace + while (len > 0 && (clean_type[len-1] == ' ' || clean_type[len-1] == '\t')) { + clean_type[--len] = '\0'; + } + + return clean_type; + } + } + + // Priority 2: Detect from URL extension + if (url) { + const char* dot = strrchr(url, '.'); + if (dot && dot[1]) { + const char* ext = dot + 1; + + // Remove query parameters + const char* question = strchr(ext, '?'); + size_t ext_len = question ? (size_t)(question - ext) : strlen(ext); + + if (ext_len > 0) { + if (strncasecmp(ext, "png", ext_len) == 0) return "image/png"; + if (strncasecmp(ext, "jpg", ext_len) == 0) return "image/jpeg"; + if (strncasecmp(ext, "jpeg", ext_len) == 0) return "image/jpeg"; + if (strncasecmp(ext, "gif", ext_len) == 0) return "image/gif"; + if (strncasecmp(ext, "webp", ext_len) == 0) return "image/webp"; + if (strncasecmp(ext, "pdf", ext_len) == 0) return "application/pdf"; + if (strncasecmp(ext, "mp4", ext_len) == 0) return "video/mp4"; + if (strncasecmp(ext, "mp3", ext_len) == 0) return "audio/mpeg"; + if (strncasecmp(ext, "txt", ext_len) == 0) return "text/plain"; + } + } + } + + // Priority 3: Basic content detection from data + if (data && size >= 8) { + // PNG signature + if (memcmp(data, "\x89PNG\r\n\x1a\n", 8) == 0) { + return "image/png"; + } + // JPEG signature + if (size >= 3 && memcmp(data, "\xff\xd8\xff", 3) == 0) { + return "image/jpeg"; + } + // GIF signature + if (memcmp(data, "GIF87a", 6) == 0 || memcmp(data, "GIF89a", 6) == 0) { + return "image/gif"; + } + // PDF signature + if (memcmp(data, "%PDF-", 5) == 0) { + return "application/pdf"; + } + } + + // Default fallback + return "application/octet-stream"; +} + +// Download blob from remote URL +mirror_download_t* download_blob_from_url(const char* url, size_t max_size) { + if (!url || !validate_mirror_url(url)) { + return NULL; + } + + CURL* curl = curl_easy_init(); + if (!curl) { + return NULL; + } + + mirror_download_t* download = calloc(1, sizeof(mirror_download_t)); + if (!download) { + curl_easy_cleanup(curl); + return NULL; + } + + // Initialize download structure + download->data = malloc(8192); + if (!download->data) { + free(download); + curl_easy_cleanup(curl); + return NULL; + } + download->capacity = 8192; + download->size = 0; + download->content_type[0] = '\0'; + + // Configure CURL + curl_easy_setopt(curl, CURLOPT_URL, url); + curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_callback); + curl_easy_setopt(curl, CURLOPT_WRITEDATA, download); + curl_easy_setopt(curl, CURLOPT_HEADERFUNCTION, header_callback); + curl_easy_setopt(curl, CURLOPT_HEADERDATA, download); + curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1L); + curl_easy_setopt(curl, CURLOPT_MAXREDIRS, 5L); + curl_easy_setopt(curl, CURLOPT_TIMEOUT, 30L); + curl_easy_setopt(curl, CURLOPT_CONNECTTIMEOUT, 10L); + curl_easy_setopt(curl, CURLOPT_USERAGENT, "Ginxsom-Blossom/1.0"); + curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 1L); + curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, 2L); + + // Set maximum file size + curl_easy_setopt(curl, CURLOPT_MAXFILESIZE, (long)max_size); + + // Perform the request + CURLcode res = curl_easy_perform(curl); + + // Get HTTP response code + curl_easy_getinfo(curl, CURLINFO_RESPONSE_CODE, &download->http_code); + + curl_easy_cleanup(curl); + + // Check for errors + if (res != CURLE_OK || download->http_code != 200) { + free(download->data); + free(download); + return NULL; + } + + return download; +} + +// Free download result memory +void free_mirror_download(mirror_download_t* download) { + if (download) { + if (download->data) { + free(download->data); + } + free(download); + } +} + +// Parse JSON request body to extract URL +int parse_mirror_request_body(const char* json_body, char* url_buffer, size_t url_buffer_size) { + if (!json_body || !url_buffer || url_buffer_size == 0) { + return 0; + } + + cJSON* json = cJSON_Parse(json_body); + if (!json) { + return 0; // Invalid JSON + } + + cJSON* url_item = cJSON_GetObjectItem(json, "url"); + if (!url_item || !cJSON_IsString(url_item)) { + cJSON_Delete(json); + return 0; // Missing or invalid URL field + } + + const char* url = cJSON_GetStringValue(url_item); + if (!url || strlen(url) >= url_buffer_size) { + cJSON_Delete(json); + return 0; // URL too long or null + } + + strcpy(url_buffer, url); + cJSON_Delete(json); + + return 1; // Success +} + +// Handle PUT /mirror requests (BUD-04) +void handle_mirror_request(void) { + // Log the incoming request + log_request("PUT", "/mirror", "pending", 0); + + // Get HTTP headers + const char* content_type = getenv("CONTENT_TYPE"); + const char* content_length_str = getenv("CONTENT_LENGTH"); + + // Validate Content-Type + if (!content_type || strstr(content_type, "application/json") == NULL) { + send_error_response(400, "invalid_content_type", + "Content-Type must be application/json", + "The mirror endpoint requires JSON request body"); + log_request("PUT", "/mirror", "none", 400); + return; + } + + // Validate Content-Length + if (!content_length_str) { + send_error_response(400, "missing_header", + "Content-Length header required", + "The Content-Length header must be specified"); + log_request("PUT", "/mirror", "none", 400); + return; + } + + long content_length = atol(content_length_str); + if (content_length <= 0 || content_length > 4096) { // 4KB max for JSON + send_error_response(400, "invalid_content_length", + "Invalid content length", + "JSON request body must be between 1 byte and 4KB"); + log_request("PUT", "/mirror", "none", 400); + return; + } + + // Read JSON request body + char* json_body = malloc(content_length + 1); + if (!json_body) { + send_error_response(500, "memory_error", + "Failed to allocate memory", + "Internal server error"); + log_request("PUT", "/mirror", "none", 500); + return; + } + + size_t bytes_read = fread(json_body, 1, content_length, stdin); + if (bytes_read != (size_t)content_length) { + free(json_body); + send_error_response(400, "incomplete_body", + "Failed to read complete request body", + "The request body was incomplete"); + log_request("PUT", "/mirror", "none", 400); + return; + } + json_body[content_length] = '\0'; + + // Parse JSON to extract URL + char url[2048]; + if (!parse_mirror_request_body(json_body, url, sizeof(url))) { + free(json_body); + send_error_response(400, "invalid_json", + "Invalid JSON or missing URL field", + "Request body must be valid JSON with 'url' field"); + log_request("PUT", "/mirror", "none", 400); + return; + } + + free(json_body); + + // Validate URL + if (!validate_mirror_url(url)) { + send_error_response(400, "invalid_url", + "Invalid or prohibited URL", + "URL must be HTTPS and not point to private networks"); + log_request("PUT", "/mirror", "none", 400); + return; + } + + // Check for authorization + const char* auth_header = getenv("HTTP_AUTHORIZATION"); + const char* expected_hash = NULL; + const char* uploader_pubkey = NULL; + static char pubkey_buffer[256]; + static char hash_buffer[65]; + + if (auth_header) { + // Parse and validate authorization + int auth_result = authenticate_request(auth_header, "upload", NULL); + if (auth_result != NOSTR_SUCCESS) { + send_error_response(401, "authentication_failed", + "Invalid authentication", + "The provided authorization is invalid"); + log_request("PUT", "/mirror", "auth_failed", 401); + return; + } + + // Extract hash and pubkey from authorization + char event_json[4096]; + int parse_result = parse_authorization_header(auth_header, event_json, sizeof(event_json)); + if (parse_result == NOSTR_SUCCESS) { + cJSON* event = cJSON_Parse(event_json); + if (event) { + // Extract pubkey + cJSON* pubkey_json = cJSON_GetObjectItem(event, "pubkey"); + if (pubkey_json && cJSON_IsString(pubkey_json)) { + const char* temp_pubkey = cJSON_GetStringValue(pubkey_json); + if (temp_pubkey) { + strncpy(pubkey_buffer, temp_pubkey, sizeof(pubkey_buffer)-1); + pubkey_buffer[sizeof(pubkey_buffer)-1] = '\0'; + uploader_pubkey = pubkey_buffer; + } + } + + // Extract expected hash from 'x' tag + cJSON* tags = cJSON_GetObjectItem(event, "tags"); + if (tags && cJSON_IsArray(tags)) { + cJSON* tag = NULL; + cJSON_ArrayForEach(tag, tags) { + if (!cJSON_IsArray(tag)) continue; + + cJSON* tag_name = cJSON_GetArrayItem(tag, 0); + if (!tag_name || !cJSON_IsString(tag_name)) continue; + + if (strcmp(cJSON_GetStringValue(tag_name), "x") == 0) { + cJSON* hash_value = cJSON_GetArrayItem(tag, 1); + if (hash_value && cJSON_IsString(hash_value)) { + const char* temp_hash = cJSON_GetStringValue(hash_value); + if (temp_hash && strlen(temp_hash) == 64) { + strncpy(hash_buffer, temp_hash, sizeof(hash_buffer)-1); + hash_buffer[sizeof(hash_buffer)-1] = '\0'; + expected_hash = hash_buffer; + break; + } + } + } + } + } + + cJSON_Delete(event); + } + } + + if (!expected_hash) { + send_error_response(400, "missing_hash", + "Authorization missing expected hash", + "Upload authorization must contain 'x' tag with expected hash"); + log_request("PUT", "/mirror", "auth_invalid", 400); + return; + } + } + + // Download the blob + mirror_download_t* download = download_blob_from_url(url, 100 * 1024 * 1024); // 100MB limit + if (!download) { + send_error_response(400, "download_failed", + "Failed to download blob from URL", + "Could not fetch the specified URL or file too large"); + log_request("PUT", "/mirror", uploader_pubkey ? "authenticated" : "anonymous", 400); + return; + } + + // Calculate hash of downloaded content + unsigned char hash[32]; + if (nostr_sha256(download->data, download->size, hash) != NOSTR_SUCCESS) { + free_mirror_download(download); + send_error_response(500, "hash_error", + "Failed to calculate hash", + "Internal server error during hash calculation"); + log_request("PUT", "/mirror", uploader_pubkey ? "authenticated" : "anonymous", 500); + return; + } + + // Convert hash to hex string + char sha256_hex[65]; + nostr_bytes_to_hex(hash, 32, sha256_hex); + + // If authorization provided, verify hash matches + if (expected_hash && strcmp(sha256_hex, expected_hash) != 0) { + free_mirror_download(download); + send_error_response(400, "hash_mismatch", + "Downloaded content hash does not match authorization", + "The file hash does not match the expected hash in the authorization event"); + log_request("PUT", "/mirror", "auth_mismatch", 400); + return; + } + + // Determine content type + const char* content_type_final = determine_blob_content_type(url, download->content_type, + download->data, download->size); + + // Determine file extension from Content-Type + const char* extension = ""; + if (strstr(content_type_final, "image/jpeg")) { + extension = ".jpg"; + } else if (strstr(content_type_final, "image/webp")) { + extension = ".webp"; + } else if (strstr(content_type_final, "image/png")) { + extension = ".png"; + } else if (strstr(content_type_final, "image/gif")) { + extension = ".gif"; + } else if (strstr(content_type_final, "video/mp4")) { + extension = ".mp4"; + } else if (strstr(content_type_final, "video/webm")) { + extension = ".webm"; + } else if (strstr(content_type_final, "audio/mpeg")) { + extension = ".mp3"; + } else if (strstr(content_type_final, "audio/ogg")) { + extension = ".ogg"; + } else if (strstr(content_type_final, "text/plain")) { + extension = ".txt"; + } else if (strstr(content_type_final, "application/pdf")) { + extension = ".pdf"; + } else { + extension = ".bin"; + } + + // Save file to blobs directory + char filepath[MAX_PATH_LEN]; + snprintf(filepath, sizeof(filepath), "blobs/%s%s", sha256_hex, extension); + + FILE* outfile = fopen(filepath, "wb"); + if (!outfile) { + free_mirror_download(download); + send_error_response(500, "file_error", + "Failed to create file", + "Internal server error during file creation"); + log_request("PUT", "/mirror", uploader_pubkey ? "authenticated" : "anonymous", 500); + return; + } + + size_t bytes_written = fwrite(download->data, 1, download->size, outfile); + fclose(outfile); + + if (bytes_written != download->size) { + unlink(filepath); // Clean up partial file + free_mirror_download(download); + send_error_response(500, "write_error", + "Failed to write complete file", + "Internal server error during file write"); + log_request("PUT", "/mirror", uploader_pubkey ? "authenticated" : "anonymous", 500); + return; + } + + // Set file permissions + chmod(filepath, S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH); + + // Store metadata in database + time_t uploaded_time = time(NULL); + if (!insert_blob_metadata(sha256_hex, download->size, content_type_final, + uploaded_time, uploader_pubkey, NULL)) { + unlink(filepath); // Clean up file + free_mirror_download(download); + send_error_response(500, "database_error", + "Failed to store blob metadata", + "Internal server error during database operation"); + log_request("PUT", "/mirror", uploader_pubkey ? "authenticated" : "anonymous", 500); + return; + } + + // Return success response with blob descriptor + printf("Status: 200 OK\r\n"); + printf("Content-Type: application/json\r\n\r\n"); + printf("{\n"); + printf(" \"sha256\": \"%s\",\n", sha256_hex); + printf(" \"size\": %zu,\n", download->size); + printf(" \"type\": \"%s\",\n", content_type_final); + printf(" \"uploaded\": %ld,\n", uploaded_time); + printf(" \"url\": \"http://localhost:9001/%s%s\"\n", sha256_hex, extension); + printf("}\n"); + + free_mirror_download(download); + log_request("PUT", "/mirror", uploader_pubkey ? "authenticated" : "anonymous", 200); +} + +///////////////////////////////////////////////////////////////////////////////////////// +///////////////////////////////////////////////////////////////////////////////////////// +// BUD 06 - Upload Requirements (Pre-flight Validation) +///////////////////////////////////////////////////////////////////////////////////////// +///////////////////////////////////////////////////////////////////////////////////////// + +// Enhanced error response with X-Reason header for BUD-06 +void send_upload_error_response(int status_code, const char* error_type, + const char* message, const char* x_reason) { + const char* status_text; + switch (status_code) { + case 400: status_text = "Bad Request"; break; + case 401: status_text = "Unauthorized"; break; + case 409: status_text = "Conflict"; break; + case 411: status_text = "Length Required"; break; + case 413: status_text = "Content Too Large"; break; + case 415: status_text = "Unsupported Media Type"; break; + case 500: status_text = "Internal Server Error"; break; + default: status_text = "Error"; break; + } + + printf("Status: %d %s\r\n", status_code, status_text); + printf("Content-Type: application/json\r\n"); + if (x_reason) { + printf("X-Reason: %s\r\n", x_reason); + } + printf("\r\n"); + printf("{\n"); + printf(" \"error\": \"%s\",\n", error_type); + printf(" \"message\": \"%s\"", message); + if (x_reason) { + printf(",\n \"x_reason\": \"%s\"", x_reason); + } + printf("\n}\n"); +} + +// Success response for validated upload requirements +void send_upload_success_response(const char* sha256, const char* content_type, long content_length) { + printf("Status: 200 OK\r\n"); + printf("Content-Type: application/json\r\n"); + printf("X-Upload-Status: Ready\r\n"); + printf("\r\n"); + printf("{\n"); + printf(" \"message\": \"Upload requirements validated\",\n"); + printf(" \"sha256\": \"%s\",\n", sha256); + printf(" \"content_type\": \"%s\",\n", content_type); + printf(" \"content_length\": %ld\n", content_length); + printf("}\n"); +} + +// Validate SHA-256 format (64 hex characters) +int validate_sha256_format(const char* sha256) { + if (!sha256 || strlen(sha256) != 64) { + return 0; // Invalid format + } + + // Check that all characters are hex + for (int i = 0; i < 64; i++) { + char c = sha256[i]; + if (!((c >= '0' && c <= '9') || (c >= 'a' && c <= 'f') || (c >= 'A' && c <= 'F'))) { + return 0; // Invalid hex character + } + } + + return 1; // Valid format +} + +// Parse and validate X-Content-Length header +int validate_content_length(const char* content_length_str, long* parsed_length) { + if (!content_length_str || !parsed_length) { + return 0; // Invalid input + } + + char* endptr; + long length = strtol(content_length_str, &endptr, 10); + + // Always set parsed_length so caller can check the actual value + *parsed_length = length; + + // Check if conversion was successful and no trailing characters + if (*endptr != '\0') { + return 0; // Invalid number format + } + + // Check for valid size range + if (length <= 0) { + return 0; // Zero or negative size not allowed + } + + if (length > 100 * 1024 * 1024) { // 100MB limit + return -1; // File too large + } + + return 1; // Valid length +} + +// Check if blob already exists in database +int check_blob_exists(const char* sha256) { + if (!sha256) { + return 0; + } + + blob_metadata_t metadata = {0}; + return get_blob_metadata(sha256, &metadata); +} + +// Validate upload headers and extract values +int validate_upload_headers(const char** sha256, const char** content_type, + long* content_length, char* error_reason, size_t reason_size) { + // Get X-SHA-256 header + const char* sha256_header = getenv("HTTP_X_SHA_256"); + if (!sha256_header) { + strncpy(error_reason, XREASON_MISSING_SHA256, reason_size - 1); + error_reason[reason_size - 1] = '\0'; + return 400; // Bad Request + } + + // Validate SHA-256 format + if (!validate_sha256_format(sha256_header)) { + strncpy(error_reason, XREASON_INVALID_SHA256, reason_size - 1); + error_reason[reason_size - 1] = '\0'; + return 400; // Bad Request + } + + // Get X-Content-Length header + const char* length_header = getenv("HTTP_X_CONTENT_LENGTH"); + if (!length_header) { + strncpy(error_reason, XREASON_MISSING_LENGTH, reason_size - 1); + error_reason[reason_size - 1] = '\0'; + return 411; // Length Required + } + + // Validate content length + long parsed_length; + int length_result = validate_content_length(length_header, &parsed_length); + if (length_result == 0) { + if (parsed_length == 0) { + strncpy(error_reason, XREASON_ZERO_LENGTH, reason_size - 1); + } else { + strncpy(error_reason, XREASON_INVALID_LENGTH, reason_size - 1); + } + error_reason[reason_size - 1] = '\0'; + return 400; // Bad Request + } else if (length_result == -1) { + strncpy(error_reason, XREASON_FILE_TOO_LARGE, reason_size - 1); + error_reason[reason_size - 1] = '\0'; + return 413; // Content Too Large + } + + // Get X-Content-Type header (optional) + const char* type_header = getenv("HTTP_X_CONTENT_TYPE"); + + // Set output values + *sha256 = sha256_header; + *content_type = type_header ? type_header : "application/octet-stream"; + *content_length = parsed_length; + + return 200; // Success +} + +// Main BUD-06 handler function +void handle_head_upload_request(void) { + // Log the incoming request + log_request("HEAD", "/upload", "pending", 0); + + // Validate upload headers + const char* sha256 = NULL; + const char* content_type = NULL; + long content_length = 0; + char error_reason[256]; + + int validation_result = validate_upload_headers(&sha256, &content_type, + &content_length, error_reason, sizeof(error_reason)); + + if (validation_result != 200) { + // Header validation failed + const char* error_type; + switch (validation_result) { + case 400: error_type = "invalid_headers"; break; + case 411: error_type = "length_required"; break; + case 413: error_type = "payload_too_large"; break; + default: error_type = "validation_error"; break; + } + + send_upload_error_response(validation_result, error_type, error_reason, error_reason); + log_request("HEAD", "/upload", "none", validation_result); + return; + } + + // Check if blob already exists (duplicate detection) + if (check_blob_exists(sha256)) { + send_upload_error_response(409, "blob_exists", "Blob with this hash already exists", XREASON_BLOB_EXISTS); + log_request("HEAD", "/upload", "none", 409); + return; + } + + // Check for optional authorization + const char* auth_header = getenv("HTTP_AUTHORIZATION"); + const char* auth_status = "none"; + + if (auth_header) { + // Validate authorization if provided + int auth_result = authenticate_request_with_rules(auth_header, "upload", sha256, content_type, content_length); + if (auth_result != NOSTR_SUCCESS) { + send_upload_error_response(401, "authentication_failed", "Invalid or expired authentication", XREASON_AUTH_INVALID); + log_request("HEAD", "/upload", "auth_failed", 401); + return; + } + auth_status = "authenticated"; + } + + // All validations passed - return success + send_upload_success_response(sha256, content_type, content_length); + log_request("HEAD", "/upload", auth_status, 200); +} + // Enhanced error response helper functions void send_error_response(int status_code, const char* error_type, const char* message, const char* details) { const char* status_text; @@ -2023,8 +2226,6 @@ void handle_delete_request(const char* sha256) { if (temp_auth_pubkey) { strncpy(auth_pubkey_copy, temp_auth_pubkey, sizeof(auth_pubkey_copy) - 1); } - fprintf(stderr, "DELETE DEBUG: auth_pubkey extracted from request: '%s'\n", auth_pubkey_copy); - cJSON_Delete(event); const char* auth_pubkey = auth_pubkey_copy; // Use the copied version @@ -2066,11 +2267,6 @@ void handle_delete_request(const char* sha256) { // Get blob metadata const char* uploader_pubkey = (const char*)sqlite3_column_text(stmt, 0); const char* blob_type = (const char*)sqlite3_column_text(stmt, 1); - fprintf(stderr, "DELETE DEBUG: database query results - uploader_pubkey: '%s', blob_type: '%s'\n", - uploader_pubkey ? uploader_pubkey : "NULL", blob_type ? blob_type : "NULL"); - - - // Create copies of the strings since they may be invalidated after finalize @@ -2086,31 +2282,14 @@ void handle_delete_request(const char* sha256) { sqlite3_finalize(stmt); - fprintf(stderr, "DELETE DEBUG: copied strings - uploader_pubkey_copy: '%s', blob_type_copy: '%s'\n", - uploader_pubkey_copy, blob_type_copy); - - - // Check ownership - only the uploader can delete -fprintf(stderr, "DELETE DEBUG: ownership check - auth_pubkey: '%s', uploader_pubkey_copy: '%s'\n", - auth_pubkey ? auth_pubkey : "NULL", uploader_pubkey_copy); -fprintf(stderr, "DELETE DEBUG: uploader_pubkey_copy[0]: %d, strcmp result: %d\n", - uploader_pubkey_copy[0], uploader_pubkey_copy[0] ? strcmp(uploader_pubkey_copy, auth_pubkey) : -999); - if (!uploader_pubkey_copy[0] || strcmp(uploader_pubkey_copy, auth_pubkey) != 0) { - fprintf(stderr, "DELETE DEBUG: ownership check FAILED - reason: %s\n", - !uploader_pubkey_copy[0] ? "uploader_pubkey_copy is empty" : "pubkeys don't match"); - - - sqlite3_close(db); send_error_response(403, "access_denied", "Access denied", "You can only delete blobs that you uploaded"); log_request("DELETE", "/delete", "ownership_denied", 403); return; } else { - fprintf(stderr, "DELETE DEBUG: ownership check PASSED - proceeding with delete\n"); - } @@ -2170,9 +2349,9 @@ if (!uploader_pubkey_copy[0] || strcmp(uploader_pubkey_copy, auth_pubkey) != 0) // Delete the physical file if (unlink(filepath) != 0) { - fprintf(stderr, "DELETE DEBUG: Warning - failed to delete physical file %s\n", filepath); + // Warning: failed to delete physical file } else { - fprintf(stderr, "DELETE DEBUG: Successfully deleted physical file %s\n", filepath); + // Successfully deleted physical file } @@ -2525,8 +2704,6 @@ int main(void) { fprintf(stderr, "STARTUP: nostr crypto system initialized successfully\r\n"); fflush(stderr); while (FCGI_Accept() >= 0) { - // DEBUG: Log every request received - const char* request_method = getenv("REQUEST_METHOD"); const char* request_uri = getenv("REQUEST_URI"); @@ -2538,10 +2715,13 @@ int main(void) { continue; } - // Handle HEAD requests for blob metadata - if (strcmp(request_method, "HEAD") == 0) { + // Route HEAD /upload pre-flight (BUD-06) before generic HEAD blob handler + if (strcmp(request_method, "HEAD") == 0 && strcmp(request_uri, "/upload") == 0) { + // Handle HEAD /upload requests (BUD-06 pre-flight validation) + handle_head_upload_request(); + } else if (strcmp(request_method, "HEAD") == 0) { + // Handle HEAD requests for blob metadata const char* sha256 = extract_sha256_from_uri(request_uri); - if (sha256) { handle_head_request(sha256); log_request("HEAD", request_uri, "none", 200); // Assuming success - could be enhanced to track actual status @@ -2554,6 +2734,9 @@ int main(void) { } else if (strcmp(request_method, "PUT") == 0 && strcmp(request_uri, "/upload") == 0) { // Handle PUT /upload requests with authentication handle_upload_request(); + } else if (strcmp(request_method, "PUT") == 0 && strcmp(request_uri, "/mirror") == 0) { + // Handle PUT /mirror requests (BUD-04) + handle_mirror_request(); } else if (strcmp(request_method, "GET") == 0 && strncmp(request_uri, "/list/", 6) == 0) { // Handle GET /list/ requests const char* pubkey = request_uri + 6; // Skip "/list/" diff --git a/tests/delete_test.sh b/tests/delete_test_bud02.sh similarity index 100% rename from tests/delete_test.sh rename to tests/delete_test_bud02.sh diff --git a/tests/file_put.sh b/tests/file_put_bud02.sh similarity index 100% rename from tests/file_put.sh rename to tests/file_put_bud02.sh diff --git a/tests/list_test.sh b/tests/list_test_bud02.sh similarity index 100% rename from tests/list_test.sh rename to tests/list_test_bud02.sh diff --git a/tests/mirror_test_bud04.sh b/tests/mirror_test_bud04.sh new file mode 100755 index 0000000..a7fb8f6 --- /dev/null +++ b/tests/mirror_test_bud04.sh @@ -0,0 +1,87 @@ +#!/bin/bash + +# Mirror Test Script for BUD-04 +# Tests the PUT /mirror endpoint with a sample PNG file + +# Test URL - PNG file with known SHA-256 hash +TEST_URL="https://laantungir.github.io/img_repo/24308d48eb498b593e55a87b6300ccffdea8432babc0bb898b1eff21ebbb72de.png" +EXPECTED_HASH="24308d48eb498b593e55a87b6300ccffdea8432babc0bb898b1eff21ebbb72de" + +echo "=== BUD-04 Mirror Endpoint Test ===" +echo "Target URL: $TEST_URL" +echo "Expected Hash: $EXPECTED_HASH" +echo "" + +# Create JSON request body +JSON_BODY=$(cat <