From 0c630d95b53d84ec48739831df7021ccec452ef9 Mon Sep 17 00:00:00 2001 From: Justine Tunney Date: Sun, 2 Jul 2023 10:19:16 -0700 Subject: [PATCH] Rewrite Cosmopolitan Ar The build/bootstrap/ar.com program is now tinier. This change reduces its size from 140kb to 53kb. Nothing was traded away. Cosmopolitan Ar performance is now 2x better than llvm-ar largely thanks to using the copy_file_range() system call. This change homebrews a new allocation API that addresses the shortcomings of the C standard library design. Using these new balloc() and reballoc() functions I managed to reduce memory consumption so much that Cosmpolitan Ar should now use roughly 100x fewer bytes of peak resident memory compared to llvm-ar. Correct behavior with better compatibility has been assured. Binary output is now pretty much bit-identical to llvm-ar, as of this change. This can and should be the living proof we need to show that a better world is possible for software. --- build/bootstrap/ar.com | Bin 143360 -> 53592 bytes build/bootstrap/package.com | Bin 65536 -> 69976 bytes libc/ar.h | 3 +- libc/calls/vdsofunc.greg.c | 1 + libc/elf/elf.h | 11 +- libc/elf/getelfprogramheaderaddress.c | 2 +- libc/elf/getelfsectionaddress.c | 22 +- libc/elf/getelfsectionheaderaddress.c | 16 +- libc/elf/getelfstring.c | 27 +- libc/elf/getelfstringtable.c | 10 +- libc/elf/getelfsymbols.c | 58 +++ libc/elf/getelfsymboltable.c | 52 ++- libc/elf/iselfsymbolcontent.c | 1 + libc/elf/struct/ehdr.h | 145 ++++++- libc/elf/struct/rel.h | 44 +- libc/elf/struct/rela.h | 52 ++- libc/elf/struct/shdr.h | 30 +- libc/elf/struct/sym.h | 83 +++- libc/elf/tinyelf.internal.h | 1 + libc/stdio/fflushimpl.c | 9 +- tool/build/ar.c | 596 +++++++++++++++----------- tool/build/fixupobj.c | 3 +- tool/build/lib/elfwriter_yoink.c | 1 + tool/build/lib/elfwriter_zip.c | 1 + tool/build/lib/getargs.c | 77 ++-- tool/build/package.c | 5 +- tool/decode/elf.c | 7 +- 27 files changed, 916 insertions(+), 341 deletions(-) create mode 100644 libc/elf/getelfsymbols.c diff --git a/build/bootstrap/ar.com b/build/bootstrap/ar.com index 4acd9ca56cea39a79a3f21adb202f8b32507752b..d57a4284f3a2d27a8a7960c6c09abca27bb2126e 100755 GIT binary patch literal 53592 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%0AgiruW;R#|W_p}kCR*>-!rB_{IQ zDrXUuy2(h-NJR%b?YPiiv`JxhaP}hbLpCTtgCcHvW)t3_K`tbb^UPOm<*&*{##pg1 zX!gWRsS%Q$$Fh^~tF~tsyS@Y?AGiQ&mVlR;9n}TDjy0YQw{^=b?<^KCvksDU~PbS&!OE6D!FxBsI|+=F)#3%AUiBRHyw)RJ>yk4DKC zW5=5)U-GX?Hm7pBPh{snix;tM9^IXbXk!MqzM-9bOJ+#3U3BRktBDZT&FcjzhSf8S zTS=f5UFu|Sr!Z0spPL7t*|u*exemdZ@@;JSdl<#0wQsyx`(+=8L07(F|3^9HebAos z=myGZOsLVz`nYb|65zTZUZeH>5=FdxxQN|-H>JxMtI;OMZ*J9sS?3O7&zS^};AfS( zPz0D4mSfsM*)s@}8)*YeBVU6;l8vePpymT8IA-BO*4-gFof63%dK1T5aZnftj8FU& zz#P}+4;_*}Q)xp@C%Sa)EkuwN>6T%OHxvX}V_uR*p0u+xCaFva6dE~CKR{GGM2{5RLeIQ^Sm z8?%)$EsN9Qjd))9%@A?+X|Y|#4(PpmJun7yo~#?_gW!M9vp~+MOWw5SaxfVKefo%j zj^XF*xfVr3c;P@_1$?9o58q|clYCrv`Ub2zbO z@|UzXUQxES_pbLKxUlu=`gE&%bwdSO6wS6L%RT+>tFGav4;6e)NbkvM$UQoJUPJCs z!3WGgZoBpYt$n+8sNfj$YtB6~|53C3M?(cKFn{J+u7%55%MBGg$^1{^sLs`B4MPRH zn7{hm(4$y{!v7%i*X_73cG<~Qur{#3hcC-U<$KUWr= zAI&U_4i&hV|HpGVr@{XE#GwKU^J{F;%Ba?c_Y0YS(vEu`xTkB!JwpZg@JE*}T}fSJ z>54sbQTdJWyvgtn^ht6SXu~D1gpE`#dQvOr#ji8rP0yq+5DlZl7899jhEQh7&A0aN z*@d+mYi8L0Y^L;Pcx%-Ws4m_J1w0s1G!JCxBiZKe4O%WzgDbI7!E4xk*tVq_NGK#t z|Cets);$WOBCDWV#gb_N61fFRj&}6i!}5&-8cf{XT{uO)AgNh%<~7g0p#qvvmNL1> zwZ>=9jx*j(-3?h#i$E?TGPplsz$?Xya9sB(GD|{ZBC#+z9&S-G8}1dxr+Zn7J|ro> zt0c%P2^w|c^DrpXkK1{Hlo8^g{fSAIoVSy2jNM50fAL1Tv0D8{*Q#*_tk~c0c+DP17?`LG)@iZf{3DrnOf3x^ z_C2Xl-qzEQL$}B7tl&CY;JGa2nQ1g(N~L3!Zymu5OFaKaWB{D%16pdvr{eculVB+CeTo@_JmBO|US^5%6*KPr zsx4)dgH4D|Xw&vLK=C?nD;h5JXvsJq*<;XnamebJ@AMLbMvY$hJ)A3X)1 zVpDJrV)W#ureHly!Lf!V$*fr3I=r#P*9_8@!eMAz!8VWvjHhkgt64VBo5rVOyI-u} ze3(G`yrO6cysq}5gg}mLEhL<_m3Xx#wb2UarFGL3y#NVK+RyR9gNXntR2iC z#i_BrFh+y1c3}K}+864qE_3bDd0c5&40%c=A>b<&It7m7t82|QPTt&DWwWoa^40cQ zYe`9of#Z43(Bw4NSPcfw6O!6P;ZVRYyMw%2bgV>RPmv0exUno@K z#!I4;ip1!bAwDGX6>hOrDv>*75N{FBH3ioNLmfe05XF$lg(5N^^6~9Ldr0i!+~RFP zce}ucfSNB5>flOCDNOQj7!fun$jxcv=G??7B?C|k!dX0`ge-gkcdIl4O_0-K;7Y>l zS~*E}V{5}75O}}D3+-XKOYzB}5FY@Z0v8GkL9V^s9p-`|nMW0)aa_NUZ}A7+K(IuT zMcLiLA&^&}d5Y%?MS@-yDs{EDgaSMwA(M-~VkPv1L@^SU1uxeg2~uvJKu8j}nMu*54*!)ZvxII5RV5u3s?r2!23!n3;e4A+u#oZmcbtdTno4z zun6#HfSq{%Yd}5xbSczhfPWx}@OJo!XGCHe;;5Q-oFmm0C*g5D&Bui5dKWa#kM1!5wHyY z1%Ofbmjf0dUI;J@csF1#;3I%~z}(T6XA8_ zNBC;MZ3w>;kcWQ<;9R`_CE#}W4*?dz|32VazyZLw5pKf9>{-AfKoi1O0P;vjCO_bh z0H*>z2{;$=jsaExegIeo_!VFq-WNiDuM^M)*nn_1;2`|Cg@W4+|IYwdBK?Da+X24- z+y*!`2jvBv0~kj9#ejPN9e}-nw*bxs3;@0jcrRcl;_m{i03^Yy4dE{Xt^_;|$RYd_ zz(dIQ0^l}4G8AM(_*}pW#9Ixx6>>~_aJ@U=_wpEJBJDy@=Bm+=Wg35Jl<>EQ0|Eu3 zC)S4r(Vcz+PrF~Ha7T!jBAzy$jb9j8y?#;f$TV)I-q3U=ND^m9I_mhsOI?yIwDTS} zI+?w+ULAK+U!WuUJs4a?-tF~@^sQNJJcsBHef~}mjQ}AGf6WiUg`gNt-t6&j~ zw6_Q%<&WVClY)wXAaO3Si+8uW(Vgo@4ehLkAW z5kV2XoF$DUFbqXRAlwp>y0~f@$c0WID{)m~NRsBLUk3cab!nm~Ven!&A3-y_G|J1; zQbz6c?Bl|$(C!X)@iZy00!wN#a#vVj1F*=sgiehAgvl^Y!=pCQIqU|)0l|lvE~u7` zTOJ9?Zs6__1TRWx4+Ml(cYtSOa3ekJ>=4nD7#0jSHL>(-8Ult%I4W3*gu@|``oD@96@}4u_|51Mv5;V?e;gur4e<7kWEaU&;c zKGd{j5X>icxJ3bjAHqk)b+@4CT-ET$>&EpRx)H{yvZ~mi zvMwHvC@>sHB?)>V$lyaaxJa#lkB!KTAn8sd3P6mSuCxdxV^o#G0Sx0K%Om^SQDS1D zTzC>O)P&hsI;zM%A`52=VYE+^9UU8AQD@@Y@M6Sllqw`D6qVfyib*5hf~lvfPQP)= zZj6bJYNs-afy?xw`s!P5M{QAV)RV!+I+S6V`l#CdN2Cb?d4vE^tnUb-3|^WpkS;BV z@EHw2VEtLMs6+dp6&DhwSJc4UXxYTt)Zdy9N3Idj7_lTn`fMV=@Z%BvVN9-6rWVXl zv~mzI<8zu`{A{Qi zvABe1#G-O8zf4_Jngc>7h$*`H#tj#FGSe_(Zbj{(ZfB#hg}Y|+?IEw<2Z+x~ z8RLLujK77|avLZnrTPhmO#{t$;fRR!g1Xei2ejm*X~icn3bp~qvnNc_rds`K@J zOkfbNBr>hP)@uA$a$wT%3_zM8MILMnj7%$4?9 zyK5E8xZ3V=Se?!i-tOQX^}KZjmdm`;Mu`9?gNjq7m9Mp%E3rnd28L$GD&E;(t+JbI zX9L|vYn5v@zE3?N1{OL_>+&X~g*XO_xekH{C$D~*@;2MBrCg638&N7}Q>}}zuWqcb z<7?}kh+WM$IjzV5R;KW&0dxbh&e?pk%?i{S31c(Mv zQDvn(>nXOuRo{q+O`t0KU^e6db|>YC6&Zbvh)57=I8Yo)k&&C~1z52Bt&J#rotdRt zJ(~O_oWXz@ELiEZ@J=+$AXe{1sK??FJ)p=_%+D(?FPjYk%e?D&SIFz-t4jDfKc;k% zUxN7xP_7_Gtwr*dgv8bxSs$ySWwlKidvF^q<`G$-9$x1Thmlb;MH&tzuflBFLl`J! zF%&?EwbL&*sGK#&RR6ERepwc(U|{a4^eiN0wMg)KGg+;nuOZsO(A?KK0E--da1U z6zbP5V!2db&>d(1bLoIkCY6#}s#>=sTbT$)iR+ZTqjGYA^P^80UZD00ztBGSf>ua?Ui(sv1W7Q#2foQ6G`R5jh>t8uTiesNYeN4aD3CqEbd@ zKoG+0(G`%)0Whx=vx!77!x$oDg1y=JqN6X)2tp!bK`{sIX0i8&tSmg}+c?uL|E(;pZxx)UTv}l?rcEp+kkYsxYX+ zs0z2M@DUaMN`-q>cua*KsBln)87d_vsE}9T{1Fr)jJD%R3Xa^x%ss4~i{}L# zxkt5SaGMHO!foKz!rj2N!Tm6k+$#&oO=zQVk1+SonLF@&Dsv~?H?-u=y5upq8jjp< z=FTdl=U26R;0|V;fcp_g?yFn^?jr6i-0PX!UP#aDnERTRd!vG6LvXL-c(_%}{Rwlo zYboSX_WXpd4A1}0Ts=q6Q?to^oQ3>~xxZnqg}wbXdv+F5oV&QSa07+p-p@th&gXW( zeM$Q^+%p`xkwS92INLEOniY}@Sre&<(Vr%&%^p8@Ug^~ZIov8!li|9h*N-clX}x5^ zzJ<(P$LeK9Q-JwCv@KV;OpQquQwc`%&!(Ofs^^ zw|Ly+#GJZirj3TyP}|k3W^Mo`;XAH%NxYsM(d_=Qj!qb}5neS_kI9_+$V>qCF(($09 z`H%WTj(Emqqjo^Q$MKq@&+&qz-|=$BLC5Z#jQyG)YbG3>$vx{R)J!|<$h=>}J>_`b zaa{kl{&~kkT7T|dNBa+M_`Ty9$14loa&YHLUUEF=xa=wIn~o>PJvr`W$Ag+7RrZeCGaU~=GlPvyN=yY*K&?unAK zMO+1^%gs%+M7MIfORoX2F?xEvnd8=fww1f3B9~hqvV<(rOMmmVT0K40-dy5l-m*KR zIhe+)PjQpHt*5^o#Boz5zuRYD&*Hw8(7v8U_6lCNmFM2$wsE@kHI^fY8u6|X&wJJ$ z@SPgxI~HoFZm52K-)&v`TbkF`R+)OgaQSumz1II%Z~XF&m)@B1x0fETdCYgw$IxAl z{5kiL=l3=2ZrE+Cwj9~azpLBV^U)baxBjBmUu#}pdp$I!OTXUBQaAJ0YscJY?!7D_ zqgkxUrMxpDAIR6=EDd>*wk2}!cH3u)T&$TMe14FsMrW%hqQUip)T7Z$<&ht@>bWXT z|5jPZ)Af;Qzo~k4kZRzbc=Y($8o9Ns(bH@4G|TR{6Zk!EK9S-(``DXja~vyMYdUiO z|3NtKZ+9l&ap!>KrP%}02j?$cym;=CdFG+Z%mdOh1`HXH{J43=fON|M^X=K@6+?&4 zEiPWLc)_B%o&xhM^PoXy&&t9A^IZIUVEDX(Wy6H^=}QLy zo%LTKdp6kv8lIi%%C$Krj~SZ&tTf4GA2W2=>ea)Cp$y7CbOjK32B7d&tIW?PFMfL7 zf+F+KLPS36894l|)dNs)^1ONG1#VzMsY~hY8J3WqvN-#`k)Xb!;i8VMHwSCe3aH1@15oc2Hmf<<^5TMhW^XW z74N-xqi2rp*njWM9M!r1nn&MH5&xu{#fR`uj$qar8E6C=|7eX^XJZYC5j#0MeO&Sa zH@Xa@gLlc?#RcY}i-&09VDx>nF<@qmHGAe4EJ=O@`8&#wX9^a3hpu2SfJbkLVSa>U zK^(n%0iw|z(kCYu6csHk8e`^ClevP?BQm(9i{|AQdbt#i8!z=8zdaE9j=g{P5AFL`|KQZ56jg3jxfIMoY6_>m$*HqBwI{C@^1q+ayvyfx zx_|GU;g+l2+c?h5xh;p?x$ak4TxPXrxI0Pv4x&__TW)br5dQ4WY+2O@VT35!?7qF# zo!RP5u!L%YzaFG^X$?NYt*>)iqHfC(cZC@RySJtR&|R4;x~A;wU37;#v%z~?*=|oa z|CQcFU7GE^cyEHgF3nwb#M7lD%9)DlYl6QVq;9{`dYdJ*J|wL_9OMjDCc~h0hTL`f z+(ESlu2vr%OI`%w@%Je2XdPm*z3fcTs4i`d=MYqxfvgw0dqpR7BEo&bGo}C0hP2gyJfxG0L6my*BXysbXRaqiJUOtaQ~WCfxm4)Z^7K; zPTi>E5ZC11>f^YOFv6Y6^N7e0_&%Ek3FeSH6{vh}f74ZAK!G$OM=Q~goGK)7-262_^w~Y>QpLz5 zE2!hRXp_5KxB0DGIF9G8PkQ782Pjg5(gyUvyC-MH_d@Q~cdQ`8-*g@2yH7u6<~Rw3 z;#Y`J$u5r5admpIIgv#|mpR`b*>sOCZ%T7y))((}1boDL0+T~Ev2g_65@$O6tXkL{i!!4* z=ofzj1N|sp7YfAV%{lbNan=}o432AJvBXC9d*mC>JeDsb21l`l_?O$^n?Y*daWs0w z(Z2>Lru1t_wrcOY*o({1UTtq<{kLaCLSg<5#ijAdE>%`+9F7U8u>)r2;%C&Rc zyytb?(>>^X7WyQd|@M zQC}cfdUyDRFpv+lp1BU5^CSl-mHON(2vEDwuP^>d_&0lYt~kN|n0;~^e<_uIX7>D7 z55n^b{>`2})jp%sI>oAGy@9qkt<)cgrZ_#bXU7?!W&066lT}L~zR(Z##`M(wqt4ag zM|7$9H+!~CoGNxmh>x45SX`XGSSKL5;yfdW*|Xye*WmvtzF2;$Unjb>Y;Dikv!5(3 zZu|NP`Z98~)P{DTj`-sIil;(&ax|g+wgir{#;4jRfMg8Mp%5MynmsLx5?vE9HcICoDX#8<14eac(zN?r#lo|y3xsppfJ?a{LPs; zDbrrREc2m2uhCA~9%6Jm<+GCfl`39me0M7LkVk0dcyF>(-YNO_BuKK!Q4%5%6{&PY zYaRYwX^~eXJi&i)miUA?`^T*?*dbq+WG_n2t56>WX6RCmx)06|L5C>0)_^fA`2PZm zMa9nfTX;{`Y?|7IvUOUV-ruA{wA7c8F8K@UuSfA?Ir3CZ~K^6)vMHa*ZU{Z6&fTp-X>rD0wC)f1FiVQoJDon{*9eTjSkR zy8T0`>#TZ7PIEvHquRdg@P9Bm>_qQ%Wj^4NTV2BVJ}$Wrsy?_w)oY-g$MvB#SXt_L z9-5x^({T@IbAsN?BCJ|;r>7OGk+`_0ZbY)K{b!B^wRZ?)(J%fcGU-S8+I0qen9X?L z7k_JC_>Ki)`P%fUc>2G1$FebciDoku%--fs?+o_E{om+Q<)lx=(EQu4pVAYg|5ZJ~ ztkD{0RE+X?d(nLS|4C1X^_x(9(gf2xwR61V#L8*cUvAVB%o;@O6$5X35nZGw#F`U& z!oQf;~Aq{MKL;J1}AR&08hbI9Wja9NR~vph}*sdPc0!^(qZut@sa2u@lo;7$7?K& zzN|i+#~?*_M!vU%{88Q`_@l-kbqlY7km-_If}~?cd;3rzWR-25UT23r8F@mHi&AE7 z(MUQKBrDc2vA=D3SSNue-fc_2*EC~ z25B`~+E5m=Cgt)GDd0@+D&-%EB-h%~yAGw#6iZaBNJdp8`LLx?lCL{1pO*q_c>m6f zwNo=8?>{Gz?{7_7ezaDf30_H==ZpKS>&08wWm&9ivv^c^Z7+)y-5>b|^K5!okg%QR zyuhezFd1Ke$Cv*a@43l;%~(miW39oa48gWDlDL(YQkGCseGu9VI67zwKoebZDg%#U3X}q=jd(p2n5x$~`9`Uvl_aY0 z!t+4ug6h*f$G3{_Kird)Q)}bR!yVC(GmsjhjLN9L;^mZ&KNQF^s%yY6XM$lpq8x$A zJjFTXqw0J_3st?BGROnyj;K*9>tCE!t=mzKU_Tg1tmsWOYD{XVq7fVIJ##3>m4$?t zL*mRDahjy`z85$wAu&%4_Er9|j__J36EP z`b_V+$0hlkrFj-93AF|uxjFHP@Nw|i(u@@KFhZpv?pF%DJ59O49Wt1q~8v7IL_B<^z@L*qLN_$O2XLbd*<@T{%_2ZlHd#! z8>RdPbdy8Sv^?o}T$Gd%P{v>#@uVB2vS#l&!q!7lo=L-(CrOe=-F6R#YENe%yXz0s z_p`gC;vMpWjlFx;Ef!}3kyu&2_7;Xnm7M?pKC7FN)spQI0$YW0` zN;5^mJE&zMh8x2zEo$~cSugPN4$Cad{*km=@`#RJUJ&BU zGzw+g5Rm*Kqovsy$W4$hyD}S=6$n*O%q8C6dZ%Zazjdb9Ze6#6w*_W5h`y_d%kLMe zB%M{L`qY0qBe1f;>Wd~W>jHRPXfT)u!Dvh%ER_h7q zB8%yw#Ta`9@yYRkuwCm|lM!OR7%nnE#aAEmCu(HC;n2b-U4zm+JARBhN z_)q=yJB_vm0b zPLa-&Xb1hm-qvUGu@2EqUf)W%2U(R)z@31(Z|rt{jhFaiG@}w z^(GmOPt(jatS3Q)icu<*iV%%1Wl{rCm$#J+vo=i0DQZ42Nb=4ZQdy%Q_X7}+%m$Lk zHpvensN2rMr%?J=Wa&6ZF!e>p)^y++<_L@hNKERKN%hg*T_Mu^*G#BOo#E=8NWw4D zS30vQQQF8CM7o`H@bDLgH%hgce|>qg#WEp7Iu`m#*f z-X2oGX5u5=tz$--yiA{fNUSzS4p`R?9drlsVXc}d1q_4HTuyo59TX)S((%Id;LFm3 zL%BSZ3b_F@plrB0K+8hSd=gp0&k#?wd2V?Gw0ww2^*_)wm;xTgw6=#bDA^yd*6|G|vwQA>MFsQdd&$ylZupZ6mW&zhEiM|qXlef3MeU!6=Z13L;<-;1 zjA8rQW^?Z3NfXSEi<2izv)n_^5%&xmHf&Zh+fz0(n4ukDG8l|SgW3Of{(;h+TlT-b zXwgb@;r@4v4wUYH`^iQ7x0v^DS+Rdh{?09J5sQ}2omWs~US=7#G&z51;mV=~PtEt3 zM`Vl`VP5Dh_AFR}E%-$RE3j{0G}m0T^vQxEPqEqKU9zNLW%7KFr?7a;@ZmAQVT+b7 z8ji{jo9|h?D4EL@r%D`lrp<0_hR-t(UOac@lLcmNTl(%5L%3n^2jGTbTKsE(Z-OPmk&4R zJ~(>@2QPy~^URFJ3xF{;e-$ip-$3L4jis@?ynO}pw$TDR94SYqJi52dYf~?$>Nvr& zt>tGqoSYy}(JTGZNsq>aHuVdr1OtWXI?SCX&Rfn@eBZ;$1vwa}w{in=IBCe0>Ttp( z=?zTXyCG&jy(s-dlCLxyUIRv>Cy{otB>5O@P^U392wlmfC-k>*Kmq%4l`ky^o00>i z{2b1Ny|G-pXW(D0;jIUB9KSF+LwaKhQ1qD(t;shZqtmxAaiMM@?~q%t9kyHe^BXar z9LT+{;uvmOMDo{}BInD+X6r2`kC|RZPbwh!27gl*e@honiYQbTruC!eNWk;bGsDL_lCC@!E8-XGuvcRLM$Sv=BV)isl@MR}Fw_xr^4KKWz zH5~K){;Zkw#58zL`sEYU37k3HLjFZ;3BPDfsYGYzGINl3BL*TZLJ=HB8nQG{L>eNby0Y^K0}%yD=OH!( z>7iZ#en!_2qDwA=14p!$!I=<>Wl5tTkOt|Y5=kseGu2lvGsm(7iqlYP2ENpbh0q<2 zh&upIMb3zo9@`g>LpebkR!9ujTJ)c)(gt)|xlWyu$#ZDbPpg{2Zn8z^Xc4toHqmEs zKOU>Ss8BknJ23dyWN@B0pe3gb#C9^4Ojc;nzrz|uzHAApe@Nvyxoj{f@P~Mz^Z``b zp-j(!wiP`WT_e1>84-l@t0E$17n+8sC4EhjH<%H0WPXfQ40Q{VD+g5v|A8~}bn!*( zTAX40QFi14Onqw&;|7IUjSgcG9dBr53n6vN>F2SEI8Uo5Hujdlm&b_DcU(%3R; zJi#wxu_z_%ptgd2MA8US@0!DNPX2X9iIzzUOwh$M{d^rVZ6%G64J9eCg>Zo+!lJH6 zHz`H0e*!>QL1bXG+Z4v=_AHjD8u*a0g)x=2z;C;0@Su_+)!NexPiYqjeZmuue;~{< zS^>lO`D#30V8eWhi)H_mz-VCo9qDjOk^DO-8A|A75bl)UO2d~^-XY=TkUwzA-?`g% z9kG1u0>C!_h()3S-D4vKh4<|Gkg69-U&0rfkg`fjVTP!<@VS9e6e~SbrCx(kTc@5~ z1YQOTc@TCU872nw_k)ow2o?=;$`|4+qzJH(#+mxi2UK;BIhFiW;3p_CnikwrZY zp8IP+Y8mzLSceMFgJDMKZ>1`0eG_9~>;|p>q+uva39+%BEcqD(A!q;sTVP}v4RuF8 zEKgsludX7dd;qj5lS%8PxHJZmigh~L=% zD|aePL}J(Pm5G6=2{x(DzHwxjginqCYe<4wo3LNE8L<_F02$3%#t?!Uucn%^Xd_YL z51|KAJvq-%46_hImJqre^XDzQD^W&N6N*~1stXs;lAM(oPxe!#W6k;ylC>5Q>Ln#WO%v;{vW~20uvwNh zwMW8)rk4UE*T%<#ly5}ecm5(_Z88f6oxjknoyb#IN%_Uvg}QiXVggakvS-$M>y=TB zi8`+9sD60*_w$vnVIBoZqgmC}Ta7#>)LJI5$;1ZpBu0z11yTj76(*`J)OI#Vvmg4B zaD$baMEfrwcjBBBN}oeUY?3JAp{>(^c9TdSoNw`p8}C2|2hykorq)VvQHX!F4_hN{2mjq;V$(fy!vk%flYri0I;7pODgR0Lzetw27qiUX3-yGYrQ0tJUV z?D1};l(>BBI7K`i(nR~mWHHdXZTNkJo$|4t0?&$pKSMqa+H@3_+QYHw%Uzc^JT8EA z;h(eg=ZsYi#H-K8@MNJcl^APZ~%Q0oFIv>>olfw9{By+z8 z*+h`3fDBp@r%pjf6Sw~Xk>SOtzPSBG3O>n#TPZjlL3B#$o79p0-w;x!ssVBSv!@Yg^jd4qAKdf4dfkcHC z#?7kfm~3U~amN*-L&hN&Lzr66pFI~@FmeAkGGVjOhA#8wWJ?RBggSB)Az5^(oldpvzW>+rhVJ}!!NZtSojw!r`B0{E_^3Ii91+`U=z_Hf8vl2s4xeh>|N^BbJ1u;VH(T_ zwDy(<qE5bjC-Jd8=glF^-D^TYlC@z#o)TRkZ=d*pmc~n-Ag=ILHy}hoaQbSb6t`zDfh!f zy&eiabc-LL=!x4%?1)T|MEa55;>d?lJEcZcMy8AYoxGTNQF!t11fO3cV(N7&DK#$4 zf`>85W!i-I?vk(I3FX-~`kd$1a5*63{UyZPv8?BX_fmA?=z4FL(%s(Eu&8I&dmh3L z#!&AD(YKNx>Rk^^4jpV8qxX6GMEZgCJWZgy4tVd;*+z%GMtkWQ?f?cNtxZ*aD>9t&06y*)XFOQwVuIp#|gg!SW5;`5{NZ zX2kxB#0yoNU(LW?SWD9KJv0siyLvXj_o@N7a)E3i>dBm6B_ z+VIoBm^}SaY*`MDHZ&Vnqh!4&Wt~u)ICJeJzIK9crlnDFwPaQc5AK8y!7{KfLn^}IYD zo@k4hq#-Heqr^>m&tZm$Z%4GSdA7Q977di~gBN~3TYXOp=Pvwiw)!_Mydv`FX2T2M zhu)LMdVhhW=m*XL!ganhjEStIW#Z&uj~0xwzdCt{78;Ib-{^VXTYM{cueY~vg>JD| z@U2LA(whVyi4}TIczNgA-rejv&Nna-Pku(t+TKy{-Z!v?TA(I({`==dZayuP<~uRr ziCbsVlQ|r0wIW#Mz$5s%E{8@lYRo;N<#@e4M+VD5((%VRK17a6te?3m!XA7c4|N{a zbCObQ41YhH<0fn91_3Tcz@5-z#0t`ww?2y?#C<0kRsu3cHI$opruhd&%)0f_t&g8Z z7XO}TRTAC!Z!khWg3q_WVbkN{trMipCnO?mJ~|(%XE##AKK$N zz`^vnbt=*=jh)K+3{caw4AkD#PlgkPdD;ch`6W+wg6mn7d zGsIRp=a~?E?;PWv8z9=EGJ}<4#~9aElmYuj1Zh=?^#QFqNzY1L$8$kiih%KVBdafa ziwL5tj)LL}8b#PLI1k^EAeIlo3y1_<0^rzeCgmFh#7minm-U0<(Uro=$iu;_8r%`! zCKr#xzU(;+>4}a=gHOQH3v62er7*5#8XT8-xH_rFcY`sYzP;Jh1HT|PSwiQ9w|jq$ ztpe{*buV_Cq3wO_ASK$v@0H}U%sWcGV;-^(dlUq_fI}@^%yXGLy|)A((wJyNfvP~s z4^wghl7o{d^a(;tje+-Zto?sbmzA^i3^?wwXso^q`p0}&pNV~kHO2B#d{%;O9TzRD zp&et<@&J-(P4#d(n4v9N{*z@Im5vl`(Q>>1JszGlG1uFvQ{tt|m(-KfdCt0Slo?$N z8@yXPvJmbYsT02A;bpYj+eO?;os2aZ;41S`S2SHi)gmo$KKBuky3?`XN{tH-$UOJh zqf(%NrteubFeTJiCQ!?-JtT6$O?arkOrjdt>%$|KqQ}av`pQ=@WHf*p0w@H4q`2zC z$5+GvK4=5@h5#nT0lxLd0B8o#FdQU+VQ~Oc97B5%+(!UNjRS1_F~AiAJ+fVJkyAR ztvBQeKl0BrNR(mijTvr2hRT6NNg>rMLX_kKC|m(`yshG7d(uelPgrs^ELz2X|3U{q za`Djs^#s_rBj8g2WUaQY4TyEE@4Cd=y{U`>IA({R(6#dCZD7TOYahVEg#e)j1s<(I z3)_I^5zr=v3)V2j#TqnR42_kIh#{Rv#2Nsy5pg?gtpEtws6Rd14n)`<1CR})0)V0L z?Z5s>K-P6F9RW{m_({OMgwfa$a7!B?dgjkM7yXr?L(yvhSXtTzaELHf0l=wb^I0U6 zE{qT8?{fx5eqekqhYPoY(n?Eb@D~~Q(8jR@ehlF0&Oo{b-VfkZ`Su*gsDN3>K@#B_ z3a8}u@>%i&vE)E3_kykH(?0=XXZF zGnTv?$*f0RXiI0(?9WJNlEm@b9|15~RPsLnF#6`i0ZefWy`g7o;*N=$adCiUuf&RI z2VnB>wm5+E#{f*4T_eSvc+duLds`7~TznA+__Ky#Gb9)!89FvevY)pBv*P}NPwLN* zU?B;TjHF1o*MBnF{#iyw#H^w&0k zXDKsOEmSnm1Zp*bdh}by{Mh7`SD|IZDA-9E4}XO!wtS9^+mVqb3|D3zq!gwoG`Ub3 zI>RbX5^z&E4XDs#VkppS%G=6*i^`_OO2@K+q9UAtOenLyvZ4+6H3G(xj>@SITTnz> zZQgAIdYORk1W;Q|KDn{@*V}-fCg4_l#(`PUe~sKg?~832=23>-_>9vl1yXdeYFC7} zYb9w6zJX6KvrM#uhIs*t^U{4N#Q~+B#>&J%FCqME);x?&+i7OGk<*hIovsjy+m895 zB3uFvtaW|GPMK9DMbIL5;-TIJIN?3lSK%!;Q?InQRNjx6st^GjB7h`@$lekz!h+J5 zebasD975R_h-KQUW^%$AEr^hP z^ucG5F5#ipB7N)M5NA_ZdN_R)kibB}Rh_>CpxeF!(4PQgQwH918Yaz;VUw?%+Lqp( z(o3}T*TP8OLg}L@Jp)Nv{<%n33}-0$aR-v`Y)hU(*>hNOGhxp{a@&$rNo`aSHx*-` zLtHJz!MNHn?l{Gv_8sHyqvFy!$K6G7`p$6=Q`~t_)S-+Vii`Inw&qY$8NT|?aE}oj z4cQKPpQpHuo#TE+alhysw~XRebdFm`aq~LI{hi`+JIB34aU@kcl>1*4H@I^ggX`5f zu8QCg#i{T993#L8*Rqb*+L%3Gv!J?#b0Nup-Mlr=e_eNbwd)fr;l4ZM%t{&OYan zT#e)gO9(z4fbiT>a*^JbBw>4_l;0@vdtk%7NqDbUpCJt$NyeT4$f(1=TKsD@FIyig zu@6x0Y%9_8=_o>HX(WUVK={+x+{|9h8XX?pZedBSTbP5L-?{i#7=meeX+0IPygRCY zlg5&`-PL~@d`ST#oF+yH@x_WySjhJhQ{qQ8$T&GVzLdqr0G3m-YdhwEU9`ed?B>7> z9C59|L0}V2aX8{r)T^=qO;+_g%;mv<(1f1K_TrET)ejB^nQC#b%7bkn6$Ek`Y=k$5 zfAy}Y$4JweGr?8wf~dPY5Azuvmd(Sc@yA+p+7H#q;SW9hEPd8#Fkq^R*B9ubn za7x~G|8ap3;Yb3G+F+jC1cVzs-NYc0IqWms72V^#1Lo%bQoel`j`|Lk5)9*e>R|0^ zZno+ZMB(LHZ2U&L;DM-wS!wc7aWYPM!Muby0P}!7B!3>X=I3zg4<}K&f0x;EBpM3t zM@_tABCF^$O!Zk)f;VkGRrrRS7qy%_V>zQC&x2A)4FO7HXVn*vZ({@My&0#n(@^(* zsQae&y2JgA=hXAyp;mL$ZIjskBZp7I?mjqRLN=VD z$a*MX8wexTT15J!%!AAB#$ghv1XE~q4bq=Wa+JV1qPfNM%^52s@?lWA+i;d9kXP}x*&oJnn|j9~RrEIr z_I19?Q0i=JbvP!24Ugk>_K>+~L1C?ZmswJ*MlyktB^ei?_*y`N6tI85P|!i>L#NTs z>s}%RYfWf=JgaVe1wwQuT4Ol!R%q_ZxR(9^M6T*-(zOs)Y|*Io6-lu#HMF{0smE zPUW6~bAZ^TEH>lc3b=1s8r?Rfw1*MOo7;}M-0oIVa^2Y1@g}>mGsHamzr;3<&h1}u zo%1$CQdo`8M-5*9W1W3FyVqv%cGd`#q>DCGteIkE?Tc`mC0>$;-i93h3Ytigo_m_z z(F31=1n(Th@WnC6Ps4La4~DOy;v!h1g;pXYR&me5j(0>7sU26l4{Xo1V0Gw`1rcOBjAf>a$gV@TNL^OaUWRE5sL zDCR#9Ra5Z^>cINtC=gc*xMVo6z~(&wV5&U_!vM<<&K4NGN$>529Tm_= zG4}&kV0${} z({M$h#)%bI1;TZu^70y1Gj&x8eV^tvwm}wSAO#j@el%0oVP1V-Mb34*;~DfUmJpAtptk!7T>*F=npeXqpV zME0U%W8z@@ik)v$VEDHV`i+%SeQh<+A~SxC$fpsB$t5}XTOxBa6vZ2fEcx~@IL5ND zMJr7BWXTWKGOmD+(RzQ&UBU}5qu*k0o<%2v^HsqlOr_NC)Ky>$`F8}^9)R0F+U&*6 zoFQH0JNOj{@0$V>8{GaYNy~dur0eMu$v6WC^})e^6gjpn8oiPzRe#;1*|7af8kjfV zFfg-{AY@LAlY|Ekv#|#HMuR>YF63}lX#@p`8yt)K0ac90WyIoC#5tdSi#{_PB_Ggy zDF=-Ba?|I|Flq+gxk53vyDG73rZtyXw*Y|TI- zo0X)?7a%&*5l3o{e9bxbE#mX)ajvJ&WH|UQu?g=TEGnzh;Li6G z=vp8huyxdIL^2QN8;|J5p zRR@lEnUL^3C1hy{xfD4%K8xR}MXsR8Ig;`aZlT3}Xt)8bKdEj`zR5p2!7EVj;JD15 za)a<-f}8+B`#E_li^wc)rzG0^!8yO|#yc>P--T#eMYAzA7_|rz2oBeHl9^|Onh5|F zf}hlABCYpw$cd6&G=Mv}p>-BQ*mVR#HoohaA1E@C1B&3Fs3{~eofFzsw5x+}ZjK{Q(7tFB3fIz473 zR2ZO~Rb51b= zM#5LGS^eT}=sxp-4{0>k)vo<$tCE5gTUSQ?f~H7Js^{UG$?oxyHxLUE9F2i#WkKs4 zY-36Y!jS#SVQe1uK05#|NujdF=iE5wjdL%bavnXlMlS|(;RD(TkByJX{2=*{pO=Pw zgcDBb0t?HZSaxUDKbH!F;Q>j`+E3RZoGS|v2RK2hmhz#T==YGD3cN60L3k&nIOI>U zA37aH5=B&xnvZ~7uFHjFCC@o}Q>Aj*wSGJ)Af!bGh#xWkR&tn5O(l|cWzgaSoI!PW z%pq*8_o02PC? zNjfeATb8Twrldtk65b2J@6?h1u{5@K9^#8fVoCEHlaL9$ry@d`*w24Vh~l`rQ^_$& z`6Hz2lO|}+gy3!<5ThSNLdY}mCuL8PR{GGNlt16L&|K#Mwo__1)D=SDaatBst)V){ z9MwmlSH{C(m{}qz@~hOpslQ>7htYWmu@3(a?CX^J0lxe@2qNm4q_BXxH`i+mI87qq_<3Pu9Vm=5(Y?;hCWkO#mso4VDjg6Z zI6KZpm!=&sN3`CNUyFnJPGLew!XCrKI(-N&&4sf8A>sUpUBv z%FXl&tOlFaRn#eJBB!C`P{IJO#)@~chu>41yoYZMKgOHl zTcaE9?Xq?{Uz<2Qo;lmsI@UWxsLJK#gMp%;|2pM5J=fpbcX?0vVvWHe^A!ohy@_ij zU9FX8Mbu@DMRAE^;H$PS5sK{jAF0^5Lk!yWcMei$u-_CYA{C7;M1ZI*?M6KzFafUn z4d@E>#fg*T^efJMI`N6a@wgttit7)0;iSv^t9o;oXcx#hgUUutKcwkO&ats_Dj5K_ z-nzi{L>e)Xo9%G7>FtkZdr|`v{z#QJ`p=mo3F14v`bsaFmOhsPkMoYqqst*tLU2ip zY{0c7{i1B-9wU!j6^Y9XVy(U(mTh`iQcg*kb)MUNj_P;YGm#dUg!-N@@d6=M~qU9K4uCyJA!#-mxW;X z+a+EmPwS7_E=1D}%?EpP%%%E^8~2IsItdyT!#*CzP{H-GS4r}`*ug#v^}$iOZ?E=i z_lI?2y$cs!Nj~qm3}eLU1n}e~i4Qq&k;@RU`>;Qh;m(n56R7jWn3pp56dlE(unFY;S&9aTE%Do3qcEI* z*h-?Za@R399#JTgLUwVtP*p9whiMR~aQI8-7NLD#hl%Z^8U(wvHBW!=R0^!nv29k{ui8<)??w3|Xy8Jr3G#FscS6L5T4L64 zp|k>2Wz7^yH{*@7bYd`px^$hr9^YIQZIM`xFgNpaYIZ6Q{?`f5e?uVD@18@zDW7%( zR@tFmMsi~P1dHUER@ix=@$$i`bzMq)bLsgp84 z6-tK!oA7=zau4@zXVqogBP`1+**P{qM|QTiFI&!DR<{_nLn8Y?u@opyBIV~#h;s(= z@50=DH{yCyTp$LQN8|^JZ=<-Ch(ooZZ1e{BC~}TYhww3iHD%<~govq_o^VqBE59mc z^%Y)#1(;%O={jN??er2Gv5JH7TPTx>1~m0dZXEtOaCNm?6sj=8p}uybSZ7ZjL-GC( zy18(ffKCjypgoA)iNx+J_`nU;zd-+{`r72<{^JQk>1#-Xv0W&;4UHb2iiftV;^4oB z0aTRpxP)2txaX7HwcE`q?s8u%DEkL8W3m%U|BD4Yo&~H`oq^}zL3uLX(rt}AqpQ}) zFVOUkGxpeLM@uu=r*{2@)SFI)F#QU6!XcWC1NpK<9#p}8)Z>ci_wC4NqD&$#Js%Ih#TUl(P?SVj4Y3qM#o>fqx)7P< z8fs~SE3jymHlCy*M>P&OhI|!gfA~MJ8_>Sr#10CoLlM_;drLb%(ZLOOun_}>4!AJY z0oLRV_1M{!thMq3}XP2aJC#9 z?O44!v`;cB4vgicvz^bOv>Uc1V(rxtSz{HgoUzzb&G+Dq@i&u+4_vxRXW=&!A@5>g z2SS|6tMuu)#}#jjJ+j12K75Sw$-pC-q_^l-30w_wdZ587O$y7|Zjh5Zf&ij*C zYS&dWR$Fep@pu%Pkr_N<7yBAnK{ziYUkXe>v#nYFD5lQVBVbehE`L_poX2wL%ua9Y ztZ4_HX_S(kU-BEq!{E+W`eu^%Fv$_$7|wGqO@z2z7gsNO |HF6g@+vJU(fg-asKDzTh$X(W_SBqD;>1F+!g03|7a=Kx(pS)2 z1P3~A2c0~4hILsJ);$%bhFiKy}VGXkXiI`kwTx=JS8 zvJk9RFsOB&J~V=c&nlEAdG{5WBgS2|7YVT<{OTCvHjzCkCW~XRO{236=gWM z?;or8E=MG8V!(2WR14f-@*N%X+I5+BTssO}zy_+;Q70xtTCytKwu!V zccZ!-vx7}BvvOX+j+W}C2-zGdD_3*1a{myQ3pDg2o5k(mG8bM>y}Rwk^fLU^_OaEhf*WN+sVK;}bP$;eo(;OgWZD_0|(?YV+I%xd)3c#j2Uu zf|T-GFzvF>Wb_mm#wma2uE}}^lP~T4UHuk96J0TKd#t}fIh0LwfkQr87d^*2NZm~! zvbl;DBb2fm^Da2${V3MSeTe6(RlWZ_5Buj0(SR_693U48M4VG;QwtGQ>YaeC<8&Y+^7c>2Q%#^Xs)c~>I9B81 z2i(qxa~t<;1otFI3P-_P4HCK2zjFV&;Wq&cHLgTn{r# zuN=9dTJ7p@xy5@pcnw^p)HG~C9R`1olOaZ56xgmKJ51miojL@|E(teKRjUc|1r68o zcX7EEon++XPa{XEeu`mGSGH%|z3MCKkKf~geddAFX~GRL=nfou zcVTU^0vsTLlMjKTO_VdxYv`noyIe6WOV*YTMSxQG&0w=~XDF(d`sCpbb8&nAy76hR z-OkJh5gaeIf+Fum>MIxS06XPf)NZg~!zpQ_JSCmhXgtZ9&_Ew3H7rI-^G=gcb`oE5 zwQrx#w|ArOq#hSd9xqAqlw3r-t3Ito%s|8(M7*XxrbWz0L?Iwo zNb;`;xlJhuIjT>X;VXleYpqS#k9&z6JvfUwffFnU%Z-DX9VZjpQmz z=T67RuQu9m=abKFklSi>72X5#Xb_|u*7 zCrr|(+_x7;SJT2~WMHjbHB4>qB~iFfhF5eFQi|adBWs`a;}Bofvjg-&f}YIEveNFJ zP}UD0#Qfi2RYJDF@wg!9M0hx2x1!!?o4oQWj4=q$b7}#`RT=Er_JZ>8Fh&h3*RJ0} zdYEF}k&eS-5u{Qjx1z-ek7{XF%h1HMC|6&ZhBor=GR69oHvBPwHIFHERt%2Dw4``d zS`Ro77pcX#p$`Ec9TL&ilhnZ!7m93B`xE5v+vcOV{tX#If2pPeiSnm)W#3}4$Tr^s z8z@L38ZULLnJC4D#(@p=9i!_{@WFC`p;eia-tqKy^ig&079HVW@u zjW)DvzOm8D#^KZ5d2Xy>AFkB({Hbj`x332nf7;fc@!b{n7f8ONtDS|?-zGpaL2oG? zp{IU{KhCB31>(j7Xjm!faMu|k*F)im^dNoFU&~|tT$+wt!h2n^Xp1E)35LRu&A8KZ zj5IVh@4MxZ&q^immZK5!4l2fQiA?xn?TNp&0jVpzchGkwD7^47(y>#(Oy+(vfczQ} zxW`y1C86za9f0!CCeHi=u#;!fF?Mkq&4zB9+;6;;O@(+Kaq{(%v~oJd&h|Ro@~Vff zvUDhiMDX#Su=u{@5bOJt^g-dphzb<7{9`85m@I$0FblQt3 zcY)5bAj*awimU0!E`>W~sB$A=knB*Y=kLbwC~3V4P~rJzJW0<>VE5L+66p#!lXQ`u z?(*v6UHr$!CGBx$?iWg1Ffxh3K<6A8g>ey%Ox1@@N%?SCf?AkORN_)JW@2;8DY2>x zrF3NhE_H{KqEHG$BWT;nGj+i&d!~R1t*k;#;ky7Ao8Lix!m^1tIDi?}+4VZ^UhZp` zzZCu7d?otNh%ozI>%07JXJAp+A8=Ds1(Fw&E$|xJW(=xKLA1_r1Y`JEYh48WVHY0l zN|k)jcOfe5*e&9Z!=e)m`4FBJ;-PPBau{6j?@qXVk4^pzLCAc{+>GJK#<1}ILptKv zSN_wY8#@ug3nWF|{;{wqDHM{sR*nHiw>(7`{uv@-bntM#J>VHnY>IV*tTr~?4KNA4 z#LW6JE~nTL>qLv%m?V^TAt3yXLKy6^Idfw-6G~5#9Dy&9xOD&(ZTJ?^&h(ii>X;CBM*Ms6$F~T;tp0HyF4WPkM{ahX@Yt+ z9NEy7AZbJ4Ns#6N2n$GGQc_B&QE@eY7K*^Nofwyab=()2_m7#X&m{+bL)uHy!SJm} zwquLBAL~Jk_6|MBgj8&+I?!<@De0e(Z-^O|Y+kG|qY@xbALnA(DR{4hn?M7s@^BEt z#ac2HjPN1EfUhKPw3EINfjxjy^tEOSrDeck$KB%0j*Jwe=)02bDYB!FpP|d?XE_7< z?*YR-tjtWrRZI~f)}EQw-r+PPVB{TP3rK$qNKN>g4>t?r>v20s%DrOX(Lag-vB`h+ zW>FYlP5AcVT#Nh-p_2P0I&jma_YFzD2@Z0sU*YzJ;obl!kg(7>hRz-qK?=GTZK}`~ zpth8DDQVbfbIG53?m`_RP(UO691vlafJFVC`hr{?>4q2)%iL<7 znrpD=YZ>GHmc=26K}QEZYWcB|FIjz@JWO<~cJCQ|S1>$ZMl!rBg;E89(%nKS?YubT zP$X5G8&NbQ`b^)Iv5+znF5W;ckAeI#Pk^JjIWF>RyFu|de4OKpc$y9() z_8>*B<**NnBC5mps)vgz)= zhx}Q`IqyYB;6b=9*vqje^!=USm*j7PH_a}{y>!9h|K>b4Y9RhLlfzyB8@#d?&Ikn? zaTVPwPC4R|KgROgCD%rJw97k(GIbx?8aFB+^OczM-YFU_froID->eGnm+&vxh`$T< z3P9jiunD#qf+VketSOb%o7D<{1E`$tQ*RdOU^53jY4gKMKkct(o^jxc!|}peMuS8DJhq+Y@8URn%5TTvh=2f}cIpm;|zk+=qKsw}$u?cq7 zy;1oJxP@z-&RZJ8BN!Sh3@Yc@*>-UUu_Js7iw3^H^d?*jjZ_dDHXxQ1Vq9`XURUTd zvVAjaOWc`+>m4Vdv;$Y6%X$$yizqT=F+q*;Bj{peKwvRn*VP&hR3p zJSe@dtB>>s7HmNTHV{Eo-C$u*f6o$y(veg`U;~j?h4GC6vV(xs>{$AEmd;p4u4}}^ zTxTFa>_WjIykOL!sw*3)=C~!2P|@n+B-U}7fdPBoST??1js!a`r*iSF7%Jb!dA~Bs zIn*>Ln^XSw=@lUaupLscu5>f5Q=V5t8sHgKwLKaHhiLzo#H z-hB`j-conDdR1a8dd09F@K}zoC(AKGn>s*04`{YMqrwNAnpZK*j)7;#!1)f~(+Qk8 zz`hy>&xnC{i-CU+GUBuhCUBbWNUmT(dKy8k8I&!=?BFXJ%^bmXw$W+(30QB@dJjui zHr8RG6Xks|Bc1xQ2B_rNGFy%2)~rEgDvUu$KEYla$ex6409?nWUQg0sA0gw|LNqqZ zf!jSP$5yhGDjO)5vV}59F@xU|-OxzXFExW--!u5z9_-Q)ZPCbRszANrYIVc@AO84b zjAF=xX891vhM8Z|@m!GL)owdtgDL8Hnr_idz#_xjy^8k!X=JPkvyt&Mv}gS34Z7$u zszyk*W+w0$hzs(h{8WqcN7jl5|Lx6Mg^!J|SoHQcb zv!qT35!Z?6vWLJW#zAVm^QL%@58oS)2eC3Rf!NXNUm(qh*fQE^L_#4FV1R!Q41(pI z{!HdX>@r$MQ;Ct6D&d{URavN8KZu7qzlPB@R--Gtl$FqNe+YdhgVDmY58M!lGZyYc{8XlTKY7})V?h>ReX);t|X^a_TJ6S)l z$BVl$p8_r*s36UsP9GtvZ&w(aV8N> zf6E|G-ts&AEe2dMs2$pVj#AOQ40(*?V*Nj|j!)8Qj}z za^SK)p>!Q0C1nc!!d0Uu9M|>W3I?^#6w$|1?xstolzW+Ni8>f{sKF9X2PdcgAIi=I zKC0?^{4$&Hid$xP7 z3ulg>;;6a~=!Ii5XK|@OGyL}2tbn^MRHuu+uk&J1dX^=E4o9csN0W!wWK`zM`b4Ct z&Uw0y-!_5T`WKwsOxKB6*Vyf*3ah8!V9$g0sw@6)6@k4ku5C+Phtx~30PBp?)7sQC zIN;kF^6avcKaA~9?#HK}2BGIHZo*!p*PXNQVgEV*zHFMVy;#)a36@6f#6`bqTX3JN zzb>*v(V@plYxp|1$rYh8LCxY1ND+NA5lL`&?K_Hh=9wskeQF|zCOF`6aUDFfh61mx z6+_nVa3pL{)&k)ZdsNKLb%eHa;epZrB^DTG8Z!RvfmQT`+lwV4^T>~PI31~)X1$6U z9I)9+t1k4XwpgaS^G8q)k<7+F1>d9eZ+Pi#cNgWnfZ_9WcTukVp6V{jlHUQ=<_0xO zDIJ-@dnn;$uPg2)*q39%t`YA-TeN;9q8bZcY-YdpJU;m&-{bG_diTzt?lb#jxIYd~ z!-g&fUKn8%@9kNkPfgd!FG{q*UTvG9WkX!CZP>*IyZTc(%EjbBQho=zsml9~>w}-P zdW^lK`0KVU`Vjm5=`=Ud**;+766PH18CEIriC+_XV#nbul2sHs)B25kF@|9_I^37@ z68MGfx9;h!XiA>-QXkX@hq|4%ThBz@h1V>t%Vd4x* z*k(5A=5Tl$ywsZYwoj6~?-SzSv}m352N}PHY}L}87p)TB%&M39Uc|_k z1$#^2mSrJj2T!!}MGw091uqwKH!kRyyNB=Exn-vBfa!j`(Kl>AKFvTn`=;y0dVA zwG)G->GD3yima`WiOL^LvCV9O*s11^hMIiX!9vxQo+bGio1P;ey#rkiofuo#iEe-G z4BnNb%wMKy_LpgTeWsjjHGd)7x{;*UXV~<*e-Akz0l7YuB-iT`>05RH!3WTs&m7I)2 z{--@js3*a*S{7cBJO)RSR*XdAQK9pSB4tviUBiQdP-TPk8SU;^ew; z8uBdqj8ZsKa1znO-p+II49QG_Z6l-lBd!Y0y~2=t!f!bj?c)V1t&G?x(+IB}- z8DPnFFEO&%79^Z+caH&2XM0`P`Y?s`&EA(h5gzw+;umDi{`PT#8$pfF`o#w5!$0nTyy+MZ`Kj zVbytVFXBxp%9#CDh>Xw&DJ0zVjeCSnbP}tIiPusHA6j}a_Fj7B+s**CuYaPveGAJI z_|1t$^G>GUSR0w-^1JtH)tF2j_C0c1HNqK9Dv<;2j@a1>cQe$(-O5L6EA8%Ijr9X) zo?RAxV=q0sF!XbtMCh0v$}yGkyUeJPFJ;Z@ZMq|NcldCR@;k^TLzy1BDN%HKXj-D^ z#i2`i+NZu^7=J^=8S9&ORYN2Aa)9>>Luc|N64G?M@0v;+=b1|E@hmMty;suhJavpi zg>H{!5FCH2d*|%gUNoBMLs!0DB263Z33GX#*S)s9Aa!J6jJC2;Wk{S_pj5ZmfN*@_ zoPL~W3H7f#kLio`RW^1UIRTN;>@^xunYnk*?ip|LES={Po+LB$Ma=NK_s!1a6wXMB zXx7*GS;kz}$P1Oj8v40}t3`r5DtSwhX=0nigC{GsNWX4cKZGG;7XNYXQ=f;|cRIx6 z`s_hu&9hNK$h6xPn6CFFaY&cMjgpwzCGibOYy%xS7GEKWdlQL>tZD1p_wnrK_{chj zc;`a>T~?`E$zkaI+7q`TNdepD8V_X=Gh-6(xtuk@q+p=yq>ee%AzGF2x?rmPu+f$?_gmUM`E33eHVcP$0?(m-W%8|4=>-GL~db>Re5tmi7m_cHd_@sg?!p^M4bV7f2x2D$e(pAV9VbENt;>f+%mwRMl*rwiCv)qHe`V_{VSkkQnj5=ga_;{SC_o6-%cIiGrTdmVuw zgZi;ck-Yz2B%ZyiOM!1k{%0t#!dPcXjC{6B$yHrTCdtKSll6XxO(snQQ0%j4utxt%(8jwB*UcS_8a#N#_9CacZvQf)Hb)g|3@9loDR z-e&*n2(hmuQJh24iOCuy-gHMeB-7vQl5V;hq>|a4DluIzOX78%5|cGNdsGciN#^05 zGNbR7#2gaiAw3={j)z92eD>4S6f&w-3>Gg8EMWZRj(vvl18P@Hz4DK`ga~&)vUKcp z60nNH*Ld8k?v71pHD5=_tdm!(+ZA*tu|L`td!XtuQ1^1eI()>b zE&1vxMqnPNM=s;!+@aY-LzjCMPxKmjOPe!lsKY`368sbg_PCc%cQ#2*cJkSo99`_D zJgjq2K#CU=w`Eh_t}nLI5~mfreL44;(u?WMuvWqm(u>IGSLE5+ELIU}=qEJ*X8ytR zWFqfda?~-6Ek})q)458MRSR%!Ua-5?Z!BTm#^&Ohm!;T$|QN>!- zjZBaDUg*YsIqFiX>;DKoiis^QjxFk{E_|lPm`Yt-V(eZ8S+_6$)Xh*0Cm^1@MgT-={iL$*}`ot{}$C*kL~R<~akS;-_TuJ9dZo##zzIPh=>B z@8d-M0^FV_Wcl&2sNO^B@K)B|Ala{h?$$D`d_yeT9<;>si+Hj)BR|WJ#!!L^g zfu337`h6nd0_|vm!EGbO!YPscBq9YU6zOxm&)rhaohZ_*Ce8L0vu)zToCC~hC`h0g zEB9t4IBJ!m?!tvLmmm2ZmiR?@l`(b#c$FL@L2Qr-N+57C0JlfAM0_`5e@*F68UO4* z5L9k>tGXaux|P?Ip((gAi@CZJ;x+kvCJT*phdQkVFUaD#FUML4>e(xpJ{Sg3+TTLr4)6Chzttv+8d_qK1YDq{8gQ%8jFAnzDIs5to*MH_ZA zuPUZKvGQBgr3XA5toz+orPBG?nR4q-C;e&4pJLG$%h4Alv6fIIUt;+2EZXnPCACU4 z8df2LNLq5Am4pc{>2%d7;yo&K{x^xH>yC%Gq{T&u12k;QGqkD&q%OyypqXFH$~TaE z8U5k$Rv!OuKhEUw1s?sz|IOvmz8>9{=d~({%;I@n)G^Ak{Ionos%{{F4z25Cx1B4w z@Q~*iakMJPfu?^QHzY>nI|^&}1f%lvX*`c(dZQx%(;NcBpk*YQhVsx05KQW*!6$K)E&fS*yS_lIdgP(TQC+gQus5W zx$<)vtmHLE-t`DOU*rwxfpz}l3DhlRx~%?ymD62z?^(K9C2rU#E2TLh5-nsh-R>*={R!M$?7{XW%|umWT4oIh&UoykB~JvS(p|TQ3%}-eT2s(e2BZ2{~hLcfBu0r zY*2!KR`o{tRmU+Vae8=mpW*ct_r?3-21fS>54Bl3^o?6gD z-f{-1_L%NH8)B2v-zh)g$Sac>t*Pe5`r#P`*U&htMpbpDUDbP@H)sgMuV@Se%RB9@ zMEWPQy|qLoR9S#Kj-wImIcAmAt-bngc=tlQA9^)vTASkJMT8*($|}$8Iua*5zy?uWT)o8!+Ml<5`&*l_C(29JVwtE;H9CF*#DCB#iPPg91NfHTdH^R`GGSPJt=rwPXuJjg?W!XIV4QlP_5ByJfxm&0volpZguw`~THl zYB&Ezp3^q-4C{nm#i_y7>PE~Sda$R|?dKR8jxtr>gLAR<_WUXOyGF=k-MxZ1vWX?_ zvx*;1&M&42@xeYX=;Qo*iFNVbBxw%nI3xy7Ge>5l;E@$QC8!pK1bEq<^irshA<>r( zNyVJ?{-V?SYEgo(DJB}CY*5$Tt6E6qI3~WqWn=Jqnr$J0BqBUO+rTr@PXXsxgbBP- z_yYT9>$wP&7>@T2W}4%&3diNnI<0u={P=3}+YBs10{#WO%Kmr;7X-&QtgWfIs9SIc zk&1F~i8JobDqcFeTQL{P$r+pq3fec?ZAjmT)&+hNzQykEw~Uki$|yVacLtSo>2K;j z#N;N+AmW4J0gpWoY=^t ztVg~S1W>K1{wLN~qIo;OBc>NF3)%#P^VLZ9_>CVFc7JUNGla-v!~Y2=Mk4-1!ql2t z+e!K1Xn70Y27DS@JsH?Wel9a0;W<8|PLEd8go9|SR&fQ%Uel9hdUCz_^*;Cd@|(Tp zC4F$#WiJz<8Ez>@$4^d-y+lpnrh1Q z8k^#LXXsv!)5dx>XJtbtgrzV4-O%vn zu@a9et^y{h>9yWGJyFl%NXL4_XG-SF-+e4Y-78|re3afstND=TFPmL2z{N5vj=F$Xjjygq zr|+Mpzjt0QB1~~#e4lveG;=%#q|bo=S%u?sXP>T{Q*)X!x?#cY(4SqjNG6aX5sk)n zR!Um$!S|~G80WAXF&qiI7SO{n;?sR*Z@ySuSIGx+^bTpbkHxMjrlt~hK*>nF-gsyy zwTK5%*Q&j$>DZnQJFJX1B`s6zLx8k;8Mlb)Cf7UH2Y;@cmm~O0ZfuVouk85Y14z@B z6Zz5ov(PuUJ09#tDe?PP9_dP6_oUB*>XC&7R(pxUI0^n2^qH6R=O(N%tz$XIJepy} zY*OiSt^+BtHloI5_M`4YYG>NuT%6y zJ#?fuzp^^hoAiG3qX6+NMu4{uWMsc3uB|EBelc7`npUc6kw$Tvmn^9d@u3e^J00<% zkEy>;@Hai(NAnM=7HEY>1%#``9|8L^PPd(?L7k%lKIvKdB(Y$HU+&E`TMwea0|3M{ zPXxy)t642Mp^GLbDpnu?3Y)744y>q<0uFH~gd@<(zt#NVXeV?*aXX(Nh%33epU>Is zcONdlabhIzq8LZ@9oA{mR^K<4%A&&Ss=vGj))DK+eR$65^Z@n5A#Fq4$=j@hfDbl6 zJdQe2w{(8LbH3bPLLB)(tyX;zBaG2u30L=uwE|LX7EO>QM}?lT{w%Mdbw+_y7<)1y z$IJ6?b>fCA$7375X?(NKwa1Q6?LYVvf_&ZCvc6+ARLjE`2_YH4bx=^6*;j4GgMeUU z1R)su9^ek<)e3o#jS7B89;;nNe4vVZ$m5hep@8V><{*M<{ao#+gXMLu{rWwx&8|3q zds3F*((@9J*7*IrkDS6koUMr=){?0ku7B~>biKPtxldI!yWZhl{-rumA#Zgn7D23f z0JrE|{v3s0DStGd(e7*8!C4&%l;$xSgf~42AqN7odm9l(-Bh-k*|LS)g?s@i^lkej zB>tDNAo2?0pSJ?|um^i_q z2Kvkr$k*<6zZ-D8P=j3L{#sk|34J2`Z2>}3PQd+@R#~nRh}lx;nk|(q{z>5DzBNay z`j)4F`z{XkMkURdnd39YWhs%M3Xpotl2PJN7MV1`?>>8dPQ@69R{01y^}> zkgD#=)hY>fNd@J@N=~Hko5|O@q2-vZD ztFYKdJgWv%UMNUaROG>p_WW=@JbZBQs?+(F-=G^ms3`qTl{dd3k}<)@*v$+zZs}jH z)D-@HFae~f#A|HaazJ5T{uU*SLcatBy~c)Z%-w0(hu&c*mD5QwHn;5g?1ABUHHe5H7tl~4=hm)gYIJ$v9AVID=Dp*z{ z6YGmik;&C6Me&v3`{f>p$Rwf(a`k($d<}7G=E_{3IZiMnv|D%g-SD=c`)z`2%@m~W zGCGtfZ~eY7;jq`qExN{UjM&~Xe~dV&YE^T|Un>)`t$v8BjOwEQQZ;y~(g@WP9I(Z@ zgnEbq2oVp}M_qij1)6CzYczX|iK9dsH&%%WB`Kn5tDsuzm3B~41;wEcw%YEtztxDw(Vt7%j1`zV#9*DQ+Y zr#}cU!(2TDWMr|5)-RXZl7;%PgxJ zrt!s||74x_bj&-lW8SZ6pA(c1lffFuhiElViFxTL?}?qn-mh%?mp^hg$4ACzie5EC zCc!*uIRcsiWz+Mw5#pZc-k)t$)JbC?47zojlpoX54H4QzShyaF2;VHHatgu8{-VH3%O z^wIx40tLC9QUK|+2XjPS ziWa(j6x9~XI^7wLesU2IxD{5D|jq2AtI1dTbhE zT%riB7ywPzOVItQ&05t$+7p`lH1E1Gup`aIl35_MY@5*BV@zU4Y99MbS&dXPjcQ=u zqK6>Put-_V6l@X`x~WwGR9Q~tSK`g1Yq9r^>3JVb3i>DFg5-_orMlim7WR--Q^yd#X7+LfMMT?6;C3~A9pKMbXblIj(Ptt3#GaqB0`c5F2 z-lu%-b*X)7?|Rv%HqIK!W;LroR;F%T-DQ7L6Wcu2-kyF&mtayVWmY(@L%iOj7H+Yk zD=7LncFKif-HAz{=>5=Jq_Ja@nP{WTN8!lJ$ucX8RhdIn3%e;V?VLtC$dSyan+#Ej zRUq&?CJ*#WYD(_g_Ad3)I@VJ4MB(&|fsGg=71HjKol3?Q9j8jrj=%fR4dewc8u{T8 zjBWhD1ftX~#k@7>b*ZT8B(fubJ;#gu<8f)?G5VvLSgGe8lBj1EKh%Srjkn!N!YWu8 z-K_FfNEP5}Zgg#WUsLZcHonw4@4#0b;{0!luR5NJ)BGwsN_4O)X3r1gCe8o-EloH6 zH~;sIwpi?7N#1Y2s#JEnVS3~Wo1g6W|5M+lIoBlXI@F#TS85nz*8(5YHJzX6rD?dN zzMm!^N*K7!A6qBlhZDV=P9@&E^UnUzU$Xr!U4JKj^bWF>bu?Ah{5yDKrIrpLIMtF%eM4Cf2L<1m9Wb&r>Y=D($c<&pNY&1CMaW!0(6mJA)&ZXNK4&Gx88nI2zToT;o!wHqKINTwBd%F%AYLL0Fu@i<9dd`@wS_ zqU390)8LO+^IL&ZE)qIt2t6k-HbhGAWOS+!fCtRUd0ZQ}yZw?#pB@t;le1QEv)!zJ z;%Kc^f6l3U!c^d+@vau$!HeHL^7VRvSxE$8C>&gvF~7xUma|*HV;|3I@R?V_?PNb7 zxfT~d@cr&t@END8r*im=fjr@94UHwE=&5Yi43BvwJRu_4y@>fEw%cO9k5+UO{Z?U7 zk*e@Fs+u{l8k(wR4$H8WIA>8Mi^}iLJ0nR3x(W)*~ped&}NQGk2uvK)AA8XiEy@X0PXZ$2$ zr2JDN{kFy-*?IIdTBDzWArHVYBc$7MwyRJ%n5r7+D3 zvVqyr-;oG^-Ryc;S+^Ktvujr3(cZ>8syaa7&g|F-M7nP{dHbCV#y;uj*|tCGW4OM^ zrNff@t@s5-CNNF!p-7iGBtA^!(p)TjGSwot7xkl2t$H6IPxy*Oe^1wRV}ydJngR*L z6a6bQ1Y4oTim#Bc73XzfD+bs62Y%vFhTe&vs88_|zk5Sa5pnl&>46BqJ|2X(_H)7@ zCHL-x>lZ0;T$ZnSoXuE_f+qP@?2y1R-3ToQ_rO0vypnqBw6mzql&huB91;=Cw3cPg5;c z?U|G@`5@PdDjPH(MC_F~B}_&xy2e9bpPof@8qBJ2Z%LA>!>F*Yn$lZ}qi(9r}c79aKb1*$MY1Ol+T@K?iz)(~Le7k`Z45t44{kn6LFz8!H+YI`6`H)|l36uVr zV7uA(VdNZt{vJC1G*7Z|E!RR&^o=?SHe=)il4xZAT7Ed*524M}o4uKtlWe%2L2uF6 z&*XFTD_NClw?n^^CCfekee|NSRnbT8JBEJVK68n_gPE(NFU;Jt5c*cvO}seqDRmEO zkcF_s-WXiZ^CHI7HsW`AbFTLdX%Yb^EMECc=;?fweSsP1E9-}2%g4(SUb0ob6F#ka z0}o=DdG`zwM5p+iUGl@%0RZ6%jO?vEv8`<5r@SZc8|8~xWUj*5R^YDKA(6)uoI-Ei zoF%TT!*w_6{Ly?+CPIkWrwGAbifM~qCH2xsUV&mGY&p$61bI=l?PJO|guYUh$NDGv z0WmX5bffWorNZ7m_oi7fz59er9%k>=BbWWt*Szk}%wua~2lnEoKl_|-`65$u+42M0 znEe3)*klprKCb}Zm=*T4YLyo9Wpau}!=Z5V#x}pPQ#Xp90f!lKwfv}go+|TPkeKJ} ziv=`B_EJ83TI)5fYC2QuYxd@4BHTD|0nL5|G>1A(&dcI$&`SGldR{Kr@i;GjW8@S3 zG`s%HUnZLb*Y8yNZaHXA=)cQA*S+FxPSjN&J|DXKdk-LlGttI;gDBRsypW_>7l?Uf z%K^Cv#_vQ0`D@oNvH&#xr2UBZ5Uxj2(ir+yh(E#_09eoLHw80&%_W(~QJF_B=W%}z zzA}wtxI>D#19R>b;eEeW=~Jqd{r-GH4&0oVc|>eRDb@MtJkeY#rJ8KkQ0OzsuGC3+ zN~R~Q3+kl!J)%xJZ)HbyQdKcIMSqY(GNM$#P@x5qnshWt#IQ=}Qo-eJBSR0FpFhxzXKO1jO(m#I+r*-oH|6*=8?S+HLo^w%P2#(;{ zt$)|&EXg)17z)8&T%(;jYt)L&37xK(GVqiZCH$}gD=+0L_h|2CV zneL(M)yqm=e6Z@7DaoFKZ<1(>^n6f`C}JiVlR42CaXv<3LcXFpl)Dg^>-Sm5Vb2WrilR+%aE zr)>v8ynT^A1R6c0=c6v@`!<v?iScgSFE|0)*l zB1yW4HifSSY3`OvAhIq9>TD>a>jqV;Yn4Llk*oP>cGdG&Ru}oBg2+bpO_HnGHIW}- zIag;c7~@!#DfU3Ia|&OzQ8-j}lr!AO0^SljKtzy9Nvd^->XKBe4}fgd^WPIHVDvrs zl4@X!`gu@R*I>E+BAFEN z!^{h|ArNE+BKKrPe@h|mi~3XxOZ+l%j(BhgU6M_tR1!d6cFXWSX5nTCd%*bK*Y<(m zc!v~GUgjTyu`BRX6PsdqKQ0ajAdACwNb0_>YoD7~|jbaFiYBhXgW@haa}>Kz4g(wwnr~RSLn2X+#;|#U2>EqR5taHi0L~ z3|PxUg|Y>DYDM0OT~wpIKO3TA2vYUQ@)dpj7ykrY;Z+RF+CWywY4mwsYSyGIN*-c< zcQU_a|CKVB-$u)te3a))jnTGYc2Otu+t;8Wj&In1n2LGii?%?x66;}t+21Z>96{i~ zn}m*a7CNFUrLP@jrLJaSFLq(>!D7J?kZ(7P<$CFKRIb)Z@czfs>YVdB8l~FkR8z83 z`&ZDZU(l)HNDU1jSM)_*tol=#ATxV|e9a~S*b#X!`je20?j!$2GW+jy>L>eketfKy z07N9ZQsJ{GUNaHvj4cX?Owh$eYJ#edV-x5!BAJy=%J}|Be_QOBdPIMP^V_b(Kx0Bu zULAwHnn#=7Dod-vmD1tuWf`s$RA>4teL>0yI!lSGhY|yZIOa(Ax{r*$s0OfC{bYZu ze%RmB)H?dLXrsj8=hJp#IM&N!LyYa>+7=?X(xz5@0WkNO{=6)oIXw@x$EV!3bvL!U z_i%F-4?Z)9mhl+Q3=BiH|nV!C;AwJz-+IEDx&IfTcRFisrBTy_>FJn*1K(=VwR7cD(g@@ zN1PjM=aCVcl?n7}S$?cu@jgL~k5NXJ=p-8I`^i6KiLx?(u6lyVdNL1w<8nmSNlIjG z6#B~XoI3=E#;`=k*dps2D8x|s$%=ZMO0@7)g$h$ztl0ylxgAJ-EzvO~68I7>G6l6e z6(H@kc!QK&>?XzUz5#8~dFrVYZP8HGXVJ*hgmAO_SR0}&L$tsrWG2d@yoB}eeF1f0 zc7IjZ@zQtpj%#8Ob`}L5eJuksgluR z8q?G#3PYnsp~Em=qOi6&WM@GSF|8nanS6=#*^D*#Vfk7uK8b##KSv(NC|vvjTuf}# zzu_#2qE+hficPFm3$2Q3tT?5W)m{y>h{M2e>WY3xDk}T$L>VMws2a^GPbqItkSuaV zxK{#9qAEa!Z?W2cM)Sa3N8-i1*t7J*?n96)5@Jlvzfd$a zeP__sV@_X{N3t|$sBx->a)g={4)W52S-t&ku%U7f8)&M56BC1!MxvW!KQ8Qhl4SnK z@4gXb^j}DdZNZe28+A~3Cjh;Fvg+Il0g&q8$6Z1AO4l3<$PvB&u8v!y+E2Rbf0O=V zKfyqsC-{ZE9b{~EZ3QvA1&=q2#yra|!co5iEPvmkpKzrF#F%s-r#}tQmTV(;Aact| zzVK%U6P9Pwb^3Eo$2JS&eU&ZpWe*}jf{BEuQw!Kx<%MstVwTjg zI0!oFZgCd4ohP6BT2}iFJo$}VaR9?)E?ygzz@~$N`$S6mNMM^Y~VGzi|W5ug_|A%?9-ay|O=j zhL(syulxeLI;IsntZUu_k?#bX6Z#)Bd&_dR@@8?^C7jL=_-H&zr-VJNA>dxC>tt2) zNoHR|YTgj++wAH|lKc~W7tXPvM^?+5aGVic>C3;4b8`a1?D$HxMypa*g?j11N(l~ZdtI7e#{AMXe3DD{bf|IIEcpVSP zY|8xn5D5YI=k^AG0QV!dKdt&Y@Y3gI=O*SOj{)P3JVe7=u)%C1YEgS)T7Qw4)@Ot! z8Cz_<)>53vaC*@<3DCBR8BYt^nT zprkC&?og+?5om)f^IiJ@-#2hsIQiJVN5u;MGq=;eT*kK_MLOcLmF@L zkH>+@M?(iI{8^dKs6-r8bgJ2PIZdmKosq)Y*dJnkYce0|j%~Z~#^wZ@cZh|#>RYe& zx-~Z9JqJ_$Xxr<+ygrLNroNQQ0&K$_DZn(2oQn&AP=U&y%Zs=V9K5aL>_DwvC4p#) zi1e%ntV-8`T3U6O7oQtTV%0rD1QV_T0Xc#AIm8hcOb)wp7JmbC)skL<(YXLKZ6Da8 zlOeiSfgL|%ewCf`)Bj_u>@P616=;Hqt+j=x#PQ7j6eFJ|h$SKA#hex%fVA1m+?x+(NQa+1w$~Aa6}O|GW!N zCHnXhl1GkLxr(Oo6MY(d0Bu=-!0mpD78{4b~ECcJ}`|D}(LwQ3(-O4`l$ z!$&5{t9d0%tT0NM(u3__u-`a4;e1Jq>BD4B&3^Q0vW%pY7#!*`IJ8*X`hj`SD2xpC z(Fe%uH}1-fHmHY^dan^^u~yhw>bZEbB^sjsr11D6wQ1q=Kql)qk_X}O=e*!NDva=N z)z^CYdYAfoF!~ZNtdq1|{3l6}E$+`WnBL-8Z+dcJCkzJubJ6<|D+gz%3DCO#IAD_8?<2lkCSSr?EfW0_KTeyorZn zIgLq%u7J-@0{;JiV+!!+(WqM3X`c)06oPBFx++;?cx@i0`=;w4T$Bv&OWvAYxARH< z9R-{UJ5_u<#f3sqQklnqac-BHTQZKCBuC1#P>vQ9+1e(#4@vl)qdd>Qq}>|uuK+v* z2mh^AJ_RThQE-ake7UCSY6`O?k0XybZY=JtKF$;2TluyJ zPf({Heo1L*F_)(0lP%=REik&<^$s|sRd1H=lLa35hJt7}K9$wj?!TpQ^&ckfPl)Dn zoI<4VVIdoAzt` zC3`BoKtw84evMt1mb#88y?z6cn_antRnqgD#iCq+%8{j8btbUIn*0ZlHhL=0Fb|co zTpj-I=M1NAnmALMFa{N>x76YlA{_l9J%3%)j0ZZa8ISGr8~p{#Jq35+S1z$p=0yOL zOt+OK5-cOlub}b}d_hjGM^2WLM&}6J6RMKF%w~->gSZ>f)9oR71(D9V@d*a$R$VTZ z@m<9`$(QrP_)67VYJ8AhA1R#kqGp`I{qnNpFi_{@*yrCeV9`dKgo8Zqnj(2kB@%H`O8>;6;){D^kN!eo>y`if#X$Y))G>wa`E8Ek&hZ*(Y^1=v#MPM30W!MEx+;?6lF$Uh!?Cmy3a z)l5<^Gy`uKK~8s(gRgUXKq|9>h1M>1n&<^IuX2bf%xaOOI|KvWL*GTZo3m3Wb53ZR zumY9e(IjTG(5qr^MOyq-R?aDvm zxW#M`$VkFs%ii{c5Sv9u7SeOA`cLu_x$Y!1?ucPW2Gr)td}`x%_#+EpGXDe?i&CTS z@qd80ZqTZ}V#X8fWs_*xIf97DRy6og+3Vu7X4#Y}KuDTjp~`RuZ}gdZW^03!IP9Vm zX_nd-9hNf^<(Htj$;7BXYmAOn*mV7#w&cb#chj7LR#%?1tW{k{|Be}6AVr@nlg*~p z^>0wDTd+TVI}Zyl671dV+MB>hi5T%-47^C3Jf4^y1CikNwi8ntC5lr&xgMK0%A8Cr zu4t`%+W75INbxlp_E(`B`>h-P&2pDZaz*cgT)jl2Du1D?;1MAZx7#nLsF(G;v^Fq; z8_BMR_p~GY9WM-b^&}Dk#&^E_j|j-;Q;rDV3qUyEs5(Y8ep6?AZ_z4Wnoh4d*jYL7 zT0!fX^lo4Km`H!6mr-VojpRVICfjj4hbn)G+TuRJL4`R94)!tDfKaG77;ST~SFE);*e^+uzzNgTnsLZv z+E#qteUZ_FX+ZCVN#{)(m@aaOG=@CQImWP_>9k(k2vCnpwI?9}haFI}6?Ktn&G;OR zRrdc~V*5+9M&&|Kfq(are`cy>8p1!3M7uucC&z3|9h&qTMTX=zM&8a(^l?=SE5pn_ zA9JXfHXb6W+4VfAEdQcasdk1Z+Npk6+QD*$;W_*R8i%nmVUa$A{mvstHN08$1i+ik zdVn4-6EBo(>mlht-|zW}o~)`bMrP9C{y22YVJQ{5!zV6aa-0iM1mr4)R|TVZ8V5V4 z#63J2b&lu~*V~SJ=uuas*hh2=ZC7sGDO8!hRkWooew&v-p(j_Xyo)EFaW~tIeMI*b z>5?1|x?A!am(rJFpI)bWq1(jvlq&$ItM&{^B^5OSb zn^FLX!$eZ0f&XM}^eQQ6+?^YZ@PK`!?RUzUQs}{$BKw{74n46Oy z%X%wvu+J6A-||y1t)%)x43W(EiEKLZY0fv+Z=S{U1TFvU4JgwqnQK>G#Vi3GzBbLj0iI~^58Gx+NW_EYM>b(!koc)Od09$8Tw0Bp9ho>wDgH_0eJ2{T*9 zk45L+eABOjdeOP1zrItetdXgRjLAf;2|+IRQh8shl^aZQnq0kjU+kDY1Umz34sp0LOl_HS}*72F;-dA*6=u z0Dmiro)Qul>=*vj8NB&syu*hAGlwx|l<8W)7bgBXaWavJGYKRj3P#8H7nnnW$9W?+ z#XUpT;pWDD>El$n1@C)}eRVnStLYy90bOab=P$OC=Z91HBDpLZDTYX{-=s90vHGK&_UOv@gDoxI+f>($5Yqq^o?XpW;&FJ^2V>XB(ai0Y- z&LFN2kMa*D=}$Z!Tdz`4boT>f3vE{50XCtMR@XaZ@5Y7SV)g|=1!9@j5fsEAEVwj@ z&#|W%I{V=8`eWA{$B4dO3jUKTyE3hFXVVX3tsynxd4^m|&StWg7_(;#twng&>pL_1?d+rQvDC6<`;EkdB zig|-a+!R_RVShNfBcpbHVtq3!*($Hi)?6AUT%kWwAsV4F!orD{v?!Gy$dE5~gqbHP zj5?d3U98vM`HT*>A$ah4U4K}_Vn@O);j^3BWH zwKf6?`3Ozvjk6Xs;1eTvU(+o#On%)2j* z1c$>W?eMjUL44+owGTd9Y?pY65_)9zV0hl$iRmQ{HA-i}I0bd)F(5Bcbca9xux{)m zK(t%Oa==wz?-B|qV1!sSffk?9#}0iH%dD|ZpC)#`F36sqpTszG09N$l%h(Iej696a z$$?b;k`KzaO~QhGE2LgoR&_2swr^N0pZeeHH%9{jTX*1GBS0MZfE+i z=!>NcPAyQbH_?q(=sYVK|A2_d5y`b4JkG-=%76*GdyyVd-vEamQTasx`X??fP+ikC zYN?I450PEMX>|@_T~?#cEs2kOaHVcMEIR^iVb78u5q)&yjk)S4Q~`^zl)z2Ps0kb` zSuVe8zLAfSH>6;EvrXskU&E?oE>)r@{vN5wTfq=>S2crdc8sH_6cPJsm5glFk*__D z)hqb}h+#0_*R}EAuNg)?+~V%n#&P_sN?_rWuiChc#A-X}nLKIg6@;0qE8d}~{Egda zmFqjA{mGb=k5k=vpKe6IU^xlI6@*tibKy@m0V&+l2NOYZaI4D;kDC$9yM=%oLvNt< z`;8pdsQ^2x;`?5!U|-Io`SnBQGVJ@>lZ`_*6KE;TPb3{ve&oKkVy@8H z(2ctUJ+*W#z8Y=-1UQ05DNOB*I3AP;S~+&~?h3vVuXKluy?%JTIr7nqAU5uT(1)w# z3+pwwRX0j3wi;#jw__nc(}ViLaCdi&)>2;~1j zBIHWUO(n)Vt*$di1DVh%tqobh0gCqi?nEld{J@hWk~kn_c_Nd0#0f7q>2}BM+%NvU z2d^hHkV6pny5drpmb)&J;mQpw!Bh3p5XR2^)`4Q7HgCn_^`Wx5LDXl7-7SUcmy35v zu`g1Y$Hhw(`fAw%9AZs#Z!W*!l8ARGn6{L}3UsXHL-lxz&dtP*_(Hxf=p`{E;zt%P z=&P!;Zy<_q7N)E7I_SI#!(Z5^O1bnGoL^>4SpkjlDo?9GJ+am@A-NnVT;|{o7T5cg z+|D&zfkAt~67|f7{81Y`D0LpYg7jJb*?p$SU!{mIQREdV@+^PKN<{YfC!-6`uZ_uwYF*Y& znQiR>r+gL{qcZs{rMJlE+Y+Vs@+JBne`Fvb!U&cu^GB8o0NA^~#6iv|dA-&3fm@c^ zcr+2b#xB-Ni9uQDntZF%F?*Okqkfp)-8GSy@TeXF=9$t!exm(F(m;qmc3pn+&Skn< zS@DJ75}__BaIq8!BnnKD0$%&mV(+XL zS#He}EbF>o?_$;Hmx`i^^AA5}5rZBr-JaWEvwzUdkrofbce!_#4>Wc-H*eX&raEIo zfw$0me8vJ-WSTSfnb8>A%~EwY2L}WC0PPYIgU!chAe@@YVxo06p`P46l0+?_0D7PU79; zURSI=*~G1l8?`^x4>^cDFszVLQ(C-3_Ih!#d#F)N+0NX?rBj{?=9;eZMQRoFsT;s3 zf#kiY!>k(!tq_f~xC6%5zJ{-}xK+J`aB2_Ndz{U4hj`r0vj%$F-u0e#3+wilN7?wo zEm=m%%dI6XS;0$V%y}-g){Uh`nX=&!b zGEAWfilqE`H;^U7yk63IAMkJK>!7xhJ` zZ%Mn3gA#E$slo-l3wznA3m59X$g7Ibtx6NRcgoM#&*2mXh}cqohAMJo;X+N}@5l+~ADuHJV}{^AT%i@N_}D!s*V8 z1p^_p4|T=7I}&aAO4s>H-vXsw(jteR=6V34bKA_k5~I=6w$nRgnF?eGrSj92IhC5*w#AU1RzMD3W!h(g7t zC=NwP+`|1x65;vFiSF2iNr6A9qp>V_llMWM{lcgSlcG1YXStgeXi*#?;#RYth0}y7 zK^&4BcIV1hn2F_P$)lV>3b*&rs%Mo)!1Pf0EHnN#F?P2HTo+^wtT*0;yYGZYp`o8T~CI;b`r>cz!L~Z~__FM3zs8ygrQEm2r4WR66DLHG=+D zHT6kIB9@XykoU-u&Qei!!LWfR$hs}oV^m@;< zsIW%Tjpey;+VqT7EIJvIwIf4SQibkj)%C91FRSHhYQOyG zmW2VDXE%J+by70qj_!vfko5|)_DfzD`BQ!P%{Od2pip51OGC%Q;UnA~uJ= zDDLoKg;l#iJ~T|a!ZSG@5^pV>y2Y`}W>I>6sL1p-fG8dOAIui_LU?8JBxp8Wdf`E^ zyXfBgnDJo$)fE77&G{d(|LFX&%EpVXvQ^lD8_7|31&KnwBV>y%5`cGL0-DPEnXU^Z z+pQ|wg4<&^s!dk7GQ8(qj*fiU7RlX5a@%~_g3+;GOpM$-l5=~|r_J*9t9$vn)UNB) zShnmpvNYZ&8SwQ{+z;E+t|k!jC!M7+oIwc2Hyp|G7;UmI`%RbsCh-q!gcM!Q)3J8t zd0OXP8H*6iGUUb`?0Jk$`7%ODu_?19e{&=sIwr$tiw)+!cy`VOC#^0cw+;7yFy7b|+}La zf1lp4AG#6G;zl8Uk7ViHXYrh%C2&qcnwxZO;z2$Ch; z-|@9k(JjK+%H~ttGar9S{h0Z0f7J4b%$!uUW4I z-K#re9cB3z|t^`Fa#bnQF#~2c{}aJCcm>jJU63zXa=eNyo*SBhqE7<1eKOEM_x12 z@7xf)ly=A6-@jMM{f`~@vByy|YG<%#$*66i3u3)XDmm}zi#NnR(amYOoT%cI$ftUD z@j1D6IcKM7S6jI;zCkbDAa(nl4Y5=7cyqLj0qfy=M&$(i>-pc5#W!k|mykDnPe!-U zSFz7^)04Xx=xc zo3J*VoLN>jd>2XR6^}&VV%SqV=r^9hHeli zdwHqoZ-Ee-T0JpoCCczTbmzov*s^F3Ls|&)Lu-K*u;#fezI-nn##r~{_w`V33Zg(b z$!lyzzr)$_HushOS()C*=!VvFDT)vc=>8v$qf3kB9jSiLDYjxpE-4y z=d7u@mHTxGzkU_Yjr3=PfrA;SIL$UdOxWNyHf`x$TU@m3sU^%>6p8bTRGhjJl!{AJ(P89mZ@h% z?s1+qiaW2?er>@ z&iQxe0m5Zuv1^>wjl00&va~T*H<9xuJLfgzu$d={ATS-}|7pPLc+tz$(zzUYUa&Lg5RZ2u4XjI9M`|Exs^9Fye6 zW=Yqow*$Y(Z=IcZO=}?zDk+`WhQd695xl9!Izcp>C1=={P>sjfg7TkG}zIjUS_L zi#^Ajg0eL9Xx&mf-=}=*qQy$vGgCJrB=6h1vQR>cO+F1_{Q!IQVR-(JSLO8fIBcHq z)iV-Tuchygs14hic`@8xyH+>2Q2wCkWsP_2OCpDV8Q-iOSNq*%#g6D-BBF4u0QgG( zsg{o4?1{EMcs?Q0vxs$8tT*h*(4AW_5~$Bfj0)E~1*Lp=0)-n3(BXwXNBy2ykM=#~ zDnAwr<6DpMp4a{D!n6IQvA~Qk@m;`ycS7mtVK5|F)*}XlNTrzbhGkkg#L|qfjcrQs z0d|cxToUKqo5#Ze$UH#4BNH~0e{5H?Z1Pae?CSlhOZr#DO78$$#Mm`Kja1G;Oke&XI48Un-T+=7qKtXuT( z#g3p)?>?223sW=8M=CUmjZ~fqv2(fWF~{zY-89jJv;4$9@f#d&@7_~;wf}&nSw>4l z=MJ*aR&K1&om50)in_$Us)eLDV*Bl%-NN_4yyq$aqPu1v|6W^oqF#zvSWk6j5MBrN zyO^auy0^?9EZ?-cjB$1bt}4$diHvoYc@35CBfoi)N2}|GZbuonRp(d9CM*^Ach>t$ z8^%+73^&fqog+2xFKaH@OT2J9&+!Wf`b#&A*H&gs;A7di?%u#|63WIIJj6axy@++^ z6I~faUE|0(4o15^7z=21ExeKsX_=zNH{>|eSBt_$HaMhnWS1*R zjHs~Rgp*>*n`*PD3+PG^zQo9ov46$LZewJ>9_9g8`*7Xqf_G}s3Oi!W#>4_|{@U=T zJq_vDrJ3IRtz#k?Khqy&nmn-+dH8$Y#In_IwzlFgO(0d z4rW>S(cyN*a$Iy6_8-GxZ~iK_e!nH|G{#y4wWUJ9)xrLSgMHZ9#LSE#mIyMwLZTvu z{`H!GKKicYl3Eu0Yf;R}Z}{*)?ZHi?BIkIuy5~=E?D06Xx|dI>-|eB1{g$|sc{o1- z3nH(jsRr5F9r~k`dEHS#UdlL%6J_3qrg|cydn%HF=5x+mUwCw$gXqAeUvd^hjw)tF z#S-Bw-HsN;SI7~tIoEh1fw(9dE5*j-GyCV+#W6wWAJJYNaendA5#8*hBtSgI+p!G_ z5m2~vK0orBfIDWr#=-7*Y>ygzY^T6nt}B&8JPN6ZwG}RUS9Bm+<>xYRdkPkyoVdx?DPDaZiD5!ii;dsLUmmh1&-$h^;X9k&TGCPRYdxuwm-Dss#>1ov6T|NLG%}qv2nG2 zo>%=@BioA%|8Z5edu&5$bmG<=uJ4|xEw+N;uxr@G5H+rGB7s1_EVD}BSP~i0)8qb_ zfTodGWGqtW3;YU^7)1xd?V9!=IutY;+scf}DKc#8h&7aj-w<;#OW{enB3xi+nDjz8 z02-%gORM>=n-5Fv>{wde<=vpFxRuWfl)?$UJYT9b)uf8y{0%_~>&q3YRkVP{W)5b^n5o1193sTTOeLP}6>29)evn|p##%My$)u-k_$YJ!iQ)Ec zp@GRSw}O4K+T`0PfDrq8E!9)?g5F@I3`y7(b4mrbzuJT9#~Uhv#Mt`9cBJ@M#rLIl zRa-geG2SA!*zgTR&#^=Sa7iRM(&5j?VSB$-eU*$+X9wJyP$j)Wj+Aem=UUHoo$hPw zAm`Z|HaePB1X*JlWi`rG#lB4K z=<5K{lq%xai7&RV8+_O9{9JA2^`pxO5b|s8QqxxMifIYHoL5||g44J@%T~61OHUAZ z7(lnsUbGUUazeYr0qtac^>cr>{}GkK*LDLcz5^LPgX7mSE~TiGwUy$llm2Asgp~7B zNBLU@cI4u6ZPCS|2n+RW9iQ7QcHcQUoh{hhX(mSkCo z(0-~t#V2Vir(R@@pnnR{uuSf^TA?2H4W80J1wZ2u`XS?pS@idxIUUya zkHf(h#YQ+D590SVce-ARhM_OMd+2W)v?YsV43YjU*pW?=7U}<9_`)8cI~7wQ&OYn0 z`%FO=P$@rKy_6U|pSNC=c-B0Jrk=UeTu5(n!MsGHIhTD4v&xa-jFBWGb zU)bu-Z@I@>Vz(QWZG-ujj<&oc+TQiiB9hc#NL1sAo|R0oUkCDPiLaaF)_D2P{&cKD zE-uBNj=-(>sfm=l$@+SsT4SgM2$bmU*$u6(?%pwH4$dQ44y~#J0Q-%@Odw_Il|SEC z)^m4LCNg@U7^r-53#QR(Jwlo}@`D`lDA;eEER&rGUn{cFnbt4y;$bbDu2!;m+>RjH zxIjxG;aIJKd@|Vx11*MA;abP*lYocx4WYrC5$D?4%el7p(puCmoUpl&s!*Xw&!E#; zYsC61tskBURsdQ#KC>-cPlyJ|5XkZ@&FG^?uHu3&`tCd&%?Dhn{`n}8_Ul9#k<=3f zi0Ku7G(3kXY*F<1-#%lzf@h$m1lPk`IA6I&`ex0QE`W6>1F}TF+N@GLQLB6$O6qCK z$fK8EWZo{G@;Hx4xCi_Y1F@MV))Xp$aFNE8dTSpFE54w2=IW?dy9H14ye6MxLu%~8BRdqv2b7Sj zuXgjicA=`Fjc%0~AJM;nu|HtEi%VrCc$0`1>>0H_7-TErLc0nQ*)@Wvpzkfu0N(gY zu5|_?BL-4k#z5~VE3`+(d_{7|xJIskH$e4|9}{}xVrbCSSF!J0S90OGT2&k%a6ELN zQ;O&5=#rUewAg_aWU1yD7R|o6=3MED$H0qG!0AlZ-3go$ryAv=^n4SQDk=9U(8BZb zuhq2&`!aqNpOUd|(r`Hc4a&~Awys8AUY8d)Jo1=J3Mc=35!luOf#ND2T zT;}UH-Xy$2_c;Ny2bO}fXVr}dFuNFd;_XqcouSRZd51MD0cSwELpMVxOT>Q_fQaWh zm4&5+hy=oUX#ZJ(A=nqX52UWXM39!gz>DZWc;at zSib^{*IgeKm(>J3Y>tCbcTfSe`Ed0Rf8k;<+Um~S*skMR<%?>#sIA-w=Pa-u@3 zpRoU4tE>dS2ng`mW93HBx*B^Ix$0R~-pL7gS&u{0#p}#`& zeNf|%1l~GEFFt2V1*;U>4ahq5S-GQk=k zQr$EUlfji^WVh;GU}mShC4r5wIIg}*Z*BxC^%3znYT0%(HWa@I;+iZcD!F(PwYR6r4z^N zDa)-Lob!=uYcasVJu8N5``yq$1enU|`lCgf6>Ly-~|BtzMk8i3<7ygqrX$uy1K(2~fuqYK&sv<cL0_#$ zZxx%2&)Nz%af==+;x7OSWi_f$_O+VuJhOkDN34*>)bk?;B<{vNVr7yG=3t=JFoKCa z8Q~EfWgcX?s9T1jkHDUUb67>z`S&p{i=r6p7;q8SFBPSuIo{gKqWVECoJZgfYHHLWq6R0opypo-J$_kOGx1y$HT^pCdiKbY8fm13F;=k&hQ*%c#Zb_$>|s^4 zIMXESJ1Uh}ccs-pSE=M>sl-&3&{M7IL0MAL9<}Ml#X6UXe`&+q!-WQexawt%Kn|3$ z-n<7Op$FQEgUC2LK=^T+A4PwZ*FL0w|Js~B85A3CM8 zMQP7BP+`0Kr@e*CDa4jQg3hYjl%Ij#b0?1JcHJbzb-_atp{+aOuzuf_@$C$al?AaO zz4#xO3R*VPM))1;HFBB#vq4C&Cw!arg1nY)Fme{Bm$=g|fiL)tikd$SG000<8uy*8vDQE6n~A5W5Am^40ODGln^d@S6%AYWH4vpabY8m$P-MbYV~m z8aLWc(Kp+Wf3T|XHKFIB;$*S|=?&rx`KsU+8g04{+#uc5p7yeF**wm|)zXIA)rIn~ z9*7Cq3$m9Hnryn?N#w5v;?{Ev*6j5rV3$kYe=kWDlGOj0B;g=xlEj|ht;({+OJS9y zydHhCl`hHpAM6tWS!d|?^iR^PwS?&7gd(%Mq|tPjsAd=Z(ih=&qADDFI^zpd_@o3V zD@X5H0a}lq%@tuYZ=Wf1$X2A9Q#552sZ04IEJO<$&sS7hZztZHBIM~=JcxfgTXlOyVkb7V2CiDOGUm!nI&6$+?s#n+_v zHM0GOF;0fZuZ~B3y)Z**^NF8 z2cvp>=vqY)@};-kgcuI1ZxUYbt32~R1|kYX`|4h_fwJxoHc-+EcAWsN$A*G5kAfIB zJ;USKn)|9fsK?XRGqd1e7StL8AuK;gCzF~dlj?P!LC@#(OW?#Hdl-Tfp_zX3{0Dn* zDsEo`Du}F}Co$`0PNe*~Hd1^t7BHNiD8GXjK?>7DJl6SkzpRh)#Lfkg$G&S6EG7yc zxp1{~DqUWo^n3z87OaO+b#9WSQAuw(iT<^i1pGf#4f9uW@DtowYlG>J(1ahnXWYOYJWj8B0bTtc`Q}X!?I5Yehe{;fp_?s6R ziNi!i>>`z)(jo>{zHB0Y4K%OewKL&ERV>i*gmTFx66n|o8sctE6JrZVrN5dW>8+ zADH||MCD(~n6b_8@yuL$Uf7D(e1`juTsTXt$N`d6C_vudNQaQc;-!u?_+s5`MP zE3txS*MkRIlA&mw z>TTszUTWlfa@{pZcPqv@!r$Q2n*q~Iy;u>RPjZG{RD9D!$E@CQL=G5isJGdtN_bBF#a5};Vn-SPdw*sF@Gmdh<9)i0Jnim>$bP3*DVLn; zHGtHC7YCHPO6JjYU&q%-YhFU2bu?0+YgAc$X|6iJU-_puSMA_Y;EBl{tQa#d3HGd! z%F?v=;l(tpf|INBn?jUYDaM>*!Wc*Efo+hX3bW9;I;E6}UWc*@ye^B3yEUA%{6eZL zgYg!ab0bbndrS4xXpHK0k)wmTZ#=SM4~<_Ix(Vu$Hpw9${WuBoQg6iiS)^ld`KEZ2 z4d)skQ@&j0JyrxnDjsoONRVq`Wh1LHVof~I!d_aqF#P*6V~Mm?YjA$X6>nHl{_Cqnq^lk`NN zPB@Ex*T}^~x_JpG%N&6B4*c^V;4BO)

Q&5gb^aXe=m=1y7~1 zpfnbg#)8sVP#Oz*M%Z>x+rlflTI*^qjXx5oVfCs6&(l9bVOzbjzo@S-Ifa{y9f9dh z$bN_&PMY{`2dD4$7aaOY)O9wOJz$Kr4`ZwoY;r%v`ijS9>rc#JX~7H#ml|V2XJ)sT zrZ1!4-}#Jha8<1SD^-_HKcJhZ2E1Ff#~I0bi@y*_b? z!Ej$aI%$yZo#Y8UNZh4s0*o$@Fh#|7^UCOiv8-I5IyxzXVodDdTdzJyhdCIHBCj%9 zPbt16Nb!+9=)K(BR=~uaDkD-7?Zwuj!C*5Sc!FOE8kp2|X6g%@9TlAmQq35p8xk$$ zv3>3TO0~oZC{&lq($y2{uvU}Bj${z}Es@+kw8>$zH>)OS08NgL*RvDSmDnEvUKc{B z{V#2P#(@#aP!7qtZfeH+DsslU@VT*BEW5JBs9cipwF11T{?GB){%_Vo!~P63?%D*sLrmVvBIECY?TWYoy`J5&TE-qqS;bNO6C zkl4o-VQT|Qd%U-1xU?tbrVROBxfxPPnD(CD!Skk?0hjmP1yg+9_q8X_A$z;~kxqy3 z0Q0Ft$_AVp)xo3SLtkdVC06eZyFGyd44bcn!wtB6<9ldNe%n{Lo7GNYK$t!K+-~}m z9MkB-EHD1gQekMYc*^4y2H#(TYaz;ngTBt~csQ*sDQNYff<};n``{jNXSf}jSl^5bB;j$e`=hQ$&i@wgz-Xa}kl;pQpOm>wQ=pU900q^h=5Lu^p8V0t~Zc5EH4JV~ry$ z6!bN+K92q9`dAM*jqQH#{_>qAj6`nWmGyyV=bUcqXev-*SJ0{uI1n#3%vm)(k1u+o zb3Dg=bda!nr3ju%-a%1QpMcJj$XJ0+=*sjm#vs2jm;I}>o~Uj)VB0%>qZl4mO6xIX4EE!|M97brqIq8kSKXjzz6 zw{#xDMmIXw>D{GOjUi)vf$ZP9S4Y+t))SQ@Via^Jk)_@#?@B}|XD=wq_5 zNidE3Wmha=hWz6PXjQ98*S%9|v{owdPNvZ})YDWN{WDL3K~r4@#>1Jnb4GAlkebv|l$@4y@~Bi!5i@Ok?{Q~^dftkchsH_68SKF#Kxjq6*R zOO)v+(s_6YG_KK-7Jk>7rLA&kLCwF4+K}cz9g(x2yer(R>QPd`cApq=m)10wR1YF= zqC(D%B`;Iqi{@=L%2@x`d_&|iL_{v*-77gWunXB<`OA5cqqU!)Qv4I6k(AhME>q3M zg)|Lc%=02eZ%kr|girH(&p(^~h5HyEfgpl;wpq5={=0 zje|?G!r9hUz#={nVOq8o8p30)RfLQ(?zX}#bK-fJ?whF}Ax)i>*gt|V-dENmJf>$& ztWWD&u*8p#2o8l*y!F{s#s6-Nx))_4jWx!D#>tRYc}D(dd$$vXEo7`{&H!qG~{6(80`p_@w%kOATF0Y&$JedMT7 zazN?p=F=Eb=&82M$zuyy7Nbo2GQOv)ygBBH<1*a+)-VW=h|G|XLEo&;t^}W&3pYVm zt$$b0S`&X=_#Y*6dD))W3vefl|6b@C{@HWww9`maKDc&0KV|NzHui5|EPOp;cp+yn zJC)LJTi%?~j;27Y45T-s9IX~M#a=`Y4`&fwm5?!ocp)BDOXLb9l>$f8y{;X3C2#9^ zLkGnAzHLXXKo`|Y3xdqbHlD5T_=6lO7U7rvw7Z|77^R+*k7IfZ7m1L{SFF~>zhT8N z!dD}~b(FF!s7`c1s0a)Nr&U6TWo!4 z8t&R~IW5`LHg-YgX~~c0Qz|nhs?2ysbv*u_DsQ)(7^QAXOsodr+L;=#3Pcuv*?Jc( zDMO0CVDpzJQ??vco0$JNLuW@i+*;KW0*Kf6!}+3{A)U$@q^ZLCs!j8EGeyyfFz>Cd zVD$bhRG53?=OI5UXbG6N6R36v?(;hW=H&r%EMu_xO{MqFj{}h=PpS8-P%r%8uzbhu z&D%KZ-Gqr*8f{47hxNx?Hj$HhlCpS9)0fhvYZLw9{?;r{ytnEvJE`)w8mmX<=Qu)b zaW0<}{64%`9BYh?kw*6c9Oc`L^&G?oRA;DFlqNqb>}Fw?;D^%a75?9s+qB?WP)#?_ zm{f$hm3zWBiUfdK4xFe)4Zo9zk|+K;Na#hy_dNno{^OmyW{RB2ar_?6V*3CNLbcK( zLJZzl&i6GkpD1n84?5`ccLNW6FQU)qi?5*gBZ;oI;VaL*atM>aK@vLXYhMkLv4nfl zShO&}Fb_Fhcodj({2u9q?Yfod#@suRIADbX32#2Ezov6n;V_X!t+G#c?`^RENz{Yn z$*#XOlpMwxS5J_om^98%wt2;lt`Qcjlk!i$cZ@+DCB`>?t#tT&9s|=q#)9xso(SGMyBsycTzQVVUSjQK#s}K?tj=Aw z%yfk0gHGmVm=iLpI>X$ue6U{YlDUm4o#K3M05%!5H(JSa@yZ;?L1tdtUU*jn_v_tRF7|Na4Y&Rru zqqftiEm&3b967YA6{IQeR#Vk0UXR6WKJ1aA5jE|KtK3t`jNMt4yHp73DP!&7(8=~(}4gt$6WFYm2U-uiYiKVAm zB~Uh0%s5mck`zO5(}{iRIn>8~HQ9RTT2^)RoqQ>3t-eQqBY4tYccR%3|!zFa&cAELg^vc(ybyh|Ni*qNE8Xg;)iu0W0xRo4= zku!^YRBHVes-4y+;JFQLnauAzTKS3j&gU{9>oxhe7aHB!R-SCw?4Zrnaa?3P4;vx6MWzg_=RhnNZLnX4((xH6Mmb*I@`e=b=? z@bDA!dDZwt^Ixjnx_j*m0m&fRF_~YP57m)oca#kR$Pw1;9<(HxrE>04>p$`R7u~-9 zsq1^Xy^w7W2NlGB0DIM7bVj}C=-tn3^kN~r-On70(VQo$cy^*f79tsRT3PVE@qftpPCoJ2 zI!0@Z7rfx&(UZ91+H^!aJ8mW7KiojA_Zye|5UE|#B%R;@H=4*E=&&7R$bS5 zSf3oF`!LM-f27V|%U8A;_;B6#l=RFNBD`2q}`1 z&!yvYtA|oaR`xpHG*e55T4Cz`?i`(5psVOTw6YC=Ql_eChs}w*kfYPe6jjHVY z)v{q%*sJMc_6P2D?Mza_ZAdai@$txLIqix`P2F$poIS|dtxII?9Q$NyQUlzBr!|t7NS7>O%zK@E-yR_P%J%rk7^_UI5qY3Dw2dC+JT4{ENoV-f!@|_Gx*aCPG(K z&@7fl^|u}HcIc=&CJn!j z->agpPLNP)gahVpsrUOi=O{}tgmEHnx)D*Rpt`%=;S8@1pzN}9m49SMU^V;aQwa)3 z?Dpj*-2uEw%a0cBB(Ni1JF-*|SHiE=CHrB$#FY#P;sVirLzc@vENyjt-HV1_cv)J# zR+KJN(*}#%b|Kc7^x^R97+0<>?ZFKvYu!O3Lk@f-<2q1|K%zBaO)OM3?QpL4$>w@y zzccgHk*)cwtFRLMyL)wx0RK+aU zks_NOU-ZzaEY>tv>g$F=9n?J>Hl=J^y&duRd6V^oRR`zbJ`P-~xEKgYkeG(sK_d2Ji)CgZFwInV} zu<6Ok_&Xx8$%{!}z}RlQo3!g2@4mS&aKSLoC2Z(*ya*er?D{l%Y?~Z`RN)E2jM!r0 z{q62&KU2ys7g?+Y;J>n0n|QvWUDw#wb?HJ|dmK@@lvJeDGLSb+cTbgHt9qaAi?>X4 z9>LGQDk8bMy+xMFq%xGWv2tFY|z|6EuLaT!n$G~KtWjxD&{T72w; z2tJkNQPaI(H=CU+d>NX9!AL+|+M?H_AD70&;JwpYI)&OsC` zWlbES6+QYO4t)Dj5mOp-xmMHt@8>CeI#c-!;g8l{H=b@mJpMR`P7pJvJ^YvWi_osF zO}C3gCFFMr`(}~GDP%yWi6x9}-NZ@+g{pQi-B>QQ@FT*7l;x5nU`p7^PtvtpvRYek z-?7=-kk1Y!FIhy5z5a9otN)Bnhw=rJq$7hB#AU8CF`W>Sw{W%eMiJTDR#|_hHuH>D zrolTX+-m(wUi&}HtKq@6Jth7GA8mRowtI^?6(mL@ZXO)$@9dys<8y3sGlVmUI{L~D zz5?H21699LZSqEFw&-BZY6uwt{aJnAeZ)S!q#T~p@c z`h#0Th2Asn-vu5QRPCI51`!tDLOe5DtV~~m(EfuLC=^zv&QPKCHZHip&jy7wa?*Zd zodfEVfelABAB?`)f<2X(cNVToSc$b;zvE2Ds;U%ONlA2q%NM;PgNQ0Dl{sgc{qINd z#>x3oe+Ad|nADA@yQsGdV+v#B}E-klDJ9m8d&+M!w6LJ&GG!v?_32 z?D+fO{FmjcF5wy%>|b|d z!GfW5yYi<2v41c6>&osqS7I%ioy|6}y7keP)(VD&EP(IcFaC z8U8bl#}<-K0%3m6Jb}-l|BMqcu_Ne0m>~Y#@l$e?shB}yZiFndWWuS z83tOneVfFHRBhmU9nE!GFT_*$woAoRw6$oR+th7U#bPZ!iK9FxuVNPSw4A{7EyzQ~ zM0>(1f_44YH;d4RmG^U(aSQfkVg%8e-j1~lrMiufX~{M}V%yKs-4C%O||R_l}G( zUZ2=6jna>e>n+^~w;J;fSWiK!aRn^>*d)yix0#5KV zBX7x3Bd%|EZ~KTv8R{iN%P}&IYh4^0F`yC-lVBNYep38nyL&0Qb3&(~_sP?vkBQ+h z8a!PKG!nzPC$Y)$lJXX54@;2E1Os7)$ktq9$#1)R232^%ll18It>{vcJY9=IW$PKb zPFL_D5qoH{{ncbTbaNi_cd>3f!m3|ALUjzRWOZejmx?&jx`~2D$;UE`Pimo6AZYkw zc&JwE(~A;-)3EXJ7bEg!N~J42%nYcsF9SL<`tTtc4Rt9z&D^LmhUqptP2 zajrgo%1!g-^^TjgK6lJj__!3S4B>p2=Gm7Fsi-K~y1Fe_f>ClaJTcR>we zE)T^#+{D8T)9Bs3JluX~s$cqaxb9RxXrEWr50~8!>DCZ)a!5KceKOXRsuOqeOD9xk zqzCu%UaUHjY`rW`>vNB^{s7&WDXq_;8|Bjae7dnfLB$U|xHVA0r5Fo25HtlBX*kDJ zEqZ{`{}L)E17!}qDVJ`|r#A~!x9E-CEr253viBzjhml_jFp2pwv+REKqjNyzZW}5x zS28uz_!X!KbOb6l@e5P{&VLORH8~*C6a|n3y-VBwmv(U(CqO~mu2{RKyL7t{p=KXp zBf}Gx4%MpqLE{9+9_6$B0luOw{#VJCq)+dyKCsn^p4-;ft&# zBV<*~bv8LJNc)7S9ft-!H95{Fx!>?RsY`q7ALy@CZtHfwAsBYQ@HD;9`eZG?=V20j z##E25X>wnOuX&M+Q~lg=m)^1RQiQd9S(ZbBuW6CoLQWisl^9Vtln;e^vTj4>L8tjp z!nv}R{|@_uUq1A}`7fKsVL_gLm4ZKX0K`A~wPM(^TCw4!VuP%`Hd+q z;msyLWJ7JmB0d%F@+7=dFiIgr9~FeUV9^4%nW*oxwob*yS%vC+ujHdBT2dwQTKOMv^nRjm~0pz zp)7sAh>mgLchViL5)+0_U&VwWj*t~t_@#g3ahwbxu!BM^7edk7FeZv=-#zwfK*bJ#W+4wW8 z&Sb0batV84>o?p{BxqGZ68wV9esz@2_UYb}Zw{l;nkrR9pAv)%L|>3@`fdc)GPTo6 zqfZHLltve=VyBRE#=S5tY=xKoT%@kCJjym_Pn{8(SjRvGb>_Q3s;nf^*aMDAGy6q9 zb2+2jWQGPDH$r`m$6lhev5AP)15T8Ya3c1E>TZ(1=q^v#((XR6IU!G20;kOpFeOiD zv1)(uLwUkBc>Hei1a(YEh`|>gsAphorAX>9Iap8CxbgOHWC^bnk6+QR^oIv#k1nhi z4U27TiMS#U<4O?#j-|;?*lafZ#QubDwzLE#<2FWwO2Ia@dSp zRtp|fh1gv0x9+H+gs~%@ZM_&j(HZ}OQZYFXtd4q6{G|?hN(!X)7^Uc+MrkM8f;y!_>ZVc*^?^(SC_oYXS5(PSkmYp+9;GEx&H8nFD0O<@pWW(cBEnS z#Oh#nr}1^eSDBHc+2wlx%9-N(GO@{(JsPX?Y+sYp5k>^PHo1>XO(e?M(<`{EoK#=o=q=O z{2ZU=_Enk4@q)@B^Q0fyWmWTrK0xs~sr;$>23unIjYm*%=W>bEMbIiD4r9wg7t-}@ z)IZFwf3PJQ>mM&6?G559;rWuaZNzS6Xw>ha18Mcu5-{1Z@{LDOmF6(A8hPq=K1wmU z%3t?ef`eF}!9&aahXm*livmk46TD0hg4GS5;f8GK`xawk#j#@T@k>5G(b?XZsa1{S zfjUYm_l7RF;TVaz)LdiFv)SV25^Y(WQ6|>xgG&v~a&uQ--u=OMa8^FRbsL zst8NB^<;O#y7*EN(XAG7#|R#krAffMWmdmH!4~cvJX;Rco#!Yw!RPDK)F>nr57xzPT^Ol}Lz8qKl6Tvi4E!78eO5bEvr%6?3Qq_KNm946B{a97q`TxlNU6F&n!um+(VC@AZjIIE!y68uw^FkuxL^^LJ#7z&ix>DcM z^zVCHMIftc){X1(xe)>x#n*C&v0O(qLe5ChDS2z=&2(S_skgk`I=95wyvIjeem7l)t}7>eo{<^r^s;E_fH9Z zQ`Lq4uI^QDJzm`2l&Mu>SqZ6W;HtG~KLSDxfyDO1jB$Lx>`UCdc|AaB6}tPQfH6K` z;4L)`0=aF@ZF<$l@Nn|C5MwXB$oBa^D54w^o93J+%?yWWtJj@tfm1z3hq{@~2)S&} zKn~m(gfwymy0H5Ge4Mh@YKxWt+hF1vdj+u4=v{dj+ReTvb6BgKt}@PII!-Vh*UOu+S!UwADrTZxZ-{5; z4WGH=nmy0hQ8EvQ?Ri-9?UoOihE-|PuuCSO-&mQ9Q5Ub?^NX%&SkE;4BDl4f3{R0^ zBGYhjqPFlq7VE@7itIZsRI2h7`l?rb9Ueu;3$Kb^vV-5zS4Br5J3F(~yp3_}6e#Tq zaxH~Wx-&}+5~H^hC+VX(_XMjx43GRtbjV;l6bS0IBduV-yK~+T3epFBL=VlmK$

  • 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 elf->e_phnum) return 0; if (elf->e_phoff <= 0) return 0; if (elf->e_phoff >= mapsize) return 0; diff --git a/libc/elf/getelfsectionaddress.c b/libc/elf/getelfsectionaddress.c index 9cce7b293..2db192053 100644 --- a/libc/elf/getelfsectionaddress.c +++ b/libc/elf/getelfsectionaddress.c @@ -16,25 +16,33 @@ │ TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR │ │ PERFORMANCE OF THIS SOFTWARE. │ ╚─────────────────────────────────────────────────────────────────────────────*/ +#include "libc/elf/def.h" #include "libc/elf/elf.h" +#include "libc/elf/scalar.h" #include "libc/stdckdint.h" /** - * Returns pointer to elf section file content. + * Returns pointer to ELF section file content. * - * This function shouldn't be used on the bss section. + * This function computes `elf + sh_offset` with safety checks. * - * @param elf points to the start of the executable image - * @param mapsize is the number of bytes past `elf` we can access - * @param shdr is from GetElfSectionHeaderAddress() and null-propagating - * @return pointer to content bytes, or null on error + * @param elf points to the start of the executable image data + * @param mapsize is the number of bytes of `elf` we can access + * @param shdr is from GetElfSectionHeaderAddress(), or null + * @return pointer to section data within image, or null if + * 1. `shdr` was null, or + * 2. `sh_size` was zero, or + * 3, `sh_type` was `SHT_NOBITS`, or + * 4. content wasn't contained within `[elf,elf+mapsize)`, or + * 5. an arithmetic overflow occurred */ void *GetElfSectionAddress(const Elf64_Ehdr *elf, // validated size_t mapsize, // validated const Elf64_Shdr *shdr) { // foreign - uint64_t last; + Elf64_Off last; if (!shdr) return 0; if (shdr->sh_size <= 0) return 0; + if (shdr->sh_type == SHT_NOBITS) return 0; if (ckd_add(&last, shdr->sh_offset, shdr->sh_size)) return 0; if (last > mapsize) return 0; return (char *)elf + shdr->sh_offset; diff --git a/libc/elf/getelfsectionheaderaddress.c b/libc/elf/getelfsectionheaderaddress.c index 2d54fc600..d1f9eb023 100644 --- a/libc/elf/getelfsectionheaderaddress.c +++ b/libc/elf/getelfsectionheaderaddress.c @@ -16,21 +16,29 @@ │ TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR │ │ PERFORMANCE OF THIS SOFTWARE. │ ╚─────────────────────────────────────────────────────────────────────────────*/ +#include "libc/elf/def.h" #include "libc/elf/elf.h" +#include "libc/elf/scalar.h" #include "libc/elf/struct/shdr.h" /** * Returns section header object at `elf.section[i]`. * - * @param elf points to the start of the executable image + * @param elf points to the start of the executable image data * @param mapsize is the number of bytes past `elf` we can access - * @param i is the section header index, starting at zero - * @return section header pointer, or null on error + * @param i is the index of the section header + * @return pointer to section header within image, or null if + * 1. `i` was a magic number, i.e. `i >= SHN_LORESERVE`, or + * 2. `e_shoff` was zero (image has no section headers), or + * 3. `e_shentsize` had fewer than the mandatory 60 bytes, or + * 4. section header wasn't contained by `[elf,elf+mapsize)`, or + * 5. an arithmetic overflow occurred */ Elf64_Shdr *GetElfSectionHeaderAddress(const Elf64_Ehdr *elf, // size_t mapsize, // Elf64_Half i) { // - uint64_t off; + Elf64_Off off; + if (i >= SHN_LORESERVE) return 0; if (i >= elf->e_shnum) return 0; if (elf->e_shoff <= 0) return 0; if (elf->e_shoff >= mapsize) return 0; diff --git a/libc/elf/getelfstring.c b/libc/elf/getelfstring.c index a2e5c6d79..89a5ce327 100644 --- a/libc/elf/getelfstring.c +++ b/libc/elf/getelfstring.c @@ -24,21 +24,32 @@ /** * Returns `strtab + i` from elf string table. * - * @param elf points to the start of the executable image + * @param elf points to the start of the executable image data * @param mapsize is the number of bytes past `elf` we can access * @param strtab is double-nul string list from GetElfStringTable() - * @param i is byte index into strtab where needed string starts - * @return pointer to nul terminated string, or null on error + * which may be null, in which case only the `!i` name is valid + * @param i is byte index into strtab where needed string starts or + * zero (no name) in which case empty string is always returned + * as a pointer to the read-only string literal, rather than in + * the elf image, since the elf spec permits an empty or absent + * string table section + * @return a const nul-terminated string pointer, otherwise null if + * 1. `i` was nonzero and `strtab` was null, or + * 2. `strtab+i` wasn't inside `[elf,elf+mapsize)`, or + * 3. a nul byte wasn't present within `[strtab+i,elf+mapsize)`, or + * 4. an arithmetic overflow occurred */ -char *GetElfString(const Elf64_Ehdr *elf, // validated - size_t mapsize, // validated - const char *strtab, // validated - Elf64_Word i) { // foreign +const char *GetElfString(const Elf64_Ehdr *elf, // validated + size_t mapsize, // validated + const char *strtab, // validated + Elf64_Word i) { // foreign const char *e; + if (!i) return ""; e = (const char *)elf; + if (!strtab) return 0; if (strtab < e) return 0; if (strtab >= e + mapsize) return 0; if (strtab + i >= e + mapsize) return 0; if (!memchr(strtab + i, 0, (e + mapsize) - (strtab + i))) return 0; - return (char *)strtab + i; + return (const char *)strtab + i; } diff --git a/libc/elf/getelfstringtable.c b/libc/elf/getelfstringtable.c index cc6d38292..623434ec8 100644 --- a/libc/elf/getelfstringtable.c +++ b/libc/elf/getelfstringtable.c @@ -25,10 +25,16 @@ /** * Returns pointer to elf string table. * - * @param elf points to the start of the executable image + * @param elf points to the start of the executable image data * @param mapsize is the number of bytes past `elf` we can access * @param section_name is usually `".strtab"`, `".dynstr"`, or null - * @return pointer to double-nul terminated string list or null on error + * @return pointer to string table within `elf` image, which should + * normally be a sequence of NUL-terminated strings whose first + * string is the empty string; otherwise NULL is returned, when + * either: (1) `section_name` is not found, (2) it did not have + * the `SHT_STRTAB` section type, (3) the section size was zero + * noting that the ELF spec does consider that legal, or lastly + * (4) an overflow or boundary violation occurred */ char *GetElfStringTable(const Elf64_Ehdr *elf, // size_t mapsize, // diff --git a/libc/elf/getelfsymbols.c b/libc/elf/getelfsymbols.c new file mode 100644 index 000000000..c78d8c0a5 --- /dev/null +++ b/libc/elf/getelfsymbols.c @@ -0,0 +1,58 @@ +/*-*- mode:c;indent-tabs-mode:nil;c-basic-offset:2;tab-width:8;coding:utf-8 -*-│ +│vi: set net ft=c ts=2 sts=2 sw=2 fenc=utf-8 :vi│ +╞══════════════════════════════════════════════════════════════════════════════╡ +│ Copyright 2020 Justine Alexandra Roberts Tunney │ +│ │ +│ Permission to use, copy, modify, and/or distribute this software for │ +│ any purpose with or without fee is hereby granted, provided that the │ +│ above copyright notice and this permission notice appear in all copies. │ +│ │ +│ THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL │ +│ WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED │ +│ WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE │ +│ AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL │ +│ DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR │ +│ PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER │ +│ TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR │ +│ PERFORMANCE OF THIS SOFTWARE. │ +╚─────────────────────────────────────────────────────────────────────────────*/ +#include "libc/elf/elf.h" +#include "libc/elf/scalar.h" +#include "libc/elf/struct/ehdr.h" +#include "libc/elf/struct/sym.h" + +/** + * Returns pointer to array of elf symbols. + * + * This is a shortcut composing GetElfSymbolTable() and + * GetElfSectionAddress(), that can be used as follows: + * + * Elf64_Xword i, n; + * Elf64_Sym *st = GetElfSymbols(map, size, SHT_SYMTAB, &n); + * for (i = 0; st && i < n; ++i) { + * // st[i] holds a symbol + * } + * + * The above code will iterate over the relocatable and/or + * statically-linked symbols defined by an ELF image. + * + * @param elf points to the start of the executable image data + * @param mapsize is the number of bytes past `elf` we can access + * @param section_type is usually `SHT_SYMTAB` or `SHT_DYNSYM` + * @param out_count optionally receives number of symbols + * @return pointer to array of elf symbol array, otherwise null + */ +Elf64_Sym *GetElfSymbols(const Elf64_Ehdr *elf, // + size_t mapsize, // + int section_type, // + Elf64_Xword *out_count) { + Elf64_Sym *syms; + Elf64_Xword count; + if ((syms = GetElfSectionAddress( + elf, mapsize, + GetElfSymbolTable(elf, mapsize, section_type, &count))) && + out_count) { + *out_count = count; + } + return syms; +} diff --git a/libc/elf/getelfsymboltable.c b/libc/elf/getelfsymboltable.c index faa74cf1f..b4b92f3d6 100644 --- a/libc/elf/getelfsymboltable.c +++ b/libc/elf/getelfsymboltable.c @@ -1,7 +1,7 @@ /*-*- mode:c;indent-tabs-mode:nil;c-basic-offset:2;tab-width:8;coding:utf-8 -*-│ │vi: set net ft=c ts=2 sts=2 sw=2 fenc=utf-8 :vi│ ╞══════════════════════════════════════════════════════════════════════════════╡ -│ Copyright 2020 Justine Alexandra Roberts Tunney │ +│ Copyright 2023 Justine Alexandra Roberts Tunney │ │ │ │ Permission to use, copy, modify, and/or distribute this software for │ │ any purpose with or without fee is hereby granted, provided that the │ @@ -20,29 +20,59 @@ #include "libc/elf/elf.h" #include "libc/elf/scalar.h" #include "libc/elf/struct/ehdr.h" +#include "libc/elf/struct/shdr.h" #include "libc/elf/struct/sym.h" /** - * Returns pointer to elf symbol table. + * Returns pointer to the elf section header for a symbol table. * - * @param elf points to the start of the executable image + * The easiest way to get the symbol table is: + * + * Elf64_Xword i, n; + * Elf64_Sym *st = GetElfSymbols(map, size, SHT_SYMTAB, &n); + * for (i = 0; st && i < n; ++i) { + * // st[i] holds a symbol + * } + * + * This API is more verbose than the GetElfSymbols() shortcut, however + * calling this the long way makes tricks like the following possible: + * + * Elf64_Xword i, n; + * Elf64_Shdr *sh = GetElfSymbolTable(map, size, SHT_SYMTAB, &n); + * Elf64_Sym *st = GetElfSectionAddress(map, size, sh); + * if (st) { + * for (i = sh->sh_info; i < n; ++i) { + * // st[i] holds a non-local symbol + * } + * } + * + * Our code here only cares about `STB_GLOBAL` and `STB_WEAK` symbols + * however `SHT_SYMTAB` usually has countless `STB_LOCAL` entries too + * that must be skipped over. The trick is that the ELF spec requires + * local symbols be ordered before global symbols, and that the index + * dividing the two be stored to `sh_info`. So, if we start iterating + * there, then we've cleverly avoided possibly dozens of page faults! + * + * @param elf points to the start of the executable image data * @param mapsize is the number of bytes past `elf` we can access * @param section_type is usually `SHT_SYMTAB` or `SHT_DYNSYM` - * @param out_count optionally receives number of elements in res - * @return pointer to symbol array, or null on error + * @param out_count optionally receives number of symbols + * @return pointer to symbol table section header, otherwise null */ -Elf64_Sym *GetElfSymbolTable(const Elf64_Ehdr *elf, // - size_t mapsize, // - int section_type, // - Elf64_Xword *out_count) { +Elf64_Shdr *GetElfSymbolTable(const Elf64_Ehdr *elf, // + size_t mapsize, // + int section_type, // + Elf64_Xword *out_count) { int i; Elf64_Shdr *shdr; for (i = elf->e_shnum; i > 0; --i) { if ((shdr = GetElfSectionHeaderAddress(elf, mapsize, i - 1)) && // shdr->sh_entsize == sizeof(Elf64_Sym) && // shdr->sh_type == section_type) { - if (out_count) *out_count = shdr->sh_size / sizeof(Elf64_Sym); - return GetElfSectionAddress(elf, mapsize, shdr); + if (out_count) { + *out_count = shdr->sh_size / sizeof(Elf64_Sym); + } + return shdr; } } return 0; diff --git a/libc/elf/iselfsymbolcontent.c b/libc/elf/iselfsymbolcontent.c index e09aaa8f8..584b3fa7c 100644 --- a/libc/elf/iselfsymbolcontent.c +++ b/libc/elf/iselfsymbolcontent.c @@ -16,6 +16,7 @@ │ TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR │ │ PERFORMANCE OF THIS SOFTWARE. │ ╚─────────────────────────────────────────────────────────────────────────────*/ +#include "libc/elf/def.h" #include "libc/elf/elf.h" bool IsElfSymbolContent(const Elf64_Sym *sym) { diff --git a/libc/elf/struct/ehdr.h b/libc/elf/struct/ehdr.h index bebf53030..73f023348 100644 --- a/libc/elf/struct/ehdr.h +++ b/libc/elf/struct/ehdr.h @@ -1,27 +1,162 @@ #ifndef COSMOPOLITAN_LIBC_ELF_STRUCT_EHDR_H_ #define COSMOPOLITAN_LIBC_ELF_STRUCT_EHDR_H_ -#include "libc/elf/def.h" #include "libc/elf/scalar.h" - -#define EI_NIDENT 16 - #if !(__ASSEMBLER__ + __LINKER__ + 0) +/* + * ELF header. + */ typedef struct Elf64_Ehdr { - unsigned char e_ident[EI_NIDENT]; + + /* + * Leading bytes of ELF header. + * + * - `e_ident[0]` is always `127` + * - `e_ident[1]` is always `'E'` + * - `e_ident[2]` is always `'L'` + * - `e_ident[3]` is always `'F'` + * + * - `e_ident[EI_CLASS]` is mandatory and should be: + * + * - `ELFCLASSNONE64` if it's an Elf64 image + * - `ELFCLASSNONE32` if it's an Elf32 image + * - Otherwise we assume it's an Elf64 image + * + * - `e_ident[EI_DATA]` is advisory and could be: + * + * - `ELFDATANONE` isn't strictly valid + * - `ELFDATA2LSB` for little-endian + * - `ELFDATA2MSB` for big-endian + * + * - `e_ident[EI_VERSION]` is advisory and should be: + * + * - `EV_NONE` if it's zero or unspecified + * - `EV_CURRENT` for current ELF version (which is 1) + * + * - `e_ident[EI_OSABI]` is mandatory and could be: + * + * - `ELFOSABI_NONE` is zero + * - `ELFOSABI_GNU` is for GNU + * - `ELFOSABI_SYSV` used by GNU + * - `ELFOSABI_LINUX` doesn't care + * - `ELFOSABI_FREEBSD` does care (recommended) + * - `ELFOSABI_NETBSD` doesn't care (see `PT_NOTE`) + * - `ELFOSABI_OPENBSD` doesn't care (see `PT_NOTE`) + * + * - `e_ident[EI_ABIVERSION]` is advisory + * + */ + unsigned char e_ident[16]; + + /* + * ELF image type. + * + * This field is mandatory and should be one of: + * + * - `ET_REL` for `.o` object files + * - `ET_DYN` for `.so` files and `-pie` executables + * - `ET_EXEC` for statically-linked executables + * + */ Elf64_Half e_type; + + /* + * ELF machine type. + * + * This field is mandatory and could be one of: + * + * - `EM_M32` for Bellmac + * - `EM_X86_64` for Amd64 + * - `EM_AARCH64` for Arm64 + * - `EM_PPC64` for Raptors + * - `EM_RISCV` for Berkeley + * - `EM_S390` for System/360 + * + */ Elf64_Half e_machine; + + /* + * ELF version. + * + * This field is advisory and could be: + * + * - `EV_NONE` if it's zero or unspecified + * - `EV_CURRENT` for current ELF version (which is 1) + * + * @see `e_ident[EI_VERSION]` + */ Elf64_Word e_version; + + /* + * ELF executable entrypoint. + * + * Static executables should use this field to store the virtual + * address of the _start() function. This field may be zero, for + * unspecified. + */ Elf64_Addr e_entry; + + /* + * `Elf64_Phdr` file offset. + * + * This field is mandatory. Object files should set it to zero. + */ Elf64_Off e_phoff; + + /* + * `Elf64_Shdr` file offset. + * + * This field is advisory. + */ Elf64_Off e_shoff; + + /* + * ELF flags. + * + * This field is advisory. + */ Elf64_Word e_flags; + + /* + * `Elf64_Ehdr` size. + * + * This field is advisory and should be 64. + */ Elf64_Half e_ehsize; + + /* + * `Elf64_Phdr` element size. + * + * This field *is* cared about and should be set to 56. Cosmopolitan + * permits larger values for the pleasure of it. + */ Elf64_Half e_phentsize; + + /* + * `Elf64_Phdr` array count. + */ Elf64_Half e_phnum; + + /* + * `Elf64_Shdr` element size. + * + * This field is advisory and should be set to 64. Cosmopolitan + * permits larger values for the pleasure of it. + */ Elf64_Half e_shentsize; + + /* + * `Elf64_Shdr` count. + * + * This field is advisory. + */ Elf64_Half e_shnum; + + /* + * Section header index of section name string table. + */ Elf64_Half e_shstrndx; + } Elf64_Ehdr; #endif /* !(__ASSEMBLER__ + __LINKER__ + 0) */ diff --git a/libc/elf/struct/rel.h b/libc/elf/struct/rel.h index 32b97d9cc..d9c3e2f4b 100644 --- a/libc/elf/struct/rel.h +++ b/libc/elf/struct/rel.h @@ -3,9 +3,51 @@ #include "libc/elf/scalar.h" #if !(__ASSEMBLER__ + __LINKER__ + 0) +/* + * ELF relocation. + * + * Relocations let us easily apply fixups to compiled object code. This + * data structure represents the contents of an `sh_type` w/ `SHT_REL`. + * + * @see Elf64_Rela + */ typedef struct Elf64_Rel { + + /* + * Location to be modified. + * + * If `e_type` is `ET_REL` then this is a section data byte offset. + * + * If `e_type` isn't `ET_REL` then this is a virtual address. + */ Elf64_Addr r_offset; - Elf64_Xword r_info; /** @see ELF64_R_{SYM,SIZE,INFO} */ + + /* + * Relocation type and symbol. + * + * This value may be created using: + * + * r_info = ELF64_R_INFO(sym, type); + * + * This value may be read using: + * + * Elf64_Word sym = ELF64_R_SYM(r_info); + * Elf64_Word type = ELF64_R_TYPE(r_info); + * + * Where `sym` is a symbol index, and `type` might be: + * + * - `R_X86_64_64` + * - `R_X86_64_PC32` + * - `R_X86_64_GOTPCRELX` + * - `R_AARCH64_ABS64` + * + * Each relocation type specifies a mathematical formula that's used + * to compute the appropriate value for the fixed-up object code. If + * if needs an addend, then this struct doesn't have one, but it can + * still be embedded by the compiler in the location to be modified. + */ + Elf64_Xword r_info; + } Elf64_Rel; #endif /* !(__ASSEMBLER__ + __LINKER__ + 0) */ diff --git a/libc/elf/struct/rela.h b/libc/elf/struct/rela.h index 5fcbc8ea9..2d568c4da 100644 --- a/libc/elf/struct/rela.h +++ b/libc/elf/struct/rela.h @@ -3,15 +3,55 @@ #include "libc/elf/scalar.h" #if !(__ASSEMBLER__ + __LINKER__ + 0) +/* + * ELF relocation w/ explicit addend. + * + * Relocations let us easily apply fixups to compiled object code. This + * data structure represents the contents of an `sh_type` w/ `SHT_RELA` + * + * @see Elf64_Rel + */ typedef struct Elf64_Rela { - /*u64*/ Elf64_Addr r_offset; + /* - * ELF64_R_SYM(r_info) → sym - * ELF64_R_TYPE(r_info) → R_X86_64_{64,PC32,GOTPCRELX,...} - * ELF64_R_INFO(sym, type) → r_info + * Location to be modified. + * + * If `e_type` is `ET_REL` then this is a section data byte offset. + * + * If `e_type` isn't `ET_REL` then this is a virtual address. */ - /*u64*/ Elf64_Xword r_info; /* ELF64_R_{SYM,SIZE,INFO} */ - /*i64*/ Elf64_Sxword r_addend; + Elf64_Addr r_offset; + + /* + * Relocation type and symbol. + * + * This value may be created using: + * + * r_info = ELF64_R_INFO(sym, type); + * + * This value may be read using: + * + * Elf64_Word sym = ELF64_R_SYM(r_info); + * Elf64_Word type = ELF64_R_TYPE(r_info); + * + * Where `sym` is a symbol index, and `type` might be: + * + * - `R_X86_64_64` + * - `R_X86_64_PC32` + * - `R_X86_64_GOTPCRELX` + * - `R_AARCH64_ABS64` + * + */ + Elf64_Xword r_info; + + /* + * Relocation parameter. + * + * Each relocation type has its own mathematical formula, which should + * incorporate this value in its own unique way. + */ + Elf64_Sxword r_addend; + } Elf64_Rela; #endif /* !(__ASSEMBLER__ + __LINKER__ + 0) */ diff --git a/libc/elf/struct/shdr.h b/libc/elf/struct/shdr.h index 42c02a778..2edff9f35 100644 --- a/libc/elf/struct/shdr.h +++ b/libc/elf/struct/shdr.h @@ -8,24 +8,44 @@ * @see https://docs.oracle.com/cd/E19683-01/816-1386/chapter6-94076/index.html */ typedef struct Elf64_Shdr { + Elf64_Word sh_name; - Elf64_Word sh_type; /* SHT_{PROGBITS,NOBITS,STRTAB,SYMTAB,RELA,...} */ + + Elf64_Word sh_type; /* SHT_{PROGBITS,NOBITS,STRTAB,SYMTAB,RELA,...} */ + Elf64_Xword sh_flags; /* SHF_{WRITE,ALLOC,EXECINSTR,MERGE,STRINGS,...} */ + Elf64_Addr sh_addr; + Elf64_Off sh_offset; + Elf64_Xword sh_size; + /* - * If SHT_RELA: Index of section of associated symbol table. - * If SHT_SYMTAB: Index of section of associated string table. + * Index of linked section header. + * + * If `sh_type` is `SHT_RELA` then `sh_link` holds the section header + * index of the associated symbol table. + * + * If `sh_type` is `SHT_SYMTAB` then `sh_link` holds the section + * header index of the associated string table. */ Elf64_Word sh_link; + /* - * If SHT_RELA: Index of section to which relocations apply. - * If SHT_SYMTAB: One greater than symbol table index of last local symbol. + * If `sh_type` is `SHT_RELA` then `sh_info` contains the index of the + * section to which relocations apply. + * + * If `sh_type` is `SHT_SYMTAB` or `SHT_DYNSYM` then `sh_info` + * contains an index that's one greater than symbol table index of + * last `STB_LOCAL` symbol. */ Elf64_Word sh_info; + Elf64_Xword sh_addralign; + Elf64_Xword sh_entsize; + } Elf64_Shdr; #endif /* !(__ASSEMBLER__ + __LINKER__ + 0) */ diff --git a/libc/elf/struct/sym.h b/libc/elf/struct/sym.h index 94eed20a0..8137759e4 100644 --- a/libc/elf/struct/sym.h +++ b/libc/elf/struct/sym.h @@ -4,18 +4,91 @@ #if !(__ASSEMBLER__ + __LINKER__ + 0) typedef struct Elf64_Sym { + + /* + * Symbol name. + * + * This value is a byte offset into the `.strtab` section. If this + * value is zero, then the symbol has no name. + */ Elf64_Word st_name; - /* ELF64_ST_TYPE(st_info) → STT_{NOTYPE,OBJECT,FUNC,SECTION,FILE,COMMON,...} - * ELF64_ST_BIND(st_info) → STB_{LOCAL,GLOBAL,WEAK,...} */ + + /* + * Symbol type and binding. + * + * This value may be created using: + * + * sym.st_info = ELF64_ST_INFO(bind, type); + * + * This value may be read using: + * + * int bind = ELF64_ST_BIND(sym.st_info); + * int type = ELF64_ST_TYPE(sym.st_info); + * + * Where `bind` is typically: + * + * - `STB_LOCAL` + * - `STB_GLOBAL` + * - `STB_WEAK` + * + * Where `type` is typically: + * + * - `STT_NOTYPE` + * - `STT_OBJECT` + * - `STT_FUNC` + * - `STT_SECTION` + * - `STT_FILE` + * - `STT_COMMON` + */ uint8_t st_info; - /* STV_{DEFAULT,INTERNAL,HIDDEN,PROTECTED} */ + + /* + * Symbol visibility. + * + * This value should be accessed using: + * + * int visibility = ELF64_ST_VISIBILITY(sym.st_other); + * + * Where `visibility` is typically: + * + * - `STV_DEFAULT` + * - `STV_INTERNAL` + * - `STV_HIDDEN` + * - `STV_PROTECTED` + */ uint8_t st_other; - /* SHN_UNDEF,
    , SHN_ABS, SHN_COMMON, etc. */ + + /* + * Symbol section. + * + * If `st_shndx` is within `(SHN_UNDEF,SHN_LORESERVE)` then it holds + * an index into the section header table. + * + * Otherwise `st_shndx` is usually one of the following magic numbers: + * + * - `SHN_UNDEF` means symbol is undefined + * - `SHN_ABS` means symbol is a linker integer + * - `SHN_COMMON` means symbol is defined traditionally + */ Elf64_Section st_shndx; - /* byte offset into GetElfSectionAddress(st_shndx) */ + + /* + * Symbol value. + * + * If `e_type` is `ET_REL` and `st_shndx` is `SHN_COMMON`, then + * `st_value` holds the required symbol alignment, or ≤ 1 if no + * alignment is required. + * + * If `e_type` is `ET_REL` and `st_shndx` is a section index, then + * `st_value` holds a byte offset into the section memory. + * + * If `e_type` isn't `ET_REL` then `st_value` holds a virtual address. + */ Elf64_Addr st_value; + /* byte length optionally set by .size directive */ Elf64_Xword st_size; + } Elf64_Sym; #endif /* !(__ASSEMBLER__ + __LINKER__ + 0) */ diff --git a/libc/elf/tinyelf.internal.h b/libc/elf/tinyelf.internal.h index 0c332768a..bbe4b1084 100644 --- a/libc/elf/tinyelf.internal.h +++ b/libc/elf/tinyelf.internal.h @@ -1,5 +1,6 @@ #ifndef COSMOPOLITAN_LIBC_ELF_TINYELF_INTERNAL_H_ #define COSMOPOLITAN_LIBC_ELF_TINYELF_INTERNAL_H_ +#include "libc/elf/def.h" #include "libc/elf/struct/ehdr.h" #include "libc/elf/struct/phdr.h" #include "libc/elf/struct/shdr.h" diff --git a/libc/stdio/fflushimpl.c b/libc/stdio/fflushimpl.c index 8fea0bf58..be578bc4e 100644 --- a/libc/stdio/fflushimpl.c +++ b/libc/stdio/fflushimpl.c @@ -18,6 +18,7 @@ ╚─────────────────────────────────────────────────────────────────────────────*/ #include "libc/calls/calls.h" #include "libc/errno.h" +#include "libc/intrin/weaken.h" #include "libc/mem/mem.h" #include "libc/runtime/runtime.h" #include "libc/stdio/internal.h" @@ -27,8 +28,12 @@ int __fflush_impl(FILE *f) { size_t i; ssize_t rc; - free(f->getln); - f->getln = 0; + if (f->getln) { + if (_weaken(free)) { + _weaken(free)(f->getln); + } + f->getln = 0; + } if (f->beg && !f->end && (f->iomode & O_ACCMODE) != O_RDONLY) { for (i = 0; i < f->beg; i += rc) { if ((rc = write(f->fd, f->buf + i, f->beg - i)) == -1) { diff --git a/tool/build/ar.c b/tool/build/ar.c index d74ebfb83..079ba3cec 100644 --- a/tool/build/ar.c +++ b/tool/build/ar.c @@ -1,7 +1,7 @@ /*-*- mode:c;indent-tabs-mode:nil;c-basic-offset:2;tab-width:8;coding:utf-8 -*-│ │vi: set net ft=c ts=2 sts=2 sw=2 fenc=utf-8 :vi│ ╞══════════════════════════════════════════════════════════════════════════════╡ -│ Copyright 2020 Justine Alexandra Roberts Tunney │ +│ Copyright 2023 Justine Alexandra Roberts Tunney │ │ │ │ Permission to use, copy, modify, and/or distribute this software for │ │ any purpose with or without fee is hereby granted, provided that the │ @@ -16,345 +16,461 @@ │ TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR │ │ PERFORMANCE OF THIS SOFTWARE. │ ╚─────────────────────────────────────────────────────────────────────────────*/ +#include "libc/ar.h" #include "libc/assert.h" #include "libc/calls/calls.h" #include "libc/calls/struct/iovec.h" #include "libc/calls/struct/stat.h" #include "libc/elf/def.h" #include "libc/elf/elf.h" +#include "libc/elf/scalar.h" +#include "libc/elf/struct/sym.h" #include "libc/errno.h" -#include "libc/fmt/conv.h" #include "libc/fmt/itoa.h" #include "libc/fmt/libgen.h" +#include "libc/fmt/magnumstrs.internal.h" #include "libc/intrin/bits.h" -#include "libc/intrin/safemacros.internal.h" -#include "libc/log/check.h" -#include "libc/log/log.h" +#include "libc/intrin/bsr.h" +#include "libc/intrin/kprintf.h" +#include "libc/limits.h" #include "libc/macros.internal.h" -#include "libc/mem/arraylist2.internal.h" -#include "libc/mem/mem.h" #include "libc/runtime/runtime.h" -#include "libc/sock/sock.h" -#include "libc/stdio/stdio.h" +#include "libc/stdckdint.h" #include "libc/str/str.h" -#include "libc/sysv/consts/ex.h" -#include "libc/sysv/consts/madv.h" #include "libc/sysv/consts/map.h" #include "libc/sysv/consts/o.h" #include "libc/sysv/consts/prot.h" #include "libc/sysv/consts/s.h" -#include "libc/x/x.h" #include "tool/build/lib/getargs.h" /** - * @fileoverview System Five Static Archive Builder. + * @fileoverview cosmopolitan ar * - * GNU ar has a bug which causes it to take hundreds of milliseconds to - * build archives like ntdll.a and several minutes for cosmopolitan.a. - * This goes quadratically faster taking 1ms to do ntdll w/ hot cache. + * This static archiver is superior: * - * Compared to LLVM ar this tool goes 10x faster because it uses madvise - * and copy_file_range which give us the optimal page cached file system - * beahvior that a build environment needs. + * - Isn't "accidentally quadratic" like GNU ar + * - Goes 2x faster than LLVM ar while using 100x less memory + * - Can be built as a 52kb APE binary that works well on six OSes * - * This tool also adds a feature: it ignores directory parameters. This - * is important because good Makefiles on Linux will generally have the - * directory be a .a prerequisite so archives rebuild on file deletion. + * This static archiver introduces handy features: + * + * - Arguments may be supplied in an `@args.txt` file + * - Directory arguments are ignored * * @see https://www.unix.com/man-page/opensolaris/3head/ar.h/ + * @see https://en.wikipedia.org/wiki/Ar_(Unix) */ -struct Args { - size_t i, n; - char **p; -}; +#define VERSION \ + "cosmopolitan ar v2.0\n" \ + "copyright 2023 justine tunney\n" \ + "https://github.com/jart/cosmopolitan\n" -struct String { - size_t i, n; - char *p; -}; +#define HEAP_SIZE (256L * 1024 * 1024) struct Ints { - size_t i, n; int *p; + size_t i; }; -struct Header { - char name[16]; - char date[12]; - char uid[6]; - char gid[6]; - char mode[8]; - char size[10]; - char fmag[2]; +struct Args { + char **p; + size_t i; }; -static void *Realloc(void *p, size_t n) { - void *q; - if (!(q = realloc(p, n))) { - fputs("error: ar: out of memory\n", stderr); - exit(1); +struct Bytes { + char *p; + size_t i; +}; + +static void SortChars(char *A, long n) { + long i, j, t; + for (i = 1; i < n; i++) { + t = A[i]; + j = i - 1; + while (j >= 0 && A[j] > t) { + A[j + 1] = A[j]; + j = j - 1; + } + A[j + 1] = t; } - return q; } -static void *Malloc(size_t n) { - return Realloc(0, n); +static wontreturn void Die(const char *path, const char *reason) { + tinyprint(2, path, ": ", reason, "\n", NULL); + exit(1); } -static void NewArgs(struct Args *l, size_t n) { - l->i = 0; - l->n = MAX(2, n); - l->p = Malloc(l->n * sizeof(*l->p)); - l->p[0] = 0; +static wontreturn void SysDie(const char *path, const char *func) { + const char *errstr; + if (!(errstr = _strerdoc(errno))) errstr = "Unknown error"; + tinyprint(2, path, ": ", func, ": ", errstr, "\n", NULL); + exit(1); } -static void NewInts(struct Ints *l, size_t n) { - l->i = 0; - l->n = MAX(2, n); - l->p = Malloc(l->n * sizeof(*l->p)); - l->p[0] = 0; +static wontreturn void ShowUsage(int rc, int fd) { + tinyprint(fd, VERSION, + "\n" + "USAGE\n" + "\n", + " ", program_invocation_name, " FLAGS ARCHIVE FILE...\n", + "\n" + "FLAGS\n" + "\n" + " rcs create new archive with index\n" + " rcsD always deterministic\n" + " --help show usage\n" + " --version show program details\n" + "\n" + "ARGUMENTS\n" + "\n" + " ARCHIVE should be foo.a\n" + " FILE should be foo.o or @args.txt\n" + "\n", + NULL); + exit(rc); } -static void NewString(struct String *s, size_t n) { - s->i = 0; - s->n = MAX(2, n); - s->p = Malloc(s->n * sizeof(*s->p)); - s->p[0] = 0; +// allocates 𝑛 bytes of memory aligned on 𝑎 from .bss +// - avoids binary bloat of mmap() and malloc() +// - dies if out of memory or overflow occurs +// - new memory is always zero-initialized +// - can't be resized; use reballoc api +// - can't be freed or reclaimed +static void *balloc(size_t n, size_t a) { + size_t c; + int resizable; + uintptr_t h, p; + static size_t used; + static char heap[HEAP_SIZE]; + assert(a >= 1 && !(a & (a - 1))); + h = (uintptr_t)heap; + p = h + used; + if ((resizable = (ssize_t)n < 0)) { + n = ~n; + p += sizeof(c); + } + p += a - 1; + p &= -a; + if (n <= a) { + c = a; + } else if (!resizable) { + c = n; + } else { + c = 2ull << (__builtin_clzll(n - 1) ^ (sizeof(long long) * CHAR_BIT - 1)); + } + if (c < a || c > HEAP_SIZE || p + c > h + HEAP_SIZE) { + Die(program_invocation_name, "out of memory"); + } + used = p - h + c; + if (resizable) { + memcpy((char *)p - sizeof(c), &c, sizeof(c)); + } + return (void *)p; +} + +// reallocates 𝑛 𝑧-sized elements aligned on 𝑧 from .bss +// - avoids binary bloat of mmap() and realloc() +// - dies if out of memory or overflow occurs +// - new memory is always zero-initialized +// - abstracts multiply overflow check +// - shrinking always happens in-place +// - growing cost is always amortized +// - can't be freed or reclaimed +static void *reballoc(void *p, size_t n, size_t z) { + size_t c; + assert(n >= 0); + assert(z >= 1 && !(z & (z - 1))); + if (ckd_mul(&n, n, z)) n = HEAP_SIZE; + if (!p) return balloc(~n, z); + memcpy(&c, (char *)p - sizeof(c), sizeof(c)); + assert(c >= z && c < HEAP_SIZE && !(c & (c - 1))); + if (n <= c) return p; + return memcpy(balloc(~n, z), p, c); +} + +static char *StrDup(const char *s) { + size_t n = strlen(s) + 1; + return memcpy(balloc(n, 1), s, n); +} + +static char *StrCat(const char *a, const char *b) { + char *p; + size_t n, m; + n = strlen(a); + m = strlen(b); + p = balloc(n + m + 1, 1); + memcpy(p, a, n); + memcpy(p + n, b, m + 1); + return p; } static void AppendInt(struct Ints *l, int i) { - assert(l->n > 1); - if (l->i + 1 >= l->n) { - do { - l->n += l->n >> 1; - } while (l->i + 1 >= l->n); - l->p = Realloc(l->p, l->n * sizeof(*l->p)); - } + l->p = reballoc(l->p, l->i + 2, sizeof(*l->p)); l->p[l->i++] = i; - l->p[l->i] = 0; } static void AppendArg(struct Args *l, char *s) { - assert(l->n > 1); - if (l->i + 1 >= l->n) { - do { - l->n += l->n >> 1; - } while (l->i + 1 >= l->n); - l->p = Realloc(l->p, l->n * sizeof(*l->p)); - } + l->p = reballoc(l->p, l->i + 2, sizeof(*l->p)); l->p[l->i++] = s; - l->p[l->i] = 0; } -static void MakeHeader(struct Header *h, const char *name, int ref, int mode, - int size) { +static void AppendBytes(struct Bytes *l, const char *s, size_t n) { + l->p = reballoc(l->p, l->i + n + 1, sizeof(*l->p)); + memcpy(l->p + l->i, s, n); + l->i += n; +} + +static int IsEqual(const char *a, const char *b) { + return !strcmp(a, b); +} + +static void MakeArHeader(struct ar_hdr *h, // + const char *name, // + int mode, // + size_t size) { // size_t n; - char ibuf[13], *p; + char b[21]; memset(h, ' ', sizeof(*h)); n = strlen(name); - memcpy(h->name, name, n); - if (ref != -1) { - FormatUint32(h->name + n, ref); + if (n > ARRAYLEN(h->ar_name)) { + Die(program_invocation_name, "ar_name overflow"); } - if (strcmp(name, "//") != 0) { - h->date[0] = '0'; - h->uid[0] = '0'; - h->gid[0] = '0'; - p = FormatOctal32(ibuf, mode & 0777, false); - CHECK_LE(p - ibuf, sizeof(h->mode)); - memcpy(h->mode, ibuf, p - ibuf); + memcpy(h->ar_name, name, n); + if (!IsEqual(name, "//")) { + h->ar_date[0] = '0'; + h->ar_uid[0] = '0'; + h->ar_gid[0] = '0'; + memcpy(h->ar_mode, b, FormatOctal32(b, mode & 0777, false) - b); } - h->fmag[0] = '`'; - h->fmag[1] = '\n'; - p = FormatUint32(ibuf, size); - CHECK_LE(p - ibuf, sizeof(h->size)); - memcpy(h->size, ibuf, p - ibuf); + if (size > 9999999999) { + Die(program_invocation_name, "ar_size overflow"); + } + memcpy(h->ar_size, b, FormatUint64(b, size) - b); + memcpy(h->ar_fmag, ARFMAG, sizeof(h->ar_fmag)); +} + +// copies data between file descriptors until end of file +// - assumes signal handlers aren't in play +// - uses copy_file_range() if possible +// - returns number of bytes exchanged +// - dies if operation fails +static int64_t CopyFileOrDie(const char *inpath, int infd, // + const char *outpath, int outfd) { + int64_t toto; + char buf[512]; + size_t exchanged; + ssize_t got, wrote; + enum { CFR, RW } mode; + for (mode = CFR, toto = 0;; toto += exchanged) { + if (mode == CFR) { + got = copy_file_range(infd, 0, outfd, 0, 4194304, 0); + if (!got) break; + if (got != -1) { + exchanged = got; + } else if (errno == EXDEV || // different partitions + errno == ENOSYS || // not linux or freebsd + errno == ENOTSUP || // probably a /zip file + errno == EOPNOTSUPP) { // technically the same + exchanged = 0; + mode = RW; + } else { + SysDie(inpath, "copy_file_range"); + } + } else { + got = read(infd, buf, sizeof(buf)); + if (!got) break; + if (got == -1) SysDie(inpath, "read"); + wrote = write(outfd, buf, got); + if (wrote == -1) SysDie(outpath, "write"); + if (wrote != got) Die(outpath, "posix violated"); + exchanged = wrote; + } + } + return toto; } int main(int argc, char *argv[]) { - FILE *f; - void *elf; - char *line; - char *strs; - ssize_t rc; - int *offsets; - size_t wrote; - size_t remain; - struct stat *st; - uint32_t outpos; - Elf64_Sym *syms; - const char *arg; - struct Args args; - uint64_t outsize; - uint8_t *tablebuf; - struct GetArgs ga; - struct Ints modes; - struct Ints names; - struct Ints sizes; - const char *reason; - struct iovec iov[7]; - const char *symname; - const char *outpath; - Elf64_Xword symcount; - struct Ints symnames; - struct String symbols; - struct String filenames; - struct Header *header1, *header2; - int i, j, fd, err, name, outfd, tablebufsize; + int fd, objectid; + struct ar_hdr header1; + struct ar_hdr header2; - // TODO(jart): Delete this. - if (argc == 2 && !strcmp(argv[1], "-n")) { - exit(0); +#ifndef NDEBUG + ShowCrashReports(); +#endif + + // handle hardcoded flags + if (argc == 2) { + if (IsEqual(argv[1], "-n")) { + exit(0); + } + if (IsEqual(argv[1], "-h") || // + IsEqual(argv[1], "-?") || // + IsEqual(argv[1], "--help")) { + ShowUsage(0, 1); + } + if (IsEqual(argv[1], "--version")) { + tinyprint(1, VERSION, NULL); + exit(0); + } } + // get flags and output path + if (argc < 3) { + ShowUsage(1, 2); + } + const char *flags = argv[1]; + const char *outpath = argv[2]; + // we only support one mode of operation, which is creating a new - // deterministic archive. this tool is so fast that we don't need - // database-like tools when editing static archives - if (!(argc > 2 && strcmp(argv[1], "rcsD") == 0)) { - fputs("usage: ", stderr); - if (argc > 0) fputs(argv[0], stderr); - fputs(" rcsD ARCHIVE FILE...", stderr); - exit(EX_USAGE); + // deterministic archive. computing the full archive goes so fast + // on modern systems that it isn't worth supporting the byzantine + // standard posix ar flags intended to improve cassette tape perf + SortChars(flags, strlen(flags)); + if (!IsEqual(flags, "crs") && // + !IsEqual(flags, "Dcrs")) { + tinyprint(2, program_invocation_name, ": flags should be rcsD\n", NULL); + ShowUsage(1, 2); } - outpath = argv[2]; - NewArgs(&args, 4); - st = Malloc(sizeof(struct stat)); - NewInts(&modes, 128); - NewInts(&names, 128); - NewInts(&sizes, 128); - NewInts(&symnames, 1024); - NewString(&symbols, 4096); - NewString(&filenames, 1024); + struct Args args = {reballoc(0, 4096, sizeof(char *))}; + struct Args names = {reballoc(0, 4096, sizeof(char *))}; + struct Ints modes = {reballoc(0, 4096, sizeof(int))}; + struct Ints longnames = {reballoc(0, 256, sizeof(int))}; + struct Ints sizes = {reballoc(0, 4096, sizeof(int))}; + struct Ints symnames = {reballoc(0, 16384, sizeof(int))}; + struct Bytes symbols = {reballoc(0, 131072, sizeof(char))}; + struct Bytes filenames = {reballoc(0, 16384, sizeof(char))}; + + // perform analysis pass on input files + struct GetArgs ga; getargs_init(&ga, argv + 3); - - // load global symbols and populate page cache - for (i = 0;; ++i) { - TryAgain: + for (objectid = 0;;) { + struct stat st; + const char *arg; if (!(arg = getargs_next(&ga))) break; - if (_endswith(arg, "/")) goto TryAgain; - if (_endswith(arg, ".pkg")) goto TryAgain; - CHECK_NE(-1, stat(arg, st), "%s", arg); - if (!st->st_size || S_ISDIR(st->st_mode)) goto TryAgain; - CHECK_NE(-1, (fd = open(arg, O_RDONLY)), "%s", arg); - CHECK_LT(st->st_size, 0x7ffff000); - AppendArg(&args, xstrdup(arg)); - AppendInt(&names, filenames.i); - AppendInt(&sizes, st->st_size); - AppendInt(&modes, st->st_mode); - CONCAT(&filenames.p, &filenames.i, &filenames.n, basename(arg), - strlen(basename(arg))); - CONCAT(&filenames.p, &filenames.i, &filenames.n, "/\n", 2); - CHECK_NE(MAP_FAILED, - (elf = mmap(0, st->st_size, PROT_READ, MAP_PRIVATE, fd, 0))); - CHECK(IsElf64Binary(elf, st->st_size), "%s", arg); - CHECK_NOTNULL((strs = GetElfStringTable(elf, st->st_size, ".strtab"))); - CHECK_NOTNULL( - (syms = GetElfSymbolTable(elf, st->st_size, SHT_SYMTAB, &symcount))); - for (j = 0; j < symcount; ++j) { - if (syms[j].st_shndx == SHN_UNDEF) continue; - if (syms[j].st_other == STV_INTERNAL) continue; - if (ELF64_ST_BIND(syms[j].st_info) == STB_LOCAL) continue; - symname = GetElfString(elf, st->st_size, strs, syms[j].st_name); - CONCAT(&symbols.p, &symbols.i, &symbols.n, symname, strlen(symname) + 1); - AppendInt(&symnames, i); + if (_endswith(arg, "/")) continue; + if (_endswith(arg, ".pkg")) continue; + if (stat(arg, &st)) SysDie(arg, "stat"); + if (S_ISDIR(st.st_mode)) continue; + if (!st.st_size) Die(arg, "file is empty"); + if (st.st_size > 0x7ffff000) Die(arg, "file too large"); + if ((fd = open(arg, O_RDONLY)) == -1) SysDie(arg, "open"); + AppendArg(&args, StrDup(arg)); + AppendInt(&sizes, st.st_size); + AppendInt(&modes, st.st_mode); + char bnbuf[PATH_MAX + 1]; + strlcpy(bnbuf, arg, sizeof(bnbuf)); + char *aname = StrCat(basename(bnbuf), "/"); + if (strlen(aname) <= sizeof(header1.ar_name)) { + AppendArg(&names, aname); + } else { + char ibuf[21]; + FormatUint64(ibuf, filenames.i); + AppendArg(&names, StrCat("/", ibuf)); + AppendBytes(&filenames, aname, strlen(aname)); + AppendBytes(&filenames, "\n", 1); } - CHECK_NE(-1, munmap(elf, st->st_size)); - close(fd); + size_t mapsize = st.st_size; + void *elf = mmap(0, mapsize, PROT_READ, MAP_PRIVATE, fd, 0); + if (elf == MAP_FAILED) SysDie(arg, "mmap"); + if (!IsElf64Binary(elf, mapsize)) Die(arg, "not an elf64 binary"); + char *strs = GetElfStringTable(elf, mapsize, ".strtab"); + if (!strs) Die(arg, "elf .strtab not found"); + Elf64_Xword symcount; + Elf64_Shdr *symsec = GetElfSymbolTable(elf, mapsize, SHT_SYMTAB, &symcount); + Elf64_Sym *syms = GetElfSectionAddress(elf, mapsize, symsec); + if (!syms) Die(arg, "elf symbol table not found"); + for (Elf64_Xword j = symsec->sh_info; j < symcount; ++j) { + if (!syms[j].st_name) continue; + if (syms[j].st_shndx == SHN_UNDEF) continue; + if (syms[j].st_shndx == SHN_COMMON) continue; + const char *symname = GetElfString(elf, mapsize, strs, syms[j].st_name); + if (!symname) Die(arg, "elf symbol name corrupted"); + AppendBytes(&symbols, symname, strlen(symname) + 1); + AppendInt(&symnames, objectid); + } + if (munmap(elf, mapsize)) SysDie(arg, "munmap"); + if (close(fd)) SysDie(arg, "close"); + ++objectid; } - APPEND(&filenames.p, &filenames.i, &filenames.n, "\n"); + getargs_destroy(&ga); // compute length of output archive - outsize = 0; - tablebufsize = 4 + symnames.i * 4; - tablebuf = Malloc(tablebufsize); - offsets = Malloc(args.i * 4); - header1 = Malloc(sizeof(struct Header)); - header2 = Malloc(sizeof(struct Header)); - iov[0].iov_base = "!\n"; - outsize += (iov[0].iov_len = 8); - iov[1].iov_base = header1; - outsize += (iov[1].iov_len = 60); + size_t outsize = 0; + struct iovec iov[8]; + int tablebufsize = 4 + symnames.i * 4; + char *tablebuf = balloc(tablebufsize, 1); + int *offsets = balloc(args.i * sizeof(int), sizeof(int)); + iov[0].iov_base = ARMAG; + outsize += (iov[0].iov_len = SARMAG); + iov[1].iov_base = &header1; + outsize += (iov[1].iov_len = sizeof(struct ar_hdr)); iov[2].iov_base = tablebuf; outsize += (iov[2].iov_len = tablebufsize); iov[3].iov_base = symbols.p; outsize += (iov[3].iov_len = symbols.i); - iov[4].iov_base = "\n"; + iov[4].iov_base = ""; outsize += (iov[4].iov_len = outsize & 1); - iov[5].iov_base = header2; - outsize += (iov[5].iov_len = 60); + iov[5].iov_base = &header2; + outsize += (iov[5].iov_len = filenames.i ? sizeof(struct ar_hdr) : 0); iov[6].iov_base = filenames.p; outsize += (iov[6].iov_len = filenames.i); - for (i = 0; i < args.i; ++i) { + iov[7].iov_base = "\n"; + outsize += (iov[7].iov_len = filenames.i & 1); + for (size_t i = 0; i < args.i; ++i) { outsize += outsize & 1; + if (outsize > INT_MAX) { + Die(outpath, "archive too large"); + } offsets[i] = outsize; - outsize += 60; + outsize += sizeof(struct ar_hdr); outsize += sizes.p[i]; } - CHECK_LE(outsize, 0x7ffff000); // serialize metadata - MakeHeader(header1, "/", -1, 0, tablebufsize + symbols.i); - MakeHeader(header2, "//", -1, 0, filenames.i); + MakeArHeader(&header1, "/", 0, tablebufsize + ROUNDUP(symbols.i, 2)); + MakeArHeader(&header2, "//", 0, ROUNDUP(filenames.i, 2)); WRITE32BE(tablebuf, symnames.i); - for (i = 0; i < symnames.i; ++i) { + for (size_t i = 0; i < symnames.i; ++i) { WRITE32BE(tablebuf + 4 + i * 4, offsets[symnames.p[i]]); } // write output archive - CHECK_NE(-1, (outfd = creat(outpath, 0644))); - ftruncate(outfd, outsize); - if ((outsize = writev(outfd, iov, ARRAYLEN(iov))) == -1) { - reason = "writev1 failed"; - goto fail; + int outfd; + if ((outfd = creat(outpath, 0644)) == -1) { + SysDie(outpath, "creat"); } - for (i = 0; i < args.i; ++i) { - if ((fd = open(args.p[i], O_RDONLY)) == -1) { - reason = "open failed"; - goto fail; + if (ftruncate(outfd, outsize)) { + SysDie(outpath, "ftruncate"); + } + if ((outsize = writev(outfd, iov, ARRAYLEN(iov))) == -1) { + SysDie(outpath, "writev[1]"); + } + for (size_t i = 0; i < args.i; ++i) { + const char *inpath = args.p[i]; + if ((fd = open(inpath, O_RDONLY)) == -1) { + SysDie(inpath, "open"); } iov[0].iov_base = "\n"; outsize += (iov[0].iov_len = outsize & 1); - iov[1].iov_base = header1; - outsize += (iov[1].iov_len = 60); - MakeHeader(header1, "/", names.p[i], modes.p[i], sizes.p[i]); + iov[1].iov_base = &header1; + outsize += (iov[1].iov_len = sizeof(struct ar_hdr)); + MakeArHeader(&header1, names.p[i], modes.p[i], sizes.p[i]); if (writev(outfd, iov, 2) == -1) { - reason = "writev2 failed"; - goto fail; + SysDie(outpath, "writev[2]"); } - outsize += (remain = sizes.p[i]); - if (copyfd(fd, outfd, remain) == -1) { - reason = "copy failed"; - goto fail; + outsize += sizes.p[i]; + if (CopyFileOrDie(inpath, fd, outpath, outfd) != sizes.p[i]) { + Die(inpath, "file size changed"); + } + if (close(fd)) { + SysDie(inpath, "close"); } - close(fd); } - close(outfd); + if (close(outfd)) { + SysDie(outpath, "close"); + } - for (i = 0; i < args.i; ++i) free(args.p[i]); - getargs_destroy(&ga); - free(filenames.p); - free(symnames.p); - free(symbols.p); - free(tablebuf); - free(modes.p); - free(names.p); - free(sizes.p); - free(offsets); - free(header1); - free(header2); - free(args.p); - free(st); return 0; - -fail: - err = errno; - unlink(outpath); - fputs("error: ar failed: ", stderr); - fputs(reason, stderr); - fputs(": ", stderr); - fputs(strerror(err), stderr); - fputs("\n", stderr); - return 1; } diff --git a/tool/build/fixupobj.c b/tool/build/fixupobj.c index e065fcca5..4e5bce1d5 100644 --- a/tool/build/fixupobj.c +++ b/tool/build/fixupobj.c @@ -20,6 +20,7 @@ #include "libc/calls/calls.h" #include "libc/calls/struct/stat.h" #include "libc/dce.h" +#include "libc/elf/def.h" #include "libc/elf/elf.h" #include "libc/elf/scalar.h" #include "libc/elf/struct/rela.h" @@ -358,7 +359,7 @@ static void FixupObject(void) { if (!IsElf64Binary(elf, esize)) { Die("not an elf64 binary"); } - if (!(syms = GetElfSymbolTable(elf, esize, SHT_SYMTAB, &symcount))) { + if (!(syms = GetElfSymbols(elf, esize, SHT_SYMTAB, &symcount))) { Die("missing elf symbol table"); } if (!(secstrs = GetElfSectionNameStringTable(elf, esize))) { diff --git a/tool/build/lib/elfwriter_yoink.c b/tool/build/lib/elfwriter_yoink.c index 489652d69..011151144 100644 --- a/tool/build/lib/elfwriter_yoink.c +++ b/tool/build/lib/elfwriter_yoink.c @@ -16,6 +16,7 @@ │ TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR │ │ PERFORMANCE OF THIS SOFTWARE. │ ╚─────────────────────────────────────────────────────────────────────────────*/ +#include "libc/elf/def.h" #include "libc/str/str.h" #include "tool/build/lib/elfwriter.h" diff --git a/tool/build/lib/elfwriter_zip.c b/tool/build/lib/elfwriter_zip.c index cb60ee4b6..8470f8205 100644 --- a/tool/build/lib/elfwriter_zip.c +++ b/tool/build/lib/elfwriter_zip.c @@ -17,6 +17,7 @@ │ PERFORMANCE OF THIS SOFTWARE. │ ╚─────────────────────────────────────────────────────────────────────────────*/ #include "libc/dos.internal.h" +#include "libc/elf/def.h" #include "libc/fmt/conv.h" #include "libc/limits.h" #include "libc/log/check.h" diff --git a/tool/build/lib/getargs.c b/tool/build/lib/getargs.c index b8a0663be..a4a17640c 100644 --- a/tool/build/lib/getargs.c +++ b/tool/build/lib/getargs.c @@ -16,17 +16,20 @@ │ TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR │ │ PERFORMANCE OF THIS SOFTWARE. │ ╚─────────────────────────────────────────────────────────────────────────────*/ +#include "tool/build/lib/getargs.h" #include "libc/assert.h" #include "libc/calls/calls.h" -#include "libc/calls/struct/stat.h" +#include "libc/errno.h" +#include "libc/fmt/magnumstrs.internal.h" +#include "libc/macros.internal.h" #include "libc/runtime/runtime.h" +#include "libc/runtime/sysconf.h" #include "libc/stdio/stdio.h" #include "libc/str/str.h" #include "libc/sysv/consts/map.h" #include "libc/sysv/consts/o.h" #include "libc/sysv/consts/prot.h" #include "libc/sysv/errfuns.h" -#include "tool/build/lib/getargs.h" /** * @fileoverview Fast Command Line Argument Ingestion. @@ -72,6 +75,13 @@ #define IsSpace(c) ((255 & (c)) <= ' ') +static wontreturn void getargs_fail(const char *path, const char *reason) { + const char *errstr; + if (!(errstr = _strerdoc(errno))) errstr = "Unknown error"; + tinyprint(2, path, ": ", reason, ": ", errstr, "\n", NULL); + exit(1); +} + /** * Zeroes GetArgs object and sets its fields. * @param args is borrowed for the lifetime of the GetArgs object @@ -86,7 +96,9 @@ void getargs_init(struct GetArgs *ga, char **args) { * Releases memory associated with GetArgs object and zeroes it. */ void getargs_destroy(struct GetArgs *ga) { - if (ga->map) munmap(ga->map, ga->mapsize); + if (ga->map) { + if (munmap(ga->map, ga->mapsize)) notpossible; + } bzero(ga, sizeof(*ga)); } @@ -106,8 +118,8 @@ const char *getargs_next(struct GetArgs *ga) { char *p; size_t k; unsigned m; - struct stat st; - do { + ssize_t size; + for (;;) { if (ga->map) { for (; ga->j < ga->mapsize; ++ga->j) { if (!IsSpace(ga->map[ga->j])) { @@ -134,36 +146,39 @@ const char *getargs_next(struct GetArgs *ga) { break; } } - if (k) { - if (ga->j + k < ga->mapsize) { - ga->map[ga->j + k] = 0; - p = ga->map + ga->j; - ga->j += ++k; - return p; - } else { - eio(); - break; - } + if (k && ga->j + k < ga->mapsize) { + ga->map[ga->j + k] = 0; + p = ga->map + ga->j; + ga->j += ++k; + return p; } - if (munmap(ga->map, ga->mapsize) == -1) break; + if (munmap(ga->map, ga->mapsize)) notpossible; ga->map = 0; ga->mapsize = 0; ga->j = 0; } - if (!(p = ga->args[ga->i])) return 0; - ++ga->i; - if (*p != '@') return p; - ++p; - if ((fd = open((ga->path = p), O_RDONLY)) != -1) { - fstat(fd, &st); - if ((p = mmap(0, st.st_size, PROT_READ | PROT_WRITE, MAP_PRIVATE, fd, - 0)) != MAP_FAILED) { - ga->map = p; - ga->mapsize = st.st_size; - } - close(fd); + if (!(p = ga->args[ga->i])) { + return 0; } - } while (ga->map); - perror(ga->path); - exit(1); + ++ga->i; + if (*p != '@') { + return p; + } + ++p; + if ((fd = open((ga->path = p), O_RDONLY)) == -1) { + getargs_fail(ga->path, "open"); + } + if ((size = lseek(fd, 0, SEEK_END)) == -1) { + getargs_fail(ga->path, "lseek"); + } + if (size) { + p = mmap(0, size, PROT_READ | PROT_WRITE, MAP_PRIVATE, fd, 0); + if (p == MAP_FAILED) { + getargs_fail(ga->path, "mmap"); + } + ga->map = p; + ga->mapsize = ROUNDUP(size, 4096); + } + close(fd); + } } diff --git a/tool/build/package.c b/tool/build/package.c index 80e0a22f0..b1b9281bf 100644 --- a/tool/build/package.c +++ b/tool/build/package.c @@ -20,6 +20,7 @@ #include "libc/calls/struct/iovec.h" #include "libc/calls/struct/stat.h" #include "libc/dce.h" +#include "libc/elf/def.h" #include "libc/elf/elf.h" #include "libc/elf/struct/rela.h" #include "libc/elf/struct/shdr.h" @@ -529,8 +530,8 @@ static void OpenObject(struct Package *pkg, struct Object *obj, int oid) { if (!(obj->strs = GetElfStringTable(obj->elf, obj->size, ".strtab"))) { Die(path, "missing elf string table"); } - if (!(obj->syms = GetElfSymbolTable(obj->elf, obj->size, SHT_SYMTAB, - &obj->symcount))) { + if (!(obj->syms = + GetElfSymbols(obj->elf, obj->size, SHT_SYMTAB, &obj->symcount))) { Die(path, "missing elf symbol table"); } IndexSections(pkg, obj); diff --git a/tool/decode/elf.c b/tool/decode/elf.c index e0dd81a14..943d2cbe7 100644 --- a/tool/decode/elf.c +++ b/tool/decode/elf.c @@ -20,6 +20,7 @@ #include "libc/calls/calls.h" #include "libc/calls/struct/stat.h" #include "libc/elf/def.h" +#include "libc/elf/elf.h" #include "libc/elf/struct/rela.h" #include "libc/elf/struct/shdr.h" #include "libc/errno.h" @@ -273,8 +274,7 @@ static void printelfsymbol(Elf64_Sym *sym, char *strtab, char *shstrtab) { static void printelfsymboltable(void) { size_t i, symcount = 0; - Elf64_Sym *symtab = - GetElfSymbolTable(elf, st->st_size, SHT_SYMTAB, &symcount); + Elf64_Sym *symtab = GetElfSymbols(elf, st->st_size, SHT_SYMTAB, &symcount); if (!symtab) return; char *strtab = GetElfStringTable(elf, st->st_size, ".strtab"); char *shstrtab = GetElfSectionNameStringTable(elf, st->st_size); @@ -290,8 +290,7 @@ static void printelfsymboltable(void) { static void printelfdynsymboltable(void) { size_t i, symcount = 0; - Elf64_Sym *symtab = - GetElfSymbolTable(elf, st->st_size, SHT_DYNSYM, &symcount); + Elf64_Sym *symtab = GetElfSymbols(elf, st->st_size, SHT_DYNSYM, &symcount); if (!symtab) return; char *strtab = GetElfStringTable(elf, st->st_size, ".dynstr"); char *shstrtab = GetElfSectionNameStringTable(elf, st->st_size);