From 8c810a37fff5e12a283e94db22097698fc8bb1a4 Mon Sep 17 00:00:00 2001 From: Daniil Sloboda Date: Mon, 14 Oct 2024 12:10:11 +0400 Subject: [PATCH 1/2] #5581 - fixed view only toggle fragment issue and multitail arrows undo\redo not saving coordinates --- .../multitailArrowAddRemoveTail.ts | 16 +++++++++++----- .../ketcher-core/src/domain/entities/index.ts | 1 + .../src/domain/entities/multitailArrow.ts | 13 +++++++++++-- .../src/script/ui/state/editor/index.js | 2 +- 4 files changed, 24 insertions(+), 8 deletions(-) diff --git a/packages/ketcher-core/src/application/editor/operations/multitailArrow/multitailArrowAddRemoveTail.ts b/packages/ketcher-core/src/application/editor/operations/multitailArrow/multitailArrowAddRemoveTail.ts index f3667da22c..eea90946c5 100644 --- a/packages/ketcher-core/src/application/editor/operations/multitailArrow/multitailArrowAddRemoveTail.ts +++ b/packages/ketcher-core/src/application/editor/operations/multitailArrow/multitailArrowAddRemoveTail.ts @@ -2,9 +2,14 @@ import { BaseOperation } from 'application/editor/operations/base'; import { OperationType } from 'application/editor'; import { ReStruct } from 'application/render'; +import { FixedPrecisionCoordinates } from 'domain/entities'; export class MultitailArrowAddTail extends BaseOperation { - constructor(private itemId: number, private tailId?: number) { + constructor( + private itemId: number, + private tailId?: number, + private coordinate?: FixedPrecisionCoordinates, + ) { super(OperationType.MULTITAIL_ARROW_ADD_TAIL); } @@ -15,8 +20,7 @@ export class MultitailArrowAddTail extends BaseOperation { if (!reMultitailArrow || !multitailArrow) { return; } - - this.tailId = multitailArrow.addTail(this.tailId); + this.tailId = multitailArrow.addTail(this.tailId, this.coordinate); BaseOperation.invalidateItem(reStruct, 'multitailArrows', this.itemId, 1); } @@ -26,6 +30,7 @@ export class MultitailArrowAddTail extends BaseOperation { } export class MultitailArrowRemoveTail extends BaseOperation { + private coordinate?: FixedPrecisionCoordinates; constructor(private itemId: number, private tailId: number) { super(OperationType.MULTITAIL_ARROW_REMOVE_TAIL); } @@ -33,8 +38,9 @@ export class MultitailArrowRemoveTail extends BaseOperation { execute(reStruct: ReStruct) { const reMultitailArrow = reStruct.multitailArrows.get(this.itemId); const multitailArrow = reStruct.molecule.multitailArrows.get(this.itemId); + this.coordinate = multitailArrow?.getTailCoordinate(this.tailId); - if (!reMultitailArrow || !multitailArrow) { + if (!reMultitailArrow || !multitailArrow || !this.coordinate) { return; } @@ -43,6 +49,6 @@ export class MultitailArrowRemoveTail extends BaseOperation { } invert(): BaseOperation { - return new MultitailArrowAddTail(this.itemId, this.tailId); + return new MultitailArrowAddTail(this.itemId, this.tailId, this.coordinate); } } diff --git a/packages/ketcher-core/src/domain/entities/index.ts b/packages/ketcher-core/src/domain/entities/index.ts index 5d7f191fa8..e97692bb57 100644 --- a/packages/ketcher-core/src/domain/entities/index.ts +++ b/packages/ketcher-core/src/domain/entities/index.ts @@ -17,6 +17,7 @@ export * from './atom'; export * from './atomList'; export * from './bond'; +export * from './fixedPrecision'; export * from './fragment'; export * from './functionalGroup'; export * from './halfBond'; diff --git a/packages/ketcher-core/src/domain/entities/multitailArrow.ts b/packages/ketcher-core/src/domain/entities/multitailArrow.ts index cae98c39ce..76aaa38d9f 100644 --- a/packages/ketcher-core/src/domain/entities/multitailArrow.ts +++ b/packages/ketcher-core/src/domain/entities/multitailArrow.ts @@ -3,7 +3,7 @@ import { Vec2 } from 'domain/entities/vec2'; import { Pool } from 'domain/entities/pool'; import { getNodeWithInvertedYCoord, KetFileNode } from 'domain/serializers'; import { MULTITAIL_ARROW_SERIALIZE_KEY } from 'domain/constants'; -import { FixedPrecisionCoordinates } from 'domain/entities/fixedPrecision'; +import { FixedPrecisionCoordinates } from 'domain/entities'; export type Line = [Vec2, Vec2]; @@ -365,7 +365,16 @@ export class MultitailArrow extends BaseMicromoleculeEntity { ); } - addTail(id?: number): number { + getTailCoordinate(id: number): FixedPrecisionCoordinates | undefined { + return this.tailsYOffset.get(id); + } + + addTail(id?: number, coordinate?: FixedPrecisionCoordinates): number { + // Coordinate can only be present for undo\redo + if (typeof id === 'number' && coordinate) { + this.tailsYOffset.set(id, coordinate); + return id; + } const { center, distance } = this.getTailsMaxDistance(); if (!MultitailArrow.canAddTail(distance)) { throw new Error('Cannot add tail because no minimal distance found'); diff --git a/packages/ketcher-react/src/script/ui/state/editor/index.js b/packages/ketcher-react/src/script/ui/state/editor/index.js index ca47b2090b..7149d2f9d4 100644 --- a/packages/ketcher-react/src/script/ui/state/editor/index.js +++ b/packages/ketcher-react/src/script/ui/state/editor/index.js @@ -49,7 +49,7 @@ export default function initEditor(dispatch, getState) { // eslint-disable-line no-shadow const state = global.currentState; const activeTool = state.actionState.activeTool.tool; - if (activeTool === 'select') return; + if (activeTool === 'select' && !force) return; const selectMode = state.toolbar.visibleTools.select; const resetOption = state.options.settings.resetToSelect; if (resetOption === true || resetOption === activeTool || force === true) From ec3d81536904c003206a60a990f289162768abae Mon Sep 17 00:00:00 2001 From: Daniil Sloboda Date: Mon, 14 Oct 2024 14:16:50 +0400 Subject: [PATCH 2/2] #5581 - fixed tests --- ...ing-removing-of-tails-3-chromium-linux.png | Bin 6193 -> 5213 bytes ...ing-removing-of-tails-4-chromium-linux.png | Bin 5140 -> 4323 bytes ...ing-removing-of-tails-3-chromium-linux.png | Bin 5187 -> 4308 bytes 3 files changed, 0 insertions(+), 0 deletions(-) diff --git a/ketcher-autotests/tests/Reactions/Reaction-tools/Multi-Tailed-Arrow-Tool/multi-tailed-arrow-tool.spec.ts-snapshots/Multi-Tailed-Arrow-Tool-Verify-that-Undo-Redo--512ac--Tailed-Arrows-after-adding-removing-of-tails-3-chromium-linux.png b/ketcher-autotests/tests/Reactions/Reaction-tools/Multi-Tailed-Arrow-Tool/multi-tailed-arrow-tool.spec.ts-snapshots/Multi-Tailed-Arrow-Tool-Verify-that-Undo-Redo--512ac--Tailed-Arrows-after-adding-removing-of-tails-3-chromium-linux.png index d9a066fba2a7756a7460a19c7247ea637cddbfe1..b0b9db074df1096b6f549ac8a7bf7ab48758d03c 100644 GIT binary patch literal 5213 zcmeHLX;jl!7Qac@83J`9Ly=7@pcdkYB2^Y6f?J8E1Q-S()DcvWB@_f=76(SELW`XM z?WqD5krFEiiU~^=@gP(yN;S|F!lEp)1P}s&u+0nf!<;!YU*;S;Gd;X7x#ynuUvlsL zE&q4nu#dNqftdjS813KZNdeIM5&+B6!=g;g%=;wtgNdVflc1#0ydPkd>3+}MzKK^9 z@-i}4hJDyIUb)h2XWF0VF$OV4MifU-m7Wb2E--ImCng~Z1n58>6c_f!Y`<%Uw#!G+?zC@pJaHYtFLRP?}EBTY>1xeVwUmHF+Lha zod#y&S$fg15sHJ(t#kq45Hoh3xzd0ESbwsu@*}AbMVw71e6uof0Q+pZ(Z1NXb;+S*!o$GcLgR45es-Q3oB1gR2}gn!gh8bbE*X%{i8g+eBaB`Pl;Q%?+5 zd1F9wM&D&BkDTY`nmC%zrN_kFuBi!9nFCBQaxbSWe3hHqE|b|84vmbo2(N1rlNa# z5YR3#@zRLV|8e>m+tASPmfv9ACDZWm@c3v9bgto5$)n`&((XE$Wl$b{IDb+pBH0(p zBBRiXjBFD!_-q^o2xmxmhrweF6AegR)u@!mnZ}j5VRtGkDk?-Ghduy-wY6@JkzIFk zH!7F2ZMR_VXGKEM^I}Gwb8l}i-q?6B7y}*~`F`{nDwV2AeY|1AhJjpES)wgHMwZX6 z__59wpzYZicAJ*^U@ZooIg;=?KAIo|1^ZAy)Fa{5(Ja>dgEZr(xvmVgvN#n7`6EFI z*c|z6`APtS9h-$(_S^FVDbZ)A#|pXhk#=EK8Z6EJ!=|Pq_Qy}1;tg9PBpoH;MQ;YA zn--_}=2B06&(2Q8CM4YBj`cqIx~{IS3iV0S5oe>@qf{#AW>nSH)y9@?n+tcbW&`R_ zeIJ>{8*|P@@LR9?^jV4$j~#n8J>G{4)*4l@)GTS_cJ|yvOMidAEjjmxr%#Pz&7fd! zLo90N#4FQ72&7^*J1i{h^l3#?f%k)-wPR%Dj#4-Fd|Uq~A6#vGoa5;4@2{Gi47}BR zyBR|y?OLY`TSTn6WIBCpQqihVD8|Rfv$C=f;#*t|IA%z>8pivd7wH;Xa4C2^K07C8 zFc&AeT{)x$V~5D(k)a_jWm2UYY{z;SA&hzk1_o{{G`F;Dan)M9`ctQE+urMjhuPuX zU_~uxvMZdj(Dpp(2U7v)-MMOj}nMWHj>6P{F#9f}~&PHngO-IjSiRGf1 zNh3(N)z>AeQ6ooDkV!&Jy8^EPGUv@UclU*^2WjC5^GvmGEk-L=rVrPvrjOe~>R2Bt zAiQmx^FP&2kL!*hA}(cEUhS_kfm2p!x_|r!DtO`1fbqEQUmC3M!YQNv(r5qiH?Qht zG8yI3*Ur&vOidS&CuAruuAjdX}R zQZlSiR0Q4%y|qqC7ME_YwPh^qzJ2fBCx~Q|J-9A(1}P+P7V(*;+BiWA*wadnQcM`9RKcJ-vcggZY2yoh&ia| z!Z|lM_k9=|Rpli_1?R6do#0Yxda%IMOyOG>3&Cf|`v@*psj$Gmn28g7#^Y&pFTIr4 zs%REsIwuF$K1zD54eHtpzk<=o3=IvvCOsugeDiW>=)2+f!Q%-pivK5-4yUzLQm)@k3arqSRW*rJ1*l0=XWohD!fDn+IMGF z^;q!AOGUt6-wihVcYx-3R_RFUQ_VfjPft%H&DzD7975W#0uK+bpgB0-)thq_V74yL z60yN=@E|~E80lvr7r{#EszF+mfY&s5_rq zx;Hj9W>ea0lI{ou0mvP9ZjZ6iC7S#z)Who>FF6iuDl}~yCkH3>HC{ys?_e)5M+<-x zYuybc1w5Xmn1&R4er{&#)~!egKDTf+YjyzIW&~snm=MC=J|Cl_q2;f-|NN`Y$-%*4 zpdFHUJRSp`|Gh$fezj7qc==6GP>_=1(}b+x*^Gr*?}q#C6XEqoXQk0pds8|dIMy?c Yr)8wdR+F(mqAtV!y*{2LB-&s84(JRbdjJ3c literal 6193 zcmeHLX;f2J9>0lHpzNYzS*uh$Re>l7A`Q4BWm6%FtZB6)i{L_o7$HO%i&c@sVU!>U zDno%lLX<^`K;lrfih>SHkS!<*njrf_mW0gz0q4|nrZZpWjC?5h^78I`_q})j_qW~q z^G2b2x$ome4v7d~HPu&IZrYrb0P=FMBp+ZTHVeYfgYPH}Nj@vS1Bx4F@( z7rS-zl-@_ae70pLZ!{v}j9yvArIxR1545Mg9y;aaZswtTBT!tfXm^|(sC6d5i-nrl zguKt^F#JW-QYxhggiStK&pYauI4ccSIo2$b@3J* zy{S`e9T*!zXH}*i_lEi0v|?j|tGKzj`QrZPXVmm0 zHCOG|8EWQKs)4ChI8lj`&WDNE$om$$Z1iZ`ougR}v6Ft?HCOYMwTz21z*L1qZ5Gq< z1SX*v*+&+z*~Sjh-Un+l!pLBYOuKGPvks3vd-jCv-=D>1_qN>?(KVqQY8$D<$yZNO zttb?%>uFk}C$xDZqHe!lb#*mm%2<70L)Wx%IfFu>`HSdy(1@r}{j+PTRY_^-o~oC; z@HRdr(;+5=4AaQ``Yp}hHkeFgIm#IVHk;3Fx%7d<)>ofT!z2wpfq{i_%3AK26e>uv zhZ?&Tsko;76)MTRZ$=`Bt*eE_!K5YiC7~k8<4dbHL+}w2by&>9Av!D@RX6B$ejD{P zImBAOA?llOvgxr`zy3@g>Ded!0xrokJd)zbY>~7iL)-pH$3`h0h7O(5brsr{OfIrZ zVa$VAby1*5F&17>alxPEOeJ2?y$t^rrwNs;O;(LCg|J;r6FZSsj+`g4jR`C0^4gg!~yy;b&ix2(bg> zn3T=-2?z-Pz3r%CQoa(;rc86m3_MIM11k%F&U+~hSx$+P;dgbM6;OUscRJ9#Dqahd zjScZ*CL*tXbK(}8U6bi(X#tmc%jJ#pm~CtH6GFZ*?t2>{5{ab1Sx>Q&P}WjYn|P19 z(^1yHg;P*afB(E*D2+xFeITGAXTS{LB5bTAUdx0F?`uplb&~uu+l3~n&+~7aFO)Sy z=i`0tfGX}llpp-#sOeeMU$s9Tvfi*)vK>(;@5HGhrqS5w!2XJuiBe-nhM#SCYi@0( zqo^#RTXHW>nUh06Rsdq8ee#b4h_y5&dLGjD-M23nal9`;YKMduR3XT_-cPkU z$Yx8PrrC0G(DY+Si)Qqv$E6oAMhzL4TWWpX%jaSX5%ni16QJ*Z4EOJD8v~YQqn(M4 zlG|cND0v?8CRK2yW*jG&3X@93fnnDfQlMOD*7Mv4odcHx?3buZ z-agNwz5XqUA2skjhs*69cL)l$7n>+TV`3`8+so}RHz2z%3lKxEXuljd0mPt>4+oQD z#*2H~D}41V{BrG&_tqa--`bGy>~UnJqo#?2Y@ING|6`u})eR;2Er>bxM$-(9Iyx|9 z-iO7NoQH`fq67n5$xwGKt+%y|-ruoF8Vu553)>P+H-G~TH}^jTU3*y-PaElZ(U=TD z&*IK&15_IH!w=auHa2jrz2YRN8)T?e8>(VZlWylpp&V{65611I>nA{J3$MJ~Z#fV~ zn2C#UX`WaysNKkw;)Q0GO-T~$jsWBVqn~c;gBf$sTAv~iiw7X~^dAJ?PPi9}LdoD# zBY&F#CpGC%#`lsb#YQZ(*#alky@11MII_OL_jY(gjz^|XE!53iI&H*gv9my2$Yyh; zk#A!1*|-{2&`TP@S3B;-dCE7yWQM`m4%MwD)|p)gS=k0AFSL2OmK27Ey7$c`{9|v< zJ;U_`l$4t0qx6g0W>BM{9aJJ!{6)g{b;gOlwP(}UAH9)5KG{eIarHU@YB{kBFV@n? z4&kXrxV>Z5imBd;bLlPu0%F<5Ds1Kc`L!EJXwl2Zi8(tVY>If zNf=VA0@32R-K9OU1({%HH{v#gybnQ7_dEwd8q_SLZ-fOXlt3VlSywiVf8|_C2^KQJiXmA99YtdNy~Bq5%O%pf|F VwMq4nP8&WP=WXs=xtpn{{{~`6|K$ayb^gDMwC~ zG%ro53QjE$6|?c`>b?`#rw<=e_lAfX`p^ z1o!_FOdUkq{^IA^fJ!H$pNaG?_M+i^8{SOumV*DdFwTwo0Gr2Tv1Au7?kxO$XlSTQ zYB7wDi>L12)o3($2tm}4x8kg@1_CWKJ3Cu!>dpD{7E3%`v9@TmTCLT3Uwi z(*0_EbwSAzhjA)iEsU$s&{a5#tS6vQgm__i@yTtWMc*1;GduRf>G6&nWf=xEN?Z~_ zbfaCR;+DPqh+2cv@Kx=LL4w--KtikO ziwwfQn@#ml(AKd`UUL}$e{g<&eq>~1GzKE{h!w9KR6cHN0T>oBTlKf60TdT#4|A!9 zmLY3*!PfJe`!2#_Y-}uA*y46OrPh7Gcr?G_MBF@6cy*3V8Q_+hm*o8nN=!_Q!!|WB zJj3ZYIXB?f^CeVISpiu2^!Z27{q3j0j}(&ei5K-6eFCbq6|~6&$40 z*sFJ;l%eU{F{ElNl0-{Ze8j z0FACxDwC3uwsVTh%U$-lhub-?1J;PLPm{biP5`saM#dB1bM z%k#eP^FHU)oFJxndc5cX0G_GGlTQLTH3Q%nZZ62O+0wTgH4eomQ<9)#BtQ+|JCd6G zW_meCBNMXc^g+W*E0g#!Rb7si6*<8^7kXWq)0hXCd zBh&I6flz?;MLVG8 zs@v8b&KEP*h-`E0wGY|Ru*Zfy9qi;_=R?GVq1&uFbf2yO5Xp!{;=I97qTUl5TU=7| zIy+(cPL`nJ!kO~f>fTb#)ObBW#`&94jfucU6|&f}Zd_A+#ct#-^>eGNYqY1|^X6Aq z%hme;ZeSI0gB8qJJv(4sf4a6f=%qA1%x-OEte@x7O_Q`0Sy>a;1-f2ENQvSrmxlcG zXsQvh_@Yh_H=3Xq+ZG%Av;dgJKUElipXSqw$>bS^S<|ir`0f&_yHsLYqQxKNKH(+k$0y@dhn;yGB4w1(2qTCdr1599!%#6>jcZ3Nd*4=m39S*&K?c$yr z0Yq(>^E2dAJ$d@c+*V0mr{Lgzf#I_*w71VC6rOZH9tZLhoIr*3CcDxR0=fwVFAN)b z*E1c6X8ISX{-dG%rXT<+ufD!M9*;j=f#j>7+}Ri9%QXpEjp8-yK8k5gQ;-8tU-?mb z*h^H_FB^Xs9c*w*%RcX*mU9No+WwXnnw;g@$i@Ac*mUGuL?(0h8rr}4D{Xar{fI3J z{jbR=yzB}m5KYmoYfAm257-j1*fqE^It_39b&CPeahQozvq`gN_$5t=WIZRGTmC+o z%)O|MFGQgv{2NlYb$x}3+tYm)^3;0}4`EDjqkA&Hk-J!nCZ+~4R%dCdwom4V{IWUW zt(8UURP@wuE?Yju7-RdfxBctmd1Rzr+S#R@ogCnZoo)VaY?HrYwv78THyxj83wRAl zDDC8X=~KE~li9*K5cUI79P-u=&H7QCFSS5h^0j4Qr7WdgB3{_E=#mf~qQqN5xPHZ= UJSIJi{pN$zqr~KnB+^HJ0Cb_yN&o-= diff --git a/ketcher-autotests/tests/Reactions/Reaction-tools/Multi-Tailed-Arrow-Tool/multi-tailed-arrow-tool.spec.ts-snapshots/Multi-Tailed-Arrow-Tool-Verify-that-Undo-Redo--a46e0-with-two-tails-after-adding-removing-of-tails-3-chromium-linux.png b/ketcher-autotests/tests/Reactions/Reaction-tools/Multi-Tailed-Arrow-Tool/multi-tailed-arrow-tool.spec.ts-snapshots/Multi-Tailed-Arrow-Tool-Verify-that-Undo-Redo--a46e0-with-two-tails-after-adding-removing-of-tails-3-chromium-linux.png index 36700ac615949e3d75d282ada47c7a22225c11fe..191e740847a04cf93380955f3bf6f6bd16337c72 100644 GIT binary patch literal 4308 zcmeAS@N?(olHy`uVBq!ia0y~yV41k44ofy`glX=O&AkgRO z;uumf=j~m??2wmC#~&7#Y}jb*w9kPn_K2H+b>gDdR)ufhl%g^cwKJA4y?@};xkGN= zmm{^46f^cea1GcXVYdCmQ$5btS=WwCj{jEqO7YKZ=AR$WRj2*=`~5!;(6W* z>C?+AMHm?V6g%;?ou6-C|Kr2MpP!$Xzq|AE*VorayT#|*R2qHNU|{&6rpR7j_50h~ zPGR-7#EM^EUbb?JFPjG}?Ca0UTK>4aG5PqrdwZ>U4lj1^Uv>{zh22+qk}&!6^Yi?N zKm7aqdu2NV!vS+n%Nr@Fsjk2pVZ-sA%Iwi+(>5nc*hn!jyovOqd9CpKevRGy+~ZfO z85tf}x5)gyZ_yX*53H5unm_{P-ljs0=NEyM-}xdXP<=+rdMe@h+I8#n^!4xWum68~ zx_)pzBSV6`lz8{iE7A%1GtZ_SHu!U9@y3thZHW<4QM)QXKkJn?=aaYFQ_RfB@MF7h z(T1yhZFkr#*%=O;69RJj+V8Y2UAi=SdtU7Ry4Z7!3?C-9$mDGGR^09g;(P}Aw#F_# zI(l~1QMKiMbE|%SdU{2hfnmj`YhK^>7s@Q3x8dqS=k{gufED-*Vapp?+xJJkJgN>% z7EAK~?dE)=!wIy>Pq1jiYZYL%ZS8&Hpx&ecV63qzvRl7@b93|h`2G88e}B8WI$RYb zf9|wj!s_|;H#vbywCwGH)jdrE^Tz*YpMU09FS`dy<%&;k{6AJWrwW(?-z+KI7~!** z@!PasXUl#z28QZs;1&!`n<2An{`@GEXj69Y^RZ=NVA$t*;-K35dwZqZ5>r!CUnw#$ zeDHPRGpqdbV&l2LvvQA49|SK+N!Uwt~Rst z`^~qrPOrPF2h7XucP4^bX@%~i4YbkbDlN;o(U$&bzh|@;I9U6{Y1{Vg zv-`^SLh^XwD_~vyryAHkYwN9xj+ei7{knOO-$h{C;q}>nKb%h-?Ee*ieC_}J_m3q; fOfLp1P5RF&?SC`oQ*It;n1aF6)z4*}Q$iB}KI;?2 literal 5187 zcmeHKdrVVT7{9oMW?;AZ&#YU+ie(EZ&a_nCcm7cQr{7#yPgib6{oBk$gR z*Lw2xFfwd8P^8i7V84KrR)h+VPtZWgqY8tXZnShwmEVj5E8zb#*;CgPVanU zWz#fiJ(r05v<}uJn1l80iTJKr7=vsj^Ln#VI@S<(ha=D*g8YLDY{0^LY#ELG z9yZ_My(NUf&k1*5Gq8MNjgnArpt*rQ2ede#^$=9TSJEB&3j#@`It`ui-Pp*;h${{! z^=#=mN~BDE#0UgBF_JpGhA0|G;YN4v>LUA-k=J~Be3$yRw61P$wOihR!@f)iiW8-n-gh{DY^;UMVYBtqjC4%^ps39XZ1^IAG?+jjDDq8)$@5@y+`=3~ zE%&_GEZ*s%HD3l*u`W$gcmx8_c87zn{H;;%w&PPU9vp+5cAIk8ZV&%^()Xzj5T%U6 z+)U{+tjV~^;0mhqxYtnoB?e42Vu5iRD}y+l-fJk+n*oUaaWTIA1-T3Lm2(|ZQjl&w zeTtvayhkzPb;^x$PAwu`so>AP1x~R3u`d6|f-=(P)xPzaJAbsGw6t`tlFSq-fZHCa z!6Q^sZKA1PFWTH!jkQR3eOoAmr+%Vu>3yzRB0e;hMD-!B^-ny?3R+woZKP#o9ZMG& z*0zCnQl-eft~YMGQlogPBbgqGAOdaU<%=8*cWiEwn@UrBrmt0*5GIKu2xAwfVBzy0 z0ZwXFz<6ba_DVuv2EuMw9h)D$NIvit5WaR3QOaeHk&H0LU%n`zI2kY=wKpF?eCtUx*34lK)riwLc z9R=vcp$X>N2Mu+(*ZMXW8*`qQ5a(W0lHaHRBzs{}Y=wOC5bMtT>`|?*4~ZsgfR>^` zoCB$e|1#75TXcUvW&iWa%F3ra89@MqD?4Gl|C#FHBn<*Vr{3`!YF9tSn#BcsG*ne2 z#xfAF?OcO-73h;%PR=)6PfF4XOh#@4(4*A~#10QqKrR-?J<3ef908lVZ+>e@5ON4X z%G3|46JzPAWsrAii@=zRWvJWO?2Yy3W%COSoOlKZ*^W8F?KN4t4#Y_FoQ5Ow13Qis0^gOHE@`@_oeaO^t9<*RTE7CQcZZ-sY-bw&9C~rKwn^mt%|_r zT){HepXIDPah?}>aC(|#;0}K;?QY@7utL#1@CQ1;pyM1!19Z4W=XtaqqV@1E2N)5Z zCu{08^N03e$wL5qCF;ZPY3PJ*IVHxWd>r&)YW9S2wNePz3@hAHh~08iME$T>ZPaJq e14u?mSthr|9<)8%cFhwhJCWfrVa+EK3V#Kiv*%j?