summaryrefslogtreecommitdiff
path: root/arch/alpha/kernel/err_common.c
blob: 13d53b1c9657f7ceaa855d99ad6cd31f7753bab0 (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
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
/*
 *	linux/arch/alpha/kernel/err_common.c
 *
 *	Copyright (C) 2000 Jeff Wiedemeier (Compaq Computer Corporation)
 *
 *	Error handling code supporting Alpha systems
 */

#include <linux/init.h>
#include <linux/sched.h>

#include <asm/io.h>
#include <asm/hwrpb.h>
#include <asm/smp.h>
#include <asm/err_common.h>

#include "err_impl.h"
#include "proto.h"

/*
 * err_print_prefix -- error handling print routines should prefix
 * all prints with this
 */
char *err_print_prefix = KERN_NOTICE;


/*
 * Generic
 */
void
mchk_dump_mem(void *data, size_t length, char **annotation)
{
	unsigned long *ldata = data;
	size_t i;
	
	for (i = 0; (i * sizeof(*ldata)) < length; i++) {
		if (annotation && !annotation[i]) 
			annotation = NULL;
		printk("%s    %08x: %016lx    %s\n",
		       err_print_prefix,
		       (unsigned)(i * sizeof(*ldata)), ldata[i],
		       annotation ? annotation[i] : "");
	}
}

void
mchk_dump_logout_frame(struct el_common *mchk_header)
{
	printk("%s  -- Frame Header --\n"
	         "    Frame Size:   %d (0x%x) bytes\n"
	         "    Flags:        %s%s\n"
	         "    MCHK Code:    0x%x\n"
	         "    Frame Rev:    %d\n"
	         "    Proc Offset:  0x%08x\n"
	         "    Sys Offset:   0x%08x\n"
  	         "  -- Processor Region --\n",
	       err_print_prefix, 
	       mchk_header->size, mchk_header->size,
	       mchk_header->retry ? "RETRY " : "", 
  	         mchk_header->err2 ? "SECOND_ERR " : "",
	       mchk_header->code,
	       mchk_header->frame_rev,
	       mchk_header->proc_offset,
	       mchk_header->sys_offset);

	mchk_dump_mem((void *)
		      ((unsigned long)mchk_header + mchk_header->proc_offset),
		      mchk_header->sys_offset - mchk_header->proc_offset,
		      NULL);
	
	printk("%s  -- System Region --\n", err_print_prefix);
	mchk_dump_mem((void *)
		      ((unsigned long)mchk_header + mchk_header->sys_offset),
		      mchk_header->size - mchk_header->sys_offset,
		      NULL);
	printk("%s  -- End of Frame --\n", err_print_prefix);
}


/*
 * Console Data Log
 */
/* Data */
static struct el_subpacket_handler *subpacket_handler_list = NULL;
static struct el_subpacket_annotation *subpacket_annotation_list = NULL;

static struct el_subpacket *
el_process_header_subpacket(struct el_subpacket *header)
{
	union el_timestamp timestamp;
	char *name = "UNKNOWN EVENT";
	int packet_count = 0;
	int length = 0;

	if (header->class != EL_CLASS__HEADER) {
		printk("%s** Unexpected header CLASS %d TYPE %d, aborting\n",
		       err_print_prefix,
		       header->class, header->type);
		return NULL;
	}

	switch(header->type) {
	case EL_TYPE__HEADER__SYSTEM_ERROR_FRAME:
		name = "SYSTEM ERROR";
		length = header->by_type.sys_err.frame_length;
		packet_count = 
			header->by_type.sys_err.frame_packet_count;
		timestamp.as_int = 0;
		break;
	case EL_TYPE__HEADER__SYSTEM_EVENT_FRAME:
		name = "SYSTEM EVENT";
		length = header->by_type.sys_event.frame_length;
		packet_count = 
			header->by_type.sys_event.frame_packet_count;
		timestamp = header->by_type.sys_event.timestamp;
		break;
	case EL_TYPE__HEADER__HALT_FRAME:
		name = "ERROR HALT";
		length = header->by_type.err_halt.frame_length;
		packet_count = 
			header->by_type.err_halt.frame_packet_count;
		timestamp = header->by_type.err_halt.timestamp;
		break;
	case EL_TYPE__HEADER__LOGOUT_FRAME:
		name = "LOGOUT FRAME";
		length = header->by_type.logout_header.frame_length;
		packet_count = 1;
		timestamp.as_int = 0;
		break;
	default: /* Unknown */
		printk("%s** Unknown header - CLASS %d TYPE %d, aborting\n",
		       err_print_prefix,
		       header->class, header->type);
		return NULL;		
	}

	printk("%s*** %s:\n"
	         "  CLASS %d, TYPE %d\n", 
	       err_print_prefix,
	       name,
	       header->class, header->type);
	el_print_timestamp(&timestamp);
	
	/*
	 * Process the subpackets
	 */
	el_process_subpackets(header, packet_count);

	/* return the next header */
	header = (struct el_subpacket *)
		((unsigned long)header + header->length + length);
	return header;
}

static struct el_subpacket *
el_process_subpacket_reg(struct el_subpacket *header)
{
	struct el_subpacket *next = NULL;
	struct el_subpacket_handler *h = subpacket_handler_list;

	for (; h && h->class != header->class; h = h->next);
	if (h) next = h->handler(header);

	return next;
}

void
el_print_timestamp(union el_timestamp *timestamp)
{
	if (timestamp->as_int)
		printk("%s  TIMESTAMP: %d/%d/%02d %d:%02d:%0d\n", 
		       err_print_prefix,
		       timestamp->b.month, timestamp->b.day,
		       timestamp->b.year, timestamp->b.hour,
		       timestamp->b.minute, timestamp->b.second);
}

void
el_process_subpackets(struct el_subpacket *header, int packet_count)
{
	struct el_subpacket *subpacket;
	int i;

	subpacket = (struct el_subpacket *)
		((unsigned long)header + header->length);

	for (i = 0; subpacket && i < packet_count; i++) {
		printk("%sPROCESSING SUBPACKET %d\n", err_print_prefix, i);
		subpacket = el_process_subpacket(subpacket);
	}
}

struct el_subpacket *
el_process_subpacket(struct el_subpacket *header)
{
	struct el_subpacket *next = NULL;

	switch(header->class) {
	case EL_CLASS__TERMINATION:
		/* Termination packet, there are no more */
		break;
	case EL_CLASS__HEADER: 
		next = el_process_header_subpacket(header);
		break;
	default:
		if (NULL == (next = el_process_subpacket_reg(header))) {
			printk("%s** Unexpected header CLASS %d TYPE %d"
			       " -- aborting.\n",
			       err_print_prefix,
			       header->class, header->type);
		}
		break;
	}

	return next;
}

void 
el_annotate_subpacket(struct el_subpacket *header)
{
	struct el_subpacket_annotation *a;
	char **annotation = NULL;

	for (a = subpacket_annotation_list; a; a = a->next) {
		if (a->class == header->class &&
		    a->type == header->type &&
		    a->revision == header->revision) {
			/*
			 * We found the annotation
			 */
			annotation = a->annotation;
			printk("%s  %s\n", err_print_prefix, a->description);
			break;
		}
	}

	mchk_dump_mem(header, header->length, annotation);
}

static void __init
cdl_process_console_data_log(int cpu, struct percpu_struct *pcpu)
{
	struct el_subpacket *header = (struct el_subpacket *)
		(IDENT_ADDR | pcpu->console_data_log_pa);
	int err;

	printk("%s******* CONSOLE DATA LOG FOR CPU %d. *******\n"
	         "*** Error(s) were logged on a previous boot\n",
	       err_print_prefix, cpu);
	
	for (err = 0; header && (header->class != EL_CLASS__TERMINATION); err++)
		header = el_process_subpacket(header);

	/* let the console know it's ok to clear the error(s) at restart */
	pcpu->console_data_log_pa = 0;

	printk("%s*** %d total error(s) logged\n"
	         "**** END OF CONSOLE DATA LOG FOR CPU %d ****\n", 
	       err_print_prefix, err, cpu);
}

void __init
cdl_check_console_data_log(void)
{
	struct percpu_struct *pcpu;
	unsigned long cpu;

	for (cpu = 0; cpu < hwrpb->nr_processors; cpu++) {
		pcpu = (struct percpu_struct *)
			((unsigned long)hwrpb + hwrpb->processor_offset 
			 + cpu * hwrpb->processor_size);
		if (pcpu->console_data_log_pa)
			cdl_process_console_data_log(cpu, pcpu);
	}

}

int __init
cdl_register_subpacket_annotation(struct el_subpacket_annotation *new)
{
	struct el_subpacket_annotation *a = subpacket_annotation_list;

	if (a == NULL) subpacket_annotation_list = new;
	else {
		for (; a->next != NULL; a = a->next) {
			if ((a->class == new->class && a->type == new->type) ||
			    a == new) {
				printk("Attempted to re-register "
				       "subpacket annotation\n");
				return -EINVAL;
			}
		}
		a->next = new;
	}
	new->next = NULL;

	return 0;
}

int __init
cdl_register_subpacket_handler(struct el_subpacket_handler *new)
{
	struct el_subpacket_handler *h = subpacket_handler_list;

	if (h == NULL) subpacket_handler_list = new;
	else {
		for (; h->next != NULL; h = h->next) {
			if (h->class == new->class || h == new) {
				printk("Attempted to re-register "
				       "subpacket handler\n");
				return -EINVAL;
			}
		}
		h->next = new;
	}
	new->next = NULL;

	return 0;
}

.3BUo`MA+e|#|K*dhD+-Ms)t]ʡAP#&/0֎:T 4[B>lCybo8Y} & Uh&TY~iLy(sV(NȎ9>B7|I%}`7#S(Ga` Z!Lw6#]u%jhݖMQV$ J1 zc Vyح ʪVV&s5i`i!2CP7l~O4_VQ8%C%i\#puD+skvOTz.oDovsٌo> F+%0s(/ꉛ p紓/+ٿ2r1ت,:iD7RY60t'@`mH9\MpOC~IP/s-m0"^k;tf;R@tz_ۓ1Y '&`,kmў5b ~'GH9CzvYek6 \H9$S5:y(dBs٘9#zh(7kJ'4 >0tjIoktg cCD*S8Mn rJyaĖK<>yԖ n_h}n5'( p<2K1PG2 xVα^ʩ3zN@z "%x.bW*_&}2E6U: (KwԠ&NGIT RI4%lKp0jK(ryR{${}\1z;:i CL)lSd!J|bG*AH=io1]bImB]iʼm͠bb]߀X'7mz^ǫPsáOKԾrf'ga=ˬ#:0I^C8V&&Ln9Gc[4g^tr!pi_[WP_ԍ <̽:!]Up11 Ԧ( 4Tm;,̱_UI֧:| mU@m_pc[?vdXF՜d:16d|Z:!IL>cÞВH|ߑCd"[pR#o߾8~<ؖ^J<4Qwh%{IQ3ĨW u5M{6_YWkyc96'K:k7D1+檓)!N Jݕ{gmL}LC&BMn{id؛{r8јPh3ߤ''2륾v{CR+MUhG.:' ԪU}ɉ-[v5<\`o\՜k1&A'WSyi2>p3'Vg53Rޖ\SzA˳{Y-uep`[p=5bA+p`HUӟs/6h#J$HйG\К2%KUp}R"pUʚ9"}x|` 6N Q[} TmqЩj2FCժU2JFlTu2]EمfDg4E[2s%]gL#VUNN5^)'R2L3BUj?`F6ۅYK/&&d?Vs?HmRoW943hϚU ת)(o+!=!C{Gg摞nD Y@JƊtg6,t& ωUȔyV " D1^tnˮ7_:; zbZ:4F9!È Сr[μgVRuNL_ֽxς֕I3ytt(cXP.USY 6:\*U` xxR:2]"թb¾r\fhlSuʡP>`dSfy"4c|g>n}fMdNpbTh6ԯ\ TLǛ񧳛s<7uzf;)[_ J9_SNI }-}\h xWArp2\dAfhJ6ϯ̬+J%a"Pm=>bFAؙcNGY<.PO*pUW@x{IĂ!+׹w@]7VhTzI!UN"'šCQfhHyPR俈-F}gr6Q&v^Ll?K|>0E.& Lt s-V*4 TI@t K^["Bz^ץ>8򾵶 I\ۨT~h;$)tR4K4gMO:ӿ5)cVSkKQY__604 *d/ʝ,hjL +.p/v e|k #~J(&mx0N| :rR>fo\Xfۄ܁\B,4x0e-RP'QE9@PVėrMs- -\+ڃh<(7Tm_wJNAMXK=?Bm KY ,Ɨau; H@Ȁ.=4GHTY9s"F,OvX6zDzsB0UNiKgS.ELFL%To3n}nBV;8|uѻ@ؿ f v ׶([TRN^UTo?rخR*uУJjRԳ~m;ܫrRR>WARSzS#m[i\{l/c:j|utLCCL'@ᢔhNq禤Xj 1T{J.nE,HjERhҬJk5@ ]bσ=HA aM9z;gEUp3?bgUOun] hcp( Krc=@$&+IF+m RƱߵ7w=욵#8މYgKUѨW5z {X+ESP&Hm1ZJUܕl>w4cTH&0Y=oJ$B%$cQ\%/k;mKg4+3Mr4u? C= 7Ɖ{\0؞X8='yZ~Cfg2D]XоW0 /gǵIYb rT?A%J{(SMIq_ ,?*KaW+6٬Bl)Ϻ&PeG_7u$$vOu M3Q42q:ֶ]'$d~>[Ȣ8Pi瓤su` Wx?-Yd"ځО%.%bjL>pgQP,zNjA:=$L_Xҋ_g:m~ʥ8 -ZI#c%Cf@ +_^)B Ը~``B)q+"і3+MJOr,VvԏǶs@CKN}:NL,rZa%[$ԛ, O,0º(Ps Y/skzӼҿr]oGz"ݺ|)Kp<:i,˓ 5&{bigLA)So\c̢s^j5[i&x3izI[utWoi@悭j|]5z m( IBFۤSp,_r"ˡR Ǜ 鸮[AҒ#>)8\x LD+XvI",+Scs\;S7]AMTv\]7$.4QlsabWKxD5Ê?BlZ[&5A;P+ 2,RCֈ->f@&l\6Uv~J}/Fi8KӮ@ԜfaԏHV钞λ8HOrƢNnK|Ԇ6:lV)uhyFou(Q23/ /ߜe8f#hQ *W'FKGn/WL[ZBb)c%Hgٙ~_>0K!=&cR˘V{,.vވ|Fm $$+8PKUtdCoFd]O#E֮GzuXpXh5y}$0&Z@[ Kg\{(^,gh3`YF}E7e5˵gBO1nLRVfsc?t͔0ۏ9l;E??ڏxWlpVDCG8u6,iCQ(̬k>DM#4ua(:=z(/K.1~g6|.̢L=UnTrRɓPL9&߄x^[9wR{ uGJ\n1XPDAݥpnk7}@G-ƒSqٿ֧h 0<PNnKJ zqFl H̴ zg{OR<I㼐ȮF"Q\ 1gȅGb}-ȵ/6ACXuEGmzar[Sx,$G7gvȌK2LЙydf8W@IYF)\+l Z$psQ P-IorWL[zu'_1J"ټƗjJw8pX 34]RvlTWI՞tUdǫ-ԚEpZo7m=gW9mu1j鵭W$ҚIM`֘%9fԅK 'wq;ܬ&wf̘0=YP/)J3=}Zl^rX_qFJG z^jaL5.=R%\A%FYժCq%T ~ʯ"IJ #>Eo) 2mw1(G+ WԉAp*&b ΌY]YUr-_kJMkߵV&Iw= S%:أ dBtގނIgK+1hI/.>>gd9:+աR` _Ӎ$Ob<9kɐS0x)f=Hw7ZPZv$ F-ffoW^jNCRF_uq-A\ʝmbBRg}kV'R6$ l<ґ 4`H5OH g U]d͊CR4[HXJR4[^p&"mSI˙5Du, !gox]UΩj!R%9FYGZ S`zFY W+Ҟ&kva5 ,`̨A(wJՁ:I6wHztBS&ܡp˼Yރ$ܦK.-:rGr1-p;4:>m ͚ۙ7 f3ʜ9,!ݷ=Ƚch& ggD^4SNZ|N=,i`Px$lOps[҈,9Gēl, K6T܄Eot(ǵV'K `w 3_ؐ`eF\jvϦ1 @:9T99QmJ zAV#Ev҅a!+֚hH*[X; qwޞ?u;wu=&+"Wfd4eXhYpsV;2Lh)DH^^^m! iLk'*%BKaˡBN>L\SGȨXT SZ$q"9/`Ls)׶K6+IMQŜ8ky?8. ͖:5W|4YN*rj4_|^Y2Dubz“=1>Q7Pg+<|n4<|I/A}Щ |#M+uw-`-@q guhm7(6N${wşF=u<ɩ~olGNfcІ$¹YV9E3ϝu/_+AO -VH ىL(h+ȉ{#uSi?f[=l4~a$֕p &K'2~}6x"ߡlnc\5<%@j1y.V\ؘWݏb:Ed&#&\IK}@ M/o={G K&&>-ځk5 ]h%Ӿ( YyA6OmVETW HwsId)Niv.8 4;VVQ2.O;Ȓ#=[؜aK*hz*Ð/%k*VIZT+0*pu~\^JȚXxFBC<|,7;2- j=zxj4y Ԋ  YӔ^߉jrD) ~Jc_˕͇Mg 5:_[ِ~es\RSĂ)^u$2Gjɯq3mNfC83]ǦԳ=>_Io4%H3̆AD+|jۏ[CGrh7=Rgl7:w6OD^D*xL2XjHrysИ8)H[Y7 uI\PM]aəj.mqfd$ ˥&~`?w@vmރ#YڙbfnGLj8<0%v>_yZ&-)x}~Fnl=+ݢX RҪ3p]@O5[#b/#YF9cwtCƎ=2mڃw5tg+0s Ca3Qx\#F9]:X=i\WrQKFLHӞmFВ*`Ba1SƣA/WY$raA-(Ղ!}$$= 4jM6bkk,=xɵ䈛TX{=߫;m?Ss8)|vH W]0VVcB@@?5ڌx!>Te1P%խTVg+4 ׾KBܲ|6HݭcP旌 }>VPWdM!||\rC)"EtQXqu`ڂh*,WU:jz)pXcz1Ic { >v`6QY|bRgS/&UI㮎&)nP'wV4w:`:0h+<ĕ-C󆦍5rh URbcK$;-% ף~l`,s[y붻 _(:ɛi5>I{ E0>-թ݄NԆ Z~r=\owQA؈cDv\ixׅpI/AbJ3h5wGf9=IQ}ڢx?&sW=GTݻ1:ﮐ9òoBw_cO]Viۿ{'_p9QFs^^T*ޔs UíPqHg=HU'sT^O}a>_@x8q韟]j`9E$esٿ_EC;XEؤ;"jR#iX3cKzm;핇X{7 ZQͭ3!::m1~mr(@9eFq_hfYߺr-Uo7-KǺnCFSƏG1]uIkH*=e^=8+M$x@JoL8`wʙ3_ A%,ǍƭX j 2m_QO`T G$g?2ĸdp)+$%!fQswGyt6ה'5KN]۠1Gpf=ӓ#ASi^ DQ`(F NPx6+ҀW,tsUbr0IPE:R"i"7_1ԳrR8K|br AHTԄ;8?#)P|z<[{>wq+O FB$ Xs}> |9W+ YObn:ǃ (,h˄ty%|f5>螞oZ)MLoSن&6/t3^l.bCj?#ַXDhjmhba#7X8ebA]>8k1ufY@ psys3cϜ@;p4"E-GC\yL3vf6٫ջ rfY'JdxrHp(~gdl[s/-_PC|v1YDقhӕ!!B/n"f׷V9TSSXrxzfצ@\B lysǘgsT[}G@OJ*k,3u'M Kb=#UP0 'g0cvEBߴ̰]$ȘVd*"wՄ7swpRBDE):90BQHO\7fvmIem` +mM0Gϝ4'78iA!v0a_YGnN%l[ľ: yx^_GLXOKGsj3q;6bZ멵q; m>aڐ1V7ªjC/OHQW IJu< MCZɉ^E u%wlqja{B.X2 v`5( c3ER mR2ΕֿaI¶Tۯ- O9q25)@Yc*Hf)g.\4&e~t\5^p5H}{nECjۚBnҶg07Kݏ$g3/Q=DkNFE$gY\g֥:~.д)Q#ҪPis[}VzsN |o z:~tH LVl{U+J1у %hDC RyP#-gg{J?t[(ᕜF-D֜Vw计/!ԵTx pEiP u),wV~qP?9HSN~3 0x.>wT/ _oӒv$ c, Dj%T"V P S#M` =MVkzվTU]UJ7 yJAZG%2-+)dIѨ֑BZ`РMR"eUKUh:};n.9ӤJ =sBHo~hAs1Ԩ@N6-SR5!nvk5nJWZ|mZd3>i(IA!LVD~I^䘟^`ݞOSE3dghnINbj8j"2HD ]dIo@.Kg|}|B֯Fcӆrσ9``Í;{ D&aK2./XlN҂D@ 31H؋H=AIeL$`]Rpt-#O=MD5?5ǘ`8IVOh," В~x`pÜQ .bJyTO"t퉳{^hB rfl ?UiSYszڬ~oTrz*nIuARncP[גxu7QY9 I/Ӏa/FˁfZ;l䦦SJӥօh7ru-uNWl$åђ̬>G$8p$a6x>r\Hw˕jIzW$[݁TLF9C`RQmQQDLBJ[ G^;gÿNĆSz!I>a`K&o;HYu0K3.Rٜ!f: Gn_a*,بc鹵*1>$Lx"Bc֗?ם~ a@y,HeQlh{(&P.5Xԟ[o rl`^=juvptSzeҹV".AoM@zUZ)ePUMVK=Rz04sRLrd~*U"6 ,e EoqIЁZgɢ@3~eW7gzd<-J mҶIFzeDuCx\g\n/a1l{q8Zr[aMf6 m~nK)Q|RC5vAkn> [4wUVnUF ΆJMΩ^NnZ!K["lM% 6 ,ЊSxg|&SC-ѝAkxW0Oh[곺\Bt$/I h)ڦT]sqb]/`C\]yuoYYvX']f[*W U- Ev/#]`)`>ZHm,yd[)V˵zAm"Ӹ҂rkA/ܠ=#g$_SRw8NCmLfapJ>VaE>qFwn mtc6ɓȧw>}%?<_S`42"XڈBOMPUqH!ݠY /$hϕor^cOPܨ>waE.$(A-OPCޅa: ƅo{U>R_8aj՛?5?k"i+ϟ/={aN3]EJ>\F<P7;6" fq⨘j=HNAc^^Ar`mMxJl4lޯ3) W?!QӟD ulkoĮ[)j{KV.e׬LƏm?:(f.f ITk{ :zEYH ۊ[K|lOF-ʻ{^|z%j9 詄דMѩS [K# $(gGՆQ|K6jhE4IbڇHx/ƇdITp |(^(3uh!7Ss` _-5*ΠA,yޟ. ScMZKȞ L°`%V7r,^C4^%2EڷhRb4BX)z.n2 ZAR;?:KOpv`om ;ot*fVi >F Cg}u Mmx~]WJU%ZYw2B"^*K%QƗؚDUXܘmkf.NOG>L}[dzҤ:ĢY\/5CtQ1ioIV h\7+d?da0xJjE`~ %#jhy1zh˿;VԤW :3lS88*f ӊl.)w k|k'Cέ 1r!21fJD)$WRa  , 7cLx;w8)$zsɳ>%9q ﶡ:C7x &(O.j[:┍ӹK5ȻuszrҰ qia1N%_;& ^#{Ռ}<&~QiZ|yV;~mȓ$120ĚCӪTnfn?#mg<8^i_ޥ1-0G ilsD>]x2uhQlL/mWpn-8uRIV!r|'T;i#׼y5?TrS5KDkJJ u1/7zܕ2&Q~_,hO8ξJBa ܏>6(o.`DyfXeI3 k<1*vyqRpɺMJ帉B/)BavT!+3 |_=߷\4utZBqE8" FIF6~aNoR3#LW渺g\3l2F8Qp4|`] I%',ޕ5itU \Y|_rSӹ(WZDRBLPFJ٠.u- $u426|:si֚҉^h.<0$;):C~樫GC 7㼳^vI5e@1Ab3Ԗ>YEgmgS;}Nu*Y^\٢8谧gOGYH d N[NX:\H03C!~|v%n2Q)1;)3g@M%fj!>Y[ZvZҗZZt;=Q.wHUQz 2 t0z]OLFka NhPqm/沥8فGцFzJ<@U!I0asr'F"TYf2H͆ia $HݙH}%Hfҏi%gL06w՟Ȏ 9Bj9"fPLz绬3swjk[odpI }[̭E{g-=/l/!{sJ-zg ن?Bx vuZj̓F HI!c+ϖS:cGi/y0sC*)fθ  WI;72n=1ü8C-;p'okȵ8/ħ&>8*FV\ G5kA]m~,3B=Eي,,MEw[v@fa&/}ޙ>ѵ47[P}៟,;2'oCB!& `KMto1Iphp̔![s5(.K;նM|~5zSI&\Cօ; |w&BW=Xiܡ*}n&&ߔ}}kLڦ.=I<S'BW,1q`3ET@@~:F9hoc1T+7BD]WojEUN]w>49xlآNLs#CTb+C #Y %, ܍C BbѹPNd&h3TQ֏sZ$TSquREO{'E\~LrZLIGy7_"{AJо5zM{i{Bf7իuzzp<6AzYg6ʵjv UT#]R蛤N?eRYO[,J@Z6bRR0gn-:bN , B&GS3CZiҐi iĞ!ɜ=>_IN=Nk-2qdqA+&hOxBH$4-Ԇ_i)le\o,˳8\RT1 -M23@`@6ROoϩI5T}; 71Ϲ¡IT%d^d'¤M;1-rf ;π'YLm]׵CL7ɽg7VUM]3p҈,'&IdQ tcx3W;{R&S뢒Y" j_gfӂJ[i |;눝CyIKۚ:n z\؏a~/KTIOhn,_][P,m;W)r:Gz]na9i> lgR%UiѴ Q@Nk:)UJjg +:Wۂ*o~m1b!_ &w6\[Άd3Aov=Ӌ^~G@*+*2ǡ~;\ ,<1J^($g֠QOM,6Z uXbm.S80MŊ+#ڤlZWrjI}~@䚐&ǎ.,T7 NsB-ZS6r҃m\g\orCQ6}md!N˄ 3M6MC٤ d.}<3dأPv|HTvX̡7d\8sd6 U pD; rrhRYzEѿR,x6_uTSO\?ESS~QsҨRG}{sh? Ǽ@2԰U+כ^e6}B ;)uhz=J]J dO9A5$-9هpaśYB3t;M}Esx5"OgCRլ'yޮӯ^;ߗ Nd9"p_\(ekEQW=tS-켷|,8)r@|`4MJtg&> `ԩ4*W@/ a>=^, gm[Dj7A9AۙWA;YhVZ2.c8Eh_;++SI)>"Gx+dL"pfimQႠ Λ">U+U* }3WkI4/ڕ{7Ww/OzKcjӃ7 nJ+UiD@.‡IEV'3 Ư@1k36;|Оh7s^@˅oa[i~O2ؒ Ͳ6]4h(I4o:FF[ #CQK"EAc)@|NωwFs:uXDz N-oA4eïnh=`$l- q#˙v`mcZ(xh,  )K-(P݁0cM;j*Emo皐c-ӎl^qL\=u`0`ɽM̆M >h굚d`m*$UX[Oc N~%=[}i(s=6Exho5&uu'.~l(zΨ@5U aN^ BP[jqX 0',I|_U}vI]>WY¸ h!<9z͒v n :JSkDh _> aBbsq=!o-tխ ;2؛%һ"<@'$B_Z -}6D)XK4,Ά_ɼL)g$9o n6'KNls9^@>w =C;$MFLFj̹Ab#w[sJNR?4ҶiӌfpHRJgW*T3ZRʾŃҨ A3ocou=n4.v?,`.kH Uiq鸸U_oSL|Oq}ߊ6.MYyѧɉ;vMtБ6z`SLO }_ˊ%Bf`rx9钁L 0#Z#%N#n" N3Etеž}#a p{NHe8`ߤ5yn~޿H !|r6\<)$Y0bi}@J*Sے~؁ uiO`}x?]^^Mj[j.- Q=p$OVS|lY1Tcf& E5Oj\Dnc(Õqu_::-h &}0\-\OF '#ZmR=?32&GE nӞ82' R{sT X'!pqV蓮2RʬBmJ Kӝi< ]#q,t1 ;{5Cͤ:Vs}Bs].R>='qZ||cwՖ,s%)dj"lI`]Xp[,6Sd0,;xNqy[ Q~;'Ō/f̽"S9(NAA?nAIU[,짻- 5 V|uf)4^ힾ?Ie+#mg^>h ;cCf] caT.?# \U) jf|H]~ D 8l x?Ҋ j]6pxO `6nP޺#D*Wfwʭbڒ SyɧwsF$jSgGodkG+X ^v:,'KLS _۳Upi"sJLeglLCK%mۇG^s5e2~uU7&s(&Y ey?5u/2Ȟʧ'VpKpЂޚڸ$L2djoBsBқ51aXͮ LyW6{㖏fr{:V${Ria!a1zAHH}Fv 3ԭTjṳ̏,4zOlyPy6y82ˊi"Tc5xoGgq94FrG{r\ FO؜h-jHLȠQg0"(Z16#.TλnDpoSC`i;JaKBe*H~=Xn S2Ȁ5)swg͉9\V>ݓ\(ZysM2^}}lV^~̐tTeq;vְE[^2arqChC:wq*'gZd"#GH KODl<6 39'fH .(nGcsO O.nVo^BG,z;Xʁ0F?J*NN:L:["'@fp gհB*à! {+ڝ0I8҆K`\$"JTQ-gqL?Y/_%3gzB\N!0ʰ )f?DǙMwũ p>FoЦdutX7U=ۧLjV+n]Esei-?: bmϠnxmbJzUޔʥ:\B%0Oв.a \*+*]IW~i$k(Ʉl%w~  a]Ho:? V B*9Zk&r|C} jn' E{R/'iza ;qHY؏0͒j׺SBkAԑfYkI׎mvEI 53EJ4>C]e|ȎZUݧ6 |)uʹ4,>S7f/x4Լ2o@=\8Llr9Szd\$22t6UXxF.?Gѧ6{cb"x{89Pʚv\1y2/'.'FqVDU)pprzP0[Ӌ(L!3CI0wg&W&37膜 3A{7rF9_To$T@A{$sxA݂V. ͼ95 I UzTE0/yPg;w~VFi~h S{R9#9U\/ƪZ'W {T=/ͣ(ճ50mJ6g@(19S\ntq`NPF[gHG$ _?TYuu qϗ[ѯz>O={YݘJ&Bp9if礧j.j[k$:t1ݤ+*^aIYQg(Q,j°00F\Uu4;rפo.Xd@m!uBySƬk?6$Mt+}bX'*L,7L=_΃tLkT(?"ggmdzY*Fj!~8 N|$ HdiO4KJq?F][= "_N(;z^n>5dNdo =:CV RBG/:ʞUYG\bI} [\XQ==5oNjEg3#ʔv*~'om+ť4TcN7)rN) ++--qWz_t`>3:邏 ;.4m'&ZmĚ fԇ[>oOΰwRb~Z74G*N¢QTER}P*IYmI-lсJup4@a˱syO{d9,#ޑy "Cs}@^Ңx:̞3( !+vo2^sL7t Un BU628$/j"v]Y p8|t1[A\[j\Mƀsiaч/qutr1[DHJ'my:ŀ>'/y$6UfMR2 )ШK9ZX3\S*:/$mP{u2BʹɿN{ڄx$,1\+x"Ij$1\U%x F#wbIpCH3 ?]Nm]`P$`E$AWJ|b/!]mspdO?Q\Pma$1av1{"_v_.zJZmŢ9UI3Y\$Ye8~B^dA`UdTDAx^!;cY,+M &mzkX^ 'MU뒄vH"hҠBB?TCwm0. 8lsG,g9\(^\?d$6n& i?nהޖI|Ξ33=$ߓՊﱜ#KۊCSotOuN8B/4;`+FbK/`,|=?.asI"VIH mA+frƎor&khNkTn2Xuz-iJ6 ʏi$O@;Il^cO[Ч ^  m*7j=#UeUJ[M֫XC:q/$ؙaz5g_ mLtNNՠݲSSh jS>$U[tM OIbԪA^~u- - H7a|bI_%wA\\,{IY lHHvcFY zpִ)/,m;Jߒޔ%:m@gT86Xv$'vh@3B.i|I=PpMrcd"R2ƅe`/Pkh2ɓRr·6&Ç g k fJiGDJn۫`O \HIU^;na7vvRQc4{@Yo!s(^Fv{axɲ7|;xfG wD͇h ;g9n孅ʗ{t~>S`%>{ фtkb+T:sv@kt)&i4#?^{|qߑ ͩHn޽٠eaLssHd<(2\- δEBik" (ײ3"p4r~}zoBm+RȈRV_GNy4aàZQjp-"^v7vM& 2]d} & Ը/W?JZ\BU@hRW aa:ʡ lArBp޹$?&=@;>>lHxߎ#)(;ѵ\g`>d0~ FZY|"IGO?{W'6ˉQlf+Brx֣5 Oi"&m;I y;!/|;zߓ%߹9:0fԞeͱܙs*ݬ樓th % R=L 5U% APwN &&c7f&:UWQEL|uok=w%hom I$h.MmNH0`.MW?OH uA1՘" )98M7v"Uo{16O{ÃrKFZJ_kVX !pGR6/ZNZ#k | =j#=J3$e׃j$CvWydmZf/rŜ3(@Y@P|IkEUk[NЯ˷z|I#-& Mڕۧgyv hH'=\F'_)AM<$>4z=3E3CGvm dw q.DzS ]-K]f:5#n>sNO&zI"Cκ=HvWFC.~FmQs%a,&bRn"kM-z7pv^p ɝFExo@gNZ19+uV緱i;?zRcBlQ"QlZ! TiH}ӬIMQ HPrm ͉okE)N+e~qSk[h3T$Ϯ=atDA\i{'dtK&.ᦙfL}dxI :6Dd3Y\RyF-J̛o/Ε̜0`}P8A=7L`,ytו`6wOkD=p J3.C}i1V>ӧOcߌ'c#乛Cw9!M:.H½w>Ü\J=]Q$m Z)\7ssF9IY R[\u.T(T3BϹ([a9 iUܪdv@,T̆:o}zD7~^%uc>#ew ))}L SSDZБt'{ Ej段`pqvy9Y^~/q z{C.XϤO$T.4- E D{ {`VTqAL bWW .Յ {C&T͘sVNΔ˂aQ}.kui`m+V[^JxRt f n&g>U,? +~N)MF]( CLḒ`t6s ̙є{h??p8N' $B.LnV6mߠ8rHJPHt\T(Թq^ETna&MB7 Nآ[R!$&vկjQFHCi RҮpN=o>Z?<9c'@ -L1%<#`FŮ&G+$+:2ds"Q. <Ҿ.sRLj+;Iɂ]E&dRfc m6 u!&c0ڎk%47%YjKCgZaB&Іg:eNb5J}@7A)[;sk4(S }t$@h4JVj&!fwH"z<SC[53;V.<"=.-Y IгYHdPrj$- @&lA:B.. uO@H8޴+}bXb>jsj?`95"]M 106dyxOf(?5'埩^Sf.5{X?TҁwCh#:gSD/Ĕ8MuBH!jmPiEY{񑳅KƗUUfӀl2㨖!b #}hH+2X$㋯ {@3]DD/3HvW]ɒXXma_#;$/g% J}ҋg GWD9Bp޺zXGAZ#o3{N2:잭UfJ/vTRI0tDtT`W(umuK9Ne;#Ʌ GPoCJ[[Vޝ I-աSαmA'fЉx8 #ѓ,Gws{X3;-YkǤpb\uQڰ"d> ySfIE<%,XҐ^'(A&h_,aL͝|XtS9%_I?Q}\h+tf|z69ޡ1wpmtkԨ:)р5A;eUJJM5lP7^8gHqrmL,p)۳'$b%x{wvi7[VAS9_)/#56OdɎ|u+Jެdn$HO<):ҦXϤP9L )ݲ·W['d>x'RR]!`񦈁=~8[5 -)@{kglIF0W&"2c8a'tnlޕA:*[28Ed.-"Z`~ 7j穲?1b@L}$1'|/@I%U%e}pz4GvSC+Y.2CUk~Gz)pM %i JbgԱ& vĘK+XFSkmUH+ /HzлçM_q)S"Eۙvdp0_8+@[8׾G$[PHLwYHR>+_r)gd-xJb|i7]d֯RQ̆ȩe>LI풃`{ 󴩻N*J-=f=S1:O`,^WBnVD3}c e>M|oVՊd/v+UOif\L\3d cߺYqZBo>/ h4t!ՙEq(-ubGN\yDpBd0)P.Zjɧ-,Ϣqg%_v&6 w:S[zHirxըB{V<{~H58;Thf@u~`DfW;Cr*pp3So*kWwJsZqE!~Q Ҵ7pa-!&6I.W1؄\W-hߥǠ_:L4Y.C9C/ J U7[E_q7G?vjBrR̖mm6/?k HJFՁ/vB? ᗮ?_zņv GQ{٨27^_ Kr_*._^r_F9^A _ęhŰTѵ; dA4_sBA;%ڋ{D&K23o*ī>!w<V7gmfv`qHFXz<v<Ɨ=3&CpԿ;B- L'e?Km x-F#HBEɸ5&N$_N&N|3⁸j.g/:TrQ-+os?T>!@C`&w"O+=%j@wDRdm c+_82s ƵVF-ř^H6x Ƅ?"f2tjS8:]įtĀ6CX0= "iNx7EM^%o`IܙuW40a Ao8x̷>ΏbL0I3{-h=aJ4*YdHF׃ırWbgW+k~/Q-H;~Y^X+-̣״B.ipѫ>A+%i1Jm7sotjx֍Lx) ֐c: `v$Hoc/ꥲvLr)s9rfCXL==}:Rn^m =ƅp?+d턽w&& d$Kwj.5::i8,2N7Q'n _3Be@R t^ukǯm'F$ 4dk]"5&iA'*%/'ZPZ{pl"sZCKMg,̎7Pǝ0&h45~gx0io kl =z~tΉ-PbMȢԳJb4in&5$?j)V,d0rD 0W|2hLYWMZ9kz1F"z? Pu3ʽr<[rըMrjʥIqWliSxr*5R[C~Z rD'G^OL]w.w$ozoz `ԃV;#h)RMk]d5N/{BlwD<^wϮ4cq&sy1An~1Sِe&Ӯܜȓ: I q!m3\/=,f.,+]7Cf] ;sFuGA$ToI( rj HZCUě x OӤybˬ-ޜwi=FLܧvBӚzdh[=)A%C?mA2"GH&؂H˓N!fPӵd{Ūf6GmN }^Z]Z@C1IGSo:%{}qN(37=Ǫ(y$`R͆nԪd9/YF@-M4n ŔH6}&_͹f㧺ܐ+rM-)^q'â%}Y=0ܗHA\܃xSqnL1Y=㦜ݞ9n=Șp7ow(Psö|9GAZě; wju$gO]ۆޗDP Nl:{K9iҦSen,cSy3 pdDف3i2ߔGj-Ix˩RB{ـlDw]QXHK׽'с+`xiJICX}`3K$ymS=e`#+o<"Ix#lK/SC@/Bs_<[Sq,i1 'VԘN^[w@眜?w$\ݲհ#͜E}gᄴ$bx,b KLգFי)ꊬixo59.fO&zmȂ>B05?"oSvijo'Ѥ?ӕԧhg.ϳDCXS>L|X;4AGdɪ*S<')LMh[:Q2M Cp%o+qWyZ'_#iomNFR g<0l?%>7A9{;u--Ju$QsB[_R͕ PX,Lbs2C1Rr4TFw@RuYW< >2<GtDZ7ԁ[?O[:s\3bl]M ʘR<:Iw2^n IU-􉑳( T^=tr[SQY%ر݇'h/^3H&:n*8!۠6qcfj=1$"ܔ Hwrk6Ғ?{a燇)-^("q-92\=Z"Ug&(~ [CQWQY?xL3W:|L] {_ǻ5GNaOKjLqvp^7ycf3@MÃ]SfY_gWs&&t efZ=Tk|%#lF0E )OBŖFz;ŝޘ<&zp߾A*d AV\D,ZoݍL]7P  T G~ԖA$z柙O+Ei{KZL~'<|ZjηFݐ~z0nZNxc `c(9XɸyLd?Fp <G_5IHǐ;.AMrf'3v}=lʳ'h)ZNpm=kףanԿqfׇf{s-ڛ@Iw@N)YUlQO;'KRX|{ Esqc\閥RlAaf Lc8(T 1FgIڒu{&bL&?ff h{{yB{{ m12 ^Gu5im@Ԅ!@hq\>跢/Śs?`μų alYz{x`ܬ[[x#y]ߞ Ksp:ޢ ;缺M{\Hg4A1,\,-9=\CH `q71<2{%EOo x> kXFz[YEEv4Z*ܡoI%az4@'ᮥiHhز  7'tN9ЮK)&d;m*der|{[.e<(H_&FNї+JGL6M24ѥ9iXIT8_7|x_Ɛz(iۻ< r%Y1DFUvU]5 r;E3Zt6&D>W60f:[قZ&֚50GǘyVO=pZ/?Y1$Y9B6ef]E쐓 BW'$BzX|vPKt7K`H I9!쁢Z (evY1@_:b`W`]#ƴ !`1pʇjˋOr(trr7qlɰUo Ҝ2L8yS2:I /wҳ `ɎDj!@yVGмlh;Vy. N P݄Wg'lrKn\xtoĚ}1s6 TjH1,\>Ij\Α?aCַgy8.f!]8',?S/ {u., s1zC?Wlӧ;.Q0wg_~Xpqč`a ( 7RqY~m;۴M2-PCc>8 ҽPcn M/J5_{BW%JFc4ʚO:r%h2@H>:ㄑ )qk1hPgV8JM.Mku=oXVpFf"jhENM7':S\:99Li$KH1R$Pdi5r(a62&x\/\wSh!Z fgEcyM#gdj*ch<:{3nߒ 7ϻܥ݇&w0'TnÚ8qrO|eS![M>QֲSx9pZIy`ʘ;`QPقEPKl)1g*cV :>p` >Zt`)FCUK]p+p$ _ ~ƣ.}lB2-i% nDLhrZnθ.A~Y`(w}#XV_DZl#;ƂDbCۿPjy)&nؔl:*>xoW7Fs*eaE/HV ҥne`o/,.>d:ߊI.Љxq{23sG}PoP5:$HN@O0q& 6YH] @"6^yᨈs0jh YZZH#k7rVfo4?Fpʗ2ZO5f4IPox1`8Pp)Me=b%v~4۠~ IuC$/_|P 1MD# #%FP̙?TF-M?Կ=8kw-)|2E>l$A'fti {|^_/u.7jK I?޴QO8Ź[Ae.4uNmj`q񞾒M FP1)wy_=~o+OG[;s-co +{-O>)jtb[na~w[V{GM6ޖX'6t=W„t ΥHMHi,J~c-ZWۯ?'&ZcZm׫ťxvz~wT/ƨg]ڛշ5G؝Wc4f]3Q_W1g [hj-o-U2ox`]I϶_׷~4:meۮBףJMr@z][ z#`|61;KfIzDvW~]S -mnOFbL8+7u˰ױRJ{V *u^[!!d:|y'3!F~qSh՜Wm !_|~` &m"6XM^#z1sDe@,^zwwU_5iLYd @?myyc. {d_ۥ8љHV&-F!Ќv ]98ŋ.1ϛ8Vsd l凷[~m *n|469n`;ML&_\uM_?f^7V(?WS^ g|_XJpmph TW`QineL um@`<: EPfhHOƧV5eSk7Ky9;uݬ[\Vӊm}5rB^cY ӛvr.~/;˾ o]{ omʝD -Ϣi S[p,3L _{x_u}_Ju>]-c yJ/n˯0ҭ~-kBc26D7=2" !s[7#ѢM3_~Ct kocoGW;2F1;!ֺ3Ŕ/eaH>~ʄyRq|0/LfGiޅA\SY6ojSΜڤv-Ғ 4i7d~k-3N8߳|ۍ::-rm[Z)i" 2Cɢ6װzVcM2O ^tzR\I2\?(|GmC|,LShmO˳˷?Uot}ӄ@p*^?;#Gׯq?mwGZ,]MhPG5r)ѓW\=Ɍ{ !5~ؔ _KfA WA'V2<fLpm Ѕ/ɾ}XN+H4jJqpt{f#~ i^ c]Sφ[ ;3m09T% z<_S%ԎۻÚ@0"~=(/CAs/ɥWJLzyO,k1[] })5ٟ$zAs.ʱdEYTdwbK P3b塣{kJSp;K66#?yu+|sƃ[44\_v¯o}ϩ71fJc ߫4?nBvXb0  d[i,#cHbъY2C-̍.cvm#]OS#,ۋeSut g8jV`":Ϳ Rt ݹHn}H-!w!Cf؇AU΍8XivOE%ׄ7v j`>Ǵ£C vǷDž~C٩@?Le»01wYK,"}٢4шk)d%SxvԳ\-~F$׃ڿQ͏}¦m4