From 0bbf3ae5e438e13721306596a7f4af9c78fe371f Mon Sep 17 00:00:00 2001 From: Leon van Kammen Date: Fri, 17 Nov 2023 16:34:11 +0100 Subject: [PATCH] bugfix: recursive animation works --- example/assets/index.glb | Bin 1727452 -> 1770628 bytes src/3rd/js/three/xrf/t.js | 31 +++++---- test/aframe/filter.js | 134 +++++++++++++++++++------------------- test/aframe/index.js | 2 +- 4 files changed, 86 insertions(+), 81 deletions(-) diff --git a/example/assets/index.glb b/example/assets/index.glb index e45c67daae51a89c54966afdd7cc11f1b168d76e..e4e8ce47e0ef1b6480a2e066701213b61223552c 100644 GIT binary patch delta 76510 zcmaIeby!qw*9QD+??FJp!XQ-aE;{V)R_wr5>~8niiWrE9T?h)cs8|fBx835{-C}p^ zcg{L}zT-RIKfd>QS?m0*>)Lzvz($0T`*w2w>2n5V>pQSbJzXg^-7cSMaBpX}bD4Ad z`Fq>`7aY{3T#*qyyASMLq*A9SEsJ}SW0nqDpih8rpl^UzK(LROkDrfkIj;)d-hsY; z0p3Bu!QKJhzP>?0n0fgG`vwJi1$qbipau8_L=DN3Cuyrw_l7wF{C)hqyo0?11N;L6 zf`j~%JVRogvIP112Kae<`TO`JoeAAzN}AcLZQi23US8g~nqc2xUq9PPy}W$=g9Czt z1O2>xaC)C0@4%?P;|t~V_VNz&^YstH<9Pdd1^M_Uc~7Wcz&qIA&p#j_*xx^(TzRhw z0YL#iUdaBzKEXKNc9k3j`1t$#`g!4Mq7s%C3Gnw02=vFb`1=L~diwGvpPxKync+$J`}+F%1x9Jh^7#7T2tV&2?_gZ1kDp&Tp9(<%-ah_8{$2rr zfqubWcz5|#!22o???t?G{IC+$Xj#>$)a7-fR<6ty)qGXXs2|IGqB^d~82lBi z%}u_+K1n@SUAUdk%R8uCkwM+Z;-eB=0auOpk+-*R5Z?J-G0nzn;kuW1Om`QpV9fXN zS`p1F=5QUYP)wBxT49q0=Y z+xcKe@`=gXpPqI;KHdQ_rygq6U4!uS%N6M{Ze;J~efo^(J+eq8Z@gRlV{)9-%DdXO z{oh6Zz`z)7w^q*GKRD3q|1RQV>FX2oK0zzv9)w5xzsrIC!Crnb>#k_|-E9~1f0u)N z|NoW)yyfWoPqgOQ`~tCaQkO}E@PEbKXH|Zx;Z4Vz32%0I%Y-+3ygA^_5pS9CmIZH4 zcyq>ER=j1yTXwwVz*|ndx!^4q-g4tD58m?P%{965Q@56*j6ElF)Wm0%+V7dkQmeXT zbJfZBQ`!y8ZkwB(FYZdYaxRT63~@-Sk=>(Yp%?n8>U(g-OeKKl@H%`S^6!LYz{U0t+u3(;zHo|nU*Dk zxv+avCrjTY%=s=CuuOW-+&tTvluT`T(xEQXQVwopzMI`UrF14iS_=1XHw9V}Hz-lgWF zZU+wi?_TK;?3WVq=zq^L+*0?aWV6?h7|Vik@?hqjh2t%chBD84yVLSx2QMOD%0A27 zADnk^uo#w;gLvaq_c>zuc$rr>#O0`^w--Mg&59qf)Lp@R=V*#0?JhrL>+0^aRCMEo z)@-)ZQlJ%cf&Ot8*U`)o&zD#nrbt%9s)k$kduEmof$e6m7ww2_D7o7^9dWQN$lZRu zD6{QuH}A5Sx$SOmnUC3aw>JsTBy-!{zO;g5WxLzE-?fvu?QVZGhuL<;A+HI1Hv)%2t1~J?2_B0=6+uc6!tuF7CP~7a-&PZ0an|=9zx*-d;yM4ebZnE9& zQ|imXX4~DKc?(ZuyW3NLGu!U=@|}1Qw!8g*7izoP8wT+S*zWeJ$;`I9-FXzBvF&F6 z-H{*SmwSxvl~=qWY<=8 zvF8KZ?)C*OB%5)!Th1P3w%zPsOW}fSpMSQyz5h&Jo$YRK_@3EzxButIkD2Xm_Z`d& zwcYK7H!<7p_IziVZFjrVHSV`v=%ORvYuN6akVjAc-wc{Jt@tH#TQ=In3e2C?bj!T2 z%sJ~VwV22Jwrw)+57}rbR`ic#k4j0F8}FG{G&^X?vih%Wu9DhXEN48Gd?*Kfu~>3W zVlJF?&~pDfvo%YSB|KDmH;oI0!fsk}c>UYd=Q z?}a62cjhwj8J3LS^1$Zr9iCe%w_yJ3^T^`4mKXQ(@=c4!Q9glJ&(2uR|9g@@)lSR* zp1tk8GQ6tsL7u_%v@EGTp1hLW$oYune|gdCLzd3H-pbsTwSJP#-FLrD=^Mj*`@!av zfzI!2d(07Gty0b%VSbtK%%L6!-pjm0-GqawALX&kkB42UT&(janZGwmxKwdp{#g*a zSgZW={ujv?uLT||G~=r+D<8)#|8M^E`$|gXGu-2|v_`C>mpND zCw-Lj1T~6IIpV~ezkfnX=LB9v?bm53?%hAssEzZR_xn9e38=w^&XIO_xA47Ud&YZD z%7dx@Z|1v>dytc}4|9*Rb3M@Tlssfr{JH7e_oU<-vsWaij&cvyT!S+owoO#c&^Sx! z|I#EMj9!v#8slET(RHTNOqq<2m~DCSbB5&Wu|t!~8ty5%lCO+#&8;Orj&h%97qfVr zTaM&`MP2S|$(@V3ywhTaZg}K!g^y^w;Roh<2H5oDOX1Ep4RmpC7HQQijLYnjqAx~q5%y!J<>-Q|H z9KGR4LFswjeWVXOU0eFdUoE6(-02{F)1DqNWgleqk1=1!>Xv*l-u;^%bI8Z#eoREQ z%x=kBd|ejm$u+jRU({nJ7I4X-?TIN+#if37=nnV$&M_-LWp|AB%H|kz2q9+RG}pB; zuM9`WW=Dyo)6UnH79z0)O@Hp z&kgrYhimDykfmqtcNzWP7L>YEjfo=qAi{Wru3Q#16A!$abnYYBALE=p|5#tCFZC zP|Km0LM@3}7QHlTDbzCPA*!`%quQ$0F$c5e&TO<(t$=o_C3<_*cBn1TJD|2lZI0d% zwF7E1^iFCd(n#cv$Rm(OA&*2J4vj`0h1wLoGbWu-hoO(bWHj7w69EUs>wJ~}ZH5jw;$m3L37iyRq5cBh`i@PyjMW}gdzM6}^0Cm2aq@vVB)J5nER5)e}Q5UF4)P<;X z&?D7M^qFcF>MS)Ibp{lPW2U1{hirKo(jqk#eUdUGnbj23DVQw61b+=wlMFQ(AzE!y zi&3|tN2@L9OHiX#4C)fKRBcAuj2wfUh_qBCpf5vRin<9sR;^R(kvBpckYkbKq2;K{ zR2(K7kmI1`$Z=`~>T* zn>0JkqEa#Wg;^$KJM8%h*&}Dt&LE#wXH+)rCnhP%q8w1|HAhqj?JVYJ)LE5P%ZAAz zm7+4EI%=7Q0ilhkwdLS0rr;2)S=QoAupQt8lT)bHpSnEz0FFyD>( zOg%T$6)dD<{0xID>KkN5y@IXJFtw_$P=K*t>JpdnJ>qGS#`4u+3#mXDx*T`?6 z>&S1^4bw-D zuV%O*`f9FV4y~G&9XT(Q6FCQR9>@>X7d1D!3+6esT&OOX->W5ktJpk2T z3q%b-t%4qe8i-mMJs33zwG#SdZK9z~(ne^*wBf)6ZK7tNPR3*?W+PEYXw9{$S~Jus z=!P~P>!UCqi8=(`jER9d4t+Exqmai!qqV`%6l61UPpG-p5^kxrLT#nBMs2ON(Tpi5 zAwUSW+G<<$w%QofF8ynz z_t&OtyR>PjJJDyLPDkB=J`;5Y>UQ*5s54Qwq0dI0g}N1e4(e>wE$HD|5|WVw%)w9Z zwt(T7r?A9?ZwPVmB zmk_UL7tyV#S5PmYUq!W|enIMt9Zo=y~<*$k|W}q31x&j(KjZm^Pzg^0lJ^=uLq(Ap!%W* zp$4M*pa-J{q4q)VqxVJatM@~#q#M04?u}uvURm#jK`*Eha!;hndJps}sFhK>qgO?( zf*OimRquvg4Yew2SM=(r)lj>j*FdeV*F>#>+8MnTYE9Hm=(Y5Y=(Y3?210GU17aQ2 z+In5oI;ic@o9RvTrg}Z(x~T2Y>!a4gyfIc9AlKI$qBg*!5oV2$8=|&FZ-&|kH3Ypm zYBSU}=q*s2qqatGiE6aaTcNeo$LOQ<(fU}_G5R>vv8W@_$D@uz9f3Xpbv){D^oghw z^hx?;q{+I0YUpNEvpxlNiar%}D)!jwH1uiuFsakgr|UyeXP{0u^qFWgP=}z;LY=A4 zMxCY4L7j~{7(EFf0Vm~X_&27MrA1275G zJ*a2LBpb4$DYGfN>8t)t z&w-j969LSMej)$Vf9apmQ}j$Gdy@q<1(Q#h{YL$z zTXZ|al*yE;+hOsy{t?4JsK518-DI*e{YCzx|J6UBr|KA)(oj=%W%__=nvOsIFi|EA z^#gjE{vQ1>Y8vW0^dqQ;QQx8;MLnYbhk6wC4f=ojYu$LGA4B^O^%eSY)MKbG(NCZr zN6kP#iFyL{1^Ow}lc>+pPothfeTIHoe~Nwv^)%`e^s}gEP#>e8Lp`gXM?Hu72>k-; zc?0bs!bQEP=>py!!bMHR(2JQKVCAA-#8lLD3H73WNiS?FVk(Y#F-!`X3Y$tG7e~FX zKfr21Qz6r3)Ju9vOiCbonhKh7B9}zHr{CApF}aLdz~pIi!6c{2NZ0e53IKQYdwMQZ z7t<9?()BBPK2v^EZcK8StjJe%tL|aSXUc;~ZcN-w9>{m}yLw*KJeatd+)b{?d68XB zZm4(AucBJ@tNLy9Yp7RIZ=qjDy{2C`^qUAbP_OHyO?6GBOr=eA&}*A&nrfleKrf3~ z8Pq!HWihLRS_8eTsXBUDQ#JJRsAWwRO!blKnW~z~Avb~=U|!$U&{PGf3UUMF%1B;V zuZU_iLh!<{5o%?0FH#J($K;3PhwP2)i{y{&X9_R{Aq64(BL^b&FpV~K zM;(RU6SW8GNc3K)JyA!X_eSl7Ivl-^X}E#d$21J=i`oZuD0)BCzNkac`=j3Y=_UNrqTcNf?Z-d$zwJmxGY8%r;(|FSa)N$yOP$!~}MW2j133Uv* zfjSv=Bl^~xGzHy^8izi`v;lo8>J-#i^r@!x=+jWA zqOL=qjyer>E&2@9>86>eGf>x{&qAGvx*B~p>MYb%=yOnKqpn0Z!qMiKVocGdC8luG z3TQ5BxM?XSG04lIWynjBmq8Jzb5Wzw=b=WJ=A+ItEkK=*x)^;S>H^d#^hnf&sEg23 zOb1PeP!FJ6P*Y4>4AT+QX44kaVRVaWKZdEO7E>B(D(XJ;G}9jRJ*K^=drirxyP-53 zlZ2WC+43%=!=|0+TTI)LwwrdK?!e?QCfndGrmg5FOvg;eO(#)Lpc?-noHG4~c*=AX z{WR(+)UW7YP2W(znZBc*F@3@G3udQHXHB2s&(ImU;F_ zrg!KUP|u^jMZbu80ric6aLM!r@iOWq)Ys_gsFzV+p{JW(qNkfO(66ATo2;l;Ojl8@ zs4vj(neLeGnyw*VMSYHb9rYUKx3O{q`MT*Q>J3b8VRj4oCh9Yj-*b$fA>K1RMZb@F z5A_N91JwJdkI^5ZJ}^B(eP~iDd1*e6>6#G|GNs1m#Ho1AVS0^_kQvCf*CJ*k&p{4H zjzFG=JRf->awPI1Q;j=U0i74mB2waDv`*CTI0jzf+|-h`ZhoS0m& zfX5WgP%3ZD&53zyhJ?7*RLTw64cQ&p1K9&PA98-={Ky56J&`?;3nCXnE`(edxd?I* zt}t$m5X5BacU(fIJa-BJw2U$;kx^ zdCby`HOOl*TZ^@|$m@{TA+JMTkGvjvJ#s8^EOIRJ2ILLM8<69WNa zZ$#dRya{;|@+Ra266baUbbOfF(_5vv!GFCkw-zJz=k`7-il&Q2dZy?`5zL{LIsK*T3Rs4W{V&x}Rej@)u{)PMt`8V=! z*U7x^!;sf+H3jv4EV2Y(-X?G0%*7X3UWjk*%3)C2uL_VYYofdSKZD z%N|%pPDHjMt9+Q}!#p46$ce~SWR)ND{Fvv*961r$imVD?UI6m~m?I}5TalF~=AM{) zVvd}MY(-WDF)x^0wuJ4&r_2?xQV}Z^vEqdlFC5{8Bajo3t;ot7b8pPOF-J~BwjwJZ z%zZHT!5lde*@~=uG55vX7jxu9WGk}r!`u&ZKg^L6{R}Js${!22V)+LIdUSh6EUJ!F>sXa&lKB@iLA`ELh_igX0D}b zAcr7_A)Aq-krR>AkgdoW$Z87qPr?2v*pD279ENO0jz&&IPD8d%N%k!#pMNSGM}*^u za2$agf*giyMvg{KL{3AtB4;40x!6A!`{!amatLx5vKcuVIT1Mx*@~QjtRk>K0{bJd zA2|d$4B3nv9btQ_KpJ4hLI$#$hXdx}fO$9oIRrTj*^C^GoQRx;Y(>sMR`aocKK9SY ze&i73Fk~}wG;$(x8nP8R16eJ={sq{-0QlMvg{KL{3AtB4;40g*ad#4p@i- zkVBBekj==^$ce~l$X4VGWEF}1k=P%J{gKJZ<@q_h3`Z@)QOj@?aw2jXvK2W4SuMv= z%W>3l9EBW$9ENO0jz&&IPD8dLXCSK;*uMh%S71MK2yz&*895p`5jhRnikz_`Ik2L9 z4(Hi`BR1fO4LAZh4B3nvjhu*_hHOR7Kvr>hggESv!+zut(<6PdinHFJPp!-) z9%MDD+a6zKcJPov{3UL1A67`b`y5^BRtfR)Q*^$%<;87}(a*Q}ieIGBtK2Gy+Z>{O zrq&QIPNsLhtS8>G%i!Qoo2D{YzLlb>Z=77N9ByU@YYqr}HT=xxbM#Ep$+929!FOa>e4(S1EviEmY-SGQa%eiA?@ zPmdKJuRtG2ju%fZLC0n!h_iaqy$fs=kH|x3Yq3LY>~Q8_)zl;z{AZ%w_v{sK|1lY# zCis5m*?#e`_jH_lia7Ig`oG3$;&FHBqmzz`)2`5KwjUSYIZd~DaLQ)Gd^wGScP{5- z!>YY>zd9GiHMY=4Mx~1ntfPO$UllvW(Alrw5c@>@TX(!8_MSppgYS#&N7JLj9>MtA z=I*e62P}Uo8v?u0p=Vx*qgvA|e!dbPtxqSEeJ4IwnU3l7QM|Px-EHm{aj&AZ{lV|z zk9p~_8NaI9KL5?_vT*Rg8UNA(bMPV z6mRH57b}uW{IwmOurIf`a6{Uyd0ugmN_5y0S3?Fr%5ac4!Cjn?k512-Ph8QNey}mW zc>b@6@*YaB>M1_@ir$=FP<-(=J-B~ianf1Z&(_|FOY+ulmzc6(@RqblO?^|Z0- zZdDm9TEId5;nl^%C(`FL)fAWMPx~*cB|Z@H?*!%Qhzr-E6H@DnLo3kxTh$kj@}So} zX&~-tFE-TRv5jO<>ce<>hIyQth>zc)SFCC(u5^kvc{LZ$+)Xz)(n6fLh923bl{hY( z9{aSlcpNq_d3w?#296UKZ$zj67%$H1{qM_b-Z>Lx zaMqO@invY|_xdwNE+|VJ|C~sFO!r-8mi2sR=nA1z#8r0EPfJV{`^C_+Uek7yXqVm7 zWPM8ygM*0i(`8Vu0i97}hInRqI?!RJc&`gRPmCJvfjtsFg>2SG#dqdY(ldu1! zk8=>~8!HX|37N+m~r62ztCJ*@M@J6oR zrR}C~s%F^UWlIim@V0J(Y}m7$PH{*SZyigIIz>-zOJ|?ES=LMX(F>Yv5hvuN-(}q@ zwtqWRF2MH!UF9s@dEqvGUN=tQpnuEla)9s5e;ZtOh(GoCcY<_!L3R2?)J|D9<)>%1 z*(GlAZHPReeV!!om@9Oc^`CdpyP}QVJRpLDn<0C6!hZC#JbT3pYSZaf`m-m!F*;e+ z{eBFV2W%g*Pu$c>zs|j1Tw@2_>k92WmrgaJ4#P>Y&)G23^4Aka&&cTGJi>!+8|lWP1Yo;;i`^@q;d_}~76$7FqUQL&*s#~qi!zMli+ z0r~};5L?sfMIY%io9Q(>PRjbqY4q$tr^NL;(XGpz7N7N@|30P5WTEHAo{{w)55n+x zhEi|3ot43ueYOF9Fq{9JxYq)@>vg(ZA3AjLd0D?ug>KN|g1AvG+R^!Tnya$zGLY`p@tXL3jeh+4zd84H8EnqO4VTW-H8O0!KZF-nX5WzY?G}1} zt()TSi|7fzXwSa1+umEUUZ66)aL8@(w`_DqsXO8=5BvQ4X7eEjRrdCg2Q0hdu58#i zhjwXmPyD(weck!KIGYze;TWCSME{=jK-TYBd&~LS1UwW+ZldSBp*<%U9IS|cBpYTl zrDu12EIwI~ZkhLq_{sZTa>7sN=(|Vh;WM7f`mSjDbd_h~9)0QGAL&;?wDacYvfj$b z!oipBFJ!RjR!@0=WVa0QjxBWC3-rcG^!XVtWqo`zx?q)8;?f1_#vkaUw>{*1%{RT4 zb@w#duj?DJ(P1G68M)rdV00)w=@dQ4>)-n1cd}kn(G~sPi{D-7&IfowPgq0OTm3=S z9}cE-w*DwCUX8Xme6rav*UHL4)k88cSG^r7CtNo4vmD^EnZ8i$i}>g``qp*2Wdk}T z;;XD5$V*SE@lE{aaW^@i(9q~)n6O-xS62HZtrqg?`)9$TkZSEgg&tH%(SM@Ky{(pbjMNU}qEe7~*bE6q_+XOnLC7oN>WIdZFeWW8DoY7g%*CC0nwU@r@q|5%|Q|X4i^y-G~0iHMI zAodV9%yg$8=Qha!`jbv_!d!#s_B-eb$LP5eXrBUhvVUbgy3it?5pcGs}Lr{IuO7`s?F%a=xX{ z>D^oDJk_(v{$``;Nk%jW$EtB~{w3}1KxeAu!~-t0l@pd+bib%uja zMY&NpK484noM_(qi`zRmdhpQAqqS#NVgg%b3W(k119 zvX5%Y3D%FHGq0s<9iz{5rcb$)lKlhS>3~rBwY7#EKXWVHViCRn2W;TWZ*(&bto2LF z3HE29(-+gJ$E(W;k{{6VQ)#0@8QDL$8eL`r?f#>h>`ysCuir!ae{WmmHAgQm~xhd3U;9INf9mJ*_sq@CzOFD@gVqs^KliPu)YG2&dZ( zrVm`9olDXYo<6ca{$8LQU(4vnLE)tw+}TM_Zb5hXNgr~gQ|kE23GSu^$O*Lh^rNwK z$!qjkFWS41pX^`q++X$=>`&KPOB-)?a**DRgLOaXy4mT#+S1J{j>}x_m`h)tL_1%h zU;ELG^2-C8U%r$JQDMF4bL;8BTj4=Wy zs@oo4{hiOj+-%(NHT~ZKN96NgU2>B@AIz0T)APH~PfOFK*VE(g$R9Xr<5T+WLfXEp z`~hWdQirZTgbx2&T0Z|(|0E8!CCZ<0YQR@|Ul+PXW%(1)9G8R6W6)!c${(rf;1Swu zG+oPH{s=aoDMcqXq?_K7KeE+_2s&w=!9l)@9Q>_Lm&hew1I!gZ$kznr(w45hfxfep zuHKf8xJBo8q}@E_i;(%@e)%G#W`@!c1L$k(X%C|S2c{<+M4p$gddj7wd=)gmHfX&+ zUDlhvoJhBNSQK}$QZruBoucSm73$jN=4N&Ntq-A#e=Z{XZ|tCryKx*ieBfY4TiV07 zo}9qhfp!{6k54WvC%ChlKHryK@R@dSqYDSrm*Y#GEF}9EjixJ(r62DV8)lDE9OU`R z4R5X$lmkiyHjop<&7$4L&~*dp7klZ`Pd#P-vM+St61sFiLpgqK-GA$&=p&yB$o}WM zZN}IChp`;Ef8vIxt?1&ujpPJZH9FUDI$=kCIl=uMbkA<|ytlMnHrl;HV>v$JP(Il| zeIWfajJ}Wv8~7Ntbm!pPb8eV_!b1*FC7Z|zc8{W;_o7pa(mU4EJ1@D*{8 zps5_+xIA666aD_Co9v&uv}tw2c9Tq>%|V=%8@~Jhvr98ML5D}Ka=?t{^qPfq?FjmO zRrq?-sJZ z*Vo*#fA%0cJ(hM)pi8x&=RBtS{>ml$Zxn1P$IsbBXX<2du(S;aIhW88ivDqt4%^}) zCphBNN>1R_p6*kRerTd!nd#BnbISha2kFlp>G_}OZuaz6qhf10;r5+52Kc>_o%H*i_e=%_Yy*GBZIaJtY(d)a?C zjXtx2KKq64QwKJ1re)o9^U9PajQxYA-*6Rdo~S&hhdiTlMf3z4D_WKhsqmvvrdbCfA^M z)u7kUlb;Ez2gB*XH*G&OR_g5r+NmUc{VF|ug#3_Mt#%BR^PNwXA4;pLmFQni^nn5N z52Ky@6kEBh;^2C${M1`DI8RS~D?b%i?f=r*D${kny2}F$m?=M2S6RE$ahK%B?rM7^ zeKC?~=4nNBYiCd8tLsn@vaTmzQSL(YCR_^4gCIuR-6wDX$Hwa)ar6Md-v8^o}rjF-c`QMR(XGFFvWjFZ7%5^5T@L zU$l>$zjaO8s|9S}50a&`<<%|qWg<81z96rDsU->Yj=Xe^t8{o5d9_US*89o{Yi^L2 z*Hlae`gF!Exk=Y|q=UWbSu^QbW8~#J)nHfO>Uex*-jX7(@2N+3xM7Eh?vS~kJV0ba zc|A~V_M@9FxF!!^?M7!@krx=%t#G=B2Yql4eXyInAgM;*r{8V3BF8&B^*7`J{=AS^ zIMpQo{^FMv=;PgJ%LsWzRK1!*_ueNjp{kcj^!s1(6016Phi+e!9_tV$=Zl?jK_1Y- zn?7+$UcyyFIvN~Y%*sL1G6HIT&}6EdGEE?T5UKuZ+95{|%~eaKto79$@Wc z`F8-yC`0#7OOq>hYf0-mJ$notUOQFRudJe9Pq&D_9i;<~r-;A4pgTK=4Rta5V0pmM z28U$BRDZhRoP*-5o#=e04~U1G>9bkrU2$~V#`|Uc^yz==bN7i4y`>ACO%~6}JwzU_ zle5hRe*7NH!H_0{ewcHp zJYd4&l`h8fe_{kyK zZ_|45@H=$3C+o!5f79cO&~Bb14J;!hWg1GA2j3s_i~zEy_4+c`?s+clsK zx220@u(>w})zTxy*Qe4Av(b0g(7_EC%KD*0wCnT*;^8;wdzSfP?F$|8eV(|V%V@cv zQhxNN3Sz??H#kBzq&4D(YzcG4JNnSQ9)*j?O{LcrpgmU8r`pYt^{D;ywaD4xCs*jJ zXJ(1BzoU~g(K(&Q;DYe=e@^w8vf*WM+d!G?jhi7}U4wqMYr42pCwk1QY2t`c^!wuU zi3N1WZc}CbRsy|t=@jwtqx8c|X7QXmuz?43bmE}cS8k{@d$Md;nq#b7koS*?;wPnP zZQum4V{LlVopEBj&UD%4W5w4;($mvMi)YNEw|bA_@$vlkzvh(nBV^Fi!VRl(4Hw5; zr8`d_Dvo_azyCB?Jj;HZTwu4}gT%Ex=~(Lk@l}8NLftTNt)}#;J^jQpdX3}P|JdSv zWw3SvH#CjzEsk15-?Zx`?wUZ?9oa*yrO|UAg^DL!rQ=(56Q6rUuRYvF{8b+>7i@TS z7Jqj$IH<6uqYN%rpigG)Af8@_E;F&6*tz4s6J&&l2MwX)+qV(NPp7vWZzbNlj9%c^ zQoL##-D-VvacAQw2j8+clflPp^w>#F#NA)f_c9uZH>nBo3|!hb6d%t`2OO&}K3IzO z_o*kIRfTq4Q%78`1%1`2w%ADM$-$tpHD&N?H2v{$b#cjXx>d_+;xen~6)9E3c01_g z(v`(~j?n)_2aBs&=}lUYc=a=S;-CPV4R!T92PJR#$%dy+6Xh9ht>Y^`SAZ_P!&@9t zkshDVOI)}nZJAj?Jiis4{=S?zy(fLMb6N4*k@VpcrC|gA`h5lmi+xJThAm6zTB}Nk zn{A}64#mYMlIa%1i;CS&(mQS!7T35=|EgC=T>Uv+Xs4$*&o??aUjcsoKk6_^p0V$Y ze6pc|EA95yUA&m=MqoqLFfFNQ=DxW-M(Lr zYIy$mZ&nx_EWMOXHte29@2`|qe0l|aI@U>?oIqQgvxp}q)5}LWid~P<-S66q!!OhB z^)rdD+@q7XoA~wr(<=_@y6Ljv^>=!kS&0wYPnP$P>*e3JU!hVxa?$(O{}A6RNEaRP zRqR)e?q2(oxLXiy(Emk8LwqfxdjJJk}|}vI?p!CCq6@Bx_pGKr8eOi)pnd`e+sa)MZ%?8t{gmH|Q*Tq~ z-KS2=y2DBOZOjSr=Sy_SKL3di+@gK`4vRyc&}DRs_~aYf_;TTZ403(rV9BavG5-6q z@-7b=uv=U<3%xmLr}&2pozs4scx^tqO1ka8FOUC>K{0y3+Ku9&<>;YvI;i@JFFIutV6#~UoI}je=A}RUmGJ%Xw7w(L5sx>o#^?&k>W}{=&PCLi|hUS zUbEQcaB<0@wsm~{Z?<}t4DOBQ0Yk#3i-%022M0_MTc^=m>?VqHh0`G`M~O==q`&wM z5xXp*Tb}7BPG3Ry?a@O#a2<@#Kl9S>on&w;o*QN^3=tRELXRlfTwHx8UC`1%?7NrV z(59C7?*Tf;%gW-lsr1At{$jWP=mgh_;(jOj`@iN@TT97c{#kC=Q@eD8BWPPE1-QKKz*;e`le1(${|% zFx+9f407;yzRl%&3>J^)?}VGr>}exD_>(87?^s!U`4_#RQ(^Jp-}HcO4&s@A=m7n; z?U&S5k-zk?jhn=ajemn8%fe)E_n)ghF^T{DbK&tXf^oe0^Is#?cA{BXqU5*akN&fN zRWI9qbHD$skDV)i^oRR9rCY=S|Lju!gV^Zyn;R}3b+KKsx!W(=Jgl79|0kW>v!3|T zcRI_NZsNY*=+0xtiI04tt1p@({`85i)^CaU_XoOHwOE@C^PP7bc;((98y3BxJu?o8 z3%;V?r=Ai|e?hN{zACmnrOOX^B);&74yo}@yzf4JEzfW9m^*Zb&vv*e@%f+iCI^?g zIoa+~^Z2W@%julrl*@EyKR5BU^Yon6p5l|I>Gh7q#gWHpV|ZDy*AcqgZEta03SF;W z5P$#o{XP!PZm%XA^6aMDxz`nE-%hWY+F1M`fj;%JrFixR+Bu}X*kKKw!_rmUc^Q47 zL~rq&D0;@g*fq;LiAJ3;IGNQaOEJyZ;Nd3$xe^%yItJUp0-=Q zOI-i=Wcf6lc6N_A&nNoHpMBy38MKG@A+g^Bx@FH)@vLifMUKfW@)H}U(dH2%A*;$V$-_xUSs|7ntZ2;#jo+usq*&7RTaPs-mR&G~QAi@Vv$ zdfHj~%NO}esJTk2&A9)|%y*Ct3wClt&*GWI2V&`ghvaX$<^$36kk-z!9yROV{tWqB zvbokcy3&;FvVJOze&;HG?KYR}Ovh|Cp5WRkM z8CmbyncnXt-wJOY+UMw^JLH>D^QHp^2VQk5$%ZEzY4_{$-K_b?V*1{I zsB!RU#r=!ZSq{oiOw5zB z)BT%tlJ&6fIZg9`zv%#@Bzx+#FPyI#4!L z`88Iq_+HMz;`)#2?(2q#%bcYTdJPjlNupn+%1_PAV^`3hn~jw9hg0c?cSebehtX>X zj^XeBRBy>ajh|y>gKyBk4Rgkee|yqzT_=jyWuookCyDdF8Y36{$ydIcHV?T>KL|C; z`tp7Bu98#4t5?$l-b|@x*#2M`JDmg9JyT^v`7kW`)fLnCw+2fl&ps;y1y}cu?(g?94S}yyHd2+ z{2x8+FC7w3pFO%n*6n7~S!TzG=k}-lnk*H+Xhb*4u}oZ~99`=Q?VXi2N-SM28}hvw zAs6tv(+ct3^Yqe!E5&2B(|(WWmka2v@vCG#a478(wp!e!1>LUv8gWN2dfq$QJBQd% zu}N!X!-KcO#sM^hngG}Z=FO( zX8BKC-)PH0t&<$=uR!0LaZENiIM7XM9~W1=H$Wb6l{z8zN~WzTw9^9m#rTu5p4NxH zA9zaKq8h#P6Kx#K!$IiI)3V{ut1x+hPlL{g^Z!TpD|1$ydj-A!DgA61{cQa?S&wQ! z|LA(2#}}mUdR!1s{M=v8zvHUdFz-9VLHk7)WyAS(^y8+N#FjC1lgyXJ;Z5m?|L6)u z>Agm}tZ)C;Paa@*r7L2`^YpUMbk$foWQP^&`1;>;EC+AGuF3&{P3hjnuZe#ZruW~Y zSAOX$5Ab~1by?4QhW^(2hB#~uosspXc=-r=>j^rxKHXu;Eq?uH@p z2dMvvesF}Ixb=>#w_8F-_qi*M?@vb*yeGa~h3q90l)r_ z+QY#|?V)UNo=y84peJ>tTMd6C>u1W*^~yXJfBe%+PU!KF{(6xy%*QnO5fZ=@0m#7Ho`v022&Fbb`|_6E}xI?euehR2$d7QpZ!VJbL^)( zRQ)VIJ&RuXo(^qGABg)R>*>YlEgim!i+=1T=QD<8{U(D}hdIy=)9n_}(?@=n^~zo7 z3nhPuf0m&?-K1l_b>#)l`zh;LkJIOB{1S&o(Gx$?k)dKk{fYZ68&;O*hR*H(h-d!j zA}5@i<*&HW33|yP`gIf?7^te_YnZuTDDAe8K2nap`<(vzt+SkOQB6(uJ07#yz<)`4 zIS1bsa>Kq4^s&x#>BhPoFt`*wE0%u$u@g>!|E&2>x>YLe*v2IL|DWRS11zeeZR7Y+ zQB*8J5gP(3B6f|vBK8uo5GD2=dv8&cIbv_v(Zo)I1zRkMidci)*bDa9utc#ND}FQ2 z{qQEv=Vk#Ryw`hO$$!qAnX}989;4uI`ed}n8gyuLbSWDfI=;kJwvY=HYJ-8nf3~6p zZ8xI}{E9wlmzqx4Xrd={Mmse`yKhH#$%bB^B@NA=bgd<=m#-)HDs;debhkk*asNM( z!}YzsdGv2ZGSK{p7}1;-SUDO4&Gw^*pGWVWhAvesBb{K^9DODLUD^rVF%n(==GU}d zWU)*%-zgMbW(@jjfAok*v=HSnu(DWYI^pemA6g(H0PP!r{_Q+^#$@!mqF>Pb>wg5FOGTUF%P8IzMc?YI*+;TZe%SnX=Of zUkpS~?}+v)i*C6Y?enS;Es)MO2hFd&9lf|EI-5V*X$|_f>ga$NbkkJm<4tmUs`tOS zW8YV_VCo;`fb4V=(Jn90Up7Fy)y+l6t7brF{2pEKSVKDh%6;^s>FBvta?|{vrsy(( z=sa1`Vb^kd3bo?8TEJ!-CUjhYo|4XmPB2@eV_KpEa-*AtqB~ux zOXml^LFZq9-q666&fnJxz2ygVom}XU`vL|BetpJ^WsV2J9G<1g)XtCxJ2KMi)K?__eg8nI{63tI_9z9?y`c2*vG(Y#iO1p%5#20#FU~Lgh2-<>nx?PbLsGPDSoiJcA zdiPi85MOlBdFY*AphsLsZ#`6j&JQh8iq4-MfZj6%-K=s2K@+y^!oZ7X<*8?-`;t!h zZVkGr5BfqE^s9yFe0k9RQE2b8<>>sV5~b<u?xM{K<~FLNAu^2 zEv0FJ=*Af6(ii<^9y)6Q^u257<(Iys`P&MXrv;p5q5Jeh53Yx{*@9jlQ;O#M$DmJa zMn~4JKnYQVS#65d+8eV#4Di#c6?3wJ?m=+l$fysh(hhOMkRixvI24Avbh8KeR(+5t`p| zH~Q8Tbgk6YX#PS^beaa}^3Mv>{Ln!3rse3;r)3NIqH%16fgiGa(gJNWqUGPZMLlVE zAzC2wQuMq*=sdU3Gu+W>J*w0E-WNP*{^?$5_o?Xd>(NK6p&g!8_Y~??>-(f2oiMhX z7cH>=NA#KDXonVPyB+AS(xRP>8Z^IWm^+ zxj4GiP4tzkt~CFM$X}NhxEF|lx?Rv$tD%?vgx((QLML3fh4x#Fe&$w>&d=+Oe$)lM z_PsOBKll^cc`bVEE%dN9XyNQupBC6=hk>BZ=o?{qXn_a8=*KHr5$N-8veSH@6y9{c+e&nmYUq~D(KdeQp()X!ThJrcJJS8%Eb$xzJ=(|t zc{7<=vN0`KE*<(pZ}jtDveEHZE73un(64Wy3uH#0b!|fD&)x1o^XIfdKktSvHXmKq z!C{wB8?HQ!feyQ~(g`UuH>CxJ_C}X)fbN$A?L7|NJR%Ft_u7qi?T^m#7JWW9dQaJA zwBC0I>}h_Z{^)lD?F9{lg<_z$GbY&FM*nu`3p!rZ#fKKK8G9g08#L z(g}xpqHA_pqIKsSDdF3}i0#G|!bPZ&m} zzf#c&!`i9=!zi!>-DVcrrY<_i0rc_clr(?CTeN==x=_hBbiQ*nv|kr==sTODZ8Ux3!}{i=w`tmcB;4Wm1F4Ik7KCq zQ?{e^GFC(9FNQQgn3tG_069WZ{cAzdWF5Lb(2aMaefvJA<2|3C4{du!-63B`TF*8$x~vbnNRy{@{Q4My0rv$@u)t>Y zi`$Q>PuxO(UlN@qTPIpDuiqm&Uc5Hi+!sylJ_NlkGy3gM=v^%z((%wU=v6;Hpe`$H zI@5yvAO1-LKa@tNEsws^2|dQVPsiWPM4vl!kNW9uv~5;OWuHh1axVCOEh{^OtS zP{(|Q4t*F!ExPz&plUe`EMJBG+5a|8*mEA8>cB1Pt*N`xf<-c;CznPS_Pt5RD|AGs zTXF;E2ci!~U8i;nM|UnxEzFMhFtBgPA2h+=@mty;$Bt{%18Smc*`TZUN7re1m5x7H zh%Pki3U&WO=zEcusZYE>k8?rWgfgQD}E(Zl>B>3FL5Xs?L#)a^XF(+2m`p=bM`yEQ&X$3y(lhv%H#DfgGi+$s#%UOYn+ znx8=zbwNLmK|6FgO~(fo>OmVkUU`aozYlu(!;{o6Mxi~wM8~W^|2*^r9lv=J{UPl5 zPPxBf2EWBX$q&b9LZt#dX@iP2(d)g@#U}ht$KMP?M;|^)U0@k{aVE6;VYGX*BXm5~ zGj!nG!_?by_oDSLMjjG0P`?%iQaK%>-rO6VuKhvk*K^R1mK~tZu>-yJ)_!XH+vw&6 z(NP(C(*{?2?4#qe%b@G8iJ;Ee1}(qW{5KjHF$M!+CDFfxqW28kOUDnNM6cVthkENP z^zfIvsZEzYv|+vq==^oi>xb{6<4by@b8O#9{c;w%lX$m-1`2M&z`UyH64%gc{KM&Z zmehS|gP(S7r#@B~J-|SJ+XP+AD~yhx9fICBdKQ<}JUM0~* zj-X5ST|vjsK0w>9Sx)VnX&~qKWg6O+V&{w+rM8{taKvxg`k^1T^ z^z>`N)QdKu_c)=;pFv-1xr~mlc#ggvw3PaZ!yw%Mcb#5B1CC_}(FIKZ0-dEfx=y3T zbUbP>`u3zn)U)THefBS;cG`^Iof7SL8lA~=0Uh7;6kXHr2kHp>!MOjo-10pQtSdQ~ zE};Fh`PBUzqrFR@)AvQ^>@|;$i>c@{%Y&$ohN1`Em`nZmAo@cd^us80&z5uOc!Z4@ zLL2U%Gn)nm&-!WiYZ30bbeHVRx*m&xmsfN)7E!r@S+S?gj|Ie}187iW0 zx}lf(pxd<@L&v}9i#{|jfZBH=+U?|M)xsPSjDc?HX~66ij-FW4q!TKiLwmjUr@rwB z-Kf_n>W=BYqYEr_#gBSxKJ;bp5!81oqX+E%jyn2l^!ZZ5WXt>i?|m?k`NttNVcdAM zyTf2=hb8EA;|5ZX+=7mL(Vu$zadfY5`%$01gMM2|pPkBGv62yR0Y*1tp7v~Nuvo@E4G@mbN5dYK2hS+p;8+iK{AZCX%2^+8`a z{55sE9_Z^8e5ix{(UHrW3L4lk8v`pGnow_8iS`ZfruN%`zV_%V>O7~=b=x+io)?8) zbhtkC-8blv^7W{*X7-~8@XJqis2%d7m)eWkH1MDt2KxEeq+ZYf?eM1;b^dnf#lF?4 z0|uZoMpUETIu_ljWL4_@^U&iKR;FGPivA&OCF&kK(54t%fd*oZW1ztw<*0k!K-+y) zmU``Tbnuqa)Q8fHq(@XR|CiL;bD&2CmZTn682#Jp;?(X{(9vCrQ7>+U7B(k}&_HxM z3|y*InA)*FdP9f@b+*yyfnOA)zCRP4#;*YN{9tt8?flevHlg1&&PP4`H*~WwSL!vV zsfFR^=0XEoZ(_o-z&zCRpP}cy%1zxY)hK$zqEjyFn_1BHkLI9mm=B%0Tz2ZorO<1Z zWTReM9qp0MfqGhF)k6ODdjqr3fKNM2cys9s>ge8R&)S)(JNluUt;2ChaUIb zp!Rx+-oGtohg`;VO65<_(7?%WsgGqwpKtYw+SdtPrpOEGEgt@!YJa2a+b1*-T?P{d zABm=ZR~_xO;7{u7U!gzryi2|K8}yP&x2a2YK}V*$LA|ga+T+4i>MJAA->keu{c@Z? z?*CnfMbbdj3`{6m=PdQw1?a~Pr>Gk)N6)``jC$wK=o}l5P^aIHZf72(F18On)_Whd z`*HLVr@hpFMG6dzyT6kLmfS#h+q#`P&jWO^@mr|}y+EJw`GtCE4B9L2M(Q7J@qm7f zUPnFZ3v}A>)zrmvqTfwiNxenn#X!y$AvBP^FxokPFmQM zv@P|8CFrnDzSLibpx3`{LcJmsJ#9t<>f`ItkKAjaH>1bys7f8O4gJQayli>@_t}X7 zpZg_g!uh@Enr30@(g)D}9o?wA9zhpclZU#`akOKN?9`1;qgS8*g4*UhdPtx2)H5!k zv!t@wq2B-I^D7wGQSxoLdLNg#j^5Ndn!5Te^!V}DsSDjfm)>xO`rbWs_{9U%{twVD zskc-A8I2xYVjXn}{FJ=0s^zk9_5L>-;K$^R>SN~6gv$6ad85+W3Dl|n!UCPw4WSNx zg??kSq0asWJ@)Gw)LrmX^2Yw<9@G=?Q}RZ|H<_qMC&E2lw|yn*F|3v)|`y_Iro8*zfX1 z?ia-nX->^@M53em|qx?|-atq6*Rl@21)B zKe7ED!S;KEX1^cQ?DtiuWUejlsZ?{=SQzgJ@W-BHr- zYJVfK?e|8S{eE1t->buZSM)pX|Fhz0zrWS&_s3T3_dv~lFHiQnqTdDnL}ITM`+fFj z+V80}`~9l2-{mK7A(24)y$;*&^Voh5*6jDIn*IL%6ZX5h01<1yKh*5^aLs-nl*smb z>ly3RGa$@Z`@L7w_4Jg))qa1V+3yoH`#l}o??cbv4<7%&{k~c5C-47F*nW@H?DyMj zzt5-M{%-{t$yjH~^g>tr}RL$UVz8!PsEH@4sVu>F3Q?RQ(Y z-@lUdyL$hdmhAU%&3-?`_WL8Y-#2Ua`^fm&?}~oM{Xf=z@21)Ba}wEppUn1qXR_ZF z{VtBuQyOc(m(%R`_H4fwVf($kX1~{A`@LaSe20T>zprNd{nRdehlK~*?^oxd#|q7U z-_Q2@7`ET9u>J0A!G2%O_WMl>_WPrMvESvF-VpJ%-^1c*zfZSpzk90vjhveO?xET5 zSvC9pGTZMNOXB-_Mzj5%HWm7f75jZE+wXb&)b}09*Z*R+-^a53K8fx318l!Hvtqvw z((L!6Y`=H3V83UKwci!}uHJud*?ynN_InuH@9Wuq_tot8!)(9%dE~|lw-$z)m-yPY0cl+3WSM)pX|GNGDgBANdQnTN8v;Dp;UiQ19 z-$i@*A~1{{Y`_2IjZSR)J(Xs^dno%|e)7H%Y`+&_`+d{awsb-MO$_xv)3E*C=y(gdz(Q=lx0{F7?f2qr zzdIDfaclPb6iL6!{S7l@RCC%ux8FnAez(nlV?e}VIzxN~iUD59%i(1J1uk80VY`_1m z?05OUVj_X|dnDWMwb*{2;MkZJ)a~~g?%C-9ici?@>H@?Cw%=bQ(0;$e_Iney-%GIl zeunM$)?qp60xJA}`(2Go|Idp3o|El&zwn0i2zC3tb4YI5Ad>C(>lWR`wev0k)Dw_R%obC4z3-rW$bMJ!yQra_TEm+CzKren3~ayG)a>`8Y`^!kV84(1l>IJ0cjk&jvfqoa z{hs4ZHF`k0{a%{w_e=wDT-opPahu}5vfpC{6{8LFvHd<`7qu`)CY$|UQeKd}|0mRb z-_G{?7z_6Mwlk&Z5ofeuzt>XqyO3W4SGM1;vi&}a?e{ipzwcoCJ)G_LYiz%Nm{yuL zxcyx@^-m+d_WP3!WpMvLo<#P0uP$_9=Fv~v?}~oM{Xf=zcTQsay$jp#EA8k@Bk6Zh zk)Fc1+V4SZzo$tI`(1v?o{LVE=>n3Y8zKQMkHF31xtF!(7 z^kNQrz{-A?UwKnlvfr1p{r(Nx@8j8iU(EJG#+ce%e|TC(3Kv;BT8k?i*Y6X-W4 z%%!m375$F;|9@q_4`=(m7TNEH(SC%W-}^BKFHfsp9RIETF8BLhB(eQIt~dSmn_21; z_Pct(BJ(*+c%DG}eHh#C0T%4{Z`gis@c-?1^^6N6bZA@kFJ?H~?|ImMk4z%_{f|rS zXusfRZ|Tqf65W1Z#P<6s3-$CkX;%UDxXZw8v+wWT~*zZ%> ze(x^nceQ`K?e{5czo)QZzi(js{no$R?}~n>KmRjy`@I(1?@>u)zn>%f-7rTs5VzIu z!&|lAi?jWHn(g=1Y`?FwV82&n`~BX(+3)g2KVKx0{T{^j`|t6v-{s>rMRM8i8SUs# zK!y31?e~#vzemT@et&GmeqXBD@B98|zpFp8mG}Rn$z{JQ`dz;N%vk&VJGS48S+L(r zvi%;w_WLQe-%}>ge!nK^clG`^wh`;$-_`ps)_$Lm$o6|6+wT|I ze!r>N?}~m``x|k!-#yuW-w{qfv~Ff$`+X4G@0a6ezbpD3_y2_2?+4g^pTqY1>3G@i zihdX4>1|-ie!pkMet)Rh@6F?5zsq+`T9J(QyZp+V!jk{WOxtepmFnNJjfze(uZ{$!NdJC*BmvXuqou zK9QXEySxB-|4%mi{e!&u$@ia`T=skW_hJ{l|C7mnSM9cY6OP)PDc=^X+%_(J##8vfp2(Q1rWe|0mRbpJl~bz@7Z4y6*6jD97VLLdn~`+ysH55Mp_={v z+M@mLC(oC!e{1%8R3h8&`C{#NMZe4ajik2UUs$l;75%REH$K;X&!*Y${o`i8EBYO` z-^8-t{n>u+5-0mz(eGlod=VIiZol72p#46K?e~<82h-=uO}5`Je9C^8pF5tS>34Ji z$zi|C$88GTelN=QdnnuQTN@9f3-m~Q`Q2uIP8UzhQo^{a%jkcSpA0+pzuKhVA#3Y`@R^*nU^^ zJAVH654PWf*?#ZI_Pc))+3(%Rem9Ku2gP!FpIWouTe1CqCV}?*NVeZ+{?mS!PyIWg z+3yWB`+ay4+3%~R{Vw-6gpU>bJ(C6d{Sn*m&8^t)Zkql62ixyQ!uqNU5QeZ|zx%NL z-jVJ1D{Q}qu>D@0?e`P$wBM(&{oZt1A9(@t^-IbD|A}qCN3s3>%BubT0Qdj++V75RzeltE{*vwYcJZ~}75y&Xe`b8` z_snd+w~nLzewOX`A2s`3(eLX0ZzhxduIP8%|E<~Y4cUI5m8kZ+qTfXdPxTDw_Im`| z??sZ*ewP~;5^=QOH?aLaF^=~8WVYX3*?ynM_WRg>*zaw_v~fEBamTZ-iQ~ z-&?T#zAusNcNezb2eSRH=y$ch5o^EaX8XOK1^ay_+wb9VwBKv8{l4qd_Pg12dK29L z8zz$d{#WP5@@p!8uHS^=eNjT}clo)q zLs+rjOSAo+--7+_&i4CNw%;GK{XQoS_Pczd34BKy4|+waYE`(4rRLVgXb+3&O2elKjne*cc`_YoHC_ls=5 zcV_#&Birw*CH*e9WfX}tx)3E)1IbQa= zqTfYfx`3%{zmKwDzvq5ib(g$QBi4Q|YsG#~&-Qz>f3x4^dN)NJ?e}SHzYk*jeFNL? zd*f)o5B!Avt{#wxwcpoRvEK(Su1L?ot_0fev)F#$`?vkB))Pjo{r;To_t{Bgzc*z2 zy~F?P_pPt!jHCVDf$jG~pS0f<{Vs~`QqMqQ+3yS3eoxExdj+=NR|n#+ z-T26Umm50@&3Oq1*30*nV%ANcQ_LY`>S(?RQ1L%l(b` z+V3OSet+&(Pd$Z(HT&I_?e{U7{jTVDwZCD_et*RFdx1FG@4|}xz8Utr>Fd;x?*B&e z*zbyd7xZKBhHk$H>tBRQ7v0EB1TTkxcRej}*zXlI`+Yv!@ADF5zbpD(q@oQI%YM(p_WMY--&bk&yYoNoclk(1 ziDb0j<^J;ff2`Q=bJ>1RW3=~FCyZnJy~pRkLJIot1DCH=1UH!89HzQTh2p2CX#?!oqZMGN-({!iQQ zihjraU$@_Lvi&}g?e{wIwBPTt{eF_|_X%vjr)T^94cYICeiz;3i@-4AYrhX+``w1^ zcTcw8+k14U^`h8*pYw0_yZoS=F4%rgYsG%gYQ=tEVa0x5ui5YKrTs1+w<%)n_tKjE zUO}_p3$gwFmhJb)Y`?o%u;25t{cgkd`&72y!`Obm8hJ=vfG}h2_mrCbo|^6VH*CL0 zTe07pvHgB0&i4Cn@&e@jKh}QV%=Y`QY`^c-?Dw@+?DxEEzq_&h{ia_f^)>t2)+xkI?M*VQjyDc;BDirfFY` z)pSCv{XUlM_xEhSpZrYwz1Y9m@A9dS5NyA1Wc$6P75lvg+wWJ{exJtn`(g|B`$e|j zSF-(n;~)0B+}{w^?DyK5{eH`e{k~JP-|Z~h@9Ik+3}3e2*R%cJPP5+|vi)vn!G1r* z_WKdG-v?W<-+TSfepf%lE?@t;{hpTX_cv_6m$72Mds(sH?`Zb>qFDP~(eHA9Bfj?g zY%BJATFriUVf+1{X1^=?UF~nA(d_p~w%>aslKp;|?e`WR+wY2g$Nk@${a%CZ_nQ{% z_rjX}ekD%!yQ1I4ck)GG7`pvlK(pV|YWDkiEB5;%EB1R&WxvZ$-hzVd_aU17-XW3g z_wU($&&~GxTxq|n3lIsl-y5_2-p+#keo?dEuWI)Dh2>4v1qd^)_WNbcey<%*`+Y0h z?^)S?Ut+K5cX|J}WWQ(A?DvJ5{hmp)-#c5e-xp~1`zS@f%lDrdYrogm?DzDV{l1Fr z_k(P|yKDCQ2+e-q%l3Ogw%?zy{l0|l_mq-;SMPt*lKuX(X217i`~6S0-)%JeeVS&! zztQY>?~m{9n*DBS_Iq8;eov#>@1dIgUXbngK(gNz{Vw8Xzc;aB zzjxE@_on}5zssjSQfT)3=y=-i`!xH#zh=Lm`xpCN?r(^0n*Badv)`+0_Ir$Gzc1A6 z_luhSUQn~&oBwUUt505G==OUF&3=#8?Dqwl{hm#;-&<<-`)JL6U-&=!-CtgSeEpBs z?DyXBwBJ27`+XDJ@BVDR+iLdv`&j!uue|xG_g{9+e$S=Z?;jq0Y`?G5?DsBgzrSMp z{X_GQ?f3DT{eGD3cSXOe{f&H@{a#nI-|K1idwb1(57+GX8Jhk6KJ~};`!v|^ihjra z|AuD2yK46P7R`QNsoC#iHT(Us75n`!vfqh*#|3z6_Iq8;e($E)??pBHJ%?t$uhs1L zKAQb*r|ft6$@^Te{k~1J-#2RZ`vlE?FQeJ-J2d;ffM&n<*6jDi(tcMLFgVtJucq1W bIim0fp#f4um~_qy&oImslM$z+o3#*FWNIVmb{=k5(F3mnH?ZsEWc zy}K#zF^d9zK>>lGexV_Ot-Rg(wU6xH(Jib+EN^L_Xl~hz4+#kI4+-)Q2-XA!`T7M1 zdHeeK`Go`o2Kxnv1O*2Mg!=o2BIg?r5E2~hOVYuCexae7SXW)a#C5qMtK|y{2=EIH z3J3}g3ib2#_YY2VZnQL)Wr$y3V1QppuzyJ6k+xe!v3>t`iNiWHvvm&+2=>L=P#j;f zF<%5hp&`B+h$g@{&{q=>5c~Ew*Mh#-3i%5O4)qQ2_x1G)^7iwN?c-B0vHXzIPL{#g zUSL27HW52yj*}(Xx_@Y(pT8z{$sD)l0c3wQetvv$&`=-*M<}{)WY2!xBcr2w^~7-s^a%(J@bwK2@DB_L*7ybo$2!N^TKQ{yeFL!{ zexVxdM{sQUxCq`ic0`>!K$rsdj`AIGkV>*en2?bbUox{F(w+rW-dox4Q$a~n1c z+vpkD11G_)L7)DSePdV0Iq?3mZRZx_17aV>m5x>7D)E6d4nkb1i1!e;evv(TckkHO zEzA$)i|pIEW3*e?5VxMaI$$jtKWw-dwr0-(<@HKwsa)F>_B`cJvPo@pkJGIS2>Q&(9~+pPWKXfClx-ca;J(e!lv8cD$>8=^)-se`pZjN$)q9m-G7J>>1ap@z>uN#Fx^a zs>-{HA-=)%2SPw-ET7@x;Qw{00H1(A{E;7(6aszq)B9olSgSJ$PI)50cH9g2_y(em zfBP5Mime)p@xkBxhOhF!Aoj*{7yWKm-h~g;^SSvVNzsG(Pwk~3G$H+fE4*y)=Zgm9 z?bdE^bjLcKI`t!G&@U(mRZ>5F3GZ!37R){ul`d4zkLF7jLNh{5`r~gyG#b5M0`G0B z$v#ID9H{Zt=TGOoO@oNn=!;zC9qrIKzF#uPANzioceeHaZu4kD0eb!r?^H0`&w_n% z#Rz5_ARfDzU*QXXR}eBU^nc4~e6buU6!MyYVEv7FzNDES34%3WXN2M)3)lEMxqVSP z{D-v~<~qN>-PktQcuWE&5tD?;1d}NyGfd`~EHGJO%7rO6raYMPVzR=N4^w_j)|hNC z6~I&wlP#t~No}s#)$6b9UZgFDt0uR@*+i{oOTDhvuRo@}=tDR?J`4Z&r(YF@I-wiu(K>Ehv}f zc0`@NfcfZ@GwR4{%rBgCSuOL3?f~bu@unIyhWS%w_tX*B6t)MabPrS?59+y2V>8s9 zo7moHHr!QRD=}X^_f6I61}!xgz2y>C#QYS)X|-Gs^L-*x)tgT=^hms}mZJWi$oz|} z&1!US>UHT|7OGckvV4fLVT>AIiOtxus)gFG2lLKpPU^Tr%*%O?81j{38|ZC4%5ZQv z^H;6>41t%K4|6}6Y%FNNM*rlxJ6NH0n!Ve{YuJvJ=z6h?btc>4kTHeAO)iI*Q^+|U zvpKTN@?PwGZyIrUS73g23QpVYOg7e!W}$(GwmXe`IYF(PM!n9rmtKt%**UIUWQF>) z3iC6cZcAxvAt@YzRW+_ zXHbu9W#=ru(sniIDa${qy-D>f&I;`mwOnvz0p`@x3O?R8ge*^eaSQ5oq=HvbuCmgR8h$X5c~Zkm4QHOz@YfN{lNvtjB`Gz> zks3Z`5%Z*m%jKCTH9Yh(-5HM5@X0R z(93>wW2A;xn#eq<;dd)CPipuP3+71;A9T={9u-olQ=1C2=xXP9% zHGGaIErgEL@btONqlT*j$4&>S;Qd>%!jTHz;1E38pN`b<6S>&=BQ-p<5-TaG;UyL3 zNey>j$~>vzw(HsQw4mEd(9_iD)*ZFs7mq5UyH?bj=850pMZNAa7o(o6&%9OTIjWL6 zg9RfStyCA>XWk<$QGHvd6g@R-YVT65R#49+HdfVhuUWolrm8wN^r6eRC+<=ooMisI zWuiJeq%_UHh*_ncdP6-Ie(i+nu4nnTQ5RK5GwKyxX3aZl{CxJ~WnD5bKR%->JDsLtBX3f=eK5%tBFy%hLOs&VhhQQ806gC2>P-IgiI z)rwMIJ@;NUxthX)8IP0I(DB9S4B~T7q+YjS^HYOi3G*#(uQAA1nBUu@zM-#%u2h%T z;Yf1$7Up-COW5_Gt|#65?S0RbaWe6uexrwVc)?}Nr_bce#8fFx^S;XIkmPxBG~oQr z*M9Y{KAthG3ug=I*6lQ0-^6~r?)XB(C@<#E#7{R|*vK|kvHC2-qn6B@M+oC`H|HtuUQ&s(n}0w6OzSY1H&}>hpB! zb+uRSP_MOR%e=X8NIiC#`IPi@wMPNAqK0?ws@pWwbDcZAP>0uH`9r~<)TlwlgY+mvZZY^4{bIj8K@FrVjX(UkG?Ss_kTE}n8I!=4sYCznj= zW5;~@oDwOn?d)hitCwfWrXz)@?tR(%#NhC$(q(R{8{WQ&vH`;n?#1)XtljSIh?2R_jb>L8ZeUYLkV`#~*)fh`Yr6 z`5sFRKIPep4k)39J*muB?H`-Gwg=nr<6O33_w3n`@EB(m-YJp!`)&B}0UCC+=5Dbl zQ*uA^aWe}huN~^ZuK!$q-q5-dJM1If#u`>1q@FuGKs9)p(n>_?sZO?Jm5%tW=h%6j z+|ON2UB@b#?V>K~*hD z+h35>Aa~}q5%%gJ59+z|*NUq?8hCR3uUj)*o!5mew7+lzH71eyYA?E|mCLgYKOQtn zl`UyOxf5?<)uVk`zI>c%O8Jq@w|HrpGG-a``r~<13a2yQ^L_r5A%)mZc5PH3rEq)Z zgLV{5QD&ZC!OYhMQ=SE~LnH(jNQocB{JRbLQ--c%eoN)NDQ>5jzvg0@a{W5b=~i?yPA$&vdw$75`d$$gwvB0H~Spt7MdJz6?)AE&*~JQ=7M z>j$}w>pI=ImlM?H3DncuxTP1FC%18Loym4_{U`TvR&7`z$bH=*-7k_k=r==Aj^~6I6saRl-$M@FUmZ*jdN5=(|{xQ zaWB)%=qZ?@_etr}$@Dva?C8(ysl=ALt*canv>;qF7XAzFRZYj zzund%qm16ylKPXkj)X;QVE)6ItX-|$a?!kEov=K4@^}_>h%8`ed7Jq+4cZ%8`{$+$ z#VlH6@aV_<`irLxRaP+H%i2tBaD@3??w;z^8_Yj4sjfE6pk7xvLZ|Y3m>+3asCF5_ zmKk?vv--G1Zg&0Okg;ENnMpUS+kY!vos^pu!uQGzl}liyZaVv}dP&Q?zb->9xSsB% zZss(MY#fx;ysl4-YB(w|zehLQaAFcq^WEQ%F*NjH{)yjc!>v6W%|DKuVt5qA ze3Y=%us?`;Zk^*!L(SYQUtV+0u=@DtvRJ>O^VlY+eKyiSXJz837Ftg|M+(H9{XiC? ze(MG5b$%&!>Zbx9NnRIP@tnanp81ZGb%x!&KhgZUv6;y`hp=^?PrbFvs}rcohf_Z>q38NSm~$Oz?K*W6sRp`LHtE<9&5wljS4K`<(DG7?0MuK~Y~lDMr75xS2cCsP`|hEJ=NyeYwCB6exT+p|B867kuoAftzY>i4aUs8 zt8Quag8IFwH_-7sr#>S1l6wE}GwQuF($wEwncw&Nka}s#Q<@LyX;8fjGN0UGqnfhi z3C)jr7_XW(pk6oMZ2}%tv3%jutyIfOPs*bHaomJ*;cDA{Y=&cLCv}I){2MP$om`Bq zbj4J83?5 zf7rVIZ0|LF?<-}RWw66?@qB^s#tH0jWt}QnW=S!6NOdbt=1<<6$`0@B3KPG2t!26) z&rNoytFKlKI~KFwzTB|faG+Ht*?V2s(l|qh47xF$&wz!7h;_6Ox_xuE8tSYfg~Rp# z?V&4%I@f8bbt|4*s^%@2uQAj|6y|Fx#`m z*Ai7@<+}eqA?a32`{h!uU8fGw{mWl`e$t{y`%pgD?d!W~W?q+tNl)9^JDKNt^kFp3 zybBwVf`g&NU~DwBTX#U%)A(mnX;(g)7P$$dxr=& zEeSK@{it>-RgUV%bB(A*&+n>lGc}i!UgK?DR(~?sx+>pJ-^af~($nou3HtR>abE89|? zysQJ&9;c(IUfR}!>crW7s9GKxKvko^;ci*z|I5AdRCZ)8il7I{a@;1sKy&&sM>9sMYU!5B&wb(u2MC;`b;(6Akl*sT`@n^ho9Z4jyvT?)o-|#>a^C? zh&sq+_mk?Qlf#49+1b0dGmWe3N4S|4(z_Niv#T)t!fIML-TVhs!!7LT##I4e#o&bv7-Sf8pIcbmdd`x=_v3_i?cH6bqvUx->Vfq!fs# zww)9v_0UdQgX=#Ipc~wy8%%XWv9VN}wbN5=?X;F^ox{7S9%^%z>XWUvsa|(~Mb+_+ zL<`coX>O{^TnbRVp*U0Zy5&Vwk%KA+(1bK0g6e=uRjDpqUZ3i@k1eT|tkaol^}@ZV zzB)XBYR?fmsvT2CQ{DJ{0@YC-)2MDbp{JTMej(MzvzJi4acCt}(aA&KuBC~!#Wqu| zU4xzHyV1!s9x!hY)vKuosk(kXLiJhDDXLAnpQCEp`V!UpXRlM8{^<_YzQrF>9Xati z)uB#VR6p8(&~o}=6YXu3?JszGax6}pQMGkpC#}h(FIDP-HO)`Uu%qg^+>z>rGVG+@ zJjX5*VQq`j{G@jtRC~{6myJ|^ZyG;4=0i1Y7OR?r8U~P9kHXY8p;b$9a`R2ROgMRoR+x>R)+*#&8R0d_$;x~>_`yH#dY zKln;(#4U7k-lmashDQ;0g?h276OGFsU{|W9jy-7{zoidVjb(qT&TW6A+WOLPs<=dx ztF-+8ZLC? z+OCjN{hlQ~@}I`qP@Qqco@&8lSE_qYv%0uubqN}$jbwGO?+RM?+BW=CUfae=oag9?f7?DQ~`3BgHs{#&!L`~_8ZTPOc7N@#eKfZAV9mS5f?G894|zrPPy>N(rs;cA zsym8XQN7u%5Y_n`=zdp}pFL!aFTjKC=!%Zvbb(1jDp8&OzBW~xMopX5`o%*FRkfKg zg_ZuYGrJfqtNmQx=D2x5n-7i5=~|0yW0w-g1Sh@wZ+5l(8uV{SXH1V`#qe#&n&#S$ z?PxysZdaCtF+JX6@4xl}l4_X*>0Ii^oTo7Ckd|~)NxM27o_y9y9@WEhS zs1q`dpg&ZDObF+saDE6w5okDPcqjNgh@3fJL}BouU~Z^0R~or8@L`+_yff$n4M(O7 zd^jQ(_;Ah@bOCcgEkRfOvw$lCx`O6VH?Rn(n8EN|DO|(cI8)Ay6X1Dx6GZNy8z@0V zFDCYqd14}|ZK@YG5)C=?ki$fc5^|<<6L$Co@SAl87)rD=u z)qyq!8-cZ67rrTcAGm(-ec^i}iiYn8)_^ugrWx1^+8>!{ z_@0Oc!1w1`z$?uWR7co?>w$0}`~a{Tv<254xk2y)xt8!Pz;4jN$P9uXjHo62V6GL| z608cX0=B}x%5bg0R$wJ)8?ZH45vt|7auM(qxQYrVBhVr!kFYJ+1}q0Hi@Xe97ExRH zvRowC7L0oGlMtfk8l>eC2z)W=XP*M;g4|U@MgR@pTuqFjv=EQ zg_!de{4p*GdW_o!Jq{iNw?a>V$H6VoliVA)H}EI8P23&sF1H!n#GOL!B$x@khq-UK zMC3Pvx1njspF;LF;xz6xqSIg+mb}evQ4qXBc#pe<@HF=l(HZbG_yT%{dk($F-NgK} z@Mpkh(EHqVWUnKC51FUPodeH;PoNo?b07XOq73dDq8nK9I`;rR1Nldo^AP?4r<{X% zgw!=?I(QDe3Ox^|gIAyz!1Lf`=tb}XcnRvpyYfYNchC)VfffbbL1$<&uqfyR^#F^3 zj!;j~11t>n!V@jnatJ(mFTN~XdH8bhGNKCbLM2uh=175+)3^gL;D{!9q}5&>Q~>!j%HO z!2(bpuoP$m&BKS{LqZ?k8c|;OJn;Dul?Hvld{8Uo^TJypDh+SN`+}uGjRNDxYhe9B zKQIIu0Q!T$&_FN%41(6+tMS#rPSEyzB;O8f3+({52irh9f*rut&`w}SEZ-TfGv5X5 z!bgEod{?k5<|;(G!F1zWf!)DwU`uEZush!q>;blb_5yoib-!U{z2SR-&7pn3-h5xM z57-Ra59|vzh4$l{K%>EaU}I>1Fq$6#_E#W{UEK5q8VNrFem2}>eil@ZC1>+f;3tDK zp;N&rU@UYRI2D`$oyJdxE>QS+{Cs`^KNq?XTmZ&F7l8}GInc%6BJg+U@A%Sl4yME4 zVLla%=MQ4uLCjgqFM-B`2cS#%{m`Z05^x`MDZdxG3|tECfiCBjJ+RC9-3V8J%fS@r zN^k|JLRWz+K?5`aTm>dWSAz+B62Fz-2EPl@8gMng9hoHforre8Z-?K3Xf3z~+zMR> zuI1PBTNT(12-bsJpc}yrU?OxAxDnh8J;op5kAlacH~4G(b^a!J1H1~o1>OX&KyQP$ zz{}7(yrXa%lN0D9Tt@Z|Us!MyoZ+3oOT2O!DF>mj;DW$exC?)WzsuVT4uUH(F5pG} z5;Aszy-)<+70VP7>;yOXBEmiRyZk-Agir{X3;adi9dr|lg6_h7zpwBf2#N_Ayq8d1@DR@N>HGuu4BivoL+}*N^5^)6$UFc&1ux+t ze-`?XKLdRPJ_JugAA^s;H0TLl5=?|AyshvUQyQ`-kvYLXMf3zLDA)?7$lD6aDa<&@ zpW;P95}skkQ>;J~PVvw90zyIIIrxk>6+|rjoVO7Q;AaA&=e)IGBfJ2gV=j-}3qHSK z4dxT_V;S_}!b|uU{7c?S$S0TypRn8~p2NJCd|tsycm=-XUnzVZA+KPLS!PJ(7V^M< z0^S_?TtaTa65aydQpg2uoZ*|gcZRGU^uiASP?7(tqfKI!=P1!ws39XE5o;ei-d0r-x^Un z_((7mS{0cpU@K^QWZJ>EMAQMky-*FlD!fKPSWRewu%n}4M&OIE zHdqTR4fVl{Qt&>AYQy^ob->zS6KGwqj!+M*3pR$<2kU{2pbfzKU_nSk6BaIzvq3G;<6;5=xYFcS+*#f&N7c<5YY;=owwG-Rg2&p8&c z{9O29h@ymUh`R~h!R|s2u!qnS>?!mDdtph!-q7B{ba1*b6u(r4;>Xj3J_vgY!?BuS za6>SwFSHLh1gaoE92^VnhfH5V2d}{YhA0~BCyYQwC-jGp7DmF4fFF!#q%a0il+YDL z>n{vKZUER{7=`>uVU!|_h8c*|03il`l(0}ZDl7nxKo@}v!BpsCa1nSI8V@c84?&lJ z@!;>!rQj0qAat2<4DJ~GQsFpw44J#&3HamicMzQrlmiHtBUmP!6b>Mp|gx5lD zF^`xDz7{ftTw-qV4VWps5iG@AVix#D$Pz3>OHs)Z%tZ_FEtn;|70g6)@g4Y9cqf>O zX5xGBo$y{T5lzJp;CtbNAc-dMq9}n7@gw*__ym3wK7*eG4h8xwpc@f6(N44#3yJoi z9as?R0NR5EpoJBPgIHLs3au(u1FMPEK}WF)vQ>~PEINsm5m!d!2ww@#NvsHU2A#kP zP#4e{EDv=N%Rya17qBd}2-;n1RD8E7%EsOSL} z6For>FbwJ|`iP}PFL+Nd6j~hgLcSE{lz=ZTmIO;6bK>waxHfjAu5;mFk& z8;Zja4@1-dekfc+aR{^#s5FH92Gba91P+Ea76(C_fQ`X{(57G$Z~(L!*i>u|HUs-Z zTY$~MXlM(uAGC$o7uphRA+`crimky`U>|5_v7^{YYy;m~f%JxH3%0?G4ww}Q-&Sk~ zMk3Q5x%Tkwz+TYKV0*A9v;a7eyMW!HUBM`^8`xExCQcEjiqpYq;tX&)I2jrX z&JdMYaT3f-FczE$odwPmXN!6`y*LM)BgTPo;#_d9I1ikMWeDd(=Zh047eE(?`)Zd=>c^xSepT#YDJ7_!MysbTzmcx&;}+9niJNtN}Mcw<5De zTnE1vemkOd;zkAGHUwM6_2Nb(wuwoI){7eu9TSg;N5SLJlcJ4uLOcbY6w|;{;%P8V zJR@35r!m=pMWtfW8L^mTO_?9+A?2qzcd4l43Gab9Zj!rn7Ca+*A)|OAC?dH@UQ#}U z#X&D*T%{uLR*25QpA`$h7l(I|T&05W1;D(}bE324BBg`p#DY>Dm9Ov`5Mg-a#r1+Di^#F3BFW#GH%Z1@WS2 zAz4b7z>DG~(Oj~SE`yiEE8u0&Ofr|Qh^CU6bQQcJUKLFwQ|TIbRlFujl8JO3ye3}9 z6v1={~0Sh{L4_XoU0*b27v-Qn>U$fn46w3g-J5J z7JMtd!(5FNDm?@rh-HzH;X@>iR06&%m?gdyA0hJ)43h9*IFxF#H=aOY{ay zN{^9wBt8}cr68#kGTzb?Q3*u)i5MUSN!w`aBZZ zYY#SrR+Ab)t4Z~t)xl~~4XKu-R0rxKQA4T;R~x>TR7a`@R}a26d|kL9(p2d;a0+xN zI0T#w9R>~sCqajU!@!A91so1efa*X691k4<>cDZ(k>CggG8SeOI1(HKjR8l2qoEz7 zLDFEUBiI2P2<-%R1P4GngPp+s&@NzSDGKZYMnk)TQD8r4SE(1MLoWla%gK zZR5L^ImgD#Y|LKlGx!7b3m z;36;)8V@d()=O)pb?}=JEdk@D4alsA--Ku*{08`qh?YvqM%blDZIqUQOQq%DGHC_4 z99#ok39bNFLsx+-!35|TDNQ;Jo`RkQ&q({E3({WjJoKz|61j8WSt%Vn2cCeYOGlwc zrDNbR>9_(pf-oIFN(EC95q}u&ymSbr20ufef={GO=_Teo zgMTVL2cIGH0=XCP&%sa7Oz;Kx5&8zq1V2Etz&GG~=vy#LdI!FhyvWxZjb^PVKWJWz z_CRm16uaJDGCw~?t3$jGu`Oat#7Pw&+Q;xo6(19ZKeg9^&+W(XNh4p{59gDHzP2C7 zCk1AaeBe8>%$X0wpZP@mV%`CMvFHFFV@iCCIlMwPPW~>{SQSRJ!VnX@c;~pN((zOu z70aR;lUWNd;yKP^3;8CB{27?)-c$Yj*#(~paNOhN8mg^@wp7^{WgM5Q6!{W^!%JK8 z1qR0n*S8Z@IH~MOn)qOSooWbAJ{97)GoQ?4q7yR7w+0+%ms*(WwQinNC9X8prY7XG z9jth9MXG07lh1NEuKYvtjvoa+L%x|HJJ_D;=QdraHY!FwolwXu@>vbXozf1XT0YlM zs>QaD&ucjD{2GO7#RH1$^0;f*`oQ6`ZNi;0W%3S{oA((Se!clXnX7LZ(Y#R~x%=v_ z5mP2~muIY*7vZDrEXU?O7?Ihlwd_^aR6FN!LwP|pZ|!4EZMn8%746!i73A8=vEJIm z5}|V3>dD#}mj3eP2lKR3hj_|2%r|MZK~8eatOHtQg{>?mrfJ{x$|L7-y`!DZnaI~Z zz1CWAoc!eTXKkGd&$Ufko5|^^H?%VytmI7VbnWN?1!TR`QElLJd-+lQUD^qa-DIxz zYAtu6gzR#Aq4xP?Us+C@tW~bthRSU&4b~PPUrs)s++LfSuZnCvsDk!=kvg(vtD;)N z{l+pkBcE1xsfFwjkP$KOLOasf+S^}F zw>lU;;>2J%^MNirA!~^ITY+R(!XW8K{{N*$( zu;@V#x5El{-b~xD^BEOSzLnv)`pwz-|NTq7sDPtD@`??sKdozSqV>m7jiH(_ntW5o zan?~5RO@eL75EYFi;An@zYkhpoz`%aY71GA{25z=#pC5=NZhsbus^hh&!0=vT5s{V z8`UKrf2Z1IgE`%Zu{AWDRf)w4`6z_rvbP2=Wo81Mk)+>EHK(n?$@JU-iz=9M8|4tMEt&$6CYcxr15kI*e*gTf;|>!E#I2 zOW}F@_LE(%RsF6tnCc?sqn}?!s2)vasiTYXwK=S-S4FP5qn+0Cd6>M(X@a)En-cQ5 z{HwK=Tv7Sa=cKQ#A@^t-`Tpzk+U7$o<(g&>f3YJa@pDWP9Ih#!o6y=98fBEM5%~@ zUt0sWqI!52RQ6-xqsxqW{iQW1e{2pvYzd*Rw+TY>kNy*Ks^d$;)0`NmdY>>F|wBcEt~+b1Z0)+vxh{@5qPWRg!VaS?gI zT7$7q`23mm4dW+}zTrVwbdh25izOl9##XRzN`E=c#`A06(E4_iY<*>8gs~OeQQEYS zyXvgJb`C?wRFbXkM&-Cqh-;ruKCZc@9iW=YwxgbX?GqZ;&eWbgFUeIkkF=L>S;%*L zUe-=Jl>cj=u>Q?%ZSfcvSt+r8tM-9cF*#q{GVP$mQnIlXNS@=g!yc9S+BeL--Bf$= zV6~sNf}HjV1qRrJdu<+u&Y+NInT)1?=oGlpU%FoXm&1NpVizZ4D=5v8@Ah!@`_ea@ zuFI}^##WHMZ}2U-gVvw#`vm3BIt7k<y1`9OiRlmDPkP%vOHb_&@C3bhVYmybPYs5Q2N zoQ@OzPM@IsS*P%`KH)=~D6O!n($~J=7sd(79|j6vI)#6wPna*1q~|?*UvRk*8*j2! zfb;)-r;zhL;qQ(UzUv#5zdK;~N#C&jGf(&0IBGWDA^m8apctElaiH*R=kQLgq)5O{<3dS{_cR`Cw;@o671iev z2MXVI4&?m*lfL0+FF`~fX zfnOgY{hNKm|L&9&Hf;XuPU7c%gmLuz?RX(aeFOR*&e$A`odcKck?Kz$BK@RK_|X$p z(l?Op=lCI#v2U<>(45xte__1v=Z{p4!{;16MEYUhaH*=VT(#$-zj%hE{2LFE{`oT` z2j$DaVWIEAh)1EF<)021{>AYEd4@#K|F1qo%E@@)2YrIV83zu(@DS-2#tYbg<1NxZ ze~9!8&ydLR|K*2BKj;&DcZAFFlgIq!dj*BOSok{whJP|%_=`S4p)VLxX9?OV&D;F2 zFZj`mgBW!wgddF)vbO^AVu93`9P|n7`u}%cHhl3j5 z|JBRp?0o_^tu1XGfA|229{>O1#lko56~4Y~{*yjI`St~a@ip6zK0x{p#t91jPPX1f2MquAI6?9H zg@;F^jc4x@jGyD>@O^^9{a?LoHhzw0Yz^m1H;@y`Dgj#KheyU+BV#N0KluPj`R04P zAH7&GevW7S@aW$hCn(vz$NR@0AZ4bL{}tB%KEpG9c=VI^2@3aD50A(S*Q{Pqp6Hi9 z-IossIUmEWK;&qQ|Ibzg`GWS#GDK*em~WRO@s~dxTMxc(`oRL6Mfy@SIr5bv{Zi5R V!>>9!%f!L$YebCBxaha5{C~6<9_;`C diff --git a/src/3rd/js/three/xrf/t.js b/src/3rd/js/three/xrf/t.js index 428fee8..5716ff2 100644 --- a/src/3rd/js/three/xrf/t.js +++ b/src/3rd/js/three/xrf/t.js @@ -4,6 +4,7 @@ xrf.frag.t = function(v, opts){ if( !model.animations || model.animations[0] == undefined ) return console.warn('no animation in scene') xrf.mixers.map ( (mixer) => { + mixer.t = v // update speed @@ -27,22 +28,26 @@ xrf.addEventListener('parseModel', (opts) => { let {model} = opts let mixer = model.mixer = new xrf.THREE.AnimationMixer(model.scene) mixer.model = model - mixer.loop = {} + mixer.loop = {timeStart:0,timeStop:0} mixer.i = xrf.mixers.length + mixer.actions = [] model.animations.map( (anim) => { - anim.action = mixer.clipAction( anim, model.scene ) + anim.optimize() + mixer.actions.push( mixer.clipAction( anim, model.scene ) ) }) + mixer.checkZombies = (animations) => { if( mixer.zombieCheck ) return // fire only once animations.map( (anim) => { // collect zombie animations and warn user let zombies = anim.tracks.map( (t) => { let name = t.name.replace(/\..*/,'') - return !model.scene.getObjectByName(name) ? {anim:anim.name,obj:t.name} : undefined + let obj = model.scene.getObjectByName(name) + return !model.scene.getObjectByName(name) ? {anim:anim.name,obj:name} : undefined }) - if( zombies.length > 0 ){ + if( zombies.length > 0 && mixer.i == 0 ){ // only warn for zombies in main scene (because src-scenes might be filtered anyways) zombies .filter( (z) => z ) // filter out undefined .map( (z) => console.warn(`gltf: object '${z.obj}' not found (anim: '${z.anim}'`) ) @@ -65,15 +70,15 @@ xrf.addEventListener('parseModel', (opts) => { mixer.updateLoop = (t) => { mixer.loop.timeStart = t.y != undefined ? t.y : mixer.loop.timeStart mixer.loop.timeStop = t.z != undefined ? t.z : mixer.loop.timeStop - mixer.model.animations.map( (anim) => { + mixer.actions.map( (action) => { if( mixer.loop.timeStart != undefined ){ - //if( anim.action ) delete anim.action - //anim.action = mixer.clipAction( anim ) - anim.action.time = mixer.loop.timeStart - anim.action.setLoop( THREE.LoopOnce, ) - anim.action.timeScale = mixer.timeScale - anim.action.enabled = true - if( t.x != 0 ) anim.action.play() + action.time = mixer.loop.timeStart + action.setLoop( THREE.LoopOnce, ) + action.timeScale = mixer.timeScale + action.enabled = true + if( t.x != 0 ){ + action.play() + } } }) mixer.setTime(mixer.loop.timeStart) @@ -90,7 +95,7 @@ xrf.addEventListener('parseModel', (opts) => { if( time == 0 ) return update.call(this,time) // loop jump - if( mixer.loop.speed > 0.0 && mixer.time > mixer.loop.timeStop ){ + if( mixer.loop.speed > 0.0 && (mixer.loop.timeStop > 0 && mixer.time > mixer.loop.timeStop) ){ setTimeout( (time,anims) => mixer.updateLoop(time), 0, mixer.loop.timeStart ) // prevent recursion } return update.call( this, time ) diff --git a/test/aframe/filter.js b/test/aframe/filter.js index 6c9067b..3aaea54 100644 --- a/test/aframe/filter.js +++ b/test/aframe/filter.js @@ -1,4 +1,4 @@ -// test the XR Fragments parser-filters with THREEjs scenes +// test the XR Fragments parser-filters with THREEjs scns THREE = AFRAME.THREE createScene = (noadd) => { @@ -6,6 +6,7 @@ createScene = (noadd) => { for ( let i in obj ){ obj[i] = new THREE.Object3D() obj[i].name = i + obj[i].material = {visible:true, clone: () => ({visible:true}) } } let {a,b,c} = obj let scene = new THREE.Scene() @@ -15,6 +16,11 @@ createScene = (noadd) => { scene.add(a) } b.userData.score = 2 + b.userData.tag = "foo bar" + c.userData.tag = "flop flap" + a.userData.price = 1 + b.userData.price = 5 + c.userData.price = 10 return {a,b,c,scene} } @@ -22,84 +28,78 @@ filterScene = (URI) => { frag = xrf.URI.parse(URI) var {a,b,c,scene} = createScene() xrf.filter.scene({scene,frag}) + + scene.visible = (objname, expected, checkMaterial) => { + let o = scene.getObjectByName(objname) + if( !o ) return false === expected + let is = checkMaterial ? o.material.visible : o.visible + if( is !== expected ) console.dir(o) + return is === expected + } + return scene } -scene = filterScene("#b") -test = () => !scene.getObjectByName("a") && - scene.getObjectByName("b").visible && - !scene.getObjectByName("c").visible -console.assert( test(), {scene,reason:`objectname: #b => a = removed b = visible c = removed`}) +scn = filterScene("#b") +test = () => !scn.visible("a") && scn.visible("b",true) && scn.visible("c",true) +console.assert( test(), {scn,reason:`objectname: #b `}) -scene = filterScene("#b*") -test = () => !scene.getObjectByName("a") && - scene.getObjectByName("b").visible && - scene.getObjectByName("c").visible -console.assert( test(), {scene,reason:`objectname: #b* => a = removed b = visible c = visible`}) +scn = filterScene("#-b") +test = () => scn.visible("a",true) && scn.visible("b",false) && scn.visible("c",false) +console.assert( test(), {scn,reason:`objectname: #-b `}) -scene = filterScene("#-b") -test = () => scene.getObjectByName("a").visible && - !scene.getObjectByName("b").visible && - !scene.getObjectByName("c").visible -console.assert( test(), {scene,reason:`objectname: #-b => a = visible b = invisible c = invisible`}) +scn = filterScene("#a&-b") +test = () => scn.visible("a",true) && scn.visible("b",false) && scn.visible("c",false) +console.assert( test(), {scn,reason:`objectname: #a&-b `}) -scene = filterScene("#a&-b") -test = () => scene.getObjectByName("a").visible && - !scene.getObjectByName("b").visible && - !scene.getObjectByName("c").visible -console.assert( test(), {scene,reason:`objectname: #a&-b => a = visible b = invisible c = invisible`}) +scn = filterScene("#-b&b") +test = () => scn.visible("a",false) && scn.visible("b",true) && scn.visible("c",true) +console.assert( test(), {scn,reason:`objectname: #-b&b `}) -scene = filterScene("#-b&b") -test = () => !scene.getObjectByName("a") && - scene.getObjectByName("b").visible && - !scene.getObjectByName("c").visible -console.assert( test(), {scene,reason:`objectname: #-b&b => a = removed b = invisible c = invisible (last duplicate wins)`}) +scn = filterScene("#-c") +test = () => scn.visible("a",true) && scn.visible("b",true) && scn.visible("c",false) +console.assert( test(), {scn,reason:`objectname: #-c `}) -scene = filterScene("#-c") -test = () => scene.getObjectByName("a").visible && - scene.getObjectByName("b").visible && - !scene.getObjectByName("c").visible -console.assert( test(), {scene,reason:`objectname: #-b&b => a = visible b = visible c = invisible`}) +scn = filterScene("#score") +test = () => scn.visible("a",true) && scn.visible("b",true) && scn.visible("c",true) +console.assert( test(), {scn,reason:`propertyfilter: #score `}) -scene = filterScene("#-b*") -test = () => scene.getObjectByName("a").visible && - !scene.getObjectByName("b").visible && - !scene.getObjectByName("c").visible -console.assert( test(), {scene,reason:`objectname: #-b&b => a = visible b = visible c = invisible`}) +scn = filterScene("#score=>1") +test = () => scn.visible("a",true) && scn.visible("b",true) && scn.visible("c",true) +console.assert( test(), {scn,reason:`propertyfilter: #score`}) -scene = filterScene("#score") -console.dir(scene) -test = () => !scene.getObjectByName("a") && - scene.getObjectByName("b").visible && - !scene.getObjectByName("c").visible -console.assert( test(), {scene,reason:`objectname: #score => a = removed b = visible c = invisible`}) +scn = filterScene("#score=2") +test = () => scn.visible("a",true) && scn.visible("b",true) && scn.visible("c",true) +console.assert( test(), {scn,reason:`propertyfilter: #score`}) -scene = filterScene("#score=>1") -test = () => !scene.getObjectByName("a") && - scene.getObjectByName("b").visible && - !scene.getObjectByName("c").visible -console.assert( test(), {scene,reason:`objectname: #score=>1 => a = removed b = visible c = invisible`}) +scn = filterScene("#score=>3") +test = () => scn.visible("a",true) && scn.visible("b",false) && scn.visible("c",false) +console.assert( test(), {scn,reason:`propertyfilter: #score`}) -scene = filterScene("#score=>3") -test = () => !scene.getObjectByName("a") && - !scene.getObjectByName("b").visible && - !scene.getObjectByName("c").visible -console.assert( test(), {scene,reason:`objectname: #score=>3 => a = invisible b = visible c = invisible`}) +scn = filterScene("#-score=>1") +test = () => scn.visible("a",true) && scn.visible("b",false) && scn.visible("c",false) +console.assert( test(), {scn,reason:`propertyfilter: #-score`}) -scene = filterScene("#score*=>1") -test = () => !scene.getObjectByName("a") && - scene.getObjectByName("b").visible && - scene.getObjectByName("c").visible -console.assert( test(), {scene,reason:`objectname: #score*=>1 => a = invisible b = visible c = visible`}) +scn = filterScene("#-score=>1&c") +test = () => scn.visible("a",true) && scn.visible("b",true) && scn.visible("b",false,true) && scn.visible("c",true) +console.assert( test(), {scn,reason:`propertyfilter: #-score`}) -scene = filterScene("#-score*=>1") -test = () => scene.getObjectByName("a").visible && - !scene.getObjectByName("b").visible && - !scene.getObjectByName("c").visible -console.assert( test(), {scene,reason:`objectname: #-score*=>1 => a = visible b = invisible c = invisible`}) +scn = filterScene("#-foo") +test = () => scn.visible("a",true) && scn.visible("b",false) && scn.visible("b",false) +console.assert( test(), {scn,reason:`tagfilter: #-foo `}) -scene = filterScene("#-score*=>1&c") -test = () => scene.getObjectByName("a").visible && - !scene.getObjectByName("b").visible && - scene.getObjectByName("c").visible -console.assert( test(), {scene,reason:`objectname: #-score*=>1 => a = visible b = invisible c = visible`}) +scn = filterScene("#-c&flop") +test = () => scn.visible("a",true) && scn.visible("b",true) && scn.visible("c",true) +console.assert( test(), {scn,reason:`tagfilter: #-c&flop`}) + +scn = filterScene("#-b&-foo&bar&flop") +test = () => scn.visible("a",true) && scn.visible("b",true) && scn.visible("c",true) +console.assert( test(), {scn,reason:`tagfilter: #-b&-foo&bar&flop`}) + +scn = filterScene("#-b&-foo&bar&flop&-bar&flop") +test = () => scn.visible("a",true) && scn.visible("b",false,true) && scn.visible("c",true) +console.assert( test(), {scn,reason:`tagfilter: #-b&-foo&bar&flop&-bar&flop"`}) + +scn = filterScene("#-price&price=>4") +test = () => scn.visible("a",false,true) && scn.visible("b",true) && scn.visible("c",true) +console.assert( test(), {scn,reason:`tagfilter: #-price&price=>4"`}) diff --git a/test/aframe/index.js b/test/aframe/index.js index 02129be..80c98dc 100644 --- a/test/aframe/index.js +++ b/test/aframe/index.js @@ -8,7 +8,7 @@ console.assert = ((assert) => (a,b) => { - console.log('♥ test: '+b.reason) + console.log("\x1b[34m♥ \x1b[36;49mtest: "+b.reason+"\x1B[m") assert.call( console, a, b ) })(console.assert)