summaryrefslogtreecommitdiff
path: root/include/net/ipv6_frag.h
blob: 7321ffe3a108c159490ae358b8c2cfca958055a4 (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
/* SPDX-License-Identifier: GPL-2.0 */
#ifndef _IPV6_FRAG_H
#define _IPV6_FRAG_H
#include <linux/icmpv6.h>
#include <linux/kernel.h>
#include <net/addrconf.h>
#include <net/ipv6.h>
#include <net/inet_frag.h>

enum ip6_defrag_users {
	IP6_DEFRAG_LOCAL_DELIVER,
	IP6_DEFRAG_CONNTRACK_IN,
	__IP6_DEFRAG_CONNTRACK_IN	= IP6_DEFRAG_CONNTRACK_IN + USHRT_MAX,
	IP6_DEFRAG_CONNTRACK_OUT,
	__IP6_DEFRAG_CONNTRACK_OUT	= IP6_DEFRAG_CONNTRACK_OUT + USHRT_MAX,
	IP6_DEFRAG_CONNTRACK_BRIDGE_IN,
	__IP6_DEFRAG_CONNTRACK_BRIDGE_IN = IP6_DEFRAG_CONNTRACK_BRIDGE_IN + USHRT_MAX,
};

/*
 *	Equivalent of ipv4 struct ip
 */
struct frag_queue {
	struct inet_frag_queue	q;

	int			iif;
	__u16			nhoffset;
	u8			ecn;
};

#if IS_ENABLED(CONFIG_IPV6)
static inline void ip6frag_init(struct inet_frag_queue *q, const void *a)
{
	struct frag_queue *fq = container_of(q, struct frag_queue, q);
	const struct frag_v6_compare_key *key = a;

	q->key.v6 = *key;
	fq->ecn = 0;
}

static inline u32 ip6frag_key_hashfn(const void *data, u32 len, u32 seed)
{
	return jhash2(data,
		      sizeof(struct frag_v6_compare_key) / sizeof(u32), seed);
}

static inline u32 ip6frag_obj_hashfn(const void *data, u32 len, u32 seed)
{
	const struct inet_frag_queue *fq = data;

	return jhash2((const u32 *)&fq->key.v6,
		      sizeof(struct frag_v6_compare_key) / sizeof(u32), seed);
}

static inline int
ip6frag_obj_cmpfn(struct rhashtable_compare_arg *arg, const void *ptr)
{
	const struct frag_v6_compare_key *key = arg->key;
	const struct inet_frag_queue *fq = ptr;

	return !!memcmp(&fq->key, key, sizeof(*key));
}

static inline void
ip6frag_expire_frag_queue(struct net *net, struct frag_queue *fq)
{
	struct net_device *dev = NULL;
	struct sk_buff *head;

	rcu_read_lock();
	/* Paired with the WRITE_ONCE() in fqdir_pre_exit(). */
	if (READ_ONCE(fq->q.fqdir->dead))
		goto out_rcu_unlock;
	spin_lock(&fq->q.lock);

	if (fq->q.flags & INET_FRAG_COMPLETE)
		goto out;

	fq->q.flags |= INET_FRAG_DROP;
	inet_frag_kill(&fq->q);

	dev = dev_get_by_index_rcu(net, fq->iif);
	if (!dev)
		goto out;

	__IP6_INC_STATS(net, __in6_dev_get(dev), IPSTATS_MIB_REASMFAILS);
	__IP6_INC_STATS(net, __in6_dev_get(dev), IPSTATS_MIB_REASMTIMEOUT);

	/* Don't send error if the first segment did not arrive. */
	if (!(fq->q.flags & INET_FRAG_FIRST_IN))
		goto out;

	/* sk_buff::dev and sk_buff::rbnode are unionized. So we
	 * pull the head out of the tree in order to be able to
	 * deal with head->dev.
	 */
	head = inet_frag_pull_head(&fq->q);
	if (!head)
		goto out;

	head->dev = dev;
	spin_unlock(&fq->q.lock);

	icmpv6_send(head, ICMPV6_TIME_EXCEED, ICMPV6_EXC_FRAGTIME, 0);
	kfree_skb_reason(head, SKB_DROP_REASON_FRAG_REASM_TIMEOUT);
	goto out_rcu_unlock;

out:
	spin_unlock(&fq->q.lock);
out_rcu_unlock:
	rcu_read_unlock();
	inet_frag_put(&fq->q);
}

/* Check if the upper layer header is truncated in the first fragment. */
static inline bool
ipv6frag_thdr_truncated(struct sk_buff *skb, int start, u8 *nexthdrp)
{
	u8 nexthdr = *nexthdrp;
	__be16 frag_off;
	int offset;

	offset = ipv6_skip_exthdr(skb, start, &nexthdr, &frag_off);
	if (offset < 0 || (frag_off & htons(IP6_OFFSET)))
		return false;
	switch (nexthdr) {
	case NEXTHDR_TCP:
		offset += sizeof(struct tcphdr);
		break;
	case NEXTHDR_UDP:
		offset += sizeof(struct udphdr);
		break;
	case NEXTHDR_ICMP:
		offset += sizeof(struct icmp6hdr);
		break;
	default:
		offset += 1;
	}
	if (offset > skb->len)
		return true;
	return false;
}

#endif
#endif
t [eUf"ޭ؆uY Wp vZ08ҽ'x|W5H>2 Œ#܋I`!-t,D-{L!MK {gQC%b˅` NopG|11d.5]XƘVwur͘Oΰ? ]y8eF UH֐von_ ĺf"ld843 ߙWұp770įDte7⫽؍ZDe?Ta# 5+?zsk\ug Xc|m{e5't M){ˍmw|?j\毓o8Ǟ#*T_37F-*亐Es3oJ[:50ƱR<,`惨5zyTe.;:Ef^ 9qdDap-ʏ RP1bcl~L5)vtq|o6jiU܂͉.5|-#/r9^s$ъ_x\O# +nsR$D\̏K Vu'=I 98*Vj`qى{J#-4c&8U1W6mۺ xU1V]ң^cX#`Ul8bcV]8VH U\ګm[jmU[mslm9ZZJr/:Ns|\ګm[jmU[mslmy *{գ[jSccdBh6mYF~9ߚ~^^A'4'=:M ug]>lXq@`hfAL\b"J;mq]/JdX8.s/#*Zo:9~%KIA}V[|lrpӳ2~@}N)RC?XTQ$U_U0cj&x2=^b%ndF~4;[ft@\HiRK DMor{;ޘf13ޡ /J+<~2=Qvb(љf8;O7DuzsYZ">[֕r5 #KB _A&jST=4K{ԺhbFF0Tv7IO=q-}bJ qb3]8dPgwPPM>=c{}1wLGH͸~?ng3<*^wc:^QT c2$x(_f.lEA5 Aԭ|lsg롘q_DRmpf$UGONbn{1tYlE,J #Trͽ4/i'0oqѧhm"sXrL9 J j)Ĕ{0ȗbpBH$0K:U7S˿ٕ`j#IJ.zɇ.VaVP. cDH۽tFZ;{"Lt>=d n/ݺwnt"3BS֣Ԣ D@tAnp(> ́|`#_'_!{B@{y\!Vbn0,\9*|\d#ˠi__W|/6#M'nytEHt>ISnZFY QZ:1xz \Ī0=ڦƂ=3R D"#F+u9_$tD^š ֤F"x56M@%Bt6UE{lN }<>FsQ m*7`:y/Ep0Ԩ{:8%-K zw-/Mv?Nr}ɠ?'Dls%w5HASuCVr! u wYTj0Ӷ^nkw08㳿r`GX鍽!MF0Hy[9MSP#zZXʩJrZ:z!l.HDίX:$ǖnae3$:l@rnfNJ/C- <(Tt˂L'GZ_znUpTŧLcu~1{QOL;x+Ć]z:G(2Nnn++(>\+Jh|^λs)}rzLiͣ) NM 땑/5(vs:AP_fqjg{hrAxN06u E"'DI;{n!ɲ|{txt޻tT[mS-u풘NݻweӸ ՏO58ѭΝt{5Q^! $d@@)_Բϑ;Cyy.zxU<ޑ+NMvY(Կ^e٭AYK+OvvݥX HBc^J1;>gfFZIs&w`cgNxsp =xxTOޠgvmODytmW|zkã^ݷDi [R:LOG3blf'cO??^n^6Ljuֶ諨5WN|a1W'cÓ/>XtJkFٝ:m%Є3;%KԷn"Ӣ>qChOV*9tQ+_2/>bOF-̛h( K*pH) Ce /@ЖV%+s=111!a92BP}/L9Ge꤆]7?{ mʦyHv!fq3IgGJiVyi^0umlsWHeHp+.YFE)4(}&K=l26Έ$ 7aQ)a~"f`a|?#֛5sȄj've;<}`N u% XK6ocTa0D/XZo3> n-/S+!Pxd>G8HQ{iSr Cj,tFrzCBgsxrioνO?7,S$f)Ay$&B3~{pci j'UO?p=,X b 0E[skt/(h4~cG֭AJQ@_hW9ňJ|A0OG#}}#﯇5}j(ldsxd@tm%oTښi;j2yGb݅>Ɂ}F㳎@{'Q䋇ɜ5svGc|yטw`.}띛ߦ;PnY a>ubG!T>0:?T~Wg X;7fƁ#B>b!dVppB{pL6W(pUVϘH }B6P ?hK6/ R_5y(Bz\8_E:tU 6Nt"VƵG fE\.P/GѴ44f{Scӻ`G*?EskF*;Pԅ~򑗷ӯc=mj[ {,B(XcT@hdG;fw K&T|ALn_?/_?N^_չ$+58hc-2FQsB:g]dvBjbH!YezS #{HCzff9)Pmp i/ K{o.u5, X%vAL`\~\'ܥFm@6;<~^O k]|:Ҹk!74v čػ\;n]wA,nw#N\w7%wRtkgkvgDkiV|Aw6N\ȸ 5u9`AnǃBW} PGq=mM,oF g1Qa>x YTY z[dc6sxdGgK'!)Р)@HYZv\LPfrhp~L$#yVb| vWbΎZȶ-׍dOzGǵZ˼N"HL,u\kBUt7`>Аskt\{Fd,:S?'G0ͦyGͽ˹]g3h >ΎMϛ9㞍K-|94m$W 9qխeB)8B?I.Y즮|rx/==``⾼(A%Ft䩃ppQ9X&v{JA_T`ןG?\éTq`']Ͻlz+[hT02B[[faV^#7ރ$e\Q' OY'9~g^brLkj;(.B/ɗ0esx w5򹈳LJ[UchD PyQ@^:=?/M nzC\=h,duXҡpg΀oVXվy~@:kRS 7.'ޅFEW7Wtɡ{!?[FC "%xt83&,Ì̗:sIɽsF[]+.[^[]24w\IQej)В}N" FWbJ;)W˿1fA`\;ϳ`8*0dg| kl =ph \B=Ѡpxd!ɩ~{tXf1m!2CX"X.m4 Yn#"0J㊪bji_+v!Zh5TQץTN[ԙm=j3vD#p? Hq(x8 u$4m~9c!iTWB :lgdx2T|m @HDU4QӃ9om>-䖽])dC/ 7J6< _Nr "lrѴAwHG V|m0T>3࡭ۏK}mw|wA7ڦ|U>gN[3 +*I:r<_bc&8NVA,C\_e O@NܙͭYɥ?oE[PMs{bwE吰!qհ[W^֜ϞiEEU^k tF@1K,uW <1>z(5oԷ:z=oV%#u=%hol^-"ne~Ӕ$]?nX 5F8@p~/I߇30DH[gG DzCy?1J'˭M{\-t l@rA2I&!!ݸAᵺAo?zq9{Rt0 gaj6C0{)OBwh7fȜ;y'#{[uph:JO/}glb/WG"/cjUK[[Ep+f_X`˷74\9EFxzeÓB!7mp`KMKSSDh4sl\vb)т J& }aN턨/ZBe+) C,;)v>Xi|qz=PMߪph'S^^yȈ9) 6d[lH/ʇϬ+N]rwQ8zt!yln~^}OO@l@j+%ݡ߈ tD@+y56h**T/7?+oK0uDƑr8(A({/OLpw3}I Dx@&T S !٦#>Ck@?iLA`v¸e JD()z0(SmsB `:$=;\V abN:ėDfgjdE"klMLJ:x5"&-3'$=Ta6 )U(($ΪdʺޏЉ/{j7$5x aC ^,c!a }.ڊ1(uCMK):|w^"g{ݴ*E"ރhЯ!h. };h ]/Dm^]kܖ%&T6A"*Dx"AJ2'nG56) #= ocY1/h'Uyu6^痣h^EIA&R A.uEOw:w[44{Q'`c 7nď6㑳{u=y(% GmB6 Yx20WIuPX)˩xk!w t \},ke^jSǗ_[U9UȤՑQ}v8]MQsǃqk ]94BeƏ|s;]ywfL_K&eT#o-o6BKF˦.F9LJ2cqNsȑOȠz-=h#:MFȒGu"ɍ|v(typ,P68&K-pZlu寓;ҴNEs!ޕC`4:y+]ECQ'=w#Gx9%**r 1u5-բRM9ڞpsf$F ! 69í4U^kAJA-4Wxy-NϑÅ:d8N+Wq(ƚ|\j ջƤ8*Nzz/Nޣ7"u;PZԤa̍ZLv%\] ,ri7TA U WfWśhx`W AeLHJźM>vD6Ew q @k{iSX;@r#~ip6+fR4OnXpY(4,9z.eNQdZJq!(8C܏tudzRD1Y|h2pa߄3Maѩܾj$a4K離z_6eƪ x$fIw~!Ui(iN>߁)ȷ fgRgp>dѥ8Դ'ۍ;W'Pby8: bS`9jޱMv҄}TA }s]2SWYmcZU8~$D;`&%ḮKv x`C:3J)xI ƗEo.v> `?O/a_Gz!.j$s΋>2V(| ݧ_鈔rW8+s c`;olzPWG9ἶZBó0ȅz:Ÿ!t V}{s隺5G^RuӅ&]g\G$8 ʍ8HyNbPds{㝱ҤuCACvG!X_lmyX45tҮ[OV1d~ɧ-K v$l-UZJ@OۥDsX?̡sړX-5OYF}||XiŏV77GRXXFO/OHĎyL} }i:<<f^/>7G`'&#;:EL䧋rtY v4oS A?Q^MNɼyXr޸/* b`$6^\|?ncz!q<J"֝=u(p>wL}͓xnj$QT2B@WR{L_9ȱAR32=rI>-[xp&1MAFnц̬~{ :$y8QFIfqHYtǞl}s#ܨc~qh-n$.dV. ^8r=>3:whwOdl?ogc0_筵m\3_X/O ]/|ppcᲚE՞_he;7=t_؈fy>ڜA:GyZ4 ȣ-]?6P'jBeLRJ'Ϊ En+Q4Z#e?)eK2v* Z+.^ґS"2xVn8έ`D0g& h/*"k'%} 0N˝bkuH|WSӊ;.XP/ȢGrL  :Rm hXiP0vua|e$%7|NCyP"V=&N.uPCkT#}aW!yK&OAC))Uvz˞NW7:TavA`1ղO8T;=<}zdyhoq.MRmCV @DϜ>`@&>T7VWz)u,0m;6[;|PjdF[(ǃUSD12ƭ`PYdNL#~^o~^W´&JSc..)2؝leM}/<]lՄx1nǯ{6}MaU%(LIdZg9ߕ9ӾatqX&Y.f^0J!W=HzW/r#nR{4XCAp[A ! z0KP(wa;U*Pċ3 N/һlЮ?.@/K4{7;1s1oVB<2H))Pur`ٷYXͅD&ܬBZvhķB|o^>[ l6.(D.n?D/xABRCzjzTf4cGsm;6vߒ p3'5^b L|0qDDI&TIQTvTK:5"H! !1)8RJI4`MbP0[MZ֮X,F.u5Q* q;tP* TV9jZP a3YST5nG^2$ԐݣFDR$M"v[|Qe||Txg0SˡWIY#pDZҺipٗ/R^>YXf,&mmD"X}d 5kV]0٧:{Fc ~B%~J ;q(1$dB+V yCTW}w+e Ĵ! myvwV;*o:8Z)m(B*4|pb>~tezPps[nF @+@\74>#j;ۋ:u- waUnxP|cR @`FH!9tiu6ipgh]- U뒽a9 7:Ny<B^R,0"0 yzL0l~#~H^gz)z3=*KopV<8ju l ~qhBUkn1nͦ|ήXXLs,,)0Ӱ߇|2Q:p+ڨ\آ~je4[ `ʈh==Y }C]юYW]<.#7@ 9p@_RcooIq,>-@{Su $#-`O7z faVod&7Em,i؂.b`2(+|*T nw'*j߉KzJ5?wxJ P|M͙O#P7.hsx Xyn^ܣ8ehȡn(=OM]Ha‹2Bd}pF$Jh;laA}-=ZUo͝ D.ӣX-vm4N,fޮw{)r8rsnߒ~~w:⺝ߎd{EXN@)8A۹b< L7Yf#HZlw\}!@sp /: ',d vwϔ`4h Pd"l7P_(:/IG($`^QRA#+E<؛ꢋUjcr` o78ei[ _r G2HK`]pɩ!ZW-ԯ_kia&X`{NBSa7f0@(Qʌg0Յ 1 !/3jT Q~۲h;r׮ 0<9zCXo[5jp3Wڣ@a83c~ `Մ4.@0}t.|XY>n5GJ` =}<=Yk-Wb&Y}UOSjH=xhlB4b'٦U$U?k$ێ Yd  -ä JCk]>q7q{utU~G_YT ۦ.5Ipïm3gisQZ nfQy'^%*[!BSn! 9yP(vTKsUu,pptI]XL<3Ϭ]٩D^#c*53+>ݘ41/T}:n> xjl_{ >!hnf5UPm!APNult=jzqxڱ /$d4qߞܡdF)]I]Rp3i^N`h]*\Yx$aǙab/wAɣ?|2>&2u89$}V\+nzc1 9Lw4@B{|t:%[ Ml-8;lY=O׮SЯ(G 5.Y*`1W_0q -y{{7Lo1o WQ& **<;Տ,v(:2 ˬc j/c4'6/ҞLq.fqW=frp`"$]pVHbΧtrU9߸4z$3 YrFs#@Gh]mi:=vs,%לOArh6yx5Կ&\HwFrbg ;m/̫^X>9*KϨ~4>H+M "]YE&xCs”;7 HMD(@@h\ҟ0:$ #هq8)=ze|K#Mz0*K~ĬD?5~qkr%'Eit+přo p2+ErDPBZB J=O00PH[%zE-Th{ߨҪ∴78+Y ~$;)7ؤ(^j17iڵ-}If귚% ~Nse!FL8R6~%Ԫ9ߞ|n/oA9J0BoR/VGӉ5rjXQ 8}Ӭ&/]<'{p #L1, be?%J?LR0{ \Ӊ&w%M ,G--aG@v\ɈyqΚ%Is=^qcǧZ_ş@UA`86A0D9:-ZZY'Y?Vj_D,TZsZ&\J% ajg2<$˙݁]$@ aH~ލVúy4s`FpvnXe괴:]+5+a$6(ܰ{!wS =l99~dNǶҁT,.ɭEe]j'QHDR@ A8_%grx_q&lQ ӿV.˕J@+8;\Ϡ8$r6Ѣht^=7PpE< X5l1p=?E䳀EgvPD`ێHM=%?ux3)/J#uظD æF5$j% $cY٬c{dWRV­9*T(8͌Ix7kS\]&0(<(v>-t}, % %34 _ǖT@v 6 s{ Os9Ds d8}o ~8?f?`X28ͼ`J/q )?g^l,5_(&I^|o+e 𐄎4uT_hS˧4o7Oj%d@aR=hhmOۂ ̻yD(J13= jc<| h`9*n|750奓c*6}#n8rb<* -D<²W0-&saQ~ǎ )fagձntҔx$}]1gum|&=>U5&\$AKDl G-G;53.O'M6@L>cpТ.2д49c/+??M7 ۭQ[pxiB5YthQsJAF'T& ~ݛӨ^mu.4\Bz## <̺9AdBw:,zuA=P\ggqr`rKQd`pVw2b,I? q$G{~9ݱ**P=%gc'#wke!p]qqb x <{]n61Að=+3c`\nXOQTO{G Rbzo9 C}dֶQZs/әD0fñ(Uz[6 7%OBR4q 2g4.g{oa$bHQYK&(Gr?x2 0&hR76 prUڝQŧ'm XQT+A'U(ufnN1nhuSj32aFCEw~; cv~Ti)ZR ^1l"EU q#p)Mc=F0gUd.sL+yA>>'"">z4-ğqekAxYhV* |VPMXYl7\O3hwwGt}_xJ-.ЭQ.鿿o?M}y&9p/P!u!aO|=PAdrD8dka7U()-}| 5G5=YThBTrwޚ.oB"51E0&uIg+HIFqxE 't[`t(m3u8:h{ cO|!d,064Ϋ(C蝎AYW(uxU#xHKN;욅E?;~X{I]XT v(w"*bn"ՈEO}c!x"7TOh,}s)ׁZ@Ԣl] Ö `%61dtGNd)q~'tuyT ߍ-h-(+sE~ŷY$LHK'Dߋ_864un@$IGo4W_!XJGcR[arLvd%9\Q +UapP@.-lDyЌ 7ыw7mHh0y'L/wxd TU]9j;99h0VZ`o@]: m 1dI KHnݲbH(n"7vkݗG-#}a7gri ӷ 18 ziokͼ7Ϸ Dy&lK:nZ%I HF |s/r`ψ|S5_tC..! ^Dus\%6#tDP-2@^$o?lɁM8 6󮰮K{9(8e04<+k{a]dƇ3xߵ=&. &ŋ6я@_ѕvIK@- yni* 4uN潢&Zv:cXDfyc+E3x̧5>գN@@႒X q {GMN>BH!=t,Q"Od^ WϢo!W}"Pz l>W@sb;3 S%[@\6E.'#Q|̉5EAx./zD*y\>׎>I oQ,;:m8('/:X(>i(L4U+^x#g$=uE|UlW+f Qf_&KCh|E2U~DĀX),.@3?Gf(U܎guחc9ͫ,6>5܅kYRe>G鋦zJ]hy윞v 29uF/rfRy&*DMȌ*BV| B;N.+`yѐ{n 2(տfp*UGMP4dH1Gk6jNbCoP Lrf:x+sO"5Dla=H?6/!)n-9]9FDLJd'Q0+g>DllvUhX ^ޭuمea?Ξ7s (PHzt޽Dָ';g5>qAgXy~AvGQqJYoy Ј!k!ஈMs#4CW{Ґ;a/:֕t"9P}B|QT]/I!  O}ZD%B`sH?'it+n#eoWr S•o>Ѷx7r֗Ӣ6ߋťh=ύ]c ,v|a~'7cKU9MA?<P8GCWH\/j;= IYa~dMւ֘9pfQ C}@YP" MJa@'$ Ou=56)ik= ޞx#ϚsU1<h6lbXZ+ ܸg"cL[pᚿ.?_~)/E|ugQbb߳}CV˷2grI26uW ˍ: a: v,lK2 ] ȊBowu@X 5i@E9U݂r+E;5Z*˨={r^$_MxA. Oi%ь,1 {b,Nof]~)%a \B=ʏc Dnx#\['sw~WprO(#yNqpW8,, p/陸(U _#yd*|l}3ήpÚ1Ot3,X8ȝ:eK Z\p)*=Ф a8nK\XTכnGʙ.yDbE$jg_;߅VW=yt[؋6X撈m !ëvW~Yade:!wdz$ޫJQ+ g;3#z(Y{KoxvtDd[[L-^Sfo}25 Qj<~p)2G #&"-3hZ:M 0u 4< ;RmD,ſS1 mF; 1NFarc^dR. ;ň'9U|興s$DOvCbvE$P)9JxZP0lYfgcDݥZ#mtC:`q D`Ҹ+*T d= ,A+>V.y8{ŝ87y8Į2.73TtOYc9պn|\4UT;1S|GXIe Τ7מXIbcx"JS{7S ΓT _ qԱ! B9WeOFgD͝CJXؗd_ԃ+CuIcUr4t~Po|4?b|k_ rw%˻g=NgA `p,YQ)A9R"c;(@r,7-p {DS'g|Z>Zܑz(=Zsno -$4dw,xdY(?ΎWcu_DD \( ).K4~eY2((;e?=ۣYC.V.P/~* K5>>B\ﷷyet]) ^=®yh`_@Wu=0t>o-m{k4MZ z-#"|>}v,v-۱qO,J99hE)թ8È]_ 1+o]OP/]-c(E =ӯw؀W͎q#XW٧7z姖sM!L`ӷ\w҅Qvn[4BʄsÕY!W4VJM-~%c ?[-Xj22O]#\\@ڒqN| !i,%N\<\DOU9asEoäp8sngē!;2=03yFZ+k(}t%3FzϰLCjgR#Uz˷') 7`ЋeG2]4ϧlC;{p\BkN> lr;6P։5>nG'K$zE4@(*34/9 R *'Hu;h| R].hukoݮ_GJ726Umq(Vtà{a((\ `d&~G_ZjQF؃P?+'kro5'2oG՞p]ѫ;]͋wNjZ#HgFlOoy9-!$!gNםcvN“0\AhQtw)Pd7hlCe\jڭ~J\U1I,Pˡ3=?m .lBWڸ{.TL3aE_I ٻdzӚAگVWΗ6P~ `_O4!0\Ĭawp@ъOI_Mb"i}Uȼ×;/&C>,Aʨ Ny#YrKD4L^ UGL!xj^=֗[Е]M[╓z<̞33yw`̕5uw0QfXc(!c8 s+EԔݧ_ޙR?8Oݓsr/Bh+S_Qc. ~:׿TcCjLˏy%s8:>1bCA?:bzIp*gMQӨ iIeW>رPQĈ½|,aTf5{XL >T>!H֢'Af?g0rv7&d>_ 8m^絏BYX]KKq7>ã!Xf6ϝחΩḉb4O˲j`B"q(fyB4ՀPp%& qz<_Щe{e# ݳg\aC/aZC?vi1qҘyXg -ϻso Q`X A}g,0i0sFݩP0S' EXrEt:Lcz$)-Pb y';Z( NG>Iu(? Q *`U/@#+sU>foˈ ѦM~*ݿ$~>\%}lH=DNchP $;? j$TD!2M]Op߉,DL꟔0uI#oG$Q[ti(T7:>z^[O{FI/_Q /UݎPZ9\|K㇦Zźk8E]1(I(]o oav|$F 8u5|_E/d{{\Qnyب/*2rwmp.>SaܭRnFMC 65'ÜfkCɑ- qOsgRjC{/ {׷ P&_q%u:\ =K]Mںၬ|#z'۷8IIpjE/{/1g}ge@}9dDm1`u鳇Վm7$>53siу,GtecRLyx}NqIIXͲJhBŌy#6QzgPDڇI`6\x6 JVXBDL/T'--$xRN]@z^\e~#;yڪU5.N#;FeD!Eqh@7¸a$;Hw\HmP.#2K⟟3 O>`Ij8^P|Y#(K+`ɚ+U |'ܹGmlxءOWm!m@*n8a Rs09,keUlk@EBq\9$˂& TPg'^BMYiGӂ8 Ck_z-lj+i#ъ AXS;*Sdd_n mhj0 Q6.:zMGP X)[y +QyRF]AUQ? WUIOWԹ(%sGhpަ " i5 ,h^`x!w~nw8uB=3Y y|^O$r>ʦjY>w3OUveѬωD v^rkX#T2xHxP=L!҆=; ĥM$)%L޽5aqK'nᤶy ^W"Ha: r\7=<2njdI4nn*bA[[5VNuN#/TAo՚O )$:95Ty }y5R]`}~_l(?ۘQ>Uc8aK:vgsY7cK HȏNIR61>Iß\"DzF`W.>᝴ȑpTHtĻnqϛ(1.l@\A5&tu*W_^[7>qz~\&:'+y,csm N'w\*LnD~-#ѢBnpqA&W+ry;( 3u8go,+1_c3i  1Y=޷L78sbj G\6ڸ}"OJ9Ys.mZWB~[1)Qc>5*#;][E[\6"!S֓˧,R*Ͼ(֯֗-$׾,z,^V2m[XHb Ԝo>N8ubcL!g31p\}ZFiGAZ'kRκun<զ:;kc xX.wX3="J\8ZEi@xv{OdM1nP|s5 3a|NeO&8ZFm&te M4hOqMaY}]e.e0Α2BMUwC'nfbx"qgR/e:3޸YgGKA[|q|1Y婯ٓ4m3ǨEK: neYnؗ9R$=ƤЌfr^DcK̚xy\/E Rw0D`ziQ¥m >4Rն5y6IN*;wXxDaoaC7WU%?<|!v9: _h`s+1LHOzпF.OD#qa=s\<, 9$*˨̾UXE(')?l?ZCi16ە{iiU.hJȒ,=g _DsnaQ.; ;陘-Hƛ`K4iƬ3[Fw5(9inqg`gh)B}>}LsF0<z/F;NIkg&xs,:dտXDnu?O{|rD|zq}9m^FO柽qgݩ$2)~9 WBZ"QJߝ±B\%_/ʒ'?@c`홝?&㽍\/mh'."'(QD^7=`]uUFC/q!#VALjŦ *@իs.Y|þLKF %ٴwvº^/o+'(_A&ǾqGU?PtK2ck#[GLʱ!o,+:rbOSUpH?~QpS=fٓ!?e/ڳɍwL 0 &LDygmgBG2_A=xC sY/ kBvKVLXo?K87'h/4dSXno+6 v/m^;"2GolN$E6[߇Ey$9`]pЛ%1@~G6_(W8sk,2;RgPu Q}Ü,T∎ʣҤoĵ[pWYjyO&NN0+|?U.:Q̅|} iYMdJ*9zf.LF(^3VҭΘ?(ֲ<.$E^HHmDuEVGjW%ѵꯤOf>\?c^>Dҽ1In윞0Uh8ۭH-[L H4.m -ymԸdN*<*< sV}BA?NH,aIY:q:]kaۦdǡQ(Xp[V`rmDG0oH LG8]4)ߦFx5 05a{D4W\_+?Ǔ'q9]vrV_)A>gk8.;k.JP"_,à'VS^1wtN/+m8j5*69}T0j{탤)xwA;ZP8-یyP߷ }ZU?-sY't#} 1^JU^2o(6 b"1H^E+jK+_`^Ys{Ս9_FYpOr_t#z8Ev6t62ErvALgcmFx`Qa]$;*|.k w3L\5â2a éB?7K7)W Sc6!c>"3`g=$=Fp 1FD"n,>[*f1Zl^e+L ՞5!w,2P&Vut=06e*{{1a4as"\JQehD3}ͮìy#b~.Y1'mQLtN @lqog׶oUj}jW\tΜ,҉pGMT&HPV``st|yq?PDsfeH89&0 |s*w..vk6D<!~FzU깗O "Q2oz:v^ȏz>: :VH@QE2$b6 $tAh"G9:'dU8lb  b b­f :H!7dF~K}*f8(]L` k a!iA+#vDD[h1a"gDt!ڡh{}Gm`B!7A%J|MXWMaJN/vbZ|xU9\t84<%B`,s+0}xp:ͯU@qwe(f1 AM 3U+&2CK l0. 3Ս'Uu%sN0u؀G~0=R ? Vt^-= NgoBY#G@£BzAWNzR"=r%>yM<׭s1o"v#ܢpH M9qP|u6f?ȶ-"^h2iI+YrV!R$W 'L~ ox@Tb|9"<=14P)~o 4\741]p[Vy(T|S ^ڛ"EV4e g053b]m)Gɶ0uQ?6 Zd,QyzPnQD˸iUU^ Hj t~_?-i+ ]9mG.i=mNmdWkmpS#Gt;).poWW$uuUG9nCxs[tǫ|nOE ]WֹU*^O7ئWXkptQx/0a~lHRKwNr˯sڒZ/^ lCB9C8;/×hrAut ^+.WEulQG^P]3C V)j?1'HE$l)}|ۛ|o6k?$q41^MbDhH4DI9)9h&h V#J:t?/`M j!>G&JBqNҴi H3'k}!"A/(Z( )跚 zߎ?Xu{<9퇺*-PmViWMwV94m¹R2Uy˞ 1~W~9ᝯ׸? Ve9o|q{BD4VMµHoeMh!ibOǪϋЄ[Xl-r(w=aK_]$*,Z}|c~gՖ[2{L{qb=R:UIKgv:[߭ -{E$?[j[MI{b.+d S8b=RX] /?۾puYwCvUM;'_\Ҫ|p{@k}94`P_x>.(V?jsh*B M|Tok8\CG(Pq!ŎrֿM5Drݍ P)YHxߧ?=K~9l X.@>Q7@~H*s\JU(zaS߻8>$")^P7t,:j>x[i3~źt{-hfKUOJPd tcM^Vl?eVET7xOhI8^?؟WȪ;^[uvu;> D8Զ9v3*  $R!y)} DP DH% L(=wJɤS0v&)h2 ) {oR/h?!SL?I0a TsWe~m̞%\=A(o `N~f:8ut* }@KX|}ܣ8NW|]m`K_;R^Wnpx;dr_ pcV+!?RssCooհm:_YtoI&3POj"(VOsE%bc@~MuNإcGBoO蓔wdT&AT_j_}zVp}>NM}ՇTj3[06[x|~WskuN6){ ᥻@'iWN!P}/yj#˻H`,f *X+1V$+xp zm՟Fc6wXK0f{4_A[_轏Un\Dot{> ~ /o(AQTH-G@O:M8oiZ rd1CiDB?${GAhGLZ@X"tS4b)CchS'|W@+X'_w&A[A7ݭ-a·{XG륭"֜?}PYy9{{+*|zs"%ꭟE]?uk[U1o 94hodyY5jϜO~b\?,v;ʶ\]!P>M^iުw{/'}IǝpI78-.N ,߻g{+Oy ۏ3ܻc|*3owuzۡŝR9,6_hwD<_W(6/&k/SםZcmmzQ{”5:o'bLݛ,Qc+nv<}gf~w8>G~Y:Q_E]dbǍՆpXTt[ሱ)Muj`u;`,hwhQ 5/N륃4o"^NzಽA^<(%P=_:Ǿ2n:cʊC 0P\e`tV*c(yU =./!T}OSzG =#-w6%-/J$Fڑ ( lavt'G)_&W[SgGvU8<8#;.l$$.nA tngkIΔ*R{o'猰K P ـD<8ĴmH?ۏ/ު0 /[j1w5lw >@?QVα58|56(jB&e6 u5Tm8?wPg`O':7(yav;?)*%j@A ~BxEx=e/U(GxF%ϻ;t0Ñy!`5pmޣրZhLtјy6y[=N]8= ]1/uX&M7Ia2s~Q}'0(^DLZbFY"VG;% 2@|q2w*l{j9߾:_9gWx:DJԅ>XL1gFN)@` !̃u-OH{OnprIHN'wNaB.Tҽ=>$*#])n%y@(p]E0Am mjI6fsy;:gM^ 7ߑv}k="XO Q*Pz;rA.uc`-حHs9ٱo(>.h#fo~3[$:oh3""P"#wQaZ';c%~(lp\na;S1 wʆsoJm'8vEPrFm Ȅ"H h̖: ?pH6GB}9.sBݘI|J!2h=dj3n5Ҽt6,ԔP#gF[Oe2жNRDڈ d|140yDӯ?|,~@%id"/o?~2R' ]רv^g@6ډ-}ހI)@dFӃh?~g=zȎ\6N0.5(=K^mb:&㏏NSHy9-ڽ=h3W'h(APknE$t lK 4f\xe@" g=:F8RCU%,ȑ[koҊ'N2y΄vO+쪻ZOΫeϛǝG|+c2/L'Eq uŵ_~F,%Z翮Bov^6v6ӡy[˹[9lvK<|W9;V*;i}[ah#!*3⠜Lk# h_YwW=N\$j"ֿ#AJYŌ}OL?pW6Sx;+H F%uȾ 6?[>ag>_RPž HsU~KHIm9|ِ_]M52]UbԮL5ڥߩ-Q ** %Ssg}b'1.~D\r@;5|tµ/ vTyBJnɖS/W֜5a x~{٠"D%-rwE❕cUcZ-cֱĸh3~5Htuga )}#t(JR5 (jQ7!`:5sCqiY vK9cc I"rnW_e([L&%`hW9L/r0֗S(BpHZ&d%tj}r:2oLtcBlb()jeׇe4{r155xP*l* ܜȯ"RbAV&gvei¯ e9} ({2msnjtZ4Ws &fd䄉?([]"H!G1XA涼-D{"BBA8Yh['`S-TEEsx;C FLGu7цJA>O6pl/+_肂T;` 7zCL\,(rtk(G2n3՘cF^n8[2VazY]տǧox؟," @b~,Coɽ2X<&7f(MU .r Q[$\f_b"3,*>NGz3B^Q$}&wjX$ ]wY $Yш Rq2'$FQÓ1vPy͑IsbVy{#dSBR׹o.sWO\uY :=45cs ^>˼҈'׽z4oz~6gE1@~n=S6@FDH8qIm@&!,Lur(1h{ѭC!=Li{ccp$(ccrEXC,8xt0́Q#.@+Ar n>`@ nk59ѽDb]6lꗿݷ5#O&k@ 2a!uz0wu$06hJ2FR`JRwWY:K6RHB #(6ǐ6j=ေ<;W@:!$%3Oj~I~m^|5O]Duo~j{twk7NaZc300\B.اfUqqA+-,%mFߦ25Y*P99瓮iK_[]aq{3h$6KG<a8걀/AD*Yf EĸXS&d'F e߾9|G^*9u. xω <@Rq)$a YcXީY}}TQ'xB2޼?Gi΍}ml|!s0r^AU 4F X:xn"}dm 뮠.ߧ~h-^~5m}o.Yq2ODZR\Tˬrf{/PLgk<qAxz~K\>{z]F❨>ͽxdo/uc4{Bs_&izgU*inXADl3MAtAO/5r?};}%zMf. Q].]IxרOUb1X˝Zw)΃"/ܓN˚ jced]6G̭0E !t辋L̥(Jg92 4?v`-OwʚE phx\n7MF*DO^vP\Dh[r};H6?E jE&7v0*9a A =)e7<V~(ĝI_y,!nL9N9J0X)Э#+6kxZ 爈 HH#Z)ey.[F .QHݹ/_NNajlnJ66\3ot \#x[qb0Y x(9IsRV:ŹnqlΞ!o:xl"v-jef Ya^-K E33hGM|UgQ ԍ&xj IBGA|1_><\{Tza>95bBN9e H jtMbyCUȷ1 @4|ܶueGpsc!}su`)(X;Z3g-`פ<%Ȃ~;_SbNw[ڃxXtm$/6) S7-ճì8 -KŰ$mRNYXiegLuke:Bwi:(`|*cTf#-v|sD1.zϬkJ,s f.pK;.|"9gZ:}oi2\C7aEB֞J"*ܒ .:tΉ&HO|! 黒>k.2 nNlBi#f:`=]XE񍈱}:0/B,D6†% f$`@,"iAi*B[!qXV}W!j.mrKC[وx I͊YF] $XgkE@ %yQ% llK0\* ERtp%r#'_Hn`'V16*p:S,s턢}R"s$ _! ^, >](\6Ɏ;j$ wo815bBCh:$4 -&w9c"Gg n7Hv~ e$.5㔓23 r 3p%M ~ji-@ h!ڇ+@j \I[: v:č hC}=HpQimkКX@ >C)iZ@)Q")R4Q-QDBOR* % 4r.ݥWy"U^%b(B& Q#/0‚J(~KJ)KdR,IĒM>4vgzk0׼8&$-Oө `ɬ>`/"rV 䲏Z].t-T6['~:r\CykEAd޶ J~ޣKLtsI9,h[C!)"J2s J ybQmcTF#mUbsT!A=[@M5TȪ@G^CcyFq3od`ї%ѣU ~Sfdbj0?[ub"U%àMb36K2"~6T2 lX~r|( 4l$$$꽿 ꕀ"V.en0 ʰyB@'۰+2ӷb X\k/uRe6͓Ջf9=#Z( pdnMz!GX_F2?^UZ/Wbo_w4ol7~?(p}W<1vL?d ۣ TV[-\e6Xalšѣu?l_6`P&u|_Kټ6OW'z#ONJ䪤(ʪG5{F5kJl?Q Pi[tsup3JL_2".`;W$$AiFA /xF w~k!$e6+ d9rszxgLͧx8QbIv%BKP!cֵR=2I,DI HB7BHjg>xpzcc3RBW; ݟ Ȅ xv쨄6b8֑{=@TQJvH w-N3/$ېT`?88(n{(nO= S9*"dF4F@y9?it;\7 uUKKa>;/ڃ fU8,-!"%B DHO+`dô%_0Mnd`|*+s0١31\a$A"FΕuԬҪ6{KHFDAb=]:b,=V(/o1+ XJ!r:~ 3z=NӦn`PDñ_N`94}QH@"fǢ+ϐp  k_F#(Lj෹oq(?69cs8]KC%} "J:|YLPZFjb#%oN%D6"\X./6m~V9O;A3瞱zy 禼$]cJ`TTYO:?vVb~IuR"yh\ge_軗0L ڏ9HVِF%h"ϑ\–>4 PlWVHH8lR, s*hz;8~F9gMO+G8p1 #<%$R(!s;{` ZnK=73싹d"ѺaXZ829Mc% pA7Qϣhu?1$XFT! RōyΆ[ou\_53dq8ɻ̯?L0 2׎ƹDx<^LP;a~x,KW# \: :7mF@A ˙m͓o|U"B(OĨcT_rj&;St*@$c6_eh鮤;$ftv) ! D?? _ {OD㉼T$HMl*B`Kц2OS8 и&ݪ8h}Yp@PH .5ʋP)~cƲ"/iᏕ(:BZfJ:3Lʥ酖CQIThWi|X?uo;jD_^ "@[# Qp:BIwNyzk  l 6|р÷7~)Vhܫc3`LHjNF7}'^3RՊ1hQuGo䟉o+ԓov=i޵qA11h s?i-; P 4ZAM6?`$5/z,|f3r?~g3𒌛:u>ud47-j͙t^7aЮxݢB F9di8 L1T1PŭKtg-:^2uܥb4&|,rc&4Ubs )y@ %v58> Gi,\Twɶ0_Lw%˲*$'i:pS.p8I^ijA鄞؃zXW@3z_#'>ˬ=ޡ 9N (R'"䪢#gh9uE=0;Dxf\Bք0&}ifc'5~{-#hzV}JB68\й  fK UluDM|==q2]uV5_ Us'lP* WL<#+c) NZb<~p߻ȫNup0K4X0! Lj^r1jC#>%7sokޒ{.0=B/lY`Ѯ|EŷL/