From 0898596299d550b1284a05ac313b69ac989d5912 Mon Sep 17 00:00:00 2001 From: SCiarella Date: Wed, 20 Mar 2024 16:28:24 +0100 Subject: [PATCH 01/11] Add option to select MSD algorithm Speed up trajectory._unwrap_pbc --- docs/notebooks | 2 +- src/gemdat/trajectory.py | 94 ++++++++++++++++++++++++++++++++++------ tests/data | 2 +- 3 files changed, 82 insertions(+), 16 deletions(-) diff --git a/docs/notebooks b/docs/notebooks index 76ac97cb..3c3ed780 160000 --- a/docs/notebooks +++ b/docs/notebooks @@ -1 +1 @@ -Subproject commit 76ac97cb8c0fa886320a66744336d5860b8446e8 +Subproject commit 3c3ed7806e9c969b5ef7de4b5362bb77a3477cb2 diff --git a/src/gemdat/trajectory.py b/src/gemdat/trajectory.py index e4f7a1c1..6b920d65 100644 --- a/src/gemdat/trajectory.py +++ b/src/gemdat/trajectory.py @@ -12,6 +12,7 @@ from typing import TYPE_CHECKING, Collection, Optional import numpy as np +from numba import njit, prange from pymatgen.core import Lattice from pymatgen.core.trajectory import Trajectory as PymatgenTrajectory from pymatgen.io import vasp @@ -62,17 +63,56 @@ def _unwrap_pbcs(coords: np.ndarray) -> np.ndarray: timesteps, nparticles, _ = coords.shape unwrapped_coords = np.copy(coords) - for particle in range(nparticles): - for t in range(1, timesteps): - displacement = coords[t, particle] - coords[t - 1, particle] - crossed_boundaries = np.abs(displacement) > 0.5 + displacements = np.diff(coords, axis=0) - unwrapped_coords[ - t:, particle] -= np.sign(displacement) * crossed_boundaries + # Identify where boundaries have been crossed + crossed_boundaries = np.abs(displacements) > 0.5 + + # Correct coordinates for boundary crossings + corrections = np.cumsum(np.sign(displacements) * crossed_boundaries, + axis=0) + corrections = np.concatenate((np.zeros((1, nparticles, 3)), corrections)) + + unwrapped_coords -= corrections return unwrapped_coords +@njit(parallel=True) +def _direct_mean_squared_displacement(r: np.ndarray, + nstarts: int) -> np.ndarray: + """Computes the mean squared displacement using nstarts starting points. + It uses [numba](https://numba.pydata.org/) to speed up the calculation. + + Parameters + ---------- + r : np.ndarray + Input array with positions of shape (n_times, n_particles, 3) + nstarts : int + Number of starting points to use + + Returns + ------- + msd : np.ndarray + Output array with mean squared displacement per particle + """ + n_times = r.shape[0] + msd = np.zeros((nstarts, n_times)) + + # Select equispaced starting points + dt = n_times - np.floor_divide(n_times, nstarts) + start_indices = np.arange(0, dt, dtype=np.int32) + + for s in prange(nstarts): + start_index = start_indices[s] + for t in range(1, n_times): + squared_displacements = np.sum( + (r[t + start_index:] - r[start_index:-t])**2, axis=2) + msd[s, t] = np.mean(squared_displacements) + + return msd + + class Trajectory(PymatgenTrajectory): """Trajectory of sites from a molecular dynamics simulation.""" @@ -456,21 +496,47 @@ def split(self, return subtrajectories - def mean_squared_displacement(self) -> np.ndarray: - """Computes the mean squared displacement usig fast Fourier transform. - The algorithm is described in [https://doi.org/10.1051/sfn/201112010]. - See also [https://stackoverflow.com/questions/34222272/computing-mean-square-displacement-using-python-and-fft]. + def mean_squared_displacement(self, nstarts: int = 1) -> np.ndarray: + """Compute the mean squared displacement using the specified number of + starting points. This number defaults to 1, but can be increased to + improve statistics. If the number is set to -1, all possible starting + points are used using the FFT method. The algorithm also defaults to + using the FFT method if the number of starting points is greater than + the lenght of the trajectory. Returns ------- - MSD : np.ndarray + msd : np.ndarray Output array with mean squared displacement per particle """ r = self.positions r = _unwrap_pbcs(r) - lattice = self.get_lattice() r = lattice.get_cartesian_coords(r) + + if nstarts == -1 or nstarts > len(self) - 1: + msd = self._fft_mean_squared_displacement(r) + else: + msd = _direct_mean_squared_displacement(r, nstarts) + + return msd.mean(axis=0) + + def _fft_mean_squared_displacement(self, r: np.ndarray) -> np.ndarray: + """Computes the mean squared displacement using fast Fourier transform. + The algorithm is described in [https://doi.org/10.1051/sfn/201112010]. + See also [https://stackoverflow.com/questions/34222272/computing-mean-square-displacement-using-python-and-fft]. + + Parameters + ---------- + r : np.ndarray + Input array with positions of shape (n_times, n_particles, 3) + + Returns + ------- + msd : np.ndarray + Output array with mean squared displacement per particle + """ + print('FFT method') pos = np.transpose(r, (1, 0, 2)) n_times = pos.shape[1] @@ -500,8 +566,8 @@ def mean_squared_displacement(self) -> np.ndarray: S1 = (double_sum_D - cumsum_D)[:, :-1] / (n_times - np.arange(n_times)[None, :]) - MSD = S1 - 2 * S2 - return MSD + msd = S1 - 2 * S2 + return msd def transitions_between_sites( self, diff --git a/tests/data b/tests/data index 3944537c..f8443540 160000 --- a/tests/data +++ b/tests/data @@ -1 +1 @@ -Subproject commit 3944537ca67e3ba7a929fc4c606865ad89800ae7 +Subproject commit f8443540c65e87e251d1dda435c001247262d011 From ecba420e1c0629b835383297b566c60552cfe435 Mon Sep 17 00:00:00 2001 From: SCiarella Date: Thu, 21 Mar 2024 10:19:30 +0100 Subject: [PATCH 02/11] Fix direct MSD --- src/gemdat/plots/__init__.py | 1 + src/gemdat/plots/matplotlib/_displacements.py | 9 ++++-- src/gemdat/trajectory.py | 30 ++++++++++++------- 3 files changed, 27 insertions(+), 13 deletions(-) diff --git a/src/gemdat/plots/__init__.py b/src/gemdat/plots/__init__.py index 8d395be5..9cde8073 100644 --- a/src/gemdat/plots/__init__.py +++ b/src/gemdat/plots/__init__.py @@ -33,6 +33,7 @@ 'displacement_per_atom', 'displacement_per_element', 'frequency_vs_occurence', + 'msd_per_element', 'jumps_3d', 'jumps_3d_animation', 'jumps_vs_distance', diff --git a/src/gemdat/plots/matplotlib/_displacements.py b/src/gemdat/plots/matplotlib/_displacements.py index d4028aeb..5fe338b3 100644 --- a/src/gemdat/plots/matplotlib/_displacements.py +++ b/src/gemdat/plots/matplotlib/_displacements.py @@ -68,13 +68,18 @@ def displacement_per_element(*, trajectory: Trajectory) -> plt.Figure: return fig -def msd_per_element(*, trajectory: Trajectory) -> plt.Figure: +def msd_per_element(*, + trajectory: Trajectory, + nstarts: int = -1) -> plt.Figure: """Plot mean squared displacement per element. Parameters ---------- trajectory : Trajectory Input trajectory + nstarts : int + Number of starts to use for the MSD calculation. If -1, all starts are + used. Returns ------- @@ -87,7 +92,7 @@ def msd_per_element(*, trajectory: Trajectory) -> plt.Figure: for sp in species: traj = trajectory.filter(sp.symbol) - ax.plot(traj.mean_squared_displacement().mean(axis=0), + ax.plot(traj.mean_squared_displacement(nstarts), lw=0.5, label=sp.symbol) diff --git a/src/gemdat/trajectory.py b/src/gemdat/trajectory.py index 6b920d65..68addd9f 100644 --- a/src/gemdat/trajectory.py +++ b/src/gemdat/trajectory.py @@ -96,19 +96,19 @@ def _direct_mean_squared_displacement(r: np.ndarray, msd : np.ndarray Output array with mean squared displacement per particle """ - n_times = r.shape[0] - msd = np.zeros((nstarts, n_times)) + n_times, n_particles, _ = r.shape + msd = np.full((nstarts, n_times, n_particles), np.nan) # Select equispaced starting points - dt = n_times - np.floor_divide(n_times, nstarts) + dt = n_times - np.floor_divide(n_times - 1, nstarts) start_indices = np.arange(0, dt, dtype=np.int32) for s in prange(nstarts): start_index = start_indices[s] - for t in range(1, n_times): + for t in range(1, n_times - start_index): squared_displacements = np.sum( - (r[t + start_index:] - r[start_index:-t])**2, axis=2) - msd[s, t] = np.mean(squared_displacements) + (r[t + start_index] - r[start_index])**2, axis=-1) + msd[s, t, :] = squared_displacements return msd @@ -499,10 +499,15 @@ def split(self, def mean_squared_displacement(self, nstarts: int = 1) -> np.ndarray: """Compute the mean squared displacement using the specified number of starting points. This number defaults to 1, but can be increased to - improve statistics. If the number is set to -1, all possible starting - points are used using the FFT method. The algorithm also defaults to - using the FFT method if the number of starting points is greater than - the lenght of the trajectory. + improve statistics. + + Parameters + ---------- + nstarts : int + Number of starting points to use for the MSD calculation. If set to -1, + all possible starting points are used using the FFT method. The algorithm + also defaults to using the FFT method if the number of starting points is + greater than the lenght of the trajectory. Returns ------- @@ -518,8 +523,11 @@ def mean_squared_displacement(self, nstarts: int = 1) -> np.ndarray: msd = self._fft_mean_squared_displacement(r) else: msd = _direct_mean_squared_displacement(r, nstarts) + # Before returning, we need to average over the starting points + # ignoring the nan values created by splitting the trajectory + msd = np.nanmean(msd, axis=0).transpose(1, 0) - return msd.mean(axis=0) + return msd #.mean(axis=0) def _fft_mean_squared_displacement(self, r: np.ndarray) -> np.ndarray: """Computes the mean squared displacement using fast Fourier transform. From ac58bfb3427ceefce843bc8448c252479b9855d4 Mon Sep 17 00:00:00 2001 From: SCiarella Date: Thu, 21 Mar 2024 10:51:55 +0100 Subject: [PATCH 03/11] Fix MSD plots units --- src/gemdat/plots/matplotlib/_displacements.py | 21 +++++++++++++----- src/gemdat/plots/plotly/_displacements.py | 22 ++++++++++++++++--- src/gemdat/trajectory.py | 11 +++++----- 3 files changed, 40 insertions(+), 14 deletions(-) diff --git a/src/gemdat/plots/matplotlib/_displacements.py b/src/gemdat/plots/matplotlib/_displacements.py index 5fe338b3..2370efaf 100644 --- a/src/gemdat/plots/matplotlib/_displacements.py +++ b/src/gemdat/plots/matplotlib/_displacements.py @@ -79,7 +79,7 @@ def msd_per_element(*, Input trajectory nstarts : int Number of starts to use for the MSD calculation. If -1, all starts are - used. + used throughout the FFT algorithm. Returns ------- @@ -90,15 +90,26 @@ def msd_per_element(*, fig, ax = plt.subplots() + # Since we want to plot in picosecond, we convert the time units + time_ps = trajectory.time_step * 1e12 + for sp in species: traj = trajectory.filter(sp.symbol) - ax.plot(traj.mean_squared_displacement(nstarts), - lw=0.5, - label=sp.symbol) + msd = traj.mean_squared_displacement(nstarts) + msd_mean = np.mean(msd, axis=0) + msd_std = np.std(msd, axis=0) + t_values = np.arange(len(msd_mean)) * time_ps + ax.plot(t_values, msd_mean, lw=0.5, label=sp.symbol) + last_color = ax.lines[-1].get_color() + ax.fill_between(t_values, + msd_mean - msd_std, + msd_mean + msd_std, + color=last_color, + alpha=0.2) ax.legend() ax.set(title='Mean squared displacement per element', - xlabel='Time step', + xlabel='Time lag [ps]', ylabel='MSD (Angstrom$^2$)') return fig diff --git a/src/gemdat/plots/plotly/_displacements.py b/src/gemdat/plots/plotly/_displacements.py index a1999df8..cb15d12f 100644 --- a/src/gemdat/plots/plotly/_displacements.py +++ b/src/gemdat/plots/plotly/_displacements.py @@ -99,13 +99,16 @@ def displacement_per_element(*, trajectory: Trajectory) -> go.Figure: return fig -def msd_per_element(*, trajectory: Trajectory) -> go.Figure: +def msd_per_element(*, trajectory: Trajectory, nstarts: int = -1) -> go.Figure: """Plot mean squared displacement per element. Parameters ---------- trajectory : Trajectory Input trajectory + nstarts : int + Number of starts to use for the MSD calculation. If -1, all starts are + used throughout the FFT algorithm. Returns ------- @@ -117,18 +120,31 @@ def msd_per_element(*, trajectory: Trajectory) -> go.Figure: species = list(set(trajectory.species)) + # Since we want to plot in picosecond, we convert the time units + time_ps = trajectory.time_step * 1e12 + for sp in species: traj = trajectory.filter(sp.symbol) + msd = traj.mean_squared_displacement(nstarts) + msd_mean = np.mean(msd, axis=0) + msd_std = np.std(msd, axis=0) + t_values = np.arange(len(msd_mean)) * time_ps + fig.add_trace( - go.Scatter(y=traj.mean_squared_displacement().mean(axis=0), + go.Scatter(x=t_values, + y=msd_mean, + error_y=dict(type='data', + array=msd_std, + width=0.1, + thickness=0.1), name=sp.symbol, mode='lines', line={'width': 3}, legendgroup=sp.symbol)) fig.update_layout(title='Mean squared displacement per element', - xaxis_title='Time step', + xaxis_title='Time lag [ps]', yaxis_title='MSD (Angstrom2)') return fig diff --git a/src/gemdat/trajectory.py b/src/gemdat/trajectory.py index 68addd9f..7c24a996 100644 --- a/src/gemdat/trajectory.py +++ b/src/gemdat/trajectory.py @@ -496,10 +496,10 @@ def split(self, return subtrajectories - def mean_squared_displacement(self, nstarts: int = 1) -> np.ndarray: + def mean_squared_displacement(self, nstarts: int = -1) -> np.ndarray: """Compute the mean squared displacement using the specified number of - starting points. This number defaults to 1, but can be increased to - improve statistics. + starting points. This number defaults to -1, corresponding to the FFT + method. Parameters ---------- @@ -507,7 +507,7 @@ def mean_squared_displacement(self, nstarts: int = 1) -> np.ndarray: Number of starting points to use for the MSD calculation. If set to -1, all possible starting points are used using the FFT method. The algorithm also defaults to using the FFT method if the number of starting points is - greater than the lenght of the trajectory. + greater than the length of the trajectory. Returns ------- @@ -527,7 +527,7 @@ def mean_squared_displacement(self, nstarts: int = 1) -> np.ndarray: # ignoring the nan values created by splitting the trajectory msd = np.nanmean(msd, axis=0).transpose(1, 0) - return msd #.mean(axis=0) + return msd def _fft_mean_squared_displacement(self, r: np.ndarray) -> np.ndarray: """Computes the mean squared displacement using fast Fourier transform. @@ -544,7 +544,6 @@ def _fft_mean_squared_displacement(self, r: np.ndarray) -> np.ndarray: msd : np.ndarray Output array with mean squared displacement per particle """ - print('FFT method') pos = np.transpose(r, (1, 0, 2)) n_times = pos.shape[1] From cafed7876e3391bc8c008fb3225d05e8edd02370 Mon Sep 17 00:00:00 2001 From: SCiarella Date: Thu, 21 Mar 2024 13:27:45 +0100 Subject: [PATCH 04/11] Update tests for new MSD plots --- .../baseline_images/plot_test/msd.png | Bin 28655 -> 0 bytes .../baseline_images/plot_test/msd1.png | Bin 0 -> 44088 bytes .../baseline_images/plot_test/msd2.png | Bin 0 -> 58070 bytes tests/integration/plot_test.py | 3 ++- 4 files changed, 2 insertions(+), 1 deletion(-) delete mode 100644 tests/integration/baseline_images/plot_test/msd.png create mode 100644 tests/integration/baseline_images/plot_test/msd1.png create mode 100644 tests/integration/baseline_images/plot_test/msd2.png diff --git a/tests/integration/baseline_images/plot_test/msd.png b/tests/integration/baseline_images/plot_test/msd.png deleted file mode 100644 index 79c69df4c1b7acd7eac819b71ecbbc3e446281ab..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 28655 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 ao-FalCTS?Y%!T56sB3E4swK)6!T$x-%(;62 diff --git a/tests/integration/baseline_images/plot_test/msd1.png b/tests/integration/baseline_images/plot_test/msd1.png new file mode 100644 index 0000000000000000000000000000000000000000..fd479f233aee9f0c638c47d9e27200928f379713 GIT binary patch literal 44088 zcmcG$1yogC7d8qg-60?#DJ3mPH%CwuP*6}hR6ts~kvvElgpvXRDk30AcZx`fgmfq& zaX`B7+~D{9|NU=_JMI|2!!wRAoU`}ZYpprwGoR;KZ}<&OHBur5A}lN{(yLcc+E`dP z8StVYz=NOYpCXBZHz}9PcU*KF9=N!hJ-UyjVdmm!>)>K*ZO-a;|B#8aEP;P~L@bup*Q z=#yy6Ov}jdh9AG2!YeDy8_KvXB$_C%B{RF#y7tYgICn!m_u_@Lt%XZ6OFiH2#=YuF z{wt@`|}K(mOc;YIuEbi zy{S}uk;(u2Rqn}eqFo=HZLE03E?ru+tPWk7tuFcZ+Whu_fs>98?n!ymNEl7^zr26{ zBnd%0`} z3$UrFsXbQe@mEtYKKS`Qzxh^+(hfd!<|Us!e&QY?S4{QRlyll1)6np+Q|meRi3Vb! z4`X^4;#Stuj+kWJ7T;PBr?LF!!|(wtEc=T2Y-=_eEb~J8v6WDXADMTHTAJ07Y2&*k zpN5a+;^x+0&Z!o9JRMdc((`X#U}2dY{!MtMp7m!WvE1VL+4a-M)>5}jM=M-CwkN|1 zou*Z*{>J4uam%j~?oZLxzTJ!$v?R$mxvGHyBeTznQq?4>L%^)(_D+|7bdp2O*?f;? zzV4qt!x!>vnad47j&;bMKc3%=OViaDTs*w^`(#q^jvNi6nKw`1eT=RS2c$qGL8cZ)pO-xK&d7@W^ zgWS$>twUnEwDv&Ya9!(&ruOInv)Y?>NaNr$&A2ey6y#`?3R}SHOvPMAgd=Qa9IV5Y zFohrGmqhJd@Q+TAnDm6#gqtxMwKQ=yFZb=(R&ZTDrwx>%8QD^@o0+xcC#|F?b8 zlNk>WPgqzOYq+EbW|mq@*6D7%?fcJF25QJsgx#mdiKdG4awX8*R4Y**vn_>rH_oC=HdV&QC>zx>$W_)>nQ+y^oL zcHm!Ga+95}dMlsvee=dNq}Wxf8IN;hgoCLmR>jAG%Co&E*&`2$uMPVKB}p+YWM1%G zTwN#k*Sa7L{O5M3xVX8Wbv&Tkkb2}sHr!IuvFmY?R`n@{TT0m$zR52>I$pHAvzUXQ z-Xc#K?|hma?k>PK@$J(~Sls!;YdQP$Le9iB|9+Fk( zk`Jf{`mRO(Rbd*D*KnPEUj)z z`3sz^#5u}$=QlN%L-Ku^z6~bVrbfger9ijLyb!IhSEL~G>tOtFvy|?)XDg8f{TI^L za^hQKHv&%PtJ&FzPGP&AoXqp6v}Pj@*I(0QcQ9p))MyS(|BS4spGW$e_J8`&lSTlLhCr^eqEE@ z?=v~*Qz})yp%2rAoNj{9_K+L%uD@->#9wr>3ga5Ta7Sbx`>vJ4yyLv!okv%oD7zdn>~|XiKADw{N&F@piW({mVDG! z?eamGbDFZNsATWu@@r!? zXZ|foSJ##=Qs1$$3|)FI_YJrIzIgE!$>Dt3A)%Js2F=IHW$9#(sc`zUXYc+Mzj$1e z^Bl9Zt%v^XxJXBhA1u2M*7_@qtwy^~EIIh^DVeNoPsdD?`){AplvygyvYErCM}X0MjQIXy!s-0Quvb2Yj7H5DJ(XpReN z#^-y4%4Twa6wEw4%Dm*#x~5-Qrq*jnj0Q_o&ueUt%*uz6`>h1^*37K;YMD&wGDrRk zjK@}D`f{I3OQ*Ahe0i6v)-+L>H%ENdI<91C_ePtP+8d?lONX3nq?=G9 z;VJ`_QuzN;QFBX63l^64SLxDUrYFfg_Xo0YkIIQj@H8+%hj2O1B%<~!*CV|2_Me5*jN`B=r`Ei}L zSRjk~m*bwOX5LWmn75JNpCq4dWI0@6|7>OdFA)C(o+OI@ZSM_l-A^GAKljBWHLP|w zw>Hr&>EnWxon7-?%ajnlk7YQag+9|`f9=j9)k03FYi%VCz{t}r7XSU#vb9c`!u##< zoVI<7PABy<#OC2cWx)g$!Gy-9rqg~~mE)6v#DaC5DKbvK0^Nm(DOi22({1K{i<7%6GWks?cBQDSDDO^h5OZ^&N+-bFi`8Fk?ou{of-0EvI@; zFIK=Ee%;yl|NQ7o#nzbjDy*$auUN8kr__dhXJpw!q_X!%ZY>W!#vV3?oK6uwk;|Q2 zFxO=i^|=?cfG4o`m-8F#qi^>(X=H zi-l!}y9?y+MJtm3)gMPvQc{n_!d9%)xJw55`rRWVhU2OoIRDCdjx|HH%yOBRghglB z9S9OM`u}-F|LyCyR$@e1x2ltzng&l&s_V&MQ2+nmQ;-GD(b_#SRAm~|di?l&>RMXl0F;r0g{4@}YwG_%A#|;=z=c?& zhs!Fkh@4Kv*+#TN+(qEOK)biMH;9x`!jx4a;D-lMVK#l|wd61~=MSjlG~_nysm@^^7bty^SZ(@mq~^oh;=hua`Z@dSzvp>LL_|{@Pi7v$ z{rt!jYMDZrYQ~!!PohW}*@EA?7g;f%T=yrVP_)JHpm-#$TA^Se*-Z|83|9}%NshVS zo*=)evD_H_gUq8QOd~3(jNR|daR$h^|89=9(AP%>eyw8hhVtBMw3kFUE&cHw1!OWq zZrYw3eiHuubj6EN!>7gSC;h~y$!jd$-@OYsKA%$OT^HMQRQi6Q<#@{4m0_CpP{K6h zRCY=#Z_>v!GA^I|##Qg^6RkMyIZe05A02Ryc&y`l^hI&YEoxwzH^Y}GCrY2-nQHN{oQT`o6FzT`zx;&H=R7}Ro*P&SeAy8Rl6@kcgdRb&5mJmL~x{|nl{js9I8z>p;HnpDBas#=jd+^@-ziU)Smp1VuP1(QWv)o>2(Y|M!{#a9#a#vD!SIocEUawVP>RXkVo7 zZhu$%uAafy(>&?^zT*E<^o3%zABr%P&@+24iX^-C-}Qhl+G*yMWq+jn6_yA1hr1>yl{73gJ;|8`3E(4Yg<;l9?67fY!r(SgS z*A2J!8|rKiS|}u@ts*`<4W`hZL$*oJ1-(Z>>6;%?ny>hs_LPYEq!${X_ydhsFZy-j z>a}AyZ56lrChSAX37V&cqAz(g zO+QG62I>Ul`=Hhds2Ns%<=&1A3jNn}SP0|uE zO)nJ9f%%1vdtORpwa7d3_pU1{7ePjGj4V`SUPi?{zl6 z>imxT%b}#?nNMOgcjXS@hif0El{xgOXEqED+f5Fs6b|OKR)@zAX{)QNA^i)JoLcD5 zYxJB=32PUsWpeOrH+XuTi|&0jvaXt0A1(Vk&5MPf0Q^_Ce^>G1CM1%S@J=s@7glW@ zQs@g=D*zm+(+<~j3ca`Ni;IgVphVS|&!$Gq%sc?zAu=jzaF9=zNMl{1CkOo}`p68Ao;=*Htd>w0?%bhlQ&)W642t*Np#CEe;l* za_}A=cI>z`Ad7jhnVFfn-F39DHR839SGH6#yt2|rKHWsEm8=&8%M;IGvioK5?7gqA ztRo^XG%mrFTneO)F5kkLvke`Vk&$s~B$b#zy3Q2$F~VN4n77a1QQMyh`CgCbes&>C z7(jk!XMLO?-C4?x?=XZ)fQcMl83R=_m(k?+A5~B z@yE}3WibP1vWzTkLK*kvrg#AZ)4Q}j@Tp7?jx7^X4SuU=0?SovK-la+nxD zIv9U;<@{@FekCQ?6iM82k-yZC4$;btCb1h5_fzBRDwYE!qM=IjdVE)byOLx4>HV4ZIlgC!RXjJkGhUF&7HdV>@lI|1`!%7< z-rh3M1}H3T0!`4j4Shi2Yf=uFHd`3AHhq2SI&&ngDs*vBZJbvrd#GNmnE;MT3GD^M z{(4xbY$6cX8i>Cha~*Xv2=>wWQTn!+x*yj+INa&NQZH`WrUUN4MjfJetgU)5ZIqmp z0Y*Xc8s&NsQ(I*y7tPBUEG`4 zCL5YwNRaT^ zU3clPyo(C<#Or~3?9DAKH0Jwl@EJa8<0S6mf?VbKLf!nlLg3gfA=QXXt73-2cTUs` z0aOAUaFcRFvQ{Q%5*1iQ0ls-{hRWW`p0uT~cdrHq3n(kH2jIdk0iIErwJ>ij6BDdN zAq~o(!vG1R<3^}Tq8u6<56CkWhGU{V@cTIjM1rXVbl|FVMlO_NyZxn85Xz!JxX`}W zfL-o9b(P%rmAq`(k&>*$CezddCPqdHc5~F9Q89Ke<~8F>N9p9g1PLa7QeIwO-9tl9 z?(mB*`LUheTpE@b&tU_0_DUABmBV{F*kq7Gw}QC!m1fSM)KpbhfKa3VX-kWIx1zGL z9Ko{jC`jR{ZE}NYKgl($_^)Uc<8&+tZH6iAvq3|b>M=!V`}5QN^dT6S%M}1i0I@dT zY`y*!-~DXPRPIK`nTN(o#kVe`=j4R3LAy_zBIHZ*JFLLQoKE{UjecexgeNjPV&rQK zYW_dljYDf{7mqGsQOts)$%hR0IR5foFmX$KWFIP{82b&@J-O)Q_)YxAe& z^fb$nr18dky~)S;%!=tZ0%HHZriN|y?8{FnS-D*?zwsk)*qA*ji>lsL=MpEpPG|I) z8mp|ikGj&y|9uvNMW8O#fg-@}TANuDgQV9YSrc^d>Hxq=#sp0_B}VaE6jwg#33X1QOakmdj^v z@X&Pk^wdAsM4{HJWarIs1pWq~^z}zv{?_ zhc@Z5zrO;sz$_D|Shleql^eR=mxD*P^W=_!z@1B43<^|sSCJ_FeO|wDW@Es=OKxid z;XD1-Gg&6T^5rMHjgRklj87n=I$UKrqLdi(;K;aXU#p5L*1i2zWJwdFI@VUiL`{kP za<+RPXxGrp82R1T6#A?64Mx$?-6eOFip58%8KjokF=ztYb%(6h^6tA8#=PT-r(C6-R!{Ra?)95N!DJg+PAo zRTq;>n%(erW$m6!F?903UTCGB+(+9b!oz-DN_ON(c-Q#=@1G?V~w)0;e)VTi7?s60Rp}3U~@R#n*YjmRPhiXTmXJvI@N%ci(B;X zMu($Q2dWY-jJXZlN$xEctpdqNYO*&p@H$rcJXQV9Y+6i`eFb5HvDdtE@e2sMcc)5! z+nywuV2TZU21)^E$Oyg>=&f~0*YU3l9;2f|pt6Tm@Tf}{U-SzRfo=_u@ z|5Q2loU$5hViLQtzC$#c>|(wi?Qn^Rh{)rOg#nhohtHl-f}rzl7Rrki;jcv|2-eFc z+2l2UdnhphSq2;Sw3K<~YYY}UzlHq6ft|oS-8$MGsBIBxWfD!xVP(&_{J>k>O=Gb^ z<$&Bw?;#xnN7P_nQ?SN`Vv( zA_T6e^TxK{=gE3MU~`5DcYnbDfDYuZQdUw<_Kc95KPlhA*V6YX%<<^hDR25R-J~$8 z^^^Pb({{t_;;ZCU$t)T=Q7B0q5VlCe)xNHDA$<8f^4SBXp4={=_pid`ZAUB4C>*ZF zto8sJd~E^R1C(qrL&tjDHG2TB9We`)kp5%FT!j8=GM`%|Yx;Hv`Zbiz2qkXMRyD>K zE5L5JWb&m&bUhOD{8pJTVP-s8!us^ho#83;0?~N5^HSuo==g9?y5iYx8Ool&u|>|1 zVa=hr7fUy@XjGj`G{!ujq`ci>^PmEx8=ytPYHDi!*flmbmMvE-921`oK%bfoZ&op0 zMWKpjx5*&7Jl-C$EvAe_0D?!bLOQB=@f#m{%>U@XV|aKBuU9O$)X2Hx(su39))D)w z>r)6~T3vRp^&X3Y2xtT(BB>CmuzrNC6(x(SLJtX=5NYDG;i0XJmDcBT(pm~znIo2$ z?XeUc9E3m|k>6jaJ>>J-X*ZcF8Mbc(`bO^8qjFqpe)tN%sX+vfwjig z=*b2$0X^s0VH0h|^+L(p+k0bo)P0=PXkay4qM8uPaXu@dVNG^%w31H9qn>zXKpUyg z_b=^#ToIw^`J;m*%%? zZIu|Rk+eN^1yy|GLhj_=Mc?j_&b}2?v3Um{dUJh!B58b|>zFbGVyP}p&p4diXW~@f z-ci@ljsgtZI3Sy=QwQ2&p;q_zm*=HOv{1SARa>r=Gl@1xbMVb$94Urc1~)-3an6Zt zfS$0D%k6f=cW3%kv~G|m?#(Qk<3z4?o(kPu7QzJe`)jNy((E7nJP;19H}hcEzddui zW`0)TNa}gpc?JfC2eO?v<5&O?=JefM)`>=ykX!sUd`}&6-!p9zwRG*qv?=;09!8bB#DQl5T(1tHHtYI9M==nT}Cl zhSE9bllmNO)dx(MtlVEQBvC^ugdS7HyD9}zj&8N*20A)2QjvF~sucjVo>0C?EpzH@ z$1HC+T9VAG+KR*`*c)%I;+dh=aQ>Jy_%w@L5uy)mV&-;bmaem$|| z^DHR*Jv}`lX*uWF^;do75da&u$I|kGLra;OA^M^86S!}GGTgUj=2CurR)X;pL@3&B zk*Il0S3P$b_}IZx2bSfsX|i8yo+G|nqgVl9EPnI{2M1*<4aBpfbBqpEtFPI2KpHvo zvEt8rPX%#k9}rA<(mr&Ob3AC0gv6p-TYQ+~ zCx%xURcz~nna7xQ{bH`--@Uk>KX8zL_xESdS|a`U5J;Sv+jD9PM8hR!!{Q8#jI(KitrWO zcr*{@7qS?Lg6GKz1ehc~JmEPlukFQCY0We79ot1ZM6s?Vgk{7#v9Po6lerqCzK0lhvrpoxD=R{`Cp)ioq z5J|KFBwTFX-;u4~Xf$CzyvQ(UQgp-GCVuin37ya#C304(aP-guJPU{+Z9f z$*zCZ?fPQfEX%H}yvHGaVY%yC6|)Uw+%azqE*2uTTRF^jQ&Z-hladL0Jc6}*(f5mt zru18*pH!TWvCX9X>hRXQ;{$GQ;d85 zk=gFPCLf%c6l1*7nx;olz3{PerPP0~6e}R1W<5)knIjmC4QrkZ>=~Syv9P(!-v|dn zvjQL!fR*%g3h@xJBC0s~cZzJy`kqkzcLATnzgE*%c-BB*+ocNZ5pdKn%YC z1e0dxEDZ({c5+`BC_kPu+@>f=AhAH8_L7K!^mdhVwSBaGoRhkx!cq zTbB$vTbtJh1f^!X($UaX7JnvnUZh!o6v%A6mN>vlJH0|n*%!9-6Jdb`A`vDo&>(<~ zMC@`>*^vxo-d%Ox{Sr*+c72gT-8J#*(U#KsoWKZdEfW8qdBYgsXSn`2=|r3XiovC%p! z?-G28NS}pzNf6gjp6&q!+1%Ea1ff@I08mVE3VF7f7b9?I=X>itPpau=Cz2VwXP=9( z0)QEH|CAIFjkfCG^S-}75Pj5ew7A1!IOxnK?>uk$w18^EzF!Q6jfm)DM~7R}3P)=S zPCb|Dj&UW}#v+i~(Pw;;BY7ZA`r@*o#i-@-)(2Q-b=O{!O*q7tZrg{sy z!_^Uy;Uy35q;rNOcB?xu-y=(C^jlTPr{li6m9W-R8r-#n80j^mc0c2N%2ta;VMkCK zr(nx9LEBSvu;ehkIqcB-LQ9^|XuzrYjNZii+>Z?iXbKJeEkgbntsDJSQw_)$P>pUn z5~0tEh^Zx&56Dp7jIvZstKUl7ktgY>>k}$t;4VqIgW>8J3S93kfz5{);-VzR(A=pW zIHhA=d^KPznudhgyfI)Bqnutq0a28jEady9-8yncO(d2@xwB1)PCAiY!^+0iU^8tI znvEy7sL0pl0$3alM7$EcR%$yBOknmPwL6zgP~&MT9JnCGy`gr$y>pv>onYmlH}pU1cXuWtBEQt_KdU8VEI*Tv?Acy@#jqY zN;6*#!L`yqqaQqzoRKOQ>U3|XZ_9U1`r3PnyxVap(W*oo^_ps$*zxx1QbUoh;jSC@ z%wTyCO=f99<`B`|;<$~%7c?vFZ%5H|NZm~J-TaBP1)<2(C2z35K~i+t?|6e1AwX$} zF=}??3cG$e*~mQ4>@QO*Jjg&+cDBEf;ho~iTKO@jv)$vY5O|A9FU9MO=928^u?~G2 z*t0DA6ZlTO8WNM4EC)QtR1|cCQl0X9wzeZ>l%O;7&_>WRGB!eu1&+!C>)2qXp0$El zLUI6pv+vWPt;!4KWCrKoO48aE&HrKxRt)M3h>Bv=>&x+kPS4z1e0kJYX!)lrc}cND z{a&Z%_!GkbF*>;UfT1(#7+|U?WYZ1Q9=cZTjbc&@)l_&xTo?K$!95`}wl}twk&|Po z#Bd$euG1sH4vjw~tilF*B71BK#h{;cDZm1gDe;EnO&hGPr6{!4e3P%*A554|6WW`- zq?5gj=JHl$r>p|rqe*6bN0WqU+q#un z@!TT%^q0YO)WZvSkb#{PVU*?4P$Sk&W@%>6M?jE*tBDU7!fdh7)=b~-oK8|S^ zJOT=Hd~`Glv0@PS(6Z~#FpVogsrw`r4r%<8CT)pj<97jIE@yqHC_5B+Lk?{fQqOtQ zBFr^NW|B1<9#wBMhv|`SCm?~)!nD+fQ29xf$U=en;4SyEhgfLi z-SFc&Q1#$GnxlQ@{D{7j+(KA_K6w@&6d|anQ@^5Ltagfym;agd?L=&E8akk^{nSxe zmg2@AE;4(_MWu^l6#ntj!F&ojo;!<1JB!Avx4NFUFQRaYUM#)-hlWdwOwX%16jW#t z(a?|g^jw*jIz9nxMAMBi)6eSF3cMdl@OL!CZwh!!R?tmt7#PO{$Gvr@o+kiJF7HvzdTzbw zZFN9I(HRE8+;YHL1;0{s5Bwd6w(=~LW7LX~k5V8zq%>$PWq*irQXM$!(MOoyP$=pM~T?YYBWa%1Uy zhRO}~^j~p-pVTLDGOJ!d_3sXe4vtf_`EVxQzOV8f3e^kbacd}ZER^{UA?5)*SXnNkwIq|zCz zyJ<%|X=OVzNyj0H+{h8?C>s@_d^ytiVf;I6jDsvwJ@KNVqKJpAGCpT(cZotu0JmNE z)ak$W%-VPxvedePxhfDh+Un^NqY);UgG&hcDo{vkSTK*Xe-PpybIil5xw@g0)&W-5 zgM%s@F$)T7I1l+685wQo*6#8luCOx1jU&$aEl&PwuZMZOE3_ zLC?ac<>lcs=d}M|+@Zko5jo@nGCCGlkuksBVX1)^*{{|dR7^}*5Mv0-(RM3-NVh&> z;S{Xhe}teZ5M_%171RryZd__Ed_BDEPj>^AgxOs%h+Gts(?!$l&Xjia1!8beHLaTk{?N#r6FVg&kat#{_g9L~=ePSPYaHAhETcIqw3w-H zqgUtF`HTv1O!PGHK&OYqD#%E9&OuMrGeo|lsfRV2+RkxLL+a@Iu3mh8h6yDE{$@mF zj_9GyIMbTo_qpjiI7^`yxt~vRt@LT}bEIyEiDaDl`hpou5Aaiy-KXlx7YI#uZm26= zAXE{B@_v1kr1Mgdml54=#^C{9)`U78Gz-u=w{)6*l09qdMp+}6g`||$iCw{1?e0tG zQo=Ps<9VI)4qxc!I+Y8jl(Nc(=r*C}_Itl1_%^m@B=mepT zf^LqOq0TGdnCxH$l-ywy7qeH?`$U{%AU>VEG5cDeA8A0uL@GndP{oe05UnjOj)(|{ zAfK_FPIt}91H@-=c(9k7c0pn9XV(-0P{AzlJj6z%hYB+Dt4G4$EPR}3#%UUH-(yk&Lfkf z7SM4%Y_G!9>>*P6K+WdoUi%|((MN)S=<|z%r5*t)2(yjxXq5rROk$!(jm4+{k6Iw~ zt8!*!N<9S2bn~jI9tTfTB)$73c71jbvUQnqHy@B8gE*(y->FQ1ts>eTx7ZLGihvj9 zoIDxQ1;&03`<8`K7j|hJBzeg1@r&D!pgTL?c{;yeze_G*?18ZU~Gp40g z;n1lHk=*Cz=8C7o)Z#W4T_(24-8&MY@|qR3NJx z;U$RZY=Genx7CV?z}XQU9c_NFyU}a!Jr&L^EF~3=_#b-h6);t6uVWiv;?JV2@28jb5)Y7d~HTiXj;Y2P7O@YH&W9#!Z^H~!4y{EB}n|i8U%<|b{#iN zLsNFi%gV)ga4R=AH*-fv$00jJ8w{q9+!}Gt8MRO33Z^LFUuIC*n7+m`|A+zU@_vUt zb$;|zo862P^4NqjM}`zcbNUFyZqdP9*M~7hjDa&Nf6|;uLzxS6%4D0fh!H z$1U{_Y4LgOAu4z67_JQ=x1ukr#cc&E^9rK**o;d zB;RuJLKzOA%5NakzzyK+$+*Xug}#BoDx8&Kx|xZ7zz0^^oZd|q;;xXOkfI@`hcc7CyeR!_>=J@o%rUh6ppBpFx z8xDRIevGn>=1)EgP`nV1FFO1jFbhi54C3PUP2qOjQ=d8#CST52l<~x%o5}BiWbsW3y*ysa;y&&x0a96*)%waBW;^f-aXQHP3G*tT z;Bn>$_gnEvQ-9F7ma7N3ueFH`aZ;2-I{+ePwQq7V-wT&~cW}Py@3tOrhlZF3&}g(n zMORb9=Wkaoywe1pesx0_D}rrkGwo22*A8C!fyYp_zbyljKiK`7n2h#loO2 zas%)ILaNcUC03s0i}uG=;ik+(n3{Z0hlIt%f)U#Zq9HrAaVAW>&5Uj^7~j=J?gGcR z*364v^wYmP5Bp$FW5XN>aOhlS1HQk99;Gj}({6egPK!{8noFiHolgGYMm%b(;JWprc;U1jIyug7Vl=_!-Dy>K-DND?O4)sWF$nv>d<0GE=mN z@Y?KVLGeYv&_?f!`lM12Q|3BBw1XTow|jErwdk7QUUleG3rv3}A?LiH>sF|%-WnqY zngs$>=!Z)01@5>eD7`XVZl=&sY(zJnaW#g?H2EktmtF zvf};{J?97n^48+dpkasFbK_9Qx`&4&kn;l)<36H@X6E9ua``2hkmW2Q(f~6Leq^u_ zk0?KlCk6QyN~YyQZntc=42ey~?k&gR_En5V32q9U(=&}#Ga7%70~XR&<| z*}r>5dy~6@Vj7LRzr2wC?6}2{S+YYjjEKjht9$RC!1=^NnZ?JU*2u7xg zkC}J)ry$8TMw&PS)a$HFFZOz)&bydA7!Gy?M4GEdL0271=ez09YEdlTc%6#9eg~~5r zHe9l$xX{@C>hJpSS7Xni0c&M2To-!1w|(TOJWL1>D3f!jVeC4bpfvAPS_k>B5e_$& z(%Yrq1`!4^eS-o56dKqGrp({mM)Befm*!47Wt-kDHypl3h!y(aHShOZq_G-36OY_K zdH*Q^HbFI(_%WDmc%vh}XFwT#yolwN<;G@Xi8Q0^G50%PFheuZXWSN<@~Xn#@_ni2 z_oPkNn;g;tlHvdqne19XYPo&tK~P_vu{vnM;L8>$gSHGVg4loXai-p4=vKy1@5kcJ!sTL3)6H%vt{dDfpe2jKo>+BZR=|C*o|xCwFc! z@_gJc^EaH}l>^SCS2rkzMpf9DDNLIPtDC}FQLXCK(yAMP`hqOqYmQRMx$WeHa4<>e zI-!^YG%zn2o51o7O+XK`jaq{`xSnzm4?2tw$~@rqzSr~HWC5nB_W?RCP%R*<7$IIo zVALk~k$@W}`>|4N^vh%H3$}5QWJcAI$jqF=FgaW2iL2y@oG^ojC}3dELr~xd6`()^ zCtIt*06>B7FZW4}$HNT6Ib~_~yD|~gFT8sse&XYXEQi{YH7dk>-O7FReze@u$o!nR zm~9FTP`99b`sCDl>Dmy-T^+Rl_FH3Lj%%%@N=g)W>LCZ~jfeZuy8XynulM@_-+7Lt zj?UeMkoO;~?qL7V^5Q>dw#}1;%72y*7pbUtD`E(|4SU^DuuK3g3a0tNXG4#{Z2`JW zgZjjF|8#B+*u!!zfEg+gs1A?aww%?&fogwUPrJ*T={ipI4 zmff^AAaGX$5qkryw}^EMkwgIXIoY-sN;))pdNf{jxD#iV1eO#|QwpO-IPC!^62LVB zz2M}7P#ZFR()<5z@{@Ob!(7X%!~y^%mc}zN`f1PIX?0mx8I#$vAC~ zhwHo}!`?!O+3@bD<>XRM?KyzLi2V;to58xe4Czvge352w?gJ!=|Ah2a=ZjCz)pfZY zl4y}BgwuWS#{M|+h*P}O{v)^!VW8N;=#Sdb7*j1Ta>z~CSjU#DV(HR{ZtC`gwL@!s z`wzSFyCI+DYI>YOm^QuZdoV3lZuBUQV;B*i8)A?GCZ^!_D5YPCIdAt{Cuo&hP*^3ivUSMm4_U zhHTgv^7D@{hZI>f&|P`h?@LLh7V(Ep@u^^9$mE~s$Y}irhZXDxhM+kjAc);G7m;Lr z{@dw(i4XY(1^`KG$M$UYx0a7o8?HOffk_V?O#q*TKt~*UNbWt0L4Au9@MOH;U43NR z+JzXoIMqx7V`|r@nY_4R{2VQ;6_F?Bf%*&czR2uU(7a{oB%hv@@sCE_y6;kQrt*Y* z_)dnaB#ai+`G^5<6an^Cv-$q#%i_1rdeypbRrlS-AnEAjs<_Rp6(skU_)DVg5NkFZ z6gmH)DMJD1EMR}9a)$k$Og0GXRU_`+3k{Ly5>-M6-p(2jfJ zy-t3Eh(If7*B^On$gkkCak6p-YX@it#0C(NQL1-rXQ>k?Vo~5w;HVSxoww3=ygPtp z=V@mO=N`o9NHW@?@jyZlvM{^Xy_;cE5Jo=RPW$(UwE%H%_f8+um{jdY2)jD>q&nZe zLDaCpDoftr#OA}&uo19gSSBdeifc%hxPX&NKG{C8aL>a}k>K*B;Qr8?l&RtGa^r+A zoPJHnla4#!N-9iprI(;nfLd6CM9wlKw|sXZtRp^eh?lH=}`%fLBR%uFPzL` z{Nwg2Xl9k}qftj=2jfU#tHLC2LGSaKr|Yx1C$re_0g)&+3(B|XGpBF0Cre9c@btbcw}Yr84pu6T_L;XB|0Tb8 zWeLC=v!AMakfOrTK4Ordl~oP?)0;JfRW zJ2ZZ>cxNK;CVyOH<5TLpD0K<`FD5e~O2wLR+6nOgYp5&PS9&uR&(uPC9{2k*%;SCE z(DzRt!qOH@bQMw&w2~@Yz9Y%I6PVhj+)kG+MHW1bLlGdzDnR`8;-uOOC5MTJM0fjA zyBnEi+fDyGo>lQ+j%?%qwt9hj~}_)xao z<0448&)Be)ej1C9K;2L0RIK%*?eh4KO7pZo(xtz};mEQiE@^)(1@m z@2q~d2u`QYELn^O#BsWWf=AXsm zo{g%rv3o#1s!V|++}M0m^x30_le%r8sU3}feNI!~#*IDmO(`y$@YVG?EiQU(P@5^= zVJX}p!tOfNaMnnPl3t-~S+c&(6>FF$(&$)jNkuq{K? zrJnidRgb0P@C&4`4@nX%BLtrvuJ_`7wRfgyIlX|?wuYB4gN^x>CGCaRnLY~g6HzdgWaI(db1K<1fnCiW2tpToAp9z zm*e=SbnE)5oG&EKSQl>NL)1-!Y=lwtGDSF7^`xg?|vWI92389yG`9?1PWs1~~8_ zmY$wd$W6kuR_bcYXYc!0*QH5jC4EgHIJ&8!OVo(gklag zn8O@it!NN`6`OpeD|}8dT-^zqCtSsttma5*75nYGg}96PN=an4{u{M7^CCY7YX9sq$Gvn1C*J0;(}7I4Uig>V`JgG{ZQW*^e_O8YIxMQ zJ5{4Af)>mGL<;XHBamTSV=*7Vdb zx}RJoFj2nDu|h4fou@%OH2p3%kmHZxJ(30`t6Q^hc|mjzbifd3+C=^>&OSHraK| zA_fum8euKfr`s!edBL_S^ujKp`?Y^A*^wB}y^qUk`1|(a+esEC9cnDT*0!(2Y3~Wc z)D?M&zn5mq#Xk?g@S#5tOEQbK;*H3P2@x!76I>Y$$UnQ{LToG+`iLJ}3yj{>AI<9f zG(1Ajys0I6eD+#tC;f~KCikG?6pKY@er~7^Wz|b!CZ-#W+68?QSQ<%QDw4tz%pT>B zs{b0|8|TYPpjOI0clp2lYKAKQdj&VPT`B)TImxe2it;QZNtJ?uP=E-oX>c%;o4Ci< z2LNVZ2hjzLoKSCW{8c9|QPD=6FCL4G6v`96vsDgPx6({pCfPZBFA`hGp5woGAs$O3 z=z7zHYq5Y;`T4FbsE#~);a?(pW38lh8Q&B z_wnS(YM7)YEK4QVQkP7{A6PT23=_n0$MiK`8jZOmvGXin3- zu~)oXU-pbHydkQ2QZ4goDDF6k*R8CxKeUXjKFfWK!?Zq@E2_aSGb6XV6p%YVc`)Jd zouqW&bkD=O95dpv_sQ&(36244m}Zi?%Cyczbhyns@!v(^0-rL+&^Mm-m!+&l_DQLveqbk9y`lr zyM_$cSzm}tIL?&>i*OrV9};}ZL~>=KuD8A5KK928^*5!q6X`Z<2vK6hl%s)JYS|mF z1;=*p_Q(E_U znO*+SzbeF^Sgk+FhC9fu3V>m7g)Zj^7kEhP$NKsv8Mi{8b)KFSO(AT^xnHl9?_H#i_d8*uLVARI4J%>nK_Z=+gCk` z`T+*KSnK+z=80zWl{}s|m*n0GhItkB8Fybk?AP2I&6SE9eQl|_tJC^zu=7=*tq1e6 zwgG8zg?t}z?m{n}>JMW}2mU-&`)!Ha{HLo^ei~B9`U-8!gsTR1mlFg@U9&&4PZuBd zY@ZEBo#iyG^HL2pW`E#0D51dxssEsP}mh5j9yTnnfK_NGH(&N~A(X*PjEROlu zp8KSUmakTe__7u9kTYgL3*vN4DE*2Vg7urSB?NYRVEp6)Dqt5VZ2`7 zKIWagL=tKsj!cCu$-SAWflZ~Gr8^Vy9T;HhsZ5_Wz_QKevytNbr(SkXH@YY zT+P?mO1I`%x21M$ZKx`|(Q{%rsq-ts*ts13tRB1*d!jT4ReOCr95SY+GeJ@6`oCu+ z+(_%nr;r~}Q(q(DbAPAQ{@g1=45X`LGFW1Ltmcb^^+{(S3%1X{g(E$kxow^Kie^M? zL~*)chjmc{j7j-!I5(!zZJ2BS%#pdZ5+hoBk3rGxff?1)@FH9AH-Y5xqT%&#F5KzV<6*()zpIP(1!ViY<`iV?o$|Vim7%s` zBAs=Ms}?I83SLHwC)a`H3P!?JlU72-rozOeFTjKY&9MgH#3F%5G=wZHi(7}}4!dbU z;{RXD0f?3WWhc9lTLmy<`%cfE|I4(RRochzPxeJx^?sR1IvmXVjA3F=cpyblZ%P3Z zYm=F@yg!qxthh-CH3?Rm8bBv25KoLDEkZkA=sw%BV489D#?x8}GUf=L$WYLy>gzv|CQtO8 zZ$*uxe0)S0JRc{|J!NuqcRKf3Jr+_WG?iJ1do6KE)EJ(gPxnp zaeEe~AKS{4u|UR|mIYR;p&a+8*3B(4>)vUJ6e@CAVr4UviqFn4dvMyK-+2d&o zI8HKV-co1TT8EsCdS-lJi7kE(qCaz2APh!8gE`SOcKRfF-5?X`OqrKJ0Xgw?vwL+} zA_u_)3}PXCFe-@mC7+#pY_l4BzqW+eUr#%+C3eJW!~Mpl=)aOr0<$`xadB0VtzyR0DOku(mkv{xjylnW%49j> z$IMjn_4-v4Q&q|kwk=@5V>fzb2Gm$iYp?sTXN#ihwd#x%K)$@R=6&g^Zu5k_>?Kxl zmd3L`4w%+}Z zxc6B|ku~(y2E-XC=CcMCqA;^a}xxI`706(zvkt4JLQ=u zHK87y&c(o%HhUKTGui#&>#=?F0b4LZ0~a-Lz=v1gx2@(wXhc8p^CD~J6zYSGXKp+U z4mz{?S5pU=0nvzyhc|#v+_PJg4j|XOZy(H_=JPO;+NL`(3%nJXrau6zIb+TUEwZea z)SaprlLti^u~dLg6Hp~|GE-tIBB-_BjPNt?5rp|nkrWpn+F0H28WNA|1+v)Z6e{0` zcPsn*2m{BZ@jxn(Y_8u$M6Xof!)DByM@-!m&P+!<)WMmMx;k zbJs=pLQU3KO?|Ya*vFgqZ9Sux6UmHN5VKBGDDJ;spMs z(Ia009$rx@&Quhs&h_0}X`<-|K(3udbx~k(QeIv0RlSqVzkh%iaqkFN@M8)q3N^fU zF(xpy7$f(vRxvplUMcY7i8~~5Tlo>pP>H9t%v!6-7GW|X+X=$2euSd=ei{o^W#)_% zH0H|uEeVDGnRvKHAuS6ock_KHH}FfDWg^K25;97El)rohBPCGsX(lMJ z#51^@PEa7u zC3~Y4KaCa-jMq1_eiJP~s9258eQcf4`qOb|H3&o9nm@+hhUgEf{REqGc-1=zoH-*% zn0rtJoT%7Ov);K(q8;c?~x%D!sLU`rrM6 zF#K-T?%bmC(`{YOcAtbcd9SL+xS2_0ESfXgTb}AXAoVZ! z$rvZ1?fB_C(@upYE!!$lYGWV$YRKJw`(Wokwlezo-d*{ubOq`S7dw*1@>enb+^z~e zTS39&KLt6%PEryQ{iwID;K3}Kp2M_|;e?{>7iipW+>Ssy*`n^BUwv1)*YCHBf0@)~ zR5)8MoP|_gk5N{{Yd@5?fX>Iahz?|L`hJ>~3J-?6yGJ%qu(Jg0SX04e5d$i|AzhSr z#4m~|PG=fSkBGkCPKATGBbeIBjlk_Q^JScA{1$&2!7ze0vuuVqJTnkYK8GIRRG@aR zloFR^S80IKm4ZHHzjzNv(D-Aa0jfwYC(hwz zMjGX2Fg%TP?E+4AKXeKhLpnRE(AYR`zJNHaX)Yvyej$*4s@1WTdq>5BD!*zXRU_Cc z&JMX3-LhA5BUI&Q@6U{-AS3?mr9&v_K&UhXBTyPLR;l4~ya6AD;||ZRheiJ+739a< zBK>i&hZaX+wYw~jQK(LCE;8KlsiJ+BI3Z-JBF0H%rSN?hSHri?*08(7DDC&h{ZLPFy^gjTox5f zRa;g}JJ~nWd9&<;xO%5eviUVT>4%qubVce%xDKX$&#@kA&2g^We}DIXlx0$P0Yv6N z(eYpT{Aq`Pe(oYVr$L$Tt6Y;JBq>HwVotj?N+HcH(- zL+hSkJe8?4$KOIef0>jJ&5q@md@Na)YEEKKDXcfI>A|?+x)a6H{ML|Ls)-eLAFjMd zkd+q3EydUemYNRktSr_jD|sf*dVlasXUG=5BIDLaZ7Nd%R7UuBTwuAFdhcd>PwzTa z4AJP$xZ2LuB>vw~6czk@4_W2*SE77fgtE{NJ9CGtKN;+W`L zii3lYFyAD1h^_k)0R@p8FJdkT{U6u%Hldg=Ub>n1gtir56|GdLdbe44J-D;2;cmI7 zHxckP*Q9qfyJ@|9O6hq`ZcAtncrX@8C2RK*X4X#(bA_Xbfb;^+Q8tkwp;B_%3|Dq^ z!n$oY&g!myWBAjm0B`fixcO8f;kI;-!^Tn9s)LjGU0LTl-~E-b?@h~Z2g0M=Uo?$9 zhLeN4NeuEEiafv!rc*>C>(^#WUxfzORLXHIpz?Y7J+)6sK9S&mYn^;j)6HcD;!1SH z238#{>gw&2H-ule3Ss8&p8q$urr~u}7iT#~u(*7RAKyDSpN@-|V#F@E;nm!b(`Wz1 z$NcSvqvr}?kcC#qva*woCwWJ$`Tb%)ueXDjcp^q_pJKQ|nE+F}iqK}K$AAIOf|Aec zBA4O9|2hh<7ywTB>O<~tcEHj{cWLI!vv43cln6MEiP({lsE-T&v%g`vUo@@9lPSil zoUi#rln|j?6vEq7jWCy3Z)g9!ElL+1pdc?nOgcr~j4A2)BmZ)R0~)^13o$7@%3ncF zg`hR;Vzb5myEP&sn{$AWBs*3wYJQLGeyi4VQUl8K;gEatI= zX0I*tyzE_g;-b0rm>`r7B;`qJmBTmn-vWo)x`u#t7;C#Iam>PVZV!ABsw@s#A|SE2 zi1c@g|7`VEa~9cgcP;nfUX?lC&$&%5b>==&?oa5|MfW2TiG<$w*)@wchO@DvFX zs$hI{ox{G2bqM|rGN07gyqVJu58S?Q^!_%73hzc#0Aa4|$ZlyJWCb@_qmumjT+@v4 zjXAzAzbTP}{GFt*dnm%0pJef(#XQWets18%1(L`y^yeVblYK3D!E&G5VmSSW*3rCH zUveU~l{v1=lG9gBp!UB*&s`o@Zu1ZE1qf6CgrG6!SqdS!_wh=;sgjZj^l7xU9j`go z;$p!M2+NF`Ny>~>#2?LXSb++~mib<;aBBSiqUD%MKH%Z5hW+tg^3Tn4jE7yv)f!2S z1o!&=HjIzE#`TiPQ{|81g9S_tg^$D9F?md=!bv?PO*P%7s+ul*dk^BCts<0v-i^Q$4Gk+61PyC`xihTV#xJ8P7AV%P;BO;sgKxT793LME$c!E=01WgbU z&9nBkex_7)-URP$R}ZiRs~FLa?6b^tqmUKo1%fdtRKSyq+CwIFN`SdK{=5Td%>a2| z_|#oGrBd48;Il`*^P~+m`{o6OXBp2=1my{@#Pb$X@{leCrjQ+AQeFZbC-z9yik$8Q5@P z%5OIb^ws_!KYfa}PY^m`0yI21_R;mk8L0C@nI5HO6+%XUYr;d4mj?GOUMCr#M|&CT zJ+f!_t*LsA=g?cn?rRkr4Tmz#<1m4z%zVT6Tg`vb!aiT+RYe@&t2NTha`eOA#c-@XY0GZ)09ZxS35Xi8vcNR(jGvuK_A8+; z4`ziO2Q68%H3+QV-~pG;<<|WMM*B;o24GWGkP12%N zjXU8bWaYWV>dXxz=o~Bg8BO%0nTusU51#G|NCC}s$!P@c;^KO!f}&yUwws_1IWrSe zLJV8LQXkPcEkqG_oOXoqrSE2;)g$8A9WsFWeD5^LkSLXTe&~i zEm4Kdl>w4M|MQ@H7_!tyt|kp=gXJqWnE)51X(l&y3`~VKfoWlMI|hyBihlZDMGe2{ z*+wgZs~pKO86FwhSg8sx6@N{@lY^A)Bqpc4V>$k5IFK%26pVf$d6V;(us-=hx#q^u5OT zglFTqva9atN@iOQ?(-DnaZJ^mHX=uN&@$b=6>s3ud|I+?pQ=dGt9zrC1I=EWJUZ{h z{**mEiVgA2CL~4JAmf#z?;(pS5-Qy#>I8~(aW~!IebFa`WddAx)vp{Lgy0oEq9)PnuYIkjp-uldxf0&K?!-gHgW*r|1LhFfx3=Wr~lC zSAIbz!V*RK2|TIKS+UDYQ%KyQV_CuYO`zDL76H$6JvRoAFz_(x@;yr{L+9Rn!#I-wa<8`9!=SX)T z=Z{0TnjGd;M%mbv z&v~qDHeKG@uBs}vpzv&*YBLOH1)ifU0baJoTSPFuY;I-3vM<8fSMS_!Gf1-5spj;T zhpHdsr}xbB_G|zIq;S_T8A?r8tRZ54Z|b6HElK?RwVT@XX}3PET8_XzAiA?MusVlyUQIP`rFb zoD;IM%nVksr)9bypqHn>#!Zz=BU$ZRRrPvwyQ#86e*Z!`k>ejK0*E#&b1g02YE@@p zC=2g!3z;JE-bGxyOfy-n`l%Z00A5UB1Kf5W;uS}09kw+;Me7Y{qswXv=bxA?FzV~= zZ7h|wI5BC)axBLuVsf=_l^?I%faCe^}MN?n70EH-K0z?CoPeoRC>82a}6 zkH+i$-OvHoWej`_vs9L3xZQshl1bX?nAUJtO(sV& zLS7#30EuuDlSF2)YA!mjNvN0^jLD$VJkl|g<_qAxvbM8mB5+h0fTKC}H^YUt3}@*2 zgKCfiXKp0evp6245P3o}&t6fKM};_vo`?(I+?*=C`YS3i9aqaoUIz68XO!G+N;BPd zntZu2R-Xrjw-DJUkQWc~UPCR_u8%J8UjC=}*>88f{6CzshQSvf*ELIhc_o801x;m$ zq-kOk)r+(qC#shSz9AZ;#&5p|pR&zrC9};$)p{K1vxh2DAT)}1Gh>6KYqQE^s67=! zr(|B@GnjuaTkf*Axw)sP0}^zIJtV}n>_$6JF0Ow-2wq@T6v;LEFXZqGO9v%Ti+9x< zzsD9kLxX459{{0K8~Yux{erC7&&||)=%J7LB@iR2lT+qU+qMT#QqRVh-zG9~hz`a$ zkF2+F*vgSpQh$xFCKka~GH98Z-xA+O8Ho6p`FB}sILZy1de_dyk$pNfwa~zyr<5^i z6VQN<)pX}~ODR%|7Q74{_qNT}r^V=#K5;gQ#XqcF^`%Z^y;ctX(!z zHcnl=&Zd^vp?NgUxJ#;N1{EDax_DJ99D8}wU%+PO)(+8|OA|L7H=~