summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--arch/powerpc/include/asm/checksum.h6
-rw-r--r--arch/powerpc/lib/checksum_32.S33
-rw-r--r--arch/powerpc/lib/checksum_64.S28
3 files changed, 67 insertions, 0 deletions
diff --git a/arch/powerpc/include/asm/checksum.h b/arch/powerpc/include/asm/checksum.h
index 54065caa40b3..a78a57e5058d 100644
--- a/arch/powerpc/include/asm/checksum.h
+++ b/arch/powerpc/include/asm/checksum.h
@@ -13,6 +13,7 @@
#include <asm-generic/checksum.h>
#else
#include <linux/bitops.h>
+#include <linux/in6.h>
/*
* Computes the checksum of a memory block at src, length len,
* and adds in "sum" (32-bit), while copying the block to dst.
@@ -211,6 +212,11 @@ static inline __sum16 ip_compute_csum(const void *buff, int len)
return csum_fold(csum_partial(buff, len, 0));
}
+#define _HAVE_ARCH_IPV6_CSUM
+__sum16 csum_ipv6_magic(const struct in6_addr *saddr,
+ const struct in6_addr *daddr,
+ __u32 len, __u8 proto, __wsum sum);
+
#endif
#endif /* __KERNEL__ */
#endif
diff --git a/arch/powerpc/lib/checksum_32.S b/arch/powerpc/lib/checksum_32.S
index 422d66e938e3..aa224069f93a 100644
--- a/arch/powerpc/lib/checksum_32.S
+++ b/arch/powerpc/lib/checksum_32.S
@@ -302,3 +302,36 @@ dst_error:
EX_TABLE(51b, dst_error);
EXPORT_SYMBOL(csum_partial_copy_generic)
+
+/*
+ * __sum16 csum_ipv6_magic(const struct in6_addr *saddr,
+ * const struct in6_addr *daddr,
+ * __u32 len, __u8 proto, __wsum sum)
+ */
+
+_GLOBAL(csum_ipv6_magic)
+ lwz r8, 0(r3)
+ lwz r9, 4(r3)
+ addc r0, r7, r8
+ lwz r10, 8(r3)
+ adde r0, r0, r9
+ lwz r11, 12(r3)
+ adde r0, r0, r10
+ lwz r8, 0(r4)
+ adde r0, r0, r11
+ lwz r9, 4(r4)
+ adde r0, r0, r8
+ lwz r10, 8(r4)
+ adde r0, r0, r9
+ lwz r11, 12(r4)
+ adde r0, r0, r10
+ add r5, r5, r6 /* assumption: len + proto doesn't carry */
+ adde r0, r0, r11
+ adde r0, r0, r5
+ addze r0, r0
+ rotlwi r3, r0, 16
+ add r3, r0, r3
+ not r3, r3
+ rlwinm r3, r3, 16, 16, 31
+ blr
+EXPORT_SYMBOL(csum_ipv6_magic)
diff --git a/arch/powerpc/lib/checksum_64.S b/arch/powerpc/lib/checksum_64.S
index d7f1a966136e..886ed94b9c13 100644
--- a/arch/powerpc/lib/checksum_64.S
+++ b/arch/powerpc/lib/checksum_64.S
@@ -429,3 +429,31 @@ dstnr; stb r6,0(r4)
stw r6,0(r8)
blr
EXPORT_SYMBOL(csum_partial_copy_generic)
+
+/*
+ * __sum16 csum_ipv6_magic(const struct in6_addr *saddr,
+ * const struct in6_addr *daddr,
+ * __u32 len, __u8 proto, __wsum sum)
+ */
+
+_GLOBAL(csum_ipv6_magic)
+ ld r8, 0(r3)
+ ld r9, 8(r3)
+ add r5, r5, r6
+ addc r0, r8, r9
+ ld r10, 0(r4)
+ ld r11, 8(r4)
+ adde r0, r0, r10
+ add r5, r5, r7
+ adde r0, r0, r11
+ adde r0, r0, r5
+ addze r0, r0
+ rotldi r3, r0, 32 /* fold two 32 bit halves together */
+ add r3, r0, r3
+ srdi r0, r3, 32
+ rotlwi r3, r0, 16 /* fold two 16 bit halves together */
+ add r3, r0, r3
+ not r3, r3
+ rlwinm r3, r3, 16, 16, 31
+ blr
+EXPORT_SYMBOL(csum_ipv6_magic)
{^y8}5kĴq7S^~Laz9ct撿#c ~N>ms&:qe1޵/x_| _-Ou~~q>6y;RЯ>oYtٯ92n&z=Vڒb-|Mʗ*8kV]s_KKWy_o<)Dw?\׈F*k5yY{LwP$.e\+ w!_g >)?UC`?k졤 kb}| ~/4}@ЮȆ2{^SgK.#V+hR:SP"zG Gؒp > fXGys!Bc^X 0C-HMʐF}}ጘU6EV$}/3?$Sټ !{!%I'AgVK 0vVy;%JدUY:It*QNyQ w'ϟ釩%zh$R`@:UCKi)>)#svDHxla[PuZ)n^mڣ~\r .Tj'pݞ}GC>fDGD{-˯HH4:o5Sy4oA5ݥgMxu]b}z+^rjP]1aYUwFٺ4seh|9/k>}}uٌGo-ǎ'.MeUP)/WO2ARj`Fy̛sgCaX9 ojõx xqwy8khh G x ۓ7 P|*M-v:0atyy3£+}'irweKo&`6cJ?^徖5㇂D.%^.oz'd)vzk mưU!XfJqל9= 6:>q_!Ytp74[z_qE[6/ܮ)#㻠k+Ŭ9\ ]d u3#mJ3`\BΡ,x3Ւb-Ǵ>Pi֋tŷz;]ކqTg.^f*Uae 9 -m}D}fiޚHhUr)4|c!Ly"Fq%7d8n_ug0= "gX;\\[[9ʪ//IldcG;`$Wcع'5>9X!bpUح ݖfq \'_bldSCOƌ}ÉdUmmuͱ<*b7] F*5`U,j*AP b?K!\QٔQݑնUmj9$Bp4mBdu n+u_lx: DCVԒSri钹GyN[Ýc2e2ep*a+Im$!w#|޶͙!xTNT TUP@.ڧ'kXr[q I#3BH|7ȩz $#N#xJb@i"!,)ᬮ̱U RI/ y!e?8s0_p]JLW9}E*B24KZׇ0z}{oRQZ+ov3+j06yu|P+Z kҊFUȉ GD?g*az*d@SuNrDCJX}Ũlq`~ 3B:W&8H1IݯήuJI") BƀMUb`PCg>ulP-l}y@ҡu eF 10wuMuVzwːN/i&>T}-:Z!Ti_i\dBBTa8w!U@#Y"dx&dGoX`萋6y7 HHz(b#ka5QQcYUfߗ>s䅋6s&C~"Q-A4(/aWKO8KCvFDlx!,ѹퟓ"FpM[,Mg~;EYkz/\*`/?VI]hv^W@cO.a7uZnP7зN5햔 :X;׼iɪ H);#Q .u>ieo0xھLSU1wH =B e6q_TۼOq~}9 ˖ݷhIIY|^ؒO ̄ *(km^WKAt@ΦOsGP Z%VL9ŪoI)d}_<\'SP- PXLʿI2ꋕ>C& b%yN[ p Wӏ;}y.J< -Z+q Ç P"޿n49k㵨&- vr9s#OR}{CZ 9gŵsYǸ yJ6zR!asG$Wz3Ze>WkxO@ù"w)ڜ~iI^׈f}QeTර^cLVOu":[&9_şYݿo][H9_c.r-,fNE6s0'ܗz>8[sa.huhd:}Y>T?[ȬȂYƜ]EXq73Fd%s|pػ՟N"|u{܂|:[rXv==]8'郩Qx rr|\6 chy>S u}uqü{ b:5h_HuZ^\@b!<_7=xj~OxGEѹY|ԻNϻp-Јd3zoRv۶>lCͫR=<#֟9@HՅ('v F/_bRq dǻ>'?nnE%oC]a|=0#SɒZ!m{in KWL53dO?L;0+$Jgny..H }(|@H 5mZrJ΀kr?J)#lnx;Ȅΰ^`/z1kp9j"':BSTaR<}NH{-`US~O U?'7%ݤ^[/db#H='N_[]~O8wm_lnֳ;Ya]fVt3A#viD*. hѰtՈVU, !z{ =z(nT>~ЍE##q ɘI;HKSDیD1vY?08@#2\W ̿A@q鵇 Vry|px=l{D_p̓tD(CN]:,n~^616zn:ŗK#Ԁ; ;!Ӎl[M*q1˱P!;C:*)x-jPIo٫Y sM)k^]:8 ߿݀26[tM㚥ӢxUm#fS'?vQUsPcxF t?J\6󎱟7('ѽ#QyWJ1Ixj F+rǟ6ێʢZk}. לzpq=+Ó^7Al~VMD6jP<ܭWoc0?m1w7x~iӫczvui kkfE6Nk\έ[]kfBI`u-H _qggC<.rG;sH#`GtG8B7q:v ݙ/$tuw0s0:GN&9%,=` t0l:uIzqlSoE.kLd~w=E͎WL{GHї]u›/{`+׿HqMU$wg !5nCFSrRVK{kVt5m8[*Z۷@v_|Eç/mPgdow6! z gJ`(.D$dل:!NPu$~-QW:ݲA=YX ՄͶh,'<\MaѦv5ҿzIN=s^sd ;)7 ;<9e ?l^:fQ ̩M]0b3-'y'73/ PFRmu#QZtk}ױ+irf.Ɖ"\ na1z Dܞt|ڥ*#Ѐ!a.]:Ո/ |dLaw(Rtv%ԽB2UѼ#z"O2 T K/Jo D/}ᬠc%]{6ה9Rc>`i0 [}"q lj ;hLDoGd5u7?Jz¡‹%2DY:gu#,vpHm?A9zW.y95A97wzcURw&vVxEbDksQ:tHumv%12Z$p"q=A,Y;covم'#"¡$v,:zhjr5<_gO0wݭGVе_ Z ™wTjfǷJ ǫGy5G,U`uSygb.v ]jxyEdcˎֿå{=[nϦڮś%ɲ4=^b[I;ŵ+/6`h1~OE)(_OƒtyνNL@<꾾/;§$UdH$!pzDdPg,_e5.`"6؅H_aLg CڲZr= s.?5рc%sPA drm4u؇ 8y7a(g@"ғNC 'F n0 y$D~mhJ}DeN8::y]dH A1ab;N.a,P''&́-$"q:%~˶4wQآc4k Gm=/m8Ʀ!949u%յǫ}AhKѻnvB-SH?>hWz:sZS[*,3hl{8VTs^wzW^܁Y.W6t@ڸݽݐ a8oU`B*7 ɟ^!6FTp_燑7y7;;X ݻQtkr"^VZ5hrvMTw?'zoxvf[UMļ>zY(E7HQTvdzQ|xB0zxz9ny8z*h[ax] -IeT捤: .;7~[l8b?3LQC!H-9~r~N }j;_IˡQn,HA5M<ϑLó.nQ#ٯG:rN45M2I7AO}_\qXQI'֤ 0vS!8\-mCAnUU&Pw緢2[q=B gG^E:( yjk'GȄdb2QZG}@RA9z,tW/.Dﶘ`V6}n"ycCb K̅Y^/: ľQ\Ga|5𦭿LLfy*1Fѐ{;ticc̓o :Ym#pB"nݽ}@Ā9quǾs |>C "%y8rs03`NvyNk-U鬓FVPuZ. wwyC:1'Po 2*S),<9+w we7ǙrWf0lnG "XDxp# J3c-p*UT~3Mj tWvh-*Bn{ |=(s*EUHtxrҭSOzKeDHsET"h݅[uϠ׏kpys?:=| GnE-TDFWfkM.97XH {t}j{AM!l|h]:rItk~)脎yjprdp}@^uﵧWt/{7H"*1E\O=u$vbzoߣKZ&i.TowrI /UJ٤yzsu"ݤB -< oL?^6kxGi#ӷv#^bP7}}Clz!BgvGG2B% :=^E"ޛ'*a_* =:.u$5r? 1[MdMd3c1_'ƚ2P#bXsY60C"];Q8Xpۚq#њRx5{9q.=nH!4ZЃZ*3s|*["0٭?F]t#ph<6 KHk V~Y X/@Ѕu]Iú%2\U>ND 8Z:bHIa DV7쨜+Ago XZwοOm'_NNuCvoϑC_#MiNx/@2K4*?`&HV/.#Jxآ4tiI $#>WDUm{坊}/ɵ>`=2"|Tw s1 6 s]>"@"= Rm IuK;h_g=~ k{װ0vQv,~`~i&N$n4PËu(BrV_w򘰠~ o(@(5ʍcx`pfaҷe{;i -+ʔȡJr4#[-[);=qt양VqL7n}.7G^ /5\o0bY.prI6op~{=U~{Ɯ[Юkdq}q@\^y% x@"5lm*ɛ ?/tG گiW~1u0zt"2!-Ԉ9>ݹFDAՉ孒`#lDA߅ҼHc"ld?_btۆ0~ڐRt/e71Nd]9&S/SBU#ӔnPzȳ+ߪ4̱DvX uB9}\FGg?_8jvPF/|,TaAsQzbJj ̤:wX T7ESlW슋jU 63cʑ(˨c u^P=>5:YF>׈KQ & z:d_I H~iȀ[&M5tW)E`kk!|˱ T$ta}"wvp곣~> 1  JQj ]Q@+E!UQAڎdL_>o{AЌH (5>tG}|= ez1|I0u홢~ ČMމ=0X(,q,}|m.^,݈igf sb@`5pݲ\$w8m Aej7Gmw{σƶA%qܣg/ۄ<$فGW.i8i$܊SqDR;OM w%⺀x}b%|{Cxe{(Iks ѐ<-f /HPρղ&EM6a#fo%U~яʔtѵk\%wdPtp/7ZI߳1^dF뜜} :&|TtRz zEH cr pG Wz$ÞLs! j3{͘c`IoH$X\FcGd$/=SltYnf8fJFs90 k3 $B:Ҧ˯#8{Lq,ue+9!n̛0Ohr5Sy1,o zAmܭ-O_=`6$/.C)^@߀{ɡ$^ʁ3"*iC&kN\CSu~Dͻck&X~1.Ni0 EHTUۉzv&b-aLk80"PV 0A ֡@!O5h7Xxmpɨ|~@3|7|L=G8'30Wyw6V>d'RZCN7JĂcuVZ Zbl+?xE}gm| >R*Ljb5#.0ka(Z#x6gpȋ{ȞL@XB;MEem>U/A"&]+sM6՜z ? `XLȍd ^N6#<vJIX$`]( %r)D C% 3V陓HpO -2PO:~:}P'v^Gs:up{bhp+ӏ9coL'l}f9VOJR ZMS}ܶ7PN2a7]|aʄ.on~Xoe&]^9V_~G7bun۹yx_V+u@޽cӧ+;)׍ׯ} [x6⣗)Jf_@{"Ť ztp/{+4}0DCs`wrnVD8'_=9eVYi`pA~ݖhM楲pˢW9]erT%aghbhYM"}{ `";_13<2!_@,s ۪8Qʮ22Jl 5Գ2C@6.P^i&|طb+/ȍΆt2Oe jQzKž~?=[or: [$_3&Qn_kT3/#; !*YbcJNC,#i9uぁ Vl[u[%6jg(a kٙ&Go% v} *`v Sj!@Ǎ hpC&i|Qe^_fvcFfZ*TpDo22*䛐/ߥ]SO <Ro0CݔMWgO}"H_ o,%uga|1 as.wu4ZS%efA2Zž| ag@Oa~ /@zFV o q0%+E  p$Dy8q X`I݆?@h5- b[蟣Ɗ=0h0ʷf? 6A\ CU,kQEuȋƥS 󭺍戨9h`!}#cڮJ~p<\~l{\Y/&:Ä%8؎F:NDL6FLrl$4H^Aa;Z1":W_}B3yxbm0rn{7F#tt38~1G܃_@ 5%IȔQ^zm. RYv o󭽜+w&,p4i+5arJik qsz9ڗ E=k$2.c2WVšɌd˧GP4Fǖ$5C[e"J3z76Ffō{3[7wtÀt*7nH?jf鍺ZHy [ #5nk.\Ҭ ';R3`p}3! ?+j Xj)P,Tn U症vǧnv`6 *;ڇ7 c^F` <l nˌTaOɪY9aoo`RKJe/cLP\#~FsO K̰ }[: jdeP˸Z- 91+L6ʵ'7ʲ!cDoj|j~!C HX07(GIc6;( & \)u4$9l_,g#\rs# >v{~kkuEңCh4pCsYs֮H(p,5df61AѽFo m,f86.$dj/g׃s#9/*LcϣO˯e\Svc V `kirld 8wM:6\EMW:^ЀlMnPړ2LLjtE;L0F0~^ Gwk pbgdXAK pTV% 7h~x (v_ *nPhQxiA~lge^:e3TP8}u~}TJAS\7]{dɦv@TqWH,B,Tp!'`W|~ |᜙@ }Ӊ>b1#BtO3k/uY yY.6 ȗuwޜ(#e}W$zT_ɂfotb_ej-ëdo`Y jJΪkQw74tf<blYR3wfR@HUFRǂY #p9Y ްoa8xZ _ 0p vDu,{~,Yh=~LD#ȑ1Bd|;c*vz/}y[(J:8J>L홐ϕއ Hhi}OCxs0s )R"+@Qnk7?,]x=s\Sߔ_d"jpa,KHR=Wl"]W!',R|zOᑸl[G}$!ᬭßK~ݲju YżZT\񝀛a#ܻ9}/Y_[mu`#?A`a%uGxՁ;;4ȘhI dN6skq}Bc޾(&yB"!H4Bܞ_r;ixىrDzu8kpvI47m|q~j6 ͧ]1ocF:Ho(Hk(ݤ`z`oN2 2{(= ETLvi@sz,s4膘'Ny̴최j?˾˿>Ģ-VCa*`7% ?R?#azb #芐\ ^쉳O!qvI׮w[P+{sx~QK2+>v N ,p?,=l_ SP tVP$"I!H2H7:43Fb`*hڈ] ]0ّPݎ<˗ gH-W ۖ*siyqO͙~Z؋wlVb$l|}{m MR{אUۧYkbBɲԹܯPS*m AMq"$IS۩zw$|9;.%]KvS!p" @=`Ǣ#5VEq]Qrmj@*DDAVo:w5kh] d:`Ӟx^M,wѧiH4 h`~P mjK\,;58Mlʡᤷݪz(*i}BP7QaQn#𪆒6xQh}6kLD!p^f#鐂F~Ɩs]Vzt 6a#ᛃ$ }N/N=hn*vGK pv'xr wߖ-S5:X',t2AsDoimU%2:!Ю3 `s`dG0 V-#(ǶD0ETsAM i#|rl\LR$-kCf8TtK:y_veޱ"X E_jNx\c)j 2FQ횥tE B1}C.BI.W%{<LN#;ĉ}UlsL7 NT wj&ƛ5hpiF`S~&^TNac\tUІ^U}*\.ڃT e}cl8`ng58qde}Rx y+$Jry"2RXi+ MK5 $as 9@meY|񄠑#d= ʝA~;knyڱmZffk!%ξϠ|ϴ/Q@I#ٳ8?(\V*C9o8 ݾ$@K:iڜk T+=k#wxVapv/{x^4/5T9"G鎼DA+."ŅC. A̙=;sh*nSO3˗T& <eAib\\P\95RSxBS/ _嬺;F_nTNK[N%v[,iX?qymYטoO-)X>7}8;ljm!ki/H[ 84#>\Sy,W:[5]ao>ӰV7)Fe7X ܁J%B3Y : 0Y6NIOg4 4vrP;3X B!j2%mNWn}z.Zj`b/'fMlsFP jËSu!eEy8t9[s445ǑXލIM"1Դܱ"A,/U!>88)򱹇z󱭒vv C(~':.=R lA`!\Kp5_a ujt[f6\HspL˩yY8q .,d+&? QY2l*-u j',ȇ,p,&d@'FpnnۏAY>f_*<(FTc]=T>P: P"C1T1a0;HBS"3 1R{z9F!nBCvчF0oS5&#Qv&<ؠv.^\* \n~Ɗhs2[e,Dyvna0gÁK\ |]q zyQ "+Mm<6nLD5nڣ3p7w6 N<^D:۵Q䉊9P!V*.)Jr[lmX.R}iEb.îF;ror8Gr9H2s 2dX~Wp\ Hp):[EWhd-hdRPpG9v\Ӌ"rWA\ qgN`~D'HK8dLk`rN+ n"DZr݇TxR(&f :8-_Wun1a5w. T y<:R9Czpyj9bЪ I/ =]R;dgUS 92d Re!loKo'}\zT0Aܷv]ghfƤ`+?bIqГy {b1^چa33\i Fc cF^gw8ж0e$!"m!xQWG@EDI4Eha,AIOpK̈́ ]wɁ咐ܒa849Q5ЗpF; X5jC |?p+BТuTfLA|$qP5XSl&ֹLD|o!Bm d"}d oh1j?LYWă+YH|#fRgpx%B(@ ;VeOI}i7a knQ@iL]Tl?h4x~ـ{ Myd>c= `%oOcd8@R9]} BD"?OSz׫ pj-JNsCZS RktwRd)eϺyݛ{axғ:IY6d e Is["="@Xxć 9b$bGcK1I`AIyѻ藵M\+sV` ,2T9wYA#ΗRc f_  >Ϥ?촖@,\B#n.Kiְ K՜l@ZŨVh0VmZ;0(_8^K$#ld߆M*@f˅lxϑ/[|qՋKgeMV6He*e3$޿c{yYꅳA*! ĉ,쾿:11=̠39NBzg.(~!k ^dh %j`r?逪+#4 ? #,:5$A7e_4_=aX0 _K*FˆHnIWT^{¬9x,Ѱ ́i.TJΘ7Du:˄GU`K̍+FgWC v.0U9`I$֢F䖵# M|Qq^!Q6wK` P5U 8k{NvY .:Ǯ- j^js}gO *b]`_NA Zr{0ɗkͩ7t1uetp+QӸ9in9-ԋnb=sg!QrNEbugJ}-9(M-zEZ=|>G/V<>/AZLMύ[P_ڟ§4yT;2dߚ&9a:ݷ#z"%P6rf~q|}ir ;Ɵ cHdU-P֡fX`G4̝G"vdˮ![I7>3ussDnuy+3Ր><{Ӆa`xH8[{@(EAP)t|gv;`MIE fϽ8@ ?j4#}}?lLZd_t cbO#I!> e Ukx7=l JXA>/zMV=r 3Iy8KeAH{wްdIP8,waҙW>a;ں'HAhd^vW $0(^AEtb&Α ՟$=tj F]S-atCb^-s˼gTZr_lDZU.k!yX ;Bb@sxW|ӈOb? 0:$<:p͙`:~ 3+>*I J#K^ˬ8qG&)/.(MOКsbw[Hzq<[T`=\6ߴL$^2;LAnxJ4)F*Ysޫ5Ā澊V B]B"zY9"jraXRtri @ %Nmkz@d%ID*#';܊뜪)!Vpq}]OϚ"+a0N}Lр `ʡE\dJ̠urK6zM[pQJVb"۹/6|=]kv`>X".brM8'?G%yAHAGcl Hᢸj1 zkBؼo}m:TL|)AN#F!$=Z8QyL#pJA? Y?MFbY"($C芋ؿ"rQn6{Y8p!(9"6;.7, J0$US6 #@Cג JH[hg@,K36+竃Ym3Ga#=6i~{ދj=^4~q:a_)}ӹ،x@&[Mn3 AáT"_c^YY|@ IAUerj!?4j!%w9o#ܭRţşhXk+H ZTR#4pW6\> js?#GT?K;N>ƿ)  .b?ǟJDat69,PG6ƔqWӚ,~Nv_G#_ج .bb4+qvh8=/g8@?-Lupae/,DI15X<^*kb0jxP#.o_P%H]lXLV}o0ӽAů{m׆uY?+081+kl(@\DM`2gtz;^s{#L'U9t 1t !3ñT 2m޷}֘\8_ n0p{ǹ aՂQk_V9, ))TnUD/ Ť|/~S+<]?+#g YXo &@wIY)6hoJnU;0k!n(!S/0??(E uJ9{Wٰ'+Ezq(tr'<219RMU!09u2s¿r:TriA}${r,X\GSswslw@(IɪuϷFEec+XZfP%t]7{|@UopHM!/[{cwNu}}Iɹ2ƯBGRʳ)~gԢRbMN{SQ 5ԬhgЙbCf7U`ϥJ7lDy_pXr}a"j`X$x~l 4<>vL$zDDEV"=mh}YKbvAyKDd,?QNM ([@>TCs]0|tɠP݁ZExcK}$K;轼ýO?w-?-3D n@xϯ0Hd3"}s_XMgW ok$c0Bg0q[ȩ`Fr0JŸ~ YpInTʚE~} g(.ksJL>o8^zrCaW?f4Fe Gw/0xvÏOc 'NH *a]]~NloǏGTG Apas-9wsb Z߳B yXvy@x80#4fhbƖT{m?\37lToM^R=*hS1)*xWNR3AwqFnP!-HMk!:[Vg":Feq*ak ϕI<գ(=N\#zԳMGȎtYzYC| aȨ?v͇,RϚzxof˫GRN&]mss1ٵle #+#7Y+R>D!*Φ?P1ߘ2jƒc9S(KH(!u4f(jɻllcsըHjGtzm~@=bINXv_O?kʋ`9<[ 2P*5=V*ߠxv3zM=̈ ?bX=k,4{/fûcuj?m`bf-!*ĐJ=DqU.H>|oNh0gꈙ H#Zr>#j#BЬ ;&(툠9 {U cJu88;c X{Eʛ] N/g[Ri2_:ݳQ8K =3g~ĝЫ^g"ztf1i)*\pQPew.Yhf1у-jU?2j+*w5 n6Sd$ EUM^ˌHl ~ nDuB~7jgTGmo5Y Jg^7\EKT2B6}|d߹yDkGD]qɠ> WiL7X.-0qWL4f 0Xa"X;*#'" ?R%/]VZZiVŤ,[6ߺe.I򋡡c\*0GGŐ[*(3TEwB;,{aC0v*ѯlK{b!Cxe 6 kvb$,q@u򹙀ZSCH/Kl@wC.2wYsS&ߪV=Dl]4Qrn?P'-)k\sYtw .3=MVLÔWTYUBKpRz*ŇOW:-hpT7 kG(w<z* ?komSUsg}[.$׭{;d"d6{Azq52(nVHK8|i$QH֕i[@ 7#!?&U4 !AрV`v4ײNK$V~=˰Co [LC=j4G"Q@N`$q 6QʺGMPa9G 0%vmH:zL"ΊrfdZ7ddB]ͅUmYcD30b)|#]ٛ~\s F(Uq6>pB_?(|B 5ڢńrD'J/N Fx&{V'Op@ڷGK3ŗpA\G"1(=$kN*FC*It_+P#Ӿ^JAQI{Q@T ~%@)$*Ue<_dk(Y!{na'ٞ#*>CK_z\~FćZ2s@܏*>@ϜKrrv<i Xd\ :sO`&!?qa}Cp"`ǐ;ndK q!qߑU{^R S$Oڋkߛxv|Bbټz<%1cޏl Q< 3um2o~Յtj'x.>NWe]/lBq Q.Nj;`p̦$JZ 3ڃ,:Fndb>$!E8;#xoUT,xhiGA TqYA0'@q8 WjƵܬW0,E,˰NuL0e(ECIp\o ØK594LBw(?pMоݠ!8/(S}:OhPS> @n`ƯylI0)m_dFp4DÖ3ٹ'_\%y?n!z ?ggIDhy\{h./- EÂߌS}MoQ=|q"3ǜq)qBR\l+eNd uh~[|}`7]o<dB8@LL>(C(kje0 -HlzP HE@ UP*"+) KXCmc7XsLNrL/(+Z#1V~!mGb[ino'{;žޖEYʤ5r iZͶӋ1 `z]|p bH$ Ci -/%~Dž{Y.LJAګD(^: U4]lF>W:\\6.k#LO-̀]Y..|B?7AGgzqӑN @CHVq00i ȜTƼmlMY"69(Ͱau߱W$L|o~p6LG,aUH dU8Da) !{L!?$$a \@U-o';# shEb;k",$V0S蓀u^< >ϲC&;W B/?XF!sNtg x`0)cCgK]U8ApA46O4`h8L<9[vdžo>{]y/#w$b>ۡ>G` D{k`!0e>>2(`˻aW"(s΢][njr8ZJ:Y?oM?룠ߝk)sz'51ߦn$d*Mh=a%"")q;=Ͽ uj$A`y/`OvJpϕ8(*bMPk0:p׫>SE|Ð& 3Vb YPC%Gg|(X!D&FV~ lAfe9(ٲ'0h&f%݄,N !ὅT;tT@[`v0?3 M]LdCCr•t\'fE ^9ӘQ01c= X432*B 9X9e J8f]?Z iwKݫZD-="_^jsu[/\ CՆ::C|!@[ǓOƀ/v3"1&v$2c8*xG0~lfzEqN]e'Ax{5F0.'HP@"% J(GMR!˚O*OOCT\)A{O஽NB,jÝ^{U _ɇ5N.;"۠7ŗ";hP]D?dr׌acWXAR?+y %4z/wCt 3޳ܮ(oU۞9rmXێwr]'~.' (G6< %eTkO&m!@>Jǟ2n?!|YӬ_y>4$K gwz uJm]`~qbU;<_u:8dbۺW#cZ 7(b>X\Ume`KC,r,WIk$%}5L4Yoُ|.];g;ۂ`x~H8*2: 3*Ɓ }K n]ơDlLk`,8‘}~U $a<1zS}\r=66o*o`Em 񤅌x_d:4m4@:=d*+bT/RqUl{8sIU>q,Z0{#8ia'ޫK1>QalCKzxUxafazA?-Df ek\=c8r9B~!])=r:]}ux&'_"F_9T2tJġ( !{`X->WO-.1MLrY t3ꄒHW3G?9Cq{k !6E9>Yt@Z+\S;eI$crj^_%"DxyU$D-\.vPȢ8wS]!eG9 paR?= , &wWՎA;~gM!y9 BGWQ ÷}y^ ,RjQNPPDALb=B=mݞv[݆NACw\Fu,bͺCS(@y)k_lXK囡93̷z5=ixYsOPtޓ*Qøl9 :NuC1kLBL!˅]0jBr'}BBg֌|el2k^"! 3A?;s:C5^ա) ӳunp p&H/rꈢi]=S]쇙LsT L8^qy\uP,AxsgƄ=iY$c2᧶PG(yr'XABGl4Gxwxgy2!x. UMV) Xv+yFK/q5Drc/Q G{ZUĉ m L4g#[0P!26^]Xlt <7<+BW Hn2 X1spJg%7(+!9G8/ n3εۨ u춝hKia`YqdDpb'4&&V`QKg,4by b x$ qxF+"=AFhI8/#?,; F84y yȭ- IjGd3s р`([m8柗t+}uXU(D8pS %'R;t1ڹ(4:1EՈS ˺K+Z UPQPܤd1R ,61Im+?B{j L;=q|R'ĴC8 綝7,p6N]e(˃:<2q: M 5o'1ӵH#vDA#8֢9GXs]yC $ 2Mm/PXޙeB1\R䥿P7x4"a ymF@W"@u"ٶ9ŃtpxwF9aB#2 `x}OM^(b7m;n@b>'p`: 8$v\6\}熼:!-)kc!Ӌ6fu9N|PZntRG4"vFm.w ::r0#WŇNޅHHr;3!Yiwl$ ]M6dGO:y5< $|N:9h R% ~F{~r˞x"ER[lAgW\@d!ZdtKↁj s*sMpD_#bW#dY6&lf2n[eʨHﯕ ZҞeӪa.YV rb+}>4ssv"GjL#&[(S}Nc$^!H-x^>=<q#@C8<*?=X"aPРexhy!]Hھ:FKs+/"J(3AD(ȸ*)Kjs$IR8D@Qյ^%0÷av djX[v@ʧ hZcM!Z.\>dQnvTe3q![U!S7T""P8UN;#tѭF=̷,cL t?0z,%Rk$@"H1Zә0$)D p )ˏ 1ofB9:þ3>uѼ><~^*}wF6_-)lI1; g^w/vL[q{dI۞%i_ck[^p,I?hutiJZjm7͏uڟ=;y{#:K'û< & !\?k Տ9ZT ' H92JB~@[XO "E2qbEb 4~ֻqto[-q$նp*WJ^nG|8Ԩ?ІK"j U خ@<ӹsӃ- $i{oL:˴TcO#Gd"̭2 ([}>Wd VHZT&H}?e|Kv߂ @w-Vx 9Q׋J+ʀ4ͮCW, ?>Cx'{,; ;GEEP;4̡d9mKw9HpjN9C$kw;x)zn^L66jme+3X}Sa1 u=M#W@VP)cE}~\%ܳ s1W5u.8P_$\q7Y7P ?|b#tFrgĀ7JS烃Z)Hű47_"4UQ4bifPfD֐)/ŀpSCu/jS~[ܘ`Muhi% + 'n<[9EF{sNH4"13$ ktov3p,n9du.v7*Әx5~pc eHuqߐ;q <ȪAakjM"0܁Ywx~W԰Y ;ţ2(7{sqqwkClP33OCs X K^a˭Ru4M{dq [p^綂N6}36vmQ6#?8 " D:Q0 D=Eo Dpz8 暠!Rb6fk8VsUfha˕Yu?CϑQ{lZSqE 袜#y!K.u Z^{Zp]ڜFӲC z]_`Ό !BhQ\gF;Wj&Yߍd_QN>װ~?u.@gff'& $9)D>%o߲]k"TM#.:ңxdSQDCС($Pe%%91;-n!`\4t@P-?gW,9Hj ȷ6m:G.D=BGC"lޟ"u$jܲ,tV U'`3ne^\:FJճA gΰ{6N4|=tC-0D#2V"16`{QKi}9$U,T@'tzņUIZW፠B,f^26CP z$\B8 rꩴ &y?^sn%]*qϟN1 >1_@NŹr&l~!JN0!/=||u "\jX/~s=6t߽w3?eF"!FZ' eW, [!M6WݷE *PV8y-7Bޯg-hKF6eRu!U&gPvӀqѵ;9{ѝkail:9-3im-qVKTV\"V?] \y91;^+[Ӣg3=M3iZ&ϣr_הĨ<}v xx4]~ZR..G&]P̛-9uTsVɣ՟Px]nR OwVYi|?]~~Y?a`B=[7'1<'I d@r:#X )8M!HTCJG s A=waTD-4rfqTDuD-L]jdGd?ӂ6lh֠LA+?'R"F?j}߃{oֱ?Qڞovß,{ydî Оjw{/G{c%\In'e }Kzy0g9~8 /]PH$Q(7J*c+dDmߗ˼:w шwEKΙH@窜xIH^Pj=祥:N\Qn.s3KKvx\rEHQHle;mgI[ˎwczL@ q@Q :#ݣS[~s#% Dc;2t]^#O}w~k^Y^f<({bid{ ~Kkzϟ߫p!2RI @U;y0O${ %#s``Pz~ B]1] p0dUZ9C$pa0wCHTaøyy,%^S ߋJg{5ã < >Fۣ8/gr,t۔~c4${i:5x'; <:c 1 $& (O_hP#Db]tNDzݎn [sO1OTlFrpx(~=O(IU>ν\."n^'ewJ?K\weO`v̻=?P%8oAv?uטc&aw?1&`b[,=0paaǼDWRnyYz\sǡӓ+\9;>Ot,8Kf*ą_]ύP6ߟ߿VlóM]V|`HK=r}s~=>gA~c(Ȅ?8 TT.]+{hv\NSOP66EMf8#/9UV~W"f X9 fze6U~p ҉4OD^?JqFY$)[B a=7GO{c?Ofٯd6 (?0l-U~Gsay]#.G_)=ǬU,p}oگ!zt~S{pkhtN:at&p_]w1[0}fwM[:9ϾsY/76ٖZG ݛ>ozs);umq%U$\w| , "au1-OapP>xcs<F()VBT s.kHn-Wc6[ X c/GԎKW.Y'Nw+,ߛ#p (P୷8Ozn[9m5DtsѢCDϩϷΒ6r#[ۦ s04|Ƚ}/NEUnfy-sƇŨc){_c܈SwgFw*[#ǮƜ%a7/a]Ryh!Hs+˳z1aj1 *ƛnxA]294锢 :Qxc7=H,ߑ.Σۯ7XMǑG^Cix9E54nU#O L*֥-}3&P# 'agmX<žQ$W?Fz?[]]#9x 1r'aE˸KK;ǵ0]:7+0kK,k} ,Ňő|Qꈖ^6srB:Tluŵ:a3 z~ao% lQy~ዑm,2`1]/ϫ='n_/O܏ɦ?Xi< fh(. 4βCADd`DRڥ)q0%߁R1LA2R¯mQE>' %5H{f2* kEd}|_;~?̓}xs.W+:?w-0ucEGMפH6nW(gX/ yGCG^逫8dnd5o泅R9oəoўd}!10TD++i9ߞc]肰 _#JÕDFRMp@cl4Sq+TEU ׿QFUZL; wo;?dSe ru> {p nɀ<]4ApOZ]P?H zxQ erl(_Ev"Gp iu;"hOmQnG^MKy@//um6ǻ\ @9)yX8((XGm޾E߃Sőaq]kUiGϐt.mJW/M`wOTr)j+Jp?Vε?؇q֧sOK[DZx~&?u -|J"aTOm@X.'Mz"E-uQa{?n<1.kr+O:zC`>nwoX-ߝA6McD'eHw,vwtr1l^ELV K&8V~;GLq%֬ȅ D l25ds w'2aXC'7eⱚ)enWhA)b uu_q$X), bAҒpsoKy 4cpHe.h' Q U7ELJ6.@ZZ_}#j◳(߈>vu ;frjf1%?5/(L"p>hT! ĉzo?pGl_Ӽm8.{*v0u5G(E'ЖL =i{4/\6X_yG ]gR/rSb,7VAcNVrp!8ys2ާCncv>ES8L~.>yԯ!~4":!oq:7]=8YNs6ۮn0D3\LUPjZy%~/WoU|- bk F@=2݊/ Rw E49 |B?/Wm6 s waVuWUn H87cnYwE6Xާ䌢}KE /aě"-X4RI;CSYDw}AHt_/!z}wދGK镞 z{tjKjٓ;^BZ\Q"Xj'ae]d#ѳ,sj (nAyE h=/g&Ѳ4XǦl1Yzk㧂>9u}ǜR!m mv-l>-T9q3SyX2YuشJT)ۂt V?%i@U¿c|{`*ܢE9m19+2_ϱ:e#5,|^ nqgIbʏyY.ҷJuo.pK<} qm!ŞHGR;v[?чV Dˍ%HjwIl`jN TjŚrж]K@y$Je1<=RuvUZf"m[',]bB =rZkkHLrgyyAEE }b)ZɄ5j.IvQkVGFho+qpԳܢU+RNwGy>Vy&/yPI?]8JSl:>h*I ؉4!+cS5~:1!YH$C+9r|̏aϯ<: ,ٕ̠1E'Q7#P=dO?<(n4G,CDeGb9# qz2v?T$蝒WoSSÔcr G4vta UJW>[s3 wu+@{2+:V;.%9Lx?֣XāNOäFݏ&Gm}d4mz8v&Ș` RLL- GN_m]HA~.I&cu'1UmI#H@$ŋ Q ϼ@D Rs~|<Wv1^^>bX(*x֨a}w=z>Ӌ*kl1j~ȢPms}*$)'|͡! 3V" AȀb]Xm}&mEo'y/ږʚ)9Rqw0?y^k/k=gRyHx*^dD>D۾9/]=^f bxU^SJ Hۺhҽ &zn6`aAZ~g0?Deu[Owcjw {euDKrip/w:@`g kUU P[ɷqBL3Hp]Dk.S.eD,19srYd<Ne;x"@4>I6&{\3gh5gh68XM2GxM`E](`ZQo4k& 1NZĭ Zlb( % :`5AI"{g=䇨X^玵. WVP*@)  G~Wm d7|" `φhІ;+- ;3@ @\kȍCzBC9tBHk4E=ADŽܔDCPq5@AѾVk~{8%: 7%Ʊ?Fݞxߺ+rlC_8pZ2 8M0k(6кSgdW_gg>blM,nNf:`1  Y.-ai>\zea>.Vzc(GŒTu$1|yYzIߵ|*#OOOUY_ߩ^O3-  raOsA=sK?O 2)2 mUMm@?1']tºSj|j qPz% L^;*6ͅ:9]ڧу 꿂x٥9`1F.w 8<˱҈O]qWo$uzv"yQ;u&~t0'uTGl맫>;ǚrJ^ ϶Kë`ulR>ftM\((UD&d+}KU*T[Լ"ځd *ms?4>lv=}LDL7ߩq9˧wg#w$mv'p Y-Ә Z6ۅJ M @^|^j=:ag;!8FQ0dGZ0cnCY[t]y:67qΙLb $ -j| s'l_Q> bI&[䇨34p墅Q PLd +Les3`{^8#|7s+it$*1{AӉ˪zDQCTCw;{wg¦$EAI̛C0oѪi Z@;0#ÓB"B!pь$ 7g O@W6h3f83kԄH@@bds"JB G j4`<>'#q/:HY~ɖ.A bhѠ3znC!$0((۰[Kp_-ȥ@8-UY pc:Z1y/Cus ?<(nQQxƠ (((j(j(j(j( ZUUyn}YNX`?{XI(Zt$I1նP!(nv`rdMyW.ؘgh5 J9~,3h%!\)Ə ]Ӎr= B(B!18 lhIW۹ܣN.bI2Ʀ^M! `Fa iBF"$a@wópq` ``!Z&"b"Vy2X;fȚ%H" ^$$ "( B( Z* Xh*&"&&( w.@xRވ2DO48nbwmH(< eӕcjV 'qgb@ {BYջ.ےl}ǧQfTam<މ.GP86neU}I&!7۞H%0#Zd5hpyﯼ1-0dL\_o2yꆉ& ȓcBDE\*7IFɟnX=&iΈ&VHXbMgzpZφ5`" A2~&Suk`zϝ Um}6;!7e*H/Ho'&҄ivGG$6 RÔcv;zxr`"9q^'H9f@|XDmA,cl*=%.d"kFO6 jsytJ q紱~nQ2lM*n?Gu,s/ᖙ֨|J EY. tzHk]+{w.AI`}nm ߑ4x4upi%,CwC $ENV $˻`eِHz!^}-;6;VTaYפ喗~*xwgZ\PJ%t5_uLh`l;O5RGkvD X"sTL ccb0\>>Q";\f8ďVG8"E!"3 'e`j7ּR*&ȁ $}A̠s\n jfim>4LE d9XWф :^$$'Yˇ< Ue?8);M^℀M##t y8_wc}!P-gsk"5u\ ~$! 2B铿ƭm^X!n1 '%e=?gjWY)OWBߵ]9*O.񷷲: a>ɍ$kr]K"\E옛c,VP˒ӫmίWco˿eot8o^07Rd2GL%ryg^$~fYl򟾗ß?|Ó>oz/Ws<]&IB"(+(o8b }b!#oLbFaAKp3H@Lظ0@;}LRjB dp# NQf9maX_K _s*_AfE#n܉Mkp!,G J!$zTٍF(-˸5r;:pP!>"|+O*Ȉ\u v± Hܱآ' JKLu ln"K+R@͝UuKN:lrF.}HbI|jI@Q/>t h `-ҷT kXpqݐl)Vpp[4[)vSc430> yg"ʸ6^+X4 3`?f3ktR@ )+<{C}&"5*:.λ 4"f<Ff,ij } dk%IoP2?s: le.3"Șכelmߟ&*IA9-԰ɟWſϥHB|'wXX}h ߊaI.Õ˜ ]{Y!>F_լ"Ձqʔ40\2`.@{xWG4)ԋ-j:ɇ4p{gP@(":#6a k'^g $DXÄ́Î7UbD;\S^-ʶˏGdlQ/P`e׺L6_~oG:^xæǫwUf0JE=r*wC:Ӳ.Tp$~!#*Qj.S`|;xy Ch2B(wTi2N~Y˻ ~ƹmnZM~@d4(Sٰ2ŏITQ 勩%DaR15CDwW2xut"SW(ra.` 0$I=u $sxï;ѡbm#ZgV@2!kyfPdt,ʐO<+Sc#ħ!{Ɛ%= 4AOXYgL*BP3sa))] Uu#TaTĦ!cBcxڡ# }W6}Ay1Q~k,O]CpF%K0f<|c>) a" [Sڣ<0%F_r02%)UKL[Ng6FY˵G%UB,#u $5pR ?Zr0\8;Bu|J y=|/F;wB6tx[e)GWQڝx!DmcsD 8}z#䐺\cԏU߮0v,.KɑmK %#kgY̍h]RNV"o ˼R=n#eԽY{(95y