From 386661f03d4b44c1b5f8bdce9ba8adc4fd7f1f97 Mon Sep 17 00:00:00 2001 From: DomCR Date: Thu, 13 Nov 2025 12:48:54 +0100 Subject: [PATCH 1/2] spline --- .../Entities/Hatch.BoundaryPath.Spline.cs | 12 +++++- src/ACadSharp/IO/SVG/SvgXmlWriter.cs | 39 ++++++++++++++++--- 2 files changed, 44 insertions(+), 7 deletions(-) diff --git a/src/ACadSharp/Entities/Hatch.BoundaryPath.Spline.cs b/src/ACadSharp/Entities/Hatch.BoundaryPath.Spline.cs index 61a3989f..62b64fe2 100644 --- a/src/ACadSharp/Entities/Hatch.BoundaryPath.Spline.cs +++ b/src/ACadSharp/Entities/Hatch.BoundaryPath.Spline.cs @@ -1,6 +1,7 @@ using ACadSharp.Attributes; using CSMath; using System.Collections.Generic; +using System.Drawing; using System.Linq; namespace ACadSharp.Entities @@ -130,7 +131,16 @@ public override Entity ToEntity() spline.EndTangent = this.EndTangent.Convert(); spline.ControlPoints.AddRange(this.ControlPoints); - spline.Weights.AddRange(this.ControlPoints.Select(x => x.Z)); + + if (this.Weights.Any(w => w == 0)) + { + spline.Weights.AddRange(Enumerable.Repeat(1.0d, this.ControlPoints.Count)); + } + else + { + spline.Weights.AddRange(this.Weights); + } + spline.FitPoints.AddRange(this.FitPoints.Select(x => x.Convert())); spline.Knots.AddRange(this.Knots); diff --git a/src/ACadSharp/IO/SVG/SvgXmlWriter.cs b/src/ACadSharp/IO/SVG/SvgXmlWriter.cs index 17382ff5..76470260 100644 --- a/src/ACadSharp/IO/SVG/SvgXmlWriter.cs +++ b/src/ACadSharp/IO/SVG/SvgXmlWriter.cs @@ -145,9 +145,9 @@ protected void writeEntity(Entity entity, Transform transform) case IText text: this.writeText(text, transform); break; - //case Spline spline: - // this.writeSpline(spline, transform); - // break; + case Spline spline: + this.writeSpline(spline, transform); + break; default: this.notify($"[{entity.ObjectName}] Entity not implemented.", NotificationType.NotImplemented); break; @@ -402,6 +402,8 @@ private void writeEntityAsPath(Entity entity, Transform transform, params IEn this.WriteAttributeString("d", this.createPath(lines)); + this.WriteAttributeString("fill", "none"); + this.WriteEndElement(); } @@ -691,7 +693,7 @@ private void writeText(IText text, Transform transform) this.WriteValue("px"); } - if(text.Style.TrueType.HasFlag(FontFlags.Bold)) + if (text.Style.TrueType.HasFlag(FontFlags.Bold)) { this.WriteValue("bold"); } @@ -807,8 +809,33 @@ private void writeText(IText text, Transform transform) private void writeSpline(Spline spline, Transform transform) { - spline.UpdateFromFitPoints(); - this.writeEntityAsPath(spline, transform, spline.PolygonalVertexes(this.Configuration.ArcPoints)); + if (!spline.ControlPoints.Any()) + { + spline.UpdateFromFitPoints(); + } + + if (!spline.TryPolygonalVertexes(this.Configuration.ArcPoints, out var pts)) + { + return; + } + + if (spline.IsClosed) + { + this.WriteStartElement("polygon"); + } + else + { + this.WriteStartElement("polyline"); + } + + this.writeEntityHeader(spline, transform); + + string svgPts = this.svgPoints(pts, transform); + + this.WriteAttributeString("points", svgPts); + this.WriteAttributeString("fill", "none"); + + this.WriteEndElement(); } private void writeTransform(Transform transform) From 137fb970256da7493191e6af60e476bcba8f5bfd Mon Sep 17 00:00:00 2001 From: DomCR Date: Sun, 16 Nov 2025 10:12:54 +0100 Subject: [PATCH 2/2] added spline sample --- samples/svg/export_sample.dwg | Bin 68920 -> 103939 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/samples/svg/export_sample.dwg b/samples/svg/export_sample.dwg index c2f66c6d3d44d7e276d035b7367187ba938965e3..bf32ae7e026000fea5d3df2688afc6658ce810d8 100644 GIT binary patch delta 14222 zcmeHuc|29!|L@xS%+BDLXO3fxgb-YN~LIg zJRGH>k#o{+zwuYkl6IbhIp~g=y2i zZ}pt|xof>=XP%exhe+zOwzy`iGYT^+xVO1mc8wM2J>s8{{=TJeG8GN0i!2R#onOL1 zrYI$Zu0==ljX;`yD#5ML2((NcE(u5cEp7$shDd{soz^p2LFt%gYP!q+s`D;4w)q4V z02FzJ0N@P(Alst=lv7KFXp2hhQ8l?}Dgov`FcYCAI>y$udFT@qBl&x}@%_>s^$P-j z+iAt_(@L1Q_S)*xF4suW>Cl{VVMkWD(}xQecOP1GDAf%cf4;ZVUu$C@vHR7Bc&BV! z&D)eU_$@ZPn@kjr`lN={JL0%bW2v;dz=S=R^(_>elJ$uk?kmK{Est!u|C3oXu#v+M0vWL={QM_$a`5V*>;m=%6i zHT4XK((imgRi4&cZp*^<0V{xJc8u=%K8g+cC{yd_CPE z(cSP&S1>O)jSp-^<@4p(qkuP022opv^|9>ubU6wjE%D-r4P$4Mbja9`_D*w~KLRF}Nm3^HD$iE^}pC-c337 zws{_5-S_BTuOy?Y;#spo2Z!@7cQ|~prXsvHv!yGLf(ZdF*;vY2UDJ@eoY?mcGbXL4 zwT-N?Z?Vk^i0*bHuT=!mvjS6WE_)HoBtd`Nk?UUAbO}>JyRXx0j5a=}tvavL7px$6 z@UaNHf8^YgnH{R2_3EkIoStXSGgbSlLHNDJll$II3 z!x5ZyGeoWtHule!vH1PFRWefbWmW`xUX) zJY=-nc;xQeZ6}`{oQi90u550;wz59BYG1{I!IcWiMHAx8cWA|d!|xQ>>PU#0+pzFq z&rM~ku~=%rkw@<(`_l-I)cM{H?sb!dSG?x4R@!XO#UdZ0i)iP&Y%`!ZEjSwAJ%f}T&al?P+_&B6sTaf*N}E;0H>gWgx+^^rLg`8SdLj-q zp0vi950sWUyCx2qqxqL7vYu{b8V;gY-W=aimiVCwV7qx$iWJ*IZ%M|~xs!A=u9h(4 zqi3fFDcgOvjM<~|h8{c=R*hpCt4SU8g5jY>hT~h07*khqnh$OhicBt7gwisw`?I?y zPOIeDd?F=OZMdA6_BH#-WV@zN%fc6jXsegAOeW=>J80s#2{`F)q9}s*+}+2(+OC3< zZ)pm5G>0Z^I7p8I_VUuXKNQ(}Og-B()y|vS4&!byZ~shE)M>le=%ArFW1!qk3oISB z;K8cfN*b>R=0DfsPZ%D0-Fw_3ZbQ6-yvc;vZ}_HsU*OgYj_I!!?+Bg4RzAo7(h~CR zoAxTQK~<3RT`-;{|nGOVMqqoadPv1qXlL|PhV+|~T zHJAqcfEAbyX2AP2c%KUM9D!v?xRO$BjglWhTjUnW-h0gJ3!)fOH`8L^Kmp();LQhQ+>|rN@v5Bu zTN^pB%k_P8yIW1q$avr3GsreXPrfs!;cF_Nr{^8g)q;<{26V8X5h zS|kP!b|ak6n=z6fG ztRE(<&y*SjM3Qk>0{da}xPwxzbrXyGs0pyRcoWwLivj{7kqJl2ma@5RQ6wId$KomQ z7~Hld6o)YCxT*1=Mjr0!s~OOSPmrFk2lK z!jwM=Xi5EOe$ixgo(52sY6A7eEZ|3{z$QFxpanE|0;-%gA}wh@#<5FHsXXB5pOSf4 zY`cV#Bk@aN>1;;ok+Vn}(gMR8rEV;wGb&ll<_R*`*%4;Vnj%6Ba6va6b^ZiVnrS#3n@GlkN`}J$=$Lzg-0Hg zx)WO0BXhhzZ&;zZsd zgui?ndpR#ls;q-l{mh0NkeE(DK#|CrAWN0pU7%<-M?BXs6RoV2M3V{lm()ii2YzALdCOO z4YY8OJx4>?muLBbNJ!e9?Kh>$0+nB+F?)RHbvtk31(nUMAA6eR4rTv}0igwg7@?J$ z86@V-wF=(nC3PZ_r4nEf21P_GZ2+uGb{|m1=4ZM3xhZEpP*zrED@V66oZsf=Bc@7t z)(G21Au}i3hnl@enKo;$a`9Te zGD1oEPU%;)CG;mOylP+LMhlK!QWO7it1=y~wqP~n zRz1m7k{~wMlt?XcT4{>Wdn#=kfh7%OjYQy&0NCWMtRT;OXkNXbO;x~659xZ>H_)(R zx8(IygUNN%0y%4oZ%B8Cf3-;>GF8DHp1pb06}A) zrbkU`&H*C_o?KfRf$|D-65L_7S4@sUmv}Zx)VVdRSLcDX5&Dzeff;q%sW|e$bbX#> zkAU)=fZcj_wqZ--S5XQ;rT&l94gg-xFS&wUuHm|d^ZBSgY0xwmYnSJ64fP3GUk%A_ zEnI-1JVhM4fNi1SJZ?P~4bvM;SLbfWVTDMt%Qn-=23!dab1Cg`#Ds5#7};ejZYD7x zhB@zYp#dEOu^u6pNYp!an4?^($C=ry%VlTDF{BKjz+>Vp0O69$$uh{xVi>0DkYJL< zWAK;;=mrLE5UnFsz`3P5p$w*!%h|x0-mA+oO-DKLFLe*aasaUH)dh+kb&}xRAs;t1 z+%y1AR%|vpeX}(Ebl-e2acTh@5How>bjd~yaV6PIse&_wmR%u)V4<8qo}vt_nstp0 z^*H2Ly0i8ba1>tZa;i9B`a9hx#Zu$fx@e0W`~^9s1G-!%j^PWPUWWl)|5bU0?{!BF ztzgvbsw~=T`Cd1*+)mkiiim-5w)mK0!H$3d2lIEQ06@sZKtS$!o+CJYU}XEnE73v2 zXHt7#A?{PZdK&^_P z3Z}q}WCS6CC{h>^zEv8MjQ~9=fj?;e1gjdtWH-!z4o3_z1oXl%fLab%aP0?}6yBhU2qX>w&;(4x5rA<4 zoj3`AF<9>jLr$P1dmO!x$$+J>ITHr30ZTw4!)F@6G9j9w)eX{>1lj_90YZ?6SvZ=Z z*3I)H)>COP1$PMmaOMEGfCJeJ$+Bb)zR-`sg4!?hKGN(|fD@2C>)Gs{z>MnZ#45j6 z>+kNZnIe!A!Mf~Oa`rAO-ff8Wby3Ypk=6UrU+rYSjRi^0(zO4a9#IH{~a+g z;d{uQ%$xP|hwS#Dg9Lzlf^Y1HvS1;QLNAk#Of1x&V$l*1sIX`lR>HYZi>3=00zj6% zUw06^$rZ}e3+W7jyi7VwZyNmN{}PfWEEb}L3gmQy0IERk#|VK;Og!c<*;xHE*}w__ zl$FULI*4!CDLG^c78qadjTV7F%onSJfOt`>A0b4GvY8^X_eO|b5zC{NCMV^RI8=2I zs*vJvmL6*TZDxJ1U?$;(CG6?-dTL-AB6`v3EU*Y52XN(Pz$SANqoRBh!k0#QlQ?n= z5VGRzb$YpqU{nJBB2@cwRBPZYf{j>E7BA_DVeP9M zL&o+WPj#>EJk%adb%EcM%zZ+D5Kw+GA_#G64B-S4c@|AU(KMtKLEw)zQI2vT@sUJ) zuMHSw2no?Fk$ifi)YCCsH6#wbsD1HI- z^I%-&&sC~_GdM3g29R6p^bEdtIUEX0k2$+=g-w_Z0YrdnWdUTwFV>fUfA>1O*Bj~1 z>14=6IF<1ya3v6kZBQu5R?uxCy^@&9s3#oAFqP9Nw-*uZdp9wWKE~VfdURsqsk2Oe z&J(vS3qaDm+@VFbz(KteW@XCqAzFGgL~DYwaWayN%q!bOK}?X?vf~tFGOLh)79m?R z_srF#bf*)`-cXP&?he2PxIu3PW<$-#0ct~hh-lN{CDV)Mz}=h`j7^8}X}})FWSS8l z#^%7h*+1IY!`3!sO;lttgK(KQ&&f@%(A^HNE#uOVoN14h|JlMICv#l0AHhtplne6GURpii2N+*Zf0dl&12+Bw! zZPt@ZNbrnbw$dXuDS2h$nrt$MqydP5G_p6c9^4Gk1sNKEkdB0C(bFh>TDe3H1E&4x zLc|+|U%UY=9SKzjj6b#H(n#rAMDN6?)v-~jvTEvOyW|iyHeG<`>cbM>locz&6W0j* za_O?kFHjVyh#7)Z0V*H~jtY$K5_sXl|kDNC`q;X2b2i31T?rV z93e&gf)W9dLuY_cixh`CM(6?=lmr|hv_Po(1tpjaOSYGb3}}A`lFf7uMID6Xot6Fq z5`j?wO{DdAC=tjDnv6WyK?G3!14=}9%TxabB;M+Q$Nm8%!e2mQ{~tiY4N>|iEl@an!@dA{Vy{02v?0*CD{!bv@bSSa^HOMRLr6b0&=93H>vU^1Ljx7>< z4h{YB=3Q;&W5-R5gkUn56BflsL!$WCpr2yPKMMcL( zrn#a4Oc|1Dry~-NwFIyj2e||eO#_hA#RAM3Lj;mpwl zcnYqGXu}%0DB%Yh(-H^>4v~QCD2gO-1tO!q6)T9uNRo(&ILKUYJjW;!Bx}hKcL`RZ z4CwH|e{&GE?}#lt?i8oIe5hmgLi)u#Epw9_E6f{ogcmlfBdJhk+GOdeCv1Hb>38!) zj#I44$eiWG-;!7lRV|}qI=;-E+vXp$`k#x%X@_AbQ=5Foy{lGnL5u4j1z4pXq~d7~ zMn9HK$JHg0?s_5BC7%!Akx78#x# z9_EY&!@Vphw28Cb6t1S*ArjQcX4%F(%Xy>Kh;`^z>Jvf^Z?DWiA%O5f9U zxgw*1LS~(lc)N94U&p=o4GzsuJPO(9RV-}0bQAvJ(k)l1?D|F&UNs+8#2br;F0ZGJ zY+A6ddtl}4Nddd?iB&yUE@0y&l8G^9?tk>&f5U>+hb+#S*Vkmi!p+jR= z`>DL>iMFBV@x)rGJq%-b zKi|XW-KuxN_Z)hv##?uMPCKo$bzBP#b#_fQG$huITpA(7Y+SyDfHUq2N1#zgW4fj} z4IAOj1EU;e3-qXuH;cD#y46^I9@~I&e&y`nz-|3$dpB;l`S4u~>*ODkj9u35yRydw z*C*^spF1+@tgk+O0Amc3o5F6Z3eQZ+xc~Kv_;I#lduA0<8vHV6`vD|kr|#IR0p+9W z_joHmle3R+uYg%jV-!W+$%wY`E4-CyW0+kPa?<_cril@6k3U=bpSA(sed(DvT+dnA zIY;?*pk`b8{DViIf2{Cf4t{Y?zMLkBj^UYaoi*-=d}}dCtE)twIe;dGu&g6kfP6})0X?Ne5xTA+QJWulDPupFDD1HA*2b4v$G$VJ2}< zGzF=N-V>X)myblx>Tnr8_wFotP~p#cgH~e^PLeMs-eXHHX9sz3RhMZ>uJeM_Xywdcbo-Xe#-)`(atNb~!WyI@p zaS6#`FwCRL6#2App(4gT^I~~I&(mCB_chx|yU))1>dOc(>D4Kyh*@=HN6oZxoK&^* z(83Wdrd8avFC1`Qo=49qYj$q1t^A7D+bs_qL(tM&6u3-~pJLsE7z(cP&b61}@ zHhyWcWXY-XAGU344jMVWFt3^V+Sdg?6+8dr_X1xRg!%gLgEc+23O9E461P3lKE28> zX6VA#;AJkexKALaOe7&tRSGeozMKE9n^H?1Zq$89sdcM3Cu zgmee@eLk{PE?9a5GhF^k?vOU}LWMYv~OOszkZ|3@2+}3(hTG%;zWSz4-BD)?E zRP^W`vtl=vFa-;EZv}(*_Ztr7l_?Es`Gwt;$`SXAIFF^Dh~Us$Ttu*$lS%Y!ImW8g zY8lWnq`aJ3aYyBPdGbrmGy|k2)sxq%YQ>^u$z2Vf)}X+vr+iVc+*ijN zb6wo>myap2{PnJcZQk|Rsz@-$I+CF|n>p^K)P3j^{#j0QEaFX1lU+7>ualUAA5|>K zSz33jvI|?kqEzo4GkZN}AqX)l`y7zP8kv<*8bBDD#OEq+Jl;iXZbyn5(>}+RkQIj# zym&_MABmm>e(dt|+@q$H`+bw9X)DL~5cwKPzvtrxsdimy9Bp%%^ zFI{`>LYP$-?|l(-?cV*jNaZGH{er7GPmXjy&e@BF#3!iI2`#4G-LN4%kv% zsJGTM=J_qX>dyGhOQOH&B3Y+>5BFo6r%84-=$^(8Pkh?Z;EKBs7A!1XF7zX4mUIkw zoxF|AKD2#PNpmtGoL(d7u2QrvDm@iPKjky|3D1upLh}a}27Gz7lN5M@oV5?XNFpn_ zx8J&gJsyl(C3Qr#_pB6b-yY9Vq|FH7Y@cpAwsp#vj-;B*p>wzw(Y<8TTH8&L1f|3* zo*H?<;S9GAA2ZK%mr(~vF71p6(ev#o7jKjvIN{W_+kc`;wD(hru2>|s$hv!c4M}oi z*^X6r7T9;|kgq*9lRW;u_~IvvH)L(iw(q|S^u*Yd#@~Y)?GDZrJ)dzh@DuVlQEUtz zBpqxqL~Fk6I3IQS!^qt$Qh}$m>s9MZ8dx%&{7e&lFzdw#7nNGF#;2)?EpLvq)Y_&L zb#2ABJpZ)gyX*D0-!jr>AtD>AYU{zexX_HJcD)-wpyagsN+sD3FKTUvgk*T{Z1Gu zzO?j8(a}D1*h*-}vT8ZJnlU-0NV#$C&Jdkvd4y8AV&j~~w(CBP>jXOF@2QPTZ!Q{t z^&G5MAAb71DC1?#F|vo6i-%_Sxlx^nis!diK^w8$9|IXzN)LB=T|t(a&L1+r*gZv4 z(v@~=uhv=D9t&Gu<4{A4^&JaaDfZT)S#e1SL3QTpLir8H&fycMmAfV$$MIIZVx^_r zVcJS}&J-WnsoH^ORu8s(-+yiQ&DxKbuKk?8|8ZY~HjI5;i;e>~mEZf<8*h8~UAFh| zoW0QPn2Rtg;lFTPKPzKXu1vjIMmhvFBXo<8av7V1uqXdRJ%f6Pl?NFx;O^=D(kQ-p zI^0R^|GAq=o_ubbF8i_Dzpb?Yw$lFFO8ajs?Z2(G{~uau<$qae5t)@XSrM)!h!t@r zRGGK%e=a51-hUoBWH(w{X(nEEF)=5#}iA!SyzXclLxaqVpN-jloL_jYG<)j@6 z1e`257KoC(Wd<}rE<`AsOW2xrm?)nHCM*P?d@4stM24L#gQlyb1i^NOg=qK@X~Ka zdDyfuf`BRl_%=aU`5Xblk!Mh4qg)yT#gUf;1WE!m!~Af-@P!snAW(&as0<*5pq$MI zLr|d+LqmWfiLfM~s*A_QgMP*5*aNRk2pwS=G*N#V$UB*862$qKDWs(#VQ za_i;fae|+kp+GMgO{OF#4HHX_YdI|8kU8v5UHI^yw2E=R9*))8O4r1)fa_xo1!oU>Dru?DO50Dq^8Wtk@{R?wHrP`2Ib&a5_@AXw z!_uD+JK=TR3vBE>IR!}*T-Ld7)SU-;l%ah~rEL88X0h=eS4*ImWxnlW;C^9 zTh3@UbrO3=DzKhLVFNA&J3MCho#Rz7>qJwdrv*i?v8$&LWp^Hz*H`C<^ybwbkwfyb9Oea z-KdU%K!1xwAU>waz+Av&1NUV{Oee9DRF}#x;Q3<8rG&N^7NaqO+uV}*EU6~iWY|3Omy|ZCrq(oc8=qZe)1?7hIxA& z{fkH`{u_}Zo;APX=%?ouLCnE3e-SBDwi=CRpu@Y}2V)ixnlnJ%cXM0(nfyqCHa=sl z^o|>0`^EO4cd|(HM?z(okxWJ8WvZ%w~rxv@4h&McY8=cXDk1^UPR)vSQ(LWBJNM} zpzfa@KZ%s#zlap~$=7Xp8V}!S12n|)c&pZb5GnH^ky6JsQqM1yv{gVJMHqy&0A|%M zA|>hvk+QGG{5tcSNzt5GX%I1cNV7&0xo9V}M&p@h?Yi&b!30@E*cTv~AtO@KTTsob z(=RK6ddjHDmbUe$lm>M>SI@tBe7#Gzde_11Ju^4mHNEqMs3mxB6}>LgRDuD zw8m7&5Ec+I>c~@Vfs9Gndb2%r2Qd7!qguGHUP#vssV;lo*Y$A;x2xB4C4 z(ZoY~oAoI4gl^|8SwZOSZRLh;H?Q68zR<|VkmVm}Q4RsiC8akmnW;)t7iQPL*I76g z{YLmF={4OmKSABa)3J3~1cC~cpR<|NOSwMBkIpIs?q)&TER-v}Q&#l%5g%xZm)L~I zk16y;6xbby znvQcodft<@ix=Hc9h{OEbk5~)F@_JaQ0!t;O+As&@o zYwi8&EhO*WE^`-stcG;M7*y%PA(T3d?MHtF-7QIsh$%`q? zH7n%ho~ffjYcp9}+h)#G$7-DCOSWW=r)-G4C@@aGU7WRaX~gW8&$TdYA9Gj{tlLH` zou7Gfv`wM$I=^#hj|=E4{IjBe9V^`V?uDyHyNYLyPcwOK0E%>~_{NKpR%cai7*r$Y*I#rHL{0_X1QtE=mJ)0i1udo!yrm}s<9`8|Hg8VFH+o6@G&RK{12W~%`s3mqEZd)?< zMZe`n7njE?gWsz{jhS#H#Oir#jcf?uj1PrXHpz_MCF7nIy=)Eql(|dsMw-ub5`uHy2B1+W8egnaGp8%RL*4g=x^m>_exwcTety+Eia=l3z!_#KYXjY=MJP|rktlC?A zoYx8Z$={!u#5%$kesJJF%=V z*YNzXH)Q{I@Tqy7>JzDsoMi>_E$<7zV8@gSWISZ0{yphiO{<5ejY;$1Y z{bL3Ga9j3^!@>S*66YtUBdY?Pp`#(^N8}$j#~(&;{&Z*rcTxvN@_D!xFiFR_(p=-o zVy;!1ar#;jiOUgjtHrX-D$W&)1n6dU0tX(iI7Q(gj=1sI3NE8KhE-@5E>tJ1LYR}r zl3<>(DBF*^ix}ulknPD!#M%aiT`Lzk*AtD$HWE(G1)zr}8;a8SN^-f;*vel6x>oC@ zcb`m#B`>#@)%qDAq!+u0=`7uveIAGjgJ7d~A3d2af+FD(9_U@j8 zMy<6|0a4+Bj`3azk7+-qD?7ZRIK!d#mW!vHLj7H?@-$lpfQ=g%e#&!K)J|I9N=1Gz zS+RJrze@5fc=QVQ_HnSgu)NlIMYXkgHNBcaCl+3K6Rn!s`7-I|c9nbot+RU)XxaOx PC-=5wX#QXM!`y!YUBf_D delta 3640 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