From 336792dc833658a98ed099d8fbdb09fdbbc8dde6 Mon Sep 17 00:00:00 2001 From: Max Date: Fri, 19 Mar 2021 21:38:13 -0500 Subject: [PATCH] 0.470.0.419147 --- Generated/Classes.cs | 19 +++++++++++- Generated/Enums.cs | 2 +- RobloxFileFormat.dll | Bin 371712 -> 371712 bytes Tree/Instance.cs | 21 ++++--------- UnitTest/Program.cs | 68 +++++-------------------------------------- 5 files changed, 32 insertions(+), 78 deletions(-) diff --git a/Generated/Classes.cs b/Generated/Classes.cs index 1539527..a4359ac 100644 --- a/Generated/Classes.cs +++ b/Generated/Classes.cs @@ -1,5 +1,5 @@ // Auto-generated list of creatable Roblox classes. -// Updated as of 0.469.0.418830 +// Updated as of 0.470.0.419147 using System; @@ -648,6 +648,7 @@ namespace RobloxFiles public class HingeConstraint : Constraint { public ActuatorType ActuatorType = ActuatorType.None; + public float AngularResponsiveness = 45; public float AngularSpeed; public float AngularVelocity; public bool LimitsEnabled; @@ -690,6 +691,7 @@ namespace RobloxFiles { public ActuatorType ActuatorType = ActuatorType.None; public bool LimitsEnabled; + public float LinearResponsiveness = 45; public float LowerLimit; public float MotorMaxAcceleration = float.MaxValue; public float MotorMaxForce; @@ -706,6 +708,7 @@ namespace RobloxFiles { public ActuatorType AngularActuatorType = ActuatorType.None; public bool AngularLimitsEnabled; + public float AngularResponsiveness = 45; public float AngularRestitution; public float AngularSpeed; public float AngularVelocity; @@ -743,6 +746,18 @@ namespace RobloxFiles public Vector3 Torque_ = new Vector3(); } + public class TorsionSpringConstraint : Constraint + { + public float Coils = 8; + public float Damping = 0.01f; + public bool LimitEnabled; + public float MaxAngle = 45; + public float MaxTorque = float.MaxValue; + public float Radius = 0.4f; + public float Restitution; + public float Stiffness = 100; + } + public class UniversalConstraint : Constraint { public bool LimitsEnabled; @@ -2191,6 +2206,7 @@ namespace RobloxFiles public bool Locked; public bool Massless; public Material Material = Material.Plastic; + public CFrame PivotOffset = new CFrame(); public Vector3 Position { @@ -2392,6 +2408,7 @@ namespace RobloxFiles public SharedString ModelMeshData = SharedString.FromBase64("yuZpQdnvvUBOTYh1jqZ2cA=="); public Vector3 ModelMeshSize = new Vector3(); public BasePart PrimaryPart; + public CFrame WorldPivot = new CFrame(); } public class Actor : Model diff --git a/Generated/Enums.cs b/Generated/Enums.cs index e7044ce..c3e3f85 100644 --- a/Generated/Enums.cs +++ b/Generated/Enums.cs @@ -1,5 +1,5 @@ // Auto-generated list of Roblox enums. -// Updated as of 0.469.0.418830 +// Updated as of 0.470.0.419147 namespace RobloxFiles.Enums { diff --git a/RobloxFileFormat.dll b/RobloxFileFormat.dll index 5c6c9380e3cd2a714f46589e399df8ad21a81c02..fb2d56bdfd62c76eaba20de2c6fc0b7bbc975e0d 100644 GIT binary patch delta 20396 zcmaK!cUTnH*T-*}#RchQE2z|^%3?Q21jT~lPgFG6doQ43#FiC7&}gD$l(9!*0eeA3 zBStjVsIf$i#vV(oiM>SB_uM--tNiowJo}ydx#!$-Zkw5fon`6;-P8-Zxie^`KDl6) zAHG_!<_p)^`!uLMf}iUelqePWdslZr&VUls`zi?~nn<}Tw%}WGHn#a!KqdQW4KISg zVJ}5@F+rHuB6OhCpA2so-w4o*kO!GGK|&JsMClt4a*C|!kluzM2WRa#J=i1NwX4{% zx>PNj9rfYTdmmQNh0Dj=cWl^zMiE^&C83LJ9O)hL*?z=*5RDL`c z$=~!FjBA&^=+__P=+dqO9$;*hTMT-IW8}EOuW%i?{*X(!uIw>17T1&84gC$*FZCZ5 zjd26H!|-(6uyo(>NfAzu8fU=c?Ya55g*>ugH*P71eP_X~ zssZX@52+vB!!%)I_MS)M;H0=JX*&HEkyPhL2G7H%&G7tX;c z^7g{^xPz=wN^wVdm$CwPl6x*_i&Nz_3%cXZ@{=V2vSr~0+(kaOFam!e<3*itn%sF& z4(=*nTx7xBWV|>Xcb7*mu8Vufs}{3kWdBP7iJY0VB!xwmj++oEtJW_74axfkxZ&=wMr^_Cza&U$`e^mq?E$>?u4f=$a z{Z_}~F>=?{%|Vy0{sNDcU##v8{+)}zfKF{Fj)iFViX%XMO1{9E^2n0jc$|EqWD-nK z(wg@8OL^g%2+)ITit%`PWpR1g5N;{N} zCpcF=y1g!*Uixl(ESB=%1e2fau$1;M>x!lP|LCusMv7<1xO@`VHuB-}7(7#cQ@$I2 zUAlb_C3u#+Yj1BnyVO{5Ny2&Zivu?NjXdsPEcAWL!Mga{(%T0cVmwFoJKP^M`*1@% zSKf6v9~a08M`q#g`5}$GhVN z@{QxAc%eN1gbcGE_G?4DNbdXVCYV`|lM#5a9CxxiULr3%*_LZfSvnPom&!4xO7SxJ z_Nlt~d)avUBzWID9gCNj2A}Cp0J6`1fs5peXV>8$J^IzI6KC2!c1rTkhxJ8Kw0f9L9K~{O;i-ys31; zBZ|R$%HOT<=F)?ID;RH)dp`aPZxwP-;V7#p~?AdsXx64J(EqI4~ z^f@yOebF74$p>Gw$2(=8m(h4vX^WTDF#fT$-K#Q;cgvbL?Lj-gd4|hNlm3N$x2JUJ z+Z>F4lKtPc#e3zE?A05g#slc4@Eom-^oPo|$|`?69Jf(C0wCBzrEvf> zAE9IifbC0V7o!Vh&@q^zi%R1lJPH4yY!AZy@g>C=48~qc-(ZM#S;-E@bMO_#BLvUF zSCyq9;CW3kTJSY|U3p^x+YM!AC@#i-DluXBB)+NOaNHK(Qrd;XtnE~`hvT~VwsJ2V zrt6NfJp%8=f8~#h#PA|z<09#Y%(zMii~_$xXh=1TUc+@Duv6xkp`!+mW%uMhb16q1&Lya#{tu>)l302GOp*#^hb?EE#AE^WK>AhRyfNmxq zbaOznT299f=-}{Qpsd!YWmX@843kdU+$eG$auzgmxRWzR3AL_5*|+a$-l3TuI&_+T z3wqaKHE18FU7#zScX>2G>xRDu?dR#?1vNwmI@3Yt6@y&U>v=h#!j#^Q4#=F+$ea1Z zaW!}|PZw_o^g|mqq_}RxC!qoA)y=^t294-;)-48oVMfjlNRI05$eK;_X@Gtm_N|Wt z%5J81sHIMa{?@bw?d;G?$LeP(eQ#2~BsV?us2kIcT<3tsAfLfKh5DoSgL>*6(4Lg{ zMhA2^mYQNvb#7(#G02mbL6yTd>1mg*eY;F`(J}3+`?_q^Em}-F&(d|7n&-(h7;)7w zt?kIPlPlAa9!%%*au0V_{+`#&;5w3fuI0LmN0{Y4tE}iQ9qi)j5fFm(-b_oqJOUKm zOB&E{UI0effzvTYg`gp5s?Q%_chUV35QBD`u7Ez#GaZ!7^uyFE0c_3&Dd{h1bj{&` z;M5}%^tIPlfgPsSfKAk4>V_WbGc6r-#DyEP$5TR%A*qm8|GYcTrKpIN`*)p-?_Jyf&+`)dls0Y!2w_(FAtj(u_Q)X)=`Q+6-0`<-^K9 za&6+nYL0R}H;9#|c{6LJ7t^*}-MQydt|qR4a!^#z0XL++zUc)uji8M#yC0M_TvNSR`O85=LHiCm z0++WtV_1Z8ZHChKE%l2jv$CZ=O)1Lne!)u7jN#X<@E#UL#dx5xt;bjMK*cc$P*#Rs zb@M>8hF&e(^p=hcvgJE3LdQqKr5WX+^PewvUV^lvR2tBHh4V60L(piT?@^?nx?XFY zm!pP)f^EN6Uyc%0(po2-cUq2;1;tLf3^XQPjd>)c5*Hzxpxcca*<6ayPJ!<;m@za% zb$!*S5!m_&x)*pFsNQJRb}#Uf%L)`PsNtXoF00TiJ3Vz-jphkDpZ;t0VsuuJpBE$V zF=~{G^ibD<#i&ByncM_af~@?umWLd?LS0MHWkEmG@9nwi&M!M}nf7xlG+mA>yL5;H7FvD#(3aZC34?U0XN6JwTK}!s4 z-S(htJC(ZqgjREs(Y*mbDzSl5%`UrnMGksP_qtV78EOSO^8eV*{Xe!pCn%c(B~#}Y z!sh`^Kov+kk@Y!GTVG#;R3LXw+1h6MJCN5`wejWKhq5>wKy3c@p>0!GyF)OzM`S-L zS84{qgdef7${h3uJ>c;(Iwk0d!=D}p&_zK*ot}6cM7ITPaDL(eK{yqnj7d(Ohf(9H zEJ^{YsP77t!bwIIgKK#nK|47Wq95{Gd;Wrar!mh$G&bsl=Lw{><*L|i_y^BZXfr2u zE1p3Qs?et!^9*{$Z8>NIv3Px??;I>%zacc8#Z;r5MXxy(qV|SAyw0Mt@H-_--`;TF z>pXJLZ>ZwB-tWCGqQ>ynk{Q?auH*ejl_mTGjpeo+G)l^>{s+od(t{Mf@@;~XG49Q zw)Nv0Ho&=pSeQmt!o=bW+@>x?EKcS3O?3yw;vOpToe+!f3Sv>>@I2cmH~VXMyI+;A4aB`v8*eud z4-uX$;Xpk1lXiovv>S#GFq=(WXolfqA`BbTF#M}%D8+R$4#VdK6~}cm4#(F7u@ocm zLqTjz=~YsU!OlPOZu72A9i{X^DK} z7UBPKo0_l)4_7_;6c^!4(T+`O5ndpOWmr)q%4&RQpN%Kv4Oin6A`I*4YJ5sGl;V8N ztMLUv#c_e=Vth*wOR)xP_p9AzDb`gB1~~y zqIna};8cjx+jTZ?!Dj_!wHsnC#f^Su37PFna~Vz(l+`ZRyc6egy2B^soo0 zuIC&KVT$8^Hy^<}ITfPO)gPLF!G?qCc&AigZ473xZhJeyh^8^Y}Tp+0-p`9>eb^@T1Pfd2A5GdU_uF zsstSk@;#4(1Qo|c`TmZroC=Z7HPQDXo+~K8wX5$R*!i&9ZJp~N-z&JDpa9o&->bL> zr#m*jPS^1a75T;G&ni8=jaPD;+R@wiD5pc{Y2tiz8^7el?g-uix3Sj|mhcdoT{|B> zfwl_TG-5JPA5MkZCRxD&_waH-wkBD11McH1!j%PmfZdL=Ff3?4@&HHMsRwz8TX14w zngu+SIjwzt?MY`-@h?No_l zIH`+PiQ5T+d^S{xdkAC+D{&qt*0+A-9iGogMqT@E4|tEaabmxM^dN{>kF(Acq8&kp zG?;W1^h>W}0fY<_bUpF607@ncI_COYfJA0;QumWhL*{c-`=%jfoY+MD8K5C2?DQa@ z8oAAhbuB-@k!Vk_^abcv*H-~fB-Bn)pbKfisZcwyvqzvi>0~FrKu^-wPL@D#8%Y<~ zE7c=VN2b`xFVH|{*~t=UA`1oO=XwPCl43jg1=b+j?PLk8MSd1^rh`Xd06A?ZzrY}J z%}$oU5aRckqk77O!u5oWN!_KPWQel6z7*`A5EwyNHARQ;FEQ-`qwG`>(=#xJ993`w z_`UKRZ<~WcX+mHf@>0-FhlId-M1PV6$U*T=34skrBSE>&34x7BI;TACLT{V&8JR4| zi_=U&{k)j1kdwMnpOIyp*om<^@H4X7X2%VIv1BtRwp2d`HX+g}mR?=)rlO%bL}m5g2gZ{Nf_~_+Auxfw5wz3AHK-Z!KFwklqUK&rgPN1gr}>?<5aqY) z6x5Pj5yr|U8v{cK{?OwfRAM*kCZ z=YNd4o#A)VLe!!u!$I7rj<*&0^mpu5WDK|Epmwwucuo{_#9?4i>nff}BwyHc(uklW zvWQcjHrdA}wIM$Uy2xoQ5R5-h+fv7jTZJ*N^F!K(91|pWehTzN(C-5u(ze9uH#ReQ z+Fv*Y3fj%7si0my%ri~U15Tp_CF_`NHY1z3?zbfs+^DW-TjG3{r+}T1fRf1oJ3Xbz zq})#51+^oUc3KsbLZ+Vouif^bj%4TW|4~IySCV|;KROjOkUZvOW7mxHL4(MFi_FN* z{TD&QNc+&caI^HITfJq>kSVcLoRd5 zLx0D9pySBSKY2S;P)`mXM;hJaWJ7Mc)xqOQriwtDf+rGLP`9D0gC~)tcG?vD6)EAA zhemg=2(}S)i-pNUIOLb$Y~m=WGte}m7gQPiTW}7kB`782x8Ph-TafJ@7^jnF0-Jy_ zkMs}}J^FHRKDjQa)6hpiiMQ2+0Xk-zEaJoC?rQV{! zG=q#*ZH8vHf!_tqAajM0-O6T>Q-au?WfrOP7YoDASnrV8BvsG}@8FO*Ba52 zNJV6~omPkZK+XzR7G@b{eM1=X)Wo;i3R;GXf3gEQtzZ2$a>+)!fYgW1+gd_N%G^5Q8tmyoLCfM z*+i0`FdHLB%VrxX=coqVP7|@X}(wY;zjmfHMDI>WmLC{q} zW#ocNNI&Jb;9bP`IZuduqarOol6X$)b!IoQ)K>7>1;2>Kbkpe*}PO{}6QXy!bvut@n^siaFJZ*7H zoAiuC3mP+?Q7caB>HUoKR&B6Sdo0gLzMT$RUXZmm;mVfy4LKl)4de~czEM*QNq9*A zC1ye08+-tYiv;z~_G>^%nHsUUZn%#8);eAn1e4?4n5twX)(OipYr zI*011VyC{LM!L#Q!$ZxqR8X(f&Y^yEpPl-K)}$xxG(6OwUSVW|EuEj+IW&+y5XSu6 zzM;YNjh%*vT4=TRtlw<&cMc7sK6dIG8bJf?G(0ql#t7Qqaa?FLZ7HZp*RMjYG>uap znmr{KD3?>+JTx_9R%i^}DvYDM&kL5R1tF`G>#U1U{>`V(zvN~-EZARVs z^I|zD(|Jp1B8}n1x2p}cq`f$*OWl%=5|o+skhY|gRf4tsE~q74Vy9CJ>H}R>)d!cPE>Kv9vf3%Y!tQ$RIr+}~?^t_<_T<5S}^p>3rVSVURI|YRGqloa1!Y*(Q8(^dG z(HHACpdoA!^|ez#*bo{nXn)7Zuwk?{C${jBmff<|{Q z44XwW1$_zh4Sg->TeuX@q30c0J9cd-3A4?i9!@IuN-YU1pvi*rbGL=bbgZB=9kzwd zr;7yb@Ay-gLM!Z^C1DF_lj>?`*c;nLG#(yK{O=mRh|UniW_}SRF5FXlMQ0+5ZPZ2J z)ZX{P7E>QiIojF1{{gBYY?-}GWC;!7l&#J0RUj>)(ZZJ6YqZl++ECaA^y)#D(s)kl zU1Ax{RXt%wQTQ@ii#^lHuc3kA-&32`P3`wTt(%4y(IYB>YfAVJ^p>!_sxd8mB^}_- zJhRd3ti|E0X|AA|V|Rp?(Dj`1(7uer;cMwWL3tU!hp(gO1(jv|6~3N66tr#7v+xZx z$mYR<9zyfsR3#u&}vRO+NXov zBDT_v!X^zd0`26)ZbT{JrBv(5q7r%gB&ppC)B-UDV$T+n^zQOfg|z#BLht#ljSz`D5$ga@w6!9{MGtC}I!I5LA${HR2~aL(qXi zMG<@H1wkhguSQf*tv8F31CNnZkK9k)eN-CUEdl*ZPjkvfjg#6`|CxI0Flx?Lv~kk# z$OE)BAfu3^F_8!95l%Vi-`2LsL)4&G!~E0w+sGqyBByLL#zBcZMrSB}Tf_UZdBWuz zawPINzlgxPYKlxK{DhsJ$2SfC)lL`F&PAT2OL@CI?TYMtbc(K0qiDBgJ35}C8-?v! z{rT`@?+#&mRKFiNP4^1h`7jeXLl4`8@m5%YbcUW1#-@YsNB%}H2wTU&Pl0X-+o{3% z=q$Y_Y&QlwI-aFZg>BxTw~^=QzrwZ>ruiJD1~v!kNp+q&bGn1s0MFAtM!u2mU^c?v zsXP0|5&T)7jqpO1i{?doOW0V$i_~gXJz2Xy=z2k{-6fjn%WQ0uC7{bRjgy-2G9BUf zvE3C~uLj>pYQn2k5?-TEYw$4IxiE>>=)atDv^W`2M)v?42xB!PcDzZOa>~(q8tVYH=A=&I zEjogeI;LARE0lFcM%9LHsC}C*fk$fD9I~1Di*Bx?63mQpqYZp$mr{>a!ty}a1IzW)sqg(Vtnk7hsx;Kw0c8mUpI@=nkVIslxF-;Uy4_u$n^@8HS^(n2_Q1#qVy<7A%+DA|yNdKHx z2ug-1FRCotOL||}c7x|j`bN+K_ioXzsJ4+!4SEv#{hCHLQfa7Xx9B%?fS_+7;lDIf zP+iw<(QoNWLGci@k{%Is0q7llEoeKWcu$8kR%5n<3?FFPXDYo1LelKd_;$-dlOZUU z4hUmCXh@`2f-=FCO4?YpVGZb-B-P`jzM0TSpT5P^Nb$n+y8G*BjnqrfNY@Y1)v9=E zr6FL0>t+rLmfWmbX{T^)T+PkuD8aXS_`Wc@xmleg)I_CN4>xOdX@;ObfSjcgLASuu zMS3h~pSzpYRq7L`w(AO>ZW8)jB_~fetGm>Qkqy$vYuv0JQn@h3LqpFhJ@t|v3)^%j zH>;QA-c${9)Y;AIEm;K}g7iMp5J4*-icUH!C=(LurAk2_$jxey660AETMqJo^hRki z#~fsGbhDbI1A-P+ce9$M$^;I$V{V`FJHA(fHnS3;+wv;01tK{=BRw+wRts%HhjMS(N^DIQ~a$41?CmGuEcKkWt z2GUYag=kvY`1Vq44V$w|Bxc`)iNx%w;Ci^(z)BK^gKgn1O`x2Bys`hlJ}!yaHmM`DrVD>GV9$+m8WzPqv zV)pEC7~Ye6uz^b$o@Lvn9e~-_YX*Q*P1gaKJsRwc4L#tlftZfK>@%yOSl6 z8N<@tvq`OXy`W}P)A?`*x)wVS%1J{;xX&d11IM^GhI#+GS~)HomgRn&rw_yXau+LQ z=~9?WvPTg)|9K~mB(guStMVvaitRiaU}D;2j~H|#ILAYRs7=s5vcIO}Ih23a43SJN zAak6R_2SpSt{%>O2w~V`n&RmVIpg5hI=0r1{6k(}w))DH3@MCM_fkqSq}rWlc%_Oa z<7`X3dhqf9GO@*vUKjbGlgLj~;dV>v_dVftk6cVV=M_m7=UmlBl2^%h2z<2*hBAV% z?SWuZJI;f6(4~3DbRKldXRojaWzTJ1#O!fR56bi` z_#~jSgiS{R8JXHep9K9&_VA~F#-{82Df`1t2b`C<3cjnPZ?TT+7SL;b*}|m_F_9uv z8fb-Qz5a~-%(xFTe_skQYruhh>B*O}FFipOJdzUxhDvf8Tw5slW2AQ7-y2i8xd&wf z9g6;pjlz!n1OK5g?X}?RMOkB;fNmPmrusa}W^W$dX4(*t0D&AGljuJ!4g}1jY(D3) zoXDTDzl!cE3`fI!~_WpmdUl-Hq4@C3ASRC7E5y+~m? zs{_;F)&GL}ivw8sNeU}xXEzLC<%Y_^u~Ky0%P>d0D>=j|8#No~9zK)yx0=G)`Oz@E zfU;j4&cbLWgdfF=9Or@NJN^K=ao8Hr%k?%XF`1HI&8Ub1`bTa9&;d#R109{zDWZ}N znUaqxVL0uSk>KPq*2Pz1o%fYcyVHu2DMb%%9yx$K`YI{1iNt1d03X|PJ^@Y8;;&9e zBuWEv8lq&d!slZWyGkXC5dH%#QK=H!(Ww%Oi1AMZT zsBsc}?NVtwPHF`g8F?Ihcj8B7&p0X2Ykl-thr)j+oJ!4MO@k9E@^u?M6!(xt7R?n6+1IkC!vSN%7BM&s*^eyI*lif52K~dJ}Vxe&`ca=LwHfDX~p)kLG06sdE%s z!LWMB^ zgD(c4E1>YrNbTJK2V~UVRW6Q~W(JQ9az>|}#s-1ei8bwE#?n9~ccZ=CKb`B~EN zni1ii=$`8&C-_ecZmbtRZV};HW!zDO_(TsAl>Kq zYS96od7wvp7J?r4Sq6H_X9eh4pAyguJ{v$U`)mch?o$SO%cmUluFpQuhdzfuANw2w zeeQD#^tI19&`O^_%6^+7jl?z<6&^qXwdz^CdU_VGk)FkCqG$2q^(3-sZjOZ3s8%k}j@SLz#smgqkRU9WErx>?^E zbep~%=uUk{&~p73pcVQapa=AQL67JMfgaZn2R)_F@Uy`@>c;_G&`$)ttY;m%uFnO% zrJo6USN|>OL%j_8Sib=Dxqd0=YyA(PmHJ{(WLOU>8Mc6G4Ld-c4ZA_z4Rdu`+KEKdlXg8ZH7v8m@v`4L3pS8Sa8MGCTrpVt5J~Z+HcoXs85j zZNN2P2@DRPDTeBxsRnn@G=mRl4}%G`kD(^$07DSy5JMQ~2t#eq3`1SeOhY5kEJGZq zZL*;m9Htstf#w>LL1!2`fX+5_0iA2;4m!`!2Xuj9Am|dqFwo_ObkLQCOwba;1km+{ zuRu2&azM8kW`OQAd;?l;_ztwfpnx7QECD@YC;~lhSPgp0W>^P@vxd!}7Yy4$FB^UY zy>8eGddqMC^seD3=tIM=ppOl|fj&1}0DWz^0$OSK6BHT$0+oypLAAywpw7mZpzg-E zpx#DQ6PCcJ0rfRHfz~p*fd(0E-f##t8bKqCH9)P#K+t-|P|!xkD9|RxI-v2!hMU2Y?PS4h0=y90i(T91EIh%mU3a zPO-sZvT+*dRAWA9u5mW#3}XT4Y-1tlT;pQUdB)|S3yiBkml)TAE;nuhU1{6~T4LM< zy59H`=w{>3pxcZ`KzABXfR-E2fL0iP2R&fC40^XThsQ{s-uAq^oUZ7S}f6#iSA)t*+BSD*(#(>6~ z#)BrBCWE#%WrHT0@<3Bevp`c#b3xNg^Fe!<7J>FLeGfXov=VfPX$|NI(?-w?Qz>Ys zX(y;H%d`g$lTG_Ur z2Q4wZ0bOr;54zbz{b31ATF{*)7tnIkbhzqOm^`6;z@!H~V)6w&o?`Nc!zoh;=vh+) z=mnD%^s=cw=ylU)ptnp-LGPLpK_8luKp&g_2m0L93G}ro4YbnK6BL>IDVph0tc@*r z6EjFOeO*W4PO)-B7nrfZ|nr5B~+QU2@w2%2~&;jN-phL{_Ku4Gt zf@YYPfo7UlfM%IXKqs3wfKD}U1kfyx=0l+K%*Q|%m`{N&F`oln zZvF#wrTH3YiTM`jdhFOSucKdKGK zQq+zg13jnIVI1L^$B%VA*Yjhn=XQQzvCJU8U-fJk)!o%S z(>2z|>s#vk>NE9U>*wp2=pX8z=|AXw3}!>5p{}8iA0eb8oZF{H=M1`G&cn zZ#&-!zUF}10eu3-2Yef_ETBB#NkB|s{lIO3Hv{!SSwT~S76xq!x)X$h1A_YpX9X_} zE(^X9{45xUR10wl@e8RPGB9Lxh%IDJ$g&XI`jEXLM?x-y+zNRb;%PBjf-T9G*_M-* z%a-RB@6e#oWuX(omWLe&#tXgtVgUTt@o`jt>&0IG3{fP$6Srk)hW9(Pufi3f1@Z1B)@9sToIZ*?5eUG zfKa`1eSs9RW1-X%2OaZf3%W(K=V=wk$ z-nYG;R7a>qQcGpSB1xaPEE1s|*-fJmdQ!iG2BEwB6TdEln?ud*!L0u1pthhL8Zhgp zo-;pt0D*MIn$cz2#nS$2Hp!)yOPb3tm#-D9V&1;U=2Cr>i8t+i= z*4`=JMjwmMGM{3fpMBo@gy^DmyLCqW4*e;8qG6jsYfLs~8B2^Wjb1iW8&gNqWK)jm zYtsVLa?`ISA9Ee^BJ)AB*>`2YzQ8kq&jU3WAw@B zV(Uh0^%$?1h&sM|DB7u&rj{L9A^l2hh0fog_wY6C_s;2~^1pF1v3*FWe=Ki^o|_oTsE|?%9rP^_+#adOp@X z_1uE?X=kBfUg0(p@3>w9t9AlUcXgsh@GRQ-OXw zG3ypX-6^L+=QHp+54Q7Qn}r%g&O*JSBELZcBYV>05QH_#FrJ4-=i%rt^)r5hSf^5< zBgge;ooX1B_!4P!*`^X{*CBV4H1%@yW@GcM*2(#eLaaB+veGqQIcv4msApbi4Wv{~ z(gZ6ZlQp4%ff&{3Ja%BM%pn77_31mdPp$Nffn)k+rjMyLbkx|)fqe(mMr9o*YyNSd z@S9Xw(;Us&nvw9&^ZLNG8~*GH4V2EM2`IJz3W^Gf5fx)2_J$P|BL>ZdfS?f*$s%iw8VmLk zG-$+#T@xEdjT(E@pDhNB#)kSoGdteM^SsZ?^W5*wXU>^(W@cv#mtAr%c;sI2m^X_y zech#Gju(DZvaYwof_)m)6T#1Q4N8SiwYkyrfYl)KqErVBxjn0BK1B6 zb0$_~r1r+xTi(~b9Q()_J+5J2Ik{&~(4{@wVn6u`sDFi5ni1mwxpl7%I8eUbt0fMS zy*~K{n<_SaGJ)b?*{k1B93toS+kitW!u$8cIIJQsJ%-}&iai6{65K?7Gq^vFkoyi9 zi6bla4H=4YR7JqB2N*Y%oku*!&19RA&vCSjNBw~t$yY|j;O4SE<2T%*;;)Pdj9bcH zVYr&xE10k>?f`;kL4SQ4Efk zyBD>^2^A$p&8%@d`Or6AaC_N#UMNnKZic(ao8)ddMSdd>#a-pWrJ?v^d2Z?NxSKqD{v4btKc4>$?k?w*b;CX6 znz9PqQ=X};#A$Nyf-bn1JY_+D{E1w%;1upHuUHt0`^YC2_QZWi&-BQF7A&9$j=rp#slS&C82l_MDUfbE$NO2%TY^1!S?CWPIw5^ z`pd_beuIa~eZLFE!{nLY^~A&Fi{F{?2)XaFm3U;un`N#TkCL5NG{YHkhZSZ#T0R6i zM(*&v8IP3@ecv08lf72{gU8Fxt487p^0ZY$ai)A_RX(054_+OLC&_bHM}Y3(<$J4R z@MJk)O?%LcHNA0`yl>4w@b@Y24V{`+9s|*Kl!t=efSM_C>$L;%XY#_eIedx?a>Tmk zc&a>nT_|YDx^kQ?w_YCswv6>{@icke`cwFGdD@0$I7ilRT#2X4dp4Hi8S?N=z3~?n zdp5zcGRw|e8iPh{If8TLms>({UPZuG8RIYIUE8+6&dT^92 z-_Z;gRvgk$n(^0i!l4)##Ee7D@HZ9P4z!p`q?tug47YY!mh;OlI?&b{6qvE8bl1Mj%kvKO2LN`}0p2 zeD_;y0_WaRU_}JnZVRr%Z^z(O6)SFUA$U_o_q(A4Z`b>zv5F$a|7;#yDKvcI076t86ZV>rH0XI1sm}MTvIvG$nwro=6gcO zY03#t+#aVZ&R#$Rm1Hlt-knhFcpmKvU(Fc#gU6d<65Nwg6@rCB& zl&-#Do2txYbg}XTBYa8G_~RV>hmz-yhvLi1ZGSKhRKf!w+7+d10R9GFRjvf!Iry5A z5eS~wmD_>%8or?%3If|rrI!hp<3E)*CVUFtQceWpF8H>h4}q!MrR0U+X84Y>BLt@F ze@b2`-iz-RC4^!4kjjKG`YtQ(sTD?kUm!H70Y)$2?BLfkYf{Gek(1eVzRx!pRkwk< zUOkcSBt}k9=hvxMaw2R^zzdWaD`+Phd$_W)`+~cbCst6Oc=HJd5A-QrL|dRCF0bu8 zkc4aPSb4O)2igT?EA&Z=nV8iqhZ;|!S}C+zOVx5SD1Q!~9_XtHKT#{>K5)0j3jLX~ z&e00Z={OTxp+jRfLs_j+%d9>S>2fN}juhFA+6kI9#?}s_1n>P&_8eTpJ2cMO1J%$; zpm(jl0v%+#6m*r{Qs)+E!&ARM zxjuJgo)5wLeP=eLxPCX>5?Y`E{cgKOp|SmTI!2-1Mg$|4!w1^1W`o^Zpp&D=xm%&U zc4~(LJUq}NO$cZ&t2hro3H=t3-ePpawRUhp1SYp6f0iVUE-2%5it;NPCA`pFpH_V_M-_>!aL! zMtxgO_QfdAZzjg53^Wksy6^H0MD`xLe525ALlx*_Ez=PxOyA{J`La3dpv3%3BN})1 z1E=(!pf6lM_3NJ72o_QI+)e4~G`3P^|4V1!CQ5_nv@8Br>Ghl@guag+i28~gx*(Q= z>4+4j?{alPEQg}(g9d{gP0Y-6L<-Y)xsE1g-eF>$t)#58O#6beF8{>+nT|+d`Y!h; z@bA+1f3Vj2Ol2CP20_p;Nv_fA^yy0ermSzrzn%E4c>oZwRxH~KV#5LBP)g0q`ZUifT>Bg*eu1vdd zb>f~&xf-~ZyAL;mxtRxZYB4ec)Snx+agF2k9mkD_`aegofm}t*^A6XY8dk36I>(Kj zEHqrxTv_?E5tG3B$0XLa%KEbiHffa+9_XA?73dI$BT)Zj(4P_J_apvlB1^C|vsok? zCDZkptR~!@m4D(I>&|M9aXrU7^raiK*10n6!qtg;F6Cq%!bez9=rrjcR zd>owAQ6W0tW})2@WIbM`VeMDgeTNzenh3NEnFKX+-DI~Mr3eZzpKQ1seWsFiWX^fp zgBl^}?j<+6_+tdcke^$N{gg+l*+ovfM{9eDc2b z0Mu@&*J3Mj%x3NLk$r;|c3Y7zCpGrAdY;=Xu>;8pyKSgRw&LU~864lo{(-Kr`vHBV zwDy&Z4c}K5;1$Y1U#YPcgoJJ&hkis?a<^OLSj5?m;^&q&WVJF4=OF(Y;~cDGmIj#-IGn zEAr86y3(<_-Z-mK-T%jC^SL@(|F3o)pDWY-Btx%Y;q!ndplTG$snEK)wh^gDiJbDR z+i8D+ys4^<@4J0yBd3Gtc62(~hwjc`nGVC~{v!KPt@6N6GMekmYWhobt@8mS<*M}9 z>ag=cWG^Vg_MGz}q!+Zw?ws>sWa3nYGIJg|A3@_dm7wb8Pk;(I$*6jy5jRcM~Ou(RopP}it9x*P8c@~bauN` zZx>!d<=mE!#!FcZFQFYuOn_wUbU;-4I}Rb2(Rog4f3MVQeg)kWp2XJ2?FzatsFz)P zhpXs`vJ`@u->>ik1i4*9Z`ELE!N68-*O3l>O=jIr8k6pJ10~H?shc+4?N78*(1}rH zZnshN9M#r2{D|BC>UH8CI$F$Z`KXulhub}Lmy_Dv`>1%x3TAwd*55NKLvd3Q-0!3D z7V6~w5KXsGH}^;A8w>SyudSEx30lf+>ZCn^Nn02QllFcpysdoP{z3bMi?i(r_owK% z2sWkNG52Sv*Gjb$Q`((&{}&Ci&|CNCs7iSa!OR0!F_(N4Dd{|3pvj!nF}$qTmzT&a zJfCYm_IQbA2^wJasmH5&p082K2Qgox?>Xhc5tZdp_W@1!c#C!p7bl~DWmbq)kq2}+5->_PE|i&=wR)~JKXk*+rUkGePbpNADTtx;YCN&aT6 zh2M_&&tc8?MGdt!cn^HfiO?OJwW;%w9X_ZMo?V2scDPm$^K__}%^5e_{9ij~9IFy< z=Zr@QV(nZ%Y-dIu_}m8#J@DlZ8hYSiTX;~+8tOi5h>Z9jZd3P)5$m@8m)?lIRpRN5 zI7twT;#Dt-*&9#)prJP|_@JRTKKMaH-+B!LaMZT{5(eN_f{wL%VHJR5RKil+5^Vr( zFQ`0jr8W?!2x2p8GUGl1S>HnHr3l9}R2$zF;kZB$OA(G|iFQ)lPHi}zFQ`0jpSB5J zC5WYn#1{my3{C50XpYU^Km0d}=Gepu&Y~?IXq)3=)y5~W1>Px$g=tkUOboWGU{Tav z5rb!OQddw6o~IIz5`#Ur^L%`V#^F-)2loW=c%EwHjh@}{Zy#=u`O{kY*5{_4Gylazirw`gq z!m~J;@9>qFRj=Vxy!L~JQ}LD$8cxMkf>^?7_1aCxS3YPr9p4hfhBO`D{UFM8oW7e6 z(9F|+foG`*D??Id|I?)GgE*Is{Y$)g?OtV zDXvmK8%ujsTXK2aulld*r6|Vfs*$HC#zQ%kAoA&JeK9T&4Oxn>vFT?^3Z-uoxO z%PR6wJL#cb#v?hYCxTL(sS-b+N^z|qHjQQVI zREfu2h-=LPSu$WvVA1{|dZTv|}S) zfsYGf8CKSdvIf7}XXXic!!;Q1SBdp>4VF}b&b&6P!FGbmjbeB>u{_fmSRJ_ z6q|98YU3F;slGg?%K&% zfyWA((6yJb5*J%+LybG}PEL3D1pkEZ3SwQWs@Ju>*ybQRoW=3H7drtmVtw0--Bg0n ze`(x{qXm`6%`sNvR6%U?`*Eotmf~Q&6i4t$)y7AE1fLVcG91Ad8NulUQfx9F!8b&h z^0*(3NAW{WWoTltJk&j*u-sSbqSrv9aLA|)AKk*5bNoAoGQXdan$oX?jxu?&d&39Jd9Hr@^J9; zyoe79@^xtCc?riKQM>Ko(82Qx9wo@v;bYIMcpj%aX1<@U<0=*T$>nCfp5De6xJ~Wo zZTyDQVe}+%KDv!VjF_x%@d=9CX)9^v}}pA@bv%u9S%5DW7XhyBXBR%ksee?EGJqdDbU zkIf%KUg0=l%L3bL+(Fn1!1fw{ENs8GooHK!hjUWrw+`nCf_!FFhvx}o3G47roLJw6 zkT>`kCmHn}Ty z;Rj!d?BS%YC$oke-hErhBcgFVURj^JIOdd!4U8akY?@Um)@F=cpbsCXyh0H*gb3Pc zqtHlbSSo| ze<#vW(8pgg>LI8zrvZYRCNbM+K?e+sJ`*%7kI|Qc?tIMX>offEp)%B=EyG31#Fnr} z)^MME)Ro3TUD(`rE}9?VwF zN!@o{$WuXVxppD(XL&x@=LslL+DrW2rp&si z;FIL*A=_05u;D>;Gk|roM@P~i`GDOflu+1c&35o?NwmZ1}FQs6hF&t2wPhR(Tp27XKC z-DAXN#y?OdcR8sE=aW~ejVGK>Z0~bVplO-~#LYq<1ui5>oYZBxm`qp6%rEwf$pwq+ zh`=SJ_yG%}rdUc|b7G4$D{v|CeyG~mn3j`1g4pU_PAUbl>-h?DkrQi|FRdVdTWDtB z_r&@yHHw*qSw*4+vM{U27lK%r)npzgHOy*q*+Me|*AUYq7KYij1g<5QIjJLDN1Xmv zQ?QupNQNL5b3G~J1ntbQpVpHKj_O5o6S*#2S=Tlb&)WaOY$myaSePy37AKbeM&K5b z`}lol?gnlpwVc$LJ4p5uH42OQBRMT-%UJVtz#;#rMi#V^Oy^W+ot6DIu#)Ul2~rgJ zR}#CYJO$Fu_#t2yNfqQ7-Z1DVlEq0~Uc1RoK`dbvsS(67RFSu8JBXQJ2DEwhzTaL! zRV2_t{y}?5M^5S}_LD45>~WiQ|7OIZ=I_N(6 z^f~L7da-^`?>hB>WN=$PT0kcSJs^sp3s#eY{vwA2rP@vk`kOozRBAUV=rQT?g2gPf zF7IeIOaG9e0w+ynl*36qBL5+>YJ(lPBJgS*{YA(|CJO9cl53g;8hl4M`QmQoJFhg4jxX zOMc|U4v>98Z^>~^Y>6BRLi8^|1JaHJ5$g2%znGGl#tLLXC0Zzm1=Y~+II)TPBS=Hn z2%0pN(Pot(;SHb~3*8H{p?6h+)9A~fhIB#Qe+ljBc0nwkJvF}&$PzkG!yD#WX#H8F zS#qEug0iyROb)b_N|117pacEbLRHh=`NQ*Xk(PtKlH#Mg8E$bS)pm#R;P-j6!1<@uy+So$zrT`jlq0Xit z8YAdT_h?fvO}0?HDU|kptKKKV&3I>1I2|sG`+KCBBIxIWV*7q-iloJy3Q_Tlp+GwY zHbY<_`g5X=8YlNWFV;3m!+K1?`Gy6g+{Z3YrVI zQWNPsPU;$&NS%%gWXI%08Yw9!+r!`10)w+G>)@BDroo?Cs5+`$@aOcI#L}sYDW~45 z$e|dXmtw#E*^$8D92z00gH>Sg4Em`cZ`;6NGo2%7m|b9S9 zk4mr()&%9#juuJ{E~3*dq>*ORj@If-6weqR{1r6|n%I9z@Ep2U&}Tq%X_$@b`8AxH zzoE9ajM%xNDA@cB?I3VKT2XKb%@tHsAP38|T+o^Ba`1e5QqcY$OM?~q)Z$qbyntpl zR8z3K-$gVF9(;U%N?$~)1hJWi=Q7y?n{fKO;$a|*%``z^?!cqLi)k{aeCy(YCxLnh zTh;&rSwj19%CjySP$Dg%LxnAEz(m`nbd0bK8<0+x(kxEu#pgS^Q}u)yy%zi(O>^Ms zfk?1gm~`W>e{>z|WO0+kD!lx!ed=oVpfPcD(R(4E58vh{qll~xN| zht@;LR(j0Y%=>0N{EJ(78?6z>tS{~YUE-8){bb~$kRRwxVUtF^0D8!YU5Fz>Drl?= zi&BO@ZJ!jfgJyCnL7PW63f(~$2;1h-Ekk$GYEFfyLF0j;yJ#<0Y=(yLXNzf*LwD0b zt}ILmnm@TIuA<*?Dn!3z=7#Q}s|1x~mW2LHs{|b!ksG>~+PSF{d?ImAXf=)Hln)P} z+z;JP6Wy6DAC2snfDTZN2ctaHI=OSh12hS!y}+=8bh1IxOXp+@uVZYKUB|Hhfc{nOu=92QTJ+v9RB$9jAQj9wTdj;PG~tghK1nBa6^k>LqM9M%vh%rGdg$ zI^t5;Iod?nR>3r%qb)h92i18R&*=_k13XVl^?V`S!EA)T(?s^R6MPBJMtGs#N%JDr z8C4r=c##eh#M)h=*9Eb5f6#1C-ceX&3FtB{=Am|HK z0~_-&*7INzuhAx)@~s!bBwnK}g^f-Ab=p?g*yLZQNy5e^{{~IvlxNK*{|4Y=r-#x0%?vls*-d0#TmT+im~SMy=F#yTS8c z8ZKyoQ|pN5G`5vlHJ*Zgzo3JJF~g;G#7nwB(ASXg6jYf@ zdPBont1)*#innx$pstYN9WDMywY>#GQuRmhtUa6j=@1l4FN84~8WJfqMs>{sS1QE{ zY6M-Aq*01F1x^)NqVl@a?-3g5TS4O-u0}MFKD_U=mX-)xfb=NBT6!p`b%RF{Hj-Ve znn>^XD8g2X78K+BD59ZMCFl~6opf2yE%3C5d!9J8;XbEF5e`zRpuXVhC`GqXZMH6t zBAleLg5ougBAlh#_XO=+>UGpr@^7oQn`!$f!c|HXbj&|ygLE-h&*_T5Sd z;~`ncs|~Xtp;n3%@#rTx zbx>{WOyys1E&`-lVPj{w04cYl>dD##N~TVjeMzaFse+^nfN(D6r#O@Jf|HD1cQ8ho zq{t*@D?twuO;N#8q9FT%^r#SNqoCP+rbLBG*WXjhil}gDShCt~cFNkQCQ^Z*FH&|y zMM@hP1wv5oQP-oQq_LfuYZ-czAJ{ZnO6kHI@+W~?NHvu)-K6%7%(Zr5n7v37hS^iV z(YW34IueWn%ntUkP)n6+!p+7@e)dHU7jb5*=h%kak1J7zLRIoQ zhXS6u0DNED74vd2lt637ZegwtU1drSgKCYStLI3*Ky zJxV6CM#nnk5$~?;pk{pA`EVV%7LyF+^ zz^vp?kb>zdBX z!^r0yzH`0E$Cylh&V_3vX+C(H>pgNYahGctS)6~>I*dF|xkKPxFX;JL!d_GwONO{S z2ZiTcmFJm~SGVV`1w32B=Z3u#HcIl;F?zR;89h#DERUhd4IGIUTLzO{F@u5 zJ->Y9Rt&8YP%&Zat&~Ry#{U*LDMKepJFC_MtapKGynB_GL|XT$oq@FEeR7e8qJh=(WLYzx5eq zAn?wBpQFAnz8Ry}@59XBlR~!|!G^sR%`*?(uPsDoGmK4$0H*6UB>kCs@ti&d67$3@0KHgZg_=~N|wk$~- z#aj3bw+c^_*x4sdVrQIf)Z9`VevmKngP0{c2xq92@O1DQq`ZW5*hF zVEmmjdy3@eIw#^R^x+OUhX3bqI>H9uinUVqPLUECq=Y}@O&feB1)Dvhk`X&_YiM-$ z*r*yhbyT~k!C2EGIqDc?^=yZAgYvOHy`%IHV>oEMVI26Brp$}F2=lK*9mMhRJ#3;- zPLaQ1Fx)_&1nUaJg{XV<-5}cZF^^Lxv0Z+T=4U%MJqE4dM1q$VdbDdg7?%`!G_8Y) z>VS^X24lRTW`!X=st)EU0byxDRAf^dK4&$wX+q1U&QP|o(Q~U0Xo2$hGii9YJ@y2Z z5T;AHt^jp_zm6n1IG|%z2sxmOpc*v4!5(`JTF7-Ns0+H-Ajj4PT>*s`Bdw44S|Ppl z5oPsMX?8#le>+rT+ruBsw#?}Us16tB!X>1$fg6=uw*up<|aAdu3 zceD+$MqZAi!Uzg>+*5faTY~q1Cn&e4Ndxh)$_}4P?@0ggp4RA~`()6g?%ANn-DiNF zcK;Ieta}mY1@~gm%kCwh*WJrNZ@Di9z3aXl^r8D|&|3HPpikYmfWC0w4qE5Ft8&>4 zX&g4Qs9{R?FhWYgxQREsK|=W${w9EMBUX#Y@w&czv|HK-0B9 zgAURj03D`13OY)A0(7kQ3}~kIchD^DWzcNx4bbV@J7(DAY9D|WXlp@dX`g`>YhQuR z)4l^O)kIx>oB2x>4&3x>Xwlx?LLvx>FkkTBU6PTCI%% zJ*bTbJ*w>hdR*HX^t85{ml@_!n+9+}+ZXh*b^z#g?NHEL+EJi)wc|h^YA1o#YNvue z)lLU}q0IxW(-wjv-5gL!HxJZWHy_kaw+PfpH^IXix#^ZcS*KeC>Zw}?>aE)h>aVNt zvNj`=ZYMyPZVzarZa-+W?g(fr-Eq)ZT@7fw?mTFs?hnu;-F46u-EGiR-F?tB-QS>n zbWcIkbuU2&>E414)6qt-3v||?V|DhRnK~EHES(lKTjvRCp04wOO|C8wv_KaMI!hM` zTC8ghI#2fzXsNC(=mK3L=n`Er=yKi1psRE}LD%Z~fNs=%3c6J{1a!M@B%xuC~&GeJ+Abzi~etnM4o3%XL!%esZ2*LB~4-qNiEy{lUb`cStC zv{v^6=u=%K=nGvHXq|2!DAFGWmGr-YTI)}P+Ud`MI_WQgy6LZh>h!ljJ@xlMz4ebk z{q^R5U}Mt101eZ>0gcp?#;^O&ULDTiEK?mvEfDY5Q2OXtP0v)UG3Yw|!0h*=n4VtY_H^XMSelTdRegtTNehla= zeI{tJehTP3{pX1EKh`URjH^-Dpw>c0owt}h4Osow}% zrQZfxt^X19pnf;#QGGS&as8pjX4nV%UjWYPPk~<0p9Q_FzX*C=e--qW{!h@m`n#YH z^?!lZ>Yso<)jtP)p|1n2(_?Sg1qLfn$PtN_h5tN|@B zYyh2Q*a})~*a14v@DpgMVK3+c!$Hs`hGU@14JScY8GZv@Yq$Wq(QpNHtKlZ-cEkTb zcN!joRvCuDsjS-Y7|I6?|AHPhyaqjjpjOEkh&F zy9PhdhXxa9tsxxrsi7(83qwoLIzucdGA1ZB1yYQe?eJJ5+bi)#Hg$={j$lqQb^%Q> zrh=v#dx54I`+@c`4g^g%4g(!z%m5u`91l9mI2m-TF&i|~I0H1x_$6qzu?Td!u^2Sh zSOQvLECZcoTnt)lT;3lx^Ng!OOO5M67Z|sIE-`KgU2fb3y2|)7=vw0e(2d5Upj(Y6 zK(`yufbKN@4q9cr3|eix0eaAQ2lS}%fluX~nNp6>HgfL{2vY3hLLe7hB%yXydg#wHewhZI1R=?HTP=?NjY5Z9|=luC1=O zE<-m%SEyT}+oId8JEOyTjal!l_t$sO_tX#4kJ8W6FVk<(SL1B~O0^NrO;56>{qKAx|9?0wt%e&RdMcZTm`-_yQMer|rU-+sS;{d)Tk z^w0MH+W(OMb$=YtE}(b7^nkK}>VPu=*8}bZJPfD{un$ZOObr|mI6lxkBXCaOcY)=B zm4OEWYXTn!z6g|pLW9NxZ4TNU^jpwBLDV$E)F;>+ye4>Ca8>Y~V7ri3A;&{Zp>0DK zg;s_h2>my-PuR_{=V495W5Tn-i^5lg9|^x2-nYrpCbdmGBbr3CiAaw4IATCVPDEbB zs))N0&mvw%kjRFShRCqUw8&9jk>ew$M$U*_5?LO(Ir3QKxyV5uE0CLkq`FVk4P~iXVxF`+_r4~x=LP@98E|3~2VGE&d z>q5y&@m?tTGs6PxqUaY%UV0l7LRY3T{XBA(giv;N0hGJ+{YvQuX4ilagysxje|r0R zz~hDpbx00S%!?##;*2nae#~nWj?m-g-8JxEJ^0_}J{jo?HMd8y`eP$PK)bhK)(<^r zfAjzXdFbCZsl2pE+TXx@*G{sJwg1?Di2XeK1@^D)LmdV=EOR*HaLM7O!+nP*4zC;{ z9nU&maUA8e+3A$iHK)5y9i6*6S2>SyS?RLg<+4jN*I3sMuKiqxx=wa2ab4hg%e8@9 zkXwY?3pXqG8SaJd-@9LN*LXO1Eb@5aF<-ky>!*`-|I>x)d+Uqz=k!m^`d~wpp}%2> zA;U1$U^Z+rJT*8Qrx{lnUm5d#m-}t=`_1o`pPj$E|AoM=AxlCwhE#>n(2qlVg=UA& z4qYF5A@oM5CahW5(y+&2PT_sR$ASD{wJU+G44=*#_PJ^I zF?>FOvW#zn?WSEnC|BTx4mWTYM_01UX%4D(+J-JVNt(w_XEi=9k|xNdD=BlCgUVcL zHRoNnp?%hK(8sP5aGL8Jl;b*;q}knv7~4>qt89kK2@te`gt>1+W$ts(cJ~A10Brwq zm+>p8TjjAEK9UB${?iQA-q&Qp_LciX%?2pHa+fq0fHgWvqZGv8cPpu|d|B$!s2FyO=^=3)4THmI@25p-L%&C__(v-vJ9DHutNt($d`Z?=gKcHTThe instance whose ancestry will be tested against this Instance. public bool IsDescendantOf(Instance ancestor) { - Contract.Requires(ancestor != null); - return ancestor.IsAncestorOf(this); + return ancestor?.IsAncestorOf(this) ?? false; } /// @@ -203,9 +200,7 @@ namespace RobloxFiles [Obsolete("Use the `is` operator instead.")] public bool IsA() where T : Instance { - Type myType = GetType(); - Type classType = typeof(T); - return classType.IsAssignableFrom(myType); + return this is T; } /// @@ -214,14 +209,10 @@ namespace RobloxFiles /// /// The type of Instance to cast to. /// The instance as the type '' if it can be converted, or null. + [Obsolete("Use the `as` operator instead.")] public T Cast() where T : Instance { - T result = null; - - if (this is T) - result = this as T; - - return result; + return this as T; } /// diff --git a/UnitTest/Program.cs b/UnitTest/Program.cs index eb43cc2..9b62385 100644 --- a/UnitTest/Program.cs +++ b/UnitTest/Program.cs @@ -1,18 +1,11 @@ using System; -using System.Collections.Generic; using System.Diagnostics; -using System.IO; using System.Linq; -using System.Text.RegularExpressions; - -using RobloxFiles.DataTypes; namespace RobloxFiles.UnitTest { static class Program { - const string pattern = "\\d+$"; - static void PrintTreeImpl(Instance inst, int stack = 0) { string padding = ""; @@ -24,15 +17,20 @@ namespace RobloxFiles.UnitTest switch (inst.ClassName) { case "Script": + { extension = ".server.lua"; break; + } case "LocalScript": + { extension = ".client.lua"; break; + } case "ModuleScript": + { extension = ".lua"; break; - default: break; + } } Console.WriteLine($"{padding}{inst.Name}{extension}"); @@ -54,57 +52,7 @@ namespace RobloxFiles.UnitTest Debugger.Break(); } - - static void CountAssets(string path) - { - Console.WriteLine("Opening file..."); - RobloxFile target = RobloxFile.Open(path); - - var workspace = target.FindFirstChildOfClass(); - var assets = new HashSet(); - - if (workspace == null) - { - Console.WriteLine("No workspace found!"); - Debugger.Break(); - - return; - } - - foreach (Instance inst in workspace.GetDescendants()) - { - var instPath = inst.GetFullName(); - var props = inst.Properties; - - foreach (var prop in props) - { - var propName = prop.Key; - var content = prop.Value.CastValue(); - - if (content != null) - { - string url = content.Url.Trim(); - - var id = Regex - .Match(url, pattern)? - .Value; - - if (id != null && id.Length > 5) - url = "rbxassetid://" + id; - - if (url.Length > 0 && !assets.Contains(url)) - { - Console.WriteLine($"[{url}] at {instPath}.{propName}"); - assets.Add(url); - } - } - } - } - - Console.WriteLine("Done! Press any key to continue..."); - Console.Read(); - } - + [STAThread] static void Main(string[] args) { @@ -120,8 +68,6 @@ namespace RobloxFiles.UnitTest RobloxFile bin = RobloxFile.Open(@"Files\Binary.rbxl"); RobloxFile xml = RobloxFile.Open(@"Files\Xml.rbxlx"); - Folder attributes = bin.FindFirstChild("Attributes", true); - Console.WriteLine("Files opened! Pausing execution for debugger analysis..."); Debugger.Break();