From ab15b267245de66ddf9aa358d0944592cedca904 Mon Sep 17 00:00:00 2001 From: wyq Date: Wed, 23 Aug 2023 20:14:08 +0800 Subject: [PATCH] add append, insert, delete functions in numeric package --- .../meteoinfo/chart/graphic/MeshGraphic.java | 6 +- .../org/meteoinfo/common/util/GlobalUtil.java | 2 +- .../meteodata/radar/CMARadarBaseDataInfo.java | 56 +-- meteoinfo-lab/milconfig.xml | 14 +- .../pylib/mipylib/dataset/radardatafile.py | 4 +- .../pylib/mipylib/dataset/util/RadarUtil.py | 48 ++- .../pylib/mipylib/numeric/core/_ndarray.py | 37 +- .../mipylib/numeric/core/numeric$py.class | Bin 154424 -> 154424 bytes .../pylib/mipylib/numeric/core/numeric.py | 14 +- .../mipylib/numeric/lib/function_base.py | 404 +++++++++++++++++- .../pylib/mipylib/plotlib/plotutil$py.class | Bin 58015 -> 58291 bytes .../pylib/mipylib/plotlib/plotutil.py | 8 +- .../org/meteoinfo/math/sort/MergeSort.java | 53 +++ .../org/meteoinfo/math/sort/QuickSort.java | 2 +- .../org/meteoinfo/ndarray/ArrayBoolean.java | 6 +- .../org/meteoinfo/ndarray/ArrayDouble.java | 12 +- .../java/org/meteoinfo/ndarray/ArrayInt.java | 12 +- .../java/org/meteoinfo/ndarray/Index.java | 12 + .../org/meteoinfo/ndarray/MixIterator.java | 23 +- .../org/meteoinfo/ndarray/math/ArrayMath.java | 67 ++- .../org/meteoinfo/ndarray/math/ArrayUtil.java | 6 + 21 files changed, 694 insertions(+), 92 deletions(-) create mode 100644 meteoinfo-math/src/main/java/org/meteoinfo/math/sort/MergeSort.java diff --git a/meteoinfo-chart/src/main/java/org/meteoinfo/chart/graphic/MeshGraphic.java b/meteoinfo-chart/src/main/java/org/meteoinfo/chart/graphic/MeshGraphic.java index e510ddeb..1ce5ccd7 100644 --- a/meteoinfo-chart/src/main/java/org/meteoinfo/chart/graphic/MeshGraphic.java +++ b/meteoinfo-chart/src/main/java/org/meteoinfo/chart/graphic/MeshGraphic.java @@ -331,7 +331,11 @@ public class MeshGraphic extends GraphicCollection3D { vertexColor = new float[getVertexNumber() * 4]; float[] color; for (int i = 0; i < vertexValue.length; i++) { - color = legendScheme.findLegendBreak(vertexValue[i]).getColor().getRGBComponents(null); + if (Float.isNaN(vertexValue[i])) { + color = legendScheme.getLegendBreak(0).getColor().getRGBComponents(null); + } else { + color = legendScheme.findLegendBreak(vertexValue[i]).getColor().getRGBComponents(null); + } System.arraycopy(color, 0, vertexColor, i * 4, 4); } } diff --git a/meteoinfo-common/src/main/java/org/meteoinfo/common/util/GlobalUtil.java b/meteoinfo-common/src/main/java/org/meteoinfo/common/util/GlobalUtil.java index a0d13ed0..ba8b1783 100644 --- a/meteoinfo-common/src/main/java/org/meteoinfo/common/util/GlobalUtil.java +++ b/meteoinfo-common/src/main/java/org/meteoinfo/common/util/GlobalUtil.java @@ -67,7 +67,7 @@ import java.util.zip.ZipInputStream; public static String getVersion(){ String version = GlobalUtil.class.getPackage().getImplementationVersion(); if (version == null || version.equals("")) { - version = "3.6.5"; + version = "3.6.6"; } return version; } diff --git a/meteoinfo-data/src/main/java/org/meteoinfo/data/meteodata/radar/CMARadarBaseDataInfo.java b/meteoinfo-data/src/main/java/org/meteoinfo/data/meteodata/radar/CMARadarBaseDataInfo.java index bc1d8426..14c4e213 100644 --- a/meteoinfo-data/src/main/java/org/meteoinfo/data/meteodata/radar/CMARadarBaseDataInfo.java +++ b/meteoinfo-data/src/main/java/org/meteoinfo/data/meteodata/radar/CMARadarBaseDataInfo.java @@ -601,7 +601,7 @@ public class CMARadarBaseDataInfo extends DataInfo implements IGridDataInfo { Section section = new Section(origin, size, stride); RadialRecord record = this.recordMap.get(varName); - Array dataArray = Array.factory(record.getDataType(), section.getShape()); + Array dataArray = Array.factory(DataType.FLOAT, section.getShape()); Range zRange = section.getRange(0); Range yRange = section.getRange(1); Range xRange = section.getRange(2); @@ -623,36 +623,36 @@ public class CMARadarBaseDataInfo extends DataInfo implements IGridDataInfo { } } } + } - Attribute aoAttr = variable.findAttribute("add_offset"); - Attribute sfAttr = variable.findAttribute("scale_factor"); - if (aoAttr != null || sfAttr != null) { - Number add_offset = 0.f; - Number scale_factor = 1.f; - if (aoAttr != null) { - switch (aoAttr.getDataType()) { - case DOUBLE: - add_offset = aoAttr.getValues().getDouble(0); - break; - case FLOAT: - case INT: - add_offset = aoAttr.getValues().getFloat(0); - break; - } + Attribute aoAttr = variable.findAttribute("add_offset"); + Attribute sfAttr = variable.findAttribute("scale_factor"); + if (aoAttr != null || sfAttr != null) { + Number add_offset = 0.f; + Number scale_factor = 1.f; + if (aoAttr != null) { + switch (aoAttr.getDataType()) { + case DOUBLE: + add_offset = aoAttr.getValues().getDouble(0); + break; + case FLOAT: + case INT: + add_offset = aoAttr.getValues().getFloat(0); + break; } - if (sfAttr != null) { - switch (sfAttr.getDataType()) { - case DOUBLE: - scale_factor = sfAttr.getValues().getDouble(0); - break; - case FLOAT: - case INT: - scale_factor = sfAttr.getValues().getFloat(0); - break; - } - } - dataArray = ArrayMath.div(ArrayMath.sub(dataArray, add_offset), scale_factor); } + if (sfAttr != null) { + switch (sfAttr.getDataType()) { + case DOUBLE: + scale_factor = sfAttr.getValues().getDouble(0); + break; + case FLOAT: + case INT: + scale_factor = sfAttr.getValues().getFloat(0); + break; + } + } + dataArray = ArrayMath.div(ArrayMath.sub(dataArray, add_offset), scale_factor); } return dataArray; diff --git a/meteoinfo-lab/milconfig.xml b/meteoinfo-lab/milconfig.xml index 063f604e..d53f7b24 100644 --- a/meteoinfo-lab/milconfig.xml +++ b/meteoinfo-lab/milconfig.xml @@ -8,27 +8,27 @@ - - + + - - + + - - + + @@ -36,5 +36,5 @@
- + diff --git a/meteoinfo-lab/pylib/mipylib/dataset/radardatafile.py b/meteoinfo-lab/pylib/mipylib/dataset/radardatafile.py index 5aae4ce1..7dee2641 100644 --- a/meteoinfo-lab/pylib/mipylib/dataset/radardatafile.py +++ b/meteoinfo-lab/pylib/mipylib/dataset/radardatafile.py @@ -26,9 +26,9 @@ class RadarDataFile(DimDataFile): :return: Scan elevation angles. """ if product is None: - return list(self.datainfo.getElevations()) + return np.array(self.datainfo.getElevations()) else: - return list(self.datainfo.getElevations(product)) + return np.array(self.datainfo.getElevations(product)) def get_vcs_data(self, product, start_point, end_point): """ diff --git a/meteoinfo-lab/pylib/mipylib/dataset/util/RadarUtil.py b/meteoinfo-lab/pylib/mipylib/dataset/util/RadarUtil.py index ed33f2c2..bf6c5e95 100644 --- a/meteoinfo-lab/pylib/mipylib/dataset/util/RadarUtil.py +++ b/meteoinfo-lab/pylib/mipylib/dataset/util/RadarUtil.py @@ -19,19 +19,43 @@ def antenna_to_cartesian(distance, azimuth, elevation, h=None): """ azimuth = np.deg2rad(azimuth) elevation = np.deg2rad(elevation) - nd = distance.shape[0] - na = azimuth.shape[0] - distance, azimuth = np.meshgrid(distance, azimuth) - if isinstance(elevation, np.NDArray): - elevation = elevation.reshape(na, 1) - elevation = elevation.repeat(nd, axis=1) - elevation = elevation._array - if h is None: - r = Transform.antennaToCartesian(distance._array, azimuth._array, elevation) - else: - r = Transform.antennaToCartesian(distance._array, azimuth._array, elevation, h) + if azimuth.ndim == 1: + nd = distance.shape[0] + na = azimuth.shape[0] + distance, azimuth = np.meshgrid(distance, azimuth) + if isinstance(elevation, np.NDArray): + elevation = elevation.reshape(na, 1) + elevation = elevation.repeat(nd, axis=1) + elevation = elevation._array + if h is None: + r = Transform.antennaToCartesian(distance._array, azimuth._array, elevation) + else: + r = Transform.antennaToCartesian(distance._array, azimuth._array, elevation, h) - return np.array(r[0]), np.array(r[1]), np.array(r[2]) + return np.array(r[0]), np.array(r[1]), np.array(r[2]) + else: + nd = distance.shape[0] + ns, na = azimuth.shape + x = np.empty((ns, na, nd)) + y = np.empty((ns, na, nd)) + z = np.empty((ns,na,nd)) + for i in range(ns): + dis, azi = np.meshgrid(distance, azimuth[i]) + if elevation.ndim == 1: + ele = elevation[i] + else: + ele = elevation[i].reshape(na, 1).copy() + ele = ele.repeat(nd, axis=1) + ele = ele._array + if h is None: + r = Transform.antennaToCartesian(dis._array, azi._array, ele) + else: + r = Transform.antennaToCartesian(dis._array, azi._array, ele, h) + x[i] = np.array(r[0]) + y[i] = np.array(r[1]) + z[i] = np.array(r[2]) + + return x, y, z def antenna_to_geographic(lon, lat, distance, azimuth, elevation, h=None): """ diff --git a/meteoinfo-lab/pylib/mipylib/numeric/core/_ndarray.py b/meteoinfo-lab/pylib/mipylib/numeric/core/_ndarray.py index 63e9671a..e75c20c7 100644 --- a/meteoinfo-lab/pylib/mipylib/numeric/core/_ndarray.py +++ b/meteoinfo-lab/pylib/mipylib/numeric/core/_ndarray.py @@ -80,7 +80,10 @@ class NDArray(object): return self.dtype.itemsize def __len__(self): - return self._shape[0] + if self.ndim == 0: + return 0 + else: + return self._shape[0] def __str__(self): return ArrayUtil.convertToString(self._array) @@ -296,10 +299,10 @@ class NDArray(object): step = 1 alllist = False elif isinstance(k, (list, tuple, NDArray)): - if isinstance(k, NDArray): - k = k.aslist() + if isinstance(k, (list, tuple)): + k = NDArray(k) onlyrange = False - ranges.append(k) + ranges.append(k._array) continue else: sidx = 0 if k.start is None else k.start @@ -517,6 +520,32 @@ class NDArray(object): else: raise StopIteration() + def item(self, *args): + """ + Copy an element of an array to a standard Python scalar and return it. + + :param args: none: in this case, the method only works for arrays with one element + (a.size == 1), which element is copied into a standard Python scalar object and returned. + int_type: this argument is interpreted as a flat index into the array, specifying which + element to copy and return. + tuple of int_types: functions as does a single int_type argument, except that the argument + is interpreted as a nd-index into the array. + + :return: A copy of the specified element of the array as a suitable Python scalar + """ + if self.ndim == 0: + return self._array.get() + else: + index = self._array.getIndex() + if len(args) == 1: + if isinstance(args[0], int): + index.setCurrentIndex(args[0]) + else: + index.set(args[0]) + elif len(args) > 1: + index.set(args) + return self._array.getObject(index) + def copy(self): """ Copy array values to a new array. diff --git a/meteoinfo-lab/pylib/mipylib/numeric/core/numeric$py.class b/meteoinfo-lab/pylib/mipylib/numeric/core/numeric$py.class index 5c4d87ea9e5136b4dad12a7646965230c129c980..87a34db853798ea049f6047180be7f71a9e849ff 100644 GIT binary patch literal 154424 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 Cq3cKh literal 154424 zcmeEv31D1Tb@qF+>BYQ|kc1@(gh?_G*_LF@Xt89+2FFWqh-G6N6C#W>(u}0BM>ERI z$d=6BQlJzlrG&D#EQPYQP#~mbDNCV1X`w(DN`FdeDJ{@aprsUA`hVX!_r7IjBs*>b zU1EaXo%il??z!ilbMCq4p8Lrk{q_eO$0>MEcAey0ZqRiO_ugD@%x_s*Z7tMmTW0Hx z@|HuZ`x?c?^7f7oM;999V(Cb$*eY+|*zxty>cN>4<=NJD*LmO?RrWYZ*Xe1NTh&Uf z>^iC5{Tq+@PTI+Aa8gc>>!fEFi>(FExxjTUZLgxTxYXm^$8|11qTXm7WCf4vz4=7( zRB=nSSexH+q}8a@<~yOb-Pykm$i8!-bKeb)?_A_M9^tFc7OSqa<=pBw{bpb8=Ul?R zT#9N+KvS!-SoWOz6Y5sE(W=+0P0x8CdanJv+;tq!xzcqmZtq5q^AOj`ELN6Vm8$1F z)O9v!xA!&bi>~v8E^tlWB~(nVJ$$}%wQ~(|aV^HGw!An~ZUE?qp-1(la--O)H$3M$ z*SXKs)XZ|F+N#v1raWgOy2w5Za40-yGrD*{hO!^s*i&DgsR9pMY$okh9#!rxR?D?g z5mgSk&LtT0fyHvGT(8vT>H|Pv(Q`(S>&8ZnBtHgJ zakHc~`w`c#ieR_#d98q;g~A5R+sSU@xWE7vS^^5L~Vyw zLrfnhCM%1kBU7$(;i1(Ss*50x#Y&6l^_*D@#G%y)t}#2ksQ@MO$UCve)Kzhv2gkcL zTdy_i)$+gz;XHy-QSHD!!F&I?_~p9BBcUjr|yl}qQ2O2b-x z=S9vhZg76Vc`-UsoUH@ym!Mz886;lHL>0X1G@`H%O-WCV0K){2Hc|q0={GfFwE9T&h;^?X3i6kwt!8 zQmp9hAfRFs4Vyy0$;z7M$GccVa~@p8ytqSh^9859=iDh^%r;rmZ?jHGy$>^~*j%ib zLLb14C^nnQe6-vLSx>84E;d_J`I6^+IP$xI-@mK%wnzsbW4)64xO8+D>4N8ck{#9L zr`X=9^3-CzMw$4B%ytS4m>B#FzAb<_>hqA)p7U9Z>`bFxEX}g%7TDA0DNIY1Indyr zprzR|#mJwblE|7~C{<3)d+r7Ry?}w8 zJ?XhVU#~6!CilMRa-~$RwJHG1y%=3a?<=$DvU>?XaaJv1nBB|d6Mvzx2k?iXJoiEJ zL#Kv&1q(IjDmADEp8H@lQ~{mMdG1w`B+lHd-PLC@_4Dv+$8z*LPuZ(@=9yeZNLbT1a?(c*FmH4LBz!ObAxLZY&`yy&?Fpl7kn z)`x+J#WKbW=}}a)SZ*$GmU!+MOA?pcSQ1^3lGn3(QY#s?=k8>Y`l+&TIQNmL7JLub zx&hgk(gAh%0Q~wg(B--NkX$MkPa@N!PbVSwK#qdrt{6sQE2?sLG< zmTL|0nCcYgHRjB7QRgXA-tz#-DKjNrfWn+-X#Isiza-62zQ}bRx>#8PUzphf&9U65 z%<7WD{Kze>_P8(hofkMizrnrTeFhrV<=QOu#~$}}K+@dQe6>DPtfI~< z)=`n&Uv=Mbfs=CI2uLa-O31}>&}cVs5(85;PSH1`MyL{6rSHB~6cP7r7(u)>YmA3r z5wu=Qzu~?e+Kc-R6q=d>kpnZXv)H+6i!RRAu5axx>jLpk_gzqe+;?Mi=BBC;GSK1N z{l5Di_fDeWx1e`)sd;z3RNn5pZ*t#z0Y>|Mu5+Rj>|oWn&Iqnmb(i)qdxF$sjb`ypt_m8jg#6@2$23gYi#3dFv7?#D1cjy9Gtm>)-%AMLrH1o`g+f#A)j zP&G6->QnP&Oxvrv52g7IO#Gqy=?x&n&j5|0MdXIuAX{%_OO<)(oHY`+RqyHfL4!U z34roUX1N@Qwl!N{T4lZ&tXGj||6H~O3}kyt<+pM)j&N*mcXg!R;Aoxd9mJD%~p%6VEx%TT0muyt{ae>%QN+paZorI1^|5R zp9M8G%gyZRO0}AuDQB1Xv((>OXw;YI7y6`IL@?NLxpBJEEK5s`a%-6?ur?VKo~t)z z@v>ECO~vd?v02szOuhgEv2NB%kbnddDnQW93SeTNjBw2ALYh6rlB-;6g5xklvBg{g zl#pFOFhrASu(?oQu9mV3V9Em$$Vd-Z|L|&`OZ%=jC`Ff z^kt(T!ZL-Cfzgfvd>N@m>N|i%EYVcULSu-aE&|QANV*L&f_A(wJ2})hd^}RK0dO)u zFbEh229F1zvwRl$`C%9zOd-$x92Bc5s8ph1k^?7uH{R;If9(DV`Qo2~NpRA5?iXBV zypzdAdGlHL>=#+zUkEQ*m%TanbH7Bn@RzQ0Wc>!$sb=j@zWYx1uL#OlVEbs*js0Mk z7&zR&>1yFSx(tfxasL*$AT#pZzoVAHm!A9e4er+{+mo>Nc0;V1Gl~Ssv;-rWm$(Gl#?%xu)XFOW$4^|Q zneLBFcq5q}=)0d4X_mNLdM(7B8+M)73zhF)D9@hER_3ym+7dahh!yg0D|#qI&{<^; zQpE7$B3X{+r%;F#kLHcACyEcOBaoRqn{AR8t<|np;w2vJC$3cZu@1TqMiKvmi77YY zI?vZ07*Uyx*qdVFE($cu6Yjt=MQB)GmS5HYJW?^TM}Ebc@e)`2iL8QpErw1l8o5z7 z?Fj^jMaE>yr^>bJDp)WUZKdp~Vs%-hRcoOFo}Hbq;4^T7F~uh-Cx4DdV3|uylNSI@^mTMDArzLliev80r{kduVvJ zx?G}|fQ&}jP1zX`MR_Iiw!XA!V+2o+qvT(Pjtdb5I;r&&c4$9nw7i6-muDBU#b$PJ z0PLSlsYEmKxjqLPC3R80(&z_10ZF9Q?{AR|XUZ+WMiIOWSv@_Cby`_)hyFl3vrfE+ zouh2zS9G+c4;*flwtd<95>@*mwU{I9ALXw__CWTikYfxLBDDdAjFZAeiNKsj`$0!p zkz^pigPO}KEI@q-0Gi!fE3MOLsg4GT4;=`KI@@@tx?niUOU#mO))!6Rv!}U;{W4Y4*NB#r+_ifw-yNMCTL`v z+B#K^bSjQjkTsjYu$?YrYy~aNf$TmE70hp0)I~NUb&?<|s#36Z08IiZfd;r*3aV(G zu4jv-6PPXlTI=frA)uzo%I5s>Y(FcVtbo9E1kJbvy&_7o&B__Dnr1dXK=n05Q=kbA z1Qfrx49yt|y(oP$A7h;lv}Q?=eE?``%*2)Hp72;{Nix~-kjnZnCUc}{_7yxQfK%$A zJyt&HJXPjcY|LZv9MjO0$|KA*qWe)O6PRwCM!O=VtxnfnU!rBUcc?=rgC0aZE}}fC z5~tbww)Pb|iVXE-N37nIcsS)>`8Ge%t1=GzL>mNKhs6|}*z7vb?opZc=VHBdO&v|t|v zYiDU)$8e$!pr*nA>M9Hj2a|9dic~o1@?K)QpBPgL#t!KQYf{dQxv4L%O~NWun^{-OS7(=DvxinA^^rT;da{$MjHn{B>9|?>lJ7#p zRbd9ojTM>Y3egCAXj`CBRbs3~LI+n(DI&n*RC>O;K`>j}q`raGXbA?`Cf43%NV>l4 zat&+iX4o6dGi>m24hGaHCMJj!npt2Zpu(dHm953t)d>4h}~tc-s!*gLu~I%QP_@VUZ({Mm}XDA1;1tW{xOKw>+DzSiP}u?7N0 zh&`waxS%*9J7@`PM7`$6seG)hu$)CL*+aEtub+5?GVL2PkIcb~3;(d}gaLXV6@A(! z_H?U9zJlXFI&m|M&xr%%_-02iH}0laWQH201%pO+AG=yL+@j8vD#~QJ5oryP;7mki z5i37pvyC|kkA+bID?M%T8Jz@H)6?9;sA5G*jf<4!s7L% zb<`wT>p-!&A=a9i(*g`vDY|HDW5==CN(M-N(OI7|Mna7(TNv28))lb!O_uq{;w-`n zsX@h=I&e-dZI(K)p3+_`#)3}Ch&3R_q2FK}9XY*F;exx3{Rd3B7joK29irJR^3Wns zjdoPou`;qlQH*iRiT~AHnq(G?d#v9_G2%jmhHPXWaC~(28Ll?%5||_c_Xk&9#^R?4Vziob#k8!3*KYZX{L7GvsoesBN^xzuTf>;Hy)F$}9s zz6^J;|NI~j1lf`w85kZO8ZL~FY#kdJ9)ye;9vvRYkBp6vjupno^MwMGZDdC7cFD6w zQ++}OJ0RdX8pTclH1~nQAyhszUdWG+=7+~A*G311hQ~(-het-Xjt&D9=;dQUgI?m0 zEHqDhiNk*4ptAO(SaJ&Q@e;?t+{N)FmmhQ!4HVzqLH3=l?z26m?GUXsy==`LXuGg^P690NLe6KwSevyg+3xV3FG4q-en zKS1LQS2aT$p=hG`^mGBHneHSC`$xZmXO(qhP$`w0*p@1Zg+y{#W1sFO(THMglGg#I z>-s|F>pH>Lb<*|gO5$pIoiBl?^2MW|&o20}Z;$uD~0M+#-NVOeO*yR~n-iaRn=LtdtG+v^tkEw(fjVHzLv6 zLD*X0a3{MGYCaB3&*a3qxe`+lrl%*cQ$9W2mpxgA9h|v3tbHcnSJ`)3D700bXL>Pn2}z;52lhurxDrL$3RZ*vN&V<*ts||E=*_Yn-4l zT4@g^+gohRRN&^6l=^P)FyHihO z&0S=(cqn!LY18tw@cN<|n*-s0-O8^enbCTOlE`;~l6cBbEGzB7HMxh5^|}10>%Jq# zA0nI`!lxZ`x+I9|hD=Y1iA70Vr^%0Ly%ILgRgrq%Lm2O)i(v$&js>_?20H8qKhf3A zITNjycoOWR6x>s=?l-)|Q~bmk9oeU02g#m&$mO@X?#rU1OC`g8HHt+)cZkGw-MpYd zPelW)i7c>KgfWZfLFk{+Imi)*%Fy!EsGn{^tU+~~tyh;9YfacmYTW3^u4HRmeTuh% zR@Oc`flhUlD$(7%+>Gv+PEX5%bRE4a>bV&LuNs-)sRE~r7=G;b5XQ1k7P_?fsmnlM zYBG)}UgD?x#4~i*;OC#g5t&?m%uT!?I%36ap?}X>BVz|e8WK$#_N-=EJWlS)Kw)S& z&|L<_ZUbRbg@bE`lp`7`M)!?Sr!~GF*s7^>*e#CDSc|7H)~l#?KMycimD_e`TXrzp z%eqZ98=*kMHA8CS>ln&`XV|BkFrJ($8)L6vka9aLhQ-D*yz}UHt(0tr2mDUA$4ybd zOA|Uyumm~(uaoJs{lv4BOn(+~gZRtk$KAwE!Sdb}D6X^c%L&j$(-K|A;EEo9FY`u` z$+3~*hv+kp6KD-}H|h`m$=6faZA$yH4hcq;ly+*Gmeh}f_lzEya;I+C7{?&!KN80gW2JWEWZ78RxB5>ITLis zaOwfcRs<1YV1iSd=ni%DC7z;F01a$>VXU?W5Wc})P#uO|-4{ZQ z+5@w>G?2Yv)iOV9Re>S`;MfokQNkY+pjbaNG4fL0s!afsfO+C>Z&HOKEwCK4ol;Sp zqu$s+{equ(p$^n9f&uWLTCR|H-3h5{cR1DU+Hz*q^oEvfv0MmxLi97*Lerot$Q*SO z#pE<23J2Pz-42_cF40~>45&c`t5=9u9=ZVOnZp_!-sx!^lI$&EN(|7u8}{zIm13j? z*kjBP#)&5!{`FCP6liS2^Gp21?TY7@0?+V1FXalM(F{M~f+%V&D3Uw95$!zEKf8*w zqY)#{&>{vK!cviki0LsQ$_yJs3uf;tD;|$UySWt-ApJnaREF83K0%W(Yv-fB$5y4o z`w|v20|VH5C`A-SyQg5-pB=h2OmFb}(9<>0r39yx9&jA8LSOtjYmnQ<8v;V#y$)xZxx$d^ zd|#)9^_voM#W(1|z_o5h8wS(QV@~mv`wAI_G-nTvssFx#ppB$<*)fK^Z9z@veBhd}0CFX7KkZTA7!4 zt)F;}BINZTV4h{q6>y;81p>AT7J-jn2&*AYVPe>$(!JRK8dkOmr;juc?YV{Xjeg<{ z3g??>0p$twTmk16Vx}@>wD@$-fhjGs`ffnJ)la-df&6sxd*ZFdtlC)HL}@gjW(dB+gt(pMy~9tu zT|4!+qlsvzahX zyjFKM2&B-3%}acMPVe(&Kk-2wnh*Jj_v_Gn1XE6&o^pk8*L4KqeU%0eAjp1X@FA_pIZT4`zww`5Y*^nZ)(Tl|t8yh_L}{LvRRT{Xq+AR{Z8S zMLIx+7gVO-3uXYk1ddnt*mHS_kNb&_DxPr2`ob`-Lv9G3_1D;qhl9420ITo#yM3u}}WZVOLpKQn3%2fPs%NiiHigTaR zf50h?5F~!$(@Hm=@e`j?e0&zPVgjt>h7e`IoP?{_us?{CJsJ*!3kZ`*>AQOuEj8>C zio<*`#iM1kC&HYi7ae6{?Rbel2A6Hs_m~hci9hudpI5-Y0KiTCxgi{)hy!kFA>dtr zXdj#PfzZyL74TR)UIHg=0r+7PPbBdrKk-Ec{L4_ipylO;ut~Wjbsue1V5`IlEU2lo z)Bs_Mi%O3u{?-JYY9pOly7hN0*g3h_9LYS!%kbMMTms;_T&z;-U8-y;41``F;9XLT zB+hdNXaYNiSn>732?Pv{e}+f!XOyY&!GYr&vzxL@6*#Zu$2y&$j5Evdc>EvStOf_R z4sOj4j&2>x=f_4zhUpnKI50LkI#_^f*3i~5cxsJ}Lf6Nxf`aEI{@PD`MF--mlxCIM zLT(5u-)jWoM`0p1X6n^7hC%X}N!ux~cXbYd7FZAc2musrah;Ly5`X6>zNVmm9W;cv zNx7jB*L{FA5~m@2`|(ndHnsurfosuH<#?xakx0hTfqY@8Ff=qy z-?!1NqoaHK^IQ9}{n3&B2S4#mMc21P7Bn%^P)C1NK#7cWcVy|%-G%9<1#){|!*%{AF$k zy5f#5P~#iUg>`^Urg4`+4-2h_f79YR@Jqw%Q7NjhRNB8(=@T+tgG%8DIyyYM6)vH} zTZcx53ZPJ7MWaJQpxtr2%8!o>ZQaYapxbWQ1E%%we&UCU)gOVB0R%`HXRqEU@J2{^ z4V>O(d}@L9a2erSXGg1-bp50w9Y`k80fxQH4a0CcDGkM`xkA;0x_%c9wth#Te)rE} z{flGgG!q%?H(Xb6%Bj+r4GtKDR+F|B0_9<}`EHaV>x59u%2pPBLKhX_NQn}Ljiyd> z037G%K`hG9wiI~0Sark*p#^2-Tpqe^sVv{upYMb83Z<)&r1^mn2*2@Bh(Sc@lr0G7xQ1n-#8$z z-7ygN@sk^LAP|Y8hw&|Q!-1W&JN0)LN&$>(Dj{bd2(h0b(nS?35px<`4QH?)!Xy_^ zB1{7$T>5qh$%bv8%lNG=;LdLXVId4Y8?%eAJ9cPa0tNNwJJ;5tP!0{`hw~%jg{{GK zx!6x$q@#pzC_Pw$VX{C+f9*PxWet8Cpeo8xXmu#oU>i0kB4K}-o?gxF;M?96y10Xf z(C1(U@7Q|pYS(>$PQ_C#u4*Wu&pZpGI@)%Y5cyA6`|bKYh9SDHSZhoVV#UfG4Zx;; zr^X;J1``;vvDqZF1jZoe7$XGK!S=F|2G<=tc3y1sYm6QA{;`pv@i7}cz)RlWPhO^D z_dsQJs3JEEXTlfW_0iK35m9iyBPSKDIaAMn)U@6o(}+o9k;U_QG zv3f9!RwUL!ZWum=H)&H*+a_cdrw8>!%3{n7SXgifBs;rM=MqPE58w?{!UhMVJOaxi z?nrgj+D(kO>NHqwT8*j-XEj^JxhkTNY+5O7%1V3>?CS(utrGqRCIVxlTIa zI=Vba|6w{0 z4~-8Nu$|3C9j3iDD=Ve zk`Kcd>?@w|lGpjktCT1;kcdQ0&JB;ciS7UU$TAp(b*WNv-Tl<4=rmyf5i%wKhE#L6 zQ(;2}@+U`!eSUJY(iMWgcvv;nTe)FGbkXxoH%gE$&fJf@_QOyA@GGn3`KF{^MRr%r z!Z5f1zl{cB5{r3HdA|4wNmb<17(=zmJx1wrZT@=Uv5@cWtJHT^iWu7}kMcn;w0>SlFwIoP4KDC=!*l->4~{D9K>)jLpJ z)1vjRuFb{im$itf(*c2M4ZZ3CGlLxyI)$(w!8DRiiK{5Q3#8m(iPhHWopi=_!PI^f z)r3RJ(Pv$;Zgkthn*jq;|P%^HG4@I^;1*DQpryaiSa)<>?a46Bw-Ch zbibwCFuXX`j2P@?Nb`1c1*bfP9;;PLLLz+#p=^am_cWx{b5eRD+Tfa82I^<9XA-C1 zVCTmG2N8W&L|qUDqQ9_-vQq!%Bi3iKBOm~(xf!A${wUTDgRnPm9Ud;=0C0YMXnc4p z#1>y~9T^@T9URB99OrUJM?kE2J2W^vhNb#YVVs9}$48JisFGqIk#`D1`QhQMgF|EE zLxV#QYb?i;zWJf?kvv`x6$ViXM}$%L_|Vwc=x_l5Y=y})R?`@28XPHX9UC1VA0E&1 z`%qy3jgJhE3~n8Qv3wZSK&%b`&he4a5j=(=cyY)WqLd}@e;B6nc^h5TOOE?V4e68I z4syYP^4u_X7~dxCP81RC7Q}(K#RmMa7vp0T8DY{ltTOT3EJxO(grsI4L-|qCn=^s5 z!?lw%z6qs!b%Zut6Fpnh{54WW?$Mk-En?%te6lFIHjitXM}^oroEiJpjp9VmiK zkODgC%gh6lD*1ASVZv4hTQ`g$k01ZEY2Glm{wB6Z~*vhG z+tpO9U?Yl5a}{E0yD<4c9+gkI4yz6pg}N& zVlCAf?@sGxDL%VpT7_T?7ZuLrs{279q$_gJMYSs_D>sOUI|%P;cMg`2 zKD;R;d+;zwxdgX*x?W-ku-D1JBk*Gk2rR0ex`H7u`8Yp$Oh*F|3o>XhH-atKZleKM z?j4Q0c{G62*l0Y#PfqG+JTbHLZ@&NT=lu1;w=+BUuD;+agU`c#F}NW^wq9~0ShoMP zjG$4!K|Cf-n;9exaw`F0Y4cELvKaS9a3c^fmo88j;EjWb)3B}}I8Su$ga`Po3yE6w zloE_($4r`;_&f{dm*$;`)r$-Ls?09uy^xc0q)~>0JdX?oppZrBVU$>5T%^}gIB<$R zTVd(;6yyh+H`g>g&Tt$|MsigyG9Vmfo%%9h4nh5hD_Lie#q>qL3i9j~3gB=}9OnZ| z5F}FODw? zAj|qHTH36x?716spBt5Q*|r2G{8B6Nk_cFUOPY4em1RlXRd;m#sBr6CRnjd0o4Jz& zA@!3L1aeEB0FRoGGb3KI>L)cgLJ}wJ?*qYf+-oygzZ@gFBjf$VyXHzKdC_hl1`et3MX9-xJ~u~9mUHp14}xOhL4e*rk-FU(1P6rZj7 zp$dn|BkV^DniWuZib;5O3<$?xRx zXw&nOIC!6;3%Zv)<0thne)7qXwC29R+z3noe=oJ4->^rAd@W&m*A-Br3!xc#_77+L z%BL#23d2C$)$#9A%Q+Ck=`!uMU7TF)@fQjv%>(h-tj_{KjJ^yeVb>m01R{#gKz1(= z`^h`J5{z+7@rmmSmNZAhPr3%`?>#cR!zJNSOsBQk`}s}pQmH;iE~)_m_LQse);AvNv_0&@ZKd#~ z*(L%6UiTH;(8wdP^azu8SQ$%*a$OV$6M6y{P_Sx5Sd=R`CNTAuz?XScLdqFa2AVJ{ z6>LO@$8M!8g$)BMoCDiGq71SXVUQ{Ww5*qWwV!;IlE<%rJaAiMZWK1JKaY_I-ePYG zJJ~;Jf(QVKGWl~QgP`y^@b>>5gMZA9TYSi0=OcAV7@%r&6 zKJHy+@cB?cmul9d1(^eD3C;s@v29##{+geBqayarkS69v+}!Apn|PPhwKr-wHlM|g zDMx97=`MML3CPuKRJ9LI({oiC#8MR{A#&C>X62Bkin4Tv0?8K1(`|b?e`d-wl!|O) zAXT8Z$kn=RpOT^B*uE*iZ;BOK`0VmIsLdD-gqbNPoRbr3C>22{i;`=@+JW^LlwAa# z(2G=AePwY8_ubOjhhY#16mFjw2o9ykP9Pe?YQArc6L7M8Xl57cRaMZUD2KKN zmm-U8fxzrhOV|KHE~h-DAJhXyr;70V(6~t~MrbM6CT=sOXAkSbAaXEty=`T-=_TLh zC*P_B{To;U@*?cq=&+mkeF1Cle=BMhkOCq+8#S9dXu{2$b0BJIL1+TQ(?;3heBf}L zFHuVioImSOHc8{ZLeya|*bug=a6_iik#P{VNwqdgX8#9>{5SpNJCw-ZMXrqM~B})frytYMSX~CI|HBNLCjgMqthYT7IEY1cDb`iS9BDUd;;_D?pz1XL{FtBA zP!h?Hle(z)!Uo=jx_~2S3)Ys~)~#^7RE@gZsLQnaW2CNFKe6h&XQ=D<{p2T=x)96) z)CIh6MeL4F>N4Q8QV?J-#d?ddF8s(lwZYvHDenhA&?pa;a7@y5qEDy1$lkE@Q;22@^ zCL&y17#)S&Qlm+v4A8Hc;n)U$iOJe=p3#}C>7B+%96wvN)~~B$Z!qG{qKco*8Iy5@ z3KI+_k!XlWyo>|c!p2Swf%U>WU`e=gt0YTn10iSBl`}*st2YSaHWBdz%QxS4alBU> zjWLqY{sXT}z2@4?eY7M4!iLn)PAEbNhi)_xn+)zgbQG*9R9^D0aDP%0fkCh-`qyx% zn3}?#ZlzUToSJf-t(_Y>uuPqNFku-XIv2bKm`1&T=h8AvWR#bYqw!Lp%dWebUL9nxD{}w0 z2y6|P}y ztKzW}8VC(4Y0)$AMb{wKJ>VxXsR#-z27+X~0Rq!hM0uiSXg%12V7B%;u(=D zwCeM4fy-^hBKDioAlIboeS-5e_Pf|*#0dk_AZ$q?Twei`+`?rh;48I+{b4Y`KKHcX^)FUW!K2mSbp(bvPgMGs10F5ullKic^eN zcAESOVxhlue`AgP4Bmw?_!G5MVgJ_;D;zz*B+EoDe3WBPc88!Ez ze+`I(${7rHb6Jk{A{)PA#1NK@N29>jqNTaNWgUua zuU@UG-#6Q+wO;by{iKG3Nirl1wwPPFtytzBkq&gz6J_J#bbYysejstu&zADk7dEb83!z zK`aBZQ`sL;Bc`YOc^9?a0b(|*ix8P-*D#{@CLEFesZ2E-DdqYp4PTQ=!VnCNkWJ*a z!sks5!HRFlWxfZY*nsYKfqO5GNgif_P3CWH6IN&naT0mJq3UTIxX^n@^h2_YBH3jy zNkKaOf#z1Mf-_B`#`21u{63ytt(2>{^EVh5D`HX^E+QNA9BVJ-`6-Q)liGmMH6Z1- zj=MdVMrKnmVPN<$ZW&~O$_YxMabZ^D^aZX}Gs{IQj4T;M^v&k-jF3A;iE=vu+?oq` z#z*2%3jpv>SY=!F8g8Hu(Iepwnh2&TyNIenOa4RFFI+WUYX<4>m#+cBnpm;6U&$#s zC`yhJ|Iy1iwO{VZ<4fuOwz0$0CAhvXkp|f z?V4GryMq{TTQMU=fg(hbYzrVDl$HmwLgg$N9%;mka9=F@^t5zPySzi#Zf}UGjeQ$& zj#_|;zO{NP+l#?NPtWe)L=?ZQ!IL3mI;x6g zhR9NSg%+_?#ZAL{MtB{Y8F7LU)(14k1*WvrL>IPo zC_b|l#5IYAOW;UMo~X+g(fW8;w_&x14?KZkOKGtLq%kj-ooI<0WdSN#a_lF3Gsk#GkkP)eRQr& z+I+{`k<+CgJeG|hsYH(C=8VJqh5Cs|3#!SXD~s5shqp80I>YA}3i)X|J)3!_SFe;c z*aq}Bsm5G?q8cj=k=*7FmhvV1WC$H$C5*T;xeX(}Z77Jn<)skB>;godfbE@YwA4ke zbKm6}E-pWL1hvsR19#hXEF$|iu5--APu(wd34C@_mtui8g;>`uF}l#oa$=o2*S4~( z{bfB*+0^}04}f7N^*}%6%Yrj?InJ_Hnm8Dh8^f{bFDYU1Jf^{%+yWpAA~=G8l7gE} z%*uwu7Mu~1NpUVpVTb)q+KsNNr7EaY`yecBWOttYjV-H$|Is7N9#WDm9$gp(=YM3D zpd?u|`mjBsX0_~g6cW}G-3Z+QX<48E)pc#yHmaEn0~aTzkWYt=0a0v4>JmH#Z32TJ z^(ee?4akgy6%ks4?M%3(#`*+}80SputOB<)^Mx8psL_RBCg% zF+|n)hjnPcMvkWn6I|GZg4ptGwMVC-YAmSfa)!`wqHY5&cu)hTSm4)fvM)QwwRX6% z$TbvDBZOhe28X)?yhJ`&lw3>YxM?B_VBSB>PhF#UxsI3kHKlXq+!)+NFJ1>Vnhm#7 z;=(;T&0DMps_+|J4l`v!j;)K$U@?kTi@i-kJNrlgz+Io8+NiigSRmj|3+Kj$T<3FAqt#xc)NWPkX+!Ad zMlsVczglw9b-c;8Ex?k7dxV@)A&8lX^X2BUYA`I3YqpApI0agh4Nz?%S-bThcX^^eM^qoYAj<_5!l)$4jzT> zWZLa=Lk_UNKHnpAHgmZn;|(CB@X(rSDuf|={Ru8Tv4ViG)DcF&#Nr6TbO>r97YlXe zh~4J$K5#;V5pXLn^(a5JS8;Wdk~AndHwJ6m-$dpzm|EzQE%FyOfPSGu2sYU`qy9-# z872j4=;Bg*Zdg;Ysn47s;zWI-L03$3hUkM^=7dI|#Tnn}2t-hamFAT~IxT%<37ke< zY?H8k*RZIFdUwc+Ha~uQ-^uVD9)r75&tx>y7x69^GKZ$-~dbvyNnka~M8Bc!k`Y5R= zTAmbTrjwBmQ}qV6lO;-uMH#iB;FeEHxxiKs%`8+I?9C$ZLd1|Ronl)SwK0GuOdJG* z{%~(xZ1P>;(g_fNL`qd-chC+xTAs%Sufl*+YmJKRLPH8Ehr!mpWppGW&T46%Rm*6s z!)neQvqo_du)NeHrXx03OMdFOoLEgg5sLj(h4JuG)B2|9r*2i^n1zm}WHAokqCo{t zUSvyk^o4q(Sj5oDFb;Wa`S0uu~_v2I(tfF?o!8)A6FsrDJnhv%9_5+Y``Tzr|`xg(36 z9IKR^^iwAkor@847J$xzo9H=bbkaZhCy7qVH5K&1zytN*R?zt%<^yb#y9zlBWR;Ux zeXWXP9i>&hHRqZf7x1;fYzvOCcTTr+>nW<^Um_Er##ua77k;QqR(qlZ zZ3jQc6e$FSX>S>PjXJs9&dWmT&fCZXBLheEnM4^f0sDQzn(p2o;kO$V(7HAB*DXR3d zroazpwqf|#ZAbI~VZ|Z*1EJ)>ZSl*nam959wUvj1tYGS>i2M>Ltk5S#(=LVsqjXA; z(Xr-!%!h^n9tz#hl)EOtU z!AYf_r-+4mqjHA(aY7Tu@NCFJO5Qb+fJ~QL^&ss6Rf{eY zpbV+ajF!#_C?6qdan8t+KvZA7#}BnA5)|L6{{62f3p?&l_ft>PAw|rIObP4IajdrA zBDgqEgs!n-wKb|6n3|oq5z0C^oP_>j&2` zOEP*Isuj*$CqhRNGCu>UI;(o^durHpHOe)%5hu+Ff(}~vXAtOe(FU!32vw2O&ORQ zhq3L$(xJ#KP`Syqu~8@67GVKImLm4AWfo>mD?+(s49o(koJ6B7Ne=O;mX|8;#9G8W z@g=czw?n=3QZL2+6Kp!enz#Z$#CRcs}0Il2IigPxDuyKGSHV_3iK-S($~ z>bCo-m#1FAjj~r_MZ2qI!T@QAn$)XZ=gN9xe#??vBfbR?m$w{R4GQ<95YZ!zDLsp2 z%0t%KR@->1pL%WTbsJKzN#TO*OS^#IlX`=n`XwF3UxQi9=rXx+tgF8)<9H)t7DAed z@ynn$+-Vi{AA}MHWM!zLb9K?&CAtOXI~a#mqGH4??QzVpHYG>bfyG$kw{;+p>p&`aSEdj=GONONB54(P?$T)$c3Sb3>C{nR@ZU%w5`Aa_K2srP{^ z^UMbDmUsPw0{l_@4!Ne_$TDSX+X0UbRMp2Z9)dOR(tM&OULoSZ?N)RSQmokT@r}mL zX7-vnL>5}TMw*2|3U*Mu?+sFdqb58#B)cpjHf~2ujnieU>qNCM+gxQ_H%JFvITfI_ z&1F~X%iu_uE`bCvD2myUC`bC$Q&Ed)AOxBl30YmwGK z4byb0LfPrSD;BO4YI5P%=}Lu;PSevTPVlM9%E^-eA9%99QuR5Dd~PJc`G|DSe-n`F z6DQ&8VvdYXZe#c1jAnoH=jQx2^>UFCCy?88JmOHqPt^7*6?}x>pMcyuQP~)_WwV^X zu0SNqiMA{@+sTu$Y$v;9V^&d4D)8w;wVSgiPZ}kKZ%AV7@8pRS$HnarU!~_~vA)Hu zZCP|ee9R6IQ%I?+5S!*SZ`PL^JncoYRf%O9ZLj1+M^T&6@Brh$fKfAkJz5)}8GCP=p~j-Kp^WDpN{4Zj0GnwV2q zuP9{E5M?T|f}NazoFYt*6i(+XZJqOAn{@{b0SJ&gLG*MW7`Ae(Q^fkNEw)KwaeXvC zQfN*Gfky~c0SLf?B4Ch=d-NLhC4@S|LQCZ|Cye;P4$xu2F24Y;Zpv3rV^b!qXj#s! zp-Id<7^BNOt`in}-Sl=jsigPd@IzBZV5TggkId>Tj5^I6z{itJ>AviBryIqk>+qbd zR+g@NN{FGL=_4jQAEOPOCe`=X=lW;r%Qd(~TS_t-3XMD=@odVPR>ulC7rDCf?+}h z-nCtMsnW9lpr5!5Hv%+p4O=WWPfA_(EF6U$N=0N^PKoH8GOQwAJH|oQ85GjQ zyLN)JCmbGmr-;5mv%ySfsZ4$4WU6)Zdm! zj%4bs;wG{ZbZKm+VN(l#11MGX!e5oJ>w7#GQT-(RYKO$N7S|);^6fG0D7}3xmq8|V zA|4LE1!`ZQ^l5`ay}hQ=QFCRCU8q^tTQYvc>!q}z4kKmytcI&xinMJgFBE_TiZF`{ zGIWJr(@S|Dpg>5mI~-`&bV^#M3LbNh;-MMNL||TQcvJ}tivh)#v$v(Z2%FBw0UO3oq4Ox=B0kePklfa9Up?R#GWp|Y6BjGpOZcr8&Krrve+T% z)g()g$cMmQCl0)E90jrtiOrNb7VmSTE%akyI;s4ztj6 z9t=bGFM!b43bM0Jy|u1Su1t6XF0g}fTIw?F_z{+; zmJ5dMC}R?+p!7-ATE7a9X7-kR-z{w6mWgfRuWPV{tK)c`UI3T?_|lb{-t8bu5wom> zb53OkR+zmjm5n%PC$&?@)CM5NP|*aaU}C5b%}js;M9l@t(!JF0y3WHW(`3~Q7pI2V zUjnx^*w#V1+Dm;5mQrY3wN@1|px3og!MWq(sZY=p_DMhW5hbWk!7kBUVi;YJ6Ltc1 zs_q64qXs7*u&Qg!L1&1P$V%U8-x(vLbm0xvr&L)Meh1SJSRIabMu$#D3{aZgE>ksU zP;C>Ate}3V6A@>Yg7IcCBd@j7LKVI0!_=Z5W5vzE(ssuQ-IifTQDJKGYo$o*16DI7+%n{!%_8hz{VCetD@+`>8)vEdCLuhm(H1tO7>pxI-2IHJDoq(&`52@HhJY5w$1GB$rM$MPyaif&YldO%QCwVq6qWpSvFfEhpLxVTIr7hS z9@uGrJwlD3C-rBp^O$vPuIFVEll{;?-;nx3>Wc^PxA=@>8EvdiZP99bE4@)vALgum|@aLK8PM>ctYT z2c?9Q(dBH3n0*!D(YezZ^oYD6C>yjC8!BNd?Ph#klbOXDR6#k?A{9kjHO!EOBS%rG z*py`ZiCzehjw%nWwO7FrX28j%9ADbgs=d_T!ju-k>ZSh9bsoB#QXZlC#L1AHqk;c#idecM}QbB`CN%$1;3s#y9sE0(l2L6?o29C!80G3p~ zg=q+@>tQeTZ9nyoN&tv2Lu)wtmTp|A& z;qDcb0ej0)H~U~7mx!u@b9QSdRsv=zBajk@!-WCp-$Q0qa?ml+G-<7u zval2{I*XWyN!84NwM|0-o7e_%6He=J@h8kVm`@yMI}>@f=$z)?`pa^2%9bZ%n!UYP zob%}GMpfF)n$ymW-W54WjDy>eZG>LtkDW^f7NaHlu{^=qUE%IB3_QNecC-zUEeMD5 z2QH}(t?;9oM-mh<76fy(!r;_tFXM9qM%T(kX1IMkbV(&bZD^)B4r;y+l6a zO~X0{b#W$Cn<**G?!jQX;*J?>1U+^JrTzTA@Jt08lpW{27DGaYfy7P zuF9J|Nw+^3KzJIO-ekhs)JHPzPb}4o4O*HIBR~0rvO#JY;%QB@Shmn%QIXPC?sTeZ zGV#fI&>_Gd6F?_J;iIP|W$xn$hw3%jJ`HyUu2`3)U2QxN!fkruVN*^j(w4pS1N`*; z70nL=x{jbwqNFU9&%ierid$p3 zTa5WmbuS{hDGDJgwAC1XI!}w*h(vunP9cY8?RGSFskw-x0*uX<)AY(EH=yOYOodx^ zUQ0$NG{aSr26RaaZDOs;ZM}*H3_?j-#&ujcK_5TqVpsQ}f)NgJSiNrP=>CRmS9BXo zm>i(b1HA?};A~LJxs8Rev=|@p#pUpIqTWki>8G#IL4F8Ud<|?b12I$Fk-=EQIJZ|? zJb*1W;0wD(a!;6D#Ydpgesqq54qwDMB71;d#-SCcH)f+WKG_EC2s~D*pAHdo1ZF%d z^}zlJl4gk!!z>1|EH(&p8XY5c1fCS6#cFY;Tm^RYm*%uJnyR8Eoat#fDQ?}|rN3+X zbi|Pq*Z$I3KmAa}^EGg_AfAEWA-88z>O73!hKmGL*u_af^6s@{Dw|cT3D{hv^Radi z*tMDrs-#rw2Vsa~Db)#8wU|{noMP_m3ZQTXS%L`=R16|BQ)_81RB(r3pmW7Mu!2%Y z(Q+sVWGfHR&!O_jjV@vD0lC!2c_Zib)bJI?6hRkwX&!jZbf5=@-VC8s=Lx;Y!cfx*vj=9v2RTL7+lJH;~WT&h{~5493Np&71;Zs9#pUw4aYq_+LkQ_0Fn6dPshp5H65#No0?tM zUIpWvab$Ukw;WM)3+vSggMnoxqL^bJ6RU<|tz2JjR*fggIjPzvpiO=-rmeC)YN`c& zEAzW|a;z^qE=o6)P;T_7dM4%AjBLXaYX#_602;8-Pda8sd$#PEBOK)_Y2X`9p z_f%vZfJl5j>CGF`eLQ%ShQ&6I$Q5dE7r$;bsQ09|z^XSl)r4|XlA}pYxKDR6y!+{V zx^RJ$N)Nft{a_iqu?)usT;SdiIf~U-@5WBsyq_LPkK&k9daIuvQ2k*XE1~5jXjElC zy&aoj>Ap0AQ=}Q7y6L5NA~{uoTaBN7q%Nm+VRvl`7rD+)P5J5Fi3EIR(|cscP0pHl z>3x1Wr&T}7bsp5VCgg_D3c8Mn#orKmpRh4fA?2VsQ`$%#V|tJm#)%9dH6-FMWGPN^c^=u@I4O|znDh<7=F z0_8JoJE*QW53{(9o{V*@L`6o_#8#u5l!cWZYB&6i>RE248_`ISqJC3Ynl*8yE+qfz zk~w(Dk5Xxy3S!sH+R?RSV+b)8>%b819JSHD+i@Fajf_v9y0$7h2D8`0(ZG&mN&R`Q zr&H$Qv>?PwKiYM6?E=>1m;oHoo&sMC4)&9tLPd$*8|a4dF5{|I_!Zv;1A(kwn(-3w z8S4-)eb9AwM5;WW>K@~#Z&F%4(rLdCD)Q2g?WAHs6{vXBO}$V0H(~o8Qn4Kdl4{g1 z7I*@!hVg>r(!;8Yp3cgfbz5$&H{D9@fGuo5;! ziMp!_G-Onuvn)PHboVk8I7yx-LunIwz$KT(U3eM{C9>L;)k?TQL{CU@9JcIU+;Q6J zq;(p6`@a(hJ4`>;sO??meZYR?7qxiwnvt=D8Np;?0(k@+4)))9T@)P)?gfvR)uJF$ zhBu|TMLyF6&&>h(5sSvzZGK`<>}$@PVAs?*Q4lz($V=ZsQBP^n_yN@$Mt(ujp|VJwfAp7zs^Q(ij5gENbDZ266VNp5u$8YTrh1Z3S@&W^yQ zzy+x0627Fn-1Zb8Hc=zaNJqi6)S6CHi)^Jx08*_4xGI_(+G&w6MkSSs8mLtBEmh%- zL;g3cRl|!%T#ebh-7Jvbj$uvdlxEU6h9cjqb-7Kkn5qnqMj1Gq%C?nsHF(#nm zT>-yp4lF)cwaJ8)E(9D{68CS={O`!2H14^y}^OL%B01q76hqH+(3# zx$Spzes(=-g#MU_l&4!*cNy)(;E-zKW|{*f(M9;kp$&Z8%gefg*U2fxDF*_*ss! z!N*1#i-2x0bSj$lSof@o`Tz~P#4c>$UcW~cOQ+xpwTi*;(lDf?RwQ)>d=*BJJ(We# ztGx7+{q(Y;@~K26WaB(giQUG80MLfYFnS9J1yIb(jcR%X#O#IzOc=K{TD{AgmN%c;bSfJ3 z$PmFjOE2A~&9nUU&uDL+12QN!g)q?98Y^Xzo zh$x&f=hiK4Q}cV6hHe_p%uA`o1$xmdBifgAAievE^34zS+tr(dkF{!-?H zA9?oE>6R^HK&_Uj18I%==~rl;SJDvN>_jX(!cDdU#*#616wV& z??D%sNv5hXKm9uWia;4YL`%7`gg|xq!nm6l5^(p+yE-|)?&lQ6Uz2S{>1nM!^IO1( zts}pYjaF0@IW8TouRJSVyTUKCU8y9@zQUD z$=<-?rGEot38-WcrY3mkVW!^j(g=VNzPTCIham@xWWl*Mz3TEG5tu5YE%L9&D~oP0%3`NYQE%q6bQxo;3@Low&2-$!Bq=O|!r!%Kg_Prp~k z=YwE2OZ94Dwut-4@7hPI-@l-7U~_CJG_9nWgH+5VfWHnMKDcPWYM@9mI^?Q_C*SL>5pIwPHH_`53+gb zkNW8kE0%r_SR#fB$OJ4wJNlNC46zgxi`Gs|Nwtz$0bH9s2mR|>SG06DwtNnywTb{k zphglJ_!cl8;;B1!z4Rx6BjP}Y{b>CV$-+y2%1?hnarB3vFpDEE{TVO>7%or36@3T_ z*!QGuoJBc_?SbW*Sz|=|B$gR)0r4`Sz{H&HWbsPQX2ynSK;BM99?Pr8Q>Rv>3{BN2 zVq8GrC4fNQyoVC^2}Zc^^fYfQpqEw@aRF(ff_Q(d%}PX?op+xD+nrjfpZ3##tQ)6) zl6mB1a>5JB#03FVUi#1d^k)^3e*t4GwiFxKcl{C-j#7!cB;Z;=B~H-o7HD>r!0ogA z5b`sU8_!F%cJJAzTm&b!jQKo@YD9XH^J;+rQ=cnSkY!{?u^oSHg$(xAEhV?T?g865 z3P6FdT?(<#YOMMe584s60Zc4`{aoz!_QeN9P_u^b92qQ+H5j1u&{Ygac3l2SSBm?w zH_PxCUK&T!QmZ1^z6$)yUAbQRYcPhFsJs0=zOrF2{S8P@gc88f6)*h{NNb2rFa0eQ zhXmV8e;acJ3MTfsWj{Yi1Vc@_a@cG|H{$&T$MxZiKKD&VU=S zqY!=_-SN^tz*2$80UZ_h0X>)(|L&*%O()BbfXNVZUIw%3LK!>)0z~4f2|a;-BYZXG z0}S#YvLfQk?8O;@PT&?c7$TmQn|Jm*=yVAi}|CJ7=rQLK5HG!k>= z886d=#3Hz3<^m*&OGw;D-mH3=3z0anjLa8FqUvSt$2`mPUglCHn&l-gbAKf2vn?<4 zKqPAQQ(gvlM5K85uCxT&2Qg$45tS>olo`|o+}q9_hhmg zGFQ|8B!x&jbFOps&5M;K9MhfI0_~uTv%DJc&-}>M-cc~ z@ANX)iTZeYH{z|h&M)`wk2#bc5t;S&9-mUH~&F$acExH>4L?1S0 zHsO?aX0z|Oio||Q^?B-BUSDG;oY74Mm&vG6#TT%o2pgK-PmOG=tcEUgj|nAL8Xk{nyJJK^=hRv3Q_{$Ke4m zACCv92O;cH1GfHPZYdsykUOFJXqGx;m>_@iMoeMYBQWWt!;M>3P7oj6`!5b(}_` zcnT!Higqeq=1Hi%RI1N;nWvxvtWh#gBWLAlXTbIhn+AM8jgqjwdYPZWOVLTu>a$VH z2`}@rz_PsZGCv2Xa8{H&0NW68@RxvlA@8g3dBV&5GT^{c$;-S334Hf5uR|rq&)CcSDoPhY6>sEo(966D z&jyD0EqtO&ZzBTu;x~{0sd<@qpg*EGpw4&7S0vso32=?~!1)VnH##vzZ*TB2zl9tp z%gFIw)Z7Fr-_Iw;<#+I*$Hw}kf))TW7G7TFqj(AL6)*F9=-$+10V}hq!tik~ z^9dB6LT`Sb?=P}tiGtu|{vYtS>}CEE4?z7_7&2Kfc$vRui*SGOGGE0@?o9(vUo%OJ{NF1a zBY-qN1USBd{5&M&W&VL(ZGbs`i=crvzK!A_Fn+y1-&@J`{pm)CP2e7GK_WrhdZ>GfO)!U3Bgt$IBdX)m{K9Yxc} zy`KA_evlVQzUNYc*b)}ibAN!ca+}xlKs;CRyd2+j_3QOqiL_`~fbSv9SMhotibiTS z!_`3klGk%B@K)o;harI_fY);!V5D;B^=w2JMG5eFHX|wOnb*^gjIaTFJzG$14PDOT z8w;SNAxyazK-GSXAm`%ZqSvz(4Z|>S0A6sea|N6cJ7tqFXSB>%qOS9RSa^Xzs(J2< z5wSh<&<*bGJv;rL@t$o=JrZ@cSIFvaMks-Dqo?Nv2+3KA*>ObTHR0YTFj5>^ah>sQ z5flWJP8j(*D7xM6+0(OkL(lG>edt?bxu$&^>8vkatc$QhjD(&?_3VdC>cPEF7XweR zA`r}75Ejd_-F2>QN5G-g!^^cAT_gjTdwM2ZXCvyT{=^Z2%@}w5^dTvI>gCtjneXZndZXzE#h;w_qbj-PnD zrk?93-mR(U`HA;y>IHt{qndi5pZJufUgRe}uc;UNi7#sEC4S;7ntG|9_?o6(?kB#f zsaN`mZ)@t+e&TzY`V~L%LruNbPdb`J5H!gQkAXPhO;{H~Y!UH1$?LdAX*3 z-A`Vnski&d&6@g6KRKwWclk*(GI#jN9s2H0KY4?ue%nvpsHyk)$q7w;z)v30)Cc|K zF-?8gPflv;cm1Rpw~zTrGg=?_lV-F&=_jA6`99?*U!|!(^pmgE)MxzU8#VP=KlxTo zecn&LLsNg^C-2bIpZUr6YUYIMj;Qk-|l)?Q!;r@C3`W;+1tEqqXQ&(yVArP+7)c0{| zq^5p=I}|nb@3@RmQ$NCmeUkDVTt}y=1g;>{R0=m>X)1&3jx>dP@5`FnfQxoC<>M|D zP2CrFXlUwUT)m*FOK@$0rY=M5dQCk5QQS54AVdP!)D?c}&6;|!pL(aJaE;gtY5)g*H8qGcshTR_;G(96akNfT z*yPD+3VSpIn%V}BVNG2Re>Y9-gnN&s9tk%FP2GU4d`<1aPPC@r8UJ)mJqkOPn!3qP zKUY&XV~b2v6WD;#)FEs$Y3eZckTi7^`$d{M24lOXZh=`>Q@6r&si`NxK&PoE!os8} z_~$?(GmYTwXutTVZGNs2`aGh+NX)i88tTeXlI<)^7qJBVAG=@a&B+j3y_Py_eL7ZPN6Zr5An4lJ#933(q8MLk}l?F5F=O?tdmPZ}2C z6vZKS0dIyKV?r*UmBluMAw=2i$pghD^LxV)iQUU?xz6Q~)h(dmSfyEk#NJhd6;k$% zn$Fc&ZeQ)VUd4H?<8l2BTt3Lb%9T&|P3DPsW%3)wLp~F@X;_|F^L&_jj+y5p%=4gm z-eR6p<_QlqDGxs!dBPJ#o^Yd(=Na>ShIu~AJaG|)e1D;N-fo^RH_z9YC-#LT-&@S{ z?dJJz^L)Q~e$+faWuBim&o7$iSIqNk=J`$Y{I+?1&pdyq&!l6XY4hA*o)?+tW#)Og zd0u6no6U33JPjU`JIwDJ%=1R`oG{NL=6TFKC(YB~H)-&iG-)Nq1 zHP3gL=N;zxUi18*c^bSWKWTn{+B^;Zk_LZCSRy$N$#0nFcg)k^D`oJNGWg;x=FHEV ztmS!)dEypg`EBsSn{DOyPV?Mro;RE4W6kqc^DLX^3G=L*XUjaFW}eS9PeW(C_(R&k z)e-W1vw0#4z5M=wd7Ambh;;HEk;vrvRrCBu^ZXa{{DFD?r#>01fcbfzU7im$&zyM< znCDIA3Fl|YXU3WSZ1UTTH{Frs_tVYuXUy}t=K1sH`C{{Yg?YZ(JmDlD<;^_eKA!yk zuz6xPMt&Q9K#Q~dhP{+enh){(c_`0NpTS*DJI>XkPR0QnzUt+hFZS+myh}E0PTc8S zJhAzb4gGgGm$?(0FTQ}UA7EcUz`owV*AKFiy1D6aC3c zvPb$iXYO=zNEf!HHeZsxJjKS4y!b+9e7G(Da9jSqeBEnb_uAJN@%1MAdXs&9F<+2JP?77vGPi3l`Slwt~Z9#!HxS^x}+ZXN>J^JJO%N zF>GZkw^NyOKxbZV$4=y+TIrYP75s82fs7&duQ;wM}9vt`0dH>8|?4R z7hg({_E^~WwKcpi%y=0yKFVgisV(D8VaEG2kelX)A32RqgRKYo}!}z{;A~D5mfRCNvEccTV6)11&mAHVj4gnI>1Og^wPvbY|cyF%Y&>hKvs-U z446m*xl0q**kYG_Hz@Ve&IYz#nz$~=`I;andgWm@otn6~An>EFDM_HCk#=@on%EYU zeqB)dFHyQDUOI{?r2jzBLsS`L0#lKCA9ZPBm#z0w_hCWBKU%-y%M$zVOibtybglRQ z^Y$KaS`^9u@WdysxbrkB!2pP;EF304F^hl^6$C^@6ciK#W<@az<{U9+&Ul^*c!o2d z=b7`F1BO%2ET^#GzTc|q>FJqyb_xF8zaPqHcBZPjy1Kf$tGcIWgz|Pt`1X$Zx~qXN zt5bQS@SNM$5@#>v?H-fWel=8N5p7V7SKdA`m2xjKWTRuUxb9G{RoEouO-RTtF=Uh4 zCY!9hgJZJVd_#47+f+v?@9>yPxq}SZxiMLNg-lW2F$vi~Lw0*iR=;W|D{pE-Ry1T! z$7JfF_m&h#AF@~X=#V#%~0MI32N*OBX6xd>J7@f#-MuF8Lk`WQEye= z%`s|ihQZuEk9mjk{%kPcF_^pOG5?~xyJJk{x(4+CpmI;Br@sf3cV9v@#t|!fgL-2g^?Btzo1pG!P#=k?n9AMBpnjc4{X%)4C8*VVDDSrzQ@LXe>Na`Q7UeBUP~%BK7nV^{ zxu+Pehv!kt$}h&KwMPx+IeE->%5N~34;##z^O#Eck-@yeV3N_KRqA(8{)z_kIfMCD z9&;7tcQ%;u%p&rC$Yb_YeiwuJV$3t3cqUVNALaKpn9mzbnlNQB`zwFF7*n~+8&n#{ zGN_vN^|fG*N2qAfXZ4~yd@{=+8RzpQ&R2x(u*;F$P70r#9%8SDz%R0YS{-;L19}Nv+ zbYNT6@_ry$P5Ss8wP~TIsYc$~Pl#?RCT8nKo(? z1S+tG;DZg(8*LF)RgetEw;P(zVjAV`iHc-mte}$$+Qs!#u8PTu>w+w;ilD0sR!LC1 z8q|S#)U{O5JwaW~ppv7>aP6alrUZ2rgE~Hs+D`@6K)Sj?JvfiLsR}lVxz@flnA7u^ zTdQCTgV|y*^S&k6UIjy9OyxEi)Z4(cbyE&@Rl(4htoDtedMu`@Gj|V0t6-F&dC$E@K*s1 zN1U5UTxIa23La0Goe(oC=R@D%MHM`gpl)PPsn?4KY#)2TI;pDQH5I&)kWV(`!(wtF z!hEbz_@pK*!DlLXGbXQnX{h(l>*re)d}%P>G?h{yP{Z~rbQ9Dq4JyT@ER0c4(t2S>6|R&J?GY1Id=O<5 zGwp-7;#sbYnW@A~xT*?QPFS5`SoMj^H=|lAITNm~!mbJ3XhTO)YU@f2w^d<}glv={ zyR2=pT~)Y)Aqz(uGMd%pCcbf&Gi6BOcomLLSeV&f z9&EU}2gaz?4tdlgRhUfw-!_=}9v7aZLTj2|HmDosnVzn~QDQ&}93RyMjUe zD3AJt3auDor5KgAlVxr7pDKJhR-baWH>fM*QD0Uet(3?jO!%rnT{DmRfeOt+iE_6! zsM`RQTU~`8fmLQM8U9a&W&*Cl-wfGq`4U=G*ldI;xCV8<9BN@zRR|2KySYa7X1NdD z=YM}M)~wyqvDoi+wsRA%OMo(<0;mES0LuZ|0hR|e0wO>SpaAsB-3ove0V@GI0y+UY z16BsC0_Xzh3g`w{9YFhSdI0(XHUew{I2~|4;7Y)AfR6ybL$uWZcSY;tqL;edSs zM*%Jc+yg*8!?^&|vj80zptr)>0O+LvISP=!a3lbFDWGi%&j8*4eC9aCbpZnb;9DFI zI2bS;0N%yh0FMD)2K*0AS_Z5E7zEfAFcEMP0J<*C1k3_F1%S+D=&uaEvL`Z&C2W1)7nToh~9%0;P0`4>DY*KU-HN{v<AU6#Y#2uPr&I= zdrU4m)}D}yPPM1xqH~R=jlfyC_N-j2QhQD=R;`gE!lTt{FUm!i+RJj$wMHohJnB|^ zT`pFy(F728y4T*8i#2NR$VHFZdvdX6?E|@3t44ka$ZOX=k&B+SxpL7|`&=%1)xMOA z-nFmf;!m}2gNv;NA^;)h5E4Q;;4N>kYaTvu1-+y8FF`d!D{L1@XGRJQb_#`tmg8UP70D#qftwjo!ZyH;6$pbOPM#-qhG1 zV?4r&J7>H1^lI{FyZ1HK_QLgSclOXG8rFN?OSCkoWBVCgr_&#tu&+DMX+WOSxHdTr z04MBq7ETzzDzv>Vc&n*#4{(y*A)}fa_sp}MBy4B9|DNGs+uInz2q8M(Sfi zQSQ6gLep!u`vK4jy=S{0yF+I>9hw^VjxntJ{$5Ru`{WDT&MFMN#}P)2BoKAYcIVnW zIyE(p&-2*L;?cLMkuvl#kJ=%4rrgg-PL>%A(>%R@G&N3OinD;46xP&8>6TR6J?wrt znnJMAK5l;n?BSyWTzx}VbKL);QAtJau}zH>v*XEkcw&kjD#@?e?oaMe#@n%}@qla* zgfrWn*Hl{(r1+mRMRRp}HZ@LSF}vW2a(}gJG_(mpo@jqwQ{#cHFkLe7oxPhH53&lH zZwk_~u?Arp(DcEKC#|)3O*?pjWMoq#g;Ut+$hAnATU;kEHCHh9n;H)zy2b(wllM=# z_w*h++g&Kic0O)uq(xoRo&ohm<^B#aEDayQMek0sc@9^c@YrC2Si>lZ)^M8WNv0qV z_n?_!O^rv#7&XM4*tVvrn;MVd612*8MnN^KB5K=YmMo2J^iH>?MhYfllct`RHesqf z<$k2{$}4b@CE!5=URi74Urmiufkb=RkObgOY>h>!R8u2%&_Op|6$15YB1)UrY_A

9P5_*!e-Q;ZCj(A(TzZ*L4-h-)p=SN2$T#4Sz>cz3vg41KUrx+x6WCgeJ!Zx; z;fkQcxg1>Ah`D-G5x9b@w>12hOss#N zUGAg#a;cuQ9Fi6_VfT3atPZ;;;%6iyMhR0L@O+Y<>4CFGenolMZ-ahDBX<*ZswVDC zULWpH=$%?`PZ1&cGUZ_%Y)UWX(G-^QPuf`GksXCRO}Ouu7<5}h?U3hsXSm>OHE_)0*Z?khRcfi4%%9sUfLOANo0Xzu!8{i?p!+=Ks zj{*=*JC6gN06YnJ3h*@G8Njo!M7&X{JI^?=L}xI>c^~4)PE%^34@kJQHaFqQa7Q9- z$&5&Av##a8kMcf1d7GQ^CL&!!{b_rY(9Gr0JfF&2m@jW&o$|OHXM2NLn{^9q2K$95 zbSG2j-MY}Tnj*Io7fLYz3Uxa#L!pT=xGNL6@`ke$AlnklUN=I;1zAk}pPY$5IJPpf`J>&ckr+*Cp@SthR|6wPAkf9tk)K zfH|UzIiibnfjb3i!)w)b%XENThDzyHPb3L?o1K>u$ zO@Lbfw*qbh%!F2ti?!-CA^8;G?yJz_{g6c7(IBlpfWK_5nmM~WizJTCsTHkqz(CW> z`dT$1fi)+0DHbq%*__e?c|Spo($rN&yqY|9!b zj>3c{%h#^)6n*#f0o*`hY*cvDtIHWyxk%i{DKhe~nQqI=ZnY)5P zK7w#F4C>Hfx+$}gMkmy>l9A2Mm}X}@&rQ~&MM?L5zykox-d)VzUCi8F%-mhf++EDt zUCi2D%-Y?@0Z+nka8itPN6g`Q2IyQ2`Cf#Ubpx$AC`&p91DWH#q)8H}zZMBb=F#|#=EGtMR*mP z)6!`R=|9p%8`|<3vfM>=u_NjZF_$A0D%fbxN>4-MNG1Y-JZ~LaUkA^ZXDK*`;UYlL zvtI2Pk-aiTyB?6yQ6X|&gKc}Okvwt# zZKd720B7;--qq%`l0_Y0p23Q@?9k2$V2O8!o(=c7(oI;FYpQ9-#ry#FBQp4yx z!go9{n_N-f&CK_n9>$rT%*cOBJ=m&3%Q@VFm6&a4Ct2q?MNG2krY0JJ)W@C|{> ziHFn>E*x2__Ua2fw<$o94wlze77>K5r#qx(7dj&`VDBBW>exqnNFR7eA9zR~c>MrK zA$S`>T{wJA`{?g=ws{VO#e5v@_Lt)-fY>p-1pg)DXqnC5tcSW^iKOJ@6GB(_*t z2};_^x`4?LLSZYLkyrM%TtZKjTjQsUSWf{3S{vAPbF1N@;Fth zPUR`rA#b#jtqjkJov%EnKiceKaCM0*pc>{Yfu{5$!|@5YtyM3v{KOHp~GHoV~g zq&GaIH$0>_kcM;Vh&^5TpLNUs4b|O;D}T3c`Efb1^OYaZq9x6mZ~1+5Tv8KU1o7T} zghG|a_L6+X*3fo1HDJ*53yeMt;IWegZii$J-Au5em3BR)D*Lo}Ro1 zNe)9<^1?B-{^42CmwbBSQHG;!$9q(kd)g{`K!7B>;f^82Br$|>5|X~4j)83)jKc;- z0}gs<>`mYZWeUeCI;hzhWT^=2RUX!>Jmez~FFPJ`5#F&-(X3cS&X1ONIE7U-N88A$ zxk{vM1e0|SBSKac*zl2W=+kq&a+WfUP{dN|FgPQADi-2BRKNPWr!C|ZRQFWCX@JuK z(*S3n`Z#A&x`?|ys*kaRven+@C_`QzCkweECvv{}R}xOzKVauezWVTMZFvdmC|41R zRKE^`YvQK^0vb|y6nYXT4)G|oCdjX4Nu(z+eYPh7hf*Ur8Hw$wE{-v!i+L0WfgVy)-t8z@UbQF1-a%r-vnRIb zv|?%0!SZ@mv6=bkT{ah)gXPAqyDcu#YcK|<=H2($Tv(QrT_UXU{$itWK`E4NfO0RF zqet_hq+c3c^c2`ksJVxmztV9DnB2GIOmei8kTELF%eXn%&uWYPVnmx`vzHe0o)>WgN&mWmKaAgZu}H*9%32TNG$~=F+yfaUvml=@8QszowGM?cJ^v^hOlcJK%1q# z+X2`xi{Z}k?gHEmxCihT0QP5j_W_W!T3y%S zD@gr1*MZ(;r8>Ov2kP+VV(ai$mV0`H8vp^`W+tg#@$Y=Ez^uZW>wyf@Aas465q)LQ zEfnLV;_+^@HQv1r1-$`y6Yv(`ZNNKF*n37{-L=B7RN+yMMULGdh0V=YX(<~0GZwn7 zM*lp^J+H7Ym`O@u$S`HyNKRq@VKQ<3I~n{X)fjR*-dwiJ1<$IHQvq6;f`NhDcs-C)ZM!!S8uta!#s+ zRV5=J%a9)>eN0oe{pn(|IK}`un59uNc1$uxB9r7HljI?jgm{I5HplxN(1JG{aCRXb zRINL&rCFacKyp|MH0yItC#8*?W_`};WG5e(Z)Y^?b808WE2~+blRKi>It&^YuUTI* zI-*%-k<}V1r7X?X#aWDIaX7c*BX{E?cjF^><6{``8v)4O_zIf+uhHyaZL`Q+`CVDF z--%oFIct*AMq0ByL9sdun(ECpc!#WFyXW+hQY->re+@z*#nz)=Ge@sd7K<>!UyDT{ zy$XjqYVFA=>@Zo#EQ--;nPzpPH*a^^tDzk#6x<2XqIl0az2T7N93|iX+su zwc0veA7#oZKxC~t?UE=glSd$(_GKv(6!@pw=Xss>BeYcWa-a`WaGH&;+RIO@3?&= zQv4Bsk$_Qv-2l4-_5h4=TpvEXj^mzyV&y<8((J^1Wl~`YX?A}WG}RUG&O=_a2jqC= zG&_kfb^Iq{Kx)Ik4sbo-M(A|;x;p(U%9JzVNT(dfrxcOb>HREaTBld!?KBnElQE`a z2C`EQ>)B50(9fY_(xT+-^g$Mdb;=y-*y%%z!aA*s(zc!c6}m$#?%xkUJnkbN_Ysf# zh{t`zX=)2XeVx8coLHxI=wHo?lGEvH zEDGzCIn>c9N9Pjd)GVsk$YOQM5on54uJ33596cDf8YMeyq*`1QX8 z{0HzA;2Xey0pCHVs~Vl|D5*`iT~ibwi3FW?5uFBZt|BQ#JO~1hg`C85x*FvQYcO0L z<130zrf@z?F5^U>S!50Td7wfSFW)8$kh3f@+)U zsu)vnA^F0*P^$(N8-Eo}p6sx7l>yAXLswH%L%BUo0|c7htQ z7e81TunGXH=|LAjH>h@xk^V)aJ=cbgC8gTzKzvh%k{f@69l1(rzlH=1Bi>I^8GVD3~zER_4P` z$?LXSXJ%>4=%daqhu}g~`Xa!^fJ*_F0j_`&@a;g|Z#(KGjgL^Jn^2ydW=u-BIV=8> zFKGm~u;eMT%P8lzEcbMHf<4*6OlD#a$sd@m7Ef{JT1yomxt&NzpS6!N>P)K%I~_(O zD?hnO^iJCZwLUC4}EuIjeOe@J2Ab<&Gfh#`J zsJY&%E%0cF{seQSL!n9ePf|tN7>LLMpCX*J)66LO8Ny(7Ao_)qG9z%kHN#z5A-thE zcmkq633v+d3`E|euE-S5$cfY>G6yb;5t&vQ+ZOpvBl6WtCo)2q03i%Mhv)=vLS*xz z7Pj{Ay9izgAwOl2=>R+uc`g-Zi@X#j{@G%y@`cTvRKFD5zqGiUR1YgWt_uL*^lA4aO@C-&~Ufa9XL{!~n!$G60T9+}Mt>0J=P_be%IT%hFSlwR^V8!A@5 zW<$ii$KqH!p1sOZ+0iOZB z03fmp5Y+`=0}#~(-vYh|`~dh7@H0%#yqx7smnhGf)D(ph<>{BRLXPrkSF^jonML&b z2NagBm*s3Q33l*hZr3+2I{7CyS3DK*@A2LmU!j;D90 zrYy$Y5||OV)qTMytWi0{Uk;Y&(^QmmC8AK#6EceUwH|uA*jOBDNn#Rta>T?lxYM4< zI1t9+OYAPp4sT;f;R=MLeAtXWnI+j*i|y!SBlf8wm_mjtGTXY=gQp$%sl;(iF2`p; zNUodaZpF;zP7jEf#>qv{VMmtMdYjqkS)cvGyS8RS4hnG-J>vs%1=c2gN-hdJ6C17S z0T|DELDvW#KgJ`DbhElv{_)(cSkXibUO3Dn>=-`V@+^orzO8KrWo0yt(&TgyDOZAA z64huW>6RhKu;~#C^nNTizgHD@jYW@3V#g$#!e?iS>qfYC-#5LxpHo`ooF%7xEO44y z&?S?@KSDnGW4<%ycV~C>3OWg7fwR_pXSeP=299)AK<~i97j`3#DN<^u`n8aWuFDgHjRMq1T|?KB$F!x`51l z9ja69eq*lO$4x{Xu1Ak055Olj*v5-Icep-1rgC7U^)Jni(nFs~v@aQdus{usQ=yQ)NYus23$j~Vzk?Easo(XY!;7_m zDOBkZLkzZm31L%lU`QHAZE#vEZmddu)mQ#y!#f7(>Hd|_K5)dtO5fau*pNb4y4fDS z`@rmU!E^O-A+LhW?$X;4ne9KJ9iXu5OE)w|dbh^XN# z71J>9MdZK6;3%QkfpOY|PZkf7TbAukPf-UGQX#7XUiyI#_#3?Ow4#i6s=VPX^6~DW3 z`ajAJ+AnXf3qANtAD@39z z+yt;GU~|A0fUN<807C%V0JZ}lsS_fh6C$A#BB2xRtgm;0gThDPb!_s!4h(OHGWLQp zdQ;t+P6ku?j0@HDP%2^>YkC;brpLN;bQT^?7~-JLYqO?D z5aN>6bTVppDBv)_;eaDh)0uHi{p0l%@NLwMGDC{LJVP}-iHfjmia)Hkd3XwVau&x- zO=zm5r{p{ZJO!9Zhqn^9;i<%f>Kso2#S=gRP7cv%6i)%E!r3Vxk*BACrxQax1;nTY zd(k7BbyQNwNhRBbY02RMTA2b)XSOm0G)I!fOB&&s{4_NM)JR-6&3##?fM*eRyDf~K zvs1vcftlzTPC1OHQc&nQ#73)HrhtXmgPu!|vbs)90g2f1h%^O+jY88h1x#r=Gt8XN zcrpddtL{R6nsNZ3&rAU?A|&Y~}s9Q8)fWe&;RN#oK^?1Kt6=3wRIk zKHvkuhk%a&pTKq=u4_9#LJav7Alc4OB2;1+b;hipx!ws14<&XoI{d}v(u(cOv$)i^ zo&PbHC9<7gnOVwq!lkyI-)yPt+s^!DE+=C<3z*R|+s;A}^^e&Oa^2xifS&=s0OkSy z2ly568(=)?0Ih5{_pt11f+j>SA6_b%yFiJLDM(D{)<(mF1)YXNIYyIMb{% zEB2(o%F!2A0`Css{ja)u>dw4h(7e~6n%MKgrO*@d&Ss`Z%E;?!O~Md8t-Ex3>W(_B z0q6l(6Lopn)Wy~l=7MPRS9M)Bkh-)v0NQ#&qNA_@c$+sDao{PxdF?!nHlXyKd{2|? zX-ncwtz74*nL&8I6+M@kqmS_{J5sP}%s!*SK*FX#DVe1f2DQy0Zu4~CEevKVaW*DG z%@|?9aVcMvEKC=+K+U%VYy}ty7zDt38oqfYF{O!NC?nCta4NA4P3&sb10&#KG%T_So0z~Q z&NAK7wtqaHNRQe0^*QQE`|nSWScepY(?Kxt+3Kr<@Bn&BI+2?Cebez%;Xpj6@LbZv z$Q^#hBItvb=h9J5Opa8nmDnoK{-Y%(i_de93Ro9~hmbPl z#h_HI8iMxO7OdhxB|73uQyX2uOv;&CpLUcf#J-x0&K@J zgOKbwL~8M#7ETIR0mbq?WZx!VBS+7f^Yjk^`ZXFow)dpZUrS{Xd7S8#B_+^YM^DHM z<2EPTFoozgBXZMbEm-R>Tu)@RtsfuQPq{>e8yJ6rc-$@chnH}q zzs2LZgZ|H7k?2B4&`%3noL<&Cal9^r1>}euv?u1VPT>l`m4F$5s{q#kt_57Df3L^y z4QM#?Hl_Eoj7{F@sK`AKOum{;4fhukGu0-!xVvyKSEaRi?w;WC*BqBRn`Q9Dh{Amd zt4uRf>q0l_WKiJ&n=w0pym+$`o-z;;7kjT#VNRZl?N8|_w8DeTh0cnry`GCS|vU&HyARU$Z>dJuu|I0PY3+6>uK_yBG_z0CNBj0v-Y&8HLZ8 zIt3)63XcPjh$=jVbCJ-w^lIY2b2$|vBd1H4QcUQ7pgg>c$Rco$w}3^{2K z6QS&6HZh-MZuc6Kv^@{yl|5I8SMEk9kBS|R~dKmw@nG2j!xr>JE^+?L*+aDqjQLi3xV;_6(> zb~0}&Qpk$7l!+iaf6Ji&TL-Z+n=#K#lN2dXB?FcTGxasH@H%tkA_uHEX&sR^ezaj5?A-dN+pR*9k3VqtM@u0+tteOC)9gV^UCgYdziJ@2$w z4|@+vJV$ad-w6ZyTThyB19k05Y-%^g64K0v<|ml7VZ#R7BQCKklI6jSiRI}Sf+g+U z2;&bT5sk~8-JKnDu&T-2sGith!UG^9>8Tyg%L_WlYcrWC7hD_UlHC&_dlsg{YzmP9 za3ijNGW0HwJAH_RTvF_7oOsmi>UfKsA7z+qaX!fmoo4R>51Yl+9jDkGum%9>g5sKh zwE;Z=z4dh;SX$@U(%hm>8zH1CB7cMaM4xs|^Osf`xCiklK` zTi&F&nQ-rzG69-p6Zz)!kn92(hBJVnj|Yu)0}ReV)Yic>6|82uDZBh!#P4Ab>SpY6 z`AE*<#!$p2fK36L0X7G038i#1O6jbX@(D`X91%Wt`|!~SSAz}c zO1_U6cMG@-E2USQ1R)ND5dGuU@_v+2#XAT>9LYk^r&Fn~A5~9?w!g|anq%Vbqf)Y) zZ4{(^4t6o2)t&liDx*#FKPD?hI(QlmL62o7L%H8ex|!UBv3^~?nHz%wJDgCgSc8u4 zV};@A@pwwJbcwFg3B}@6BIV&pcE}xr4TcmFgYE=+6gx*6KoU{)XS>z{)`?uU7&0Nj zo-lAp+>arQcg7V@A|#sG#=#n4ni^5-kQ~-dk*T=FsS(Ms2BHTYjG_t{c{y&!CgtKO zAWhZJ+T2m(gbC|J>bH*0X@Jh;Mq;7T+ptj)5{wvFf<1*>lpv`;kge{NesvDQK(=PH zbNKJhI+)w1EG1H?QJVya*ZZT{zz&~a;0gX0ftYZi}57Z6UH z<}3Sdc4ph$$~YV=I7(tRNN_Rpt815L?9a}Pi`eo~JRfiY;6eblyaa>d3c9DDe^c%P zr~4JJ<_Zqc6}%>2!BljJRBQ2C!r?(TPQ>DCeO6bwF3*F#P`r1f6L?%7^O)@g7U_*y z(j^=P;ugbc$OTyKU9;nJ&WyG&_5?TU z{reEb?p(G5$sz*!Q|v1&Ie&dR=;o zJzN8m5(s2bCW$L1s#$g<76_t#YdS&8czGu*vd?wX`oZo@XpcJ z<{);N8Y8$aBDgNz4?u8ToDD#5UHlsW0e0~bz@uot5vKhDbS88s=W$fxpD0-clvW_W z_Z)I$b7?Ak|fNyn4t=}Fej+s=U)6L}ICJcBzg5Se`R>OEEyu}ETV zlSV1N$cUmF3MA^yUD{DBv9b7FB;44t`S^$8KT-SV0RI9!uYX^_?~BmL?y*MjzDAke zZwinOF1~~ERIsPk$h%ZJn@j9G;#C}cWTOblwXyK>k2Ec<<>zK>LEZkfG>!mV#JHcmW6hw}Mq- znAqfF(pFzGIj7zD3&vN|q64I*xzT@E0=*K)EQK#yrQes!^ZKAXy1}h%mG%`g<|&Z% zS^>u6Z@5C*vh}M4DC}#(C;l9Sv*crE2jlRUtj_?2WKAkCdL}pge~FIO%kuxTsj(W% z|1FCE1rkq^gqDGzW4#PS#{V6m&?73f%9BDo7S()D&tl7zniH?KtNjC)x#ZRU(U#F# zi7HaPlFH&E!^NL+@=!5a9Asti2RA~za9R9$DP{S^;OCt27^k|>85Xv<`)2YM4yJVr zoORnTbQIjt0_Tbrr+xYh(Jhz-Ca;r;&!W$;4#xhM6Bas$;|}|;ny-Jh69Zl-&k@l;hH!D`JnmI6X) z-CsGIK(LT-sQJb8=^ZjeXRzo}fvJ6YLo1jFw+^>KZ;!E2moQvn7`mJLAPLL#BCCfX zI+JtZPumScrhBT#ZN$e$U>(>gxd0E~1E8%E#@7-?lu{A8oMd$Q6f}vu?l1_pB1%@l zK{C#iR>EKQ$gAfp!0SK~CL`~?dZRv`bY$7@WZ9`1P%(5{v$_e4PJ}^^p;Qp#~pQl~gw^36-91Q&|f6{R= z#VV~v*qMdtp;V?$hjH7j3dAlkTN0Z;VXfC$qf)o{QLc^FbV4&1Sm+!Zu7pL^7H5Rj z=j0VmZb1IzTxmr#)JlL3fR2DpfX;wb0O*8#e>MDe0dzxyPL3PYTMxk=H7H)HE%k*+ zDmY9xXg~Z_zd`$x=%zv4_DO?oNKbS~P`^PpB8;{h6d%PZ4KQd)gG!^$wp(tdb3BkY zHpo1=7!VR>+DNF2ZDP<8o~9MGvm=8a}x{3vHMJ!zd@PaqdMQ_;i6wrMx~DS%R6*h4=+f53)-jQ|4x8v`~0YzEjI zK+m@TYzY_$`#CbUAGeH&Cr!n#LJcXWse+@m{UG3gExbpao6KlVFlDr)EUX+*iII#c zIXx3o;wPlsUQM-UY!9J(B|SF^Zuu9A*A&52(VM;TP?ouIU=zK2m>au%8pBFQ6rJ;0 zoF3L#huco_jJq4>sY|;+4a0Ka;>aDnjJSSLu?gH*R69XRU#g$$u24WNAyWKUx_9--5Z>V7T|QR zH;S(cc={Y&N#a+OJ0wZLlE#;fm6-<|Mxv2OtbdN6%wTdvR&3P4PLm;BQ=+_b?3=mA z@te%)bWMp8UAESrAo=yC(qtIjp@72xM*xsCEn#L|Lc)}`+?0+3Oa+_(!!%z7 zb?*ZwOupQGP^ohumI~-qf0~4xD{7Fr600HI!qi78b((46bONfxsnRx@m$*o>R0`6~ zYaEEQ?Zs3M$&mIJCfFq|ml&J?h1NNLr*tV{Pyualxy;~LT2ku*FTwu?Us<&Eg`R4x)^W?;8MV4fXmT-7srmprQHG4el+*H z9+IixQr&(xkespRNq0-0SS)dpHl1kAwChbachc!naKD)~*j9T>R+e+P?hvD6$>B;1 za&izo%jAtv|67@F+ubT&+Z@AM=Y&`3dT8|q0MfT5q;E?|-Fj1$aR+P zM`i9XmDx*X3l0vUEj`Yaxl32(iKH^ap?M_3hWd2gg&ct4VhhJ!yUh;nO_l?o5^Jfk z^f=0T0%hGFm*xHoWzhzf!%-GxK2xlRPy)nLRuX1iIbzEtQEBDLGdP0=vN=p@-rVXI==_X)t77G(mEp; zZ6hX9b9_2+Ymw6rqXzyhaAa{`h7M$TOUUq+UIe@Zcp302;5ESOfH(9t4tfjz9=EIW znapXNSxr%yVoMb~F6~-goy1-?*HiA!RZd17ZdLouwKA$3cQ*{AQ)EXH_Ym28L>lH3 z(2~7JIHx7qdz48~@WPt)E>gLhOYr6uDoQ*Z5==@WsT1|3JV znM83?OVce@wqn?3XQzeEj>srt0eU>Th%7+!p7QegFog{Oh+fNxUdxD1%ZOgfh+fNx zUdxDH`PruUMFd+$1Y6!h|I&7%mtqrgFOX#uI>@QK9XH4;+Jv^Jsw#IQo^~pC4f>@h zDFigtj;HYhCmqo+!*LD{Y4-X6-{1*O27yM%-n@&B_Ta4t6_{LC#{j$Nteh03!pl35 z5c)GVWKn2Blrf%V(%y=s;MS$rXp%PEQN$P2B_T!ZC<`y;p;n=~kfelU6{fs1@MxN$ zcf^ocm<_ks2xGSBnSnAMnK*_nZ-)li9?kG$J zZ|cU`LuzM~oo*CTN75+Pl%%|;&?WB7-p7N+;m)}+iW@_S($T4p=>0a-+EhjU&FvV+ zoV~nPwtyv{hm|Q!(B|yDypM1n!tGB&WNd>cU`Y?>P+wujM(a(C9@~yK2*yurhC_VI zgxd#iJ?IUE!F^{qzyM+A*6#1}z9bW^rSMKvygDNP1_TcW?~LASw~oP_;C&egYUh9r zj|8NY-UyU?yAR?_Qd&n$tdFw@#80^+(!+^vQf5ZiZ4D|3zX_1fvQjc=YC^GAEJe}Z z5XCZ58KU_p{+S2}WNON3*7EMK(LDfr0>%LL0wD8H-Uon8Lm8Qd^1gum025%#pU1ZB zo(fB*d{BQF3FR16@TIn84(sjFxt>iT5H24stq;l3oMhwNrrd^c9-z!Ieu`N-N<!z{y9mt0P!A}XNV?3K0WvNytbZ0>`B<(+yqfV1lmMHO zv+&BCGtfhdHql(W@CSDHKm@+XIZ}UMmoq?R1lwf<+vURn2)4^d0T6JP5pb7}1x!JE zd}rF@c}&_VP@4vYOy~CaLAS>lqGroSq*aLEw#;vCrB#>?$jS&sli36}R-Vh*grm8z z3(vkfQl=Du4sL^=T4@E-CTs~NlUU}2f!>EEv{Z({X5%q`Wju$KNJ!jYaz(w5IuW%I zEtTUsdC0SG++ieo7(2?u(VS1!q8^xQ-S`-9iNd8}r=#)C0O0Mg@>zhh0f@}Yh|J4~ z%**GaVdupSYrkw?o`G^y@T+dvtEg1FZ!CpxzM2~%u?e0_rKZ8x5C%C}+q<4tMY9+p19ttNFj3@Tc0CjUF?dJ@PU1V35B<1Td#~sDXlPrvi+3(=74SoP#*i z;n=$TKB1@(TC_c!q=!@(LN*?JOwd{Wz$PGTlosGsAQfU0kq{)E;zK4#zfqcuaN6f! z5f4*!q&s8*w)_zjX_pn2iK}s0pW+$WzP-AU3_kSKy!Xn+A-iAVZ6DjvTNCJ(G`D74 zo-|<^NL`f{u)>BoWLPCep%Dw)NA%20&TwSnWXgS4f=kK&q~m?Y^56huQn13Y#`Md2 z6aRw=klv88bLMRi>>)vkc-hsw?qS~lKw+N~U+U0`&MC%VA@8j6t`!(0MJZHtBH=B# z^Cb~cHE=vH{?A=1*-TUBy(+SqCSJtOW?Du%CCRjmpiE1PbDy<#gTc1N+0x3GLr2E}3q!XRZ#3Z-1Vb`A1&Lff~O1zZ+ z$K2~?L;>dX-g-JGww zfjJ+#yr}guw3W`Y3bFD-*o}du=yHoyGzpcOJ-1nO#aZH_sSvy9rl{f)aXK}ny&0=k z{Nj?NrY6#{t!Lv^;KQuG6UzEVi*t_k&Nr>YQQyICA-oN~LK+>NZ~azq7dkbNaVOi% zSstC^XTUFjd4T@`egn)0EC4hE76KOO-xdc!A+G7yMW^Z%cPbof%6ZKIVOV83XhVf7 zOQ))|Bi+~oKmM>6$1tO-EYJFDV}P$jgpv60+#>1s-~#6tCx?0Zi;)B;LCZ+85uPK1 zW4brynYr#QO@=JGcG)u>%ug#T5LGNcIqEv{ugIK5e(~kWmUd1{RaRO|*+i9|51MhK z(t&902^*y9ME9uM4hZP$D)kvWlH))h!4{=8X}NbdAM`k!r+x@}Qs|#3M6cP{nCn zNFQn471(QXi85xGVLFaCD{JFvYRu4kO{I-{a!HFn+}gBr6A_r!LxXh89&TOf#V9=2 zuy (`NOoh+VWOj6|>+9EV$1dJ~7VtJD?K(-s+jpr*y8@sDsCak}L~X9}$wZmbq@ zq7uHX#X&*~bBbUl&9#&5CbDfy{2yldEzaKdL(EusZFyj`vwbT^WG`?=v)?@0Sq1)Y zIY2uAd}t*C)Bu>YR8|122v`Zw0niE18L%>d=vLL&UGUo#fb4puJ75h!55Ss$wE;Z= zO@Lndx;OmoYO%j{KEM=)f|EO-Qc8KNu&egB8 zbRA#G-H06~C8SK&tFj5xiNTV4;(2Ag7|eRJy@Kp zb!$LXj{|!Z_Rv*5o(pU3a|M;D^q6F<^Qy*nV0HpMS1xTKkqn&*X~~FQ`e1*=(;BZ& z{5o{vOsz_R&B@G0;wH+*qBm2a=*;xCHB)iifgAKC8s*YX75ov}hv$bq(}(9yj_s^JQ4uEgF zFC5^`aUVy-Q+FufJ$z9wjG}Wp2AnJmH$@r7yMpOyQgQYHbI{mElQc;paj)o!jrN1 zl?!14MkIJLsi3n5a0oy_#tl+u(xkuB+<~)JwfUy6!YHW`0U@GhW6sC58}3WuN- z*vfgmUcbWO()TH3#U2rmtX^Lfzo&pQc<+q_=0sayTG(h6mgmCYikh}S_RMw-`-EM? zI2&M%WY@4v*fnk}7vDgo!1^MRjlFSW1Gu3nss0tV_2tO0b^U=#)krGeG7h&cA!^3X z>SeKoR^Ie%&7@` zIW&A72RI%u6>tLJWWXtaQ#G81-_rr~i#%ZkdBO_vgcaloE65S@-{<2OyLT$sy;HeJ zUta?M{-@Z#yL~W_As%<$n8^l9eu_0EYs6>kNf@-iPvnQpFG+Bf9 zz&awI7JS+iU@^C`@MyRWot;tWJ-lNG2R6K^V>m0^;NGSO!VUQTdXGCt55*(;g?cpSLRBzhTQ;7V{z zQiao=D$c|WMLCMTc7iyH&@7H#AM{RHRjAxSYz)ybi->yzOF&D1G5%eIA658=FpO*v zo|6_;E@-CH$kh@{q1Qq(lZ@3IMA7(kqEWG!J`zlQdhGypvvzsQQ{`5eAtwQiY?nreBjPPO*K{P}@oJJ6h~kIr1episnFeQEIdY zI8p*Q8L^sbYq1yGgSAU)fP!cgver4e#i?NaED>*~S`Lif0wd1oiYNUy%O)?05q~>V znnak4#l`TRgT7|ZL4}{t$V(Z^kz7M|+B^?o>)^(w?m?(Y_aL9GiSg~&)LA^0cStCn zD0l%GazCG>*Ody~R1gA~k!k@oAsVY{>jRLFE+~Ew(9DkT#$ZXTMtMJg8I{7=Rq@%z^ZSGPsDdM-B_Z*#5ufJXQc@Dl*J zxC(M{73AV7$i-ED1t1?+S%5}5F!n@tBUKw%SqDoaRVnj^c1c; zHaJcd0e=+%e-#0LwGn`zzlxy0ilD#R9?IbGwM% zsT6nW&%kayV!%}nr;rx;FbA_5SzSMQj6{NdY%&?u4d}7XIhI>#1e3Al(M*NNC`kH% zbf5gmn^4VYTkXr7#g6rU3mRde%%y58(tGN#*sA0G>THW~rP=v{_0LjKsT ztPj`#&=+lRvT-PO8*BmLRCuaxgDpwaKhg$U5rfv-U|{mNUK?ypk98YV|4-Xs5Oe;2 z)&^TZ=UW1{0t^If4H$$rm=?Ez7oi^@2kAZm!`%tOsqhTl20N3e%i0EKg555b7W*tt zi|9bMUm2Fy)3W)M;rUvSlRagi(Qwp7Kq}kBwBR@lZ#)|HHe33Fdrq- z9c5;oY_sw1PL4G2hd$LX&3HE=C5|yW6Y?Q;i~Hl*$8onD$K8@Q)>Lh~tqt|*vb-}?AkURCW#)^|svr_;_G*pq* zsh$p)j+$N_*VKOuehS$dAKQ+qoNi3lZ7<98NVKy_jErcMlC1C0*kZ9gzj|&=R{I+} zENTxO;Tg*S+Ie|Smf3np1y?z5NaXMbbv8xPw1X0E`nXiyG(h4?Qr+x;pxk) z)C;VARi-ar%}?oN+Smgc_qLK#?BDEcyU01-L4b&3u^+*|`TCSKKKZYTv}*Ni08*<} zY`?5x`(+jB)hg1f)e8X^0WJny0=N`#8Q^lj6@V)NGXPhkGhb&q^9#B&?*c_%N3ylv znXw1DdOe|V@8D0itMCRr-;HYn9NfyXp;=b!uKEDw#+XfQPP%i)OXe24oAT`J9zGrH zZYGqrd-yGcA_pQbMGvQZ>SB8MZLKnHtA}%Hbt!r{CteBP?j*(?K?S#y82^uYI45+M zqKDrZYta_o?%^iYYrCiapL+P+++G9zNDse;t~>(Dc=2iyR-5pWaWX22}~WT&ghPFIngt|B{Ky&ZrIb@fgFveebP0rvpzMbExD z?%B?15>`7CVIB9gbeot;Cs8ZeRPq-!YVw!%Z)P_X7(Kv@>V94qe$1XB-4B5tfIzp! z0tFpphUA|MK2L#<3jeHUNKX^jOon$TZB|5L5PKDo1;IdfBgmd1M6z<-x9m9OAM}hW zph6fZzEcl+p7JCC{j(Vq;exqn5}E%qEiT zDf)%@nceEF{t|lo}%?a=vaM(ei+WWVT~h->{J44b(9!OY}DhjSN$H$N)|0r9yfe zTZQ-F{}@H=(*vt-5iV~G7^=d1fnb{q1&wcWnVcmK?;~y{EF8jaz+PU9BIWR_Ox&e= z)20mG>ehQ~0aq+$@3FbMGL6K6_Y zk?q*^>j6Yw=g^1`5~49`Gw0y-4IN$RE#W5qGP4gHDYwvhlQPrI?!L{=Xl#OF_cYGw zfS&vm;Ay}!fPVm<1^g569N>At3xF2^F9BW#yaIR?@EYKCz#D)!0a%l$z74<{L=|fg zRjff&KY*8bIQA0$f3UxlqKm$$+ken@DtuIXiLdZive(Tv5-wR3BX9h@Efg8zk_qKb1?>-6TJ38jxR1p@6qr8((^gl~4SymY+>?2&?@zQR z2i*-DJ*z*{BkI3#b=dw>^&#q{KL42MdO{EnrbVeA@Dys zDp%HK)&X}}o9Ti_DtwG=Jl+jMr`73Qs(iwn59Im8HCF}Q7$i+1{Lw&{g&WD8)OTDn z9h@do5DzA&_A+DICYPLhTKzp$dor7*RN4kdBvfgm zd7QRkCx>bzla2_mNUnZH9Hge9PwL_f$G`57hb7cxu4gm#W^;+py+Uq zpWt*vulx_-E5O%)Zvg)Ve5?Qd9=|^Tegymk_*wsA(W;6?t11?)s#vtD&ewl0z%MqD zR~G?(2VnDf18p9EGVb;61M;e|dsI`@P(`g&__Xx;h6YI3#Eja9|He@W`1l;NSm>+ms z0%j!Aa@OHsO#~XYB1NVGm-oyTyAbm#Xf8`eSZUl*_*V0{2q zgd6$-`T_a_HUw-0z+U`@O#qt$HUn${*a|QZur**XJjlnf2f;p0**jE(WWykt3P05z zWH`xLqc8KQ@H6t`yb^C>%!Xa*In|T)e&I2;YsOKU3ctXeQpw z3Ng_J8ijB2H|Fp7n}Rs``#b&{k(~Y;Q)xUeNo0qadc%lB2uyOdjAq*0Fp}#qnCtKh zJ!dDv?afV~Eq?GQo{Q;qc}a=zHi(8{P}pz)*7zDm07gQ2^JC>XyCdxJ(R`ahl6_E= z3Y)d^##sepu9+&Bss=Y&r_2gCI}Q5)#yM`mi_5`F=RR%l@?J+dlc*dV&&6wC4F~dH z1^i|0ooYCUN+<7<^BpUL!@+r)nI3|ihC>V)bs9TrC9=s(R0zqhaHt`pPMIY; zjL9k~GWrr=!{LUEav@o=BbclqP4*Px^bx6}40lJeDx@sLdS_oBzPHDQ0L3e6G*HDM0Gr|)P5_(;I03 zd4HjYPcIkjh+VaXwS3>d4>w%bj~bl^3%%|y{3)R0+IH;atHL_Nf#W{e*pHC{Msf+s zeKbK@kCC2j+=!7v3+b80LSs4RwZZUS0eyP17e4X$?(kj(Rp>XoS5Xx<9Nr5}GhjFz zuPSVUpCXn&@q?S2fphK7#!Z-UAz|!wN=gR>MC=$jr!!X3!dlH>`NtEdpCjjdMk-lI z-NQzl@hjEcft0Cw9@K=?U{Ew^O}WL$yvq)YDKK(j zH#U^rsT48FMUnfO(A6xuvy(#hWTON{Q| zRwRt65m@rm>W}Q{=rTXk9F{PqJv^BkyZL>uRBWkwx1t!f?Y)+|5G!CXH5` z8~G~;*6J444;ie_Bfpnmb+@qQrLmMdHu5(Uv^6ZW1zEI{B7Yk}>tUg_WYJEE{IPgtz}`AGguEt{yBoRwuRL$gLOsZ-z-=?Ei9G6dM@&Hn>Sfl9Wq$Y zM*dsEtCxkfO44_Y&0z$h?p}K_@_!JD-WEmAHYlEtf{IZ5$)e~}pJD=A_wrHDT}b*^ zB>gkOH%EaUM%J;gHc4YCcg-jmDa_Wj(6-E?tsMo23fg)W+TbkOK2dOnpsjDA?U+WZ zeG~;V1Zx8eYgh*BgDALDu=-k9BQl+soNZI>`Y4zqxcw~L-Rt6B9R<${Zhs4RY$=&o z@BmxbpT~j!807Fdw4!30J8-?0E46wMIP-sjGp}8E%T#jZg$1<1Wc!uV8=SgH?Dk<{S zDAcyKvBmNlGtQ;tI?)>ErbOXzsnI4D;f;$YJTD6O6~av|!rQ{Q4yh8M1B|TD0W=}w zYyT)bO2{{}$nUJ*e}rWHD7;iiHn&LbZHvT@!h3{d3yWk{TO^xCp`O5QX^}kC7D*U| zbETB6ERx5J70XjJ4z!T10g(+*y2oFm!g9iRYYX?e`i$3&3Y`RbkcIqG zJ>=S7qQcsOJJ`Z~J*lJ-BKDBCMg@tE8i!aE@3uiPGb-qzW*dv*qcGE7wUwXD7IG?E z$myo9)P9T#dgijN#pLVIbQM?8{DJxcB%RJo&SWO&76`2{g`_axZ0RcJvL8MtDjX@5 z-_GLsV-i|W7=`K3`ONb|=6NymgjT@wQsGHPS$jDuNUYVky~S%m!b{H+FK1p?GA|IK z8(_)>UT{_<-!;VR^{8-@$hCvTtEF`nEBD~2@Qje`n2-cP>m;??qrw|PG1Q`{CJHTF zN0p~J78H5|2~4wn2z(O@47HNLw}?WaaQIXe6+RQ5J6Sw)!E4v3xUQh>Y@u~c4JqWG&aP8;DapV zLsqfqNFaZNb@F%90g%KfJdVF$$xq^^tSDM*tSB0k8mrtP@!`Ix__7o?+A40}q>^<@ zgIygF75^uMyIX_@1SUY-g2jYkqUoOITK#3+zmI!MPi|&xc(mfNE))2ZqExIFu zI89LaCztmxF7E|4uM48mAQ5qlMRHW=EY$W1!hexGZqSx^j@_mVtg!5}`Zt&#dUr@?nQRyiuWnYW%;ml->h5*w&-e5a@ zi-kNPD(Si2eir$YR^Jx``Zv?VA*0}Tnf`sYb5c9b$B)W7UY}rbdC|(Jp>Lq~f5>h8 zF>~3IxX=s;9ph7U1u&k#%qB-=?c63>%wDqwMHC8VUh`H6SnSDE1ehL}i^pnq*P`l5OlS zxQ5fB@`X~=ffn-oBxNX#{U0vsYbH59Dqklg2U#S)7aA+EKVq6NB$}{D;E^>Bc( z1(FVP4U`(HVk41+BcsY?LUM$~f7hZJud_4-751ds6>C&GDLC|_ik|l$X>l2Eq}0k4 zg&q)9K9(YnvXCd$M?NsBEEMFUE#zzhw%DGVjriBzj;bAm;uwqK$i(*GGSK7qB#Lkf zHFSvir|x^oEk{)>UQoL5Sd09mB_*#$)eVJwibZ~U;w!Au*;gpHPgETuB*$4KXPNFU z(__iS&Wfsfetx`#dwyNq`=jb1!gs2Ldx@E`$?C;pQFV%7onT>ISu}AaPtJ8$L$^a$ z?ZN6=hm`%dsCuSQpJ-8EyM)wpqUyCmeUe3e(_*QM|6hCe;u}*I2XOq(-A>PKW~^SL z6h&FmZnqx0%GN8bSG3!TZdA1K4)uPtsa-aRTC7(^g$6-XR1g(o*N*YntY(P{LW3X( z8{Hs?%33OH>U++e?c8Ml0?BRinVEF%`OV3hbIzTa^P4lRszpfNJrawW*f=8AdD>Z38HC!iK$Ol`R>_Q~*P1|m)kybfwC z#mm^DvlMYkIK96$Qinfc~Fe9;<-ew z7;PQU;(L-4NKc5Ekd)l59p7@{FCtG}Y3#D2>13+tWT)t4rReD(3q{XBHgZ66h0gK% zI84G+%m9nMIt#oyi@G`sxjKutdI?rS#w|q|wqP4}q5_pTfGSX1{TPBcjWall8eGCv zT*ock#RJsgF`l6wuh4+^7=UyPMFz5wgWP}^;}3{@jKz3N#AHlC z0j6UnW@9eqqX@^KE`4^CSo$Cpa9eTEZ?2HA&X#=K5ryn?NAWxG{KXBT>=?B(J zMrSNIW5F2Y!rO}i2fK> diff --git a/meteoinfo-lab/pylib/mipylib/numeric/core/numeric.py b/meteoinfo-lab/pylib/mipylib/numeric/core/numeric.py index cfbd8bc8..36bb5ddd 100644 --- a/meteoinfo-lab/pylib/mipylib/numeric/core/numeric.py +++ b/meteoinfo-lab/pylib/mipylib/numeric/core/numeric.py @@ -40,7 +40,7 @@ __all__ = [ 'argmin','argmax','argsort','array','array_split','amax','amin','asanyarray','asarray','asgridarray', 'asgriddata','arcsin','asin','asmiarray','asstationdata','atleast_1d','atleast_2d','arctan','atan', 'arctan2','atan2','ave_month','average','histogram','broadcast_to','cdiff','ceil', - 'concatenate','conj','conjugate','corrcoef','cos','cosh','cylinder','degrees','delete','delnan','diag','diff', + 'concatenate','conj','conjugate','corrcoef','cos','cosh','cylinder','degrees','delnan','diag','diff', 'datatable','dot','empty','empty_like','exp','eye','flatnonzero','floor', 'fmax','fmin','full','hcurl','hdivg','hstack','hypot','identity','indices','interp2d','interpn','isarray', 'isclose','isfinite','isinf','isnan','isscalar','linspace','log','log10','logical_not','logspace', @@ -65,7 +65,7 @@ def array(object, dtype=None, copy=True, order='K', subok=False, ndmin=0): :param dtype: (*DataType*) Data type :param copy: (*bool*) If true (default), then the object is copied. :param order: (*str*) Specify the memory layout of the array. - :param subok: (*bool*) If True, then sub-classes will be passed-through, + :param subok: (*bool*) If True, then subclasses will be passed-through, otherwise the returned array will be forced to be a base-class array (default). :param ndmin: (*int*) Specifies the minimum number of dimensions that the resulting array should have. @@ -1753,8 +1753,8 @@ def argsort(a, axis=-1): :param axis: (*int or None*) Optional. Axis along which to sort. If None, the array is flattened after sorting. The default is ``-1`` , which sorts along the last axis. - :returns: (*NDArray*) Array of indices that sort a along the specified axis. If a is - one-dimensional, a[index_array] yields a sorted a. + :returns: (*NDArray*) Array of indices that sort `a` along the specified axis. If `a` is + one-dimensional, a[index_array] yields a sorted `a`. """ if isinstance(a, list): a = array(a) @@ -1992,7 +1992,7 @@ def concatenate(arrays, axis=0): """ ars = [] for a in arrays: - ars.append(a.asarray()) + ars.append(asanyarray(a).asarray()) r = ArrayUtil.concatenate(ars, axis) return NDArray(r) @@ -2801,7 +2801,7 @@ def smooth5(x): if isinstance(x, list): x = array(x) if x.ndim != 2: - print 'The array must be 2 dimension!' + print('The array must be 2 dimension!') raise ValueError() r = ArrayUtil.smooth5(x._array) if isinstance(x, DimArray): @@ -2829,7 +2829,7 @@ def smooth9(x): if isinstance(x, list): x = array(x) if x.ndim != 2: - print 'The array must be 2 dimension!' + print('The array must be 2 dimension!') raise ValueError() r = ArrayUtil.smooth9(x._array) if isinstance(x, DimArray): diff --git a/meteoinfo-lab/pylib/mipylib/numeric/lib/function_base.py b/meteoinfo-lab/pylib/mipylib/numeric/lib/function_base.py index e8a17e20..0f4427e3 100644 --- a/meteoinfo-lab/pylib/mipylib/numeric/lib/function_base.py +++ b/meteoinfo-lab/pylib/mipylib/numeric/lib/function_base.py @@ -4,8 +4,10 @@ from ..core import dtype from ..core._ndarray import NDArray from ..core.fromnumeric import (ravel, nonzero) from org.meteoinfo.ndarray.math import ArrayMath +import warnings -__all__ = ['angle','extract', 'place', 'grid_edge', 'gradient'] +__all__ = ['angle','extract', 'place', 'grid_edge', 'gradient', 'append', + 'delete', 'insert'] def extract(condition, arr): @@ -365,4 +367,402 @@ def gradient(f, *varargs, **kwargs): if len_axes == 1: return outvals[0] else: - return outvals \ No newline at end of file + return outvals + +def append(arr, values, axis=None): + """ + Append values to the end of an array. + + Parameters + ---------- + arr : array_like + Values are appended to a copy of this array. + values : array_like + These values are appended to a copy of `arr`. It must be of the + correct shape (the same shape as `arr`, excluding `axis`). If + `axis` is not specified, `values` can be any shape and will be + flattened before use. + axis : int, optional + The axis along which `values` are appended. If `axis` is not + given, both `arr` and `values` are flattened before use. + + Returns + ------- + append : ndarray + A copy of `arr` with `values` appended to `axis`. Note that + `append` does not occur in-place: a new array is allocated and + filled. If `axis` is None, `out` is a flattened array. + + See Also + -------- + insert : Insert elements into an array. + delete : Delete elements from an array. + + Examples + -------- + >>> np.append([1, 2, 3], [[4, 5, 6], [7, 8, 9]]) + array([1, 2, 3, ..., 7, 8, 9]) + + When `axis` is specified, `values` must have the correct shape. + + >>> np.append([[1, 2, 3], [4, 5, 6]], [[7, 8, 9]], axis=0) + array([[1, 2, 3], + [4, 5, 6], + [7, 8, 9]]) + >>> np.append([[1, 2, 3], [4, 5, 6]], [7, 8, 9], axis=0) + Traceback (most recent call last): + ... + ValueError: all the input arrays must have same number of dimensions, but + the array at index 0 has 2 dimension(s) and the array at index 1 has 1 + dimension(s) + + """ + arr = np.asanyarray(arr) + if axis is None: + if arr.ndim != 1: + arr = arr.ravel() + values = ravel(values) + axis = arr.ndim-1 + return np.concatenate((arr, values), axis=axis) + +def delete(arr, obj, axis=None): + """ + Return a new array with sub-arrays along an axis deleted. For a one + dimensional array, this returns those entries not returned by + `arr[obj]`. + + Parameters + ---------- + arr : array_like + Input array. + obj : slice, int or array of ints + Indicate indices of sub-arrays to remove along the specified axis. + + .. versionchanged:: 1.19.0 + Boolean indices are now treated as a mask of elements to remove, + rather than being cast to the integers 0 and 1. + + axis : int, optional + The axis along which to delete the subarray defined by `obj`. + If `axis` is None, `obj` is applied to the flattened array. + + Returns + ------- + out : ndarray + A copy of `arr` with the elements specified by `obj` removed. Note + that `delete` does not occur in-place. If `axis` is None, `out` is + a flattened array. + + See Also + -------- + insert : Insert elements into an array. + append : Append elements at the end of an array. + + Notes + ----- + Often it is preferable to use a boolean mask. For example: + + >>> arr = np.arange(12) + 1 + >>> mask = np.ones(len(arr), dtype=bool) + >>> mask[[0,2,4]] = False + >>> result = arr[mask,...] + + Is equivalent to ``np.delete(arr, [0,2,4], axis=0)``, but allows further + use of `mask`. + + Examples + -------- + >>> arr = np.array([[1,2,3,4], [5,6,7,8], [9,10,11,12]]) + >>> arr + array([[ 1, 2, 3, 4], + [ 5, 6, 7, 8], + [ 9, 10, 11, 12]]) + >>> np.delete(arr, 1, 0) + array([[ 1, 2, 3, 4], + [ 9, 10, 11, 12]]) + + >>> np.delete(arr, np.s_[::2], 1) + array([[ 2, 4], + [ 6, 8], + [10, 12]]) + >>> np.delete(arr, [1,3,5], None) + array([ 1, 3, 5, 7, 8, 9, 10, 11, 12]) + + """ + arr = np.asarray(arr) + ndim = arr.ndim + if axis is None: + if ndim != 1: + arr = arr.ravel() + # needed for np.matrix, which is still not 1d after being ravelled + ndim = arr.ndim + axis = ndim - 1 + else: + axis = np.normalize_axis_index(axis, ndim) + + slobj = [slice(None)]*ndim + N = arr.shape[axis] + newshape = list(arr.shape) + + if isinstance(obj, slice): + start, stop, step = obj.indices(N) + xr = range(start, stop, step) + numtodel = len(xr) + + if numtodel <= 0: + return arr.copy() + + # Invert if step is negative: + if step < 0: + step = -step + start = xr[-1] + stop = xr[0] + 1 + + newshape[axis] -= numtodel + new = np.empty(newshape, arr.dtype) + # copy initial chunk + if start == 0: + pass + else: + slobj[axis] = slice(None, start) + new[tuple(slobj)] = arr[tuple(slobj)] + # copy end chunk + if stop == N: + pass + else: + slobj[axis] = slice(stop-numtodel, None) + slobj2 = [slice(None)]*ndim + slobj2[axis] = slice(stop, None) + new[tuple(slobj)] = arr[tuple(slobj2)] + # copy middle pieces + if step == 1: + pass + else: # use array indexing. + keep = np.ones(stop-start, dtype=np.dtype.bool) + keep[:stop-start:step] = False + slobj[axis] = slice(start, stop-numtodel) + slobj2 = [slice(None)]*ndim + slobj2[axis] = slice(start, stop) + arr = arr[tuple(slobj2)] + slobj2[axis] = keep + new[tuple(slobj)] = arr[tuple(slobj2)] + return new + + if isinstance(obj, int) and not isinstance(obj, bool): + single_value = True + else: + single_value = False + _obj = obj + obj = np.asarray(obj) + # `size == 0` to allow empty lists similar to indexing, but (as there) + # is really too generic: + if obj.size == 0 and not isinstance(_obj, np.NDArray): + obj = obj.astype(np.dtype.int) + elif obj.size == 1 and obj.dtype.kind in "ui": + # For a size 1 integer array we can use the single-value path + # (most dtypes, except boolean, should just fail later). + obj = obj.item() + single_value = True + + if single_value: + # optimization for a single value + if (obj < -N or obj >= N): + raise IndexError( + "index %i is out of bounds for axis %i with " + "size %i" % (obj, axis, N)) + if (obj < 0): + obj += N + newshape[axis] -= 1 + new = np.empty(newshape, arr.dtype,) + slobj[axis] = slice(None, obj) + new[tuple(slobj)] = arr[tuple(slobj)] + slobj[axis] = slice(obj, None) + slobj2 = [slice(None)]*ndim + slobj2[axis] = slice(obj+1, None) + new[tuple(slobj)] = arr[tuple(slobj2)] + else: + if obj.dtype == np.dtype.bool: + if obj.shape != (N,): + raise ValueError('boolean array argument obj to delete ' + 'must be one dimensional and match the axis ' + 'length of {}'.format(N)) + + # optimization, the other branch is slower + keep = ~obj + else: + keep = np.ones(N, dtype=np.dtype.bool) + keep[obj,] = False + + slobj[axis] = keep + new = arr[tuple(slobj)] + + return new + +def insert(arr, obj, values, axis=None): + """ + Insert values along the given axis before the given indices. + + Parameters + ---------- + arr : array_like + Input array. + obj : int, slice or sequence of ints + Object that defines the index or indices before which `values` is + inserted. + + Support for multiple insertions when `obj` is a single scalar or a + sequence with one element (similar to calling insert multiple + times). + values : array_like + Values to insert into `arr`. If the type of `values` is different + from that of `arr`, `values` is converted to the type of `arr`. + `values` should be shaped so that ``arr[...,obj,...] = values`` + is legal. + axis : int, optional + Axis along which to insert `values`. If `axis` is None then `arr` + is flattened first. + + Returns + ------- + out : ndarray + A copy of `arr` with `values` inserted. Note that `insert` + does not occur in-place: a new array is returned. If + `axis` is None, `out` is a flattened array. + + See Also + -------- + append : Append elements at the end of an array. + concatenate : Join a sequence of arrays along an existing axis. + delete : Delete elements from an array. + + Notes + ----- + Note that for higher dimensional inserts ``obj=0`` behaves very different + from ``obj=[0]`` just like ``arr[:,0,:] = values`` is different from + ``arr[:,[0],:] = values``. + + Examples + -------- + >>> a = np.array([[1, 1], [2, 2], [3, 3]]) + >>> a + array([[1, 1], + [2, 2], + [3, 3]]) + >>> np.insert(a, 1, 5) + array([1, 5, 1, ..., 2, 3, 3]) + >>> np.insert(a, 1, 5, axis=1) + array([[1, 5, 1], + [2, 5, 2], + [3, 5, 3]]) + + Difference between sequence and scalars: + + >>> np.insert(a, [1], [[1],[2],[3]], axis=1) + array([[1, 1, 1], + [2, 2, 2], + [3, 3, 3]]) + >>> np.array_equal(np.insert(a, 1, [1, 2, 3], axis=1), + ... np.insert(a, [1], [[1],[2],[3]], axis=1)) + True + + >>> b = a.flatten() + >>> b + array([1, 1, 2, 2, 3, 3]) + >>> np.insert(b, [2, 2], [5, 6]) + array([1, 1, 5, ..., 2, 3, 3]) + + >>> np.insert(b, slice(2, 4), [5, 6]) + array([1, 1, 5, ..., 2, 3, 3]) + + >>> np.insert(b, [2, 2], [7.13, False]) # type casting + array([1, 1, 7, ..., 2, 3, 3]) + + >>> x = np.arange(8).reshape(2, 4) + >>> idx = (1, 3) + >>> np.insert(x, idx, 999, axis=1) + array([[ 0, 999, 1, 2, 999, 3], + [ 4, 999, 5, 6, 999, 7]]) + + """ + arr = np.asarray(arr) + ndim = arr.ndim + if axis is None: + if ndim != 1: + arr = arr.ravel() + # needed for np.matrix, which is still not 1d after being ravelled + ndim = arr.ndim + axis = ndim - 1 + else: + axis = np.normalize_axis_index(axis, ndim) + slobj = [slice(None)]*ndim + N = arr.shape[axis] + newshape = list(arr.shape) + + if isinstance(obj, slice): + # turn it into a range object + indices = np.arange(*obj.indices(N), dtype=np.dtype.int) + else: + # need to copy obj, because indices will be changed in-place + indices = np.array(obj).copy() + if indices.dtype == np.dtype.bool: + # See also delete + warnings.warn( + "in the future insert will treat boolean arrays and " + "array-likes as a boolean index instead of casting it to " + "integer", FutureWarning, stacklevel=2) + indices = indices.astype(np.dtype.int) + elif indices.ndim > 1: + raise ValueError( + "index array argument obj to insert must be one dimensional " + "or scalar") + if indices.size == 1: + index = indices.item() + if index < -N or index > N: + raise IndexError("index {} is out of bounds for axis {} with size {}". + format(obj, axis, N)) + if (index < 0): + index += N + + # There are some object array corner cases here, but we cannot avoid + # that: + values = np.array(values, copy=False, ndmin=arr.ndim, dtype=arr.dtype) + if indices.ndim == 0: + # broadcasting is very different here, since a[:,0,:] = ... behaves + # very different from a[:,[0],:] = ...! This changes values so that + # it works likes the second case. (here a[:,0:1,:]) + values = np.moveaxis(values, 0, axis) + numnew = values.shape[axis] + newshape[axis] += numnew + new = np.empty(newshape, arr.dtype,) + slobj[axis] = slice(None, index) + new[tuple(slobj)] = arr[tuple(slobj)] + slobj[axis] = slice(index, index+numnew) + new[tuple(slobj)] = values + slobj[axis] = slice(index+numnew, None) + slobj2 = [slice(None)] * ndim + slobj2[axis] = slice(index, None) + new[tuple(slobj)] = arr[tuple(slobj2)] + return new + elif indices.size == 0 and not isinstance(obj, np.NDArray): + # Can safely cast the empty list to intp + indices = indices.astype(np.dtype.int) + + indices[indices < 0] += N + + numnew = len(indices) + #order = indices.argsort(kind='mergesort') # stable sort + order = np.argsort(indices) + indices[order] += np.arange(numnew) + + newshape[axis] += numnew + old_mask = np.ones(newshape[axis], dtype=np.dtype.bool) + old_mask[indices] = False + + new = np.empty(newshape, arr.dtype) + slobj2 = [slice(None)]*ndim + slobj[axis] = indices + slobj2[axis] = old_mask + new[tuple(slobj)] = values + new[tuple(slobj2)] = arr + + return new diff --git a/meteoinfo-lab/pylib/mipylib/plotlib/plotutil$py.class b/meteoinfo-lab/pylib/mipylib/plotlib/plotutil$py.class index 4ae7e94b1297280bcd14ce45f1a2b07c1b8715a0..7631d86c9e8d6d029a3233a1c381e7589166c935 100644 GIT binary patch literal 58291 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 literal 58015 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 K@}WI(+W!KV(b=*9 diff --git a/meteoinfo-lab/pylib/mipylib/plotlib/plotutil.py b/meteoinfo-lab/pylib/mipylib/plotlib/plotutil.py index c7cf4614..3ece26d2 100644 --- a/meteoinfo-lab/pylib/mipylib/plotlib/plotutil.py +++ b/meteoinfo-lab/pylib/mipylib/plotlib/plotutil.py @@ -183,8 +183,12 @@ def getcolors(cs, alpha=None): if isinstance(cs[0], int): colors.append(getcolor(cs, alpha)) else: - for c in cs: - colors.append(getcolor(c, alpha)) + if isinstance(alpha, (tuple, list)): + for c, a in zip(cs, alpha): + colors.append(getcolor(c, a)) + else: + for c in cs: + colors.append(getcolor(c, alpha)) else: colors.append(getcolor(cs, alpha)) return colors diff --git a/meteoinfo-math/src/main/java/org/meteoinfo/math/sort/MergeSort.java b/meteoinfo-math/src/main/java/org/meteoinfo/math/sort/MergeSort.java new file mode 100644 index 00000000..c68351f3 --- /dev/null +++ b/meteoinfo-math/src/main/java/org/meteoinfo/math/sort/MergeSort.java @@ -0,0 +1,53 @@ +package org.meteoinfo.math.sort; + +import java.util.Arrays; + +public class MergeSort { + + /** + * Merge sort + * @param sourceArray Source array + * @return Sorted array + * @throws Exception + */ + public int[] sort(int[] sourceArray) throws Exception { + // 对 arr 进行拷贝,不改变参数内容 + int[] arr = Arrays.copyOf(sourceArray, sourceArray.length); + + if (arr.length < 2) { + return arr; + } + int middle = (int) Math.floor(arr.length / 2); + + int[] left = Arrays.copyOfRange(arr, 0, middle); + int[] right = Arrays.copyOfRange(arr, middle, arr.length); + + return merge(sort(left), sort(right)); + } + + protected int[] merge(int[] left, int[] right) { + int[] result = new int[left.length + right.length]; + int i = 0; + while (left.length > 0 && right.length > 0) { + if (left[0] <= right[0]) { + result[i++] = left[0]; + left = Arrays.copyOfRange(left, 1, left.length); + } else { + result[i++] = right[0]; + right = Arrays.copyOfRange(right, 1, right.length); + } + } + + while (left.length > 0) { + result[i++] = left[0]; + left = Arrays.copyOfRange(left, 1, left.length); + } + + while (right.length > 0) { + result[i++] = right[0]; + right = Arrays.copyOfRange(right, 1, right.length); + } + + return result; + } +} diff --git a/meteoinfo-math/src/main/java/org/meteoinfo/math/sort/QuickSort.java b/meteoinfo-math/src/main/java/org/meteoinfo/math/sort/QuickSort.java index a2265f64..5ba540df 100644 --- a/meteoinfo-math/src/main/java/org/meteoinfo/math/sort/QuickSort.java +++ b/meteoinfo-math/src/main/java/org/meteoinfo/math/sort/QuickSort.java @@ -45,7 +45,7 @@ import java.util.Comparator; * always appear before S in the sorted list. *

* For speed of execution, we implement it without recursion. Instead, - * we requires an auxiliary array (stack) of storage, of length + * we require an auxiliary array (stack) of storage, of length * 2 log2 n. When a subarray has gotten down to size 7, * we sort it by straight insertion. * diff --git a/meteoinfo-ndarray/src/main/java/org/meteoinfo/ndarray/ArrayBoolean.java b/meteoinfo-ndarray/src/main/java/org/meteoinfo/ndarray/ArrayBoolean.java index c9e252db..7a1907cd 100644 --- a/meteoinfo-ndarray/src/main/java/org/meteoinfo/ndarray/ArrayBoolean.java +++ b/meteoinfo-ndarray/src/main/java/org/meteoinfo/ndarray/ArrayBoolean.java @@ -305,7 +305,11 @@ public class ArrayBoolean extends Array { } public void setObject(Index i, Object value) { - storage[i.currentElement()] = (Boolean) value; + if (value instanceof Integer) { + storage[i.currentElement()] = ((Integer) value == 1); + } else { + storage[i.currentElement()] = (Boolean) value; + } } // package private : mostly for iterators diff --git a/meteoinfo-ndarray/src/main/java/org/meteoinfo/ndarray/ArrayDouble.java b/meteoinfo-ndarray/src/main/java/org/meteoinfo/ndarray/ArrayDouble.java index 9262c99d..a21c5a8d 100644 --- a/meteoinfo-ndarray/src/main/java/org/meteoinfo/ndarray/ArrayDouble.java +++ b/meteoinfo-ndarray/src/main/java/org/meteoinfo/ndarray/ArrayDouble.java @@ -275,7 +275,11 @@ public class ArrayDouble extends Array { } public void setObject(Index i, Object value) { - storageD[i.currentElement()] = ((Number) value).doubleValue(); + if (value instanceof Boolean) { + storageD[i.currentElement()] = ((Boolean) value) ? 1 : 0; + } else { + storageD[i.currentElement()] = ((Number) value).doubleValue(); + } } // trusted, assumes that individual dimension lengths have been checked @@ -368,7 +372,11 @@ public class ArrayDouble extends Array { } public void setObject(int index, Object value) { - storageD[index] = ((Number) value).doubleValue(); + if (value instanceof Boolean) { + storageD[index] = ((Boolean) value) ? 1 : 0; + } else { + storageD[index] = ((Number) value).doubleValue(); + } } /** diff --git a/meteoinfo-ndarray/src/main/java/org/meteoinfo/ndarray/ArrayInt.java b/meteoinfo-ndarray/src/main/java/org/meteoinfo/ndarray/ArrayInt.java index 294778f1..68e439ea 100644 --- a/meteoinfo-ndarray/src/main/java/org/meteoinfo/ndarray/ArrayInt.java +++ b/meteoinfo-ndarray/src/main/java/org/meteoinfo/ndarray/ArrayInt.java @@ -298,7 +298,11 @@ public class ArrayInt extends Array { } public void setObject(Index i, Object value) { - storage[i.currentElement()] = ((Number) value).intValue(); + if (value instanceof Boolean) { + storage[i.currentElement()] = ((Boolean) value) ? 1 : 0; + } else { + storage[i.currentElement()] = ((Number) value).intValue(); + } } // package private : mostly for iterators @@ -397,7 +401,11 @@ public class ArrayInt extends Array { } public void setObject(int index, Object value) { - storage[index] = ((Number) value).intValue(); + if (value instanceof Boolean) { + storage[index] = ((Boolean) value) ? 1 : 0; + } else { + storage[index] = ((Number) value).intValue(); + } } /** diff --git a/meteoinfo-ndarray/src/main/java/org/meteoinfo/ndarray/Index.java b/meteoinfo-ndarray/src/main/java/org/meteoinfo/ndarray/Index.java index 95fab67f..e896fd66 100644 --- a/meteoinfo-ndarray/src/main/java/org/meteoinfo/ndarray/Index.java +++ b/meteoinfo-ndarray/src/main/java/org/meteoinfo/ndarray/Index.java @@ -672,6 +672,18 @@ public class Index implements Cloneable { return this; } + /** + * Set the current element's index. General-rank case. + * + * @param index set current value to these values + * @return this, so you can use A.get(i.set(i)) + * @throws ArrayIndexOutOfBoundsException if index.length != rank. + */ + public Index set(List indexList) { + int[] index = indexList.stream().mapToInt(Integer::intValue).toArray(); + return set(index); + } + /** * set current element at dimension dim to v * diff --git a/meteoinfo-ndarray/src/main/java/org/meteoinfo/ndarray/MixIterator.java b/meteoinfo-ndarray/src/main/java/org/meteoinfo/ndarray/MixIterator.java index a3a58679..70e1dd7f 100644 --- a/meteoinfo-ndarray/src/main/java/org/meteoinfo/ndarray/MixIterator.java +++ b/meteoinfo-ndarray/src/main/java/org/meteoinfo/ndarray/MixIterator.java @@ -1,6 +1,9 @@ package org.meteoinfo.ndarray; +import org.meteoinfo.ndarray.math.ArrayUtil; + import java.time.LocalDateTime; +import java.util.ArrayList; import java.util.List; public class MixIterator implements IndexIterator { @@ -29,7 +32,21 @@ public class MixIterator implements IndexIterator { if (range instanceof Range) { shape[i] = ((Range) range).length(); } else { - shape[i] = ((List) range).size(); + Array arr = (Array) range; + if (arr.getDataType() == DataType.BOOLEAN) { + List tList = new ArrayList<>(); + IndexIterator iter = arr.getIndexIterator(); + int j = 0; + while (iter.hasNext()) { + if (iter.getBooleanNext()) { + tList.add(j); + } + j += 1; + } + arr = ArrayUtil.array_list(tList, DataType.INT); + this.ranges.set(i, arr); + } + shape[i] = (int) arr.getSize(); } i += 1; } @@ -297,9 +314,9 @@ public class MixIterator implements IndexIterator { int c; for (Object range : this.ranges) { if (range instanceof Range) { - c = ((Range)range).elementNC(rangeCounter[i]); + c = ((Range) range).elementNC(rangeCounter[i]); } else { - c = ((List)range).get(rangeCounter[i]); + c = ((Array) range).getInt(rangeCounter[i]); } currentCounter[i] = c; i += 1; diff --git a/meteoinfo-ndarray/src/main/java/org/meteoinfo/ndarray/math/ArrayMath.java b/meteoinfo-ndarray/src/main/java/org/meteoinfo/ndarray/math/ArrayMath.java index eaceb98d..2a011aa2 100644 --- a/meteoinfo-ndarray/src/main/java/org/meteoinfo/ndarray/math/ArrayMath.java +++ b/meteoinfo-ndarray/src/main/java/org/meteoinfo/ndarray/math/ArrayMath.java @@ -6022,11 +6022,11 @@ public class ArrayMath { public static Array setSection(Array a, List ranges, Array v) throws InvalidRangeException { Array r = a.section(ranges); IndexIterator iter = r.getIndexIterator(); - if (r.getSize() != v.getSize()) { + /*if (r.getSize() != v.getSize()) { if (r.getShape() != v.getShape()) { v = ArrayUtil.broadcast(v, r.getShape()); } - } + }*/ Index index = v.getIndex(); while (iter.hasNext()) { iter.setObjectNext(v.getObject(index)); @@ -6207,18 +6207,34 @@ public class ArrayMath { * @param v Number value * @return Result array */ - public static Array setSection_List(Array a, List> ranges, Number v) { + public static Array setSection_List(Array a, List ranges, Number v) { //Array r = copy(a); int n = a.getRank(); int[] count = new int[n]; Index index = a.getIndex(); - int m = ranges.get(0).size(); - for (int i = 0; i < m; i++) { - for (int j = 0; j < n; j++) { - count[j] = ranges.get(j).get(i); + int m = (int) ranges.get(0).getSize(); + if (ranges.get(0).getDataType() == DataType.BOOLEAN) { + for (int i = 0; i < m; i++) { + boolean bool = true; + for (int j = 0; j < n; j++) { + if (!ranges.get(j).getBoolean(i)) { + bool = false; + break; + } + } + if (bool) { + a.setObject(index, v); + } + index.incr(); + } + } else { + for (int i = 0; i < m; i++) { + for (int j = 0; j < n; j++) { + count[j] = ranges.get(j).getInt(i); + } + index.set(count); + a.setObject(index, v); } - index.set(count); - a.setObject(index, v); } return a; @@ -6232,20 +6248,37 @@ public class ArrayMath { * @param v Array value * @return Result array */ - public static Array setSection_List(Array a, List> ranges, Array v) { + public static Array setSection_List(Array a, List ranges, Array v) { //Array r = copy(a); int n = a.getRank(); int[] count = new int[n]; Index index = a.getIndex(); Index vIndex = v.getIndex(); - int m = ranges.get(0).size(); - for (int i = 0; i < m; i++) { - for (int j = 0; j < n; j++) { - count[j] = ranges.get(j).get(i); + int m = (int) ranges.get(0).getSize(); + if (ranges.get(0).getDataType() == DataType.BOOLEAN) { + for (int i = 0; i < m; i++) { + boolean bool = true; + for (int j = 0; j < n; j++) { + if (!ranges.get(j).getBoolean(i)) { + bool = false; + break; + } + } + if (bool) { + a.setObject(index, v.getObject(vIndex)); + vIndex.incr(); + } + index.incr(); + } + } else { + for (int i = 0; i < m; i++) { + for (int j = 0; j < n; j++) { + count[j] = ranges.get(j).getInt(i); + } + index.set(count); + a.setObject(index, v.getObject(vIndex)); + vIndex.incr(); } - index.set(count); - a.setObject(index, v.getObject(vIndex)); - vIndex.incr(); } return a; diff --git a/meteoinfo-ndarray/src/main/java/org/meteoinfo/ndarray/math/ArrayUtil.java b/meteoinfo-ndarray/src/main/java/org/meteoinfo/ndarray/math/ArrayUtil.java index 91541f41..cb43b3a8 100644 --- a/meteoinfo-ndarray/src/main/java/org/meteoinfo/ndarray/math/ArrayUtil.java +++ b/meteoinfo-ndarray/src/main/java/org/meteoinfo/ndarray/math/ArrayUtil.java @@ -1633,6 +1633,12 @@ public class ArrayUtil { StringBuilder sbuff = new StringBuilder(); sbuff.append("array("); int ndim = a.getRank(); + if (ndim == 0) { + sbuff.append(a.getObject(0)); + sbuff.append(")"); + return sbuff.toString(); + } + if (ndim > 1) { for (int i = 0; i < ndim - 1; i++) sbuff.append("[");