From 02db374e50861c30fd06c527b2b6c6a505d40feb Mon Sep 17 00:00:00 2001 From: Alexsander Akers Date: Sun, 5 Jul 2015 05:41:58 -0200 Subject: [PATCH] [React Native] Remove layout-only nodes (Take 2!) Summary: Remove layout-only views. Works by checking properties against a list of known properties that only affect layout. The `RCTShadowView` hierarchy still has a 1:1 correlation with the JS nodes. This works by adjusting the tags and indices in `manageChildren`. For example, if JS told us to insert tag 1 at index 0 and tag 1 is layout-only with children whose tags are 2 and 3, we adjust it so we insert tags 2 and 3 at indices 0 and 1. This keeps changes out of `RCTView` and `RCTScrollView`. In order to simplify this logic, view moves are now processed as view removals followed by additions. A move from index 0 to 1 is recorded as a removal of view at indices 0 and 1 and an insertion of tags 1 and 2 at indices 0 and 1. Of course, the remaining indices have to be offset to take account for this. The `collapsible` attribute is a bit of a hack to force `RCTScrollView` to always have one child. This was easier than rethinking out the logic there, but we could change this later. --- .../testViewExampleSnapshot_1@2x.png | Bin 97522 -> 97653 bytes .../UIExplorerUnitTests/RCTUIManagerTests.m | 372 +++++++++++- Libraries/Components/ScrollView/ScrollView.js | 1 + Libraries/Components/View/View.js | 6 + .../ReactNative/ReactNativeViewAttributes.js | 12 + Libraries/Text/RCTShadowRawText.m | 5 + React/Modules/RCTUIManager.m | 544 ++++++++++++++---- React/Views/RCTShadowView.h | 6 + React/Views/RCTShadowView.m | 91 ++- React/Views/RCTViewNodeProtocol.h | 3 +- 10 files changed, 922 insertions(+), 118 deletions(-) diff --git a/Examples/UIExplorer/UIExplorerIntegrationTests/ReferenceImages/Examples-UIExplorer-UIExplorerApp.ios/testViewExampleSnapshot_1@2x.png b/Examples/UIExplorer/UIExplorerIntegrationTests/ReferenceImages/Examples-UIExplorer-UIExplorerApp.ios/testViewExampleSnapshot_1@2x.png index 927c523475c93bdae65931d6289dbb45f1d6a56d..b73cbc0128b9d9f638553e23fe8d839119ece588 100644 GIT binary patch literal 97653 zcmb@ucR*9!mOdO1lp>%YA|RjwA|2_{1r+Huw9pi#hhC(kD2P<)y@<3>BE1t373oNa z(4++jp@m+5C+K@;zHjcGJNM4;M^4V!IlHV~*0a{L79kpH3S=a7Bp?uoO!0}l76^nN z00L2D5?utI*i;n{0hg<;kMv!&9V}cuo;tq(IoeyAJG;49$+#(EL3qAQit-P2UXHJ( z5!UDoeF<7#Tf2y7y}WiMijR-4RO7w|*XkPZS7Pf?eeZhJGtQ;Pkt4W&lbg|8vZQx! zlB592k-T9V+dz>z=I!3Q>YcQa0@26NdSBS5nRE2UXj6l%7AcXAiV!o z!T;{uUc`#`<4-`+r{T6&Z4T+@#>^-_kAG@Avt9Y>r(kTUeajlfpd?P+>_` zTw@95@W9{S5#j7U>Xhc6_T6hd*h8F|pYCI)Eq0jvaTUniKi))TECw_ASMadrafsmO zlbKZ7P|sch%A%MHb&IRiz&r#RkK#EFUbVtc3YKu*N++(7V)G z+|dAnZQjZ8$31xa&>p-?$oDhwZ44oBt8oiYrG^@x2>2QRx)T6gKt#9xo!j4I#?=E< z&^-Qqy-+u$jnR9;$nSu9@oS8lu%5A7rRU-piZUZI?j{p%?auXQ$th@;KKu5}dblWw zR?sTSpu*~d!RarB7i;nnOwzY&i`xKM(CpDIehlSNOOKTDJ)CbyHT6H5yy?2pvU^yl zktIuKc$%96wU~N|Ev7^!_@AJE&NmGfXa{3SfdR$)-hx9k;`3nCYq ztaB4+4WbZ%*wyCL?o=VW9T4!2nuv8>KL?)1ZGPmh=Y#n_b#DoeTQNgs_kSrcp;!W> zPmV(|H=XA{C>ZE~?`4tou#Js+XZUu#`@oE8;+gU=#cs4lj#^hwctN&K_9na?wj|+* zO^dA^bP1xRX?JL3I`Jf)>we%R3Sr}Vch%I^J+0wvHPV%CG5^!yTvLRfMOR{}yFYK! zJ|*^qLON(I8Mn>xHCR@h%$XflGUwy`fOXL+O>lA2} zP^9Fk{CAg6E-!m(QOVrZ;~nl>OVbEMBjZ{Pwx@w$1IybaxPu;1Z}M3CPH(x>#IBvo zGCfdgp7-Ox`N7&4NoGX5(1?-k?xcgXfOY@#`stMJ6w8PQi~87Yf!@bWz0z!)Qb!X_ z?kHoAB!hB`vECjN@Ad8kAz-)HED~sdTZ)ktiaqcw(bw1~8?G^3gJz~*HpWnOtr^Df%S6_6Lh>IGHuu%wqlm)JG4p6`J(PLh&~36&OI4N zJABeney?ZZ%Wd$Uu9 zFRCQZ8mhUT^1vnc!BMJ2;M6OzQ;vU6)l4g3@u|X;lq6HB;&_Dh+PJ%7 z03tHFhu)#CR-UjgE?LN`uQ`lfM5-1p#SyYK4c96Yh9Yyjw5#on1)hG9AEzMx<60=&mW17HnQMviV?e3~`7F8b2%;fv2bsm1UIdb3qMOvX)5)kJj_-tCjSQDHGMDj6Z0}mY*J? z+47bbk6X4VVg|s^@?nZ+-qhU@A(YJP@c1IXk z14_2FMf`Sj!NkKc>XJ~x!z$$Z6N4b7X~CW}NCd1J%)Lw+Wy)<}g?Eik&S7Csnnn2~ z>n0h!u!>qn^}!@dwiu+x6Wd@m7HPi} zfl3Neq`m(UKXGQ^Gx8GUHig%iMa{^S{N0$-%r@l&My+Q+k0^Cn3w8tS8ACpJpR{H8 zsj>f>wA`HS+wtFM*@``wCCW7QN>)u7oW1wesh1_dFRpU;!G3mImV1D`l(B=~vZqGJ z-h?f0Qz~wv`l)2%wkoZD-U&DJ7QTH|d%aT>ZCJJHt6lGondi4}S{U|+El~~`eXEpo z5ixI1e0dzgCP%oDpB5b_w!U|98J z!%D2C7XH1Tq~2#Q5{%PR^T36=?IU2i1rxovm$__T_H!z2wLqj!69UAUVl6e+9NfKw zZ@!#uIb3G9LL;4kS(7nUnlt!pb>juR8pnbpmoOIHL9;eA(iX(fDAI_ZvN zLmAgNR`rL{_dJ2-Zj6t&)+p%pv8hc8U7c*%Rfr$c?8+geBRfdy}D#qFX8r; zh)M=A_s~hC-wrr>UvhldG$rNC(zMP_k$U+fDh#cGN|+_!Q|e-Y*r(%NxcJ;ClJ4XP zTnzK$A;o_=JZ72aO3+b3aatP59MDn~|1Df$sV_0q&oV<6w|$oU{R9cLzNh~%DJM8% z7aL2Z!XcKC8qi_*0;{i=YL5GuRGW{=EZdxPsd)CrM{@sRf--uc9F0%!`ih zl8}>#ThS^a`=!#`VbYSKeyP(J`}~EWMtC|DRtP1r0khH5Ex~sc-X}ry4kXm&xBP^B zZxd>O51&R;2T4EIxQVBOVnXO}r@YD>8W?tv&74|#D*?=DACsw8W0L?h&wmx(u*HG1 z2k^KM;N}&_tdSvXRgJ>eg2qhg)G*!vzr0uZE04hF1I*DeWn;b*Xo#_whJ;LDmRDQd zWCMBk@nitJX11fq3r~S~Mr7JAf&bc*(Ocu>X9d?O_4n$OT8}AVd`X%Px+2$2vj{aB zy-&=qupV$M@3fJG9o-W}v=!}YBV(-nDqn0@cTS^ZZ{p4!#(Mj4FLbfx3qiXvI+7pL zkKOVgo*%8ww*zcgn0%Ci3rltiX9QomI5Av!a~3u-L&jeurpn578qio0u6q~nGGu)r z!Sn+^4x=e8%TW3pzES${nn8J%Bva#pKSJ*H8<^4;|5P9LApkTO{{SoC-wGi2^{;qd?Fj+&_!86vo0dxp;^W3+;rk}TZaUBlD*n^(NU9p~daZ-<|LgoNFE^w$` z)b0sc+%xOusY{GLeI$urzxylw_$av-W_RJnHJM8FZKi=7#`M!$gLHIX{i6fLVEJ^O z3C8Y~P~x3xjY=~q{QQ<8-w!%Muur;2Y`?&50WMJA+*ICv+;~LVW;0c*}T}i*d&;ZMvSi602-nwLEo4Z<>uskc!5D zNW#x@OQ+r=6(k>Xt$Mcmt&j5!{*>7=1WwK#33O3~!s)@2K?;*PL0-IT>)ep|&7@W- zx;IA9Ys#}VG;9HfH}|DYK5A&cF{lmVH4uZBYs%T+)iZ2%&mBK& zk@K#XXyS1ZOC9c0x$H^qjk<$j7TR*hGvWG}Go2SV+_YU8M0FmqwRj!G>B)VA3vLF# zVz=*`wu@R-de7<_o%@**ac>Y}&>FuaI_0)E`Qd_dg5XLb^TT1O=UyF;oAQk_P&hOGyHh;f$y>2SIK%Bt_7<~E>8gP}J%e%;d0@bXGw{?R_ z5cBG3Ovm>pfN~I?JgAc$-gx?WULfp50VxUKxtqMdD>X{#W5!%xuZLs0i`e9>>?C(2 zhDE(K)je_V0gVy>7a7o1ng8zgzx82Uk@@ZLz~iDnH%mcpvyF&u-F|aLmWW;Dii|7~ z@D*r>1^3_~(9pmAAPT79_M2M)xQcEQ{I2l!pOzkih;c0feL4RX0U(fn_JGS9UvzH+ zCnZn^;UAM4xV!`53}xVQZfoOAZk$;N96aY2Tmi29e{%~|5&sbsfn1gvXz1J*G;~cf zGjvaRKE69Px_zTQBdMY-#(JHhVbjxn>M9m)JV(=ev0SYh$?sJU>F6Sy{D_nvDCxcH zQ&av48%4N#vq!>_w(Y|C8c@~(1v|J^764XvsZNPjYuLnLQ0(6B&1yuNu-Rg}?eXlg zurozHcc8FTb(c{eHK(qy5V~rcLLZO3Q4!a!M?zf~A9;mXuly)0%&BVZTG z+0}Jns#_7X)6|lZ>QF~+YDHVN{MOZr`q-kl48&7E^q;r8h4NOMAQ~teZjb=$M8k9k_T*2rK7&o~2z z!Ss+9>-Lcgt8&tnP$40N(u+x-LnJisll4-Avg&$!a1NI`ROFJKD{NWfrMI`8kou?- zL-~waeS>wVsai_zj_r6~H!rqF?`JJzB}Vm8+w)({x$70#nEO9V2d6dL)N?v~b8mhS z9fpjVOWLE3aQh6m({1rbJCr z&cJUZne&C3DP*hO<9o=it_QAeRlSSSg zLRlk*dx`eF{*DZFCM>lN+a0F;v3+wRFGhQCTLrhu3Gre#@(J22@nWC9SRsfG1@(x| zFlaaGnj_ogw}jo+X`t*n2(rj>{Cjs-4;_c`?``IT5#ij+TGmNZ=wV2y){uM%a-e-L zUtSqLVm&doYn5Kt8>;Jg$-((mfl+0ATCT4%)`PYz+qc-gb$7Qh`EG%ZVtib)Shu#< z=Zl0IIZ3|pedFAF#ntNDM*@%mU^Q@N>I$yW^)!5R^ zLi=9Dx(Kgl1GubU?)I{qGx|9-aHaw$YO@xa(CFv;ph#2xVegJ#*6ZAFKrkCEIH7W= z&qLc0kC-At4N7X=@Y<>TNA6z8DVG>{!L|yV&|8GGSbM<8t?Fxq)`Cs0(oP+_mj2-5 zEv)=9m`VI>MwOR{x|wXxcPPHcni2fr;>d{gjIjIoAr*O;1o>0^d&%xMK4=w-1Jb2L z8cy27VbudY$o-Gl;Rftz17V+TeXk@NM$#?CwRGV7+Dr8^4#U@am5)!J3%Pe3(AM6o zl{g0=@*rhJ5cta{t>$Z#LuDL8&O@b*cNwBfX&ia*^ZTV0U$JnkN>|2sl(rIGTTx_Y{5V?|}ZcD-@@8o!h^@Z=ujQd)~TC#N;ED zOuISeF$3lZT$VJ|zUabPLMe=RKbc`t_z?L7?{a)p9W-w6EwpfaeL2yVku9Q@#B69~ zN47WZ`!=VIfLFl@q`wfsdYpx_Jgdf>G6(!tlaI$iN_;EAn0Q^UI5ZCvu ze8lL*RX|J*qb&y*Aq^sVRI{N#ju_^2Pd zSEd6V|8&y#JVg}zvuZ_(yVO)!CB>v%i$H_n{&uw&N842yJ*8Y5t+e3FsN%Qx1~jfU5>Hg6|+>C8)%&<$1oa$(>XoKSMKx;ApZg*fx5{w$12 zHlgw7!*vL|HbmMK1op*vU9w%e0kKKQAKopj*qQpMMn%S4J-HK2PGW}Tnd^^y^vvI` zzPmY!uOKJukz`I~>MVgqn)w#B3|T@pV#t8SCdFphAso=7fEG0~ploiUXH2=d#sVYg z3kmaTw}`$G-igvXDnOOM9u6Rzd@X`6eMrq$a2CeTC%^i1z?dB}L`U|XzydK6Bk9q) z=)tP121;wFT#*uT^<&fUvrIDMHLHxX?f28Sg2*anQ8!>5)Tej9^6_e>$pEM59HmY2 zcl*mo-5t^4`w6LayOCl&UcJo^EOWcz<}(!cV?sgX$=>ci50*vwUHugK(|{xUw*WK6 zRPqz-(!Qs?|8A=s`{ogGW|Y}Mqcp>bW%{;yy_h;ks7vvKzG`_ImDW_uJ!oij>OH*6 zwt0CAFla`u^*d_46NsRSQcT6eR0XJudD)?^+?SfoBOTd1%04spu?k<4G6ogFZYGPn zb~k0jCpxF)>S`Xw`nC+}zx1>IB=)w(=|VZR3??!ts5DKDvXd-cM;I;Gp*C>iU3&y` zNc6zRg>ZFr>aTINMdkoX)sgG`qvRTLC_#IX8-EU@{_8SsU;9)=-x0J=CW2q1^o#*J zxR3)}FCuijF0^TeoKk5FGp-i^CbyslN_b@6o*-Hx*J?CQzP@$_)Cm~3A?l$e zRI5=OFfZ3ucs_Hev|0u_sj%lRNA19IRk7(u!*MdDqJ-}|nx!r7bG@>w$OC?n90H*!*!uLLxCt@rt_AjGnVq|n03!M&OLpHHnQpEY_oaAB< z>`>dhqxMy5Xwc_^n9*F-fuQK58f13+=F!b)ez&l`&pc}H1no`AT=_I@P+s!lEW9?z zyGh-TK|&c31;r$4+oLD@?(`_oNAy+iD+9kV|zynvY)f# zP8V}D!N=_`8KeGgK|dQP4}Hc#VmkbG3*+9hArX01acr;7@ue9%v6*5Pn@s+^8Wc0z zpdKiS9{YTt6!0939=XD+X@2>x_yd;j%L6X&!IQK_$+3w9-+Fe!hTLI+@=l$-JNpNb zA+{6t@8Yt}ggo8bW~q+sOrW;HSX(K{^_m*@gts+Pvl8pHf7UkXt*>%&z4?LfzH-8- z-Z5r>$IuFEt%6AhfQeV^nxCIeXHot+~4#0i=WBvV`{3@=7TLHMwfOENn@NXyvlQXD(druvj z1CUS_eVGp}etvvpaS+TD7aHUJ^AQbOH9|c@%4p;Ko%imT@e~qjj;|jLD{U6HI^p-Q zYtP{;C)qw{bjS?t`r#*<2&W{(-)jLOA075x2p!ixiA@b?%sC(d+B1 zs58tScrn$bR|sNX8HbtwiSYNYSM`|iwB*9`0bDEH#B8Zni}nqr#u4#(3r*OydcrX^ zpno!;PT&OQsBudXZa;w6t*rEEeVL1tZgIaBvLX)2$7BkZGmfI_xd9d*jpgPXXEUf=V=am?W&lQ-FQ1uVMw z(!@Q~V)#Sil&&Bvpeb8k05#kFhL}oqy2&?27Nu;E2(mBlu43<88ZJ&r5_5xDBTI}s z&;YLzJ>b5D2dsZ!gbg6~mBBH)#vNhn{NfC+le&Y);dD?b<4uF{GW+_Ih-<`#WoM_0 zBh!BBYG)hSkx(~BtvggXA%1S3d37ljPLP=oFF+)ZM$IEr*fPAv-{;4p;R>t~Fmm@! zPc)`lwKrW-dy$xA=7d5bDs{NRTH6KSI&xH`&t8+N0PK1Uc3(2Rd{Rxy3=lZcjNyIq zOr=d7%6)(u8-V$-M%hd4+#rWcS5FsL1S$o`l^i@{r4zD=9gbhaQ9)PBeXsM98~0vf z;!;oQrI7)@D3tG4tv`r|$R+#=T?8op>$c+OOO=ZTKVPfqI=A7ct9H|OSB45L8GX0! zugf$g+zCl~v(zU?q1+>Gx4-eEREsTo#@qDeX3qR}M;xc64@ZdUH#F%Ca=jtO#~9qM zxqh}Zr>+Gnl0G^PEvlvhx_zbDdHSN`SlJ#ln3(J`MlTH}&!c~W1PJ0VbgbxMj-@7k zKF8dQH@xXEdEOO_wJ_`jXdFh40Fg-_^BEK0wDB3ONcR0e>=14g#0MF231a zP>?IGnW|V5B0Gq-rsb%_CIAcH^leo!srUL-g_}vKmi?dFX-BeQlYDp*hfC(qq)*i( zjyISM9B^kA;OPhlksy@x&5xEVLwV{%55@!VF7P**N}(Z%%^Ab&debR8Na7x1Ie->%6pb**QXs`ZS<6fX)TuFL}(4KI`Ph*wT&kHtHh$ zPGU`JANsuN&uo7RR|pxB+?z__zowdt*$yt=B;05^T2}`s9rIa6fpd2po>5+5K&04; z)zRTOZ_r~pdh2HdK&OAY{OP7b(O~_EDdIVgofMh$TqN}pX{IS*aZCEp7_%Mic%JVb zvUgW-H@E^v3jiW_dkh-#lvCd%vZZ0Gn)VBh1z3~H8U7N0nfS41$*D`{GX}ROr;qYF zyFmU!lspr0IqsRwjg%RF;pu0gv3MEmxFZPQX2kG{wDTeuI(fs!D{b@K-bZa5boTSH z(_I;Ze;k_m0b^{!#W;LG(y3gbAY`udShq)B1Xz9SVzMn<0EpeN9xCkkphj zzjVDiEQE@UwQZ>LQ4!7u9{Vai&}u(EFoCCg|6UD_i9cY8RJmYUC_oJTGkzt|keXVW zkl<Cu(s7ChN>fL^7H?22>X< zvvW6o@M1N%mv6T){~W3iI2K=Nj+V!)u;`DNcr;R%nT42U^|^Sk+8C;rL_R-SMw!}C zmyO?pnJaE+dYmtYe<|w6xeRy*0ARS!zoYp9(1qKiIDm%x#Xq=h#{cc@ycPj)Lgzr| z6W_n#V*SS`3Wsy9yarL8Uw`{-|9_s{f5lb&d6jr(q7{J~&^?+zu36mWw~D*<$7c&% z{^rxg{q&z`{h9GULuaK1AnQ5YJFfvJ4qWGc_xjusiW>&b<^0>ZectkuKW^{eB6xl7 z5dBv@)PLvQ|BH^C&nM9D^Dg3gW`F`zt+2?Xt2Rr9@9r2K;@;WO^jR{Q$V4ANNc5CW zi2!P~yjvIHtoxrK z?K=UQkp}GxhUwggj#sc(BTbWQkJjoj!aRl*?;IYU%dxrA7-ZR<{Nm9v5Y!=5J?-aB zXX;bBSeWrg!hp=L^D&6K3pRS~a179}0{4KpfeC2FUl=j<7XqBvf)HpWSQm@f>fl^_ z&soBk;jIrObL8H~fj@1>Pc1Wi zhfhyhDWpd|)x|Lt^AchTBGW$Ql9q;u_Wa^it<*;yG{1VC|yC#G^_)vxJr zrO>Aw7&9>PcxpVK#U#sB)wB5+^{UsqYxV1fv>$E+Eo26gmtoPlQ+etc6}zvw4J$r( zZolp9_SpXwoX3R*d#zU2Fc3WjXq{D`B!Z0;ho(|2IfIy> ztK<=;IwP%Q#gQhY%c+gQGJ)C%)!>QkGW9>9RtC-4A>w_3(6VGeUFUUAS3x1zL2dP% zuCpocb=HI&7X!G7$s47n)Egy;(?fT^N`Wrj%nFl}`n@S{WIt;$gjEkfYgO>|&#mNyG|lFblEY2H zUfWiXvRo};#jW}F7z`R|Uk?p|BE+Ynh2yGh{NlbAY^zZgoOlDHA0TjyQ5C*#T<3Zp zGhQihv|1kN3-1YmoV8qHvYXDE%W@el(9Zkx{30P=?`#76T448moxt8}a8**B6V zgWr3i^F3&-3TeOlnES)%%einUIBPx=Qf6rR1TneGcva7 zV6;14k&Kc>#|3nn{_B+^CI-+vs(ZJyh#wH(#AdW`L@ z=&yYkc+ueMfQH!HDL+MRz$~z1FM#z2Iz1D1TNxC@yEfMrsa|jwSfj-lG%zVXzzE$> z9^!@7pQ(X3!LaAwqJi@ax3o0zR*}_k&!wzjEt7;#1q6KeT+~3Uj!zGk^D>Gm@~`pf z3)L;eL&oPdPB|7&@pEiY`A^0L zBc(T7ngHsV1B@?hH~Lv{u&M`Kd)@2EczN{^jq$aE^sCH|M?H<$DA@v9c9x7*0N54r z{^AMXwVXKdz)xI0{L^f%oivFW=7+0Xg3LaCV!`Cp4q9wg?#hT-TBdZR8FP_-p z=~%zesc0~ZvueVx8M8U(affqKQz zML+iPV->Mas*YFd&?W6F597FC1B#BLiL(SsP|EC&Sr&qk!!d;*9{ta^9)Tzx%wIX$ za~m;E7%A;}abz5~QIMBTcfdH(YB-A`odKf!v=#?Gb49P+RZW)XK?5zSQ#IEdtrL8% zc?vz}Sczun#AbkqzX}oCo$q9!<1j@!!Ps}9R5EUSM4?{sHeT6}!?jEh*dB2V`ohJ_ zpIf{0nctiaYd@JKiha4&&L)S_6nd_q7Kp!(bU=)G>QFOWkLx>Vjjyr!DY-k!?0Txe zV>}(eptQ-8JlP(|>Kv#g!cCC^!06(X zZ0A0no)LWsDQ^Scf}3J8RWxu8i>QKH$2|+QU(?gg0|8`8O(iSlaS{dQ?=Difvue>% zsbg&%e~IFYI?gm#M7LgIeA(O)HO_e`Y1*1jaOc60vx(2>Oi_0l~PlAc%|ac3qIr>M^acOwjj9 ze;g>lIg4)+W!eu?3W%&_T)Z&c+*-ndTMCPN)BfsIGHiFfdN?Q?PCedFQzL0Sp^)0oB@oF@BPI~Kr8-Nh89HQ*+)Pof*ftP}%?#o@E zv-JW@7JhQ#IcY^X%=Jo%Y7?+_p-aef_C!9s*i@U1XJ^(oDLERa$r@)V2#OnkI8BQm zQMcLETl-FJ_NnwvlEVRc`mwoDiYO-f`>{B-lpX-Fi=01WK!x(d+{!2oeE$(+k4I7@ zJjnl88X=&=XP+#q{5BtL*QJ6?04JPc=}#)|ZP)j98KIDTD{*l6Q712Ae%sIO^@maU z@KBoT#0gW`yB<$_g?ZXB304Ip#(@Gfcj$r?0@cu(4z|zEfG`3aO+m|WF<11zLxKAC zgc{I3LE#BN%YSEk`x_)SyZuJZ{~!GKFJm|yZp6(44rbyy^E2DtquE;YQ#BQwjhiLdzfFFnhG+ypD4rKW_l1 zu8*~D$?+?J$G;ypK@J+-a0Rm`3rtDiLOqvZT!E}}7Z7J%tR45JFzy}5@1$F)zJ-JM zlUO1!XSZ37ex&Jau_Z)n$I;_$7Y2eIiob`hwBV!!qJ1J7Gf}_-^Ho+oH_0+rUx9v$ z4_Eq^EAdah2JX?V0Nm%lUhsQ1{^8q2h4=t)Nm#^*!6SiNWW8w*XCZ=~-}$BD%=SR1 zmZ}+!FtDC7J^gS1;LUEt*$ET2E#pkM@N6IFk^#N{1vqa7rH}Ws-Pj+1Yp=>cHvoxT zkp_waZW>hDRJy?cE0Uv3r=4jF=ZKAB;vnVR8#&jy;yu&{bV*0q*&Jkt>x8R}((5*_YzqW-VZj5de?=P2K=_^Ka(y)5%}uy$C))8HFu` z3G~h<0%f-Xz5(F#Jnbc{!e*#LC0TH6wXs)fG2MIJIGe4=_lUe5Q}^q83Q1kqc{U3g z09x!cG#i_38D<e4rYxGOnL@pXUhB?0h-@!JpL>4miJSYXShsmp-xB zmhrN`$-Sc>FE_0maIFEr{iI}cp?H7QMZ4B{p<*vV5AUY9yOA?fg!tOarfpz6c$a}l z{YITTH$M5D99qkM9&7LfwEJRdTgDT62LNwI!-I)4Yc@WHzBdL;i!|y(6P#<{N^_+S zs5)6%`aG%Q=QetT_W>L>XySbmUa17qD?V*K-XG|V&+t3V=`w8ql)Rj?w3_Izug?e_ zCu%mo@wm+AYud(vPPfnw?JkGN^}_vrU{(qEB0%r=;<=SSyk4e{)Bqh;bc>$~YWuNiOV_6zOMkd*4)Ei^JdB6Z;U7MG&YHBsxL z3O8x&3ZoUUb1-T*$o2I(JE7=OWXpI~_|qEzrDu|u?Exr#BOGxcT+4VBOz8=@4_Wq} zW`_$aB`uPgVHdl*fvl$(f7?b)q}!|_8ygC+K``Z%%|<=d{#@|-(~C#rdZzy7yO6T4 zml-8ST`}WAPTdH-D0BC3)OvSKJ)kV4zEZ%>#4|z@I-cx|sQ2)eZsaWo!K+-7#G5ofW^n>G3BQB7_ZBNHVKH02sl3RJ4*9VK?_4=N3u-@ z9GZ6Amp1E{7a_7po%bzrL5Vb`UJn+8LNrI6ABO>MPgFd_q4QpVo{1-TYyH)QOOMl$ zfW^Uz^4@3(eox(O)C=?;XTPUVT8W?RDbA8Qb$uKMU0?A5&NBR(VbV+`$T8!``qeU9 z=j1n8fR)QG(xa9phU{lo3@$Xh#=%a)1Ic;NLJt=cwt5l`03X(zB7hM2fSJECcwIYx>ne+^ zi0xVK%kIh%);x!@<=plWNR^#+;p*|8^ya)aJF5%K-eq9WubcOmfkWd?SJ{j8yarRS zTaymKLh+T(AG)ANtwChnjeC;`{66o$|H7g+AEE2xrt@N*75R^!8hnXxhy}qgIVnx+ zen&Z~6eO7@1GR2&2In7H*6R;e^0T$a-IX{5h|Q!>Na^?z0?nNAl^24P#OH2n<^W0W-3r-Xk2Ci0KBxnn`7r~77k~0r9{p;| z=%3EA^}T&vjP=NkU{Z7!&OfgAGX-%x%Eb7qb%v%+vunV<*66Kofm-xYuMhIj_!F_Dy-+jISCCy+^?n8MQ0xRxPZ+2R7X&1YiM zJ=n(Yacv50(>l6Y6^4@yA>Y~opcn`o)2_-0MNfO7p?2_2l};ldU$N?|B6JIv%prbi z^w~U!mjG7c1~>Jd+@VdF1U$$ZI8gwrt&%3x(EaT6MDA_NIzS(>EN2BX_S_3tfueJb z9e=$wAk7?gfj36O(PwKrIm#3VmJ%&g>hHM&oO(SpngowkoLYD0y}HV-0-G9O1q~g)J8k{OCCm0|EYWd!~EAD@3hKVdDwavRup%yutgSoR|H; zv)by?R0na@>KNIH{4PYAHB%8qJM2R z@da~0ZR&5i7d$ol67|GtLgegjL(4__L}L$Qt2X<3TwVrTYh-}`9)X{n{|--gMG25> z`L+XcJ64}0oJV_1`g+VC1-8QX`RDZ9fFsKNL+3k6nP1Z4`lv_hFP;2tC*(~x z_$%?cP(GI4T)=k6DP&5uhfJfJmMH& zkl8GRjySqeGDa8tS(AS*vSoiMJ92>~V1*b%v0D@&wdO!p8yyZ>^lmDbjDIU?fkQ7q z)IUo=U1{A5l?*9Ktp=OH{Hq)U9No@93LaA>7qOo}JmW6C^JtD&u0wDs zI!hiK6>;z@i}kDZ zAB{@1JWSqky(EGeL#3-HxdVQ|oW`>>k7-qJtw3IfxB8D2Niw~dj#wj897^97-`#oJ z$yCUDPvCSz$ZK4&1pnS~-aFB4t4cF^#67&OJ)DrRl79{3UO@D{vx^cA*luWLW_mTu z|D^vxuvh5e1)-xx$fPTo=SRG^Lu1WMUszTYZyoRe(&DqbEZd&{>G9SAO!>sdgiV0% ztOOvib{*Wp92tb1shiE%^ZT4SbU|3j=`qGmp9or<*PFA%7;*+D_Mv$$CXE=fuHO`Oz%Miu+)DOU00g5 z=CdQE?|V$UMApu}=Y$Rwo~`O`9?+PM@0xi5?MPZvJKSQBO_~`-+E>dBy)z3Y&A31=!I#4lZvOo~ z4!~ULU|*@pT2W-cd6G-u!tzDyCBS^YgP4?eq`y@)!7RQziX1EFx&zF5@uiJ(SPpg5DwkLwy(7K_SztK`NU!$d7`{rig#0>B-xHE^H**(msr@^kv*pWQCrJ+DDSwBzk> z12gK&pV<0;g@O5FO8%W!&cpEkzCCv3e;%y=7n9Un#uh-Kmya8>29FGg^j-ip2QX*A zT`sO|;0rGDR+i{*bddHRYxM70tAC?|&P^oTPiTOEC_tvaO(wv?20+Zeb_=`{e-$sa z3{`HiahFD(9|*&(bv(-jBK31U6E-atUv+MIsfXHAsn$!SII7@w5D;P&26AU=)SLCC zzC#Oy{TtQz4`jY@@K&){J<~N=FVHV7D=?^LZM%kBBLt4!L}r~kcOkcF%f=pA08#4w ziB-MIMm2=jn|lI1_|W0wG3LPk#{g{V8ViEYx`9=>CIdS)qRN`M?TULpoH%nlM^SBj zH$7(Pc+S0P+KvzHD)0i1!iC(cR$P^sc4cVl<9|Lt+P%%{KsZh#WsaIQ+g-NU&C1B- zb{MP@K`xuqOvE`gx{x1r_2f}1)-#At+8(Mr_~LrArgB+e=ZS!OTRro1;f@V*n7;N0 z5Fgze-$a(^>HPTiz*faE`Gu-7@cj7t>~o$TZ&!)Irv4L2+vQ;Qv&T^Hm=o_WUldfP ztrd_bXd$P96LA}eP%#jLs*?8*ne0c;Xc>8sDyKKP5I%9})#M7y4j?~m+VWNgT{SON zv9Is@zfLli-=P|6&qDr?Ts@{t^Xm5cR7q20QeR-4%PVZ(gbP8WPB3QTkK@o202hvw z%O+WiTQY5x8b1aiJ5{F1BFUhIqfeWGOa`+{35Gk!H$A4=YAyoSk!;$F8I{}215Ia( zSwPfzl}mot!dAK&JuVo#yJw)T&6P8+WkIJ%=bMuG`)h10>ismS)y_kP7GIBTF=r`m zjI9ae=c~z#<0O~K;ZYWL22*_H;LgvFXaWH@I7*ICL-tN7o!GjTfGU2>2yj!qf#ro!%Bq zes1(NX7xEeTB+8bZklr2FCo6)IAG`6cgez8_R!ER!@^XLI7J#UWy+GA*1f?EuV77{ z^YCkSrLEKc=~ST4uDa;#sU8a&&L8N~DbN+yJoE^Qdj>63(i18+?7nD`9hks2oedp9 zQ`*ICTOV*Jf+^;dLgsKGy*RH=P(Kin{^(iUm1tc_VZlZ=CW}HPG>|P7ORlJ^0mPOH zLN`0DJ0T8(9}$JIsN4oAvute)8W)kig;FXJlvff)E)(>1n93Ht9;gfl+YVNjEhz0& z_$DKOVCiMKX_k4V0lKP{qsaWbQ+a!~4^E}n_Mr10=Y>U+Iu|69fPbct?5#HL>^dO` zU5(hghJk!Ek9b~VSo}Doe|)bW)=+8s8&nXPeF6_a&bt~cHUw3XI5OD_8z7K(HRI+-9^6b50`y5GrzhEPk zk*8j*N~Fe?4CmIp3;`dTjmWCmBU%0>QnOrlZR7>b3E_ievBG?vZg-7>p;19==|R^CvnE?YLq#-7T3Tr4m^R8kX<(6Wq? zzFg6yZKEEPh^9Mp3rR51gUI~{#i0RE9E+OlshH6Z`jMxMRR;^Z4sl`;29B0X8zN00 zcly#4UsVRa_u`CdxP^P0pznmC(j?^eUoB2KJ!?;S#2`S~=+v59Se%xtSD?#QOj2VV zd^KxbGesO3U;G%BU+|_2>;#K>jlNx&7xfiGfJ?ZNLpkLr)pSp)n|f& zDlh1?eXvM-jI@^gzLwA*|JkrRsLK2uec#LYV)C`;s38qOCxXupJEg2ygPE)9zVE&V zdp{!6Fcy^PwD2eW_2C19(V*0NhMQ0HO#!~qTy@rSOP`MEln?laU>A-FKNgwU$|8G~cU)Vp4AvP(9KB86#yHEl-Fqjl(q9VmLHiFDMo& z6vlknX=92ivj=x7=?Ge+Db1H%m5Jk0+Oiq8OA z)SxU}(K;#QumO|WK1d$6ooxZ~b;d_`#=*;0gclS@$3NZg{M8qo=ZA zv+lkks#hNq8~%*qJ?Rg6Tlx&UcdL!EM@8<-zB;~U{Uh$)X%jadP4(%Sqq@i`@zQXi z7_6f3&Zu~J8VdFf?40N&vBvJ@)i#}DrDh|P={A@>GuxDR1%FA*TX3DfC!N>hrdI@V zT4nO++efxg7TD{9en4sBwx)cJyVvWt7ilAs+lVt^v}uV2X~<8L8AJ?-5)FVPEHYHH z%lpbHdc|4ak_IfP{QWg03^P3XR&#xzsg`5GPJH;QuX@%7)3k_93VrBzVwJG)AAczW z69U4|6#z}{MjN*wWG&6LU2yMX_aXh*oY2b{>;seEfDee%lr6r9v5PBDCz(}x2##BY zg$~_y>3N#rRP?AX>k{LpQBDJ@o3%n6O2u)-RT~n;acK~n? zR0F&W{D+y(M@x;A{(A48Z+u5Ny`qVFPtBQ<>;`e>0;=h~x%3Ig?D)Y)Ceq?4>#~cjqGTE`g)*mFA>NJmo_TQ19OM z6_!ZkfnRw`(Li@>W4eF<#Y>T&k2idPe;Xp(8KufAIFQf~$A1QNw-oEZcjPK?)TcfW zFJgmC!EBe3u65K*0V$Ui*zob)yGMKb#*BhMj^a}>vhkkFqf0vFzx?3H5!B7y+O)j3 z#BaF+%}|wf_TUuSBLsDw3N*6Hv++Zy%8?(|u6-gPi7l^ty~=60rIV`jjH`BSQ(QVK zRiW+Ke!SjTbR&?1seXK>RDbLwK502E4xpN7?23Lq^u=J4s{a1FWpRwvfYZz{E}L`L zp~>vGj7aYWn7h}sl9<62gY};RDH!G!s}UZM`pMQ1pc;G%VL`=67}Bb~GYc2%?vEdUwFTvN_NA?! zwQ zu}?CA*#@?t>gdkX0k=^efAzxTDq!+ybGgoObhnsls zn<5xCA_RsFm9koRsXiO2XeAOa22hM{5$=#8NzWBp=U-c=?5Sn%ES!Gkd*n6ptN!kr z9kueG51A6%iI;7Me3N~Ra~uF*(4J0Rzoy-NI7jhhJHoGJ&2j-&NeR~z#Hpdt5w@ax zFr6~zq2yexX9yt0Nbz}`O(j*1f1Cd8;obb_Lu(Km=94F8F%|rM8hMgt!W4@uSU<_L z>Yl?pc^tgEMu9l&C(it&@R6#4Xqdk8o=y#myjP=r43F+9u(+z8NCb2JSebQ>X2B)* zR2qtDcCX};0Z^?&kT{9+wkzDae#daGDzJZ;d9%MFsQ56KIFm*F3%YkbVj9S9RDlcw zskX}YdcycOs!n9vRB-8w6n}N;?bYVPZtuIFR_ZE*Jvi_#ccfCu5F3p?;+qTbpd6|j zg0jy5cEcwX+X34uUxyg-)|hCaqo_!8Vl&`a?H{Q!ngnB56Bff440okPF?ISwT z=ZKE*|55jzVNI^x)@VRbv7w-#AYdV&bfrm0K#(9v3%x46cch~ziV7&b_ZlEUIzgHR zM5LDhp{SGqA%H+Y0)g)iy57CNy|1&&xz3;S$91hFB+qj{cbRj{ImXZ%Lf^LZqP})} z69*4aj3`IEvt|EnHdY~G%H{+xLpU5SW8WCg7-OQV?SK8B>w)fYz5x{Bcll-@eg#E; zc&li#09OUp;{rqp;^89=)Y}xJ1%5yD;`Td^>e1w-dCb2hB_BOD&sO@UGF%;&U zI*rOZdJxhXRl^e~A)Q~zK%J*{g|bV~M;6e*@jxpgl~AW$^3J|LxM-oSHBi{C+wd** z`Ej%OD~sOoS<23}jyj+*Ae?YO=m#5{0hq#Xipgo=4iS>YqWIdHwI7mUoB>q#Wq8(P zkYhRzrke#?J>bPWhPs8Z-^*|0Uk(L)?%fs4Sm6u9!HP5p!q>}z?&nTOZLHJz`iU6D zzrjiQx1--dj>+Wx?e0d~$wZ|7tFd9I|HR>v(4lp)B^jh{sYB%9Y_==9UBy3a##gWT zA5*nIp5_00v3gHfL{c4p z(+MX6n0SnZr_OgtM%E07aK4<<)5y14Jpc2sXohu3nAE7B=vj69V-`EXsbtfaepXiP ziD-4S4K&o{eEMPj0Id7b{n3K0d%0q)6u^aosaW5KKt=y_csyOc;WK45l&^F*9r}cN ze(dm~3=4HW_QgcZ&0>Z-;%}<_t0k`wj`;1-UcHXcd>6yUdq3Yg9~v4qmti`12Kvsd zqpWRWpc#SIt1g#pv@=3Q9AV}St)$=Pd>4`%6J}8&9N{m8-xtMKi>5ln!>X1$v1c~3cSj&0i={KPrlj$OjODv@Dhv4`-IE9f=C!w7U zs}-A*#nWT7QIpGhJEd0YtnWLvFY+GjwgAX*&M9Jh__;aLO?yC=rMrgr-Y$MC92}OE zz1ZV=sDrThquAr$1{=+1a<+PZ^?n~&RDTb+)-_f_0}w1&GL(t!LYawRIQiNSA^^>6 z;PNQ1P_B}X?x4})OUf}2y8MqKkw2Xo|3om9z~#Raq4@7UaWEMFqu>4~3Oax9*)diK z%5;Id!&z-?G|J+4ni;*kf#Ct39S9=?yJXd@s1#u-BEEIIWDZt<+$#uB2an zjkX}b8pVKvgb7?LxEhP?(=E%nTd?;i1x|GRWtV5U4?ce_u$f43oNW@d8^xLl3vY&$ zfbS^hN0wu;eyf{)jfJ>6GQshXO~z~Rcqvaj@DH?h{r`g2UKn3i>o~k(0Zue->N+O6 z?=Q-bH_{I~JGL#kasRp3mbJ^FfD11Q9-NPjY!$)6!dMhxqW3VYe9JSg;H^+ zk4=kmVamy^fQcqqTzL;cTBeOpEd8*{L;w2{(%Q;ZGGlW@Wr3T7ovunyz5H;z`#%J0 zt3B@bF24F){gsL zT~2YgGLtE&A0<|sNbCrZPTqPK>B&!Nw5KEis*v_2x95$?#1yX=jUD&K2{!^fqa8j? zInS{B1W)YZMe%Qk&C2}=1wP45R(0Fx=uvKKL$tjf!lX;L%&Z3{UqBdlo5C#JqzF^w z3)GpFDT;UhyQt5o{Q%Ib@hjCTtWVz9iZrSE4>4b!!G9U^RsW6oZeUNzj4ta7;M4yB z1Upy2A!9&&e#;2vTxoQ}ixqte3w7S>!%o>Go=elm$zy_&AZz|v6$S*Q>2!J$*M)!t|nwm3TUzgWSQ3u_eJs1a+ms~ zNVE-^Kq#X^q5t7ha70khhnG39S3LS<_B_x{DNwGAY=%{jMa1MhEIsWQpi8paDziCc zOwt{9e_3f>U#bs%>EEa^-Cbh^%eRVQ;^scbqem&0BJ;CT%@a(TCArlnaGyU#$8R}B zIQ01yS!{K7p|%{h{Y{}cKz5^31A}%DwM!f~Gyelewn@~~o2dQWKs*7Q7CXl3tN_#f z+8eNDxmloJsMS8B{uSlnA?`d;k)-UQH)xmfwVy{V(i~NX8vUJThQ;%` zrjRRKJ}I9D8|Pq8t4pgKdHS5>cNpRTY{Li*b?>$pz%cyXN7861sylSWXo0ezBp4)2 z+`@Mtq2(FBYa7)HC&Ie~8yh~?bY)n*wlJh-1xcB}~s`ggmh4Pp2KK+O?t!T3isu49NNk^bh5HWLJC zMEFUcTL7mHsu<*^pqfsD{_<8TOy({z;@wYg(a`oL9**bQq#&CnwG&z(HpS&k>$D~$ z*syF!7*jd*=IGbC?V7S7Ed47a^uS6SCn7#RmpOG|?CP*{zi16)&V#?$$`|a7Ndk&K zB9x#nC*CP_yB308zv}+ds0k4j^am>z!ahvJ|Fas)mDp*y-FX%vzhGb0rF0r(;J3#X z%jA2^;x&s22@P7$;nVR65XAK3*zm<_mQ*gn^OPvoZ{k2^=-lwBhuh4p+mJ+;PS;G`fU|I}_iZ42b6KC^E{uZFkjYqD6H4b%P=PI%hsV zDEOCPNIkbM2kkI^{BFe?dgn<$a=zd_neeughaYsto4aGAC`c==Y5Gg=wy5j_fpqzb z#)Ltxo|CqWV$HnS8(7HjUW2gC$hQ0aR=U6NqGw~m->73wm$sCrO340Ap8W}7@h0Qd z0=8ivH8!C^cC`VK*Uvx#0A+RfwsN>7{XZoDYhEA$V6L|AREA6lNwVyB3%=D>+*5WI zy9WPrVI@(_F0WfHq~z1X+6aenoS~y;YKT347LIaNBV4u?cHAzyB*>>){EN^21@66| zU{aoQtWsYj_k1S+L9aihOiz1F2jV#9(%9eatWsI~>H$pq1`A+Xbv<#_^Ml2g9u4?7 zA0o1!G|pbU{SQjJmDBLnap`^B?IK3;n=`|H3Q2z`5+MsO zWLC$E{`&raR#SVhbf9Ra<@2If_GC9Hq|2W_HeVa$Xzp9Qi9|%oC~*U>nv{^=ZxWxP zx;F8>!<|M5>)0Wf?l@=@%68gh9m_=zM%BmV%pqI;PxOO@1N^bM&slIK8UiuiA236BfLci^n0 z?t;?a^yE5=_Cw2xUjYS|Esssm;Kt#Cg=YI-%zzo2z!8TJ2>>+>NzN`kBZeng zk3&FF?O}VD=OJ!Kp{4$L8V1{D4^vbdva*7>75YVEuqwJsk3^9M#yPNo)ciW*>c;8GD?f{B<*|cpUt*Cv}RZQ@g73ctT_tFZ^BK5og}pqwsdW--7*R6vv_> zI*#cTzsQTskEu)GY~cywcX{LX_v*&0j=zvptefm&(Qb!xfHY~?>Uo3-%ly?)6SYwj zHI}r7mGJid<4Fgx_fZRbox!MgKc@(v9Jr)Z=gphNMcnw$k&M0;+Ee{~V5M5vnlS8MIJzZ{7a7~b`jeAsC-wm#J36afVIUiUUjCC+0S=;03iU`4L4Ics1a7Vl zgU*&5C89wc#z!wvG9-}cm~7Fw0r-*|)~+Ew?dvDxJocr`wS0hUdDCvJin37@s(u?+ zTq52@6?tzYdpr%Y3j$ervb)q&CReD=mS3L$>SHJ%fdg?Tr+vL4lO#yg=nstnXHa)c zZsZcEjz0Tptep}RPGR#tuIAX5ox*Ri6b5)l-A!3wBLCBIxIRF^PM8oiZVcO5j zwn%($J!X4B#7;^W)NH%LcN$&H6TdlRus>wN&MrLKuE^*_PqRA56!+58&r1qy4mxvTE$SgjA_0P;0p9H9GBs#%N%oqc$AZ=mK5?pl~?DJRKwY zYntj{J>ZKD;Du(_Kph1TY>wFzcAOJr%Ys>rU(QLoJ*}on`x}CH`1s2Dw-pOgpeJds zCa_!IWo!Yb|GiYygM1!6g^!zkbeS`4bkTcAj8|jtwiHFsj)Nj-=S&BRyWWB^BcN7V z8}MltAG7jS-f^#dyGkHJsXVXJJ9@#Un4$qbuWdwsX3&>*iQ}5?nDmrm^R68Z6im60estr*1GW4KZ*i;2 zS1~BnD;SQDQ1W{kOtE*Dgct4KMHs^@PnV{o!N#de`YHE%aw3T{;CeoDfV922YoE75 zo5m$dI=4Oq1o0ALioU|3+&rJ(bs`O}Uk@GF3b=Y%9g~9m=v$4VC@<}m^(&eiQ6hE# zwx2)f@|gKlLuv5PD4_`0UDMKz)z0zy!d>8B)>fb$&vLynk^(_b<@Of^(rB(=eDr|Y z;5Iv%fJm%12Y7V#z!-62@ZJdVazpdSTJ+eU{a{}c(yZgQMC>Z1RiK3Y&6~|Xy1Rk5 zBYs4bAe3Xr7QvvN-jgxCDXy~_IIQ6~X+1uLvvKLhci({wNhqR%#0P!8e zz;C9MK+gG2NC1Le<(~6U5aL`NsJ6TTbgQSjC{Y*jPYDmys;UJrV%4To>VJ>=g!hoK z%O(t03R8RL39dVZ>Vs**vEtHXUOM*yU2C{*jt^)!Gg7^G)NF`_NKhB6>jp_N?3hiO zSm=Y^anJq)eUKhVQJMwv-Xl|8lb+6Vxu}UVLgRpvn!7Uu?p=a``=1r7iY$@zxsuWu zJXd+DL&KqZHs~#0zdE1y@;C1Z_h=N28Ak6j3_buOaS80||0FqB0Ljd^f$Eq@B?;DD zu`Df2I%5mac}dA$7l<4Z5WNUbgPV&)O2@*+tx~xkSvfqvl&XD@JIQ#-sxC|1=lD~HOI)B9 zDS8c-&(kpJI&>B#!K#MzHDxEX8+{mg4M&Ci`UVV-TL9_Ef-+ttWD~nu_uBbBMoH!D z!9j%lNL>_jnl2r7Y1|RfS>4q{a+3v%mu44~v3$OOlUMN1!MiPl`dtLr)16F7W^ zO8~(|pRl%_uiFHft5`OPLcy-X2?Q7yUVOz~>i&t*rJo|I{9b|<+@T1r9(_o47gALz zSL{%~W~wemjPdW`T72S=&fsQAPWN#?Wjcr0BTw1=R_V&uk(?b zSy|fPIE3kxf9}h%L4B{|<+BiLB{@WSv6S^;F>F=@m${lZv0!^BoXiu4@*2!6hn;0KBTcEDD z^A`V&r;(e2th?;BAfm^gWx%C)$$X!v*JgZGRFnSt&;fMUB6=kh7_Xe%&IuelWLCyz7o)olEd>;%OvQ)sTsm-FN@_nXApHscei=F=<)Vf6xS&wnz^bMnT}RJ-SS z2s5Gxe8qfUxuk7RU5W|Lh?4u!0)k&>T2nfc)j9qSyKxt{B8a3rU=5oMIfqQu?c9^8 z7_n_ZXTwc;?!jG|tBqMRhi`v~^kqKVG8RJb$KVt@CpmJrXdKd6j7QoJ!7sPkUaSUml+pqQub7L`}n5_;3f z|APW32VieNplXYuKiaz2U6+uUcmCN3ob}d?oli_xJHm%cZpV@{zFOYBGRW1b*9ATN z*$0o<@Es~2J2FPlh%>U^*CiD3^khMpI^1co58=*rCh-+BqmjP~$U}Q2&iRbT*~DdJ zI5TUao|&kafCPuKwgOW!n7>^)4Id=~KRvCDQ0(?^tL=<;se@WApce6wkuh`qz< z9^9i7AC7j`Grm1h4u=(`29-ySB@tX}cV?erLKt2Ikiz^sxk@fEw&w=FA~J?iO}+KC zO;kW$1^9)juRy!LOrNMr-W20VM+)M3SXc;7VbEJY4YK&ie$^(VK^Iy|_QY7OniOw` z%?yRGyg(q~;h&J15+MJnHT>C_F8z10 z^S=ey04e={gTe#w{huGDqWKSaya_Wv>n|DqX}0(a|CdYusek;>nWqPrctFGauL~yM zyo4xy7hey72$@p0_-{y?e?Rs2JO9&<{I6a(&^%EXen4eXlO}w?_td@y{I%f8%q{c@ zAx?mWEZEINxv0AtZ*@8-zFbIyU-^dhYe%}z|9N@aWp-Z!j=zsIZfAiPn$YbAMo-p&G`GBNeWpL@+RV`a7X%#=Bx$;IA7)ag>0+L0p}|5{k^S_Z$PIHTe>$5NGE`> z87{ZCJFvSt9X*^sqdTh%scr=$qOePO&%-dU zTta|w-q-O>)4*R)L$)2j-ArYd@lOJBASuEX!S zx7+Kd2iTj^fJtQ2`h-n~b0#Z{UYXKK5BwjPBvzzWnjC>FMB2^$j>0q}P`|=-M9Yz# zwt+6y?e%_kG2_UFavJ_Lx*tt z$@hL=1EAa**AAb$c)mU=S=ctEvPYuOfJ*wur`UV(Jn$=04JJOLvwqID*|g=ZQ%xP) zzT@tNRSOK#)yG;o}6wDU0LyrO-t;x0c68xNy!B=xToAvF<``k^OMKGn%S!z=mB~y|he( z#q%Ts>n{my24DT3b@r0R^c7K1HZCi^FH; zi|@P^E=y3ZSrh66w21(lwUt;X_xrnI0fi&lxinZ@Ick?1S<1K5ZVqhAW;1yvrq z60>HPCaqlMR6s9Is42y|G+&)neh*kUU8rVqMjD_8a$py~=P7Z)7|Dwk<_sp+6JY7O z|5<1;xEfHKnw|YOmy&PZ*MzKue1AMs1$a>@0V@rH)}(D_lQ&m%f}?RxwUr=GU??lh z2EjlGMI zh|mfVTDKn`CbVI`WIPOK1|N3;EZ3a@O8-QQ+#2f7BS}*E#p~=n#J!PEMnFZUSu?it<(Air)E}1XJco&Wl>Gkt?(3EMEwg|V6e6jx%lPlA7$u;UJ&QMM-bCYt z1+X0F-&fISRxpcQs-X#99QJ!iI>FFAP_+GJ)kfIFx+mBOTEGK#oXH=Or2Q%g@m+t`1npV* zANq6+n+8qa>;h|kwk5BZxQA>LYfGU&0L4sW;dP9?Orn{;VG$(5eJ;5JGvuNH&lvsQ zmfWdlb8Ouja?$J($sjU-Z?Ou4AS zpj);;e<#*nifri!9?Qz!PAsbArReevV;x{yHLw>ePZ4aKsiMd(#EE%~wU=8ffp+ZF z2|O-6BzQ)w=<5`R_zh5(4%|B}pw+pRdR~dn;te3Qj~+u$Db|Sf?9YCqqfHa&DzNH{k%9* zI9Xnk-rZav9bj0GfUsq1*IZZSJj+q6n2dK@qdw-mxf|tBXOjOd?HPVtx`r;iSOBb^e;W7gqh$6Cp1FGymDC>fCmK(yF|^ zXy{aUKD%2ect$Q!2%bjqMc^Kny@QKB zcV0~Q1XxJa=K%&Fr}1$6*$;Y-pMRA)gH>qZ;tp%EgkMY`OH2zbb~^Vzso zgmV@rMW9pd!f6Shm-%o|&{Kg3CW@af3REAKmBhy77DLwWpF?Pa_oG z0LE*+Ote^(0q~AkeP=7n(lq-$Urku{*m8`T0RLt^;2m4okEEQHKY5oh2ToGOH6qZr z_Cg*h1-ACk87hA=WSh{UizqfwQ5ch8CxC0@Zjau5>Vus5B4UNqn*TN(^ICgy& zG@%`}$e=Fr@nE1m*-!yoc1Kjotc~Vy=7IKDhi4t}l8_>1m&=m+c6AI9rmMfKmit^- zgd`3GL+K*T{bzcCjT6rz7_HW=-!eWxR6c&U_|wfg!GQwx${mD*Nr;o8Im9%e0m$RY z`})w^V|r{8)Iya+8!q(xWub{L6lWrScyN z*W>LeLNNbd2)7)hNB?)o4wmyj-~H!}f8_*xihmNM|G$_~aZvxx+}~{<_Zm>Q0dkch z1Z=H1Me^_*k1pjNubr7;@iObH+BHYL%$YZxmp0aJw^K~+*0DJLLo3&#>E zQb*P|JkHj`RJ~3Z+R|#uI1i3cbOkTxl`12z*xrU5KkHqq7tMN*3|Fw!zf7a0;?oqF zi$a?+QeKN2`U0QfJ8JPb=P~mIT=c>BNqC%-I8JSlWw+t{=g%@?+?W6!1OA6nNBn>8 ztb8N-28fLIh&YY(df|t=c7Yz}#nUkfKv8qb2B<$402!RQrOKXe`wPIJke2keCzDSA{k$yEc=Dy_QD$U|D+{+~6cGW()rrdtcTN zCmRN|+rngQfs&g=cjr;5cBuEH8s6V1HI{%I3?ck{B}mbGykQa2rX)gbH#k*`?3M=2OY(*dAN zUP<1>+LAL|o3`5$gjRrJDt-pHn)ER09c~G1uN{6DEOB*t-2wJy_Z=N8$Y~@L85pXI z0*`6_8{5hdOmFMprPt^SJM*J~Ms2hplopG0V4x{K?FTGJmu|2K+uYMz-zQ?sZ8~D0 zHG}k2_n775XK3U~jBr2+@XfBY@8V#wl3cUp4jRZUrT~kSFO*?b%PtdG#PyuCJ;5oJpBxGZuj~PC!p;6DGYCzhSVly2n zK6l8_;<_TFGZA9LD0)>Z@&`zYBO%C6po~r<+O5CCUwuPze|P;A8NT|DTr8ha)t8Gt zBbIYOx#`7FkuF|$AsQAH2cE@5ntR&?n`oKM@=k9;@ZQS)UQf5@r!y)e&Qd@iaX?@L z+;O)69thjrGmd_V7Uf?IC$+JPmmJIokN@T3=F1fVob@;z87c)6cPl$>1G=Uyy*83lhD^ zgJsvj7HY==eJ>GbGd6BQ>KIE~qZt_Z`<_5NaI|L#eAspw=u^C&%H*N)S;y~yhpkZ# zpRt^>9ph@YzcY@{xkaTb+A!=6VvRd4D`4e2;kHS5lqW-rQ*CWsPwdV&e8X+rua-mf zRTxCVKG4#{ZiSorZU;WMS!dH3%N!`e)Qo$mVb2!Utv`hz^QnJ#ORXdUZ|&zb!u`zZ zJ47I;YhA5QV(1GH8?|EO_2zlGnV2tTMY^ zUMq#oZ}6%NR7JN6o)7vJPVmJKml2p%-L}UxFx_1$94$^6Lra^6>6{;a*0eVlmppbI z5ksW#)-{u;rGX&vQlf*~p5OZ1sAr=3&$NeRIj5brD7Mr}$fBACPOk17(C$yN&G6$w zIsOLgxDthLL$cZd{pF=8@DFSbM45T z@@zDNGB0wTOKS$eOg6kW<^p`{2oB?05WMu84tNG_p|1fsT4T~Fq;7G{HrVg_YxLXi z5`>7Oz%>KzMD@C|@pDjy*V2dXLRbX!H>vs9>0{e$M&rKUQhui?Hx`_-_Fs9%Z1w_z zbfhjamtC|jvCQh-&opg~aaf?}>cB`h1510ueO5X9hZl<)HR=%iD%OOPQR z6Tfo_Z3cJQ<`KZuEF4#CR~4@Yo7j}bfZ&?K@vQE!z2(Wqh6%Bt*sH|Wd-$ssgPE&OL1-|Q|mqqQr8jRRXG0r$8(O1_ZMh$Cyjy7az#6A z8%Qt{A{ERTNT1L1^$nc7x5o9hJIKa%RTwo007HOgLyC5|CrRt><8(Lxo?_?EoGWc3Q_^W?M z_ZZV_#5GZMY)nrRlLBPgWWfC=EXSLD_mhO2!`EzbY!z+lns#w5=!uo`A?+%$ zIfh6bC$gn1fPoDH1FJ)qKZ$+s=Lra?jPmEEpTm>uigeWmCf*z)eMU47?eQbn5(IR+ zbW8%|eWx{tl!X?5;b2F?;Ju^=!y@F0uW-mj@Vvg0!JwIHrw74qd@YRdDb30*1>tp! zKh&Z2C+sTGIQ{~10#U6p4};g9Y6^Hhy=j>qe&YJX5t8nSHVP_JKdyi6n1 zEy~8tW7_8dSA5fhdjQh6O;>pRIdNqp0Za*Oe`7ns;eNr2qUsA)oED}w%5U{KqVsCB z^n>P-@wF$Qr62v`D!nAmzu9~`H^w0T!D73I7@dIl@}@G_Z=^Zr(BY!Hy$YIH8KiM z+|nhoY<`{zjsPy%NYV$6C!9LtYePq+usm}LN3*Oj@Z(1(Ziyt}I=C~Pnyq%{xn^MU zx{_y=2=^)`w3dRw9<3xDV|o`*-5o=0Zl>WR{o1&s9fj zK)hqMh_9og-bwNlf7LP{v4p-rv%_Mve3HdqvC42-8deuI8ax>X^FjJ;(1v034)Y^94bzuhw2h9aY(=mC4=FV5Tqprf43$PFt=ym7U!5aCi_WGVo4sA=6PM0)o6s zUDVdCb?3LhVseR}E)?N}UMRQ_FnYbxwx?!&+_OiRtJEWok*Chh;$LyUv`Fo?@Q`VLcDCgn-sdDa69~+wA;H|as7E`!DWkI^ z#ofHzDYoqHE6x``ZpF}Y59_vATsY?ErE@G{63w6$FJgaBIerFV8?d?_*ZI$4%i(5u z79TgWR`2G_;Js_I@RBvq*!es-vnHwwt!>7bvbTrUb=T?73tbWf!)N;G?U8sJRRix+ zrgV8TcjYuIg8bD+Jf@vo2XU&@rY2plcP{^=`F8^m3t2QnY&{pQ|b1hn%v+f z9OuZ3-i?`OF}-@?Sw(e|ZlB31g8Wpv4N+NH^=*|}GMR(9`q&l3IncmudLQ+@t3P^7 zFyqnBh>jX(o-^7apKcqZcGPwJnI1A3y>RTj!JG#;7;vDU@%x)v(^-bURwpEdD#0g(jP#OI+G9Ag-z7 z?)#m&UWZf3JzJDX1+4Cpj;X~e}-KW)pgOVHDeOr-?lEhD#n}ZE9OYLO| z`LhjT;Xsc+!1U8OdHoMa1k87@qRf!a*kzp1wc+QXh?53E{@c#Af4^`RMNdvo!}2?0 zDldiRUkXK@d@fLD@wSo0vBWn1C1N76I=B_hisaPlo0J`z83r+J;P8!Hbhjt%d=u`uhYepCDC7=!hpR+siNB3O7fdT<+Q%b{e}t^2 z*#rbvoiG(-!QZ@f3Dx9l!YZT>PXOV>V!K7Eg6i$nF)syfD$R&m4ovRIis;3&Ep?bX zCRDnE?#gm^tD1SrUJoQ+qRg+pZKN9XM?Z5t;v}5<``E)-scRl4RD%`c zNgC+K2ual|Ij>CN;)p9J5>Cv&GBDpH(Uw^rA3Pc~Tx!@MCdY!jlFBnzM?LQn8pA+# z7_LEl{RB_{Ev{DWuEWZjemq`paop~^hN#}KL~qTGv-uzrhDEK{d}cBp3F?2p{E8QQ zBn0O{nV1^#-pe9S!w|Q}yYv;!>V91S+dO50^04@xocHhD?voe@8zAPk#(()u3F-pC z#3#1s-ZyH_lgFv!vQXiS+>ymc+K z-h>%6AL2b27-~tfe}|pZ&qL0@o4=&;Sw>*?K7JQ177`41y4<8#S!`{zpL{1;yfNZ3bY1J0R#2l1}>WxHEB@FF4?Okc9nG?RU*fq#=U% z-K`QUugW!*3XD8<5uQT0iuaHJ=Yu?4(J_!We(v{9*5izc)${dcA3;l8P7Gf>OC6P- zH_|J8zELasN#`bI`cCN3@47Ek2@r+6@rj`e?U68Plc87|-prtr4H0o0qUp|FCzZU* zJ2rQVHei?xJl)cps>So9`!!#P{zH-?%2|%<^P2V=Bi`BGi&9@?v_51rXe2*k z3$0QCP>O7b4J$mmSp9an!xbKqP*GvZSWaBLo$;U3Tk^qT6d3HkC+q{h}byjE=6eGq@x=b(Hn2^zwF}H|iAAVkB?Jv7NqYxdurL2o7B5 z8@LCAEljKKImb3lefU(tiG1bMlN;6GpNm|;*VS2*I{OD?IkmN>&Ox^g&0;fk_WiYq z9;*>RxlfV@utBvmu5Rl@gaFS+E8_VORRyacYcz^>vwLx9c;C+UCF;4`${`#x$)9b@tgEJkGx%2FT zMKPuk(RhO&89faG%J4y!m}`md;(siMzM5>LSys;yrOYpdKI^LNkxlKN9QIb`anxcJ z_ullp4_bm#h^Q&40Ml1vyTvpcz{^4K?d(-bzyH%X|3Oc^hv;~(26*+4et(fSL^M-% z?ciOym}}Llyq$g9eVUewSq0tVJQw(8bOgUXGy|Z^Iqjr+4FHP$ztq6t z+?u~3#p+U*9hBu$L-Al*3fKU0FvRoU(jIP>beC}^-}GHJ*|Bhyn+jZylqpbreyYn~!jj%lu%~18 zyp{i@K-IF!yqf&?+)Mu7HbpBoxtG@60Sq|0@&Q=i6`2Hfi;Y+u3Lx05r_Fd@XYn#_ zw+8l?fGKkKX1-3L#^&#BdfT2mO6-rmQ&j?_7JFtD1E-<{d0m&EU)1IT+N{oo`hefx z;G(+x(`N{-KZ>6QUOv3cnZVl)K)+{NZe9*`G#>tR<9l6V6NG_Ah=a-`_JDIP6dktR z&Ji;5V4q_9vjo!SIgp}>13N&6`9OUW_h&(}Sve{f(}B&E&5sYy<|wFbNP7pshRr>?*Vv)B8uxECu`5f4^2min657<=Io0*j}5Xn1H5f~k36Jr zo*(f7rgBPpRlX8Hf-1`^tgi1Zr+{71e%cfTnQJPjads&5z@_`9K-CfqD7f3s_h03^ z;KDZF&nH$7mmERhlNKJ&8f9!=)fqgjwB88%(Ci1;{btTc5dci4nz{)}>0|a|`zBG3 z*|YOh%%9z9S8>+%S_T#(5CH9A@?o(55%pU_jcx0M%5hAxGZ0OZR22K^c=i9B_b%VgH4RUBz{5UK9Z4SZ4G*enZu{ z_>O(5#T=Dk)vqA^=LjfUs9O|f0sZAD!RFnYUi+fzI3XB>cvreB*L$9nBf>CU7^@snPZsm7--0DTS<|@(2D_!o1+tlW%hfS&rEy| zTYm~_?p^S9EtJgmOl$$D6xw(8F^>T3KB3|w-6K$n8JL>@mq>_|-^V0670mxwPjTH` z8nqvg^jWeibOv=A`vEVrjniI1?l_MVA7JOa4vm4oR*3cnIG#=hV@jvwbevmJ-=h&9 zyG&y4rPNP`%4tC%090SXqv?Raazg<{0(b@dGr9mwP7;AD>s57tY!4(1{q^LU%{B9^}e7N8?(jD#FDRNwV)?2!D&-`AW~O+=ht*Q)_d_5kPk1j0W$lw z1Hjhc>C7(h9?J%eeo+(3@j?rjtl%MhVtP$3fcp(6?n2!d7=ox^3MN%k%dZr~+rFb7 zG|Ga~O58&Z-1(=fiH!B#=~CE!2*190XpEQdRiDP+9)`9x;#{U!|B$Wa2?D7aM7%tP zgC}oi9@#f|23@}SbE%=hPc<0rweSG68QOkUg&y6Dyn`t*8?ZINJdb*%q`I>Ma7kue zh}sU?8)x3Gg+cO0CXCoiiKs(2B~fE8bQzQaO_xThTu5;Dlqiq&prd4>7Tkg1)xGP> z7ZC+_22`TiooiKYmh|(}rJGHGiehZ1w(W_=0&R^U*u2reFIEvd%`u-j-cWSH#zf(C zo*w{=cz0@R`1Ps2ZH{%EjUPexq{3o}6Qvw1%SWCu)`J%FMd6t_4E_Beb3~rzir;#d zc&ywKSdKQR{lH1at+C#K>cB>1jI(p4EVof&ib(x5g)W%g$DBD?32IdZ>N#v@#*LwFw#pvEWoaRs|=x3|AnH$3|C)qZ}r1~OHZzvBP z3_aG$QGp)COJYH#@EBL9Kz$X}Yfytgr5DW~DOOUJoBNn@>TclpJ78y)Evu+8w=vCC z>K{abALXQhCT5zWqC51vk)DtPSN6kjFy?Qyyq`}p4rSbF?iDeGp5J4xoMawmZ-u{F zV7^;0uV32K@?p12$4teIx#Xar22Vzjda zPX^s4gVKlnx+A)z36yN$q#QpoyFX8BudM2^piv!>jKn54(C(GIe&gum3Eh)9e!6Ie zg!^*j!3;snUa2O=aHOV4CYIM*CqiR&E>8U?-__-&hSbESdFWNk&N1smQ-#F*IhJL$ zsfmqamqYV|CeZ7s9xEYAaj(Lw*EQoO!cJ5@U$#CNbIrj&3q#hv1g9_Ayse;Pax?uS zIF@@fbcTEko~(&JTD91zMaaXcldfB9K`QHgZr*{WC37lc!jSbsRD6TBUpmsprk~x} zxmp}o)Ufgdh#G8-X%?fS8XOr}U-N>Vk25X3i{`$JuU@i9JF>&eew%-D5NBr6uPS@6 z=aeG|C4a!61jr0)*el@xt0E%!pS_$UUS1EOLa@C+(1$e_0fUD$q7C{jB2wMm{2M6- zGlh5({gRU(2r+m^Jna^o?X3_Wv%6}nUYuI9a}L39ge>E;H1a+Q%*gMEA>H^ybubHQ zYwzGD;!hn98pS_CG`@DZILi5V4$_v)kr`_4O;<*qzwx1a8bSCoUN(!gNW_|uy=Oir zKpS>Ur}yo&k0fOAWdQ8mFI|!DaY^?@05`Lcg4aUo98!rvvrm=#^Q?<*IjUev?W?=KV`k{|54 zgoMoSh6*^SU#MFSPg`y>e*6YiN=OQ3b_%f<-!z0$lxQp~spD)sE%}f=|9FQoU*{H^Caz zoA@o=F@fb<9!cf20Gr9Y%T{p5)cP2W9DQC2GE_ZTkS8Oll#bTWtoiQWGp?LEMn+S+x| zfMNlWWkEy)RGM_@omeQ+MVd&LCSAIe05%Y5O7BSTU3v*FM5IP)Xdx&iKqx|h5JJcq z(e?l5?6ddX=bn3g9wf|6!klA{@_pZU%PMmrJWbr;yx*Z$Tol+Q%vU1t(HYUAr6Lpw9cvDgOG|cX2W?hlbvxT*B}4nc4T(P zqfo7;#Vza!_Z_AvW`Iqs72VnV;R1qG0t?PJP0_i-}hF!x&( zey^M`X@B~}QN{|c;Q9cF#%_ro0brA=;gvH9t)Ld6@A6)71yY@j#_C=vm26%0rQY=N3Qqj z{fne>ZF61d66(RtMP&%8I!oI9$+8#eebnmlhre&%=>1=j{G@SwiH6W-xTnj_<}78{ z?8T^giu3RXcNeoAn#*NV5AOMf$CYT$L{$K3neewuav&DcGdD`RgmfBnbIw5co4tZD zreV<_A(HZ9-srq2xnTul?@s*mv9=|wGmSNxTYGdd-d4Vw12}IVcWsrV&S%V@zQ8?! zV_o}f41|Ccmy=2o+2v21_pBQk6_?_?t42HbvnzrljPRiQnwH*Xvu1d0WFs+iWhuWt zY(v%L7u6D!gAT+>CJs6E1k{F^jXFnfgCI^zm%gm@l z)SDua5Bg^LIqn98=B@Yok*254(Ggz`RSJ+C4Yt~k#=x9*1-9atS~9wAR=GE1aBkVI zbk@k~1H^$1wxV%KV*4QV{B78|M&TP7OcIaL9>7nX>@D`pMfvBck1Q9(*X)YUUUyA} zLVQ8Rj5P6`DK^N=Nt)gzCMdgEQtQg&{O`XPruE1v-<5;JQ&@jw47EhZxJ2Q)9-~RY z7c&r*BfM}A^`~;Z8(G>o^~W9`%rr{29YI?1c|+d(yBU`sH6oO+GV_73YrSZ&tztm1 ze&TO)hGw4`dh>gyn;Hu}miJfWHEMP_1_0MC$!4Xosrr(H88Htwwp+<(ErIU=LL|#z zppS))!4)-3AdCsE&4_o3Qd7dDQzJ1xq(%?xMmxYlrL?Pz`)Kv3%y)?&oTk<+&DHXr zFr68vd(iu%Li&|hw!)!v;_#``lKHH-ATUw)-+Xb!&$R6YDk(#VO+tu1THpK|OKl0$ zXcVek&%(4>rsPux*f$6@e!IJBlvsd0#>mK+i#@i|{`92|HLn(xmy}qPVWlu#1_R8` zY3=Um)Y4Q$J+dU{A+>K=Zm7yB{?ojmrtI&W6kScWISG4#EhxiQi64LPA*86#^Vv>d z4;)>jsP|KdV;UyBv9!2!+UL{*9bFXUCF>(~JqVpQ>JpGCOy5kMQ*0Oi0~%E8LaU8>TvzVGEkmY*){idE~|hNo6Uiq63z|E1 zI3trXk}JVzz~RK=g;Iirdiv>9AVVW67)TGcf*&OA0>{Hc%S8P0y*vw5$B*sYwjA0! zkxvqYR_Nr{e`<@HBDM7CJ5K*-7HleVgbrSgwprJFu%y1KfPF&ApOtbPwNYL>YhQkb zp1bL!Yi%#}S4}`(a!|43eOlx-*?rCncN<-CG3un9w(R;xC3XfQ$yJ!}3;(LoTtPN< z(Vu!eTXJ{D(gPWxv7TgV!brm6uX4Nw_e+6Z=}q0m>IVN&5Cop7%BZ=qT8*fwKCJL_ zdZDsx*3mefSK_6wxz?zbUOz)!;`Uc6@NZK$L|LxbprWTvIYug)A-M=_zyBZw4@k)+ z{;&nX<^NaimJ}c%MQKhmMx_f5%#7E>PP728xGV{^cQKi}C7AmM4D>PY*dp@$I!}D# z`tiGvCNh#+KK^F+kDf{5>gUnU+}(D-QJJJN-L-Un7`WpFVQruU_;Qt*)un#yupQmA zrirHmB-f`}&Hp%+KU7Hezg9n67&ZowWMxVWA3(7TwcgQ6xmJpH;R^=4&DpkfB0wWa zRj2^}Dh8keaQ)QWW3WX&&lwKzB~dUmz{FXSkCxKh`VmmFGkH_pVkfX4_{4Ok12eB4 zJa)*@QSSM#&nMGZeI`Dyf%s;xpxBQD5*~IRa3xQ43!X|7*OFzZI9Hg00Vk5VU=Oe>Pa~BG%3e-f2$r(OV zJy$)xT{rylsa*o7x-|$62B~sQd$$7{b{}>qVc|l{S%pr67{YnkO>{6BwjjGRdQyVx zyUe)ksJ3Vs=O(za2JCl960nM|)iM8Gw*_E#Q+u(gd!TX_s7-OgB~F11!6t~bYvlPK zs%JBkMNe&x0PgR5B44KOte+3d*pWeB05Ch}0Cb`csT4o^vt|{USF=}ADPU6SM@ux% z08+Nc-uz&>;1HOVPm-}q0L(HwOK)roqw{9|PkP7d-=IIrH;-ou^t zsJIk}&h#FFWWM@kHKl+eSo%)^g?GBmc~W$w(gOa;50q`vxS2OwanS%;X}j#RYW$fX ze?!Oukf~kV_vHB8$5%3Kd9RPi&<>*iDSqUY->bo7(y%BEui68S*WNBDiVd#;a#;_7 zGuevEeN{6TN!c?UX>db-T6C-We8PciGFD#A;@K>q6Hc(-IUvXL>fNCE1%9PA82stM z?C#OJY=wj6T!JJI=;c*wbaNWQZ8mNp+6(%B7s4q;%shzt)W1p!8jA)NO4`IuxaBhEeIA_>83oKAgaFhHHO`-Py*CE6O~q%_?t$7e{{j50}g}G z5z^p-4x~zmQBu|?IT!(THvJrqbLS~YB#)!(_d+LZi}bgEgSRMPg4X2Ue|3VsrV=yq zg9|iFt&2PUcf%a70)uJq%Fu51uu!?`4UFtr7}LH%^vfhYah-CjlPV=t(< z{%|1yAOZZuJeM@}04nJT%`X7Rl{6^P7Xd}DGo;VgR^oqc_v`$YN`yf~Ot0oVY`s zT`83h+vPCzUnBs{2Fw=Wkdg}eM1kVb`+xt%O;gfLr=E791K2I*4^$4T7|9mZzYOB! zO)WTopDE#GF(-FPRQh=KL(zo$e83Z|zVA_$?$05N0vT>pGZ$mrlXC;;c5o Z^!h_h>g5LI-3HYWeXWh0^IB~MupY0oz%jgT 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 z z@d)+1vl`CpXw(Bw9|uNTTrSEzc+0^;*th?P#){Y|CKR}8A_qr0@^IrKd!hW^YwoUS zA6a)=mQwOabQo0vM9S-fh2A>G;Ri|}*X|7D0#JStAK1s&D=&gFoh+=*HTDryDuUGt`}ZXlWJ^TAwjsbX^G*iHRTnz|3a4zE3r zjY>;-Qanc*k`*`O1Dmw1e$^lPeRluig3=~S55FcLYOOK<>6fpo5a>#zaf2veyJ8Kn z+Rf*d4T9AY?Wpv1Qs1q_sOx?k9>QMVax{#O;6h&j|3o5ZvpnQ!?u`jLUa>dr!~?kS zsXd{Z6#lENhA6dnWiaLhG^&rHPNSK~EKU>SbuVq>u~75}JpW?P0z~tX=Xv&7lzmlq zYLVOX^Kwo-ZJ-3V6?PFB*Ue38Ap{=em4m>TmYEy`=4oD7!wKJ~&esrxjWycLsunsgCVE#EWvyjVXAC7&MJX(WfCJW6#pVj>rHvmpI<*|UIH z#qf_(UG9!#)Q~da7QN3z%X@aQq@UWe&p6@F5-CRF&t9-eBB0bN@d@<|Ex%D7OdL@# zZjN7>dKp?+ov4Q5SW;2p7zK@mL!3g?)blSCv|4gjO))SHhf1fc_C=!3kv3!ji2vlln4pnSU*!rM@G`F~*!;8^J zA6|_3Bz=pqeq){-tG34YKDl%=BSj@S3iJoW6!cW>9@mLE&qz!HOf$ z=oPnjVp0NNX`aemP`;+-Ja-dyw+t2e=joYR%_^XBe}nT5W5lwaU`?2eH4fSS@q8^+ zgkU7S9m>`Egt_j$%JpjV1|jLuc2m#ikD33JbDKnM+i0mei3RaG)I#)vng_yBn-|7& z2=0M9a?y8`&{~pSTb9M$N8Bzz0d~0+l?;|@?-kQ39BCkCoeG!}yj^q_j?!g+-(A)B?-9*Q&UPrrd8pVp{fmA|z+Z&Z_D4;6R_ib9Ko zX?1-da;SHUyQcXKfMEsx#)R$wXrSUen!tVOm`iUC6@QAkHj&1VrlW#;j5d~C-xv-3 z$6}Ho!vp4!_incmky)cq586?@s2G7lxocWv*TXqA!s#&^6oOn)wg_ft7 z4ErL>9b`YvO^**&=_2}Che z)-pTm5Sw(c>KRlR?dnEc5mBf*L!G?cy^?cvwhZ{Ov6_0y)G{6(Wup?GZ5? z@}3g3ClD;4iL`3K?py3^>0521v{n_NF9d!1PTN$bT*Jz2Ev-kF5GRWuLn@Pt6Xe&1 z{b1PVms%IL26k@Ev0-=z+;p-x^p$mRt(wwi@0S`XaNI{l<&OvmdL#w*?HdDvj5Tu5LjH4J!zGG4$dB)TvAxmf-x7NN z7M$K!|LOnqp&!&oUI&B1ex1|9tK@@ZtMDxZD5sZJ@tTWRTG@6T7V?lmD?tU;Oxwe^!6a4F1@ACNQffGNUJc zTeBr6G}sdvXmren&*ta6p1|`v(P#J`P7{~RDgv-}?#=!x&sUv{PUG3h@FKYp1e`Kjgm-I4an?$wkHU0_vWt#uVwS0-qF-mFz5&i#k cH}{rE-Mv$>WEFWk4*nVcXudIH!>(ih4_Lo$X#fBK literal 97522 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Μq3nGBlc7|8f#%xqO#jJH2BR*MP#j`F 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

    S~n zJZy=#7D71JDHxcX@+G2gV(dAOloydZ#E#U=k9+y60zU#huckm&ufyc~08rz$^gF~x zPi}I;vdy`QU&rK`)F_lkbl7SMjy1+)@{n*W%SiR!EXcPn&%WJ?f7zEoQVsMK=?#5A z^D{>;N1RLjJd0$B20+|oV2IIPyeYR@#-5V8T2@Z&djL`7f%Y)k>Ju;13gynYKgb4X zlJW2F6%$-KiUzJa?o4ZLQ-PR%p=?wk$Pr@^Kr64EBqvrBtnP)CC$@t|iVe-*;idX_ zp*5>r)P|V!AEXofIuKN2n^kmhN_QgO$kUYe{?4vOPn7g{D-l*i`i_Vnn$enSSpX z&wD#-tUC{8xHDzKUq@^748>Sh$A2JWy6R@c4W+}HxReU#- z>n~M1A$lEg{$dx}QoUHKG8LZDthG?%e zI#z9HEKl<#3_>&Ane)7wg0xk>z^}xM(u*$ZE7a3VIn8Tdqj1x4j+#cj0T7Of+c#Q& zyM`Dy@zrtexa|2TI zVoOk0iFV0DdBMeV{Q7VGQM#ieW$vrk_gm_e(N_FpO=rGgi0D?7L7i-&m%(;~<#j8k z5|-A3mw8gpn`;6=q)Fv>2RGqekxf8N(3i;gS~?+3?{kxd*dp-mV%j|&BY$al*{@nP z(LL)2D%9AQE%$HeyJXl}x%J*91iP(89n?2c%=273u~y?h$xemeDv$Y7$lU9{n|a`A zUSSQk@MLSevxp!_AE4n3ifZr-Ja=JA1iVpe;!Z9*JtcY|#CBfU6x1u@lc9M&{=9do z&(INORqLH%OG6mVzw|mR@59m!=H!GU6#L;EJtpY0dI;r8HT#??ew^N?-x)7M4-*p>>f1wus-;g8! z)vDo#X!W109R4>ho<#VcsQCVta{OzJ-#`5JpOT>;3c(*)(*G+XQXLbUf@IB{rlj^> zzyywmc>%_V1E6z~f8@H(P`v<#0{A`ysBO9(LZ(0BD8sQPz;U6b63TmAhg0?$1c!bC zq{@|BAtCT@fsuh*z@%*Cbi0u}JgcWaLH&3W+l0ogEx4j*`dh)Y*z{FWAzKx_(031! z>nrtcSqI~y2%x4A>Z5apr%d3b)*ZQNCQlwk1!m5JH(wIe%nmAyEj zx$&UYVm=b>)9#Uw7*y0k5w_mfrHM8<~hw!JItgH)$Ny?TQ*4UXphpXMM$SMG{ z3Qv>skFbjR!%LJ&i$~@x_cR{2k`=8QojGtIVOb{7ozfB;`H=G_NZs8tb2&0lg1)v@ znB+~HpEop??&BR>vNqtdi=X(HgrsNaYL)^?s>2W3HwS2t(kx{@=|uc4mgBB!TKw9? z+;KB+utSB((|jF|?DW#`cKo2IO^%-xI_9drho`?ctUr5sx5n-uz+03OOhX09qAM+BE+U<2oGgm^L^DA*e6I^={~z? zVtY2i6y9*=N+H@)Gw4ZWXL&|l;)_I~xk#P>J*N5;#2V5od0y%YhjZEdMhrOZn^WeL z$rB$-%?*zPKOyta28JvKuA8Zd6?u`he0Ak5`{0?uz7{XVord*;6ck<#j9h|W33Q-p z#CK&z_oe7sZR4?;?mTky%&b{C0g7xuO#XQYZfvnP`vAYH<#I|j9jOMdTYtAizi46( zc)Z9o^o=;24fqA=k9!En>z#UUpG&?86)UVU71Z3!TsF;)^z~XwzbcY1ZbQSv>70RS z(`4y$BFdQc5e714HxZe#S0$>)GtD=_1r~ zr^noEqp?wTu!Gvkc@WGXdUgBM8R@c(0bj_-`LWIu_f+m3`uM8pKq2#Wp7__IZ5qmP z@NnPf6S5R#=H531x{Em3takk!s@T-xV} zwq0tpW`z}jatTn%!^a#XrX4E0L z$~?wIq`>4tqbV(>8hAL$s_nT{=FK8h23bvmgIF34HVz#UPMi6-6zWRdQT)(B+%u_^ z3E?)Io}GOAr0Td|%k=`2z9MPTJf8SYWAwuVGR=`@{QDinXB}~8Mis8+ynuBHg$kH~ z>dWF<0uvHrjM_MM%E%j<9Dsj*3zfo?4III%yyIbHV&`MHzZYj5wV`ML`?c4LWLrNU z8nV(w&oj9q0LrR1)&?8OFLQe7*x|LZC7Alh%8>P?_$1VCpwc^c>307Ai^2U%k}mh^Km| zep@Q`o19Isc#o_k-e&1NO7w1b8~AuxtVsWmQTl`B)RnW2wz9dp%?&c?1*#(y>cpRp zUXLbAlPV(rh;o&*{PFVsrWBrC(V3ku8J^muw_S5>!v886FriNg$yM;{7=M!Q@lEsw)TMnIxb964&0Y)#Of1MsNac1c(rfT-S zlp9r=8>8)DJWFC&v@4v@i&o9x&G+jy^uITD0Lk>jy%m#sBfgirtNh2wKsld(?@c4zOv6DSfJAYloX zKgLp@VLZ*igKf)A0<=33o0)b5x)LBAPHmG3UHHa0v0-nA3@A&1x_u{u3>wo`o^~%E z;x_s7jFzwuzZt!0G1@uzV*>*6%~y1(FvkVU`+T5k!A9%xcj1-{fXv$O)Quk->L#bC zshDu#hzZ=6ZDMeG z1XM%q#wnG9TPOtZF;1IkqIP^JQXSio^6gE#xf>7*kvK)~C3uT6@m$wKhP|KSDwo;C zY2d!sLk0bQq+JSAUctAz!OhN7`1K9|GtzqWL1*A@?u%5S5L6<7P4or@Zy~{e)n-LY?VX>RNTP{D;zZ&2v2FfCPc;1=*%`Xk#YMU#{FxD(gg2;~ z1vG1w)sgX^4nfa)Gswx7tv7vAAUYu1d?7hVGxi%0>HtHXPg!$p{n?NKK&$H^;v%%! z#h5I=j;t}RHqc)fEUlVKZ&WQ$Ta#K}NM=NBqG5Y))QSuR51Q+hT5VRX8Y4Ge)PXbr_glE6!Pn2T@340!<|dcXzd#cxl|qXmOD0pUA2vn$=1#?)cl#7>2(<|F(w^`Pz3f z_>xpDhyh8sP{YkYTr}u+_t5EA4vO;8>wABrB4;ckv6Y0J-k0f`ed9FAqP+4A#^>;9 zH8H`5?dQhECcn5{ISHPyMGaEawvZSb-yQ{Q^7u%MdeB)*TI!oG%Iv6Pm} zC57}Mx*PIhL;V$a!sEuA(DnHPU}8J3MelQJNoOpZMq`R5M0Zi5-5bZv&z`54p1nl6 zk{m-urJPk?N?hskPLh154NsbP=b##P2W1y^mK$7^PCOxmaRw*_sOa1*Q%*hG(9x*4 zW<5qQ{YIE*I3P$eqr%59KWnhPPzXGzCVT-iw-Qm#)VaeK*+Z!O5N~NERV(=r#U^D% z+OfUom7L&LSuWiOHnLCMnf}tbd6F1(pqJUNp7vY{qE(|kfH zrCVKFJE=oHiw#;+V}l-ph~Op6`~-+C+n%|UV5u}G1lH=hN4nyP1;dBGIP*Y4da4-Vx;+gV7}R^Bxm{tFfa9mXup;;My& zy7)hjrQ=n2z#Ll1VUwLI(bC{zL*xYEt%W!hipZ~SJEIeE*{0DYdcr&AT^yN--&N@y zhEW@>gmoE}j+A5jeRkH$NM|#ZfN~DsFovQ)H}M`nYf;ew%g6pM`=UUinLJY8P6tudT7(3ERiFuPRh- zuxvpAPyR##_n>;H`nzPV?+e~Yrvhc*;q}JLfh$Ndb453|$jCqNa9sGzE}>pcDk?Pn z`xhEiCn}P<6~r?sK@HK8&&S?_NT=z8nbu(<{pxw@01DX1ujzN^yYiUy;L zU08!!HMsXOeODW`1sINk)eHN6KgaRZNlZY$Om&uLB5yqrrr>?WSB^sX)ETj6A^Z6M-F^&Y!%3D34`tU z{2s~hiKGhn{uK!`umBO_fV5$N5V^Eaqg5bO`kj?g;Lcahw6g8c%Dl%eLpEAVWhk#Y z5Q`<#f?g%|x`vi5anERt$*KT{ejICp`y92JV@{PDQhIQ6Pl5w2KiCE8g`;(L>3I{(R|CJ9gTVnbO$99Bw`}DtR#CP+DhdbUWPaH@Sq4&v6OAJ%t?NdP zsor*a$rle|R3B*MJvL7I&B1VQi5%K7ym9Pn5J63Nu~F06=r3L|91tz)T2noB)|!9i6`g+hWAU$mbv4xBL0qHo z2aw-9au7UZDS>!<2i+sfG&1N^g!^h!etWMu3EyF9Q_>LdB{>X!4oazfUt4uG?>Q=s zd7+>uyv))1u1bwFLlI{j*tDo+PzMcsFE7CkCWngMusFNPE>Hq#336nJOg;YIN+O2H zfD#V~P*6Y0qN$pUbksF7IM>#n&W>8?WOB}BDj{lp;sTGdrc*IZXP*RWeZLZV@E&5j z0g|T?hXvzzO2onC{~y+fYu@YM+nNftJVwO9^e@Xm#pb!yL&L2rp94zd_)*{@fCLiw zC@K#w1Cy!}TcA-&0lGB2DsXZ=mkg0QkbYQQeqi$=i|K%4a3ISm(ZvPJcLET|VDk#f zu0!fcERZK%m(XAM$^n9x)Q<6-k;$sbnv;xly&kX4>(dZ8al8UPd0_@QQ`wt6-hjd{ zU=vlMmP-O9a|}@9RLy9Ehc7M$?Wh%3t$2nHy@HZ@9$5|Tw&S*qbY9Fh&DLd5$juAx zDFuD6+x~jgvm&5TX-W4si<%LuyUifp0+m;uZY^sdzUcu_y}~%>D=4I^qBiYz%Wstd zp^5q^kO&X_@GqY}T3VO_m zL&I_BWWQ@O(P4O~Vz!jY0)_RGwbx7y+1?p}HA1s@T0rit9jzi?I@GZ7VCrYoB)H1V zfnT60r@9IB10u(pRkF6a>$0GDF?(pP{oG_~C|#xe&Gzksl^{%=HP)Z+@WWvg5$;vv zW$UqYl=~JF#cY>fyw844u=ivwgL1;_WkBKTxBtUEDb(?~B`I{s%_^35oPtK5PdoO( zUcalFv#8+lQawZls25KYDmT>lY86Np*SEyBOK1&0u`bY02Yv=&gEj9u}>?G-7^p*W`iQdps+ir|n4P zd4igxw05hdMvt8H*%fms7oPI^KrOPKmx1tie##SvF(AIyBc)*6`MtQ78YVqwVvPG` zJ$^Iz3i>i&+kq6ADgWd?)}YcsHRZDrt2a5;X5z4LWlN)1=xhq#n}xoiYYd;PSs9Z8 zIW~a0K8q&CysI522Gt1juRuD5`?-Sm-q!$rdzXIJ=6g1n+fLyIs`J1&kv~6 zN^Fm3ruC7cp($DM7pYpPT6<-t1^X%Dz{mXjtu}^lMn!koY92}Pu8M1|@=gLV{u@^{ z#u;0ZS@!&hv&KQDaYMeVy5P_i+mocGRA77vYN9oSezIc3X1ZINfHH$fi-Aica198Ze{ z#bBz|(SIb|E(2z!b5u`RoNZ;6sz0Vft-KWh{2M*FYO){`j8hFa=6lE--L5J8!d^z1 zG|idt3uJt~jaVHut4qA-5aImnQ~U|_?m&=HmVP|K?M#`p`cx8@yME(OrE0fmd~vc9 z|Eez>Q=eJ_pxUpt#{3f|H^<5|929T5uwsE1xbaRlKT3;}cuSDRwjyVlIj;9CIpU|a z)@Fj(i$n2^m4)iqE|5jog|RhCv;qjgQcdH!xfYw?HyaY#ANp8V4tPbR)g5{Hbp4h! zM9Rr6{m(i|tgVg)DU_#_j*_ow-cwH@0N4vK9>gLC*Xkrw;1+$yC9Dp`K9cD^#L6gK z4ZL4aZlfWR+i}jfQ9pihaeb>i9kT6A!X@dW8(qGGJSYRiQzMkSbXlO? z&M$C-U=0j$TgnRWQ{1$Bn>oChO*S9A;HoR!55PF^yx;!$IXiV3ER1qYU!ls+jzGSc ztsvauC-qqdlSOzL3FG&;0OGRiff)d|zzSIHx805UDu66@1TKFQ6OritOU6jOL!&di zo{Bw6bdh`StvjIXtA5>knCNat12zd8P^xY}CuHdTnBB+kNQe=QMKTY_JF&)N(W z#NkP79VJ_2b};Uy?0cn5v!wBEU@ItWUh-Xu1yLljWIc-P;vE(Wvuoq=vt()C{ctyx zoIm&}l2%d!l9d)#hFc!QfAW?j0Lfb2UpJUPMVfxKx0TUK@p-_oWHhmwj*e?;JrCYn z8~PxGt{;SHJ0&pS zs$q(@H!31WPD^Aa_& zSqXct30Y`j0!5gnG7&P3`Q{+R#I`p*EI9aLm|O1*7pii;)cXDc0{NFRfwD6={+^A% zW%AKQ!Sk6PTM8nTxl)U``)=4@~Y3$lnG& zGn2qN+^i=13ucX0x!^L*4Z5IuIu~_FQIKS5y(RzU46+zbqs`@1&uE)wa7+z9ovvfS;lLSWq{59rl}hI^nsFl>aoO?g;CKCJ*|E6 z2`q!+$QwJP^_tYYf>m6RFJX#FW0q2+P%v-Zl>HDJ)mvSjbAW|ZNFn#YX%(J)&T&Cw z5jd@=dT@oXY*xR1HEg@BrO|r)c4m{4@g|cfy%hX7@~5LhG3?J*2`6v)O4SBkP{tfd zu@uI~PhRygI4#(f3f}7bUpc0g2>DWXv#y9-6oq zm=k2^nchNpt2?mW*6_z!9)fOJZGiqfYkY!ttO1-D5{KTnpChy1OM52<1Q!q*=DO6TpjTpCm5;R6Ci)xi` zvwd$j6vCDa`vbflVgL*vHV2X_m9w>Pa2)4l3jCM5bOD%huVp+9H%tW7dl9~fV!k{g4b zEKco~hoqmkb`eC0 z!)%Fiq`9*H20{PG91@&NA5(D#n3{vQC;u~^(2XYX3xGMS{x!Dn*;&?ug z$&h=14xwuM=@#T_e9+MsIs&*c;d0??&XGou+$r)LSRH|N4o#<0wGJ8Cl794}j;@ zaA}Zf^FSdfRe@EYmKD2V$q1I%1Z3_blT&O?HM3`ZQTI78Q!eW(=9&hi(98{n!Ksxy zRL1;Vucgl4Q+d!n)^kP8esB|a?(JO&KoxLy=d1&@#>2f5r+`*0glN@_y;jr*4T}%; zjWcpv2=hP{H*}G{cpk9~RZ}^*g4#~K9Z0cO&#$|CaH;K-ye(!I=qq-KDNL=KFEtRB{ ztX{4^C`yIaqO{aX`KXk+$}AU9pFX9Bm_95XHiqgLRBJ~BjEmV+3&XvB9mnS6%YCP8 z!PYDTp?iH=m=$5-W>|+v*k-m!D`5M)9fSY!frd^-yZ!{&GZPG-#UB@f5HtsM7dGgt zN1MR>s;~htzBK)+YRHaCY!bm}#70)yNe%Vd2wGKyJG)+l?Yv$YEaTr9IYS-fS5DCv zw)pSY5`zE-yvh1m2Vj+YGCFDGgDcE6RJb$ZD(3o#g&~z6NSym{gE&$Dh*Xqa1ERDy!9sX4(l z!hn^jx;XltG3&f){FgObWiL)5Mu~DN>lNKAvGfl{K zaJr3AN($tgS6YZwR~s!~C|4l*5|&J3xv*wHnf1USzNkW?eAE@y7j7rT2QR7$2)+@= zx)6Q!RptJgL>-R~yq5X-utXb0a+Ja>(-_j4dJeW3Qy z?N4s$gTAWfzO@P0$=I8CzPGPfw&nLZT5VRDn1<-}REA3~@#QaH1iLxV+(~({#8mx7 z6=~TeeZ@Ss-7}@=+Mq5i9 zpooDIXwpB+sh;NN9crq?6Hvy<8}auXQf;UDgX_KSzZ#!b)PEmv_Gf{`=@)6%b?Gog z&$h3n-OqHD2n%gKAeDg5oG}!6??qXcktHIl8cxMlx$Q1G%WSIlY)*>9p4QCf(h_~sDU_~{b6#wk;T_Jq!+g&BTCH;Z>h&u8H6sjPT{oN9;i}Z`^(zTL;>hW zpgkc^^>Juy4dPcDvOB>suOEv!6&u&9_sDTwE_7+wgjW8#onf5`Rd}-dGLT*0hD+nN z14uo}X{BA5Xz=j7HhWp#L=EA2XgD*&DDHTRhbhTipur4lbx^ZxwUQ@i+qccfeuLb+ z#2hv)oaGA@kFZ0@VTWR=&w1cD&xEcz+4$ZLyka@fQ zPBR7$x7xD26GU1@v9rG64#kd-+jUgZ{q-H1H%0j@usqgV;CIL|h?d*A$*%o2;yP~@O%-5}%vwWl15^~iPN zs8bxPOgz{>A5<9HbmBiCt#jcNq;tf6~;?Ci%>j27f7lD5To%Sn9cO-6a{P+a1nXL&N z)j-15qABjw!f~90`x4@rYlMS{JpEcOune+>rPvz0W(CP{!boZl(bDx;1TuC%}v#KcCotSl5{zrv7 zDaJ25exS7awwF0BR@>|qld-;dJ|NtkUUHLI7B_LVHzKb2LIi7X2dk-WKUzjxrSKwLCJH~Qm)_s8Qz zpb9#d_%(*PSa8U^EkVB}>0IjnbXof&Bt(}bjgnIMNiZ62v@tAD3uy;DkI*I3`lKN= z^Z1K_`yDb0c98OS^k>Hg#tryEBYtyugN-~`!FkXC6Y1K*IDvpRfqlwA3}SA1M0rf9$W9|Z$n@ANP(&;&9dpl0ZYb@A zQLz#~gvNybsDVH)fS_a{oKi*;@Uk>Q^**QP$0hSPu6c)z5V_j4B9)7T^9Do1VLhH=+d2lo1AeiOFmi1tgTarN`W=!%Gs>*AcM&D z&W*Na{t#t-qo@V^J!UgBL?Q2y$Xx%S^1`Rdn-0Kc=3{yi+_Y?cZESl~3dkF-f{mLX zx%6i)ln_cdJlUY<*Qz1^7^63ywQ}l?Rdt~O${sFjLpBG8*WT$HOq>}tE+%ZX(Ivam zdXSp}^a?}&K{=-vE?P)nk>`f~ww5LpSEa7DBhl^I1;nL za3#tV41`i~;~OT4mplwX{*pvk2n90-5B>FIk9Jxyh7Qf(+%ReU&F3hoG29S)?mIO; zNI?B_>>?G+Usvx}=RZ2P+??5sRd$FRnkPK_{Vm`XTf;|z?mpr{hYU#@%_B18um|_d z`X)VyHQcvRcJy0L06CI!A40EpUc54;p0?Hz5cIY}C&)|%rR^c2l0M|jt{r$$RexV) z_Y)BK>OLnTOk^1Gl&Q7aLJg(28yqnx7tVKnrYyeL{4^FTd)dkcI{(o89}hkDVWo6m zwkBFd0ZZ=3Lz$;Kc88OGqYo7P+2%yDr%etGHV|JgJ?^NFlAJft!C`I>DSPLvo}uL? zTW*x1nb_c+?`f)SY0iu?Og}$a`G@Yn)^tUocbCBr4aTL=;BZHx4uVWlD3$9DZ1sh6#KTj)oy;xVquHMfnDAq%1C>C%$(VwvT^evCUFH7WG0fSmz|w zaSI^d7L-~UUz4}PO+TSk9TpFf4 z**9~8N2;9rl2Q;?oX;XqL|id3=1eiuIul9G=*fIrFyztT;8Sl>otzox9;&c9jUiU1 zUy;&TuEXkeRu_wztA)Q1Z{<~y`7A67Z35CG2O)w1W$Gv9;GPki>9hF2JSL)zk$QNz z)XHlZ)amZSvP{BL>C-t@COv9LedZbtJ+Qws&VK`tC$P8Q)(Tx=wo7@KEEl=J0((y( zBgCk}<)WmR?PHaU%SMtz{6vMLB0#&@Z;DQqk6wB*Lz<9NqMh*^M|-9PbB>A#?Om^& zU!JHc_qH1eW>YeSi1FI>nv_}JeQR!F0ihFc!6brfRJn6#N4gW3&B%5RSNHHQU_ZlB!(7bTjEId~5 zdxVeijB9;9pP^0hIbZRmIpnEEM0`&ee9lB9sEgjGf5p-S(sh5f;;kavb z-(|VuxGqmZqJWZASGEuaG0^d{Wt#3!koO2@Fkme`1z z(NuZMBxpW+3R&-1t2#L^N-nsQ*zC;+E{Sk4hl8+MPxQaTNS&i#p4tY)YN8kW7dm47%)S2UYdKiRjvch`sx7UthcP+g1R9x zE09wVsdYQ}-gMW)4P!`1W-y|WG_?boXon+5RrhrxpBur7uE zY+LTXv`&MAp){wUwN%eQCG$FMLw}k68I{G?hrMZ^f zELBqgXuZ{_@@XYuq%WqrfPJvB!o$wX5N~Appz~Ff)x63T&Ftd)SKJW=DwY%h<&;-` zmSCCWaEDo)d4~$h^u71{>u|79ZK%N?p^xchGF`S`yK9uZG^#r4KZ)#?!$nMF zH>8nHR5lp0(R674_uJcz3&<^-VnsVCYsg5n3q+Q63-z zZrD64ln1Q%QO<1O?nqfwa4&MP)=)SPnSkfxuulA1dNIZ)*VY&HuDwnJ2sDE63VjP$ z@VM~eEdpq$&}TZu*^^HX#QbFu0rUjy&n4{xsyF8C7JmJ*eN%!%jzq8Kb&AUx zSB?GDA>^#@Vdk;a1lc%Ht{+_$=hZ#9H+fZt2E_`saf~o`B{)DK~--G^kq& z#MXic9W#f?lheXNK5TY7<~g0NgUqQ}q;?q*5&2AwJKDf26T` zI|yK}w+vhdU8LUbGUx~F=E@l<0`oLZvkS9pBqF%iCHao1i5SdEZ7kZrul7;CRSQtw zUimY74pPbcXz>q1SjX}?O!o>KnH;j``&6lGNxn-kf_;Z+W zLqrZ5;P--^m~4-Mq?6yC$@y(HT&H0JaQcc4)hiR+5lu?~w>AY)XN0=nwfVPwS`mgw zUIg1?$srpCWI2g|q%Zn_XPyq2#~q=7`OXFKNo6#b0)F#ugAbW6hZXkHYy;cUaCVi7 zFitxNj2pe%06^+msukh*;15O{fs~_7`tYMY8)ctHn#r(i;$Gf`@s1+w38CQ&ZD^m_ zNdodsP&x)QcB@HWi>o@PfQEk}w`FTvXWYjb3c0Bwhi_5j)j12I6` zdTo9#e8^e?)TAzLLn9z0$`2}OZLz#yUN2>Vss-s9W*)(Co(XVwk zTQC7>i1u2TJlG7F8Tr0zgM3GZRHBp`M08zD64)|7YlDsTLAX3&u-Du+z>YJD&An`6 z(TXzQnvvXqhZmc+GEiFs7P3NA3oG485zCriKz`isZn=p-w~<#S;DgI0lAse7srpKk z3k;>oRN_aV7}G{efMM^po~WI1gJdq;386qk4dt9-~5D>0ZQ`>I}l0+RY=q8gU45|Xb`TX5fP{HMMI9DFhf~u^#(MhovG>Hn9V9aW#J|h}Sg@)P%Ojz*E zG)x1(`EK2TR=Z+rERw3m91MqlRifzm5Cq{t(ah%G8{Cm&Z6qx}7KN zETnAfxwnr%^F8dbV-LH-5)ONL$poNJQ#eP zy0*)0`8e^mlxrShk%7K=6|c)^qJJ)Q3+9llX0kPkXg*T zdUCg294-{BD$kZ+2z*}#?w&>XU}V*PkR9+$!eMTN>8_~_<=D!j6)Ayztnlw+k4KA0 zVoevF3`I-I`J~t?e0v${Q_N|829)e&fA9w7W%J{IBx_yN=Nk9I^|SQ0w6Fg zV*$Z_pXrEc1u{5POOBdifWcYIO~e4B9xB8DbB9JUweV+e0s{cR$`UNpQ+ED9m|vTRn|)9*q!dECH&VpcH2nZ?1D$>^KgbOU z_BwdcKadY2n>W$#-%=a@!9%(K7sKk`HJ;?{=iVMw@*$5Uz{+Sk|6x|f+s@YSd%R9; zQ2yhMqL6viyUe0K;JL|}Ca-6keAv%4@UxoE|95#@z3;hsX-eYYrt#OzrFq}QmRM&i zJ~id#!_LI(vp1cyfsT3Kw}02~Kj5Oi>t=ZUQ9tHq8YW=T-*)SxrSW%NXmlg|O)Gl( zU(0yzv{v=UT;MnVb~^X)yY9~qd2Sl_@KN#ZP|SZ#ntI=gp7w>Vi^lwIdmK7r(>fy` zw@JOe*weevDKkGhm`(TAN4vm>T-dk&W;!bx9W$*s{qYfL`d{l)RC;~yqMs0zR{U*I z=@TG>&FRf89RQiwr#SuZ)&KS;^r4TZvsumh6qWuXD6c%4^4Z_EeSeGj>jBvq<1qJU z4E$SHH__Pk%|F)cUW8fj6$UdKGDk2nJPLuZ9MXi{09U_(b@&HQFI@+w!|y)o51vLZ z_Lm;DblsPK_!<7>&Hm&w{G~_z$&0-{x9|8UAAi)Jyx5!9@vZmz_@l}(r!l|Z6>q)T z+c(V{zy6cY@RuI-ColG{+j{B~PUENeDh8-3A}OV9`DI@kf39f<^bv#~<}+nNNnPPs@A~1AJQMpO*Q*vEHX>KD9gi zH&A|Gfc+HB(arM-w2Ls^$H(PQ(fs%H@e^qOl$*bq7` +#import "RCTRootView.h" +#import "RCTShadowView.h" #import "RCTSparseArray.h" #import "RCTUIManager.h" #import "UIView+React.h" @@ -9,14 +11,36 @@ @interface RCTUIManager (Testing) - (void)_manageChildren:(NSNumber *)containerReactTag - moveFromIndices:(NSArray *)moveFromIndices - moveToIndices:(NSArray *)moveToIndices addChildReactTags:(NSArray *)addChildReactTags addAtIndices:(NSArray *)addAtIndices removeAtIndices:(NSArray *)removeAtIndices registry:(RCTSparseArray *)registry; +- (void)modifyManageChildren:(NSNumber *)containerReactTag + addChildReactTags:(NSMutableArray *)mutableAddChildReactTags + addAtIndices:(NSMutableArray *)mutableAddAtIndices + removeAtIndices:(NSMutableArray *)mutableRemoveAtIndices; + +- (void)createView:(NSNumber *)reactTag + viewName:(NSString *)viewName + rootTag:(NSNumber *)rootTag + props:(NSDictionary *)props; + +- (void)updateView:(NSNumber *)reactTag + viewName:(NSString *)viewName + props:(NSDictionary *)props; + +- (void)manageChildren:(NSNumber *)containerReactTag + moveFromIndices:(NSArray *)moveFromIndices + moveToIndices:(NSArray *)moveToIndices + addChildReactTags:(NSArray *)addChildReactTags + addAtIndices:(NSArray *)addAtIndices + removeAtIndices:(NSArray *)removeAtIndices; + +- (void)flushUIBlocks; + @property (nonatomic, readonly) RCTSparseArray *viewRegistry; +@property (nonatomic, readonly) RCTSparseArray *shadowViewRegistry; // RCT thread only @end @@ -39,6 +63,11 @@ UIView *registeredView = [[UIView alloc] init]; [registeredView setReactTag:@(i)]; _uiManager.viewRegistry[i] = registeredView; + + RCTShadowView *registeredShadowView = [[RCTShadowView alloc] init]; + registeredShadowView.viewName = @"RCTView"; + [registeredShadowView setReactTag:@(i)]; + _uiManager.shadowViewRegistry[i] = registeredShadowView; } } @@ -55,8 +84,6 @@ // Add views 1-5 to view 20 [_uiManager _manageChildren:@20 - moveFromIndices:nil - moveToIndices:nil addChildReactTags:tagsToAdd addAtIndices:addAtIndices removeAtIndices:nil @@ -89,8 +116,6 @@ // Remove views 1-5 from view 20 [_uiManager _manageChildren:@20 - moveFromIndices:nil - moveToIndices:nil addChildReactTags:nil addAtIndices:nil removeAtIndices:removeAtIndices @@ -128,11 +153,9 @@ { UIView *containerView = _uiManager.viewRegistry[20]; - NSArray *removeAtIndices = @[@2, @3, @5, @8]; - NSArray *addAtIndices = @[@0, @6]; - NSArray *tagsToAdd = @[@11, @12]; - NSArray *moveFromIndices = @[@4, @9]; - NSArray *moveToIndices = @[@1, @7]; + NSArray *removeAtIndices = @[@2, @3, @5, @8, @4, @9]; + NSArray *addAtIndices = @[@0, @6, @1, @7]; + NSArray *tagsToAdd = @[@11, @12, @5, @10]; // We need to keep these in array to keep them around NSMutableArray *viewsToRemove = [NSMutableArray array]; @@ -148,8 +171,6 @@ } [_uiManager _manageChildren:@20 - moveFromIndices:moveFromIndices - moveToIndices:moveToIndices addChildReactTags:tagsToAdd addAtIndices:addAtIndices removeAtIndices:removeAtIndices @@ -176,4 +197,329 @@ } } +/* +-----------------------------------------------------------+ +----------------------+ + * | Shadow Hierarchy | | Legend | + * +-----------------------------------------------------------+ +----------------------+ + * | | | | + * | +---+ ****** | | ******************** | + * | | 1 | * 11 * | | * Layout-only View * | + * | +---+ ****** | | ******************** | + * | | | | | | + * | +-------+---+---+----------+ +---+---+ | | +----+ | + * | | | | | | | | | |View| Subview | + * | v v v v v v | | +----+ -----------> | + * | ***** +---+ ***** +---+ +----+ +----+ | | | + * | * 2 * | 3 | * 4 * | 5 | | 12 | | 13 | | +----------------------+ + * | ***** +---+ ***** +---+ +----+ +----+ | + * | | | | | + * | +---+--+ | +---+---+ | + * | | | | | | | + * | v v v v v | + * | +---+ +---+ +---+ +---+ ****** | + * | | 6 | | 7 | | 8 | | 9 | * 10 * | + * | +---+ +---+ +---+ +---+ ****** | + * | | + * +-----------------------------------------------------------+ + * + * +-----------------------------------------------------------+ + * | View Hierarchy | + * +-----------------------------------------------------------+ + * | | + * | +---+ ****** | + * | | 1 | * 11 * | + * | +---+ ****** | + * | | | | + * | +------+------+------+------+ +---+---+ | + * | | | | | | | | | + * | v v v v v v v | + * | +---+ +---+ +---+ +---+ +---+ +----+ +----+ | + * | | 6 | | 7 | | 3 | | 8 | | 5 | | 12 | | 13 | | + * | +---+ +---+ +---+ +---+ +---+ +----+ +----+ | + * | | | + * | v | + * | +---+ | + * | | 9 | | + * | +---+ | + * | | + * +-----------------------------------------------------------+ + */ + +- (void)updateShadowViewWithReactTag:(NSNumber *)reactTag layoutOnly:(BOOL)isLayoutOnly childTags:(NSArray *)childTags +{ + RCTShadowView *shadowView = _uiManager.shadowViewRegistry[reactTag]; + shadowView.allProps = isLayoutOnly ? @{} : @{@"collapsible": @NO}; + [childTags enumerateObjectsUsingBlock:^(NSNumber *childTag, NSUInteger idx, __unused BOOL *stop) { + [shadowView insertReactSubview:_uiManager.shadowViewRegistry[childTag] atIndex:idx]; + }]; +} + +- (void)setUpShadowViewHierarchy +{ + [self updateShadowViewWithReactTag:@1 layoutOnly:NO childTags:@[@2, @3, @4, @5]]; + [self updateShadowViewWithReactTag:@2 layoutOnly:YES childTags:@[@6, @7]]; + [self updateShadowViewWithReactTag:@3 layoutOnly:NO childTags:nil]; + [self updateShadowViewWithReactTag:@4 layoutOnly:YES childTags:@[@8]]; + [self updateShadowViewWithReactTag:@5 layoutOnly:NO childTags:@[@9, @10]]; + [self updateShadowViewWithReactTag:@6 layoutOnly:NO childTags:nil]; + [self updateShadowViewWithReactTag:@7 layoutOnly:NO childTags:nil]; + [self updateShadowViewWithReactTag:@8 layoutOnly:NO childTags:nil]; + [self updateShadowViewWithReactTag:@9 layoutOnly:NO childTags:nil]; + [self updateShadowViewWithReactTag:@10 layoutOnly:YES childTags:nil]; + [self updateShadowViewWithReactTag:@11 layoutOnly:YES childTags:@[@12, @13]]; + [self updateShadowViewWithReactTag:@12 layoutOnly:NO childTags:nil]; + [self updateShadowViewWithReactTag:@13 layoutOnly:NO childTags:nil]; +} + +- (void)testModifyIndices1 +{ + [self setUpShadowViewHierarchy]; + + NSMutableArray *addTags = [@[@2] mutableCopy]; + NSMutableArray *addIndices = [@[@3] mutableCopy]; + NSMutableArray *removeIndices = [@[@0] mutableCopy]; + [self.uiManager modifyManageChildren:@1 + addChildReactTags:addTags + addAtIndices:addIndices + removeAtIndices:removeIndices]; + XCTAssertEqualObjects(addTags, (@[@6, @7])); + XCTAssertEqualObjects(addIndices, (@[@3, @4])); + XCTAssertEqualObjects(removeIndices, (@[@0, @1])); +} + +- (void)testModifyIndices2 +{ + [self setUpShadowViewHierarchy]; + + NSMutableArray *addTags = [@[@11] mutableCopy]; + NSMutableArray *addIndices = [@[@4] mutableCopy]; + NSMutableArray *removeIndices = [@[] mutableCopy]; + [self.uiManager modifyManageChildren:@1 + addChildReactTags:addTags + addAtIndices:addIndices + removeAtIndices:removeIndices]; + XCTAssertEqualObjects(addTags, (@[@12, @13])); + XCTAssertEqualObjects(addIndices, (@[@5, @6])); + XCTAssertEqualObjects(removeIndices, (@[])); +} + +- (void)testModifyIndices3 +{ + [self setUpShadowViewHierarchy]; + + NSMutableArray *addTags = [@[] mutableCopy]; + NSMutableArray *addIndices = [@[] mutableCopy]; + NSMutableArray *removeIndices = [@[@2] mutableCopy]; + [self.uiManager modifyManageChildren:@1 + addChildReactTags:addTags + addAtIndices:addIndices + removeAtIndices:removeIndices]; + XCTAssertEqualObjects(addTags, (@[])); + XCTAssertEqualObjects(addIndices, (@[])); + XCTAssertEqualObjects(removeIndices, (@[@3])); +} + +- (void)testModifyIndices4 +{ + [self setUpShadowViewHierarchy]; + + NSMutableArray *addTags = [@[@11] mutableCopy]; + NSMutableArray *addIndices = [@[@3] mutableCopy]; + NSMutableArray *removeIndices = [@[@2] mutableCopy]; + [self.uiManager modifyManageChildren:@1 + addChildReactTags:addTags + addAtIndices:addIndices + removeAtIndices:removeIndices]; + XCTAssertEqualObjects(addTags, (@[@12, @13])); + XCTAssertEqualObjects(addIndices, (@[@4, @5])); + XCTAssertEqualObjects(removeIndices, (@[@3])); +} + +- (void)testModifyIndices5 +{ + [self setUpShadowViewHierarchy]; + + NSMutableArray *addTags = [@[] mutableCopy]; + NSMutableArray *addIndices = [@[] mutableCopy]; + NSMutableArray *removeIndices = [@[@0, @1, @2, @3] mutableCopy]; + [self.uiManager modifyManageChildren:@1 + addChildReactTags:addTags + addAtIndices:addIndices + removeAtIndices:removeIndices]; + XCTAssertEqualObjects(addTags, (@[])); + XCTAssertEqualObjects(addIndices, (@[])); + XCTAssertEqualObjects(removeIndices, (@[@0, @1, @2, @3, @4])); +} + +- (void)testModifyIndices6 +{ + [self setUpShadowViewHierarchy]; + + NSMutableArray *addTags = [@[@11] mutableCopy]; + NSMutableArray *addIndices = [@[@0] mutableCopy]; + NSMutableArray *removeIndices = [@[@0, @1, @2, @3] mutableCopy]; + [self.uiManager modifyManageChildren:@1 + addChildReactTags:addTags + addAtIndices:addIndices + removeAtIndices:removeIndices]; + XCTAssertEqualObjects(addTags, (@[@12, @13])); + XCTAssertEqualObjects(addIndices, (@[@0, @1])); + XCTAssertEqualObjects(removeIndices, (@[@0, @1, @2, @3, @4])); +} + +- (void)testModifyIndices7 +{ + [self setUpShadowViewHierarchy]; + + NSMutableArray *addTags = [@[@11] mutableCopy]; + NSMutableArray *addIndices = [@[@1] mutableCopy]; + NSMutableArray *removeIndices = [@[@0, @2, @3] mutableCopy]; + [self.uiManager modifyManageChildren:@1 + addChildReactTags:addTags + addAtIndices:addIndices + removeAtIndices:removeIndices]; + XCTAssertEqualObjects(addTags, (@[@12, @13])); + XCTAssertEqualObjects(addIndices, (@[@1, @2])); + XCTAssertEqualObjects(removeIndices, (@[@0, @1, @3, @4])); +} + +- (void)testScenario1 +{ + RCTUIManager *uiManager = [[RCTUIManager alloc] init]; + RCTBridge *bridge = [[RCTBridge alloc] initWithBundleURL:nil moduleProvider:^{ return @[uiManager]; } launchOptions:nil]; + NS_VALID_UNTIL_END_OF_SCOPE RCTRootView *rootView = [[RCTRootView alloc] initWithBridge:bridge moduleName:@"Test"]; + + XCTestExpectation *expectation = [self expectationWithDescription:@""]; + + dispatch_queue_t shadowQueue = [uiManager valueForKey:@"shadowQueue"]; + dispatch_async(shadowQueue, ^{ + // Make sure root view finishes loading. + dispatch_sync(dispatch_get_main_queue(), ^{}); + + /* */[uiManager createView:@2 viewName:@"RCTView" rootTag:@1 props:@{@"bottom":@0,@"left":@0,@"position":@"absolute",@"right":@0,@"top":@0}]; + /* */[uiManager createView:@3 viewName:@"RCTView" rootTag:@1 props:@{@"bottom":@0,@"left":@0,@"position":@"absolute",@"right":@0,@"top":@0}]; + /* V */[uiManager createView:@4 viewName:@"RCTView" rootTag:@1 props:@{@"alignItems":@"center",@"backgroundColor":@"#F5FCFF",@"flex":@1,@"justifyContent":@"center"}]; + /* V */[uiManager createView:@5 viewName:@"RCTView" rootTag:@1 props:@{@"backgroundColor":@"blue",@"height":@50,@"width":@50}]; + /* */[uiManager createView:@6 viewName:@"RCTView" rootTag:@1 props:@{@"width":@250}]; + /* V */[uiManager createView:@7 viewName:@"RCTView" rootTag:@1 props:@{@"borderWidth":@10,@"margin":@50}]; + /* V */[uiManager createView:@8 viewName:@"RCTView" rootTag:@1 props:@{@"backgroundColor":@"yellow",@"height":@50}]; + /* V */[uiManager createView:@9 viewName:@"RCTText" rootTag:@1 props:@{@"accessible":@1,@"fontSize":@20,@"isHighlighted":@0,@"margin":@10,@"textAlign":@"center"}]; + /* */[uiManager createView:@10 viewName:@"RCTRawText" rootTag:@1 props:@{@"text":@"This tests removal of layout-only views."}]; + /* */[uiManager manageChildren:@9 moveFromIndices:nil moveToIndices:nil addChildReactTags:@[@10] addAtIndices:@[@0] removeAtIndices:nil]; + /* V */[uiManager createView:@12 viewName:@"RCTView" rootTag:@1 props:@{@"backgroundColor":@"green",@"height":@50}]; + /* */[uiManager manageChildren:@7 moveFromIndices:nil moveToIndices:nil addChildReactTags:@[@8,@9,@12] addAtIndices:@[@0,@1,@2] removeAtIndices:nil]; + /* */[uiManager manageChildren:@6 moveFromIndices:nil moveToIndices:nil addChildReactTags:@[@7] addAtIndices:@[@0] removeAtIndices:nil]; + /* V */[uiManager createView:@13 viewName:@"RCTView" rootTag:@1 props:@{@"backgroundColor":@"red",@"height":@50,@"width":@50}]; + /* */[uiManager manageChildren:@4 moveFromIndices:nil moveToIndices:nil addChildReactTags:@[@5,@6,@13] addAtIndices:@[@0,@1,@2] removeAtIndices:nil]; + /* */[uiManager manageChildren:@3 moveFromIndices:nil moveToIndices:nil addChildReactTags:@[@4] addAtIndices:@[@0] removeAtIndices:nil]; + /* */[uiManager manageChildren:@2 moveFromIndices:nil moveToIndices:nil addChildReactTags:@[@3] addAtIndices:@[@0] removeAtIndices:nil]; + /* */[uiManager manageChildren:@1 moveFromIndices:nil moveToIndices:nil addChildReactTags:@[@2] addAtIndices:@[@0] removeAtIndices:nil]; + + [uiManager addUIBlock:^(RCTUIManager *uiManager_, __unused RCTSparseArray *viewRegistry) { + XCTAssertEqual(uiManager_.shadowViewRegistry.count, (NSUInteger)12); + XCTAssertEqual(uiManager_.viewRegistry.count, (NSUInteger)8); + [expectation fulfill]; + }]; + + [uiManager flushUIBlocks]; + }); + + [self waitForExpectationsWithTimeout:1 handler:nil]; + + expectation = [self expectationWithDescription:@""]; + dispatch_async(shadowQueue, ^{ + [uiManager updateView:@7 viewName:@"RCTView" props:@{@"borderWidth":[NSNull null]}]; + [uiManager addUIBlock:^(RCTUIManager *uiManager_, __unused RCTSparseArray *viewRegistry) { + XCTAssertEqual(uiManager_.shadowViewRegistry.count, (NSUInteger)12); + XCTAssertEqual(uiManager_.viewRegistry.count, (NSUInteger)7); + [expectation fulfill]; + }]; + + [uiManager flushUIBlocks]; + }); + + [self waitForExpectationsWithTimeout:1 handler:nil]; + + expectation = [self expectationWithDescription:@""]; + dispatch_async(shadowQueue, ^{ + [uiManager updateView:@7 viewName:@"RCTView" props:@{@"borderWidth":@10}]; + [uiManager addUIBlock:^(RCTUIManager *uiManager_, __unused RCTSparseArray *viewRegistry) { + XCTAssertEqual(uiManager_.shadowViewRegistry.count, (NSUInteger)12); + XCTAssertEqual(uiManager_.viewRegistry.count, (NSUInteger)8); + [expectation fulfill]; + }]; + + [uiManager flushUIBlocks]; + }); + + [self waitForExpectationsWithTimeout:1 handler:nil]; +} + +- (void)testScenario2 +{ + RCTUIManager *uiManager = [[RCTUIManager alloc] init]; + RCTBridge *bridge = [[RCTBridge alloc] initWithBundleURL:nil moduleProvider:^{ return @[uiManager]; } launchOptions:nil]; + NS_VALID_UNTIL_END_OF_SCOPE RCTRootView *rootView = [[RCTRootView alloc] initWithBridge:bridge moduleName:@"Test"]; + + XCTestExpectation *expectation = [self expectationWithDescription:@""]; + + dispatch_queue_t shadowQueue = [uiManager valueForKey:@"shadowQueue"]; + dispatch_async(shadowQueue, ^{ + // Make sure root view finishes loading. + dispatch_sync(dispatch_get_main_queue(), ^{}); + + /* */[uiManager createView:@2 viewName:@"RCTView" rootTag:@1 props:@{@"bottom":@0,@"left":@0,@"position":@"absolute",@"right":@0,@"top":@0}]; + /* */[uiManager createView:@3 viewName:@"RCTView" rootTag:@1 props:@{@"bottom":@0,@"left":@0,@"position":@"absolute",@"right":@0,@"top":@0}]; + /* V */[uiManager createView:@4 viewName:@"RCTView" rootTag:@1 props:@{@"alignItems":@"center",@"backgroundColor":@"#F5FCFF",@"flex":@1,@"justifyContent":@"center"}]; + /* */[uiManager createView:@5 viewName:@"RCTView" rootTag:@1 props:@{@"width":@250}]; + /* V */[uiManager createView:@6 viewName:@"RCTView" rootTag:@1 props:@{@"borderWidth":@1}]; + /* V */[uiManager createView:@7 viewName:@"RCTText" rootTag:@1 props:@{@"accessible":@1,@"fontSize":@20,@"isHighlighted":@0,@"margin":@10,@"textAlign":@"center"}]; + /* */[uiManager createView:@8 viewName:@"RCTRawText" rootTag:@1 props:@{@"text":@"This tests removal of layout-only views."}]; + /* */[uiManager manageChildren:@7 moveFromIndices:nil moveToIndices:nil addChildReactTags:@[@8] addAtIndices:@[@0] removeAtIndices:nil]; + /* */[uiManager manageChildren:@6 moveFromIndices:nil moveToIndices:nil addChildReactTags:@[@7] addAtIndices:@[@0] removeAtIndices:nil]; + /* */[uiManager manageChildren:@5 moveFromIndices:nil moveToIndices:nil addChildReactTags:@[@6] addAtIndices:@[@0] removeAtIndices:nil]; + /* */[uiManager manageChildren:@4 moveFromIndices:nil moveToIndices:nil addChildReactTags:@[@5] addAtIndices:@[@0] removeAtIndices:nil]; + /* */[uiManager manageChildren:@3 moveFromIndices:nil moveToIndices:nil addChildReactTags:@[@4] addAtIndices:@[@0] removeAtIndices:nil]; + /* */[uiManager manageChildren:@2 moveFromIndices:nil moveToIndices:nil addChildReactTags:@[@3] addAtIndices:@[@0] removeAtIndices:nil]; + /* */[uiManager manageChildren:@1 moveFromIndices:nil moveToIndices:nil addChildReactTags:@[@2] addAtIndices:@[@0] removeAtIndices:nil]; + + [uiManager addUIBlock:^(RCTUIManager *uiManager_, __unused RCTSparseArray *viewRegistry) { + XCTAssertEqual(uiManager_.shadowViewRegistry.count, (NSUInteger)8); + XCTAssertEqual(uiManager_.viewRegistry.count, (NSUInteger)4); + [expectation fulfill]; + }]; + + [uiManager flushUIBlocks]; + }); + + [self waitForExpectationsWithTimeout:1 handler:nil]; + + expectation = [self expectationWithDescription:@""]; + dispatch_async(shadowQueue, ^{ + [uiManager updateView:@6 viewName:@"RCTView" props:@{@"borderWidth":[NSNull null]}]; + [uiManager addUIBlock:^(RCTUIManager *uiManager_, __unused RCTSparseArray *viewRegistry) { + XCTAssertEqual(uiManager_.shadowViewRegistry.count, (NSUInteger)8); + XCTAssertEqual(uiManager_.viewRegistry.count, (NSUInteger)3); + [expectation fulfill]; + }]; + + [uiManager flushUIBlocks]; + }); + + [self waitForExpectationsWithTimeout:1 handler:nil]; + + expectation = [self expectationWithDescription:@""]; + dispatch_async(shadowQueue, ^{ + [uiManager updateView:@6 viewName:@"RCTView" props:@{@"borderWidth":@1}]; + [uiManager addUIBlock:^(RCTUIManager *uiManager_, __unused RCTSparseArray *viewRegistry) { + XCTAssertEqual(uiManager_.shadowViewRegistry.count, (NSUInteger)8); + XCTAssertEqual(uiManager_.viewRegistry.count, (NSUInteger)4); + [expectation fulfill]; + }]; + + [uiManager flushUIBlocks]; + }); + + [self waitForExpectationsWithTimeout:1 handler:nil]; +} + @end diff --git a/Libraries/Components/ScrollView/ScrollView.js b/Libraries/Components/ScrollView/ScrollView.js index 512d8dbd6..f01cce58a 100644 --- a/Libraries/Components/ScrollView/ScrollView.js +++ b/Libraries/Components/ScrollView/ScrollView.js @@ -279,6 +279,7 @@ var ScrollView = React.createClass({ var contentContainer = diff --git a/Libraries/Components/View/View.js b/Libraries/Components/View/View.js index c6a279a22..0cb6e4a4f 100644 --- a/Libraries/Components/View/View.js +++ b/Libraries/Components/View/View.js @@ -77,6 +77,12 @@ var View = React.createClass({ }, propTypes: { + /** + * When false, indicates that the view should not be collapsed, even if it is + * layout-only. Defaults to true. + */ + collapsible: PropTypes.bool, + /** * When true, indicates that the view is an accessibility element. By default, * all the touchable elements are accessible. diff --git a/Libraries/ReactNative/ReactNativeViewAttributes.js b/Libraries/ReactNative/ReactNativeViewAttributes.js index 50b839e1d..eb3a396ca 100644 --- a/Libraries/ReactNative/ReactNativeViewAttributes.js +++ b/Libraries/ReactNative/ReactNativeViewAttributes.js @@ -24,6 +24,18 @@ ReactNativeViewAttributes.UIView = { onLayout: true, onAccessibilityTap: true, onMagicTap: true, + collapsible: true, + + // If any below are set, view should not be collapsible! + onMoveShouldSetResponder: true, + onResponderGrant: true, + onResponderMove: true, + onResponderReject: true, + onResponderRelease: true, + onResponderTerminate: true, + onResponderTerminationRequest: true, + onStartShouldSetResponder: true, + onStartShouldSetResponderCapture: true, }; ReactNativeViewAttributes.RCTView = merge( diff --git a/Libraries/Text/RCTShadowRawText.m b/Libraries/Text/RCTShadowRawText.m index e99e1187b..00a3490bc 100644 --- a/Libraries/Text/RCTShadowRawText.m +++ b/Libraries/Text/RCTShadowRawText.m @@ -20,6 +20,11 @@ } } +- (BOOL)isLayoutOnly +{ + return YES; +} + - (NSString *)description { NSString *superDescription = super.description; diff --git a/React/Modules/RCTUIManager.m b/React/Modules/RCTUIManager.m index ef2d367a0..3d81801cd 100644 --- a/React/Modules/RCTUIManager.m +++ b/React/Modules/RCTUIManager.m @@ -33,15 +33,8 @@ #import "RCTViewNodeProtocol.h" #import "UIView+React.h" -typedef void (^react_view_node_block_t)(id); - -static void RCTTraverseViewNodes(id view, react_view_node_block_t block) -{ - if (view.reactTag) block(view); - for (id subview in view.reactSubviews) { - RCTTraverseViewNodes(subview, block); - } -} +static void RCTTraverseViewNodes(id view, void (^block)(id)); +static NSDictionary *RCTPropsMerge(NSDictionary *beforeProps, NSDictionary *newProps); @interface RCTAnimation : NSObject @@ -467,6 +460,24 @@ static NSDictionary *RCTViewConfigForModule(Class managerClass) [rootShadowView collectRootUpdatedFrames:viewsWithNewFrames parentConstraint:(CGSize){CSS_UNDEFINED, CSS_UNDEFINED}]; + NSSet *originalViewsWithNewFrames = [viewsWithNewFrames copy]; + NSMutableArray *viewsToCheck = [viewsWithNewFrames.allObjects mutableCopy]; + while (viewsToCheck.count > 0) { + // Better to remove from the front and append to the end + // because of how NSMutableArray is implemented. + // (It's a "round" buffer with stored size and offset.) + + RCTShadowView *viewToCheck = viewsToCheck.firstObject; + [viewsToCheck removeObjectAtIndex:0]; + + if (viewToCheck.layoutOnly) { + [viewsWithNewFrames removeObject:viewToCheck]; + [viewsToCheck addObjectsFromArray:[viewToCheck reactSubviews]]; + } else { + [viewsWithNewFrames addObject:viewToCheck]; + } + } + // Parallel arrays are built and then handed off to main thread NSMutableArray *frameReactTags = [NSMutableArray arrayWithCapacity:viewsWithNewFrames.count]; NSMutableArray *frames = [NSMutableArray arrayWithCapacity:viewsWithNewFrames.count]; @@ -475,26 +486,30 @@ static NSDictionary *RCTViewConfigForModule(Class managerClass) NSMutableArray *onLayoutEvents = [NSMutableArray arrayWithCapacity:viewsWithNewFrames.count]; for (RCTShadowView *shadowView in viewsWithNewFrames) { - [frameReactTags addObject:shadowView.reactTag]; - [frames addObject:[NSValue valueWithCGRect:shadowView.frame]]; + CGRect frame = shadowView.adjustedFrame; + NSNumber *reactTag = shadowView.reactTag; + [frameReactTags addObject:reactTag]; + [frames addObject:[NSValue valueWithCGRect:frame]]; [areNew addObject:@(shadowView.isNewView)]; - [parentsAreNew addObject:@(shadowView.superview.isNewView)]; - id event = (id)kCFNull; - if (shadowView.hasOnLayout) { - event = @{ - @"target": shadowView.reactTag, - @"layout": @{ - @"x": @(shadowView.frame.origin.x), - @"y": @(shadowView.frame.origin.y), - @"width": @(shadowView.frame.size.width), - @"height": @(shadowView.frame.size.height), - }, - }; + + RCTShadowView *superview = shadowView; + BOOL parentIsNew = NO; + while (YES) { + superview = superview.superview; + parentIsNew = superview.isNewView; + if (!superview.layoutOnly) { + break; + } } + [parentsAreNew addObject:@(parentIsNew)]; + + id event = shadowView.hasOnLayout + ? RCTShadowViewOnLayoutEventPayload(shadowView.reactTag, frame) + : (id)kCFNull; [onLayoutEvents addObject:event]; } - for (RCTShadowView *shadowView in viewsWithNewFrames) { + for (RCTShadowView *shadowView in originalViewsWithNewFrames) { // We have to do this after we build the parentsAreNew array. shadowView.newView = NO; } @@ -511,24 +526,28 @@ static NSDictionary *RCTViewConfigForModule(Class managerClass) } // Perform layout (possibly animated) - return ^(__unused RCTUIManager *uiManager, RCTSparseArray *viewRegistry) { - RCTResponseSenderBlock callback = self->_layoutAnimation.callback; + return ^(RCTUIManager *uiManager, RCTSparseArray *viewRegistry) { + RCTResponseSenderBlock callback = uiManager->_layoutAnimation.callback; __block NSUInteger completionsCalled = 0; for (NSUInteger ii = 0; ii < frames.count; ii++) { NSNumber *reactTag = frameReactTags[ii]; UIView *view = viewRegistry[reactTag]; + if (!view) { + continue; + } + CGRect frame = [frames[ii] CGRectValue]; id event = onLayoutEvents[ii]; BOOL isNew = [areNew[ii] boolValue]; - RCTAnimation *updateAnimation = isNew ? nil : _layoutAnimation.updateAnimation; + RCTAnimation *updateAnimation = isNew ? nil : uiManager->_layoutAnimation.updateAnimation; BOOL shouldAnimateCreation = isNew && ![parentsAreNew[ii] boolValue]; - RCTAnimation *createAnimation = shouldAnimateCreation ? _layoutAnimation.createAnimation : nil; + RCTAnimation *createAnimation = shouldAnimateCreation ? uiManager->_layoutAnimation.createAnimation : nil; void (^completion)(BOOL) = ^(BOOL finished) { completionsCalled++; if (event != (id)kCFNull) { - [self.bridge.eventDispatcher sendInputEventWithName:@"topLayout" body:event]; + [uiManager.bridge.eventDispatcher sendInputEventWithName:@"topLayout" body:event]; } if (callback && completionsCalled == frames.count - 1) { callback(@[@(finished)]); @@ -540,13 +559,13 @@ static NSDictionary *RCTViewConfigForModule(Class managerClass) [updateAnimation performAnimations:^{ [view reactSetFrame:frame]; for (RCTViewManagerUIBlock block in updateBlocks) { - block(self, _viewRegistry); + block(uiManager, viewRegistry); } } withCompletionBlock:completion]; } else { [view reactSetFrame:frame]; for (RCTViewManagerUIBlock block in updateBlocks) { - block(self, _viewRegistry); + block(uiManager, viewRegistry); } completion(YES); } @@ -568,7 +587,7 @@ static NSDictionary *RCTViewConfigForModule(Class managerClass) createAnimation.property); } for (RCTViewManagerUIBlock block in updateBlocks) { - block(self, _viewRegistry); + block(uiManager, viewRegistry); } } withCompletionBlock:nil]; } @@ -691,6 +710,135 @@ RCT_EXPORT_METHOD(replaceExistingNonRootView:(NSNumber *)reactTag withView:(NSNu removeAtIndices:removeAtIndices]; } +/** + * This method modifies the indices received in manageChildren() to take into + * account views that are layout only. For example, if JS tells native to insert + * view with tag 12 at index 4, but view 12 is layout only, we would want to + * insert its children's tags, tags 13 and 14, at indices 4 and 5 instead. This + * causes us to have to shift the remaining indices to account for the new + * views. + */ +- (void)modifyManageChildren:(NSNumber *)containerReactTag + addChildReactTags:(NSMutableArray *)mutableAddChildReactTags + addAtIndices:(NSMutableArray *)mutableAddAtIndices + removeAtIndices:(NSMutableArray *)mutableRemoveAtIndices +{ + NSUInteger i; + NSMutableArray *containerSubviews = [[_shadowViewRegistry[containerReactTag] reactSubviews] mutableCopy]; + + i = 0; + while (i < containerSubviews.count) { + RCTShadowView *shadowView = containerSubviews[i]; + if (!shadowView.layoutOnly) { + i++; + continue; + } + + [containerSubviews removeObjectAtIndex:i]; + + NSArray *subviews = [shadowView reactSubviews]; + NSUInteger subviewsCount = subviews.count; + NSIndexSet *insertionIndexes = [NSIndexSet indexSetWithIndexesInRange:NSMakeRange(i, subviewsCount)]; + [containerSubviews insertObjects:subviews atIndexes:insertionIndexes]; + + NSUInteger removalIndex = [mutableRemoveAtIndices indexOfObject:@(i)]; + if (removalIndex != NSNotFound) { + [mutableRemoveAtIndices removeObjectAtIndex:removalIndex]; + } + + if (subviewsCount != 1) { + for (NSUInteger j = 0, count = mutableRemoveAtIndices.count; j < count; j++) { + NSUInteger atIndex = [mutableRemoveAtIndices[j] unsignedIntegerValue]; + if (atIndex > i) { + mutableRemoveAtIndices[j] = @(atIndex + subviewsCount - 1); + } + } + } + + if (removalIndex != NSNotFound) { + for (NSUInteger j = 0; j < subviewsCount; j++) { + [mutableRemoveAtIndices insertObject:@(i + j) atIndex:removalIndex + j]; + } + } + + if (removalIndex == NSNotFound && subviewsCount != 1) { + for (NSUInteger j = 0, count = mutableAddAtIndices.count; j < count; j++) { + NSUInteger atIndex = [mutableAddAtIndices[j] unsignedIntegerValue]; + if (atIndex > i) { + mutableAddAtIndices[j] = @(atIndex + subviewsCount - 1); + } + } + } + } + + i = 0; + while (i < mutableAddChildReactTags.count) { + NSNumber *tag = mutableAddChildReactTags[i]; + NSNumber *index = mutableAddAtIndices[i]; + + RCTShadowView *shadowView = _shadowViewRegistry[tag]; + if (!shadowView.layoutOnly) { + i++; + continue; + } + + NSArray *subviews = [shadowView reactSubviews]; + NSUInteger subviewsCount = subviews.count; + [mutableAddAtIndices removeObjectAtIndex:i]; + [mutableAddChildReactTags removeObjectAtIndex:i]; + + for (NSUInteger j = 0; j < subviewsCount; j++) { + [mutableAddChildReactTags insertObject:[subviews[j] reactTag] atIndex:i + j]; + [mutableAddAtIndices insertObject:@(index.unsignedIntegerValue + j) atIndex:i + j]; + } + + for (NSUInteger j = i + subviewsCount, count = mutableAddAtIndices.count; j < count; j++) { + NSUInteger atIndex = [mutableAddAtIndices[j] unsignedIntegerValue]; + mutableAddAtIndices[j] = @(atIndex + subviewsCount - 1); + } + } +} + +- (NSNumber *)containerReactTag:(NSNumber *)containerReactTag offset:(inout NSUInteger *)offset +{ + RCTShadowView *container = _shadowViewRegistry[containerReactTag]; + NSNumber *containerSuperviewReactTag = containerReactTag; + RCTShadowView *superview = container; + + while (superview.layoutOnly) { + RCTShadowView *superviewSuperview = superview.superview; + containerSuperviewReactTag = superviewSuperview.reactTag; + NSMutableArray *reactSubviews = [[superviewSuperview reactSubviews] mutableCopy]; + NSUInteger superviewIndex = [reactSubviews indexOfObject:superview]; + + NSUInteger i = 0; + while (i < superviewIndex) { + RCTShadowView *child = reactSubviews[i]; + if (!child.layoutOnly) { + if (offset) { + (*offset)++; + } + + i++; + continue; + } + + [reactSubviews removeObjectAtIndex:i]; + + NSArray *subviews = [child reactSubviews]; + NSUInteger subviewsCount = subviews.count; + NSIndexSet *insertionIndexes = [NSIndexSet indexSetWithIndexesInRange:NSMakeRange(i, subviewsCount)]; + [reactSubviews insertObjects:subviews atIndexes:insertionIndexes]; + + superviewIndex += subviewsCount - 1; + } + + superview = superviewSuperview; + } + + return containerSuperviewReactTag; +} + RCT_EXPORT_METHOD(manageChildren:(NSNumber *)containerReactTag moveFromIndices:(NSArray *)moveFromIndices moveToIndices:(NSArray *)moveToIndices @@ -698,62 +846,109 @@ RCT_EXPORT_METHOD(manageChildren:(NSNumber *)containerReactTag addAtIndices:(NSArray *)addAtIndices removeAtIndices:(NSArray *)removeAtIndices) { + RCTShadowView *container = _shadowViewRegistry[containerReactTag]; + NSUInteger offset = 0; + NSNumber *containerSuperviewReactTag = [self containerReactTag:containerReactTag offset:&offset]; + + RCTAssert(moveFromIndices.count == moveToIndices.count, @"Invalid argument: moveFromIndices.count != moveToIndices.count"); + if (moveFromIndices.count > 0) { + NSMutableArray *mutableAddChildReactTags = [addChildReactTags mutableCopy]; + NSMutableArray *mutableAddAtIndices = [addAtIndices mutableCopy]; + NSMutableArray *mutableRemoveAtIndices = [removeAtIndices mutableCopy]; + + NSArray *containerSubviews = [container reactSubviews]; + for (NSUInteger i = 0, count = moveFromIndices.count; i < count; i++) { + NSNumber *from = moveFromIndices[i]; + NSNumber *to = moveToIndices[i]; + [mutableAddChildReactTags addObject:[containerSubviews[from.unsignedIntegerValue] reactTag]]; + [mutableAddAtIndices addObject:to]; + [mutableRemoveAtIndices addObject:from]; + } + + addChildReactTags = mutableAddChildReactTags; + addAtIndices = mutableAddAtIndices; + removeAtIndices = mutableRemoveAtIndices; + } + + NSMutableArray *mutableAddChildReactTags; + NSMutableArray *mutableAddAtIndices; + NSMutableArray *mutableRemoveAtIndices; + + if (containerSuperviewReactTag) { + mutableAddChildReactTags = [addChildReactTags mutableCopy]; + mutableAddAtIndices = [addAtIndices mutableCopy]; + mutableRemoveAtIndices = [removeAtIndices mutableCopy]; + + [self modifyManageChildren:containerReactTag + addChildReactTags:mutableAddChildReactTags + addAtIndices:mutableAddAtIndices + removeAtIndices:mutableRemoveAtIndices]; + + if (offset > 0) { + NSUInteger count = MAX(mutableAddAtIndices.count, mutableRemoveAtIndices.count); + for (NSUInteger i = 0; i < count; i++) { + if (i < mutableAddAtIndices.count) { + NSUInteger index = [mutableAddAtIndices[i] unsignedIntegerValue]; + mutableAddAtIndices[i] = @(index + offset); + } + + if (i < mutableRemoveAtIndices.count) { + NSUInteger index = [mutableRemoveAtIndices[i] unsignedIntegerValue]; + mutableRemoveAtIndices[i] = @(index + offset); + } + } + } + } + [self _manageChildren:containerReactTag - moveFromIndices:moveFromIndices - moveToIndices:moveToIndices addChildReactTags:addChildReactTags addAtIndices:addAtIndices removeAtIndices:removeAtIndices registry:_shadowViewRegistry]; - [self addUIBlock:^(RCTUIManager *uiManager, RCTSparseArray *viewRegistry){ - [uiManager _manageChildren:containerReactTag - moveFromIndices:moveFromIndices - moveToIndices:moveToIndices - addChildReactTags:addChildReactTags - addAtIndices:addAtIndices - removeAtIndices:removeAtIndices - registry:viewRegistry]; - }]; + if (containerSuperviewReactTag) { + [self addUIBlock:^(RCTUIManager *uiManager, RCTSparseArray *viewRegistry){ + (void)(id []){containerReactTag, @(offset), addChildReactTags, addAtIndices, removeAtIndices}; + [uiManager _manageChildren:containerSuperviewReactTag + addChildReactTags:mutableAddChildReactTags + addAtIndices:mutableAddAtIndices + removeAtIndices:mutableRemoveAtIndices + registry:viewRegistry]; + }]; + } } - (void)_manageChildren:(NSNumber *)containerReactTag - moveFromIndices:(NSArray *)moveFromIndices - moveToIndices:(NSArray *)moveToIndices addChildReactTags:(NSArray *)addChildReactTags addAtIndices:(NSArray *)addAtIndices removeAtIndices:(NSArray *)removeAtIndices registry:(RCTSparseArray *)registry { id container = registry[containerReactTag]; - RCTAssert(moveFromIndices.count == moveToIndices.count, @"moveFromIndices had size %tu, moveToIndices had size %tu", moveFromIndices.count, moveToIndices.count); - RCTAssert(addChildReactTags.count == addAtIndices.count, @"there should be at least one React child to add"); + RCTAssert(addChildReactTags.count == addAtIndices.count, @"Invalid arguments: addChildReactTags.count == addAtIndices.count"); - // Removes (both permanent and temporary moves) are using "before" indices - NSArray *permanentlyRemovedChildren = [self _childrenToRemoveFromContainer:container atIndices:removeAtIndices]; - NSArray *temporarilyRemovedChildren = [self _childrenToRemoveFromContainer:container atIndices:moveFromIndices]; - [self _removeChildren:permanentlyRemovedChildren fromContainer:container]; - [self _removeChildren:temporarilyRemovedChildren fromContainer:container]; + // Removes are using "before" indices + NSArray *removedChildren = [self _childrenToRemoveFromContainer:container atIndices:removeAtIndices]; + [self _removeChildren:removedChildren fromContainer:container]; + NSPredicate *predicate = [NSPredicate predicateWithFormat:@"NOT reactTag in %@", addChildReactTags]; + NSArray *permanentlyRemovedChildren = [removedChildren filteredArrayUsingPredicate:predicate]; [self _purgeChildren:permanentlyRemovedChildren fromRegistry:registry]; // TODO (#5906496): optimize all these loops - constantly calling array.count is not efficient - // Figure out what to insert - merge temporary inserts and adds - NSMutableDictionary *destinationsToChildrenToAdd = [NSMutableDictionary dictionary]; - for (NSInteger index = 0, length = temporarilyRemovedChildren.count; index < length; index++) { - destinationsToChildrenToAdd[moveToIndices[index]] = temporarilyRemovedChildren[index]; - } - for (NSInteger index = 0, length = addAtIndices.count; index < length; index++) { - id view = registry[addChildReactTags[index]]; + // Figure out what to insert + NSMutableDictionary *childrenToAdd = [NSMutableDictionary dictionary]; + for (NSInteger index = 0, count = addAtIndices.count; index < count; index++) { + id view = registry[addChildReactTags[index]]; if (view) { - destinationsToChildrenToAdd[addAtIndices[index]] = view; + childrenToAdd[addAtIndices[index]] = view; } } - NSArray *sortedIndices = [[destinationsToChildrenToAdd allKeys] sortedArrayUsingSelector:@selector(compare:)]; + NSArray *sortedIndices = [[childrenToAdd allKeys] sortedArrayUsingSelector:@selector(compare:)]; for (NSNumber *reactIndex in sortedIndices) { - [container insertReactSubview:destinationsToChildrenToAdd[reactIndex] atIndex:reactIndex.integerValue]; + [container insertReactSubview:childrenToAdd[reactIndex] atIndex:reactIndex.integerValue]; } } @@ -836,45 +1031,72 @@ RCT_EXPORT_METHOD(createView:(NSNumber *)reactTag // Set properties shadowView.viewName = viewName; shadowView.reactTag = reactTag; + shadowView.allProps = props; RCTSetShadowViewProps(props, shadowView, _defaultShadowViews[viewName], manager); } _shadowViewRegistry[reactTag] = shadowView; - // Shadow view is the source of truth for background color this is a little - // bit counter-intuitive if people try to set background color when setting up - // the view, but it's the only way that makes sense given our threading model - UIColor *backgroundColor = shadowView.backgroundColor; + if (!shadowView.layoutOnly) { + // Shadow view is the source of truth for background color this is a little + // bit counter-intuitive if people try to set background color when setting up + // the view, but it's the only way that makes sense given our threading model + UIColor *backgroundColor = shadowView.backgroundColor; + [self addUIBlock:^(RCTUIManager *uiManager, __unused RCTSparseArray *viewRegistry) { + [uiManager createView:reactTag viewName:viewName props:props withManager:manager backgroundColor:backgroundColor]; + }]; + } +} - [self addUIBlock:^(RCTUIManager *uiManager, RCTSparseArray *viewRegistry){ - RCTAssertMainThread(); +- (UIView *)createView:(NSNumber *)reactTag viewName:(NSString *)viewName props:(NSDictionary *)props withManager:(RCTViewManager *)manager backgroundColor:(UIColor *)backgroundColor +{ + RCTAssertMainThread(); + UIView *view = [manager view]; + if (!view) { + return nil; + } - UIView *view = [manager view]; - if (view) { + // Generate default view, used for resetting default props + if (!_defaultViews[viewName]) { + // Note the default is setup after the props are read for the first time + // ever for this className - this is ok because we only use the default + // for restoring defaults, which never happens on first creation. + _defaultViews[viewName] = [manager view]; + } - // Generate default view, used for resetting default props - if (!uiManager->_defaultViews[viewName]) { - // Note the default is setup after the props are read for the first time - // ever for this className - this is ok because we only use the default - // for restoring defaults, which never happens on first creation. - uiManager->_defaultViews[viewName] = [manager view]; - } + // Set properties + view.reactTag = reactTag; + view.backgroundColor = backgroundColor; + if ([view isKindOfClass:[UIView class]]) { + view.multipleTouchEnabled = YES; + view.userInteractionEnabled = YES; // required for touch handling + view.layer.allowsGroupOpacity = YES; // required for touch handling + } + RCTSetViewProps(props, view, _defaultViews[viewName], manager); - // Set properties - view.reactTag = reactTag; - view.backgroundColor = backgroundColor; - if ([view isKindOfClass:[UIView class]]) { - view.multipleTouchEnabled = YES; - view.userInteractionEnabled = YES; // required for touch handling - view.layer.allowsGroupOpacity = YES; // required for touch handling - } - RCTSetViewProps(props, view, uiManager->_defaultViews[viewName], manager); + if ([view respondsToSelector:@selector(reactBridgeDidFinishTransaction)]) { + [_bridgeTransactionListeners addObject:view]; + } + _viewRegistry[reactTag] = view; - if ([view respondsToSelector:@selector(reactBridgeDidFinishTransaction)]) { - [uiManager->_bridgeTransactionListeners addObject:view]; - } - } - viewRegistry[reactTag] = view; - }]; + return view; +} + +NS_INLINE BOOL RCTRectIsDefined(CGRect frame) +{ + return !(isnan(frame.origin.x) || isnan(frame.origin.y) || isnan(frame.size.width) || isnan(frame.size.height)); +} + +NS_INLINE NSDictionary *RCTShadowViewOnLayoutEventPayload(NSNumber *reactTag, CGRect frame) +{ + return @{ + @"target": reactTag, + @"layout": @{ + @"x": @(frame.origin.x), + @"y": @(frame.origin.y), + @"width": @(frame.size.width), + @"height": @(frame.size.height), + }, + }; } // TODO: remove viewName param as it isn't needed @@ -888,10 +1110,100 @@ RCT_EXPORT_METHOD(updateView:(NSNumber *)reactTag RCTShadowView *shadowView = _shadowViewRegistry[reactTag]; RCTSetShadowViewProps(props, shadowView, _defaultShadowViews[viewName], viewManager); - [self addUIBlock:^(RCTUIManager *uiManager, RCTSparseArray *viewRegistry) { - UIView *view = viewRegistry[reactTag]; - RCTSetViewProps(props, view, uiManager->_defaultViews[viewName], viewManager); - }]; + const BOOL wasLayoutOnly = shadowView.layoutOnly; + NSDictionary *newProps = RCTPropsMerge(shadowView.allProps, props); + shadowView.allProps = newProps; + + const BOOL isLayoutOnly = shadowView.layoutOnly; + + if (wasLayoutOnly != isLayoutOnly) { + // Add/remove node + + if (isLayoutOnly) { + [self addUIBlock:^(__unused RCTUIManager *uiManager, RCTSparseArray *viewRegistry) { + RCTAssertMainThread(); + + UIView *container = viewRegistry[reactTag]; + + const CGRect containerFrame = container.frame; + const CGFloat deltaX = containerFrame.origin.x; + const CGFloat deltaY = containerFrame.origin.y; + + NSUInteger offset = [container.superview.subviews indexOfObject:container]; + [container.subviews enumerateObjectsUsingBlock:^(UIView *subview, NSUInteger idx, __unused BOOL *stop) { + [container removeReactSubview:subview]; + + CGRect subviewFrame = subview.frame; + subviewFrame.origin.x += deltaX; + subviewFrame.origin.y += deltaY; + subview.frame = subviewFrame; + + [container.superview insertReactSubview:subview atIndex:idx + offset]; + }]; + + [container.superview removeReactSubview:container]; + if ([container conformsToProtocol:@protocol(RCTInvalidating)]) { + [(id)container invalidate]; + } + + viewRegistry[reactTag] = nil; + }]; + } else { + NSMutableArray *mutableAddChildReactTags = [[[shadowView reactSubviews] valueForKey:@"reactTag"] mutableCopy]; + NSMutableArray *mutableAddAtIndices = [NSMutableArray arrayWithCapacity:mutableAddChildReactTags.count]; + for (NSUInteger i = 0, count = mutableAddChildReactTags.count; i < count; i++) { + [mutableAddAtIndices addObject:@(i)]; + } + + [self modifyManageChildren:reactTag + addChildReactTags:mutableAddChildReactTags + addAtIndices:mutableAddAtIndices + removeAtIndices:nil]; + + NSUInteger offset = [shadowView.superview.reactSubviews indexOfObject:shadowView]; + NSNumber *containerSuperviewReactTag = [self containerReactTag:shadowView.superview.reactTag offset:&offset]; + UIColor *backgroundColor = shadowView.backgroundColor; + + CGRect shadowViewFrame = shadowView.adjustedFrame; + NSMutableDictionary *newFrames = [NSMutableDictionary dictionaryWithCapacity:mutableAddChildReactTags.count]; + for (NSNumber *childTag in mutableAddChildReactTags) { + RCTShadowView *child = _shadowViewRegistry[childTag]; + newFrames[childTag] = [NSValue valueWithCGRect:child.adjustedFrame]; + } + + [self addUIBlock:^(__unused RCTUIManager *uiManager, RCTSparseArray *viewRegistry) { + RCTAssertMainThread(); + + UIView *containerSuperview = viewRegistry[containerSuperviewReactTag]; + UIView *container = [uiManager createView:reactTag viewName:viewName props:newProps withManager:viewManager backgroundColor:backgroundColor]; + + [containerSuperview insertReactSubview:container atIndex:offset]; + if (RCTRectIsDefined(shadowViewFrame)) { + container.frame = shadowViewFrame; + } + + for (NSUInteger i = 0, count = mutableAddAtIndices.count; i < count; i++) { + NSNumber *tag = mutableAddChildReactTags[i]; + UIView *subview = viewRegistry[tag]; + [containerSuperview removeReactSubview:subview]; + + NSUInteger atIndex = [mutableAddAtIndices[i] unsignedIntegerValue]; + [container insertReactSubview:subview atIndex:atIndex]; + + CGRect subviewFrame = [newFrames[tag] CGRectValue]; + if (RCTRectIsDefined(subviewFrame)) { + subview.frame = subviewFrame; + } + } + }]; + } + } else if (!isLayoutOnly) { + // Update node + [self addUIBlock:^(RCTUIManager *uiManager, RCTSparseArray *viewRegistry) { + UIView *view = viewRegistry[reactTag]; + RCTSetViewProps(props, view, uiManager->_defaultViews[viewName], viewManager); + }]; + } } RCT_EXPORT_METHOD(focus:(NSNumber *)reactTag) @@ -1227,12 +1539,16 @@ RCT_EXPORT_METHOD(zoomToRect:(NSNumber *)reactTag RCT_EXPORT_METHOD(setJSResponder:(NSNumber *)reactTag blockNativeResponder:(__unused BOOL)blockNativeResponder) { - [self addUIBlock:^(__unused RCTUIManager *uiManager, RCTSparseArray *viewRegistry) { - _jsResponder = viewRegistry[reactTag]; - if (!_jsResponder) { - RCTLogError(@"Invalid view set to be the JS responder - tag %zd", reactTag); - } - }]; + RCTShadowView *shadowView = _shadowViewRegistry[reactTag]; + if (!shadowView) { + RCTLogError(@"Invalid view set to be the JS responder - tag %@", reactTag); + } else if (shadowView.layoutOnly) { + RCTLogError(@"Cannot set JS responder to layout-only view with tag %@ - %@, %@", reactTag, shadowView, shadowView.allProps); + } else { + [self addUIBlock:^(__unused RCTUIManager *uiManager, RCTSparseArray *viewRegistry) { + _jsResponder = viewRegistry[reactTag]; + }]; + } } RCT_EXPORT_METHOD(clearJSResponder) @@ -1488,3 +1804,27 @@ static UIView *_jsResponder; } @end + +static void RCTTraverseViewNodes(id view, void (^block)(id)) +{ + if (view.reactTag) block(view); + for (id subview in view.reactSubviews) { + RCTTraverseViewNodes(subview, block); + } +} + +static NSDictionary *RCTPropsMerge(NSDictionary *beforeProps, NSDictionary *newProps) +{ + NSMutableDictionary *afterProps = [NSMutableDictionary dictionaryWithDictionary:beforeProps]; + + // Can't use -addEntriesFromDictionary: because we want to remove keys with NSNull values. + [newProps enumerateKeysAndObjectsUsingBlock:^(id key, id obj, __unused BOOL *stop) { + if (obj == (id)kCFNull) { + [afterProps removeObjectForKey:key]; + } else { + afterProps[key] = obj; + } + }]; + + return afterProps; +} diff --git a/React/Views/RCTShadowView.h b/React/Views/RCTShadowView.h index 1c44033f6..38edc6e50 100644 --- a/React/Views/RCTShadowView.h +++ b/React/Views/RCTShadowView.h @@ -41,6 +41,12 @@ typedef void (^RCTApplierBlock)(RCTSparseArray *viewRegistry); @property (nonatomic, assign) RCTUpdateLifecycle layoutLifecycle; @property (nonatomic, assign) BOOL hasOnLayout; +@property (nonatomic, assign, readonly, getter=isLayoutOnly) BOOL layoutOnly; +@property (nonatomic, copy) NSDictionary *allProps; + +/// `frame` adjusted for recursive superview `layoutOnly` status. +@property (nonatomic, assign, readonly) CGRect adjustedFrame; + /** * isNewView - Used to track the first time the view is introduced into the hierarchy. It is initialized YES, then is * set to NO in RCTUIManager after the layout pass is done and all frames have been extracted to be applied to the diff --git a/React/Views/RCTShadowView.m b/React/Views/RCTShadowView.m index 9d56bb906..2c350b18b 100644 --- a/React/Views/RCTShadowView.m +++ b/React/Views/RCTShadowView.m @@ -367,8 +367,10 @@ static void RCTProcessMetaProps(const float metaProps[META_PROP_COUNT], float st - (NSString *)description { NSString *description = super.description; - description = [[description substringToIndex:description.length - 1] stringByAppendingFormat:@"; viewName: %@; reactTag: %@; frame: %@>", self.viewName, self.reactTag, NSStringFromCGRect(self.frame)]; - return description; + if (self.layoutOnly) { + description = [@"* " stringByAppendingString:description]; + } + return [[description substringToIndex:description.length - 1] stringByAppendingFormat:@"; viewName: %@; reactTag: %@; frame: %@>", self.viewName, self.reactTag, NSStringFromCGRect(self.frame)]; } - (void)addRecursiveDescriptionToString:(NSMutableString *)string atLevel:(NSUInteger)level @@ -392,6 +394,91 @@ static void RCTProcessMetaProps(const float metaProps[META_PROP_COUNT], float st return description; } +- (BOOL)isLayoutOnly +{ + if (![self.viewName isEqualToString:@"RCTView"]) { + // For now, only `RCTView`s can be layout-only. + return NO; + } + + // dispatch_once is unnecessary because this property SHOULD only be accessed + // on the shadow queue + static NSSet *layoutKeys; + static NSSet *specialKeys; + if (!layoutKeys || !specialKeys) { + // Taken from LayoutPropTypes.js with the exception that borderWidth, + // borderTopWidth, borderBottomWidth, borderLeftWidth, and borderRightWidth + // were removed because black color is assumed + static NSString *const layoutKeyStrings[] = { + @"width", + @"height", + @"top", + @"left", + @"right", + @"bottom", + @"margin", + @"marginVertical", + @"marginHorizontal", + @"marginTop", + @"marginBottom", + @"marginLeft", + @"marginRight", + @"padding", + @"paddingVertical", + @"paddingHorizontal", + @"paddingTop", + @"paddingBottom", + @"paddingLeft", + @"paddingRight", + @"position", + @"flexDirection", + @"flexWrap", + @"justifyContent", + @"alignItems", + @"alignSelf", + @"flex", + }; + layoutKeys = [NSSet setWithObjects:layoutKeyStrings count:sizeof(layoutKeyStrings)/sizeof(*layoutKeyStrings)]; + + static NSString *const specialKeyStrings[] = { + @"accessible", + @"collapsible", + }; + specialKeys = [NSSet setWithObjects:specialKeyStrings count:sizeof(specialKeyStrings)/sizeof(*specialKeyStrings)]; + } + + NSNumber *collapsible = self.allProps[@"collapsible"]; + if (collapsible && !collapsible.boolValue) { + return NO; + } + + NSNumber *accessible = self.allProps[@"accessible"]; + if (accessible && accessible.boolValue) { + return NO; + } + + for (NSString *key in self.allProps) { + if (![specialKeys containsObject:key] && ![layoutKeys containsObject:key]) { + return NO; + } + } + + return YES; +} + +- (CGRect)adjustedFrame +{ + CGRect frame = self.frame; + RCTShadowView *superview = self; + while ((superview = superview.superview) && superview.layoutOnly) { + const CGRect superviewFrame = superview.frame; + frame.origin.x += superviewFrame.origin.x; + frame.origin.y += superviewFrame.origin.y; + } + + return frame; +} + // Margin #define RCT_MARGIN_PROPERTY(prop, metaProp) \ diff --git a/React/Views/RCTViewNodeProtocol.h b/React/Views/RCTViewNodeProtocol.h index e78cc2ce7..96eb78f1a 100644 --- a/React/Views/RCTViewNodeProtocol.h +++ b/React/Views/RCTViewNodeProtocol.h @@ -15,10 +15,11 @@ @protocol RCTViewNodeProtocol @property (nonatomic, copy) NSNumber *reactTag; +@property (nonatomic, assign) CGRect frame; - (void)insertReactSubview:(id)subview atIndex:(NSInteger)atIndex; - (void)removeReactSubview:(id)subview; -- (NSMutableArray *)reactSubviews; +- (NSArray *)reactSubviews; - (id)reactSuperview; - (NSNumber *)reactTagAtPoint:(CGPoint)point;