summaryrefslogtreecommitdiff
path: root/fs/nfs/export.c
blob: deecb67638aa94d55a171529053dc7096a6a014c (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
// SPDX-License-Identifier: GPL-2.0
/*
 * Copyright (c) 2015, Primary Data, Inc. All rights reserved.
 *
 * Tao Peng <bergwolf@primarydata.com>
 */
#include <linux/dcache.h>
#include <linux/exportfs.h>
#include <linux/nfs.h>
#include <linux/nfs_fs.h>

#include "internal.h"
#include "nfstrace.h"

#define NFSDBG_FACILITY		NFSDBG_VFS

enum {
	FILEID_HIGH_OFF = 0,	/* inode fileid high */
	FILEID_LOW_OFF,		/* inode fileid low */
	FILE_I_TYPE_OFF,	/* inode type */
	EMBED_FH_OFF		/* embeded server fh */
};


static struct nfs_fh *nfs_exp_embedfh(__u32 *p)
{
	return (struct nfs_fh *)(p + EMBED_FH_OFF);
}

/*
 * Let's break subtree checking for now... otherwise we'll have to embed parent fh
 * but there might not be enough space.
 */
static int
nfs_encode_fh(struct inode *inode, __u32 *p, int *max_len, struct inode *parent)
{
	struct nfs_fh *server_fh = NFS_FH(inode);
	struct nfs_fh *clnt_fh = nfs_exp_embedfh(p);
	size_t fh_size = offsetof(struct nfs_fh, data) + server_fh->size;
	int len = EMBED_FH_OFF + XDR_QUADLEN(fh_size);

	dprintk("%s: max fh len %d inode %p parent %p",
		__func__, *max_len, inode, parent);

	if (*max_len < len || IS_AUTOMOUNT(inode)) {
		dprintk("%s: fh len %d too small, required %d\n",
			__func__, *max_len, len);
		*max_len = len;
		return FILEID_INVALID;
	}

	p[FILEID_HIGH_OFF] = NFS_FILEID(inode) >> 32;
	p[FILEID_LOW_OFF] = NFS_FILEID(inode);
	p[FILE_I_TYPE_OFF] = inode->i_mode & S_IFMT;
	p[len - 1] = 0; /* Padding */
	nfs_copy_fh(clnt_fh, server_fh);
	*max_len = len;
	dprintk("%s: result fh fileid %llu mode %u size %d\n",
		__func__, NFS_FILEID(inode), inode->i_mode, *max_len);
	return *max_len;
}

static struct dentry *
nfs_fh_to_dentry(struct super_block *sb, struct fid *fid,
		 int fh_len, int fh_type)
{
	struct nfs4_label *label = NULL;
	struct nfs_fattr *fattr = NULL;
	struct nfs_fh *server_fh = nfs_exp_embedfh(fid->raw);
	size_t fh_size = offsetof(struct nfs_fh, data) + server_fh->size;
	const struct nfs_rpc_ops *rpc_ops;
	struct dentry *dentry;
	struct inode *inode;
	int len = EMBED_FH_OFF + XDR_QUADLEN(fh_size);
	u32 *p = fid->raw;
	int ret;

	/* NULL translates to ESTALE */
	if (fh_len < len || fh_type != len)
		return NULL;

	fattr = nfs_alloc_fattr();
	if (fattr == NULL) {
		dentry = ERR_PTR(-ENOMEM);
		goto out;
	}

	fattr->fileid = ((u64)p[FILEID_HIGH_OFF] << 32) + p[FILEID_LOW_OFF];
	fattr->mode = p[FILE_I_TYPE_OFF];
	fattr->valid |= NFS_ATTR_FATTR_FILEID | NFS_ATTR_FATTR_TYPE;

	dprintk("%s: fileid %llu mode %d\n", __func__, fattr->fileid, fattr->mode);

	inode = nfs_ilookup(sb, fattr, server_fh);
	if (inode)
		goto out_found;

	label = nfs4_label_alloc(NFS_SB(sb), GFP_KERNEL);
	if (IS_ERR(label)) {
		dentry = ERR_CAST(label);
		goto out_free_fattr;
	}

	rpc_ops = NFS_SB(sb)->nfs_client->rpc_ops;
	ret = rpc_ops->getattr(NFS_SB(sb), server_fh, fattr, label, NULL);
	if (ret) {
		dprintk("%s: getattr failed %d\n", __func__, ret);
		dentry = ERR_PTR(ret);
		goto out_free_label;
	}

	inode = nfs_fhget(sb, server_fh, fattr, label);

out_found:
	dentry = d_obtain_alias(inode);

out_free_label:
	nfs4_label_free(label);
out_free_fattr:
	nfs_free_fattr(fattr);
out:
	return dentry;
}

static struct dentry *
nfs_get_parent(struct dentry *dentry)
{
	int ret;
	struct inode *inode = d_inode(dentry), *pinode;
	struct super_block *sb = inode->i_sb;
	struct nfs_server *server = NFS_SB(sb);
	struct nfs_fattr *fattr = NULL;
	struct nfs4_label *label = NULL;
	struct dentry *parent;
	struct nfs_rpc_ops const *ops = server->nfs_client->rpc_ops;
	struct nfs_fh fh;

	if (!ops->lookupp)
		return ERR_PTR(-EACCES);

	fattr = nfs_alloc_fattr();
	if (fattr == NULL) {
		parent = ERR_PTR(-ENOMEM);
		goto out;
	}

	label = nfs4_label_alloc(server, GFP_KERNEL);
	if (IS_ERR(label)) {
		parent = ERR_CAST(label);
		goto out_free_fattr;
	}

	ret = ops->lookupp(inode, &fh, fattr, label);
	if (ret) {
		parent = ERR_PTR(ret);
		goto out_free_label;
	}

	pinode = nfs_fhget(sb, &fh, fattr, label);
	parent = d_obtain_alias(pinode);
out_free_label:
	nfs4_label_free(label);
out_free_fattr:
	nfs_free_fattr(fattr);
out:
	return parent;
}

const struct export_operations nfs_export_ops = {
	.encode_fh = nfs_encode_fh,
	.fh_to_dentry = nfs_fh_to_dentry,
	.get_parent = nfs_get_parent,
};
{r|K1o7=텽YXb .5blڵMqܦ!M5R1J"j뤝*S7L4>LHt Mf8s|C;zR< ;k}*B悞0~j4ϟCtlG1W[N4/wjy\;Z!wl!Cqju:'_CE*.jmͬ52RǤ;d\xh6Us+i۝~p9 r,,bdsc=h{gcIda^~AM\1r19͠L$DJo'3HWG%{[gAIFّ3؏>#RBK _z`y/9hL^ҝtJ'RȒgT"-.\ݵIOs,[PM{l H"]v֬LsH3LR/QQ]]N9j]{xcd"Jk!/ c&duIzzyCA. }86.0 L;?qSzrmk-w(Uo4[f(ZУ0D6 &P :C1 ,ÃK.Gp>y V@bN*Xv4${n}v2旴PHѭ׶- tҚ>X>ǵ k,Dz~ɛEǷY09qƞ6spll~) J .ץ8\{$RSXO/ofB2^w"5~#oSIA"©%uPEr< !Mm{ 0L`6=]ބiC.*inc icFTgEu^Hra]I0֏݄0@'Poe勝2,y~ۢic<8Hątj<s;xCT#-כq ~kA.wjRϨGGIY7{fndr _JֺΔc|2ŝ,ENc fm;C{Ɣm6:zџTmT'[kN{VI,ɤ54ըZifPW8C6НCMq@g BOn<ҺLQ l4=@ϐHLCHZ&J=H4^][EF8bcK3i tY=%z*fp,] UŗmK,#l(-yC׮_gR>| 0&m,1,;q+{_ۺb]._iWDR3z弔YJ@Wm0 [%x*$ lj0YE,^[bCjjRR,~jNSW1 dX!K7ܟTS|}<^b'1 .'$WMj |5Y ]GH g ^ -Yk/p=]b_z[l#ȥ1Nk)CS0j~M`w4v*~"4`}ƀjDW}8rbr9Þe$Enp,/Ck=Ϛ8 ^C)49~f>BK4ƊPi'c)IWA#?'h˻c]UB=ZڨV8PAYDl5CTj*mqCM:j>ׂG~μ(ɠO`lrgqu iHP Pc2o476ҤY j5Ew"_DZ'uwM8N-cQSE)()uLg=i9&~I_5%v8)l6+~4]CPF+ KFRʴ mJmj5S53QΦQzbOjy{;MUkF@gmt%{d6]$L` 1vDZ, {; N R~zcqvqWE_K$\tD]bƁvdcuh \nb C M`Cݓ&4kݧߘGڑ/8z8YG% 0v7nO];z=hv1IP$"LxTLԜ٨po=Y %ϐ]dv>᧚ybD. +R 7[)-V*9tR+kL>GѨ+Ւl5_AZyWb$ O)s$uOt,JG)k4!O2SBpC1fCP&V6lsĂ۲P +[Ո]&֣C)-_Ȍٕd39Ty/Ww?ӨN2>Z >|^Lk#` AAV/ £LH| Ro7CX e6O+U4Ϳ(#H~=,3SlLJfOJ|ijbh)M&NҌL5y"L`˄}>+:'Fm2-qY >vq tJ/lO]obJg"RzϼɱNy"4>52ۨl\]$p&f`lEXwzrI:GeA*贵u=/3f =}h1`;}L"44>Zn_B ƣ#!VIFRL } jsU/XAF\f(`Co[܄>1xR$tkSxs)풤.RsH;3>/U .iZ#S^ pܐ.ߥd$$Cxh8aq8,馫S2 ra W=Dq}߸eCMEs Է(*w;ɓmP[.0.!NQ_$N64G*I%rl{_s2?/JV -ӊJ Ҋ-G;U,Hr09j ^q {R`- QmK<dtsw/kU|3ccᵳdtnPvx2+ "C~ O,vb-I+HizH[=߃MX_E!J4YQ;zV RȮ-a]чp%6(!yaΞw6kyEz3#|&˧Rr}|.KDH͠o$PP7sU xf>}m+x@y1V$%-bl p[0+ćȀ2U7 }5O:(8]8Bj;[wyru@^X7do[B-j Y<}VclJpYJ+։(Wqa,Uiq P'jwPi@aǤ $0u)zg-|-Ns 8ХJ*n7 lE$x'D'3d -B7b-%{ 7~7ϻ $/R D(p~`M)gz'%V<23zvNu2QU6~ȋF oD EɃ [cI0#$VtŘ%he]bϑZ>Br)k-jN\96~o@J MZ> E=qS!_fx.oRjEt G|#k 'z& v܃>s_8$%w(:6Nd lhBfa-)#Y!HTL]2 EJ.0N> -OFQn=k똘U}|W dƒ6O}NL[-g{q6Lh"S?6AZ[e|bfȕ}t>Ԣ K~9ej^z܇i;]xs[)Ŏ=@9 >@w3tzi-إ*m fOF']H` Y⃳{ ѭz2yrYnߤC2wR_+ܥq ɼ*?M])dDi{:\Zh$v"$TgZkdV @84ӒEwS6G~:4rzVp ?f8 k */i=KsL4yK,Mׇ} Eb -E0?9u~f|}RыH|  t^&7f'3ϡ eiD܂1 @dY+ZT# <$^AVԿ}o98a~%ۖd7J=gKh'~(R+3ĨJM<.N$c(H:`$ Z` X(V%L;3k)y,ĄfVb6"K/Hй(u8u.Z2&K]yڭsS"Bժ"Wء x'jYԛtІC|= V_6U2&U l# Qi 2-+KٯMY8F˝'[&N3 Odd<hG:<.tP.l 1PQ8ӌs "tȡF 4x~gX|QƸ NI0|B8s}gl2EbvcZhɨFfȢ-<22vo;Q9|OBfs Vh0y$XO!֥EZ)ei{sK >I}h=>+zTk L)ǣQIqt߲AezTFGb|5بK2Mol071LQ}V 0"X"њK^L* ǵ@"Y-C ݺs,IH_2&J=|pmceڝJC O.RJgCP7RX-V~ 48"ԳEgܾkw9<6Lǁ,%d_fL:,Lo Ά@>n xktVn~i0z C-Y }'IbY+'򌨏_hiC0KrPn>.ߎPM9ϺftnN3ۊZ$ гST~lh(6^P8r,D@.k!R ڀ[%"{zeJ y;Q}.Xл p:֞K,|P?\ (z8Pj/3'qI}׏N=41 m=}* Ms8>LVpyJޟ6x|y_s{[ݣ, %% MgԄA`;4m9Y݃F.~ &M}jVX%lx{IK1ȰfXΑ_YV;n|ոzSZE|"OwaHW&:Jik5zW_Vˤ+Q-ZXC aaڽn3^Od^Hz~Xo_ʦMUsFNH uvE]@鉊g[2?& { OG\80@,N䒽63MAX63tgyŘ ˞XMRm+jzBsdͣ*$+z. Tp[ :m{~o&0% րF1J-&DnڶDua3C 1~1ૻk_b˵е$pȆjKU/GZ*cmsQUJ$'!W$GP74 i!·Nֈ]f+5B6Q .fl9^-ID9qH ͐8FgG,K#Bsfx2(L e%OfjxjG),h&o=Y=?@mW,RK8z jzi[{njd}ݢ ڤh9 x6}z6~+ NelnS |JSCL s~+_79{:.NS7Q $"5šV+[K|=Dk覯\[rʍcY]\p+O aWkBq }} k6H7ŧan@e8n)TRz Ip%a_{OYm_kO*&zΏ;ᶴU#GkT +MfXmۣdjږ.lj`ʈ qqKIMbaWTR7$!xR[!}K#g ޕ#!D?BWAKդ&6_L!,[ׁ+\K)_dTEl.R{v8Pu̙eAv°HoOZ ~ay0~MT+I*ZAujn+猥sn@ s/[Gt?00EB+^ak[9k"f$7K.W.G'#4|s(?W+݊Z;{RXcO9c;ʿꃵ{'!wx>m+Gm>lHO]|ZQJuSZ5Zh=Fjfd Hm0N> c<ݞD,mU_xA-$GM,4h*ƫ[>&N?EQK4?]|d9Pت,68j[$H "OڙCeRF \CtOu;C14JtЮ[z+1Y\2O*n>F&Æ; WIx:3skU~L d6G-PdL 2K8Be.~]qntۢ.l= ꬓBAtbwhV sAF9a5f>!hUZf+ Oy+& ̮W&P %KHS{|H OECDMjUӽ/~2Νm b Ԓ))v$-U"Co|3.^-eBјp7BM`4)ѶȺ29ǵI;(t'';Ʌѥ&0k-n>m3|3e*{ORӇd@[<< qӷ:s+/VZ&^;)"8, i+$yp,z-7&/`K ڰ_qT1xMj 7R%p=='gXX_Yxtt~1&*d*}h6rd0豛,F19ғ|=gjWb,w g*lt_7Y[xU1Oo;֥}`w2)l ̃40wɋ|%~sa#ᕇY[\ZcRA W>ĕzZk !VbJ[ސ-8ޫt&9lAT+|P0j?L V Hё4jȸ0fLh_ŭ'Z-Cu Z>QؤbTg$I`,t316%\X;]8{+wƯCz7ezd*RLT6f go?rud5SjHxث_Q?&fCM֋E!k(Svϻ{^Lh#kK |ֿҫEc\u rqV'ͲUU+ZH@]_pPh~r!{%,<}VzKv 6CzٜUic |v^Yq98/|p;2%> 0+Çxj5`v um?Zܡ jҚ 25w]׬;pDh"]smIWC7U~qQDV"0k!J8;hrtm!?{b%9!Pst4!ǛRwA\" VI pdCKDޫͱ26nas0ڐ.tHj;`5 lcA$aR/[vT͸};8*_ KT7>P_!s2-״ݪՇMլnTǫ \4(Fqp9]AY@}{{zmv.an2fkI s!kC%Rkۮe:o%!cY{&#ޗWGifFW!zW:VvoUU:P6զPf#z_p#R!O'U[bJ.0eԵ A Ʈ:W^LXЅC+Uݬ6N5_ϫ[kYk$;x>z(Cqg!-XТ9E;jڶV,fLݏ]\}b91s$W]Hաa-CO<9{pS2|)C=6`p׽'7ޔwo$INZ֨>vp$޿?nUZA=ͯ)^εb]젧MY\6'ݑ52[( WjG@ǪiOzԻU(fԆSb 6Us|JPky#ji .^6Ҩ#{A^9_Dry45e-\l .2$&8`o,Z_С,B-CexZ\K+`fwá")Ad hxo#[VSvfTy ' 1t#\ӊsHĖ[N 0+g*@ׇOpYi ݎ#0U)M)A<s/k+4{$KOR' )4]J3OXEnSr`ZFh~Ålϙ>=/rJF&ڃzRc&$;" 4$([RxEÓf Bs򧔣EITdB5Yf9C1)[> (fG'bE?ްuqodyh&Tr0kwHa&]Z]J,GX+45O!9RM1ag4y4"BFaELIC5T|Kڍi:FNņCJXZZu c^cxK\i])Lj[BD0h42<;:~ܫ8EIRA6A3i~6.mw~k&IU"iڡ(=ѳ}p;H|n<|.?}ЩU-a }$M+..v-:d-D[' IVJrmO;ݒ73Qۂ '~,i>W/" mZB*IUF(4B0<-򩙦>{rPk'LJxoggOS &(FK )1=4 ~t =!wϕÇC {-u?} ~ TUXMI5$ Z`ƾCPpFK(]HzƢq[d%m6o6lu(h\0~ lXj1l$QՔ`n{}ۜ ^ C1Qۛzo)]A04YfOWӇ1>Ștl$u;9+s4ONIgCͭz2s3,N;bN1 0 7m~+$ϬN;5;¹:7Yom:|]a@V6ĎN%'Ykg?\s!鮲 8ÿȗjb#>ե!B~"&S ,!YpVW1t^C$' >">o:jGګaQd RCWku$-uNf]o@xtk7J *#[,'iXAt n .6*(35m)yuhK'}B&mVR$N?}n l>;x J֩.x-ّ~oC>rͤd.t"0[̧ow1H^ͻv$˰QmܤOI/ x7\٘Mt6,h>9̮leވ(L'-G ҺblVKZ hNRk+^kF>J7`08-<•R2c{D3&%v)Vó-0 Z(qM9|G>е }=4=ݝVtڣƈ`F"1kXAGk]_{?CN흏7d8DFYsk(Vd KcaJfzaHh0Jʓx TF"^Mb^SCHJ˞R$='n˶|,G:XAIᄢ'nˁ?'%)t:{/^>a6h2w[ɱ'j25h֑;lCEnﰭVf!8CבNB>n衷G$W4ʂ+N}(^Z :8l  9c5ΩET`Y1bIv0CA:2r뵂ķUX`.S=u (|#!7,!kl8,A ϣvPO3ֿaI碞T# τ3_5@s&Ogn7&~tІ;Kh Vּ82_={wCEi(S_^J +ڊVxDϝ}i])Mۇ5]!e= ~$jw>$7;' yP{oY>h!<ҕrR'[K^ڕ%2 `%G 901[I.dd]j~S4Q> zeھ͌^9 } $A&7>߹˄4&f63k0˒ @D8uZ_l\,Zvoٴf|-JbRǼ wӃM&_o9gz/2Lwę]ӈ@pN0ᎉ3"Hx;0\Xc:∷q,1X0yPz cu.ݑ-E΁kR# ԺH$wؐ#ZCx_ĚK9@w1<j8]k!_@GTW~Re׍ ~B z(C" +V{xy_ibyMl(A#H#{BQGC_XV"`8|QC^\*uSi<ˡv%fS ZZw '9Ui3vfn~oUU2}xPʠ5Qzup)kI:Gz$ak@ rٽNF+*{q3)#Bkp?gdQ]=?Ț6*0G)!)!OƲZ6cj#ޓ @I`hDC5 m5ȟ3N5FE/f2 cu>Nv/C^SM-q'$,5`c'ga ~h=Y]d9sv5,hA揜 ^HTX:X,R7fymij=A$6Ly+=rw#_}FB8|tgA2,jk.#8\j[inMbݣBhqD0(DD;hjtY[bϏC;7UzcA5y-ц=jhdFɲ"(Bld7 ϼŦDozgnfb @>-5N&|b ;6: f|I:!GBf"eR皚W&N6%Y^;Aڥmxea(re 5jMR2; ]8R[ARvkakϮR]QWfuF`Y[6>7H*ȇC& VP@L*5`ڠ_3T$wD1Hlymmup9 NWc!T{6/y _ܣP?XdgUĘ&w=Eu8I^ [8I=q@<"}2fFhR3؅D_Z1܊+@VqJYЍ]`J`Nڪ@{4`Tډ/1y5~Hx*fZgngj3׏|_oWGv'I 'aot?l7i& Ȑ[*=B.(rg.Jͬ`R'NusF|D5,żs#nj2D˞w:ey\0mTGcQҀ&A6wSSURpD$NԨVr{V{ܳayFJw5Gs9$@]p,tmŃk j4%)>owԧjFduIboa>qwf[TBIˏuә-CT:hG!цQr9t5:hEQ2@هLXoǟfIT=pb{lh͡%3F{7]kSo _joAL"st|MF"T{" `:ic{Z嶴t q$fKVIax%YC9}1Af=dCF0MaeR BrcѨHŠd;&Z,0fq%榻7z!Q]>1Ǘ񽯇1o>g.tcu~Jou+P/AR]+*!n,2 zrC?T)L|;SWq*HM3iX"'g%O^Aj-"@ZkJb!H},-|D$=d_%*y!y BWV[xjyQc$;(< ]f*wzqޯ̧z>12Zj;yfA9+JMX??Y,#^i9s@lkI^w23nF]H(˔?r=\:_hUڛM1,Ŏ_l0WM%̶63:wQs<4~!:1$2_iP3ZdGNdT:V8͆! ;Jᄻ\t EMP-K<8~,xhIl u*L&H1-̒Ŏ9Y *iuG dv6  -ν-*%aC)TW҈ug+;B8iX9MdCt7k]tF)jeVce@q3gl[h/X+- ih4j A\B9(z/mU:6`*zIZzǽuCO&Kgz>{߁--Vr)8tn=#KIJ%$馉Fg%~n<Ӌf $R; "8-S7KbK3J,N{_ 6-P;4qlC?:dJb^ t|y2u)>u4|<*<4[<nto'+8 @Necnx,)Kw|zW#vBTmpdu VNA-֦Z M2Cw1҈y r&k~xR[8ssFF~nq1'|j]t٥`xa݌$Y=Zi^A[I$^ P"Bulxg`с(c|ַMG2P8(g3\7:rhlnl@Tٙ叶biKr]ۿFh{5?ddBY(w;p=֡*f\/)Jgg|!drX-ΆI|!n2l|='q/\gҥ߸>,#4zCM!]9fâ8صB}k/zs30of. juT5auNQ 2<@pBuM5;WQlj#qSW3r3M%Y>G l5ÍNztQdGPf!VDoݤh@wS?Ī˸Ո\\MGޠJtK`D.4ۺ"A4:p^if=ɰV4>,LJ:H#,@99#_@~d[ڨiP߯[pWb8@[gfaK5 ŸKZGN_-`'>aBKKqqk0bGI,F]sɊ5m@xjPk0S_wZs1"T]rHl# /4ۣH+g`'{˿DHgҏY_)0NT6]՟o9C5Fkt'c>ԿjMWgR˵P̓Rt̜z;. #sIjy*]rA}wQ)8p($۫Na⁤#tR\Ahrci VPW1Qi0Q<!@ msg>HF[]< 陡\1i6ȷ^6ZR& AZLǴQڕ C3TM@;Ig9>ОrCFFf#_[ׯ>b3>3]裣 {9wj܎F#J?Y;y;/GJYw:@.M\rv_W_Hphڀ? sk*H穷LvCo%?kҢ/F LN:H Y$޹B| ! "~Y#4qo-]*_Cox Δgv{Zl〱D>Eĺ"?ay>A;SW1vdHTFhHsѐEый)`ׯ0=#AJgXUjUݎ ;+MU:]ZMEvؿLkkzHnQ2Q&:.$-y6ebœ1:>`;RP?rfk{ {#44TvPF`VMiP7'x3F|k֨LDT}Osz\džs.4?4{53=>HR>$%765WicG@/g܇fG]gb~3T\sZ4/gؖ[PA #=^ok#gw\&X)r^}khK\f>||Da>> jڃzKUƕ4Ȗ' 6YdOhwL}p _o d"YNLjB_A2wy pJ[Sn,!)4(e`PJAe{A;tBx~.mtBrr 1 9əٮ{K'@>" ~#Y>vH)8SW:Ȣ}9Xt<ߛX #.M2bH>ҝZnmkcgGrۄRzA4g[4)iى1}nkWg N3JCk ApWMJ1:mzՉ&OY?4jmxNӮ7iѢCZTm}3 ܄F빹]i^@x~^t7rr{qr{&ps5pRyl T7k Z\ 0g176풒ɤD?\ &H*ͣjm6FS?2ܲ}axH]?_VZDH4+ue=p? \ t~zYz?Ŀئ͊_xg?!]whVU$V ;R~'+eѳ?XQnC׶g']`iӴ=@.%VjbY4 n]m|t%74-alk)}{@F#K;BRz3,y 3~ :2t6X1r'Brf)5# O\W:7)Fr}CѴH<"%eӺV@C+7_/?;QBPujV';}|TFyJ5އӃWZW%rBYNs0?ШpZL!ٸҟeBN*Ӑ{!^lw\ gFOR>]3׀?E#) /!(B ϝf 9Q>x\dt.l9TVV6}wAEݐe#J:t!z͆nlwծ~Y@2ԤSU[\5ۭI8;}G/uiqA\]Z d;a --I5P_qg'śj sׂk ǣ )nVݳqΎ]Pﷻ_9"pˉ-(t.W=r'P9xoXpAf[g x8XMđɑҦ>I}ԕ:K= )W, g{-"Ӹ0Lg24\&PXmi6\ AR{ggE1yx/ArC3LIGnboktTKvVvtCyOT4}M_G*Qk^ {]!_r2d8n՛t$[dkju2wFEuA5 g(qusW?uy8QfK5CH+AOeϞv ٓCԳ'Zզp!ZOyXӈNWt99jTlNޅ{ / g֞g~o |K ||-Om9$.)s7*mJOH rϳͲ 'P4tHy31M9e`V̰dvQ opnYz $_&tcdQl?^&CV Z[0)TIYXZ^XLhK!aHV{v~xG^yZ*~=ppIt򍚶v{{?zm 9Ɨd⭕d[$ޞ0ω>:d8"A*v=r C } T^hu`L[ڎTm*Eԃ.}lzCꄾGV-=E+۰F[pzK[8I'd7 Q:vDnD!ܫGƪ=VR*ȋ&}Q9P^47P%.0b6GQҍ͉l4sfɺEDEýO"_M {k:M#qB":P7escHyG{BvW5 ȽR`*Ǎ:sx|tcaK++s7.aUiYpk)A|lQ`!ĎӬ}3%?'8-=] S1⿤L|,YG&yˉc/6s-C<~FUvKŜF.=>˻%4Igu׊᭤=05m"3|&̹y:1t*4j}BJdR}> ~u\iNOp}0~O_V[-?r/{>-I2 8Qy9k9gIrHY f>79pgB7.(lqyH}߲ W48wГQvmZraRȟ{S"w$W=Six5.? ].o%X}\:H_, S1̠6"d :Ĺ1b-9 5 ͘ewHzW:%sP>"]$%ovJ?ѝ&蜻.g~n5cuƢGh/m@.!dbR 5;L 0Q;3]^).B~dl`uջ~L1S Q_Kφ%HB@ -:=ހ d&YE-ayN&0(H* l9^{?Ymz=gd/w~ CHc%x jL<1kג|0 !gpX93MD^c› 5-0.'ԟIisn݅LgxHS#U(HK\RH%9 MPoz4Gtqߌb6-#fY?u]QWv^u$Y taZBHv#8vmi+{OVܧ-}ìCK9^&W>T%~m!s)$'wUmT=I$N*N&`~MQ ٰ8gc0(dT8;w- bIb~>O\P@o/SjdK3%Sj;D%6&8 MwIp5.:w Xx,5|]ؼ.1u{UmHtzEȠ05P7ΔOơ|1Ӫ^_vBVg[Ha KKP /Vitn m -"W2HMj JM5BLߑV&_G4HJY`p!©KVUWaaoWOf\Y/ء_%ΐ${zn3p) 8*.EbQ&DRT B8pMVOipֱv@ᛒ VAiaOpl:'VA$J/+ڣ9GYX1<)Coɐe9FjA>V[ڭ0^E$qI-r{!n94`i3D3e%RPIQ8y9]vcok1FOZ#0<(=ag0c x W C7,d;*(5` |l-jY󸶢P=b ]JH#|T}1H'AhUU5 ;$.X*c0F<"euc.s0٘V6IQ;T N L&k̡ JXfXRmZ`0NVe^Ma4>L 'ٔOR:sB z=jIutːxi`/[y^2;3Ef՞^nKZm: 9zP/I^X&urp)ߪ7}2e53y. oNr_$J~bgMv{W>x+L{'{qi[ 4\2|ah+Iڣ n)ś6a'8h|Ҋ6D;dBOЎC >k!f/,6_={٧׬F2VЁ~kU$zk-?H_U&cU3/ԅM1V*YLάʄ_]5 'yz~>I| aF恈}̆ޣ*Ju3Jy\$6o%59A:zQo1gx."K^Bn"dN)l;,vYua{A_k^ϘƁq{eLA' 4AzaN.4u"/-@QQ _ln'UM֐@+0QfL;M+G}=lQVj狒,< {bg4kSj< _fz>QoI<ނ]XMf0@ zAǓ Ide)8$TNj347A GP@ lK4+)4MaUu^˚ܾYԈ?g!V%Sх1 |#l,5Z4,1F}|!҆Dz"e;ɤ&nvƊոmƀ$dOV[Uƣ. D StX`>#@؀>2׎xΜKt"2̄~Ix% o  |p\JT:~qb Q)[|OVNEoQh+ΥչO@kѭ뤡Pϑ'ީ(#D"U~)z8&x>C]TЎهKnT$`ʜִFZ:#BJؤ7ݑK w(eLxNzrMb;8]$Kd* m "jCKVU[-5iͯWxGr:J|7Tܕ .֨Lidc֪[9L'ycEri1Ib(|.V_Zd.K~-iM6adv!瑴kPZ}_%YT$:O>M"* NÎ!H2+k7>{6rlEL}HŽ`l=WөxI+1I3ŎښV)|TL5͙{'QεP4RhmzpiUj?Rl~LU%0PG@7T1'{ivP Dpe;hZ(n{!W)GTC'+~ Ə/@mjLVuUzЦ)Q>lY[G^jvE{ƾ58eKpsIjω#yʶ'GN^C_Zh ۶l,z$)m (v{Acf(RI腞uVϏlxX#Mbj$LB@b5_pIJvNJ7#`l# V}ZYz=*>u_R[=Q(+];Ӿ xԬ4M4/ 8ip@Wz~6A:AL:w,w B^.+gh[7,%⽳&rs) |2V螒C=zץ8_mZl~E'䅺`reuiٞiߋ iYH%Qx=-NنBX08p&Wʥ'4h4P%YiA5^fp(p,|Nґ9(#>~PK!͖ݬ١Md󖇵PX$2tdPmʥ53-E%FO"i,g\{څ$#_!GIUWDUeԨopIJ̤a\a}W8C)Y]F{gsSW&I@$6gHS skEjb`_Aͫjj2H0<ڬ5-L\k|YFthlgshl#'Pa pݿzB. -c/dFpE:ĐA$v:Yq%f!b;Dm~I˱:N]b/64@4nTzf71ZIL1(sH9p*2vCM݆ꂍRɰPjc NĖ ̉_:S9aMEk q33k[^|H*ROJ/vCƭzp:5#67&? {;ˋYjӵm1%?R.L9/6mnYz4{Mraz_7JfNN]P>)+>uW by & u6"La0<8 ʧ5VNETeԟWa&7+hsL8# D#!|)|ґ0rW-Ε|.2&|ҸSkqG/)FwFze &5+Vk!oUe"nE5G6 [! S2rŐbc_8NsOe-0vԓḻ. j<-9vr5!Rَn@~?N$\V6ކhR֫$+jN'Y8K EU`nYЅ @yZ&u5wZ6[ ,gCfzZN-iS07p>Ԛjӕy|WTOh`j q0̜M YۯO'LيJaUzYaGV|\? 6BÐ EѱA:-;ij->C?9L; <>Md{cSAD7IpKGնATZBUnՕW+ݜц' ;sĶha3ĚgxBi唟`\Y#Uџ 6bN=?vg:ev0s+z+):~NؔN2ZlL>/P.9"os06ig| ZleMOM"CΝqn?٨%n(P 1LI.VeM6XU~]` >GXtOk^@>ZNц~nF2?oIfsiبfFB2kEDJIU83wg˪U:J*ouv!BŀS6OKŷ=Q9γ(ɕ̞k+@cD2 d`)T[]3͆458%̔P/chc4#Qy [05]刂;G7cuVƣTJv3O81(^clhQSw-C+D7`:/F8q@uM:Ӝ4K'A8c+IF-BKbX$dzw \!Xd*t rN*f\PjVg(ѸRmD {9aS,Ϡ7hkzCRrP-P *`X}i\/}r^hpFJ퐠[ VwB: hB.wL[Zu˾Ѫ>. ILWz?N r&Rqg2 \O(g:)p48r7DtaHie]'9s筛/auUј-f %$}HwZZ$J'_ܒDD/3JꖞdK^"A/#C)ޗqbI 'gn_8u55^3]5vKbռPnnms]rkGMG@]wfP&4d6+z'aӨGz_H$8{q,֤oo Tr5Wn[һw}=8:Rƻxa% !}@P뵁cZLgd#83Po73N>!{G:L6ໆN8֙BjҪUVhZ1 x! F:Qt 3NaŋKθdr1?!m?cLkzB ʟZ p5qhWq%uDS<4gaodA׊fO#IA@і= g2'{az 'dMZ _t|ڱ&t3K.8+S mTī.6]fd/JY܆$u>Lْtco]'~7A^%vZ[?Lll%6bޮLBŸNm&vDs$ aAF!i'>[+5My[R?Nj0'=<. ,K1CRO؁n$h $@m+*-=9%􂏽"!<+n(,F-՚rAȿopsQ4뤷u^m/F $B;>E/mho<ҺxZoj5Cp\kʕ}wW*h__n}vR 0-pW#^WȒ+S"0eV=r5%5]Q D- rdm5v*#ԃy]h?ytk`˦f&Az쁔B2BL,Td3қ?]E qYzf'QjT֣*1| |/o(E{6AWe2{7If_QT1IꖾޒJXּ:GZP~Ƭ7?S?R&?Ht#f }`xtO/sc$a5#iΊâ Ô~fbI#N%!Ċ1,j=x"i)! AB>eyʵQߺKlM\߉P2n0*_N걪ֶ $oѳ3W}ATq:fQ7[Mz᪏E@BLd,{0>[67,cg R&ëH[0= e~c8L;!nRܢe ެM%l#gD4[cYJ$ G(.uQޙce s]/ /r\K-YRĖ8ONxim 6<=+p.ʤ(])TZi%,&o#98Sf|B鍍b(R &+ =XJ*tyxѾvԎ'/j$fΚc?`__a1gDG 6~xi F:yMQ_-SmIR'HxhmB;u%s8Ta8Qbm54KcHW7g|-;/R2%EzRv"nx}j^s?5OO+ ݩ-G)pPƓlE H_0 m;S?P~iy߱xA.'l XL!FxWLģBgՑFWwՔlQ댜m4CG[;,og# =0tQRJo 9&VMC& Qfl/b$ i|~WI008c9nDl9s029Z5}\!xQՊۥbvѓjƗ3 fz7|fPN7qc"KԼEסcaE>Ne;Q'{cg3xt=\btkMaǡ? $K$BVU?;T6: 0ʰ(DI=-Uz /gl,*\E[r{d$1#,:ҏa*R_)_˿4qgQ3^Gf[8:s*kZf<\* x+ˍ t-rg=Pٕh;46z@-]oA=>+)T~t75x$Y NpT7q醘 \ZN눃jtυ/[\9U{|~|(>+JZ 7+GHDCZ{{狹#dDx.Ӊ Puq@VE? ǒ Gz?3oP8x;ܷly}`0)>s}InIw45?P^7NA n6K/TIĄ%J)Ά4ߓzt蕳%c&dEŜu߂7i Ö#1XsG0 x -74 5V_${%_7VзFd7ۮMN[[qB^ؑ? +xcf:|o4"EړI^Išу#@377Y8>٩_Fwf., oOa rz)v $6|kG8<O7UXHJLՁ>Mx܂y .lZ$xd%ʩ4@e8.RDq|=rdm"s4cq|#W;E17pGE_Fá hqz[Zg̮|x%^]> ަrC0v \INSqIO 꼶2[ ,_[ae@IʊKoʊ`]K 6lcئAY\7d&ߐ_=]O.%%je.ONoNƏ.]ړ*G: Mj @8$18хQʧsLt4B8ٍ\fP0w۩ҨQ_H#>q|@60YX&&%n)dID;8E}3xmrl8MAGp:&9-eJͩ$KB͇egxw;hACYo$uΒ(Pir %1vRQ8̕ wĐ8 nfT4>4] ތtHbX[stJ8\u.a%wg*RmDb7j B4ӑ=LugdxNΜA `ӫertvM@`=)"`&X /xz7#.5 V#%ǖ5 Zū`A9μC )--5aYdT̹qv)HǙQ2JDb0%?ΝF 2btaZ%)%q$ X<|[axD&9Ξn.mzOPܨ9F'/6\0s.4RP^ , ^b64FuRu[0"8E_6Y z/]6XD_0T2 .Ӡצťy+&܇/ҮV3YyS# SKwJ'}:|# 臖s@27tDG>gӷkm,d fbcb;`|"/tqO6WBeC\Gc<zdⷞq2#X̸F:ƗMaae]p^:QrF 6vyOW\>cD~T^la_삯U޶ki@Bb,MƎh~gC+_{-滿@aDbDڔu"xʻe഼ Y<fIT=G=9uG:$釧-=y4ߠDfeCz[, PGa]ybeތÎ}YY}ϨT'dqI|?9a{3#@xQx|MxD׳HHL«ֵ~3LKSvsP D_=߾:'RQBNTz2އ\ZʢI\[ƛ~EP8vSN#kyLwsG6~?9+S&s˜K6‰i:Q8 VbɊ=FMyXngШ5WdCj]Ġ9cmn9˷G:n3W8@f 66:4R+-㓅1hU+7Fެc!ؐEK3͉G8s"#?HH= <Ր߀hq,>$хʘ8#*;Y\񯥓ޘIѢƖdK#.~%q4Z[jE1-6ZB9f_:%gLGP05F 7޳ox)(ƁAbV̠3CZhLe'=iA*tX# ^j24Ԝ,2 p !caw.GVȤtkdq ~?y)$>FIvuFYfPPYQ; =S#1 <%p_1o>eV:ra&mbjfΌ.* w}fJrɏ!$;lL8I,D:-Gs:(L`{$bpY^buu#wLg/Ŗ@Æ?J۹!bs?h'jgdh u"#6"Y|$'K0MaG)I1ʏl <^;kΐad*M~pd(3ӄP5aH!iƛGB;L}}(GOFbJ}Ȉ 0Rp< !،fb3z/~!@6;fD܏m)@uowL*['$>:+cB,SKvv;GG1oyCi7H˙(+=8y^V G2GF:-N'IR,`cp?q3?>̄hW2.Y .~2g1s?JSrUt>GLz,CF|#((􀏜pԪ7BAb-/L4koQt&vSUV9 5™I ̀^ G6_:6+`LpTTZK6gy0 M"_g!f7xfޟ${}+}#wm_ɒR$o=u$(,3'(Z8"{FF޳ U=`ōZ zֿ lp}JrMhM]-q9d80`=![¶2R_jGNp'%MgA2پR[5®QP}"(2ܩG$[3,d ӗ|ݡjܬ↡=89FŦYK`P ; ..Zsuw9W[ p q/Lޗ! ;AGM"GwS迍0G^K^E=Nk*.SwP+A7~qA@LY#?m_P_z\#X:Kc,wt #?sI1z~ǨXnv&cv _:ZŒSZM-StJ&eR!"h x ۘ#czKc:l$Spd"˖_8hiFo=P\G97excuf%6N5JFpM. 26D hѰ=Ԁ[-dUxًbA4tI}ϸ l Pj .18.pYjDM. hʅ{)v}6F:գ` V ̠ϻe4&ƪ1)iQR ፣ }3{2:P\ 9sɪ cBwZJc|+D'͚\MBWl-bH *8BwO zXCR,4f @HrV Ѐz90ZNx(۔dŀ ^V9[gr: ZcKNcC#fgD($Jo9 x6k*%#){iZ! _uks}+7%% F!9QݞO,Az?`) w5t]hbiڼ@G&lN~D@C ^n}⓱I$e)—qp#yI'hgy<cUm ԉtҽ{ߝٟ~# ڼa0X"Pp\hv.1/GϨ%-[?$fQY\yo Fyq34USyIS5<0dǘLhkH7Xwss)g m ph’D! 6Dj\u΍]R]%=#O$ fMmGT./6oLaKԓ8:hSg%&̠NyLHffaAGbqQشlF_@X?)}2f{쫵TEԥf`H@z#+Po1iG о_uM68۾QtmiݪY2l{Oٟ L['RϜB@fWߵ^ML NuQdc1 .!ilSbpY5jo!*>\v2"!XTTldTCԑFkV ƙqet<0,|3v-12]q#eX#(`6ݠ]J|HX4aZyb̝Cl¶cg.ɜ֊9Xwm3qjB(O$vªJ4hP~M2g6>/zi?|(9N}/37=8r#% \ آ(E nHڌ$EB@3 QPQ'=ޕàv6ρ`ܙ|vzܛ?nR!%ѸXrz$ -4DYi[k.^ 6;L!{-ÙDak0!P%y,,Tq2a"r5zE:9HCdDZܬUT?Aw$'%w.b-:$qF0CCo(XHбMWnR{I/D؟H͵sy^ qĸ~m7\uJ~ȴ::c+=Um.,C0{<|[3YN|d(2}|5}-s5϶_/ ( ߿B'|*aW7x\}kֆ#o8{^sZWKxضdf_uϻy]ųʊy (jU?e@EsH Ojp_G€#E a~$ea2 ΐRڪE%ʝP(|̖O ;d2.f!7/`fQL=F4-H_=9ߔ_KJJe ]y›a#q7|f?(9Ch\nr!|quT(4A,0}0M1Q}=x^2賁?'>:A*$ BG ';*ۉBpf~]f$=^zy^hKXለEb1zi~e_U^j{nҏz%ݰ:d:BeLa1\">!vܩKʲWAX'8<|/j[{`e_X_~LPeë}ھ{H^c_go  }^9CjT齆S ;3fo/@c>MTmQ'b*jVw"fj6 \|{,")̆ۚ=7$q|i=˷<^Fw[WGk[9So:<7L֋06Sxts My& 0,$s vw lh