From e0aa7d99eeccf7153786ca2e07c9a2caea5caaea Mon Sep 17 00:00:00 2001 From: Bane Stojkovic Date: Sun, 9 Feb 2025 16:10:30 +0100 Subject: [PATCH] Ability to set explicit dimensions of basic shapes - rectangles and ellipses --- .../src/org/diylc/presenter/update.xml | 6 +- diylc/diylc-library/lib/diylc-core.jar | Bin 399687 -> 399687 bytes .../components/boards/ShapeModeValidator.java | 21 +++ .../components/shapes/AbstractShape.java | 66 ++++----- .../shapes/AbstractShapeWithDimensions.java | 134 ++++++++++++++++++ .../org/diylc/components/shapes/Ellipse.java | 2 +- .../diylc/components/shapes/Rectangle.java | 2 +- diylc/diylc-swing/lib/diylc-core.jar | Bin 399687 -> 399687 bytes diylc/diylc-swing/library/main.jar | Bin 945171 -> 949280 bytes 9 files changed, 195 insertions(+), 36 deletions(-) create mode 100644 diylc/diylc-library/src/org/diylc/components/boards/ShapeModeValidator.java create mode 100644 diylc/diylc-library/src/org/diylc/components/shapes/AbstractShapeWithDimensions.java diff --git a/diylc/diylc-core/src/org/diylc/presenter/update.xml b/diylc/diylc-core/src/org/diylc/presenter/update.xml index 892fcd1c..7e084a10 100644 --- a/diylc/diylc-core/src/org/diylc/presenter/update.xml +++ b/diylc/diylc-core/src/org/diylc/presenter/update.xml @@ -4441,7 +4441,11 @@ NEW_FEATURE Added two types of 4PDT On/On/On Switches, e.g. DiMarzio EP1111 (thank you Lukasz Tekieli) - + + + NEW_FEATURE + Ability to set explicit dimensions of basic shapes - rectangles and ellipses + IMPROVEMENT Better rendering of the effective circuit graph in the guitar wiring analyzer, showing series and parallel connections in a more intuitive way diff --git a/diylc/diylc-library/lib/diylc-core.jar b/diylc/diylc-library/lib/diylc-core.jar index ca132f01339c3f63defddea8fde1ad36346093d2..2a63301726d33d1b425c5b6b5750d7bc1be34981 100644 GIT binary patch delta 6145 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 L;`|#O<%s_R#_Rem delta 6145 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 O_Lbs6`>*m)qy7sHS>+=D diff --git a/diylc/diylc-library/src/org/diylc/components/boards/ShapeModeValidator.java b/diylc/diylc-library/src/org/diylc/components/boards/ShapeModeValidator.java new file mode 100644 index 00000000..0c7adbf8 --- /dev/null +++ b/diylc/diylc-library/src/org/diylc/components/boards/ShapeModeValidator.java @@ -0,0 +1,21 @@ +package org.diylc.components.boards; + +import org.diylc.components.boards.AbstractBoard.BoardSizingMode; +import org.diylc.components.shapes.AbstractShapeWithDimensions; +import org.diylc.components.shapes.AbstractShapeWithDimensions.ShapeSizingMode; +import org.diylc.core.IPropertyValidator; +import org.diylc.core.ValidationException; +import org.diylc.core.measures.Size; + +public class ShapeModeValidator implements IPropertyValidator { + + public ShapeModeValidator() {} + + @Override + public void validate(Object owner, Object value) throws ValidationException { + AbstractShapeWithDimensions board = (AbstractShapeWithDimensions)owner; + Size size = (Size)value; + if (board.getMode() == ShapeSizingMode.Explicit && (value == null || size.getValue() == null || size.getUnit() == null)) + throw new ValidationException("Dimensions are required when mode is set to " + BoardSizingMode.Explicit); + } +} \ No newline at end of file diff --git a/diylc/diylc-library/src/org/diylc/components/shapes/AbstractShape.java b/diylc/diylc-library/src/org/diylc/components/shapes/AbstractShape.java index 597183c7..f1aa5461 100644 --- a/diylc/diylc-library/src/org/diylc/components/shapes/AbstractShape.java +++ b/diylc/diylc-library/src/org/diylc/components/shapes/AbstractShape.java @@ -1,33 +1,33 @@ -/* - - DIY Layout Creator (DIYLC). - Copyright (c) 2009-2018 held jointly by the individual authors. - - This file is part of DIYLC. - - DIYLC is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - DIYLC is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with DIYLC. If not, see . - -*/ +/* + + DIY Layout Creator (DIYLC). + Copyright (c) 2009-2018 held jointly by the individual authors. + + This file is part of DIYLC. + + DIYLC is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + DIYLC is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with DIYLC. If not, see . + +*/ package org.diylc.components.shapes; -import java.awt.Color; -import java.awt.geom.Point2D; -import org.diylc.components.AbstractTransparentComponent; -import org.diylc.core.VisibilityPolicy; -import org.diylc.core.annotations.EditableProperty; -import org.diylc.core.annotations.PositiveMeasureValidator; -import org.diylc.core.measures.Size; +import java.awt.Color; +import java.awt.geom.Point2D; +import org.diylc.components.AbstractTransparentComponent; +import org.diylc.core.VisibilityPolicy; +import org.diylc.core.annotations.EditableProperty; +import org.diylc.core.annotations.PositiveMeasureValidator; +import org.diylc.core.measures.Size; import org.diylc.core.measures.SizeUnit; public abstract class AbstractShape extends AbstractTransparentComponent { @@ -103,11 +103,11 @@ public abstract class AbstractShape extends AbstractTransparentComponent { Math.min(controlPoints[0].getY(), controlPoints[1].getY())); secondPoint.setLocation(Math.max(controlPoints[0].getX(), controlPoints[1].getX()), Math.max(controlPoints[0].getY(), controlPoints[1].getY())); - } - - @Override - public String getControlPointNodeName(int index) { - return null; + } + + @Override + public String getControlPointNodeName(int index) { + return null; } @Deprecated diff --git a/diylc/diylc-library/src/org/diylc/components/shapes/AbstractShapeWithDimensions.java b/diylc/diylc-library/src/org/diylc/components/shapes/AbstractShapeWithDimensions.java new file mode 100644 index 00000000..2dffc3d1 --- /dev/null +++ b/diylc/diylc-library/src/org/diylc/components/shapes/AbstractShapeWithDimensions.java @@ -0,0 +1,134 @@ +/* + + DIY Layout Creator (DIYLC). + Copyright (c) 2009-2018 held jointly by the individual authors. + + This file is part of DIYLC. + + DIYLC is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + DIYLC is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with DIYLC. If not, see . + +*/ +package org.diylc.components.shapes; + +import java.awt.geom.Point2D; +import org.diylc.appframework.miscutils.ConfigurationManager; +import org.diylc.common.IPlugInPort; +import org.diylc.components.boards.ShapeModeValidator; +import org.diylc.core.VisibilityPolicy; +import org.diylc.core.annotations.EditableProperty; +import org.diylc.core.measures.Size; +import org.diylc.core.measures.SizeUnit; + +public abstract class AbstractShapeWithDimensions extends AbstractShape { + + private static final long serialVersionUID = 1L; + + protected Size length; + protected Size width; + protected ShapeSizingMode mode = ShapeSizingMode.TwoPoints; + + @Override + public VisibilityPolicy getControlPointVisibilityPolicy(int index) { + return getMode() == ShapeSizingMode.TwoPoints ? VisibilityPolicy.WHEN_SELECTED : VisibilityPolicy.NEVER; + } + + protected Point2D getFinalSecondPoint() { + Point2D finalSecondPoint; + if (getMode() == ShapeSizingMode.TwoPoints) + finalSecondPoint = secondPoint; + else + finalSecondPoint = new Point2D.Double(firstPoint.getX() + getLength().convertToPixels(), + firstPoint.getY() + getWidth().convertToPixels()); + return finalSecondPoint; + } + + @Override + public void setControlPoint(Point2D point, int index) { + controlPoints[index].setLocation(point); + firstPoint.setLocation(Math.min(controlPoints[0].getX(), controlPoints[1].getX()), + Math.min(controlPoints[0].getY(), controlPoints[1].getY())); + secondPoint.setLocation(Math.max(controlPoints[0].getX(), controlPoints[1].getX()), + Math.max(controlPoints[0].getY(), controlPoints[1].getY())); + } + + + @EditableProperty(name = "Dimension Mode") + public ShapeSizingMode getMode() { + if (mode == null) + mode = ShapeSizingMode.TwoPoints; + return mode; + } + + public void setMode(ShapeSizingMode mode) { + this.mode = mode; + } + + @EditableProperty(name = "Explicit Length", validatorClass = ShapeModeValidator.class) + public Size getLength() { + if (getMode() == ShapeSizingMode.TwoPoints) { + double lengthPx = Math.abs(this.firstPoint.getX() - this.secondPoint.getX()); + this.length = Size.fromPixels(lengthPx, length == null ? getDefaultUnit() : length.getUnit()); + } + return this.length; + } + + public void setLength(Size length) { + if (getMode() == ShapeSizingMode.Explicit && length != null && width != null) { + setControlPoint(firstPoint, 0); + Point2D second = new Point2D.Double(firstPoint.getX() + length.convertToPixels(), + firstPoint.getY() + width.convertToPixels()); + setControlPoint(second, 1); + } + this.length = length; + } + + @EditableProperty(name = "Explicit Width", validatorClass = ShapeModeValidator.class) + public Size getWidth() { + if (getMode() == ShapeSizingMode.TwoPoints) { + double widthPx = Math.abs(this.firstPoint.getY() - this.secondPoint.getY()); + this.width = Size.fromPixels(widthPx, width == null ? getDefaultUnit() : width.getUnit()); + } + return this.width; + } + + public void setWidth(Size width) { + if (getMode() == ShapeSizingMode.Explicit && length != null && width != null) { + setControlPoint(firstPoint, 0); + Point2D second = new Point2D.Double(firstPoint.getX() + length.convertToPixels(), firstPoint.getY() + width.convertToPixels()); + setControlPoint(second, 1); + } + this.width = width; + } + + private SizeUnit getDefaultUnit() { + if (ConfigurationManager.getInstance().readBoolean(IPlugInPort.METRIC_KEY, true)) + return SizeUnit.mm; + return SizeUnit.in; + } + + public static enum ShapeSizingMode { + TwoPoints("Opposing Points"), Explicit("Explicit Dimensions"); + + private String label; + + private ShapeSizingMode(String label) { + this.label = label; + } + + @Override + public String toString() { + return label; + } + } +} diff --git a/diylc/diylc-library/src/org/diylc/components/shapes/Ellipse.java b/diylc/diylc-library/src/org/diylc/components/shapes/Ellipse.java index 6141d5b6..71ee4a81 100644 --- a/diylc/diylc-library/src/org/diylc/components/shapes/Ellipse.java +++ b/diylc/diylc-library/src/org/diylc/components/shapes/Ellipse.java @@ -36,7 +36,7 @@ import org.diylc.core.annotations.ComponentDescriptor; @ComponentDescriptor(name = "Ellipse", author = "Branislav Stojkovic", category = "Shapes", instanceNamePrefix = "ELL", description = "Elliptical area", zOrder = IDIYComponent.COMPONENT, flexibleZOrder = true, bomPolicy = BomPolicy.SHOW_ALL_NAMES, autoEdit = false, transformer = SimpleComponentTransformer.class) -public class Ellipse extends AbstractShape { +public class Ellipse extends AbstractShapeWithDimensions { private static final long serialVersionUID = 1L; diff --git a/diylc/diylc-library/src/org/diylc/components/shapes/Rectangle.java b/diylc/diylc-library/src/org/diylc/components/shapes/Rectangle.java index 733c7a93..99f72002 100644 --- a/diylc/diylc-library/src/org/diylc/components/shapes/Rectangle.java +++ b/diylc/diylc-library/src/org/diylc/components/shapes/Rectangle.java @@ -40,7 +40,7 @@ import org.diylc.core.measures.SizeUnit; instanceNamePrefix = "RECT", description = "Ractangular area, with or withouth rounded edges", zOrder = IDIYComponent.COMPONENT, flexibleZOrder = true, bomPolicy = BomPolicy.SHOW_ALL_NAMES, autoEdit = false, transformer = SimpleComponentTransformer.class) -public class Rectangle extends AbstractShape { +public class Rectangle extends AbstractShapeWithDimensions { private static final long serialVersionUID = 1L; diff --git a/diylc/diylc-swing/lib/diylc-core.jar b/diylc/diylc-swing/lib/diylc-core.jar index ca132f01339c3f63defddea8fde1ad36346093d2..2a63301726d33d1b425c5b6b5750d7bc1be34981 100644 GIT binary patch delta 6145 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 L;`|#O<%s_R#_Rem delta 6145 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 O_Lbs6`>*m)qy7sHS>+=D diff --git a/diylc/diylc-swing/library/main.jar b/diylc/diylc-swing/library/main.jar index 6ceefa4bea4ce260bf5103c8c55070c6977ef533..f95652c82bf32261c1c6cd78b0322532a4e05f7d 100644 GIT binary patch delta 23717 zcmajH2|Sg}8#m73>uu^3pVG$domIu8=T8K!7G7pcS3W z(jaL@CmSb_)T5K{Dxv>(szFMMsGue)%mk;QB1F&(6$OGOsE`p-2caE;bmpicNK_$N zAZ!K6hTv2O#UW(sIAaiOAQ(L#a- z13BcBP+S-$B$=JvBypi-a2Q&gy^0Kl@bn7~TIshjWP`4MuwQt1fyWznacfcY6yX`WJ(S*A ziAl{-rk$6XIPJ_^G4@`&3sJ{|bA1h8C0v)AXnAi-1kJDcaD4*wVXYY@}bLUg2i9!?<+l5G|^yJjs z1XokZTAi>(`4M-d2Nva2hnj!5@?e!`;Ro%84WG%?l9&6^W#Xs$`EyM4f(`nFaNMA@y&zwhKF)~KWe=8t1Rj$iI6n=I=X%#~d|#c46;o&CeaIU4Iu@u^v5>sHj^a z@#yWzu8F(5ih9Bt()L&`FYFgceZsX7OV#;#+~t{3dRvD2)YGop#O({RdNqUd55Mw{ zIeEo%>AYKjfIekAY1HlL}q zW4iAu-u?2{O<#HP?!vPwpKOAzos0YZ=Y)yc)6!W$>mDiITH3!&2*H9?KsVU9);0H+SE>()n$xO>B#-_8MMd9$Fo=>d>m3uAeh1ET|7U z9G+9{6bhnQGqTtnjt1UVvwGYgAKROxaOB42J$1AHO5XaeA~a>rbGPqwo8NCto=IwC z?~qGyTHE9otnzc4IJ?MLbiZ+0R#Dp=y87I}*IcVF#+#x{O#TE5ym2leC)_r(ezlz{X#!~Asy}8GH8fHLfV+5!RsAscvR z>qk0oaHwDk?y7>}f>CIk;Bn&x=VHpk1A^OS5M^$z;3^h+xL6|ij)A*#=;0>y0jhvN zs0gUs#FRtR01YVhvM2DK-VppnMa=bg1S?3G`ReZrXG@{&0V**RBIdNaf(+indxG_7 z?BZoU6x=9^9wZtCf1vS{C;DE{7(T|={45%z=d=KYY*@w=@9jl)O+&korr)y ziE2vNeL3L!Ly!%!2H6bWlf|S?5#)MVAZY~}#Cb~VNKYrAhi_bx30ABhL)wNZ=MR(i zV&gN8kb>Dn01wAWxI)DpDj-Y<&Lzb|Y!2`pVzYVer%6k&X6s9&bJ+LZ3epRCq`A70 zWREqAHj}=KAqxF7$qrN8zLEr`X(%;jS3D>LBA-bXK>HV)4m>}T#CfGGp>{#Uf1D$9 zRvJCns|(p;!9)$AjhG@lTZn<36txvvgrOjNAq`>dt;O5jjT4mw1ZLQRmfb=+;LmTi z2=DD&p-Fg>7+x!sCdo#&E3Efrcfqt|q^%*#1Es%gIo|Uaq2Ji_v)w|`*wEq=LM&`( zRhH0GY{=}CP&a*Rf!a{OwI)Gm%(B2g1Ur@v6Nh| zFb8|BMJ1oa)@m7K!VxhxxfVyWbqblttzZqZ3{J#29kM#^aK#2>I(GlM9k~@N%ycBL z!VgquvI5qu7C?T4r3Qn@OE5G)m`rrjeIeuwoMal&WGdnF0qbF|KU`h@5=%)=kOT9h z$!a|AZgMyc2f$!cV?{S?eF_lVNs`BlM6moISriNNZ*k&h6}!xG_-j>1tZo(hsr(g|i>aVz-_j_sCqa=bil zn#*_1AGO1Zd?n#!6QT5;Bu5Oml#yxE8QoIN< z>QuJGufRa2%hW9;*B8WMD9-^?Z0eT)q6c5I7 zJc=$JN#|Bj&f|w4HIzy`9+o|)Y)8Xj-mDf1He~*u@_~aJb_bP{+X~~c30NDj0zto5@spBAa4d zX0Ud!1O&Fr;lUNNRnVwMu{+)p)B()zDou^XY4}8gs)8xsw5Vll6r561Dg#%dVm9?2 z8ByXLsM17Ro3&g|?}6QG2Nh)N!luF6>zt@~Va{uGq3YmDvfQXqI5P2m)FG^W_eyHx z1YC`)sWNemup0hEwXueSTc{)wM$fs3-b;wB3m^_?;rqbQG zv-0sN@-`1q&tU6HB-%zAax9HO+eSgQCWz6d3Zn-z37QRdBU*{pjhRC8VdE7ax8=eSYH$LMPKuQf4P+T`C_K{>wENg$axU%N1XSM-S7@6>k(FgNw1q-g zy0yJ}i5=W8IZ0w?{z=R5em$hk$F1k`g0@+KjoM*eS+JufM?k;^SRWzD|6`@_etxCR z<{-5eLi7qIG;~>nJ{eign<7QWl~13H|RpbCY@^z-=PK^=W2_JI0~zI-x*0*C0X7`pnC9zoPLWp6_4Yq$;fU;yh) zP*>kiIu$&!fcSYJyoeBnBGzy; zjFFCY8f{`&N+4C6;~BfLs^Mft3l3ZpV9dkJdPf;Iu(!P#j8Iv`?0c1=jThR96^vgK|vnDm$7DTDYnOEZZs`&5=m#U3;oGM8apX2#3~SbOqZ<^b`sq-vG+6$jW; zd7@~8pu#J0X9iHk(EQ_3l0M}Dj7cDTmEw{zjU)}MyqHw3^@{L~8~pq?;x_|}f;I-u z30fDhK0GL7eYh&7EeP5cw0<>uXE5@rU}4jO1}o7&k8{__uGoKCNh#3w>1CRju-n`i<3#FJ-Pm^`ZL>FMd^HLYLY z$E~i_YZ5##St@#`AAR!tTb&&Lg|k`yQCBN<+EiZKIy;o!s2Ow=ql@u|zHOG?BCRsF zs5|enUxcpB`Qlv9!I**9#rIviJx*9>@U$D#jXYjFtMRi4nH3Q5?B#SL+lyKrZ=Pt( z4~sZ*?%`qYS~sIw`-t^h*M3ikUw<`r-PK*{N!&c?+gBgu2L;AfiyA&Vw0`>SFI}Hv z^N-|vcrr3<%HK;((ti9t^O1z~q@q&&?SVE%Ys+$@G#j0~{ho(-YlkfUIlI99$%!eK zRz7ij>3U`8P>b!SzL^a=Iij_1j;@jPsBTX0`beHzkVFe$Kj_buad&ZeXx!qFGe6`} zmYprb?iJVl#!(yn6OWvf7S&%AF^Zj|+1R}$e#xWr3url8?>X&yaopqF%B9cu1v#lp zbRRwSQH1qw*L%y8_9jf3)jwF99vqoHc9yvT-nY$VPIR7RmMkuKt-B;8 zuAzFJ(Dc{!m30G=hKINU0jgItwv{b0oORSOXWr$=3#El?xs#q*{>U7bQIq9f_)Bs& zx_-I($Nam6tE9A+Jxq9#B7RDJ?!Cc&O~FHS-LUvA!hwAs8r9AB(zewxW5aXUN$)dD zncwJn9MP9*3E2mqCxyIG{k!9M(XWHzlPptPXSW-~P(?5QmQVO26__e=BkBFsnt45W zsguoS@4Rxze$|-}MQ--Pe*4{967^56B)=1VzO=OE#KC8_GZMGf6vg#zwH0LjbORa< z65a)07C3x^X@`mMpG5kz*DXq!d9U=q2cr4kQ`R!R? zzud>@Wu+2ndzQ^%M*7aOcS(sVS^Bj2(d2j;){oD!t>sj76 z>>b=K;PT{BX_}Ph_1@n5v0sxf2c?uZt#fK}4Qxn@k=vbj;^SBK=?#`=dklX+UNhyv zt-FT1R&C7ec=zQ5x6ka`pD#DLzh~{tyD+iZ=i%)nE9KbgX>zOm?}mzjoC_-p&fH4= zBOX?IOF~eOqc|n~@q>-lcEI+%ll%;y)YuJ~xARsS>Rr!F`?xwM!sWe%R<(sXFUsdm z*AuR_Qk2`bcS$#l+lD5TpKsMF7|Lhel&snuwd`ofnW5bHkh4RVxiRdvi$9M~TVKBB z^&T&C6;q@Ls@EW4|y^_!T^(z{>P=*7kcB%$M_iJ2q;{=$sjz zNOpTr%=~jcCd02}yMAOH<|-fIWBa4ubu)gn9`~2K z+;`fnvg353Yh?Mkj$wgb?%|KMxsOizF;zocchSpcZo6IT^7l-PgNmsm+a@}eU6s4; zKw5l5?5u3prQRQ9H*Y9)$=h>0ZvUe{=N+p=%9oox{To=>@0ip#^Z60~L#ho1c`gsW z79B86OTT{7*Hz_Mu<98%CzI(tWnt-uS3CZ=Qq-ZF&>1c`Pol}KIC`D?+?a%DL%r_fSM7(BjdpuPf#VTcI&Q`07hDES@kJLsPLk zYUokpZ**_9^&7V;>GhYk8J*=!a*#9FR`a=by8RUKUf10YVt!F?HLjYr?bgtE9jVA| z&ph1uv{^=0Zkhhx@=7O)J5X^V`8 zr7i12DQ%iN@>^C<|8dn&&)?hd&+IC_0WJ2;yCDmQJ*$ko0UdDFPc^lzWB=+u92@lB za9EI=Go>rNu*LOCc1!Jw+dGeMpQP^bmisi6xnKC^tp?lbc>&eu-IdoKG}XPDAjxhr zI@_hU)xK)oVWYR!ODZq+8RSc-Dh}nubSS#_7H1SL(2xlBdA6U`y^pMZL^Sf()0&5! zT5ahq59{W{MqZzkBXDq)n!)Ocr4fTuF0LM&AWcb_({yjn2_l@nsSbsi%tX5HFn>#km! z{IX=@^(5K)DK3+38#t-C0l5YRlYf>rI||QrZ`Pu}_4xf(xY}UzS!vPcnRoK(Hv7K* z)F|I!dfrol{0rC)UcD*79bqlpMU;b7aET}0xwq@Ye zWl(!&Rj`d^hJaXvnAPqE#+V7bhrvUa!(2)vrusdCcz>Lhya zeoDu$UDvN^eQsGceP;Z@(7)2vnn!0+J>>IRtyz0C-?i@dOq9<*8`u>|{nWon^>6I+ zaQW){d&4gluyhusUk-n*+%PNZ{-B=F$JjE<@AVaVb++6UhjQ8lg2a4p9DY^7l}#7u z%@%DHTvK$Oep~wJwLiP67angWF@tHJm#sKhtmn?{NR0k7-9pJ>rKHT%Q*$YgrZ2vA z_fu=`r&cxHvvXp&FiDh#WwZc>`1~|=%(P}8QtQy#NZR;!Pd{fDLnhMgK zs?gnk-9+??<*Mv$Cz>&H zw)lpJg~hw==Y8w>5WN58ChF26gH_uu~z^mKDuPbjsUOzTtq)N!UD zezp3(6TZ58pY7V@X_b&?w=&|Ggz_w`gSV3U20NDUG)JYr8v(YANx1UgrXg*+-XOt)eqx? z8lUTy)XMcpgp}$oNI1CYM)r%cfp0h7 zCHY?6zw7tft*0g|HH!P%)RmAC5E4B3L51zMwh1@_Nrw_o$AZTHoyd#hy)Ui(Y_dY`=z)F1O)wNYKKmb!0EmR_in_=FtO zh+r*x$-WuiEXSsJv?;8Rk-U)sSHYX%ZcO9fN?3*K{N(ngP_HdUIvc$6eP^dUUnl#@ zU0&kV^t7(hcCovs)_#0_N@mll_hwtu?46jqw>&sy6=6triazQ&(V}?hmeda6-!f4j zN#9Pmb(@4KNIrRT;+M&m%qCx3Rwrf_Q!y-$1QZXcRxQ83NoRENd6 zW3?am)ONjVxb`C^T2FT9kQG;Hdw?nPiOAs&3!jI~z16~-UAC zLuaXnl)|jFkqNmSPR6Vf>&7+rm6nFeKV!W&d33IPlTY(m=b$@Y7fYW1(4X~T>7#2U zyDkh5Ns2CCrCy}$FWe%)4I!*xre%pASSANpF2#5l%9ndE{izRT7nF znX|B|8(xMe6JIZxoJAHz8|-irFcySH#sfUAz@-kyl#xn>b*u?4+1ttf1Y~S$*f^bb^4RT-TTUR z$CoHxj;aZE2lsb){5-qh_lYjiRh?#h~0-qwVfh6A(Y zXADI4G>dF|&~8~0fyG)n#4TX(B9-TLm8OC+9uS$JCRw$t0l zFA^tDUcM?qirajiNupl9`Q!Xl-jxp%xfPq-OuQOwmQGl+b^YbCoJuvF>+=?EHOwRJ~EjpkzC_`^01O$}Yo5wdw^ACKi1!_qbGQv`goRP<`RceBi-#ncY4qgOxs~ zCj~9gILt`-Le6N*xUy8c_V_Vva6f$aexs+3hTEcVht?!Uo4RE@kZLb{)z>t`^X;9R z+HoiIH;Zm*o@Wtf`l&T4X1k~Q1&hH_ZM2JKS6L( zWnkHoVYc}&mlSfad{5!z5T$y%@2L;gslIUt3-q=~z80cjz9{+AtYq1Br@kxuD_u(b z`k`a_?RBR#!j&$awC`Q2|K_F9eVyxXUY^SQy{@doY548A%wHzG&M#)R-8k{#b?S^t z3R{Jx_V>VV(y5KxngeqDn{ISTZzWR-LjL}(pc?7y+nW|we2m-k`(@mz_k%(!!w)#` zNIERv_T6S`vq^3k$+gYeY?uAwA=eV6%v+Yp`_CNT|MAoOvytChev91*5jUFqc~jri zWO28U11}rhTu-Tg{L&W{Am1?{UwQ277bVtR;m4{?l`Vx^^n-nemz%6@ZXt31Dmx#H zwts09>Mp(YX~kLHqgh(qqxb6vh1F)cZ%y_6$z7Yx-Fhz~D{`X()yS{rcVprowoGt- z+(}P^^2G1uzdkqT9_CE%qjSVlfp{oRyux%w6Q7d!#lWb^%4O$ zOW>Py^lk@axN=0eCl&=o$~}|VQM4{dJEF|6a+;&~{6K+M^G+J>QN1m?Vrj|bB%MVY zj^C!cRG+$F_$|=x;el?|Myc5^>e$y#M@C=XC}?aV$XM2SG)?#LH|kd@!_1$j-m-1(^Y#!kxEgoYk8;bTVc?XykZ>T);6X-(i$?XM>J9Bn<{tc*xb}8@Y4BK6`B1+ewM%Ep8gC*Olk{ zMN4kqrxShbMVMVyjm9s@(?JfaoDVRko{qO68JB0AJN){sdx!AlqAttSngYp%s$|kp z56!?iBD6D!sVRjKYS*_{&5knCRR~eb;|_jQE>LCWHP2;~YYz-cke7S(8Mcrn*RW3J0!@Pf}l}f48iG;|tU>4>h~Y zT%UYBYxSVAdrG#7)Z8?;xt}|4wM>$jbz!b=m)Fqzezru@?KVcn`~lVSJFCkJPBI%A z<)>OTq88oxUdJtH{WTOFpEtm|v^U;#c)qQku3O%jt&-G*58F!OwXUevxm7LF`|e-R zwD?uHW=1trbH{EekFwp0=Z5G$p8ZUTn=1!zwpJGnl*BhRYYt|{H?08iO&6jU4c+Ve zF+lb97_iU%vwM-paQfL7{rMFIe;djqUfxXe?%Qo&^KARRQm+5*Bom{O9*?72s_svl zeP-F|Y~jlVrc=o?3M?2ww+juv(Pr;2E4~u)TD9tA|BA3Y?LMV|*uI-zRUdr|EHk*| zy>qAZ5~ig6$8X|iv?R&vmxPxWD`~t@To$zAceq)2TGqwI8@m^8ixICc`bdsHwJ$fM zb?yT+890`BkOswk|C7l#M!U%zY{|tyVfsU2jwV{5Lr*U3)AZ84R9> zuT7&|=TK)#wfpaRP!+$bH|8EgkYn@JO}*OS#;#p8E!Nk#_j+taUrp@s{!L-92PftE z>2JsZqT(*Pm&;2d9XtoqI=lB4=DH__-C*p0>YkO9Xm{48cl`m~CT{!17RQFcVX^Ac zh~ee-DMw4!RrT-;YYpDl=Dn^dYnkZp9u*R0f2p7GXZEILb9b*Yn$o%T!={-0ZkdHS z-p_)+6kvo9wmuuZog^@?e&QFAx^D!%aXb4I$eNM^5V-V>Q8 zUeU9S-mNMZmI`7oJS}_LsD|r)(#T-@M`yF-tA&m}SrX~rJlbw;{uzC3SNj%)%gvr| z?ZSsQUyVN*9j8$**jjIv+p*qj%6r+)&TFjtLDHvrrQX)Rj(x06GTRL8ELSrV2pqqEWC zpo^4dA7@9CLzm{P<;%7#d~Pq-rfrZ|(UxnZaK7OB&DaaXo9{4sZE^O3LeGmEh>ix>31 zt+dSBaaiH|1L4ek)eA>`b9--Fq<>wTGq6*;+UQAy=-{DG$~V}DuEl+&-s@evvPC~; zL3kB7trhl~crNe`24ZM9OlfQ017st9$B3(fG zEUM5^7qhJKT(jO>C%e=4T_nzWZHt-kuDizVfX60tTjejyi{>m{dG1nCb|l9*JVL04 zEy?9+e!aIYr8Z(tVC1i^kfxI6`;yZs@_8Lxx}pE^pWUjPo@(6h5_)oJmZsg>!YOM~ z=iZBd;rPkKZ7`?J=gEd6nu}bIzP#m_p1Dhv8y}N9Y_^jZVUoa$tkZ9?wtu`Uy2j+Q ze)Y6HK|+%8#nmlYIc?U%&bf2zGT&sj<2GX7-L zxrM1Bi9Rc_5}9t8vOI}dhre)5OJ(lDU#2dfXHLPC#$qNDKYS`>?#9faJf;z* zT`;c`p_ zf6WCI6-)*w^n|A~n9WQV%{w85X%GP{|I_@QEesfoW2c7JEWvof$c3x6^fVders zRuHC03$unOcx{wjwCzDX{2IN21+p99DF7>B76VYcII=t+ChHAWI7^JR6iXcuXC23S zX2`MpG3A&7OB_>*Ras`3xmSZleBE=@W_4jVW*D%D51?^ItOc0)tr^RMsGxV~G1tlH zg8~PL<-)@+b#^Qk5HV+Qz)m0d$$Oh6iwMbCI~MUF{;vaziFL5%k2n?N&XU8F*d;7K z?9|7ltPD)q=g<0ro!Sw^D!{(zghIh+p}0Tm~!D1O9+3Ay{sXeE)(C{2BJT*CBX6z zu#OPR{J>s~N?JQ%Yg0QRQ`^p7f#?PugpcVR>_GHesFSc2&`H#>qLZ+x{E@u~;oCm4 zy-@l5BcVtC6XDCjPedL5d}1%fAHBzpzY7Q$f;C-i9s1}Icp$QpBZsss?PAN5io!s0 zH(L?thYM0cW*2*+68dOc!c-gznthV;p6y!bg|JPOCZ+`HSOIz zim>S9#Uz4;Haz*52Q`|rwx`l(Ue3aW{J(x^*Af1!xI6UjNr8g zKCT5xh)WB|^{~P(?bVNeT2h4ebB)1W(*aYIN2V$b5kf zwF_i_Ve5gJ(@0`Cl(;g6shm0b@SXP#Spk9Re0HuFk5i;Sjl=+TU)U3{(6uv1?x6Fc zf-qqX`Gid7j1yA(%ASPz-$ztX4!{T~OZ?Z!X1j6xd%v>fF@LGpJ(qc~^4DPHb@}wW zyN%=j>q26IPsSrDmo&R?RU34w4|Yv{q3$K)gy11?VQ|8eL<93-tWj`$24UFby!m<1 zF=B89AvVF|kp4iDHjsxoh5bC`>zuw5W`T_Qe@BA6P<|m%5c`ct(WBp>&h5JhSpPd) z5`6fE&w7Gi2;uD+MW!MbyuL%C!I4p-IA}ji;(+4sgzx1DzHw|E9C`$1gvby9D-1zc z3yuURBmSLKN5_XjBtq_88AYbx3Z--_X6}`T8E5|A)ZTP^l$8Tyf3W58u&&f9o!kd5 z{9;Rx=CvROjkI?p31IqrBtVY6K9$*G0s`;gFffy^AwkdJXv&C`Xw`WFteE@rt8_fFIeD&*h z8s%5VtYb&|;jw-`RykLK6&~`(bC}#8Xm3{tK{N^$k^s8;Bk>$P?+@}#OTu;Q!bg|q)SMN;2#B(Xgw_Lm+Xn72}9 z|BZ?J`B8gxFh`JsC&64(6_74QIuS19f_K-N}&^9=Rkm;S{kbV*ekHZWhh`jhTicAFShex`KM*bW+ z4Yo!({0M0~Y8x#AE(w8TA6qXuJ@|5Cjeroyl1kni^I@ zL<4X_n1k0MHxV&Vl^}|eIYjdLh`n&{g|RMyrk(gq+gKo04G>J`=%JdOAVc|d>rtWz zh~;pIIU(otNxQw00s^8s0s^oVM*rnRFK{9F=TSJyNJ$t4Dlu9~5GPUL@z{P}VH#L! zF_N2C9Lf*~&R znglAToH;n0A0{y02|`nAHUB%2l^jA``oM!mq)ZSEnj)V;L`}eDa44WWM_3)agZ5CJ zx)I!Wjvr=&t&)WFQaXegRim&7cz9Eo1-|W{iY&+T?kx&9Dw7aJOhZ z8dQ`Pw?B>Y6J2KPUdn$nD7|--l?i-%g(>K|3b8O?Ldz!y_+b{<%H*(=(OUOp#L6-o zXkHDPx8XBi!XN|XW_Vo-Uw>(0awM^U^z6MFpJ3c0pb-B!>B%93N&~V6uw-#2p_naa zapZ-Lh>lSifcl3$0jtRd*KVNYa2!lY{%i`;7%w2j=HQuHj}3Kw(Z-M&h=;$Bg)@lC znKnXwsza6q3LGNjS{w)&8)IlTI50vzim0=lFjW`)v?H@P{EKxUC;~auTt@0{=gwXw~V-N?xYeN)ZDL;~nQ<+^~&;oA&4prKGx#;p}L<-&? zqJiNWG7T?5kV9e;Q0unZFV{UvXGP1f0cQrHN zbk4uCnHn)BC5ih2_8VWug83x^Ys^1oSR5V^n3_VFFdF49Ip{%j+887~8f6!G2qooH zK>ciZ(0??TCW;=qP z%Z-C0rKwDCWPlid>kzyIuHi?$UakUXDiIY9@wVrwrngEYTR@;6X7m)kQD?gzzYw~y z4YsO4b+gRJA#4yaHeoOz63dpmxZ21F-wu(ZZx2#Yz7gW<(D4hS28;}NVij~|{0 zUQQl~aNqvx$(=C5=irNN4L)C2x{VW3QYA(Zb5*D=Wg$O81(t493OMq1WL?@tnmCjL zb>>2y{3}kefN_$=E2%V4?gv}#U)+a~c4iFVSP}T9w^1E>y5S;$s7&Q3VkHjiN-m#;!_Y8XcJZ&GzFtAB4oLLeR46)FhJGu7 zjH|G#{hmrFWoke~^&Ww6s;MI2{Bk&;LYegl3AjIsNTe+$L~0RmAMRO@ve8S4;J!LX z481L%sR`lyU;MBZ(s&jjd1R2R#Zd&VBpO`wpsGO`mKH=5IHQO-NP0n|17{|Oa zm6yscH(({F!q#x*Yl(FDUQCO#45{x&N~)yMZxdjr4M!SC^wNez8r;Tcai)SSZ8$7K z;x$D4rh|w|AXAej2{<}L-Q;y3;tpSDAs2rd&_wajfqh7Kt$kh&TWc%a1n|FlZL=i! z_nXn+dri1L#QX<;W$dKD-rxlN=5LsOM}j|6mm>iR>}WKguS=M>(1qsbIgi5XSkuY* z?cZt1tQ~y&D^FS(JPuI|qA`d?2!z8B>>Dx) zt0S3LSZ2d0Q4~xHfolu&5&*$w`cP(O;wa1n@cJf;7*-*ih2WOdaquU7juiIYzS}&_ z6Z-xc`VMzaqyKWEXB|QOCP@9#X;A*vQS@6CoR~(m+yzA3p9P`~I8y+;*(p2P5#*;s za~>kxgV#sl z=Q~3pwuuP2Ljl<{U^429(8WQMAx8|`m~;9>;3L?t(+>PMh2kcR@EdWaBK2NIP|0~& zL{tZvMsVE&iIs?0s6Y^XWa$*ZnnBocItbAL0q_T|_)_w++%2$&(cs%N{tRd9 zBUVey<@b4#*$`a&tbwmv;2W;de>u?&GYM1b#&C*)_N|Pe6&Z67HWSti-fLCC@?uRY z+B0A_#K6{=Ix3B}sT^m5wHaQ4Me;*PKHile!mF<6!ys5<0*ON2h^P$ydePb7v|MaSWF)}C}a z4a_tf$-3v2vhp|J#5oNAya|6tp=J?6uCw4DihvPVGYe{BXZ) zvd||K`Yi%;#+J|TP3QixPX*>@M(iSG4rWl9L(v#2dY&!~Za}XP`T(JSOa7rV5zWjT z(zL5E4K)9xi-4WxaKQ(WOoWu(8HcRB1!25nh9593AiC}GI22tF1`92SQ7Z_+IraQ7 z{!01^A?{DdAqtl89TPM-&k`buFUKL~&*&0h$-$qwJbsZzEjqApWsS%Kv>)d|eO>%;u<#URy@@Zox+@ z=xsM;6rlhEYxwF0Y4XZ`FWLorUMHMe`1e5}>IDBJRfZ@yW=%B9S!<~2{B#28v4#U6 zRL`CbiGyYYF~^hvH*x_4dniK8Z3v{>5+dj|Gd5g$tnTbN7@)_aqsYihOXQObb79?d*spqEo%kd5JAvRoAI})sX+TX& z?4YJysRVMu4(_fXu@Vti9V3Wjd$^&7L}hzOynKQn2G|p$++IZ7bdn%GwC70UdItC{ zl4*c()r3CqZ;Lw02v$u84*KhNz|8^5OWY=iza2OnaLR$$CtpQ~!`)E?&lHM|ka)ZX zggL?YnCl!z%>9{dxnCG2hZPJf+!>Gl%ZZ**i&zc7OGjcD?M3p*^#sw8lsQ4s#7^|v2#Cxb5q)&(nce?cbm%Xzo=b=xm2nMZ4&tI-H$c_nl7`JjR`6LKkwm#?3R&Frejx>|C>e6eaAG){{L$P(T(t1 z6p9VsRVY5^Dg(zJ8{tIwISTJsKc-~=3R_}2nyHwjifcVfz&=MLphRe=i&ILaWw zouiFwkBAy~M~TwF)qkX4DNa27H5EF(6*|s8#rfVR_+MUUDxsYocI48`n+|9X;|87K zA8_1j5j#4V1pX|5<}TKw-^Sp;q7h5VFFht8(YgQA`8!_{mVECs<$KDU zQ3P(J{%Lwv-U-hN3JA=Dn)qMvgI0pS*#mB*{_R_{J)ow+_oE2j-_SiFQMH>O!sCHr zKwpzZ8?_#S;HchFcrvd2dKKT#T`*YpVX*iOi+=+Ho*XAsd-Fw5bn!1jw62>e`EQ$? zg@6bF5bX~;Has&(2ThAO=)f7^EQZKw$~eSjF@Z!O1pYy{F&Tv+rVPmV$)x;K+lg3K ziH@?Uj#hl}5{T4K7)3Nkn{n&}DILQ?0BLpbIvcra)r(Wm)9 zxZ8yvhHGe_k$%&+(Hi~{A7TLFUuUfF7$@|`jwLy&a|r3YvWOq%082;KXxex!hb(t| zMp^W6U=;SHI#o=MAeifByLFm@}i|rY+2l zD=<6w$BdI}_$3uaQY6g}s-3-I9BAdoQNj+o=vF^k0v)^sTaJJ7HQqXozc`2`{V(6{ zA#LqD#-YnYN0I^6L2m_w&7;S`AuBjUf4_J5`t!xmSOYZ1KdSTgj^o$g#*+PKY#3=< zeULzjPQH^svHLmOcdFcnXWQCU|GRM3K7?efFxPVRHKswZ$>+n2=U=|sodPZX#9~K# zCA37#MZeX7_w12uDf4Euhd|L4P}G8N0?sT#tO}rFC9zi;K=Nx!Mu}|r=84F3mjH-_ zz&9uU9C;8I02h!jOofQ}=qW+8y2}zD-A&L}L4?vwAQ`JTEa19oWCJxb)Nwi5O%%bk zJAVM@wT|-RDe56o;`U*bC;}u_6E6*PS3^Yd<0!%e;j1|ll+kLVa#!q=Lih%b2e%^p zU-dpR*uZ+2r8DYe3)CXiGLa3UX>2vHoWiDpMsyeh)@)WFgfyfuqz~c)iTURUqWZ~> z2sAO_fu3P_q6piyeX_XEL0&-MAZ#4|>DX2Q3rqn=1Bh783xeK1GX=px924BOVIS#| zOgM3c!MxJrYoI62KzR*3FwqkPKOdm#)h?(@r9m_4b^-!Ae5{)D5i9yz+Q4TGG_W1M z+*`w$2$I$iTfbsN3|U7IU;D7d$F{(FrSbAlV9X9n{@3@(TY&P~k@s(Fp*-vp^=siO wq-X;h{td*nBP)R2U!qgJjRXXW!~ZKUU4-}zIr|0o3(f-q0%h-Ew-NaN0JohSfB*mh delta 19635 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