From cc3f58f49352924816220351bc0daf37ddc7da6a Mon Sep 17 00:00:00 2001 From: Leon van Kammen Date: Thu, 23 Nov 2023 12:30:18 +0100 Subject: [PATCH] work in progress [might break] --- doc/RFC_XR_Fragments.md | 2 ++ example/assets/index.glb | Bin 1680576 -> 1830088 bytes src/3rd/js/three/hashbus.js | 8 +++---- src/3rd/js/three/xrf/dynamic/filter.js | 28 ++++++++++++++++--------- src/3rd/js/three/xrf/src.js | 2 +- src/3rd/js/three/xrf/src/video.js | 10 ++++----- src/3rd/js/three/xrf/t.js | 1 + src/xrfragment/Filter.hx | 2 +- src/xrfragment/Parser.hx | 4 ++-- test/aframe/filter.js | 5 +++++ 10 files changed, 39 insertions(+), 23 deletions(-) diff --git a/doc/RFC_XR_Fragments.md b/doc/RFC_XR_Fragments.md index fb97ddc..a6519f0 100644 --- a/doc/RFC_XR_Fragments.md +++ b/doc/RFC_XR_Fragments.md @@ -512,6 +512,8 @@ It's simple but powerful syntax which allows filtering the scene using searcheng > \* = `#-/cube` hides object `cube` only in the root-scene (not nested `cube` objects)
`#-cube` hides both object `cube` in the root-scene AND nested `skybox` objects | +Nested selection is always implied (there's no `*` `>`/`<` css-like operators on purpose) which keeps XR Fragments easy to implement, and still allows fine-grained control chaining nested selectors (`#-sky&house&-table` e.g.). + [» example implementation](https://github.com/coderofsalvation/xrfragment/blob/main/src/3rd/js/three/xrf/q.js) [» example 3D asset](https://github.com/coderofsalvation/xrfragment/blob/main/example/assets/filter.gltf#L192) [» discussion](https://github.com/coderofsalvation/xrfragment/issues/3) diff --git a/example/assets/index.glb b/example/assets/index.glb index ecfa84b55bbf2432d9e201b9ceb80e4aafab862e..72dae665648e5c7fe0fb6ae5efdac31156b6aa4a 100644 GIT binary patch delta 186199 zcmd?RcU%-n7dF~GfFddq#2f@|x}3hJ5_F<=g0&KNMRI<0FCE81$iy5@{)#1#`G zrd@Md$Gm1&#hfV4`|&o20W_xs)d=8yaC%c!q75J3BY9x2@EV=;Q8u&H zYBibc7M;~*vg-}}rc{(`L2wD9uC7)=o6T-BnvG_w#X3JCEYPUe8*K)&$!M^f zEe5^KD(fR^+07=TvYTxdv(cc}o9!l4Ru70Y77NlEZ90pMHA)AKS#P)7DV5PKXUCS1 zTSZyrZVN-?@>=cxx8ihmJkF%o*-S=@US~yr{ac(_Z#JS!?IvEF-eS^&qYEs0gV7)# ziY=ZYM@NgIKI4e4l&{<@CQklj^Ou*zTn<1@Z8j?^Y}FYIR-IXvYQ~7Bi~}``iSq0i zzl@u;3XAgonn4*KYUdN>i?xC>g5$hI`El(axoVvk8lydlMl9)}WGzM^0&I5aomh0U19x3KvC7Mo!}>QO;~sB%?~xa6GVa zU`EGg6-AB7E=$ed`Rn%Q}>lJGK2oGy#>#NNI<5)M;BvUeW#^)L~hNdaUTX9Z}^e z?E~aj9rMXWI{&UQ+vNOR9%;;W`Bj&PqE5ct^%11A+Y?bQZ%le3XLSqCSex8jQ_!dl zADlc0wijMcmP!|u1A6|1$6o0fB#P#YoL*WyU7na4ELZRIXF;o7Ytw0MdaccXMi?@> z^=&DN){Gtfs)!nkE#rFs5K-RNuVBXC1Hwd<#u1#It(ZSB0C{&xgu$Y-8|@~Y)o4O`eH3ieVz-!~#JF3mWFMFXcDu=7vzqL% z9JAcbQd2H9sG!_w$WWclW;U@ww^)$W04p`YW-!%sHX~-#zdBflL2oqat#VrD;#SNA zOf;JX2@O`O&8Rg*Vb1DxMzfujZ@@Hw$s6njlhtU{Vn*#C@J+-zuo&T5ih4i5>y%9BSc z->DK}MjzuplTnXh*Xylpgv}OKDFfCroe7r378jcigN^k7qi)68#5!6YJv2mKkouRm zQENA4%o`C1gVV}GZwAXHCKk##GP1lVOQ{7jo{ut%8mx#F$3!5sXS5uPiK@#O^>t~{ z+n}`=<+O28r7^-bo7Qg7+Ra)Rh25&PgW9p2>*TxRqU40Jesan2k1$ch32jA#+2nIoMJEQzYbQU@ z*lcpku|?(OQ?3?3b9FZS*=5JndK#M@)47Cvb804L%7SUT3!4!Io7ZD6(d$uMc@0Ko z^z_9jJ8;HHlznr?k5~id&wPyOUs9H5Jy6S?Gdoz6$IkN0NS_lWss(1e_%^>-5?hp> zZBcl%o;?~h(4z)=JAb@Q)}^Iu?DmXb)0(husyaV}t*EtSKT$MfG+y8<%C+RcjP47Q zG;*T_ff>IjC0Vnj<{`3miGN1GcY$ni;Iv`^v&m#M8FVJS+-pfF+gq%dJXSVmu?Xu; zdW*$qHtS*8mR$QC_D3DoeoPm#bdycaUQ)8Y4O1Li%r&bG>pq#Q)n>*twP0&CT8(H) zq%jH;!(hSo1tl#QG!eMP!VELYE%g&MI$K8d@BKu%%+jEY2Fpf^UPil7KD4|7LX*5> zRkU1eMGUZ6)mfO1t(u!x)TX4*R#Zi3B{hbu(Ml6WqS4CG5Q8>6HF;Q{Ua8?Vz78Lp z(i1BvhOObsuwqzI|2M`&nJ|z3H%cD2vKGp)u_^>&&0y2H-{2u5@MNy7R7CfG(CPn2 zSEca(Y_8@c0(3n%8N@h(X?ZELt|7iY#wLd-Enl zEB{L<4?R;&)?N0Ix1EX(HCnz*Yt5b3CVx8BxxCT-MIsZb^6vvpa-E|(dDH30P!onA zPr)YC}R(8~7njpe!5^2-x1M9I6)N61?)6_L;Xl3#vxAu<$; zTHZF=a*u+|EXUodD)+i*iN?PAMZ(-eV6)|^BrJZ%p;GdLi{_{=&B31A9PEZX*)YXe zwsKkd<-WgYlGM_^&ST7NpBMS$jnrYWTux42E1*V=$N~ z;YOD53o|wta+xtsJxEv;&B-T+UyTekeAygB?&cWLuQyA{W3PwE%dbX8e%ZG;q5M}> zqcKmn8RhKkFuCNl$Y|r2^V%rV>;!Y}I+?BL=gv{)F9*Y%y9SoLwq?PZ5-xwd85wH%(lT(E z{I7#8tP)k_p}!hJEnijw=igijStY7rKfiiM+puGZyUu?$$T5{{OVU3V;Bu2?wz=E|0L#WG;UvfrH~&$?4n{^M>vxxn38 z@~C@t;R7KPNJZElPP4=B}GLPu)y9%*=AKGbaKE z>@Tuea+|p&kC_`S^IwExK5L`dDwU@&yx93~fGl}B&}gw>@d%SU9*U43=d_fin-Ox) zr+huw@+?xm`;_gb{&Lah^+Mqg=Y1|-NBs9(n-2S5DLLyGiR zh`2)88!V<1%G892zZXz0go#s>@#V!(WpB6`AP@Q!q&UlqVT@H&G@;P{6E0R#8ib1F zl~={YLQ3-r;!5QSi%1KCs2+yI=NTFpCKgw=7Z?4NxB$_Yr`r+cPL~+&PPdq${~mQS zTr9@2MJQnvP~^%=VmakS1+l`vPg$izR}>=^U5FU0q*Qb#saYvclJS+?NwO-rlgzA~ zC&{VG?j!}PxRYG1;!YA4A+A?SR&^)oP?aYst5m9nCd5XH`INz0aj?=`r2)!>1Tjci zUk!~xYz1X_b+lthe$h{v6p0SoRUO%+DA7kb9VsqQ-m5fR`6+@&6p?>@9jxTnx^sC) zBUfWBx_ORKEU2`O7RM^TG8&~5i_o}~i$qyq;Y#;NJY$FsRouYPE}b}8Ns0nmqF2+d zib7hjaODBh-_#>*)o7ql1IGKbihPtpMpSri6uQ=5$74xXPU-H4qHmN&wgoyo>RThS z+4MlsI?|?>Ri<*F%Tg4*0U)z{a6ll1jn2>m`6^U;!bbb;#=eAWGr#Q@@D;ptOwi$`< zFr=}-21A=7iDLj7md`FOQyN;3F1rI_b1Y)mqK*JsD>BrpAjmhSHd8(3}UG*r1~M~*uMQGBoZsCsw} zM4-Y2l*n3`b*C6bg+rCX?D42@s1hF|7L#><6;z@NVa`mf4I`Y-A}Lwzn(kzdn%qnx zl!GGr``>aGKHa|4e-Fw z#^PGVyCFy3%Hzg}`08I;tqJIAMze>bclNXp7c2J|9g=|V2xp@RykYgC=-5 zjChk$ped_%Yb0*k6uK0KW;gw!^#RJ60b+jTc)a+Pa;_<=gdPo3Ml?fO>e1cJK)19& zJO65iVaF7SP--=YuGVlQ$sZ5&CPAF4G>S*w8!g2EZY|SQT0tq)f?J@UQmz%|VzU-V zH(>y*dR7Z}^%7Wrpn9Ro`~*A{y;?}w*IHbn{E`4&ng+U2Es^*5GZ zImriIb}JFxxI75vTelTre@#SU|JLqu%eO_h#J9%CB{df}D&Mk#Fs(zC)@{U4OzTi( zK^vqvCt|7I(@y+ex!i`=LLJes6Oja!@>Xa>vlyiod`fgL8qw{b`>HL9O`9baR<_qf zKln3UTu02Lcoq355uNxT1}opTLq)4}f@s~|UD3Xs&_N5^qwpU(VLo4GXjf-Eikh~f z0}_K)Q0{bKIhd{d*%=iNWlgx#1@=&<3s%pgDh*fib>b04lsO$>H;p^tc|E(LjM*%L znvl>L52emn&{^$_E1h8?Y-RhLgh&3>OQa#11=&Hv6tSy&-Kv|6iq!)} z)`H5kWKmY8cSVZv-H~gn8AH>$8>eB4+|8XUyE}6I!XmtTz+#stp@#lFX)6j=ZYQA_ zuy7?T87QGA+S;3;6}>Q0OL}4jE8U$_cK!%fx~QyzvZ6a4dA}DjJYc#iy~TCP4?TdM z^@e!CkhTw!=zF5Tfqjr}1Vh{Upb|BEAr{C-(UrnzQQuGKg~V=M8RbwfG{C*&4N>y5 zhq{-%AmvnVBnAyv3iUxmP=A;}vpyIy999Y`fA@!hP=|cWYVc=&^gxHcm|D64Vzjcf zFRFo&*{s~`i@db^48rP3yU#YZjMBF7G8KEnje!`NH%ymZ2xp&#{ZS%NA-0eQD_8p? zf4RZp7^TzzbwK|bjInsx1!K`=0CIs=P^u3^(X@KhOo3(eABgg$6m-|7fyfW!t;`&P zZlD^EAB1dfU0KCB2#un=$A_ToPlJ$yx=%vkgeD3%w+go4*J3U++ ztt6!&8oBBCm;`Zyp)`id42Qsg`6xfv6$dJvhr37j{7B>tV+WdmQRu7ssX(npVK}FxB8P1> zy7SkOm{~uw2+(ll`w@In3R5mK zumYgOXn@U6{%X2>mDYyg(QwooR=rIOm#E%n)D{C3LI}UYu$WVpx zK-0#uTCpQ$uko<;<71H{eY`kHDeyItd^ZJn84D&MEb;^#3sQT}S;%6Le)h6XT2XtiaH&vvXd#IFq zW4ks98%%ErS!t*XOa!8#ZaNW7uQ*x!Mwv5FofQS9Q1go_zf8m^f`u!(N!+mEv`j(s znFW+F8{shWCRy1v5SnDO;@VP&drxIzs2HQHh!(ZVwn<``#%xrEvYl+wH>@dmL%Hfx zsB-ihwNG)2uDtd^Jv5UcK2C)_t!HS}G>FFx-Djx!6o^XGVRtDEy_kWT%$W`pG!^0; zLv5#`kRmfs_Ts5@94)ByXUT3(rL`P0d72pRg_X;$yj=gRDdZx^!v&0ht8iQWx{k_;gX}J$QaP@n19-&gp zV6lX{EQ3zmgV+^7qF!ma9p{L3vUlg&{%-diy8kprqDAEozz-Uv39!E+H za}cgZ^^2|`A&UVq@nVTF3vl-<3PA6(Zl#pyEuGr2EGejk`c=!UB2Z&8D0lCm1pXKU z<_7Cm&Ww8AdRDqOuA5bJWRV(^NeP2#s3}brMf??vJ<`i$roM4M#cUyaQY(WmEtrYa z@-kV-gd@2{3$t0N8`5^6_gG(MZ$VW2E{qDkc;c)e zn77qzuqlD((40%VFrlz3*lfIS$K661W_*CbZMxl$m?}D&5eh|F@CgPVlpBch##(LR z8O!cQDSDlmmy)y_kI~~cpW7{u1bh7*%Dj)H-g;csbF0~uDF!opY`GSd?E~U%z(+KE z#Y)e_fEv(Gl<_Gdy$qPDMc9J4eGiyXXXSAzdr+d$!22+QBE5}x!ObTMOghlVVl-LE z_9B(?yV)v(Erc&ith!$Kl7|m5)z+jl@FD(dFKUD@+wdf2d8_dELJco zjMqNadH9rpFL2_1roK+*0a=UO;EpR{#_OV#; z1)vgkK#cLmcSLG0o_~i`$bzq(*w{p}Rl0}|qh!NK$YN-|tibxsVz{MH42Jgs^0aWG z4i-BGpDi_o8MErqvMXwwH$JlAn?O-^3*3E7YOfZ(dk<%yFj(-7loI$B+1eaL7g&vE z$V4}^D2D*OnU-~DO&}}>w5+hU zYA_FWEWz5q+hfI7V0^ejm$H_FtLqMnXNm9JLI2TahDd|)-_48?8`O33=3&-otC42P zcZbmwoHh7na|28RD@bC~H{}f4WkGKQyagNbD~8sB?<;xAl}Cu8F|i3+ZutkiCo-GtnO5`z&vJPLi@a>b@j)R_AU7FCm z01ehO>6BO-$;|3Jj{FHdt}lRaX&HA@Gh2ruS=R+1 zr&&EbFe^e@i@LbE6RRW5p3I`LI>CZt*i)^1Z4EtvRZyo_q|ERjk; z8kKJ_@JWC^4)WHq`3*zBD`oVXmk!H39d3A}5ep2C4v|XblPnU8E1h?qoW%6ON3-hG z*uW_JWQ@-|7VE_jn%qN=d@m2djvUuf!}8U+gKhaReZ< zV=1v!vZDxZFz)fxHHG&FIM2$e>%|zIyrNjkjQC=WEwhoz%hO^2jtuN%p=>{c-3%W& zsgHRJ>SZz8`IKalUN$S1MwV^tSu_hDDeC!3iP~Z3{;%Tx-Zm8RZ_R^nsEJ*PY#0EX z*szAiT|s$wj_5_=wfV>GCX=tMAYtdi# ztCjaZRRzZ*nyjoRd~8M=OhNn!50z%K@-c9$*r|b)$YS{^G=f1Gp z4U6rkeJ`Utd<)GE%UZIveApE2*caU=>moi(p*Eh`o62cL9&|+vfs;mCPo%Q*3U*(s za^V?95i#tXm9P&>T#c)2vfJ?S9N&|^zKSh_eJYJk+k#>bUS-qDj*%n7WznGS?f0u| zl-h>nhz{t5ucI~in3ONzC$FI!u!Z4#%v=Hg>nyL$ZLA55;)77NS4!PLb@9O-Ej5>~ zvx7cNf*s%}2A^p28QAp(9%?mVo>PexZ=#d%?K(eWus+C#FAr^4;;8zSZn6~`v-jW4 zjH20k$#!5If`fgKoVf(7%V%#uZ{Vv%Z2dIdSv)&lsHZ@z%}9BjTy=n#H5 z;R)>c%$@Utw^#-{J{{y7=N|MArX8(Hh%Jf}(cQTi6U}YJ;HyOC?jv=ueegv(>=4#f zlOP=oxE-jR?Q;ax!vyW5FCJ*7Zfb@S!#L7`8n?v6!E#sYGM-Mryc8bRfYY>j<`Krm&HH z3_@}*6MBoL24%($sZI=*nWe?9O%s7f;};CM=M6sjG4p8NYxq$>uDywsZFFx47*tGA zqm`Q&8*}z_oDs-XIqO~|$Mk;G4p9PWRB=SgXDKI^)QuQh9$fkoM zLX&9#s26@a!j{!YW!qDj3iEpDERMJkY~AWIZhD4kfk^_#3ppc|G0#|9*c|-eDCNL2 z*55daQcrw-hMf4;n@yQ0rT%mDC|*-3X*lVYu;2$Bc~6#l6TVcZMrw;=jrgBPe7s97 z`9Eg0=wZ58_qD~a*?yVTg8et{7@Kf#qOhnk?}M2RyeLpMOY^Z9cTdrd&J@ap?Pwtx z85n$e98Y2>DfSikXc5YaSFFcztfEDsGnhB~VE`Xk7U_*|_SF;T{a4Iux8Zjzw3ige zA?<%^YF8gs+=Th^Wi#xsMz+!ZpK_w>_}Qu$e)8}|Mts$eMUcG+%6x|2p`^Hu$axg#>*I`)>~$gcGhYbPkudq(PKh)++BnB2&>+*l+4+FhwHLS zZ^aNF18b!c2vFN}E#Jig2L(4L=5PTTNa#GeL#UikCIpHJq7_xT2RIiCIE zeLTMUn%mX44xiWIV*i#I&s+KQ-IRHLPn{D>o&CpN%$QQre8$l?dP#vazunhoPI)=E zbL-!mE%|-z)-wwiwjbL3L){n0l0OUmeM;sJ9qTvo$2~n`>fOyM-0{eX?=L;ww5(v4 z@Nf5S3aUTCyIsW*eUIE9{qyA?S6*s&szm-0IX?Eg4;>-H2ao=K&elxJ?WN1{3xzi8 zUA@Nm)=#YRVa?x{n|%tK*+D-q<5qg@o!^9&PT8|FScv);L@h&e^>@Z|JL9{ z_ZH(_9mm)0vvBgz)jM9SX*%yu*O>Qvu1;j7lid*#N{pa(CoSTpT>hXVNX!(T!C6~bR({Q2Xr2>t@_7l^+g z`~~B$DE>n5S1j{^oQ;*UtN+7JF2^aD| za#ktLTXs>(aZcJutr2=pd*WPrkhjLR?Kfwi->3yblS22LUzOuHb=M6%h&SNdtY4fP ze>z4553P05nPcbpedB}9j3Y-$|K`t~&O)^aOG_PnmpkviKSB}KZBw0n9ubyyZS3Uq zv+_irE|hiJpL5)x@Tsf@yZJ+h1bvgWvjZ>qRuO&Hw?%n{YE(FXpto94<95S=V`q5- zB-`OV)-$|e)%#zMY1-&ioC7^1m77|;W@J%5-XC`*#|(*~u9I97PwbyCf!oBOzkPSZeMiPBknob5hyo9LL| z>2RKX$PK54;jlA&I~kOa5_H7rJAe;Ivr31ZhvK*adL7MjX8p{EY*qa|&P6qNrI*C- zaE{!{aoK+BoPB=hIN-@5XOlwQ4p>FEH9SN;&5Zq|DI3_qt^LinP8K0CYtLz!MVMK8 z&6ER#nYG`E+fSHT`=xUG2s3LR&}T2hWbL1S+CzF~?cU`$X4bxLT_)+7vCkezn2g=# zn89nrtbO!g!es3~mf(73?HNZ{O$C8j`=s_9GiwjLdXV(Y+FRD+m|44FDK&@b_MrPb5wrF>-%)0XS$lkU zUI4T9eLlQkX6=izIcC;ASgk0t_A_I71DLhPj^Pbs*53LZZ!t4=b2cC1kGmYnF{2;x zv1iskwK{dL#H`(IEX>+pjN^qdBRc;BVToCLQV~AJ%-Vw&bIh#0W(i&iX6@ZJ6P94@ z&dc+--7sUX-We5gpkJ7^2NdUq#;pCsGme?H9~;icj9L5g-*~N=wNL2CE6uDuWi`jl z+FR}6W6vsj_Vh;9yF%jqhyP+w>A||qq-WTXwuOlFUYP7WA^yN3q`(G?od+gzyf<-! zGbwTl=}XnfaE5&3cxn88XM>GfnO?|f>vUdfxQ)^b`rYa5?7f|EM8r=cXA9JA|6I&p8Lp+({8P`dxP>_2-G+H+$$Dw2)_B+4qUF%V}Ofwe>m9 zD!v>G9UnVKb)-s2-p2dRj_JH|&n{kfwmQQbu>H{~r{7lI$bW<#PIv2BuWW7TSj7q! zCTIH{T>f$?;Ux`?ty} zaE9ZjrB5ALesm@2JJjE_|HD62mh@ogrI@7NYe@gvQ8}n);@Y)D)+`WXtWVbwK7Yk} zp!3}I3=0O|AO6Mf{<)Mj%Ei+de%P1w;2_UC@9grdYFqe2Pp+DmbvTCJfibFZ*&V`fwlO}MJg;0=3U3r0B0^u zEHS81!R?(}$FiqY2%ni*zI%x=KAFCE{9cJ%Dz6^;Wh=VWd?o69ypmoE$zpw1(gQ z9)+nN6DZ92wF8A4f9y`-t0n!FXjA^k%KSz=^~B1M$}w&JHV zV{Vi<;hVW6sogKmu(9s~Hgf76Hft!JK5mLa$ z0FQ=jim;0?7`m~*V}!22T_6V`{2H3Ez+Z!P1^!y-2H6#|3BtyZ-SA%{pd`p{kPQ(g zLnc8w8UVx!1BKck^@RpP9B?e~S76;ClOgLNtOI?VP#3ZeGRBAsjDAK$0*Kaw0VIp}~m&astAI z!dAht0Kpc3g~AUA7eOu*6v#!wVqr7TW?%(49cZzz3E_8;iy=26TqCR!Rs(MUTMN7f zcs$nS)8(5wYs2et%wov;*g3FJzI-$O2SAXovg4Dx%(?586J}I0M{KXH@WC>0oKV&}97c#$i z8v0YhX`!&_56uA~ODF*8D;5y<3kQTV(4Q9kfD4FcghFCr(NEkb>=({DK+XsSLHxvm z;$C5&a1NTYkOjp;;yGb2!gInNgy$j8L1rSn0C^sAH^L0zvG7E=DEtlnH#8T7UC?9* zzkpqY{0m_Y^nVLKLca_05yDH*{{pS!5fqn%KS5oPmyq-k)GpxEW8K1EWAUQBRqia3h-sfw+NpK_n^H8eGW8lpt}lr1@bk*XNY+U{0i)ua90a@ zA4%^C&xN~CToqm->ILv~;1^(5fnNyMAg?L~PZo@D6cvN;w!Ekqh%itrg8P<0yfH5V zO);Pl$f9C-v8-4QG8AD+vA9?QvJApfkR>5YBgF3*#EK$*ssL133`bZ6vNB{C!m5x} zAQKTLiftj=iumMItmY8gK-~t)s$zAqwO9>*Z6K?Qt$?bFEfGdQR)!I6J!H~7DzMnH4tM3wum-JD>QcK?7%k2`Uq=5+9AI}SR1kyWIcqjkhLM} zB8(I3Isof{#EBin_F@OfP6)e*W5mvoqY;i0M~EXKQxSH9t}Endgx#PU4Vj9tn>ZX{ zH*pxkWXNt}ckyeWvEooM33vk7IOx9?$BRRNh5(NPP7xhL#GXjd19Aewo={GJOhMRF z9E`B1I0#`c$evCr8uf}DqN668e4G=$$kP7)oH5qu*~7Uv?I0y!D-TZB`@IS8jhPJx__ za2n)P$XN)dLr#O7iEswwbaA`5Ron)-1>p|J?T|kp+zGh@ax=mV$eoba5ndN>K;CeO zHxb;#74~Lvmv{}4*ASH<{)liFu-A>0F*3Hb}c zy^wn#FCyFrxfk*R!u^o@AkQN_0J$I1aSk9$JO_AEJT9I9J`3iA%o0yQa}xLr*lFNX zz^B0uLOLOjBg}?8C?0~$77s%ng8Uib5y-=kKOsB{c?9wp!dK!8@g?MQgs;Wt4#3;u zd+`?JJA|*rXNY@wa-@q7t2=q>Tfbh0> z59pqFAM!pl@1VI0ep|eQ@Ne-?@h|ZMq~mV{e*k=h`~dko!haw?LRQ!Oj=u=V2#pr< zlUPmj5B{n{eio~0KH;w#MM&(8nu-WTO$CG+ND(p| zp%)8q#uqZbrU0ZbWEq4(ngC6p z#t*mvWNCy2A^o5)f|x?U1vP~s3qj)#oj-74jm2M63Lps5AF?FEV8|fI5(tYz216D{ z7y?;TQw%ahqYS)VNXo3Zy2Q%(DqZLP9*2{>@U0ScaL&ND|AP@FAx-9nHzfx76ufbr zyCZ#OJys(AEK#yx)WOv(i}bPAxy(*~mU!ZysVi70(pxE8yHI{5ZhFCRCB91jC}qf1 zKVRI06o|`AxaGG;ES-PLL6#ND;XGUyG7e#R$a0Xe2ty&uL)JzZ1{o@ZLxw@tLRdkl{#2~C7)IeAfvVu?vvZ7EKvJ#{nVYCn_Lsjr0vKnsA!!V{8# z76LB-W`4yY;DwOPw{nbw>T9?h%wQq!BN=?v|KptzylA1Fh7PlU`HSi z!`ImYbd;R2V~|JT_b?ai7&%}+K{7vxxnVy;{sb>)6L~<)89M^L6H+>jIGk}W5P zD{jBG&JN@s$c^|2`2iYs zEPn&}S~v@L>I@`vt3Hw!@fLb^=6{axA842_#e9i((7Xj^zQj8m^q)JB>31mJ(YgOD z{FzVW(|m#la}k*NE}!ss3GxzBGRa&K7dapAg*(W32YH#}@gCZH%$)$b4eb?#%pJLn z@ILg+$9RhH0pxw?Zz0BU6~PtwE>EGp27DEs%~SAe!mnVz!Fzd%mNA#>ns5`k>yX#r z4{@*P3BnuDTqpPIkq`jCkNG0Z|MP+qs(};`2EdIg48Noh`69_40ON+EC?6I z50OD|6a7RVxF+8C6Ci`&L>3V9f%yRE2gASN1s(*M9}bLwFc^Q#6=Kd!QAp+#F;^!9 zvM4!1#o-<>|G@~!90eUvS#o~LiViD)iChgcB=Z-d5LzJ3@DHMZtni7V@W&jKvhb#? zf$=sSskj$^r0#$)z9u;$dxJOnMxC-2*2nYNp<~2pY z=}06eg!xph$$x51o>L5BnA_3@VGMa$G0?XLX1-Jm`BJqYW8j{&gS*leK2%NMj$rMf zZwK$B8BjA|=BY4`Dvn$k=DRp*gE03c4iOz7nUfVqPF5XAcslTX>fo<2xjW1gst^1X zJf%iJ%nM^)6Z5);;gmfTlAXJULo%m^oyt=onVZ8->mwkULo^BDNXQWm1ngu#3X*wC z?8HABlKDu?6Bq-@yr~HY$3l*QWUdbLh{lq4G#;K;3Ou9Ekewiz^V0>A`C-fj>I%uc zFXrZSgX{{=Y9LS&IXsSJ1W9nYnE#VZeo%MFWcXCfOX>m1ye#H3^@L>p7W1H(AJvom z2j)dEkAnFX%&S;~a5m&Dcpj^PnA0;G9?2?j=JYV{WF^qIhONLwa9ek(7KnvldEg(m20l9Gsd?MC= zA0+cBm^ZSIyp;W-V;8v=8KC>g$2kC}WIz6PlAFO?l*_;__!-PaxdO}_8Ri*fL303- zxhq$pxdP1Gm21FP;b&X`caqa`9UA5yG2hAwFXcRZsO{hf#d8jFNSNz#6RI0f-GtL} z5cnn>lkGs+%wR@Mm~W%ojSTdR5FvIsx{QJfWB5_Pm08 z30LSH+`(Jq(7Yn&=QZRjxI$0i6ulwm=M5a59CCqj$SKNkkPpPXrH4qu{2+#zC-j#5 zpIh*H-jWCOmb{|3D1doF%K7pF|Vj=hp%v11#r{E7+7?ODuMIim*NfaP| zf_WVQ@IZXwbL0o=76_jxzvd6PRe_qn;9v!6m}eEJVLnx$hIvzg@Raf+)h96@vV4a8 z1V1SskO(QjFJkTv^Tqyxi{t~&93l-QT%yd^UzIH0EwfF}l9Tb4J#k{(=JZK$8z#pk zCQbpK3OpTn2JlSa*}!vvzXeVMo(DW1cmeQ2;6=cTfxiP@0{lJjGGKN`vl4g}@M_?- z!0Uk518)T01e~6EqgTm^qC*gh)!Ce0tWIKL@j8M~0=NWlN#IhzrGQHVmjNyVTo$+- za5>=ez@fmQz+u4Qz~R6ZfGYx51g->J8MrcV72vACRe`GkR|l@1*{4s*5v(uzLDL_a z{)im_JP>#w@F3v9z=MHPfQJAN0UioG40ssuaNtznRNxW7BY{T(j{+VIJQ{cm@L1rn zz+VH810DxF9(Y3LjlLzPiH;S(E1_G7xRt=GfL8&p0$vTg8hADE8sIg+Yk=1RuLWKU zybgFB@H*i2!0Un618)G{0K5TsBk)Gxjli3LHvw+~POp<#J24$39b_{iHUn=4{sH(0 z;2(gu0B-@_0=yM?EAUp}ZNS?yyY*)Sx;gzEH0Pl?kJ$6T7l1DSUjV)cd=dB}@Gro> z0RIAf3HTE5C14k@3)lsG8Tc~rW#B8oSAeeoUj@Djd=>Z_@HOCTz}GYH4=6c>)#7ik z4~Y4Im=C}ofjO$SbM0k=Ca5}IHSP-EX zp%b@I{0#B7oC@UBE&C=nFt! z0D9nbU{`^C4Z9{Tc`j|Q{h6QpRwL?b2|F*?NPkVA(Y z!0Es)U_lSP9(q0W!0Es)V8H;r0eS=U!0Es)V8IBz5qcx^!0Es)V8H~v33?Os!09Fj zB0vN)BFu;|BLX-b*aa+DptnG8fgU&=*aa+Dp|?VBg&sH^*aa-uptnJ9gB~~?*aa-u zp|?YChaNZ`*aa+unSm-hdv(qc<6!CfnC5t3+P)w-vWBzbYK^-kN|xG^a;=> zWIi3rMk>*jgqUQ+BqJsnF~I4-E?}WM^xdKF4n1%>unSn|0euhXdq5AI4(tLJdP3h5 z`kv4Orvtlyg z`$FFrdf;?m7qHL|`hL*&gB~~?*aa-~hrU1b{h;%NJ=D`>f9mvJj z6lR#ff>bv#L_(ZYSBL{n1nv(k0WSnj2hIj|0p|b<6On!*(oaNs;6&j5z!LC6;B??@ zVAsUVm#H-Wgqg@O6FFug2XG>Ae_#oCA#gfyHn0mg2UwVe^s|tD7SaPJ0`~`&fENO% z17`!ffOCL_*+@Sd>1QK7a3XMjUr0;dCK1G|88fQ5NTKM(2WA^p6};UoDR{tmgm zL$2?T3pgD(8`uS$11u~-t|iE|1i63{f%^kXzzc!XfwO^Kz&XIeQlwvs^h=Q*I1#u% zumrpiI2||}*ae)kH1q8!n!_P$kz*}#tVIss{=gFOLf~}ZY+x5~4zREeC9FgGbx04K z2;3i70$vE54xA0_0?q*z)+7CTq+gHpz=^>9fhFLD2-){YOUHHF0U+W3u?U4R&CbR! zp7F^+yl>O^nv9?QoAbELCBzfnac*mPmbmRH=ks&$3K!|8-{xGmy%h1d3!K+ZH4*Qc z%{cbFv6gsJJp6$tSoV7#;=e57+;m+cUTp&BCo<;{f83q(m+}(g0rfebGI#^=6%{$} z({LB@??ld1%N-*A;l_kmR=zOz?HN*>$bbU>oBGpr;=&BhTPu%P3T{$A#MT8&8JLt1cNcY%?3XJ5`MKeH3x=lq)TSE(CEe8w=&V-__aezL;X zyh|ECZbk~};#kU1%hsCs<_VnpPwhawX;sd*UFb$U>D(Az!P32nKO4@uZ})-3--K|U zzJ3_-lpjY^`U{Uo6YtZ?!4<=+I!JNt*(geIVCN*_Cnj_L_S_WW#!{RgeL9_Zxh*3p zy*=M-;!|sJUc3BU;zLf2p!jo^`NVIu<@~p13yGg_+)kwgqmmbsqDF7dze!z6T$eMP z;@?kMPJHVC&QC8~MSN$@FpB@YW-al!KAcb8zJYlAyF)3y^Zs<=AKP<2?C2Kaj>xk^ zD8boN+ewiV$9dv~4B|06QYgN#Yd7)I@xIQ16mL3pjB$r#4dsf~M~+j16^;RvpwHe@#Mj;IPkiu}v&0)&Iq$OK0`Zx1 z`%!%LxtE9!e%P1z>2X(x|8C>Fe&6fFLudA(c&X*D;5co*z1o`;4%;0{FsKsewzBt$ z&rj(^@vA;RB;F&lC-EO|KPG_G-6($Cfse#Lt?o+v#`Mp`^_RO4Z(U7fp;R$H z=MQIVh+j8%rua%Py@OlN_VPE2duD2(?x_<%U zg+8?-Uic?J;$zBlUL>>-@x8U%QvCYS?2|!3I@KwW__=fb#CMKtLwstb0Gj{O(7E&} zqi}FcASEcWz7-|-=5!G8sry;`*oY#OL^y zAa44jIdNy}lEll4oOfI1C`F1te49~%K@Uq4&+>0d{7FPv;=_WP5I-@b9Pu(m8xs%O zRi601;6}vvz7HkdGO!_Wr#YPX{Xz|hmrt!gd|1Bv#4kIxS0shkr+TEg|FjbE1#jyT zkF8XNc;urx#GiJqO8oTIIO2EaS0g_9cr5X9KUXJi*j=0W^1mX8e_U0IcvAI9;@4)? zB<|?ZA&L~IhsTiO`>D}9L5CW|gLmqP3$^XUvu@~#Hwd*6U*KgVzEiLgUs26OJodJk zxT`sZ(!2en7feGe6n|+E<-@I08fBF3rWhzg@-}*~RK6htt$)RPr#jOsH0zS}IxQYw3B3TIvaDK@#T0R!A?kWz#UL6A>G<@@^uWSnXsD#Lcp55U+@!CVUfLQ&Ln%C)L1QabaM9Qc zo#xWmORpA&QU0IjlWj;P5@9PSUx-{l#v`o?B4ZL}$Yfm7?6YKi!u2#VKI!K4GW3A5 zv&lFmr4AXZ5I=>CSIYjAtXmj7j;vcs+)CCjj2ud{K}zmkobvbSNwY<|SF~6xD_^LY zNYhEWbBv~!@V*{RH>ur-V9M~Vj;5p3ssc?%Azx{luF|=40Tkcfs|^dKD`SfgpZtXL zz7_q6Pdh{NUz%~6)(4^MHd-H~n!^h^D1qNxT0o>pCH(jU2DWFR)Z>6J@skZZ5P#4$ zKk;8fX~B}b1zNC#eSdKN^9pZ@?{=D2I4P<&t$4!m<+K7yU)`V;Qg}DG3q8+wltZ8l zcWcs;D*YY)i7lzZY~OB_pl#v@;=f`w`{8qW|#FrHsMBLu`5OL!M&MUTc5>JjD z%;FtV>2~``5$+;|WNW*J_?W&a^nd}af8-hd;`~JXPU6?64WamUjkXcLA3T(J>9`+w z{$-q3v}_{2wBj&|A6b1p@y44N$NnE&b`2>U5yL4#kpD{Jv70&X_s{plr&LX)c9#?-1rN3Oe zAMrm|jiLE3E&IJYDXM(r2`c{3nfU3}V<|(wZf%J_-pKi+fCS>BK5+ic!N$bDZu&K) zPZ?N`_}j&tcQ0Ox_^MZr6^Z`7h1sqa%gSuyOQ&KMPeSUiU}NS8T69{Kb3D zH?}HEyntyur7!Zf81eZjoIjfvKz!y#&Ra+O@%*<`e#(pZ!63&3dcfbO{$?(f@Sz^( z=RQ3rzIGVrwW9A5&s@%VVwX$A&Br;fGvjCCWnXe$HDe#~lwjV#syDU}k1%uIM_ffb z-qD6Dyecms#f>4HM>d{D{K8Dme{rP}k6z9B*OeBmMaT^~q31iARA5#fqPCS8+ zxwLyZ=RLShNU#}-S8YauO%cD(ZAv;A#CiVHusH|j|BGAWDM1fzl@hF$xN5Z$teW^+ zZq*X3o_GkidI__FxH>B&%o^hAtdTIQh=1m@O0sD=UyfPlz|cvUmy|%AmlEbJadqBG znAgPBc`aey6CcCpz4T}!=hOMRAYt9$&*STcRQcl=;?aCvk^Wf4`47K$=WcgweXh90 zS0)K77iCaaE(t3e@gTmkNw3Ru{+h3RQrO;66u+LYj1pE(;^X-pXw)!sau_#nP_ zNZ4D57vp=2gw2O|u!Ch2}o3+B8G-`ynaeiX0nep2#ZDa6&? zQNr#?T-`l!7#&R9z;{+C-MDX z!uf!>dOnbFeju)%AEY1e_anZEpD&~nHHbTeZ}9@P{h>}l!Ox&arJ~H9bVo8+#v|J_z_Gxd8a!i zNaANSX-X*PWBD0Q!Woa^)ia)iGazyG3@E+5(2aN{enymL`f}cxpCP4NHM>%Lz6x~4 zlyC?=$jTRdN6{fv`e}J*O3;v>Ql&1ZI}tbVQ>?W2kB-FEQ?7(lFmd%1Ea8+){2@Oj zOOpn+C*GT%qNRLu+Yz6}PuWt^wzdZyZ0(L2UNDxe12fJfQi7@coG#%UPh366OC7v8 zcky$+e+%XwGZKmunLSG8czwj zaZg1WIIcPIcHEPZ;OP)oJsqjc?54!O)l-tD%Z-Vvo|F`^pb_yk+|!bN zn(t^xic-uMLj~Zg5m$XR>B)@x#4B@OPJ*vTT=n%NzcKZQ%iI@~mJg~+`~>$ECHRuW zRbNtquSs0>HKqBE*jQ3n$r}}<*4o;{7jbV@f;UTC^=2h_yTny*R|Kl!_^Q#dbrM~fa(zz<}v+5g>I+dyr*Q#$!@J5CBLiLTxrR^1od(#^i2QFMw zE07{peJ6u=HpCyO?`(Fz4<+74eWw$!t32`j>N}s~L&^~^r@j;VEut*(RP~(^-YF4x zzfOZl6hJ%`Z`~XyUpRBlpA;GDd%1O^3ll%BzPH1BJ>u^7dIf*- zBR*Dr?}zt-#NF=&@!pWQ`@JFFD-w6VSHz1);&|`qh-DSPn@Li*-%Q@0ts#CxeRG*m zO(b4feY1IO`e!GyNe1=JC*F(_cfT2({`@cEGt@VyA!Ys`epY?6TC~wS;^#g%lBfdf zhrT9-``v8z;upl-?{4vKm$>`g?*7}4iQiV={o>s)are7nygMfDes}z}?GEw5>bqsU zd?x3f|N;p*GzQ{%1>cfY+3pL>b;5cTbLhZPry&r;uh_uq1scw_bLc#plO zh_6@Qo;N>oocJpB?K)n+6L+{@zvKNpDctYp@&2B;`~Cf$%Lj-n>id1X|0nK#|L^VE zO}wmnKag-CgLqB#{s8w2#NGD`LyvA@+#$IyAaFxL2|lPd6w>w$#5<@r82_wUOWb|K zab)2t;u-1<$m=P~iMww|CZ#SV?!G~pki3|&}<<%&i^OWD;V6-Py+WIO-%W@ z#NBr|xZ@%2zT-LgbUJbO9ngz&Q;56oh<5LsMBIIcG_b0J_;vM;>BQsFPPYF`eOiqs zBV4n77$tDuQswJDkhuF6>+e#%i9c6wx%OP>M%;Z1hFdb??pv}rTWjL(TeL=xn-O>4 zvejGEz=`q&3HNYRfv~!9l)!yYSLKcKBDii-*y(hdp zF_d_YdXFenC`H_T&$#JuFz*s}6N!olSxJQ{L3j10a@Ifji2r+&xmY0XzUe&N>s=OW zfcqx2zVe8;`=(U-={j-uP3n@jXNVtHZ(948a~vWC-NoWbxT_`ZzN;NNcmwg3>Rs*= zc?t0%>Rs=TnRAG{?}Dpbmx#OXij#luL)?9r+}09L+yKlRH-@Sym`!>98(|F?U+w#{<&hBUF-M8tDzT0YK9RH^t zcX;;t9ro|h>vuN)JbC@j%J<~;JKz63cl|z^@BbdVe!uNVrD@=)>-R{9XRqI-fA@dS zT)$)g_vrOI=ATEe-`V{42m!kPEdF=XqyQ3nT|B|P!-+MSbd;KmrJbV2P z`}gSeJDY!=ynbipd-D37@Bf~=ei!)u@3HImct=icjDX;&>-X^v&tAVv4$oe{WB>Q) z^*iRDN3Y-6{P*PbJKz63cm2*ksg^u;{ocmG42*JkGr$#d85Gx`0$$FASYI@YlL-(%PBVGhq;zY7k}UcbZsJ$n7l=AS38 z-&y&dyna8($`?F${oc@VkX68A*YB~8SgL@huHTIg&tAU^4$oe{!~Q*b{m$l}C$HaW z{(JEHo%{cuyM9mN{=dhr->>q|=mk$*zgr#Zuird${Vx6c`#;ZIzvKMx(d&22KaXC& zv-$7I>vw+t@44&uLk_y#_Sp4%s>8F_?@JvX{q;M(fAQ?~JM7=1*Y9lpdGOco{P%wz zyng5Vzvr&sQ~CbyvFrD-P?hC^r8k5B>UG*z54HrQZL0=-2PkE{8{d{f_zX+3R=Ae~(_jWB>Q$uiyE<|K-8!cYgox zx$E~e{QlolzkUyE=h#p8{~r4FyYP+r{hx<^{f_<5v)AvKe;&PlXXk$p{`&nOE8mmX z?+01=9=v{!<@f&{yM72bN}CS z*YCag`+tvJzlS;o#ciR6wc>T`z zf6raN58?a2$FASq`@g5I-~avhe;l6p$LF#1J3M>+j{V=G*YB8rp8WMYfB)~n>v#VC z-($ai?+``v-*eaRX$~tp|9j{kpU1yF@9^Y5KF{`l&tAV{{(1EJo$bG#ynd(s--Flh z^#0$2*YCgZ`+pDpgC~t#`fupML&(&3->)X#>JL#phM+dCQx{=k4p?yY{=f{=J!g$M~N&?RQ-N zUbNq}|L;BfeZBVoy=K4D{6DYR@5hP%EtMW`EE&f%=h<+`5r~g z_tggTJ%*U?zUgGXm$I4f>W=HU?!|$8R}UeF`Tmv%=KFCE%=fdzeE-@F^SzK_zS{?I zkL#|kKk2ZU+%exDC+52^G2df}{ZxpU?`zyJ-}e#o{hz-x-*Es==v~37^dPiDr}D&n zSM)1yHp&Ee-PB$|UoB0Wsgh(#L#HgM7C#%Y3g$ z%=dc4d~Zw4_gViZ^F0mnU764Z^L-I9-?tL;{c&Qx#}V^=G%?>-5c55inD2q?iekikkG@aly8@2l`zUdBm+NljEb~1L z^4-c==6f3CyOmSS_XsfGg?#E>*s%tG2hc7-}M3H6!Sd| z^4-c==6f3CyOp!d_cX|NE614cMQ!H0I@#}a-PQF!m6-1xYve}Ax_5s}Ey4%;k z!+h^stPu{tVZM*--xN9vneX_%yIpr&|L&OY`O?XJ-$Tsz@gAA)({KQe>wYfoO>IJF z74tpDV7}9{<#*^J*@R+ z==X^E-ZgS7bVix)YFb~SI@!cxV!m(J%y%)_K)ze|%Y08F=6mT3G2eejzVFb;cT4ml z=KDlqzRT=nzN;3w*L7FtzbEGVj`@$caNTB*`K~6n;!iMvnD1Q`^WFZFgc9<7ij90% z`xle5i1~hnnD6b}Gv9Flj_W>LA>Zx&i>Pd3zE>ya`}{l1ca3~6Nyzt(GoI5X^u@QI zcB$h?!+ak_%=dWR*OU2(`93F|%=eSTd@psqBECN^4f5T}S>}5h?^WC|-wzS<-3dAvp?6C-%=Z);vsq;@-+hVszQGOi{VXxxhq__DcPHli z)qF47=YZI75At1||2fHgw-4YR*In&jWR&^-4`RMQM&p7RV7{XT?snbn{fjfid_S7) z%y*4^UrfmNiHSY%`YkqlV7{*<=KCpPzArGC@AVAk`&eSWJ7ddg@Hs*K&O5-<-(7br z8cmXvLFRiugZbXe1M@wInC}kq-ItK>{VW=vH<|CpJuu&MXOQ_mNHgE>Am2L@^4LB8t{dU~1fpL$@vcQ=^t?F{C7kb!&; zT@m%4neQ%x`F_P_BDWTGMT@Y{&OST)?0zEDz8d6HTQGw_u+Ppud$*)cI47!y<;IVpIzKZx3kaAK0EvD?6be|lMGdlRq@1c+W24huM*J9Z);tnd1OQT zv8!~VyIJdbHIC>zjXm9GZRhoe>?-B4@fj>awq*3H{qc_tCReCHw5`v#*(1 z59h?UF|~1yu+PpuJNxYHv$N06K0EvD(Gj1r&wfKsHR3!w=h->Wp7i!Y^e*Gi4YA*s z1?Sm0&)&KcTqGIzC|o4Ld3H537`@5hYcJs{;XFI%*=M_4`kc^(`-A~;=R7;-*@fUd zd(&x{-X=c|+HJpRh?wfH;*Z}4L)TcO z^-o1RLGPcY^~Hn3ppyq_O)V-TU)H*?F5E8-h&$)mInOR6=h->W&UyBUKfIi1zx(wK zEQoit4!N~HINBFFPs!F;zkjbE^jkGsLANSb7@G6!sx}&0r1|D&&?1~?@7kfd-6C?| z(1v!4aGss>?DtfWx9pRG^X!~w=R7;-+28mrZ-TlV$bwt{f`ok}cH={4s zH_UrTe_w-s&|Ej3>&A24c&;0Nht|$@<70|wBR(W~IgEP$e~(L4w_*{pavgM??OL~- zx(#~uJgs|nIRL$Qh}Mm2oPxgDRO^&mKSC!K)|%_aFVnyZ&a=zkY3*D$UcaG8&a-z( z>Vz9lZC#Z~uD#X~n(M}Ix~}DBvz~{ZzQ-S$^X!~w z=eqIZ%lp|^g&a1cwS84^-FU%ycFwbNo}KgTf22J7aD&g@&)~C%Wig+9jLB!8cQqRQ z;jiXs-`wQ0@605heYht+`{XZ<;sC@{&;vzFgU_z01X#bKieCSX2R{2(-F;y2^_Z?_ zg_wMHKa}@^p+0SG#pS|U0+tDJ{0t-PoVb+ZwXzep@Y#Krw89a3;lv55A$U&i{wI_Dx(4hEWXFk+hk&N=$E2YlG-|Wxt55wQA%i%fD3rm9QCLi503wp#~wXT`neD)t6c0T)? z%xBl(YN5i{=yYfK0H4+om+ z;mB3QXa6w0eD;G>H~z~9wQhW|x!v&#qvNmOPjqR2H|X;E9Z^opr*-ExH?jU$XjiO% ztlTYV^%4r5VLtn|EaJ1P*Kiy_L*lbfb@=SBr<2eA2<6$o%%VJdtixyTcAtFqqaJ+r zD#T}h-{7;CAU=C1htGb&4WE51@!3BnK6`%Rv(HK=pIsGCLz9=xDL%XEO=E}Do0bop z&#nsW*#{_(IDGc`zf{438w(q`?59}iZIz*Gt`37%q&(=6G~#i-b4BQ+BjH%znE32f zGs|cH_CERS-w~gEn89aHDA*ha*p2w?*K&%_u7=gnLe8jKmiz3Bh|m6bR`Jxs{PBAtBpF~nydNMp-t@EHei>4+X{&NQF>RfEsoGpG6N zc|7phmBD~toEkm|f07LI*>AkR7+=shdI-KCvwZfm2A_Se!)H&vPd@vFy_0Z&K_y1w z09VIPfZj1t>;4rj=%eSgHu>y-&uTtVeOG-r%!W-{|n!*=J{; zoqhI<^4ZyE_f$8YeRlTQv%GFR`|PuG2ifmfGG5ffyVinA!O&qR>OdcS3IEH>>#9#Aj!p zoqhJ5na#7a&(1#k$eWl3D_=`|K1@9W#F*w|a3hN8-xT`N-?WY@)(HAoiq`!$)rGEK z75#6?K6`HV*$aMe^WUYl=7^POpG@qtv(L^xJNxYHvzvK#_SxO#+1Y1Tv(oYOq*>{b zefE^p@^*{Jw=XrZUrt53^X%-iCv|FrCi4v_fF@iU))xBlFY-f=F4GR0ef9;n&m`C< zSw+i=!&|=xKK67wbnJrg@S=YN9S5-mn0Jk77oom`$+cLcjeaa z|D0#f^<8YDeR;6Y&OST)?Ci6*`?xqBld7kK`vUvyPi?7&7V$gV04)-ttGh||**VXy zM$PPVLcYEZW$6Ux**VYt(r4Qf>~mrvRf`SU^*MCCfd2MdJm=Xt&(3-FXO2n) z<|~auzg}>jU3T51n}X}cbKUsC6)iQyA>`NRN9vP;eRi%J&voPX`Q$@qZotv@co|dk zR-v8xP`+Q}hmNIrt%U*#K(C>BuS;Tmpm)){Sgsq-b>lhDzAX++0a;uZD-_jcH^Wu3 z5XB5Fk?nkT&a-o#o%8HmH~#uUP?e|Da&(3w@xo*5W zK0D{x*=J{;o$JOIC0gPR|0fddr{;;Imi9n`V4t1q#&g|xRS_6732L4jimPH=kH10J z?*rVM;JWc#H~x=YH-3Z%KD*1{vxh|NLBY9@RBe&|^_;My0&>a;t!u9+0Uf?yYuB(~ zXtzH5e1p#(d{p8C&Kw1k&;IXOf5&>iXY~#y4*URmexTOT5uZZO&84+RKKttipS_jA zXWwM-*^e1~_Q}8Hg=<`JtHvOB;RlT!tpIgP=R-(;S8h=j%hS zOF*4Skzqc2BZJRg@bwP(!sZoGs8X1GcArf0*@tG6K6`ABzu^Zq=ws=pfTz0g zJKtW253D?=X(bu08$X=*>{b6TeD=n~XMdXb>{dqk?5Z{pn%t=kwED#N(5H#fCXW!)T z*$d_npS}BgCD3A536&LdrX=psas#oneyHM)4TcbFYsa9{(50S0X>Z|2eD?K4;FSum z^Vt>63Co%$?v;K8!?|3X3kpo#e>GVQbbQ{DJ?8kfWlJmuLH_7DfqmH6y^h|iwlj?aF@ z;IqdOpZ&#hg|WlT^4Yt7g8FkZRD&T!{u!u0Cnpro@3QPBd*J!(Mdt$SCi`kOr}()G z?&-4nv7hZ*vUn{Z3QayC&jsimC$;WXqm7Z!}_8-opAZM{l=;1{iTM8-oO zoea>MY}f1)=#(OZ^%sUO)1QA&>p)Go74HV(O-YWZyaekbh|m61M)~YjA2dGuN#?U( zDvG~pTnu_V^88=@pj9#$=LA*Y7C#*)4NFsq#KJm$eq+}SyNf1nHr4ac<=$IAV!`4e zdV@waPC>7kr*)ey2cS96zWlb8Xg6Jr7Lg6rfAWdnv~IAr1iIy?uW7yOCkb8bg4VBE zpF)3nMr-!jv)yOE{m}8*KguAVeQCMz_H{4!v>1t#a(v^7(ASC2o-eEU>`{m3Ub z4#N)V*&xF{8Vc=>&#oRmSWge1w0!na#Am0cm&`1mT|Hj0!w~&+mEB!hm(`D7sUFW* zA86_4v-HGg4?Vw}q5azrY#U%qXAzN#e8bal>a{N__T-4xfDk@!2m* z^xK6R+fA@f62I`CF8fcS#(tqs-6x-24L;-ZZu#uH#vaB7S3~+@hh=9RfF5*4>-O{a zL%%VjAJ%6(pZ(;a4cOs3RIm2Tp|#L6rlH?1%shLm{VTD);Xl!B7hdPHTZYg6T}Jur zb@EQfFPhv)*Dy{@odWIDG(Jy!_Tc;Ev%i;7KKq*e-EaWi_hP=h@OixhwBwRBHu&s~ zvzpI7F}wKeJ*K0dE;7q!pO{%b`_O?OY_zZY1?1)aFzfHozU1|Oy5>#j@1wN0>nYFP z&Zrw-dsr|&@0ihHE22tZf#X(>Iwzo~lAGNy%lPchn_}n8lL#u*=Ii%pzFjx zqDL4-j@ON6pPha72c~X3`|Q5#v$tv7$Q}SJyF*VD>=gG5w4$Bck7+qI+mv#*{vF41oKo_g+uRC6<+ zX>Nv8lQ*DK^xO@pCU-y=O~T|3sV0Bu&u4d@oqcxp+1Y2m9CH@q23zL!#ASCp@*K39 z3TbOg&|FA4F#rpM)N>`JnoEff&|FGcY;JexXg$|bUfSOcy8NW;dSD`-)}7njggzG9 z73&`>cMDn-Rf5hpQn>6}w1OKcZ3z*Ptmn&n%Coc2UTS)CG~rx5<5*^v&(1#kSJq2) z(4^Pa2fOU2+Pq4^wwB>1>OiahKJ-da4|;8KE$A0$JfL8FP3T9$>SO(Tuh)P+(xCx# z*ACU8_tC`u9+j)<^>2h?y*2-rDp+uXk^$_qv(L^xJNxW6-d~(x--sGVW4^rD^7cY# zCuw+b(md#oU)A|_GtbUGJNxW&FYShFy?rI7%L|WrcJ|q2%ggBS3(m81o}KgToM&gB zo%8IfM`Cx@WG$Nct7Zm6J2QjT)M02nbyx__vvZ#Pbjxs@6D6-#wEwq6X!pig(0ubV z_WxqhfF{ser&NIEJUi#v*=J{;oqcxZvvZ!EeRlTQ&n_LEXul~<@oNbOF{!oI{kpY< zuJG$9tgo@GGxW8ES}(gA1?_rP>*HqKc+RtPo}KgT?)dENv$N06d3MgTd#W4Hd3MgT zXPVE>d3MgT*O?uZpkDK(Q@5J)?3`!ky77|h#{c}}C|D!QmJC6MK4w)c^#1Q-p`%-A z&2{5dSr@cOsuhlMtm6M2pPlpUoM&gBo$JQWcDd|lfDEoy8P5Xt*;P45vch zZv6Co-Owa$brwln-LJL3&MFD^+1Y1jpPhYn_SxBIXP=#YcCH)Gb>lhD{#MOaiK_b` zT4}zNkQ?1Mt?OuJ%|b{Gfrsi) z58}5JfevV;w@<@oKW6aReNI%s2d>N-s~=+qpFP~*vp-|-*(){)$LFUG8H3M<&Up@c zXF083`2Iy``Q>Pr`u##QF!=0##Aknj`0O9=?}iUJWQzPA`0UHG+h-3k`0TDSGjM=0 zyN2Tz@2wjLo!nOIvoF34z5T>6tRIz8K6?`J+2hm6XYaE9f3U-w?LjRSLx|5_jriW!d=_Yj&vNR}2Ix7&Z@F+F5jwadxU9l&{}$-J3E;Sj zpk1Fs*9*|P&7=R`0UaXpS`Ys3XUi)rZ@gZ?)dBuqbH+$ z_R`HR;soy*XfKOVEXKZTIRv}S<^e} zANWaLm)gIOfB&=t7JTWW!EXJJwufHy%47Eb@^LqOcHe*kSid%`Ew=w4)(3iLr#8_0 z_7;Tx=ZKe~UoYRKidjqGGxC2SwN-G%K{l{ILGW@hr)Rhc%dKSE{N{{Q9K)yM>XA&pFkHdVu*XX}v* z@izJFb+XE5A4`1pkMEPuUVU~m9N_%IWz_$c5SgtTKX5F#ZnDkC#qBQ^BZ$x5gZS*x z#AiR9UOu}TKf@8y_?gJ|Jo{_?al?_lHCa;Ziogv?rfBk{$nm=IY77-EKs7@^!{m9qJ2lacyJhW@*u6NJwF*b@@1_HSC|c5rHFkBq>d^jzGV z78VTu>u@Zn`_WA3g(bCqbjvJgHOC6;O+I_A)VWyi@Y!R2`)_EgisrQ!Ew}(W+xYA| zBjd4y*uF71z?jynpvw`Ty|%$;fBJs;?CSZC9gIsSpIyCRVEe`T{X%YUp!H<^0wUE5 z3f5cnh9YyC&%V>C8{fUkk7%+&9QAy7BqVy7A4ZZhW_- zPWXcAZuso#Eg0*Go|Iuedw1fqHyrx7%f5^=%xBM2vNaB1|6bjXH+^FnKNGG2?->9bef;o}8 z+dgkV6X+ef_L($&_LJnZm(s=4Jp1gG$!8CCNoUB# zpZM&<(#vP}B|iIxBIvh^ZRzB*C%ECWZ+PhW?2BJ{3{C2c3-0sD2R(qs4HtZp7up$D z^lh03+8KDP@bBEvt)n{O{a>U^|1T^^rjg55#Ah%6Xcw3I+lk~Uw-fBYVeLa&XVzz5 zLVWhu(#vOGn?XMN*pQPr-~r{)Z5L|r8QLwMJt>2H_E(ng!52PHRMlQ9>T2`P zwnHzZ(RDTa4($xT`|RHW-Or-&c{P5I1$SvSt!pCyly zM-y6R1`c2lc{rZ(>^~8oJ;)88y>CSe-*@!CM>Qv10o~d}?9A+*}rpaEQTY|K8xUuQK@T6^=@LzS21T`EFOEp}(4=bsGp?PRprXJ?@|(507;z;l)J?3`!k zJUi#vInTbJQm}nTlwl|8;LdpPCHyZhug7u`Jg6?#AD9z_^=oI=gFY2g8`|peNeC8{ ziKvAIm6Pg2&n#6F+V^Y&==ypFzfhI*psA9c;5<9$*;Nt<=L98z#252ALr3VOkYJyk z^Xw{8sP7y8@7u3(LPZX3ZOOtqb0|2^t~kqRBH}Cy_Sx6W!$f)6rptjw_DREaW?$nLvJUi99k*Xd}qJ4*?dN`8v?3`y;fGV65092_yV((rppwH;ST5|Z{$VAIN zX`*!HE!ltUOW2^DuFNGPC%p*0>H1SHwV5>e?3`y;y=Alz^_HdTO+!;}TCSN{5Bgi( z-IhUv>OvpX-EsMq^->)yxJLc;d6j}~EyJll&v|yvv$N06d3IILHo?9xIQ48f&(3-F z8^av3k+mkajUQ>Q*_zg5b>gJtn{sfrOoQ!PTVEiMAO zxGq*GxNdy@8JHI@Clt@`vg{Xft{eY(k={5-R=@QvT;QEMwGRB~6g1b3KRS63TBu#K zPtYPMMNnT(mJDA8J?cHJ1M7YW{cfQ4)kjob0?j`A^@XF*f=jPPp+%ngRcUqo$-rfu zv4DN{#Y42O-l)bY`0DJlD_>Jw9evc5Uz#g;%va{y@QUwccENp}g6bTR7A>o~hs{}ogNO>9MvvZ!E^Xx^M uT~4r1!o7s-lFzL|mu< delta 31678 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 diff --git a/src/3rd/js/three/hashbus.js b/src/3rd/js/three/hashbus.js index 287d863..8bfe31f 100644 --- a/src/3rd/js/three/hashbus.js +++ b/src/3rd/js/three/hashbus.js @@ -35,6 +35,8 @@ pub.mesh = (mesh,model) => { // evaluate embedded fragments (metadata) insid pub.fragment = (k, opts ) => { // evaluate one fragment let frag = opts.frag[k]; + if( frag.is( xrf.XRF.PV_EXECUTE ) ) pub.XRWG({...opts,frag}) + // call native function (xrf/env.js e.g.), or pass it to user decorator xrf.emit(k,opts) .then( () => { @@ -46,6 +48,7 @@ pub.fragment = (k, opts ) => { // evaluate one fragment pub.XRWG = (opts) => { let {frag,scene,model,renderer} = opts + console.dir(opts) // if this query was triggered by an src-value, lets filter it const isSRC = opts.embedded && opts.embedded.fragment == 'src' @@ -62,15 +65,12 @@ pub.XRWG = (opts) => { match.map( (w) => { if( w.key == `#${id}` ){ if( w.value && w.value[0] == '#' ){ - frag = xrf.URI.parse( w.value ) - v = Object.values(frag)[0] // if value is alias, execute fragment value xrf.hashbus.pub( w.value, xrf.model, xrf.XRF.METADATA | xrf.XRF.PV_OVERRIDE | xrf.XRF.NAVIGATOR ) - xrf.emit('dynamicKey',{ ...opts,v,frag,id,match,scene }) } } }) - if( !match.length ) xrf.emit('dynamicKey',{ ...opts,v,frag,id,match,scene }) + xrf.emit('dynamicKey',{ ...opts,v,frag,id,match,scene }) }else{ xrf.emit('dynamicKeyValue',{ ...opts,v,frag,id,match,scene }) } diff --git a/src/3rd/js/three/xrf/dynamic/filter.js b/src/3rd/js/three/xrf/dynamic/filter.js index bf2ec1e..4a976cc 100644 --- a/src/3rd/js/three/xrf/dynamic/filter.js +++ b/src/3rd/js/three/xrf/dynamic/filter.js @@ -23,7 +23,7 @@ xrf.filter = function(query, cb){ xrf.filter.scene = function(opts){ let {scene,frag} = opts -console.dir(opts) + xrf.filter .sort(frag) // get (sorted) filters from XR Fragments .process(frag,scene,opts) // show/hide things @@ -45,7 +45,7 @@ xrf.filter.process = function(frag,scene,opts){ const hasName = (m,name,filter) => m.name == name const hasNameOrTag = (m,name_or_tag,filter) => hasName(m,name_or_tag) || String(m.userData['tag']).match( new RegExp("(^| )"+name_or_tag) ) - const cleanupKey = (k) => k.replace(/[-\*]/g,'') + const cleanupKey = (k) => k.replace(/[-\*\/]/g,'') let firstFilter = frag.filters.length ? frag.filters[0].filter.get() : false let showers = frag.filters.filter( (v) => v.filter.get().show === true ) @@ -84,6 +84,12 @@ xrf.filter.process = function(frag,scene,opts){ if( processed ) processed[n.uuid] == true } + const insideSRC = (m) => { + let src = false + m.traverseAncestors( (n) => n.isSRC ? src = true : false ) + return src + } + // then show/hide things based on secondary selectors frag.filters.map( (v) => { const filter = v.filter.get() @@ -91,19 +97,21 @@ xrf.filter.process = function(frag,scene,opts){ let processed = {} scene.traverse( (m) => { - - if( filter.root && m.isSRC ) return // ignore src nodes when root is specific (#/VR #/AR e.g.) - - // filter on value(expression) #foo=>3 e.g. + // filter on value(expression) #foo=>3 e.g. *TODO* do this in XRWG if( filter.value && m.userData[filter.key] ){ + if( filter.root && insideSRC(m) ) return const visible = v.filter.testProperty(filter.key, m.userData[filter.key], filter.show === false ) setVisible(m,visible,processed) return } - // include/exclude object(s) when id/tag matches (#foo or #-foo e.g.) - if( hasNameOrTag(m,name_or_tag,filter) ){ - setVisible(m,filter.show) - } + }) + // include/exclude object(s) when id/tag matches (#foo or #-foo e.g.) + let matches = xrf.XRWG.match(name_or_tag) + matches.map( (match) => { + match.nodes.map( (node) => { + if( filter.root && insideSRC(node) ) return + setVisible(node,filter.show) + }) }) }) diff --git a/src/3rd/js/three/xrf/src.js b/src/3rd/js/three/xrf/src.js index 3ae3b78..641696b 100644 --- a/src/3rd/js/three/xrf/src.js +++ b/src/3rd/js/three/xrf/src.js @@ -17,8 +17,8 @@ xrf.frag.src.addModel = (model,url,frag,opts) => { let {mesh} = opts let scene = model.scene xrf.frag.src.filterScene(scene,{...opts,frag}) // filter scene - mesh.traverse( (n) => n.isSRC = n.isXRF = true ) // mark everything isSRC & isXRF if( mesh.material ) mesh.material.visible = false // hide placeholder object + mesh.traverse( (n) => n.isSRC = n.isXRF = true ) // mark everything isSRC & isXRF //enableSourcePortation(scene) if( xrf.frag.src.renderAsPortal(mesh) ){ if( !opts.isLocal ) xrf.scene.add(scene) diff --git a/src/3rd/js/three/xrf/src/video.js b/src/3rd/js/three/xrf/src/video.js index 8123f68..f4b3934 100644 --- a/src/3rd/js/three/xrf/src/video.js +++ b/src/3rd/js/three/xrf/src/video.js @@ -15,11 +15,11 @@ let loadVideo = (mimetype) => function(url,opts){ mat.map = texture mesh.material = mat // set range - video.addEventListener('timeupdate', function timeupdate() { - if (video.t && video.currentTime < video.t.y || video.currentTime >= video.t.z ) { - vid.currentTime = video.t.y - } - },false) + //video.addEventListener('timeupdate', function timeupdate() { + // if (frag.t && video.currentTime < frag.t.y || video.currentTime >= frag.t.z ) { + // video.currentTime = frag.t.y + // } + //},false) }) video.src = url diff --git a/src/3rd/js/three/xrf/t.js b/src/3rd/js/three/xrf/t.js index 63668b5..b5a72a1 100644 --- a/src/3rd/js/three/xrf/t.js +++ b/src/3rd/js/three/xrf/t.js @@ -34,6 +34,7 @@ xrf.addEventListener('parseModel', (opts) => { model.animations.map( (anim) => { anim.optimize() + console.log("action: "+anim.name) mixer.actions.push( mixer.clipAction( anim, model.scene ) ) }) diff --git a/src/xrfragment/Filter.hx b/src/xrfragment/Filter.hx index 1094987..3810ba4 100644 --- a/src/xrfragment/Filter.hx +++ b/src/xrfragment/Filter.hx @@ -56,7 +56,7 @@ class Filter { private var isExclude:EReg = ~/^-/; // 1. detect excluders like `-foo`,`-foo=1`,`-.foo`,`-/foo` (reference regex= `/^-/` ) private var isRoot:EReg = ~/^[-]?\//; // 1. detect root selectors like `/foo` (reference regex= `/^[-]?\//` ) private var isNumber:EReg = ~/^[0-9\.]+$/; // 1. detect number values like `foo=1` (reference regex= `/^[0-9\.]+$/` ) - private var operators:EReg = ~/(^-|\*$|\/)/; // 1. detect operators so you can easily strip keys (reference regex= `/(^-|\*$)/` ) + private var operators:EReg = ~/(^-)?(\/)?/; // 1. detect operators so you can easily strip keys (reference regex= `/(^-|\*$)/` ) private var isSelectorExclude:EReg = ~/^-/; // 1. detect exclude keys like `-foo` (reference regex= `/^-/` ) public function new(str:String){ diff --git a/src/xrfragment/Parser.hx b/src/xrfragment/Parser.hx index 8e01751..c89e496 100644 --- a/src/xrfragment/Parser.hx +++ b/src/xrfragment/Parser.hx @@ -9,7 +9,7 @@ import xrfragment.XRF; class Parser { public static var error:String = ""; public static var debug:Bool = false; - public static var keyClean:EReg = ~/(\*$|^-|\/)/g; + public static var keyClean:EReg = ~/(^-)?(\/)?/; // 1. detect - and / operators so you can easily strip keys (reference regex= ~/(^-)?(\/)?/; ) @:keep public static function parse(key:String,value:String,store:haxe.DynamicAccess,?index:Int):Bool { @@ -53,7 +53,7 @@ class Parser { var isPVDefault:Bool = value.length == 0 && key.length > 0 && key == "#"; if( isPVDynamic ){ //|| isPVDefault ){ // 1. add keys without values to store as [predefined view](predefined_view) var v:XRF = new XRF(key, XRF.PV_EXECUTE | XRF.NAVIGATOR, index ); - v.validate(value); // will fail but will parse multiple args for us (separated by |) + v.validate(value); // ignore failures (empty values are allowed) store.set( keyClean.replace(key,''), v ); return true; } diff --git a/test/aframe/filter.js b/test/aframe/filter.js index 61e0c7c..d951857 100644 --- a/test/aframe/filter.js +++ b/test/aframe/filter.js @@ -18,6 +18,7 @@ createScene = (noadd) => { b.userData.score = 2 b.userData.tag = "foo bar" c.userData.tag = "flop flap" + a.userData.tag = "VR" a.userData.price = 1 b.userData.price = 5 c.userData.price = 10 @@ -103,3 +104,7 @@ console.assert( test(), {scn,reason:`tagfilter: #-b&-foo&bar&flop&-bar&flop"`}) scn = filterScene("#-price&price=>5") test = () => scn.visible("a",false,true) && scn.visible("b",true) && scn.visible("c",true) console.assert( test(), {scn,reason:`tagfilter: #-price&price=>5"`}) + +scn = filterScene("#-/VR&b") +test = () => scn.visible("a",false,true) && scn.visible("b",true) && scn.visible("c",true) +console.assert( test(), {scn,reason:`tagfilter: #-/VR&b"`})