Signed-off-by: Huw Davies huw@codeweavers.com --- dlls/nsi/tests/nsi.c | 14 +++++++--- dlls/nsiproxy.sys/ip.c | 39 +++++++++++++++++++++++++++ dlls/nsiproxy.sys/main.o | Bin 0 -> 37448 bytes dlls/nsiproxy.sys/ndis.c | 21 +++++++++++++++ dlls/nsiproxy.sys/nsiproxy_private.h | 1 + 5 files changed, 71 insertions(+), 4 deletions(-) create mode 100644 dlls/nsiproxy.sys/main.o
diff --git a/dlls/nsi/tests/nsi.c b/dlls/nsi/tests/nsi.c index 3408dfae58f..c07653c2ede 100644 --- a/dlls/nsi/tests/nsi.c +++ b/dlls/nsi/tests/nsi.c @@ -415,11 +415,11 @@ static void test_ip_unicast( int family ) { DWORD rw_sizes[] = { FIELD_OFFSET(struct nsi_ip_unicast_rw, unk[0]), FIELD_OFFSET(struct nsi_ip_unicast_rw, unk[1]), sizeof(struct nsi_ip_unicast_rw) }; - struct nsi_ipv4_unicast_key *key_tbl, *key4; + struct nsi_ipv4_unicast_key *key_tbl, *key4, get_key; struct nsi_ipv6_unicast_key *key6; - struct nsi_ip_unicast_rw *rw_tbl, *rw; - struct nsi_ip_unicast_dynamic *dyn_tbl, *dyn; - struct nsi_ip_unicast_static *stat_tbl, *stat; + struct nsi_ip_unicast_rw *rw_tbl, *rw, get_rw; + struct nsi_ip_unicast_dynamic *dyn_tbl, *dyn, get_dyn; + struct nsi_ip_unicast_static *stat_tbl, *stat, get_stat; MIB_UNICASTIPADDRESS_TABLE *table; const NPI_MODULEID *mod = (family == AF_INET) ? &NPI_MS_IPV4_MODULEID : &NPI_MS_IPV6_MODULEID; DWORD err, count, i, rw_size, key_size = (family == AF_INET) ? sizeof(*key4) : sizeof(*key6); @@ -475,6 +475,12 @@ todo_wine winetest_pop_context(); }
+ get_key.luid.Value = ~0u; + get_key.addr.s_addr = 0; + err = NsiGetAllParameters( 1, &NPI_MS_IPV4_MODULEID, NSI_IP_UNICAST_TABLE, &get_key, sizeof(get_key), + &get_rw, rw_size, &get_dyn, sizeof(get_dyn), &get_stat, sizeof(get_stat) ); + ok( err == ERROR_NOT_FOUND, "got %d\n", err ); + FreeMibTable( table ); NsiFreeTable( key_tbl, rw_tbl, dyn_tbl, stat_tbl ); winetest_pop_context(); diff --git a/dlls/nsiproxy.sys/ip.c b/dlls/nsiproxy.sys/ip.c index d5fcc689fc4..ab1b6294bea 100644 --- a/dlls/nsiproxy.sys/ip.c +++ b/dlls/nsiproxy.sys/ip.c @@ -180,6 +180,43 @@ static NTSTATUS ip_unicast_enumerate_all( void *key_data, DWORD key_size, void * return status; }
+static NTSTATUS ip_unicast_get_all_parameters( const void *key, DWORD key_size, void *rw_data, DWORD rw_size, + void *dynamic_data, DWORD dynamic_size, + void *static_data, DWORD static_size ) +{ + int family = (key_size == sizeof(struct nsi_ipv4_unicast_key)) ? AF_INET : AF_INET6; + NTSTATUS status = STATUS_NOT_FOUND; + const struct nsi_ipv6_unicast_key *key6 = key; + const struct nsi_ipv4_unicast_key *key4 = key; + struct ifaddrs *addrs, *entry; + const char *unix_name; + + TRACE( "%p %d %p %d %p %d %p %d\n", key, key_size, rw_data, rw_size, dynamic_data, dynamic_size, + static_data, static_size ); + + if (!convert_luid_to_unix_name( &key6->luid, &unix_name )) return STATUS_NOT_FOUND; + + if (getifaddrs( &addrs )) return STATUS_NO_MORE_ENTRIES; + + for (entry = addrs; entry; entry = entry->ifa_next) + { + if (!entry->ifa_addr || entry->ifa_addr->sa_family != family) continue; + if (strcmp( entry->ifa_name, unix_name )) continue; + + if (family == AF_INET && + memcmp( &key4->addr, &((struct sockaddr_in *)entry->ifa_addr)->sin_addr, sizeof(key4->addr) )) continue; + if (family == AF_INET6 && + memcmp( &key6->addr, &((struct sockaddr_in6 *)entry->ifa_addr)->sin6_addr, sizeof(key6->addr) )) continue; + + unicast_fill_entry( entry, NULL, rw_data, dynamic_data, static_data ); + status = STATUS_SUCCESS; + break; + } + + freeifaddrs( addrs ); + return status; +} + static struct module_table ipv4_tables[] = { { @@ -189,6 +226,7 @@ static struct module_table ipv4_tables[] = sizeof(struct nsi_ip_unicast_dynamic), sizeof(struct nsi_ip_unicast_static) }, ip_unicast_enumerate_all, + ip_unicast_get_all_parameters, }, { ~0u @@ -210,6 +248,7 @@ static struct module_table ipv6_tables[] = sizeof(struct nsi_ip_unicast_dynamic), sizeof(struct nsi_ip_unicast_static) }, ip_unicast_enumerate_all, + ip_unicast_get_all_parameters, }, { ~0u diff --git a/dlls/nsiproxy.sys/main.o b/dlls/nsiproxy.sys/main.o new file mode 100644 index 0000000000000000000000000000000000000000..6e44033ff5a72e170a1e300ace272de5ba9b0b3f GIT binary patch literal 37448 zcmbuo2Yggj{sn$#-g}dQB$G$-#2^6z1PCo8fCv(hkOBiC2`PY$aY!Z*2}ztn6GTA; z%%UikwIjOfu2|RJ+kyqVuCBd{3#;zxVwe9p_uV%$3Aq2?|MP!v%Q^Sn@4LOf$%{Yz z>$emkga+k;GN3A{<=XgR9rnXKb2kdH1pa6;JXJ5{FA#`^Rz?$n0)hJS1@#F`+gTnv zJjFl!2O*}D)Ww-J_yht?!D!I7+qkTxz9fMe-UR$IHNkba1p<wcXt<?qv2y4hj|(B= zO1S;lO@=#35M;EsMG}eWE@KoDJ`w&ePP6kXDQMh^w1gJL76%X+$pr#s^Gj+g;_gk5 zan5id_CQ9rCmt0?Mr(Vc^wM3%mxV&ygv^{fp_>FD4v`UDv?v@}&OGiKkF7@w@dJGS zaP0rPjFz_McKYfrV-qstsBuDkGsTv%=X@dh+tx$k5e~L34n+=?v16$aH3-x5G&^9D zeu#`^!A2RC?(z5!WUxM;@IPe)J33lJfwtf>M&ppQd<z*jL&%B$2N~^)PL&1IJswvs z6Cw|?HNK$hla!XEcyt6CyUTb?$r$#3kP%(gaoDtc0vY2hA!h$i8IA4B@cw8Z*0!Rh zttk+wEK81Z_IkTq&fI8Ms)sLNla)_WT0%<#&0*xI?a;lwEP;%R;q<bSVfzvSO>l{0 zkJt5<HYufhe*6L%4R~?WCOgEthzH9WPdpxD0kWYa@9Rl7`JkD}e&bVw@xsmk^tT@v z*(2WFDnu&+AwIGW!ie{8l*KTIHdFfg-%rEl&+6vS+wkc(XYD@)a`w{q!p^nc1LrP7 zFXYWQ`+2aP<!PM@^mE>cjy~(>g9n9JK5lbP-tMwI{UDyb4?x?n-+RvE(ZVg~Zbv8t z|B`Xta_%;T76N75_ta(t+4~%NXZn~0uISn34aKv?7QZWYpcw)SD+g`((G}~pr7UmU zuClzbgXl4nq5v`mpw#^t_f5{Y@68Rnzt6bu;D&>JR`l<D_|Y4XTdwa9e$l*JoD}`? zdL*GaW5C%m;TwKBDb|zxNndt?*s}UV87`2q{*QpW#7UdqeB$dgL@X!c-m|A>qsQx9 zlb5q;hHLZ7Pwe$>_%H*sCqcVO>xa<VhL7p7xAa(#@YD59h}`hFvEfJe+J5_vVGP># zrO^oQGiVIj@VFa}YjQR`<=%2}UM&(i>E(=bbC8+)yqnBv4EX6Tf&9>r32QQ%cTaN_ z6zrO&6>NB1-{+dPOJ+*pW<783#NQ4cL<+3UYx2x3=Wa%x1Ep;_cdc#n?$+}-jP5OD zMxOfz*f-DU*m7<@63Y_Va#CI)%5(3(f0gC9<=knGLs?!f<-esI%JN3RfA;2+^1Pdi zS^lh;0;b983^Og$#<KD4y-o(pIp^`%kqDxr2&J_1Y-y-2qwPxOisnHqVtybV^L>e! z^A&qBD2SrRw}if17&!6dC%vM1>jPlw@YZ)=Qk{@wceww*W)L#jKIWaZ-$asR+c>^6 zW_6Z(&+A|G>X|>gqFQHzxnaM)W%FF*YVF*by*qzFCO&O$_~Br*U`vGyelp5;ZJCq3 zdCqrR?)eU_XKu|Bc24v5u9rUbd3#scLC$)bFIjlv$xk&mHy1edH{L!s>@SoN2z18M zIv1XDVB^cE^xl}U;i<HJQ#(u3I%n&hb>1x}rft}tySWmjRF4Y5Y~6Sy3!D{VW4djN zSBL>@xliYIYE!&srih+8MTe1b_DH0AilFtJW>`Dtozl75yW!xdjP+H76=|I_bGIBn zYSIT8>!*-dt#7FrwPAnS!H)d-H3vKL=GGqU$blt$?=?v9hNlZRS7aAGd(Pt-WiM^6 z%K5TV3OQxNO7FysbACbDb)Er<dguJ{h;v@&jJ(c3KI4l@V{Xy4&cG<xa$Ik91`1)x zb-k5w`;%w`lb*;}|0qHuvH4qO=m?RGHkSs+EoCW$R%d0NnQ{Abt|vMXKI8V+T+bnr zsD_0#2cvm~wRLl8Kuv@i4^?(>Meh8AD{>C5$lm+uPmK9A#C(c@_(svasmPY)<!`RY z!K?B%r+j%Pqp$L(Fg(`Do5D#Sgokw2>YXd|Iv3=lT{1B_TZ$)lE?{DET^}H+=A@q@ zC-1JvP8Z_weaG4b>WYqF`N?vdaJX{A`^4VGY(h`xBJ4v5i@x_%)TgmB#@^&+(pisE zFE*L{E!F_mh%GgRFtSl)k={J0oVxkYb8DCv6P;rF;>WJVhI~Z9?Yne$MGoJ;Z%dc@ ziRSS-V@0P0Tjr!~p7X<&GXnry?kPkCLxq0^VBX#frBqb-O|YEx^rs*fp8V9ownz(X z@uw`@vOE+nZ;OUkiToiQqjHBthW8ZtZL!wY;bQQR!tpCbeoNc(U~5a$aDlLamiESI ztB`u`kd?VD;8urnhs1K*V^L-8nQ(4vkLE^V9UblAXsD^D2sSlg61=>nF(jIUEv=!Z z+-Q4lV>lFyhH`B_Hxv%HhatJAC@dN~Zv4>`j+r<qxTvuy)O?aC6Ctr&w1`HSCy6Q% zfnC6M9R4M631@S;m6h}6<RWR2miD&XqQV0F%gt|W#awfAQDI?WK~Yh`_@fJs9xj?% zTO(tTijHvm%2frCRgp2vf-P+Yjbcng1i{BN1(&ykB1^_#Dij($ZtUo22<w1AfH2Us zsBuYv^OWXbtTn;PX@299U|U<LRW!E-7e_=4Z&=)h1cMF>PBn$JG0Qkv>mm_;#gfoU z=}j&d=9kVasZGd;EJ1#X)|R%V(lt<5UfNLWuRlKEpHov_TUT9GQtz*>3RITQE3XuF zp~hIaCAzAlt-Wp4vi4Xc&iI=`ZPAwImd0QdnUtWHbs*jCZC%;2P-|$hO$93amE{3{ zRYi5}9Q#eBl_hm`q5>sa))EdiM%%-y{8$-;m)Qa6P=OltyN=V_qf36@F&JrS>@Kb@ z8f<F{hMT(c{<df++!k!@&X)(fGbN3Up-7}VTZNM8&eeukUftPBWPf*#p$`#R))MJx zkF+q4yZf*C9iEwWXpHByHysj-l2%l!Whlq)qDxv2$pcXBc3F4#T;A4H-ON(z?oiSy zvojhxT)xyr(Q=n{4^q?8afldlm3a3dQKCa_XjyyokRWr=KSWyFqjO`SLo1WxSQk1Z z-KAK&gi)}E$?fVzr=o8952-T@(i%Ek`OIlw9x82(MUV;IlQ}om9zCQ^)rLBP;Yg^a zz2(pXsR~6`w1<~gcZ3e91|?DKPb`W>L-oPM-QQCm4mK{u=0$hj-}FBljlb!CHn@50 z(95v3QW<Jn99_~~cpW>K!xg!|J&{>e?TOB#y8wSX8fY{YnT{H_w3Z9}Lw(eQTiV$% z%{)wI)it-Y*M`vlE<Yq7o#wT-#tv<fGtnO$u2t5A+htR4iZn!!lZUJ4RqU%;(HA!z zF4d~&YL=`*PZVrDoELx7jMnx=!PfefzuS-bBX&(MlLKJ){D{|q(qQ9~LlRvTTNbQ3 zO!IfT!NVonej5@WZEtKpq~#sbsZC$i5sXCaUa@pZsBx+6&$|geyeGRj4xcUE)9G(2 zUm0!s-AqCYY7I7q61A**c&CtAy$@~5w)FqmGUfzVwk(Tv>9ztDbsWtSqgX}c@HMO= zQW;znIwUVEB6X-b-D6r2IebZ1MB-(AXpqu&OvMf@t%?ZKd-%8fUbj{eIb2f9%IEn@ z%LBFLmG;nGe|$~3m>xsjY?Xs`M3l3aME99sYT8$X!U@QVg&ARjs1Jr0hoW|B9ahw# zskMf>NDio%*Hq6huMO1Im(-UFDccU(&=%<kHDW>%YD%Wd3cH}9E@*5QG%gvb)Qdpf z@pbj(a{`CFwQdzU_GO2>)u!j8ujZbyjGs-_wT40+;8YB{k}4uyNfjTPoY}I7Q<G?@ zi_9glXjA)&wq!0Iaeq~Pd2K}ric6M~oZB>`b<|_R*wBVqC+46{!kO|2e<Uc%TcFKp zX$-fQs`+PqEW9WVYD)bm5ixI0IgP3q^_tQ-rT!AyN~z7MkzVH1)JaZtp6wU_?U_~l zeKKdHfT|k5@?2FTML10iA)NS%!1RW?z}$xNT1->R>;%ED9NtwsDPuj91RME^U^wJ2 zi^Ms038<lqFiA;b{n(Wcwl#u_d$gt1g~Bc9s$<KL>2W8vE==w*nwJTuGV)Nuj*cC$ z9)}iXp-5x6r9)1O6D(&i-De4ol!m&J8Rdbh>Uw{Lzci_3*`XUE!NuK5t(!wla4~CJ zH`b{#oSt`cDvK@a;7BHt>$RN@ySmvG7o%`U1x+GUn37Vi6YQ#2BHMgbJN8<oM;og# zShYu+lg%L6lM~A>A?vzSY!y;*lp0Nz;CQZXZce7>2gA!`Zxml0*(<A73{;@z`>V<W zWz$P5u^?G6r@RYOUR&D*<D{jk3sGN-cGZRPSNZEj0ChPqr@E}6vfQbqbNuyz84aj0 zwD>Cmm9$sYv-@hO6P49fGX!QZqJg$RO?|CsZEstg8(;9zZGLranJA+!Jvgh)0D8>; zW{kmQVp)4r427Be_O5Xe_DoGQ)Xl7}trzS9y7;z>J|<?wTAGB6t{rJk@`@5mN5+QK zSgDVb`gq}Qu4FKoGCO^h?JH`6SY*mbi<vEpmq^&$5{^Uz=<Y={h?XdphE@f*gcULs z0lAXpiCv(*xtV1QcQO5Vbo22fhuSc63!_#Bf~~D062iG!lN2a}QC37Ww#N|7co60i zJli=H5o+bV80TmKbeud+YZHrN&CO`&O<0>Z3VF^Zov}rbwCB(yH#<aGt$!ZIpX%we z%1cq=U16!6zxEQF1FmX4_9!cA)DRXAY!9aj)`k#?5W1sMnF4!rMTM-A{fgZC!1&Ke zUX$IVMQJRIKv93VLj?S_HDXRvYe`cR7cn9*r>s&iB*_Z7lb||e5h$;ztu8Icx_b`J zjY3U!tDhGXHS?-bK`}E7M}elVimKSi3Mw(084JgjR}zV|H@2WanizpOLAlt04aiP~ zEqJ<}!Sze9=EE#I61De?D*bi!f%2;Q+T%qa$zIWl)v=f^b!ROg{MB;I$1pIxvbuCO z65EZi*9_<ZP)kvm$+M%{&}lJjytIe82o|$d(yMFPR?9`H+#jh4wKbs=tqnzEVGfMb ztE(%^ORAU^jZ5vcNPjB7o$g$easX*nhCh5-tC;Ptom(jyr0<fB#`3o1E#Y>#%od47 zw4Ht2B=WaM7Kxhfsi8~xaulqnnT?&8DpWOP&O{a>eP#Z-nv(j`nW&31%S+12(PJG- zl`M*2v4c(=BVCBQXqZ?n#s&xTDkSCyTcRusN)*-D?rIIL5+#vUZH-G1VQluG)nZQq zxfv0R4-!+0jXDg0GQK4>rGeV&hI(|Qjx&cy*0)4DWh1C8sm1ul3CRq`vn!k%3pUB_ zfnA{N5M>uAHFh|52FG8l8eC~fRVntT7%iuAVa+dMMXJSNCJ+nRwQRO(b(lUhlsnb! zaHQR$64kQ~>)6@ogY1^*q|L6xqNcolW-T%vO-WfwVk=u(TY}+LDnd1~1|-DA#yX8v z)~R?6QZ>1Bb^sMyj{ay!r?!VHVr_C*#f+>i2{9g+<cp-jDV3X`@jW;vrm|8wyL+Y8 z$bQ_QkZ<cwI@^46+cBeyZwSt9D5>PeV08sH32Qm?$8^{UdKgE4^4?!%XgQii-234+ z7gao+O$ymK;{jBB0~~5+`!P7mwpxyk8kw>@RNdB!x+-_!?8;nIQp)~JEerx(5VlP) zXmC>pU7Om`EXN`w#*RzO2w_eKTS=^`B^pQ7ZKbX45!7^a`<N-=l7Xt!2!S;WCW7cK zFxA7BWs@Bbq24*Cq;58XVWEyD)VgX0t|;I&%1?E;1#`7vYuAu<F}b_s#LX$dcxKc! z$l)dsFT~$<DQ#^*r%~U&G=x=wico#^>~c)h!Y#{CIhB*Wt09x@N3WnV#hJRchm)#7 zS$SP)t-q$ex>lfybNo-r6!a|EoD8<cvkALuf|DVCNoAl0V<mQb(e~@gS@RA{$3xnk zY#ho7MWCdrEKpKkU+bUVP+wk$z60~8?xdW4#FxdW!A_AeF5TkL70UF-y+?#S+Hx;K zG*tOZF*=|=)uQ%^KsT(GS!!P8wD|e(t%PunB?WaYX|BZW=2|UR2zaM5IUi3-L>;#J zL#oo0tDQDfJoMD;lICOYD<tG{N6zEBZA+EPN$&6Lv?EvIVVsGH^y*AYlEJ(V3{LZE zri%bIdt*axW2lrPMyShjVp5m9XiD-aDk4sWj@!nv%CSY-5pV`=_C50S!Hx=68gdnj za{oOCR>v-)gv_`mxe<oBjqoqS>Zz*_7C72_+)D);BzqAoVC4=(sEHY*@&^4h_g(D{ z1fvT!dqZlnAj?CQkt`8qw>>Ff$48c&ZMDnJw%b1CW|^!kYIebSmzrmBkmdl4)$J-# zi3t|tBc!G#1oku`vFYVxHoO1Q>Nz!)<uXg-eaGSH8lDQN4K#mq`AW<SBBG>eIj1+W zvsGK!YH}*GVJ41IFpr;!Mp{{J*G9YCQRGSUFI5}s4s+^bR~>E)+k;wlEZPx^+RaJT zFn`-2jN`qO(>XS@aY>%+csM;;ylYE}kBIl4Nykv|7>x&-!x^|r$~;u-=2Z&RHR5!w zF1!d8vb4^RjWA3qFo(6Lq_R2MDRMTlBI2-HX40ph^HlC|pbu3xxiG^Ec>s}MG23$X za@dKgZ5`p1b3Al>0g)5{QLHGhEyrXjA+HR}47Joq_K7*<p?>S^O|?eZ?b~T94R!<< zVWtzs$tGrJNx)g(l$O+#O!s5%;AfYua-a)oODc0_Yh`0)jjnSJd+lw+1hh8|xn?Xw z?Y9GqhPIZ|V%)o_Lu2KUNhFGeo~RA3usu}I7Im?3N4O;-Pl+(zgP9*(8mb7lFT=iI z+**{dj!js{31=e-XK-AvHVJHSl&xwDE^BFoH?_Nvh-6he59=_8_O~_o(UdSXU5-G` zYOKMp_LJ<`*|QdvH_5w;_KJy-6NlM*v;#}mvZ6}#Vr`9>ppK2(#yK|hV5n4xMSCpV zhzvL_hM5Y_`Xa*5(~<5p=c#g9Ut3;R-B2rcdFM9xYs=?g@lhw2XL9cNKb$E-&iCVW zG`>@(l3s^1Ic0SY2QimpxQLJuK;IO90at`wUn!Ydj5e};I6aZQ+t!XgGC6e8tc6qF zxYQ)x9(nBnBk7z~)O7^Ip(5KDi?xh8B;`DuoBvLM*33M<4%>B=fs(Q^i04vT9u7F} zbFkBmixIMUhGQLAh1=ohVdTREOZir)Y#Dc6rF>`aRe5lroTj4Y*)>3oVR8$G0WmzN zj76{nKp)ZEve=ok$rH19%`A%B#=;hClH-ycK+Ip#(zpcqfX+#cL+BpmpksGk*f?&I zoz<cHvPr!lcSBWtX_Wy~jZbWxLTV7(ve-Z>MO&7eoymuT$iJFkbcxfC{@zw8he_Eg zk~S)BE7$%Q!$gg0WbCrp9XeZ|4z5!k(J95PoTk{p%hYbXu$!mT_a-%5wS6jA)=6~y zJ@UZ94sEx6XWvq0iycDkslq+1PDGrgbg0Q`vvSWpQJ?KrQaYy_1EQj#vNFLY)%(Ez za^zAR^LgiOvQ@%=O-Zes(#P9T{Jn>FQDPDc3Jev8k<u+zhsa8Dmzjc%OfD-`qbX^| zAqEbCh0{h<*V<*w;slX9aq;Dwle7pHo^25vT%nVmKgW+{L;La;Y^|Uwvcbq&XU{}r z`0D5q&cjN=i?IjU7A=a~&_yV2T--JuqqB1_Aij0cb>ii0oz!4|DP*?|XK|P``^27$ zn2ntlZ2wS~T~i@|v**y!$Py~Y>}eGi2H3f3jlXX8?DE>Ga#R7eM^iJqig#`jL~X2% zr$>nZwGCBe)$^<3A?$-~$K6Iw&9`f^lXA2fc^>9q<Vi=Ptmb|kHLWC)%lkyGa1~SE zg56v>=+yh?aAycPWZO`nxVnG=42f%L#4JiKG0InBypw&ujb+QhTN;<j5<<@t!>(52 zA~C-NyY0>ng4!=U498AG2D0<d7V0F|+1jO;+UiOb1t<A-XItHjB}Q#%F=A=Y(YcR| zxT98La{xtGGrLTd9d*?|W0wR|ZBDBNd?ZS*jB_$<COGd$P)^5c%gf^B;dpT(QIj|} zh>uc9BfW~Uoh@B9yikEuKP)%Jlt;!z?gh@S!;F)=QL`CEA=AJ^nB^gR^UE1|x$KjJ z0@qjVVOa=vCfaMKM0s%%h&5dRJ5c3Sbv!q+H`VM$t?Y8YT<)@~^_udO5L2Ue{}N)H zQc5rwe(gA5yWQTa$M~!!q3F)Tj5I2ry*8I`lh*iT4^4kjkQ+bUR{RxMd->%QFBoma zcqD`R(f!2VqxLuaCzL0r&fgyQfKwmzqSeZ^p{=zY%Xuf34ONxZ*iLkyvzaSz>fumA zF0oaisfBvPUb5l};iAS?oJR3Np_65@LvRi|0<G<fMGLp(aX<hw0-M}DPu_EEX$xQ) zjngQBJzgpan~)tzS2yDlBbZmWMVoPSgR$AZtS6eC4a>$>9K)y+<S_PNf?-@@TpkRx zqJlA=!7$_m62zhyCaXydKc*N0<r4FqyQU*yITOk)daa|m3CbnrLYEJntDsz>?o=3O z*jDKBIlSwgaC;I8VcvxCwQW5IH;6BV0t-Suw?MZ&)+9XE^n@oWw}|HOi-41ro#rV} zE>W`<#(LXIk(b-n+hP3GwmtykaoeiiCGLjhL8zp(r{MN@CKTRO*bH-(vO7U?fk)b0 z?x_j)T*rM3xJ9=6D2F3%gF-ARZmVr|Tyt@qIRxbvF^lFIQ1F@TTxvU;H0z~vZL+gX z#mk2<AbrJ!ECICT#(mub>Ivy<o+Io3M%|A<Ps@OHyI{O(TOAogaaZ3D<r48I4hO7| zRJ?{A4Y){B@hBdKVxSdW1Fi<VxNE@k0C!1hE{%Ufq44sZ2+_F|pVpv^N8{^>2~bJJ z{l8teAnbl9B<8;`4nRS4UNOYkBIB`t7EW(L=^~oFO{eWMs1%86w&?^^Jso1M&3y$f zRdP{ln+}ph4#fMC$=YpT?WY263uS8J+3N=kN-Cbca{<qkRLy%Z`p7iL<NAMd)db?r z(4Rs{K+8TT4_)SO(`o+^s;9zCf)h{1aSar5js_!xoHHqpL1=fp)**K7GKTTGIW11b zBkk(t8sf_`G@t3|>-%V3S}zwre{zo(n$MqgZ0h7xL~^L`XQ2o(q+w*aG+%0}?c_<1 z`<sYw%Tn?Hr>3SNkk{p6pdJGeXi(}gV0zLqHFYYisR{9J1WPNxE7RkgLC)730W}|9 zgJfms&N~6je8|bcM-08<EJS9;{R3ph;|Tv&JdOtAc*Kz|C-%JyAeL_!mgdhw+H(=~ zNCVQzG4|PvlLPvsB9=#~^gwQ36*@I3G^&^kkjl{gRA>qMtJfmnfGj%(u;!*Cm3#qX zHZTi;i}6w2pbV7Z;3Hha(k38Ad4|mQAx9?V!O%pSHn}nwcvyl-O-)ZtOC_0q1PZ~H zGQ0pKo#~p^(~ciWf7WqnNVO0n4B=Kh<2^D}dKF^Sc#)HyNYChguA(doS&(`>;#Gi9 zo+9`klf)xUh2tTOd=V_t!`M_;18Uwlilf8$?s1X1FT~N5n0Vg=3QE9ZC@ujfa)6zb zC<9e~$99*^bjnmtW;7c-cH~9xacnJobQCMUWgJ5T&rB#u@zZK|6VO;Fcb;|(480hd zu^O7`8t=ikk|GG@n&2KRJlDgvgy<OeV3$a_1Xi!h8-vkf4K$G<Qf`LfarL|vhBqbk zUKo_;&NDQ=EG>N(5dFAPU53U_s)hF+Xm)s0XcU%~`W*E4q1@XItr(tC_X22$v->(j ztCyknfw4oS3GEvI-!IT!qrZ1tDgS_(;`Syyc}2#*!RcCAFEfLQHwQv@nG-40<X2dl z$l&K`x?ZZAtEAgS(v1@V&D=vL^CRen`6G0X*$bJQVh)DxH77yuVa|cx(`<yEYOa8u zX8r+sx_J|HpZOT{4D$`>ruilGUZxuZV5WHl^el4>bjzFx{Rop|d2jP{=tr6tK+iUB zhTg|~68cf*2hjVPKS9qik3hHC&m0ZCzc~Z?0Fz^5uF0`)pvg{kka-*Q!RB+&^URN- z4>4V+!$Zwn=)=t8py!(lpbt0M*N!lEKp$y74t<pQ4)oFHf1wwc=_tQ3W+C)KvkH2V zc^dSw=Ecy*nRh`SZ@vuuXmc<038s!>I>sCXeWK}yKFMr@eyq6(`egG8=*8v((5IMh zL!WB?0R1?#uNQMIWYk!gy8e`59tVrdoDbb?wn5j-v*~1B1>G?3gYGe3hMr>n6S~*b zd!Q&pMn4$3vB+(XgGHFrpu5ak=x#FzT{FYbb#o(hLu6b*pzX>sZ-Ygce}nEaUxV&8 zKZ35AUqjc;U!lXdiH=9t9?UZHU=ikI=q|Ggy4!4ou9+*L>*f~dhPeZ}$GjJMipY4D z4#o#=^B=IRGrxf@%pak<%wM6qO*gt7&CGzVn>o-8b1-y|IRbi$SqR;09t*vPc^vef zW(D+AvkH2ec?$G&^EBu_^K|GL=6dL+$hZuKZcNq8zrZ5QhoHO6m!P}N&!B7O572cp z3mqj=Hw=buG->7}ScF*(-6b-XNw!5Zw@CIzvgX6k-R7In(RjXwp&QFJ(}j@>-#S7^ zxWO=V?Yb<pNU|kl%?9Xhvl+T(o(^3%FMw{CH$(TBk3mlny<Vq-YlQg)Ok@&tm)XO| zfJZ^s%u&$cZ3+zC)7z|p=`xRp?iQII)YuRmhWavLZG%;N)s+%~Y3P|4Z^Q~%Q`V=P zMMKYI*Rc&&@6VZi;P^+f8+1;YvUb2;*fZd=?t$e2Fg=4V^o7<*7{Z=JMen%?FxzT& zU?X6T)#|_|z+5Zlzz|@bb*2NG0rRat0KQ03ivdT8%%|~|hw(Pg5aU@G*`6HFo6-c; zpZ)M>K!Xv$Gr&Dq_xu8M06{!??!n$8Oi!-oH!uZsA4K2dApU%!!9eJ7nArE>!~1pS z=jadq39IL*%t`Q}!Do-*h8Kp}V}Qp8b2aE55G*_cff%&MP`-4SgNC^Wdpx6o*uVG4 zM-)Vg1(>3HgY>-y8os6XT><A~!E4`}S;xWjYTubwIV{XX?Y|~oVbuY$=(GcXy72Mk zbLiJ_dEcRUDa<7@DS0a$e$x42bJiuWPwcrosgPD8E0YRo6=1ft6W(N*tp?0Vl-cQk zxrs7c1DI#s2hR)9C-qzlm~TDlggparyzo+v9Uo2TjGRtJUyTr1&%p2ao=cOWvkZZf zqSFSLRA<@&lj=+dU~c05rvc_ADoGfyQ1t!~?{M{SxkjPabGeTE+J;3yM}BMDS@X01 zOM9AY0{HA-Y<n5(eX{x62(D}wM@~eWW3avtnjFoKlKDK!C3FtQz1{RG+|H}gZOB)N zz8L`SYg~Mn%awDKL{Gt`-}P{H@33-Uy(m9!y^PlD8w$Ygr1gfMQ3Lz*`z!6YHj{o( zS~(#>jGpnLGkYD{KnONobY+c!d9(4T%VHCFjNS2L$PQu61~1{`fNrY>@D;i~0jOKU zdkOI!0vJyMdaagWLVQ8^6kwVa1C*{$1De*Ej_cn5E$e*1`J>@^7htya6(AF3>;}xS zegu4(uFnAGSw|uAQu4Ea`POj259#_G;3#Vbpc`p4o(C+nLV)RndjQ8<=i=M{p@c60 zP86BXA^ua54t-=wISj+?dk@UXwBGL0KZZT472tm3!lc}|2x0Bq$VP26wgI}W)8UQH z%D5O%x6T7RA3eTt382@y43LtIO99iY9S*z<(6sIZ+(yrT1hlMWLxfm167X`s>_o<1 z0hnWLgsaTSD*<yYvkzt@_(>S!D!@GJGPugjxf(Fvx(Sd?#<&J>lyw*2Rj8oGwSa}z z!+?7*BpTNPj_;puY<F36kwXVrZr6bm)|2qEfpOVED6IR3s<+<&e3JD7;Jc&X{3pOu zEE6SF!m_v#FlzMylu^COr47E=WgX~^CfgUzHv|9CWsQV;?*YJn2ENK=O#qfz`WN7x zE=$i<_!i*XTviF(D=B^_@EtD8k95n#-U@s-S`urq{zv3w*2Bos4lD!`b=c+ZQfh8M zxAg?PH88arU{W2{0ln53RO$UJmmYv={dL1|TT{Tvvhsiv)(k*d>?sn~0LmD7359hs zu*}V#z^1hoa3b?R6)@X+1CTwekp`G+{Rnt7VLISIt5>EFcN6*m2U!Chm;pH0Dgu<A zO~5>BBH-in+zW7sRShT$IumfHwGeO*U9$j(S#5xC5?X-y)+WHcghv35vVH{o81oDx z2e7ce*XZrGTv%@%Aa@ivF~Dma>9(@Ltw8=6+2pKa0A<qq0P4c30KSsWed#Q$i-0E} zg+@Q%iPr6o_x^yz)`Nia)8RTEa9aODV}M&mWGT5KN*IuD<hrfL;BOtdq2&6T#z43A zB)A4j9z-tp8afY_K}?vIg&Mt$&UxezlR+T1lNbiVv?c@IOPCL6<-W(@!(q)HkOni+ zAVx5_bs~IY|3?@FfL_#zk#1`txF;!Ll=KqLQ`LSnAzru^#OdtM3PI!vYb)@<;lN|1 z{{Y&U%(-#4fBgi=&)S2$%Q0fQ^@>wRm+Oo`ycb>ps9S%BtL&6l0(z_u0N-WwRsnjg ze*;R<s{zw24<aey>42u?1C;G^4WMQ9ci>vUY@vSyIRn3d1efnySowow+H<Z!nVd0X z19-pnrJ~v_BR^ZqT1iTqsaa>k!ugQq*BIgR95@S57dpfE%Aj2i2YpXU)}I+r|67X1 zNfxJk`m-qr*k9LorC1Nbk>i)Xo1FCoAXA_}Lny3gfjOJhp9jWlhL!#kaK>vcAIH^i zVb`X*eR5`limmOj`5f9`aQWCON?|u%b;${jA9n9ozE41}fECfx8P!Y<_ZQJ$mHq>) z#uc!eMx|#5Ob*Y+97ZRTWAmTsZI<zn^ieA3k+SWT!H4HXuo9JHb?;$WN>qW)$n&P- zHp4ww^Lz*-dzP6<m}ftb>`445R^i)#fWuJj^%qn0O|TDk-I>R1$z!w5W0?xyP2d~g zNBg@uq!Ff9d)$;+{1_axXE_-h;MJZ;njr4#IzikmCy2RU(fjkt`}0ZOU+(Jt73qCw z7_S=4Tz|v#GEaQ$MNelu_PJ8dhG}?x(?M;g^<9_F9+c7N@R-M*Rb-w5>NPsI8ehOL zjU}F6V9NBjFc;I%;AF);6}chvO?HJ#QOAXs`Cv~Pb&+`sL=A^;<752}SO<=U-R0x# zY&LAD0s3yxSrLFd<2g-E5M+rwFYE5b;3eDx=#oRRgf9TPtsRc*i-4N-7r?$KC!+@K zM@QfEl4jilZVb7<!wa?!jF&a*VQ_C?-^qA|oE3&uCgxQ@-C7MO2f^0>z1C(2z7E*a zy2SDP24I@7t^vM)^4|fb{5Lg=>li8UEppcNPLO{9>avx~e)(-cudr@{^DC6_p_1@! zl7#oVN_fAkgb!>9w?aY|i|bP<!E1b!B;jKz;XZh2WDocWB?#*iU=9$*zhw~9_$(>N z=Usz*!64Q?glMOPy?|a>k2g}lH-H?PztnOsBmO4?4{*b@emhDHk^9J5KFmC1HQ5j7 z64p_`GMm1V&cgst;AG@$LUb*YLHv^<|4Ra6-hYzf_^k{x174aL<~u+ns~xx>O4s;V z1~H8Tnzas`e9iYV$VCqPfkCVr9QY%k*SZT(cF;coqIjPIZll1142(GZqFJwi3-hJF zl1r5KZ-9uyPjJ4DK{V7t1`!xSoFFc8iFuft6;)Us<m>AUlA?m>dSYH_$RP2_zQ+!d zi6ALQAV{hT;!O(Dqic|!c8~!Gax8=RWDwm*)2%#kXD}`4<b+iWypVo+DL)yyoWX6T zAJg{J3_t7XCtLb4jZEE&fxCo$vdGCXQnn!rP`5U~Rl*|xJys{+we;K@&}*giQ+a+Q zAo9E)@W+(j7g!9?jXt_n2ySF9xTDBn*ul)xgW0UnU-`+=txv(t9|W$S?dN;=A3;BP z(vN8j(5;k#sxst~vnHTY%i<mgs9Twi>mWdHqGSgHB4T~ud^!aVW8eWUV~B3u<kaz@ z<b*X4ey*jT5z>!t<YQI~&V`A(G2Heu9r!8wDUg1=#z@_&1(!}gqsUodz&?bd0Z~KF z1m^7B7^i}a(XETX$@WwzgK#oFgh7e`?bXs)!m+l5`{8@yk-!tA1l<^~TTg(S%^W+L zoUrx)pF}^Cl%HdC$xWr4iMF4<@P8)#94Gyl#<99J5S(mclgY^nb1s7v1M1c^xL!m! z1<-3P1>8kA6%e_44)7}!Sjxa?FVl4ELU6CrPYF5eZA4DO>43<M?}2p`o#B^3OruP< zeg?;hh*2(screA2C0oHDRtBJq;S4};qTFW!A`VBvxq$+!85q6zEF{X2Fq@n;(t(wL zx^=Vz=Ky-G;~ZE8h<SQqaXuG>mFPWd0kbVXyuZl_XdPgVbqgAVjBGt%uJC<?sO({X zaF1L69QLe_08HZ!w{-xPQCM*rcgmUTt!O4!65a)fN(8^pp+Xve1@u~{0Lnz)4VWf; z6XDa15Zdv*^eM1s4FE{f>U+tW&Sk3B(2Hp;2EPFww0VHK)e3k4;e0@^buA$4owfk5 z2lioILR5p({JnhS&!oMom+vM7c>s3fHn+Z$uiFg}H7<8sZ@|LMI^znNijM$gMZQu- z`&$QI1=z!Kq1sE=s{wmjy&QNAU}|D<el1{{H3Y6Q2et#6)=URp2WVNRIB*AGwzVAa z@64|20do?)@(qBatp2EzvQYj6SZECeTuIM=1{~jilyRfmDgrkRUAu7;IAJ{v_%z|o zgu?m?SjPMo;8U#M0OhXAPQWIs6s05Kt$?k<$NVowjI=X-zK`*uEwCGxxwCGBX&M)~ zt;b=>r}%9YA1@^1VnE$`+i|@F&})4GC}V#qAj+QhJ>ay#K56fP$Y^;!UnK;V!)|PK zXPpRhl<^0*6^2DtoGtQAoMuUQzI@YJaNWRoT);O8?^f8IO+w#Q0G;rl{c2`i3o}jo z$+Yf<h2^dNEN83_0Lt3-3m_)bFCz?l0L|Mg>jRjUruUL@ke;xjMrs)c2|cn(G7c$d zHChU*WO5v^ams<N2Xa?0H?m=P^^*A3vOXQcJo#Wb9_gi=_Hz)ZMG(CV`6zq~VVwd> zOL6PpU>@Qdi~79>gnqW}<0|q1?8YXyekSZ$8Y*^&u{3F)qgCcve3iHiFln!@4KQh> zZU^*Q^$;Qps{=62TIj&j08Og}@I`d)Mi|htK6P9pfZ5h}fLxy$QNSEapytS>ZVWKj z$^?{Ea5-R}mFvJ2fJ3YT2d)GhYE5$BD!^e@xdT@N=3BK6JRNYjb+QB30FJO)9Jm&6 zWTIJ~0XWK94p&*%*8vt<>j32x_)Nfw)`ftwew_t4&AQxy>jBHGYXD{DYyg}o2VA*l zbv9t7^;ft`cn;u6)&qb8Ikh+!5RGai^36gH8EG!P5caG-01FIv(r%*0jkUz8UI%o` z_{$lK0f;#}LP_WW^vKR#?k1)HdaXjZO6UblvnB(|<n#bE<;J9hJpnCiCS0FjX{G{Z z3oomf-FndRzYT{o;K4Z2t$)DiUIvh6%y(ONz#?;D0TPC7K?fcWi20=hPXP3aOfHdk zA}fq4-)Q8<^R%Ag*2lu0#lFRBoQ&-qSft2>QY4ot5(X$z$SntM7HWRC?-4iV=CJE8 z7_y)GjQpYueFFpz%tt$L`F@3$xv&{6Zv6_-8qa2Yx4?D@*#@_M2j9LOz%;7ei78@@ ze0zL~I2X{J7!hk38SAeU!RcQepx1f_Z~$RFAUd~Ru<xQ5zgzDOyR#a%UB019rQ3H5 zT&7?iX}saqi(${I1(;^smlT)#Ax|Wxs}BIWhb@LTS%43^br%n#hIKg1Ltt=Nr4L)> zFb{+2M`okLJOU<%%%u+VD44!vwmZyYV2&bli^Dt)rVp9B9p(uz*<_w{m?yy;N#;d| zc?wK#G9Nn3(_oGuv(I7v2F4<Dz+rZQ$s*%Im6Ivm4JMOJn!`K;hCT1Feh%|2816U> z%XgUPz+{k_>@d%R@sZ)=R7&3C)_nquRqHS>$Ra(#fiJR1twzAHgHTp40h-o&Ksix; z8E}-f9q>51z5-Zi-Qt9O6>z+Dj{{!=oM=7fz}Eqbg_i;C2A6{VLBpyR9<&#-e8<DS zh4!bie2wt*8|+50rZ0g#s~;-wOk=!e6~iJ^a<p9iapCh0qcVZ3KdatxJqFNgEp*^S zz%+ZmoSr8EqGNYlj|I%JRuj^7G9WsGZHP}fIO9KVFW=~lv0m3;2e^bU9bg@Ojn%TY z!pt{DYl#|M08tn`!OQMz3?Ld8piDv`pl;m>SO+Oa5g^9WQ<BBE0z3i_#z-yeb(p!v zPi|{JEOHy>XJn~8-<R+gK$rEc<N7P0TOJ}v*WUoOM9+E<P`6Ui5M|T^Uha|G3hy&6 zBN&(d*@jD#{nUTRrGOIyvJH3AK7dBf%7he|A{|h-asdB}O<e=W3MhqQ2YLWa^!31{ zn1LJV3=DzZB!NB1B?R^aOcIz1m?SU_5CUr<@L~$=#lTp?_%!Pza5736<g8O2XaZsh zvl4hWgB+oPWNOwL$4{0F(&<3U4sr$XPYlvm2FW&hCq?^686=($*$k4%hdzKw(LM?g z(cS@pvzbl(85q0mIhu6`xGz`<`;il}LbuaTp7eu7bka+6$yxU}@f--KTTeQ05TIAq zd6^G`0kPD23C@pG;BW@UONVII+fI<7<g8B|I1Es?{^h`YKx`ZeALkBoH{d(BuZNDS z3s|=r<(lsp*n_k$*5ojCI_%nUZZBs*PV4c_fv3yqsZI0E8Y;xwv`00)8uqMz0;Cxo zn)MSbGTNufC>h8S3Bxi<rUN4~O1^f;9K&2&rTMOboC?~{(1z5))Q!_MD*%h^z}84{ z?A~Mtww6%%&O!K<@S^=C%lAIQ-@xz>Y5FIO)4c$N#{F8N-98|Nu)j#fiJb8uAlhv< z>~<>AE#v__Ln-%aS)anpH}2BpE{*K0{wf8;JFB|^b&K7~iIjJbl;>Lv`w`%bJG86< zn7PI+Nj=L>DI(sp+zOb~v)m>n&P1qNDe-nG(fc6m@fhv`IFaK2tYxi+nQfe@$*lv~ zS)3)s$GejCfcEyU>?}3_x@BjPnhyy#Q#|&2&(<t9k^$s4Q2<u*=YWHB*&UoqF0rk% zk->!QUuqfT4=Tv!q#);Y4bo``VS_)1K`xX*(u^&dwH<GfRpfjb<VFWx0H|BHI&iBk zfql?!O1MNyzydGnrQ4*0_%`yzb`W+MKQYJ^GDw<nsb<~lh`me(;gn9s;g5iNq9I*w zOV|Mk#oTtdT1mJvsli`G&TjCh(9aI#=Nda=QtY+l5*fH1P*1e*>j06Tk3!52O1Mc$ zxE_0^PCRdr5<Wphq`*H(3Go(wqm+OK@d?78m<Jh;X!>5*^SQ)HKBSPREy9;NLiN1A zxw0;Y|3c&Iq^bQkm|`bQ?f(tvwyuRY`R@M!>hdu13rI1(1@v0C!&RPhd<U3jJq-9C zy8ai?vi1YkjRZUZm~Ew_9~(jVJz$R27f{Zie*nz2hCA>_z&vY`1AhX{xBP(eg!pH` zQPzAwc@+H%;Ao3SQF7h(D`0`p_ahDiZ^YYOzTaSd4mRU6m#*REob2Yp%o{?js*8rh zKKRxdN8bc!?=aklE`2iW&Lr7Bw_?17PTd!P<InWC-=#Mxk9>j1TnRmbh#DX2YhfL@ z7Iv5K0$6vE9qP*Z2h4n<zsvd;Eb>fv01_aqUjW^s;3pT*w2nf*CUa^apk?I)$|4yA zm@SuA(seLkj=Y^AVIE+vH3gp2DQXB{p3qZZAJ`M5D>EBbcH>4s??)dEu;&^L@(56# z(au9$JST#ceaw7R2hSo0EpX$|ZyAs*{^L<MJgb3jpr8{_7d%%3$#|TIBzWSbdlFLM zi5Kq4NPvf%!h0BQA>uDGZ-@0f1jbhB-LNv_8Pi0@+m$)<O^~<3U&?x&xA!u?0R9KV z#f&dtSVnsyB^^vje3RicrsM$p$he0YcgA7DXatTh?p#yL`V{5JFYo^u?3hPqGNUY7 z1NvNeA2=U&m#-1lYsfzA(wD%Vbq9cD+~-PMthpcAkA*1s+xVIX0QJNW^&p_v`hcOh z{CWs5O=La*pL-~_M1K@kr&aT!jy!)9neTw^iB3*0*SU?8xes_eJH09TH{C<<PLjyv zS!M%$9G970fRh<or|JD*Wkyr9@Qwqr2Obp1RDiSSYpPxfs}qUD`KNvYXdf>hT|;lT zxwOZ0oMJ+dxYv!`X?Oy(`)=2rvQu)6a9`+^cf#&|%8UNMePLQ5{JQUcYb<6d@F~7= zVP8#?*T3#<hG_fx*S&BSqx}ei_9LEwANRcl<Q9M$^L|Q#$F;PA8aVt5TtOBrKf+Sz zjusm5S#$x2Ua&BzDEb9je;_`iL$L53_g@fe_k(ydnlFR!Zul9rjDck{E!D7GOiLpy z*TORLT!dk`apD$0JmYgU_<?dYypRulw|yUusV_%*UAvh{M?Z$}e!^#tL71br19HT1 zJ<BV6N1p|VKUJXM1nt7_R>-@1&%cM*AM+|)=hF2B-n2XBGr$JIJ^SD~QB2}3RrgRA zuHe0m2)Kt%Dnwp>Ol$ruS~)nnM{t+0p9|sK!%HBhpHAyYUZCjbrF9fN2z@F-_;^+6 zeS|WOcI(w7co@BxM1www_buI%;;);Oc->_AIw|eA#OsPb=bPp0rpnjxHl=%-^kDMM zC6C5qIYmaoyA%a!*GpYYdWPN?#^1Lv@xD_M$y=0oUoeKy_WK&;`{YYPgNvM$Hg$iA zCXU^X0+b(lH5|bxtyPtnr6{j0u5CayVI7uPyq0k|rU=zQX7f76V<bOo(^1x{N}rXe z(r3v!IC}pWv^{v>1%3DCf*(+h2S627Lyij)iulD}8Z9wcj-+K1EQ4sd5|+`hh{-2H z&xOUkr63h#h_1K6(m~4;u$)fIhp?PW%Wtq;NJ|c)cNHxau-pWTnEX8Si4=8VL4SCA zgRZy1^+Q_tmES&EUWerXE&qYVg<LG+U)D*ZWgaX?!Xidqgevtg)F>g_^CgMIUm_DP z#!o{n;5A`a!vN&4>sI?l>CyZwPgea~*%DCo?>IwN{oB*VA&bv~tE}sH*mWIiH*{Mu zywSd<DsYwJ0A6qcM5g6tx)5d&tf`AKd6go<qTG}8jmk4Z+=;NKAm<lDt%h>G`UEW> z77oACbH4g>cyeb#@mn;y#h;mVB{Lz1cdw*MQ!eCO!uE;G75LjN2a$o&gbe9|iYhVP z`1Al~$4nW|t=^QHoB7c(lWY3VZ`tzC!JWs>FAe?S&iwaZYAM{jAmj4qcdvT#lY^ff zH}H{lv(BHow*Rk>ZtBrK;+6wQqj(EyFVqiEUPL4tDj#Yh6eGI;Y6;Xzs7+9RgxUqa zFvKNLeAufHU(E8wV_yWuA{7mRk1R!)7un@2*i7kvh{Ccn1YU|N&gVHOx<5pKhwY5G zP|0U}iT6P9;b20%RJ~8$c?Nz<VRl1we_Ms;Z71S>>V5aZPP_q%k5f+M_;fEP=Kuc} zKMNp(l?ewh@?qJsyfu7Bq03UV-;eqP2D29^mTx)~qAoI_7#4?50;e`Spb&kbuzHn$ zN|5mx3Olkvj)WZ4nRF(PSv&!XV+kAZWGMQd0&^PFbf_6nGofZd(Tz_P>~o=Nq3WRO zq2@!K47Cs{07ZYNz+42?1Qmj6fm#MdH$LsKcR;Zru7Fw%wFZiAYhkW~Itz+<e-6|} zs7@%l{{iM!sBKWJYnMS?2}QT7VP323*TK9V>ISHrpl*ix3)HPpw?pOjA3FDe^vP9! z-ckJUX~Uk_KkK$Zmu{H<p>OHV18cq;JnE-W`<MSV`fqoh^ry+QuNX3{@1u{bIr`_% zdum&Kn>Ky7yKeIG-MO>=lJVrY`}dZ;Hqm_L==WWpY+Mr@aQ>RR0*l5!|HG_4eZ5zd zH|AclCVI}VXI$O-lRMOLdEfUw+x1jKTK=mQO&|Jt2Oi1s+<$)Fym!-X{q51GckLeW zX8Ms&{oHHd%8S-as=EEc)u#?HMvNHcJE3y6uQa94&|B`kb<}t7ynnLs<;U-Se#t#~ z&7GSsdH?w<_GS#I%R6#V&5{cmrtI3NJ@xI&g)jDB^?KutnG-+q)oQC|FFN+upI&?N z#mOTtJht*r&%T*HrTM%y4Q6Z`+k8dcx|6=R`HaCEUmm&q+8!$&eC+ct-~Qs}9edet zxQf2W9o{y+r8e-<t<%$Pe)NhdSH1D}-5-5Ze$j7fqgTK0d*kM{Cp`M6@mcGvTV7ny zcbM<G(NhQfBQk3EY1;OgnU77``C#PxJHt<;-}m-G{jIys|LUzB;==bD&-`k}FOg%f zy{Gr4HTQk@a{9G5E<EnTpQrWPe$(?meiVK2x$|bcmvPan|IDp@%y<5v=z+hzwtY|f z^DWbJZwX#-R_f1pzm~S6q*$-sxaQ5J!4vYYj-~&xI{!~*+VZ<^_J8<PNAbF^Uzu$j zH$0fNddFRVxoYeOA3ro})~MI($_lc+y<*Fk`l{P*saW(;TJM65pYA?!<C^)dQ4hW~ zwPj6V)>U6m+O>YoomXCZ_j8TntYdFT|10~-hs?)HKS|lJM!Tu?%kMru_L=5_m&Tnx z?Xi|K`b65k+WXLr-@m@c44nQ!#RVPvmKL75Db;&p-S~lL&ARErtKYq~cH;YEW<A+4 zagpzX8^+$e=B909Hm$kkdhPYKe-Bn)y*=gXdG{7iIPiJ%hMMm-rvA`2<}Y`S?Yz+a z-_2wG<5{wB#A)jvj`aBCk!WCU_Wo-xTJy#?Cz$<iyQ}eqZN+!pcG@{>ZhWoi=WAEL zJnHKu7p*bTDGY|10L9PbPJ(KOS`T#z)Xh*2LA?m|5!823DPHsyP@|!yLDfMuL#=}P z0~BYecR~FP>Mf{!P`^R-Lg$kQbqv%jsFR^Opf*5V3iW5GhoN4A;vE0KP~M*Clb{Nq zN}%eY7DKIu;umh)q5cZB3yNR0?T0!Dm5D)Y2-HNV*-#6i_-)$RQ2Zc`-=aMN^)l2a zPzRuTphM1q8Ur;QssU;V)ag*?LtO`TH`H#Zx1s(8#m+Pf3LgxMNl=wg0jMz4IZ%Iu zx&`V{s8^sqh58<<rw`)<R3TI;)I6vbs5MX*KymEjCtuG%y#w_Xlnb3Uzir~jPyCjN z-zJ>`6@fYz>T;-^P>(^q3iTNj&l^)QF7<~hf+~ZW4|OWkTBxm1*F)V4^(@r8P+vp2 zdtrQp%7>Z^RRtA<ib8FKx&rD}sK=pRgZdnbxAgfJBL_f@g(`<y0JRkA45$mCZh*QE z>N%+QpuU09vM>fg4Tma*s)kww6@%IYbtTkoP)|U;4#k_VKS8Bq@XCeaEeVdPyzs%X z3=fY|Ny&3n$q3%1CdEt32+W7y_>toJh=U{^9>|j7QMHoA-78Yuuu%ayts}+Rp7O=J z&7?R9P!w0@q~tOkCLZq5km5%y%2y8+kedLC;-)KoaU)i}kzWdu;`RgL!)FZMM2eqw zC|~^Ckra2WRf2f6gcR?mDDm71BE{_?6_DRolHwM;3dk!+q~v`hn0R>cg%q#mC|TUd zC)EcN1x0OBQ5}h>I&Xvz`r;Zm4+;<W5J~Z}mGZ@_N~CzfNl`ZglHxG00`fSSl#v_v z#k<_3c>16M@>(@1-nUj1Pn$^%NCf1WHz|1l4igV|rbu!3MP&|eN0E|OrRc}rG$O@4 zC?%fvV@UDNj0*U$$_akAseB1l3%OmTD4rxTAou?j#V;I4$<G~N;^Fl$QoLiPe63J5 zhd0|5#g7l@i+gs8dJT}&H&BY=P7Eo2{-r41IwHk;1&ZRw0;IV4sVH8oC&iCj6vcxA zQanLW6t5MK;!RRT@zZuvys@Lh#KYTDq}WtdesK*&iYqM@kh^ZAxM`=Tfhu$Ob)KRw zAE?A9Y9SY449K;a^2P5yN%31y^+tX*Op3=uDqg&wM2hP?6_6h+km6pF3doyOq<F<j z`Qp_iQoOOGC|+<O#m~?b#oPO&xCN^yXB{EGC501RRSEHXJ>_d;t{sr)C5qx5KFZ=n zLq+jA6sg8UBzOi*%7v0rzIcj7idQ!k<t(-;P*+tNd9qGl@|Yba9-hLHl1Flq!JS*1 z;+Ce8#mjQ^#ruAW`ZpjcUP)9L9UN#=yj-h%aYUmpZjUI+t0;aTtm4HF;OUFk0+cMC zuan}LyYj_5bEJ5WPEq`Xg%tOgm3Ur5BgHLE<%?gSlj51B63=g1NO3e(zPR;CiXT`i zS-f#ZN?t#MiKkx=o8lcDC5xw;^u?>YDj+|@AhkVFCwRSxl)P&M6AyQqNpbU8MS>r% zkm3g|NG>0KY)*<F$SCnFEK=N?R}{ZLC&hcYisFwDkmAJ)71c`sNd=+upz!df0V&=- zP?6xrN~9(xa+Mb}Nb%CQ63?w;QrsF=6u%lGwKoxvpPrE7S7*u>cX~;2>sL|yww@Gs zc@@R0f28;!gra!JN{XkiisDrOQvAeBQM?mNiq~ir#jl=7@vA{aaci6uH`Eoy4|YiL zBOaAGyctZ2pRg!joNJQeVL1Nt;n6cG9!IM}<3~26<QF&eV_)qc#XBEL7VnLb;;lMG z@k4r2JbP6XPrFI+p0}cS`->F66;KpUFG%qdRYmcGFj74GQWP)Ukm3QkqIe=fiXXEo zig%z%$qUgi@$gC-DSiT?d~su+6nFd;#gT;+KS5Iz#~)Js-b7KntV)U(SXGtdFC>tf zkf^@S=8yaW9!_}pu`+$Vf|{*l@#8j9{CZSTJV+<S19nAmf=TKW<cNAB&-F<0$Wi&? zksT?X;VFv020@BHY@kY;_u5FY`&Pbqqm~qJBr9sH*QR)#PX*+y1N!2PeB~>m#B&oK zFXzMKJ^JF8$jTRQO_Aa?21W521}RrU7S9n$@z7NH;`TZz?zbz7*9l4Ss~Sb|1_dd8 zIG`vlMo68XC`aCGAjR7bDhv5z5~TS15{lwIKT^fHaf-iDLW*~+R8H`k1*uQ)Mir1p z1EhFXpd!JK)k*O<QBnNvk`%wIQ~`Nif)uY%D2iWclHv)S3fQV-$<N&3gol?u>5KP$ zm9N!+q>7=GEM8(IC2zFC#KW)WN%4bvRcJiFBgGH<l`O97Nbw6&<%>UuL8>5;tK0D! zQv6z21?2B%km3(=D2iWrlail%!;C*XBMS+QZt}@R9!FtI7w$N>9o(he{7r-G68JNO zEA9_%UOukXwZgT=>oU^}og2C6YNT4Z_TWLjPn7t)XS=7T>y_sk8}$tu-I-x4&pddL z?~c3AJQuEZ*pooN1$V|H?(Vn4qidBLeG4`mJjgi3-DjMu%|(TA%k;TiKl{=VTNz)( z%GJ`=*cxjJ$-l9E=pW?94_ZoR#~jntv{a0VMZ#m8a4q8|PUy-+@OQlBpCgN4my&-q zu3!msoqzNNf7%-{$In-`ML{A_u;RC0+gcTBS_TW^+QvT#j6bqy)BHivXrw6~BJQvl ze>p7<oWEHHZ+M#>0oc)|oZrd>LU{?@jUR1b25EP@T!zup8}mf9=gw%>?sXOGE~BSM zdrK4>Jv;@*QJyg{n>~dd?=0=>wFO3*N4vo7-DwQ>6l?!p>&-MWJ=!*RficXpz{o5% z(%|1*ZWta0*LoL#n1!9GXN+`@cBy--ku}KZH3d$^+81kg8ht(5)$W}}5AO)0??R)` zb|d?9W8f6LbgPlQ-WceKNwG&2ABu9}b`)L$Z%6DjOpn%HZ1i0fTkg?5Ub}$!Qg<<9 zq5X4hfwcGWXjzDDZ=?yX%W`ED(_|D88_#0HEL?&}&eC35Tg(jjE5fJ6bT@7zu3xtv z-<;=Lu(oaWZt!UTIK#W%usqtIU9*sU_qa@>M*%FzDeo9h0rDzZ0P$LeJI{sO6q?Vy z+-3CW>0N5{^2{=N6l-^$A!G5ntJs+0@gl2=jSSC7qt~%AXYM?MQP=+ND!$N2d(NZX zbjE{-hwx~>3GV_Ux2JcuVN5l~T;kDwvVETADlo>lryhw=1xBt%+p*63pfO>pVNNrq zBMWMqSx94wk?>}`V6=zKNgi!{vC$t{n1j-s=s5w|U0@6-M)-|}Sq6Wzv`5x8BgWb@ zqS;7=$9zwvF%D+YPGd%~Q64o;EHI9b8f^u}z+$5pQc<AYix4Q(m&7cOcIUccW2i@a zS<Ety^hAx3p4l*WYPYW|fL(i4(u_f&N87osSbH5rj(bF=G1fEH82q`>CkF4c5S`Oy zQc8>&NXq31jI``U?TjaeT$V@s3fwTnZpcn!a<MTfYV<;43$%;Y6?n8uTw7TtxgPh3 zEW=p&rg5Zp!h;^Ib6wP<9l(2oQxT7-{rY%TEHLssT5y3Z!PkTrMcQ-9f2SB}-m{U< zTireE4lj!Kgw8m9DNOXh=?gsKhTGW2uqRjz^9U&P$m!3a6=EPyzXv87r|~C4-0-OK zcPF}mD}ldA!kxf8kfa>CXCoZ??(~J|8!%Bx{}mkN{7dU9=M&&(lEOU*oGgd^D29df z)i4>~8kp($kKcET`zr)@Bl-u*M?ZVRK_!p<I(|3qhMp;QyolEUJMxLc2!~-h{Y01; z)zb4|V$qat!JqtjJo`Ia!P8;#KfA;Y{2e_!{Qg$_2bklGgZCp6jK{m+FHDLDt{vQP zbrOCWo>&g}y}TRbkM}8g#oh3bZrIlihw);*Zy`2tZc3701AKQ9E`>kL-_tSg?vnn? z#>(*eHf7?Ewo#sbnli60vhn50T&c{cGLKefkup2R*#29UxloxWD08SX2PyNT0^9$4 z%6wLte^ch4lzE*pJCxa~%zq$VsABpv%Di5gTVbNe^uaKh9!&bA$?=*PlP+np42fY# zGZTRLegx*g_C0tX?5s2R87G1K7o0=*$RiZX&Z~INL7pNH%sLTMepp{lQFhiTI1Ap6 z;d3;UvI;*ej{Tz~{`e%mcaoh4e2)J?N%lLE>@OzSXC~RtOR`T*l8HZGBY)`I{)PB} z^ZVEKpARiqf}gez1mbJ}znYCdR)pWNcmC47{KG5w(~}~A!Cn5vR{V(?`)`rje^)UO zY-$SFzwTYYKX@77UnET?@#khjHt9&fUnjBuDr1*dFTr2%z>n!C#|EOBV)(P54A|1% z7{zad)7tfqs4}kM5dH{4-Ku4a+FM)ji}d*8n+Y+EOBhHb(#YQu57b6m`P1k46FiNW s<<v#-W8h$&+zB|p4jxz@X;VKG9)FMearS^eGCkO2hpdT)=Oh3BAINrxp8x;=
literal 0 HcmV?d00001
diff --git a/dlls/nsiproxy.sys/ndis.c b/dlls/nsiproxy.sys/ndis.c index c40dba7a01a..885915e5b1d 100644 --- a/dlls/nsiproxy.sys/ndis.c +++ b/dlls/nsiproxy.sys/ndis.c @@ -634,6 +634,27 @@ BOOL convert_unix_name_to_luid( const char *unix_name, NET_LUID *luid ) return ret; }
+BOOL convert_luid_to_unix_name( const NET_LUID *luid, const char **unix_name ) +{ + struct if_entry *entry; + BOOL ret = FALSE;; + + EnterCriticalSection( &if_list_cs ); + + update_if_table(); + + LIST_FOR_EACH_ENTRY( entry, &if_list, struct if_entry, entry ) + if (entry->if_luid.Value == luid->Value) + { + *unix_name = entry->if_unix_name; + ret = TRUE; + + } + LeaveCriticalSection( &if_list_cs ); + + return ret; +} + static const struct module_table tables[] = { { diff --git a/dlls/nsiproxy.sys/nsiproxy_private.h b/dlls/nsiproxy.sys/nsiproxy_private.h index 1c62a3df038..0f6e7b05c59 100644 --- a/dlls/nsiproxy.sys/nsiproxy_private.h +++ b/dlls/nsiproxy.sys/nsiproxy_private.h @@ -22,6 +22,7 @@ NTSTATUS nsi_enumerate_all_ex( struct nsi_enumerate_all_ex *params ) DECLSPEC_HI NTSTATUS nsi_get_all_parameters_ex( struct nsi_get_all_parameters_ex *params ) DECLSPEC_HIDDEN; NTSTATUS nsi_get_parameter_ex( struct nsi_get_parameter_ex *params ) DECLSPEC_HIDDEN;
+BOOL convert_luid_to_unix_name( const NET_LUID *luid, const char **unix_name ) DECLSPEC_HIDDEN; BOOL convert_unix_name_to_luid( const char *unix_name, NET_LUID *luid ) DECLSPEC_HIDDEN;
struct module_table