From 3ad1684dfbe64f815d18cb3dee790c444ced53d5 Mon Sep 17 00:00:00 2001 From: Rajdeep Kwatra Date: Wed, 21 Feb 2024 16:19:32 +1100 Subject: [PATCH] Allow attachment tap to select only when container is editable (#281) --- .../Swift/Attachment/AttachmentContent.swift | 3 +- Proton/Tests/Editor/EditorSnapshotTests.swift | 33 ++++++++++++++++++ .../testSelectOnTapInNonEditableEditor.1.png | Bin 0 -> 18925 bytes 3 files changed, 35 insertions(+), 1 deletion(-) create mode 100644 Proton/Tests/Editor/__Snapshots__/EditorSnapshotTests/testSelectOnTapInNonEditableEditor.1.png diff --git a/Proton/Sources/Swift/Attachment/AttachmentContent.swift b/Proton/Sources/Swift/Attachment/AttachmentContent.swift index f8db3079..9babb249 100644 --- a/Proton/Sources/Swift/Attachment/AttachmentContent.swift +++ b/Proton/Sources/Swift/Attachment/AttachmentContent.swift @@ -55,7 +55,8 @@ class AttachmentContentView: UIView { } func onContentViewTapped() { - guard attachment?.selectOnTap == true else { return } + guard attachment?.containerEditorView?.isEditable == true, + attachment?.selectOnTap == true else { return } attachment?.setSelected(true) } } diff --git a/Proton/Tests/Editor/EditorSnapshotTests.swift b/Proton/Tests/Editor/EditorSnapshotTests.swift index 9df76b2f..478a094d 100644 --- a/Proton/Tests/Editor/EditorSnapshotTests.swift +++ b/Proton/Tests/Editor/EditorSnapshotTests.swift @@ -1413,6 +1413,39 @@ class EditorSnapshotTests: SnapshotTestCase { assertSnapshot(matching: viewController.view, as: .image, record: recordMode) } + func testSelectOnTapInNonEditableEditor() { + let viewController = EditorTestViewController() + let editor = viewController.editor + let offsetProvider = MockAttachmentOffsetProvider() + offsetProvider.offset = CGPoint(x: 0, y: -4) + + editor.font = UIFont.systemFont(ofSize: 12) + + var panel = PanelView() + panel.editor.forceApplyAttributedText = true + panel.backgroundColor = .cyan + panel.layer.borderWidth = 1.0 + panel.layer.cornerRadius = 4.0 + panel.layer.borderColor = UIColor.black.cgColor + + let attachment = Attachment(panel, size: .fullWidth) + panel.boundsObserver = attachment + panel.editor.font = editor.font + + panel.attributedText = NSAttributedString(string: "In full-width attachment") + + editor.replaceCharacters(in: .zero, with: "This text is in Editor") + editor.insertAttachment(in: editor.textEndRange, attachment: attachment) + + editor.isEditable = false + let touch = UITouch() + attachment.selectOnTap = true + (attachment.contentView?.superview as? AttachmentContentView)?.onContentViewTapped() + + viewController.render() + assertSnapshot(matching: viewController.view, as: .image, record: recordMode) + } + private func addCaretRect(at range: NSRange, in editor: EditorView, color: UIColor) { let rect = editor.caretRect(for: range.location) let view = UIView(frame: rect) diff --git a/Proton/Tests/Editor/__Snapshots__/EditorSnapshotTests/testSelectOnTapInNonEditableEditor.1.png b/Proton/Tests/Editor/__Snapshots__/EditorSnapshotTests/testSelectOnTapInNonEditableEditor.1.png new file mode 100644 index 0000000000000000000000000000000000000000..f5f1917617344a24e055ef55001ad35dd6dfbb16 GIT binary patch literal 18925 zcmeHtcQ{*p_&3#(wpN!tJFKd`YL8Z0tyNS}yY{NuyUIgbBOUfuDz>UwvnX1lK|~Ow zs2QY2f<*WoU61zt>vz4^`_FqlT*)~(-+kZr=bq<@jux2a7|Ss-GBTR$*RI?mBcli> zBO@0CQ36j=GlHH27jlnVU{$ix&uk08k8qni*KIX5$pnCV5ZMv(lVlY8U4VZwau%{9 z-|xxDG{{+h-`^tV``PCZ8Cj$Q+2NmkjDhR^-!Sk2M*qB0WRd?nW7eTxy(z-8D1P0O z3+@k_dMir@T#nwqX5>Le#x1k|A-|d+Y5_cCbGV|d4_tu-zyBow-+aJl{|bD#Z(bPA z83e9O*RQDP`;sq>`xT!z7>`^%{z^np=&?OL%_G*R{Kxsa2X^t0B3YJ;-gfkxdRX*d4TrLo?Ij-nyJ29|$3gN?5qN|&%e}uE=s`zRb5wqx zZGQpfJm4J3QVsoFe>FT*=A&n!nfghFAA1q=Qs(NZoQ$Dl{;T1zYG|K5{U7vsRzPvc zGLObh;^SWpT=d7n)x*9M_tyzSZ?e;a#9e%IRQ_rp57pt4VEL1hzer3Y_E*DyB>pA1 z|B?6?ivN@1-vIu9r6`oWL+{(#=6wqz{{#Ph-JxTuZV^F zWLReQKNUfw+ErDQg`DCgL~*kIR(u z)_PHN@plW*XM^XNZMcNo*Ke|z)UJ)8mik|#_QyXvMIPFBqBSkh(D2tH`^#Me0UE^e zRaoNReRa5cKKXcE{dY@bq2c=*;*s@z^6!4g4qZM0DA@m|{r`ptZLLl6s~=89ozjxY zCV6a*`#?;S_IBo!+8vRXN%pVH=S6uoZihg{}T~1eVsR5e;MgB z?qvu&^KI!#d+HB?>N&n|&WbOME+UGeJU(Bxvr^ihO|FR;N*8FMdu$uoyjwM0p&R_} zTkG+n<#uo3=AAWNDeLqj=S50fWJ+cWw|27)wVtkv@-Zo63 zri#fIFIX#m;yZNi96H>!>(c{+@v&YtwR>B1zvy{4C1?A1S>Vh?1YyRzBYAHvv3ZHF zBbQ>5h~C?cUCVgT#m|nOOI+anxtPhuJ6Mow2jA$So9W=v=5WbyG%1RoerV=0W9;jmh98r1fe#(BRFAw0@8GzKmwDy0v)Z{y z^6QkF&}Dyq$E^`Z5HfVNULLJtZ%^7d(K@`v?lYzvh%rG6th}4ch{dKvm`hFgPCrFT zBJYaRTxBVu_AvOl*vMlCuE2#G=CYn4f}7n*on9d?Qx@5{qp^i;9;Ixl`lc>a-<3{i z`!%j!&RiT&}r7VNFkvAXndgz_0BQE)@fx3VO z3rLAL0*kGTxn8Uo!i;A=i%!kt>pLp11kq*Yi^V%Dx^5; zHeR3?DxAG_=SNS5=zYDSb+hT+vG7fFNXTkEnpC2}g1fk~kQmcaU1^agglNKe<4`I@ zY6;iqHBrAg5fEiibo&gz_RT2sJp!^lXmi}qu1dYT2h6pD4cS9YfJ+L|L%pqHS^Hca8YI z;pDy=cyd&lG4xxs_-DTA5!=*7{lQzq?B2uKTdj;uB5#&Lh$!^aS`(|C51KX+nu&KG zTt9&{c4@>7v7-FPj7|451YjF|P9UYBOVhZQnLA&n z^fC$hCvYrMI7ej2&NOGclR0tptirOwC_MZJnXI^;?V9$iyr^3eX!uyl9gWGjr4rD{ z;pw6;-~Hw;udE{}4|J!KBf$9tQX!#xGqo94;&y2Y)RqsoO?8plkejMc6gHn&zc@83 zL&f21QR2ep(Icu*a{?C=>u%I(r+_iK>X{Uvx%&Q_srSfhV|)-cz`WCHdI)N5tq`2t zAr);k#Ba#9eUVvd?K#95xw7mQ5`Z(?Hj;%XhqNB$-QeoqDFI|r8Xf4d`hi!`-9q84 zCxAHjWmV+S@G#$4%kL!HuF}>hKKhR5E%R*PYf;J%hAkt{aPEGKj6ycdN-pOJy{=vLljkf)O60#x z77FQ8q4M&aodThFm9{@kJvuJLcb4pGr%-HQ9GbZsBHK8pfaRaSSJza947jL&yoiSQ zm7TllZaleCk2Q-w*R}pEQa;yryW8B1Eoh^E`J6bbOQmk-9GJuJ9_-aF04zQZ{F_LF z?vDQFX7B=NhViBKL8xNYV?B1bLmD9$wXo^GFC)g#yAJn#Kb+&}r}gi*J@G69P~0`B zrTm;&0a}?a534b+%_ldsgV$aLUvq3$Vhk0D{p!W30?Bd02F}T$e0X9=8w=VY{-|Wo zKjm~Wte{SJL9J||ZoRdbH4gvz?B%tl%|@&XR(i%x6aq$gDxH)3C!-p}VB)OH=KkRX zLh&SVI?8-!Y6`%Z*NHGN&rfYZ5xRl3@ZRRDKPLQ2naN7M(*w7NsKDp=VwqvS>WHIJ zcH6j=MbFW5zVUJ@o)*o3PS_mPm-9^MZtw30D8gk9f;A;Jjko=8jdjL0V_#}(qo*7Pbj|eCpqPfS~sZaI7#zh!{rlDK8RfJRj$BkR`i{C(M8X-PrQuoAKnEJ zrWl)t&4hL?VmQ`=VTVfE#G7&otVOe42Ji7Iu0F|_XVqy>XVyS;jU7`r6(LksAx?{>)5%d?9z^EflFAC2W*YcIe)Zd|gx+j)EF!lS!m zJ=p<;@J~0@ZnIS}OSJb_gI=uyW_XU;xN^u&Q?|xEEY7Ao!N6-5P#J@pa#I}~!oDrX z3vH=1x^oP=rKf$+myFIIG0PYHgGPnc8!eHgF`{-<-mgb?s1!$&OyvLpUF|x&`_0@|F;M#fQ z2}r7CE;#R%9vj@SnSfX%W^6Xh;Tk*MG=8fKNg3odb?d_b23mGzk(M@-I5tOVP!)7V zz(&Si`QDd^p`awn)`8W!bvJ;Y6-{SLT?CQnVB&J5*$q~3S-rOV%A6&8hHh4zb{V`7 zt_p?9f$fVts3v53D~he}G7dW}x*}y*994g~5Td8}_VDe$&$0t}CGwul{)i$o1Fwmx z!K#%4E#7q$de^%uMn+-nZMP6+q9=_sk?T>9Gz&18iN+kk+;k6%en17uQ6uHm);s!r zwd=lABN)7%iq`jmMC)DOw=#H>s%a7rZsCsmdtvx!gjW}Woh@R#S5o8y&c!A*2c4&aTl`u2DvXRvSj6hpai9Ogs8WTO^#*%evK zf&8V%d31J{qx^njvBsNIsu5#~EtGWwJR&N)OJ-0w2Q(#5+VBZ$W5d*$GJ7<24$>jN zqUm0=bjsoU4g9V<)qwBrmp7RkpCcQ$a<4*IN8Rt7-Wok zqxEj!3%zq)+2)eL9Ao4BRRg&Xd)m`C0ZB_0y(&{gJOv{yWek9A(t_|K?vDEinTN!O#$IM%fHG>zFL->an(*^f**gKg!kF*a<>qtjp5|g)1aI- z1?Q(Zr(eHsJfxkj6%Ys>>le+?yW?7v)>)9?9@z@YAi4I46-S3Dma%4?y_Snqjh}H6 z3xTIjNaXV^-yb3Ig|0XqqjJr{S&kE^QCfuU%4*B>2d`VQ1DCEC*O-+})5hD>Yl+cI z9mO|xo$;x?1UU=d9|R z|Aape0RP4B@Mi!KR|1M|mpGz%6ql*<}H<;o_MJwauh>Y@cYBq4(z%8Kg6|Mv+ao8)h!K@q3TC zcgE(No%wu{juGosM9OBx8fUpad|Dro2ezB?i(dWs#8N49yT`83CgPv^+MJosa@f0G zV>zX(V=Y@Nb$a83!ErM|LtbAmH#fymfcff2Y2hrOdiG*s+6PeVOz^4o?PKBNUQ! ztN|^@F_7JW9^vsrUlAW8BwgSaimK+q>p_dIm0I6es!QJ41L}a~g3L`PF6xd22ZR^4 zcpGr`vmQ7oQdq`Gmtrp}loFGYe4FgwY4wEQD>B>jWb*(bSyKe7{6KmaC^v-owi`TR zaEFV{Z!_u~ZT-^Q8wjIlR#>#0-JB%k@&?*-~KG_ar z=Z;>>^|=~j_jo8-sBvSUu)#g7z)U)U<+Uj$u*T*`df^V=0paN!g$+;{c2*EO(g(=A zX5tNL$HqDp@#Td%EZLT~^u`J{Rv{sQ0VsE4$MCi!MZka>q8TBowR0H(5y3Vu3Do1m zbw?Htm(`)3&hQ|9?{4ckBrx~E6u-7#SKl0=-2t&+s>jO?id+`wP4~QIFi{6p;sm?^ zgzUcis9gncE`xQA=O^b>mARb9M->t+lBDo=w}7A$X^>t}+hz{u&mbBkh{}$&<+)?U zSisR!LpyRyZ`6o(!v#qT{js&g`C9mG6Bh%7&#(vM^vJ^n(^KcTXj1?J$DWOy|1d2u z1vQ`Bex^oS(DiLry7}GcSJEchJQsWcK!lHBCN7{qSCLfRPuhL+rAo&|rueQd1b~DD zRV${fx#__LJbW;5#XAZOQNRz!&RD0rL+GX4odN%Yop`fW(Y_9dVdc6403RH8HxNMU zJ8rkL-@zhs;d^B2@#(6Kf?XHmyB>H)#_>G{6E14X6P_AE?vecu#`z=RY z>@=D+7&~dgHQ50wwmHUcLX}7k>v?;80c_!{`Deu$1Gd^cDIft5-t5FO!6aJXtjRDqo zAACB!=@hrVoQ=H)#C8vc@Ysg+&r{d6{cj;0V!Y0NXj-xnzNn?R{dEfPG98<>x><1B z{g7Y@CllS>lA4LS(ILONbZMt#-*csBqOknkj9?C;rX~jNCbvNJdW2N11k`NINw!%5 z`VJ5J>B}#@LI~{S5M@S`K>FkD()tzSeTTSx-#ge38LqO7PQ^9?RJW|!sSSNoVC{nr z@*%pmIQX4gYVUpVs-crJB+&gmIh7~d^|5;|HT@NzHEleI^S*?X1pk0H%hB8r-tMfp z?z>!RZ=Oeq(o;UFb=`N?ieyU`wE9Ve_Y`z#Ugur(qifK?0bsrx%}(2EGYZnIbc6|O zh=OCh7htxRm<6rdsMtMqs$xiZRN0(Qd#ZcPq!h|o?~>fSM2qesd@~9eq{Hjm{%U>v zC%%f5lj;oSaCxb&qcsk$4XYiryaX3v4#-LPd5THC*!C}A{|^o3e$%8*`B~AcY?s(1 zVg^dXs^`RiI?*Z0gc{LAt~*0|z{Z23Bwa}a@DxpWdA}}O6kMr!0i#@Kg>b$-dsqpoQ4L^xBl@+=conmq$W3 z+^m@69wZ+R*USF0apr94Ow=4CXig5z@7lCI>vz%OaHFKt(BNWR!aq+xyQiJ>@4w1; z25_d9Kg60Ppg8RmHG(>}n>@$=acrxkzTD9CGhI-%8DCUd=Qu%PZ7;8KLRN3a58F-I z-YAFR>KLRW@p|ANqpl8DN~2Sy8Ryho5HrARo*DiDPs>>nGeu@ zpn*D@NHvg%+pr*rYStCuxNwcJN=->dAwlVZDv<|^Z|jrFMOgNrZ}U;wRwse158J1l zBG;yOcih%{1F##I62l%rlUXW?gN49ojPgcFz~SEcC~#)r82`Ap-&euJcjv;-jjk(Q zH2j?KV2>1)JkuSOEa~(#nYeP%))I4n((z|9gVafzbIduz8>xA8+AHRP#O0!0zYPR9`LL>Ve8G%n zw2bGNrf2&xm1|62e^)TrzPwkJr4L&BI@qrpd-66$PStn!h0>K2DerESI-I${nYiNA z>DHgRsmq0aa-dqPTth)z()*`%zCt>EAX+CwBe{EwKZnM71oy4&V!!QY+3wik#&d-9 zQwPX$d{TL%7s-BMZ299klMD7z@t6+zA4;fXB?VT_Zc_%x-qTP$xncl&(z}I|1P^;!0v-^=yGu?$BfgnBdDl6jMPN- zNfo*33Vk%AYPiS&CU1LkEg04`Rrkl?VVHYQUspz-3#ZZFU)yeXuXX(1ToF@Mt(5IO z_MQX#Rrlgrcv&sgZ(m4wQ{p1{`i&t}=#V9a!7W{u$n-0HK)8M8#;Tp5Vu`nX&!BA5 zfs%I|?RnDjkV#BlC8r7Rl}oQ}4!2Sk=Dw1k6}ASAW<5S$H-9J4_=4O2F)F$rtwk)q z!M}tkhyvs z7j(w?&%Ac`WmfB}n=zT6>6n5G1X||}wM74m^DIw`=w0toh^dBUnU?9{)&ylQsD50> zqz$zSCc!N`ku^%Y=vz#(G1Z?i5hb7;l&ZBJ8*6lf!Y_p`Y8CLsv~@E*8oGp56_#em zygkV(UPWtrKn!0~SZ~z8gO_d{3-DT8YX)AE*xOTri`kQr@mBA@Be9%*{F@hItFuPQ ztgi8e`;EM_4-E6Kd`%ea~t{8`iJ#|77P@A+$HUmvKw{Z!*c+~DJr zby))@LNpq`xAu9&d!Mz+W(_b~efwxY+%6 z%*^kL)y(Z&z&3qFWKX=e)w&eGtH>=lCyE{SnHxF6_;sWoJU3EWk2iy6u;i6j-=&ok zgaO%{2~27IBF6az)P)2W@PR2POqjT(+nH~v293F(ytgJVz-PLrT>>~Z)l53pZ^Z_& zl!f#}@jRx`%nHS`%!^Fmr-$Pjo?G?4I4<)-=TT3Vtaqe;)RcJn7E{>v=@aV09{3SI z?}6)$NNg};2(f%La5}~h|A80paPLUBbd&o`<#s5YAO5tbbQ!GpLSvD+pmVesL`Fbe! ze4NGlK=#B`lE|qj?6sD_r=Xlfzuon2m2LOVc64yGRJWk~B*Do*JSX&Z>e5x?@ zHoENMD#qpVf|n8!|1O3uq&AcI9NaM-!yVoEz{b&v#jDpEok9s-%!Or>OK{P6GPx1o z{;`@W8aQq2=^p4~5&vW(k#MoXyqMQF)|Yz3*Ow*&rYo4*Yd$@!yq=-!CD`GGy!+D5 zN@&-qB;HQcZY_nS)lNQVGxFi?>DryORbtQtUd?`IKsQw^N;hOE&kqGwr+rjAPkG4<8#G2VMP*1wn z$4A`nWS{>iK9AR>YWck#y9~hV@XK?Ov92yD;J)jHc(7;g*}o;#g9--4m=p6g zlaq*2`081g%#K;{h2`GV44&SoWr&hin|)ohY;+AtM(T1%+}-!j!%xclF6p?rJ10MB z_sO+Tyc*u$-Sdb$5MOaaEi1~Ox5aWyDwXQ`n%Z4HcQcyHyHt;j@PkJS)IP*L)2 zo+`RIP3@OcAH1POdRx+S=s)=QB{Tq#qv`iI1)I(tS?50+{rya`n7D{<$mUpB)=?x6 z#Q=|A%3!<(2eqa6r5fhw8vcqTFEH9MFaG*+n;#sWD^otcuy}g6ciRWxnY;6YUA}h@ z&mFxm+~ApCBSYKsVM^|nNaoqrd7C<>){s3pSZR|iEO=*Hp1AC`4&=^b(2DKR+-cOv z>+_$gx10B7l2@n$cDMa_PVHsxQFpv~OOstHMAB<{39MTEmZ zqUjJEtF$ZHlwMbjZ&Y^0-?~qbDwU6hn1^ZIro+ zZZG8(L*|L>-h8O-sxm|kym}j7ljsK&#yri&FAq*3gR5NlfO64;bXS3CB%-mIgqJ6N zf-{^eLZ1;7f+k67nf?t4VB-mvV2DehLXj)|sv7+(wbz-gkzOQmM{Xe3W8C6w%<*q`z1l|C z=fR0KrFDf(H^(1V);03@722pOVp_g+SPf1~Nxa{PSTceYLOv}{*rqoy=E#UZzI;|&EofU-^Fae@OLyCy?6Ge5tb!ziZ!q{7AS zcBt4|4F@9&TobelZVqcoBj%9&(Nf>w#g8fTgX=YEvTaY23K|OyD+I7XZf^9An-hN3 zs~wHr1q#sgA^5YZ3W7}3W^?lxEXA}kkVT$IGWS91x^YN|^O1I~5b`fI5L2 zzI0qa7ASh zzS*YYD*Biy1D5*XZB&ZS?1Y2e_Xxa7mtngbP!)#J+4J}UX&s2~6*pTG;!W|%lu6=N zXFz8aP)Kuzj&k=pRGau2np}caPsqY(k4pX}sqZP=xm^5&T`rXKhp{YstFJ9b2Yo*#y? z)qGn+IFmZ5O49*BPpDNbGhdrkK_vv2*1L*G1 zAeNPyiqLlVL%S;hsjUE{mLc|^t0TV&L`URX1<0e{2k*k}+ZNrW(bD6R;dQf%ZXv9} z^hn&DYEDVt{$A?Q>fSC((2WQncw1wa%DHf^H0aGIo<^tsja?u$U1NDSevzPpGM7d4 zm%)iV5jxNj0!F@*8Sn=AF_m?^HXung=_Lt^cBm6e3C+{VY7`~2elj(&*iN#`V(~Te z$2!)9J0n0ExY%c5px>*SIXW`#$+&CpnjZz!iT~0{-G*Va08FTlI@#4$uXnD7(JAvb zOE~v5x0aXi{jx^PTe_UQyR^87WB$h5LEvMv;<4tbxa^2; zThn094>-CSPWfn-XlWPWh&T62_3o8q&d)L$MAXT>qRH^8piS?{+mZdJ*tJ6o={ka6 z#2cJavxlB=l1pi6z?8OlZ+mN;L+H)$*nlE?Ww!BKMykw`&91kw?H^$;V#QuHDIwC& znjkx*Y!<8aNTt{7fy(MFy%eu_o+4C1aPXYm`b|HaENP=S* z$!o(D%i^3fV^BC^i7`wO-N0<@CRumkWN}S(O$4J^_^#)3*G0k&$&94V#p??NEWDYW zPUPw$PqWG86wf%!zrF8#v5RL8^4%rw*!^g5bv%1QM@9Q$^S)17*kBb%D;b_>uDEMa z?9}OOp5ZsUwKF~So<4!v>sWHH;A4;Y@tS7Sw}~ypS?O-rE^Vd&RF1y%ovjDu1?(@|Dk%@3F8a9^IVih40eoRF3;&BO7d&*L2s$~5(#hej9nWVQ%MaOaF>xt3a$ z%bh}2v*cM%_Ua%d0fc1I?b+~Cl->H%PyC8Aax>K1d+J(9)Tfd@^gU$1vG0<~(EjU^ z#sq(DcymC7L+s9Af*x}ZW@Y)u+%T0hBMdzF^48gCGi+0yxfL6t1oPx=%M(_B6nEW0 z5{%3XXsvKE6eaKytbtaA_>F{(Cb_LIyDp@)#2N2JTULXnC)^tl&daMGc4Z4)YG6;h zt#oAh)$&bNP14(LB{Mihx$cMwnj^8eq(kimPF;miE+Jbrrcu{kbyk?{^gu+8ba?r` zI;|_{sr6QvyKHlJ+V+K)LYAm6Je9I$xl9tl|GMrRrZy3~=_QL>{h)Z;8bq}@Dbx6d z!#2u@!aGo4pwDJ<_;#G;XU+?Z_s?fXlR`_p6AlQv-prY4kH_4Vom$aFhA_5@peNi* zd%8P2b2p?q?DY%5n)-gk5vuVkonG{b z5JuOW)Fct6*GpVqzZ46145?aKwCi;=Hd&+`MeIx~Vp7UHV9Vooz&=+IOGV8U`G^^K zy9LO)vc8Z?;bAaa84sqBJGx4{G1T#a^SXFA!P-v0p2VMxU{)m+*h=TEvVi=WQLbUQ z$c`Mmw8H*5{UD=z#bHP*(rI15?{9%`q&u)I~v`W-oul7$)2vX}GFOc;AcY`rW5;jOF&WQUn zEUM{K1*~BbK{Tl}{lzZ{Q5gZY#NGLv0QAC$jV!6BX_Iom_K;T?vm8QC+PAy`;R*O@ z#V<0soe4|VnZZc(oK=KQMUGRMX~zYMQX`}BVKA%`?)B1tse{>W!MCUSmRwh}26$a0X2_$I@7MYGy%UJv^_v|DN*bdF_{YiBCCt9fRig zIy?!lyBgNw8?hT%ON&yTn%Qfp0$cx#9Gvv{g~}APB1AmA3rgjOs=nu2yp+GetHj@( zza-y7PjKpyxRF1HjIsLSC9SE(R6j0D8rb;OE*xts@)TmuI9ijEM#<)wWtA>gSi1yc za+k#v%S5YA>&nU4NYDn98BDZ!G5`i~{<}fM{x*nRA6s-xBNues^0T1v==~7UtEVnl z+AZQ+J^B(=jz29@MiBw8v2CY!%!3i4R?ZjBK})KQv2wjv45lZ7HYa53Q|IRt4HG!M z(hX0k)h^`CR4Z<^wA2;3^xLKORx;U+(|7e532M02T1rH+x-G$!E~&{p@y7TCceG{> z+=Yhap?g!g2Pvjw`c&Md0ooVx~`w{CT&E2GoX<7GpN^e1c zVz#KG6^Ks$%~-XTCBl@yB+#^wu%s?Ml$RIrZD$?qW`fgfl^<-MY+e`7sN+GD6$R|Q z7LM=vkX69#e6o3QU7DQP!1miu;~WSz!q?6vMB{- zsVB1|6QWOhNKQy)s!i*%yV!!j3k90>{HN^p+D^oBv%Eo1?6alg}gYaJA9J@kRz%>C*o6BH*NbR3me3e{8GW3d5|y!3(VZww}t4)v*GD?9nb2(hAr1{mXzyh@f*!+r=eU~d$2XU znzSf7JjqJQW@FTeSXLFMQdy0BJ@C?Y3Rioqaq;HJc^XSSAP!E)s$)&I-rKRT+;48a ziUU-^veqx9yc2rytMr>DwMG@k3@cmobIPeQYq16FY(F4yEtR=&^|E?b9VeDJ;PpKl z#crh=5#OGv`7a|i<(K>`74S^a2#LyGsm2|;AbaMTj8Iz)W&rTTX6^~bWZxR!dF2`a z#09J%B5Ob29-o?hhvD`{@EG;i^F3;&g1hzg*v}P`NI~X?Wf#9Zu*jCYzi`Dyk6prc z^a!6C6HD`=gR$+c<)N5cf>N(#FTHi;A#`0_cU~9}!%hUyiRsDz;%~Oqs0U2U6&E=T zfmH-x*`v)n%Sx&R)-{v_%!B^v$XV001Enq&jPfYbt?(wjzb9({o;@>a_VA_M;f$X- z0p_h1f%DR9^|Uz30>7upL130oR%}IgFmwI%i?o5kWCi4NLiJxqo`YvcCL`xY0MA#P zukO>+kY{*7W>r(-9HHmwrWX{Ie7g|2>_9K;TK&3!J1)Dz2<-II)_fC)!!~YKQ_#*! z^ZN(C3Xwwdsnx<1N$!ghAJVJ!YM=@YI-ma+3tV6Pk9`NO*BEI|byqX~{1y;d}dh0i#5gK$Ce>rn<1yeFAd#q}V3c|- z(uqat&AuyMdn-3PYA@!-Pbg56+&PDi0v6?um^#x?jgN;neXu_7^Md1%kntG3yemiq zKf0JjwJIo*y^DOa8Wp=2iW5J{x&3i#hdV-Nxu49i;?ZuU{&X2;_Oo1BaYX_5pf`fH zw{XFjXD_Y3&gmF%w!w(JvX|N`rsrz!U4Q5H;Y&GWSs}7d>$tNcNNu{tJ3>S+`Ff>E zd4|7ZhD-TXrQ@qQN`upvB?5|>uR8gd%03BVam?be1f40eQd<4cf=Mnx&%>Ubi=7Xt zwr9`j^R0}@i_q~?!|5Z{n^;Rc0Px#5ypI*W%2K!WJIiPDl`b%S{(uLn%`V==x<~N< zhiI(7zv!va`(j~oe`9vwVCwH_&>A29l^RUnI6+Y`c;vFtbJx{JD3%2dr1!)QI|)~ zJBU^$O5Mc!(xFGDQGcd3RebhSoBh91o4M4~ePk@k6!v5^S>zHADUF@7+I&$E>)+{J z)ny&*%~};^Sw?FSPHOH5rXT%&49be49J^CFe6w%rKoa~f8P=nu{5ARaK_!xZCC#(F z^L?Ij2MDswn?V6AKQ~;y#D7#$|hm zQm(hqTRrYSc-%Vs_c2$adJkVZki?XdXJ4ebwSHQhxSv2M?pOcnzCZmXLi>LV_%3h%F#sqV{cjO4y=dAL=%)w~-bak* z!cN>wC&fWnzK^Lne)%t%E;SRbeHUcz*i4UzF}Nh}8*i`{XODCfEd|J=|&pPL`ch9E;;^1+l|9GE64h~^5*9PiJ7QY4&76;OHy(EaAI#DP_^ z*M(nwhAH`1>_Iq)&w?KR?&*m*u+|Z^$J|#Ao>-Y8>KeuKj_sdj{j}`f*~J~xJ;IwvCDF^*M9u^h~KNwcj+^SLQLjSn+U{ib$c`3;<=>3erQ+9@-g~jNWopFQs|R z2eLiIm3`yPLAo=bsdEYKsv;bt(JY41`eyJ0?8VELNHcX1p8{8Y|JVp;vlqxrYJ zQr+T5%lp`cnGTEwwj3ItOCHlA$>gzMg37n)RG>as7%&ru0S1ApK01UYwJ7kP|>SbIq|9t!}0A&?XN>mRqnOM8Tyc;(PNy+aYZs?w>v1{Uvm$-33Ckl>T z5_+XOf*$vG+I@&aVi|K8d9jvZzXkgHd3f^3W7;Kouywu=3t-@BwP9U_J)jh^xbge1r$xPNUiUTamEeW++DiN*im=a}BYP#7DGEQS^WjZEM%`KYYKVq{z z6v>fNR)x5I(N*4~xoW7(uVtUj2PW`@KXhfv5v}eRW%1|~dt`e=B>b+Ly)oB6WQV!P z$U(|vhv*-Y9X@&PA@>J*9v;8eKc7dF0Y>+~-ha^QKbrg}C;wsRm*)5n4gaCx{|*f| z2k8myFrr{2`JeIfE#&*R;XhwN%XtZ%`1B-G@ehYm