From 3dd061b8959ad6b8b9e668c9ff40648b6c9f8da2 Mon Sep 17 00:00:00 2001 From: Geoffrey McRae Date: Thu, 19 Oct 2017 17:06:42 +1100 Subject: [PATCH] [client] client is now opens shared memory from ivshmem passed fd --- client/ivshmem/ivshmem.c | 166 +++++++++++++++++++++++++++++++++++---- client/ivshmem/ivshmem.h | 14 ++-- client/main | Bin 93272 -> 104872 bytes client/main.c | 29 ++----- 4 files changed, 162 insertions(+), 47 deletions(-) diff --git a/client/ivshmem/ivshmem.c b/client/ivshmem/ivshmem.c index 426cd1fa..e7475756 100644 --- a/client/ivshmem/ivshmem.c +++ b/client/ivshmem/ivshmem.c @@ -9,13 +9,27 @@ #include #include +#include #include #include +#include + +struct IVSHMEMServer +{ + int64_t version; + int64_t clientID; + int sharedFD; +}; + struct IVSHMEM { - bool connected; - int socket; + bool connected; + int socket; + struct IVSHMEMServer server; + + off_t mapSize; + void * map; }; struct IVSHMEM ivshmem = @@ -29,6 +43,7 @@ struct IVSHMEM ivshmem = void ivshmem_cleanup(); bool ivshmem_read(void * buffer, const ssize_t size); +bool ivshmem_read_msg(int64_t * index, int *fd); // ============================================================================ @@ -54,46 +69,62 @@ bool ivshmem_connect(const char * unix_socket) ivshmem.connected = true; - struct IVSHMEMInit init; - if (!ivshmem_read(&init.version, sizeof(init.version))) + if (!ivshmem_read(&ivshmem.server.version, sizeof(ivshmem.server.version))) { DEBUG_ERROR("read protocol version failed"); ivshmem_cleanup(); return false; } - if (init.version != 0) + if (ivshmem.server.version != 0) { - DEBUG_ERROR("unsupported protocol version %ld", init.version); + DEBUG_ERROR("unsupported protocol version %ld", ivshmem.server.version); ivshmem_cleanup(); return false; } - if (!ivshmem_read(&init.clientID, sizeof(init.clientID))) + if (!ivshmem_read(&ivshmem.server.clientID, sizeof(ivshmem.server.clientID))) { DEBUG_ERROR("read client id failed"); ivshmem_cleanup(); return false; } - if (!ivshmem_read(&init.unused, sizeof(init.unused))) + DEBUG_PROTO("Protocol : %ld", ivshmem.server.version ); + DEBUG_PROTO("Client ID: %ld", ivshmem.server.clientID); + + if (!ivshmem_read_msg(NULL, &ivshmem.server.sharedFD)) { - DEBUG_ERROR("read unused failed"); + DEBUG_ERROR("failed to read shared memory file descriptor"); ivshmem_cleanup(); return false; } - if (!ivshmem_read(&init.sharedFD, sizeof(init.sharedFD))) + struct stat stat; + if (fstat(ivshmem.server.sharedFD, &stat) != 0) { - DEBUG_ERROR("read shared memory file descriptor failed"); + DEBUG_ERROR("failed to stat shared FD"); ivshmem_cleanup(); return false; } - DEBUG_PROTO("Protocol : %ld", init.version ); - DEBUG_PROTO("Client ID: %ld", init.clientID); - DEBUG_PROTO("Unused : %ld", init.unused ); - DEBUG_PROTO("Shared FD: %ld", init.sharedFD); + ivshmem.mapSize = stat.st_size; + + DEBUG_INFO("RAM Size : %ld", ivshmem.mapSize); + ivshmem.map = mmap( + NULL, + stat.st_size, + PROT_READ | PROT_WRITE, + MAP_SHARED, + ivshmem.server.sharedFD, + 0); + + if (!ivshmem.map) + { + DEBUG_ERROR("failed to map memory"); + ivshmem_cleanup(); + return false; + } return true; } @@ -102,6 +133,11 @@ bool ivshmem_connect(const char * unix_socket) void ivshmem_cleanup() { + if (ivshmem.map) + munmap(ivshmem.map, ivshmem.mapSize); + ivshmem.map = NULL; + ivshmem.mapSize = 0; + if (ivshmem.socket >= 0) { close(ivshmem.socket); @@ -142,4 +178,104 @@ bool ivshmem_read(void * buffer, const ssize_t size) } return true; +} + +// ============================================================================ + +bool ivshmem_read_msg(int64_t * index, int * fd) +{ + if (!ivshmem.connected) + { + DEBUG_ERROR("not connected"); + return false; + } + + struct msghdr msg; + struct iovec iov[1]; + union { + struct cmsghdr cmsg; + char control[CMSG_SPACE(sizeof(int))]; + } msg_control; + + int64_t tmp; + if (!index) + index = &tmp; + + iov[0].iov_base = index; + iov[0].iov_len = sizeof(*index); + + memset(&msg, 0, sizeof(msg)); + msg.msg_iov = iov; + msg.msg_iovlen = 1; + msg.msg_control = &msg_control; + msg.msg_controllen = sizeof(msg_control); + + int ret = recvmsg(ivshmem.socket, &msg, 0); + if (ret < sizeof(*index)) + { + DEBUG_ERROR("failed ot read message\n"); + return false; + } + + if (ret == 0) + { + DEBUG_ERROR("lost connetion to server\n"); + return false; + } + + if (!fd) + return true; + + struct cmsghdr *cmsg; + for(cmsg = CMSG_FIRSTHDR(&msg); cmsg; cmsg = CMSG_NXTHDR(&msg, cmsg)) + { + if (cmsg->cmsg_len != CMSG_LEN(sizeof(int)) || + cmsg->cmsg_level != SOL_SOCKET || + cmsg->cmsg_type != SCM_RIGHTS) + { + continue; + } + + memcpy(fd, CMSG_DATA(cmsg), sizeof(*fd)); + } + + return true; +} + +// ============================================================================ + +void * ivshmem_get_map() +{ + if (!ivshmem.connected) + { + DEBUG_ERROR("not connected"); + return NULL; + } + + if (!ivshmem.map) + { + DEBUG_ERROR("not mapped"); + return NULL; + } + + return ivshmem.map; +} + +// ============================================================================ + +size_t ivshmem_get_map_size() +{ + if (!ivshmem.connected) + { + DEBUG_ERROR("not connected"); + return 0; + } + + if (!ivshmem.map) + { + DEBUG_ERROR("not mapped"); + return 0; + } + + return ivshmem.mapSize; } \ No newline at end of file diff --git a/client/ivshmem/ivshmem.h b/client/ivshmem/ivshmem.h index 5710e0c8..8d493466 100644 --- a/client/ivshmem/ivshmem.h +++ b/client/ivshmem/ivshmem.h @@ -1,13 +1,9 @@ +#include #include #include -struct IVSHMEMInit -{ - int64_t version; - int64_t clientID; - int64_t unused; - int64_t sharedFD; -}; - bool ivshmem_connect(const char * unix_socket); -void ivshmem_close(); \ No newline at end of file +void ivshmem_close(); + +void * ivshmem_get_map(); +size_t ivshmem_get_map_size(); \ No newline at end of file diff --git a/client/main b/client/main index 8455a1be44157a5e89f62f40ad6ec75d9fbf43d8..d7e8e4998ee0c551b7b5471496a7368aa4da6554 100755 GIT binary patch literal 104872 zcmeFad0bRw`#*lp3(0Kf6o&oSqbGK>&$7dtz&V4ED7a`;t>SO(bp@N2^6_U0HJ)Tu5=ff z#NiQVx<}F$U2cmm7s^w0|3i7GeykhQOuhWfJPTz!LOFSPwE4>46C4 zA-QRg3%f2w|LfVImrmF1wH23@y8oeEH?IsTEm<^t*r3wI14>KEs#gwJIdb@b;ll=2 zl@A;u>P`LRoj7HduoQ};2N-=$Kw=+Y`NWjislAUJdna#g@g>h4ThXW6Uw=`)%+KYlHuaHt2KOpkLEQ91_qtt@(37 z8+u-B!_NoW&_AgSehcjOXr*0twPE+kHt09BK~Hak-q;5HXdCof+wlMVHs}Z2h{Lir z_?z13KTU1;v!M<8@iy#kXv6OOHta5ML(gq(*zMDX{;%5LU(<%&xVHG)&_4oxdXUaM zI<~=oYa4bW+n_INgMPdXKPR+7|FaGHTW#pyg9^1a9{aVS=fO7WJFE@;mNxipuXWCr@uJ(#uiO348kO1}pl|HWfgO!4unRx|^iz@umg7&y?}@+BpOQ!4;vl~jom$jr#f9Wr3Zz*I`6D!>Y66#1qX zl`iy^EHBC{udc#raZ#vXe0612d8NRzimH5-<*Q~Et@Kq_h8UKevk;c4C5J9Zb<6V0 zt3t5voRYG|y&G2b7$u_>c zY_X7z`s+~J)b}O|j zEm|l;B%^5LU}(Z^BlQ~GLX&$-%Fs5xrTLX5<&`Bq879einjX;}Mwg59CPgEc_)5yl z6m+Vps#4Jt(cgg;R<5e>m4^t~v-1n`Cug5qP>eQE77r;Y$e%Ti_@a_>Wn9kGf)y}d zBp|^teMV+M6}wAVa7mGGZ~@4Ir>tm&$g2vL6)jW9Tv5HKw4|`0s7%-u4$$^+r3&p@ z>)+P*A)QW7nrtSCtkORVam}Ix z0htlf$NaK|C1pxM5jyWe6d;U}4icQ1n42?he8G@`gNKE|Ap_HtsrlJcX3WSf7>vKv zGv*zI6PyXx5X|M79A^EGC79yEM}z?*ok^b}bsp-FGN1AUBve%wGGYoMPr z&@&D6(7MCR?py=iRpAj>6wX*;!-vN}Kh-{pl5C)d+KED`2D%VW1nY zqrCEdS z(m=Nx=o=06P~T(mCIh{lfq#pE-oZe>&p_ujedyR~plcx_@@EWm!V;xN4Rn2|2ztOk58Z2G!Epn+2O8)r4fH_n-W$dKB-vT|QIG0dMVI>mH>gZ5&7~y|Qq&cgp}od?_V^M_X|8I*T}$lHdV>43E0^d%&9q|JKf1EhC0Kr`Xe}H%g;#&oNCvi^Y!7T#6nK-BL;6{O8N1Ri4 zutwll5$BX0tPuF+#9hP}2>fE=ZsPd@uO!Z?IhY~v3y5<{4yFox5phn%L65-CBhD!} z=n(jH;+%Seiohok=ad^f{wM1{j<|>TQGuUDoKtM@fWU_k=hPb9CGdX4Ii&`-3cLq# zPNl&u0`EkeQ)qCbz}pk&)ETT1cnon)nZXKyn}~C&3@#A(Z|4B#6dBAH_z%Rn)e2?^ z{1|agmBCbje@dKFWY8n>iE}Cp9{)qMKk-!JM+Lr}IH$hg z0f9eGoKs$Km%tw&K9u-Yf!|4-Q(SP1z;7nbsV%rs;MWl!PP|6oR}tq_7OW8X<-|u4 zUm);{iH{6Mbr?6nEz!wqc)-vc3_<6)Rl?5FFpH7@pSWpr8B;wq1 z29N(P+Mjp^@uLDiHq)aNZv-xm!QbTg51#M!f9kFM{CNJ%+y={UXe)0+T&>8`_haO> zXs<)&Cwn(cWZs7Km!QzwU|}}P+xMi`|An{qWc+ds)6s3<<8%}~zvXDL;Ge&TvrzFs zd$&4a5AuE?pT@XA{x8b!{>$w3ANTGKjPS7wvSr2LusYSO1ck5b*o zTbpi&095+F@Y%fe>F3S%D1kUcAmGJm{(eg`7}X#D?#~_5;B@U+r8+ivJ~*Y{u>aBw zS(zYJwj7u*<|l9CgAd5V>p$TAL+OI(WY+x_ERino4rU=}DS^?2*6lD+jaQUhdIWkaS#YTgLowltU}Nr{8NxfLeGh79 zQ*C~-{n7lS-JhELZ+iW&XJX}q_BtszfPyc=(wW*5SkO%}SqXRen|AFa`d|GxXdjo< zkdSdocd`^ah~hwLE4rUy!5&$?hX_A?lAaqI>JP8~XRrUQ9RF)Of56%pNCWrINDWYD z(G#@QkUM2N*Z(almD%#P*Z*DMexccN9yq+UD^pe96l3MSMd(J*=s4*>f5OAzfVW=j zbDGj{OPplssaAu66BsIiYY~y=yTWZ47X-0BGs*sFrl&q9In)1A=E0zU|L%avzssv0 z_o@dnr{(81L<|Y*&5&`rpUSeJ%;+Xtcq0pLK>^@8!q@yF9C6Iu!|q&@em;nbZ=1@$i=0u(Aa z!{Sbml|Uk*zMZ=-`1A`_Rm_hYkOkgGjGv{=%;(7WJWs)2K}a`2v%QYLGfMFCI|!OV ztsYvtIw?W5*LgwNX@NxGHEb+&VtSZ35W9=!sQs2f(>?U;tH4Bfwr-cb?i#SvMH=_E5=Eki0tRzQf?a7J0S($5322ix3T^3rn zL3<4Ks2_9rx|Zs`jq||`()l2*H0G`oEiJ(;l!a~E>(YRpVSn)7?H@@J_E$*zjIp(uOx86 z1hf+YP=Zf{p&fwgKJay}_a%AiS0^O~hN7RvM4`uf0k{5 zlGBuBTPoNARD^()1akd9peyWPQ#7R8Fdza7mGy0gg^vU$)Xd3j*_T=Sr`f)Ni}*9> zMM}7)dos@nRo1)qYb$$Ly~Q`xgX&dyy-jsV_fZQDfP0Zq7~qQ};Q)9*LImGF1s>8t zsyM2{J3Rmb*ZjnBvT{XcqXTH>GmCL<(6Wzi3miZk04o<@y(fAc0jG~buW@*80ta17z zD3S8V;odVe5&VnX-%9Qn$^Dt+P6T(LDa`l|8Gn|HpTKXl$acy2V;&f93o||h#+|Hc z-~!NsFTg1;M*d3gsH~)9`#S!d>aDL!s-Y^7Qtj)ygS1`v-VxBV=guBHB)4I}M`-Bg z@y|whMmT}RV%#^UJ!^J3Iuc`9A43zND8e(GjGQ2vZ6U_>!0Iy-5!Y_DCo$ihfEk0B zoHB!5LCrOJ&0jl(pJQwkr%mW?H|2&Gc-qu)oX8o zBe#BBYEDCb3$}*7J~@4NHI8C98?*usvov1K!RSTclnvWaD7S2)^7@QauU~4DTY;C4 zb2|9mTQ5EG`oGQfw`8`wLxQwvDWIS~f8d8+oT zI*1GOP#gh{PLqTV;^WqJ2ew>`WDqz7^6UX5O`XIU|H7i_C&Oa?gt>kAl`ltPL`_ z*ckrkeQ>{}2dFAW?`)_Kcsp|MU|)9yxEc@3#<`hx8`7F_DUQZ@dlGuY8gv=qtJvM{ zw;TZx!yPr*0YQZCyTBjpRqH+oQ$7wH6a6fG4|u)nT6~tkx!&LqeGe6=JBIR_^a=FKH%_V; zi|Sxsr0u!g+5YGt7^E7#S3!Z)CS@#%t8h@8&CP*{oGNv^!BYo@*Tfv9Wrj4IS#x9ca z5$Vr4^v4wHC?fd5%gFteAs6E-8oz7ojc>%ia10X|Nz{ z&|(-J9uD$7UjMON|CgMxUPTLe5s?0kRZP9Y#`rIJozCA$zjQQ783v9oA?yndn; zi^{0_b8HQhRR2^P=I2OJBrY(TCfevOA9bN`2Qi22fCVKGBmBngSIH|I%)YG~_K6eq zCM#mo7qGS9S>MJ6>De}@fM?yLXEhT-!S4-5(XCH4SB;dYlM+93Jk+O82}}I+HQMQ5 z<9f*z+Gk6y*H#>4z?_kw; ziaHNHhWU7WMD0oJ*dLDoclN6?E_tuYiytunc0@t|8=iMyxc-ue?No&dpU6U2AKZ+^ zgW~UjxZkWcWpACHoi(i~`$-yT%6>*>&#`ONTi$|*KYOEn+j!HJ+1J-wnt)%K{qLsi z8&C}Hn`L$zxpNzewhB{vkJ!#@nP5uU&rEXPR5+>>l>D{|KeWDPT4$}ays+=@{4!((Fkwfy%?Zb^><$kuAJSU zn{pbmlK#%|GA)^4DHrz=5WC2xjsMY~wK$~k2_ zdbx;aBHLK@ma9;Vc(R!Bta}7_<0y1obd`2JMB`m08}C0MM*}&q$Y6bfbwzLU6%^B# z-oxF6*avc9Dh-RZ*To(;nc3)~X;Dv{T?ODNrc|K9d3w zVSxv9fpMqo974q#V`Z&IOR>+T*lU@g0Z^rjaT6cBmjYd+K+I`&Hireq=>mtbnP)>h zE*jvgz{_8R!qQyW*iY)%?-4P1LmHg}9Rag0ehb896q|=N4w39PO7=sNy>Hm$8!*9G zEP+gOq?F3?AN4jA9h%Dc$ubl$4}hs5 zutDnu5W8;Y2MZNleG3bU1&&qRk98U zv%bY{1(jF_wu)PF9Q4!C5k$q-)@MJN>CZ~C)@N_^XW!**n01%9k0%y9a`wShq<>Fv zHl`R|%U#>K8(^7D*J7_5!Q%Sr7;o*jHkQoAyg>c91LjagFy=}3W=Z!poE-|rFt`^y z3HJKzyZqT(z4h7mdHvZ>!jY|ww6nvk8@mnrX*lv4SVe@oOT7_NZ?@DsJgoP_&-Dle zZ-GP(ersX8&9xK^lHOJyfAW7^Z{GcjK)1-wN^)P3(+DdK+dY*}V-uUM!|}ghb#HUfk`&2v}<0 zHZRFu_kn%gTDWL`ItzEw(6!LditTkxAOR}3*99e1!bSg;bAvE z{0t%WC3S+OhsVIuOPIU;&CR_V*GRdmrCc^50=d7yA_v%Akn=Z-@i-DAq$a%_MT)O? zBVQOmr=F?HNqhUla;1=KesRAg0~CbOmlUVp-Ax||O5hXR;_~llzW20}1eP?35`>_h zwT|;!+JhRr1RcuX9Q1KztNq%wwuN`GmdCCAj`{AdtQj?L9QCi}{fL=KHrZo~5F6BX z=V&Osh_@_i_qw=!g>VasmJbaJuYKca4R&Xzix*4r8j24IiNj1y^Se}%QP)!4PwdQ! zFXje=$&2RJPrhM|^{+KT*74F%{#vff!<9TfKL3JNg zPquIC^3z!!h3%h&3Krwm^~fc@#j;6W!hH*L2HbRSoF*ILyH2cX+DO@WnNTS?zxo7G zNV_;l7 z2qDogaC0D-Nx4N*&L-vlE#=M+%SBMm1x7t0<&ym)_Q!^_*CqR)F#9`4#V|MvPF^<( zPQJiZ`h7Vf*M7Z8R2bt?+}9MIU?24d?u*o0mVmt>e=IgPIR|$C7U|!;``2!}gPqhD zYmbiY`=YoO+WYCRzwGuFzUht5dfQQN$vHy;8?$b^zw4x)q{PY7n7vIAY-cQ_n0gsc zPAtr~^R$ycJ_OGDSlo1tdX}W-X^qz*LqPk>nkLDbX2YiNJJ1aF=gAtJ4$YEwsXo2f z>%KujP5OqB9!xIl?gG-XXYKDTm|N}F@OELt__6Cgu;=XAeKOL!$^X8rYC}S7?Wbe= zzO2_Z_{%}>x|w?&zP+QnOoAfcE%>dK3VlzE?ve+f`ax;cj^52l&0cpa3?cFe$t7Tt^4(FBV1pF>Xaq#h*G28?CZORPZAy%T+T4pbL8sZNQ-dgUCH&d_HDi|R|wxN>z;T)pK>@P+53IKIcG?6^p( zc!Da5LMrMl&jPP~QT1CM2hhB;-tvGTnEaMINO+{)a+4rL_$?brxRn)c-D(BO&$L=8 zt)`vZR5|17Hsw#1D0V*0rp(2cGzdH+z zzSp5Y!At9&#?4gNpryN+rG1HC+~C1i;FXLGAEG0?6S~3CWdjOulOs#~I{gEFCKBvS=>&~O3EkS95EGv zf_2PE#SzfFOOYQdc|0V%+>D{SxR$)3<;}LDtf}m1mD}< zdWX06H~aF>ytOYxd22sCi5u?T2Cu_gKQn2m*E|ye8g+0*CvQEL^C@8X1Pr^qqh79h zS{mCbv-`#Ez_njJHiH=|2JqOy&ZBeYm~u z32@}rTRs9c4-)I%0v=*LKvq6vCRu-#tdE1*IG?5(w6mSe(yov}Ccmg;U^#jPv|dBj z^CfEs$yz5_?+&w01}jvQf*^MggTn^7S;F0l`n0Jm1cK*TWX0CKCVW9>&GlPG(Tbee zw1+j}&<<&3Y}m>dkjrd@2Hc&nC={T&?VJ?7*bb*k(}U=X-*SAg2i+LK_!Y&CtI5-# z&5)X}mYTl+OJF0E%K9$C(kA*}a6d&xND+?|DQQn5>5oH1a?gRBk{YU0U0A_v8hoK~k>pR5{7*^#N5cFw!~DI;e_i7R zlK<-tA_}ib{>#GrNn!pIzlNfB9>(U3nsgVK6kj|3UI&O5{g}cI&E3=ZyHuGYRlbS2 z4$aU%tn%Qyp>Q5(R8dbfa#zXvp0uunS?>XB^8<3BxPK7MIq`g5lYmCxN78M8y6#(ACdS+vAz%}uUsXW|EIX>uk+EK4DBgPt+a<^ z(d+CJZ(e$2EMTn_{v{RFp4Pb;>Ab14W@Hyk&(6)9nKL^ZXjXQ?IhoV*l|sB|s=p*T zd3N4_i4*2{X5xKWW$s*{z`S_lv#4_Zd}WYtS;ZhdMg{r{ii3xY!27tVczIHItLrJ^ z`>8t2PGdN@tN#w^Po!s%_9MNGBwi;3A3{0gY8HCghX#f(I z3?&7Lql&8&uK2|FY$B0!v&L0C8i^f*7ZbSc!Z})rN3tW0LgM`~>=yayswfkXPe48$X(Cb% z(hQ`jNYjw=kR~JLBYBas71%@0<#7_y6r@DpQ<3K*O+%WDl#7&yG!e;*l!G)KX$I14 zr1?j2!f`GVHzM3&6d?V7bzG(!szP3YbScs*q)U+IAsLS!fP9a%5@`j}a-@Hb|9u3y zfVCgeNTj((6{QQ(aN@}4A+<7Zm6iLjScn&$ixzX7@Mwjvq-;6fM_%k%R9#$LROwk* zxukj-<{3{_bwx#Ki7wj8`c#71WLZUNk*~-j-q#i;TG4-Moe^xIbV;Omz-)tAreafzGCpd@rN(#duDJE&n+ptP)_7+%Z1`wUg@bWV^GU0eON}Z z8Ss@CmX~_4CRX94d8we4I8+wt5_~7z!}s8^&|#%pwy?BRx7upEo{IbF{!TBdC=Ca& z6?<~=^uR1zAG-qIQV(8nhx@&-@asn_a;NOUvGPKEeZhnG`6m|%TdnX{RxR|%7xg{* zi~6UQ;nw=;DgCk^=|XUkfoVJbr{vCzLsfODuWh-|u7Ydk-vZD|eM0d< zhHKOczwn06o$7UH$G`6bmz6B3#HTpQ%RD7j9uDeoAA;|5|GrO~k)Jaj8<80k3ua`` zEXW)`nN@7Xz8;swCD>M0E-oosf@UbMUb57)XqB(1%2QlfzD#W2Dp*vpkRMLKzHh?c z_J#N`2EI&zj)D(a3@9$I9H7^|%7ZRL?fPy|-|xzRx8gUdR#LnwG(BL8%bjs6ewUP0 zRQo*qzDbDJv#^xGT;*Ae@2Ked{~kvnR~2rV>M}IZV(!d!$2`7O6-A*w-iqC#l@<6% z1o_#(r`cZwhnApaPHAXG{!~B22PHhq_+1s87fXl#D}N}0r`JGKw6*?X?0^5gmaWED zehlOPW8{T^SzQXhrQnycATJF=+VdR_|#lE_L6(M%&kaRI|74VxM23#;nTyN+CeFU8n z*ZJ{fAn99(BWy{^qnyG2TWQEIlw-~22Zll(N;y4%uy>jtz+35G`nuWb_M){o8`fi5 z)yL=GuUqx@z%Ua1AT(XH$&XK~=o=g{Ir8F9USLw9mHrZ1@1b1?NPBt*{V)9b^mQ70 zYx;%PXRhku1we1hR_y$@O#v>pWx!gI6ZQ(RMq{sr?b{jt<^OG-&JS%kFtzGh5vRZN zjh8BOvQFb`v%L^^;YrofgeAMOYlJ*{i471cG26N?T0Vtcyv7z zvP8?YvQA9T%=7T$QM|))sviH%zyIC+1a@d};uZ%ihpxx*p&<;Z3i}_c|iM$3m?`Ut`*V5v^ z1#-vzEiK8&E0Od2X>m<>6dCzK=ksn3A3HeFne4nl7+wc$hTgZ8lzTusgmXXNc zMxKv+74G2GApaMBo!E+;Kkghwz7Dw+7xdraKE+7n{qSQnzZkFtc@6T1kZ(c$CGuU! zYcR(KkUx({NL;uH@GJ6ER5_uK!Ey$ljz6<#XJRB83{wbcp za^VI-Dju%PN4^<(1#%CbuHA@yBl1JYdGOu@5B1{din`LFcD6-XH>yz%(s|F}&CTIZMdLdd^z2V##{De;a8@vces*cH|qWo)O>{e~v>pbpAsAyq)H?gGhz&THyT zdsK3F{eA0$-6x=o~4k#AM)Z}g7B|2-i1n-Cd4~3bwdf@ zy`Fx6Zx#i!;vJ^^cq?Q45a`1&X87$z+TXyqG?>T5d#+|&)>|^;Q)?r$;w#KsO!29p zKsPvKfT#-x>%nj0-hnZ7jD$Azm=3q5fd26%smU0FP!m3Q?kF1TF7{AM8ZXXdp5+pbZmNOhpfr`!0*B)b9eDe_TT5m#g*P62s zv28Jo9HXYkmwvqp{sC{C-oM%IpM#zOI`8GlcFm0m2~sWsbH~V#9O7M!wxIn)&?kew zRhKi^&pXrpF!1Dp{}u2*OMcYd0_+1CNDF<3wCQ$DD zc*jEB{$|iugMK&Zr`Lb-nfB@LtKk10{GBjYN&fM1k@?q{H$*g8u8ypYGFvQ|4X8}s ztNa7}A7IXVfP~ZaUvj4YB+8&&XJKyip3XlpeoMycP;=0anc%AiUkTzK_9O3e>6Lmtt_S@n=whA#{W61}tml&` zAC5JswQ}lx8|7D{{2Zy*VZtm(xvxQg1@v(`{Tzc{QGcve-=O?*mK)o_V_Frem8d`X zCVt$~!f()aVEzKu#3|@+XO0U9nauZ?{x&k`?`Fsy!Zl1OVA`oQ zog4O;<GPHr-or)w9Os8ifr9iQ%CAIu5z9}_N7>=|$jkZ2%lRlTKBKbL$%yex z!Wz64df43m9REb%p9uUDfqx?KPXzvnz&{cACj$RO;GYQm6M=ss@J|FEw&d$umwJMlG^qX{n5dN)x5gNkzjd>m+oZqPDVUt<-|AX+kG9ID-^Wm0g`2VGK z*749i+)g?k`W`*6w|RuhfBvhbocJc)K5i|DBSZWOBLBA<3H-lVJan>hA@0HOkatDp z^L51e{G9R7tAQKK9zoXCC@x&n^Wb$k4_umyqoba0bVwjX-(r_|$nWDiAD_kJA?^tx z$AjRaJ^%&lUpk(z%j1z{Q6BOGA3qWJLwtY_2Oe$~c-U`A{{QV9`agDOI`FPjQohvl z6M7!02hgeKz4d&!o=?#8*?L~A=gakcy`JBo=lAIOHa*|3=kMzImwJ9e&m;AQaO!z) zJs+;;6ZCwxo)_!+ay?(K=Qrs2J$k-P&-d&3yL$emo}bY3NPR#!^}M&957+YvdOlmv zi}ifDp0C&Q8}$4hJ>RD1`}O=?J^xbAPw081KH!{s-doRy>-hvdpRMP`dcIuG*X#KW zdVY_dZ`1Srdj77Shx$e6|44-J|Mz)lCNgUJe>N&G=EO4!Mon$O6UUD~%afc{w5ViZ znP>RGp#xI~3?A86LY^V1gGZ#M4IUnTLN_#zdGu+`qL1P;wexPLN%<5H-OBl+S3k+I zr2Uzk5|{iP7lrt*9wX_$>a*6FQb(X!PKZ|Z9X#G^i%0V$VJ>XVF_UWTjcMIviuxH( z9GfDdo`%=v(a>qKMm-MLq(&wS2FtLaFKXE~sCsx1V!#f`^Rszwfi0yAODZ+Lvyd}ty-Gk=J)czQtR9{wg}aln4W-gyL%)6za&*TZze zYWV>6guY|oh_1n@n-Wul8UK*w`z4q_V>fys`2*#Z*c4L zEjkUw9{tYaS z4lo({0L?pYB>12JUj}pJLlW!>d!6W$RY9YTL29R%2P1P#gFsYgQlhNWac*xp7ah%- ziXN(%XMkYo)&n^H0TDnusMetzG3GKBeFqcP5$xioh=_~OflStjyU-sUX2?X}M}r+A zc#fW@z7BzejBbjuMw^S+D%yMyRBe4Eq_nR=H!DsjS|ECn$`2;lC&5#<7-;23jxaai%ylXe9{An?E^iXu3c!HLp z7zMExjwe1FzFI~Tzjp?4f|i4@ZW~xgoM6WYRyuCj^B`#dh5|*qAdc=|iL*(&6=$>d zaUzDYc0*r?Ygtedsjb9(7NyPSaMsR)i_uyfdTfmL3l^=|kkafAsk9VU6fFy}SG9Q< zmZnf~UN=-o<7e3vEgqbzR_US5j}Q~H)(LQgwuZw+8wp2oEk>wJ+E(;Vv-VR@ zigoHvu}9%Wr1mEiMQMrbJ|Ptkb%C_j4K@|m^}TRb9qnANrxNhAb2;q*A{^~qE4hh? z@U(YrzyMRNN(Yw<;ZUvZ5?p0aV6wH>T;Fm2wRg~50f?LIGc;Gvt^gcEG}oQ*-Q*aj zxe$5)m71#(^)NXu*Id2Oy-kjxnrkB*H94|0*9q3aQKh*SA%G@F9rU0+CWofEUSeZ9 zW@)aMp@-ihbxnX{W>-c>R|6s+;c_}%y%;T5Z>Q^PD2#B;cDkzJPlT)3>B?dI<1?i$ z3n`unPS+q0f#puuV`%&c&w8gT1FrI$r>;vGJ{Fx#g)I6Rt_txY^e-WP0Xh*sm+Be> zTRHguZ>|gA#<{c39pXwyFlU`R`&?H6W+vpbTvv3!kKklBp{b_K9x_<56eF7P=OrV8 z@dRZjj$gE&ZE_T0P_@a7llBGO)FyH;YpdaoLz{#Ec(i`WSOB!H@S?^&9YIo5_rvJX zipgz<_ezBOLv~k(dj^y%R`)xoo8oa_-v?QSJB9)^uE)`AU{YLXqk0fkTwO36Ags6^ zg>m*3%slKS(mi|1ooEH^2{LIft90yroGsd1F{1cwtSF6NuCi)zCXT2?oMW{9ILB&d z;cU}#aE{aF;2f`Uj7tq8LszXm&fPSAd&i^kLpa?vepa)GHU;ON+Uo~@FqIMA`D6h5|Eu5o`K(C*qIWU+eYq!GNTx~RlVV?FrI>i+2Zk(rTN6_~9Vt7u| zhNE87wZrH@Gqn3r-Qd7<_xq!wv4uvn-az?8RG+XMfLv|rKNinUY>#3h;? zww7uhoJ+L9IA5TR!}&sO2F|4#e{NrWDZ=Xz}n&R1)5 zaBk3iIB(E4;(U$P2Q9TxI}7J)wLF}!(-z?TFRcpa>$UYb|66;|t|&KX_W{09dlu(S z+RyOzCaohpxmnwW*11L7j&|IveTSIes?A6AZqp{9m)@=&2Im%SChB{KmW39)Q?r2c zKiU?Q-laW>$Zyp~LeFE`Wb~HDwMS5+C$u0+pVW?^&p)N@#d({y7%la*))UcqMk|K4 zMlBjV+qLD;`K)#mTJt&WL7bo0p2vBI_6E*7wNG%~rTvKWZtXm@$P1bm{d|u$6dvx? zenhnQX`|uue(e!VmQ7kuP+rthQQw!eo$%*ntuJi7qRqqDc~yG|5qnMh1wOp4ZNbQT zLwgBc9nfZ>Paf3r5QjIlxgI>~sC^6Bx3%Y?`5o;;w9dO4KZ5$6b~9S`koGOKy{{d^ z)OA?94H5W2)6lXXYV*))A8EX(JgP;aUY}_HR`Echb`fIonf4`o{#-kXvHXR0FMRk? zn*$ABxgY6;DN}XZV8*1n=O8m<>V>%o)%`d)EUJ4Mx>%&@UX3_MsqPzlV?tEjd`L1{ zb-x5vF{=9p^u<`!eLsxbRQDRpW^tRd-L=(^Pj7D(F<*xsdCqx);KpOLbq0*t%8sL=37E5{kZEbH*UxjOy4d^+Jeo<(b7`}1tXgBBtw8tJmz}gMwysvbsTD44RH{=n( z5uNa|gwk&4AE=@=_A(5YcEj33)TUS{+%ByVOqLfxY2Vitk6ID5yn!Hh@X~~(3~Cel zb|LsQnl_=I0Q-YgOCcy19Op>h;?k}d0PF5?P>fYB4y}y%??Cks|LzDG;{PN3K>W9& zy%GO%Fe3ghqgq%Gukk>@(G%RBHfc%n@G0{h9V=~8uHhhL(n-r()}g6){IE^C76+CM!FwBHY?JdML(n5^C7NAx&MScQcF$nuaG%o$We)cgbP$uny#tXlgUDF5bMK;DJNJjgJnkV>?Q!=& zU%+-D8BxN`hnNY-tqgr6atpjc?w*?53HTm{hM+_5|C!!CmlyA3|PAbrq=L3EGwfnSGp?lt(Z&)~y; z>BDcVdlP%UL$T19^TnC46*CMCH_Z8Zck}{T_X7sI2Mu=Lly*xXPZ;e3a1s$!v1=ew^`|BdJhDb9~d!umfp=s#-E|A|5Wr$WDCp|JC_6v)P$1eoLu z1jBlc8T2$8^n5M#{6Nuf2-{*stiC1e=(JLCekY>eX_ewUPRJE|oOSx1aANFU^gZVf zggv;cK_x%>X#WJdZKCt!Ds*=lr{Abg?^C}Mj*xxi55m@1VgFCUw%FUzt(||d9URh^ z7Q*dpKCC=WMJ3YSCOVQTkPe;UrAZZTc7~f~0lE|?op45|Kf$3yzI2}Gj8>1qBb(^u zv8r&%Cc3#zAQ3jvZ{q}FwF#%<1!AKOyHM<)4Tm&my9*vW+X)sJq!DL(bscOZYG~91 zXGe7v2EH`t7Ho<%*hwG}(ne>s9cDbM?Q#rLXQHT-P1dlBK;mp-taKGfyiE+2ZUV8} zrqiZJ{hr~nE#ffhu5vnVkDW66RS)$9-RXx#A;H;4wPHgk-RWy|r=QWC{<=HgWAbpO z7~L6QbZ4N^ok6-gqI0C`?ugzoSRinRE;xs%>kyE{>(C|+=Lq%EusfrS?wnxvUGPusIsLyij#(%6VwFQNz6e!9L~uqzh)z2kY_YH#b|V@ z9s|)C^L3+QWK1&}oo+NbBV?3@oHJEFjh@vL#+>J>Loqm{(YZ#W^NdF4i(X|_oD_1N zul_{^yHJA!=VJARu!3Tvf+a=;ON||=ME6=m=K|ep5uFQluSG{Hm0rt^w9MF%%0eB9 zE;!58vG5@A1UiMoS*?!1W<%Czh0&drMt4>jgLtv-jtJr|?0iI3kxNIm8XbAe=*Z)`Bi#o>{t2PYVOvG7o)ky|y?RQ3!mDipOtjsZ z0+y#mkMY=E<4}J_AU!bfVb<~sn{<)pkGY_^e|fZWFP{Uq&R8O`H~t3gNaA5^K>~6s;`Buzh$)kwr>4> zu5j;&yXIE8B)lt19Ey_~obRdi)E19Tg4OvEcA=rLer(isRBBV4`Q9k=gOrg*e-wz-b^}BEljznq+f)ybpT)g#hiw*-69RE5PU?34qQ*hBGnN~S z-_^B%;|V9;#^^cCrf0*3EhfVP7%7m5&U_En86~)^xam_(T@-a%P5k+<3-5G}bjF!F zU=P_wS%!eQbrvg_A$q@9U7#BLWBp)uNhsrs- zN9;PRZMAs<%>%)*lik?N0>Eto?z06QQMHq*$~=xRQy) zk0=mLjQbOIJr}|esl{GQE#grM?GAvdwhP8k4YDLAj0Y*^RV=^WMCS>>u~ukLbo~xc ziH-9DcJpV4gxEU7Cb1J;a>f1#+lig2I59Q@5lu`ak0-VhrohB5gp*=VP)}FF$+2eg zbh`|2YV1A_U=QJuu|FfMiQUPQp_ng%I`PX&8J`&f=cYz zL4dpV2W*WUj`mW!4F>G!REdR2?LGpqtJ7k9U`y?B1=u~EswxW=wI_exN$ylyRHmp& zw}74s6UpcjQC6=w&%xQGn$E`Xv0R98ruKdjZuR;Y#*$Sv`9Y|ST>~DqA1x@coNv_r zyk~BW%|&CXDP(bU!Y9rYbpS7+an*vptqyt`uqXBcw2hkjJmBQmkr)x`;MV|qVV{E} z%F4EjvW|oWE33mo(Sm54vjKl}3h&L`j5;ib6tkzw18;Ei_!*AZ*Tk=shcRvO5byUP zS2y!t&L!W9X-4N@X>ulp1#k|sQNa7&0EOzCLW9!pCiG|ZEtRfRqOf0k^h@<^fp@{6 z@Bco^BQaG*o1d9LZMcMtNtVD8u>K1(*Z_4_w0W*xs-z6oiz`vQUlh-bHaoJV%m8)T zDNO^^>E@Wjs**BO7r6`~{Qq>&Xj+c*Of^+WDK-=;9$8qW7Yo1R@_AL>>)^)U+w`6+|rkq|=Pnry-GN+7!XR z=o-{f7rC~#s5s)Gh@ZYir>udx2*u29-{%c>^Fqytx-<0(|L;9Goql zQqk96$7H7#35joszeBuO;Jq;A_1jF*5|#4+|D{&Hn_*imQ>p77;DeW8@1&NicLFzE z>mAH{QR)hnYp?m*jcbMshF3gR%S^eXCw{Z3!W>nn@?PhMP%(_RKGg=5({S43&@)Dt z8L!KrEE8hG_n@pjm`0q*F!BwQq@iTg2LJ|LtjjaNqAM*hcEw%cZi0a~A5~TcUabp! z27#0D9YYRBsM^lGWRMs(R1qGUG$l z+pKyZCaQM{1V)_6AgXs8N@VqZ)8+ry)wA`GmLi5APwC;280(h}yQrT!SV>9I$*kVI zQ{)1jY=E7M=oGVxsC|MYmFuKIwGv_w+=T|ULKn{6gLQSj` z?Ni0|dy*Kiq4{$bn0ct1Ibp~lKS>OE?n%UQCe)Y@=%F3>x<2!Y>HMUQu!HgO2r-6E zo6bXWV)4pXm4POYFsL-3?#kJBa6Nr{9>9lsO1gNPAE3Iq1E#XE{2@bqn{&`_a46%T z2k5(;V)$@M_ce^pd)y$Vu_z3$_TXSu7+cs?2CYLek0!9PUo8hbZXveI{dFf;sK%+?uq2Pa1a$MYTP_=a zkpK={s-$#B#dy30`4Qlu4y#8=$<^scKwl;4(dKkLE`P5O{4rSTF3{|&E zRpuD{clso3>4|VhR9Fk(B?Bht`HPl!!==O2Y z@x}EC;u2#YM_C0?ah0);*FE~%bdFSTDA_T6;PzAXm@jy6a^<0Jj>XgH0YX^H4XxACAm}jLf~LtZd>38JQn}%E&y($c&8%Mdm?9rXJ|Td|f44 zZ&n?Yp-ll!Lthr{nZn=ad9bRRWjO+&3|y?!MLS=rBdqr;g6Yh5_Ujz7omXHNsorrA zKJYkSW~j}*148Y52Wztz4$9ix!P+=tL$$eswV6j$wDTRT&3!;8{se#rYcn0n&aBNJ zdO2%zfh-rbu^MaB-B6pG1k;(d8E{%{8Zo1(n=TEhmL8xsoXTad-Nf2_0taPnHnBFH zY@yn0Vr`0virQ>qZEgpeavK01CGa*0%32$559mCi9rox5+hK+fIMeetbPmxD-Z!}* zZ{YfD=94oyRfB=@?oST4DgsinTQJY7t3uD5FOe>xdWpEHAUoG8R-idtfmN(P_c)Y_ z8x^bWfyg;PyNeb65~Av~5kp~y#|)V%lS&kI^({ay2J48WdZ`|0Wztebt)a!oP>LhU z8Ve)Y>sf&%pX$t%=Amx>HSF6G`WB=!BDhQFTUva`wO5qzlRyDQYP#k45>wX?l4z+5+qaI@%$`4rSF;wt~zT z>ZLV;IZE6tnM}{s!Uy%8mZ}S?n{$h?Zm5&lY`gWX>9KI(m#D{(!#a77PJRINO=o}B~9Mb!l^!^|nI;oe_p@E%s7wU-&)sY*3464x)UhSiIMw_qD<0e-1Arqu_ zEDl@}!T*-7_6`VxpAW>JeJ7{3;q)vdJXeaL9eEdKg1E9Beg%j>!8PgWNP3##fIm0s z79XN>59-L%M4r=;7l^#5Bd-v7Uq{{rqU3GvfT<0st7Xc$z425YQe?53r*e`)vhA3% z6>LoIrRFIoQOpz{6OlJ)0P2L)?c%(zFbObqwdUQ4yPQlOOWu5V$mFr+J?q4SUr3&) zypCArm~0#JZo;r*^2Fq2v`3AQJhr@9s3%kVJM-SdR))zFoAVmY&0y+y*p$aBU?z_}Zy{zLCXZvvg%~hQ&T3QMHBoq=4#^Xr_catS zdE%zb0EMa38|suY_`uXYO3gctd&^9o$SM4XJxuY_O;gIz3z_iIwY)~m*G%r?Q@$LC z2fmQp_o-6`K#Iw|z?}CLa;9$crhErCnBw11^BzVYU~=!Al7VYiwxvI^x)-G4Jp@j(ZZ z`!RLuTZkajl>1P~JOXQ|!UK_dR&-4JmeY-k;c1FvVu%y@C6oOtJg&K7b5U zY(-uy?27bR-VyXArr7hQuE0oT%9{a`OtClQHAW&zNU>gJ@Ic<-NsGXgBH!?tKL#^B zjGy@`5ufU7^$nj^U+yvIqp$v7yy0W60l($H;pFHH^mpqYgj1vWB9iq_!Xu;kB9iql!WnUV z5y`5kM7(i)5y`3wBtMQXB3VrWnG?qsk*pEw1ke`5@kJzSq{`m}mc|M1^%s%iuBTV} zi%4;N5y`5*h!n>ck*xZQNO61-$=X3hlPQT{RFZljxQov`wQg0IKGHvO%ce}xOPMass|zSOdMZCvg$7) z#qk*h>tJ;$?Ce$I`680_2CH}x$-0@9jQ)gP-AYi2=8H(y+gM#|G+#urhF?U|K#Q_o zi#8XHPq#%cA(c%js4GL%4vL*GB02aXl6AC7x?>^jjFB*3M6#v}ILi7QESv8DOFO=Z z6#W3rx8sXQ(GLocmx0j_Nw6onu6PkC_Fiy(hSXj$AEE$XM2hK5ii5uj#`ZAr-!bCn zA!u*MUj=QW1jt_nZQ@tKcKlV)CVmxcH?KQD@vC4gxiZl>qI#<0aABmzby5d|)h*d3k7(_Ql1L7u*n=VkKr6Fhjs4;ngHawlLuK6?vb^G2NP=VAR# z7?(3uiJ!Wa_;Qq6reoB`&)-G-{$VJeJ|k0!FXJ~;?L*NGqpWuWbUbx7@FVIign8%9 z{;`DnfW>Yx33?ekuxk?DkO??N!k3ahO2XY>%|2Gb9WnqRcq@U&jMpEa7bO6iN6^>Mxe?wXDk$3I9wVmP*(+5paow zr;Gr6frKZ~p9>}YW;)yB;gwgFGP(KzLW5N1UfXAicnPPn&$W|qpW%Sp zOSnJklaL_cmE?CyxCRZD&`H8`=v$(M)8TSL7YYA@xFw8{@FODur%U(&@jZ=1gW9UVc?wSw7|;w&TkNkMa~%r z+!E(ez@^SUD6MlY0(_G9pAr=)ZVB-$HR{RRARYlAkkI>%#K|haFz%>N{MA~c7$;Jq#Jykyh`O|T zj`}@$ofDb)lXDHmirM)pIzfc)3TEu{5X^(ksi&Y;!~=sqUr1JG@Dehn`poL555;*1ufZ3TRaaz=pD z>Wo0?;*gFe^(*S=1AD47Lg=^zewdxhIHsLTz-w_9AbOGir?)QwkE=S;z1`QATCy#? zA#BT-_69~^*^+m_#x1F3HQL(UEm<NS;rk9-}jd;n>WR6Ywyqm}1F zzp={iK(lP+WuPCgyac@0R?b1inW(%G`OQ`C2PR*+0v4UDTnx&o%KwCRMhN0kvO>22HGkR0euyZeeM!q|sVZ7!rEu0|bp+2Udj_JH zZBp^8>|U5`*=B>AShN`j#)F)ur?3A~{J6i>Kn&VP`c?;`(I^N7YOtA<^w zDhQrc_8h@y5gaP}7z({=KEZR#?u!6kK=Ays-xKdbf)|&40Paz>h~OnXxZplbQcMDvZ^NTq7UrJz|c+;3HdNsLuS zFC0{@r0n9o8ltIMeGW)wKMF6dT0>xHKT0N4b^a7dFN1?st<$W(vH@R6Fj$GG>Y}|w zzYMNFt7<*XiD~)`ir$({52|W!A)2=%S4*lk{TI<3CW~y*7XLJ9u$AaTW&2PPRoe)j zTeb_{SGAqs`DK@);Hq{IjMs2TP}ODklguYzwP4k*g*1@(II2t4ZngqFsH*=x(bS`` zW>qz9B^uhvTBW_onoSR?t~eL?&{q*)=2W%O{>l|ct*Q=6$y#v?n+OS-RaQZyd)X^U zbb>s)+?q{{RjCNcI0zlftGXU#8QtH52qmM3AeOOT$*^V5#L8)U%Tqyj{uj^ z=F_UHNw%fa>?L|M#6(op_ata$zd*&*PhjXh@Q1~L^LiG5{DTn?t~?0PD*Fsf5m-fV zpzI7BD6pDD2FtFE0bX-Jsndqi3#_H=g~|@W?1A$Mo~tTD-~xi@TlQ;6g*U>5K7p*x z3RK@jiIJ@X7ZVZKzlegG71;20deFWb4|G_;E>l=)D6rXvdzM`S?!eYg;wXCsp);`U zH)y28WoIMy1XRgxEZc>g1uh|}o6CMm4Z@|A{`Rut$b8^3f?HP{#_aH}43fIKY%zQ* za5?GIZ=LsUM9)Bj(!t(65k@kQPP26Z+a^O)LN@)T^aYcmw?nO!WN=VWns0*qRkZy$ zP+|Wk<@?m=>J)QrI|ma=G%@=o7QF_Gl%a_=n2|j-x&~`-FkqOb2?M_lQfg;lT>3ew zy<$@Pb&yhf-lX=2AQe5O_5|o`E`_@e-D^7 z&}c38L+ZP0ai{b7lOQ>3@YKNScZ-A>^O;pC4^Tc)qG6ih3_Pn+UeA1NCRp`9IOS(m zE$^Fyflm2bL8@xOQ<>HMe>3HAm2!qs23?rubp!vTQeMuPg+iR?uEi+NJwP)> zw@K|QK?;+>Q)8>IU@l|fqwew?R;i6qYIR7B=8FR#SE)URibg+py7~p~eVS6EZ~_V{ z&-a_uJ{_b`6FfDtdVxPRkN3cy@SYJ$4bde`)7OCysMOxYsi6vRYISEzY9COkt%sGh zB_B4aJrLNm8%0X($FZhO8*vUZm%A9@5oQsgcMgK-oJQJi|R`AqrW!>u` ztIXcb)~&vU6TTVfAAki>7E8&-K?3zw^@B`87F_@`mEU!4i;6U5(NS3Ri!P~K6pKi` zfecCowfaSuSS9l6q9SuJVQGjOAZ19(f->Y;mVFp-_=~m3W~*|MyQ;MXA2Ejf$Wk$6 ztMbDMtkv^eW;re_9%uBh#NmvWxLA}WJtUq-R&V*zS;f6f(S z*=*teOIY|n79dCdNAO?tI&%Hb@b0xIjw^dttR#D1&Gy#5`;`EVmat>&_(imr4O`-A z)MKBz`S?Y&s2X@BK;sMh)KfRsbW*Rz4laU}Sx~v=)9B*{W(Cj3{W`jTnvx6!zlpkX zHQnDw0d+y}iW01Y;r;@A`qT<64DJB^k}BNeQ>Ip6aqx27_u{_BqD-z)<^N9HU-Yk( z{svVS?Nd+OxZ(B4@W0@J0yZyafYx=Z*OQg-yA9U}NKnZFbttJoEqs9dzgzg3^ox~!ijvhRsC(Ip$e^D+b|VcRXrm4g^T20 zwK}@a+fyfxlNeO`KQIl&ds^*r;(`%#8Cp#Gk#k>&Y%14V*Q${aVJsq&t(@sMAkq1^k;Nt(7@V{7;A3Ni#A9blh z2X5&MTGh`po-+QD!Bgd)dgeytDj0gys;=Ll6DOjwa~2K(y-;4H*iM|Y?H@Jz&kKV=)zln$U@xz-S`3&QK z2>hoQeNX~B=|0?7xWjv+(XU5ww zD!sl!_J9ql=WNvWBPZ=-ysOor-D%b9n1*b8%uQoY{V%cxRfs{RA-{P@(Lnzf+O+UO z7uS9oZ3rl_b_A?o`s zQTtt@N)Tk|M;Uyxh**~UBN7rLE5<}j;-dDS=93)YJO2$&4I0=E>SPKM2)$$ zS{Iv1j*T%s;jEV|~?>qPV;&q;>0wl|^lZ)ZGt&SA!r=RE96`n19$>G7gT zS0m|MD36;+3p_UA59Y**bSp|(pkr)OLCUm#0OvQyKu@n#Ei z1_+=UMXifMRS>E)^aZp=s$ZRu2j|d(+LhEeO{o_3;1(e8Q(q3lHE{2S)o6~?_~58& zQC~!u(#_>{0q*KuRJ9qD*DC?`sn6&J_Hyu***9|oTX)V@CD)4Ui?wAH1~tQYC-3e6 zP3YLCo;+UN$TZ}C^YC1i^wAE@p(>b&Q-S#{0c&+1vrxT-jXYy^l1Wt;O?llQ(_PHT z-y+GMHp#EP@qZ?(`Z~7JU2CxcN2%#e7oA@uONOwjzrnPWB|2eGW$BTkS$Y^%>ff1# zhJk$Kbs0%lh4x|wIvzlIKY^!I7Rq6kTQ-$v?Z>IWE>i{8wN10DZ?pjn+hBbO4WPQJCwyE^Q78%R7o{ltrcbC9{wRs!Aowuscyn zD|cFE+2kyn&uxU?e4TpawB?_E!$Exw-22=*Y#vqd&m z{rk8*inytCv!9aa@u^K(+%@`Qz4v^}+Dg&mRhqRXx7wPW#EZXwrb%i0)ZNFc zzt0?0h~1!8mU@S~s)%svbA(>8s(-^A-W#~gs!lKs zmCHiNq(*_7sT&wid5tPOnyIIXpk0QRGS-ct9L~%>yHi7i4I$Fx7-=w}+=b%(n z&|VjynSHYR1!@xY;=pTo^c+gB`Zvr&8KKuPw303}He1! zRI$Z7G`XsKu41#xHwMsGBqlu&`Xec@)K!iR(8?&FdX{Ruk##u-9Tllk*9yP&kH)a{L!QiR>yAB|lU&7b_73N<-9`;%#|UA{Dc#2F$$~Ia_SmKL)HC?l~87 zi%unBZGI(!diQx^`3nLM{hIUzQG5uby54=B>RmVt%kJRjk4v3){6jSw9b)`sab+Vf zM$cm#ZM+TKM#5j@c%VMdi39@o-ihS4zp)d}|nEn{P8kBbvAM9hVRh_Q9@%KV~d=s(xH-rPJxY7>iDB7)9NoUy%GPsyS?z(<4$&0DqQ8R z^DLXZ<5Jqf9k_wqM>ggHtA2rdFQZM-fr%klhknk3<#5pIql~68g$0BvFk|1sCf)%SbAhFdJgsM}BB)~a5`Jj-DH?@NB1aW75e?L`^T zdx+JoOnV_{OI7^SlQ)>eRIbxM5!NYJA7x7F#GJ1woojJ%Kgy+t zar*Dy!!Go1&f&mL+0b7$5ZLu+#A5ol{B1k`as|Q+{>|wR?4q?r`nUYrU5g^v#fE>& zf3)jEus;1;{)U}(yU={#-?^6sclN=(>EF3$2X~%}n4$iy4DLJ#i_yQuUkvOVt;L23 z{9Ex>d)GS^I{8M*vx zP~-FX7q$r6bt$m)54#~Z!Xsu`A1}oMrrtE3Lq=%RIBn*j-|x9V>&qcof8fE^`?4W` zHcLNR0SWv82+vm`>=)5m&t8WTz~bpl-;>w{JC)o(V(fE}YRQdx0>47on-q9&Gr;4D z;1>kmqOgYvyj5WzSP1Y0rC=|e2asm=NT&}HhPI%W{2gIthwR^yRC@o)vcFDgomL?2 zMlYcqvzEP|2tGn!NoZ++R8}9TC?(iFL@ZBI>UvLi=}Qlz8>jYkm;OezENV}8>8p!C zt@m`7zDBU#(_Q*|g7u#6(mxQa_jH&3kzl>2yYx>4>pk72eq@5_IJ>8{C z0s*9bM>*~3E?pV;639-L)1L0q3j;sF%{$6zPj_jxx;ax$d%8<6Qa2wer#;=J7pt2` z%4tt`X$>s^TK`y1d%8Fhs={${>9N=rEyr;YLUdp7}(_Q)=0`;Em z($kb(y{EhMy_DPeDAA7rR}$I?c|4Uq7B$&+r7)G2(z#sepr5XU@ekV2SSyv3Vs3j670JNAvyA# z9SWqa-*fh;+|$=e7R~@blpF?~kMG@NP<)Hq{0nBH?;dZSY}22enT=2vBK1&kFq-`fd-t zT2TVRlh85v`=5ZvD!TS_nmd4mGT>gKD%sLmWWZoU;22PgS3~uH6>7(2Z2q~Yfhzk2;Q8li69g#nFrnE5 z9|ovQaM%jH4iA?E7XBMC(K%v)#aBWyq5#2X6C5gQ0!^T@3GjR?)Qtxl154MHg6M-( zbX5dedJoWYBAQjEc1xT~$%M+@Ny?qq0$YZcjrNXPfiT%@9hw7m4p!BdD52FVefufy zaxAZ<6w8%~<~D#FzhnA>-qrVz-nq1({wvbKez8+OS&?K)+QRe@9-T+Cx3a=`9*sMM z^gLQ2uLxM-n_Mi4{23NjNWK`JKR1j&l&Z4cVyl!?SxN5|241CHovGKVj2K;CA7WkK z4gg0{b+NAh#+0P%K0GSaRY;+0F!V<_+22&vMQxV{L{&;usd|=GN}8;?j|$^cRA3+6 zsWo{JwDb$y8!5-I?fuO}K;ZXQBA^WP<8BY`-nWYLaTRWGA{ggmts0Vlmg*FZ(AN%U z(LMd#A<)n%MCUIFe7?F2OO9{50#ct|41c)b0|b6y0us8bu@xfD{!f(nUyYJkZw>i!(C zlBHLbUjeJ!Pi4K9%lcNWBg%Ss4$4|>vbdl8HUdMfR$B$`@3k%K6S!3s>=?+(?Co6G z7pko{4^#8IZY>OZ1&jR#Ocw$r85YBQn1J>{tjO_Wvg{@LG4`mqb1s6FWgoG^r(GP% zPM*r^q5gZe4QZ&dJ=ZFwOs)SN<@y~z=Ds%9GUWIdc&PG3C!m+v&77y2KQQHAfex?s zEAU!En@km}@F;cBR;$7xaY})CRw<>i{;?PoxLrE?G~T0M;NEQrST!Hw)Lwv1YQDxd zzr>BTie7OJ)KPIIs3(qJI}A;~z`f+`t4Bz19rcS^V11Pr9aOI7ysT6EA1|dQf$Gyb z>TCoCsY8OH_l+Cg3?Vn~Rua(&>tA5#-=NmT58%-Q5PC6vKH_Tt!gn#@t3aGbCsk3Y z9s$#eJZooToMX*1PqF3?5~@)TGC>6h)@lO#)NgJ=fno-c#Dqqy6^}8|xgd&ZA}p8_ z&6K7YvsQeEY3_h)k7^q1N16yDUFB?n?RY1Ax4J`@8S}kD^Ng3~5~d+X{Jf$;yYNU# zGpdpm3#yX6%36_ear{;|o-fLA&{{FY9QPv1E=8Z3Y_?JP@bj#Uwc@KTsV#~IdK`5( zI37K&wN|{u9P41EYaOY31Dl{J8N7!K9*$V*NBMi7$URe3?hRH=HFJ>DujqEM|47&$ zNotve=GkVgxZTCE7?ZOqpDz^Uh*&iz-3dPKVowVD{G!&q!m9a#oBfwA_B(~WxhVTy ztLC?E_KP_tkhSP61*QDWMcKP?ju~?(YaMX0&sUWLg=iHu_93fgz|H<97kh`WHy35U z#;Uo;#cpkU40SqK6QF2szaIRxKSoplLcw<-_VGhB0@NsPd;s+Jv#LjFf0F3OK*NaI z?`fFupr=4lClfNEfxxCmA)5Xz_)4A3*_0m+Z2B;`=->_?+?^H3rhNDza_9q z=4=*RyICem7ORPpO)_t@;0>GJ4%O)2!W~v%L11mgqB(X&RRz8|P&)q{BT)$G`!0D!WU;M;&l<%vlgC@KZ|As zNDm}7n-W{R4y?-&L(WzJ5~$<^APge|L#iIg(LzyTZvC{M_M0e4nKVm6|Hyl}?6&m{wbLcHn}gr2gvJ%Jyp(AyZ<%wJOos za(lkRdihdfzMv*>`BG)!*%vI0Eus?Lz2xonO5VEJ#*#sl@`a9J>DztP&MiH?h;Czx zHY=$Yzv0#Z{G?VD?fN&~8nA*(PSqp18a%)kgleJf2BCrHBO$UI3`L@FsDRc8x8SLp z15r3O13a7X#6`H-A;c{0xe!Z)-E(@BMYqnjYL&cgS^$QRn;El%0Q7WfU|C9+vL05p zz0}Dwb~`x9VJ?&sqYTm+`MZqS<`kIiauxx{qTK9eCHXcoC(wBg<)xnVP2fiKZBY6m z!;RW9L=<(W<0+gbwi%1vqj~PCUqWonZZ^qU%;CV%FPt@IZ>h1^4d$3suv^p-<8zHR zqQ7kEScR^f=>K>Ss0$qq0u}B5ZO||kNflWc*BoSpY8?WIQGS8`JL|x%T zkh3I$NWd@=WPwwJI)W^u2(pMG$YStwl}Fg{*VIahBUqQyu|fw8*k`FXm@GTTr8NZ( z6Ec^(gzCUyI8ESi1)cNUx>EHCn?fwC;VT_)Cs$p?PC@k$oU5H0y2e$9*RmgRZ9QLV z*99(a2wSHtj-0BvA(5e4WRjbzn8EcP>0RvB)VLuLt_K%~4a`iL;DA&%Y_>L|@{;x& zRf3?db>#Tm)*VWu9&R?&g;jYA+lOn(R?Z>aLf>r;r!O4@8Yw^`M7R+rAw@57o?<1! zsd+9Th&_&Qk12LK^@=PSwaf9>!8B= zn{TI>bX&RH6baJz6w0|oDlWdl?c(RTDo$7)U>?edg8m*+tDGkVEejfW<5uvaHCz$d zJJ-6r3{H2xJEGu~UExH{bTUTXN%fNh2zjTp>n!ymS2Lx;?Zwipu6H!`smMYackN2YJHhB;z-OXNv@^8c>Oqkvsgr^7oSTPTOX+A>+qb5-ZeBk!JT`fB{ovT-hC{>ooTW%ch7WBR?CUEe*(%(cuBfQoF_y#> zUh-rk)^LZX@HK$UsFfQZ?#ptLt_&lgsrEW)5Xt`I^X#^=Bru%*ip> ziS&UH2Q&HXI2)>^t8GtHcQf*@C{Z4V4}l6lE$|-{3&WaA@UV%U1ir_S_o#y!^|PAhM6ppCCH0xI9dMdg#v}{jrao#wAcvLpLS%+{ftp zDUB-GZ?Af2GIZ*R(22)ur$Z-BFfgcrP|x&q=+udChfX{h`m%lOA-nurliv+>h9X1; zwFg>GJwF-x&KbMn^i$LCeK~mkq7(Po`B1(yV=wAHU|$%bv}Tq3M*Zz6d5Er*r&%RE zc6UwomEgu@J$BbX=+5ApMfS$-*Y((w-IFIy*z>x3?1s}CeL2tvrr+E0FD*Uxv2MFO zblI1uul(|K+WzSA)AlpgmtJSza$_ibBD5HC?T^r(&_?z5%j&PPPH387WsOq=sXuoT zWaonCVsExIT43nlAh$#YaD!8J>QYZjAT zGu?KMIL_+63Odj0w$s5i0ejVDc6s-Ef)xmhXQL_wt*d7WlrsdSzY#9~`!M)_7*M_8 zFguCKJR zY6$OwX&^&U8jt!Z6yiF5xG%R&gGaY)+@Yadw(oFne?LVwQW|#|QWP-S6cw5@j#A>B zWyU5)DOw_2jZb9r*}g0XFOHk^tjr|~2GDH|bjVDxzEmKfD@Tv@(B$w)e*N$mub`9# zWrvsjCj>q1uqSaTp-53uvVVpBPj@7~FfiWi@>2L|7N@C54Mq67BW zNnAD&$A@pqhXz|FC#OP#cTI-Qgr3@k$nsGC<$HD?0+0{w3@r}b&-LjH7*5#xA5xbp zeJSsLCiMN^2iGnNJ@@eQFTXvs^W_hRT0;-oXN7Kk_{43YvC#KlQRE*xuIL}7o2wLN zjutSV;>Zcay0TkC&z-nKJ$l3O8vEA3fPLnMQ24pfqEJt0=c%tuhc5U#JhdO5Rr8Z8 zL(^C8@39}b;dJPfJ?}T~x3j@j0X%H6=hWEWvaYZ{emu0W1&Cw#*A^On-Jo3-daNyU zAH|?W2L_Q^=rMZ!-pfPZ4z+~NMnGz*Yq6iQ@*|-~ziM9)TutI$w&PdeVsEUm51gdf zTzdpYIT`xM!w2oZ1oCYszS!-I(+be_B0Xs>hXD_Ik3f)5iI8c%=c}*#1PjpWoq-S%xgVjj=?wh*r4D|%- z76sRzed5m0;D_<-132UfjiG()ONzCoh5I8Z3wEXKt{Lr;cg{%vrZ0w zH}%+e&w8xArRCxMP#o6}lm5Tz!Ns2HhNa<9p@kj+gam~DUT zc=w&NutR26iTx#O;BB|;YI)E8P%XUcwHv?nT#e;>L(c+sNZMT^my zcqJG*4T`&O4As2h35X4@Uv_8cxoP`T$Cc}s(ckIo=??{=X?sJr-SsVkpvvx;C}ti7>gUpf&@#`Z_*Tca8| zJl3B*5~c36x{t);>Bd-Nv^^C~Kv;B7qNB52r`wV_rn>Q(IG352%1pGO=WpePugj3L zDFKb>s!wE(B~))aGl3?ucS4JHE11|*U$$Yh7B#SWRByJ>FZN&N1)PE4;TY-rH91ZJYO2 zyP8p>!~0a{vjOABe5PS?BA1=;K2KQ<+0pT)Nxa)mu5HBZ^WJuQZ+pDA`@Ofxo@64r z*Gk7a(z)KLOd5XYC1{DKH*VC9q(-_{C&r4kTdj0=M?Bh|R>W@Cq`I@o=UQ#i##kg7 zZH+eQ(pL1To_I9f+1}FLvCn6gu8!8uwrFSEYMkgjVzS$bD&tf%lleq6)tP9wj;M;L zv~kx#azj@gjN>-isC+8jjY_2QePm)dpGhC;&FLDLh_=J!(v8usSVNSmdsHiZMMsau zMH(A9lr+TS-4rbt~E-)I5c4$d2{z>mBw5%C<<%7qd(Owy@`GH%H^wZcXM!GMRC2BGA9PL;Hcd z4!}KC6N->BH9P?aSK~--F-Eh-=XG(%(S%4Nsy($e(u16(+dJB|`nvs%cA;(crr%WO zFa0`y>DT#7zs_I!+?;yrQZj{Vg|hLr5B17I?Wk>B^<9qWSIu|tPuA~qewXumoZsR6 z{*+cPiTL(_a}@P3L;;MpY!**4EjYip5)f z4O$%i2IZTcx*1QzX7I`OE_Mx%i*4eF)X*A>*LOq`jh*pE@N3K)`&;TrXJf3Rt3JOQ8>~ zTg}azV8Ka5@$Konr$$d;x`&$3$=soIKAWZw4N~DNLwQOD6}mIoT+lN_5l6clS|hs0 z)P#mJGl5V@(>>?|W7n+eYIf_3b^&q3&eqmsLn4aaNMkhFLbkvhdhXb$GEyXwKp>%B zWEv4kw|ZA(k426S=d>jz$8y7iW10RiS|IJEWb|nNFy_n#9bz+ z8fMWG(dcYWPNXqwJ2|S`Nw+x^^_DHVA?66vnToZ>QazSyl9~-p`8a0f5inF1l(FGJ zAUvYOk12WB6TRhF2Oj2;X*v}jhsXR;{9{zoS=BMR-# z4|VnZJ#M7tX-nPoFjhAPCb}-VACO^Y5)^GqMByZ@mML)%DmB=8dJNx+?vlbHkT&;n zE7X@AKjsR5y3NxaLUuKDS}`9oGLo5aA~rdTE38Z8#Q-hR9ZR~JJ5K{wr&~BH-5RSW z*G^LSq>+@;O0}HK+BbgeitHiSn-)Gyhn2hS{vINFQVos-JYss*d&W~ z63s+wM}wZWz<5O3Nxwi7qxN>jbdp9$su^QC3`~xG6WXjaVPI2C@^_ zIbaG|k7UvVBfW#@8+kGpYfmE7YD1|3H;;X4sr>LhSyC!~??k3aNzEmDM_rNB4Dxji z;_kSPffPTTQIxR|b(_)A-!PON&1@LVphK`BK9Ri!Ws%!(cxrS#7tn^jkzpB^(Eu`u zzEUr`1<9^hW8vfv1smwBBeUaCx>J&fwsmx|t*CK~jg3#bdZROtBcy{K+Y2zfu+o#N zLe;4`1P)KG*$E0y){&v%z9D5tZkMPT^fh}td4gVH!GOM{zA@H{xu;aeo;^Il>vj%G zLZXPL{NS9XL+cGpy1!|Rj$SmzlpXQrsD&>I>S;W83P>QLCZ2WZ!Rlfk&8()gBmLB6 z%V7#y!Iw{8NtW>bMI9C z(e4O$+Er?94&B3Q;~o~8DHF1FG0zwSF)WWJXq?{B9%=P;bv(}sVu_2-H{Iaj+w3*A z=b3LB!t=~GCEyVw2bm zp4o(s3vUwhS6p|Y@#2g0+^H4NlfyDAPW{pP=pLSdbB~K_>#)b(BRd|!#HSZkI3v*7 zkV^Qx9+Lz~)Le|fJmP>(M4K=j-R!PhZINz878}F7p7y4G42xWiD$V%0x>#zu2Vppo zz$%qug_emKX4Oyz(Y>7*f_l|Rwnn2mQur%BOgu1>MT2Mhfhr_lizx>sqOkt)5|6hU zx+@MfC#El2j9;%SP`iRq041o@4owa?6Z$6dIrDa=bK_3Ugd2Ciqq(C^o5@W{8B=;; zqZaH3eJjk6#x$;%j7ot5fx^0)7HaIgey;nv+cCBu z@9nSE7Z`)?Ht7py2XfI2%{sB+fY=1 zx;?`tLFyyAt>ns%nLXh&;vMl$n)1WKfF~WQ8`5pVM5QT4Q^bkF`V{Zj=U=5zGYjof zCT@kPWR=36WKCU&BscR~m`PF3QlJKDO{Iau41qHShq0R@DIQ&5Cuz#M&5- za2wG-hZZwU^R;4-M++-5FK={!e(3Es#?U9z{-b(7{^=@=+M7{D_6_HU;uFJJta=^u zY5_6mV>|0k=~y%xOCt7*5*W86^$FCO%cp&yO_EAuM*e&?LOYfZ9QmQpF+V9nJ`@*9)1I=ck4o}3g7dPqNa{$rTA(MidUi3aLY z>J=z-%JIMVvD0Ro^k5oQMo6qMjKVt3Xu-|Gp6nXGNIQqg1GUwe`;(2B&GdEec?*Xw zJM66(92@NAsTi7Uqq7{arDG5sJDSC=-O8hGY*k1(hY$(eU z^Bzm8=y8N5T)oD@ES+f?y-#2xWmttJkKczuh>H5Y9VA98SHsLj-(=>%l@xa|QfyTN zNh)6^SF;`Irj7=zI$kq`Hrq8_CQS=W?VmO^3TTgav~I-Ew|BzRdG>n~6*gLDI1ScI z)Qp)-4I?h`L~90x1Ux&9G72zO5tU`Edued6R%dH|wkB*`Go7}qybWpqf; zju=l5%D=XaxweMRR<$Sqn_%Kmrc$s=7E^^B9i+-4PZ1qjOcL8I^?E=|w?Q6<^KX}M z?TPBd^fsBl4@)tW6(f!owa_Lhq;9-0ABeE(rGg&uR(PA=E%aJJ!R&JzHfSkY)x3J= z4|F#dOFU_WLh0>M5B-`$y(7BTVWxs-4gHOv9!*eJ#H*hZrSf_?Mnzmxa9nSiW7zxA zZVim%C561dx5SeN2pNMTt=Ylhz7B0ESCglD#2)MI+qX|CqE{r`BM+W`g4d^M%9y-g zxnLMcD;7Q1gAoshB8q2bQHO^zJQHLbN|y9^bx~*anqDl1dCkGar57C1Q+b-Wch5l3 zK&Y@&3of;Si$yC~NfkBqR%F8s0+B*`f>1*wUbvvCN?rBzj!pOjDH5TnJuHe9_LVml z>Iz8x#ZM8wvyC8vq028}YCpB@TV>Rt3!>~=Q3dva8B(DQIcRsB>?VaI<9XrBXYc|zv4A*U}-L`Q{?bh&m z>@w&Z+Iig=c2(BmZgli0{*GnWZ|Wb*9s!ukW%S=Vec7Zgxs1MMHuvJb@2HZL>m3@v z-Dq~|5b^Y8azr~s6ytp(qmv^9WXJo)^7Qo3DE=a$kt5>(21bbtw*WS4=xCN692yPl*g1%}wBPl(zZF6|FHqNQVYnYU?Q1<|aeb=B|$VhEUi6v6Bem=Mdi#bl>uHzm&P}kc{{h}<U_jlbrM0Cw$3k+=# zK|88zfMd;w>>ryvUJJluoD5KW=fWM&l4Or|4*+m*zbxqtYbJN~xhl9n>>Q*YL0& zaR%cj8lThdY^8}iJ#>1yO?pyBI#?)Lj9yG%TIbj-5UA#L)LqVQ!Mf)xs|xNXNRk!~ zX)gq=E~lNj#e6!WUR4;%3=a-rrZzQ{p?F2>+^#93w%*)fD;AF@I#L~J8YOk(Z8=o0 zz3EtcQ%4#RB9d&cO~+EvHms1+_WO}zR~er&c%-+D)4KBC!;8gwpgvN_!NO>-@@~ zg@NS&O?s)K$PM71$evDV*&QWCJcC+;b#d9j!6)84rG@$-M7M-+o*)`QfPXdngi4(?d?#M z)~je&yh@LH#@6WYSau?f4sMP-Syjr0L~C&qs`w!}tdB-h@n*e!(#cn(?{M-My-%Xb z&-fT-1@)NTSFDj#D$>yGcyBsAxiw91&!Pjb%Alj3W_n2_bxVtUcte8jMGveq$6Feb z+u%wKiJrKkHQu8urFKG7kKwlz7p}{WA`C*K4h0LHL=s(xl&{!T$T14}+}Y6yWkdO<-W2;t8_G*9!x?7mx=6*EdYr_m`f&8n zYz?}2T@ZmpJsr9!(0Meu;H?Glnmx1$OPrNMyRw9uNE%Yx zHRW-Grx;vTBU((w#?*qBL(Sn{H)QlOhuTh^g9i-sjt-;g(+NwaHMw6KpHJ%$o8;QA zYPYG+(#ZNUi={Y}mWoW6gNk8-0ve2CPLh03X)79FT_l0o|Ad8bPqU?D*N#XO?K8Ej z%E2-4FtG)jXme_xHFo!6!h9@EBPk9q*p`%zbat!qR%sa9w?|bAiz0?5xyeImIy=Rm zYttt4G_I;MsvXK9XyODJr_5$-RCB#-W0OZucR~d?l@&EVpH?~1-iAn(pk02be~$8P z((HG3VgW%#C~DR4iVSrZ$ft{xdIIZn^cszHa;*GR8jDnYD!`0ojud6&^(K{+X}2gP ztkRE<^d6&zL@IG-ql89R?b2Nc6<34~?_!`%=BN=Mc2#pt!=zp$#n~-maEt6=oCRT# zQDo{)+XnNq*jwmzGh-UxL_`|&n%uJ)=R zRCM;#d^7{;bbs%$5!Dejc1KSE4o9=ex+L7u%xokoC?slw5e;*sRodDAARaElQ2I_x zRqwxG*&yB6(7;W9JH1EW$cjo#ADV%)F|@j-a@0o}r5{SW zOlh^sQQFgG;|NbZEP7vs?b;W|Zg7W(0~)>lg1Jw;OPQu1>`p+D$BVn_o31^hb+zl_u8eMb|A9+q&3!=F1927$>r?1o zqPwUpPPwK=m3w_E45YT!IvrP^-*lL9$KFo#kD@a8kR0@m9fQ8OOHV5MP_`^InQ3$$ z9SfKd3O8BUG?dh)t8a_@(?-Sjb#kbWPp6Y$e?GdIT$^dKpRz=4NgS`4I!y`XS~c2| zY2{9)DyVj%6B}H)r7(50cftvMF@!#SUJN>@{lf#p=;K0%;d~=?`XuW5x^glO)49}< zR>uyi0cv77ES z>(oBS+T6#Bq|87WuFH)emLO8F2YUK6$dV|WNOqx~aYc$_M}}Wb#isk+ku9$5kvVXS z(J+MOX-tIKHb1j8)t-^C6NycEa-h-%D5&l>!L5XR{ayQ9rk75!JbDP*M*n$}*U{qMffdp#f zY?>-N3EiGXi!Nc*C3RQ?9UKJM6g$rg$mSxI z61A`~Ot3h;atb+7tQTScOw-=zJjs9`v4gGL7^6K#q=@7x*^qKZ6m5XDh7y+dMe7?Q zU8*~ww?kN}rAbEjda4>lUuIze#&x8-j+ZMVCRLM;Q#EuKTy;?VB19RCtkRJ#yt=GT z;y`bVI%5Tj;dNBf+bxE5Dl2Hp*L;Sy=c!1q_- zqw4tY^Any%YtxOYq)wCQ#-3<4B5@1Tk!d>A&rt-6^cXtQHW#=>{<<->pGXB`>PFI5 z{G2p%+7?G>UkDAn)yqnS_1(+|x$SBQ$2^ z3Mb{fEgba?OnK`^?9@qD1IsnVsXxr3TtUS;)sHlS^oU&b*)TJXR}Ha|#bnJ%Px>j2 z7=+SJL@{0O8d^K(ZAb~SU6{mFgSye)Yh2T2JaR&pT#Tv)04NmN-)E4j5*x?UFF2~o z-PmTux{}SRcA& zc(VmZJPgpRq?U))883WjA!A4LL+IeiIa*3E$wIsvqkyOP1|lnI11rxU248)RaEgERzQO#?wQ)s3DU!!zv2 z>cehH!Sm;H*AG6E%Z``Aas3dZmf#zwBI6>;8C(cCv4Z zuJWJ{@05?xE+5JUQo#)NQ8Cph>KqWGWTD)onT$b?L6-^02|bR(Ta7$5(Si=Y5~j?l z#>>btRtH868SkXhK?)216Pf;|Mx{P|`-zKT3L8`O3^S~wb?X-i8#n_P8M3n^)p<`~ zAZ{uM=;esQ@3t8Nl@W244eKr+~BRtZV#cS@^cmw1%C(!uWH;m=e&N*-g7KE^3z0`Fj4z={i)HK?S3pLKBx{DL8i3n&NGd3Zde%3_R}{Q} z^mRWi=qe33e=AvVk4dZhS_Y3hD2HA{%L}>uBy~)()kxv**f@lD@}qAXl5XdrhVK3E zNgidAPZ%i$3B8?*^xcjx2q(+7cgUl zcL{inO9z1+9SW+&hu9FGG?ETF3To(M1-5e3+-_`jm4Ho*D!1&&d0N7>;8M=B8_(ru zf;;3q`@0qVOmNpb$=t}Glc$0@^S2bf$K*3zSVC!?tn=5OrxI%}?Eopr5Ad_X+bXC1 zc>&&DGXI?EH?Y$0H~C0@gu$(*RFiLI-9)h&qWMa$Ay+yzML?-UGdsL6Mhs(0z*5(TohGDD+bj0@OpQ2b#qr$7(m zU{d2o)MoEPy~|ry)%d}XrT(lCq(>0BmOD@-Qp87h%cy?XR%S18sl^dxWS;h1r%jw zc4v{b-Y}*FyvCrC0=i`ty0gd%8^*l?iZXB$0o}3+JzQi7b-+pp=w>W*=YPOC!}NQc zuSikAe>JFX0VSE4jU%$YZWvPnR+u~{1$4_QG>*vnf|0dXKv4#&3h0(qXdICx)G&^K zZpK36T*ZkWGfH#{C^BcZgfLDS#*~1M7*tX~x2!@-h^&6YxK}_oV_~+1am+9#1iaCp z_6q2hRcHzAB=}Gg1F*e-gAPil{MQYJBqgB3RS+wMn?5i|zksz@1I}N3GDrQE@s&D0 z0y~o9{M1~U8S3Y2z)A@?z$n|wUtbXOKgSPWFnpZ?9x#@?N3g~rf3(Vt}Mx`O*b{cU7VP8l# zF-fJBvqIrDq44>k?JMk|T-c)Ds)FP$XZn4`ML)&^n=kN{G!pm@?p6k@f|lZUOrA3& z1)Wmyu2H2NIcKMUpEanYfKos+yTV~+5CQ);vR=Z+Ug=l8P+uWSz|D-(O32-yL#R2N zzt^*@kMR|<1pG9kv@E%k#6jpt(NH5ZTsm`-NqT03iLh&ou#|uzAZVSs zMqszF!pak3A(t3oodWK1X(q6wJ+o#aY?Bd|5>Ny{vtfbV!U{Eem8WmQJhK6_3Rul3 zt%cmxI)r}vKgzP6HnT&W0)CNEv#iORgVS>NHG`#@E4llb!!F=28AZkS62qeT4303# zB(HZQ3HU}vX+`AjEe1=9$lZq=b^#w^6e;5W-N9q)xAPT>3HUDt)g|CFjGDQO3uUE5 z);}9r1ySyk{OGfWq@Yk~pc7nwC2m#h@t_P!iXKa`%uUQ9!pUg|(nimA#^h^sg~VA)x3(iS9Mp9XE;Y z6;SligmQPkLnxqVH^ZFXWlVjw;VLN872G&oX&R|c0Z$rKQoy?zMM`x}%iXsfLVr1l z_=F)z2`F6J{KXiz7{<|hl z+Rac?PBHbz4Od)1(PxI)CK+06He8(oZa1i;fIAqa%SrAU972Z7MQXNfCKoyd{D$fI zB?bHeqqKMa949JODCNFM;}$C-##;g9T%{K z*--^W(judJT);ttIxx)OJq}6>cm57>GFc}%0Xt1{2Swq3GJ*>F$T=2pog+xVFB#NT zB1klwp+7DLljO-r!Y1j@WH?Dh_#j$R5w;mp`)4l7Z}7Fkn)=;Mch8#pSNxXME}s_s z^ZeYlCXP?bjg-Hi$uX~n#9#j4B=QG$B7*;mN#us(({kfV#KYuIk59|Z>m1~G;lOK-PAJY-%(TC0BCK%Jf=lr;L}meHMZ`@mxKBIe0`B1M zoSR&5JDuL2fXNxi1-H*37f`yPZs~sWZRPIt9=?M1sN_>{E&L4m6z~@_kPGg=9C86a z%S*&=>4N(LKZA4uzd8fCUvcTbzHIuModRBERsaqNm|>I-Y;w25lt{rWbD{W@h?fNj zR4V~RAc;>+%iR-Z+2JYyYdA$sD0hw?1;cdFx&O zR#7yWDZ>1aY5u@h+q(96L4A>a(jwDM>=bY*qqObiPP)7(c7M@cdzQw$o3B{K^^-in zkNz}YKbfInmA33P6TCYG>@~*h67UeCw32cs!=M>jdlCODBR(adaOpz!t1gT$8OFT= z%DO5B7y`Ow70zvKWvvq?Lj^O88~IVEAt@NPRdLTtCYw+s0;Wy>tW&^2M%mV>lgH)e zIz|Q&eFc6y<7Qc>9ywm}6yJS^uSi6|e>a3QB6yMSe(Mkl_y-T6->{Mm863ch0!rd2 zM*(G498>~I%DUX-P7(#7fd6Eiyr9?q4p#ATqkUYs#Pi|KYgs^p5fpD>Fz%rI8BFk_ zJByRZ5HahJ+{ECM4(c-uO6L$72`E`ZgJ0Mv`lX{}&m5nY1cX&%{mQ?S5uf5K%3r`I z4Jswze=$l|N4X0bqjm}?g{}#i%UmSUk2)y`C@En&SU^bzUSdF#VoH769CF+#7LHFo z%_;rJq*xHU#7;jp1=1;?bY{@i74Qb`rRWUG-D1;8Eoix3;huge_o@QcKGwxtgrtN? z$}IbNZuAWe1F}0qR_P<$fOYWIPcL+`3h!Tn?`A$(fA{kbap&RveEkMr-&EnJ)c1au z^gH9sTz?B|W1f3E7mb_F#?F+~jCic0%!r?5y<%7ZeqRZmRb+Zkb4`S z5RP**=%p{S&di7}w@z|%>7}1zeW=on(XegJwVs+0KhJtW7NA^gwpC%hI3xZnYgVI+ zkU`s;Z-r;XFR;c7;wnDkZY{K4D{y7PFS70!4HqO}TZ^reGvd#--Z3M-(mFFE{v7L> z>`d~P;1kX>;g?$B8ETVl!8p9o<5t$Ts@%5*wyos`b_2F`uKU)&wza~*ZoszAbKe@+ zw!#K>1Gcr&eQRLbT4i7XC_2uvUiz!t%XKb*fK_PcrN9T_Ct+Wf>6Y+U`|vf4f5e9; zw+X%^V*@pJy4ro$+E%>RFQhVa6|DJ%7jes~Io$2_Y^M{d^yO8RK8%v5Mpu zVrJCyVnx5ux;o7X^5qhRFRT~zc&7X|f!?wT<6)1IQy8xfDf&ePaZj%p6#Dt?N={)M zyBGL{l(g^np(6Olir~Li1pk8~_*aVH|6BxLg?hFSaieRSR`gv|Ao$V7wVCv9X8N_& zn(iWfu~J3oN0@$YSQCC6deHAE<6q=?*`18P9r*dyQtL%u{C{&1`S%sU|6>vS=M=ue z`uW9Lk7XPno-acGpGELh7z~D?r@xmrnT=b3sfe?(ub^MGGK^@!VR+^S!VqURge zvyNudo_9Ufs|7*qHmGIP)C) zXO!{hAubVK#t{;q=QI6->_1$*R#@Sg*>%}i1m9EypDcn8D1R#)AB`8GKd$f<)@M0r z{epEm2|U$bf4gum@L`wU0zOhi{!>Np&ntX|b#RN8a2Xruw?*h@!_HJ+WITdf^;-&n z+An{*Fb0305BlbOm?`z;d@ipa@lfU6{B*Ozdq~wy6VspJI3x9?y9oVA5&WBr;NM#W z|FI(Y&lSOcSK%wHH*tKHVdpP_Cp-Ad@l~cj$@MP7Sua)oQ(@i3?Z_jHU!?Gb_E}j3 zzlG&|kmJ>ZT)yGKEa9nj`2U{jMg)LR{6~7Ru;i; zDS~e-f{z0q=Cs_GbP@WgBJ?K}eTCJ)f$eb?cBY7&j~2myt_c3?Mex5Ug8!?+S6K0C ztq4W}>bGRh%=TQR@DEL7pBj?4&rRD3=X@) zp<#I67jK*6<=`w{@6F=G{d9jmJCRHGP99Y!j*evTW_r!m9b4(ELo*Pi@iE2WbnnCj z4!^>S-V?|4Clb>AlcS?_6oC3-o4&(q$isLu*F{QaA}aly?;qFT!&^J*JfEF*eH|H3 zx6mh4y{OIG=*vhR8Cy2-vAllqwc9pt_E7_cPaJv#5NcZi3ZI?#QEl4lQ>J#?rtNeH zo=X|X!s)qw)JA-j(o3}oxp3Yy_B`BNyTeD0Pw@Iu2F920=30FA)hnmYpM}kJbxJZF z(5g;aN`r&Eh0gsT80WL6qs?i3{BUz)!b&&x;4BoJ&quGkyUG(^baW%|Iy26CO7Cgy zz;}Am9ZgMi5*R*0*orR@sbhIv-@EaC+<>0W^yOH*?48fJzf3>lx0%$5*WR-{ckiZe zTqTpO_yTBcdZTkx2)Up4kPJ#&e^P?ZYK1>DF}-Mh%p5=I7pM;5<%6s}2i92Wj5>ut zpIf?n_a2Nqp{vs41`1du7oH9Nv=_{bJ<}eEFydogIzC z&XIo{IiZh*);8x)x9B38;j_?MEBA2@Fc}x1`LrKii$98^{)X{sQJf3l)m49U#EbJ} zRejkHCmW6R&qU-L2ggN22s(R;4;1q9$k8NzbGUOc!3V8DF&wAl}hSny&5m zI0Vi%p3IG8GUHy6=0G<&E8K4!{=klxi^|B0;XHE)GADZZrHTJIr->ZOsxe|8)dz!-crvl`eQ8|}oKNnEWKu1y4)#zdDslehlrB>@P{$n$I;XO8He6rE zRc6E|QBrL<{X@E6@CWLArPLQ0=nxsNF`T2_ym(g*sq5v$6Z#gAWI!JlLW*!z$A_ip z`&`Vd3SXT_?UhXoqJD8c_H66V>J{N54A|n~rygRVEawf^!-R(|$VNa_TeRue7Whd^Q~)MZz^dp|3*% z;nc0n#JE*6md$5sBK5KLc^m+z@9?FN8amIee?3lksiC`}-rSH?(|>G?KEtlA_%eff zBFB8YZ_;=+ks0YFLWah15`GQ!tE?J;HG^3IdHO0?jVkP#iLB~S)MSRZXH7@Mm^;m? zyV#mT;A{FohGcNUaUT@Q=1Dv-bVgDQs*hDe=cZAIr=~x1XmSvIz4%Bv@cMRmY#=Le z@1a8zIG~1~;GCq4z_6KsBUz-Qd0CPSO#bh#RbZ!~wv0<EtAF>`zshbPvmZhBCG2K?Op~e~rZGIf zcHCjeXY`kS3vwMIWI{<__$B|hF@HVN$^Hwu zE+NC=NBqR&=YI=uWD_Pc`!r;~#yNQA{`t&ly#Wv1{IZ`zu3;a8tb@w+ZXf>(m@=fF zTt#1vb@Z3}_W*FGFY~%`U3j5T>Z_zH*!TJPWgm%LF&*Uj`LbjEJ@ZTX$@-OCv-`XkBu?fGRqpfzr)L-dnLef(y>&bVd?i({|^;gjoYK7N@O4^L=@XP8eeVFCF1 z7hFk}rp)*le7DyB2D)ljV*mgE delta 39958 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 #include #include -#include -#include #include #include #include @@ -16,6 +14,7 @@ #define DEBUG #include "debug.h" #include "KVMGFXHeader.h" +#include "ivshmem/ivshmem.h" #include "spice/spice.h" #include "kb.h" @@ -470,21 +469,16 @@ int main(int argc, char * argv[]) while(1) { - umask(0); - const mode_t mode = - S_IRUSR | S_IWUSR | - S_IRGRP | S_IWGRP | - S_IROTH | S_IWOTH; - - if ((shm_fd = shm_open("ivshmem", O_CREAT | O_RDWR, mode)) < 0) + if (!ivshmem_connect("/tmp/ivshmem_socket")) { - DEBUG_ERROR("failed to open shared memory: %d %s", errno, strerror(errno)); + DEBUG_ERROR("failed to connect to the ivshmem server"); break; } - if (ftruncate(shm_fd, MAP_SIZE) != 0) + state.shm = (struct KVMGFXHeader *)ivshmem_get_map(); + if (!state.shm) { - DEBUG_ERROR("failed to truncate memory region"); + DEBUG_ERROR("Failed to map memory"); break; } @@ -508,13 +502,6 @@ int main(int argc, char * argv[]) break; } - state.shm = (struct KVMGFXHeader *)mmap(NULL, MAP_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, shm_fd, 0); - if (!state.shm) - { - DEBUG_ERROR("Failed to map memory"); - break; - } - if (!(t_event = SDL_CreateThread(eventThread, "eventThread", NULL))) { DEBUG_ERROR("gpu create thread failed"); @@ -541,12 +528,8 @@ int main(int argc, char * argv[]) if (state.window) SDL_DestroyWindow(state.window); - if (state.shm) - munmap(state.shm, MAP_SIZE); - if (shm_fd) close(shm_fd); - //shm_unlink("kvm-windows"); SDL_Quit(); return 0;