From b6a3a255574ba905764c7e1679c2c764fbc47570 Mon Sep 17 00:00:00 2001 From: Rob McDonald Date: Tue, 1 Oct 2019 18:24:46 -0700 Subject: [PATCH] TickedStroke, a stroke style with ticks useful for depicting constraints. In optimization, constraints are frequently plotted with a ticked line -- where the ticks indicate that one side of the line is invalid. TickedStroke implements a PathEffect to draw lines with a ticked style. The spacing, length, and angle of ticks can be controlled. --- .../contours_in_optimization_demo.py | 64 ++++++++ .../lines_with_ticks_demo.py | 29 ++++ examples/misc/tickedstroke_demo.py | 99 ++++++++++++ lib/matplotlib/patheffects.py | 147 ++++++++++++++++++ .../test_patheffects/tickedstroke.png | Bin 0 -> 66602 bytes lib/matplotlib/tests/test_patheffects.py | 56 +++++++ 6 files changed, 395 insertions(+) create mode 100644 examples/images_contours_and_fields/contours_in_optimization_demo.py create mode 100644 examples/lines_bars_and_markers/lines_with_ticks_demo.py create mode 100644 examples/misc/tickedstroke_demo.py create mode 100644 lib/matplotlib/tests/baseline_images/test_patheffects/tickedstroke.png diff --git a/examples/images_contours_and_fields/contours_in_optimization_demo.py b/examples/images_contours_and_fields/contours_in_optimization_demo.py new file mode 100644 index 000000000000..ab7fa019602f --- /dev/null +++ b/examples/images_contours_and_fields/contours_in_optimization_demo.py @@ -0,0 +1,64 @@ +""" +============================================== +Contouring the solution space of optimizations +============================================== + +Contour plotting is particularly handy when illustrating the solution +space of optimization problems. Not only can `.axes.Axes.contour` be +used to represent the topography of the objective function, it can be +used to generate boundary curves of the constraint functions. The +constraint lines can be drawn with +`~matplotlib.patheffects.TickedStroke` to distinguish the valid and +invalid sides of the constraint boundaries. + +`.axes.Axes.contour` generates curves with larger values to the left +of the contour. The angle parameter is measured zero ahead with +increasing values to the left. Consequently, when using +`~matplotlib.patheffects.TickedStroke` to illustrate a constraint in +a typical optimization problem, the angle should be set between +zero and 180 degrees. + +""" + +import numpy as np +import matplotlib.pyplot as plt +import matplotlib.patheffects as patheffects + +fig, ax = plt.subplots(figsize=(6, 6)) + +nx = 101 +ny = 105 + +# Set up survey vectors +xvec = np.linspace(0.001, 4.0, nx) +yvec = np.linspace(0.001, 4.0, ny) + +# Set up survey matrices. Design disk loading and gear ratio. +x1, x2 = np.meshgrid(xvec, yvec) + +# Evaluate some stuff to plot +obj = x1**2 + x2**2 - 2*x1 - 2*x2 + 2 +g1 = -(3*x1 + x2 - 5.5) +g2 = -(x1 + 2*x2 - 4) +g3 = 0.8 + x1**-3 - x2 + +cntr = ax.contour(x1, x2, obj, [0.01, 0.1, 0.5, 1, 2, 4, 8, 16], + colors=('k',)) +ax.clabel(cntr, fmt="%2.1f", use_clabeltext=True) + +cg1 = ax.contour(x1, x2, g1, [0], colors=('k',)) +plt.setp(cg1.collections, + path_effects=[patheffects.withTickedStroke(angle=135)]) + +cg2 = ax.contour(x1, x2, g2, [0], colors=('r',)) +plt.setp(cg2.collections, + path_effects=[patheffects.withTickedStroke(angle=60, length=2)]) + +cg3 = ax.contour(x1, x2, g3, [0], colors=('b',)) +plt.setp(cg3.collections, + path_effects=[patheffects.withTickedStroke(spacing=7)]) + +ax.set_xlim(0, 4) +ax.set_ylim(0, 4) + +plt.show() diff --git a/examples/lines_bars_and_markers/lines_with_ticks_demo.py b/examples/lines_bars_and_markers/lines_with_ticks_demo.py new file mode 100644 index 000000000000..c7b902f09ddf --- /dev/null +++ b/examples/lines_bars_and_markers/lines_with_ticks_demo.py @@ -0,0 +1,29 @@ +""" +============================== +Lines with a ticked patheffect +============================== + +Ticks can be added along a line to mark one side as a barrier using +`~matplotlib.patheffects.TickedStroke`. You can control the angle, +spacing, and length of the ticks. + +The ticks will also appear appropriately in the legend. + +""" + +import numpy as np +import matplotlib.pyplot as plt +from matplotlib import patheffects + +fig, ax = plt.subplots(figsize=(6, 6)) +ax.plot([0, 1], [0, 1], label="Line", + path_effects=[patheffects.withTickedStroke(spacing=7, angle=135)]) + +nx = 101 +x = np.linspace(0.0, 1.0, nx) +y = 0.3*np.sin(x*8) + 0.4 +ax.plot(x, y, label="Curve", path_effects=[patheffects.withTickedStroke()]) + +ax.legend() + +plt.show() diff --git a/examples/misc/tickedstroke_demo.py b/examples/misc/tickedstroke_demo.py new file mode 100644 index 000000000000..2079e40285a4 --- /dev/null +++ b/examples/misc/tickedstroke_demo.py @@ -0,0 +1,99 @@ +""" +======================= +TickedStroke patheffect +======================= + +Matplotlib's :mod:`.patheffects` can be used to alter the way paths +are drawn at a low enough level that they can affect almost anything. + +The :doc:`patheffects guide` +details the use of patheffects. + +The `~matplotlib.patheffects.TickedStroke` patheffect illustrated here +draws a path with a ticked style. The spacing, length, and angle of +ticks can be controlled. + +See also the :doc:`contour demo example +`. + +See also the :doc:`contours in optimization example +`. +""" + +import matplotlib.patches as patches +from matplotlib.path import Path +import numpy as np +import matplotlib.pyplot as plt +import matplotlib.patheffects as patheffects + +# Direct to path +fig, ax = plt.subplots(figsize=(6, 6)) +path = Path.unit_circle() +patch = patches.PathPatch(path, facecolor='none', lw=2, path_effects=[ + patheffects.withTickedStroke(angle=-90, spacing=10, length=1)]) + +ax.add_patch(patch) +ax.axis('equal') +ax.set_xlim(-2, 2) +ax.set_ylim(-2, 2) + +plt.show() + +############################################################################### +# Lines and curves with plot and legend +fig, ax = plt.subplots(figsize=(6, 6)) +ax.plot([0, 1], [0, 1], label="Line", + path_effects=[patheffects.withTickedStroke(spacing=7, angle=135)]) + +nx = 101 +x = np.linspace(0.0, 1.0, nx) +y = 0.3*np.sin(x*8) + 0.4 +ax.plot(x, y, label="Curve", path_effects=[patheffects.withTickedStroke()]) + +ax.legend() + +plt.show() + +############################################################################### +# Contour plot with objective and constraints. +# Curves generated by contour to represent a typical constraint in an +# optimization problem should be plotted with angles between zero and +# 180 degrees. +fig, ax = plt.subplots(figsize=(6, 6)) + +nx = 101 +ny = 105 + +# Set up survey vectors +xvec = np.linspace(0.001, 4.0, nx) +yvec = np.linspace(0.001, 4.0, ny) + +# Set up survey matrices. Design disk loading and gear ratio. +x1, x2 = np.meshgrid(xvec, yvec) + +# Evaluate some stuff to plot +obj = x1**2 + x2**2 - 2*x1 - 2*x2 + 2 +g1 = -(3*x1 + x2 - 5.5) +g2 = -(x1 + 2*x2 - 4) +g3 = 0.8 + x1**-3 - x2 + +cntr = ax.contour(x1, x2, obj, [0.01, 0.1, 0.5, 1, 2, 4, 8, 16], + colors=('k',)) +ax.clabel(cntr, fmt="%2.1f", use_clabeltext=True) + +cg1 = ax.contour(x1, x2, g1, [0], colors='black') +plt.setp(cg1.collections, + path_effects=[patheffects.withTickedStroke(angle=135)]) + +cg2 = ax.contour(x1, x2, g2, [0], colors='red') +plt.setp(cg2.collections, + path_effects=[patheffects.withTickedStroke(angle=60, length=2)]) + +cg3 = ax.contour(x1, x2, g3, [0], colors='blue') +plt.setp(cg3.collections, + path_effects=[patheffects.withTickedStroke(spacing=7)]) + +ax.set_xlim(0, 4) +ax.set_ylim(0, 4) + +plt.show() diff --git a/lib/matplotlib/patheffects.py b/lib/matplotlib/patheffects.py index 5b573c6fe8fc..76544f561bed 100644 --- a/lib/matplotlib/patheffects.py +++ b/lib/matplotlib/patheffects.py @@ -10,6 +10,8 @@ from matplotlib import colors as mcolors from matplotlib import patches as mpatches from matplotlib import transforms as mtransforms +from matplotlib.path import Path +import numpy as np class AbstractPathEffect: @@ -371,3 +373,148 @@ def draw_path(self, renderer, gc, tpath, affine, rgbFace): if clip_path: self.patch.set_clip_path(*clip_path) self.patch.draw(renderer) + + +class TickedStroke(AbstractPathEffect): + """ + A line-based PathEffect which draws a path with a ticked style. + + This line style is frequently used to represent constraints in + optimization. The ticks may be used to indicate that one side + of the line is invalid or to represent a closed boundary of a + domain (i.e. a wall or the edge of a pipe). + + The spacing, length, and angle of ticks can be controlled. + + This line style is sometimes referred to as a hatched line. + + See also the :doc:`contour demo example + `. + + See also the :doc:`contours in optimization example + `. + """ + + def __init__(self, offset=(0, 0), + spacing=10.0, angle=45.0, length=np.sqrt(2), + **kwargs): + """ + Parameters + ---------- + offset : pair of floats, default: (0, 0) + The offset to apply to the path, in points. + spacing : float, default: 10.0 + The spacing between ticks in points. + angle : float, default: 45.0 + The angle between the path and the tick in degrees. The angle + is measured as if you were an ant walking along the curve, with + zero degrees pointing directly ahead, 90 to your left, -90 + to your right, and 180 behind you. + length : float, default: 1.414 + The length of the tick relative to spacing. + Recommended length = 1.414 (sqrt(2)) when angle=45, length=1.0 + when angle=90 and length=2.0 when angle=60. + **kwargs + Extra keywords are stored and passed through to + :meth:`AbstractPathEffect._update_gc`. + + Examples + -------- + See :doc:`/gallery/misc/tickedstroke_demo`. + """ + super().__init__(offset) + + self._spacing = spacing + self._angle = angle + self._length = length + self._gc = kwargs + + def draw_path(self, renderer, gc, tpath, affine, rgbFace): + """ + Draw the path with updated gc. + """ + # Do not modify the input! Use copy instead. + gc0 = renderer.new_gc() + gc0.copy_properties(gc) + + gc0 = self._update_gc(gc0, self._gc) + trans = affine + self._offset_transform(renderer) + + theta = -np.radians(self._angle) + trans_matrix = np.array([[np.cos(theta), -np.sin(theta)], + [np.sin(theta), np.cos(theta)]]) + + # Convert spacing parameter to pixels. + spcpx = renderer.points_to_pixels(self._spacing) + + # Transform before evaluation because to_polygons works at resolution + # of one -- assuming it is working in pixel space. + transpath = affine.transform_path(tpath) + + # Evaluate path to straight line segments that can be used to + # construct line ticks. + polys = transpath.to_polygons(closed_only=False) + + for p in polys: + x = p[:, 0] + y = p[:, 1] + + # Can not interpolate points or draw line if only one point in + # polyline. + if x.size < 2: + continue + + # Find distance between points on the line + ds = np.hypot(x[1:] - x[:-1], y[1:] - y[:-1]) + + # Build parametric coordinate along curve + s = np.concatenate(([0.0], np.cumsum(ds))) + stot = s[-1] + + num = int(np.ceil(stot / spcpx))-1 + # Pick parameter values for ticks. + s_tick = np.linspace(spcpx/2, stot-spcpx/2, num) + + # Find points along the parameterized curve + x_tick = np.interp(s_tick, s, x) + y_tick = np.interp(s_tick, s, y) + + # Find unit vectors in local direction of curve + delta_s = self._spacing * .001 + u = (np.interp(s_tick + delta_s, s, x) - x_tick) / delta_s + v = (np.interp(s_tick + delta_s, s, y) - y_tick) / delta_s + + # Normalize slope into unit slope vector. + n = np.hypot(u, v) + mask = n == 0 + n[mask] = 1.0 + + uv = np.array([u / n, v / n]).T + uv[mask] = np.array([0, 0]).T + + # Rotate and scale unit vector into tick vector + dxy = np.dot(uv, trans_matrix) * self._length * spcpx + + # Build tick endpoints + x_end = x_tick + dxy[:, 0] + y_end = y_tick + dxy[:, 1] + + # Interleave ticks to form Path vertices + xyt = np.empty((2 * num, 2), dtype=x_tick.dtype) + xyt[0::2, 0] = x_tick + xyt[1::2, 0] = x_end + xyt[0::2, 1] = y_tick + xyt[1::2, 1] = y_end + + # Build up vector of Path codes + codes = np.tile([Path.MOVETO, Path.LINETO], num) + + # Construct and draw resulting path + h = Path(xyt, codes) + # Transform back to data space during render + renderer.draw_path(gc0, h, affine.inverted() + trans, rgbFace) + + gc0.restore() + + +withTickedStroke = _subclass_with_normal(effect_class=TickedStroke) diff --git a/lib/matplotlib/tests/baseline_images/test_patheffects/tickedstroke.png b/lib/matplotlib/tests/baseline_images/test_patheffects/tickedstroke.png new file mode 100644 index 0000000000000000000000000000000000000000..60af86eaadcb2a4ead0e4155b6127befc9af08b3 GIT binary patch literal 66602 zcmeFZWmJ`0^fwA9A|XgO2og#+0s?}7fHX)*x0H03lyr&GAtEA@TSPjPZV)L!y1P5> z+~=JC`@ZAeFZb&m8oM~y+Pm0VncQ(RcXGC}f62?i!@NabVr?wAg;I?gC4 zc*e*t)X(C1Rw$?_C~{H~8XoEEf89NzmuTB|j^s=jHN)aZa}J~GY>2WYRckb&Ny_Cn zbaE|v8Vq;_R zC<0!>&V|QXX;B6mu$}EOs=;#rRf#}#T{(Q?XHX54LPT{@Q zO88`RqDuT&Sii>2e0>xV|CVL<{#2W4eJtVlUWS-&szpyKx_DMIN&LY%nZEQkwN#|NO~^ z_Q{Eul3oYtcw)TN@Sdp)@n3%qaT!}*Tf~8*#JZPlfhKuNJgtAQOtjH3o2a-rs0 zjel#V=LiqmigdTP>E3eOY6@*am=610M;Mk{521{f8ee1A{qD0?S;QViZ9`OC?G|D? zcE?x}JCq1NJV>LF03Tk6SDo*SM>w{R{Li%CFig+ypWb~+(*6!Rkt0MQB}zw2;E(tO zeR_JjZ018D8XB5xl2U_}3348bV9ti%k8HY&i7iJ zrZUhYq}Yi|8U9#LR3ggn)+X)xQZ1Z4=wu#HwY_wYEsACTF2)g-8CxVBxgCv-6U?MI zJu5w0_N0Z?=CeVaFd>t|^q+DYg{;gFRxP7bmoVC^4TO->s}jyyj~zFlH~xqDesPY@?lqTj{7kDgZEu@L|M@~_c_m-cs@ z-K7e*)XJ6Jg|5-j(YS{v8YCRSEs@zWw>SDUTEwl?qK88M9ZSn%Pny-Q>jHLxO`+KeuEDbHz^6%aVo_~Mc}ki+|2L_WRz#Q=Q_mC(;({hIa^US_6*@LQAu+Xo|t2_k~) z;}}`~xC>pBPapoBFz9Qn_MfUAla?|OAudJM0fQP`>-5@M7wqfy43UcRx#oL$%2}Ua zzvECX2Ne}zX%9~?Ej`H+^Zl$_!C~H&i2nY?zy}Wx59Ig17RPjJeH1mC@^R5~F3+!s z8ip4)62oLQ)c-9q`e)Dv99><@-J-}kCMW-3&K5h)wa#p8^n~Hx4cu~eb~gPPjCuX~ zbt6m5T308BSH!IEoh^?Kbt`?y2^f);%J3yWyyl-Gnd4IV}2MTZO)Te8nf=?_^pPk%OX>&UypiHlXebYDwkQ*AD@N# zMHAiseeIvSha!L%iF)Ps+N1=ndb4~S%H=tsQidA-Q?ZHfcH`PLZtP8=c+3)k*X^kV zQ;a%^NZ$)RO=9|}S=8@8Ohr9&dGWcAm7X9e|G)2aaB&o`-przjBVexy-$Ow~<@Vni z_dK(XH$Eo|Nn2D&!mid4B%+EZyG^4Nc%AQpCoOBeYHIuu0ga zmj`m9$a!xhbnH(eh6=Qnj&~626Xfkd7%E>GJiO|~HkUucTmDx$6iQ07AxI1j4Nv!1 z9$%au+}E#mNuDb+>-c$bcI3IgY=5{B^gBP>R%i5E$Ae32Ok*=!r91TW+5c5jp$xqJ zHNvzF_5t;4JX)GX?Xt1%bRp-`@^bUJ*67O0#@>upwV$c{#)q~!uMT!|-RPlt%Kryo zp24~&x~vVe!&`fgru>z^+m8LDYOo$+aohMKJ@(antkUr=N;qNDmuLN7h<)~M73x|> z4e?0AjsJ&-v@_tw@7K6*wf^`K;CFEvA~ZZTl|>`!rBd{q|M_>@4k*n^=OtVeH#aVG ztSBDE|+25-FZio-)#E51Bm}q^uPm^Th>7|oR^OQ0=L$I~-wd{Fd2{CSF zhM*hqkc$_XwvrjzAUD%*M41~3vipaR`}odulh3)W{F0F{nwPEgr4)7-h`5e#Zev5# z^ru45i&!!J1>2dIda<67{ngG1<01mDP5d0ngZ!ZfmwA^`j@@|SL<3$3b`4CkA6kaK z#3t)nh7uJokxL}S_+QO_=}ixym!7Qmzx0`#GxhY648gLW@;~OPtoA!UV05DpuqE^J z^JCLdi_TZi*5bUU=Yd5j;G<+@bm#l`?>|fvm<9jsU9SJN(}K=-UH6zSM)sECxMtc6 zuk=Sc-mT4*upgRt;Skv6TBt?awZh!M{+S~i;zv{e?rqAk6Zlq`Q{Qj&O^GPww2`;v>R*YF1 zs|N;WxV-f&$3Kl=w*(3e>W#qf^2Cygib|5o*|{v&dMK;Py)W?%V{|l{fuoBCvhA?^ zw_WJbl6x$wUDsp+(9ognNq;t_5bOV zOya1!6jn^-o2YS*g~c)Dk!bL1Wh;Dt2m3V%ez@s>k1+nh#!{C5;zCyv4$Z^kB2x*8 z{sK}WPTU$d33%)c7l)Ma=xzUeyYHdb@urnPvTW>42XsN)e=ACgp|{#)g@BM*>7!*| z=10Y}!=gC>fl_nq`93_j`iiN`o^V3u&nnqylmfOlX_l661_W%+hcgaFhBZ_FuVr#Q z-Ztj3>{Y0E`FB!?$z0x)+&F>hvO8TTW}-@~ztT}1m+HZ**jVLlvRB?mZ1K;f7&iag zbyBm1oDJu1{4Y;1yuHtkVj^j2znYz(>yBrp3#q3Ovr?D}Fk>0W9DfNo%Mek`(Ei^; zKx&pxq^4BR^62o;;`irxmkkP7Z>GyrR{U@RYO|AFUzCsX=211?f-DIUVa@u+;_8t; z?_mnRVbl3~`-uPLL~?61rSARsFsUbzq?{Hzvn_O+-uuh(?|y~J+8PU_Rb8wLSP?e- z9lXajsa)%*G)sk^&%ictaxnJ_^_pzl9aQAj7{EVV57=GM*RJ|1h=F%Q^>ZAz;3IT4 z=*J_mjtN-W1m>+V)R6@R1?8q;vV5d}C=>2JiBb6|i_gkP5TD#@D=_H!*fKH8pf?5A zQufUqxynB3DocjP?za}qY7)$36X~$jl*+ zymnepD|>;@pj-^yoN@WUbmAjpFmgi?*wnHZC_dzhM_s^>s`MCgeyUvkc3JZD<4O)! zZZn^#*Zv)w;X>U?O}s|E zHa+vW(yd2W=>GsVt?E1SA0(kXk>gDvWw-G80lN2Lt!QgcPxLj6!-4!k(Jz`ImVInl z>QW3GD*rZU6F%Y+hA+TjLSZqs2bE1Lom!-F&$WEau zjn4K@SC7}Iee;>mYyZXOR6}2>aT7`yEv-dQApTvWWtA7Bw|#u05iei9v>h!)WzM^^ zIe{>Ffgi7}@ZXyqk#C+~SZMjInzKAn#hb!wiCaHq7Dyv%bmFAlK*OSeVs9^-{(#$k zYjR;{?&Ml* z(tgW)zGpniv`ygJY7l@~;{P5snM4aKB6x49PrXo^yZ%C8J*(t8=H||PIIB)s=8r+= zJDHh6D8DhF4P*V+@&_^_v`p?FtPYt@)%!NXR_aEGU!C&?1SpTziHJ`5UtM3uZY;{b- zUIn`cM+;GXDJro=Vr8k}7*HR!v=OSH5S^Fzb^Fj=+_Oq>6VW%`-zhO3L% zwUH8Dr+L{3l8|c{jUAZsNw4{BqPSZk%x|b6JohYYWQg&@{|8gxV+MhqfvkZkzccnK zC-N@k!MsrYn(4B>_ilE_2U^GTgir2p+YH;5zchmVB7+>!$k$IUv-aD8fq`TX9E`%w zsHtF^ERT~`yYjlRTpz96xhWwbF*^F9_f?pzS$|pnKg^@uJ6*&*rXzuQFi)9QEl=rU z*pZU*c!4xol=8bR_hyavNH>5|HcAaC29p1vs?@xw*THH?WF$6FM~kIi_t>*jn`F^( zJQT{bZ?Khr@SwtYL_q=pd_?L0tAWw1j}$>#B8b_vOJ5BY5Dt9AJl`kWU&CM;9G_Fp zpuogoaNor8@F@JGoFzum$3{;;`45IMF*a?BX&D+C`ok^7kcwSY>O0?#A3=2ABv;CD z5H`GnvvUr#tYig;9s2z(Jj>q3?i9djYY4%Y6GrF9_|36Xk?BHRU#*|n1KE<@o$n}0 zG?Zfaj%=9pLm#9gE8R9Ij1($j??E3(nlAGkWFBhw;>^NQOC4e>{r~Uy;)# zX9q!4Lhq%qf!}EszT&eopk8}2+Z^ub5cXvCw0L{ijR+v$H}gFa34%}-1?2#SpusnWQowL z@60+(qdX9nT=`{De|hTewAd||CSWJ~4r_A~9Y`mPp;u$J-`(`^ z9SLM+KE9{52{Um6`4JP`SlW}5lOA4P&qcn3$wuYTXwws{&oqU8d-<1w3rp^AwQJ-y z|0J8Rr>AE;-Q(9cGqx5Mh<(l;TNuITM*=%`T<)g>nL#>VEtlTs7JOFxwtO$g z2Urb$;`Tjt`SnSWa?@E~U*FNu@kduzB#1h@>tnpYFn;=8wz1LGx^K~-qM|m2@;msK zO=}it7TwGeH)+0^DdsCb{@w2GL=9+i1|q(v-^%YcKRC4~aaPF05x=-Det8_XGv}Y{ zef07p?CR#^*_P-&0|S+EYYV4^&XCYh3>b-Jk|y}^qY?lJwO=%c;qPyZlfD8NaAOJ= zFQG%K=y`dvfE@)iX3MTb_TR<&A`?sg-2^{l?WQle(b>es#bsisIsmtvfSgn1x<(@R zh9TVH27Y{HcSi@Nx3_mHzm3JlJ?=Mkb)rg2N}vH7lX0PRTO6<=ev zafZH}_B`QRtT9N+->tIP|Vo4r6; zP;%}O#iJ!ABoG4503}Gu++E>oUE||v*D!EVRNg;A1=vrOy_dwU+X@$o3OZDA zgcdzL?H$wBsB|%33R>DM*@nYP$5JEI^HbKhoU|)Ru_PdawkLDvl$*+u+1kE$+qiqa zKiJo(_T^b*Tj#qt#;!GPOad|y{QA@J3Fzxpo_kE0nVEm0Rix&xLEj|6Ht&2J-Y0&Q z&Tlj9aB=Di6-1g%uaPVNuC$_}ZDb?~{`@u>Sy)k#U1e`M0zqf@=i5Z3W77xTQsh5{ z?dV3E{?OBDd*g6p{K>HoK0Y_-Jv%`WToMx7%lOB~wHF9;Y}-F(L z!$p*yyA#GUl7t7V5(tx0TXGFAQy$G~7a7#G&A&CkDz1x&h(P~AcCmI0KspSG)>HMO zfU;4eW)-Bcv@r>pKEm!P)J6n?P~kM)hzhDD@#bDeMn;w6+zrssi~&OZtNBGXG>Ai4 zBK0>@)1ZtDYIpu^7Et?LHAJk2%#&jvpCKk1vgm2bFLVvE9rN))6af_b<|~NknR>FaHW- z5r3VVmU!{|CSY%F)2J-<1WY}>D8}F*47^q|9@Ts`#)l6dE{~PvmD2`7^ZSUFD9iS& z-1^y9i=Ix#@s7wqvLq;Xm0=$P;#=?GaN}J5cT!-wv)BwTv&$E5k%qr zN2xsK^8Y-zHN~oS@9u{@3HhOUPBmwCHc#TomiMhp$=@d=?8J+S60z)`u3h;}RHGBK zyh=+`J^nRVCWQg|Ye~Z;1xyMQwU4h3)<7g#{)G-oV7_`Z+VGDcze0VHcQC}_A2^x_ zyKiz%Xg&>4wJ=!JC;iMeypktDewI}zPi3x1l!v2%Xn zj3Rb*?rdvo`}4w==AlO;%ySgkRKEM52!y9&+?o0Av13BQX+Skw4}zu6{pjF@<_tn2 zS@p(0+zhX+2Yw#kj2*AYR-$fCCkGSa<~OIeWNb{ee&^?VeJAksc*4>WBj*Vv`j~)S zl!;xwn!{x+=gMGSo_d~=hqw1&_G1iatdcO&iUSoYw)}9*qKF#R&UWBM>je?9=bLGMfwJwqf+L>j(qhz!03vVy=7%(cVQpGBc5Jg zr#g>kkb5)D7zENpa?j%QLNKRceREqI1}7(HZCzcErIV=7@pjQ#gU`vEe}`uF^x5Qk z-!r%(hXo(=-gKcKEhWeYiGdM%GlP?s^P3>klNhS-Z3STjPTzRu?_Tmt#twSgpM7}N zBd?P<0qOSFQ#d|R@V^)>B%klKBQmt?-d;M{o5!IRP7lT;e8c#Z1h7PSXlN+RDO$M_ z+BqiZj~}XFUN~(}O8{gfo^b|zE|(({oh;(cfk*Su2#Di1+p*n@IZ)s`p^<9WdGW6e z7kO`Ss6ng#F*L;Q!K8td*Z_sz>w}a?0V_H+~aNN5HV#*t|pz6Ju=^OAQz5bfogLf|_NueF5+eQ?>t3y{`!1 zrXOv1R1X^AnwCMPhtK)|8_nlzqr$8wmB0A_#G}rWy(LuBr53#^C+P<{W44Rq_6_EM zoRBT^S%GHDasyRlZC{57GirMlQ^UIiS=-?XPBuea|4S<(G?O6v5udJTW5VxsNM>6i!yEl-YZYq$=#7EW0MOcTcV2FHX~a1{OjZi`EI~B% zFFCgtd_ur~zRi89+J zS%K+Kg}pLVI4T*J5ek&JF>oFjQNd(sV!o%-x$f}H?_)}yC7AG;L3todTJC8Ul0ANn zGXu9(s8jYD?zhbM%nc0Oq$Hg6ElE2Ja@yI~elOMj>$<(!@r-QK~x3eC!Ld^z+5%6PbkcFb1s z`}NdoO*CY$W{S&iQQY8Jp*|LTKuGf@uN=CWD{i&hP3C)D*Ph?^?^ECuwZ?o81%klB$9xiywn8T#Sf+P9?=K{s61NAUrp!Nk8k zn;ac|3%ueFzGsITFef{c(4R}f!#ch^+d6@-DsUdkEP719vem2eB7ViHRm=qqZhGfn zZG_pN)&u{PrX&%!-kNXfqa302h^DDc_}_P)cDBszUJmcYhmK(Fh%>Y*;AwbHquhGAheZ=B0~m-H|;9552%E%16DcN<+7vr z{n;_p(C;J!;6fbh2=hlp?5m9B&BaBTBo2L#^J8wg1g3H&4G>;UT}%bic4~{z5`+6V z8^~%fHpekYIU1WnTVnzzC#P31$G`vhYR=`!WH!E%ojN z^avHW`+NG;e2=!(ewIQH3x(FEUZBaYl>PwU#~*wromvm>krKltP}rGZsH-N52qVhN z7xwzZEx{y97x&Mk^*@h?nT;ZI_YBrBo?Tbq1`b&xz=kPrc4QU1Z&IC?C*sO0%pNpH zp0q6yn&C$DdkWG_P5%SY?8Y+LEy~EZm?w?#-o97>iNr$DR1W4`9GlK^*_TXlK`(t# zZwsPYlQo%QHvuWYL}>1|8L3YSIMPIY6; z!UnlE;0{J;TS$IQR}?1OoePK!#|YXB>_yq+{$&wfzjF^5EX1p$AgNBn$U$0db>8mV z7cG&bmatgsz*=RZDe%Spd?L+aW4@YqwYJCKMLzUvH*gw%{6KvLjDZ_u8zcrCMVNZR z!_{57bYC$7Hc{@PV)E9sB4)tH-1()LpZDJDqn+9fOd|xjHeQyv*?IlWeCFFUmc0Ta zfi(7A-xenjW67bl45u%k+#8sqtdderwf%Cz$Q1}su z4y&RVwuhAS>V3~XYa>3iI6tw3XJ@`W{R3IIG1MYAj($`FFBCuDzUH|*Zwz%y*L$+{ z>&MPqo9@Gk_O|xL18w9g`_En(cH10q0KX&LHlDY} zmULx5W}>3bcCo7T7vDz%(o#|BcOeWiee6OL2%^Z|)O=^_xjZYNy}zQ)PW@J!&Uv?cG}*S& z;Yu>N*L&!Sg(dT;&xLP_uZuv71yRmul!VH$*Ti8%`H*hneJYZ!?lg?Y zuN${#R2u5b2c_y_t!BlHudWZL>o%neJIiMA`7$skwBIHok^*7nzRp($=sk=nJU=%7 zPH(;>vfBE~o7h$Fbg=qNvsf=2_)j8!M3~g8%iy~v5*B4CP*Z@vXYquuhKhsHu}S6u z7DQ1B#()Z0=5w+;%?(V-Y`QVPWpg4$Dx5%CbN>My&@AMnL~ci=3}FN;Oyi5)dcO-V zz*B_zPch2R;9Yp~}(T7E5 zendGU`u7%NA|csLJepUr%FDFO%0Cx-zrK7b)+7EaSBg}u zZ^x5}A)&q0=m%O1jc8}4sCQuG#^GTpm@`T^4Hp)+MsbXh-1YWT^&e&91JTg2ki!pF zrzqJ#ieV8XyJkrs;V?kV0Up?neGTEW`sLH_>NMZ}17HV|em)ADeFl&-MbukB$Z0<8 zZMWkyDCaT2Rte0?pJ36BPftO6ATHLcLVNT@BVWvG8H^_sNVM7*%CkXKEpUIJ6*SCqD}4o-Zk#<)%`<}jcz^rDZ37Jncx0Fi&Je~ zw*OTHw#Ly`lmGZ>vO*j^I)ftCNXg^Qx2?Frj^-vAMT*VdMxuT@$*=wSK0ZoC!ztl; z81bf~Em?&0a0^4Q;+xCXq^L*YIV%&P%Zdq6X>Dy3l5Jt=R65Y{T69A+BNkM#o%s$z zKujhX7r_X*llTor>g#%x&c0|bKr z*y{Pk#n^YdG<0=j3#sdH%vg)(5rC+X|GSM-p3OnCo%v!e)>j(yr2feY&zHO zy^fYDV0K&E@$c--wuPWmZ?EKK@wl#P)SoP--PE^V?$6#|8{s@&OJvvm5}T;4cStm* zXz7W#=av-A}uYl8V$`=i{X$5pxPe%$koA~=9M8)KdUuIRIa{?P0C*2Hfjc`X_Py0zfKLc7|;R3YovYw6npjz@U=mPh4(&)xO~Nx<|CcVQ$0U-Ujf?wurc zj)|`|zP3K$pr1+n2$Z1})Y8(fy!}NBPl(CWN%n1fazMG)fwkM_M91q}l#oAR^gdjN zP!csB9^S?anEklWJ+);I*TE-LZ@w^6GMF)=amV(cp;(EXo~Fwrb}?s$Ie2m*Le#^19nC4fmV8E;O? z5f}j-ri;*_PkbXP?Uq^V^HYDS=A)Y|^`ZyxQ!}~DkjD3qUZ3*^-w*vXees)8gi^#w zWTBO={u-t&Vd>SPU+V@f#-l&YR+u-j8rw!fee(CXf7qe*VDa6xLObw{wCT2Z@s|RZ zCU|3<&ITvTHc80SBArmA?Cj5`18M2H?fRt1wY8`|azBw>O6-TE4rgO_wh96a%E{>r zm~R~RhgCOECg-3$QRZ*8Q-cz6qD;09)&dk# zeg%DbR-guo<@Da)i3x2`eJZcs-}yJYWFi3&9gD*RsB8>iL{(%dzWgf>ZD`VS5=M^I zWUWwreXA2XDEpd)+7jWT^;;f%d)5M)K=}f_jTDo)0w4eo3f$`ry>x_1A8%UE{`y#g zYK{RXCmFx>+tlw7LuOBniF!CE8_0^$h6i+?Aj%MT=PIMFUq|o%s`7Mo{>$SO9CL@T zt=lH+(8)*LO=&kq%9nPVx*jw;Pmj}2?dlI~m2&4hOX%^L-DJ}?T5r|-^0s`?=OM7( zu_*H~S39lBJ_LWrXJYwtlvhpZm4c+2V&+57!Z>8x?`M_6#|F8F+W+E!)N_x*U*ceQ_XE(4beMld2ynb`DEPuo z57sb9OTeaRg_ilO_A3Dhjlf0vfPjXPa?+r{{>}yw21Ffk`)I+m9+#D0j8Z$+&>UF| z!k?Kt^I>VvtOU9KKD+0ye-Zf85z{^xvZLVjw|s%{JGD>KXlRd#QF4wvf2 zgW?e@&G+QgqQYu!nmU(NXNOy1%`YQK$nBT?FUctczPY8gs|%Rw;CfNddp7PlMB~|E z&TQrRF}F2Sbqk4w#y^vB+6zsKDiR~nvecR#YsFTrMU!2Ki&#WYAZ3MdkQlLm#7Hw1$oX9W z(C%q`zWvBSITz9t*JF3~_HuxaLHy;xaXpahoe@L-c)&tWpCn$r_*>17l<{4yO%FQ( z)B+YU3nP6G3;WGxgu~-|VuzW@pKn&c}NJlI(?)&*u%t)XkP=gCetOuz4^BOr7ys*Qp;@ zsQo3=^c;OsSH+Q(Pxa&vP4-FWq7PypTSkjoapaBufe*>!i5d*8lE7HyW3lrK!>l!E zO7djmm-%~n9m;QxpKK!(^+iF``8ZeL*y%?${zI=3tq%#iH zZIjP!VZ9$!fyw(0xE$Gi)ZmIDL!a}YRWc~0kA8(rr^#*5>I&Nj2I70t1l0lGyKPPO zK*kH)EgqmWO@o7kuRx$Fb6HWd{{7i_;Tu6J?47UR-8}#H;s;xHS!DJ^z=J+&)bu> z4n{BuDY|ah*%|LygwbL%lZ=gxs1%z5*BA2=lEZKU z)0S8~LZ-%EXvI^Od1kz08vr+?z;t{wb zC?1FFIu1K5umwO;*J&wu(K|Vr$@nz!pSUnMCS-cGU(3o&0b@dF<}LP3ETe!WG#XKV zqT-$Go<=MljGcooB|1JP+`w5PzReD?3NTUn{$=8^*dp^gUCWcLtCxx%E}H45 zGbI@=vz%VS7%Bb{f49^sVPMJn=XKMg^5G)mOCQtjME30t=3ymT*G_Y`woDuEn>-jH zLIPa(;vPZ9q(XFTe~5{=#3V(xLbBlsB*XIycjjuB6Ks%9Bx#R2n6u)5X|vxYg0KPT zwF9rfDup)MGBCh>Tn}`-)OAf$K9S9;#f-oJso{WfxmAD0(R=~gR<=Q%m!>?Uqg)YH z`AxXTrjT1R6j?B&eSCZ+iE6#7sY}Bffn0F+BHv{fwgZeZvjzms6GZ z&cq0Wc+3OorSF)^KpN!eK^b}d1;uoG3lX$>*!XWB ztD|hcSe4juX<^4#W-}Y($x%5w+oIb-HtV(FXkY_eE-#1`m@0iv{*L5p7Eyrj3&Qy4 zTYy)BkSgu1W03AjjUR&%fbyvG?R_Nb2SWtm#1np#l9G~1Ig{#x+!-)%9fU~;vAUdI z{C!U*tWWpbSDg!*_%DZ)f=eunqo)KjRsCa4^bQ<-QjWUrb)Cp>In}M`d}7uYbTeP+ z$W^_(U|7A_#fBD8W@N?17ce`!dxnmCMouU5FbEnxvXMT=NAItZQqOK%Wpxlk3t2EY9 z89#}Bi`__3lGY+}o?v1qqkQ$BGluV!xpMg2specVi01kI%u77QR=&9}s1S zi}kU|ZjD2Vd2`ybZr4j2nU-51eW^!ug&b|xs1ozr9+k}{-smHsS zM9fppgpTGgmb;@aR)pgm_H!VxdWi1O_fs7UTS`9RVd|3oG@sI*%s00--Vrr!MVQyp z`mv!+XK=Ev|3ipsCB=jOKUQo7wy(dk36)35Mr6%cq(ZTib?w7Ra7;)ff9 za&v-={G6X}4J+W$ihYD}bPigoLYlxWQqm-@K11-7k@G)_MjpiD4yyh%N8 zm*|4nVyBIP^67Dr;?3#RrhFG3lg};oOKlTMfB#B% zJRhIQ3&)LA)yB>&T8m!3$@VrE1LfLnynSZ%T?OM9_A~@r&QZ+bpBx*y)+t}Nq#F%_ z?*T?c6$=Zq%*peqef@~23P>Awj-eWBUmX&d@3HFE&ILIG|M9sFO~Y+{R01OI+Q7k40Jk&RPu4;K1;FI5a~2o|n+Cv> z>-Gp72D&*Ju3~}#Ly?3-PZnGsA>UIz_IThPP|&xLqn zy5H*~+>ndL^VZX*5c*H+ah_c%Z$%Y#@%q7TCb5O zt>>Hmcp^+27-saDcD46<*an_{(J1xz$GU+hkT|sY7kh7!oEM~u=@VxU{uE&@t~l`d z)vH~sz|Cj_Nq_lQE;fXTmH>8Ftj^uW50BwnGMK*$E-oC{At`lQkO%GQ8d(_v4im*d z8s~Ez0y^Gj^*mfogIbjLAol?V?fp>I!t;hnu@k;&kb5%Fd3Fd=_}fer=xBNFE#6YC zweEk93Xe%`NB(CIgcM0>_2$3ztsKRSd%7|s(}tYxqVneV%(Gp#GnbCo@sn!qYrRhswj}ro5XgN=!1!vsc9JcQ?Cw4S}gD&Gqxzn~H?m@HtuzN@8 zP-)(+v!~dmCU7gw*H(bFuh2}Ui2S2sx&X3J&26wDEweWKBU7}MBeNv6#<1qlYXX9l z+xz=w-DGokxS(Z0!(>CoPSgVng&4SIiF%k*p3EJq6D>FbU_A{JRK9pk^SMCCf9G zg89Vce6>V*h<92ZjJa>gEU#^K2^Q36yS)Czmfz4ExH4(4F{BEYo>-#gr)Z>NG|F5X z}woyfdfE z`(67H$QZ|sOv?+H_2s@vgolZrKiM0N4oTrwF4xI7}BIkWCiEfh@?jxkO_}-&>mTg<_cJa;v zPvYF~zv>fvbx+dx?PNFNQXPldr0rzGx#67U-nayk*khtIiOJ`^xjLtk>Le=68d-hGXtt zA$)}P*R9yNeGXnf6tGThxR0Fh^-~vIZHYbFB(JhXLcd;gx_$B!dj~3rl&e&@g+<>D z!>RsQMunS$d5=FSzyS%c=OK3`2V1TkQUPHIVpdHC2x&Z*xkpcch0FxVz9>WZOnI2| zns*X``u?KG!vr061-M)oS2alW=r|dc-|S0D4im~+ZxObm|05NYsp5;o4;<1b*}w6I z!$>%SSaDlBCc}Fvg>^+DYG)czUku|=2=JYrHCx=;6JThkY6e1$=WM$;pCXs`fPD~G zIY+f#Mx#e_2n~}_xXJ})>ZJBd@5}R=HuDZNt>VW2eJH`xCJN9nF^dK=2FgH$TyzBJ zR>+{1k0B^H$EyV;g{1O@OmHp@()1W2H6v+_a70n9te8PB^>XYje$A6$A&&CL*7Bb? zJ64_P&i(;FKtgz`7Uy4-yKFZgOJ~&DRLA+{Et}qY@B1I6GTz_Gu{x`AmLWWX3bG!0 z?_iwF+qN7+oR%w>{`$+DppnD8e*4_m$l^C1a|78ednf4P1Wvpr+3>%10oA4uzZ)*O;32B%akr9a71eDnLHzB1eH>!qvMUS%J6<4)70%qU8vDgOCv%XpDboJnHh{&=-lN zUhr7YcQ7DLNmTlViQi2<@+qP8+WeQG#}6?;h28H3Q8=ZTvPSKWA}Uk0;x{AV@R&DD zA?96Cv)h%9Dpfq^H7k55%9$R!ySaCRFk=0-ZiopvFCve%BR9`3t(!3(ethgezB=>E zsrp-FPchOUzzFw2-3;M%_?Ieh<^Zw*WN?bjb@g{PNN2+_Oat02Y{VULeAk>~dvc*s zZ&9a>-xmZDjzkrpc=FD*%|XvKPg+-C8=*eK<5|Fmor}a zIhwpLScx~YiY54xtgPT?s+_sNttnNy$+GoV`vvM+~w5bq`qD+vEyFsyi=!ijmeh5R|5Tuz72n*p1HHv1|9qL z2i}M`nFP4Ozzh~+#ubAZn zueD{}HiPT6@0SuYe;~+9mmE(swk61^Lku^uBbV zCYYWNuIh`o;n;2zkZof)sg2L9lpeP23GjS>b%^zN4MO&_>xGkK1Zt28Kx$7Yp}5qu zvEr9u+x(g0{=E?XyDO3^rQU-ru!NkA!Zj@2h;pajKi9%Zbvf$C_)yN5<4G zmX_qjofig(-O49g4oSwX5*x_9?bmZBzj}S7N_oSw_l3)COS|{4h~-8lq7@E=7E$i6 zV-`Kv5s5y~=y)FT8#iBP`oxX*NDhP9abboS^p{So4hAOKgd1=)yf?#ew~e+%F6kxu z&g_qct}StU;0EiHb(El~BJ~8%$KBqHtlTmq#rkrIY&v0Q6oM}mkUG%Y(a=8w~f8u=>9cO?($>~DSmgW zCSawo#5HmRl+U$22*rDxz@$<_gA+;4K1knfE8zTRiO*AQ!E@^Y*bo#;Hr=xck>m$s zpQp_OkxqSkFWomsJHkbN1{0I6wKlEw^*eHJ;DKdK@61i1=44IO{C5&FTQUUVI*cG* zfHgZNX(erfTjv**(@h`04)oNb5i&2vHcw7oK;0}-2{|PPOvnDtS5E_f-KHK~dyzhG z=-xu$*Zf#Qp2P^uXZ(bTg~gM^X()EQWDYv*78T{~+eQXu7SRyk>apcXkvzBUP2p_| z%+JxZ^`h}qHxn(+$H+^yyD^?@FIImt>DZ;j!OMGdFZhB`Z1qeUBT|`70DfCsP$MaN zx!+7}xq?|7W z&Q70;DE>}ya)=PRj5}Ve>DzoQbl4bu4cwl{ge_Hw<n!~0`Fm6!?R;1beJ&*~73m=w| zYQ4E*_qG+?VotGoF`tS}kzcWj$}?6W1+H)=Ry;;m~F95!$mTWSL70mwvCoY z@hJpfvpl=w@7JC>G#c+P#1a-jDBM)!mwAfPEhNC)jgZ!lcyrermn5Al5r1;8u5HxU zbVa4`TCd!1ibn>zU$5g*d!1bZGW+%2PWP*MkWBQnzFiTFPzg8>_F1Ql39#@_01Y6U zY=aRXZHJVcBtddILV6{zS49EYnLx=Q&$5h;k+a$d1qOnlMLhK7*j@5H&`lX&-BBAM{SIehO$5?Fe{HZDE+i-CF?$b(_#oQFf1D1I z4Y$v+!^?@vALl1~_ccDpL7uFI5sWwCs#UI|;|X^XQxY$Z`SXiCoFcy8KUY4y29_K^ zeBH{u(`dH~+FUk-uA|pEv12LFfYGYp&UO_q{|MBR2TtL?3?T zg-V7*Nj}Sw=`Uwh$ifwI|Cu2&y?is4HVFB{O0ca4pP%7Nu`_!!*LUwRs^cj#wo}0m z1b`2)I7!=CS`ptlI5O{^W(*IzOw*7?uMGi@&eVbnt@!|0D@!!i*75%JKf7vd(u~a&YF6Q5s14UZ-tv zm_b7(=0J9R%W0UYTk#TArQ)T&{M&oRMWX~w5WXd%q@1%l$;pg zl+$>uQ>dDA19XW6$ZaC+KnT|90N0U=3}k=cdPMZ3cIxFP0y3iZe*MS!8D#zztQcO@;Y-dX*ON!l~tW!YUw@sMn>H^g-fBKVaq z9rrZqJn)?~6U)kWAms{T_^^^a`9{R|Iq*DetG+RIBNTT9XI8rMfCx20BU#q2y_-+1 zrh6y1nTUzdb`nRw`q9y*O4%n>s>_mep=gs4e@o-PP(pA5s2}vq>69y`1WdqrKpvzn zks++>Rh5-oMvW+7k^TgOH2=JHau$w(;Juu9X=)049AUZ`q%8w3A)ISRM}Y`@I)uuP zwL$kq%8bbKlCY@13v~!VlChC~_hP!tHY*;+!y--A*)SqEFVX4p((^QF%RaLbF9IgcJ(F=eAkxFc{=F?r%XF=T(=e2v5 z);?-M^c>QK$sj2AJ{wOCIfyaPCg5HhCg+u@b`7#`KuWnhDGJ|M|HKSgYB}%i^l-I} zbUX`vipM$d#er4rPu{mjlHvJZp78a!;b@jgKF_n(8sZf%28N|1o%g35=RkzV~x zXL$&D=WuX|tVj~WZX&5w1Z;)>i>aAPEHZ0Ac^ez`%zHvtS0;BL>+!WtnEQC^~ zcHF|@8n(`gcG>rX1L5j}TY1o`9;i1R31Zi4@`^K-xe6WgL?$2%4NZS90$$s6-K}rtPJ!;Cl9B<>qr4wO}z{J zI4R(trtppTSdSjjqOtBkW)-BGzn~;M0Ndf6=~U{Oxn7y zq!_De(;UT2{q!I}Q#a|yU=Z%piE{LKH#0i@4|&xFlO&HQrM`VnIgVzAvi>A|Rf2cS zJ|W2IWaoJm@p0hY2JW{oc=n%H0beGf_gGB9l#lME3+k`JYVL5Nfbap*r zxTfpTb-=vqq*Uq51<}R2$w~hH)soWEo+>xDv$He7_5+ZajS+(&1xS{6D<>*loM@>+ zB6Hp+i_bNOe6?EaM467U!@Qn&yjxxyI>M%zl@-DjCKV!;O4<|RueMm))&o79BRmy{ zA6{S-{qvR*_yis1T_@7U-6HBS6_a4U;hx4!5+T#U0!pS89s0j*k`&;LrDlj%DnA^^ ztUZW^R$VZJ9A)nC$wVRX#$!H=^-+Sq?hk48=*X}znESF-I8@ct3`Yx=dAjWWXH*JF z3B+LjP?DY;rviLcq7+-(+gdQ^gCr$)FN~FFsY4^%K{*FA=uJ018>8VnUX-?m@+A-S z+S|FgY1>hOyBv)kz75omSXMUQ;n_SF_mq4<_pP@qLpM|8+SrY~vB_Z8q`q!@2c5xq z4Vjm3-3ybH14gj&_3P5!b>~wT7~L#1ejUZ!hy@8IGId_jSi+q-CcV%7nP{;*b=fM6 zHZHq^XsL#NqrgIRKp!`|yqhxqb?J`A?XgJnGdJpCNfD0wSb`=JXggZ@mnzY`{)2^;$s1tL zzP{my+x7Abbwr+rp_kdR*%F=Y${a0{0=noiS3so# zpJR0ZL7pY$+N9~;`0)mh&ceWGAxKS3&Wdw9>>8u($4-k=+(p$^R{=Ev^SIOpp<*W5 z%&*$Qx6C81+`?8D1li>+>+G->Pm)##g9vqFuz)(im1IX4FYv}!N`JHYrpauI^E9-ylBB?@CA zW|;M{;w0`Aq5I%t^42CE{-kyN5m+D@Ho~x_se}{p+E2CPJbQ&n*Zm8d7^;Iu-sq!E z>Feuwk5QY^Wfc3UOqere9?(fr;btooldmrouqsd92;L>JNYNPd#f8B`Noh?a)1b7D za+5i6lS2T@oAO`}u7k0}Da)=+lB)OV-{pq-1ZJLHpn-EtFW2t{*V0!!`r|NrMl1g@~s~>KF;c^G7v{|IshT0LFA$2V+ zzF?PPF`wk!n5<|6JP;j$GP!b+bKob*xued7-YeiV(K|qmKs|8x)ZQZZQoZc=vcb3F ztFwo}*o7KOy*I>;%ese5Oe=q6s^u{Ms=X34#V;Kw%qDti>{w>DM3{N1J5hF%%~-I= zB+s5{c=Q8Li0-^p>?5eL8#joE7KR@`w|dJZp_@X&&fdvsvxrB;VD{U%CC4H$H%2Iq zS@+*ClR-~yq$=Fyg%B|^ zGXbR4tzEHqaIgS-&lTi5gertCPDPso zGBy9ka`jGO90r$1Ezm$d+1OCRQCR>tJlI}5o)y5K770I$GHx#Rts}?rU`>|5l;*7DGXzBnf#^c z6Px$Q<$fx*2pYav9AQa%=cM_ohltif+nD+fF9;0W4>s#V!z4_Q14hYUmQV zF=r0~>nMFO;SkAt`QFzQhniha!*uvcs`RT$XGXV5CZbHBv^XE@(&wmseG@$C5=bo* z*A0&gnA^p{5?}$pKKO`1EN-*J2DSmAFHaz|Q0>2^rDnLg5eEW{n6;q72kPZ@H#fIx zgWna9h=#ktD?9rIj4_`=ZCA5crEGA|mk#QldLW5G`L+$&4;;upzzf(E$Z`4o)C)Ls z5YK~&9?yUBPB;{KpR|2V*8K`~pp&BGD)lhOaKoKZ`o`r0ypi_;GA_N8Qu@grgNnRr z7UKHPI!at-p-YjDoCP&Jr!%L7`!93G$}@J2@%C7KyF~t_H;mCWLqi6mByqui?WQ}4 zb%yd^dp~h;G#0qFYB)dY_nGGw^YT9mFL{!KNz?|{goX54d#>AMYpARQzLM6HZPU6q z%BMT@0~s|fVItUN3mt)KFz5BWb~9j>TKeUPT^7Y-HX}S3sec@1oLvNgvK$iZBw&vP zi>F=`8n`+G0TtNn_7P&%aF)culy`b|who*N2GHyV1qIdUT)TdK1f_#kb$L-H;{}+b z2RKxc_-Ew%aE!xzem#3e9sp|i;L$)*a|lTiGOG{~O1FO?@zJK;4^AIRZqDUwT{DtJ zKFA(ii}kbn^S*2;3Eq=4n|+2LN7BG$5-DIj^`eJJOg` zXl(p2{zE{^$3)YRqD^839Fm|QB$j@`bG9GBM6^22rGtA*rmMRP31dS|ffT!t3%}3k zw+WCRWISmR4rkS72so-L&vqohAl3zzEAZT)AwiK5jS7~d2*8Tu{ zP*j5y0YpM1rw*};dKl9@Q!U9mDX4!>>}T^2>V|`5?L5ZEX!9fI$Fidc4%?>|o5irs==gKIf;%@#?{S0H1e3yD`R*-U(^{4k+E~%Sw zdb`OT)-*k0o)Q63a#Ih^gM_IcSxjwK7S0M~n2h|Ar8eljk)d!?QL#C)C-TR>Ml=Tm zth+1utT#-KvwGxVES4Vqmwxsj`00NHjV3eV>%XkT&e6U%N3g#Dx<$TTjsK%hXGdc? zAfGkD-x|T}LCEKhMHXBW;Q@E$WYp15-RokacU#;^Mq5mx?$>2zu+izm%j6UD#hH z-_f!~{nC|K8tPIKKU(0-A3<tf{x$%OoJ ztMl2`&jxG0v{0}cO_5~CF@>L2`e)Mex?m{glvj4u)qMqL0~6T0)+V?8*I)(=)tddq znZq1Hty@5BJuh=HlX6q`SW*cS|Xz<-UX z(fxI@%1fo+s2SqYYOJ4C(ri6oxTeuO6@lw9R@pzlc_7T(`TJXZzwz zzaiwT?IZK{>lV^sTL+>hbI(6!{zEK8tBdL8)7Cg+tj4z<(Z9SnV{|G)g)O;NjQVcL zKRtAJzXG{0X-KuEE9Wop8_YWa<1C?&Y6t~49wtSAa^;Ji7obl4whV7Y1PM>- zhoQ#r>1nz$+oAmj6Px+E59!>z#MXfqF16;Vtqw>2b6HSLXQj4KI(d45Jwy_d+3InQ z$k||V+Eih)2C5V?Cx8-OR5Mjgb$(VZ$K5_e|T?_j?PEu2ZtTL+*MlJ=WD8weo?fDv9mql z-1p*+u&UoT4taHYzH*_ziR*OV8TG)RSHLhB2kO!`*y~Gr_HSWUDpmWtKkC1%;E!t3 z*Xs^?HSX-(H~Mbs&qs9Y&AS?IcK~=xDM5H=JdE<|4Rn}nK2wm-xN(ONKXBqrAhVu> z_0p9O9VF~XmGE%0IT6>tWPeY=M@K@M9ueRQEL{F>erxuIHgKW+^8;GVO?4gb?)f$i zQjVyAspZ+GX-Mc{;WN7DR-X6)rm^a<45ZHgU1 zUr4%2y4m9r2luMnOX3BkCXXOc!{0zfOZSaV&nUDC-FKE+52neG*?HM_O={%4!z{?f zDFCcZOedQ?9|rpiz65xSdQdm$=NNLjN-wVvrB{55@#F#RJu9 zbi#q-It;}!b5L1@0f#KVcR4oGQC|&(*tdGYW$n27ZQMRqH(BJUNGw*WDYzMR zax7O~=D<{WVh^oiLhBg~64cy2ZQO-hW!3Xmii|glJ^+#cJ?46P#|ztyk2X_J>e;*6 z$R9Ryx1CR46qsU8lqs{>7NE9kMf@ZgYIofaIf|sgiZq3H;e{k#7B|tV-)$y6-s5gA z7OpH5lJougJ{9V{j%c(@MWUN4Qqd3)Yw*_-362woV^9cckLy)vYYFrJpWqd755qslG&P75wv}~@rPS)emGmFU4UPp9Th8Ky%4v__t2jHistCF;cto1Aj0^5pOr`)?b%C( ze*FAm$LKbe16q5NJunNHUpon8dQl>WnFA6S{nR3v0dth9Hz@i}1k8m=O z`7i*xZ`>%a$UX-PW+^xxt^fljJc!mJGC$vH%hcR_vp6WaLyttjwH?e+NWBSx1Z{8_ zA(m+>sh^*KH7wEiIPdlArY>`3kMLDKORHyLGQ0?Pr zP{>chH`|gsBa{XV9t5Ei8&;&S0VSaDW$%{5#rRV4?q2$K3WqW?d?P^7J%75m5v#L5 zGN2W-4mP7y7wJB8Cjm&u8m^CyUPBkg0>|Y7W>YX^kg3`i#3B&9G#4I@?H`##fae?&8;jsUMn(vLfBJ9M{2`uD z;%M|uknxIp;o1Qj%J#uQV_O?0*pfiZJm}noKV2Ns8!zt5^S?dSUMHw@;)KCYvP>yI zSx^Tj^VfhD<{jn1uB`9$3x?lw?+cimd{%y=&$QI{YMQ&Lv+*uGHzkYKiwAvUJ=#So zZ|{v)neWwbTi&o;b8nBzeoXU|=0^gaF7tP-{;4GBQ#zfR!rPRB$UB82p${}0nP~n- z_f=O=JjU{n{Oz0kQ=b_)k@u*se>^Eq8o@xyBnV0Bw47Vw(IOK|6Jx8sZZ7v_&1G|=V~#PMDwC7lh- z4we}vJ=`P`rUTGopvcCKnLzkO2)D%Q*5Q8D^Vozvo~9^Cs+GkYnN8D*W4dUJI-KLP zvtRZW&*Ykw=p*UXmSzD8oGcNj9FC6b#lHY%LvR}*Y@q46xf}QbbqI45iXEm=KRMt9 z0&Kri1*V7y4aAtLEwd|^ADW~oZbg>7`cMP|0xUhikS?nRfV{V`-=Ww`b`uMA59?bE zrc?f<#58;0iHX!PvzkdF;a!jW`dgL#W1d?vgHoGifPaFus%XYvAqI&XgP*zSp1oqK zp^Rh!gg1$K2&KlnvAs7dS;Da^(}mEt4mrYcD>GkCB)!4zO_h;>IjP_{V&a3+9%-K; z<>#092GFv601L5D|H*178n$rmri+b%QTtzZ5AY2;L5G1aqkab-Y(&xX#i7&&`$UZ} z4H_Dn@tZKwP#$?RWN5?W)YJ{XFi20J?B6L~1B@Es!NCg7`*#tEa}u$^P^^mhUsDLB zXq5El_@6BZ3BgmPxVP?nQOE{s%Q`1M$$y7Z(qn9F4Sl z_BG5?R$Nt+`PKPJBMw+l1LG7iAA%P9jbn4w;wC0x*VWTQZ}n;zufVmFiv$ZO&bsij zAw&h31b=|IAto$50rLCzSKs5>g?!2bni$N0@o40HAZ2o6Dwonj+c4L40p^PiK;tu0QG>r z6-5E26MV*MCFa}r1S&12F3!#4i6C|lcP1h$1`0-fi2~G_cm#c*xA&WV{@eFM3=lx^ zZAVD0Zmk1nMuowrUJPmKi{p76v>PaJe$eRUh$a+x;^*68Lg#;F49&_ohg5hoCkyLCZ8E|)RIC55eRM{ zJ5gND^8aXO#xlNaC-|k(c0MYtdZOPNV@)&Z>kzlw%+JK5adAQEl)G7ITV7mluhm}e zcytd|JaDWG;#`H{Z(V0&5VYS@Dor_jWsM8|(eSm?(Q66f^Wr1vJZ!}@&AsBb2yA+F zR(3P{1`wVAfrHGp0o-`nX$xIu8%2wgt`*=R} zJfC2+0NnYS12kZv81>brZxRYZ)Q-8=VGaj7%04>alxyIR<3ohB_uRg#I}4s_e*@-g zB*O9Y|2&za%Ywlj!Y=|#&XiL&cqV7o*0OXx$Z=NTkj8ms{_xHu9hHw#ZM1;Z#l?k! zBspo_>=!hk$~kRD9u;jPe$>0$kDJ42f;~eU)WKog0ID6F!u9aqL|XYiV(I*pZ9<$8 z%ETJdJI(xLJUWL#h$UJ}W9$0yan1f}0$AN8e~343E|p z8iRMzqc>A|^3zJ^bGY)Fe-nmHo}MBRF2Xs}>fBS;WHlxov1!C*y7vz!-?*ztQyV=u z=f#I_SsDV(u{`$PUxzPFnAEtTB1ht*kC`@zSPky6v$OAQP6@Q{o&!DLuN{NBx;mm~ zU=c72nQDd@JfW|2g_4s3Bk=zq-K;;)R%9Lb$`X0KN#+r?TNp;e>}+Q!FuT`a@f~lMJsP(?aj)pwT`X(OSg_N@WVk z&(@Oj*|hjneu3|2pK+F7kBnXL#qoY7;sB`8pN~xZRjYM1S1&HchNJQvtaJ{3l*enh zlOm?)_u=AN^w-Z&d%-2rcDly`ZHAG#WL7~PWSKe&t$NOOGGwSYRE5(lw<+P;gt4U5 z+Ax#Cn)avZFDQ!P1-?~{)(Du}PRF}Rvj7Ve&}q`G-xDqcW~3141Qb<}f`O!r0i-4= zs2=&o&CIO6>A?{Ux!s3DkD_{^6-Z1tZ|nhyv)&r9|JL2mYmb&1%|?n6mp_#NQuKFG z#V@5zi9W&{ z@d*--!10}-=$$A`W~C<@gHNyah1=%WN3lqL;z?9bWO+iG#Jh}-*|l2}bxhG6o5U)^ zrHo+KM2a%|lbPpj7s?`Fgvn!C*8NloMmyP`=-1$UO%WPl%G#<>Eu%Cvb27l&kh5evHf2 z3*HE-wfHRsD?|6B;vh??r$6ACXn9(rRN%jh%$bVgCLK39y^rn|&<+N%OvP*2Bn{LT z2X;kNxwTN^3QWVuFeH4j=6afP->~6Um%vv=Niohnnm&K{$8QdiN3dOw>_D5%0J`26M5c!HI@a=ogrXo*E;Xi>q0NH^rF!>&N8J9y- z`GLzARncI3x0p}ze0*OFNH@PfIvnGy41E1-r!~QSyGfkP;dL_I4=|X2*RZ|BSr|s# z4>hbek@x2Tiy{R8cixe{M>^Kb2?7vhR2!T9iqQ8G%q zf8KJ={asSP;%CKB%Ik`XoVIi~A+L+I`x7x)!5jlZ-La7NpN1k0NU0;c8Mx&D??x=- zoP01R1TY9dp~L>2LSL2@DLRv=C}0Jd3ozdh0-I`I+dqMsx=RvHA)#{ZpGA9Wig{r?zSgzFw`5}zJ5=**1NC%xl0 z-Nw&8KVxAv#i%;FX1=8RV=eCY@X0JiJv6P7R2Q&BCG>IHOja98rD(b_qgu&L2)?QBSHAim=T;`qa!n^|oUz;1me?s;HwxUo8Rsb-^I zRk=-~${zzS28pg?w~-C4^c0`ehFs}uVtwGA+G~@6afAxAgoo14?=$P)EwGolDqy8| zG>bi4_5e2I*a{i+H9m7r7S~Px9zw3cKU_W%>3Lj--8i&9M#NHBWbS5nwGFmp0Fw-S za&N#m_8RuWSm}Tj_CGh7`NJ!a{=fQy>^o;yL&JPU6Xd=S@CbM%$YE@C2gQa8zvo9; zq0IOK5UWtk69W_>1&kEP#7jkG>@aQ|bh`u$92l(xvB(!o&}>m1j5t%J<#vf zu@5sv1uXiwU3`XkMk7{I$Z6}3O@4j&#n#44!{Feq+P}Q$f;%2=E`&T-SR*Wy^^yge z&rJBpAgY_cD0SQ)0k2d25gdQaaO=Upt^YGg7YV4EA26)(6TTTDO zdiG9QSQyG;^i*M4z0zcjSs^PD^;EgmgY@{x4R@#%m!TNvE86>)>L(DwG&0s@19k6H zwNPv4pU1LoXy4Ot8RB~WRaodCBadJXmok({v1R*;P53ilX?!SP)YB*7Guo>;F>m98 zajoOt(ku8HARIrcG9(sKYj9-~09wF)r~9rhRL?9|9m<&t*V}zUzy>?NPmyeaX%;Jp z3o9L83=Q(rfuk!L%gu)H34xXTP?CzY4$iAgNrn}=>^iZwsm8MSA<-KMcDeBSE? zp=;O$ra_?SqUxi=a7{gLt{-Q#q^M?a;haUD(o6gYMv4?z64}CW71FgOjZgL!by~Er zLdmXU5o5%==(V?=Y+AL0KvrVEO%9rv+aep-0Pukj3V2+|p!qzQhen76Ruddw$qgrV zbaKMQ$2XW~#Zd$h)YBtdB?%2mz4RaX4*}e@(>39Clu@k+4m)ZXZXrXHzq#vrX0fF) zMs9v^CilTc80Mfh(JIsPlHE1w-_8tfZbv&3Ns5DIHjO4Pd{sg7PSM#8LZn7gjre;_ zVC?F0sX9HG@LS)Q@-DTSKC(#qwSPF(NI3cVIt;8wm%pf$--a2Go8)qD?)vty{KpaH?QT4|qtpDIy6*B=Vmzz{=K zs?l8Iu4J?b{v)Tzj_!o(umKOyLKkWcbFc^8?C|Bx@y~@XPm0r{Uk|E5w7V|+a;Z~^@NWt#h6M+ z<`kA~K{Y*BF_i>irQg!Ags{1;8T|!0juc2FJ6HW4z94iy1u-6)D2o;d!CciLFb1q| zR*VR_EcgRvi-UJT*%ggojV+w5C!iNoO^Zop-sM|Fn~ES)zU7*IKs!{Xo@8EHdA8j} z>dd^2OL*SnlQannV|LX-&50 z(R~zxP3C_I*3|8(uq+?`% zy$Z`iPdg22V>lT0mS81Q^^k_jbWH=!;n_xymJ1pcY0Tq=VPp^x79kVqIy`KmJCd#o z3b(=c+;?(KcoHXzq-pBJM*Z#uhSSaWlf+}#*T;17b-&7I251jutB5dVzD6st>)I*3 ziiS4JHQh`3v~j8D8yhX?XRfZfP4Za=S$@10wMS*J1K_u0R463Gy^r~jnIUW$0|5=u zxZmxG!UYZ6C_=D-4X-o`r#RE)-@WOMcmZGH1*cAGoj(EJ+vGZtZ-T+n<};YH6g3DMGH+rABo1~&e>%uQ z$t|VE)1Cd&CWxS*N8Sp=oV9v+p)NuYru!R=lt^w2o)o2jrS8bpPGv!enf&9~{Ot89 zH}m$gvQJlG_lN1&6JDYSxm>gMN+3b-d%(VJxw09+tbl(o{zH*IJ-Un3X-p9jS|YvaXxVSCG_{*oqUjH-2ug&W+P zG$7dvOsl5{Z-3v0)rs;gb#pV?{XNq0?BN8(#%K;Z_=Tl3@|qolh|lFF2Hr0i#cQc= zf=>vGls^U_laRW`{}G6*QLQb zgzT{7DZ$C^C^C7^u&*{tInS-Chapq&<|jMv)uE>hPB(PB?qWV76y8)V{UwIW>DWIk zX|cCdN(V-@u}^Y!kSh`b84e<;3`nyDgnqZn!^=(|pL!&4?EH(v|F+Q_{kwJftF)lt z8T}(^1Igg!{YCOQ=^tb8pl7uz(}p#Y-2pV6&{DbfvfuV;L{+9^9TU6n18m$S(c9TfWWcBi{@`NX={?P zgr!wVQOpDlOzzn#fu@4+JjMwGmv7#GbrSg% z2dx8m#f{*C2dyOcW++@we8}_q7F7GMNJ?O{T|ZQmP^7dif$jzg+d<`Q z{KmHrNhlx&I2n4XC(oYLE;bbh29IFHa@PRssEM=@=ZUZCao=33LeK}SDZZE|R^3ib zqoepN^8A-`RuV#C&3peoqY830U+KKqSQ!9_$Eu+0NBfI$gO~d))OpTal95-2atO`~ zT~C(x2`laBXp20Ubpu8e8~lkb(QA>@7#4*hfafd!R#wEp7FZDQR!I8}e1uwLxh?R) zx?#}=_yX}0v1`DSg^uBP>2DZlU|?H-l}BgZdWS5o(ix+g z^b!DBZ{2N0{ck}*+qkY@JmP4$iWVzi7Sq$D*NT^99w-zDnOP)8nAw@-xLI;D4)c@r zn&i-XwHMzd$)#es!K8%Zn`#LIM2XK{sUvCr$TOw+mg_F3f^Fd27fj%k7p1*3KbLd#dpICu~Oe!pTrq zq^yR_!&M{Ucz*JYr}$kOp}?epTxgB)H)l8Q zcEv$Le3Jy~JyAs32WB-G88I!|!CeLq>?~{2le1aUtm zoklFc1wGJKg_}BE?bJqR`0^ov5ILA-y8g3T6`WD?nYoqZ@Bq{_K^|_n!ifX8F;Bn( zg+w9XR?7#X?zL;=m3ZQGI`HkpRM>^bD%$nZRY5O0&@O{#vRhe}oMk*}H?tj)CdEfQ8VKkWBY)P$%1E@r(eaof%`6AU( z1d=(5PnNPWf*TV{WnFy=`JZVPL&-*A{}YX^qP^zw2G0ALx<^@~102LZY;giFcZTl)Jb z!HP!mOXw`_!<@2qWF!g>?|jF7BN*p=38n@ZPD$iEEbs$gEiy#evH-D^#$>887M_)> zZ*$f8;Bs$*N#<+3>`7~IIKe^k+7sgevXl;>Ie8)`=ygzd?TwG)0z(MN!x%S(xIL&a z7BkS84uJL*WR6>ol6hW-Sx+ld4M~REy{wZNVmD$Neu>ivhbZ zDZrr&Sdb%a865Osv7=WlyP?}ASZdigm&-x@=%*y?69qe^dCNY$6!3n%0WK9F66aK! zVq;=pfK&otX4uOW@qzqO99EBj^9d70K?WO03XBH)U?YPCV3rhe)ujM42%jYU6hePU zi2q6usX!;pN3%oKv~xKylYlUI1t3Atl@W-*A}1jCLCBX5@mK=5VYqzz?g@Owuo0ww zCW_MJN4}ii`SE_q;wNg0vwDQ;LD>BqlQO35ZACbPjB8mdXE75+b7`z;>5fIJrKyqK z@S9?@?!=ql8L-b!i8jrLa&E$;F*TS6)QpO@1HIE9>uY~e4E3l~hWI}-?HIsoI2n}0 z^L+}NlFsd5Mf)u*MnCDrE~3Ec^)>#rpY-&I*;uO8gq=H!!^9wq^5XXP%&XmnM&{Zd zv^7(tMuQ%Lo|@a*_G}@e6B9=YXm`t90^tq&2ku9P&8TZDaEZW!!N#H@q|FPb?}aYp z`R)D#^9ARyHxQmdu4*u^I`;wx@xeiYd7T>QHvh)Jos2@f?d^J2TU~NcDIcxncL@?l zJbiN)Z0xXtfd^S&3~%fr&{Ze^;s*i1zR(cL7#jWb0Jm=fT(OoPfF(kv%xv(kAmasX4KOnIWma{k=2yqU>P&glJNu9=#f~0(r8O@%o%a7cw6Mwyx_4 z@s8AK221AF{$aA%1(kw0m4eOEw|8o0-PKCbb}M+W#fg(!q;p>)g8gT8#4{}uj-OAx zQPI=>k4SBliHOqFhyZ}_@m7ZW>1P>76Hg!b_Ys1f{z|(gKei);xSkUJ=-FF$n8IJngFsqmya4G4iX!MI|M}(mgpHEi@}uhQ&9~w{ zo)cGXiv@74OoloOjn_9e%uu+0F(3TpLH*@GG9oEveIX3 z*xJz*4HIE=$(2LLV!h8PL!y*_%WV9u%59n0FGIOnQ&stxNPZU9BH@GNzx_I$k%ftg z3>MD72|e)yg-+&y61^tjGxfV~85!_YcfpP{kpPi;yv?a9{rM`Vnto$T>$!)e7_Gjz&|t6{CSH`g5;q3P&x%&H{CuFQrZp>K;}-N7 z84{cse7m={4%?~ix32W2$d|IZ1Hv+d-^CFso<}Q8lT~hAP!vHOg8^|74pCLX+aM}c z;ST*6`=3 zsrBOB7~b@sCmbe?3T``yBSB_=2a(-j;ecz>aAb3Ngj&?Q<+0UmUPss%v0v_lJ{=EN#A(xO`MJa8v z^WY$(B+*FTVDfQeU_tH7hK4GORpZ#3r^?LsrwVt-tt_v}_Ek5veT?w+9C&1z+s5~E z(X8`(m@Iyto4ZAvD%P*QYDRxA zR7ow<-&`r^DJPKOaw^A8ts_zwTUYlw@KMKiF&kNpg4>-j?*gamYI|{R-IW`=E%D>M zOR3*O`6fnpk-&c0&8bUPI3O`)ojyZ`2PyVW4%Q`LE&6Zl@O$JR!fu4$yVaZU+S`58 zO%fa+>H-Jvt*osPE{{l%DE?3Wq{(5jv!2#)d7dD!b^^%y(siJ5VT6TEvVDS>{jO=f z;_BF5tZlf{p`1li6w5bCiLE9n!|2eK2UNRxtFOI&5I!{QqNd7-hTz3)vhFy_A|Yq} z?XT-~P$31tIVmXo1 zDuUHK(I4Wb7QFUv_m^pu-u{rOa3)xLog$+sA=qk@EQ3ucAy{r-0h9sdNO}*zrC|fL z1bXq=0}rN1d1^4pgjmUmT|F7Ufw3W!T84yPwWJz;W55exL6gpCt3*zC!gTdS zM_aD`ai5orPD=shXES4ny4@jUWt4vD7CBk*T4Oe{GvqhBm?69F&0O;b|CZj#e}3=~ zPQnXy_iHS;ERGM>g{dQ?1L*idvCx@s{AD-GDjAL(`&Lhd9=;GBg0EYTSi#^{$FPq6 z`}c21A`^M+-I&;cXO$%ucbwLe-Xs_+g8H^HAj_8n%X`~V65(=9#C(Jzf$s@+r|Sj` zYA#LA^9$sJb^RZ`zBq&2Lw_!|g2HF)ksM-H15K|~{j#?*ZZq}h2;vg(2&g}Q1apU2 zOokajc4)Y~I25SkeM9EqBlP|=rN>n`Hr%1ULi_oW6CRDHA{2?4-q@rN=LvU@*Kd!k zfx2&ddz(pHuC^Ol9{@G*br-Q68Y3n)Cd%WnTjRwaI$8%R=UR2wd@gu9tT>uFTZ7P> zs69$H+Vfe;cO9Fo&-Xt~SHo;>QynOCfnF z0vd;#88P{8Za)AtEGw^5;rJ>?HP6ZJS8}#WU4>Jg4K0QEjqDHUm5OSAGsHZm`m@qE zF16lTd}EbD`rEnA*l6&5Uil{A<_dwMXJfZL@AZUJ|6kXbkJ_bN6En|#HQ?S@<(h)WqxEl9ufn9_^oUbT-_z+4~cld$@t_A(! zJS~Wjc)^vC?{<0N?q(-=yKb~XWqoV;Ej8N1l!w-n15rC|ZC3v-t{z{~hZZt)$0?=2 z9&Mu!-wsbtPXC;&7_I2%2B)_$?9t%3-4zfR_&!l{l}g5o-$gDyGet^Xq518>rs9CM z>DU+b+)iMp99FnD^Hk}1#oiiE18fF|8#m_3ITZtc!0K6 zS$eR$s{`LULLPwviy1Ob0{NtV_ik;?WAZxwK6$k{avhMiLKhT&tZ9LBV}D|Y%ICvYmfi1R9-N5&?efv7=OT^!LSf>?m(Nm`#_(0Oqa_1 zPq~PXq>#hm#;f(ww;A7!e!8BO(CCZDj(%D^+Il7RqCH$nUM^cbyNC+Jt`nW?EIIP^ z6PstMN)@*sFysW`dOYURJTPHnDpcb^rafvHtT`h*#2(qxo0$LHU_`L=#hKU7}w>uxcC?qoI4sFUG5D7#B zRfHIRru4w*-96qLa?k^Ajdww6@Pkp%?o!WF;1eJ?r|TQ1JM)-GXD2C|U+j5Q2U)6E zo=j|~)5A<`=c1w&7TvxSqi4ha-8I9P$uF?bmP&PJvh1eCOxo=4;P^Q5=l*#+t>SwJ zj(0f(+CvuJh!S(K1#+-8YI$9k){ouV*=OFs4XO!k5EIE)?TB==q>1C7ioS3@xM)vV zjW+n6be}u6)91e5Gs6k)0p6AV=lcSu+p}+f`%DLIu4ew3J2+spqsJmhq{)Cg>w&^_ z2tBdM@D-=S3=g1d7-7z=4!xoe#zlkb;bTjGx*IF(iidU#4p@V{)V@^^7xK|GG{mYg z$r2xlX`GFuf}n~GXpr! z9`ifnUjYX(RJ8ZkK44;E0_3#~wqZc%cNRttWU#S~LiC$EG|D0h&4NM>4m<9}9K3FK z6?4+USyl&cs{Qyujg9pm*eA8i{*yow?q3U8Vu@g4jrNX64%VeEUhr(UHJPL z-_+d(tyM+XKjRW*J}GyZPxPnjM<(rD=N)2hFvruZ@@c|hd;v7F@9zc_Wm7Yly9*4p zfDT4?ifv_O&?jO_eHOl02JJnf+rc^bnWpGcB6n!_;@k=NBj--r7-T{eeTILE#qfs# ziHi{SD8;`&*>Gzl<}m1fG8*V-XJ@wvssp_5PgE7{!SILdl!bM?XqxbVodF8^{(}^s z6o?Zb|6h>ouVktH1vku!$0|N#YY<=-xmWq0$G+eaXnWuFCZJg|VM#t6M)k{-YUp$?1c6j|qtR?b;7R@Ez*<$Lcc~wQnk&TWahUP6P)QWPv zs>~{@0VV3kZse1m`?P1~e6}MR03s$+IVlgNV>2?6v6k0W3bQ{A()kc6%74`D!01a! zzcJ(%o+6fnvy&w93M2qd*d-1={Im4X(>E}og)I@0Ad54?R`0q-1|f>$ut@f4C*yg8H6hg+;15`Cp82?3%#{(LU=3y0CRVH3g7q;;MW6*-+#X+tMNvA zW!JBBp`(wryWqL3pt_>2?t|>DFSTSj4r>=mt3{d7dTg!Y`GmU3Ha5!{e70^TC7L?F zIO3-a6q2$EYEIF-%MQ-+cL`tjD5$HaSM1rRN8M!^(2I{FMt>*rf@$A|LR=u%Zj&|J zSW$|FrLUmCkj-?0TZ(0G)7acxDwDLefYYMjvu=>#uD+A8j4HkHhn~b0&kThZ zQh(h9y6YSd`dL*}q^vBs60VK{KBCUL3^ubGKn={gW_7Q&IdN~*hw=7^;4`5cAf!CL zLzIzy2fE@^2yXUvtKBF8Y8TX7x2oIQ13*6&BYi|h-UHD0%8HYfUdp+`Kr7Y-=y=B+ z?5Ky?o}0=tm)3qHv2_vcBIi@KG(=xcO->ycR2X-48msPU!h*87mqvzGFD|M@f3u4$ zrz4CG`vJ3@<{Ao>Wvdb>oth+Fv?ZT~ai5-_pV5lyWBYB)hiT_cL%EraTV5wF*@k&K z-Yeac6+Hdf{!<-1kN0WC$AT7q_b)z)XnJ=dZ!_EcO2C;#U-7)C()p^~*6CT95={(G667TQKHJoKrNF~1eGe;c9o8HhIBFlvSIyV=tX)ROJJJq1v-#K*l zxJUj)478Bj;jmB#wy$4v1p^fe;09T=g~(};=?8d)Zao3|9fT*VoA0CFcR4=IRA=Nc zuSMx(L=1en$!MEpq}Z1gb>gg4l1KA9uTcIxLZ{&im^1~xe*F4T*Q`N9`9iy4{()A` z??7DIyND>_8gWXOR^&dD?tj_Y7l7)mmw0`?wjX7!jl=KCPnPo{DutpnbZ%y0ESj~o z=UFH@p4<1;A&ByKuaa44bJ|H){GyODDzPeexPEzdoy)2g8U$T`8uX4RmhL|{(0{qQ z45XbmV1fm_?67$5T@X!yJx9n#(~OX=1NLD07~xd^t{=3Nf_(eHFGU0pD3y?fY9LYL zZ#bZn3Ee>Y;*e@s8Uwpvu7MdIZAARY`_y9f$xD#4QF(cc+CqXt8WVpr4OMMzVI$>A zrfNP_fmt?TzWG=R2DPLVnF{;BZ$4M&0V0PH<{#}CnT=dTR;LrD(gJs;=5mJhP=+C? zH&N}{p1ULGT#lEy9KqwHsD+iE_lB0OxuKE~@eZnej``-j^-S=;`Q(gj7-kT0Xx80g ztL*MM~>}WeOIyz}+6-q+lR2grE=L{bA8p)wy zB5#H*&d5*@+(nDf8eFOO+dp4%g4(0hemgNF5x4P|At5Yf{|ATUmEqyx8{@@5h=S6M zKKV@0L$)O}V>APjt?G~ee0)c`_GR=Tr@_4}6*O9fG;yyjW;UkeR|mJ~DhgQpy=KYJ zkY89)T}^8!R;?z7YkTg-;pEiprmEW;?T<6TzxqD=`-?L+Fl!dh&9`NYsPC_QqmMPJ z<}eO-Oklo&i76S)`uqJI%o8Rrg429U1}C;3|BI{dj>h`$|Ch?j%vJ~?d+$|7QZ|=8 zLI?>NWs?yVifoeX%ifYbBZcg}_a2u$e$VT3zTb0xzuzDC`J8iqocrdw-tX7z`FzaY zOaH<`9=Mj$0WjCj)geGn^5`m7_bu4%h41<^%U?UvaTS6955F_vLXLXCQ@H~ zIaN#_6y9jLmLV~{Oz_5-+2KnNR5>nf?`r=;mX_5Eq%TMS8$ z{Sf%-=QcL%yNVR<& zIGk`ulWT&=HTs7Nk(JT4QhCO?9wtA2JXq)qo`|e^nanOmEBL6kYN9R-QCacvE7gbc ztwR_Ouf2nwA>=3J0gF#V)i&|$>@dWXR9BHe8(-%{wb@-S;zjBJlozrRNKbR{rm&# z0C%0*cYTSSGj@!-X3tA8DoN!daXfKqkKk|_E(EhfgXC5{A|;pGxIZ0NPV6-y7$U1( z5zWWBx`;?lA1{mqL5~nVP7i0gs0W&?j$g&`Ux#SNx7XpCK;%8m?*2sJEZ8#Eoe0Q1-~WsvQ|8|K z?v~8dnbzMrGFhr>UkP+|T<~VHWbSj0MuiQDyjt7HzkkS8Uz0ShUXfhu-!iL8vpLZ{(rN#T$ilZm$kqk>P zWcvde&%|fWAlqB}lbzta^72b#l5{?MdN}<%8X;}1BSc`Gw5b3VUQ#HEZ-+s?Xq&SD1U#Yvwu5v2n+8- zBep=Ck@w`bKWCPE)w5JvlH1#wf(`WTir4>@Jmtt$c45)}tsOSU74Dop!k{^tnZA?R zHr!ogJ-DLpwR3#a>B>Wm3B1>He}786s4tglaosU*PqVM9=#mylywT0$INO0cB7N^W z9S27S6eB=w>*Jv?OVeU|+u=;-DXrDL~;O8}%Cls8AL@moTbmV&8BkMF=c<-YZK^C0~{)miP)i`$|cX z&x!-S6Dr6&Jo22Ca?B+CIr2LiU52lC_u%(f2$3KjTT%&ckQRkiX9pWlMFv$Ire1YD zW91@nE9b=I7~GY=7f9lDjM*HVgSGwBt+B@4@uCJ9d2$`1kfCtk1N?HOwg`_B>vvcL zg3{g2I!jbCCWto^bp&aO&UUSMqsuO2K9_X9*w|Degy0U{jv|u{nPP<#_&bJ5-||Q) zE5zaARc*ji4PWppAX1nfvNUyqi5EO^{1BCXzfuhn%K(wP#fD!0Djjl@g)dK2Y$pr) z6wbt+WN<0K@WWYKCD;|w5iLmh*H_H>XP-S*>}_RPj%F3M58Tz{n{AEQ*gv+zK_Yc-#N%sGmO)N_l z45ub9Km3(2A~nPakdl&?Sp9(t;Rt#*(>h7GYy_=B7|Bv(e9n!M2hg9I!5cuVs-Q9CSQ47Cw7dLMS`vob?Cyn*Dd|?qwECL>&?j*R-fWiB0--UCS z?=9np(TmPq%AC1OLM`$b3vtCWL75WfP72)5xFn&V&HSz~;8Xwh`pl>h;&?xiNlQq@ z0?0~eHxHEDnUkyacxL-0MJ%ViB#xqs`v;Z}l`sTbnW1Yls+{H?B}#}eZLDkeH455j z_Z>cto*vAf@+tvJmkLdAhX5}GjDa#l^s0AoK)oUg)5&Sdog~$XVrtA#ozlzcb0Eng4s0y&g zpFOp1IU~>Q#s``sncodRzx+&=OiZ%AWAVHn=RKLm*goNHbso2w+xs_fC#$yC{Yi|s zv(93nq7%b>64SH4NnGs~#BDr1{h)jhUOqZ04>aWkEs1_6h1MX#IwmX93A!E;lpESDU5_y`Jtf8vO0@$9P#!ZXd|*=a2OmMgg6#-?*El3Qe#kWHTL!O z>CL>qgr=x_0B$V-g@^&D|2ycvR?pSp%FEA(v=znsdnm9OYJg}9qBQMVLV`j@D;(aX zD-Bp@Xl8tKvtRDH0(O>(pEEOZ(M6q6*fhf0e?~74Wq1X&NM{K4k9myHXua?5S(m63 z(|#-C{oI=TBHr?+gYo)}1v}dZ=-aWZtB=1WG)Pwd7LQ4G`oB7Fs8vjo$~9T{X-0=y z2ty^~+Tc-XX(9*fZG$=Cy}LsRVM{ZUV>LNvBBnLUR5EmrV|5Di54W0O;X#YazyQ|N z(sHfVq#I5%QO|?C(RaqBnMnLwf;d)xwGC-wxeVRgy0p!p?(v z!xAuR;7hRm0QH}N9|5o->}DykhVe{Ok>!os5?BDGKv&4z)k2e;ZuNIWxo`d4_p}j% zu{^dLC6+yT@jJ7Bzwna2qo>QW%*pm&!j%Fx zrTS6#J}0PCaZucrA*7dv+;^HyAeZjgCOI?|7m`FF7KK1hU;m0DWYpr3 z-D}9vVoOw#PmY#TgAwK2_||rP?RPAeCpUaJG-y(zW3ekKw>dp|uBQ5nwUy47ZO!K;i2x6EqD9 zX4AuaTABDf3o0qZ_47wg&nJygEzrF=+y)+PS zqor-fE+lFrCV*weuTwpM~)04U+QSv?l_5UDu2K}~i#S@aI!lH||y8>j5&LQx#9jt@#6CS_!@$vfE z?T;ew;=-)Ty1!4xINQi6*?@v!kFx7*QW{M;E?=T75pI1V2qic38q2%vC zaxy(Q8TOu11%4wT9_mU431zlYQ#ZGA=AY(EMNRi1sW!K3I$+R&_ zkkl8t{bGuaT~{Xx2b=I32gkshB5zMu!@0Je+}MQ7Vr#W)(oPJ4Xr}h_BESM5r)8gB zs`EbOf8O)Wk(LRpBURPa5CApgHwIc-Re1i=X*k}F*LqSaDk_S@#t48d#v_pAViVD! zn^9-Pbszz97}C(e;fRF}9fjfv8c8b#bL8RHz*6?n4uS`^$&a+XuPysxnKSGkQ<&=E z->+yH(bMy0Ao?kt{v?$fkgP8s`vf$BmH8_zVK@Jrsl93M#)yxdXNcY7bhZay)7|4< zy?WeWe~}>bgoi6bbx>T-P*2e%PF9{Cn+Peboo|@?4+-q{viiU@`^T4)HK9>aq!0-8 z?bX7Y_0j8DY9NnBW^?>_hmHNho=w0Cza=c!!>0uluzlV>!;O$ zfoLp1xiH|^VT^>673#{cFwpI=4S2f*kj6W1#O(r}^FBlUFSc7a!~$ zU0s+S20^-@@E8V21#0oW0lYjFkC@E!4nLQbT#?`k>SQG zU!?+QCHj{#vs+-)fpNB^)1KU<&g4oZYq?VAqxR2|n+I_=x1ESR2a9J)DM%3J=; zqA{Ek(5*2Chtio7EQ9%%JHP8Wf2LR27K_TJJWoFVC28UsV$_$Q-W_` zH&HUI_o-dn+Hz?5l~w`aj?ZZ&-12SyI>KeW^T;ucPGC=kPZ zD0hYQayuacLHq5e7K%58e{*y9QN4FNoS5L1Sv(jU8)Nb8`^-w zG}LodPH0VIFyW`}ufk{t>H7bEAUc`DF0)y=d@1FtqGn*PnzA=-XioRMKIsq(Df%^peBmu(m8ORB^+%HHp1L(VP|)1yR;kv-ZE9@0Q?4w zpKJO6=2p$0ZuWST++C3J#3;0wy$K@(KAmJ7SdDp|7nQv(Xs;v#k%t!R!42`>OWY1s z!rappAd)*D)RAS7{{@Rzrb_CAs{>i0;@Q#V6tG$AyO?Rj(MRz;cxa`Q&@uNiLf^z$ z4D^a5RA%$G(Us`4PSn(m(8*XfHxRwpOuT-b)}76oqw??3d-agG+?U3~l|-sv_Zjs| z-U{X&QJUCS?;MpgQ*LyYI0Q)8nMRxcJ(2%-8+W4m!B00{vnKbaoZTs}GtCtoOzQC4 zm1=9vI>~;;Y1q5pmZAG99h9SGhO#Zk_G-ibM2jgKVu}VxzhB`B$q#_;Qk+-zAgnxFzdBZYWeG138A|JM%R$5>iQnNXy|dp6l#Rt6yY52`3%M@J~?4o5|B{c|^

ChT)Y_vjfp^BhX?nM=Hfd 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 literal 0 HcmV?d00001 diff --git a/lib/matplotlib/tests/test_patheffects.py b/lib/matplotlib/tests/test_patheffects.py index 77b6ae3145be..2592796b33af 100644 --- a/lib/matplotlib/tests/test_patheffects.py +++ b/lib/matplotlib/tests/test_patheffects.py @@ -3,6 +3,8 @@ from matplotlib.testing.decorators import image_comparison import matplotlib.pyplot as plt import matplotlib.patheffects as path_effects +from matplotlib.path import Path +import matplotlib.patches as patches @image_comparison(['patheffect1'], remove_text=True) @@ -132,3 +134,57 @@ def test_collection(): linewidth=3)]) text.set_bbox({'boxstyle': 'sawtooth', 'facecolor': 'none', 'edgecolor': 'blue'}) + + +@image_comparison(['tickedstroke'], remove_text=True, extensions=['png']) +def test_tickedstroke(): + fig, (ax1, ax2, ax3) = plt.subplots(1, 3, figsize=(12, 4)) + path = Path.unit_circle() + patch = patches.PathPatch(path, facecolor='none', lw=2, path_effects=[ + path_effects.withTickedStroke(angle=-90, spacing=10, + length=1)]) + + ax1.add_patch(patch) + ax1.axis('equal') + ax1.set_xlim(-2, 2) + ax1.set_ylim(-2, 2) + + ax2.plot([0, 1], [0, 1], label=' ', + path_effects=[path_effects.withTickedStroke(spacing=7, + angle=135)]) + nx = 101 + x = np.linspace(0.0, 1.0, nx) + y = 0.3 * np.sin(x * 8) + 0.4 + ax2.plot(x, y, label=' ', path_effects=[path_effects.withTickedStroke()]) + + ax2.legend() + + nx = 101 + ny = 105 + + # Set up survey vectors + xvec = np.linspace(0.001, 4.0, nx) + yvec = np.linspace(0.001, 4.0, ny) + + # Set up survey matrices. Design disk loading and gear ratio. + x1, x2 = np.meshgrid(xvec, yvec) + + # Evaluate some stuff to plot + g1 = -(3 * x1 + x2 - 5.5) + g2 = -(x1 + 2 * x2 - 4) + g3 = .8 + x1 ** -3 - x2 + + cg1 = ax3.contour(x1, x2, g1, [0], colors=('k',)) + plt.setp(cg1.collections, + path_effects=[path_effects.withTickedStroke(angle=135)]) + + cg2 = ax3.contour(x1, x2, g2, [0], colors=('r',)) + plt.setp(cg2.collections, + path_effects=[path_effects.withTickedStroke(angle=60, length=2)]) + + cg3 = ax3.contour(x1, x2, g3, [0], colors=('b',)) + plt.setp(cg3.collections, + path_effects=[path_effects.withTickedStroke(spacing=7)]) + + ax3.set_xlim(0, 4) + ax3.set_ylim(0, 4)