summaryrefslogtreecommitdiffstats
path: root/perl-install/raid.pm
blob: 092bd944111a728dbf4254d018839502795ce7a4 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
package raid; # $Id$

use diagnostics;
use strict;

#-######################################################################################
#- misc imports
#-######################################################################################
use common;
use fs::type;
use run_program;
use devices;
use modules;
use fs;

sub max_nb() { 31 }

sub new {
    my ($raids, %opts) = @_;
    my $md_part = { %opts };
    add2hash_($md_part, { 'chunk-size' => '64', disks => [], 
			  device => 'md' . int(@$raids), 
			  notFormatted => 1, level => 1 });
    push @$raids, $md_part;
    foreach (@{$md_part->{disks}}) {
	$_->{raid} = $md_part->{device};
	fs::type::set_pt_type($_, 0xfd);
	delete $_->{mntpoint};
    }
    update($md_part);
    $md_part;
}

sub add {
    my ($md_part, $part) = @_;
    $md_part->{isMounted} and die N("Can't add a partition to _formatted_ RAID %s", $md_part->{device});
    inactivate_and_dirty($md_part);
    set_isFormatted($part, 0);
    $part->{raid} = $md_part->{device};
    delete $part->{mntpoint};
    push @{$md_part->{disks}}, $part;
    update($md_part);
}

sub delete {
    my ($raids, $md_part) = @_;
    inactivate_and_dirty($md_part);
    delete $_->{raid} foreach @{$md_part->{disks}};
    @$raids = grep { $_ != $md_part } @$raids;
}

sub change_device {
    my ($md_part, $prev_device) = @_;
    if ($prev_device ne $md_part->{device}) {
	inactivate_and_dirty({ device => $prev_device });
	$_->{raid} = $md_part->{device} foreach @{$md_part->{disks}};
    }
}

sub removeDisk {
    my ($raids, $part) = @_;
    my $md_part = fs::get::device2part($part->{raid}, $raids);
    inactivate_and_dirty($md_part);
    fs::type::set_isFormatted($part, 0);
    delete $part->{raid};
    my $disks = $md_part->{disks};
    @$disks = grep { $_ != $part } @$disks;
    if (@$disks) {
	update($md_part);
    } else {
	@$raids = grep { $_ != $md_part } @$raids;
    }
}

sub updateSize {
    my ($part) = @_;
    local $_ = $part->{level};
    my @l = map { $_->{size} } @{$part->{disks}};

    $part->{size} = do {
	if (/0|linear/) { sum @l        }
	elsif (/1/)     { min @l        }
	elsif (/4|5/)   { min(@l) * $#l }
    };
}

sub module {
    my ($part) = @_;
    my $mod = $part->{level};

    $mod = 5 if $mod eq "4";
    $mod = "raid$mod" if $mod =~ /^\d+$/;
    $mod;
}


sub update {
    updateSize($_) foreach @_;
}

sub make {
    my ($raids, $part) = @_;    

    return if is_active($part->{device});

    inactivate_and_dirty($part);

    isRAID($_) and make($raids, $_) foreach @{$part->{disks}};
    eval { modules::load(module($part)) };

    whereis_binary('mdadm') or die 'mdadm not installed';

    run_program::run_or_die('mdadm', '--create', '--run', devices::make($part->{device}), 
			    '--chunk=' . $part->{'chunk-size'}, 
			    "--level=$part->{level}", 
			    '--raid-devices=' . int(@{$part->{disks}}),
			    map { devices::make($_->{device}) } @{$part->{disks}});
}

sub format_part {
    my ($raids, $part) = @_;
    $part->{isFormatted} and return;

    make($raids, $part);
    fs::format::part_raw($part);
    set_isFormatted($_, 1) foreach @{$part->{disks}};
}

sub verify {
    my ($raids) = @_;
    foreach (@$raids) {
	@{$_->{disks}} >= ($_->{level} =~ /4|5/ ? 3 : 2) or die N("Not enough partitions for RAID level %d\n", $_->{level});
    }
}

sub inactivate_and_dirty {
    my ($part) = @_;
    run_program::run('mdadm', '--stop', devices::make($part->{device}));
    set_isFormatted($part, 0);
}

sub active_mds() {
    map { if_(/^(md\d+) /, $1) } cat_("/proc/mdstat");
}

sub detect_during_install {
    my (@parts) = @_;
    detect_during_install_once(@parts);
    detect_during_install_once(@parts) if active_mds(); #- try again to detect RAID 10
}

sub detect_during_install_once {
    my (@parts) = @_;
    devices::make("md$_") foreach 0 .. max_nb();
    output('/etc/mdadm.conf', join(' ', 'DEVICE', 
				   (map { "/dev/$_" } active_mds()), 
				   map { devices::make($_->{device}) } @parts), "\n");
    run_program::run('mdadm', '>>', '/etc/mdadm.conf', '--examine', '--scan');

    foreach (@{parse_mdadm_conf(scalar cat_('/etc/mdadm.conf'))->{ARRAY}}) {
	eval { modules::load($_->{level}) };
    }
    run_program::run('mdadm', '--assemble', '--scan');    
}

sub get_existing {
    my @parts = @_;
    my $raids = [];
    foreach my $md (active_mds()) {
	my $conf = parse_mdadm_conf(scalar run_program::get_stdout('mdadm', '--detail', '--brief', devices::make($md)));

	@{$conf->{ARRAY}} == 1 or internal_error("too many answers");
	my $raw_part = $conf->{ARRAY}[0];

	$raw_part->{level} =~ s/raid//; #- { linear | raid0 | raid1 | raid5 } -> { linear | 0 | 1 | 5 }

	my @mdparts = 
	  map { 
	      if (my $part = fs::get::device2part($_, [ @parts, @$raids ])) {
		  $part;
	      } else {
		  log::l("ERROR: unknown raw raid device $_");
		  ();
	      }
	  } split(',', $raw_part->{devices});

	my $md_part = new($raids, device => $md, level => $raw_part->{level}, disks => \@mdparts);

	my $fs_type = fs::type::fs_type_from_magic($md_part);
	fs::type::set_fs_type($md_part, $fs_type || 'ext3');
	fs::type::set_isFormatted($md_part, to_bool($fs_type));

	log::l("RAID: found $md (raid $md_part->{level}) type $fs_type with parts $raw_part->{devices}");
    }
    $raids;
}

sub is_active {
    my ($dev) = @_;
    member($dev, active_mds());
}

sub inactivate_all() { 
    run_program::run('mdadm', '--stop', devices::make($_)) foreach active_mds();
}

sub prepare_prefixed {
    my ($raids) = @_;
    my %raids = map {
	devices::make($_->{device}) =>
	    [ map { devices::make($_->{device}) } @{$_->{disks}} ]
    } @$raids;

    output("$::prefix/etc/mdadm.conf",
	   join(' ', 'DEVICE', uniq(map { @$_ } values %raids)) . "\n",
	   map_each { "ARRAY $::a devices=" . join(',', @$::b) . "\n" } %raids);
}

sub parse_mdadm_conf {
    my ($s) = @_;
    my %conf = (DEVICE => [], ARRAY => []);
    $s =~ s!^\s*#.*!!gm; #- remove comments
    $s =~ s!\n(\s)!$1!g; #- join lines starting with a space
    foreach (split("\n", $s)) {
	if (/^DEVICE\s+(.*)/) {
	    push @{$conf{DEVICE}}, split(' ', $1);
	} elsif (my ($md, $md_conf) = /^ARRAY\s+(\S+)\s*(.*)/) {
	    my %md_conf = map { if_(/(.*)=(.*)/, $1 => $2) } split(' ', $md_conf);
	    $md_conf{device} = $md;
	    push @{$conf{ARRAY}}, \%md_conf;
	}
    }
    \%conf
}

1;
EAM}Qa'0dNw"5䑲 2ƲE2p\P 1Hc'63xo|)Ť- :A+wiwC}p.qɇlYԐI$GiNSw8LbZ=A(OoWUQ-D)%O#4[z0K  ~| bV67Hf<cpObO&.e:Cꋸ}T03p]K aYRXj+H߄PPPpKᨄaF%ұp0 ^Nb~cK2M'pTivJ?x4:y7h)+tHؾ/*/MN(c70ͫcp8$KAG_Dc/nkca1VZؑe߀"[ޱ \ g׈d?f \`OΨ kՏߗ{3'uUM&fcR8_Lʿl~zπ.Jtyr!RSytz]d+X3=cp^U.](fK}B\zq2ƧfFoƭGE$B^CT!+iyMFyap[T`&ER I}vc *!e;YׁdC핁Um;=O'X>LL=#VPϨEG}l7Ry2(a* Uu㴈aa^y-2o*Vf 3g;I+d:lR^/!b+?jlHYnuA`3LHvKUFAotLpC 9Sc9Ȝ;#zakANx~ʹ)#܅O\FӒls # / dX>U%E$vqtXs vaYî·s ˭2ȸ1JU~YdJPlk%o3z)=u)gJq,{0;u3Q#Ada&s0ЎCm_ QYQq,-q噯*<X`n07yj[O9YE_]8tK} gϕdPRo= vX0|`݋<#g-'թU;so1T;)T;7u\e=WOO<>jbT[!o.ũ{ECd_*ʮ&)>kkVJ/mwZK.TMʱn?J,R\X6وZV>1,׍6knl  ,5 `E<}g^ Vn\? ʞ7x>.C/ɵ{IceXhs5CžyH䅵a@)NeRt,o2 ?H /@05nO=t.i:m.c ELV[;1ÉMd tE[mֱ7 LahyvS7rXfPRǏqvn oxz`TH*F [B.qJۅbeSYP =/F 5.oZ]A:wMy PAB]>騮ʢ1l#Gb W{,0}Bi*(WۘNhbU`JH-۸"# cɨ?u|+ӀI#jI* w)L-Y07?9hK>#\bK5RYiK c G{]dnC%:>L E$ $HFN_:GAVݎ|K%Y bKlw^hƄTVqKkՒ(D5SG^7g!t7iO@DI6۱hO4ydKM\d'j,U(>"ؐsx1vm?"wn@N*"ʾ~Hy,j;ʘmJvA|?N^ۢH1lJ{dF$fyò>wvQtbzp;Vg2DFLomWK'Αҭ)#a]@"OTewJˀjpї}sE,JlfT 2"7]&* zM2c!Gh /hؒm4%|*ٿs@!X ia`A'3l R, ΆA.=?X99oVWJ 0k̲@l_W,\vۭL&x7;,JH1jpˊ~镥 V 5>=`CI:^\)88QrhoJk6rS$ʃ{e΅5\oWVp]9djFڞp=*mZSe ib}IR/A1?klCMDP1XeKwPq7RíQlB,&oK_@!"`Va:xKΈd=0c~Ir&awj+Ӷm?rw؅dۅjxAck< psW();ʈGj{YE:!YuDaS/? <+gS? a;3/ ߍgj`  :|{ {WƝg{aO^<=g:㬘a8zΰ}Ȟ74Z:gQ)m5Ux'U%ynO-a9cPL(;u3)C)%4/O3YX'EEf礨t<$Z 9+ ݶ-h' 1T./eȍ^lh7Ҍga0Ӥ_~]px/յ"vqkD{ Aw jĂ3S2BYVJZ3Ҳ4 Jҕy},9 ؔM(-=rx{OM|^sHa;c1uݡf+oWL]Z?>*D bb:Cnhn9,=MI=ͤk(|a$5}_ &V<%]TTQs-JN`[Kz'/ggQ]1._.6tv>U!~Z %42Q3l˟LwEGb}8taƒw D0Lln5e3O9LaziH_t![/] 0E0MYvL(>@߯o}է Ԓ's >̬tnq_0pg@уK`4;C\ hV1mjfma*`LpE~ Nd#ruۥv_usR[09θdws% ݙ*F ;ќ$"ŖV7`~9u&B;L3Em3R.2ا@ygbK~uT<1 3STmHk([:tKwc^gzYBuJ"rM{2 4\) &噺<>݀`99΁$ɿ̶ E3} +$e4|6^~I>ү[(Q-BH @g!! uDd K I9t ;>֬rx7S x˲VxDLeV/RsUm(+W.@ mQ, NAFK/`+ʤ2QW쳒s!W.2M`7{-Ǐ`R^ga%W-(ўM6J(⑘WS؏JyH2g~Sʮ[Gx꿣èPBuׅ[Yg숯&mh HmgG;¥mrPbF82xXkk|yxxEfz"zm6H_D_FNCOėjѶxSr:/Q;jh* X׭}رJFbS TP"mր&=:f_D>ÁA(b.v!h6mt_RHf,x5-8 Lf)L}.Oi:Qy}4ʧD&W :Ko;61GRe迾$jK -ɐ_}z;|M%#wsL_`[6U@(!~‰T0;: DV+6d[EId{0 MQ@U~{$#՟>/ښ f[H!f$ +U"A;cIwsP!"=b( ZD6MqWg0rx;"J/5bJLV& :g`*q 8dD KN ;*C;D*cZ vB9]r$, G<qh骛^;k~KD|7\F% yuu O݌\An; Һ* ;YO<\8#66c0R/YF 3vvU#ۃ.Q̦P Uwe ro'>IY pK6fJ=wDi#*pn[h#o5S܀vߌH " +3;5+*uDlȔ0J7C:W}W%Y1mZDR57uj!o'zҝbd:%qeCSX#^c р /ݻV&\3^+x =w'j.j:{Cf#,i o܉P?xX}i@=y#+`rdͧF;$77)HC9S*>j6dD Vuc 뜮co{W3 :$_jA﫠uUB_{>J2źw2ݓQw,õc9,oF>7}9+TjAV ʩd[Cr8.]>#gzk{#k'n`#\$\]E|ށGʕڽνˁ'iP Ƴ& J7] ¤%Pc}:NoQ0b(d/u0#綇sH_mgxH  R{eˬ㏲ҧ˥498;<BSey)8!8P;P[.fζٓKn@R3TbFU}j+rt1LiÁ\1qxmb3֎> YWW/R"/'gn޲䅎{#f >.E%歷)ɃNqؠecmHmS@WZK=-lt19G$ENf\Y~Y!#{&ˍRN96}И$pA<:G<=tH9pbi+%|67)@bJ Z0DXnYw#&R(#E* Fy0@E^%P"hLBu35c8N zjS¢ͣ9ꆊ&"j3NǙyHb #]VU\+i0¦̄kDЧVΓ2kc~!DnnL6UH) 21=P n.lE-V$V!3Kұ<|+Lyr ".</؎Ҡ~hW~lF>Oy*W({k'Eb i~iK>s 'lhaW k_ku ƖG0™R-xs_GaE]]җfh JaQoP<0:^:s^5V&ٸ7B.R^*t.1]IN_B&?*Oc9Y6AB*ͱk++h:P[W9@{VGq.a#]P2o=Bz_| X:>A"ŹVx&=KFfНd5wxX U4Mdجȋ RΟƆýTK[;kAl$VI~L;X Tp/tN'RCbIU[if`C^F[Q`Mٞ\i^|)09wyo7#.+|"K4-:HXC%?Qrp^T;&mɱjW) [TO돟 8bMVGt!JR[1%*wy'RҮXԲ0ndl?+b)v­Ђ~--N$64`3ű?V#éKO,?To>8x{!+;,0[OU3 N-%L=U~, J-*4H2w IzDExs*Z4aduS>!3E9<.07&.9$bNʑuP4ZQb98k6B'O\%;y:NNKKjkyVP(#Sѐ1U;gK 2&(w$^s図g80 XGR6\7lYV^C_i+R0]3~oWɛ̃4 ݌~+Kn]fӗ9\w I3_(["Lc)藔B>C$ h yh}f n>Ԏ?p7SCt|NJU;:RGC: VȰr ]ꕕL9_[A j ԅMyФZCT5؅r+^2 ~9Aίm.kBĠ@X/_@.o?S,M R6Ok1zs{P Zσ:u`9EyMfT8Yu }`RV{U)` MP+Az'jxZc؉NPH7ns{1g{?fm̿"ȟu^-M3~X ZC  $[ͭk%M~i9lo6b⋏)Yt B?58L|i7uO64|MK՜:@"zgR>Ơݹ81Gy F kh eB)B;)Q8YD6w_l<FoAK,15&o {TGnmF,ӹQ[z{DHJ}v L})W]Lfz7x[M۱iʜ4+6*{4+ *fNBcq[o F[z'9fe Tv6#132H6w$`y,~b_,s||?l༲L()B?;򘷥 MsGu>~3w?s@'m *LO_Gb]ns$9CFR ;^fO\9<"Ԍ'/|Hq/;+&كuSZ͇r(D2F*&A,&@Q;Z݄~CVءT)S}435~őph r_#$W^(rݧ JYBG@Fpq?{]= Eڕԗx2 xe6x2bwOj_ΉДXy{C\aOu}XuUЮ TRդ<$M\Aޚj4 f g=!j*TaxUUTAc\ȊjDi.`Ñ7. P۽Nf"hݕ 1qo x0db&%Gj|r|A6~>, Lٗ/dm4VdN#5_reڝJK1Ăt$ [Rd THh7JEj\5+U A&Wu ;ɔ/ FD9(ٻl^;lR8Z$lml25 4 -7<6]Y*5 ?ۇs= JĿ} 5 ~# }-<i*=u5̦\U;gbC~DIZR߄t"n yWV-Mu-JIZ[ $V,c` apQu;쨆:~kHzBփ6t\9zUZ@!YFQJ6"cd0*PPt-msN3ܽ ZaFvʔSXDrϏҶ?{p@cf.u@qpyEwj%}]iXN|*_6ZI̛0J~4k UdTAurclgRJSmxe>Kmh_wL>C@V>\Aux (~ʹs$ 5:lG֫$q5DԃP5"5IYa\0~rT-jHhlՖ#eH?Ո4N0Ѐ"Q-0.YbIs]5rˆ3/m0f'vC9o.ܴ)ƵTĨ[x^eWbM4]re\%| gFU2aAnۆ,er݅UTJ.*&ۢQx%t%%␤1-F7lpƉ Sa̛ >D~3 Xyned ?RgrjqB|BSbt_o횺1K5u'U 9=G(k,EF$ҩ<9FM"36Qoi!wƠ޷N0Oc$wluveoHˋG19(݄Vb죏3zU DrhӍWK?mdy+arRqZ=w2;ںH4^ q7^W*BAq}p Bi\}}{MM>͵=TelEz iH]*=FZ^i1?AoI>9*e0~Oe$YdDHQ :ӄEJD` Rkʦ@f/'k~vqQ* ~'u=NNI0R6&׃">oCxN*oeerM‘ :a} J-2.0]V8 _ܣ"vY }jݨ{B ܐ"O= cqjL8 -~ C役+ip'g 7{oa7[63"M3q5ڇ 띛_)1,n .FN(ORմhM7-/ .# vq3k~Ƈ⤄MA',1' ܱ4ZշVX[IP)sËnuF7#۬H41Ql C u*{oD?7V\2%cT@f BtU}QD+h2$9#OY8Wm?4P~ nt=~ c˟f`' |Eڊ˟F}ot[wYY $Ï Ԙ_.nwr?a+)EyR\ҡ&8DwnfwQ! oBCsڶ-DI1ZW[S j0l?"ʹ`T$o'!OVh]0d񷆞@µj*Ar_Yď;ʈ~fIC \>'wє ѱΨr@i3u3M?W6dּÅ쩊ZGhށ"@ʤ5#^9;>jb|{Ɩ`-зph6 ~|aѾEό\T*oZf[iU8#=#>}4e8A\FK3sAbĸB I0J$7aY6W yرuM9#Bj=)XSo ueJȍЎ57Bd Z@D]?#jɐG\uO#(qwXɕFs838;-ю0b# )͈m1 fW*iSw摓"{@ň6Ezc"D9o;=_Tw(JCa荒fy8SUv 'CQw !SMp 矚f28@G+wW%)@A0Цmzew Ub{|& 3hvHQ=GeRR/#z.y;D:k(vk.܆gFuN;4aܳМ}Niaxk;y_JQf鱡R=7V{gdଆ\zkU1Y0 TZC`5F`qFń>`%gQHj2 H=%=❜ @p0OMX|LJ]FUx3zWL0dغedJvbdn LS>nׇC: @;˄ν﯉05Fp$\Jl!O[E@L:cn,|(W_7$sT헡cCnE/Ď/P(h0Pp\W }J ѨQXsT`7ixa#r~)兒tL,A^xb~+5܀Jw5$uBg"%?CƊV'cδl5z41D hs Rd`;pTӚ $lOԘAK*].3kϳH+g}ބrOU  O+Bw.huWŶJHը|ȽxaWSP;Yfp*wQp`~9?%/OiɁ L*!%^QT>߫_u7疁iL#hWzf0~M>Zo쫑=54חǾ0a!rkX|0>eh*.2t &i2Mtvx{bDޞ>||Kᡐm{"7yCoP'a)ILYg wOp7#gEElg&80$ʣC0puJ뿹kՕf=1aT7}\@QnQݟe`Å.lNTyXȩ 'ޢ=a'(530.,\]U8 o7j(EO\[Tn: *T־0Ln!:(kZ[܈e/Ǘ(pvr]뼤/NQkwxccH/ђe$.Vy;)P\\ӂ\̧CZO5 ?='߷m TP M`O 6'(…)F :uOSy2bn6T6uۥl 'u/7 yɄ RdA`acƴ u R\FokeDT5;u)od ysboޭ1@+mw>^)o!iN^: Bڂ4i ?j/֨S"PKG=ðS&"Σ0'.\c['\W *WB@n3i9`K$g5Z0"a2_/x.\E'frw34Y"W-42cHG6Vo ul=bb\\|PE؃f|^Uo=;l97>f[k91^K[Q3^:ϢZ^U/궕)t)Ƙ=1u}l*OUƎv:1,!ޅoV\HFӡWR irB,^45o %s6Q IƫI=16Tb;9|p1Q^1aYRU ջ?3MR |kW]I; J?C ɮcEa_^˗$OO22b3v.m<5-R6)u8/:WDU%ú(D>eZh 2[J0sO̼H<8e#F.R~c֒pK3 &2`KXR|"Xm-pxH?\Cݑ$/D:c x?9%LVßܛyUr$4*olGe&Ej}^!#Yg6}G1FP;WJIڠn]i${]SNHL,3.|@*}]A >S u{_4Tq5mNu7AjSutcBPfFvxIf\aѢֹed41A,vǼ*V| cP1#(=b3S K yp0]B@O&vt&_{a8? >rԤ^%+Fs AxS@IΨb:=KE)2GO7zEG2l_jрMҁW *<~ȳ=n䞎V UNYN1ye5Vd`p웞!y>xm`SS)t0 F~BQ]aݶCT0K!1ϵz&p'*-_ oXK VECwlF28*,Z8:Wl0U$tNhK3_|! n%()b1ESOӾyH۾uL$ا:I "pXLtF /Sp] }v=s^;> Ĥo}CjǗ ]}X[}&"#$ F}C!}t^SV*Ty~{URBGfy .kpwIė@%K5YД(!Ga%|vy,IXz+~hÖYp'Los ot8v'ïbբ쀭֕eF)gXK ڷH`s-\^w"KB|{).E+gqE&\\ ?`; ܂ ۵':}*+*Ls7Y-2Axh7i<}Q{;*OWq\ZZIYfx>02 p2k;p?I]9MxsᎰqEq!Д| 3.`|\JXH,f;%fTC:<'5a}WQF/@~EtN󒕦Mڏ$^2*wq giW]V~oU :l:05L7qo{CaYxu|>y:vM'dfZַ6!5k*/) ^2F݋|QX9~kFVEcfLR3{|<qSAK<+6*+㑜ٵȽ:~ʗ7V})J*qѤO&)Eق%ȬD-/n=y ڼ\6FXxi!J"PXH'(8o"FbQHY:R ۵Y!Ug[eVy7yML.;U-kt"p5Y;K q[isEO(dHS(h1_ԱoD䖞hM ֕w+^IXvs4߮C{7(z&vЦUO$kӔ#æ(䅛0+gAEb+T:s@j*Kxqc3SPMZ 9mg&ƮEAo{7GEz~[9v4`_]E ߼QSb",J, 9a'p*HPƢL~QbO|AF0hjGrޫڊؙׯArORsUdjPhVk(7#~i>AxZL)"Jù_B 1^p}Md ҧW/('g1qr=J^:Y;i67oOY@TO_>s1,ˬCez=̂(l1VWpqm0B.R: =39 NL!+yZ3E~ \e%j. ī%@bב_ƎFKtyE:\Ğp#%_?T#.xUʼnE!d|s>%Y3c& fzWt&fWP=G Zôi4ӑ_/Ղ,T.0]u_yI;r`#_cHRTXjƪ Sz2 y<~z܎mBk'W)hIBA#NIZ8'Ly%Y:M%ns Gs);uuBQܭ?3`D:K&萭* /ĉV 7J%Vxxot_kJSaRVgaFoڧ8l';\^4ۢb} %^ź~CY M/9 =jjs-La$-܎iF`Ӎ H%2˂G}q(D]qjK jd02N6a(A j&y2!` =o޶TO'~`lJ_=ªR1m[NJΩ[6zV'B0Rk|Qy`#qKkC]PBukg_Rz y*%h6(^q03EBx+XQ,. D@I}ku OhG9RZ?ó z$:gȕUYvh3zP5`M^$%b{hZ+SteDw SQ~cgDH|*K|'8l+}()RkdWfյ/+r4г4\t?S㟳LegFoFƸmG>#+ۨ O! kbqNlc ?#hkf B]1?=8@s򁴹 ǽ"k 6S(g3f5d\r"/*ᡪ!gJu |&NEq*J_Q'L-t|QMHȬKJ:` 3Q/V吓›Xξ[+T?AJrOFz7@:E)m'= wj: Pw| +[L2KإAIKe-t4Yw Q\Jl? n+506tTni;5?HNh29>:1Z / kl6k{ahg-<*G)3r\kNGt7SQ$ΙXϐ5_h>x>)4TbDUL:9=Gyʋ)6Qms/t#+>IMǛ[:kt?z,{.IƑ,{pX>2{#w^Zx&@V#:;BᥑaKu9nN_& B=b=Bnj=WE^uE$|cx8k> ӥ_O& hwJ@MB{ʨbU<` anģH)]pDϚlj(i1RZED"hcpsFd2|XC G[ ^tFik\: : X/P\/ 9YN~^3\&we3RU֓@ urS|~5\G >1vK}UU=MZryu-Mg))d?*QbL<.Oi^#b43؁ϔ-׵ƷYNc!Qj,j-:0cѽB8\mSis(9ZoyolYO|(}n 3wڔ>4cɷgiqTP>-Jݒ<Ҙt w钩4个;ķŰdFF'%׈Tq&dK^x5ѩ+N<^/ғ孞x >$jpJ[n֪d~WA\t"V` :F2* R4uΫAھkaB}SkOYX%]y>6f_+~u O0߆cH]hvC\*'{텍zw&ʚV:쟅V#γ)0ls`Hs3^S Dť:VP[b-=:_2̬0 sIXhLJTs&T[µF6k&{L&QHln4./?#DIh} $ees-+f؎Z ^n9pqw͂eQʾSfg6Tjdgiݢ8҄9:ͼztirOn@ {ŲİM(jlyh-*)݋7Ƴl]]t|ߛ !26nHʅ,@u[z tK1co+%W-?L`"P浪"XX9  țMӒBn>&îU'gڛtb@'O(` jd.kFg=BP-7 p[3g#rZ0{^R4=6okN Ǘރvu+w؀ SeeU]3<&phf *<żD!#Ax5 5`=mw\ur" )\dk445C~kq[µ9raC;d1h̟ͪ^9' jA|5SFtԒg+!X7)x{ДXUeY}BFDAG:==6*wh9bye xp[K2ICA8?PFvOM RcҖ+!y棁aYV,]uZɎuR" %m3I&``b{wd+-_BmHA=v#'_ߟ$yϽ2̡" G_\5Ek誟I]"򛖪Of9,DeƟTavQYnBQۿG)(M8|.QA}'DUo 6qx6[>I FާN]@jMZf,4>l2Bc1a|c).~~vF[)&ƚm[@>u2[>aCYJԩ!mz(NҢ]&HH3J?z`^%.'W ao^U FX&2?/,LT h*2/$uTvs$RϠ\xo*uYoAAı"B+򨎠}WpW<ޜ "Kv9( bC^$u18_l`ge#!p?)d fU\ h#mUtV7ȴӘGYmѻϲc 9\!VPt +!/4`/Ȫ]Z$Ce'|?1A'H=GO^wK;a! K9Hri̿1G\hȁro!Unh*qyєh~'Mjw}CPxI܌t}F>NF{ 6 oO4 Y#D#6 7":N̍{?.3Z;D5!hgX*We+ˤO3׷6ԾK<$"ry}^!g]ϰ=6om/w_ȩ˱z?$wr+{2@:slZX Tg&k.` |AV:-f_!EHEGn)ۥÃmx\:|0D!5\~|>,Qgp?*mj_((gq:;BY~n9:JJt5j·95'Kdɺ0VX˽ RE s;odW(CCMh8 F-Ift;l6hE( b?N, +ߡE)@vM{oj)g%Eu0c7[B$+#4F$Q3U>Y 0Yp臀MmF/ *y@[=A&wNf}#EqՒXLnTo|gZMhP .絖rv/-f$O &pf!|[eqԴA<1]dc-tlG*EIj^(,=fFz2=l%!1Fiz~~n)0QQ 3N}qW[O $"B!ҽ^[Zi"]MzO8shg&F*]wڏ]ˬrgV ‹r>nwLyv["%:Q{00nTf/=QHrVZal)SjxF j؎]eM??O>&}RM0nfX`.T[K+f7-*1bl^ I|.DJVߝUilF"tF?7k>Y;+D"ء𧺠c;ޝ erQ{Zdt;rGT-aq{ěm˄:#FXnd-"q-%/V7()fPVbY{P'gB64r69 Hry\4 **NeWeRr䶜BIcH+2LL Z*IYUyi(g*ZP6r\h`ц="-u"ŬՑk)9 o''c-N6UATt?j :n~ I*ɑ)kbW~o{]- w`0vV=/be>UTUl"EY-^eϙ6gO~su"P% Z]~(@Y{Gr6?֩VGV ֬q s#EC=7k we48~ZF7:Y- luekw21v'=u.`\>2]7SfL .gYf弭Yf1$sY7|x$v(:. M%{waQFpV3?;׬4m]zM.TeΝDXJ]& r&!`eoA)۞:9vxd"Oףqg`ɥd{){$ .b}-RLb`hHP7c{vtЙmiU$ُ'A0gwU#ӷ1IwfcJeP:(DBaM;ϾP:v8 v+juϒu O?$4r@e*h!TL)fZiEC1}jLq[~/b50~|ճ[&Zn*ьX23MH.Q$5FtI͗t- eƽUh<1L:' Ly"5He>{lחAN1N $ :$_&aVubzA21dᘥ2ʦD[P<т㒕!F SskkHnb'q'S,r{FAV3e =#x9voiaiwd ӥunyx*r,hVn>#&y;S$'X#jy.cmtAs*|g-H< =i s[oc7kv/][»O}ᬓri_Y}AA!sB*jj_4%N ^6k0|BGK%woUٛ0SPXvRY'n)KFw_OM^ _i ^ ZiT7o-97^ghmY>Vdn3f10h냇{#x}b .|UR8! @n0ezh4qacE]*n:9Pq>FHlUO8VqA2\fo9sSD+YjPuvK4d/At'w$8 6ɴȲHoc=<)dzBOqd,m5/# l} Gf|&uoy%W/@ni/;әaknT˛ei-yC{x"a}yn 3@x($Y+xJ!EbEjlf ~arܼȼ@x Y= ~5:UXDҎۺe 7{+_~64iQgEŽW;;0UWX۬e4ynyMb}3^[1S\ U~+PE,㟖{RtDn^lĺ(c}FtXy?ʞZѳ+`s&nж [,QbӪpb,~}!be1S9UmT )b(aX`] "Dڋ]c6+>(16gc2%dZe O)R%HKxI~w/)GԴwrc=~0wsT %=ذMu͠zA@K`O@61y6#㾡~n_: ^ ]ZZ;3 ]UV/fPUUKRM) l&}m&pAKHT'i l\-άʲpi6^|aٚms:x0 _2.8_u`~yH#æq8#-jO0 >}vXx]GV:2 3Hrk%b-3ci10pn<_sK2Wmr&+7~_ecݬ'g-Mie!e2vͭe\|IϘ{;lbbZ75 W ῃB&I#s\څ1źqW9'o68{,:ߑ41P+e5^iy9Ӥ4(.~<bwZ,z*0xރEѭ^3zc:K1H -l 4O#B\۷wj$4TJAO74M;,~Ȕ~xXeP_MHt7wY+pc`M&X\'~yyp?)I1>칓[֦/N 7 ذ `*J#$U̪*+/+;1sr4$.Y)o ݾbd8Q@4i2g.# Mr n?j?Cc'#J'7bһ$H [ l5>ۊK`@tkBr֖0"xShK4&M`qŠ,iΟ#LZ|@rBZFg_nuyrzb ب|ߔKR~_:ǹDzwL@ Kff:Frtlgy@T-fv[I]L"AKIh;퓛FHh{n|VYx{iy\\&f Q|H9 eSőA+ҩ[F̝ F7|bCGPZMi6ϥeԳUNVÑx솝9!e*䛞N RiJpqv;av/Z[|+Ӻ#HLdɥIzmsѣkJ.g 6{1 љqV kX`J<~ 'Ia^<f Lb'p*-fXtSD]/ /Cu+"0@m"/xAO犏9cg7VCyތ,[ø,wpwo: y lNN/uxr+l%.H98iJGbx2!0TB&$뒰'5Z&@1ArIH?H"IMKeDtfȽS/BA_uKMҺ9rފ ~4 kn'?Fm c@ /!TwGn&O2idy1>k625!1`3~M(g?\{*/cA wz<.pXz:#T4YN~D\#R'y;,)R8mP EJp`+t\b|Pۂe R;kIP,v`ϷqWōV1P-^{&f(]ƆnD|$*c0}1)#"%1qui6n^pg gtߦP^rP)Yzޖ?/T:(Uk[[_<8bwoyWL]Uf#v8m7"%!zܜC#%V66:e0jZPl>:JRx rSN@JoB.iUьBA:B8o{T.n4/eש4thl*CxJ-tH83iLqziس+eǘ?0Y,xDO4޾uktLme0 oؾ`ݺR:hQ)ۑmr 2v8ք38I1fL+eAVzP9 ۵O~{ v4zU'|`#T8k'T^vkX07Io,:]w} 5zx)A \Sg@AmM:a*"^ͧ}ZL}aӞ(ʢDŽ!if8<ÄdҌ""puR QK|\]f;D"L%jKQayW ?ɆKqo5bh2%z}gv+۱(u^.}d,#<`Aq !lm};|,Y"K)Pu͜WGֈ}T[&DLuA$+4N4ud\/8V y69cOeNmt v?U~JWfH#8bn'j%mχ ZI 63}7g! =Â}tڧ(g~g3r֭G\8ҕg"S(-@8N 6g^Tz"X5Pv`ocP S@FNFX7Zh`kؕ8Tq!U4#"bJ߉|7TΖe Tѓ?Hձ .w[-W𺳼-SD?j.U+ V~f4ٕ:!t>:se zrzG%9ԡܯ'x!y<|+R@ꙔVv(]Ž{\ !LZ+vaeeZ$N TAu8L 5jWjCv# x:y\ܰBr#F6hE%φL9aBhcNP#lNS  ᒏ4어;9lK-;cZׁ0TK( b萚 c )SCڝ{|`gH?T|77 ]ފ-C]|:h0gO>ij'W D'L0Hl\Ȍz5ˇ W$Ǒ"e\t8 )dMk\2J6-CCwWXNM/חi|q 11I3j-cY:mj=3vu8Oboؖm۲Ek#wdNVG; -ue>h,T8O JLjDaX2 . 1n7م$b-qx+ۘ 'B$pk,kynRV8Mvi;#A8ojsꎚe;e@a-|k, p>n1QŠ D}3_i hٱ_MVpjxr,Q{"wUr9`Y%ӄw{}}:9GPluڰSc[hcP] b ehMr T٤:xӧ&R[YL8i #N3 FkrEԾ_sj_v>f")=㸃>{Jh,!s'pR(O[s7V35bqPGITrB؏gsr+oSrRO݇r{ T3WElcx |TJ5(gHiF[l!9y>ԗ~#RKۺ^;Y[y2s4Bd.-:Z,`,p6l+]*s?A[ hXroWȳ7!Ev W ?<"*A7U?K ~>@uˑN'AazRw^eޜ /=QYۋ[QF? 'JxI~ RL2mr h\W&ЉQjǖ.] K!3ٻxͼL}#;rUx~r39E \HLM[H_LFۑv81Å\#7E~7կߨbYRiaŶdž 4=3HaoTdkiJ9f\/˃z t<WL<?~H(DbXrөCR\ 0r9|)bMFrV8C9\}sp!AŠ?u7 aǵ%xuA:kY$ yyb:zzU/ ,1D4kݷp`=,iLҿv7õ*icի<ELJq4^ɦ^YGFJB :6*-GnXa0+cQ0Nɍu`cU-q 2 8dRdݛ>Ry*:< 3G_[Vıs8қQ] k,,3&!O#v4Lp\hSA^7ĒfoRbphPuQ"=&ujyP~1w~F͍T<^j`GI2 8=pH0/h¥l{V`%dughsE]6*rRIDXAk޳#qD՘v8?‡=Nܬk?Xpdnn[0hb 8$gTXN<r,eT^%y'0l4`j ]kxPMh/at|_D+_?ZadMGOpDCˀ5Dd̉+b.y4EpbO74,4Nz+ѱ5~Ʀ-Y#Do^$fq30QL1'wY>/ʺb𷋷0һ4ٴ]!4G` Rfj|t$Aj`(Y7/Frz4eL_$ۋ:ۅi9!ȡH!ļm~Y'kX;t*0:,vIK@j?~Wlڑ+5N'v'jzuKqxf[ #C[K{vj.<&dQGT:xy=_kGqSqӜtIXAČ;e`<>[4KZW]F!8p\U w p׶KFa~Ŗ ~T8 Gy`gN%xN*YnT}fHl&rf jyօgbA!j٤)WHycu3WT@',E[rҕ*,PݭaE(DSdsNX]A¯Jp/V mP;ݮJ`MO׫], *ͭ7ʎ@#f\K  ߏ E815N4 F~BIh:лg4ժxV"r((qimzR<@6ːXh 7ϓt2Ay$v\i]})֚y5bXB.q3v}$+ [-{alҮ#-h xB@.KJ9_SA'~Jێs$yT a=(?oG YzY0Ȑga ĎnOcO!bqT5vYm |2'%(f9Bv 569șZ%ރi}s/HoCIkkDܮJ[QkRxC0}zEAz:Eͽ=3ap"jtb2n9=гouͅiM"vAW`'Y-2d0jkxzY1' ICs ֙bHxm⮚Y^850qd Ҁ `GS8$3S T4EEJ n/ P Vװ[کQ MrY;ή=ԕ C'?2ja Gchv ~zUAnֳ{ *c<$plFNbH(@N9 zD-:o#SdΗ|AYOXK z&&Qk0Qvz*HD VJ-LREk^?q[TqX+\`Zgcն>t~Q"Yw췷%&;OU|ŵ@6GEyĢe]J)1pG[RG]Q-/Pj+訙M79G]$iQ|;]U+(so`7 }E C X(KBok> cQ-Z5pqw}KIdhm uDʕ(Ayk:Щ 5% aq,ϦdEX>Zm-=[r?4v3$V'@%3lNt{!$ <\źL9ח=!$04=oHf:F<Ä՞Ľf!Yg>ފXvQ9x{8[w}W?[%b,^c{`y b<9JVw-Fr oym ',_>,{d7D`E[J.~ cxh+NҹEyIDo9DFahs]SOR|qNF$n%Go YgCl+.iAu:hPR+C1<2ᡊpźε]-Y0zHvӔXșP+0t5UG2{OG{#4g n7<#pF.],lU%Xf́ ] v hpeIq_xIŇ HVY+VET9r;a}mY eLBinK'Pki.ù~K.ܼf ,B;O+kS!7@6-0cS܁:^]##M>"A%mN/`'itwRΤ=cJ 6Z`کQĻEf&l+{GC4AnNpb/`^e*0xS2P:Rj ;p?H]ZPC[uuM-PT{Kk™)*ŽY?PUJҪj y}4tFL+=Zp?rJv_QXŦ\=:Pg[CP)mI)MO[6zL|(+B /7v5iKNJm8FH2ė9iX$&ϚkR>Pj&8 7I,2,a{dg~՛"%.p=gdآ~TVOv 篁<*P/6{oܵ%9sT0tH$qsL7}௧!+m-?ٓ.JZ^W ,`79i  LwUJa&I)dC4 K35w9f gGe~f**X&5^NlMWFɊ˚X|-Փ[+$ @~.! :CB;.>o>[Fw(~EfK1JcQ> GQ.jc=*9;ֆR?@*$8L4w:-}On!LYKۍHaM|:[ўm5e Jj=$(E_#"D>MĤ.V3bQ$V3Rs&hrA ,!} /''P*b.tb*d 7Fֽ609V;*Ufrs<7RM"G=Zѻ9S6v`;{tO8a v4VRC (u.%__bZkZOg f0|![pZ:J@SRلj+PO4JߑT,}0U6>q9k>Nja{(4RՒ~0 ; &4uyVmQJ濴,.чc3Z)q 9LkZdֳכq|*oY1pfwፘo+,;2E}أ"mT1K 0NJU L _M]׵.3p~2Dm^ f,c\.3ʩ u[RD4wb%C(ؒ%ssjB[r >iSP[Ad&j:ɽ%ݎ 8aԘ}6BI%K=D~RB:T1r=FYeMNLQr nvѡm0h X_B:aaB3W5Qd杠4`>qhX eW<:yCV26 HNOU)Ojo֒o gQX Ay~[*Ej=#KF Bo 0EN~E rtj^w;֪ӂcZĄ!8wܸoȱ[3L> )덤;c*ŇlMC9\C^ v_AxGf>ɻ-" ͆b5-񱙿RKg\z!Gˁ+`|Emsڤ9b otXnJ+DDh'(@1`Foɂgo3/3ub-B*dF<0Edy^{|j B#w{0/d/)A2۸)ȑ,ϧ"d(T% 6~EO Ov.&!RYN=q]9e%őOW,sLEBr+G/K!*eR !4`a\Q ɝ,5tI|2f*9=ԙSAlct{E_vLn(ݣ$heytZ>Hd$d5,-peȩ=d)XuPhF|(A!ӭѢ( ] 1OС#閭oٚ#0|46٦8)w->Dzv>f^؃ˍaUVR1G9pZ ,*KwE.y)쬼rNmHX4q_qt$ʯRMK(+ͼ< 0NzQϲ('amU?"Vg^Ad؞cdC{Ou?~TrGQjk2h_SaQOЅfvt_03w'}'%-Jy3( UݭTjT^| JKnK-k=0JK2id.#KJJN ӫxDtD\Z=O?<}(GGNUbڦa7܋HsP/MM Qu=7,Wekz["#hەHpI"@Q;5 صsom*[|" ټRÉP&4S0p+,x]-j/ iW\H$C`7 TdKאsT,A랈|b-tG]B\J{lѫ YIz\{J pֈ4#Jr3Sӛ{=!Q)grfc&yݜ,oCZǚAav?(Yr?bDMVis >)CK@mm`sQ&a)a󹻿L  ;\Xl3!"U亮[h #"9F 1y}irZHT}CL Q:-co1 7X_XAB b~Cdh |+_&)""ۘbλ ]/3@? Skd.j5Uz;0meE<,\To,B^ ? T$F"v]B g4Td^i B/6"\*=&w"~+pE>Tʑ d(8hdIO7蓡d W!=c59qo7>BDg'W M%J6I7uHi,?”@Aui:,GE93Z8^;hE~\I$FlPJ1`jX}̝`5<1ˬsjPdZbӸK*b{'^ R9WĺvDH٤k'ZռI%G1|Fr,%5KܰI1las,+lXb"6Z,(Bi .1#ɧ{3(8B΢e" O`34($(׶6HCizsjȃՑe%T4Me,mtSY`[? 3"~p?S婶]4+el?`Od ǿ˖[l6Oj{):$N߃Џ ituI (ز/ٛ3ThGSQ=j2\v'x6wX=: htôv/Zu i^ -@hysʛrį C*)<^v`a-eu5ML}5Q &07bfӸ =iBQ᫚HE\keƄ%;siCnj -9 )~ӟ.ך*>e0#ٙ 5S=5GMr2vǎV^?6 @)K!`}s÷B L PMY=+ӽ%*(Tw-UgKL!pYPo8$BwC{fxr:O&]@Jq%7}H"豗X&X`vt)̐=\{"\d"e@A;:dY\GD.Y:cX%+'\qg (iHloFPOO UghN9c|TFfkfd(sry x+D jb6ƱHZ~ ^fKI[p#|u,yyH;>#crǾõo SqPSZBL0 I2WT՞@ރT6A\%JV#W=^yoz_Go6 DzzuXYz9O^>+$Ϟïyr~`gDrA"h YWWnG U.0iFWY %1 X$K_f{SJ͛w+1lmZPj!DV' k`^E`_J-#{`#)A' .tۈw}ͥ1] X? k8mYD-G{[I"=(UN:UpEm tp %Qo? ͚N"9=RT43]F 9N.*.G:ti4! ԠevftӘ`:Mt˲=blA/!p5|d6nmQ2h0v6~b>e#Xh <}TLG*7v[e  uN#{Oc1?C]]m E n>Qbzkv fX'2˽1n*1N6ӭCV &ڥTVT]7}O-F}ytO:, ݗQ7nω֤9实ccɝID4_AL´IhM~m&ކb|fB-Qb}saS5M|Y';do2]_B~|9™Z࿛:@"]\^o?֋<>1^;30{ŸUMOZ&9XKuA-b+ p#ɂΛwb Q_7! 1J$^D^Rw40M"Qϯ&#n8t*@K!l)֋k'.fɽHg(f2@l,*k` X֚QfJNׇQe.]ּoT/k{ W eѺ'sf'gi{y8g>,Kjc\旁J[,1gVy#K|@ǖ^Mj깒 K^38@6'(&lxA͈ /&,݌zzQYfk/.AIMD0sxE ꟪cvՈ쪼cC#ff3DtJ?6b@QGb$ 1gez:kQ6 +EK>h4Fa13@VGOGy3"3!0ЛHQ;O DKܟs8*M\==y(g:{J\4=cݤVS_P T"^n%OL߯Dql0S7@}iA (3흋 *Ƚ%&d06cy5IRkhJW+`X_M{1s7x;Sp=%/4 ,r6Hsxwa6kV[dڰڪX?ba}%-|61&M|o#tHp=dZADy2C a 2xXKӶ(th=zZvS eDxݢ3ۂt,7hm)GqK&!/|;BXLFg)Qv`zo xߣȎk2]^ۗ~@>`JASLQ3u礱X+`Yqh0 ꦲ7 N`6X$4 iRY`b!}9/2 @[Vj)Hh=25 _Zϔ.+P( ?W,a&'7>TJYj"ma"WӾsG]EC9 V0U ɏ=UX0KCtw^aQvf:rter5o0Mq Œ^K;?Aް&?ɌY,Xww|]m.%_a# G/ؒrLseNm_ΝIP?xAnsu vղ>roo] hkP ͇q00D ^o>cͪ3܏L1BD.DT}M[K3VZ 8FuO vz@VkvrͶL(&L:9 -F+d~ʔNIͫD*r߈8VJ=QM|顄W&d?6 4 !<$x`IaFMd~#0Y#CT dAf&-:k&I9g aE 6K,hO/0n=%FXnrŦއz V凭=*j->ɔaMLM>cN.+|C,Mfi.>ЧHX&H% 6Z1c2G py3e~uY-yF]U̳~40&(BZRr@.FI=,!+ 1a% WnSru7u//Ln31nR}D~?_~sqD_CuiDG*#Uk#nc7qaY.D? ;"3lԠ=sA3=s[t/r (_Ӈn 9Exj,6p KgDSv9vMV)h Rtix*g$G|yj8OJ` <> YC tLjONh<)JK ;Q ͲbkD"SЩ̣IpQє%oYꂃSSPk=R= t3<TP~d5;c]>şJ 2b;c>ƞ7/& , MWԷEXoA0TP0YrW4b(X!-$g hmdeՃ0Ϝ.yf׊zlIGkDe!^ՒybeӾ#L(YC/H[c"Es)>χ &"\]ymSU_<_fW9Ed0EhP]Cǃ)%w*ƀsGg9Wwt7/qU 9eh@Y L!ViA`8ceQc[ЛG LZόLM^7ob_IX]:ȋL)τaJlO^m~c{Kq(PhQ O|9S?@[7H\8dkzsn::u@2[ܼ;& zb-'jAiwv;cm6LCܝLͅ[WsRͮW6pӲw꿵ӻ írF2j&m\eZۯX$46N7O^"MnAS9ĘXW as1: DvʴDR>/; 1H2(8 *xtS~; *+l.ˤ6}q%K V"ՕLNjfkX}*;t A B8:BPqO,/h ԰W^0;/Ҿp{?9wKW-wbԒ pZf CRw"oQ i&-tnG=`o' ^zS@k%з> nXu]}zk!8]/;(`Zs7;IfyB&]FM>ZopnO I)%ZZk xmgjY;]=JR){ t o3F{8R_eZB]V/WkFgӸo:,݉puJP:?n8Zh G[S}6vJ wOJɍWHUn=Ak>K~.jf;V޴ߢ-97RbXϻTvVwfxarvzEqxpy~#I~{h63|72RcA؝.̿soWb>YRȑ\$ :yB9 h>n*˷wl´H"2/3m%*k5[2sW ށxHt+/^oNvap5ޕ$vO#Xx:WɜMْ&[>̚2:^U<wB,=-ı#7r= USV>Pf,!SO]q\Üg{a3:ޥF`я67yp@u2yuW&]A6K<҂Z5Jog*n0 [ܬhKXGaMԢj'}ƻ)b*B>ylѢ]Ń 9d}3X$m2W#Srz6o²$tHes~;x@YHMAJ^ ByHnÃ!ΔsHLޱE' !cm8Zܣ )zHsl7eYNBEn mUզ%Rf; Ԉb89TcK;T h/s#*ZlYyc4  tI}9y% T1<{6 ;مfT\d*Bz[N2g)G9Fy?ju(C>Vi'Ȇ!ߌQk$-ѕxi/µय़Xt$PتLM"W'kBh u3F[\6~8Ɠ)шFM@ܩlʼ~mEt<6ԯ[;VNP{?S7bkS=dDN\su,:i_mk]b_ML2SNgﴹ>ˣ7WOV;8yf.+,Q]웎3f[AԈ9Dѵ"R΃MEj9.+TLۋ6*Fe%eK˓"pemE\=+FW6F՝ g'V Shh/ d:z/=<j :049\ҊP-?H5oH|~z4LHR7 %I'SH@8Ci rLy H>ߩ tNOxtd~>=OLuǽq| >qj-Hsܿ엘7vRi%œ 18qg؁ke<񱟅Dvs嵒2²\g4t0 IU [׈s~Hיwk'gTp:Sw0"%|xr71f LcjeKn:OFE.LLಥxڅqF|ޢ۹k7C\gb{s!Ws7󙖾xJחV&iZ0C$v\̻ (_pB*6#hvÑ r _f%'Y*y" ؄}uMVV%m+iIUS8G<&Pٜy^_.0u5M>O.ü<;7'<DŽC"4TK5;q.P/`nM6sȽg^wq/`SAqWP\6GiKN -=\#pǰ. rX})8踢$;~5dS(T$rٯͣ#_ju~RS WuF@IO+8P Njt ^?:YC9D+ ҸE>guQ|D2k- ˦Co4f,#QŋSw2YMS/kΥQLGkL#u74#%!Q +y\ˆ0-偛eK/T.{r[EA-IףTΛ[MRl^x|cJ5l< fF {zţIZY347;voY( S8z!si'V0jd &J\LHT^2 rMUJOQ|l&G|_]*I͘8X??t δ v7}AV['ut*,`,e-8e?E,+I41IO=`݅#\,g v[B^8dCOAdX7I-7w~ufϪV`YZt։ذzVhATt98<# h=~oS;>+ (D)6в{LV%A[JFtMgw~6$JT),Ҿu;?!]!oVnN6֢D}gH pl1r;@w}BYJ_۷CF9, 88C_P[kP0sDy"?*:6Fe*IbWT෹ހ^g =b(oi5o݉$I>\)`Ԝ4vcꚡf F=?)N>vDvCףW*@X%>HII4pY%"qKbK2zR_$Ev ɘ6vȗJ`*7k_v[4A s;Tʄ_ ;`߼!mRG:0n&VpK6U7cqXmU>X*AFyѽUbaxYVb>C-,((jEkE"gVpq2ɒHkؗ"G$ԃ\3wwTad`(jž+Z$XkSO)xs['J.aȐ5lhZg,"#}kp?s3\MEzz G"E!+}965;e/}PxϦ"2"_ W3LOy,:j5`[JipW G NXT]y/ 7P$O|bOc4XF9@ 0gLXWpH*M C/qGe;bxwYłuz_My%[ezyi͂1;UBwE1rq=נ3|AcŒb^D=L^64?kXu8Vx OTz|Y DR1}~\s>r^(|,$|gCL^ǹnytYcaLMbLwZx'Q6?L;g{T2|3h+X<ax%?}7Cb`k.EpXL%K׿?Pf؅e$|p:FfYtDЗ#pa]4jo cLmR9x4W^ҧj)O[/ 9w"(Ho(yz MIh098ҥi+"xnr0zжI!y6$ vcE)Fb!Jg9 ^xӉBLt5ʲc֙] w{xMXLFpwۓD*Rz9A; U2t ?ZKϼAFxL'V?”ڸ1d29Q d;5?!UIr-ؐ2;*3HI[1Sbcu Y^D._ϊл᠗`=s슂71JBѦ+"ᷣϩ@[h5(@HE"(6Q6 S#ǰ(޻DST 0왱/HMCzC:&┾q;p*qHV"oDkBja~)xJZRg`] h@n{HCg&$-BJ|K_XAk֎zZ3"}<2/>y! c?gP9oO ^,d|/ Kb^JN$2X@t`3\7CRN@ZAWpY d& ^pxM#ZV1}xLhiX%+"ՠh"u݈[zq-skO^@K. ^P󥳆E06<#χsiOy=p a-3#tsaʫ mG Ƴ*9nS0o1nq]e#l姂$L4(1Ţ\2yC?ᝌnD+3qAFPVȖGƻ•8'7+_2&H7M%biv`cZ=^QNw]+>}0iѷޖ$lLo̺{_zV) < ءa{%pmv7d/^b H. 7;ފ?")9VZ{nΩ\UL=caRbTgPSd3^'HL[9^*v: oL^4 wa Ag)W6/,F+Uaqn-"3ιI,a*5Ӿ>cxA7<6Bl2ʼsn0ܜ%vYlP􇿖t1{dǒ'F/0ήČlN[-ju!hX~ 2x : w vv=rWuLsXo]ҳjK% H%s2Fgixiϔ&*[}XC 1сcffb ʔjXv]%ݰCShsVp@Z| ܋C4C D 31GK^k%ؠ;XF'܃',, )-q 2./t3{ᖪF8q|&o!یi2C*u"#EğN 2=fr׵tg;5[H߉|hS(t2u;f!E[qr;u[oipxiY2S@ARퟏ8Z6ectߛU4BgnNay22#]X3li%TU|o%_›=ƍ\hB`1N-PcW ֒ܵJ_]1G e42m'E7DH0d݃aCKwgG\;nS̢a:FR"Cg9rtP G'm7-n1[Zf&a(T0K Pa> k_~볮 r `{ O`tF|=$0P} ̾wJnt0.?4rTSCܬzZ[Xm[m끽aWkQX"x {(FI2F!@R~rX ~8Q(@h%J?GczR6,$nή|HOm#I?w3ˣ'*NF.1C7i]f4s4[bm[sr6qw$ەiLuoΙԂp]1Lodw9lV dp]/1̎SYqg9;5d<4H/A`eBypy~s 8Ԧt~s/S9[+6s, J\}u>юըXN_k/&n;zPijS'QHJle,0?6i1ζW>ε="=U::8޷WQ AYO !nwͧe^B2!$kZ墑Q^#g߆|r}+ ԚR">rixDLf܊-`bT-(yMSwFd?azUX.tdH֟*pƐiaZ9;DR2%Lv&80bR%$Hl'o{*GXP}(Iœ㣒g;bSr$=߉($dA>3NKQM"FN$9 =l c):'ǒ)-VIBw| sd:""hzAnO˳ȁ+FDFl~H#e/|=}BkQHa7տqiV>&uZbdXb!r )KʦVF Ogf I߰"R@2r 5#f5o5RB0/ͥ_Kq=>q pTl@qxUo*Jvn*#Wd g\4dV3w޷ +{}Ҙv1fe?"?\VFAVZ{^qꖨnZTň y^,5N7H2(`{٠ !W,fk-?ij׃OUrif',,N0QGwU5A_EיhTz܍@H5XxvuRYJꪾy 7B%qh 筙t9:b&y6h1.DeZ"OpBBiZT-f5L}2jBiY?dD%fuAuD] 8yd8Yp}}±lmF bsr#N{]nB2^pU2P9WEe&EpxoLBCYIW qug&H^({ʽkl5L\@Js?bwMJ 0yC{3j%++3 \>j~+Gvq⼄p-Rj