From 1b084654b53b5c99e6f7893890ff0d82d875f692 Mon Sep 17 00:00:00 2001 From: James Chang Date: Wed, 20 May 2026 20:17:31 -0700 Subject: [PATCH 1/6] Add dual-stack mDNS and Samba link handling Inventory IPv4 and IPv6 links for Samba and mDNS, keeping Samba bind tokens explicit while preserving IPv4 link-local support. Add UDP6 mDNS participation with per-link ff02::fb joins, scoped IPv6 sends, and link-valid A/AAAA advertising. Update watchdog, doctor probes, tests, manifests, and rebuilt NetBSD mdns/nbns artifacts. --- bin/mdns-netbsd4be/mdns-advertiser | Bin 224576 -> 238928 bytes bin/mdns-netbsd4le/mdns-advertiser | Bin 225800 -> 240240 bytes bin/mdns/mdns-advertiser | Bin 285328 -> 299564 bytes bin/nbns-netbsd4be/nbns-advertiser | Bin 155016 -> 137728 bytes bin/nbns-netbsd4le/nbns-advertiser | Bin 155780 -> 138492 bytes bin/nbns/nbns-advertiser | Bin 211376 -> 196700 bytes build/auto-ip-common.inc | 674 +++++++ build/mdns-advertiser.c | 1731 +++++++++++++++-- .../assets/artifact-manifest.json | 12 +- .../boot/samba4/common.d/45-network-bind.sh | 104 +- .../samba4/common.d/50-runtime-staging.sh | 4 +- .../boot/samba4/common.d/60-advertisers.sh | 12 +- .../boot/samba4/common.d/70-smbd-service.sh | 166 +- .../boot/samba4/common.d/80-watchdog.sh | 34 +- .../assets/boot/samba4/start-samba.sh | 6 +- src/timecapsulesmb/deploy/planner.py | 4 +- src/timecapsulesmb/device/probe.py | 92 +- tests/test_checks.py | 8 +- tests/test_cli.py | 2 +- tests/test_cli_flows.py | 2 +- tests/test_deploy_modules.py | 417 +++- tests/test_probe.py | 4 +- tests/test_storage_runtime.py | 190 +- 23 files changed, 3112 insertions(+), 350 deletions(-) diff --git a/bin/mdns-netbsd4be/mdns-advertiser b/bin/mdns-netbsd4be/mdns-advertiser index ec62a4645d60b065b563707a533fa01791d8129d..8075c258ff64ffeea5228eb5a2cb0e4fa39c1a28 100755 GIT binary patch delta 57233 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

=oGiInufEAxG~zz}i>1cl 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 z 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 delta 43539 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

L}OJjwH8HvfZq;B;K%$jJ=+G%%Dv7M>~p8KT##Q zR4ns`d{sx{U5fin?)6?4nNwGpp`^cI5K_!2oSe^=%e0K*>+=&tAngb)w8QV28&#{; zW&8-qpE^3)rWIsaj=NmQY`Enkmvw@Qo-%+K})||SpF>)h@q_Y+T zQNzUAHK9c50Bcz>DBoCmA2xVwtgdZUW2Bn8=jP*0jqJR|Jh)jPA{tc1d-=mmI3Ur- z4Q#G_{qIsy4z2XXvI#OL>Fk|ZG3UU|Y5%y>E8#}- z#=GYYBb}RK@)@7YSXF3DYqIYl-@)nq4V*s$ck&&vZ{j!^h-VDQV!&+f^&J_&vMGP) zNOW>j09P@*#5%}g2Qvp)cQUdQ#`_r-pA!dGMh-(gCFF}-Os5s2W1c*^@X~1B zz1DjPP7&@^)T=-Livj)_pkIocP}L~?B)0Ucdx3^4B-3RLt!EJClP~7r zYP_L(f-lPOm@1D8vzIZF;;ek*2)o^)I;Dk-3|foYXr4DZ_R8qIILcn`Mz}YH5+KLs zYc;=lh!`3M1{B$q17q;skvf>iz=);GHl0YOD zSKeXVjH@L9YS}6{Gm4!fjSs(*Vpp9R=za?O$C<{$jGmZ70 zU>ffLN5J7!b{KPeb#j_csuS{!*>o}=6jJdzu7?I$0Hs@8}okqh@Wn{&T@Y}mJl;~;c2rWRNm8-)E zzOA9Zu;y$4II)A!(t+uQuxVR#a7fsrBxjl~lm_(@IW#0J5>_>XMA-n?>&FZE2fO-- z+&&h`l|$|ljz2n%4)C*h%Y0I1%P07I$*Kv5y8jDNOPrNFc?i zxD_Q`t<<+AaV+j-I3p;htOgq25mBx6e+tP<8>NlZ$0$fPm1#p?bU#QxcTTp<@$#h66;AbK9{A-h>Zs!--iE;j91O88t?{A0-FtFF4re7*#=P(Pn*_@+-j2tp) z@J35;#y;I6b;_v2qBp8qb%dP5thum{b3;TnZ-lI?idPbNL?UKcXYc|ukVqkM?bDR^+Ks&FHNnZZeV_-Xo*kH~6la~{M`@!I?^ zAjMaOmG)qCB)pMJ{9;JC_gLN=cruY3?~5-Q>#UJgfYX=di0LkG}b|sIoSH%{7JsiO8xl!xtr;elV@Gh*+X;|-((O!t(A7|v^!(qQ1Zkm zn$zpcC9M8-Pf(3#sBnw|nK%DRC5ftrCbFy)fyK)Z0|szc+>?~eg!q@g(m%$h;;8W% zU^w%cX^M%!Rx~0iTRKC)dioXQjI$x7B*pWtX$+GX@b4t9HV*70uvT_KzA=NwW<7ag7JSYnIeuv&n(7UP(Tf025IN3 zZKmJ7+l-ejk~un)IoWh53n%CwK2zYgzamxi4mtR|O2&y!9VSo2=VXPHiTKEsrRp#m z5I)+s&3HSv&FEl^$9QTAp}I!4@%eoLztj0GZh}~_CM4@>G)6-T?!{cniJ=WVgQ>9- zL+d@2e&aW}9F_rZ@xu1tOG+@IQAsgoYKo(D6df>0Z?^o21aOzb38K=qbod`~>Ia(q z!$v+wfqeiLHSXai!i+^Rgqp;=_dZ}c3Y+*Hs%SH$uDF`5ef^nc1JU_c*%CVZG6W3z z;OwT59RuA;yb!zk?0##BAQbo_hYfN%5=WrrWGwX7%8Dy=X`2zEOahxkU%Ey>O<8UK zAW7+dnKBz^E|24-@4v>pKObEpF#Q&0Kj38sBN8gK_Dwf26r^M{dqJ$YIEI)|BZgRp zF$lyq_Clot>gKztNb|W_&>5B(5ZjBF>>hFW3qtR+{o~eP|#&W?P3Vd4x`$zqBIizYsaG{4h~I@yy-tLT*g=&nUA&*%}Z?PVu)H?R0+QY&HiR z@Kk_88ks+(Q3ZLo@-E*Nw?U2jIq@aS#Q2utqjW4t-*0ui3E4Rt0hozWppB2iw>#$Zl5+|J{^gG2}uQ!MC%)4Ec?_%ECBp=JOiL=0OB8UF7&5!_zXoHv#IZS(&6TxyiOIBPrTI`Ucl5zu6I+V4ju!8kyc|7(Y zaHTB49SkogqAnB@>f(#}yG~{k^=9O()WUuu0faZn3G9z7EQMgwGc#z>7_E`eP)LM*n7=rl)}lwyJE~@MS`y zGnw-ZASa{x1!1a!V)6=s=9haO#T6hGAVg>}(nyV@+Jc9;E%UGE^}{ zXil`ukD4`pY%|qrJB3wrXi9!x)ldOYVF5VC25h5P!CE0PuF{%yA=x1;Jn~(N?f(-9 zKsh`4-=~})7^j{fDb%Z$gVL+P_E<-3RE=0N`Bc>5_&cNgKm^h1cwdqjl1-t;zD_Kl z`8D>9dq7S`lgNis?7r3$y7#rLnZMPPm)^h_$Y0z#peY-Va_mGV1~79#bxQXW z+xgN)J74Td-yCXjryKbV4)K$tnZwtHznR0D(kFj0LVx(RG5&k(O1GSYo59o|UPWAn zzSd&-lGl;I+yi*IKQIHZtZVo(4Bm~0g$d*QtCWK?mivi^;h22e)Q-ck1x|a}+q?$R z*a}hcH60>`eMWB$weabj`DLsT_*7>UXVc+qXYZA`qg;C&4i#6@kpTDbyNur=hjMex zM3VeL7t#@S=Su9?$`3{D7f0s-X9Z{X1ev>;=M-S}4tMPyJQStez`@k*7-qh>%t49X-i!imRN4V5PlGSF=8H_$7SI&SOl#eR|wPQL53s1xZ z(oUUs?cAdS`tDJA#x_$;gVBSdl{k5hY*~`0V#h$}$ z{(ng=L@OS%I@(D`brv!~v|(u}%;nQo@`aGeXL}qq(wQQiHJF`wc|V`(3F*wUEOFhF zPL8qjECmNJBypcNw>Hz*H$UdRTp_0zEFYnY-zTCms)#1F_RTYz#xiNa5BbXCkxUS4 z_7NJ2`v~ain1&GpHAWh5VihoS18sX@-kB$HWla0)oR|#NiMOd%IV1)XW?u zx*#3DoWWHZ5R|3L=}2s};$A%iAkm$JlnZh%(And#=tRMHP3%Rmt6l1bVkWj43tNMQ zT>yoD6XDi@jOH_}iEOuuPxcCr2M$H&s%fD zB&;-lbnZKI!-Ta;_b+}Hn;RVG=7v7!nHyB266(pe?LIa(WfxU;NM&dAB=4IW`9eA8 z>B|;#rk+&IpAk#Gj*aR4ywsBF$jGYYB=&XuCavW6QPM{M$-bVwV$w=dGbuzmO)%e(xi#BsG%v@=~58A8FB5{@5n;@E=ft)J}Rgf%^bF z=(-xZ|4s|240GT z$prBdP+Z?!z_A&2!OU4z|NU#3{zt8e^ZOHOK41TfA2{!entXRcz3)2{DxH}V>NISw zOqh;uCrop`^deBRuVt#iIh1+R!&BzXmGvABk;zhYQ5>}_wn1gWY+!SE&H#Yc`XZwN zDsxsLJIXRwWk1iVo2S@XoA+T>tPLTVEXv52ziK0k-rnA7Qv;!VU`rojB4yiErmThL zfs{<2`RyK=pZtvC+xbbW`tJPHfTFa6o+yg!5Q^2lWEwUmoNp?KL^VZ0LMjms6eMb% zCBp9{+;)QPWU1MNz0*SGd)!Ih{m}=O~jdyCQef#yH6$SZ*XnYyi zt|ubf=XrcQcdnsA8F4@TnVoCHo5$vx1}qhaHbL3WamPm`P;B10Nc2{Rl6-#%iFUPw zQgH=>2d?->&$CnbSZsXFDKokl&X-v%2@+5KqsP@kxdIE~{_oia%f^9(<69*BV9_Tc zNTjk0ELQYiMMC3T`QJGd>}8jCIQyYrn1>)*4IkT4vf#z4ba}~NL^&RCR~5gP^1HS$ z-{@iVt+1ok{-bKOKu~ zICx@*x(-o(i25H7vkpw?e=f|_%l_ijeQ&nA#@<0(bT5BYjnwRr8}x`JkOtnN7riw! zV=%>%B}I~b!5#XNx5i{-d@uX#3jMLSN;0(XWq-2bz=v-w;4cHO&?mm#U)#PyU+{KG z#*P&PwFPEE4CdMu`i{4^Yqze@i{9CgQAz1kZt9DXlpe>g&|i3GcE(sMTc&l%&R=n$ z;J8E8*59a?{3Vic;Px1vEZoiFw%hfBcgr(^@oZl#d-Lu3ZSPLY*ci{YYX9VR{g2eX zGoEeLzTtK~}zdotf5p6H_p=;NB&6rRgU9v1rlI zu6qz52A1F^z=8B?fWEq4EDTh}mB~|5{U-g(Xr8ujwch{4#G$+CLN49KFU&Ela6nGJ zO0>hX-n{&+uh#EAQ84>$fX5ey-1~G0kGFFJNTiy;XP3Nh<=qX&QQigAJtn9Jj07+9 zgy&u}-(F-_p2^a?P7Kw)Dbh2H675&_=u?b|uHAB-$m@%+72-Gpk!FG0X`Yp<^_|8B z?b@H}1s{&d%Oy8k?(VzaFqY$+kE3=r(kR_FPtuovIIcX2DvyJ~e8HFt-N&GvM&1#g z3eVwGO`$WPZ5y}yr0GLEr{AMTKD=4GdXhf7qol|!#DtA<%TnCd9|7^1EW1f_8AFrM zpVR{FJ0{K!PEeJ55rluNiU~-y8vOJd>-R$Pzp{Q~_`^lK|CM(|S&Q?!mWhL1c!VmA zG8gSmuF}VJPRTd}2Ih@@EM#U{L*&o*=o>mqv_Jn;|83_)TSbMcUsOIoPy1+N+Ox<{ z{4>dWm*|guRFt?C6gL;?Z+&z;b^avifW_rhyi0ffJzGE4wc{^Wp z9)ynk6GTr@_g_ipA0+#`Qn0rw_B>tr?Yrc~^LsZ=w(9oIi~shV2gwt?@|@pq>$gT4 z@92ymV09cvU_bANNyn_l?^@4OJWFS($_!F1NsuU|v(u!by*iB}&`zFc>9Z4Kaxfq5 z)!iR^T?%WC?8{W;&~#PVGgVc}u8389Wa5FlKVGi(*YCzq((sGS*vDY@<4^eJ>e{Do z^{?qwB(V=E>Ni*aRP`F)Dy z28Vx^swk5rb^lpfN%{HG_v-uqDS+=){7${5|D|(jd%n&k@4IlzzMt{0y*EuiFz)kt zTL0p^aI$SV#%VZ$`(XN~AI;Gp{^B<6P=%iMw*^|hPrvbR3x>W6D^HQKWLkxYo=Ca#^aWpisC|9sfr+Q*soJhf_3dAmxa6-Z?IxvS zR9?pB9U>hjB^Mny{`EXf`=VSgIWtoWm+N<*8K=Ebe&DGy8&$2oT%UM$rdB&r-*~oU z=G^j_^c5j}9&D*dWR;cIm%L0XZ@QHi!IPFR4yCfm*1v>fx=(8*~ z*(E{-$v?xGvc~jtXRh^jn*-eBW+8;2I-Mb?JXRF#TFjrG=(UR%|&uOYl zYrP|ITvN;Qen7Qkn#muX`&%ES`#&sn1mxnI0%L6I>WqoK>PQzOZw$O(Q^#mM^?@&K z>Wz*}%J<5xeZvD!+Nm_}xsR2Rx~d7`>No-ZY;v*ii!Y4W_e51njDigm&rv2Qa6 zCdV?%lVdH-n!mR)k0`?PmhhQs< zQ`d^XA5+w!TJDO#Cn@Sef9>_yp&S0^w3j;HPybt+f3bYJ3HV>EtQ@qEtzJqPpq`H~ zFx@BBa;$0Q(`kLxg{t=c6;I!srk2>WU2_9F)76b(9*(x(N#O4j-OO`ic*2R3G^V}>riHfEt0@mz`NfaYXi6SQ~PV1uMKSIr{=AuNG)G*90c^R~Pi3w7_g_awk6eIW>VN`m2kz zyA}r=1Jo&+b9P|%0Ck*ZTM*bVKwaRvj2WyCDNc3alyI!;s=${6)RNi9<#;tzV}?7& z?Y~}hzqvIb2iK+S_}QN0LWxTlmCT{zdCJHy=2_2kEKeEX=tY6$+2A|W6WEchPIR0c z4MoZCzbNp2HumZH`oK5Y;JWq7z`_eL8~!T;J1$h$YKyN7xLj(Ue<^>NLX@s|I&_}A z-sS%v{vM#5AA!KDAg4{O4}9W64Du|Z3_08L1fSFDs`l`WSLJrOOY9n39~hH^?HN5f zaCZ)EMvM;Z%z+s>qXVz!s51*r;d8&emUZ$nZg7xNNlw!6bwmg$y9Y++LYO~R2ky>= zV8<2&cI49j?FE5XbFr@vR|i}J)z#YOs=&^Hs;hkakCg5LESLE7-OMSIOZkm>T`+E4 zWW5MWJ*wOg3|AAI=v}sYLEw{t>do5R1%ZWm^mAoZ;3s+XTUH%-Dh~$E{88YoJoVMI zg?t5H#I_EV>a#HLRKB`VdvktZq8m|vZGK>Zn>nEC%D@IUbHaaJ8F0Ny<+aMq2j z&l?(8I7oH5_H#Yu8PZb9^x-IbJVD(FFUryk$LN(9j zzDrfSq%$jVO?bY|Q{LToJ^g;6TBK^97X}DN;)^=G-bG&4QAtRMs(tw+6~bsuNwEcoXd&yRx4ZY$Fc&KAy4^ zx?xdZ`$#(IdsE=Kk?OpHnYW0MX*4dsU_HlzI8O6DcpugU#uTe1u4dr%Z6~0~XG55t zqw*~#kGIVjzbtTfG1Sg-1)eO1Q}@&bUN2U+I`-cz2C>b!sxENzD0O1d^g6ij4MzFI z4O6&Xal80b8)+HKwR>-gE$e>B@5WmKua8on(5}Aa>D47_mzt5>2&+gTlCmDMH3shX zs7tf~HwWJL$ON1d7&n>$J$`dw$!K+__J4~zAE2m?JdeNbHx4**WR4Kgk?1UfAqg5{ z2qAu`!nlrzK-8(k|ql`{q{*W+ByCM-+1lx4Uq z>k-a1gm~`k7Ak9qA$y$bx>oMKzxksRE{VCSt=cI*{JMYr>tFZl?)P55e)HzN7bU)W z5JRXdN*ETi-|<(i;;Y4MueJ_dXD*fdA3_>sI`J@D$^V=$bjcXUXZ}v)CS&aUv{YBsB5lC7QUb%l938Xi^i3-&ekfD?m!8w6#c6 z+`iY$QM$bGIMZ|9Tq?uU*-VwUm5K#R&}wbZ%KRnR2vkTOe}+Xc*W?>a>3{vNhU>3c zILgLIrLC_!fLS$20`XuRx@bt}KI}U`#$W)!t<>j_lU+dH30*5_0;PcRra{I71)SS| z%Qldw-{p7EgTyRkI11SeD*VReg!Ggl9x@aRw=ty?8~~&@`=tr;hQQ?j=mBk@4#a}7 zy+}h>(|`&5LJz$fS@vbJu#lw+?x<+MI0mg7wBq_;3~~~Tf-~SCUSQM-c@mhgCk;am zfG*Gu4wT9W6Fb6Yx|d_70@?r>n&7y=Du-6Eozr-!RjzrFb*tJ!Xc3wF5=+)b_#!yg z^)ZFAA6zci6|ucM`IZ6?MCxg=jTV?2E>vK*9`0odGt$|d4xZ5CB(Tn_7mLl<+1$(J zb~D4OrQ0L-SlAj>7m6}xfds3(Udm2rbcu+hfkLb3uEg=bz$&g*vd!9d6DDoTlLunbFDusg- z$N@+N8&5BmK4+3UYgjG|Z$yHr61N5++vbQXwd_qgc<3o9U+Ml3<+QMzVYAXq9g3obpD^e5m$f4j`NWLaio(a&m9=}pU-MvptE|zg)cGU$Bnoh4HPgw zPkzb>IhFsYi}r3Szz<4^I0Fhoh8lu7F&8 zhV{>tUBKF;IalRG@201q$JibZsyBY&-n24VAlw3XCG&;IF72c4G*; zgDQ~i-*N@A{{y^2AhE(zk0UXCN5U+BHI09&H;(-X2c{fc3*rnhfv~a}r(H-7=zvay z-Nn+pC+k&%qP$Kq&$?yXR?SvIBrMn&Ox35!*j&x$N5_k z_5Z+?LXZiDccII6$t_QyX1YvNKM!PWmb$0-QuXP9*SJD-yn*%s#=Trg07XlxO5WKq z^yJU_3wOouJoV(CH~z$QXU2a#dCP%sm1B5|+>^oAMeu^n@_H`6%(SDZ&sdJUoX6KN ztp}0O9Jwr?f5^EfM;cc1Q>unc#H?a&m)S+!IE}-ib{+4X5in16aD#@-b8C5TIPcpc zXKv$vVEq0zsoTNNGwmSOTsq?Al_p*mqC1GgZyy?PJVz9_@SzBbkD~FfU zcXKS8pLm%vwPYvOl)g z0a>6BIK4>zYkpkA53Cg@KH+6tzfHu9@C6Y)7$_QACRJX)K;N%ukCgc%IHqemX%yWn zYd_^WRa?;vcdcUkd7jLn>^;w8G+Ju?ff9M~cYF^nun}>u6`M!7A=QnhR2E|e!3e(( zF7a^X^-JVCpr_wv_v#b3;_Gnq&BCqTvXOsil<%bjS=j}?l4S1%zSuA43jIYMc{7p` z9I5k1c3%uK_XJx+UJA;a>5r_r#MgL_)4?s^$q}b7;UtBn&}C!%5I3I}SI2k^PhBMp zzvox)D0W!QFIyC)*nyXZ7um#7n)rZO!9i!_eXAKV*Q`^6XDO9 zYLkpso73W0S5#sVKmQYV$_v-|dm*A+RSgKIeI2c#>C!+iX=ewh~LF#pc9pR4(~%{v$5* zA!@X+N2v)RjvAZOT4@o>L)5!PSCpDAOQ)#`OpIRPdYKTS#c`_MYH-slSoacCtEc2K+APk>qUv&T zvaX`&1>*DH+)g@I9I5z9Vt25LOP(Hx?x-rZ+Fmvm)i|pbTJ3=X zr}(9!t8GR0>e4Ew(Z2<$x5;BPTg^rr>?@0$C8frSs*<7#<5O0LsmkFrTFq!dt8?S( z$Ba(LMyh}fn;9rw_f3VBlvwOei}`k?IxN^&v#-Hqa)kPsIwND*sz5HWHdI|W-&j*k zMbf_ti?O<@q}<}fCRPR+?wzB~6TPA8j75H9OI=9?vem+VO17`%6Ly2TI>g_aR9cLf zH%E<#o|XMtT@6oBxiO=V#p*J-yof>VX3uN)l}cK)``ut0=v@Nv(%(j zm1bLYpk-6hPDRCNPVbKBuwane&|Aed&Z#B9UrmK?Xp~i1ZRq(8K}Fm@TTSIwyC|Bi z&XXgv)iqpXM5_(@#0M8Yl=N`&BPov-6_=PT>%_Ha_2G9C?pE1+49*8Ih##mfRq&@Q zEWvMUzD!@H!@0!&kq73gE&Ta$tXNKfNpKC^01B4MG$0g&0X>KWvp_U3f>;m_5~TD&U-PS60FK^t(Fi|!b8#P#hCaQ=ebAQ%Q7Fb=K(1*>EK--?DIPb4sc zct9JLSb+yIQV>Z8nIIb!fKuQDb)X*5>N%~Zw<27G1{=1a0zgv*haeGTf&$?fnYlykC)vM4TqhadB=VO++M7f-$#YG@@GNBPD`FGL##h7$$$?iyY9?gLPO+b4 z!%lIXOaYp>@ByplbR>+DS-WSW#2xrB1tvM!57plO;i}3q8Xou z&hjtT(xR>AE)AJHD9k2RA4NZRIn|N(adXMd|XU;|3%aE3V<9JMc-!rA@|*9DE<~!xid6 zVSh%|xEe2F)d;i!H^AglF3 z^uMDv^Q?anx$WxQ=`_4DPH-hsFq3+xXlYl&ba~L_K{vTt93q>nR_wNs7&<;14{WBJ zFx*Vgh5B@%hoQ@ZF7K8uk#vR772e952c6aoojFpJ9adwsG|by0#U2XN5bwKJbRSk1 vOzXQ>RkY&5VRb$~wOr_qs0*~GmgDDK=ZfSbYRs%-I7sjGHG%hkpgsN<_0!d$ diff --git a/bin/mdns/mdns-advertiser b/bin/mdns/mdns-advertiser index 5d0e23f6d67205a3e0c7053f959a2eccdde5befc..31372623da5bcba3d295e3c02647ef22667482bd 100755 GIT binary patch delta 77414 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 Sx$D2qJI;%(%csnc;{G3~(knXv delta 63537 zcmb@v4_uVR_CNm2?1Hc&u84>$E-M-uBCcpigotEjsI)4Yk|81?8X1{?iCk2~f1t>N z40=^oGyi2?6B9BsGq0JM*UZeyZ2$NOg4fKtqJJTqs` zoH=vm%$YOuEW5V`l)cxk%)qtd*MxCk7K7bzrQavG0EbXbWo1s5fL}sucHr2P2KxeEB(7xD=K3}JvXejN`}SCh34i) zL$1`+?R|L>AI&wn@_9Zk>X)~rrqM4+P3?^qhh!{O<{7IMHHb=Di-Q|14wZ4Wb)TDZ z;6XV}rBB}Be$}9%b3MJJo?tW(5Df4Gei zRY@7C@=?{UpzBU@c@D{Bv5k`?P5eNqX*PINhw<6#WQq!qAIlNT_-(4qt;bpYgR4sU@T8D-c%am6@ z+Qh0AEpU3GO2*?-6IGpA2a-thkd_iI4P|1X(vk+@-CPBHYFg`QdZ9w~GEwgvCQ-)sVy7R^(HGqI5jdAR6Zq|^FkOF2Qe=i7}z`&#-@0g)lIR<&psF0d+ zk-r!D&m(^~^7kS?2l>;GPxZ&5E-^P4X?3$-bE8MJ|9VOG_l@Flb#j7lP)aWp6R(dV z9g05sK{b04D~3YlEs)B=5T_neOBE3qFN_%tc|0HykP8?Or~>Q&)D?>b)jUY9^Y!C9 z*U86y6Qb6U*d(hX1jBvTL*gEHViB8>s-s`q~SMr^IICspGdE02dX}TQKc22<8LTWn3IxA|-y=U7N+HVQ@aN8)pW1f5+$zRH4 zy*8aME|(W*gA(2-mzoZO%U15Dhros;E>%nY0R;e4TL#Y6QXYU~-Y^5isjXHvqt2~p z`K-2>PnjyGwbS$Gr^@;5BKWq_nr-b?an4KSn7}CA@-5 zi`U2t0@L}068TbKIG>kY?C>eLgEo z4(bxYKUyItAsIbip3!9$|7}Xm{Vvgrx5|>EL*w|JDe{caFkUgGraV-`l1P|7%hXaJ zpc#@Lf^-BRXMneK6z|>fT!Eft;Qa#9NzlLDNU6u9cNdn+mkgu%C(GsNu3-TOmy;5k z9B1z}YYyCNZalDB&h9#tw^}XlK~lb4zTGvPFIz6_!=m}+OnG!zB_F$7ZVX$*`!APg zbW7l;Gvz(qQn+@xd>?PSGUbHsas20Hay}CKGWkIFB%W0&-|ZgGKV2q=J#wB;o>Fu7 z5zhFM$@2a1E&O0f&6Xb7j9;4~YaZRle=d~|KN_a*4YT6~W@%ov9HM&H5Z!+?j-M@+ z<08uWM_vUx8YCkbMDmeP0W1*q7 zqL}3s(K_Wsatg~A`F-~lX848?;PPux-()_xd+&@Y;4U#0rry?aLUqnj7 zF~wX{-hUk9HLuH!kLh{bE3zg=&zHU~N5o9`H=*~$fK+I)tuBQ`dNUK`k9aPZ}*!U8@g31*ZNf}M6MM?HQ`k`C0-Yh>L%Cxd$UHtOxpCaoF5;@ zrF{87d^rDchI}bLnZKJaM+{8jXJO?A9?(1TTpT=$#ezor7~D_K6=PgoS4OkIMO$7)+Elzj-pPdpz)N<7ygC7ur;C7$;e$SH%4Cf_&GL!JLWp1hX89Ivs5%U|9wz%^N)ibQ~vtcF)Y4i$Zu|L3q0#bTGVZB{>hBG<_i&W zT4J_a0GAjq8ya8AmXP`wsvM<&Bhk{hHl zOe_m@9UhFNwK{wk$mK(h^I> zr*3kU50U#6_-kC`R)O4#hsaSekt=$LTy$?&XBRv~E*i3%?;>{{jsBOYDVgsg;)Q{ZN<3<*R@>mm*7Y|szY}v9hq_Ke9R&cnGrUF8jG>w`8hwEj4 z-2ItyBl6zfwJRbA=`4T=kO9a86atC>+FtT^FO>7BXXP2`5q$6)^7{0s%*S9`;~^c` zGDqOEQqy_xOx{TcSVfxr{W0kyfpZ!8w1=Sy)g5^~kVoEl6$ozt%!~AvtVr(wB3EJ` z12}=_kd<=8q$u^RXm3eas#u_$Hz^iktl2eb6XzpV%E_5gJn(fnKQo0(uh*Q+Okuog zk*v!Kl`l;Vir8*(8SoA;;AFU22e7sod5I>w z7Hhf@t4)8n#y*>6eU6^LYLOFibOFoAE5OF|pJ1G7Wm{^d=WJ8)^@TM7xs{yXGS}>y zvBk^#5STx;QXV}kftx4Ql+Us={`Gu$&YWm|Vt&o8IV-%vZU7@^s3gq;EPEby4Db6e zK1sfkb8OJFaRqw)?^q2a<2mOBls2b%keqX;p0lyxc7a@8FqFd=`>sIme*+%#HCg~b zZ2wBx`;9%^Yo2`IjTnA!rF{L3Fdq7X9Izmq?|7vqZUGkL+!Q(4oD_6qqSU0tf?S3n zBxjII()yHFgbhBH3!^_t>^)73mI zzvku=or=cBfB9kFYktk?<)<01ohNTv8Ap4b?^fz`o9AJ1%*2k!03)7JsEi2ctTaHV zf0-xymjrn~GMuznjwngzHwMTnO0IC*Yc(@V!S=@2r&P^Zc2zzpUf0 z!Ml)k`doMy>LY(q;-P0S_}J1>>T+3MoLQ48V;+I6ITfok)H&)DMCHGB2EX*GykKo6 z51%93*XHwWuhyhjf@gWQ995Oz?Gmj#vnq`LI$N%+3J++43r*6RhdEC|2a~6(=J1iT z<)P~mQr;&A8`B~9x8^2lo(3!!16DIzY9#D7M_?_m0}e@q(|}zt;p|48O%LI3cjC)u z*Cp{zv*n=m5!~l-Ica^2+UId^N#46YP%c|Po&?mmKAVb0|78=`&z5igB|In))?U3G0@I zzhw?zlqwfnQuH%YrKV2MA=)KCeOJ&PCJ&B2gMp5DMZReX4;ud(yc@T%B+>kgu^#i9 z9JM(rw(~1eoy>4Gs?xhCsA3`Bh~zbX`jmWN z^A_GFRZiRToo2F|ma$Y$cyngJIq1Zp7JKhsX39t3+%kIk%Ww&a5+>A0m@A_JrV6HM zG4ek~{u`+FfMKhHl+(venYQFZ0mHyiET8~@V8Vf|Q7}v*;qQny+}mm(Td#i$6X0d} z(py2gM?jdOB=`DxOIuN)0^o9ZYW%lt>yUh4BsPCo2S|t%mkTJN4TimZIOhtbf zmAYK1u>h)c=squayk_)=b5!Pg1Er<{2%PrrH1~shp$AA$0L}q=q9?PE&I4@y0?P%` z0zl+uwPZzF1SkP415^OY0961BU<072Of5~#&d&bg)TvYV@UF&tAfP*-f0??iGz<^p z0U3a-GI`v`;k;^^yx`+}K7X2g_v7{8RIWT4&3_y$pFA27)RaUv)8hCA(%w*x_E2p^ zFIn?R3Xe*V(>{p{|0m)GOv-b>(CZE$&XNITMX*SDA0ec8D1nqHEA4XRgP(+lbwqfS zh|x0L4}u^ekN~LDTR|92^J8&Ahd>1@X(Le$f}JKE->_UBeJm_ab_OZN*+xi9lzC;< z&VSfwf^QX(ne~TtbEcjarA343|^xqN~kDn_0e;OSzDBCrH#5j%MF);3-Hw5%N zw0@o@PybXG-Z;&rVn$du(vd584+dwRh37fQ0uAl@G>U&cP5$oFF#f|b`TnPRer%eo zKcSC01bpgAH9Vv<#ehqtozMPS?&Qklr8&z7REn$QI7sBJnX^~uCXC;MaH>AWv4rFKh> zyysK`FUygypVIN599i?lbUq_Tp7X_w@X^3g1BYhnvAfMp+npl9!T>daQb-fQN@Sd@ zIUNy@fJQExXh|RIKx{+TCPyB6dMF<wgr%DOYRbp_Bnn%*X<*lxxAoJa2% zi|k@K;>!sB(o}iemkYQfTR#6~SU?gA5uR}z;?>G!<1yu#sWqCjm5g`HlDB*XpRrgz z`&AtOaf$4IESq<+YxGNhzUH@@$E)o&(dPln6Xkjz$Q%lzwzphC3inI41O(<5Vv zob+{=?m27%Aqq^7rAo;t&-7Sg&&`$>e7!G#RF`znH7l0bpU9Sz&L8#n%nBOf$hew- zZ#107RR3*q(5o-H45n2ovM1kaZrY19_eFWZw>o|^OJ4u2o;PO62fvLV{43vP^Vk>V zl<$u6Rxio{->2w*$$Frl4bV1<3&C~Okj`Gqk{5grUocDF^nDo5$*MW}eG2y`R)TxU zL6=fA-=i`a+VB_U8JD8?p;_{#OSL6nfYrHgvpIszp{un;=&=l<0fl2#s3LuhCP4=ndWEgQnwGyJORw&5W)(WZLK>R7g zHP>lWJoCM3jePpYnSA{sImtRx^E9sfgG_WXb9Fa2_#5F18;G`xh!iXwNB@ zXmE+XW?-;e87#I$L^j^iS{#L$a;77U&&{kUb|7xrB~!kBSr_d?E3_C5y5GkA1#vO96DQipUNIVDID zSwLrt>@iLOkc!~+1p;^nDl(s%ajHm#Q$=}nJrS16CZdRlW0{7QKi+ki|t zqA`YlH&M=POyGMn~+1TGOQwSSLynk89( z=zvfLKnz_b%Sr!;*8B@2b(L1EdzK8@Eu8>(Ea`LMMI{xL4R2Lh+$YI@K- zi=N5kTJ%b=%nZtqqpydh#AHaF`(v?EV+F$YZUqIa`l1y-q@IPZcLq5}t_9{{QhPz_ z5#W=N?&c&Ju6u}NOH%FKqo~rx3f4r@vhO&*X;Re z6XT6(a>~y^QJ1m#AAwlnFvJqqqkDrPoG>h=6bh4YJ_zk}@KF}WK9t2xlFNTi<~=6K zmwsNwTcyb}ZcY!%*$C4O@WjNLAxgNb*Kf`U_Jx+9=QXB~!mYhBzB* z1L?)IM>I3HU51bFX1aX+m$0}^sCf}JtDu#zNKT6-C0ZR6;*(qEA!tYO6>6c**+Nb7 ztMP0po`EDnSiqg-#x+DeB@J%<{~6k2+&s3F_JhC$Y$`YCu+kxupm{yyJK;X>D5^w&x8&# z&x{o*!A#EwjukV4SuyW!61Rg{rvC^N6cWTJu)Y3yk==>edENNhWE~6O{CQJtdI-DC zd2dtgxKOr_>0XM(m>A0xpH_4X`<22AmO9>x8Lqq-TN~Du6{|***FEGec3ptUh=a@n za~r^3v$?UtzgpR$ zuU4v}s+Fw?)ymyrwOeA?E;T>XTckVzkso`yHvb7Wn(n6aXj>C zk)O!Id55QKw-=OwfCcZ@s3%A%f?o=JY_wCJWyJ~aIH^`BAx7C5d420?nw^CT zS$zge>NMS$k#|s+=*NN{MG^k)qH%i^J1wjx)}K#!THGCtKBOjzxKR-Oh$N9l>5wFm zK8EQ<)hMP7kNp#Fi96zwxOH(UPLIMM--@mUb(|Gjhq@?#KbWMU=U)vL36y?5m?%d@ zeKhz#MPS^55UjiF|4CdYEEAX?wO}8^5ERQCDsHBt$%%u7ZY0 zj*3SM8y^yK4qC|h(-shK4HFGxoehZFV=?%)r^M}Xpm#CRHJ--jm=8afDB_+&H%=vr zwC7k<+>ylp?8a6!QskD+|2&elN1r1(z5J9*PC2etDkq?kj6|WCfJVkAx@0xtPa3(1 zMmGFuPiP?ikd@dofu-?~r^KE#ri-1LYj0+d#rUMRh{|N!_|U%Md?whRZWR7gpo39; zMGVsDwLM%E)~h5P1qM@kKj35{w)J!yU?g#ZR!86-N|aHon!<)Ac!Og#IQBAHY(1zv z58M}8Y@Ryv`XDdEVvG0_dYz3TAPZ)6QV)@k#lnNUUG$y3Cmv|GW9lLDvskqMEzt2n zJHBWqp@%q_g`v3JM_kHcy5yfwM$#dv_II~;CGr9PBqfsCHz+e^6x*9Kym2b!qQx>k zz3izQ(nBP@$fC?&w5aRp$0?$Vz7LD5R^Fj!wAE(pU_0eSBF}@jA7vhS(B6xcS#0;i zNd_kSzYs>CGTwKIoz9Nw8o;kqhLPKakt?tuzU94M{PZH55H$_LutPP7NCg=35MAqH z#3>|Nx9JwdqCR3yHcLyI-?H%xG@fU%C4tTdZaOcwpfjTd9Z#g^`930GDjUk5=p)jm zVtH8|F6K;S2YCB_A}WVvCcV(l)e&3))nwr0h0!~Ftb6dU;6y9WM^pR&u`#5Q$z;Ec z{2buXUWt6Lk^RKk9IT_&{Y2U{md}%*%a2nghpNJM|)0tk^kLp8U#i&Dq zLLVt=?dTmX%BQpNfaPeHltZ#$U{SuYpEx<4#RSboewhL7p^PKH4378Fz9Q%)c91_F zCCw7~Z$^Z4FE{|Za+j|09(H_E$<>94S4 zJ>4iEvqb*YR;1Ve)!gj5p>ShR)tln%D=f;tH|qI<2aVBUEAB4*^Vlx_rcoTsWBQ;k zp)&?4!>+-8!_(fqzT$cw3}Km3c)tn*65UrMyvh;+X40fJxh5Flp6e@Cy$U?NQEYpa zjf>ucK1_rh#zPJa8_{i#{%7CcqJCn0Q=>zb;z$uSlO_8vM4qQ#Uvv}2Guirp-eex3 zZxa!8pz(OAuZVt)UE!bi5xQ9{oll7p`Lkf;?na5Q*=z+5=_B^chCb)V*WRAZ!We(m zSgV`Mf>=N$Tv_rx_Ch*40C1s`=CR6%_{U+46TOrG{~~+vm0Bv#<4Wz5B9h}eP zQNKA*@cArCQw1-Tc7p9=McjO}bSGXcn$MDXRWEURK8p@WL_H$~lt6>(O&TZy@>xRA z4b;0Z#swF#d+9%)OBeD)c0SD7yn$i`aCi=!ynL3Vp&Mgc;TeKv(CcvXk9MgoM#{`D z4#4gjouEC!6KKG*N0@~ClgPh@j#&YQt#HZ!ZI0k5%zdSk)QVxaIEIcT;&xdVsGXtE z?uDzBSW;JzNucv?x_CM-XJdmdR%-m-Uuq&6bXcJ_T54Z=gRNmayuI)?Vi#oA&wSemah#E$qO+mZv@otT1W-IP7n!;p*oEd#2iX5PN?0pn4RZ*Xgg6{%*G`b zfyt}zmA}LZ>si1xyr%-DX;sn*qjsfa4G=2V8Fz;YL6~uDU1g`E&`UrI8>GU(id~SAm~3{vvucMEOy$C|?Z~d3S&~u$oQR|0Nh|c@&0NDzxL^SBXp_ zW1H%bEJYnw4-g4un9M^lYCF;KxowBrX+#Z}XeDjM%rX|O&;Kv=XABTW%U}f4f<^cm z^r>?{k-i3MIk>IZv<8dAPi@4(H7qQs2ei#|!9pstI>x|ggbffk*PuVa!6K?0DtoV^ z*i;VrHFgwN%F(|cVuZI0THpAKp)#Av5BiIPGOOej{$g|m#$imfSU~9lf3d5A>2!0^ z2T3YYz5#6tiG2bCVEw(h@t;28QU#0R86AcHS{5GnJn(utWl*Gi4_rTJG09poR4A!# z8WeYM9uHyMaFt@$v87zfdP~e$i}9KgBetw%Q31~(j6w@bPiX&*ziw=p*SFTb7P8QE z@xjizzjMG-s#vnmVJKu9&DuN->cd4thbn8Vcoj^OqSGWaX6=*@w0kbi9%76BB6J{LSCuxA~j5T8NKM70&ykv?ys*z7SHK%)td=;&wuuw!{2Y9joE&yQhbemZc+b&+% z%z6YQM`8X0olH5I@k@P00ouZsVoeh9_05`YCce2}z*MB4q zzs=^bKH{<6Y&Z)M3wN^todQtZgzA^U(J*ji1xJ^`k)QZ-H|wXvCnZf!qL>bER-)K~ z;tCZ17Af@auwor?e8Jsf5z<_Dt7Y57;dd~{e>2tE-@zQL* zB3ki;6Q2b>Hs~{IFe8uk7prP81CSndr?=f{#C}(Px;rg*r^nstU3VJwo(nJ2omRTj zlkZ`M-svaqzK7o2>nFkwuqf{+qtsY8L8KjE;l5^4d}*zcCzc;zo!cy;RUY0WPNFnr z;@tzRee|}^5f;b7uTES7KN8Vj*s-ywMN!5&81yR4<#T^Uk+xd-&ef~i2UxWC;S|I= z^F&lF3kz^M&ajQRbg9uo^~|4(%vu)3mWVaAY)r({@UdtY>4V{VnS5h}Kj}(_6|3)| z$==dE2<{pna=Y-a!^C)AJYL6sWZguk_gN2q@U%#JAN~MgQjKd2B4!gs|haW;3pNL;Sgdv?T zIvr*`BK86qXEKeu$hUPf;;D2IM729$ik#gR(+^|lO=8_)_9VYCLR>n`5~7z@G&jL) zIzERg(3dSAf@hkgiKs??kMnaF$d|&)I3{WuvO}bN1aBZ`M{V{;>;U7x^$_}xSy0d~ z*i6%qYskL{Fzgf&M`4F|i8KO_7F2_#l~1;bqbDK1&UNBC@c5o>BIt9L z#wx|DpR+Oi+gfq_b2ubxo)Iyp*ikk~{C0}`Q1%MTB zZ>PGov=I-tKqPU8*!Kk-Cy4O+7ucmDjXupzQhNV1L{`_g78jRxF&Ox(XJB`X!$iQB zY+S&EVPvte1%SgsUvORODe}K$s{#&plbWtzNP2>aV8E@7LU$G(?-nubEVS*+(_+(E zg!aS4sIS=Ttc&>KE4H2g(oM`c$Fe(oi^_?Gl?q+JGHNRoa&08>^EnpkPtzg;^p*i~ z_SNdYrug}-u-cgySUO`TYQOxJ%~hF~eZ!^8-~V?gyTGM~;eV_1e=Hy1B>aCwmKxm5 zR$ZvQ{{uU>%_Rl!%C0OX&Y6c`eKTA3k@K{+t1kW@n4olG-2aY`coRB9>fXeb|)R z_pY#NFV>@W>^0U$)sJ@jLF4K-{Z(}|p1w!$e2aij0h;k0!eIK=-~@1x4mwo_%Xn5@ zTl*91tzwI7m78q4H}Cm=?W*5!Ji^A;+U~MnRP3HS>cjT64fk1*noSljtN3;{Ky*;^ zdj5Oo+WTrArQ-Ln)cWx2K_OZAe2k0|F6;YYYeEJIQSfMAK2GIdgj-GbutXliSCNMf z)mHj({5y3>toP^XL9v|>*@3C4GPYL!jy*a>Q2rh({M+);x;ng9AryHKDSb11qp7(m z5G~!BQk&nFPsc7UOI*?NWDu*3ZpU}2kWqUnkY8~=91rGqy}VDMQJ@{y^Xt^+fl$7H z(ij6jPuTulIbx-#pB%<7IUgdryB{>+ywXW%%cDHTpS>o&9l%5Rgtx`r0X&AiAo|Ag zj_f({Oe}xWpAPyB;7kqoSL!d;$MR%m6iO`bqwC&QYV@2_AKe36`3Guk)Z;*7Gi&F^ z@$Y$?K!2&}5_(DAWjir>AYbkOk2X@%Uy(&?d}AANe;^O*V?&NflF*S+aOjj$j>J5UvUQJTRZegp4_VA2DrXgf!6;kwe&TXdsX-fd zHe&;YOBV)Og%&Hc(utko^hmB_pNXp@dAER}AVEQmuR%tOMQia+p-0anzNvCKr>P+Pme%4h8LE|3Fn104ere;e{+k)MeC zD=IO46ps$t0a|5FdRT9eHUMI)#J*8{JwLWpq>Sb(*b4FOXx^DE7Qc?>p#kkG=>m$$ zF&3BW^YGPI*-jBYhU?AeMyjNSKY?R^lJ_uP$^QZ8;W`h!50d`>F(7yYqHi7Kg}1?+9{+%lh@cl?*KhjIUp?|r1Yhlo}^^xl%tyouuQ6rSAY{`uynOPC9% zAZ8M)M;6kzkSBmXH6hoVYwj@F2dM#`jRVVmhD6Kba=(Pv_w=_g;N)`GY)qY`JVVy21m+j*2Wa zeG2eXSKJqMFJ!ccl||I1y~J<&guNT;TAL_kFnSeOua;r0dK>SwM!gd%X3XMx?;p;R zvsha`i;rgBWQYA`ipJS|m71P~X$}t&_#nZLnAlqR;lk|t6IAli-*NQUETk( z(9h>VdctdoL*+iwV(0Hw0B7`kzQB8`9vgr>aeh8eP`~u|<|b#y{Ga%@W<^pyPvU3# zi{gA<$ya6x{pvwALfte5F0cXTrGmqvwLqt>|j{wgT3iW5~Wh|$pmzAmm3n~ny=;K4~c!NIWA$W6X#d+ zq57&DE{$}K8ODp2XTwFb27on>E8_>v1*=q2MVSk7TReO6JZU1zu9dp*W+4q+?Rr)t zJ%_UY4Lo!nO3i;X?kNa%H{yB!Z)rox1Lj-e1+RRNU-Vz;@=%2f=pp5u zaQAqJJIz9R4Gi2t+ThNM1dS>@hqPc|hg+&ut7_BB`C)HXC%UYIm-24y~WWoq#0O%%F1JXjkcKEb;NcRI$@O%d8IHdFw9f8Zl%#A#g=XMb1 zH}dTEu|Hr92h0PI1<3h9EuP)PKj!T^h=6LI7C;EWZUhukeuqx@SXfRQ^l*K+KzAIRJ8T5OPJx{r{I!W z{AD+PggsUJ@oqkVw?>9Ug?^XRwW`1J-&tFFdmQ6oL`vvw-{pOSDzpzwZ5y|#&C-f- z?_!$XYAf>JGf24}Fr}y(XmHKCYsZk6W%g=P6u-~0;dtbel=(&kp zWS=a$*6~5?Z85oy_XyHAl9z_#3IxP_5Spfs!!G|MHr4T{M?NcRZoLD0k^Z`^~8H+2&~*YS=zy01*@I(-Xp4Ljt=Ft6yV6vG-3_C6nK?!O3O zlDS;!k1hNDNbZbB-uSWi)eFhhO7^!So!=Ry|9~`crPc4uNc*t}Y`!emvO6Jggm7 z(=1)J(xFX}y)~Y5@!SQ^K6uW;vmVc0c;=cS`*^&EpwA5NVW>;bmpfN0zrWwylnCbX zo&W3Q zIEe-V>6RNQ3D)t_&fPw0Zkp`p>iJ&eopV=wSiI1geYo82WV8f$C;tb$PHl?z;VjdM zmjk>bZal9)q-0LBz3yMMkH*YPD%^)#l1}7AAiw8EZYfg2gJSN(aJ@IkV5yNk(gOa@ z{{bJ$>%?yh{H1REhK|+BM#48kfgWyPJ{Y0~x}(DD?h1!cVaQ{ zYMZog{Z1r!M_L*IcwO8eHq$#ODDq){W>?5;r1F0C%kd@c7_h;lc_q2Rcmo8x;OaJlnO7#Y!_`aPyyxp#G&h5L@V z$M76*Tf1>#6LieYG&-=$msQr^s%>t15k@XLGRb~ObJRA--G&AA%)eV*hT!3fm;1x0 zK#VHmN~_9mv7L+)e(TUF&RkUd$z9KB(cBG^McaMMRnPCpN-Jw!V#h3Tlz#wI?XKG& zb*=8Y`2N=X2e(*|cjaA%jh3)aw63(S?!C%6j{Wf!c{Xf2{XSn`EZPO$FiiNlpj(Jz za*M_BTx%Comyvh!e_)EFP(xC{ViX-R*j}gk*yal>+ZFTA*`wX4{DHf2F^SMbiZ|A_ z7)*Jg@>W##tP>?Y%dx^OQUcJU?8mWLJAy?f?n(RB6N?peqA~j_^3Vz1m}1}HvkGem z^3X6dAP=kH?w$+rNvx|bH=`nPQsJ{0i_H@IR2&3le})C=6Xzb|mT9d?2ilf5IZ*dFOiUyzM)1gKC4I9Ukedh*&LZy=b9w5HhA z8MvW`c2!HvDdMM(c?WZ72T&LfV^Oc@K+ph@Bm(DWcR6m!>FT*e-{U!Y zwy!oTI7D_<#HTqr+_G#e!7nwbjOXg9JJ38`2sAPhkwca7j5Dt_@}$1!oZTfR)F@Y( zfNxrB$GY7f6Wu9yr_9IWr+V;C>$ztfH^i1>tuI$-eTO1W#0N_j6*HzFVHKYVi1!&j=;^}lBMOT53 zBI)-@i9THx@Gy^QppndOLe#K_5GpwbaVz{*@-$GUo27!o2&SUlOg({A4W?vb3N%z$ z@TmbZb3})=cD++w%+zW*h<7>Q7w+MBgsY5}my8wscIw|^`!gF1fB~`W8 zhIZ9nIxs|WhUdR%ZfYimw3aoHnhe70FXH3l0?;TBKYz-5v3Eq56TG9j47st$HR8bk z4s@~Jhh#U#fh9pR2q|Q^J{LH_!0`jlAR~UY4tPHRj~OpI2N%Xy$K#9ODNM9&!gDOS05bCE&_zgxqJV&C*W1;3H*eO?yfD8JS-Aj;0Hs zH()#<2QUY)5U>)k84wF~`d2o75C_li0X_kI184x;1+7l6;h-XCBQdc_~HDoI_;YN;IWTL4D^tMPscGGXYxwYr((&it?jv7n?V98NzKY0Hq z-p#=+GJZiu=|B*}hjY}kpYYzlMLBG$F0sWsH8`Thy94jHS~U10-lZ1h-{ZX{1K%(# z+RIuXd_@&t4lf{OFBRFnF(uoPoMXSSLEjOiEkN zDQ6aiDr7EIg_d?_s2ravZ-D7k6%+-i@+_FYX%26Tr5(&Kp3UiwdzqmfyfB7RzfdJB z0OFAPN$Inm-T4=~>X{W_cQU_{F zm0)YBQpZD;6QD!il(d3W-=bw1E1sFgc_YN#zh9^lX`m(XtaDZQ8Hy-PL4#Pcy)#x? z=XDEp{@7s!VhIC%hueMIB-*L04Ed{(XXyVxu?kyBn%#>-mGA=WyP@Sig)T+*(c)7g zNJ=uA>epw9PB9-C-YN@ge z40Em7;-D`K$Tj`P$CzI5eGY;%KWSYt`1He~r%->329l5x?H?~l zv=be&8`n_pQPlBBsq4mtc6HfuyT@@`@=A)`OooIE3@L_$3rnQIm>4>`u#^ioHqR?m z$sOxr%F9^h)Q!Dpa2Xi5_XviA>SMNW!%FLPTpg$SJMf{<4)iwUIQ1C8o+B%*UIw{7 z7PKOR&{5-tdT&S#Lu3BKzfBAeRd&P2od~31K)MerHX?=yxZE7t9gN3&0m^HP6}AlE z&{(#E!J_fxkyzHTwBJCzdCqz+e-GwagDFST4Y3(AZl%f*(5OQF5QBM}xdSFq&nV3*7M2`YmOQj9N%-*4jwj+884v&Hfk9G4n?DN1#0&wZ-E2y%lbhBmEcB3uusj z@MsKTXom>j2<0z7^16(jC89%M3_r>s4n?^?rx1ZX1R$+yh zZm`YWq_p;u#nPTxEUF~jrrQz+&Bo0+s_^lqC+!*#_ee>@me>2D_p^GIDC002Jae6f za8}PviWhW71)8mC$&D(q?*~)kgF_W8GWbR#&GCAaxrm==73!4}9O{MN@6#~Dk;}}o z!cO zIfTZjVK3+l?Rb(Q5gI1(V>5oAS!&dqoy#pO5;D8=F0#*0D6-eOiL?a~ABcGi#C!w9 zR_bY;$5hfTw1XR`qPBvh*0;iR#bz(iH&p2w;=&05PAF~WAPHaKtO1S+II+N?(_^CZ zB^Ef?f0JV_#MB*yk&i>s;K8W!zN|OmS(gGZ@Ig_wSzNjie%-E12Ij=Uh2 zbTDvk8Y*BsNyAA@RuK4C1C)k#BO9n^V;sXUOwQfNO4s`kyi??Fby{w{T zTx+t&p_9f4*CKWWG-KmJl~|oQ)EO&fyNm7UopTDQ@`~%HV*?4rvQeml7L9DYbH8Fc zeaYwz&VR!V8u~q-M?jQTH406rP(BfOZQ6hq9F{~hMq~aqw4Qc2P`VXc(P+EUVmleI z-8xK7v+;zL%qKNOCU*n~3|@O2JAHgxdJ@NcsDQ1JO(h+#4}b+D=2$_Ib2c=%eFfT| z-2gEXX&HLH56bEfX>K4XbcQnmqxBB*G|(k2bjjxl3@H{W8b&i|Jt+^9UUP2r!hw7a z6=PA6eipSF6%$dRrEdUnw+r);I-7_PEFTTaQZGq^NV0Qr>g*#mE%tJSFUS@1wje5z zvq~9+c8sk>OQ4Pat zCmGMzYtT51ib^sbZ*>ubNpD781Rlm*1<8=zXy_HHOvjirgu zYczc!8W{iYJ^d&0q`u!ki^n)_;W@FN>-lFq_cwM{Xy17q>9I zFs5#WlcdGg)XQWvT%R$L62_oMuo2hnTYQiC;jv2)pwzPb4{ZChu|a1rJhHWTp%rL1J~-RD+EGb@~ji96q+%#;*k|Qj~U}}&1aohwDgmI9=B^vI=NlN&Jd*+BsLM!^SE85{)6p9qR?B|1TRQv z=WLffn1tVy&%pRQMV#R#{q}NvK1^Wp0KB4??92 zr%8Fn+Kzik5grF|aoZI8HE{m0_`T>ZPAD7_!%FMmXDQTXa(IR=FSZOrRHj6r0g@yQ z#ao7x^&GJ~T2)D(Vo_I(4y-@eY<7yW3-!QAJs9J_@35>G=!|hLcKY_J{@}jNVtd#0 z!A{RsGAxHDROnPv6~s*9K7w9SeKJz?8}O>YMOKvyhgs4^KoAt@MXu_x%-0KyYc=Ni_J zZZE*-N3i%MP6xF^0&q;FSQAQ>3;xy01%0*RGsFPf z4&U#ENlWZcqag;(q%bG_g7hIEVQM+GeAM(pJC854d*>E|kxFIM8}Mc^T*260y)HUk zCPWwwq?VXQ)t>5miCdI1}TLc3v4_PO*!as#kQJ#HYnYk!CsTY+6G<2yz?l| zR(PBZ1JMw6ua~=kF!fq%Y1a)JeZl?Cz$^_xcW=1jiTJb`pBUjI6df^F2YRJoOkK9N z-WNE7i75;T4aZiWHBP3?kGi>vCa&Bb?N*<1=SG6&>j)4*5KEK&3@RoMv2Pt#p=3Fk zN_Av_37ADEQ$K?E2Q=m|I_dvFAVFGnRg&;+G;1IQZ+DWS-T{QZAUbQ0PYltNY!_tmG-Q#nBnu7q#foym-sed_HyvnOo8@ZSejn{5u+gNYhhx+}hQd;yNft z*3cB0V8i&b5R(O+phYFsh7E(J5Ovqi>T0FB6QK`Omn9YjAj+&$87z)-opB)$w*+RR zBd3tkDrruJMh`;|Ge)>Hybc9VA&<^E;6*sX$H7QoXgp^gQ@|uV8Joq;TpuuSWV29? zjH*zas}^EAA#f}zu|uLIwm%{wIiN}Ib05&9;h~0M$!r-~>|}_`ZQ$_6dT?Zcmtn&1 zXOyk99_dRx9cx>mmf~7g>d{eZaxw!Vw60IU!MmTkHyzPHXHr5aa(eG1DB&Wf68;tY zxI=N(3MsKi-=rfjOvz?w^ob&joyD;YNPC;A6*~J;N&XGKAT%)w6)fgk6bHJHkUCn}T*%pPw{XX!|ha`#!w;&`lND;|Lc zdo+}Og@m}LIGw8p%5WAZz~enh;S>jy$)>V?i9@{RgCT_P3w=q%ULHQcZXf)L z7fj_vRumL^SD5*?~(>*ju7cjO4FH%mCmb-iW39O%Ih1&Z# zer*fHoi@F%T%X=$u-z!FxvEO6uu7)4?7oSqR*mUz*1J$%KzESsA)L#?hg<*{r#R3k?#wvm5e#g-jUaL^7&ycf%QSLWRQMHPEzn zHcU#*u~^(dMMIH^&=f;a{g4UO%6{Y-JGmyamuaPy;wH`|37w%up{gg^LFY8EI?g|1 z0~h58GYe>y$uSB<)%aOOiebX?YiL!Wo&+9|6;&dh5roxR@r-%oe`J(ZvKGM19fm}t zMt^HptDmH|Nmgv^trldZJ18JSxb)lJ^vAgHL58js=+Gc*aT^Ig*X)#t9-5_52ctK* zrbJxcrk$RJZpy4x)(>xP+GqS4l}eRv-Ju!%7ui&?`27b+tQ%54>Y;@qe!z#w$)Z@a zSW$Z5fao=-_h4&b`)d#8OGaT4R5Ojy9TyH9#z;Qs;b9TT5}Vx5BBa zq@K58P#Htvw2ycvwLR03n8o;lS?Z0i!MWG9<>7uVN%C{_l;&w&O>>hK^__JewylX@ z+Qt3mgB3B=W@i|gkSKOFae#|kiVzV4yYa3*0=EJUd3Fng+tnGg!A~cnk%B7^jKL!8 z7>)(uC(3d79o7ne2n7r{S131qk_6FCb<d~(LL>X>Bp5x;z0a?wriyyM%4(%# z*cxS-SGBSv+2yj_S>ke8@P`KeIAJFTfQ&x5Ll?ooceH2DbGt4r+?rotB8gE0=s7)? zXC62S<{hX=YvR@p4_uc=pcqx|_b<^P_52n-b@43L`1;G~y4=CZ?+aj1T~_6EUD^?I zP&yLxRv!fF-OMGTjT$#|y~%^Q3LMzntv;K~$|*N@MIhD{v*8ajhk#wMley83Krlm! zMt;>hXka9C^wf2(%-%@m|nNhMb^K!@y$ z@0vwc8X~5}_zzt7jJ>3xP>~8@<=$RsUsC;yU4{g<2D%zuF@p!+`ty;;a%tP4w8ey5}w~Mia zIlhBCbFm+OKJowS?0w*)Dz1kAyL)d!c1h?00YVazB?Jf|z=9DYMhqA+3erWQMvOE- z(4YY#M2(iZ0Ro~8G-z~C5u(MXXj2=73M!9{mbU1F8f$8)MVo9`iAa^URM8~t?|bgv zO_n@;-skte`^n_qIWu!+=FFKhXU_b&M2LCw(US+WEyWBj*6B*I+9RKbRTaJ!V%|U& z9&MN}y(Z_-gv1#bVTH_%3~OcS;G%nnNiUbVNwfN7$|*(|neTjmc&OxI5iD~ZR-T+kpE`wAl$ii_1p;SNytnlC^-E{!Q{V*R@ z9-)^&UE04>;)PY@N)(DH)=12RUDzyTBoo9knhDt|kL(JBMzz||s79^j2Bq+*HW_}9 zc7~(h5$1b<>8uM1NX_~BQg0KP+9VS14Mx8+Q)LhmEp%ZAN_OHgE>HO4_%z5nn-57Y z2qhLhThtgC#r89}x00yAM*A_K3)vgf80oaS-a%cOE?OI64$U?Oc)K~ks~7&p68MY3 zpgFw%JVHs3*<>xET-RLfh-;^OmCGDW#XRa>f3kcQQz>A_2ZzcdWidz7JTw(3D55`q zbZ9hXpR8%@c{LdP_$;s*(n)y?H!PC3)n`&eYFr005$QWTD3BmAsf53mf6&zgu`KLG zxkF>hpE-#j6n>UM%0c+nYh*xdWi-BUKumx*G9a3Tgg|16sD@w9xS0h0@Gf}anz{b7 zWGqUa+y^2I+L*zIENQB%VbX`8jx2r8W64|={@>-9z`A|xX4G1qjjYjk;a2nhA#On> zoP?`mX?@^&;JCxM&lytFHn1C=?{SXa#1S+f|9*sX0-U;$gX!!nxQgc?65h!31kZ!G z<58L>>+!b&o3n}$gZQ#>;4EpU@%)<1Ca^7I2jQ!DK7%{Udw7R~x5m((#`$rb;43Fg zD&pI-4Z{RL*-5Y&;7WE7+>eu;39{SZC%ntfgSUAmSepedUdI**oa{7^Z4-NVk6}!Z zoeBRX@9Zv^h`SdjyAEVC!J`yZHkW)t!G)3y;71Pm%;8st_IgjMsfY;4rJZCL-UBSx zof?RtX9-;RA}ou9XELl2Rx~o{Vb8wQCmv+lEiy^dRxy>@8tBwg182aMLRXhga=wDN zm--lJu#JdtikV7AHVi?QaC*m_8Z~rm1?m30)Iew|RrC1}ctHv>-4631jVr~j%5x3R z@ZeTU;YB5+)tp{%77tFv|Kqk7#U2mCiVas7Tk|zD5ugC|Y6MLib`;-3AeAi-Vr7z%_3-G_fL_;nvgNMSKnK$+ z$xv*u=9Gy%W&fH__E|KN`J3D3`@>SRamFrGId%;&Lpg!zQjodQpbm&X08u>a>2CZ2 zms%YKmOLaCwNIG^zm9_E;zz2s4{)OzP@&(U;!Ap$O9cYf+RTGY+|dPZHn*jTHBpqD z1v56Arj0Byal0Ej7CgMgAANeGf9tM1e+^syqHDMKcXqB1V8lDMlR}8dmQ@H-$eD9{ zZwEJ!IvXPjG=TygjwnzK6?m2c-7fnU7fjmVmu0U6RPpe@R*m$-K;QmztDU5Y?6I@i zX|OS{F5%I@s*m~@P1;k|+eC%8Q<$oRU4h&FP524IqvAGTWNv6*Ea7j%dp^@FA_#T{ z*ngGiAc8IVAxxev?M&4Eb?1U$|LiBS_q+YnX3PK=?{{$`|$SHU4TC%bta84K7}nuq{vpLOD1d);Swt zGFkLXra87xOKXc^!9OM*=JIT4b8&@$$*i)ZLB`VNvN(7`PYq-cN7}ytQYVu}_dL${ zw6MbqRkH+#k&66xKYnr^5w9SU7hvRCi>%KKr=5GpfFoR>g3-_BsWlBtrn=5{hXoOZ z-AQ3(mUaoF=T7iRZ_r)!C$F)Xj_Ed6bFq7l$~vU|g@L5cf8S!Bb3|xh_dzR#GAR8> z3T7j68_4u#S@0?Dh%ITb{qCEfQ>@LBR&Y45RNRg-qp_1|EUQ!}z`+V(V*JIafy-$= z$Gh|V$-}_m-g(jhr)&tFcF<$id6txNrV1NkmnOw$d?tB8aT%=D)ONaSd9BY zzi8Wb`~`%S0y`taYza%>6tsccwXeV&zJ}}f!%ZkuvAHpSyVnQm#zJM9^N|@@ZN42K z2r)%%+t(O?mqSWT7I`sW+vB%k?pojWthw>0q2s*)vjXf$X?q60OkCf)WEP6gLxJ1A zgI6qudi1{0ZQ=bqKj#p&^p0?^67%?quAtM#J`5+;FSf4w661%nafgin&D5Z_D|7;1 zRvLF&iP_<4?#FPso(#+~MY5MwNoLOWt)0Dmfo@PV4$3fYh>!`75iS(nXA!w#2TrDo z-wb{U4_mI92AY?zc{>(Ss(K1iPeFE3kSHPzX$pSP@L6i$F20ED#2>zEPL-Xv7p09v z)o9>o^Gcj~sSBr(mkV2QBr${0{dBhSpXW?h!NqD$kmnx`suzOxNBGS3V>9&`bADG7 zx_&=vSH#st9CD7~Xi&U1*Z&}v6M5PZv9i@I9@Q%b#bgEV;X7p7Djs`7-yD5*S+thJ zR@O5@s?kgcF@qHsI-i~@-%6U30roRN}h7( zKl$1HzgLcEeW5dalzYmX>g5=HW=iUt%nxaAWPQ7kov$shrc!~FYPiU=S1nG|hsXV% z%beiub{9sEI`wLlKHj%u7V{s9*sLwosm4&Wk5e_k1V!~=^S&gr3JWQsz$$=!AZSQ4 z--49@<8ZSHyT*cfftlG6?`jK{2kb2?-s}*}*X{v`QQAy=xfRh3jElBRSdImA0o!N6 zF0x=6Fcfby-ee1Q#>LSW3zlWU+JJE@g&A+W1#1DeJ2)o+(6HmhXR;_xabcxIFv0?ad+TW;_kv#;_k!!2)7=$3HK0gD{edPF`SA`(u)_}DtYH2?kL|PvmAx( zZ23-q&j?{7k0MM~jrp>T85U1i`+4Qz2 z^{GR@-riKMraAR-_O4&4MNU02@w0r131R{p$JP7jAl^_*4-BO4N1s=_ z2I^crU!>j|sL!ycJ+97^k3F_rWyS)pyI;+Z)u*LQ{B!UN80gd%PslK$S8q7!q<*rO zu2_9~!RQC%8aC~e&}k^~2e8&B3ayN^iGPHdu4h!V@GMxYUKP zp?*)<)16Nd_}7)8>ClZU)PK12$#z?h`pBhEvjvo6us&wU@ow^^+~(|?rd|DsnmJfc zvAwHqC3wtc368kC;5v$L-j%>p_L$#wkD)&No_Qs&T#SMDuq_UwQ`WYP7 zoo`moWbGFUiJDDR8NB1HO8=Mo_6B{5Z}f37>D?uBg^TQLm($Ypz=PM#^>6wG3M+yv zw&7Yd-MRkm_7rSYH?*_gE7P8dfAo-my<&M=DqE!2i0KG2*SSM$8*hQL4mjG^RA6JI zw~9ph=oqz;Jf;nWO&3b9yUzI&A}$4iB$kYfv_V{|#YIK#R%S%kOWR%K^03v?HPj#P z*}!(mC9a>4xQ+uK1Ncf3Bhhz6zLfS5}mmyJ(-ihWh?&qPJCkzRhV888B z<8IRDWY!RGLtN3=4;+74qc&GzG zEO88|p?f#AZG@jC%lo>_YZ}`J_NduK`nIu>tx#9=+ziQg2M_f}R z(!=WUXnk}ouN*KkmxA*ME4N^xehN!SufN@b!3rkK4Q#1;W`sUs=_V>5XK3W;%v(6= zBBBjNX0z$a|DH{?1&hq)hZZa{n|rQQtCIEMgB}9+(sD!lnCEAu$~j7(ZO`mh^G6}y ztDjf*i+_5zdSjHnX4>0kagogk0&!vC_YbRlBJ^yul}QFKTWWjMqMO0<(;l_?W<6!d z3#2!zZl#T1u4bk(z6=bi#i{yy`^#PG#Z-Mx;w`@j)vJy%Ol!E^C6tynf9-WO$gL+% zTUr(hA4qEnycKqhf-j0KIQ2B)%@+K|GPTIfIJNR4^?;ZVqqrddLddIC_JG_crTryxFa~>`yjqu>>&#BDO`ZW8u@2bV4smsuh z)dQoE#esL#i=(Og@Q>8Tgb$KKHBH?${9Jt| z{%>AWiDRJ0Q(fwgG5X>~8|f1ZZr$XUGAA$_fgUdi9glMH3Uxgt)^AiyQ!n^EFo`E) z>aszUk#5~>es`{|V?vyZRvVS;%3Ub z6({DopYVJK_Xh6$%(pK)IX|M#_GH5UEir2$LZ7UiLa?`)X`J<6+XO@6^}h^=o}g5woHV3V~!h-l_jU{^6Gc{#W4t48Kg_ zqBtER!o-h%*q|D7gK9edPw|WLp_R0u8T8HE65K55lAo02ZnPBXkQJfni9Z<)M9W(s z8=2IvGxTBhEw8GNGSHN!ey4^^pm1fcsv9ThDdYaNJjljj_J3HF4Bs0hNP{3hcTu!9 z_ICB;1U+;5Jct!7+qFWi`J}YWw-ivmmfZ8L2=$N_H8`cABi)Vgq19TKtM4Z0iO$P! z4;6Iz?J6ZxPaHQZFT@paw$qju(rlah1QN23f#OxQI8z^eJ(%M5Q-MetR;C@;$2lI8ndE{`np?C`%tc`(Mv7 z7~6sg~+m09`~zNt`KluNmyYO=he49RR&6d_TF?z5=5gjHl<4%ypE z&|NATSTT^BxLBQVv*~W?#Wy(^0KE-<+g(aJ(R^4zD$ARku zj{wl>LVTSI>0J8O&IH!kWE_#TdRaD)f(7K(cFDvbgYa}3EB&c-DKwuoo>>-R4R4wH zC=1qH@U=>uq^Hd;1;0!;MH7|uF*fdpILF2!Sq~4pPC;IOF8OLHMuV}L+lye{W|AjSE zb}SoM#k7)Y^Yr!^6Gnb~L<~j2nMd4z5LYG+V)A9`?38*-ITHwbhA^|w=CvXC`uc30 zRo6FpPFP_K&=#%W_{IvgYO;QP%E^C`s5-RhB$9j}eM<i^ z0<+uh)WcNNY-O+PS!rnht&Bh=ApxmDtV5EHhLws&Q?|XNonckh@R~C#(T-W%HEmZa z$)m^l=DuZ|>QV>f@x`n%*=X;VXj1gK3R2GS*-@#-7_X}Lx9qJ7a>`{JB zedN(IZOfExsy@OuQp&1@E@PLTE7$QzcWJhve2F%N@UvAjTc8~F5)M#srkp9JQ;yS1 zmk|@Si`$EvZ96b+(w%59lxu-I<)~3?^AO5g%mZd3}2tgbNqK|&?P)aeW#|&bLe+!u{<5$ zsm(lXLG_DE^o#5-Emi(Y&|98fs;1@ed}yiKkfYydU%OO&EYDkkU&{09rRrgMP9?rP zla{I(Gk8WVRgcK?t0n5x3?|z8*P$wf+_&UHT_r3I=9a5}T&B+${<+x})@chl+Tr5h((l#mTz$^CpE0Cy{KvFdiGCvO zGWpq%jv{`MrJ2vF7m4fp*{31VV~BoH4R>n|9p#w=17(Q=1LvPX`E%F#xqseY39Mqq zz(A@e#%}}1kTHk~_R&^dJ20@0FiH0h;#X!S5iiMH+|fNBwAFAR^I4Qc5g~5U#h@&% zrhHZJB*}3mpMTx8Nqn|$eOvc6dcZ~`L`26=XOh6ngpoqzfIOCMnef(7w;}Nc%Y6=YhDX zq_%yufeeeUZhzUmvptu%O|IJZw0PpCuWuj2Q_o)Co-u4UD@+^OUh>p3n%&S&_jE@4 zVp(6|8hRm%j1bRpM{5kV{R=~@$OSB}Y{=#7U}P?zEPf8nM~2*}qK0-U_*kB-CZ4i2 zV{dzBVBop;IOEQ9!n@3co9FqRxGnfgAa^YVujXANZYj^7LQ!8e0kM!M#xsk9PdnR7 z#ZN|qZQ7I36wVn@xSGr)mN2gL@3#uKK?-+AQo!lmOyO>5e?Zi-EZIgmn^mU`ZCjl1 z0nIsx3B!cTS&2GIp-3OYVT>3G7NcFs5mT2O0bpDtQY;&VWK;G&_x5%#?V3gt*l7YG zyO4Wd$$Hv+bDL0tn~ffB8^gXFYW1>bd;2`%he<7)49yLONXM5U_f-foCzTN@H(|o* z`e%r`gIHg4N-ZZ~k%(-DSZW|Oz2Bq!cZ)KebJ0~4I|x(Uz+Q6X;TZI zBZ6{ae79NnUIL$eAU0(mNTpPQ^w-~okh~z7fy6TF$P(P*s z;vbMT*I#B8QsVQ;1G8X{Q82+L@kIpKW2^m1bXVU`sKsc=bR7sCWa^A4&{I}sn+c0T zf2u(ppO=^v5Nbtx*82-!!023%LMf@CfvLjg+Q?oWZdoIf?e7J@C}3}poc7p9&yX6Y z71E@Io7#ne$&2k%lvubpOa&?RK5uP%la=}HWG?bR7$??!rC-P!*;JDGV2iB9QVEM{ zkyLn4sKCa;LZ~qKa_)@tKG-hJ8F#CX1Mn6}MBDsRL&yaF15==&aqbI#QH#bJbeEXg z=q->;66&#`bgL;O2XwgfdtrwxvPcahDLB`v#B{=>NhR!pCiPLEr-Hnz#~ceo3B?-&>;1#f_zts;bM zn7g>(#S~VR=Yv-`KQ<4^q1lLf$46*nCsD?C!C>dVg2Bl=Pw_mBJBIrRw?HgOJnOLt z6~?RCS78u1{jR$ID*gT$=UJPRx$HPth4GdIre{ZAu z*BngV(e8%!7y9%kCnqxGaOo+@W(fipTC2;h*2np7OA5H^K*bzu0AW&8Nh{jr`&=O_ z(gf}Lg?dnjx10YHCD9K>Bp8Gu9(pbOxFA3f+_Daf&P$BbiZ2yeo+#^WG@*D|GbNBvaAJX_}4=rWuAaq!Dr0`STh*=9I({UJ=`c zIz3U3Q3tQqV-u^XPrO@NC(Ud%siOfs-aW5Ag;Nvhx@PuFv&}_XVO8k`AD&k!1}61wgN0GhtI2r#lQWidaVHaR;`YS*{0j3rNRSVQvWempW*xc ze}xt#!XnUC9kTs}ZA@YwKpk$k!X;fJ;kIhz))xaj8ZS>cg{E~flP zEI5n#nhs{lLu=x^=C8;?XlI^&b0G^U&NZl-4HY6A zB7IVG}q4;9O=V0j;R@Cjy)q+_|?XIiJ6T1YI#!D{)Qx&FMofq}(eO3l3O z@MEHw?xePNqm!0UOEPU2_A3VIm&h8^WQh6Uk7PCpa!Y)zB4nK^6Gb`?{G|UWB21_x z)+yO{Jwsv?KAbO@9U|yGCrlEkFiIc zSKoafQ^G}Rw3kl#v|8Y0qfU5HxENCEFpA_JCZ|#IRGttE&Sd&<9h)Sl3g`d8K9xe9VXu zg-aMtusuzq$}w~bv9#vfwtg-X+0&3sjC%%|l|$|o)LyG#-vEsCyjeIQ-NFtIwKx%( zrl!$M{26bB3METT`>UlH*!@VnH2hK!Db$x=`=oK73Yaryx|V23;fyNDc)pAcWVB8Y zR0slUR?#q&$!jl?Pq3j#jq==PjXGp(w0pR1go+5>SZ(X)V$92pz?~y}AXJ^|*U z!fhE|{g-w;Nt?=MayMPz2A;`0pIW6RFJl2K@jbP48ERA}_iz|gK;=}c(`ICF2q$HPyOdRLlR%@1H1*;3ZBI=k#Qr zC%Z>=vnaJE_vffLZo`Im>$mDNo^fNWqM(Z;7ORoB>l5vFcdI$Kqa!@qt=8PG&yE{l zq5LnR>`-qKr}a&JU(QYKw6pX1(o?+qBHVx6bj~IYKRMal1JW zqAgaeL-< z3E2@JD!&)Ykkovg5i0*-HTq7}u&ypO^G>4W0G4WYUxb(;iB984HGiq@z7vwp_?y~A zw5!&_2c3_?HXI-lQFyWFHB?d7Xb!Q3rv=-P%nCFpVoE2^LxC(rs*PRHoe6_Yp3&6y zl~5?GOR+J@c?7f~C#30}b=yx4DA|7U7*rFLY9_TGa#`q>tUc9N_SRgo4A)v3gIc%8 zSj<0_G}4!3&B|F<3%=Tu1L5Y@HC&ax6iRDz)3ApiJ?q%1;;B9vT~}?&fY-^?0Y9S9 zIKQXfEZ2wnj^zwB#fmV5u=|OaWRulJ8<6FmN3A^B{qKB~dW2i%-<9tZi`k+ zBZ}-SI?MT+p_r}3)Jl^SuT2jb?q<>r5|dpttem26M04!YL!(O_B%OO zfvDw8+GIQPc4VPs)`BdIZP<0vQN8P=6jaiia+5wSan2kWbOBLM=cELpx`RHmC8X1y zIpPXjCe#&PX09N<&dBbQ!26* zMM!@x6KGmq8bM@|!*f&J$>PDnbu>9V?6!$60}>{`Z5cz&PBs#bi|l0G3|$$daX{7> z$eIZ?L~?a@ri8eVPGhLQt$X&5K4PsUa}6-f3z7095xPoN#ui=xns z1val1<(ALEH9r-o5ypU>jJ)Kw*RGgvu0@0hXx`!CGbuPrjFnlT8)`nbEUZ*mm+mj; zGvw%gjNBaQZysFy2l8QUj@`pLNA4cxl`AhJkRl76fb zeLVN_$T0!4V4e-_3HTYQunr}+-w!@9^oWjAT`}8l^Ff*)r%-b;kPH3NM-K}0SYx^r ztN_GCAfCfrE`_2~Ax^w+Gwf7sJE>KZ2KI=hKw^4gWX_Z(%%YiMjOsS&i}5yFz$qqV zMtxxmX^Qcq9`uiy^q~KlnGgDX>2D4S#M?wES9riHp+BTm2Gd$i)1!_*mF)1n36KYD+KvAE6 z*rZK<7fgF=Z<~Zj>LsHJGCB=Y%PEVX32t`AU-i{_b^s#60^dEgQ`qqoh>NG7cj2RVkD_? z0yPhF?uU^`Jsj%sY#o*l;(8EI0I??mF(%>vPTmTWydA=*Mn#BOC1atmbO z>IEmHPD#`CNP#CHJ1(XFr#GYUBM#+qSLuS9*3eOn|1f_0x>|p%ZBRfYT|AO8Vd|hj zdfQWhorgs?-(^ZYFlO41UTvn0rEoC_v_`R#&?KKiscX14FJ5jVe49~!bZj8r{b;}e zOePO@E`Bs6lLSiUF>fXZ;@KXru~e*0-F8yepagDreGo_hE)%FhE+$flQ_gLi%8sBC zCYb+5B~iR$Mh`WqCH8@FRUz53*#EfKj28xxr!P1~G1GGBqWz4UN8I|klrB89)>3Dvb_&E74A<9MIHj`P3nDAasduUE85HH>2&5A&q{o2g1IOAPBKJjowJiWyo^>hc zRlG<2jfGEY>1x+P>M-xIjEYSE%&qt`9Ghc5Qw!Z#-xZI3 zPGQ6XRtZe_$|nj%6nzu>?I|g}lvuWfPh?>;tf^?(8``7*I%Jh4{S4`bbTilBltAO- zp-Di-R2MLG0GKk^{2PppywmMs(IaKKOLPMRQ>-j^eUFM6vT-7d_8-GlO_H&Y=ann+ z+Ph`uMJ7_yF^9QT3mc!*N(!S>vt&-Ih>XxYd`yk*<(|q3l)R11#zNNa25f&)vjj;; z?=lY=)Ae>!b1~zG&3{>ZYTNT`Uoa?kziPB_`DDcwo^`k#xLhL0KIvcbei-*1;eX)S zhWip%P5619L)IADINS`}Je+)uqL^nnZXHhMIvaRCira(x749hRFSyX+947V|@`&6KC)xbdW@3DTT zB$-S%kVS^vnR5fVm*aAAm(2}4$!3ZU)}v+PM65O&yeyt02af&*`9EjoErFk2)YQHm zraLW`HAuaWO)g{7(Ri#|v}A)z1(~)GE@5T7AK_iEt3N3_Sm{=Y9TZp!s3-IJsjM3R z8`j1ba|Z9-8raEATssrQmV-f?=E$Wvl90cq5&5>0A$cv^V?T^QG>ogT8!bfGcZU_B z6BeVtq3t9VNdc@|hei95OWl7Hkyf;xry~lHOaU?|fN3X&zeK@FI)zbsA&esz`@ulY zOGi-)7*GObw?+W66;s=)6!xCc6taKVfH4b2KF~`z+~}0c;P>^**k@(T$vW2Mw+0%p zDmGzJ6vh@aP!C-`s;;5^FLJ3>;i{xS$xL=$)orGW-P}Hfu2(cUDX?x3?ZoCLJBgOk zRz<|Iv!UtIIC=w{DFiMgzeU1CFO;TZKU3i@_A^;q!t5Ch?P*mU$3u$ltJr`F$F~dF zQWoC7q|UC_<9)?&gw39 zF^Agh8ID=oF|@-5bJ(l-{!z6YNxr!QB``4>ONtmV>@dk?ogoskVD59qV(brUH<<^i zax+2h-q4<#DO>VF@3J*7+j`ID9ev$whd+J>k_N9IzquPqkPjPG<4?Dci&zZfCZohG z3r7|>GOYKE%n58nu{`Mnc;sEQNj8&khWQlAT)-B(C|g~zQ6J`W^cB4qJFJ`Nwvf0% zl5D*v^PXV6C-B|@Lg6-9?GsLV-4sjS4pHLLAWN7;G70#~>K2qdG9PXVun@+B&}F^5 zc#pN-V|jnu%;;trd`-G{uq8yuBkcWW3$bJxY`cj`{R5~qFSXGG7?W-q8bz8MCsfd? z+jE>y#CrGe&J~wj0q<@YY;&*IWpt-qhC!~u*)s+XTVZCp$Q<#dCLcy*dMGl}X33O` z0sCc|VP%x@-!hHJ(?_PXmzilgna(pay|Fjb-$Z1(J2F#EGUYsdzf6;@Oq2glnUW{X zXy)llAk!&UJF+5fw&S%{JBqF&HQyIehzBAI;g&+IL8H8o+%BsSuK%SFG_lVtMJ$CF zL?OZqGZ?lnwKB3(2%FWV*pBTKhSPb_ouUyv9}`^SQ+-?P>u^cDHetHY}dnq?7`OiVBUvV z??WCAV72Tmd=!~oY~hmGV$dU0TI<*QQ7PL-dLLYwZ3CH(N8WWl1w(B)zX(Gv=pd6} zWIi~1$iu@1Mr0E0YG_ZkGJ(T;DFn3=vxiy*8~Siy!AdS)=3)-{;zI%|%d1e?<$5ac z({0?zbH{oJ{0mw4@ycbZ1x#p4%qNV1!K3h>dT?0|FwOUTd-@nBC+1zpNRx67osSVyRiUR>}C?t_y0`TQM1b|76+Nq<|v3!xeL2Gx@lZnn;Z@ zshON1i>%oRbEiGKrARn{K~^-$u-2E2KGw;uloL23T{9Pb&!ULMaAlc%t1OM@Y}|3e zMRBWG`-8QWYgVkfeXV=tinVKbacb)5Lwfm$?;u(y{MLfiwSjRaFICg3XKJcP=`#-8 z^|1biO|7fdXAZi?dr!7|#j48XYi?VzY`OYftzLQH%vODRO!V5-%kErWsalktV4I*O zD*aZ~@VH*9eziyUs7rR}KT)3N^i*X$r)M3w`AzuT!r zKyCqWt9ymya{1V`?iCgCf7SBJl}py%DX+JcFS&i~<({gsRqnORR<9vasZ&jPTA!?* ze_D4RcyK3n`U5}Mt*^GJ1$*=q_37jKtW?Rtz2xr7)st3K%y8efV$Ir0_uXrkEG=K| zmWruhgMO7^zAbnLOphGUN2sv}^t%pheoo(}N125t6$dJP>;W= z7pb_P>X#1+*WTjW;-Bg__Qsn3nm)hR^VDm4dX`1h8}hyGv88=&Te_;3pWJIJmn>aT zzT*DnD(!WB;^N*;60YM~_v%&dw4mW zoI`qnozK1h=nZ|S)0bY)B>*@tt{k@xSC89^YsMYJoyKX8vF{V-!4=?&ab>t_TrF+~ zt`XOQYr~zv8C+fSA?s=?Z6$x9mSo- z#qIzhE)Q3PtHSNYHRIZFXK*o3@O4L=7gvtkg4=^TgloeYPm&KV3+H{3t0hZ$sl;u; z?Zh?VnsKeT(>T{tWQxnd&BK-As&VzWCR{7-G)~(Ig>W8RF|HC`5A_KL?8muJN*!*~v+a2=tMA&_c(UVVmDa8= zws*d)xOsZ9J$aw<%d=pgn(gOVwNE`O&%OJUy@O}QezjDdTlTBB)1p#1X8 zIjClL@~k;{;Mq?7d~{UqYle2En))yO_r7Xg|0l=bX8w*g)1a>#S~jkR_~kt17f!bh z|KXqf?=E=3Pt&es)~8hqQrs3?Ev^n%kK2LUiQ9u~#O=p5II2SGfmyXNAN&M_Xa91v#eB3--5v~MRj;q40!&T$*ABJ0SI|N3; z|CieCA#EdWKkguIG89~R;Pb!hcMkTgdzW%>gt40E(Zf{mD8!KWBXA_|J9yVnR~zJM z)3m+v)a+W5JW*W_%9Fold1AvjB2N}WTjWW=F?qVNe91EpokgD2ns&wvx4E>8KSH(l zp&o#&KN$x)bmNo3Q9DO>1AXkmCN#AULQ1%vUJBZy)m`RR)VfzWo&gxP> zNH9i5m1lJY-RhZ{#t6q5;1OOIie$*Uempg4Nq|5#QRjmhYSwroRdtI$kJOdwB@Zp| z{w;=M)E3fg0Y;mfzbyXm1hx)XnQEV4j8P4VQu~qAe*dJdV0=VGIYR(U{dlA?DQe!F zuAo=7-)f{L<`|k*i8mZqs4>rksjo*GnIrcU^kpbitR-v*u$;aoP+oG4Y64guYJ-YI zBgTHNK;55cOrF$mYgZ6$-uwxR#KYP#sCM%r3y2wfMqh#lX^m zg_8-Y3SjZT=7lh6Zk{!QYO$J}WTcHe7J);Eb%?MQU}fr)Nyd0pmt+{en57ryqhY_) zfJNpL59|!rjD%?dR5axRFN*3wHqtt0wF) zur2EEqm0y1d-0|(>x<$h${}FM!1B~HDMnIa8{V9LQO*MMEK|Eu;Phg`!W=7%!55&k zd1i7`yqr!kVn&unq?b~Z5T_K_Ub7UFx8OYy5k)Gy6WDQJjl9b*1J?wsvQ#ZfML4vT z(wWQeFrjhDMz$DR#x4;x?>{x>=fR5azzDzYH+cPRvirW|$<-J>E zF%o@*Dsdx8O7MHtf<;D>swg&$=o6&ba<|&%HZtvd?^dt5jl`(7d%J==rQk_UY3@SI zK8024JVC<`SCQN*l$&P_VcLCa@@OM1s*DS|x_ieUMCEAm%e&tkQ5KPZ-Do6N)(_Q_ zM7Fp7P`xpla-QCzzLaNUok~dqiD!FP@U)DSNvb4`_-D7PJJJY`tyd3>XZUOa80D(( z3La707a^3}#J_i^45!=O2=|s52x-?Ca&80Ipw>?(QWJiaCqVCRi8(b%$T5bLb@&UE z*^brt?FV%6|C+RxJGm~#-N=)Q=bxMZ+$@xN{6(@&&>=ds-ubEYP{KM zJ>KY6ymdcU52RC}oq(;8*&IHb(+%T>qX5G!CA{Fl?JZvO~r7jHOx<$MT~N7}5Jp{A%%73e-wiPKW~0Po)8I|#eWumuKGKwgj3Mx zQ4u`5^+ViC_RRIZ+|++V7h?M7qOI{GGKYYa?~f&;S=wb zFpnq0Fzki<)btDrP(om{SpXBqG2)*CRIlF5Fh-=E!&`n30fbVbi_L_Pl zgW?qaT78;9El<1|P8wZ7aMABn;sn4)j|c}2MvaKx4>m>ciwb2F(2t*zL+W(nv9-n8E4Z zBgfQ>6De`!U)84*jm)UZcA8Z^Q(%mD)Di6Mkp3?MDo*Np5YQPw9`*MH#OM_7Nh$JO z3lWqq7Ke6rb_Gv}+zchi0aV0(-(2<5L?c-}J>3}SC<9jd73x4pEuS*Uh_ieDu4Yc6 z82i6gt0oEOeJ%QpDLveI5Ta=kT#@sQnmNTtiT1$0>%LJRlVDPQS05V+=T{Pz3oP8{ zg;-mFWdU2KMyDa|ypthU4gTZikTJED;GFIYRgq3$dB7yO{A9@J1~v~^R$p7hxh0IV zVe@*VZ}yes6jtb%&#XGN0YDd=tJKG~wN{h}p-xb_rQ*T^qjB|7XZwv~} z+NZ!6jZQ5-rn7-ph;~Fw&f()yVWl}#)POs0&A4*5?JsX z53{PqK7ZFl!{OLMWJB*}P!j!pjAV8YP>azWY~?-NT?B6n@Y<+u^~0&mQBDu&RzKq< z%H!w`?g?e^)l}-Y*U_zlQ;kV_NkX@pGR+tr-ICB9%*s*QM$&@sUtvTcXGJg`L$)0C zb~Dn3i4&z7ripMhfxW}8BZC`@k{5I%PUwbXMit_1y1u)29B_lH4A@>^2i4Tk5Z)X_ zJQo?p$lQf}5v3b65HTB=*}=v;TJSa(b~EcS=W}%zk^K?;hlLvB9d6dzif`-~b%%6^p~{m@a0dQRK~)K}!;yz>zOVo-q}dP5%0a`1UvNur4ooOxqP+Nb zgt$#AGAf@qhk?aXe)+j^MZgYS7*Dw`CO=Q{g%RtBm;tOr4W7ZMyB}|9v08jFJ=R^K zwq0xt*W*iItg*&O)qJriA0_G?LML@{U2M23O7|=!+hf2gc$c3WSH-{VySsz=!tY5c zZ#rG45PxZ?^d-}cnBn#KWfYO0v_PvHQFFI?U^*q(d9QkLI!aaRz3SuXC_HWVs`L0K zRaSNPPBJC$`q4BoumaxY=f>>?wiDRAP+u#*1j-%8ze7aBaP^Z*kWJb5sa=;KlMdex zKJ~$H;K5>;J}-?Ar~FXL9cDd;vkX`>ux5vvoJVi*7dvasg$iZWMgVp5!ROTWfmF`tF`#IHI=zt9nAcI0L!0pZDyi=%uQC z3~YY_uVb}VvYw<#yaSlXf^7g)=)(gdOjrHSk)0hI9^HQ_xhJIopa zU-z8ab(xXr+bgK{_OYoD^boM_pIyjtEx=9#3v-XeI|1x0Fa)~!6WBRm=laEq9Y+9p zM8Y5{o+*sOYRr123UH(csqb)^v3gr=5dVxJ^dm! z1IzA>7>d^lEVp00PGEWc;&lTn=oim5p7E_;ymTMH!hR8RfED$NI1gA!zj!6UO8dpD z1XkWJ-WFgL{o?HeRt3x#*(OZ@*Y!($7+5th;V1b?8y~Y^k!eo@tLYa{hI@gJ526 z$b0i%_32C_ZB!fYRnPYc3gQ2=z$$?in|)N}U11oB=@S@_xYRd{Uy6_eY{v^~@fAjz zqlEXpgy))OLR0VC0_e~S>cuOJ%;pZU4^l&H=&-o3wIq_?S*Sx7n2yc|X*1Lcd| z!J{%LCPio9HQLntJVeGk-m`y6_Xybr%kgIQd28{e`b4k_IU#_Dwdas|WZY;Cn(+c=aqyj77k5 zUheC+60aOsF0h@VoW`r?XBh(%>wz@^3)9X`yuHBozO3GxWu&AW<^60#xU@kVu+zXi zjy?g*MnY*;7vZO0?^eH_DFT*pJK6&z=8(E^Hq!s!^B>H{l3Iy32QL#@jD?By zc<14b0gwCy-(FyOhfLw^IAVoon-+%XPP`?D)SxSAVb>%$g`^R)sOW59wTINAD^Zt= zc;9nKJ#eLwII4>G{lt~tAU`**7FhLvO2KZ$knCuZq9)*yf zG*ct6W?)ux{-D5cI9q|`9$}zOR`V}npfRRUi4)z}q{I4_;Yhb&6{>w6gHIvevw`m5 zu~2Eup|l3r&dv*j(6j1cd$;fO7$JYTaMQ& zac767oPw?e_#WUDA-LHWT)cMz?*?8aaDD>o23GPfI<*P07s7=OZ z{Xx4dOt=Ag2;cK{w_Qwovd~d+wPB1c1Q_!T+JGdQ-8b8o1Qmo;64n;doSTU6s0Zdb zCuEa(?|5_GD}`?cUhysCJ@4B5P^FM-+A-jJzE$V1HpZnH(aoVEF^tkSEe7= zQ2QDJS_vpH6~-CY%B){(5vSh2)^H3sNQCU~^{BsIYm9ZAz?0$XK^&QK&bXMaV0t4u zE3hIHX37fbosL3aB}2v1VOk2}+*k@~fEA4FK{XU2#JMR;BcSrc9!w5PtR*yvOmzhjjI?+(wj{GRRb?g=?NA~M1F2uJ+MY#S>~K*z(KtGQ=q{-W5R$=JSS3n)c3B#lW+;z#ONM% z#dXHmqOGdv1Dl` z4KdFdU`K&PGL(@+O@SE^@e+U?1Qrtk%L3L2EI$I42kbbof(Te4FxR-A_})ws2rL5_ zJFZ9lWWF(MYz?03aXrC3k}6^?(T%r(u$b|}5D1f`QHSv+(5>r%u=Mi`qf8*dF>k3{7sWGDdE04$PB#lQ~sgH-@)0VaJ&ev-BZ z*fC&{q}u`P2(U=fH3B=7(c|kSi6m|YD4E0yHhuzYwP0Qo5`uLCJ4?Ls2v|3;c@r*# zxn>{|ffYu?O9ytM7Zw-d+Z=%DnLX+UUSsTlQarVIe(W_yJ8LES#GasrsRv81YRY0# zxgX%6ESkUsrZ|q{KQalX3>mAm%NT_w_b_a~DXR&23+SHd!1hcbiF#(dW!swvsEKP_ zn78+i`0IcjzDRnk3>eF>~~1=tNM7wP4Y%yO~Cf5XD+eqN~2nUWzV@V-U(nC!0OdqlTfu|W}?N< zQIiWnn`OTD^>ShDJYe-iZ!yQUQ5ATz=k;7*TB!jR^L>V`khBy-(A2$x%G-0n65%0W z-T&3c^-}2;VD-dH?o<4t&j73QN|6#xMLjzHie7+I66J*ai*H~yQ^fmDuX=#@#46tR zf-KyHByMde+>G03hAZ>^DDV5dq4(3gH(T$qd1C4d!LxWjX1&kj{e<~Ge7Ojda{On= z%iT|Tklwh3u(Jy;?D9K-bpw;M@{@Q?dHlP+FP6Th&Jr`$x?0?b&bUMylh)W~}d;SBgQjMO+ue+*E1p^#^m*l3L_!Ei%gSC%fD z04x@mOXN_hBM6vA~kKCfREkZ5b!F%^I^~NHqe2DjRrRLa`$|U79UTsYe>kwvcvc%?yzY6rgJSJ6~ z>BPtbba1U2bSnyP8Sh1vYTGSftL43kJ3aUGZLXPo5Lm|D7dGipV9CG?aLLb&YXcU0 zw~8)ierU{rz3x_-#Y{l5crPRF{?J@U7OowIz|I0omsUv~D9Nh# z#=SkkT0;A4?9GH#5*8a$$i#RW-3hFyDpV=g)sUr1O}~{&W%F*_CtP7_kA--Qs6m`Q8bQs0d|71P z09I;3=$SkVf$ach=4GvkO5Aebv70VTUkxk=ShyV|UOli%V8td*pC#r19s*ct0z+uj1al)`Ex_`DWk`R zZtnW)A0ub76{A#Q$ZdfAV>C>OKERIIt852aN)5MeKeq6|KW;btwusHNSB5vl{<~+m zmj7-ut?as#-Iseyqt*MREJBk-vb`!>rQB%@_f^l*wVk*Id0wd__jT=6g}8jeHSx0-ls%w) zIx!erxO~lleRmoQZ3psJ8gT;;yjNw|;||1ZHeQZVEt`y-1Fvl}M%q;CPmJ2k&Kvt! zAj}^0OU;I}&36m?TGQtPm+yvvI%(Wt1< zAwQ-TYjH(o7mB%L)Nw^ciG@ZNm7UAN=cLxV=<>dCMeXl3pIwyve(!hB?|FXD^YwXN z&dhse-t(UKyyrddna@)FdVuY?w${k5HSI}^Po}5ZhyWpegxHV}s+1XM0wg?mX_b5lMeYKJWsV-Q?vtp!gz;jckuik)R;Y< z$^nofd6_ygOs+R+`|JiP?=+BJ`(Q9(y=oqrIZwsTc5rKEG+TFy@5o%B6gx80Bi0Se z@0hP~?IL8*RcK%v3APo4#TN2IGfu9IE%A;JYwfkSje+9yUd5TQA~$^`*BVG)DG>@| zm_UHsZ6bZkmC0z_#Qzoym(puDVOWwV7J1;Qay=wlf;ua2%8dw&MMp7#*aqH}n;L38 zfhjXgonSpNg1?LFW=@Mm6&(2%StfjmvFO^vr z@TR;ML#=V5ljtBiqLZ0#$xmnM7=9?<$gIV@E&mR-(8IH5?K7@@Yt#T(sL*~f0Op>C zK~P@vJijG(@T9$7g3T)gydBB=_-H zb87Io6t9lP?NIifetvFn^m>=YEEJ-`Ea&kR^B1$Vw&uq9<7s$~>mfaZ%*r?9g$ zaGk=>6(t#mHS#J$s=UfHv3KV-h7A%A3z#pa2=O<%JwIOLi3=77uX#_9s`odE4DES-6<3 zvGbJTx$MU$`Ih2ol|QYPV^p!2Dg-11DVCW)$gY%ur(S_6k83BS%H}n+^MkHMf4M~% zn`=>*t`9pDV@LMdYhi45F|n#Xn28)@HbKD?T*YGoMY+$Ou@&X`UV8-=PVhHvmxDBQ zK&@OEq^XgEOcfY-*M$R1{pI>=hcQ>I(1J9V#YUix7}tZ?2-lMU=r;1gfjJss-GLBz z#InVvk?Z|C&==d1x`nRXWc80Q&};VC4cY^QfUkce>W`ql@4{J=8atwL>~b=`()ECW z9w78w?=q~m$1{WmEkXb^u7VIj!pbo~pzA?1?JZS=@V{_?iuKv%ChTor{W1(tgg&L{ ze+sF^JBcD81X0=b)GsKa4ni0EcxSsw(IwPXqSAoMq#9Hf`YK~l`8VMj0ttP}N7I2e zAS?{RB)cB0puIOJ!XyfD7($!m_w zwZY!TU^)gaI*q3-POY3~!$eh|D_Yf9T)yXjtwY^bUL9B|X5;q!^to5t6icSZ?EH3MHaB{O2!|#s;6cN; z2;b-?Wf90*k%w0*!-gE~FV&B@EOv5|P*b1X0<$rj&^AYSA$Vc6{HO&h!4kw|&?Xgi zm9c&HG&o$7P-~#CLCocHeb}(r@jiOEuOnQe8Nvun8T4KuSLZ|3*wt-BE;emeyv0tF z&>nWBK@Zxka!^~jT->$^0uaIH)p~WqNm5C5Smz79_N*7h%$31{rX9leZUsXYCRYE%0=v+C*)+W}wcLh({E!VRlSMfN|esq8*mbWsjT-XZ)AgnqrjWHLYomhZnu!>k$u_48okg!J{`&JQX z*NR2Kd}E!)tUYkC`T_p_^2Om5qAS)d%&V8MV7b2c5Kk*jul#YUTpzLpy8@g|ZE`); zx;;O92~LPE({FLjHE3b1HAr=k2s1Nj#OxsLA)!IEQ;7{B0*H}1NScj0HFoV!a(!l) z%q>Lt$v}?>K_x*fLKX=z&^OUlX%q1m&QqLW*upsPDl}hvetuT$CdpgM10{Ey%;x$Z^<#PzhWJ!SMst)ssfh3VcGOK?quj z3Kc34+UsjE^Lh~3s6!axtO&`*A)Fm|iLf{eumV6(7>5uft_Ijo=u#U}^o&Co9EU#R zi*R^vBgErDz79A9;7~Vc0X@8wNMn)as|kzmAViykj$Hr-8IQOqbvx2B0BKz8H+Hf* zm6Y{~I|uR_XNL63bp(!1Ph7U(u`uQnyz$2T7}mRiunT!a6_rNF z;Uc6dUe%YJ-@9@WeU7KCTpsU|t1Kqhu50Fr?&$jLRjjsi`^w2G)~n-PE3c&=@qv|@ zDt0D^$F4H6)z@(Is>cFX;Rq%rSirA%&#Ku|KSPKjmhW$3K*G)x0yz-89D`YMO-)@D3={K5R}o$*Hw8CYl`3|Rn6Yd# z30c3#ifrLI)^xTis=3^Hiqb}&y>1g*xry7?tz>%8bE+Kp)M)lRfK0@wkYx9_W^$b;Xj zk%Sz-bfxV`pOyl-f#bOQnUTUd8XDjpwjmX5jsW|CYG6lmSjCGp zLK90=nn)nb+b-S&pPAR(y){Ec4|DZhd)a~=eE(g?LKoZ$K{ogvGT;Oj6!WsXjcmbO zZo4~b&vrRRZ*uO&S#v**^oPZTS!kx{O{1t2~|WGsT%q8GVyd-AxG&WCKowZZ~FM-cq!H_WZJvZZ#bh^d-+;%_phKJQvk zLB(SZmKuD-REhtwhb-){-6BSTX)K-Rv|7+x8AH$x@ao?r)7s{y-)y3qcxW6GH{83J z6&ZNNy-BPnqIv(l&r`aWn}2sLt>G(vw~5W)suVW!bH7^?J%9O#&~gkpBw|gk(DN5H zm)^%zp)~G%y|>KOTp8yqUK?nhTTULyvBrykB&Zs}OE^JcF3lC8F|A6uRm4 zz8T>bLKDSR9vfx}uYD{bMA?1Xry7+>xXI%CdHZAQ*peci^7xvSOHAPLG2V(qy1&mp z=3Z!aJ{O)2)IEz_dk7@n^`fg4aCpQpoRN zoK&v0i(p~Do6tLW(Y`5_xLg|Gc=W;=u~`@W8Zk8KT~0tF+624BhzsIo&>xm)H2*O#D&!W9wO)vd_ruv@kR(aS_>ou_kTmVyw^kq?&m-3521Kme{z1f+=sK( zw~`pmI|?sJxzP(?=fXS8J1dS8 zQra@-{QRc?NUFS^4u&qVQ#;V0F9tNI#uaI75xaO+c2kr$|v_u=`$9)oky zU{km}T7g3=c%8_@PHf0O$qmmgiwo$%OoXC_@qncU@IDZQ{hgo#?Gmqjb~;_oJDy!j z$MKW~JcIM1h8yTPZf}@+Ej!bL{eb=n2&j}kHA<{dVhh&us^^N~db^(67=ga30BA#KBq0UJM!tuaJpWP@Ua$yO%6W}k zH;DJP5g%UA%k_=p>1W*3n9B;ad`sgrru&&UG)|&Nc~|4dQ(NU)vskMR!ZHR3`3^Dg zKM+e_LX7;4pdq0DXCi2^pf!Mo0R7t`-t)pelyl3AaV%qySG>3|sbHEI(@ipOmY*=i z3U4a!B8f4?zg2$1oan8azlA$rT%1&(95HBG%eG*3&c1 z)knT#G>q?fZYf;{zP=@v=Cugesuozm1+UV385xI>~fLW1w*I<;_th)@+*h~)~h^R^Qa ztnhZ;bK+iV<)w~0m^qVoIE-vw0Ke#n4orj*oo!cI>RZN#&k($@De&M$#G@FFmW*s( z*s_jkf8vcTsnJHC5t?9x9|PyR(7#O>7Qfgs33HBoZ9J8D&THcMj zx?7PG55QjeUO_}CUTQ+Iozwe89cDY!XV*~|?i6k^`wf?+f-p0o;^+aLfsWXDwnKcZ zfNYyb(T<6SU(l?0&!yr!L!Uis8O zC_|gsWBQyzk&2*D#O#2PGNz1aXPc42N=vE7HLW7x zIMTY7HgVk>>v6DDyb%-C=9|Y696}-xw0Y+@>m+Y@V@e1D10lq$+mJ%IS)2L58~5Oi z#QNs7i0!w(`9~V{skce~C-8WIFpC&4YH*W$oCj^!#-H-lzVBs_{~lW4^R)?ADw9Dh z9czw}h0&}3%w>Ht}{Oc6csvaBLZ9M> zcgBajD?h9&LAwE8yFJ|UPBMLvZ+|B)P)yvE2IO%2I}?{dG))K z=r(@*-CQ>N#^%9yal1Ch@yL#3dOtUJtVd+q(D4|{ENsqx|CEaM?>(K$X8H59(<@nK z0k1wiow|72>4=ET3^=P4-@|yW5CPlr1%C1LX4=YEe7Mu^AguE??)>l;`Y|v1XgaOq zwvW>1nl?H&iZ8w5V{q0ty>^>8K()f4=7tvwn zn6>G8KKN0=xR;dAV@m9iA*|6)Y$e=!aV43Zz%5;y$NT_w_ju2%DW`cySDeO$?z6t; z7rT;|I)y?+H@BzvJ5bMw2Q+l}mM}j(VQM>I0>XSTA>5aE__K&u3qIXs5q$*>4jQp# z#=rQ6GYgq%25&m^EPb4po?Xah9~3@$GENxaR7Qiz&8gcXukw2;KWhC0v^AlM^iG2A=ch^$0Nz{rPT| zZsB2{CeSLL^Xcx;{HYjb9NtCVhZn@Ls5bGgPg7Zb5+DBbJuH5E&u020H+>cpz84K~ zPc#(@IlU^L`~$asmJ!|tNzUR87OrsmeaL^|CV8#A;j>AQr0cUE*z_#k`T0z|duqQZ z&L2kLQjTqY7-<vN!y(e_o=hTld`W`)YrjnT_`Jpf8!;1UAoEDL>$@>A7 z7%&Q6SA@M~6m!#Go{Pwcfm1Wd^F;_e^5c$-B!2NP%h*&sH=kd~rWNp-^BMGCy!HIk zmC0>{PK3u77@fbmoYruqUbLHJyV7S;2g?5eBV$~ZRw@Ih>AcJ)MG~6YPv}T_Bpuyp z5(XbB;{pG2UeG3$c*~>dsXKnzW~8q-t@Kuo3^XYg0t|Qs5HtmaKH3&v+ZEn)vJe)` z(*(A8X_G9-=XvQP1C0ofrtVv+L=AiTZXo_25buq<}h!?Ogo`7b%f4_*s~0T&Tai~9cY2| z3N63nN?tI|-QX?HxO9b{|3C1!A_S~J6fO&J1Oh}}B|w{(W*+jkoul`rb5YJ;LFgP< z$y}$GmRkW$K%=?DTUG`-?#o-{m1cxoYd7J0`3Uy~8U z*f7arq~qypQiYKkS!}sfXQZhtcD2-Iq;pwpiKI@Tk42;wC?9uX#Bb`l^x~!|0$iyv z0RyGRN~T1buM&icM7n;=cfNBBw;_<6iF9_j^WSy9S9)av)nWL{EQTl0$LTJqCdtRL zGl@RNCN8}~IFu|1<1P~%TT*B^9m~$*by1gyxQt+m82jw7R5y`66LDu1p?8)87DBgT z>9=;cN#ZSzl2rOz7C5y9Izgy9wbjv;Mi;6g?&%>^;9eNgy)c>`CLm8TnP_zAmBxhS z?gxq-WhS~w&y4dN9cCKL*wju(&s=(e1|aa)S%D3XjzYSIYIJ3S;7GfUe!!Tn%rR6% z&#D+Goh5X)pU9Lhqf0a)Exk4oV~WUH{D44z+;Mybz0Yr?f6f|eREz#)>u6kXQiRrJ z!!LrA6E0NkvWNrSfUr~?C}vd%5JMuCNcIZ4J2VpCicRVZoQj(eRFrFya<D`Va zTj@hoMf^05oIB}XsV3Kqh3j@C-bGKa=m=ciBc{tww29c@A2`SjsO-mN%B4&9&^5sk z(V+hw2ksWMyH>Jpr>n+&?|W$YUTKb|N*8wCiEfRKp6&DnwTiGi9aX=h6EHBFC>^u*s6v23rhEl+tYUI%8OZ&R}+^*PeqDIWoSNi#wONL7EA*>w{Hx zLbPw#DsWL|hILkzX}y&>RjNG+pyQW4w09}dJzyZT_9lbQwgq=7>~JU5>~-$cCSVNl zW71IPT#UDj=n@dpOsT~0jGQ}j;+^XW1jz|@9zr;2OG%#spOJvb&3V6`IiEJEjQ1;_ zbVYQh!tw#I0wIV!hdTGRsiuG#7*h0&ckUz%I#(`@qhD?g+b#4kCi1LZ{L+V{_bnr& z^02)^b=YoYASAg;ZQ}is_FWJ45fY0*U?=z{gUARg=7-<2_!(|Cu8mBRIe^$Da_N~Em*PDoQC-8vy0B50nD;3_%br+msKUn}{ zds(q%WkyQ=@}Rg%iw`{BnAde@1#!8o#Fc6npUt{mTM_3v#it#m-09f9n?B*^&(6Ss zcgH%yYG@W^#~zl79;N$OREp$$l%7O{DII!@{#~Pd-A|KhAEyUcltD_XrGG%`I9E#< z6&dFq`jo$lIcpuZC+U+g#-RC9?9=qazzF!Ynb@k~7o|&2)4hS=14O0J${n@!G)t8p z-hxUz)P^5Ng$^lR2*Nv&CrG=HYLRvTO<=UmG58E!tTu*UR0t};Eqoa8c3?B>kO!mi zc8B$Oy2)>`(ok>|M8O3O#fad}W_A&l2l4W7LgZ~nxe;|od{T6Sh6sBm+@7;Zk%HwF zN|7(qqm^_>OX$A_0fZ(>D)P|c<-9152F_`vyy7bQ=r$t1VN`tu@;iLxYF}C>Qk>bp zU_QbGyXk+Vi~2@i9nRu^+eWl&8&%(lJlwX@zTcbvpp~CAIo|sNJ;+un>n5~{brBkh z%0?c`5urwkB~jLI5P6|-u>x4j@K&F8q2=%);1aZa9H<3wUgz}yPDkredQ!C!eo+

mL@)h5oiCdRnKTKfN&01*Tz=6 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 CfXeIu delta 46386 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 MaV7Yz5NGfI0X}pTIRF3v diff --git a/build/auto-ip-common.inc b/build/auto-ip-common.inc index d1ffd40..0c0fff4 100644 --- a/build/auto-ip-common.inc +++ b/build/auto-ip-common.inc @@ -7,6 +7,17 @@ #define TC_AUTO_IP_UNUSED #endif +#if defined(__NetBSD__) || defined(__APPLE__) || defined(__FreeBSD__) || defined(__OpenBSD__) || defined(__DragonFly__) +#include +#endif + +#ifndef MAX_LINK_IPV4_ADDRS +#define MAX_LINK_IPV4_ADDRS 8 +#endif +#ifndef MAX_LINK_IPV6_ADDRS +#define MAX_LINK_IPV6_ADDRS 8 +#endif + struct iface_context { char name[IFNAMSIZ]; uint32_t ipv4_addr; @@ -19,6 +30,33 @@ struct iface_context_set { size_t count; }; +struct link_ipv4_addr { + uint32_t addr; + uint32_t netmask; +}; + +struct link_ipv6_addr { + struct in6_addr addr; + unsigned int scope_id; + int prefix_len; + int link_local; +}; + +struct link_context { + char name[IFNAMSIZ]; + int flags; + unsigned int ifindex; + struct link_ipv4_addr ipv4[MAX_LINK_IPV4_ADDRS]; + size_t ipv4_count; + struct link_ipv6_addr ipv6[MAX_LINK_IPV6_ADDRS]; + size_t ipv6_count; +}; + +struct link_context_set { + struct link_context links[MAX_IFACE_CONTEXTS]; + size_t count; +}; + static int TC_AUTO_IP_UNUSED runtime_ipv4_is_usable(uint32_t ipv4_addr) { uint32_t host_order = ntohl(ipv4_addr); unsigned int first_octet = (unsigned int)((host_order >> 24) & 0xff); @@ -39,6 +77,22 @@ static int TC_AUTO_IP_UNUSED runtime_ipv4_is_usable(uint32_t ipv4_addr) { return 1; } +static int TC_AUTO_IP_UNUSED runtime_ipv4_is_bindable(uint32_t ipv4_addr) { + uint32_t host_order = ntohl(ipv4_addr); + unsigned int first_octet = (unsigned int)((host_order >> 24) & 0xff); + + if (ipv4_addr == 0 || host_order == 0xffffffffU) { + return 0; + } + if (first_octet == 0 || first_octet == 127) { + return 0; + } + if (first_octet >= 224) { + return 0; + } + return 1; +} + static int TC_AUTO_IP_UNUSED iface_flags_are_usable(int flags, int require_running) { if ((flags & IFF_UP) == 0) { return 0; @@ -183,6 +237,86 @@ static int TC_AUTO_IP_UNUSED ipv4_is_rfc1918(uint32_t ipv4_addr) { return 0; } +static int TC_AUTO_IP_UNUSED ipv4_is_link_local(uint32_t ipv4_addr) { + uint32_t host_order = ntohl(ipv4_addr); + return ((host_order >> 24) & 0xff) == 169 && ((host_order >> 16) & 0xff) == 254; +} + +static int TC_AUTO_IP_UNUSED ipv6_is_unspecified_addr(const struct in6_addr *addr) { + static const unsigned char zero[16] = {0}; + return memcmp(addr->s6_addr, zero, sizeof(zero)) == 0; +} + +static int TC_AUTO_IP_UNUSED ipv6_is_loopback_addr(const struct in6_addr *addr) { + static const unsigned char loopback[16] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1}; + return memcmp(addr->s6_addr, loopback, sizeof(loopback)) == 0; +} + +static int TC_AUTO_IP_UNUSED ipv6_is_multicast_addr(const struct in6_addr *addr) { + return addr->s6_addr[0] == 0xff; +} + +static int TC_AUTO_IP_UNUSED ipv6_is_link_local_addr(const struct in6_addr *addr) { + return addr->s6_addr[0] == 0xfe && (addr->s6_addr[1] & 0xc0) == 0x80; +} + +static int TC_AUTO_IP_UNUSED runtime_ipv6_is_usable(const struct in6_addr *addr) { + return !ipv6_is_unspecified_addr(addr) && + !ipv6_is_loopback_addr(addr) && + !ipv6_is_multicast_addr(addr); +} + +static int TC_AUTO_IP_UNUSED runtime_ipv6_is_bindable(const struct in6_addr *addr) { + return runtime_ipv6_is_usable(addr) && !ipv6_is_link_local_addr(addr); +} + +static int TC_AUTO_IP_UNUSED ipv6_prefix_length_from_mask(const struct in6_addr *mask) { + int prefix = 0; + int saw_zero = 0; + size_t i; + + for (i = 0; i < sizeof(mask->s6_addr); i++) { + unsigned char byte = mask->s6_addr[i]; + int bit; + for (bit = 7; bit >= 0; bit--) { + if ((byte & (1U << bit)) != 0) { + if (saw_zero) { + return 64; + } + prefix++; + } else { + saw_zero = 1; + } + } + } + return prefix == 0 ? 64 : prefix; +} + +static int TC_AUTO_IP_UNUSED ipv6_prefix_matches(const struct in6_addr *a, + const struct in6_addr *b, + int prefix_len) { + int full_bytes; + int remaining_bits; + unsigned char mask; + + if (prefix_len <= 0) { + return 1; + } + if (prefix_len > 128) { + prefix_len = 128; + } + full_bytes = prefix_len / 8; + remaining_bits = prefix_len % 8; + if (full_bytes > 0 && memcmp(a->s6_addr, b->s6_addr, (size_t)full_bytes) != 0) { + return 0; + } + if (remaining_bits == 0) { + return 1; + } + mask = (unsigned char)(0xffU << (8 - remaining_bits)); + return (a->s6_addr[full_bytes] & mask) == (b->s6_addr[full_bytes] & mask); +} + static int TC_AUTO_IP_UNUSED iface_context_priority_score(const struct iface_context *ctx) { int score = 0; int prefix = netmask_prefix_length(ctx->netmask); @@ -430,6 +564,361 @@ static int TC_AUTO_IP_UNUSED iface_context_cidr(char *out, size_t out_len, const return 0; } +static int TC_AUTO_IP_UNUSED link_context_priority_score(const struct link_context *ctx) { + int score = 0; + + if (ctx->ipv4_count > 0) { + if (ipv4_is_rfc1918(ctx->ipv4[0].addr)) { + score -= 4000; + } + if (ipv4_is_link_local(ctx->ipv4[0].addr)) { + score += 200; + } + } else { + score += 1000; + } + if (iface_name_is_strong_lan(ctx->name)) { + score -= 3000; + } else if (iface_name_is_likely_lan(ctx->name)) { + score -= 2500; + } + if (iface_name_is_likely_wan_or_tunnel(ctx->name)) { + score += 5000; + } + if ((ctx->flags & IFF_RUNNING) == 0) { + score += 500; + } + return score; +} + +static int TC_AUTO_IP_UNUSED link_context_compare(const struct link_context *a, const struct link_context *b) { + int a_score = link_context_priority_score(a); + int b_score = link_context_priority_score(b); + int name_cmp; + + if (a_score != b_score) { + return a_score < b_score ? -1 : 1; + } + name_cmp = strcmp(a->name, b->name); + if (name_cmp != 0) { + return name_cmp; + } + if (a->ipv4_count > 0 && b->ipv4_count > 0 && a->ipv4[0].addr != b->ipv4[0].addr) { + return ntohl(a->ipv4[0].addr) < ntohl(b->ipv4[0].addr) ? -1 : 1; + } + return 0; +} + +static void TC_AUTO_IP_UNUSED sort_link_contexts(struct link_context_set *set) { + size_t i; + + for (i = 1; i < set->count; i++) { + struct link_context current = set->links[i]; + size_t j = i; + while (j > 0 && link_context_compare(¤t, &set->links[j - 1]) < 0) { + set->links[j] = set->links[j - 1]; + j--; + } + set->links[j] = current; + } +} + +static struct link_context TC_AUTO_IP_UNUSED *find_or_add_link_context(struct link_context_set *out, + const char *name, + int flags) { + size_t i; + struct link_context *ctx; + + for (i = 0; i < out->count; i++) { + if (strcmp(out->links[i].name, name) == 0) { + if (out->links[i].flags == 0) { + out->links[i].flags = flags; + } + return &out->links[i]; + } + } + if (out->count >= MAX_IFACE_CONTEXTS) { + return NULL; + } + ctx = &out->links[out->count++]; + memset(ctx, 0, sizeof(*ctx)); + strncpy(ctx->name, name, sizeof(ctx->name) - 1); + ctx->flags = flags; + return ctx; +} + +static int TC_AUTO_IP_UNUSED link_context_has_ipv4(const struct link_context *ctx, uint32_t addr) { + size_t i; + + for (i = 0; i < ctx->ipv4_count; i++) { + if (ctx->ipv4[i].addr == addr) { + return 1; + } + } + return 0; +} + +static int TC_AUTO_IP_UNUSED link_context_has_ipv6(const struct link_context *ctx, const struct in6_addr *addr) { + size_t i; + + for (i = 0; i < ctx->ipv6_count; i++) { + if (memcmp(&ctx->ipv6[i].addr, addr, sizeof(*addr)) == 0) { + return 1; + } + } + return 0; +} + +static int TC_AUTO_IP_UNUSED append_link_ipv4(struct link_context_set *out, + const char *name, + uint32_t ipv4_addr, + uint32_t netmask, + int flags) { + struct link_context *ctx; + size_t pos; + + if (!runtime_ipv4_is_bindable(ipv4_addr)) { + return 0; + } + ctx = find_or_add_link_context(out, name, flags); + if (ctx == NULL || link_context_has_ipv4(ctx, ipv4_addr)) { + return 0; + } + if (ctx->ipv4_count >= MAX_LINK_IPV4_ADDRS) { + return 0; + } + pos = ctx->ipv4_count++; + ctx->ipv4[pos].addr = ipv4_addr; + ctx->ipv4[pos].netmask = netmask; + if (ctx->ipv4_count == 1) { + ctx->flags = flags; + } + return 1; +} + +static int TC_AUTO_IP_UNUSED append_link_ipv6(struct link_context_set *out, + const char *name, + const struct in6_addr *addr, + int prefix_len, + unsigned int scope_id, + int flags) { + struct link_context *ctx; + size_t pos; + + if (!runtime_ipv6_is_usable(addr)) { + return 0; + } + ctx = find_or_add_link_context(out, name, flags); + if (ctx == NULL || link_context_has_ipv6(ctx, addr)) { + return 0; + } + if (ctx->ipv6_count >= MAX_LINK_IPV6_ADDRS) { + return 0; + } + if (ctx->ifindex == 0 && scope_id != 0) { + ctx->ifindex = scope_id; + } + pos = ctx->ipv6_count++; + ctx->ipv6[pos].addr = *addr; + ctx->ipv6[pos].scope_id = scope_id; + ctx->ipv6[pos].prefix_len = prefix_len > 0 ? prefix_len : 64; + ctx->ipv6[pos].link_local = ipv6_is_link_local_addr(addr); + return 1; +} + +static int TC_AUTO_IP_UNUSED link_context_has_samba_address(const struct link_context *ctx) { + size_t i; + + if (ctx->ipv4_count > 0) { + return 1; + } + for (i = 0; i < ctx->ipv6_count; i++) { + if (runtime_ipv6_is_bindable(&ctx->ipv6[i].addr)) { + return 1; + } + } + return 0; +} + +static int TC_AUTO_IP_UNUSED link_context_has_advertisable_ipv4(const struct link_context *ctx) { + return ctx->ipv4_count > 0; +} + +static int TC_AUTO_IP_UNUSED link_context_has_advertisable_ipv6(const struct link_context *ctx) { + size_t i; + + for (i = 0; i < ctx->ipv6_count; i++) { + if (runtime_ipv6_is_bindable(&ctx->ipv6[i].addr)) { + return 1; + } + } + return 0; +} + +static int TC_AUTO_IP_UNUSED link_context_has_advertisable_address(const struct link_context *ctx) { + return link_context_has_advertisable_ipv4(ctx) || + link_context_has_advertisable_ipv6(ctx); +} + +static int TC_AUTO_IP_UNUSED link_context_has_mdns_ipv6_transport(const struct link_context *ctx) { + return ctx->ifindex != 0 && ctx->ipv6_count > 0; +} + +static int TC_AUTO_IP_UNUSED link_context_is_advertise_eligible(const struct link_context *ctx) { + return link_context_has_advertisable_address(ctx); +} + +static void TC_AUTO_IP_UNUSED filter_advertise_link_contexts(struct link_context_set *out, + const struct link_context_set *in) { + size_t i; + + memset(out, 0, sizeof(*out)); + for (i = 0; i < in->count; i++) { + if (!link_context_is_advertise_eligible(&in->links[i])) { + continue; + } + if (out->count >= MAX_IFACE_CONTEXTS) { + break; + } + out->links[out->count++] = in->links[i]; + } + sort_link_contexts(out); +} + +static int TC_AUTO_IP_UNUSED link_context_identity_equal(const struct link_context *a, + const struct link_context *b) { + size_t i; + + if (strcmp(a->name, b->name) != 0 || + a->flags != b->flags || + a->ifindex != b->ifindex || + a->ipv4_count != b->ipv4_count || + a->ipv6_count != b->ipv6_count) { + return 0; + } + for (i = 0; i < a->ipv4_count; i++) { + if (a->ipv4[i].addr != b->ipv4[i].addr || + a->ipv4[i].netmask != b->ipv4[i].netmask) { + return 0; + } + } + for (i = 0; i < a->ipv6_count; i++) { + if (memcmp(&a->ipv6[i].addr, &b->ipv6[i].addr, sizeof(a->ipv6[i].addr)) != 0 || + a->ipv6[i].scope_id != b->ipv6[i].scope_id || + a->ipv6[i].prefix_len != b->ipv6[i].prefix_len || + a->ipv6[i].link_local != b->ipv6[i].link_local) { + return 0; + } + } + return 1; +} + +static int TC_AUTO_IP_UNUSED link_context_set_contains(const struct link_context_set *set, + const struct link_context *ctx) { + size_t i; + + for (i = 0; i < set->count; i++) { + if (link_context_identity_equal(&set->links[i], ctx)) { + return 1; + } + } + return 0; +} + +static int TC_AUTO_IP_UNUSED link_context_sets_equal(const struct link_context_set *a, + const struct link_context_set *b) { + size_t i; + + if (a->count != b->count) { + return 0; + } + for (i = 0; i < a->count; i++) { + if (!link_context_set_contains(b, &a->links[i])) { + return 0; + } + } + return 1; +} + +static int TC_AUTO_IP_UNUSED link_context_ipv4_cidr(char *out, + size_t out_len, + const struct link_ipv4_addr *addr) { + char ip_buf[INET_ADDRSTRLEN]; + int written; + + written = snprintf(out, + out_len, + "%s/%d", + ipv4_to_string(addr->addr, ip_buf, sizeof(ip_buf)), + netmask_prefix_length(addr->netmask)); + if (written < 0 || (size_t)written >= out_len) { + return -1; + } + return 0; +} + +static int TC_AUTO_IP_UNUSED link_context_ipv6_cidr(char *out, + size_t out_len, + const struct link_ipv6_addr *addr) { + char ip_buf[INET6_ADDRSTRLEN]; + int written; + + if (inet_ntop(AF_INET6, &addr->addr, ip_buf, sizeof(ip_buf)) == NULL) { + return -1; + } + written = snprintf(out, out_len, "%s/%d", ip_buf, addr->prefix_len); + if (written < 0 || (size_t)written >= out_len) { + return -1; + } + return 0; +} + +static int TC_AUTO_IP_UNUSED print_smb_link_bind_tokens(FILE *stream, const struct link_context_set *set) { + int wrote = 0; + size_t i; + + for (i = 0; i < set->count; i++) { + size_t j; + const struct link_context *ctx = &set->links[i]; + for (j = 0; j < ctx->ipv4_count; j++) { + char cidr[INET_ADDRSTRLEN + 4]; + if (link_context_ipv4_cidr(cidr, sizeof(cidr), &ctx->ipv4[j]) != 0) { + return -1; + } + if (wrote && fputc(' ', stream) == EOF) { + return -1; + } + if (fputs(cidr, stream) == EOF) { + return -1; + } + wrote = 1; + } + for (j = 0; j < ctx->ipv6_count; j++) { + char cidr[INET6_ADDRSTRLEN + 5]; + if (!runtime_ipv6_is_bindable(&ctx->ipv6[j].addr)) { + continue; + } + if (link_context_ipv6_cidr(cidr, sizeof(cidr), &ctx->ipv6[j]) != 0) { + return -1; + } + if (wrote && fputc(' ', stream) == EOF) { + return -1; + } + if (fputs(cidr, stream) == EOF) { + return -1; + } + wrote = 1; + } + } + if (!wrote) { + return -1; + } + if (fputc('\n', stream) == EOF) { + return -1; + } + return 0; +} + static int TC_AUTO_IP_UNUSED print_iface_context_cidrs(FILE *stream, const struct iface_context_set *set) { size_t i; @@ -454,6 +943,191 @@ static int TC_AUTO_IP_UNUSED print_iface_context_cidrs(FILE *stream, const struc return 0; } +static int TC_AUTO_IP_UNUSED collect_link_contexts_with_policy(struct link_context_set *out, int require_running) { + int sockfd = -1; + char buffer[8192]; + struct ifconf ifc; + char *cursor; + char *end; + int fixed_entries; + + memset(out, 0, sizeof(*out)); + + sockfd = socket(AF_INET, SOCK_DGRAM, 0); + if (sockfd < 0) { + perror("socket interface enumeration"); + return -1; + } + + memset(&ifc, 0, sizeof(ifc)); + ifc.ifc_len = sizeof(buffer); + ifc.ifc_buf = buffer; + if (ioctl(sockfd, SIOCGIFCONF, &ifc) < 0) { + perror("ioctl(SIOCGIFCONF)"); + close(sockfd); + return -1; + } + + cursor = ifc.ifc_buf; + end = cursor + ifc.ifc_len; + fixed_entries = ifreq_table_uses_fixed_entries((size_t)ifc.ifc_len); + while (cursor < end) { + struct ifreq ifr_entry; + struct ifreq flags_req; + int flags = 0; + size_t remaining = (size_t)(end - cursor); + size_t step; + + if (copy_ifreq_entry(&ifr_entry, cursor, remaining) != 0) { + break; + } + step = ifreq_entry_size(&ifr_entry, remaining, fixed_entries); + if (step == 0) { + break; + } + + memset(&flags_req, 0, sizeof(flags_req)); + strncpy(flags_req.ifr_name, ifr_entry.ifr_name, sizeof(flags_req.ifr_name) - 1); + if (ioctl(sockfd, SIOCGIFFLAGS, &flags_req) != 0) { + cursor += step; + continue; + } + flags = flags_req.ifr_flags; + if (!iface_flags_are_usable(flags, require_running)) { + cursor += step; + continue; + } + + if (ifr_entry.ifr_addr.sa_family == AF_INET) { + struct ifreq mask_req; + struct sockaddr_in sin; + uint32_t netmask = 0; + + memset(&mask_req, 0, sizeof(mask_req)); + strncpy(mask_req.ifr_name, ifr_entry.ifr_name, sizeof(mask_req.ifr_name) - 1); + if (ioctl(sockfd, SIOCGIFNETMASK, &mask_req) == 0) { + struct sockaddr_in netmask_addr; + memset(&netmask_addr, 0, sizeof(netmask_addr)); + memcpy(&netmask_addr, &mask_req.ifr_addr, sizeof(netmask_addr)); + netmask = netmask_addr.sin_addr.s_addr; + } + memset(&sin, 0, sizeof(sin)); + memcpy(&sin, &ifr_entry.ifr_addr, sizeof(sin)); + append_link_ipv4(out, ifr_entry.ifr_name, sin.sin_addr.s_addr, netmask, flags); + } else if (ifr_entry.ifr_addr.sa_family == AF_INET6) { + struct sockaddr_in6 sin6; + struct ifreq mask_req; + int prefix_len = 64; + + memset(&sin6, 0, sizeof(sin6)); + memcpy(&sin6, &ifr_entry.ifr_addr, sizeof(sin6)); + memset(&mask_req, 0, sizeof(mask_req)); + strncpy(mask_req.ifr_name, ifr_entry.ifr_name, sizeof(mask_req.ifr_name) - 1); + if (ioctl(sockfd, SIOCGIFNETMASK, &mask_req) == 0) { + struct sockaddr_in6 mask6; + memset(&mask6, 0, sizeof(mask6)); + memcpy(&mask6, &mask_req.ifr_addr, sizeof(mask6)); + if (mask6.sin6_family == AF_INET6) { + prefix_len = ipv6_prefix_length_from_mask(&mask6.sin6_addr); + } + } + append_link_ipv6(out, + ifr_entry.ifr_name, + &sin6.sin6_addr, + prefix_len, + (unsigned int)sin6.sin6_scope_id, + flags); +#if defined(AF_LINK) && (defined(__NetBSD__) || defined(__APPLE__) || defined(__FreeBSD__) || defined(__OpenBSD__) || defined(__DragonFly__)) + } else if (ifr_entry.ifr_addr.sa_family == AF_LINK) { + const struct sockaddr_dl *sdl = (const struct sockaddr_dl *)&ifr_entry.ifr_addr; + struct link_context *ctx = find_or_add_link_context(out, ifr_entry.ifr_name, flags); + if (ctx != NULL && ctx->ifindex == 0) { + ctx->ifindex = (unsigned int)sdl->sdl_index; + } +#endif + } + cursor += step; + } + + close(sockfd); + { + size_t i; + size_t write_i = 0; + for (i = 0; i < out->count; i++) { + if (out->links[i].ipv4_count == 0 && out->links[i].ipv6_count == 0) { + continue; + } + if (out->links[i].ifindex == 0) { + out->links[i].ifindex = if_nametoindex(out->links[i].name); + } + if (write_i != i) { + out->links[write_i] = out->links[i]; + } + write_i++; + } + out->count = write_i; + } + sort_link_contexts(out); + return 0; +} + +static int TC_AUTO_IP_UNUSED collect_usable_link_contexts(struct link_context_set *out) { + if (collect_link_contexts_with_policy(out, 1) != 0) { + return -1; + } + if (out->count > 0) { + return 0; + } + if (collect_link_contexts_with_policy(out, 0) != 0) { + return -1; + } + if (out->count > 0) { + fprintf(stderr, "auto-ip: no IFF_RUNNING usable address links found; using IFF_UP fallback links\n"); + } + return 0; +} + +static void TC_AUTO_IP_UNUSED log_link_contexts(const char *prefix, const struct link_context_set *set) { + size_t i; + + fprintf(stderr, "%s: links=%lu\n", prefix, (unsigned long)set->count); + for (i = 0; i < set->count; i++) { + size_t j; + const struct link_context *ctx = &set->links[i]; + fprintf(stderr, "%s: link[%lu] iface=%s flags=0x%x ifindex=%u score=%d ipv4=%lu ipv6=%lu\n", + prefix, + (unsigned long)i, + ctx->name, + (unsigned int)ctx->flags, + ctx->ifindex, + link_context_priority_score(ctx), + (unsigned long)ctx->ipv4_count, + (unsigned long)ctx->ipv6_count); + for (j = 0; j < ctx->ipv4_count; j++) { + char ip_buf[INET_ADDRSTRLEN]; + char mask_buf[INET_ADDRSTRLEN]; + fprintf(stderr, "%s: link[%lu].ipv4[%lu]=%s netmask=%s\n", + prefix, + (unsigned long)i, + (unsigned long)j, + ipv4_to_string(ctx->ipv4[j].addr, ip_buf, sizeof(ip_buf)), + ipv4_to_string(ctx->ipv4[j].netmask, mask_buf, sizeof(mask_buf))); + } + for (j = 0; j < ctx->ipv6_count; j++) { + char ip_buf[INET6_ADDRSTRLEN]; + const char *printed = inet_ntop(AF_INET6, &ctx->ipv6[j].addr, ip_buf, sizeof(ip_buf)); + fprintf(stderr, "%s: link[%lu].ipv6[%lu]=%s/%d scope=%u link_local=%d\n", + prefix, + (unsigned long)i, + (unsigned long)j, + printed != NULL ? printed : "invalid", + ctx->ipv6[j].prefix_len, + ctx->ipv6[j].scope_id, + ctx->ipv6[j].link_local); + } + } +} + static void TC_AUTO_IP_UNUSED log_iface_contexts(const char *prefix, const struct iface_context_set *set) { size_t i; diff --git a/build/mdns-advertiser.c b/build/mdns-advertiser.c index d430989..ad87063 100644 --- a/build/mdns-advertiser.c +++ b/build/mdns-advertiser.c @@ -27,6 +27,7 @@ #define MDNS_PORT 5353 #endif #define MDNS_GROUP "224.0.0.251" +#define MDNS_GROUP_V6 "ff02::fb" #define BUF_SIZE 1500 #define MAX_NAME 256 #define MAX_LABEL 63 @@ -80,8 +81,21 @@ #define DNS_FLAG_QR 0x8000 #define DNS_FLAG_AA 0x0400 +#if !defined(IPV6_JOIN_GROUP) && defined(IPV6_ADD_MEMBERSHIP) +#define IPV6_JOIN_GROUP IPV6_ADD_MEMBERSHIP +#endif +#if !defined(IPV6_LEAVE_GROUP) && defined(IPV6_DROP_MEMBERSHIP) +#define IPV6_LEAVE_GROUP IPV6_DROP_MEMBERSHIP +#endif + static volatile sig_atomic_t g_stop = 0; +#if defined(__GNUC__) +#define MDNS_UNUSED __attribute__((unused)) +#else +#define MDNS_UNUSED +#endif + #ifndef TC_VA_COPY #if defined(va_copy) #define TC_VA_COPY(dst, src) va_copy(dst, src) @@ -297,11 +311,17 @@ struct service_type_set { size_t count; }; +struct mdns_socket_pair { + int ipv4_fd; + int ipv6_fd; +}; + struct query_answer_routes { int smb_ptr; int smb_srv; int smb_txt; int host_a; + int host_aaaa; int adisk_ptr; int adisk_srv; int adisk_txt; @@ -315,6 +335,7 @@ struct query_answer_routes { int snapshot_srv[SNAPSHOT_MAX_RECORDS]; int snapshot_txt[SNAPSHOT_MAX_RECORDS]; int snapshot_a[SNAPSHOT_MAX_RECORDS]; + int snapshot_aaaa[SNAPSHOT_MAX_RECORDS]; }; static int name_equals(const char *a, const char *b); @@ -332,6 +353,7 @@ static int add_rr_txt_strings(uint8_t *buf, size_t *off, size_t cap, const char const char **strings, size_t string_count); static int add_rr_srv(uint8_t *buf, size_t *off, size_t cap, const char *owner, const char *target, uint16_t port, uint32_t ttl); static int add_rr_a(uint8_t *buf, size_t *off, size_t cap, const char *owner, uint32_t ipv4_addr, uint32_t ttl); +static int add_rr_aaaa(uint8_t *buf, size_t *off, size_t cap, const char *owner, const struct in6_addr *ipv6_addr, uint32_t ttl); struct dns_header { uint16_t id; @@ -361,6 +383,7 @@ static const char *ipv4_to_string(uint32_t ipv4_addr, char *out, size_t out_len) #include "auto-ip-common.inc" typedef int (*mdns_collect_iface_contexts_fn)(struct iface_context_set *out, void *userdata); +typedef int (*mdns_collect_link_contexts_fn)(struct link_context_set *out, void *userdata); typedef void (*mdns_sleep_fn)(unsigned int seconds, void *userdata); static int collect_usable_iface_contexts_provider(struct iface_context_set *out, void *userdata) { @@ -368,6 +391,23 @@ static int collect_usable_iface_contexts_provider(struct iface_context_set *out, return collect_usable_iface_contexts(out); } +static int collect_usable_link_contexts_provider(struct link_context_set *out, void *userdata) { + (void)userdata; + return collect_usable_link_contexts(out); +} + +static int collect_usable_advertise_link_contexts_provider(struct link_context_set *out, void *userdata) { + struct link_context_set all_links; + + (void)userdata; + memset(&all_links, 0, sizeof(all_links)); + if (collect_usable_link_contexts(&all_links) != 0) { + return -1; + } + filter_advertise_link_contexts(out, &all_links); + return 0; +} + static void mdns_sleep_provider(unsigned int seconds, void *userdata) { (void)userdata; sleep(seconds); @@ -402,7 +442,7 @@ static int wait_for_auto_iface_contexts_with_provider(struct iface_context_set * return -1; } -static int wait_for_auto_iface_contexts(struct iface_context_set *out, const char *role) { +static int MDNS_UNUSED wait_for_auto_iface_contexts(struct iface_context_set *out, const char *role) { return wait_for_auto_iface_contexts_with_provider(out, role, collect_usable_iface_contexts_provider, @@ -410,6 +450,51 @@ static int wait_for_auto_iface_contexts(struct iface_context_set *out, const cha NULL); } +static int wait_for_auto_link_contexts_with_provider(struct link_context_set *out, + const char *role, + mdns_collect_link_contexts_fn collect_contexts, + mdns_sleep_fn sleep_fn, + void *userdata) { + struct link_context_set first; + + if (collect_contexts == NULL || sleep_fn == NULL) { + return -1; + } + + memset(out, 0, sizeof(*out)); + while (!g_stop) { + memset(&first, 0, sizeof(first)); + if (collect_contexts(&first, userdata) == 0 && first.count > 0) { + fprintf(stderr, "%s auto-ip: first usable address link observed; waiting %ds for network stabilization\n", + role, AUTO_IP_STABILIZE_SECONDS); + sleep_fn(AUTO_IP_STABILIZE_SECONDS, userdata); + if (collect_contexts(out, userdata) == 0 && out->count > 0) { + sort_link_contexts(out); + return 0; + } + fprintf(stderr, "%s auto-ip: usable address links disappeared during stabilization; retrying\n", role); + } + sleep_fn(AUTO_IP_STARTUP_POLL_SECONDS, userdata); + } + return -1; +} + +static int wait_for_auto_link_contexts(struct link_context_set *out, const char *role) { + return wait_for_auto_link_contexts_with_provider(out, + role, + collect_usable_link_contexts_provider, + mdns_sleep_provider, + NULL); +} + +static int wait_for_auto_advertise_link_contexts(struct link_context_set *out, const char *role) { + return wait_for_auto_link_contexts_with_provider(out, + role, + collect_usable_advertise_link_contexts_provider, + mdns_sleep_provider, + NULL); +} + static int print_auto_ip_cidrs_with_provider(FILE *stream, mdns_collect_iface_contexts_fn collect_contexts, void *userdata) { @@ -433,6 +518,100 @@ static int print_auto_ip_cidrs_with_provider(FILE *stream, return EXIT_OK; } +static int link_contexts_need_ipv4_socket(const struct link_context_set *set); +static int link_contexts_need_ipv6_socket(const struct link_context_set *set); + +static int print_smb_bind_interfaces_with_provider(FILE *stream, + mdns_collect_link_contexts_fn collect_contexts, + void *userdata) { + struct link_context_set links; + size_t i; + int has_samba_address = 0; + + if (collect_contexts == NULL) { + return EXIT_AUTO_IP_PROBE_FAILED; + } + + memset(&links, 0, sizeof(links)); + if (collect_contexts(&links, userdata) != 0) { + return EXIT_AUTO_IP_PROBE_FAILED; + } + if (links.count == 0) { + return EXIT_AUTO_IP_UNAVAILABLE; + } + sort_link_contexts(&links); + for (i = 0; i < links.count; i++) { + if (link_context_has_samba_address(&links.links[i])) { + has_samba_address = 1; + break; + } + } + if (!has_samba_address) { + return EXIT_AUTO_IP_UNAVAILABLE; + } + if (print_smb_link_bind_tokens(stream, &links) != 0) { + return EXIT_AUTO_IP_PROBE_FAILED; + } + return EXIT_OK; +} + +static int print_mdns_socket_families_with_provider(FILE *stream, + mdns_collect_link_contexts_fn collect_contexts, + void *userdata) { + struct link_context_set all_links; + struct link_context_set links; + int need_ipv4; + int need_ipv6; + + if (collect_contexts == NULL) { + return EXIT_AUTO_IP_PROBE_FAILED; + } + + memset(&all_links, 0, sizeof(all_links)); + memset(&links, 0, sizeof(links)); + if (collect_contexts(&all_links, userdata) != 0) { + return EXIT_AUTO_IP_PROBE_FAILED; + } + if (all_links.count == 0) { + return EXIT_AUTO_IP_UNAVAILABLE; + } + filter_advertise_link_contexts(&links, &all_links); + if (links.count == 0) { + return EXIT_AUTO_IP_UNAVAILABLE; + } + sort_link_contexts(&links); + need_ipv4 = link_contexts_need_ipv4_socket(&links); + need_ipv6 = link_contexts_need_ipv6_socket(&links); + if (!need_ipv4 && !need_ipv6) { + return EXIT_AUTO_IP_UNAVAILABLE; + } + if (need_ipv4 && fputs("ipv4", stream) == EOF) { + return EXIT_AUTO_IP_PROBE_FAILED; + } + if (need_ipv6) { + if (need_ipv4 && fputc(' ', stream) == EOF) { + return EXIT_AUTO_IP_PROBE_FAILED; + } + if (fputs("ipv6", stream) == EOF) { + return EXIT_AUTO_IP_PROBE_FAILED; + } + } + if (fputc('\n', stream) == EOF) { + return EXIT_AUTO_IP_PROBE_FAILED; + } + return EXIT_OK; +} + +static int open_dualstack_mdns_sockets(int shared_bind, + const struct link_context_set *links, + int log_bind_errors, + struct mdns_socket_pair *out); +static void close_mdns_socket_pair(struct mdns_socket_pair *sockets); +static int set_outbound_multicast_interface(int sockfd, uint32_t ipv4_addr, const char *socket_role, + int log_success, int log_errors); +static int set_outbound_multicast_interface6(int sockfd, unsigned int ifindex, const char *socket_role, + int log_success, int log_errors); + static void log_startup_config(const struct config *cfg, int shared_bind, int auto_ip) { char ipv4_buf[INET_ADDRSTRLEN]; @@ -665,10 +844,14 @@ static void usage(const char *prog) { " %s --save-snapshot [--save-all-snapshot ] [airport identity options]\n" " %s --save-airport-snapshot --instance --host

_airport._tcp service port (default: 5009)\n" " --port Service port (default: 445)\n" " --ttl Record TTL (default: 120)\n", - prog, prog, prog, prog, prog); + prog, prog, prog, prog, prog, prog, prog); } static int append_bytes(uint8_t *buf, size_t *off, size_t cap, const void *src, size_t len) { @@ -1359,8 +1542,8 @@ static int add_service_record_answers(uint8_t *buf, size_t *off, size_t cap, con return 0; } -static int add_snapshot_host_a_record(uint8_t *buf, size_t *off, size_t cap, const struct service_record *record, - uint32_t response_ipv4_addr, uint32_t ttl, int *answers) { +static int MDNS_UNUSED add_snapshot_host_a_record(uint8_t *buf, size_t *off, size_t cap, const struct service_record *record, + uint32_t response_ipv4_addr, uint32_t ttl, int *answers) { if (record->host_fqdn[0] == '\0') { return 0; } @@ -1375,6 +1558,64 @@ static int add_snapshot_host_a_record(uint8_t *buf, size_t *off, size_t cap, con return 0; } +static int append_host_address_records(uint8_t *buf, + size_t *off, + size_t cap, + const char *owner, + const struct link_context *link, + int include_a, + int include_aaaa, + uint32_t ttl, + int *answers) { + size_t i; + + if (owner == NULL || owner[0] == '\0' || link == NULL) { + return 0; + } + if (include_a) { + for (i = 0; i < link->ipv4_count; i++) { + if (add_rr_a(buf, off, cap, owner, link->ipv4[i].addr, ttl) != 0) { + return -1; + } + *answers += 1; + } + } + if (include_aaaa) { + for (i = 0; i < link->ipv6_count; i++) { + if (!runtime_ipv6_is_bindable(&link->ipv6[i].addr)) { + continue; + } + if (add_rr_aaaa(buf, off, cap, owner, &link->ipv6[i].addr, ttl) != 0) { + return -1; + } + *answers += 1; + } + } + return 0; +} + +static int add_snapshot_host_address_records(uint8_t *buf, + size_t *off, + size_t cap, + const struct service_record *record, + const struct link_context *link, + int include_a, + int include_aaaa, + uint32_t ttl, + int *answers) { + if (record->host_fqdn[0] == '\0') { + return 0; + } + if (append_host_address_records(buf, off, cap, record->host_fqdn, link, include_a, include_aaaa, ttl, answers) != 0) { + fprintf(stderr, + "mdns snapshot rr failure: rr=ADDR type=%s instance=%s host=%s port=%u txt_count=%lu packet_len=%lu\n", + record->service_type, record->instance_fqdn, record->host_fqdn, + (unsigned int)record->port, (unsigned long)record->txt_count, (unsigned long)*off); + return -1; + } + return 0; +} + static int add_rr_ptr(uint8_t *buf, size_t *off, size_t cap, const char *owner, const char *target, uint32_t ttl) { size_t rdlength_pos; size_t rdata_start; @@ -1495,6 +1736,18 @@ static int add_rr_a(uint8_t *buf, size_t *off, size_t cap, const char *owner, ui return 0; } +static int add_rr_aaaa(uint8_t *buf, size_t *off, size_t cap, const char *owner, const struct in6_addr *ipv6_addr, uint32_t ttl) { + if (encode_name(buf, off, cap, owner) != 0 || + append_u16(buf, off, cap, DNS_TYPE_AAAA) != 0 || + append_u16(buf, off, cap, DNS_CLASS_IN_UNIQUE) != 0 || + append_u32(buf, off, cap, ttl) != 0 || + append_u16(buf, off, cap, 16) != 0 || + append_bytes(buf, off, cap, ipv6_addr->s6_addr, 16) != 0) { + return -1; + } + return 0; +} + static int hex_encode_bytes_len(char *out, size_t out_len, const char *bytes, size_t src_len) { static const char hex[] = "0123456789abcdef"; size_t i; @@ -1776,7 +2029,11 @@ static int load_snapshot_file(const char *path, struct service_record_set *out) return out->count > 0 ? 0 : -1; } -static int send_query_question(int sockfd, const struct sockaddr_in *dest, const char *qname, uint16_t qtype) { +static int send_query_question_any(int sockfd, + const struct sockaddr *dest, + socklen_t dest_len, + const char *qname, + uint16_t qtype) { uint8_t packet[BUF_SIZE]; struct dns_header hdr; size_t off = sizeof(hdr); @@ -1789,7 +2046,11 @@ static int send_query_question(int sockfd, const struct sockaddr_in *dest, const append_u16(packet, &off, sizeof(packet), DNS_CLASS_IN) != 0) { return -1; } - return sendto_retry(sockfd, packet, off, 0, (const struct sockaddr *)dest, sizeof(*dest)) >= 0 ? 0 : -1; + return sendto_retry(sockfd, packet, off, 0, dest, dest_len) >= 0 ? 0 : -1; +} + +static int send_query_question(int sockfd, const struct sockaddr_in *dest, const char *qname, uint16_t qtype) { + return send_query_question_any(sockfd, (const struct sockaddr *)dest, sizeof(*dest), qname, qtype); } static void parse_txt_rdata(struct service_record *record, const uint8_t *rdata, size_t rdlength) { @@ -1946,6 +2207,58 @@ static int collect_mdns_responses(int sockfd, int seconds, struct service_record return 0; } +static int collect_mdns_responses_pair(const struct mdns_socket_pair *sockets, + int seconds, + struct service_record_set *set, + struct service_type_set *service_types) { + time_t deadline = time(NULL) + seconds; + + while (time(NULL) < deadline) { + fd_set rfds; + struct timeval tv; + uint8_t packet[BUF_SIZE]; + int maxfd = -1; + int selected; + + FD_ZERO(&rfds); + if (sockets->ipv4_fd >= 0) { + FD_SET(sockets->ipv4_fd, &rfds); + if (sockets->ipv4_fd > maxfd) { + maxfd = sockets->ipv4_fd; + } + } + if (sockets->ipv6_fd >= 0) { + FD_SET(sockets->ipv6_fd, &rfds); + if (sockets->ipv6_fd > maxfd) { + maxfd = sockets->ipv6_fd; + } + } + if (maxfd < 0) { + return -1; + } + tv.tv_sec = 1; + tv.tv_usec = 0; + selected = select(maxfd + 1, &rfds, NULL, NULL, &tv); + if (selected <= 0) { + continue; + } + if (sockets->ipv4_fd >= 0 && FD_ISSET(sockets->ipv4_fd, &rfds)) { + ssize_t nread = recvfrom(sockets->ipv4_fd, packet, sizeof(packet), 0, NULL, NULL); + if (nread > 0) { + (void)parse_snapshot_rrs(packet, (size_t)nread, set, service_types); + } + } + if (sockets->ipv6_fd >= 0 && FD_ISSET(sockets->ipv6_fd, &rfds)) { + ssize_t nread = recvfrom(sockets->ipv6_fd, packet, sizeof(packet), 0, NULL, NULL); + if (nread > 0) { + (void)parse_snapshot_rrs(packet, (size_t)nread, set, service_types); + } + } + } + + return 0; +} + static int mac_equals(const char *a, const char *b) { size_t ai = 0; size_t bi = 0; @@ -2115,6 +2428,89 @@ static int capture_mdns_snapshot_raw(struct service_record_set *out, uint32_t ip return out->count > 0 ? 0 : -1; } +static void scoped_mdns_dest6_for_link(struct sockaddr_in6 *out, + const struct sockaddr_in6 *base, + const struct link_context *link) { + *out = *base; + if (link != NULL) { + out->sin6_scope_id = link->ifindex; + } +} + +static void send_capture_query_to_all_links(const struct mdns_socket_pair *sockets, + const struct link_context_set *links, + const struct sockaddr_in *dest4, + const struct sockaddr_in6 *dest6, + const char *qname, + uint16_t qtype) { + size_t i; + + for (i = 0; i < links->count; i++) { + if (sockets->ipv4_fd >= 0 && links->links[i].ipv4_count > 0 && + set_outbound_multicast_interface(sockets->ipv4_fd, links->links[i].ipv4[0].addr, "capture", 0, 0) == 0) { + (void)send_query_question_any(sockets->ipv4_fd, + (const struct sockaddr *)dest4, + sizeof(*dest4), + qname, + qtype); + } + if (sockets->ipv6_fd >= 0 && link_context_has_mdns_ipv6_transport(&links->links[i]) && + set_outbound_multicast_interface6(sockets->ipv6_fd, links->links[i].ifindex, "capture", 0, 0) == 0) { + struct sockaddr_in6 scoped_dest; + scoped_mdns_dest6_for_link(&scoped_dest, dest6, &links->links[i]); + (void)send_query_question_any(sockets->ipv6_fd, + (const struct sockaddr *)&scoped_dest, + sizeof(scoped_dest), + qname, + qtype); + } + } +} + +static int capture_mdns_snapshot_links_raw(struct service_record_set *out, + const struct link_context_set *links) { + struct mdns_socket_pair sockets; + struct sockaddr_in mdns_dest4; + struct sockaddr_in6 mdns_dest6; + size_t i; + struct service_type_set service_types; + + memset(out, 0, sizeof(*out)); + memset(&service_types, 0, sizeof(service_types)); + sockets.ipv4_fd = -1; + sockets.ipv6_fd = -1; + if (open_dualstack_mdns_sockets(1, links, 1, &sockets) != 0) { + return -1; + } + + memset(&mdns_dest4, 0, sizeof(mdns_dest4)); + mdns_dest4.sin_family = AF_INET; + mdns_dest4.sin_port = htons(MDNS_PORT); + mdns_dest4.sin_addr.s_addr = inet_addr(MDNS_GROUP); + + memset(&mdns_dest6, 0, sizeof(mdns_dest6)); + mdns_dest6.sin6_family = AF_INET6; + mdns_dest6.sin6_port = htons(MDNS_PORT); + (void)inet_pton(AF_INET6, MDNS_GROUP_V6, &mdns_dest6.sin6_addr); + + send_capture_query_to_all_links(&sockets, links, &mdns_dest4, &mdns_dest6, "_services._dns-sd._udp.local.", DNS_TYPE_PTR); + (void)collect_mdns_responses_pair(&sockets, SNAPSHOT_CAPTURE_STEP_SECONDS, out, &service_types); + + for (i = 0; i < service_types.count; i++) { + send_capture_query_to_all_links(&sockets, links, &mdns_dest4, &mdns_dest6, service_types.types[i], DNS_TYPE_PTR); + } + (void)collect_mdns_responses_pair(&sockets, SNAPSHOT_CAPTURE_STEP_SECONDS, out, &service_types); + + for (i = 0; i < out->count; i++) { + send_capture_query_to_all_links(&sockets, links, &mdns_dest4, &mdns_dest6, out->records[i].instance_fqdn, DNS_TYPE_SRV); + send_capture_query_to_all_links(&sockets, links, &mdns_dest4, &mdns_dest6, out->records[i].instance_fqdn, DNS_TYPE_TXT); + } + (void)collect_mdns_responses_pair(&sockets, SNAPSHOT_CAPTURE_STEP_SECONDS, out, &service_types); + close_mdns_socket_pair(&sockets); + + return out->count > 0 ? 0 : -1; +} + static int prepare_loaded_snapshot_for_advertising(const struct config *cfg, const struct service_record_set *loaded, struct service_record_set *out) { char matched_host[MAX_LABEL + 1]; @@ -2145,6 +2541,23 @@ static int capture_mdns_snapshot_raw_with_retry(struct service_record_set *out, return -1; } +static int capture_mdns_snapshot_links_with_retry(struct service_record_set *out, + const struct link_context_set *links) { + time_t deadline = time(NULL) + SNAPSHOT_CAPTURE_TIMEOUT_SECONDS; + + do { + if (capture_mdns_snapshot_links_raw(out, links) == 0) { + return 0; + } + if (time(NULL) >= deadline) { + break; + } + sleep(SNAPSHOT_CAPTURE_RETRY_INTERVAL_SECONDS); + } while (time(NULL) < deadline); + + return -1; +} + static int service_records_match(const struct service_record *a, const struct service_record *b) { return strcmp(a->service_type, b->service_type) == 0 && strcmp(a->instance_fqdn, b->instance_fqdn) == 0 && @@ -2196,37 +2609,37 @@ static int capture_mdns_snapshot_auto_with_provider(struct service_record_set *o memset(out, 0, sizeof(*out)); for (i = 0; i < contexts->count; i++) { struct service_record_set captured; - struct service_record_set filtered; char ip_buf[INET_ADDRSTRLEN]; memset(&captured, 0, sizeof(captured)); - memset(&filtered, 0, sizeof(filtered)); fprintf(stderr, "snapshot capture: probing auto-ip context iface=%s ip=%s\n", contexts->contexts[i].name, ipv4_to_string(contexts->contexts[i].ipv4_addr, ip_buf, sizeof(ip_buf))); if (capture_context(&captured, &contexts->contexts[i], userdata) == 0) { - if (require_trusted_snapshot && - prepare_loaded_snapshot_for_advertising(cfg, &captured, &filtered) != 0) { - fprintf(stderr, - "snapshot capture: auto-ip context iface=%s ip=%s did not match local AirPort identity; trying next context\n", - contexts->contexts[i].name, - ipv4_to_string(contexts->contexts[i].ipv4_addr, ip_buf, sizeof(ip_buf))); - continue; - } append_snapshot_records_unique(out, &captured); - fprintf(stderr, "snapshot capture: accepted auto-ip context iface=%s ip=%s records=%lu\n", + fprintf(stderr, "snapshot capture: merged auto-ip context iface=%s ip=%s records=%lu\n", contexts->contexts[i].name, ipv4_to_string(contexts->contexts[i].ipv4_addr, ip_buf, sizeof(ip_buf)), (unsigned long)captured.count); - return out->count > 0 ? 0 : -1; } } - return -1; + if (out->count == 0) { + return -1; + } + if (require_trusted_snapshot) { + struct service_record_set filtered; + memset(&filtered, 0, sizeof(filtered)); + if (prepare_loaded_snapshot_for_advertising(cfg, out, &filtered) != 0) { + fprintf(stderr, "snapshot capture: merged auto-ip records did not match local AirPort identity\n"); + return -1; + } + } + return 0; } -static int capture_mdns_snapshot_auto_with_retry(struct service_record_set *out, - const struct iface_context_set *contexts, - const struct config *cfg, - int require_trusted_snapshot) { +static int MDNS_UNUSED capture_mdns_snapshot_auto_with_retry(struct service_record_set *out, + const struct iface_context_set *contexts, + const struct config *cfg, + int require_trusted_snapshot) { return capture_mdns_snapshot_auto_with_provider(out, contexts, cfg, @@ -2505,9 +2918,9 @@ static int iface_context_set_has_ipv4(const struct iface_context_set *set, uint3 return 0; } -static int prepare_mdns_auto_socket_for_contexts(int sockfd, - const struct iface_context_set *old_contexts, - const struct iface_context_set *new_contexts) { +static int MDNS_UNUSED prepare_mdns_auto_socket_for_contexts(int sockfd, + const struct iface_context_set *old_contexts, + const struct iface_context_set *new_contexts) { size_t i; if (new_contexts->count == 0) { @@ -2551,9 +2964,9 @@ static void drop_mdns_multicast_group_best_effort(int sockfd, uint32_t ipv4_addr #endif } -static void retire_mdns_auto_socket_contexts(int sockfd, - const struct iface_context_set *old_contexts, - const struct iface_context_set *new_contexts) { +static void MDNS_UNUSED retire_mdns_auto_socket_contexts(int sockfd, + const struct iface_context_set *old_contexts, + const struct iface_context_set *new_contexts) { size_t i; for (i = 0; i < old_contexts->count; i++) { @@ -2631,7 +3044,7 @@ static int open_auto_mdns_socket(int shared_bind, const struct iface_context_set return sockfd; } -static int acquire_mdns_auto_socket(int shared_bind, const struct iface_context_set *set) { +static int MDNS_UNUSED acquire_mdns_auto_socket(int shared_bind, const struct iface_context_set *set) { static const unsigned int retry_delays_ms[TAKEOVER_RETRY_COUNT] = {0, 100, 200, 300, 400, 500}; size_t i; int sockfd; @@ -2683,44 +3096,437 @@ static int acquire_mdns_auto_socket(int shared_bind, const struct iface_context_ return -1; } -static void format_dest_addr(const struct sockaddr_in *dest, char *buf, size_t buf_size) { - char ipbuf[INET_ADDRSTRLEN]; +static int link_contexts_need_ipv4_socket(const struct link_context_set *set) { + size_t i; - snprintf(buf, buf_size, "%s:%u", - ipv4_to_string(dest->sin_addr.s_addr, ipbuf, sizeof(ipbuf)), - (unsigned int)ntohs(dest->sin_port)); + for (i = 0; i < set->count; i++) { + if (link_context_has_advertisable_ipv4(&set->links[i])) { + return 1; + } + } + return 0; } -static void log_packet_build_failure(const char *stage, const char *step, size_t packet_len, int answers, - int use_snapshot_records) { - fprintf(stderr, - "mdns packet build failure: stage=%s step=%s packet_len=%lu answers=%d records=%s\n", - stage, - step, - (unsigned long)packet_len, - answers, - use_snapshot_records ? "snapshot" : "generated"); -} +static int link_contexts_need_ipv6_socket(const struct link_context_set *set) { + size_t i; -static void log_snapshot_record_build_failure(const char *stage, const char *step, size_t record_index, - const struct service_record *record, size_t packet_len, int answers) { - fprintf(stderr, - "mdns snapshot build failure: stage=%s step=%s record_index=%lu type=%s instance=%s host=%s port=%u txt_count=%lu packet_len=%lu answers=%d\n", - stage, - step, - (unsigned long)record_index, - record->service_type, - record->instance_fqdn, - record->host_fqdn, - (unsigned int)record->port, - (unsigned long)record->txt_count, - (unsigned long)packet_len, - answers); + for (i = 0; i < set->count; i++) { + if (link_context_has_mdns_ipv6_transport(&set->links[i])) { + return 1; + } + } + return 0; } -static void log_packet_send_failure_detail(const char *stage, const struct sockaddr_in *dest, size_t packet_len, - int answers, int use_snapshot_records, int saved_errno) { - char destbuf[64]; +static void close_mdns_socket_pair(struct mdns_socket_pair *sockets) { + if (sockets->ipv4_fd >= 0) { + close(sockets->ipv4_fd); + sockets->ipv4_fd = -1; + } + if (sockets->ipv6_fd >= 0) { + close(sockets->ipv6_fd); + sockets->ipv6_fd = -1; + } +} + +static int open_bound_mdns_socket6(int shared_bind, int log_bind_errors) { + int sockfd; + int yes = 1; + struct sockaddr_in6 addr; + + sockfd = socket(AF_INET6, SOCK_DGRAM, 0); + if (sockfd < 0) { + if (log_bind_errors) { + perror("socket(AF_INET6)"); + } + return -1; + } + + if (setsockopt(sockfd, IPPROTO_IPV6, IPV6_V6ONLY, &yes, sizeof(yes)) < 0 && log_bind_errors) { + perror("setsockopt(IPV6_V6ONLY)"); + } + if (shared_bind) { + if (setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &yes, sizeof(yes)) < 0) { + perror("setsockopt(SO_REUSEADDR ipv6)"); + close(sockfd); + return -1; + } +#ifdef SO_REUSEPORT + (void)setsockopt(sockfd, SOL_SOCKET, SO_REUSEPORT, &yes, sizeof(yes)); +#endif + } + + memset(&addr, 0, sizeof(addr)); + addr.sin6_family = AF_INET6; + addr.sin6_port = htons(MDNS_PORT); + addr.sin6_addr = in6addr_any; + if (bind(sockfd, (struct sockaddr *)&addr, sizeof(addr)) < 0) { + if (log_bind_errors) { + perror("bind(AF_INET6)"); + } + close(sockfd); + return -1; + } + return sockfd; +} + +static int join_mdns_multicast_group6(int sockfd, unsigned int ifindex, const char *ifname, const char *socket_role) { + struct ipv6_mreq mreq; + + if (ifindex == 0) { + errno = EADDRNOTAVAIL; + return -1; + } + memset(&mreq, 0, sizeof(mreq)); + if (inet_pton(AF_INET6, MDNS_GROUP_V6, &mreq.ipv6mr_multiaddr) != 1) { + errno = EINVAL; + return -1; + } + mreq.ipv6mr_interface = ifindex; + if (setsockopt(sockfd, IPPROTO_IPV6, IPV6_JOIN_GROUP, &mreq, sizeof(mreq)) == 0) { + fprintf(stderr, "mdns %s socket: IPv6 multicast membership iface=%s ifindex=%u\n", + socket_role, ifname, ifindex); + return 0; + } + fprintf(stderr, + "warning: mdns %s socket: IPV6_JOIN_GROUP failed for iface=%s ifindex=%u: %s\n", + socket_role, + ifname, + ifindex, + strerror(errno)); + return -1; +} + +static void drop_mdns_multicast_group6_best_effort(int sockfd, unsigned int ifindex, const char *ifname, const char *socket_role) { +#ifdef IPV6_LEAVE_GROUP + struct ipv6_mreq mreq; + int drop_errno; + + if (ifindex == 0) { + return; + } + memset(&mreq, 0, sizeof(mreq)); + if (inet_pton(AF_INET6, MDNS_GROUP_V6, &mreq.ipv6mr_multiaddr) != 1) { + return; + } + mreq.ipv6mr_interface = ifindex; + if (setsockopt(sockfd, IPPROTO_IPV6, IPV6_LEAVE_GROUP, &mreq, sizeof(mreq)) == 0) { + fprintf(stderr, "mdns %s socket: dropped IPv6 multicast membership iface=%s ifindex=%u\n", + socket_role, ifname, ifindex); + return; + } + drop_errno = errno; + fprintf(stderr, + "warning: mdns %s socket: IPV6_LEAVE_GROUP failed for iface=%s ifindex=%u: %s\n", + socket_role, + ifname, + ifindex, + strerror(drop_errno)); +#else + (void)sockfd; + (void)ifindex; + (void)ifname; + (void)socket_role; +#endif +} + +static int set_outbound_multicast_interface6(int sockfd, unsigned int ifindex, const char *socket_role, + int log_success, int log_errors) { + int hops = 255; + int loop = 1; + + if (ifindex == 0) { + errno = EADDRNOTAVAIL; + return -1; + } + if (setsockopt(sockfd, IPPROTO_IPV6, IPV6_MULTICAST_IF, &ifindex, sizeof(ifindex)) < 0) { + if (log_errors) { + fprintf(stderr, + "warning: mdns %s socket: IPV6_MULTICAST_IF failed for ifindex=%u: %s\n", + socket_role, + ifindex, + strerror(errno)); + } + return -1; + } + (void)setsockopt(sockfd, IPPROTO_IPV6, IPV6_MULTICAST_HOPS, &hops, sizeof(hops)); + (void)setsockopt(sockfd, IPPROTO_IPV6, IPV6_MULTICAST_LOOP, &loop, sizeof(loop)); + if (log_success) { + fprintf(stderr, "mdns %s socket: IPv6 outbound multicast ifindex=%u\n", socket_role, ifindex); + } + return 0; +} + +static int configure_mdns_socket6_for_links(int sockfd, const struct link_context_set *set, const char *socket_role) { + size_t i; + int joined = 0; + + for (i = 0; i < set->count; i++) { + if (!link_context_has_mdns_ipv6_transport(&set->links[i])) { + continue; + } + if (join_mdns_multicast_group6(sockfd, set->links[i].ifindex, set->links[i].name, socket_role) != 0) { + return -1; + } + joined = 1; + } + if (!joined) { + errno = EADDRNOTAVAIL; + return -1; + } + for (i = 0; i < set->count; i++) { + if (link_context_has_mdns_ipv6_transport(&set->links[i])) { + return set_outbound_multicast_interface6(sockfd, set->links[i].ifindex, socket_role, 1, 1); + } + } + return -1; +} + +static int configure_mdns_socket4_for_links(int sockfd, const struct link_context_set *set, const char *socket_role) { + size_t i; + uint32_t first_ipv4 = 0; + + for (i = 0; i < set->count; i++) { + if (set->links[i].ipv4_count == 0) { + continue; + } + if (join_mdns_multicast_group(sockfd, set->links[i].ipv4[0].addr, socket_role) != 0) { + return -1; + } + if (first_ipv4 == 0) { + first_ipv4 = set->links[i].ipv4[0].addr; + } + } + if (first_ipv4 == 0) { + errno = EADDRNOTAVAIL; + return -1; + } + return configure_outbound_multicast_socket(sockfd, first_ipv4, socket_role); +} + +static int link_set_has_ipv4_membership(const struct link_context_set *set, uint32_t ipv4_addr) { + size_t i; + + if (set == NULL) { + return 0; + } + for (i = 0; i < set->count; i++) { + if (set->links[i].ipv4_count > 0 && set->links[i].ipv4[0].addr == ipv4_addr) { + return 1; + } + } + return 0; +} + +static int link_set_has_ipv6_membership(const struct link_context_set *set, unsigned int ifindex) { + size_t i; + + if (set == NULL || ifindex == 0) { + return 0; + } + for (i = 0; i < set->count; i++) { + if (link_context_has_mdns_ipv6_transport(&set->links[i]) && + set->links[i].ifindex == ifindex) { + return 1; + } + } + return 0; +} + +static int prepare_mdns_socket4_memberships(int sockfd, + const struct link_context_set *old_links, + const struct link_context_set *new_links, + const char *socket_role) { + size_t i; + uint32_t first_ipv4 = 0; + + for (i = 0; i < new_links->count; i++) { + if (new_links->links[i].ipv4_count == 0) { + continue; + } + if (first_ipv4 == 0) { + first_ipv4 = new_links->links[i].ipv4[0].addr; + } + if (link_set_has_ipv4_membership(old_links, new_links->links[i].ipv4[0].addr)) { + continue; + } + if (join_mdns_multicast_group(sockfd, new_links->links[i].ipv4[0].addr, socket_role) != 0) { + return -1; + } + } + if (first_ipv4 == 0) { + errno = EADDRNOTAVAIL; + return -1; + } + return configure_outbound_multicast_socket(sockfd, first_ipv4, socket_role); +} + +static int prepare_mdns_socket6_memberships(int sockfd, + const struct link_context_set *old_links, + const struct link_context_set *new_links, + const char *socket_role) { + size_t i; + unsigned int first_ifindex = 0; + + for (i = 0; i < new_links->count; i++) { + if (!link_context_has_mdns_ipv6_transport(&new_links->links[i])) { + continue; + } + if (first_ifindex == 0) { + first_ifindex = new_links->links[i].ifindex; + } + if (link_set_has_ipv6_membership(old_links, new_links->links[i].ifindex)) { + continue; + } + if (join_mdns_multicast_group6(sockfd, new_links->links[i].ifindex, new_links->links[i].name, socket_role) != 0) { + return -1; + } + } + if (first_ifindex == 0) { + errno = EADDRNOTAVAIL; + return -1; + } + return set_outbound_multicast_interface6(sockfd, first_ifindex, socket_role, 1, 1); +} + +static int open_dualstack_mdns_sockets(int shared_bind, + const struct link_context_set *links, + int log_bind_errors, + struct mdns_socket_pair *out) { + int need_ipv4 = link_contexts_need_ipv4_socket(links); + int need_ipv6 = link_contexts_need_ipv6_socket(links); + + out->ipv4_fd = -1; + out->ipv6_fd = -1; + if (!need_ipv4 && !need_ipv6) { + errno = EADDRNOTAVAIL; + return -1; + } + if (need_ipv4) { + out->ipv4_fd = open_bound_mdns_socket(shared_bind, log_bind_errors); + if (out->ipv4_fd < 0 || + configure_mdns_socket4_for_links(out->ipv4_fd, links, "runtime") != 0) { + close_mdns_socket_pair(out); + return -1; + } + } + if (need_ipv6) { + out->ipv6_fd = open_bound_mdns_socket6(shared_bind, log_bind_errors); + if (out->ipv6_fd < 0 || + configure_mdns_socket6_for_links(out->ipv6_fd, links, "runtime") != 0) { + close_mdns_socket_pair(out); + return -1; + } + } + return 0; +} + +static int acquire_dualstack_mdns_sockets(int shared_bind, + const struct link_context_set *links, + struct mdns_socket_pair *out) { + static const unsigned int retry_delays_ms[TAKEOVER_RETRY_COUNT] = {0, 100, 200, 300, 400, 500}; + size_t i; + + for (i = 0; i < TAKEOVER_RETRY_COUNT; i++) { + kill_mdnsresponder(SIGTERM); + sleep_millis(retry_delays_ms[i]); + if (open_dualstack_mdns_sockets(shared_bind, links, 0, out) == 0) { + if (mdns_takeover_confirmed(shared_bind)) { + fprintf(stderr, + shared_bind + ? "mDNS dual-stack shared bind established after SIGTERM + %ums\n" + : "mDNS dual-stack takeover established after SIGTERM + %ums\n", + retry_delays_ms[i]); + return 0; + } + fprintf(stderr, "mDNS dual-stack sockets acquired after SIGTERM + %ums but Apple mDNSResponder is still alive; retrying\n", + retry_delays_ms[i]); + close_mdns_socket_pair(out); + } + } + + for (i = 0; i < TAKEOVER_RETRY_COUNT; i++) { + kill_mdnsresponder(SIGKILL); + sleep_millis(retry_delays_ms[i]); + if (open_dualstack_mdns_sockets(shared_bind, links, 0, out) == 0) { + if (mdns_takeover_confirmed(shared_bind)) { + fprintf(stderr, + shared_bind + ? "mDNS dual-stack shared bind established after SIGKILL + %ums\n" + : "mDNS dual-stack takeover established after SIGKILL + %ums\n", + retry_delays_ms[i]); + return 0; + } + fprintf(stderr, "mDNS dual-stack sockets acquired after SIGKILL + %ums but Apple mDNSResponder is still alive; retrying\n", + retry_delays_ms[i]); + close_mdns_socket_pair(out); + } + } + + if (!shared_bind && mdnsresponder_is_alive()) { + fprintf(stderr, "mDNS dual-stack takeover failed: Apple mDNSResponder is still alive after retry ladder\n"); + } else { + fprintf(stderr, "mDNS dual-stack takeover failed: could not acquire required UDP %d sockets\n", MDNS_PORT); + } + errno = EADDRINUSE; + return -1; +} + +static void format_dest_addr(const struct sockaddr_in *dest, char *buf, size_t buf_size) { + char ipbuf[INET_ADDRSTRLEN]; + + snprintf(buf, buf_size, "%s:%u", + ipv4_to_string(dest->sin_addr.s_addr, ipbuf, sizeof(ipbuf)), + (unsigned int)ntohs(dest->sin_port)); +} + +static void format_sockaddr_addr(const struct sockaddr *dest, char *buf, size_t buf_size) { + if (dest->sa_family == AF_INET6) { + const struct sockaddr_in6 *sin6 = (const struct sockaddr_in6 *)dest; + char ipbuf[INET6_ADDRSTRLEN]; + const char *printed = inet_ntop(AF_INET6, &sin6->sin6_addr, ipbuf, sizeof(ipbuf)); + if (printed == NULL) { + printed = "invalid"; + } + snprintf(buf, buf_size, "[%s%%%u]:%u", + printed, + sin6->sin6_scope_id, + (unsigned int)ntohs(sin6->sin6_port)); + return; + } + format_dest_addr((const struct sockaddr_in *)dest, buf, buf_size); +} + +static void log_packet_build_failure(const char *stage, const char *step, size_t packet_len, int answers, + int use_snapshot_records) { + fprintf(stderr, + "mdns packet build failure: stage=%s step=%s packet_len=%lu answers=%d records=%s\n", + stage, + step, + (unsigned long)packet_len, + answers, + use_snapshot_records ? "snapshot" : "generated"); +} + +static void log_snapshot_record_build_failure(const char *stage, const char *step, size_t record_index, + const struct service_record *record, size_t packet_len, int answers) { + fprintf(stderr, + "mdns snapshot build failure: stage=%s step=%s record_index=%lu type=%s instance=%s host=%s port=%u txt_count=%lu packet_len=%lu answers=%d\n", + stage, + step, + (unsigned long)record_index, + record->service_type, + record->instance_fqdn, + record->host_fqdn, + (unsigned int)record->port, + (unsigned long)record->txt_count, + (unsigned long)packet_len, + answers); +} + +static void MDNS_UNUSED log_packet_send_failure_detail(const char *stage, const struct sockaddr_in *dest, size_t packet_len, + int answers, int use_snapshot_records, int saved_errno) { + char destbuf[64]; format_dest_addr(dest, destbuf, sizeof(destbuf)); fprintf(stderr, @@ -2734,8 +3540,25 @@ static void log_packet_send_failure_detail(const char *stage, const struct socka strerror(saved_errno)); } -static int send_dns_packet(const char *stage, int sockfd, const uint8_t *buf, size_t packet_len, - const struct sockaddr_in *dest, int answers, int use_snapshot_records) { +static void log_packet_send_failure_detail_any(const char *stage, const struct sockaddr *dest, size_t packet_len, + int answers, int use_snapshot_records, int saved_errno) { + char destbuf[96]; + + format_sockaddr_addr(dest, destbuf, sizeof(destbuf)); + fprintf(stderr, + "mdns packet send failure: stage=%s dest=%s packet_len=%lu answers=%d records=%s errno=%d (%s)\n", + stage, + destbuf, + (unsigned long)packet_len, + answers, + use_snapshot_records ? "snapshot" : "generated", + saved_errno, + strerror(saved_errno)); +} + +static int send_dns_packet_any(const char *stage, int sockfd, const uint8_t *buf, size_t packet_len, + const struct sockaddr *dest, socklen_t dest_len, + int answers, int use_snapshot_records) { static int logged_success_announcement = 0; static int logged_success_reply = 0; @@ -2743,26 +3566,26 @@ static int send_dns_packet(const char *stage, int sockfd, const uint8_t *buf, si int saved_errno; errno = 0; - sent = sendto_retry(sockfd, buf, packet_len, 0, (const struct sockaddr *)dest, sizeof(*dest)); + sent = sendto_retry(sockfd, buf, packet_len, 0, dest, dest_len); saved_errno = errno; if (sent < 0) { errno = saved_errno; - log_packet_send_failure_detail(stage, dest, packet_len, answers, use_snapshot_records, saved_errno); + log_packet_send_failure_detail_any(stage, dest, packet_len, answers, use_snapshot_records, saved_errno); return -1; } if (strcmp(stage, "query_response") == 0) { if (!logged_success_reply) { - char destbuf[64]; - format_dest_addr(dest, destbuf, sizeof(destbuf)); + char destbuf[96]; + format_sockaddr_addr(dest, destbuf, sizeof(destbuf)); fprintf(stderr, "mdns packet send success: stage=%s dest=%s packet_len=%lu answers=%d\n", stage, destbuf, (unsigned long)packet_len, answers); logged_success_reply = 1; } } else if (!logged_success_announcement) { - char destbuf[64]; - format_dest_addr(dest, destbuf, sizeof(destbuf)); + char destbuf[96]; + format_sockaddr_addr(dest, destbuf, sizeof(destbuf)); fprintf(stderr, "mdns packet send success: stage=%s dest=%s packet_len=%lu answers=%d records=%s\n", stage, destbuf, (unsigned long)packet_len, answers, @@ -2773,6 +3596,18 @@ static int send_dns_packet(const char *stage, int sockfd, const uint8_t *buf, si return 0; } +static int send_dns_packet(const char *stage, int sockfd, const uint8_t *buf, size_t packet_len, + const struct sockaddr_in *dest, int answers, int use_snapshot_records) { + return send_dns_packet_any(stage, + sockfd, + buf, + packet_len, + (const struct sockaddr *)dest, + sizeof(*dest), + answers, + use_snapshot_records); +} + static int add_adisk_records(uint8_t *buf, size_t *off, size_t cap, const struct config *cfg, uint32_t ttl, int *answers) { char instance_fqdn[MAX_NAME]; char txt1[128]; @@ -2868,8 +3703,8 @@ static void init_announcement_packet(size_t *off, int *answers) { *answers = 0; } -static int finalize_and_send_announcement_packet(int sockfd, uint8_t *buf, size_t off, int answers, - const struct sockaddr_in *dest, int use_snapshot_records) { +static int MDNS_UNUSED finalize_and_send_announcement_packet(int sockfd, uint8_t *buf, size_t off, int answers, + const struct sockaddr_in *dest, int use_snapshot_records) { struct dns_header hdr; if (answers <= 0) { @@ -2883,8 +3718,30 @@ static int finalize_and_send_announcement_packet(int sockfd, uint8_t *buf, size_ return send_dns_packet("announcement", sockfd, buf, off, dest, answers, use_snapshot_records); } +static int finalize_and_send_announcement_packet_any(int sockfd, + uint8_t *buf, + size_t off, + int answers, + const struct sockaddr *dest, + socklen_t dest_len, + int use_snapshot_records) { + struct dns_header hdr; + + if (answers <= 0) { + return 0; + } + + memset(&hdr, 0, sizeof(hdr)); + hdr.flags = htons(DNS_FLAG_QR | DNS_FLAG_AA); + hdr.ancount = htons((uint16_t)answers); + memcpy(buf, &hdr, sizeof(hdr)); + return send_dns_packet_any("announcement", sockfd, buf, off, dest, dest_len, answers, use_snapshot_records); +} + static int append_generated_base_records(uint8_t *buf, size_t *off, size_t cap, const struct config *cfg, - uint32_t response_ipv4_addr, uint32_t ttl, int *answers) { + const struct link_context *response_link, + int include_a, int include_aaaa, + uint32_t ttl, int *answers) { char instance_fqdn[MAX_NAME]; if (smb_enabled(cfg)) { @@ -2898,10 +3755,9 @@ static int append_generated_base_records(uint8_t *buf, size_t *off, size_t cap, } *answers += 3; } - if (add_rr_a(buf, off, cap, cfg->host_fqdn, response_ipv4_addr, ttl) != 0) { + if (append_host_address_records(buf, off, cap, cfg->host_fqdn, response_link, include_a, include_aaaa, ttl, answers) != 0) { return -1; } - *answers += 1; if (add_adisk_records(buf, off, cap, cfg, ttl, answers) != 0) { return -1; } @@ -2932,9 +3788,14 @@ static int remember_announced_host(char announced_hosts[][MAX_NAME], size_t *ann return 0; } -static int send_announcement(int sockfd, const struct sockaddr_in *dest, const struct config *cfg, - uint32_t response_ipv4_addr, uint32_t ttl, - const struct service_record_set *snapshot_records, int use_snapshot_records) { +static int send_announcement_any(int sockfd, + const struct sockaddr *dest, + socklen_t dest_len, + const struct config *cfg, + const struct link_context *response_link, + uint32_t ttl, + const struct service_record_set *snapshot_records, + int use_snapshot_records) { uint8_t buf[BUF_SIZE]; size_t off; int answers; @@ -2944,12 +3805,12 @@ static int send_announcement(int sockfd, const struct sockaddr_in *dest, const s static int logged_duplicate_host_suppression = 0; init_announcement_packet(&off, &answers); - if (append_generated_base_records(buf, &off, sizeof(buf), cfg, response_ipv4_addr, ttl, &answers) != 0) { + if (append_generated_base_records(buf, &off, sizeof(buf), cfg, response_link, 1, 1, ttl, &answers) != 0) { log_packet_build_failure("announcement", "add_core_records", off, answers, use_snapshot_records); return -1; } if (use_snapshot_records) { - if (finalize_and_send_announcement_packet(sockfd, buf, off, answers, dest, use_snapshot_records) != 0) { + if (finalize_and_send_announcement_packet_any(sockfd, buf, off, answers, dest, dest_len, use_snapshot_records) != 0) { return -1; } for (i = 0; i < snapshot_records->count; i++) { @@ -2973,14 +3834,14 @@ static int send_announcement(int sockfd, const struct sockaddr_in *dest, const s if (include_host_a) { before_host_a_off = off; before_host_a_answers = answers; - if (add_snapshot_host_a_record(buf, &off, sizeof(buf), &snapshot_records->records[i], response_ipv4_addr, ttl, &answers) != 0) { + if (add_snapshot_host_address_records(buf, &off, sizeof(buf), &snapshot_records->records[i], response_link, 1, 1, ttl, &answers) != 0) { off = before_host_a_off; answers = before_host_a_answers; - if (finalize_and_send_announcement_packet(sockfd, buf, off, answers, dest, use_snapshot_records) != 0) { + if (finalize_and_send_announcement_packet_any(sockfd, buf, off, answers, dest, dest_len, use_snapshot_records) != 0) { return -1; } init_announcement_packet(&off, &answers); - if (add_snapshot_host_a_record(buf, &off, sizeof(buf), &snapshot_records->records[i], response_ipv4_addr, ttl, &answers) != 0) { + if (add_snapshot_host_address_records(buf, &off, sizeof(buf), &snapshot_records->records[i], response_link, 1, 1, ttl, &answers) != 0) { log_snapshot_record_build_failure("announcement", "add_snapshot_host_a_record", i, &snapshot_records->records[i], off, answers); log_packet_build_failure("announcement", "add_snapshot_host_a_record", off, answers, use_snapshot_records); @@ -3000,7 +3861,7 @@ static int send_announcement(int sockfd, const struct sockaddr_in *dest, const s snapshot_records->records[i].instance_fqdn); logged_duplicate_host_suppression = 1; } - if (finalize_and_send_announcement_packet(sockfd, buf, off, answers, dest, use_snapshot_records) != 0) { + if (finalize_and_send_announcement_packet_any(sockfd, buf, off, answers, dest, dest_len, use_snapshot_records) != 0) { return -1; } } @@ -3010,7 +3871,7 @@ static int send_announcement(int sockfd, const struct sockaddr_in *dest, const s if (add_airport_records(buf, &off, sizeof(buf), cfg, ttl, &answers) != 0) { off = before_airport_off; answers = before_airport_answers; - if (finalize_and_send_announcement_packet(sockfd, buf, off, answers, dest, use_snapshot_records) != 0) { + if (finalize_and_send_announcement_packet_any(sockfd, buf, off, answers, dest, dest_len, use_snapshot_records) != 0) { return -1; } init_announcement_packet(&off, &answers); @@ -3019,20 +3880,33 @@ static int send_announcement(int sockfd, const struct sockaddr_in *dest, const s return -1; } } - if (finalize_and_send_announcement_packet(sockfd, buf, off, answers, dest, use_snapshot_records) != 0) { + if (finalize_and_send_announcement_packet_any(sockfd, buf, off, answers, dest, dest_len, use_snapshot_records) != 0) { return -1; } } return 0; } +static int send_announcement(int sockfd, const struct sockaddr_in *dest, const struct config *cfg, + const struct link_context *response_link, uint32_t ttl, + const struct service_record_set *snapshot_records, int use_snapshot_records) { + return send_announcement_any(sockfd, + (const struct sockaddr *)dest, + sizeof(*dest), + cfg, + response_link, + ttl, + snapshot_records, + use_snapshot_records); +} + static int query_routes_have_destination(const struct query_answer_routes *routes, const struct service_record_set *snapshot_records, int use_snapshot_records, int route) { size_t j; - if ((routes->smb_ptr | routes->smb_srv | routes->smb_txt | routes->host_a | + if ((routes->smb_ptr | routes->smb_srv | routes->smb_txt | routes->host_a | routes->host_aaaa | routes->adisk_ptr | routes->adisk_srv | routes->adisk_txt | routes->device_info_ptr | routes->device_info_srv | routes->device_info_txt | routes->airport_ptr | routes->airport_srv | routes->airport_txt) & route) { @@ -3043,7 +3917,7 @@ static int query_routes_have_destination(const struct query_answer_routes *route } for (j = 0; j < snapshot_records->count; j++) { if ((routes->snapshot_ptr[j] | routes->snapshot_srv[j] | - routes->snapshot_txt[j] | routes->snapshot_a[j]) & route) { + routes->snapshot_txt[j] | routes->snapshot_a[j] | routes->snapshot_aaaa[j]) & route) { return 1; } } @@ -3058,7 +3932,7 @@ static int build_query_response_packet(uint8_t *reply, size_t reply_cap, size_t const char *device_info_instance_fqdn, const char *airport_instance_fqdn, const struct config *cfg, - uint32_t response_ipv4_addr, + const struct link_context *response_link, const struct service_record_set *snapshot_records, int use_snapshot_records) { struct dns_header hdr; @@ -3197,11 +4071,16 @@ static int build_query_response_packet(uint8_t *reply, size_t reply_cap, size_t } } if (routes->host_a & route) { - if (add_rr_a(reply, &off, reply_cap, cfg->host_fqdn, response_ipv4_addr, cfg->ttl) != 0) { + if (append_host_address_records(reply, &off, reply_cap, cfg->host_fqdn, response_link, 1, 0, cfg->ttl, &answers) != 0) { log_packet_build_failure("query_response", "add_a", off, answers, use_snapshot_records); return -1; } - answers++; + } + if (routes->host_aaaa & route) { + if (append_host_address_records(reply, &off, reply_cap, cfg->host_fqdn, response_link, 0, 1, cfg->ttl, &answers) != 0) { + log_packet_build_failure("query_response", "add_aaaa", off, answers, use_snapshot_records); + return -1; + } } if (use_snapshot_records) { @@ -3254,9 +4133,11 @@ static int build_query_response_packet(uint8_t *reply, size_t reply_cap, size_t } answers++; } - if ((routes->snapshot_a[j] & route) && record->host_fqdn[0] != '\0' && + if (((routes->snapshot_a[j] | routes->snapshot_aaaa[j]) & route) && record->host_fqdn[0] != '\0' && !host_already_announced(announced_hosts, announced_host_count, record->host_fqdn)) { - if (add_rr_a(reply, &off, reply_cap, record->host_fqdn, response_ipv4_addr, cfg->ttl) != 0) { + int include_a = (routes->snapshot_a[j] & route) != 0; + int include_aaaa = (routes->snapshot_aaaa[j] & route) != 0; + if (add_snapshot_host_address_records(reply, &off, reply_cap, record, response_link, include_a, include_aaaa, cfg->ttl, &answers) != 0) { log_snapshot_record_build_failure("query_response", "add_snapshot_a", j, record, off, answers); log_packet_build_failure("query_response", "add_snapshot_a", off, answers, use_snapshot_records); return -1; @@ -3265,7 +4146,6 @@ static int build_query_response_packet(uint8_t *reply, size_t reply_cap, size_t log_packet_build_failure("query_response", "remember_snapshot_a_host", off, answers, use_snapshot_records); return -1; } - answers++; } } } @@ -3277,10 +4157,17 @@ static int build_query_response_packet(uint8_t *reply, size_t reply_cap, size_t return 0; } -static int handle_query(int sockfd, const uint8_t *packet, size_t packet_len, - const struct sockaddr_in *multicast_dest, const struct sockaddr_in *source, - const struct config *cfg, uint32_t response_ipv4_addr, - const struct service_record_set *snapshot_records, int use_snapshot_records) { +static int handle_query_any(int sockfd, + const uint8_t *packet, + size_t packet_len, + const struct sockaddr *multicast_dest, + socklen_t multicast_dest_len, + const struct sockaddr *source, + socklen_t source_len, + const struct config *cfg, + const struct link_context *response_link, + const struct service_record_set *snapshot_records, + int use_snapshot_records) { struct dns_header hdr; size_t cursor = sizeof(struct dns_header); uint16_t qdcount; @@ -3361,6 +4248,7 @@ static int handle_query(int sockfd, const uint8_t *packet, size_t packet_len, routes.smb_srv |= reply_route; routes.smb_txt |= reply_route; routes.host_a |= reply_route; + routes.host_aaaa |= reply_route; } else if (adisk_enabled(cfg) && name_equals(qname, cfg->adisk_service_type) && (qtype == DNS_TYPE_PTR || qtype == DNS_TYPE_ANY)) { @@ -3368,6 +4256,7 @@ static int handle_query(int sockfd, const uint8_t *packet, size_t packet_len, routes.adisk_srv |= reply_route; routes.adisk_txt |= reply_route; routes.host_a |= reply_route; + routes.host_aaaa |= reply_route; } else if (cfg->device_model[0] != '\0' && name_equals(qname, cfg->device_info_service_type) && (qtype == DNS_TYPE_PTR || qtype == DNS_TYPE_ANY)) { @@ -3375,6 +4264,7 @@ static int handle_query(int sockfd, const uint8_t *packet, size_t packet_len, routes.device_info_srv |= reply_route; routes.device_info_txt |= reply_route; routes.host_a |= reply_route; + routes.host_aaaa |= reply_route; } else if (!use_snapshot_records && is_airport_enabled(cfg) && name_equals(qname, cfg->airport_service_type) && (qtype == DNS_TYPE_PTR || qtype == DNS_TYPE_ANY)) { @@ -3382,10 +4272,12 @@ static int handle_query(int sockfd, const uint8_t *packet, size_t packet_len, routes.airport_srv |= reply_route; routes.airport_txt |= reply_route; routes.host_a |= reply_route; + routes.host_aaaa |= reply_route; } else if (smb_enabled(cfg) && name_equals(qname, instance_fqdn)) { if (qtype == DNS_TYPE_SRV || qtype == DNS_TYPE_ANY) { routes.smb_srv |= reply_route; routes.host_a |= reply_route; + routes.host_aaaa |= reply_route; } if (qtype == DNS_TYPE_TXT || qtype == DNS_TYPE_ANY) { routes.smb_txt |= reply_route; @@ -3395,6 +4287,7 @@ static int handle_query(int sockfd, const uint8_t *packet, size_t packet_len, if (qtype == DNS_TYPE_SRV || qtype == DNS_TYPE_ANY) { routes.adisk_srv |= reply_route; routes.host_a |= reply_route; + routes.host_aaaa |= reply_route; } if (qtype == DNS_TYPE_TXT || qtype == DNS_TYPE_ANY) { routes.adisk_txt |= reply_route; @@ -3404,6 +4297,7 @@ static int handle_query(int sockfd, const uint8_t *packet, size_t packet_len, if (qtype == DNS_TYPE_SRV || qtype == DNS_TYPE_ANY) { routes.device_info_srv |= reply_route; routes.host_a |= reply_route; + routes.host_aaaa |= reply_route; } if (qtype == DNS_TYPE_TXT || qtype == DNS_TYPE_ANY) { routes.device_info_txt |= reply_route; @@ -3413,12 +4307,18 @@ static int handle_query(int sockfd, const uint8_t *packet, size_t packet_len, if (qtype == DNS_TYPE_SRV || qtype == DNS_TYPE_ANY) { routes.airport_srv |= reply_route; routes.host_a |= reply_route; + routes.host_aaaa |= reply_route; } if (qtype == DNS_TYPE_TXT || qtype == DNS_TYPE_ANY) { routes.airport_txt |= reply_route; } } else if (name_equals(qname, cfg->host_fqdn) && (qtype == DNS_TYPE_A || qtype == DNS_TYPE_ANY)) { routes.host_a |= reply_route; + if (qtype == DNS_TYPE_ANY) { + routes.host_aaaa |= reply_route; + } + } else if (name_equals(qname, cfg->host_fqdn) && qtype == DNS_TYPE_AAAA) { + routes.host_aaaa |= reply_route; } else if (use_snapshot_records) { size_t j; for (j = 0; j < snapshot_records->count; j++) { @@ -3431,16 +4331,23 @@ static int handle_query(int sockfd, const uint8_t *packet, size_t packet_len, routes.snapshot_srv[j] |= reply_route; routes.snapshot_txt[j] |= reply_route; routes.snapshot_a[j] |= reply_route; + routes.snapshot_aaaa[j] |= reply_route; } else if (name_equals(qname, record->instance_fqdn)) { if (qtype == DNS_TYPE_SRV || qtype == DNS_TYPE_ANY) { routes.snapshot_srv[j] |= reply_route; routes.snapshot_a[j] |= reply_route; + routes.snapshot_aaaa[j] |= reply_route; } if (qtype == DNS_TYPE_TXT || qtype == DNS_TYPE_ANY) { routes.snapshot_txt[j] |= reply_route; } } else if (name_equals(qname, record->host_fqdn) && (qtype == DNS_TYPE_A || qtype == DNS_TYPE_ANY)) { routes.snapshot_a[j] |= reply_route; + if (qtype == DNS_TYPE_ANY) { + routes.snapshot_aaaa[j] |= reply_route; + } + } else if (name_equals(qname, record->host_fqdn) && qtype == DNS_TYPE_AAAA) { + routes.snapshot_aaaa[j] |= reply_route; } } } @@ -3451,10 +4358,10 @@ static int handle_query(int sockfd, const uint8_t *packet, size_t packet_len, int answers; if (build_query_response_packet(reply, sizeof(reply), &reply_len, &answers, query_id, MDNS_REPLY_UNICAST, &routes, instance_fqdn, adisk_instance_fqdn, device_info_instance_fqdn, - airport_instance_fqdn, cfg, response_ipv4_addr, + airport_instance_fqdn, cfg, response_link, snapshot_records, use_snapshot_records) != 0 || (answers > 0 && - send_dns_packet("query_response", sockfd, reply, reply_len, source, answers, use_snapshot_records) != 0)) { + send_dns_packet_any("query_response", sockfd, reply, reply_len, source, source_len, answers, use_snapshot_records) != 0)) { status = -1; } } @@ -3464,10 +4371,10 @@ static int handle_query(int sockfd, const uint8_t *packet, size_t packet_len, int answers; if (build_query_response_packet(reply, sizeof(reply), &reply_len, &answers, 0, MDNS_REPLY_MULTICAST, &routes, instance_fqdn, adisk_instance_fqdn, device_info_instance_fqdn, - airport_instance_fqdn, cfg, response_ipv4_addr, + airport_instance_fqdn, cfg, response_link, snapshot_records, use_snapshot_records) != 0 || (answers > 0 && - send_dns_packet("query_response", sockfd, reply, reply_len, multicast_dest, answers, use_snapshot_records) != 0)) { + send_dns_packet_any("query_response", sockfd, reply, reply_len, multicast_dest, multicast_dest_len, answers, use_snapshot_records) != 0)) { status = -1; } } @@ -3475,8 +4382,25 @@ static int handle_query(int sockfd, const uint8_t *packet, size_t packet_len, return status; } -static const struct iface_context *select_response_context(const struct iface_context_set *contexts, - const struct sockaddr_in *source) { +static int handle_query(int sockfd, const uint8_t *packet, size_t packet_len, + const struct sockaddr_in *multicast_dest, const struct sockaddr_in *source, + const struct config *cfg, const struct link_context *response_link, + const struct service_record_set *snapshot_records, int use_snapshot_records) { + return handle_query_any(sockfd, + packet, + packet_len, + (const struct sockaddr *)multicast_dest, + sizeof(*multicast_dest), + (const struct sockaddr *)source, + sizeof(*source), + cfg, + response_link, + snapshot_records, + use_snapshot_records); +} + +static const struct iface_context MDNS_UNUSED *select_response_context(const struct iface_context_set *contexts, + const struct sockaddr_in *source) { size_t i; if (contexts->count == 0) { @@ -3492,6 +4416,15 @@ static const struct iface_context *select_response_context(const struct iface_co return &contexts->contexts[0]; } +static void link_context_from_iface_context(struct link_context *out, const struct iface_context *ctx) { + memset(out, 0, sizeof(*out)); + strncpy(out->name, ctx->name, sizeof(out->name) - 1); + out->flags = ctx->flags; + out->ipv4[0].addr = ctx->ipv4_addr; + out->ipv4[0].netmask = ctx->netmask; + out->ipv4_count = 1; +} + static int set_context_outbound_interface(int sockfd, const struct iface_context *ctx) { return set_outbound_multicast_interface(sockfd, ctx->ipv4_addr, "runtime", 0, 0); } @@ -3502,34 +4435,39 @@ static int send_context_announcement(int sockfd, const struct config *cfg, const struct service_record_set *snapshot_records, int use_snapshot_records) { + struct link_context link; + if (set_context_outbound_interface(sockfd, ctx) != 0) { return -1; } - return send_announcement(sockfd, dest, cfg, ctx->ipv4_addr, cfg->ttl, snapshot_records, use_snapshot_records); + link_context_from_iface_context(&link, ctx); + return send_announcement(sockfd, dest, cfg, &link, cfg->ttl, snapshot_records, use_snapshot_records); } -static void send_context_goodbyes(int sockfd, - struct iface_context_set *contexts, - const struct sockaddr_in *dest, - const struct config *cfg, - const struct service_record_set *snapshot_records, - int use_snapshot_records) { +static void MDNS_UNUSED send_context_goodbyes(int sockfd, + struct iface_context_set *contexts, + const struct sockaddr_in *dest, + const struct config *cfg, + const struct service_record_set *snapshot_records, + int use_snapshot_records) { size_t i; for (i = 0; i < contexts->count; i++) { if (set_context_outbound_interface(sockfd, &contexts->contexts[i]) == 0) { - (void)send_announcement(sockfd, dest, cfg, contexts->contexts[i].ipv4_addr, 0, snapshot_records, use_snapshot_records); + struct link_context link; + link_context_from_iface_context(&link, &contexts->contexts[i]); + (void)send_announcement(sockfd, dest, cfg, &link, 0, snapshot_records, use_snapshot_records); } } } -static void send_context_goodbyes_for_missing(int sockfd, - struct iface_context_set *old_contexts, - const struct iface_context_set *active_contexts, - const struct sockaddr_in *dest, - const struct config *cfg, - const struct service_record_set *snapshot_records, - int use_snapshot_records) { +static void MDNS_UNUSED send_context_goodbyes_for_missing(int sockfd, + struct iface_context_set *old_contexts, + const struct iface_context_set *active_contexts, + const struct sockaddr_in *dest, + const struct config *cfg, + const struct service_record_set *snapshot_records, + int use_snapshot_records) { size_t i; for (i = 0; i < old_contexts->count; i++) { @@ -3537,18 +4475,20 @@ static void send_context_goodbyes_for_missing(int sockfd, continue; } if (set_context_outbound_interface(sockfd, &old_contexts->contexts[i]) == 0) { - (void)send_announcement(sockfd, dest, cfg, old_contexts->contexts[i].ipv4_addr, 0, snapshot_records, use_snapshot_records); + struct link_context link; + link_context_from_iface_context(&link, &old_contexts->contexts[i]); + (void)send_announcement(sockfd, dest, cfg, &link, 0, snapshot_records, use_snapshot_records); } } } -static void announce_all_contexts(int sockfd, - struct iface_context_set *contexts, - const struct sockaddr_in *dest, - const struct config *cfg, - const struct service_record_set *snapshot_records, - int use_snapshot_records, - const char *stage) { +static void MDNS_UNUSED announce_all_contexts(int sockfd, + struct iface_context_set *contexts, + const struct sockaddr_in *dest, + const struct config *cfg, + const struct service_record_set *snapshot_records, + int use_snapshot_records, + const char *stage) { size_t i; for (i = 0; i < contexts->count; i++) { @@ -3564,6 +4504,318 @@ static void announce_all_contexts(int sockfd, } } +static int source_matches_link_ipv4_subnet(uint32_t source_ipv4_addr, const struct link_context *link) { + size_t i; + + for (i = 0; i < link->ipv4_count; i++) { + uint32_t netmask = link->ipv4[i].netmask; + if (netmask == 0) { + if (source_ipv4_addr == link->ipv4[i].addr) { + return 1; + } + } else if ((source_ipv4_addr & netmask) == (link->ipv4[i].addr & netmask)) { + return 1; + } + } + return 0; +} + +static const struct link_context *select_response_link_ipv4(const struct link_context_set *links, + const struct sockaddr_in *source) { + size_t i; + + if (links->count == 0) { + return NULL; + } + if (source != NULL && source->sin_addr.s_addr != 0) { + for (i = 0; i < links->count; i++) { + if (source_matches_link_ipv4_subnet(source->sin_addr.s_addr, &links->links[i])) { + return &links->links[i]; + } + } + } + return &links->links[0]; +} + +static const struct link_context *select_response_link_ipv6(const struct link_context_set *links, + const struct sockaddr_in6 *source) { + size_t i; + + if (links->count == 0) { + return NULL; + } + if (source != NULL) { + if (source->sin6_scope_id != 0) { + for (i = 0; i < links->count; i++) { + if (links->links[i].ifindex == source->sin6_scope_id) { + return &links->links[i]; + } + } + } + for (i = 0; i < links->count; i++) { + size_t j; + for (j = 0; j < links->links[i].ipv6_count; j++) { + if (links->links[i].ipv6[j].link_local) { + continue; + } + if (ipv6_prefix_matches(&source->sin6_addr, + &links->links[i].ipv6[j].addr, + links->links[i].ipv6[j].prefix_len)) { + return &links->links[i]; + } + } + } + } + return links->count == 1 ? &links->links[0] : &links->links[0]; +} + +static int set_link_outbound_interface4(int sockfd, const struct link_context *link) { + if (link->ipv4_count == 0) { + errno = EADDRNOTAVAIL; + return -1; + } + return set_outbound_multicast_interface(sockfd, link->ipv4[0].addr, "runtime", 0, 0); +} + +static int set_link_outbound_interface6(int sockfd, const struct link_context *link) { + return set_outbound_multicast_interface6(sockfd, link->ifindex, "runtime", 0, 0); +} + +static void send_link_announcement_pair(const struct mdns_socket_pair *sockets, + const struct link_context *link, + const struct sockaddr_in *dest4, + const struct sockaddr_in6 *dest6, + const struct config *cfg, + uint32_t ttl, + const struct service_record_set *snapshot_records, + int use_snapshot_records, + const char *stage) { + if (sockets->ipv4_fd >= 0 && link->ipv4_count > 0) { + if (set_link_outbound_interface4(sockets->ipv4_fd, link) != 0 || + send_announcement(sockets->ipv4_fd, dest4, cfg, link, ttl, snapshot_records, use_snapshot_records) != 0) { + char detail[160]; + snprintf(detail, sizeof(detail), "stage=%s iface=%s family=ipv4", stage, link->name); + log_send_failure(stage, dest4, use_snapshot_records, detail); + } + } + if (sockets->ipv6_fd >= 0 && link_context_has_mdns_ipv6_transport(link)) { + struct sockaddr_in6 scoped_dest6; + scoped_mdns_dest6_for_link(&scoped_dest6, dest6, link); + if (set_link_outbound_interface6(sockets->ipv6_fd, link) != 0 || + send_announcement_any(sockets->ipv6_fd, + (const struct sockaddr *)&scoped_dest6, + sizeof(scoped_dest6), + cfg, + link, + ttl, + snapshot_records, + use_snapshot_records) != 0) { + char destbuf[96]; + format_sockaddr_addr((const struct sockaddr *)&scoped_dest6, destbuf, sizeof(destbuf)); + fprintf(stderr, + "mdns send failure: stage=%s dest=%s records=%s detail=iface=%s family=ipv6\n", + stage, + destbuf, + use_snapshot_records ? "snapshot" : "generated", + link->name); + } + } +} + +static void announce_all_links(const struct mdns_socket_pair *sockets, + const struct link_context_set *links, + const struct sockaddr_in *dest4, + const struct sockaddr_in6 *dest6, + const struct config *cfg, + const struct service_record_set *snapshot_records, + int use_snapshot_records, + const char *stage) { + size_t i; + + for (i = 0; i < links->count; i++) { + send_link_announcement_pair(sockets, + &links->links[i], + dest4, + dest6, + cfg, + cfg->ttl, + snapshot_records, + use_snapshot_records, + stage); + } +} + +static void send_link_goodbyes(const struct mdns_socket_pair *sockets, + const struct link_context_set *links, + const struct sockaddr_in *dest4, + const struct sockaddr_in6 *dest6, + const struct config *cfg, + const struct service_record_set *snapshot_records, + int use_snapshot_records) { + size_t i; + + for (i = 0; i < links->count; i++) { + send_link_announcement_pair(sockets, + &links->links[i], + dest4, + dest6, + cfg, + 0, + snapshot_records, + use_snapshot_records, + "goodbye"); + } +} + +static void send_link_goodbyes_for_missing(const struct mdns_socket_pair *sockets, + const struct link_context_set *old_links, + const struct link_context_set *new_links, + const struct sockaddr_in *dest4, + const struct sockaddr_in6 *dest6, + const struct config *cfg, + const struct service_record_set *snapshot_records, + int use_snapshot_records) { + size_t i; + + for (i = 0; i < old_links->count; i++) { + if (link_context_set_contains(new_links, &old_links->links[i])) { + continue; + } + send_link_announcement_pair(sockets, + &old_links->links[i], + dest4, + dest6, + cfg, + 0, + snapshot_records, + use_snapshot_records, + "goodbye"); + } +} + +static int prepare_runtime_mdns_sockets_for_links(int shared_bind, + struct mdns_socket_pair *sockets, + const struct link_context_set *old_links, + const struct link_context_set *new_links) { + int need_ipv4 = link_contexts_need_ipv4_socket(new_links); + int need_ipv6 = link_contexts_need_ipv6_socket(new_links); + int opened_ipv4 = 0; + int opened_ipv6 = 0; + + if (!need_ipv4 && !need_ipv6) { + errno = EADDRNOTAVAIL; + return -1; + } + + if (need_ipv4 && sockets->ipv4_fd < 0) { + sockets->ipv4_fd = open_bound_mdns_socket(shared_bind, 1); + if (sockets->ipv4_fd < 0) { + goto fail; + } + opened_ipv4 = 1; + } + if (need_ipv6 && sockets->ipv6_fd < 0) { + sockets->ipv6_fd = open_bound_mdns_socket6(shared_bind, 1); + if (sockets->ipv6_fd < 0) { + goto fail; + } + opened_ipv6 = 1; + } + + if (need_ipv4 && + prepare_mdns_socket4_memberships(sockets->ipv4_fd, + opened_ipv4 ? NULL : old_links, + new_links, + "runtime") != 0) { + goto fail; + } + if (need_ipv6 && + prepare_mdns_socket6_memberships(sockets->ipv6_fd, + opened_ipv6 ? NULL : old_links, + new_links, + "runtime") != 0) { + goto fail; + } + return 0; + +fail: + if (opened_ipv4 && sockets->ipv4_fd >= 0) { + close(sockets->ipv4_fd); + sockets->ipv4_fd = -1; + } + if (opened_ipv6 && sockets->ipv6_fd >= 0) { + close(sockets->ipv6_fd); + sockets->ipv6_fd = -1; + } + return -1; +} + +static void retire_runtime_mdns_memberships_for_missing(struct mdns_socket_pair *sockets, + const struct link_context_set *old_links, + const struct link_context_set *new_links) { + size_t i; + + if (sockets->ipv4_fd >= 0) { + for (i = 0; i < old_links->count; i++) { + if (old_links->links[i].ipv4_count == 0 || + link_set_has_ipv4_membership(new_links, old_links->links[i].ipv4[0].addr)) { + continue; + } + drop_mdns_multicast_group_best_effort(sockets->ipv4_fd, old_links->links[i].ipv4[0].addr, "runtime"); + } + } + if (sockets->ipv6_fd >= 0) { + for (i = 0; i < old_links->count; i++) { + if (!link_context_has_mdns_ipv6_transport(&old_links->links[i]) || + link_set_has_ipv6_membership(new_links, old_links->links[i].ifindex)) { + continue; + } + drop_mdns_multicast_group6_best_effort(sockets->ipv6_fd, + old_links->links[i].ifindex, + old_links->links[i].name, + "runtime"); + } + } +} + +static void close_unused_runtime_mdns_socket_families(struct mdns_socket_pair *sockets, + const struct link_context_set *links) { + if (!link_contexts_need_ipv4_socket(links) && sockets->ipv4_fd >= 0) { + close(sockets->ipv4_fd); + sockets->ipv4_fd = -1; + } + if (!link_contexts_need_ipv6_socket(links) && sockets->ipv6_fd >= 0) { + close(sockets->ipv6_fd); + sockets->ipv6_fd = -1; + } +} + +static int apply_runtime_link_change(int shared_bind, + struct mdns_socket_pair *sockets, + struct link_context_set *active_links, + const struct link_context_set *new_links, + const struct sockaddr_in *dest4, + const struct sockaddr_in6 *dest6, + const struct config *cfg, + const struct service_record_set *snapshot_records, + int use_snapshot_records) { + if (prepare_runtime_mdns_sockets_for_links(shared_bind, sockets, active_links, new_links) != 0) { + return -1; + } + send_link_goodbyes_for_missing(sockets, + active_links, + new_links, + dest4, + dest6, + cfg, + snapshot_records, + use_snapshot_records); + retire_runtime_mdns_memberships_for_missing(sockets, active_links, new_links); + close_unused_runtime_mdns_socket_families(sockets, new_links); + *active_links = *new_links; + return 0; +} + static int open_mdns_socket(int shared_bind, int log_bind_errors, uint32_t ipv4_addr, const char *socket_role) { int sockfd; @@ -3584,6 +4836,7 @@ int main(int argc, char **argv) { struct service_record_set snapshot_records; int sockfd = -1; struct sockaddr_in mdns_dest; + struct sockaddr_in6 mdns_dest6; int i; time_t last_announce = 0; int use_snapshot_records = 0; @@ -3591,8 +4844,10 @@ int main(int argc, char **argv) { int auto_ip = 0; int explicit_ipv4 = 0; int print_auto_ip_cidrs = 0; + int print_smb_bind_interfaces = 0; + int print_mdns_socket_families = 0; int auto_contexts_ready = 0; - struct iface_context_set auto_contexts; + struct link_context_set auto_links; int capture_only = 0; int snapshot_capture_failed = 0; int snapshot_capture_skipped = 0; @@ -3603,7 +4858,7 @@ int main(int argc, char **argv) { memset(&cfg, 0, sizeof(cfg)); memset(&snapshot_records, 0, sizeof(snapshot_records)); - memset(&auto_contexts, 0, sizeof(auto_contexts)); + memset(&auto_links, 0, sizeof(auto_links)); strcpy(cfg.service_type, "_smb._tcp.local."); strcpy(cfg.adisk_service_type, "_adisk._tcp.local."); strcpy(cfg.adisk_disk_key, ADISK_DEFAULT_DISK_KEY); @@ -3636,6 +4891,10 @@ int main(int argc, char **argv) { auto_ip = 1; } else if (strcmp(argv[i], "--print-auto-ip-cidrs") == 0) { print_auto_ip_cidrs = 1; + } else if (strcmp(argv[i], "--print-smb-bind-interfaces") == 0) { + print_smb_bind_interfaces = 1; + } else if (strcmp(argv[i], "--print-mdns-socket-families") == 0) { + print_mdns_socket_families = 1; } else if (strcmp(argv[i], "--version") == 0) { printf("%d\n", ADVERTISER_VERSION_CODE); return EXIT_OK; @@ -3702,6 +4961,16 @@ int main(int argc, char **argv) { collect_usable_iface_contexts_provider, NULL); } + if (print_smb_bind_interfaces) { + return print_smb_bind_interfaces_with_provider(stdout, + collect_usable_link_contexts_provider, + NULL); + } + if (print_mdns_socket_families) { + return print_mdns_socket_families_with_provider(stdout, + collect_usable_link_contexts_provider, + NULL); + } capture_only = (cfg.load_snapshot_path[0] == '\0' && (cfg.save_all_snapshot_path[0] != '\0' || @@ -3813,17 +5082,17 @@ int main(int argc, char **argv) { } if (!snapshot_capture_skipped) { - if (auto_ip && !auto_contexts_ready) { - if (wait_for_auto_iface_contexts(&auto_contexts, "mdns capture") == 0) { - auto_contexts_ready = 1; - log_iface_contexts("mdns capture auto-ip", &auto_contexts); + struct link_context_set capture_links; + int capture_links_ready = 0; + memset(&capture_links, 0, sizeof(capture_links)); + if (auto_ip) { + if (wait_for_auto_link_contexts(&capture_links, "mdns capture") == 0) { + capture_links_ready = 1; + log_link_contexts("mdns capture auto-ip", &capture_links); } } - if ((auto_ip && auto_contexts_ready && - capture_mdns_snapshot_auto_with_retry(&captured_records, - &auto_contexts, - &cfg, - cfg.save_snapshot_path[0] != '\0') == 0) || + if ((auto_ip && capture_links_ready && + capture_mdns_snapshot_links_with_retry(&captured_records, &capture_links) == 0) || (!auto_ip && capture_mdns_snapshot_raw_with_retry(&captured_records, cfg.ipv4_addr) == 0)) { fprintf(stderr, "snapshot capture: captured %lu records\n", (unsigned long)captured_records.count); if (cfg.save_all_snapshot_path[0] != '\0' && @@ -3892,18 +5161,25 @@ int main(int argc, char **argv) { mdns_dest.sin_port = htons(MDNS_PORT); mdns_dest.sin_addr.s_addr = inet_addr(MDNS_GROUP); + memset(&mdns_dest6, 0, sizeof(mdns_dest6)); + mdns_dest6.sin6_family = AF_INET6; + mdns_dest6.sin6_port = htons(MDNS_PORT); + (void)inet_pton(AF_INET6, MDNS_GROUP_V6, &mdns_dest6.sin6_addr); + if (auto_ip) { time_t last_iface_poll; + struct mdns_socket_pair sockets; if (!auto_contexts_ready) { - if (wait_for_auto_iface_contexts(&auto_contexts, "mdns runtime") != 0) { + if (wait_for_auto_advertise_link_contexts(&auto_links, "mdns runtime") != 0) { return EXIT_AUTO_IP_UNAVAILABLE; } auto_contexts_ready = 1; } - log_iface_contexts("mdns runtime auto-ip", &auto_contexts); - sockfd = acquire_mdns_auto_socket(shared_bind, &auto_contexts); - if (sockfd < 0) { + log_link_contexts("mdns runtime auto-ip", &auto_links); + sockets.ipv4_fd = -1; + sockets.ipv6_fd = -1; + if (acquire_dualstack_mdns_sockets(shared_bind, &auto_links, &sockets) != 0) { return EXIT_SOCKET_ACQUIRE_FAILED; } @@ -3918,55 +5194,55 @@ int main(int argc, char **argv) { long long now_ms; long long next_burst_ms = -1; long long wait_ms = 1000; + int maxfd = -1; if (time(NULL) - last_iface_poll >= AUTO_IP_STABLE_POLL_SECONDS) { - struct iface_context_set next_contexts; - memset(&next_contexts, 0, sizeof(next_contexts)); - if (collect_usable_iface_contexts(&next_contexts) == 0 && - !iface_context_sets_equal(&auto_contexts, &next_contexts)) { - struct iface_context_set stabilized_contexts; + struct link_context_set next_links; + memset(&next_links, 0, sizeof(next_links)); + if (collect_usable_advertise_link_contexts_provider(&next_links, NULL) == 0 && + !link_context_sets_equal(&auto_links, &next_links)) { + struct link_context_set stabilized_links; fprintf(stderr, "mdns auto-ip: interface table changed; confirming after %ds stabilization\n", AUTO_IP_STABILIZE_SECONDS); - log_iface_contexts("mdns auto-ip old", &auto_contexts); - log_iface_contexts("mdns auto-ip observed", &next_contexts); + log_link_contexts("mdns auto-ip old", &auto_links); + log_link_contexts("mdns auto-ip observed", &next_links); sleep(AUTO_IP_STABILIZE_SECONDS); - memset(&stabilized_contexts, 0, sizeof(stabilized_contexts)); - if (collect_usable_iface_contexts(&stabilized_contexts) == 0) { - if (iface_context_sets_equal(&auto_contexts, &stabilized_contexts)) { + memset(&stabilized_links, 0, sizeof(stabilized_links)); + if (collect_usable_advertise_link_contexts_provider(&stabilized_links, NULL) == 0) { + if (link_context_sets_equal(&auto_links, &stabilized_links)) { fprintf(stderr, "mdns auto-ip: observed interface change did not persist after stabilization\n"); } else { - if (stabilized_contexts.count > 0) { - log_iface_contexts("mdns auto-ip stabilized", &stabilized_contexts); - if (prepare_mdns_auto_socket_for_contexts(sockfd, &auto_contexts, &stabilized_contexts) != 0) { - fprintf(stderr, "mdns auto-ip: could not apply stabilized interface contexts on existing socket; keeping previous contexts\n"); + if (stabilized_links.count > 0) { + log_link_contexts("mdns auto-ip stabilized", &stabilized_links); + if (apply_runtime_link_change(shared_bind, + &sockets, + &auto_links, + &stabilized_links, + &mdns_dest, + &mdns_dest6, + &cfg, + &snapshot_records, + use_snapshot_records) != 0) { + fprintf(stderr, "mdns auto-ip: could not apply stabilized address links; keeping previous links until next poll\n"); last_iface_poll = time(NULL); continue; } - send_context_goodbyes_for_missing(sockfd, - &auto_contexts, - &stabilized_contexts, - &mdns_dest, - &cfg, - &snapshot_records, - use_snapshot_records); - retire_mdns_auto_socket_contexts(sockfd, &auto_contexts, &stabilized_contexts); - auto_contexts = stabilized_contexts; } else { - fprintf(stderr, "mdns auto-ip: no usable IPv4 after stabilization; sending goodbyes and waiting\n"); - send_context_goodbyes(sockfd, &auto_contexts, &mdns_dest, &cfg, &snapshot_records, use_snapshot_records); - retire_mdns_auto_socket_contexts(sockfd, &auto_contexts, &stabilized_contexts); - memset(&auto_contexts, 0, sizeof(auto_contexts)); - if (wait_for_auto_iface_contexts(&stabilized_contexts, "mdns runtime") != 0) { + fprintf(stderr, "mdns auto-ip: no usable address links after stabilization; sending goodbyes and waiting\n"); + send_link_goodbyes(&sockets, &auto_links, &mdns_dest, &mdns_dest6, &cfg, &snapshot_records, use_snapshot_records); + close_mdns_socket_pair(&sockets); + memset(&auto_links, 0, sizeof(auto_links)); + if (wait_for_auto_advertise_link_contexts(&stabilized_links, "mdns runtime") != 0) { break; } - if (prepare_mdns_auto_socket_for_contexts(sockfd, &auto_contexts, &stabilized_contexts) != 0) { - fprintf(stderr, "mdns auto-ip: usable IPv4 returned but existing socket could not join new contexts\n"); + if (acquire_dualstack_mdns_sockets(shared_bind, &stabilized_links, &sockets) != 0) { + fprintf(stderr, "mdns auto-ip: usable address links returned but sockets could not be acquired\n"); last_iface_poll = time(NULL); continue; } - auto_contexts = stabilized_contexts; + auto_links = stabilized_links; } - log_iface_contexts("mdns auto-ip active", &auto_contexts); + log_link_contexts("mdns auto-ip active", &auto_links); startup_burst_start_ms = monotonic_millis(); startup_burst_index = 0; last_announce = time(NULL); @@ -3979,13 +5255,24 @@ int main(int argc, char **argv) { now_ms = monotonic_millis(); while (startup_burst_index < STARTUP_BURST_COUNT && now_ms - startup_burst_start_ms >= (long long)startup_burst_offsets_ms[startup_burst_index]) { - announce_all_contexts(sockfd, &auto_contexts, &mdns_dest, &cfg, &snapshot_records, use_snapshot_records, "startup_announce"); + announce_all_links(&sockets, &auto_links, &mdns_dest, &mdns_dest6, &cfg, &snapshot_records, use_snapshot_records, "startup_announce"); startup_burst_index++; now_ms = monotonic_millis(); } FD_ZERO(&rfds); - FD_SET(sockfd, &rfds); + if (sockets.ipv4_fd >= 0) { + FD_SET(sockets.ipv4_fd, &rfds); + if (sockets.ipv4_fd > maxfd) { + maxfd = sockets.ipv4_fd; + } + } + if (sockets.ipv6_fd >= 0) { + FD_SET(sockets.ipv6_fd, &rfds); + if (sockets.ipv6_fd > maxfd) { + maxfd = sockets.ipv6_fd; + } + } if (startup_burst_index < STARTUP_BURST_COUNT) { next_burst_ms = startup_burst_start_ms + (long long)startup_burst_offsets_ms[startup_burst_index]; wait_ms = next_burst_ms - now_ms; @@ -3999,7 +5286,7 @@ int main(int argc, char **argv) { tv.tv_usec = (suseconds_t)((wait_ms % 1000) * 1000); { - int selected = select(sockfd + 1, &rfds, NULL, NULL, &tv); + int selected = maxfd >= 0 ? select(maxfd + 1, &rfds, NULL, NULL, &tv) : -1; if (selected < 0) { if (errno == EINTR) { continue; @@ -4007,37 +5294,70 @@ int main(int argc, char **argv) { perror("select"); break; } - if (selected > 0 && FD_ISSET(sockfd, &rfds)) { + if (selected > 0 && sockets.ipv4_fd >= 0 && FD_ISSET(sockets.ipv4_fd, &rfds)) { struct sockaddr_in src; socklen_t src_len = sizeof(src); - ssize_t nread = recvfrom(sockfd, packet, sizeof(packet), 0, (struct sockaddr *)&src, &src_len); + ssize_t nread = recvfrom(sockets.ipv4_fd, packet, sizeof(packet), 0, (struct sockaddr *)&src, &src_len); if (nread > 0) { - const struct iface_context *ctx = select_response_context(&auto_contexts, &src); - if (ctx != NULL && - (set_context_outbound_interface(sockfd, ctx) != 0 || - handle_query(sockfd, packet, (size_t)nread, &mdns_dest, &src, &cfg, ctx->ipv4_addr, &snapshot_records, use_snapshot_records) != 0)) { + const struct link_context *link = select_response_link_ipv4(&auto_links, &src); + if (link != NULL && + (set_link_outbound_interface4(sockets.ipv4_fd, link) != 0 || + handle_query(sockets.ipv4_fd, packet, (size_t)nread, &mdns_dest, &src, &cfg, link, &snapshot_records, use_snapshot_records) != 0)) { char detail[160]; - char ip_buf[INET_ADDRSTRLEN]; - snprintf(detail, sizeof(detail), "iface=%s ip=%s packet_len=%ld from=%s:%u", - ctx->name, - ipv4_to_string(ctx->ipv4_addr, ip_buf, sizeof(ip_buf)), + snprintf(detail, sizeof(detail), "iface=%s packet_len=%ld from=%s:%u", + link->name, (long)nread, inet_ntoa(src.sin_addr), (unsigned int)ntohs(src.sin_port)); log_send_failure("query_response", &mdns_dest, use_snapshot_records, detail); } } } + if (selected > 0 && sockets.ipv6_fd >= 0 && FD_ISSET(sockets.ipv6_fd, &rfds)) { + struct sockaddr_in6 src6; + socklen_t src6_len = sizeof(src6); + ssize_t nread = recvfrom(sockets.ipv6_fd, packet, sizeof(packet), 0, (struct sockaddr *)&src6, &src6_len); + if (nread > 0) { + const struct link_context *link = select_response_link_ipv6(&auto_links, &src6); + if (link != NULL) { + struct sockaddr_in6 scoped_dest6; + int query_status; + scoped_mdns_dest6_for_link(&scoped_dest6, &mdns_dest6, link); + query_status = set_link_outbound_interface6(sockets.ipv6_fd, link); + if (query_status == 0) { + query_status = handle_query_any(sockets.ipv6_fd, + packet, + (size_t)nread, + (const struct sockaddr *)&scoped_dest6, + sizeof(scoped_dest6), + (const struct sockaddr *)&src6, + src6_len, + &cfg, + link, + &snapshot_records, + use_snapshot_records); + } + if (query_status != 0) { + char srcbuf[96]; + format_sockaddr_addr((const struct sockaddr *)&src6, srcbuf, sizeof(srcbuf)); + fprintf(stderr, + "mdns send failure: stage=query_response records=%s detail=iface=%s packet_len=%ld from=%s\n", + use_snapshot_records ? "snapshot" : "generated", + link->name, + (long)nread, + srcbuf); + } + } + } + } } if (time(NULL) - last_announce >= ANNOUNCE_INTERVAL) { - announce_all_contexts(sockfd, &auto_contexts, &mdns_dest, &cfg, &snapshot_records, use_snapshot_records, "periodic_announce"); + announce_all_links(&sockets, &auto_links, &mdns_dest, &mdns_dest6, &cfg, &snapshot_records, use_snapshot_records, "periodic_announce"); last_announce = time(NULL); } } - if (sockfd >= 0) { - send_context_goodbyes(sockfd, &auto_contexts, &mdns_dest, &cfg, &snapshot_records, use_snapshot_records); - close(sockfd); - } + send_link_goodbyes(&sockets, &auto_links, &mdns_dest, &mdns_dest6, &cfg, &snapshot_records, use_snapshot_records); + close_mdns_socket_pair(&sockets); return 0; } @@ -4061,7 +5381,13 @@ int main(int argc, char **argv) { now_ms = monotonic_millis(); while (startup_burst_index < STARTUP_BURST_COUNT && now_ms - startup_burst_start_ms >= (long long)startup_burst_offsets_ms[startup_burst_index]) { - if (send_announcement(sockfd, &mdns_dest, &cfg, cfg.ipv4_addr, cfg.ttl, &snapshot_records, use_snapshot_records) != 0) { + struct link_context link; + memset(&link, 0, sizeof(link)); + strncpy(link.name, "explicit", sizeof(link.name) - 1); + link.ipv4[0].addr = cfg.ipv4_addr; + link.ipv4[0].netmask = htonl(0xffffffffU); + link.ipv4_count = 1; + if (send_announcement(sockfd, &mdns_dest, &cfg, &link, cfg.ttl, &snapshot_records, use_snapshot_records) != 0) { char detail[96]; snprintf(detail, sizeof(detail), "burst_index=%lu offset_ms=%u", (unsigned long)startup_burst_index, startup_burst_offsets_ms[startup_burst_index]); @@ -4090,7 +5416,13 @@ int main(int argc, char **argv) { socklen_t src_len = sizeof(src); nread = recvfrom(sockfd, packet, sizeof(packet), 0, (struct sockaddr *)&src, &src_len); if (nread > 0) { - if (handle_query(sockfd, packet, (size_t)nread, &mdns_dest, &src, &cfg, cfg.ipv4_addr, &snapshot_records, use_snapshot_records) != 0) { + struct link_context link; + memset(&link, 0, sizeof(link)); + strncpy(link.name, "explicit", sizeof(link.name) - 1); + link.ipv4[0].addr = cfg.ipv4_addr; + link.ipv4[0].netmask = htonl(0xffffffffU); + link.ipv4_count = 1; + if (handle_query(sockfd, packet, (size_t)nread, &mdns_dest, &src, &cfg, &link, &snapshot_records, use_snapshot_records) != 0) { char detail[128]; snprintf(detail, sizeof(detail), "packet_len=%ld from=%s:%u", (long)nread, inet_ntoa(src.sin_addr), (unsigned int)ntohs(src.sin_port)); @@ -4100,7 +5432,13 @@ int main(int argc, char **argv) { } if (time(NULL) - last_announce >= ANNOUNCE_INTERVAL) { - if (send_announcement(sockfd, &mdns_dest, &cfg, cfg.ipv4_addr, cfg.ttl, &snapshot_records, use_snapshot_records) != 0) { + struct link_context link; + memset(&link, 0, sizeof(link)); + strncpy(link.name, "explicit", sizeof(link.name) - 1); + link.ipv4[0].addr = cfg.ipv4_addr; + link.ipv4[0].netmask = htonl(0xffffffffU); + link.ipv4_count = 1; + if (send_announcement(sockfd, &mdns_dest, &cfg, &link, cfg.ttl, &snapshot_records, use_snapshot_records) != 0) { char detail[96]; snprintf(detail, sizeof(detail), "interval=%d last_announce_age=%ld", ANNOUNCE_INTERVAL, (long)(time(NULL) - last_announce)); @@ -4116,3 +5454,4 @@ int main(int argc, char **argv) { #undef fprintf #undef perror +#undef MDNS_UNUSED diff --git a/src/timecapsulesmb/assets/artifact-manifest.json b/src/timecapsulesmb/assets/artifact-manifest.json index 64e81f0..ac1dc58 100644 --- a/src/timecapsulesmb/assets/artifact-manifest.json +++ b/src/timecapsulesmb/assets/artifact-manifest.json @@ -2,27 +2,27 @@ "artifacts": { "mdns-advertiser": { "path": "bin/mdns/mdns-advertiser", - "sha256": "82245f3a581d196c9cad98d076d29769c0cf0dc4052681ddd8b4a050be0b0722" + "sha256": "d50f8f54d74ef7549cfbea5515fc000f9ef82da423d45f1b112f7713257119e1" }, "mdns-advertiser-netbsd4le": { "path": "bin/mdns-netbsd4le/mdns-advertiser", - "sha256": "9e63f0a4c2c483fd4c3b6727cd2005f363abe734c74ab14f1185c32d01823016" + "sha256": "e27656e73a768d358ec4484cf464a34d074c87ef1eea3de4fdf59123b9a70d74" }, "mdns-advertiser-netbsd4be": { "path": "bin/mdns-netbsd4be/mdns-advertiser", - "sha256": "bdd638d4cca35d95307e4d93feba4ced1300fde4d96406e38d99f9747f00723d" + "sha256": "012e8df43a0e53c2661a9aa080954601eda91b11a29211d00f104751fda2c09e" }, "nbns-advertiser": { "path": "bin/nbns/nbns-advertiser", - "sha256": "5dd1b7df3dedcbc5dd6e6d2575a3c141cad9757d09d3e94e836cee72d3c08e66" + "sha256": "af2de6af905d9cc6e4415fdc104fd658c2a4812255c16e7ce71a502fde4968db" }, "nbns-advertiser-netbsd4le": { "path": "bin/nbns-netbsd4le/nbns-advertiser", - "sha256": "ffd0908e2803dd254e16ef9379000221037668be5735c86656c258ff44810d02" + "sha256": "f52c5f708b6638589434e45b0d46cc830539c02748dd8b231da25d3406ea6fae" }, "nbns-advertiser-netbsd4be": { "path": "bin/nbns-netbsd4be/nbns-advertiser", - "sha256": "1c58af90353388535d9497573fa5151226ed0ed094a0f4b36788607b2c4b3078" + "sha256": "60c8e5266a2efce13fd0fe4ae2e7264153e1d1aafa14c87707d27dc357aabfdb" }, "smbd": { "path": "bin/samba4/smbd", diff --git a/src/timecapsulesmb/assets/boot/samba4/common.d/45-network-bind.sh b/src/timecapsulesmb/assets/boot/samba4/common.d/45-network-bind.sh index ca4f457..c132623 100644 --- a/src/timecapsulesmb/assets/boot/samba4/common.d/45-network-bind.sh +++ b/src/timecapsulesmb/assets/boot/samba4/common.d/45-network-bind.sh @@ -28,15 +28,37 @@ tc_smb_bind_token_is_ipv4_cidr() { return 0 } -tc_normalize_smb_bind_cidrs() { - cidrs=$1 +tc_smb_bind_token_is_ipv6_cidr() { + token=$1 + + case "$token" in + ""|/*|*/|*/*/*|*[!0123456789abcdefABCDEF:./]*) return 1 ;; + *:*) ;; + *) return 1 ;; + esac + + prefix_part=${token#*/} + case "$prefix_part" in + ""|*[!0123456789]*) return 1 ;; + esac + [ "$prefix_part" -le 128 ] 2>/dev/null || return 1 + + return 0 +} + +tc_smb_bind_token_is_cidr() { + tc_smb_bind_token_is_ipv4_cidr "$1" || tc_smb_bind_token_is_ipv6_cidr "$1" +} + +tc_normalize_smb_bind_tokens() { + bind_tokens=$1 normalized= - set -- $cidrs + set -- $bind_tokens [ "$#" -gt 0 ] || return 1 for cidr_token in "$@"; do - tc_smb_bind_token_is_ipv4_cidr "$cidr_token" || return 1 + tc_smb_bind_token_is_cidr "$cidr_token" || return 1 if [ -n "$normalized" ]; then normalized="$normalized $cidr_token" else @@ -47,15 +69,69 @@ tc_normalize_smb_bind_cidrs() { printf '%s\n' "$normalized" } +tc_normalize_smb_bind_cidrs() { + tc_normalize_smb_bind_tokens "$1" +} + +tc_normalize_mdns_socket_families() { + families=$1 + saw_ipv4=0 + saw_ipv6=0 + normalized= + + set -- $families + [ "$#" -gt 0 ] || return 1 + + for family_token in "$@"; do + case "$family_token" in + ipv4) + [ "$saw_ipv4" = "0" ] || return 1 + saw_ipv4=1 + ;; + ipv6) + [ "$saw_ipv6" = "0" ] || return 1 + saw_ipv6=1 + ;; + *) return 1 ;; + esac + done + + if [ "$saw_ipv4" = "1" ]; then + normalized=ipv4 + fi + if [ "$saw_ipv6" = "1" ]; then + if [ -n "$normalized" ]; then + normalized="$normalized ipv6" + else + normalized=ipv6 + fi + fi + + [ -n "$normalized" ] || return 1 + printf '%s\n' "$normalized" +} + tc_probe_auto_ip_cidrs() { [ -x "$TC_MDNS_BIN" ] || return 1 cidrs=$("$TC_MDNS_BIN" --print-auto-ip-cidrs 2>/dev/null) || return $? tc_normalize_smb_bind_cidrs "$cidrs" || return 1 } +tc_probe_smb_bind_tokens() { + [ -x "$TC_MDNS_BIN" ] || return 1 + bind_tokens=$("$TC_MDNS_BIN" --print-smb-bind-interfaces 2>/dev/null) || return $? + tc_normalize_smb_bind_tokens "$bind_tokens" || return 1 +} + +tc_probe_mdns_socket_families() { + [ -x "$TC_MDNS_BIN" ] || return 1 + families=$("$TC_MDNS_BIN" --print-mdns-socket-families 2>/dev/null) || return $? + tc_normalize_mdns_socket_families "$families" || return 1 +} + tc_probe_smb_bind_interfaces() { - cidrs=$(tc_probe_auto_ip_cidrs) || return $? - printf '127.0.0.1/8 %s\n' "$cidrs" + bind_tokens=$(tc_probe_smb_bind_tokens) || return $? + printf '127.0.0.1/8 ::1/128 %s\n' "$bind_tokens" } tc_auto_ip_unavailable_status() { @@ -65,27 +141,27 @@ tc_auto_ip_unavailable_status() { tc_mark_smb_deferred_no_ip() { TC_WATCHDOG_SMB_DEFERRED_NO_IP=1 if [ "${TC_SMB_IPV4_WAIT_LOGGED:-0}" != "1" ]; then - tc_log "Samba IPv4 bind discovery deferred; no usable IPv4 has appeared yet" + tc_log "Samba bind discovery deferred; no usable address has appeared yet" TC_SMB_IPV4_WAIT_LOGGED=1 fi } tc_wait_for_smb_ipv4() { if [ ! -x "$TC_MDNS_BIN" ]; then - tc_log "Samba IPv4 bind discovery failed; missing $TC_MDNS_BIN" + tc_log "Samba bind discovery failed; missing $TC_MDNS_BIN" return 1 fi while :; do - if cidrs=$(tc_probe_auto_ip_cidrs); then - tc_log "Samba IPv4 bind discovery: first usable IPv4 observed: $cidrs" + if bind_tokens=$(tc_probe_smb_bind_tokens); then + tc_log "Samba bind discovery: first usable address observed: $bind_tokens" return 0 else probe_status=$? fi if ! tc_auto_ip_unavailable_status "$probe_status"; then - tc_log "Samba IPv4 bind discovery failed with exit code $probe_status" + tc_log "Samba bind discovery failed with exit code $probe_status" return 1 fi @@ -98,7 +174,7 @@ tc_refresh_smb_bind_interfaces() { if bind_interfaces=$(tc_probe_smb_bind_interfaces); then TC_SMB_BIND_INTERFACES=$bind_interfaces TC_WATCHDOG_SMB_DEFERRED_NO_IP=0 - tc_log "Samba IPv4 bind interfaces: $TC_SMB_BIND_INTERFACES" + tc_log "Samba bind interfaces: $TC_SMB_BIND_INTERFACES" return 0 else probe_status=$? @@ -107,14 +183,14 @@ tc_refresh_smb_bind_interfaces() { if tc_auto_ip_unavailable_status "$probe_status"; then tc_mark_smb_deferred_no_ip else - tc_log "Samba IPv4 bind interface probe failed with exit code $probe_status" + tc_log "Samba bind interface probe failed with exit code $probe_status" fi return 1 } tc_prepare_smb_bind_context() { tc_wait_for_smb_ipv4 || return 1 - tc_log "Samba IPv4 bind discovery: waiting ${TC_SMB_IPV4_SETTLE_SECONDS}s for network stabilization" + tc_log "Samba bind discovery: waiting ${TC_SMB_IPV4_SETTLE_SECONDS}s for network stabilization" sleep "$TC_SMB_IPV4_SETTLE_SECONDS" tc_refresh_smb_bind_interfaces } diff --git a/src/timecapsulesmb/assets/boot/samba4/common.d/50-runtime-staging.sh b/src/timecapsulesmb/assets/boot/samba4/common.d/50-runtime-staging.sh index 35a6324..dcc8eed 100644 --- a/src/timecapsulesmb/assets/boot/samba4/common.d/50-runtime-staging.sh +++ b/src/timecapsulesmb/assets/boot/samba4/common.d/50-runtime-staging.sh @@ -114,7 +114,7 @@ tc_stage_disk_runtime() { tc_stage_runtime "$TC_PAYLOAD_DIR" "$SMBD_SRC" "$NBNS_SRC" if [ -z "$TC_SMB_BIND_INTERFACES" ]; then tc_refresh_smb_bind_interfaces || { - tc_log "runtime staging failed: no usable IPv4 bind interface is available" + tc_log "runtime staging failed: no usable bind address is available" return 1 } fi @@ -293,7 +293,7 @@ tc_generate_smb_conf() { netbios name = $SMB_NETBIOS_NAME workgroup = WORKGROUP # Samba's interface enumeration can race boot networking on Time Capsule. - # Bind to the IPv4 CIDRs discovered immediately before rendering config. + # Bind to explicit IPv4/IPv6 CIDRs discovered immediately before rendering config. interfaces = $TC_SMB_BIND_INTERFACES bind interfaces only = yes server string = $SMB_SERVER_STRING diff --git a/src/timecapsulesmb/assets/boot/samba4/common.d/60-advertisers.sh b/src/timecapsulesmb/assets/boot/samba4/common.d/60-advertisers.sh index a1b35a1..66251bb 100644 --- a/src/timecapsulesmb/assets/boot/samba4/common.d/60-advertisers.sh +++ b/src/timecapsulesmb/assets/boot/samba4/common.d/60-advertisers.sh @@ -229,13 +229,17 @@ tc_run_mdns_snapshot_command() { } tc_mdns_auto_ip_available() { + tc_probe_mdns_socket_families >/dev/null 2>&1 +} + +tc_nbns_auto_ip_available() { tc_probe_auto_ip_cidrs >/dev/null 2>&1 } tc_mark_mdns_deferred_no_ip() { TC_WATCHDOG_MDNS_DEFERRED_NO_IP=1 if [ "$TC_MDNS_AUTO_IP_WAIT_LOGGED" != "1" ]; then - tc_log "mDNS startup deferred; no usable IPv4 has appeared yet" + tc_log "mDNS startup deferred; no usable address has appeared yet" TC_MDNS_AUTO_IP_WAIT_LOGGED=1 fi } @@ -251,10 +255,10 @@ tc_ensure_mdns_auto_ip_seen() { return 1 fi - tc_log "mDNS auto-ip check: running $TC_MDNS_BIN --print-auto-ip-cidrs" + tc_log "mDNS auto-ip check: running $TC_MDNS_BIN --print-mdns-socket-families" if tc_mdns_auto_ip_available; then TC_MDNS_AUTO_IP_SEEN=1 - tc_log "mDNS auto-ip check: usable IPv4 is available" + tc_log "mDNS auto-ip check: usable address is available" tc_log "mDNS auto-ip is available; starting capture and advertiser" return 0 else @@ -262,7 +266,7 @@ tc_ensure_mdns_auto_ip_seen() { fi if tc_auto_ip_unavailable_status "$mdns_auto_ip_status"; then - tc_log "mDNS auto-ip check: no usable IPv4 yet" + tc_log "mDNS auto-ip check: no usable address yet" tc_mark_mdns_deferred_no_ip else TC_WATCHDOG_MDNS_UNAVAILABLE=1 diff --git a/src/timecapsulesmb/assets/boot/samba4/common.d/70-smbd-service.sh b/src/timecapsulesmb/assets/boot/samba4/common.d/70-smbd-service.sh index 012fde8..cdb2fef 100644 --- a/src/timecapsulesmb/assets/boot/samba4/common.d/70-smbd-service.sh +++ b/src/timecapsulesmb/assets/boot/samba4/common.d/70-smbd-service.sh @@ -5,6 +5,24 @@ tc_fstat_line_is_ipv4_tcp_445() { esac } +tc_fstat_line_is_ipv6_tcp_445() { + case "$1" in + *" internet6 stream tcp "*":445"*) return 0 ;; + *) return 1 ;; + esac +} + +tc_bind_interfaces_have_ipv6() { + set -- ${TC_SMB_BIND_INTERFACES:-} + for token in "$@"; do + case "$token" in + ::1/128) ;; + *:*) return 0 ;; + esac + done + return 1 +} + tc_smbd_bound_ipv4_445() { if ps_out=$(/bin/ps axww -o pid= -o stat= -o ucomm= -o command= 2>/dev/null); then old_ifs=$IFS @@ -41,6 +59,55 @@ tc_smbd_bound_ipv4_445() { return 1 } +tc_smbd_bound_ipv6_445() { + if ps_out=$(/bin/ps axww -o pid= -o stat= -o ucomm= -o command= 2>/dev/null); then + old_ifs=$IFS + IFS=' +' + for line in $ps_out; do + [ -n "$line" ] || continue + line_ifs=$IFS + IFS=' ' + set -- $line + IFS=$line_ifs + [ "$#" -ge 3 ] || continue + case "$2" in + Z*) continue ;; + esac + [ "$3" = "smbd" ] || continue + + if fstat_out=$(/usr/bin/fstat -p "$1" 2>/dev/null); then + fstat_ifs=$IFS + IFS=' +' + for fstat_line in $fstat_out; do + if tc_fstat_line_is_ipv6_tcp_445 "$fstat_line"; then + IFS=$old_ifs + return 0 + fi + done + IFS=$fstat_ifs + fi + done + IFS=$old_ifs + fi + + return 1 +} + +tc_smbd_bound_tcp_445() { + if tc_bind_interfaces_have_nonloopback_ipv4; then + tc_smbd_bound_ipv4_445 || return 1 + fi + if tc_bind_interfaces_have_ipv6; then + tc_smbd_bound_ipv6_445 || return 1 + fi + if ! tc_bind_interfaces_have_nonloopback_ipv4 && ! tc_bind_interfaces_have_ipv6; then + tc_smbd_bound_ipv4_445 || return 1 + fi + return 0 +} + tc_fstat_line_is_ipv4_udp_port() { port=$1 case "$2" in @@ -49,6 +116,14 @@ tc_fstat_line_is_ipv4_udp_port() { esac } +tc_fstat_line_is_ipv6_udp_port() { + port=$1 + case "$2" in + *" internet6 dgram udp "*":$port"*) return 0 ;; + *) return 1 ;; + esac +} + tc_process_bound_ipv4_udp_port() { proc_name=$1 port=$2 @@ -88,6 +163,56 @@ tc_process_bound_ipv4_udp_port() { return 1 } +tc_process_bound_ipv6_udp_port() { + proc_name=$1 + port=$2 + + if ps_out=$(/bin/ps axww -o pid= -o stat= -o ucomm= -o command= 2>/dev/null); then + old_ifs=$IFS + IFS=' +' + for line in $ps_out; do + [ -n "$line" ] || continue + line_ifs=$IFS + IFS=' ' + set -- $line + IFS=$line_ifs + [ "$#" -ge 3 ] || continue + case "$2" in + Z*) continue ;; + esac + [ "$3" = "$proc_name" ] || continue + + if fstat_out=$(/usr/bin/fstat -p "$1" 2>/dev/null); then + fstat_ifs=$IFS + IFS=' +' + for fstat_line in $fstat_out; do + if tc_fstat_line_is_ipv6_udp_port "$port" "$fstat_line"; then + IFS=$old_ifs + return 0 + fi + done + IFS=$fstat_ifs + fi + done + IFS=$old_ifs + fi + + return 1 +} + +tc_bind_interfaces_have_nonloopback_ipv4() { + set -- ${TC_SMB_BIND_INTERFACES:-} + for token in "$@"; do + case "$token" in + 127.*) ;; + *.*/*) return 0 ;; + esac + done + return 1 +} + tc_nbns_bound_ipv4_udp_137() { tc_process_bound_ipv4_udp_port "$NBNS_PROC_NAME" 137 } @@ -96,11 +221,42 @@ tc_mdns_bound_ipv4_udp_5353() { tc_process_bound_ipv4_udp_port "$MDNS_PROC_NAME" 5353 } +tc_mdns_bound_ipv6_udp_5353() { + tc_process_bound_ipv6_udp_port "$MDNS_PROC_NAME" 5353 +} + +tc_mdns_socket_families_have_ipv4() { + set -- $1 + for family in "$@"; do + [ "$family" = "ipv4" ] && return 0 + done + return 1 +} + +tc_mdns_socket_families_have_ipv6() { + set -- $1 + for family in "$@"; do + [ "$family" = "ipv6" ] && return 0 + done + return 1 +} + +tc_mdns_bound_udp_5353() { + mdns_socket_families=$(tc_probe_mdns_socket_families) || return 1 + if tc_mdns_socket_families_have_ipv4 "$mdns_socket_families"; then + tc_mdns_bound_ipv4_udp_5353 || return 1 + fi + if tc_mdns_socket_families_have_ipv6 "$mdns_socket_families"; then + tc_mdns_bound_ipv6_udp_5353 || return 1 + fi + return 0 +} + tc_wait_for_smbd_ipv4_445() { max_attempts=${1:-10} attempt=0 while [ "$attempt" -lt "$max_attempts" ]; do - if tc_smbd_bound_ipv4_445; then + if tc_smbd_bound_tcp_445; then return 0 fi attempt=$((attempt + 1)) @@ -148,7 +304,7 @@ tc_start_smbd() { if wait_for_process smbd 15 && tc_wait_for_smbd_ipv4_445 15; then return 0 fi - tc_log "smbd IPv4 TCP 445 listener was not observed after launch" + tc_log "smbd TCP 445 listener was not observed after launch" tc_log_smbd_socket_diagnostics stop_runtime_process_by_ucomm "smbd" smbd || true return 1 @@ -203,10 +359,10 @@ tc_prepare_smbd_recovery_disk_runtime() { tc_start_smbd_if_needed() { if runtime_process_present_by_ucomm smbd; then - if tc_smbd_bound_ipv4_445; then + if tc_smbd_bound_tcp_445; then return 0 fi - tc_log "watchdog recovery: smbd is running without IPv4 TCP 445; restarting" + tc_log "watchdog recovery: smbd is running without required TCP 445 listeners; restarting" tc_log_smbd_socket_diagnostics stop_runtime_process_by_ucomm "smbd" smbd || return 1 fi @@ -226,7 +382,7 @@ tc_start_smbd_if_needed() { if wait_for_process smbd 15 && tc_wait_for_smbd_ipv4_445 15; then return 0 fi - tc_log "watchdog recovery: smbd restart failed to bind IPv4 TCP 445" + tc_log "watchdog recovery: smbd restart failed to bind required TCP 445 listeners" tc_log_smbd_socket_diagnostics stop_runtime_process_by_ucomm "smbd" smbd || true return 1 diff --git a/src/timecapsulesmb/assets/boot/samba4/common.d/80-watchdog.sh b/src/timecapsulesmb/assets/boot/samba4/common.d/80-watchdog.sh index 021a537..b272906 100644 --- a/src/timecapsulesmb/assets/boot/samba4/common.d/80-watchdog.sh +++ b/src/timecapsulesmb/assets/boot/samba4/common.d/80-watchdog.sh @@ -202,16 +202,16 @@ tc_live_reload_disk_runtime() { if [ -z "$old_bind_interfaces" ] || [ "$fresh_bind_interfaces" != "$old_bind_interfaces" ]; then TC_SMB_BIND_INTERFACES=$fresh_bind_interfaces bind_interfaces_changed=1 - tc_log "watchdog recovery: Samba IPv4 bind interfaces changed during live refresh: ${old_bind_interfaces:-none} -> $TC_SMB_BIND_INTERFACES" + tc_log "watchdog recovery: Samba bind interfaces changed during live refresh: ${old_bind_interfaces:-none} -> $TC_SMB_BIND_INTERFACES" fi else bind_probe_status=$? if [ -z "${TC_SMB_BIND_INTERFACES:-}" ]; then - tc_log "watchdog recovery: live disk runtime refresh failed; no usable IPv4 bind interface is available" + tc_log "watchdog recovery: live disk runtime refresh failed; no usable bind address is available" return 1 fi if ! tc_auto_ip_unavailable_status "$bind_probe_status"; then - tc_log "watchdog recovery: live disk runtime refresh failed; Samba IPv4 bind probe exited $bind_probe_status" + tc_log "watchdog recovery: live disk runtime refresh failed; Samba bind probe exited $bind_probe_status" return 1 fi fi @@ -290,7 +290,7 @@ tc_all_managed_services_healthy() { if ! runtime_process_present_by_ucomm smbd; then return 1 fi - if ! tc_smbd_bound_ipv4_445; then + if ! tc_smbd_bound_tcp_445; then return 1 fi fi @@ -303,7 +303,7 @@ tc_all_managed_services_healthy() { if ! runtime_process_present_by_ucomm "$MDNS_PROC_NAME"; then return 1 fi - if ! tc_mdns_bound_ipv4_udp_5353; then + if ! tc_mdns_bound_udp_5353; then return 1 fi fi @@ -391,11 +391,11 @@ tc_watchdog_initialize_smb_bind_interfaces() { fi if tc_refresh_smb_bind_interfaces; then - tc_log "watchdog startup: initialized Samba IPv4 bind interfaces from live probe" + tc_log "watchdog startup: initialized Samba bind interfaces from live probe" return 0 fi - tc_log "watchdog startup: Samba IPv4 bind interface initialization deferred" + tc_log "watchdog startup: Samba bind interface initialization deferred" return 0 } @@ -420,7 +420,7 @@ tc_watchdog_reconcile_smb_bind_interfaces() { if fresh_bind_interfaces=$(tc_probe_smb_bind_interfaces); then if [ -z "${TC_SMB_BIND_INTERFACES:-}" ]; then TC_SMB_BIND_INTERFACES=$fresh_bind_interfaces - tc_log "watchdog pass: initialized Samba IPv4 bind interfaces: $TC_SMB_BIND_INTERFACES" + tc_log "watchdog pass: initialized Samba bind interfaces: $TC_SMB_BIND_INTERFACES" return 0 fi if [ "$fresh_bind_interfaces" = "$TC_SMB_BIND_INTERFACES" ]; then @@ -429,7 +429,7 @@ tc_watchdog_reconcile_smb_bind_interfaces() { old_bind_interfaces=$TC_SMB_BIND_INTERFACES TC_SMB_BIND_INTERFACES=$fresh_bind_interfaces - tc_log "watchdog pass: Samba IPv4 bind interfaces changed: $old_bind_interfaces -> $TC_SMB_BIND_INTERFACES" + tc_log "watchdog pass: Samba bind interfaces changed: $old_bind_interfaces -> $TC_SMB_BIND_INTERFACES" if ! tc_prepare_smbd_recovery_disk_runtime; then TC_SMB_BIND_INTERFACES=$old_bind_interfaces tc_log "watchdog pass: cannot apply Samba bind change; disk runtime preparation failed" @@ -439,7 +439,7 @@ tc_watchdog_reconcile_smb_bind_interfaces() { TC_SMB_BIND_INTERFACES=$old_bind_interfaces return 1 fi - tc_restart_smbd_for_bind_change "IPv4 bind interfaces changed" || return 1 + tc_restart_smbd_for_bind_change "bind interfaces changed" || return 1 return 0 else bind_probe_status=$? @@ -450,7 +450,7 @@ tc_watchdog_reconcile_smb_bind_interfaces() { return 0 fi - tc_log "watchdog pass: Samba IPv4 bind probe failed with exit code $bind_probe_status" + tc_log "watchdog pass: Samba bind probe failed with exit code $bind_probe_status" return 1 } @@ -458,10 +458,10 @@ tc_watchdog_reconcile_mdns() { mdns_auto_ip_status=0 if runtime_process_present_by_ucomm "$MDNS_PROC_NAME"; then - if tc_mdns_bound_ipv4_udp_5353; then + if tc_mdns_bound_udp_5353; then return 0 fi - tc_log "watchdog recovery: mdns advertiser is running without IPv4 UDP 5353" + tc_log "watchdog recovery: mdns advertiser is running without required UDP 5353 listeners" if tc_mdns_auto_ip_available; then TC_MDNS_AUTO_IP_SEEN=1 stop_runtime_process_by_ucomm "$MDNS_PROC_NAME" "$MDNS_PROC_NAME" || return 1 @@ -510,7 +510,7 @@ tc_watchdog_reconcile_nbns() { return 0 fi tc_log "watchdog recovery: nbns responder is running without IPv4 UDP 137" - if tc_mdns_auto_ip_available; then + if tc_nbns_auto_ip_available; then stop_runtime_process_by_ucomm "$NBNS_PROC_NAME" "$NBNS_PROC_NAME" || return 1 else nbns_auto_ip_status=$? @@ -522,7 +522,7 @@ tc_watchdog_reconcile_nbns() { return 1 fi else - if ! tc_mdns_auto_ip_available; then + if ! tc_nbns_auto_ip_available; then nbns_auto_ip_status=$? if tc_auto_ip_unavailable_status "$nbns_auto_ip_status"; then tc_mark_nbns_deferred_no_ip @@ -546,7 +546,7 @@ tc_watchdog_report_service_health() { if tc_all_managed_services_healthy; then if [ "${TC_WATCHDOG_MDNS_DEFERRED_NO_IP:-0}" = "1" ]; then - tc_log "watchdog steady check: core services healthy; mDNS deferred waiting for usable IPv4" + tc_log "watchdog steady check: core services healthy; mDNS deferred waiting for usable address" else tc_log "watchdog steady check: healthy" fi @@ -554,7 +554,7 @@ tc_watchdog_report_service_health() { fi if tc_samba_runtime_expected && [ "${TC_WATCHDOG_SMB_DEFERRED_NO_IP:-0}" = "1" ]; then - tc_log "watchdog pass: Samba IPv4 bind interface is unavailable" + tc_log "watchdog pass: Samba bind interface is unavailable" return 1 fi tc_log "watchdog pass: one or more managed services are unhealthy" diff --git a/src/timecapsulesmb/assets/boot/samba4/start-samba.sh b/src/timecapsulesmb/assets/boot/samba4/start-samba.sh index 4e15591..112f026 100644 --- a/src/timecapsulesmb/assets/boot/samba4/start-samba.sh +++ b/src/timecapsulesmb/assets/boot/samba4/start-samba.sh @@ -47,7 +47,7 @@ else fi if ! tc_prepare_smb_bind_context; then - tc_log "aborting startup because IPv4 bind interface discovery failed" + tc_log "aborting startup because bind interface discovery failed" exit 1 fi @@ -76,10 +76,10 @@ if ! tc_stage_disk_runtime; then fi tc_start_smbd || { - tc_log "smbd startup failed: IPv4 TCP 445 listener was not observed" + tc_log "smbd startup failed: TCP 445 listener was not observed" exit 1 } -tc_log "smbd startup complete: IPv4 TCP 445 listener observed" +tc_log "smbd startup complete: TCP 445 listener observed" tc_start_watchdog diff --git a/src/timecapsulesmb/deploy/planner.py b/src/timecapsulesmb/deploy/planner.py index 59edf8d..4503b96 100644 --- a/src/timecapsulesmb/deploy/planner.py +++ b/src/timecapsulesmb/deploy/planner.py @@ -100,7 +100,7 @@ class UninstallPlan: NETBSD4_ACTIVATION_CHECKS = [ PlannedCheck("netbsd4_runtime_smb_conf_present", "managed runtime smb.conf is present"), PlannedCheck("netbsd4_smbd_parent_process", "managed smbd parent process is running"), - PlannedCheck("netbsd4_smbd_bound_445", "smbd is bound to IPv4 TCP 445"), + PlannedCheck("netbsd4_smbd_bound_445", "smbd is bound to required TCP 445 sockets"), PlannedCheck("netbsd4_mdns_bound_5353", "mdns-advertiser is bound to UDP 5353"), ] @@ -109,7 +109,7 @@ class UninstallPlan: PlannedCheck("ssh_returns_after_reboot", "SSH returns after reboot"), PlannedCheck("managed_runtime_smb_conf_present", "managed runtime smb.conf is present"), PlannedCheck("managed_smbd_parent_process", "managed smbd parent process is running"), - PlannedCheck("managed_smbd_bound_445", "smbd is bound to IPv4 TCP 445"), + PlannedCheck("managed_smbd_bound_445", "smbd is bound to required TCP 445 sockets"), PlannedCheck("managed_mdns_takeover_ready", "managed mDNS takeover becomes ready"), PlannedCheck("authenticated_smb_listing", "authenticated SMB listing"), ] diff --git a/src/timecapsulesmb/device/probe.py b/src/timecapsulesmb/device/probe.py index a15117a..e24a6bd 100644 --- a/src/timecapsulesmb/device/probe.py +++ b/src/timecapsulesmb/device/probe.py @@ -180,23 +180,77 @@ {PROBE_PROCESS_HELPERS} smbd_bound_445() {{ - case "$1" in - *smbd*" internet stream tcp "*":445"*) return 0 ;; - *) return 1 ;; + fstat_out=$1 + bind_interfaces=$2 + require_ipv4=0 + require_ipv6=0 + set -- $bind_interfaces + for token in "$@"; do + case "$token" in + 127.*|::1/128) ;; + *:*) require_ipv6=1 ;; + *.*/*) require_ipv4=1 ;; + esac + done + if [ "$require_ipv4" -eq 0 ] && [ "$require_ipv6" -eq 0 ]; then + require_ipv4=1 + fi + + has_ipv4=0 + has_ipv6=0 + case "$fstat_out" in + *smbd*" internet stream tcp "*":445"*) has_ipv4=1 ;; + esac + case "$fstat_out" in + *smbd*" internet6 stream tcp "*":445"*) has_ipv6=1 ;; esac + if [ "$require_ipv4" -eq 1 ] && [ "$has_ipv4" -ne 1 ]; then + return 1 + fi + if [ "$require_ipv6" -eq 1 ] && [ "$has_ipv6" -ne 1 ]; then + return 1 + fi + return 0 }} mdns_bound_5353() {{ - case "$1" in - *mdns-advertiser*":5353"*) return 0 ;; - *) return 1 ;; + fstat_out=$1 + mdns_socket_families=$2 + require_ipv4=0 + require_ipv6=0 + set -- $mdns_socket_families + for token in "$@"; do + case "$token" in + ipv4) require_ipv4=1 ;; + ipv6) require_ipv6=1 ;; + esac + done + if [ "$require_ipv4" -eq 0 ] && [ "$require_ipv6" -eq 0 ]; then + require_ipv4=1 + fi + + has_ipv4=0 + has_ipv6=0 + case "$fstat_out" in + *mdns-advertiser*" internet dgram udp "*":5353"*) has_ipv4=1 ;; + esac + case "$fstat_out" in + *mdns-advertiser*" internet6 dgram udp "*":5353"*) has_ipv6=1 ;; esac + if [ "$require_ipv4" -eq 1 ] && [ "$has_ipv4" -ne 1 ]; then + return 1 + fi + if [ "$require_ipv6" -eq 1 ] && [ "$has_ipv6" -ne 1 ]; then + return 1 + fi + return 0 }} describe_managed_smbd_status() {{ ps_out=$1 fstat_out=$2 status=0 + bind_interfaces=$(read_smb_conf_value "interfaces" || true) if runtime_smbd_binary_present; then echo "PASS:managed runtime smbd binary present" else @@ -257,10 +311,10 @@ echo "FAIL:managed smbd parent process is not running" status=1 fi - if smbd_bound_445 "$fstat_out"; then - echo "PASS:smbd bound to IPv4 TCP 445" + if smbd_bound_445 "$fstat_out" "$bind_interfaces"; then + echo "PASS:smbd bound to required TCP 445 sockets" else - echo "FAIL:smbd is not bound to IPv4 TCP 445" + echo "FAIL:smbd is not bound to required TCP 445 sockets" status=1 fi return "$status" @@ -272,6 +326,7 @@ status=0 mdns_auto_ip_state=waiting mdns_auto_ip_failure= + mdns_socket_families= if [ ! -e "$RUNTIME_MDNS_BIN" ]; then mdns_auto_ip_state=failed mdns_auto_ip_failure="mdns-advertiser binary missing at $RUNTIME_MDNS_BIN" @@ -279,14 +334,14 @@ mdns_auto_ip_state=failed mdns_auto_ip_failure="mdns-advertiser binary is not executable at $RUNTIME_MDNS_BIN" else - "$RUNTIME_MDNS_BIN" --print-auto-ip-cidrs >/dev/null 2>&1 + mdns_socket_families=$("$RUNTIME_MDNS_BIN" --print-mdns-socket-families 2>/dev/null) mdns_auto_ip_rc=$? case "$mdns_auto_ip_rc" in 0) mdns_auto_ip_state=active ;; 11) mdns_auto_ip_state=waiting ;; *) mdns_auto_ip_state=failed - mdns_auto_ip_failure="mdns-advertiser auto-IP CIDR probe failed with exit code $mdns_auto_ip_rc" + mdns_auto_ip_failure="mdns-advertiser mDNS socket family probe failed with exit code $mdns_auto_ip_rc" ;; esac fi @@ -300,23 +355,23 @@ echo "PASS:mdns-advertiser process is running" else if [ "$mdns_auto_ip_state" = "waiting" ]; then - echo "FAIL:mDNS startup deferred; no usable IPv4 has appeared yet" + echo "FAIL:mDNS startup deferred; no usable address has appeared yet" else echo "FAIL:mdns-advertiser process is not running" fi status=1 fi - if mdns_bound_5353 "$fstat_out"; then - echo "PASS:mdns-advertiser bound to UDP 5353" + if mdns_bound_5353 "$fstat_out" "$mdns_socket_families"; then + echo "PASS:mdns-advertiser bound to required UDP 5353 sockets" if [ "$mdns_auto_ip_state" = "active" ]; then - echo "PASS:mdns-advertiser auto-IP active" + echo "PASS:mdns-advertiser bind address active" else - echo "FAIL:mdns-advertiser bound to UDP 5353 but auto-IP is not active" + echo "FAIL:mdns-advertiser bound to UDP 5353 but bind address is not active" status=1 fi else if mdns_process_present "$ps_out" && [ "$mdns_auto_ip_state" = "waiting" ]; then - echo "FAIL:mdns-advertiser is waiting for auto-IP" + echo "FAIL:mdns-advertiser is waiting for a usable address" status=1 else echo "FAIL:mdns-advertiser is not bound to UDP 5353" @@ -1351,8 +1406,11 @@ def runtime_startup_failure_debug_fields( marker in combined for marker in ( "mDNS startup deferred; no usable IPv4 has appeared yet", + "mDNS startup deferred; no usable address has appeared yet", "mdns-advertiser is waiting for auto-IP", + "mdns-advertiser is waiting for a usable address", "watchdog steady check: core services healthy; mDNS deferred waiting for usable IPv4", + "watchdog steady check: core services healthy; mDNS deferred waiting for usable address", ) ): return { diff --git a/tests/test_checks.py b/tests/test_checks.py index 21305f1..2a6ef42 100644 --- a/tests/test_checks.py +++ b/tests/test_checks.py @@ -357,7 +357,7 @@ def setUp(self) -> None: lines=( "PASS:managed runtime smb.conf present", "PASS:managed smbd parent process is running", - "PASS:smbd bound to IPv4 TCP 445", + "PASS:smbd bound to required TCP 445 sockets", ), ), ) @@ -1474,11 +1474,11 @@ def test_run_doctor_checks_skips_mast_probe_when_ssh_is_skipped(self) -> None: def test_run_doctor_checks_reports_managed_smbd_subchecks(self) -> None: smbd_probe = mock.Mock( ready=False, - detail="smbd is not bound to IPv4 TCP 445", + detail="smbd is not bound to required TCP 445 sockets", lines=( "PASS:managed runtime smb.conf present", "PASS:managed smbd parent process is running", - "FAIL:smbd is not bound to IPv4 TCP 445", + "FAIL:smbd is not bound to required TCP 445 sockets", ), ) run = self.run_doctor_with_mocks( @@ -1493,7 +1493,7 @@ def test_run_doctor_checks_reports_managed_smbd_subchecks(self) -> None: ) self.assertTrue(run.fatal) self.assertTrue(any(result.status == "PASS" and result.message == "managed smbd parent process is running" for result in run.results)) - self.assertTrue(any(result.status == "FAIL" and result.message == "smbd is not bound to IPv4 TCP 445" for result in run.results)) + self.assertTrue(any(result.status == "FAIL" and result.message == "smbd is not bound to required TCP 445 sockets" for result in run.results)) self.assertFalse(any(result.message.startswith("managed smbd is not ready") for result in run.results)) def test_run_doctor_checks_reports_supported_device_compatibility(self) -> None: diff --git a/tests/test_cli.py b/tests/test_cli.py index 65e3a6f..e3dad3f 100644 --- a/tests/test_cli.py +++ b/tests/test_cli.py @@ -4732,7 +4732,7 @@ def test_activate_dry_run_prints_netbsd4_activation_plan(self) -> None: self.assertIn("skip rc.local if NetBSD4 payload is already healthy", text) self.assertIn("managed runtime smb.conf is present", text) self.assertIn("managed smbd parent process is running", text) - self.assertIn("smbd is bound to IPv4 TCP 445", text) + self.assertIn("smbd is bound to required TCP 445 sockets", text) self.assertIn("mdns-advertiser is bound to UDP 5353", text) self.assertIn("This will start the deployed Samba payload on the AirPort storage device.", text) self.assertIn("NetBSD 4 devices cannot auto-run Samba after a reboot.", text) diff --git a/tests/test_cli_flows.py b/tests/test_cli_flows.py index f86eb63..c05a1e6 100644 --- a/tests/test_cli_flows.py +++ b/tests/test_cli_flows.py @@ -439,7 +439,7 @@ def test_verify_managed_runtime_flow_collects_network_diagnostics_after_auto_ip_ mock.patch( "timecapsulesmb.cli.flows.read_runtime_log_tails_conn", return_value={ - "remote_watchdog_log_tail": "watchdog: mDNS startup deferred; no usable IPv4 has appeared yet", + "remote_watchdog_log_tail": "watchdog: mDNS startup deferred; no usable address has appeared yet", }, ), mock.patch( diff --git a/tests/test_deploy_modules.py b/tests/test_deploy_modules.py index d1a716d..2760fc9 100644 --- a/tests/test_deploy_modules.py +++ b/tests/test_deploy_modules.py @@ -1672,6 +1672,113 @@ def test_mdns_auto_ip_cidr_helpers_format_valid_bind_output(self) -> None: self.assertEqual(run.returncode, 0, run.stderr) self.assertEqual(run.stdout, "10.0.1.1/24 192.168.1.40/24\n") + def test_mdns_smb_bind_tokens_and_host_records_are_link_scoped_dual_stack(self) -> None: + mdns_source = (REPO_ROOT / "build" / "mdns-advertiser.c").as_posix() + source = ''' +#include +#include +#define main mdns_advertiser_main +#include "{mdns_source}" +#undef main + +static int buffer_contains(const uint8_t *buf, size_t len, const void *needle, size_t needle_len) {{ + size_t i; + for (i = 0; i + needle_len <= len; i++) {{ + if (memcmp(buf + i, needle, needle_len) == 0) {{ + return 1; + }} + }} + return 0; +}} + +int main(void) {{ + struct link_context_set set; + struct in6_addr ula; + struct in6_addr ll; + uint8_t packet[512]; + size_t off; + int answers; + + memset(&set, 0, sizeof(set)); + if (inet_pton(AF_INET6, "fdbb:1111:2222:3333::40", &ula) != 1 || + inet_pton(AF_INET6, "fe80::40", &ll) != 1) {{ + return 1; + }} + append_link_ipv4(&set, "bridge0", inet_addr("10.0.1.1"), inet_addr("255.255.255.0"), IFF_UP | IFF_RUNNING); + append_link_ipv4(&set, "bridge0", inet_addr("169.254.1.9"), inet_addr("255.255.0.0"), IFF_UP | IFF_RUNNING); + append_link_ipv4(&set, "lo0", inet_addr("127.0.0.1"), inet_addr("255.0.0.0"), IFF_UP | IFF_RUNNING); + append_link_ipv6(&set, "bridge0", &ula, 64, 7, IFF_UP | IFF_RUNNING); + append_link_ipv6(&set, "bridge0", &ll, 64, 7, IFF_UP | IFF_RUNNING); + + if (set.count != 1 || set.links[0].ipv4_count != 2 || set.links[0].ipv6_count != 2) {{ + return 2; + }} + if (print_smb_link_bind_tokens(stdout, &set) != 0) {{ + return 3; + }} + + memset(packet, 0, sizeof(packet)); + off = 0; + answers = 0; + if (append_host_address_records(packet, &off, sizeof(packet), "timecapsule.local.", &set.links[0], 1, 1, 120, &answers) != 0) {{ + return 4; + }} + if (answers != 3 || + !buffer_contains(packet, off, &set.links[0].ipv4[0].addr, sizeof(set.links[0].ipv4[0].addr)) || + !buffer_contains(packet, off, &set.links[0].ipv4[1].addr, sizeof(set.links[0].ipv4[1].addr)) || + !buffer_contains(packet, off, &ula, sizeof(ula)) || + buffer_contains(packet, off, &ll, sizeof(ll))) {{ + return 5; + }} + return 0; +}} +'''.format(mdns_source=mdns_source) + run = self._compile_and_run_c_helper(source, "mdns_dual_stack_bind_records") + self.assertEqual(run.returncode, 0, run.stderr) + self.assertEqual(run.stdout, "10.0.1.1/24 169.254.1.9/16 fdbb:1111:2222:3333::40/64\n") + + def test_mdns_advertise_links_exclude_fe80_only_links_but_keep_ipv4_fe80_transport(self) -> None: + mdns_source = (REPO_ROOT / "build" / "mdns-advertiser.c").as_posix() + source = ''' +#include +#include +#define main mdns_advertiser_main +#include "{mdns_source}" +#undef main + +int main(void) {{ + struct link_context_set all_links; + struct link_context_set advertise_links; + struct in6_addr ll1; + struct in6_addr ll2; + + memset(&all_links, 0, sizeof(all_links)); + if (inet_pton(AF_INET6, "fe80::1", &ll1) != 1 || + inet_pton(AF_INET6, "fe80::2", &ll2) != 1) {{ + return 1; + }} + + append_link_ipv6(&all_links, "bridge0", &ll1, 64, 7, IFF_UP | IFF_RUNNING); + append_link_ipv4(&all_links, "bridge1", inet_addr("192.168.1.40"), inet_addr("255.255.255.0"), IFF_UP | IFF_RUNNING); + append_link_ipv6(&all_links, "bridge1", &ll2, 64, 8, IFF_UP | IFF_RUNNING); + filter_advertise_link_contexts(&advertise_links, &all_links); + + if (all_links.count != 2 || advertise_links.count != 1) {{ + return 2; + }} + if (strcmp(advertise_links.links[0].name, "bridge1") != 0) {{ + return 3; + }} + if (!link_contexts_need_ipv4_socket(&advertise_links) || + !link_contexts_need_ipv6_socket(&advertise_links)) {{ + return 4; + }} + return 0; +}} +'''.format(mdns_source=mdns_source) + run = self._compile_and_run_c_helper(source, "mdns_advertise_link_filter") + self.assertEqual(run.returncode, 0, run.stderr) + def test_mdns_print_auto_ip_cidrs_returns_distinct_probe_failure_status(self) -> None: mdns_source = (REPO_ROOT / "build" / "mdns-advertiser.c").as_posix() source = ''' @@ -1723,6 +1830,176 @@ def test_mdns_print_auto_ip_cidrs_returns_distinct_probe_failure_status(self) -> self.assertEqual(run.returncode, 0, run.stderr) self.assertEqual(run.stdout, "10.0.1.1/24\n") + def test_mdns_print_smb_bind_interfaces_returns_dual_stack_probe_status(self) -> None: + mdns_source = (REPO_ROOT / "build" / "mdns-advertiser.c").as_posix() + source = ''' +#include +#include +#define main mdns_advertiser_main +#include "{mdns_source}" +#undef main + +struct fake_bind_plan {{ + int mode; +}}; + +static int fake_collect_links(struct link_context_set *out, void *userdata) {{ + struct fake_bind_plan *plan = (struct fake_bind_plan *)userdata; + struct in6_addr ula; + struct in6_addr ll; + + memset(out, 0, sizeof(*out)); + if (plan->mode == 1) {{ + return -1; + }} + if (plan->mode == 2) {{ + inet_pton(AF_INET6, "fdbb:1111:2222:3333::40", &ula); + inet_pton(AF_INET6, "fe80::40", &ll); + append_link_ipv4(out, "bridge0", inet_addr("169.254.1.9"), inet_addr("255.255.0.0"), IFF_UP | IFF_RUNNING); + append_link_ipv6(out, "bridge0", &ula, 64, 7, IFF_UP | IFF_RUNNING); + append_link_ipv6(out, "bridge0", &ll, 64, 7, IFF_UP | IFF_RUNNING); + }} + if (plan->mode == 3) {{ + inet_pton(AF_INET6, "fe80::40", &ll); + append_link_ipv6(out, "bridge0", &ll, 64, 7, IFF_UP | IFF_RUNNING); + }} + return 0; +}} + +int main(void) {{ + struct fake_bind_plan plan; + + memset(&plan, 0, sizeof(plan)); + plan.mode = 2; + if (print_smb_bind_interfaces_with_provider(stdout, fake_collect_links, &plan) != EXIT_OK) {{ + return 1; + }} + plan.mode = 0; + if (print_smb_bind_interfaces_with_provider(stdout, fake_collect_links, &plan) != EXIT_AUTO_IP_UNAVAILABLE) {{ + return 2; + }} + plan.mode = 1; + if (print_smb_bind_interfaces_with_provider(stdout, fake_collect_links, &plan) != EXIT_AUTO_IP_PROBE_FAILED) {{ + return 3; + }} + plan.mode = 3; + if (print_smb_bind_interfaces_with_provider(stdout, fake_collect_links, &plan) != EXIT_AUTO_IP_UNAVAILABLE) {{ + return 4; + }} + if (print_smb_bind_interfaces_with_provider(stdout, NULL, &plan) != EXIT_AUTO_IP_PROBE_FAILED) {{ + return 5; + }} + return 0; +}} +'''.format(mdns_source=mdns_source) + run = self._compile_and_run_c_helper(source, "mdns_print_smb_bind_status") + self.assertEqual(run.returncode, 0, run.stderr) + self.assertEqual(run.stdout, "169.254.1.9/16 fdbb:1111:2222:3333::40/64\n") + + def test_mdns_print_socket_families_uses_advertise_links_not_samba_tokens(self) -> None: + mdns_source = (REPO_ROOT / "build" / "mdns-advertiser.c").as_posix() + source = ''' +#include +#include +#define main mdns_advertiser_main +#include "{mdns_source}" +#undef main + +struct fake_family_plan {{ + int mode; +}}; + +static int fake_collect_advertise_links(struct link_context_set *out, void *userdata) {{ + struct fake_family_plan *plan = (struct fake_family_plan *)userdata; + struct in6_addr ll; + struct in6_addr ula; + + memset(out, 0, sizeof(*out)); + inet_pton(AF_INET6, "fe80::40", &ll); + inet_pton(AF_INET6, "fdbb:1111:2222:3333::40", &ula); + if (plan->mode == 1) {{ + return -1; + }} + if (plan->mode == 2) {{ + append_link_ipv4(out, "bridge0", inet_addr("192.168.1.40"), inet_addr("255.255.255.0"), IFF_UP | IFF_RUNNING); + append_link_ipv6(out, "bridge0", &ll, 64, 7, IFF_UP | IFF_RUNNING); + }} + if (plan->mode == 3) {{ + append_link_ipv6(out, "bridge0", &ula, 64, 7, IFF_UP | IFF_RUNNING); + }} + if (plan->mode == 4) {{ + append_link_ipv6(out, "bridge0", &ll, 64, 7, IFF_UP | IFF_RUNNING); + }} + return 0; +}} + +int main(void) {{ + struct fake_family_plan plan; + + memset(&plan, 0, sizeof(plan)); + plan.mode = 2; + if (print_mdns_socket_families_with_provider(stdout, fake_collect_advertise_links, &plan) != EXIT_OK) {{ + return 1; + }} + plan.mode = 3; + if (print_mdns_socket_families_with_provider(stdout, fake_collect_advertise_links, &plan) != EXIT_OK) {{ + return 2; + }} + plan.mode = 0; + if (print_mdns_socket_families_with_provider(stdout, fake_collect_advertise_links, &plan) != EXIT_AUTO_IP_UNAVAILABLE) {{ + return 3; + }} + plan.mode = 4; + if (print_mdns_socket_families_with_provider(stdout, fake_collect_advertise_links, &plan) != EXIT_AUTO_IP_UNAVAILABLE) {{ + return 5; + }} + plan.mode = 1; + if (print_mdns_socket_families_with_provider(stdout, fake_collect_advertise_links, &plan) != EXIT_AUTO_IP_PROBE_FAILED) {{ + return 4; + }} + return 0; +}} +'''.format(mdns_source=mdns_source) + run = self._compile_and_run_c_helper(source, "mdns_print_socket_families") + self.assertEqual(run.returncode, 0, run.stderr) + self.assertEqual(run.stdout, "ipv4 ipv6\nipv6\n") + + def test_mdns_scoped_ipv6_multicast_destination_uses_link_ifindex(self) -> None: + mdns_source = (REPO_ROOT / "build" / "mdns-advertiser.c").as_posix() + source = ''' +#include +#include +#define main mdns_advertiser_main +#include "{mdns_source}" +#undef main + +int main(void) {{ + struct sockaddr_in6 base; + struct sockaddr_in6 scoped; + struct link_context link; + + memset(&base, 0, sizeof(base)); + memset(&scoped, 0, sizeof(scoped)); + memset(&link, 0, sizeof(link)); + base.sin6_family = AF_INET6; + base.sin6_port = htons(5353); + if (inet_pton(AF_INET6, "ff02::fb", &base.sin6_addr) != 1) {{ + return 1; + }} + link.ifindex = 17; + scoped_mdns_dest6_for_link(&scoped, &base, &link); + if (scoped.sin6_family != AF_INET6 || + scoped.sin6_port != htons(5353) || + scoped.sin6_scope_id != 17 || + memcmp(&scoped.sin6_addr, &base.sin6_addr, sizeof(base.sin6_addr)) != 0) {{ + return 2; + }} + return 0; +}} +'''.format(mdns_source=mdns_source) + run = self._compile_and_run_c_helper(source, "mdns_scoped_ipv6_dest") + self.assertEqual(run.returncode, 0, run.stderr) + def test_mdns_auto_ip_wait_stabilizes_after_first_usable_ipv4(self) -> None: mdns_source = (REPO_ROOT / "build" / "mdns-advertiser.c").as_posix() source = ''' @@ -1784,7 +2061,7 @@ def test_mdns_auto_ip_wait_stabilizes_after_first_usable_ipv4(self) -> None: run = self._compile_and_run_c_helper(source, "mdns_auto_ip_wait") self.assertEqual(run.returncode, 0, run.stderr) - def test_mdns_auto_capture_stops_after_first_matching_trusted_context(self) -> None: + def test_mdns_auto_capture_merges_all_context_snapshots(self) -> None: mdns_source = (REPO_ROOT / "build" / "mdns-advertiser.c").as_posix() source = ''' #include @@ -1838,11 +2115,14 @@ def test_mdns_auto_capture_stops_after_first_matching_trusted_context(self) -> N append_iface_context(&contexts, "bridge0", inet_addr("10.0.1.1"), inet_addr("255.255.255.0"), IFF_UP | IFF_RUNNING); append_iface_context(&contexts, "bcmeth0", inet_addr("192.168.1.217"), inet_addr("255.255.255.0"), IFF_UP | IFF_RUNNING); add_airport_record(&plan.sets[0], "timecapsule", "80-EA-96-E6-58-68"); + add_airport_record(&plan.sets[1], "timecapsule-wan", "80-EA-96-E6-58-68"); - if (capture_mdns_snapshot_auto_with_provider(&out, &contexts, &cfg, 1, fake_capture_context, &plan) != 0) {{ + if (capture_mdns_snapshot_auto_with_provider(&out, &contexts, &cfg, 0, fake_capture_context, &plan) != 0) {{ return 1; }} - if (plan.calls != 1 || out.count != 1 || strcmp(out.records[0].host_label, "timecapsule") != 0) {{ + if (plan.calls != 2 || out.count != 2 || + strcmp(out.records[0].host_label, "timecapsule") != 0 || + strcmp(out.records[1].host_label, "timecapsule-wan") != 0) {{ return 2; }} return 0; @@ -1851,7 +2131,7 @@ def test_mdns_auto_capture_stops_after_first_matching_trusted_context(self) -> N run = self._compile_and_run_c_helper(source, "mdns_auto_capture_first_match") self.assertEqual(run.returncode, 0, run.stderr) - def test_mdns_auto_capture_continues_until_trusted_context_matches(self) -> None: + def test_mdns_auto_capture_keeps_untrusted_records_for_later_filtering(self) -> None: mdns_source = (REPO_ROOT / "build" / "mdns-advertiser.c").as_posix() source = ''' #include @@ -1910,7 +2190,9 @@ def test_mdns_auto_capture_continues_until_trusted_context_matches(self) -> None if (capture_mdns_snapshot_auto_with_provider(&out, &contexts, &cfg, 1, fake_capture_context, &plan) != 0) {{ return 1; }} - if (plan.calls != 2 || out.count != 1 || strcmp(out.records[0].host_label, "timecapsule") != 0) {{ + if (plan.calls != 2 || out.count != 2 || + strcmp(out.records[0].host_label, "wrong-device") != 0 || + strcmp(out.records[1].host_label, "timecapsule") != 0) {{ return 2; }} return 0; @@ -2820,6 +3102,8 @@ def test_mdns_advertiser_routes_qu_qm_and_mixed_query_responses(self) -> None: static int run_route_cases(void) { struct config cfg; + struct iface_context response_ctx; + struct link_context response_link; struct service_record_set snapshot; struct sockaddr_in mdns_dest; struct sockaddr_in source; @@ -2827,13 +3111,18 @@ def test_mdns_advertiser_routes_qu_qm_and_mixed_query_responses(self) -> None: size_t query_len; configure_base(&cfg); + memset(&response_ctx, 0, sizeof(response_ctx)); + snprintf(response_ctx.name, sizeof(response_ctx.name), "%s", "bridge0"); + response_ctx.ipv4_addr = cfg.ipv4_addr; + response_ctx.netmask = inet_addr("255.255.255.0"); + link_context_from_iface_context(&response_link, &response_ctx); memset(&snapshot, 0, sizeof(snapshot)); configure_addrs(&mdns_dest, &source); reset_captures(); query_len = make_query(query, cfg.service_type, DNS_TYPE_PTR, DNS_CLASS_IN | DNS_CLASS_CACHE_FLUSH); if (query_len == 0 || - handle_query(1, query, query_len, &mdns_dest, &source, &cfg, cfg.ipv4_addr, &snapshot, 0) != 0) { + handle_query(1, query, query_len, &mdns_dest, &source, &cfg, &response_link, &snapshot, 0) != 0) { return 1; } if (captured_count != 1 || @@ -2846,7 +3135,7 @@ def test_mdns_advertiser_routes_qu_qm_and_mixed_query_responses(self) -> None: reset_captures(); query_len = make_query(query, cfg.service_type, DNS_TYPE_PTR, DNS_CLASS_IN); if (query_len == 0 || - handle_query(1, query, query_len, &mdns_dest, &source, &cfg, cfg.ipv4_addr, &snapshot, 0) != 0) { + handle_query(1, query, query_len, &mdns_dest, &source, &cfg, &response_link, &snapshot, 0) != 0) { return 3; } if (captured_count != 1 || @@ -2859,7 +3148,7 @@ def test_mdns_advertiser_routes_qu_qm_and_mixed_query_responses(self) -> None: reset_captures(); query_len = make_mixed_query(query, cfg.service_type, cfg.host_fqdn); if (query_len == 0 || - handle_query(1, query, query_len, &mdns_dest, &source, &cfg, cfg.ipv4_addr, &snapshot, 0) != 0) { + handle_query(1, query, query_len, &mdns_dest, &source, &cfg, &response_link, &snapshot, 0) != 0) { return 5; } if (captured_count != 2 || @@ -2875,7 +3164,7 @@ def test_mdns_advertiser_routes_qu_qm_and_mixed_query_responses(self) -> None: reset_captures(); query_len = make_query(query, cfg.service_type, DNS_TYPE_PTR, DNS_CLASS_CACHE_FLUSH | 2); if (query_len == 0 || - handle_query(1, query, query_len, &mdns_dest, &source, &cfg, cfg.ipv4_addr, &snapshot, 0) != 0) { + handle_query(1, query, query_len, &mdns_dest, &source, &cfg, &response_link, &snapshot, 0) != 0) { return 7; } if (captured_count != 0) { @@ -3007,6 +3296,8 @@ def test_mdns_advertiser_diskless_answers_host_a_but_not_smb(self) -> None: int main(void) { struct config cfg; + struct iface_context response_ctx; + struct link_context response_link; struct service_record_set snapshot; struct sockaddr_in mdns_dest; struct sockaddr_in source; @@ -3014,6 +3305,11 @@ def test_mdns_advertiser_diskless_answers_host_a_but_not_smb(self) -> None: size_t query_len; configure_base(&cfg); + memset(&response_ctx, 0, sizeof(response_ctx)); + snprintf(response_ctx.name, sizeof(response_ctx.name), "%s", "bridge0"); + response_ctx.ipv4_addr = cfg.ipv4_addr; + response_ctx.netmask = inet_addr("255.255.255.0"); + link_context_from_iface_context(&response_link, &response_ctx); memset(&snapshot, 0, sizeof(snapshot)); memset(&mdns_dest, 0, sizeof(mdns_dest)); mdns_dest.sin_family = AF_INET; @@ -3027,7 +3323,7 @@ def test_mdns_advertiser_diskless_answers_host_a_but_not_smb(self) -> None: reset_captures(); query_len = make_query(query, cfg.service_type, DNS_TYPE_PTR); if (query_len == 0 || - handle_query(1, query, query_len, &mdns_dest, &source, &cfg, cfg.ipv4_addr, &snapshot, 0) != 0) { + handle_query(1, query, query_len, &mdns_dest, &source, &cfg, &response_link, &snapshot, 0) != 0) { return 1; } if (captured_count != 0) { @@ -3037,7 +3333,7 @@ def test_mdns_advertiser_diskless_answers_host_a_but_not_smb(self) -> None: reset_captures(); query_len = make_query(query, cfg.host_fqdn, DNS_TYPE_A); if (query_len == 0 || - handle_query(1, query, query_len, &mdns_dest, &source, &cfg, cfg.ipv4_addr, &snapshot, 0) != 0) { + handle_query(1, query, query_len, &mdns_dest, &source, &cfg, &response_link, &snapshot, 0) != 0) { return 3; } if (captured_count != 1 || @@ -3199,6 +3495,8 @@ def test_mdns_advertiser_query_response_preserves_snapshot_suppression(self) -> int main(void) { struct config cfg; + struct iface_context response_ctx; + struct link_context response_link; struct service_record_set snapshot; struct sockaddr_in mdns_dest; struct sockaddr_in source; @@ -3206,6 +3504,11 @@ def test_mdns_advertiser_query_response_preserves_snapshot_suppression(self) -> size_t query_len; configure_base(&cfg); + memset(&response_ctx, 0, sizeof(response_ctx)); + snprintf(response_ctx.name, sizeof(response_ctx.name), "%s", "bridge0"); + response_ctx.ipv4_addr = cfg.ipv4_addr; + response_ctx.netmask = inet_addr("255.255.255.0"); + link_context_from_iface_context(&response_link, &response_ctx); memset(&snapshot, 0, sizeof(snapshot)); configure_addrs(&mdns_dest, &source); add_snapshot_record(&snapshot, "_airport._tcp.local.", "Alton Time Capsule", "Alton-Time-Capsule", 5009, "syAP=116"); @@ -3214,7 +3517,7 @@ def test_mdns_advertiser_query_response_preserves_snapshot_suppression(self) -> reset_captures(); query_len = make_query(query, "_afpovertcp._tcp.local.", DNS_TYPE_PTR); if (query_len == 0 || - handle_query(1, query, query_len, &mdns_dest, &source, &cfg, cfg.ipv4_addr, &snapshot, 1) != 0 || + handle_query(1, query, query_len, &mdns_dest, &source, &cfg, &response_link, &snapshot, 1) != 0 || captured_count != 0) { return 1; } @@ -3222,7 +3525,7 @@ def test_mdns_advertiser_query_response_preserves_snapshot_suppression(self) -> reset_captures(); query_len = make_query(query, "_airport._tcp.local.", DNS_TYPE_PTR); if (query_len == 0 || - handle_query(1, query, query_len, &mdns_dest, &source, &cfg, cfg.ipv4_addr, &snapshot, 1) != 0 || + handle_query(1, query, query_len, &mdns_dest, &source, &cfg, &response_link, &snapshot, 1) != 0 || captured_count != 1 || !packet_has_browse_additionals(captured_packets[0], captured_lengths[0])) { return 2; @@ -3231,7 +3534,7 @@ def test_mdns_advertiser_query_response_preserves_snapshot_suppression(self) -> reset_captures(); query_len = make_query(query, cfg.service_type, DNS_TYPE_PTR); if (query_len == 0 || - handle_query(1, query, query_len, &mdns_dest, &source, &cfg, cfg.ipv4_addr, &snapshot, 1) != 0 || + handle_query(1, query, query_len, &mdns_dest, &source, &cfg, &response_link, &snapshot, 1) != 0 || captured_count != 1 || !packet_has_browse_additionals(captured_packets[0], captured_lengths[0])) { return 3; @@ -3376,6 +3679,8 @@ def test_mdns_advertiser_splits_snapshot_announcements_and_keeps_managed_device_ int main(void) {{ struct config cfg; + struct iface_context response_ctx; + struct link_context response_link; struct service_record_set snapshot; struct sockaddr_in dest; struct service_record *record; @@ -3404,6 +3709,11 @@ def test_mdns_advertiser_splits_snapshot_announcements_and_keeps_managed_device_ cfg.adisk_port = 9; cfg.ttl = 120; cfg.ipv4_addr = inet_addr("192.168.1.217"); + memset(&response_ctx, 0, sizeof(response_ctx)); + snprintf(response_ctx.name, sizeof(response_ctx.name), "%s", "bridge0"); + response_ctx.ipv4_addr = cfg.ipv4_addr; + response_ctx.netmask = inet_addr("255.255.255.0"); + link_context_from_iface_context(&response_link, &response_ctx); memset(&snapshot, 0, sizeof(snapshot)); @@ -3451,7 +3761,7 @@ def test_mdns_advertiser_splits_snapshot_announcements_and_keeps_managed_device_ dest.sin_port = htons(5353); dest.sin_addr.s_addr = inet_addr("224.0.0.251"); - if (send_announcement(1, &dest, &cfg, cfg.ipv4_addr, cfg.ttl, &snapshot, 1) != 0) {{ + if (send_announcement(1, &dest, &cfg, &response_link, cfg.ttl, &snapshot, 1) != 0) {{ return 10; }} if (captured_count < 3) {{ @@ -3581,6 +3891,8 @@ def test_mdns_advertiser_diskless_replays_unsuppressed_snapshot_records(self) -> int main(void) { struct config cfg; + struct iface_context response_ctx; + struct link_context response_link; struct service_record_set snapshot; struct sockaddr_in dest; struct service_record_set parsed; @@ -3610,6 +3922,11 @@ def test_mdns_advertiser_diskless_replays_unsuppressed_snapshot_records(self) -> cfg.ttl = 120; cfg.ipv4_addr = inet_addr("10.0.1.77"); cfg.diskless = 1; + memset(&response_ctx, 0, sizeof(response_ctx)); + snprintf(response_ctx.name, sizeof(response_ctx.name), "%s", "bridge0"); + response_ctx.ipv4_addr = cfg.ipv4_addr; + response_ctx.netmask = inet_addr("255.255.255.0"); + link_context_from_iface_context(&response_link, &response_ctx); if (add_adisk_disk_config(&cfg, "Data", "dk2", "12345678-1234-1234-1234-123456789012", "0x82") != 0) { return 1; } @@ -3627,7 +3944,7 @@ def test_mdns_advertiser_diskless_replays_unsuppressed_snapshot_records(self) -> dest.sin_port = htons(5353); dest.sin_addr.s_addr = inet_addr("224.0.0.251"); - if (send_announcement(1, &dest, &cfg, cfg.ipv4_addr, cfg.ttl, &snapshot, 1) != 0) { + if (send_announcement(1, &dest, &cfg, &response_link, cfg.ttl, &snapshot, 1) != 0) { return 2; } if (captured_count < 3) { @@ -4683,10 +5000,10 @@ def test_smbd_status_helpers_pass_only_with_live_ram_auth_mount_and_watchdog(sel self.assertIn("PASS:active smb.conf xattr_tdb:file is persistent", result.stdout) self.assertIn("PASS:all managed share volumes are mounted", result.stdout) self.assertIn("PASS:watchdog is running for managed runtime", result.stdout) - self.assertIn("PASS:smbd bound to IPv4 TCP 445", result.stdout) + self.assertIn("PASS:smbd bound to required TCP 445 sockets", result.stdout) self.assertIn("status=0", result.stdout) - def test_smbd_status_helper_rejects_ipv6_only_smbd_listener(self) -> None: + def test_smbd_status_helper_requires_configured_tcp_445_families(self) -> None: script = ( SMBD_STATUS_HELPERS + r''' @@ -4697,18 +5014,22 @@ def test_smbd_status_helper_rejects_ipv6_only_smbd_listener(self) -> None: root smbd 101 11 internet stream tcp 0x0 *:445 EOF ) -smbd_bound_445 "$ipv4"; echo "ipv4=$?" -smbd_bound_445 "$ipv6"; echo "ipv6=$?" -smbd_bound_445 "$both"; echo "both=$?" +smbd_bound_445 "$ipv4" ""; echo "ipv4_default=$?" +smbd_bound_445 "$ipv6" ""; echo "ipv6_default=$?" +smbd_bound_445 "$ipv6" "127.0.0.1/8 ::1/128 fdbb:1111:2222:3333::40/64"; echo "ipv6_required=$?" +smbd_bound_445 "$ipv4" "127.0.0.1/8 ::1/128 192.168.1.40/24 fdbb:1111:2222:3333::40/64"; echo "ipv4_missing_v6=$?" +smbd_bound_445 "$both" "127.0.0.1/8 ::1/128 192.168.1.40/24 fdbb:1111:2222:3333::40/64"; echo "both_required=$?" ''' ) result = subprocess.run(["/bin/sh", "-c", script], check=False, text=True, capture_output=True) self.assertEqual(result.returncode, 0, result.stderr) - self.assertIn("ipv4=0", result.stdout) - self.assertIn("ipv6=1", result.stdout) - self.assertIn("both=0", result.stdout) + self.assertIn("ipv4_default=0", result.stdout) + self.assertIn("ipv6_default=1", result.stdout) + self.assertIn("ipv6_required=0", result.stdout) + self.assertIn("ipv4_missing_v6=1", result.stdout) + self.assertIn("both_required=0", result.stdout) def test_smbd_status_helpers_fail_for_disk_auth_unmounted_volume_and_missing_watchdog(self) -> None: with tempfile.TemporaryDirectory() as tmpdir: @@ -4781,7 +5102,7 @@ def test_mdns_status_helper_reports_missing_binary_instead_of_network_defer(self self.assertIn("FAIL:mdns-advertiser is not bound to UDP 5353", result.stdout) self.assertIn("PASS:Apple mDNSResponder is stopped", result.stdout) self.assertIn("status=1", result.stdout) - self.assertNotIn("mDNS startup deferred; no usable IPv4 has appeared yet", result.stdout) + self.assertNotIn("mDNS startup deferred; no usable address has appeared yet", result.stdout) def test_mdns_status_helper_requires_auto_ip_when_process_is_bound(self) -> None: with tempfile.TemporaryDirectory() as tmpdir: @@ -4806,10 +5127,10 @@ def test_mdns_status_helper_requires_auto_ip_when_process_is_bound(self) -> None self.assertEqual(result.returncode, 0, result.stderr) self.assertIn("PASS:mdns-advertiser process is running", result.stdout) - self.assertIn("PASS:mdns-advertiser bound to UDP 5353", result.stdout) - self.assertIn("FAIL:mdns-advertiser bound to UDP 5353 but auto-IP is not active", result.stdout) + self.assertIn("PASS:mdns-advertiser bound to required UDP 5353 sockets", result.stdout) + self.assertIn("FAIL:mdns-advertiser bound to UDP 5353 but bind address is not active", result.stdout) self.assertIn("status=1", result.stdout) - self.assertNotIn("PASS:mdns-advertiser auto-IP active", result.stdout) + self.assertNotIn("PASS:mdns-advertiser bind address active", result.stdout) def test_mdns_status_helper_reports_unexpected_auto_ip_check_failure(self) -> None: with tempfile.TemporaryDirectory() as tmpdir: @@ -4833,10 +5154,10 @@ def test_mdns_status_helper_reports_unexpected_auto_ip_check_failure(self) -> No result = subprocess.run(["/bin/sh", "-c", script], check=False, text=True, capture_output=True) self.assertEqual(result.returncode, 0, result.stderr) - self.assertIn("FAIL:mdns-advertiser auto-IP CIDR probe failed with exit code 3", result.stdout) + self.assertIn("FAIL:mdns-advertiser mDNS socket family probe failed with exit code 3", result.stdout) self.assertIn("PASS:mdns-advertiser process is running", result.stdout) - self.assertIn("PASS:mdns-advertiser bound to UDP 5353", result.stdout) - self.assertIn("FAIL:mdns-advertiser bound to UDP 5353 but auto-IP is not active", result.stdout) + self.assertIn("PASS:mdns-advertiser bound to required UDP 5353 sockets", result.stdout) + self.assertIn("FAIL:mdns-advertiser bound to UDP 5353 but bind address is not active", result.stdout) self.assertIn("status=1", result.stdout) def test_mdns_status_helper_passes_only_when_bound_and_auto_ip_active(self) -> None: @@ -4862,11 +5183,37 @@ def test_mdns_status_helper_passes_only_when_bound_and_auto_ip_active(self) -> N self.assertEqual(result.returncode, 0, result.stderr) self.assertIn("PASS:mdns-advertiser process is running", result.stdout) - self.assertIn("PASS:mdns-advertiser bound to UDP 5353", result.stdout) - self.assertIn("PASS:mdns-advertiser auto-IP active", result.stdout) + self.assertIn("PASS:mdns-advertiser bound to required UDP 5353 sockets", result.stdout) + self.assertIn("PASS:mdns-advertiser bind address active", result.stdout) self.assertIn("PASS:Apple mDNSResponder is stopped", result.stdout) self.assertIn("status=0", result.stdout) + def test_mdns_status_helper_requires_reported_udp_5353_families(self) -> None: + with tempfile.TemporaryDirectory() as tmpdir: + mdns_bin = Path(tmpdir) / "mdns-advertiser" + mdns_bin.write_text("#!/bin/sh\necho 'ipv4 ipv6'\n") + mdns_bin.chmod(0o755) + ps_out = "201 1 S 0:00.00 mdns-advertiser /mnt/Flash/mdns-advertiser" + fstat_out = "root mdns-advertiser 201 10 internet dgram udp 0x0 *:5353" + script = f""" +RUNTIME_MDNS_BIN={shlex.quote(str(mdns_bin))} +{SMBD_STATUS_HELPERS} +ps_out={shlex.quote(ps_out)} +fstat_out={shlex.quote(fstat_out)} +if describe_managed_mdns_status "$ps_out" "$fstat_out"; then + echo status=0 +else + echo status=$? +fi +""" + + result = subprocess.run(["/bin/sh", "-c", script], check=False, text=True, capture_output=True) + + self.assertEqual(result.returncode, 0, result.stderr) + self.assertIn("PASS:mdns-advertiser process is running", result.stdout) + self.assertIn("FAIL:mdns-advertiser is not bound to UDP 5353", result.stdout) + self.assertIn("status=1", result.stdout) + def test_probe_managed_smbd_reports_runtime_invariant_failures(self) -> None: stdout = "\n".join( [ @@ -4924,7 +5271,7 @@ def test_probe_managed_mdns_takeover_single_shot_checks_process_binding_and_appl self.assertIn('capture_fstat_for_ucomm "$ps_out" mdns-advertiser', remote_command) self.assertIn('/usr/bin/fstat -p "$1"', remote_command) self.assertIn("mdns_bound_5353()", remote_command) - self.assertIn("--print-auto-ip-cidrs", remote_command) + self.assertIn("--print-mdns-socket-families", remote_command) self.assertNotIn("--check-auto-ip", remote_command) self.assertNotIn('out="$(fstat 2>&1)"', remote_command) self.assertNotIn("max_attempts", remote_command) @@ -5068,7 +5415,7 @@ def test_netbsd4_activation_plan_contains_no_reboot_actions(self) -> None: self.assertIn("NetBSD 4 devices cannot auto-run Samba after a reboot.", text) self.assertIn("Run `activate` after a reboot if the device did not auto-start Samba.", text) self.assertIn("managed runtime smb.conf is present", text) - self.assertIn("smbd is bound to IPv4 TCP 445", text) + self.assertIn("smbd is bound to required TCP 445 sockets", text) self.assertIn("mdns-advertiser is bound to UDP 5353", text) def test_netbsd6_no_reboot_plan_has_no_reboot_checks(self) -> None: diff --git a/tests/test_probe.py b/tests/test_probe.py index eda013c..748aa29 100644 --- a/tests/test_probe.py +++ b/tests/test_probe.py @@ -203,8 +203,8 @@ def test_runtime_startup_failure_debug_fields_classifies_auto_ip_unavailable(sel fields = runtime_startup_failure_debug_fields( { "remote_watchdog_log_tail": ( - "watchdog: mDNS auto-ip check: no usable IPv4 yet\n" - "watchdog: mDNS startup deferred; no usable IPv4 has appeared yet\n" + "watchdog: mDNS auto-ip check: no usable address yet\n" + "watchdog: mDNS startup deferred; no usable address has appeared yet\n" ) } ) diff --git a/tests/test_storage_runtime.py b/tests/test_storage_runtime.py index 2b221d9..cdfe370 100644 --- a/tests/test_storage_runtime.py +++ b/tests/test_storage_runtime.py @@ -2089,7 +2089,7 @@ def test_common_smb_bind_context_waits_settles_and_uses_fresh_probe(self) -> Non textwrap.dedent( f"""\ #!/bin/sh - [ "$1" = "--print-auto-ip-cidrs" ] || exit 2 + [ "$1" = "--print-smb-bind-interfaces" ] || exit 2 if [ -f {probe_count} ]; then echo 192.168.1.40/24 else @@ -2123,9 +2123,9 @@ def test_common_smb_bind_context_waits_settles_and_uses_fresh_probe(self) -> Non log_text = (memory / "samba4/var/test.log").read_text() self.assertEqual(proc.returncode, 0, proc.stderr) - self.assertEqual(proc.stdout, "sleep 3\nbind=127.0.0.1/8 192.168.1.40/24\n") - self.assertIn("first usable IPv4 observed: 192.168.1.39/24", log_text) - self.assertIn("Samba IPv4 bind interfaces: 127.0.0.1/8 192.168.1.40/24", log_text) + self.assertEqual(proc.stdout, "sleep 3\nbind=127.0.0.1/8 ::1/128 192.168.1.40/24\n") + self.assertIn("first usable address observed: 192.168.1.39/24", log_text) + self.assertIn("Samba bind interfaces: 127.0.0.1/8 ::1/128 192.168.1.40/24", log_text) def test_common_smb_bind_probe_rejects_invalid_cidr_output(self) -> None: with tempfile.TemporaryDirectory() as tmp: @@ -2161,7 +2161,7 @@ def test_common_smb_bind_probe_rejects_invalid_cidr_output(self) -> None: self.assertEqual(proc.returncode, 0, proc.stderr) self.assertIn("status=1\n", proc.stdout) self.assertIn("bind=\n", proc.stdout) - self.assertIn("Samba IPv4 bind interface probe failed with exit code 1", log_text) + self.assertIn("Samba bind interface probe failed with exit code 1", log_text) def test_common_smb_bind_context_fails_hard_on_probe_error(self) -> None: with tempfile.TemporaryDirectory() as tmp: @@ -2193,8 +2193,8 @@ def test_common_smb_bind_context_fails_hard_on_probe_error(self) -> None: self.assertEqual(proc.returncode, 0, proc.stderr) self.assertIn("status=1\n", proc.stdout) - self.assertIn("Samba IPv4 bind discovery failed with exit code 13", proc.stdout) - self.assertNotIn("no usable IPv4 has appeared yet", proc.stdout) + self.assertIn("Samba bind discovery failed with exit code 13", proc.stdout) + self.assertNotIn("no usable address has appeared yet", proc.stdout) self.assertNotIn("unexpected sleep", proc.stdout) def test_payload_on_external_disk_is_also_served_as_share_and_hidden_in_smb_conf(self) -> None: @@ -2661,7 +2661,7 @@ def test_common_watchdog_smb_bind_reconcile_restarts_when_changed(self) -> None: self.assertEqual(proc.returncode, 0, proc.stderr) self.assertEqual( proc.stdout, - f"mount /dev/dk2 {volumes}/dk2\nmount /dev/dk2 {volumes}/dk2\nmount /dev/dk3 {volumes}/dk3\ngenerate {payload} 127.0.0.1/8 192.168.1.41/24\nrestart IPv4 bind interfaces changed\nbind=127.0.0.1/8 192.168.1.41/24\n", + f"mount /dev/dk2 {volumes}/dk2\nmount /dev/dk2 {volumes}/dk2\nmount /dev/dk3 {volumes}/dk3\ngenerate {payload} 127.0.0.1/8 192.168.1.41/24\nrestart bind interfaces changed\nbind=127.0.0.1/8 192.168.1.41/24\n", ) def test_common_watchdog_smb_bind_reconcile_restores_bind_when_disk_prepare_fails(self) -> None: @@ -2793,7 +2793,7 @@ def test_common_watchdog_smb_bind_reconcile_fails_hard_on_probe_error(self) -> N self.assertIn("status=1\n", proc.stdout) self.assertIn("deferred=0\n", proc.stdout) self.assertIn("bind=127.0.0.1/8 192.168.1.40/24\n", proc.stdout) - self.assertIn("watchdog pass: Samba IPv4 bind probe failed with exit code 13", proc.stdout) + self.assertIn("watchdog pass: Samba bind probe failed with exit code 13", proc.stdout) self.assertNotIn("generate\n", proc.stdout) self.assertNotIn("restart\n", proc.stdout) @@ -2826,8 +2826,8 @@ def test_common_watchdog_initializes_smb_bind_interfaces_without_env(self) -> No log_text = (memory / "samba4/var/test.log").read_text() self.assertEqual(proc.returncode, 0, proc.stderr) - self.assertEqual(proc.stdout, "bind=127.0.0.1/8 192.168.1.40/24\n") - self.assertIn("watchdog startup: initialized Samba IPv4 bind interfaces from live probe", log_text) + self.assertEqual(proc.stdout, "bind=127.0.0.1/8 ::1/128 192.168.1.40/24\n") + self.assertIn("watchdog startup: initialized Samba bind interfaces from live probe", log_text) def test_common_watchdog_defers_first_mdns_start_until_auto_ip_exists(self) -> None: with tempfile.TemporaryDirectory() as tmp: @@ -2848,7 +2848,7 @@ def test_common_watchdog_defers_first_mdns_start_until_auto_ip_exists(self) -> N mkdir -p "$RAM_VAR" runtime_process_present_by_ucomm() {{ return 1; }} tc_watchdog_refresh_runtime_identity_for_recovery() {{ :; }} - tc_mdns_auto_ip_available() {{ echo print-auto-ip-cidrs; return 11; }} + tc_mdns_auto_ip_available() {{ echo print-mdns-socket-families; return 11; }} tc_start_mdns_capture() {{ echo capture; }} tc_start_mdns_advertiser() {{ echo advertise; }} tc_watchdog_start_mdns_if_needed @@ -2862,14 +2862,14 @@ def test_common_watchdog_defers_first_mdns_start_until_auto_ip_exists(self) -> N proc = subprocess.run([str(script)], text=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE, check=False) self.assertEqual(proc.returncode, 0, proc.stderr) - self.assertIn("print-auto-ip-cidrs\n", proc.stdout) + self.assertIn("print-mdns-socket-families\n", proc.stdout) self.assertNotIn("capture\n", proc.stdout) self.assertNotIn("advertise\n", proc.stdout) self.assertIn("deferred=1\n", proc.stdout) self.assertIn("mDNS auto-ip check: running", proc.stdout) - self.assertIn("--print-auto-ip-cidrs", proc.stdout) - self.assertIn("mDNS auto-ip check: no usable IPv4 yet", proc.stdout) - self.assertIn("mDNS startup deferred; no usable IPv4 has appeared yet", proc.stdout) + self.assertIn("--print-mdns-socket-families", proc.stdout) + self.assertIn("mDNS auto-ip check: no usable address yet", proc.stdout) + self.assertIn("mDNS startup deferred; no usable address has appeared yet", proc.stdout) def test_common_watchdog_reports_mdns_auto_ip_probe_failure_without_deferral(self) -> None: with tempfile.TemporaryDirectory() as tmp: @@ -2890,7 +2890,7 @@ def test_common_watchdog_reports_mdns_auto_ip_probe_failure_without_deferral(sel mkdir -p "$RAM_VAR" runtime_process_present_by_ucomm() {{ return 1; }} tc_watchdog_refresh_runtime_identity_for_recovery() {{ :; }} - tc_mdns_auto_ip_available() {{ echo print-auto-ip-cidrs; return 13; }} + tc_mdns_auto_ip_available() {{ echo print-mdns-socket-families; return 13; }} tc_start_mdns_capture() {{ echo capture; }} tc_start_mdns_advertiser() {{ echo advertise; }} tc_watchdog_start_mdns_if_needed @@ -2905,13 +2905,13 @@ def test_common_watchdog_reports_mdns_auto_ip_probe_failure_without_deferral(sel proc = subprocess.run([str(script)], text=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE, check=False) self.assertEqual(proc.returncode, 0, proc.stderr) - self.assertIn("print-auto-ip-cidrs\n", proc.stdout) + self.assertIn("print-mdns-socket-families\n", proc.stdout) self.assertNotIn("capture\n", proc.stdout) self.assertNotIn("advertise\n", proc.stdout) self.assertIn("deferred=0\n", proc.stdout) self.assertIn("unavailable=1\n", proc.stdout) self.assertIn("mDNS auto-ip check failed with exit code 13", proc.stdout) - self.assertNotIn("mDNS startup deferred; no usable IPv4 has appeared yet", proc.stdout) + self.assertNotIn("mDNS startup deferred; no usable address has appeared yet", proc.stdout) def test_common_watchdog_starts_first_mdns_capture_after_auto_ip_exists(self) -> None: with tempfile.TemporaryDirectory() as tmp: @@ -2932,7 +2932,7 @@ def test_common_watchdog_starts_first_mdns_capture_after_auto_ip_exists(self) -> mkdir -p "$RAM_VAR" runtime_process_present_by_ucomm() {{ return 1; }} tc_watchdog_refresh_runtime_identity_for_recovery() {{ :; }} - tc_mdns_auto_ip_available() {{ echo print-auto-ip-cidrs; return 0; }} + tc_mdns_auto_ip_available() {{ echo print-mdns-socket-families; return 0; }} tc_start_mdns_capture() {{ echo capture; }} tc_start_mdns_advertiser() {{ echo advertise; }} tc_watchdog_start_mdns_if_needed @@ -2947,15 +2947,15 @@ def test_common_watchdog_starts_first_mdns_capture_after_auto_ip_exists(self) -> proc = subprocess.run([str(script)], text=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE, check=False) self.assertEqual(proc.returncode, 0, proc.stderr) - self.assertIn("print-auto-ip-cidrs\n", proc.stdout) + self.assertIn("print-mdns-socket-families\n", proc.stdout) self.assertIn("capture\n", proc.stdout) self.assertIn("advertise\n", proc.stdout) self.assertLess(proc.stdout.index("capture\n"), proc.stdout.index("advertise\n")) self.assertIn("seen=1\n", proc.stdout) self.assertIn("capture_attempted=1\n", proc.stdout) self.assertIn("mDNS auto-ip check: running", proc.stdout) - self.assertIn("--print-auto-ip-cidrs", proc.stdout) - self.assertIn("mDNS auto-ip check: usable IPv4 is available", proc.stdout) + self.assertIn("--print-mdns-socket-families", proc.stdout) + self.assertIn("mDNS auto-ip check: usable address is available", proc.stdout) self.assertIn("mDNS auto-ip is available; starting capture and advertiser", proc.stdout) def test_common_watchdog_later_mdns_restart_skips_capture(self) -> None: @@ -2978,7 +2978,7 @@ def test_common_watchdog_later_mdns_restart_skips_capture(self) -> None: TC_MDNS_CAPTURE_ATTEMPTED=1 runtime_process_present_by_ucomm() {{ return 1; }} tc_watchdog_refresh_runtime_identity_for_recovery() {{ :; }} - tc_mdns_auto_ip_available() {{ echo print-auto-ip-cidrs; return 0; }} + tc_mdns_auto_ip_available() {{ echo print-mdns-socket-families; return 0; }} tc_start_mdns_capture() {{ echo capture; }} tc_start_mdns_advertiser() {{ echo advertise; }} tc_restart_mdns() {{ echo restart; }} @@ -2993,7 +2993,7 @@ def test_common_watchdog_later_mdns_restart_skips_capture(self) -> None: proc = subprocess.run([str(script)], text=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE, check=False) self.assertEqual(proc.returncode, 0, proc.stderr) - self.assertIn("print-auto-ip-cidrs\n", proc.stdout) + self.assertIn("print-mdns-socket-families\n", proc.stdout) self.assertNotIn("capture\n", proc.stdout) self.assertNotIn("advertise\n", proc.stdout) self.assertIn("restart\n", proc.stdout) @@ -3018,11 +3018,11 @@ def test_common_watchdog_health_requires_mdns_udp_5353(self) -> None: runtime_process_present_by_ucomm() {{ [ "$1" = "$MDNS_PROC_NAME" ] && [ "$mdns_present" = "1" ] }} - tc_mdns_bound_ipv4_udp_5353() {{ return 1; }} + tc_mdns_bound_udp_5353() {{ return 1; }} status=0 tc_all_managed_services_healthy || status=$? echo "unbound=$status" - tc_mdns_bound_ipv4_udp_5353() {{ return 0; }} + tc_mdns_bound_udp_5353() {{ return 0; }} status=0 tc_all_managed_services_healthy || status=$? echo "bound=$status" @@ -3044,6 +3044,113 @@ def test_common_watchdog_health_requires_mdns_udp_5353(self) -> None: self.assertEqual(proc.returncode, 0, proc.stderr) self.assertEqual(proc.stdout, "unbound=1\nbound=0\nmissing=1\ndeferred=0\n") + def test_common_smbd_bound_tcp_445_requires_configured_socket_families(self) -> None: + with tempfile.TemporaryDirectory() as tmp: + tmp_path = Path(tmp) + flash, _memory, _locks, _volumes = self.write_runtime_harness(tmp_path) + script = tmp_path / "smbd-bound-families.sh" + script.write_text( + textwrap.dedent( + f"""\ + #!/bin/sh + set -eu + . {flash}/common.sh + . {flash}/tcapsulesmb.conf + tc_init_runtime_env + mkdir -p "$RAM_VAR" + v4_status=1 + v6_status=1 + tc_smbd_bound_ipv4_445() {{ return "$v4_status"; }} + tc_smbd_bound_ipv6_445() {{ return "$v6_status"; }} + + TC_SMB_BIND_INTERFACES="127.0.0.1/8 ::1/128 192.168.1.40/24" + v4_status=0 + v6_status=1 + status=0 + tc_smbd_bound_tcp_445 || status=$? + echo "ipv4_only=$status" + + TC_SMB_BIND_INTERFACES="127.0.0.1/8 ::1/128 fdbb:1111:2222:3333::40/64" + v4_status=1 + v6_status=0 + status=0 + tc_smbd_bound_tcp_445 || status=$? + echo "ipv6_only=$status" + + TC_SMB_BIND_INTERFACES="127.0.0.1/8 ::1/128 192.168.1.40/24 fdbb:1111:2222:3333::40/64" + v4_status=0 + v6_status=1 + status=0 + tc_smbd_bound_tcp_445 || status=$? + echo "dual_missing_v6=$status" + + v6_status=0 + status=0 + tc_smbd_bound_tcp_445 || status=$? + echo "dual_bound=$status" + """ + ) + ) + script.chmod(0o755) + + proc = subprocess.run([str(script)], text=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE, check=False) + + self.assertEqual(proc.returncode, 0, proc.stderr) + self.assertEqual(proc.stdout, "ipv4_only=0\nipv6_only=0\ndual_missing_v6=1\ndual_bound=0\n") + + def test_common_mdns_bound_udp_5353_requires_reported_socket_families(self) -> None: + with tempfile.TemporaryDirectory() as tmp: + tmp_path = Path(tmp) + flash, _memory, _locks, _volumes = self.write_runtime_harness(tmp_path) + families_file = tmp_path / "families" + families_file.write_text("ipv4 ipv6\n", encoding="utf-8") + (flash / "mdns-advertiser").write_text( + f"#!/bin/sh\n[ \"$1\" = \"--print-mdns-socket-families\" ] || exit 2\ncat {families_file}\n", + encoding="utf-8", + ) + (flash / "mdns-advertiser").chmod(0o755) + script = tmp_path / "mdns-bound-families.sh" + script.write_text( + textwrap.dedent( + f"""\ + #!/bin/sh + set -eu + . {flash}/common.sh + . {flash}/tcapsulesmb.conf + tc_init_runtime_env + mkdir -p "$RAM_VAR" + v4_status=1 + v6_status=1 + tc_mdns_bound_ipv4_udp_5353() {{ return "$v4_status"; }} + tc_mdns_bound_ipv6_udp_5353() {{ return "$v6_status"; }} + + v4_status=0 + v6_status=1 + status=0 + tc_mdns_bound_udp_5353 || status=$? + echo "dual_missing_v6=$status" + + v6_status=0 + status=0 + tc_mdns_bound_udp_5353 || status=$? + echo "dual_bound=$status" + + printf 'ipv4\\n' >{families_file} + v4_status=0 + v6_status=1 + status=0 + tc_mdns_bound_udp_5353 || status=$? + echo "ipv4_only=$status" + """ + ) + ) + script.chmod(0o755) + + proc = subprocess.run([str(script)], text=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE, check=False) + + self.assertEqual(proc.returncode, 0, proc.stderr) + self.assertEqual(proc.stdout, "dual_missing_v6=1\ndual_bound=0\nipv4_only=0\n") + def test_common_watchdog_restarts_mdns_when_running_without_udp_5353_and_auto_ip_exists(self) -> None: with tempfile.TemporaryDirectory() as tmp: tmp_path = Path(tmp) @@ -3064,7 +3171,7 @@ def test_common_watchdog_restarts_mdns_when_running_without_udp_5353_and_auto_ip runtime_process_present_by_ucomm() {{ [ "$1" = "$MDNS_PROC_NAME" ] && [ "$mdns_present" = "1" ] }} - tc_mdns_bound_ipv4_udp_5353() {{ return 1; }} + tc_mdns_bound_udp_5353() {{ return 1; }} tc_mdns_auto_ip_available() {{ echo auto-ip; return 0; }} stop_runtime_process_by_ucomm() {{ echo "stop $1"; mdns_present=0; }} tc_watchdog_refresh_runtime_identity_for_recovery() {{ echo identity; }} @@ -3082,7 +3189,7 @@ def test_common_watchdog_restarts_mdns_when_running_without_udp_5353_and_auto_ip self.assertEqual(proc.returncode, 0, proc.stderr) self.assertEqual(proc.stdout, "auto-ip\nstop mdns-advertiser\nidentity\nrestart\n") - self.assertIn("watchdog recovery: mdns advertiser is running without IPv4 UDP 5353", log_text) + self.assertIn("watchdog recovery: mdns advertiser is running without required UDP 5353 listeners", log_text) self.assertNotIn("unexpected", proc.stdout) def test_common_watchdog_defers_mdns_when_running_without_udp_5353_and_no_auto_ip(self) -> None: @@ -3103,7 +3210,7 @@ def test_common_watchdog_defers_mdns_when_running_without_udp_5353_and_no_auto_i runtime_process_present_by_ucomm() {{ [ "$1" = "$MDNS_PROC_NAME" ] }} - tc_mdns_bound_ipv4_udp_5353() {{ return 1; }} + tc_mdns_bound_udp_5353() {{ return 1; }} tc_mdns_auto_ip_available() {{ echo auto-ip; return 11; }} stop_runtime_process_by_ucomm() {{ echo "unexpected-stop $1"; return 1; }} tc_restart_mdns() {{ echo unexpected-restart; return 1; }} @@ -3123,8 +3230,8 @@ def test_common_watchdog_defers_mdns_when_running_without_udp_5353_and_no_auto_i self.assertEqual(proc.returncode, 0, proc.stderr) self.assertEqual(proc.stdout, "auto-ip\ndeferred=1\nhealthy=0\n") - self.assertIn("watchdog recovery: mdns advertiser is running without IPv4 UDP 5353", log_text) - self.assertIn("mDNS startup deferred; no usable IPv4 has appeared yet", log_text) + self.assertIn("watchdog recovery: mdns advertiser is running without required UDP 5353 listeners", log_text) + self.assertIn("mDNS startup deferred; no usable address has appeared yet", log_text) self.assertNotIn("unexpected", proc.stdout) def test_common_watchdog_marks_mdns_unavailable_when_unbound_auto_ip_probe_fails(self) -> None: @@ -3145,7 +3252,7 @@ def test_common_watchdog_marks_mdns_unavailable_when_unbound_auto_ip_probe_fails runtime_process_present_by_ucomm() {{ [ "$1" = "$MDNS_PROC_NAME" ] }} - tc_mdns_bound_ipv4_udp_5353() {{ return 1; }} + tc_mdns_bound_udp_5353() {{ return 1; }} tc_mdns_auto_ip_available() {{ echo auto-ip; return 13; }} stop_runtime_process_by_ucomm() {{ echo "unexpected-stop $1"; return 1; }} tc_restart_mdns() {{ echo unexpected-restart; return 1; }} @@ -3162,7 +3269,7 @@ def test_common_watchdog_marks_mdns_unavailable_when_unbound_auto_ip_probe_fails self.assertEqual(proc.returncode, 0, proc.stderr) self.assertEqual(proc.stdout, "auto-ip\ndeferred=0\nunavailable=1\n") - self.assertIn("watchdog recovery: mdns advertiser is running without IPv4 UDP 5353", log_text) + self.assertIn("watchdog recovery: mdns advertiser is running without required UDP 5353 listeners", log_text) self.assertIn("watchdog recovery: mDNS auto-ip check failed with exit code 13", log_text) self.assertNotIn("unexpected", proc.stdout) @@ -3183,8 +3290,8 @@ def test_common_watchdog_health_requires_nbns_udp_137(self) -> None: mkdir -p "$RAM_VAR" tc_samba_runtime_expected() {{ return 0; }} runtime_process_present_by_ucomm() {{ return 0; }} - tc_smbd_bound_ipv4_445() {{ return 0; }} - tc_mdns_bound_ipv4_udp_5353() {{ return 0; }} + tc_smbd_bound_tcp_445() {{ return 0; }} + tc_mdns_bound_udp_5353() {{ return 0; }} tc_nbns_bound_ipv4_udp_137() {{ return 1; }} status=0 tc_all_managed_services_healthy || status=$? @@ -3229,7 +3336,7 @@ def test_common_watchdog_restarts_nbns_when_running_without_udp_137_and_auto_ip_ [ "$1" = "$NBNS_PROC_NAME" ] && [ "$nbns_present" = "1" ] }} tc_nbns_bound_ipv4_udp_137() {{ return 1; }} - tc_mdns_auto_ip_available() {{ echo auto-ip; return 0; }} + tc_nbns_auto_ip_available() {{ echo auto-ip; return 0; }} stop_runtime_process_by_ucomm() {{ echo "stop $1"; nbns_present=0; }} tc_watchdog_refresh_runtime_identity_for_recovery() {{ echo identity; }} tc_restart_nbns() {{ echo restart; }} @@ -3266,7 +3373,7 @@ def test_common_watchdog_defers_nbns_when_running_without_udp_137_and_no_auto_ip [ "$1" = "$NBNS_PROC_NAME" ] }} tc_nbns_bound_ipv4_udp_137() {{ return 1; }} - tc_mdns_auto_ip_available() {{ echo auto-ip; return 11; }} + tc_nbns_auto_ip_available() {{ echo auto-ip; return 11; }} stop_runtime_process_by_ucomm() {{ echo "unexpected-stop $1"; return 1; }} tc_restart_nbns() {{ echo unexpected-restart; return 1; }} tc_watchdog_reconcile_nbns @@ -3305,7 +3412,7 @@ def test_common_watchdog_reports_nbns_hard_auto_ip_failure_when_unbound(self) -> [ "$1" = "$NBNS_PROC_NAME" ] }} tc_nbns_bound_ipv4_udp_137() {{ return 1; }} - tc_mdns_auto_ip_available() {{ echo auto-ip; return 13; }} + tc_nbns_auto_ip_available() {{ echo auto-ip; return 13; }} stop_runtime_process_by_ucomm() {{ echo "unexpected-stop $1"; return 1; }} tc_restart_nbns() {{ echo unexpected-restart; return 1; }} status=0 @@ -3362,7 +3469,7 @@ def test_common_smbd_recovery_mounts_payload_and_share_volumes_before_restart(se tc_watchdog_refresh_runtime_identity_for_recovery() {{ :; }} runtime_process_present_by_ucomm() {{ return 1; }} wait_for_process() {{ return 0; }} - tc_smbd_bound_ipv4_445() {{ return 0; }} + tc_smbd_bound_tcp_445() {{ return 0; }} tc_watchdog_wake_or_mount_volume() {{ echo "mount $1 $2"; return 0; }} tc_start_smbd_if_needed """ @@ -5099,6 +5206,7 @@ def test_common_watchdog_service_iteration_refreshes_identity_once_before_servic tc_launch_mdns_advertiser() {{ echo "mdns-host=$MDNS_HOST_LABEL"; }} tc_launch_nbns() {{ echo "nbns-name=$SMB_NETBIOS_NAME"; }} tc_mdns_auto_ip_available() {{ return 0; }} + tc_nbns_auto_ip_available() {{ return 0; }} tc_all_managed_services_healthy() {{ return 1; }} status=0 tc_watchdog_service_iteration || status=$? @@ -5571,7 +5679,7 @@ def test_common_watchdog_live_reload_reconciles_unbound_nbns(self) -> None: esac }} tc_nbns_bound_ipv4_udp_137() {{ return 1; }} - tc_mdns_auto_ip_available() {{ echo nbns-auto-ip; return 0; }} + tc_nbns_auto_ip_available() {{ echo nbns-auto-ip; return 0; }} stop_runtime_process_by_ucomm() {{ echo "stop $1"; nbns_present=0; }} tc_restart_nbns() {{ echo restart-nbns; }} tc_exec_start_samba() {{ echo "exec $1"; exit 42; }} From 1a8db588f8f1445edd27a8296a5c0ddb89d807d0 Mon Sep 17 00:00:00 2001 From: James Chang Date: Wed, 20 May 2026 22:45:44 -0700 Subject: [PATCH 2/6] Fix NetBSD interface inventory parsing Parse SIOCGIFCONF entries through a checked raw sockaddr view so NetBSD 4 IPv6 addresses are not truncated or overread. Use explicit IPv6 netmask ioctls, keep unknown prefixes out of Samba/AAAA output, normalize IPv4 link-local masks, and share fstat socket checks. Rebuild mdns/nbns artifacts and extend tests for raw ifconf entries, invalid masks, and socket scanning. --- bin/mdns-netbsd4be/mdns-advertiser | Bin 238928 -> 239228 bytes bin/mdns-netbsd4le/mdns-advertiser | Bin 240240 -> 240532 bytes bin/mdns/mdns-advertiser | Bin 299564 -> 299796 bytes bin/nbns-netbsd4be/nbns-advertiser | Bin 137728 -> 137876 bytes bin/nbns-netbsd4le/nbns-advertiser | Bin 138492 -> 138660 bytes bin/nbns/nbns-advertiser | Bin 196700 -> 196868 bytes build/auto-ip-common.inc | 266 ++++++++++++------ build/mdns-advertiser.c | 2 +- .../assets/artifact-manifest.json | 12 +- .../boot/samba4/common.d/70-smbd-service.sh | 161 +++-------- tests/test_deploy_modules.py | 59 +++- tests/test_storage_runtime.py | 76 +++++ 12 files changed, 357 insertions(+), 219 deletions(-) diff --git a/bin/mdns-netbsd4be/mdns-advertiser b/bin/mdns-netbsd4be/mdns-advertiser index 8075c258ff64ffeea5228eb5a2cb0e4fa39c1a28..af7fe8cf702dd57f9bc0dcb6f9785d8ee91594d2 100755 GIT binary patch delta 24505 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�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 diff --git a/bin/mdns-netbsd4le/mdns-advertiser b/bin/mdns-netbsd4le/mdns-advertiser index 67144a05e911aad95cf8fb0f73c7df345f3b1b97..f60484a22fee9ed017cdaf630d412db35a96b618 100755 GIT binary patch delta 25005 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 delta 36697 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 V4pj_7Yg$o=7!NDqs(+NA{|jYobdmr7 delta 8139 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 ZCCd5~p2N1twh*aE0XOM+xiN(&{14CDjnx1E diff --git a/bin/nbns-netbsd4le/nbns-advertiser b/bin/nbns-netbsd4le/nbns-advertiser index 86b86731597fd60daee59aa50fcc510a1bdd95f7..9add83e6d1af3d0ee58383c55f8f8a6e86ca8e76 100755 GIT binary patch delta 8279 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 KAAau13Gpx3nWw-2 delta 8146 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 CRXE%L diff --git a/bin/nbns/nbns-advertiser b/bin/nbns/nbns-advertiser index 2cc36160f0d743ef03b5ab63cd998e66276250b9..3fc6f53e5d9a2856a9f299028b6e7d56a8ab910d 100755 GIT binary patch delta 15759 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 delta 15812 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 Mn8dwX|EU@LKZ|J0ssI20 diff --git a/build/auto-ip-common.inc b/build/auto-ip-common.inc index 0c0fff4..08bd591 100644 --- a/build/auto-ip-common.inc +++ b/build/auto-ip-common.inc @@ -9,6 +9,7 @@ #if defined(__NetBSD__) || defined(__APPLE__) || defined(__FreeBSD__) || defined(__OpenBSD__) || defined(__DragonFly__) #include +#include #endif #ifndef MAX_LINK_IPV4_ADDRS @@ -57,6 +58,13 @@ struct link_context_set { size_t count; }; +struct ifconf_entry_view { + char name[IFNAMSIZ]; + const struct sockaddr *addr; + size_t addr_len; + size_t step; +}; + static int TC_AUTO_IP_UNUSED runtime_ipv4_is_usable(uint32_t ipv4_addr) { uint32_t host_order = ntohl(ipv4_addr); unsigned int first_octet = (unsigned int)((host_order >> 24) & 0xff); @@ -116,8 +124,25 @@ static int TC_AUTO_IP_UNUSED ifreq_table_uses_fixed_entries(size_t ifc_len) { return sizeof(struct ifreq) > 64 && ifc_len > 0 && (ifc_len % sizeof(struct ifreq)) == 0; } -static size_t TC_AUTO_IP_UNUSED ifreq_entry_size(const struct ifreq *ifr, size_t remaining, int fixed_entries) { +static size_t TC_AUTO_IP_UNUSED ifreq_sockaddr_len(const struct ifreq *ifr, size_t remaining) { size_t sockaddr_len = sizeof(struct sockaddr); + + if (remaining < IFNAMSIZ + sizeof(struct sockaddr)) { + return 0; + } +#if defined(__NetBSD__) || defined(__APPLE__) || defined(__FreeBSD__) || defined(__OpenBSD__) || defined(__DragonFly__) + if (ifr->ifr_addr.sa_len > sockaddr_len) { + sockaddr_len = ifr->ifr_addr.sa_len; + } +#endif + if (sockaddr_len > remaining - IFNAMSIZ) { + return 0; + } + return sockaddr_len; +} + +static size_t TC_AUTO_IP_UNUSED ifreq_entry_size(const struct ifreq *ifr, size_t remaining, int fixed_entries) { + size_t sockaddr_len; size_t step; size_t align; @@ -128,14 +153,10 @@ static size_t TC_AUTO_IP_UNUSED ifreq_entry_size(const struct ifreq *ifr, size_t return sizeof(*ifr); } - if (remaining < IFNAMSIZ + sizeof(struct sockaddr)) { + sockaddr_len = ifreq_sockaddr_len(ifr, remaining); + if (sockaddr_len == 0) { return 0; } -#if defined(__NetBSD__) || defined(__APPLE__) || defined(__FreeBSD__) || defined(__OpenBSD__) || defined(__DragonFly__) - if (ifr->ifr_addr.sa_len > sockaddr_len) { - sockaddr_len = ifr->ifr_addr.sa_len; - } -#endif step = IFNAMSIZ + sockaddr_len; align = sizeof(long); @@ -164,6 +185,35 @@ static int TC_AUTO_IP_UNUSED copy_ifreq_entry(struct ifreq *out, const char *cur return 0; } +static int TC_AUTO_IP_UNUSED ifconf_entry_view_from_cursor(struct ifconf_entry_view *out, + const char *cursor, + size_t remaining, + int fixed_entries) { + struct ifreq ifr; + size_t addr_len; + size_t step; + + if (copy_ifreq_entry(&ifr, cursor, remaining) != 0) { + return -1; + } + step = ifreq_entry_size(&ifr, remaining, fixed_entries); + if (step == 0) { + return -1; + } + addr_len = ifreq_sockaddr_len(&ifr, remaining); + if (addr_len == 0) { + return -1; + } + + memset(out, 0, sizeof(*out)); + memcpy(out->name, ifr.ifr_name, IFNAMSIZ); + out->name[IFNAMSIZ - 1] = '\0'; + out->addr = (const struct sockaddr *)(const void *)(cursor + IFNAMSIZ); + out->addr_len = addr_len; + out->step = step; + return 0; +} + static int TC_AUTO_IP_UNUSED netmask_prefix_length(uint32_t netmask) { uint32_t mask = ntohl(netmask); int prefix = 0; @@ -242,6 +292,10 @@ static int TC_AUTO_IP_UNUSED ipv4_is_link_local(uint32_t ipv4_addr) { return ((host_order >> 24) & 0xff) == 169 && ((host_order >> 16) & 0xff) == 254; } +static uint32_t TC_AUTO_IP_UNUSED ipv4_link_local_netmask(void) { + return htonl(0xffff0000U); +} + static int TC_AUTO_IP_UNUSED ipv6_is_unspecified_addr(const struct in6_addr *addr) { static const unsigned char zero[16] = {0}; return memcmp(addr->s6_addr, zero, sizeof(zero)) == 0; @@ -281,7 +335,7 @@ static int TC_AUTO_IP_UNUSED ipv6_prefix_length_from_mask(const struct in6_addr for (bit = 7; bit >= 0; bit--) { if ((byte & (1U << bit)) != 0) { if (saw_zero) { - return 64; + return -1; } prefix++; } else { @@ -289,7 +343,7 @@ static int TC_AUTO_IP_UNUSED ipv6_prefix_length_from_mask(const struct in6_addr } } } - return prefix == 0 ? 64 : prefix; + return prefix == 0 ? -1 : prefix; } static int TC_AUTO_IP_UNUSED ipv6_prefix_matches(const struct in6_addr *a, @@ -299,7 +353,10 @@ static int TC_AUTO_IP_UNUSED ipv6_prefix_matches(const struct in6_addr *a, int remaining_bits; unsigned char mask; - if (prefix_len <= 0) { + if (prefix_len < 0) { + return 0; + } + if (prefix_len == 0) { return 1; } if (prefix_len > 128) { @@ -317,6 +374,61 @@ static int TC_AUTO_IP_UNUSED ipv6_prefix_matches(const struct in6_addr *a, return (a->s6_addr[full_bytes] & mask) == (b->s6_addr[full_bytes] & mask); } +static int TC_AUTO_IP_UNUSED get_iface_flags(int sockfd, const char *name, int *flags_out) { + struct ifreq flags_req; + + memset(&flags_req, 0, sizeof(flags_req)); + strncpy(flags_req.ifr_name, name, sizeof(flags_req.ifr_name) - 1); + if (ioctl(sockfd, SIOCGIFFLAGS, &flags_req) != 0) { + return -1; + } + *flags_out = flags_req.ifr_flags; + return 0; +} + +static uint32_t TC_AUTO_IP_UNUSED get_ipv4_netmask(int sockfd, const char *name, uint32_t ipv4_addr) { + struct ifreq mask_req; + + if (ipv4_is_link_local(ipv4_addr)) { + return ipv4_link_local_netmask(); + } + + memset(&mask_req, 0, sizeof(mask_req)); + strncpy(mask_req.ifr_name, name, sizeof(mask_req.ifr_name) - 1); + if (ioctl(sockfd, SIOCGIFNETMASK, &mask_req) == 0) { + struct sockaddr_in netmask_addr; + memset(&netmask_addr, 0, sizeof(netmask_addr)); + memcpy(&netmask_addr, &mask_req.ifr_addr, sizeof(netmask_addr)); + if (netmask_addr.sin_family == AF_INET) { + return netmask_addr.sin_addr.s_addr; + } + } + return 0; +} + +static int TC_AUTO_IP_UNUSED get_ipv6_prefix_len(int sockfd6, const char *name, const struct sockaddr_in6 *sin6) { +#if defined(SIOCGIFNETMASK_IN6) + struct in6_ifreq mask_req; + + if (sockfd6 < 0) { + return -1; + } + + memset(&mask_req, 0, sizeof(mask_req)); + strncpy(mask_req.ifr_name, name, sizeof(mask_req.ifr_name) - 1); + mask_req.ifr_ifru.ifru_addr = *sin6; + if (ioctl(sockfd6, SIOCGIFNETMASK_IN6, &mask_req) == 0 && + mask_req.ifr_ifru.ifru_addr.sin6_family == AF_INET6) { + return ipv6_prefix_length_from_mask(&mask_req.ifr_ifru.ifru_addr.sin6_addr); + } +#else + (void)sockfd6; + (void)name; + (void)sin6; +#endif + return -1; +} + static int TC_AUTO_IP_UNUSED iface_context_priority_score(const struct iface_context *ctx) { int score = 0; int prefix = netmask_prefix_length(ctx->netmask); @@ -446,44 +558,27 @@ static int TC_AUTO_IP_UNUSED collect_iface_contexts_with_policy(struct iface_con end = cursor + ifc.ifc_len; fixed_entries = ifreq_table_uses_fixed_entries((size_t)ifc.ifc_len); while (cursor < end) { - struct ifreq ifr_entry; - struct ifreq flags_req; - struct ifreq mask_req; + struct ifconf_entry_view entry; struct sockaddr_in sin; int flags; - uint32_t netmask = 0; size_t remaining = (size_t)(end - cursor); - size_t step; - if (copy_ifreq_entry(&ifr_entry, cursor, remaining) != 0) { - break; - } - step = ifreq_entry_size(&ifr_entry, remaining, fixed_entries); - if (step == 0) { + if (ifconf_entry_view_from_cursor(&entry, cursor, remaining, fixed_entries) != 0) { break; } - if (ifr_entry.ifr_addr.sa_family == AF_INET) { - memset(&flags_req, 0, sizeof(flags_req)); - strncpy(flags_req.ifr_name, ifr_entry.ifr_name, sizeof(flags_req.ifr_name) - 1); - if (ioctl(sockfd, SIOCGIFFLAGS, &flags_req) == 0) { - flags = flags_req.ifr_flags; - if (iface_flags_are_usable(flags, require_running)) { - memset(&mask_req, 0, sizeof(mask_req)); - strncpy(mask_req.ifr_name, ifr_entry.ifr_name, sizeof(mask_req.ifr_name) - 1); - if (ioctl(sockfd, SIOCGIFNETMASK, &mask_req) == 0) { - struct sockaddr_in netmask_addr; - memset(&netmask_addr, 0, sizeof(netmask_addr)); - memcpy(&netmask_addr, &mask_req.ifr_addr, sizeof(netmask_addr)); - netmask = netmask_addr.sin_addr.s_addr; - } - memset(&sin, 0, sizeof(sin)); - memcpy(&sin, &ifr_entry.ifr_addr, sizeof(sin)); - append_iface_context(out, ifr_entry.ifr_name, sin.sin_addr.s_addr, netmask, flags); - } - } + if (entry.addr->sa_family == AF_INET && entry.addr_len >= sizeof(sin) && + get_iface_flags(sockfd, entry.name, &flags) == 0 && + iface_flags_are_usable(flags, require_running)) { + memset(&sin, 0, sizeof(sin)); + memcpy(&sin, entry.addr, sizeof(sin)); + append_iface_context(out, + entry.name, + sin.sin_addr.s_addr, + get_ipv4_netmask(sockfd, entry.name, sin.sin_addr.s_addr), + flags); } - cursor += step; + cursor += entry.step; } close(sockfd); @@ -721,11 +816,15 @@ static int TC_AUTO_IP_UNUSED append_link_ipv6(struct link_context_set *out, pos = ctx->ipv6_count++; ctx->ipv6[pos].addr = *addr; ctx->ipv6[pos].scope_id = scope_id; - ctx->ipv6[pos].prefix_len = prefix_len > 0 ? prefix_len : 64; + ctx->ipv6[pos].prefix_len = prefix_len >= 0 && prefix_len <= 128 ? prefix_len : -1; ctx->ipv6[pos].link_local = ipv6_is_link_local_addr(addr); return 1; } +static int TC_AUTO_IP_UNUSED link_ipv6_addr_is_samba_bindable(const struct link_ipv6_addr *addr) { + return addr->prefix_len >= 0 && runtime_ipv6_is_bindable(&addr->addr); +} + static int TC_AUTO_IP_UNUSED link_context_has_samba_address(const struct link_context *ctx) { size_t i; @@ -733,7 +832,7 @@ static int TC_AUTO_IP_UNUSED link_context_has_samba_address(const struct link_co return 1; } for (i = 0; i < ctx->ipv6_count; i++) { - if (runtime_ipv6_is_bindable(&ctx->ipv6[i].addr)) { + if (link_ipv6_addr_is_samba_bindable(&ctx->ipv6[i])) { return 1; } } @@ -748,7 +847,7 @@ static int TC_AUTO_IP_UNUSED link_context_has_advertisable_ipv6(const struct lin size_t i; for (i = 0; i < ctx->ipv6_count; i++) { - if (runtime_ipv6_is_bindable(&ctx->ipv6[i].addr)) { + if (link_ipv6_addr_is_samba_bindable(&ctx->ipv6[i])) { return 1; } } @@ -866,6 +965,9 @@ static int TC_AUTO_IP_UNUSED link_context_ipv6_cidr(char *out, if (inet_ntop(AF_INET6, &addr->addr, ip_buf, sizeof(ip_buf)) == NULL) { return -1; } + if (addr->prefix_len < 0 || addr->prefix_len > 128) { + return -1; + } written = snprintf(out, out_len, "%s/%d", ip_buf, addr->prefix_len); if (written < 0 || (size_t)written >= out_len) { return -1; @@ -895,7 +997,7 @@ static int TC_AUTO_IP_UNUSED print_smb_link_bind_tokens(FILE *stream, const stru } for (j = 0; j < ctx->ipv6_count; j++) { char cidr[INET6_ADDRSTRLEN + 5]; - if (!runtime_ipv6_is_bindable(&ctx->ipv6[j].addr)) { + if (!link_ipv6_addr_is_samba_bindable(&ctx->ipv6[j])) { continue; } if (link_context_ipv6_cidr(cidr, sizeof(cidr), &ctx->ipv6[j]) != 0) { @@ -945,6 +1047,7 @@ static int TC_AUTO_IP_UNUSED print_iface_context_cidrs(FILE *stream, const struc static int TC_AUTO_IP_UNUSED collect_link_contexts_with_policy(struct link_context_set *out, int require_running) { int sockfd = -1; + int sockfd6 = -1; char buffer[8192]; struct ifconf ifc; char *cursor; @@ -958,12 +1061,16 @@ static int TC_AUTO_IP_UNUSED collect_link_contexts_with_policy(struct link_conte perror("socket interface enumeration"); return -1; } + sockfd6 = socket(AF_INET6, SOCK_DGRAM, 0); memset(&ifc, 0, sizeof(ifc)); ifc.ifc_len = sizeof(buffer); ifc.ifc_buf = buffer; if (ioctl(sockfd, SIOCGIFCONF, &ifc) < 0) { perror("ioctl(SIOCGIFCONF)"); + if (sockfd6 >= 0) { + close(sockfd6); + } close(sockfd); return -1; } @@ -972,83 +1079,60 @@ static int TC_AUTO_IP_UNUSED collect_link_contexts_with_policy(struct link_conte end = cursor + ifc.ifc_len; fixed_entries = ifreq_table_uses_fixed_entries((size_t)ifc.ifc_len); while (cursor < end) { - struct ifreq ifr_entry; - struct ifreq flags_req; + struct ifconf_entry_view entry; int flags = 0; size_t remaining = (size_t)(end - cursor); - size_t step; - if (copy_ifreq_entry(&ifr_entry, cursor, remaining) != 0) { - break; - } - step = ifreq_entry_size(&ifr_entry, remaining, fixed_entries); - if (step == 0) { + if (ifconf_entry_view_from_cursor(&entry, cursor, remaining, fixed_entries) != 0) { break; } - memset(&flags_req, 0, sizeof(flags_req)); - strncpy(flags_req.ifr_name, ifr_entry.ifr_name, sizeof(flags_req.ifr_name) - 1); - if (ioctl(sockfd, SIOCGIFFLAGS, &flags_req) != 0) { - cursor += step; + if (get_iface_flags(sockfd, entry.name, &flags) != 0) { + cursor += entry.step; continue; } - flags = flags_req.ifr_flags; if (!iface_flags_are_usable(flags, require_running)) { - cursor += step; + cursor += entry.step; continue; } - if (ifr_entry.ifr_addr.sa_family == AF_INET) { - struct ifreq mask_req; + if (entry.addr->sa_family == AF_INET && entry.addr_len >= sizeof(struct sockaddr_in)) { struct sockaddr_in sin; - uint32_t netmask = 0; - - memset(&mask_req, 0, sizeof(mask_req)); - strncpy(mask_req.ifr_name, ifr_entry.ifr_name, sizeof(mask_req.ifr_name) - 1); - if (ioctl(sockfd, SIOCGIFNETMASK, &mask_req) == 0) { - struct sockaddr_in netmask_addr; - memset(&netmask_addr, 0, sizeof(netmask_addr)); - memcpy(&netmask_addr, &mask_req.ifr_addr, sizeof(netmask_addr)); - netmask = netmask_addr.sin_addr.s_addr; - } memset(&sin, 0, sizeof(sin)); - memcpy(&sin, &ifr_entry.ifr_addr, sizeof(sin)); - append_link_ipv4(out, ifr_entry.ifr_name, sin.sin_addr.s_addr, netmask, flags); - } else if (ifr_entry.ifr_addr.sa_family == AF_INET6) { + memcpy(&sin, entry.addr, sizeof(sin)); + append_link_ipv4(out, + entry.name, + sin.sin_addr.s_addr, + get_ipv4_netmask(sockfd, entry.name, sin.sin_addr.s_addr), + flags); + } else if (entry.addr->sa_family == AF_INET6 && entry.addr_len >= sizeof(struct sockaddr_in6)) { struct sockaddr_in6 sin6; - struct ifreq mask_req; - int prefix_len = 64; + int prefix_len; memset(&sin6, 0, sizeof(sin6)); - memcpy(&sin6, &ifr_entry.ifr_addr, sizeof(sin6)); - memset(&mask_req, 0, sizeof(mask_req)); - strncpy(mask_req.ifr_name, ifr_entry.ifr_name, sizeof(mask_req.ifr_name) - 1); - if (ioctl(sockfd, SIOCGIFNETMASK, &mask_req) == 0) { - struct sockaddr_in6 mask6; - memset(&mask6, 0, sizeof(mask6)); - memcpy(&mask6, &mask_req.ifr_addr, sizeof(mask6)); - if (mask6.sin6_family == AF_INET6) { - prefix_len = ipv6_prefix_length_from_mask(&mask6.sin6_addr); - } - } + memcpy(&sin6, entry.addr, sizeof(sin6)); + prefix_len = get_ipv6_prefix_len(sockfd6, entry.name, &sin6); append_link_ipv6(out, - ifr_entry.ifr_name, + entry.name, &sin6.sin6_addr, prefix_len, (unsigned int)sin6.sin6_scope_id, flags); #if defined(AF_LINK) && (defined(__NetBSD__) || defined(__APPLE__) || defined(__FreeBSD__) || defined(__OpenBSD__) || defined(__DragonFly__)) - } else if (ifr_entry.ifr_addr.sa_family == AF_LINK) { - const struct sockaddr_dl *sdl = (const struct sockaddr_dl *)&ifr_entry.ifr_addr; - struct link_context *ctx = find_or_add_link_context(out, ifr_entry.ifr_name, flags); + } else if (entry.addr->sa_family == AF_LINK && entry.addr_len >= sizeof(struct sockaddr_dl)) { + const struct sockaddr_dl *sdl = (const struct sockaddr_dl *)entry.addr; + struct link_context *ctx = find_or_add_link_context(out, entry.name, flags); if (ctx != NULL && ctx->ifindex == 0) { ctx->ifindex = (unsigned int)sdl->sdl_index; } #endif } - cursor += step; + cursor += entry.step; } + if (sockfd6 >= 0) { + close(sockfd6); + } close(sockfd); { size_t i; diff --git a/build/mdns-advertiser.c b/build/mdns-advertiser.c index ad87063..a2892c3 100644 --- a/build/mdns-advertiser.c +++ b/build/mdns-advertiser.c @@ -1582,7 +1582,7 @@ static int append_host_address_records(uint8_t *buf, } if (include_aaaa) { for (i = 0; i < link->ipv6_count; i++) { - if (!runtime_ipv6_is_bindable(&link->ipv6[i].addr)) { + if (!link_ipv6_addr_is_samba_bindable(&link->ipv6[i])) { continue; } if (add_rr_aaaa(buf, off, cap, owner, &link->ipv6[i].addr, ttl) != 0) { diff --git a/src/timecapsulesmb/assets/artifact-manifest.json b/src/timecapsulesmb/assets/artifact-manifest.json index ac1dc58..2faa791 100644 --- a/src/timecapsulesmb/assets/artifact-manifest.json +++ b/src/timecapsulesmb/assets/artifact-manifest.json @@ -2,27 +2,27 @@ "artifacts": { "mdns-advertiser": { "path": "bin/mdns/mdns-advertiser", - "sha256": "d50f8f54d74ef7549cfbea5515fc000f9ef82da423d45f1b112f7713257119e1" + "sha256": "1e36b81f59ac3e63f987eb8a0b15c4461d150ab7d78e68dba6542531cce60d56" }, "mdns-advertiser-netbsd4le": { "path": "bin/mdns-netbsd4le/mdns-advertiser", - "sha256": "e27656e73a768d358ec4484cf464a34d074c87ef1eea3de4fdf59123b9a70d74" + "sha256": "c9e9feb3471b5298f94e2472b64a7473bb56e5192c0ba6bec1b10f7634622fdc" }, "mdns-advertiser-netbsd4be": { "path": "bin/mdns-netbsd4be/mdns-advertiser", - "sha256": "012e8df43a0e53c2661a9aa080954601eda91b11a29211d00f104751fda2c09e" + "sha256": "0be77a9ce32c44c71aef732c835a00f62103ec1bae94e48b980b2fba4d04ccaf" }, "nbns-advertiser": { "path": "bin/nbns/nbns-advertiser", - "sha256": "af2de6af905d9cc6e4415fdc104fd658c2a4812255c16e7ce71a502fde4968db" + "sha256": "dafc1445159c142877215c2f4bf913df094fd8aea67f2cee38e9cfafeaf41ee1" }, "nbns-advertiser-netbsd4le": { "path": "bin/nbns-netbsd4le/nbns-advertiser", - "sha256": "f52c5f708b6638589434e45b0d46cc830539c02748dd8b231da25d3406ea6fae" + "sha256": "6a0b1be099d495e56d4c93be609a96b8b3a6075113efe484d1785aa1cc6c89a0" }, "nbns-advertiser-netbsd4be": { "path": "bin/nbns-netbsd4be/nbns-advertiser", - "sha256": "60c8e5266a2efce13fd0fe4ae2e7264153e1d1aafa14c87707d27dc357aabfdb" + "sha256": "b6fdaebf5a5a96dc4dfc50ce43777cce9a74dcb8f2720c019c745a4d7613717b" }, "smbd": { "path": "bin/samba4/smbd", diff --git a/src/timecapsulesmb/assets/boot/samba4/common.d/70-smbd-service.sh b/src/timecapsulesmb/assets/boot/samba4/common.d/70-smbd-service.sh index cdb2fef..e232f95 100644 --- a/src/timecapsulesmb/assets/boot/samba4/common.d/70-smbd-service.sh +++ b/src/timecapsulesmb/assets/boot/samba4/common.d/70-smbd-service.sh @@ -1,15 +1,30 @@ -tc_fstat_line_is_ipv4_tcp_445() { - case "$1" in - *" internet stream tcp "*":445"*) return 0 ;; +tc_fstat_line_matches_socket() { + family=$1 + sock_type=$2 + proto=$3 + port=$4 + line=$5 + + case "$line" in + *" $family $sock_type $proto "*":$port"*) return 0 ;; *) return 1 ;; esac } +tc_runtime_process_table() { + /bin/ps axww -o pid= -o stat= -o ucomm= -o command= 2>/dev/null +} + +tc_runtime_fstat_pid() { + /usr/bin/fstat -p "$1" 2>/dev/null +} + +tc_fstat_line_is_ipv4_tcp_445() { + tc_fstat_line_matches_socket internet stream tcp 445 "$1" +} + tc_fstat_line_is_ipv6_tcp_445() { - case "$1" in - *" internet6 stream tcp "*":445"*) return 0 ;; - *) return 1 ;; - esac + tc_fstat_line_matches_socket internet6 stream tcp 445 "$1" } tc_bind_interfaces_have_ipv6() { @@ -24,43 +39,21 @@ tc_bind_interfaces_have_ipv6() { } tc_smbd_bound_ipv4_445() { - if ps_out=$(/bin/ps axww -o pid= -o stat= -o ucomm= -o command= 2>/dev/null); then - old_ifs=$IFS - IFS=' -' - for line in $ps_out; do - [ -n "$line" ] || continue - line_ifs=$IFS - IFS=' ' - set -- $line - IFS=$line_ifs - [ "$#" -ge 3 ] || continue - case "$2" in - Z*) continue ;; - esac - [ "$3" = "smbd" ] || continue - - if fstat_out=$(/usr/bin/fstat -p "$1" 2>/dev/null); then - fstat_ifs=$IFS - IFS=' -' - for fstat_line in $fstat_out; do - if tc_fstat_line_is_ipv4_tcp_445 "$fstat_line"; then - IFS=$old_ifs - return 0 - fi - done - IFS=$fstat_ifs - fi - done - IFS=$old_ifs - fi - - return 1 + tc_process_has_fstat_socket smbd internet stream tcp 445 } tc_smbd_bound_ipv6_445() { - if ps_out=$(/bin/ps axww -o pid= -o stat= -o ucomm= -o command= 2>/dev/null); then + tc_process_has_fstat_socket smbd internet6 stream tcp 445 +} + +tc_process_has_fstat_socket() { + proc_name=$1 + family=$2 + sock_type=$3 + proto=$4 + port=$5 + + if ps_out=$(tc_runtime_process_table); then old_ifs=$IFS IFS=' ' @@ -74,14 +67,14 @@ tc_smbd_bound_ipv6_445() { case "$2" in Z*) continue ;; esac - [ "$3" = "smbd" ] || continue + [ "$3" = "$proc_name" ] || continue - if fstat_out=$(/usr/bin/fstat -p "$1" 2>/dev/null); then + if fstat_out=$(tc_runtime_fstat_pid "$1"); then fstat_ifs=$IFS IFS=' ' for fstat_line in $fstat_out; do - if tc_fstat_line_is_ipv6_tcp_445 "$fstat_line"; then + if tc_fstat_line_matches_socket "$family" "$sock_type" "$proto" "$port" "$fstat_line"; then IFS=$old_ifs return 0 fi @@ -109,97 +102,25 @@ tc_smbd_bound_tcp_445() { } tc_fstat_line_is_ipv4_udp_port() { - port=$1 - case "$2" in - *" internet dgram udp "*":$port"*) return 0 ;; - *) return 1 ;; - esac + tc_fstat_line_matches_socket internet dgram udp "$1" "$2" } tc_fstat_line_is_ipv6_udp_port() { - port=$1 - case "$2" in - *" internet6 dgram udp "*":$port"*) return 0 ;; - *) return 1 ;; - esac + tc_fstat_line_matches_socket internet6 dgram udp "$1" "$2" } tc_process_bound_ipv4_udp_port() { proc_name=$1 port=$2 - if ps_out=$(/bin/ps axww -o pid= -o stat= -o ucomm= -o command= 2>/dev/null); then - old_ifs=$IFS - IFS=' -' - for line in $ps_out; do - [ -n "$line" ] || continue - line_ifs=$IFS - IFS=' ' - set -- $line - IFS=$line_ifs - [ "$#" -ge 3 ] || continue - case "$2" in - Z*) continue ;; - esac - [ "$3" = "$proc_name" ] || continue - - if fstat_out=$(/usr/bin/fstat -p "$1" 2>/dev/null); then - fstat_ifs=$IFS - IFS=' -' - for fstat_line in $fstat_out; do - if tc_fstat_line_is_ipv4_udp_port "$port" "$fstat_line"; then - IFS=$old_ifs - return 0 - fi - done - IFS=$fstat_ifs - fi - done - IFS=$old_ifs - fi - - return 1 + tc_process_has_fstat_socket "$proc_name" internet dgram udp "$port" } tc_process_bound_ipv6_udp_port() { proc_name=$1 port=$2 - if ps_out=$(/bin/ps axww -o pid= -o stat= -o ucomm= -o command= 2>/dev/null); then - old_ifs=$IFS - IFS=' -' - for line in $ps_out; do - [ -n "$line" ] || continue - line_ifs=$IFS - IFS=' ' - set -- $line - IFS=$line_ifs - [ "$#" -ge 3 ] || continue - case "$2" in - Z*) continue ;; - esac - [ "$3" = "$proc_name" ] || continue - - if fstat_out=$(/usr/bin/fstat -p "$1" 2>/dev/null); then - fstat_ifs=$IFS - IFS=' -' - for fstat_line in $fstat_out; do - if tc_fstat_line_is_ipv6_udp_port "$port" "$fstat_line"; then - IFS=$old_ifs - return 0 - fi - done - IFS=$fstat_ifs - fi - done - IFS=$old_ifs - fi - - return 1 + tc_process_has_fstat_socket "$proc_name" internet6 dgram udp "$port" } tc_bind_interfaces_have_nonloopback_ipv4() { diff --git a/tests/test_deploy_modules.py b/tests/test_deploy_modules.py index 2760fc9..c290db1 100644 --- a/tests/test_deploy_modules.py +++ b/tests/test_deploy_modules.py @@ -1531,7 +1531,15 @@ def test_mdns_auto_ip_helpers_filter_and_detect_interface_changes(self) -> None: struct iface_context_set a; struct iface_context_set b; struct ifreq sample_ifr; + struct ifconf_entry_view view; + struct sockaddr_in6 raw_sin6; + struct sockaddr_in6 copied_sin6; + union {{ + long align; + char bytes[IFNAMSIZ + sizeof(struct sockaddr_in6) + sizeof(long)]; + }} raw_entry; size_t expected_variable_step; + size_t expected_raw_step; if (runtime_ipv4_is_usable(inet_addr("0.1.2.3")) || runtime_ipv4_is_usable(inet_addr("127.0.0.1")) || @@ -1571,6 +1579,35 @@ def test_mdns_auto_ip_helpers_filter_and_detect_interface_changes(self) -> None: if (ifreq_entry_size(&sample_ifr, expected_variable_step, 0) != expected_variable_step) {{ return 9; }} + memset(&raw_entry, 0, sizeof(raw_entry)); + memcpy(raw_entry.bytes, "bridge0", 7); + memset(&raw_sin6, 0, sizeof(raw_sin6)); + raw_sin6.sin6_family = AF_INET6; +#if defined(__NetBSD__) || defined(__APPLE__) || defined(__FreeBSD__) || defined(__OpenBSD__) || defined(__DragonFly__) + raw_sin6.sin6_len = sizeof(raw_sin6); +#endif + if (inet_pton(AF_INET6, "fdbb:1111:2222:3333::40", &raw_sin6.sin6_addr) != 1) {{ + return 12; + }} + memcpy(raw_entry.bytes + IFNAMSIZ, &raw_sin6, sizeof(raw_sin6)); + expected_raw_step = IFNAMSIZ + sizeof(raw_sin6); + if ((expected_raw_step % sizeof(long)) != 0) {{ + expected_raw_step += sizeof(long) - (expected_raw_step % sizeof(long)); + }} + if (expected_raw_step < sizeof(sample_ifr)) {{ + expected_raw_step = sizeof(sample_ifr); + }} + if (ifconf_entry_view_from_cursor(&view, raw_entry.bytes, sizeof(raw_entry.bytes), 0) != 0 || + view.step != expected_raw_step || + view.addr_len != sizeof(raw_sin6) || + strcmp(view.name, "bridge0") != 0) {{ + return 13; + }} + memset(&copied_sin6, 0, sizeof(copied_sin6)); + memcpy(&copied_sin6, view.addr, sizeof(copied_sin6)); + if (memcmp(&copied_sin6.sin6_addr, &raw_sin6.sin6_addr, sizeof(raw_sin6.sin6_addr)) != 0) {{ + return 14; + }} memset(&a, 0, sizeof(a)); memset(&b, 0, sizeof(b)); @@ -1636,6 +1673,7 @@ def test_mdns_auto_ip_cidr_helpers_format_valid_bind_output(self) -> None: int main(void) {{ struct iface_context_set set; char cidr[INET_ADDRSTRLEN + 4]; + struct in6_addr mask6; if (netmask_prefix_length(inet_addr("255.255.255.0")) != 24 || netmask_prefix_length(inet_addr("255.255.0.0")) != 16 || @@ -1643,6 +1681,21 @@ def test_mdns_auto_ip_cidr_helpers_format_valid_bind_output(self) -> None: netmask_prefix_length(inet_addr("255.0.255.0")) != 24) {{ return 1; }} + if (netmask_prefix_length(ipv4_link_local_netmask()) != 16) {{ + return 6; + }} + if (inet_pton(AF_INET6, "ffff:ffff:ffff:ffff::", &mask6) != 1 || + ipv6_prefix_length_from_mask(&mask6) != 64) {{ + return 7; + }} + memset(&mask6, 0, sizeof(mask6)); + if (ipv6_prefix_length_from_mask(&mask6) != -1) {{ + return 8; + }} + if (inet_pton(AF_INET6, "ffff:ffff::ffff", &mask6) != 1 || + ipv6_prefix_length_from_mask(&mask6) != -1) {{ + return 9; + }} memset(&set, 0, sizeof(set)); if (print_iface_context_cidrs(stdout, &set) == 0) {{ @@ -1694,6 +1747,7 @@ def test_mdns_smb_bind_tokens_and_host_records_are_link_scoped_dual_stack(self) int main(void) {{ struct link_context_set set; struct in6_addr ula; + struct in6_addr unknown_prefix; struct in6_addr ll; uint8_t packet[512]; size_t off; @@ -1701,6 +1755,7 @@ def test_mdns_smb_bind_tokens_and_host_records_are_link_scoped_dual_stack(self) memset(&set, 0, sizeof(set)); if (inet_pton(AF_INET6, "fdbb:1111:2222:3333::40", &ula) != 1 || + inet_pton(AF_INET6, "fdbb:1111:2222:3333::41", &unknown_prefix) != 1 || inet_pton(AF_INET6, "fe80::40", &ll) != 1) {{ return 1; }} @@ -1708,9 +1763,10 @@ def test_mdns_smb_bind_tokens_and_host_records_are_link_scoped_dual_stack(self) append_link_ipv4(&set, "bridge0", inet_addr("169.254.1.9"), inet_addr("255.255.0.0"), IFF_UP | IFF_RUNNING); append_link_ipv4(&set, "lo0", inet_addr("127.0.0.1"), inet_addr("255.0.0.0"), IFF_UP | IFF_RUNNING); append_link_ipv6(&set, "bridge0", &ula, 64, 7, IFF_UP | IFF_RUNNING); + append_link_ipv6(&set, "bridge0", &unknown_prefix, -1, 7, IFF_UP | IFF_RUNNING); append_link_ipv6(&set, "bridge0", &ll, 64, 7, IFF_UP | IFF_RUNNING); - if (set.count != 1 || set.links[0].ipv4_count != 2 || set.links[0].ipv6_count != 2) {{ + if (set.count != 1 || set.links[0].ipv4_count != 2 || set.links[0].ipv6_count != 3) {{ return 2; }} if (print_smb_link_bind_tokens(stdout, &set) != 0) {{ @@ -1727,6 +1783,7 @@ def test_mdns_smb_bind_tokens_and_host_records_are_link_scoped_dual_stack(self) !buffer_contains(packet, off, &set.links[0].ipv4[0].addr, sizeof(set.links[0].ipv4[0].addr)) || !buffer_contains(packet, off, &set.links[0].ipv4[1].addr, sizeof(set.links[0].ipv4[1].addr)) || !buffer_contains(packet, off, &ula, sizeof(ula)) || + buffer_contains(packet, off, &unknown_prefix, sizeof(unknown_prefix)) || buffer_contains(packet, off, &ll, sizeof(ll))) {{ return 5; }} diff --git a/tests/test_storage_runtime.py b/tests/test_storage_runtime.py index cdfe370..e38f640 100644 --- a/tests/test_storage_runtime.py +++ b/tests/test_storage_runtime.py @@ -3098,6 +3098,82 @@ def test_common_smbd_bound_tcp_445_requires_configured_socket_families(self) -> self.assertEqual(proc.returncode, 0, proc.stderr) self.assertEqual(proc.stdout, "ipv4_only=0\nipv6_only=0\ndual_missing_v6=1\ndual_bound=0\n") + def test_common_fstat_socket_scanner_matches_process_family_and_port(self) -> None: + with tempfile.TemporaryDirectory() as tmp: + tmp_path = Path(tmp) + flash, _memory, _locks, _volumes = self.write_runtime_harness(tmp_path) + calls = tmp_path / "fstat-calls" + script = tmp_path / "fstat-socket-scanner.sh" + script.write_text( + textwrap.dedent( + f"""\ + #!/bin/sh + set -eu + . {flash}/common.sh + . {flash}/tcapsulesmb.conf + : > {calls} + tc_runtime_process_table() {{ + cat <<'EOF' + 100 Z smbd smbd + 101 S smbd smbd + 102 S mdns-advertiser mdns-advertiser + 103 S other other + EOF + }} + tc_runtime_fstat_pid() {{ + echo "$1" >> {calls} + case "$1" in + 100) echo "root smbd 100 10 internet stream tcp 0x0 *:445" ;; + 101) + echo "root smbd 101 10 internet stream tcp 0x0 *:445" + echo "root smbd 101 11 internet6 stream tcp 0x0 [*]:445" + ;; + 102) + echo "root mdns-advertiser 102 10 internet dgram udp 0x0 *:5353" + echo "root mdns-advertiser 102 11 internet6 dgram udp 0x0 [*]:5353" + ;; + *) echo "root other $1 10 internet dgram udp 0x0 *:5353" ;; + esac + }} + + status=0 + tc_smbd_bound_ipv4_445 || status=$? + echo "smbd4=$status" + status=0 + tc_smbd_bound_ipv6_445 || status=$? + echo "smbd6=$status" + status=0 + tc_process_bound_ipv4_udp_port "$MDNS_PROC_NAME" 5353 || status=$? + echo "mdns4=$status" + status=0 + tc_process_bound_ipv6_udp_port "$MDNS_PROC_NAME" 5353 || status=$? + echo "mdns6=$status" + status=0 + tc_process_bound_ipv4_udp_port "$MDNS_PROC_NAME" 9999 || status=$? + echo "mdns4_wrong_port=$status" + echo "calls=$(cat {calls})" + """ + ) + ) + script.chmod(0o755) + + proc = subprocess.run([str(script)], text=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE, check=False) + + self.assertEqual(proc.returncode, 0, proc.stderr) + self.assertEqual( + proc.stdout, + "smbd4=0\n" + "smbd6=0\n" + "mdns4=0\n" + "mdns6=0\n" + "mdns4_wrong_port=1\n" + "calls=101\n" + "101\n" + "102\n" + "102\n" + "102\n", + ) + def test_common_mdns_bound_udp_5353_requires_reported_socket_families(self) -> None: with tempfile.TemporaryDirectory() as tmp: tmp_path = Path(tmp) From af9c8200b3d598a8079d5818091e71c1473edcdc Mon Sep 17 00:00:00 2001 From: James Chang Date: Wed, 20 May 2026 23:29:21 -0700 Subject: [PATCH 3/6] Harden mdns runtime link handling Fix Ubuntu CI portability by marking BSD-only ifreq parameters as intentionally unused on platforms that do not expose sockaddr lengths. Improve mdns-advertiser's runtime socket update path with rollback for partial multicast joins, IPv4 fallback when IPv6 transport setup fails, capacity truncation reporting, bounded stack-only log truncation, and known-answer suppression that does not hide other link-valid A/AAAA records. Rebuild mdns and nbns NetBSD artifacts and refresh the artifact manifest. --- bin/mdns-netbsd4be/mdns-advertiser | Bin 239228 -> 242372 bytes bin/mdns-netbsd4le/mdns-advertiser | Bin 240532 -> 243852 bytes bin/mdns/mdns-advertiser | Bin 299796 -> 303668 bytes bin/nbns-netbsd4be/nbns-advertiser | Bin 137876 -> 137884 bytes bin/nbns-netbsd4le/nbns-advertiser | Bin 138660 -> 138668 bytes bin/nbns/nbns-advertiser | Bin 196868 -> 196972 bytes build/auto-ip-common.inc | 61 +- build/mdns-advertiser.c | 639 ++++++++++++++++-- .../assets/artifact-manifest.json | 12 +- tests/test_deploy_modules.py | 434 +++++++++++- 10 files changed, 1040 insertions(+), 106 deletions(-) diff --git a/bin/mdns-netbsd4be/mdns-advertiser b/bin/mdns-netbsd4be/mdns-advertiser index af7fe8cf702dd57f9bc0dcb6f9785d8ee91594d2..48e46c6c4688c42c7db4aec0a487ea4c5a9823eb 100755 GIT binary patch delta 47508 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 Gk^ccsWILw- delta 44434 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 diff --git a/bin/mdns-netbsd4le/mdns-advertiser b/bin/mdns-netbsd4le/mdns-advertiser index f60484a22fee9ed017cdaf630d412db35a96b618..5304913f679826109becc666b66031b72c334349 100755 GIT binary patch delta 46406 zcmbTf3wTu3)$o7LnF$G#0FxWUNl1neFhGC_L<9^lgs7ANP5==x;;2}yMU52|6`27N zKnfbz+ypeEqD92JZK<#A7nRr7TC`NrqD4Cwj)@6YYO(d6@3+pJ(dcXY{hvS2vpI9l z*?aAE-)pbE_sNz&_ucUKzAawkxnFK7EiDdS=+LC3Y5WUon$9Kp%*l1rWp^4SzkTxK z9Nj2C`gAX&RL{xyvqNhv>h8YvK;X?RDsL%L6CG=eqPNrwj`hZ}H`Q$CZ0E^qotir2 zoL5ocYcVx#Zlaf_x$^Aa4u1P9t>AJ5=8<9M96`#B}ef_&;n|LX+U8Y4r(U=AL|eZ_k2wK~Pn>{(dP0H@I8!VL&bj zX7d~wXq~z*lE^i}F^6|mv_zW&1Lth|th;++Qdso~-U|bw)P=EunC62xU&P_CVGHpm z-xa~A^_iu`H{P#VazOSTH}r^3oW}0~bX9+zdL`2{Z@RCw8TPD(6{{WIHEU6>_4T78 ziLIBFMRhl#vNT~$yNFJ6M-p%UTI-VE8SY4|AKJ0vVy(*^X)@*6$w%+$sLew@fG#n zBkex5D0}F@qQEvY4Q&)br&H}0UnZ+b(>?0G?A&3}$@crb(Thsz;!oI!iERkt^{sa# z1?k(_zD&KF{SRZwuhi=~*G||FNh(M`l%h&2G{@Uuv$X!^8S-132PT@w$Gb}VT?X$) zsatY??ioCr*1uxo5@7ZzD0W{OI{32DH*WW0*S&hr9F?!8bx8}_-=H04Z%3Bzk zbgR~t)buw@ceK^~b9Z-V!Qr~NxPda{v1Ok_E8=Qt@?Vqsl682NjebkJ4v&#XqDsp& zeLhHo&sF}U4DOy*7EOoWg2(5rNy?^!kK4P&bo;iO4sFiDSS=6oc#xNT5c6|izOZFRPEj$GoHj{M=-b-v(B{X)*3#(*&)^v_#<=wsHG4pRW9cpG#{)`xMUl(Ned^8u zqx4bgw*!hoxK^=c$9VYNw#(GV%|)N_W?DnS5shT)(bagJMF}m8PC$482)cc%7<%T$ z{MYZ^+BXo{6!dS{+*i|fX2Xc1Hd2Cw8^6*^TNf?zH^tLHvf5^n=oWn>a?>KQkhohJ zOG>o!6Y1Ldn?&dz;woiKk$1^)Adom|I~^?;(do>^HQ~R$#SHqx@m@#+U*Gu~yK^BR z_lh;y--j!RFkVd*DV#)6fjvKV67781+iF?^OCw^%I|4km^BF`Mi6mStkytUn#XIc0 z!5dADq5hREX^ucd2LS^Xxr(TBw~fGQYGlEHYg{}D;)(Ff34C%pYGy%kcq6ebmwVCi zJEAYpi|&IzzBTQ7WPSWw6W@+77sigI(7o=Sju*e`?ySF$J(C=YmelAbmD3GcZU?@O}h;W=in$ z5|9P&MDXV)M1!5Sz|r*ehC3W}LQsKL7ylXEHMC)K?n0AimUkD2S>)Snjqw@yEo9-y z)gn6b$!Dw!Bj`XPOABlgL5Pr5WOLs3=yt>Tbi-*yx{>#cy4ADD`0{D>j%T9r_GhYp z;TjbwDjW5)r?swb+E#$XjPvT^Vn(7YYNpn;7tbZX%e{4RG_>=|r`5+rqx6UxG_XY9 zp{5SZHS*3?^9K&~++j&b>tygvc*UMjG3PRe*0xV=8@Ny}Qhy(Kx_*Z`t+;UDDqEOV zM^NYX?IMzh#1_Gkt5kh)p}tgIQ#@F&Rhx=)^#=7|@mYO?zSVI@WM$Mvy|2Gge=8n0 z@tp60c^QomFr|Q*^1XMdE(&=!q+2a2@fele>eiA{L+@7imh{*C>X#+k^)J;dZ=wE) z`U(I4MKya%^!L?+-jadu*>TV5G$*96Jb~qL!2ZuFM(xAuEAN%Y&ZpFm2hGv%Q@0o`Tx~KFKqv|R3b?Kc( z#nJP+G z+I{CfrEVIs$Qb{mdTYo+eYL6_TBt8qvxctj`_U6pE2*g`o>1=%y)5*rX;`4v7)KY! z%IGByM*>dq2h;wVG>{BD<6t~w*2~hAxG;z}1dPMCDyjz}v5Iw(SP33bj6;TZr+a0* z6az6Z6o!QLt|zsw(zc7tLB5Mj$H5J;B?oEq@&@1?3RysBgzDlI84Ikjp;xqtup_C= z>Apxz#svLPBvBsCG_|&k<~D0U4} zB;f?Ez&vL(9ShKvHqew+p*|A!d$tK+Dm&;X4}0<19Fl2+aEPfwOb_BU{UT+p)2VN5 zPudvM2HY($zL`2`l`<$2iMS)NQ?~Uts{2kaIpY`qN-Bg#kiW&7ncqTLM(=xo_{^AA zb9cDVZ1EPFn^%`d_vW;k5|RBxeRBGU(3V9Av@sA*_g~?baYek{dEW?mUg8X-BF_S} zLW2?`khTn(XroJ>SKH5r*w1C0lIP|2^Ah{{V1ezg#e2<5lq1pULGeJ%sX5deUrC0OZ->E3`~~J!>JCg{GrhNB?@-SVE6fKK7e>%2jzotfhxd;5(^PC&$&``U3k%J5!;)Zbhoe^p~ zeA^h$F0kesA0Yb;jjd)n&t#U>l$yH)l5-can5)1~T{a{tN-r`p{~Vn4nay#z zm$^$f3>baB*5z_X7Fjnk42e6@rW%KIvt?XnL#IhXOq>01{SyU+vE%m@Fa`i~qwW!dFPU7BuVCeh{%_OqT8Tx&n; zNx@Gp*VJG8<@a3->d#RQQI6iM?jJeE==e&#HFBb{YM#m&waBQrT>WfRspqlBB-994 zV~$KB1aWL&_(k*7W21_V<2S3!WI7)qA}UG4sWZn7?~Up>HBr9Sd}AbYQ(_lC zMSPlMA3i5aRg9_sHD67f;2HDANHOt1Jk1}`2~b@Ug6jTALNW(?M#&T|kXV9t*wXU6 zyiKi{Fx2>Bs(Ng~(BhkDEn1$M*e#=@;FAvR39fsVsgEa&3iZ`SesB^~DX+vCy)!HB zW=tq2tjuWpIYTj-jX)&kZDYV;uoB zAYJR8NaBk*5W)O(l%_qayXGfczR2Kne04*djggR~P6nUNjc`=cB8lbmwXQNIm1PKI zYCR315Yu+m`Wff|>P1)rIE;fi3qzClGXF~reE);Pm)~Asy)VCkdz>pFLPAnSGTUayX_?FSnl>f{TX5^z{S4-GTCVC&x4vG8+r+#iWOwO_5T_T)c8b-W%N4x2%=P!uMn zep6j&9H>=qRS)gE+=>aJ3A{|_z-`JkX_WrFnlPzQ|FJrM(rEoL)jVmeK1=;(Qc3B| zTO8UE@Q6|buM=E9B@6i_rGa;QZc(34nwS=N1b(Pk*7Y+O9NKWfa?B2+%HYtcC!_ewXR_ZITN0Upv!y+9&pPh zt6TlW#apfF5oFFRyoV?{z}I)1`jvmUvG_I>_m2yCk?^*CSOA?ar=tQiV(1jn1WXW3 zl1}>2iP(xvw_4iPf~++xg2*LcfEIP$WD~X#!lbSf!lZry zbqn0BC8l6KkIH3&CPUPc+Z@_5ib$wUaGY4WKwx;0G5o{3cV2AcyW7V1!^vv$RFCna zN7O;UZ7zqdRXqyL& zW3*3+J_14eZQ?qXtM{jl>c9P3{9;xhaTzlS0kfZxqUaJeyr$GR^01m+Q*3NHsjjUV zZan;z+FA26{U@r=v;oGNuhh_KLvxnfvliULK2eNm*QiC)N{3IpCaDwaiNOhpJiS3% zU=JUjd@f!^?!UN3?VIMAxCkh3^@z%DOe?*F-39B#a`fS5oqTb{3rzL9C zkLDZywM4Dq@*oen+_glFn=#+Gg_>M0U!vaUGHZ#NTsPl1bBWqkH!*b47f4Y1c6MGg zSkso!=P0hrxo)7$;rDK?mvPtF>j|!#xqittD?~i@ibJa) zi|nIRQ>IhqQG%2uH<7DY#*ZdS3q=UteUrLu=5XW957nJBOZ6MnlQXC38`UQ>&(fEv z%2{Le(dvp>ml*$iNWC;`mGS07YR2qhW7SX9)w4^B_lwK!L5uLr4-NvhAf)!q9%VfF zka}nK@V{)MJ5d^S>r^lEE_r3#rfu zK2XgTZ>!nn+}LsOY7JLqtxt^A8E7N@l(;$<=|L+io(@i8ZKCN;`Rz{zF8V`iXZ@(q zyH->dO{CQ4luc1}722I)zWbool|=;NoGzYZlbPY&WtQ>V zq2rMSIs<1>nI{oaY)`8Pn^A8i644%c3*TwKKNOZv@y*zMs{76eC(`r10;MlU! z{L*fh=7rx4&GFf~<~f4r?low2`_kXHnpvAN7PMD}R6|jkH`x%a!1r;r@Bt@NeoU^4&`inQg5B zE>=^|FSNLGq>UU(iaUXgA5>V}$)bI^y5sy21cRFEoY{5p3_{F76>H-~a7lb_c5x(e zhE45(bObn{HGgi8-n@2iRqF5Om;5jKrdqu$pxtscVgBe!p-n?ydty@d19W}at2Muj zp32nS^9N6=0`~$R3M!lcg5Co{2G0)v0EFE@c)5RTewO-d{+WZeS|bZBnd{1c`Kskc z1BqH{Ev42!Rs99IdX>83f|6n1;Xlxi{{ZykX|4GM>d_0PSQLFjP4ru7z3}({t-(ua zwOH# z+&{zn47&pn{qJcL;n}I&R&&T}W9?!aqLNSx%4XR7 zkX{1Zi=P(L5j7cUtE!A$mK-LE9CE*r!)_fpNXE~GF%6!sravhIv1KR+i8%qabKy9|I(Qh z+$^41`ggpTT+5x-V7er)ujynd@{|vOgODhK!?&q@Nm&kv&57X#CyEiOXxY$^410BP z#@fULhRKO-b>_wBkmw65mS!WmBH%UO26HK0ShnlC6JC(HKAc>*lxgOdGS06g6rzTA?-a$kipG=*eiz7*@ip~g}7!Q)rQ9OGY%)$nYpnsG;?{5X3Ca;&FG+v z3yz9)p}0}KF8;c$6Jo?gD3zdD&<}ktCbNWoi*DaZ*3lV^#QxivjPv@Vkw|MmW*yNlDG#1i!||aR;I@z4&WahNn}Y1xJn^7JJm<1 zM<<)?PSOQy-!8L&PMqIhz0sUa2SveMW-}dVEs?|@blfAu!#X3|l*N+`IoW2Fw=Vwr z6x1HXs{WSj^ldDy%8R#0d>d-=;HU%|b7OCif}bE7vz9#AFn~VcY%Xs7o&!u=#RlzjaxKW>Zn2Ic6jV?cS{Jx-5U#x~xo|Wt!oNOq2N4 zitm@%Y$ToU5@7iQ*Tp|mxBqzXqNPCipJKv6ZBxgxLxtoc!?NlXb9z_BmRA>=OM%u1 zv?V}uwrz+xeXDt%X)ZgIY0iO0VB1o2A-ae@oURIiS6z}nJ^+*!7!jC!hdTXjzp7nsEuDdMl z8yp({4GtoQ|AfO58;2#}@F#H4EXtFzk-bd$1JQBt$Z$`MFZkbhsGnZe`x_iYU_ZnM zk=K91A!y?e1c%4Lp~x#Tos$@3%e2kriQtpn1D~-;e2m0*#UTRzAv8q5{|SwGHX8Fl zV?AhOUyQSabeUb|+oWfT2oU2i#ObJ76%$di9fp-8t<)noqNpi-zXkjy*(U%5kW;1o zxMYr{C1{6e#nnPB-beK8NQO9XN@1b)s%Z7d;HjDYbGgeh2(qf_A)ro zcjy}%D1zegRd&Z!&1tg##mQEnW8Z5M8Bcf0I?*+mqh`|hx|stn%2u!yS+<0duj z!r17qyFCMO?p1^!sZo0sVXpihkFyNP&Ny7C`0b^ox_P=0!if|9z5cj3@?3L6POjz5 z9sWpcJkFfO1#9@5e6SvYf#p{*B0#9zy@|0vs6KTL-b0gM-4 zUYdh1U-cbdeqV!B0D*O5a!skEyH`hLzd$troPz0$y7&(2SO6G3ba&Ht*2Ol-JE$E+ z05B3YbOl$(4d=?(cv7jFdU8zezzW`s;LYF+LN>w+qikhtBq19pnuZJ>A>xG^UQ}y^ z<_KO?cJ2gsfLO4oKCsKU<%cC?SulJpD*doe9pK{jf`F~`!C zF;;#&Sp+q*fa$W7dtKbH)#`NADm5zi@`4*rRiXp!}3W zK8t!HyN}GI?9S{#Vb9PaXt%#gkivkoA#9zIhj+;{g*YMdF}qHY7TT5Hkd>K#u}z`u zsq8tX&9W<=1enON`rpV=L}*cMD`!fKm!&%L?aE&OG1Gwmt}RML>d6lE7(mCQD*Jck z&zqT zy6iFo=i*P=;h;OY>JiG48%#kIji^xarG)VFtWE7QWJsr3cBf3^{$r;lcBe8t&FsvRGu)o0O*7(5sd?EuZ z=fVV8dP{^xQB(XkcKg}1pBkzF>oShD09O=kKI+YQIpug{+X zU^jrp9|%xE?t#?%IqUPW4s_>2ON@O6Cg1O}--~as=0506NEBzum?AR|mRp@+s{vb% zL#deI-)<>ShJURo3ba&YXUlPgEywY5*V}sY-3~)`hnC*p^`s9mN%4M5#)wH~hra1_ zlRc@G^|y?vcBfO5ojxt^>`pIDbvkc-zUW0`a+VgielyEC)0{rtHiuY4G}2-E0a^K3gQrUOI^k|#icv|u#xLzI)>OZ?iVd@SOU z#IR6pv~7t0f1>(ZqC@{rs`uyqFx8((&f$AhGupjlZJkFigkq6%Q;yqgLDqtpaPm`| zat)$0qNOA;c#+C|LbXe%mgqi}DpL(t*BXEPTwQx(|B&d&HDs-7GqX%dWJqi~y)et1 zIU)-YB{Nl$+I0jXu}9fu^5p~>lDD?YjDmeM2`g#9RnA#ph8~0cbDQrHI3R1Kh1e$N zi^LAu+(itYr?2Hbh-U=PDU4S&LKzhVLD^ju8Ac{1dt*mem#X>cm@$jFmDNL$>YKI| z{|_*veX5DPua;)e-P)xd`stVppYEF^rHZWLsdAFU0)p3)ur0E|>;sIb|6dYGzOyFp z%73)k@;oWjC1PJ|qkb>-=cvjhxqYUw*GnX|jVFbwe#wB)%i&CuLBh&#&-+7>=?o{= z4_>!xiX+mOtcf?%;$^fwos};C%dKX9F)Li1b@6$HtTaZqwx@0UX2r`g--|g-)|ah~ zLaN{t=)#=w1+x7$f!#kXYfjN!gIVILwOA<#zkVGowb^;}bTaq;jUBgiDc3cl21U4) zl|GGCILZEAZu3GWeCr0ZnlGyhuPGT4q*ex;5{?ygC22i}8j^Q)5HN_aYt=p13<$|g zM`F?xzeJM7HowlG#rY!Y;5l(8Wl%+PT-L>e7Fic7ws|vxdQY#g=rCpMs|qJIBAt4& z4YO@1D>gC#somHyMzCoM#0k1R=>KqQGgGSK4k}txEStDNHgPgmRj7-vE$kblhLA1M z%+XG@=Gx-WL|t>nSIUb5q(XAj;z7&4059WU8W!POO5({?eXewa3GsO zQ!G|%W7fu;P%PJ{EzUFv+d7-j$t+e{rUOJ)T57p>cn`@+OI*hZRy`=J-O|osxLB6A zDf+SK-uGl?G&IFiqKK9yIpsz5p6yh<8cX$~YFOjwyf81)V4+a8+a4g5yRkqItLDbj z&uD4`4yw2 zx6;+CKN}lb1rH^N(0psGoW^uiQG$=!%xnv)kdabzQTZQIbvx;nI1jX?el=v)4@@p8 zRpTZ7g)A|7S7Mu@{>7ZhTNST9tFQS)W$SPRnY0bb?)Yiw&=$o$`MP`JWK`TzSKeDL zMm>B($qb9r{z9|Az5FOS(SOHjYlwo|!fBsB)8cf>I<=E3XKCpiVXWw-GlIcV<+Fbz zJ?EpOk;Fj%6E_6x_l-XBky^8~cxZ|VvRhpouYc@&1VnQaXCjhKqJS{Cx=_8cbok^? znE^OgvjwP$C9CG|E>{)sd^ttV+|}}4HtsyZwS#hst(aP~8gt`BeWtqR#<~4pw<7*% zq7=SK_@U)(>=spjQ*JNmJ>0CWzG-rfOyIK)GxcG2(q52e``EKLon!p=xa!O+R^FQ{ z#$88^B6cLn9=j#-o7%F=HMQS!aZ8e%JzTBTI62+?u3B~T#L^qVb{It5z*VpnKhiHs zv~iL#kP*E8RrTJ@rAE!)l(B5w+15d3-*zjwai9!h9uJ`H(vpNqX9b-b8Z$H-N*Ykc zv%Fb9OV%cpS;ioop>AJRk|W3FDmEq2YT|nGTJ_kn;i2k6UE8}s`_7u-Qq~HkjqA5ADfx9jUN!9hs*->Q)}F4b^Rfd%U}AI?jMO zsI~2}fM5wXk8m%S)+eV-0k1eu`IAnb=@+o-){vF6CF9c>VJN_8hq=JsY!8cX3)7X z_Bg;&@vA7$5tw?MQoT8O7I-mNk-Z$Pu+9!a#BbCcx0XzPg&yVb0dw@-y{Q>cQoM`*&4nT|OJOuv1`)cBDh0a3Blq$U-X)lY*9%e!Ke9?S(@Paq0eK5dP0fOhrVD z$PdGtm*I=F{@n?cv!b+53#iGCS`th9{-CC=D9nGC2Fq+FUPa|!0Q&!^>sJiW5x|Pk z#+DQ6*%h8)WuPTIUBI=Ca*E>Jl9ZZeOU;QbG^npu3>dZTZhPalH_C7l#*>r9ac{DQ zku|dU9E>onb01jm%8vE0@c^-6gDI5~(`|ElaC z+{WQszFPqhmmuU#W^&~_5OPMC15n>8?iMwF<-*b{{+~_N>nq3TZ>Y3YWA#mH!m2`! zNuIxId?=7Kri@@DHq)DF1{e)S!xv2>xqvgnke_XEZ-qy)1-;%n=WqaaNCKkBdcM(& z*qhO2x(iK9v#iyj?P*L1(n!;1IwdRB$Qk5HYfJqyDz4l4my6!-+1b^F>Rq1DFFT2SF-smp1sHv30LbAJ*gDjvcj~jU{J7B$ZA!Ojo;qm#xUsn}f$%%nF zK+dz3-cS8}>W;MDUBHe6CPcs*CikEuyL7e2Cer|pc%a4h=4tzkaHvBziXTJGM7`Ww z8K)`FQBG2<0nOfCBHK#jqXs%iIU4CCEbB^{=9MV5kLNP!zCnKb$eH-Xa1=8=_(H17 zDFvjQASFBconGN**xbyDL8sM#n1ZR8%lgIx0({iMl00fK!g30gwYAJLBlq=+MDBB8 z{IZnSV1F zw#kDP06V3ktn)oX<-gl%n;MlDV7hXa;Bree7bb!|5Fhp};_QQ8YmPyUwTO&KSf`&| zu8~YOo^x(RR2yVNPFNABOdeDcY+;k7+H+8AsX!Fu(E%V|a^-BkuEnk;9~Fcvhu%|?FzB9c6O2rN~qftIULSp2N_84fOrjB4F_N4mL zy4+#6*@`b?l=vp03P0lMV?XD&b+}`T>T^fokJggOtHMbbBuS0otOVp3W`W@_Bji0q zwjXSjV|geW(1h1JPy~bdgXRsy^H{+K+P-BZH3q2b@5l{pc zemI@9hcS^^rI&Nt=)P==|F13L8?E!t`znB9aPC{MaFeK({TB3m-=+PvN2JF*GUki= zOZ{l#HZmAKAJaiYbx3^&->%5YF+%2WUdV$i02uzC@VTRTiD4}3b_B>PgT9a?YV-tT zd3lE+SMq$Y%tz$;NuJA9#)jj6K{Xl!@zconxPxoiirAmL^PvC?{Vy z$!48dTvtDxmDF|Li|@7pu%EV-Bu^x<7bN;=O&wVPce8^)5R%T8!Hrwkz__%LT}r`B z^A6ew0@j3x_oL2&=WtZGnC8VLks!Lp=G+M+yPfsv9V~J?Le-Jjv~{Z(N(vJ1BjyaQ z$EhIfDZYZ{?{AwapAeuZQ#|+3WV<@TqR{kDNIY?w|O(dk# z>9lwIn&Fu05Ux#uN&`fz{e@|G4URh|54$xYCOHm?2#nl^Rcw7B8`Lz=|4R8sP;@A2qyc;t+V7y4bt z3f4>dY5P0UwRP6lJKrWC2dF6-2YX15eEY2T5D`tV>&TR8~UvD4P&oa zF$MD=`j&46$!DQpokweoCKhXT@gp)OVt(@?h2{+SB6=cDy#P}a(fwJ59F_q6E4Sur z!ANe<-<*R-^T^8Exfdq8ueS7z@BCIWX1tb)};a$m=3TBPI zt)?(V_uU}pUs*X}@Z*~-NrPwXi8K=l@QE^CM}D&%ak(_Szxz|@dq$f7i0#}C#Q;`llo z9w~Pql@E{+O2;v9q-8z#{9ce)!SB`lPL0TtoH)$LQ}&aLwv$}5f8uSE3F#27l;`F9 zY^f1R$Hk`R(`@-i!3xQmTobW2nDinethwh}0T5#FoS|O5v&7Il)Zgy(OpsvKd3Q2^ zO^t1mD3OC#1(GOXoRU=wyo7bcvx)&#)UL0ZdRIy4a+Fyj0tZi0M}GzHm!P9(NSuNw z%Zu(F5Ss`ZC2AFj|G>87`fG^}i1Qh9axVbg)X?xV1ldU)iRqk?NbF!`bB%cplCVC@ zlv^GphGtbh5}U-cqTqJRW4cjEFL9OZ$6Cty2Dfhqak=HVa+h&W=#B3pa`SlErPS?n z#2>~IzSibCun_Bme5Kf$__em|t;G3}O=;c;U#QY{N?`4_eVnY9Fw@4zCBG3SKCU0) z#iCY&W-|t{UMy;pWl<~RZCI2rRLFfoX`wFh*K#8%tMeyl*7h-3LS4o#{H0a7W`Vbf zlWa|V>a5AsTkc>Z!dj9!I|zv`jQtKJl_*_i2lZ_0C}(BD`gR!Cr>rP261&`1+@886 z^6^>GjGDi>@37~l;!Cwc^K;k??TNM$(hzz08$UA`L{uQ}N+OA=YUAe9Lp5*Dir3WD z#UJOxdLmT$uv;zH2DZys352ofrn?9&vA-^fh{H^sd88NVlHCINlQ?ri~h4bR@s zNTxz0bLS0-Ca(D?iu6CFwC@)X85QueLt(noQ4RZqUev4EDmcx6ny*IxN zoT2oSlFj|)c+3PXUr*E}wT};M zHSbW@Z^@mS$f|paiHZf|AWy?~e-bOF`eP*77q{6`4TdI$Do}P%f2lwTLHJYu= zBkIx8CfV(dP^Vhn<4Y#GlL#N=*_n2mo??K}mKZkm3;CbA$EJQal`DRrvYwHwyt1GF zsm*rXrPLktAL`zPeAn7_XHvKSzpFcyicvfZxxWg$9zySj5* z|3Tnr*_CL`Gsw9N%^{&>$@*ogeXK6smU~(^8Y9{#*p0A(M0ne7y=}MON)3($zkGG76*4qGY|MZ=={b`%h>vG<{q@Ld~U=VGS*nyc~m<@I#Z0t^XTFnC%4ADgC z`(sM2-NPZ?KKh-vao$d_-|pe<{oi@}I&Z!9+vU97{++i^@piENb{=mxeCO@`yiMU= z!P}J!#y3DR64*sZJ>maqRP@nB6JmZ(cv@Yx> zj?KiUQ~d0v)x9s8sb^y6)3s^l9L5@fzl@gk7LF-}tw&XU{dH0{0p6Y?y@yhM1FvH7 zS5|!FLw?UoXq=et;DqkwyqC74nf9dWIfIdGG|MAf zIA57eKOj`3MH1V5Wl^`b#k~G6AqnIqFS*5h?rnCU`WOz$*5}dj4z_OWA!7dge61@N z<}%gvq3&_50!@1Az8*}oNIg@*W;cdvw?JjjM1auNX-Yy%_zq`#b&v1g*o`?P*;C( z6LSWV)o>;QgrxpbVk#}N)r14F^l&6LfPNZ$+pIbgU;3}-Oe2Kn2U$Hbcv)&k!D+lq zSCs|1p?~$!I(rk}h~m3_oWcaWBOK8)A`$%x(3Ms$0&s>WPdjy&q;m|HT*iCH`N{$G zHTAW_zQIGIS|ckv7OC6Xvn74tmw0lk*#OT|D~Bq?L1#w_`jI00bH1Vq>tv3 z4{9DSPcoeufW`DE)BoSv&&WZ!tld3f&TUn)YNV|u7?X3H7sOhWeox7z);A#iYofxf zw*@6cTn1VF(MJP)ETAVzHl%sszKL5S#bAPCh>jE4jzZu zmOl^6ub;FEnah`NlLs#}CMQ3F!4fh>U2^CmKy-t7jk1+$>_v6)-6)lOL_m@{huPk7 zoZmwJ`WCILjr&xxXASrAT<%j}91J7n`bnZ_%F={OAxz9oSoCMuSId?XLnbk337X+C ztetIFSU0W;cJGvv+PD@@)U%r-1teetu}lwOzy5PlH3aaB^4q>^2!;Kby%j7gCVjCe!U_=kjbAs#{}o zHawPZ0Kr{{?{$k1{Ao^fVov_CiAFy21J8I4L6rLmN_|JH_bdl_w940oAy-@J&f@@( z#^U9)Ha^wLT=Li}X_5`>)ahJI_?WA&S#ugQ@!{EK#|-xR`^4wq$e8ZyJ_r7uRP+el zT;50X99t;KDQmsNlR~mqeb`z!MEirhVGA@UxUF6{TPT61i-6S{{%Y08$myXm!bsGC zu+y`I4JNYX<{eq3)OMJ@Pq05P-xY@m(l24CD>X1NY{mW5pKYgbU(M1yGMx|?CDRCv z?a9(c&t#u0?Fy(n&93_bb+s|p`@RWdW>dTd35rS`QL#vF{$#of(X@m!O~mA@VUwDy zdfzwYw59BV*}%f;1}2^I*_3-hv=<20s!Q)19jdX%VQXOVt&VnAzQJ*sxruwT$VAf8 zN6UO*OHWy#^Oss|mOPC{j^+i(zZ=DtC8sBlKV)00U>a?X=&j~0^i)9GjMMolR{u0j zrpUpYIq6JUz~sB(Zb!)aLZEzi@zcSYwwQ;@C@qu-#?{MmbLL z?gnd82IX8O0dW=Ay_6>?8MwF(d43Pau_+rUK}sX#0OdF({84vz2UpeDt1Q%VFNeG- z`zfcOdJos8Yqh?!l@>n%Ng$j+(#){5s(Vw(D5XC%wcSdU_5ul)5qAwaT-Cjn`vdR)Br()xW z+XrjP*i)PxB(dgXo2fxHd}3mPs@yXmq?cn0IE&=~zKg5mSbmnp_pY#ISz=m@QpzOV zY1ww0*?|XT+)D^FXm58?XC)oVfuzrPCssSJtCav4nCu{S`SFE&W# z2OAu2xo*9XhzU);yDT|6JqsZ5o}oF!3n^n&pX@n3^t=t?Y(NOTQ{Mc>Ex5WXlB5V3 zzh+blL*(Q3;g580B-c-ycDs&{tobaTmq^F#`;#5WkQkOCdr{l%c1*@|$I$M;m=av# z5m&qT3KYn5P~G=nNhq3pY&|77@to*!FDrhZ_PCcErE{zW#;Tvmy}QRfXn2Zx++#!dHB~?6-ZG_*h)z=b5k<*L=()&b2-<4?r~xoHA(EQuMmy z7HrweSv$CdZQjlCg1KP>brmL%OF-*9Byh-;2F&9)ha$y_>qaz>u{3wvsSp4y-BWA`P>12VW(8h+Q92fE0|2fj#)!vXKLI}}(Z<-a(#U*Bis{ch{NM28` z5>#aH4kQBnPA6`bZ1aMHJa3C+OESjcXa8_#o_Sz+uKCPzxPu`6Z^8FFd`+_Jr^7q0%0gb~nYZ zLh^?fgFqW+;DZ~Yy-<9aRJ>ePVt%|4!HrGUb!=#g&!_G;W7;E4aVB)ukae1EC~_v} z+!bh0Gu+a&3hS>p4A+e1EABG(i(W9bl~}`{@a{d_TQGP6h!6# zcWQI;emBHiH4cPB(y6z(JqKV8?Z4Y)Z$WP`e$Wal7&{=*Rm~iPh->J7n&PfDVq|IZcY$n$LqeVs=sYg2Sd*zUG za%-?`YV}7m&1#BR%i0ZeKs3TA=cxjqU+IsOgboe>RZ(F(wmEz{Y7fnZ?~V4fAnNKT zjPyrxBUUa^bH!~xTn!)hrpooAoI<16bbi|>VqF0?f@+>{BT|JF zalKOM7*IY4N`e{V3Pci%dzY9YPE+3=tTR^x>NrKNb$#lm2aVlBv`cMdd`)FPnj89r zTK}T7(4&D5gwqpJ%c=E1| zcOtZzJ5fn2&zyaFZM-)j&y`E)fb%P?ZpM~#O%FFk1)=)e*TyX%YSv=|LUU|O5LYEA zIK7eBC7>Z)eRPDcvf9(k)ksOxB8iX2p)(AK&kSd81FJg+$&yhw5gCBJac!6PDDpFm zT7=WF=Xl@1O!SId!3IA*=cnk^igS~gxg()O#R!y1(4)f(#Arcc8P8<&n9IFrvkqXM z$Mz4;Gh5CoF{j889E`i3RAm@7kT#+^VgcvSM$|^sC5I)66P# zEvj>5M5x4s`4(eGGO-q_MMH!W5@K!=f%xehVGQB@oGz${&W=x~=)b=cE!vG$@cDje zL));M6I9y#s&Bk_$KK(e5j`d1P{`Y1YFP2=~g-v>5H)b%SK9PA%_Ett~A<4sdJM0 zKc`;0pKt@D#1iG5vl#!|x5RAXox!s#KR0R@p0UXzuEmbFz`9zZ(N*@m_mIw`=pF4tdp=!Ed1io8%fpV zBYPgv9tSV|nCRL+@tomlFwb3q?d^xpYqb#C>hwmhaQQ74D)l82k`2?BLzyeEwq2-_ z=Q1o6@Qe&@>@eCQn@nDVoAQ1g>$GT8qH4X?MN&GDfK3MRgOTQ5V~{$sDqTe-S!5kS zC8;Cq?CXNnu(G#%O%#;!2=lt~uT-q<%m;Yx2MNqPfbZNxpF=%<8x!$p@LB#%96?2D@st@|U@x%i%yDmc1or7rB;?A~}9u zG915#lgN*yC%KbnLwenYBuTn7xU-sQq9+Ej>NK_NMbqzm(UjE;;p{OMUD>LWc+qYv zf$P}h*cpmVGS)k$NcX?1k1h`^T=!Fmw^9PeiH&|2C! zf^eUX_;QT3v?SbGNgdh2@R0B2b|WZpLvnl50uYhii!4b`6ziJ#YDg5*Z`pK~x20V| zaieNwG*(Sq>n0or3HfVzV+*Io)8XxxxXLVVxLt#q8mKfHpEt=ZSyal>GRm7+FI1xZ z#lmZRa>sJ|u>Ep6$!6KBccBoAe=e8r$9+z5Lbb!m1~x|8bYHVI3hUz0FZaRkMZU*by~x(UEQ~GFXuPil}I66NqUqn0EfVpAuWmJEAduroqL^$psX| z7{Mi|^aJSBMBQxU-E+K?;qgP>i~2qRK*{bpdW_SlXkFF^Q=i_+{*dihe5IxW7-3)- z6=Z>{n=t2%9q+t5kCek9C?g7$qWO+lCMm9a;s~A#wUm>Y;H6-di1QH^aA0JLS zK*rx(hCvUJLTA|@)LRF}g?>#HiCI%=ndmFviyCCLZRPOD{MZse9`*>x=6L?d=J;`R zlB|L?8jww31mG_Z+2G|1JQMzqL^I1DiLHWe&3%O9n*8|&L0da!uA9hmHKCOjkh6mI zy%G+_`}ftR-wX%|1&(SK_FS!|tV|2(8UBstdQgpC$yT|UaW{Z zVdd20$4r0iG1lRBxA(1WvJROTCpN_Uyt*MS^F^5l2)rz^DmSLcW>6H4J~N>;WIps7 ze-Y67`qq3a+zW!p;nPqyXgJB?5l^=Ylai^7#HJqvBZ=L; zTg~h6s@DeU%xjpij6$pB&rvNQE|qqvDa}&a75GB@O~v{;B5DQ}FX>J?k#Rix(mFGj z?`(Dtq_c~X3%$Q`YOXJmY0G#8OcohS{c`z~3T9T@i-8WaECYejJhNtmviqKA({U^( zT}8}^GtKD~>nq4iH6;m=dz6O1Wzr@l@#x=XlZ@!wA;4cHYayEcsY|yq8NZkNVRi9C z)?>fo`)bZUz9_&f4y!2CK2M z^cGYo<^04zgYTx>VO$m>X=C+P+8?$NI(#|^0@F{2ay?gUrX?9V&z0Yed};Pk``Zv1 zxLOG=E@S=vZzx%M+ubrd^~7mx{ml^0p^PTHl9g^rBTTo4Xgt_H5#33beC#%oxWm>5 z!ruq*jQ3AR@%GGcJc!@eCo7vMVQlYu&D^tIH$SnK&fD;4$Zrp8Y_f@$A<$K811He< z4)CIsvH_IAWuG8}ju?A)>S;%MAoW(7_UtntE>q_}$W*;QrtL+^;m}q%c~=Fxf$4`% z@t>H5j$Mmut>u`VX1&whK{L;jRv3OTJY@&Ik0hN`FZ#>kU+yAW9~4GkN#P$>j5m+(+2GAj7x}vyMS4 z*%BUF%_lpzn75^A>koJgGveaU!?H*Be{(?oL@H4b+aFn#pC}zenWw?ljmEU(o)ppW zC~N19cBhhq5s}`U2E~}}UV8@f#iJ0+B(OXbnPG^zz{*5zkeDwL$*tg77SGbdk=PI@ zmTjjy9A(xb|E|}P)X0Wn7YMN*0WMsSkYhr5ja$?H$L5058;LDA1CyhUtVGEB-(#|3 zX=1XnO=vLBLk$yPNgMM4V?*=-LT)zU#~jaZpfi75_H$RmnWf~kj*R5*Z&Fu+kcJ6x ziNjC5?Wj46y7iO7wyrFQy>4;n0*ga=His(Vkd7V*LXx7D)Xaf0{J$iOQb(^w!6wmY zF#E>5Mxjs+Ta!I#@`>D}Cf7Py`)5X)(&Ya?id@s1sqS8Tr$IkDuVwG4uqX@j`FRHB zgZ~zvodNbKdymX0d=S5|4^8hpz?^Y9ZJx1M%b)8b52T~4(ZM*L%I4@lS;fhhlav^|(#x%NL@d$U{V+mu`sa{;Ba{BQZ%9Zk#$|z&y8%WgDHWt>HZO*vO^{ zhiqg~#AkyxvNE{Hn6cMh{E>PoqNLvZ9z@AsHwvf^Egc4Q;tSu0)<@ZC^@(rqQn8g zjeOE%qqUkOaYdGYW60F;XkUy>dZP-cO>GKEDVKx8w4z{tL8($AFgSO}l^*ohzb z=G-B%zIE>KAGVb=l=6`l_m(s`l{WL;?o2W5eUs=5$5vrEw~#Ww-;rS6*~7~bt3UgN zJ(O06sp6b+Y_r_vNSfuZUrm};3YH)&0iMK)VtNT1Au-FBE9FlEZB0WgX-|fZffc6o z&GzK)n9_XNmo%{_(496Q)+F(eosAk)2<&9?Uv4aOR|T~CE=4r zso?iAsFW|t`R`|0n=+3Qq{wpkRa_e>%PF!n9_A`5)a$s)A8$O&wfq5oGfLHRT~4`? zL8gFpoc;WkW%iQ~ur%)5!vcO2>bIPaRIqNof%`p_lN2Y0Rzz7sX`&pXR6oR0IqT}X zxh|*9r(9*teflpzh_Z|#e_Kq>Xz%9ty1fp~PsyUlnY-Y_e9N73ocrmIgxHAyHL^M2 zIUdRyeAd3?A-scJgOmn<9E0Cse#~ip=SaSW5_V5wj8VkxZ?82S>glDZgjo%Vj`0?k%yR zm{->%J?SWy1R-d2LRQ_yFFeY;&Y>9{;wwe~028#v`A=OA z^XNi{DbI%pU?@D~$};;%JCHltS!~W@M*>56OmE>xhrT*0&v(1}hKT94&a0m1B@RM9 zyd$4WNliRt;vkXHQ6gKtt=U>MIZ6<53mp2Vtk&27rNg7JRGd@I!*y|s2ys&OLP;<7 z7+H?$u^If?7S<1NP)TQn|0kAPFCFe)$T!rm{oO3@$h{L=f0Vpno0iw%Y}%sF3buJIagzTfNllTXad_w(83GyMF# z&Y$aC=Q`(H=kI;)`|)2fd6&G3h~uE@&np@q?)dSjhs&-s-RypkJ*)f%bUX;5?xoGD zBC6Wf@DN@;eI_Htx5u-uAx_LSEo5*{aEB zSF8MfZ=F|3X8t-~K%IN{w5=Iun$CxH@G`*3f0($}OZ`u8TaWOXvUgt}_#Jsoyow^q ztKxn62!*_{^wAr>YK)f=v8t+V92H*}Q9;UwWN#2tz@-e&7 zH1`j={GD$~S82Xy7`^JGoIQmev~|=QzCqMM6*oMHrc}Sk2t8P~zj>H@eZ)f@^3s)d z**HhDwaPL#gscKKA@(44u^F4lrsm}8YAkDP=~-3uEXCPs1FFjgpf3;p9(uF%%=akP zKc*kvnmW3&LxxLP(^n`J6aPLAn`hx#i|PY2e<| zN$DHXFQiX+D;}k#K*>#mJ7ns!yU|VtcNv(2JI1F6V_Fiv2ASH(>^qVf)i1{%#iDGg z*w&P`pL}%1*?WGKj3pzPU%h!ykn~gvN@1h}x~2C>W`QND^inq&N%%+>Z)J>FffK@v z%>Er|(+7J`o5o4WQ@Mf;--B{ziPFnKPT1E`h~6mXR?ckXEj15>WCD>nm;=AP`QBP% zzvbeXqiWFLjzXTc%VaD~&_xq?L|igt_uE&sIz2Ro$FxqafQeF6 zSr^rnkR(cdw=I!4QAkRCoE3$XaJ&C>N}A^^Kj|wO%kWT26IE~)dpEUsFZ`nX|JeBq z5VA!1x7=v&tvava%xo)78hkS~5p&spt+yg+a0u&1XC;|dqEI|S@Sm^2T|-#Sh`}9S zA?&^q?rt#6XhPnaLKGfPAfB+Q}P)wf3m8T(d7Kbi7azM=?YRU(#NGO z$Cmg`gxV1U4 zCx(`v$q+;@QjOR}gzqv@PZP6g2HPCXrDCapilo?%K;M+MR~f6gBw5u~%%gcxtYQWq zT4ms23U>C)pqpW+FQ)stod}f-YIy8^X+*5|QnUA@!Czugu!1Sa!K{Y?t~D4_#nyUa z78@NhP;Tc?-eL6b?3p1y{4%vwyIyORelN41X1=>i8O?iSlw))p#REML&#I-?WH}>C zn?J2G{=EIyzG>Wf6Vv#YZ|WFa-1m&a2Kw`ZL99pGWN8#u_VSUt-0k|>tBy={b=5Hu zE0L9ktU7$Fjh}sLwJ}5Dsiw({GV;9CIeMLUCY$X2)PMgrp0qosFQVNz6_*7>EL0W{ z#Z^2$kX3`2qPO1e#H>+MK3%t79?R!voZ+RGlec`IQHPbDAYdRNqpqt5#~HC1irImQt)EcJFo-w1vW)u7Q<`iPvg1*$>hexGVc`k zI;f*eOS#%ny6^UNluOXh>?qi$EQzF}NGA~m1MO4)8Xbkv|91Zm>afFRJyzAWPZVaD zDUEU8bhYC&X0;v}Ik+Q}8i=D&MN^qn-~HCr^^nwam$&p$9n1Wse^!K1Q>D(3j?nwW zAY@9J-1gqbSDd2AKGwrB?1W&Ezk$lnKRp8#3;mTG)%L^jv;?qFe)Ih+F>k%k2N(VC z_J@5yXJPGm`v+HI?(n-G#yuN%;9i{EiF@I0e)Az6la;C_^It&kymZAm{jdD^8%pru zit}1!j+`MWjor9=E8DNfIfjw`aI*VK%quX8X&&PF{{aTa^R$)hCuCr>eRSnK zqc@Ans?#SpaIm|oPCo$8=^&nCmr=NtEgbex!-CFE8tJ{`p>lW;%8uis9+qo#5zZ*x zXXNxlma!oSzLO=UC^CePhdcS%y1?N=;{RURaSng)h0&8Ntk^A`_Y3pNYQYXf!3Wr0 zQ01pXnt7(+m;XhS75RM9=xr{~qn^v9zk4V?0`?u+4kld!-&dihRR;2yo5RDtl!pzvhUXB{uQ z{La{6a&A!1n+$U9AU}&NKbtFWGBiQsIg^+Px@-4LJ$^aFmj0}*?BU~s_T;vBLUj7G zd*aS)(c#nhU|;HWicHW9Z@)&`1tkNt$IMybb1M#5|&P? z3^0Whohdr^(LK&Tg)1GptSshyt*+lz)_i`1V+)Lxi}zeUKT)~6ex!`-$Npt-Uo-RJ z*HEZ@`L&g7fcHjl?LxYJLJOYo(E}w{{Sp=k4^Di{&l4OLaQ9rJHa$U#xAacy_Lnq} zQIjzEGY%+FgnvD#0+LaUpEf{^)yjwh@j&7XGCKe&gE9>$P)eALDhuU`lgzxlURIWN zF*WiK5$%sFV@)wHiT+seZm)AOV!!|P| zRNY~|5Tb6;4U5d9A!?4$u@1FAq+yZWNHE{;qi!`_eN?oBC-qS?gl_7irV72-M@r3h7JnawsxNlJMN1Q%RIJ`2w3aWm-z_@!Sdk-uS#UHyD4nSMUuo^OBrTQP(f6A>k_N z3+_=h^g#lHvE~|K!SVk@_dw&?3RoZ9q9&?1gT;2|YrMNh#Ycfy-~x$Fybn0tn)M}> z6cSTZtBev*0II+gzrU!~+&x4saio)A<}Pc*t!j(b4Vh;1Z7MG2!t=@q+pUZyXezYY z@4xW8rH84hN@wn}W_(3O+9gHa9f~<9(~OH(Dp&@(4+6ZOP`6(|I*}(%Fj_*RK{pu-lPDnJ;;w_1gKUrrh64%j`Y#`Cfvy4hARP<^ zcHlXV@qjfnwM>SA&lxFhy;|)Ls<1xeB5LU+pa(PZfNBQfZm6BGOVDDTtr@det#H(D@GyB#%DOJgyEaT`Pr*Au7q|pG&sqD5l|yS!ruphhwJAJ;2SNdc29LRLmD&_J;Xmv~JB7Dn-(us@ z9y79p_Un4iOes+p2V_QQWB5(l5E?*xgn9oH>e0AdDo`?uM{WXW00(O9Mly7$$2$Im z8m9&vK)5ib`y+*k$T2^q@dpTZDUqVVG$OKvX|}cDXX=z55&aTtofvJ*AEb@6TeML< z096PxVztp7t&L*BF5OJaM4OvS=^Cz=tT8`VtTwpjyCt5Xhfe0WYxwS^y`Z4Ob06QK2FYsR0|3f;RE&;CW7v3;^;$$i{9`o7v= zcX$0n8~Lkz2zEaWVt9}XhJaIKmH}20vAdg|<@}f##@nmaZ=-dt$UFMaNIp*MmcS%LhZZg1wPTn(1MLmRb`2%_;%sL*^+!xtWufDdb2 z4J$OSx`k(bxzF$NQwi(r#S<*6`e~Y10s;!0AoH|d3S1yw!iGNO<4yL{p(s*<@O=DX zex)kOxBz#2kOHlwmpn?Jw&;=6p3F4V?k3KAPM6!=w_ED?( zUOhlXwj!|}EiORYL1(7M&7T- z*#=B|OB;gZcPKR23F_Z5*FK}s;|HtU#v4%xnSf7M#|8$F&4|2FgFR=r=B&NjDf(-$4G`D@%}Zm7|l zb=@{|B`oxHYg4@* zV;eaE&wP*$s=zdm3Cck>s01@X8i;z``tWypqJ2oQKR~3d2Z00$tn)?Cv}$W!BiT~ zWWPV%PjjKhDC_WRH2n;zMX6P37pb8p7KqXu6+oIqYPbYQjY|tiTV?>MU8&_#um((_ z=0|}vPzZ{ft^LhqS+j3T0d2o_<|qz9nV%--h4 zokpBAZJ^n|(8ygN|2O{SOT`TtY}H0>G(S45Um6ln;+S6v4^%P{WhA4*X6xjedbJuE zU~Kg>2DB9>Nf6M;t4*`H?k&1h{Wf#bQN2!A<(X%W>TyCxysfu7YDmLA==j@ugL1cL zu_2s;+F%061Vx|;w16&PpNj>9c#sOFfcc;hl!7Wy2bw?&=mPd^(tvo73Z{Vhpa`r7 z?Vvl`cApWJ!|4-90O?>R$Ok2$5_mx9JWi>=0o*6R1z_Me=2^pz>)m#}v)Vj)Qg4Vn zgq7GwQNc!8M|c-E&!<}}{>aGeI3OmJXKilLPMf3XEwcH8x#K-ORug#UJw3$kkQ#2O zv7GJH$`B7857lIFZ!L_+KgQ^9@*s(a=Mk&UiCj;$xvxVH(9q)@Ixa+bW6Pc#IM9qZ ztBYjdT6b1YvWra9b5_T0I;W$q`pkq+d*|boG%L>OF+p5MKFwwC{FIDDypm{Qrye78 zWv8Cy9f*U=-?iENpp%Ja=xlSzpY&GU*=EL^*F*I8zG z-#WtlQkQ*{-E? z7ca>X2LTE9-j=&e9K_@@=)L`r7`kt-3HzbRDpEY+u!H=BAZA-s;TQ*-O_(aC!tVMIOTyqxWQ79xVnU^&;=lVj@czzuu zKos;Bjp8g?kozN&=l$^dGMv`8zG!;{2Sv8?G+n2IMZvSu`gxXUWp} z3-Vpd^0TuFa&BC_Vcr^Tn`dnwWV1s0_#Qag%tyXv8*cq#u3ADwqaxK?$e?9&iAh0GB}63)CEl2WcP!%zS~T%K13TK{coYO`sF> zfY=vF0FuEJkPV7JDX0JqpamEfydW9O1Vvyy@PH$r6WHtF0m&d2lz?hC|J8v*pbJF( zmJ)#pU_K}Y)u0KqfG!ZVm$nCqU;@Yl1)u~}01r3@IzbPJ_#ONp4NL|7RG z>5caOCzTQS%bji=o?u&I9~jG(hC(^B;`~a^uH+0WYKC39|7df~L$-*4@_EPJ9Jvqs zIa-B7u0{0bI55-8ahr1r+Xcxtc9uzw!#2g)>}KX9o82kTjN~Lav)0O+WJ^&o9y(Gs z2fsWUFkCsyMBPrG0Tti? zKx3l|8ajdz0z`pqa6sI5P-7tf4s&^yZBoBhmP`WvtS9H#`V2FV%(3mYD%RLqUHZf& zbNO~#oI|YQ$luH@+igRf?YP_jrdj=&%@Q~B5A>_)=0)QAW@1H|)5+LW+im^L_#L(| z$9%%(Pd8I`5TB1bpLn}3zDVK=2rHOwt|Q*zwZiGn+5_nNWh2@qfkXf8(XX#5A6g9 z7!hc2aZ{0ul~z=0QE6+@dQznol`1M)s@BeheG(J2RB1~+XujXO_a2DWp6~lV&!6X6 z?Ah!3uJ^v)wbst2zou>bLt3-nad_X>!ovLJbDWwax5mE)P1AW;c`lw?uixUh_|Q|I zX6TN6zUn?SDo6Cfn8m9JsWx_mCC0Es&eNB$KY4gi_VRXh9hd8YhK{&buN1H zCVFU^Cxxd=(|rDMk(j2_UadwxzR_aH#q7eX|MYu&TQJ4Fb13398u=m8i}RZaPH|2XLL)vXE!)y ztgOK9?qemq4Zm)8|9%tmSrYrihFkJZ%Xsw>b&IFtmcUk{4?|1=LxB^cK5`wH6W4A`dSnJdR+YG=>ILEIi|0P4-^}xEg7HBja^p&bbVu5`R zwM)OJ|1|0&b2_2sHg&8dOC9T-65iE9C*aNrPQ20?gZJZimdtZ*W8AG>8FSG|3IOQ! zcgF?ieYJ%NEf`q`18sDViX^sQKRBv;*T>Dyy&Kx3zR`UsIRr@2G`+mX=SxNM;>P z$P8T;z;W-shn_97^IhcgZqC?i_X4o7jR)1IeP(CeDKH5#{gId(I39jR%}d+UZ#-j{ zkt#?*(hO4NEy~e%k!KD+t4TGtsO$T_KIFoyQ>!I=8EH9b1!*N|6{$uo^cJM&XwAle zuCC4%ffmpjO5~{Z-tetg{CRF%ivU1#BvwDDw=qc&4H6gkt%|z`-V^Twfc1lN4H1U> z9w~}C>LW2{1Hj%oJ&r(jqyTgeCLnDb)Ln5qbvIYW-M3yEUwmyt?{;;SqZK-icXb_-0e1e# zA6;Bf75~FC7Ero>ZCrqMKXi{p?Z5+V^=d%IXAbp@O3S?Ml4l;W*r_ipG+xU!F0%(o z)%qDT>_M1?FF;w)E=!?olKOe(y<=xr(Yh`a_j_9m-9Hmyf%B>TNR8I%4m3vfy6GnK z>N@QoqQW?fB0-l_PtxW7(Z*NwzQC2px7m>5-o{*}KEBSv{ryXaMtg$i9>6fjp4ALs@%ncd-oQ@7sa+8Z z@}9+emi=DAdrfqQQ4`o1roxg~85tFWb{G|7tOh0i-bRnsh)%~k(&Gs*V2*#ck%Q<< zhpB#~EP%ANZi=U%{fcRy=fBU$3n;UEFz;zv2o2T{KaC{z2tmsrlZZqTwGEL(2K{w@ zPe?E^lo&we75?qU3Zz6jN1gfVd9SzMh43N@d7<_3ykKLz59KTU&BjXgn||5)2K9%2 z!!w?=RaG$jxxkmz}Ti(x9hdS- zJ5`+fqNIz9%|s3#J2KI=Z?Zpz{uw`eMN4zUQ8@RE_R$hzqV~?}m$c{`@I*gKx6y@B)|iOfa`ZcRco# zx-D;sW9w7u^}KS&qR*9Q;D&I4c11!E;fG%xbsz&$>ka4v5Hmv49tZ}j;(l-{ND{oJ zF`8dnl<47)j3K{B@#MDA&k3$K zyshhvtorpv-{@}*OjU^U)bz1QQm6fz!9atW0)@3 ztOPJ-UygnRcIl#Rme#oso|50i{wkSA$8!f%d|;`5txC@?(63Zu@-rRFXQ)f_hx#f_ zRsaYsnn(_?Yz2PMLuy0*Vm(L2@`ve_s#ig-K2?qJ_jfM=Rm0R&-p8qH3W{{6T2qjz z*Qo6U6VqxjuFlAssE474eW^Yym{9JvSprl?q9 zkv>bgi^e&=^)ppoRI2wn%Z1+t)uB@>XV`^j?ORC4+i@jC%;e+4EE)}`h_(o z(H%0d9*98PNUS&gzx#!HYjC0OCw7%p`yPV)(FD(Sy+PCR_NcTW<@&Q~){xwRPuZ1H zfGOFR^dm}cr&=>4SARr3G~^bC{xjtnIxp>bEsPut#gXvGAN-lRVdxUarYF_!hA!5p zsX@bX^@(cIuytwEpOjhvMn}OX)$7Bqzs@risn+VTiji?*HB4)e^snl%Fm*^5O^`5g zbvxd)>4}?Yx|^qI)6-TVVtMsBjd4*WXKdYgTK#l*fn)et_4@FB10!^>cWjHXyCK(T z_U9V+tt*c1%4k6fBC!KXA2IU!(J~K&uV?UEUNLS0X~$2KP**1|Lby%nX$5){zY9`^ z5P)8f1ziQ;jS@#3P6b71rv#+oZrkCHzVK5utz`B^B`Er3GHtNliTEci zObwoAGd6o4=>X|jQZ;#6Key&mzbz?BKaPCubh@Ih(1xfW?X(~glxjGr z!bJk{HflQqJJ8)%n)>h~^mjvji_w!j@w71(8&?2}x_(GhX3;aS!Ca6?&!d4)pR*oQ z9Epk7EqQNWp>=xfchNs@@b2*IPJl>#WGvlhO^8p%LYla)@y`<02x zq=X&CQLXV>mQPsm*XpmMGKW8F3vQW|&-=wLS9Lalqzk0W{ z(6Mid`npp=DJFoi$`dp`} z(WTjGhXFkg&0In%TcO?>J=Rh7rRotVcMQEkO$#h>9II153KaUT05~^pkZ_~;i2@{I zFrsU|`Y@31n6W~A8JO&7+^;5&d0k(u`iu?h4Dcbc6nc8Zu$Jw+{ggq@M z(ot{u4Fc#}3?j@gzzLo11i0}wU@m_o_Dg`1NoiU*3iO(9BtVq-uQr?&NJsHnR*rYG zvd3)}Uj@^U4gkGSn=VbHv?aTCgx0Yf0!B!pw~3JGpHGP-6oxRn+FITwvFiJ9ZoHXx z%>XcJBm;*+ad$AH=P}t-b!&O=eqWO7pqCXkhyqdJHnpXEsAJ(2^^5YM`Nu|B43|X8 z3C3N%*Qt4LMGxGnJ})l~Cx#Agc_HULgxDp$a7{Bj=e42X8}n0Tbj z57P;*>d=!xrC4UkYR(|{Gua@5c*|C@>RyTpA49C%2=>KYn2N8qs82FTN zY4A7Ggvxs;@jkzkbMOPZNmN1>d1F`%zBe~6&TtA7a3c6bOk#QjZVZ`%?>QGh$&-)r z_e>81U|l4J8SBtDR>cQ5ge&7I4J07deJmsVGzy@kL%oe+q*Yd&*s(*pXHg<07#YJl zsay|kFr~HN$CS5*WCA|10wO7o;~&U#6C`=m{$2Ng)`{6M?PIe4)F8&1G5Ut>LGY#z zNkfs1`)Q~z2D;EpSS^%D;fcAz!dDAQ(_h-F<%-uVsFXI93?OCVlnBb7+Y8Eh4i+xN znjD|+(pHnk+n7t!h$|ryUa+=vWs~mh;l(^Z+NGXc*-x#i$Qcnu4n&@`K!cIeYI|UG znBtGb8oZm^M~I6ajKto3OdYE5WxqjnF?(95!Kg!Y1f~zwM-{n_52mUflZK|fXnIZ2 z1a_uls#4{XO7$1iO_Or<{c8QB(df6IPa3By_0gn)!ViFP8L6IR!p&2=-le%nr}#bo zHZ@{$xqBs&=vHqIDN>sz4|Y7dPdz<(nxpA9_4mm)_q&MElFTCB!LHk+EA_o8lYM@Q zykNzPY<3@I@VC|LQ)c_Vq}MSr@7Aa}_hR7HLYs|46V=#Y>FiS?{seBEuy0RLp=p~5 zGeu&xNNFtu|5)rVO`)aP>_-!|&f$nhZ(E%V4xoDIZudm>crZWzeY1K5X}O>LY`AJ6D- zn(CQDGfHI)0EMQH3x~davzk1!aKx)O3t~fwjjZE<+1CqZlD-cOv+^aBAn*6yqBhR- zm3!%hXw-SPa2F6pNa8i=i1}WAPviG-p27f8p5jfl*Q*a_F48Yo7hO6f{{wS{0iA_d z;4rDO&rlg|x$n}&@aV^v7I=gtHMhf&x2t}aO?K@4LM^&1KD6I0cnht$h7d35o=VMa z)Rfix^P~f}t0k3V^_QO6TKT^2xaVed+w6IcJ8o7l@VM?~l~%RLQFXJrfyYH;@+i1j z^_#QE(TkcqKD$Z%j>n&FQu%WiIbOa=eQ$1gxQ`hqyRcZzE7G)Mj9JPv%JVeo3Vv(f zacbA|^z!@;Pe0Ee@eJ^Mk!O%+oM(vVeLU-U){|EM+No{2*{L;?c9Zsz4w70)M{jm! zYA5({l60CR6Fzsdnl^8QW6me)wt0p62WsoQ>G~_`op}>kqNZOyPQOLXy!=|nhP~=1 zm#=kvYp)s+%6DYkq-KW-^OyXOaKnYU2+sBbgLJ$4J8EO7)G>9hIusg_7PM>160Lo? z`ZQGNIcZmX{yQpv{)AE=I!_iT=)?zv!B-+0QxKPB$mT#=i`clKRVm_e`4wvI{1J|{ z|4~oQACZxy?`b;peisMxyQ*XUj~quIQCqIqvFHG*PMo9^M5{!@C4x1ZF?Fr3&F$68 zwN9*i3{^Q!4@8P0eN{~M1u~^RW9@td_6=En@;3P$w2Z{oN7P*lO2a=CEz0zh>{G+w z0!)PGVM(APXC?7wQakUJBaW$W50Z;nFuH-(v4N) z(hLb4idQp3ta$K2qokFHW~g`A@YX$O`0F1uZUwefFKWILokp}V#s8o&nBPtEs}U>OSdd$v)|8$(8^|idX%ldcpu{nrx;;QKzk&jg;VKW1_llVP-FJ4eC8DL><$4 z>$356pBlBWAX{4Y2y|;r%g>~hJB4Aq>OU5a4lnv)Rs7!4yW?&`(?XC2h`+*CLC^MT z$v!-wCHokzMbX^5<8!aE{K6EXoy8d36Aits@RUH+u-Q0gw{tT=y>@+kuCDn`pwN2^ zTG!U_N{f*SBClI!^=)%}2{keB{u6 zyt?Vik;6mOeh(cxsO0W=9yk%5nw}p?Ot9y6q-RTZd;gZ~YW15dGxaj{&XooK0{;)p zK9^H-lNwkv+8kGd1J6^Dajz4&d!)eeR0eE063qbzf)l-4n-uc;n0VRW zqb2)9zn1Ji>Q6NnU$n!t2h?ThEC%;=Qw@X?)zoUF)<3?yfRPd#BV}sVRsRb0AQS2{ z?w0Igwe_kgW4=O_=moy(`m1H2y0dK~t)5r<;$h|-^8S}OJR$QQfC}>X-M9qVEi4Xl z**(ZL1VfLjI~GqI(tYIgNq5In8C_%kBkhq7xLUGLt9KSp3IDsA8Fo!}6g-u#7GqOZ zi!mORQ^D^>e%~&UXLLXb=4nMyx-ppidh*4ug)7?Uu}1ZhS4-XvU#ol8*eV?3_x6Qb;2t%^5~ zYr%_u&{*+Op0Rtu5HliFiDD98BYog{hr_$ZAv)%M>TeV0EPY*D9c`Tcx7w<+$Z+~w z+w{CO>}of}=d2@Ar=F@EIjB2fl1RPuQ=4(3xyBClMeVrZ-D^22*2lZ6x8X@PqxMF1 z)it?#in`;Pg77wk!~vO-LQ>7UXjBmpVU%0#c4B2rN|XyFGS5@uS-r&=EU`Yjk7tP3 z>?O}j-fLfUb$mr*Q%Cw1<~wTj>qy+7vX>NvN6~$7oGiT-Bu4Oi!KSKsF{`9Lqu9uW zvx5At$GV749Z$&QpgnmErLSz<4s*>=Hh2dbDlcXZ8Qs~2@pI~g^d00O4Nl}gQ>HW+ z`pWbKT>(pfh0Qsea|mu`zhJW=xO*865yDMJ4GIwTu(kz2Rs5b#t8A8(2_qC`5O!P} zPcnt8ZbSS`0A^@?(BxicV0YV!L_Pp6iOnJCCnD-Bi^PhKuq_@??+x*VXJE|4j~2Kl zVfZGuRv8@;RvjW)R9~5yZbwP?* zB^@E1Ahnauk-T>}wZWvaJDg#yk{>ms<)nI2GZj|Llk_a<7%55;uUEWX@pSj{o{SqN z-Gr%snj6;tfEbmq@aFT9BB+vNuSbDPOM>rqUdsnc<~za97)OiL%hh;aU@u*%TE^ z2i1u>X0(i%;E(v;?27}0sc@Dw#T^w*@u1BWJz-%n+gfin+jG%Nq6i~!71H6VW7ExH z`DaBP(gO*$PMegx9HHj2iLm%u9yFpxue8Im*t5)X&GE+!@9EklEA>h{T5>aW*d+~W{_mg^E# zy0qUwf+)TPHYNlMj=ZLLjja(g)zoigs_3$m>sEVmja5DbbVRQ4DD%V9YiD_)=e>nimmqare1IA^)?3D9{b8qnc^-}LQs5PA>W&Fc*GuwofgjscwjiX!0B2W zlbv0dH4`i0l;4B2P&gC0^a*7jEk!kJ_qCs=DAW{6)-&h|@av^PY9NxX2R5M&7bI4e z=Vn9k^p)kkv(p9dS|oOxjRJr=j{=$gR)Bi?8-WUcBUC0(!UW$0lo0>l0aa%MRR>U~ zV80J8y1)!y2Wmb*Z4Q4URR10*VUlkGN|@r`0aa}SRSi%t1C%h$P@8GOqivKG+9;cz zZyAyl?^Kg>Qh6@>{|Mxqe*>iO(AR(rpQmS~4P_-z?g2`X)bwkbOsgg|l*R5e8xUEi zigFnNV~G*!f*&-$b%sxVbLKD8%?w3eH91xRFNusc(XO}Mw^++mt*6y-iQ0Z+!Bs1$ zE>(ry?z9ng2TdMb0!}1cE1}!wNa7aC&f-z#)IVt4|J`BHp0M70Tcof5nmovUQJVVA z(jry7ykh!H8T>YStGhIwO6oyNN8a7>(|@sK^Z!9&lv+MK{B>a{8@t^UhO)8ivx)n3 z^!fhXX5TXUF}v^oSEQAV+kPHtW#c%~@h?aVhU3!lA-iL-#6k(7h)^RB3OGPR+4$`y zI?KkdH}vLvK;QcKoUxz{e@%Qfr*>6r3x1lInOe+@9%zW0{u*9@*sof@Zdi6L(^wYB z#ILK3efdR~@6mZ-Fc_Q>cS!<+IjkH!ej2f2_^!>*qX9~6S{*h`>>WBMArAPPZ=hy) zZsjRX=zN}8QodN853;hD8K3@1RoqWrfZqaaN^~A8x_NO4H8m3%9UsPs23Sc*P$MV0 z*~n|a<)uM!WV12T3}~Iow|F z_gHNV(zFtub4bZ8^be?~mam)<{u7bY)MHg~jTmAwjJB8%n(Q4pLy=ez|2W5V=(d~Y z3JW48C{cnt;)WUl!e%o(PNUN2H0F$O8f6kjV;&9;0jM8>aY%0YWa}mP6PsZp8nXBv zxvi=wE@TyHE~%H@G%GA9!m)2SZfW}F_6eV;C3lQXTfwVD8->dLkJX+#e4ZIn13Gnl ztX{lhZ1@rMo#-S9xtuF*F}G=@Se8>ap0d=#MJ(H*VFDO{NIx>S>=%yBRiiESqE)=1SX@~+q#9zV$#<&mp8`KIF2Fe zPOus3NHyeau})Ynfd+U)csu%Fks(qon3PGp{cYJdAh-%Pqr+N^U~qH$;g8kOJ4*-c zZ3`X!@1!4VgtJ$}juQ!XqlAFOHJ95ymgQA=^TP7x0~(>)#*+-%5cNMVJ_SMw1pYk)`aDdu$Kn;nT? zk?hRH1Y{ylFqp98JXQs%erquw^rRUTBhm~PeB|9WxgsP&c6U26I|R6TF&A7$_v}7-67F-ktuVRul*|S@C0`!nQWCFsc5= zC}-ZwzfN68Z6l5{)J=!H?Sm~;`Qb_T$ExtILbk+a-ZeU_i2{jn$h6w*HJmEBD@Siq z58pNHq9#Zx0u8gXc(BM?DP*S4oNi5pw8b_ne4<9()qjkH;ykU}+N5(7ZAW(|I$C7M z0qOBxyVVEMDlCDwWGewlNbmATVyy(_#0ow}jOUx!VI}1e+9ugy9u%r0ZxeY7Yzj+E zEx0(}P;PfrHX0W1u8Q}Wv_4+kJS#2-CcVwGi1~mqSt^QozSic|L#7-&XmrQ0-e4Im z!LS`Lik~dB0cZeWBte{*>_7;!u5E9>)3%i2Sbv@6glFe;ROK5z7+7#7T15D*1fgV~ z#N@mGmIzlg6u$?6QZWjFC}mNJv9jEtt`>UmBLPTMa*cX;b^lR|>>(Yjnq_J-tujgn z*a}&e^~H`BqejAYDz4hoDzb8wmC`QJWO$|M*l5 z{XyXsf=M$(8i8z7>0x*K1Tp^q8#biduWO3hPt^lI$RC+{r_@Pd9@O$R@kV4>6@UW}HtxqZ{$RY$md@%K5ZA<)W+K~YPELADTipTfJI+8EF0 z-Gzjh$D{f*#(lhJr!~gqc*S7q^y6I|jpUx8L=y#;ldIGZ8YX94$;e3`C-pxBO!a!h zrH*lJs^6N~6G|z~!$r%&qmu20WVnc7HZ!_Rsh#K9>(q;DM})n7b#28a?JK*V^|Is12IOk3x6$D3 zjcMN6R)d3FgV(*9DAfzH0BnvVW;0$xU9Nd&M(%BhW8vilPXN|^*68Z2Y2^w=Y=<$J zcB$HCv#pnYdIexrZSzN{k#RT4IAR9g^qW|Xq}sg zRRLCv?`r9XYX^DsRq>l0>f**B4lZ3RY3wLULHdr72iB)Qr0 zJWp|Sz4qxh0dSFesIfr5QT@8H|IqoTyE^K|YMoiI1WV#r3T)wB{!n`r`DbV=eb#JK zpEs5|{xVjLSU=X$UZR$)FL(U0L_M&+F#A{uM<7rF5;&H_|3cji_2&AE^+RgV-I*$H zL#n<@O}#s_-#L2oZg6UHCa;)heG8CoP*-dy)$dnpHe9T4RlnL$)USySMXN}M$+Lg2 z?oyvpZ6!Sx=vPQ@X$Ky+da9wPl^fLccVDV6RFB>Q4(ET;n( zC%v^`vq9_^-?xUw*143sAlND!i_5{{4Gdaq4!9`cs*C8FH_E^bvOeyB0!^bG3;v>B zZ}JUa%@hR92YBY(jXEK%A_>`&*W6q%dW}lIr+@Z1x-^d`aY{#yW+7S~Icm~9{pFm{ zqI)KA4Po;=muIy5Ek{x4!6L%=MXmbep8WC>LhV@rS+FliAj;gFw0;xc@yw`apUG>T zPH_9V)D#zC@=uCwH7j=#4NLidjYUz)ZP420y2)*+Ec!G=lB zRsz!A9Ynq(F}Y_XD}k2emOsW++Rec`G5IopPR9#>log)K?vDzG%)3YHhHyvK!t69+ z`RCEh^(%9|on;SFV-Mo99a9*}$H58~U(ALXg&6G0n3}h_-_Uy)$GmQI>jqQhNkCPu z8@=2OfhA39%jQzY%O&as9<3wPC!2kXKTV*n=uZUV6#RJ#-uxe2E78Z}LB?M=7cZF8 z>YL4pi7*(n5n+%zT7Yue%0ah-wBJvA>5p~j^;-%TKfviyEy$@mT4%K_DnaTWqpo#4|H_06tJBwuJJp9<`i1N46I#i8Ipdq0 zT972HwvuO*$B3dD2pQ}{QVF}WW~M_0)%+Ihf6Cjo1<0CU-ZrPfCth6f)fWMN)z+qrZQjJnkn z05MJg?a`TVMY`n8Pq@PjcrbupO+gmW@3Oan@Hl)r(sCYhZ3l+_%9vO(O{+Ddt1!NA zu7yTZQ?W)h2fc4;Q8de|%mL)SXm9$i7$ffsXGRKIj_`!6CaX@z( z6+@sR2K{H-<*+({GKye*35vkM3PsM-?@v!N7~}CQq6BjDm(8#ahZhNyia9h|K;`wn zw>mCvofF@ubI^n5em%o*lt&U#mb?;pl*1nqr(3g4ti5?J>hU8kyj?n#!S=-nGZ1A> z(;^QK>!&>-fJz^OWny5jkPyQ7081-}YIk%HJ9cvQb1%^SK_H@oz0yHzBvFUK6ejHn z)x>b7`EQEK3Z~|yMY=a2w1cI^em$Ll2;nd4G|M8NL;NpNR)R-rVJX89%5VPAYWJLw zJScajjvJ2UNX1wx&k5w>IxI*WWaHg55p!E}z_vwxmh63R99sJXjy!#f%2&+LF~N0q(GbaVL9f{X3l6y&s7WRr-8 zP6XsE{QrB(Wf{3y$yXXzr#SkS_~XeCEdj# z7oZOtl6j+WNjE}?({dxxJ!zCtYMpA%p^i*V)<}Z8UzdY|DDT<}?MvT~i>Ld!ledSo zsaW@3e=}T3gUH!u=wW|0p z@q~nvmPK;S$QEm1w)v~#2f%3^KIDskwuoA>W_vdH&8!Ws&p=MO;I4HnyviDE3~f^6 z1~kB~q>a!?E>-KCN|9R*w^CPp20idy)QK+wPGz9pwf9mR7sWlq1sK}r%Q9r^=nf%5H zen2oSm^87Y=Nmti$uL>8EFY;*^X~5#uB5uN`JSjCa&I~(1lWlwLemTL?i<7b5U7t> zKRhuTX`;LRbW@fM5vhM*DuIi7j_x(UcXgytB!*=;Zx=x!8%RO*iUt>d#SvN`6`OTro0h9LH1T}{93#9+0pI`<>K=(D2<&M?)rq<; zN8DqM`Ymk_i`CayTmXa+Q3&Yv!x<2Bjy?ApZ*w+kCmkuzEbR(+`CcGO&=Z6BJjWbL z&EGYNU-6s$sPiY#W!)M@qYl0)rB!3onTtoi5#=bCYjl*K>@jG;NbCVyp}KG3OC`*( z2a!b0yTCL%V8C~ul%pbgCd*W>2m3lM?Nq)8eV2$j&!Y2W$I_`Rq22GZalsN=F2Kk> zmuOpYNycL$gyqJlTOTaQ&V`YC1msZfg*#F%_3(q4;WcP(A?I?h!?=C4si6~E11olv zXm^c$WEAWi3B^TIrx3Z?&t{IS<{huHEr2pEBZ)FTE&E>RyreQdbDt#!aMj}{Sd#6b zo!IV&vLrtmP6+>t)~)2mxbO|v>!Zuq(OY7ZNp|!^;X3^{L`C7s?I7eM@wP3SHDD_Q zpX!0PF(V5S^LS6{%qrMi1`{?HMeOddFg%kwGU*a+DF-z;$>c;Y`EdH{{o;YH=jXE@|+uB;by)}A^?4@Kqng#}rtY!qFvb*<=vHSyLlO{Q%Xm>vN} zc?wU9W~{tK>&!t9ctedwR&%3a3Ub|sa8wxI+9O>Q+l_Dt@Bv66&d9~KfFxb0?mR7Q z7x)@KUoZX*NE2Re6-n;K%U4U8&C6yPl<{k$S`7Juhd7mYLJGlF08c`Uuk|Fh%DeFT z@=Z>4^+N-O@8Y^mo|bETF1!iZTMLM)XTm!{)I>;br%_fANeomEJv1yl^^bGo7b6t~ zZ0!}>Qc=s(KN>$ILW>5=2#S=<0%xgxITi@cG;K}PC3VQ3PX2)2a5bB3XG*QS)BK)9 zetUk4;UH3XC9#1hzq5(bRrC79wB1oFc|kgvMc$!QtMdbP z-VE}l4rga>#I(3pC(0`lJ9nGIID4DZaQY*$Gdxd|8Yj0HrSx}-vR^}F0nq6`+}4ZV z4vd559fpLHAummEksbwSt-=*k&5D`eZyAlQS0C*e8O~yOw-$*teBY8#FEid|`t8bz}rLitXEPeRlOO>9Plo=aKzJjq-}QT97=Vw^dc}N zrH_*Cu}cS2`gfK7qs#&CbZd)uXX5i5XC*t$(q!8YXp5g{mL8`xs$!4yA4I7sDnkCF z&}=X)aHCDP2({ia`*_{2A;>C0{CLX^}BVy4frhE)(2+ zPP)V{T}|oQuatIB%Ier0znaoJzf$@trA2mW38gE(QhJEeB>*Us@6upiZ&C5T0N|np6X_q46^thI2Wvw%wCB+esCJ z8}@kVNFef0i!UcRFm=L1gN9ny8PSLiG@=8@^fPG=H(cX6+^fYnK!1(I#2k!~($|Ex zM=V07E)xyU?>5n8|7N1gm?#$3oM<&IKmJc^qA#Zbo*50fGIlskd%UN>sC8yywy~y44@B0<#kCp^L-;i!s0=oM zPKPjSStR!3UD}jU{$;V1mrkB6UIdt@?ZYVMC!S!yRbh;&tZ?|sQu!Z2u>`1CQ+nL9 zp)`hg>MLO8)j9D~{63wZXB2ZrL9oypEKL1~vW|JCKYThr--xkpm+ztctq-A}s~cGz zS&`L$_OUQBT%5KDXUFRB@ET+ZsC9&sVO`uxU&ZZgxqyvYc6=NZzHP6wZ=fvs-4=;O z%W_OU{nXw^>+rB@_?X{OeoIJqSJBX@EMxH8n9Pp0w`I_vcoEx;d@$_lhGFl}mg`Lv zuloiRpXC6Ap!hAI{|%l0-bUvOybFp?Q2rA;?^omrL+O!7;_flxp^@Dx=!vCNnam{wqQC90Vqk+)e{e85JxzI~^LWfr4;EC}P zpCQ;i2Y|_7W%V1R?$llk;0eZ0rEwk%z@{;`{3?rwimtAT zpMihm2%dyrp66J@S$+#2eY;uf++W1)At?|=b_*F&An((Kq3G;NVW^41P*(8qY9M#n z_2+|3_r&$*%c?1pei}uZcy4~rqQCsUUw(VHvCqOcyr?Hv5?lb<9_9!{lp_$uHfkoC zg$vCu^&~3^TA!!RRJ+bt>KvrqKJt8a-YD`s)Z0eh#dcmXdE|FoZ0pX(aa`sClg_|f zZK5yGn;BsgXU3_?8QJZV9oeFE$Bze?Ad9HLakCPj`m`}`nFBgCP>4vzhGBI?DQx7-`(XIp;M(f6n zpt^ktkpOEaz?X!&R$cN$?vT_sq@-42oj%P3;XV^QIUa!vYFfWq^&d|R3%dl>kPfHR zS4Svk4wz~)4^!+ie!v$;Tz*2iU`58|jFSgDWwnM$$5a0?`;5)+Q#GF~5JVTr!ay5; z+(d%jyD<(Fo>c1YvFpA_U2Uvct_t?M2MRTWmHz98*2i-gb1Pa~6|jICuBPtK)Q78u z`=<<8&hof{WpD$*dbx%C1aS5MzR~KZ`$vZ_wym&fOakkoU1Q!hN`ZP$D!tQEwxTs= zA|q))^Sc>{GB!aYzC?h~*9b$)cL*MYAAmsC!m%?fs*bR@-oQvs+NKQCv~3UnrOVZi zPa_eXNPYq6;3lpXJxdfpJ_RJ-QaW2iA@9dYr%2~W#hVEjlPXEoq&m_n(l*jTQY+~w z=>yVfl4}dwm!x7+1!)ecmb8MjnzV_uo3x+w{FYi8^Wy{3DbhJo$`9EfCgqRGXDz9k{4-eYXt*Ru(znItC8ofU!Libds+MWeTwAWMmb5Axtn+jmE^lD$N4SCPCnqde|A^b zId6e!8&4N%oyAcE)4wGOwG*x>)69IaemQchpnsc- z92bLnDg7rlQbe@2HP;X)Rb0R282>bFYr9yK(e??b%MhYZySYBX)_N`*NU-k4!4^~m z*L-l0?8&>>pczRx~wcj|80Ldsg*&svvy) zLUy7*xzTR#qHIrfdzYZ=*>3N>d3TLF-)%yaueaMfTPYPCFxbx!DKmBTUJzHr1#+n@B;8Z{vBggW`U^$ z%^(CH88QPA&UcKX^Be|C;y9~eeB3PRR41m+Vq-)yo(IaapJW-WbVif{mCc@2-g-3u zlEmRsmvJQDWt_+?$Uc_u%C<~Qfw@QF)V8;+f>Fl4-*rCfaV*VYbSJ#F_PCL{SAeQ9 zePqX`#tb|MecKdM<#RBKDyaB#vB{65IPs2IywEr`H8GLj_$+HeT}Y8 zmUkUN`YaBKC4Hyump~#0M{tZ<567$dAuBA+|BfO0{o-4yGPLx!4bDwx9G_8O)bjjb zS%KTUYr=O)oiMWb?d&=0GWx>MXXyM4fSR}jSgZ!O)%Xr60HtIX5Io!5{_)AKuLy}Y z#5xshPGCqm*9|mG*3kRTjRcZ6z)3SWsvUQ$~zdk{$;luQb;t~f?Aeegiw?=UMZ%qvvq^GHO zSid&{{fY?%hAyLMzirDPh$gXS{4auP>)V{Bw;^Bi(tI8u-PW(bDC<#RY=9mpl8*On z1tY%Le#)vT3sZLMmmbcb(Q$FBaLosBrs<;iepvyXV3O*<0tn7oIV6vzjNU;^XdjJD zm9L@lq2Dg1xB>uwF{diN)I&RQf6)T>_YKCY#f_oP^VC_Y-u!uHcn>$mrhyQRGpl0( zcl=muDT#7MMw*-6T3(;SVpKV8?*BBwS^cUITBmF^-u&V9u93KYzGh0XC?KYOLF)fIf8H{8; zYDNk9=(LT#YC&I5L?8zY(Eh~5Jb}p>IA&rFo0GxJGq5)q+vaPz1QAV4NVrf795XSw zWxf{9^(>|Uc|0d-g2@Qig^CM|OwgEgUsDUj|C}#hM>db=NS%5HuBTpo89*TTeAt`? zUnstcL+7#)*_cvbT+A_N5tTI;TanueZX}7)Y@O_o^JN{S6H$^v+vRLtBsFMi-z?+V z$u481Gd5mv zUKNi*h2qF;bAnmJ3*=Zr?0xdiImuM#ewi2UCnsq+-*7v0YO0rW!`Ak3PinqK&8(0a za87(wM{KxPfpIst-8b-=m-Tg3#+^7GXM{+f0<0m3hSahkcqGN8ct zJ8k|(n}5)L)*u#PuM`-pCc<&iUvl6ALmaDwkb+ZLTBO2cayWx$bl(K(%12f&dkyrm;Z#S`du>7qHya-Ijx_dJiwSni_Xp4M zZ1Ss&UuE1neuO1W4jd@ix0hkwkh3EZ=DwOC8DbDa$UPh%LwNZutRUjw_`i050;^cH7%dzmc_5`q&bT>ePx zF(8rhU!Zq;$(A6xU?bGhv`FGl6D}}oYrbs2hGMT0IHP`IbAKd|=W(e6&zKBY%8>|e z%f@~~r6t5UEB@1Bs>^O+v$uX-R1AYK(fE-t5x<2ErbA9)Qps;3zXy4f$rCFti$3yW z&z5Exk%rC>l49JFAWxz-SqThdnEG&5Tkj4AVS{CIR(bb-4>U)f?J}! zxIxjgt})uAZhvlA_?xKqh)uP1shr`qsYXcCq}tMMRD0g0TF9narcJfQ-Kh4wMYY&v z)L9SF247ls-gP!jG6H_NZ#f}~d zR7^Qj_Xw*kqn}3lI7Axzz@2049elK_wbB(*@ivnPjI^v0)V9-4bn2fMw*g)yQh!c!?+_XJMoz(mS zV;l8)2JtfhN~BWC{9y|6(h7{t6gtQ(=68U+dy=yVV%0xF03myv{r3DU;}~U2$QK?z0YJ^1*9*yqA0k0%mYh7(}o`$0@+9Im!2gcD6NNPG*~77O)lS=Yj?0GF9;6051-= zcY{M#U{a@;Ift$@Z_$k4_a{XR zbl!)Y&gyqvRKBPooa(^t{0hJ|4n=4-n@6UERqP;xiJQzJn)p+=gF)wuc*0l4v{r%y z;7=|oi9U~^P`h`Yf-@3)=_P}6T;|LM%jPllUcJY{n5=VuJ_l@|9K<1YatjXZ#l>eA zwx0=B`h?jOcSBX7ZaZfIrd@6Y(r)Gw@D{t{<7~%D#|Q0>CE(`JF3|$#V`}HPN3}ut@Z-iB>cC!+BHVJwb044vU=k(3rtAX6C5>4Yb@u zc*jEdk-QcImQLIzv#Sfm`D}^rVOw#_)`%Pu>9WdNqVXe2vMUagmq z4xAo~7g+r8HW#s*RwCSF-IJh8>Nzkss{+}05;W$oZ8?x}U0t7tKnj;M;a z<|4$cRAwM&U{mz|(bM9(|GqYYT5Y>ixvoojZ|trp`|1*Q{4^^ft@Y(PF<6oT_cLH} zTT#{$%V@WYc3*I~B`khFx-lW4YcCyWQ*>hn6;@M0?B^LO2?y6tB&IH0Y#Vku_azsV zvZ<*15v$g>jr5N>c6NAEOrwt=eK<;Rh$|Z5pUv$t`g+c$eNgBh_+Yvzn?0HJ=#kbe zB^q^@4-=)(*ldVH{5B1REMwmmv&B9gfnV_~a4kAczN$QjCxl<1ifq9p13Zyeffq}a z+Pa-f7mH#+x@`7Im+Rx%qt?ey!iU5nO!Z6*0^QHwOR>8j063+uQ3i~uK~AYLZ_P{m zB^rsnYVz#|MrC=6aR}#23(5Vt`C)UddZ0-APwiA{+O%kfhc6q&h zD`avHj2;5Z_acou$xAvpI3&@86jY*P&ZTjInv>6!BnRtKjkT&y0P}eo|CR;I>0)N> zzc=dC*77B!NbD(zd0c|GL=eo?*NOH=Xe19OL>!P4X>Q}>Jh!pXW%(LEmNMJBI$?TO zw}qnvq5HKC?Y&3%Zl*Yn^0Dd$1`?p$bl4wk$Wz|mu_L$h9GY){&4j0ICKN~Ykl1+q z#!D%8qMBS_pphB(fV`j0W%bpQ-_*Mp3<##&-Y`eN$Q);9fbzsRIZg-wJ*g-&`UiBC zr@a5%2B4Gyg!2Wchh$J;UbsKfA4X-s4i141ao}{y)?i3MqJ@bc;;cyh2FB~pc+zLT zu!v5`8mLfyH$Zc3yDU|G$C$Z!O^d4|KY^?5jW3U!z!RN^DtSB^emIxLiVhz7BOMDc zmGIR4EUe7coTw>Q{|5;v&~JyiKx-wBMOpaZ>n=L0G4C$Tusilh$2OgWC#2(B?T%*% zvo=Sb(VHWW=+t9#yo2|I07pQ`lMEgow1dY3{2o}NOCQ27bB2aFwEl0g15V0 zmq~>gSd`1*i!RJeDu{*?pyYhH`Y#-{1O=GofNU?(S+y(!HS#m8Qsc% zZBBdSWc{KHLf?oFFd0&}kin*bb&d5^jH|E8JQ9EevL-(2XR9 zp_K(i-MVNkzopVH6w}Npa;TS%a5Y)W`6Sp=c^G>T<(ht-bw$6sJxC31HbfEzjI^+J zx*OI$>q8#?jFTIM#j+rM4-_Uv3TOFYX!{6E@;E1LIAJcg{1%v;o#WkU%oCc0h~P!4 z;t}?ZivcF5Zl_Th%r!zGzU@JJ81*d76+%+__*nr#29fm;6O@S6oVwn|L%Ei3;|Wty zoMcfZvJ5!JVq|3|GYfFqv50GJ4Dv_L5n$OmUPlp0v_T75x9p_NVOhKcElv4nKZ=TW za!O}BeQcv`J$<}Fd-HTVUucpK(1>)Lwk0Hd0Ub4LAN zxXnDwa(~fKxP6C-opC0o?=X^m3C5(aQRHWNcNy8X_zq`+S;1Y#ek^QOM07?qS96$= z$8XJGMt!b9)ZO#Y-Jp=X85!1h=||;Rj)_N7R zTU7`K9Ac)a13xr@1&ITEA1q3cZyVU^5kUXDK$m>iRQB3u&`2tOUr@&PquiUD;@`wX z@*SyPgQ?_K&F(nU5Y4{42^_Db=REb^)3mU~8 zx*c(m-`k*-aBu1$OeOCVA%$>ntCzEc++q{%zX|J?v=1VpJ^eTv*olAInv`}r`8p>6 zJ_wu{>K@K~RvPg1M zj;n*(^4-)YogyzpUh+`EVe*cL*|^W*PZWMc$47ZCCoQ9+ItKUv#%SVQzD!li^Gp#R zX632Tk^K2wIhL`@UtkP?L<4f6yYL2SpGLF{QeA@!cYyMw%O)y$mZ0Bu*~Aow#cw;g z#EBfURFuM3P_t|$oJdPG=F&lu&L{EL_5}(It$|Bw`nqT`UvI|e;}{S79v!W%lt=k$ z3jE}X5RaclUpN`!qKi)`uDke!CzoU!dh2=#RuPbr49*7qjoX=H7*Ga~PLqvKvXgo` z!bV9a-#n37Vi!zFXoZ8>MHV~ZiEN6>%*93|?F9gBOgf_b=VcRNZ;bE98Eu^}(RO^l z(7n-C&Aq+d)w)e}zBypls~jDWzejk4Kd_k1{xSI@n5UHCG$)+zTG zYQ!C5a1l`v+n1bHzT`dCLp0qYLP_Qq=nrYYPy^OQANjDs%;OyTqIpmG(>8Dc z5q{t2Xq{8jEv_|W~E+Gi;K z;s8|2&VbhqtydfC16PNU3*1(go-5cxE;+I(mU`r9?7vz3iAhW4Yth20B|L?Y5id9y z!u~O$Az$+n{aicSGVaf^f4>Xn(%9pw;dI$?Ci1`0;Q%@~ul3rm65<19C^HaZco|5D zktD=_LI@FV3G7N3{CIwv(Lz-1U(8^$5az1HE(SQPe)CTMZ@EXUjUQm{@+Y->@u#!p zw$T8wN!X#&Vv8c^A1JaCmq1)iak%R>`5j7>Ay{MR$^7(z(-ECDWqN#PQBhR>@+Nms zq7Bp;P&GZiO-*`tVrg&SNoujIH=M?CjWbGce-Ef}be09bz%D&!y`lEJJ2brCJKyLE zIO7h#lkk-@DjUph07$Zsu#d3O1F+C{z^Qofd7L&)+NuNQ=F62aZtVHw8w$PHpp(C~ zy^IO}YahkYiZQ#5q=3shCvkw)7q`tjj$B$`My6cBP0^&XJzkn;m{V(*V+<7apV&4Yzed>`1z zs`KMWVeOMEHm$GM_<${PL0WW}Y`8>p;m)KIJ&x9H?a4`<{?q{g7l3@q$s4g8w-f(M zPR3=1BvzOUdm=*bnQloK`innuxQ)ilLS*j5%N*{&Pm%KgVlqU|M8kKNv#)D)F(Jj` zhA?Qg3~GlOTz%cf;4=CS3RhMqe*8aO9>L`JBVe1c!h*`wR!hLeMhSYQu{j`eRvCol zugx~mC^9GmCrwETvu#HSN`CKSU7h<;hRGP-^14jpY)yd~0Xl6S=;ahS^*-Zw5+mo* z^1?>WB|wK@3y;2ututk;*^)8&OsP0f>~|f?F;Qx*3Tp=-o9v{^#zB%y=U7Xo|ldR z@-YE$I2aKC2_0AfW*8h@KV;65!DZRn4gkjhfDJECk`(9QlXKD!i*3zk0e4dv$j;&( zp8QB?E+M3}cA??PQfO!cAsT3Rnr`fytQ(hs;#zw)e|Kq}Gs>;m{GQpIN9*fW?5noC zz&sYVTP6o!%gYPgcuAfW48FosV9cf;xdYv?ikDSnu3{5^CYcl0Ti-m;kp%fZ$L|>Q z4S-A<;N1+m4+D&;iRty|<~8f0lj&zIl9VE`3@{}+L+CxG(ejfI(tlt2dv`bo5J#f? zSb82VFDSPUR^Qj=Efb3!O{DTX+5uVQ*g7F1F{EkHO;JDJ_e(lgBG|6(E%h(qe(Dvb7xlm;|FP@Y)xJCl&|FrUg zmNYlG5cKBW5N&k6@hD?#6j$D!Hk^l>#!lEiSg!|zK<$m1f7kh=+lSfBPvL~N0OAbX z8x;V0XqoLP$dm3}6m|Gtj*2D`lkC6<57xC;`2%(!)S}>0ye;v(-e0G6 zKK3KaxA3InTMSYeAN13U)$k9-h2M32v*&Y#e!=qz!ZG6Qi05N@JokLX|j=T11;{5_la;w&Roj{2~4uolxQh4@PRAhY~9mlx*_5L z*lvhEJ8MQf^a>m#QSa7hVpjv-@_R+y_NRVfFWKUTq}r#;BpNSn$X+IEyCL7`g}i_l z(%l2;38flP1&@J03!3= zZQmd=^FWC3XOMkt5t+}5FNjQNGH1LH9cSRawqp}4i8;!%=96v`qlv^|KLExb3?nue zkfib0RmX2gm!wql?+_rcv)XpjSa0DSMiNg7(D1FyayObQX(hGRZ$(9jj+Yh~`A}E@ z6~Q@r*@a0a1?Nl}m>O&pIYDJANgsQFFeYA zxrUeP_?GHv0E>vG|T`Tp#?d9?O+4= z_Yzt{Nbuu)N6#`)2(9)xgA+`ZuTXq+4)^YA+QH|iLo>ssKP+pIt@hbxFCWf6d#%SDu?qg!Y3%-dvj$7V0*55Y|A5JDy!juq?e1-9ca+`V}Nk`RhDthw)xc@swp|6En7GF2bG-M{|zpV!^5-=BHR``rO}j=|=AINlDs_u+UQ za(V4mAA2(L@A|L0hN}tDbQd6JpXc#@dUYVZT8{ozA$B|d^#M8yl%`YDSFii2xV2FC z#nlH+1&p`*am(RTJ^y={2U_38&rIT0L2rXjvAkVZFu7LmzX{Q|>$)bd>BA8mFrPa9 zNed4dz?w*&WV0Yw4#-80sYkiH;MB3HK*sZ5tn2#xIPYz!E0|uPZ-Ha;rc({m8O&iR zVoKlNeq%Tmth{Q022I_jq2YxLFNMB43vZ;uv*m-Ycr;2=ihG%#F<$eTZ>Mc7`_*VyiTza5#L-cc2t$ z1o_^MW~48~Jb%Y+3z+A4i(kiGDyO^)RZg~B%T1hbxVLzR{nYgvyVXd4yx%1pq<~yJ zH(UF z`x?Z^Qudc(!xHu#-e(otmat8vmzS_}etlNF>Q@|C${rNGMixr;_l@jX(uAcfo3v&r z%OFJ|X{0MdP}sU)PhmyDKE|t>@kX#G=bY!O-}ZPO{KaVm19xT+KJ&R-o_kDxc&^}kbXG>S##S7V=N@25 z_c``AVmE}*m+=K`zUg0Mc$u&S@8a&XS>A|Y zNq%9&O-vaBgFrdTlnyOE+$1trvTb?`GT5B*!b*0S^S&%mu!=>5nOpG7ydVZRfliB? zTV&HJmW_jtQ(j-qj5^8@_%Op^C`@k*Y;LT2X$;?7j-tH71JW1zuc;v!S} zf!Fsdb!Y{&A~6ve>Y=3|M{}k^$W9r8p;K;58{h<0fb14clcD4Ph6NY2f=XZmL16F# z(lFF?JoNt35yNAsvT_3pSd;yS$VQ!!G^LO67~m}PR;YjW*RS%J=A zLeX&`^@!|wnRV(6>4>ZcrANe$GM2>cM?_Z{+oA8R(xE!}=+9XKGuq%lhF;W9ZGhA6 za`pi)&J+c|!1@k73Dp;4lcqisH-5nq$d<5!tsvdBgB>>>L|Pxp=%!6ac_<^&!6JEo zl}K}75AUy%wGLFKrwZ~j#l;G(KsbcGiX9mRmA%Tk!YZ0nWfTQipkq)4+fMKQo~n`= zJF&r7@PTGihm_f)bnW^6}ul3&MK0*c?zDJiduklpN< zf$W~Rys(>HWW0QxY^cJz;F$Un6IkI&JRto#iPy@$Lzz*^-JFmv>fT`gV(i6+Pl6dR z3tUZdV>Q!r?#dF+*RVr@p+|2z^c@w3ee95NeYH-Rz{Uq)e$yN`9Tg|{Vf<#A#K=B& zEu>e+l`223ka|h=6CdnnB@uRXAXOHRa+5(HaKEKfQlYU&Wyt}S#zNdEoE$A$A~_-P zQY{8QguD+Tky>CyLLoV2%GGbO5x&CIj`<-@!nWRk zk-1MK)nnI)X_uGkS=xO(d9Ms>LEQ%WZ)z7dDtWIcc!!+}`>L@hWd?RSNupCM_ggZp zmDTV_I_LVh179gax523wYCq}eQrgNstDHW@Rxoa}ipVzB!e_GNg*ImJGnnC>18nVb z5M0YrISVR?kthf$)YhaWl1M{baCL&dgKEWS$GR*mOOWs9nYANS$2_K4-A`s#!-si z4aFHp%Db}W3cJJ|RU5dHj~u?FXWtt4P5YX|%any1Ag4!J&tmRwkew53L{EW3pRsH; z(2cPf#72yQ@eX-?n(g58M{)Nb*$3)Z=Pd56a@(I+tkrI?O)pbu%p z?R;*RK8!pB<(n$S1slH};25k!;|_Z0_6d`%$|pWk%at)eb~iLv3#XFa3tAoCx-@mn z73i$-6db#UEA_9VHxX~E=1TejkKH%ZgpY0Lja$wzKxnzq9J2wzyRWfTBBxB@gTz0J`G6GwtS*a?lAIeK_;aWE6HA5 zLtv5hM>rJB{t}BW=!Z=Ve2*u~{s;N^cLOJ3n*!w9kL!=e`G<7f*^P;Xf8`3%_-kx52)MwN&1R>5QX`LV;TxHL29epl()a?u!1>HxIr1WZPt}o&7%t+)GPH=B z{5U+4w)39FUiTY2I3_XN!*=nWKt9wZ-#@@FsrqqTF!o#J$v1hyB11Qpz9Aekbu}XT z@A)Mo#dS3v+aTG=f6V3~ay*!n@_6U-1lGWR+&1(&~XX zLo#Zjf~-R7-Kai;9H~SyQYqv}HB#xNaCQORY22y-7KGDbZw1t%0mPl48TV_c6%*Z} z=QsSM!~G;K7}j9wrhAma{(y8Lf;4;hZPLAYVtmr$5l+$KW=(TEipx&T;H$O;Y~J)j zEv@tpKIB{JlfEC}MlIf|sT-=q$)f+n&_7GPNWDtqLOnEq6GR#gC!isr9H3F6;q+ULrRrZp&`@& zDwqnRA$3D(nCFHYVKdTbXuZRJUoU<_Kzrv-5Pp-n+k#8AxHrXH@AK1<-bM^-jc`G! z5^4-pRB>9C{g&@$E4_~6nxnV1~Et+f1X|eJOcB$S5@#z&_!&~#j&JmtQdSQgO z=-ZJ8*Fh!!&1;z>H5)a8X3z$D!7zyVF;3-y1=v6-s0L2Z0s6rZm;g!+o|ObKAQ@PI z4U~dv-~=6@9}I&@kopWxcb`#zq!c1h0S^TYmI}LCAv6tuu}KCz)3vsYL*ed$I7gC(-g{+N#oq0>MQ%uKDSu=2cE!T z-1!F{snb&rkG&<2eT-g-bRptGHz{}yE&$&EDXSjGcS-o(J80MMsa%&38$aP899r@T zkMJYk@VYC@mWlRHcsVUxD?jC#Ix16GKIP%U`6&KW|_-Y@oVwioR z&9_E}v`p8Ki84n{@r|C9*rx+#_KMmm9BE=Rh4FLV!uNk5x<2QT{6}eWGrl-^_5yg=v;o z$oN0;E5Rbds7A=YGO9$k$@kvwW=%m!ke400e17H&9 z{t?{`;z26N1%;pz90X3#2gZQ^G5CU1U;~w)9=N~|m;?d%!aWM40z0S%Z4UhD27_P* zgtuXfzK#a&Qo|0v8wnV_*gZwaX8GpeEfPZ7YN$mi9X%(;io!59Bka#qo7& zG`IAK%j?vQ+}R@%GNFS#;t;8FMog2&oe|ktQ0p1dNjiE)gsg|A^okPFs$OxKbgEY* zY=9=86^BS0&x&c%v9lsO8)`WxI!Wu#iI5*dhtG);(xCI=GHK3vk&pvzJTDHBPM#Oj zq{)3E`x$jbT5c{55%`Q&D05$7Q@EGDs5UYst^hOo3*1%4`rI*tyTdyv)$^gw@P6!O zvGO@JT24Hpnsv*f@VxyH-6zrRm(YEa@TYXN2CNbl8`Yp?^izTJJ?t5p#}IkYkL}I( za6hdRd9mtpLoQBHsq(0GR4txV-HbC0+-n5lq36`)q9Ruf_x$O5P8|(%VV^3*Ek}G; zqL={PGNRi>A9siztGYrT(}`W6Q(m*G83BvzU34m~6IWNL4>(E@!L4Vdf)v@SNO5;@ zKPjH4s3*mN$VrMP2wO?NN|y&%3jhGMd>H4z&}jPrL(!aPC@8g?8kPr z{Ik#8NBs6Bb=6D7VOTCeC8!2&5bz!B-XI_7!m&7lRxk?ee})|j%z&r}mD;ITp!uK> z*g+qN`Yytt7YqRUF!8;gs1J(9A~k05I1bkYKJwLK_5S6uw^%*N)=Atp-*0V3jph)8)^UPL5-2_QzL7%5t`h$&Kvi0lFp z5d#J`Z~@V*6cs5|6f}sa5h;Qq0-{n&bzis!5=yC3MO60rp1T{x{`>np_&LsnF&67V>IO1b>58%{uv_2UuB+8$WmG8*h9@eD zbHG5Q`Gvp&+k=|k5V&X?blKPRx5HCs?ojGX#T_tbxk@4mjeJo3LEskqRq7XkW%l;! ztiUt&n{y7lZ&P;EJCx(3Hd-l4z)U?G47=t9vK(U_+4CIAfCGVh9LqK5TY(FXV$J?m zpr}=`Y6i+$byklD{?O`5t^ZqrXIu4EcL)B_>bB%Rzo|55D;>?}14ELo>HY+{Ph+vB zTuRm?-l$4xl;Jp4S1|faqHIOr>7@4RlY!TgewDnOGO0f|@MF?o_5Q%Xwyc-7kZAPNEmhvsfSh#)ONw16d0-~@oZ7PzTRzT^022RskV zZ8K3DJ}+>j%{WPlQmtfeYMvJSePCTY*=Z%)K1j9+0fztU7WjFa;o~vm;lKdgk z+nJkfLvv2K^D$04^R?_Xjs;h&wvDk-$W3ev=Uv0j4^%mw~3FWa^Tk3`0@@Lz5{+Exo zzJ}j#yVbi~rRzY`kTFoq50-UEs~3U*&{&bri_`kof`Rbtpdg_l8Z@ zvj$Ms4XBcL%wOkt(?Qqw6y!6m?=8uO>x(5h7|&@Vtz6HM*1IY3-12yCcRY6{o-4S) zsyX%stLDNR#tN1r@uXnXWXUZYH9u<$eb)jZp@GTydz^->l2KA)O371_XrrI9Dh8=! zI}{(tNAZEYI(n$8xejf+FvbB(HgD5z9I84BsnhMywo#>h+uSNM+>d-8;L#=gBlQ5& zTQS?Dqk;T~o6BY}+xG&2!W&k0qwLR{Hy2k(JzykI4om~)0P}$Jzu)%RuY0NmH9Xe> z756)oW29$+!oxPDAJD*a=HWo`?LBSBA8;r}aE+Q7sJy)&W7@X)_NO#$_~C7%rfjws zhn`iM6;^&bMaf}hhShe#=nce|1tv|nygrZ9DX=3ao&d1V@UH+M68A? zTMh>t4}GbfJG|}8L&aKwygHe9y_MGI0q+r;vg>2CM!b4|e}OjZ$hOJ;7m{QEsgLI9 za6V96Jy|<8f7{aPrdAXOX4fuv3Nk^mg<7j7>yCK8fthP2I;8t!^8*Lh9MO*cKCoeJ zPf3ofouQre1%|HcYdh<6D1oi(G6Oa1%0U}wT6dSc8u!E}Elqo_zf1aCy}q}aK)mhX zll`@p=hWat)gzNX2kN&2H9+A7{- z8}z5iYEFxG8G(lJ(!>MI0#ID9Zj{Ah4EhkA_QOWENNe6RpQoRg>rmEHqZ)`Wzip|{ zzS=IQWTn#VV1mcqNa{i#p_4RJ>2)gupTC}^4PF`e=Jh=7nw5d9UH!GG{=m3h7fH5_ zdtrq=B55UK-1SLd+`AK{m(A~v)3P29Tzq$gdMt3=K52jVzMIw80&nkoB2PM!W|<2F z8;hOv=Z?3{-Cv|?gO&$2yth(%>HGd}EnTXggsvu4QHE1JbHO&}!91N6)&1~unpRdF zIPy_{ExS69dUUe7FL3YC8;e_dNr5Z)j=&kD7z>tqS zt2Nv1{J1VYs20lTD*aQZCZo#x+g_pQ%fA)dELJEp16iNH=M>_CU?;Poc46Z2tbbe6nKOD;MHDRyw3wOLMX|quGhfYi?xJ`Ta5@^8@%0fayVc5W8+C57 z>a1XH#Q&PQAn@{kCTe|71f1VYNu5e*zY`3On$u1M=6*9uqr%>AZvE*^3U8;K*w*vg zr&NcuuUHT`a=yQYTao(R6iH@&*H`N|Gq5?HM66_6&V}VUsYhu#2S_sE^}+gAGu5x! zj+4nBejyec0o;KHP|3?$D!FqN#Sb;z$XAiiB%OqSwC$=Wg6L^1egkD2c`hV%1Ij{& zGJR(Kg+jHrdx}(=O_?WA=^BuWE7F%#+z45clR;9>`-!9*Nwa}mKsuGquA_aYBt_W= zu4>A5k&4@s=xF(M>V{U9`3bD=?yjFOM%}0Oo{n1R1DvJ)4$|x|88L7USVR5<<=sfd zD_CY3T4U^u>I+$CDU)^{>WSX`F#hhFGWDPlDpe2VU5Z!`2|_^}M`#=@Q;SfM^)z@& zExNRFx09IJMDPD^qZ}i6i<%-WBjeRKf7!BvmKFcAC5E@aIC)dN;Wsy_>wY=#^)#H9 zpzr@4c>V61|C`pMG_3ufJ<0%oqSbie7Ik@6%BeWZw$MOWCJsLagLl1+s$11bS;G?* z8h%;fn_Jb1&N+#9N58C}c$@mU?yRPu23UWpe$egeY*(ImhEgaZx1RLO_pw;q(>y!4 z=2ZQW`_#LVoSS$N1eAlu&^hWE&A-s-{eZeo^UpL6KA?UNSslMPLHOHa#tS|;GQu}J1D~#EawyUUr zVUgNXA2p9!r;z5ucp*oC6XZt&ce`|@fplvdU1{QdQnO7tM1DHZ57+|K0_TBAz?z^@ z^oY7Vb$t+%LR}Xyp}BtdBkDyB8!wize(zFswKHybD8PZ+yyp>3nbd5|Sf$R?D(2Kj zR;hPsjx7&bwa2ber#MolgQpg#0QNK+Z$71tN|k(1OhXmvp=KkiP95Pq!Siuo+6VP_ z)v3>_skx_F@4#pPMUnHgI@6Xes5eqj4jctSr|X}3MorZ%BQ=MDsen|dwqC|7tvPMH zw@LjnOSFvlp9~E+&HDs`z0Wi8mJ2dE@$&p7jcxxl-u#PNpw`xh|DyiUZYkSR>a{4_ z8{^_OW1E_%ZF$gGzD?~d>Fz}OO(HGc9xtDqNLMD(y@~WfBJKG~yxx>Vx;l}*_lnw6 z3(YkyyrLFsC*~SOuTn1wX4&02HgaB&(wdpOP#Hz zmXfIg$^n+jJ#VTr)yIr~ys6$;P+q1q%lvHTRhtIyg;E6A4uwf{1TcdN6t$)(1I-DwS4|Kt(%el1m|>=5PW zfn(?E^FCJZ%IPiYF>7MuQ!nbf2gpXeWfP9Aj8hixwRV%H{dyF=1wedOQ$*v(Pbrb0^ChBZ+toa9q zfqt9YR=Y>le%Ne$>C#3Cg8Hk{wC8n7>OarazO)|pW@{Jh4&Eu$+ncAIu{x^H*B-JS zu5oK0Oa0VNT7T6-QBt7&BmQ)GVarqNB5jq0Z9{jhDK%AG#w12~noZ5gxyHJF+EVAw zW%WI;)za;$Qo$-j1y*L)j~%3qN=e-a8$U*qE+IYE!FYC*Hdd`Q{xeFuM!Tt}(X&K5 z)&+DGZx9ceGXbdMx0?^yprnO2||iGZ|NJgJld_!AYU zlZry0)6w{5f<`=IbN$epw9U@cEqQh&2*iCvfQJ=2(Yhc+=? z-0SRo0-Hb&pyK}eH}BBKX+_&DE9Cg;WhF0zR)x5hk%krd^?j#m%XO`+tFiaD+Sr_d zU9Ih7^lc>`Ma?0 zOYsK7Hy5$i*@I>h-OHZ#yTMrax%QZSriC&en2`HM6x8q3PM#TJKAW&r|$! z))o69){#hAR6>qFw=Ml+yzS&aYQ;ZSHa1cGb2jy(U$m`{{87tM3)aJ;ARs|Xzv2%m zy%vRRu0^JFB1?7sb|dcrEh|szU0O%pCn<}pm@jq4J)q5Z94t_p7{MnGX!poShR)T7 zYC9gRUp!Zvq2_F4q_LQye2z*?aod#!CUg^UF5gIH$o5*WWWw z%aXvAvG5`7V(}6RWjoymaTYv#$kzaK0L#%}0I$Za=jQoZLAy1bL=K2|R|Ladh#GHa zDyA9X`Pwz=*G31Qc5}OHsX+uWn$09v!cQ0xK4v`Z(=KIxvy-vYr_Iz{o$7n~ zwOh3USrmnx?8*dS8c+e00}?+RZuMTjd7<{Ks;O>cT$Q%aS%yjYu(l-i9#H&71DDX7nRTuWC|8{k}x)CO>;`qyX|Q~C=bHf(VN zg@*vy@|1VBD`$Cr4z&^@EhImdXD{hQQi=Sg95iM=sZCKoGCqD%`)&FrUipEOfN=3x zXJhPB+HQ4@kyfYOX1!jLczw*OB0=$;snV?Wr*dON5V;N*YlB)x>(%<7U+oTRt5f~V zSyCa?1N{o??|NDrYIDj6$|)FKSpV`ftPicCu>OQP8Soq`rgzeQykTNz1_c-Sm>yS-UOMnER5pvVD&(@Pt}^Vj2}Z z+W?LLjLt7>UDQR!4KFj>QYRbme^fvJWu~LGR9q9USpVU6?OI(c&oG=jw2Qw86P&nLKNrMUidprQzgXEse}^qkPJ3IUH0P$in%PR35ZuTRfwzKiZPOV#EQ%U4l z-&FIjyBMKUo?WKy4TjgMN|Q90L`|2}Y;U+<*Rn4=*4JjfBz51Dy18Z(t4``=QtwCO zjyJRnW7_Llrv3C~b>>&bg4eZt-vJ&^g=1D2xm;D8QhgU?ClY07ZGF(G60P*=RQsKY z_d(ttPrSb|QC36Qr-?Gwm4(Mo*^xxqm_%76WgjHUMypC+=Tr)$(|r^Q;}lnE#Gj>^ z2v5#v-i>ZkXO4L*)_lYjAG4RTH;jjNG3M#Jv=nHQ$)bj16JYH@5;Z5yIyPL;u#`AAN*AF?!mvQ(_t?SiC zdCW)*AHO?C^;bn&DdpkJrn*;BLyv7;-e&pB1&aUW)v`bx3qS>DtUK46rVcu$4|I6b+3Cxb3eBA@iq%z#x=F@jHK>AjSs-nDM?-3 z_(^@NdC;{b5yyaGksZ!=!h@AKb2F*-g;lMl(xFj=6x)rr&L8^2scNomOKe5 zheJlsx3sJ-N&DmVQW_o$sjaIcgQ+*`brw#d?k4K)Hik54?S~#X$$C++ogqeX#qx-t z@8ez=8Ogem1I%kMMboK%+F57L&QO|JE78gXnsUmw#Je=MHfT2ADj7m|hR|bZWV>^B zILR9f7bPmYsr+PuGlaNuRIhM(LKrS>wlVz0w7uBBB(kY*hN)nvIX32)akW`Nr+P&& zI-k563PxoeZTvFDr>WZ&P{23A0DpoU{{M2AQ4KO}UY7MKMR8*4? zSL;yG09BEp#4)XQMd@@tE}GA%H^FRCX~OK8SCTUI@0^ZVdnzgKi_awoJqt7?r=eFZ z?R?{-t-V2gzNR?$SOw#0q&PPwBX!y64@SaZyMreif-W|dM1-KKtUS}zl}#&no=On)wXaK@qBgEz1|8>={kkfmcvgX6 zyc|U5w1#S7mmhYGp#y2$0V1rC-^IvlR+$y0Rgq+6V)*M=%xSA^N86jD{Z%C=6kKK6 z{i5`54qt`dNTThG1P5~cOCr6f<5MdiiF|{8Q5s|kikBCSoRV^(?p2L4pTZ5@Q`;!>F5K|bR)MXHi>2#zFO12LY@AZC0NBGRi?tL@~3@I+suc(0b{I{>jVHCCNaAcCZ4 zRDG$K=%Zf`i<0W9M^Co~>PQtF&W-KR2(9YO zhZv}=s>P(bCm7u!i(ynrQlx4`CZnEUdZ_5?qo_DpPygiw9<{j3%(kSxcv@^HA zgG*Z}zb)N(;ax4O=UIE5y*9JXPH)yU96u0ij}a16TcfW6L~MVncL##isM z!OSx*+o!ef@2A*9aks)cvjg3nZ!M~1e3Y>`2a~4KbP{!3)Ui=#Fr>Am-kH|MjD1>` zkAwQ09=t!1fgOgdR2X~Q66^8oAy8eA0om(%G?YXp^^s6Pbx8O4L$O{TnLWWzz$E9D zYd*82h*@wxIC*KrUixrEMA}QASG<9N;5c{$>&QO=!!-*Wu)tpWScp2lu-XxI<7OZ5 zYTS}s$Kn#PTY;7G_WjK4aM@Bzj2BVvr2Lh(ao(pv+yn?}k+g?-UwGBe`K5H|velVR zmWZM}7W%Sdyxk_s!DH!Gzr&Yewo6r-PU>~$V|mgMRJj&J?#qr>ZsiGPm`s{1Xg_+^ zNnN#Kair|_ha+#HNBzAK<$FYwYb}ZK_jQ;dy{=s_y{_HY7h^eMAbPlmMnu!-HNh~- zJzTJSXryKB=|1I_@P8DgxT5m9h!TVoo^~wOTf?0xOM>!T#V~K|fZ9S#Mdsb)kM&J4 z?Xp0XW#%R=t|x`?OhmLtK^^b&%-(;DHD@q&%*#?mnHWWaa^_Ljl`d2GSm+wKEo;`7 zgc>`}ys5#Z5tVuQoVjHW@)0*S?2g77LUCWRzhS5Ju5__sEb=MCEv1}7VA&| zo^0B-g773a{v@(Caz}hx-{D=R$1wfKOanxnRUyQ)%x6(^6_n5F#HwY4HYo26vibz& z2y)IIDwji$P@bG1>O~ z&>83r3;{}k+kh#+-GC2R3{(Td8HoKY0+u|FBK;%q5fBD)H-ZB=&GS8^?HX*#cRc%Y z8Qne_%-Ia(+yxoTi)p~`fER$zfu7VE2TTEG0ukWroi^nHkn%dGW#nz79e^~T0C)#Z zw0#?n@_a2YpJ(Cd57gcB(SKq?A@<1IHlK2V7fCoyCpw&sb=hrGegnJ@9Al2Yd53ph zn5ROSD}rlGOU=-;v4MMR$}r$8h-{RXgY5jN3$g1d8w1=7jO=+fb_b~){J$l=7nlvq z1+M(te_{&l4xI8`i1{ek47Gbm*F9rXa{fvPoDOB)`|_OINl~Vgt|Y$!*bNjjqR%PY zGy7~zZqPizbB&!tVFrZ6Ux zEX8AJx_yaloUCiv%CXFHxXT!A%_tu1xisH)V`m~RClw1+axc|pkP9=K%T<`p!3=8?3Wft;}P(b6O)5*K8 z`uY7d^0}Afr;_h>Nxp)-_Y!=Q$d7Kx`#@MuL3v97`3dBwUV@;Myf|}JS!obZ79Gu0 zs3l7ycp2ePLB5$r=s?ZIzd;sc8aLwD2WhX27qdJrs#JYuZut!aR|L~GNjVOjUK&*O zNlVjxA|SdysEPnqvmLSdgILz_(PP8%+u7;pI1RdG&{$d5D7(KGg}{R6FC&pA|bxLGE! zB&g?`A0cIV2*m^t^&q&YR~&9E=UFNH%sh}`?EFaUJ#il$9;577qEk(QB}y>OhFMj- z%gjt$zIpZ%yxYX_=oR;L%8~Fn!@-A8iBm6vcpN;xI%V`fsulU32e%OGrQS$8g6)bs zAunUfCBV=h&i3e%Z%VtOQ?cfg&@rc7zA2krwYn;zmd5vBdTCYTY}{+HsPayBA~VTr zY>34@urcQ6#IdO?jdTI0gR;Typz*~~&F-5<#Wrm~hHO;OnXH-)$cT8BEZe0gu10q5 zt%_{(tP7u}^Orq)Lo&tEk;GfeX+Pu-d+@1=;Jg=WPU#E5bf7DH8q*0o332KqRwVC_ zCp===e0Z|ZO>SJfS&V!#T(dJ1ex8T(LhZ3MatmcnPcXWg<>&=z53hJoM;k@%1i@&^ zbgyh6CPa}(buL`|X?rzxgcV$yRut#nrzd00Zby73#69p+euT0ueSLAE6QrGz73ZM+ zXuXEfks>HAm@zt%lyFjoW!qC=VNGd-06Z&s`5b8C#)=j-REhrg$7Az&hJx|=B+fa7KP`q#d4N!+5;&{ z#|A-^*tdP0q&T|}dQ2h=ITP+2PEwl0nGIYyG$Jw}bG|)SrZyP9izPpW3(kcLOO;ZXM@J2!hPl zn6}c=$OQ0QDxl)6_SsGtS!wt@oh>WU-;*E5=*B_}`oM*b%BE^_#BAgKs zq5=d+WJWecETQm+FN-Ts8qK8xDetpCo@Z*EDtHvnr;ScnjtihGo_AYK?~qSqHyD27 z?=h~rqi7huwVRsNJ>N`)h$JGnQlW;5+o>eTucnT$v=g0dy!Mx}Ass8dj#~5DfoJbk z@#id_`*=Eh3CEV;ef#04rqKJ)Jr_@>1UDh-j>b2m(pR zcD8IS&d7??A(3TyLn3pDK!`TG2vL3bV4%lRkb3;!D2epp^lnW<=g^!cEVKvj(k-PkhB5KOG=)0(2CmR#BK|G^LVNos$9e2UCOh&<^bY#@Z&6abdDhC@C*Qb`z z%j?--eqUS?xh${23WvzvQuNBFc|)y0Jr>mz1tj{#=S6?ZI!|`5XpEcPakz4MSj{~1 zIYz9wk1(&}q8lMjY=QRzt2Myfrl&9+GB zbffGut)p*o+aUy!Qq9|CW-8+|Q<0dN7}b8w;Dx(F-=_zMLi5ex*2zk7%j#U*cC596 zQ`{Uzax5a;ZpFFm4*E_RBOZOJ6?2qh5?mAW25<{Alig1>RykZF%;($<}9+jb-hnjD6P$+$RkFtziS!3>F`oebZ0Emq=%cT zo?#I^b74r#OodqL=FCQUpQndF!f?5w$Vn+IDBGgW^u`Zv5?J9zT`5o?~; zCf}?Y6IXRMPmQIc+aoBom*txSQU2oRiG#4>%Avl9l89+Z0BQR`D%>rKotO8GV37wJ zt3bAohBnXY#&Rr#8j8nUst8XXhd4B})v-dy$(JvUoTly$+K81JO?@F){JbgxxVE18 z=23Z%(x z%Q9(+2!Ao7=|_D{2}aMMD~I#kmgj%-JQ`fWYS9{E;_m;FO~j~@2=2EpdUN05R(Nar zjd+jKM?@;A{OWZh!sA|~(t9P5362!gpFohCK=2z7)DFgWVsjn2LoAtib@-5QHXVu< z+Ct|^$h35Fy<@Byz{L6E0of?mCvw=-HHj>(xX(Evq77IaId)&ZX?Tun+1mb?G3vNh z;45z{A8jo&59HOEHh8dE#?H9y=n*+`6w<`zII3~;n8i)h+tibTtjprF+nT7}@e8q> zHK}!`c+uVJz{6H?BL-#tPRfgM3&3@E z&!I#BGT3M>Jhh%kK=mMq@k)4pLUcY+32aq(gw*fvqw=6(;-sF^l+uvydOMWI%2p~4 zNB*WMI|n7>d@!miMjXHnoHIG7qD-Ep{Bn1k3;Q{G5d|Y03gi!ol!@%)%)CRn&Sc8z z=~)gx$HUz@q%!)~vCe~hG?E6>D6FS|O;dE=_*nB%@^&hv(6NZpCv@D9D3g2}I^FDXYCAUM8I#CVcFsT%MDi@c?Qq;+m2u%cM-)cQNhaw##XUYz0K8PT>UXIfxha zQ|oYnV-=eoCFdk%y<}Y|9>3Wcszg9)6T5OkP|lQrb@9y%PA`ru4hnk+Z}3md?}kky z^k)dhZx*@Oh)k#~x)7riWgYiLsvA423TN{1b+U=m3=M5y^-+{&ZYokChR?RHGe2T#j{d67EX&7O`8%C1<1^sh8m^ezaA`p}f|;cVBU zc4dPXrE`@#2X+$6UTaFHdPOMw?0vy-^<61AHH@fR9s3@@_GP+_26Shw) zsWYpKT^Zdr=kA;@x;JS)wu>_2p6a`-B| zvPsxj;dpm87S?e!eLUQ`Vr8;`R zp)^Uyq9a1xxv7%qxSBd^s4oi0os3M~!TN1Op-{RNEmns4QA7TSP`H(IJn3XRt3o)S zcvhHO;gSvqFiZW}VK-&EWG&wmCCCBSCc>Sv47ilR-a+Ri+*$TdwmOIz|wg^98fdsSNuRJ2EYp&oFsiVd)Eq%G6$}%c6>Qb;28Hb%B$Z=mLrNvE;E!3Tn?v^EmmS6QV^0uy#HR2GAq>y zT{VUdZHlOn(&#AS8|PcW6%3!v^QbvO7Lv@I&l8MR6A9M5SWr?nL)Hqb-J4}r?{!$p zNl7THYF3X;Mj){^wi~h-yk6rOy)^hVnsalDzCvs^w*rsI-gh!hm;v!z?JO8un$fro zr}A5wvi>CzU;K82b%dECe$lSqa^5_|FlG7L#w|uCOo+NluZzg>y&$sndW1mST5~wx za96n>j^u&tKOmcaeVnx%w?LTno%+sQi4ltev|-{!rm8JfUmD#U=Z?=}&vUTnrAyfJ zCkPpc0h9o`=#ItrVL2aK0{abwd_uSzx+1tYJ~eVBrEFkzWMx&?kTpFhFkQJRj2Upw z`?Ahbjxv2KO?T)}QHpi2C;QiqvdR=+d^6D^<+8I92TzK}!emgOpgn`+_`Aag!pjo6X0dzZjsk?_^9_$EQr-)oPX_Oygf z=t@T{BTGr0lj&lfWa+wmJxOW?|FXDO^=f}Chh}G#Cb#@Uf8x>1I^k+sR#>pomE{=QB;zjpl z#D0(qo-tp>jz8YJ2df4lTi4=&3n$#HmbP%= zcyHvvD-M#}9>5S*gtoEm-#-pz zO8QAHu@e{#PDiIeqf8-XVZGsSh#x1|X)UCmrun8Y+tFf~S-CeVQ!nGpX2xx_uL7sH zz?x~F*^L63>Qyq;6~CP7wldWSxWqF=MAm$qq zRhexa-cDs3cs)z?;|QkOQ^U#5_-NG+F{f9lGv5*cB^H{ym!oK4{jd4To%B)QC}0BL z10&z%9yCx7WbUI5@G(%h-=^FE$dPvGegexMQ0U#pS6}aQD}bZuSwM&i|DbF-h+ZRq z8aTk2_<;9pKONSu;aQHWP0~|rSgxYI9LD#fZ4$qTvYvc3$JWPDI=4{ff5oO0Q&tKb zB>((w`n;8cg;#ly^X*zd?oTw3%GtM^cTeSjUTy@)fxXSEC@)aAoEt7F%0Nq7LEr?eV3)1*ygNbXI!u<}x&SI8OqjKQ2|pwNT} z5fsrCwoduxw-6yqLh+PFYPr-yXz(*jONIg_{ZEeGA__6kU?vO)i&t4R}Lhw~W zVqzIpZYHHFWxlZN6;80rN}_}6J77-(b{y|UcHe^%M~`f$ECNT2h&8|LIT{wl)wvLY z`Ya6B%EqRj1k5>(((=vDJWF6n2`w}2G7!{qkik?IeG!C<2ak?qlBNWgnXXdo2t>%Kj`)e$bS8)$Si@S7 zZ%xlPM{*3_f_H1;LgWVww8a1t>)RRhG540*>{a!D&i|9T>?ecKuOw1MC!**7pMZ(? zaOBDFV>??cAqpV+-`4Q|QIkxquN!(&ZUBfyJP(V+B1-=MvWRcX=PtNi)?EmQ`ap<+ z6CM8e$Hk)RnE&GWGF}*D& z`RN1!EhhP9htk}cIGfxCuy*LB>l*zda?R2z!lJf(v&(fHsMORpR?H$Q37*mT973>I zW5wl*pG{4Ji1s3Eglu5bP9aDlW#1-tInzKS5-bKlt|V-tzU&LOWLk$TT=WR06(Bb| z5_x{`rP)Dehiqs|xRs4w#&YEdM~;C@fhe2bXiSoWwQfQY^SaTIVeNW2g9x9egRkXY z90U~$LCn=gN3IpTkY#!vB;pfVBS8oYIscZW+>NvEB-#r>E5K_&0y}%4T;k{HzEhrcCeU4^{pl-~2uY`wzQ59W;c9ORA~VaMD}J*)$v3 zRgAbM(c$dGh-)tyF+1}d@i#XnHX}Q(&Tj`7bNDXe#yUs>Oxmbn2CK9PvX%8qC&$J7SM zD4}D0xwApt7ClkImVP-trcC$U2S+oAYTqfj?dRZTHe2*{JE$zGS&)hARmXUQuv(h4|?1F*==uaoCp4at?287jYq8XX?kx z;6^bxWDmde)Z=58M*6Toc4HDwQdh>3j1zPZZmCCk>eT=31g$vr|KkMtBD-R-&9dSo zwjpxpM-JoSQ)5b~6HhA4Z*@8Qa026M;KHdJxo=q5_#R3t zQnsNo`!#Zu4&(59%yf8R;SQBXs=rkEM9>%eOd`Y*9e#WHaO==Yq)_%bJ(;zJ?6?$4 zej$u|oO@pK0f$5)1^KzlZ7@9)JxeNbznxSFIl4E~6ceO0EHmA%Wv4`P#YDB3Cl`}c z^<}1c-UsDkmxS8tqD)TEn6<+Aj6Ke%1(`dw*1U7L7}bx%B6BT9RSc>aQn{8ZqZW_9 znwxWeM9<$n--^YzMwTaah)E1PAJ*))+^RLVx=VRW%5(K|viY8kPt;5<5&(}qL8i_7+Cj>u)@%82JU<0F>Q z-fEq$1*1Ryg?e!Ip0PfWaNEhja6smBh)%}{nYiQ*Qt`&XzhSA>br+W+m}a_(kS$+H|sVOpvZ=jBqeqK}V>c=yp0&J@1+?*Ss4Zwh1dw zU7PX<2cg!TFJE|~u#vUAp83kAGbNXcVKsZhs5*- zF%A#NYL=O+xREB8h2)*YPUX_jgKWCx96j)_u@QB@1asD-OUlE9%!`F9!i{OUxRyzM z{2`ggByHJAK_GGPOFNhka#2ijxm4oer;!!uOgfVK(wTfmwE>oj$Nw~!5X1m?Y6wQh zQMTvW6?A+{_{nc##m5+k^rfUF`tto(XTPDdAE+e0t!Q#tHqyzZ1l>xVvSmxG@VA(q z>;z#F*OJw8y~s^5>Kg+q#?{)Ddk%;8pz6UDZ5)j`B^^jT-~XyOgN@K@NUBVWT+x(3 z+$+p=4X5rRkn*`owIj=1&pxHcB|<6!DuVj`dvc<%_>`>svbj}}PbYIUI`0un5D#4u z7tX)2rDYm8)^`P?Aqr(aj#4NBXR!$Ou18Cqr_;w}-Qr|T#L1HSB51;uebg5rQ$2q* zb2$OeE@lsjQmJc!heopJ; zyA+Gm{G3{X(c0#@<77)O$0+|_lP|7*OHa~^;OI$RNn2^Kk8rWfqxuaFuEO2jEx!;F z-%nCBFU;iiOtR(DLNtn>-W{$AAD(pP- zpIB1`(LAXuZDgx38OK-ga+7qDkB^XPgj=68U{9SnfN-CLdnMMWyVp0?gQSq>mOGTP z9EuYis(clAoKEF~BRd_QlL#I4ablYkX+vb5C_yu!mZoF8J4+PrPvphv5W+ryFvaKQ zMhj|B%k*=;y&$w9heZsVWTShq)euv2RfnFYOyb4|uNi{TUu@=m8?(-@mT{zB3p}6O=QB^a)7qak!Nn<1YUD!3 z&QEz)CIPd>MInMEP2RLs@jKiMZaas$b}yf&_Ek(iwL)c%kACeFUyIJ<1h&P9r@G^Y zVGCtR?jz>AX`eSHd43bo+?_()YKpo#r-z8L=MWgNzR^nI%TD=D3q72}NpN`0+kF2R zjtjC(V_W6TlWmnPCtE2`ot!s>gA%3sWF}{-!f_+zM~!_Z+Fl|LQ#;j}*Nce4uXYT% z>$E7BD`CRA^NLYo(%KrqCwk?#!)d(|=F6QXW#xzl7B1=Efz#A-e4 zf^c)V%i5Gn&mwTrFT&=Fggh)zB&_9_z9mQy53P8A4y{zs5fdlz0GX$3*D`a7i%TyU zaT$O}tBsDvSih=K8h!rzn3J#yyq+LmhB@7^uZH?Hcm(oQSku{E=cBmwB_QfYpO2F}JVt^8il#gz5-r)ls zU@ov1SVG)zJ0NjGi783|Q@+Pp*X9|Ua=%0-L2%t$#_WsQtp%Z>vF0GZBEu1C{O6td z0hl{Qv+x@sE+UvmA2hzYs7=v4^NfixeoEsS*IC4Ts@@WdrQ zhsCcxB=KtxnW!5#chMx(T)}8Zc_vJi#3X4vxBQs&zWP-M^~KijtZq4D+^XsqG|$ZX ziJGpdYJcMvU4OTSgi?_rt~}K+=cV#nEvg(&w>*3K87z)Qp-IMCo8Gm%R5{Df;OG@Kjn+@$l%gEGCFbd z>7Cg}#`_g)liW3kfJDL3^I#Tw+$^&+-JgaYN#`Ushq7>+27)O3AcjRv&ClJSmcv?Q zqPrJ^h|B~lhPiG+QAiv}F=`nf#`Osrs}41_rr~%!p|cT z(t+yclSs;Bf46c%p>>Ny+~hJmUr7bA>~fxYKGy82tU`_P^N?4*j>PVZ7nc+q+g=lt@JgkGaasMna6yt@P{;mwgl`)jC50s~dq9 z+uq)IsFmK)H{4U&U8(G@G)#BHdaeYDDY%(WE*C~RQ7&O(KFe*Y;9_|Nr!z{W?4WNB z%T-R9suu6)lOu6HID(Yb1m#GG0rmQMM0Ea(5uqv=(K<%7*31RDTWPi9^oGww{*2d6#wIf_Y` zhUwJ1s$GmWt@VyK%p4S-FV3-@*R^HSz^5=acQE|tjq#y#sBV>4AOiPZSrWN(a7pCD z!FaI=eRd~pM)K|n{V!s65D3%397~p5^yXNrwO;pYqExZp@9E z_+^}iAu?-jh^QC=iN?77ay0TW+Gc#zO$V|7 zzsDQbl}Aq|E5UHP-+-7Sj@G=Bpo$wUQR(J3-Gn%QLS+A>@})-NMmT32YNNZ= zO~$|5=p~LjD5$vK7@Dg0Rv$9{kg8v)rWntp>er`>O=9WE3^#%f^DX`ZXQQAIM^sWk1}VfwpGNyFDe5FO0)&^(&pV;1Rr^ zZ8V%NeYPVN^F!~8UHZ6AmOUcB(JG7oCYk4w-y~~oeCN_Ts$-0HX?lLqb*QXtq(+22 z1@mEv35F`4!8`DUrI)o^j9b(6o~qw?G)=!sooc+1rgu)eO-O_^QAgtcK4SbEgz9J` zEnV+iV3)U-{3zBpP$NIL^&_dAu%VG;D)6<`6+3J5jE~s7Pe^2nc+!NZUK&hOOBdlu+!R&7 zi+a!DA_T@!Oki+98b`h2?q|~nOE-EQ+FP!pWV<_>vKDpLPAd^#{8hQ_p`kUwt!Hpk zK%-n${QVh-WuWLeYn^yDehJTuSV02z~%~2=D_B1CIhNZ1B^p zg$+0T7ggf!l^VS|Fo=@GD`GZQZ=xAT{1;XIC>!!$RCS|lfJN2BW%RlNSOu&Fo&=r- zgpxV1bCMjL%Mbmbu!zHlFWeZ^#Y4@ls4*+OxXbWlq9v)Ncs*!hcALY#H_mj>XY{)1 zi!oyB;u^LT&*(35$Y37!F?^ZpC5LCy0zNhj6~(c)xfNk}>o`o?1n%j$06`q1#moI5(2hY?~N z?46d!G}|3&pH~tYW!%wGzr4*wa4QuAJ(N{uWBuBWdMma6(gdB*lhcncsoF{%uhdy< zrpR;LX|%qwN=m%Tq1n2F2+>0c)v4xx%G^6xgRkQkUfqNHSalNqFc{Xe`EZ? ztzUK7yqR2LN3XT=tU+qWg{L94ddl#~v~*ELe|78EtA8}wbkf_8`Q#P)3W{yLHF^bJ zw%D|DY%A?($WTR`t*xP0%0r3r&l2UZ)+#@cC_ifazLVbhvNsO#xfla>1{Ye_@vcg^pbY95H*7 zt9IHz%CsXL_S4v+kXQI?G% zv>}mNOvVXA?W}js*w3VV4x9j*04}c>S9R7O(ssOWyxdvu-Jt`_(^5*Kqlw4;Ml=EL zSr7)kWc=6}``y;)Rmk>Zys@BAzg_*65iZo*cR#@jgxO6Js+Pk#A^wZRsub6+1<#8{ zr!IPXg!kGm`jzcEuoe+EtF~ypL-U{z6E3({T*qaP5e?ba4le*E7Ip^ zwhP9Lu6kc}f$>aN{WofZk=#x1+F>%^jVS)OYP(IIgK?j^+_-_)>a)i0yWwRFG*)!e z+ZPN2naJii(xt!_0e7$hRVIZ&MYK{oD=Y+oe`T+Ms8w7aPs;#Ykif8KbxST9z$8UHBOJ9e;rN7o6#O3MpI3lRVb zdpv2RU9NY$<2kDfhw>q**qauwMC^U5?vx?0Mta%k_mFDiYOj?AIw3a*Pw7(_4)pJ@kxTPd*vn5nay~ zV;#?rkiPY8tXcAJkV<|uC`4sT*$u|SJ#cNyjOTmk*Z8hxBWkON|K`V2)D~OV@>{7g zwzFtl(Y9_pF2!4B*+q?U7BYs+inzvexZ@fxi5V1)C&3=kc;2Vt8c+NZg~(Eizubl~ zdhnOs-qt?z{r|)n1rxZTvCI^2WH|h`!*99sHsw5G!HBN`x%lAoH^@-p%CV5Txzx!_ z)W4a!xooA*qN+th{+$VG(U1k3e>qv=LaJUP^$I=9msjQ1K-Wrz#drca`P2nu@_|{R`qY<9aM^Y zy2@Pfjf95eJ0NA5Igdez-Dt(Y8-5-C)g`pnQt@r^OLOGiBnaEPKE5Mj!yJiA7s>~v zAUmo7ybmSbOBjuIO-{;%QJ*EsabGi#QZz#a-jQ6P_l2S@Txe#MBqc)R!{V zjBq{NR=s>bUfSC90F~=lDIQK?_$_3KHj4PjK3t}_4^!;%wl;5MhVA$-tf(BhuO-~% zJCNoH5G8(6sgIGDg7^gTN2s9bwZrl6jg?Zl{um7N7dR~Gl{NA`t6tnd;aE29vS}wv z^JCh!$gTWn&QhRd>i_y*Q)bC>Db7=6F#M`=IBZm2p=YX<#=}?WgNt7RQ7#>1g7^h_ zPRNt|qL1v}QWN{Gl0O?~uF!{S-<~si_tXn68vv0m^tgHS&XvXpizJ z*1##OSqPd+K?8~knop+3K308xC#WK*DiwZHSbC*ZRvuNnepB3FSy>&7fmiAsdyb}w zB?n&OTcB*&Nq>|WsBH_J1fB%;Z!s2MsgF~a8Goaxy4d*7m3r6INqn0lqA$zmUx$oh zkDim2>smo@z0UkCV{VCfPTyS0^?fbpnDzkJL@#we$MA{TuUa#2U1?X-+1!Nn8M z*~}^-rq$Gd#g%$3Vo@tWxr(>}(hRj1D)aa^MouriNWID!Le_VHmh24?@d@(#bToX?0rrsLs9a~4QC~+mHR`Lj-Qd-4%iPF@Kdh>-O74D;FWMwLA%yuw%k}y0dA?P(` z+C{^8wVu=AHmb^RLN%jxYJ!|^Ra8Y3e=zDb240O+bTMwZTK`r5!BPu{MFMQZ?1+a*h6?`fuaoYj8yxjUOfXhtZ`U$w$T*N%k9mkmN1nNl9KY{@Rb|hW$3< zLO*>h4R5#>&+8w?+H3Wj)pw15OY)L&Lw}MdjHe}e*!WJ8`;4+*k=$ZDFUc@N9YB0? zl`(Jt^V#b~n=%L}0pzF7%1Nh?-bpGyc{Y=D1F4U6H)%C#gmf*b{4m(Fq}zad8u)cF z(l>y2fy2Px0TcKa@ExGDg=qr_C)&$%L$Ln!E_#}(eX`#;Sfm>nX75#*S9^iZ{G4 zl8I%u^(rv0BSiVEXe2ydu?d7VH9QdY_g}|ayAW;{MpWeY?BC+@n}Vd;#lTgtK#*e% ze74Fb%pLx}ORQxbU!sR3)*?>3jq|=Dgz`f9;#;etLiEL;@Uy7Bvk zN##WR#qEyU44WIxi6mMp>+UB{9z;+eEZVZtgqW5AWj2&VWKgzFJxm#x1UF?sGk-Cl z#E1sAjL3NDLp8$)4bWZc{l>p#x`xBHbDlcW8tC6IITQh>EKALAEj?MDtoobfmWfl$ zkT|NBeH~{WYR{>rJZyyn{?iaI(3;R8oG@!NLhc&;I#I>qgAkKeu9A%ND?9{5X&;VUcm&ApLPp zXpK(>=^M0N7mc}t^`fi~*&-$J%NwezieG^UMk{R{&G+^huMXDlQKuN4yn5%NM@1DQ zN6#|6sk|=9=Mo0Was!HUD4U!VHaRE0G4Ao|1!aFs)UBoNWB8-*Q}>K$G1@;)SxKVo zu`9V1YK0d{qmN2m>Iv>s=#>gm$(K;aVf@3Zx6j*wC-NZObwWhFR3A!E<9$%2aCPU% zcSiaUHZyk`HwVi=ykzNlQFAdQK)*8!)=~>!$YmH}z>HHC+_l>>7^r!f&=g#3A zQ;alT8_q`2V|2Jqzxj&AYenYCSuIY&*#0k6?U!-6&o)N zBP7|&cF=iK|8d+#~to^$TG_qoqBUQDfz^G=3SAuH+X&hMM6ukk*SvYP-)`xf)TH8@IJ zKQw6zyz7VF`FXrNlKEQmhi2OX?=1Jr=8p@!|LvZ)=a<(qLGzq>-~88g-k*Bb{(R3{ z*Lzdko@ZV&?=JLS?s@!ub9y1THos(M-Qc}^%neI$&>{P7-b;APb+CQDtd)OV`>p1M z8@v}zEG9bVr+h4)dVNP8=e@9eb;}}eZrX!?*6cgl`RS$R=|$e` zTjRz%e!8p2A=B#rl4QA#7hseX=+Q)~oaa0|cj(gIPo)7h*b_de-jLCna1H&C(*Jpr zWnL`x&h%6gGb<(hbCdb3)H}&@_ZMcwV%(q?%*@4hV1DIdZ+_TWf?WSc;_T>h&y?#s znumL0(lXKW>3jv}@iWv_IWVoTb=I8V-rh)1+OexJotU`mwN-<*$M(@kBGAV@Jgah9 zJhPIr6}Pgae*^2@m$U2uFFeN~VrWfQ4*PJ!9@dg}x`)QJp0vxI8!H-(yF!n(sCpF- zO92d~f;=kNB`TS|+r#A#5JXgVTo({|mM4}g` zvP?WhHk-!md@p`ldO9Tjmro%vB;4g59{VSexD@MBf*z^HJAEDxbh~!0y@UsPt86}p z8R*5On>&$<>=N_YS6TITy`ZfRwM_Pxw7DT_CEL&; z`rhzZRUwaL!b)TiHH>2RW{wWn)|PJx@#r zbq6BfB8+&5K@_)8THn{X3qOJp>(MrLuV`!r+T~3eFPH*gTEi1;|G&`z8rAU7a66Pz zp)u1?+Hqpt_DnWIWy?Ki2s^#~?ttF^^;uzn{YaCLs1!+H*i$R5tPQbQSQ*%MC0 z6~O3Vt-1G3?~?Ei_@5OtoG!DjqX`)(bW{~#xV~KwX&`(<2w?}KKF#0uY=>A?^4`mY zy`SrFMWdZ9?QW*;x3|wGU$P@^vrOA43@$)NPieQOjPE}z} z%-go64evR&lheDBpMTnU{=a#XBCR|C0+6PLaEk5KRC>rBk&Kp22x7U8O0u^RvW4*Y zpm<|8=nxT|e7TNSnaYC^UQt{Z3r5z(0?~+1M}zZRCyjfh6|?Jx*Ltr~Yx)_^TfOAj z^4RoM#{y)8p34+TcMfMuVH;+LO^=P+rr|6{znc|$?tAV~eMd>*bFqpj-{S~9>j>)x zTW736?KMenMA{}*2RFuQA{*K4!bx~E*34Mu4c^nZX=2-|(AwA=G$AoLm9@=!gY%ea z@8p&KmP`11_{xSBEo7g^^}LnA_Y#|kG|6|PmF$J7Qr7m)N}H8-5;;h75m=FvviN@U z`Z8~}=Pzf?hs(UV;j;*m6q7z~C~Lj|{B6`fq$R%TL%0@WtaB89D?tG}I--f4e>2br zPk#{iNc8uwFnGV=3HG}M(AEa0Vu&`pf>M>@QLH`?57b32Z>!gn$=T(eGmypUE0S1`G$ zNa4K3TRQ*6b(7asL71{4>TPM?oGBYJ5ky1TiRt6YE8QLGLC(^`0HgWR6pWDY4dYpa zY2CgFwa?&+ZqPnRcaS%Nub$l2GNCr+4Kkyn18T5~V^wYAGZhlaMkK_4&E|M7>Mq=5 z_cntq!L?VsXj^~vDA2H;sLJ}7{X#AAjkl;+!%|yBzt7)d>F92;A468%W^1-&kxGb+ z*?f~X%ai)4dHp8uO>=hRW@2sI|Lc7x-cyaWy`RK3xfDC*b8CB07B?b`yR@@p!e(DZ zsMaHu<-wW<%$%Fqt(V5Ff-VGqk2_0NU9YfWCC6RMy`Q~@s&*`}K7*+xFCAOMmYP?x z`i9~&T|PQtH~PVEA1nQH?{STVM8iW)P(iY(D7u>M$maCUV)~JTK)y{s1k~R{B%Ew^ zQ+#moxcKWFIZTXp_nJj_5q=kP3B3l)DJR+>WrxsrmORuze2MiFDse|-C(0B^P74y! z!&2KCxXzjDW|ciNT+t@IBC8XS)QMAs=U38}cs;soi9!}O z!o=*p#zClxWRRp)Wre@@ukleWcgO9*2eBBbj9yi!aJ&LyF5rThrklN`?h4~BBg~*f zpR_fPR!zx4!%0RGsyf7Br1v}X+*?4L$dgw5iUTiAf|oJ;mpJh2lHlpVt+8J@@cBt_ zD;V{5UVGZSQikp+IBni4^G?ppa(c*U%GL^I4l+|>{!->0>nS>IhA#1r%AV}t()NTz zn<8*Gc-qWT{^My;{7mug>6dO`o6#?RaXYbUq;;}t2$fF zMP*@d2urxaaZf|EefTF3Jp#Re=j!hel0p#HA9|5>c9tFZMyy5h(vH9Gi?7GKct`b{ z8h@^(;Z9z~w6~MVKRV;sH5&!oj>CW=m^PzjaO|&645)}j>=`X%Wutiww2$kY^BQ83?nF_H&bqKZR ztAL6PbSSLND|U}=v)_@Dnp5j{9E;1cTCRa4IoGcBlwh=dIn$F?9}J@!`%ctIJjq88+?3atW3>v6Iyz1!a<8ECWj;z|>0Ta4Z!R>P3Rchte3 zpu@Ea>k3Afwl8$C?-Hc(8Thy28-;J4q}SeH$&&Whs3Eu(ZdV=w zaa(6Xfon86>6_qbK>_=sFLsHyfA|tyxehJ~nd*7=bMxVi-ihIBz=a!o zypA5H1*7fr9Nh0gehamfMMwi52HCN7X7+pF7B%5Wns(F7fIye>4EOdj#{ysr;6x#? zK@dT2e``b~teJLCpJZdRP7Z+(`L0Dj{qR%mOi zjfGw-D4yS>qov*v#mW%6eO=~>+u1uj^SIe|yLZ;u_b6wtJN#e+)4_h%j-y1(y?3$M z_`CmRHr?f&d|i=*im4DZdgmpk9TF^8LxX+Z;U@0u6 z*L1GG`H>k_>AlGF=bxJED!r3Ez3-ZbE4`P7C%<*B(!CcOuK9ohLRl&GvC-*#%XUm-`>%O8lP}X$WDu+PNYVs1_Frx3- zo~qi8G2pau>{SFPudC7wyg!PRljUw5AQWio!1b%o=|RZyn}yyX=983py`mX9;@ zyv(+Iq57_Sab7g*mWoPe0d4qGwH=AZN>r)%lSIXXXspCC)$#h@1fK@zzK`RLuSCQ% zpResm2@mcg1&6U<(;Q0tGY{Nz2YGC}{zfhb(DJZ8AN8!Gh_|bOm&eJT{~;tUh2#}f zS}H1WMkqR!aWKV=_pOMWKgToGb$$00Ml@q^s|!A4t4 zYbvL$|8EnRy#pO6a(mKn<53;{4;o?-H4YZ(C0Hr&yb$bpVO^KzDhZ0DTyZY@)H$*5 zkM`nnY3GCBsF}Gvd=CFoF8q7`4T3Fxhb?!hVkR!?QC?^+fj#!a&18Vk0STEZ*XwJN z1sj*x;>b^e#b0x9-3YF>BD3jU?}+fxA_-~yGZ7`Q#&dhzeM?E=j*kv()dDrd!0x8W z2wcKocHc*PIPGjg4(xAtpP7IKYfP`@m(i5`ot{m|oaV ze5=b9^p_mk7SE+Dn3l7oGTFR9DYZAheXPQNach_MPf`bk4x`le9#!PWfJ6pkGF9W z#MYQzgYT_}L)U?qw5N~IA*~X>(rHv`WD|-kKD6(J#2Jv- zZUih5YqW+g`O;9Aj?w^WzU=|QYoJ|O}&h6UZCKO>eX69M~-!%B4b!ly1 zdFq;uV8x)=eDlIe@90}TfKqxkXH-MXUNq!@RfRfoQr5(@cv!^gi=w2;=vdF3lm@)1 z()P#Qt|`NBxT?cLbY1FZo8#Ov4aq)qiTMKDVbHiQf2LzZ!@7_eJ7JWk9g z&DB!dw)j8lJ5oO7J0dNIIkjOCN0+YY8r_pCQ~Ygu6}=>J{=tE1N2L8xdi$@Ox_mT#cRtg3KLUlFXbhfdVNyEpn<#{%3$i1goaNPijSr7GnSrc~F1tG)}$eOPrD3-&j~ zHH!U)c(okcuYw=4_r!2iQb8qL8o`>QL@UD zW1*q7-02-5o3zKkm2ggE$`eLoU6={rtn1u|i7S4_m~JfqMFKr?HsawD9%n`EdjUB`y+b2&KC=cBMu( zcA=<0%zq(1Y(&D~8f{Wu+jZ|}G?sfme`hdKBp2tf3fD`AKqdEBI{ExFaozATUujck zQbUd5t`m6Cwo<33+Mg$K%f#hOe$gJ=X#>V~Gv$xrh3i`zeoi!JMsQq;Hv^?BN{HkE z1k<)uP~gifRXX}ZY&+F6B;KO;;T!7KTwm=yFYKd6SD?){JweQl1S6QTsqa1KvX6Uv zmy)c!__qVg`8$i)-|0y%`x}B$?&Zf{Ow#U+`CK&*_-C%a-s()SPWK z=;O$@b%vNKNzi}OX@2;ScUI;+XV^2-O*@8~IKT)z-}oN(PWOBqGnYQ>ofdx4LDK=6 z#Ekkov`Vw;#Qw?_?$sMwYQOrZfZg!JyjJZ*8h6z58a4cgu0}Ia=2&hdc63_AHm;IN z%}NFZ)^+h|h^~3~@Zz=Aur=nd*c#?6f~~Rq=+;;c>tfgZgjg@qxwLqD?BGY+ zZ1>>JmPorBM%N;B@64Xl9zQL3jJ>xZ^$J1;c%JhduT+AS6_{)L>z;yI)Zo_GuN|*Z zK^4ttH1zxow^M_85B}6xw)TZy>^jN8LlV(JNM&4?)_3uN6U_RUcFbU!&d48*iqllb z2a#1#qH+rxE-6;PPt%=0I~8hPMunLTgSTgL=6+^5ZixNDKa#BTExh62MnpPZ2{D8; zRggfcN`zQQ^PE{piG#2NgbP6^zvdi-;M0rA8NwM_%bMLwoGrADmy*V`uL1wur?7U_ z*Vr?fLEsN-O4ApxqNT^uwr8Ho-k!OO4>+9E^akb7t?5nm#x7Tc2304fH%r?mXnF(R z3t*k!ig2#`^&O{%u8F0k>zhCkdt8c@=Z|}qDGwhYn)NI!-WWSIRNf=Ao#5KAJO8*LD2?>ty$sUMlvK zprEK}I}-FXfE!N*(r`oC*I`$;s61nS7r<^Z($J{vA1!WZ)!Io&QY+6o-%u zJeZIHp0Q2K`HaVlZoS=u}t1UZFPh=WlOD(PJbR~3kS^hDAw zUspmZry$W=RlMJ+G{>nlhe{Vv=}(d?b?VGRHo`$iQ1X)mg^+ie`-!-qXi_CX(WL5~ zM5Gpq?elNXJejpUa}sRn)&vVVk&M{*V1v#ROEk0pb_Gti=wMGECvuy(7cIDZ+>-qPW7CY3|Thw<0 z4?*Yxhv+ksh+dvVbP-(3LmQlZS;D;l-1XqrG1@hnE4GE>6t|HLp!h@-UoyqB`YGP= zO^4v!Oksq$J7s$&`+hQ67W}(Lhmxq1MWw>or~mFul0A_`tjKbN|8=L5dQ}qSZQ$VZ znRQfjXw>#h%=h0_G{dP#w$EXMnf|yp^Nug0y(;lTdY!AALj_XnIVm`E7G#7N_Qf~nm++$0+nF4DQExOY$uPC_*wR8dgP1C<11GLv>`R9Q`F z)j7oa9{bncPh~apBFuJx+3t6nHh7iTJWfF)pZvT&=BcU+cbphnA8X64kL9&&jV*iz zvy8^{W6(~bG4;6`ktV8&5YKy_;lc#eYFW_X*??Bw7~VnzmM~abUEAW%HgI%uO>b-I z(#(}(gpL<6>5wrR4}!#)vU>yrMD!E6jj>bH8toS=fA55xvub(whw|z3;j2qyzM-pz zxt^4xpTAv9u_Sz+FpkB^X)nf3&3Z9*{!w~`tv||)W&wrq+-yOR0~yzx8@r15;D;J> zo*F|hn?k>Cm+O~o+SMo_KasmB=A(?I zk9eZ_nH5+-JS?uh>|Ve-wO;n4&>5c>@bF$unP|Nx9!+!OjaNr@dHNe4ps@+c{<1Sp z*?RI%F>yhw9oH~rr&U}xCMrpgNsdjKGcQv(YGGd`4PDJ3NKmL4go#S_I+f%D+d>(Z zRgY&}6z9K}aF*>o@ioPwi%qO(9~27Kx2J|(Bia{HS;>Uo+N5EoljfVs`WDjJJ*_TQ zFr8Jq2oWZ&&Xeb6bZBRx-@VNaG#r|?F?M*?M*Pl=vF_Y$v3ok=BSX&Zp=k}|HIUa3 zBkE``>1**V)in}VFzUrvj0~r`a%{ga0Z`BSq@2p68`>C(5;9GfY@tHHPEFeslbZR4 zGsBhj%v&7qttgf=C&8A6u7;!;Q#y0U1jVX4d&8ghFjdlqXj`zvQ=*CDBuMU1oh?lMHIX*=h6No3vst+f)Y*+YIcrmF@%^mZvu8-|`bqSJg;$nEu=x`< zCe?==R+PXBa9KJawE+H4;t2A$aM7hy<@ZbQiV?hJdwIV{4+W`w1L;Er&Ng)&+qflm z^rJ>b3}@=#Lsdv!^oQtF)O)EQHVtvk!VPpQrg&+;ICEv3=^PRwS9R*f{l4D%q`FR0?)N=+Jh_v*saUof)&z$ z=Ydu0!*s}zr^ODft?haz6tX?uj9tg;%xl)-m4T6 zjdm94`1u^1kJOQ!ZUn{?MLkA!B+M<^8jzhr@Lqu;4}ueDk3TGjf`hL3hUu;5>+8H1 zT)}IWwvasWC%R2bv=*{?`Z_j+5*=|6WR9!t_^TsCn)f9T{BE81s*78h*Skx#q_o67 z-Pn`O@{seOW;4Hc9!#$J##-;x5eccF1=$v3sJp{#sP$%#eD_Np*i-Ah;4(r#7VDAE+<=Pr!k{QcF0k{JV_86>3y-Dv*y&pen2&-e80mx2D?l+Hr zAy$vP>ja|Tfndlu7GHq7k&mkJYh#Zcb)*! zcqx{~mvD*#>tjX3oxg|k_lU4_GlH9u&fg=~$EGtR5>)ZgfKCUoqEo#=QRU$dPd`OR z`c;XW=UtKZA~(3a&fi}Cww%AM_3V&BN&*tV#hpbXUdl`h2i6QP8nHeT!R@awz(<~) z3gtWXhE!pE_oxIq!3I@gvq65*9VY*t+)8@$^m@hwuhD5>yw%lO7v_4LMA z;g#2S>~TUMV-<}ef7cHhV_WD!S_Pk4V#Pnx)33ZQa+G%(3j2c}v6eE0MzC(~32fjj ze?F1zDDs~u&uO4VUY;vF&(5@H?OtV4kzR!HlR3?`ucrRB})HSKTxksU9> z7sj0UU2#jIUY=u3vN+Fme0^*)RFT=)@{7jUn}M|$_cd)gwDvcwus#b?d*t{zCwBIl z*nXzB2{-t=%pQqhypmzBG{#@Pnuc7Yqo!rxW!A#73{xFpJ0AhkP@4n!6Q(Bxx8_hH z8inIsf+LlX0Va~TNTF;p2X~93&U2bcKfIJ(HgIK z3L}d_j3>cMgiAW5WYjt#PH_;cjC8f^#A?W==jaWVsJ}O|Qm2o^^X$&RYgML3TuGtJrr?V3-}goe{}TsEa&LMr#?Hbb^+pKQo6WNkO4uXBRY{2Rzoaw5`)dcUIwQ+a z7Y1p<$-*76dxQ4MmI)OFWIjJ|9y-rq&rEuf%$|pmDh`5_$d1h(ybPO)GBrPPaIp0> zjop%+2^NK|>iCLKf=ud(crz2EcGTy|zh{dOzM9mNEGkXdCQaDHqJ54XDNO3rL}V?| zsTbnUhdakP{!Vg_E}@6TPOm_mnep?%nH<|;_lh3ay^^7eIE_dLN1{jNOkERfk}!)+ z!Yx*bZR((>4|jNLW&q?pj^N>*_90*CAXfv@Df8cyaU*OBs;L*UmK9E!%jsnX7ETq) z8&w06JEY35ar`fAOPc>uwuDwk+B3qKNB?7kW2XyJ;KK8Vn zoM@?yuxflmY&|{Fm}g1EW`oP2Mnu$@axU3@S6Iuq=A*Fk zAT!V+U)be3!5?iTtvEi%jPl#09I)@<`a6=QpNGi*i1aJcsY&tGNKI7_bFV3IvNrV5 zf&X+A)K_Sf;-v24XX7ES590zU^4ofYH`W+#jj^vLTA4;Ghc#pty&B0}=m;fR(e9}b zzwaQ1+#@i-nML1OlR0;QU=D(>KX%GpK?DB(1T(D4zvGP65QY7rEirF2!hXj(PJ!7P zTjB_&!dGcg@&ESr$u#IKDwSYD1iNvnbemIYE@jUV%n*W!#yi?KRpH5T4a z!!Nip|H`UnDXbjNM~$eLM+1M{p*0=0HdO(&`&ng-v1EifKLEuv18bN_D03nvfv!gpMb_P*Er<7!s z#1)C63<+m6kG~72Uf;1Awq+#3+ZAmiaZIyIishDbAT`?-{4~xUqQUr5sXi~tM$S(} znY|Z{k44aka`nO~1$@lIGd||WU9$Z?g)1xA3%2#%pI2#0w|U3CwAcH%d8N@i)I9x9-oTzG8@<1E@3~`}_da*}{gn?q^3|2q zk6n7@d6j!U*zVoxFnxGH}CoCcf5b_>{_as+ZlpvgYwLSKqTYFT4M)Wx=~vK2RB4$&(M?v+VBW z|JcJbsab7udP5KHUs?4y&pzjGvnU&HjT77>d-N`?CzSCk1gMG;BC(KGZWwU zjxwv8y;&EXM(mEESzECdQ7n83<03MP1M~|ox_HJVmtIyhbJ<;YS1!MYVy>e#JLMkIwkXDgu zNe!eOr2V8rq+_HWQqE!UlS)Yyq-s(fX$z_8FrQ;>;g18PZc^Zn9Lq>5B~_CeNKK@D zq@yJ32nb0;_uLZtbma?&bNJ!vQD0O=^{6e+y}3X#f4RixFV2GUMa3+W)~ zD5-}O;0^seAO971?m7LT_v2B+n@-XEq~B6A;e8JH^8d}Gb$IXeEd86gPuKdtnGbc{ z%Mp*AT#xb6nXXx<&2e3~oHo}T<$CJ0c}>@nGbSy@b=MhlpROm*m=AR=>oHS4=Gxd} zHt6anKe>xPc9WV(`$?^&!=z)R6QpiZaVt_m@_T{N$p5`_maF%ipUaiOvpJ+Z zQa*{fu0)iU0ohm zP*+_2d|i>jkgf!`igYCwRiY~y3v>7C&MN>kj@$F0 zWgQvrEBMdTy;WxT`PQfri_!-(K)}Vru4>?wX7TM-w)yiYYsduui)VYwfa{k>ijX${ z@pSKeTIQNNB%Ph(`PN7i8g2PUHT~&yFAcMQ#6exnr25~RMWd};PyL_F1EZ~pDb18A z@|rI$wnmwX$(CiBMq8GzmG|B9%rEZ%_>0lj5YK^5b3{)q{k{2Ow3Y4K*9m4bVXQSe zbtfd+&25t@yv!PVj-KvSefsIz25bSaVgcsU#&1~9bB^0w^;3Ot(e_I6L*}6p zYpiL?vizQ^qvo9~Yl^4osQEa{n(Qf!nW1B-xjuHfx6BM5Lmx}VSk{Dnx)+YQLj$$e zGv4){XWgo^6`Vcf1b!i+WF+ z8z)%fOiMOA;=9~^PpGDal;Eh{BiYn6!*iyuCiSVFynK(z9SbK)JZ9Ed_*X}nLm6gP zfi>|Go7V_iX!Mz0yfynLm;^5$7?0aO;mQY=1#F+VIMTF^wfu9M2Rv6!ncYdx30F0+ z9l)4?*}owF*9uqGncfZfv*z*GnLnAbYMRSq!u;d)@32Ox|B zQ=^j+?gkc(BkaSs-+?9LI}B{cIryl*8{p0X2raymrU3}E99S~K0${t(LCA;$ws!!& zGGHwO@U0LmJmBHg0QU`mH2~W`0O1Z`tpgD5bzsR2JOJ$A0DNu04mtRiCCGmgU>m?Z zn}BgX`59W>z$7#JiFY}`{5j{A3jxalmMAA2^MQqcm64A%-dv0agaA z&MuO@liS@%MS>J*2DU55EE;c39J7Bw-bwOWfR&oXN z@mB7bo}|ZBdj)wXf$g+wpIOIk&A9#ss;`Z}s(|g{Z~gK~O~9<&Grd~`uyuT4zBM-Y zFyLyyD+K1J8oGh)0~U3e4f$4XY8LOO6^}pDyTI0E=0MQ$rz{Pg>1`NdE2NhupzQZf zRflY4KYjwrzHOSBHUSmWJ)Lzf?XwxgKaU-slDH8X($!NR*QM1j)&;mdKmiwZB_WPw}C#RKg zU&I$8D&r(Ep#tiz0$6>E`C^ha&C|BjOv|$-`hvHK?lM0%o;Hds0JL|I$t|`frv_MO zXstNY8!>anV)a_`XmY_a*lF6YwI*@&FvhqWpr^9Z3_aht~9ylQ9)q& zncf+k?9S5_=kauq`;dK~dWvEN+?Lr^`Ia1JJ>}dc1XXMZ0b2-+9@{^`<^!8Q0JaoZ zaniFv%2fd?SZ=;hE0j0GW|Jwwf$#}uv1wmujZHm7u}W@>%;E{w*dez1q?#H)A=5q| z?;*%-t^L3p@x6K)oo*GDMt~*ejT;$dD=4#)+bV9t` zIsLCEuY9e^okBl%uN7nOzYyFNQ!w!dxUU44exm;g%I2&yPfxK%r9}C*2mQ1MXUi1$ zS@W#;S(uGvheUyH0c-2zG{hY=0RtC8mP2)B)P;~`=W}M(g?NCG4d%WJA@{)zX5)nn zuh3KGUEscj^=EqdT9-VIrrR|9iStG3&Cmk!@;097<%1m;TIZ)80^Ib?Grb2*d$u*+ z)E7ttZaUL@IK|Am*qUgX0r;$!u_SRX`%i_I&jc>QU94b*%i0PvjXTd7kf{y8+8R*? z=8c=I@hN+`jeOf&H`SWvi@d5zBql>8IRQ3q6ny7Q?@?P5XPcI(uKkuzrqQ6b*Ut2A_St&Dlrjc9^P9{q)8Kb)lN5qFnHB_TI`X=|$!t?r`Wt6@PnpFz z*7=1MfDiI{rR1Sp1MC1Wi^uc}lInmp16$pv6|IzAz%qVhW=&@#?f=oaKF%@nT7l_V z{bY=KfF1sk**G0CAAT#r0=sn!d2b-F#~hhX>&o|FG~!wz7@|Y9d(`UOl)aSMzsFn` zf(pfNOQ41q(m7EqozY-LGqd3T)2Y{EpW9}@(r0@7~zq6?RSS$(d1h&Hbh55xW+Y$&K0)F(z z=5wBjPXV|uZr1%2-{xjnCR> zkTrI&2<2jRt2V7ivxo_)`P}Rxzs1%-rVTV>O457!WFbiT6_hCgwl{8FTjyHVxO!j* zlFG@{MS<-D*4#f(Q(J+R@?o!hd!jHz#kv741+*`zSTGj_FzlRSC4f!>I+|3h8raU^ zJu*{FJM8IJ1E9Tt;vE>*%)H3xUPUj9blZ%YY&c!1e;Gkb^hc1g=0Um0SvEP6EVvkY$GDmZ=7q-89Cj zU~a#x^?+f=7_;$GO|Hp5ku*6gr4_5D_4JKNS*S{2D}Yt=w|+s=D*oFCY`#4>GzhGe zMqo$r%q~NQ^QQOo%|%3?gX9$e3&k~61s;iMxQtO(P-tGd48f}`v`LP|HHR-l-&J$p zVhiHs3*`E!A(06ThKqXo%&cIWft{l40{+%7NZJXkfO32?E-`Ws04lr4+*yQ`*hf~A z`PVY4iWX5-*$hz1yBwcdGSTIlaf!NxD34EB!ENa!oUx8_KQYVX&ZK9RvwP05+xsX} z0jxGYD2{R4GTS^c6FcCaYhL5(TeYwUBhp@B<(MJ!tU)hbPNmJjs^Y}J+Tcnq>OsH1 zNB>jzPokSQ_9U5Ozt7M8ZrevOfnv)_3oyzy1FQ1c-ehVC_pN0;m>b*K>c&?2tR)(g z2`TY=LQ72c6*On}Ej`RG%>!3J7VEa2-eYEXfi)>LbRM0!T@C7U^inH; zHQ&*LR*|QqR``7lcj`Vaa=I_SOGKBSlqO|&m`8S3ng@z8xBle}ZjTx}(d?pZxZ&P@ z(HA3&CZqjVVY`DAx!~^@1dyz*JfL7Pu$FTQB7wm64=7g& z?7)C>tAHIGP_7=>p#kNhz}mtC3hoAYbU?xVz)lP(cNkdrfO6fyP7Nq$VPSd(l*)HWO ztxi5rT`32O!vR`jVBUS@*0V_A-uCONMs*6!T1^4w=rxxu7mUo}Ix&)VF#(m}iuD%77 zsk9$6%_VprtG{MGQ2ya6^LYuLP4NRgy$AZHsg?;5TJ-h2ahAEOJ%=fs!&q&hP*z_b z{Jy>Y_YKN#;@%0M=3mJ0da$RryWh=Q2&lB$9GOFPW!19Vwws$X7hhxHLk>~r4)xc1 zo^h)iyC}clAv0^PHF?xN@)KNC-ZAp_KV+UzUh%{I-4BwN2dQQ}Y~Gq{O&k?T$`b|4 z`ES+3=JUCz+Eq`Q+=bv^N6+D&g0q#zHbsTl=;vY0^3r#Hc;%n@B{o-$vkj>8nS9G#5C zO>LoU`8s(W%z4I|>Z`d=uqHn3|{?2?fmKJRbV?LnxjTuC*vw=mIB`o ze147@dO4H-2=^sBdI(S3evpbp9Z+@LU5d`639Y~)-|Oi;6mOOdbA_mePl+xyf0>KT zyCK^eTo?jY`onY8`+Q&}Nia2UDX2;^fu*YuKjAtGY}XHa%rEY+vdlNHA(qterrCClH97m#n^;Q~b37$sT3AS9cAF#D zSfi%Y?e6JarF?$EzKXmPz-nzsT!iX@mH)`(E`VpDx6G^s*2LV+Z((g!W^VtyJ;?0| z%DVQLrzzuW-lGoBxsbSzsx7_<-MQC%w7?qW3%xB?$??C?_JcHVBING`zQWB-5?Xbz zk-U@dm}%Eqlf6~VJ!X0~ahXT2wTAh2{A&*ipl_mRny$tDaBM%YrP z=DKF!J^c*#Egs$b!6K%%P1jlesgeEXGPsz6tCL`QxD?nbV7vR)fqXArk3O{cT*LJ! zh21|lmtU{pbHLoLtLs0^6I^|b{~^cdJ;-gEDer6fNMg=?_J~pq2MxoDOAx4E*lM1U zIVi&IfnW5P@nfw_dxjAOaMaGX-5<$)S}U*K4*G$=cf{AYY#FJKF z^ZzKi+H4c3q`-Q1VkCE`jZz&S8QN2J&izMy4VZa`I(0IcXA%cfhv>Ob}Lw#JQ1 z&LUb7XqR`)I#c#!n>dn+7BHRwUg6Xt<#157bTCVZBea8q4U0gys#6LIr*V{ly+b@1 zN6ov7tSMnvj3zk!)i3SQ#+OhQwi;fz1b&(A_Gx6Icz;+2T0B1FMOS_of#PiOwiH;|XA*MFic(f{+whqgdJ}^!^k)@)j#Ua%dK2i1 zyEW^x$8tpXrT?9n%Gd#ooMOh(-+IgsZnDnvHT(@zU~ZUdo&VC!2>7A1j$X5)uhyVO z%GP~>>b=>T;5+e!e6@H0Q7gP{WQKbCT`wkTX|5|7%)lx<=7GsXUYc$uc3I&*+vj)Y zL#Sd3t#+G_ZdP=MJljBynrugd#E=H^v#hgyQYh~409FKSN8E)eEu*!~+(+#opdHdW zL6I3g^K==`S60f|K4A#*c>XMeKgGOL# zEujm#SJU*9&^Gf-H@b0&HEm2o`q^^=3a;4*=&-Y}Sc~+g34Bvd2Eb=O9ha{n%AEZ6 z**+mw7Z(ES4wxfL(C;S#=8Glp_Jp2`x1;zLc&U4o-)L5mn{L4stKdK1sea&U3XQRb z_jg{1{Us>s{xUpB5SB6yqE_7p`tQ4SpVNOIxRv|-{`-*bXY}8f>b|7^zM6Z_!r|tL zTdnLlr6bOsGkUY;pfP~i8i}@vs0F~vlgb5wl>n;*<}A5%--?B=8DakCR%_zaDDdQw z-bmTaNig-f30R$QCJAgSuv%alNw98UtANF65ms{obK}Jl{MI!OSR|czzTdZ*`z%FD#+$>p!Ny32O){2OvLh6)&g^fE#CJ2W6`5x8?f6-x zqs*e)**M`J(_cm{>7k5^m>hY&vh1_Tp{s@S8Ti@e2#@=k$*N51g_0Coh&44mym__AOzk9}6BJ;Kv(NIpu(=U;3!8x5|TFM!)wcIB&XTjCT z2{4P!=@%rG16y&4`MlhkIHZca2(b8)@tSM2S%>U>fbC${_|#TzOE1-M)=n4GbUSgz z9$*VDGaK)~yRNv5S*?ws-@6vgi!tx5mzj_5P^*j1vKlgB3iPQ5TsG6>-iel|m?1BnI5lmcKC zv&_3+r60SO5so)p(AuKHVP2I(Ms z^mJ9yua)~$*UK+!zh}@y?y{DqH2spTufH@$?y@dQKeac-wdIhNROG3lR;sz`Zfk6y z`|Bw#FDRNG?nhBzT06ag(E=@qdR;Z&_PQe5dC_K@*R_{3+^M9{oV?o#jP`Tp+`tmS zN1YN2D=DE<=?0dldn{!Sn>?>_?+M;(?RM`8{f{@tZTNd(%5YlJ^2(k+tgt%VN!vl^ zCAM^a*;NG4@5{D>Y9FEY6E=K5#f-m~jb+r5fc zf|WaM#TLGKx5ew4|9l*+{!cKdl)v315p36aDJ1jK3oK^Dd12n=@6D1)h)<}PCSF@wWl>QPfqdU{lM3!$K*JP8aTE+psQvDr|Gtn%k6GQ*rstxz6HHfIJ^q-|D~Geu3)qFSmD8)BI1^ zugcuK!=|j>7^l>e+GwRHelz)4pyAjYe|p@wxD#{Y6xXZ%o8zjrO*{Q3S_M#5<3=- zeAT9G_{pYBogSwo-5N!H4-?o2jH0YRFc+u*R=#T7U8|-0w z(Ia`&t4d4K2gM;}q+~jse)IKL zm1gIy{!iNUYcrommP$E(MmJu2Sxxu%O7b}l(ryo6+v$HHX}wzOzp`yk+>S@$pt*lR z+bLS!t^NaTCrZ*I*-929XKUrt{cEDhb}QL(DETe5pR^hYPh{-`6`%z0wo~cari=wN zcc4La1sW7*t@#)v-*NMn1J1qehDf__C_e^7;A_`wHl-)v{%f4FOZc4UGRk`LzLoTP z)~1rwwsXrTt{#aR{haAFPD>BKC4;0LApI%sK=|z!{nHEbwRd0KQeChpb&SU$`zNqa zQI5T~mTHP}!dFAO5?FO%U}Yro{_sfT>){ug&t15Tb(l?lB+`z0!PiO??L7a-M_XTD z`j%@v)ha{#n=js(9NeixN6OP*6jQ{NBo#sPtjK36mU$cQ5=j;e(xpI^z^KH zo00&`1QgbCw09=-aO7+tKJ-?r5v# zxY1V4MWe?_F9)JY?wD!vwrI@V>B|^JHxusB~taY!#7BQ>TMuaiU@yUwauPNi?8 zA`|&2I+2&gj!?B@^;=F}5eG>g*`kdfp~l%>XJW5!8RH$$_8M8?4Bpd#`ztFeXOlXC zIq^sl(gGmo-j)fsvD&u+{=Cr-CXn~6`5N z-u#y@m+Z*};Vn`VdG z#I0nY4ZF5XoEwVI-NWz1lz&GBUW=dG-ENM|*4u#8%(rs;9fas79!o)Ra+Z~Lo%|LOzU*6IHB4;M;u z;Njb}56b)_)(o(HP!^~7H?K+a*Q_a_TYvMKSyD9dkxyEi7OtHo<2|&tpBn3U%l=1) zXsyr5fhnq67QY1SR{~{#Z8w}ox*9me2u-BIb+s^)yc-Kwt65t%KUS$)awuW#~G3>6JK4R z`$pa#rwAsp6hX+hkTd{14JeE=medOzx7n2v(#e4BGn=xFbSf|tCTJ}?)U z`nFB^%dAZ%Z(q`MklqBAq6vrYX7N2lUZed{+3|$?dSP6ixk1>{`A9p9fDjrz4O|9c%Js} zO8@k)udz^`%^0o3Dcj@U|MeZ}-?m&Fe9oRJZKO2XE=s-t?_cimJH8ERdzNfD`fa9a zRcoyx)fJSAP&)0MExApFs(SvG2}k~-s}ub%e;59reU4H8_k%Dqa<4{V$0 z(EiM$)2&HRx+wPe!R=d`j~><2JqMApK&zUGoDu!&KlB%F>&G?wfQFGMC{sq5`(Wvm&FW3B0@|{(( zrSR8vYMiw9+~GfPVu*%Wk^I|qN$&Vm8B@9V3WZ6Ox}+JMKj`*cIPRIbo3Y+KR{Up&o)v8 z2vUFSjJlI~YCqR>sWeYSP^{8GIu}!90I8S}vL&a{$so$7kXDeMpv@^j29?1srG3`~ zMcGK+9P-wZirEtzsQOZMeY~Z9{A+u;>Ly>I?os=VMJ%KNA5eca=?T&%;NYi-1m1V^ zoIom8!E#H{8so;R&!&Gsp0smPPvqwN(XwAAsQZneSN$OS+>WIq=}{+T+~H37?~8W267yMwv$7YBfn(h9;>y|J>3;OV9soiQ>&Qny!pC{N+k@&7UW} zkcLxZ`2BxRyl&T3|BdTb8qWQnBgzE-z}0y6YPCB3J1PswmeD{+CI&wWgR*``#Wm{G z^t?mS3V}aY_~jaPilZb}w)NAxDc7opb;les%7BH3>V{pf&U0pqWhj}#atle1{vL@$ zEzM)Y%MR5Y_^UcA!BI&;Iq=O+W5j&*s8;$nqu)Q&HCpKmWB)(YMd{oAhE7@xoKRtxnpQ@^k&N8siUu|f_2yLm4FZgT2MfOKrRqwo!ZBYIS;C@>u$s3wVGHUm82tsbiAmy%5zflXUZ!MtZG! znPWH4JAkn}>t@xePpZkMcsULfd}RrW%*WI_Z0)7%3Ni)(TY>to>efA>ChL}xDj{Pe zAQk3Vh0#j$zcTi2RKHCZDdRfK)F|5r#5#EEDHh%`K?-7ppPkeAo3D(WX-|GI`} z)W6#;Ve6(|tFRp(Ww+b5sM*@GIY#vswV$NBV(BljG=FO}e_AYkFqXa*OHanq!WX0U zrpMBUV(H!&)k3ZQ7USfLYQDDn7Nf^Y)GJ?MT=SB;B)yz9E4>M^_mXC9fkQE=L7lkY zCMqo(HX4O>>i+f{VYP~f;}kFWdw}x8b;;Y*>8e9ArEu#b#)6mC5n9s>W9Q525YoDn zFRK&P_Is$k8mIw8ZWerHOnXHgqpHSJuc(h`&rL8c+o5Kw9^=Lx>Ug!lcyWh%p5qvm zn*i6>MsmKMUUzDTTB;_yzlM0gAb|aH^G@{+wYTxrPIY|l39r&3i?ouWw)GfqpY=In z!;xUyJT~-pB+|0_Yh&DNYPz=L>$+L5sh_CH$E6QIL}^~o81uUNiNh1*lnBfX8u`1_ zdD@xr#`;}qzB^%Nxp4 z{bp9z#T~>WQGSy#?G1HJayeucq5TOYCNFL`U5z(-?N-lIFEu9YR=Y)OfOLaZqi)e| zwaTWZ8*SfF|E^XU_r9YJcg!BAw8$ys+bfLy@2LIMVnf}l{!MLHcjsR9HC5YpMcsgX z^lKfhj)PEE11DAXwj8kpfkC``fRX=+M8=YSPo1fx$4Ez#jsm{pIghje=nr^-AIRJH zI@bEv#tZMUyiDNedn`9;zy0c7Nzd$8hmqD{Zy!+ATa1(s)vMH%#!Vlp|8gv(i#fo) zgGS~7b&=Yp?$HD4-?U^|vd!dw25dW0m;JFiE3==-$n+_V>z>nh70GG5^(4+QI>IUZ zVmWDNSSR*l!?TWII49P<^dI$;L~Z`Dy6WH5%k0|jjdh=#QKuyGU=${3N7KJyoCH}L zyhKS#c}Ug;jnywvo1(W91A8|toOYZAJZ`Hqk~CG*vyR)0N0POh5*;|ImMLvahtam3 zHYxL`BBfTj7rW{_6pIGa~jI9O|MPnHT+CY8L2b>oINs7I!VS^NcYC!lYPIo>SNo{_39^D#Hl{|B zT^W>A_v{2MSMMPV(yI2P(sw{96-1JZB^9Y&l4SfcS;HyuNZp7lwM~xXW$o-rIS@4z zjg!~o+}y+a4gf3()OxJ6R8ia?g9ko%VMv|7>MrBiUzP zlRx@X+q%%-wM;d4A@nH+#7$YQln0f*i-R`jV)kkvEcRzNpiYCArJoJFmjNY!m>MG7 zUyAC_O?PX#9R_t3Ccxue8ffT_-*_uakzh33tqoNDMkk+kRfo@A;#&%aGg#p==qc`p z`Nq9It+!)0oo)k;rx@FP+8x?vS6yMbc8!)RJHpo9uJi{+0UlrwAda_@*64Mc7HLna z+G9D!#0qVZV-AHg0nDSr71}&C`DtF(0>`DG-k82byG+dYO-r=t3CRhmbOj6oN>b}G zAJE#X$pI)=M#fBllh=?M?M%`T3lU}=AagSyhn_)ccI5+}|AkDcC$;fDj%OF?6jJg1 z9@}Z$@u)Uk{hRUequO8ES5j08>;Z&|+tQ42>$F{JhLKXMU27H3jumgSs)$>Bd$Kf} z`$xWUSpdGiz<4;Ib+(EYo-NuH&>l)IWzCw%3j!G(>SjHrjj%an27@{bTYByu_3#_)(IbqeQyZZ%} zqm5LY4^Xl0{jJ(yT|3df0PP}d8zN}s5tJtC`-)z*B{r!jBm+I$t`DSQ^ zd8Vp3^a54C8M@kRW~WJ&3aUhm>t3PrsXQJx?tewg@fGpd(h#xy#wDtP_6#%>koRpY z4{(z4JQo#|%sUNidc)Hy!j>S`Os|1lnYP3zp{v${yjuwKQXxPlR(ZEbcn43G6tL6run z(y{C2LA9m~pu3j_^`yn22m=vEwb;l@wU3O)>a~u(`JT@&}}_)>a)z6Pk+~<(3qDaXd-WTAX@0l3`pmwH7BGh zEgF0LSeqycd&qw_7%?8N*E)4I&Y8|urjy_aH1voeP(#I9nc&+j(bF@I;!ywWa!hgF-Mr@)hl<#` zxXPNZq7-l zHPe`}qAU%LI**lg2O6H6A8APi;cs-MN>Q%Fh*2^}Qm>$+98i`9w?b918?s85guVa? z)q8I!guHRFvI*4LA1nXC7l~wk1c@CK980e?_rwamPgXMDBVVvDu$E?0c%4uOYMp^X zMcFIO6Wwdg8Off|-B3sJ<$3dYP-rg{Du+VV%giT1thLNuTpm)~QEH*~GTXQUVc+u% z(puqQ2c=~K14;)ohFuaWnzq(d%2%3GJ&QvL%9Ra2Mj{SdX&N(}5)Rg^wA;!8DtppG zN(M&{g{OMTL-F1~!}+XtJj?Mu2COV?R@r@_<4jhCB8keBhF^Jp82UFSLi!BIT`Hsx z1RAn<-t3H${&?J3(tp5g9gu!PjP%Q6r0>d1_EB$ZhbZZ%#3-1+Kovsz^2(6vg^%26 ztanKR%P>T?d4X$0$X4n@W0nWPUDu5W1tE=8NL7>}D%jeus0dA{f)drELiUR)A)TM{ zs~RqZUxsy}12pN>QW({0e{tyB*!mWL$W<{UI9+DWfWl%GE{{xtCi^bpcGcFAvcN6`W9^AN9w^sDM43xre%& z)1p-95JO<3#e9LVo#hbbtD)Q-D`Pn`eMMj=Boa>D$qa;>@sm3oRGvxY?y<^aV937I zRg|m47cqmW3?^H#Ap1cJxw3Ax=2x7fg<*xC3bOs?RPux`J|(|E>O)Q09SJb0#9lq) zDt(YtakOPHVLDIpGSi*RAdnDA9kgF`k41Lb-+ML1(F8)$xg{g$Sn7zZxB}AJFRJ*X z?rYQ)SWZ)$&LNat3apg)AvOf5QEZlclt zBq2o-s^v_04BNOGn`AGN^ypeMFL|w*%+d-QaKS-W-FkZ&%Y)RV567PN7$@NNmL-=S zGT$fFU4ifp%@Pv{h+h%mlZ*#;YuSZ#-hZ6z^~qu3jXVqaH5T$>L5PTdnGS6Af$;O1 zVtlb%>(yfuGG9h#w9Gt48_Q^GW1~GGm0`fa4kQ0ftw(lKO0BucD)WYaK`z)~;>*C~ zAo&|ojN9JS(hI-TYVF%nYVC|>Eyvh>k(LPk)6WWK=qGHxW}8-PuBOfEuEq;*;){5} z`07oqA5ny-6|`$8geQnvSAQf9mw4&Txh=q28~FM&Vmpy6E{Ffa)!T@HDUscn5eNXyRn_FVaIm{AQanV{=!Vayt(z z9j~$|pSz zsdsRQeB9fPhdPCu{$cyCv1T?YkOSW=);~q&ucSU)R=a07f7>q_GbaLv*$;hW< zeg!lF^)w#z>CcfLcwPk(zmlE?;+U;4qG)`v$EHUjYYIHYq1o;nHd{qdcb5kveLpe_ zsdFs?_QipRWK)J2!tu{(RUtc;fY`95DLH1MkE4hP!hdrJ*j<)mPPnExR8vkzrGfB_ zX_toL%aDOoRy(7=T!Dtj)~J@)s75cc+=3D58F0w#)TIi+Iw>3`AHm(wCpo&2kMO>+ zZ_XcL>nQKeerMl(Kar7jPR4(DUp|!1+#gw3W5i?*I;Xsm_mStk%Yfc<-oNJk+yTDe z{oMXP<-OVKMJ8iw&>_OkeU|0LPII^Kg$|_#|9AnF6y!f9WN?$ zPB&kU`RtLiO1=msUk=t%xRLzCHuwiPgpEwgF})mk6t6dQ9UX1FB)Vd9AS%jU&7pu} zH|-vgzV;S}9=lmo;aYS4${h3V+b#=nunrZ}j}3Lbdn^aRDF54;>`-591M~-5*%(iK z4GWB9)tXWAN5{b?>#P}j7<4E`o{&G;8EB|Je?;i!wCJW7tYZ>mr3~dzAXaYm1EWGV zm%p*6Eyp|#;x_l{##b>8T2DQ;?m1==I(QW2Ba%Agm@iT2yiiCL)u*Vj%q-q#Q(=pH zO+y}a#AZujBiTr`f~t^SgvW$-MHd>?pJOaMP2H)~%i?G!WsguM$PR?Rgh$dqQr@#; zDwboJqmnUlr7w&SX(xQPn!M_^@HKg3?K$@LO1Wh;JT3WMqWLpB|;Jh$WdF`iGu z7Yg=((-jEM!oSo_mU2vS2*wWIG;Ftdx~e#ocNuM$jSBUQ%Q3fKwx>aRA-ddil6}j} z)(*1hU^*S7(!psq-)WXc%epvJ;JzfZ{qom28(=E2ytC7D%q!2o#5(=_BYD4h$&1Lo zn3Uier{nbAD9?=cMR{f=^;h=DF)z!BQuIemyfz>w6ZH5vsb0&eSuplsgO%{SV?a!7 zc-J&~#;rAXFUc|Yf%yw#BP|IvD;p2aLt?We3lXk@P*yTK2MP#dHqo|^NQ+W$$R3B| ziqmZdJMAbM00|OKiqA0v^kXYG8WZTlcZ+nwOtX@)*34`VR<< z!kYbneA$iW->7R1`eviNe*-fY)N|&q`La>YeR6i_rd*w>)c69aI0bYnrEr=_8Ga_> z5RxXU_cd}J41Y7U+8lxW5Ugc4d^2Hyo}Glc$}E z&#_O=$gyLVJ5+c5H)_rOp(Z)h)Ns^Nj7A&puYr{F3L0?RC^N}zm<28dVVm|Glw*l& z-T7c+l42bBJBJ4uJOkt=C*+tL8B7MYv-RSj!e(Y~39`e+$$eU;Z&s{+D)kdsbGZn; zG`q@@pdujc&U->@Vs+x{1E~QSpUYZZv!ZpfD3^NsV|5@z>ILyiW;}IT4=oO4*{8xH z;PrP1(vz~J!AN^&al4RS`eCEIC=(8uGdmdr-q-q#D@Qe~CU12w@@d3YR&}Uu!?B@w zmYYv^I;%$JC+3*KmnAab7=$AyE1971=T_QhH5ohK*LwJ7Sf_Ju*aMZ1(MFJxW8FGI z4A0CE5VPeYNNF1n`xFcT!OR>}yk+XLis)&aGTmFzcol~%alS~IY>Y{~Ye^NM1oCVy z@;lLInK#s(KIOoSEA6VVPKD7_Y}=O3FbJ|3OjhJ1{3quNSfXk*gQnbC5fXvClEGha zzZI0@q6{Rb@xipe_|Dy&tO5-`@4@dq#Mu4;t7yc|Kv;R1O|%nU-|fgTGayU?g!zEy zQ{<}%;#Bf*Nrd;yDilLt2qh{mt#@?tZ#15D%t%=Q`8&yTUzB6IuZ`+jyLV|&1o;Lw zFlx_d>AfBct3q9?$A%JcLx}zpY7A=wB@i#TA2Q3_m7yfX-=rd>mEcDqzT4RDq0<7T zI3&CM^cs}EtGw~r+R>p&AZT;nZ?2_Wgtg=gC1ry?0y3>~Q$(9m>RXP343!18GV`m3 zj}3jllU-fo4WU2SfUBB3vB5QN73jeagGy=OakVtC1&esocWt0TR*o4@+kI@b6AWru z9iEjT)e}hFbvnYW(0MrZl*}GbFe?e9sh_}}s;7Q`Ur}@xy88o5k)s1s>}{0J9`db& zHKe)*Qgu&?S{i2@O3RcurFk};%%-#F=tRU!5}W4=WaRvF+9CNh&$>nSU5RqopBzq7 z0=h!%%aV=B_n12panuO8Z{1@IIEa$oL#Oio%ONNLV^cd*nEGHrj(NF|4$&j!-%;;- zsRQp7P)7{R6KoD;D3b|_9d_87%ukZn_n@g};i_OF|KZ(p!9la_UD0a~_U25!Q*$MUAR*l{vC7N?uLb->A4gHGfBgh@LD6 zjti|StT!LZt~U>4j|+*VA=*W>irD0`3$DfDs6Ye=wGv$`8l_xJ9*G|{y|>Q1pNaCp z#{q=q#PAZZ6S<;+&|)wXB%XFI3f6;wR=+Hyx$a>P?=lY}@e9g}iLVK>Rt7cK;-KQ( zWzKEolWa?#gjdHXkwm}xvI;cAeO8P>1fT=T#pIeVoN+$u2U%XZBP!UYE6Sl6vCiB% z(a!EYX9?_(wdnasOUlrS&}QWg`AExR&=Tsh?%@Toy1f}#!OPeVMjOwB^!^n=acQOu zU2M5Ewfe;cZPuzRx>lFO)+$0{R6y15`H&oE>Vf?uF#fMRKxhK?ker}p$-Ws{1KDd3U`nR!m_*mQ#v(WN&c9ss zjY4+O;=*{|973SXWK?V>+2_opi_zyZqA!bm7l&k%D6S<~uH_a#KF_&9n%~Ae6xTy$ zfm;OSh>(`HICyMWttqRfyIDopOmn_r2FcT0l|kLTC@3o*Q3BmGSVrDPJeL!TR#X`>%D&Jt zv?HgCsxP!$-@#=0Mr^rxqKieMhDp+zmU2RrSm!rw=^eU!hkfw@XmL+2EVS0#)s2Gg zY1Yv@tlYenvyzyaQnxBAYNpDCI8WhXnSbi(Q<2Q)5woYq(01&|kXVblQZeg@CwaAb z0fZKflCyuTweY%<)a1cX?j!jOAZBNm!V#8Z-80T_igR68v?lw~O8k|J&Ev}#n}MMq z=fN&UMt{vgPoz~BX)kS!*MHQ~eB~d87OKkjg-l80T16jPV1c}AMp|aa^5nfU*Ed9b z&Ec@?g)G7XVg$U4)===f%pzZho9YRFR?<#~WZQ_V%G7HiQx{n!nKnk zEk3cwWZ)zQ7MtxE25z;{B>%K^E5sWn;+r`EBUT0$kHRxDFbL_0ml6g|W6*C=>>~+R z%R%_~dqiA308^% zPsAzP)p9h0EM#6a9D#@t%=5-A1M4fp#0MSHfp^#n-Y13G43EQI>kG2WpJ+qptsTEh z$I^#T!<)R=G%#V*dTgZqu|AuTAk(TXO5p58r(PL0?a{sqe01(DTw(dkWDxO{L5*+* zC!F|FoI0g}R9iVV&Lj7RE(O8QE@IX$W?l1OqlGx0@(DLXT6_%_lC-tAEU~l)rn#!r zN84xMzL%|$Atx_)4Y7)nhFr9euLR*K4f#UBk>Ql*$zkjph%r@M(+>MZ7+T6&)DmYu zw?$^u7;7FBww@N&q#e(yGOYosI8^K(JHnR;nH41!HI)d@6!b<8#rzh6h{#AUmH{E- z%8>omC81AgAcJFbJEVay---NMvp#0VGW*QU)DeM&bhen!PM+2Nx_deJJZ#Mh7yc0R zYjc`&)j5-y0&fsxc5zyB1$6O2*ju>KRquPKF^*X!@ii*`aqH;D)@V4^rP}EDVCD3~AXQbSn{Wl>2l6i8Eq0^SC`O8kQY;;fe=dPeetmhF8nhgso~1JuC+wI-|k zm_f!l9F8KjLM(EO6LFM*Boay->s4z`6}vgQN+9Y2l)!kxVC1^8+;lQI zF=gysIKGQ46?wSw_O8KOv1Mik%C1AxjXN6T$ z$6B-LJam*qUy+E5#4X77m2E0xviF-GYt6->Qv(Px;Ug8LrtKRW zO77}!WM?0-{2WRNXUcbinw*5{KMWq`QV9Y$e0Ei@l>Lz}tC@I_c-8%;^qIj5uclw| zy~-lV%Cf4hi#jW`id9VtE;r9zS(mIV#z3QN5E}K*u3_`s6Oz^H&*|kY;qw>`w#Djr zhsnK)Nnr=VRrvbxT)v0wdQWgzuMr`qvEqov1fJKuf#*dSDT?7}#!>Jp-dW*^&M16c zS!B^n*3-_`l=d%DesXvq?ANrQoC-xWPc2-`vMHJESRxU*HqdY6Sdu{e_yGK{hjkI& zK`4c989y>4W~nxnlzyqfJER?<-QS_JoE#+Vue&N64~)AQkv-bl zA!5u460#uzMCgSu?c;qc2nY7*811bbA&e;tl7|0rDjnNgA~z<6b9s&jbJ-1|BP^TB z%f*PJm8K50g!?VQMz|vZZWAq=61@^9znIJ1dnv9gRSU3+hODN9` zCMy|u!B94GO$uj|7=_Yl8l9>fW8|DAN(eU2jA!tf6;P`l_Z^B%maM3KbpMMU;4=dA zmCGY7FSrkKnp|#n%Y%yj7d7aE0u4_SHtt616T4O^g}2=@gQdX$BputW*1X}bk(SB} z;4w%l`(Zu}X0difg5U7o*$Elt9wYmusX+0Bq`$?(Js}B*Bn6O&UZf;_ z6lJfl)Vl;pL_UbnN>CnjSwWmQSD;}QlCeAYxP>1+5O3;U5!q{v*S^;}b^l+B&exk* z9C)%hOi7P9Vs>`)4Lu#%E=IWAB@%mM@%3^w+P$!pC~vHk+|$Hgqmw8(;gZPK3)%SoYwgjk0v zo!p5`uyjI9B?!4rY=&H8ibL7x7tt#@uDIxSUKD6}lI?E!WcpSIe|Hd0VBiT0ibDqq zJ=n9$%o%rIE~+H#DO_g03&Ja%(eb{;mhlP3?}G7OFfON{+*NCyP-@MuDLhD?gW&MM z&wq{#YWg`cndf$d&kxQ!7U@ltdk=x;r%7#f+!z360(SySfzN<0FP{yQC-QtZa2Sw4 zv`Jd=G~x0(Lg069C-hBvKJoYud0s%+{0QOYJ*4kZQ9|F}@#VuxV(ecc2#%8X#*@+T z_-oWLff=-u>koss(ANz%}|NF|gmGoQzR68JyHtR(n9cN_O6fceZM9;ABnEOCEnCrg(w;o-(E*7Es} zBq^y)sMDbCd_8DqnMIPes@DO=&>ysTpS@3jYaoG!A)!diXHFtguIPI;t1j2u#30CU z--i$mhOa<=sZag838`^2;|w-9@~urml1(Vr?LP^S!XFm=aw$AM47p zBVvd1`Ac{Q*9hvVD;A3MH`qh>Do1{#Hx9D9V<^jrEb*{TT6L8&ciY`@ZqB>NLx}rn*o~GsWHKMIh zq25bF`HHev_Ev6!Y%XS*ZHdI03pmqN5N{T>DVps?G|zIGBvoWlAGm^mC3fG22XoB+ zNR!tPX`88!I143UUvxpDxs~juR{KI%)*Z3tgPoybX9&)Q=O-=0_evzPNn~BCapS=@ z7BM7NLLM4GS5g|@0Ewf@o>y%m`_3aTk4D@C@N%9kS@cu-0Tk@2^j^+ zcqca%MUBnOi*ll$nHH%X%y%!1Dq*>)dae={1uPscrtg_Cn25txn&mK8|GXSiOyS#a zWf`HK$iHEOi$fCKj_TmG<^zmV!MSSzYc+Lblma%Nhr1|HKp1JVP=HXmY(073C=?*t z-Jd)D!U)kVSP|QT6|pVIJEU(lg#Z6;LEnHb(V3%Uv1i$S3~H$%*8T*uQj{BlLIs(z zY|m`gRc1PnnF>i|wz4&4ws}OoWwtWYG1du_+m7^iuGYAe*$e4M*%-H;GuO-$WYDo# z-yVE>T#;y=-8~xmlzrPyZtCY#77L%-K~&D&l^t@-O6qw#Mkj!mz#&Yhqh8j6h-}YB zWP?hcOvn>s=4WFQ9VUoX;f*bF)j;0ILfJUYChV;s1XOwC^vzKlDlTbRXx3jZ<0w#V z36bv@P?n~dbD2;?5IjYmP=uc;vW~Pem3bB1gpYC)6wO zVMiBWoX=x}U*#JeB1F_6Vpv4vhjfV02w&TGv{^zZT$t(w_uCB;_?NFUo_{LRVqZSm zGWH6x*O?`1A~zqR5x-ru%>aqv>S${_ORRU?`J+Qq(0)0b2ad73$d z*Ry5dY*`!Gw}Ndvn2RVrNuWe7_sZd4${*m^%I&TeIVH%l$q7O2bdTjnDOiWUnPn6z z6hLytEi&Zl24uYDzkc99<3fr3tAjFTf^)gg`n2o62RzJx(yD~ACtlXmREMy`e$Lfe8fCwwhOqhFcInM|E?ITH;prw9M*(+`bTf3hIi9>#h~b2Ah|u$A3se2 zE|UACkE*i_-US91Eh!8xa$>@QijdEK>)24-LX2%Vd3Vn!clSSsyAP5l+NXT`s`!pU|0es~>kVDWp-=h{#uX}bi!rb2e#>+Y&M`kru%g8cc9=G)Cc0#+lkef` zl{BD3Hi&dF2CiFv<+UT|~&4DTWS)jyakA;w&-eF<+#|1!>Q z`mp#4`#_fTXrxng9a{&H^~|D@wyeS^KB;x}o!eR}Jwu`NWLYS1mE=k9{~~|F@=9wv z2-jxBMi7rt>(-IZrT%HWh?43$q~ofDFbGz>#UN?1br)|w4B|UtnQ1V{r7;HCdPS5$ z9DlC(N4+I5$PgH$Vn~iT-$BI8wX!jgNf49M`v&r&F`3Ues88aWA%n6O9AD*A35(2S zF~{BsG~qUfk84accDMo!KcL7}DhKJLHD;{ioc;Fah+_gQEo&s5%mDLBjt>fcukKT; zLZ?7NW|v0LdIH=x0~;-?vmmy%5ktBq0q=_(ErlX-()Y#?!11fU@1ygPRJMb_NTT2$ z(0~I`^JMZ8T=$0d@y_YIxsKj;g7#tve%EKMnF58x4|NQF z5iK?<>aO%zW{X@wmqTt65^4~kcj?GFYvxDYmFGIN#$!{<`SK$=8oP}34kBk`_xHFT zuu0gz)qypF_i<29oG>!c_!{iCQmol&t&{bM6Lm@hznPR@f=^qRrk~7;fn}ZT7cB~9 zc*uA9htxA324H-iy;*0kX-$(g(y)8--%ap|y z6XC8$T|z@zLsTEf28N^#i4n`7+hci<+L7iJx73y4be_+ppnMJ^zw0ScJK2sJ>Jo`2 z-&pxV!Y~rS=EK!LF^rHk&Ar;RE0Y>}^DIKgjsW6Xo8_L8fxPS1nR!yL91RDFp`fL| zw;hfe2Xl#>izDaQrfAH#6BKiLmzZLH%XQgan8#rutC%mHV>1yqqMXg1rtw-r@;1r> z$vGxI`ZxQ~nd; z_-Q&7Q+YG@3xq0L83+$S%U_t06UUs`X1c4QQEavu!_V09XT5Bxso~t;BaWUaop_!QwzC}L+F=B;hvU7`{d=PAJtimF=6DzH zbZDpJ0=2y$dGV!z zhB>d}LxlqJt*CE0=4v}-XHz@n>85yPU6c1>@yIP}N|W#;q?LnyDA+J-dH8Vg|yb{)}!65FEG1zL{y*=TsC4X}GxU1G@ z9>*c3y8jOvKd))-jSqdV@bN4NBB+)I`N&o7AL z=Z5^EdNVk`2?Gk#u8+mot4>B7A4GiYMKBTnwhQu=flSjz5f)|P&whwFW`fjI@?MYS zeMBBMKzI~+hhup<4Eo*=(vLSR-^Q`-mY>rD0zE$^;KiGxl2SMt4yd=w*I zzJ#`T)Wo4B-{O4yobgLUyC&CjNu&jPy5&~D`jKCL0pvz_M1FVU7#_N{c8#fx`G<}KnYn#iyHV$d}NzFN4zki~a z)-+nbfg=0d!@j;tZ0*Tbbz`zC_?~floZhWR+j^qa{IG%5bIsW%YB_PLvRKn+jH7XS zy1K})$LqbXOykWVsSAw{q;Q1;f}5lOkJrry|`pl5WN_ffP~0;HB%xM(egeVNgapm+BD1&?Z{rBNOcTDFp1 z5Ng~{Q>2$5a_5YA%4-Dfyjd%IlRO|yx@yrrsl_^&nbj0rf-iz*8Wft|7 z_mT#zsZ23iL=D@R6e3-8f1D#D;5Rdj6^VMPJ*&(xvy7(__0E5piitQ??tGVtiFuVA zbR9DH)&tH3v02#zjJquQ7L@sB)#&ZedujHIj42L1 zSF=BAEFe|a8jm_y&?e(^hdw;zvsYjV!5GX1g|$YnHhOXU*U7e%t-AOT3$l|wGM2Q_ zv(*=kC)(&2b(fzd5+<1+TWHlw52aWTG=rX2Pmdb*Bz=-67^ZY`kI}ZR-qAOi6_tySFQQsH=uShAAk!JfxQ|;z|ZcW#XE5McqC>-zaP14Z)+^RmWtxmNP_kR)jRv zhDzN%Ig8DI%!TIpY|c{lLyhD;h^~v?rxmVvG7{aKt67W3`7Gbssox%qv~&T9N;kR- z1Z42mK|hNPiVga_%K3zkP@3aQql_UWeULt6X=G;cXl_wW;%{)wM=DTP2Hj8pQYLkz zOs9;#n)Bo*g%loyFU!hjc6vAU4db_VdgsIk zKNrMn%+HN3PJLjfr%wrS@tK24FW9FIvd4wV`=oKJQ$OF4Xhap?c*A(osn3gBY`q(~ zDf+~rt=h2@oGfF@esagSSoTmqYb3caP{XGe;uRHcj(+7k*LXff&r#rR~?px}r z(~(%dR(-M|rcX4et(IctNdK_*T&1=H_GP9BGSMxfQ%XLK>KD;1^8Pe?Qn+d?EG+tE z`$^j3@q&p`5CEAwJh%a9FJuzN8b$lHtYkaI-yOTLqUja)wKy3jg|{i4?R1pVs*HqM z-9;gJGW4`ww+XdjY*s8&x+!3|n__v$6DvcA31kS8Bsyl&nW~?VUcnUJJ>8ZniVNpV! z^S`hV$==3jV8jk_v7%NI^`uC(u;{80C5;0dKr+xCNC#xUi2f-tF3!|DW@nVvm}MTU zYY?zod?%MOQ35!iemrT+%hYf4P2xA9(7BS=fXWKn|1A+rqfy7rQ-mwXzPuuIEhnU816nklskM-K5T5t)<^KWtlwwr zz171;ryTtfwXJboj{djIfQ27g1;s4TstfLW*l5l{0zF`~b?KeEjQBX}agiP9MuseS zOf*vT#_~PJr7ldA$BbKDdQQsibO>V2x6(oc_*UalI_NP=#_{0zP%w03hJf4xcmZgQ z`v35-aoB~aHO)BfLW-9eeY@%%?Ni$$M~o}F>X+a6FrG9KF*TSnO5iU}ER0OiKPUJ) zLJ5eDy(Zj;2)N|QFHzW$Xxa_YHf>-s$(LWEko;4n(R>!h%CC>*|6=^s6{YvJ(Ir>! z-06+j?&RK4<_5mOS%y3t3TvH_Spr7Pma3Y7QIMvgqeHi$mRF&BY{%Q&u&~ zC|C?tla1TE>8UA|A8=<={7>Ss$5+v4tm>wBYbQU0FbTLCxPFbzc(tD3ypX3INeM%I(65tzgl+S1iAmqFd6I`2)s#F%)vH>P|b2LLEMaz zXOC`e%aECoEM6v0=+0kdw!tv+u(>sFPsbqn(_U4ddJ*tbT0h;HfaRt`UpRHjXght^bTO% zBSw#&Y?Skjn|kWS(+?s#5?M)^tb8BX6P_3OC|@)U=RJ>ixiMgGTVb8!T)cNkt_aD8 zk9m}5@h-+1S4b^++-k68ARu36IE=CMUM$F4#^_%9MOxDdV@WSYf6{oTm!8vO)igdR zU>Pvq{g8BVtJ0MT9Hw>sEjR(z%8w}L^Ao~@^I_JlCqOX9Un$uj2!Dx7WUg^5#YtIf zqthQr`cNA*wwKM^Fi4Q}hLJB0)e}AP)Wnz`hP4=Rrtx9E-Z8T_AXNi=_420a7IDEs zOM1mxL+h=;ugSs%vD<=nRWd`o{8qi$to#0=^I3F!#~u;p=jqZ|7O^2E#n^ zK9E%2yU|Xhu;jUnhTiPTo`$_ZADETI0oGO;{hBy~+M?}R>0|WlqxV$LGbZ%WJEmU% z%I&()~fKcfi>wE3WMgmaVCNG;|RQ|&UoFeckb{T93w6&h1#Xme3s7tZT!GE9iIG9h|f(QPdV;w zJ`kk%CZkhdy>sDOYFT{diHg@&KI`&mbiK!sz63M^sq2jCef5c5HZZt&$VDQGv=Zyx z4t_mL+nA3UANIv*Q$pZdv^5(va~7kwem5e^PM#Iz5szVp(X}6%=hREafPR?E$BY~M zp=EA0R**Zm4fOaHee^_3koi$L^y~KKr zcP>DmzGt-UuXi-u7il>CYh+A-v89Su9%#5%C|(woCJ)LpkRI(Y6! zq_>i~w>8(R!lc$`93p-GEjWu@aMMn?*F>0XhiYLPeaF>9z0TZ8Q3;xA+}lMV<(If5 zLOap=LO#Q3FbFqw@bLEMYfyK68}lk5J012%y}9c<%TM=lqL>oSC^hVIUBG_VeIfb$ zLh?|q{Q5)msPCkY)L2^(cZk^iSSF_Ug7RBnG`J=jp+#m4c$X;+hxO~ zIaix$u3GbjU!sG*g>J_nZf@OpJ~3#-NS9w{6;_$b=?&}}Wc|fUISS|bDC`Z{5xV=~ z#>sS)=%L)pE|hPC$P>%_GL}zv#z@QNl>50W%{1D{4X!kv<@*oum5X709DbIVYEj>n zmslOk9WvR{L+RXBE=(pD9#?YbyV9B&5) z?9_|4LJ7IQQWL;eUP`Q^JPNuD&i4kB4=jF#j<<910ZjfV$ugg<$Wv44<0PW{&CG8miZ zfN|?!{VH{b@unnC8eN8v)EIY4vcPyxl9@*Li%7;9cS$nH`1m6Hhck?nB81TbFuD&| z2~6y!D36g&Cw-Rm4$@ah*OTrc-9`E_X^1pL`XK3lNKXML`Aw_&q;Z(*P9PJ=0}6pb zzzAS0Fa;1wl#;?+#;?QlE?rJt9o4z5Rzjs(!jK0J5G@lna1n-Fq5?KfjBJZwh z5QQ(q77J(ePf(M-&Jj=x7b6YVnB|a3LDjt^6z{&bQ4Cz^|GHi8!5wqtBk-shC7B)8MolR(t7Lnp@Gf7qi+Nyk1sYzB z$rV8;-o2_(#RX_}iYPhu??;=Y4@niHuSdUJ-D3R1qd%b4{bo2W*4Jy*zZuV7toKNt z%CRnikErqa@zHf4TxRQRUiFUAe6fBroN?s{LJikir#o->NoF&X;$n`Bwf-m*|;V%RlF7}c+d)juiDnmH{)p`2 zkW40t%L13ihIGgBWkQlK6T0K1aob3Se8#wUr2ZH6A>;dzdTp{?1V8+HB+`ph+~hRl z?#uO#y~^P+mdWC|0KYW6hNFXr8;ah?LTV{O6#kR)C2NdBm+INt;C;r)OZ9c?P~+jt zaGKv~e1DmKy?UK-#pU`{TIw3($;+wKW{vR{sk+lJFV~AXyYwBU_trZ7$Cx%spQQ$j zH%ICJ9C9~t@Cdq~2OKFjqYa9^{!rAWtid{HUx3yU7%DW|xsu=MX zwJFa-N`9a`syA=~*uOB^d-eQr8)4#oZfqN`#LlmjUscSsw~2b}HnZL+9UOucZ*Dh3k~@%Hz$;YgYR4T8`>bY&2o z=b+zu=wlD~8y(a;_&@rtjrC2?#p-*6=i0b0ys2a0MFv78~n{bH=C{CLGj6aJuyj%99xb;S{CO42bjWucgsU@WhTMyhM!dSGFv-#r| zae68@thXt(KqVRc@S$>u=M2)G8~EcWKoh`697eYZ`d}?`(wH`ZO>mEK*95(rcJj2b zegd{}Pve~loUI=;ew(28^nKpvNDjuHSRGaj(u4FbMf!WOG|I#(m0u+!v@WU4;#;ti~Z#FJ*zm1SWeeeAaY&j{Cvm30+AEsT*|F0RRva8cKl_Nnd)P0U3N zl-e7euG71X#k$c5V-bv5)z}UO;FMh@zp4_4qWgc1oezAJ)s^?>&odzj0VgEE7(yH{ zVuXl;qDG7mFh$f<2c;O@XoCa|8Zp*ru}z(zpb?{u7JE@s8T+zbv}`xFw6I;a4O`l! zN^R`2-E22?CxL0wnA%k7mX*M~-`_LOBtvxHedqJJ^E~(5^V~n@oO|v$_ul6|FNXqS zGm>klVe*h*T59(U+bVqE8-u&pL!jPaj@;=DEvjjGavDZ&4!XEt4a`Vurz^C`LQAZx zvMFS)7B$s=by10@&Tn~r)ZF=b@ALxW_~;==q=h4^{`pb!oYJRa(MeP*Q_>k(k8T+? zKl(hQP5r3(&F7Jx`;5ERn-fkf=ib(bc3E^j)k!V3$th}9N>*agT@HLk3S6%~)i`j? znI-ed3cM2gcL$#A;i|IO8sgg_c3tsn#~w(hz1rA(>8SZmt@o|)Z|RZ}+@zZ?-LeX5 zF8u2=P3=v;Wgi6Qw$}7E`aSlhcbylG_1m}kpA&iu8MD<+e26?-LiQ}zcF&I3R=PJT zV#uR)Mb;D-R$SY^`2}9JUxZ7gJu1yiMMA{Bj9}Y2P zB+(`_6_SIAZedy?M^l`co2JlGS|tAFGa}7_^n&^Q+w5Hmf?f5K`1>X8XU7Wt*Y;;X zRaIaQno|{Oba`X>D%dGEtYJgsYl3XQgS=W~#=py#m!19$_KYP)JL{?VBx9ZHIu31moo913v zJJ;TcqVee%Jl0jD)(TzOi-{JiagDIDsjHCFJh$TCZH?u3ZH@6_Dvo71vCn8b(ta4l zGG~2y*Y~+U#67-%y?W|~-1e$LDAIS8V?T=}nssNgWT-1!XE;C=8$-JHeXmc@YP(qK4Mh|coBp})4wAJ=&=^7x)HMR$7(imHPz+fOlbz*;SR z4bL;*|8h*`$k2+|>_>Nb-p;IMB;>_!Su59yed=pj_}+j;Lu zl|(O0>+{xj415c|Bos__POEuwwfBPX-%`P^P@jBy$Nf${W^lhzlikRV21J>7`>BJ< z*S%oBQu(x}BRiXht~`1fvY)K?wE2lT{+(0rq)Je|J=i$Vl^hL@> zPO(xOIfc~W&WWwap}T^tBR(ZQ8kN<+s}|fAQ>B?^E|6$QOtKISiOSi5HWR+p`?+vF zbA)>?LEXaoJ+QNDmOJLHeQBW3Vdp$rp9a;WFI3AXRR}v~&KEnQ$QUgwKk)Tf4bH!- zJ#w@YdCg+K?0VA0X31b@_B4C$asPs;v3&=o+QY!(|7cSu+`k`otJZ~R(R~N98Jw7j zU{OnU<}_+gkFr^x!#(Q!S5GZt&Oc++d4Og*Ggp(8$*4`Q#&NbUd$J z$G5SD7J2RdL3$#Ui?}Z>irqV?7GW4xFuU1EOP}HX8*EZz_CZD>rUq{isAt;lP(iu* z$||VO~OWV8I7Q+^;mLlb97V~`PINFJ5y?XBH1@Hpb9VF&Zf zHWEct5qO@{p0^lLs{MLVRMv*<_Qa-2orvh~(iWwfz60@icx>32M7@|b*{TL<=-E!k zdSXEf2WZ^P+odfW1Mx(xF!}^GbBphLRAv&}u-^n<`~1`<2v{JI>Owmxo*R5JuQ19Q z<%aoD5wgbrT>o}y5Qyjww)Jm^kmU>JKgs;#Q`#xQMveag1XVdFb)rVhRx z+neP3kI&lsY+WJb0~cKVzML^m#!Td3!UfkohZ5O^q0|a|GZJqGK;dwD6 ztFWa1PwUO(d)Tpf_@KG`9`Bs_Zb>7SDW2yKe@xEy%1?WHj86T=KM-%jBXYItBNDtv z`mx!14;KA@Z!_Pz$2)uO>*}*DQO(s4?bNfu#BnLVMx^AEsNg+}>+XH#L+}gMG3yiI zD2+B?R)7hcpvh?0ScX2vb z*M02Q&d-VsmoVVcW)2KI>J4lf&{&lg+%&KgoMY)(F)tiVuXx3lT-sgWY2MO54GyKl z4R7I={zbhWg4uRb`^wV7n=}|z#<{0GqV3dGX@|>L9V0_9^lN_ z7yImIm`%~yBgtpd(Yo1JGc)1L5ArIc3P|J+ZYrKdU%u7G3x|&W97KC?#IW|F_|kAI zRO@akBT8#}Kl|A&{mIO1yNdU!#xq142VaS8z-CfqzfXQrFzo}0_&Stg-Z!@NUrS~5 zj3^;P`wdY-Ys;_mfLf$Cg=%V<=quWS4I+ngQ-8uR4jqkvvtm(VpJU})?B%b0e867E zsKqjHlp|s}*L`KeBFM~Q{&(jS(F39DgN^8A>yhjdAjfG_a zN}Z+C^0TnQ?|49-edwq=0}X@f9698VZAz)2RB0p#i(Y$TKs_@_m21n-WT9Fp7JkKH zVIz68b68d?3$HDO{}Xwb4sUij53N~JMtadmkAx!n$<297@#*bK5kdmu4pQy!th*~i&U37t!9)e z$VRe-tQOiWb9#oPTokHxaQSRX!L+xj1hzy?u*#;8s3XDEv;Qy3{FFSx;`Q5Pa!e;~ z(YL*vx0)ag{oBuOTz@pjeW8SA<gsY@no`@kgLOOU3Y#4#0F;7MakzOwIc3$uXxWPfkID;6c3FOvS8lk^T1 z#%xKYfZ@R+PKXng zno4ojA=5lv$iRuq$7R3@nxPHe%<$V(OcmlCoY+d1E%hRqn^(4?>F!uQ^;4w>achL* zK}|%{{TNZ9zHhl*bF=SQ-tS=wOLR~={&N)2)?5aqW-SI*qjKkaR7Q2)C$ysCe)|1icoUAX*-e)cg9 zWjss4oOP6BbE*RM*&-F`dzHlwck^<)M|+Ud$#73ct$a7Qx=${ZmM~qx@XIkjj+oXk zdpLwEeY!fts{?vZG!KplIa$b=y%htS7W^ZHNQ`EuW)ABUnZF#{k8h^Do5|aYIPAnH zQ{Kr+)`jtVb}`nfr=$g67^wb?{2<=><6i7mM$wX@SS=4Wk(rM|Wui$e)C$RAC27^9 zrExf|J~UA-nS3!J(-H@L;Zow@a=c`eW#+Yq=^*d(dalTujwPOKrE058ZJ8VEc~bMt z9y_hAL*B+nnbO*x+(c`2ESXxn&q}oRCn?HuTu0e?hWmctWO@dFy2eS^L?)_KIhi(7 zfF^-NLd~P7mt{~;Lf~5lmH|_bmD0?x9*<7)NBSOh#v&gbKnA^riQY1KpttpX6c5J> z8(!B)j1Gi zk9w+lZL+r>aJ<)IsQ0gwsov@f({(1bJU@`u{`^3vV|p)xKQartQH)8pNG6h`lkkWg zhaE+THqKO6lUp&VrH#DW2B79!Sr0+}wa5Wf;;_%7t`ZEk{VCcY}u^lUgSs>~UJB7NzPSxw7&PwmPlj1M``$(z>J>p%FK!%_laX z<3#)dyZf-TktuTPjnzqf@?;}ZnGvQs(}G_cV6|YV@)Gmj2JiInQyf|MX=ImHvmD zved+eJc#R?v8TqHrWLy3!2Dw z3HmtIIBG}MmT?L#R$)#LsLxL5jdXfLDVsaQGO;mQl4I+PLWDO}XQYFpZe!{;$bNtDK0veIi9TNW(-m{ircfnrdXbG;L-iuSl8l^p}+UzbV;nTwV#;?+& zpj?s&oy`fSdy}(&Wt#TXIeOQF|EeVdRw5_M}f6dlj;J zZ#-T@u%M5=2Ug3yc07K}y}k>!lekR(M+n;aDYxM%?uQ8Hyl%NZyUTKQ5{}_I+(i8E z2@46oAmEIdryllRHYK??O}g~^=I0N4&&@kll{m{=+YDsa97dQwHm4qDY3!i6=n?M> z&nw5w^^bTL=Ph$olI9o&Vc=mTqsx5b5%0yG*ze3ck9g;YlRF^$QASBWCq@Odu_w7P z(ECPWg;O44a#nI_Z^DPs3PkW(wn~44x2ChRVu4xX{!2QOhgnhBh9BeQS@jGs-ohP{($+kmYh5lG2Ey4xS?@gobRd`lPExz8~zZ50p!CwfEw=B)6J*ycj? zKGKpL7b% zG ze&}Q>w^6O>n!F=+c!pg-Y}Y)f)rAFx_5HLgH5HOlM!x;RBjp4iXVUJ)SeP-pPh@;t zg}y}h;gqA6#_Mp9^aODk>s@%7@?DnsqRE9lU>H;J1vNxei6yNtu~s zlh|huayF}2ZSbS%MB2QIHuv*}x;;+R;|8jbdJ1W!kk{!QpCDz5TnJw*lU#^xXUGM4 zCuCz9U&PwX`tB<+x5GkL*eS?GK_wLQ)lVs?&?$&15?d~0bR2X%HEAM~jh(fXYKYO1MvoN43g+ z6!EYfv4m*I5p$=AMv$y($qM79poaWyf;F}b*!dx1pT-5xT=rnWiCmb_ zBM*z~6Ra+A3eh{f%2XU^Npir&ctXJ$Ojo2*JIM_d_TNrn=}uvs@0_K3BU?nyiHM$X=mx0yV8Zxg=Aspl#(QO2vtxPy$3o&F?Ef+;j<2LJz8{PUqlxl_(C{+o->tZ>5m zvw4GQJMzjXjF-Yc!GMKMVGR18WI$tr0TOqs@l26VGC_sDNTHK3LN`*V)aFLqvBS7w zt}qYP;(1E(dl(4Xr8l|va-Y!6&*2CpbTf)O)9sg-@m3l02g!aVt)dDnEtl;@B_t(u ze2HBT*KCwa02%)R8%UFEJK@`r7n;5!FRTR%zf*uZxmM^TQp}2t7eIz*6hMIzL-9}< ztEDRBcBcTX1aHS*JC45wD`PE}(ZDV>igh=+$#^%n(okeCeDpFV5>(^jE}T8bG}WAa z3-?txc%J6Ae!qKaEQ^poYiev~Y)4GEQ^`ciJc}uKFDLn*hp+BwyB0;y&H!0Y2xuPq z`MRs0>d)nqD#FdhC(lrvF#B4J?6#D}A@K1+?klju^YfGwZ{Z3Es=4 zt;Y$}!&x!_$Uy2ty*g`FPHYeUnXFJ*CpvszWGw@~130$#C!EAGmY6lP&Qs-RacA&f z`b6ba6{Y;cD!|^CU<(WTKdGsY2b!Fk9{$OWn6~hBT{B+ME*!@HsiJZulNJ5oSp5BM z;Eu9rrV86sIZ%{1vj-0-EBLkWz^^~8_Ln4Te=P;8g1K5Q5$~`_vF zp3u%`fi+FXVRcau>`af=gU<|GpKl$pEOKj zOd%Y>0$Hj$%RJ3hh*=!*qC0ZZT+_JM%u^z+hK(sJgfK;ygcE%p9;ag|sJlp^sJpx) zYk{o<8o5`jglrglJ|=o9mL^&CJd;4-l(oOhTawKo%`gy`VgmTj4R6fT2*9dYhU*r0BgnuNo zkp2sf9}6%SjfF z-9`69#>U9e#du`UYq)r_J+YhyI}TsS@!v}($NUxeZlPCV)#1sp)BEG^H=N5W z%t-iTCbKJ++z_i+Ot_j*enZT#o_+Nc^2Eoh15e#^^52K!?_a;Yv{bv$wW@UyG|w?k(M`z8WJ?r!ox*RSC$K*7IgAND*vnRvt7k$U z=Hs**U3P%(HDg^5={M8b)^mA#oQG85CR?C5d!FeK*>ek03g77z&ihQ6Dl|w1DyV=8 z*QDcC3iq`$J;GTdL)GCK@ODPbYG;E3)0Ok-j&)0B#5^ER@;?!6J!?knoBQJL+c3Xg zGkC&&&EU_xH_!omSVkwT`d;AqzUm#5W3zLab1&Z1=P8Nw&2DAH6gyiUXHw}2o2}=O z?p?Ua{#e3!Wv1vU)(7-zd_6MZ4sPoAs%sMJX>dLDYNjsQbK8KOl7@v&oOK;C1ak99CqjPf>;D47{Sa$L@1{qjcGT{c6kt!1AR8vvm`s2 zSxl$JUDf9Ap7LIJ1w*b)<~fdB)Y1#`K}tTIH*<6U>xrk8>)69Nt=`XET90MvZajii z-l{LKWO@pC=ff#hj?**FgQ=xH)9U5J5O1$$+W67_4F8)^+IDmn?Ys49PLirV>gKdEcVLrO<9XS<8F`t( z$Fs|>nw+aEWoqpgP|U{;FKxnf zsTej=rW7+kG2t_d$#ROxq8K;DB#Ds?`+w_Xr|u7J$*z%*ptIXmo#UfA3+IWDE01Od z9`9Q?Z*pve&*NTBK85gNp#+v{zYh#gEEbZL7N*y^{a<5xolP2a_bFd_qQ92zFOF<< zdcuG5z?7NS_PddiHgFnbk78}N(JQdn#)KiM(=-F<2zQQ@WSRdZK3lt~ugw2+tSsBP z&*pyGORQHbVH%MfCn4wQ7$fvp%Y78Q!)dwv?sz~g{{pLMV-lv_ss&|ko_DqMmAT2w z>)d;}x14+H>6muKyZsWul}9N&kFvwr6rQKvmn5~8SDtVRl(7^Ks=$ZXdVeOVRftV$ z6-q&nKa-_oo75gvDA#FF?$fbaD48%9pe}kwpGMBdRQPL_YKHRtuVBdXb-6EXvX5L= z1$+TEC!w})aYSpbGAGXYuY=OuvZ$`)Du-V#;APzFHN^#jaV-q6R}>y!eGwWSJ4cNR z08hu@%CC4fRvb!9!CPSxo2cDQ&Pz(J_Gk{RE(ihBDl7c^O}Yxfy3*>2cAPiD_fjnH zv{EX<^Q*wUOs-%%%ga3Pf(mFxY*U;dr!gKXA8;DO4(Ck8)tGQ9XHmP$u!0yzn1X^)WBN?EG#IsD%l!O(sQOY z8MGp4MU}ziV~l`Nf@b3FFMVLoLpkQ#U)bx-H$QmOd#%ZT(|gmr>q3t#4BY*|!yD?Z3OxMK`VIF4 zu3NtR^PdY*N<+h4Yu4TuSo^?+rga;e9?CS=zUjSn@0{;@@6Pa@|Io$f*X^zRv9~bY zY<mONX9y;WGb8p$tc}vUW9`e?jFTCx| zGp%n^iH^6ug=vTOv(I|}-e0}#{jO(k>pNb5W_a{1UeA1+S91uJgjIwFLJMI#p_6cs z&_fs|q#w3i0m4E;1)-WyM`$E$ChQ{YBOD_15=IIBUs$dnp@I-1)Dt!m+JAvL8sTO) zp_?#5$bAQ7LWs~vXeaC>93&hgj1uyH2@WAdXd!GT>?0f^LE#=Y8{*u7P1Q_c+(KVY5}& zBg1A$*M)yD*Z-Mo^B>F`x(@!qWd0Y|;0NYjU7J2IZ|S=012gw8Tt_}ITXkLdM>C{r z>mSYaC%7K@F zgb1q$)r1;CEuo&!L}(@mfAdEOaT_<=2pxo7gigYK!Xd(8LN}rC0GSd71*07KCWESb%h6hT^Z8zb!99H=t@F~t^t&(t`#m44cV$13vd{=hsp z$C{ni3r?BW6kTIYH!YW0mg$~jS-z1!eH&A9q7(b|tbj;lQVbd3V52UadXC3SqpdX^Xem#Lj`Q6|8an>c_-t=0`L=`(&<@#V3HaA1S1i7;J{fPH zV(TLl2%_wJ%GDxU*)IvA>|Kk^jVLIOf3XzRoU}4dF|2Z#_v)>pIbyUQ|D+n&Dh)Z6 z<7!tGC?&1E!o0_Gmsv|s#@m3U;;4;$qs7%kT1aX90))-LI)!guyHz@5ftBvdUv@G+ zYM!5C%}6^;^2jpt*aB;|r}rB3O|EI1D{0ph^Uexuju}~CS!o?BPsT?knGH(-1TLXr zHMfb@wo&pVAa5CQl1Tf*8r@l$rN2iEtIy<=98(#g77KNa^tSCW@Pk$wwY*|c`#_r zm|`nXirEGzXxytX9|A;o+7GM|{# z&fHPbQuXjY(gfpT{{s9UCUT<5Ja#z)W#Pl)c}buxmOTBynuJ|BHEXkXi|0vf7L^kq zt)8@fvdw0Q1?ip>51Wt4$FuW`rsxW5j&JyjC*vDU-yPO@GrK@9dvu(pYVi?ZL0}1y zGVRyV#K;x!b>XAtTRiXC_9gSq71mr|lyie&A6C_*dL~atzI@Uwxy729)<(o?HjB$3 zw!isgyem1!cgvLw^25aI$V)%be;C~I7tE_y zTGP|IUO?EaMDL7V2|u@eUHn{mA(9;u1^kNu?ldwR5*C_(L4ckU#$3J#vK-oO?p%Zk z7#8?T#*f*$xWGiq zVORQh&5&?&_hGZBymL+Y)l|s!!;|rCK3gxCM*4uK?#JeltKs*~A4?%fhh+xHGz)nh z{IU6wl1jTy#!r|B=UEpls0DodC*xu#$!`KS49wzQzW|{XSTC^VF|BB&?FP2+pt*A~ zJ!$aZnO4pqX(Pb&tbQ7fMuCkUG~ZbanMZ$`WPx3~DvpB+{>+?SOzoO~#;B3d3KdIe z(9WN!)oE}$IVScb2 zvD;i>Q~VZMG`bvJ*G|047Q;m=WcH{YEwiBC($TRYR|?t*TV35ae^y>WMa1nt~N5_N*Jt zVy@?GzH#)7G5a7mExy2K#S=#A#(6^sETE6rP6ecS(PlmW!uXcd}^Znh?wz;%?` z3$P(U4Tc&F$va0;?tKs-quZu8vr(51M3G|qv1S6Sy} z1ka}xoQz*OZsldv0_$xUMXAV4QZ3Sbo%buA5IM!09~9MPBxOq1_43G(hs<*~FxHlE zM$bNvDm&X81~=UK$hhc>lVx+@9I#Z$s{*zim~E4RBfMH*5nyO|`zKfvu$>d|T7m7J zfY$*`<&s}`?BPy;`z9bB1h#)dhCRRzPQV)mc4z{g>jKol1iV~eN6x^b{1Sk@6A;UR zMbALQ3<5Sd0k00&@C3Y#z>ZJAYXf#-0$v1|EBwVXNw^1~1uT`+hk#{G!0QF(pMW<4 zEPn!?#Q;+{0WTj|v4dyRU%V>?STf<^3SgzcBt-fNZnRvDx zmy_5*>5-H) zQLu);?VHTho6)t~x0=N_<6`XDYVN$5Ivv@n@x)fABcL54iWBNgBU&^47tt+%rIU?* zVr((6VPFX@Y({Q|Xu?^T;Hm!>;#tp(;vi@SI5WT_Z9G!^j9GjOC6YH^uYk)B+Tz^$QTv=OgHC$)Qj0M!8A>mEk?yLTf78%xPV>wV9$-lrajb z<>+MW)r>B1n_rOCfx|Pyw6CIygrNTP-DVe>RLe+x`9RZjK+Hs)v{r(Ad|WK zG#F*y%%FGwh1TQ+L12vs&Q$M}z-m)qs$Mm)5U_@XH!e^MplxFy6IyMhFX>j?+T=A>j3H zA}QIbfgPmfzGZH#w&r---X1kKUC5-&i`CXyzJrHHQ2=9JqUo;2{tEok{2EkGj=U~Hu|ZR?Uyn}0YmB8KNY_d*a)y~f}~7EsOnv$)&J{gyd{w~*8h8ecLVRS zrEZ!nb*ipwA^EZ3nhzY!%370=J_O zi~rrsy&bJ^O%y$p$Z z&(`zw=}9d_hu<4DOXga6wu=z~VEw1kZTm-ppVS`dP_3r-A#y^ovS4A&+z;+C!9+NI zVoEo#x?vI4_StsSSX0jN|AAq}#z<%x{}uErU`!s2xeU=7bVV(|+VRe8{C5Cs|6nxU zofuup@1PdJ5!uJg%@)kDi6gP-BFC&h@vu{h6vz>k0?g44_S9gfGTi>5G!$0jbOV2< zcou$S-n+w^8x9<&N=^pKw4sb%1x)w)>DmIU37BO=60mK+>VPGcxA1lWs|Hq?g0~-7 zE3g$Qux?=cf$_|>HaMUEV*vL7Y!@V@KPk<1B`W#P^ua`$Ke>JvAYMq?od_+L0UiL^8FY$L7kFJ|%Qt=Zw=U(W1|2T7{}mP)i9 zV09BX*khO1ad86mJ?ViA#;H>0ZS!h39x!#JTq=0mjhHGxyp#2G7LGekPS(| z>VQSSYe<1@1a@KqtPNP`1mjc+UIbWs3amuy)_VYUpD=gV;v$y)H)_SawwB(}S&Lk@ ze>@s@nU&Ru)mPWjv4U4o^ON>?E!f2ifmH)*8kLaCElO)9+Bs_Guc5PrP7C#QRw+#5 z8nUa2%kQ)Mazyb)&nd^3u_rVN%UQxoKV^Qo#ya2E$qUUJ&Hd$!v4Ojg@Do|55}M7P ze6=QZfV^wUDRa|Z)+}EZ2c6c98Cq6Gl*ACQr18a^Vy5eAMoeI}9`oE~Oucm9#nfes z|J0b}SpucXLF(|E5AK2(dq}f~$mw(J=^$~Wo%FJtQ)6N%_U{B%4Qyw^h-q9)ZF`AF z>^VStMr#-pPR4$9E#_BQ-l;KZ2=I8xVx&LM{AMklZ|8)xTGDm`+h!hRGROq$$U1lW zDcn}~N{paT9ZgVNRnt#WyPs$L)6IrDYyLT%Gftf`rQlkEgchBG$6BN}-Q+hnH$Z;& z(+L49183W}PmM{jnpg$QA26ruQ1Dp+Q?w4|X6d;^J!;m$OvTZDb67_1UdP-+3xB@+ zabO2X=M)o9b_HdeUV)|_$KgTdV8`PliU-Hz{=12nkH>?GuNaSq6kjzSZ&bW?Jl;;+ z(-1H(-)$8vZJc%LjP9Gi6qNzYR!P)NL@fo@oPrksRsn1?FlWWZe-C5)wpnKSJ=W}t zx_~F!r{_Ds-ID@Sn>&H+Ql2RS+YM|du-p{b2(azI5=0FvJO8o-T9V(o76Xf<6d_m{ zux%4yRlr&&z-oc1d8t)y0w&U=!djQPmbvNxW|6smDx?F%nhA)Vz(Ogo67UWJs|4mO zjf@a&pFJ*L0Z^=K7>0n2PvfWi_7Kn4T*rA_&a+9z>PkTi= zmaoUsYCPX;SkKOhl9F*8)npW$0JCzW`I;`2?irhNuBxO#7n;*N?&~FKb7IK0N7&H4 zNOExADJ-Z1tC_Pp3~p$idF)>1Tq*(Ar6=ZYyM(v#(o@(un-<7Ly%%X~T4;vu)#UBc zQ}JFii{;mh_Rru_FFS?nqSo08Vn3jT*O(3WQT&l>PBAfWn-QJ&(eP4^+_cTp^Gx(U zI_ys3smxii9614I(L((Kgc@M2m1b&#HG4`MX)VAKYsRmw)@B`&j{&x)yUxw%CffKJ zb!U5dxO+WQjibQomz(d9Ls83e{8~GQar;^{FK2uoS#CaPP_3^$#bU_PE1^#t;HDL3 z@%?CtmKC-Z)|^{6;Em(a5u%ND6zAvc4F3wsBf2or^4|Mtxv)DDb7Aa~v1ZnQGYl-G zy6_WE8-bNvcZxYO+c;aY0psih@gy~*5<9^e1jY6%t|aXwJEV9 zWWN3Ya@o4l{OAGb*|qYM^i(~ou17F#Hm4uJu0CRhL)|6%wHg z;P%fk2a|$W1*{8L(lQfXEwJbWSQ9YU>T%Ik7R7(>b!|NDH4n1!HduI9nrr*6G*>lO z-7Dl0_OMA$R|Wk#iD$T8ddVz3;tiO{gI0A~`#-Tc@}JD<2dzu8dR|X+ZTvZJdyS!d zW2Tj1)_uX6;qR_bb9u?4eeHM_rDo(qum5a;Rz$q6rf+y%Eju_}>s7C7dtI6eSzvM> zvixW3>+KUUTz5Md4Z_eVCKEC0?@8OsCeP2f_f|Y&?Q!o7`K&^>;l3&@o0>$P+57Pq zt$ugPcF=2*TRK1ODgx;DY1=`ykx&~78#~g>l1HqWDy7g<(O~9$*?KZf+YQ-f_}wpC zKPdKeJ#FrdSVi+ATP;^)tJgLBOd?zTr#rWj5H~>tYnz@%Fh7W}o{`{%d5`;y1fSSp zY2N$-1ApObR#sX7J_YVFe7Rj)q diff --git a/bin/nbns-netbsd4be/nbns-advertiser b/bin/nbns-netbsd4be/nbns-advertiser index 498f349f2c2f12e5521f502133fc23cf0f9df2c9..3e89ddaf77ef2b17e7de6b8fb12c94d54e3ecebc 100755 GIT binary patch delta 8189 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 MIoT|`Glb;-1}@Exk^lez delta 8332 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 diff --git a/bin/nbns-netbsd4le/nbns-advertiser b/bin/nbns-netbsd4le/nbns-advertiser index 9add83e6d1af3d0ee58383c55f8f8a6e86ca8e76..07cd215a9e2f0028f048d004fdcae206f210affd 100755 GIT binary patch delta 8040 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 delta 7904 zcmc(ke^}I2zQ@n`&Wy~!49++p;LOMv7?_|#;!33n8?F|Zc%?*z!qSy;y1`vq*&8lc zq*Qc+d#EoOUdO^4m6kQs;FX^6Mvr*I6*p|@NjGMOaoNBPck#xqbh+=({7}~C*}8w+ z=h=C9eLv@XKA-bBzrWw_`EvNUy5+dK-pczL<|J6QoZ*a6G5o3-;}8Lz#I`hSevv1= zd)df&ic=*eaIO{e6f(Dp6N=|~rC6<8!&}9E<>TBgbSe`+B<87dkbXk7F#7X{+3@tt zPkegzjAy1k$0J!C-m~JEYLYjIW7D4IrD9oFQtD6PrC|kb6JyV%1iix8?tx8Rqwj|$3Kr5V2wK;QV__zKk2n|hwBd_~*sxOXa5JmJtzr(h!ug1Ly=2Lq zEwOx10181d*aGaJRGbTs7Zc&x=s;FP691!kBqCn7K8_71vIt)y%kexcUW$mHR}{g9 z8O!r(84FjT3MIn-X&M`*w3Ru$Gs2K&>}$Qa5V0gJdL0{{1`l&@j%T!W|4>bz#8N;b zYNW;~^#^=PcEI=ck1Fm0smPwqCp$ON5mW2#X6{k`&Nu7_nh-1TCYE}p+D4(d$&P4S^FMzacDAtgxx9jx^}Q6VzxT8J-tsBaOUD_#)%y@4%X2 zEZ_SCro)~`&31Ur2tu=-h5*yq%R|%IGede?tynnSvf@Du<8-#(TZ9U`GXoXU@LJ(Z zQ#c)EDgUW4Fbw0&=u=u9?hGR)D%k0JMZ@&?w4b0xH8Xg#5pja)eY7ZK=rW;O4%vuq zCS^F>lQxCtf7m*&L%65M@T=m_)8ngNg{|cwOfK8uWo&~n8U9u1Dr5H<=OP^{_Xcz* zt6(;Vk=q=K*|2>DU8iB+OA6*_2)8;Kl;}w;EjZi1`ZR2v+iZQx69qrc^4y$Nd&Vax z(c`t==@=;*nTA&r)dSqN%hQ?moOoUTBWrc-08RLq&FE8L7d|>UdAl@=rqbYBjj0S5 z-{~_{uOXX7&isjo4Vp5mf|-2pPrxVB;nuR5zV|52@-e||Ryk~M2W@KD-U`~V7Q;oK!N6Y= z7Y*rrpD@kHGVF%YTIg`oSg}%vd!u-4#&XM=$;oh5?C@^F#!9Bm_s;&IJZyr*N7S9A z;?#@;{-L-u!^A%j8e=@aBIX%Q7TO>+!R=%VZl{0xYPEk&m5I&9gt%Cn3G=+ptH3zg zu{rJ7x;iwfU+gz7;-8AMMx*BEYiJd&^OT88#u#01aN{M;kyxwK5H(-o?~7$K7x9-x z+00G24W6DEV>onm(to=$;+94`;GnoNbB)FUEwkn!kRjG6iet=tr`Q>@j^8QH#w_7~ z7Mj>4JXd7J3eD1>r_S#=8f)fpLKhbwXGf*gHOzm182u{s_uGEE+C%pUtymG4pb6In zwo92Pi!*8(r$zYcL7jLZ?st~PnGvcSbd0u9ddvaej=KXh$E^-UooJYKb?ZC~`v&ZA ztUlk(NLM0_CF-sJQG`#4Y2c-MJQ}v%y<>9nKkBB@u;qCp5%I2jaYx9^_GkfZR=O9_ zhEqO(TQ=lz|GLTZKFsNUciCi8HNI@})eD1pz7$?0?ljNh(PD%7Tiz_zT8y}EwZ!u# z@r)(OFf}yo@mO55uvfyDi9cBG)!h||wy;cazgsKro*h3o z6oMw0T3CW@Z&e)d#Rq4o5b0X+!fexR6q1$#wqH1{aT-nPOG6PGR!|kl&kpuwH>w?% z4*0??Ii8;h_w1Z`%{QBT$$C5x({>FsV&gSogx1+GYRu@}iiq1nqa^N&-^M$|hw<^@ ztNzpIiwQLTV*ExtJF~2J&Aa@U$zi+UfDgBBcPCb-nji4(g-#F0Z41yn>yJHkoe@5* zIAV2jrPw^jSTzZIIEFffv0=^}UTSU>R&qU7^d{KoaS+-wN1(wm%QY-xhTvOyC#njqcE+L1UsD6uZcR>;!163b9CR)Ipz zpa)nNNK6U46?BQYH+^bQ<5@KDwZwYO3O0c|Xpi6tzu`y47YRA4^JwCPyt9zUh|I(h zO%Gg#pgQkdJa@Uo%biaoc{z`AZkQLNz>7;+$|BzGJe0DKOy?HhSV$1$tiC&R9B#1zOOH5n+%8@8fyyVyp{H9i^6Fp8P`kCg>`F9pnNkYlYN;!4DYg z1R>vR(jE-pfYF8m^^m0?FX&7`NKXZ{kRxr3b$}*N4M@K#DAOSaoQ!n?2dD&vKn;4{ zBiq@u_^=hViCCbZ93+Fn&#?|6D}kNzU^ZzILgs@^U;~NH#kal1qdPSU z)&bf9x%I;|=)7|K^C~{-+?9D;p&Ei_)R~pNWSYUBM0Vs$j0FmGIiI~pmMqt@P^qyG zv7fzGYqigg=U0bVwmOD)i2GKrJh;K+MJeua49wINOplCapC?u_@Ibe zU#02}SFld!{`E_^p${g?b|W~|IVgMuUhIQY8&=|K*tk+}wK?$&fWT&Mh zOyVVC?xV7Oa_fYOOytt+Z1~3%7&etBp`;I^fq0`kZrKxI?MwN0L;nVr#>EoI)EKl6a}}Si|xNUAvl|GFZ`J z5^Hy=_P;evMbC*I=lidD71tgajn0Fw?@?B1Q#h+j4KOuLx~ch5+x0x@dlp_V69wB3 z5vt<`S>><100GFb1wm~fln=?Ng|tCm(seDk-gwG41sgS0-+hD6)L3eE_+J8Z53XQ0O@NXV}of%a^?SlDX~KJL00(#7G?(m z4=v{`AEYB+@?*}F6!?aMty6T3S$}Omd}koPG$^U85^-*faXpWzrA(*+W2n6Nh6bqb z3FtCc1bhpEG7}APpaFHrCkGqVj*9D%UNxlw6TuF&IuCYyqqmG_NNm+~1*^q&X17U9 z55}My1r^RCr<1I@AtXltxl}mamv(SoE;f8~64yDSkK@`fy3Vh8QWRg#Me4}qGq~>j zBVAYj30J3OEQTAJP`(>gwLmrlhgfmtwHa+Yun0gk(EpsX@h6;rx$;X%Q;3GxL9uh! z_)0~z5@#4Ks#7zuZ3ZuOl|}Mlu2Smp&~|Os^9Q+# zA+2~eh^{Ci@#RmGLAOBVi7M9}x$dEBIg@99+jQ6%qky|9#j zrcezo!$`QcX7ZDgrVF>JTHGqN^5VPrX9mh@5t39jAlDU_&A$!P<;LMr4Ox8P3KcLn@o&U@q&8zFn-XEyO~R12Kj?{9wI*^tNxigs}5h~tnoX}`X>UC(nC|yl%L9I&^GZsKIE^SQZ5Q}}j8%?Z#(&bZ6@!!k|Rnn`tjRZ;%3sOKP;nF?Fol4#zpZFIp z4CgUrN*j(I3}0499qta-))#pUS5;zcs$IM4d4xh$y%N>Q4T3M>)vi-GfGbrrtRt?= zGJg`M0i-+Svc25IJLMPlqI9QxXfKb4_+&4aaib~P$Jar;yN@plhvj$OCrJ1df7E&<93< z5+{gQkPI?GJ}3dzuB~tKlaX_+cn_$+ZRC4#tv$xKMe;HE*h!wmb7l8QydN~nS=|u5 z@<9k`B1@J|@dtQ{y!jNgh4Kj!=jA#71+i4#MWRM_lNgn=K847T50Yq-c@M;ZyqQF< ze1b%yJm)k-zr2ftR(6xfm$QBa(Ig)vF(UIb5E=63GkpGvrFyJ3{06G=xddC6ejR5p zH+vZywP3Y+7^}tZ*AC#z{8N6j|3cjk{YqVD&+sH=bl+!KkzpWs!t$TAWY`wTnSERz zL;v-<(Vlo#lFQn8n%qPl^qKKSkIG;BJ?3h(IF?ca`{YY~d|^0!3#2a+{fY7)`uNRq z=C8RqaH%=R2jY^kWzGZoKc*GXVUiA#7v-Iw^ZBYoOrOnlJg>J0wS zXaDaGTuF=n(fHTLDDJ4sO;WVnW0JHgCH{Y@lrNa11WoZ8Y(z9dDQB4^qiiSu-5fG0- Q#IBqr(LVsM{X&iYU&Ipwb^rhX diff --git a/bin/nbns/nbns-advertiser b/bin/nbns/nbns-advertiser index 3fc6f53e5d9a2856a9f299028b6e7d56a8ab910d..3ec67fdf0501e3f4bafda254dfd5157ec18b1b6b 100755 GIT binary patch delta 16948 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 jBbqT%*R} delta 17041 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 >= MAX_IFACE_CONTEXTS) { + out->truncated = 1; return 0; } @@ -733,6 +738,7 @@ static struct link_context TC_AUTO_IP_UNUSED *find_or_add_link_context(struct li } } if (out->count >= MAX_IFACE_CONTEXTS) { + out->truncated = 1; return NULL; } ctx = &out->links[out->count++]; @@ -780,6 +786,7 @@ static int TC_AUTO_IP_UNUSED append_link_ipv4(struct link_context_set *out, return 0; } if (ctx->ipv4_count >= MAX_LINK_IPV4_ADDRS) { + out->truncated = 1; return 0; } pos = ctx->ipv4_count++; @@ -791,12 +798,13 @@ static int TC_AUTO_IP_UNUSED append_link_ipv4(struct link_context_set *out, return 1; } -static int TC_AUTO_IP_UNUSED append_link_ipv6(struct link_context_set *out, - const char *name, - const struct in6_addr *addr, - int prefix_len, - unsigned int scope_id, - int flags) { +static int TC_AUTO_IP_UNUSED append_link_ipv6_with_transport(struct link_context_set *out, + const char *name, + const struct in6_addr *addr, + int prefix_len, + unsigned int scope_id, + int flags, + int mdns_ipv6_transport) { struct link_context *ctx; size_t pos; @@ -808,11 +816,15 @@ static int TC_AUTO_IP_UNUSED append_link_ipv6(struct link_context_set *out, return 0; } if (ctx->ipv6_count >= MAX_LINK_IPV6_ADDRS) { + out->truncated = 1; return 0; } if (ctx->ifindex == 0 && scope_id != 0) { ctx->ifindex = scope_id; } + if (mdns_ipv6_transport) { + ctx->mdns_ipv6_transport = 1; + } pos = ctx->ipv6_count++; ctx->ipv6[pos].addr = *addr; ctx->ipv6[pos].scope_id = scope_id; @@ -821,6 +833,15 @@ static int TC_AUTO_IP_UNUSED append_link_ipv6(struct link_context_set *out, return 1; } +static int TC_AUTO_IP_UNUSED append_link_ipv6(struct link_context_set *out, + const char *name, + const struct in6_addr *addr, + int prefix_len, + unsigned int scope_id, + int flags) { + return append_link_ipv6_with_transport(out, name, addr, prefix_len, scope_id, flags, 1); +} + static int TC_AUTO_IP_UNUSED link_ipv6_addr_is_samba_bindable(const struct link_ipv6_addr *addr) { return addr->prefix_len >= 0 && runtime_ipv6_is_bindable(&addr->addr); } @@ -860,7 +881,15 @@ static int TC_AUTO_IP_UNUSED link_context_has_advertisable_address(const struct } static int TC_AUTO_IP_UNUSED link_context_has_mdns_ipv6_transport(const struct link_context *ctx) { - return ctx->ifindex != 0 && ctx->ipv6_count > 0; + return ctx->mdns_ipv6_transport && ctx->ifindex != 0 && ctx->ipv6_count > 0; +} + +static void TC_AUTO_IP_UNUSED disable_link_contexts_mdns_ipv6_transport(struct link_context_set *set) { + size_t i; + + for (i = 0; i < set->count; i++) { + set->links[i].mdns_ipv6_transport = 0; + } } static int TC_AUTO_IP_UNUSED link_context_is_advertise_eligible(const struct link_context *ctx) { @@ -877,6 +906,7 @@ static void TC_AUTO_IP_UNUSED filter_advertise_link_contexts(struct link_context continue; } if (out->count >= MAX_IFACE_CONTEXTS) { + out->truncated = 1; break; } out->links[out->count++] = in->links[i]; @@ -891,6 +921,7 @@ static int TC_AUTO_IP_UNUSED link_context_identity_equal(const struct link_conte if (strcmp(a->name, b->name) != 0 || a->flags != b->flags || a->ifindex != b->ifindex || + a->mdns_ipv6_transport != b->mdns_ipv6_transport || a->ipv4_count != b->ipv4_count || a->ipv6_count != b->ipv6_count) { return 0; @@ -1112,12 +1143,13 @@ static int TC_AUTO_IP_UNUSED collect_link_contexts_with_policy(struct link_conte memset(&sin6, 0, sizeof(sin6)); memcpy(&sin6, entry.addr, sizeof(sin6)); prefix_len = get_ipv6_prefix_len(sockfd6, entry.name, &sin6); - append_link_ipv6(out, - entry.name, - &sin6.sin6_addr, - prefix_len, - (unsigned int)sin6.sin6_scope_id, - flags); + append_link_ipv6_with_transport(out, + entry.name, + &sin6.sin6_addr, + prefix_len, + (unsigned int)sin6.sin6_scope_id, + flags, + sockfd6 >= 0); #if defined(AF_LINK) && (defined(__NetBSD__) || defined(__APPLE__) || defined(__FreeBSD__) || defined(__OpenBSD__) || defined(__DragonFly__)) } else if (entry.addr->sa_family == AF_LINK && entry.addr_len >= sizeof(struct sockaddr_dl)) { const struct sockaddr_dl *sdl = (const struct sockaddr_dl *)entry.addr; @@ -1178,12 +1210,13 @@ static void TC_AUTO_IP_UNUSED log_link_contexts(const char *prefix, const struct for (i = 0; i < set->count; i++) { size_t j; const struct link_context *ctx = &set->links[i]; - fprintf(stderr, "%s: link[%lu] iface=%s flags=0x%x ifindex=%u score=%d ipv4=%lu ipv6=%lu\n", + fprintf(stderr, "%s: link[%lu] iface=%s flags=0x%x ifindex=%u mdns_ipv6=%d score=%d ipv4=%lu ipv6=%lu\n", prefix, (unsigned long)i, ctx->name, (unsigned int)ctx->flags, ctx->ifindex, + ctx->mdns_ipv6_transport, link_context_priority_score(ctx), (unsigned long)ctx->ipv4_count, (unsigned long)ctx->ipv6_count); diff --git a/build/mdns-advertiser.c b/build/mdns-advertiser.c index a2892c3..6b97f8f 100644 --- a/build/mdns-advertiser.c +++ b/build/mdns-advertiser.c @@ -75,6 +75,7 @@ #define DNS_TYPE_ANY 255 #define DNS_CLASS_IN 1 #define DNS_CLASS_CACHE_FLUSH 0x8000 +#define DNS_CLASS_QU 0x8000 #define DNS_CLASS_IN_UNIQUE (DNS_CLASS_IN | DNS_CLASS_CACHE_FLUSH) #define MDNS_REPLY_UNICAST 1 #define MDNS_REPLY_MULTICAST 2 @@ -140,50 +141,25 @@ static int timestamped_write_message(FILE *stream, const char *message) { static int timestamped_vfprintf(FILE *stream, const char *format, va_list ap) { char stack_message[4096]; - char *message = stack_message; - va_list sizing_ap; - va_list format_ap; int result; if (stream != stderr && stream != stdout) { return vfprintf(stream, format, ap); } - TC_VA_COPY(sizing_ap, ap); - result = vsnprintf(stack_message, sizeof(stack_message), format, sizing_ap); - va_end(sizing_ap); + result = vsnprintf(stack_message, sizeof(stack_message), format, ap); if (result < 0) { return result; } - if ((size_t)result >= sizeof(stack_message)) { - size_t message_size = (size_t)result + 1; - message = malloc(message_size); - if (message == NULL) { - (void)timestamped_write_message(stream, stack_message); - (void)timestamped_write_message(stream, "\n[log message truncated: allocation failed]\n"); - fflush(stream); - return result; - } - TC_VA_COPY(format_ap, ap); - result = vsnprintf(message, message_size, format, format_ap); - va_end(format_ap); - if (result < 0) { - free(message); - return result; - } + stack_message[sizeof(stack_message) - 2] = '\n'; + stack_message[sizeof(stack_message) - 1] = '\0'; } - if (timestamped_write_message(stream, message) != 0) { - if (message != stack_message) { - free(message); - } + if (timestamped_write_message(stream, stack_message) != 0) { return -1; } fflush(stream); - if (message != stack_message) { - free(message); - } return result; } @@ -304,6 +280,7 @@ struct service_record { struct service_record_set { struct service_record records[SNAPSHOT_MAX_RECORDS]; size_t count; + int truncated; }; struct service_type_set { @@ -316,6 +293,14 @@ struct mdns_socket_pair { int ipv6_fd; }; +struct mdns_membership_delta { + uint32_t ipv4[MAX_IFACE_CONTEXTS]; + size_t ipv4_count; + unsigned int ipv6_ifindex[MAX_IFACE_CONTEXTS]; + char ipv6_name[MAX_IFACE_CONTEXTS][IFNAMSIZ]; + size_t ipv6_count; +}; + struct query_answer_routes { int smb_ptr; int smb_srv; @@ -386,9 +371,36 @@ typedef int (*mdns_collect_iface_contexts_fn)(struct iface_context_set *out, voi typedef int (*mdns_collect_link_contexts_fn)(struct link_context_set *out, void *userdata); typedef void (*mdns_sleep_fn)(unsigned int seconds, void *userdata); +static void derive_usable_iface_contexts_from_links(struct iface_context_set *out, + const struct link_context_set *links) { + size_t i; + + memset(out, 0, sizeof(*out)); + out->truncated = links->truncated; + for (i = 0; i < links->count; i++) { + size_t j; + const struct link_context *link = &links->links[i]; + for (j = 0; j < link->ipv4_count; j++) { + (void)append_iface_context(out, + link->name, + link->ipv4[j].addr, + link->ipv4[j].netmask, + link->flags); + } + } + sort_iface_contexts(out); +} + static int collect_usable_iface_contexts_provider(struct iface_context_set *out, void *userdata) { + struct link_context_set links; + (void)userdata; - return collect_usable_iface_contexts(out); + memset(&links, 0, sizeof(links)); + if (collect_usable_link_contexts(&links) != 0) { + return -1; + } + derive_usable_iface_contexts_from_links(out, &links); + return 0; } static int collect_usable_link_contexts_provider(struct link_context_set *out, void *userdata) { @@ -511,6 +523,10 @@ static int print_auto_ip_cidrs_with_provider(FILE *stream, if (contexts.count == 0) { return EXIT_AUTO_IP_UNAVAILABLE; } + if (contexts.truncated) { + fprintf(stderr, "auto-ip: usable IPv4 context list exceeded static capacity\n"); + return EXIT_AUTO_IP_PROBE_FAILED; + } sort_iface_contexts(&contexts); if (print_iface_context_cidrs(stream, &contexts) != 0) { return EXIT_AUTO_IP_PROBE_FAILED; @@ -549,6 +565,10 @@ static int print_smb_bind_interfaces_with_provider(FILE *stream, if (!has_samba_address) { return EXIT_AUTO_IP_UNAVAILABLE; } + if (links.truncated) { + fprintf(stderr, "auto-ip: Samba bind interface list exceeded static capacity\n"); + return EXIT_AUTO_IP_PROBE_FAILED; + } if (print_smb_link_bind_tokens(stream, &links) != 0) { return EXIT_AUTO_IP_PROBE_FAILED; } @@ -576,6 +596,10 @@ static int print_mdns_socket_families_with_provider(FILE *stream, return EXIT_AUTO_IP_UNAVAILABLE; } filter_advertise_link_contexts(&links, &all_links); + if (all_links.truncated || links.truncated) { + fprintf(stderr, "auto-ip: mDNS socket family link list exceeded static capacity\n"); + return EXIT_AUTO_IP_PROBE_FAILED; + } if (links.count == 0) { return EXIT_AUTO_IP_UNAVAILABLE; } @@ -603,7 +627,7 @@ static int print_mdns_socket_families_with_provider(FILE *stream, } static int open_dualstack_mdns_sockets(int shared_bind, - const struct link_context_set *links, + struct link_context_set *links, int log_bind_errors, struct mdns_socket_pair *out); static void close_mdns_socket_pair(struct mdns_socket_pair *sockets); @@ -611,6 +635,9 @@ static int set_outbound_multicast_interface(int sockfd, uint32_t ipv4_addr, cons int log_success, int log_errors); static int set_outbound_multicast_interface6(int sockfd, unsigned int ifindex, const char *socket_role, int log_success, int log_errors); +static void drop_mdns_multicast_group_best_effort(int sockfd, uint32_t ipv4_addr, const char *socket_role); +static void drop_mdns_multicast_group6_best_effort(int sockfd, unsigned int ifindex, const char *ifname, + const char *socket_role); static void log_startup_config(const struct config *cfg, int shared_bind, int auto_ip) { char ipv4_buf[INET_ADDRSTRLEN]; @@ -774,6 +801,7 @@ static struct service_record *find_or_add_record(struct service_record_set *set, return record; } if (set->count >= SNAPSHOT_MAX_RECORDS) { + set->truncated = 1; return NULL; } record = &set->records[set->count++]; @@ -1965,8 +1993,12 @@ static int load_snapshot_file(const char *path, struct service_record_set *out) fclose(fp); return -1; } - if (out->count >= SNAPSHOT_MAX_RECORDS || - build_instance_fqdn(current.instance_fqdn, sizeof(current.instance_fqdn), current.instance_name, current.service_type) != 0 || + if (out->count >= SNAPSHOT_MAX_RECORDS) { + out->truncated = 1; + fclose(fp); + return -1; + } + if (build_instance_fqdn(current.instance_fqdn, sizeof(current.instance_fqdn), current.instance_name, current.service_type) != 0 || build_host_label_from_fqdn(current.host_label, sizeof(current.host_label), current.host_fqdn) != 0) { fclose(fp); return -1; @@ -2384,6 +2416,7 @@ static int filter_records_by_host(struct service_record_set *out, const struct s continue; } if (out->count >= SNAPSHOT_MAX_RECORDS) { + out->truncated = 1; break; } out->records[out->count++] = *record; @@ -2470,6 +2503,7 @@ static void send_capture_query_to_all_links(const struct mdns_socket_pair *socke static int capture_mdns_snapshot_links_raw(struct service_record_set *out, const struct link_context_set *links) { struct mdns_socket_pair sockets; + struct link_context_set socket_links; struct sockaddr_in mdns_dest4; struct sockaddr_in6 mdns_dest6; size_t i; @@ -2477,9 +2511,10 @@ static int capture_mdns_snapshot_links_raw(struct service_record_set *out, memset(out, 0, sizeof(*out)); memset(&service_types, 0, sizeof(service_types)); + socket_links = *links; sockets.ipv4_fd = -1; sockets.ipv6_fd = -1; - if (open_dualstack_mdns_sockets(1, links, 1, &sockets) != 0) { + if (open_dualstack_mdns_sockets(1, &socket_links, 1, &sockets) != 0) { return -1; } @@ -2493,17 +2528,17 @@ static int capture_mdns_snapshot_links_raw(struct service_record_set *out, mdns_dest6.sin6_port = htons(MDNS_PORT); (void)inet_pton(AF_INET6, MDNS_GROUP_V6, &mdns_dest6.sin6_addr); - send_capture_query_to_all_links(&sockets, links, &mdns_dest4, &mdns_dest6, "_services._dns-sd._udp.local.", DNS_TYPE_PTR); + send_capture_query_to_all_links(&sockets, &socket_links, &mdns_dest4, &mdns_dest6, "_services._dns-sd._udp.local.", DNS_TYPE_PTR); (void)collect_mdns_responses_pair(&sockets, SNAPSHOT_CAPTURE_STEP_SECONDS, out, &service_types); for (i = 0; i < service_types.count; i++) { - send_capture_query_to_all_links(&sockets, links, &mdns_dest4, &mdns_dest6, service_types.types[i], DNS_TYPE_PTR); + send_capture_query_to_all_links(&sockets, &socket_links, &mdns_dest4, &mdns_dest6, service_types.types[i], DNS_TYPE_PTR); } (void)collect_mdns_responses_pair(&sockets, SNAPSHOT_CAPTURE_STEP_SECONDS, out, &service_types); for (i = 0; i < out->count; i++) { - send_capture_query_to_all_links(&sockets, links, &mdns_dest4, &mdns_dest6, out->records[i].instance_fqdn, DNS_TYPE_SRV); - send_capture_query_to_all_links(&sockets, links, &mdns_dest4, &mdns_dest6, out->records[i].instance_fqdn, DNS_TYPE_TXT); + send_capture_query_to_all_links(&sockets, &socket_links, &mdns_dest4, &mdns_dest6, out->records[i].instance_fqdn, DNS_TYPE_SRV); + send_capture_query_to_all_links(&sockets, &socket_links, &mdns_dest4, &mdns_dest6, out->records[i].instance_fqdn, DNS_TYPE_TXT); } (void)collect_mdns_responses_pair(&sockets, SNAPSHOT_CAPTURE_STEP_SECONDS, out, &service_types); close_mdns_socket_pair(&sockets); @@ -2577,8 +2612,12 @@ static void append_snapshot_records_unique(struct service_record_set *dst, const break; } } - if (!exists && dst->count < SNAPSHOT_MAX_RECORDS) { - dst->records[dst->count++] = src->records[i]; + if (!exists) { + if (dst->count < SNAPSHOT_MAX_RECORDS) { + dst->records[dst->count++] = src->records[i]; + } else { + dst->truncated = 1; + } } } } @@ -3129,6 +3168,58 @@ static void close_mdns_socket_pair(struct mdns_socket_pair *sockets) { } } +static void init_mdns_membership_delta(struct mdns_membership_delta *delta) { + memset(delta, 0, sizeof(*delta)); +} + +static int record_mdns_membership_ipv4(struct mdns_membership_delta *delta, uint32_t ipv4_addr) { + if (delta == NULL) { + return 0; + } + if (delta->ipv4_count >= MAX_IFACE_CONTEXTS) { + return -1; + } + delta->ipv4[delta->ipv4_count++] = ipv4_addr; + return 0; +} + +static int record_mdns_membership_ipv6(struct mdns_membership_delta *delta, unsigned int ifindex, const char *ifname) { + if (delta == NULL) { + return 0; + } + if (delta->ipv6_count >= MAX_IFACE_CONTEXTS) { + return -1; + } + delta->ipv6_ifindex[delta->ipv6_count] = ifindex; + if (ifname != NULL) { + strncpy(delta->ipv6_name[delta->ipv6_count], ifname, sizeof(delta->ipv6_name[delta->ipv6_count]) - 1); + } + delta->ipv6_count++; + return 0; +} + +static void rollback_mdns_membership_delta(struct mdns_socket_pair *sockets, + const struct mdns_membership_delta *delta) { + size_t i; + + if (delta == NULL) { + return; + } + if (sockets->ipv4_fd >= 0) { + for (i = delta->ipv4_count; i > 0; i--) { + drop_mdns_multicast_group_best_effort(sockets->ipv4_fd, delta->ipv4[i - 1], "runtime"); + } + } + if (sockets->ipv6_fd >= 0) { + for (i = delta->ipv6_count; i > 0; i--) { + drop_mdns_multicast_group6_best_effort(sockets->ipv6_fd, + delta->ipv6_ifindex[i - 1], + delta->ipv6_name[i - 1], + "runtime"); + } + } +} + static int open_bound_mdns_socket6(int shared_bind, int log_bind_errors) { int sockfd; int yes = 1; @@ -3336,7 +3427,8 @@ static int link_set_has_ipv6_membership(const struct link_context_set *set, unsi static int prepare_mdns_socket4_memberships(int sockfd, const struct link_context_set *old_links, const struct link_context_set *new_links, - const char *socket_role) { + const char *socket_role, + struct mdns_membership_delta *delta) { size_t i; uint32_t first_ipv4 = 0; @@ -3353,6 +3445,11 @@ static int prepare_mdns_socket4_memberships(int sockfd, if (join_mdns_multicast_group(sockfd, new_links->links[i].ipv4[0].addr, socket_role) != 0) { return -1; } + if (record_mdns_membership_ipv4(delta, new_links->links[i].ipv4[0].addr) != 0) { + drop_mdns_multicast_group_best_effort(sockfd, new_links->links[i].ipv4[0].addr, socket_role); + errno = ENOMEM; + return -1; + } } if (first_ipv4 == 0) { errno = EADDRNOTAVAIL; @@ -3364,7 +3461,8 @@ static int prepare_mdns_socket4_memberships(int sockfd, static int prepare_mdns_socket6_memberships(int sockfd, const struct link_context_set *old_links, const struct link_context_set *new_links, - const char *socket_role) { + const char *socket_role, + struct mdns_membership_delta *delta) { size_t i; unsigned int first_ifindex = 0; @@ -3381,6 +3479,14 @@ static int prepare_mdns_socket6_memberships(int sockfd, if (join_mdns_multicast_group6(sockfd, new_links->links[i].ifindex, new_links->links[i].name, socket_role) != 0) { return -1; } + if (record_mdns_membership_ipv6(delta, new_links->links[i].ifindex, new_links->links[i].name) != 0) { + drop_mdns_multicast_group6_best_effort(sockfd, + new_links->links[i].ifindex, + new_links->links[i].name, + socket_role); + errno = ENOMEM; + return -1; + } } if (first_ifindex == 0) { errno = EADDRNOTAVAIL; @@ -3390,11 +3496,12 @@ static int prepare_mdns_socket6_memberships(int sockfd, } static int open_dualstack_mdns_sockets(int shared_bind, - const struct link_context_set *links, + struct link_context_set *links, int log_bind_errors, struct mdns_socket_pair *out) { int need_ipv4 = link_contexts_need_ipv4_socket(links); int need_ipv6 = link_contexts_need_ipv6_socket(links); + int ipv6_errno = 0; out->ipv4_fd = -1; out->ipv6_fd = -1; @@ -3414,7 +3521,20 @@ static int open_dualstack_mdns_sockets(int shared_bind, out->ipv6_fd = open_bound_mdns_socket6(shared_bind, log_bind_errors); if (out->ipv6_fd < 0 || configure_mdns_socket6_for_links(out->ipv6_fd, links, "runtime") != 0) { + ipv6_errno = errno; + if (out->ipv6_fd >= 0) { + close(out->ipv6_fd); + out->ipv6_fd = -1; + } + if (need_ipv4 && out->ipv4_fd >= 0) { + fprintf(stderr, + "warning: mdns runtime socket: IPv6 setup failed (%s); continuing with IPv4 mDNS\n", + strerror(ipv6_errno)); + disable_link_contexts_mdns_ipv6_transport(links); + return 0; + } close_mdns_socket_pair(out); + errno = ipv6_errno; return -1; } } @@ -3422,7 +3542,7 @@ static int open_dualstack_mdns_sockets(int shared_bind, } static int acquire_dualstack_mdns_sockets(int shared_bind, - const struct link_context_set *links, + struct link_context_set *links, struct mdns_socket_pair *out) { static const unsigned int retry_delays_ms[TAKEOVER_RETRY_COUNT] = {0, 100, 200, 300, 400, 500}; size_t i; @@ -3767,24 +3887,27 @@ static int append_generated_base_records(uint8_t *buf, size_t *off, size_t cap, return 0; } -static int host_already_announced(char announced_hosts[][MAX_NAME], size_t announced_count, const char *host_fqdn) { +struct announced_host_set { + const char *hosts[SNAPSHOT_MAX_RECORDS]; + size_t count; +}; + +static int host_already_announced(const struct announced_host_set *set, const char *host_fqdn) { size_t i; - for (i = 0; i < announced_count; i++) { - if (name_equals(announced_hosts[i], host_fqdn)) { + for (i = 0; i < set->count; i++) { + if (name_equals(set->hosts[i], host_fqdn)) { return 1; } } return 0; } -static int remember_announced_host(char announced_hosts[][MAX_NAME], size_t *announced_count, const char *host_fqdn) { - if (*announced_count >= SNAPSHOT_MAX_RECORDS) { +static int remember_announced_host(struct announced_host_set *set, const char *host_fqdn) { + if (set->count >= SNAPSHOT_MAX_RECORDS) { return -1; } - strncpy(announced_hosts[*announced_count], host_fqdn, MAX_NAME - 1); - announced_hosts[*announced_count][MAX_NAME - 1] = '\0'; - (*announced_count)++; + set->hosts[set->count++] = host_fqdn; return 0; } @@ -3800,10 +3923,10 @@ static int send_announcement_any(int sockfd, size_t off; int answers; size_t i; - char announced_hosts[SNAPSHOT_MAX_RECORDS][MAX_NAME]; - size_t announced_host_count = 0; + struct announced_host_set announced_hosts; static int logged_duplicate_host_suppression = 0; + memset(&announced_hosts, 0, sizeof(announced_hosts)); init_announcement_packet(&off, &answers); if (append_generated_base_records(buf, &off, sizeof(buf), cfg, response_link, 1, 1, ttl, &answers) != 0) { log_packet_build_failure("announcement", "add_core_records", off, answers, use_snapshot_records); @@ -3829,8 +3952,7 @@ static int send_announcement_any(int sockfd, return -1; } include_host_a = snapshot_records->records[i].host_fqdn[0] != '\0' && - !host_already_announced(announced_hosts, announced_host_count, - snapshot_records->records[i].host_fqdn); + !host_already_announced(&announced_hosts, snapshot_records->records[i].host_fqdn); if (include_host_a) { before_host_a_off = off; before_host_a_answers = answers; @@ -3848,8 +3970,7 @@ static int send_announcement_any(int sockfd, return -1; } } - if (remember_announced_host(announced_hosts, &announced_host_count, - snapshot_records->records[i].host_fqdn) != 0) { + if (remember_announced_host(&announced_hosts, snapshot_records->records[i].host_fqdn) != 0) { log_packet_build_failure("announcement", "remember_announced_host", off, answers, use_snapshot_records); return -1; } @@ -3924,6 +4045,331 @@ static int query_routes_have_destination(const struct query_answer_routes *route return 0; } +static int known_answer_ttl_is_fresh(uint32_t known_ttl, uint32_t advertised_ttl) { + return known_ttl > advertised_ttl / 2; +} + +static int known_answer_rdata_matches_name(const uint8_t *packet, + size_t packet_len, + size_t rdata_cursor, + const char *expected_name) { + char name[MAX_NAME]; + + if (decode_name(packet, packet_len, &rdata_cursor, name, sizeof(name)) != 0) { + return 0; + } + return name_equals(name, expected_name); +} + +static int known_answer_rdata_matches_srv(const uint8_t *packet, + size_t packet_len, + size_t rdata_cursor, + uint16_t rdlength, + const char *expected_target, + uint16_t expected_port) { + uint16_t port; + char target[MAX_NAME]; + size_t target_cursor; + + if (rdlength < 6 || rdata_cursor + rdlength > packet_len) { + return 0; + } + memcpy(&port, packet + rdata_cursor + 4, 2); + if (ntohs(port) != expected_port) { + return 0; + } + target_cursor = rdata_cursor + 6; + if (decode_name(packet, packet_len, &target_cursor, target, sizeof(target)) != 0) { + return 0; + } + return name_equals(target, expected_target); +} + +struct known_answer_address_coverage { + uint32_t host_a; + uint32_t host_aaaa; + uint32_t snapshot_a[SNAPSHOT_MAX_RECORDS]; + uint32_t snapshot_aaaa[SNAPSHOT_MAX_RECORDS]; +}; + +static uint32_t link_ipv4_advertise_mask(const struct link_context *link) { + uint32_t mask = 0; + size_t i; + + if (link == NULL) { + return 0; + } + for (i = 0; i < link->ipv4_count && i < 32; i++) { + mask |= (uint32_t)1 << i; + } + return mask; +} + +static uint32_t link_ipv6_advertise_mask(const struct link_context *link) { + uint32_t mask = 0; + size_t i; + + if (link == NULL) { + return 0; + } + for (i = 0; i < link->ipv6_count && i < 32; i++) { + if (!link_ipv6_addr_is_samba_bindable(&link->ipv6[i])) { + continue; + } + mask |= (uint32_t)1 << i; + } + return mask; +} + +static int known_answer_mask_covers_all(uint32_t known_mask, uint32_t advertised_mask) { + return advertised_mask != 0 && (known_mask & advertised_mask) == advertised_mask; +} + +static uint32_t known_answer_rdata_link_ipv4_mask(const uint8_t *packet, + size_t packet_len, + size_t rdata_cursor, + uint16_t rdlength, + const struct link_context *link) { + uint32_t ipv4_addr; + size_t i; + + if (link == NULL || rdlength != 4 || rdata_cursor + 4 > packet_len) { + return 0; + } + memcpy(&ipv4_addr, packet + rdata_cursor, sizeof(ipv4_addr)); + for (i = 0; i < link->ipv4_count && i < 32; i++) { + if (link->ipv4[i].addr == ipv4_addr) { + return (uint32_t)1 << i; + } + } + return 0; +} + +static uint32_t known_answer_rdata_link_ipv6_mask(const uint8_t *packet, + size_t packet_len, + size_t rdata_cursor, + uint16_t rdlength, + const struct link_context *link) { + size_t i; + + if (link == NULL || rdlength != 16 || rdata_cursor + 16 > packet_len) { + return 0; + } + for (i = 0; i < link->ipv6_count && i < 32; i++) { + if (!link_ipv6_addr_is_samba_bindable(&link->ipv6[i])) { + continue; + } + if (memcmp(packet + rdata_cursor, link->ipv6[i].addr.s6_addr, 16) == 0) { + return (uint32_t)1 << i; + } + } + return 0; +} + +static void suppress_known_answer_generated_routes(struct query_answer_routes *routes, + const char *owner, + uint16_t type, + const uint8_t *packet, + size_t packet_len, + size_t rdata_cursor, + uint16_t rdlength, + const char *instance_fqdn, + const char *adisk_instance_fqdn, + const char *device_info_instance_fqdn, + const char *airport_instance_fqdn, + const struct config *cfg, + const struct link_context *response_link, + struct known_answer_address_coverage *coverage, + int use_snapshot_records) { + uint32_t known_mask; + + if (smb_enabled(cfg)) { + if (type == DNS_TYPE_PTR && name_equals(owner, cfg->service_type) && + known_answer_rdata_matches_name(packet, packet_len, rdata_cursor, instance_fqdn)) { + routes->smb_ptr = 0; + } else if (type == DNS_TYPE_SRV && name_equals(owner, instance_fqdn) && + known_answer_rdata_matches_srv(packet, packet_len, rdata_cursor, rdlength, cfg->host_fqdn, cfg->port)) { + routes->smb_srv = 0; + } else if (type == DNS_TYPE_TXT && name_equals(owner, instance_fqdn)) { + routes->smb_txt = 0; + } + } + if (adisk_enabled(cfg)) { + if (type == DNS_TYPE_PTR && name_equals(owner, cfg->adisk_service_type) && + known_answer_rdata_matches_name(packet, packet_len, rdata_cursor, adisk_instance_fqdn)) { + routes->adisk_ptr = 0; + } else if (type == DNS_TYPE_SRV && name_equals(owner, adisk_instance_fqdn) && + known_answer_rdata_matches_srv(packet, packet_len, rdata_cursor, rdlength, cfg->host_fqdn, cfg->adisk_port)) { + routes->adisk_srv = 0; + } else if (type == DNS_TYPE_TXT && name_equals(owner, adisk_instance_fqdn)) { + routes->adisk_txt = 0; + } + } + if (cfg->device_model[0] != '\0') { + if (type == DNS_TYPE_PTR && name_equals(owner, cfg->device_info_service_type) && + known_answer_rdata_matches_name(packet, packet_len, rdata_cursor, device_info_instance_fqdn)) { + routes->device_info_ptr = 0; + } else if (type == DNS_TYPE_SRV && name_equals(owner, device_info_instance_fqdn) && + known_answer_rdata_matches_srv(packet, packet_len, rdata_cursor, rdlength, cfg->host_fqdn, 0)) { + routes->device_info_srv = 0; + } else if (type == DNS_TYPE_TXT && name_equals(owner, device_info_instance_fqdn)) { + routes->device_info_txt = 0; + } + } + if (!use_snapshot_records && is_airport_enabled(cfg)) { + if (type == DNS_TYPE_PTR && name_equals(owner, cfg->airport_service_type) && + known_answer_rdata_matches_name(packet, packet_len, rdata_cursor, airport_instance_fqdn)) { + routes->airport_ptr = 0; + } else if (type == DNS_TYPE_SRV && name_equals(owner, airport_instance_fqdn) && + known_answer_rdata_matches_srv(packet, packet_len, rdata_cursor, rdlength, cfg->host_fqdn, cfg->airport_port)) { + routes->airport_srv = 0; + } else if (type == DNS_TYPE_TXT && name_equals(owner, airport_instance_fqdn)) { + routes->airport_txt = 0; + } + } + if (type == DNS_TYPE_A && name_equals(owner, cfg->host_fqdn)) { + known_mask = known_answer_rdata_link_ipv4_mask(packet, packet_len, rdata_cursor, rdlength, response_link); + if (known_mask != 0) { + coverage->host_a |= known_mask; + if (known_answer_mask_covers_all(coverage->host_a, link_ipv4_advertise_mask(response_link))) { + routes->host_a = 0; + } + } + } else if (type == DNS_TYPE_AAAA && name_equals(owner, cfg->host_fqdn)) { + known_mask = known_answer_rdata_link_ipv6_mask(packet, packet_len, rdata_cursor, rdlength, response_link); + if (known_mask != 0) { + coverage->host_aaaa |= known_mask; + if (known_answer_mask_covers_all(coverage->host_aaaa, link_ipv6_advertise_mask(response_link))) { + routes->host_aaaa = 0; + } + } + } +} + +static void suppress_known_answer_snapshot_routes(struct query_answer_routes *routes, + const char *owner, + uint16_t type, + const uint8_t *packet, + size_t packet_len, + size_t rdata_cursor, + uint16_t rdlength, + const struct link_context *response_link, + const struct service_record_set *snapshot_records, + struct known_answer_address_coverage *coverage, + int use_snapshot_records) { + size_t j; + uint32_t known_mask; + + if (!use_snapshot_records) { + return; + } + for (j = 0; j < snapshot_records->count; j++) { + const struct service_record *record = &snapshot_records->records[j]; + if (is_suppressed_snapshot_service_type(record->service_type)) { + continue; + } + if (type == DNS_TYPE_PTR && name_equals(owner, record->service_type) && + known_answer_rdata_matches_name(packet, packet_len, rdata_cursor, record->instance_fqdn)) { + routes->snapshot_ptr[j] = 0; + } else if (type == DNS_TYPE_SRV && name_equals(owner, record->instance_fqdn) && + known_answer_rdata_matches_srv(packet, packet_len, rdata_cursor, rdlength, record->host_fqdn, record->port)) { + routes->snapshot_srv[j] = 0; + } else if (type == DNS_TYPE_TXT && name_equals(owner, record->instance_fqdn)) { + routes->snapshot_txt[j] = 0; + } else if (type == DNS_TYPE_A && name_equals(owner, record->host_fqdn)) { + known_mask = known_answer_rdata_link_ipv4_mask(packet, packet_len, rdata_cursor, rdlength, response_link); + if (known_mask != 0) { + coverage->snapshot_a[j] |= known_mask; + if (known_answer_mask_covers_all(coverage->snapshot_a[j], link_ipv4_advertise_mask(response_link))) { + routes->snapshot_a[j] = 0; + } + } + } else if (type == DNS_TYPE_AAAA && name_equals(owner, record->host_fqdn)) { + known_mask = known_answer_rdata_link_ipv6_mask(packet, packet_len, rdata_cursor, rdlength, response_link); + if (known_mask != 0) { + coverage->snapshot_aaaa[j] |= known_mask; + if (known_answer_mask_covers_all(coverage->snapshot_aaaa[j], link_ipv6_advertise_mask(response_link))) { + routes->snapshot_aaaa[j] = 0; + } + } + } + } +} + +static void suppress_known_answer_routes(const uint8_t *packet, + size_t packet_len, + size_t cursor, + uint16_t answer_count, + struct query_answer_routes *routes, + const char *instance_fqdn, + const char *adisk_instance_fqdn, + const char *device_info_instance_fqdn, + const char *airport_instance_fqdn, + const struct config *cfg, + const struct link_context *response_link, + const struct service_record_set *snapshot_records, + int use_snapshot_records) { + uint16_t i; + struct known_answer_address_coverage coverage; + + memset(&coverage, 0, sizeof(coverage)); + for (i = 0; i < answer_count; i++) { + char owner[MAX_NAME]; + uint16_t type; + uint16_t rrclass; + uint32_t ttl; + uint16_t rdlength; + size_t rdata_cursor; + + if (decode_name(packet, packet_len, &cursor, owner, sizeof(owner)) != 0 || cursor + 10 > packet_len) { + return; + } + memcpy(&type, packet + cursor, 2); + memcpy(&rrclass, packet + cursor + 2, 2); + memcpy(&ttl, packet + cursor + 4, 4); + memcpy(&rdlength, packet + cursor + 8, 2); + cursor += 10; + type = ntohs(type); + rrclass = ntohs(rrclass); + ttl = ntohl(ttl); + rdlength = ntohs(rdlength); + if (cursor + rdlength > packet_len) { + return; + } + rdata_cursor = cursor; + cursor += rdlength; + if ((rrclass & 0x7FFF) != DNS_CLASS_IN || !known_answer_ttl_is_fresh(ttl, cfg->ttl)) { + continue; + } + suppress_known_answer_generated_routes(routes, + owner, + type, + packet, + packet_len, + rdata_cursor, + rdlength, + instance_fqdn, + adisk_instance_fqdn, + device_info_instance_fqdn, + airport_instance_fqdn, + cfg, + response_link, + &coverage, + use_snapshot_records); + suppress_known_answer_snapshot_routes(routes, + owner, + type, + packet, + packet_len, + rdata_cursor, + rdlength, + response_link, + snapshot_records, + &coverage, + use_snapshot_records); + } +} + static int build_query_response_packet(uint8_t *reply, size_t reply_cap, size_t *reply_len, int *answer_count, uint16_t response_id, int route, const struct query_answer_routes *routes, @@ -4085,8 +4531,9 @@ static int build_query_response_packet(uint8_t *reply, size_t reply_cap, size_t if (use_snapshot_records) { size_t j; - char announced_hosts[SNAPSHOT_MAX_RECORDS][MAX_NAME]; - size_t announced_host_count = 0; + struct announced_host_set announced_hosts; + + memset(&announced_hosts, 0, sizeof(announced_hosts)); for (j = 0; j < snapshot_records->count; j++) { const struct service_record *record = &snapshot_records->records[j]; @@ -4134,7 +4581,7 @@ static int build_query_response_packet(uint8_t *reply, size_t reply_cap, size_t answers++; } if (((routes->snapshot_a[j] | routes->snapshot_aaaa[j]) & route) && record->host_fqdn[0] != '\0' && - !host_already_announced(announced_hosts, announced_host_count, record->host_fqdn)) { + !host_already_announced(&announced_hosts, record->host_fqdn)) { int include_a = (routes->snapshot_a[j] & route) != 0; int include_aaaa = (routes->snapshot_aaaa[j] & route) != 0; if (add_snapshot_host_address_records(reply, &off, reply_cap, record, response_link, include_a, include_aaaa, cfg->ttl, &answers) != 0) { @@ -4142,7 +4589,7 @@ static int build_query_response_packet(uint8_t *reply, size_t reply_cap, size_t log_packet_build_failure("query_response", "add_snapshot_a", off, answers, use_snapshot_records); return -1; } - if (remember_announced_host(announced_hosts, &announced_host_count, record->host_fqdn) != 0) { + if (remember_announced_host(&announced_hosts, record->host_fqdn) != 0) { log_packet_build_failure("query_response", "remember_snapshot_a_host", off, answers, use_snapshot_records); return -1; } @@ -4171,6 +4618,7 @@ static int handle_query_any(int sockfd, struct dns_header hdr; size_t cursor = sizeof(struct dns_header); uint16_t qdcount; + uint16_t ancount; uint16_t query_id; uint8_t reply[BUF_SIZE]; char instance_fqdn[MAX_NAME]; @@ -4196,6 +4644,7 @@ static int handle_query_any(int sockfd, } qdcount = ntohs(hdr.qdcount); + ancount = ntohs(hdr.ancount); query_id = hdr.id; if (smb_enabled(cfg) && build_instance_fqdn(instance_fqdn, sizeof(instance_fqdn), cfg->instance_name, cfg->service_type) != 0) { @@ -4239,7 +4688,7 @@ static int handle_query_any(int sockfd, if (qclass_base != DNS_CLASS_IN) { continue; } - reply_route = (qclass_raw & DNS_CLASS_CACHE_FLUSH) ? MDNS_REPLY_UNICAST : MDNS_REPLY_MULTICAST; + reply_route = (qclass_raw & DNS_CLASS_QU) ? MDNS_REPLY_UNICAST : MDNS_REPLY_MULTICAST; if (smb_enabled(cfg) && name_equals(qname, cfg->service_type) && @@ -4353,6 +4802,20 @@ static int handle_query_any(int sockfd, } } + suppress_known_answer_routes(packet, + packet_len, + cursor, + ancount, + &routes, + instance_fqdn, + adisk_instance_fqdn, + device_info_instance_fqdn, + airport_instance_fqdn, + cfg, + response_link, + snapshot_records, + use_snapshot_records); + if (query_routes_have_destination(&routes, snapshot_records, use_snapshot_records, MDNS_REPLY_UNICAST)) { size_t reply_len; int answers; @@ -4696,11 +5159,14 @@ static void send_link_goodbyes_for_missing(const struct mdns_socket_pair *socket static int prepare_runtime_mdns_sockets_for_links(int shared_bind, struct mdns_socket_pair *sockets, const struct link_context_set *old_links, - const struct link_context_set *new_links) { + struct link_context_set *new_links) { int need_ipv4 = link_contexts_need_ipv4_socket(new_links); int need_ipv6 = link_contexts_need_ipv6_socket(new_links); int opened_ipv4 = 0; int opened_ipv6 = 0; + struct mdns_membership_delta delta; + + init_mdns_membership_delta(&delta); if (!need_ipv4 && !need_ipv6) { errno = EADDRNOTAVAIL; @@ -4717,28 +5183,52 @@ static int prepare_runtime_mdns_sockets_for_links(int shared_bind, if (need_ipv6 && sockets->ipv6_fd < 0) { sockets->ipv6_fd = open_bound_mdns_socket6(shared_bind, 1); if (sockets->ipv6_fd < 0) { - goto fail; + if (need_ipv4 && sockets->ipv4_fd >= 0) { + fprintf(stderr, + "warning: mdns runtime socket: IPv6 socket open failed (%s); continuing with IPv4 mDNS\n", + strerror(errno)); + disable_link_contexts_mdns_ipv6_transport(new_links); + need_ipv6 = 0; + } else { + goto fail; + } + } + if (sockets->ipv6_fd >= 0) { + opened_ipv6 = 1; } - opened_ipv6 = 1; } if (need_ipv4 && prepare_mdns_socket4_memberships(sockets->ipv4_fd, opened_ipv4 ? NULL : old_links, new_links, - "runtime") != 0) { + "runtime", + &delta) != 0) { goto fail; } if (need_ipv6 && prepare_mdns_socket6_memberships(sockets->ipv6_fd, opened_ipv6 ? NULL : old_links, new_links, - "runtime") != 0) { + "runtime", + &delta) != 0) { + if (need_ipv4 && sockets->ipv4_fd >= 0) { + fprintf(stderr, + "warning: mdns runtime socket: IPv6 membership update failed (%s); continuing with IPv4 mDNS\n", + strerror(errno)); + disable_link_contexts_mdns_ipv6_transport(new_links); + if (opened_ipv6 && sockets->ipv6_fd >= 0) { + close(sockets->ipv6_fd); + sockets->ipv6_fd = -1; + } + return 0; + } goto fail; } return 0; fail: + rollback_mdns_membership_delta(sockets, &delta); if (opened_ipv4 && sockets->ipv4_fd >= 0) { close(sockets->ipv4_fd); sockets->ipv4_fd = -1; @@ -4799,20 +5289,23 @@ static int apply_runtime_link_change(int shared_bind, const struct config *cfg, const struct service_record_set *snapshot_records, int use_snapshot_records) { - if (prepare_runtime_mdns_sockets_for_links(shared_bind, sockets, active_links, new_links) != 0) { + struct link_context_set applied_links; + + applied_links = *new_links; + if (prepare_runtime_mdns_sockets_for_links(shared_bind, sockets, active_links, &applied_links) != 0) { return -1; } send_link_goodbyes_for_missing(sockets, active_links, - new_links, + &applied_links, dest4, dest6, cfg, snapshot_records, use_snapshot_records); - retire_runtime_mdns_memberships_for_missing(sockets, active_links, new_links); - close_unused_runtime_mdns_socket_families(sockets, new_links); - *active_links = *new_links; + retire_runtime_mdns_memberships_for_missing(sockets, active_links, &applied_links); + close_unused_runtime_mdns_socket_families(sockets, &applied_links); + *active_links = applied_links; return 0; } diff --git a/src/timecapsulesmb/assets/artifact-manifest.json b/src/timecapsulesmb/assets/artifact-manifest.json index 2faa791..b088e39 100644 --- a/src/timecapsulesmb/assets/artifact-manifest.json +++ b/src/timecapsulesmb/assets/artifact-manifest.json @@ -2,27 +2,27 @@ "artifacts": { "mdns-advertiser": { "path": "bin/mdns/mdns-advertiser", - "sha256": "1e36b81f59ac3e63f987eb8a0b15c4461d150ab7d78e68dba6542531cce60d56" + "sha256": "d9f42d88969b1642d77292272f234da4aaf0a24c0a9bf2aef786e278c5a9f976" }, "mdns-advertiser-netbsd4le": { "path": "bin/mdns-netbsd4le/mdns-advertiser", - "sha256": "c9e9feb3471b5298f94e2472b64a7473bb56e5192c0ba6bec1b10f7634622fdc" + "sha256": "fb440bbf30716ab26cbf74c9a7ee7726e726913deabda65687ba2b47d3be12c6" }, "mdns-advertiser-netbsd4be": { "path": "bin/mdns-netbsd4be/mdns-advertiser", - "sha256": "0be77a9ce32c44c71aef732c835a00f62103ec1bae94e48b980b2fba4d04ccaf" + "sha256": "bae412d4dee9b3bb57f7397e26af48f4940004795b6a10a85224f913e4514954" }, "nbns-advertiser": { "path": "bin/nbns/nbns-advertiser", - "sha256": "dafc1445159c142877215c2f4bf913df094fd8aea67f2cee38e9cfafeaf41ee1" + "sha256": "76cc08bfc9fc64cebae058941fc7457d9adf110eab7fc78265bea321016dc2e9" }, "nbns-advertiser-netbsd4le": { "path": "bin/nbns-netbsd4le/nbns-advertiser", - "sha256": "6a0b1be099d495e56d4c93be609a96b8b3a6075113efe484d1785aa1cc6c89a0" + "sha256": "4e8b6c6f8778aa2f186d0732b5888a63d5c966c999d256ac714486e47c03e7a0" }, "nbns-advertiser-netbsd4be": { "path": "bin/nbns-netbsd4be/nbns-advertiser", - "sha256": "b6fdaebf5a5a96dc4dfc50ce43777cce9a74dcb8f2720c019c745a4d7613717b" + "sha256": "ac1a745bffb98eea8294af2ccf2c9475c19db4dd9851dc29f2c39f0c7af71c27" }, "smbd": { "path": "bin/samba4/smbd", diff --git a/tests/test_deploy_modules.py b/tests/test_deploy_modules.py index c290db1..10b54cf 100644 --- a/tests/test_deploy_modules.py +++ b/tests/test_deploy_modules.py @@ -1220,7 +1220,7 @@ def test_mdns_advertiser_save_args_capture_and_exit_without_takeover(self) -> No self.assertNotIn("serving summary", run.stderr) self.assertNotIn("mDNS takeover", run.stderr) - def test_mdns_timestamped_logging_preserves_long_lines(self) -> None: + def test_mdns_timestamped_logging_truncates_long_lines_without_heap(self) -> None: mdns_source = (REPO_ROOT / "build" / "mdns-advertiser.c").as_posix() source = f''' #include @@ -1232,13 +1232,15 @@ def test_mdns_timestamped_logging_preserves_long_lines(self) -> None: char message[5001]; memset(message, 'A', sizeof(message) - 1); message[sizeof(message) - 1] = '\\0'; - fprintf(stderr, "%s\\n", message); + timestamped_fprintf(stderr, "%s\\n", message); return 0; }} ''' run = self._compile_and_run_c_helper(source, "mdns_long_timestamped_log") self.assertEqual(run.returncode, 0, run.stderr) - self.assertIn("A" * 5000, run.stderr) + self.assertNotIn("A" * 5000, run.stderr) + self.assertGreaterEqual(run.stderr.count("A"), 4000) + self.assertLess(run.stderr.count("A"), 5000) self.assertTrue(run.stderr.endswith("\n")) def test_mdns_ifreq_copy_handles_unaligned_source_buffer(self) -> None: @@ -1532,14 +1534,7 @@ def test_mdns_auto_ip_helpers_filter_and_detect_interface_changes(self) -> None: struct iface_context_set b; struct ifreq sample_ifr; struct ifconf_entry_view view; - struct sockaddr_in6 raw_sin6; - struct sockaddr_in6 copied_sin6; - union {{ - long align; - char bytes[IFNAMSIZ + sizeof(struct sockaddr_in6) + sizeof(long)]; - }} raw_entry; size_t expected_variable_step; - size_t expected_raw_step; if (runtime_ipv4_is_usable(inet_addr("0.1.2.3")) || runtime_ipv4_is_usable(inet_addr("127.0.0.1")) || @@ -1579,13 +1574,21 @@ def test_mdns_auto_ip_helpers_filter_and_detect_interface_changes(self) -> None: if (ifreq_entry_size(&sample_ifr, expected_variable_step, 0) != expected_variable_step) {{ return 9; }} +#if defined(__NetBSD__) || defined(__APPLE__) || defined(__FreeBSD__) || defined(__OpenBSD__) || defined(__DragonFly__) + {{ + struct sockaddr_in6 raw_sin6; + struct sockaddr_in6 copied_sin6; + union {{ + long align; + char bytes[IFNAMSIZ + sizeof(struct sockaddr_in6) + sizeof(long)]; + }} raw_entry; + size_t expected_raw_step; + memset(&raw_entry, 0, sizeof(raw_entry)); memcpy(raw_entry.bytes, "bridge0", 7); memset(&raw_sin6, 0, sizeof(raw_sin6)); raw_sin6.sin6_family = AF_INET6; -#if defined(__NetBSD__) || defined(__APPLE__) || defined(__FreeBSD__) || defined(__OpenBSD__) || defined(__DragonFly__) raw_sin6.sin6_len = sizeof(raw_sin6); -#endif if (inet_pton(AF_INET6, "fdbb:1111:2222:3333::40", &raw_sin6.sin6_addr) != 1) {{ return 12; }} @@ -1608,6 +1611,22 @@ def test_mdns_auto_ip_helpers_filter_and_detect_interface_changes(self) -> None: if (memcmp(&copied_sin6.sin6_addr, &raw_sin6.sin6_addr, sizeof(raw_sin6.sin6_addr)) != 0) {{ return 14; }} + }} +#else + {{ + struct ifreq raw_ifr; + memset(&raw_ifr, 0, sizeof(raw_ifr)); + memcpy(raw_ifr.ifr_name, "bridge0", 7); + raw_ifr.ifr_addr.sa_family = AF_INET; + if (ifconf_entry_view_from_cursor(&view, (const char *)(const void *)&raw_ifr, sizeof(raw_ifr), 1) != 0 || + view.step != sizeof(raw_ifr) || + view.addr_len != sizeof(struct sockaddr) || + strcmp(view.name, "bridge0") != 0 || + view.addr->sa_family != AF_INET) {{ + return 13; + }} + }} +#endif memset(&a, 0, sizeof(a)); memset(&b, 0, sizeof(b)); @@ -1858,6 +1877,10 @@ def test_mdns_print_auto_ip_cidrs_returns_distinct_probe_failure_status(self) -> if (plan->mode == 2) {{ append_iface_context(out, "bridge0", inet_addr("10.0.1.1"), inet_addr("255.255.255.0"), IFF_UP | IFF_RUNNING); }} + if (plan->mode == 3) {{ + append_iface_context(out, "bridge0", inet_addr("10.0.1.1"), inet_addr("255.255.255.0"), IFF_UP | IFF_RUNNING); + out->truncated = 1; + }} return 0; }} @@ -1880,6 +1903,10 @@ def test_mdns_print_auto_ip_cidrs_returns_distinct_probe_failure_status(self) -> if (print_auto_ip_cidrs_with_provider(stdout, NULL, &plan) != EXIT_AUTO_IP_PROBE_FAILED) {{ return 4; }} + plan.mode = 3; + if (print_auto_ip_cidrs_with_provider(stdout, fake_collect_contexts, &plan) != EXIT_AUTO_IP_PROBE_FAILED) {{ + return 5; + }} return 0; }} '''.format(mdns_source=mdns_source) @@ -1920,6 +1947,10 @@ def test_mdns_print_smb_bind_interfaces_returns_dual_stack_probe_status(self) -> inet_pton(AF_INET6, "fe80::40", &ll); append_link_ipv6(out, "bridge0", &ll, 64, 7, IFF_UP | IFF_RUNNING); }} + if (plan->mode == 4) {{ + append_link_ipv4(out, "bridge0", inet_addr("169.254.1.9"), inet_addr("255.255.0.0"), IFF_UP | IFF_RUNNING); + out->truncated = 1; + }} return 0; }} @@ -1946,6 +1977,10 @@ def test_mdns_print_smb_bind_interfaces_returns_dual_stack_probe_status(self) -> if (print_smb_bind_interfaces_with_provider(stdout, NULL, &plan) != EXIT_AUTO_IP_PROBE_FAILED) {{ return 5; }} + plan.mode = 4; + if (print_smb_bind_interfaces_with_provider(stdout, fake_collect_links, &plan) != EXIT_AUTO_IP_PROBE_FAILED) {{ + return 6; + }} return 0; }} '''.format(mdns_source=mdns_source) @@ -1987,6 +2022,10 @@ def test_mdns_print_socket_families_uses_advertise_links_not_samba_tokens(self) if (plan->mode == 4) {{ append_link_ipv6(out, "bridge0", &ll, 64, 7, IFF_UP | IFF_RUNNING); }} + if (plan->mode == 5) {{ + append_link_ipv4(out, "bridge0", inet_addr("192.168.1.40"), inet_addr("255.255.255.0"), IFF_UP | IFF_RUNNING); + append_link_ipv6_with_transport(out, "bridge0", &ll, 64, 7, IFF_UP | IFF_RUNNING, 0); + }} return 0; }} @@ -2010,6 +2049,10 @@ def test_mdns_print_socket_families_uses_advertise_links_not_samba_tokens(self) if (print_mdns_socket_families_with_provider(stdout, fake_collect_advertise_links, &plan) != EXIT_AUTO_IP_UNAVAILABLE) {{ return 5; }} + plan.mode = 5; + if (print_mdns_socket_families_with_provider(stdout, fake_collect_advertise_links, &plan) != EXIT_OK) {{ + return 6; + }} plan.mode = 1; if (print_mdns_socket_families_with_provider(stdout, fake_collect_advertise_links, &plan) != EXIT_AUTO_IP_PROBE_FAILED) {{ return 4; @@ -2019,7 +2062,7 @@ def test_mdns_print_socket_families_uses_advertise_links_not_samba_tokens(self) '''.format(mdns_source=mdns_source) run = self._compile_and_run_c_helper(source, "mdns_print_socket_families") self.assertEqual(run.returncode, 0, run.stderr) - self.assertEqual(run.stdout, "ipv4 ipv6\nipv6\n") + self.assertEqual(run.stdout, "ipv4 ipv6\nipv6\nipv4\n") def test_mdns_scoped_ipv6_multicast_destination_uses_link_ifindex(self) -> None: mdns_source = (REPO_ROOT / "build" / "mdns-advertiser.c").as_posix() @@ -2712,6 +2755,160 @@ def test_mdns_advertiser_extracts_non_hardcoded_udp_service_type(self) -> None: self.assertEqual(run.returncode, 0, run.stderr) self.assertEqual(run.stdout.strip(), "_example-service._udp.local.") + def test_mdns_runtime_socket_updates_roll_back_partial_memberships_and_fallback_to_ipv4(self) -> None: + mdns_source = (REPO_ROOT / "build" / "mdns-advertiser.c").as_posix() + source = r''' +#include +#include +#include +#include +#include +#include +#include + +static int fake_socket(int domain, int type, int protocol); +static int fake_setsockopt(int sockfd, int level, int optname, const void *optval, socklen_t optlen); +static int fake_bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen); +static int fake_close(int fd); + +#define socket fake_socket +#define setsockopt fake_setsockopt +#define bind fake_bind +#define close fake_close +#define main mdns_advertiser_main +#include "@MDNS_SOURCE@" +#undef main +#undef close +#undef bind +#undef setsockopt +#undef socket + +static int socket_calls; +static int bind_calls; +static int close_calls; +static int membership_sets; +static int drop_membership_sets; +static int outbound_sets; +static int fail_ipv6_socket; +static int fail_second_membership; +static int next_fd = 100; + +static void reset_fakes(void) { + socket_calls = 0; + bind_calls = 0; + close_calls = 0; + membership_sets = 0; + drop_membership_sets = 0; + outbound_sets = 0; + fail_ipv6_socket = 0; + fail_second_membership = 0; + next_fd = 100; +} + +static int fake_socket(int domain, int type, int protocol) { + (void)type; + (void)protocol; + socket_calls++; + if (fail_ipv6_socket && domain == AF_INET6) { + errno = EAFNOSUPPORT; + return -1; + } + return next_fd++; +} + +static int fake_setsockopt(int sockfd, int level, int optname, const void *optval, socklen_t optlen) { + (void)sockfd; + (void)optval; + (void)optlen; + if (level == IPPROTO_IP && optname == IP_ADD_MEMBERSHIP) { + membership_sets++; + if (fail_second_membership && membership_sets >= 2) { + errno = EADDRINUSE; + return -1; + } + } +#ifdef IP_DROP_MEMBERSHIP + if (level == IPPROTO_IP && optname == IP_DROP_MEMBERSHIP) { + drop_membership_sets++; + } +#endif + if (level == IPPROTO_IP && optname == IP_MULTICAST_IF) { + outbound_sets++; + } + return 0; +} + +static int fake_bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen) { + (void)sockfd; + (void)addr; + (void)addrlen; + bind_calls++; + return 0; +} + +static int fake_close(int fd) { + (void)fd; + close_calls++; + return 0; +} + +static void add_ipv4_link(struct link_context_set *set, const char *name, const char *addr) { + append_link_ipv4(set, name, inet_addr(addr), inet_addr("255.255.255.0"), IFF_UP | IFF_RUNNING); +} + +int main(void) { + struct link_context_set old_links; + struct link_context_set new_links; + struct mdns_socket_pair sockets; + struct in6_addr ula; + + reset_fakes(); + memset(&old_links, 0, sizeof(old_links)); + memset(&new_links, 0, sizeof(new_links)); + add_ipv4_link(&old_links, "bridge0", "10.0.1.1"); + add_ipv4_link(&new_links, "bridge0", "10.0.1.1"); + add_ipv4_link(&new_links, "en1", "192.168.50.2"); + add_ipv4_link(&new_links, "en2", "192.168.60.2"); + sockets.ipv4_fd = 55; + sockets.ipv6_fd = -1; + fail_second_membership = 1; + if (prepare_runtime_mdns_sockets_for_links(0, &sockets, &old_links, &new_links) == 0) { + return 1; + } +#ifdef IP_DROP_MEMBERSHIP + if (drop_membership_sets != 1) { + return 2; + } +#endif + if (sockets.ipv4_fd != 55 || close_calls != 0) { + return 3; + } + + reset_fakes(); + memset(&new_links, 0, sizeof(new_links)); + add_ipv4_link(&new_links, "bridge0", "10.0.1.1"); + if (inet_pton(AF_INET6, "fdbb:1111:2222:3333::40", &ula) != 1) { + return 4; + } + append_link_ipv6(&new_links, "bridge0", &ula, 64, 7, IFF_UP | IFF_RUNNING); + fail_ipv6_socket = 1; + sockets.ipv4_fd = -1; + sockets.ipv6_fd = -1; + if (open_dualstack_mdns_sockets(0, &new_links, 0, &sockets) != 0) { + return 5; + } + if (sockets.ipv4_fd < 0 || sockets.ipv6_fd >= 0 || link_contexts_need_ipv6_socket(&new_links)) { + return 6; + } + close_mdns_socket_pair(&sockets); + printf("ok\n"); + return 0; +} +'''.replace("@MDNS_SOURCE@", mdns_source) + run = self._compile_and_run_c_helper(source, "mdns_runtime_membership_rollback") + self.assertEqual(run.returncode, 0, run.stderr) + self.assertEqual(run.stdout.strip(), "ok") + def test_mdns_advertiser_load_snapshot_accepts_host_hex_and_smb_adisk_records(self) -> None: if shutil.which("cc") is None: self.skipTest("cc not available") @@ -3407,6 +3604,217 @@ def test_mdns_advertiser_diskless_answers_host_a_but_not_smb(self) -> None: self.assertEqual(run.returncode, 0, run.stderr) self.assertEqual(run.stdout.strip(), "ok") + def test_mdns_advertiser_suppresses_fresh_known_answer_a_records(self) -> None: + mdns_source = (REPO_ROOT / "build" / "mdns-advertiser.c").as_posix() + source = r''' +#include +#include +#include +#include +#include +#include + +ssize_t fake_sendto(int sockfd, const void *buf, size_t len, int flags, + const struct sockaddr *dest, socklen_t dest_len); + +#define sendto fake_sendto +#define main mdns_advertiser_main +#include "@MDNS_SOURCE@" +#undef main +#undef sendto + +static unsigned char captured_packet[BUF_SIZE]; +static size_t captured_len = 0; +static size_t captured_count = 0; + +ssize_t fake_sendto(int sockfd, const void *buf, size_t len, int flags, + const struct sockaddr *dest, socklen_t dest_len) { + (void)sockfd; + (void)flags; + (void)dest; + (void)dest_len; + memcpy(captured_packet, buf, len); + captured_len = len; + captured_count++; + return (ssize_t)len; +} + +static void reset_captures(void) { + memset(captured_packet, 0, sizeof(captured_packet)); + captured_len = 0; + captured_count = 0; +} + +static void configure_base(struct config *cfg) { + memset(cfg, 0, sizeof(*cfg)); + snprintf(cfg->instance_name, sizeof(cfg->instance_name), "%s", "Alton Time Capsule"); + snprintf(cfg->host_label, sizeof(cfg->host_label), "%s", "alton-time-capsule"); + snprintf(cfg->host_fqdn, sizeof(cfg->host_fqdn), "%s", "alton-time-capsule.local."); + snprintf(cfg->service_type, sizeof(cfg->service_type), "%s", "_smb._tcp.local."); + snprintf(cfg->adisk_service_type, sizeof(cfg->adisk_service_type), "%s", "_adisk._tcp.local."); + snprintf(cfg->device_info_service_type, sizeof(cfg->device_info_service_type), "%s", "_device-info._tcp.local."); + snprintf(cfg->airport_service_type, sizeof(cfg->airport_service_type), "%s", "_airport._tcp.local."); + cfg->port = 445; + cfg->ttl = 120; + cfg->ipv4_addr = inet_addr("10.0.1.77"); +} + +static size_t make_query_with_known_a_pair(unsigned char *packet, const struct config *cfg, + uint32_t ttl, uint32_t first_addr, int include_second, + uint32_t second_addr) { + struct dns_header hdr; + size_t off = sizeof(hdr); + memset(&hdr, 0, sizeof(hdr)); + hdr.qdcount = htons(1); + hdr.ancount = htons(include_second ? 2 : 1); + memcpy(packet, &hdr, sizeof(hdr)); + if (encode_name(packet, &off, BUF_SIZE, cfg->host_fqdn) != 0 || + append_u16(packet, &off, BUF_SIZE, DNS_TYPE_A) != 0 || + append_u16(packet, &off, BUF_SIZE, DNS_CLASS_IN) != 0 || + encode_name(packet, &off, BUF_SIZE, cfg->host_fqdn) != 0 || + append_u16(packet, &off, BUF_SIZE, DNS_TYPE_A) != 0 || + append_u16(packet, &off, BUF_SIZE, DNS_CLASS_IN_UNIQUE) != 0 || + append_u32(packet, &off, BUF_SIZE, ttl) != 0 || + append_u16(packet, &off, BUF_SIZE, 4) != 0 || + append_bytes(packet, &off, BUF_SIZE, &first_addr, 4) != 0) { + return 0; + } + if (include_second && + (encode_name(packet, &off, BUF_SIZE, cfg->host_fqdn) != 0 || + append_u16(packet, &off, BUF_SIZE, DNS_TYPE_A) != 0 || + append_u16(packet, &off, BUF_SIZE, DNS_CLASS_IN_UNIQUE) != 0 || + append_u32(packet, &off, BUF_SIZE, ttl) != 0 || + append_u16(packet, &off, BUF_SIZE, 4) != 0 || + append_bytes(packet, &off, BUF_SIZE, &second_addr, 4) != 0)) { + return 0; + } + return off; +} + +static size_t make_query_with_known_a(unsigned char *packet, const struct config *cfg, + uint32_t ttl, uint32_t known_addr) { + return make_query_with_known_a_pair(packet, cfg, ttl, known_addr, 0, 0); +} + +static int count_rr_type(const unsigned char *packet, size_t packet_len, unsigned short want_type) { + struct dns_header hdr; + size_t cursor = sizeof(hdr); + unsigned short total_answers; + int matches = 0; + unsigned short i; + + memcpy(&hdr, packet, sizeof(hdr)); + total_answers = ntohs(hdr.ancount); + for (i = 0; i < total_answers; i++) { + char name[MAX_NAME]; + unsigned short rrtype; + unsigned short rdlength; + + if (decode_name(packet, packet_len, &cursor, name, sizeof(name)) != 0 || cursor + 10 > packet_len) { + return -1; + } + memcpy(&rrtype, packet + cursor, 2); + memcpy(&rdlength, packet + cursor + 8, 2); + cursor += 10; + rrtype = ntohs(rrtype); + rdlength = ntohs(rdlength); + if (cursor + rdlength > packet_len) { + return -1; + } + if (rrtype == want_type) { + matches++; + } + cursor += rdlength; + } + return matches; +} + +int main(void) { + struct config cfg; + struct iface_context response_ctx; + struct link_context response_link; + struct service_record_set snapshot; + struct sockaddr_in mdns_dest; + struct sockaddr_in source; + unsigned char query[BUF_SIZE]; + size_t query_len; + uint32_t link_local_addr; + + configure_base(&cfg); + memset(&response_ctx, 0, sizeof(response_ctx)); + snprintf(response_ctx.name, sizeof(response_ctx.name), "%s", "bridge0"); + response_ctx.ipv4_addr = cfg.ipv4_addr; + response_ctx.netmask = inet_addr("255.255.255.0"); + link_context_from_iface_context(&response_link, &response_ctx); + memset(&snapshot, 0, sizeof(snapshot)); + memset(&mdns_dest, 0, sizeof(mdns_dest)); + mdns_dest.sin_family = AF_INET; + mdns_dest.sin_port = htons(MDNS_PORT); + mdns_dest.sin_addr.s_addr = inet_addr(MDNS_GROUP); + memset(&source, 0, sizeof(source)); + source.sin_family = AF_INET; + source.sin_port = htons(62001); + source.sin_addr.s_addr = inet_addr("10.0.1.42"); + + reset_captures(); + query_len = make_query_with_known_a(query, &cfg, 100, cfg.ipv4_addr); + if (query_len == 0 || + handle_query(1, query, query_len, &mdns_dest, &source, &cfg, &response_link, &snapshot, 0) != 0 || + captured_count != 0) { + return 1; + } + + link_local_addr = inet_addr("169.254.44.55"); + if (response_link.ipv4_count >= MAX_LINK_IPV4_ADDRS) { + return 2; + } + response_link.ipv4[response_link.ipv4_count].addr = link_local_addr; + response_link.ipv4[response_link.ipv4_count].netmask = ipv4_link_local_netmask(); + response_link.ipv4_count++; + + reset_captures(); + query_len = make_query_with_known_a(query, &cfg, 100, cfg.ipv4_addr); + if (query_len == 0 || + handle_query(1, query, query_len, &mdns_dest, &source, &cfg, &response_link, &snapshot, 0) != 0 || + captured_count != 1 || + count_rr_type(captured_packet, captured_len, DNS_TYPE_A) != 2) { + return 3; + } + + reset_captures(); + query_len = make_query_with_known_a_pair(query, &cfg, 100, cfg.ipv4_addr, 1, link_local_addr); + if (query_len == 0 || + handle_query(1, query, query_len, &mdns_dest, &source, &cfg, &response_link, &snapshot, 0) != 0 || + captured_count != 0) { + return 4; + } + + reset_captures(); + query_len = make_query_with_known_a(query, &cfg, 10, cfg.ipv4_addr); + if (query_len == 0 || + handle_query(1, query, query_len, &mdns_dest, &source, &cfg, &response_link, &snapshot, 0) != 0 || + captured_count != 1 || + count_rr_type(captured_packet, captured_len, DNS_TYPE_A) != 2) { + return 5; + } + + reset_captures(); + query_len = make_query_with_known_a(query, &cfg, 100, inet_addr("10.0.1.88")); + if (query_len == 0 || + handle_query(1, query, query_len, &mdns_dest, &source, &cfg, &response_link, &snapshot, 0) != 0 || + captured_count != 1 || + count_rr_type(captured_packet, captured_len, DNS_TYPE_A) != 2) { + return 6; + } + + printf("ok\n"); + return 0; +} +'''.replace("@MDNS_SOURCE@", mdns_source) + run = self._compile_and_run_c_helper(source, "mdns_known_answer_suppression") + self.assertEqual(run.returncode, 0, run.stderr) + self.assertEqual(run.stdout.strip(), "ok") + def test_mdns_advertiser_query_response_preserves_snapshot_suppression(self) -> None: mdns_source = (REPO_ROOT / "build" / "mdns-advertiser.c").as_posix() source = r''' From 0d0d6bd21f7f15dfd4035b779b87125fcfc4f07f Mon Sep 17 00:00:00 2001 From: James Chang Date: Thu, 21 May 2026 01:09:15 -0700 Subject: [PATCH 4/6] Refactor mDNS response planning and harden link handling Plan mDNS responses from the active link inventory before applying known-answer suppression and packet writing. Keep broken per-link socket failures scoped to that link/family, preserve IPv4-only watchdog checks, and rebuild the affected NetBSD artifacts. --- bin/mdns-netbsd4be/mdns-advertiser | Bin 242372 -> 245248 bytes bin/mdns-netbsd4le/mdns-advertiser | Bin 243852 -> 246648 bytes bin/mdns/mdns-advertiser | Bin 303668 -> 305300 bytes bin/nbns-netbsd4le/nbns-advertiser | Bin 138668 -> 138668 bytes build/auto-ip-common.inc | 22 +- build/mdns-advertiser.c | 1870 +++++++++++------ .../assets/artifact-manifest.json | 8 +- .../boot/samba4/common.d/70-smbd-service.sh | 25 +- src/timecapsulesmb/device/probe.py | 33 +- tests/test_deploy_modules.py | 337 ++- tests/test_storage_runtime.py | 4 +- 11 files changed, 1546 insertions(+), 753 deletions(-) diff --git a/bin/mdns-netbsd4be/mdns-advertiser b/bin/mdns-netbsd4be/mdns-advertiser index 48e46c6c4688c42c7db4aec0a487ea4c5a9823eb..7e846e22dbb86d0e5b9225fcef0a0d17cd566ca2 100755 GIT binary patch delta 50670 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

7Zns1`xY&pJ2x-SpXWFG`-~(l z&Acz(NV;fY-n==5^CjVV8MjaGO?Xj^;@;yI5{*mDqIhHEH-roHH?Few#T&oZ&DN88 z(FMgtbLP+f;o`hSC4~#-&xY0?L4@_QfyU3H{?DTMbBY%gEGY5Kol{)0cwyf4zJ+;n z7cBJqiV7jPWZ~lZbLW)g`ET(3M_zG>FTZdhzLyj&_AQ=YNQ!RYMZUuM@|ah6f1Z!X zc?-?JFyjI%Wtg$qL)i`{8kb-Am1UC}7;V0nXk7O7VUlvv`qtp$Vn3Am@)s zENzkp-Shv0%AdPneo5i{#Zr|&Dl930y055N$^E-uow2pRXI$j5YLbl4waCqM>&;E( z+KI-c*2|-*-&-4svE-D1C4kP|PzLCy4G4pVN>Bx=0sXdNHK0#7(DxhGgN>jL(8n9L zTg{glmuo|}5_v09W9tbl5grf^5DMFp%=j_JJAtoGfG}Ag2Ou!E`2oajgQ#t!`9CFe z8-#Cz=xytO5K6(eHE^Hbwp~2z179T2mF zTG>H@J1FrE;_o2t4&v>kkUNvW1ds&^02%J2=62SC?SMRYwsOJy&LhfrAsP$;$zUQN zgBQr)1*m?32rtxuCU5|BDPxxcUXTj1K?$e=b)Xe=DdR;CfQT0}0O`HB1Q6y$!n_y+ zCzSD0fJ|Q^)0fhLA5?&Kpb@l#Ze_eon3o~yR1Q4;u4@xcH zmB#gPqf6H_#uD)BVU>N$xGz?3^_!j3jL~}QE;Av^n5Dn&HA`$a-E6bnA~Wqa@n3CL z+itVjjeGtZS(=K`Y5Zuqqj~5~`u8KZ8&~LWY&08gC;S`TX2Kn~Z|0gMw!7YJ6Spne zOv@HG+pMvL{gZkM|9NHw zx8)cMJ%i>}DQsQJux($dJfr;2t`NB}&fGD>=s##K6?}Gp+@KxcQg-Er6SQ5AKmE&r z@0lQhFX`v;HxbBCp1D;|<`|cnsh1d@^ZT;_0{*bA(QQ`kUB)DBs6~5Q2MDVHAMG7< zEPj9dzIozq5;bwY)5t)BEOn-S3fblPHQ^pvoc}xzd1$D|uf%j9&L69kF*xXoWjEEG@_`JYutusc(Jiw&(a|+_mF;B|3gRRP#)oS`S8zUoUwej3$7H>8N zo3l3?{UT?z8vX delta 48089 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 Zk{WYtz0aJDIpk^tBj>)(|D;gz`#+6*>Yo4r delta 46929 zcmb@v33yc1`M`bW&Lo6Mh?5P%BqT!!7($2xL=7>*01+brI{`#Q#Hd)8BF0J;6`cVR zKnfZ-Yyz55(ISF-Ew$Q4<=;|8|5VYUQacOR!~`p~*y2XM-+Si{25S5LpYQp2p2NL! z&-U);J?~j^eAyYR{+{0A(O>@MnxdjJ8!oeJl9Dw31vSmaBmT|7)1fuy@cBpDnx8c5 zg|9sOMW#(JIrx0CUS!Km`LkVX%dG|d(E~(q5YfnBuzSkU^zPmv^l5*z-_2-9Tc2`Tg z<_X1st8=zhqyCIw6!@GrEfh;X8j9GosS%rJN%WuH-EPhL)~78LX*@Xm(|Yw??|!yU zmE$aIsQ*z@^h>KuaA(+)E@mf=p&y#ZQ3;Y(A<_|?uX!JK~v9mBBAf#xQMv^qZZd@L%zp^>{cdLn` zPXN-07Go>~(%Ql?n`dcMYYQoDU~s)XBe*e*I)d&|-|$a0TF&-uG;FSxjx;S8NeeHJ zYW{+bw6^;quJA@9*S|d4psnvnC(qHgD&pZ=v2SC*Na8~>A4*Ou;H5wX4JPuXl2n$) z?V2lW2c3S zpaQ}|S#Kzor30X6Nw^Te5QH^fb$3?@l{BqBM!qmEOj(4*AJKBXp)5Yy?G`CTN{;?T zq~zMPLHf@gQ7hBjwtDqg+F9q9;OY=kzJa*>{^=``37_Q~J`7NXIjiqo1i8`kZU~ zt9rQ4<-HT%ey`3ysEgJY-W&boMXhV$z&xXVY$&$&(LrHR4SO&YslRzb6l>6# z0tU%oBXvHa?1Eb;dw*@T{^p6%%df19+PoJ=HSJRDKq#_cM5-|Wmi`iuM9q@5kh&`? zM^AcKt<4&8S-yV*VmuA84MloU>=)n0i%HdO@~%yfypNP1R-FgByI+znH$LJCUtU-j zeZ~S)%!!~;-+FJH``*p%3spw;nSI($&_Y8f;(`X-)CJkU)91aYl5^%)tqQ?4h;s(Q zU7_U}l~%WDT3_RAt6MO2d&wJN<)x5U{;hf{XXVI27gN2#AN9Ce4V&kJsK^q+;9hjO z)|KRK3fmecnDUjozb-1qEB|(NW8d+5^2O?@zLWIncdD=Z&I+7=r`AO!6ysgP6>c^D z+}+)os89?$*X^)t`8-Xz|7%7SS6@vJpGYEA##=`f&|A6P@7SVJ%r z%cNM_9dVfY(`2J(gVE?kNU_pb4fg_mFR*?iEs-Sf$ZuE{&ByrkA%CH##aO7m>)+qD zT=jDg&e&m@eUqYsDby1yuo3{38!fiyzATT+Kh;3VJ}*(R}Z@jRWL8x zeWwMB7iPLJ5JEE<^A_Bpp2{mq4#S3{JJkDm<$>~Vy1Q&zBeESDg^rtMPo5@+K8SP3 zUJ2FPwivc^rlALzKy7x+9u8&L!b=%E=ft!iqS6qGcKdzbumHm7 zTqXQDs`}>_p1t`6I2sDYoGqb90ZoYQ*nF!eobUsDi(8WH{*aAsbnzncDf583DSy;B zDQWkFBI~a4AhY*|U!x_P7eu|w+HIkg(eKrIBOII+Ih5%4<_9}o|E{~UUPbb=l4`Rx ztww#7|0DNg>I>Cuo*={uMLv26rQ|vB1$Fg+F@cvG9HvTnEjpy2QYO=UFzws~)27D& z7QBUNm&8OY9Tu|?-<7&67U5sSDcdhA+q+p$(qdiLt z*`RF>gIf?L`D1CCe~r*k2G6w*WN&QQr8}PY6y)3V>=)FS!a4f4&#Q+Dt85>r4+@_w z|LOBuS2wlF=zh|V>Y}0*!eTX9>)MXw%6o~YE{a@rUiZ9u&U3Y%eWB_*uqwr|(5|&1 z#A?-`nZ5JdHX3DZsm9~#vq6RWz1=Fk*sU+=R;9)6g6l1=n@xj>1IZEwUkdgMy4BUi zML9KAktuL+5Ta4N2f#UP}G}id= zyju)uJdef)|65+XV_51Q(XHkWF6wWyieRvvj1!%<;EJfjv&HbKCkEd&AlJ&BOa*CF z*q`JHMFxVww`$ywJlmJ*3jY5{-7%!l_KA96NMY}fWo&?;XR5_RvIhLw`sJYor`H^& zPPVdN{hhiWt3GGe**8C@so#ywQH^JMY_F&_XXe=+R=fCrv-;zid3x}K`sB|EsNx?k%c8nKQg&M2 z0>*T~Pt4}v6Y8O%Zawvcy12Bj+CS8x_dB89A6j%t`*(4~7H)qKUp5@$*YcKy120a%NLZ#=M%bPvc*0-f8l8d} z9)vkg+bdP^(*;qQv3r+A`~ga+=@1f58`kwjuxTOI+_iIS2~~7x{BH^HwJny zH|%>>Mdt0H&fZnDw=ZBeIw?>WElZhcj!?V)R6}c9ZEP^T z3V+Pu+G3)ItLxrrimlcu^5But%QDjm(=;ALEV*^3b!qE*FXI-LoNpX1>D?N=39%K&bQieGwug--I~#-dqw?2zBT=PAF3 z$7yDkDScX9Jhn)8j8{J$Ta|e=IS%iNu*?u_{t3oo|5CplTRL{(HF4(m#Oqe;TTi^^ zTi<%(b;C89`d?R0`dkotnY52|@OCxHH&XBTPTk|H(w9tEFZt%^W!EV8xFY?jr_`8n zef7(ys~O`8^uxES+s2L2!%wLf$GxrBeXW*_zegYTwMw2)>R$Ym)>X}@ZF8**ryyOW zmhRv6l$tbQrJnhndVj(Y{j;ysi3zjx_rFrJYHoB7uqeM7p34+Sn5w4*qjyYGAJ^Qd zf3r(Xy5P3{i@u7>@8$5tbi+NNNP{EKIH*3jVA#mBrp0HZ8UO4yXQm5xXvwH<#UB%2mhhYnfPPdFVuq*C+O>Usp!OylRKb-W1;%}g{AIQm(pA) z7`_rw_W+JYmC2xzv`aZ_H|w_#SC7}u(0BUOiP|3*to6YO7sgu)y_(_)y^5)N^~87G zZ;A;jxl}E=XncAGg zq7pLE{~BLTG3fkehI(m|d*r*rMY;UZBwxse!{VZNM^N8K&pEYt%hcM(P7LsOP4X>#u&PqEja6 zPkpJ%FP=JR@*Q^V07!>P0?`qk$LBk=Z%MPs+jfUt<<*Z)@;?bODr3+fwWz*WU;3na zq`tiGRXxUn#2|D04)sa>jeS2ym=naEj?GKCQ`%QQo;t?;Az3bn;DQJ}yIyyv`t8(7 z?hol{1cQx)zBF&pD1n5UpHXg%Dw$5G862T|`H@uz1K=b@B9~z@+lE}9(*sn4em95Yke z_Jm_XI&6FA6&9#lEl@uLMq*zv2mJ{>(x8V36r-5)q9@hGm$-Gu7%`f+rkQ?VzIu0?Sm{fpFxmz3*&9;=))iu8BSSLHL@fwE(mcG?rK z!4EWkuswoj#tgC3PWv)U$TU>*wU{FAp}cqz!maEcT$X_?o4VPwaftc}c7^DCrv*R< zPm@YkP~)nPr>H;77|?g)d@MqmKXx_hBkk@)o${|#UjyZVCse_u1^Sw!YRsjjwkOmL zm)@%1a8!MKX#3dttiq{?R&l~&yp=lV+AD5&V}4Ia{VX=(hs zga_pJH#ey}XS%EA&>ckZ@ z^xw==Gv>_DALApB`{$|TD`)6;P?Ep-JRjk?kLPPV5AlrhJi>D=&u@9A1@KGWuxn)m zFTJE{QY~pZsev@_HhYe?ke4P>3rR5E%2PF6U82ADnR@E#q5-#l-re={r?Cy_NRlV+ zI?04{IGp{7`t0g6_0?ahzSmUg3y-O(*NoK9`cf^sW{&>P$JHm-EYaV4T-`XgKwt6` zwQ_Dz!A>#aJ&+Zu`T$b;%?+qG=9cTvKCZr=Tbh2KRZ_g+nLkk@uPsUqS_NkY?CQ}U zpRKQaTz&XscjiwhDS9oARyq3nyXh+Vx>9}i*J|W-rI`t4ucGo!(%yiYf88T`_2Vk@ z`VIPtuhfp~-TIyz)$gw_aQAu~`9!}=?U#37JZxoqT%EYSJn$FO!3f6^;&IG^r#c8V zNv4?a43nBj4pL8*tN#lTU_SI#k||K%t%c|C^FVtXEb5$#_&Af zUuXDyb%sQpdY?zor)^`qIEs4p@@Sc>F6yK+pKEo;Kx|7AD*#?^UJ}a@I>F7PgU;5R zgYMQG2^XZe0zZ%HzBL^V??X&YG9nURzW@B?(Mn`J4`4uExg4Lie|IUlHz-)Bb^1Ad=_hT zo@T!Qq69TUTo9c2fTIBWI82KeG0z?WFS6LmcaxYia}ZB#&F>A=)s5x^cDq=41_ALw8!9qjGfnv+Hc zWvH3N^v7yw zcmWOn^ThW8Q}!RoUWBz1p!5F&*$@8!;D?i1b8>0F)dDskhQNE822}qC4aon0(SX2}Xf-m^Mk)y!GxXf+mPw;C0g*fQQ1 z@ZJb!GQ5`I+084?FtYjHz<2SOnNxH`jsqm$CiCsu)5><(TaC&dWdrY1_y8Y^`8bQh z(x{B#^NI^hjJ^DRf&3J!lCb8F)CuwJSXQesbsBho zIjc2bi25XkMHxiSmj+#;QuVPHpujlRY2QDCL5D%<;G_5m4dmem*h&GiLN~TS8QU9m z(FLPgjS~MBW8R*8W9ziRVHrzi%G`oMEMq{kuDcfNG8C_+df(4>v^Z$ z&j-7wt=*Qtn2=>K>Q${qZ*!fG?E{|X@D~h3mEH}e^or!-n#BbdA=39XpJMS6Y)DQB zYdFtP*a@5WzNoCOR*s+@5EOqSGawiizi0UNymyMD(dV;M8`Z0uqdgssPc0eo()jY8 zjgO>pk2Ibc874r6*SCvt5@FWMnxpOn;EXjQ(18}DUblE8Qt#)txKARjBK5;9oo3<6 zY05^G$VS#l+1P4BHY5UTwJ`xcui)D;rd)quP3;u-j55-;bi69wZXk9I(2Glie-i7QMF2twyS|>4i1R3S{Icm`e>ZnsFWd@J7hV&+GrY*H>Ej2fQPNpndHNKK?o zq@AQT(gD)p0RJ5$IhIhFRK|O*JW10@^GJ(GGIfS=cmxs^JQ5F~%KwB#!N>*YZu( zPGzOLwxZ6c9Z4ENI=jvwCb?OtxFR#tsMUx`B1hR!X(CH17pN=B`=LqGVz@Rh)$nD4 z=W;`@SQ@#8iNm1Er4f7O>yhz%8|PvHhJ~C#EaV8Nw&Ep`;A;-!>f%tOsD!;rC9g$l z$F>@^QqH%j{X*K(OPGZ0SsbxB>!L-uNH1}^g|BJGqD;+@T_0-^M4Z+@%wD!4s#mXw zzGDf7SQ{Ce1=QR#P>BK-S5W~GsQUGo+7z>G*x$$r`H@ z)>zq2hnr0&j+0QYHZG=v{Dv(?GaYCxq1c-?>^P&^3O&P+rKwe!8AgStF8a<`L?6H^ z{ub}_1Jtd;gS~)#tHx(TQE^_UMJ{=_yL+YR%nGE)48Xfqg>^`@T%-%$Rk-qu6}k%@ z4Tc#EqGd>t_z;w#o;t&ZaM6j; zQ@~8YLRj?Cud#MEE!M&;<7l<8WK+A|J2R$R)=1bR?$A5%SmWdV5w3I#s2oc_H z%B5-3vI4SrwIVIgXv)tsMh?ePxYl+!WQ(6`am2w6JK41d)R7fwsgy}If@P@&(_3?Q z)k2F`V)&)QoB=DMUs;2P*z_OjP^5YR{r#bUd7HK-(6Mk|p3$?zMb&x60y=A?vw3uu z0ANvdsiiRdK!xuUW4!dA+uPN9y-z<&d3x&_p9fLaMq8CNh~ zK#e3knH;O*RFMt(9EvTlS1gGH#1LRmvXX#Y-c3zF9z@;l;F~NqNCVQ4!)inZpPn+3 zPd$cgw<%QA6&bowsDf!0A-#_BBZ=*#5Yy2@q1YVqrW2gVZP*epHeWL&oQx{nVOgq6 zXh=Gfb;}MSsWLeHH)B%CCcMglq)d{Xv}e7T*|_l%BPPZSBUb5crW`4gWGC%uHmYP~ zdj~(Q7Xaw_%cA?N4*#19RkGEfau6x|)Q&1g(C8picJmKvQ02(=rUq4xY)(RBI{VzT zEZQqT$AaloR>!QAe9s>oi0=3voHZM!@df+AjOmw%|3|y!V=$%m!`3gJDz)GNNhPWs$Q87z|(> zmXR#sWG!LpB=41sWC7Wy%4jD;?1CbjaV7yr8@~KIPs@;-Wvt4~GKXDO5F?cgyRvmj zhTR!Qx&tPEJv!LQxXTbLj+&Ekm(eNW*0q%ahzzZ=|E1g-R-d3lao8$l*e%Lr*j;kU zu=}v&1Hg)rS%#Fcxt4}y-%K_29Rld2y67g#RJumd00X_v)pW|@`Wndu+j55H;i!wV zAwF(bHpIv6tN~@@3?pX{1Go=QP%mB_8IFeyh=wjBdl94ccrvQBJYyIcWsK|%pLBO6 zxKpjAsw>NL0)q1(+(yCM?phX}fESRa)tjC`DfQmAX)DD$kj`Y}UP{?VN#X@mx>Ajo z@C3|x2cE#A#G_xdX`6RfFhck@wU=vg@J;uFHe{EeUK5Pi7c7pHBT;GE^gv7oM5ihL zxR{n0orxGF9HwLsz~L~h#aXJi@>k4G&5`|+1Myc;PP4uYL0?#ol<3d>xR*U+-6lgU zX^?n##%C+oJir7+)-4nB&t6ssO>`i8eq3}QvM&Hi2OnA;1j#q2lu%SG#0WYBn;3Cz z(|U+2^1oKuQb9(f!RlNPnhG)n(pP}WIJ#L2s#9~A)R-6%J2D%Q@$9!&BQnAZMm;0A z2?_}|LLosUj@9=Fy=&E%J{su*m(@f{?5!wnKstG>M31{1DVTMEO?&;@j zvg(wahF#A27+Nn|;KA~f9_?OFy9`Grf_Q^&Ype{IgJrW-Pz-GXD_MCFtTNsbK3Qx+ zYaJ{tKScQ?gl+C@VM81v*p+D1Y_qXP=Zup%iP7LZ$_eW}H-vQof9%{I81{6c8mtDc z7ogDC3@}@vXJbyX4FO27e99`rG$IE-Dd!3cL)p08bKsp~l{-pX!p4(f$N;M_35jKq!{ygMVfIx?GCsbL2V3N7#+EbS(uOEr18RNN@!BFalB>(fxZ$Q zaTIIXCgK4*N%?qJdwF({BwipffDCFwVWG-w(Q)?nTniP_ zw98CmXSy;V@W;={6aB{@IVtsebyHOMFXYd)$W`fInS)z`>Rc9MT49n?&u@zUS{k6f zL}kZS93aqkz}$k_)7bR+tSLH=VaQ}>IKG;<->O$xzcME9q&AgHM=9-n+8LH~H*f@l8DICQT*-7y&H$;9G2lNuo8f z=%LwZ3|EEd{HJNY)y4&1sQVu48~8Uw!IM~Q>{k|^qu`FLA_$H;D+vET;~0qS%=#Y5 zo;ZFf!JpG`WNiD;JdT1C2!6uVrc9U70%rv8oL@f;M5wzF_}li z!8LKPS*VaTI$ZFZVGJ)Bj2+W_Yc&kuYi##Bn7Ia6R>Z!I{7Vy%z&>I z<+g=GFOg4 zSfix3L&z@q|du4PFxy10z#@Jpb@JHY!AgUgeUm5G--TLZ5@Z2C zhWbA*OU>aehHAMfH{;-$EdTgccidsoMu@|b@=u2eI)HznV6LqCt1NDWfLj7E;mxk+l9vEK++j~=k0 zog%XdS=lqlTD1irpT+YJrIu}<`qM4_0=rox6&orsmLKA?EU0c`K{dhWcM1N?++Z!vF>7=75F}HML=Y!;6&T4Lc80+f zQGPLl6(|`y!%zkm=jTZ{E9{T10HQRs#TzCwOy_N^9Z^_prT`?sOt*j$Kt!^|iU~lq z77%t;4icDNZrM#)CMnTdjhQTA_JU&5uf}e(&?}a~Su35wa9QEyh<#YdEbEuWRPa(k zI#~j1#5d8r%goS7Epl$d`>ILJF!KfL$?Dl#3j>L`;*V%mzE*>K{ebv-VKoNSm&f{{ zXEBN_8dSi(q$Sbn^U{rH*yAlugw&BpkdJzHZBFFN6Wvu~5Ga#Jr%&**Edj7wPfKQKlG77PezLVwO&Neo+LUw9x5n+${Q&v>vH@IvHX z+V}cWjjycjKD!7>i3#{Yl7NH=fG|B_afJDznlYIVFeKSDEuG0tIKH`CcH(~XWvYTeD+4m9_e}VzMrMw9((NPw#1R! z#?$nw%nJ|BUU=TXp8@(%FuIkejGV&HGr~AXM;UdYd%aq-aF9O!Z|cQ`=M=?HJhNE< zg&=;+kx4>ZD34SmkkeWAHzst8g+NiDT z7!Mq?Ifm+saLonvT-s{0u8Vehd)a%ct^O3>KVak{Sz6<2qmxE^`N6UwBnS38vpLQ0 zIo#bjGt$p5vioU>}gLSYAbsd zdo@rt6pA$jmq#-seqA|I>srNLfJWc4sLQvmVuNWLrRIa-=~pH#?fX zx+9H_TueM(kX6itk%#PP*CsuzLTla((J3mAq)AUN>A-EvnM1hpXEb z74;p(ft+d|M0Wu@gcE7{*#qjSMd#=PhO18&6_kF{U$!lWnR0)BQezt}?buL-vU>{VxDd2npebZXL(tL?u>D86yQ+|(_6Gn|n;Fv@T3`() z>MdCiz;zjAeDSHrKS!W#B16d3e#o{Ll1ZDtJ)-nL(To;Ab`Y(T6F+a#q=So61RCeJp~F_LFpob`#@NE~S8Z1%Asm$LL6@p?cOpe4M!fnLm$Iv#r9qz=}AwN@#+ z+E^w>gFr?H=@g96+{Ez}Yimf>$5R4Pv<~d$Dj z5L*u1^yktRCs0ZQDL^bNd5($>YtSzR2w~leAIAqF3Cq+p#tDtGaoq@Q zJRx=pgkZf1q1bvC^_J`{Um2QBCJr7m|*QtjV&q$I}xb^C*#d&?@_93}< zfrF{v+kthebjhrwYZHa!`kN)AZ11WMmWC z`bo_7l2~_1bx8b+cxWcUh_VAjGW7D( zxRjB}(?PiC06?L!X=kLv76LHDwd!wPW?sY;x0Rc)m9rvZXW!^SrUUEj>h`ALdO1fQ zo5}-c4nx;Dl`JQ*&`P&7EA~YMCK%ypE8UBYI0CDVz%n2Hw6M4WI?dRGQd3@QY%y_{ zI=50s?1PlK&ilQ6c!BymsW0uFB|do=x^pMgwC4W0ZJ3(h+&AFivtY@H3kxn0@;fW& zLKLiyrlyOuP~Ar}Ig}l4=3UBWA(Rf#hstk25&ueSY%+A(5eq-pI&qXZxg*D|4k2M; zIb7@Uok%aQx8oS{V)_-9ip#Dqxj@DSQ1(VT3CcoZs&O4G@bX=pom=JIn`dY~F(HaM zKJ*~g>5wG!1Sl~v4v)|=XsiV&vpg1Im>{Te!4B-*^<5yYb(j>^(YV_p4FeQx7EOPKSV$hV^RIM-k-Ub2EX~FmdO$wZvQYqzO1fvHHn6u>og+h{V zNExcyX<{==_@5=Ah#fsJViIKDva)VzeB11aL-Dp*HFDZuhvp@WM?0c%dpxbit}bg$ zSV$wDq=b5UbF!aXV%+O!*ugzN;xNhpMwyrFR36n2f#Z5Bhj)2=3nTdws@ANs0P&Il z``}qx*IY|@8xY9rm=}wo7FPkm?L@y~Wh3f!%f}JDt>^wIu0~<;n1Dr<@JAHtUkKYR z03)o>d_e%BGRi7rRKj-3IOW=4O1C=i=K}+}Ov3$g9~zdPcL7K|_GB*rP`6rSD9E8_ z;#+1O1Sq#A?n$0d(ZLm}&8P&N14R#-yB zR1Ri(fzw7Eew&)_y8 zODfyMCR5U${;bizSqA{=U(TYwh zdMU0yiygAFh@Kz5s;~B>^q9@6%Nzk1>fNP2yT4y)DG@O#oknThcLP_~O^*#_BS43r zl?Y%E_(krXS+B}l`sN%375OP+#^H|;5yqYV>av!?-WlvR5W{qaTHKPQZ&Ei9j!snL=pqCJX)}5O*V64K}e|!CoDTOjyBfeOhkp69}Ec^Dy~> zLq3Z#vXibKVMia|bBOcFdg=n~%NeNehwRDq$KC8eEa7KgCx8IJLhQ7BdxGDS8}dv8 z60)pXuqLh=dqG`TCFl#TGby_Q|2cugcU2$($+GoK!%rMd5UKv232x2+n)O|tl(>^$ zyI#G$W=Nk#=*68bF{qUFgtD#8yWkN}`YS97aWTb5pdfcDC1WDxPNglNZ6oX`hcu3( zFdvgIftbZ3f??LAVjka8BfnuO*Av~a_N>f)z?hh_2#%MnS3A}gWjap-{pl+8@!C?o zLn)`4uOIlUx>FSt{8vOb*P*#JlITQ7B%lhJlm#G)k{BgP7=Er>OUXm`< z)Z(z%a38yt=6WHEraBgL8=lq}9@Nm*#P3xdja)#ufbn~-Ru?_;VRzR;b?v%g`U8j5 z+I8m??I%QZx_}ntd@rDdIjVDA!BvToQk2d&!n}D<{8{emjK7QZ!t}bAanw0mYck~O zyu@{uB6GUGIV=(Xr`KtDa-EXtSut3N4CNw2_3DQ8c>|s@nIDqzw{xM7ptbh^`Zz6C z0m%*Z@cOJP{6Ze|%e?f_!$pH^*B?OcZlXQCkV8(icFGh_GgzLfWbC6~~{ehg3X z4JmC$d1l<;X_I;4V4kE`xtwuBzup`!F?*<2BR2H2ovkj~P^jBF)Qub5{l&p?JP`M3 z5>~5z3fpPagA__%r+&MkAmt!(bU_+X|WQW{cI0&(v}yuP_uFw?h4G(~z9; zA54jkud9nb%`K3!hAMXo)~IKH(Jycl0FUpD9ksUmSF_#!@pNDGI=+9yQl5M-c>gKyRjKiIj>jM?jdtS*Y3~>lfJn!Uni0NHH%8N-3U1FHZujhIKYAmh zg)9OXd?!DhZ}3|3QS5AXbIUb;QO)sIJs&P-(57^yG{?gwWRZ{dIu;|E%`*B zt6Xt__wemp^`{+q8Eek)J@=r6=2pIz3E}(OQtF;V6rNj5?piB%0l5QD$-SQvoS8C7 zG@0DKr{s>K?*CduFD5tjl-xbk-Du^0n}__U#ZUGdNWZ2?3rk;sEyb{vskOR}(byH3fCk~`YU-A3*sr{umv zuE)w!Qa5Sq_s28h(oi7Zyv!T(AWcy$^QY5 z$>2fgFpdW`(-y_ez$fWU7a19xG6_l7cJ#7sYMH z2UqZt7@kVN`NkX;K4qUc*88Un6+*0^u8F&=@@@Wi@lkdjK0`+p(|tzyi_;5pkq@I6ozC;HJKvbi zTto)yawszXQ}&+le%M`Lln7OD;?D%T`YW0^&quHf%A^30lv#i~poQ44-atSoXx_U` z3}b^?25-#myM;rIAnt5n5dl}Nv*?g2eYT*_zxrsMy>SFYtX=AoXA7&^`7*B;hk{w| z|CptWK7ihoZr!9hXh>LVB;?!dzYf>-F^x_ru-Lw7rd!Skx- zTePk=e#>_e&t?3U@A5lwPht?awElcyqB0qD6-Y=~afkm5No&{>ptGGpZF@fZk}|ed zlrVjn50>>Ty(cR9txBdCQ~6haj`KnqdR^XK>xfy0A`>YmdgB0r!z}ObXL*0L>hr=N z+f+5;g{;6Zi!zg;j1wx#@_()M?Lxi{MIOdmlnJsOpa$yLz3;S(^kIH7!&R9%hpO}( zLNM;i3SebgW%nL1^9kR&wGr=_NG9`snEFyzjDpt2CAV#%K-Qr*lFR_2jm|~n4>{9~ z@%@>Qlx7$mlQN)$=qQTM?X@EB=}xU8 z{?6ivQ+rd&vsD#fTqZDCYfVUHDSvz_dVsvtsQO=?85k)vgz@-L?s=@&%hrewWl2Wc zWO%tj&Eeq^cW5KvfSWU6%rW&*ALTE$A|`L8X>RdzMbm3Y8v974jxCi9jnvDf>;$Xq zYn0VSn)&C%bnbW@5A#HN4%{EVI+0G-U?f!`ljkvX9-yH@4)@?(E`^wCj2iypu;IU< z83|B~W!jU5Oo2k@0=6BjV)bbiF~_mqQ0yU4Nd|=))%@b1z%QsF;|Yjt9&e3urZx92 z4R?=tmqQQJVh^QpSAuL_pp_i@7P!&?{-YX32j-<3bJEu!)&oeq1d^XYh=A9OX=~Iu zz`EBR^qNcElry>Jt#6Vh6ECic448LC&SU~LnaO47F2H5bW4@{)X8xVFg8O9QEq6eP8f zLZqFf7f3IY4v-F!4wF1vITX#TuY_j}SX|F@JLwrxO0lMO$oB_115H{*Y9KX|c9Ra1 zg8cD<4xafSS*~^^7Y14$;&?S_C+QepxAAnkkgJLB za=Lmqzr&=o5ReRJ_cYISq;1wh`ZnH$?s8+C!>4I1Q)mS01Dags_%fL<|La8eVV>K6 zeyls~VLBrMXe z28f#ojfUH_o$;!8L?Lr8u@?K=2We*!@fAsCqdB9lT}Du%!%mSPyN^XKLKqHq4iY94 zTN)d!7XKRGxdg>R-xty4{XAuQ{nIq=io;$=TzRhg^{)qAyO_@8oXJ<%T~YGsZF%OT zPyDV1M(1?4&dTE0ht}ScOGIUvy^G2Uz_vWx6ySKEIPM3%L_0}*4@_l{PN=rJ=%q6+ zdev&-0$PxoW8XVzM4a7aaaaY;UokWV!QyFaPk%2@D9cBkcB@Q@`t?hN1KX|K-sFxX zclXFb%xB!RA|UQP>Z_Lu1K}QD`|x3Nd+|HJ$8S5o zOM3j4^|%Y!VJfyZ1?oY2E@2Xz2~x6i^a&hKv6^3}LPCuAA-5RZ`q*?D8qcsPLuL)h zR@ZFqtCc%5Y6cauMYlPcI}P$yyvGK#!nlRxx=u!zsAhl9Xq%)P%pRjhCuJKi0FVp_ z^7}|UxC$_uPVZ7{iaE(Y|&K|cz&KkMHR1{CluB~quuk6Ny z-Cfeb9w&___$VfN$pIr}n{+bM6j*&#Q>HT*vi&3;tq@SwF{b!qe%^cGkxF!T<{rMcg)$_RAmZHCnQiPY%`#rD;x>%%YGV(0EzG7% z2O!#4e=2)7vKwTF`D#OBZ5OY$vy%2o{Gu=KwZ{NMMiBu+40g5ug88Nsr+MBp#Bz`S zNnNIv@vc$QFfnsqO`%c4^T6D~Bmu_31^DPZqbh&zWb)F?^N`XbG=2miO&S6yV}rSP z+yX#aP9Y1(t2;hs#qlJa)Wff2_1`}iklHxQ*|5qy1tKMb3(XML2dfDf(R3NVZQc#->gvH}#L~u%`x4t|BQJ4_@$I9C-%wY+ zi(=i%Z!ryWd$Gu!IP(7xWn+D182!k)i%h4uz_v7cJ%wc*zYjttg|mkg8rPz`a`7;P zU747})v8y2n;l?cr(-&L(Sonye~fX(|6^J+>3J#*jcbno-U{^Bp96%_i>J9g6QbL- z|7lOA9xF4E$4p;=ML3{Afg>$_*)E@4Xxt`Cy>N3JDkP@sPiKvfZYOU#c{h`HlPgv0 zTtvfSI_=(%5hc^XaL1~tKquASX>f@RRj7x9O&c*{9@jd_Lk)%g>%h(+Ty_rtMkm)r z+i181X%}mzX^X>hP(jMQOu3(_SAW;fHeG%2yI~jj+fq5)uqry4rysMN(#CQZ<$NAF z7#iO-DZA`^;Z&oVBx1XKRebDcIB{2u%;O&Xi`w!6^LiB;d-~C<$cyDo>^~D31bW^3 zZhKM#vggD7^M$h5bkdoGRf$@buNsob7=<%PP&|_b(vtAiS5pOyk5&A z%w=LO0WHnDUnmoZg~*s@DQX28BF0)!t}ZDw216FnLhU>>4>F49hx-(hGV^i^jd_%r zSBcQ0d240!Cn2PtvUVX0Ou>{wqn&Ref$Pqt9V}3_KNx*smcziw?u-jkU_#XI%`#+K zr={i_JFC)+d!;buu-X%hK2vHl9-;8Hlj1y?x}`2^yv;Q5GJdn4*70T%tGIE1cLGc; z-;P7)>vqx}NF3*z2-rXPR>EnjY58^0MLbIgE>@5{DMJf^hC8;E@oHh94PRBXq7fDa z8(}MWh!N~Xi9M=}-%S@FD=9!+~@t$2tB$hc4cwvM6w( zLCI?)Pk1$XGm?nz7#G*DUcIjUx_NZK5fP28AB%YQ3O0oWp!&O)n`he-ZR9qp&9A2i zrdo<1!6O01;R!{q1RUw|^8;M^%Y;wlaVdP#v{3Bxa}XH@rx!|D@ndh-9@Y&h8w>Rl zCnOYWmwe>-1x66u*T~D{&t{Hz?VW(dZr-UsL9Fh%Fb*Qez+z>?kR^eW4ljj)B1;ST zmdx*I{1#!h(J^Tmh%dYv2vgR-@cy6TM$8zIwCxx028Srf+GTxNwE7Ko^7dx z#(TWq&HEP!fy`({cn%B;6v|#Olfc87;tJL{JtkAcX*Z)f$>IPk`h0>lJED=YKKZw?o+O4GUm z3I0knM)FJ2)ECOmyk+HTi{tTv#tyAb2b~t>C!`Hg0gF+ewAS z+Alwq8j^RjjJ%c=7gZF?aLAoyw3NpuK!KmfV?Ux=ml@=-8;20(VQk6UZ; zM=zzJh&7OjOvqq%$em;Cqx^iz%TRJ?N4_zb!BSXwCEtXFy+BHMp6(5X$M>0l`o;%A zC%{R#MDw;KjlT)N8zu&#`Gs*^KlC%veScIu;zXy?VdYtc#xxqXg}4Eoj>In1QfI%E zr?az7!JQSGn4&pnkA>%&2-|+sXpQ4r#IlFgViQNa57`NFlr4)^k>?u~h=1raWm)tb zK8Tgt`ZSGTsl-Y-y&K!dQo+Uc1U(I%#!VBuaK*cEVI2w^M4;^C`Oxd-f8sl%+919= z{Tti&|ESdjXuZP|zSik84X~6KM@Y6WUL(A4`j@v0R+1sZSuWpFLd5S7Agp-oZOAG4 zD_AH*$YK>Ma8t{9^tpmySCBc4z7 zinp6>wfoM!n%k5e38E!|=u#YtlK`pn|JW~Zh!wsRnt$B_fjw>RQPxn|;mKmF$kf=n zUfRlY`Ih2aX5#-fs5k&eZ(15&E~N9uNw-o+*T^J+Z4S$+V{b4wa&~gvhPhfIR9Q?J zS;>CfySH6$ST-q|B!7*K#%2PD*Haf|{j*BcV)9!eQ9e@_(>yKhV&e3Q#ohnAxKFnbGGMc4%;i5&3;D>8y^++c59(Q(*Jk(H{+UK$3J+@I6Yt? zbB+^*alZbE!!+VD9-g9gB}{Z}b*mv}TFy?0s+#wyj(~yUIEghY$p>UQ5Q)QyiatI@ z5MJBPiP`pjX{-v7pTu^tRb^}i(=fN6a^jTOtsLw)b{^j#gWa>dT{`|f9VgbY#KT`j z{R4Te#+R~_fDu@nLtj~dYwoISMkARolPROuXA}@=e1--kdTO`4BpF2$(>7VgO5C@d z@fkZuICEP@8$sI8%kWUEo1${H>4&t{z7NFkCM9X!L#B}uD_S*-?`I3Pq@$^Xz^QCj zWE!xKio%v3?~fZJM#n4$DL3PIXYreA;=XeNzoLkEpNSYp_zmEN-)U{@+vS4lc{I7- zEloB@bA~rZxnjGDDZ1&MF*U~+^Cya|=DE0G@28a4&b2j*ivc1(WAQ;%IS$}f28nRLWkkEf2XoWFu)65h|?y^8mQW7)`{vIO0c z*@!roGCSGYyVbZEhjPBZ&bWzLMmbU~e~)S&j-}K~%t{teFV`F3PdnDv;SyuxnV!t0 z6B$x7uBtP#xDK*=0G(YPUyppzp*g>?;(TQgS$HhvORO_wHOUM*u27^H0M6o@Iir(Z zsC=u%R2+5YGp9{8YDwmO$xIb(0fKc0srU->E>VeHf4i7DQaX3;aZxkz0}=J(PMaB1 z_@n$DS{L0%0O}wSt~Xs)|W_INY7^p3VVt zvCr~5&`&0OR9MNKOQ&OpOB``9+0YvN(Iw>D(b37Q@V2EOn((rQr!;bmGhtHpE=*Si z-=x#e`L>5Al#NYgUr!AH$XrP}?rQk%ro39LF9q%X6}NYxrrj zogG_Oag&s}s@0$n${Dc%I@iuxE>#*VX=5c)>hHGz+J7bh(x#6N<$0m#ObbZyK26>m zIjXVCIs>1AVU=Y-=N}KVexx(9qNrQjeSlW`m zK+B-!tg#wr%s-{^{DiR4C{g|$0t_;uZ{KW7I?w~C_mi}jUI1{J1HUQr>%OSA2O)<- z>!IZRWyl7qA2`N;q82vvT5N002;I2L@*MV|-?D(%bKA50@y7&kT4U%@>OK!v&)FJ7 z&u({Xzhvxw3Czu1P}?WjQD54%5ZrDecv*~H9ZsRxw$6e87|)4)v${?<`53I#&A?Mb zC|2v|Zx`@e3x=|Ux5*(~Fd9qjAS8(76d92H_OieJ*#E}mNDjA)kcrKgyf2T&zpv(Z zh(&f8nPoh+4_wTa%fM1DX0(Z5=9H8k7C<*^TRy{$NqT;lW2a8#s2<4DTBpS$0s#iGzWw#{RjU*q*ic4~hgJpCkj0s8p|02ladk5f&wPt??o!7AI zP)L-9`uscv^}&9N%}xROguaI+W~!Vh7At!P!)<{K9sIvkZG*zT~w2Gn!iD7JOU zVid+>n+0r=P{;xnL42vf0#*hW88fz9D=AVgfs~Y+(F3XNnXN`Zv$q;b=G_`I7>-#c z1{f6A6uk9=5Ig`ZdWQk(27J9Pq!w4gjAga?qcyxgK7V3V$}}>{UBFFhwHnAUjS@dz z#{ZhvU>UwZN<;j}e!{Qd*lED9VbQ)B9=AqiU|WCw5>t>8!e!@lq6pYW2vvdwI_Gbg z{XCiqIk5vLZ35FO^Zd;}EG?N`#N`yObxBYvY4TsXQ$@9RaBY}4sb!{d3n=6Cjs$W! z!jj+{PWemUSVL)es&Z4MZ%mPT%a_=|v(e2~L-5tzlmC%kabXqy_bmTlkMcd`;61B+K%`qb z?=7(yI+u7%8mWx;g;#S^QY`1GZQW{B)kTg8OmE)wt{H}d6 zz}h|7$V&Rle3S+2v>ov?C3|=_kY>}!A?O|CUG5f}&Qn(0xAHtr-cgS7%i*3)E+VE{ zq46r~$K!FxWrQ;)527Ksbv5FQ<6VnicPNfg>Z=zGSwP<@N#T?w}}vzvE+Ri;5GxC znBem`+beb=un*_*2wqL?z(V62I{0P)Pz(P_Gi`;&5<1Fbom%X|F6MQ1P45s}F^mRK zL35lx?z9^RXW0$;K3EzC!+p*)qmR@BxPzSq#&nkN8OkHJ77p{P5GUv$POPo1*<9Z^h`(?L#Q3KytXOrW?SoKH?9lip>Y^sRVvnpfjb!%gm^SID zNhS_rixPGTuWhB+o~^UEM+z<9%0djkT~P;Wy^C;Mo0i?-Xj`xT@X?68t06{hn+ylD zC64&g&XHJY%)8yztg;S`RDBMms40i?W!Kk1jB+xg#@9azEoFYRQV4qx1H7NLbirvC z0a)7z)$Y}DI@nzi)?ANa8~x$lu2;jRp{IFN!~OLc=1mk;U!M_@xOzJH#Amk*6B{>%8 zp?sSJ^p{1aZ~-NAsfdir+s$(3MxPz_KYZK=3jEWFT#G@H-6T1m>a z;_A!Ob%D~ZXi z+?^m7nhByJ)W;C^64zPd@GDtzVu*Hn7#Y3n>I|VG*$lYa~UZK76?m2u25_ROWtx9lo*G)NlazP6FII)Dl{5hbjkWljN^5$19B)K zrg$G|BeIM_j~1QAH=C9f`-KdTr}3oid!7VLri7$3izzq26muFI_DA=2rWtHU|M1_& z>K0+pWw90--wsM5pki@EfU`OJ1l`RulOa%+bCbO}Ln%j}zIiK7*D^7Sp-^n1Twbxz zwTTM#GDC1LVC$STb`Ao{G{`A#@MgOno-}qsbmO2wVOi(p*hDxenm1)aR3-^%%B!x1 z(Cat`Z|Dx8Ko|%dC17js4+!16;ov1qEb7lwYi23e#}T}rj2zOV`hktWE>uc zx^ypN6!-V;bB><4_HmzQo@aQTKkr)ade^(&_5HEe-e*YDwJ(6(xs*uEL)S?sklsZH zKYE?_Cmb5?H`{6q|9Biu#ns+O2~ew|EOP&lHd#x{6+#klM<&f`?xmy#NRbmKoKF&m zCmrFk$SrNXW6WlqWHxaHu}PNHVZ;kIS81x!WS^nA=22yGyEK9IyjRAJD#i`PHPc#( zNOl`%@x1Vs_sg2^p!oi;f)Pz=V=LQaY&Ht3TB;`KHr|UpE>%`PGJ)^pF-Fj4WUQ2W zmNp}OP1bMnV>`0da>h!UGhZ)Sb9wW5UVroTw_Z6?mqmko(S5 zZ{%~BiQV4jZU%R*n>nW#Tu?eHeNg(J^gX900vSlHPi&KERW2FGhpS{FINksJ6Ikfr zFCS{Fb>3vIYPm@gqp;;%ujRkHN#oOwWL}^y!JtLDodcc^a3nk-Jgu7Ex=RUUx!U)K9R8 z-Xra=oaxWWHP3xy%98n=!^G`{POlNn8`XI znUSu5cyh!#f?1*#8ChMkvW{< z#-TFmsDg9e@f71vi6GYh!^M|LP$t$NmYtClozrfzTgoORo<~WL*_hC(VFFp08F>XUl;3cq~(%Wg`9+X7&i(T znIC$%i81Q;Egva(`SjCK}HW%XzGrqfL2EB~9Z)G^$j8l7$l&IJt}*lHPIB>l#xXJ%c97? z7<%j*i=i1JK(XG&pd^n`-D970X4u=Dudfei;gP(1`dsRn1A1BcBtT{5BX!^A^a_L3h!XysShcWs^zKNP`L^(u)+$=)wNRB>oI(P&YE# zF|4QkG|_1R4pA{k~tDbCh4#)KXZ&Jp%kB-J&v zh=3R(zZtlOC->lGrLu+G2UjYiyzS&cnv^up;6i8+O-asAr5U-Rr4^mmw$1rLl&Y5F zoE}LNEps}le{jEwJnNtP`;W}s!7Pj3yU21nkG!S-h+l{Fp=nnqdQWwt?(zOk)CE1& ziTd`TztV?jy3&WF|A>LX%Ba~(A7W;>DDcZIZ0uPyR<*n%1~UScF&&@kQ+2sbhb~EM z^Tg0fhERiInar<$`q}9#5)I|q00I-OjldviQrHqW4WN>P*eub~%r^}4737r&f_5xkFnTrO?M!0sFbFkGc` z2=Ee{zQr8=NYg*s-5b9fIj=Os1Ka@E!@zl*x{}K^GG>}z_8wdt*`i8Ch2cqHS}fcj;h1P4B8c~LU>(aNIJRyP@$FE)p#Wi>@) z{*Dda)Rw57iZw>n)&soa_B&qLlaKCfGdO+wNK&h4`;ct`3#FD}SXv2Rep+3|xK#!R zq~&40E8vyDn~#F`;RSED7r_tSY-h)Kith>GrxHJxcv6QWC(>t0 zI1E|#DJ{|pQwUE%zM4MgN|N8QKrs07wj6ZS@Uns&l*n&@%g;i~%L?_-(Hx>=gYL~+ z!#hrfnHjH{Yx;Fuur=XxUzpB#ZR^4Rc}_=9<3nmyoS4+S>@qSou32<)Qn)c6@5VLz zPM!#l#aTan>pNe*qzBedr+*;&s zJcnfEeAk<=shgCy^8sb#{oB6`-ZLgX;tU3rFFLc4waESuoH>(TztW;d{B%$0X}|D- z{Lsip0y3ezpu6V`rRfVXys>XwZy=|^gz7~gkZ{m|CHPl?Dj*3}2WTzSSgwp%Fd9gh zL1KGAWk{ky1Ipk@Yra=5NXZP%i)dDtsnYr%Af$D%GFFuE{^f&;-yO6ky3~`Vw`Zy1 zhtn0m^6sbNt_2<6fjE>1ME2W|PWYM7N8bCb3i=3sLoVxk5|_AVN?dr~)SJ?m@x%OC zCARx4wcJduUPf_&CeZV+G7_lW6i^5%fv?ow5~c1{(OCo@SxHqsu8j7T_Q+^;uO1{n z^u7@!&|e$r)d#>45I5gtzaFC=bL-ldtrLUQC~MXrHAvUawU!N1GlhOSNbL%%o$E5j zSuYG$!>mIIDo*&v6Vwc$69=o?g+4b}O%aNci9)YVLRsz*zp|x6LYSWgn9+&;n2zLA ziGIn=i6N3hll)919G#AVZv>bJ1I&R#)$QTNCSG~kWG@)1hA2sWb+TIN9sLXqxbnME zgiK$2Uz{HpKHgFM1BH1Z&TnYaZ|o0-sR?I$$5hi5VTNMG8F-=L|3vrs#+ePU*N;_G z)DVNUdHY`8)1%;HK>|nuDfPVjH{FiDTulgzU$R*lrJx8@fvkXk$!2S2idqn!L4@p0 z_R$peoYu7-YtdC|NPNc|%81&cjCyDqbVI=3@rJ$SDs{Wko=vveh8Vhp)fZPqm& z>)^F&>40t;_o4e-MjaDfW)0otWtWw6o%+zMn(wm4U$1V|!*lFq*Q;>lCde3*<1%2Z zPFJt${zqytbB8iEf&(CJhc)GAYCCDz?hJLe4qt(-MVst-lT^IeYOkEEZg=a-O?LC` zYM`mBH(4jAtIN#lGM9bn3^mn}S)Q%>D{sk%oP~(rx70?0@T1t}xevu3E)8Hk6SkQIUAGaR54U~a=5R^Sdy#WOo1U57xqlgfwJ0GMfy`T%J*JY)y0tFrj>puE;;>(QjP$}K z4Ns2s=am7SA~Nc6b(iQ``MBCXsQ7i$XuzlpXd~313_c?79jM4DQ&UxRIU$}cJlup< zd#qhgFkUg}%zRQ^X)@T@&pxRhPy?#5Y1}%-6_8)yGE&yLtRJsZuk@3E0K@)xm3mL< zqPy)^S2O#0%ll~~HcA^u0#w}pEF5uvudZRn_X!yC>OzuK%fW_*j%Y5 z>473$MxapUtZ z&YHAdt<#cmSM+s^2#{$UZiTE1;6!|s${fwt{wiS8mV;lTxx?J)NN0lV z9rlU0)dW|J2ahl%p(!^{xxw<(so{E?$GW>tT}bP+m)EJQ`$ZRf*d6AuYXrqP_6Pgb ztKs1?`;{>jexPm*^Ddd9jfBkaMk_LX@qKZAVEA}P@edR>Is?WQW!ftn)XC`hzH5*| zN;ifzNJ_o^+%ffm_KwKaMkLt_Mf(|eq2d2T_xZ+|4Y0%irrzmi?qT%U``_wM;g0L& zuhdjC8lG{0Y&3wTowi%)rMhoDt}}JBd1@6?u-IM}p;x=SoeycF@L@kf-NFm?A6b6d zFMQu4r{i?v{yqfL=tI3u;;AT?fD9DHf}lT0LnCzt5*A){>1pG|za$VA%HP;WCRA79 z!v%f?!GtEGATD5l@B~Fbc$EPoR|IIrquLPV8}V-l@Jf&?z#W=s&^>Oswe)N~adrZ6 zz6*JT3%*U}+rpO+M=3u`Muhk)p3~eI^2-)Ldw%10w+j6s z2+~|D9|JlF7vAt^{j#Y6IvhhvQC^5YDqvJ42^ZlW9b!Ne@gv=*?+^la6@E2LNnR>E#+_&h1LXQUMtG7CSd(mxrpz7a*#u}{XfVP5mkF`Ea zukRoEo;ErTFiU~F{nW#L`}U~}7w&18nGdpe+kd`8Pc#QkJFE>s>W5?+Yy>qQS`+Tn z@%>K=`}c3{d+phG>e>Bu!EXEDTzy$_A$Cq6j#uwUtSwTaLE`$GLY z(i2{kAax9%An7VPYNsvOYXO7|g&@E9JP> z)ae%@^pbh@mG%1GuznjzrH4tSWP{6k?LGaJdkG9-M!suLJg6@-FPV%dA7p?kFb#M> zImiQ*ARDBE*mv!h4(lndVW@K$qHPrjMi|F7Kop_GKK~;-O@m(r#H4!s6`+!XT`{BeUF+b-dW*NNca)lO#y#LfOh*S+tNM>h~ISvUQjM75El0xG9o)XBzz3+)PO%DKntM87<=iT z^fP*fl%kZXRE(5RJ&Q)Ej|w1lA|+f3q{O8Lq%t#sl&+L=8CU_bDEToU9TbC-efEMT zz1{Rm>&!x+3g!l=M3zV;KoS$JC z#~s6`T5B`e$&FcSz1FICBnOQ+5-`FCl|;lCNvL?Ay|PU&SC<3@n*xGCYeh&R1TAu` z*=JpSOz)Cs0hZaWpU_qFtkvy$qR^x5`lX0!BFXmX(ZA}al(#jP?cz)f2a|yZECKbP z5p)9AJ+xsk8l-_NkPnJM8K?r=Ks{&#oxqhx955QBfh>>@mVi~D6?EsB*BDW=IHCgM zKnBPLg`gBv0w0K+%~2NEgS!EA00X}<+y3ZpdW*~4$Pn;&r+%vc0UC;H3}tMrX^ZaU zX8m;glFt~c!}mxlnrBb?T)WNiC5K7pkJgMY^pzUs>MwM%D?$pnkv+lN|Dark`SAHD zDT6yrQ9NKW#$L}8EFR&q(;N4dj&)*P`js9VB31%F#JlaA-u7UuUSc`XFaKKK<&4UqCBQ^rz4*0$ zkW)4*xmUlW+gq%Cy*gRnalLh-SD$#Z-5lrk78Wfqa`W3q~k0J)-1})9a6{o*c z=H(VH%%5N6Sk#y2&)hfVLP}&|FfP2DS#t}E9_XW!R2G~+YwoPMGiNQxIVGK&lRtl9 zkyVgv7TR(B%%wO>5<)<^by_iRO>azA^LuaY=L2r`*N^d&9~} zGB2|?C7Qdn-IZ*XMc9oa&7CeQY>YYTtW%QK&N1fH(_Z`1vF2b`(_APyveBrqI|0HeVeFb<@ERFDSJ zU$>V|Fh{C*IiDy7rC=4P1l7RDnZ#A*QSY}aU?f1U3ABSw&;ugb{l|d+ub~OV84kvP z6d)N(dxKl~8F(_mG>``hKrtuk2Epa&$pMFfxvvOpeK0?I%Is0EF{u#p9+ zAR8@$}QyE#u83yCKh< z>^eVzOAW4fu0!o&815)b~dCnBSlUmoyV4Of`wIvL?D zUldb=G=(6tKX$}dOR&(eJYuQdS+1-k} z^$X21&)O_u*?*+pO}9QEEZjq@@l3Z)iaQ^7{&XvO7w$sbh10D`;x58nG~HStZl_gF zx1Pb>Pg>-md35{IaD8-XC2=~w_CN=>c87hCqU!IGQ_PEg9Cq3-SYRp`J^E+ diff --git a/bin/mdns/mdns-advertiser b/bin/mdns/mdns-advertiser index 0faec68cf29daabe45d35c81dee77a0623871906..4ddce35431531ed759b0dedcde0ef3c4f4459b8d 100755 GIT binary patch delta 63478 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 Ca@0ux delta 62268 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ξysLht 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 a{&kOTo36I*2T|32-R;QQs~+C3kNtm_Juz|s diff --git a/bin/nbns-netbsd4le/nbns-advertiser b/bin/nbns-netbsd4le/nbns-advertiser index 07cd215a9e2f0028f048d004fdcae206f210affd..d2773bde943c62f843c951bc82c234f7c69bbe45 100755 GIT binary patch delta 33 rcmV++0N($sy9lhi2(Y0D3lN~=A0VLP0brovgRBULtOx<8tOx=X_PPyU delta 33 rcmV++0N($sy9lhi2(Y0D3t*t*1`wd(A0VLPgRBULtOx<8tOx=X_}&d< diff --git a/build/auto-ip-common.inc b/build/auto-ip-common.inc index e3662b3..ddf8767 100644 --- a/build/auto-ip-common.inc +++ b/build/auto-ip-common.inc @@ -48,6 +48,8 @@ struct link_context { char name[IFNAMSIZ]; int flags; unsigned int ifindex; + int mdns_ipv4_transport; + uint32_t mdns_ipv4_transport_addr; int mdns_ipv6_transport; struct link_ipv4_addr ipv4[MAX_LINK_IPV4_ADDRS]; size_t ipv4_count; @@ -792,6 +794,7 @@ static int TC_AUTO_IP_UNUSED append_link_ipv4(struct link_context_set *out, pos = ctx->ipv4_count++; ctx->ipv4[pos].addr = ipv4_addr; ctx->ipv4[pos].netmask = netmask; + ctx->mdns_ipv4_transport = 1; if (ctx->ipv4_count == 1) { ctx->flags = flags; } @@ -880,6 +883,19 @@ static int TC_AUTO_IP_UNUSED link_context_has_advertisable_address(const struct link_context_has_advertisable_ipv6(ctx); } +static int TC_AUTO_IP_UNUSED link_context_has_mdns_ipv4_transport(const struct link_context *ctx) { + return ctx->mdns_ipv4_transport && ctx->ipv4_count > 0; +} + +static void TC_AUTO_IP_UNUSED disable_link_contexts_mdns_ipv4_transport(struct link_context_set *set) { + size_t i; + + for (i = 0; i < set->count; i++) { + set->links[i].mdns_ipv4_transport = 0; + set->links[i].mdns_ipv4_transport_addr = 0; + } +} + static int TC_AUTO_IP_UNUSED link_context_has_mdns_ipv6_transport(const struct link_context *ctx) { return ctx->mdns_ipv6_transport && ctx->ifindex != 0 && ctx->ipv6_count > 0; } @@ -921,6 +937,7 @@ static int TC_AUTO_IP_UNUSED link_context_identity_equal(const struct link_conte if (strcmp(a->name, b->name) != 0 || a->flags != b->flags || a->ifindex != b->ifindex || + a->mdns_ipv4_transport != b->mdns_ipv4_transport || a->mdns_ipv6_transport != b->mdns_ipv6_transport || a->ipv4_count != b->ipv4_count || a->ipv6_count != b->ipv6_count) { @@ -1209,13 +1226,16 @@ static void TC_AUTO_IP_UNUSED log_link_contexts(const char *prefix, const struct fprintf(stderr, "%s: links=%lu\n", prefix, (unsigned long)set->count); for (i = 0; i < set->count; i++) { size_t j; + char transport_ip_buf[INET_ADDRSTRLEN]; const struct link_context *ctx = &set->links[i]; - fprintf(stderr, "%s: link[%lu] iface=%s flags=0x%x ifindex=%u mdns_ipv6=%d score=%d ipv4=%lu ipv6=%lu\n", + fprintf(stderr, "%s: link[%lu] iface=%s flags=0x%x ifindex=%u mdns_ipv4=%d mdns_ipv4_addr=%s mdns_ipv6=%d score=%d ipv4=%lu ipv6=%lu\n", prefix, (unsigned long)i, ctx->name, (unsigned int)ctx->flags, ctx->ifindex, + ctx->mdns_ipv4_transport, + ctx->mdns_ipv4_transport_addr != 0 ? ipv4_to_string(ctx->mdns_ipv4_transport_addr, transport_ip_buf, sizeof(transport_ip_buf)) : "(auto)", ctx->mdns_ipv6_transport, link_context_priority_score(ctx), (unsigned long)ctx->ipv4_count, diff --git a/build/mdns-advertiser.c b/build/mdns-advertiser.c index 6b97f8f..3d28497 100644 --- a/build/mdns-advertiser.c +++ b/build/mdns-advertiser.c @@ -79,8 +79,14 @@ #define DNS_CLASS_IN_UNIQUE (DNS_CLASS_IN | DNS_CLASS_CACHE_FLUSH) #define MDNS_REPLY_UNICAST 1 #define MDNS_REPLY_MULTICAST 2 +#define MDNS_REPLY_LEGACY_UNICAST 4 #define DNS_FLAG_QR 0x8000 +#define DNS_FLAG_TC 0x0200 #define DNS_FLAG_AA 0x0400 +#define LEGACY_UNICAST_TTL_MAX 10 +#define TC_KNOWN_ANSWER_DEFER_MS 450 +#define PLANNED_RR_MAX 192 +#define PLANNED_RDATA_MAX 1024 #if !defined(IPV6_JOIN_GROUP) && defined(IPV6_ADD_MEMBERSHIP) #define IPV6_JOIN_GROUP IPV6_ADD_MEMBERSHIP @@ -301,28 +307,38 @@ struct mdns_membership_delta { size_t ipv6_count; }; -struct query_answer_routes { - int smb_ptr; - int smb_srv; - int smb_txt; - int host_a; - int host_aaaa; - int adisk_ptr; - int adisk_srv; - int adisk_txt; - int device_info_ptr; - int device_info_srv; - int device_info_txt; - int airport_ptr; - int airport_srv; - int airport_txt; - int snapshot_ptr[SNAPSHOT_MAX_RECORDS]; - int snapshot_srv[SNAPSHOT_MAX_RECORDS]; - int snapshot_txt[SNAPSHOT_MAX_RECORDS]; - int snapshot_a[SNAPSHOT_MAX_RECORDS]; - int snapshot_aaaa[SNAPSHOT_MAX_RECORDS]; + +struct planned_rr { + char owner[MAX_NAME]; + uint16_t type; + uint16_t rrclass; + uint32_t ttl; + uint8_t rdata[PLANNED_RDATA_MAX]; + uint16_t rdlength; + int routes; +}; + +struct planned_rr_set { + struct planned_rr records[PLANNED_RR_MAX]; + size_t count; + int truncated; +}; + +struct deferred_response { + int active; + int sockfd; + long long due_ms; + uint16_t response_id; + int use_snapshot_records; + struct sockaddr_storage multicast_dest; + socklen_t multicast_dest_len; + struct sockaddr_storage source; + socklen_t source_len; + struct planned_rr_set planned; }; +static struct deferred_response g_deferred_response; + static int name_equals(const char *a, const char *b); static int build_instance_fqdn(char *out, size_t out_len, const char *instance_name, const char *service_type); static int open_mdns_socket(int shared_bind, int log_bind_errors, uint32_t ipv4_addr, const char *socket_role); @@ -367,6 +383,13 @@ static const char *ipv4_to_string(uint32_t ipv4_addr, char *out, size_t out_len) #include "auto-ip-common.inc" +static uint32_t link_preferred_ipv4_source(const struct link_context *link); +static int link_set_has_ipv4_membership(const struct link_context_set *set, uint32_t ipv4_addr); +static int source_matches_link_ipv4_subnet(uint32_t source_ipv4_addr, const struct link_context *link); +static int flush_deferred_response_if_due(long long now_ms); +static long long deferred_response_adjust_wait_ms(long long now_ms, long long wait_ms); +static void clear_deferred_response_for_sockfd(int sockfd); + typedef int (*mdns_collect_iface_contexts_fn)(struct iface_context_set *out, void *userdata); typedef int (*mdns_collect_link_contexts_fn)(struct link_context_set *out, void *userdata); typedef void (*mdns_sleep_fn)(unsigned int seconds, void *userdata); @@ -2479,8 +2502,10 @@ static void send_capture_query_to_all_links(const struct mdns_socket_pair *socke size_t i; for (i = 0; i < links->count; i++) { - if (sockets->ipv4_fd >= 0 && links->links[i].ipv4_count > 0 && - set_outbound_multicast_interface(sockets->ipv4_fd, links->links[i].ipv4[0].addr, "capture", 0, 0) == 0) { + uint32_t ipv4_source = link_preferred_ipv4_source(&links->links[i]); + if (sockets->ipv4_fd >= 0 && link_context_has_mdns_ipv4_transport(&links->links[i]) && + ipv4_source != 0 && + set_outbound_multicast_interface(sockets->ipv4_fd, ipv4_source, "capture", 0, 0) == 0) { (void)send_query_question_any(sockets->ipv4_fd, (const struct sockaddr *)dest4, sizeof(*dest4), @@ -3135,11 +3160,93 @@ static int MDNS_UNUSED acquire_mdns_auto_socket(int shared_bind, const struct if return -1; } +static int link_has_any_mdns_transport(const struct link_context *link) { + return link_context_has_mdns_ipv4_transport(link) || + link_context_has_mdns_ipv6_transport(link); +} + +static void compact_link_contexts_for_mdns_transport(struct link_context_set *set) { + size_t i; + size_t write_i = 0; + + for (i = 0; i < set->count; i++) { + if (!link_has_any_mdns_transport(&set->links[i])) { + continue; + } + if (write_i != i) { + set->links[write_i] = set->links[i]; + } + write_i++; + } + set->count = write_i; +} + +static int link_ipv4_source_score(uint32_t ipv4_addr) { + if (ipv4_is_rfc1918(ipv4_addr)) { + return 0; + } + if (!ipv4_is_link_local(ipv4_addr)) { + return 100; + } + return 200; +} + +static uint32_t link_preferred_ipv4_source(const struct link_context *link) { + size_t i; + uint32_t best = 0; + int best_score = 0; + + if (link == NULL || link->ipv4_count == 0) { + return 0; + } + if (link->mdns_ipv4_transport_addr != 0) { + return link->mdns_ipv4_transport_addr; + } + for (i = 0; i < link->ipv4_count; i++) { + int score = link_ipv4_source_score(link->ipv4[i].addr); + if (best == 0 || score < best_score) { + best = link->ipv4[i].addr; + best_score = score; + } + } + return best; +} + +static uint32_t link_ipv4_source_for_peer(const struct link_context *link, uint32_t source_ipv4_addr) { + size_t i; + uint32_t best = 0; + int best_score = 0; + + if (link == NULL || source_ipv4_addr == 0) { + return link_preferred_ipv4_source(link); + } + for (i = 0; i < link->ipv4_count; i++) { + uint32_t netmask = link->ipv4[i].netmask; + int matches; + int score; + + if (netmask == 0) { + matches = source_ipv4_addr == link->ipv4[i].addr; + } else { + matches = (source_ipv4_addr & netmask) == (link->ipv4[i].addr & netmask); + } + if (!matches) { + continue; + } + score = link_ipv4_source_score(link->ipv4[i].addr); + if (best == 0 || score < best_score) { + best = link->ipv4[i].addr; + best_score = score; + } + } + return best != 0 ? best : link_preferred_ipv4_source(link); +} + static int link_contexts_need_ipv4_socket(const struct link_context_set *set) { size_t i; for (i = 0; i < set->count; i++) { - if (link_context_has_advertisable_ipv4(&set->links[i])) { + if (link_context_has_mdns_ipv4_transport(&set->links[i])) { return 1; } } @@ -3159,10 +3266,12 @@ static int link_contexts_need_ipv6_socket(const struct link_context_set *set) { static void close_mdns_socket_pair(struct mdns_socket_pair *sockets) { if (sockets->ipv4_fd >= 0) { + clear_deferred_response_for_sockfd(sockets->ipv4_fd); close(sockets->ipv4_fd); sockets->ipv4_fd = -1; } if (sockets->ipv6_fd >= 0) { + clear_deferred_response_for_sockfd(sockets->ipv6_fd); close(sockets->ipv6_fd); sockets->ipv6_fd = -1; } @@ -3348,46 +3457,107 @@ static int set_outbound_multicast_interface6(int sockfd, unsigned int ifindex, c return 0; } -static int configure_mdns_socket6_for_links(int sockfd, const struct link_context_set *set, const char *socket_role) { +static int join_mdns_multicast_group_for_link4(int sockfd, + struct link_context *link, + const struct link_context_set *old_links, + const char *socket_role, + struct mdns_membership_delta *delta) { + size_t i; + unsigned int tried_mask = 0; + + if (!link_context_has_mdns_ipv4_transport(link)) { + return 0; + } + + for (;;) { + size_t best_i = 0; + int best_score = 0; + int found = 0; + + for (i = 0; i < link->ipv4_count; i++) { + int score; + if ((tried_mask & (1U << i)) != 0) { + continue; + } + score = link_ipv4_source_score(link->ipv4[i].addr); + if (!found || score < best_score) { + best_i = i; + best_score = score; + found = 1; + } + } + + if (!found) { + break; + } + tried_mask |= 1U << best_i; + + if (link_set_has_ipv4_membership(old_links, link->ipv4[best_i].addr)) { + link->mdns_ipv4_transport_addr = link->ipv4[best_i].addr; + return 1; + } + if (join_mdns_multicast_group(sockfd, link->ipv4[best_i].addr, socket_role) != 0) { + continue; + } + if (record_mdns_membership_ipv4(delta, link->ipv4[best_i].addr) != 0) { + drop_mdns_multicast_group_best_effort(sockfd, link->ipv4[best_i].addr, socket_role); + errno = ENOMEM; + return -1; + } + link->mdns_ipv4_transport_addr = link->ipv4[best_i].addr; + return 1; + } + + fprintf(stderr, "warning: mdns %s socket: disabling IPv4 transport on iface=%s; no IPv4 multicast membership succeeded\n", + socket_role, link->name); + link->mdns_ipv4_transport = 0; + link->mdns_ipv4_transport_addr = 0; + return 0; +} + +static int configure_mdns_socket6_for_links(int sockfd, struct link_context_set *set, const char *socket_role) { size_t i; - int joined = 0; + unsigned int first_ifindex = 0; for (i = 0; i < set->count; i++) { if (!link_context_has_mdns_ipv6_transport(&set->links[i])) { continue; } if (join_mdns_multicast_group6(sockfd, set->links[i].ifindex, set->links[i].name, socket_role) != 0) { - return -1; + set->links[i].mdns_ipv6_transport = 0; + continue; + } + if (first_ifindex == 0) { + first_ifindex = set->links[i].ifindex; } - joined = 1; } - if (!joined) { + compact_link_contexts_for_mdns_transport(set); + if (first_ifindex == 0) { errno = EADDRNOTAVAIL; return -1; } - for (i = 0; i < set->count; i++) { - if (link_context_has_mdns_ipv6_transport(&set->links[i])) { - return set_outbound_multicast_interface6(sockfd, set->links[i].ifindex, socket_role, 1, 1); - } - } - return -1; + return set_outbound_multicast_interface6(sockfd, first_ifindex, socket_role, 1, 1); } -static int configure_mdns_socket4_for_links(int sockfd, const struct link_context_set *set, const char *socket_role) { +static int configure_mdns_socket4_for_links(int sockfd, struct link_context_set *set, const char *socket_role) { size_t i; uint32_t first_ipv4 = 0; for (i = 0; i < set->count; i++) { - if (set->links[i].ipv4_count == 0) { + int status; + + if (!link_context_has_mdns_ipv4_transport(&set->links[i])) { continue; } - if (join_mdns_multicast_group(sockfd, set->links[i].ipv4[0].addr, socket_role) != 0) { + status = join_mdns_multicast_group_for_link4(sockfd, &set->links[i], NULL, socket_role, NULL); + if (status < 0) { return -1; } - if (first_ipv4 == 0) { - first_ipv4 = set->links[i].ipv4[0].addr; + if (status > 0 && first_ipv4 == 0) { + first_ipv4 = link_preferred_ipv4_source(&set->links[i]); } } + compact_link_contexts_for_mdns_transport(set); if (first_ipv4 == 0) { errno = EADDRNOTAVAIL; return -1; @@ -3402,7 +3572,8 @@ static int link_set_has_ipv4_membership(const struct link_context_set *set, uint return 0; } for (i = 0; i < set->count; i++) { - if (set->links[i].ipv4_count > 0 && set->links[i].ipv4[0].addr == ipv4_addr) { + if (link_context_has_mdns_ipv4_transport(&set->links[i]) && + link_preferred_ipv4_source(&set->links[i]) == ipv4_addr) { return 1; } } @@ -3426,31 +3597,27 @@ static int link_set_has_ipv6_membership(const struct link_context_set *set, unsi static int prepare_mdns_socket4_memberships(int sockfd, const struct link_context_set *old_links, - const struct link_context_set *new_links, + struct link_context_set *new_links, const char *socket_role, struct mdns_membership_delta *delta) { size_t i; uint32_t first_ipv4 = 0; for (i = 0; i < new_links->count; i++) { - if (new_links->links[i].ipv4_count == 0) { - continue; - } - if (first_ipv4 == 0) { - first_ipv4 = new_links->links[i].ipv4[0].addr; - } - if (link_set_has_ipv4_membership(old_links, new_links->links[i].ipv4[0].addr)) { + int status; + + if (!link_context_has_mdns_ipv4_transport(&new_links->links[i])) { continue; } - if (join_mdns_multicast_group(sockfd, new_links->links[i].ipv4[0].addr, socket_role) != 0) { + status = join_mdns_multicast_group_for_link4(sockfd, &new_links->links[i], old_links, socket_role, delta); + if (status < 0) { return -1; } - if (record_mdns_membership_ipv4(delta, new_links->links[i].ipv4[0].addr) != 0) { - drop_mdns_multicast_group_best_effort(sockfd, new_links->links[i].ipv4[0].addr, socket_role); - errno = ENOMEM; - return -1; + if (status > 0 && first_ipv4 == 0) { + first_ipv4 = link_preferred_ipv4_source(&new_links->links[i]); } } + compact_link_contexts_for_mdns_transport(new_links); if (first_ipv4 == 0) { errno = EADDRNOTAVAIL; return -1; @@ -3460,7 +3627,7 @@ static int prepare_mdns_socket4_memberships(int sockfd, static int prepare_mdns_socket6_memberships(int sockfd, const struct link_context_set *old_links, - const struct link_context_set *new_links, + struct link_context_set *new_links, const char *socket_role, struct mdns_membership_delta *delta) { size_t i; @@ -3470,14 +3637,15 @@ static int prepare_mdns_socket6_memberships(int sockfd, if (!link_context_has_mdns_ipv6_transport(&new_links->links[i])) { continue; } - if (first_ifindex == 0) { - first_ifindex = new_links->links[i].ifindex; - } if (link_set_has_ipv6_membership(old_links, new_links->links[i].ifindex)) { + if (first_ifindex == 0) { + first_ifindex = new_links->links[i].ifindex; + } continue; } if (join_mdns_multicast_group6(sockfd, new_links->links[i].ifindex, new_links->links[i].name, socket_role) != 0) { - return -1; + new_links->links[i].mdns_ipv6_transport = 0; + continue; } if (record_mdns_membership_ipv6(delta, new_links->links[i].ifindex, new_links->links[i].name) != 0) { drop_mdns_multicast_group6_best_effort(sockfd, @@ -3487,7 +3655,11 @@ static int prepare_mdns_socket6_memberships(int sockfd, errno = ENOMEM; return -1; } + if (first_ifindex == 0) { + first_ifindex = new_links->links[i].ifindex; + } } + compact_link_contexts_for_mdns_transport(new_links); if (first_ifindex == 0) { errno = EADDRNOTAVAIL; return -1; @@ -3501,6 +3673,7 @@ static int open_dualstack_mdns_sockets(int shared_bind, struct mdns_socket_pair *out) { int need_ipv4 = link_contexts_need_ipv4_socket(links); int need_ipv6 = link_contexts_need_ipv6_socket(links); + int ipv4_errno = 0; int ipv6_errno = 0; out->ipv4_fd = -1; @@ -3513,8 +3686,23 @@ static int open_dualstack_mdns_sockets(int shared_bind, out->ipv4_fd = open_bound_mdns_socket(shared_bind, log_bind_errors); if (out->ipv4_fd < 0 || configure_mdns_socket4_for_links(out->ipv4_fd, links, "runtime") != 0) { - close_mdns_socket_pair(out); - return -1; + ipv4_errno = errno; + if (out->ipv4_fd >= 0) { + clear_deferred_response_for_sockfd(out->ipv4_fd); + close(out->ipv4_fd); + out->ipv4_fd = -1; + } + disable_link_contexts_mdns_ipv4_transport(links); + compact_link_contexts_for_mdns_transport(links); + need_ipv4 = 0; + if (!need_ipv6) { + errno = ipv4_errno; + close_mdns_socket_pair(out); + return -1; + } + fprintf(stderr, + "warning: mdns runtime socket: IPv4 setup failed (%s); continuing with remaining mDNS transports\n", + strerror(ipv4_errno)); } } if (need_ipv6) { @@ -3523,14 +3711,16 @@ static int open_dualstack_mdns_sockets(int shared_bind, configure_mdns_socket6_for_links(out->ipv6_fd, links, "runtime") != 0) { ipv6_errno = errno; if (out->ipv6_fd >= 0) { + clear_deferred_response_for_sockfd(out->ipv6_fd); close(out->ipv6_fd); out->ipv6_fd = -1; } if (need_ipv4 && out->ipv4_fd >= 0) { fprintf(stderr, - "warning: mdns runtime socket: IPv6 setup failed (%s); continuing with IPv4 mDNS\n", + "warning: mdns runtime socket: IPv6 setup failed (%s); continuing with remaining mDNS transports\n", strerror(ipv6_errno)); disable_link_contexts_mdns_ipv6_transport(links); + compact_link_contexts_for_mdns_transport(links); return 0; } close_mdns_socket_pair(out); @@ -3538,6 +3728,12 @@ static int open_dualstack_mdns_sockets(int shared_bind, return -1; } } + compact_link_contexts_for_mdns_transport(links); + if (links->count == 0) { + close_mdns_socket_pair(out); + errno = EADDRNOTAVAIL; + return -1; + } return 0; } @@ -4021,298 +4217,428 @@ static int send_announcement(int sockfd, const struct sockaddr_in *dest, const s use_snapshot_records); } -static int query_routes_have_destination(const struct query_answer_routes *routes, - const struct service_record_set *snapshot_records, - int use_snapshot_records, - int route) { - size_t j; +static int known_answer_ttl_is_fresh(uint32_t known_ttl, uint32_t advertised_ttl) { + return known_ttl > advertised_ttl / 2; +} - if ((routes->smb_ptr | routes->smb_srv | routes->smb_txt | routes->host_a | routes->host_aaaa | - routes->adisk_ptr | routes->adisk_srv | routes->adisk_txt | - routes->device_info_ptr | routes->device_info_srv | routes->device_info_txt | - routes->airport_ptr | routes->airport_srv | routes->airport_txt) & route) { - return 1; - } - if (!use_snapshot_records) { +static int planned_rr_rdata_equals(const struct planned_rr *rr, const uint8_t *rdata, uint16_t rdlength) { + return rr->rdlength == rdlength && memcmp(rr->rdata, rdata, rdlength) == 0; +} + +static int planned_rr_add_raw(struct planned_rr_set *set, + int routes, + const char *owner, + uint16_t type, + uint16_t rrclass, + uint32_t ttl, + const uint8_t *rdata, + uint16_t rdlength) { + size_t i; + + if (routes == 0 || owner == NULL || owner[0] == '\0') { return 0; } - for (j = 0; j < snapshot_records->count; j++) { - if ((routes->snapshot_ptr[j] | routes->snapshot_srv[j] | - routes->snapshot_txt[j] | routes->snapshot_a[j] | routes->snapshot_aaaa[j]) & route) { - return 1; + if (rdlength > PLANNED_RDATA_MAX) { + set->truncated = 1; + return -1; + } + for (i = 0; i < set->count; i++) { + if (set->records[i].type == type && + set->records[i].rrclass == rrclass && + name_equals(set->records[i].owner, owner) && + planned_rr_rdata_equals(&set->records[i], rdata, rdlength)) { + set->records[i].routes |= routes; + return 0; } } + if (set->count >= PLANNED_RR_MAX) { + set->truncated = 1; + return -1; + } + strncpy(set->records[set->count].owner, owner, sizeof(set->records[set->count].owner) - 1); + set->records[set->count].owner[sizeof(set->records[set->count].owner) - 1] = '\0'; + set->records[set->count].type = type; + set->records[set->count].rrclass = rrclass; + set->records[set->count].ttl = ttl; + memcpy(set->records[set->count].rdata, rdata, rdlength); + set->records[set->count].rdlength = rdlength; + set->records[set->count].routes = routes; + set->count++; return 0; } -static int known_answer_ttl_is_fresh(uint32_t known_ttl, uint32_t advertised_ttl) { - return known_ttl > advertised_ttl / 2; +static int planned_rr_add_name(struct planned_rr_set *set, + int routes, + const char *owner, + uint16_t type, + uint16_t rrclass, + uint32_t ttl, + const char *target) { + uint8_t rdata[PLANNED_RDATA_MAX]; + size_t off = 0; + + if (encode_name(rdata, &off, sizeof(rdata), target) != 0) { + return -1; + } + return planned_rr_add_raw(set, routes, owner, type, rrclass, ttl, rdata, (uint16_t)off); } -static int known_answer_rdata_matches_name(const uint8_t *packet, - size_t packet_len, - size_t rdata_cursor, - const char *expected_name) { - char name[MAX_NAME]; +static int planned_rr_add_srv(struct planned_rr_set *set, + int routes, + const char *owner, + const char *target, + uint16_t port, + uint32_t ttl) { + uint8_t rdata[PLANNED_RDATA_MAX]; + size_t off = 0; - if (decode_name(packet, packet_len, &rdata_cursor, name, sizeof(name)) != 0) { - return 0; + if (append_u16(rdata, &off, sizeof(rdata), 0) != 0 || + append_u16(rdata, &off, sizeof(rdata), 0) != 0 || + append_u16(rdata, &off, sizeof(rdata), port) != 0 || + encode_name(rdata, &off, sizeof(rdata), target) != 0) { + return -1; } - return name_equals(name, expected_name); + return planned_rr_add_raw(set, routes, owner, DNS_TYPE_SRV, DNS_CLASS_IN_UNIQUE, ttl, rdata, (uint16_t)off); } -static int known_answer_rdata_matches_srv(const uint8_t *packet, - size_t packet_len, - size_t rdata_cursor, - uint16_t rdlength, - const char *expected_target, - uint16_t expected_port) { - uint16_t port; - char target[MAX_NAME]; - size_t target_cursor; +static int planned_rr_add_txt_items(struct planned_rr_set *set, + int routes, + const char *owner, + const char **strings, + const uint8_t *lengths, + size_t string_count, + uint32_t ttl) { + uint8_t rdata[PLANNED_RDATA_MAX]; + size_t off = 0; + size_t i; - if (rdlength < 6 || rdata_cursor + rdlength > packet_len) { - return 0; - } - memcpy(&port, packet + rdata_cursor + 4, 2); - if (ntohs(port) != expected_port) { - return 0; + if (string_count == 0) { + uint8_t zero = 0; + return planned_rr_add_raw(set, routes, owner, DNS_TYPE_TXT, DNS_CLASS_IN_UNIQUE, ttl, &zero, 1); } - target_cursor = rdata_cursor + 6; - if (decode_name(packet, packet_len, &target_cursor, target, sizeof(target)) != 0) { - return 0; + for (i = 0; i < string_count; i++) { + size_t slen = lengths != NULL ? lengths[i] : strlen(strings[i]); + uint8_t len; + if (slen > 255) { + return -1; + } + len = (uint8_t)slen; + if (append_bytes(rdata, &off, sizeof(rdata), &len, 1) != 0 || + append_bytes(rdata, &off, sizeof(rdata), strings[i], slen) != 0) { + return -1; + } } - return name_equals(target, expected_target); + return planned_rr_add_raw(set, routes, owner, DNS_TYPE_TXT, DNS_CLASS_IN_UNIQUE, ttl, rdata, (uint16_t)off); } -struct known_answer_address_coverage { - uint32_t host_a; - uint32_t host_aaaa; - uint32_t snapshot_a[SNAPSHOT_MAX_RECORDS]; - uint32_t snapshot_aaaa[SNAPSHOT_MAX_RECORDS]; -}; +static int planned_rr_add_txt_empty(struct planned_rr_set *set, int routes, const char *owner, uint32_t ttl) { + return planned_rr_add_txt_items(set, routes, owner, NULL, NULL, 0, ttl); +} -static uint32_t link_ipv4_advertise_mask(const struct link_context *link) { - uint32_t mask = 0; - size_t i; +static int planned_rr_add_a(struct planned_rr_set *set, int routes, const char *owner, uint32_t ipv4_addr, uint32_t ttl) { + return planned_rr_add_raw(set, routes, owner, DNS_TYPE_A, DNS_CLASS_IN_UNIQUE, ttl, + (const uint8_t *)&ipv4_addr, 4); +} - if (link == NULL) { - return 0; - } - for (i = 0; i < link->ipv4_count && i < 32; i++) { - mask |= (uint32_t)1 << i; - } - return mask; +static int planned_rr_add_aaaa(struct planned_rr_set *set, + int routes, + const char *owner, + const struct in6_addr *ipv6_addr, + uint32_t ttl) { + return planned_rr_add_raw(set, routes, owner, DNS_TYPE_AAAA, DNS_CLASS_IN_UNIQUE, ttl, + ipv6_addr->s6_addr, 16); } -static uint32_t link_ipv6_advertise_mask(const struct link_context *link) { - uint32_t mask = 0; +static int planned_rr_add_link_addresses(struct planned_rr_set *set, + int routes, + const char *owner, + const struct link_context *link, + int include_a, + int include_aaaa, + uint32_t ttl) { size_t i; - if (link == NULL) { + if (owner == NULL || owner[0] == '\0' || link == NULL) { return 0; } - for (i = 0; i < link->ipv6_count && i < 32; i++) { - if (!link_ipv6_addr_is_samba_bindable(&link->ipv6[i])) { - continue; + if (include_a) { + for (i = 0; i < link->ipv4_count; i++) { + if (planned_rr_add_a(set, routes, owner, link->ipv4[i].addr, ttl) != 0) { + return -1; + } + } + } + if (include_aaaa) { + for (i = 0; i < link->ipv6_count; i++) { + if (!link_ipv6_addr_is_samba_bindable(&link->ipv6[i])) { + continue; + } + if (planned_rr_add_aaaa(set, routes, owner, &link->ipv6[i].addr, ttl) != 0) { + return -1; + } } - mask |= (uint32_t)1 << i; } - return mask; + return 0; } -static int known_answer_mask_covers_all(uint32_t known_mask, uint32_t advertised_mask) { - return advertised_mask != 0 && (known_mask & advertised_mask) == advertised_mask; +static int plan_smb_records(struct planned_rr_set *set, + int routes, + const struct config *cfg, + const char *instance_fqdn, + const struct link_context *link, + int include_ptr, + int include_srv, + int include_txt, + int include_a, + int include_aaaa) { + if (!smb_enabled(cfg)) { + return 0; + } + if (include_ptr && + planned_rr_add_name(set, routes, cfg->service_type, DNS_TYPE_PTR, DNS_CLASS_IN, cfg->ttl, instance_fqdn) != 0) { + return -1; + } + if (include_srv && planned_rr_add_srv(set, routes, instance_fqdn, cfg->host_fqdn, cfg->port, cfg->ttl) != 0) { + return -1; + } + if (include_txt && planned_rr_add_txt_empty(set, routes, instance_fqdn, cfg->ttl) != 0) { + return -1; + } + return planned_rr_add_link_addresses(set, routes, cfg->host_fqdn, link, include_a, include_aaaa, cfg->ttl); } -static uint32_t known_answer_rdata_link_ipv4_mask(const uint8_t *packet, - size_t packet_len, - size_t rdata_cursor, - uint16_t rdlength, - const struct link_context *link) { - uint32_t ipv4_addr; +static int plan_adisk_records(struct planned_rr_set *set, + int routes, + const struct config *cfg, + const char *instance_fqdn, + const struct link_context *link, + int include_ptr, + int include_srv, + int include_txt, + int include_a, + int include_aaaa) { + char txt1[128]; + char disk_txts[ADISK_MAX_DISKS][256]; + const char *txts[ADISK_MAX_DISKS + 1]; size_t i; - if (link == NULL || rdlength != 4 || rdata_cursor + 4 > packet_len) { + if (!adisk_enabled(cfg)) { return 0; } - memcpy(&ipv4_addr, packet + rdata_cursor, sizeof(ipv4_addr)); - for (i = 0; i < link->ipv4_count && i < 32; i++) { - if (link->ipv4[i].addr == ipv4_addr) { - return (uint32_t)1 << i; + if (include_ptr && + planned_rr_add_name(set, routes, cfg->adisk_service_type, DNS_TYPE_PTR, DNS_CLASS_IN, cfg->ttl, instance_fqdn) != 0) { + return -1; + } + if (include_srv && planned_rr_add_srv(set, routes, instance_fqdn, cfg->host_fqdn, cfg->adisk_port, cfg->ttl) != 0) { + return -1; + } + if (include_txt) { + if (build_adisk_system_txt(txt1, sizeof(txt1), cfg->adisk_sys_wama) != 0) { + return -1; + } + txts[0] = txt1; + for (i = 0; i < cfg->adisk_disks.count; i++) { + const struct adisk_disk *disk = &cfg->adisk_disks.disks[i]; + if (build_adisk_disk_txt(disk_txts[i], sizeof(disk_txts[i]), disk->disk_key, disk->share_name, disk->uuid, disk->disk_advf) != 0) { + return -1; + } + txts[i + 1] = disk_txts[i]; + } + if (planned_rr_add_txt_items(set, routes, instance_fqdn, txts, NULL, cfg->adisk_disks.count + 1, cfg->ttl) != 0) { + return -1; } } - return 0; + return planned_rr_add_link_addresses(set, routes, cfg->host_fqdn, link, include_a, include_aaaa, cfg->ttl); } -static uint32_t known_answer_rdata_link_ipv6_mask(const uint8_t *packet, - size_t packet_len, - size_t rdata_cursor, - uint16_t rdlength, - const struct link_context *link) { - size_t i; +static int plan_device_info_records(struct planned_rr_set *set, + int routes, + const struct config *cfg, + const char *instance_fqdn, + const struct link_context *link, + int include_ptr, + int include_srv, + int include_txt, + int include_a, + int include_aaaa) { + char model_txt[MAX_NAME + 16]; + const char *txts[1]; - if (link == NULL || rdlength != 16 || rdata_cursor + 16 > packet_len) { + if (cfg->device_model[0] == '\0') { return 0; } - for (i = 0; i < link->ipv6_count && i < 32; i++) { - if (!link_ipv6_addr_is_samba_bindable(&link->ipv6[i])) { - continue; + if (include_ptr && + planned_rr_add_name(set, routes, cfg->device_info_service_type, DNS_TYPE_PTR, DNS_CLASS_IN, cfg->ttl, instance_fqdn) != 0) { + return -1; + } + if (include_srv && planned_rr_add_srv(set, routes, instance_fqdn, cfg->host_fqdn, 0, cfg->ttl) != 0) { + return -1; + } + if (include_txt) { + if (build_model_txt(model_txt, sizeof(model_txt), cfg->device_model) != 0) { + return -1; } - if (memcmp(packet + rdata_cursor, link->ipv6[i].addr.s6_addr, 16) == 0) { - return (uint32_t)1 << i; + txts[0] = model_txt; + if (planned_rr_add_txt_items(set, routes, instance_fqdn, txts, NULL, 1, cfg->ttl) != 0) { + return -1; } } - return 0; + return planned_rr_add_link_addresses(set, routes, cfg->host_fqdn, link, include_a, include_aaaa, cfg->ttl); } -static void suppress_known_answer_generated_routes(struct query_answer_routes *routes, - const char *owner, - uint16_t type, - const uint8_t *packet, - size_t packet_len, - size_t rdata_cursor, - uint16_t rdlength, - const char *instance_fqdn, - const char *adisk_instance_fqdn, - const char *device_info_instance_fqdn, - const char *airport_instance_fqdn, - const struct config *cfg, - const struct link_context *response_link, - struct known_answer_address_coverage *coverage, - int use_snapshot_records) { - uint32_t known_mask; +static int plan_airport_records(struct planned_rr_set *set, + int routes, + const struct config *cfg, + const char *instance_fqdn, + const struct link_context *link, + int include_ptr, + int include_srv, + int include_txt, + int include_a, + int include_aaaa) { + char airport_txt[256]; + const char *txts[1]; - if (smb_enabled(cfg)) { - if (type == DNS_TYPE_PTR && name_equals(owner, cfg->service_type) && - known_answer_rdata_matches_name(packet, packet_len, rdata_cursor, instance_fqdn)) { - routes->smb_ptr = 0; - } else if (type == DNS_TYPE_SRV && name_equals(owner, instance_fqdn) && - known_answer_rdata_matches_srv(packet, packet_len, rdata_cursor, rdlength, cfg->host_fqdn, cfg->port)) { - routes->smb_srv = 0; - } else if (type == DNS_TYPE_TXT && name_equals(owner, instance_fqdn)) { - routes->smb_txt = 0; - } + if (!is_airport_enabled(cfg)) { + return 0; } - if (adisk_enabled(cfg)) { - if (type == DNS_TYPE_PTR && name_equals(owner, cfg->adisk_service_type) && - known_answer_rdata_matches_name(packet, packet_len, rdata_cursor, adisk_instance_fqdn)) { - routes->adisk_ptr = 0; - } else if (type == DNS_TYPE_SRV && name_equals(owner, adisk_instance_fqdn) && - known_answer_rdata_matches_srv(packet, packet_len, rdata_cursor, rdlength, cfg->host_fqdn, cfg->adisk_port)) { - routes->adisk_srv = 0; - } else if (type == DNS_TYPE_TXT && name_equals(owner, adisk_instance_fqdn)) { - routes->adisk_txt = 0; - } + if (include_ptr && + planned_rr_add_name(set, routes, cfg->airport_service_type, DNS_TYPE_PTR, DNS_CLASS_IN, cfg->ttl, instance_fqdn) != 0) { + return -1; } - if (cfg->device_model[0] != '\0') { - if (type == DNS_TYPE_PTR && name_equals(owner, cfg->device_info_service_type) && - known_answer_rdata_matches_name(packet, packet_len, rdata_cursor, device_info_instance_fqdn)) { - routes->device_info_ptr = 0; - } else if (type == DNS_TYPE_SRV && name_equals(owner, device_info_instance_fqdn) && - known_answer_rdata_matches_srv(packet, packet_len, rdata_cursor, rdlength, cfg->host_fqdn, 0)) { - routes->device_info_srv = 0; - } else if (type == DNS_TYPE_TXT && name_equals(owner, device_info_instance_fqdn)) { - routes->device_info_txt = 0; - } - } - if (!use_snapshot_records && is_airport_enabled(cfg)) { - if (type == DNS_TYPE_PTR && name_equals(owner, cfg->airport_service_type) && - known_answer_rdata_matches_name(packet, packet_len, rdata_cursor, airport_instance_fqdn)) { - routes->airport_ptr = 0; - } else if (type == DNS_TYPE_SRV && name_equals(owner, airport_instance_fqdn) && - known_answer_rdata_matches_srv(packet, packet_len, rdata_cursor, rdlength, cfg->host_fqdn, cfg->airport_port)) { - routes->airport_srv = 0; - } else if (type == DNS_TYPE_TXT && name_equals(owner, airport_instance_fqdn)) { - routes->airport_txt = 0; - } - } - if (type == DNS_TYPE_A && name_equals(owner, cfg->host_fqdn)) { - known_mask = known_answer_rdata_link_ipv4_mask(packet, packet_len, rdata_cursor, rdlength, response_link); - if (known_mask != 0) { - coverage->host_a |= known_mask; - if (known_answer_mask_covers_all(coverage->host_a, link_ipv4_advertise_mask(response_link))) { - routes->host_a = 0; - } + if (include_srv && planned_rr_add_srv(set, routes, instance_fqdn, cfg->host_fqdn, cfg->airport_port, cfg->ttl) != 0) { + return -1; + } + if (include_txt) { + if (build_airport_txt(airport_txt, sizeof(airport_txt), cfg) != 0) { + return -1; } - } else if (type == DNS_TYPE_AAAA && name_equals(owner, cfg->host_fqdn)) { - known_mask = known_answer_rdata_link_ipv6_mask(packet, packet_len, rdata_cursor, rdlength, response_link); - if (known_mask != 0) { - coverage->host_aaaa |= known_mask; - if (known_answer_mask_covers_all(coverage->host_aaaa, link_ipv6_advertise_mask(response_link))) { - routes->host_aaaa = 0; - } + txts[0] = airport_txt; + if (planned_rr_add_txt_items(set, routes, instance_fqdn, txts, NULL, 1, cfg->ttl) != 0) { + return -1; } } + return planned_rr_add_link_addresses(set, routes, cfg->host_fqdn, link, include_a, include_aaaa, cfg->ttl); } -static void suppress_known_answer_snapshot_routes(struct query_answer_routes *routes, - const char *owner, - uint16_t type, - const uint8_t *packet, - size_t packet_len, - size_t rdata_cursor, - uint16_t rdlength, - const struct link_context *response_link, - const struct service_record_set *snapshot_records, - struct known_answer_address_coverage *coverage, - int use_snapshot_records) { - size_t j; - uint32_t known_mask; +static int plan_snapshot_record(struct planned_rr_set *set, + int routes, + const struct service_record *record, + const struct link_context *link, + int include_ptr, + int include_srv, + int include_txt, + int include_a, + int include_aaaa, + uint32_t ttl) { + const char *txts[SNAPSHOT_MAX_TXT_ITEMS]; + uint8_t txt_lengths[SNAPSHOT_MAX_TXT_ITEMS]; + size_t i; - if (!use_snapshot_records) { - return; + if (is_suppressed_snapshot_service_type(record->service_type)) { + return 0; } - for (j = 0; j < snapshot_records->count; j++) { - const struct service_record *record = &snapshot_records->records[j]; - if (is_suppressed_snapshot_service_type(record->service_type)) { - continue; + if (include_ptr && + planned_rr_add_name(set, routes, record->service_type, DNS_TYPE_PTR, DNS_CLASS_IN, ttl, record->instance_fqdn) != 0) { + return -1; + } + if (include_srv && planned_rr_add_srv(set, routes, record->instance_fqdn, record->host_fqdn, record->port, ttl) != 0) { + return -1; + } + if (include_txt) { + for (i = 0; i < record->txt_count; i++) { + txts[i] = record->txt[i]; + txt_lengths[i] = record->txt_len[i]; } - if (type == DNS_TYPE_PTR && name_equals(owner, record->service_type) && - known_answer_rdata_matches_name(packet, packet_len, rdata_cursor, record->instance_fqdn)) { - routes->snapshot_ptr[j] = 0; - } else if (type == DNS_TYPE_SRV && name_equals(owner, record->instance_fqdn) && - known_answer_rdata_matches_srv(packet, packet_len, rdata_cursor, rdlength, record->host_fqdn, record->port)) { - routes->snapshot_srv[j] = 0; - } else if (type == DNS_TYPE_TXT && name_equals(owner, record->instance_fqdn)) { - routes->snapshot_txt[j] = 0; - } else if (type == DNS_TYPE_A && name_equals(owner, record->host_fqdn)) { - known_mask = known_answer_rdata_link_ipv4_mask(packet, packet_len, rdata_cursor, rdlength, response_link); - if (known_mask != 0) { - coverage->snapshot_a[j] |= known_mask; - if (known_answer_mask_covers_all(coverage->snapshot_a[j], link_ipv4_advertise_mask(response_link))) { - routes->snapshot_a[j] = 0; - } - } - } else if (type == DNS_TYPE_AAAA && name_equals(owner, record->host_fqdn)) { - known_mask = known_answer_rdata_link_ipv6_mask(packet, packet_len, rdata_cursor, rdlength, response_link); - if (known_mask != 0) { - coverage->snapshot_aaaa[j] |= known_mask; - if (known_answer_mask_covers_all(coverage->snapshot_aaaa[j], link_ipv6_advertise_mask(response_link))) { - routes->snapshot_aaaa[j] = 0; - } - } + if (planned_rr_add_txt_items(set, routes, record->instance_fqdn, txts, txt_lengths, record->txt_count, ttl) != 0) { + return -1; } } + return planned_rr_add_link_addresses(set, routes, record->host_fqdn, link, include_a, include_aaaa, ttl); } -static void suppress_known_answer_routes(const uint8_t *packet, - size_t packet_len, - size_t cursor, - uint16_t answer_count, - struct query_answer_routes *routes, - const char *instance_fqdn, - const char *adisk_instance_fqdn, - const char *device_info_instance_fqdn, - const char *airport_instance_fqdn, - const struct config *cfg, - const struct link_context *response_link, - const struct service_record_set *snapshot_records, - int use_snapshot_records) { +static int planned_set_has_route(const struct planned_rr_set *set, int route) { + size_t i; + + for (i = 0; i < set->count; i++) { + if ((set->records[i].routes & route) != 0) { + return 1; + } + } + return 0; +} + +static int planned_set_has_any_route(const struct planned_rr_set *set) { + size_t i; + + for (i = 0; i < set->count; i++) { + if (set->records[i].routes != 0) { + return 1; + } + } + return 0; +} + +static int planned_rr_matches_known_answer(const struct planned_rr *rr, + const char *owner, + uint16_t type, + uint16_t rrclass, + const uint8_t *packet, + size_t packet_len, + size_t rdata_cursor, + uint16_t rdlength) { + if (rr->type != type || + (rr->rrclass & 0x7FFF) != (rrclass & 0x7FFF) || + !name_equals(rr->owner, owner)) { + return 0; + } + if (type == DNS_TYPE_PTR) { + char known_name[MAX_NAME]; + char planned_name[MAX_NAME]; + size_t rdata_end = rdata_cursor + rdlength; + size_t planned_cursor = 0; + if (decode_name(packet, packet_len, &rdata_cursor, known_name, sizeof(known_name)) != 0 || + decode_name(rr->rdata, rr->rdlength, &planned_cursor, planned_name, sizeof(planned_name)) != 0) { + return 0; + } + if (rdata_cursor != rdata_end || planned_cursor != rr->rdlength) { + return 0; + } + return name_equals(known_name, planned_name); + } + if (type == DNS_TYPE_SRV) { + char known_target[MAX_NAME]; + char planned_target[MAX_NAME]; + size_t rdata_end = rdata_cursor + rdlength; + size_t known_cursor = rdata_cursor + 6; + size_t planned_cursor = 6; + if (rdlength < 6 || rr->rdlength < 6 || rdata_cursor + rdlength > packet_len || + memcmp(packet + rdata_cursor, rr->rdata, 6) != 0 || + decode_name(packet, packet_len, &known_cursor, known_target, sizeof(known_target)) != 0 || + decode_name(rr->rdata, rr->rdlength, &planned_cursor, planned_target, sizeof(planned_target)) != 0) { + return 0; + } + if (known_cursor != rdata_end || planned_cursor != rr->rdlength) { + return 0; + } + return name_equals(known_target, planned_target); + } + if (rdata_cursor + rdlength > packet_len) { + return 0; + } + if (rr->rdlength != rdlength) { + return 0; + } + return memcmp(packet + rdata_cursor, rr->rdata, rdlength) == 0; +} + +static void suppress_planned_known_answers(const uint8_t *packet, + size_t packet_len, + size_t cursor, + uint16_t answer_count, + struct planned_rr_set *planned) { uint16_t i; - struct known_answer_address_coverage coverage; - memset(&coverage, 0, sizeof(coverage)); for (i = 0; i < answer_count; i++) { char owner[MAX_NAME]; uint16_t type; @@ -4320,6 +4646,7 @@ static void suppress_known_answer_routes(const uint8_t *packet, uint32_t ttl; uint16_t rdlength; size_t rdata_cursor; + size_t j; if (decode_name(packet, packet_len, &cursor, owner, sizeof(owner)) != 0 || cursor + 10 > packet_len) { return; @@ -4338,265 +4665,231 @@ static void suppress_known_answer_routes(const uint8_t *packet, } rdata_cursor = cursor; cursor += rdlength; - if ((rrclass & 0x7FFF) != DNS_CLASS_IN || !known_answer_ttl_is_fresh(ttl, cfg->ttl)) { + if ((rrclass & 0x7FFF) != DNS_CLASS_IN) { continue; } - suppress_known_answer_generated_routes(routes, - owner, - type, - packet, - packet_len, - rdata_cursor, - rdlength, - instance_fqdn, - adisk_instance_fqdn, - device_info_instance_fqdn, - airport_instance_fqdn, - cfg, - response_link, - &coverage, - use_snapshot_records); - suppress_known_answer_snapshot_routes(routes, - owner, - type, - packet, - packet_len, - rdata_cursor, - rdlength, - response_link, - snapshot_records, - &coverage, - use_snapshot_records); - } -} - -static int build_query_response_packet(uint8_t *reply, size_t reply_cap, size_t *reply_len, int *answer_count, - uint16_t response_id, int route, - const struct query_answer_routes *routes, - const char *instance_fqdn, - const char *adisk_instance_fqdn, - const char *device_info_instance_fqdn, - const char *airport_instance_fqdn, - const struct config *cfg, - const struct link_context *response_link, - const struct service_record_set *snapshot_records, - int use_snapshot_records) { - struct dns_header hdr; - size_t off = sizeof(struct dns_header); - int answers = 0; - - memset(&hdr, 0, sizeof(hdr)); - hdr.id = response_id; - hdr.flags = htons(DNS_FLAG_QR | DNS_FLAG_AA); - - if (routes->smb_ptr & route) { - if (add_rr_ptr(reply, &off, reply_cap, cfg->service_type, instance_fqdn, cfg->ttl) != 0) { - log_packet_build_failure("query_response", "add_ptr", off, answers, use_snapshot_records); - return -1; - } - answers++; - } - if (routes->smb_srv & route) { - if (add_rr_srv(reply, &off, reply_cap, instance_fqdn, cfg->host_fqdn, cfg->port, cfg->ttl) != 0) { - log_packet_build_failure("query_response", "add_srv", off, answers, use_snapshot_records); - return -1; - } - answers++; - } - if (routes->smb_txt & route) { - if (add_rr_txt_empty(reply, &off, reply_cap, instance_fqdn, cfg->ttl) != 0) { - log_packet_build_failure("query_response", "add_txt", off, answers, use_snapshot_records); - return -1; - } - answers++; - } - if ((routes->adisk_ptr | routes->adisk_srv | routes->adisk_txt) & route) { - char txt1[128]; - char disk_txts[ADISK_MAX_DISKS][256]; - const char *txts[ADISK_MAX_DISKS + 1]; - size_t disk_i; - - if (build_adisk_system_txt(txt1, sizeof(txt1), cfg->adisk_sys_wama) != 0) { - log_packet_build_failure("query_response", "build_adisk_system_txt", off, answers, use_snapshot_records); - return -1; - } - txts[0] = txt1; - for (disk_i = 0; disk_i < cfg->adisk_disks.count; disk_i++) { - const struct adisk_disk *disk = &cfg->adisk_disks.disks[disk_i]; - if (build_adisk_disk_txt(disk_txts[disk_i], sizeof(disk_txts[disk_i]), disk->disk_key, disk->share_name, disk->uuid, disk->disk_advf) != 0) { - log_packet_build_failure("query_response", "build_adisk_disk_txt", off, answers, use_snapshot_records); - return -1; - } - txts[disk_i + 1] = disk_txts[disk_i]; - } - - if (routes->adisk_ptr & route) { - if (add_rr_ptr(reply, &off, reply_cap, cfg->adisk_service_type, adisk_instance_fqdn, cfg->ttl) != 0) { - log_packet_build_failure("query_response", "add_adisk_ptr", off, answers, use_snapshot_records); - return -1; - } - answers++; - } - if (routes->adisk_srv & route) { - if (add_rr_srv(reply, &off, reply_cap, adisk_instance_fqdn, cfg->host_fqdn, cfg->adisk_port, cfg->ttl) != 0) { - log_packet_build_failure("query_response", "add_adisk_srv", off, answers, use_snapshot_records); - return -1; + for (j = 0; j < planned->count; j++) { + if (planned->records[j].routes == 0 || + !known_answer_ttl_is_fresh(ttl, planned->records[j].ttl)) { + continue; } - answers++; - } - if (routes->adisk_txt & route) { - if (add_rr_txt_strings(reply, &off, reply_cap, adisk_instance_fqdn, cfg->ttl, txts, cfg->adisk_disks.count + 1) != 0) { - log_packet_build_failure("query_response", "add_adisk_txt", off, answers, use_snapshot_records); - return -1; + if (planned_rr_matches_known_answer(&planned->records[j], + owner, + type, + rrclass, + packet, + packet_len, + rdata_cursor, + rdlength)) { + planned->records[j].routes = 0; } - answers++; } } - if ((routes->device_info_ptr | routes->device_info_srv | routes->device_info_txt) & route) { - char model_txt[MAX_NAME + 16]; - const char *txts[1]; - - if (build_model_txt(model_txt, sizeof(model_txt), cfg->device_model) != 0) { - log_packet_build_failure("query_response", "build_model_txt", off, answers, use_snapshot_records); - return -1; - } - txts[0] = model_txt; +} - if (routes->device_info_ptr & route) { - if (add_rr_ptr(reply, &off, reply_cap, cfg->device_info_service_type, device_info_instance_fqdn, cfg->ttl) != 0) { - log_packet_build_failure("query_response", "add_device_info_ptr", off, answers, use_snapshot_records); - return -1; - } - answers++; - } - if (routes->device_info_srv & route) { - if (add_rr_srv(reply, &off, reply_cap, device_info_instance_fqdn, cfg->host_fqdn, 0, cfg->ttl) != 0) { - log_packet_build_failure("query_response", "add_device_info_srv", off, answers, use_snapshot_records); - return -1; - } - answers++; - } - if (routes->device_info_txt & route) { - if (add_rr_txt_strings(reply, &off, reply_cap, device_info_instance_fqdn, cfg->ttl, txts, 1) != 0) { - log_packet_build_failure("query_response", "add_device_info_txt", off, answers, use_snapshot_records); - return -1; - } - answers++; - } +static uint16_t sockaddr_port_host(const struct sockaddr *addr) { + if (addr == NULL) { + return 0; } - if (!use_snapshot_records && ((routes->airport_ptr | routes->airport_srv | routes->airport_txt) & route)) { - char airport_txt[256]; - const char *txts[1]; + if (addr->sa_family == AF_INET) { + const struct sockaddr_in *sin = (const struct sockaddr_in *)addr; + return ntohs(sin->sin_port); + } + if (addr->sa_family == AF_INET6) { + const struct sockaddr_in6 *sin6 = (const struct sockaddr_in6 *)addr; + return ntohs(sin6->sin6_port); + } + return 0; +} - if (build_airport_txt(airport_txt, sizeof(airport_txt), cfg) != 0) { - log_packet_build_failure("query_response", "build_airport_txt", off, answers, use_snapshot_records); - return -1; - } - txts[0] = airport_txt; +static int source_can_receive_unicast_response(const struct sockaddr *source, + const struct link_context *response_link) { + if (source == NULL || response_link == NULL) { + return 0; + } + if (source->sa_family == AF_INET) { + const struct sockaddr_in *sin = (const struct sockaddr_in *)source; + return source_matches_link_ipv4_subnet(sin->sin_addr.s_addr, response_link); + } + if (source->sa_family == AF_INET6) { + const struct sockaddr_in6 *sin6 = (const struct sockaddr_in6 *)source; + size_t i; - if (routes->airport_ptr & route) { - if (add_rr_ptr(reply, &off, reply_cap, cfg->airport_service_type, airport_instance_fqdn, cfg->ttl) != 0) { - log_packet_build_failure("query_response", "add_airport_ptr", off, answers, use_snapshot_records); - return -1; - } - answers++; + if (sin6->sin6_scope_id != 0 && sin6->sin6_scope_id == response_link->ifindex) { + return 1; } - if (routes->airport_srv & route) { - if (add_rr_srv(reply, &off, reply_cap, airport_instance_fqdn, cfg->host_fqdn, cfg->airport_port, cfg->ttl) != 0) { - log_packet_build_failure("query_response", "add_airport_srv", off, answers, use_snapshot_records); - return -1; + for (i = 0; i < response_link->ipv6_count; i++) { + if (response_link->ipv6[i].link_local) { + continue; } - answers++; - } - if (routes->airport_txt & route) { - if (add_rr_txt_strings(reply, &off, reply_cap, airport_instance_fqdn, cfg->ttl, txts, 1) != 0) { - log_packet_build_failure("query_response", "add_airport_txt", off, answers, use_snapshot_records); - return -1; + if (ipv6_prefix_matches(&sin6->sin6_addr, + &response_link->ipv6[i].addr, + response_link->ipv6[i].prefix_len)) { + return 1; } - answers++; - } - } - if (routes->host_a & route) { - if (append_host_address_records(reply, &off, reply_cap, cfg->host_fqdn, response_link, 1, 0, cfg->ttl, &answers) != 0) { - log_packet_build_failure("query_response", "add_a", off, answers, use_snapshot_records); - return -1; - } - } - if (routes->host_aaaa & route) { - if (append_host_address_records(reply, &off, reply_cap, cfg->host_fqdn, response_link, 0, 1, cfg->ttl, &answers) != 0) { - log_packet_build_failure("query_response", "add_aaaa", off, answers, use_snapshot_records); - return -1; } } + return 0; +} +static int plan_question_answers(struct planned_rr_set *planned, + int route, + const char *qname, + uint16_t qtype, + const struct config *cfg, + const struct link_context *response_link, + const struct service_record_set *snapshot_records, + int use_snapshot_records, + const char *instance_fqdn, + const char *adisk_instance_fqdn, + const char *device_info_instance_fqdn, + const char *airport_instance_fqdn) { + if (smb_enabled(cfg) && name_equals(qname, cfg->service_type) && + (qtype == DNS_TYPE_PTR || qtype == DNS_TYPE_ANY)) { + return plan_smb_records(planned, route, cfg, instance_fqdn, response_link, 1, 1, 1, 1, 1); + } + if (adisk_enabled(cfg) && name_equals(qname, cfg->adisk_service_type) && + (qtype == DNS_TYPE_PTR || qtype == DNS_TYPE_ANY)) { + return plan_adisk_records(planned, route, cfg, adisk_instance_fqdn, response_link, 1, 1, 1, 1, 1); + } + if (cfg->device_model[0] != '\0' && name_equals(qname, cfg->device_info_service_type) && + (qtype == DNS_TYPE_PTR || qtype == DNS_TYPE_ANY)) { + return plan_device_info_records(planned, route, cfg, device_info_instance_fqdn, response_link, 1, 1, 1, 1, 1); + } + if (!use_snapshot_records && is_airport_enabled(cfg) && name_equals(qname, cfg->airport_service_type) && + (qtype == DNS_TYPE_PTR || qtype == DNS_TYPE_ANY)) { + return plan_airport_records(planned, route, cfg, airport_instance_fqdn, response_link, 1, 1, 1, 1, 1); + } + if (smb_enabled(cfg) && name_equals(qname, instance_fqdn)) { + return plan_smb_records(planned, route, cfg, instance_fqdn, response_link, + 0, + qtype == DNS_TYPE_SRV || qtype == DNS_TYPE_ANY, + qtype == DNS_TYPE_TXT || qtype == DNS_TYPE_ANY, + qtype == DNS_TYPE_SRV || qtype == DNS_TYPE_ANY, + qtype == DNS_TYPE_SRV || qtype == DNS_TYPE_ANY); + } + if (adisk_enabled(cfg) && name_equals(qname, adisk_instance_fqdn)) { + return plan_adisk_records(planned, route, cfg, adisk_instance_fqdn, response_link, + 0, + qtype == DNS_TYPE_SRV || qtype == DNS_TYPE_ANY, + qtype == DNS_TYPE_TXT || qtype == DNS_TYPE_ANY, + qtype == DNS_TYPE_SRV || qtype == DNS_TYPE_ANY, + qtype == DNS_TYPE_SRV || qtype == DNS_TYPE_ANY); + } + if (cfg->device_model[0] != '\0' && name_equals(qname, device_info_instance_fqdn)) { + return plan_device_info_records(planned, route, cfg, device_info_instance_fqdn, response_link, + 0, + qtype == DNS_TYPE_SRV || qtype == DNS_TYPE_ANY, + qtype == DNS_TYPE_TXT || qtype == DNS_TYPE_ANY, + qtype == DNS_TYPE_SRV || qtype == DNS_TYPE_ANY, + qtype == DNS_TYPE_SRV || qtype == DNS_TYPE_ANY); + } + if (!use_snapshot_records && is_airport_enabled(cfg) && name_equals(qname, airport_instance_fqdn)) { + return plan_airport_records(planned, route, cfg, airport_instance_fqdn, response_link, + 0, + qtype == DNS_TYPE_SRV || qtype == DNS_TYPE_ANY, + qtype == DNS_TYPE_TXT || qtype == DNS_TYPE_ANY, + qtype == DNS_TYPE_SRV || qtype == DNS_TYPE_ANY, + qtype == DNS_TYPE_SRV || qtype == DNS_TYPE_ANY); + } + if (name_equals(qname, cfg->host_fqdn)) { + return planned_rr_add_link_addresses(planned, + route, + cfg->host_fqdn, + response_link, + qtype == DNS_TYPE_A || qtype == DNS_TYPE_ANY, + qtype == DNS_TYPE_AAAA || qtype == DNS_TYPE_ANY, + cfg->ttl); + } if (use_snapshot_records) { size_t j; - struct announced_host_set announced_hosts; - - memset(&announced_hosts, 0, sizeof(announced_hosts)); - for (j = 0; j < snapshot_records->count; j++) { const struct service_record *record = &snapshot_records->records[j]; - const char *txts[SNAPSHOT_MAX_TXT_ITEMS]; - uint8_t txt_lengths[SNAPSHOT_MAX_TXT_ITEMS]; - size_t k; - if (is_suppressed_snapshot_service_type(record->service_type)) { continue; } - for (k = 0; k < record->txt_count; k++) { - txts[k] = record->txt[k]; - txt_lengths[k] = record->txt_len[k]; - } - if (routes->snapshot_ptr[j] & route) { - if (add_rr_ptr(reply, &off, reply_cap, record->service_type, record->instance_fqdn, cfg->ttl) != 0) { - log_snapshot_record_build_failure("query_response", "add_snapshot_ptr", j, record, off, answers); - log_packet_build_failure("query_response", "add_snapshot_ptr", off, answers, use_snapshot_records); + if (name_equals(qname, record->service_type) && (qtype == DNS_TYPE_PTR || qtype == DNS_TYPE_ANY)) { + if (plan_snapshot_record(planned, route, record, response_link, 1, 1, 1, 1, 1, cfg->ttl) != 0) { return -1; } - answers++; - } - if (routes->snapshot_srv[j] & route) { - if (add_rr_srv(reply, &off, reply_cap, record->instance_fqdn, record->host_fqdn, record->port, cfg->ttl) != 0) { - log_snapshot_record_build_failure("query_response", "add_snapshot_srv", j, record, off, answers); - log_packet_build_failure("query_response", "add_snapshot_srv", off, answers, use_snapshot_records); + } else if (name_equals(qname, record->instance_fqdn)) { + if (plan_snapshot_record(planned, + route, + record, + response_link, + 0, + qtype == DNS_TYPE_SRV || qtype == DNS_TYPE_ANY, + qtype == DNS_TYPE_TXT || qtype == DNS_TYPE_ANY, + qtype == DNS_TYPE_SRV || qtype == DNS_TYPE_ANY, + qtype == DNS_TYPE_SRV || qtype == DNS_TYPE_ANY, + cfg->ttl) != 0) { return -1; } - answers++; - } - if (routes->snapshot_txt[j] & route) { - if (record->txt_count > 0) { - if (add_rr_txt_items(reply, &off, reply_cap, record->instance_fqdn, cfg->ttl, txts, txt_lengths, record->txt_count) != 0) { - log_snapshot_record_build_failure("query_response", "add_snapshot_txt", j, record, off, answers); - log_packet_build_failure("query_response", "add_snapshot_txt", off, answers, use_snapshot_records); - return -1; - } - } else { - if (add_rr_txt_empty(reply, &off, reply_cap, record->instance_fqdn, cfg->ttl) != 0) { - log_snapshot_record_build_failure("query_response", "add_snapshot_txt_empty", j, record, off, answers); - log_packet_build_failure("query_response", "add_snapshot_txt_empty", off, answers, use_snapshot_records); - return -1; - } - } - answers++; - } - if (((routes->snapshot_a[j] | routes->snapshot_aaaa[j]) & route) && record->host_fqdn[0] != '\0' && - !host_already_announced(&announced_hosts, record->host_fqdn)) { - int include_a = (routes->snapshot_a[j] & route) != 0; - int include_aaaa = (routes->snapshot_aaaa[j] & route) != 0; - if (add_snapshot_host_address_records(reply, &off, reply_cap, record, response_link, include_a, include_aaaa, cfg->ttl, &answers) != 0) { - log_snapshot_record_build_failure("query_response", "add_snapshot_a", j, record, off, answers); - log_packet_build_failure("query_response", "add_snapshot_a", off, answers, use_snapshot_records); - return -1; - } - if (remember_announced_host(&announced_hosts, record->host_fqdn) != 0) { - log_packet_build_failure("query_response", "remember_snapshot_a_host", off, answers, use_snapshot_records); + } else if (name_equals(qname, record->host_fqdn)) { + if (planned_rr_add_link_addresses(planned, + route, + record->host_fqdn, + response_link, + qtype == DNS_TYPE_A || qtype == DNS_TYPE_ANY, + qtype == DNS_TYPE_AAAA || qtype == DNS_TYPE_ANY, + cfg->ttl) != 0) { return -1; } } } } + return 0; +} + +static int add_planned_rr_to_packet(uint8_t *reply, + size_t *off, + size_t reply_cap, + const struct planned_rr *rr, + int legacy_unicast) { + uint16_t rrclass = rr->rrclass; + uint32_t ttl = rr->ttl; + + if (legacy_unicast) { + rrclass = (uint16_t)(rrclass & 0x7FFF); + if (ttl > LEGACY_UNICAST_TTL_MAX) { + ttl = LEGACY_UNICAST_TTL_MAX; + } + } + return encode_name(reply, off, reply_cap, rr->owner) != 0 || + append_u16(reply, off, reply_cap, rr->type) != 0 || + append_u16(reply, off, reply_cap, rrclass) != 0 || + append_u32(reply, off, reply_cap, ttl) != 0 || + append_u16(reply, off, reply_cap, rr->rdlength) != 0 || + append_bytes(reply, off, reply_cap, rr->rdata, rr->rdlength) != 0 + ? -1 + : 0; +} + +static int build_planned_response_packet(uint8_t *reply, + size_t reply_cap, + size_t *reply_len, + int *answer_count, + uint16_t response_id, + int route, + int legacy_unicast, + const struct planned_rr_set *planned) { + struct dns_header hdr; + size_t off = sizeof(struct dns_header); + int answers = 0; + size_t i; + memset(&hdr, 0, sizeof(hdr)); + hdr.id = response_id; + hdr.flags = htons(DNS_FLAG_QR | DNS_FLAG_AA); + for (i = 0; i < planned->count; i++) { + if ((planned->records[i].routes & route) == 0) { + continue; + } + if (add_planned_rr_to_packet(reply, &off, reply_cap, &planned->records[i], legacy_unicast) != 0) { + return -1; + } + answers++; + } hdr.ancount = htons((uint16_t)answers); memcpy(reply, &hdr, sizeof(hdr)); *reply_len = off; @@ -4604,6 +4897,199 @@ static int build_query_response_packet(uint8_t *reply, size_t reply_cap, size_t return 0; } +static void clear_deferred_response(void) { + memset(&g_deferred_response, 0, sizeof(g_deferred_response)); +} + +static void clear_deferred_response_for_sockfd(int sockfd) { + if (g_deferred_response.active && g_deferred_response.sockfd == sockfd) { + clear_deferred_response(); + } +} + +static int sockaddr_endpoint_equal(const struct sockaddr *a, socklen_t a_len, + const struct sockaddr *b, socklen_t b_len) { + if (a == NULL || b == NULL || a->sa_family != b->sa_family) { + return 0; + } + if (a->sa_family == AF_INET) { + const struct sockaddr_in *sin_a = (const struct sockaddr_in *)a; + const struct sockaddr_in *sin_b = (const struct sockaddr_in *)b; + if (a_len < (socklen_t)sizeof(*sin_a) || b_len < (socklen_t)sizeof(*sin_b)) { + return 0; + } + return sin_a->sin_port == sin_b->sin_port && + sin_a->sin_addr.s_addr == sin_b->sin_addr.s_addr; + } + if (a->sa_family == AF_INET6) { + const struct sockaddr_in6 *sin6_a = (const struct sockaddr_in6 *)a; + const struct sockaddr_in6 *sin6_b = (const struct sockaddr_in6 *)b; + if (a_len < (socklen_t)sizeof(*sin6_a) || b_len < (socklen_t)sizeof(*sin6_b)) { + return 0; + } + return sin6_a->sin6_port == sin6_b->sin6_port && + sin6_a->sin6_scope_id == sin6_b->sin6_scope_id && + memcmp(&sin6_a->sin6_addr, &sin6_b->sin6_addr, sizeof(sin6_a->sin6_addr)) == 0; + } + return 0; +} + +static int deferred_response_matches_source(int sockfd, const struct sockaddr *source, socklen_t source_len) { + if (!g_deferred_response.active || g_deferred_response.sockfd != sockfd) { + return 0; + } + return sockaddr_endpoint_equal((const struct sockaddr *)&g_deferred_response.source, + g_deferred_response.source_len, + source, + source_len); +} + +static int copy_sockaddr_storage(struct sockaddr_storage *out, + socklen_t *out_len, + const struct sockaddr *src, + socklen_t src_len) { + if (src == NULL || src_len > (socklen_t)sizeof(*out)) { + return -1; + } + memset(out, 0, sizeof(*out)); + memcpy(out, src, src_len); + *out_len = src_len; + return 0; +} + +static int flush_deferred_response_now(void) { + uint8_t reply[BUF_SIZE]; + int status = 0; + + if (!g_deferred_response.active) { + return 0; + } + if (planned_set_has_route(&g_deferred_response.planned, MDNS_REPLY_LEGACY_UNICAST)) { + size_t reply_len; + int answers; + if (build_planned_response_packet(reply, + sizeof(reply), + &reply_len, + &answers, + g_deferred_response.response_id, + MDNS_REPLY_LEGACY_UNICAST, + 1, + &g_deferred_response.planned) != 0 || + (answers > 0 && + send_dns_packet_any("query_response", + g_deferred_response.sockfd, + reply, + reply_len, + (const struct sockaddr *)&g_deferred_response.source, + g_deferred_response.source_len, + answers, + g_deferred_response.use_snapshot_records) != 0)) { + status = -1; + } + } + if (planned_set_has_route(&g_deferred_response.planned, MDNS_REPLY_UNICAST)) { + size_t reply_len; + int answers; + if (build_planned_response_packet(reply, + sizeof(reply), + &reply_len, + &answers, + g_deferred_response.response_id, + MDNS_REPLY_UNICAST, + 0, + &g_deferred_response.planned) != 0 || + (answers > 0 && + send_dns_packet_any("query_response", + g_deferred_response.sockfd, + reply, + reply_len, + (const struct sockaddr *)&g_deferred_response.source, + g_deferred_response.source_len, + answers, + g_deferred_response.use_snapshot_records) != 0)) { + status = -1; + } + } + if (planned_set_has_route(&g_deferred_response.planned, MDNS_REPLY_MULTICAST)) { + size_t reply_len; + int answers; + if (build_planned_response_packet(reply, + sizeof(reply), + &reply_len, + &answers, + 0, + MDNS_REPLY_MULTICAST, + 0, + &g_deferred_response.planned) != 0 || + (answers > 0 && + send_dns_packet_any("query_response", + g_deferred_response.sockfd, + reply, + reply_len, + (const struct sockaddr *)&g_deferred_response.multicast_dest, + g_deferred_response.multicast_dest_len, + answers, + g_deferred_response.use_snapshot_records) != 0)) { + status = -1; + } + } + clear_deferred_response(); + return status; +} + +static int flush_deferred_response_if_due(long long now_ms) { + if (!g_deferred_response.active || now_ms < g_deferred_response.due_ms) { + return 0; + } + return flush_deferred_response_now(); +} + +static long long deferred_response_adjust_wait_ms(long long now_ms, long long wait_ms) { + long long deferred_wait; + + if (!g_deferred_response.active) { + return wait_ms; + } + deferred_wait = g_deferred_response.due_ms - now_ms; + if (deferred_wait < 0) { + deferred_wait = 0; + } + return deferred_wait < wait_ms ? deferred_wait : wait_ms; +} + +static int defer_planned_response(int sockfd, + uint16_t response_id, + const struct sockaddr *multicast_dest, + socklen_t multicast_dest_len, + const struct sockaddr *source, + socklen_t source_len, + int use_snapshot_records, + const struct planned_rr_set *planned) { + if (!planned_set_has_any_route(planned)) { + clear_deferred_response(); + return 0; + } + clear_deferred_response(); + g_deferred_response.active = 1; + g_deferred_response.sockfd = sockfd; + g_deferred_response.due_ms = monotonic_millis() + TC_KNOWN_ANSWER_DEFER_MS; + g_deferred_response.response_id = response_id; + g_deferred_response.use_snapshot_records = use_snapshot_records; + g_deferred_response.planned = *planned; + if (copy_sockaddr_storage(&g_deferred_response.multicast_dest, + &g_deferred_response.multicast_dest_len, + multicast_dest, + multicast_dest_len) != 0 || + copy_sockaddr_storage(&g_deferred_response.source, + &g_deferred_response.source_len, + source, + source_len) != 0) { + clear_deferred_response(); + return -1; + } + return 0; +} + static int handle_query_any(int sockfd, const uint8_t *packet, size_t packet_len, @@ -4620,16 +5106,20 @@ static int handle_query_any(int sockfd, uint16_t qdcount; uint16_t ancount; uint16_t query_id; + uint16_t flags; uint8_t reply[BUF_SIZE]; char instance_fqdn[MAX_NAME]; char adisk_instance_fqdn[MAX_NAME]; char device_info_instance_fqdn[MAX_NAME]; char airport_instance_fqdn[MAX_NAME]; - struct query_answer_routes routes; uint16_t i; int status = 0; + int source_port; + int legacy_unicast_query; + int source_allows_unicast; + static struct planned_rr_set planned; - memset(&routes, 0, sizeof(routes)); + memset(&planned, 0, sizeof(planned)); instance_fqdn[0] = '\0'; adisk_instance_fqdn[0] = '\0'; device_info_instance_fqdn[0] = '\0'; @@ -4639,13 +5129,17 @@ static int handle_query_any(int sockfd, return 0; } memcpy(&hdr, packet, sizeof(hdr)); - if (ntohs(hdr.flags) & DNS_FLAG_QR) { + flags = ntohs(hdr.flags); + if (flags & DNS_FLAG_QR) { return 0; } qdcount = ntohs(hdr.qdcount); ancount = ntohs(hdr.ancount); query_id = hdr.id; + source_port = sockaddr_port_host(source); + legacy_unicast_query = source_port != 0 && source_port != MDNS_PORT; + source_allows_unicast = source_can_receive_unicast_response(source, response_link); if (smb_enabled(cfg) && build_instance_fqdn(instance_fqdn, sizeof(instance_fqdn), cfg->instance_name, cfg->service_type) != 0) { log_packet_build_failure("query_response", "build_instance_fqdn", sizeof(struct dns_header), 0, use_snapshot_records); @@ -4667,6 +5161,20 @@ static int handle_query_any(int sockfd, return 0; } + if (qdcount == 0) { + if (deferred_response_matches_source(sockfd, source, source_len)) { + suppress_planned_known_answers(packet, packet_len, cursor, ancount, &g_deferred_response.planned); + if ((flags & DNS_FLAG_TC) == 0) { + return flush_deferred_response_now(); + } + } + return 0; + } + + if (deferred_response_matches_source(sockfd, source, source_len) && (flags & DNS_FLAG_TC) == 0) { + clear_deferred_response(); + } + for (i = 0; i < qdcount; i++) { char qname[MAX_NAME]; uint16_t qtype; @@ -4688,154 +5196,70 @@ static int handle_query_any(int sockfd, if (qclass_base != DNS_CLASS_IN) { continue; } - reply_route = (qclass_raw & DNS_CLASS_QU) ? MDNS_REPLY_UNICAST : MDNS_REPLY_MULTICAST; - - if (smb_enabled(cfg) && - name_equals(qname, cfg->service_type) && - (qtype == DNS_TYPE_PTR || qtype == DNS_TYPE_ANY)) { - routes.smb_ptr |= reply_route; - routes.smb_srv |= reply_route; - routes.smb_txt |= reply_route; - routes.host_a |= reply_route; - routes.host_aaaa |= reply_route; - } else if (adisk_enabled(cfg) && - name_equals(qname, cfg->adisk_service_type) && - (qtype == DNS_TYPE_PTR || qtype == DNS_TYPE_ANY)) { - routes.adisk_ptr |= reply_route; - routes.adisk_srv |= reply_route; - routes.adisk_txt |= reply_route; - routes.host_a |= reply_route; - routes.host_aaaa |= reply_route; - } else if (cfg->device_model[0] != '\0' && - name_equals(qname, cfg->device_info_service_type) && - (qtype == DNS_TYPE_PTR || qtype == DNS_TYPE_ANY)) { - routes.device_info_ptr |= reply_route; - routes.device_info_srv |= reply_route; - routes.device_info_txt |= reply_route; - routes.host_a |= reply_route; - routes.host_aaaa |= reply_route; - } else if (!use_snapshot_records && is_airport_enabled(cfg) && - name_equals(qname, cfg->airport_service_type) && - (qtype == DNS_TYPE_PTR || qtype == DNS_TYPE_ANY)) { - routes.airport_ptr |= reply_route; - routes.airport_srv |= reply_route; - routes.airport_txt |= reply_route; - routes.host_a |= reply_route; - routes.host_aaaa |= reply_route; - } else if (smb_enabled(cfg) && name_equals(qname, instance_fqdn)) { - if (qtype == DNS_TYPE_SRV || qtype == DNS_TYPE_ANY) { - routes.smb_srv |= reply_route; - routes.host_a |= reply_route; - routes.host_aaaa |= reply_route; - } - if (qtype == DNS_TYPE_TXT || qtype == DNS_TYPE_ANY) { - routes.smb_txt |= reply_route; - } - } else if (adisk_enabled(cfg) && - name_equals(qname, adisk_instance_fqdn)) { - if (qtype == DNS_TYPE_SRV || qtype == DNS_TYPE_ANY) { - routes.adisk_srv |= reply_route; - routes.host_a |= reply_route; - routes.host_aaaa |= reply_route; - } - if (qtype == DNS_TYPE_TXT || qtype == DNS_TYPE_ANY) { - routes.adisk_txt |= reply_route; - } - } else if (cfg->device_model[0] != '\0' && - name_equals(qname, device_info_instance_fqdn)) { - if (qtype == DNS_TYPE_SRV || qtype == DNS_TYPE_ANY) { - routes.device_info_srv |= reply_route; - routes.host_a |= reply_route; - routes.host_aaaa |= reply_route; - } - if (qtype == DNS_TYPE_TXT || qtype == DNS_TYPE_ANY) { - routes.device_info_txt |= reply_route; - } - } else if (!use_snapshot_records && is_airport_enabled(cfg) && - name_equals(qname, airport_instance_fqdn)) { - if (qtype == DNS_TYPE_SRV || qtype == DNS_TYPE_ANY) { - routes.airport_srv |= reply_route; - routes.host_a |= reply_route; - routes.host_aaaa |= reply_route; - } - if (qtype == DNS_TYPE_TXT || qtype == DNS_TYPE_ANY) { - routes.airport_txt |= reply_route; - } - } else if (name_equals(qname, cfg->host_fqdn) && (qtype == DNS_TYPE_A || qtype == DNS_TYPE_ANY)) { - routes.host_a |= reply_route; - if (qtype == DNS_TYPE_ANY) { - routes.host_aaaa |= reply_route; - } - } else if (name_equals(qname, cfg->host_fqdn) && qtype == DNS_TYPE_AAAA) { - routes.host_aaaa |= reply_route; - } else if (use_snapshot_records) { - size_t j; - for (j = 0; j < snapshot_records->count; j++) { - const struct service_record *record = &snapshot_records->records[j]; - if (is_suppressed_snapshot_service_type(record->service_type)) { - continue; - } - if (name_equals(qname, record->service_type) && (qtype == DNS_TYPE_PTR || qtype == DNS_TYPE_ANY)) { - routes.snapshot_ptr[j] |= reply_route; - routes.snapshot_srv[j] |= reply_route; - routes.snapshot_txt[j] |= reply_route; - routes.snapshot_a[j] |= reply_route; - routes.snapshot_aaaa[j] |= reply_route; - } else if (name_equals(qname, record->instance_fqdn)) { - if (qtype == DNS_TYPE_SRV || qtype == DNS_TYPE_ANY) { - routes.snapshot_srv[j] |= reply_route; - routes.snapshot_a[j] |= reply_route; - routes.snapshot_aaaa[j] |= reply_route; - } - if (qtype == DNS_TYPE_TXT || qtype == DNS_TYPE_ANY) { - routes.snapshot_txt[j] |= reply_route; - } - } else if (name_equals(qname, record->host_fqdn) && (qtype == DNS_TYPE_A || qtype == DNS_TYPE_ANY)) { - routes.snapshot_a[j] |= reply_route; - if (qtype == DNS_TYPE_ANY) { - routes.snapshot_aaaa[j] |= reply_route; - } - } else if (name_equals(qname, record->host_fqdn) && qtype == DNS_TYPE_AAAA) { - routes.snapshot_aaaa[j] |= reply_route; - } - } + if (legacy_unicast_query && source_allows_unicast) { + reply_route = MDNS_REPLY_LEGACY_UNICAST; + } else if ((qclass_raw & DNS_CLASS_QU) && source_allows_unicast) { + reply_route = MDNS_REPLY_UNICAST; + } else { + reply_route = MDNS_REPLY_MULTICAST; + } + if (plan_question_answers(&planned, + reply_route, + qname, + qtype, + cfg, + response_link, + snapshot_records, + use_snapshot_records, + instance_fqdn, + adisk_instance_fqdn, + device_info_instance_fqdn, + airport_instance_fqdn) != 0) { + log_packet_build_failure("query_response", "plan_question_answers", cursor, 0, use_snapshot_records); + return -1; } } - suppress_known_answer_routes(packet, - packet_len, - cursor, - ancount, - &routes, - instance_fqdn, - adisk_instance_fqdn, - device_info_instance_fqdn, - airport_instance_fqdn, - cfg, - response_link, - snapshot_records, - use_snapshot_records); + suppress_planned_known_answers(packet, packet_len, cursor, ancount, &planned); + + if (flags & DNS_FLAG_TC) { + if (defer_planned_response(sockfd, + query_id, + multicast_dest, + multicast_dest_len, + source, + source_len, + use_snapshot_records, + &planned) != 0) { + return -1; + } + return 0; + } + + if (planned_set_has_route(&planned, MDNS_REPLY_LEGACY_UNICAST)) { + size_t reply_len; + int answers; + if (build_planned_response_packet(reply, sizeof(reply), &reply_len, &answers, query_id, MDNS_REPLY_LEGACY_UNICAST, 1, &planned) != 0 || + (answers > 0 && + send_dns_packet_any("query_response", sockfd, reply, reply_len, source, source_len, answers, use_snapshot_records) != 0)) { + status = -1; + } + } - if (query_routes_have_destination(&routes, snapshot_records, use_snapshot_records, MDNS_REPLY_UNICAST)) { + if (planned_set_has_route(&planned, MDNS_REPLY_UNICAST)) { size_t reply_len; int answers; - if (build_query_response_packet(reply, sizeof(reply), &reply_len, &answers, query_id, MDNS_REPLY_UNICAST, - &routes, instance_fqdn, adisk_instance_fqdn, device_info_instance_fqdn, - airport_instance_fqdn, cfg, response_link, - snapshot_records, use_snapshot_records) != 0 || + if (build_planned_response_packet(reply, sizeof(reply), &reply_len, &answers, query_id, MDNS_REPLY_UNICAST, 0, &planned) != 0 || (answers > 0 && send_dns_packet_any("query_response", sockfd, reply, reply_len, source, source_len, answers, use_snapshot_records) != 0)) { status = -1; } } - if (query_routes_have_destination(&routes, snapshot_records, use_snapshot_records, MDNS_REPLY_MULTICAST)) { + if (planned_set_has_route(&planned, MDNS_REPLY_MULTICAST)) { size_t reply_len; int answers; - if (build_query_response_packet(reply, sizeof(reply), &reply_len, &answers, 0, MDNS_REPLY_MULTICAST, - &routes, instance_fqdn, adisk_instance_fqdn, device_info_instance_fqdn, - airport_instance_fqdn, cfg, response_link, - snapshot_records, use_snapshot_records) != 0 || + if (build_planned_response_packet(reply, sizeof(reply), &reply_len, &answers, 0, MDNS_REPLY_MULTICAST, 0, &planned) != 0 || (answers > 0 && send_dns_packet_any("query_response", sockfd, reply, reply_len, multicast_dest, multicast_dest_len, answers, use_snapshot_records) != 0)) { status = -1; @@ -4886,6 +5310,18 @@ static void link_context_from_iface_context(struct link_context *out, const stru out->ipv4[0].addr = ctx->ipv4_addr; out->ipv4[0].netmask = ctx->netmask; out->ipv4_count = 1; + out->mdns_ipv4_transport = 1; + out->mdns_ipv4_transport_addr = ctx->ipv4_addr; +} + +static void init_explicit_link_context(struct link_context *out, uint32_t ipv4_addr) { + memset(out, 0, sizeof(*out)); + strncpy(out->name, "explicit", sizeof(out->name) - 1); + out->ipv4[0].addr = ipv4_addr; + out->ipv4[0].netmask = htonl(0xffffffffU); + out->ipv4_count = 1; + out->mdns_ipv4_transport = 1; + out->mdns_ipv4_transport_addr = ipv4_addr; } static int set_context_outbound_interface(int sockfd, const struct iface_context *ctx) { @@ -4992,12 +5428,20 @@ static const struct link_context *select_response_link_ipv4(const struct link_co } if (source != NULL && source->sin_addr.s_addr != 0) { for (i = 0; i < links->count; i++) { + if (!link_context_has_mdns_ipv4_transport(&links->links[i])) { + continue; + } if (source_matches_link_ipv4_subnet(source->sin_addr.s_addr, &links->links[i])) { return &links->links[i]; } } } - return &links->links[0]; + for (i = 0; i < links->count; i++) { + if (link_context_has_mdns_ipv4_transport(&links->links[i])) { + return &links->links[i]; + } + } + return NULL; } static const struct link_context *select_response_link_ipv6(const struct link_context_set *links, @@ -5010,13 +5454,17 @@ static const struct link_context *select_response_link_ipv6(const struct link_co if (source != NULL) { if (source->sin6_scope_id != 0) { for (i = 0; i < links->count; i++) { - if (links->links[i].ifindex == source->sin6_scope_id) { + if (link_context_has_mdns_ipv6_transport(&links->links[i]) && + links->links[i].ifindex == source->sin6_scope_id) { return &links->links[i]; } } } for (i = 0; i < links->count; i++) { size_t j; + if (!link_context_has_mdns_ipv6_transport(&links->links[i])) { + continue; + } for (j = 0; j < links->links[i].ipv6_count; j++) { if (links->links[i].ipv6[j].link_local) { continue; @@ -5029,15 +5477,32 @@ static const struct link_context *select_response_link_ipv6(const struct link_co } } } - return links->count == 1 ? &links->links[0] : &links->links[0]; + for (i = 0; i < links->count; i++) { + if (link_context_has_mdns_ipv6_transport(&links->links[i])) { + return &links->links[i]; + } + } + return NULL; } static int set_link_outbound_interface4(int sockfd, const struct link_context *link) { - if (link->ipv4_count == 0) { + uint32_t ipv4_addr = link_preferred_ipv4_source(link); + + if (ipv4_addr == 0) { + errno = EADDRNOTAVAIL; + return -1; + } + return set_outbound_multicast_interface(sockfd, ipv4_addr, "runtime", 0, 0); +} + +static int set_link_outbound_interface4_for_peer(int sockfd, const struct link_context *link, uint32_t source_ipv4_addr) { + uint32_t ipv4_addr = link_ipv4_source_for_peer(link, source_ipv4_addr); + + if (ipv4_addr == 0) { errno = EADDRNOTAVAIL; return -1; } - return set_outbound_multicast_interface(sockfd, link->ipv4[0].addr, "runtime", 0, 0); + return set_outbound_multicast_interface(sockfd, ipv4_addr, "runtime", 0, 0); } static int set_link_outbound_interface6(int sockfd, const struct link_context *link) { @@ -5053,7 +5518,7 @@ static void send_link_announcement_pair(const struct mdns_socket_pair *sockets, const struct service_record_set *snapshot_records, int use_snapshot_records, const char *stage) { - if (sockets->ipv4_fd >= 0 && link->ipv4_count > 0) { + if (sockets->ipv4_fd >= 0 && link_context_has_mdns_ipv4_transport(link)) { if (set_link_outbound_interface4(sockets->ipv4_fd, link) != 0 || send_announcement(sockets->ipv4_fd, dest4, cfg, link, ttl, snapshot_records, use_snapshot_records) != 0) { char detail[160]; @@ -5164,6 +5629,8 @@ static int prepare_runtime_mdns_sockets_for_links(int shared_bind, int need_ipv6 = link_contexts_need_ipv6_socket(new_links); int opened_ipv4 = 0; int opened_ipv6 = 0; + int ipv4_errno = 0; + int ipv6_errno = 0; struct mdns_membership_delta delta; init_mdns_membership_delta(&delta); @@ -5176,18 +5643,32 @@ static int prepare_runtime_mdns_sockets_for_links(int shared_bind, if (need_ipv4 && sockets->ipv4_fd < 0) { sockets->ipv4_fd = open_bound_mdns_socket(shared_bind, 1); if (sockets->ipv4_fd < 0) { - goto fail; + ipv4_errno = errno; + if (need_ipv6) { + fprintf(stderr, + "warning: mdns runtime socket: IPv4 socket open failed (%s); continuing with remaining mDNS transports\n", + strerror(ipv4_errno)); + disable_link_contexts_mdns_ipv4_transport(new_links); + compact_link_contexts_for_mdns_transport(new_links); + need_ipv4 = 0; + } else { + goto fail; + } + } + if (sockets->ipv4_fd >= 0) { + opened_ipv4 = 1; } - opened_ipv4 = 1; } if (need_ipv6 && sockets->ipv6_fd < 0) { sockets->ipv6_fd = open_bound_mdns_socket6(shared_bind, 1); if (sockets->ipv6_fd < 0) { + ipv6_errno = errno; if (need_ipv4 && sockets->ipv4_fd >= 0) { fprintf(stderr, - "warning: mdns runtime socket: IPv6 socket open failed (%s); continuing with IPv4 mDNS\n", - strerror(errno)); + "warning: mdns runtime socket: IPv6 socket open failed (%s); continuing with remaining mDNS transports\n", + strerror(ipv6_errno)); disable_link_contexts_mdns_ipv6_transport(new_links); + compact_link_contexts_for_mdns_transport(new_links); need_ipv6 = 0; } else { goto fail; @@ -5204,7 +5685,20 @@ static int prepare_runtime_mdns_sockets_for_links(int shared_bind, new_links, "runtime", &delta) != 0) { - goto fail; + ipv4_errno = errno; + if (ipv4_errno == EADDRNOTAVAIL && need_ipv6 && sockets->ipv6_fd >= 0) { + fprintf(stderr, + "warning: mdns runtime socket: IPv4 membership update found no usable links; continuing with remaining mDNS transports\n"); + disable_link_contexts_mdns_ipv4_transport(new_links); + need_ipv4 = 0; + if (opened_ipv4 && sockets->ipv4_fd >= 0) { + clear_deferred_response_for_sockfd(sockets->ipv4_fd); + close(sockets->ipv4_fd); + sockets->ipv4_fd = -1; + } + } else { + goto fail; + } } if (need_ipv6 && prepare_mdns_socket6_memberships(sockets->ipv6_fd, @@ -5212,28 +5706,38 @@ static int prepare_runtime_mdns_sockets_for_links(int shared_bind, new_links, "runtime", &delta) != 0) { + ipv6_errno = errno; if (need_ipv4 && sockets->ipv4_fd >= 0) { fprintf(stderr, - "warning: mdns runtime socket: IPv6 membership update failed (%s); continuing with IPv4 mDNS\n", - strerror(errno)); + "warning: mdns runtime socket: IPv6 membership update failed (%s); continuing with remaining mDNS transports\n", + strerror(ipv6_errno)); disable_link_contexts_mdns_ipv6_transport(new_links); if (opened_ipv6 && sockets->ipv6_fd >= 0) { + clear_deferred_response_for_sockfd(sockets->ipv6_fd); close(sockets->ipv6_fd); sockets->ipv6_fd = -1; } + compact_link_contexts_for_mdns_transport(new_links); return 0; } goto fail; } + compact_link_contexts_for_mdns_transport(new_links); + if (new_links->count == 0) { + errno = EADDRNOTAVAIL; + goto fail; + } return 0; fail: rollback_mdns_membership_delta(sockets, &delta); if (opened_ipv4 && sockets->ipv4_fd >= 0) { + clear_deferred_response_for_sockfd(sockets->ipv4_fd); close(sockets->ipv4_fd); sockets->ipv4_fd = -1; } if (opened_ipv6 && sockets->ipv6_fd >= 0) { + clear_deferred_response_for_sockfd(sockets->ipv6_fd); close(sockets->ipv6_fd); sockets->ipv6_fd = -1; } @@ -5247,11 +5751,13 @@ static void retire_runtime_mdns_memberships_for_missing(struct mdns_socket_pair if (sockets->ipv4_fd >= 0) { for (i = 0; i < old_links->count; i++) { - if (old_links->links[i].ipv4_count == 0 || - link_set_has_ipv4_membership(new_links, old_links->links[i].ipv4[0].addr)) { + uint32_t ipv4_addr = link_preferred_ipv4_source(&old_links->links[i]); + if (!link_context_has_mdns_ipv4_transport(&old_links->links[i]) || + ipv4_addr == 0 || + link_set_has_ipv4_membership(new_links, ipv4_addr)) { continue; } - drop_mdns_multicast_group_best_effort(sockets->ipv4_fd, old_links->links[i].ipv4[0].addr, "runtime"); + drop_mdns_multicast_group_best_effort(sockets->ipv4_fd, ipv4_addr, "runtime"); } } if (sockets->ipv6_fd >= 0) { @@ -5271,10 +5777,12 @@ static void retire_runtime_mdns_memberships_for_missing(struct mdns_socket_pair static void close_unused_runtime_mdns_socket_families(struct mdns_socket_pair *sockets, const struct link_context_set *links) { if (!link_contexts_need_ipv4_socket(links) && sockets->ipv4_fd >= 0) { + clear_deferred_response_for_sockfd(sockets->ipv4_fd); close(sockets->ipv4_fd); sockets->ipv4_fd = -1; } if (!link_contexts_need_ipv6_socket(links) && sockets->ipv6_fd >= 0) { + clear_deferred_response_for_sockfd(sockets->ipv6_fd); close(sockets->ipv6_fd); sockets->ipv6_fd = -1; } @@ -5588,6 +6096,11 @@ int main(int argc, char **argv) { capture_mdns_snapshot_links_with_retry(&captured_records, &capture_links) == 0) || (!auto_ip && capture_mdns_snapshot_raw_with_retry(&captured_records, cfg.ipv4_addr) == 0)) { fprintf(stderr, "snapshot capture: captured %lu records\n", (unsigned long)captured_records.count); + if (captured_records.truncated) { + fprintf(stderr, + "snapshot capture: record list truncated; kept first %lu unique records in receive order\n", + (unsigned long)captured_records.count); + } if (cfg.save_all_snapshot_path[0] != '\0' && write_snapshot_file_atomic(cfg.save_all_snapshot_path, &captured_records) != 0) { fprintf(stderr, "failed to write all snapshot file: %s\n", cfg.save_all_snapshot_path); @@ -5746,6 +6259,7 @@ int main(int argc, char **argv) { } now_ms = monotonic_millis(); + (void)flush_deferred_response_if_due(now_ms); while (startup_burst_index < STARTUP_BURST_COUNT && now_ms - startup_burst_start_ms >= (long long)startup_burst_offsets_ms[startup_burst_index]) { announce_all_links(&sockets, &auto_links, &mdns_dest, &mdns_dest6, &cfg, &snapshot_records, use_snapshot_records, "startup_announce"); @@ -5775,6 +6289,7 @@ int main(int argc, char **argv) { wait_ms = 1000; } } + wait_ms = deferred_response_adjust_wait_ms(now_ms, wait_ms); tv.tv_sec = (time_t)(wait_ms / 1000); tv.tv_usec = (suseconds_t)((wait_ms % 1000) * 1000); @@ -5794,7 +6309,7 @@ int main(int argc, char **argv) { if (nread > 0) { const struct link_context *link = select_response_link_ipv4(&auto_links, &src); if (link != NULL && - (set_link_outbound_interface4(sockets.ipv4_fd, link) != 0 || + (set_link_outbound_interface4_for_peer(sockets.ipv4_fd, link, src.sin_addr.s_addr) != 0 || handle_query(sockets.ipv4_fd, packet, (size_t)nread, &mdns_dest, &src, &cfg, link, &snapshot_records, use_snapshot_records) != 0)) { char detail[160]; snprintf(detail, sizeof(detail), "iface=%s packet_len=%ld from=%s:%u", @@ -5872,14 +6387,11 @@ int main(int argc, char **argv) { long long wait_ms = 1000; now_ms = monotonic_millis(); + (void)flush_deferred_response_if_due(now_ms); while (startup_burst_index < STARTUP_BURST_COUNT && now_ms - startup_burst_start_ms >= (long long)startup_burst_offsets_ms[startup_burst_index]) { struct link_context link; - memset(&link, 0, sizeof(link)); - strncpy(link.name, "explicit", sizeof(link.name) - 1); - link.ipv4[0].addr = cfg.ipv4_addr; - link.ipv4[0].netmask = htonl(0xffffffffU); - link.ipv4_count = 1; + init_explicit_link_context(&link, cfg.ipv4_addr); if (send_announcement(sockfd, &mdns_dest, &cfg, &link, cfg.ttl, &snapshot_records, use_snapshot_records) != 0) { char detail[96]; snprintf(detail, sizeof(detail), "burst_index=%lu offset_ms=%u", @@ -5901,6 +6413,7 @@ int main(int argc, char **argv) { wait_ms = 1000; } } + wait_ms = deferred_response_adjust_wait_ms(now_ms, wait_ms); tv.tv_sec = (time_t)(wait_ms / 1000); tv.tv_usec = (suseconds_t)((wait_ms % 1000) * 1000); @@ -5910,11 +6423,7 @@ int main(int argc, char **argv) { nread = recvfrom(sockfd, packet, sizeof(packet), 0, (struct sockaddr *)&src, &src_len); if (nread > 0) { struct link_context link; - memset(&link, 0, sizeof(link)); - strncpy(link.name, "explicit", sizeof(link.name) - 1); - link.ipv4[0].addr = cfg.ipv4_addr; - link.ipv4[0].netmask = htonl(0xffffffffU); - link.ipv4_count = 1; + init_explicit_link_context(&link, cfg.ipv4_addr); if (handle_query(sockfd, packet, (size_t)nread, &mdns_dest, &src, &cfg, &link, &snapshot_records, use_snapshot_records) != 0) { char detail[128]; snprintf(detail, sizeof(detail), "packet_len=%ld from=%s:%u", @@ -5926,11 +6435,7 @@ int main(int argc, char **argv) { if (time(NULL) - last_announce >= ANNOUNCE_INTERVAL) { struct link_context link; - memset(&link, 0, sizeof(link)); - strncpy(link.name, "explicit", sizeof(link.name) - 1); - link.ipv4[0].addr = cfg.ipv4_addr; - link.ipv4[0].netmask = htonl(0xffffffffU); - link.ipv4_count = 1; + init_explicit_link_context(&link, cfg.ipv4_addr); if (send_announcement(sockfd, &mdns_dest, &cfg, &link, cfg.ttl, &snapshot_records, use_snapshot_records) != 0) { char detail[96]; snprintf(detail, sizeof(detail), "interval=%d last_announce_age=%ld", @@ -5941,6 +6446,7 @@ int main(int argc, char **argv) { } } + clear_deferred_response_for_sockfd(sockfd); close(sockfd); return 0; } diff --git a/src/timecapsulesmb/assets/artifact-manifest.json b/src/timecapsulesmb/assets/artifact-manifest.json index b088e39..3831636 100644 --- a/src/timecapsulesmb/assets/artifact-manifest.json +++ b/src/timecapsulesmb/assets/artifact-manifest.json @@ -2,15 +2,15 @@ "artifacts": { "mdns-advertiser": { "path": "bin/mdns/mdns-advertiser", - "sha256": "d9f42d88969b1642d77292272f234da4aaf0a24c0a9bf2aef786e278c5a9f976" + "sha256": "6a1aa44140912d3a5623147c15a85902403c3a4e2d6df7132f9689a2c8b669c8" }, "mdns-advertiser-netbsd4le": { "path": "bin/mdns-netbsd4le/mdns-advertiser", - "sha256": "fb440bbf30716ab26cbf74c9a7ee7726e726913deabda65687ba2b47d3be12c6" + "sha256": "f32268151c66983d4e3493ca9faca0a098b5b2b330e5d51dbfb487c5e7a6cd16" }, "mdns-advertiser-netbsd4be": { "path": "bin/mdns-netbsd4be/mdns-advertiser", - "sha256": "bae412d4dee9b3bb57f7397e26af48f4940004795b6a10a85224f913e4514954" + "sha256": "8e9e2b8e3a600fd0dbdf49db6be1ea6ea4e9bba736c7d60abec8dcc8108b65e7" }, "nbns-advertiser": { "path": "bin/nbns/nbns-advertiser", @@ -18,7 +18,7 @@ }, "nbns-advertiser-netbsd4le": { "path": "bin/nbns-netbsd4le/nbns-advertiser", - "sha256": "4e8b6c6f8778aa2f186d0732b5888a63d5c966c999d256ac714486e47c03e7a0" + "sha256": "97c93dd74ea3808d023880123267d0017346f5b8a786733055b9cf959954dd48" }, "nbns-advertiser-netbsd4be": { "path": "bin/nbns-netbsd4be/nbns-advertiser", diff --git a/src/timecapsulesmb/assets/boot/samba4/common.d/70-smbd-service.sh b/src/timecapsulesmb/assets/boot/samba4/common.d/70-smbd-service.sh index e232f95..6dff100 100644 --- a/src/timecapsulesmb/assets/boot/samba4/common.d/70-smbd-service.sh +++ b/src/timecapsulesmb/assets/boot/samba4/common.d/70-smbd-service.sh @@ -146,31 +146,8 @@ tc_mdns_bound_ipv6_udp_5353() { tc_process_bound_ipv6_udp_port "$MDNS_PROC_NAME" 5353 } -tc_mdns_socket_families_have_ipv4() { - set -- $1 - for family in "$@"; do - [ "$family" = "ipv4" ] && return 0 - done - return 1 -} - -tc_mdns_socket_families_have_ipv6() { - set -- $1 - for family in "$@"; do - [ "$family" = "ipv6" ] && return 0 - done - return 1 -} - tc_mdns_bound_udp_5353() { - mdns_socket_families=$(tc_probe_mdns_socket_families) || return 1 - if tc_mdns_socket_families_have_ipv4 "$mdns_socket_families"; then - tc_mdns_bound_ipv4_udp_5353 || return 1 - fi - if tc_mdns_socket_families_have_ipv6 "$mdns_socket_families"; then - tc_mdns_bound_ipv6_udp_5353 || return 1 - fi - return 0 + tc_mdns_bound_ipv4_udp_5353 } tc_wait_for_smbd_ipv4_445() { diff --git a/src/timecapsulesmb/device/probe.py b/src/timecapsulesmb/device/probe.py index e24a6bd..5c2a373 100644 --- a/src/timecapsulesmb/device/probe.py +++ b/src/timecapsulesmb/device/probe.py @@ -215,35 +215,10 @@ mdns_bound_5353() {{ fstat_out=$1 - mdns_socket_families=$2 - require_ipv4=0 - require_ipv6=0 - set -- $mdns_socket_families - for token in "$@"; do - case "$token" in - ipv4) require_ipv4=1 ;; - ipv6) require_ipv6=1 ;; - esac - done - if [ "$require_ipv4" -eq 0 ] && [ "$require_ipv6" -eq 0 ]; then - require_ipv4=1 - fi - - has_ipv4=0 - has_ipv6=0 - case "$fstat_out" in - *mdns-advertiser*" internet dgram udp "*":5353"*) has_ipv4=1 ;; - esac case "$fstat_out" in - *mdns-advertiser*" internet6 dgram udp "*":5353"*) has_ipv6=1 ;; + *mdns-advertiser*" internet dgram udp "*":5353"*) return 0 ;; + *) return 1 ;; esac - if [ "$require_ipv4" -eq 1 ] && [ "$has_ipv4" -ne 1 ]; then - return 1 - fi - if [ "$require_ipv6" -eq 1 ] && [ "$has_ipv6" -ne 1 ]; then - return 1 - fi - return 0 }} describe_managed_smbd_status() {{ @@ -361,8 +336,8 @@ fi status=1 fi - if mdns_bound_5353 "$fstat_out" "$mdns_socket_families"; then - echo "PASS:mdns-advertiser bound to required UDP 5353 sockets" + if mdns_bound_5353 "$fstat_out"; then + echo "PASS:mdns-advertiser bound to IPv4 UDP 5353" if [ "$mdns_auto_ip_state" = "active" ]; then echo "PASS:mdns-advertiser bind address active" else diff --git a/tests/test_deploy_modules.py b/tests/test_deploy_modules.py index 10b54cf..0d2bae0 100644 --- a/tests/test_deploy_modules.py +++ b/tests/test_deploy_modules.py @@ -2872,17 +2872,22 @@ def test_mdns_runtime_socket_updates_roll_back_partial_memberships_and_fallback_ sockets.ipv4_fd = 55; sockets.ipv6_fd = -1; fail_second_membership = 1; - if (prepare_runtime_mdns_sockets_for_links(0, &sockets, &old_links, &new_links) == 0) { + if (prepare_runtime_mdns_sockets_for_links(0, &sockets, &old_links, &new_links) != 0) { return 1; } #ifdef IP_DROP_MEMBERSHIP - if (drop_membership_sets != 1) { + if (drop_membership_sets != 0) { return 2; } #endif - if (sockets.ipv4_fd != 55 || close_calls != 0) { + if (sockets.ipv4_fd != 55 || close_calls != 0 || membership_sets != 3 || outbound_sets != 1) { return 3; } + if (new_links.count != 2 || + strcmp(new_links.links[0].name, "bridge0") != 0 || + strcmp(new_links.links[1].name, "en1") != 0) { + return 16; + } reset_fakes(); memset(&new_links, 0, sizeof(new_links)); @@ -3354,6 +3359,38 @@ def test_mdns_advertiser_routes_qu_qm_and_mixed_query_responses(self) -> None: count_rr_type(packet, packet_len, DNS_TYPE_A) == 1; } +static int legacy_unicast_ttls_and_classes_are_capped(const unsigned char *packet, size_t packet_len) { + struct dns_header hdr; + size_t cursor = sizeof(hdr); + unsigned short total_answers; + unsigned short i; + + memcpy(&hdr, packet, sizeof(hdr)); + total_answers = ntohs(hdr.ancount); + for (i = 0; i < total_answers; i++) { + char name[MAX_NAME]; + unsigned short rrclass; + unsigned int ttl; + unsigned short rdlength; + + if (decode_name(packet, packet_len, &cursor, name, sizeof(name)) != 0 || cursor + 10 > packet_len) { + return 0; + } + memcpy(&rrclass, packet + cursor + 2, 2); + memcpy(&ttl, packet + cursor + 4, 4); + memcpy(&rdlength, packet + cursor + 8, 2); + cursor += 10; + rrclass = ntohs(rrclass); + ttl = ntohl(ttl); + rdlength = ntohs(rdlength); + if ((rrclass & DNS_CLASS_CACHE_FLUSH) != 0 || ttl > LEGACY_UNICAST_TTL_MAX || cursor + rdlength > packet_len) { + return 0; + } + cursor += rdlength; + } + return 1; +} + static int run_route_cases(void) { struct config cfg; struct iface_context response_ctx; @@ -3382,10 +3419,12 @@ def test_mdns_advertiser_routes_qu_qm_and_mixed_query_responses(self) -> None: if (captured_count != 1 || captured_dests[0].sin_addr.s_addr != source.sin_addr.s_addr || captured_dests[0].sin_port != source.sin_port || - !packet_has_smb_browse_additionals(captured_packets[0], captured_lengths[0])) { + !packet_has_smb_browse_additionals(captured_packets[0], captured_lengths[0]) || + !legacy_unicast_ttls_and_classes_are_capped(captured_packets[0], captured_lengths[0])) { return 2; } + source.sin_port = htons(MDNS_PORT); reset_captures(); query_len = make_query(query, cfg.service_type, DNS_TYPE_PTR, DNS_CLASS_IN); if (query_len == 0 || @@ -3399,6 +3438,7 @@ def test_mdns_advertiser_routes_qu_qm_and_mixed_query_responses(self) -> None: return 4; } + source.sin_port = htons(MDNS_PORT); reset_captures(); query_len = make_mixed_query(query, cfg.service_type, cfg.host_fqdn); if (query_len == 0 || @@ -3777,7 +3817,7 @@ def test_mdns_advertiser_suppresses_fresh_known_answer_a_records(self) -> None: if (query_len == 0 || handle_query(1, query, query_len, &mdns_dest, &source, &cfg, &response_link, &snapshot, 0) != 0 || captured_count != 1 || - count_rr_type(captured_packet, captured_len, DNS_TYPE_A) != 2) { + count_rr_type(captured_packet, captured_len, DNS_TYPE_A) != 1) { return 3; } @@ -3815,6 +3855,281 @@ def test_mdns_advertiser_suppresses_fresh_known_answer_a_records(self) -> None: self.assertEqual(run.returncode, 0, run.stderr) self.assertEqual(run.stdout.strip(), "ok") + def test_mdns_advertiser_defers_tc_and_matches_structured_known_answers(self) -> None: + mdns_source = (REPO_ROOT / "build" / "mdns-advertiser.c").as_posix() + source = r''' +#include +#include +#include +#include +#include +#include + +ssize_t fake_sendto(int sockfd, const void *buf, size_t len, int flags, + const struct sockaddr *dest, socklen_t dest_len); + +#define sendto fake_sendto +#define main mdns_advertiser_main +#include "@MDNS_SOURCE@" +#undef main +#undef sendto + +static unsigned char captured_packet[BUF_SIZE]; +static size_t captured_len = 0; +static size_t captured_count = 0; + +ssize_t fake_sendto(int sockfd, const void *buf, size_t len, int flags, + const struct sockaddr *dest, socklen_t dest_len) { + (void)sockfd; + (void)flags; + (void)dest; + (void)dest_len; + memcpy(captured_packet, buf, len); + captured_len = len; + captured_count++; + return (ssize_t)len; +} + +static void reset_captures(void) { + memset(captured_packet, 0, sizeof(captured_packet)); + captured_len = 0; + captured_count = 0; +} + +static void configure_base(struct config *cfg) { + memset(cfg, 0, sizeof(*cfg)); + snprintf(cfg->instance_name, sizeof(cfg->instance_name), "%s", "Alton Time Capsule"); + snprintf(cfg->host_label, sizeof(cfg->host_label), "%s", "alton-time-capsule"); + snprintf(cfg->host_fqdn, sizeof(cfg->host_fqdn), "%s", "alton-time-capsule.local."); + snprintf(cfg->service_type, sizeof(cfg->service_type), "%s", "_smb._tcp.local."); + snprintf(cfg->adisk_service_type, sizeof(cfg->adisk_service_type), "%s", "_adisk._tcp.local."); + snprintf(cfg->device_info_service_type, sizeof(cfg->device_info_service_type), "%s", "_device-info._tcp.local."); + snprintf(cfg->airport_service_type, sizeof(cfg->airport_service_type), "%s", "_airport._tcp.local."); + cfg->port = 445; + cfg->ttl = 120; + cfg->ipv4_addr = inet_addr("10.0.1.77"); +} + +static int count_rr_type(const unsigned char *packet, size_t packet_len, unsigned short want_type) { + struct dns_header hdr; + size_t cursor = sizeof(hdr); + unsigned short total_answers; + int matches = 0; + unsigned short i; + + memcpy(&hdr, packet, sizeof(hdr)); + total_answers = ntohs(hdr.ancount); + for (i = 0; i < total_answers; i++) { + char name[MAX_NAME]; + unsigned short rrtype; + unsigned short rdlength; + + if (decode_name(packet, packet_len, &cursor, name, sizeof(name)) != 0 || cursor + 10 > packet_len) { + return -1; + } + memcpy(&rrtype, packet + cursor, 2); + memcpy(&rdlength, packet + cursor + 8, 2); + cursor += 10; + rrtype = ntohs(rrtype); + rdlength = ntohs(rdlength); + if (cursor + rdlength > packet_len) { + return -1; + } + if (rrtype == want_type) { + matches++; + } + cursor += rdlength; + } + return matches; +} + +static int append_question(unsigned char *packet, size_t *off, const char *qname, + unsigned short qtype) { + return encode_name(packet, off, BUF_SIZE, qname) != 0 || + append_u16(packet, off, BUF_SIZE, qtype) != 0 || + append_u16(packet, off, BUF_SIZE, DNS_CLASS_IN) != 0; +} + +static size_t make_tc_host_a_query(unsigned char *packet, const struct config *cfg) { + struct dns_header hdr; + size_t off = sizeof(hdr); + memset(&hdr, 0, sizeof(hdr)); + hdr.flags = htons(DNS_FLAG_TC); + hdr.qdcount = htons(1); + memcpy(packet, &hdr, sizeof(hdr)); + if (append_question(packet, &off, cfg->host_fqdn, DNS_TYPE_A) != 0) { + return 0; + } + return off; +} + +static size_t make_known_a_only(unsigned char *packet, const struct config *cfg, uint32_t known_addr) { + struct dns_header hdr; + size_t off = sizeof(hdr); + memset(&hdr, 0, sizeof(hdr)); + hdr.ancount = htons(1); + memcpy(packet, &hdr, sizeof(hdr)); + if (encode_name(packet, &off, BUF_SIZE, cfg->host_fqdn) != 0 || + append_u16(packet, &off, BUF_SIZE, DNS_TYPE_A) != 0 || + append_u16(packet, &off, BUF_SIZE, DNS_CLASS_IN_UNIQUE) != 0 || + append_u32(packet, &off, BUF_SIZE, 100) != 0 || + append_u16(packet, &off, BUF_SIZE, 4) != 0 || + append_bytes(packet, &off, BUF_SIZE, &known_addr, 4) != 0) { + return 0; + } + return off; +} + +static size_t make_txt_query_with_known(unsigned char *packet, const char *instance_fqdn, + const char *known_txt) { + struct dns_header hdr; + size_t off = sizeof(hdr); + unsigned char txt_len = (unsigned char)strlen(known_txt); + memset(&hdr, 0, sizeof(hdr)); + hdr.qdcount = htons(1); + hdr.ancount = htons(1); + memcpy(packet, &hdr, sizeof(hdr)); + if (append_question(packet, &off, instance_fqdn, DNS_TYPE_TXT) != 0 || + encode_name(packet, &off, BUF_SIZE, instance_fqdn) != 0 || + append_u16(packet, &off, BUF_SIZE, DNS_TYPE_TXT) != 0 || + append_u16(packet, &off, BUF_SIZE, DNS_CLASS_IN_UNIQUE) != 0 || + append_u32(packet, &off, BUF_SIZE, 100) != 0 || + append_u16(packet, &off, BUF_SIZE, (uint16_t)(1 + txt_len)) != 0 || + append_bytes(packet, &off, BUF_SIZE, &txt_len, 1) != 0 || + append_bytes(packet, &off, BUF_SIZE, known_txt, txt_len) != 0) { + return 0; + } + return off; +} + +static size_t make_srv_query_with_known(unsigned char *packet, const struct config *cfg, + const char *instance_fqdn, unsigned short port) { + struct dns_header hdr; + size_t off = sizeof(hdr); + size_t rdlength_offset; + size_t rdata_start; + uint16_t rdlength; + memset(&hdr, 0, sizeof(hdr)); + hdr.qdcount = htons(1); + hdr.ancount = htons(1); + memcpy(packet, &hdr, sizeof(hdr)); + if (append_question(packet, &off, instance_fqdn, DNS_TYPE_SRV) != 0 || + encode_name(packet, &off, BUF_SIZE, instance_fqdn) != 0 || + append_u16(packet, &off, BUF_SIZE, DNS_TYPE_SRV) != 0 || + append_u16(packet, &off, BUF_SIZE, DNS_CLASS_IN_UNIQUE) != 0 || + append_u32(packet, &off, BUF_SIZE, 100) != 0) { + return 0; + } + rdlength_offset = off; + if (append_u16(packet, &off, BUF_SIZE, 0) != 0) { + return 0; + } + rdata_start = off; + if (append_u16(packet, &off, BUF_SIZE, 0) != 0 || + append_u16(packet, &off, BUF_SIZE, 0) != 0 || + append_u16(packet, &off, BUF_SIZE, port) != 0 || + encode_name(packet, &off, BUF_SIZE, cfg->host_fqdn) != 0) { + return 0; + } + rdlength = htons((uint16_t)(off - rdata_start)); + memcpy(packet + rdlength_offset, &rdlength, 2); + return off; +} + +int main(void) { + struct config cfg; + struct iface_context response_ctx; + struct link_context response_link; + struct service_record_set snapshot; + struct sockaddr_in mdns_dest; + struct sockaddr_in source; + unsigned char query[BUF_SIZE]; + size_t query_len; + char instance_fqdn[MAX_NAME]; + uint32_t link_local_addr; + + configure_base(&cfg); + if (build_instance_fqdn(instance_fqdn, sizeof(instance_fqdn), cfg.instance_name, cfg.service_type) != 0) { + return 1; + } + memset(&response_ctx, 0, sizeof(response_ctx)); + snprintf(response_ctx.name, sizeof(response_ctx.name), "%s", "bridge0"); + response_ctx.ipv4_addr = cfg.ipv4_addr; + response_ctx.netmask = inet_addr("255.255.255.0"); + link_context_from_iface_context(&response_link, &response_ctx); + link_local_addr = inet_addr("169.254.44.55"); + response_link.ipv4[response_link.ipv4_count].addr = link_local_addr; + response_link.ipv4[response_link.ipv4_count].netmask = ipv4_link_local_netmask(); + response_link.ipv4_count++; + + memset(&snapshot, 0, sizeof(snapshot)); + memset(&mdns_dest, 0, sizeof(mdns_dest)); + mdns_dest.sin_family = AF_INET; + mdns_dest.sin_port = htons(MDNS_PORT); + mdns_dest.sin_addr.s_addr = inet_addr(MDNS_GROUP); + memset(&source, 0, sizeof(source)); + source.sin_family = AF_INET; + source.sin_port = htons(MDNS_PORT); + source.sin_addr.s_addr = inet_addr("10.0.1.42"); + + reset_captures(); + query_len = make_tc_host_a_query(query, &cfg); + if (query_len == 0 || + handle_query(1, query, query_len, &mdns_dest, &source, &cfg, &response_link, &snapshot, 0) != 0 || + captured_count != 0 || + !g_deferred_response.active) { + return 2; + } + query_len = make_known_a_only(query, &cfg, cfg.ipv4_addr); + if (query_len == 0 || + handle_query(1, query, query_len, &mdns_dest, &source, &cfg, &response_link, &snapshot, 0) != 0 || + captured_count != 1 || + count_rr_type(captured_packet, captured_len, DNS_TYPE_A) != 1 || + g_deferred_response.active) { + return 3; + } + + reset_captures(); + query_len = make_txt_query_with_known(query, instance_fqdn, ""); + if (query_len == 0 || + handle_query(1, query, query_len, &mdns_dest, &source, &cfg, &response_link, &snapshot, 0) != 0 || + captured_count != 0) { + return 4; + } + query_len = make_txt_query_with_known(query, instance_fqdn, "x"); + if (query_len == 0 || + handle_query(1, query, query_len, &mdns_dest, &source, &cfg, &response_link, &snapshot, 0) != 0 || + captured_count != 1 || + count_rr_type(captured_packet, captured_len, DNS_TYPE_TXT) != 1) { + return 5; + } + + reset_captures(); + query_len = make_srv_query_with_known(query, &cfg, instance_fqdn, cfg.port); + if (query_len == 0 || + handle_query(1, query, query_len, &mdns_dest, &source, &cfg, &response_link, &snapshot, 0) != 0 || + captured_count != 1 || + count_rr_type(captured_packet, captured_len, DNS_TYPE_SRV) != 0 || + count_rr_type(captured_packet, captured_len, DNS_TYPE_A) != 2) { + return 6; + } + reset_captures(); + query_len = make_srv_query_with_known(query, &cfg, instance_fqdn, (unsigned short)(cfg.port + 1)); + if (query_len == 0 || + handle_query(1, query, query_len, &mdns_dest, &source, &cfg, &response_link, &snapshot, 0) != 0 || + captured_count != 1 || + count_rr_type(captured_packet, captured_len, DNS_TYPE_SRV) != 1) { + return 7; + } + + printf("ok\n"); + return 0; +} +'''.replace("@MDNS_SOURCE@", mdns_source) + run = self._compile_and_run_c_helper(source, "mdns_tc_and_structured_known_answers") + self.assertEqual(run.returncode, 0, run.stderr) + self.assertEqual(run.stdout.strip(), "ok") + def test_mdns_advertiser_query_response_preserves_snapshot_suppression(self) -> None: mdns_source = (REPO_ROOT / "build" / "mdns-advertiser.c").as_posix() source = r''' @@ -5592,7 +5907,7 @@ def test_mdns_status_helper_requires_auto_ip_when_process_is_bound(self) -> None self.assertEqual(result.returncode, 0, result.stderr) self.assertIn("PASS:mdns-advertiser process is running", result.stdout) - self.assertIn("PASS:mdns-advertiser bound to required UDP 5353 sockets", result.stdout) + self.assertIn("PASS:mdns-advertiser bound to IPv4 UDP 5353", result.stdout) self.assertIn("FAIL:mdns-advertiser bound to UDP 5353 but bind address is not active", result.stdout) self.assertIn("status=1", result.stdout) self.assertNotIn("PASS:mdns-advertiser bind address active", result.stdout) @@ -5621,7 +5936,7 @@ def test_mdns_status_helper_reports_unexpected_auto_ip_check_failure(self) -> No self.assertEqual(result.returncode, 0, result.stderr) self.assertIn("FAIL:mdns-advertiser mDNS socket family probe failed with exit code 3", result.stdout) self.assertIn("PASS:mdns-advertiser process is running", result.stdout) - self.assertIn("PASS:mdns-advertiser bound to required UDP 5353 sockets", result.stdout) + self.assertIn("PASS:mdns-advertiser bound to IPv4 UDP 5353", result.stdout) self.assertIn("FAIL:mdns-advertiser bound to UDP 5353 but bind address is not active", result.stdout) self.assertIn("status=1", result.stdout) @@ -5648,12 +5963,12 @@ def test_mdns_status_helper_passes_only_when_bound_and_auto_ip_active(self) -> N self.assertEqual(result.returncode, 0, result.stderr) self.assertIn("PASS:mdns-advertiser process is running", result.stdout) - self.assertIn("PASS:mdns-advertiser bound to required UDP 5353 sockets", result.stdout) + self.assertIn("PASS:mdns-advertiser bound to IPv4 UDP 5353", result.stdout) self.assertIn("PASS:mdns-advertiser bind address active", result.stdout) self.assertIn("PASS:Apple mDNSResponder is stopped", result.stdout) self.assertIn("status=0", result.stdout) - def test_mdns_status_helper_requires_reported_udp_5353_families(self) -> None: + def test_mdns_status_helper_requires_ipv4_udp_5353_only(self) -> None: with tempfile.TemporaryDirectory() as tmpdir: mdns_bin = Path(tmpdir) / "mdns-advertiser" mdns_bin.write_text("#!/bin/sh\necho 'ipv4 ipv6'\n") @@ -5676,8 +5991,8 @@ def test_mdns_status_helper_requires_reported_udp_5353_families(self) -> None: self.assertEqual(result.returncode, 0, result.stderr) self.assertIn("PASS:mdns-advertiser process is running", result.stdout) - self.assertIn("FAIL:mdns-advertiser is not bound to UDP 5353", result.stdout) - self.assertIn("status=1", result.stdout) + self.assertIn("PASS:mdns-advertiser bound to IPv4 UDP 5353", result.stdout) + self.assertIn("status=0", result.stdout) def test_probe_managed_smbd_reports_runtime_invariant_failures(self) -> None: stdout = "\n".join( diff --git a/tests/test_storage_runtime.py b/tests/test_storage_runtime.py index e38f640..0f8ede6 100644 --- a/tests/test_storage_runtime.py +++ b/tests/test_storage_runtime.py @@ -3174,7 +3174,7 @@ def test_common_fstat_socket_scanner_matches_process_family_and_port(self) -> No "102\n", ) - def test_common_mdns_bound_udp_5353_requires_reported_socket_families(self) -> None: + def test_common_mdns_bound_udp_5353_requires_ipv4_only(self) -> None: with tempfile.TemporaryDirectory() as tmp: tmp_path = Path(tmp) flash, _memory, _locks, _volumes = self.write_runtime_harness(tmp_path) @@ -3225,7 +3225,7 @@ def test_common_mdns_bound_udp_5353_requires_reported_socket_families(self) -> N proc = subprocess.run([str(script)], text=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE, check=False) self.assertEqual(proc.returncode, 0, proc.stderr) - self.assertEqual(proc.stdout, "dual_missing_v6=1\ndual_bound=0\nipv4_only=0\n") + self.assertEqual(proc.stdout, "dual_missing_v6=0\ndual_bound=0\nipv4_only=0\n") def test_common_watchdog_restarts_mdns_when_running_without_udp_5353_and_auto_ip_exists(self) -> None: with tempfile.TemporaryDirectory() as tmp: From dc422c0a131f8824d159a4ec3e06e3d29764284e Mon Sep 17 00:00:00 2001 From: James Chang Date: Thu, 21 May 2026 02:54:57 -0700 Subject: [PATCH 5/6] Improve mDNS query response behavior Handle service type enumeration, ANY-class questions, legacy unicast question sections, multicast response delays, and unicast hop limits in the planned RRset response path. Rebuild the NetBSD 6 and NetBSD 4 mDNS artifacts and expand tests for mDNS query routing, service enumeration, startup spacing, socket options, and NBSTAT response shape. --- bin/mdns-netbsd4be/mdns-advertiser | Bin 245248 -> 245456 bytes bin/mdns-netbsd4le/mdns-advertiser | Bin 246648 -> 246896 bytes bin/mdns/mdns-advertiser | Bin 305300 -> 305656 bytes bin/nbns-netbsd4be/nbns-advertiser | Bin 137884 -> 155152 bytes bin/nbns-netbsd4le/nbns-advertiser | Bin 138668 -> 155968 bytes bin/nbns/nbns-advertiser | Bin 196972 -> 211656 bytes build/mdns-advertiser.c | 359 ++++++--- .../assets/artifact-manifest.json | 12 +- tests/test_deploy_modules.py | 691 +++++++++++++++++- 9 files changed, 933 insertions(+), 129 deletions(-) diff --git a/bin/mdns-netbsd4be/mdns-advertiser b/bin/mdns-netbsd4be/mdns-advertiser index 7e846e22dbb86d0e5b9225fcef0a0d17cd566ca2..8987f16c3a10cecf037b372328d6f88979d8e961 100755 GIT binary patch delta 38143 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

XrfV)VIf9M?X0_Ay{dXt$J@ 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 p#Mtpy;(fva6neS7}7WwGQ`5)J>bAkW> diff --git a/bin/mdns-netbsd4le/mdns-advertiser b/bin/mdns-netbsd4le/mdns-advertiser index adda3c6282f5985b2ae79cb31311426e8ee185e8..57e0607ae9803be799387399cb9139be8fc01f85 100755 GIT binary patch delta 37501 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 UyY-yuH!_~Fjql1KO)tlP06dL-vj6}9 diff --git a/bin/mdns/mdns-advertiser b/bin/mdns/mdns-advertiser index 4ddce35431531ed759b0dedcde0ef3c4f4459b8d..6e55d1b9278c3315ecf273ca5022649104d3dfaf 100755 GIT binary patch delta 55403 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 I+wAjy0Gj!Z9RL6T delta 54950 zcmc${34D#m_dov3+$54Ki5uA$xmOm6ATEN~W2quR>`Rr{TDw$3(Q<>>6AcdrMJ}a9 zQA8UQ4PvXMC~EIrJQay0d}vj1|L=3}P37a$&+>ZxzpvM?eI4`6JZH|FIdkUBnKSd; zJo~BY((_ewb=>cZ#SsxTJZrm11g;YO$MC;o&wJK(L+U2!dP`DP?Zu-?cQ>%p;7>2!Gp@4+_7mw2B#i?>OoWn-jLU%k;P>2s9H z`aH!2btR3_%5_GoO8=?J%SmCp+)t(Lq;lqlBh^iEm14n;A0UX>0!-bLdgy2i+Az$7k(POAf%m$rHwxn-bBY)=V!IsM#U2C!C@_AR^`i-6SU7Y+h zK>m=;R-(V)BBl26mXeUVfFDVc74I^mc~hu7#4V0}E9baHy6p({mW&tVZ`~I0+6UzJ zl_J#9kdxe8DvdcHPpA~fD;<#6R*GP+lQIGFtO2P9 zNuf%C?BgEDZp$^@V_2!&&E2=osLvqvq+De@YNfI~#e#e+Fw>eyrC~_V?3YTZ<|(9u zGG5!bTUb< z<`L-Mbh%VI5^qTzcL0;9td=`^w0dtDa*~v49cQy`k)XWWoo&o!mX z(q$?efl~w_MtQhOH$HNciXbx*Y6n0H-~?bd;0eIxCl|@@C;5R#1p8R_QMY2FiCYzWu11v_Y=+#q%2z&Lu9QlPSg7Kn zF`Bzp$+R4kJv4P$d$|ez9V?I24C>u$shwr$O`h^LMn4F85rtlMMfpDPx^c9Ffp#z} ztHErkh8rX22bfwhw#`OGr(ti~jh&;K(p{B7ee z!v2+^dw)|#jNd@{{{nyCNrR)Ib57#>ohjwZ;mwL$oj7lnQ-0~+yvwLib|dtSjv1Vy zFK3_#2s;4fjZ>P9{A9og05#IincfazQW3xi$OX{5M7)ayWcj^rsGI?*DwAAv%N3@d zWnsED7D+!xk<{{c1uhk$VZ9jw5+zk@gM4gZ$F8;Jjer~eNPm)HBd#;L6Qy(7iq z^v?zVTV9|4GN2Y?o#mQAKe3?vmq9~SEINO17|Pz2bE?&1W%Ax?gCbIN7(Ku}Et5_I z_5e}=8o-NiCY4poZyNr9c_ra_9`MouX>vnderqy9!!Ei==>Qunlo9DBKyfv1=`iw{ zcrJr2Fd?6S=RvU6?nuc-I0v_S4>nkyRz1?E??T6#a^Zzd{p|}|$vk;y^|#qo`49Z7 zms>}~up08nh*Rtza>K}3?1H>E@>8~5?ilqk`&2#})r@7zEV?agB)=6M!-nUNjW%$W zoqsaamPH|1y26=Xz%ofYRwHjj$?^f%3pE;jOrIny?&o-|q zh7)FXm#f!q5IiAADxCrA<(6(Ve}|ObFj&O#^4Qvu;qRdit$lsrAnZZEb^u5ov?g}k zEpM+K$2;$quhkv`9$VCDQkv09&d4J;1}xgmS;fU!g*&TA&ML1AQfUYIexmT7_Q`AAC?EF$ z^2#PM>mk=^+L*nSKfGxb2FG_|v&QVEysep*U6Ri2gx&<2eRMgmCZwa9#3%8wY{{d6>?7Gqs^PK zwK8iF!=}kKTO_lt^28QxS-QNpMFHHV4_bz@W^zu;t{%~7l~l+eD=lZ$E1nAFl`1QV zn#u~5_QymZ9{M6B9(p4s9(p1r9=gjbTOH|CsD-*p#!n=v?EA1wFc;D@g9fP|U|B=s zQk(6^RyNx&tr{v{H}stBCKbb^*lbmRXZqe0?uzG!2Glj^Cd*$W)%Vy0COoC3#b3zg zq!>0z_GqnTbL5(>zhVRAORWcy$!pXmj(sH$Zlm=X(FV&jAPtZW7$Gli(-jgmxA6_o z*?GwX?LvbDm+v%5CR0|oJ?Q_`AeF?z8*B^P7v=N@bLE?D10xp9l}hgcF$t9u0G|NT zi4d?%4gvw~w!l;$f(P-Xe6!tg79wwa>udHv?$thz{UASWZwOe83iANBsUjTBNJqs5 zZ^sk&``)fk$%D7!C<*Cc&vofw&rNmYwmWjy969ff_IFJ?+A+sDa;qG^Q)4PS+o?W_ky&zs_vuE}fa=2S@~@0B)x^@-A|n&Uavt{JYfU>6i1{cX4Apqf>sD zu5FlG7HH19EH6)8Vpy6AM`6JKGl1Ll|E_VgZE*Bl1G7H{Z~|}-5QbPm6rd;IL~jTc zP?6EFK8`%$m6s=?Yy=<+up2;i%aCgN!ZQYp0F>kYl^UGAKY^FJeoXoVa1l@jAS5C} z<@D^?AAT>O10WM%1W@^DXIlFm_{4x4fENHA-lYP@05So^-QmKo%2V_@+B2?H$d$>D z>aj`PpPaN6(21ph`Sa$@D@K|N7*k1-RwLaC(9SOHHVzKkSb!YWamhTCeYIsvTp`la zfK7lsfD?c#fE$3mljRx%4>Dg_8CaK9lKlrowtNLMcbn83`+nLLN5NwJfil|PmZ8cM zK;aZODe-6Q6#-d*6#yL|<7au&Ap3OxVh~Nu{NDzx<$S}>^70|^>{t2dkgn`PzW>m! z3>I$qut+vIfBvxRoO#Q`-~W&el&`-3ejMNEu z$ZIoNvTFG^Gpr1j?9ikJY*qf#Nef+Dcfjir?Ime4VBR~Dl!*K;h_?;qFo|{p`ga!j z6)h!ud_j-+!n`B|`w(Nuf{cEY4}B8KPRKVuc^lqn^faw^dN@30nEqT)^SmN=pSGR- zEVJp2dCx0y)9DfHfc)W-U2OOm5WJd6dSMs-H)?lnk{`ncBUD%WS7IQ*XB>VpJ53-l}!3%z5Y`%PV zVY6yevDUO35~_5F2vt(5Lec4Cp+aaG^Hk3V+>n#76P0ruE z9IOwQr>tn@<`AiTa76?=E}K`xR6X#KBP2K(hMi=c9xjKhoW!*9;+3t~Lizm4K)2Z+ zNhJxBw&(>nI)nau_z^~W>5D9XLD>OWH^?R-kAt|dr!&)+9&3HCTezYdi$##Co+6Roi zls$|Mh>$U`ygU7klbB9EZ|urEyqhs!6{?{_2fGViLq;PVMSUtr|+R|qT}mAy86PCNV!fgZiaJL0Kbpxj}j4v#I);xTjMri7Q{q*5!`@xzR120uij%TxSd zWqwCFEyV3+xJfTSVR?@rE>hiD5sHYgK}EO%ge){3}sM;ez{T!1rKR*$6|6*Ae|;S)mc1Fk`4QV z-4=|KN?t%6_P^pUwE1ffOjQ|PK-eS>nv!YI!WY+J5Aj?Zkcpn0M*bWi1F`liNG}4i z?z>2dcz*-Ww*e-=JwP#_4Dbx_1aJd5@4xrnduL9cKHU?~0{~+Hp8&D}#v3k`r5$+K z1K58%4-Zk3v8DVKLI zdF;^`bYj`j2Gofkj&@<%{NQ7)7}kq^#~W1j0ZT-K*a!m)VK?Qq#{=pdL0mH|6#-_c z7wst3l71N-$e6?QS;~IABel@OT2R>@*?ioWi2rsx9;-q0iAbK9BX>Fxj$?(9C$t`m zfKOd`E-yae>oXTQQZ`aRH=WV?K>p@LAOGvv`<_D^lGMWtUpXXInr#^&S3jv`4dm7* z1KA?E-^oa}OrCbKRygShvAh-Crmmj@yq04Av6D3zPs^4c{IG=X&&K&^K=5|zMZ2)3GAZO2dGXn|nMJ;Oc9vnpPuN}j8_0B) zXCUoa0jHhwIT2}?^I3AHPcFd20T9g_&h(r!{hM|SQqjMEDeZB-+ln-|0$!%`IRj~$ z^Et(tCLv95KF2!KXFoz9m=JaKMTl-brBSr*$0)Kix&Jvexhdy<5AHJ3VMS7wOMY3{L%l6Bz*J=@R{cG7$5d;I@z221_mA73F#op)SbuDWv z-@P8mn&x}m=*rz36Ivc}tBc3B_b~Zjf1k;FZ`Eb}<-4~+>vu%iR?RZSU0RNz>So2h zU!6^OkU5oY#ioFy){VmuNhma$zeZbApX-h0Dki8ynbABk&0$NHKed(q_{vs7Y}N+t(|C?`iei9V z{nx zX~kyB_e%^glVeM3ReuGdJtOjzo>l)@Q0^$FxpP?FTiTfImLHYQWlQ8K_gY~Ov-e&k ztz!3Ls$HZ_2dFdYBkK-nzNK9u0-Ml)c7>G{ECBblupzDQN7lTJ;dl-aJ32qtvTcY% zhll+&oI+^~0X&p*?l)+22G~|$w*(eZG=Z|G20_t>G`;3q5>b8@@BeOiiZDDd?EFFR z=$T-S9L93Aa;GLW)v;sA#`N})r#*;-v$^hpZ-@$HJz;prE7rpivJECD$G%RSeGs7j z9bA#cdpcO2{vd+glYJhBsud^BJe}O=;T9Grn;!^3~;#6NhT}B zxQ16O1BVn6B2pSVsr=y9FD;RK|JFa?dVfd6 z>;>MgK+OSw6D9Jo-#T$SVu)P(_r!qhz@nX1Io23ER{qrAy_tVQ@aUo&Zc zQOu11dCjwr-Ke!^IywB0rW~ik{r?yeO(isfL2yfHKTa;vLMSP1im}|Nuvt`Bmd$_o zMz6p!@h0Z9H!xqy-JbtF=J+=-9}*^CF**Oe=Pf;0<${eWhSltWXyM9gv6o_`E3>_K zq6(M(6L@O4MDXu${@r^$>JT{UiL-7j!jSF8rQ2!;RD7ngiuorVuk%!1hZYSV`l=r7{h0E51v0<|~%_y@68^|F+uTAW+`WMIbK) zP`(^8(GZnQc1r1-GhK?5h-U*g$jMYs5Rc+7-?xTI&{! zb!Tlo*)g%xk446J@8OsN8YpB5l-CnW4h4)-P)-4)1o#qHpztG*4!bD0KO4t*!3X~A zeP$@uap^^r18!7!rZSi6uirhLZc#P+l>&LRn8|z4CX%ocW9j<Il}0)Ki>T3#m*os3gmGyYE_hUA zU^N<~vfa*x3!Ui|r0ytBhXfLw4L(D@2+Uup(CBXDsliR6br5^oXI3BF7jX?$XfsUr zMb?XzK}^f4h`m8s%2`zlZBXc+LW30#*S3^yGr}(d^sG>>Ke?&qjlx zk@eU^#%73q4VZxqF1Xr&-C-=S;7~*6%YrX-l1f+oZYx>pou_OH&r?>!=P4Un;y9$> zek1mk3mYd^HiHdYUU0M->%my-g5Vac2O@@IY!d6k9*Lt#EQZ}FxSz!GIm;94+Coa5 zMa_0-d7xO<4psYzL+v2JWMOW{#1LYA5?qp8q{Mn-beT@n8zH6BWZJlKp22d*`3|L_7-c(ss*=_O7*N)Zu0&NnV4EYTXlGW5v2)@~7i3R~ zN7!7mBf_UElJ7*luB>j;uiHtb8!(SgBT%svkP4QA9)NA6BLF>7_6*Pt&-0MdnNJSz z(bTH0Y>tls_37qQm|j-yqx>ULFO>xbq=E#I%SAN`PW@=FQZO);amH$i!QH@54KceL z7zq~}k???aVoMKXZg*pv8aO8W7p{m4;)b|#a3eyxvl<9M3y?i4G(A`X+a=!W0n*#V z$Q~fQQOu`gjo93S)s0`=_Fsw41D~5f@b8I-2whL+i53dtdopjv5=4t$(3p5JoRTP! z(+h2dik-b!gLrRHU-O0_3qif`Z>b}K9-*05e%H)CbZ(M3*O{FVo_)}de9^iOXm1z8 z`=A3~h}o2^6&w3t$d|@4h7eR>G$rh&L4t`!TIYeUPK@iC!%3 z!2)?)8ybiB`0&4JCE+2a_uux1hT<=2iM9P%eStHQSa=bC^oNAf`!n|%cUwDDr8!ik z6p|VPYNR8c0MZe<|A@gv<^Jp_)r+iA=&X|Dtg^vbMfcBD+PuR$1#EEQJ^`64PP~Ns zV*NX;d(|87zZrhn(suR*Cpan8Vh9Cg~wpl0F$%DU?#jKW3@;D%o~qXm{G(Aiz!3cm+ZEvJ`}vU zi+)3)bf?7(B=s89M3Xp3zzyLLIzYM?kGu}e>y73C8pj=t(t7qXYf5uiL~(T}d%ML3 zu;BtUSD+oG*XgK|`MOE~m8BWYC;o=qUh(cQyF)mC82H#Ab`FCHejttxV-38Ppq@ME zdVuZ?;W`{5T`Fo0XQ4H7@P;}~^0}aQP|vDBogxvmTul^XheO5piJalAZuQX>Fv`0# zig<(l>(De$NftLj+`l`D%DY3GZI){^uNGeKu}~(9n(wjEbt<95nba)a)(6pY>;?{E zc6pT>S)Dla9($*CU`3*7AewG8n^4xzNv3iIGM*L4lm`v}5bwUv-mZ4l*;%Sy-but0 z&6V`Hyde&~&kER1F=YfB+WOA~5=*K@!kw2i9DLN#` z)$$w4M*xrZ)U+ok71c(vxvYiQI1&}Fi1uW23|K4{-arAe}5F`(kUfgAr5cO#da=D3?9wCV?T>( zW1tMDMaMC$Eh`W?W1thq#5ZG@)++*$W70{6M#c&A7&esE6K{=WgS=Xx2Q=7e*c*N# zc8+DUqQ9bvA@#Px1gPDlK4x4I@}*Njk|t>@31GeGH;#2>i^S$}EVNo3%&u$@mp>W4=w5B4IxweyJuJV8k>gn_uPYS>RxiF8 z&yvIG4hI^aYeekEv=C~75)~f8G2v2A6UZ+sa0~FPu7$y3pv#(fd;rap7))^1} zbyAu|jcskY3ap}$z{HJyW!pk!vbo~MbwrAfFbW$U#mokDHB+-m$pKO zM~m|l*k?YcsA1^d07RZ>q&&p558-i*6vH#vAjZVe3|OQUV(dh=5Oej9iR^8bQqX!5 z<~yrWF#IE!wW=fFGg45(y$oXtz^-7?WVXDfcQaVUBv+-Xca|k+aF!AVfM!{H!`F$G z{O!-=v`!SAr?9#nK@r|`^~S1**;CNU58})emds6)MaWcE-=``$NE99f0jg9_ygQY( z3P?w#zD*r40Nd$=DO~E?N9>vkr>K*-1Qe`#{vWfpYPtw`5AGNU4*3{+mb8NNAG7g{ zH5RR>!GEcT`}#ki6YbD}M8IUgyfQIv8ViTtm@^F%?OwsQY3y^xibOX9lwT^CVqh|3 zNy2Leo68!AWiueL(1NEkP|8yWiUqS+BmUMvahTG^0}GzdVwX9r`}sMnPp2E8e-~cl zd7M380JM9A$Oy_tYE+UA&pW(SQVHIVz_T838t+yBJn{SlXVQCywRJ`KK$5u{H? zJP{^ei!k|$+)(8Ngkcpk7O=O2fAzs@7!x?LA&Hqw6?&bI*QbPe0juSmHr>sBOom$t zTZ-n2kcI3Tgz|JDv^z)C$;OiRr5K#euER@hk;6v&Y|uE&#Yfs?%h0+;t5NLDVV^?E z9T!2$cg4s>><9}Jbv^}yb;Yz#A=P)q%}=3nvjoesjF>KN^@xfy7bYE;<47K=0++7SJIl^@bi}e2^Q7R44 zJ3~sjCTkDO;3uNR64s1;E9%M2Pvk6N@32*l=a)-Bd>%b(+1H|*40032Vwru&`U=;j zSjp>)HA^AoXmJurwJ>xT-y$h+|4L%pgerO-s!-=8-BQJ0_$-6AzY_hHL8tx@GnTQ? z@W<#9RiGdf?YKz74(Y;^c_j8NWA$P7?=NF@tJVbLWWi(UsPpSJ#f8%g;+M1cxSQup z8Wpi>1>47#h+Zqfadk0&C1e^Qu2Rllc&)-#aE5raihag1M9ycdE*l{Ze1<;vEBNCx z_A_HvaefW9VVgy_wV3G##K^Vi)h@AYEqZ)GTw2Q_t2TlGIZa9lCk4bHM4J#I8IRkDZt~4~xq!5pBd^za=^v z!R9(K%?Qa178_AmJ(|{Ej1#REF8Y&qXvygT4k+mT4BhW2?iw*D9fZd^7W!^WG_(l~ zQE;s-Fm;G!(CI)T%4rW|_uo+7n2aDy4^j983}pbe0%(ipRp>Z3rr=!Axy}}r1YyJU zJ`pq4fv@XgGZLTau&l%j*>JMoRfTySM0Hqrtw$f87qniFeQ34Ev_7F7y1kbGp2nhv z9z5y66Lu9FSzv@eP?q5}p&dj@!|3u490P-$1f)s-C@9&;CNQr|CoR~BlFee|m+X4* zBruVIIy*qRBS>!r=^Y@QF5cY)E{2N5n=p#+ip`r?SNoym6%Z`~Py_dnCLyIpo;?-; zo7ocfP;B0e{f7_eUIAVD=42%3(l;kzpi7R?MU)SAb(|aB^fT1F}vDrRhD$t+cz*~%IRx37cGrabvs?spcHsKa#$uNB=R=ytAOoZ6!Dj-dhtQ}RosgC(8z{w+j$?XwSPlo2 z3?r{)w0=wT2QDRMq`FAF{FcRp&j&h1(20}@h9>1(_?VhJ<(i{wZ3Qz z7C@3G#hL<4|Gna70qYU>ah&5jHg^o*I;bR_4p3ww4a;rw4mb;kunGav6VZPUi({XP z*?S=OK4SP@)<;bkggK^@IJTFyQH_}5CJ*uq5Y_jwNIqhUXul7^k&R-;K8(>0v?S@5 zD~_o@%S2zR_=%nSV72muc^@o$kqG{dg?b%;Go+T@H+i7Xo}%@4P@tWn-*-&gU^6yR zd(kbrrqT}DR(?(8bCegLyu%a3LI4^7&3)JaF=!_b&|uCdL1Hws_h7RXBhG(kUyh!B z$3AA4#0UGCHo9IaP409noLTi&XlIqCDhv1MVZ|<2O&0oaSE;nO_+~$g>79!9_Mp8^ zm_R{#$ErhjPun9erR6Gwz8&ao?DTcJ4hxgU7Xkf z8n*#^0Px_xJqUxGC6t4#t^YQ#(go|4i{5cPCkc~OCt7^Z8nm%tQ0Sw(sX(DA==aoN zG3}q}LCRz`@#SA>(BG6FLV5G21-rgy(B?W|jjq~K*qOd}EDt-!ILk9YU>JZxQX8I% z<%if=zXvh6c8)rQDBl5i0uZqic$ipmnDu3u;?ZH);6hRD2n_W&@zxPYB43O=!b0P` zyO5-_6jD_J={LAmusf12)e^>JC9L`^fA2DEkPKq`5w^-(GPv0zVVBVy%6b=JBAgdf zia_|dSXYFwoE-zq(^VSDP;jA$EpUP3{O(Ei5%=sYE}vvAJxWrrA;s8^5Y>Kwbvq-v z{lGr-T8vUsoD*=tkBjp^u$W-DSEWA9@$D{Dn6__z`nHyfIMR$3KBv&7X`;m`w5$=s zPqD8VHgBidc-|$YV9sfHs{=oJVY81#2KuxbV1s)}H%y7cJ;)aVaPDY3jdU#F1|S_! z1ULa01K0rA3fK)e2lxPxf~%5#PX#~AnsUgX|+1?t};8YN=X1vZoA6x_c6o_*&(ckrtJ9WE^((dJSx{t~O{Zjf#v za%1_=;QkAu=5N4%tMfm;Z)7L@KO#$MPG&U)oo}(@D#M6-T-pQXE5g>&f6iBY_ka8x zfUw}dHnz23vxU|2s!#jbfZli3eyuv(oW5}=|Goj=7TEA@Lu>keVTJuWh_Y6zU0o$p zc!66PyX?WAxfa~|gSB_%pY$oHVPm~L@F1qU^9KQ|G46FgV@ymogusUzbsQ#)5e#`zaHOl$WzXo4!C-k@`@9m9=OcrLtPZA;$C)7wSoDqVu@E`~%Cbpj{JU9hEi zE15S&lyO=z4@DGZWime!LPnj8d%0mBfQmf<**Y;Ph5x4Bfaeu}i^zB8OZ;DbX)Dzu z5HIOq$aS+6GFyL$YF&6&riig!cmwr4VBZG7oNwvEd#m-;U8OJp^6IX9Afn78yYhu> zzIfV|9|`CS&S`@@po>Z(%qR!u*;GhdQ%i(&;}`rVqb$u{jwm|PJ%CKXy7SKv++Wk3 zANToisSQ3rs?R)X|Zqw}e1xtEyiwA2dCJy4q zy*;CGSOjn$qIOE-XVo2$Zw|odL=5IL-DoUc3=&%g^G+c-M{T7aG2DQ}RGJK&d4Oy{ z;S}LLgim5$iP=Li?!Ck%O58;BP~OZ?JX9qWRe)y|o-3BqbJ>4*_a^TDn6HZ?vVUg4 z^dA~294fqr@lNqST(*_olJJ4Oef#SDS8vauw^9x2v76n=AW0NP7t9&P7pd5X!hZzs z8Zs!_ev{LB2=y79lIFGUK_>WY zN#ED^G01VD5cZTPEZJCv%kPy>j>4xuPD@8t?#f36TSoK8?h#ER9EOZi#2T$j5v`jC z!^YLX zxG;@hW;?{@={zQ`7&vrgdMRcbwHFoRDwUz^3V=cYbo}`(@slZ@Pv;T-`?L;cjY7-O z@bq_MXcvfj2Hu$aYsDx7k7swpN&}Dae+QVf8*=`vNwFLJxaZ=Mf!9*ELnDcRj2NNL zlce*`hr#*pa5ftft8MlB3GZ3(i_(cOR(fI`3?0DV~3&Mwu0=QH^i%p)?~;TiW9 zo3nUZ1g!37@y6fGB=8pN4chq!ys zLt!Rh58z6y81*T1YYyUuJQC||bT04XO$%KaRRzGp`6MzPAQc+d%hKE0?Lz6u6Mr6Kx#tyunG*6Ii+S=Rkde1(k8}xSE|wc%lD|O!k%!t}y?Fhq z>N>vM+XNFa0#(ugE8@hr>v(_mLinubv)J{5W$SqXNBp+)M*d~>p~oCu+e3{3u6(JI zR@c>@+%FmW>{cHY;c~hnd#3><7sU-&Pg5a}>Ll!utGi`M{~D|f-T5z1scO2OG(n3-zAduGQg2>*sRRk5j}-yVJh zA-HOLd9x6@k4ozoUCwTY`@anlC8Tc}Cf^hj_VV_1T~6Z4)InT}0teUU+Ua- z?+lB7Gspg6N!JTVlNOq6mvh9Oy}a{Vntixe8zJ zuFkS7MLrCh78UXlo>>+>E*4SVCZ_D;$-z-4xDs|kQfedhJmIbQonQ(M8Lckj=013Z zMFkzdgM8fjeQzuEtx_;yKku)C1AgXvZoqj(=R)2pyw6@6{E<{^Lx?oVJx_TOfM6$L zncRrqn(!7|3L(4=;(Q@*R&7~xeo$re9R^AOkigcW-# z2<`n1PjNC5?S zzKzs`v%8ag7T9{Zvid??f~YYGuMve`gfEh4S|3@ zKjk8gM_J3$IHEw=Gt}vi=dkLyk%x2%^6LSI0sIU?x35%EY*3la@2<@j{-D_Zvg9Z`-Whje3iMz4A%WSks2?6u&@DK+heIHQvQ`A%2>ATNuE~wZS zgr4DfG+ulF_!!WkPMK}?DG_p#ck)=gA1)Qb^ky;kBzDj9zj17;P573}6|>^0$yS=w z=%Nx_Ez3fmHidJ?SJmyjNWW99QOM7$r&Uz?i+AXKP2`_d$j1{tt_768k3&AE1!&>M zC*jvXUibRF!5V>r+OG@j4JKB|hv0o#g$4qUe^DV{6?yjx_}<88RLJ96atN6YDbd%? zfEV)Yoh*y1-e~sm5(|FdYL71`!8HCrW^m09{2d+>BA)-i!&#{aK7~~$DUm5*#syU? z`G_v3VDFN|v{Srpuh~@~k$UtUPY>%YNUs=;)`rWj(x10Wral@fBSun5Quwqm*U0J+ zGios7u0g$2>wM&IGMZF-#dH=KqKlWxUw@BV3X!aq~ys zxLRjyq^aW(SVV#(qm@3lbk`Zp@z^U*7WK~Yy0~pQ_#Emr5i`zVUFs>;oa1kIZv(l~ zf^^SA3h@G?k3FQ4_IF9vxk?Te*6bj33VgVMR-(IBsRhv_V|g^9oVHwzGk}XWB>k~F zl=t-#Ezd)5JjA=_u_PoVdMk@DlJ@R^y(F>tJogPQ0wrCrRtW(mmDJDraeNlP;;wbo ziv#DuVyU=!o(DFOnrIao6_sYm9ZzZ1-A_UteY}a^uF-pFl`K#|O^YjT_R=-5yO^Ie ze}58nF7QypXeas=pu3}MpP_5RP;Fs2P3wgwSIrDdo)f2%(da8f1m|Dk_qTvkJ&Wwhw^ z6OU;)jiww)5(9k^Rm!=@CN4ComZsq12GFTm?_yi2do!)#E_R|d!x!Ho3#M&4qtyei z*CWq8XInf_<_a#pBVlBwTB1RM^rsc@RCvDvcwSz!EiBAvO{)ct!EHy3yA5n$1Q(>E z37=`RE&2MT=EXD8aD{GZ*kir=fGM>+&oYl^boT`6 zP#F!3du^@ai89aTudT}xOxBi7P+#9xlwRci)ipRgmyD^F#$X~{Kga&P6_dJKrNW;q z^$}(D6xA>hsAzJRm`)6sC9 z-QhN$^}xZUn^e-yORKc2rfsTVYCwwpte#NM&)ubvo)s!WW!YMHhcAcsDhW8N+@%tC zNb8^&ei`hMWG6gw}&nLHfZV8C%`khHhC6tKl3E*L8$n6~eCDc|$MHiW_A8jX!?kWi z*jh)N{F!T`*TPEggn6O9-9~+SrE}J81pYjvd6u5S>k3S0ZPEG)Z(Kbo(Noa?Yj2e# z%W0@=tGmgT+tt@94%^iowrk}T-qqur7TN|ht9W#UM-K0ScGkmK*VeSQflk=CI(Ra#r{yEA68wTak4K}$>~Y_e9RIQB)f*d`@v zltkfmjcYx2;FSxAE)fl{VV(UG3joPzkC=9i2lAA7vHTjZ(QpD5DYEC=ZeVz7;f5h< zk;?Y1lBevij9~@^yI^9OLie__f&WZALIc>S`dsIMaW23ttY+_kS=Btt@-CLX&ry?> zLE1^twUQQC29481_v<_Yhv*Zp^GE}Id*Z3fQF@{(dHq2*|!AJDaD>jBjJ{EL><(Ni*+~gV5tlw#9Rk zN=Z1OQuHmrNGkmpZZGQs_%x)@W2i3hX0~ighUG4oQcWt&AyYUMSSmbk*$)GA&l4Sm z;_JXD4v`m{LVmTCUU3$Z8T-iTOKgSK4nWWMV?#~lB!S;x4ak$-h<7RsNi5#=1Wq$Z zO%Dl%feztKg`~3ZPUFl^LLSz@dasAAv^MaG0b^~@HGuGQ1vd(uh15_VCj;4N%PGijXy%Z8ITN>QJG7H7guYNa-kpbLO$I(KLmJc}5iW;F=b>y&h$BBD zE>D?L%`tXmaGb}0vHd6`rv2Q*|LSNhhg)aB34o+dMCIln@(p@G+I0-q7)UcoD@h~i zwv>eTIuI*YkX#U5Y_^paqwWh2hun+dDm=#+k!H?iJOQnCU}*D#8?w7 z%x5CU#CwFfNdu{^1sRDD989oxJ^9Y8@Ya?>Y4Kf=S<0)4U^9NEhU1PF zE>12sgT&Wjr?oHoo@sE`h)4nGP4k-P`VF{UWYf_&Y;fVttezhPf7|p^x9XneB!wh||wKgrvG+Pm(?t z<$cUEL37?QhyKxIkdH^3Xgwh{D{%I|d>ujT${rk=h&p{6iRD%v?(YJAsV}ZzK?Pf4 zZ%3T8^5klXL7qzUSWoO?JQWUdlS%U+lEk2Jc*XT@!=Y#{-nxy=!X#2BvWy@=Zpc6} zON+**KYn7>ZQjTb)-X>AGUYfnnbP7rBrkoeuM*{txtZWlZ!!+)&h1bz$qK*x z(4~W|beH~$nbbQn3gi=Jn)OgJRU!qya+D|+{PZH8-7zjksO&`wrRm|N6z15c(&O>A z(sq7%wUrkQoRbt4$goPW;c(Lyn$EzNB^@lQM8UjN_}7w%e8Qs*m0TqF$VRKru8K>6 zZ}FQ;!Sa{3eJ$?7EI~^UlC#bk-^JotRAKZTrpb)^Z*fvmj^fdb0t&K1qtZdjxoZN) zw51*f2FW`0&>F4Fs#ouA@C%9Y8guzQa&%;Cae9T&0SAqm`r1R>)9h0*5%*g^4x> zLAR~-9Wqs=FTE2sB3#id!6X7slegh}7?MM^VTv+)-Q{J@l3?ut7ez`@loyQs)w6El@`2JDi-Q9CC`F<9S8 zD~RKdoD9W+A$-oOwlf-ARcUT#sJk^048TdH>Ekm3OdP<<`q~<2+b#4&=h!fv(K-V@ zidOFm>%Hi1RTX|aWeI+m#Gp&Icr2c2qDKE*)zK2=&Jo03NTArhqS2T`BQk}g- z=FQE|L!cz#Q0t~D0 z&ssp;t50pkNQ)+w*}gxGk0}t}OG0Za0NVi103K)Y`-^}vfGogmzz)O*odHFu#gF*0 zF2GIzh41zty?EY5I=lx#RYZB406Lt*k8AIBk*4E$=V1gPH=v+A5-I_?GvF@bflH85 zkkJStX*1oV4fq=deisnlMR4(kt0WylIseW@`WkqRKqCXe#;`#y(hQ`2z&QaLNk}OI zN|DbZ#1|>bN`XojY{sV$-d%$uH2OW_$IDSb!N`M1DQX$`gCk-|kzXU4->1w^+2E&1u!eVju%r9^KRXXmMT5vAEHcqJ_}~ zMm4L3L!t0Nl6nQxDruNH8>(v+cQUx?4ud;;oWopZfQAGEUszA86atrQF4@~O94h<< z1*91=!|AWE%y~mBZc<+>uD-5H0W!@=;+`Ckp%4$5wW#871g`p8CDVN6`FP{3HgHy? zblkc}n3De73gYQjV$2=C+E2f|LNjRwoC=lXQ!MGao0!;J!W$TB-m;Z;Sg%!{;|m+L zk#+?D%vMkZAtoptnY_A z9Q~$&`nw%Nh9qsdS6^$uYD>KKux`K%-AsaL3O-Tk)3I6LRaKk-+cg)LW4?yL4MKR8 z`tA+~iOhPTwDvCbOO>|VB&C08?;mx9I$-Z-T5l6eKW=ivpWmod_>+mJ8F#AEjo422 zhTML(Y_b{f=TFk`TTLKtA8q{ZY7`b9oL`%9xnKPZ!lVtE27*+ zWO)K<&udT;O*Dg%49Ewk|d}=^A zoqCj@k?l@J^H^`?K5SVbRzgxC&m@N$w!l8Qd8`J^w6@HF59SB;)aamMD5C~~@azZm zn&*olO3?nr05RAO(j&XK5*^yjLzIa2{S|A)qPv3!aSQs+pY z3eYiAWb+DCr!FFxUEIKfx`^%&1k*$ zH54rlzb}L(h$bM;giO>4>VQ64tAt}ni20RZo+K6Jk70tOr~@gk21gHw`waV;ozZ%X z2x5#JvoZT_Z}f+)c>DZ}|Vum@7MBTtF z;n4g2U|>IR1|T{vbwf`W^#okHU=1RF`=YB>*{f}Bxd_w1P)>>&=2XhBoxNTICUYlh zmFBu!3o$F{*V!5Nd{5lEk9}TLv1GRzni>vW=m3UDBE+N)Wh9ZdC^MlgYLnXQiE^?s zeQw%H2hekcXoPzJ1O;ik;A;vR2}$P&_Wq6wIrQ896EJ(T=fJMQWVmN8e8)sXmiYyg z5t6HkhF~MC*=``BKcVb0o-liEflmZvtPM&Sa4P{%OH!jD!tey4u`6hFm+?4$W9zum za~oo!jkHQ`fH?aAj(UhrDs5R4SKm>OHvKXVO=1Om$RoQKqnbxTrv2F1-6h9oSY$0+)ibxVUFKjQ@LpHg`#iWNkymQ|`hw4`cyHYNu z3FaK(zDfI6+~~>zt_EGU<6$}xUd8rr3iCtm`xZ5AA=`sqQ}c<4zm)fes#yIUae!w| z2QBdg95nrEyTM!sk<$c_#NaX>C{oL~yN9t01>=m?-^7~7D4Sfyg90`sf^DdXO271u zr+b(Zh5d`NU3^i-;|;~J4)s`qlfrWKc!n}kj~tZIke81LRL87oqE%+oJV{Tr^v2Rk z>O><=yv_hVjWW|8Qxbre;6V}eW9Ffo5xF*!de2eZhz9Ue@Ln?JgxI%ueW2&mc~XJD zIxogP;*EnzwB>bL1MRON69*n4$al|QTz4rO+Eq#e>J#R_8f)h0kDyPouskP6S+ZMsq#X zXSrCoo4pQ{t5S_@*HfGNUL3{;jJtp{+UMkBr$IY}=rLIqO=YcuokEDFRI8+-uD5BS zsV8WvbZhT~fo3e8-LZH&RnK5DI2mB6M%8B^{s|D=z(8LR(x3u%7bV$LNr%$|&g zc(>6eW_;0)9Hkk%Gbyt9>BD_oOpT8BJCnDuPq)^Hc* zD)s-UWGgX&P@(Ad1ji6p#MmdiR(INNTmH0N)1QVs3Z1d5OmYbNT5tSmQyZ7y`)`B_ z=#%1?CCQe)W9X2fi=`G8e;P!$G?*f=q=&h~UsouZJVul};R~vjhmiHy(0DuDe!_Qz zj~741jhB=<;^0$WBQEz(+Aj98E<$sY&uEp*`wmt}oK>WQ#Z{!O#g(MB#Y@Ku@85WY z>+U*Q<)mo%8;|Tl2WCXo1;&|XSZgV#m?A!9Ey$1#us#9m6C5|FbVi?NUKmNJ!pt)0N? zSy&B8>S--`Y*S}=;~)<8;$c%6&OmQJ#=CTU@e03f`*RWZJAW_YU_0Ds!iDFt0Q(?)=x^dyn<^Kgz&v#M%2ujL&r+z2zUie4 zEMA38vG{RehVhKTufq<*a}Xd5&-A_A zw6%YA-p&3O>Egv^8*j$6Lb2f}zVfn$s*m~3E6aANM)7qQML1IhH2LfzS@BeCV#vk0 zsNj4OUt$`4gFx>dwsr3~X+FdCHalvuB~>4{>u4JvVRUg<)#v-Z6Eoda@%T}No$ji) zyU>=n{ASb-n;kc!ND0fF5~7dEu^gCfP%ye(7lrdjQZ`I*b1Z(>gQpqII+UqkBKKSq z?LAcChFE>F<((If9$*i+#YO)a3{npY=BZ%Bsk!SN}wp z&=qnUaOuHfy(*4XR)ym`Sp}~nX3^^kxAbp=Df$ke6e-;!n{hE!hx3!jbZEIUA+O=KVH3O6~v%b_?Yl+_9`#kqvx$)iapXbHlnfc5-GiPSb z%$zwh&vQ40n{m!Z*ovA>GV?nWH+TZ6T~tkfuMJyQW`_ zg=a4Az)FZfGLlG6*`jOHD#PYY&cwY+1z7%#4mM$NW!sL;@pafq~1wli781`;ELzT{f zJ`8EJu_7?H^zUVQ4T<#y`T5HtsJ9RE7c3pDht2F|fy@@c@U_qyXf1RTbStDatc57& zF@GV>`|8TiRWV^_eZ{StcU1(_0QM)WxKlQ$_<;us&z-{j6n^R(+%f02YJGm9^WtcWt>qJH-=nIP^Y`(1OW3C^vwo?UUQm|E>Dj*fCNSx7# z%~HF}-Ten$^?+;R3o;?vY~%BJpG2F%u3vv3uD*Bf_%Od1xWOtW$&y~CcX!cTF>RjYe&z*v zIF@X#mycu3FwRgorQX2W!VJOTNf7lU<+wD1)Y%v3-7X zK{?Q$g>AYxxK+;&lfT57{u5qjdPqxU|B(ohnGD@@Sk?Sf>Acqw7VY3YFxX3V&uw{j zyZ5jI!+F@Qk7YzW9e18w5pVhpzYk_8;i;`WqNDd`Iu+)!4rTP#j+vx`t((D?5&RC> z9&dW}R0HoYNbRu7`|4fthj>P{JZX(L^PPKTOoF-8b?{emR|0eE01k^d>U0vm>iBTX zi8|Du!I~e$xHVk%B$z&Z2QSmS?NK94gAe(F`%80z84w@#5!>*TBCKv>lbSTDDB;cs ze&#rJPV29we?L-qB|u*4m=ZL~ruchWUX%s>%-pEvS2?gk20hR>N(j=)Hc9sMV^F# zXi|KA1yfC!KcNKKPIUHTf1PMXMh&5d&~|og?f1F_O_KA8reDl4IBSK}aQ+4N#1}0` zZ)os~`^FA1y`8T8AIiKWvwKR_hp-!=w$%!Dx9W~}>o&LLelW|2Av?!EMEBVU77`Gz z#KgAV`Jqf0Xy);vzykx#I~+z?FvvX3Cm6pSWY#!W%hiL;0M`%i$;QEE^_A1cdmEFn zE6kbcRRf>t7*WHt#0S|bSN#tQ)`QII&DtJ%9?nyz&vJLXZR@!z_^R)wy(rU@&Bi6- zdk*8)6OO_r=2UN;Z1LegdOQ#6lKg(kaTxtk)4de;N4OQcR-oQ{rB*kj!KG^ zzaoi4OrooDiOd>e#&#?DfaeR}{zCb?LLL}`);pEgC$(E`@O7(Ox5?jmgl}`6A7c9T zEch4JCpcP5H0?^SJ|iQBnwW$I;C|gi`%XH|ny7RZE==1SK;3gltEzg-}w z^!`$TOi$(hc!4~TY9^HJ{$5MjF);ZL+?(CJ)epr(3kR?t%l#VeNTez>`u7~Q^bH5iF!^WAD`$N#<(0@QLLi?b%c3Zt1f5P!G^cke}^W|*s;$el{&MkLaU!2ie^Yuh4xaS`5Q`){11iv?YiP6**wbJICKDUR9Ds4 zMcwLdWCc#fx_70z=x(0^`PEA@bTkvjyK>!VGcNR}Gkl%|4#MTd(eRZcAB|=-_)@+c zZHBGb_N@v@ZgU?7p8uq`s-eM=sb5gjm0kXE#uvMnrNMWp^6jo`E+qd(5qgx(!UnDsoq=XJGh7M;nfjn z6{LDj+b7-yWTbwust_|CRiy@cU0YPEs-BtK!ay98lsmUY*B@5uz*eiAJDoL12|N zdW4SBb-bOU?_;)VJr*|ECQUz^Dl)&K&Qx~)&OPg8 zHhQ6bkk+GrHR~#@>(Z=?wQtWz;y8qLtz0(F^a*{kjWp?i>*a=tu3l0;&g8KK{dkzI^C7vf{_%mlo?#Nh{DS%M%kp`KS>2dsdc>H`n$!dmb~r z)=3=;K#qo-kx#}mQk2P%31(@GvO41xKAZ+Egx-OAQ;ct3k!L0#yidT& zO!W~mWU481wY@0MPc;dHKFjy;VIq#|IO-muh3@eW5?XzC@R*M1+h3J$rkc-ty~Cj3 zmk4J$(+2vTOf&ss9wHH)BmIf^j8`Xr{i^(Vnwb#QZa2SO$ze{;p{xC=hxDIrE+4q? z5b9ou_vpG#t6G82KH)98`c?1WE{{()_c*6Z{0#GutKV7KJ;OZ1SKAk4nZdokdPgJc z!6>h;P-?}te*TVZ&N8d{+~|*4X28JTGpT7C|34(Yh~T+=qY2~kSI;2v)6s^)(T1vJ z+DtQG+8$rj8lwJ^nf6aa{mWVJ;}3z&^9|^=Vxa{9w9SD>uwC6NlG6&Y={FoQ+uOebFw) zMHDrUyU?~{yQvxzUfH5W5cy=5iH%?9OEr~Lrzgy9Q5M75B~=!;OOH!gB@C1;mzt-; z^f1G*a~{t#tT(dF(7v%`7L-}dpt9W_{TTJM36Dp~o!RJ_@4hG7vRRhQlgYC&N8Kk| zW}_Ugm2YP=13x3P=dhN3LRRVRGI?N*nd>|$AJ1V4F;tv$>4>GWU@l>lY%X=MP@bF1 z^sq+WpUbMONWPrQ9KT57b4+aC+^?zORF0c-a76_`N6&R`Y-_TBVCM|Ej+-my8+kAX z!^J<|me+F_?=HxXzzKczVOn=Q<@Y}v*`H}F?djH@U(2Y==*mG~%gW1mq*P%>T`q7@YJ6yVZ)pQEhuAV>0#E z9lN&X@}{WIn^zczX|9n9|*Y#v;Sn9)H7>?>OX%4m0 zYsy+JK;!7ytna;sV5xeoI1As2ha*UXT6I0C49o zc`wJ8VI>dNbNKFFU!r_hBS!riu6BH7s)#tMaTNRF=njp2Qk(;d3+7d{=*Jp^IiNQn z1>*2t&}1Igs?6Zwm#MD4G{+>?MVW5a^GKs3bz^H5en;Uw_`NI4j;4}1^UTorvA!Be z@)bk{s2WCe2XcXInTHU~kr(HgKJj~eMZ zU&)$pBH}Ojio=fM#pm|(oc^FzU%6pEIrNlG^U2{hd$!7@yLQAZCZ?mbrZq_3nvc@< zi6+KG|GjL8@8F<%9iZLf^G{Xn&M+Z|dRZ*BpnNvviURxu@AFdveXN z-d7Xcp%hw5pZ4b{bOjwu<2#7sBF?YJc)rq27HwR=DyV0t^t{!V_Jo4I|C)5a z9CPvznSD9ge)_$vzTC{AW4(I08R=>~FQ4P>aXUk_rpU6N-N?G*x5~6U(+8DaW5 zrQ070>vDx(pvW^5)3U$x3Sd{%#!OD~rYTQs2<=Mig$!JNoHA^;zVy7{V$-SK$#HV| zB#)(V)gPqi6=tO~S#G<62AL?2USZ0*zkHI2Lp5U0)|XC7;+3onPCO*HUrELM_&eEl zCH8>v^2U{>kL#m9$X~BCBL=?BhY56a)`?cNj=qnQzb~&Nyh3eJPdjDEBJ+MAA`?5XvQw%@Yl!A!>~t@0s%s=ZpB3sYe~{_< z@b|luvNGSS?0Gql>U^NNs1;#;B5Zea;$(k_5qoFwRxpy7kaJMmNKa|_lrlQ`x0dOk6+8e zB}m9p*|fy`!gc7NoLXXTcfHdfE0>~;xa9GrX0+>(gYv;rbIQ3zeqCsmJJ(D6GN!F7 z<*8*%AldT9GBc5n>;AY5=Bww+^lQwO>^wYv4Hb3%dwKI3(qAP%USnox=#=GViR-UF z$hPHJjvkV?mosT4$iO0V2Mf&YMczoC7hxhOl`$*mevPMP$qI9qK6`A1S?gN(wai-y zZ}D>XO7dMVZ>%(zYiQ4F*`qr1x!iRvQ~M?I__a)3A)k9CbrHQ?B}L1w_gVDwF1BvgN7xGDCwj) znJD<}rJvgFvyr9@u(=dC6{*rgsE*Pm`+Sn_5x0NjJ-4fcYNT-8Im7!eNYC!h=6*jU zxINIK*S$w}eVUXkT5HC$*xj-g=^HP5)|z3iFWThTS_a@3&;Ntrw#Jv^=42)4M#%tbwwuU*BcwO`LPgGSGS^{ zJb$P`T&2i+R!X<{rMy~dE}w7&D-BzAB!~TTd)sUP-NP_8)%Lw`T^h%24Uac&}?KOWN17h^I%7{!2XK=E6`i;r}iy zkFW?|ST^o(UPTOZrhd}uB5^&@5zT$lRb8VvZWZ%#>L)*Eg2X5BkV@gCC)nt3xUI#} zP&Zm%i`6NCBUKDm3y-=_0ly`ZAS0aWx=mi@a7Q=@LT)alU!Z)u{8)0z`PqtR`-k%=Iuj1W5T^4moMb%`QJIpCtm9Rz4-u!gW zA~c-y!~VpghF7#K^d$zLc4Ap1maQ)llAyg@rB6Jnb7pDX@dgr1RpxvjKk3RduAwm1 zwS&Pp>S(erO_+;16ZUizX+^ciJRQY5yfJYNWlvIB1$t1z)<+imW*GWaSR$qC5>Q%A zY-lG2cZ7MFtLLpoWsv1m^K~#7SNde@Rv64h!c)R@SSvWLr)72htZkj|>%)h5Pa|yo z9JUULG<#|Vy?#?`CX((R%3JFb_>?{$#?2rRS9qMhO%S82Fl~yv`7lzscHq*w=DWx! z%a@=Es6YO)W=~gy?|2r?7|d6uH4jbu83vUQzBK(5D)JIN3HkyFyRRaUjI6?YF(_Tx zyvpTxFcrV{!5|IK;k~TKGlIxl`Qd6!FKJ3p+r^%#O(pML;;VqNilht>yB#tBJo zA$Nb1Z#S3$Wt>^Ijqfitc}1!qtScJ^j<6_>tZQ^bg)3`?bjaWPM%hB@R7Ecw#l+*d zqL(JE@j@q}3%P5)2-UA~Bc@tE_oBpT*O&^6-Wk<%-aVT@%grjH2@viz4CaJXq1wV-He!^!0#{+)b@vDc-qT z-vab04tyJCdW-(T(%zpipi{Pjq1sy(>i0atH098Ml;`+TrU!+28m>S=*ua^w9%W|0 z>`;={w+~b`=$!P|7&_k|>2%s&M@E0ruGkKyQ~XKG;=4^hsV*}SD_q0=`!uUb^XZFC zQE=RU1}5Iu68=281h60G&qLXdQ1)+VaeCSB@;|UYf~@W&s~(%YV(qPGe!JT@lG?T5 zCb`rbTU@fD+)TWp&3d}^ZI)Ws1aKH#{$x~oSl6g)$vqkY3J+rFO0E4OozBMxE}NHO z&eKzJi+mHpWxl5MXZHvBy4*x3cV&8LsQE${@;a$$UArb#wiGhPRQgsfg`_x5hTqL$ z0o1xv+KQTpE3UF-myhQjDjWS|{oSTpPONH+9Bp@dTTW9}-TyZf8+ks}ZFr^Kq0pJU zy?JQY)`xw`6e28S;T48d6^8fkMql}p4#YKIRPmyz%7kuHtB9@gEk2p5Vzkr?HdVGb z8>(8;;XRr|0^6BMwHNuPvSOasnWqxlhK|Rok!_<5cf(Z{&pT7AT2%AUL0;e44QE!( zVkk(Sd%+VEF@p~vAaM4BnVakZUI*WCEFk>@wA61jk!3Ga0JSVy5s`@Jg5&G#&UR1B zzkG{XRj(^P^LB7Iac%V)RzlHUw_`BZ`rWQWI=N^)tMOcWRW`Zj{?q#$D^?>mI!FLW`C!>%S2$3s7!BO#^=O-R)Pop;>Ry(+d&>jgdr zRsXluYZwfJL7O?4{O=e{{%2VShpNr`IaC$f$Kk(auz@u}AcG$%gEXEpSUJtBVk=`~ zeT-cNV=kD|309fX#?;!|t}1r4U&Z!So$*y$S^z_HU?_){rpi$17}R_<=C8d}U8H~q zGPNs!sR`6tBFwm9F2$A}Wu~IFyVX$9`aWV6*B@o)JsDKN0nojyVt28coqb6~OC;e7 z_M@MZVL5t)GJ$6O2-SR#>J?7?ey{H*11&8rt6l9l<;={{j*6D#1D>yPXi9afX=jQr zt$eVpq^-5A>5>lVEjZ5S1N<$H?9;M?Z zN}*~msRNJ47H+28|CD<-llJXD${#kH1lP6S-Vc$=kS4kEAv4D{ z<41YsAsBw{Tlwol=0;cFA7xH8;Wr-RJILlfzFpm83kK)Qevmm^uyUpylg)Z}ACo_C z!O;4Y^nKXOn68WeF*J}i$}H|`I(UwI9u0Nm4SuNQP4r1L_K0IAM#k1SDbVbVCC0*D3udL zYD+3tOI^Nh17W(TYyO;{VKY;mr{$wZIFoo_b&GfIB>!r2E zj2qR%Ct3QtZ77@1UriKM$n_M`5`O6OnM!u`(PgnOH0Ost-8$`4nfEB?@yq`%4?b$< z_2}<=o&yN_)w$WcFq60%zMl{<_h_{eEt~L zvV9UN>^^=ilg0Gu)=hb*Zj{MJSth1mH-}Ge8%%}2Et`b>%m0we9yO!oteCj42W=i| zTEjn)gso;RzuUKID;u7V$fsNBYPHRh_&6sFmdT38&BSiEf8s45D+_F?FFtMtbSpWk zkiG8~mL{J*4*xgZk1dp)1ub?h+DFf$6840-a>T!A6Plp)wj(^ks}>d`p1+c3kn%j* z%kQ81iEMrXd)5Vc?g?|fYw_n2^Q4)RFbS3FdwXiurH{P}|N0)1)!#oHeMB}sX$FNo z>&s^F5qbGZO7xZVuQd|28CZ8H3dcWepNTPu&SrVPmdbldoKGP-f0wAI%;?_r${uNJ zg^hqE9S3eYB1@h!vs}xL$p3rFOc`H`$y7g6qMuIuuoFL*`1slKH*Ya@VD}g6A&K8+ z`h>ZBELQwYrfj2>pUdKHW^nM$q}t^*xo?|Eh`C@(XRu>MgZFgPA?`EY(r*#So7>Dr zx{v>IrlyS=ojzvlxQy}3u328RVx_~eVtr}Js^zQJIrbGjZ9eEK(_S=D`^sK0Q@ZRs z^|I+{1r5Au#K4>6+-s)aKKDMeIHpJGiW^s5U$koZ(q(JcUVro2lxiCMs(`LA)~U zXzYTyh-FqL>OlDvzVrNNeiG=<`=7N`JDo;Tsre!=9q_FA&gLr6%F zysY=UpjUfZ7lMPry97CA$o6pSow8h<{~h@|PHnd!M+7fJT2LPGCvn%y|6C4!{mqg8 zjrawnfXm^S!Ft@0tBFGSPytj36+y*N3A7H{098QMP%X3rs)zPM`=J9+19T927diwr zLWiLv&{3!fItiVD+98c^g_iMqG@(I`NGJ|UhEkzPP&SkU`P^+JBp9w<1WVS;ICBg zP7a~!-QjYS>zzraQtx!KYQ19!+^Tn026cKTV5i>Q4oAJ-GaZiodN1ckt?Y2;C62TG zskJz251@U(zJ;;Yu^vH(4*%pSk+&vWy=Crjt6NaS$3J;^qu~ZCMn)D{p;A8FvU=~V zI`7FN6TOn4awz?8^2Bg!Q19GN_~HqEy?8&)aRA!;C%G`(iU~f7JB7J)gq0AcMJga} zhLPQK$Sq>BWrZdImLC1dlO%Vq11lS0g$Cz?cpE^j~DfO5sS$3Qh(K zKPIb3T7!b~aOWPA$3|L-K^t(l$r~fd1XHCW<+GnWdGgjstJlE2c#G7lIZW>!QDNO{ z?sMJm)XW+Qt0l}WH;lD~Oz#-jgiLrds{N6e<8J z{YoYl)Y7OnnqQY^a=_ija67=VO=5+ znGHYwB%X0ryp*O{R!j!SjvqT7&6LXcwLSaGKWcYu|4N^rjq z3rz12*t$;XHG!=MTM<}=X8_9qlk8UVmL!B;R}H3eqnEZ_9N5lI@lwI|2gK7fvcMX_ z^5ol@R=>U_c-!&%yM;z62RkEgjj;yA@D&zEUhj@zH^B$Ma(c^!F;+r+6Yk?_t(f>6+_eEoC2`?95P|5l@J;o=5QRv zpKT9!-L+=3fX?;&%p z$vP6q+EOcFkT!ipSJvTRI;uOeI>u>bCxtM6&Tnmol{h{Rcg3)Co+|Lbcv|XG!p;zu zt6^Mjr~)iCh4_-TR7aQ$#`v9JTfy3;{|GBK_z>RG;nID)l`x_Wcfp8ro#!L_){7s{~-v|I!3hK1U4I>m*ikVO*^Q|v@* zSZG9dN`BQj4?jDb#*CYe_YmG<*-~f?5Oo=^2TJVpOjA_qbmIAOXP!zBwmlZ ze#tox@6b-<@xyo<@TPjbXYn4wn`h7Vi{n^Bwd3_mx;9uU*l92dZC{FIft~1t<%1m! zc-Bq45-?3Z-EPFtYF`wecQ0N|nG-I{VeJTBYw0;phBz~<*lzX^LS~Ubsj}r4s10ts zNq8s8w@Z){_e>fs3v3ctrYu`&#r4IPkB<&)Un-d!z;c$#o0F}?5j${iAUtq5-|xe? z*_WIDhw!XlD&41831ixD*9N4iJ;CCvQ#IH+eIl!Sc!jywbsuVx=I18tq%50a4G7N0 zxxP>yB$?n6+)3BS?kQGcXbtX?YtDIizhi|pAie?b{^cE2tVKTzRuASCGI1}UUC)5+ zT`ps%T8Y7N>_bGZkR?+QW`6X?QMl4>R8+Vw#du3so|6x+vf_iQ@Kmgn4|IsA$6Zal z231UBB_fkFkANj#D>0c?jQ(Jaqjt?XPo=kiUo4gK6NwoAER=iL~(+SxY|;&BuNE z-gBOO?=VtWN{wy+bKfU#YWPmv2k$@UIUv)fTZ2Q7;LUyDoaeA?NwfOdBZtLn)MtNr z&T}+azL{+$+L~)R*p7#p9lZ;NhqA38X~?Dsg&I(UpvayH6szt=D<}l0{4quzS+>gR z7rY;@TjZx1*3eKsckFOKskv!$ch@S9;2`87pc8g^W2BVfBP;{3vX;t+1!cMzf6X%} zTbjL>%Nn5a9p^kXLGr;uYfum$AV(1nV*U+1i8JYW9guV+4Re!AI9;Upd6_p8nM=jJ zi{P{39BmCwE5y5QcZaBJr&|YB0%qaX%MDe66@YE%7@vc8f$iNb-^{cU(+=YR=@Z*oLR4S=)+o6i_P(D zuwvPsYQ*rCyD7}->My{5)bAUwY1_Z?xl%`;AP&9hyv^FFbJ0vqQFLTQR-n`KRDK@FULvi+EGjvTx!L3)f#nh)*#7h*Y#EZ&}2M0RyzZiJznPFZ3=3? zI3>A>UJP~wY`<5BC|_(@@l{|Y!5#5*q^JWc0y}VVWC*f=+N8%^D>kSN=UGXc%e?Dm zi@hqeo#mr0qq^y{nLsr_CoVo~g_eS4cWu`RRikM|RRiS%dAaR-0PpGWpL5X&#@8Hj z$j5=ra(#DSKFo1y!o<7Po{{6T@SedNPP%%zp?t8@9Z@#mExhFCQL4f6!3tG_?IR70 zb)kE~YQRu$RCCa_?tcO-x0mnP=^dih4xR&P=hUn6S7qbm8Ej<9pE9j^-`<`Y%5r{jd(=P}q(+wLM1qHtvTD=)LNoCm9--w#hWiB-<871Y z<`Ytdvnr#VsZ&iV@%4BuK69d+=;ekEf;qq{ynW*&-oo)RG?(cndH~C!iEf>^+j;^D2q^JZm_6U^1lyY3u0x+HPw(R0fj2;*2t5h56Kt=o za!JENW`hWNU;1p43i4{onfOcRwKK)p3S<%99eC}vkyo;UE5RD)$$JZ6aX;?7+;&f; zt<(h{#k)UO5*DKMSOa-_k*?b#iATr6C9+Y=24)$CGd^gKWwQiodMqozTc(gNi5T9PZ~s$%R0J@Vi{n` zU>0t@6w3jN2J_3NVufICFeVoJQfwVqQm1&8U@4vA)egdHs~HC-SWm=^P7x1+P3jcy z2v}C9c&EX#JH>MhrcZZ@7YUYU$1CgLIvKE_Q^ZMNg`E=21uO0puL!K9Q@r(H>pI1& z0$U##PxG$>EbkO?FIYujMB=>*R@EuqQLySx@!G()c8X^)64!Q$7Y$anqf^8bz@442 zOt4*GDpz`G8|V43z;-VNtM3$VgAWU_pY%Rk4W{{m(O_Jf;0{3L+MfwMg%!6KtFp}o z@lAN!iQ*sqRcy|HodL@TFo;GDp_ZRL&v4y5j;@}L_cT$ORPpN=wd4|CW4APO1Qr@G_xeI!)s*aVk;pg8@IcpBOI@z zfPc{?vTZR#W0ksZ)=3prp-=EGyy-W~H#{2Jh&zvJKM2GI7_VLxRIn&P60??FKv)yu+v~W?9G*4bNt$7 zE_m_XOuupRCI+9Na{S1D0ZLt+?QAYU*=oe;e!AUr#G8Gt&Yg}_MjAe2lP}vBGpU|W zwYm;Z1#5fZ=aWGeSW^I|+~k8b%3D`k{ko~Q9B;%gPiy&Mty&nL} z1M_!%#TtEBxJKgA^iF`~>}r>?byl=YUBWI-cp5X;i!yJCm3VbJ?yWB}6>D^#@}?=~ zfH#7ddU0FSBXAdiC+}|etXG^%vGrh8U==pvm8vQ**5yl3(syZ6FUdDctc1iy-0Ahq z>>71?ht0!{_cUR3^)g~9auqQOvEQSW@a;6K-$3PP5>V~SOxL&_^So*%!1U(3ou#-|+I?gO&9&>A{>1MbY13S01c0(SgfUSEc?xD$8Y+j43dJ?~xIk$-6S?2@mS zG2EQQTlWVUdJRD#V`!6iREc9%+|O%s04jX9UH93hTQNOz{l?Bh@Vr0T(+yf=mvX!% ze{7cz)2t|aO;iU^VTaq=nf9o#MzE?w45YzcyR%~~iou^%TeI!Xzg=gAh9-k;{YyK> z3ERG#gE#xIY+jB4mEsQhnBJk$W2JF9opdYM8L%3!JwP|1`W^r)`m3)+s3C2wMlcpu zMb_Z>cAV9JV~PXT%MC@0W0eSoW#!_!C>^W`tkAovv&V!Yu!v9EJ&pGKW>-)RQ2pOk z-Df*7W{_P$Dk}}(RsY~|+#0W0+;sqz$2i zN7HKroAg=x+>4n+1D*iPAY!#X9MAzZ%rTz9pRgU?u#3C3Zv1hCr8mivmDo))ac4I% ziD^78eKrrQ7;KjUozg8O?5ylriL6%PlSxSc zwjOMKC#(vr5iBntUL9D(aX%LBmFvBLxyR*)Ygzp^;oeV#a!Ff5|Hv#xx~Y@&8VitU@Eq!kzk0CKowB154*RyzBqv8wO+TZHdrY zu;jD4G{jOE8`^-k3U5(>#@7Va2%=`>i=#qrV7}e~}_GCcExei@R`~D=b zxN~yXYPDhFPAA-+iF*&SjbYk=)!_U2A!5H!#)0hsI|8=Dt2Q0PTX3P>Q)in^?Sh^L zI($J!tU(KmoI(no4q0)NLNeGckE~vUJtGHqs^k1cS<>)Auq3b=3B~jkT7kC)FTYWr zk2Rrb4YsPCKFk(T9#PRg09H-BMs0?{@u%^o2A}_#b;U6iX%0P)EU0ZEEeUT;7%B6# zUYc44SX}k_ivxxhIR~tocyZp1l@h#F`j|3=k{0OoYKD7#5Ci834iyw$hm;%!+sad3 ztiR@U251M6zawd0A(?^EypJY>X}rMXvcc**VZ~qvI$@Py?{>m=f*tOJy$jaVfw|XO z*0Pger@`Ev6bt3unudUPrA~0`rC2oBSulIt^I<7q?E&%J;F(}n_<7$hTaO~Vk$7_n z@^0g9nQZk+s|3yj_ScT)Pz#nGfNAdaV98){0X?G;ED0kwEsQLGvK0}I$_2~7q|2a8sFl2?n#19Eq_Yi@;=6o)V3 zk`A7rQHTdp3g z7z~4~e>Xm~32fIml@q((LuS+HcsZ^@#dtTZQ@|V+sg$ExKqO z3Em3Sl%c2pdQ00awA_AxN#hYEdneIee4YS`<5#02<+eraUWL!0ktWH!TUolL;?A7( zUn^RRkV9DgB-wl`%ZClP*H4x=Z$%&7i934Ac~2&B^wJJ}04xiv$VM1JxHp2;fZ2`c z+mh9|C&5Fe{`~oNuyingRcpM6xl}h;fiF$PlIA*!9s2>-1%MeujLyW!6@cY{WrF#q zbA7lFtgsWd4y+t3#P_V;l74L*B428QYnTIdg1WXR;(tofl4N7!zFc-!VSYh;(|{O&03mK{~vZnNB%=)<{p1v?D) zh}*o0NcBHBZk%(w710OCkzHpT>z;zCrwzXxY#h z(bBFd=*u#l!%uDq-p5hpna+KUcUpU$`|883IH%yw3GM+O`4jd%SZ1|20}eH3`41-l zyStV_uYY%_Sx>*}DcIz>-5pYQo0TA|H&`)c4V=skyqtJk(Ai6kBQl#ZLXmT*l-b5n z0yRKxuvAE^YTXRusDLV=YUnVOMOa*xailvmUs;=+4jI0afuZRsj>l8?DRPB+!&8DC;VGPSmpj#~ ztzUC1hume_?Px#ycUs}0UMb;~058@A7Fiqtq#HgaTVQi*t zYw1RzEcE3o;aqs^KwY2^%fqXy+S?}{`q*~t0SpR3y-`jxZS;S1H^yYhr%W3|H@D%9 zwY}ZZjHWC(&m8UeD#>cOh&g<2iK$kJ`xGlvwuxq+A~9u;#pGMbxYx;eulDwT`&Mb? zmFCx+7PZl0QX3^fZ4|kuB897sjCt0_nLJLj;BmKx0bJ5w*rLS$;=*iWPkMe z$(X=`2?ClL#1J5g^=1KSWfsQ-{e5d0N)i1nCL){&riJ?43J9`DIII7VtC2SXgH`oLaStc zsP9KT+FQvisPFSuIU{{J%!al^@5X$yx6*3%K4Ld}H`vTrVGFU=OSra*CX{VW>rk$< zn0>RDHHa|>i2PBhl(;uy`1pyFBtAhIZvqT(OayDanPR-Mez-}E5Nj|vwbNh=kbkSj zuv9gsAyJL7q$o})MCsq#r^bkqvJN^DJJhGFm$;Jnu1~3!1Vs!eRD&%kYOpAQ3#n>w zL!!?O-Ef}>RkldX8xa;dae@T|^doTepSaEf0x+rEp8)|UW%FiQ;+1v7O+Fhlt0vI~ zB3iv$6z-ePXytyr7`x3_ak;VLW1Wb$qJJAW!+m$LNc5ec?t((!fgQEWY6drk>0{Y3 zZ>9sR0?V4VVkH%l(1aCrunkE54VeW&eqB6nyQay8XeM|woyVGI*f7NwIW^l93!nDKno zo7oueXny*St-AJ}vl!ZIrcUZ(Rt7}VX=Tk%ABZ;ku$z4vxcXQF^_f8OMIUg1cERTz zyTGPt{Wb~P*$MgEunX+`t6gS}g=AvqkUema)}}PQVKI5viySf{g}d5xM%3F+Xj;sn z#eo>qA5^ztUk7QLU8&aTwoAlxb zObXVMj)^HvXB^O2Cpw*w1jwBxvS6i_gSA^C&IC?c$bNDycPf%`QPFy>D%b`Bl%civGUOgN`);0>f=CAAP_iFLXM&z-a(rsi~5+8 zWd8*ai_K3z--)0b@{d=s-MpFZ$(kPM@&|4w2X5$!h44G#fj9_=N}%OnJ+0n?m!veJ zU-M&TvVKcCuiEEsU}};AE2)Gu?S_BYEpiwZlY;H*HHqy_)zF>l1~dE$CcZ$T{NcjW zt?1v`M1MJ34d#`w|8}gJ?6lKlXe7z!O4E8MWTtdjE7xnrV>0Q4x(j~djJEX-H&yiK z9Xf+|ZQe}lzUJ*#3oPY!SWH+_OJ(y`=8x@J<~3Wpc|(n9oX>Pp29zm0e_PG0BmL^Jb>c>}2I8L)o@n#Kg)b$sb#m zs~?ej?TVX3t$LzyS~C59%*N$pTSc@@D48D;xU<0SUGU zyW-94H&YdclNk08>!BwhIx$jd(*_ZGqkw}JxL_t|oRcSD!hDEzI1G~L@3AqwlY|Ws z;^YeVI6tQ#$WMfeRbD4{j*U6OlwlXPc_&!N_kTlf7f4DWyRfDWiplV9KH>ni8@B#R zXD$%yX=gyb=wrE}>4Q@gyn+N>z#?>Auwq-sqVK;Ujw1@TyvH3jz~^>|eh9a=dQFlE z>^?#({69ugfrtrXlpJS}_Z>S^Hq``qToQ3n21lSj>+CRtg)atx>uc~cFvIu;N@C7hH~cx-byQnv(OX*%JgGLyheI~XDA;L)fi8H zf(eCLU^5KJImz$?kg`!8^_jgc@uk}lE(WKXg*A|Zm1-G z?<36OeZ(TFkJ-ssfy0u<<)$}TfF4siG>7vODC`XiTXhO=#BuRNscsz+pt{|tll7`G zgE#?%4nR=aZzmj+H`A6u#9?QMq^!_*#0<=jxIsj=v|oRghy!6JWxEuh>=pgJRUmF! z6;Wp+>Yn%7Yz#<4^;K$C5Y`Y|2o|#Wv2gUc{yZV2RWvn7LC^)-LL%h+lWY%&q*z`e z4OZ46MstcG%`%gq{(;y|&gS(@B85QoYRKVBI25r%4k0i&i7-BR#{_HyS)oU_Epj}=s*pKb(2qk%pIrb(4cH)p~|L)(B|FDzqtm)#9`6_hJ%QiRU-E0NX3^9ElLw-cKRVH*&Socz#$;bNzxK#)l>6~uXg7K*T%V{8`?jF`~TZ8~I#mlmvc zCA3+>>BEYXhz%!^{6w(s5yW2th&c-L2bL>fclvaAsZjMp7NBBPO|k_CLmVctGCE9> z=+x6Nv8S!%NN6m=Z`~TgoRay?sa)3`F_QX$r2<&XRkW*HtZT_` z;2hbG3GHNK^f=K*6AQ`)*qbe)gA7h|^ET$MY-AxcDal@&j0}*z11Nc5|6h>&3Wqj6 z8-%@WnD4T2i%ca}uk)acL*Lk1E;CYVm{v$1}l@~V19>Zi^XGZ5p!LU!%ptB|a|H$=Er zONiIX0@X}uh?*&8fWRc(CUosV?TV9yLLVe=<_C8myjlfuor1mCrc^hCD(ftv%6c&r zgokQY5FBfER5OVT2C=$%9m|K^&WEz)g9s#waJU4OYOs)@28U0E`#gm>|0HzeIRiZ$*kTfi8wHT=n;3q+;XK$4Y+FsK`TJqJs{4p z4Y52Wk0^a6cJaBLObLAaO(+XuHZ2yzV3Cw31AWj>^n=E~f>nc!+BmHZ&pnO)geL&c z)Q+*5p&|no=FR-$hju zs!??WPdSYNNS75i`tH?|ht<9^t=tSVi6d15+3{0~lZEJtMM{-?2b3uU$`k@K>r}Vc zDoM%UDf3}T=~Rn$j`pxhvW6gpGNyQ*#ndeYW_3$A%2+cgp#zH6Z>DW`5wD9&GSTCEi+X*2-!L;BV`2g^!Z z*QPlp!VBdUNqJk^e=5VXgXD~4QHg|s-*gP3z3QREaFj$tq0m^2&Eze)`rjP0KOaL4wT3bgt<{3LU{n?5tN5f9!Gf$i@3qJ%-==TV;1Y=2DHT4f!v`zMG&#EPX7D4ib^%#WN9;sGmpMi?!4N1g}~ z!qXw1i0SWC)@$R!p_sXy`a5+`%15H_55VVW#!Eyd;sGG;?7ghU;p5*p7o2K-%AXum zxyLA=KG-?N2nn~Jnk;^JkYa#F!~Lz@i+s} zK6dj&Jzba8Uw7h(pc*;ZZa7NMrLYKRfii$yjagUbtx~!me+#5F@!mkGo3d$mg?G|8ivOa$ zRbp36_^ij-tSvWro-Lm0G{}oLf-AX-laU6W^Ul=S?s4C`$5U|&kZ-*Nc{bx6 z4x_dA=`v4Wql@swIdzBqdv#0v) zb)JpOAdWlxd$#o5qwKeXh!YLEZCHuP)?xpruhdqZ`S|MQ9VP~m`2#tE%Gw8s0Mz}J zoo+#Sz6MHt!VWPJ5rJ5B869dNvM%J15cygtvEd`yICR0@~I-#p>vs z>w)d4QiBUB)fh*C6W?B(cyQvNSVg(^&F$A4F)1<{>nid2%z@|Ax>ehX@EaBo)=$}l zkBxAvWCdH=+rB4Dh~Sm7Uq7g|?%w3KAs#5^iE>g(gxhapk#N%;S+V@ynp1Mz_yG9j zooelgY^)k?krK>g)$|1Oh4WfSU4pL?%nK`t1Bn%@yGm{tjtLG+3_v*TfP21I3B-Qi zK!+C`G6HH$$`T7QBIGNu6JUyO2D%}X>$_^i|29gQ`Kcd@=x9Z>g27~r8jv=DA)fkEmfwRd*Eyg6dAN6mqcPCyl&~dgU^w!z$3v%M z0<8G#dhgAAoW=nM1+dpj(GOy=bWvmC zXxvm|97R*`rq?DyF_(BZjq}I;*E*66Vf#}K;pIH<#w2uvIAS6XfsoB;%kgeH1bxuM zFoanRXuH$9F_GGcAbbtEcDqr>vqr=aa15y%$3@tY_s}QMJ5dCo%O|4mNbl5q%&Fz_ z^|&65!_bKaL#Zg~aIGiI<^e)Ng9$kyKs&;5I!N{dQW25xwc%=v`LHpT#wFo>5T0qZ z^nM85Va`>E`W$*Ovlqq#2kjmZyskGy>U3k$Io`~N!-+F!C()1?Oo;!GmD*r|oEa$nxg8~_ zrh~)JiPTa3gz~UIA6DWfIn}qV{XluAgQY$(Cc}hwjzF{qTUJ1{bi}&>;dZU167`q8 z8$#$^IqENYH+1z!9m@OD3pf|F`y6*8gx)9x?7`QorgIbC^!k%qoRsY~Q`oFg3vm!Z z?MI17o$~gXs8c&u(Vhue(rUGSGzM)4jk83P_L( zo1e#o`R8v=u8Y|_<8y>#v_QLqER$&XZ8Nf8c`fZfmceMCO$1v>_N0v0|D?{9#^Few zhppqHV>uni=~%84gWZxT=HXaA4g|bq5JcR$kMO`g1Q>QfR8Qhmj1L%O{d{iZUqJ2e z5cz617^Df*H9WNA=H2EKDQIHw=>G+Q?A#zG&BJ#PxV&Y0`(vRtSw<2>=%5Bg&~6C$gBpCCnYcH zyN_`debwsx5O~&p6bbcmP@bn;V^8xD?1T*9zwtdECu=iZK5}3$M&P&|NDYt;Qy-O3YB7MQ?xJtB zHhiOHC4~H|T?~%rmyfX(Z^KqZo7)PV2++18b_Vpq|K_$toClFm@PVyaf~|R5bEUr? zXM9A2YI8UkeZNspi|N|;8ymEj5{OtCR`i2s77IX$+bA|sQ!oWlOtHi?_CBEz7T?q; znv{Lei7I@b-EQ$y-xMi2y5g;pM0nIo;E0GFKxcqvL;Inyk(Xd2U~e4rXJSQrI6!wz6g69I)MGWt0Ba@5G$Y^QH}75c7!2gh;%NV6y;f;&uOR9m<5v~BmGG+sbcjI5W*~!%$zY|w zO2={Nf)lHUZXiXE$k~VQdZY_MjCD7T*CkE=z@;MK#iTT0mlhWEnwF@3#LlsUxC7gV zA?g)>m8r&RNRc$H#bp541T#)YB1OfpY&WbOqTvG|)?fX|4SCiW#IM^(I|T%M3BP{{ z%J(X`cTgu>kA6J}!wdyRyS9& z5Or5g$Y$h;dodoQ?$VMF={p&Rd}nm`YDug^*rE&#5_Oo=z zpb7CF&p%B-EC`Wmj*C3!I314#nbX_%q90BC72adKsKtL!w5zHy07yha>d|DHdCy)w zoqqd7rBcg|Gq!+nb4hIUAnLZJ+Mfi04USsn7PLorD8mSovKG7}ZMleYn=vctZ z$R#3n(21j!0{@|oU1s#7Hpl*s2Tb$^QG`Zf6CtBIrCB==(|}#ZGjVAgG@gZFOc?q` z)y7IO?N{YaW54{(*y>JWhtb$x%)uT&BTba1{!{Abv6-Ibc=oFeYvy2MaQoHe-pmk< zbrk1gCD4_t4|G^I>;^yerZwv@X4=PSx@w`ul;B=Zd9}yJ1ZAVdl}9wg_8o3H1;V(Q z$^IkjN#{2U!{x3nU@=`N6Jb0=idevA+_|$>!SsfxG11xzyqU{liM@zm*AVMF*otk2 zv!keS4vPY}e#yn;+i8Jb+-SfvLON>(z0|6vg(^!F+5 zbUM%b6wS7CVp#+XPz0i#2v|bDnE34`x09K$-!-FyZK=k@SNq)BWdlJoO0e_V(Hm`K zPk=Ytr-v&mb|jMFwM4E~kjZQf zMO%(sWnR|L)E$w_&08$+ka&+s2?vc9R=iw}^t;W3K61X_uRY(FwEoF{7 z59(Mau82Hc0*@T@S7wShudlD;Fx6OsXuw30q&2El5>wYB{eb&vh~5NRe+x^s!t%F!ZTW-%2;mIb z5Dv+A!(KpWC|cnp(KhHQ5J1dEJ^rdOA=DI+KPK^eB%k?J*$6M;@CVKbK3&4b5oFk` zW_@M){UZYzrx>S&6|Eti$EKkP{90IHZJjxAqA+IGB__$iD5xF&}Z)nW>I6}lBh>B}r-P`2e!F?0Den$%d z(TK0K2m_1jQbl!0MMQl+7y){^JSP_g-!dZm7_F`2pu$X%DI_pVmqMh2zu+;W`?)Wn zErZ_6r-MfbUEbRk(!E!Yp18#Ar%uYpnknSbFAOjt+a^mPulCK((eMe`r3RZUq$Ik4 zi-yaAUHgs?nu;mnAr4H%;>g56Z|E-j?Fc8*@h(y)g9RGxw*mVh1MOkCsB1!aVKf#7 z2~j{u_j7_y$nLIVgo5wn^Idxh{#WF-u2Y2tmt<>b_t3&bS}idHMroQ{6gp8@@S%Jl zbmE`|Cv+Ae$*So?_k3?=FF_4sSBNOJHUexccuux-TPQ4eMlSF6O8A16`l2nRn714F zZ;{h1!vz1?a;YVjI@MTK2{TU0=CCKj7erBCg!FmnYiVH%X3K}dVy7-Z2%!(h>wp#( zwcneWAgJNEAXiH#J2-5Xe@Ro!_V!|MCFiDj$v)B$xEQ*TeO8VPzdxA-CuILhAH6fa zT%~)HxeNFI<8pqpWdn8Pc0#fJ z_RwxSNCvrMT1i+aqS?81hW^bH3;BLllM`xT_IdJ9m?79T_LwIGNEXc{6Pgr5$E~wuuD&*RH-; zkZa3;4f+!%pNy{!jx1EHsALc|C?}&#^;UwF!BQHwcotbq+#W)od}IymDQHK|r2UB- zn^(9?0U;LvurGJPw%iS|bxuouiLXvV1H{o4AyJ`P`{o7pF~r~Q-XP2Y{j42uPOTkz zjy^?#vKp|k{XND45b3?7Q{68UeU2N}v&v`dmia1UuVHr_Qfp1fF#a+YVyg#o^vB&f zx0r_Z9U$`0B#tobmnYKZ7*pSwE(z;1=!Oc5NCQgK|lmPMV=!Hy2=iRGY7K!+4` zNJL07*)a389c@6Ih6($@8>!zyA!!ZW4n9&d{72n7xgehT8D-^FkQYz{wY zr-A`a6MilP1P>rZf#11^k}umIpB7_}6C#h>4X)I{)Y+}L^@ET2`Lu!n-1@;cv~8!< z;JqhXSl%JS7r}nyJrA5LLc7fGB)@=<{1(JfOIw% z*aq4eP*Nxp?Gj60ZTAG*veaO@M|1t}H}xhAw+28+EyuCu+E$E59zC`J_=6!XHx70AlEt$Lr*Ml9 zM0Y2mU)hkJd9+e8A441TA`A=8hRB4L+067a$>~*WIW)jFn{j3)8-SP0Y=$lfC-D3} zGyRBm96_$X=OxY7?D+hDdN+(s@K#6-Dv+y{6fYdGgSZAcFJeq+ObMYrh}{c?|4iN& zF;mFzUUwy;ACLOGcN2ZbLV#Okfknc-Mt0A;a(vVv;p$b{7S&g{`lW1-nt97T^N1QX zCIUZ%y80ml;Kq*st7wtGwYHbl{!=dQvMfpn9OyTNR^5pKf2tQwz*P^(( zMLvS!r&01HYCI{&^_VH#bBkQoW1?`iT0YhTja%i`9(^4-rx~ks{@R3p9;2tX#AyA) zl9OoO4kp1hSRwBD$EogfCu5s;dlApa=vm(wA~K)zkEpdhwNne0P!7L@-R$28IHv}8 zKZ)`*0A|GhteO-oIicXYns&?zz@U7rAKP_$lGo;@Egs{21meA$bpczWn|8?0L`OTi zAbs64@gfswPh(fi-wc^|+lr&@PKZ^l?Gl3b_<^S|7I|~Z!#E;vWu4AdJDHGzgfYWz zXv2HWORBZe&6qGmQ+8Ma?;}?3$<`(eXxhOMaN;uvGksvZFHs$}f!IOO$ADk}QH%QF z7Ixb;>R>_);TJsUTo7Xg#=9MO_k;dU!n<1<@h;bR=fu0q2I4OGg%M@0yVUOpGwp@h zt^=-@k!gMo>^cgz9St6I8l1|+kyo1(e*LyDJ0U&=#FLG8FmSh>qq7OFwR~i>iD>)C zIIj%$B7cU{Cb2b+SP!QL+2*GLM~wQh7RZoMjE0`V(OFVeXFlXDQVy;Ui1 zeq-W2$Qy6h@$ijm%#-KT7!c7@n`46y-;u!s`W-=~!{}5&jofYTf{AfFzUM_+IVK1s zI|0JrXc2hT`qQViCEDaH>Jmk9YHjxttP&=NV%EJR~MNpF#W{q)qZF<2W1G zpr`mkQrn$QRCFl~_KALCfpZqE2Avk-B@Qu(Sg{r!1{v>zZ#>sV;e)fN|1^V{{ETtA zK)hDp?xIB}a^7LGOq9}xMS4)PMimkk!w@Nm78O4*y&u2pDpxZb9%x}gD*od$ z8DJyg-4O?AkTzNHEeh<$X&|&{p(dO66y!*4@rtuQSHq=!-XMm=HR6{FDGYKy50^8U zaH@i|51(idC0Ns-YamX9ow6jt%L@^Z!(>GAxYvb17@ZHIgsHf{BT7d*l*l^yqAs(^ zB(nEl=)q!eE$UH>&!RTS6e5aj26F8u*<|EEXcoo=pihP_Y6MxB>s1&4^rd?M=!}jC zA2LV>Fxg!O;x)=5#z0UXP;Be0j2#x$U@^`{q>Mio5b+>lq8j78LJEnz5OT+?9|-7$ zBcfx%W0^cpq~NQ6&id{6VSY$I|*n7ki}z?=dhWf5!&yg1vLUv zkMTc`@pmE$rXSW8gO5u)HZ|s;(@-fE0&8V4%Ncz`9l|&=e8vb zitRv`fs3oW`E}L}s17wBV%?gb!5zVB$_+ML!3QgR5w(_}ABh0RQmMC>eoH=Jz*aTl z4LVWwAhBS%y_MJzTj6#r&GN^6XGZO#p^#jpt_hK+)LJi-Q~M1YbG0vG!$wjXXw((N zjrfS%_BJqCaC>2?7q=F$opz%H_ZzS4#COOW zSTCV2;wo|^=0etl+^?hm7rN5?_&iE~Ai{F!%>LtZv{F3xg1k;bm+7-|54VrBqA3KQ>Hj$#*tB6Q6f)Rpik+BK>n120ZIRKuO zp%G`fj^t?0S;S_@i&DZN2Pf7!W>KX{%?oFyd4U+8i+8xH-WsY0hvy`Sz)i_D?0wu4lXmF3hARj`jBJn6 zP2JvVR=4X4h#2c9DAsEFg&*ESrc&t*<@^u*F@Y7xNuT@>T4O?-?>ZFvKaBAqr$fqt zQ^~x~I|edSH>44}6#*cUZe{uk@GET)qo)TERU!|}-Bv#kM_EgZpIuLe2+vm4X~TlB zkh{r&JN?lXZ1j1_uylULxp5T5V_?bbCFp?f(=WCnR>EMXmgnJacK`;58iQ+%!GSb5 z4C7+h>^vX-xC#1DFiAw@+{9xC9ycuxvC_P!C`Lm+>h&dE$cmGj2My(=a^&EVJVeeIJTwdzih6W>5Xk&Rt{j}nhs%wF6B2T_Vpj)XDEy;- zrKg4E!jVY5i3h3^{KXe^CKT4laq+{1+}(BA@$Yl~v@9kp5$1d?S105OIscZM6Jmuq zm*tS5!-T@!a@x??@HzifomNsKNcDh)nI^Q!_Mwl5;jBfOD{{>oq2`QxWlQ2meabOm zEKPRdW4hsRLhvb?^?$#G%~`oE>CP|&jK(lU8`fVgO1d=|4Ee^*Hz%+;*17{pLEQ1x zWc)rU`u`d@{%=l>xnUJ)_1~NVK)b)G1eBvK4P_}~mrkP00!Y8+&^Oo<8rRUTgL~hY z8M}M|a1L-xAA7kPb>O=UgLOIaX5Wr6O^#^2@p1?T>}KriYk>2B<9a(0K5cECZw>9h2pu&1d*sTu#8R?BtiE=eiDr z;--I6^3VC)e5~GOi+YV(PFD}&X{isDnhVX6b(p}n{5O5vbvC2vrRpx zby|A<&81J8P`5TamIoCfuq;Xgi9S;?wUSYu3%`_YzrswJfyA4e zfgF$11G(uR%4_c)5Vng(1Zsb-f^=o3Sw4LC0%7L+a^&p!<7d_Z$4AC*+;;ffT_40& z>WxgzX>A^`0`q);KA(e-EMqQhK0N2ihiAv|CGzRn={#2s$r;Nt<&2!MbC9>kpNXo_ zw&a)CJ2?JmejF)yd|H7Y_u@jI8mxVS_itgh(?_VKIG9AMl8p{KpBQeI-VITTw0NdWQSdmiXM<9&*a1Mz2A)E!z-h4^@yLq2s+?X9th^F(z!NVFlz)83BDxpe1t z1{O3UMy-TnYHvTpOi>mryApsnbH*{0RkAz3Z}^NVBYN+Oun{ruv#ih8x4O3r2@6fC0)NY3Tv&jM4J$g1P)_xvgMY*eJZiq4dVPAlbHHDL*bB zU(k1A=1&N!y8D!yQCx?%8=6jGA*{pYuY7ijrmZ-1Xt6$i!eCk3!mKCd?7~5zw;}0a zBl%zhTs|*X6%HD7+nYozL~r~R1?|<}s157K{ct)_Og$x^EsPazds%KPe2_1Y%Zh$* z@V=O+Z!6%iQBwW?Bk1#AamF$J-#Ya@^sG0|CSj>9EajM7v_u}V27e=g{=%c5tM*&dMdXDT zAHV>ojFRdEm9n_BN7rIn8nnUL!a{e;lb7DncLpL6V#mVXfH(lueO@HWL_nl`Wa(&r zw|r^oJzSKtO8fC>xwLdPUnZX{9o54Wl?c7Y_=Ty)7(_G}V_CL{Tjla)nLJ58x$F*M z@>Mx{`6M17=PgHYa$R;VA0%X4kq<1-p6 zmJ`87QXrM;+T9v9X%)!;+kxXFo`w7_@mo8%)zAf_NlWBx`xs%;Q*w>{7NIMbPuYj^ ziSiZuN26w_HJW5#*;WTKo|wk?&}zn$aA!T9+M*dB2E`iM8*Tg0hUbJf`P$0+`ag-i z*&Eii01~4wmQdMc%$@`k;yL5ScA(c!~Oi)SFD7x`D;Tuz=(06V^EW z-PB)X^Xi#F6Oq8yx@O9Gt9uDk6}f!%2fU}8QC7&$)*UMQUf?}s_kFwg967B#lTXEe zljNi2BY36UTt1kOl`Z!_BTU&VAHM%hzEUoG;6X0Qtq&{_tpAep9=t`E@@d`n2Y2zF z$n|Minz95oWwBB3kNQG66cHdi#OpruT7x<>7#cYfPNOAvku-omB~mh&I( z0WVhm@a?1YBm|C<>UJ}o2oWf1_D*7^+bfM7qWzr7tKF&3N2D{UUB344gS=2KcdQc9 z-;ggkVui^&Ws9@d_(e9TeRQXxl6S^u{Dudwwd^ASx3J_iA_>lD2a$*!0gsV9S}t)e z5V|n=v@@Yshcd5@1I8R?8bBo!Y#tPI-B55SZCyVeFXyf67bdEkG=G3xNO*h;8-@+J zF2>PhFr>}r4&h!WUA;-4>9yIJU}c=V2-@jVC*s=l46n^e`*LZgwn_9o1#Jkl5;=V@ zB&!T+LFuGv^yvg``0Syz!LCl4`0F-*N=!}~SC_bcCZ9Uqje+Pi{uv*PvHlk)3DNkS z9nV-CcI|!nD6xZA=b;ptux9>^T@41v4HXytC;FHv_N08cvL7#&8!PYOb+WXfuuqQ0 z&tSF>BK{kcTEc`*eRbn!$%i-eK%{kQ!^kjN0SFm)9VG}HcTEo2cwf)nT3!x+!qMkW z8i{pE{VYe`!IL`o&)hrp%p%5wIe64wdWcA>B}Zf zl7l{>SQRp_tF2gBj(n(U65^-Us?0u;x;?~3#K*8ie9P{z4C4~CemR@^VSkiwD&$r2 z`AuV^Mr%T8Z~q5^4J1b_Sjq(Oc=Hn8D^0r;0%sorp{>DtT=t^(*7Ne=N9Xdja!7SA zVZu>4zItxhe8eVX*2n1trsc}ptLO56$*tA>5SLmW8##QK(Str?W?=WzjoyD_L>Kjx z9r~N_uDUrS3(w64hFH1mvB5B_yC3Ttgf$AQVFOp^$d?`)sNJO1OHq#8GQ`w=Azrp_ z=@B)7+&gGRMwQOX^kI3_b-8rQfIhv54{+lm{ooBN>|xltA5o8#4{aIB{p537#t7pt z)t-zw!UxTYvi~m5`=L(WZM(Df^=3s^u*|- z)g9X!+N-6XXn(daTx57ciZ?#*j3J`1C&$Q^CzrxhtbMY=5BC(tUzg3UMFpT zK}qs5ZT;9xIFiB^dv?iXJC=5R6wE!RySS0_oV1;IfHMRkd}>4{fG(1mH~3){HMByCwr(X%@5O!urPVET=mp+A^AP|>{HLeA(ro) zE~NflKDl%3xJ2|M&TD_|51RWkg=&=l>cD`}1AN%Spza6I`Xox2G-6fKH*(sp<-&-U z>JIJ7_N*NDv;)>^-_w5*MmNiO&lDoEXn5vcA;}}B)(*fyH?MYMc-q^T zrw?)z@4~=^5b^Sr+5{o3UKZW&K-kUhrNa}{?R3hQw5!X=e`;Snp+2x*qX%g1mH5aB z@^wZhJt|l3NsgKY0zX7=1U{p?q5fG5OPe8|+B4K|0zTSYaP7XE$H)J{XEVp)MiG9K%*KsCnTHXZF!C>iyM-mbhx*YLHufCm?BY`zI&zV3>+gr2k&iq( zte25O<+*7{1P(X6RZs#O`{%mWXG3{-8h#qnIeJbjmMzac+7ll}e;pcQbOlCb$VZ-= zhJ3)a=WgjftWCemz(mZ56cH)juz$)KfA~Z9Vb8%hI4?7~8_unC;JR|4q zpDv6#Bk$Xv%pZ}@?tjLSf12?HSvqvCQ(NcfVuY|A&r}vw-yBnf&qV(XI_CII>Ch%G zMr1-SiV&?7BIfRR?kGDCD#GL)&xMsY>)QAn{kd~{Vb!nubd1$Y+>D?~$3#W(AmEDr zOl=z2jJ9&4Z;@UuBw~TQm;k<2BLIIcyf{N|@0h5AfMSbpmX;aViuUw8808)jkTxw@)9j`imw>P{Yg zojV@RX8d6=Qv-yNH|o?Dc=P$8a>gIR`sw{c;M>~sdVTFl)Y10e;8%Fj-*|RtmHS1# zq3jUjWzme6gY5ef8GrE9jgB1y_}bE&ZTIHftP{f3@F`l!Znoe1J2-9<11+G38w4B! z0dc<};I!WMfLZVR0D@{7vlh?y7BT(+wB*4{dfV!?Xa`4Ehv?7RL=8qAe>9=#l(Jm% zgAG}W-HRXITjcg*seG86`sZXGE0_FvXc%rHa`G0&xq7r!-uLH6d7do2IzDuei$aB< z_Ul(#*e!kJwXc53XVvBXC5Q_t-`15J|F<9{@2kuI>%&2P%gYdjRw0N$+M|3epc;VS zubd8MaKNX=*Nu7aEq^}ql`|v!y2pOub!s_M+!A1BwOE3yiv7MWSC-A^Kbdk#RMUyMLu_N zq7d_`+`DB<_aSG!pB(XJj%4Vu4SVzna( zrtTTcWJ9{HJI-$1vj8^v(6@WLAF5&eP#GYP@q>``!Lu!Fzz=mr-#s7%mE$B{-V8Wj z*L-EVY2x7vj1wGz)*OX~98Cjcq<{Fx{=yZL3ew-+9RFzksk-!!CP&z6@BbO&Zj5Kb zL&pFmb!Bb%OCS9|s#gMes34SIs&5VAO}xuY&^8&6QLlvX`P?5%MnnDNQ2w4E*sS%I zF#e%QuuXPZd+^cqF;V<>KRnf!_TsnuhfVc3DY&FR_D=U=EEDTbi~M1~4kWfgJl0G| z$`W|r(9ozSy-q8<2)VqlZ7z2z?=D1r?t-dr4DazAeIIXbJU<}5K5ZQTlh7;bZCoXKOMRk&f`{+m=*@VUiWOwJLacm# zXw(6;zy8Wyd;}Nj0$lO4`IExD5Ld%&{wm@V*V-I@*crF(>RT}2Gz=3K#yYnf?Iqw8!5 z-xf6IH0sn=Rc~L+N0^4;CWdLwF~AN$E8qa&FyI2<2;dUn5MVn7ZLe=E2Q)sUNv;v@> zjtoFFGsQuCph9pIx!UgKFFS-}g#5!(m>`wwrB<)HS*PdDAk`TCcmKM*a~}=Ift&B8 zBf#Haj5}?V=cvTRliv>124h9P*RH(-^;+5XpZjQI&7Iy`P{#>XYmYa|EcGd=et$XN zCFE*cB(84PIW!NP(!|k>l0-uCI}0F=lLSaKZUAwYxO^Uf1v${32#=!>ln$cPvjHUla3{S6fHCP9la4Xz7?X}MR*bP?j1^<77-I!)YbgNp zTF(>aT6&ub727*Ib7m<=evN z;U^h%Nr^E!T;NhlYJGM!kKzHQxJ0O)RBwNb2buggV!kcsUCtUl3JjL&kJa#4^Bp9w zd5Pb^x+mbmhjBUyK>ea#=L1o1GTKe3Uoh&esN*!L<>B&B|H7z`txtS{599vx7&GNE zSN@Z{*O**THUc>=F;JN_oHfaGTbC%k(Qcu31%Dp_;={EYN|5UBT}Phexx(IsE{lr~ z8@88z?WVgL_zdIht|duvqcmMtfxWZPCyCsV%kAR*qDC6cQ#uc&SA#@}m9aFI?GA@ev7oPLa>nPk$o5nU&aas>au@c}TZ+ zRu`Mqb@(YhUa;+RwLZn4pu0h?s-5tWuN`tV?u5^*E^%Gi$+Lu23+l)3;;GzGQe3dA zY(a5BS<;H-g~ejps^WsxE0&KB5`XXCQP>6&g zQ7kJdUM?1wFD?U;q$K;Q#mmc*ZuCi7v#PWca%-n)Y}AuRi=_q2i<4H{iwhSoTwK@* z|ANKK3s&7P-gQToSg^cEo1=c^ZvG8-EL^c_DZ{_}3Ko~y7Zh>KT?Wh+*Q zr7M;%LKJ(031dWKB}E29#f1fnON)!d`xavmu}&;pQB*7rEW#*^D=V{)Nlqq;3k&S4 z*OV5oUbbM^l7eN$tM4xyR=8qWvZDjhYHh(cCQ4aQtkd|b$wBqn!(iR|AWcysQKvA;94^VpjMG@V;qSWvcj z#d3pSny0X2*$PLIcw@TGgFDuDlj8q{(Kj%R0r!{LON+}eOy3XV2CfeJJ-mxSJSnRK z9YkoE*6;s7ULAD(PjPAT?%0!K#G9*!hA%59BaK?T{N94n#ZZmpqT+j#m#--;WfojQ zEnZ$!25nweuzXEHscYdg{N#`uE7CSMq5j?dh+moxuH|7oY{7~Zxb6g8g(byBP_rV} zC^v5$x-r1H-2B(zQ9?~dtbfGke*a9YRMuV`eO-^w#FW2C*Ed4w8f?iITpqD{2^pe^25`XUZ?#>#Oy0DAr5= zN-yi>9VV@GF!y1-VS1=u#thcWlSao2<@)oB$$A;>ub0V_^ztA3^>W-mp(E@4T*;e_O7Xw-_sS^k1wuEHsw1aG~-1|4->)9TR>#N1u3*vC>`J z_2(92MK2qiSg#2WAE|fh@0p^PXC%G6{JmZ}zthW}TlDf;lV0BarC$E?Je5#_IR7PG z{6& zzkU_}eBtK_uPvRc{H?*tdW3YwWo#ef_>a_Pl-93%%z%KK^vsy6AHO2X{Pc5+;UM z%;i(;D_)NqzTx$m7hb8pE99X!KW;zbUG@6BvhN<;w8Htt%h$(tfAZyB=l%B&d?$R= ziCy28eXw}Y_6xffpLpim=^uXc`m~Lyw-5AnJMr|}k5+$tG%jS%>H7}tE>8L?amAdW z!kX!2l?Rvq;X*~;;pfl4HsR;9_g-~WeOeKA=g}SGXWemm;g>HQ82_VE zcz4*euV4DtHpi;O4Uy|djotg#<~>>8nu-qeT9|o!qQu|GeAM39=GyvB>8xk{vtO6a zY-{fM$v1aIfAW-n++D@bTdstT+Aw>im|$7rwvYJBnPWZoo#=k-!^Ts6N0$c9n()G% zgEQ{S`f^LlQz?g!ANB0YIB;w4kh-_t%`KdH?%;Iagw5~I-TmI}_Z9k9J4%MF`2Leu zjy+rU`1;H9zIo+Z`Ey7V^+?XIJXIdKr}c$Z)$a&_y^3zVRP#FiE>vOP_IWT4-eh$ zxV-#Kxqs`TgR6S1cr~c-p||#)+VO|5^d08cuXfFSDQ0ExsEFRvV&Xr$?}q{Ahbl+B z_rinLcjDxAAdiV9?llm+=x!ck;E9wK$ind0MNLp}zS+TgZ3mN%=L7y4M8$U$E^J?x#MLNIc3f#lz)i2(| zXYlDomvB3)6@Y_O5zaqFIJY3`5{k_L9IT2%05~@lM*^Y&y#XQs=cwX%Kq5c_r2Oew zp1^y-bO;Me0A&Ct0B5U(I{11Z)TF0~`Zj zf~AU0W|=0 zUUdurB33DYw)*V-{JqdY<-3vpxbokie)6CAl2E~EcO5>-2MNwou5%~(d|_R*EA=fZ zvs^p0vfS0Cl?PloZ&Uj@*D)&B=eVNZq4JokoXQI3I;WMTuGCZXe8jbb%F0Mrn^xwz za^9uqQ?6rFZm_tb-=i|yRj!p)u5()1=t_Mb?HeOqJG8RI)uxq4Tsf!tpsAD2=?==N z;N%#n)sbLe>@+wttD5ni$X3OrGTx({vGv({U;LLC((%s}ddVeuaJEH806#sVfAsSs zy)3I=d5lN$dg%lHJg;{i;{n`-`Ycz!x45N;DWa0TT^rxBAzggWHg#J|R%7^Je2~(R zbo@vA(@DSWY&olSc5OOC=;#-3zwHs8NIeDyn<9?`lL@~Ju5>A9cv3L^AVD_{=+ zI)t^YjQN2{YumKJ!b7M7hwu;>jEe9O;xIFn(Tq{kLn40jNM$@VqeOIpCgC9n!b&Cn z`!kRTs95-T(QxvCXD+#ztVmTw2_0Js4P69f@Z3V_a=q5;@grsDvp zw;3D8+`t6C5CA3yrGg){zz==>oB+J{JI4h7Q~>J!X8{+CIf+H=S45yuyjgucb)#fA3{D@?ps96sz;afBp|N*+EudBm;a@R4IiO0GTK zgx(4EvJ#xNitZ^WqqDrxd6eE+x;1(DNKqO-CM9KzbgOG!l+ZK4IO)3{3KycyBgaU? zUF*0IS>NM2zr|c%DG2v=tsi9(8UkED_7EN&)VSRso(keS{TmCQ#rW&$f2JD$mtUcW z>#xy5@UU5K#?QDJ8<&O-9sfE8-i8Jm2(E28kN=DJd6&H>26pQy1O?Fl%UcLlTw+h5 zKOUO#&`b|KT=(d&ThY==1L!qm5qib70}mrzEQ|kJN{B8e3EVu+%o! vCBmXT^#0Hl*-Pke5+($>QhNyl15jbC=L@c)UP5g5+@lz}`6gD4diMVSq?pXd delta 14894 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 diff --git a/bin/nbns/nbns-advertiser b/bin/nbns/nbns-advertiser index 3ec67fdf0501e3f4bafda254dfd5157ec18b1b6b..d6158056fbf78121ed325156425aaa2c23e7e03a 100755 GIT binary patch delta 46537 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 delta 32082 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 diff --git a/build/mdns-advertiser.c b/build/mdns-advertiser.c index 3d28497..6c3e327 100644 --- a/build/mdns-advertiser.c +++ b/build/mdns-advertiser.c @@ -32,7 +32,7 @@ #define MAX_NAME 256 #define MAX_LABEL 63 #define MAX_TXT_STRING 255 -#define ANNOUNCE_INTERVAL 30 +#define STARTUP_BURST_COUNT 4 #define MODEL_TXT_PREFIX "model=" #define ADISK_DEFAULT_DISK_KEY "dk0" #define ADISK_SYS_ADVF "0x1010" @@ -60,12 +60,12 @@ #define SNAPSHOT_CAPTURE_STEP_SECONDS 5 #endif #define TAKEOVER_RETRY_COUNT 6 -#define STARTUP_BURST_COUNT 7 #define MAX_IFACE_CONTEXTS 16 #define AUTO_IP_STABILIZE_SECONDS 3 #define AUTO_IP_STARTUP_POLL_SECONDS 2 #define AUTO_IP_STABLE_POLL_SECONDS 30 #define ADVERTISER_VERSION_CODE 2104 +#define DNS_SD_SERVICE_ENUMERATION_NAME "_services._dns-sd._udp.local." #define DNS_TYPE_A 1 #define DNS_TYPE_PTR 12 @@ -74,6 +74,7 @@ #define DNS_TYPE_SRV 33 #define DNS_TYPE_ANY 255 #define DNS_CLASS_IN 1 +#define DNS_CLASS_ANY 255 #define DNS_CLASS_CACHE_FLUSH 0x8000 #define DNS_CLASS_QU 0x8000 #define DNS_CLASS_IN_UNIQUE (DNS_CLASS_IN | DNS_CLASS_CACHE_FLUSH) @@ -85,6 +86,8 @@ #define DNS_FLAG_AA 0x0400 #define LEGACY_UNICAST_TTL_MAX 10 #define TC_KNOWN_ANSWER_DEFER_MS 450 +#define MDNS_MULTICAST_RESPONSE_DELAY_MIN_MS 20 +#define MDNS_MULTICAST_RESPONSE_DELAY_MAX_MS 120 #define PLANNED_RR_MAX 192 #define PLANNED_RDATA_MAX 1024 @@ -324,6 +327,18 @@ struct planned_rr_set { int truncated; }; +struct response_question_section { + const uint8_t *bytes; + size_t len; + uint16_t count; +}; + +struct stored_question_section { + uint8_t bytes[BUF_SIZE]; + size_t len; + uint16_t count; +}; + struct deferred_response { int active; int sockfd; @@ -334,10 +349,12 @@ struct deferred_response { socklen_t multicast_dest_len; struct sockaddr_storage source; socklen_t source_len; + struct stored_question_section questions; struct planned_rr_set planned; }; static struct deferred_response g_deferred_response; +static const unsigned int g_startup_burst_offsets_ms[STARTUP_BURST_COUNT] = {0, 1000, 3000, 7000}; static int name_equals(const char *a, const char *b); static int build_instance_fqdn(char *out, size_t out_len, const char *instance_name, const char *service_type); @@ -2782,6 +2799,22 @@ static void sleep_millis(unsigned int delay_ms) { (void)usleep((useconds_t)delay_ms * 1000U); } +static unsigned int random_multicast_response_delay_ms(void) { + static int seeded = 0; + unsigned int span; + + if (!seeded) { + srand((unsigned int)(time(NULL) ^ (time_t)getpid())); + seeded = 1; + } + span = (MDNS_MULTICAST_RESPONSE_DELAY_MAX_MS - MDNS_MULTICAST_RESPONSE_DELAY_MIN_MS) + 1U; + return MDNS_MULTICAST_RESPONSE_DELAY_MIN_MS + (unsigned int)(rand() % (int)span); +} + +static void delay_multicast_query_response(void) { + sleep_millis(random_multicast_response_delay_ms()); +} + static long long monotonic_millis(void) { struct timeval tv; @@ -2886,6 +2919,28 @@ static int set_outbound_multicast_interface(int sockfd, uint32_t ipv4_addr, cons return 0; } +static void configure_unicast_response_hop_limit4(int sockfd) { +#ifdef IP_TTL + int ttl = 255; + if (setsockopt(sockfd, IPPROTO_IP, IP_TTL, &ttl, sizeof(ttl)) < 0) { + fprintf(stderr, "warning: mdns socket: IP_TTL=255 failed: %s\n", strerror(errno)); + } +#else + (void)sockfd; +#endif +} + +static void configure_unicast_response_hop_limit6(int sockfd) { +#ifdef IPV6_UNICAST_HOPS + int hops = 255; + if (setsockopt(sockfd, IPPROTO_IPV6, IPV6_UNICAST_HOPS, &hops, sizeof(hops)) < 0) { + fprintf(stderr, "warning: mdns socket: IPV6_UNICAST_HOPS=255 failed: %s\n", strerror(errno)); + } +#else + (void)sockfd; +#endif +} + static int configure_multicast_socket_options(int sockfd) { int yes; @@ -2893,6 +2948,7 @@ static int configure_multicast_socket_options(int sockfd) { (void)setsockopt(sockfd, IPPROTO_IP, IP_MULTICAST_TTL, &yes, sizeof(yes)); yes = 1; (void)setsockopt(sockfd, IPPROTO_IP, IP_MULTICAST_LOOP, &yes, sizeof(yes)); + configure_unicast_response_hop_limit4(sockfd); return 0; } @@ -3451,6 +3507,7 @@ static int set_outbound_multicast_interface6(int sockfd, unsigned int ifindex, c } (void)setsockopt(sockfd, IPPROTO_IPV6, IPV6_MULTICAST_HOPS, &hops, sizeof(hops)); (void)setsockopt(sockfd, IPPROTO_IPV6, IPV6_MULTICAST_LOOP, &loop, sizeof(loop)); + configure_unicast_response_hop_limit6(sockfd); if (log_success) { fprintf(stderr, "mdns %s socket: IPv6 outbound multicast ifindex=%u\n", socket_role, ifindex); } @@ -4557,6 +4614,61 @@ static int plan_snapshot_record(struct planned_rr_set *set, return planned_rr_add_link_addresses(set, routes, record->host_fqdn, link, include_a, include_aaaa, ttl); } +static int plan_service_type_enumeration_type(struct planned_rr_set *set, + int routes, + const char *service_type, + uint32_t ttl) { + if (service_type == NULL || service_type[0] == '\0') { + return 0; + } + return planned_rr_add_name(set, + routes, + DNS_SD_SERVICE_ENUMERATION_NAME, + DNS_TYPE_PTR, + DNS_CLASS_IN, + ttl, + service_type); +} + +static int plan_service_type_enumeration_records(struct planned_rr_set *set, + int routes, + const struct config *cfg, + const struct service_record_set *snapshot_records, + int use_snapshot_records) { + size_t i; + + if (smb_enabled(cfg) && + plan_service_type_enumeration_type(set, routes, cfg->service_type, cfg->ttl) != 0) { + return -1; + } + if (adisk_enabled(cfg) && + plan_service_type_enumeration_type(set, routes, cfg->adisk_service_type, cfg->ttl) != 0) { + return -1; + } + if (cfg->device_model[0] != '\0' && + plan_service_type_enumeration_type(set, routes, cfg->device_info_service_type, cfg->ttl) != 0) { + return -1; + } + if (!use_snapshot_records && is_airport_enabled(cfg) && + plan_service_type_enumeration_type(set, routes, cfg->airport_service_type, cfg->ttl) != 0) { + return -1; + } + if (use_snapshot_records) { + for (i = 0; i < snapshot_records->count; i++) { + if (is_suppressed_snapshot_service_type(snapshot_records->records[i].service_type)) { + continue; + } + if (plan_service_type_enumeration_type(set, + routes, + snapshot_records->records[i].service_type, + cfg->ttl) != 0) { + return -1; + } + } + } + return 0; +} + static int planned_set_has_route(const struct planned_rr_set *set, int route) { size_t i; @@ -4744,6 +4856,14 @@ static int plan_question_answers(struct planned_rr_set *planned, const char *adisk_instance_fqdn, const char *device_info_instance_fqdn, const char *airport_instance_fqdn) { + if (name_equals(qname, DNS_SD_SERVICE_ENUMERATION_NAME) && + (qtype == DNS_TYPE_PTR || qtype == DNS_TYPE_ANY)) { + return plan_service_type_enumeration_records(planned, + route, + cfg, + snapshot_records, + use_snapshot_records); + } if (smb_enabled(cfg) && name_equals(qname, cfg->service_type) && (qtype == DNS_TYPE_PTR || qtype == DNS_TYPE_ANY)) { return plan_smb_records(planned, route, cfg, instance_fqdn, response_link, 1, 1, 1, 1, 1); @@ -4872,6 +4992,7 @@ static int build_planned_response_packet(uint8_t *reply, uint16_t response_id, int route, int legacy_unicast, + const struct response_question_section *questions, const struct planned_rr_set *planned) { struct dns_header hdr; size_t off = sizeof(struct dns_header); @@ -4881,6 +5002,13 @@ static int build_planned_response_packet(uint8_t *reply, memset(&hdr, 0, sizeof(hdr)); hdr.id = response_id; hdr.flags = htons(DNS_FLAG_QR | DNS_FLAG_AA); + if (legacy_unicast && questions != NULL && questions->count > 0) { + if (questions->bytes == NULL || questions->len == 0 || + append_bytes(reply, &off, reply_cap, questions->bytes, questions->len) != 0) { + return -1; + } + hdr.qdcount = htons(questions->count); + } for (i = 0; i < planned->count; i++) { if ((planned->records[i].routes & route) == 0) { continue; @@ -4897,6 +5025,54 @@ static int build_planned_response_packet(uint8_t *reply, return 0; } +static void stored_question_section_as_response(const struct stored_question_section *stored, + struct response_question_section *out) { + out->bytes = stored->bytes; + out->len = stored->len; + out->count = stored->count; +} + +static int send_planned_response_route(int sockfd, + const struct planned_rr_set *planned, + int route, + uint16_t response_id, + const struct response_question_section *questions, + const struct sockaddr *dest, + socklen_t dest_len, + int use_snapshot_records, + int delay_multicast) { + uint8_t reply[BUF_SIZE]; + size_t reply_len; + int answers; + int legacy_unicast = route == MDNS_REPLY_LEGACY_UNICAST; + + if (build_planned_response_packet(reply, + sizeof(reply), + &reply_len, + &answers, + response_id, + route, + legacy_unicast, + questions, + planned) != 0) { + return -1; + } + if (answers <= 0) { + return 0; + } + if (delay_multicast && route == MDNS_REPLY_MULTICAST) { + delay_multicast_query_response(); + } + return send_dns_packet_any("query_response", + sockfd, + reply, + reply_len, + dest, + dest_len, + answers, + use_snapshot_records); +} + static void clear_deferred_response(void) { memset(&g_deferred_response, 0, sizeof(g_deferred_response)); } @@ -4958,78 +5134,49 @@ static int copy_sockaddr_storage(struct sockaddr_storage *out, } static int flush_deferred_response_now(void) { - uint8_t reply[BUF_SIZE]; int status = 0; + struct response_question_section questions; if (!g_deferred_response.active) { return 0; } + stored_question_section_as_response(&g_deferred_response.questions, &questions); if (planned_set_has_route(&g_deferred_response.planned, MDNS_REPLY_LEGACY_UNICAST)) { - size_t reply_len; - int answers; - if (build_planned_response_packet(reply, - sizeof(reply), - &reply_len, - &answers, - g_deferred_response.response_id, - MDNS_REPLY_LEGACY_UNICAST, - 1, - &g_deferred_response.planned) != 0 || - (answers > 0 && - send_dns_packet_any("query_response", - g_deferred_response.sockfd, - reply, - reply_len, - (const struct sockaddr *)&g_deferred_response.source, - g_deferred_response.source_len, - answers, - g_deferred_response.use_snapshot_records) != 0)) { + if (send_planned_response_route(g_deferred_response.sockfd, + &g_deferred_response.planned, + MDNS_REPLY_LEGACY_UNICAST, + g_deferred_response.response_id, + &questions, + (const struct sockaddr *)&g_deferred_response.source, + g_deferred_response.source_len, + g_deferred_response.use_snapshot_records, + 0) != 0) { status = -1; } } if (planned_set_has_route(&g_deferred_response.planned, MDNS_REPLY_UNICAST)) { - size_t reply_len; - int answers; - if (build_planned_response_packet(reply, - sizeof(reply), - &reply_len, - &answers, - g_deferred_response.response_id, - MDNS_REPLY_UNICAST, - 0, - &g_deferred_response.planned) != 0 || - (answers > 0 && - send_dns_packet_any("query_response", - g_deferred_response.sockfd, - reply, - reply_len, - (const struct sockaddr *)&g_deferred_response.source, - g_deferred_response.source_len, - answers, - g_deferred_response.use_snapshot_records) != 0)) { + if (send_planned_response_route(g_deferred_response.sockfd, + &g_deferred_response.planned, + MDNS_REPLY_UNICAST, + g_deferred_response.response_id, + &questions, + (const struct sockaddr *)&g_deferred_response.source, + g_deferred_response.source_len, + g_deferred_response.use_snapshot_records, + 0) != 0) { status = -1; } } if (planned_set_has_route(&g_deferred_response.planned, MDNS_REPLY_MULTICAST)) { - size_t reply_len; - int answers; - if (build_planned_response_packet(reply, - sizeof(reply), - &reply_len, - &answers, - 0, - MDNS_REPLY_MULTICAST, - 0, - &g_deferred_response.planned) != 0 || - (answers > 0 && - send_dns_packet_any("query_response", - g_deferred_response.sockfd, - reply, - reply_len, - (const struct sockaddr *)&g_deferred_response.multicast_dest, - g_deferred_response.multicast_dest_len, - answers, - g_deferred_response.use_snapshot_records) != 0)) { + if (send_planned_response_route(g_deferred_response.sockfd, + &g_deferred_response.planned, + MDNS_REPLY_MULTICAST, + 0, + &questions, + (const struct sockaddr *)&g_deferred_response.multicast_dest, + g_deferred_response.multicast_dest_len, + g_deferred_response.use_snapshot_records, + 0) != 0) { status = -1; } } @@ -5063,6 +5210,7 @@ static int defer_planned_response(int sockfd, socklen_t multicast_dest_len, const struct sockaddr *source, socklen_t source_len, + const struct response_question_section *questions, int use_snapshot_records, const struct planned_rr_set *planned) { if (!planned_set_has_any_route(planned)) { @@ -5076,6 +5224,15 @@ static int defer_planned_response(int sockfd, g_deferred_response.response_id = response_id; g_deferred_response.use_snapshot_records = use_snapshot_records; g_deferred_response.planned = *planned; + if (questions != NULL && questions->count > 0) { + if (questions->bytes == NULL || questions->len > sizeof(g_deferred_response.questions.bytes)) { + clear_deferred_response(); + return -1; + } + memcpy(g_deferred_response.questions.bytes, questions->bytes, questions->len); + g_deferred_response.questions.len = questions->len; + g_deferred_response.questions.count = questions->count; + } if (copy_sockaddr_storage(&g_deferred_response.multicast_dest, &g_deferred_response.multicast_dest_len, multicast_dest, @@ -5107,7 +5264,6 @@ static int handle_query_any(int sockfd, uint16_t ancount; uint16_t query_id; uint16_t flags; - uint8_t reply[BUF_SIZE]; char instance_fqdn[MAX_NAME]; char adisk_instance_fqdn[MAX_NAME]; char device_info_instance_fqdn[MAX_NAME]; @@ -5117,9 +5273,12 @@ static int handle_query_any(int sockfd, int source_port; int legacy_unicast_query; int source_allows_unicast; + size_t question_section_start = sizeof(struct dns_header); + struct response_question_section questions; static struct planned_rr_set planned; memset(&planned, 0, sizeof(planned)); + memset(&questions, 0, sizeof(questions)); instance_fqdn[0] = '\0'; adisk_instance_fqdn[0] = '\0'; device_info_instance_fqdn[0] = '\0'; @@ -5193,7 +5352,7 @@ static int handle_query_any(int sockfd, qtype = ntohs(qtype); qclass_raw = ntohs(qclass); qclass_base = (uint16_t)(qclass_raw & 0x7FFF); - if (qclass_base != DNS_CLASS_IN) { + if (qclass_base != DNS_CLASS_IN && qclass_base != DNS_CLASS_ANY) { continue; } if (legacy_unicast_query && source_allows_unicast) { @@ -5219,6 +5378,9 @@ static int handle_query_any(int sockfd, return -1; } } + questions.bytes = packet + question_section_start; + questions.len = cursor - question_section_start; + questions.count = qdcount; suppress_planned_known_answers(packet, packet_len, cursor, ancount, &planned); @@ -5229,6 +5391,7 @@ static int handle_query_any(int sockfd, multicast_dest_len, source, source_len, + &questions, use_snapshot_records, &planned) != 0) { return -1; @@ -5237,31 +5400,43 @@ static int handle_query_any(int sockfd, } if (planned_set_has_route(&planned, MDNS_REPLY_LEGACY_UNICAST)) { - size_t reply_len; - int answers; - if (build_planned_response_packet(reply, sizeof(reply), &reply_len, &answers, query_id, MDNS_REPLY_LEGACY_UNICAST, 1, &planned) != 0 || - (answers > 0 && - send_dns_packet_any("query_response", sockfd, reply, reply_len, source, source_len, answers, use_snapshot_records) != 0)) { + if (send_planned_response_route(sockfd, + &planned, + MDNS_REPLY_LEGACY_UNICAST, + query_id, + &questions, + source, + source_len, + use_snapshot_records, + 0) != 0) { status = -1; } } if (planned_set_has_route(&planned, MDNS_REPLY_UNICAST)) { - size_t reply_len; - int answers; - if (build_planned_response_packet(reply, sizeof(reply), &reply_len, &answers, query_id, MDNS_REPLY_UNICAST, 0, &planned) != 0 || - (answers > 0 && - send_dns_packet_any("query_response", sockfd, reply, reply_len, source, source_len, answers, use_snapshot_records) != 0)) { + if (send_planned_response_route(sockfd, + &planned, + MDNS_REPLY_UNICAST, + query_id, + &questions, + source, + source_len, + use_snapshot_records, + 0) != 0) { status = -1; } } if (planned_set_has_route(&planned, MDNS_REPLY_MULTICAST)) { - size_t reply_len; - int answers; - if (build_planned_response_packet(reply, sizeof(reply), &reply_len, &answers, 0, MDNS_REPLY_MULTICAST, 0, &planned) != 0 || - (answers > 0 && - send_dns_packet_any("query_response", sockfd, reply, reply_len, multicast_dest, multicast_dest_len, answers, use_snapshot_records) != 0)) { + if (send_planned_response_route(sockfd, + &planned, + MDNS_REPLY_MULTICAST, + 0, + &questions, + multicast_dest, + multicast_dest_len, + use_snapshot_records, + 1) != 0) { status = -1; } } @@ -5839,7 +6014,6 @@ int main(int argc, char **argv) { struct sockaddr_in mdns_dest; struct sockaddr_in6 mdns_dest6; int i; - time_t last_announce = 0; int use_snapshot_records = 0; int shared_bind = 0; int auto_ip = 0; @@ -5853,7 +6027,6 @@ int main(int argc, char **argv) { int snapshot_capture_failed = 0; int snapshot_capture_skipped = 0; int trusted_snapshot_written = 0; - static const unsigned int startup_burst_offsets_ms[STARTUP_BURST_COUNT] = {0, 250, 1000, 2000, 4000, 8000, 16000}; size_t startup_burst_index = 0; long long startup_burst_start_ms = 0; @@ -6190,7 +6363,6 @@ int main(int argc, char **argv) { } startup_burst_start_ms = monotonic_millis(); - last_announce = time(NULL); last_iface_poll = time(NULL); while (!g_stop) { @@ -6251,7 +6423,6 @@ int main(int argc, char **argv) { log_link_contexts("mdns auto-ip active", &auto_links); startup_burst_start_ms = monotonic_millis(); startup_burst_index = 0; - last_announce = time(NULL); } } } @@ -6261,7 +6432,7 @@ int main(int argc, char **argv) { now_ms = monotonic_millis(); (void)flush_deferred_response_if_due(now_ms); while (startup_burst_index < STARTUP_BURST_COUNT && - now_ms - startup_burst_start_ms >= (long long)startup_burst_offsets_ms[startup_burst_index]) { + now_ms - startup_burst_start_ms >= (long long)g_startup_burst_offsets_ms[startup_burst_index]) { announce_all_links(&sockets, &auto_links, &mdns_dest, &mdns_dest6, &cfg, &snapshot_records, use_snapshot_records, "startup_announce"); startup_burst_index++; now_ms = monotonic_millis(); @@ -6281,7 +6452,7 @@ int main(int argc, char **argv) { } } if (startup_burst_index < STARTUP_BURST_COUNT) { - next_burst_ms = startup_burst_start_ms + (long long)startup_burst_offsets_ms[startup_burst_index]; + next_burst_ms = startup_burst_start_ms + (long long)g_startup_burst_offsets_ms[startup_burst_index]; wait_ms = next_burst_ms - now_ms; if (wait_ms < 0) { wait_ms = 0; @@ -6358,10 +6529,6 @@ int main(int argc, char **argv) { } } - if (time(NULL) - last_announce >= ANNOUNCE_INTERVAL) { - announce_all_links(&sockets, &auto_links, &mdns_dest, &mdns_dest6, &cfg, &snapshot_records, use_snapshot_records, "periodic_announce"); - last_announce = time(NULL); - } } send_link_goodbyes(&sockets, &auto_links, &mdns_dest, &mdns_dest6, &cfg, &snapshot_records, use_snapshot_records); @@ -6375,7 +6542,6 @@ int main(int argc, char **argv) { } startup_burst_start_ms = monotonic_millis(); - last_announce = time(NULL); while (!g_stop) { fd_set rfds; @@ -6389,13 +6555,13 @@ int main(int argc, char **argv) { now_ms = monotonic_millis(); (void)flush_deferred_response_if_due(now_ms); while (startup_burst_index < STARTUP_BURST_COUNT && - now_ms - startup_burst_start_ms >= (long long)startup_burst_offsets_ms[startup_burst_index]) { + now_ms - startup_burst_start_ms >= (long long)g_startup_burst_offsets_ms[startup_burst_index]) { struct link_context link; init_explicit_link_context(&link, cfg.ipv4_addr); if (send_announcement(sockfd, &mdns_dest, &cfg, &link, cfg.ttl, &snapshot_records, use_snapshot_records) != 0) { char detail[96]; snprintf(detail, sizeof(detail), "burst_index=%lu offset_ms=%u", - (unsigned long)startup_burst_index, startup_burst_offsets_ms[startup_burst_index]); + (unsigned long)startup_burst_index, g_startup_burst_offsets_ms[startup_burst_index]); log_send_failure("startup_announce", &mdns_dest, use_snapshot_records, detail); } startup_burst_index++; @@ -6405,7 +6571,7 @@ int main(int argc, char **argv) { FD_ZERO(&rfds); FD_SET(sockfd, &rfds); if (startup_burst_index < STARTUP_BURST_COUNT) { - next_burst_ms = startup_burst_start_ms + (long long)startup_burst_offsets_ms[startup_burst_index]; + next_burst_ms = startup_burst_start_ms + (long long)g_startup_burst_offsets_ms[startup_burst_index]; wait_ms = next_burst_ms - now_ms; if (wait_ms < 0) { wait_ms = 0; @@ -6433,17 +6599,6 @@ int main(int argc, char **argv) { } } - if (time(NULL) - last_announce >= ANNOUNCE_INTERVAL) { - struct link_context link; - init_explicit_link_context(&link, cfg.ipv4_addr); - if (send_announcement(sockfd, &mdns_dest, &cfg, &link, cfg.ttl, &snapshot_records, use_snapshot_records) != 0) { - char detail[96]; - snprintf(detail, sizeof(detail), "interval=%d last_announce_age=%ld", - ANNOUNCE_INTERVAL, (long)(time(NULL) - last_announce)); - log_send_failure("periodic_announce", &mdns_dest, use_snapshot_records, detail); - } - last_announce = time(NULL); - } } clear_deferred_response_for_sockfd(sockfd); diff --git a/src/timecapsulesmb/assets/artifact-manifest.json b/src/timecapsulesmb/assets/artifact-manifest.json index 3831636..a8d7ba7 100644 --- a/src/timecapsulesmb/assets/artifact-manifest.json +++ b/src/timecapsulesmb/assets/artifact-manifest.json @@ -2,27 +2,27 @@ "artifacts": { "mdns-advertiser": { "path": "bin/mdns/mdns-advertiser", - "sha256": "6a1aa44140912d3a5623147c15a85902403c3a4e2d6df7132f9689a2c8b669c8" + "sha256": "1a072c376e56e43ec03c8a9158926dfd6c7a6486c4ebf23e30978e293f0629fb" }, "mdns-advertiser-netbsd4le": { "path": "bin/mdns-netbsd4le/mdns-advertiser", - "sha256": "f32268151c66983d4e3493ca9faca0a098b5b2b330e5d51dbfb487c5e7a6cd16" + "sha256": "8dfb9461c57f8a45a531bd4b822e602e49b7d017adb2877cd04915d81a08d3f1" }, "mdns-advertiser-netbsd4be": { "path": "bin/mdns-netbsd4be/mdns-advertiser", - "sha256": "8e9e2b8e3a600fd0dbdf49db6be1ea6ea4e9bba736c7d60abec8dcc8108b65e7" + "sha256": "390a00fdc40b49e4c5698f942aa7e83a66bfd0821bd47e982a40945c1fed51cf" }, "nbns-advertiser": { "path": "bin/nbns/nbns-advertiser", - "sha256": "76cc08bfc9fc64cebae058941fc7457d9adf110eab7fc78265bea321016dc2e9" + "sha256": "717c588d32f74f1d2b4ce9e3201fd2a46bc4fed3aa79810a81b3f1ed456c2f08" }, "nbns-advertiser-netbsd4le": { "path": "bin/nbns-netbsd4le/nbns-advertiser", - "sha256": "97c93dd74ea3808d023880123267d0017346f5b8a786733055b9cf959954dd48" + "sha256": "f261078b379b898468b56988047a92f7181444582c0aa99c91a8fb8970046194" }, "nbns-advertiser-netbsd4be": { "path": "bin/nbns-netbsd4be/nbns-advertiser", - "sha256": "ac1a745bffb98eea8294af2ccf2c9475c19db4dd9851dc29f2c39f0c7af71c27" + "sha256": "366169b448badfea93f150d4fa707e97e0fb7afee4eec8d341785a606406e29a" }, "smbd": { "path": "bin/samba4/smbd", diff --git a/tests/test_deploy_modules.py b/tests/test_deploy_modules.py index 0d2bae0..5ee1ad9 100644 --- a/tests/test_deploy_modules.py +++ b/tests/test_deploy_modules.py @@ -3319,15 +3319,39 @@ def test_mdns_advertiser_routes_qu_qm_and_mixed_query_responses(self) -> None: return off; } +static int skip_response_questions(const unsigned char *packet, size_t packet_len, size_t *cursor) { + struct dns_header hdr; + unsigned short i; + unsigned short qdcount; + + if (packet_len < sizeof(hdr)) { + return -1; + } + memcpy(&hdr, packet, sizeof(hdr)); + qdcount = ntohs(hdr.qdcount); + *cursor = sizeof(hdr); + for (i = 0; i < qdcount; i++) { + char name[MAX_NAME]; + if (decode_name(packet, packet_len, cursor, name, sizeof(name)) != 0 || *cursor + 4 > packet_len) { + return -1; + } + *cursor += 4; + } + return 0; +} + static int count_rr_type(const unsigned char *packet, size_t packet_len, unsigned short want_type) { struct dns_header hdr; - size_t cursor = sizeof(hdr); + size_t cursor; unsigned short total_answers; int matches = 0; unsigned short i; memcpy(&hdr, packet, sizeof(hdr)); total_answers = ntohs(hdr.ancount); + if (skip_response_questions(packet, packet_len, &cursor) != 0) { + return -1; + } for (i = 0; i < total_answers; i++) { char name[MAX_NAME]; unsigned short rrtype; @@ -3361,12 +3385,15 @@ def test_mdns_advertiser_routes_qu_qm_and_mixed_query_responses(self) -> None: static int legacy_unicast_ttls_and_classes_are_capped(const unsigned char *packet, size_t packet_len) { struct dns_header hdr; - size_t cursor = sizeof(hdr); + size_t cursor; unsigned short total_answers; unsigned short i; memcpy(&hdr, packet, sizeof(hdr)); total_answers = ntohs(hdr.ancount); + if (skip_response_questions(packet, packet_len, &cursor) != 0) { + return 0; + } for (i = 0; i < total_answers; i++) { char name[MAX_NAME]; unsigned short rrclass; @@ -3391,6 +3418,21 @@ def test_mdns_advertiser_routes_qu_qm_and_mixed_query_responses(self) -> None: return 1; } +static int legacy_response_repeats_question(const unsigned char *response, size_t response_len, + const unsigned char *query, size_t query_len) { + struct dns_header hdr; + size_t question_len = query_len - sizeof(hdr); + + if (response_len < query_len || query_len < sizeof(hdr)) { + return 0; + } + memcpy(&hdr, response, sizeof(hdr)); + if (ntohs(hdr.qdcount) != 1) { + return 0; + } + return memcmp(response + sizeof(hdr), query + sizeof(hdr), question_len) == 0; +} + static int run_route_cases(void) { struct config cfg; struct iface_context response_ctx; @@ -3420,6 +3462,7 @@ def test_mdns_advertiser_routes_qu_qm_and_mixed_query_responses(self) -> None: captured_dests[0].sin_addr.s_addr != source.sin_addr.s_addr || captured_dests[0].sin_port != source.sin_port || !packet_has_smb_browse_additionals(captured_packets[0], captured_lengths[0]) || + !legacy_response_repeats_question(captured_packets[0], captured_lengths[0], query, query_len) || !legacy_unicast_ttls_and_classes_are_capped(captured_packets[0], captured_lengths[0])) { return 2; } @@ -3456,15 +3499,39 @@ def test_mdns_advertiser_routes_qu_qm_and_mixed_query_responses(self) -> None: } reset_captures(); - query_len = make_query(query, cfg.service_type, DNS_TYPE_PTR, DNS_CLASS_CACHE_FLUSH | 2); + query_len = make_query(query, cfg.service_type, DNS_TYPE_PTR, DNS_CLASS_ANY); if (query_len == 0 || handle_query(1, query, query_len, &mdns_dest, &source, &cfg, &response_link, &snapshot, 0) != 0) { return 7; } - if (captured_count != 0) { + if (captured_count != 1 || + captured_dests[0].sin_addr.s_addr != mdns_dest.sin_addr.s_addr || + !packet_has_smb_browse_additionals(captured_packets[0], captured_lengths[0])) { return 8; } + reset_captures(); + query_len = make_query(query, cfg.service_type, DNS_TYPE_ANY, DNS_CLASS_IN); + if (query_len == 0 || + handle_query(1, query, query_len, &mdns_dest, &source, &cfg, &response_link, &snapshot, 0) != 0) { + return 9; + } + if (captured_count != 1 || + captured_dests[0].sin_addr.s_addr != mdns_dest.sin_addr.s_addr || + !packet_has_smb_browse_additionals(captured_packets[0], captured_lengths[0])) { + return 10; + } + + reset_captures(); + query_len = make_query(query, cfg.service_type, DNS_TYPE_PTR, DNS_CLASS_CACHE_FLUSH | 2); + if (query_len == 0 || + handle_query(1, query, query_len, &mdns_dest, &source, &cfg, &response_link, &snapshot, 0) != 0) { + return 11; + } + if (captured_count != 0) { + return 12; + } + return 0; } @@ -3481,6 +3548,522 @@ def test_mdns_advertiser_routes_qu_qm_and_mixed_query_responses(self) -> None: self.assertEqual(run.returncode, 0, run.stderr) self.assertEqual(run.stdout.strip(), "ok") + def test_mdns_advertiser_enumerates_dns_sd_service_types(self) -> None: + mdns_source = (REPO_ROOT / "build" / "mdns-advertiser.c").as_posix() + source = r''' +#include +#include +#include +#include +#include +#include + +ssize_t fake_sendto(int sockfd, const void *buf, size_t len, int flags, + const struct sockaddr *dest, socklen_t dest_len); + +#define sendto fake_sendto +#define main mdns_advertiser_main +#include "@MDNS_SOURCE@" +#undef main +#undef sendto + +static unsigned char captured[BUF_SIZE]; +static size_t captured_len = 0; +static struct sockaddr_in captured_dest; +static size_t captured_count = 0; + +ssize_t fake_sendto(int sockfd, const void *buf, size_t len, int flags, + const struct sockaddr *dest, socklen_t dest_len) { + (void)sockfd; + (void)flags; + if (dest_len != sizeof(struct sockaddr_in) || len > sizeof(captured)) { + return -1; + } + memcpy(captured, buf, len); + captured_len = len; + memcpy(&captured_dest, dest, sizeof(captured_dest)); + captured_count++; + return (ssize_t)len; +} + +static void reset_capture(void) { + memset(captured, 0, sizeof(captured)); + captured_len = 0; + memset(&captured_dest, 0, sizeof(captured_dest)); + captured_count = 0; +} + +static void configure_base(struct config *cfg) { + memset(cfg, 0, sizeof(*cfg)); + snprintf(cfg->instance_name, sizeof(cfg->instance_name), "%s", "Alton Time Capsule"); + snprintf(cfg->host_label, sizeof(cfg->host_label), "%s", "alton-time-capsule"); + snprintf(cfg->host_fqdn, sizeof(cfg->host_fqdn), "%s", "alton-time-capsule.local."); + snprintf(cfg->service_type, sizeof(cfg->service_type), "%s", "_smb._tcp.local."); + snprintf(cfg->adisk_service_type, sizeof(cfg->adisk_service_type), "%s", "_adisk._tcp.local."); + snprintf(cfg->device_info_service_type, sizeof(cfg->device_info_service_type), "%s", "_device-info._tcp.local."); + snprintf(cfg->airport_service_type, sizeof(cfg->airport_service_type), "%s", "_airport._tcp.local."); + snprintf(cfg->device_model, sizeof(cfg->device_model), "%s", "TimeCapsule8,119"); + snprintf(cfg->airport_wama, sizeof(cfg->airport_wama), "%s", "80:EA:96:E6:58:68"); + cfg->adisk_disks.count = 1; + cfg->port = 445; + cfg->adisk_port = 9; + cfg->airport_port = 5009; + cfg->ttl = 120; + cfg->ipv4_addr = inet_addr("10.0.1.77"); +} + +static void configure_link(struct link_context *link, uint32_t ipv4_addr) { + struct iface_context ctx; + + memset(&ctx, 0, sizeof(ctx)); + snprintf(ctx.name, sizeof(ctx.name), "%s", "bridge0"); + ctx.ipv4_addr = ipv4_addr; + ctx.netmask = inet_addr("255.255.255.0"); + link_context_from_iface_context(link, &ctx); +} + +static void configure_addrs(struct sockaddr_in *mdns_dest, struct sockaddr_in *source) { + memset(mdns_dest, 0, sizeof(*mdns_dest)); + mdns_dest->sin_family = AF_INET; + mdns_dest->sin_port = htons(MDNS_PORT); + mdns_dest->sin_addr.s_addr = inet_addr(MDNS_GROUP); + + memset(source, 0, sizeof(*source)); + source->sin_family = AF_INET; + source->sin_port = htons(62001); + source->sin_addr.s_addr = inet_addr("10.0.1.42"); +} + +static size_t make_query(unsigned char *packet, unsigned short qtype) { + struct dns_header hdr; + size_t off = sizeof(hdr); + + memset(&hdr, 0, sizeof(hdr)); + hdr.id = htons(0x4444); + hdr.qdcount = htons(1); + memcpy(packet, &hdr, sizeof(hdr)); + if (encode_name(packet, &off, BUF_SIZE, DNS_SD_SERVICE_ENUMERATION_NAME) != 0 || + append_u16(packet, &off, BUF_SIZE, qtype) != 0 || + append_u16(packet, &off, BUF_SIZE, DNS_CLASS_IN) != 0) { + return 0; + } + return off; +} + +static void add_snapshot_service(struct service_record_set *snapshot, const char *service_type) { + struct service_record *record = &snapshot->records[snapshot->count++]; + memset(record, 0, sizeof(*record)); + snprintf(record->service_type, sizeof(record->service_type), "%s", service_type); + snprintf(record->instance_name, sizeof(record->instance_name), "%s", "Snapshot"); + snprintf(record->instance_fqdn, sizeof(record->instance_fqdn), "%s%s", "Snapshot.", service_type); + snprintf(record->host_fqdn, sizeof(record->host_fqdn), "%s", "snapshot-host.local."); + record->port = 1; +} + +static int skip_questions(size_t *cursor) { + struct dns_header hdr; + unsigned short i; + + if (captured_len < sizeof(hdr)) { + return -1; + } + memcpy(&hdr, captured, sizeof(hdr)); + *cursor = sizeof(hdr); + for (i = 0; i < ntohs(hdr.qdcount); i++) { + char qname[MAX_NAME]; + if (decode_name(captured, captured_len, cursor, qname, sizeof(qname)) != 0 || + *cursor + 4 > captured_len) { + return -1; + } + *cursor += 4; + } + return 0; +} + +static int count_ptr_target(const char *target) { + struct dns_header hdr; + size_t cursor; + unsigned short i; + int matches = 0; + + memcpy(&hdr, captured, sizeof(hdr)); + if (skip_questions(&cursor) != 0) { + return -1; + } + for (i = 0; i < ntohs(hdr.ancount); i++) { + char owner[MAX_NAME]; + char ptr_target[MAX_NAME]; + unsigned short rrtype; + unsigned short rdlength; + size_t rdata_cursor; + size_t rdata_end; + + if (decode_name(captured, captured_len, &cursor, owner, sizeof(owner)) != 0 || + cursor + 10 > captured_len) { + return -1; + } + memcpy(&rrtype, captured + cursor, 2); + memcpy(&rdlength, captured + cursor + 8, 2); + cursor += 10; + rrtype = ntohs(rrtype); + rdlength = ntohs(rdlength); + if (cursor + rdlength > captured_len) { + return -1; + } + rdata_cursor = cursor; + rdata_end = cursor + rdlength; + if (rrtype == DNS_TYPE_PTR && + decode_name(captured, captured_len, &rdata_cursor, ptr_target, sizeof(ptr_target)) == 0 && + rdata_cursor == rdata_end && + name_equals(ptr_target, target)) { + matches++; + } + cursor += rdlength; + } + return matches; +} + +static int expect_generated_types(void) { + if (captured_count != 1 || + captured_dest.sin_addr.s_addr != inet_addr("10.0.1.42") || + count_ptr_target("_smb._tcp.local.") != 1 || + count_ptr_target("_adisk._tcp.local.") != 1 || + count_ptr_target("_device-info._tcp.local.") != 1 || + count_ptr_target("_airport._tcp.local.") != 1 || + count_ptr_target("_ipp._tcp.local.") != 0) { + return 1; + } + return 0; +} + +static int expect_snapshot_types(void) { + if (captured_count != 1 || + count_ptr_target("_smb._tcp.local.") != 1 || + count_ptr_target("_adisk._tcp.local.") != 1 || + count_ptr_target("_device-info._tcp.local.") != 1 || + count_ptr_target("_airport._tcp.local.") != 1 || + count_ptr_target("_ipp._tcp.local.") != 1 || + count_ptr_target("_afpovertcp._tcp.local.") != 0) { + return 1; + } + return 0; +} + +int main(void) { + struct config cfg; + struct link_context link; + struct service_record_set snapshot; + struct sockaddr_in mdns_dest; + struct sockaddr_in source; + unsigned char query[BUF_SIZE]; + size_t query_len; + + configure_base(&cfg); + configure_link(&link, cfg.ipv4_addr); + configure_addrs(&mdns_dest, &source); + memset(&snapshot, 0, sizeof(snapshot)); + + query_len = make_query(query, DNS_TYPE_PTR); + reset_capture(); + if (query_len == 0 || + handle_query(1, query, query_len, &mdns_dest, &source, &cfg, &link, &snapshot, 0) != 0 || + expect_generated_types() != 0) { + return 1; + } + + add_snapshot_service(&snapshot, "_airport._tcp.local."); + add_snapshot_service(&snapshot, "_ipp._tcp.local."); + add_snapshot_service(&snapshot, "_smb._tcp.local."); + add_snapshot_service(&snapshot, "_afpovertcp._tcp.local."); + + query_len = make_query(query, DNS_TYPE_ANY); + reset_capture(); + if (query_len == 0 || + handle_query(1, query, query_len, &mdns_dest, &source, &cfg, &link, &snapshot, 1) != 0 || + expect_snapshot_types() != 0) { + return 2; + } + + printf("ok\n"); + return 0; +} +'''.replace("@MDNS_SOURCE@", mdns_source) + run = self._compile_and_run_c_helper(source, "mdns_service_type_enumeration") + self.assertEqual(run.returncode, 0, run.stderr) + self.assertEqual(run.stdout.strip(), "ok") + + def test_mdns_advertiser_multicast_delay_and_unicast_hop_limits(self) -> None: + mdns_source = (REPO_ROOT / "build" / "mdns-advertiser.c").as_posix() + source = r''' +#include +#include +#include +#include +#include +#include +#include + +ssize_t fake_sendto(int sockfd, const void *buf, size_t len, int flags, + const struct sockaddr *dest, socklen_t dest_len); +int fake_setsockopt(int sockfd, int level, int optname, const void *optval, socklen_t optlen); +int fake_usleep(useconds_t usec); +int fake_rand(void); +void fake_srand(unsigned int seed); + +#define sendto fake_sendto +#define setsockopt fake_setsockopt +#define usleep fake_usleep +#define rand fake_rand +#define srand fake_srand +#define main mdns_advertiser_main +#include "@MDNS_SOURCE@" +#undef main +#undef srand +#undef rand +#undef usleep +#undef setsockopt +#undef sendto + +struct opt_call { + int level; + int optname; + unsigned int value; +}; + +static unsigned char captured_packets[4][BUF_SIZE]; +static size_t captured_lengths[4]; +static size_t captured_count = 0; +static useconds_t captured_usleeps[8]; +static size_t captured_usleep_count = 0; +static struct opt_call captured_opts[32]; +static size_t captured_opt_count = 0; + +ssize_t fake_sendto(int sockfd, const void *buf, size_t len, int flags, + const struct sockaddr *dest, socklen_t dest_len) { + (void)sockfd; + (void)flags; + (void)dest; + (void)dest_len; + if (captured_count < 4 && len <= sizeof(captured_packets[0])) { + memcpy(captured_packets[captured_count], buf, len); + captured_lengths[captured_count] = len; + captured_count++; + } + return (ssize_t)len; +} + +int fake_setsockopt(int sockfd, int level, int optname, const void *optval, socklen_t optlen) { + (void)sockfd; + if (captured_opt_count < 32) { + captured_opts[captured_opt_count].level = level; + captured_opts[captured_opt_count].optname = optname; + captured_opts[captured_opt_count].value = 0; + if (optval != NULL) { + if (optlen == sizeof(int)) { + int value; + memcpy(&value, optval, sizeof(value)); + captured_opts[captured_opt_count].value = (unsigned int)value; + } else if (optlen == sizeof(unsigned int)) { + unsigned int value; + memcpy(&value, optval, sizeof(value)); + captured_opts[captured_opt_count].value = value; + } + } + captured_opt_count++; + } + return 0; +} + +int fake_usleep(useconds_t usec) { + if (captured_usleep_count < 8) { + captured_usleeps[captured_usleep_count++] = usec; + } + return 0; +} + +int fake_rand(void) { + return 0; +} + +void fake_srand(unsigned int seed) { + (void)seed; +} + +static void reset_packet_capture(void) { + memset(captured_packets, 0, sizeof(captured_packets)); + memset(captured_lengths, 0, sizeof(captured_lengths)); + captured_count = 0; + captured_usleep_count = 0; +} + +static void reset_option_capture(void) { + memset(captured_opts, 0, sizeof(captured_opts)); + captured_opt_count = 0; +} + +static int saw_opt(int level, int optname, unsigned int value) { + size_t i; + + for (i = 0; i < captured_opt_count; i++) { + if (captured_opts[i].level == level && + captured_opts[i].optname == optname && + captured_opts[i].value == value) { + return 1; + } + } + return 0; +} + +static void configure_base(struct config *cfg) { + memset(cfg, 0, sizeof(*cfg)); + snprintf(cfg->instance_name, sizeof(cfg->instance_name), "%s", "Alton Time Capsule"); + snprintf(cfg->host_label, sizeof(cfg->host_label), "%s", "alton-time-capsule"); + snprintf(cfg->host_fqdn, sizeof(cfg->host_fqdn), "%s", "alton-time-capsule.local."); + snprintf(cfg->service_type, sizeof(cfg->service_type), "%s", "_smb._tcp.local."); + cfg->port = 445; + cfg->ttl = 120; + cfg->ipv4_addr = inet_addr("10.0.1.77"); +} + +static void configure_link(struct link_context *link, uint32_t ipv4_addr) { + struct iface_context ctx; + + memset(&ctx, 0, sizeof(ctx)); + snprintf(ctx.name, sizeof(ctx.name), "%s", "bridge0"); + ctx.ipv4_addr = ipv4_addr; + ctx.netmask = inet_addr("255.255.255.0"); + link_context_from_iface_context(link, &ctx); + link->ifindex = 5; +} + +static size_t make_query(unsigned char *packet, const char *qname) { + struct dns_header hdr; + size_t off = sizeof(hdr); + + memset(&hdr, 0, sizeof(hdr)); + hdr.qdcount = htons(1); + memcpy(packet, &hdr, sizeof(hdr)); + if (encode_name(packet, &off, BUF_SIZE, qname) != 0 || + append_u16(packet, &off, BUF_SIZE, DNS_TYPE_PTR) != 0 || + append_u16(packet, &off, BUF_SIZE, DNS_CLASS_IN) != 0) { + return 0; + } + return off; +} + +static int handle_query_from_port(uint16_t port) { + struct config cfg; + struct link_context link; + struct service_record_set snapshot; + struct sockaddr_in mdns_dest; + struct sockaddr_in source; + unsigned char query[BUF_SIZE]; + size_t query_len; + + configure_base(&cfg); + configure_link(&link, cfg.ipv4_addr); + memset(&snapshot, 0, sizeof(snapshot)); + memset(&mdns_dest, 0, sizeof(mdns_dest)); + mdns_dest.sin_family = AF_INET; + mdns_dest.sin_port = htons(MDNS_PORT); + mdns_dest.sin_addr.s_addr = inet_addr(MDNS_GROUP); + memset(&source, 0, sizeof(source)); + source.sin_family = AF_INET; + source.sin_port = htons(port); + source.sin_addr.s_addr = inet_addr("10.0.1.42"); + + query_len = make_query(query, cfg.service_type); + return query_len == 0 ? -1 : handle_query(1, query, query_len, &mdns_dest, &source, &cfg, &link, &snapshot, 0); +} + +int main(void) { + reset_packet_capture(); + if (handle_query_from_port(MDNS_PORT) != 0 || + captured_count != 1 || + captured_usleep_count != 1 || + captured_usleeps[0] != 20000) { + return 1; + } + + reset_packet_capture(); + if (handle_query_from_port(62001) != 0 || + captured_count != 1 || + captured_usleep_count != 0) { + return 2; + } + + reset_option_capture(); + if (configure_multicast_socket_options(77) != 0 || + !saw_opt(IPPROTO_IP, IP_MULTICAST_TTL, 255) || + !saw_opt(IPPROTO_IP, IP_MULTICAST_LOOP, 1)) { + return 3; + } +#ifdef IP_TTL + if (!saw_opt(IPPROTO_IP, IP_TTL, 255)) { + return 4; + } +#endif + +#ifdef IPV6_MULTICAST_IF + reset_option_capture(); + if (set_outbound_multicast_interface6(77, 5, "test", 0, 0) != 0 || + !saw_opt(IPPROTO_IPV6, IPV6_MULTICAST_IF, 5)) { + return 5; + } +#ifdef IPV6_MULTICAST_HOPS + if (!saw_opt(IPPROTO_IPV6, IPV6_MULTICAST_HOPS, 255)) { + return 6; + } +#endif +#ifdef IPV6_MULTICAST_LOOP + if (!saw_opt(IPPROTO_IPV6, IPV6_MULTICAST_LOOP, 1)) { + return 7; + } +#endif +#ifdef IPV6_UNICAST_HOPS + if (!saw_opt(IPPROTO_IPV6, IPV6_UNICAST_HOPS, 255)) { + return 8; + } +#endif +#endif + + printf("ok\n"); + return 0; +} +'''.replace("@MDNS_SOURCE@", mdns_source) + run = self._compile_and_run_c_helper(source, "mdns_multicast_delay_and_hops") + self.assertEqual(run.returncode, 0, run.stderr) + self.assertEqual(run.stdout.strip(), "ok") + + def test_mdns_advertiser_startup_burst_schedule_is_apple_compatible(self) -> None: + mdns_source = (REPO_ROOT / "build" / "mdns-advertiser.c").as_posix() + source = r''' +#include + +#define main mdns_advertiser_main +#include "@MDNS_SOURCE@" +#undef main + +int main(void) { + static const unsigned int expected[STARTUP_BURST_COUNT] = {0, 1000, 3000, 7000}; + size_t i; + + if (STARTUP_BURST_COUNT != 4) { + return 1; + } + for (i = 0; i < STARTUP_BURST_COUNT; i++) { + if (g_startup_burst_offsets_ms[i] != expected[i]) { + return 2; + } + } + printf("ok\n"); + return 0; +} +'''.replace("@MDNS_SOURCE@", mdns_source) + run = self._compile_and_run_c_helper(source, "mdns_startup_schedule") + self.assertEqual(run.returncode, 0, run.stderr) + self.assertEqual(run.stdout.strip(), "ok") + def test_mdns_advertiser_diskless_answers_host_a_but_not_smb(self) -> None: mdns_source = (REPO_ROOT / "build" / "mdns-advertiser.c").as_posix() source = r''' @@ -3564,6 +4147,13 @@ def test_mdns_advertiser_diskless_answers_host_a_but_not_smb(self) -> None: memcpy(&hdr, packet, sizeof(hdr)); total_answers = ntohs(hdr.ancount); + for (i = 0; i < ntohs(hdr.qdcount); i++) { + char qname[MAX_NAME]; + if (decode_name(packet, packet_len, &cursor, qname, sizeof(qname)) != 0 || cursor + 4 > packet_len) { + return -1; + } + cursor += 4; + } for (i = 0; i < total_answers; i++) { char name[MAX_NAME]; unsigned short rrtype; @@ -3745,6 +4335,13 @@ def test_mdns_advertiser_suppresses_fresh_known_answer_a_records(self) -> None: memcpy(&hdr, packet, sizeof(hdr)); total_answers = ntohs(hdr.ancount); + for (i = 0; i < ntohs(hdr.qdcount); i++) { + char qname[MAX_NAME]; + if (decode_name(packet, packet_len, &cursor, qname, sizeof(qname)) != 0 || cursor + 4 > packet_len) { + return -1; + } + cursor += 4; + } for (i = 0; i < total_answers; i++) { char name[MAX_NAME]; unsigned short rrtype; @@ -3919,6 +4516,13 @@ def test_mdns_advertiser_defers_tc_and_matches_structured_known_answers(self) -> memcpy(&hdr, packet, sizeof(hdr)); total_answers = ntohs(hdr.ancount); + for (i = 0; i < ntohs(hdr.qdcount); i++) { + char qname[MAX_NAME]; + if (decode_name(packet, packet_len, &cursor, qname, sizeof(qname)) != 0 || cursor + 4 > packet_len) { + return -1; + } + cursor += 4; + } for (i = 0; i < total_answers; i++) { char name[MAX_NAME]; unsigned short rrtype; @@ -4242,6 +4846,13 @@ def test_mdns_advertiser_query_response_preserves_snapshot_suppression(self) -> memcpy(&hdr, packet, sizeof(hdr)); total_answers = ntohs(hdr.ancount); + for (i = 0; i < ntohs(hdr.qdcount); i++) { + char qname[MAX_NAME]; + if (decode_name(packet, packet_len, &cursor, qname, sizeof(qname)) != 0 || cursor + 4 > packet_len) { + return -1; + } + cursor += 4; + } for (i = 0; i < total_answers; i++) { char name[MAX_NAME]; unsigned short rrtype; @@ -4427,6 +5038,13 @@ def test_mdns_advertiser_splits_snapshot_announcements_and_keeps_managed_device_ memcpy(&hdr, packet, sizeof(hdr)); total_answers = ntohs(hdr.ancount); + for (i = 0; i < ntohs(hdr.qdcount); i++) {{ + char qname[MAX_NAME]; + if (decode_name(packet, packet_len, &cursor, qname, sizeof(qname)) != 0 || cursor + 4 > packet_len) {{ + return -1; + }} + cursor += 4; + }} for (i = 0; i < total_answers; i++) {{ char name[MAX_NAME]; unsigned short rrtype; @@ -4631,6 +5249,13 @@ def test_mdns_advertiser_diskless_replays_unsuppressed_snapshot_records(self) -> memcpy(&hdr, packet, sizeof(hdr)); total_answers = ntohs(hdr.ancount); + for (i = 0; i < ntohs(hdr.qdcount); i++) { + char qname[MAX_NAME]; + if (decode_name(packet, packet_len, &cursor, qname, sizeof(qname)) != 0 || cursor + 4 > packet_len) { + return -1; + } + cursor += 4; + } for (i = 0; i < total_answers; i++) { char name[MAX_NAME]; unsigned short rrtype; @@ -5051,11 +5676,42 @@ def test_nbns_advertiser_builds_rfc_query_and_status_responses(self) -> None: return 0; } +static int expect_nbstat_response(const uint8_t *query, size_t qname_len) { + size_t off = 12; + size_t rdata_off; + size_t stats_off; + size_t i; + + if (captured_len != 12 + qname_len + 10 + 83) return 30; + if (get_u16(captured, 0) != 0x1337) return 31; + if (get_u16(captured, 2) != 0x8400) return 32; + if (get_u16(captured, 4) != 0 || get_u16(captured, 6) != 1) return 33; + if (get_u16(captured, 8) != 0 || get_u16(captured, 10) != 0) return 34; + if (memcmp(captured + off, query + 12, qname_len) != 0) return 35; + off += qname_len; + if (get_u16(captured, off) != NB_TYPE_NBSTAT) return 36; + if (get_u16(captured, off + 2) != DNS_CLASS_IN) return 37; + if (get_u32(captured, off + 4) != 0) return 38; + if (get_u16(captured, off + 8) != 83) return 39; + rdata_off = off + 10; + if (captured[rdata_off] != 2) return 40; + if (memcmp(captured + rdata_off + 1, "TIMECAPSULE ", 15) != 0) return 41; + if (captured[rdata_off + 16] != NBNS_SUFFIX_WORKSTATION) return 42; + if (get_u16(captured, rdata_off + 17) != NBNS_NAME_FLAGS_ACTIVE) return 43; + if (memcmp(captured + rdata_off + 19, "TIMECAPSULE ", 15) != 0) return 44; + if (captured[rdata_off + 34] != NBNS_SUFFIX_SERVER) return 45; + if (get_u16(captured, rdata_off + 35) != NBNS_NAME_FLAGS_ACTIVE) return 46; + stats_off = rdata_off + 1 + (NBNS_NODE_STATUS_NAME_COUNT * 18); + for (i = 0; i < NBNS_NODE_STATUS_STATS_LEN; i++) { + if (captured[stats_off + i] != 0) return 47; + } + return 0; +} + int main(void) { uint8_t query[256]; size_t query_len; size_t qname_len; - size_t off; int rc; query_len = build_query(query, "TimeCapsule", NBNS_SUFFIX_SERVER, NB_TYPE_NB, 0x0110, NULL); @@ -5076,22 +5732,15 @@ def test_nbns_advertiser_builds_rfc_query_and_status_responses(self) -> None: qname_len = query_len - 12 - 4; reset_capture(); if (invoke_query(query, query_len) != 1 || sendto_call_count != 1) return 3; - if (captured_len != 12 + qname_len + 10 + 83) return 30; - if (get_u16(captured, 2) != 0x8400) return 31; - if (get_u16(captured, 4) != 0 || get_u16(captured, 6) != 1) return 32; - off = 12 + qname_len; - if (get_u16(captured, off) != NB_TYPE_NBSTAT) return 33; - if (get_u16(captured, off + 2) != DNS_CLASS_IN) return 34; - if (get_u32(captured, off + 4) != 0) return 35; - if (get_u16(captured, off + 8) != 83) return 36; - off += 10; - if (captured[off] != 2) return 37; - if (memcmp(captured + off + 1, "TIMECAPSULE ", 15) != 0) return 38; - if (captured[off + 16] != NBNS_SUFFIX_WORKSTATION) return 39; - if (get_u16(captured, off + 17) != NBNS_NAME_FLAGS_ACTIVE) return 40; - if (memcmp(captured + off + 19, "TIMECAPSULE ", 15) != 0) return 41; - if (captured[off + 34] != NBNS_SUFFIX_SERVER) return 42; - if (get_u16(captured, off + 35) != NBNS_NAME_FLAGS_ACTIVE) return 43; + rc = expect_nbstat_response(query, qname_len); + if (rc != 0) return 200 + rc; + + query_len = build_query(query, "*", NBNS_SUFFIX_WORKSTATION, NB_TYPE_NBSTAT, 0, "office.local"); + qname_len = query_len - 12 - 4; + reset_capture(); + if (invoke_query(query, query_len) != 1 || sendto_call_count != 1) return 4; + rc = expect_nbstat_response(query, qname_len); + if (rc != 0) return 300 + rc; return 0; } From 67014a2971b6ca4ecaad68015db30bb5d3570e95 Mon Sep 17 00:00:00 2001 From: James Chang Date: Thu, 21 May 2026 03:14:42 -0700 Subject: [PATCH 6/6] Prefer IPv4 mDNS health checks while accepting IPv6-only listeners --- .../boot/samba4/common.d/70-smbd-service.sh | 26 ++++++- src/timecapsulesmb/device/probe.py | 55 ++++++++++++-- tests/test_deploy_modules.py | 67 ++++++++++++++-- tests/test_storage_runtime.py | 76 ++++++++++++++++++- 4 files changed, 207 insertions(+), 17 deletions(-) diff --git a/src/timecapsulesmb/assets/boot/samba4/common.d/70-smbd-service.sh b/src/timecapsulesmb/assets/boot/samba4/common.d/70-smbd-service.sh index 6dff100..dc920f7 100644 --- a/src/timecapsulesmb/assets/boot/samba4/common.d/70-smbd-service.sh +++ b/src/timecapsulesmb/assets/boot/samba4/common.d/70-smbd-service.sh @@ -146,8 +146,32 @@ tc_mdns_bound_ipv6_udp_5353() { tc_process_bound_ipv6_udp_port "$MDNS_PROC_NAME" 5353 } +tc_mdns_health_socket_family() { + families=$(tc_probe_mdns_socket_families) || return $? + + set -- $families + for family in "$@"; do + if [ "$family" = "ipv4" ]; then + printf '%s\n' ipv4 + return 0 + fi + done + for family in "$@"; do + if [ "$family" = "ipv6" ]; then + printf '%s\n' ipv6 + return 0 + fi + done + return 1 +} + tc_mdns_bound_udp_5353() { - tc_mdns_bound_ipv4_udp_5353 + family=$(tc_mdns_health_socket_family) || return $? + case "$family" in + ipv4) tc_mdns_bound_ipv4_udp_5353 ;; + ipv6) tc_mdns_bound_ipv6_udp_5353 ;; + *) return 1 ;; + esac } tc_wait_for_smbd_ipv4_445() { diff --git a/src/timecapsulesmb/device/probe.py b/src/timecapsulesmb/device/probe.py index 5c2a373..f1edbea 100644 --- a/src/timecapsulesmb/device/probe.py +++ b/src/timecapsulesmb/device/probe.py @@ -213,10 +213,42 @@ return 0 }} +mdns_health_socket_family() {{ + families=$1 + + set -- $families + for family in "$@"; do + if [ "$family" = "ipv4" ]; then + printf '%s\n' ipv4 + return 0 + fi + done + for family in "$@"; do + if [ "$family" = "ipv6" ]; then + printf '%s\n' ipv6 + return 0 + fi + done + return 1 +}} + mdns_bound_5353() {{ fstat_out=$1 - case "$fstat_out" in - *mdns-advertiser*" internet dgram udp "*":5353"*) return 0 ;; + family=$2 + + case "$family" in + ipv4) + case "$fstat_out" in + *mdns-advertiser*" internet dgram udp "*":5353"*) return 0 ;; + *) return 1 ;; + esac + ;; + ipv6) + case "$fstat_out" in + *mdns-advertiser*" internet6 dgram udp "*":5353"*) return 0 ;; + *) return 1 ;; + esac + ;; *) return 1 ;; esac }} @@ -302,6 +334,8 @@ mdns_auto_ip_state=waiting mdns_auto_ip_failure= mdns_socket_families= + mdns_health_family=ipv4 + mdns_health_family_supported=1 if [ ! -e "$RUNTIME_MDNS_BIN" ]; then mdns_auto_ip_state=failed mdns_auto_ip_failure="mdns-advertiser binary missing at $RUNTIME_MDNS_BIN" @@ -320,6 +354,13 @@ ;; esac fi + if [ "$mdns_auto_ip_state" = "active" ]; then + if mdns_health_family=$(mdns_health_socket_family "$mdns_socket_families"); then + mdns_health_family_supported=1 + else + mdns_health_family_supported=0 + fi + fi if [ "$mdns_auto_ip_state" = "failed" ]; then echo "FAIL:$mdns_auto_ip_failure" @@ -336,8 +377,8 @@ fi status=1 fi - if mdns_bound_5353 "$fstat_out"; then - echo "PASS:mdns-advertiser bound to IPv4 UDP 5353" + if [ "$mdns_health_family_supported" -eq 1 ] && mdns_bound_5353 "$fstat_out" "$mdns_health_family"; then + echo "PASS:mdns-advertiser bound to required $mdns_health_family UDP 5353 listener" if [ "$mdns_auto_ip_state" = "active" ]; then echo "PASS:mdns-advertiser bind address active" else @@ -349,7 +390,11 @@ echo "FAIL:mdns-advertiser is waiting for a usable address" status=1 else - echo "FAIL:mdns-advertiser is not bound to UDP 5353" + if [ "$mdns_health_family_supported" -eq 1 ]; then + echo "FAIL:mdns-advertiser is not bound to required UDP 5353 listener" + else + echo "FAIL:mdns-advertiser mDNS socket family probe returned no supported family" + fi status=1 fi fi diff --git a/tests/test_deploy_modules.py b/tests/test_deploy_modules.py index 5ee1ad9..c1127f6 100644 --- a/tests/test_deploy_modules.py +++ b/tests/test_deploy_modules.py @@ -6528,7 +6528,7 @@ def test_mdns_status_helper_reports_missing_binary_instead_of_network_defer(self self.assertEqual(result.returncode, 0, result.stderr) self.assertIn(f"FAIL:mdns-advertiser binary missing at {missing_mdns}", result.stdout) self.assertIn("FAIL:mdns-advertiser process is not running", result.stdout) - self.assertIn("FAIL:mdns-advertiser is not bound to UDP 5353", result.stdout) + self.assertIn("FAIL:mdns-advertiser is not bound to required UDP 5353 listener", result.stdout) self.assertIn("PASS:Apple mDNSResponder is stopped", result.stdout) self.assertIn("status=1", result.stdout) self.assertNotIn("mDNS startup deferred; no usable address has appeared yet", result.stdout) @@ -6556,7 +6556,7 @@ def test_mdns_status_helper_requires_auto_ip_when_process_is_bound(self) -> None self.assertEqual(result.returncode, 0, result.stderr) self.assertIn("PASS:mdns-advertiser process is running", result.stdout) - self.assertIn("PASS:mdns-advertiser bound to IPv4 UDP 5353", result.stdout) + self.assertIn("PASS:mdns-advertiser bound to required ipv4 UDP 5353 listener", result.stdout) self.assertIn("FAIL:mdns-advertiser bound to UDP 5353 but bind address is not active", result.stdout) self.assertIn("status=1", result.stdout) self.assertNotIn("PASS:mdns-advertiser bind address active", result.stdout) @@ -6585,14 +6585,14 @@ def test_mdns_status_helper_reports_unexpected_auto_ip_check_failure(self) -> No self.assertEqual(result.returncode, 0, result.stderr) self.assertIn("FAIL:mdns-advertiser mDNS socket family probe failed with exit code 3", result.stdout) self.assertIn("PASS:mdns-advertiser process is running", result.stdout) - self.assertIn("PASS:mdns-advertiser bound to IPv4 UDP 5353", result.stdout) + self.assertIn("PASS:mdns-advertiser bound to required ipv4 UDP 5353 listener", result.stdout) self.assertIn("FAIL:mdns-advertiser bound to UDP 5353 but bind address is not active", result.stdout) self.assertIn("status=1", result.stdout) def test_mdns_status_helper_passes_only_when_bound_and_auto_ip_active(self) -> None: with tempfile.TemporaryDirectory() as tmpdir: mdns_bin = Path(tmpdir) / "mdns-advertiser" - mdns_bin.write_text("#!/bin/sh\nexit 0\n") + mdns_bin.write_text("#!/bin/sh\necho ipv4\n") mdns_bin.chmod(0o755) ps_out = "201 1 S 0:00.00 mdns-advertiser /mnt/Flash/mdns-advertiser" fstat_out = "root mdns-advertiser 201 10 internet dgram udp 0x0 *:5353" @@ -6612,12 +6612,12 @@ def test_mdns_status_helper_passes_only_when_bound_and_auto_ip_active(self) -> N self.assertEqual(result.returncode, 0, result.stderr) self.assertIn("PASS:mdns-advertiser process is running", result.stdout) - self.assertIn("PASS:mdns-advertiser bound to IPv4 UDP 5353", result.stdout) + self.assertIn("PASS:mdns-advertiser bound to required ipv4 UDP 5353 listener", result.stdout) self.assertIn("PASS:mdns-advertiser bind address active", result.stdout) self.assertIn("PASS:Apple mDNSResponder is stopped", result.stdout) self.assertIn("status=0", result.stdout) - def test_mdns_status_helper_requires_ipv4_udp_5353_only(self) -> None: + def test_mdns_status_helper_prefers_ipv4_udp_5353_when_advertiser_is_dual_stack(self) -> None: with tempfile.TemporaryDirectory() as tmpdir: mdns_bin = Path(tmpdir) / "mdns-advertiser" mdns_bin.write_text("#!/bin/sh\necho 'ipv4 ipv6'\n") @@ -6640,9 +6640,62 @@ def test_mdns_status_helper_requires_ipv4_udp_5353_only(self) -> None: self.assertEqual(result.returncode, 0, result.stderr) self.assertIn("PASS:mdns-advertiser process is running", result.stdout) - self.assertIn("PASS:mdns-advertiser bound to IPv4 UDP 5353", result.stdout) + self.assertIn("PASS:mdns-advertiser bound to required ipv4 UDP 5353 listener", result.stdout) self.assertIn("status=0", result.stdout) + def test_mdns_status_helper_accepts_ipv6_udp_5353_when_advertiser_is_ipv6_only(self) -> None: + with tempfile.TemporaryDirectory() as tmpdir: + mdns_bin = Path(tmpdir) / "mdns-advertiser" + mdns_bin.write_text("#!/bin/sh\necho ipv6\n") + mdns_bin.chmod(0o755) + ps_out = "201 1 S 0:00.00 mdns-advertiser /mnt/Flash/mdns-advertiser" + fstat_out = "root mdns-advertiser 201 10 internet6 dgram udp 0x0 [*]:5353" + script = f""" +RUNTIME_MDNS_BIN={shlex.quote(str(mdns_bin))} +{SMBD_STATUS_HELPERS} +ps_out={shlex.quote(ps_out)} +fstat_out={shlex.quote(fstat_out)} +if describe_managed_mdns_status "$ps_out" "$fstat_out"; then + echo status=0 +else + echo status=$? +fi +""" + + result = subprocess.run(["/bin/sh", "-c", script], check=False, text=True, capture_output=True) + + self.assertEqual(result.returncode, 0, result.stderr) + self.assertIn("PASS:mdns-advertiser process is running", result.stdout) + self.assertIn("PASS:mdns-advertiser bound to required ipv6 UDP 5353 listener", result.stdout) + self.assertIn("PASS:mdns-advertiser bind address active", result.stdout) + self.assertIn("status=0", result.stdout) + + def test_mdns_status_helper_rejects_ipv4_udp_5353_when_advertiser_is_ipv6_only(self) -> None: + with tempfile.TemporaryDirectory() as tmpdir: + mdns_bin = Path(tmpdir) / "mdns-advertiser" + mdns_bin.write_text("#!/bin/sh\necho ipv6\n") + mdns_bin.chmod(0o755) + ps_out = "201 1 S 0:00.00 mdns-advertiser /mnt/Flash/mdns-advertiser" + fstat_out = "root mdns-advertiser 201 10 internet dgram udp 0x0 *:5353" + script = f""" +RUNTIME_MDNS_BIN={shlex.quote(str(mdns_bin))} +{SMBD_STATUS_HELPERS} +ps_out={shlex.quote(ps_out)} +fstat_out={shlex.quote(fstat_out)} +if describe_managed_mdns_status "$ps_out" "$fstat_out"; then + echo status=0 +else + echo status=$? +fi +""" + + result = subprocess.run(["/bin/sh", "-c", script], check=False, text=True, capture_output=True) + + self.assertEqual(result.returncode, 0, result.stderr) + self.assertIn("PASS:mdns-advertiser process is running", result.stdout) + self.assertIn("FAIL:mdns-advertiser is not bound to required UDP 5353 listener", result.stdout) + self.assertIn("status=1", result.stdout) + def test_probe_managed_smbd_reports_runtime_invariant_failures(self) -> None: stdout = "\n".join( [ diff --git a/tests/test_storage_runtime.py b/tests/test_storage_runtime.py index 0f8ede6..e381f17 100644 --- a/tests/test_storage_runtime.py +++ b/tests/test_storage_runtime.py @@ -3174,7 +3174,7 @@ def test_common_fstat_socket_scanner_matches_process_family_and_port(self) -> No "102\n", ) - def test_common_mdns_bound_udp_5353_requires_ipv4_only(self) -> None: + def test_common_mdns_bound_udp_5353_uses_ipv4_preferred_family_policy(self) -> None: with tempfile.TemporaryDirectory() as tmp: tmp_path = Path(tmp) flash, _memory, _locks, _volumes = self.write_runtime_harness(tmp_path) @@ -3204,12 +3204,13 @@ def test_common_mdns_bound_udp_5353_requires_ipv4_only(self) -> None: v6_status=1 status=0 tc_mdns_bound_udp_5353 || status=$? - echo "dual_missing_v6=$status" + echo "dual_prefers_ipv4=$status" + v4_status=1 v6_status=0 status=0 tc_mdns_bound_udp_5353 || status=$? - echo "dual_bound=$status" + echo "dual_missing_ipv4=$status" printf 'ipv4\\n' >{families_file} v4_status=0 @@ -3217,6 +3218,26 @@ def test_common_mdns_bound_udp_5353_requires_ipv4_only(self) -> None: status=0 tc_mdns_bound_udp_5353 || status=$? echo "ipv4_only=$status" + + printf 'ipv6\\n' >{families_file} + v4_status=1 + v6_status=0 + status=0 + tc_mdns_bound_udp_5353 || status=$? + echo "ipv6_only=$status" + + v4_status=0 + v6_status=1 + status=0 + tc_mdns_bound_udp_5353 || status=$? + echo "ipv6_only_missing=$status" + + printf 'ethernet\\n' >{families_file} + v4_status=0 + v6_status=0 + status=0 + tc_mdns_bound_udp_5353 || status=$? + echo "unsupported_family=$status" """ ) ) @@ -3225,7 +3246,54 @@ def test_common_mdns_bound_udp_5353_requires_ipv4_only(self) -> None: proc = subprocess.run([str(script)], text=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE, check=False) self.assertEqual(proc.returncode, 0, proc.stderr) - self.assertEqual(proc.stdout, "dual_missing_v6=0\ndual_bound=0\nipv4_only=0\n") + self.assertEqual( + proc.stdout, + "dual_prefers_ipv4=0\n" + "dual_missing_ipv4=1\n" + "ipv4_only=0\n" + "ipv6_only=0\n" + "ipv6_only_missing=1\n" + "unsupported_family=1\n", + ) + + def test_common_watchdog_accepts_ipv6_udp_5353_when_advertiser_is_ipv6_only(self) -> None: + with tempfile.TemporaryDirectory() as tmp: + tmp_path = Path(tmp) + flash, memory, _locks, _volumes = self.write_runtime_harness(tmp_path) + script = tmp_path / "watchdog-mdns-ipv6-only-bound.sh" + script.write_text( + textwrap.dedent( + f"""\ + #!/bin/sh + set -eu + . {flash}/common.sh + . {flash}/tcapsulesmb.conf + tc_init_runtime_env + tc_set_log "$RAM_VAR/test.log" test + mkdir -p "$RAM_VAR" + runtime_process_present_by_ucomm() {{ + [ "$1" = "$MDNS_PROC_NAME" ] + }} + tc_probe_mdns_socket_families() {{ echo ipv6; }} + tc_mdns_bound_ipv4_udp_5353() {{ echo unexpected-ipv4; return 1; }} + tc_mdns_bound_ipv6_udp_5353() {{ echo ipv6-bound; return 0; }} + tc_mdns_auto_ip_available() {{ echo unexpected-auto-ip; return 0; }} + stop_runtime_process_by_ucomm() {{ echo "unexpected-stop $1"; return 1; }} + tc_restart_mdns() {{ echo unexpected-restart; return 1; }} + tc_watchdog_reconcile_mdns + """ + ) + ) + script.chmod(0o755) + + proc = subprocess.run([str(script)], text=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE, check=False) + log_path = memory / "samba4/var/test.log" + log_text = log_path.read_text() if log_path.exists() else "" + + self.assertEqual(proc.returncode, 0, proc.stderr) + self.assertEqual(proc.stdout, "ipv6-bound\n") + self.assertNotIn("watchdog recovery: mdns advertiser is running without required UDP 5353 listeners", log_text) + self.assertNotIn("unexpected", proc.stdout) def test_common_watchdog_restarts_mdns_when_running_without_udp_5353_and_auto_ip_exists(self) -> None: with tempfile.TemporaryDirectory() as tmp:

LhiBidH^ik}N zuL^w^jLw`BSOJP59A22sW*cQrn6P`pX$QKyar z4Uq}`8l#6n=V?;cNgBCV2rqszq(!)-MISBtXwgTDK3eqAqK_7RwCEFnJ^|nz0F4G< z+<;m#n*}r=(*kq?PT&&0Bx!+IAR8zG?7(rL45$FAfc*lF*f;1gHH(Opy8cA>hDPOx zV^-$E--|zr=!|r1dkgW2KXXC`=Q&61+cZ$6DL6-1ajRs1mrjL(&pCSD#lgNztXEXg zH*o%`_`#6(5tL3q{%hZZs0#TDzPumu{l5Gl^1Z&iX#W>qzRXc_il$RdR4kStRiUSz zVo_E}-$kDgzb%s*yXbZ7XqPnDg{bJj3@PjkEpco(L#I*4nvdz%RCDLew{O_?YiU^z zZFkK5j0RI_!{_w0iVz}c`{-)A!LhE7TIj-f7U;w}li5~>8 z0pf>%VZw~qF-A3j4Pn#)dLYa(+)qZul)B6(54Y+ z0$PAJ0Kz3es08r*e-$(Vf+s-eL;^riF|kBFsbqwcPjK0a}myAg!+kiTt5oiZ6U@|n9JWN-4FCq6+zB`Vv`-HMQUJ6~N4s>i%T2FCrV(fdpq>mZ5DBCKXqZt3 zQ~+q4u^)gC8Ert1!}1mVAUJ924xDD){|OHB5Zx5a@-5O44NGGAjZ(LUtzr2?Qno+R zS!q(8lCF?0DQUG-sulDW={V9cvvVj3WLSLdmRoO^4v%3;(!2mRna$oWZ3{rV*-oij zq~;PSJ5Z!`Qk{}sk}ipKPM%a6B+^FdxRMS^VLFuOW=q?Yv|Q>|(k3Z;jG$kV>O@*l zBwa!pSWt(t@$*=ZM=}Jnm<5C|okAkS=7fuYRpTE{671*g_Fz@jxkcC zo4%l#$p{%o_$aCJhh$ebK5bJPORtSp*g5|@yAOLriwQyO48B_u-1NFkl0J-04pM%L z8;?Qb6+)trE7tp8Ll|>KC)x;`kc~b<3dLNv%efSxGy#6WW0=xT6L@7~IiK==))S6+o!` zfet_j{y`HkKxX3 zgxHe6as#4DhzcOYanl4AALFo3VAH7dfSJv4+%tzwQyVMpxb^mJ8`IaP-EGKB&&)Jr znM_kMOgR~*>4wZ{x!F^4vm|FB3wOLckKH{+b=zHAr27`L97n=(*5)tuu4Iq0CoNLN zDi)`KMbZOBQr#+M42&*AzKoDetJEgyid!+YR;hm#i}x3Qg^IsWm2_oF0h2h@A!U0D zT_|)(W!?hRb*fvcLLo?)Jr$-O)+sfWv2j7d?y0c-oN}p0G*=3-*Y8`+;#KsgTq$ui co8XTOeo=C(WLeFO5fRTq4G(*@bwy?W2f7u%EC2ui delta 31744 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 G2>Cx6$Qy0| delta 31673 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�MEj5sz;(-Pd%ChRVKWheQQvc;ryA1 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 VS?>{KCG?&r(7#4_{TJlL{{d(yuT%g4 diff --git a/bin/nbns/nbns-advertiser b/bin/nbns/nbns-advertiser index d07b24041f82070bfe7e7b28782cf35129179df4..2cc36160f0d743ef03b5ab63cd998e66276250b9 100755 GIT binary patch delta 31953 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