From d758ff8722080a6132b30c3780da83186238a02f Mon Sep 17 00:00:00 2001 From: saschuta <56550328+saschuta@users.noreply.github.com> Date: Tue, 17 Nov 2020 10:49:04 +0100 Subject: [PATCH] added py files I that are not primary plot versions here --- differentcells_filter.py | 209 +++++++++++ differentcells_trans.py | 191 ++++++++++ examples.py | 428 ++++++++++++++++++++++ localmaxima.py | 185 ++++++++++ rotated_singlethree.py | 522 ++++++++++++++++++++++++++ rotatedps_single.py | 521 ++++++++++++++++++++++++++ rotatedps_singleall.py | 744 ++++++++++++++++++++++++++++++++++++++ rotatedps_singleamodul.py | 722 ++++++++++++++++++++++++++++++++++++ rotatedps_singlesingle.py | 521 ++++++++++++++++++++++++++ singlecellexample5.pdf | Bin 160758 -> 145493 bytes 10 files changed, 4043 insertions(+) create mode 100644 differentcells_filter.py create mode 100644 differentcells_trans.py create mode 100644 examples.py create mode 100644 localmaxima.py create mode 100644 rotated_singlethree.py create mode 100644 rotatedps_single.py create mode 100644 rotatedps_singleall.py create mode 100644 rotatedps_singleamodul.py create mode 100644 rotatedps_singlesingle.py diff --git a/differentcells_filter.py b/differentcells_filter.py new file mode 100644 index 0000000..aeb12e8 --- /dev/null +++ b/differentcells_filter.py @@ -0,0 +1,209 @@ +import nixio as nix +import os +from IPython import embed +#from utility import * +import matplotlib.pyplot as plt +import numpy as np +import pandas as pd +import matplotlib.mlab as ml +import scipy.integrate as si +from scipy.ndimage import gaussian_filter +from IPython import embed +from myfunctions import * +#from axes import label_axes, labelaxes_params +from myfunctions import auto_rows +from myfunctions import default_settings +from myfunctions import remove_tick_marks +from myfunctions import remove_tick_ymarks +import matplotlib.gridspec as gridspec +from rotated import ps_df + +def plot_single_cells(ax, data = ['2019-10-21-aa-invivo-1','2019-11-18-af-invivo-1','2019-10-28-aj-invivo-1']): + colors = ['#BA2D22', '#F47F17', '#AAB71B', '#3673A4', '#53379B'] + # labelaxes_params(xoffs=-3, yoffs=0, labels='A', font=dict(fontweight='bold')) + #baseline = pd.read_pickle('data_baseline.pkl') + #data_beat = pd.read_pickle('data_beat.pkl') + data_all = pd.read_pickle('beat_results_smoothed.pkl') + #data = np.unique(data_all['dataset'])[0] + #data = np.unique(data_all['dataset']) + end = ['original', '005','05', '2' ] + + end = ['original','005'] + y_sum = [[]]*len(data)*len(end) + counter = 0 + for dd,set in enumerate(data): + for ee, e in enumerate(end): + d = data_all[data_all['dataset'] == set] + #x = d['delta_f'] / d['eodf'] + 1 + #embed() + #y = d['result_frequency_' + e] + y = d['result_amplitude_max_' + e] + #y2 = d['result_amplitude_max_' + e] + y_sum[counter] = np.nanmax(y) + counter += 1 + #print(np.nanmax(y)) + #embed() + lim = np.max(y_sum) + hd = 0.3 + ws = 0.35 + rows = 1 + cols = 3 + #embed() + main_grid = gridspec.GridSpec(1, 2,hspace=0.4, width_ratios = [1,7]) + filter_grid = gridspec.GridSpecFromSubplotSpec(2, 1, subplot_spec=main_grid[0], hspace=0.4) + upper_filter_g = gridspec.GridSpecFromSubplotSpec(2, 1, subplot_spec=filter_grid[0], wspace=ws, hspace=0.4) # , + grid1 = gridspec.GridSpecFromSubplotSpec(rows,cols,subplot_spec=upper_filter_g[0], wspace=ws, hspace=0.4)#, + wish_df = 150 + fc = 'lightgrey' + ec = 'grey' + sampling_rate = 40000 + data_beat = pd.read_pickle('data_beat.pkl') + df, p, f, db = ps_df(data_beat, d=set, wish_df=wish_df, window='no', sampling_rate=sampling_rate) + ax = {} + ax_nr = 0 + colors = ['brown'] + #embed() + ax[ax_nr] = plt.subplot(grid1[0]) + ax[ax_nr].spines['right'].set_visible(False) + ax[ax_nr].spines['left'].set_visible(False) + ax[ax_nr].spines['top'].set_visible(False) + ax[ax_nr].spines['bottom'].set_visible(False) + ax[ax_nr].set_yticks([]) + ax[ax_nr].set_xticks([]) + ax[ax_nr].plot(p, f, color=colors[0]) + eodf = d['eodf'].iloc[0] + mult = 1.1 + ax[ax_nr].fill_between([np.min(p), np.max(p)], [eodf / 2, eodf / 2], color=fc, edgecolor=ec) + ax[ax_nr].set_ylim([0, eodf *0.6]) + ax[ax_nr].set_xlim(ax[ax_nr].get_xlim()[::-1]) + upper_filter_g = gridspec.GridSpecFromSubplotSpec(2, 1, subplot_spec=filter_grid[1], wspace=ws, hspace=0.4) # , + grid1 = gridspec.GridSpecFromSubplotSpec(rows,cols,subplot_spec=upper_filter_g[0], wspace=ws, hspace=0.4)#, + i = 0 + sigma = 0.0005 + df, p, f, db = ps_df(data_beat, d=set, wish_df=wish_df, window=sigma * sampling_rate, + sampling_rate=sampling_rate) + ax_nr = 1 + sigmaf = 1 / (2 * np.pi * sigma) + gauss = np.exp(-(f ** 2 / (2 * sigmaf ** 2))) + stepsize = np.abs(f[0]-f[1]) + wide = 2 + scale = 1 + prev_height = np.max((p[int(abs(df) / stepsize) - wide:int(abs(df) / stepsize) + wide]) * scale) + now_height = np.max((p[int(abs(df) / stepsize) - wide:int(abs(df) / stepsize) + wide]) *scale) + + ax[ax_nr] = plt.subplot(grid1[1]) + ax[ax_nr].spines['right'].set_visible(False) + ax[ax_nr].spines['left'].set_visible(False) + ax[ax_nr].spines['top'].set_visible(False) + ax[ax_nr].set_yticks([]) + ax[ax_nr].set_xticks([]) + ax[ax_nr].spines['bottom'].set_visible(False) + ax[ax_nr].fill_between(max(p) * gauss ** 2, f, facecolor=fc, edgecolor=ec) + ax[ax_nr].plot([prev_height, now_height+440],[np.abs(df), np.abs(df)], color = 'black') + ax[ax_nr].set_xlim(ax[ax_nr].get_xlim()[::-1]) + grid = gridspec.GridSpecFromSubplotSpec(2, 1, subplot_spec=main_grid[1], hspace=0.4) + + + #grid = gridspec.GridSpecFromSubplotSpec(2,1,subplot_spec=grid[1], hspace = 0.4) + + grid1 = gridspec.GridSpecFromSubplotSpec(rows,cols,subplot_spec=grid[0], wspace=ws, hspace=0.4)#, + + + end = ['original'] + + color_modul = 'steelblue' + color_mpf = 'red' + + y_sum1 = plot_single(lim, data, end, data_all, grid1, color_mpf, color_modul,title = True,xlabel = False, label =False,remove =True) + + grid2 = gridspec.GridSpecFromSubplotSpec(rows, cols, subplot_spec=grid[1], wspace=ws, hspace=0.4)#, + + end = ['05'] + #y_sum = [[]] * len(data) + color_modul = 'steelblue' + color_mpf = 'red' + y_sum2 = plot_single(lim, data, end, data_all, grid2, color_mpf, color_modul,title = False, label = True,remove =False) + + #for dd, d in enumerate(data): + # embed() + #embed() + #ax[1].set_ylim([0, np.nanmax([y_sum1,y_sum2])]) + #ax[1, dd].set_ylim([0, 350]) + plt.subplots_adjust(wspace = 0.4,left = 0.17, right = 0.96,bottom = 0.2) + +def plot_single(lim, data, end, data_all, grid1, color_mpf, color_modul,label = True, xlabel = True,remove =True, title = True): + y_sum = [[]] * len(data) + ax = {} + for dd,set in enumerate(data): + for ee, e in enumerate(end): + if title == True: + plt.title('Cell '+str(dd)) + d = data_all[data_all['dataset'] == set] + x = d['delta_f'] / d['eodf'] + 1 + #embed() + y = d['result_frequency_' + e] + y2 = d['result_amplitude_max_' + e] + y_sum[dd] = np.nanmax(y) + ff = d['delta_f'] / d['eodf'] + 1 + fe = d['beat_corr'] + #fig.suptitle(set) + grid2 = gridspec.GridSpecFromSubplotSpec(2,1, subplot_spec=grid1[dd], wspace=0.02, hspace=0.2) # , + ax[0] = plt.subplot(grid2[0]) + ax[0].plot(ff, fe, color='grey', linestyle='--') + ax[0].plot(x, y, color=color_mpf) + + ax[set+e+str(1)] = plt.subplot(grid2[1]) + if (set == data[0]) and (label == True): + ax[set+e+str(1)].set_ylabel('Modulation ') + ax[0].set_ylabel('MPF [EODf]') + if (set == data[0]) and (xlabel == True): + ax[set + e + str(1)].set_xlabel('EOD multiples') + #ax[0, dd].set_title(e + ' ms') + ax[0].set_xlim([0, 4]) + + ax[set+e+str(1)].plot(x, y2, color=color_modul) + # ax[1,0].set_ylabel('modulation depth [Hz]') + #ax[2, ee].plot(x, y2, color=colors[0]) + #ax[2, 0].set_ylabel(' modulation depth [Hz]') + # ax[1,ee].annotate("", xy=(0.53, 16.83), xytext=(0.53, 17.33), arrowprops=dict(arrowstyle="->")) + # ax[1,ee].annotate("", xy=(1.51, 16.83), xytext=(1.51, 17.33), arrowprops=dict(arrowstyle="->")) + + #ax[1, 0].set_xlabel('stimulus frequency [EODf]') + + #ax[1, 2].set_xlabel('stimulus frequency [EODf]') + #ax[2, 3].set_xlabel('stimulus frequency [EODf]') + + ax[0].spines['right'].set_visible(False) + ax[0].spines['top'].set_visible(False) + ax[set+e+str(1)].spines['right'].set_visible(False) + ax[set+e+str(1)].spines['top'].set_visible(False) + #ax[2, ee].spines['right'].set_visible(False) + #ax[2, ee].spines['top'].set_visible(False) + ax[0].set_xlim([0, 5]) + #plt.tight_layout() + # fig.label_axes() + ax[set+e+str(1)].set_ylim([0, lim]) + #ax[0].set_ylim([0, 240]) + #ax[set+e+str(1)] = remove_tick_marks(ax[0]) + ax[0] = remove_tick_marks(ax[0]) + if set != data[0]: + ax[0] = remove_tick_ymarks(ax[0]) + ax[set + e + str(1)] = remove_tick_ymarks(ax[set+e+str(1)] ) + if remove == True: + ax[set+e+str(1)] = remove_tick_marks(ax[set+e+str(1)]) + #ax[0].set_ylim([0, lim]) + return y_sum + +if __name__ == "__main__": + data = ['2019-10-21-aa-invivo-1','2019-11-18-af-invivo-1','2019-10-28-aj-invivo-1'] + data = ['2019-10-21-aa-invivo-1', '2019-10-21-au-invivo-1', '2019-10-28-aj-invivo-1'] + default_settings(data,intermediate_width = 6.7,intermediate_length = 5) + #fig, ax = plt.subplots(nrows=2, ncols=3, sharex=True) + ax = {} + plot_single_cells(ax, data = data) + #fig.savefig() + plt.savefig('differentcells_filter.pdf') + plt.savefig('../highbeats_pdf/differentcells_filter.pdf') + # plt.subplots_adjust(left = 0.25) + plt.show() + #plt.close() diff --git a/differentcells_trans.py b/differentcells_trans.py new file mode 100644 index 0000000..2c3c186 --- /dev/null +++ b/differentcells_trans.py @@ -0,0 +1,191 @@ +import nixio as nix +import os +from IPython import embed +#from utility import * +import matplotlib.pyplot as plt +import numpy as np +import pandas as pd +import matplotlib.mlab as ml +import scipy.integrate as si +from scipy.ndimage import gaussian_filter +from IPython import embed +from myfunctions import * +#from axes import label_axes, labelaxes_params +from myfunctions import auto_rows +from myfunctions import default_settings +from myfunctions import remove_tick_marks +import matplotlib.gridspec as gridspec +import string + +def plot_single_cells(ax, data = ['2019-10-21-aa-invivo-1','2019-11-18-af-invivo-1','2019-10-28-aj-invivo-1']): + colors = ['#BA2D22', '#F47F17', '#AAB71B', '#3673A4', '#53379B'] + # labelaxes_params(xoffs=-3, yoffs=0, labels='A', font=dict(fontweight='bold')) + #baseline = pd.read_pickle('data_baseline.pkl') + #data_beat = pd.read_pickle('data_beat.pkl') + data_all = pd.read_pickle('beat_results_smoothed.pkl') + #data = np.unique(data_all['dataset'])[0] + #data = np.unique(data_all['dataset']) + end = ['original', '005','05', '2' ] + + end = ['original','005'] + y_sum = [[]]*len(data)*len(end) + counter = 0 + for dd,set in enumerate(data): + for ee, e in enumerate(end): + d = data_all[data_all['dataset'] == set] + #x = d['delta_f'] / d['eodf'] + 1 + #embed() + #y = d['result_frequency_' + e] + y = d['result_amplitude_max_' + e] + #y2 = d['result_amplitude_max_' + e] + y_sum[counter] = np.nanmax(y) + counter += 1 + #print(np.nanmax(y)) + #embed() + lim = np.max(y_sum) + + #embed() + grid = gridspec.GridSpec(1,3,width_ratios = [0.2,4,4],) + grid0 = gridspec.GridSpecFromSubplotSpec(3, 1, subplot_spec=grid[0], wspace=0.02, hspace=0.1) # , + + label1 = plt.subplot(grid0[0]) + label2 = plt.subplot(grid0[1]) + label3 = plt.subplot(grid0[2]) + labels = [label1,label2,label3] + titels = ['Cell 1','Cell 2','Cell 3']# < 0.5 EODf,with 0.5 ms wide + fs_big = 11 + weight = 'bold' + for ll,l in enumerate(labels): + #embed() + l.spines['right'].set_visible(False) + l.spines['left'].set_visible(False) + l.spines['top'].set_visible(False) + l.spines['bottom'].set_visible(False) + l.set_yticks([]) + l.set_xticks([]) + l.set_ylabel(titels[ll],labelpad = 15, fontsize = fs_big, fontweight=weight, rotation = 0) + hd = 0.3 + grid1 = gridspec.GridSpecFromSubplotSpec(3,1,subplot_spec=grid[1], wspace=0.02, hspace=0.4)#, + + + end = ['original'] + + color_modul = 'steelblue' + color_mpf = 'red' + + y_sum1,moduls = plot_single(lim, data, end, data_all, grid1, color_mpf, color_modul,arrows = False,nrs = [0,1,2], title = 'Binary spike trains',xlabel = True,yticks = False) + + grid2 = gridspec.GridSpecFromSubplotSpec(3, 1, subplot_spec=grid[2], wspace=0.02, hspace=0.4)#, + + end = ['05'] + end = ['2'] + #y_sum = [[]] * len(data) + color_modul = 'steelblue' + color_mpf = 'red' + y_sum2, moduls = plot_single(lim, data, end, data_all, grid2, color_mpf, color_modul,arrows = True, mods = moduls, nrs = [3,4,5], title = '2 ms Gaussian',xlabel = False) + + #for dd, d in enumerate(data): + # embed() + #embed() + #ax[1].set_ylim([0, np.nanmax([y_sum1,y_sum2])]) + #ax[1, dd].set_ylim([0, 350]) + plt.subplots_adjust(wspace = 0.4,left = 0.1, right = 0.96,bottom = 0.1) + +def plot_single(lim, data, end, data_all, grid1, color_mpf, color_modul,mods = [], arrows = True, nr_size = 12, nrs = [0,1,2], xlabel = True,title = '',yticks =True): + y_sum = [[]] * len(data) + ax = {} + moduls = [[]]*len(data) + for dd,set in enumerate(data): + for ee, e in enumerate(end): + d = data_all[data_all['dataset'] == set] + x = d['delta_f'] / d['eodf'] + 1 + #embed() + y = d['result_frequency_' + e] + y2 = d['result_amplitude_max_' + e] + y_sum[dd] = np.nanmax(y) + ff = d['delta_f'] / d['eodf'] + 1 + fe = d['beat_corr'] + #fig.suptitle(set) + grid2 = gridspec.GridSpecFromSubplotSpec(2, 1, subplot_spec=grid1[dd], wspace=0.02, hspace=0.2) # , + ax[0] = plt.subplot(grid2[0]) + ax[0].plot(ff, fe, color='grey', linestyle='--') + ax[0].plot(x, y, color=color_mpf) + ax[0].text(-0.1, 1.1, string.ascii_uppercase[nrs[dd]], transform=ax[0].transAxes, + size=nr_size, weight='bold') + + if dd == 0: + plt.title(title) + ax[set+e+str(1)] = plt.subplot(grid2[1]) + #ax[0, dd].set_title(e + ' ms') + ax[0].set_xlim([0, 4]) + #if (e == 2) and xlabel == True: + ax[set+e+str(1)].plot(x, y2, color=color_modul,zorder = 2) + if arrows == True: + plt.fill_between(x, y2,mods[dd], color = 'gainsboro', edgecolor= 'grey',zorder = 1) + array = [0.65, 1.65, 2.65] + small_arrows = False + if small_arrows == True: + for a in range(len(array)): + #embed() + pos = np.argmin(np.abs(np.array(x)-array[a])) + x_present = np.array(x)[pos] + y2 = np.array(y2) + #embed() + pos_change = 2 + nr = 25 + #embed() + if (np.array(mods[dd])[pos]-y2[pos])>nr: + plt.plot([x_present, x_present], + [y2[pos] + nr, np.max(np.array(mods[dd])[pos - pos_change:pos + pos_change])], + color='black') + plt.scatter([x_present],[y2[pos]+nr], marker = 'v',s = 10, color='black') + moduls[dd] = y2 + # ax[1,0].set_ylabel('modulation depth [Hz]') + #ax[2, ee].plot(x, y2, color=colors[0]) + #ax[2, 0].set_ylabel(' modulation depth [Hz]') + # ax[1,ee].annotate("", xy=(0.53, 16.83), xytext=(0.53, 17.33), arrowprops=dict(arrowstyle="->")) + # ax[1,ee].annotate("", xy=(1.51, 16.83), xytext=(1.51, 17.33), arrowprops=dict(arrowstyle="->")) + + #ax[1, 0].set_xlabel('stimulus frequency [EODf]') + if (dd == 2) and xlabel == True: + ax[set+e+str(1)].set_xlabel('stimulus frequency [EODf]') + ax[0].set_ylabel('MPF [EODf]') + ax[set + e + str(1)].set_ylabel('Modulation ') + #ax[1, 2].set_xlabel('stimulus frequency [EODf]') + #ax[2, 3].set_xlabel('stimulus frequency [EODf]') + + ax[0].spines['right'].set_visible(False) + ax[0].spines['top'].set_visible(False) + ax[set+e+str(1)].spines['right'].set_visible(False) + ax[set+e+str(1)].spines['top'].set_visible(False) + #ax[2, ee].spines['right'].set_visible(False) + #ax[2, ee].spines['top'].set_visible(False) + ax[0].set_xlim([0, 5]) + ax[set+e+str(1)].set_xlim([0, 5]) + #plt.tight_layout() + # fig.label_axes() + ax[set+e+str(1)].set_ylim([0, lim]) + #ax[0].set_ylim([0, 240]) + ax[0] = remove_tick_marks(ax[0]) + if set != data[-1]: + ax[set+e+str(1)] = remove_tick_marks(ax[set+e+str(1)]) + if yticks == True: + remove_tick_ymarks(ax[set+e+str(1)]) + remove_tick_ymarks(ax[0]) + #ax[0].set_ylim([0, lim]) + return y_sum, moduls + +if __name__ == "__main__": + data = ['2019-10-21-aa-invivo-1','2019-11-18-af-invivo-1','2019-10-28-aj-invivo-1'] + data = ['2019-10-21-aa-invivo-1', '2019-10-21-au-invivo-1', '2019-10-28-aj-invivo-1'] + data = ['2019-09-23-ad-invivo-1', '2019-10-21-au-invivo-1', '2019-10-28-aj-invivo-1'] + default_settings(data,intermediate_width = 6.7,intermediate_length = 7.5) + #fig, ax = plt.subplots(nrows=2, ncols=3, sharex=True) + ax = {} + plot_single_cells(ax, data = data) + #fig.savefig() + plt.savefig('differentcells_trans.pdf') + plt.savefig('../highbeats_pdf/differentcells_trans.pdf') + # plt.subplots_adjust(left = 0.25) + plt.show() + #plt.close() diff --git a/examples.py b/examples.py new file mode 100644 index 0000000..59f6cea --- /dev/null +++ b/examples.py @@ -0,0 +1,428 @@ + + +import nixio as nix +import os +from IPython import embed +#from utility import * +import matplotlib.pyplot as plt +import numpy as np +import pandas as pd +import matplotlib.mlab as ml +import scipy.integrate as si +from scipy.ndimage import gaussian_filter +from IPython import embed +from myfunctions import * +#from axes import label_axes, labelaxes_params +from myfunctions import auto_rows +#from differentcells import default_settings +#from differentcells import plot_single_cells +import matplotlib.gridspec as gridspec +from functionssimulation import single_stim +import math +from functionssimulation import find_times +from functionssimulation import rectify +from functionssimulation import global_maxima +from functionssimulation import integrate_chirp +from functionssimulation import find_periods +from myfunctions import default_settings +from axes import labelaxes_params,label_axes +from mpl_toolkits.axes_grid1 import host_subplot +import mpl_toolkits.axisartist as AA +import string + + +def plot_single_cells(ax,colors = ['#BA2D22', '#F47F17', '#AAB71B', '#3673A4', '#53379B'], data = ['2019-10-21-aa-invivo-1','2019-11-18-af-invivo-1','2019-10-28-aj-invivo-1'], var = '05'): + + # labelaxes_params(xoffs=-3, yoffs=0, labels='A', font=dict(fontweight='bold')) + data_all = pd.read_pickle('beat_results_smoothed.pkl') + end = ['original', '005','05', '2' ] + end = [var] + y_sum = [[]] * len(data) + axis = {} + for dd,set in enumerate(data): + for ee, e in enumerate(end): + d = data_all[data_all['dataset'] == set] + eod = d['eodf'].iloc[0] + x = d['delta_f'] / d['eodf'] + 1 + xx = d['delta_f'] + y = d['result_frequency_' + e] + y2 = d['result_amplitude_max_' + e] + y_sum[dd] = np.nanmax(y) + axis[1] = plt.subplot(ax[0]) + axis[1].plot(x, y, zorder = 1,color=colors[0]) + axis[1].set_ylabel('AF [Hz]') + axis[1].set_xlim([0, 4]) + labels = [item.get_text() for item in axis[1].get_xticklabels()] + empty_string_labels = [''] * len(labels) + axis[1].set_xticklabels(empty_string_labels) + + axis[2] = host_subplot(ax[1], axes_class=AA.Axes) + #axis[2] = plt.subplot(ax[1]) + #host = host_subplot(ax[1], axes_class=AA.Axes) + #host.spines['right'].set_visible(False) + #host.spines['top'].set_visible(False) + #axis[2] = host.twiny() + axis[2].plot(xx, y2, label="Beats [Hz]", zorder = 2,color=colors[0]) + axis[2].set_ylabel('Modulation ') + axis[1].spines['right'].set_visible(False) + axis[1].spines['top'].set_visible(False) + axis[2].spines['right'].set_visible(False) + axis[2].spines['top'].set_visible(False) + axis[1].set_xlim([0, np.max(x)]) + axis[2].set_xlim([-eod, np.max(xx)]) + + nr_size = 10 + axis[2].text(-0.02, 1.1, string.ascii_uppercase[4], + transform=axis[2].transAxes, + size=nr_size, weight='bold') + axis[1].text(-0.02, 1.1, string.ascii_uppercase[3], + transform=axis[1].transAxes, + size=nr_size, weight='bold') + axis[3] = axis[2].twiny() + axis[3].set_xlabel('EOD multiples') + offset = -40 + new_fixed_axis = axis[3].get_grid_helper().new_fixed_axis + axis[3].axis["bottom"] = new_fixed_axis(loc="bottom", axes=axis[3], + offset=(0,offset)) + axis[3].spines['right'].set_visible(False) + axis[3].spines['top'].set_visible(False) + axis[3].axis["bottom"].toggle(all=True) + axis[2].set_xlabel("Difference frequency [Hz]") + #par2.set_xlim([np.min(xx), np.max(xx)]) + axis[3].set_xlim([0, np.max(x)]) + #p1, = host.plot([0, 1, 2], [0, 1, 2], label="Density") + #p2, = par1.plot([0, 1, 2], [0, 3, 2], label="Temperature") + p3, = axis[3].plot(x, y2,color = 'grey',zorder = 1) + #embed() + axis[2].set_xticks(np.arange(-eod,np.max(xx),eod/2)) + #ax['corr'].set_yticks(np.arange(eod_fe[0] - eod_fr, eod_fe[-1] - eod_fr, eod_fr / 2)) + + axis[2].set_ylim([0, np.nanmax(y_sum)]) + plt.subplots_adjust(wspace = 0.4,left = 0.17, right = 0.96,bottom = 0.2) + return axis,y2 + +def plot_beat_corr(ax,lower,beat_corr_col = 'red',df_col = 'pink',ax_nr = 3,multiple = 3): + eod_fr = 500 + eod_fe = np.arange(0, eod_fr * multiple, 5) + beats = eod_fe - eod_fr + beat_corr = eod_fe % eod_fr + beat_corr[beat_corr > eod_fr / 2] = eod_fr - beat_corr[beat_corr > eod_fr / 2] + #gs0 = gridspec.GridSpec(3, 1, height_ratios=[4, 1, 1], hspace=0.7) + + #plt.figure(figsize=(4.5, 6)) + style = 'dotted' + color_v = 'black' + color_b = 'silver' + # plt.subplot(3,1,1) + ax['corr'] = plt.subplot(lower[ax_nr]) + np.max(beats) / eod_fr + + ax['corr'].set_xticks(np.arange((eod_fe[0]-eod_fr)/eod_fr+1, (eod_fe[-1]-eod_fr)/eod_fr+1,(eod_fr/2)/eod_fr+1)) + ax['corr'].set_yticks(np.arange((eod_fe[0]-eod_fr)/eod_fr+1, (eod_fe[-1]-eod_fr)/eod_fr+1,(eod_fr/2)/eod_fr+1)) + ax['corr'].set_xticks(np.arange(0,10,0.5)) + ax['corr'].set_yticks(np.arange(0, 10, 0.5)) + # plt.axvline(x = -250, Linestyle = style,color = color_v) + # plt.axvline(x = 250, Linestyle = style,color = color_v) + # plt.axvline(x = 750, Linestyle = style,color = color_v) + # plt.axvline(x = 1500, Linestyle = style) + # plt.subplot(3,1,2) + plt.xlabel('Beats [Hz]') + plt.ylabel('Difference frequency [Hz]') + #plt.subplot(gs0[1]) + if beat_corr_col != 'no': + plt.plot(beats/eod_fr+1, beat_corr/(eod_fr+1), color=beat_corr_col, alpha = 0.7) + plt.ylim([0,np.max(beat_corr/(eod_fr+1))*1.4]) + plt.xlim([(beats/eod_fr+1)[0],(beats/eod_fr+1)[-1]]) + if df_col != 'no': + plt.plot(beats/eod_fr+1, np.abs(beats)/(eod_fr+1), color=df_col, alpha = 0.7) + #plt.axvline(x=-250, Linestyle=style, color=color_v) + #plt.axvline(x=250, Linestyle=style, color=color_v) + #plt.axvline(x=750, Linestyle=style, color=color_v) + plt.xlabel('EOD adjusted beat [Hz]') + ax['corr'] .spines['right'].set_visible(False) + ax['corr'] .spines['top'].set_visible(False) + ax['corr'] .spines['left'].set_visible(True) + ax['corr'] .spines['bottom'].set_visible(True) + # plt.axvline(x = 1250, Linestyle = style,color = color_v) + # plt.axvline(x = 1500, Linestyle = style,color = color_v) + mult = np.array(beats) / eod_fr + 1 + # plt.subplot(3,1,3) + plt.xlabel('EOD multiples') + plt.ylabel('EOD adj. beat [Hz]', fontsize = 10) + plt.grid() + #plt.subplot(gs0[2]) + #plt.plot(mult, beat_corr, color=color_b) + # plt.axvline(x = 0, Linestyle = style) + #plt.axvline(x=0.5, Linestyle=style, color=color_v) + # plt.axvline(x = 1, Linestyle = style) + #plt.axvline(x=1.5, Linestyle=style, color=color_v) + #plt.axvline(x=2.5, Linestyle=style, color=color_v) + #plt.xlabel('EOD multiples') + #plt.ylabel('EOD adj. beat [Hz]', fontsize = 10) + return ax + +def try_resort_automatically(): + diffs = np.diff(dfs) + fast_sampling = dfs[np.concatenate([np.array([True]),diffs <21])] + second_derivative = np.diff(np.diff(fast_sampling)) + first_index = np.concatenate([np.array([False]),second_derivative <0]) + second_index = np.concatenate([second_derivative > 0,np.array([False])]) + remaining = fast_sampling[np.concatenate([np.array([True]),second_derivative == 0, np.array([True])])] + first = np.arange(0,len(first_index),1)[first_index] + second = np.arange(0, len(second_index), 1)[second_index]-1 + residual = [] + indeces = [] + for i in range(len(first)): + index = np.arange(first[i],second[i],2) + index2 = np.arange(first[i], second[i], 1) + indeces.append(index2) + residual.append(fast_sampling[index])#first[i]:second[i]:2 + indeces = np.concatenate(indeces) + remaining = fast_sampling[~indeces] + residual = np.concatenate(residual) + new_dfs = np.sort(np.concatenate([residual, remaining])) + + + +if __name__ == "__main__": + data = ['2019-10-21-aa-invivo-1'] + data = ['2019-09-23-ad-invivo-1'] + labelaxes_params(xoffs=1, yoffs=0, labels='A', font=dict(fontweight='bold')) + labelaxes_params(xoffs=-6, yoffs=1, labels='A', font=dict(fontweight='bold')) + + + default_settings(data,intermediate_width = 6.29,intermediate_length = 7.5, ts = 6, ls = 8, fs = 9) + fig = plt.figure() + #fig, ax = plt.subplots(nrows=2, ncols=3, sharex=True) + ax = {} + #ax = plt.subplot(grid[2]) + data_all = pd.read_pickle('data_beat.pkl') + d = data_all[data_all['dataset'] == data[0]] + eod = d['eodf'].iloc[0] + dfs = np.unique(d['df']) + #embed() + grid = gridspec.GridSpec(2, 4, wspace=0.0, height_ratios=[6, 2], width_ratios=[1,1,0.3,3], hspace=0.2) + + low_nr = 60 + from_middle = 45 #20 + example_df = [low_nr- eod,eod / 2 - from_middle - eod,eod - low_nr - eod,low_nr,eod / 2 - from_middle, low_nr + eod] + #example_df = [1, eod / 2 - 20 - eod, eod - low_nr - eod, low_nr, eod / 2 - 20, low_nr + eod] + + rows = len(example_df) + cols = 1 + power_raster = gridspec.GridSpecFromSubplotSpec(rows, cols, + subplot_spec=grid[0, 0],wspace = 0.05, hspace=0.3) + max_p = [[]]*len(example_df) + for i in range(len(example_df)): + + power = gridspec.GridSpecFromSubplotSpec(1, 2, width_ratios=[1,1.7],hspace = 0.2, wspace = 0.2, subplot_spec = power_raster[i]) + + first = ['crimson', 'lightcoral', 'darkviolet'] + second = ['hotpink', 'deeppink', 'mediumvioletred'] + third = ['khaki', 'yellow', 'gold'] + third = ['orange', 'orangered', 'darkred'] + fourth = ['DarkGreen', 'LimeGreen', 'YellowGreen'] + fith = ['SkyBlue', 'DeepSkyBlue', 'Blue'] + colors = np.concatenate([fourth, third, first]) + + ax_nr = 0 + ax['scatter_small'+str(i)] = plt.subplot(power[ax_nr]) + eod_fr = eod + eod_fe = [example_df[i] + eod] + e = 0 + factor = 200 + sampling = 500 * factor + minus_bef = -250 + plus_bef = -200 + #minus_bef = -2100 + #plus_bef = -100 + f_max, lims, _ = single_stim(ax, [colors[i]], 1, 1, eod_fr, eod_fe, e, power,delta_t = 0.001, add = 'no',minus_bef =minus_bef, plus_bef = plus_bef,sampling = sampling, + col_basic = 'silver',col_hline = 'no',labels = False,a_fr=1, ax_nr=ax_nr , phase_zero=[0], shift_phase=0,df_col = 'no',beat_corr_col='no', size=[120], a_fe=0.8) + + + + ax['between'] = plt.subplot(grid[0, 2]) + ax['between'].spines['right'].set_visible(False) + ax['between'].spines['top'].set_visible(False) + ax['between'].spines['left'].set_visible(False) + ax['between'].spines['bottom'].set_visible(False) + ax['between'].set_ylim([np.min(dfs), np.max(dfs)]) + ax['between'].set_xlim([-0.5,30]) + ax['between'].set_xticks([]) + ax['between'].set_yticks([]) + ax['between'].set_ylim(ax['between'].get_ylim()[::-1]) + nr_size = 10 + + ax['scatter'] = plt.subplot(grid[0,1]) + ax['scatter'].spines['right'].set_visible(False) + ax['scatter'].spines['top'].set_visible(False) + counter = 0 + new_dfs = np.concatenate([dfs[0:25], dfs[25:40:2], dfs[40:53:2], dfs[54:-1]]) + for i in range(len(new_dfs)): + spikes = d[d['df'] == new_dfs[i]]['spike_times'] + counter += 1 + ll = 0.1 + ul = 0.3 + transformed_spikes = spikes.iloc[0]-spikes.iloc[0][0] + used_spikes = transformed_spikes[transformed_spikes>ll] + used_spikes = used_spikes[used_spikesll] + used_spikes = used_spikes[used_spikes d['eodf'].iloc[0] * 0.5: + diff = diff - d['eodf'].iloc[0] * 0.5 + plt.plot(f, p, zorder=1 ,color=main_color) + max_p[i] = np.max(p) + ax['power'+str(i)].scatter(f[np.argmax(p[f < 0.5 * eod])],max(p[f < 0.5 * eod]),zorder=2,color = colors[i], s = 25) + ax['power' + str(i)].scatter(f[f == f[np.argmin(np.abs(f-eod))]], p[f == f[np.argmin(np.abs(f-eod))]]*0.90, zorder=2, + s=25, color = 'darkgrey',edgecolor = 'black') + ax['power' + str(i)].axvline(x = eod/2, color = 'black', linestyle = 'dashed', lw = 0.5) + plt.xlim([-40, 1600]) + axis[3].scatter(example_df[i]/(eod)+1, np.sqrt(np.max(p[f < 0.5 * eod])*np.abs(f[0]-f[1])),zorder=3, s=20,marker = 'o',color=colors[i]) + axis[1].scatter(example_df[i]/(eod)+1,f[np.argmax(p[f < 0.5 * eod])],zorder=2, s=20,marker = 'o',color=colors[i]) + + + if i != rows-1: + #ax['power'+str(i)].set_xticks([]) + #ax['scatter_small'].set_xticks([]) + labels = [item.get_text() for item in ax['scatter_small'+str(i)].get_xticklabels()] + empty_string_labels = [''] * len(labels) + ax['scatter_small'+str(i)].set_xticklabels(empty_string_labels) + labels = [item.get_text() for item in ax['power'+str(i)].get_xticklabels()] + empty_string_labels = [''] * len(labels) + ax['power'+str(i)].set_xticklabels(empty_string_labels) + else: + ax['power'+str(i)].set_xlabel('Frequency [Hz]') + ax['scatter_small'+str(i)].set_xlabel('Time [ms]') + ax['power' + str(i)].set_yticks([]) + ax['power'+str(i)].spines['left'].set_visible(False) + ax['scatter_small'+str(i)].spines['left'].set_visible(False) + ax['scatter_small'+str(i)].set_yticks([]) + ax['power'+str(i)].spines['right'].set_visible(False) + ax['power'+str(i)].spines['top'].set_visible(False) + ax['scatter_small'+str(i)].spines['right'].set_visible(False) + ax['scatter_small'+str(i)].spines['top'].set_visible(False) + for i in range(len(example_df)): + ax['power'+str(i)].set_ylim([0,np.max(max_p)]) + ax['power'+str(0)].text(-0.1, 1.1, string.ascii_uppercase[2], transform=ax['power'+str(0)].transAxes, + size= nr_size, weight='bold') + ax['scatter_small'+str(0)].text(-0.1, 1.1, string.ascii_uppercase[1], transform=ax['scatter_small'+str(0)].transAxes, + size= nr_size, weight='bold') + plt.subplots_adjust(left = 0.11, bottom = 0.18, top = 0.94) + #fig.label_axes() + #fig.label_axes() + #embed() + #grid.format( + # xlabel='xlabel', ylabel='ylabel', suptitle=titles[mode], + # abc=True, abcloc='ul', + # grid=False, xticks=25, yticks=5) + plt.savefig('singlecellexample5.pdf') + plt.savefig('../highbeats_pdf/singlecellexample5.pdf') + # plt.subplots_adjust(left = 0.25) + plt.show() + #plt.close() diff --git a/localmaxima.py b/localmaxima.py new file mode 100644 index 0000000..4b0fcdd --- /dev/null +++ b/localmaxima.py @@ -0,0 +1,185 @@ +import matplotlib.pyplot as plt +import numpy as np +from IPython import embed +import matplotlib as matplotlib +import math +import scipy.integrate as integrate +from scipy import signal +from scipy.interpolate import interp1d +from scipy.interpolate import CubicSpline +import scipy as sp +import pickle +from scipy.spatial import distance +from myfunctions import * +import time +from matplotlib import gridspec +from matplotlib_scalebar.scalebar import ScaleBar +import matplotlib.mlab as ml +import scipy.integrate as si +import pandas as pd +from functionssimulation import find_times +from functionssimulation import find_periods +from functionssimulation import integrate_chirp +from functionssimulation import rectify, find_beats,find_dev +from functionssimulation import global_maxima, find_lm, conv + +def snip(left_c,right_c,e,g,sampling, deviation_s,d,eod_fr, a_fr, eod_fe,phase_zero,p, size,s, sigma,a_fe,deviation,beat_corr): + time, time_cut, cut = find_times(left_c[g], right_c[g], sampling, deviation_s[d]) + eod_fish_r, period_fish_r, period_fish_e = find_periods(time, eod_fr, a_fr, eod_fe, e) + #embed() + eod_fe_chirp = integrate_chirp(a_fe, time, eod_fe[e], phase_zero[p], size[s], sigma) + eod_rec_down, eod_rec_up = rectify(eod_fish_r, eod_fe_chirp) # rectify + eod_overlayed_chirp = (eod_fish_r + eod_fe_chirp)[cut:-cut] + + maxima_values, maxima_index, maxima_interp = global_maxima(period_fish_e, period_fish_r, + eod_rec_up[cut:-cut]) # global maxima + index_peaks, value_peaks, peaks_interp = find_lm(eod_rec_up[cut:-cut]) # local maxima + middle_conv, eod_conv_down, eod_conv_up, eod_conv_downsampled = conv(eod_fr,sampling, cut, deviation[d], eod_rec_up, + eod_rec_down) # convolve + eod_fish_both = integrate_chirp(a_fe, time, eod_fe[e] - eod_fr, phase_zero[p], size[s], sigma) + am_corr_full = integrate_chirp(a_fe, time_cut, beat_corr[e], phase_zero[p], size[s], + sigma) # indirect am calculation + _, time_fish, cut_f = find_times(left_c[g], right_c[g], eod_fr, deviation_s[d]) # downsampled through fish EOD + am_corr_ds = integrate_chirp(a_fe, time_fish, beat_corr[e], phase_zero[p], size[s], sigma) + am_df_ds = integrate_chirp(a_fe, time_fish, eod_fe[e] - eod_fr, phase_zero[p], size[s], + sigma) # indirect am calculation + return time_cut, eod_conv_up, am_corr_full, peaks_interp, maxima_interp, am_corr_ds,am_df_ds,eod_fish_both,eod_overlayed_chirp + + + +def power_func(bef_c, aft_c, win, deviation_s, sigma, sampling, d_ms, beat_corr, size, phase_zero, delta_t, a_fr, a_fe, eod_fr, eod_fe, deviation, show_figure = False, plot_dist = False, save = False): + results = [[]]*7 + for d in range(len(deviation)): + bef_c = 0.3 + aft_c = -0.1 + left_c, right_c, left_b, right_b, period_distance_c, period_distance_b, _, period, to_cut,exclude,consp_needed,deli,interval = period_calc( + [float('Inf')]*len(beat_corr), 50, win, deviation_s[d], sampling, beat_corr, bef_c, aft_c, 'stim') + save_n = win + for s in range(len(size)): + for p in range(len(phase_zero)): + beats = eod_fe - eod_fr + for e in range(len(eod_fe)): + left_b = [-0.3*sampling]*len(beat_corr) + right_b = [-0.1 * sampling]*len(beat_corr) + time_b, conv_b, am_corr_b, peaks_interp_b, maxima_interp_b,am_corr_ds_b, am_df_ds_b, am_df_b,eod_overlayed_chirp = snip(left_b, right_b,e,e, + sampling, deviation_s, + d, eod_fr, a_fr, eod_fe, + phase_zero, p, size, s, + sigma, a_fe, deviation, + beat_corr) + #time_c, conv_c, am_corr_c, peaks_interp_c, maxima_interp_c,am_corr_ds_c, am_df_ds_c, am_df_c = snip(left_c, right_c,e,e, + # sampling, deviation_s, + # d, eod_fr, a_fr, eod_fe, + # phase_zero, p, size, s, + # sigma, a_fe, deviation, + # beat_corr) + + #embed() + nfft = 4096 + name = ['conv','df','df ds','corr','corr ds','global max','local max'] + var = [conv_b,am_df_b,am_df_ds_b, am_corr_b, am_corr_ds_b,maxima_interp_b,peaks_interp_b ] + samp = [sampling,sampling,eod_fr,sampling,eod_fr,sampling,sampling] + #pp, f = ml.psd(eod_overlayed_chirp - np.mean(eod_overlayed_chirp), Fs=sampling, NFFT=nfft, noverlap=nfft / 2) + for i in range(len(results)): + + + plot = False + pp, f = ml.psd(var[i] - np.mean(var[i]), Fs=samp[i], NFFT=nfft, + noverlap=nfft / 2) + + if plot == True: + plt.figure() + plt.subplot(1,2,1) + plt.plot(var[i]) + plt.title(name[i]) + plt.subplot(1, 2, 2) + plt.plot(f,pp) + #plt.xlim([0,2000]) + plt.show() + #print(results) + #embed() + if type(results[i]) != dict: + results[i] = {} + results[i]['type'] = name[i] + #embed() + results[i]['f'] = list([f[np.argmax(pp[f < 0.5 * eod_fr])]]) + results[i]['amp'] = list([np.sqrt(si.trapz(pp, f, np.abs(f[1]-f[0])))]) + results[i]['max'] = list([np.sqrt(np.max(pp[f < 0.5 * eod_fr])*np.abs(f[1]-f[0]))]) + else: + results[i]['f'].extend(list([f[np.argmax(pp[f < 0.5 *eod_fr])]])) + #embed() + results[i]['amp'].extend(list([np.sqrt(si.trapz(pp, f, np.abs(f[1]-f[0])))])) + results[i]['max'].extend(list([np.sqrt(np.max(pp[f < 0.5 * eod_fr]) * np.abs(f[1] - f[0]))])) + #if save: + # results = pd.DataFrame(results) + # results.to_pickle('../data/power_simulation.pkl') + # np.save('../data/Ramona/power_simulation.npy', results) + return results + + +def plot_power(results): + plt.rcParams['figure.figsize'] = (3, 3) + plt.rcParams["legend.frameon"] = False + colors = ['black', 'magenta', 'pink', 'orange', 'moccasin', 'red', 'green', 'silver'] + colors = ['red','pink'] + results = [results[5]] + fig, ax = plt.subplots(nrows=2, ncols=1, sharex=True) + all_max = [[]] * len(results) + #embed() + for i in range(len(results)): + #embed() + #ax[0].set_ylabel(results[i]['type'], rotation=0, labelpad=40, color=colors[i]) + ax[0].plot(beats / eod_fr + 1, np.array(results[i]['f']) / eod_fr + 1, color=colors[i]) + # plt.title(results['type'][i]) + ax[1].plot(beats / eod_fr + 1, np.array(results[i]['amp']), color=colors[0]) + ax[1].plot(beats / eod_fr + 1, np.array(results[i]['max']), color=colors[1]) + #ax[2].plot(beats / eod_fr + 1, np.array(results[i]['amp']), color=colors[i]) + all_max[i] = np.max(np.array(results[i]['amp'])) + #for i in range(len(results)): + # ax[2].set_ylim([0, np.max(all_max)]) + plt.subplots_adjust(left=0.25) + #ii, jj = np.shape(ax) + ax[0].set_ylabel('MPF') + ax[1].set_ylabel('Modulation depth') + #ax[0, 2].set_title('Modulation depth (same scale)') + for i in range(len(ax)): + ax[1].set_xlabel('EOD multiples') + ax[i].spines['right'].set_visible(False) + ax[i].spines['top'].set_visible(False) + plt.subplots_adjust(bottom = 0.2) + plt.savefig('localmaxima.pdf') + plt.savefig('../highbeats_pdf/localmaxima.pdf') + plt.show() + +delta_t = 0.014 # ms +interest_interval = delta_t * 1.2 +bef_c = interest_interval / 2 +aft_c = interest_interval / 2 +sigma = delta_t / math.sqrt((2 * math.log(10))) # width of the chirp +size = [120] # maximal frequency excursion during chirp / 60 or 100 here +phase_zero = [0] # phase when the chirp occured (vary later) / zero at the peak o a beat cycle +phase_zero = np.arange(0,2*np.pi,2*np.pi/10) +eod_fr = 500 # eod fish reciever +a_fr = 1 # amplitude fish reciever +amplitude = a_fe = 0.2 # amplitude fish emitter +factor = 200 +sampling = eod_fr * factor +sampling_fish = 500 +#start = 0 +#end = 2500 +#step = 10 +start = 510 +end = 3500 +step = 500 +win = 'w2' +d = 1 +x = [ 1.5, 2.5,0.5,] +x = [ 1.5] +time_range = 200 * delta_t +deviation_ms, deviation_s, deviation_dp = find_dev(x, sampling) +start = 5 +end = 2500 +step = 25 +eod_fe, beat_corr, beats = find_beats(start,end,step,eod_fr) +results = power_func( bef_c, aft_c, 'w2', deviation_s, sigma, sampling, deviation_ms, beat_corr, size, [phase_zero[0]], delta_t, a_fr, a_fe, eod_fr, eod_fe, deviation_dp, show_figure = True, plot_dist = False, save = True) +plot_power(results) \ No newline at end of file diff --git a/rotated_singlethree.py b/rotated_singlethree.py new file mode 100644 index 0000000..afee2e1 --- /dev/null +++ b/rotated_singlethree.py @@ -0,0 +1,522 @@ +import nixio as nix +import os +from IPython import embed +#from utility import * +import matplotlib.pyplot as plt +import numpy as np +import pandas as pd +import matplotlib.mlab as ml +import scipy.integrate as si +from scipy.ndimage import gaussian_filter +from IPython import embed +from myfunctions import * +from myfunctions import auto_rows +from functionssimulation import default_settings +import matplotlib.gridspec as gridspec +from myfunctions import remove_tick_marks + +def ps_df(data, d = '2019-09-23-ad-invivo-1', wish_df = 310, window = 'no',sampling_rate = 40000): + + #nfft = 4096 + #trial_cut = 0.1 + #freq_step = sampling_rate / nfft + data_cell = data[data['dataset'] == d]# + dfs = np.unique(data_cell['df']) + df_here = dfs[np.argmin(np.abs(dfs - wish_df))] + dfs310 = data_cell[data_cell['df'] == df_here] + #pp = [[]]*len(dfs310) + pp = [] + ppp = [] + trial_cut = 0.1 + for i in range(len(dfs310)): + duration = dfs310.iloc[i]['durations'] + #cut_vec = np.arange(0, duration, trial_cut) + cut_vec = np.arange(0, duration, trial_cut) + #spikes_cut = spikes[(spikes > 0.05) & (spikes < 0.95)] + #for j, cut in enumerate(cut_vec): + # # print(j) + # spike_times = dfs310.iloc[i]['spike_times'] + # spikes = spike_times - spike_times[0] + # spikes_cut = spikes[(spikes > cut) & (spikes < cut_vec[j + 1])] + # if cut == cut_vec[-2]: + # #counter_cut += 1 + # break + # if len(spikes_cut) < 10: + # #counter_spikes += 1 + # break + # spikes_mat = np.zeros(int(trial_cut * sampling_rate) + 1) + # spikes_idx = np.round((spikes_cut - trial_cut * j) * sampling_rate) + # for spike in spikes_idx: + # spikes_mat[int(spike)] = 1# + # + # #spikes_mat = np.zeros(int(spikes[-1]* sampling_rate + 5)) + # #spikes_idx = np.round((spikes) * sampling_rate) + # #for spike in spikes_idx: + # # spikes_mat[int(spike)] = 1 + # spikes_mat = spikes_mat * sampling_rate + # if type(window) != str: + # spikes_mat = gaussian_filter(spikes_mat, sigma=window) + # # smoothened_spikes_mat05 = gaussian_filter(spikes_mat, sigma=window05) * sampling_rate + # # smoothened_spikes_mat2 = gaussian_filter(spikes_mat, sigma=window2) * sampling_rate + # else: + # smoothened = spikes_mat * 1 + # nfft = 4096 + # p, f = ml.psd(spikes_mat - np.mean(spikes_mat), Fs=sampling_rate, NFFT=nfft, noverlap=nfft / 2) + # pp.append(p) + spike_times = dfs310.iloc[i]['spike_times'] + if len(spike_times) < 3: + counter_spikes += 1 + break + + spikes = spike_times - spike_times[0] + spikes_cut = spikes[(spikes > 0.05) & (spikes < 0.95)] + if len(spikes_cut) < 3: + counter_cut += 1 + break + spikes_mat = np.zeros(int(spikes[-1] * sampling_rate + 5)) + spikes_idx = np.round((spikes) * sampling_rate) + for spike in spikes_idx: + spikes_mat[int(spike)] = 1 + spikes_mat = spikes_mat * sampling_rate + if type(window) != str: + spikes_mat = gaussian_filter(spikes_mat, sigma=window) + # smoothened_spikes_mat05 = gaussian_filter(spikes_mat, sigma=window05) * sampling_rate + # smoothened_spikes_mat2 = gaussian_filter(spikes_mat, sigma=window2) * sampling_rate + else: + spikes_mat = spikes_mat*1 + nfft = 4096 + p, f = ml.psd(spikes_mat - np.mean(spikes_mat), Fs=sampling_rate, NFFT=nfft, noverlap=nfft / 2) + ppp.append(p) + #spike_times = data_cell.iloc[i]['spike_times']# + + #if len(spike_times) < 3: + # counter_spikes += 1 + # break + + #spikes = spike_times - spike_times[0] + + # cut trial into snippets of 100 ms + #cut_vec = np.arange(0, duration, trial_cut) + #spikes_cut = spikes[(spikes > 0.05) & (spikes < 0.95)] + + #if len(spikes_cut) < 3: + # counter_cut += 1 + # break + #spikes_new = spikes_cut - spikes_cut[0] + + #spikes_mat = np.zeros(int(spikes_new[-1] * sampling_rate) + 2) + # spikes_mat = np.zeros(int(trial_cut * sampling_rate) + 1) + #spikes_idx = np.round((spikes_new) * sampling_rate) + #for spike in spikes_idx: + # spikes_mat[int(spike)] = 1 + #spikes_mat = spikes_mat * sampling_rate + + #nfft = 4096 + #p, f = ml.psd(smoothened - np.mean(smoothened), Fs=sampling_rate, NFFT=nfft, noverlap=nfft / 2) + #ppp.append(p) + #p_mean = np.mean(pp,axis = 0) + p_mean2 = np.mean(ppp, axis=0) + #ref = (np.max(p_mean2)) + # + db = 10 * np.log10(p_mean2 / np.max(p_mean2)) + #ref = (np.max(p_mean2)) + #db2 = 10 * np.log10(p_mean2 / ref) + #embed() + return df_here,p_mean2,f,db + + + +def plot_example_ps(grid,colors = ['brown'],fc = 'lightgrey',line_col = 'black',input = ['2019-10-21-aa-invivo-1'],sigma = [0.00005,0.00025,0.0005, 0.002],wish_df = 150, color_eod = 'orange',color_stim = 'red', color_df = 'green'): + sampling_rate = 40000 + #colors = ['#BA2D22', '#F47F17', '#AAB71B', '#3673A4', '#53379B'] + + + plt.rcParams['lines.linewidth'] = 1.5 + plt.rcParams['lines.markersize'] = 6 + #data = pd.read_pickle('../pictures_highbeats/data_beat.pkl') + #iter = np.unique(data['dataset']) + iter = ['2019-05-07-by-invivo-1'] + iter = ['2019-09-23-ad-invivo-1'] + iter = input + for cell in iter: + data = pd.read_pickle('data_beat.pkl') + beat_results = pd.read_pickle('beat_results_smoothed.pkl') + #embed() + eodf = int(beat_results[beat_results['dataset'] == cell]['eodf'].iloc[0]) + df = [[]] * (len(sigma) + 1) + p = [[]] * (len(sigma) + 1) + f = [[]] * (len(sigma) + 1) + db = [[]] * (len(sigma) + 1) + sigmaf = [[]] * (len(sigma) + 1) + gauss = [[]] * (len(sigma) + 1) + + df[0], p[0], f[0], db[0] = ps_df(data, d=cell, wish_df= wish_df, window='no', sampling_rate=sampling_rate) + for i in range(len(sigma)): + df[1+i], p[1+i], f[1+i], db[1+i] = ps_df(data, d=cell, wish_df= wish_df, window = sigma[i]*sampling_rate,sampling_rate = sampling_rate) + sigmaf[i + 1] = 1 / (2 * np.pi * sigma[i]) + gauss[i + 1] = np.exp(-(f[1+i] ** 2 / (2 * sigmaf[i + 1] ** 2))) + db = 'no' + stepsize = f[0][1] - f[0][0] + if db == 'db': + p = db + + + # fig.suptitle(d, labelpad = 25) + #print(d) + ax = {} + + ec = 'grey' + #fc = 'moccasin' + #ec = 'wheat' + scale = 1 + #ax = plot_whole_ps(f, ax, grid, colors, eodf, stepsize, p, df, scale = scale, ax_nr = 0,nr=0, filter='whole' ,color_eod = color_eod,color_stim = color_stim , color_df = color_df,fc = fc, ec = ec) + #ax[0].legend( loc=(0,1), + # ncol=3, mode="expand", borderaxespad=0.)#bbox_to_anchor=(0.4, 1, 0.6, .1), + + #ax[0] = remove_tick_marks(ax[0]) + ax = plot_whole_ps(f,ax,grid, colors, eodf, stepsize, p, df,scale = scale, ax_nr = 0,nr = 0, filter = 'original',color_eod = color_eod,color_stim = color_stim , color_df = color_df,fc = fc, ec = ec) + ax[0] = remove_tick_marks(ax[0]) + #ax[0].set_ylim([0, 2000]) + + wide = 2 + #embed() + nr = 1 + for i in range(len(sigma)): + ax[i+nr] = plt.subplot(grid[i+nr]) + plot_filter(ax, i+nr, f[1+i], p,i+1, colors, gauss[1+i], eodf, stepsize, wide, df[1+i],scale = scale,color_eod = color_eod,color_stim = color_stim , color_df = color_df,fc = fc, ec = ec) + ax[i+nr].set_ylim([0, eodf*1.5]) + ax[2] = remove_tick_marks(ax[2]) + #embed() + #if db == 'db': + # ax[0].set_ylim([np.min([p]),0])#p[0][,p[1][0:2000],p[2][0:2000],p[3][0:2000] + #else: + # ax[0].set_ylim([ 0,np.max([p])]) + ax[int(len(df))-1].set_ylabel('frequency [Hz]') + # ax[1].set_ylabel(r'power [Hz$^2$/Hz]') + #ax[0].ticklabel_format(axis='y', style='sci', scilimits=[0, 0]) + + + #print(df[3]) + for i in range(len(df)): + ax[i].spines['right'].set_visible(False) + ax[i].spines['top'].set_visible(False) + cols = grid.ncols + rows = grid.nrows + ax[int(len(df))-1].set_xlabel(' power spectral density [Hz²/Hz]') + #ax[2].set_ylabel('Hz²/Hz') + #ax[3].set_ylabel('Hz²/Hz') + #ax[0].set_ylabel('Hz²/Hz') + for i in range(len(df)): + ax[i].axhline(y = eodf/2, color = line_col, linestyle = 'dashed') + plt.tight_layout() + #embed() + #fig.label_axes() + +def plot_whole_ps(f,ax,grid, colors, eodf, stepsize, p, df, ax_nr = 0,nr = 0, filter = 'original', scale = 1, color_eod = 'orange',color_stim = 'red', color_df = 'green',fc = 'lightgrey', ec = 'grey',): + ax[ax_nr] = plt.subplot(grid[ax_nr]) + + if filter == 'whole': + #ax[nr].set_facecolor('lightgrey') + ax[ax_nr].plot(p[nr], f[nr], color=colors[0]) + ax[ax_nr].fill_between([np.min(p), np.max(p)], [f[0][-1],f[0][-1]], color=fc,edgecolor=ec) + ax[ax_nr].plot(np.max(p[nr][int(abs(df[nr]) / stepsize) - 5:int(abs(df[nr]) / stepsize) + 5]) * scale, df[0], + color=color_df, marker='o', linestyle='None', label='Df') + ax[ax_nr].plot(p[nr][int((df[nr] + eodf) / stepsize) + 1], df[nr] + eodf, color=color_stim, marker='o', + linestyle='None', + label='stimulus') + ax[ax_nr].plot(np.max(p[nr][int(eodf / stepsize) - 5:int(eodf / stepsize) + 5]) * scale, eodf - 1, color=color_eod, + marker='o', linestyle='None', label='EODf') # = '+str(int(eodf))+' Hz') + + elif filter == 'original': + #ax[nr].fill_between([eodf] * len(p[nr]), p[nr], color='lightgrey') + #ax[nr].fill_between([max(p[0])]*len(f[nr]),f[nr], color = 'lightgrey') + ax[ax_nr].plot(p[nr][f[nr] eodf / 2])), f[nr][f[nr] > eodf / 2], color=colors[0]) + #embed() + ax[ax_nr].fill_between([np.min(p),np.max(p)], [eodf/2,eodf/2], color=fc,edgecolor=ec) + ax[ax_nr].plot(np.max(p[nr][int(abs(df[nr]) / stepsize) - 5:int(abs(df[nr]) / stepsize) + 5]) * scale, df[0], + color=color_df, marker='o',zorder = 2, linestyle='None', label='Df')#edgecolors = 'black' + ax[ax_nr].plot(0, df[nr] + eodf, color=color_stim, marker='o', + linestyle='None', + label='stimulus',zorder = 2)#,edgecolors = 'black' + ax[ax_nr].plot(0, eodf - 1, color=color_eod, + marker='o', linestyle='None', label='EODf',zorder = 2) #edgecolors = 'black', # = '+str(int(eodf))+' Hz') + + #plt.plot([np.min(p),np.max(p)],[eodf,eodf], color = 'red') + #embed() + #ax[nr].plot([0]*5) + #ax[nr].plot([1000]*5) + # ax[0].fill_between( [max(p[0])]*len(f[1]),f[0], facecolor='lightgrey', edgecolor='grey') + + + ax[ax_nr].set_ylim([0, eodf * 1.5]) + ax[ax_nr].set_xlim(ax[ax_nr].get_xlim()[::-1]) + return ax + +def plot_filter(ax, ax_nr, f, p4,array_nr, colors, gauss3, eodf, stepsize, wide, df, fc = 'lightgrey', scale = 1, ec = 'grey',color_eod = 'orange',color_stim = 'red', color_df = 'green'): + ax[ax_nr].plot( p4[array_nr],f, color=colors[0]) + prev_height = np.max((p4[0][int(abs(df) / stepsize) - wide:int(abs(df) / stepsize) + wide]) * scale) + now_height = np.max((p4[array_nr][int(abs(df) / stepsize) - wide:int(abs(df) / stepsize) + wide]) *scale) + + ax[ax_nr].plot([prev_height, now_height+440],[np.abs(df), np.abs(df)], color = 'black') + ax[ax_nr].scatter( now_height+440, np.abs(df), marker = '>', color='black', zorder = 2) + #embed() + + + ax[ax_nr].fill_between(max(p4[0]) * gauss3 ** 2,f, facecolor=fc, edgecolor=ec) + ax[ax_nr].plot(np.max(p4[array_nr][int(eodf / stepsize) - wide:int(eodf / stepsize) + wide]) * scale, eodf, color=color_eod, marker='o', + linestyle='None') + ax[ax_nr].plot( np.max(p4[array_nr][int(abs(df) / stepsize) - wide:int(abs(df) / stepsize) + wide]) * scale,abs(df), + color=color_df, marker='o', linestyle='None') + ax[ax_nr].plot( + np.max(p4[array_nr][int((df + eodf) / stepsize) - wide:int((df + eodf) / stepsize) + wide]) * scale,df + eodf, + color=color_stim, marker='o', linestyle='None') + ax[ax_nr].set_xlim(ax[ax_nr].get_xlim()[::-1]) + return ax + + + +def plot_amp(ax, mean1, dev,name = 'amp',nr = 1): + np.unique(mean1['type']) + all_means = mean1[mean1['type'] == name +' mean'] + original = all_means[all_means['dev'] == 'original'] + #m005 = all_means[all_means['dev'] == '005'] + m05 = all_means[all_means['dev'] == '05'] + m2 = all_means[all_means['dev'] == '2'] + # fig, ax = plt.subplots(nrows=4, ncols = 3, sharex=True) + versions = [original, m05, m2] #m005, + for i in range(len(versions)): + keys = [k for k in versions[i]][2::] + try: + data = np.array(versions[i][keys])[0] + except: + break + axis = np.arange(0, len(data), 1) + axis_new = axis * 1 + similarity = [keys, data] + sim = np.argsort(similarity[0]) + # similarity[sim] + all_means = mean1[mean1['type'] == name+' std'] + std = all_means[all_means['dev'] == dev[i]] + std = np.array(std[keys])[0] + #ax[1, 1].set_ylabel('Modulation depth') + #ax[nr,i].set_title(dev[i] + ' ms') + all_means = mean1[mean1['type'] == name+' 95'] + std95 = all_means[all_means['dev'] == dev[i]] + std95 = np.array(std95[keys])[0] + all_means = mean1[mean1['type'] == name+' 05'] + std05 = all_means[all_means['dev'] == dev[i]] + std05 = np.array(std05[keys])[0] + ax[nr,i].fill_between(np.array(keys)[sim], list(std95[sim]), list(std05[sim]), + color='gainsboro') + ax[nr,i].fill_between(np.array(keys)[sim], list(data[sim] + std[sim]), list(data[sim] - std[sim]), + color='darkgrey') + + # ax[i].plot(data_tob.ff, data_tob.fe, color='grey', linestyle='--', label='AMf') + ax[nr,i].plot(np.array(keys)[sim], data[sim], color='black') + # ax[0].plot(data1.x, data1.freq20, color=colors[1], label='20 %') + #embed() + return ax + +def create_beat_corr(hz_range, eod_fr): + beat_corr = hz_range%eod_fr + beat_corr[beat_corr>eod_fr/2] = eod_fr[beat_corr>eod_fr/2] - beat_corr[beat_corr>eod_fr/2] + return beat_corr + + +def plot_mean_cells( grid,data = ['2019-10-21-aa-invivo-1'],line_col = 'black',lw = 0.5, sigma = ['original','05','2'],colors = ['#BA2D22', '#F47F17', '#AAB71B', '#3673A4', '#53379B'], wish_df = 150, color_eod = 'black',color_df = 'orange', size = 17, color_modul = ['steelblue']): + #mean1 = pd.read_pickle('mean.pkl') + data_all = pd.read_pickle('beat_results_smoothed.pkl') + d = data_all[data_all['dataset'] == data[0]] + + #embed() + + inch_factor = 2.54 + + half_page_width = 7.9 / inch_factor + intermediate_width = 12 / inch_factor + whole_page_width = 16 * 2 / inch_factor + + small_length = 6 / inch_factor + intermediate_length = 12 * 1.5 / inch_factor + max_length = 25 / inch_factor + whole_page_width = 6.7 + intermediate_length = 3.7 + + #plt.rcParams['figure.figsize'] = (whole_page_width, intermediate_length) + plt.rcParams['font.size'] = 11 + plt.rcParams['axes.titlesize'] = 12 + plt.rcParams['axes.labelsize'] = 12 + plt.rcParams['lines.linewidth'] = 1.5 + plt.rcParams['lines.markersize'] = 8 + plt.rcParams['legend.loc'] = 'upper right' + plt.rcParams["legend.frameon"] = False + + # load data for plot + + # data1 = pd.read_csv('ma_allcells_unsmoothed.csv') + # data2 = pd.read_csv('ma_allcells_05.csv') + # data3 = pd.read_csv('ma_allcells_2.csv') + # data_tob = pd.read_csv('ma_toblerone.csv') + + # smothed = df_beat[df_beat['dev'] == 'original'] + # data1 = smothed[smothed['type'] == 'amp'] + + x = np.arange(0, 2550, 50) + corr = create_beat_corr(x, np.array([500] * len(x))) + + #np.unique(mean1['type']) + #all_means = mean1[mean1['type'] == 'max mean'] + + #versions = [[]]*len(dev) + #for i in range(len(dev)): + version =[[]]*len(sigma) + version2 = [[]] * len(sigma) + dev = [[]] * len(sigma) + limits = [[]]*len(sigma) + minimum = [[]] * len(sigma) + y_max = [[]] * len(sigma) + y_min = [[]] * len(sigma) + ax ={} + + for i, e in enumerate(sigma): + y2 = d['result_amplitude_max_' + e] + y_max[i] = np.max(y2) + y_min[i] = np.min(y2) + for i,e in enumerate(sigma): + dev[i] = sigma[i] + plots = gridspec.GridSpecFromSubplotSpec( 1,2, + subplot_spec=grid[i], wspace=0.4, hspace=0.5) + d = data_all[data_all['dataset'] == data[0]] + x = d['delta_f'] / d['eodf'] + 1 + #embed() + data = ['2019-10-21-aa-invivo-1'] + #end = ['original', '005', '05', '2'] + y = d['result_frequency_' + e] + #embed() + y2 = d['result_amplitude_max_' + e] + #y_sum[i] = np.nanmax(y) + ff = d['delta_f'] / d['eodf'] + 1 + fe = d['beat_corr'] + #fig.suptitle(set) + ax[0] = plt.subplot(plots[0]) + if e != sigma[-1]: + ax[0] = remove_tick_marks(ax[0]) + ax[0].plot(ff, fe, color='grey', zorder = 1, linestyle='--', linewidth = lw) + ax[0].plot(x, y, color=colors[0], zorder = 2,linewidth = lw) + #embed() + eod = d['eodf'].iloc[0] + ax[0].axhline(y=eod / 2, color=line_col, linestyle='dashed') + if np.max(y) 0.05) & (spikes < 0.95)] + #for j, cut in enumerate(cut_vec): + # # print(j) + # spike_times = dfs310.iloc[i]['spike_times'] + # spikes = spike_times - spike_times[0] + # spikes_cut = spikes[(spikes > cut) & (spikes < cut_vec[j + 1])] + # if cut == cut_vec[-2]: + # #counter_cut += 1 + # break + # if len(spikes_cut) < 10: + # #counter_spikes += 1 + # break + # spikes_mat = np.zeros(int(trial_cut * sampling_rate) + 1) + # spikes_idx = np.round((spikes_cut - trial_cut * j) * sampling_rate) + # for spike in spikes_idx: + # spikes_mat[int(spike)] = 1# + # + # #spikes_mat = np.zeros(int(spikes[-1]* sampling_rate + 5)) + # #spikes_idx = np.round((spikes) * sampling_rate) + # #for spike in spikes_idx: + # # spikes_mat[int(spike)] = 1 + # spikes_mat = spikes_mat * sampling_rate + # if type(window) != str: + # spikes_mat = gaussian_filter(spikes_mat, sigma=window) + # # smoothened_spikes_mat05 = gaussian_filter(spikes_mat, sigma=window05) * sampling_rate + # # smoothened_spikes_mat2 = gaussian_filter(spikes_mat, sigma=window2) * sampling_rate + # else: + # smoothened = spikes_mat * 1 + # nfft = 4096 + # p, f = ml.psd(spikes_mat - np.mean(spikes_mat), Fs=sampling_rate, NFFT=nfft, noverlap=nfft / 2) + # pp.append(p) + spike_times = dfs310.iloc[i]['spike_times'] + if len(spike_times) < 3: + counter_spikes += 1 + break + + spikes = spike_times - spike_times[0] + spikes_cut = spikes[(spikes > 0.05) & (spikes < 0.95)] + if len(spikes_cut) < 3: + counter_cut += 1 + break + spikes_mat = np.zeros(int(spikes[-1] * sampling_rate + 5)) + spikes_idx = np.round((spikes) * sampling_rate) + for spike in spikes_idx: + spikes_mat[int(spike)] = 1 + spikes_mat = spikes_mat * sampling_rate + if type(window) != str: + spikes_mat = gaussian_filter(spikes_mat, sigma=window) + # smoothened_spikes_mat05 = gaussian_filter(spikes_mat, sigma=window05) * sampling_rate + # smoothened_spikes_mat2 = gaussian_filter(spikes_mat, sigma=window2) * sampling_rate + else: + spikes_mat = spikes_mat*1 + nfft = 4096 + p, f = ml.psd(spikes_mat - np.mean(spikes_mat), Fs=sampling_rate, NFFT=nfft, noverlap=nfft / 2) + ppp.append(p) + #spike_times = data_cell.iloc[i]['spike_times']# + + #if len(spike_times) < 3: + # counter_spikes += 1 + # break + + #spikes = spike_times - spike_times[0] + + # cut trial into snippets of 100 ms + #cut_vec = np.arange(0, duration, trial_cut) + #spikes_cut = spikes[(spikes > 0.05) & (spikes < 0.95)] + + #if len(spikes_cut) < 3: + # counter_cut += 1 + # break + #spikes_new = spikes_cut - spikes_cut[0] + + #spikes_mat = np.zeros(int(spikes_new[-1] * sampling_rate) + 2) + # spikes_mat = np.zeros(int(trial_cut * sampling_rate) + 1) + #spikes_idx = np.round((spikes_new) * sampling_rate) + #for spike in spikes_idx: + # spikes_mat[int(spike)] = 1 + #spikes_mat = spikes_mat * sampling_rate + + #nfft = 4096 + #p, f = ml.psd(smoothened - np.mean(smoothened), Fs=sampling_rate, NFFT=nfft, noverlap=nfft / 2) + #ppp.append(p) + #p_mean = np.mean(pp,axis = 0) + p_mean2 = np.mean(ppp, axis=0) + #ref = (np.max(p_mean2)) + # + db = 10 * np.log10(p_mean2 / np.max(p_mean2)) + #ref = (np.max(p_mean2)) + #db2 = 10 * np.log10(p_mean2 / ref) + #embed() + return df_here,p_mean2,f,db + + + +def plot_example_ps(grid,colors = ['brown'],fc = 'lightgrey',line_col = 'black',input = ['2019-10-21-aa-invivo-1'],sigma = [0.00005,0.00025,0.0005, 0.002],wish_df = 150, color_eod = 'orange',color_stim = 'red', color_df = 'green'): + sampling_rate = 40000 + #colors = ['#BA2D22', '#F47F17', '#AAB71B', '#3673A4', '#53379B'] + + + plt.rcParams['lines.linewidth'] = 1.5 + plt.rcParams['lines.markersize'] = 6 + #data = pd.read_pickle('../pictures_highbeats/data_beat.pkl') + #iter = np.unique(data['dataset']) + iter = ['2019-05-07-by-invivo-1'] + iter = ['2019-09-23-ad-invivo-1'] + iter = input + for cell in iter: + data = pd.read_pickle('data_beat.pkl') + beat_results = pd.read_pickle('beat_results_smoothed.pkl') + #embed() + eodf = int(beat_results[beat_results['dataset'] == cell]['eodf'].iloc[0]) + df = [[]] * (len(sigma) + 1) + p = [[]] * (len(sigma) + 1) + f = [[]] * (len(sigma) + 1) + db = [[]] * (len(sigma) + 1) + sigmaf = [[]] * (len(sigma) + 1) + gauss = [[]] * (len(sigma) + 1) + + df[0], p[0], f[0], db[0] = ps_df(data, d=cell, wish_df= wish_df, window='no', sampling_rate=sampling_rate) + for i in range(len(sigma)): + df[1+i], p[1+i], f[1+i], db[1+i] = ps_df(data, d=cell, wish_df= wish_df, window = sigma[i]*sampling_rate,sampling_rate = sampling_rate) + sigmaf[i + 1] = 1 / (2 * np.pi * sigma[i]) + gauss[i + 1] = np.exp(-(f[1+i] ** 2 / (2 * sigmaf[i + 1] ** 2))) + db = 'no' + stepsize = f[0][1] - f[0][0] + if db == 'db': + p = db + + + # fig.suptitle(d, labelpad = 25) + #print(d) + ax = {} + + ec = 'grey' + #fc = 'moccasin' + #ec = 'wheat' + scale = 1 + ax = plot_whole_ps(f, ax, grid, colors, eodf, stepsize, p, df, scale = scale, ax_nr = 0,nr=0, filter='whole' ,color_eod = color_eod,color_stim = color_stim , color_df = color_df,fc = fc, ec = ec) + ax[0].legend( loc=(0,1), + ncol=3, mode="expand", borderaxespad=0.)#bbox_to_anchor=(0.4, 1, 0.6, .1), + + ax[0] = remove_tick_marks(ax[0]) + ax = plot_whole_ps(f,ax,grid, colors, eodf, stepsize, p, df,scale = scale, ax_nr = 1,nr = 0, filter = 'original',color_eod = color_eod,color_stim = color_stim , color_df = color_df,fc = fc, ec = ec) + ax[1] = remove_tick_marks(ax[1]) + #ax[0].set_ylim([0, 2000]) + + wide = 2 + #embed() + for i in range(len(sigma)): + ax[i+2] = plt.subplot(grid[i+2]) + plot_filter(ax, i+2, f[1+i], p,i+1, colors, gauss[1+i], eodf, stepsize, wide, df[1+i],scale = scale,color_eod = color_eod,color_stim = color_stim , color_df = color_df,fc = fc, ec = ec) + ax[i+2].set_ylim([0, eodf*1.5]) + ax[2] = remove_tick_marks(ax[2]) + #embed() + #if db == 'db': + # ax[0].set_ylim([np.min([p]),0])#p[0][,p[1][0:2000],p[2][0:2000],p[3][0:2000] + #else: + # ax[0].set_ylim([ 0,np.max([p])]) + ax[int(len(df))-1].set_ylabel('frequency [Hz]') + # ax[1].set_ylabel(r'power [Hz$^2$/Hz]') + #ax[0].ticklabel_format(axis='y', style='sci', scilimits=[0, 0]) + + + #print(df[3]) + for i in range(len(df)+1): + ax[i].spines['right'].set_visible(False) + ax[i].spines['top'].set_visible(False) + cols = grid.ncols + rows = grid.nrows + ax[int(len(df))].set_xlabel(' power spectral density [Hz²/Hz]') + #ax[2].set_ylabel('Hz²/Hz') + #ax[3].set_ylabel('Hz²/Hz') + #ax[0].set_ylabel('Hz²/Hz') + for i in range(len(df)+1): + ax[i].axhline(y = eodf/2, color = line_col, linestyle = 'dashed') + plt.tight_layout() + #embed() + #fig.label_axes() + +def plot_whole_ps(f,ax,grid, colors, eodf, stepsize, p, df, ax_nr = 0,nr = 0, filter = 'original', scale = 1, color_eod = 'orange',color_stim = 'red', color_df = 'green',fc = 'lightgrey', ec = 'grey',): + ax[ax_nr] = plt.subplot(grid[ax_nr]) + + if filter == 'whole': + #ax[nr].set_facecolor('lightgrey') + ax[ax_nr].plot(p[nr], f[nr], color=colors[0]) + ax[ax_nr].fill_between([np.min(p), np.max(p)], [f[0][-1],f[0][-1]], color=fc,edgecolor=ec) + ax[ax_nr].plot(np.max(p[nr][int(abs(df[nr]) / stepsize) - 5:int(abs(df[nr]) / stepsize) + 5]) * scale, df[0], + color=color_df, marker='o', linestyle='None', label='Df') + ax[ax_nr].plot(p[nr][int((df[nr] + eodf) / stepsize) + 1], df[nr] + eodf, color=color_stim, marker='o', + linestyle='None', + label='stimulus') + ax[ax_nr].plot(np.max(p[nr][int(eodf / stepsize) - 5:int(eodf / stepsize) + 5]) * scale, eodf - 1, color=color_eod, + marker='o', linestyle='None', label='EODf') # = '+str(int(eodf))+' Hz') + + elif filter == 'original': + #ax[nr].fill_between([eodf] * len(p[nr]), p[nr], color='lightgrey') + #ax[nr].fill_between([max(p[0])]*len(f[nr]),f[nr], color = 'lightgrey') + ax[ax_nr].plot(p[nr][f[nr] eodf / 2])), f[nr][f[nr] > eodf / 2], color=colors[0]) + #embed() + ax[ax_nr].fill_between([np.min(p),np.max(p)], [eodf/2,eodf/2], color=fc,edgecolor=ec) + ax[ax_nr].plot(np.max(p[nr][int(abs(df[nr]) / stepsize) - 5:int(abs(df[nr]) / stepsize) + 5]) * scale, df[0], + color=color_df, marker='o',zorder = 2, linestyle='None', label='Df')#edgecolors = 'black' + ax[ax_nr].plot(0, df[nr] + eodf, color=color_stim, marker='o', + linestyle='None', + label='stimulus',zorder = 2)#,edgecolors = 'black' + ax[ax_nr].plot(0, eodf - 1, color=color_eod, + marker='o', linestyle='None', label='EODf',zorder = 2) #edgecolors = 'black', # = '+str(int(eodf))+' Hz') + + #plt.plot([np.min(p),np.max(p)],[eodf,eodf], color = 'red') + #embed() + #ax[nr].plot([0]*5) + #ax[nr].plot([1000]*5) + # ax[0].fill_between( [max(p[0])]*len(f[1]),f[0], facecolor='lightgrey', edgecolor='grey') + + + ax[ax_nr].set_ylim([0, eodf * 1.5]) + ax[ax_nr].set_xlim(ax[ax_nr].get_xlim()[::-1]) + return ax + +def plot_filter(ax, ax_nr, f, p4,array_nr, colors, gauss3, eodf, stepsize, wide, df, fc = 'lightgrey', scale = 1, ec = 'grey',color_eod = 'orange',color_stim = 'red', color_df = 'green'): + ax[ax_nr].plot( p4[array_nr],f, color=colors[0]) + prev_height = np.max((p4[0][int(abs(df) / stepsize) - wide:int(abs(df) / stepsize) + wide]) * scale) + now_height = np.max((p4[array_nr][int(abs(df) / stepsize) - wide:int(abs(df) / stepsize) + wide]) *scale) + + ax[ax_nr].plot([prev_height, now_height+440],[np.abs(df), np.abs(df)], color = 'black') + ax[ax_nr].scatter( now_height+440, np.abs(df), marker = '>', color='black', zorder = 2) + #embed() + + + ax[ax_nr].fill_between(max(p4[0]) * gauss3 ** 2,f, facecolor=fc, edgecolor=ec) + ax[ax_nr].plot(np.max(p4[array_nr][int(eodf / stepsize) - wide:int(eodf / stepsize) + wide]) * scale, eodf, color=color_eod, marker='o', + linestyle='None') + ax[ax_nr].plot( np.max(p4[array_nr][int(abs(df) / stepsize) - wide:int(abs(df) / stepsize) + wide]) * scale,abs(df), + color=color_df, marker='o', linestyle='None') + ax[ax_nr].plot( + np.max(p4[array_nr][int((df + eodf) / stepsize) - wide:int((df + eodf) / stepsize) + wide]) * scale,df + eodf, + color=color_stim, marker='o', linestyle='None') + ax[ax_nr].set_xlim(ax[ax_nr].get_xlim()[::-1]) + return ax + + + +def plot_amp(ax, mean1, dev,name = 'amp',nr = 1): + np.unique(mean1['type']) + all_means = mean1[mean1['type'] == name +' mean'] + original = all_means[all_means['dev'] == 'original'] + #m005 = all_means[all_means['dev'] == '005'] + m05 = all_means[all_means['dev'] == '05'] + m2 = all_means[all_means['dev'] == '2'] + # fig, ax = plt.subplots(nrows=4, ncols = 3, sharex=True) + versions = [original, m05, m2] #m005, + for i in range(len(versions)): + keys = [k for k in versions[i]][2::] + try: + data = np.array(versions[i][keys])[0] + except: + break + axis = np.arange(0, len(data), 1) + axis_new = axis * 1 + similarity = [keys, data] + sim = np.argsort(similarity[0]) + # similarity[sim] + all_means = mean1[mean1['type'] == name+' std'] + std = all_means[all_means['dev'] == dev[i]] + std = np.array(std[keys])[0] + #ax[1, 1].set_ylabel('Modulation depth') + #ax[nr,i].set_title(dev[i] + ' ms') + all_means = mean1[mean1['type'] == name+' 95'] + std95 = all_means[all_means['dev'] == dev[i]] + std95 = np.array(std95[keys])[0] + all_means = mean1[mean1['type'] == name+' 05'] + std05 = all_means[all_means['dev'] == dev[i]] + std05 = np.array(std05[keys])[0] + ax[nr,i].fill_between(np.array(keys)[sim], list(std95[sim]), list(std05[sim]), + color='gainsboro') + ax[nr,i].fill_between(np.array(keys)[sim], list(data[sim] + std[sim]), list(data[sim] - std[sim]), + color='darkgrey') + + # ax[i].plot(data_tob.ff, data_tob.fe, color='grey', linestyle='--', label='AMf') + ax[nr,i].plot(np.array(keys)[sim], data[sim], color='black') + # ax[0].plot(data1.x, data1.freq20, color=colors[1], label='20 %') + #embed() + return ax + +def create_beat_corr(hz_range, eod_fr): + beat_corr = hz_range%eod_fr + beat_corr[beat_corr>eod_fr/2] = eod_fr[beat_corr>eod_fr/2] - beat_corr[beat_corr>eod_fr/2] + return beat_corr + + +def plot_mean_cells( grid,data = ['2019-10-21-aa-invivo-1'],line_col = 'black',lw = 0.5, sigma = ['original','05','2'],colors = ['#BA2D22', '#F47F17', '#AAB71B', '#3673A4', '#53379B'], wish_df = 150, color_eod = 'black',color_df = 'orange', size = 17, color_modul = ['steelblue']): + #mean1 = pd.read_pickle('mean.pkl') + data_all = pd.read_pickle('beat_results_smoothed.pkl') + d = data_all[data_all['dataset'] == data[0]] + + #embed() + + inch_factor = 2.54 + + half_page_width = 7.9 / inch_factor + intermediate_width = 12 / inch_factor + whole_page_width = 16 * 2 / inch_factor + + small_length = 6 / inch_factor + intermediate_length = 12 * 1.5 / inch_factor + max_length = 25 / inch_factor + whole_page_width = 6.7 + intermediate_length = 3.7 + + #plt.rcParams['figure.figsize'] = (whole_page_width, intermediate_length) + plt.rcParams['font.size'] = 11 + plt.rcParams['axes.titlesize'] = 12 + plt.rcParams['axes.labelsize'] = 12 + plt.rcParams['lines.linewidth'] = 1.5 + plt.rcParams['lines.markersize'] = 8 + plt.rcParams['legend.loc'] = 'upper right' + plt.rcParams["legend.frameon"] = False + + # load data for plot + + # data1 = pd.read_csv('ma_allcells_unsmoothed.csv') + # data2 = pd.read_csv('ma_allcells_05.csv') + # data3 = pd.read_csv('ma_allcells_2.csv') + # data_tob = pd.read_csv('ma_toblerone.csv') + + # smothed = df_beat[df_beat['dev'] == 'original'] + # data1 = smothed[smothed['type'] == 'amp'] + + x = np.arange(0, 2550, 50) + corr = create_beat_corr(x, np.array([500] * len(x))) + + #np.unique(mean1['type']) + #all_means = mean1[mean1['type'] == 'max mean'] + + #versions = [[]]*len(dev) + #for i in range(len(dev)): + version =[[]]*len(sigma) + version2 = [[]] * len(sigma) + dev = [[]] * len(sigma) + limits = [[]]*len(sigma) + minimum = [[]] * len(sigma) + y_max = [[]] * len(sigma) + y_min = [[]] * len(sigma) + ax ={} + + for i, e in enumerate(sigma): + y2 = d['result_amplitude_max_' + e] + y_max[i] = np.max(y2) + y_min[i] = np.min(y2) + for i,e in enumerate(sigma): + dev[i] = sigma[i] + plots = gridspec.GridSpecFromSubplotSpec( 1,2, + subplot_spec=grid[i], wspace=0.4, hspace=0.5) + d = data_all[data_all['dataset'] == data[0]] + x = d['delta_f'] / d['eodf'] + 1 + #embed() + data = ['2019-10-21-aa-invivo-1'] + #end = ['original', '005', '05', '2'] + y = d['result_frequency_' + e] + #embed() + y2 = d['result_amplitude_max_' + e] + #y_sum[i] = np.nanmax(y) + ff = d['delta_f'] / d['eodf'] + 1 + fe = d['beat_corr'] + #fig.suptitle(set) + ax[0] = plt.subplot(plots[0]) + if e != sigma[-1]: + ax[0] = remove_tick_marks(ax[0]) + ax[0].plot(ff, fe, color='grey', zorder = 1, linestyle='--', linewidth = lw) + ax[0].plot(x, y, color=colors[0], zorder = 2,linewidth = lw) + #embed() + eod = d['eodf'].iloc[0] + ax[0].axhline(y=eod / 2, color=line_col, linestyle='dashed') + if np.max(y) 0.05) & (spikes < 0.95)] + if len(spikes_cut) < 3: + counter_cut += 1 + break + spikes_mat = np.zeros(int(spikes[-1] * sampling_rate + 5)) + spikes_idx = np.round((spikes) * sampling_rate) + for spike in spikes_idx: + spikes_mat[int(spike)] = 1 + spikes_mat = spikes_mat * sampling_rate + if type(window) != str: + spikes_mat = gaussian_filter(spikes_mat, sigma=window) + # smoothened_spikes_mat05 = gaussian_filter(spikes_mat, sigma=window05) * sampling_rate + # smoothened_spikes_mat2 = gaussian_filter(spikes_mat, sigma=window2) * sampling_rate + else: + spikes_mat = spikes_mat*1 + nfft = 4096 + p, f = ml.psd(spikes_mat - np.mean(spikes_mat), Fs=sampling_rate, NFFT=nfft, noverlap=nfft / 2) + ppp.append(p) + #spike_times = data_cell.iloc[i]['spike_times']# + + #if len(spike_times) < 3: + # counter_spikes += 1 + # break + + #spikes = spike_times - spike_times[0] + + # cut trial into snippets of 100 ms + #cut_vec = np.arange(0, duration, trial_cut) + #spikes_cut = spikes[(spikes > 0.05) & (spikes < 0.95)] + + #if len(spikes_cut) < 3: + # counter_cut += 1 + # break + #spikes_new = spikes_cut - spikes_cut[0] + + #spikes_mat = np.zeros(int(spikes_new[-1] * sampling_rate) + 2) + # spikes_mat = np.zeros(int(trial_cut * sampling_rate) + 1) + #spikes_idx = np.round((spikes_new) * sampling_rate) + #for spike in spikes_idx: + # spikes_mat[int(spike)] = 1 + #spikes_mat = spikes_mat * sampling_rate + + #nfft = 4096 + #p, f = ml.psd(smoothened - np.mean(smoothened), Fs=sampling_rate, NFFT=nfft, noverlap=nfft / 2) + #ppp.append(p) + #p_mean = np.mean(pp,axis = 0) + p_mean2 = np.mean(ppp, axis=0) + #ref = (np.max(p_mean2)) + # + db = 10 * np.log10(p_mean2 / np.max(p_mean2)) + #ref = (np.max(p_mean2)) + #db2 = 10 * np.log10(p_mean2 / ref) + #embed() + return df_here,p_mean2,f,db + +def plot_example_ps_trans(grid,colors = ['brown'],line_col = 'black',input = ['2019-10-21-aa-invivo-1'],sigma = [0.00005,0.00025,0.0005, 0.002],wish_df = 150, color_eod = 'orange',color_stim = 'red', color_df = 'green'): + sampling_rate = 40000 + plt.rcParams['lines.linewidth'] = 1.5 + plt.rcParams['lines.markersize'] = 6 + iter = ['2019-05-07-by-invivo-1'] + iter = ['2019-09-23-ad-invivo-1'] + iter = input + for cell in iter: + data = pd.read_pickle('data_beat.pkl') + beat_results = pd.read_pickle('beat_results_smoothed.pkl') + #embed() + eodf = int(beat_results[beat_results['dataset'] == cell]['eodf'].iloc[0]) + df = [[]] * (len(sigma) + 1) + p = [[]] * (len(sigma) + 1) + f = [[]] * (len(sigma) + 1) + db = [[]] * (len(sigma) + 1) + sigmaf = [[]] * (len(sigma) + 1) + gauss = [[]] * (len(sigma) + 1) + + df[0], p[0], f[0], db[0] = ps_df(data, d=cell, wish_df= wish_df, window='no', sampling_rate=sampling_rate) + for i in range(len(sigma)): + df[1+i], p[1+i], f[1+i], db[1+i] = ps_df(data, d=cell, wish_df= wish_df, window = sigma[i]*sampling_rate,sampling_rate = sampling_rate) + sigmaf[i + 1] = 1 / (2 * np.pi * sigma[i]) + gauss[i + 1] = np.exp(-(f[1+i] ** 2 / (2 * sigmaf[i + 1] ** 2))) + db = 'no' + stepsize = f[0][1] - f[0][0] + if db == 'db': + p = db + ax = {} + fc = 'lightgrey' + ec = 'grey' + #fc = 'moccasin' + #ec = 'wheat' + scale = 1 + ax = plot_whole_ps_trans(f, ax, grid, colors, eodf, stepsize, p, df, scale = scale, ax_nr = 0,nr=0, filter='whole' ,color_eod = color_eod,color_stim = color_stim , color_df = color_df,fc = fc, ec = ec) + ax[0].legend( loc=(0,1), + ncol=3, mode="expand", borderaxespad=0.)#bbox_to_anchor=(0.4, 1, 0.6, .1), + ax[0].set_xlim([0, 1000]) + + ax[0] = remove_tick_marks(ax[0]) + ax = plot_whole_ps_trans(f,ax,grid, colors, eodf, stepsize, p, df,scale = scale, ax_nr = 1,nr = 0, filter = 'original',color_eod = color_eod,color_stim = color_stim , color_df = color_df,fc = fc, ec = ec) + ax[1] = remove_tick_marks(ax[1]) + ax[1].set_xlim([0, 1000]) + + wide = 2 + #embed() + for i in range(len(sigma)): + ax[i+2] = plt.subplot(grid[i+2]) + plot_filter_trans(ax, i+2, f[1+i], p,i+1, colors, gauss[1+i], eodf, stepsize, wide, df[1+i],scale = scale,color_eod = color_eod,color_stim = color_stim , color_df = color_df,fc = fc, ec = ec) + #ax[i+2].set_ylim([0, eodf*1.5]) + ax[i + 2].set_xlim([0, 1000]) + ax[2] = remove_tick_marks(ax[2]) + #embed() + #if db == 'db': + # ax[0].set_ylim([np.min([p]),0])#p[0][,p[1][0:2000],p[2][0:2000],p[3][0:2000] + #else: + # ax[0].set_ylim([ 0,np.max([p])]) + ax[int(len(df))-1].set_ylabel('frequency [Hz]') + # ax[1].set_ylabel(r'power [Hz$^2$/Hz]') + #ax[0].ticklabel_format(axis='y', style='sci', scilimits=[0, 0]) + + + #print(df[3]) + for i in range(len(df)+1): + ax[i].spines['right'].set_visible(False) + ax[i].spines['top'].set_visible(False) + cols = grid.ncols + rows = grid.nrows + ax[int(len(df))].set_xlabel(' power spectral density [Hz²/Hz]') + #ax[2].set_ylabel('Hz²/Hz') + #ax[3].set_ylabel('Hz²/Hz') + #ax[0].set_ylabel('Hz²/Hz') + for i in range(1,len(df)+1): + ax[i].axvline(x = eodf/2, color = line_col, linestyle = 'dashed') + plt.tight_layout() + #embed() + #fig.label_axes() + +def plot_example_ps(grid,colors = ['brown'],line_col = 'black',input = ['2019-10-21-aa-invivo-1'],sigma = [0.00005,0.00025,0.0005, 0.002],wish_df = 150, color_eod = 'orange',color_stim = 'red', color_df = 'green'): + sampling_rate = 40000 + #colors = ['#BA2D22', '#F47F17', '#AAB71B', '#3673A4', '#53379B'] + + + plt.rcParams['lines.linewidth'] = 1.5 + plt.rcParams['lines.markersize'] = 6 + #data = pd.read_pickle('../pictures_highbeats/data_beat.pkl') + #iter = np.unique(data['dataset']) + iter = ['2019-05-07-by-invivo-1'] + iter = ['2019-09-23-ad-invivo-1'] + iter = input + for cell in iter: + data = pd.read_pickle('data_beat.pkl') + beat_results = pd.read_pickle('beat_results_smoothed.pkl') + #embed() + eodf = int(beat_results[beat_results['dataset'] == cell]['eodf'].iloc[0]) + df = [[]] * (len(sigma) + 1) + p = [[]] * (len(sigma) + 1) + f = [[]] * (len(sigma) + 1) + db = [[]] * (len(sigma) + 1) + sigmaf = [[]] * (len(sigma) + 1) + gauss = [[]] * (len(sigma) + 1) + + df[0], p[0], f[0], db[0] = ps_df(data, d=cell, wish_df= wish_df, window='no', sampling_rate=sampling_rate) + for i in range(len(sigma)): + df[1+i], p[1+i], f[1+i], db[1+i] = ps_df(data, d=cell, wish_df= wish_df, window = sigma[i]*sampling_rate,sampling_rate = sampling_rate) + sigmaf[i + 1] = 1 / (2 * np.pi * sigma[i]) + gauss[i + 1] = np.exp(-(f[1+i] ** 2 / (2 * sigmaf[i + 1] ** 2))) + db = 'no' + stepsize = f[0][1] - f[0][0] + if db == 'db': + p = db + + + # fig.suptitle(d, labelpad = 25) + #print(d) + ax = {} + fc = 'lightgrey' + ec = 'grey' + #fc = 'moccasin' + #ec = 'wheat' + scale = 1 + ax = plot_whole_ps(f, ax, grid, colors, eodf, stepsize, p, df, scale = scale, ax_nr = 0,nr=0, filter='whole' ,color_eod = color_eod,color_stim = color_stim , color_df = color_df,fc = fc, ec = ec) + ax[0].legend( loc=(0,1), + ncol=3, mode="expand", borderaxespad=0.)#bbox_to_anchor=(0.4, 1, 0.6, .1), + + ax[0] = remove_tick_marks(ax[0]) + ax = plot_whole_ps(f,ax,grid, colors, eodf, stepsize, p, df,scale = scale, ax_nr = 1,nr = 0, filter = 'original',color_eod = color_eod,color_stim = color_stim , color_df = color_df,fc = fc, ec = ec) + ax[1] = remove_tick_marks(ax[1]) + #ax[0].set_ylim([0, 2000]) + + wide = 2 + #embed() + for i in range(len(sigma)): + ax[i+2] = plt.subplot(grid[i+2]) + plot_filter(ax, i+2, f[1+i], p,i+1, colors, gauss[1+i], eodf, stepsize, wide, df[1+i],scale = scale,color_eod = color_eod,color_stim = color_stim , color_df = color_df,fc = fc, ec = ec) + ax[i+2].set_ylim([0, eodf*1.5]) + ax[2] = remove_tick_marks(ax[2]) + #embed() + #if db == 'db': + # ax[0].set_ylim([np.min([p]),0])#p[0][,p[1][0:2000],p[2][0:2000],p[3][0:2000] + #else: + # ax[0].set_ylim([ 0,np.max([p])]) + ax[int(len(df))-1].set_ylabel('frequency [Hz]') + # ax[1].set_ylabel(r'power [Hz$^2$/Hz]') + #ax[0].ticklabel_format(axis='y', style='sci', scilimits=[0, 0]) + + + #print(df[3]) + for i in range(len(df)+1): + ax[i].spines['right'].set_visible(False) + ax[i].spines['top'].set_visible(False) + cols = grid.ncols + rows = grid.nrows + ax[int(len(df))].set_xlabel(' power spectral density [Hz²/Hz]') + #ax[2].set_ylabel('Hz²/Hz') + #ax[3].set_ylabel('Hz²/Hz') + #ax[0].set_ylabel('Hz²/Hz') + for i in range(1,len(df)+1): + ax[i].axhline(y = eodf/2, color = line_col, linestyle = 'dashed') + plt.tight_layout() + #embed() + #fig.label_axes() + +def plot_whole_ps_trans(f,ax,grid, colors, eodf, stepsize, p, df, ax_nr = 0,nr = 0, filter = 'original', scale = 1, color_eod = 'orange',color_stim = 'red', color_df = 'green',fc = 'lightgrey', ec = 'grey',): + ax[ax_nr] = plt.subplot(grid[ax_nr]) + + if filter == 'whole': + #ax[nr].set_facecolor('lightgrey') + ax[ax_nr].plot( f[nr],p[nr], color=colors[0]) + ax[ax_nr].fill_between( [f[0][-1],f[0][-1]],[np.min(p), np.max(p)], color=fc,edgecolor=ec) + ax[ax_nr].plot(df[0],np.max(p[nr][int(abs(df[nr]) / stepsize) - 5:int(abs(df[nr]) / stepsize) + 5]) * scale, + color=color_df, marker='o', linestyle='None', label='Df') + ax[ax_nr].plot(df[nr] + eodf,p[nr][int((df[nr] + eodf) / stepsize) + 1], color=color_stim, marker='o', + linestyle='None', + label='stimulus') + ax[ax_nr].plot(eodf - 1,np.max(p[nr][int(eodf / stepsize) - 5:int(eodf / stepsize) + 5]) * scale, color=color_eod, + marker='o', linestyle='None', label='EODf') # = '+str(int(eodf))+' Hz') + + elif filter == 'original': + #ax[nr].fill_between([eodf] * len(p[nr]), p[nr], color='lightgrey') + #ax[nr].fill_between([max(p[0])]*len(f[nr]),f[nr], color = 'lightgrey') + ax[ax_nr].plot(f[nr][f[nr] eodf / 2],np.zeros(len(f[nr][f[nr] > eodf / 2])), color=colors[0]) + #embed() + ax[ax_nr].fill_between( [eodf/2,eodf/2],[np.min(p),np.max(p)], color=fc,edgecolor=ec) + ax[ax_nr].plot( df[0],np.max(p[nr][int(abs(df[nr]) / stepsize) - 5:int(abs(df[nr]) / stepsize) + 5]) * scale, + color=color_df, marker='o',zorder = 2, linestyle='None', label='Df')#edgecolors = 'black' + ax[ax_nr].plot(df[nr] + eodf,0, color=color_stim, marker='o', + linestyle='None', + label='stimulus',zorder = 2)#,edgecolors = 'black' + ax[ax_nr].plot(eodf - 1,0, color=color_eod, + marker='o', linestyle='None', label='EODf',zorder = 2) #edgecolors = 'black', # = '+str(int(eodf))+' Hz') + + #ax[ax_nr].set_ylim([0, eodf * 1.5]) + #ax[ax_nr].set_xlim(ax[ax_nr].get_xlim()[::-1]) + return ax + +def plot_whole_ps(f,ax,grid, colors, eodf, stepsize, p, df, ax_nr = 0,nr = 0, filter = 'original', scale = 1, color_eod = 'orange',color_stim = 'red', color_df = 'green',fc = 'lightgrey', ec = 'grey',): + ax[ax_nr] = plt.subplot(grid[ax_nr]) + + if filter == 'whole': + #ax[nr].set_facecolor('lightgrey') + ax[ax_nr].plot(p[nr], f[nr], color=colors[0]) + ax[ax_nr].fill_between([np.min(p), np.max(p)], [f[0][-1],f[0][-1]], color=fc,edgecolor=ec) + ax[ax_nr].plot(np.max(p[nr][int(abs(df[nr]) / stepsize) - 5:int(abs(df[nr]) / stepsize) + 5]) * scale, df[0], + color=color_df, marker='o', linestyle='None', label='Df') + ax[ax_nr].plot(p[nr][int((df[nr] + eodf) / stepsize) + 1], df[nr] + eodf, color=color_stim, marker='o', + linestyle='None', + label='stimulus') + ax[ax_nr].plot(np.max(p[nr][int(eodf / stepsize) - 5:int(eodf / stepsize) + 5]) * scale, eodf - 1, color=color_eod, + marker='o', linestyle='None', label='EODf') # = '+str(int(eodf))+' Hz') + + elif filter == 'original': + #ax[nr].fill_between([eodf] * len(p[nr]), p[nr], color='lightgrey') + #ax[nr].fill_between([max(p[0])]*len(f[nr]),f[nr], color = 'lightgrey') + ax[ax_nr].plot(p[nr][f[nr] eodf / 2])), f[nr][f[nr] > eodf / 2], color=colors[0]) + #embed() + ax[ax_nr].fill_between([np.min(p),np.max(p)], [eodf/2,eodf/2], color=fc,edgecolor=ec) + ax[ax_nr].plot(np.max(p[nr][int(abs(df[nr]) / stepsize) - 5:int(abs(df[nr]) / stepsize) + 5]) * scale, df[0], + color=color_df, marker='o',zorder = 2, linestyle='None', label='Df')#edgecolors = 'black' + ax[ax_nr].plot(0, df[nr] + eodf, color=color_stim, marker='o', + linestyle='None', + label='stimulus',zorder = 2)#,edgecolors = 'black' + ax[ax_nr].plot(0, eodf - 1, color=color_eod, + marker='o', linestyle='None', label='EODf',zorder = 2) #edgecolors = 'black', # = '+str(int(eodf))+' Hz') + + ax[ax_nr].set_ylim([0, eodf * 1.5]) + ax[ax_nr].set_xlim(ax[ax_nr].get_xlim()[::-1]) + return ax + + +def plot_filter_trans(ax, ax_nr, f, p4,array_nr, colors, gauss3, eodf, stepsize, wide, df, fc = 'lightgrey', scale = 1, ec = 'grey',color_eod = 'orange',color_stim = 'red', color_df = 'green'): + ax[ax_nr].plot(f, p4[array_nr],color=colors[0]) + prev_height = np.max((p4[0][int(abs(df) / stepsize) - wide:int(abs(df) / stepsize) + wide]) * scale) + now_height = np.max((p4[array_nr][int(abs(df) / stepsize) - wide:int(abs(df) / stepsize) + wide]) *scale) + + ax[ax_nr].plot([np.abs(df), np.abs(df)],[prev_height, now_height+440], color = 'black') + ax[ax_nr].scatter( np.abs(df), now_height+440, marker = 'v', color='black', zorder = 2) + #embed() + + + ax[ax_nr].fill_between(f, max(p4[0]) * gauss3 ** 2, facecolor=fc, edgecolor=ec) + ax[ax_nr].plot( eodf, np.max(p4[array_nr][int(eodf / stepsize) - wide:int(eodf / stepsize) + wide]) * scale,color=color_eod, marker='o', + linestyle='None') + ax[ax_nr].plot( abs(df),np.max(p4[array_nr][int(abs(df) / stepsize) - wide:int(abs(df) / stepsize) + wide]) * scale, + color=color_df, marker='o', linestyle='None') + #ax[ax_nr].plot(df + eodf, + # np.max(df + eodf,p4[array_nr][int((df + eodf) / stepsize) - wide:int((df + eodf) / stepsize) + wide]) * scale, + # color=color_stim, marker='o', linestyle='None') + #ax[ax_nr].set_xlim(ax[ax_nr].get_xlim()[::-1]) + return ax + +def plot_filter(ax, ax_nr, f, p4,array_nr, colors, gauss3, eodf, stepsize, wide, df, fc = 'lightgrey', scale = 1, ec = 'grey',color_eod = 'orange',color_stim = 'red', color_df = 'green'): + ax[ax_nr].plot( p4[array_nr],f, color=colors[0]) + prev_height = np.max((p4[0][int(abs(df) / stepsize) - wide:int(abs(df) / stepsize) + wide]) * scale) + now_height = np.max((p4[array_nr][int(abs(df) / stepsize) - wide:int(abs(df) / stepsize) + wide]) *scale) + + #ax[ax_nr].plot([prev_height, now_height+440],[np.abs(df), np.abs(df)], color = 'black') + #ax[ax_nr].scatter( now_height+440, np.abs(df), marker = '>', color='black', zorder = 2) + #embed() + + + ax[ax_nr].fill_between(max(p4[0]) * gauss3 ** 2,f, facecolor=fc, edgecolor=ec) + ax[ax_nr].plot(np.max(p4[array_nr][int(eodf / stepsize) - wide:int(eodf / stepsize) + wide]) * scale, eodf, color=color_eod, marker='o', + linestyle='None') + ax[ax_nr].plot( np.max(p4[array_nr][int(abs(df) / stepsize) - wide:int(abs(df) / stepsize) + wide]) * scale,abs(df), + color=color_df, marker='o', linestyle='None') + ax[ax_nr].plot( + np.max(p4[array_nr][int((df + eodf) / stepsize) - wide:int((df + eodf) / stepsize) + wide]) * scale,df + eodf, + color=color_stim, marker='o', linestyle='None') + ax[ax_nr].set_xlim(ax[ax_nr].get_xlim()[::-1]) + return ax + + + +def plot_amp(ax, mean1, dev,name = 'amp',nr = 1): + np.unique(mean1['type']) + all_means = mean1[mean1['type'] == name +' mean'] + original = all_means[all_means['dev'] == 'original'] + #m005 = all_means[all_means['dev'] == '005'] + m05 = all_means[all_means['dev'] == '05'] + m2 = all_means[all_means['dev'] == '2'] + # fig, ax = plt.subplots(nrows=4, ncols = 3, sharex=True) + versions = [original, m05, m2] #m005, + for i in range(len(versions)): + keys = [k for k in versions[i]][2::] + try: + data = np.array(versions[i][keys])[0] + except: + break + axis = np.arange(0, len(data), 1) + axis_new = axis * 1 + similarity = [keys, data] + sim = np.argsort(similarity[0]) + # similarity[sim] + all_means = mean1[mean1['type'] == name+' std'] + std = all_means[all_means['dev'] == dev[i]] + std = np.array(std[keys])[0] + #ax[1, 1].set_ylabel('Modulation depth') + #ax[nr,i].set_title(dev[i] + ' ms') + all_means = mean1[mean1['type'] == name+' 95'] + std95 = all_means[all_means['dev'] == dev[i]] + std95 = np.array(std95[keys])[0] + all_means = mean1[mean1['type'] == name+' 05'] + std05 = all_means[all_means['dev'] == dev[i]] + std05 = np.array(std05[keys])[0] + ax[nr,i].fill_between(np.array(keys)[sim], list(std95[sim]), list(std05[sim]), + color='gainsboro') + ax[nr,i].fill_between(np.array(keys)[sim], list(data[sim] + std[sim]), list(data[sim] - std[sim]), + color='darkgrey') + + # ax[i].plot(data_tob.ff, data_tob.fe, color='grey', linestyle='--', label='AMf') + ax[nr,i].plot(np.array(keys)[sim], data[sim], color='black') + # ax[0].plot(data1.x, data1.freq20, color=colors[1], label='20 %') + #embed() + return ax + +def create_beat_corr(hz_range, eod_fr): + beat_corr = hz_range%eod_fr + beat_corr[beat_corr>eod_fr/2] = eod_fr[beat_corr>eod_fr/2] - beat_corr[beat_corr>eod_fr/2] + return beat_corr + +def plot_mean_cells_modul( grid,data = ['2019-10-21-aa-invivo-1'],line_col = 'black',lw = 0.5, sigma = ['original','05','2'],colors = ['#BA2D22', '#F47F17', '#AAB71B', '#3673A4', '#53379B'], wish_df = 150, color_eod = 'black',color_df = 'orange', size = 17, color_modul = ['steelblue']): + #mean1 = pd.read_pickle('mean.pkl') + data_all = pd.read_pickle('beat_results_smoothed.pkl') + d = data_all[data_all['dataset'] == data[0]] + + #embed() + + inch_factor = 2.54 + + plt.rcParams['font.size'] = 11 + plt.rcParams['axes.titlesize'] = 12 + plt.rcParams['axes.labelsize'] = 12 + plt.rcParams['lines.linewidth'] = 1.5 + plt.rcParams['lines.markersize'] = 8 + plt.rcParams['legend.loc'] = 'upper right' + plt.rcParams["legend.frameon"] = False + + x = np.arange(0, 2550, 50) + corr = create_beat_corr(x, np.array([500] * len(x))) + + #np.unique(mean1['type']) + #all_means = mean1[mean1['type'] == 'max mean'] + + #versions = [[]]*len(dev) + #for i in range(len(dev)): + version =[[]]*len(sigma) + version2 = [[]] * len(sigma) + dev = [[]] * len(sigma) + limits = [[]]*len(sigma) + minimum = [[]] * len(sigma) + y_max = [[]] * len(sigma) + y_min = [[]] * len(sigma) + ax ={} + + for i, e in enumerate(sigma): + y2 = d['result_amplitude_max_' + e] + y_max[i] = np.max(y2) + y_min[i] = np.min(y2) + for i,e in enumerate(sigma): + dev[i] = sigma[i] + plots = gridspec.GridSpecFromSubplotSpec( 1,1, + subplot_spec=grid[i], wspace=0.4, hspace=0.5) + d = data_all[data_all['dataset'] == data[0]] + x = d['delta_f'] / d['eodf'] + 1 + #embed() + data = ['2019-10-21-aa-invivo-1'] + #end = ['original', '005', '05', '2'] + y = d['result_frequency_' + e] + #embed() + y2 = d['result_amplitude_max_' + e] + #y_sum[i] = np.nanmax(y) + ff = d['delta_f'] / d['eodf'] + 1 + fe = d['beat_corr'] + ax[0] = plt.subplot(plots[0]) + eod = d['eodf'].iloc[0] + + if np.max(y) 0.05) & (spikes < 0.95)] + if len(spikes_cut) < 3: + counter_cut += 1 + break + spikes_mat = np.zeros(int(spikes[-1] * sampling_rate + 5)) + spikes_idx = np.round((spikes) * sampling_rate) + for spike in spikes_idx: + spikes_mat[int(spike)] = 1 + spikes_mat = spikes_mat * sampling_rate + if type(window) != str: + spikes_mat = gaussian_filter(spikes_mat, sigma=window) + # smoothened_spikes_mat05 = gaussian_filter(spikes_mat, sigma=window05) * sampling_rate + # smoothened_spikes_mat2 = gaussian_filter(spikes_mat, sigma=window2) * sampling_rate + else: + spikes_mat = spikes_mat*1 + nfft = 4096 + p, f = ml.psd(spikes_mat - np.mean(spikes_mat), Fs=sampling_rate, NFFT=nfft, noverlap=nfft / 2) + ppp.append(p) + #spike_times = data_cell.iloc[i]['spike_times']# + + #if len(spike_times) < 3: + # counter_spikes += 1 + # break + + #spikes = spike_times - spike_times[0] + + # cut trial into snippets of 100 ms + #cut_vec = np.arange(0, duration, trial_cut) + #spikes_cut = spikes[(spikes > 0.05) & (spikes < 0.95)] + + #if len(spikes_cut) < 3: + # counter_cut += 1 + # break + #spikes_new = spikes_cut - spikes_cut[0] + + #spikes_mat = np.zeros(int(spikes_new[-1] * sampling_rate) + 2) + # spikes_mat = np.zeros(int(trial_cut * sampling_rate) + 1) + #spikes_idx = np.round((spikes_new) * sampling_rate) + #for spike in spikes_idx: + # spikes_mat[int(spike)] = 1 + #spikes_mat = spikes_mat * sampling_rate + + #nfft = 4096 + #p, f = ml.psd(smoothened - np.mean(smoothened), Fs=sampling_rate, NFFT=nfft, noverlap=nfft / 2) + #ppp.append(p) + #p_mean = np.mean(pp,axis = 0) + p_mean2 = np.mean(ppp, axis=0) + #ref = (np.max(p_mean2)) + # + db = 10 * np.log10(p_mean2 / np.max(p_mean2)) + #ref = (np.max(p_mean2)) + #db2 = 10 * np.log10(p_mean2 / ref) + #embed() + return df_here,p_mean2,f,db + +def plot_example_ps_trans(grid,colors = ['brown'],line_col = 'black',input = ['2019-10-21-aa-invivo-1'],sigma = [0.00005,0.00025,0.0005, 0.002],wish_df = 150, color_eod = 'orange',color_stim = 'red', color_df = 'green'): + sampling_rate = 40000 + plt.rcParams['lines.linewidth'] = 1.5 + plt.rcParams['lines.markersize'] = 6 + iter = ['2019-05-07-by-invivo-1'] + iter = ['2019-09-23-ad-invivo-1'] + iter = input + for cell in iter: + data = pd.read_pickle('data_beat.pkl') + beat_results = pd.read_pickle('beat_results_smoothed.pkl') + #embed() + eodf = int(beat_results[beat_results['dataset'] == cell]['eodf'].iloc[0]) + df = [[]] * (len(sigma) + 1) + p = [[]] * (len(sigma) + 1) + f = [[]] * (len(sigma) + 1) + db = [[]] * (len(sigma) + 1) + sigmaf = [[]] * (len(sigma) + 1) + gauss = [[]] * (len(sigma) + 1) + + df[0], p[0], f[0], db[0] = ps_df(data, d=cell, wish_df= wish_df, window='no', sampling_rate=sampling_rate) + for i in range(len(sigma)): + df[1+i], p[1+i], f[1+i], db[1+i] = ps_df(data, d=cell, wish_df= wish_df, window = sigma[i]*sampling_rate,sampling_rate = sampling_rate) + sigmaf[i + 1] = 1 / (2 * np.pi * sigma[i]) + gauss[i + 1] = np.exp(-(f[1+i] ** 2 / (2 * sigmaf[i + 1] ** 2))) + db = 'no' + stepsize = f[0][1] - f[0][0] + if db == 'db': + p = db + ax = {} + fc = 'lightgrey' + ec = 'grey' + #fc = 'moccasin' + #ec = 'wheat' + scale = 1 + ax = plot_whole_ps_trans(f, ax, grid, colors, eodf, stepsize, p, df, scale = scale, ax_nr = 0,nr=0, filter='whole' ,color_eod = color_eod,color_stim = color_stim , color_df = color_df,fc = fc, ec = ec) + ax[0].legend( loc=(0,1), + ncol=3, mode="expand", borderaxespad=0.)#bbox_to_anchor=(0.4, 1, 0.6, .1), + ax[0].set_xlim([0, 1000]) + + ax[0] = remove_tick_marks(ax[0]) + ax = plot_whole_ps_trans(f,ax,grid, colors, eodf, stepsize, p, df,scale = scale, ax_nr = 1,nr = 0, filter = 'original',color_eod = color_eod,color_stim = color_stim , color_df = color_df,fc = fc, ec = ec) + ax[1] = remove_tick_marks(ax[1]) + ax[1].set_xlim([0, 1000]) + + wide = 2 + #embed() + for i in range(len(sigma)): + ax[i+2] = plt.subplot(grid[i+2]) + plot_filter_trans(ax, i+2, f[1+i], p,i+1, colors, gauss[1+i], eodf, stepsize, wide, df[1+i],scale = scale,color_eod = color_eod,color_stim = color_stim , color_df = color_df,fc = fc, ec = ec) + #ax[i+2].set_ylim([0, eodf*1.5]) + ax[i + 2].set_xlim([0, 1000]) + ax[2] = remove_tick_marks(ax[2]) + #embed() + #if db == 'db': + # ax[0].set_ylim([np.min([p]),0])#p[0][,p[1][0:2000],p[2][0:2000],p[3][0:2000] + #else: + # ax[0].set_ylim([ 0,np.max([p])]) + ax[int(len(df))].set_xlabel('frequency [Hz]') + # ax[1].set_ylabel(r'power [Hz$^2$/Hz]') + #ax[0].ticklabel_format(axis='y', style='sci', scilimits=[0, 0]) + + + #print(df[3]) + for i in range(len(df)+1): + ax[i].spines['right'].set_visible(False) + ax[i].spines['top'].set_visible(False) + cols = grid.ncols + rows = grid.nrows + ax[int(len(df))].set_ylabel(' power spectral density [Hz²/Hz]') + #ax[2].set_ylabel('Hz²/Hz') + #ax[3].set_ylabel('Hz²/Hz') + #ax[0].set_ylabel('Hz²/Hz') + for i in range(1,len(df)+1): + ax[i].axvline(x = eodf/2, color = line_col, linestyle = 'dashed') + plt.tight_layout() + #embed() + #fig.label_axes() + +def plot_example_ps(grid,colors = ['brown'],line_col = 'black',input = ['2019-10-21-aa-invivo-1'],sigma = [0.00005,0.00025,0.0005, 0.002],wish_df = 150, color_eod = 'orange',color_stim = 'red', color_df = 'green'): + sampling_rate = 40000 + #colors = ['#BA2D22', '#F47F17', '#AAB71B', '#3673A4', '#53379B'] + + + plt.rcParams['lines.linewidth'] = 1.5 + plt.rcParams['lines.markersize'] = 6 + #data = pd.read_pickle('../pictures_highbeats/data_beat.pkl') + #iter = np.unique(data['dataset']) + iter = ['2019-05-07-by-invivo-1'] + iter = ['2019-09-23-ad-invivo-1'] + iter = input + for cell in iter: + data = pd.read_pickle('data_beat.pkl') + beat_results = pd.read_pickle('beat_results_smoothed.pkl') + #embed() + eodf = int(beat_results[beat_results['dataset'] == cell]['eodf'].iloc[0]) + df = [[]] * (len(sigma) + 1) + p = [[]] * (len(sigma) + 1) + f = [[]] * (len(sigma) + 1) + db = [[]] * (len(sigma) + 1) + sigmaf = [[]] * (len(sigma) + 1) + gauss = [[]] * (len(sigma) + 1) + + df[0], p[0], f[0], db[0] = ps_df(data, d=cell, wish_df= wish_df, window='no', sampling_rate=sampling_rate) + for i in range(len(sigma)): + df[1+i], p[1+i], f[1+i], db[1+i] = ps_df(data, d=cell, wish_df= wish_df, window = sigma[i]*sampling_rate,sampling_rate = sampling_rate) + sigmaf[i + 1] = 1 / (2 * np.pi * sigma[i]) + gauss[i + 1] = np.exp(-(f[1+i] ** 2 / (2 * sigmaf[i + 1] ** 2))) + db = 'no' + stepsize = f[0][1] - f[0][0] + if db == 'db': + p = db + + + # fig.suptitle(d, labelpad = 25) + #print(d) + ax = {} + fc = 'lightgrey' + ec = 'grey' + #fc = 'moccasin' + #ec = 'wheat' + scale = 1 + ax = plot_whole_ps(f, ax, grid, colors, eodf, stepsize, p, df, scale = scale, ax_nr = 0,nr=0, filter='whole' ,color_eod = color_eod,color_stim = color_stim , color_df = color_df,fc = fc, ec = ec) + ax[0].legend( loc=(0,1), + ncol=3, mode="expand", borderaxespad=0.)#bbox_to_anchor=(0.4, 1, 0.6, .1), + + ax[0] = remove_tick_marks(ax[0]) + ax = plot_whole_ps(f,ax,grid, colors, eodf, stepsize, p, df,scale = scale, ax_nr = 1,nr = 0, filter = 'original',color_eod = color_eod,color_stim = color_stim , color_df = color_df,fc = fc, ec = ec) + ax[1] = remove_tick_marks(ax[1]) + #ax[0].set_ylim([0, 2000]) + + wide = 2 + #embed() + for i in range(len(sigma)): + ax[i+2] = plt.subplot(grid[i+2]) + plot_filter(ax, i+2, f[1+i], p,i+1, colors, gauss[1+i], eodf, stepsize, wide, df[1+i],scale = scale,color_eod = color_eod,color_stim = color_stim , color_df = color_df,fc = fc, ec = ec) + ax[i+2].set_ylim([0, eodf*1.5]) + ax[2] = remove_tick_marks(ax[2]) + #embed() + #if db == 'db': + # ax[0].set_ylim([np.min([p]),0])#p[0][,p[1][0:2000],p[2][0:2000],p[3][0:2000] + #else: + # ax[0].set_ylim([ 0,np.max([p])]) + ax[int(len(df))-1].set_ylabel('frequency [Hz]') + # ax[1].set_ylabel(r'power [Hz$^2$/Hz]') + #ax[0].ticklabel_format(axis='y', style='sci', scilimits=[0, 0]) + + + #print(df[3]) + for i in range(len(df)+1): + ax[i].spines['right'].set_visible(False) + ax[i].spines['top'].set_visible(False) + cols = grid.ncols + rows = grid.nrows + ax[int(len(df))].set_xlabel(' power spectral density [Hz²/Hz]') + #ax[2].set_ylabel('Hz²/Hz') + #ax[3].set_ylabel('Hz²/Hz') + #ax[0].set_ylabel('Hz²/Hz') + for i in range(1,len(df)+1): + ax[i].axhline(y = eodf/2, color = line_col, linestyle = 'dashed') + plt.tight_layout() + #embed() + #fig.label_axes() + +def plot_whole_ps_trans(f,ax,grid, colors, eodf, stepsize, p, df, ax_nr = 0,nr = 0, filter = 'original', scale = 1, color_eod = 'orange',color_stim = 'red', color_df = 'green',fc = 'lightgrey', ec = 'grey',): + ax[ax_nr] = plt.subplot(grid[ax_nr]) + + if filter == 'whole': + #ax[nr].set_facecolor('lightgrey') + ax[ax_nr].plot( f[nr],p[nr], color=colors[0]) + ax[ax_nr].fill_between( [f[0][-1],f[0][-1]],[np.min(p), np.max(p)], color=fc,edgecolor=ec) + ax[ax_nr].plot(df[0],np.max(p[nr][int(abs(df[nr]) / stepsize) - 5:int(abs(df[nr]) / stepsize) + 5]) * scale, + color=color_df, marker='o', linestyle='None', label='Df') + ax[ax_nr].plot(df[nr] + eodf,p[nr][int((df[nr] + eodf) / stepsize) + 1], color=color_stim, marker='o', + linestyle='None', + label='stimulus') + ax[ax_nr].plot(eodf - 1,np.max(p[nr][int(eodf / stepsize) - 5:int(eodf / stepsize) + 5]) * scale, color=color_eod, + marker='o', linestyle='None', label='EODf') # = '+str(int(eodf))+' Hz') + + elif filter == 'original': + #ax[nr].fill_between([eodf] * len(p[nr]), p[nr], color='lightgrey') + #ax[nr].fill_between([max(p[0])]*len(f[nr]),f[nr], color = 'lightgrey') + ax[ax_nr].plot(f[nr][f[nr] eodf / 2],np.zeros(len(f[nr][f[nr] > eodf / 2])), color=colors[0]) + #embed() + ax[ax_nr].fill_between( [eodf/2,eodf/2],[np.min(p),np.max(p)], color=fc,edgecolor=ec) + ax[ax_nr].plot( df[0],np.max(p[nr][int(abs(df[nr]) / stepsize) - 5:int(abs(df[nr]) / stepsize) + 5]) * scale, + color=color_df, marker='o',zorder = 2, linestyle='None', label='Df')#edgecolors = 'black' + ax[ax_nr].plot(df[nr] + eodf,0, color=color_stim, marker='o', + linestyle='None', + label='stimulus',zorder = 2)#,edgecolors = 'black' + ax[ax_nr].plot(eodf - 1,0, color=color_eod, + marker='o', linestyle='None', label='EODf',zorder = 2) #edgecolors = 'black', # = '+str(int(eodf))+' Hz') + + #ax[ax_nr].set_ylim([0, eodf * 1.5]) + #ax[ax_nr].set_xlim(ax[ax_nr].get_xlim()[::-1]) + return ax + +def plot_whole_ps(f,ax,grid, colors, eodf, stepsize, p, df, ax_nr = 0,nr = 0, filter = 'original', scale = 1, color_eod = 'orange',color_stim = 'red', color_df = 'green',fc = 'lightgrey', ec = 'grey',): + ax[ax_nr] = plt.subplot(grid[ax_nr]) + + if filter == 'whole': + #ax[nr].set_facecolor('lightgrey') + ax[ax_nr].plot(p[nr], f[nr], color=colors[0]) + ax[ax_nr].fill_between([np.min(p), np.max(p)], [f[0][-1],f[0][-1]], color=fc,edgecolor=ec) + ax[ax_nr].plot(np.max(p[nr][int(abs(df[nr]) / stepsize) - 5:int(abs(df[nr]) / stepsize) + 5]) * scale, df[0], + color=color_df, marker='o', linestyle='None', label='Df') + ax[ax_nr].plot(p[nr][int((df[nr] + eodf) / stepsize) + 1], df[nr] + eodf, color=color_stim, marker='o', + linestyle='None', + label='stimulus') + ax[ax_nr].plot(np.max(p[nr][int(eodf / stepsize) - 5:int(eodf / stepsize) + 5]) * scale, eodf - 1, color=color_eod, + marker='o', linestyle='None', label='EODf') # = '+str(int(eodf))+' Hz') + + elif filter == 'original': + #ax[nr].fill_between([eodf] * len(p[nr]), p[nr], color='lightgrey') + #ax[nr].fill_between([max(p[0])]*len(f[nr]),f[nr], color = 'lightgrey') + ax[ax_nr].plot(p[nr][f[nr] eodf / 2])), f[nr][f[nr] > eodf / 2], color=colors[0]) + #embed() + ax[ax_nr].fill_between([np.min(p),np.max(p)], [eodf/2,eodf/2], color=fc,edgecolor=ec) + ax[ax_nr].plot(np.max(p[nr][int(abs(df[nr]) / stepsize) - 5:int(abs(df[nr]) / stepsize) + 5]) * scale, df[0], + color=color_df, marker='o',zorder = 2, linestyle='None', label='Df')#edgecolors = 'black' + ax[ax_nr].plot(0, df[nr] + eodf, color=color_stim, marker='o', + linestyle='None', + label='stimulus',zorder = 2)#,edgecolors = 'black' + ax[ax_nr].plot(0, eodf - 1, color=color_eod, + marker='o', linestyle='None', label='EODf',zorder = 2) #edgecolors = 'black', # = '+str(int(eodf))+' Hz') + + ax[ax_nr].set_ylim([0, eodf * 1.5]) + ax[ax_nr].set_xlim(ax[ax_nr].get_xlim()[::-1]) + return ax + + +def plot_filter_trans(ax, ax_nr, f, p4,array_nr, colors, gauss3, eodf, stepsize, wide, df, fc = 'lightgrey', scale = 1, ec = 'grey',color_eod = 'orange',color_stim = 'red', color_df = 'green'): + ax[ax_nr].plot(f, p4[array_nr],color=colors[0]) + prev_height = np.max((p4[0][int(abs(df) / stepsize) - wide:int(abs(df) / stepsize) + wide]) * scale) + now_height = np.max((p4[array_nr][int(abs(df) / stepsize) - wide:int(abs(df) / stepsize) + wide]) *scale) + + ax[ax_nr].plot([np.abs(df), np.abs(df)],[prev_height, now_height+440], color = 'black') + ax[ax_nr].scatter( np.abs(df), now_height+440, marker = 'v', color='black', zorder = 2) + #embed() + + + ax[ax_nr].fill_between(f, max(p4[0]) * gauss3 ** 2, facecolor=fc, edgecolor=ec) + ax[ax_nr].plot( eodf, np.max(p4[array_nr][int(eodf / stepsize) - wide:int(eodf / stepsize) + wide]) * scale,color=color_eod, marker='o', + linestyle='None') + ax[ax_nr].plot( abs(df),np.max(p4[array_nr][int(abs(df) / stepsize) - wide:int(abs(df) / stepsize) + wide]) * scale, + color=color_df, marker='o', linestyle='None') + #ax[ax_nr].plot(df + eodf, + # np.max(df + eodf,p4[array_nr][int((df + eodf) / stepsize) - wide:int((df + eodf) / stepsize) + wide]) * scale, + # color=color_stim, marker='o', linestyle='None') + #ax[ax_nr].set_xlim(ax[ax_nr].get_xlim()[::-1]) + return ax + +def plot_filter(ax, ax_nr, f, p4,array_nr, colors, gauss3, eodf, stepsize, wide, df, fc = 'lightgrey', scale = 1, ec = 'grey',color_eod = 'orange',color_stim = 'red', color_df = 'green'): + ax[ax_nr].plot( p4[array_nr],f, color=colors[0]) + prev_height = np.max((p4[0][int(abs(df) / stepsize) - wide:int(abs(df) / stepsize) + wide]) * scale) + now_height = np.max((p4[array_nr][int(abs(df) / stepsize) - wide:int(abs(df) / stepsize) + wide]) *scale) + + #ax[ax_nr].plot([prev_height, now_height+440],[np.abs(df), np.abs(df)], color = 'black') + #ax[ax_nr].scatter( now_height+440, np.abs(df), marker = '>', color='black', zorder = 2) + #embed() + + + ax[ax_nr].fill_between(max(p4[0]) * gauss3 ** 2,f, facecolor=fc, edgecolor=ec) + ax[ax_nr].plot(np.max(p4[array_nr][int(eodf / stepsize) - wide:int(eodf / stepsize) + wide]) * scale, eodf, color=color_eod, marker='o', + linestyle='None') + ax[ax_nr].plot( np.max(p4[array_nr][int(abs(df) / stepsize) - wide:int(abs(df) / stepsize) + wide]) * scale,abs(df), + color=color_df, marker='o', linestyle='None') + ax[ax_nr].plot( + np.max(p4[array_nr][int((df + eodf) / stepsize) - wide:int((df + eodf) / stepsize) + wide]) * scale,df + eodf, + color=color_stim, marker='o', linestyle='None') + ax[ax_nr].set_xlim(ax[ax_nr].get_xlim()[::-1]) + return ax + + + +def plot_amp(ax, mean1, dev,name = 'amp',nr = 1): + np.unique(mean1['type']) + all_means = mean1[mean1['type'] == name +' mean'] + original = all_means[all_means['dev'] == 'original'] + #m005 = all_means[all_means['dev'] == '005'] + m05 = all_means[all_means['dev'] == '05'] + m2 = all_means[all_means['dev'] == '2'] + # fig, ax = plt.subplots(nrows=4, ncols = 3, sharex=True) + versions = [original, m05, m2] #m005, + for i in range(len(versions)): + keys = [k for k in versions[i]][2::] + try: + data = np.array(versions[i][keys])[0] + except: + break + axis = np.arange(0, len(data), 1) + axis_new = axis * 1 + similarity = [keys, data] + sim = np.argsort(similarity[0]) + # similarity[sim] + all_means = mean1[mean1['type'] == name+' std'] + std = all_means[all_means['dev'] == dev[i]] + std = np.array(std[keys])[0] + #ax[1, 1].set_ylabel('Modulation depth') + #ax[nr,i].set_title(dev[i] + ' ms') + all_means = mean1[mean1['type'] == name+' 95'] + std95 = all_means[all_means['dev'] == dev[i]] + std95 = np.array(std95[keys])[0] + all_means = mean1[mean1['type'] == name+' 05'] + std05 = all_means[all_means['dev'] == dev[i]] + std05 = np.array(std05[keys])[0] + ax[nr,i].fill_between(np.array(keys)[sim], list(std95[sim]), list(std05[sim]), + color='gainsboro') + ax[nr,i].fill_between(np.array(keys)[sim], list(data[sim] + std[sim]), list(data[sim] - std[sim]), + color='darkgrey') + + # ax[i].plot(data_tob.ff, data_tob.fe, color='grey', linestyle='--', label='AMf') + ax[nr,i].plot(np.array(keys)[sim], data[sim], color='black') + # ax[0].plot(data1.x, data1.freq20, color=colors[1], label='20 %') + #embed() + return ax + +def create_beat_corr(hz_range, eod_fr): + beat_corr = hz_range%eod_fr + beat_corr[beat_corr>eod_fr/2] = eod_fr[beat_corr>eod_fr/2] - beat_corr[beat_corr>eod_fr/2] + return beat_corr + +def plot_mean_cells_modul( grid,data = ['2019-10-21-aa-invivo-1'],line_col = 'black',lw = 0.5, sigma = ['original','05','2'],colors = ['#BA2D22', '#F47F17', '#AAB71B', '#3673A4', '#53379B'], wish_df = 150, color_eod = 'black',color_df = 'orange', size = 17, color_modul = ['steelblue']): + #mean1 = pd.read_pickle('mean.pkl') + data_all = pd.read_pickle('beat_results_smoothed.pkl') + d = data_all[data_all['dataset'] == data[0]] + + #embed() + + inch_factor = 2.54 + + plt.rcParams['font.size'] = 11 + plt.rcParams['axes.titlesize'] = 12 + plt.rcParams['axes.labelsize'] = 12 + plt.rcParams['lines.linewidth'] = 1.5 + plt.rcParams['lines.markersize'] = 8 + plt.rcParams['legend.loc'] = 'upper right' + plt.rcParams["legend.frameon"] = False + + x = np.arange(0, 2550, 50) + corr = create_beat_corr(x, np.array([500] * len(x))) + + #np.unique(mean1['type']) + #all_means = mean1[mean1['type'] == 'max mean'] + + #versions = [[]]*len(dev) + #for i in range(len(dev)): + version =[[]]*len(sigma) + version2 = [[]] * len(sigma) + dev = [[]] * len(sigma) + limits = [[]]*len(sigma) + minimum = [[]] * len(sigma) + y_max = [[]] * len(sigma) + y_min = [[]] * len(sigma) + ax ={} + + for i, e in enumerate(sigma): + y2 = d['result_amplitude_max_' + e] + y_max[i] = np.max(y2) + y_min[i] = np.min(y2) + for i,e in enumerate(sigma): + dev[i] = sigma[i] + plots = gridspec.GridSpecFromSubplotSpec( 1,1, + subplot_spec=grid[i], wspace=0.4, hspace=0.5) + d = data_all[data_all['dataset'] == data[0]] + x = d['delta_f'] / d['eodf'] + 1 + #embed() + data = ['2019-10-21-aa-invivo-1'] + #end = ['original', '005', '05', '2'] + y = d['result_frequency_' + e] + #embed() + y2 = d['result_amplitude_max_' + e] + #y_sum[i] = np.nanmax(y) + ff = d['delta_f'] / d['eodf'] + 1 + fe = d['beat_corr'] + ax[0] = plt.subplot(plots[0]) + eod = d['eodf'].iloc[0] + + if np.max(y) 0.05) & (spikes < 0.95)] + #for j, cut in enumerate(cut_vec): + # # print(j) + # spike_times = dfs310.iloc[i]['spike_times'] + # spikes = spike_times - spike_times[0] + # spikes_cut = spikes[(spikes > cut) & (spikes < cut_vec[j + 1])] + # if cut == cut_vec[-2]: + # #counter_cut += 1 + # break + # if len(spikes_cut) < 10: + # #counter_spikes += 1 + # break + # spikes_mat = np.zeros(int(trial_cut * sampling_rate) + 1) + # spikes_idx = np.round((spikes_cut - trial_cut * j) * sampling_rate) + # for spike in spikes_idx: + # spikes_mat[int(spike)] = 1# + # + # #spikes_mat = np.zeros(int(spikes[-1]* sampling_rate + 5)) + # #spikes_idx = np.round((spikes) * sampling_rate) + # #for spike in spikes_idx: + # # spikes_mat[int(spike)] = 1 + # spikes_mat = spikes_mat * sampling_rate + # if type(window) != str: + # spikes_mat = gaussian_filter(spikes_mat, sigma=window) + # # smoothened_spikes_mat05 = gaussian_filter(spikes_mat, sigma=window05) * sampling_rate + # # smoothened_spikes_mat2 = gaussian_filter(spikes_mat, sigma=window2) * sampling_rate + # else: + # smoothened = spikes_mat * 1 + # nfft = 4096 + # p, f = ml.psd(spikes_mat - np.mean(spikes_mat), Fs=sampling_rate, NFFT=nfft, noverlap=nfft / 2) + # pp.append(p) + spike_times = dfs310.iloc[i]['spike_times'] + if len(spike_times) < 3: + counter_spikes += 1 + break + + spikes = spike_times - spike_times[0] + spikes_cut = spikes[(spikes > 0.05) & (spikes < 0.95)] + if len(spikes_cut) < 3: + counter_cut += 1 + break + spikes_mat = np.zeros(int(spikes[-1] * sampling_rate + 5)) + spikes_idx = np.round((spikes) * sampling_rate) + for spike in spikes_idx: + spikes_mat[int(spike)] = 1 + spikes_mat = spikes_mat * sampling_rate + if type(window) != str: + spikes_mat = gaussian_filter(spikes_mat, sigma=window) + # smoothened_spikes_mat05 = gaussian_filter(spikes_mat, sigma=window05) * sampling_rate + # smoothened_spikes_mat2 = gaussian_filter(spikes_mat, sigma=window2) * sampling_rate + else: + spikes_mat = spikes_mat*1 + nfft = 4096 + p, f = ml.psd(spikes_mat - np.mean(spikes_mat), Fs=sampling_rate, NFFT=nfft, noverlap=nfft / 2) + ppp.append(p) + #spike_times = data_cell.iloc[i]['spike_times']# + + #if len(spike_times) < 3: + # counter_spikes += 1 + # break + + #spikes = spike_times - spike_times[0] + + # cut trial into snippets of 100 ms + #cut_vec = np.arange(0, duration, trial_cut) + #spikes_cut = spikes[(spikes > 0.05) & (spikes < 0.95)] + + #if len(spikes_cut) < 3: + # counter_cut += 1 + # break + #spikes_new = spikes_cut - spikes_cut[0] + + #spikes_mat = np.zeros(int(spikes_new[-1] * sampling_rate) + 2) + # spikes_mat = np.zeros(int(trial_cut * sampling_rate) + 1) + #spikes_idx = np.round((spikes_new) * sampling_rate) + #for spike in spikes_idx: + # spikes_mat[int(spike)] = 1 + #spikes_mat = spikes_mat * sampling_rate + + #nfft = 4096 + #p, f = ml.psd(smoothened - np.mean(smoothened), Fs=sampling_rate, NFFT=nfft, noverlap=nfft / 2) + #ppp.append(p) + #p_mean = np.mean(pp,axis = 0) + p_mean2 = np.mean(ppp, axis=0) + #ref = (np.max(p_mean2)) + # + db = 10 * np.log10(p_mean2 / np.max(p_mean2)) + #ref = (np.max(p_mean2)) + #db2 = 10 * np.log10(p_mean2 / ref) + #embed() + return df_here,p_mean2,f,db + + + +def plot_example_ps(grid,colors = ['brown'],line_col = 'black',input = ['2019-10-21-aa-invivo-1'],sigma = [0.00005,0.00025,0.0005, 0.002],wish_df = 150, color_eod = 'orange',color_stim = 'red', color_df = 'green'): + sampling_rate = 40000 + #colors = ['#BA2D22', '#F47F17', '#AAB71B', '#3673A4', '#53379B'] + + + plt.rcParams['lines.linewidth'] = 1.5 + plt.rcParams['lines.markersize'] = 6 + #data = pd.read_pickle('../pictures_highbeats/data_beat.pkl') + #iter = np.unique(data['dataset']) + iter = ['2019-05-07-by-invivo-1'] + iter = ['2019-09-23-ad-invivo-1'] + iter = input + for cell in iter: + data = pd.read_pickle('data_beat.pkl') + beat_results = pd.read_pickle('beat_results_smoothed.pkl') + #embed() + eodf = int(beat_results[beat_results['dataset'] == cell]['eodf'].iloc[0]) + df = [[]] * (len(sigma) + 1) + p = [[]] * (len(sigma) + 1) + f = [[]] * (len(sigma) + 1) + db = [[]] * (len(sigma) + 1) + sigmaf = [[]] * (len(sigma) + 1) + gauss = [[]] * (len(sigma) + 1) + + df[0], p[0], f[0], db[0] = ps_df(data, d=cell, wish_df= wish_df, window='no', sampling_rate=sampling_rate) + for i in range(len(sigma)): + df[1+i], p[1+i], f[1+i], db[1+i] = ps_df(data, d=cell, wish_df= wish_df, window = sigma[i]*sampling_rate,sampling_rate = sampling_rate) + sigmaf[i + 1] = 1 / (2 * np.pi * sigma[i]) + gauss[i + 1] = np.exp(-(f[1+i] ** 2 / (2 * sigmaf[i + 1] ** 2))) + db = 'no' + stepsize = f[0][1] - f[0][0] + if db == 'db': + p = db + + + # fig.suptitle(d, labelpad = 25) + #print(d) + ax = {} + fc = 'lightgrey' + ec = 'grey' + #fc = 'moccasin' + #ec = 'wheat' + scale = 1 + ax = plot_whole_ps(f, ax, grid, colors, eodf, stepsize, p, df, scale = scale, ax_nr = 0,nr=0, filter='whole' ,color_eod = color_eod,color_stim = color_stim , color_df = color_df,fc = fc, ec = ec) + ax[0].legend( loc=(0,1), + ncol=3, mode="expand", borderaxespad=0.)#bbox_to_anchor=(0.4, 1, 0.6, .1), + + ax[0] = remove_tick_marks(ax[0]) + ax = plot_whole_ps(f,ax,grid, colors, eodf, stepsize, p, df,scale = scale, ax_nr = 1,nr = 0, filter = 'original',color_eod = color_eod,color_stim = color_stim , color_df = color_df,fc = fc, ec = ec) + ax[1] = remove_tick_marks(ax[1]) + #ax[0].set_ylim([0, 2000]) + + wide = 2 + #embed() + for i in range(len(sigma)): + ax[i+2] = plt.subplot(grid[i+2]) + plot_filter(ax, i+2, f[1+i], p,i+1, colors, gauss[1+i], eodf, stepsize, wide, df[1+i],scale = scale,color_eod = color_eod,color_stim = color_stim , color_df = color_df,fc = fc, ec = ec) + ax[i+2].set_ylim([0, eodf*1.5]) + ax[2] = remove_tick_marks(ax[2]) + #embed() + #if db == 'db': + # ax[0].set_ylim([np.min([p]),0])#p[0][,p[1][0:2000],p[2][0:2000],p[3][0:2000] + #else: + # ax[0].set_ylim([ 0,np.max([p])]) + ax[int(len(df))-1].set_ylabel('frequency [Hz]') + # ax[1].set_ylabel(r'power [Hz$^2$/Hz]') + #ax[0].ticklabel_format(axis='y', style='sci', scilimits=[0, 0]) + + + #print(df[3]) + for i in range(len(df)+1): + ax[i].spines['right'].set_visible(False) + ax[i].spines['top'].set_visible(False) + cols = grid.ncols + rows = grid.nrows + ax[int(len(df))].set_xlabel(' power spectral density [Hz²/Hz]') + #ax[2].set_ylabel('Hz²/Hz') + #ax[3].set_ylabel('Hz²/Hz') + #ax[0].set_ylabel('Hz²/Hz') + for i in range(1,len(df)+1): + ax[i].axhline(y = eodf/2, color = line_col, linestyle = 'dashed') + plt.tight_layout() + #embed() + #fig.label_axes() + +def plot_whole_ps(f,ax,grid, colors, eodf, stepsize, p, df, ax_nr = 0,nr = 0, filter = 'original', scale = 1, color_eod = 'orange',color_stim = 'red', color_df = 'green',fc = 'lightgrey', ec = 'grey',): + ax[ax_nr] = plt.subplot(grid[ax_nr]) + + if filter == 'whole': + #ax[nr].set_facecolor('lightgrey') + ax[ax_nr].plot(p[nr], f[nr], color=colors[0]) + ax[ax_nr].fill_between([np.min(p), np.max(p)], [f[0][-1],f[0][-1]], color=fc,edgecolor=ec) + ax[ax_nr].plot(np.max(p[nr][int(abs(df[nr]) / stepsize) - 5:int(abs(df[nr]) / stepsize) + 5]) * scale, df[0], + color=color_df, marker='o', linestyle='None', label='Df') + ax[ax_nr].plot(p[nr][int((df[nr] + eodf) / stepsize) + 1], df[nr] + eodf, color=color_stim, marker='o', + linestyle='None', + label='stimulus') + ax[ax_nr].plot(np.max(p[nr][int(eodf / stepsize) - 5:int(eodf / stepsize) + 5]) * scale, eodf - 1, color=color_eod, + marker='o', linestyle='None', label='EODf') # = '+str(int(eodf))+' Hz') + + elif filter == 'original': + #ax[nr].fill_between([eodf] * len(p[nr]), p[nr], color='lightgrey') + #ax[nr].fill_between([max(p[0])]*len(f[nr]),f[nr], color = 'lightgrey') + ax[ax_nr].plot(p[nr][f[nr] eodf / 2])), f[nr][f[nr] > eodf / 2], color=colors[0]) + #embed() + ax[ax_nr].fill_between([np.min(p),np.max(p)], [eodf/2,eodf/2], color=fc,edgecolor=ec) + ax[ax_nr].plot(np.max(p[nr][int(abs(df[nr]) / stepsize) - 5:int(abs(df[nr]) / stepsize) + 5]) * scale, df[0], + color=color_df, marker='o',zorder = 2, linestyle='None', label='Df')#edgecolors = 'black' + ax[ax_nr].plot(0, df[nr] + eodf, color=color_stim, marker='o', + linestyle='None', + label='stimulus',zorder = 2)#,edgecolors = 'black' + ax[ax_nr].plot(0, eodf - 1, color=color_eod, + marker='o', linestyle='None', label='EODf',zorder = 2) #edgecolors = 'black', # = '+str(int(eodf))+' Hz') + + #plt.plot([np.min(p),np.max(p)],[eodf,eodf], color = 'red') + #embed() + #ax[nr].plot([0]*5) + #ax[nr].plot([1000]*5) + # ax[0].fill_between( [max(p[0])]*len(f[1]),f[0], facecolor='lightgrey', edgecolor='grey') + + + ax[ax_nr].set_ylim([0, eodf * 1.5]) + ax[ax_nr].set_xlim(ax[ax_nr].get_xlim()[::-1]) + return ax + +def plot_filter(ax, ax_nr, f, p4,array_nr, colors, gauss3, eodf, stepsize, wide, df, fc = 'lightgrey', scale = 1, ec = 'grey',color_eod = 'orange',color_stim = 'red', color_df = 'green'): + ax[ax_nr].plot( p4[array_nr],f, color=colors[0]) + prev_height = np.max((p4[0][int(abs(df) / stepsize) - wide:int(abs(df) / stepsize) + wide]) * scale) + now_height = np.max((p4[array_nr][int(abs(df) / stepsize) - wide:int(abs(df) / stepsize) + wide]) *scale) + + #ax[ax_nr].plot([prev_height, now_height+440],[np.abs(df), np.abs(df)], color = 'black') + #ax[ax_nr].scatter( now_height+440, np.abs(df), marker = '>', color='black', zorder = 2) + #embed() + + + ax[ax_nr].fill_between(max(p4[0]) * gauss3 ** 2,f, facecolor=fc, edgecolor=ec) + ax[ax_nr].plot(np.max(p4[array_nr][int(eodf / stepsize) - wide:int(eodf / stepsize) + wide]) * scale, eodf, color=color_eod, marker='o', + linestyle='None') + ax[ax_nr].plot( np.max(p4[array_nr][int(abs(df) / stepsize) - wide:int(abs(df) / stepsize) + wide]) * scale,abs(df), + color=color_df, marker='o', linestyle='None') + ax[ax_nr].plot( + np.max(p4[array_nr][int((df + eodf) / stepsize) - wide:int((df + eodf) / stepsize) + wide]) * scale,df + eodf, + color=color_stim, marker='o', linestyle='None') + ax[ax_nr].set_xlim(ax[ax_nr].get_xlim()[::-1]) + return ax + + + +def plot_amp(ax, mean1, dev,name = 'amp',nr = 1): + np.unique(mean1['type']) + all_means = mean1[mean1['type'] == name +' mean'] + original = all_means[all_means['dev'] == 'original'] + #m005 = all_means[all_means['dev'] == '005'] + m05 = all_means[all_means['dev'] == '05'] + m2 = all_means[all_means['dev'] == '2'] + # fig, ax = plt.subplots(nrows=4, ncols = 3, sharex=True) + versions = [original, m05, m2] #m005, + for i in range(len(versions)): + keys = [k for k in versions[i]][2::] + try: + data = np.array(versions[i][keys])[0] + except: + break + axis = np.arange(0, len(data), 1) + axis_new = axis * 1 + similarity = [keys, data] + sim = np.argsort(similarity[0]) + # similarity[sim] + all_means = mean1[mean1['type'] == name+' std'] + std = all_means[all_means['dev'] == dev[i]] + std = np.array(std[keys])[0] + #ax[1, 1].set_ylabel('Modulation depth') + #ax[nr,i].set_title(dev[i] + ' ms') + all_means = mean1[mean1['type'] == name+' 95'] + std95 = all_means[all_means['dev'] == dev[i]] + std95 = np.array(std95[keys])[0] + all_means = mean1[mean1['type'] == name+' 05'] + std05 = all_means[all_means['dev'] == dev[i]] + std05 = np.array(std05[keys])[0] + ax[nr,i].fill_between(np.array(keys)[sim], list(std95[sim]), list(std05[sim]), + color='gainsboro') + ax[nr,i].fill_between(np.array(keys)[sim], list(data[sim] + std[sim]), list(data[sim] - std[sim]), + color='darkgrey') + + # ax[i].plot(data_tob.ff, data_tob.fe, color='grey', linestyle='--', label='AMf') + ax[nr,i].plot(np.array(keys)[sim], data[sim], color='black') + # ax[0].plot(data1.x, data1.freq20, color=colors[1], label='20 %') + #embed() + return ax + +def create_beat_corr(hz_range, eod_fr): + beat_corr = hz_range%eod_fr + beat_corr[beat_corr>eod_fr/2] = eod_fr[beat_corr>eod_fr/2] - beat_corr[beat_corr>eod_fr/2] + return beat_corr + + +def plot_mean_cells( grid,data = ['2019-10-21-aa-invivo-1'],line_col = 'black',lw = 0.5, sigma = ['original','05','2'],colors = ['#BA2D22', '#F47F17', '#AAB71B', '#3673A4', '#53379B'], wish_df = 150, color_eod = 'black',color_df = 'orange', size = 17, color_modul = ['steelblue']): + #mean1 = pd.read_pickle('mean.pkl') + data_all = pd.read_pickle('beat_results_smoothed.pkl') + d = data_all[data_all['dataset'] == data[0]] + + #embed() + + inch_factor = 2.54 + + half_page_width = 7.9 / inch_factor + intermediate_width = 12 / inch_factor + whole_page_width = 16 * 2 / inch_factor + + small_length = 6 / inch_factor + intermediate_length = 12 * 1.5 / inch_factor + max_length = 25 / inch_factor + whole_page_width = 6.7 + intermediate_length = 3.7 + + #plt.rcParams['figure.figsize'] = (whole_page_width, intermediate_length) + plt.rcParams['font.size'] = 11 + plt.rcParams['axes.titlesize'] = 12 + plt.rcParams['axes.labelsize'] = 12 + plt.rcParams['lines.linewidth'] = 1.5 + plt.rcParams['lines.markersize'] = 8 + plt.rcParams['legend.loc'] = 'upper right' + plt.rcParams["legend.frameon"] = False + + # load data for plot + + # data1 = pd.read_csv('ma_allcells_unsmoothed.csv') + # data2 = pd.read_csv('ma_allcells_05.csv') + # data3 = pd.read_csv('ma_allcells_2.csv') + # data_tob = pd.read_csv('ma_toblerone.csv') + + # smothed = df_beat[df_beat['dev'] == 'original'] + # data1 = smothed[smothed['type'] == 'amp'] + + x = np.arange(0, 2550, 50) + corr = create_beat_corr(x, np.array([500] * len(x))) + + #np.unique(mean1['type']) + #all_means = mean1[mean1['type'] == 'max mean'] + + #versions = [[]]*len(dev) + #for i in range(len(dev)): + version =[[]]*len(sigma) + version2 = [[]] * len(sigma) + dev = [[]] * len(sigma) + limits = [[]]*len(sigma) + minimum = [[]] * len(sigma) + y_max = [[]] * len(sigma) + y_min = [[]] * len(sigma) + ax ={} + + for i, e in enumerate(sigma): + y2 = d['result_amplitude_max_' + e] + y_max[i] = np.max(y2) + y_min[i] = np.min(y2) + for i,e in enumerate(sigma): + dev[i] = sigma[i] + plots = gridspec.GridSpecFromSubplotSpec( 1,1, + subplot_spec=grid[i], wspace=0.4, hspace=0.5) + d = data_all[data_all['dataset'] == data[0]] + x = d['delta_f'] / d['eodf'] + 1 + #embed() + data = ['2019-10-21-aa-invivo-1'] + #end = ['original', '005', '05', '2'] + y = d['result_frequency_' + e] + #embed() + y2 = d['result_amplitude_max_' + e] + #y_sum[i] = np.nanmax(y) + ff = d['delta_f'] / d['eodf'] + 1 + fe = d['beat_corr'] + #fig.suptitle(set) + ax[0] = plt.subplot(plots[0]) + if e != sigma[-1]: + ax[0] = remove_tick_marks(ax[0]) + if e != 'whole': + ax[0].plot(ff, fe, color='grey', zorder = 1, linestyle='--', linewidth = lw) + ax[0].axhline(y=eod / 2, color=line_col, linestyle='dashed') + ax[0].plot(x, y, color=colors[0], zorder = 2,linewidth = lw) + #embed() + eod = d['eodf'].iloc[0] + + if np.max(y)%Ve|x7Or;|I7ZrCHLPfkN^Ik|N7VefAOz>`w#LL{vRRw z_kaB>Z?_iK_E(JcR$Gu?!X>2bmeN+XaQyTCa{TkM)Z5xedHntT_xAz*`(MoV&Z2F% zB7d|k>sISu@;|rd&*ESI_y7La|Mb^?`|IESLlo)$wcKinTMnVFMW!8O+Tk$m;m7|z z{`Nop>%WVtxwoyao>a?i-BMe^Dk8}rFhRVf zrNj{0x@46=IHcP0)>^992xN#FQxWy1)#6Y?j?0#oXmLobw%FDCAtA#}WK2OM4aUz~ zsbv!jSBpS?mP={kODaLSt+A|C=9rQtqi3rvr)3Q_XI+MJf6MFAHW?vWny#_R99Lms zaM;8U;&LgPifnNWL1Z*#ShCC`x279YIE0edOyhwf#kgXyOcO&j6OclpISB zEZtTIQ(TRjf9|h&6`wWr^xCJ>t+ZteoxrqJT-PGWBU?j=u}jFJ1>IlrZ3#7{?$f5G zUpthf`WRB~$=!^ryw#E@ef-CN{l~w)t7s(AcKr#BvXomB>uo8E34f#xp!+OIZ8>TV z2`HA4fUE}uMbds7(uGA(tRcurEg>(DKu$amgyj~Oe^R!d`^_=Ls&@iwj8Yf*)eFqU zS-3x6vILoE$ut$^yvrQSIlNY+1VolDp-S3xy}^{h^~hg)!|u}NEL}bAVP)Eis>@tp ziXv+hU5g}^kiJ9i1lOnedw+2`c=U0Jd?Ku<|+ zi}6S5=+z%2Al)MYTGtw(S_G7s2ZHssq#$)(D1yO(9S8};Iqplic6pZMVMsvLV<3=4 zo>(ER$1*&rNPm_dfom#n4q0+`vk6Yjff}w^e}dEQW~%wImTo$M7^)U&(2t94l##0V zEWz*Ht%g;SNQy<*!(m6jG8H#<)+|g@{5CcC4*S|6B{e)G2$r6H?{L15Zfc;u5k0PF zw_#7gQlx1s&zNsWaIe$!Ve3SXn{tyh-b+)jg&)h~-Yk4;Qm23}x3!v=5Z2@kVH!*P ze>L^(K$F9-lb~*^FKkw14d42PU6E!b-qMz(zNFOBkJQP~%hPyBkXwpXtQQReZm0)> zEDG8B=FFjAp5vfJ8WK>20s{F-tbKp4sRT(XR4fv0FNQ$>uzqebpgjZ7QxtpVD1l;e z;7~OPTvJ(U;>HqXjGGK0>v7Xvs7}9Ie~(>8JAjWFk?c?nX?40u_>vdEsI!N5}nP#b7?Lev$hmx6Cq`xYN~+>;B-*X$0*F9 zYn36yFHH`v9y}SIpVUlSNR3{GDm@!Ez8+rZpMz7ILdGqocKCiVErJ{So~CO{f6|wl zK706%<2tn&R~Hlc_jM~t+-dn~+{z+ymsV?+J^x6ZoqRI&bM4bLG9c?C0cjqGD4Q6+ z>(Jo99*6{#PEZEwBtV9eL=i(;otwp(X)dWpS}dlJt|mPKiQ?9GM>d@x_D*+gVacmC z&1dg=@#n6hv;24)b_AvsO$%AHf2DX*97@CchuC6RhECz_wsbTpwv?2fdh)p}gA-R$ z8n#u0IBa}OE0U5b21UrZ^%8126g9V2>{|qUNWcmTYnr?Vg#^@^PUoLR7E^ti*L`;1 zrPB3q2#f2P+zSgg#rcW)^$?Qc7HOf&v84iQwvtL}qN(3k6Vs!p@4KAje=H%n#m?W@ zjr4+$!(A6e#A*^tDX+D+|36X}Z{9$_r)dh9H_Hga*KHhvc5BOMoTcP#?Y(3%IIxo< z0eKJ(Asd}>rXpa$xNTJm}OI-#nSkap6B68Zs2B#CVI;E z&(=Z2D&nKDl^kMxT*$0m#;TyXweM^7SXK$NZ+XZeR;jYbBkL#wxyL{dBq7xhhs6nS z;Jr>9g3Jp;v>;it7dUI0^dTQ+nPn|o*JIK|2DD*|ilpUm)dO|0X6bM^GfPTXI89l; zGhrrd?RztskQnv z&4J1fa-iZctp`_zZq3rqEL@erp9MAPvsuvP@CHp%?>L*weHo}VL>V5Nqt&zp_1MUP zR+iHhi54Ss^+f9ikOOs}h8|XngP)44$k1MRl#_~2e>jY!z_|94K33@Qu3-Jno~D0` zy`vq7R7rGOORi;Y^+)LDxnKj;NAa)qxYR@r*iAMs3V=b~Z)ocr4mGY?BK&$1>_0dQ ziUOPkeWbQ#p%Z8>3NlEq5JNTzPRt?{nM6GX8p=Si46|UQ43vSsz0PS;E5s-yB|S9v zj%;8$e+-pT6p~<1(A>1MfQniqsdfT=h!eBen#9D=MWd>5od=VMwJ-avsL&4Wq07oT zcpXySRP4(XQg??J4(rT-S3@WORj*lpb)(Lep(p(5kz(H96@1{Imhy8Ud+8!}K+ht43g?CuaPe?9QR6lbw-W0`tz)0Y&&*0Z$9fxg7d zWd?0KZ`#~$`l8j4m18XqS402%x*b_#r$<@MTThxX=CFj^ex%+ECw<1jX1IA#2{boH z4pkb-o(`hLf!6fMAxR1B4UtZuS#R@F4shUerof?pZd?aYlnvaRwhe$lY!Le-7hO@x zelPrM+NKs<@maoMIW9 zw;hmxR?|p8-)TVxE+4b*(6W?|4hNzOsg+T~9kR&*8=`4{+P%TF<(?cYTl(oG#1NA; zNo}D!D*`tYn4f4xH|GtmKmBPv4FYY8e;M6{%J8haJTsU+3vIDv$#6aYtWA9WxUYd6 zXdN<}J@})B<#DFV(G~zYOyA58mQNr2#Y``{zkFLivq+~NO6l!m?`M`~i&OjD?^q6>*Rs7%xScnw7f7HTJ zc#Sb_6D~wF2m=j$U=W5f!$GJUrcqW|Shl`AHb-GlC2JJJvRX1H_hAUW>ABEu1r0(A zR2qaz<459=@+pM^RbUE*w$=P|?B6o&12uOw^})>wNlLq5ABhE5>x=+w27^5pT9(l$ z9SybLTrrZ^sbKKuvVRP*Lym#Yf98WBr2EO)V9$l{*yi1Iulr^|QQ;?T&?=DzAuQet zv9Ol~-%D-(d1UOxES*Qt(#47#*g1I6FNdg6x?LYn@!dpr4G%G4-JZw#Z8e5 zQ=!#9QE;>DV*}4xoL23M4EMDTl_0C1~e?%Ti>UEJxi3hzb zLp*rj4|x<>Se0SR1yNdQ&mVb6Qb5;#{X+t$rLTubp(q$A zQpu8?<1zhukeSG0f2kt&aG#9CV6V0W%_aqJ5(9;jTTx-0kETbFLL${_$P_My=)A_1 zd^D}GRM#Bh@uQ22Y)gU`DXhcQ_fMEsmR=H`Lx7^BybwT1b3cGReEpeMDK}N~#^>Ex zlys9OA-{;H6M}Lb0gBk40~w%EO+n3QaRohLd)}ExLASQFfBr$;piuY1EH5=}eLRE zp-Nk>WjP)$`Dfxu>6cN`v~6uW-XENILO(_M#%Jhxl5~;E(T*pS&r14zJyokc$=%n6 zve4|{9Fo9ee=d7ZmB)!~r9)0EhYJHpp%ibRP`&{Jg|dW09vtOB5oLjwJF0v(d2r*4 zJlI))Liu6|6tX&(L?Kf#DAZDujUYDV-~*^77}^zqGn#FbY^%~ zr{T6Pi#UMj)Ewn`-ofN?!V5VuPJ5w}evyYLWZPcpe?$372^49Qs7psYdeRsjyT72Z z{q14j$4reWr|stBwn)#s4X0gDW4ty*jqP2xnWgwrA@@p4>h__4lcX%cHwXDI0}EQ z01D;Y?yLhT%Ob-p*);9*FpQxN?P@(a&>GXae;x0;nGR&mMcE@jNx7Dx;kXOI$fv8D zBq<-5K}q?f%Cw6q`z~lX?zt=%GiIw@GbGFHhX8CJb3{N_{Ovcy(9G9fI1QSdqy@WG^qCrW-$W$%leG6^o`8A{p9T2M@+Jil*Xez(Eh^; zf4;)I(LkZBXn;cbhzk_Y6<#zcxC*#9oEJu6hg;oj1K5aLKS$Qj&D*1J>{xOb6dH;o z@=#h49EEogTo^|hg_i=8qiFEiGzvEwI0}a-jzZw}GzuM=#X-1X#z7t_zSx8K3iC(t zr?QW7Sz)pSk${WakQafXixAf1^AaQnf44Iz2d@KhwgljQL8orWDMb+|lI#2AN95de9}81TqLx&DK4u+ySGxDlD3EmsMo;MNUoOHcoj zq`Y*p{M4Qc=hpeza?6CaarbS+vn$U z!cYC#`Z>t=Q+g8p6MlLkLhQ|CToYX9ee^?)i<9|X@Umt%DkMsJlt^WqwzC-K(KeF84 zL-9@@`-ioDViYdE-)fiBIoY0z(t3SBA16j}ee6X3@FjhNC%;9GcUF(@f6pK9@Y8qn z4wvQlwl;FP^;B@?5yBaH zD5s>5f_K=Ff>)gLv-K%>Jqfc-X<63+sFx(A4db^@Rz)Op@mozfY?bnHf1r5oup6_@ zvfxayt;5w;l!Lw$Aps|fe`$&nw&yQJNWn)iV6veVVR1Z*j)L+hocWM^2Za;XrzTr- zhbTUNMYb$!D&32P;b@l#gdtNDc%qLIV2AN^(-c zBW2J>4W!^JVb{el)x}>MNDMk0Nn#N81<65Wgv>?>4Jin(mc*cM&Ljq9?^!Xl$IH#h z+M`gm!hqysdNc}Uf6b9X!@fcaMoztue*D?e3Xf(>M|{lLnuAcuq(RnIs@<`*n;*oV z2_4^=x7+i6wn@QIau?*FPWQrWrA3YF5nz12IGspQ^jYmf-Jm7z*}Cy%9YpE39c6LZ zXVVY0_V1&u^wawFfteo>&5v%LBZZQVTqr)I;MfUzMk}Tie{2At=vTc`U)nc|;#m-* zISMCuM8KmPI_6vriYN)K-(DXQtBch~l5$2f&_t^_7o}Z7vvBIYWEb;?+@m0WTI$j~ z>GU1Vlgw@SR~t-0m5hl7p*#0v6*}sK4ytqyE*3I{65V*Y zU^uR1(+;Y%f3TB*ayVdSCyxCdi7Cek%dJ~k!X2>6vK%1@{X+reCl1=uBRS|c1<66j zw#Y8D!%21_BzhW!*9DN!L+G!qh(5sjU)CM;{e}Jj_K#iiy4~{qx_QU?`H>nx37-%u ze|#mnxddSg>BtiCpj+)op~N48&T$MQ4=&3V$Y-!9f0QEN0vi$!`ba@M2m^#Pwgs82 z$YRb#Y3q>3o=Z%vKP_i#o!=sTnM~GKQr!>l zJzmI?f824+$C__Ax*$S4xYkYcP%8Vp;pmRzq~WwrPiR^xv>~)3fZSZH@y6zSW%F%j z1j?877G>#kDfcz&CcQ6CXK5Sx!4e@!Jx2|jdQW4_jvoh#G_Zw=xo1a?3a zTn$kUZayq%Vc&yn%e_Mmf=V;BZtH^!6~;a%y?H-%W1sJBQbh3w4iA&{LXzTbA)t7o z&lzGUuY;4E{BdjEk6l5PtpgW4mL%my$Ax6QkoV~{5alR(AC)8(P22^wW5L&{FX=mS ze-wcvBE_>2F}1ENvgUJ?k&(ZxRq63k(jyZ}b0Gb>m_f?#`gr^$x_EaVq2Q9|qG4X( z@eVoI(9=AWh6hke`B8G@p*SsKp%OSe@!-8B;GwiLh*3*r0$C8QGO^&i=mL9Qa1YL{ z^QPqvU|tT+i_@c=(1$;Y9}F&!ylh)bf5SF4I9_~fn+aSzEwH*uAeM9uMms2%~~PpMWem?cqg{J9u_M8V$Ve*(qP zT=*+9!qM?&1n}Us6HXT2G`uiZ&S*%%+bYv@m`U#m7&#+)|<8=)GK|;72lOwvSH58bv)^ zGVi9pPRJTybNot7)_wx6zsT2T$$@w)`4dj~IQUsjiv6RSsgC`I z)#|&LL7`T6Lr{AV$J5VfR5=`io=$!Lyo2%gA&Z9**6NU5@54yb-I+uHuK zXIn$-r&6Vqk!>B$&!Zgsf8&8>BJ}2R%8^}-Dc@w#k?FPV3ts4_TmJHkJh-=;k0|b# zkO!^CEtQ%MbRuK>Nz5zxCs@z}Sn(?%Z2Nv%%l9wk<*!`ot-n^dY+G9QqdOI*&O1y1 zWSC+t+ptckdPY0!ssn!D6GYgcP~!qe;rtDwC~FOClhy~{npHdN@aN*{L#f>ma>`li`5Z-$f>ZY3 z$~>Jt{JHQ$NwcF!e?PSJtUnxto=!pUNFQ77w_IM74rK*9&%>9)chh&Ipm&7r8^Yx+ zJdE`5Z7tK%4~H#3h!fH>m0QV6TO_r`2ijX~kOv6n1}T)&y$#gInG<=iI{^hfM2>^R zr8mCAh9wTd=^1!DF))6?=!eRe;dh`q=w;SwyPwpzUyM> zRE-RrE${4E4pgp>l4OCn#9_<(A8{Z8g|bu{e6xIu1J&!2zGb#8$1-eoq5nK~!-8!V zu4m{!oWG}4s_g8cN>jUkbU9qN_-9ngn>)yZ8zP)7f90NcAU?r}v!&-P=51RR$=PG0 ziXOzR?4DKPR4C357a2+B8vIP($l`72!&a{+%eeZaD$ORW9G1!Qk8(bETYEtlS7mU(c?OSfg zYGpwwnsZS$Mp0wD5WrD5rA_Kodwh~c;a(Rhct1nYe^?kV-Og)_Qwfd|wrxG4@Xq?N z_M+njb#PyXN{`FhhIf50MBHAj%u(8!YaH<)EJ+PHru1QJ-5KSekIRy(n5w-033z4-6p;8i!|oP9HS&n zC;qpTe@ZtRlpUaxrSi*KqSD_-mS0_^QCgxqkVM#)So5PLN(k&o3ML9tA5w5dO90u~ zR~w}r7jdQ>)uk|baOy-kxM0yJxL1q>ydohnD7q42RJK;qafOd8p77+hoD@1lLH!?! zAroEhci~LSaw;JT>UVII67yDuPlWRx#>s|8f9X5t%Mm#I!dxi%(kK$iaYz&w;>n?q zQQESF;n3Brq}tXUQnc+SIT1qaVSk#AvJrG6j%ep(ErRk6faO$x5>An3A{bsf$UUKr&K3X>kUhT%iO z{3uG9KnmK4GBswKR_a+95Wt8B=K-YPfB2i!n6`IEw(ZwG%PSryB=y6^^|4T-I(NL1 z=8j^^ao)#FKYh0Lw#LdL$!n-JpU@arMbsEQwDgfQ=JI&9cZNO=K4xc!zsJY+cew1? z`ugxG{JGHgU((nbJNAc3@uvLYYAi0b)Ns6X@d=G7D;XCSoHW*QuJyRde8Gc!e+onE z-`4Rg9XLGvEJJc`qT#JnQR3qmQ5vuyi}XWM5!WMTZ;Gyokb+y0=sF})a6v-~F1;|9 zw$&8U(L%_At&9}xu}HywFe#{-1z;*2IjZC%%;&ruC(Po{g*O4F=iEKerre#m$Io~dR_HcbLOQ#ZF`^OvR z^43fUw*9tVCf`KF5`NY~(&Wj4qdR{GjCzQTV4)P`2z$!8*F|q83ic+8f5MbQ@uq=d zy_Hltp!ETUh5!r8Jn&Ck|Tsgeeef*T@>!kEf>e^#Wgi{nS9!hOj6WPR`OZJ+zM znd9B-3$}MX{Vm?%d%CL+<&!EJKjmD;?|<`_b2X-PJM;SBy_-o2vHsd>8g6IJ&sM4L z^VWYyG`RXu&KH0_It1m?e}+$U(_ZN7VNx^u6JO?2dZKk;UfE^Cb7mN$ZJB_N={h_ z1Ix{zhn`6+*qdCOSfXHmn;(U9$-Eps56(wGkvpi>a7_~_lzN4ue{hte@jJNwHU{9l z^&(_$zU551%IGkpUbt*J26vL`~$ zRVmkiFLjRd$>SHP;eXa00T!nSivsBFH&S#HiZEig+^gl za3MJ7C4Dv#$>iZ`>>ZNk(%Le9Mw*sGITit6p=*^|6_3vZj1;jalaTL^=Gsc-2t*g+ z6{`i`Y%7(Mngw|M3m(24d5ftISAj2>-*v+ij@m+K1HQ@ye@Erjw-x**g|bCBKU+T> z_~iZNplha|p3teEVthGV3S}iTZ87ZOr_Fh#`*Jv=wA)stf(*bo z^B$%Yt9i@0Uh1>(L&2x;N8$YLBFLlC_p9ccACso>e|@F2^Euy* zgEmrpTd$OEOFxFy!M)pGIc>M?{+vn@hk1zYA+#cavM_UjVy6dDn&yF`-1^%+ZHyZi ziev{3fEXVIW1*c4yt#T@RTBW{K&fCqV;PntrrGrnr_8->;Inf{mC#z|F zIc5_VT$i@Ja8h;U;lj&b;Nee}6CMIY^T&>XBH!faVp-9-ZF?tZms^Ut#O3%v#Jr^b zC?^7+cT=u=scn}%Q~FN$o0#Mt7X38dOF&zVf0#To%HNaqeK+M!2i&x_O$Iqaa!re& z>;}yHpzp`$W75o}9TzJ7!n>3cN%J1c>yDF|^xJx+zPs7Ko!+mN+xkC5`)V!Qg9ZT=5a!$gxBB#_g)a= ze;pd_5Y^+!@p+XJjLo#pl}rR0jS>lKUqjeDe3f#SVj=3!sThhP|w??`xPOx#Y)k zU%I55tnP9Ov2A<9BPs^bc zZ!@9 zOd$>5rlvM| z^PofVcX{ECwQb~51tEVr-jwF?6FJ{aE+;~PD>sHhPPOI%VRu>`)RIjaEy?0TT8D9) z6?p6ioBn|CTVe!zCfsn%C*xncf2agPZc9nW7pE?a;&ud<4}M=yR{QbGpB>Pg@~ws% zVy>w?Fr~7K*oze0duJDqcYYMkcr*&tyICGu2;(UHbhxRHVp8BLAp;KX5<6<}aZCQf zRD6ZeGgu~%YEn>?lfoWvkNwFM7hKF$*rUg=Rqi;cZ?;noMpc9;Fu&sm?M|LPq`ItW!FC_WF(hDy3_b7~3>K7`@YjwP-usCJIEwf8n`4=jB2Mj}+P~*z<#M>V-k*c|v5NxZ@;+n!Q~x*O5YX zX%}*uDA*rApmTQ+ewCI~%4KFw3>id}p6ig#rU&7(D;F<F_I5b-Y+@AkeV;Q|_jt z(`S;4h8=F`n1k3;aVTPcX1w3ZwLOqm?L@JIZyMTAlly$g(mu$1e=u>$osU>YP<7ex zfi&rao7%Ej>M*9Fwo23LP`VgYIz0mYi8Q&ty=*)B@6+V-$zwC@y(FmiV`vq64fP`h z(9e@}K`?(QBKj(hUVe^n>kZaCTa zRNaWRY{PN0`BKa+>U`PgN3sWO=?kUU%V2M*#D;TxS;r-Uh%%P;(_i+ED})^G(eZe7 zFDFpWQeqgMG{`Q*FY#anyAZ#~Ln$*JhBy*1NZCjcZeogD?l-_K9(;6##9&`Rb?l|x zpituzdF-Dse{6N|HW{jP|M+=TrCP>wv8;)LOBv3Udsr7$*>u753w`mP{;Uh~W2NYV z{nEwO7v-j)N~1ifbhW#5;joDZw`48|IjMAC`zcEZ9f-ktis>iH4d#oiq$)RN~S zFOL*KdU#of#^Wl|g(5}@l6;IF$&w_jlhGpiKB^M5^h9e!BHC(3|qDtFc;Ene6dF zrdfTcI}6kK_C$s`m$Sb&S$#KGHX^M%FD9NZeZ82a-OdqSl_ zx~2QhgzFwgOsnlSP$;{cR$ee;sYRK|fBLeD`W5gU#^3XTom+U(_mxoW9U(I;4~^w6 zPVL7_I>_Hc>=n$&oi!kK&8{t;q`$&3Z{W7(vOsaqWw`K6^0 zY~!mP^}I^GsP&7>iKsnqSv%rfe@{PA7+fBIlWCj${a~gSv*dqYM2RO>wq^9;W7v?B@LKR10 zkG($1^+A-49|N8D@=VmK3p~WEQe%cHgJN*SL>FAEEQ^K+M>#kL7!J0We-zJ}YD%iC zyl|Ag4w*Vts_uNSywi_=;l>?>str&RE@n54!hOHt$D1{XQc`h{y~D8mn0M;u{g@t= zBR_6i%{^L7h57O1@lboi>zUHf`oY6&Kjt0-N8ug=N8z1T7arVnF_S{s>2jYyxR8+d zWua;P63dqR9@OPg&Ug^_f6DVIiXIfXkfJUZ^zUn_N?6wA2azwweE*u(N)|0Y#BSr% zWksIDfS8$GpjhOgctUf{h&*^@jyyP*AOJKy>_M~bpYzIap~6M1MIQU3u!sK8g=VJN zQj0k`S#@EB6ztV5Vm2wP=B=&6ho29)#|h)R4&+g24{FeC!*=gde-EGATr_lYk1Q#z z^(Bbu9@OiiIyhm?8{b#h-{T%!c|S2*-lCkJE%#kk_ORW9zmpo-BmBZW+~ncg-cK*Q z0zrLobw_=bxGu#G7OnHgxpKoaKUv>7_`v_P`zW8}(DbV~ddD^}3z+gf*3ySrS|)$#9i{nTJoe~xeKx@0Momv#@ABwbg(dfw0Mw9@v|SeqMNK#}5-@9)YtokHE2 z2Odf(vhawb#Y576TI;aohIq1E5|IbHf(tZ_JeEzI<@gQ-sg$D}D3otd$b)wetx*h> zs;Tu8JUHuFbFq226uHU*ZM?>U;L7w`J2|14HMikY7dj#Be^#Uav{hp62zE|B$W7=x z5B@rYJoawKb}`;Xm^a+FxR{%x{E#~_+jq#}@<=(}FMS_wj=31%rX!odplmT(9%N=@ z<;34S5AH&d$0DN)&lp_rWIw_9{^8r!_n`9;Wy|5uQ_*2t`n4@dk6mv@}f2AI`0dOw7EsH#sA|5oL56#Cu zC+OKMC3&uNIFRG@airiE6-f?iz2>vSGmjY>(-vK%)7sxcK7Jo$PzUq}xATN4;+n z9xg@@5AHPPtxtm_|uSqS!f=;myn&6_z0M>(p4 z;}6xr`xQ6}ml_;}%N35oQI6{1Y=i2c!=m&0;B(|ip)7nXCp3-!7Jcx#7@d%gy<7-N z?uh1t()U8{0p^2}D?I9hD;kbMpYTW@e?{tdJYI&q;DxT%8Ia>bRJ!_5x+WZDO?6v` z)uG{qwodtQwV4XdQTV1AMdg~7mWDw%qz_)Fd_o_7Y4D@+Q5sAZ@2CvihoUy< zVDH&N`EA`yzbC)tM}Cnx-B$4w$v8Pap7||+HL8?6ph&H*%kiim6098-z`1_$t@I<&`4 zNgdoG;3%B(kb*yFqB?l%4&~rdgrjh>nUwUDKKyVwuMcw+rFEMQmlI*@NO}ktQ|rpM z?7Uq#fm`8X`nn%3kI9D1?(uhJe~%OD@WX{W*?C9av$~=5H>D3ZjrrMB>AC0Ahaa|v zBY$6?v5051dS4ynkZx^DIj>9GU%xF`pV(pJ3MqIW0V!C014R}dB2r&k7mJ7DEI0}~ z3-aIqG-i7+BT{hPoSdzMM#~#eM#xQZ=XYytakqhoAyV>N^wnq6x`YtSHVcZjVq4A z&Vm$d0;FJPF%W#KF&7Qi4o7)zd?$-S*>beB9sPT-V39wJK49vaR*!g@PP9#IYnCNe2%|w4}Z|I4Mp~RylbCh>`q4y*XKf zhwAl~I!qo)^i3O1+PW6UQUpAnmqnT>sb>~{vL_73RTU}t>mE#2+3cG4QeG0zOX^0g zXE<5#)?C8?um1_N_=5U|bA51WO*+(9f^yG=6kK*cF%{pkf4t>}ljUZ4ezxb6#~ZSK zFj9kL{hV`qsSjndbUvPT%lZ1aT)}M1eOn8$be)Q~-&?A@wA;EL&e(eh14r?o9H3A> zIw1wS6Hq8i8W&n{UJfOQD}IAb9+eCWn5}a@&@itK&NVKG z@4OtIAFDeA7QVMh;d{E$$RfZlf0lE>PcLZQ)kjxnSci{Y2*JB75>i6;i(v5l^i7fP z6>+UueROwk@Rl${?7df4n0H`oZQ0y_-eit)LQ?L|T?|DUg*zRf z*pKBN9L_~qL>~Jc;b>AQc>w3aH^D5}WYhXel)E^LGzteX+LkjG>SMnVW6nicXBzrg zZAp2Je>klV<(8l2>*j13KAm{bl~)(Q_kycaEgA@-th(1V_c~&-SVBwjj!0$-%KZZh zy5CeW;z>>5R*o_?s+=O6Q-}6UnPoP6DsORPHxVjVNKhSo(R4bj`8kXEWO^da@#)}6 zN!9J6dAo3*F+W?sl=|t#O=A3RLit8OS`kEwf8f%7UWdy|5hJY92Bfg<-3&qo66}2e z@H*vYB?92F84-4n&4@hsuAvJ^OFa1IoC~f?`k>GM79OoV6<-~c7G2Omq)>{L3*?9t zImNW*;iEc&V=~|ns)G-);9R&C&3nh+q7NncqNH3kkq38>E|@Iw;5Gwi%PAg#mH9Xg ze_D_{=8}-3U ze9Uw7z!&)kWAg#Uv*-SefB4Cgdw&=7nDoKD?0g;M9Uv>ynHoEh>3$viXEL3#-gZIe z&Az~t<3ujh3*nb_RsDic&7uB$zQ{}Jf9U6ujfC#;xYCO7cVwd#(GkhtkOwb(kb?6f zQP9GNB&D?^O3Lq5BacNg{1T54+9U^cck`0+k_07fN%GZt?Cy|)j}ej_6n{iP{R~M; zQBFLlQ=QisU1i6~a`Q%p!_8z)!}t_ z(}T>YeT%Qt5jFC4def35rHz3LmUHLA3p7($-1*&>BG9nTIC1$~JiDLH)S z4ey#&Nh9;lQG7{#Io?6Rt<3yv&-3_=<-SE9=l$aye)>;)@;mhLe};7Y$=QBi zVU`ly9!F&JvUE_I2c-Q&Y!{G_C|G?1g}NR=*g85!h&+^Kq6^|jlCl{mDVDn(w{kdn zfh>4uou)#sc+gb1?i#q6*;J|G_h^=u(tYE`REN^!<6QRV^K3~8YjRdnHS6JAR!Jk` zVTT1R&V_ana4Ni#z^PFCf9Rr_Ua-pk?Z);n`szkg;r+$S9`>8LJm1YR?Y2pZTH5jT zrVD0y$6VaN-_o|VZD`sp3On-Yu}L$Dnb!aPT-3@tuXR7&`laI?lKQ?*Uqn8lQ#TsE z#gqBH1M=im*4o<j7(;4R5I-=$N9cuYG+?BR=-yLf;Ea`!of4?Gp9#sJ#;M0gB zh4$h%4Z_+39{d(J@!*xSi>r#GD7^}f!g&Bk;ng>eLhm!q>qGhegXq3=Yl0-@*g;7j z9|5enXbA77*3G#n&F-W=;9dneAbsGy;DFrKPdlK}#u^H*wrg<7G~kr0Jqo?yJFgF= z{ClXYWEN@s?vITbf0^T;Qrj$Hm1LP>F~x8b*om~@J1CupopVrp9eg(JsQc~6Bg7EX z3!|TiRPH`LksrBloD70LDk)dWr^tghYz!XBm&2e?mt4q$6DRWE z3S!O0u$-C)kOwcy=6P_|LmpIevzsW81vgX3gZIFI2fqtMJh*5g4|+dtHf&E(5CR^B zKHZk3kP{!he_y3C^`V^RLLStIAPZhHpm%U@InU!Ak?-?(N7VW}{HXOKpO>Y`gSVZH z$ZvMka_csqJ>1CWWfVr--k6!5&b{4y;Pb}-Dw%o5NEFJfwJYF7Hi|dbwU&`@`e*mWa22?s8Q%4?r6$0hRCI3i$ zSq`=90v^wo*`qlZ!j&aCxH6+oIoBW$?sleis(jP|IaWylThD00l!J2(>XbXk59m}$ zSU4A6N#b0%3k4p0#hvEDVUBYVbu9g1K-;$8qEp_?ML*?@pXr!WHl}edd}@5!*H6Tp zpT~HGfA2zDBM<&kk8Vn@y_s%mP^gEGQKi&D&Swwa(nF1Mw=)@WXXI$HE$x+qJ$Kkm zZ77W!YLvHsP@}w*wgS!$mUlR*uTnqoC5@(TI74Gv+x5?=)Qz_%x;jku%i6Be-L%HX zS}AS)iIV$e$s8UJHLNQrm>U3q;^n6cF7gI&2k-Y_42_-gb>A-BxX;VMJpl5c*FG-j!;f3uhyqmLZQaTehEGwz+uc*QlHl254g4Q5e#5u7deL|+QDoR%#-uE?Y<+|uK9%DQ(e71W0qHb~G) ze?_O?h1MzJEu_8$G*|!!;Zy=Va?7!doA1Cw`Mzq663tPh8g1+GRUjILmR~@i+;E3M zqO5yT7|t=GpzQX*gWtlP=W#-%-ei@ue+h#qY148r!zya@St_+Xj0-RDDAJ;C+W?V( z>fn5Zqwu#GR61`+e?aM+(B?f%)SU*zmJ30P4~ost)is;alj9(~p@t5|UrW)!Ht8^e zo#f7Fw5+kT7jrq|V9L<})CaE(kOwc$aV}gk(Ze3k@2z&gIbnTxzuL6i37szDf2A+< zaVlte{fV>XHSD~P(PMEm3U4pZM=d?#Ge28DYWWPze2U^_-=wRnJ5^tb3cWSSQtQ1X zPh9}IIxj)8h^VkQ87KO5d)Lfs&QTFIF zBvosbHHtx@7WZkhh(gmcehjs+f2j?9sGrth6q#uZVfYw2Ykbcv8l3;E1NojVW?5zB z9`Bo}77tpWpuRZsVz6*0j8mc2E)wv987LSukj%zQdutRs;JCQY+wHf`aaf<&ruWRI zWOp2d-f+DTOng8Mt-_mF)0x!C0Hi=$zfT$f@`W7dOm-@h+WDGGJC0H$n!4r8P=D}k z?+>!u-cHxNEr?2|hx2Bm$yfTJ&9%eHEi5NY%Nqjo4#XRW--t_Hx<1nS^DSQ1Aval1 zw_K|%Ssqd&{3OLE;&rlm5doKL$mSXV#h@C31Y9pIF;<--$y}waUXGx#^P?zB1Q=xv zIk)jd4vxZ!!~(}QDHwK`l)h~DH-F;}3ssbZ>#`-Ot#xkeEUnwdKd*Ij6n??ooUQHZ zlzMTpd>jjv&iUQ&^k77bnpjbeeIM0y!V>dV#?vA5PUu9wC_PK#W~<{wSf9u)d|V54 zzVF8ULZf~fS_Ist5CtW)ks{y1CcWcg5@-QT6y!|v zg7Qbhk>Zef4T^)?+mcdXkbk6<21rusg-E5LEqOpbrctQ#oA(Z1QcfkL(~#;q1lI*G z#mqV{C}Tj7O67;kc5H;_ozM>_H&`U!$wZGkA=87LFf3&}azR=Ik-lo~9|R9uZS!Vx zeUv(Blp=*K*WnY#yt-U5{TxVJDWt6;F+E_a6A!A}7m}bWM}ONR4S!#)FNC9?;@r7# z?I%f>TI%rflc^6=j<=MJ{Y!u$$6<|RmknR1)W=-UakfsMIqnyQ_JmITBv-Rc_lPl9 zzY-FA>2D$AKG)QD!6e;mDW<&E_;^O74v?bdmSw@SjENNioGBe40k;@P!F~@E{Oy1! zXn{x+^l5-5D@&$rcz@y5n(V>vr`5skhJtcnOj4}3MJmX;9j|oE%W;B&6X*O~=wx;Ej@{O|<+lKA_R^)X_ zsoy~Y+GDujrd$J%f~yrwHuXDt=agaYKA{i z7#tteHuWgK)Q%W*yt6v5^b_&q8_rYMiGcG9`uRj?d#N9BZbG)y@nt<#M^M=MXZZW) zGYRqATIwbhNlMZ~>;aT?yDe=Me;b;`=mz;b1@A#2d@6Yp60ij<7AA$_2^OfjsSYJO z&r@)AMzbtUGJpIr!Q)h@&L9Ct&NRhaH0ttD^1DT0Yt-lA`;TuGaq%S_(GRUquodRU z$~%*IQcI>Exv4Ck}lCw0Em{=xW&4|~A} z-B9pd(AUO0DEth?i;L?y%%IR-h=XSuedw*Xjd|xNi#DCJy!C6Vnx2=DQ z3uVoZcUh_nJX--cG?pamyCWvZNTHoy9VymZSc^DpJQm)OM?dKxVLqVzqo{nNgC;{! z4s%I4w!Y!L7%VgdPNd+6Sx5|aS{EmpC^+fO^WdBYbK$4P=jGsoLl^Y%+Hgzn&wCgj zj{K4synn@Hq2=3?eS_hY{EQTo;^!^PO_zl_Y($)zz^A98d=;MdL1_(B49Amt$b;~L zrrqbnTxn%69rg^bgggkuk>uo^R2+nWesBwA{UbBYt6{ai`tU>I_a_2lh6;}>Id!<1rCjy452w9gnEXytDFr?5xi;+Sa z_fm!vcSykxgpU-lBgThyOspf1?Us7R%BJmQlz#YdIFETDcko8WG!IXwr^4FLVegoW z8-Gr|8~d5z4Ke$M^m8Ka-9&jJ$@!_&_a9f%HzZ2sGX^FPdZm1x2ftB|fzOZ_^&3H) z`}1MavWK4sRa33ET;j5{T-L{<7S)1_{o@H9Vki-?Ga)7E6mr2@95|K*dB#9I$RiX^7OQ}W!&hvo?d*r*gAbj@_0jTctZkG&e41&_J4Bk z4Yz(Ftb-<{TJAt_LcHev5G;a0vIP*7lB3H7r8Gw|3Am#jD9Y`5ZP^^e7gR|DE*$Or zR5(6iDp~So9NleNP;Qq#VK&}wnYM~Qiqgrf>)5=zXr(4aG3DU&4{{V)45#t>%bej(nT6X= z6l05F8K9e{#WIU)IEwaO(&{^?rRn)#bMB z4`A#^V_gtPqTqV!g07l8$}dKV9lvwF5^&Z1cxc*%Hcp=#4`Lxbe zbK1pDWJ1^Yj9+_U6o1~`#8Glu*71<{^|_cD<41N(H?@uLq|?Le2h*YdeI1cZb-O>- zR{lzByVY9y9h+7kh|1N)?yU%(Nl@d&gG=7#n$ZPvG$pkL;kN-VOqSkCx-i+t8wAE6 zr{?Mo@_dbJGkI{ubD?O72WMxTEIm?0v*pm4Hp>aqzGJqWT7Pl2T#H;_)OnpMx9=uL ziIRAv2-ps!t%zOd=Xq_Mu)VL1#{*S|eVu9B^W#$U>Tss=ru@UT+r^Q+K3U7OYO{m0 zrDvb!o%F6@U};^&-+$I5ODplqAE_I{$fhmU^`QTeAcz};9ENrjS+HtG3N3dd4{myi2fegO zJm|I=&gJ=LZ!zaWV2~sSB{Y(QLL7PABS+@58Iqpi!KvngPJO%32N%;W=3Mw=3EG7& zjFMR>k(lZ*40lSUyJ-!IQ!4e{gAnma9WqE?cx783Zhy#e8$xnWgFthkch-pq)`$yU zO1%#9=$G$8KIV5)2Q6lafs;p>Ce+3iaqf~9JddsJ8Hb@HvB z#JSh1$A9VQ=3@Pg6snb33X0yEzjy)t^ObfFEns2{Yjo}*tjP-=+W5=hAXSMU|p-tgX{9!wXWS0q-dcP zB59plKh)TszwLP9nmKQ|9SX#pi_&wUUFsIs;eR;|;=#S2Wfw#1+RFVSJo1{C+B?XL zfvw#qo;93r{4+V~gjrly_j&M>8)n!VlB(_DyUp?kwyT;flva4&wC8J_tuU{~F_0Cp z*gJCD_PpXp9x0b)cvJAK4}M{{BlYd)JXc!dEv{{;Ygo3&(c~6gj|B>)1RxwBI}`HY zbbkdr`1lC&Sj!sf@wJhWK>JWeVi39t@!)iYJfdXx;XoZuMQN^4>6~hClzj`zn2Wkk zF*(Z8Un>)>9svN6hb%@~8_uVaqy!O2lG4jgB`*u9mGi!Zy8)06jZ^(4d@@@0z zg|e3hTT*V!<}<$=`&&r&mrkurcgFhGT)wYaS!AZAqY-b?t@PivEysSl>LE7b(SLFQ zM~Z#_EbA0%H;BNLTn6Ul@F}=(S|F|_4_WQj&7O+dR#^a*=0=UD?xPggp`d9!f!o`04!_H)p^$+V+|>ncV|liV=8%l-b+amp@kaS0{L zdTZzqJ^bc*AM|J9=MKM+x&g-@OHUf*%Nms~NLj=~7jb~UQmMBsZvCCkSRN01Hy6hh zDfa05gMT^C<8Pv1UqMV-dUc{%XrI;M@oZ(H#Y5RmL>`Nbl8@(hkOiMHL4O=h!e1wK za1ub%@>0`9>Leb#q_NCm8_pdi_6w-n@R`X4VWm;HNVt&2rd^uFhWBOuc{J)w1OcRr8` zeTp2V!1MzzW|mSmvoIRget+0?*aDc>hi}`zB^plfcta68QKG2r`ci1*MO1aap_rr< zDIHu!@^?wGJ;X++U)C>BJgY#qD7fPUg6+OPJA4ZSiV*JLx5tEqg0c~jf_qY&3hxo% zRCsS}dM?W*>yaUEPESS2@Q6Oi2ZT@zdW7YI!XAq++q6oaz)`p(ntwM7A9z8t#9UL~ zowr?Vf0Dp-vAyzUI~Js`Z~Xvh(kav>9@>So^R$1Qh)Lc`c0s;LV_QvYJ>qiAhs$#m zb1u&ZDNKziof%p`OFy$5(Nak3O$?ick5woscg(1D?uald_ZNpuicQ?OEW=^c`FN2g zA^vQOU$;JY|2PWw<$p%J6fgECD!9EKV&ok-GqEP$|M`1&wq?{M$C1qDY zNqMtypwO@vNDi*OhSm=&qiG&Wr-5^!XNhPOdRy~?fB2H}mVY%$T4iOu4yj_^KWOW7 zda_DBLP5EF1I6=eatY02iAl$QG{n6N(c-F9*+T#dW#`7q4YnLkZqT43Kaqh>xCbvZCo|Bg zZ0cr@zbCLgUssPA<0!mxoQ{SQxsrC<=X0f7Iy?u`o~u}@L+dBNjdEy4=zW@gB=bi zlz$ccq#OqbP!Kw zH9eX`Q=#f^s>7ymB%!Id)RiFh--6{v`IL07;4iApJ2td zi#c(vcCqsrXbY_!k35jl_v_uZ(&AAnmba(;itiHal4T)QlWcmXFmYU@6A7u6PcrOagiLnGI#MiO$t*EM(HK3 zbIt?9?HeY^)L4gK4r66Teeg1J+O{X0kgGf5%yKh~b9tnJV9r+Al$*ATk`)cK$!O?Q zt!HRk{&tA^Aarfg2lWv1rgbTl1uv?D_sr*$1FsESFv$x}$bTKvywV>5WxJT4=uTvH z0&t&CLCPnBX;)`Z)OouoYsbm*qOSXDHC1Y>!&jI~q2z(- zxhVU@sMA#fe1Axbz+#oZzYb7i@Ar-~UaAxUq#*DPQW(K=k-~Tv0eKLz@r8)vgf;IT zt`jOLZQg)b?spvwI|2c1Z#jDJK&EC}1tOdp0yHI(V?O94w| z#TDw$LxCyv8>w5$d0pD$NxBUI<2d_T;CDr*(B39Q9!e!aIXLT~9JEF2A`Y69wFlv} z2t4>9FXZuj$SawWav`zsNKLaSDb2--Bz^Gay9=>5Z+xX(xhS8rc2QG_HCt0--fYzs z8jeEuFMnwiPQIX1ex}_DsMXe~AJ}x91)Y!p{D}p<@I!)fSA~MoJHTcJvR&OD#SeY% zMCS9H*A- zlj24H(H_~n;2yl1K=+`>g2{3{l*al#Ia_r{8t1~P6|GN?9+IRniZc&~=O(qTUQ--hq*#`;)ZXz_YZS%;CEIeRIw`4!i+W+Uk5W@jPnNQ}taaI9oF{OOZOUm0w$bUJ)+dc3VCn=N3c)6f(bm7FTfy&vhKC?VNjgP4o;>!@P9Bz z$y@0FKF8baRxUK+rWm{fIPE|ug26Z3uT}bvU^rDwc`Nc{ z8vC|>M%E#sQ@9GAHdPRHMwD;9@ z?z{BA2nIJvy(Pi8q5l>~=C;a`G?_fODt^L~oxqMaiKZ6YaCII%ncA7jtbgts|CD?1 znrq%o-TI>(ngjqqV@@;yHa-6#TVOMW_PlEtZ+@M05rutQoDhE)zPk2H&ivaL2b7Ztp~ z8pV+GgjGt<-s49N7g2InrGKZ~_zkw_`akc*&SYhjB#qnfe)0tmd&gY<7KNP;7K1`O ztS$X&ORT0F`#coz6c^QW*7&I}S5qF(cw3{G0jD&>sE;j%Wn7U>CZJPp%0N?=f7p)f zkHWpoteZZ+?VE1eaR!%dXm+kg+y~&4zNC61jw!ZXRcRr^A8 z8ND}fDaV~qts}}Qe>;)*y%;-X!8goDYrikW@;mA-e*<`sd|T(z@28g*f6z};?ASZ` z@oSem_@+YeMx~}932PZB_Ul_qGf1+;QVFe$g%QV5Y;}Rem48+r3C zRkv@9+p^H!`IRUmEDnycDmEN$YuY*Cg|Kf)8z)?0O|dP*)uSs$e2=*8jxS=nf4(iT zmHXQjmb09TGk>LH_<(O`(SPgLtqxF#ze@fuWH}K;OaHcX{FHV{bxRWOzTY(Yh3e=| z25T;MD2({KXnhK6mk`$#$}NXA#FHiDcga%e4d+9V?r}dTzO0q%f{1#}GU^REn~m9`7wa!`V_ z{LL0f)>{+5NCTb~k3+{oh=hUp=iNm^0iT|;9=51{+GS?V(G@as%T(f0UW%e6JS0(y z`MmnICTBJj53u!?EE-Z5sb!PgwhlmCSA6?~>U>u?qg-Xf54k8ir50}N3;lb!rQK2s zvI?_xdw(t~({T~DGvO$5geaQ?7c|GK02jmfN<6!wv|G$IwtB?Dyb?rb97^d9KTwI@ zMZ&0?Y$L*Ve2{!ums3JN)KwqHrBhh@@!uZ_+Ag<+uzIkki*5-d+KmMw(JBrM)W4ms zJ>yveosdPl5J<9U?&kt!0!g~{RzE^j0+O{KiGLcd4U)M0+#jn>>6Ki#RUoOirAmfa zj#meHAiD8wlUU-48Qaz&LJ#M3h=frY*f9xEjcr5-;8$kkI)hqgfr3vSk)faG%B@J# zzjwJP!bHLs&{!>WD}connmm4ga6y2{|M~GQ7Dd@f9!OSMSO*E|mkCH~KTwwa$wJFS z+JCEtcDUO5KjFE275IYBX*C~#XQk-dKV@WW9z*G+TqxgpNj3N__Q)kmaJK!~NmEyvyyPAp(hBYX*{b+twt`JEkDy zqNLqf5W0pk;ei!7G zd|?ml`og15_=4wj8vZqrJl|olWH~&d7Ou;pw`{W{+5=`h>Bnoo*_u(7#-p$Lju)Sq zM3P62eGkka(eB3B&R~&f=p|QzL~CC#NO<8rAN1ZZ`bNTqyrArF0T->=8c3=Pw12d9 zI8;8LUG!DWd`8uF5-u1~`9eLPqqLHbfwqJE+p0Sut}9Etg?^X0n-K^4w$35R_?r}m zdmN_F?>)-gq-TAeJV97N#o`u8F-f%GcToX}MET%X##mXT$4lFI(CdOIoI>WAJdvSo zttiQCpeVOpv&o*1w$Q?HlzrafCx1LkD=!qMR0;&tRJL&jl6>2?MY{0gU7brtRB|FB z|Lz-8FAS~p1TJW%tru&cQosCxQjv86I-z$6}#tBJJq#iezwY{%d zjp%LaK(gL;NtPEA@Bq8}2EVQCh_@ourTvtt6qc^%CKYmv>n^v8nMWj=mR;OMAkj}( zAs4oli!{h2N*8%STIEEOC9TCpZ|V>yRM{B;S+pxMF4io|qHM7v3HM2sw^&T1)+~#V z^c!Qp(j48tyuwARk@JzoCyi>lC&uc$-UtILMwj6YmF+JIi(Wn_#NazteyxVi_5olCx1(S41E1L68@Js zxb&=B%~JiA=ONMon=ajIC}A6*V1Yyr6(mubeG606BKh+~eS9H{Qe#~JR3>2ut&q(6 zJ+JXoo{LO7J&b-))rBZz5+zZ6MEhE(AlR<53yC&-+=D#s(12dnEafr1RKL;?SWapA zt(ZBBc7IME{X)4~s(-?PnuOW7Pdq;%t;0dZDVHTDz4AoB%Q(_AB>1d(At#*hZKWci zZr9kBZQP%np0idQF<5uhgBp95)Ak==nirz@ zcJ^HEoIm-Ft1TEW)Ly^dDQn8JX8yMJC5rCXT7Rz5i%UssEPq~p2i4!@_Aob@BGr)A zF;WoV?@{@ZMWU}9kqbd)F&B1E7k!V$VJP}}F1iOd2sh#*s_?8V=d9@4NS1SJ3&$65fF$(iG9_xqd$BIYD$AmDp)T$y4@8il)2=JNu!*~@ zLv}WTHM}74jDM(~3%cNQC$yp*D4FGQB8pDQ!suXEqDX7;=ktPgX7)k?@;p~Ri!+~5 zmHyquA-$*FaFBXFU&~ziY&|iPOlvRj7EPY zjQDAsEB^9?@V7!*zil?JUF{?jTAChln2*N8ON+KF+85IKOs7-=7ctm2(Tk{8wzyFL zN>^aH?thEK;K`!jfw8jgiEQ|Si=U*F%TDwDuQieAx%>95trmVo{8An9Q>s}czOA>2 z9eQ+mJW-RDa4RXwa;l%9{SiAXZXyakir+}0-fKcGN;r`$T>gj)uPl%YKlfnEvYIne zB96H5$^vDHEw*$Aur^3Eq;?wUd4npN;wrZvNPk?81X3MWNFw2qLj!U6lcl*>n6kVW zh&u<gCo4MY!o(Ttk3h+#Y|Lwebtvp%8SUzqV+9PyS9iA&X*#^I_&xr5$3 zyyUuEiZA%(^O+Yb)oHKmu)A=JV(P`9$hR0b=|zWgtyjk3+IAs#D<2Su3q9w3MgJ!f zkbj#xPB`5O=hp76Qg-i0EtdhYfHcP!7Q&apr>1^k_~-RWaXm@&DF!jdQg^u#@Qho< zkwkmk7fAGQ0xnu=bphva9Iem6aU=&V^?qK(8b@n|a6*b_p<3u+YMzji@lag8eLO9T zo*{ zLp$xde<0P9Z6dAx_>5lm-r@xprJqGJ?!EO3Gb*jn1%FYR__Kxa+uDL&T0?qtFn@8Y z;um>oi=?FIhJuf-7NYN=5p>8OE0BwpqJ1nxelinGM)B_;*~V!27tbdnsq6?(?>8|WiN78+*1{xRY}ZkT$otcz1BcU0=7tA z7~UtaA|SuWKqoS@WyUWn`Xb1-^*!mkQ^u{x$}DepFs%I*xPb6>d!j$68Gm8ib_G>~ zMBleTkVt;^1_#p01CdQ5Ff^Z5t!kf?c##Cst1(40i*N zWQ}oMmg8%hw(5dGa!7g>7rl=`66KSU4`Da$QisPnnn9vHG)a0<@XBdM$|4|eT?{CZotp0fmffKi% z#BaGv>2ergeLw z7`>=^U)C0s<(B)ara$RPQl@m;_nGxI?L%&W3fsgT?r$O=bcmpoA%BM0k^Q1cqQLkD z1Y%Q?q7Ou9l58f4awsJLY?-va`EC}Ai(d0lFUk_dhq; z%XWWO0;Bc&3VJti?hC%Y&hJTN?d~OsWS6^)3X(oiI@STMJ%9KJTS&s!L_^VC>sW~q zrb{VGfP}YfWnJrVJ{G4H*$B|T^dJ`{iz64MqeTPojUMv4y%yLudTxJMBr?$2 zkxa*KX*TRdyGx0W)7Y-R*vUg{s300clG0UQhZ-XvkO7n}%?k!lc5CKkk;SI?|A3r@ zBx_ki9Z(o3>YJ=6prgXH%V$JzK8!wpdOlxR^B3{9`+wE0zhZ0s$ZP4y;q7_OZ#6>u z;1etOgpw7JizqN`3 z_4=Gom`GnY`yg{Tkk*$0iL%Lu6H+qBytim2e_E71J-kqgr#C&vgCi(F0W^@(&$^JE zG#@^Y?|)<2(R`GT`AEVj4Hq0v%d0**AIc&tl9EQO+38R{;gshrq)4(k6D5heuwXQ0WpVB!4wB<;A+zNmfF56fLNjaEp@3xnzMd=+{pQ82KOMf9zHnS6g@Y`zWRMl}*f;=5 zlz)D#ZsTchE95OM;a1jly}#LExl6jW)MDGlgMv6|e(!WTL#fC#<#Dt=x1 zqgeOEF76=3t-qTb`bX=B+&)HAKmaD?%zrX+Q5q{CdFED&OOSS6`pIno7#c~kI7O=~ z>}vYRY&aurR};lmKC1d?jMD?@sR&7wtq&woJQPWkRde(6459(nHHSFlGeBL_J|v?k z%AWlNQIykI$VJ(0_faaRm8-7_P!^@Q`QVZ0m#weJ*5U1IG{Ck>qm#xC-G{v+*MC*k z`96>zPFmSMy`WsrM0$&Y5v_d5M+ih|sS50I&1X8T7lky&sO^-+l!XgA6u*v5%2ifk zmYuCRpC|zOs^mh7dgQ|J!d<)>=?gmKqFgumMl`^F*gn(}ezu-si+%U!0SCCt?ZYbt zz$@yE0x(#QvO1|j3 zEVeA#ipy}9Xbq(A!}_3(vnEm@K#7U6;x%q)(TfUMY*X%@2%(kUw=V^nGI-Z zoTdEbb^P9R!H5JjPg+qng?vQ2>1=r_6}J9PLjOGTB3e(#;>}23W_=?@U$6L09I4#9 z(EEt_QS$efks^YN?dOI5_$QJm#u`ba5ciFO@#tvufwm%o9ufQ_G2x@g$VA!LBobbo z&_E1hfof4&QXJ^Hua-N@FxucI*dq_2rZCUsCgd*ZN zDMcSK)q=G1<2w(;MG0;oQ5xh3kVeWzIC4?$`XLFQ$BKZiB!yV~Z^*46NvQp^>2NKR z=EJKg97jv@IAuNoNPhzHM>`zb-oTb7%sKCR;wbs|aI*0!;8 zKwvO>K9DBFIEtiyKGuaK%B^Hlu9D_`1imYV_B={RHu2o9mKT%eEqQZB)}-}1i<91$ zTrX6|ht82itJaowS6f`hMVJkGy%q9dFfzq@OB)PJ9b%F^wh`6Me8C5uT; zPIdTxej)uUU(iTeeie;0r!3cINzS>Y7mFtno!-QMDRf>fYkg$XSWAb(sQ2S}`!he$ zM`((GiXfQ7Rj?ewz#Of#t~4F#686j<8lhbRj%LSK*~`PBvHOY5Q*Y`Flprw zFlm=>F(HYTet&^PYjY6Miy=>@XLQ0w>J=p#NLisrBSly<()S#Es6R4*QY}ziC5xkt z_?svVq^zeF}y)_xT5^^EvS1P!G0OE@F`%yY$z%96{Pw8cez+>Zw0 zLy0tylId|Ee%z7_>VFp@rjoWZtjekT@sv8cppQg3+ukW2A7iD(| z#m!ONU%1%$UF+jf|9m%TIv6|hd~A8V)l9yiEZDvgJFoQp!FIoNo}-MIr0eWQPGWrS z?IS1>f5Ac$t>z%k5JMzK#2Hd{%K?5#d8~@KJc9D*6fVpYQYg^%(-YD?3rUocg8*gx zlsa+Q1AoERzqW|CNNl}mi%1`R?8>D1`z*<#e2TC<%9cd|0KZ~JB@-c{7hi}%?|$}( zwk%taRquGPoMJ>-BKoM06eG$8>1@2JU@%CMqWIJJQauf%if4>#Pu9guYa@JJvAfc3?D@RpMM-6Gb)=g$c2G)$afhhdnC!X?r+Pc zaQU)w-32L2sy{7cti5>U+~N|Yjef|D=stXXFd`P0Vsb>ri}@7;C4u;0UdTn+SM!ne zaGd8+NH6 zmVaibN(v8UjhX%AV9n@-GbsB27yx`wkhm!O;HVd6KMic8fUjJT<#{>AGNTIlL#k6& z%{Xag$uaMk3UK|E%%FUqoXxm;gNQhnd^``iC^s@`M#|;~2JE^mcP76o5N>KdG3gTl zn{P`^v906!=R#`UT?+l>%L;x89rGis;eXzGOEcP`?(h46^|?UzvBe_7Y%y>wa#5ZT zKrZ}3Nd%B5trnmtbbC1hBvL=RwB(n6ReM&a%S8|i;93}q`cEX z11W0ufwo8%3x0tD;kJlXOKiYOOFF_-SXkDkV&gi z6gQq~hB^0WTHE-A*GE)CS+oQBs9fdz*t~L|?qZ3nK3j_eY2^Y3Qoc6BK!4g7Gz%E7 zngeN9QqTa(CM=>7Dwz{O*H-Z<=y`plxhok+Y5#mgHF7Dwvq_d#PP3tQm2>^`+SQ8j zY&JX*^(Qj(pKJf$FOV(G@E z7ROxT^N^p9(G&r%==u37nSUhOArK3Uu9_qYj1vx|Eu3e$=zRfTdTHB*x^zOW7hpuTws3qqs_w=)(b$Gbq8011Wjtf~8Mrmml9D zE=r9=ODl)`5J*uuplVFIS&pe6?U)r;-wOB97Li2j%zO+=8b~Q!vwxP>8~NE8>DySd z$wPf~`AVpHzN>G`UkEkd0NTP2BYiGQL*B#NT!ZTf(X({t8yuaCe-Zpo-$(@v*11?VpP3O5a;WGWC> zJA^%JBmG-F45WYn%*Ud(L2AMHS-zmYH#r?>r#wn4188XFz7P7PlH@IMUywMt@SJkJ zK$Dgrq`E@A_mLK-)uQ4%&Cl6Q?)n)AA1@HOESt>vMTO8mA%Dy(?nEkdb*nvP7{3t; zu*6%CT6a&{qQZ5#r3XYn-QVVkK0+LlXr7l9sO* zAmW{Jxyw>qwz()xx(|wnQ`Qm)a#7Nq57vkSg|KV^PLv}TW%-ViR$v4Wp-gEH5q?s+ zTx8A2(u;mZ-hWb^ZALAd&2q`Nu&rY1p_n5R&dxqo9Whbz9nMGDu|Om=26 z8=V&dO*tAhsX6_a{e^M-AS!Ly;If1demFgjzS^_A-=2_m%?~xF+=Q^yZ`TmF%;*R) z$VJ)TLV(2m1rIyU+)1CvEjn({*-3v{+tBd@Q%7yNqklX|ft7l`iLPae`y)UJ;k>xw zBt(-c{gC94<)^u5p`8GqOgXTh5EG1-<}?o5YE~4r_7M}#&nWHlVso|!;?4rODCZkc z7G+V5Bu}_kOD$@DGCgT^u}coMpZZU>>iB-NX~h?Y=BDh*q`evW9;GHCR7;g&UdQhO z#D&{7GJiBT`Q$GA-ErD4PsIFTsbKk~S}Z=IT<+SYb*o}|o9XApK%TUxGL&Z^6$bN) zYoAaHw};b-Ln1Net&9)C&_FvR#S3Tg20GL;d!W$w4acon)BSDLDX^*OD-j8kxRZ2a zeZNS=DWyL-UhbX4{*q8a=p}YgADk%x#FH4a=6|lAVslX(6yT=#T|lJJV#R>9YPPh> znHb`tq(ngB+LslF&yyGCtnBVhbJ0WF0;;oAmwFezEU)yUeq~1OKA&N?NYn>&P!_F) zoSn4#zK^LF+W=Z2He5Hpa0aEzL8P?(ttZwhvH5kloEkK`d2WgCV}#CK~*Eqq*mTDd3URXrDlT$C+v${l=()zr%iGoDBRQ|V zYO*N{Z{5wBNIgxCBnnjKY(T5`PtiikodBGWa*7kVD9@yt6S6I&poUMU4u8FG!$g;b zW*a+EA2gDph(Dl{cKNuX%SMq)vQ;Qjv&()oF9B$h za*{0}u$5A*fs3~IKzuU3*@**bD^Uvu${I+|5GbzF!GXBSxm*-i`w-*9WBq^Zy-Tky z$#R}I-@jrF?EyFQei@3UM1RA8VVFGdMDRdp9ZD3sDT@>>*uUQKL_}6))mLk;y>>Un z1GsTOVs-5NsA}UkzvdNj`)S4TNT+%4t&D8%{p#1u(4U@3Fn`-Dem11i#cC=th7$|M`+a9SdKl$PlSg0nvk!Sb?(ei#5BBq& z1nS}b_D&`Bkb?Fe!&86vMGvK;KK(_{ccvc_%;h`t*h3KJ{>=|+=st-LcKUn#W$!&j z?3b9L6HdMRln2lIvrWEZ{GSb_`%_lP{@sT>7(pL%!+mxRi+@az3~RsCt$TUMgRk{5 zGueHD9*99-*6q5be}8D7tgZXd#yQ(n#oy=W!63LV%GX@Dj~VDby=vUTJse8+p?d}Jy?pe8WpV$aS90wa&G5=7`=Ws!LVEYUJOrlR>+bub z`xG#`)6YFv1)m+=X9Mxlqq?C^YmVU-Z#7dcNtr z&(QlUWVz`#>cp15e^Y6}v`bwVt?%=++7QRaxez=XkZ*@PohWDX+umJxg3H6xe zFn@B=z+Nh3Q8rnjIk#1~C*R3~9yG+AJm_Jw+@~)EX(4v2D7;>;PVajZY3~o*!;$|n7u9DU@@y1*%+U4n zl!r^FJE2vLV_q3XUKYZGO8l5x?*5b~mw)#MhW|l5+~zq9^lW`)R2)sP_6r0^fB?Z= zgIjP2?he6Sg1aof$RrTlb#ZqM?h@RCy98NW7x&A(-{0@woUT4SGc|pxYf7HykQZ{3 zfN{TsFEmIZEC2_!!%5N^Ms#qfmoqln89~HF8j$>wX=;Sz1;d6 zXRVG2w5>9UU5u)e8MNIdF8U~ueIPJ?fDvW;t1xwSMMVeRbrcI0zxOj@64B^-xWd8p z4$m-L#p!qjrpU9jHaI~W7h-15jWEgBo^kc2j=w=1mu(-Ou^ji!fq|TW6rr&mW!)<#siDnmCM7Tcf+O&2)Ga z4%|}rl2UYJu|xLTGuzNjx5)YzScv@WQL()suDZ1H%-OG_4JT{+iziAea_plO-GzY1 zl~&#LGdEqa(cwl`Uu<7M*VOW=$ituXyJH!VWKOX6l!VE)8EwO(dKP>fxjJ5_?^Isj zLog5x9x80c-V!oL1YYtXfr(wY2V|#@BD>PQ2cr^KXJ%N_5LyhaKYO0f*v`8uaU)eD z;R-@tNLnK&cBPKQgS+k*MH(xR6U&-a=|~*FKz+FEAxhbvGJe zr1{qNpS`A@i+ju$z(Aw?m zwb3p{(|p33y4v^V^1!+%)ychW`WMe}KHW2&)-?;Gkq{^U!b@)(7!iukQe}0`7C9d^ znY=JWL=N11j$2Z!NeRhs_APv=WWH*}S|1tQ5rrzJU4eN)4xpma)AA>?)_h2(U>HhE4e&V(gNaU47Jzpi^#M#1|{9twqd_T-;Opu*cthAPQ}~S;%hq1 zFsbh2xy2X4gzHq?F30yKZ$-vPn1<6M8yS(0Sz*z*D!jCTBD+z;bv*;=i^?Ndn#NSA`muZms{auOh#qs`B1#z zQ~KuIDBZvQ!~mBtU2`;7|9FBFx5uM*_)Z=5d$n9B7JhK)M|`^Hc)_6SAG}hzWdr}~ z@k#AR#@`c$!*Gdtj39&m_h$b?yE|p_Zj2HJ0aHr0^ovdKW?lJX&FaRR0nI4=%X(H^ zkVd}v-$w2a;iuh7tRWwi{d?1Y9bx`XEP}LmzO8M4Lsl^8cVnb)+mc5^B2EQ_A1;<3 z*MwmH+D2iyMxFPY;FG!sSdF93(h&4mBN?d8*IC_v{<8Zn+3fau7I?J4#=_O!{A=6^ zJO#Bsbot#!h_pZ7cZE4!o?rlvgOvom=bs78!zYC>o3>j zZ%Kx(F<4UD=czSF)5(@omy?F)cilCWYQvd4%5qkFWlKnD;zuYk+WwdIVylsDU#o$Y_wc7t(X=_*(Q0Q>R2P75K z3o=p9B9$q)qfnQgrHaolq)JC##`!on0*nBe;?A_CEo7f?WaN}hj2WmD{nS!;HVC(BI%Pf+Bku4)77jrL$q%D8$NX1 z(@q%}Ln9BUcNkm`1f0$X^!d>h_-yis4?MfkY$B(8mC^wG+&5p?0_V#*m^0Xj$Bsn;crN9`lmmnUPX ztGXwV$Fg(}ynD#)wYJ^r=Wqeg$pNh~d7F@F*vmGA4JeoCyKp*PGc@d)?TlWIeD}HQ z?7?qJf;N<<{Eif1`n7lF+uHKewQQ<~-F&BMV*e zN?ex{a|F|#!s3+g&$h4Fc$FQ_Zi)vEo}e<@SD9zck=R^=QQcSWDLZ@_jGfVHQ6YD? zVh{L)pIsk(N=!A5pnJW}?e+IZUEsL2tLl^)1(D!1>?G5pmXGr;q`Sv+n=8#P3O;%)jfH%3R0Rb>vT5n0h+Ob3QVNn z2o7jFKgTg5uf`b7_sxWT7N%2tG;TLS?bvKQ;Pb0AW*x*k2t$kH6VRqRMP2P(y_@Cr z#>XcGaSZPrn_jr;DIsL*v?lsQZ8;9x+%(_^aGyn3gflhh?C6_+R*2ckjPQzm_v^+t zB1NTc;n!CB1yhy&U#e5%korlAfw3pU2w7loVVz$>YO%A3-gvg!A^#4F=q%)fW2lf- zdiqxu&qdDEqhGmyN#koa_RL+{_rAF5`X&e%o7^lwr;`ryt$;16RWFR`*=a~>ttpER zHZqdVo!HiX$Ra;}DjZzq|5EuZ0JAhO*uGJ%^jG2^?cPAjbr9cg6_2Oto z@mDyX0uU+ZJsG=7zZ&U64de{cd0k@GHLiJBz*5}Zxm?6E+#L?u!nV-stOdx4h{bmw z?C9f6W-ST}bF=x>x~g`#*j@C=?N{#RVo-KU#HCUUWUOwg)gK56pvpz>{yWR=GB-_v zVXzpRFo0HzUtTn%zKuWJQrsItuI^axRs)`W9OSQf)lDFNMtfhwzs!AK~)ZX90 zZAs3{Z?9BWD}96Oxu2Mr=Le>WN3rbl{#bn9pI7!mr4}5 zpZT)L&f#@6mzP;{VOH24fkLdLwJ4a`_#V@4W2vgJ@Tg)at}5fCDT!832L1Srai}~9 z3v2N`g*oJgW{6Ija1msP3d=Qa0p<(qNR>EL3aZte??Cb23nzNkdaf@_XD4(5t1{~@ zgGw&ZC|B#F=~1XEfrP?3UX>)`U!_b|Z>7i4e?M`zY(LC1ANh}|ZW(q)7Wk2hD0DrI z@3E~`c`Rd%kUON>m@a*{OpMiU;o0bGA~(^7=TvOMKZZT3@O|h<7h^N>uN`(0k>ePs zwLw5Ne;sD+dXyHkL5#ny&5X1$(K}H55QUZOXQXt*E%wL{R2?j0w}E zKfNS4py)z+=%@F;a~ z=`g-Cp$;%x$$V0()`r-0Ro`pB?t%m^nL2)*Lz}`Xu{$5A_O>fPJJOo=rA-;ls^tcL z6IFB@lt6M<9=($y+kKt%{bcy>ceih@pHjnryvwk&-`#q(XaEf2WDE-}- zA`bXjA*F&Q*a=*^3X|v+#o^zM%RiF}3Q(kJ8K^Ic*CUiyQzZ|gA1vHxQvDK_*4W~K zFFvP33MQOVf3(*xT~z2CdYKKs)o9T6!9e+&^cQGxOU}c|Esb*apQl|7`G@1w>n`k0 zyjX_}k>m4e8(+9LTp1It49K1s>W-@#lzwm;YS8ZNlh;eD8hL)1&a-rLk6#)y`!Zyvc)Q?~-{pCo zQu>@f!S9#$vSFM1%CM%O!-3B4_guErKL8}EtNK<%z>6|UL~^$tpt$fd{KuHJpjkr! zv4XfviOUvZe4jV`ell&?X1Ei=xSH*2JKjOw7QW`=cewqGsxsFRGg!43H_9en0h#an zWiHn5_M`mj)jVS{OANodI=T z{+q(vDo5MAODIkkqfV}DW~eRySa)-S!My<=mRKzrx$$O6`Jpw|1Vy;0$6TG|K! zs%Wx&=^YN+aqo%!^3=Zlvt{t4Vl-RM!yp{@gtQ`C$MEf3GMQC-oZp+od-dU#LzIWc z0#!%9+UY}x?|!L|sZSl@d@-Asfg4l89+uko+~B>jxSe-a~IpDok`8pVy;$^3CWM zlmpGIEuxQ*9j8Z~4R!|qz3CO{fAy+2q3q<^?6<+Qp;ErxR4ePBZpUXhz%VL|WH?)8 zOTcf_cv6dzMDw|5eWnvgh#O%y!|Q1|v8d~AMf(IRqKbugl(*2P<2}grVTDPk8fN+K z*LM)NA*~Adm5n|lsLZuu3|56+!{^={j67LK<#L#{2&W7&{z>-XrN~9MNVY2ul!6Xi zBk&$r@Ugt7)3P`-T$uI2U! zP7>UfeTkiSv49j)AUQYWtAvK@C%UrpD;ymxTiFHCSmP{G{-2{t%$f0*iatFZ<@C_1 z=TTGYrgR* zEVQ%9XB?gO{RT9RS$)A%E4s0A#-bqquOT*UnIZcf8o>LsxmLqzx~D9x`fCq4@)i_K z)Ff??yj1+`)lz2Wm^R3Y3D{)6z-0g9mea`OciJu5l~Baw7ctYxeIQ&B-<5&Wyo=wH8qWK{z8RMr|3J> zQN+s?Zov3Q4OU^nC1$>&K1`{wZT{42}8_2q&a*WuQd2 z(X?%}Whtgm*El)@jfXWejF-KFc-F+Xt;jqFSA19PPKqqV)Y!lCoq(4zfzs`^5}8y8 zjlyt_UI&rKYE%>nv&9w_QiSQo=fQO5CI071mm9t_kaz2qPznh)huv}b&2;+YDJTGi z8}QDP!(A|Djx0H`*z$3x2HB83by&fNcWUGHLWvJB9x}WbO_^M?PEeiBSh`%I0p9KVjKsl)tav7>STEV*uUUjJ^z#OFW zQEfESLHyV_TBpm+PeJ5I_kP%nHqMqkhjO?q^?6=5lyMBZ4EC) z)zw+65ljhbkrH_o8$O)*i^eoBG#F-~lbNbPGLwfVczHNhu;r%cz3W4Z`}KF|g#(N; zK_2O6jojB8k~xmAy+!gjZEW={KyUan`H!FuL(YmxqbRhWO?Kf)k;+9J)t#OSHQ^bN zLSFLosisn|7EMb5Yibo=ik5%pd%sCmSHhttgt}JYxNASN|nO>#mA3J&%XuBd(n2Tr8BOXf)aLrJ05Vy|9-|*Ww;;*## z5L|f-)At6)I?bsra*kYO;618!*^bgn+=s7MG0KFg?+@Z7l^CV>vE(cIs2BUqC94K6 zeM>LYarj`7aq|tbfj#mYFpw>uZW_7yTL3J6VwY8DrAs>qPB^Q*vC1P1M2ibRUrx17 zu8($7$7kj~{=knoK5b*R2-ixNbKo43i?^Niqe#o&E;*%awU^imsYj&Q7)03E(UVSi)Xf6x)I;#Z9y*Mg#S&wp*}t8D6d|=6t@g zj-O86piSWGd)DIg{_B*G9UiX0Dss6(MfZ(Uz~Zk{uUxEB5#40+&;VBA!9{x$XPi=N zY8bjL@7qn6eD3Ih)|wl|#?XOqVHADZ^m_6R&!gSsVLVRD@YFOPTK#uqEZ`ZA)d|JM zAu?9#w5Kt1?3R*~0-3F>VLXfJmcpqWR{r$9cbWSF%j#w`92*m8O+y8CdreO~WK`su zr}qx3ym?ly4)+e9y@&Tp^)P7${>)UKZSfTPtN29d?Ui`}UsqFaXhH1~YkMsiOWAO! zS$p+pf3{b+Nzn@etusATLa6!QgYlm$SV&pRdeRQr9qye?$_pFP)M{Be#no3FLc=1# zmz*lB|Eec+6j|xi6RzjD0{-hS@NoT`oq)^qm4$n>T;OugT7~q)=Otsv0-9vw4YGPM zFhLz%u8V92r~y`Inf0_~wKu7tDxNHAaNOBIaer?L@~Qhb)V4-zRXob%da zJO`B^u2kodB{2GLR2GT%K;RC;J7iNI?L$JhE?vI;$KQxuGJ*avNY7*+AB2dme7N>+ zttZc>ayIhC{{I5t|4Ck?^2L~(u0JWqz-q z8U+5tm9HT|1m9j;)~U(tbCU-h8mM9AN1RpL$H)B>53Zg0(|3YZ9>nip_D#7Y3zH7b zgLRoSY0q!9Un~347WO5$@QgH}_|NP!)@)q?Hf}z^#W!v`6gdy|rNmLhc=S1h*VxpX?QaDCy5en{d}R^DYThUeM-c>TEa$A4t&Y2uTJXuq677?;Eau1gGi zE5(Kod;jYZ@N)Zlb=mb;4cunGzMP~Z0I9&E@ztc2hgtEvWTB~+X`?!(Ex<$^AK%y`m;`@;d{)LUljR*7a3v}pLJ^kG? z{{1~^D%h@umu1i8wf|B;lI7!dl*zl6r##>1`kvAzA#IVuwGRbf5S+ZVPhTH^$I&L^ zmxI062hZ1qzrfSrnd<(E^oF}J(5KAj@oFi0I_`OKjoil2^14OU^=w|p$R@G`UC2I0 z+I>lgc)Cd#pKpIMhZqC3>6woztZ)CTJg8T&1VjJlVaG_LB6G+_Csd5i7yoT2JRGRv^h!7S9Uo-oe8NyKq^Jz0`W9Bg*xqlb6ME2f{_CN@p6tXj#`LO4b$p&TAwSx1-Jf1{i3Odb&7^>N{5*43nm>^Q;s z#v{G@vaK=IPY)4ezwHb#%8%hHGWJKJq&%cD2i<@eynTv2> zoZH+8s>!t`Efhqq|8(QtI?XxX=kJ+7Wk5ign{G?j^HmCZz~V zq1auJf9&BLLj>SX$G{(ipPXEIBIgGZzBHF>X@4=-;BNz~Rc9F24>!hi$@*p7$dFOD zcD;~1ROat7J7m|7@6F7C=w93t5&YaAz8(@uihyU-V#9u7HLL^P0*Sg z4Tr34j-b^>LYR|Dm&e=_&~!TBb6duUa8_F3a#JmL`2oWplLnws4iaq&E_|0L{S9Kw zv`61s-zrh-xbU9Rdz4?oh1wKX>kt3oo?!^X4J|lkI72&T=<2;+yWi9o{ieP3H|^y# z`5P2LkFR(__HIuupXB62k z!!pLr=c8t)@PaFYfvs4hQjME=I_}|@oxp*e<*0;9^Rp|lm|9?+p*^ynRT#<9=a{|E z3WGJF#@#c$^<<{e#$OMoOL@~DKX(pULx&t#!V-}Tl9JvzhW+JbtWfVvkf%}7ZBzeN zS{;vvI47sm|6w_Q8J@TWcUL!8_)#;ww_s|I2^Wu5+cr(5R%FT6Y~1Svc_A;TtW2Ac zIWB=T{V@myHF=ar;N#5&Ux7AbMdh{h8?S?ReopI^8Fj@nxFb&A!MIuBEffIV+dlzR zgk`{IgTib+)lIsqozCeO#n%@zS{x=!c(ja3&4e#!Y-#k=NLa4*!@xRJ#-(NfY&LRo zZm7{58)W4|I?~<=KzO$xFaFl%3`sPvx@U&#JGa^92YKsZtN$19nyUSDG+O^|?_R+n z$US4|F+uh9N2MjZ+wp%vX748QfQ3O`3?&MdJ41Kn^>3Gqr@B>$N(jsga-0!8F}$Cy zS(mlbu07MuYXtHvP(*mAGF(x*V;UFOJ4I-B7QgMD2?hH)OyMvd zt|e~5!*wtJq|DgRe4VJI!G(N}k1D0#BSjry&D{4Jz$kaUDC=fxa20eGaH7XIRGF<| zNf5j>N92n2n8F67g)6A+##lK>tdJAG;TOv}a(#mbvCGyroKe3UWj*;km*7?bo2@O( zvn$g-IqqR7(>gXmfU{=MFp@HyrV2^1Os34jm1j=k9r-WC0FRaAXh`hMFZ3+qFPl9p zlx{C+pPy!C&GwEJR+pFsR%~7w;{yaf3|?wh7|!QGKiE^b`L z&kGr&+-5{hyvD9|Z9rlm;p=ndHJ4scq9+R&wwThD766R|C?_ERbQ~sOL;Qi}7F2@{ z=V(T${4Ui3XEYN8B%h`!v!dN({B%PzlXb}Q5@=xJLF+Vh3Z11H&ENDujY>t&I~v7c?wdTI<6Geu~tV+*yyv}2RBqZ}{2<)Q&dl_7JogVsD|QjrxU ze6v^-mn2b$ zw-KG_Es8s2v2Ceev#(`Z6bYjJ&i`PQ`vnJ4#zHo=Z@s4hU6 zYS1XHufkv(9IiBW!9RfI>OKtRFpFJWaZ2vWmX!jEFT?xOTG|AeoRy)V>BQz`1SYw) z5f)YxWPRd-qdhL?s|Je zpc-II_&;R_)@)L(%Pe*0qz%{KirPE1>T{u@gW+knH`uX~THAS>2$H}{!FiBJr(eHd zX}LGDiDm^qU)cd@%|VNbt4FXjW;1qN%#)uCe-6PgvS?y{6s*XvFJRKGcXlB(5+5iV z$!OJ(qLuQwexiaXo7PUwWqCM`yqvtE$P=LR|8_>w3U9$s{ zuPwJGx2@Us4ge>()czqfpXGrdoN6jXp&zJocEzcvrRA$QxOUI)jN!Pq?S8A~GZ3cU z*G>xAk{*}T<>EdiMD%!qFTpvLIX3vn;FHO!B~WE_iMujNiC@faO{TDb66G;Q4FT51 z_!WKl+Z2yPA9xwq?3q#-e<&E$poUbLpPRgNh${1$xb@DpDAVqks^#EIuK#ngXALPO zv9i0qYfJ$xA2OP&){XR_A2 zq(AiC1WV4T%>N4=!PHGQQ1+NZEdz>nzq}{3_}4Ej#+H*{A)Foo{amx1>IO`S_zg?N zaH$U~wVFLxBv&Fu5@{ffUoafS^xId%)7m~q9DhDM{r)(ji zHsx|6S2qGp`I+F~G1u(oFJM!PwYvt5$0Y z_Co_RZp=@h6k29V-*q^4iwOJ76_HdwPy`eo{s&U(*Qsx{f}7N(Vv?(5I7q;yz`jrP zBOJGnM?x~w;7518x*4{glmuEoXiajt%3o)-#RjS$I@rhN1_#UdXcXGqL#ILv{k zgKTjI>P6NoNLd@59$}&C;#DqarA|8}W$58r!Z&T@QA6;qi1>H$)HEZ0rWnYe?()MU zcT4->)$$=paH<4jrv#ul|Fua6(#`-lu%qnjE%YK+DbAS%Bppkryug+4aEDoRgtNEr z{E|%{q5GF~2&y6ZvuNYPui=aQ-Lzh-!p~ZtI12kL73re;+YYOaL+XcnzjL3P0Valo3b^v6U}8EhTA z8BsuF!M*kgqX;k^mZMR#xmu$YSDWE_P{SbmhO6k0;}R zE*>7fMEpc3YFpJxAUXtHt49go^Z+{;t= z|LiD*$ttY}{Y)BcTCRNlH$4p%UC=l%Ym;JoC8+s=;{%+GSUe=UcK=Eqqe#qOF^-^_ zLJ3^rudVPPH8ptoZfQFHoou|E^-u%!w%IY?4EK3+>~+<--f>~w>FOXKl za**{AanJ%CLl*9y>h41kQuAD#bk*zwoh7z;qxAKvB*dtRwMyZn9D5|?>(6p|?sk?q z5%{To=rwG5p?Ih7!8^^((Kf2`tZ$kd%ZO)$^QR)O1a}uWNiSR1x(iL$$m7*2@?QrZvd`>I``nMQzPw1Sf3@)F! zdrOA(FUfE`=1j{~8mQ>+_e8|19(9`DQs@t~x<0yg4#UvcLp;1#8r&YNe3#iF`18^X zb`d5(iv$$s_y>pGlhmq$0RtTNONXnPa`z+PXyrlOtgmfHA0A#-#X$EvDFdpdv`%Qx z8Iv*glh%e1Xin=IPtvJSV8td?Y#Bm|e({1yGFM6a@K;n=GkN-EXjzIzpp1EBSSJbU zZcd?%QzC^6Wjnt+jmvyyxx@MsP+}WW{viWM^Q>ct_|`~~m*VeeP3w52FS%xC&>@{& zHo&_j=IvIXbNQla#-OQ!9J!7-$OaDUoKUWwN&kk2r-jXL^hcFUM^WT1YPJk7rUxIM zNZbiGA{aiP4(+o&k70-H`om%O59^eF?}>{o3_(kEM1sXNe7@yEkpgocaqPo(VZ$sy zm?0$>PmDX+*Im2q!mbTeUVl#^U7drtwa`EHDCc+R$a|QZ;~>`a^Po`9HSWX$cN%SU z|I|LOSZ@Wsi^#yXbHz8{9JFm1;_p;D6b?zjO+wIL;Jt;LgG$w*`jG~*yYoNk_A-x& z@2^UCF_6kOD!u>O(W(A@d7d zZU~)7juBG~2`hv}YM^)oTfk=6XU|vdKGH~Ee~0u-MK=4f^3m>Rcv`xQ=zt8GUXpdi zRjT-kqL8qs-vcxdHe(n3dtp~(j**@KTS@;R%~Mu#78=fs{?Iy|?~L?7M3Mi!M&>T9 z{gj<5JSZcB8C88~$U=Z!H=~48S4R^1W1zO7IJ!~k1&Mej=Mtq$h2`$Ib?u_ zXaNHzwv=g&_lv8hL#_F>1ZK&PYD#%Pb6;h>$s-d~1=3ZBjh&TqV z?K+7^V=E*4L^Z|+H-ZpBqB8Y5u%q^cKQw;P2!CO9FG8G_Oe;a$Atq9y0Fqh>sdvzDcR}R2ucS4?y9VUe&A4jh$4;t zD`!F-aZ!-MdBuX2VXnrEhuM_CO#B+d{!)()VkY~wQOMEZ^vMt-_;SAJ@f}08W+>Bi z2x3Rk6mn{F%=avBZD|f;4KFHJ#7T>`mCDu;3-sqk3Jl&Q)Li8XPKV0*vIu=t+w{@d zqPQXqp|}YXPb&(bR-C8&6Vex#H6dSCbsN2QXLKai?%CbUnXM*9a!MRe^gwb(L_gI8 zV@UW{1MKL|Ns0=p#`{-LQQpwtPGaZgMS0`JuZcobknk4}+b3bCiTgvD?eb>hr(E1jZ z+Kg93dgH=_2a7!Um$bf=fsN%$#GPz^U$l-w%V*6Oh)GQ271miEm`(3<0lY(T*V%jK ziyR?LEmeH=Irtl^?MM%P-_PUd#mAp=WJ=Y+PXmPP4VW3E>uo*&6VIpWzQuD!IVlix!5^*mxeXFWFQr+f{cI2-{P~2!KU%B~!lnyedUiQHDNsiziirt&tiKxYp@r+zC{JivYU&nJ% zUu&R~w-%{!o+|9!Jmi8A!+I@Cy~I~!!;haM{w4x43gAup3DY)@>;FiMzk=acg`7Md?`e{f ze|~+b^x!OG1!L#Q=h+#^#5`4PJ;BI~Z&rBkYZEksXZdA-T}cvcOHp+?`FR40)x=tV zca?wXpzbi)SZcipanKaTXPBX z(YRaP$xb@q*X1^!d;$&B-u=Y31_&ABBtWTw~A zvlg^k`0b>lR)+aNY=YikY11tBS&xU#&l2URVJn!4CXM4Fe90kyQp}Oyo@`U69TD&~ zTJ_OcmOv)c(WoCVe~aU{NZ24FW{$v-75!V<-b&^nR+y?ug?Ip790Su8z)vK?I_tlX zXY;?5&OclyHCXk!>Ao49b?fMDKr7g51q8R@h(^fRGI@hLDqPBE9q7{qjs1Qb&_|W_ zg`~}{t<*Do!ZkYRbU^0m=4zq(E#H_6arJKqiCUED+&;E(I@h?1ycF{qT9#*?c}dciAJ3Vlo{ul&BNusgtP z>4P@RU{hjNL>mOv9V+k-f_hduZMTkpJLcejs{QDEenTvtO0SuGDWY#ws6@RP^GA+!*uWN`g{)%E$EFJSfXYvxfat2UTN9@7Qy>}>yY?f`5KJkVJF^&U z@1o~aL{F;!yZPtUbQXN*pT5uIvTRDo!H0yWslVKGjlj@eWuoNQbh(l2G{o|+>c^S_ z6|xVSmc~9OlcNZHbO?xKY1L24E>;N%lE`5t!*v@3-CZ1a6^--JOXZ09*?*@`-Bb~l zpRt-vt+toxbAazjO!4jLOQHVqSS+K`QKfSIOHGn=h;yx+v-P2!VivG8ReNQ{2#z+9 zY>i#s{IN*1z#ze|OSjU6gmd-Z8WM&_>)k$2iP-8bPT=0!@LAAyyH#NtoJ!``=FM%L zXU02UT)VdXBqNfuAP5GTbrRCh(aJP^=3=dg5V9(9oEk@FU z8|UW2DMiM!bz=7l?`Lm~5q3e$WQH<@fprBUOJ{^p4})i!?Lzu_j^zuxFUPS|Zl0!# zkiMJ1pJ_6v0uW|b5yep1$#Wi3<(NUXMU&Uuu2_{r^vq=`kk=pH+^ z+MTAjCjbh#smtaObf5tnUe2LOB0oD9noa_#O-!eCpQS%MDQ82~RYOg1cD(9$ZqhvW zALVK1;cNmtblaZaa$bOVA0uhn$?ZL<+)zQdwC;SDMl!I{ zRIqUSB8^7OC~8npY-akGZzpaVe=D&4L}eaT<^tickesM_?414e%HoXsf^gbo;|62L z^9X_WbwBo{;3biu$t+pHZtLFkX0Bd@pi?T!XbOer~jKg;W4;%YAWHazO&(fooncaM7Ybh?%ER+bd|UheK~(% zm0^^|mMa8jt~6I`2Xbq2pAsY%8~`Gvl={U+n4Aw=?cu|fm4h514We*#Fe#!WYEiK< zd~bLodD=VZ@bCSF^^rny^#sx1Ouz$B>#66e&!LU~h#cS8DeTNSk8z-4yV}GsZ`Rtl ztEV?Jb&HH(l*Sa{dxVrTkaHX5Q@p*6Jm48jEsXwuiJ!mz2F1|*E1saey_34ilgY&a%l-sx9ew96u}X&>w-te9iFGS_14~=Zn9NP~vB0{e7F{3Wwg?s2*g} zN*=)5Jes3+El6s4#$wy=0{5p8=5XroS>|ussFF`+f1P=z^_AoZr!>#_tO<#19O4ciU7xr0N%n#h%XidHbd7F6Nz#pTLzZt4fl79j}2HNb<2~oJ~*&WV=u)uhsHaL>fD4H8@8SN=qpo z^)8_jX1UP*E&0%#fwMagp@e9@$7O~KV*i~dDI#l^zo0)d1zo3e9g#OvGF6P}GWUxQ zg-PxCuzX&0Uc-V^l|Q2})qZkNor-}PSHfs|J0|{YbhntsI$-u5sbuZ^7OfX<@kB2* z7(t}B^4pBgbvu`4%wI%W`ZOy;J1bi_4&5LxF+zpYFOPY?h53z$b;#%H4sk>KIz%N# zF%orJSNxyDiSnYKa!hsmxfy%=;4+YvqsqItm~Hq_;Tl*kP!x^ok_1$}r>#4xpgbeu zM;MF2!6P!V%79)s11a~k`eLuc&&N_DB=*9pKhw`J87KKDv?{uI2pG#RE|p3#DR{o5rWDbF{ECsl8{HYZ**BguBm;f$ zyTV5kk2=B43PQEsizEB1JVG(escNII%Ady6og~Xzg8&N>XYf!*_z1Q2?k;S|nl_Wk z)>rS77|5ji$B0$jaJr0M%%3kZ#yIlF8f+^~e~vlfa<+61uq|S|XpvJK>3vSs3I@G} z-uTtiv>J0F1ATs$q+%pB(GEgfFYvCU+v2O1Gw|T~-G{@uRs2Uw{`thRjZw;7GLYpw zjcq!<;XkX#O@TkmvXn6894sG*j*kW}D2nyDUeIY&{wQi(q4?>rTs5tss)Q5#qmxu( zrs7IllaxyNnS@E#{O4|Ns=`U%SOm4QyzP{O-b~M;`a4G*SKah{7DeG=Mr4#>Gj(hh zCE;Mp7mhxAq~61LE!whxb9>qviRdK6XqlBmOKO1F_X@$>n9E5SYCbrQID(v{bf;}; zFt2%iU3vUI4f@AHXEb@PCI6VIWcS-jz@WfLXS~Lz>3E)OosmLTAtA0onJJ&V{mGdZ zwbQer-KWA*+-VqG8o8AE^)UCIuMSA9HSBm&xXhM^|6SNv7~ZGzhar@rGY{_3T}3;{ zj{qPUA45Q8`RiID9kumz_WXa>LO^B-@UU|oI8R$quh+Nf$C-y-z}5Qpor<5>QFVagFr<@R|b%3pStx9shl8R+Q3~28w&7L^F>QrC|jh zCRL=igRM|}^`Qt+#$l~GO4($h`fX^Psp<2NR4Iv40{6Qb^8gu00@mNd(Zp5xDp6Xe zcp=O5;_J?wExOLE53?jiG;B()$Tl$!%|EVmJHtOP5SX}(&2`?`BJ(ttn10wrDZmHH zhcw>DmLV8ti=E;n4en$jL-BA6@>7D31!4<6OojAo{lRqKJyCgT(@LBH6VW|%YE6Ac z|M3`Zj>0|^#v-j|f^*80lqE}LbvVGMYEN-8G7TJqM?+r5djBo_OH#soTb4u*`wbI_ z!iJT04huCT(r{54FW6trcLuFjPw+ZCQb0>}A>rp&>gdgRJ73xIW79&X$=ix=IMHYz z{lT7Q3F(co3e5)7Zj;kmoRvR+vc2^r#?p{CL8{fMZPj^PM8o9OkZ1cnr$NSQ=`>krm`{Cf7lA^2WiPak%kv|-8LykjF;tH|=DHv7Hi-v=neUqp;Z3YXE3ef|e| zK!(4;ZgmecdAVD#?9>G^7frUJzgEoySg2GiT05-f3b>i(p~3rP$*+Mz+)8pGj;-uT zJC+p7F6WY;9AeZt3~0fTFNTk1XG*{B-0R0m@mBb+K9163(Q6 zm)mE*Jk#=Uj`R z<^w$*a#Wf)br?hP6+4VgD%)8=zT#@X(CGla62{SzlRaW*ikye7uJ&?jt3y!q4#!f1 z$OeZIsF{f+-{fZvS&d0S<{WXMkutXAQ!C{nk2yO)Q>p%`DX-0Ye{@s`X!c@6kr*|y zD&mrhF4EjR4Q!3H(Ch_UYUq9or1V9XcS@m7GXQ#+W5Lr0>8(}ea-#U9L{jEF4PfD7 z!oITPlWbQzn=%Os2CyZnnANjo|C1avT`p(AP&a;H>$bjf>z6XZ_wGAw~n z!R+GnRu48%zCOA;X9b)qZcJBf6@AeTaRWkY@g z7<~ zO>Q(~Cg)w%39Oy`4@%sLDZ| z>A77L6`JyaP)|b%US*WY_4LsvebgdVnNuyf`GUMRdV{zT*>W-3+~r_C962niEODsV z(NvA`Pyy{(quOc|P~m=w4d<>lTr-Bj4d$-Rr`TLee?EyNSd_ZK+_o_4B#f!DAkq%hQQ3>(21mx=H7PV zAnq=g1EQ*vWyVNY7m7(y#<+*1Jo{lp&HzTm&M;T*c6e28iSrp9CpKn6~dots*B`alUEXAlR8pl z6SfGXI0x5HWF06dGGR)nG* zS&mMa!Gg=8`o}x~?Xs7r%Si=3L=sQPh^t|*95QU)*?g^5@b@|SH}PNm^7ERDNqB6TKc9{M=Y>7tl0%sDJV@uPo3 zts@t6&zAx>6Ri(-_PT=zlHPmu?%|sNT5idEn`(jUlD2y{1+!C&B)+;Iv=?;I0CU0ndC>AffeIeH29Z6=v$_jNLtj6eMz1uBJnT!6g>J=u% z8a00$mhtIwQ8*UB=IRRl;PM4XElN2y?ZAFV{tR3HwV5a1RcG++UK{A$loSQ)G9kZc zjt2M$JpMf82f~8%#MhqTQr4pb9HX;N4sQS^Qc64(-KG|IV$s*hZmx zFfz1x+&aH=8!c9lGDqrdbZ{nNXwYlV9>|U|^L_zLAhuUO=~=*bf%C1~LpkY(S^30} z{L+CG?Wwpx^ha2n-ru;xk_Di6M8*<8-@5RD-ljCa@acZ*aJlc{f3|%Q62EuD0?k#l z{0T9d`oY92gOF8ob}~>}I+%W|7@KxVpcUf^|5Mk*tSnjAeMP;))KH#MMucJhXBY~M z)w`;JpE=CW{6;|5Nk`SJ?kz5qKX6<(Ss|0nE0*_8L{KEY#&D>@!5i5$@zz3W&4{Tr zq{dqDtSV0Y#jyBpf3V8A0;*o9<#B{>xOg;|U8ZvM6`%-QYTI2^gF0(5*})&xqlXG+ zYK!=e;%a{9MM`~NUS`PIjU6$LJXrlLr_^}XbgQ+Tm!tNvUq|&DCnETU1Edi_T~5Pp z2EXNt5Hj-19@v`PUWK5oYh+uE@ag-}M;bk9)UpYf8p{FIh{J^KFpF%J-&Bp9ziAeeK>fxvg=u%1qHO&&|s!>1@W zrxRLk!~;o*f3^C!6Auu}1f^s0lXxJ3@LSZc8}R^DX=idGflP|0+M?P^xPDcB@)783 z^&@}25DXv(e{aMCC&2*q;b3VuA_3@OL^(Hot$6Z9b+(+&iVn;^I=xuX?Ia%1%5k$f z@xaM2fE?;{dwNq)AE7}8p*Xi>ChMQxTW>V&z}|W?e-h{z8?VexJfM&7X255ZIT-1= z$Q7{bi zMq!|Xe`e0s&S1bGOs#SRl>oTqu4<1%23|51J1fG_ZYkD!QH6e;_HLx5LCYVgsf`@3gMG2D(X-@htEB z1<0X=Ho}0Dr@%I|GhCcJ1xg(h9HYPS6zGlkw9vqg_EGAcZW?OmDFA&-7v8Qk1v+BQ zDx~bh1N0_SW9;q1JfOygjm*Y7zqm?5$UmXLS|2ElT*R4O71H5$GZo ze{sL8Z> z?VWDLmohY5blofJ0D<@1icv(6=gAb>W=LSUP2QD->o`fG zjpW8fkStnl%{MXv6dq+*jYZ%jBjA!@4D+xu&^kWWG6D$Y4|@)w%t6wfW6Qg(Zms`P za&g7N9k%u7WFye23RZ?|XCq)Ylx{5II~zeF!qt*0K-dTZ!1QkGesMVLECtvDf0bHE zZ&#KA-Q;z#9h|fSrgLh&(+;3>iWikC=NCA62PoW3)`syB zbhSjP^^@Wp>M0ir)bqV<9S{~2f8U7*k}@S&HvLXKfQA7grTy862Q-zEI$m#A;sJs= z=6PO;2bBA~8kAut9?<^ukc~;;Bp%RlD@I+t5f9if8(-#5JfPF!S0Ov`0KXKc{DpWx zNvWOHXeS=v3(0&@G5PD3)0iyN?CnZBpnGwc26#{YqjUrpe`1s0;Cwsnf585eU4H+` zMmuo%$tJ)3WTzdtcqW_t0cZG|`5NCDQ+uq`eg6A5YJ6*@?(clZmy7XA4AhL*U(|SY zBjFTdxuzHlYc|OuLBAkvTvJ(FJRAAhPx6SNX%Efrqf*ma07%QSmN~GL8tWoGY-oGN zAt!^Bxar&F$-t#Lc^P{@fAspJkvH+vm%Z1dt5c0JzHJ|f!@NFlGvyEIPdZBE!1i)& zUC8&%_XlHuA3^A?8)RCSHpjKo`SAnuJHwG52XA}wHqd83uG4b%dY{De3-<|sS{>g& zhX0Cf@hb=oxPqkAala87obsI;KzX(cx^QO_0DzFm6TT7}6oolKfBd#n6mXfC$)LCh zi3RK1u6za}m#Ge;Uib`(!Uaj}z4RjE3yo54d?s>7D;+GPtU?(!ev9k}#l zmp3hFVm-O?4qQ9G$?rco`30^&+2psMyxzJUzf9WdpPhF=9Y#?NiOa^e;OOnS7=7Jv z@AoDTRqt<2iWSL&XYaWQ*}-D8i-itJ*spj~vKeaa{U+b>e-wDj3Jiho^(E@2;8cV8 z?A(D&6&d5=XJARZF&-=Iaq9EGVggH4k$0aVQF z;3woowsto;Ik!tb%bv`sI-k)Yg2g6D{^v}#q}c$BdcazV{`wVf3=8sAZR`9+EMA@Ni(+ohw4000{&s0)ONTa85<0PK|0Q7;B&a@GS@Cy-}NS);2766^@i(59*DiH z=TPrY#!%ZgN3kj3KTI74%GM(51+~)<~7mJ1LXXN5R z5XyG81cejsPj@0EOsC5o?w_>)YP2kBmCJ^! zf8L%c{)FlJRwNubJ2r`G{kC2A79zQ8A_(l*G?hzl$3Kf`m2PUt>vQ?4m&B`$O z2zK$LbONyS*&HTN?Mu#a3ssrcMJTZ^e*}Nv*1%R;@2wq70AMa_SGg?FIhULwz|EWI zG#5dDC>jzIkmnu^hp0pY6o#=;U?;y4$10M6YL9kAga8N6l2_hf?NbQeeG-;oe?+kT zS(C*lkwcg}+5U=PTPu7j_EdGOrYY34ApdNGl1!c)hoo}&mW#=;Z->h(`7oxW#49a6 z4ulZQ9A@W6I8%{Bgs64G(50}edNFd?FnS@JfE=%8Q3qht4AZ@!AI4ED#Ha)Ga}yQp zR324_2RkFkvMUD_K&2#v%45o5e+-v{N{(624%uR%t%NCQL1`dnw-m3PiyS?|#UBNs z#ToU=^n~X-^fo4+P9p)EC4A*o<*c=OkOX+*6)4@XmIHJES+lA6F3K&%m8eB^zZmtT zm-h8w14vrw$;2>mFS*!FtPfcxCuk6_hx|@bm;)f;HmV*2fp1uvjn5*2*f2w=0A01cEcizn}5(Pga; z!*MXV9$FZD0J+r_Np=%`j|^ahH0PvHc^$SvqozWv$8gYheTvNeEUPta2)U{uPVqyp zM1GVaqL)y}9SHwSe~QHPDRB<;9m=mIjanM3=zX<%qOzh%bEBg@3G{Q=K)T&Qf zJ(Mv{AiS5H{AD`}A{;1(xM*Ut%Ed}KOWQZKD4D6yLs`TE@~zQr!Nio<$5JLTYI3Wr ziK@^!ms2&KxV*?4MKM=BrluEW)*gU&aXCZ*dbH}@){G09e;;)J=+wfGU`d%rwR%*0 z4Xacsi2c=l(gVs`uYjS%mx?M+B)%{CB!PFT9FiY<46Ikcy42iBAh1_HX{Wj?y|Ijc zCux9Frl>`XTIvh(9`w{C=~d-rI5IB){7qfw5T3K@siR!fwj9)c0hnDKM{pwf=?}zp zzVN{y6yhG*f6v*x+#K@J%p}I=ckgQ}ZjZbv6ST`=&(aMLLGoe{n2L5Xd5;dWfDjX|E3;ZD;9Zv-+^CxLnyu{c3n&4kZ`E{iY3`70lmIFx z+jLO~5V&dHz7_{%8GruhW}Z?(+l#3utqVWRJXNO1f9Y~Hu7{34<mCK;sR(sq5eLlIeBbQZ1%t-`zZ)4jp`M?UyW@t6?RF<6DmTrJaKRv}b zlO@p2J|%t7mI+C0RdZzV9%bMLIy05N*#f6^s{> z%w}+=f5TLd^lTnv0b(Vpa+sLBajxc>VqrQ6n3szY0A819#%52pvmzc^LuDZqz3$-C zNZM~VhnV10_2S>$x#y~)MUJvK8zp=4`I ze=bW`tL+6ZPrSsk@tOrBQHS$R2!I`)HTC&t1O884^>|a_H5q3FX`;~DnxU!SyhCn4 zewE9phC?p9cACMLlb6U+gum#+;P!c0wF1e->{AcoVProJK0ovAgC>OpOJ>C(+lV!PGG9M+JKE;>gPtIjJq_ zfb4q(dbKH{BlLjghoEFw`nkysR&r`M;cT|3>1;brsVFk`rOwu@;eg;b`3QC*e{dgo z64!Hj?iM~KOg@|8j!EdM3ch8{hO!I{;0{h|OZYeqbK(?(Pwc_M#3?H*@8=6PKiDnO zSY_y;XN(qRjonRIXcClG)qKR}sYr^!kHCd=V}-gZBp=v(dOv8gkpJLJb+)3?;*^EW z2X;73A4Qzq?sBCiGP@}+iVPs|e?_B2MUgitufp#kbq^8CShsQ%lWf7ZGnl89U`~pl z=w8y^FqzYERs`_YW7;V>DV`OK?1j7~>ZRKTl8xxFL(ON(!9u~}Xk~wlW*QcaUSti) z)+NW53U0|3k2NVYzgmz8leHN@X@}HP`cs^hx#X~JXoQ%`NZCtyA}>m#f1`3)aR-v6 zIO_`DkPO-Z*_T&o@JQL_X0Av5cr=-*_C(@Hb2+pt!IWk^=#r4byHHm9e$=Oz!O_s& z0J~n?hJzPxDr_ukz(tm*eHRRVpQ1y=5$D$DnQ|W zqj~0_`xe%ocz?E+!aP40roPH~;v+AQGul7J=F6&S_E7=2(rWJ|>s3yw+zqp@5oK`# z%qE3qAQFHu+gwZsL#B$na(LO4OmVB?szEP%u&PPJF`R2Yur&lG$05UWFJCXRmen{Vh9Jszj_qQm?kXP)XP>b|6Ho3nY*JCfz$Iy4|^3 zkk2|(b$P8v-FQ*#Tq0S$w&nW+=8sXSIW&@UOfBqzDQM)9Fjrc|g9(f!^@a&!mji!J zUHEA6WR%6oe@A-S7wo7aqq>T)kk&!H+OLY=F9ha1#_3+URTraWod z9>tQ=u!loF(uyZzmpZwC>RTn+p?zv=+D{ZA!JpE+DD_zsnRAuOoGR7yCk-bnvN`v> zQ21VgJ{wQC5lkU&FmPLh4{fm?)2V9T-QtjmUhO9sf39Tql31>NK^J8uX~Hh{-r@#V z`Oq^~<)Y>0f!g=d^cv_KesWYRedE{d(t~P?7IMAPyI;4LvZxeJAikNy$vAemQuAsK zk3~gtl$zJ(;%DRow{NB9)f|S3ePJxU)I4jdsm5}-V=vW{=lXGcL;i@{|JBJK*G%EI zr~Lj1e{TQG^7zHFHX7+UX4flR@XgX5GQsD%0?s9@yaCS-P!E;p*_+*eizWzWR1Fg7 z?Zzn@SjN<_cv{2mHm-NJ5K)Z9W-dB=Xh21;5bHsn&8~_bkqF6F5m!rz7mZM2SNCO%er^Mtm73(=gkNp%Md!+;-4a3|ay>(t{ zxWy2c=hv6UQpO}rYE{iQ>p>B+VB6m#fBzvo_jjdnem|c3^0*_#^zyJX@pRAp+|yKF zGD08na&Ic}zZ;&L_fp_x8lL;87_aiK@{Fg4hLege03SBk}Ahsp`u*88WL zowVx&ZtL?k6;I^{LR;n2>uzi%)VwgkhTQhA@&e^2a@%|9;M22~ zJo3I6N3s@IE7?{f{2{}dA4qR~OsmNre@-rBfG8NTHwpQm#R#a`4@eaZyYX?!dj zj+~_+hoF&}Z$NSzgJ4;88;~4%BMHWk;Rj;e$3ETw!C~!* z3Kvbu>f}i|<~kGCBRfkU4n=!;yTHzM%qVnjPd{MiI_;!J) ztC|=fecvt+b&Q70wO@L>e_+&+m!w5SkaN&Mw`9+m)q&L~c3lTRw2ej7g=`j`ogrExLWeohG{1vAO^KTmN&$Q-v39dy}d!&SscCF)!qha*R@1{ ztvSw0uES<^##kKc&V5@UMxrC>q~sd{-YyCB3Tj8dYY-3D&4BR-e+Hh;r07AE4FhkJ zJuT}`G&>0Z&9^svqqee747|1?ggNd^j-QVTwB5vED@vJd!Sgbb(GG4!x+F#cB z0~v2BsM~RI0^_YS#Rx+-V7%^n4irPWAINxZKcmsp%IYQcF~;E=s#~?7^(Dd9)2!Z0 zK7_Hc<%C0GG!ZAjf8N%%r><-OdzEtop1kyS`m9~vpDaDu(t)`RpvH?y>?&TYTY~`_A19sF!_P8x538^dAnfjbywA4nVu)c zUd1u{N+86|D3moi!@EzlWBBAv-ksra!{qDWze4g=wNj|cz;b1 zq@bC}quQyedGU}&KX?GJQ+)+;XIkDa^Z>SRDU0)Vp$AZdQO>(+v;hY_fOWrEslAOJ zfV~UmLvQeQ! z8iUmw?5j$!Y_5%Bz>ceIBugj7fIfV*X$%i1#en9D!Z@p)IVlDddqWkE8^wS=Ue2Fn z>;MPFf4~~!WK;zQ$AFpy*|+(|CZNwL;Ml$)|3Q|4tCzdUZ{WR+P2lpAU4H+`$tH09 z$tJ)3WMdP!`pcXA0af^$dBEQp0eoZ`IDh#O%fNTOWu(`;%|+#yfO zZdpdP>!u+?Avy@DCaFy`QAzg&pNt1h1wXw~ek3kLO*@E^csjvq3p@!3&;6|+jtz(pERmKA!3Ibt=8n;%Vw(S z@? zR!3iVB^uzqkF1|7(SRl-)H$z213_=f@rW zsQvxHC&K^Qjgt>x?{s|p!1&H^#K*xqf1Z39=%XLkSy_F)%;52Pm)U+=8~+^3_D7ip zuIJUpG_VI?e~4+|JHo)9U>bnSa#XV2t|97E{_{oNl=rq8G--RzF8?v6fxRaexmZK1 zCpV^nOXqj_?I#wp`wa;%9TM#>e`d`I zbH6mvLM`2@Ad%t1if)q+Sm7*h?c1-CG6T? z@suZCg#Izl!2Oe^V%{b<8NcF9>y!Gg>hJpM^o_ZGZ#g_tC;aHH_;u6?@Q#ZeD2m5) z1=X1dAy=(|8lzp3Yi^S!(bb{Qe*`OLd{QbPryi!kWuZ>Unw?HOlJIxCQ73T7iIe6) z?hcrNz{p$Hy4=IAR8(Gb#0@0W-lpM7R1PfCoA+q9>M$*Ys5!J*d5gWgcPG)sLc z#>+jJ8MFe?)b0~scW^y5R<&L%@&v|kiAiU%uZ0`lkko z0R}bx1@^=YF~Ej-$$N(++2lRuqdmnn%oHPmsIT^D!eTs5VtZH-9VKj-ff8355r@Tb zF(o!e=38lz{i5V5n4JmwrO4 zlr=*Cvr-}8AaIYNwWdlMtHwg2ZdOq_b=$0tu*O#>RdJBF;^hcBDNte_6*r(f{-Grq z`hek`3j>g6c`+oUs0)?*8vty1F)c_3s?IJqi#_=285$oX=%vZ0e?5fNUXCmjgH|I; zmQ{(ku~$S+W?>8m|AI_(OSZG*WC%XUnr)G@nVZy1c76wVA+=(i%2T)WcP%LqCk2{q zhpze)Q$yi&lG~I%tgeAFEmTdJVQ0x2N~dHuJ$saWW}qzHjB(5Z(Kwt zokOmioMk|3p-}LEe|x4Wd&{3gSy;<{*K9H`2eorB6n%bbi}|5y)g={YRIZCzfEaz6 z#MZ2E0`i$G7G@Q4R_%Fibf$*vAi9el^g@nhO_;W5HP;XpHG@L`rprfaD=monUdiMD zJm%tBpt2&DI$9XGw1cxjIf34|5R;|rSX{Uk6j!F*j0F3;f6Etn0=bA~Iz*a~eJBbO zqfS&`^Z1 zH2J8`8UVs9>(!I;tcm}yNDmgL0EEf2hxx#v(%iFPUs+BRYbGgBU3Le@ZhG#jf@O^63?mk;kmwsg|i5 zR!0mmrjJe)+0`+`MR*`9m)le{tn6jGxmI~4Ji^f(>(Wy6h+3T5b$mxx9KQ9h1wS-kDH6XK-42k8EjBs4u63-WOXHRs-7+6gJ?+C ze|wo~y4H~cfF8a+=}NH=f1v{Gb|uk%JDM-OyavVAGpXYt?^V$oRN~X%7V&7RCf92b ziVrcBXHveBj_{y6ytIZ;ardDzke9gPZS8Z8gJqzKl5<{~a!L=DVP?;bMN-v&0iNS!gDN%i%w60 zXR}W7>bsosvE+t|DcMmOgWOc2#OC=U2xkqhp24b>;-HoNpSeC^tvvv=n__o}NjAMS%aFg`zY z#IjGBzN#R|>(V|uZ7|P$2%T!{p~G>GTy*3ZIetABzL#btH5ZX4&IVjPICp^}bQ0T} zk0VEGj>E=gxRX#M2Ub?~__l>cf5typH#^0&a;fZD0pp-`Qj#K022@tLl*`%ovtAa1 zVjS=T#bNrig@xEXAwQw{Wa;6wr-D4QLr%HjaOdt?^m+_A=Rtm4urnVbM5}6HiGE@C zKa7Nz@SrB0)4P8ZWe6v&bn3L$p=Dq(CMn`1YMFi!nb%nSU5dEWkx|>Zf4!NGu8E`U zM$;Pz4`m8@Mg_#KPFh1wVxDw6rN6Xv2oIbFDB`p;oWVRoj=7E^PG4=)tjg(B7M;g9 z<;-M`!f8VDxw;~53zRatLxiwhUjbRBpdCZwkxv>my4=RhtG|>yxtFVsSS;z>o(vCW zns<~>?SLQ9!=?1W-%)2}f0yI)Vu6z0+=G9SS$tV%ePjC{+bJFJ9q1<{Rd7=Q^I#Ts z(a}o16kU)X%)+E;gyg2LqePP6hCEV~2vBr+-|ByXYpR4YVs%$OqMg#ZAf*>EW5?%1Tz! z$=7SFH+Txo(|0jmN{SBGSszY*Y^pI;-hbq)^zPe2gAIA^V@kme1KN&+`j8ofHtAY$ zfGXQ*XO~oo#0)H?e+-onlMpoBD`4vW_PTH6W&%y$12c%XQ*mI2qg3V2Hfb9Fxqjo* zl^4Ngh#RH=5^S!!s!YL$fYmOyLyd;5XrXirIs66ag!)!hoV$Ja3!v?~E3GK@{oIBv zHv0*&w5DTZ#-S{j1uwu@rwl$)kCAU$H@n#Me^^iNMqIa&HoL0n%RZ0= z*hE-B94C34Qu##Eq#w3&1jb7h^^ulFOuKTD3cVPda_ugS7~Q3_5rjNT^9hF%;Es@2 zN@}ZKi`efx6o-vIJ#}hxKE(Ztx-YuIYJ(kRZf`$Azns8V$gyOazb+xjeB`DZ%Tv>p z54-|kKrV^re~(wEQF(zhO~z=M;i}rCWBIw>HVD;;tJ~lyp1imWl#F-fR=d2h&ljB# z3i3Vu5rI>=V$D&MPCrGeeO+uDNAbN8UW2U=sbo?X>%lnKjGW=rtQ?J}76z|M_f^h8 zun(32mwNKIHAS%O?-+-wMr)okCX53WME$H5jKlZ|85 z&eb4#454r0wb*{fk;7;Tm$e$~DB&S>9@yyX#J7wTXC&Vyj`L!&wOIeZ8Fe@pA{7x5Rg0`-^} z7qKQ5e~B9{CM}5y>);)Fc9ni~U0+bs;pDz--KWkYHw#@f(dxLt`fwtg2f?OHj=vXwCpP^NTMRjDQPIwU zK8|lX<6~PP2S=p911e=yLqmATSt;;M51hTme;a?g9WYos;0(|xTgVAC=_58_l%v2t z(?wm1sjTe%h*x)qm^yi;oDZ=9+TijH$+nUHfFf*&-7`(cTGJ5^C}R4TLyiO8=Q2t^ z&c@-_+dO?p5gQxI=OzYMf0~kxA&r=6F~>M02P$*AFCp75qIiyz1p1YGHs+qu`x!aa ze|g!b;0S`W3f7=sxrU2cP!F-8kiI)y7lb8ILT$J;19wa( zdTzx!#}e3>6k#ZbdjWYZ`FN&Hmyd3<_|kKAg*Z_QyVoHzB=vFkXo1b#cEr%Pn#9^& zYREI+r06ynG0$zp_i-ht!kbwk2f8DDf0&xb2!c?|N4c+y=a~Iz@M?R$tHWxF9!DI3 zn+ZP9Z$la7xsAEwqI`=R&Pgc z3X8aAP0DC-@|6t<=MKxWnRW^0?qMp-;SObc6Wf-2Mm4yfV&1AKgP_J?E!e-Xf4k*Z zPe6%79*{Hl$qG*Ti%K0ye=gxj4iJOW^z8%gK8&03a`xCQ7bMq`*2%o?E^yMmS_o8>kW%M9qK_{MGCPt zwb>qcLZepH*P&Svp})M{dpXeUe|#?U6n3sMTqB0{RKj$m@5yq~CpsmENDDa#lkO3# zLMzl7ayyLNr3|>O_xRnWO*Z>BQkjM4dPrCiHR)v49^Qg!hSDUeN~2SZ8mRR&<(m?S z+KKSUZS1vH1aF}MTgW+nQwdM`C=VyWrid!b@OaYebR0Pe`R*nLA3F}8e}V1vxG75U z#+S%VDOSEyFS=#$76<@(Q5g7)UHijB=%~)_eOY7Gd3XpAaEhO0L=t?PWyP8`qwh!> zRt@@4!;a62iIIapa-cVs>U@*iS@x}h5b!on=7@%v@L(0#2*Xi4$YVQVyEwTvYr8?9 zkQz?Nq+k$7rJdF>3iew?e{~UPr@N0sPndfhFR@Ok74lV8r!81gZ|mG-!P+kFhvS@o z=m|qrI)40@uy$w|KU9Rx6el*C9~uIjLJy%+h3G@317OVX5!=4{zz}em4fmnLtn$qr z`w}H+`lfH&(Yah5YF!8AQ@U>VG7?ZhX=#7h1~x^d`QkIRujPt0e~ORYcbD*)b|?KJ zuaPufg(=ME@`Ff#IFiv`e?$Ibbi!Xv{9-&WS3bu-KJznBnx}WP zRVG6gu1}^Caa)&n^nCixZLytL-Beh^Ba>)| zd^vmpD16`P@J)JtfAofcotm2)C%BhSVhCX^SnIy?**Sk0)5L#k@eO6*dp{wUk(XnZY#6lJq)RlRBVBo-}>jE%x!at)r+8xO~L~YYye?W@Uvts*SvmPHovqLlT zB%~x9bG_l58g3$h;yRQBJIi{kVPr$c2mKyo!EE#B^%c)yAhaJuA zW~6!82##|oe*jNuHMZ5Z9{da;pZJIqE$eVvg6r~ahkJK}KO+Bgl!QN$g8HwZB;2=q z(_`25DMO1j=(Rz zu?#4|Y9kJ_i^0I{Nquvc!^>dc_HckSA1?+&QTe$ycqxMCp-M`Q>pdR-Wiucz!p3wWR2d06eYmNj*UBTVe_0MZ=WZSud|3`Sk`}A}>yypE)n*oYjqJr{&|sRf z_?^w5f4fgN%WgJWOqLw?!UCsaYB+}x>r!xMC$>XgnKo}lN9 z1Mh|>AjeUn=eg(!MS$uW*T0+uz83jWe*McyD2mIEw!S_&30$(t#rpc>B*>9xnxw|( zVCS8;DS#S5GhXynzU$K$u$S-{}G(2t#;C5f>1F`@rvW*1!uy(5g+|{OSTC zFb}=&#f?M2aOzZ~etqx|q#uB%a;n11Lx7EIro0miE+B%Y{PJ|w8;BrA@JQcz2#WEo z8qfFw5p?_PUiAxzP*i2ReQIAo1mxYrf2%hSfiH!-%E<(jvge|?N|T-CM2icP!1S{t zsruzFCV^>F>kJITi%IYWb+8IACxH(FwfXCllK`$bjd<6KlYo2O&Z^PAK0yh7#%v$6 z3zVRrt)8lSgAz20vu}PECjoJb;O)&x&~zob_4Nrv(9dRX)^vjpxPC^y^aVcPe{vef z>GBJ3z~y9p=y5KPfxp%A$GkuWTyIwK{thhg>pg)0Xa}}I%@Vd}JG?6cK zK*4iTN}vW_Mt~+P^xdydMu4VNcLLze0#F6+^kmhW1;FnD9z868Q}eH38$NmNqJN%; zhRH5}ivEk!HN6u1D*7*2E8&f~e~bQ^Yo*5JZ_U5fzI!e1lK-L%LI;H0rTun#6bA=? zmi8B+@tZ#4UE0s>+pg1V^`FvyjX}hu@6!H)YkPMEf$!3OTmmatX?JNqFN>SSYx3XH ze*J8B^3`41&k8bYqWbT?wf#g|8cjLAK5P5&RoVhtE`MwLt6~ySQJfXLc0lUEI$cq4S2@ByVv) z+;D8_@5TL^YtcKdNgeO%f2yI^UG5FPi~F@uOtmP#A^)>Q{~t!%E&r^eyNmnpKlzY< z`;)7<|Km??`RAY9#r+@V-!1=jf#1KGLH8@))ep-1f8^i#F8iBG_HSE^xPol4f5;X~ zs1W&3+2&#RXbepdas zv-$;293vl(K}J0jVt+ibFw(zzyHDvm7PtHzx%ukUxg;PtJ4I5U2u z>iJJk=)Y8~kH3%Ze?0kHvHmN+i}mqaH)#cTu|A;>a_if-YJEz?Nh^vBfb)yISgyH# zN{KY-_dcri^+;`MUfy@+u&gES{5*$xmf}7AsMc3+b?0lKujlyqEbl{Kf8X$Wzx>0|$nR+U+fUp- zU9SIe(p>V}6Zq%K^?%%CiL`_F%|GLIcZ$jmfs?7H9zI4sMKQ2Fep?h4u-{wcv?|*ud z{iW)6IoT`am$CFt)p}Ahk{T7d%1%j7nSre^pgoh7(ogV|#(u#KUb5Y8w{L z?sXcl;w6D=iuM6MV6OfYxfi7XBhNjhsDnm5+_V;R;Torx^OT20-DTu=iGJcD>=l*PiX7kie|+Ri1Wd{6+H-}x7fo8^g*xlgjbPwb zJ|87=gOQurt@r{ZPNvyJIXJ$nI;2CZEpB>h?pvcK#;2N81Q*i)do4|=(xNVNs_Y+w zoH4dh&Fy;yeZrC?72?QkD&tqCQz-ROE97RS*6k~0+58Ty1WqC4^H2qYR&omQ>6a~A ze}+JEbH5>_@3=9WbHmb;B`}FXtFxS#Ur;D&$fFWpMnDfv>s4{jea1SSASj8W>){u{ zu`-@Ae0vmp-;&a#&#xx_ON!H%LTsbD|4W7VOVu$&J(yba@=MWmmA{O6z$(JmWahAoM8r*UmEubdZGCk>RNeEp2!cwBNP`GSiR`k#?n;Yv3y3rV z(%pTf6_D=a%aTPePZmgjAyvn$_k|-=h?O;8>#HjWiz2R^gf4rvE`A#eS z0!=42aigSDW*ynbdw`e)&r9VnUzfvK-Vr&5^MXg4X?tZ1UE>PCrCe#ZZx&;en}8WPSWbCk_GD22NwgbR@|s<#hC!!-#C z;b*4XK9sQ*>1=q&K!G2gvWYQt6tq>Pr77T7KN>qBQK5?;+PCBH)AM3=;)ThV5lh90 z{%`p-^k}n9snP|)DmEUEXxty2{t6Pm@HB!6I?7lE zD{9xVD?;3|kG_p+P_QL!Cdlxbo4pB{a@m25q)PY`Rjcs){-lw+$jx$OmMZb_{WlWIJX#l_}rbicb4PaE$L(cRzX7bmbht+`jz-q7YZf~ zj(W%76BkJedk5A`o^PAwA78{wxmE~+e;JH>BrB+&d`;G*de?toUA#+EuoKrPIr#*W zL!_b{gz3P0PugY*8_^7wUpD;2^1*y7bS$+H5K;Q1Iki4m8q-wT$)~m6NHMM;^2_&! z6!~~$XyA)QK>e6<$osHERjz7dFLR`i{}Vb#cPXpSj8-nyU7=8%0P>$%DG4bK&S;FQ ztQ7Bo&-ZFBqFbanwyk`o`9m!w(tCF(WxNqdI(SSJdinE@gr2@XNKK{N*O5D>B*alk zy5q=7?dz7Q)YKkl4$h?0=BmlEKN-;qLi^hIGtZs18nC~wB0ua=l#M+6&{HBsbMH8A z&dl)PqK}sfz1BnL>S0DYM5ZmifBu0`SJk)Ns4a;9+Ya~n2NhC;yeuZ%q;-z>_=?Tp zXRq54@3G$9@oyX9nj|lGX{q^Dk;8&q8k%>|m4wExJ=goy8kk$1*%Jvnhh^V2ak=-> zSNUCEYzZKf8c<1j+W5*wjJA@2kgqk=F?Lb;0-LJD4Y?DqeW++>rgUkJo6bFM^hZa} zA2bB3vHDI|eEdQE$WW1!qGsTMM&ILC;`d5zBIN|VU5nmWRguB<>sSjq?4qo7?j>61 zbev!lq|sEO`NzGWcR5;_#HVkhPJG~98~)g~a5Xy-C}es$Rn_fDN?-k>jaJfd(E;Hz z8q;mwctqEyIFOlUq3zF<)|;YeNOmT;F-B|yA&R#&b>PlC-53@(&o-QHbBKgYaHAQh zB#n34XkxkCAu?;%FBR^9G==SEkg{a;Fb%Zh*Ll5T@NmFa>agXLd9@V#K1)?qp9Y7c`aKU|JT?X9Q`Y&=>rRB>!dKmnXAGT!Oo)c5#|r$YhkW=?EZXbb1d zEAfTd$%y2w+Kfvla!U@enDQ0h3mIJxvbaFrPw`57rBajMgR&-{Y|zg#l7-Ja(*J%_NaZlVxZ?#X{<9UQ%fUq9E&(nbd9xe!=-?aj zwe)V&hyAT7bQvy848^jgPVVywE^Gzwm$kzMtT4HiF7U9Vno2*;Md!VZd!76H_sVJo z6z6WYAbB z{ZWkSAa-nB%gfiYIw9tUtRx(-te$0I%Yj&CDs8wv*;6(~3CoJN|C6 zM#p#dOW1h%O;pN@>_AuGof^|vfyjdf)jZ|Si1_o7FB+d0ti{)d{NA@$@wLElc;k8x zRbJVsziy2ZQ=7x^_1w08Jl9O|t@H`7m=-_@Oi@?ibPyBo^*nAh@EPCI8)<`loqv@$ zMc~9})>_6|QXb*4R8_IYGrUrym?pmx>D;cGWc}UOZG4tq#0`6HQ8{V?-PA@>{xc;N zl)fEnehh!35TDGuD-ba^%GpzaSDi+j(__;#F5hzWwX8OsIh*tM`BPA~LM$9`3$J*C zud6qK6I#O|TzdrIoGhLk&uo z2_xREP`{TqyrMOhKd(zqh7h~a(5hB-+@G{@s%Rcau}}2c*TFXTOB{{o%e#s=E|U(s z2_vf6Q{<3ghSx>enT?c2klMqQ zvvSXRsZ`ebI3aN<)KS zHjtZ0@(b;(i}<5HHbth1e;57eE%~_@(a0pNLH|l?$Oo46rJm;%{^x@o7}aDJA|e+^>7$1Fxm z{)M0NF_3;7Kh({DjKAx6dkB4YZ!L^RE$3u|wtbV_17j#QO+QQgPvd&CeztQfhmghj z@u7s*kI=qdYI&@hy+r@8J>U`Cs+3@a$7cMU*#5R5*%Kw0uR!dNnb9_0eSEjJZueN_ z$7`XAVj~*+<2i%? zZT)6E)xn6G>?M%RTIhNTRB3d#=4nrSeb}qo=NUbx8~9Xmb6lV=O{^1P7Q73N{oo2GJXR zYAcvo?>-kXqeBQb_8#3&GXJ~;dbK64-c0;L{Rsn=X#0zWTw}n5wh|A$h2JA&sQ3{X ze<Ku#?QkcMy@Wze80ngBfbeN4`LG^xnypwy?Y?psFIX z@_MB6oSoexD?d~`A3uW`Y(1Er2+#TI_K5fb1pV+VUe#63@ynnnWnuKR zwtI|T6jqt#?ZQ8R3~Qfuw|MH0#N-(7MJla+-!Z{j|8OpRu%7PEt1E6f^F66z?q`Zd ztv-Q>kZiJ9$5T55YrTV-lHyDYLC&roUu#s3e>3th4c{-XnPn{s?+{i^<pH zJM(2|`h+FPwXl6*r8rPlipgV3wL9^r^?yp7^y$}FuQ1Mf7xMkjHW3^)|M4~hmP*jD zQ%_Gx41F3d=tOwz&hr}NrdJW$$E5aeG>1gvjv?PNXu@k9j7!&!(Y|~lA2(DiN^REq zM2M%(qmQn{fnoQpFt67pR$Z{e?IH|QwzWG)d)w;uqP&{xiEVN{;`QJW!C|jErt%JT zo^L!EL=tYLnG6KH@q6-=v7czx^PPV|(z`}XaFsD9;rl%93~wKfMoDIsMBz&Oc6MyO z*I9>K{vi4lTN<;14eGC+%3FPOHrL0M-<{sk)qI2^AmBdX_LhKP^{ct(Itn7XCL1I$-71!F-{(93K)GM?~lmW zT#l7euaLEMnbk4lC05X#Ae<7TWO?sTjh^wp$Y!Vy?q+gO-|x!jt8&FB?#KQ8d{7+Y zbR(Y{@*1a@rG`>(#$Ql>S?O80VFbq=&9Bdr?y{&dWF4;DRqp% z){6n!^4spk6>X7IIVL8_xgz#{CfrZk;-R>ez@2=yIX|Fc5f48k!!^W|+tN#RGcqyc zIekd4BEGmEqI&GL}N6#WTRo1*ZFk~ z;!9#)*jN4W=SyE!sc&+Yv3|an9y%qlx$B1mFS3vqBhRbQn2BxQzPq3XG_1 z9u#}6_nI>3ZOs!v?Z57YCbA%(socAYpU$gm9sXLH&a9dt`bfF$1^#~KWDn!PbI2O# z(Ve|_V`>ig*RqCsk4dHePzZ|PR=H!IJj{vtu>W9cME{vDy3JzkH0@7E-|xARfwQ6l zpg4snVK(3*v+t>wmjNk;(X@hOTWf0P_+tqOWk!YZq4(ED@0X=SnHy&lztQ5B8E3L( zgsw3dhq{SAmNG}-VLksIDK_pP1}grn%dhEgl2|}3ATk?&z>Y9_;U9Y%{w&RDu4e06 z`dYa6x3+BQrIx>RqyWv1+uv4d@n03V%}&#yTM7AddfbNb;&4oJ-v0}38$WO zzXt93gR2rB$WYlg`b>dP-h08Rm#pF8TOgAwiP?qtClY+jO0%5pMfikj;B&3x``&CxVf8JBU`%&JWII#lL-|XPKSwF4TN)#LR$A#@ zbfzv8jhEEZBQ(tBh-2W})hr`)o*{r2eDKwCca?-qETkyfPwt~Xt5Z9Z+qoMQ{wqY_ z$j}3MEH9(02f4k^?%E08m*L3XaT{PGRXE`f;G113dBAZxcVIOEyza&JTiS8d-77eD)_JcRYA^7?(Q@S{Xye=Z4sD$F?tdn7#cyn>Jj$y`P;E6hslPpK>8x{ z8j4E>65{yO#@%6Qmrjuml?N{trCtu2{|1_@#ag6ZhVwoRRS#p&#||H|?GMp52`l8X z??v}vFK2p5BLsKJ7U2z;X{i~|9)4EHs3<6Gr4Xpw!Ta`^xu=TBevLuVtE9CB0_&SZ z-Yt4Vws$f?<2$lkm3wc(S*@7hrj`SuzEk5n>XdW`x=7vJ^SY7aTP$s-gc=fe0qxC8 z?}>W7N!i(#@#QS?OM`}6y+Pg$Lk`+cZE*JLo~fI`B{mFbtivbU!Y+^TFU0ZkSzbP{ z`BC+79@@}w(q7Xqb{+X)LUWCdkAb2{`z9p>VKO~abwm8(yd*cUVqyElIaE9-&b*>g z+Br;|--z<9HjOwvqM}VwFc|N=12FvP`0%ooe^4(Rb5}pZ-(4y5DZUoy*^hKXHzU8; z%u0=GP}t&i6+CtA!!zUOMdEAqDdN>~A?FyL*<|0GE{V+tUcL{Xqsi(T!+IjoHKUeM;BtL(PZasOrZNIOsAWlK=ya)8hrZMNfn$t-4n5yb2~Ak+lVd)mkC_vSx;zk{bS8Q@FouQxg$fVy{Hcg#341_Y&&1Awzh`>;+z7>u zCJz0aF4c`SZD>Hu;fpMF`;UvjZZ_V%!dLBMSQHXJ*TY(Xk}x}(SD~Bd{$G`{)lx_N z0%^Fzd(nngN1?Frxmou*5(){uX~R3oTCi{fk8EY+zcEv(h^gUj(Sw?kb1JWNvbRl& zPC}uFIpU{hm_i37iQowB`{BEtow%XcUi4LUh3qXcUXLL+o9LeOw4VX%t2L#MGXcu7 zkd%e&?^s{c6Z%SXjB&@e^`cIQ6LU!7(l=dUo@jv1w9%2}?+0>zE((&bI!6v$GZJV6 z3*xCA!WFS2mF^&1l}>6s18aSzWoM{twyNLh?MHB|WNl07hr7A#ZQSKx_R`ID=%^X2 z4)^z!&%Oj}%M<0%TDt;RLNW}2$R4BRLro;rE0?W#2uvR%#mb`fOtFG4m{kN_6LwlD zlY$8@^qf5{(P?(F)WGWlEI7zzIJA01cPAz%Lk=dDk|456F-dKo!0Cu3NU zE=SkCk9DC6kDA#AHI$!~eU%>RD6Yt*%b|{p3@9)>k`*SAl%xSb&ev}vCSKoXbSPbZ zQxFKsn2`K#+Hg%PZJaZ(+ieNlSFHYO-1f?oy(zL=M&VR6b}(OBfzX9E^O7m?+b{sm zyp;M_v~1Rid?Bv|bCE%s#6{BkPTRD?TYMKunrP##piC^jWmE3)adww3Mlj`i5&mIh zTllC`8gAVhvo;QZU~zX($#M%dzpl9ylIuL0KKR`3)~_fjJK=<1&)=`;GNmfjL30?n z373SP3d)@ka(n+iO3AY0HlsY#rdea2F%Wf(!{*DN`||D69P+xTW;a`=Qg8Gh%) zRb6RgvO$C1-5XFQ=a}elt7Z^$Lp{RjvN<+@d6VEc5Dc_pzV9%%$sB5qeQW$=B$RwP z2E0shFg?}N;t$Tam@3Ak*!Up5eje=|eaw*=8ljoxJ+CWqw!uCkp(PM@BhfaTMdjWt zuz*h@wXr0}kC?kge3Wp%?qs{Uj0j{nG7g(N&{kx=?lIfaJ}Us4V$XM`u3r-AZEyrC z6)YGG2mty|sx}NG_CDwY?pu z8+K7q`zYoR+O+|in4mdxb59ke>DvkCLUV>^ zNiKonvV#jscAxe7^98OMsK#yK%8q}pfLr5b#6pJvW$k9~n4m!4{+V(w1aNCy zJ>suF4q0hyXfL}e4a(_@SkaZ9>75X0jXg(yxd`0T%gr8OmHj4na>RPGEX=PX%$T)3 zds4Lw1cU7bI{hj8?RdYqYff=pA2(cHZ34h`-ETE)U1(eyBW`#kyb zs^NMYki1#n+`U;HyE#8;SSRDxQKGQ~x`9>bPaE_0G>4L#HE8zdm&8z~ncYE2sAz&y-e#gG(Cd!Xr}e^8qI(H%l}(2S?i1`!|=nt9<|g5Cu@H z0Y|%X<7pw9avMszQ*Vmnj(aSd_NB7zLd_C9Y`)AiJw9lm-dmCyh7EInk7Ig%HetR+ zpKPGNFo=9!mJ^YcKmM!lB{P4WRpHfExWJxd1zWIja?y5j!yq{<1X863EJsyr;16ET zc&e_i#$0-;u&}&{J)FCqU^vVMn(nZkO)&_(vA>#_I3JVO#FM6%YIiKQ2#oTb`T2?K zDy4e9Y9VY*-6Wo5R?fqBrGBfzA>36Y>YR!=N`UEwn3mB?@(NuskjuX zoMvTP0kXx}@Weq_Kmw)x%dE)9c{$AQ<~51MZA)73-}4&&$W!cH2T@S=2Ur;4&hapo z2Di|r)?P>DG`VM#ojj4xcNG^-JhIg7iZOvmqQx(ZnT%KH zvX<8gRm-jK%*;Bh>Y>atU4cA9g!w0?`7e8$sas;>P*Cnki=>=y1NM>?!m<>qy!Aez zqUk!HF+?fm7~ogB8;*}-Ico4DF`z$GqO;qz)c@F>OGb(qcG7xMmGr!5;J4VweaI9 z?q<%h_-7Ej-@lkQwt?#5$DwvZ=vN!c7UJbeU3~NEittBtZ8%xuXrcRO1M^0oB`pvA z2@PBhhZ)U|P5if_I(K?sRwO~SqMs*t`^ew?V92l~AqA#X7RnTPqDQ3eo8EE4Gi*iZ zhXk=(MmXwlBPxlx-WYhG7wmPQkhAIx&DTUa{h#*}WZeo|@5=K18?(svK< zD1l2z!$W^=MX7QVXVU}>C@tJ?uO5x!6ME$w5J^Xp{8m3U1|2-~UYY9s$K#|v_jl3X z$>AgP!2@U)3bo- z&KecgA(BZ4N#siz?Dn)u5I)xe2Sij;ecFdY=~DuHhLIYMa=Lv*8=is*t_=Ms+X&{g z;5Mff2WpRXGkW*$6H26dnPL_-&!4}#ayhkNs2+%)z@|{YRS@m95g5-P59=u;q z8l<#?7_hDc%YT2TIy-(tzU+QtAN`Q|pjsn`VB3u-{3QF@wn}wt564P6puMoQqRC z8*6EZHV^{pE}Nk}^WKY+sUW?{owC=mE_e1-HRyL-mP*LDR)!t=S zCn~bdE-fo+8?|Q_y^d6Nr4Hi;=@1f?e4ZZt-lGCJTGEkVw{8DlqIpd97Rt(Y#YA<_ zbEMFLQ0o?MigW#|oko-)Pq9XsC8Rq&m}VZb;*_RCr__ z>vOtRa*54G5$FBv8hiqr>0}wdje3;N5insSkRDP4r&jM^Mt?q@&#m7KxeT3BXwX$5 zqW$itp`Ws2IJ7s(mO5mnOC)5-F2hq9JDisWXmayC&*%^4^%>+G`J+A+#!Lzp%cKd> zv>Cw_s5){WEuL9`a$;8|ZJK-KktUDLu=3gLfmx{=!oIRqnJ1{%{mLL4SA7zJF&XI9 zI17C>K0;wGJaui1&32t%S7j+rIJKOqF1S)%tF=0Pq0=p*+G8z#&7$7#E?7Z*2Exs4@h}W@NxaxfJ1#F| zSrxzEaB8Z5v@qlZGo{zLsG4a8iI`;pkrg}@Btt(hs;0Shp*+tuJhK(K;EWbFbRBKq zN4!CFjrVHMFPgZ6tUnu~DcPQx{P{F0O&dSr--9DxR4u80kfRAVz->JA*7hEQXp}>U z$NFp$pXdWOwJ0Lz(Xtp$m!@Rc2Ps2%4cYnf^q250eeExzRQ;9ye5($T?LD{#4qS>? zYLYgDI-D(km}VEex-4fR3KKDArx;<@H_Z-%duOirU?sMBss}SruuE|mgek~8nE4zb z@xEeIUkUQvDx5MgK8LbP^p{I!UvHJi_|1^?cbSjWA(V>W;@U`0z_P1Gy&q&at8~0V z!Yi}-e=Dm9Y?VKw*o3_`uxcDu0`UBcO*)O;opye_DIFmg|3Yx@&o4v-@^=PRMpcOp zBTDrSP(5=(m$$SB9K0bUz=I?iIa)k6kAR|YEe5WLJHJ(4^nxe7O}w)fgopUdHj(!Q z(;S!TC3cr>UGNBLMN0F}o#PqWGPD9_Jacqs$OtIp9{C^I!{;_()`wi4I~7A^l;+7izLKiDpC;p^$$ z&cIM>S~haA`IPol^tn@JF1PYC*$!h-YSH#*;?_o1neCN3*@wUEEcDusH9Rh4dbXjJ z6kk&359vXG6w7|3J0c;I z`z7@24=VT_L0>ERyc?yvRzvdQ6ybH;wIyjc9<`5(OcnjcB1Y z1rxtALJE!MTmx%6a}g|1^uxTjaVjE2O|%lx+)dyUuc!E>|Mh00#M7R>6(+?ulWt5r zue&Db+3NS_g@eBQo~_qU+`P_dBQ>oro|T^RD^U%xv&@MT=KAE|#|ZNE|>#$Tr_HI%4PIN(`Q3h~s8 zbW}SkW}L`KV6l%UHw$(mPqgm(@xdrNlz+HJ^-HMRJw4rC;f#o>vDIAT7j!EXZc#H= z5JbZ&o!^+Mn-A-3op458CC>DtC4DE0X7X0nF8N7=X*}M(l`p`SO&dpYn!=g`PhRzx zlKfKl?}PiLiM-2^>ERymV6tg+3gtagbU9nYCFzUQDH-WRcMXOK0ZD~J@hE7MYrZgs zE3?BvR|ub+d7iPrM2{LIQ&=%2Z}~+Na+7iP3dyc;v%dHB3>I!Wt1nqk$cehlCg0yJk#Xt1+Yo8A z2s+Tji|GBmMQQ7ac4(i?8FZI0y2@a)F0(oJd!CbxHvR)(A4}P>-{G@4-RCTyapaBW zMISQ%gL{*~7E5q1n<;m)@Spis=nVY$JSv*y##HR)I)}CwB+l*iF%=4Y95C2<&YYpn7QI18;`@U$x}d=Q zj{MXL0&?Q?z zWo$;315K;E!zpFu6c>Yh92N8JX?!c@gQzl|XS-ZF0)XJrkAMUiHggHwj6Y#?lIlV} z{Pfj9PMZq#5{M`L+f)QrqK5xQb}TD`;#|Q|Ch8lNe}$p?4_!XeCY}-hZ&;KSex8XZ zc$W*$tvGZuVr?|3qmz3+EnFA+X1ZADjqcjM4F;CBT3O2y@HBuItc zWtH|VHUWg7=Lcxz{#>PQX2-#j+6aRDnd-aX3xW$Z6-Dxw$qZFrMcL?ml%PL&0(Q~v z7JhGPcHXVwAKp6j0654pC%LZpU^ zVcP>t(gr59uPt_8H*#%$V_q+O^7g}z#NPpdiq;1mT-+sAH*-D2P zYY(7HK^a5CHe55C(K%gJeK~`aLIU1H{SztxO|Nf}GBmRDY4bBwnwhQ$!G*8DTdV#P z+Ks0tjY@+1raQO=`ny#5B8|UPsgFJfv9uif^R0+a3_Mn-j;NFDv3{58MtwGzB`W(( z9De!>_o!2`_%nB}KNcyXAy-SZc^iZi!sqkCx2$qgwH%?g_Sq~f&bo!C%MT%<_U#@$ zP=$OqRrIb_B7P)Y1|h%PUg`cjGrZ?*HX>vu3{&zM;zS_$v-KiA*((t6SCQShl( z<*4yV5Vd(w{veqRp)39DzG`{vmn`4Gk!VakQYg1*pj5DGHLI* z8`WTKoA+aD#1_gR;e=DNdS00?suw=kg#z>VmHqiH<>Mc0M(V$H{uV0r&`gKz)OfSQmdq?@YmyKPl>vw4w%km2+T~R!tsB~m)CjBXLNXn->V*WW)!!Z z-EWr(TA*NNwd7Y4+K|;$&+1^ZxCSZHC*ynJ(?H?J#o2)yEoKA0ZwtnZYe%MmX-Nw^S5vllciB>tPt1-Cm(?tjunR_+mfrFBG8gj_z6z$jj6c8o_FeY(UR5-57j58u@x{BY69u%VT$f z-C-PIk9e#gI!_qyB%skU|Kx{;nO-ljYD4kbJiVh+&;4b45A|4I$~$P-GA}6GY^7N6 z*OSFZdF|0Ve{`_dslzp?l1>-#Qi>Ii;L~V&f4B{xs`tCuJf2xFL?5)m%{D%fP^tG@ z(|&Na%X&+@TqGhXHr4#+t|8~r+q)eEejJyNK3HrRX&pkF}`d`#1iRAJAEBpo>s&%*rwllxk70t z?oxw?BbWYX+|QXF^r@!?=(vIri2&MZscQ-zFEQln-sb8L;gIT%&o=E}1)IJz7BB?d z|M2nGfd8k@qSmAR77Olgv|RBi0z$5z5}2bi89pf_8wf2lPORKo2u=5yOCOs`pzFMwB5*dcd~W@SL0wQE87^t&-&E7OP; znM?jg{@H!DMaiUM4JV^&7uVdoc+MH6+8wND0UfRD?c+~B_Bm{PZuR!G8u6`ca4!L+ zs+npvy?}R`6o%#Ww4iZKzP2n8O4~SnyPJlPLXV>0qYTYf=k{avXVs(Tr+?F%eqGcQ z6hxNTNs=y}@7q$mJKw5)t@mpY(3T0l$)2LqZhPXQ{O6KWJv8|k(UZ0>#&p)(M!#)&$SBjF2Wmotbq$sO;XHd&$85z` z&x;jg*4DxOOudM=Q@H{+-)eMFVw;{IspZ+RWJrUk7tYoob?+WETV5v`z`XhxI>XH8 ze7~$|f^e7&vWVMq^0ULprGR_t6|LDtI@eYzIAlW7jI`m4AqA1Wy?|8w{3G7580c22 znV_xIk-}H=fYl+wwX%c#$g;yXoOdq#Z@92Y=;7@e;f@bm0@gd^h$5Gg44hWbq_pwg zpP5R%F<~e9et_%P)2`~r48*%n-`{ZRSUA99vuEbhM2mk#aWU0&A6}2NjRe>61UAS zady=yNKdid60eVMwMo`ca)F-3aI>_T!MEYhq&4!VydfPol(@SgkpR&(tC7>m_UzmC z3xlG=Lc!YI{k*Ognh}4Goi8`moVAO54kk~IbOOj<8|5=Kvc7I0!42^vC29{tu;Yd_ zcXHDTn7t&|QjF*^aRH-y_+IaED4MX$HC18el$l7e#&p|f3`XAb78gbEKe<*Wm0z*0cQ@n1J0I96qbg%EI+!!XlkkC zhB9M78csa!(mG0!MPB!d?!6m;Z6c;Tuk|uxOe|-5R zui4XLccVyo1k0rjD8oA05x7{~2%S>0?ilpVThjQkWa8F7G7!~fr_ykRB-qonZfB0H z7ers2TBs$xTR6P4Et9vDkl)c##I&i^8b(YiH%I1>Z>`bqaT4<(E9R(Uwx@WBY`q;^ z&yS>kJmwW!t;6A|ibc0^hirYun4H5J+5R|=){}~!-VJE`Q8h?KbX(%^yps!8J!s6m zfIYT&r^tkPJXQW@*!vh9CQ%JTmmepL0ay$hS{;_wS*%7HrwG&}3 zte2aUe^n0@h>ZxO+Nr&3p3<3?e>Kwpi1jf$aohAGw9YBDr|qy;{k0C^+jET?wez-< zubX&lX>HYTOT@LJDMMg2e^}WK5?|tpZT0vKrQ<)m?(t(~nKP@`)Uty0eu|!X;M}}$ z$-k3O^VI6Ip>^`4jH}+fx%iahWPnF{Y70Iqtz5ma zaH0Sb))ZPST_^@b6MXSjs@Ke?k=yv}8{%ik$c!7+o*YT&ea8d;@V6vQ2>!lRw_!m_ z;VAaSUVI8$Z|Rt)!0`+(}4?MX3&+> z;*7`PBx%mN{@c7__*HfyGt3N38#4_Tj=+3-p zvMyhllx{G#%f_vsyL8{nj9^b#>04HO7(P$*!Em)*;B4jU$a?5*y3R=mBk7wgal|?O zIPGrc$&lKbOOe7=-ODLt2Wc}SYda$RsmAhnaFHK4|Ij_t7YCe5o?)>k12E|^nK?rD zUmq0YMoM#>I)s2jfKHgM+#Lj}Q2d+2NdAsEp9tP=Nn3 z-7P*O4GHN#Er_IXLs9wQFciKgU=A1xBbW>6Id_Qw*liTRAP$b(C?IKEw^2aSV7E~~ zdLH;T3P>8~Unu+?guguW-yk5d`LADsL7d3TZ!>a2Zli$YPE-`Qp{OW8L8vG|A*digxdAxJjFHD0p`ZnWph5!U zMuh|hM}-8=feHzn>pzeHe=|QEb~`Y@$aqA71Zis&NWdT{3M9yjQ6K?>A^(H~X@4-% zW&VN5Uyy*oa1=Z|a zl=GjM{AGS96crK}2o(|-vX?1O@z)?|vBXh=Wb~rNnP-sX;zC}YOB@_@i zKuGJN@FDg5i}v@_!hv)s6h<)Te^K}!2pnK23JAz_hynr!2LuHKq<8)Ugny+L4h}dc z$88NE9Gox|8W-2CIt}JPW{g{96U>3s`L?wc$yn*T})e`|Rl$gTxN2pozM z&JZ}93w~=rWc|67%#j2T1Oh?fzuwO5 zAQ&?H-BJ*Q1QT-0S|H?FfD3+0LnI>{a(kfx193oZ4~Sfj+>Qtkvb(vR*+FnH{C0#P zY5&S||FZvo(>(~;_5Za>`8y=YnLtohGcaWPdkbSEAM~~_AZe(pEoAHVw>tcvwEzr) zRPnZ8$gSQ8sTQ)lLQo)qKyN25WLgK`4r3$@nc{BC060;aHzXtUcCrA$xc;v7zZWnt zWRvkfNBYlN62^tnG=h*->$VdjX~=*_D)X29|7U&}Hy0RXcHG>zlMnJ@lpY%dLoRbs zpo4OtIwq9s@BZ=c_=7=_E_d5BNYA|OtuW-|P-&3cMHB>sal=uRfuZzn$O-{KP(tFb zrTguOfWf)AQEAZsR%RV>;cfA@#|@wY$BkH5oz|ND>s z>&O3%|NZwr?2o^~fB*ImgTMX#A0fJrQt-#Wj6cS}znK2N|LKoEfBxei|NMW!5B?F8 z{_2lELj5Q|)aM@OykHddC3`dhc62H-ZJ^tR8cWwE<1z-U7qa47+ zNBJ**MDtOduOXekd>BsYBabit@h`CV|Nh6n`0F44{C~4Q>W{zvkAH;nVPeX$%YtZ$6mvNAT6vSWM1W zAB@u%KT%shqIE6>9#H!5)8ON4{}un={P<@EXmj{iA7jM4^now

_57qMFbFMxf zKlC}c`%n!ZH71jct+jsQfFJs=KQwvEak=mjVzf3pQ_Bx5=EpzTAOG+le*B+5{>u;d z<6i-95#Kc*e>u7uFgrz1FYx#O{^!5>5C7(`{>6{K`NuyR#TH*dvDIRoSQ6>jewbuS zC4BY6;e0?df8nq-3G^)+bRoN#+OUfr+X31V4nBuI>H%W_X%_e49ANEh1jF+T#eW2l z26iB$*pM$6uEY(d^x>3T@?=?v1LHvKZ8)23Wf*@ds_w_zK+^H%m)QXzlJu!{xjMH4>&MjDg7$>3oO2M{`b*(Zkx zL6Zfk;4|<0>=*%fk}p;d@+xhZ=Py)OKCE@o_SrdRpj9?$0=|;kaEUc#Cy-PVtaoj= znv$Foe@Ie{4v5FF$3d2Ylc}JCTB^xy)M9F?0thC@8r!hL=Pel}<0~b)zJ@ObbS;1s z6Jo=NClOWZnQ2M`B+CwD*v0@93hjVco%3zjr{WBce;ss7TJ4Jjhtu;ymO0xnhEvQT%Bh3p zeC%uFAdE>qP08~(WVnJbMEZmIva?PAi66$tM6Q8&3=!w<+Av7Rf_AtFq^23Oy)Ul1 zMkJ8kskC7%k;n;9Sm0X7(KeidDW!-=1sNru+He6>BzY_XKDK@7>Os*#7{LdZjqEW2 ze+?#(v@^&VdubGvz{<&R<@jNJZ6pkqz?tSElvBK|A+%u#cJHzrBaYnW(uQ*aO$J%n zmV~o!!v(A0IJmT{*rOl>9G-pWjtnx6wT;?fNLvJ&)S9ULy`!tJp@1#FPYx~&9_fFe^>j`6|yB(IYu0dEy5j8%|1X;$}xgeN&^HE zFV}3MkXgl1q&|$#6p|UfSU|8gwBd+DjHGvnSioIu8%~}aF5(ZG*!49ERtSx-GxTcg zYt#h1XZd2O&Wdu66$HwE5S|InG?@rF?Q#rFoLL-m6D~j{IZT)o9Nj4a`WZO&f0SF$ zED36)ubeXuHa9_DQ!;&x;_#m&hYmH91-xXq0qjF0QGswYec0v*%9hP|@J4Q<5F#cw zkprngEh59g`yj&whwiF%Z8(uaQWLjOY^Ahe?8SAF2sRI65gb5qPQ*pQECF& zR>T=5_u2R*Nu-EQ0TVa;C8{g%e_$4s7hG+0hGD2gV}pnbUvl=P4X5b9giUUNiW=M$ zOVLrBaS>m0$ZfbrDrYbpco(0SrG--<<3VR23tOU`4Td4Z0>xROMs~KX;dqe7kg_2Q zKysSRz+$A{@Y$Hkq!->ML2@F^nLdo8vF(FaPFe;lX{1RKY^7v5bx3}EPKGJbV9}K}495gUs<1my7DRDk z7@MVr6n&p;-#Xj|kaLhVKxRQCKSpuX*krTvfxg&>VZqU=m8B~rPhT1z2R(=oFc2jT z+0gwUI^Qf=>q9@We;k2d8?qr!smw84ageYr8(zUSX3a%_xer$tKP@*=m6R?yKj=?a#P-$yc@r6w6vm;yrF+qvO z)Z|m90ql*Ke_=G+UBexRsnePOsFoUo!;tXsZ+#HC8X&aAPvLNC(u`I)q=;{$zKWd8 z6f*Rv+9=2ce!EC)=pdFrS>T+-&L z=4K3Gm>Qs&PGoAFlNY;(K0)ZNR)E2ui%0`dS@#h4J{8@NU_}nn!y&;mn+gj%;aEBr zuysU1gTr7b#BQNuOHuS6BU)6n%``UjIh!J3u%x+&TeF))3O6LVVKRe>tE>%oH#c7a z!VQKcf0+{u4k`#D?P&_a&TGCZoCXr$Q!6g!SjOHl-e+eAqd&?pRAp?EkW2*Xjv}ey zO@<~nJ(V)IK=>@pyXO`GnWFEp*5<)dnd6J4#V6=@r>6dJ?2g1pJ0A{5*CPgUD>Pwm zU|5P-%g`4jVs%};loI;v%9Y#f$iQ6}$SHV|e<7thj;rezDqkFk7o;Xvn|lIsrx!#i zhAjd<*H|26iNDn5kZmN8bPB&liR} z+Y0lkDCe2=E@P~7=oIVSiN#|2BaHj6ezd^wf0yVggTbFmIk-bbq{V5e&*5WO7lMsi zf60nYd@OMsd@I0vgyAr3VH6A)_5og?391pKF28sl;5}{nb9nQ?DZr~gxD4=m(42+U zm5ve2&%x&bUPo&TB8KjR`!fT)0j^^(6qN_4KL>YlSN;+HK8zd(^Wa&4mw!k!^-mvq z4DLP@7-@$e0OJ*6=M>;QDb8`~?ZCb#f5htJ;KL()4J9@E{$-2omavR>T>jw)8y#2P1j*u>u4iwM!sTQ5W^- zrzy?k_MR?P4_q(|OFROl@XBB-ceUQbumBMJ5>g+96~(jzj3xq?N;eG>JjhHMe~`HJ zFc?aPv+X1`0;fETkZpw;B>Qnj8u2c0B~+#G2^39*71%?f4x6PN?x`c-@%11lHUT98 z@Zc!A)Z=c9f49&=V5F2jK#PdtTb6QwG+>$?$cU(C#EDoU&4wQOG>}L1>j)|SuLZ&x z5v|me_&sCTE#Pp7i26bgvpL2ze_SBaXt~L>HQ%N}F5GQq@C8)d5L!3DMLW0B=VKrolSzy@G18v}uCR~qvQXw+j5U9wj z5liF{J`G6-tHs?S;~@-Z35V0xJsV-z;=^oV^b}mi=qdgP`#hKa#R_AYe?bUh71mDe zAyErzDm)qRv~N)+Mo()EO=7||tD(nKNfR{Kf{-t*k8Z~`vptZ&C3exmr;w)f0YQ=w zyM9DfVJtG5O`ZemH~*JBm4q`G1cjMv`zYL8FUdrPwLl=<7R1RK5{@VT!4vDDPq;#b zBnkEc3To-I6OoIv9jf38|z8yZ%E_knRYIAT3w3l&poX96J!=Q~25h7tBg4De%o z>Y-03Zn+>kL1naZ6Jxu(0k-pPU(B&ked_{RqvLU>UF{^}!+lnRLrLzz+9vV%gUQH7#!|t_wfuT}{nv zr-$SN9YGf)tZI5l6bGH@FhDTCVKu(54M3`EA_rWbeYfgik$4%VTQq{LHHh~^VFsHy z#2&OXjwC9agcX|Qf5Gr6XoLni=o34!@ew`+=(7>=_E8aLKFZ6iU@sve=#?|g|SWnPvov2kxa%v z7=r-M)C|t-p;iyijAF}C7noG~Y=|)l5tI5NoRr}c*%oe~sK?h$UnEy=MZuCPePaU# zPZ?5e0+c~F34Abk3eu9{%FtOJ@la+O8QB31>@icGImUTI zjXlzuYKu4Ee+;|1wAm1G{TNe3=ZQ9TynK1ui?Su_+TYDtam6nqSc<>+7nC)W|XCiZ) zZGrU6@IDodqfAdO^fjPznE2xtBdxy?B&E_x!s>uH_h6_o*_DoJ8(V^sF;XyQX;K8p zjiGzfe_)^Nn-qbhG>t+E)or3QgM5OZcTE65>VxTXI|A&b$2SX1?D}%w-Q`T31rH*{rj^1tTzABh3i#j5R&EEum9mDbBz%F<_6O50eM8ppTJrQR@ty zVqx2q71XAyeKrr2;tZ_hz)7J;C*jxRX8piYe>Ed?$|O50AjmTTl-dIc-nT3^J%*Z1 z52^an94*T6np#$hQHRXp3DJ&V=-5NGkdl_tjC+AjvVDzGBzMDOWK=}Xk+D-|dP+mn z5DQrpyd-@blcM015k0j&ig5;_bYPAi4`ta#Xc9ZcFrpl}WrAofKtPO0E4W1BK3)nM zf0~A6>=Xl{G(FQHEggJ_ok|MWg%Krn48S*~iIerN&!!FQg*TvDQtpG4Syk*OtY${+ zlry?*24kV-9&G{NdL9>`2G*17i@^GnL=Z#>KG7;u7&|5RI61{&S@ZDY6m6ld0#CJL zydIuor|-CcaQ@(V!$b+R1F0WJAoa)Te_x(PQ~?2)z|`3M!pP`(Jq|y0>Od&I$q3p< zJ)oK)aaa!!D97n@_F*U*GAwAE=0|za_kzAA|(U!~S z7GciBp8W<8$u#SiE>h^$9t3age=@eh;9+UwTd9pDkO3U&&|3X z0Vk0cm+FXsgI2n70W&54+{U5?ZNr(mYGXD*Rf^d}M#;f+BL=>5k%&NIsaRdaj3a6c(eHV_LW? zTsYSfEdxbGM!5TEq~|1igss{<@wKwV_mXfJ&mh&%hchjqI4Qt`lG+cylR!8IwlCxJ z$1K7Nq5l`N2%h<65G$DCf4J0P_>@JkG=Y;B$^U@nIQUK$;RM5Bn3OeO*k%ztQ+QC0 z&dD#HW)aSt{v6(X@SH`s_~0sw;0wd8#%6m6lOG13W)a|gNZm?JkYeRe%p$;J0Gq*t zJ63NW1~G(bj!wm8hn1dp~Pg5G^^!=jpQ`bGoB z1glBKrQp8jC?tGG&cKP(k-11L*urGPYNybl1C20CLohPgWE3wrT15Dur`h295>z(S zdQv$LkG&huj^1bESghXbQX%hQn?lzKntZpNS^pr)(6i7Xe*)w&Obdu`ND95x=sgk_ z+@NjRQbs{(K97zgB7-q3hx4gDao*BT|&=i1jh35#lq_-@G|;r zx_uGH)yfuq>dA;!;q5Cy>N$2==p@uC!({r<-3F%NH*!>Z$+6rm|jg>M+PV3~Dy zJ$M}<3bNrU^ehp}|6o>-zi27sUJ%0azse$dev-8ip_gZaL>;3oAQ5qyUFeUyQXY&G9O-g%P0U7g9*T z1t`KxaDrMSM~b`+VfCSkz?o(fb zh6A${tYmSn*DtZ0oAC`fNNNV#owve7RupVAdDVOYP#v5g?>c<0$571&V^~avfk?m; zxjAplzl*WWMObw;W=AW+%;e@|R^%Tg@SVUlI*726R`8)=M%+>p(wXFsUr zM8jIS_T;+z44+jZR7SLBh<%aaKAU#!DUB3GVvL4-4)l$@MbA)>7mZY~wqY1SnXWeY z9CDzzUa$?jg=NMfo>-dGXT!8-xWlvTv$Q}D^A-$0Hxa^u=+OOgFas|@$bfA%tN zuphN%kXvY>wy1exu_M#{ggSwEUH8ia)4f5!#>%D97?bF7J%k8}FnGckmI6a+2;e)6 zGH%!q)Q-IWRI49l+?FA|Ca+=FWY?W|>^1TJ6EAbP(!#+~l?UPEnkiCU?4!MmTc88_ zQy8Ye+#=%xEESHq&^bGBNvgV&SVj;JZ5`(+D$v+$YbqE zhsbPI5vIX*TP*OiJdjLNpqWEoq?d8iR0@pl^hID2k>tpakjplVGVUm57#SMW(h|iC zK3I`uWb+6G+LI2f;u2X#I?KI6lQ(-}o6T%5Lkn$~Srf6&D6eBQz34mhf4)~}b`JCG zeQh{u5wk!7#72S7MsPB%tsN zWLflm7=+796XY5O*h(+uroHH!wE%lDOV*ZIiqxECE7ioIkB%gT;Z?FxIL`btE1Gzl zi~d+I@$BW@VurY0md0T)V|LwLDDB?nXFSLAvJZG5JsF--6mR*Le}C}E4_S$~QWT%w zr8u3Eo)1k9rqoM-g>+;hQ-&+}#C1^xQf3{x#77*jO0{7|Rp=sA8f3ZMp_7X% zt(Js}%cn>3b=)H{QexIpUX&c3621|3@XZiqAvi6Yc#;vH;o8mM8xh=7Q1LQ0dWhh@ z5_Wwxf(t>De_^u3cwXvr_!zYUk5;8_IMO960XdBx#FpM%>ENhlp3VS?;Qe*|}&dONW1iQonn{1h4zErJ{P zL9mEnrqPc+9n1$(w=pPU29sYizX^NsRg0+${*WpN&0L9T` z^fVp7=RN!?eGND)4sCB|;@RVX5i%b{|G3oae;?rA5yQS$PmlTs-e5D0FF=Z|rt)AF z1zM7|T}_r+a7Lq9nv`Sjo&fTNWk-`;$}>b}waN+@Zwx_57BS~xSivG<#?$*Mg)yV8 z1&nD%z4<|iGZT9q25TM|P-XVBgyxPix0&Sn6!%yeIPZNo#6W7pKuEIPXk!r{Jxs0* ze{XXHTA{oXi4thV+11!9$0gE~1+6Cbn#Ir35Asr=tnF*pC^xiukh}punrYzBSpY%$ zqaSNVL3xnOC)Z{SH}|ltW4W-9A1|7PZYBaGx=p-)k$cI&XROwfwrcFw?c=^6X%%)x zHoXLeVP%(Ob^?oqz6fMgBxOq_ZD{^ff0Uc7EXyHAAUVpoU1%-aJBVC>pAg1qwhY$` zcd(4R_v7g0=j7hZ(9h`J0j?%xb2l}0rY06rCJnQcq$EG8(ldj39Oi!Mnzmt>gOWpN z<>$4<`FSx~3_`MAV5p$SYS|_sb}`4+0(}_MEGb@M)5YXo4Fl7QIOf_hhE{LFf6y-W z#?Y>3XsnbGH7;y>RAg-fl;vT5!|Wo>N3rJY2+P98r(;2!gdVN=?B5|^gX?XdOr=30 z=EoVy>H*(CV@9wY;pUCe?5KsCyd^V@`g7Rll&oGZsWu5uP#L)k0-k5>L=WNi3!z?W zs-#drhP{y#hqny6m~kHz)XuyMe{535x_h+_je%l?{v;UMtHJ4Mnc$j;H;jz5Q4l3* zpKEy2g(Az+lW*ilZ_b2K2gHy;6`2T$*8&zS1Y%C02(RNjOX>YM;4<<`CdG?kD}z29 zSz6J=9FEqR5$~;4=u8SoK$QKHB}$JXkvcRLMhKT-eyY<}!=8Eww^tK!e;6C9Zj=qd z!5~2eaYA~Xz7xWwdjL5MpQncw<)$!GQQSK(Ud6r$#0xJp$adh|n;vZCohNE=$(efJ zM_rWbG(-swsa0&U(mctVo@@}8KJ4A{=ca1u8h)+v`l2CzdSx)KQ(d3zv3qdWD_Sw6Ge`_0ZUJv6McGs%1 zHdsE4VHTfJo=HN{*&Yh^NxBhHh#1}i@7^%vj0grVZi3CdSUpi2S;2^f5Vj+@%bH^= z7-7bu*K^5*wj#)eYU>oj3zI=KIFTLdqx>9_F9bP8TS47DFbg%unpg?|0}X0=;25XH zvNlo(?6h|6NIH5*f2N<>00_>#&qo29bmC*k$o4Pxjvh^!R_l9Nx-}3Op;KAyG>Ktp zAl9rUIANt%t3xk|LZ+B8?cyRwbCYH?B$DeXup;*$h0HPo0jc&iGLr($c447a?TggP z-wLNQZ7`Z~fQFc=Ag2eW^n17#f6pSg$h);iupb>gI854#f4w>lijYw&Slhf6)mz6< zYqKMRtPPWAl(LmrD3vI;GBf3)b%*C|8bTeDZISfPh8~`^&}y0O>akr2uo9ac3o|mN9x-7ZhnO_%vt`-^NCt>2`{Bt!mK1#G z0A@C9u-!fje@#(KUl9DQ=>x!S&7-KUGEL^iF!r(Z_=;fhBVZA zHZh>gBK9WEteL_}#GTx+>uo_;VJKE&VjH_+#xPiobj{m-CHQl|iROO6r{~!7ad-|g zzvTj3hM8d;;-rb7=RHIYu5Jq_v#KXF!JA^cSwn}^w>){23sP=03&9?%nB44S=Io<+ zqLYgxeMW)hB7)Bs*jaiat!YskVwf_@&ABls}7t=?X=Ws(IWg#NUNjSS*}eO9jxz0-M;z zYSOSUJ-3>e2JMy&ZO3leKs{O0oHFC3V54P#f1zQ0><)|RIXDo4?W9=v$DYVz+&%W) z&~mI@3BzzmsUIUY>_+b^Udd|4Ic(BA(x5C2YAYwUXB)kxx`K+53k;>pbnm1os90E@ zpJ@^nLXL0*#+a>t+y=Uq#$bNi>1oh;(`stS#Mb3z zf7S#RnT>WJkTp4;c=(giHiPd(fscX7%lPUs3j9Lo_QfbLyehh(yhwXo>M(qY0$VS7 zOp+`QXpV#LM1fB*9ETYl>M(4hz%I#kB?x-?#nUM8dDDmC=N~*rfiFI|iUK=!J_dE3 z;;Dzhr%_;Nn3i+QG5)DhV8>JpFPa}?f7ge>O>ow+2NQd(!s~+B_$&%+*hGO>HjYu? z&%s?3n8i~33ap(P)=}WkQi<{pFpcI=y60c|Er4ej~T-Jxh;3=WaB1&Jx!kIv6AzmB8>1p?ZWbVzD`n z4$jsvAWT%-VX{iUd&|%zF;c1ae?}l#@(YfQ6nS5!w*z5}1A5u9T9g-`Mgx*0xA4LF zye@1;UlI>5h_X^zOQteX;Jkp7WYogDehgQi`f!1PPv;!d6*ndcm!UDsR4^ky7S!|!p zW+^latd&~39-{6oPsmAZe~B@o;xGzXfk$NH;Jxo<#>~o=BG|66wqBbwuaev=^3n#b zw8o*db{ucVVVFdoN*+d2F(< z7i%bD3f*vLnAs-59XPc2b!WZ+oP9Y@i|1jCF-Q_6<)b zr7kR>m_H-s(&yT@e~OAaib+`3#()z`Oo}Uh1kh`cHjR|xaF_k)f1Rb_0S^X5Xu~Lt z2BXvGXHJ>L)934?Bud)cxqBSaebNi{1vYRRZL!G`uE{O$#u}MrOO5Yp^~0Be8Bv7q zcw5-?+rsRl$_CvcKPV7B4j ziiUV{#>9~e$VHkr@L&prj2%(`){MqUQ*7sbkJuYtL$ytn@(B7cJ7n61Zq^68$F*SF zEHl^oS@cRK=5a)`u`O&gpGks{`*2Q754T}Rh$MXKe_LCM*oT3j)EE+`crv}}Q{FFcHIAEdap$Ly$zf zpoA@yMhUsg%$HJ9#u8ilOG?PwT^Wi>NCVf0#qB0uStsv$!8qeWok{7+KKkE8$?S?4 zccw{OeE_Pr?{{l3*KW-VnDVLmrkni zOK;x%sB(8wY|HEFKTi1(HkW2}vd?DHNz^8v)U(nz%ZW+* zf1^GO^~b~tZ~sfo>sD5W>5W$um14Uzki_ayoviQZ-#2J#*uA~;Ki{3v&? zz>$5Jrk8EzbY-4q)Z4RdwiQ9l+xDfe4L0q}!TU+R*VS7uod>B1L0oC1O+ax~>{V8r zHmja_8us0eLX~vjQqR1=Mm1ut@{)G#fBj|Tf;y|MNq)SM5g(n`jReh%L;%{uLJVO^ zKcZ$UCDUVR?7m;DFeKeK*UTRd(^zh-XF?g-6vJq67IDVAkE4v5uf^owV`xb3_vO`iU8tYPJ4)L0&!;px9i zWQUQDYdkToHLSt>he;HzUB%>@K zGi@`$eD-V*(U$~Ktg{$>oZ;E?;vcye{OCsN3RX5>-4Lb1tARZkm6)n?@=4F!>gcp& zQey+&%^8`s-u6MH9K4i~MWWyx>{zpV3>WdTIGjytSLJx+fpO{XtHaGZ^O79U8+f)Dsg4)xm2MeH6bl!g*|w@9JoTfyIn)uf&hqT{&stUt%9Fe=P4C*DQKgjFKF? zNqu&2n<2&~OL3<7JGmMJ|LD2z8-O%qc@t)Ig0j-?$H|3nW2XjDA~9-dF2-Vb%9p(t zEM&gSjdYpc<;y;Uf`5Ow+|Oa&uMa&)w+Qs{&92=1Lncvr5DaFo+}1O4(aMfS{EN_7 zNM1r??7Iy6a6C13e;twnrhM`}kk)E`)=?&&V{DoP9$!n0O5CUjgG<~flu_}B)3r=O zGmy*s^S$hE6|Ug}CJlRhk*h~qRsk5_u0|S3Z4q3S$|ao)mG}Bemr%vf;^$X zVLrz+s;gF>jFspghcmCH_Sq}nq;-uFdNQLDXzdY1xou1g!shm)k>|$7mt%m1X`dVJ z5z96b2KBTcf87(q*ciD2O{VTvAWM%-<0Oegv==QtpZpOD&b8fdU)y`56o@N_*lI$a z*jZj)WhB({{!4joIeB?KtYO>LQJAwdhFYn%kq73?XuY^FHbh!AUdoUGc328e%?I8{ zOYNfC6Qvzmh=}BuQi_wpEfS{~nw2?x3Beo{+Gm>he}&;U^2eu?=4EE~kUxGU>HBK_ zm?g+0=W<@^bNHA)c1bcQ?Y)Y}634-}^2bLQj>AlAbQt#eW6RhHXr=w)dH(pc>BI2z z4^H`G{lR7aSRPg&0~|B4pM%fy$81IpMw6a-_Rq{8vnJ0|I~}3^9NguPgOvR6u}g+C zp5%|6e{^oit$EVpL!X1Y4@vbAFDvqb`;+|f`76va3wD z{`%!2Cpn|iO(S05O{^MqQWsTQ%#fFhm{Q}#Vg>sTo_lVNtu zT9zih`~Xzf$JkZ&8kce2YC^$cW`0Wx&gD z4>Gm5Ba_xK@kLR`D-+2!XO-8SY?00IYL>NeTz)Fj7STz?)wr-B?`QDkO@hZBW+OT6 zf2%xR=j7^8?JY)W*H|`YcC74#jahqFD~a(Yftpd}K05N=yw_rE8p(53YB6%b+$5xI z9q$~syR`%)$J8FSlsCDeqoX7h{WjD-+~4Hl>`1r2W2E=BBAvlXb3NZ|*p;!7D(}{h z*N=ld>nuR0Xvb}<{`#?#n)}ic5{KNmfBZ4^24}po6?t<_5Mt%AQW*|>6D|sg6gvv- zJg@0Ua*q#kWLL&8Gk1)Y(7XoP$D_zhb}@Fz;#Kx8=%0ka%isnn+lW2ehpRNr7r0Yz zA;Mfc2+_3jX@_7MOJ=4B$1`fYzSGXV&;}b08PCLt z#DIQo9T=oOQF@BOiiQJaM#i3gy^JymD`@!3F_ABgfX4gQyxHK{n1ggFp@wl|jg{!w zq?gEqagR4m*l1W-l1~l0?!LhRf0WQDE28C7syLbsq`WVfuycg)euwBkYia#3Rju+?LXFIdZPAW;XV5HqTnj@E%e;c9qlVZD( z!-9e!9YUNumz~^r;EwOdv7mtWh)QVh=|;H|!*+Z8q-Sf?UJbxEH%dEoHrvX*cA#CH zb8O(9`op=8i*q7Ec}cZD(86mZA{DK?pE@qi_4oG(wP&hrc;W5c7ALpca(_ys^&F;N z_R?~uH6xF$nG)q+U|LWff8F~_D@(vJg$A{+brb{RxN`1b^I}NfW6AOe2{BTcvww7v zcD!!t5Qft_;&_HM2d_z7ay;K3tijRJxLz7;j1U|z3ltbDlCqG z=SP|hQua|E!->sIe?;{0b%s#~0n<%Nz=HH7Nu&83Pn6jyFOLR>@p^gUH8Y_|)+BZ4 zM$Lp=@5AZ$Hr^%5O&Ca(Sc}lf5JBOX%YQLdqLdzA=2(;aA z<#1^RA^Vz3f5bN2``U>TW6pH+wQH~MP#G`-pGV~dnaYWRe}oZGU0(#&h!x4_`Pgpj z^eiSEX`ElA+B9Rdz12hb=tB8kd(ms(xdyxcjOKWWVbrGaczfovQls!QVl%M&U~4HHJqBM1J)XmMdsK=`WdD{(x~>}<;&D8onZRwDtvG# zJ5g6vv~1~n85JXBzR+JfmRlBvT2VB0ig{dFEnZ%W6E3U$nc_!%3E7>hXgpfagtBRd z4oE(Ye_{{ojMRI1DZh=QTfQyQ-oA+v*WdPGO|A4|b<*6NZExE!_*C-TlysoJ)^?29 zv5;ePky(OX``Q4*iCm;E&ta6b01r|$#;-%onqJb<@6HO`$=gvblMS0R)6jt&tfR9c z?Ch?Rd8u$*J1Om81{{7A%hb{=!aysPuhai% z!CgKP76odW(WAlyNZ{ol(FmcrT@3k3=T=ec)V*%>Tm(mo{FBFId|x?O2DZC(>)Yec zpI3OrzTma;zBDygke#!NZrt}}onW&xX&B~Sag%tNx7#_)(2R!(qP)c-nwMqNeRh!s zf0@n2V1e_vw9~pdiVbDWXR%C?XWR&NWSgTNd6pM>Lz_)X=#gh=LPzQ6<=R}|4DX|c zEJBfmQ?=*Y8J=sFpR}oT?a|7|U1HH=kZa@i5SO5hCs!SN=8%mddB?9AI)-}j(Lb`L z+-zZXr5NQou}UL0BG5)R%5eBZ24$ZQe{v^$l=x&eBW={jJBn?vx0)n<@FKJsA@}xx z1A*qN9gV8l!A)9P5>0$aJob<~j!PnU@^*#m{KZBYe8pH8iESZjuV>*Sf?0M5<}#y$ z7Ib+M*MR9x*PCMTX@Dq_&$AU`P2&c1ug-DuE?esFAk!jar>o|5fS}^JJC~Eke@1Mp zsAP3cY~`!8!`RTYZ!%FcG?fSQA&y}=TrWoeri!C{XcX;umhhG463R1PE+pH{v(h?H z@ftOJPt$B2C{z1+ySf#-%FC9e_c3Gpu*&p~_?46leKx)&HFvxT>`l)Png+8GE)2LQr z@~@e~te+X+MfN5rLV4JC@AANWS+@qM7h)^Z;I;QCZ?g(jGcwT^;k{DVf_`i&7&;_O zafp;N(hfcJy~~>)eh_dS@2v1$VAqTvrliM>%6@mAyQC^jql>CEe@+xeXANqvglbJx zMeQ`RoHWa+zjgw#zj!Ji=vPd>#biFlKY|LD}kH7U+!yH*9<($Y^G8BCaY9!N)U>L z13y|J6rZW7@6`rD1Gw7~CPl>=p0QXb-^l6*4TZSDDP4BuXr^ zeP5r=aB=KL4q2(cfP;m_@AZt(iHmfqreeng*L!WqyLEh%wQ1g(>i8t@<;Ldkv-ZSx zxcj3!Tm--JqY5k+u{l^n;vQSCY(r7STwo*CdVX?80wWAfe~j(`wG}6O>6FxyxK`rD zbZ`U9T|yq6Vp+^thnZ7ak17r)<~9VaymUR*W*eWLfZ&Cxe&L^uzrqMv72lJ%d>A^o zVVwEV9iXRt33cU7>)eJR%wlPwJy_#r4C9d4=1Q=~7a|^y@U>e(G%49vxR-|U#mUkv z-egL9O<5Wef5^jUVy#x=Mgv|3k;NWlbxdv-ky!2pJD6fl>bz^S7^Hnc%su31+2wb< zs3~~ejp(~xtMJpJ$0+-4jy|MT`Oqm7OB5vFD2id z5mtfuZV$G{t8HH+C3&lvr0ra0hk!9Ap!7EI{hB+3QrKUtpnsYu+Mn3QEDBIAZ+zXqw=R*mx4)5B;^r&)TpcaXuHy zdU!4wdnZ5m2g3s_bm0X|Nw7XE89U?w+x1eqXt8;u<9*x1?Mr#Sq4=IZ3arm6GHUrY zV4u9ofAR2HPYz-zh90GN?3B>H$0IGHVQ=OI({|Kw0!JjB87(peEp#~ABNz;8i%*b> z^nk1!m*4on7HxmBC)}*uqn3{ErZktz*w%4`aY(895RaCf(0br4LKaE9R+_OZcCZf*Cs4fA93D=Vlj{aD8@{*c{(xy6gyrseDZcw9ImkTb zw{R`hCl+7~{b(y+`WZHs_abHF?jB(6HUe+-rDpbnlpZRF?R-t!BjoR=%IO8XN#18K ze~)@v$eY^t$Olg!RW+`3EdsN8yim$Ih2pwO?5)|POq9xb5+|R0`NHr!RW-*#kIQW0*}kFLxM^EcwFFVTmy$H8tG&=fAPDjS^V$3LKku z_+B4B{>cr2W&RM`MEZsc%x z+Zp5XdP&PGoW|ql_!(rcWA>kv2 z*3scOUfk#SKjGv1@bS`v0fLXk%nN+HxaJ8TEI8r|BNIC4(4}^b=r|nhWB8wtfAJm2 z&|SX%fpwR<^OqW%w!;3I@I&e(2lD&fZaf|FHvX6Mc>Wy! z|LJbJk=zXAzY`<*SpVIOWyi>Se_>z7ld*hlL|wwK_k;gLM=VHP z_B_GLrTWz9;c9}BYfwfyeZKSWd_^EI6UM;dVgV)#bM~>UK&-5Y5F~yNi12FR41cn1 z$6^BTYuSAyu2u-qNjoNY4I=Z}HWn`riY{P$eo%ZJHs{1Q;jbsKzm#Fw(GxUOBUz1n zeG*K`uPTgZvAoV8`4d8Q;}evF|eLtXH2%Zm~gzW)pjq zvo2_J3aiz39K$C*?fMvBAZG@4Q+@^lKF_lHwAw_HE-c`QoYx>_K&$@UMTpb|`!d6WDb{f(ZrAA``XAHZbjk3C7k5%44H;$A7o;3hKD# z6$;-^m4dP-6XH=(%%7Nvas^|2`wNO{PZM|*m%UB+{>b7B*;%Q`%c}`|T7go0xx#i6 z`w7tK{wP~kcw8U$t1G;RM_xM!o=J6kJ>eB<*%9OyP{SbU+ZNKv5<-ctCv1zrDi;<`u}6V` z>2~VI?QpFo%*VO<#OmLb96n88?J5MZkvkv@5EQ}86Cx{4EW;IV?tfBK)I32ci+LBk z%Y2e?cM-YY=61sNtaiI#^{YL(ske8bjI7%eUZ%JeQ9oSe)mZ_PiO%|Rmr8Hnp78S& z$A-_RkixW!hrfS)m{)e(Y8T51KP?@$G`l6q0fPHRirWIYJuGD^&LqbkCjJ4TR2TPFxZbkI zSD0ME=;h(+LpERrL22f%N2Jos6Og?Bnd>nGeV3qqmf}2bDS9?wtk=Fn^2;*)=Wj76OU@n3G7$TRXLGkTJx{UklP%?aihSV{)$%^$lNEmcFt?aw ziGcCPf{WWQJm)LEBg>XT$2ik%OwMw2Mx^J{s7p*=8M9Zsf3i=e2|Crk;EFZXt1#0% zL7Aer*?%I~Y~#`4zK!V-hgyDOu*KW-vS*8(h}+8P=UCgunH`@{=zCjI~ba^Nf%H{JY*yNym0bO}tH&J$-9Q#h!s z`4cMqI;{|LiSZN^h&!U3Cn%DcKf${EQ{mdYf`1ZXcXy!+_*SScs|hM-IDaDZ(UxPS z>4m_I(IddKXzf+l`q5X4(FZ-2tz-`!DJ zt53{_ou;!KzMWgaph$XJL0+w_$4K7{gMT9FdqA?C2%B0SDRKr<$oSbDQFZ&Rt^iIn}c_Dmc|FfxJ>z z_lUY(2lDmko6Vn4hQa&^RRAz!GUB+|H~d|K+LNTpRVWEn*-UVS=~qZ{_lc6_Wq&Ka zfADRrs}#z-%|d!xPIyT|J>?r-WrjI?s*}1)FOT5SH4IkzS4A2RON!fKQdztAFv+*^ zd@3Ngydqj1wq1#bYt}rdv^QlKUqFG4pz-j_4Ghozr8XAnHXSNo$#O;7823w&c_*au zgevx~u}89f*Z1{M|1&M16&Txnbr?VE2MEV+AdajsI}n^1n}yonK~S_+4)1atUCej>SoS#=vQHQ%L{2V1HMK%9giKcl4B{x>2e2rv2rEK{Ii+{ zo}e7%d4fu~P7}16xJ?RtKw*ujD{Z+Vg=@CGvV3k6Q>TaJVRpe_R%qCY7J2peRNOPK zpq$v-Fesy8hC%smcgbN(P!AjP`V&{7<9VA(-`=K|A-$dopOa&>f?-9oTjAqDP$%zi zUO>4Vcg2U!RDY}}ZY9FBuRpKg;YVj_HMXIb)h-tF^2-euUMfkv`o?F1K~Q{NOS-6m zxdcqR?IbzRP`cv=}PUYH8NjAmaYXWKt~_iB|4Oaq5++wT;IV9FW_9Y z)LrtzlCQNNroQ5-Vvmhm-r$A(UPf|b`IU=yV)uE04=bH6t>~|)wr97=^r7vSkZN_W z_A>j0ntvDO?zZ=N;h`9o8f?!CLt?Kb)Zm4sl)LEQc>82u;5gl~^Y>^p>-nBjDlL+V zBLSo~IX;=)!L*B0`;@iw42_I^)69Ld$9*G2yP&|bgjAXT_xGYM!_5;)0@t6inhG6S zg3VxPZ9dOXp0Aprc>3naUOB&SoSW9f^SNm=?0^2b{q$b=MlMd}6wbX*$6vA+RRA^5 zxUeej@3xrePE`u(cvtS0b@@5;2{V#a0Q za9ZQS%-i<1oo8HVwrz(@wT2e6+eV*ijep}iEb8YvoHzg6^S$9?iHBN41@Pw?rI-}! zDGoc$(D`V!#?Y<{RLqIeZ{eYz7h8Mj`4uupdv(7=V7$J>6Lf6XctHg3zw&Jg>6dGG zzFQt44Tb$ei62G^TQcAAZgBc(Co1QsW@v;?GfXWp9-9N(ZO6%ZM#;P|C5f#S7=N0G zSAec2Tm*S1FwWw0UjHm|ZY~ZqK@fNp?sRG;MYwjrznGt40jg@j=NY-c zzC4!Qe+x!ktj;|XkGdU`!l+ADI-h(2jV?F)0CX|qGHox+ zX1pUmy-$NLNT~hctA_0gQXhSdppUh3T0r{C?I!=>t$}YQE(a**!E+9f)4<)=aiNGP8gRj93K0W`01G85;YYZv7{HdP_-U2NJ9SBtCm`0%Vk z)+k3ArB`7nL`u)B8lodTh!m)MUQk|@YmyVX+rz~v}&luB{LBB`CT7UOJ!D||tfdo`5*O4_S2HfSd77awwA-m2--TB;f2BLAaW&!MVB<4RoPM6N0aj1h zx#{QH&6z>edSHg}%&M=$2a1BOv!|z5mglfWk>;Nn1g%nUpMy?;&mYmLgqdJ;!R&p4 z(caC~X`GWDGo+&~Wq-*Y`qH{48$MtGCR?uYpqnMqwWB`+s`S*f!i9Y?GrGDEsXn6X zR_1fl^&^78Y0vl+#ivWq>R410^f!*>nyr5WGa^xfCx6LY2d?dD{8^uS-+Mc? z%e#mmPctrjlc}TLMOHP<qT% z3)*=JVf(M__kS|JvZjm;#(0^!0w1RfY4Z#q%UJ1Uz50qWT;|Pck8a+q>Slfyr7tm? zQh(Eg$+n-Rn^s%j0D=xx&0y40?CGtRH^iULYtC@!e9sDw^_lI_p*)cp3~lw?Kb4JS zc}e%_%SbET_vBcv(ecY|g~-Q~;dl%GffYfem7PejrGE}*-ZJAnLtF3j3>~$dXLRXR z7Bdch#sZG3w`ow|J6qU|1 zPWHzAjcRQ$&(Ox%e5~pbTLp)9hE^oHUPH^#`@7Ya(L6)P@1|qb50a>3)w1~N(9Yh_ z{e$1&l?22Q5xtcy-uE^=bvj)W(S9{xcTeg(`yUx%YH_y<#@CF=8eywJ#;rMg# zp(*`aAl>8R&spPTd^|b*FF4z;!216{C->*f_x=>=?ZH<`olnPb)Mevbgjj0W=OS~VoVLoqxCVE z%u@X|0qG*|dAB;OavL8P(d(OVye8cbzyJY2KNmj)bWg!B%Ega za=U@`r&UsJvA}L{&_7^Hripv=dUxv8cJ-FEGYcXu%NdHm=C4EtNobE5%jH+raBRME zbuo3Gp-Usb1&-vbIXzD|&(OVn=CA0)sDeZ3xcMtOH=*#ME?oTt9E&wBvIg@6U4ONx z!I-;7C@_@fP+%w-rr=NwTooKDPpsfj68kP3SFdp|ce^ApEuz#{Q~{m(iV~Ic4BZ`S zo}rtGz9E7(yS;Mc^ls;hoaJs8Lh4FSs;`us{OQi#-LJf~7gccc#>tKA&r3LTv$Z$i zn9bY!n~fGoJ^40oXsE4>(pj=Mbbp8PY+uzKzuayJaCfk`Rz(9;fAG)X*_3T=9-v&%J7vLT*a z9|frDU#B3|B5c)Qb8&E&Hj+9PC2Ze6mc@)q+hpFYa%4lWL zkM#{4S658t8IK1H)-0zbJrKuC#MzIeLB^~>rH++ z6o)Ob{d43f~?d8WDzf-$a7ar7ZRo#`^t%_%=b5UK{6{OlB znAXV99dM9Ro@o7-TLmz_pnr~xc+@zOkKlL*zSw>V#Z7Jb9<4||&(&>Z$K2XaRT`-^ z)SdBpjSGI8*U&sWuc5W^ss-k9FBejO+X8T&p>q&w4b@s>o{>PIY+bOLab?ZT2pgg! zESDGu7nf_O=Pi~8SC(t+4^GDcw!KT$8d~VzKR6Zia0|(iS2HNyihr>73Q&ECNg+&I zQK})QvZCfS)a`MFFfGx)ljGJ0ry{p%jngF&b!gg-zkh1#Lb5uwaUpq4=6gA*ZLIt3 zwmmg{fkUmKwcGtQv@XAQYUjkiG?tiwa1;Vxmo0_4CZ`&wvhU3B&Q7sMCvF;iLstNkcwoM`xpsGpa z641Cs=@Jgza7RI^V+=E->RnI;scO7=A7fjjU&N^9C3MhFePr%1pb(~2-%RP+-dOeF zU4G@l9Q_VBROhiJ(${ck#WcgAMci#NeS!1UHOd)|i`>PwnSbeh8Fdl*nLF-|Zf;AA z>DR9nq&jnTpOUwbUW5m>ZC4ef+O*lWGkxRqRe8@0hkg%KK?*Qvclb3|ZgKhoq+cPW zRM$auw%zbpVg1sxx-X@!Me;AVOgtnTnOy?(Aw_JKHGA2l{`864_Ko|N8Cu6}+eyB$ z##g|h4)*pE7k>uM)SynkvpvtapwYRDsA{6F*3jXjc@1s8%-vnJUYKU+9>i)5EeE%q zG2b8$ElY17tycN>!O&vx{#W+sc;PEsUf8Z-gQr^qoxCJu4;noCqxXqWyCthmp-VXQ z<8g`zRsHgkkQZcn)kpmeBHW+t{^a&l_=3#dQsGz1+kYp!-NNxQ+rIyei^$7N>FR9{ zMWw1lWG2%2-N5@RsPcG4qB?s0do&dF@TQ%&&6^G>d^nrEPd2*VdE8A+&n|S+wm+nr zp_y&lS5MDS#ItL@rnaK9#B--P9ch@>xNwYA*Sz_`zBe|j<=5O-Pe)B|?smFRr#7mq zweFw$3xB7&ouS3w7jINcl*LBv8Wmqb;MpGx;_ zrL&c?7k1O!3|PGZt7fQIB-Cz)L9&GOqAKJ*nScJYFurPi?0%01r~V_mg5@Q39TH}S z1OkCQIciI$_G=d=+|=Yv_er1ExNy1WH9TO+jFPU_$Pi%uoZX#UE+!aYk@qfEGoTPm zJlBQHGqPbZ-_fp_8=M;WhwKl#g!ID4oZIv1n$#KVTKhb0x~P7yMBIH4`i-x+20<&p zd4CP{BD^|y)jC-bkB$a^2LX-(&D9c*yx0N9kof z$4uqgzQ0Xk7ipf=8cS}wh@^Z2nO>y-j~;BMM1-m$3TE1r6SW6cm{c|5P7 zg5UR-&=&N4lxmSaiv~D7=3KM$7D_kAvfs-dA6i?_B1#uLzagULH?Wn6(#rU@@YwG~ zzbbTJnAQlzaB42~h5-5k=@B50^MCpym;UPgHMU^vsq`xZ&{uHnS8&T$tg(Gm@7jEf@Na>mz%q@35#^fS%SPi@a%;S&J(zZBPy zYI%H`ap*%4-d*D$JMwZ3&9w6jZHUb{jgZHun`bLP7fWEXCRWD;+IkJm3V-uvb=>ZX zfX->U+g~Xe!uEVk>emp^+>GfOrT?SQj$N;@=aiq?srxV%Zqey23`IC2(6uHUrMPBv zYC(M)ofk2?8J#wYes$|Z`(|`rhHPeZYNKcVicVACCmdaDIPFxw4sr8XK|9{3a(XUT zZB|>WHxK@n)>>+dJ@I5FHGfWT(EWtgT0^?oEpTd5h-NJ{Ua|yqIOX?fF8g_{o6TOL z|0pH~(4i}%N!;9ZPvd;<%Ba=J)H08qDbl&rVcWV-!J*HsZrN$IMqbX)A*}f;!TEd+ z`z-nt#x)!|z&T;;!oHs|riIu|oL;@hs36rA?L0#TDOLzu0=h@og@5pvzTygBh(1MP zZxZswONVb@LmOW+I#Nxh9t#$4Gu%Tvt#R%^=iziIaRun&=In zjpf0n0MT;Jxz9pw*gks^_7kV_0><|Aqm|PNV+%2OW&h6z(^XOv!Y=f^l5r}Ic8>;s zBYf@oP4^?ZE%LuaNq=s6;Uc8-qLTdO=1=&**KnBZodNR)#vZ(Opf!hX{`k37qQa<} zq3|`&(AvvSeGcLN)tryAV+qG%jh7%*l5&PaDW`b}9qUyyl)s_CQ0z2=5e+bUa=+#^ z9(}(38q%3r6dcOdo8c%HQtssBsWp`FP&1TqqrMVr$^KXza(|!1w0Kcp$ptRl({tJH zWtO(;BbDz_KSlbUN;fmyM>W`Penx~FK(9h^^Nj3<6k0N^gU@p+_FICnKDRwvt16Zi z)0*{ex4fXAh){5-kjM;&evbV9;Roo2^mH#TQ2L&0H)~v}IL);XK;b1w*QdYXID92R zM7gKuvgg_@Lw~)%wmXK}PSC}(GZfGY){qt6|Hz)ebQz{%CupyDEW><*ik02^sw)2F z22zBzLc?61jStbVOsW(ZbEY=~_S81QU`q$Dr;TaA?b91xHxU z(As>0)H~RE=6HGc{#U*PV+jK6Si5%rBNs|xo}ofaD}RJ7umOB|@O?d&m8m5Z*Q=c< zcDsqLtB~9bsEhbYKIS%V1G=Zt7w9X&nK)Z6tFJ5py+L1VP8e4F@?>3sVmgIgz5`)e z{mlqdPZNEM2-`zC47ojpt?}`vP}q35>IuVbMaLdt+pVbNt-=@o`Bc9B9in54Fa4zb zci`*7V}IE;)>bELeQ~GK>o@3UKjRwdzudHu2a$YgO`ib+IWp#KQ?K{&r&fvqn#rVe zR&H*4Ci4t!bIda|1x_ zulATqybZJdsb2^eo|6Gs2dcejd_G z$7`lAUfuSGapHtY(De3{5|$8Sw*50Gytr%eGOgnxX0E_HOq$ z)qFosP}a|4LR>%*KZpxQmwLU%7wqK1?zp|zJ#p-h-dfQ4b3nI8za{jqAdVLZeUA^F z6`c>?nPB`WuW|d}_87acZtmkl2W4)~z<=qx>f02@9i!bg8FTA9{ws3ftu-#Lp=l*WBoA>22$oa5t+_8C< z|2rhlJp zi&Zs4Q`r5lDB*D*jO`Ly{!BBVi9sSqM%XqzRx>nHPe-3>^8VBw{*9yGBJ?6>b^j|{ z@_FG@zF@`+aBPqE1y-=^C3O-m^H;Qhx(&yLiks*o+5kCo%6_acwiX_H`q<+`3;o}e zK3*3dYqouzfR;1%fWC0}y>)wDGJoX@?4s?PH&}l+V~g~!K-dea!b8`u z{T|(w`MS6>u@#ksz`Umi)}x8O!#THp)GBUnPiqR?+GE^q*Y;CQ&^f$mh6hICIn23j z$f;&%-}^4050hcN#1>s&0VvDN{i%!78*u1ShPkI_vTVM0EM+*)NFUh-pMUD{jUDwF z&2BUOXm@ng0C|bB3ki1BE&41c@2|0i!`B+}IaGE3__yq`CDUqrJ#|2NgFLinz2JMh zCBmQB>Yf#JP5k=|_Y(-+3zt0@+ZozrxqWIowtr;}{npDoL$|S1q9c_I{f5n~0ojWV z?e~0#V9@sUwnO_HYiOh5K7R#i3+gV%?Pc7ag50>Pu%^>5P?ImnpVtw#<`?Y-&P?ee zj6Eu_pAZgvIKDvW@5J0*UN4UAmz%ZaqZXVtU$c!cYwZWloqvtv<#sioYhzI`)lmrNFRK`Ir`HrgKgj8H)d#aaXvY15`S!azAo{xMaO!H zJ<_*e?7ose983a7mRx^jPhwg*y>W0mGTpDShx8S8*?vV!^lb~L;7oT?ex z{n~a~z5kU9+xRpid<1sgKi3v++oax~;RC7s*d9==p?UWH3?(S1&0bVc-#@q)j^*Wp zTW>|XJ@a1pujdPn_xGZu%REC%sQW~?IXDubf$@6^Vqd}W{D0(h3HALow!76*PW4z; z*^AQ*|4{?TqaI(hzst4e1M~$$j4xBY59szIFEGB2nY>S>%dI>_+i*OZ2ixUWv?{(2hf>xv7$t+w zPc0t50gT>ev-M=R-baVF#BLrOANGRGhb3Q^dwEnUts&JR zplwU%9k}1OxpbmR1W_sfzJELGlgTH|x<}B7_y;Fc87T9Ri@_EkK+d749Gh8)8 znSa<}+v@iISG1HF7RqOVzN=*`aZTp=t2gi|S;T0?0bHACry zFZ1b3V-Wu z!_;|=3mV?GbXGGo4SoaGU-*i8wpD#a>y?{u;B0a3rW~4^zwr@OhI0RC_kiw?c1OsU z7Q>A6@v!+C=_&*A6GvOOUwN|I=QD7$$okgUy0cJtO)ZI`9QSIp69FzenS7|H0NanM9RgWVw&}`QZlVwk_{@#--~%w=>md z*tEt_qMun{1&2QRZPVuSjDv1kuc39q&AnW`P_5Qb()K<|H5Jb&jS#l+SbvCliLkRg zzKQfpMSLHn+NhYnqUGRCGQCQlse{W{16V6dBHSLFfvzv^_|%O8R4cG;n`?!R;m$5m z`odTC+@e+feWa^Uy+V2d9Qk;SZAl*Cdd9&z{uv4M8oNBf*kv$v#V+fwXw`C$2(KRO ze&gVD)b1M&?!pqg&2b|LzJJyndtTUxs8=+{P9VReIaum^y!ZEpGS+tKea%rIC@quC zOE~t*crV1hLK$CE$1k_C9JEaiq45u`EbxF$*iYy$*9AYFe8yJO@hOq8?WsGjae>fn zPhGW!)-2nW-Rdi$a2ek_wk_yn- z$NnpqO7Q*~+JoOUDppHqqjK9(c?rh)Xun{M3;DC+g~eB1M8{PAb03V?x3c7x3vqm# zN?%xGi;n#gTC?0o>3%EwHU1npz5pLD2tsY@Z~OVHuMErMXT3*8$i<<7mm-icdFXT2v#lExS+tekYRSUMo!Xr=g_ZzUc*_iY`a>p+KZN@Gfo}n z0IkboxhQCv_oA~4GaTbl(Iq}SpiECr?vf+FgFbY?Yk%9Ucu61YHMC@yajNs1(;6TT z2!~VY`s!VP1*EUAoK|4lw%l)!hfXccDAmg6HcDf%5L3r)S@%i(B6fFQd<=EHJeC)5 zsvU-zJS-@*o+{P0&qgf8$5I4AHyQVY87@OB_vu4N&2DR#7sQ7)3Ab(R@3ZX-IK>z0 z6H2}`w0|z>V=}Yn89JJ|5)Mxwt5VqHYUvc<8=)9|EiDS2J`hYVNP9>l&sdE~MPHwYyqF z8(P~gz-kTX{P^T6mqyan8gco1Z4k`AAJWM#*MHEZNb?#dJO2dZmqymKhA)sAw0#$F zT*k7d89)^z%hBeXk30p;vA#eWO5m^7SRnny=X)2K7A;)vTbFpmry!%+i?9R*YBkUgls;Cc5ah~FVz&NiL{i&7wNB? zc;oP3imrc^)>zk(`1_QsUTjnJkxg~}__E-Aj@qqpWeC14EbaPO28k^{qJOQ5 z`6FkmV*Y@Rp>CUTFR5!ue;3iK?SljFNaN=H`Sn*^%J#YB_yTEsVHe+*PxA{N_r=ru z>in0RQ2xVU+1d)l0*j*H{FNB+FCEUQ9cp#S#8VaKwkzv-#^uS+GxVv=Gql64)|jQn z+}Kq;o1yl~?ri5m@ojThwMKthwSTS=rgQ((RxS+6dz-!Vn&ugrh_}6|)n=o2)t>ay zcTmR*XTPPN&5Wz}D%5UGF7=#5-u4}z;V@7M=^V)2c70ZR(E{rJ>F+W2r_jfRmi><1 z>d@o;-D(SKB|g@>)fvx)_$bS-?CIkb@v-NZoq*BqhLX2RozI)~5!*Or-G5i&V=WxC ziFALnd-Blb`S%G(C)Q@+;9_;|_*m#tcdXAvJ0$P3%g-ne^(4+4;&d+@7Ruu{u(PTw zKFJ1QXF0Hbt+|l3JDhdPPty$e6W+3K#$v{0jD221tDmdRzvsl+G^1tTPWF3U&af36$q2#n zWc54e>g;jy=A3MtX;25C=QTim>z`|z^UlvNQatm|hgq{eu5)PM{#pGdG_{jSFL2m? zuU`PhZV3azrs%Xwy1fX(t>|`1l^5Z{73D19(6xE@m(W(`EIMl`Hh-Ve#`g$#FG^k@ zjQy$ZN#|uo`U#=;6$GkX*x#j7d4UqGE$9&(NW+Je<>}!DXPi2yK5WznHs%@H0#!5A zvFRBzMim?(m|~6<%yHX6b)KQ)JqiwGAE+71K2VU3!29AWS2ouY(ly2uh26)xH5qFh z)BOrk6}x%^QdJSOZv--#;$6<-#Gm}B@alKdl`_r<=N`cxq`IEV9g$< zPdI9K`ue`Kf}@z|PWM(6&eJflR<{@c;5Pk+n%N+91AQsyI7W<=z%^~DVR4xs`= zSy*ofhatum0_Mt@QYg(f7V^^q>9+*#5>QAMf9!6n;G7K?1%IaU*Omy~OWWlP?ImAI z+fzbJ(Yf+Y-+**W9NL#!N`@tI6wpqr#{!o(B*S(uI+dv&ZL*N3iw7z;%T87ftMN+NZmi{`EqCPBT2LE0e=#JBfLMu6&47L(xb0W%-c{(wk;n z$j5mN6bK?H#EALP5c9!Jx5-LM^kIFAp)@|b1amrOJQxT8WCo>#cTd0Fq7R^oKd5M{} z2e0E33Lo0?p7Al9`ZWP+yZSypw6^#LM%d#cMGq=oN`H>4zF%+1mOZ!aNo>zs1lFycj?Mqn4U>e;uLJgxsDR&4yW5PtlP5E zG(*>?sx@pX!Jph*x8MVJJ>wGR^H-v`@$`(D`ie^SYJAK=+IbCYVN^@W+!7z%NOKE} zUGlWsa(~;rh7Lc>_|S@F#)no;^H(%aEBa8fWyXi9*n9&Ys-AmZu_b6#UEwtZDa{sx8%Trn&!!7A+F1HONzbMN|#w{hxMd7<2<8P-Jz zbMMS@hBvTCju+aaeBoa+hbIHMaL5789IP5!=V-5)VWi4d%ydYm++xO zK7Vr?TkRlBU%Bww6 P|3CKLX4jS-ITM@Tr`SV#przzblFXq5b<1eLFf0{%BJ@Bg zmE;nt)NZL|!G3y2Ff-R8ePSSyXNA^I&GD+zre%Puq#eWJz%+=UzURA~-I%dVGDz*UP3G4ipprN)@ z<*ueQi?uc7Iy-)>MLo^oMaC?6^KKAbv?p^gd?ZYIUP9*N(ayZ(jj}GvVR$? zZT3yB1>NK1YH9B?Wo7;Og`@-3QTAYU?9j??@MF+pycSjSWe?Oz!H*&JxwVe3VA!^yIe{?7xMYzBYZ=?9OCD-q z#W(}!Z|QHjKK4)pDYWROmn3~`S_YDS$$$-QgL3pO5y>+JdyY-eC#;xl1XZ6i z+2bn==_Ol!eGGeB$E(GN!++{wi^h1C@mfB!X=*S!HNkBz{Paj9(!^^?ds$F)T*&JS z$wfKPeb;2zlb43c9=KVu2eM1{z+;j$RHCj2Wrm&tD%ag*k+a}kg?UOZ@B=L0{A#f< zMywWJU$<84%nqH1Tb%HtRcyutSN1G9^8YO6CXvrO88$b^JMwm+)pSV`&bNMy-B4=`CRw2xl_7rZ4LSzmt0wmry0tyadw&5}V^m27emomOf8LP4 zAv@Twl4uoY(m@#*&BAvFK0${qp`X{e;J^#KGdcvU zy&>o5al{yDB?H)>QAtWYnc20i^@dG@070_jyaX~fP=EHOVa>r1t$3at@YWW2`nU$tU#YLFBw0Y z6^eb8M51GqV_<|hL`?-MF_MsDpcNNAlv)~u2>u3Y$!x-d&0~yoa9yfbQa)S@rfxtf z1g$2ewmyz|Iu`SxJ|g(@jomkl@lOwsC?X=unEdfM%snzkjEiRrw$nKTN|ZhD1R}Yi zK1tj^cB zAI@`w1FVu-V>`cXWg*$=BHtk>B=kU)y|ML!ja4kiyz~q;;mRySLdQb<1wAlqnP2Sn zF+Q_z--I34rQ-{P^e0R4S8(I=w)jUb_8Yk2l>)nUPsZZ1JQjCiwjXp3G5Mee@=L(7 zDT#&zZi8|@*#q;xA&wmq3fnf>gMXHiJjI)w5?MX)cpR1jFH!&<=w&U?$nmzAO9|`h zJCq7o3Wo4`?$z=lr}9u@7qgfE2x!6Z=P@WE+0hQco~20jH1lwvwO1Qvx^ zFe;H_pw7!4m{QAG;8DSOet#$*al{ySQ33e@$|5N}&+!d9oC0KSa^0K+qS{GrXjd9Q z2I14}4W45NKQDtAvsyeidZ-@Kf)uuO5}uiz=ZE6$hw!672N|i*qqB}*ag!tlu{^Cy&0==)dl$2L(xlgU648l{Qvo^m`Nt4nE8MK*xhLnAWpB`i}+N|eW&^$JY z4TTj8nXxr)2abIbuzXu0cJ&|BMGq{MP6AR7->Q{kC=8Wj!24i82Uao2G0@RUI`Ak% zjG=s3m1CeAm1E$kjDIzT$qyw^lVkLWmHa(gN%?zp8rC|Dm8wcF$H3fcehjp5VhqL0 z$}!L^$T2X05@RUGTyhL}^#61#FArR z*a5Z!QUy5%29(ode2LzV$M~$yzW@DLU&lI+X{a0nPn0d4H-Cq~0BzcAj8$IAndBH} z_+^TP62eWZymHVl$AH&)ZYcB#foduef^pt(^=Hl`_T{GsK8*UERv#<&3$5WnLC->q z+13MfKdnO+4^*Vo_3?;gf(4_okc--j!%%uRz zD$s#mSki&kMSqTgQOz_>qwqr z&a7x$*leBrA}Jm7bZkvY*J5cg-a$+;(E2$%9je?DZd}O6PY<-hV_RIkinel~6(03e zFURPPX9|+QK~#LcKsiM8{!fgt4aYEMp)n%KF<(6z)A5-xP|~e2R&xxn>2e4ZuphzF zAsJ{prhkXP%*SGAG{-=5`~w(@F~bkoS2Tk2WQ;duJjR$EUmzQomhvswF&+czHslZs z&Cy-0y&>o0UBMuIo(^>PVhniaVxAjgjfF!dF~quM{sg=hW0K~(h27&k;WQYkp$otm zm|IPo;xR+NU{5gO5JM=D&v!v1E-`P}*T9ZqcYlua>Who{j7bDwA%eun9%*B%(js~# z0i2jaTuOgaIS=iI0Nh;MN^9zPE-A%NqSh=19embL8F8@bP%|qz3*Ipovy|1lrF4g> zatxGn2|x<3xz3Mqfv4luqM4LDMKfv1m`R7CaRyHfGBhtMxxoEj*odW3lh|O%1-~BzRUPC&6!?lB0>n$nW<4g1(Ut zE&Z*=c?rX>|B@e=2FNim>y~RlCn@=HzBKnn7v2DdKzYAwb@L4KCs-N+V8mg2$jyw<`)HnXd}q_tSaGVgyDFvXh`b@d49dq66OM<65b_J}!@ zjgQ*hNco#J&@%R`0{*KHjHLzPKB-2+Owb-%UM|A z)-Iowv!HvjW{Ku3=+7tj#XrL8NUOWJ)IxT)Iw;@8i?kg?D91;i*!&CI0;u=10yGwN znq_}kH*YdaNl4@jXlca^O5iJJ!E{#kz?4|-ngrwnjm6a6n#AsbzI=YuzCtw4e8iq* zym4sGr7p?WNvBmwsVbAZf+tk-c64B!Gyvfn7ViCGFPqW$Zn26dmz%Ps!pq5~^SZG0 z<5`ZaeL>XD@5arl(-o$lQLR16*sFgGC&Bc8UVPwO@OuC|hliu+G}W2`3Z63M zUZIc)E6ed>R+5O0sE-o=68I@QpwHNb9G7IE&yYRPJ6d!ki;hBk2(G)QH$MyJ0AiLc z_;rb$F3DNYa#;A%##%H8Ur9$u6kRPXFg?tIepsWl*96HA4B{-Vn>?N1y1`TJF>-%% zwKg4SYbDpQluB|PExIM^CQlVhD*169lp13Y*H?ap=B-8zrEsA7#PpRku7{ADR_w8T z!BQ(}U(WM3d+&!Fy=y9)WlsDXnfJ zaG(QJ7J7jA+@KV`1ok}|W4oGkoPut03{?T>ka`atApVgo4Uu}3_P8I&fM|bjUOa|` zqUivRu1nrxYXxseDOl2ZjshkFaFkz+=)SMbi{J%y8Y>HBSDx2uu=L6-7j_nm9Q1(9 z2RK&val1CMo!__%QVQ|2q=Q^!%-!9e8yp*p*x0=(Axv0j`+2;7d?MXe%L$z1#aVc+Hc5clNXI0t=$7cm-|M}Wa-n$eL}=8 zuykzX5=m+M{Um=6tZCXx=k`Zc3WZpa@{!;}OxYigapVrJGm?z@kb9O(U}UsCvIm9~ zvIok!=z$*upag6DLEeAX)hWzVaiIs= z$?28IdQ<2Cr#5n}lqC=m?TH-FiC*{zaN~jmqAivZc)Dqmqhp?b#lB6f)|4>CSIgBd z!EbMRT%r^s8`%TS5ay*6Exzo5zDX=L@Iw16aoP-CFh3ZWSfo_YCNb zjl;nAN4SN75Nd~ZU|@f8a$9#_be`)MlyW@AkYg8AZtT#no5D}1+y#?t@Z%c&j`eAL{jd4?JU%Jy3q22k_h)BfX`g-+K$O+z)%) z?|}AL?#fcu)E@xIm7r^pJy2KXdwc;$$73iq-RfadIv!&zKNo-Yg%oA!4~Q&Xu%&dY zEnmU)vBr&c0fWYQo({(t?QJIeNY*lSUT|KLukquvHflJ=&^Sz(Ig^a9V0xe+DRkH3 zZwTR787`QQF+aYd$IwV&PI2Fi89lV;YvsOBy18sLPWg=CH^lTigfGr7>z;{(!jCNb z1p3%eJqP7n%alH#2AHmvNzpB_>PeD?N&hKIM?6>TvFw31eST*#(6TUn?H+$m&Qf&sjugDkRy^Eq8ZlZ5U%X0EZy7vIpA1 zA(m<1BRxX#t6RGKf0~R7Ove;&h{$|{rDKL&m}R{A?>A08U7p*xOHzss%v$UlN&f;V z{Q`e&8E*^T(U*cuVcfbc?`*?`&BxlUc?&e|G3MA8j4>9m@wVV$hLChV=~~{{mn&j= zp~u()4H>guH_!8UkdCTx6_6Lh%z6;1P ze@R#~=Uo&btq)&(q23G`ztbr}9+Bs=2P%Kl5C+nmWi`jZu(j(EAJ2=$CLLo+6}2Cs zzus61YNTAsM*Ql(kW3S*L`Xki20|n9vHmLQ#$VPerqpn3t9%*1D(^n0DXF~ zw3f2E@J0x)NIITYOta&{QpSpZO!9Q~5dXC$%&WX2B$0^u=l47x&k;`JV?x(ThH!tVvvm3gUpX#)+B8H6ReSWdX^3|z=_n;Tx4au; zv~QPo1p`jW4@X;)J|jPu_%V=DqGO?eGQXSUilh(u@g@5*nq}NWIfJq^-`1C}kPiet zko*WVMCxi?e#E|@O_y{;mtFt8@XP6FEMYch!J3=teZlAcVE4Jmg6no{je37?Z?7zN zi7u`?c$+l_p2k~7+umBt6Q$~V;+MVmmoyGfp(b}lgO@UAF{R^*ZP4lX>CsDgFf4J2 zHEa)gAy0X{H*r?C4iOlk2YS*W6u7d_y zd1ED`NuCQycbTCY^dZ{vG@*a%LYC#tB$s9MjeIpSn$0oL`b_T1B^e#ax$2wVA~xUH zR{Sb4gcrWC4vbo-)}f@!7N@-4!#%c*0>$1NSh8jB*g!7!Xmi;u;u6-=jCf`0SCLUVaVQ?1&=SK2_$Z%+&;MTiM1GGXb*qcm~v`cxPcvQ zo*S5s2EIY$LwiJat%e~Xl}F}VENdd&Jm?(a)L7g1^ETXpSWv@a_*R7FA_(SFY^rm#h{|siXs) z&k%_822b&t+~h1Ige!liKQTK~X_ahu2)BHLAH&@r^W*vI(SA;`K4?cXP2!+_T(^(|0VIhBR_}AsL{@>jrER-89 z&8if7#orhMY|9Ov zj`syVp_uz((t)2pK*ZoKC-4I-hslr6@buhU_X(a3L@#kMIOa||B3 zGI!2a%CQg*xxRW9_7=Pj)&c?H4P*HQlKdq+9rEM4u{4Lk8&{^Cv)M6LsIhpA*&);G z@@%YRa16C+dJGgFF$BI-Jj-;|;|nq%n}A*M6q?W+O~@!Gf#+Lq?3*V; z$==Bx1AXz=^BnK=!PY|-2<*UU4;XfsYm@1UlbqeRCoYGb5ry(|XDDCHv47E?t$q?-0*WjGQu~XHY!jA3l{OC;m)) z(CLRlDtahpUSjT{_{dq%FiHGCDEW|Mgh)o5p@V!Sun;KZJSKLplO(W$XW2LNAhDopKU`Kx%srS^-Gq$`9n(4 zyUu?b9#RAU#w1)aJclWFwuIr?sU_*Q#$(71A_i`0UhDD9Qm*!l7K|QOl!5fkyB(tK z=H{#C0n=i=MLd^{^ z-V`-2lat_SlGVdh$6AU@;Oeu1)FSnW`Lo<`rM6r;iEeNkNXB&C0( z)*G>6ZIRt!40NP&Uoyq5{KWDbt^KU)xU??==R&IuE4lmbFnS1!d_xMyYZ+RPu_qm> zobs9T;m1qhBZ^%O1r;hzaB4NmmxSR^f(pHn?1&3{E2!<;Se40y@q0e zXj&bfu}dIy%Wg_C9RUPphp-Y0GnH4Z|iVN{xrIVfy=C(yx&z)AtJGTR%ud;)UyLQiC;JG zI~Og9#86?96J$q;3d&bjiw^3MXh(br%bOh;adX%KLz=I*eZvlp!8%I&@&SJ+8lFu_ z6-bo#yY8dPG@avZ{gbG`g&{ugvBnNb39G&fz;KGihm}NzBaM|bWl7YHl;xmv9dcCk zc$#`=^-w}ciOQQRJKNJh0Z6zlnaiyj00*EH_f7V|C{xaYS-%_u&$p)6LS*Dnx&&f+ zEs8mp5RO>7Bk6$GN^WrMNT`1{bN3a~AbViYGruobiX!(VxwY`O)L_nXg8AG0U>Dne z_K^Fs2J%hq6)@NrOxxtXpgo?KkD*p7=fOj)Y~WaSWXQV6XI@{Q*VaXo%w42*v$lV^)+?f+99Yh;7LAXj z6kW7j?fKc)phFEDi(_LUw#Pu{XqgUsEdzzTVg_j?WEf1X zUtUivU}Q9HKGI4S zjL9%LM!77lv`rBup%@%lgxcF;u=J+~1fHZWFRQDsFRq-s`RFL&IgcQ6zf$j43eC6W zgL*#plWmk@Q}r# z!(gZCJ0&|$S8!Jm$D*SF)y=BN6_(Vjw%(OF)0+dmz2Whl_lkRuMcx+#a5o zp3}Cj$0N?Ayps$0kEmv{2PRT528g!+u~X8d>qJt#@5yWtD;Hye@bG-H+}9>a63{eG z@d*uu#f8uCdca9F=a37<5L$x$0WKKKa_Vt1dtjnB&+q|1E{%cblyVHTd_s64mm~IH zCMn>B6CBgvnU&asJo=Zc>7^_bgm%Zwh4*^)g_4P<{06ukKsu~OYwbfBzlBEYw4ryFIT2(`|<^|492)5$v!P>cVsdzgcmH>aIs@cIu@}3 zrSX69d{oA?q{?*^3APD<^*||}by+=Z^MS5@UMa_8*cScLrd@DML+gX58T0IX>zKwW zfIt5R;Y{2@+4giM#K_2Ci(A&b9A8{E0i*UTVtaB)_P`>?O#rPG+6hl8@1h)fT-N0Bbu{-J%JuzJ%J7g z1Avb1=@Xct)uMUn97&c2`f!8UWBL8eGAO)=^mAXIHXjjb%KwN+|5#lt*|#YxXb5~d zx^Z}Q?3ibR<}SlX|&=xSsg)m72@1~EkP3mJZL9f4v9|H!e1 zwz(WdoSPf+Yl!@~33M~e;`$zq=ow?EN+KzRk1{}MFIbXFG&&Oa4n8Tu7;pvvRHAE_ z;F2VHF|=2~WDh7iy0H`hPlhqj_Q`)O!C1)J5`$8$kY;u*+EFaffi`Cd6$o^oWwUS* z4LY>61=b=RoawL#stk2 zCj@hbCj_r4J0q1=!_;YwO(dUdi#ZDnKW{)AOVMgo=NW!M$Onc)d*%YhfUkc|uyGXK z)uUz8(vCLnm6tB2;kZC4h9lntxigR;@PnDQs2s;O3px#e& z?7}SQLM@J&yYFJyB4;2b$MApBHpm!!cLh4&f~eFNtoVa5pwJz5A5%jM?9bd6y#54S zM|(ViJOx7GLmr4J#siY+m^2N+bY~5WR*(Ec#B`_(6C5+ifRdyeWQ^^Ld=un`K^}1Q zl5-i1p$5JdJIpbZtVc2(-TAzf0%#5}{X|$a#vrb9O=+OuWt!{XAn<=kF|nJcp+hKq zNulC}hvR*>O~QGh6b}KvWDopev<(r`WDmukTj+Ow*u$Vhy97GV59Kq390RUDK@Uv4 zhnSUS4|B1AL<>wuBPV)1k3-C@ErGZmyVOV$+GmOL+d39Nbmf4|3ZbuD$Eou+rFhgf zy(MS@4Q$2D+%$AuatMF;;3qc~V55N<7%t3h>f3)+vRD9)g`@6yvBCI%2$*<7^e`xz z=k}>WpRjCWyM>VCvo=Q_?oSH02KqU_B}!^I=}OeJZf2nu?E6?cF@X3sFq%!BLr4!F zO3b+|?s!9O8zKxs50u^^_#gD>Es8`aluts*4vImOz7TF^Aj^K&eLXuRg72fxP1G0;lSuLa%Wob*6MCq)A@3NS44m8*Fo@$RymYw9*KJ&D4UC2`ha^-#_bEoHJr1LMOV;n_ZIe#T~016~7u0Fa?+ zI_$j#)a32E0CG}@vSmIeD-^TD$C5UVbxCawIwdF?npz9o%~?J0jXc>yaT}5jG;tF4 z6OUAfkb357jUHeGCEy;sF(rS0zA=?eUMMcZg4(osffj#k1cL~Z;7R!qMQ(oM6~8pZ zubkNu)o55Ny}wW;)e@87%|)06t*m4xyaI0Ok-gZVJ}V_AQpy2%9(7SZMFXqF&`DA% zU!FA$kImBYBx8lgkYirT2Qv6YCUPjpLraa=Y#_(*B-bp%w3m10w-(`bVHSY%ykRAW z`gB3Bhns(ok9dFC=Ku77BRo9UcO*Wdq=188zFs_8AD51I&^7@hrZ{>DMTP<BD7&)~dPTYvPd!a29t_DLFaWoBet)g+#cymv zm56`jyI^^449;2VK~nJBBL@nM3L|Z?KJEEsUeSuj*oI3}F5v08hG z@nX@>%gx8cOOAo3E%Qr3%Q8R4pMs@I)#`tbSPELnAD~Z4>?HLX9koQ|#0!mL4E$;< z;TtiPwb)^*A*9+ zN%^^?3*(LZ0-kfB4B=q2+h))qO^I%`ggv62@@CBA=K z4{RWRk6D?3O;h}^90P5!7-Ng%0Q(v=!0kJ#T9Y{oMjet;j7jAf5S_~o7?#LM5*eQ! zdth!7wTOIrt%^3zk)av|IRrY$`K?FuHBIP7%;-LuN#R+;7W>0si%w(LRC6!KK*KZ5 zQN?vlQ#v8$Mi2GI^Zd@9>GE9>9NK@TFR&|PjsFS>#>mMc)Z~@o_84>X#hujq5? z@B2tfF=UxE=I=LtC>EGaO-tqlcY`&IViqN$o|KF6e%OZo8-yy9c#|Kj&NBG*5jM}( zEo^6TtHhQ=377bEpsWJlPytAop9B?N&Vv4VdKTrDj+_OaF`6CY%374nQI3CsB53u< z=334tGK`&5Psrx?1#kUZv)FVD_od`Q-t{e|m_1DL^qM4pe)knOKd&!?)sl>5T1M#t zl6e{XlC}IPI5wd#=I(C`QIg+MI+h>=9T|do&h9>6U`W~Z36V96O$P?Ok{>RHm_B2J zF3BlkGg&aCiKl%>1VY1r-vqF#3^V``y*F@D@;87 zt?+H$oldtbBLNg$w4GDBNOgiP$TOscc7KWO*4VV9&yWk@7LbAnaySn-cI*Q6^taf; z-=Vw051a@L4R!%*HBXE78V8O73O2t*v}jK~);5#BBXn0}0qh#kQVM_V;_{xm6AEC< z3m#wCeEAex;Cm`;bX+1OUu}>+twone$xCr$_*auF{^1Lw<+UhK^9#D9B4e}gv{1G} zUy{l}m*xSWH>1GW-z_}@X#HD;?t=Xp(Q--VF4+H}o?Y9!}p>Di665UYoWpWgSuM)`fxHJ_uqf2;DWL;u+DOi~Z zcjr!*A-S5k338(gsdON$_C)CilRNAZ$UKor?ha*d?X=?ugW6A5cShkS4kN?vT2dFd zXMzmx9Qk+-wfteuMA(lh|LK<0l^Aj}Zh>5W7walj9; z9am&wCAKVW-S~}N{32=-zyHvd?E!&8tLWQpv?(is?607uxs4mpQ+CXjW3T)6M^z#FFfAlEjiLs5tiieJ6UePa7#tfdkX zPOBnbpgy|%^ZTH><+o8gc2zezQc+xD{T=81*g|n_qyO9}S`7$pG=LD|D9T~L4b~}<{}Ar? zjz*72Ne?2!Z5^!E9WA;dQA$AgLwwQKbV0~URC<6(Ji7e!xQ2pN&)dPeM{!MhP|VNf zhYKPPLM?wR(neB-sF2VFt`tBI&Bq9AK2HN|{Hfa>Wk`y4GY@G|#BGQ#DZ21?LoUkb zWl40|wzRCdy($e|@J%~pt`Z%Mz)3}q^+D#C#^_v`90P7#+g&V5XcG&mPfd%>E{KDG z`wS>$xI+MqeQQM{QPBOW>;kn!K<={^e7uL=UNe6H?m`#59flJ@9Y0bV$;ES6|Hdi+ zVlK)yJYR*ftsEB%$@Q7yN)c|z6)E9{q~&~}&(>Ca#Lw1NYmY98F5JnzBXgRImx^}6 zn%JWtj5JQ9#7{#M+<9^}yepU}Q=Yzd&;8gMZCgt%Xpssa@AV_K$_e53fRYW5Ksjta zE(U+O_+STAU%ZPap+kH@(M9zzU5`w9>V51=E^!dW+Rk>-O`L>fRL(!FE^o+HLct-5 zpfVB0oI}`797Rb0B^se4zseuLtx>c>Vx&b;_aS1c=)$QRsPYY27|5K!i-yg4zDHt9 z!SnsFPY|KSXR}?jm%EVI^DSFz_X3%=6#RcXk)gzTKCcbPRSdJ=QPmMRAYH?~pv<~(nlH0Lf= z?Zm@>vqxichqO?*lDC+7i{vOjJw{mh!x#M{myl45P)m3h%G=7bfJ8#mDO;>{5uAS? z0^C6t%`ZsENadSd*M-vEg+gCZV=_;RW;NzVdEzSDE7B}j*CjqGbL}~lJW9@?9NVsA z`)0Ak;=S$~BtoTfNF&y}P$KMDJo6h`#?qviKnbFI9y{5KR$_o53Z>1KXs-GF9uN7t zDA;_rv{Z>TXSGzjPA0m9$3~WM4Sj!7c!S(4c4w%_+S%4TUqnDE_V-D}8*pBlJG(p#+FGs8xTek1T4_ zd(MgQ4RBrYv_sIM-DMf#wjwRcX}Rp8#6y<2WSezcELjw--(VeFjl468=Da1jaf|On zav&;SLxyhmC8dW0dbd4e^-x@p1gyo+ih`27kPwJ7uN!vdg1Rf=!MsF~8m~m8U{#j5hzg~7T^;L?HONnoMEoPuhDT0B@<&+8gOZNSlCV5$J#)`8t~zpS ze_A`l6~rz|ByRzA8arFb;=Up9wuuk(Ks>9wHHV`(NBEi&~jCtm2wnNqHbv3E?kjr#S2O9(!b{Sqg+_D;t=JUPe6pvnagn( zEg>GF-`*Wy3dcI3$0j@_L)>J`Yf%uKaZ~Na?Qu1Hr6KUj(2{^7dC%!$XgPqw53HTp;!=K zPz^1HH}pUhQzS(RJV)@J$XY<&oR?cq^Td+bOWD+F!QSj9>cu=aL~hI$r5a>%kP8}g zWe`N=n%5vbroW*dN^$GF?HS6gUPg1nnkoVN5a{=g@z)}-*+px(n$zNPfm-c}Fl4S0 zuU{3HpB_l?*bILQTVHh!3m=%em^W&A)`AKwx92lX&HhPXI>mf#g0IR4{vi-3PNeX4 z2$F}i04y$yq6O=-wCF-BX;Eycq(#vVF^W>1EC*3UUy`B(Pa}|BT(V*_ERaH5T8dli zH&<_qf_8uC6Z>olw}xd1qdcFieY4L1?|w^*;7yr3((-@A#J5+Z-2$8Eu2zI3cN(5V znAgST6~Z^_s(kRgVd)gxKSbv>_sFJJJHnEjQ^EjCbjRXi^H#Z>VwqfPkj4_)ti52N zv|C8C;;#pda+LFY)>a~XQ2UM(85z_!4&tYW67dm8byKYS5f(@5^&zJ04-9wbmZ9Bo zW1u`aigJIqNRFat572_n4o1Pu0Y-sG6Kq=SQBcER5KJ88AY~=am9B=_37kB{K!=H* zmzZp7m3s+5E($(y4*el?K?eg9p|-;)=o&OygjY3JbYT~5=^k#Q>ZV{KcnAx2I)uP> zvaNPTz8vp5haq=Av5S|qNIA}t3sPJ&a1Ol?a1MW-2D~G>isPM@%jT^VOBuBnYH-mQ zkC=S1x&-oNBy)Y{bz>s*Wp_+Behq+8;9cumcHx2n8kvquLN}Cd_39{$!dEH#PeU*Y zUMq0l1D-TI(&iaIf%NagZ`&jArL?eyC7*;!EHMlQ`!3p>x6nmXAUTR+OvhMmFp(13 z$ccZpvUp)w#&~aX6it}qMBVGm$XUg}i4m0BzteQ6=0I{yaqto`4hsHckLMK?YY_Eh zc9z(^24xZULJordQtl1jRK76?hKt4+t@*Py(Bg>-%Ymu^XJD|&n7^14*(=h*B7w@N z6sg>>Do>klD?7!|G*A5!`w!3Hn&mEb>Q2nYi{06>%*@9cxN|Wo)54T0Wh9AoFlwb^1=KNS7 zMHl6J1B{{=<1w*)nW(gM#`<3v~xD7!o_`&+a$1(`N2q=eatfOU+IH@$xW z>Z>>~5jtG}R@*3~?JCJ&5aoPDQmZHjEC_t6gd|1mT62f2F4~705EdorkX-5R6y9No zVwS}Aoe!x;Tg5cDEhiGbN3K=L!EUIR66KH4GViSBJo2?iQBH+_gniRq8oXn?Mq;n$ zN3+tThVc?lRykFiCia5SUp?zbhmwB*e8caPlKZ)2(qhu%H>_38nr_%)YY%_AU-!hP zkdvzqOZaVNi?LN)sq>vQ2Uv}VF>g2`al=lIM5Bv-;v!KN;XN3bNAU=N$%Z;8yC}Lb z#;25B6fby#6k%v3P9P(j_xF#0uZoG3@Nwk5_>JCVbB(V7#*H<3%r$G2#<+i3Jkf&` z*+uyZGzNZ~6{hAPi(n3duP&mbAhtJ(K4#mJbIK`&Bo~VnWETa*9V7~hG^clnsEwrV zYoAGvkp%DXU-=#~J5d84_QpCX=M;0Qs(p+SlTe6xn00f(K9I=83g%-9970OnP!H{! zA|U<3J#wJs#K^SGhEgapZRLN|D^ox&UhD-chj>xb+`Zt0-Z;B&;QqHza@zNdD14Na za#%)hIRT@b#FUI|1$#>>ak$F16xTgZB)cexw@yNsDK>D3;b->nb{8xXk)(t~J(dnr zT`ov-?y`%LcZ~7jU=$^`k}!YDndBJcOm@+Z@g(dd)<^;C@a757qMU#9Nxmpv^~MHZ z<{^8Wx@@!MX$Ealv_tt>q0@5)!Q8y@cf#)VjvL}~WzovHmR$64B(m5m(!Oktkr?|f z;la_$T6%jc$yIE>l&G-M{`6nIW+lo$mP}qX^f8N6BP<7cX>nDG>dre*t=UVQO68TGKbRJIGDjf=KG)Mlj%TM><;o;Y`dVY=| zkq2kE?Uc$wDZM)h6##DQLV^;yn175=CA%oMF#9fgU?e9}+>pSM3!WAwe6IxeQlw4N zqMXsdqA|X;K-_{ok&=Ii6=`KUaz*(35Rj{!50Akkr7RQ*O4+|%+~v^0ksZ#H^aTlCLqg?D^C+b6DKvjy%H6?2#M z=tkOWA+xMNk3UK|H0r!F%N#W|kI;MkrzO{i|`Z3k7=QtNPP-LGI#KGAex; zp&UgiN><*AHJxO=)9ZQ+XEMB}0)LaZ5rB6cdllyF!l!oiz~Mk~@ylNe>=;^h9?DA0eRq{Z`#9`2Ez7LQ@t?Zq6Or$M}J`!EdPvg;&6#eGIlrTL%b=o?t*=ebLffA|QArk>hmXw{iUSX-ZJ&Gqw zUh&&3u7wB52x(aN%sMO@U-+E1N-Dw&h>8-b%Tbh~LrIJBr9f_gatUzOpzC+TU=+-i zW{rPOb7=m?b13;q*CnzKEB>7#>d}GR0HxON>L@?muamfw)eDJ+X1^XEj>u#`7oNp) zLvSM}k&BeVVL6BrE{QHrL%Nz1d9pg2>mb(qE`fqBlIzmvbYna-Sdnr(DOaR?4jn@n zPEVxUo??i;y=YA$moZe|Y_!(md{uu6R zY5c56>F`4m4Gu2>$w8F-TW%3X3X*>-N@gayxFx3`s;?v|N={`+i^+cdICYGMIK4wE zb|#FXB(;hb$;#O=rkSa(_M(TTLyxBCpoA`%d%#413IS}vXj8J~c}5n^QOInq zg^9KK|6H@Z9+YUL7F0)$qI@==o~SYB7W-BFTj&C3Mj$Nc<>VmBfe^4C!^ysjdLRVU zVyN;X#9u8&gNYD@Omu;?A+c9!8Euby1O7$L0gx|1d*sl7WX#u$~iuyLHIm#QqF*1-^b<8A3@RSd_ zU?L7uhF2{8_duWH7m<7oXDHtHIX_aS&2?BQ62kuqIE^qA8%Hg{8hf z6Of}Qmz;2qPyr>mXW5=TN-ktlmU`8~?2<@6DLY;)?yAq@!HN)OP)?*2SwR=P_zQed z%=r+gZhE6HNEFG!%GiIBy|Lf-L^)o>VI1nL1fpq!xa|iqIchynRD0f(}e8 zy&mU`5!WQS3SK0Td)}3`jo~w7vT1p)$Yvcm3Lmz%vgL;TSH61zweSEKFiuItX1iRH z%8@2sFmrl<{#`KU_<7~9--GaZC3W|?R?3}^+W0Z7k?cZAjSGMM(UI)(jCzaFMLp^5 zyM)IQNKZott0G5HZnw%VN`(h>!H);fMG-fFeWVoN0(bG!keo=fwi2pIiEAVZ76OP& zujs-a!Hpo81T$?p02cWI*Oa4!F&-X_qBsUgtzxg`MEKDXC&DaAE?RN#65mZpK4!(1 zCfdmE3$H6z1RsA6Kn#?)NX~;FWu|vg&!((3+ssv7t%HfMN)RSejJli%pKJu?DnXhA zc*7zCIf{1FBx&))me?T^p^l&@lM|iAt=5Y415n92<&a2{OJ-$FZ=_BS*rn9rwV-Kb z3Eu#RQBKK!(?!Y8tuEFE==tFo zx9i5DmG7spjmjqkL!#C<8-Os_ceYV6JrY|DFCKw-pYfn2yCj&DP%Zt(Q5Z$Z{)Rw_ zz})_vb5eg(RXi1trA&I5o!P2czHzec+37z#{brk!WNW1vR?wLe7qjq=-zv3k)2^6gljc(`WZ!{LkVS z67Z8y3EzYF@w`M~QubKF8jDrt9FmDGLJ*T#N}5|K*`@?RbAWG3IxLs0WES&6iSX@r zte}7LiE-B4>S3T1ZLE<4Gl;hyVMWTJhUAMQ3)YvB-r&p7Bwtwc1!W~oTqut4Z>;GR zll&AY+2yBu_dv$ekvXad&pwsMMzoUMrl{v6bO^=eC8iMqtHK}%oi9gGUgPir0!Xv_ z67vhM1WQ`#3nt87i(GQ4lz>(cz+#S~38a4@S34yb11!ld$|`sN;;IUwciGqj>L1@i@`~CALPWy)KYl%thgKF7CUoaEzA+!k}ogT#;f~Zt!KyUFD@27zKTy+-RlhPBK?1 z7PZ!FGft_zm?Ty|!X85rf+Q&6*ASr*=24u~>@MrU`s{-Aw%^o_Li`RRY(z|Cq`BJq@z z+;NQU1QVSho;`|IYpP*830;>MYKi{2e?s1{8 zEK5`jr0MluFzI>)!WczQ(o!fi4yC`xE>@(S{NG^R*aD8_O?jBle-DJbNVKKR@5K>5 zEstS( zw34Rse6->Xb4P2wU|4kEovUm9=}`jL{+5s`C;eI;E)ws3;fGRpI)lW!LiZ9R@Dh#C zgiO;TsCpa(+z}SZ2MNoB$u^LJ`*MR6#mm7&V2mZT&#QmJ&YVXHAz;l|h9F5%5@lHP zfp_X`T9iO!cFk%63$k>U+Iw>p<-W1Gi8fo5;OowsM=QD@P^!_9d?{p!U3$|+jnAM9 zhVwuRem0zz%L_W+Bn9?7=oWqqbCnqF26GiKYs>z;5z7&^mn_t9hg5*bTf#kN3kHL; zmV;H1GQWR5bOnQoZ^O^dbGov(3bK*R=DtqElz!WYDQKeMd!YBN42%{WA4PJAuvU9p zqlELRoB;S{D3D_)qaYxYC}1TY--T5$iXxB#n@M@!PIl3h!vcXasTCC~Fo0tJ1R2kK z;ms(c^{U5o)1&BWYyrAiTnohe)rJ0XEg%;^3d?_qp3jB983o>h0p?<~IJ;!^@fwpW zmZa!D*AiO)hFpwjB!=DjkdehW-Hck2Ytf=!Qvm+c9{YD{ctJ(3Sq;Abymc?60eA7u zH#w1Vyn@02H(J0ZV6FT#cP|+^rGyDa!J}+Ru5wS*<pZTzPgS#Q-nL-PoN#LXg%D_X0K$OHzOq z{BknAJt`6otO!5egJ2_;0jvlMS0yb7LjXH?;x5^mss#yS*iaZnIT@6iO47E(H`1hj zT%0y6w2Nf?gYQbAL2S>L^6ZI*e375XU;xFlOU6Py5SSgjNpi;%6w2GsIHWpQ(pQs7i1e31w(t*a_BJ{*f|pafpNz#39<)% z>;~z_Tfv~L_|7Lxq{Imqx$@K9H=8{gIo1OtAGZf_mBijH>sd4xBuEjKm<4|cb)@)a z39qH(6%qmpuT9EPwDi&fO!DR^nmv$Rln_k-Ns0PcAXWKlG6sq4mdu&M~^;4Qw^62Pp@k5+z9CYu823RcA-hJ-kE&Q{sPP*+u#4Dxsj1 zDlrQh$?BrMj5NI>{afc4l1v>ctBZeLGBCyulU=k>K|&8I ziK65#BBD%_s~0rQuSkn*?(hYkw2|a$=L)leseiW?6De17N(#mRvuuCWqrt8V7fx~6V1M6b2#g9n@YW!39&y!gn4T*JO!?G%Lw}ABqrjG* z?z|(dkgHZ}zTqRAVETMy`OZ_^YnbKwKQ|WwXmR~9zE!uZ zOs|YEvROIdz^Bp#dTrs+3`!}FXR~^?jmXPUS<`P70m>Jx`EOY;BTy)Se|3Wr_3WVR z=X8m87Kz5wBtd5gHipTHGm# zTUMN1nDu6Df#^FmgFLzE{XZJ{p`VK%m+@KeLc}9o2JCb!Y^9>N8>}W3dzU{oJ70d^ql6m; z3l6yuMANwt?9xRa8=QTf#%$pm#9kNp(H_aM7(C4L#y-!NZu z45_ZY>v*q8<@b!81Zbbu_~KGD$*!5wDz_Uk;)c5zyo}V$WStH6d;;kby!#@brcNL( zIwVCR6!*{jP=uX;&yvpV(CyF?S z=RPXxUX|$OJd@7SR3kH zKA`+C1Yi1gPV2^TI-J$47SYwqP>?CiW_J% z>GISeVpL^Mk^KG7(+He*k0OK-_zmfb@K$tKhhsH9DE25AsBp{iHuhmY8pFJ>XcOM! z%?$Vn8rp=>=;D}@A={GOBoAZzY zoO|AluK@=b=t|BD=KA*OyFEIO4)8aR;ezN59Or5B%$~>ghAp)c~>s`Te zV-=Wbgm}bq5a#_iL_;%0u>1R0i|NI3sB7oc$_f%qz(pOj-e3Y+p@03VYs)U&o3)*9 zG9;_R*g%5@Boq-yMKfse@lC{CV1-q0#jKyFo_^vn^yMbPx31G~jP>n?bbCBV3lZ_#i)Cj?=;*n5j)yN%xsmDOuor_vKS#}UfjwQxJ^-UzATMAC1inr6}u5v)DL)my!l$a}rXqx$00Hst@YbXhXcpd6n$vdem@ zqo+pBubU7^-UOg*5<{7tGEC*VZexnOBqLl&wpm`PX%jBhRtzz5?^#gEU62#sztGEf z#b;kL)M*unX1^LL_T@}Xa=6JACXtd$E&K!Mu>?2gA`xRvphWwNMw@WRiXF`J>-IFM z9aJ-0rt7b!t!@neYE9{}V0KF(s_<>#ckh|fCiF*tVW@Lu2&4`v=+<=E(rrH7#TXg- zw_R*f11HP(R;`fd%@m`j_@6JwPnQDJz*Ej@KkOm{K!o^WeG*i~SMC0)46HJL2jt+& z{#Ur22rdG{$13X1`~8^b>kK2X&iv&-_+4yoxjo!?&fTkNhi6pZNTORuWTd46cZ#Nw z;gjvMXlet!e__U*?j~cBPPgsccG#b%j|59v<5Z>bt>-c;O}*!cO-KLd{&hdZD)lq8 z6Ftv}98bajo$Eji&tzq+M=Vqs$h-aTaQp{8KZYa3vOrqQ%kwNH8n?qA-tXX^<~GOy z=1ut%5w3eXi}<>O!2MuVk}m%&@+?V*xHoz{&3S(6e1fk(J$53Na~>~lpD)jzK?A9^ z|H-=YthKzy^lUiRH-ezf7d$+kr<~B}eBN43kGxG%YMvg=#0+y_h?BhmTsxL#g&Hqu zIB>jj;!_nK61jEq#amXZrLz*5>C~$o7_Jlep$`Q+i&i!LS|NO*$=`+5h#*2?jO}T& zy{M?ZJLL~LMo{ga?(AG(SdY3*%lLysg?R{-5W6*@+G4#?>MYY+yVBpafp`u)yr2nb$oi@67z>UYGW~Y)yZu2 zK2@yh@k!h;DKKp1SUEp`e}4WDv;^CQ<2IhaKz^~9xc)H;fL8yl&HRt&WvMH!v5?1m zqox?(L4fQu2X^D${lwS!e5tUr6O|dKhfF#n{*0Gp9=Q0 zIuVyKv!fg5?$zQyf4$kIJBK*Jfm2y*F;B4-GlqagF-ob3cNmk)X9HYpsF}WH4?%DJ zW1l(WZYt~nCEk5`XEfFN%er8C=bk=35f}P8DDg!Ntf3LL6XsBt7X8RKgwsX#a-zf1G5!UEF2`(sRCS?nUQHF$WibL?_Pm-7gD8 z3S>;}C~TP6G-UrKGcV7h%DLzs--t{r%Xz4KUYNcc}!A zFDnuO@!SFa>KIH@nIi6b1D!W%geoBADASYUj|B$`n=}E-0;0Jv_f(K>GP%D$JsP*1 z(HxW&K7r9P4{%wYm$rDTmN(`z;JBgE zLt*u;RpeHZ+zX|HVinqKBv6TZTeDAEvA@Ybw5%}hqboLumytn(1)oyg}nx% zq7U>_hwB|N9WfhFanui}nL8h$p{EC~Q$X)p-zvGZ^}aafEN+Gz_F0+!lb9KBVF^1yXA^3~J8r{pGR} z96ws*;D1xOeLL%I&&R;#^Q@6e7jFzOS_t4umze4d90vvDy8K~$ARE-0v?d6#`ve3Q z`kfF)VxdtVo^PUJBbUBAA!A<{QqaQ<5A_y&=R$*R*1Ewikubem9gIZ(-g>J zip(zo{3qUfxwM_3e{%wtY@0G(gZ-QbY+;^RiA#De3;)LDv*}<{Tx4a(Q$u-S zjYU^kv&p>eOlS=kMvJ1S>hj6Ft-H%+ zj+G^$s|mhx10wcq=)U<)DXFUOIU1HoGn+GQZ%NXjM%BY__Q&_?*9-K-49(^Wf?T2; zK=@0453sJUlBY)UT}Wox!-G4{v7=)^H{;R|BF!H!mqp$EtZ%;n_Xlqo!hbvcTz>QF zu#1TY)d00-M%J2KX0(d$Wls09buLI98mpWQnHE@a1myfqHCl`3vu&22t;3a+1IXpv zY@RPFB#n*+@fA6PgTpdyPVM=mfSoaB_@PF+9wwlSRRL4~Ad8tVD0)*ExNLp$<8$l3 z3Q6Soe*%of_V!TC`6pfn=m3}S!qg<$X!21?h`sh5cOQqC?(it|I67 zJs<=#L(~WAm2orp(^>+|Q#p%YXXXaHxch5?G+e$Rh=Ra;$ZjawlIi#@<`ImSo{2M(lZ~36cUZyKDC@EkG0D9>J7m^_y1(o@Fa_It z)62zqO&5mRX;Cl7eRt?JbnU9li!S!3+0?754@_)-mEb&Djh&Fg>juBbYg}!cUs?j9 z=X$m<-^}J*5*r3CL9zmu8Z;$#yX!XYmA(>loa4Q=HWgvPFZ%d%{^`1AbwJs1Wpc9V6ns>abEb8Nh5p%}_X3$Z z%g#hE#_ZnG5iE8){r9IaSVOL|mYxo{oNx#inT+fDc%Px%__wgZOlJPc+>pnm`ydqT zpl2v4;ImL(wdkn$S(Ng7`OP$zu&>gn%^c&>%Ub?n=tncUGu1vruH~>_wOBG;?%g?d zpXpbYu`-l0Q|bz^a9g8bL&rvLRJXTNk-)3Utj$}REl`4&>u!yL_T>bkHuxzn0C6tAUCM; z9v_`Rl>g);bSPmDglaTw>!FtrEv;MSTjK}x%=woib{#D{0>^yIqJ1;U8DZq%|1LGk z9&{eYw3nh0ehNB|K0aHr0Pw?u;f1vgi9WZ0;5b8l>^LYzzdgisKJ`A)v`$opd_OdL zmH=&<+4dbAceb?*$tB*g4 z-z_$}yBiQXTg z$1DoV4$vXl2+1%L`D8MGn6i}5ndN5=PD3rp0TDf6O!@7@GJp5{fjM-zx=Qs+<1s1^ zj)iSWK`gV`>a9Njh716#K+M^uJ4gjhlXTXXaDQAn()ES{aih87s-@Ox;-1r+W>-tE zNyg8a5fQgS=}5mTfuMBTT>W)%GQ3-LQ^qByjq@opOB;j#NZ=wQKl}k^v`bJ?=wD(d z)_f&bwC`9?{mA68N7#9#)yXfs1mW|3`ucBsnyBTWW@QrSxF{XJ;Sx^cB{uuwEPiy1 zTB1T&ZCf>O*_h?~5LslPgNt|TU%_s*Y`r87;yZ&P+(S%OKxulWU*wU}VSb4E>Gy)K zocxQzj(?Yl94}GszZN>Zj-{W(zfJcUH;UJu9O2vXU+oOP$^{~PN9)0-^Xz)0=!sit z?Nk9haooUoW=x>JS}*Rrv*zgi~f2m`_;7SQ%X zjhI^z{+BT|wON_TF|;TDDw~b@XPdUZoD}&Vu+pH)G`2<`exV^TsBN^uE=vC2NIgPQXuC3ZvQolwNZKdZ_eqW7|R`U1FIEzX+RUL1CEFbIP-MGc=Ghjl7_QXfMmOW|)PdxAb z-2!hdgnNDJ_4)-9#T*Ngo)$RIN^cLAwu8FYn-UW4|NQf<4a4fttI7IMVzBx_N4(N; z4aBz-xu0QIWWZ$Gc+#C!YB2SFkLzLEmKc-@5pim2oa5S} zm&7&IhY9lyI*UZu?b~##fu9h61ZKtw%K=tQJ(0-~>Jmy}Mu!;vrSXdodWJ6IgM*;) zvvijlD|@C$Wfwi0+oVqAkd8DD^Wou2af+sRx87C#SmWKSfu0&;+0*l90;;pn2hD;W zm+@0`E;VmLx|$5eIwu0I_K3Iz;fHDzov0rEk7~v3jhzv3B!iJ+(b{WuWsIkZen6S* zIFo`>wkim0RdpPdDsz1?CPZ%vj@j|KLvfB7}# zDZc-yZQU!BAG}CWji7+#6>2BpC)6=w_}KVtDp+8mc6V$A?&zv*5le$Mf@Vadx0G8N zwtkj~4qAg4}JL`*%eB&{CzlOW3 zh_I`u_-ZpnlYeP4aU744fD!m<5w1ojKaTgh84(X+``W5%F{+*J#}Q-7XGA)?na?(~ zMG`ot+dM&Jp(!>>j4Aez$Ijnj-Z;NBCY|YPw-yrd{j4KgQB~{D&sCTvA0VYe!C!7& zrDkJOyRZzeb@b9p=#9hFW}MZLdqmb&IpNH6vWO|4Eya*IUV?YpG^7p^Am+Fu3$-FE z6oyLn^hBM%NEkZBxT&$UBHP%cSpFpbZ9!*u;AIKR|Wj0Xl@oPLkOr zdli1p#N!HBMz>p)4<)79K=uh9WI1J)z^|r=KC)ALBJS;{YsJrbKRbKd-&L`^HG2^+ zCb98R$J#q4cN`Y=SI2_bUbjFWje3nc3{gwo7FM8`Vdr5LOG}uT(Cj3FHSO7lsr|x9 z*qG;gWN=EV5sMH#C??5D@{D)G6z%cFbR5RQ}nBX4{ylwiI`eV8G??R#|saVK9 zGo{aLAYNJk?jviO;wO?rs(oh7nkCbZ{Y1l*`c@HL#XyNbwb+B{M{SdMm`WYTTUX!l z|4#M{>0zvIUCX;`n%W;VvG!~T8>={LUW`~1?>%_NG#>~89qi8Z+xN&*+C5J+>GwRR z*)9~rNpQbLM$}3IBbriQFb>l3KUF4dv1z(HUGmj)c@Whl43|{zd7-zM6=Ip6cG6ADU@mIrH`<`P76i=A2eyvrRQ5{SzO9g)eG= z_qe%L~JP!Fw}8K(1kN(>`fb{!&oJ@ zpXjS3l7FiT%Nee~)ata+m;SMSuWckw5>c2Sda_ZJR|#{JpRkg|kF7sRva2GiFZD6+ zwe?XClAb2&_@X=9lm3C%!AL0W;UIE?2!f-F5Z>2U$CKk#GGZ^g|L4YcK0l}3T%IfGb6MnA3vKOZ8NZq1%FW55X5YJ` z*%huYEe!%V8U9rYA(owc>6>Lnt_kM{^J^S-5ABt>*^lX%AyxjPSzY-?K9NB6;cW}E zC(O1Ir{jUI5m|YT?-s@A5vE)7Tzq4K&5e7(=)yu3@g*C)z$t=F(a3qd3PbPGdMNxppg^1%o=#dI$yF0 z-rFU4hw=xlC-JLN;;`egQ7o{j0ep3c`i>-ar@ei9%4A+NljB4v%CKrKdQ6xDW3re9 zYComZq&W>us2%zL6IY`AH5%d~n;%$RW~0GMrc6;5!Pr|Als5UA--T=bBZxDVattd6 zfR=GDE?4f^?Lu*=PK#-&bw8by2BZEHb`zGz26uikpjvR<}ECnD>O|F z&F`=H9eN2qxYjtU$xSv|&g8(jPoJOGpEuW^&u^cvZl52GMAvHDmmkEm_P2agJ-uR+ zug1agHzUzOz7}p3yf;7KS2C!;T(*JSg;?3On4GH^TT@PfR}NvD@>J$H#@I_P!V+aY zfp@+x@K`Q=U#IJe9vHnS-|&n-^7x$e`@fjnWw{YETOaCDrSn{gLXGU}z&5GpAWgn` z6ET}2p@p`_PNxTg8}Zo!icING z;tUKQ?ADi!-uQv5UDAA&7%J`7;6?|ov8t?msHO!`r^FYZ>;VU@T-W17XG_6uZ{Ak_ z;IWqHqUY@@(WkpJ;4Y{0x%2tF6=*e`BsXx3rta*7aU&_BErJ{~;MDb9=J3eMmj`w@ zTWd}|^ig@~UEQPHJg5JZWX7uU66}e|eq-^ez?N9d+H~TS$=>HVfu8~jDX=HDRUL78 zUiNsqO7N)-z{3-Kwc4u?6hi`}YyG7WO*Yz-pt}q1nXS9Q;oX{DLHgvB-8lDtfcR(7 z{<3FwCj;m=-i>%@PNK~P?cEQ0j!)%zHRU&Y-%!a^AN}$W6)4dgbYA@fl^m}Ej2bsI zI*_9`x_kJ}@wDn#MT^;^vQ}O*wvh=>{3<-d49z9I0ZVXSNd9l(Mfgs&eNOE|UvzVLJ`{$m+4;uo_a9%0>>zpPc<`Us|@cKuqS% z1nt1^$y}{A>m~I=uMjgT8wqNomk3j5QE z)z1V#!o_fZ4Lcz=!^BW;Q#OnFyhX{6PJwn^_^^}x*?w;=Xk(tCK09hYsUi7b{ssaH zFtF_g7q*-HpEt^#u2JiHy4y;;+HM3q48Gf^>1oIxO%d6I@oeLGmUJceG{kS>OFkHV~*{ z+*G;6_@!Zbg0QW?fHFs%TgBhw89uwT9_;AT>5$w=C+3)YYu;8_-Y6;N*w{Gi!v|`! z%E*bb4fU(Nlagp8#cm#*<5RGO=)8}}V4V4jcfZTeKj_|;K$Q^;M4CXpKeJcM8A3UR z!m4I5@ZT4-@B*fRZSN%Su2evT>_rmfn?YMmP7SK_L;ej^GS>_ACux4AIrz(Q9`qZd zH*V+Qp6r|$cK9~?|B7RU?eP0B74-ISIK;9mMEK>VTP5zTq#Zs=eEv-KCNA{ot$l%x z$@0==zCGYvMS0%~943Q7M!KaL26kEtCrymhjic2_PQ^bx$qsVoxalv0ULS1Eu6<>k z!KXJOoW7+*&_ZQD6PlJPT%IdDNhA=NHA2Gc5K)SQh0fq=37kg;(4za_x z*0#z96Y1%->PpgP6W4DttxR0;8IQJF^Cu0AqyqLe0cwQ{Tag2n^OG~5cj|O+2aKwP zcj~llgP8hgzgQd!XD^0}^f9Ewsg)All_#f7g$5ICN0~vyyS@@dC%QRBJD~b%m3;^| zy?rgZT^*O#2eg3_!gM>Elc?^>iMU;Mk8CCQDwbqf^%knM&BA=5nszj<`)WEA;w!nayzm-`{=W zoi}nwLq%4$U%EASA&@?}D0}~+0y=Hcr zu^*Qt0xUOQXW30>+;On)FQLXUe8MCq-dhljSo8?juTtC_C3eJh9ZPIm4asR|G^o|; zsmi(B4MZwHKW%rOt4g=Oo)Vd2I{i;$bF)rF860~2_wk7axv@&W?)%raBpDY1 zK#OqOcY*LyyCEy``JXq$GUW~_3%-x+8M4eX4@9cD?kzp*+y4GSUeIuUsI_vGkm10! zT=t4Gtw4pkoi-=|#x3ShM6z%ev)QAcbGWdq&1oI;l0C*XxrGrNB}88Hh<31yJ7eTP zxzi9Nc+MZQEdp3BbeVZKl$qez1P=QJ5&k34v|)nj#cUE!KS!hN-VnBLmOeHHFlEYp z;2@1YGnu6MXJ3WSpYW=Xkxw)8|20)JRavt2z9NWn62_*S^Q>17R_Z8%B!r>C$&o0G znZTclv#@H!DhKa$6_lH)9BHN4cbR#w8lt>*d)y6P6MI>Bh{}m0Xqo!bJC2 zD2buy&Vdr_Il@cl+R<|K?sdF}ELncgeYoctpX`XQaAEIDTzC58DY&%A`O}as|9&Um zZSsoW36D)6;V#LH#6~GsgGz(v=y7pXwN|b7zew|8(3fHHwR$b+i7rMV4IAfZPtFq^1FOYSyuvhJfNq=uKe1kUvXiXN}u5f%9tE z;@uc>4TOx@RCj3%#`n`d%%NiZ>+bZsPesYKyQOKF?V|9aq^Uu-Yq3b>5|Q^7<@CHC zw9T|^zP8_V6D$1i8X~%l5O;_{FmkDn>;6;zMhUfxYpj5%yPSAPY=g$u09X6*8_Ko( zta52kt3Pw$P7uw|p&Ge3Cb5)xeJr&!5q z0_|+7^Ru`Zf-~-&B)d{@a^IAUWz?<1MlmwMT(cBc+nc>FisqgjTutZw- zT!c&d$ZX;A($*q5EIO1xr>-It+(~e97V0c)>$)b86}jS(w$=KA8dhW}r@e3qt3k_6 zcBw<(ajY&#sLX`2b*6WX_GouzcE4FVu<^K`LJ4WN^x!@>S>|x0ErgCDK*T!YVBV6n z^(kx_VV0{t{SEp?Q5GMFt5-uAG|jv;6Z%46QJ+ZEF93$ne1PJfo20h=w9SPvF9Aqc zbA)F>thI-hua@%9jt7l##*a`~;4;rmxaIRUW#ZqPg&hvak%qOf@~LYyQ^}}qR<4Kd z;i(mu5GVVW#E{GA-$8I&!hxk0jUWJ$95Sxayn3;k-!72i^7F}XNZ%={=^zHw(b^r! zz_zuLJ3jMW5BMrtgx~D2tFN);8E?O_2jj``{5D0Y~0iy)c0k+(_2_1fcC zliuwy$xOBj?YJ~F#C3BtYx`<7UnAvsxaE{Z5H6vXRKYpNSuSQ{!VO338lyDN zcNw^@2T%-RLRo7jBBgfTMYfyM>o{t_WEA@#i(}PDl=k9Y`tFHBm^9u0=w=NNK90|W z?@EUpqM0{zZbx@v6n82R-6{f{ZSt6X3%>?6!~mSrb|(8SdO|<#JEvES)Q6&V9~893 zAK>0w!H8vbKk2+BLl@#!=P2Kf456@+$M8%8VAQOg^yHF?l2M6r9M*GTSXwJSWe5t{ zj(MHALpafMuSqWnI7jmiEu}m2zE{HLRX&?aF z$^39IVlu>LMv@k1>lpnd`I22dJA4MXrJw;{_a0$y8y#=;af>FU zCz(!#F~|@MT4K}g-&Cf)XtH^aIS;===^$efqx@_XsegB@K8h~5_PO=SfEj4y379hS z_(kLXfw=wjaqz5ylNy@XqoQP>Jsi0-wkgmtmRS~%n`w;8x83K#@3O)}2CT8={gf{l z*f=A7mvWlDYJKKex|HLXoee#)+3HwG%7GZhfH1BGMCU3jcIH-5FZejrz^S+IQl2!j zq2X0&C*hQxPU&D!N3kW3x2a_@+!6@0H3{a@HyyG?!CPIPi0x?7pA4~ zp}>0S-avS?%7~0G&{>?~p~)nMA7j7yf_yE8CAzFXygpqtd>$F4*N{mZ))XR`b#Cih z9dtkYTz@%TejnBRP0ph8b@Qb~fv$W1wAzUwh;lcA(x|gvw6 ztY$`+b?L2ux>6g{gDo~HL}X5%Wy%xANH}nc){)F}u&w)-z~+r2xf1$;|9#P#gOhuT z&V+2hV~rM|<=s)Pwfv%0(?xD-$FWv{cU^nJm`s~XM_meK`7_ZxrC7n@#J2x-7tApGemg%a#{bqcRV@jq_c7^6)mG&JtrjI^t;)5-oP0_S zKER#nQnV9n_o7NV#M@48w?#S&H(wtMt2bvlD$Ii-%!YK+RGK{Z?QVSul5OFAL=)7| znWhwGSCb;6mncM~Dh#c@###sLl$wK};S*Ha!`G{HsTUTt`+`IH^>TP|{ldN7;9!v5 z`xa3iu2z`U_yir%b_8|yGmz|Ig_l>p5c6Y@cc2-LsVy|SrO-0 z^67qZ?2f?Jo(Z|(*lr8)<8!wzBR;rH~0{z2M#rX?6i>37p}AF-E$ zXrEh1#2!G>5sMbsF=>r~TO7;mo9Xl7& z#Jbmy`F@{RM1i6Bc8sesap}9Lf7nGa)b8*2>9F%e4>NX%Sj0>!-3<8`8F(KmbC@Hh zk4@abbB)Vc8jZF67lOcm_b!@fVBmr{LS*bIZqgbiTdHCQ$r+%>`LIf5r_M;ZcuNiS zCD566Qi}d}v1Pl3c?ph_5yUUx&8GmFmvQBC$q2Ru*IR;DvhPM}A$9jl>M}M=q;#{T z`ohPRzL0&to$zoS!8Fmcx(SftYvik!dML zY3CbxJe$eaYjI@Y&&tag?8jhwId8aUL>;|=;$O>k{t(~5CDkVRc#Z-|hjh#iQK&i( zGD6JR@q1d*2Thl0d{nWG^Dais2AaF{Y!yg8-3rueId$Rn;>8`CD2Dix-Y!PF!{{ib zPbZ1%iOQfSQP)Yxzl_dPfRTCRIPKNa%?r3><$_PRix-_YQRF1?vY#o2p6{EV0le)r z)+8)-s0tEeczH>l%z=v`KG#1zF@n_}%!D^jm|!y%JJas{y#@QD)Dl$vY>#@_aM+bA zK^}=Fwn*FRJ*70UyYqUl-f{S){l@SkI?<rj>5&9Rj;5XodYMUM-Po1oj?2(xI`Z%AOm>gSek zdOu*G?#jNK)|InIVhW^F^<}mYHCLvAppySSy}jYLT<9g4LP)-7w(Q>U8w~$yf1qM} zn_!Cbo4&Kdo(qmX05t7gBi>`9pPI0kl<3A$qtFEWQwsRP!wzyQSQK5IYK{;S{CA%i zDIm}Otz~z`EC*a_Pl^!Pj;77C_O^a`w&3qHIjlh%WYXDNP?gDB}O= z!^@zy2}Wm7JK2V`cPE^ykLfSi?71S+L-`%Y#gjc$6- zU`jvd+i`?twU{_uibGDP|<4>CSB~Udd2c4Wv-<&i%eS;~VJ>2_BN# zN9Wu7T5S?*qr?w%fy|<3cq0&ERoxxa^=Kpt539s@VAg|sL*zt|VYE9FtWCJ5S!_G3 zzq=Id^@~D6Vv?dut!~3NKmMfIm8wrHamu33r!7)%KkPi-wk=~^%(ZkC`VaNkG)qOY zk>|YUbXqPTw=Raz9@k&+op@^FULBSVmi(!qc@^5>NVSLjG}Uan@cXd>CRWH7Up=m% zC4;3wAlOUamWy9^jan2-5m|U<)biJHN#J_(>N2{YPYu=hNDYRI1Lk)dlSZo&{Y|83 zI7m65eLXay-C}xU;z%AI3=Ft_BAkRHRuzBEuLN1~#m^Qf^`EQp6{EUOw7ft@*oYm> zZc^>LJh*lyoe9>7l2dfGPL5m0(;AC_+!y|zX`UbLDA>UEzo$AknR zdW20##sdBI{HgxO(uN70Z5;;hayql&H_4qt$4l`C9Tsu>5K_payPhpxZ!F7NY4w5o z;P(CFEilPgmB{LlQpEo&^|*M=@tb4s&`L`4A9=)-#5cpSI{clNX1K_}kHw#q#om>j zu*Xe}P4FCkau|P@K$j$sLO6KJ$!M$s4qKy9k+fu`-R-Gl1kMp?&2F;L!|JX@7n7gJNP&A4Lm{-o|Id_e#h#P zqjWgfZ}971GzReF(T^qIUv}h^vQ_BgY~N&O9?H)#T#j@87NXw^VSy)yi#owUk5zya z-pD^)FwKz*bRv(zx-do;aPjBQcJ+bzpi znRah%j!cd1lKTZ3z83z_rl{KM@h*6!oe_d^467-i|4@{tCd+gQ>#FywzV{=`Cc@D} zR8r_SE_c^MgQT-*Prro%o?biMk6E;pihmLYalW%&?TtRnF6|}*c-%az;Tu+7G`h1Q z><1TdCz5ai)~&T(Yhl}z`9YkD){O0g##~+X$Wm^3DJltASA2!>)$NP3Hf+5KK1A8X@ z%qx9AT&`DZkn$8@xl#TbpRRrwlHI%AfUcG@n2xuL$BhJCt_8K*!?=>zSneiIXXV<3 zwf)5dTbD7)%QQozXtwZ)54uswXQhu>S{J$B33ZdtxSym1fA_DEz4rd4Q(B8V=@yep z3ksOt$CF7F;C_t6T~a}KUvh4%$x2YmV7k1BeOK!}5cl^39`XMeq#e+l-KkxpcflH4 zJP0zaDqmE(Jq@v&q?Ei1ZFm%IH_h0MYWBYbEG2V8h2-VAq)0=wmB--Y$Pt2!lx za3iZor@l)K#i0^B1x>GzWn6FEcy4E937Tu{vt=gsOzPI&T!~Tsa>+goPMFTqB$e0pPzz^{AquV@Zc zles~wj4TDQpPavRPaB(*PqL%>TKkk^0(AX>CcE zFwj$Uyl>3AhVnZ`{s6+M1+?OcWtkN*Z-*M5RyX!ZB_7|>v=}>7m#dC(dGBuFC>n5Z zgWVkvY3&rCD3D_M!(I3Zu?6L7y}w(baP}UP|EfbsZA5e-sQGA?f2aNC z;jsJuJzTE&ess|fant?cpi!Xg&3%Hf^-jT)_2=L%NvQKf8*q`{`6!Wa6e!iQ4)|}^ zKO=d>=6EkEP`#c)i{_ zwo~q~7^Bi_0Xu)?s%zc_J@<VnFM^sca*Xf6a*%p;?SO>WP;*FJ|9ihNwZncdBQ zTLw?tDOYK7f1Hy2v#MkmKNy|;0$iw$#Rv!&$IAZgdGWQsZTD;aRGw(2zYSN%O2_)`b#Ol;;NNPf%o8YX3!8W zej>^&t%tr;v2xj3*bPxocq*~z3Ca(A@unEz?J0L-ntfMK)6jiHKiB@ZGiHv;swm3j_F~q~>$A6=m)0kR z&k*423kvG>UC*OiIw~$t!1s)L3=Hg_1e+WYUrJ5r9~|7P=0!TS5?ojU*#uQ0(_aBv zKiIsB8o=TuJzpS1pu!RN{?Y#O1bAW_tm7HimaL!*_LIpzYj}PzIrHUr$3Z+e=S)A{ z{@$Wic3Ei1XBb~Y)j(`>8D2Gt-Kh@JJx>*lb-rRXobfV0&0_^_UVS@dQX#EG#w_J5 zjpS0h-;T$Cxz1o#{+DCO&6s4#;`?}qzawCbSX}@>;UfGMX_8D=e|=Be3gQ(1%xiVifV-&*1maJ?D?ac@PRC@3CzavFIOkz}?y~waEF8#Y*H!@g{LPybh7;h$SM0hEc`wgiMle-M*z&4i zTkJdVu55Xf6edF4DwPp@6v#50ouW;qO!}RCKFJTFHp3c`oJtR~ zs6^;oVF86ymyCQw9PBRw_+kt^QcKx;sy#|kB;DdyA5M_0_=w*{FLA#5wTc4|L49Qy z>uvq7ZB#_%nCLnQk{~q*62F{p1@tgg;GUK1M@roeMxdT!dk1Cb|x{& z6Ct;%?f(9q`uM~|SW#=E%irwHs}GVWIasM*@YZsFNOArpYQ^Lma=?rqq=k#@2N8s! z*$v@9;TTsf3{6r;e?i$$LJK(8R>RLXyb*GWHGgy@ThN2$DqgLlZ2E=Mk_w;CC;f8z zZxZOP>a?4`Jl*^1%9(EU(~?Kdn4i^py0J)FY!1UG$YD0S-M}pw6`W8>`yf0y(UVlj-M z&do1;N#|T21T`1fsHD`=U2}Rzw)#=zAqBvl5Gcvfkv45*6TD>MAzjOwa9&{EF4L;_ z$EOpudV7QYi;`(gQ(i*@JH7tK+qenInK+!@^vvUsL1G2{bkAGwGW=fa(Asu@S@~@| zWdj$?Ci#_t(N!17W7Ck0`!y6crV%dS@Jc6R>Tg{E)$eiKe`d1R7iZdxi7vEpJ*Zm`B+dg+4p~l4w<7S0lkCeHn@oa)G^X3T_+y zihY-yRv0F%y0ZKl0kymo$qS--*9c@`oG2=0HMBDRXoV>)3;CqohZqtP{%ZYwSemrH zSz=?IlNZ}7I^iZC>zUW&#z-BgHYzlV+1n>8=)WSaQp&bJZde1Sq3rcUzhId#>lPXY3u66HzR zl^>Uj`dhaZm;ZZB=40lg656(U)Gg=R(0f2|dLvT#SDtV7m!_DN=GsE!R3T-_F;8yx z6#ne!%EaVXO1qh0?d9I|?rTnH8$5EVk0M8dVTX3?HDuvVe3TDsQF!2W{>NBZ$Ce14 zs}XZyu_5GU!xYnnN=O-*=QTj=!m-L#LK~b_+rlNbr>po2LOLTEZ7$cU57$*W`9ma; zOr3rGfYV&5!2KU?Eg6fAm}`GzSs`&I1_@8W^=ya#Y~yvOax4Wd-i z{JOkJ)T`68nSL+l?-y1ei!Kg6sSV2bdt#B#aiD%v>bw&4`>g;EBGI&R$Iou==oiX; zM9aTvox)J8b=TqR2V~IEF56gDL*UQ;ljywiGgiTTVJQE>me%I?wU?`HEv}dFu$r%c zA)NX@0E<9$zscAl+Vp~)aMcS5e{R_URz*A8R4Z!nLlX%z?;CA85*ua4j;vsU3xn{zwi%C_~YyvFr-2zkBz216!2h~avQn7eJzaR}U!*ABY` zHN(xr;mg}E$k3)gJ$3y=TPJ#&>yef8#}}zEx{^#m_L*!5rNpS%e*>l39y@y%qNf!< zt2vwlt^A^%K`7hUl*bM;w|`j{$H>Og%iF`dxQ^#ev;E24e9r-?H4?_WEGSVFKD_BF zLDGwp!w;<6LV_#7))dI-VyHvodZjY!Wo}3Dn6HTH=+_U_Gg~`N3EAdKHMY7PU}aDA z^lD<9)l-!Ezp z{4GsS>;~?R!gbs8cbBab?ITTq?--s$EHfEfpwuvqh9@8&_%8E-H$$Gp!)s1o;Z}73 zDYw$O5||8{I|*=zZ>Ra@JVpYRD~qY=7y$9ioeBf7+oWkhy_(@l%5#=nueo z-#ZS1X>ROuds+`}?Q|Buhjj0tp|2~g!dcAcI7nuiG~bA}@EqL_?s=Gd>+WO=iUH8ge`J}8CM-(b(S$C|RUPG=d3U6N zfF)Znp?p1=>E-PXvcnHl{7bD8yf{a5I@ikkS*h}{;QzsP~?m8%D zf~T!9xPyo4z$znBy-Vi9NO{ zEd){(e-~r$dD72-L$lqZZuH{GF7b8cO{5wV>|lVB8w8KO+m|>ZG4tt11Z-``cbaNC zt$sPIGI!o)2>7Xdg2#unxK{7;gIGL5@bvvd-zFii}A2;WnlS; ze-Le~1RvYOt0Nod&35(&^xR;l>GBytzy^*{T$sIhQexwV?zEF|@?7pz3=we9j=Vs z7D0Oe#g`M!Yw6OrpTJ=bwaecNR-*V^e`IQ4wTKuZlZM!rWRn#(n!7jCzRZnj9v<4N zA6NdaeRDN~vrlzMvSe?FO{+1cLg`B{WY{OEC`CYYl?4(Q@a0tf1|Fh`3Q*byPJ&-= z!B)UjDHYse^&#iU2TG)IL7Ty&WVp^_HowSZk|xA;J?!RMKDnYMHSn<8a=qgEe?Edm zV!|8NX@qZHmv4b0XFIc>^;9k;@sW0$v@BSjlT{S39*P14{cfj3^+1{JoR8cu!q)4- zEDvR-*a|H|xgU%(_z3+jTwMIDdK&3J&u0}ck+?HjBI z3XE#p<-ufSfjvlL;GegSl=|>WLa<`a?eI;x>ob* zB(1tLQbzRWcV&`9zp1^`&E{sz>4ozPHuAhYk;d5VQSx#)!EZl)f0*a)>j3Dh9Os@6 z5U+LEApy|ouP&OJ0AXV2<=!gHFfq@Dcs!Lnl$#Nr+JQ5M(HTOB684TXSU3^3^Nhp` z68`R)<gN^(o@-oD34@olCAsoXD{Y;9O7;t$(q!5#mo)wq za$XPVG9K;_e#(TLg@nB$@r@ z9m|jebpxi{f_fgi1#`pardZLFn-DU~>7zU?fQy_YrH9Hhc>Z+`f34rkiv=4X)ro#N zVDWcTOVIR9e@(*8{`h2DZg0#W^uA+`kj9{i*%zoemeF%VynpQx)mw8k$`kREthgg@ za7#7eSH+P)QQd=A9{&#WPs3E_&eGsdxZ-37Un1#09lj$DO~O2gqJ3(bZ&=n7Ksig3 zpI$vS00JWOZ?7m@w)EeBC;nJnL<6e0z|5PDH+#Wwe@ESB+MSMWlIp0fV#WajuS+jN zz>@c{$FAuRC9g|&{JMvixK$kaZb!&zB<^~^a%co(YS5-f&eyTyklEax>_klQy1qlu zG23Xb?+|n(HtTTD>4cycaR|EmctX%o^x7q$;8H*kJ&vBTd1v8?OxMrq9Y3Mw*vafB z1U;eVaE;g|JsncsmG@RJ2ZW5>%dndPc#atS^vVW7cl}(Fe!Q5Nu{K=I#Xn z91wIi_w93%IKvK4eLk|*BVgSfRU+FU{e!?OP#nho!r}c*$MoBGxMo+hv~M2QVe&7$ z-BpadN{Ag&2SOT}ID4o9ov`bUUA9dEe;?Zr2hi-fVn=*s;?*>h=e%?khQX4qmi6Qhczpx35pM zI=kH5e(;_+k|rvg*q#owI?|HUiI-2Xx`u3chuaB1=V@y5T>FVXr#;t?-4lJTe>S|^ zS>jIgxs)rZvxFT^>gpfLoCf#bPgJ@l@p5Xt6P2znH7~#afl6m^%(1w?qtc5Q<-0H0 zC5~I=w!K++`4}H)^`g3Sz{72$ts7UwCr;!!D%^*+sE_^2(n0$52}@`BP)6~eePQWz z%9ic4Zzn8W9n*m!K4Izcx(@e#f6?bMkLKIufj-x_3c0iseJ*`mmv%VO=ahx3bIP6I zbK0RQ6o9g;CGS%9t>|-xeb7%Z$8(b0K9&b4U7NzLEz#$RN>>|u^HS1@N~dIG>(`OC zm&iLLy+94$p3@<Hzl_fUaR{p1eE( z=swI%YyAYE>$BX>y>|l83nM$mZvg0IFYchXIRWTQ|L)x8D(#Wae~qu}iLw)ZuC*BI zEU6^N0Bxn(Tz1fBeN^|NbX0{`})FUh}snrA%r&1J;#pfA1y6V_T{p*2fw4dpvgfFVy1rac8|GV;iCZgTs;MX`+jGtS!-rJ;e8H}H9KJ_@zCg){q_Y< z>p2{!{T;mH#_u>EPx0|pj%Pl;;qiXw_x{oB_#N=@-6pV)Ttot1jdC$yb8W(P@GA0T$xxGQyx52IXoe(e+4-lPRc&G6&Kz}POjU_YLM z#u}Q4zaiUktE(t?&-YV9uD{=>3qGFbIDp^h)h|Z;xbuN1|9FlAe||jmfmJ`=@YDK^ z$7z2C@4WFlf6nJ)93SO)=Hm+H@f&Tdyuld^_{GdMe z{AJN)|2hJ_LV8UnDHytuxa9E@+3xy6m&YILgMYsZe;fIL^XX@okQt#1TJos>!Y?gz zPr)zO{rB%ez*LHeXvfd)f(yH0YCVP1{}aZJOe(FPjf3#>k{^P{|N1QX8{lzb+-{rx zYTwk#FWL!KsNfxHb3hUe65-~ z)h~GbqJZA=Ie}-5MF4(DM=<(j4^X+;ZJa{#qR?}Oh~gLIal6d-{x&Iie0$y7{-z{$ zT(b3DkJ;fd4|71xF(W)QQrJ5|p)?b|-mdaef|$;WN3F!c57 zi65^brtkBCk5kz#GE;?r?G7s!Kjg^%aplSB$NnM}hZ6GxH@AZj_zmB-j}=IqS8SYY zlLd%#rW*J~L;H|@l$6s{c9-@k+3h2jf097-P$wtLMXGcsh`hmX?{8btn0eI3>9MU^ zS#3n?7pViNfZPmPemE?CxS_DAPGeR&{lciOJBq}+m|hq zD^%@KzPs5|v77H+AMNu%qU-t{s0`qfQ0ErSS7;kYV$>^olubXoYMBp4ecaGNe`=zU z`dp8ly73Hq*>`G|2O3>=DT{<1*}hd}XZh4eY}`f2m8k@(dZ!(DIo8ofa9m@+$6G>>L{R14bWp`r7HX&CCZ}F7&T|?a@OHU0S4d`MELi z;}b(}uTQ@L_I0h8H4b)LcU<2}e-!d5bIpm|CU&TgciJ0WaXb#UY>DlywD0KLgV(HN zO&$A|l1P<)74olPCr4c3`lNDyu489kwX>wD80GO|U6Qi*e{)kRwqeH= zfaeW6W0{zCnkCni-9CA=eZI2f;+S1=*1kI9%mh#&54L=uhwR(pvWVw;>}>%65sT`$ zg6ki<-INpu*VC$-0_3oeYkT$MI5FoTG|nf#(S#mhCm+(cc6(v}5_4`2f!#-T`gk7w zafhz!^4%Wf`lLgKF{s{Wf01_yggWyZXk$wVxor>PVBp9DYMT&sxNy23g&>Gqb}i9U zN4=J0`%SnO_JpoW#rSF?b&nKM zKp8g&RjV0xx_e1bn?qpdP)rekTexp}SzB8%0SP<70ao|wdZI&LtU7iGita~eoKD-7 zUR}UFUp;YEz0B*HiEf`278$*6-C~FQRZU>XaZ~2Oi*>OPx1&oq+`DbS1|I=(n*pTt zFBF&Rcfe@mck!COu_u`nq~Bl}m^6E_!W?r>s9;=>=^aEgDnEv)+B*d5)j zVW8(~g&kqa<#WV-D0o@CijK#rGu4jx=t*N&>%swN5vZ`bv; zMUT7F<5X?poOGpLDJb4pqvt~enI!XJQ!)K zJUxDidq~;ph8X5>?>DYm)7zT&-h!ln{Miy}e+X^ta*sy~+)f(-gD)0EO)>(o zq+&Y8ZeJ}_VSuq!^_g(!+LpWTM6zEfNiOYGZKrtKi+op!yY&Frb%6!;a!je;?UNZ1k{)cDOvP;qm~OccZ2&hsxr&71HEvc{c&NhToQPNld(Lu6K7g(V~SQ z5~JPa28H3*+p4)!BfLYwa=TkuOPn}#g{m5?E%GY;F&8Iml83wR2m5YrDs@u#Wn1tw zfn}#h`S!@}M#3=dbS}D`=J}HCt+w$KDXC##e*pUryKM)3cwoBVKFaGSyE{?q^xl(`hBFo6!n__% zjNyRX*14w-TLH3?0CjuAOer-;39@tC+_9^;t2it~pJ@+3yStDr zICNg%I(D42mI!t8#*0=cJ8O?dc983E19=J!LX`)h4(6+PVsMYh&>aBvOTE_t=Q@PB z@hs8KbR@9)lX~V0cT1K5DcK+)f2-MSD|9Ay9hnFf9kvj8DdcTqR>zQM35=*e3fyF} z+yf)kwex4;qg#4e0GoG0)a|@hF>FiPr#^`G!6D}#ac8fW!0Y5JBkMbQaKK@=-;FG> zxh(lOkbQN5EO=XcraOhR@v~+GNp@IWkI=S**X2Ok+{nrtPi|lmDPD)d)}Znr8r2Ab9r87^tDogJG8cO6p?K0sXK>6=!{8gyWaW^YrpU@ zM+%Mu0IYL)+;Gu3<>HP=fBI=t?$F5vrf!jF^+|YXz<)jU^e`(CmLT|kEkRt+(_6DY z@Q88KKIC}-`? zBoY-GxP;t6#lOGudONB-x1_Q{95ad5VL6nwmKB(9gyRFz;uKNB@u_#w~kqncKs@i;jEx8&_>H&X3-< zM0&`(udw&I-LX_vf4zm(;wbjnMe3rinP8U7bC^s)PLEW{zSh{=FRwH6zOULg_H9o6 zgLUtKz?$a=dyo%-T}Qog_$gs=>z!D405?hy(BcV0QQAQd`Q=k=$-lbTwk<5>G5E{T z;#Vc8xVz6N3o2TFAnJFoG4hmRW8`K|e}YN&z9PU`A*JKF3CUbnEXdjK<~02O9CpGNoX0@?bW zx9^w4rqt}Kf67DH?K>!mgg7qw)x3|bR3(wXxXu~wBL^WncU(_%^CP$IV0V@kK>b8h z*}Z*^5Q=5;VdCs<&mrAPdi&l^MuQTud#x65?G)$Uq_mngiwywy5!-gGyTVi3oHQ!#lxRa5gB(AYr{&gmT`5`lte8mGY>Ne=fRreKTF~v?i9G!BPDM0oqj_ zwQZNrR>knjlnRLp`t>~d0ORsbRQrU_%##d|mpuB}%g({>NeSCXgRJaD!BbhYpMBuy zHo{=a^2}sK!H{>Q1iy)a`oaDZ7ORNghB|fY97CPCe^W3*b|WlHq7k z(+9t9b8Wd-vuKu1pnBrkFLm+(vELPP*+^iP zY`YkLt?$?S_Eb3w^Dsgz~Ejg9~LeFZ5l?pUF<&z#wOa zQ-Q?TOciZ=@bIB7`F&xw1t{nZ$xe%BdxFWy5KqtSLJ*vwaocNZiz#`RU_3wQXBjnn zu$IiL+JU3qF-Mdg541O#Z##=0_D{B?f9d^9M7@wy#-0#`EMfs6v2aVaAo6vuGHUH4Pm z8F{`B<-qswDFvEfKGb8)4i=w+P%kEk+74Zb`mrg_)IY%O?|nBv8m9S~5B<_be-+O^ zIYgv0ohb9@c5~ki!uFo-4Cv0=XBtJPa8qHY#}RQib&7Z9*OOER&G4F$HubUHg-E;v zqIayA_F{k+-uYu&RvtaC?)K;I_X3gsjQ#H+l>byWP@dhM zziF)eK||}eUGYB!q0Dd4z_1;mfBdLn%RYgseSJWY1;8_xT>IPsMOO70@;|pfP-In^ zdv!X=1B$Hst3&SV19L1p1XYeve&n#Rqu}i7sIMG0utK}cYySrpIqvTq(1+|bb_ih| zp88^rb^ju8)vu@QHTUl}>JD2KH;mww*c;-JA9~n6YQbjzf|28;LVEcHedz)UzIKb2zGbEh-_79j^A9g`|@$~_w_SMt98{+^|f9pPwjXPNT0aFW> zyH-e%KN8|qvG$I6@Pe%U%Z|%opTh-<*NAx*kn$IM?dHU+zS!${%C8ULwKfXd^89nZ zz-#Zss!rc?Ag{4gV0GQ)S5{p2A#r_weIT+m1cZQopOh8na`V6L`Y9_OldL|7YzJz) zS=j6kpf)K9bD$lCe|x|p2>Z;%9S(thaN5icB522BKR9horgbG^npkEi@xZU%kr_B- z#Wjv~Ua2-7ux@3E3oO=OAFyua+iZ!LQ|QXRhiz`b?7D`5P3YL@$ontM5FJT=R?&F=Y-DOs*(tktO{56rkv>}!Vb z`GXmkoqB=4(}Nk;Lz-LLzhT3DKc~u#{go`&_0Zm?WI36Dmdieh-v?;iC&==0@Btdv z^KbZvzdlgof3jbstiL{B<39Fap1(d|<62XFxw^&y8<*Y2*k{6?>dC4j$7jX!KicQA z!{Xtf_XlRK(f=*VT$?N1P3`LgWv<)w%ab(+n%q}y^{;rK$$j%4i6#%NbRV>+F1%Xl z{Ai_I>^FI|(wWAiG!O6&NV+Bzjmq`w1ClN~mCtXGe{^j`_I)a z$M{9C>oLuj3B>z@VCQ*kL0y5Ie-P}-&(XQ)_D5Qs>w8->knNAOx_)<6FKQf!cVD=6 zgzc{nf5f}|#YGDB>jUxb&)-68{6)O8@7+XI4oQCy?^*>TqKOyquGal~1knCbV)xx> zddJy|gV)ZBTAE+|2()9rDLl8Y4}845hjPc%eDU$x%x&*-dW9DsuTIwyyr%~~zIqC; zcEA3?$NR_iu95>DuMND^5_<7VqU_t}PE*$Qe*-n|$5nOOpaV6pyRXoXI8gJBS)r%) z>jO2fBgB4pe?!gd{sW<~uMgCG4svny{R5kqM^JN_zW{mNhd#RbJNBOd=Rac1!~6{d zcL3x+|KhNJ|C0wH|M?fM`P&~H0Qt|z_ptu}oA)orvVS(cC*b@~uKWRT{!iZXm(Spq ze+;IA+Yd$f!+xl%W2JM2P5qH#mz&w-Tz@FSdw1Yg@Bgdu?p+yOUe#%RV(bq^cn1yK z2)BIPnLU0AuYNp+YDTy-ABym*Wj5&)e7xU!-|rZW$NC`&|8e!BuKsc7M~nU2b3DrJ z=R?0L@8=7CTHoO~?eE~7cYX)@e2(+8f1FSKe#7$(>kr4HzT@#TaPr@q|9=WNud2s2 z0bqXs=MVbDKhJR>%g?J{6#8-J1G4_{e;fzE z{dnpF3xB-fYyBLL)BcX$d*^ec-{<)FEbl{~-|&6G^LzhrcKkbM=U;}-f1Wl6bpFhQ z{ypgYpGe651?W8Q4#8^wmMnhlzkb;1y)%E$n}Uw}oc6y5o&R`}(@r~6Jjo|?{^KtW z^XDJ@r~sFL*>u^z0XmN$liiERf1ORFW_{;PD?~nn&QEju>w(%eXf2gAKB~d!L zc`C{GNi(hNYxn5$h716;k|sOkad+A$E!4Kwx>)U_4Wj^2bML2-Qi$>bb~=qo3xSjc zN0s(Q^T(3iBC@CyzRL61C+)U7>;tYk2#7#zu?>bDkR&^=#9Xh0@Y@bd=O|Ba-{mT) z7aw}`RSoN*^oDs1GP;;=f7c-X^(2w!Wy^l7cI+w>1%o)P3W@B$8%->fV4%FdlL!E0 zBN>}2rh}^|u)nA#kMuqKB3PUZ zBGt76O#4dIWA8APCmlZsYm$KIY?bI7cqQknI6-SpvaXx~2@#i0_(miw*dw6 zGEo4*xX7aDt!UlJ`yfcfB!k&}-p;@)(f~k(U6YuG)ROjbi-A{^SgW;}4HqE#2$8|( zBGL9VVgUbgwk-74e;$!~Nkup>79G!5;{B6PfKjIGmizz>y;Z&nljMF?2I#2btAGij zw>j?vt3Q!MhmN$zTBg%;Y3+28R3`C8%GXz+_UuC^YXD@FcW{}l84zb!1IkeD8;zz* zlp0}I=epYwd`&xq15WQoPPaS?_KV`67uO*F`toL!qLx@~e_Uf{Coat^5^a}#^-)IB z1DLO+On(#pd*p38eV=~$h1B8G>jF6^LtIfO3k<+3Veb{gn(EmQo@utrj#N_80~D#? z_~q+m0cedJsq8G7JH_NfWWGwPeqCus4V`4LbdPpmb=eA>$Q1iUX)w$ib%onESLIN@ zyiupnrr7kWf9A9V{>ALwc0wvXh(ot*9#>XrD)PcUN`J1We!WZVE^R-20@S02-@j57 z^XH)(Sq;5RoGZ|BY*?$QH?@IlxN^vpuE!&6N_K}zoi>7{?qcb|wj@X(H@)Dv<_p@4 zO$5A(RDcGni!nz-zr^77twjZC#eAeMkV0qVF(VR^fB1ddY@sf|&cpbcMP?ic)~)H< zN#Z^{01%$|&q7odGU`a=4u$Gcs=e-+;`4ByEZiJWsVlK+_KwdM4nZm^uu{Vu>&z_alJVpG0Y^JRrarvS%}Ua z*!}Eie=ELD?sBgfPP+&M?9f(9?H~dFVr${8==~XiD!~rYb?b8E^B!?~`%-G|mPW1} zdwG5J?r0FTYs6}<&I3VvI~sv~Cz%7T;>P{FCxrZ zEs_2ByUjOVbJPPb`{Q)f&)mvqRD6E+gWbfwkt{QCOFKaJr=(&T|UZRS4G5 zH)SguUOwWV_O*8E+1utM&J0{zzT!x`oeP)0*A~N5+MQ8AuJa>gN@F5?A@S8|7E8tg zwsu@w7s8C*S11L>Qu&DIw{^H5N&y(2f2zN)`4A(i1CnY$?>j<_L-Lf}9ZmWwEg0xw z?~*yuhB0zQqn1-Or@E3o`}x&vAF=vd^(Cm(uTDS!Sk6bmzDf5b1knH|UF4hnS9re}^}~ z*1zbr;G5hd$Y@Y?a;03BDC#jS`3G!0>05!c9?^1-dD1#6yRD#rLZi||S-$FRZ#bI# zHlW<@>Mv_iLVM@|I$%}*BnY<#c?FH|UF1OMci+LbBH=#T`(>shjOkprX%5k@D1hc>`^tnV+uj#$J|%~qGy{m6e{Xk_`L;34 zTOzvE{TkcY!cT@~0BP7Mx83~P)>9A4X4=%075XKB=obaPTa3M+sQYUNOn!~v2-cgp zoz6o#4_b8jB>Moa^pt-DLZc>$!B#3kb~G(_k_=pgi%s@bMOfqZ8_3<3{eql7*#sK0 zul}8z~4Rdra>;J)Ta76UrvFZY!vs!o1?k?f1YLlR6unc*5! zrTXjcF#>J^%>a@XTWgEHIG-daj@2zMRPC1SGV_gD>#F8cw>MtOSd`cHbD9^ZbO}1rbC;-D-W< z4K~b8PMtj-ElK$^)FA!iZd={iem|h7clQ+M*JD%c^r?Fy0iF8iJ`+YKPb3I9o7XQD z{d|W3h~{>v!K898f7ZPI`0AT;qAyRIY$#vydfQD!>_ZJ2WVe5LW3=q{G}W)SyF}6s z6apHI?#`C=uo%E7CdPJXbygz6Z;pnl>h!85c?>=pXCL{ufT~ij-#Tokxb_h0$=LFmIhBoQe*;kU2&UCyT z2?eskoML6xy1=g?XGe3;5_6EdS*s-(!Umh*iA#$qVp|?nX@cd6PT;9Q^6-)sNXxSX zL~^(m`V}DzQBIN-wCOcKwoNYc5wXE!d`M;n6iB!k8%(={-U?Hq1=(n%r-~4usKnsq2BGA@OL3`{lXp znu_gHt7DcphaybK& z2f-%P?me<)J^2?@MA^$74=!6Kf)ybfSKSFU4B6!ZQnsLImMYQ!HN#) z=8hEal)UXMp0b6i|6wZt0KGlZqA(a_9}7ZQCAy$BL{2SP3>s+bt%YcZ?DfzUG!kaM zK-)FjW4Gf5)<4;IQql@f4hKf0x@}`#VPDj9-5nHVQt}2=s5YB65<3!ue}N3UofDTQ zXA23C8ukXily6jawl;s?rLMoKA|qM?R~+8(8#L)T>a!zhpF{(}OF*}b-Q-F>fkMsG z_g_eO-piL1`*b}qM)DX0_k;9luFKs}Sb;8e5i7k(teT)vm8$$$863=Ere{BLArlqO zq#3v&qw>r9%v7{cFs(B43uAYaAq$RSGNk4Rc%|zVK9MK>-^^oe6C)7YW?6BTqRWC z$(x}98ac5U6}QzC#mj-F!f-j}279TZjZ#o!|G6IqgLxN~_-{37e+QSq%V2=lgls@w zk9J*&>q(X+Ljt0toO#LXUD@}AWyKappSVaiRIry&G%q|!HdWB zJ3~!4^6bnXp0$Sfedhf){8XN`rkmbx57r&EY1h1sV8e~83kt}#0IWmt?PT~ z4-o<+`lUw&L$q$ce|``ckop9-@O$>35F7lR{*teo-p|I_roM>l_bCjHc9EbkSUuhE z8Bsq93+AW9)ijgO)Eo#c0>zy$_<60Dj*`poUPY3%l9#@Vq)Zzw6db-W(S^U8G!xo_ z131{GZ=gIYGD*asJt^6bs%w2H&G6y?6#71I$8CK`v@OcKe``FB&E=Nt*Wm1zr&l?y zOV(X(S^(THhXCn%3Ls!nJPK*5Vau*9K+*RiuMs^LoK1AzxV;g#XBPOXV!KrJX z_Es|K-D_=jZa%E3h?W-b5&#P2xrQS3^x^q2^Y~h(EP`xNUmFVs-Z*3x&PSX;`(zp%0P1y-j=}DA~(sq3GeeHtI@|xS@|AJuVP(N~bN2 z@lJ=XtFkNy&7$%k3L@X(U<5g6L1@SU2vMIO79g`{e^TVYG(Wvtr=lWz=gvw)kq2%t zB)+UGcyaglz3kl#{*3)^@)!J>mejw%UvS>;ZI?Z7_FB&_*7F{}>2Cc|SMlfO_n*UG zK>rh(fDV*-l+rD53(I4n98E5!3}X z1Co2NBhc1mOTDC0dnmYLx0uRzijy?~yDeb{jJ^u)dQJ;ZLOK3XaQD}`M^83|WLYSp z-`q|laIh?Z9fO?ZL)l$d+iT2E33ngM;VL^Pe`|tn9@JYWYl0qTc}4DIK`7#ZalWFH z?LhabH6-F+wgU}vbKmJ?HPC&k=jl&Y13l*&>pQD~dhNDngil%no^!7n*S`b?d@RI< z>enZM0fT0@Y0fb45*YAN5S#x_U?70r_WkuFFz}BOyao?{fu7O=VSlTKzkr7s)8n{9 zf5u%ude2x82Y*2k9?}^i4*mjeQ|u8nmIqIPHw11+t{+4NnsYTo++Usof7P!~k^0~KDN$Es&3U1YV{BO?klTU!P0`3~}`?x09$q^}~kO znyhOD#lTBdpkIyFx|5QC>(LGHf7`s21YAF>yB{a@fEttA6^idK#elz+Yj~U#15!m> zbAP82@awzd&|igkUB42Od|>){U7B1R7XM=Ui*8wh1K>gLYr-}cqC3(1no+jCz6r-; zuVi(;qxAV%$W;?|pJ;py+nDjQFC4#w^oHACI6hOBjszEWf8qG(sO`wGf1GgqqP+c` z=0xLb@q3oy1mhQl_RidKg6`Ei%xUuV3A$&>+Du-4`xkW2?Me7Mi2eoLYZSUupPiul zBFC)H_4Nt5C(vI(S$2Z%r5aa!8#zJu`rYoNR43@3C4~B5`T9iN!w1!Z|N21Pt8WhZ zrLPaveHGuaR|`+neUYM+e|M&zsC&j9T^)a#7j+MWs$EVIc%tsf>|WkkbAs-xJb*pE ziPG!#t-Bz{iMpr9-hOtZD1D;t>0NKrRd7z&J@>cIS-->XRZ@!5&I!BMl-hn4oUnWO zp0{gJoUr?%)-7+$I$`(HliS`hc*5>A*(kGpdBAczJ%qn6RGVL)f3SNkmFYCjKePV~ zj(>(sr}-0Dcf#&J{^GQM`;!-U|M3@x`STA>*!@Q!ciMl8_xsmFv)?48{`-FuLhpN` z>NhqA(;p!fxnG4;|5Qk2yXMtSGx5~L#PN&q#W}B7*96j@OsY80BT($NEorLI^+467 z36Ed$2gw>PRb5Z(e-qjHJr4VV3&}D4&z(2QW}-hmpF{M-_Ll$n<$P#r6idyc$NM2| zlkfKq#%p!_xrM0`S~;(#ujCS=`FZ269MtIFo`Up<%V(aC+PqybpbT!uJKw&;6sh@jGDUzdU#UJd~c+I$BEZZ&3Qze||#gfe$nt;wO}z_BnIk zd;5l^@7gw0-9AwBq^0c05g*54#qZMZePHR8$!pW8!j3yjqDAzv=X1~@TL`;9u=Gl< zn@=RpkmC)<^M>bmJk}2^{m0cWEd99ifnoo6jsx+2JoSN&Ki=@Pp5t-a-_bko{Eqbb z9OrjApZfiZf9D(CKOB$y9glzC{QT=+`j4~Xu%BtUzX_)QJ! zUq3RMH*8KN+VqbM=xP63VEWG|IqhoC^C$TL(|`WOVgCGs9~6Dwztm;_I+&g`HmW%k z*&ZzYI&sg0Z00XhyFH-MAD2kvLyGJ_zhYGNVv-8^f7vDG7n)}~(U$!2C2|=1HgCE8 z^d{ZzGKNwsKYbLzLRFmj*(J-S2F2)~{!kYSDU5{sXHQ$5xub2e!+-eB^N%n2*s5SjkhC(++PrWb@XDk@&FDx^bV>(C-e`>6or9Z2&FYWeIdr_|Vm!mF1wAx0oP zZUm6&aF?^)x# z2jXFRoFwED0v%A29TCLecA7q-^FR?f0WSIi+5=1%ig#&nmi_BathsB>W2OWeV^gT6 zp|7ILVQ5b+`kR~E%aWXMv0S&8rY#lwpt`uye~z?Gk)2SsJ}`7zFXBE|h?WvP(xt`_ zlV}Xs8fJh^Q)b&SLm~y~dJA`M{~{Hh@06~$NLD8YqHsO%X+`i#Ag>k9a$7?)G48Di z4vZZ^sF9#@Sd-`@Knm1uc<1#~F=*M!pk0sR{0-dbO9B=^kawDGDz>nf>w0zW7j1hn ze?PPi-A-qW9qnplAXS!_b%aMQ1_8o^8fsspzoz5}AbKJFP}Yvf8{ zNZGoN1^3YrPxYpG!2t#(KL$NB>2uubOg3RE=aGgBE%<<<#0|-e)&SSu!2yzV_aMvZ+8+jWcq4b-i^! zRNeMIP6z{%iXh#sz$C*+i;8p#B1$&`(j^=kq*IVal$1{CP(r$-1f-Gfj_>nky31${xYG-DP5vyI<~jDqS@$(uCaRB?9m4zIvW?t4-V z^@D=ah560s0?PEk{jbMEFD!3Pwr)wt9@zbsb~5|*cv~asUAZlOTgPmH0#JrMh?6@M zm=d6>wIj5)`z8Tt;&F$qs%Knj^h9TI*41IvqAYCWCY7%tt znP_)9S?&D|+2!JlC6Cw9`(0I^i0ppVMR>fgxNu9N>SYX=Qq-e15xOr~((VjQ1Rige z$GPWIceqayA%Jgi^3_kwiTBy>ceRHN2}PYI4LL3n4tjKDxzc$$i}Mst%NZ=$5Xeli z@Hl+n*q>%quuB!;G^+zrsxqu>`Ngrc3ClSm+qBnvRedIE8xJ*BTGT8#^nw_jZZsba z!&wkpVuWMv_Dof0w_8Pirv7%>(+kic`k-(pr6oL|FpH2nbgM8Fg$X%&%iQtUZlTlOR(_#B}54vr@Pjp?7d2?_3MKguK zwuee)nU1CZbKi9**&lz*Lq) z_AaPYkNDqcqQ2*J)IQc1-sdq~bT#Pb zEX^G2c8J?(bIWnDH`=zFeCfY0my?}N?K@}|B&T$*L+qK- z`UQ#Q&;}hoi3}UC;nM9n{rm=n?CTaIqWUjcdbJ8*isDAyh4&%6)v$7z=51ukPIA1^ z`+G&Y=VY@!QS6Gc*vg^sr>}hMrK@;FKMhZse)(0w$nS-9(RENpX3J62sH7KJI<#F& zF-7L;68GVy%d~MY`?j2cDS`djkW}1&KOOs1i#~Nu_=JT4;Qwei^~kdt3uh0&UVEMK zMb_p9NtYbcl*ZfgWJ9j>{jXB@c2k~v7{mq{c9*>7kUUuuwiKomTlYGgZ*}|CZxZoA zzHjNVFx&=F#Go3W@Qrqurh+v`^K|Nuuf@i$SLN>b?G`eFpuuDROreJ$3Skt$XCFc! z=Tt`;`&!he9N^H}tgG#1b7nrPyG;w^I*p4W`_l_$7evGEPTAu=tLM-!BH*rBHnP@| zP!vY*&*z{%NIkYBD?B2t=vJ^CeS1T|Z-#A@d;(wADkQ*Ym!pu;^x}Pe?h%ta?qTd` z5+JMN_lkz{TOB=QN2mNZK3_J+Iz@VdFg1~z#s``GGT>G1)!=)Inl5Xdu5DLw!j#)N zN`V#!F`d0_vom>eRDM*?AIib{5|2tG!iQ5HDhgY;P2g_#)jY;}z`Tc7IhlW=@`OuA zVoM)u&S81p>Y)Td45bAMbZUZN%;s;IxOQi#Y>P=UA;yhZ{v9;C*=?FNPC_V|r%> z*E1_IpE=+{8!zYHJ1qWKhbmp0B)h9NuJl)7PdbIy!KLMSDwFizWaz;Grj09WJlLsN zdLASypj$J|BXQzH?x|mnQXN0XIX&VfNK~F@p&_uta!o||VHpLoIG&xTxornvyFkR% zmOD9o8V@50Usj2D98`YkD5z)0y?KbOcvvi@`soaaw62k@yGK~6y`})A*JLNb!Y+R0 zV#i$4z#!(!cT6e#J90gB5?Sh_BsZOj?&-iUVWWvRT{l#S% zXB<*g%i)iGO7-32&I*>s1ea&-S=HUKQ(C7VyFFD8wC5zFo!*d?Zag+2A>3E*30 z+E3*I+Pw&Fv^tj>!p{hS*%26%iA`+3Lht6|JI$9d7?9BoH(u(Y;kn5qh6&3RJ__3BfA&I6)b@ zTYz7*$mmJWzZos;_nv7{>|>mg9$a`Fd4C-Yj8clveCv*EtgZQG;-YA7z>$Q-Vz~Dx zzJ6nb@zA@cbUb1!G;GJXwnv*w1fh6R|vjz653ShuR|dWz^+IU5cow44ICflQ9K)uCU@_ zeL(GYgnql!eO>+_?bF_N!b+S)UbDML?aS2Tb22r|^whQNNlj+jxmv~#S?`jaU>%o# zZm!zkwNcUyW#u*o@lgR!@y*29pRkt)I9dBmwY)Tj#3{&s9?IZMD>-)~B07y*z-7?v zFUr>3kR9&G8LG-`9*BUVB062p<1zxjYW$B zSHHoX1UoiOcIu^8l@NwG$_O58ro-~d&TN%*(Ju??Spu{-$`9KWv_!PX4igcwEa0Db zx9}9225)Ixm<>y4=4Oexe@a?^9`aUvA6L_Fc1h|zH9h&WPjSC=HnHZ(qMOWm-CkM^ zoIi#7;cX5v;o}vx*O|SIu8%D65F&oP1#o-*fN4IlBP+I*etm=0m0c5?>E)mG4A@#l zE9J=Bep$Lck8T#9<%m`+lBl>ta*Gk4Vvd<;_jKmI>$vu!N(5gr%N=qx>5y)j^V;$wzALhkD=`U3d* zaAop?eq(JycHEEBxD{y{1#b21x@!Fl2Vf)U&<*{a`G#en)!HtJ-pkLSMie>aAKkKS zN_?Cq_~gUVO;o;BxAF&1R9`lb&29YFPq zRNO-}U7Kev-(vN55FVNho3!S(f9?T;?)h4dFb4E}q4F!5IQ|~E5;7e_D{|`U%_x$k zokm~`)M+80Ela8f zrsI$${uK09GilD7X0|cXk8l^euBSfxE=dp`Qz=ej;}-v!71?m~p2Q5x=FE#XV1>%s z2by6jh0U!`LE<=NItpH==WZS3W@HnaZBra}$^tY#ZQe!IEsUQ)yUzSVLq^&CBe4Um zQ#Yhy7Vt@q2E<1n9Y2sEetmiq=uz->AuOV%bf)Y1V>+X!B(sT4yOSN?l@Ym9Mk&mm z!N@B$v*1b2yK|$mO6RDuUvJ5yTbO26<6&h*%wE&SOX$#egu}9=l^5#N!}tm3q{k*+ ziv9G|+bpVS+UmRyp`hObOQEOEgi8$TOQF&illUwTf8HJY!x0dLrAXco4G?I0Jz8X^ zxlI-Ok#P+DSi#{`ImTQO!aCte>9>Z@Z+i`>C^g}`>f6!5Z--vmT6y{pkt}0J-j3K8 z_6sMy!Qrrl{_XDUx7ly+r=P03?Yo5KxaJ8MykjJ`-I*v1M0qPcueHfWxYVDda=cv8 z-l~dG(f20Y&eh|Wr~max4(taA_KaBwZ_3-@I*_nw<2JR-LnT-o&fT%Gb|x83gf*o@ zGPf)w%^Sb5Htdtg>~XxLtxdri8X~RS!n+_BBc1fiW*~Q{jh@D0*J0n^(Eb^C*u)uq z^OAQfmbsBUnN)*SAu4ZTyQuN_OF-4gRFsD}9Ji_i?-!)FeS>g^kGvVEnUUmtvtZ?C zyqD8GH*DzU^~V>KKM2K3t`ffewy9vv)vYt4bGeYZ z?OQd!k~Sk8p4gN6VV8Vg8E|xVp?e&EM+?ghBBK9GE}hx4s$%|Q>4LwAy?W}jPud~e zAt6xIcA(Yrq+SEtE?*&{kwwzYV%vz%ba=@Y7*yOD^-!%<@S|%~0}8iAU8j@nfUDNi zg0BZXOfwoU&sy!4suwk0N+`=}$<&Z!cZQbEgg%(wx>NaDl<e*`NW;vB=vSOIZ`nm4Zxsn2L;7LH2klLt2Q9zH+1u_R8i;2ZW(zgIS|Gd^7@ zYCBox`KU)1(x$$9S2J#nSP9oyP$zRP(No3iuq z0?*2yS6Lw!pcQYMzzyK0d4MPG=D>waqBjH1P}F_u=5Q9;8ZnU*rzS^-i|3M8+ogsb zI=R$uJ&Fy$Cb$ z^3US>ssVew)3l-V{BJogmc6=HmfE4Izd0{B`@aY)UU0Ml%ItMXxb?a^#8db;Z!{)z z%d!t##vRtAgyMeAF2oAJIzOx?rVSh6s9q2#*AyYak$&1J9aQ3zzmPuqd$@e>YIjn6 zpZ15}^ViR!oeZ1%r{^!ftLzEX28bKqPz2Qmr0zyHG@;)goJkM~hv2hxz8n~84XC{k zBU=j)BA=uLa?ax&TcxcYbPhJxcu!G1C!`GveAUXuQNy9jRUg0@lUyF-%w8X0)7g{n zJIC)}A>BhZVKu~9PG@^mivqPt)n;hbeMIg3p4wgjxnb${*6K&(XsD+$BJ}}}ZQJ9E zqKgz4sfd|+9D8M(Z{7QqwZ3kxT)WjNt8<^Hf7=ED&*p3yS4qZC;wPC_Nkp?AyIhVE!5Phoa&AJwv1C1B|uRN zz6~FqQ#&yp+iw4wRF)({OgHgR@6OI7duxDBMdNv~aabasEsV`x2sS6xAUn*NI~4n@yT9k-WPNg`6jN;ol#Ert~BFy=^@!xns|Z&{H7E97jU-b zJN_-^BG14RoOGN>k~)I^Xj-zNcUeYO_U=g;Vl)GlpzszkTzlfdXhOlXbQZq+HbJ4z z_MGuDS)lA4m_s{}h^d>?ZAwdSEN1*$N^<>0rg%4}r&rH!57!S0$yteWzeYi2@2p{& zwHtbZ15uAaJ4h1>rMk-F=K}uk0Gq@3sw?_CoI1QUb%v+u-~l7Uk=`P*n-q-=zjn^a z{AJ`{Xey$(<<;48(bs9x!8?_i9W6|EI2$-7pSlPgD<`a6R-XH~Eo6WP4g`5j10p2# zKMoG^9n_KK-PXOZD7pH2!F7j|347iA(htU@&XES#PBdP0wm#cE`RmFCKt`Gu-B)~C zenn+`Q3U$YC?f;%?>vGZ*u4G-c9o*57;`b(>(hPt(4y*@qI;aWo(+fBGufw-oCKQ2 zd#c=SZGw-lX4!qqbUYrbwJhFQyemW+@!4#2%RNGAjY1!NX+wA_*7@YL8df70&2;KQ zD#_C%b}=76pAjcfX{ckt1N0FYc<5{g?f#gqAyycad^?5SuTv6YYxPtyi zR!Zvr9T|PQF)}Fmvq7sh)<2i3fh&$6|F25;6i)&!bLVm&Iu0 z`OSrbl~?P^PM`!kgZeslhCy7NI|11T|Na5L>$3Cz&ky)H!6za-q&P9K$EQaG@|TaY&`+i!Pq;Iy zBoXdm5~X`q#N^}%)$!I5+O(gzV)X88k4bjA0iTmucb|4zy&AnbK25tEJ+lNZ+OLes zu(NJ>a}(}7_uJF$m?XK1xjGj2JYg!l+F297Oe?xt6!)}^pG|*oa@^T^4r=6feAj?} zgp9%E;oY;nm>p+1fGguPA836eOD~78mh|2|p90QjuFl09FROsd#w+*BlZfDvKB=|7 zOOl0q1XyglZZhoPAmPK#4asu-9eijiNUEcqqx{@4U4m-#^7v+T$*FM^==r;}SGe_3 zZ1ZMB$ENYbZm9$tfal#~&mM7n$KxTn%Wrh!KasOHF2*_P1{D}T0UI&=OGS-?b=G;Z zqn-P^F}0y-SN%*4(XUjStJmF1SKhj>;RhJVJ={TWc{5afzWC?Z+3aQVL@@vB8M>8v z7TQ>1ec2?vqACm4v7-KPl~?{hKMUkF#jWqPZbBJ2xQt%%a#4LNdi3bi;8%Z@X>Ou5 zB0iLphqKx1(uzCPaT@^7EhUZ#nV<0%?c~iSdkE{d&4vdV?lZkIw2Su;{b$?2oDqYD^}(x1tC z<_sK?me>=s!2U0l2gaaRZJmrTtg49{8BKcbCqLFeDPRRBBjFbb@kFY&?h=>Ihnv5+ zckb6~_;U-pJHO6P2l!O$ZWgQuiUqWgqjK`z)W+6%_Wx?zma`SRabLY9W-wK%?obxS z_FYr5g1Y}$>I|A4OtH<^i}m^LpZufhGuC1oebCEJ^_4u9Ug4tbG1*ZLn~>oZhC~11 z-G1$g$@dHL!a_Z(P6fNgu+Jw!tD8G-YdQ>1Z})yseb1K`{Rt3I&L_R%h+3sT(j zEp|66&H9QfURx2%5uBn9R!cYj^RSQHxNYJA$rw(=^t*Wh_?8ogCeQN?W=-y{gZB4X zY2S?z{JJYDeO=kc^{g^Z+il=zFV+{+pxhnCp-YvwzKFY#xK7Fr=sn5E7^(TH5ORW+ zl%I;KbSjIS#Cw2O1cv5e`MLU=3o+(z{LU_`Bm?7$L204NIk2cb6Wt(z(@OV)VbkVb zoyiIc?BpFrNI7Xzks?R%M^Tj*PcB#yvV?c{)kxf>HcC4ix~2zyIp(tdSksVXDHPr+ z>;HCmBD${WyX}uZUih{DQ4YFVjG}$%*LOxF`itF1W{w)r8!y`m+{JUnx=Aom|Kjxr z0(q-He=$9dG#4l z^LEKF?e)<}XRO8T_UA5m75)k2O>{H*%j~obCAuAug{fShXrZ6dN*y6~Z`C07YP%M_ zb)Fxp+8LiF0f}G5*^2HOkHk)ezc*ugui>Fq8Pr+%B5WW-qrvRy?NELWF(Xj23fzL= z*Fm{&Fg2pLQ@ z7X$_RW0G!T`i}ZTHyF%nx8(S{5SDrbOJS}ic+5*Q1Z>9L}DGM+; z1)z@Na~tq{xjGK%Ktby}eKyoeNR|2L+2Vap5V4HldvTs79c|@1CG&TmDJOx~nlByS z^ue)BA8zO4_rx^b&;539t1+oOefJW9(u+342fBZi-TP{)m$1#!M#(QDs@7kUoXAoM z!Nd2{GR>6u5K~p4qD%Fi_(7z?9%Fnb(!+C&N|^!J9KFW?b!sT!Wfx(s3~UUAAE*K% zrST4UON)35=)JFfoEwKowHh@V{kF8b%M@yW05Z#b@SS`_$T#_3-YOY-Syyo1({i;C zD-pP~1ox)r+1!nRk{D)?(x>n9N0cFTJSe}c;Mn>dD@NgO4qYHnHZ0fZb#`^UuoFRJ z_-mm5m7wJck8*@ntxg<#Pjhi>K<&*);JAs@r)m$E@_nPb`4PcB3P!fhkrKba%`EAK z3O$!6Z@RIHvL$ZBbkz7B{y5ltjQeaP(4M1=By4m2X2Z81_9yJ1w`Yvj+IHJEcNSW{ zeZnsvUvh!3h^Zrd6n)FP8s_I}4vEP=y>d+gNXMGQYc^6!4lKAb-N(qpYC>XmOqf$q z=iGWMVzF@Yh-2)VMGA6D$)EDfgOoUiN%IoN)hDR{!oK^$pWp0~Z(@yA!eZRAplr2I z3d&ExBMBkkx2_YOC)-o~W?b2K>y(q$N{;w>c`Bpg)Hx|7O`^N!u&8A!WV9*K&mFM^ zploX;^NnYatg=SGdfQXylP628HQ?`EYQA##+vk^8mclVF<*eC)dn-b!4vCS;IA?EkRwiZleV163$Uc7Olo1 zYgOjoAK!f@=@jGpTd9P~dG&wH$$d}6F`dd}?Zc@rUTfhsU=R_rr zznJKw#h&>IbYmF-&k_)6B+b(K|&CX(Z8&ojboUA`oa&T~Sj;>;>;lp@s&=>iAT zK}L6J9;rTQ$0NRgoJ0q$7h7%@z5o^VnKVW6_Y8XxRt}5r-R7sh9PwpRr0z(E+5+#v zaUzLG3F8BC1CzjTk^Q?7S(YBTn^H4&Oa}+}>+(nRaMi_^&-pK;c0WwTN-7RCjMKv0 zLOaDiR(>68_VN*WCH9mJiQY<+1|Lq0>!I3wDewN*y26cIUIPuFX%U?HQH3|ocsZl*Xk63F`A5S^SNCIjCPcLu`=#Tgz-@+h zU)*m{fmz}0w?>@SilQkMU2eDRN!$ z7%!-n+GZhTkKo>4D14^(@a!pxd*b?F6BeEk!HHP!g`h3lt1S*jYvjbseI=u_Gwpk9~7KOPRYFv7co9Y5R_AdxD3RqlmA*>Lu6)(b9 zJ*;x>y~fgOdfvP=+OpKj<;;Y$bf&Du)+z>bS8x7=&{zYLLHn=r)GV37Ma)BG-%mlR zY0`*His)`)^1(`HBU^nkT$U2k`ge~eY?4%4Uri6Ms@u6_+ptE--%mh(FXKu-lXSCR@VWq7QZVzx~Wrt(=uPY%sz{Hs99{8sgZjkKMQYL?^0#fZ{8E z#C3#4jTcP-;MqFPI0~(0)hWLA5!LELEu6&)43aG_Nuv_aSbvjl<#-bzh_@zi5|!zCgtrZ%CVSo|B`Gz*s}C&z9wdxO^~LNVZn(H!5ZIE zRSI;7k+vyw`dF=st21tuDCS5m_6ATkh)^MdZpAGDKXpJZ6!T<*gd1Wsld+V73*=*Q~|U5 znrR#-m(Q@;JzFNp_Y{TEi;pG}QR2$JSzU4(AYm<1_YYHk>^GfDzo%4ELJE(?D=m>j zQ5r=oI*+z`h#I&V%f8}9mT*h3S=z3-s_>+|1KvI-D6RTh2mdF*d(0?orf7OE z=n@x6k!?Mx^+N<-cgJ%Zhb1aqPZ*(-$CxQWroNE4YxCf{Tp{{4Y(c>&;<-FB=66%J zN>p5A11iwmQ0xc}>V@O0pOWh6Z=?r(_J!Y&OyS#dTIGHH)m7)H$iHP(_)>6gSz)(e zv56L5rVsV_-l(0X! zzki2CE;|s81=Zo1;i34v^V;9%x$~>LBZEO2k^ynQIm0d<*D_36xpjozZmw@D{j*Vq zQo(}s~U8O>r-$#@Uq{h9M-T^)aJUCB!oDZ`;Ij>>b87}L8MU6v(fM{Ja?Xjep%Tu??n@VTXW8h zU4kj2#2RXNaKkhs8-s>-O^cEl73rq@K>X3chw<%%!*aM%gO;*3ky_TLm+hSjY!3jh zrZ;Ml%Z|s-9{0&I??gE}8mUSJj@O-Z7?C)S=-nFAnx#mmE^$1_Xny-5K0mFA z-isSCWPRkfTP2@=^ZP@hcPP*IA^Bp7TF1d(@ps?-d3B%Pv-vR%zbUrq=(g#)LmBYG zshp(I`5<=w>YL^&LF?zK`AEofD*>F5Se#7<>=i{5vLO)f*Sf*sE(39QMVFw_2irkB zQ^V^cY#r)a{NVd0IdLKkYHfEd-ZNqScwnHe_M1*Ej2r!&k~|-0UR0@v>R|`tet}2d z=4i%&{kz7ks``M(O|tfl1athBgU}b~i$Y|546)^)Kc<@ym*SK+MYju&-=AwHC;@OA z6$D{lg3RY;2hyMu_<8vB>q$`k7e zg^PB|J-9q?i`V8R=rJPPpR3ZZ*N}Ud?A1xT84JBN1(F`VDCs=9bf1bsCWNK^^0(&9sqvT8LK^8F-H>#GO^se1|h!5~TtJ!g5 z-#aZ&u9&RC<5J*JJFQz5J!`Uwx{^Hawc$xVW;jl(>F1AagyvH%XvoHlK87Hk6jITl>h5pFBc;$`!u(eg_sGe#BG=G0uzq-APH%Nxa& zQ(lW&(5LQ6I6hsPs@XTb0@5F_&zj&arN}chJT!kl?+A4qHne+gu--X5kX?TTwAxqm zTKy1fwReagf(|P_C2iFOWDh*0>|8!*hrHwjm{IPk#KRFMI{^#IG7V`XjQKn%DaWDp z-NpmUG10#CbZeM^&zlAJCCLC1v2; z`rs;Ix34_H10!PxLAp+0?AbXqMFPvX(XB57>C?ogBk6y2uHd>MLG03NKcHWgs7U83 zqi1??TlK3Zwx-RX0Ejp{h}41vqDV`s8(I0z>1=`M;NCbCv?oe}x7YvXc~v@hmD*gEGdKGv4ce#8&YT8^B&HJC$KsJ+V-*Vgu- z5>9qXyc?y!A_{>$sC@tIc5(tu%7Wf&vFQYwwsFoE7cOch@VeZTXT(mlLv7qL){PWm ztzz+fz+6W6%1?8{)19SGGgzU?SgHt3f#$M5`i+q%*K@8XW+0Y{3MJAE(Q2l>*C5mk z`CulCd^iLUhN~=3+#_SF5cy5LDz0Zi4Ozr)2YWVT`RXyg301UX3#T7TxNn{0AEoq~ z*xk%*nhP1QOB~F3+MYz0X%TM`I~YUO>X)}?;dDd>dXi;Y5b(hj41N$5D}UJ51Qr?4 z!c7;UrVh|0tw(W#ndP%;7szggLZ^SgJG!O3OYQ?NEnOT{^<0o6Wh;s|iS3A@Qi-XX zV`?`PxNz}7V#j`wTkrDaV|h(NpRuOArY2RB%Mk7aCp%_VA7i&NPoFJxFxh~KZTYK1 z@jtmXfpa8!QoeFg2UvWtdShwxpc$;i@P(w=#Yg{Bt%>jLR6S~IeYgB&3SzZbT9Xeg zTq_(v$mR58)j}h_7fK;V?R>++noY@3P6#^N_Cy8dqb_seV=E7V z)XB4%o{x_gMZsdLj}$wyCz|C&NDq?0Jo{%TFX zk3N$jJ#n;x=}V7oCK>kf+blI&CE!Qukprn)iH z#{cBPkpob0K_uc@69@z>c)bY(0uvO(@Ds%70tA9WV)#L!LKw$`B81R>z(4vAfeK;t z6#|2xFb)VqfH4jT69QxS!66U~KR6unKR@8#oI>D8D25{f4E>+ufBX0ym|CB@s zg((RNiYW<75K|Hq3PTbo82Wcf{-r+z3P$`*lYdhU1q)$Ff^Lc-2^0dykOT@rVn_mo zf-xk4LID_tCQzs#h9poZ3PTbo42mHM6o$Z%1PT+vkOT^c{96+A`2R~k6b{D-6DS;s zAqf-##*hSxfMG}iMIbRGfeM2EAqfO6Hkwn|-!=J5f3!^yQxZWG6cP^w<8T4j=PVQ{ zgvq!N1e0+gI40pjNKC>}U`)bMu>T_*_#bH~K}^O`C=AA7U?@fqz`zI$!eL+`48qau zTq7I+qtg-`gK>23#$X%|#R!IOi*Y~%5#R>fw{24 z5kd$I5OkWu01<=>VhltO`L{ahKV<_P3C5VMa3nh4Umpol5QPDPM4>Q1gwQGJdRrku zj9dW+&~*|92nq_t06`(37$7Ji*mV$eIfaoI5MVg`ItBuaMEr&E7ytjI9{~Yl6shQ7 z62t(3V3vyrbh(HDf-V=Y4+McO7ymYpf9VfFpvy%J5Ev9A-Vx|>5d#EW|6qWiv-00S z{uQx_u=6>{CMG0Z}Au+-e?S_Q@<%b^s z|Iv?53+UqYpN-Kr^!k0>hQO#v!6>wx*E$GBpAlS-ceG6i@%Ik?i+}XoLU-dI)PPZF z8ZZusKw?A$7@Zuibr6DHA^sL(|2f$a#LR?XAvgfT07eQzFjznr!`CzhqlCcM=K|V> zah8R)!LBdcXdC=LD#x`Uq(dumZDN8^=t}e2ii);f ztK`u9|5dqRBnvPYqt|FZL5vxUZjF)W(KR2&Bm|?+I<9pZ0)`-kfNP^e8&Md^2mJq0 zaf6{S%rjIdIwbzd33e3ehVQ0%I`&!vrywS+pR6*X9uf zeUgC53>+PI|L7pP{saG&=>K8-%O(WHu%Yw9wMmH1mvD>)3yiLs{t1FU9{QXLgK0r@ lPT{@|j4q|FQ-~0RLQwHILO9aI2=u?