summaryrefslogtreecommitdiff
path: root/fs/proc/namespaces.c
blob: f6e8354b8cea20a936f6a4f8ae0335fd7fa36bd4 (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
#include <linux/proc_fs.h>
#include <linux/nsproxy.h>
#include <linux/ptrace.h>
#include <linux/namei.h>
#include <linux/file.h>
#include <linux/utsname.h>
#include <net/net_namespace.h>
#include <linux/ipc_namespace.h>
#include <linux/pid_namespace.h>
#include <linux/user_namespace.h>
#include "internal.h"


static const struct proc_ns_operations *ns_entries[] = {
#ifdef CONFIG_NET_NS
	&netns_operations,
#endif
#ifdef CONFIG_UTS_NS
	&utsns_operations,
#endif
#ifdef CONFIG_IPC_NS
	&ipcns_operations,
#endif
#ifdef CONFIG_PID_NS
	&pidns_operations,
#endif
#ifdef CONFIG_USER_NS
	&userns_operations,
#endif
	&mntns_operations,
};

static const char *proc_ns_follow_link(struct dentry *dentry, void **cookie)
{
	struct inode *inode = d_inode(dentry);
	const struct proc_ns_operations *ns_ops = PROC_I(inode)->ns_ops;
	struct task_struct *task;
	struct path ns_path;
	void *error = ERR_PTR(-EACCES);

	task = get_proc_task(inode);
	if (!task)
		return error;

	if (ptrace_may_access(task, PTRACE_MODE_READ)) {
		error = ns_get_path(&ns_path, task, ns_ops);
		if (!error)
			nd_jump_link(&ns_path);
	}
	put_task_struct(task);
	return error;
}

static int proc_ns_readlink(struct dentry *dentry, char __user *buffer, int buflen)
{
	struct inode *inode = d_inode(dentry);
	const struct proc_ns_operations *ns_ops = PROC_I(inode)->ns_ops;
	struct task_struct *task;
	char name[50];
	int res = -EACCES;

	task = get_proc_task(inode);
	if (!task)
		return res;

	if (ptrace_may_access(task, PTRACE_MODE_READ)) {
		res = ns_get_name(name, sizeof(name), task, ns_ops);
		if (res >= 0)
			res = readlink_copy(buffer, buflen, name);
	}
	put_task_struct(task);
	return res;
}

static const struct inode_operations proc_ns_link_inode_operations = {
	.readlink	= proc_ns_readlink,
	.follow_link	= proc_ns_follow_link,
	.setattr	= proc_setattr,
};

static int proc_ns_instantiate(struct inode *dir,
	struct dentry *dentry, struct task_struct *task, const void *ptr)
{
	const struct proc_ns_operations *ns_ops = ptr;
	struct inode *inode;
	struct proc_inode *ei;

	inode = proc_pid_make_inode(dir->i_sb, task);
	if (!inode)
		goto out;

	ei = PROC_I(inode);
	inode->i_mode = S_IFLNK|S_IRWXUGO;
	inode->i_op = &proc_ns_link_inode_operations;
	ei->ns_ops = ns_ops;

	d_set_d_op(dentry, &pid_dentry_operations);
	d_add(dentry, inode);
	/* Close the race of the process dying before we return the dentry */
	if (pid_revalidate(dentry, 0))
		return 0;
out:
	return -ENOENT;
}

static int proc_ns_dir_readdir(struct file *file, struct dir_context *ctx)
{
	struct task_struct *task = get_proc_task(file_inode(file));
	const struct proc_ns_operations **entry, **last;

	if (!task)
		return -ENOENT;

	if (!dir_emit_dots(file, ctx))
		goto out;
	if (ctx->pos >= 2 + ARRAY_SIZE(ns_entries))
		goto out;
	entry = ns_entries + (ctx->pos - 2);
	last = &ns_entries[ARRAY_SIZE(ns_entries) - 1];
	while (entry <= last) {
		const struct proc_ns_operations *ops = *entry;
		if (!proc_fill_cache(file, ctx, ops->name, strlen(ops->name),
				     proc_ns_instantiate, task, ops))
			break;
		ctx->pos++;
		entry++;
	}
out:
	put_task_struct(task);
	return 0;
}

const struct file_operations proc_ns_dir_operations = {
	.read		= generic_read_dir,
	.iterate	= proc_ns_dir_readdir,
};

static struct dentry *proc_ns_dir_lookup(struct inode *dir,
				struct dentry *dentry, unsigned int flags)
{
	int error;
	struct task_struct *task = get_proc_task(dir);
	const struct proc_ns_operations **entry, **last;
	unsigned int len = dentry->d_name.len;

	error = -ENOENT;

	if (!task)
		goto out_no_task;

	last = &ns_entries[ARRAY_SIZE(ns_entries)];
	for (entry = ns_entries; entry < last; entry++) {
		if (strlen((*entry)->name) != len)
			continue;
		if (!memcmp(dentry->d_name.name, (*entry)->name, len))
			break;
	}
	if (entry == last)
		goto out;

	error = proc_ns_instantiate(dir, dentry, task, *entry);
out:
	put_task_struct(task);
out_no_task:
	return ERR_PTR(error);
}

const struct inode_operations proc_ns_dir_inode_operations = {
	.lookup		= proc_ns_dir_lookup,
	.getattr	= pid_getattr,
	.setattr	= proc_setattr,
};
[)$ǝ'S!_.t @/@rH04vs O U׵9q I?OOBlmP| e~Bȁɋ`nAxI~0:z4Ku&}|"e^rxDL=z8tHO`UL@_K꟬m}M8:;ZDϢBJjDpc^=/q)]Z!3׃W5F{n RQ+JZ.'ȡD R| 6FI/`&$$ 6F!ȀAA;岳k>xb2 0YP\Ri_{\4h:|?qy޳E8?+)(j|w=.ސ`|{QF8.Ed*#Ӝfs`>M <Lz!3E*[WE}%_]̒ qK-?b7Yӗpf@:0=^b$R$TE۲sT-}f$}B~x(4߅|;e u!xis&C/m6?Z8 di<].O?W\)\Zb=ѝ|~/z9 ;9T}f雯ǿ1g?_vKT_!('o [Հ-}9C An/fU`طs`,bT~x,vP Kr%eï'*Gu0 ųO.0SEU&+83^+'tUZ\${twBwP +۲{r>9 w_ BJs1_݈w]Vu Xh|ӳz= &ڌqt|6#?_~7\P]bl `Pg6vzs|~ cq+m,<~'QFl#ο.Uo Q{sA}}[c{}s9c.@'݊880&3cNA/m`P}\WN`;z}Zob>GD.@=<~@=BhbX+-k:_әtv}gy-?U=Ԅiݷ>P{6zC'( q,4v ^_| щIݗub;sݻ]zr_'.ikRO1㚘$T_yjxh`~>2Z0vn:O^XrV#8OdVaPN X=@.X_y C0!֯ utPda[D$<ǑׄwȌ&.Ak88^Ưc$D u7I;&F<߶QUC_1;lS@hy 育{2d6j{;b|A?_&wm_nֳ)ۀa]YhZK `'rb Cj9hѸtFBe#_^\c.j`PSkӡ }QbB'{7gVOX$% A DCn_3=6lC2?waA"嵇*TGMr&h[Wp AD@mtH{1v[ӌce8,\fxBݸqutZ{EMURaæBgy vw6]::k7]Q-u;]fm[9W)7Ʀ]GVzC>8 r_8|+!Tp-m6+WK 7;*>cvk5:A\g?BBߧq!dTFdb6#HLɍ31Zd}4EE" kdibg-/ blcqO!$Lx@~F͝З+$Msf11c.)&~[G$EԆB $SCD]47&⅚#g[aCEIt]TbE2  Z0~U[cm_V;慎F<(TtCY˂L'Gb=_zgKטJr.ajEvw@z#GG"iٯxw  wFso%㦯X[,?g#; @HXW=A :E Ӳb5Qnleh}:r㜦n<.Ϡb9qGvw-+J]02]z=7ѧ dxZX YfA>T -OQim v6tóÀl"a?Kڐg(!+! ʁ|w!:Hw酭x=m?o?F d:'mMK]hKĢiNm#c\4,׆NΝgI_Ka3h f>aȁ;1)9ܒ dvǦ' v m{ܢz;t;;Nێ=kܳλ9T)hTz>)QU7S l/;8!W3eR GGMQrѪ|/.@قn0l˰#/r#tfI -JlG A*)0 H㛪9$s .Ən $犢r ]P"3hF@-N"v t)I 9hZtÁLs{%^/DH.nr-j! QUtIz>jvԸam`s8T#ǽΣV_P<6u^_7*ׯ!Qmu䯥>?<~x47ՒWAb"CdHy87 ;m>4~-QW:uo5,.FVͩ ^u<=0~ywBuyN=s^raB$}a:6`lki.KٲwmW,sq&P@`$y4nA 갬bl_9 H=;5?z"ԯ^0k}p ,BX2tn #Jx08m?e}Ó$_C.p*{x Ͻ7W6GrW?@wx8T_FV#&L}8@Lej#ykIQ& ESzʞtz ά3^{9&ET Ą.CH7J}2W{1uw_EkXsh!R0'*3va!mY_yAN٪ꗙXGU,͟[)4Ya]qڷ 1lBz \7gڜZ9޿3o'x=LrLF]/T'qt5I,&GYpI"<#㯣 ~L;P,hDZ9s%B EҐ8Q 8*%~1 .m˚Gw(]|/U):"gp<6f9ݼek|P1ِ -;N`8y6zN٪ 11l7uhZQI0"lwsueacSfXJ;p勥}7A4%nz/'>lyU9$G֔Òʋ!/kt[f糀laWD=7+^P:]r?p6@E{@W^ǿ Ԥ7,!J]箠\;SR:M9ۼX<G]B$/:OٮQȉ\BУGAUO‰haB{wugKYvby(9kGh}BVSRapEo}YƄ5#5u~= Ws =YgjÁIeD썤; .;7~[aC<~`ڣ.v!{U` r7BՅ;{-'}?rZt/ӹq O3B?ea@^Dλsp"`%cVS~О.7T7CJ L2y;o3ٝI0+l茤mqH食EO|do~>X:uQ^N(N~v:M@$#=P+wV_BJwW֢*=O,Za\ xsƦ}C."'ϵM|VK;( g&NXP3-)5=VLۃ݃P/0zWm?/~i& $ l܂ARu~B€??^gRw0 n;sr QxVD;暈fȍˇW33Qj sŝnW,.@R(PfMTcMY H{Y8^Nh!|>씠zy)vO:z3"<<4ޱc6XQǧ|̍Ŧdz1=F~I(c9,}+eqkENg}J/{zixG8;hawrĂQ/_C'`A콦S-zedг5^[kLC=ɿR@ 3+␴?+G"oCۯOk+46[1NNWEpv,@$?gYn?͊mPM^jWȦOw.|rVhy4Nwϡ׫ᇧeN0`2Q{Ԕe p\<ʤ~xėu2^3ÒI# D`puG}},Cc2{⺕pDQ"$O&<1Ad=Lp^zCM,1zQj1 sy*/M{n.C <, . X]ao3wXm '| 7Mq}6 r~\NvMȠ5G\!( +oî!94uQrBXs\:";O@MJe*1m3~a#fo%WNGO-Z?ÞߐĠ \m=v< 5N_2$ עۛ" ϸJ9 '& ш=銤Ō7ŐH|0"UܒXCT:dL=X(z @ ٟ'iLg,Z ֎`<ݐĠvsjuNs&*` `Q EgM6lc:;;S-3 CED@\˫:1 M) AqTt+!p9'gN컶hSrCr[<^'0+C +;0;d!S_ީx].l`=6v[m. 32讇u.KpdFNhQ@`ǛYx{al U?.7Y+;^XtQGlčn³j"3BTqT._|e<#Goں4$"yG2Wˉ [oݍ^vZ]B_ᑂB`M{v =+F c45գ*u쵬|ŠC.:h ~Pok]ݚm Ud5sk";gXLylW4r'7wjȫ[#G~@aOv|' $W=s0=-&cSIj()JTϞph>䗩agͷc q|ؐ[3ήz-aRъ ,UDAnEz= hn/9`-n𞼷ban|mrpN"] F5я7,r"T1~8qOm[ۻ*d$ֵ,[u΄S mPrNw y_ >;ʕ|; mܭ@wl^=<+7FWEz|pya9@9aBŜ=Qi[3Yp9ӗ`fwXL۶:s6/|˓L"}n`VĎMR ~ 2X0fqTN7R HKr%w`ŅPl 1@6 lF!A?Z@yn5ju!2|̂4b\Sr/Pn$YH}@C5KaH" JFp2sd" exq3Xumv01 de"NwvlGv \HDt.s )nn,RwB^ 8Vd=3P\ 4 .,GĂ;!jL@ah t09yWvLDq2Ւ!,fpR7Q$duq~q.7!`YmY/-w-LޏuEp>]K{g>+q$櫼т]CJr$zdw٩plp4* 9 bgE&b`AԪխb&f=\`?GCe\{|P-'0KpݿˌZx ࡿRʮ0{Lf:(7l PTRU'\QM]}Z{vצ>4c5YiÐ;l=gaʌ-J `)p 2D][& 88l<Sua{N?!V9$bv%? L4#@ E1.#5*D D9@{ .F)Gu\OG10e7s+HRx/L 9vCPFG4%JAUTw\o}#@oe&;WnlG/z?аvWLWfs! 7Ly&kCS|!IH,`~h(9Xp^ q-U=vk-Xn#׺ z nK8IraO2ϝ1*.Q/eyv9ϬQ v܂+[y72< /MC*#]@^D *Dn|Zǡs9p$8H͋M3Z4ZCK}_Oڂ_uPMق6aPT 2snDKo< '<tLf1Ů,k(l]Z '{dIb=}abLu0>ȦWXuċs!qA_6Y+Jq5.,$3ksD!{0ls)eNt,NLf Ȥ0#8Cn:ެuBY0;x׼֗8yqcTV CWjNlfqf)<5x.X  gsZ66LKd0 VFid3Z]81Slr\ǣEW R0oP f7fj]kNq7t5 l0VQ` LQѾo iYvl(Axe#ۺj蘸E@D[mFGjz֝ɒfX@khCyNetSuۿQ1R"P%$"=XfXQ&RPLg9%$x6nѰ!<1TUUxr x0PD"Ŗ-TxUqr7Ҳy3Vʋ/ !/utP &,@VPiǟaU0 ~gUHPȋmpP5r]Xm*9O_w;C4k~!*6ACVozM~*= Uq}cQ9Xd'HW;h(B|R((x,I@٢\ޮ/a]l0PT@[CG[͊E]gZ 4.jhO˫]\]-Z(.mirj67DI<랼'E1 -6Dk4fX B1b>N NT {:gk %ߩq{{7LjDEl^ޗ#u0w:#EaV%\~GPվ(=}. VѺ>k+0"2?X 58z. E,O;ۅS N$;E?Ag݆>A'HC+ W; ϝݐvb jTfPB|dľ}xtpaOެj?~a?p{,f ' d Q+P FC4:4 $sٽ`uyq\]-iJ-ptz~шm}e$>^!t@KF*izQ.xӐIV.>%X޿t\VvR0WGBƱJ|>oEI! tG-c1fvU=_pr8:lþW*~De[[Ú۝n1rpA(k7yo#bRH(}^ϒd7ߩ2( f#D$h^<@ Vb?ԸOpyƳ# e%r;Ӹ8Cw#;00RPk@Q YF7_?m`+ ߮1g%~c܁1%J0!=o\5r-ʐ&1 zk6sf}m hdGqfYɁG6s+PkJ>*T rYdzX 2~yzu|^p#^TWw_T&C܆@FSC1 @*E"is!bkdL!ʪPP_~|M~nŹ=w>2# rZ|Eo"#A,duT"M-4(4|eQb~=y 87[_JNn4spo`rx\,`LW~ ( f 8qA \xIn&gj?zguCFBj|)##,m%o1%-2͢YRd5 /u+ '@Oj3SGjlG#^CTW^& UYP&RpxU8I6fsXAĊ/HO+Է@8ȉNL: L@>pc.FD_ڱma_0ȮWB Pxox9vχdBoz4*^\Lpiz <IPڔ3}gzos*œMBwJzCͅa @E:j`E"OgZCQJ1 !5A̛ȴ46GLފ6#^ۧ^]|4ܣ<Σ$pv` WF92^TA;2V> {8.lV7 !jT̠B0hu2*,97K+q  q)\F-ܴHsF :[B. z$G\89"[T)Rf"`Pk&vn-ZD od}03HACwpr.%ӡ&b2:5 BP}-PNq ZDup.cvJǍGfa6SAE/[αcݲJRq~,ܻ9[ _&&@Z稬Ax@d (l9E{(yq8i7|apvClImt_etɡDh_%OZyӄshm{z`ŇQ6{6u̿uag!L;zְuۤ;NGh絗0S(P:O# ,@Ȗ nyiw=>eU_uy8^Yu^>X PT?]BM5Evplk+-wGBOƏ ɫs\EIŗ##+EU_J݋XGK:tH?+=:>G}PxlU4V8ITqyiN6@;ǁx}@r]<]& C}af1-VD6 /)Cs dpX3upT8YNǹm+j݃VJ}g;`۠߱=t!*FB&3lW0<((Q?s~I`)=w"G=rOuE3vh?-I. l/y~iT7 ?M̶YK"m.]ò=^Y> ഷ}xs-v@A?G}0~RnW]λ b2<|{*&5V}  P֣a e7e.@l葁`Ad?5#8tgθCcoc.4cs?/"`0H!$)QʏW8߰_'Js6!="#+HͣL͠*?i dzsuH3h#'Xy/uߕU. XBj?.Cru༦rz7؎.mY>It`CVаzpo;p턩cpʮ>R `3* j}.{3IpIa\<`:ݖKp`S7{h aW KŘ< F⻌-ğ. ".Ht l6'tgouH偶ky4ygBC 49Pccc߉C D OkslCc ptK2%Ҏʞxo!P"+QjZd;Vʁ0 @K#L]% ]<$C.*v1Vt>-S_ 'Ip}|wX"P+= +I@AU<+%>UgWE%d;o嫿Xfzǧ1G} Ul!?5I NoenDqۏ.(C:JWS˜wٺg #&3(Xل#(ANr#Rb D{3p:(g7DY_Ww[xR>C^|TrQQ2J>c3:GWbY'$3{tS:ψQ\g},9'g=۶߬Oݗq` 3^H1_\KF PbY A|}h{:$jC }Bj(ħrez?Q=`/ ì_%( B:S6ԆWuHɓU;OYς½+r ֆCwdhI|撋+9Jj,"vׄX[aQ>@p*/p]nnƣaowzZa$@h:++{uˁO1mGgL@wU!9 ç5 *חsd8.|c(qOr#_X }]M/J$%rC#wBH4Hpd="a#׾E-–HAPa6;־φW(;&pCvs<3|T_T0m0KeXAqbD~tw3YVum˩|>HKnH(ܫ=y[b8&xrb;Y ,O#^fQzA Y*w#"@ /B &@_$Tتv/5RP'Crڑ f]KOQ_D8w3O=;Oՠ*}ʾu7sQ. fqPZy w46_%D 5On{ywXBY#nĉ[a詝9߃\΀ȪPf040Vٯ uOLs JvD̀2u-F?P&szo߀BK&uNô8+o2fGwghUOBJ״=j.%Fl`y7=5MRXÀG J أAAB+蓟K7O'z|F`m'e"/)&8 ݞ؇"PPWD.ImMm [n :&op%>Tvpҋp֚6ɠ7i OSbf$K(p,ddAMmiZOb|)wywc$(' ] $*|#^TnQJ`-2CBOCvZ'I(&۩(np@ӊqf= 9ٟɚ!EDoo,@$GA%SvC (9'?[׳O U/8.,HOGio "tt!8t=8r[![~D@QJl%@Gb}C&$u;WQ[h馋ŗOoY`G>lHNШ2n/ܪ9;G߼8=w:~}EnTg#lT zk0DɾQ/=Vk7 maP}piKQx,ۊXΦ1~sjXrM)Lՙ>'Xw%s}E8!|+s0iu5ɿw i!'?4WY15Š^ǘxX9Px--6GBPD:X^ .q,ѻ&8Cq_1*:%V6b3g`(m wo $ jhc~m2g@`o@/b]^S˕8:0 jjE.U1ʈrv~OL~u3A"xX7П%G7 N}3@=B3CyRB՛_ #Fpp6(G[<3Ӎ5 _p>k{1b \bM]­Epn ZUazK$5aWc&hKr m@_;3`9#RN7lw("Y Fm9 \bDkڦ` ~X`Ҁ~l.B$gn@|`9b7 TNyM/` R1~gkq(>C@s '!Q#"A7gԣY?nAy-z[v#F-8ˏR "8]C\3/%-1Rt-t àهav\$ ~^2\nHt &! qsM>?ƺ)]"&:z#b*apNJ-P, >WDΊ?Cx0VQ77 9@4xu!Wa5rjR3"82>; tBH4߀0$>:kKiw! F @DN B% ;B$*ȰH|({b(ѯe%Z͓ +Ko{Z|fNV_{#M|^0=bw~gݰXyi.Uңz/W|}mHU_*KHOݣ#W27ݓi`H8Yh;ѵBɌ;߹v毢$mof`Fw!e7ԴMt\ =BTJ]9|L$(ax Ts @TA™ʎTrN^;5A1w71K4XGuFq G㬂ס|ߧuIx/(Ϗ+20ވP*,js^2qM A= qo@Z8&E\c2riZ퐹J/]c9ts!PXMJq ^WO͗4IEv(k\;#\Ù.32(ˈ5N[ND@֭LUGtŸ?3`'%4?w@ZdoP˜̯eET`'1!ڍ:E:Ĵ8U1x]v^SxLM ~(GYi 7#5X,7$z4J":y2Y8!ݝD _?Ѕ?>f#esYmP$`U2ctȖWO Hޱ`d\V!}r |%(f:wWvc!n|> <<'@Ş%UA9 R9qxv!9֙m幸U$.tvCD:}t3E`ʎ42 %đSJjlKuFu0#4XŒ.!A Bc 6t퀤FR(?VgDۺx*<Wxr0ҽ!y,֩bU<(`Ģ9_-6G61?Xpwdnymǿթ"b@N"@$&ulU؆6_4yU-oEŀ`o7ʏ?,#sZ-oCVaE]OTWPZ/4FyB Ŝ ?.Yd\}_eں-㦁͡6h\bb7lEC-ٵE>h O(Q6[6϶b q{MB%Ui,pi"ctiPG@u'g>;&UΒĶd $AMW@|"n5=<좶do?kz7{j <Ǻ?O!YO ֤Q%! <$S"Yfp*[XoeX< IR ]&QadV"Nh&nj`D 3 eYvbc![w›{@Yf"*}j;43xbUC@A y 4KU ,2{8o7 ln9{IWnX?e9C v%(ECkI㶘<y/F+\4T!-lKCںq 7+R7pbq}W߻4g-$e h7fraT bHoV9t6'@#lImɆnZ;D~E P0a(Gn&G`-к.2S|OEKWt wP<Hk(|v聶*]ؾ8صkϦG dj~rkj2t؇35ޝku-FĩwF>woX{4z RBC)x\WѦsϲsU~qEBtxն4SrgMbzLÌぇ~nM$_[{OjsB>PY3va\ ^t807̈́[n@~eпoݹשF2{@C[`>3B%ܯg]Gq%U*/{EפMTw[J;+[" wbx|@NS>S`L]6  ,"^Ϸ1Nj>MضH +@^:+Bs oXGrYT3K=ʒ$ NEcy5pG/ϐ݂OxBuH(sڐBpgUUwH=x1t9Dph EC6mM冕ɱ]x+G6JMq-PQZˎp8E$bh@Lw!Ƃ ̐Ȥ"LĽ(G@l>bصK[\m6(YoB<>?Cddgj>>/Kϼa"ʳaKgs FplbQGf kX2h"&[VsHJ(Y*]6 :slg ؓ# h!3 n2'EWXTj^ f1v曉 Rh5!dt{B+n60!8ctS|zvU 4ӱ2 7(^FpsNċZ( )n /l+!k܁@ZkklT`W=/l\Gq[OT̈|g.g GhMggAo{٫4fKP!X\?GiC>t]MMygX d[4) XRX9Y0mpɠx|³Qn boޫBނPt2 ߻SJRWKo3G R6ifɦj{q@ l6LڶE;~%AY~׵\}ξ4 hc+Fߦ0uʵ/֛gM9 t* Dt 7/Po,-`ŕi9})}e#AIjs*i?ip5 l?ȶ$2.${X>U0~mI )}b'mVFHФ򐓟@?TD=6v"I6L(GMR!5޹'=_y_n^KC}U$Q=I 78h'EVtʍ" { 4 +4EoOSskXG^yWsJؖiv^W8Mnx"SpomOK?I3\ěe6ړ4-0MOM oKR}z|LXIX̟<9Ԭ_ԷCTu]At&y{ǜPnr]ۈ 7=z𨉲d|>jZH sBAk'8_ )p,Y[kd7膝[!;>bYuƒku>Ż^z qtGm,×rrN 0T~61Gstm:k۠HKh;b!Yf@Hrʮ>W(1nE8_914Q$ɵkxiģkv~w¾)uڻP;d iJ/L W -n+;&$uQ^樚(Y>bϭ8;/C2{CL^go8r+^$: zqS/K?:\7}^Pȿ_WFrjx(OGMڀOw87?+p?680$]Ay68T'Oҁ# Q"!F_yM4@vq&v"bTV" qP|Ō8ȍ.NCf%B/k8x6XW 1Hd z|'!sufꮜJR!9Pyu4vPJdjgAihάf `F]~-P'(s|R'̴w:u*sLag @(bƌ'J5w}nl oay9V(An,v%UHtO\ ܒq:*@`S.Dh)(L2ÂMft2 k\f_)-L;!Xw }5p@1 ,0g -FLC{ dadi8v؁&9y'Hy) e@"^2'7z$;$'%k>d /8҂z^WZ".~{t =U['q6CH" i`3zֺ{ٜV $8=II"5ɉXu7$}Awy?;M]a$ ]f*fFW(qH=h(_.W;#r|#N9Xl0sgKxBK TH":/9/r0Ja[ ̓aCC qj4:8q4#ܜ+~5}f\jM@jcŊrI;óY#]-T$r-!uqw[}mP [є0L3^zzύ`ҮmDH$D:hP |;!=dJOܮ0 yU/ TVk{ճPAa>Kֽ*.#xͦz6k7=!<< :<#_NYwoC=x=)gB(hqA}idUxjc!)w٤$bv1Saha L<.^ơ\}IL{#e<0wq< 4Ӈ Q mo<65ᢶ0TsTZͶL,b ˸Ëewp QfDJ  l4m[Zd ҨdE"mjK>$St*cQmKXksP*PPx-ZƚS;澴{l@/pv\g!JziYЌ"/2!stZ%t:U$%ny^jQ6o`EGC"O~qNzGdq@oh9h[[]!Y+V?i;pw PT"TƁͽXˋ·d\kFX=57/qUL{H`PzhI n~՞ ;MMsC@NOmN[E0wpc94cq/oj * pœM,h׾ؘqIS}/0J};!HĻѤG3FZ@ ?r%$; Q.f}l!I77}3ȩb@e@,u"y^v0著9Ax{8˿f-b%PvZb^>h'B/0|1?icSZ8l9%fpHz̡CG8A:R҃_]UnKm^h@y织(Y'gTzeGȼuAW9@VQJdr52LX 䌁Qd:ix#%~U-Cƅ_P.l@qsn>a%! Hqq Ň \_(}8v< 1x4c9c(\aB46 Hʹ" ]̉^uIG0q~Ui^@W >M|L(ZN 7pS8dMaJųH2 |GbO5>]b1g<}Y[[QNF=Ry(Ԫ)\cbT7<CQp u RfOe8"qgwX`NVe? q˙Ez&8 yuvI(! Fi @:rAݯOпK13@"\-x=;sB0䙐V>ygޚ=|>ƀ/M@XVڢSA~gUf [u ưԀ. }NN27kphMXi9{R^92(%yJWn>9n&sh*'U,Hrj+ Ewveǥj]u4EF u ttIN({!ujqjX1V4!X@82[kZnomX-߫6KMUE(? ú &fyW5s(ߔ(oz0 5r_D#?BPH0,gN*w:bD&1@?YtmRxtzH`6%_p*0آw%dnR1c?#cW&5yY9`\ld7|{^2wDq{.P_-YtCR)j9Au7 ~M;s{Ѣ Qk{p0SHH$ߢ ZjmHYzor0\08xj[W:#hbFE/K  qGmfD6?l?~b(Ż(%pqչ( @yƪHxD\d.:#B(7@Pj>=]Pp7xX^oBRa#DʏpY E;">^݊1,cw>|`Exxb֡j;\65W&r`@+ xt(I\N~)ɰs"̈TP! Dpz٪9 ژ=G"KWa+s:`m]]%u|rJo1s̡} eBH:ˬL|yܩˡC~K vvd@%!:k}P] 2f#RUpPkdmcn`~.gLL XhҦɗ;~ǫ .?aj!P3ڼ0אP#4%\Mfggyeh!8 6"1qF[+ 888*9  E:>xgmv~9Cgc$( Ҳn J01',KW=Mrcy0D VyR%TL.<> 7͝N .+E wSVF%wXEV( =bgt/QӨ0ե"nͺ4hG3l5p|=L#eu>rkT .S7SD|mNkaR}j,c80Td s!!eKaМd tEd\5 b,*f&$~C 'Jw #v7#I 61t Qd*GEQTKT_MV6,e#eRV;f֥Gt 8_^_x'C_9 !_:HL 17Q& {~h|HLXB0 DFЋr Yd% %_.E~HAޱ$RRz|kTPbIیI[;B82ꐥw)/Ք҅ RN%X}+ȣ-xrŏjlKwln@>}/ "\hPG @KeC+!X䈶@T;/ qF2sűI_ۧO bd'g(ط=ˑmPljw=S==U6G7Г?OlQ|"Sbџ՚ >ďi7@ .f҆٭}Q6 ղkPK 0G^SS4L^vEsfQeiL Z"G/v$P<;wV2^w}Ga쒡?Aa,tUUvs9mo!BY 9?}YAE.PKPMbjI>*&") $F!Q^>v>栠NHVƍj!ٰ e/qG۝7H_nP0ڕW|}gw_g`ozZ9Wim@"㗩DL{Q֥ʱyD| u($w#+X$@sG`l({|Ì2RrA=;çyA:1m&Q`/ 3t稣@p$ZV oOd;+ˊh΅D'J'wbh#K#~] 4.y rK121>x\+>ROI0z|&o>"pgzoGQw'Pt=1PE~[ދɏ[{z~ӧ̟Q@~~~]q|p'PHr0Y 2e $'؁S&+`I )Ӗ_eƄP16zO Š .\P|A#w#j0#5kOKU}WIl$a9_6*åY$}7)AvbiJHn?/n?bp=ݜ{GU劢{&P?!AGJ>;bF?t@ B0/\~iX/$F( J D>_ xɭ ?53ʕ=9av6D@P̂m-~Yؿdz^/ ?Д:u{{ ][/)c=s{? կ<Y۶1\kTgqxsvnCuBc|c:50|K*xg~R}u,Z NϤCF'`9$T @ ޡ;A@˃ >E0lTN#lo5ȸ|=.#[mu>o(Q-Ŭ7(s r$xj/K$%w;ڻ8҆CsGO~bp8iOuC/ !ln^80.(|G&tm̗@iWJ8kwX귡K|+6E|O?̪ ;,9[z௏g49ޥEKpj%2x9:Ą꟏Wyr-aw;3حg46oRY!wk8zzvӞ,3uǫ{OӿGdW_&|y9T*Y5(@҈~ܐdo,WyFii_هd&ݜt:;Om:k=OwamD:hRC93?V-tc)_UW0S&PQ!_e)M* a/D 9ڻP٬}7q|)MM!E_7gh_4 @%BX@^1\?z_YQy? ?x'> pDu}9zEdAL`D$?kJZ Pΰ i`MI}w~G1̇ 9Bg`HSm G3Ow{cTɲ?*ץ6]]p\!\o|>ߔDǬ@p}ѓKliܜ՛tA:8(P~c_ok=5W;O|>Wmќ].e| ֻV{ou% ^C}'pkhtN;Wc|\(ړ/wA]'Ճӷ<qu{^5q>)Ӛz=.̲ %R,{>hTkGFs폥 _ˬ<`D(B ʕU褲&`gGjSC b:HˑXD>SzVYޫ!Iy!W>]q~7'{tC훩"5`Lf2:QVp}w-x,%e,\cysp"PwY4tJGJ&(ǡFa4y|P\˫(S%iL88V'w29շ^9 :4S ?MMo/рCdXu+k,+7>)QZLӢ#a 0Uasp =imHK0{{9(6PTH][I`EU FWmWGk|w\Kiܧ]:> xKVkgcl3L]oZbmt#*=I]g+cP߯d@pb.P>ǯg^59#=zNCI~ Q O0ҔS_;LIk%A4Ry.)T-Ƥ3o{! 9Ӛi?C!c& >dnGHAG,0c߉Wg /vg;|k'n0udD-)bħWg7{[8v~J/_ϣP8wϞd=!1~Qrmegf.×f P?C lce"?\5_ί:IZHD({Cxl(9b4GSyP A_qΧٜ`Qֿ/}3f?d9So @?Oo zhM߫".uy>p .&DEB&82tk0Cu=#lZ=>O(ٝ,:mV n@9Q5d-S\}J ItBdq}w!u| @[`<MYdxs.mX}NW.,Gs=>_xmB!<K!7=TG >;O糱1&-nGy =opyQ8 HlCbheV^r'‹7)id+JvS` ؗP 02 5]ij2 cP;k_}ԔˬUȀH3@dQPDrHDDHHDg ڲ |To!6 LoN (0Lz`\ L{"1'-u?ֆZ@I=;5DA5viIuCݺk33 ckx^᱓i h?X9_fbhx\b!R ǽ%,/Du J0ݥ&Xj T/@hRCBNU2FBMm݋l +g8LcEBDu863g0Ud$(-(.DGIRAӖ%DDY `ɬ,lLRA4%ZAK }5*DV_/}xv5a *  #w$C%=C 'eEiAa-5.Rt(c:[%o^]R[ڣr`!o1Vb7GpG"W]WtF}]} FK_'2C;$k9#aR?ʘHV# MՄ0k6Jl.gE/$`AVv}݃brҫS~cۅ:h>D-D0yhsҌjO+|.ᣋ[۵Nd@zJ/(>p\r Au=wmQ.юk:Až4j0! % >E#m\olRP®(F.PY<P Qz֝ᐵH.~vż"͌-3l}Uh+QEdِr]kjjxP@xQ"[zî@pAH 1 {5tJ8s;ocشB6T b\_u%@,+KK:#n(/ccut&q\nޡ$P5Y,D[ñk8üvr*hVb̼gG6QrN뾨FvVDÈ!*N\Nh8$d[ nP$"밿ikjavܚ1x-k|uN.;dY'cFVFFkeQ{ l =jleώ|11}Zmw[iWro`KgΏ 5|@3tU;Yg8+v]6; ~Ѫȭ뛞9sľkK0'!{.gA䯯1̶ c7sd>_U(ҎwvucJJk[0ڰUn_b~@V)xQ~u8~6׈EcS_G`A%FI+qjߢ2H8qR{Se$Dv WX^{o× d#CY/t;Qcggv?f V)m[2gkKR $Y#CMD, 3zvsc6-|~]rCR=.IJ?hȃO$ Ώ34A>V:"}F4$-r?WW Γp ˊ~~4y P>u Zr]/~~٦ ?|y񐖋?{,. )J~Cfزc qtp?騳+s -?s.o6:D4֤}ƹzCǯ78#^}-x}0'P'{oõ K4{]:;" uXtGϞG-xc'GBdjko1#/X߰~LL&(YR-a7k'a,@9pb Gir,ݳp~=\_^ "Zi;ؐ"'Tpe+u^3+i7?W7zxq֟^u; kUU P[ɷqBN7zLP؜^xRl8J?G/~ h %'EJF95-`99Dp'Z y ai@̷jA~p fw'G.^—mP'xJe7d~q[wxclW34.=瘎`>@@zxjfDn5>, ?׫yMUyl;+aac>Q#Hfe@F9pM!@˧4Ro˪z7trF4p3=>fjU*@ dJǯPK FVVEڊL3hSjNw&8&[?aI???=a[w.煵Wtyal Ӝ&؊4ri{@Vx~7uorCr]"bq<.~쿭 a-N߯1YoAn :cp6p c;; BC)3(I"jCgfnMlt_iEƠ&X /[F4s@n%껶&'qltXSܔ)[qm-˚L`/ơv̷0UTAEIx9IIݖ C#~/T0"w-~8Jq' h.֊֒]Wf`D 6?#ק?]ifChLρxBn9F/ڬ%^QA^`+~SU!Ac+rL1 8V7 mSgmZk_KnY^,Yf_J* ݓ x8[:?C-6x0 ӷ}(?h XkWI֊O !:_lv-4lkJHC.XjA # tAc zpADoI@#}== }1G~ς]k1|`˕m|lU Y{z~^@ l)W37o}~k1B ; }."=R&Nn 0P)M}]jܧ ۼ[=kO#ȍRRe IKim#:Y$iX9UA_+"vU;-7KtlZdܚνH^T#fǯtOl +)˺3'ZUvM,mY3Q ~*'-*ct?M e׸yv 3`rT x [\lb ;9Zkˬjv|dͲ]5s e{ze o w 'CLp]?ʈ4#.*2;Jc:"R#򋈯@1$-'diΎ= M$ C9{F}GV}av=aYfedM 4LPb1+"|=5fC=>߿Pl3ଌ؋7靯$<p 𐋨5k60XQAՕ6=+/ H Z $$w vQag`b7 "oN`E$S"l0~}=G ȵD)\p݅nA*D~2GቔIl†BHahQoS`x ;vVvÑ+,wm]q&=ïP0;zna-háxPITQDTQDTQHQE QE QEUPPR5M5E5M5EQE-RTT> q̝,o/ 3uwۼ ɿ}~䔑nܩ eHB{}~5WM!$~-Hc׮P!(N0y3BzڒeݓL#$Am*n|Dp""%7M ]<8~%_"N ;"Xu6iWΣL̢HA}B ( fJ**F ` a@W|>ssQ$$$CCCC-JR+*lhD4I@RK bJ"J "( B( Z* Xh*&"&&( ""##-̒nt`P|B?ˏpdIpP 0(iʶ83 R=RJ׬K ?[gC=;N54dkT#H9͕-N&`nJooYe.Z,ߖ 2 'UZO.n$;4|fQUG1*ܶ)+klԜ4DG""t)iiީkY"=7> }2@(@uDuB*!!5Ϟ㰩 ,xhBwjBi b~F|(\|ލT1=^]puWʩݤ,D5[r XJ !Q_e%X$ :(k^2Y8m0 !GҬ(y=ar]=pu'n h*p 7OW2154~>“6{}<>}0n6g0ܘwmy0QK"DG-jp!;)Xfaw<օ*@ 7( HKSybzgkѼ;\T>@ ̂@^c|1b,NS ]YI{s.!O Ò"D7]|8,K].tUޔGZv;j $S'ۯe WX2vͦ[.KAD;NתjכO%l/"** *D PdH 'bEPZPDF0/ hERDa(a?-D JJ*r%TUj_{Ht @I`BnЋ b $>ʁijPU ;g*4+T% -(,K R@^?n𽽾ȭvd7e{6 W/Fû=pЕQ1L \e(Nz9y/ X|(JNڍqp}hp!MJ'W`1оY 3R- hnqkLo ^">Y񲏵Z]Nt-/evghR蚹1}ij v>kÎsA<; fVf@ !ݿy{yVT0o^@6z|Qk-6C~>; gim 1OP}Iqs:`9V~P/¢ElD+bD-mXn}Lӯ"v'݃ofҀ^IݓrX(,f:zܙuFP, "9^/E)6Es=hvȈ !"n ;w ر.9R$QE0NH)1Wj}*l(&~I,6}w9:8=`1z,?c5gӫz Ш'Q@f@! &jjz?eTc`'@ܵ.ȁ_ޜz刯;Zy=^'CIIN/k;!! r;9oEyÔbvIRC6ETƜ6æ4ء^/!yrnsLC `?jwf ΛL7bfOw'\+u dmaɷm!UZ e5Ԗ`'z\"B@w|;</$/$ NۗTU~y[n0` +ZoC%ä#oz8 $l[]Kr{p햺 E&y S|V]8cL&Z>=lk6-ձe(8ǹ0G](P4 jqyp .'x`e "Fӝ`Z * "4SzsO?ύe ,D1ޕIhC,j6u۱&}Ih,d/h&S˘Q$T7S2XEʯuݦstST\/W;u%J&ՆCz(ZKji`6Xs!vmYuBRWoҕ7TUu4gP A oS/;c|iLf6$nӍ?ͅ%)oZP'Jqn’lowppu{3.]uSHvV=|z"7?o&M/QHL yH.iѐF8+pP%Pm6𨹬pG`b-у#|>/ĥ"9C z8Mf}V9 dض$~KCd\3SleVIYDK~{!H $r>2Wݖ5eJqZ,?; ھ쟇m휔 {3p7.ac8z6f T )|">|Xqp]`x: [QI(h\+_o2 }~ cq{:{rss3V/W;=nlX% q{1ʻde"M(wyc{sEw'}{B@doG?_5>䄀sf#Kp1&N=(߳~.AHbE C罬y[Twgy[AynX]5C`TjC!cCӡF:Mɒ $$b 1+lKLMDSg5;(jZ;}% |qo|+۪ P)ZP]7Cn}v% z{[zHХKR?,E~kɀBJ^j[FFb9_,tr|f'sABCqʋ`Ȫ*o߷~YiWOk񮷅*J!!߿HIb3DЪ[Yg~TlB_hy'PNV' ?䏰{F <^nAe5uCU A`ܮiML' sP6Jr( rV?uo-\RXh"*Pb%lR U[4!uUG <~SŔDPmILcm`PF#h`?3LgjDie"PK|YmߠPVΏ[e GWQSXmQ/X]Bن08p3Hq^0J (//ү?sݖj$Z:u2( ٛl$ NA* N v?)L+_]}(;ϻf!KgsE ?H ʠ:礆a;:3PgMذu+esჼaZZ456Į2d ` T4 KAaן0wTPbP & yLHwy4ލrYPILEj^^ۿacnúN5$s# W_+;`BGO߄S+7${Ċm2=ODfW?{зuA#