#!/usr/bin/env python3 # # Build a systemtap script for a given image, kernel # # Effectively script extracts needed information from set of # 'bitbake -e' commands and contructs proper invocation of stap on # host to build systemtap script for a given target. # # By default script will compile scriptname.ko that could be copied # to taget and activated with 'staprun scriptname.ko' command. Or if # --remote user@hostname option is specified script will build, load # execute script on target. # # This script is very similar and inspired by crosstap shell script. # The major difference that this script supports user-land related # systemtap script, whereas crosstap could deal only with scripts # related to kernel. # # Copyright (c) 2018, Cisco Systems. # All rights reserved. # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. # See the GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA import sys import re import subprocess import os import optparse class Stap(object): def __init__(self, script, module, remote): self.script = script self.module = module self.remote = remote self.stap = None self.sysroot = None self.runtime = None self.tapset = None self.arch = None self.cross_compile = None self.kernel_release = None self.target_path = None self.target_ld_library_path = None if not self.remote: if not self.module: # derive module name from script self.module = os.path.basename(self.script) if self.module[-4:] == ".stp": self.module = self.module[:-4] # replace - if any with _ self.module = self.module.replace("-", "_") def command(self, args): ret = [] ret.append(self.stap) if self.remote: ret.append("--remote") ret.append(self.remote) else: ret.append("-p4") ret.append("-m") ret.append(self.module) ret.append("-a") ret.append(self.arch) ret.append("-B") ret.append("CROSS_COMPILE=" + self.cross_compile) ret.append("-r") ret.append(self.kernel_release) ret.append("-I") ret.append(self.tapset) ret.append("-R") ret.append(self.runtime) if self.sysroot: ret.append("--sysroot") ret.append(self.sysroot) ret.append("--sysenv=PATH=" + self.target_path) ret.append("--sysenv=LD_LIBRARY_PATH=" + self.target_ld_library_path) ret = ret + args ret.append(self.script) return ret def additional_environment(self): ret = {} ret["SYSTEMTAP_DEBUGINFO_PATH"] = "+:.debug:build" return ret def environment(self): ret = os.environ.copy() additional = self.additional_environment() for e in additional: ret[e] = additional[e] return ret def display_command(self, args): additional_env = self.additional_environment() command = self.command(args) print("#!/bin/sh") for e in additional_env: print("export %s=\"%s\"" % (e, additional_env[e])) print(" ".join(command)) class BitbakeEnvInvocationException(Exception): def __init__(self, message): self.message = message class BitbakeEnv(object): BITBAKE="bitbake" def __init__(self, package): self.package = package self.cmd = BitbakeEnv.BITBAKE + " -e " + self.package self.popen = subprocess.Popen(self.cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT) self.__lines = self.popen.stdout.readlines() self.popen.wait() self.lines = [] for line in self.__lines: self.lines.append(line.decode('utf-8')) def get_vars(self, vars): if self.popen.returncode: raise BitbakeEnvInvocationException( "\nFailed to execute '" + self.cmd + "' with the following message:\n" + ''.join(self.lines)) search_patterns = [] retdict = {} for var in vars: # regular not exported variable rexpr = "^" + var + "=\"(.*)\"" re_compiled = re.compile(rexpr) search_patterns.append((var, re_compiled)) # exported variable rexpr = "^export " + var + "=\"(.*)\"" re_compiled = re.compile(rexpr) search_patterns.append((var, re_compiled)) for line in self.lines: for var, rexpr in search_patterns: m = rexpr.match(line) if m: value = m.group(1) retdict[var] = value # fill variables values in order how they were requested ret = [] for var in vars: ret.append(retdict.get(var)) # if it is single value list return it as scalar, not the list if len(ret) == 1: ret = ret[0] return ret class ParamDiscovery(object): SYMBOLS_CHECK_MESSAGE = """ WARNING: image '%s' does not have dbg-pkgs IMAGE_FEATURES enabled and no "image-combined-dbg" in inherited classes is specified. As result the image does not have symbols for user-land processes DWARF based probes. Consider adding 'dbg-pkgs' to EXTRA_IMAGE_FEATURES or adding "image-combined-dbg" to USER_CLASSES. I.e add this line 'USER_CLASSES += "image-combined-dbg"' to local.conf file. Or you may use IMAGE_GEN_DEBUGFS="1" option, and then after build you need recombine/unpack image and image-dbg tarballs and pass resulting dir location with --sysroot option. """ def __init__(self, image): self.image = image self.image_rootfs = None self.image_features = None self.image_gen_debugfs = None self.inherit = None self.base_bindir = None self.base_sbindir = None self.base_libdir = None self.bindir = None self.sbindir = None self.libdir = None self.staging_bindir_toolchain = None self.target_prefix = None self.target_arch = None self.target_kernel_builddir = None self.staging_dir_native = None self.image_combined_dbg = False def discover(self): if self.image: benv_image = BitbakeEnv(self.image) (self.image_rootfs, self.image_features, self.image_gen_debugfs, self.inherit, self.base_bindir, self.base_sbindir, self.base_libdir, self.bindir, self.sbindir, self.libdir ) = benv_image.get_vars( ("IMAGE_ROOTFS", "IMAGE_FEATURES", "IMAGE_GEN_DEBUGFS", "INHERIT", "base_bindir", "base_sbindir", "base_libdir", "bindir", "sbindir", "libdir" )) benv_kernel = BitbakeEnv("virtual/kernel") (self.staging_bindir_toolchain, self.target_prefix, self.target_arch, self.target_kernel_builddir ) = benv_kernel.get_vars( ("STAGING_BINDIR_TOOLCHAIN", "TARGET_PREFIX", "TRANSLATED_TARGET_ARCH", "B" )) benv_systemtap = BitbakeEnv("systemtap-native") (self.staging_dir_native ) = benv_systemtap.get_vars(["STAGING_DIR_NATIVE"]) if self.inherit: if "image-combined-dbg" in self.inherit.split(): self.image_combined_dbg = True def check(self, sysroot_option): ret = True if self.image_rootfs: sysroot = self.image_rootfs if not os.path.isdir(self.image_rootfs): print("ERROR: Cannot find '" + sysroot + "' directory. Was '" + self.image + "' image built?") ret = False stap = self.staging_dir_native + "/usr/bin/stap" if not os.path.isfile(stap): print("ERROR: Cannot find '" + stap + "'. Was 'systemtap-native' built?") ret = False if not os.path.isdir(self.target_kernel_builddir): print("ERROR: Cannot find '" + self.target_kernel_builddir + "' directory. Was 'kernel/virtual' built?") ret = False if not sysroot_option and self.image_rootfs: dbg_pkgs_found = False if self.image_features: image_features = self.image_features.split() if "dbg-pkgs" in image_features: dbg_pkgs_found = True if not dbg_pkgs_found \ and not self.image_combined_dbg: print(ParamDiscovery.SYMBOLS_CHECK_MESSAGE % (self.image)) if not ret: print("") return ret def __map_systemtap_arch(self): a = self.target_arch ret = a if re.match('(athlon|x86.64)$', a): ret = 'x86_64' elif re.match('i.86$', a): ret = 'i386' elif re.match('arm$', a): ret = 'arm' elif re.match('aarch64$', a): ret = 'arm64' elif re.match('mips(isa|)(32|64|)(r6|)(el|)$', a): ret = 'mips' elif re.match('p(pc|owerpc)(|64)', a): ret = 'powerpc' return ret def fill_stap(self, stap): stap.stap = self.staging_dir_native + "/usr/bin/stap" if not stap.sysroot: if self.image_rootfs: if self.image_combined_dbg: stap.sysroot = self.image_rootfs + "-dbg" else: stap.sysroot = self.image_rootfs stap.runtime = self.staging_dir_native + "/usr/share/systemtap/runtime" stap.tapset = self.staging_dir_native + "/usr/share/systemtap/tapset" stap.arch = self.__map_systemtap_arch() stap.cross_compile = self.staging_bindir_toolchain + "/" + \ self.target_prefix stap.kernel_release = self.target_kernel_builddir # do we have standard that tells in which order these need to appear target_path = [] if self.sbindir: target_path.append(self.sbindir) if self.bindir: target_path.append(self.bindir) if self.base_sbindir: target_path.append(self.base_sbindir) if self.base_bindir: target_path.append(self.base_bindir) stap.target_path = ":".join(target_path) target_ld_library_path = [] if self.libdir: target_ld_library_path.append(self.libdir) if self.base_libdir: target_ld_library_path.append(self.base_libdir) stap.target_ld_library_path = ":".join(target_ld_library_path) def main(): usage = """usage: %prog -s [options] [-- [systemtap options]] %prog cross compile given SystemTap script against given image, kernel It needs to run in environtment set for bitbake - it uses bitbake -e invocations to retrieve information to construct proper stap cross build invocation arguments. It assumes that systemtap-native is built in given bitbake workspace. Anything after -- option is passed directly to stap. Legacy script invocation style supported but depreciated: %prog [systemtap options] To enable most out of systemtap the following site.conf or local.conf configuration is recommended: # enables symbol + target binaries rootfs-dbg in workspace IMAGE_GEN_DEBUGFS = "1" IMAGE_FSTYPES_DEBUGFS = "tar.bz2" USER_CLASSES += "image-combined-dbg" # enables kernel debug symbols KERNEL_EXTRA_FEATURES_append = " features/debug/debug-kernel.scc" # minimal, just run-time systemtap configuration in target image PACKAGECONFIG_pn-systemtap = "monitor" # add systemtap run-time into target image if it is not there yet IMAGE_INSTALL_append = " systemtap" """ option_parser = optparse.OptionParser(usage=usage) option_parser.add_option("-s", "--script", dest="script", help="specify input script FILE name", metavar="FILE") option_parser.add_option("-i", "--image", dest="image", help="specify image name for which script should be compiled") option_parser.add_option("-r", "--remote", dest="remote", help="specify username@hostname of remote target to run script " "optional, it assumes that remote target can be accessed through ssh") option_parser.add_option("-m", "--module", dest="module", help="specify module name, optional, has effect only if --remote is not used, " "if not specified module name will be derived from passed script name") option_parser.add_option("-y", "--sysroot", dest="sysroot", help="explicitely specify image sysroot location. May need to use it in case " "when IMAGE_GEN_DEBUGFS=\"1\" option is used and recombined with symbols " "in different location", metavar="DIR") option_parser.add_option("-o", "--out", dest="out", action="store_true", help="output shell script that equvivalent invocation of this script with " "given set of arguments, in given bitbake environment. It could be stored in " "separate shell script and could be repeated without incuring bitbake -e " "invocation overhead", default=False) option_parser.add_option("-d", "--debug", dest="debug", action="store_true", help="enable debug output. Use this option to see resulting stap invocation", default=False) # is invocation follow syntax from orignal crosstap shell script legacy_args = False # check if we called the legacy way if len(sys.argv) >= 3: if sys.argv[1].find("@") != -1 and os.path.exists(sys.argv[2]): legacy_args = True # fill options values for legacy invocation case options = optparse.Values options.script = sys.argv[2] options.remote = sys.argv[1] options.image = None options.module = None options.sysroot = None options.out = None options.debug = None remaining_args = sys.argv[3:] if not legacy_args: (options, remaining_args) = option_parser.parse_args() if not options.script or not os.path.exists(options.script): print("'-s FILE' option is missing\n") option_parser.print_help() else: stap = Stap(options.script, options.module, options.remote) discovery = ParamDiscovery(options.image) discovery.discover() if not discovery.check(options.sysroot): option_parser.print_help() else: stap.sysroot = options.sysroot discovery.fill_stap(stap) if options.out: stap.display_command(remaining_args) else: cmd = stap.command(remaining_args) env = stap.environment() if options.debug: print(" ".join(cmd)) os.execve(cmd[0], cmd, env) main() DvkhOn/&32l`ЛEac~z9{eh>-rGUU ^GmAgLymvv;T-Ό8iQSTٸ¤O*hT~Ki«c!c>; psbyM7*qɟshL>Q"y3iDqb5!r$oW\BTgl8 6 ĻdY@z'?1`N)XfGdF(ȕjFŘp[ˢhPE|'I)pP%mJD!颉?#xqVϋ RBnD9`N j&:l%ͥ/E;g f !%[?|]q{ylRwqo<.gu.iQioJ G.wO4&,UU?Z#cf-yJt(EDH^yKMK^җ.޸aRrPEDe=R'm|\oƾshs%׀~A, 4%v :2R|o"v"ybGOBU,A:}¢8A G,hjNj>7x+;MX-,-Vk5$U/Zx:2<:~XkxO/N^UDFQBR!rQ|w:tx/4j+&A7Ia{M 8Rr ETJOw ^ϧdFy*E{ HR V^n E/)$2f*̂qGZCYh.xNVQEA D-G~>{IX~6xVd$hJ{a^ywR@c~iL!hBHGRkfBP>Tmx<7'-6vt8qM0|%XOԃ$Bh"|q~]#Baz28”@~$p|2OmZD cr2i==BXN$W⢝$sr%WRLZXEchޥK\-GF\ȹ(~%ixeW"{^bQRP4t{mCh0ۆHaKs(NX,Fp&Smzgv]gOlQHԥ FEAaFm߃c?Ex=# 6oBH@> zrvd9{_jQzUWX^/ Yh8cI {=pJRw1j@D5wONz_W:?\ys)r%y ʷD0w2>#-1Ԟe柿lZ:eXk8ȥ;IKlLeG1)~ \!) Ir%*zWN;qł+Tf,2-$ʻXosBJm%Y[W׋^#2)֭E1:gBK,R^e9і3mrqW' آ|פIoxSBO_gFz cyv{DC&2{9=p(8Ȣ*$S#H~OKxy<)a5_ADqˎdg3`@bee7BSB|!4Nx PuJpD }AkdΎ qmlpLySQSLnQ2$Mq韀J \ }4&AB(U*fkKPRf2IMo8Zw/dyYC;}۷O|r? 5ZZ{F3VozAK{0U [T8B = mMP7td3: qNn\jۛq#U{IK,acݼ]}bI(y\廲@4,dI K+Ԧ) d_ݾR9AH?o"zKĿt9BDrY (Ff2vAzaBjaHǓ2*UE1H>@öc>s?:I~n ona($*fB4qu0%SNxfE%;S2iTf-*qTڔ Oosl'㹲2CsnwOHǃf10pl.qWpQ?$;Um>&̗;kNŮcaEx@깢*$֮gӝ:9Bb]z>8[6:g@Q\ާ[xM""G'A f>HA8uQJ`CFxdr jux0Ï^aѨ \:)ώE޸ʻ.;qbhnx&U-k~ :֣b7y /6PoZ73w1 Qu -:.![3 E˦%<{'f9T޵:^a32x ")wMg1-?.?){<Ǹet0_ вoKͽ;T1r-sƘ]q;i?MV9M7ɦ3Fz-N3=u}Jrn=+G`g1Rvh>p4R [O}Tg$ TpoԠK= Z"tn_c!@LD5+]`LKLQ+`']>IabMB"PqA >7JJ_R@o~ ۽MdoPPAtcQP DcI O qxE8x @D:P%cV8K|A1@@>M ,PÎE7Gk&E_*HB=k$ /$/yۣl>ّ͠6AaTd㶂]ֈM^"[j!Cz|4qN:l7@n"9N4pJA1} Tt{2Htp~k)!qq@$38\q) 4euQNhM{hTf%})\4AQ28f)QC P4rnVϸ(8n9d=`A$ TmS۞<.Apc%]YBl8_Y!DDO➣G\w]CEED ==gm֭.}^z|ujtO3n^9pKhRU+ ,x2.,;w> n'܇G'j,D V8"3@|0wghJDD+)j;qeXd%+ j!)rl~ON^MGmJnrqJg:\*C20I"rp2 *UHdi6y@R|d; 攧؉u*MnjЄ8|q!˴*mQVUh0L,w<(WӨDv oZ13!rcVYzi^_L-J洚,Ifb'i+[|~˃}C] ;&3!+S<-I.zjAA,~ 5CBEJٟg&~.sae@~=POC(|{?ȈGj b܂'^6"k ,PM?7wlA8\JEa0(6#Xʫj"d 'ŭif¦ i3]KRF֣͡R9$e(*5vw_7 ,UDf h(EeD$CE:8uYtC8F1%"!GyEBI6J(uRpb}S4=#h> \6곬I( sO9ѺGah},BSobϲ\+"3S]ރS(d>>oէy2*iXƏ:5 M 39m\Wҍ[n.T^탉yΩ#cb]pqЫw< " Zhӣ b!(% 򜂗Dc@j PԮN@j159:i_IT@֔-)X}܇n ?4m\ل2D٤o=&:Mm#j䨫S-ʊũX6i.MQf a؍>Z <8L\"T%V{b:}3ֹH:s 2R\eybb LD)d1ك!0Ra(x::_]TsRO:#2^87dfԼ#1gRݿ:C77 7jVcOߓb/' σmE>=gqEwͶZ/'=lq4`ٯgx˿44E% E1K5ޠ]/ ggP0+/qA͸1MGq(wwL`bbDB/RblՌ{5={N8qb9NG4&ka~q/h̷`&[' vO9$FGؙ7WY:<." eNl/k.M&U;d+H*tgfwޞC$U'}"3Dy_k2-}~eY3թ^؂T<+|#S ENݩZ )/4bQ/V)[њZ\:#ls XЂ?z025ODsT\:. ߊ nÙ]6mhyvBlc|6븜ͫn#<Ô&t1ku|KqQ8X"/qIŹ` -DGݗ]?H̔3ayϒֲg\T9H] َ:¸B6^UT.X`}rVK~LZ ]c:""{YK.뫇: 8hjDRҶB~e[X# 9H½qV;pz1֚ܨif.nشgDŽ W{ v!ƂZ(I;e4τ^2,aT}<6\ptr(C)\:JS,P_@6==eб&I(=NE7E"O2G3<YEII6tdh.ã*wAKMRDI_ǩq.#MY%230m`Ә]G!RãKMO) -Clp!oSMA§lhOBrgߦs74s#Nke:YeʁQk,%!;DP;*D_̏j/Z~ o.X ""\=U f|JPx)Gc7sNH~b~i /#19*gW#MlJ:E;8DD'%aviKXC"<~&4&R&,0gr'?LqaQ0Q[u{/#bdwsۉl rdyצn dlu|x=/n\s `g Z[#WJh2۳DOqr` ʪ -m̴5?bW;,{7mxȽ% GpoDF@REq-9uAb!t9K }"@1ϯ۬6$TR;;9Yy%Yl*v׃ΊSd#O\i6Jl#l#-k!YoٰЋcq"sLBI E[ρJ ZܺtRNUwbBFA,*}! 3+>)LRSR_UL8RdX^0aKP oIeسnPӽS5{C8,WIu!| 7Y' 'gJhnZMT5\)sme޿٫W 䃗6UtdN7㗶?oƅ5/tQ&ej}FR,a@6(!Y W^l_-P ÝfʁUU`fS/,þ(Xٱib{ҨsѾ~Dľգj56rFYǼY+91<۴l毺eLbh*z}&j^ź P.̙NrudQ~ꃢ*<}K zO),3uckTj.hUʕORG$D|ΪQ%-" 1Bs@ra0Dg1\Ѭ4 mO5%uy lL#1=c$~>>O:F;Kkrdhsݲ B2S׾]A>4W3y|Wl-!kc2>;ڔeyc"یق<;#bC0V+ծ;Q/R/y~(U~tDՋ9"x}ﺷ; _2#Q=YW4AE(b !֣YCġZ(a.Aidb7qи|3Q10뱙'IqDrtً(`O*HXvNW?)J'TGG exa|dZgR* pSP.ǭOk%r,H2/mGՕmdOS)W*遒S,cn$d膰i$k%l!*,չ{$VnĜc6>琿8|6V%>7=Ͽ۷d{n n9őE:n5:ŸrCYy/9l\H1l1Z!ikΑ,\H^19mN 'W#s y^41X,tHl=,~R\oUTCՑTmE*]JSB8Ȣ_Z$U7 _5!w9;bIk6=*18V<>uV~V*Kb~ݰJԴC NM}2z0] "u6y2+shgOSnBHdݐ!f0<UF5eW77i<ag" ڠ%Ljn&~Gު\^o)"4:Git=ëR^=&Q.`9}؆ILU%6M#Kz% *؄K_V']pqތs%(|*bBZϥ2iMΊdV蛉ma ȗk1tA ]A]F1U-9Wq`]3̰  6tҩJ򐨡epqb{dM,FȮ(_H21(\N)j3g8)f ᔠ-Q K Jӭ'A&!(2f(b.B]o, HG_<ɫx͡E*{3O!aif nԘ'ďA̧$N-`7Ȥ7ڊ[$e͌g]FO9;io`´Xֻ=~I:2|H=ɇA f 0Ī 5ŀleh M$Pq]:|)x,H7<nxbwGY15ӑ@9y=۰g^BF&=i08iKP==:)ìuErA>WյHX?M]6Egb)磋jXdDD@Y8&:q.0ŜHD(:כg}_H@ S:7&bDoATusLM'݂yk~T濑/g1ui3,Nx?O ]ս԰~vB1L0~t=|CѢudU}ME3͏:j4[3 (TqM$`{&c+`3p\>q)HMa㼆#^$j kʄT4(V ҼDj5ِ(LnOG!ur!~z^DW!21#%$}bEwG6"̪=]G!(y`}ҹas\Ol/߲y 퓑A&@fl #EQp +AbO[@* wp޼"*hkZ]o̝MM%޹e2޻=Vtn;}s{E\o0ZJ[X)}cA0 kvKԆHPH4[vhM:a;`_ZsU1ȶnH=srJ mzl$Jwh Lb9Y>>)TPN'QM%O r>ŞRɋo˖IL(EnJUp!{0h\XkmhK9QT!?9ފ,%ސ*]A\tHoE J1Xj}x`O&~RHcHF D\:d}bi* C&9zɚW2+ Ufm 3T>$qcUhx 0)4u)HX?4ayDIfVgrB֥.ciԫAwJUgj-`9åx]H.=٭AGB^f81ޓ70gF+ 8 HS‘bNF!s8 '񚾆K$v983PC5ڐ`mkCr;f* {*)|h'jt7cô0Q-)>!kozC\nB,S(ViR {G0gIcȎM8zzO뾐9$'k(̱r&׬#m[͒ڝuprܾ*HTSEU`v il Lh=]!hIW*.ȕ )â^Yl,T^qȂI~_;g1,g{̪* -JxʤܨΦxy}:2j'2 DoC\i[=QpARigٟ3lE,K>  \YL#;+ k ܉CIr1',~[چfOv :} 6%zHs0doӡhIBV^Ci=v*,,SW_n]دm6e cH'-mknk_7J`kqQӀ0X+$U *(4w^J"kGa/ ("]D݅bvci$Zk6Y^h?悚qF)nu%G6;"Ox1aTo+q"B#dgmٿOk ⟢ݗhy"vێwaG.vSdS/邕)b7 jF%Kj%FܧrWvj %^Hmw Gl_H̓7Eދ z6sxsٲێ,\+oJ7mXA(9|]NPQVVa1aTZ^-dYep*A# w4sY-v:t檍_xnDM*VrBhkMTeؤQcvWCTaeˬV҅LBx%9xKb HFV kIFN0*D$+=wN^DBLB+`*Eߦ[.)1a+}[B{36FDbTH.V Ce3|V}G=}o裛^1XH׺k|.|MnWԸ׫ٳ_V# 2o RSa#7C7.S!Nf[Ho(HB 2JyHk^ƅ Oe؊\^0&)*LIKbD,VC Mu7: B>rut?[Y:dtpnJ+6 OiT .A 1owCd"U@[#go;|NScUS' H8O ҼBu=u2ū[L3ݜIMEQTnVS`P۔ TKRa4m>[zEQUo͇S%43@BTm#9n7m.ӚK_G8鿱QNc+$)5m0O<]҆JdbQY)LWaVjSÒ&V\ǯyu63$CXSe𩪹5v{$W'ؾ5c%Kz 4(D*tf|jk#-fH$A1T8q+o=p؉ 2Nb3DS>+e=5TDOe4gF"3qbgņ\)Ǔt{v0rUATT`uAakGCh$E4 8xCpx}u 9.^t@@iO@apn 甄h2ߘN `lCgU B |n^~:h?P # 7^Kw+l"u28jrv_ xZ׳plq:𓦸a& f$Wsk 5F5?,̈́Z EH*jWWe~K_> tKL'1ڰ Q+'7%EΞC<;iw&;vf"Y*F\f\/[Pm L5;*%ؚ>G C#y変a( r/! Ñ9fHҌ~b*RSR\<0v]@2A3i `R:"b$tfwNjk85b{<__Gg<(Vadaatz. blsdoto.U ,\((9%$Z?Ȣ\c1H1)vr%hD\Uȭ ߎTD6|ll9~VҤU6˓ifΠLEkVAa$o8l2AjKymg&M[Xf|# bKXZ䍷~t˷Hb7Z.XT)HT9B~ :Iᢄ*bC"L:k Ʀ-Ɓ0kA NuوPaxOp3^FMkJ"~:J]dZ4ڪ ,mL21VCсkd1vyz??AےRxj9mCOoi9D x-Ϸµ_a?ieN!>,t/&/ɅlgxO@h"͌t2bb۽ڏQ#^sw[KfGK>LŊZ 23!6K[4my~2/dv.N5qٔ#Hr㜎V%_# " !ͭcEЖ:p5Obڴ.,3ՊNU*qe;(Ny:q7$pe zй/Wc= P:=~i&&- ђbL&`(L]R2Mஂ_%mP^IUC!NludK"eys˫kݕ5e8I:fSvM$1& 政m$ʿ m$.0BoH?;h %dRffh)sx&[X[}i4˟vd['m;~(!.Aoj?of#%,##8qr&fHՀw h/Jl<Ɉ, ېQ2&f*;לybmac.v) o_n Yl8g&q+_N=ϝoNC#qϗ9Z!S^w$w^lwlz.5N8;+$AA39*{IT!pAl;6 +WCs%vlǎiV((TQa)*xxw!9yzGV2ѯ=׬dMKp]7Ӱ5_T#\ɚُ8,˅nE1B0TP'#.^Oc" $ ғspۅviG_ c64T3SE6o-&wjYE{P&<ͦ7( tng*&/d 0|7A]8=~ѵQpgM|)z VGMT>Hm_<8@ۋ AY݉Xe*g~ 4LhL?Όrj#&mÉK$QD$TȰ0bb% ͝햋8FOz& G;|掠Qt} Æ[q5/nWKȨE8W5#Aܞ{o8)N"@4t=.oL˼M7ng+ط-iϵ^h<yP2Et0AM{b—;r9BG>X̳7' ! 0`)uX 4$9׶/jcq l%1f-ϧzj{}#,R|9O,wZ[ώ7yJu^sD!V/.0)v 3'5ED1`tHp7IT&A%.tgâp֎r,s47eQd zri>!jBqD > (B ɰ׬E3Wd^]2%VʰI<M̖]u`~ e|=X]zȆȔr$SSQku1  }?2Oc~æf u &pQ`B#U!4Y5ۨuf|pe,:|#'X~e*%!oE&`QӫG,t2La<#E gSͮFN8ٌmJvyR1 D:)2w؅=Xl4zl'-ht'd/<[l, O,k^YYdšh1GNc{-v1k̼٭,Q(6&HB:&Y$}ՊXLўhC(uLLxj|8٣ 1 ޼m-Q!)+3,/(Q GAMTSdZfcP |DrdI0PI& c v#An# \6@&#QM $Lzg/) E#'9ٹ$~jR8߇vj2GK +RH L.>y$A>N#33AvQrߨ9 9 kņA0N?f29VfZqu6vΌ}`ݖ!n?՝{˦ryƫ Vax֯JcV#|ůMt*K=\tR@óVi%)-rXe %7$+>ۊ]! {겼IG6l{$l,g7^^WYNprM0VDPbH;J nq˾5poG+Khp}ғ4{/?uv71a?vI'M{2XwiÙ1mvuAL]^PkNuБcU؅jl SsP(/z\ģV66l6O08̛M,5lɢs S V+ 9V\a>Prs1.1$AttU.#Ki'<,RtrP~v6~;k!`4= w trb2bsQ-v&Φǻ{&I qB;6 h 6n݉c.`(wEyiA )zm[V~7N5TP ܮD^ kMGuY@Ң]i]տOwSkrzd)j"P]NwׁYol{voSĄtSk -2Y"#̔j]tߗ&|2lUR8@S-I$W}![K)/#΄.İÓoW)8+i #RexOɹ-ڛp0wm9TD^ӲuhsU5F9|z =ږXFҕ=.w= ]8uDяP8u?Z$ҫ˼wDnlȨL13">=r1Slou9ʈRסuў$ν{,2uLW*87$rgDR3wB0ŢPm~'#Gz;7CAOHC$A? <XRMua\eiTtyn 9Kq2crJSw!\F 'vxzsUѩ#MLؗJڱxo";Apk"?GݢqV8+7#, 6uļR+A"}+/HR.kT}z%Nˊ(_Dv/7 H7.ԨU͘nRaPmdyB{[w фM@*2Xב908$dHئ7q3!K>LN]^逺[9i|k"R(|]=aM$E0||imԝ KBWTK0r6t )#йt1 +#@W^C6gq`ȩuKΧnZNslD9묤+F_TϭW7d7-jbj, I$Ƶ($3Pͥ3^[ R` } T7P\^]ϰ5+f1 bzb,5 ˍ$)|)B݄qc"STx^,\tӢa|Ăj|fӳM%fv#7*P0w +n 9xҢ?!Q5D@P[tۊ&KH~,*)<%DSȫ?*<0'j\D)$T{2BQrqI 􎌔*Ҕce̤'MOIqp,}Ioy2J 4gpOzh?~4rdADAmJ!;;/nvDdyY.quPw8fFw?$R 6sX*[FE`(E8'XriX'~>Eo@}ιUC32"P/[+\sR,.mO]@I$$rGY 2rh08@ ?:gsWNU!Gyήt)# f}qa`vk[8cF5lsxXIu۾_;?8(^e*J]9sU_}P\:oeuZ鸯ݣMof[ޢf3Z#-OONx'Oki}/B,zmh1aJzMUrQȼc),lT._Yŝd9{Ъ`5nN85=dFn\F|N*m8.\eE6L31YqYD#>Xc|qJ$stoi ⻢8͒GH'wz8WcX7.,x $zԘӛ;ѐu kd򪬰㯝:\V'ߢ F(tEO ӬV&x續θ5&x+{P^ 9 G|?Mͯƭ/sU3.?(:$%x^ G<4=f{ LdR!d;hWGSY`^O7[}Qklbyd5^LG5jؓx7&R6"4X;=ovO堲gkny*s8KuO/7G.8%AOH@{Xf9~{~0E9e5И0׎/fMk&gx3aFWi9UWaG?aL}90`%rh&t^`օ^崤l^^YJ萾5Ѹ1[,GFCָt-K9 <,k9ug ߺ.&d$ϻ{E}_fOi1[gg3 ¹Gת41,xy~PUTg#5ƜଷoiXxR>X?EwVU84:Q1C&a~DY1.If$)%QjvO,K^kv@2ۡ ~ɰ fmd"nLJR{2XB܏@*3p<2IRC"W 9b cAtv|ȻЉI5_iKe/q3T`t HhrɟoV}x^E~Qp-3RA |f O"*S/' Jյ6CIٲ?oo뽆X iY1cYtc_-lN_ïCgʹD*^?'g%<Ktr_z 1S oh"I7ZF=v5fhǞǟnS%;ӱfc@|+G۾zS2$nU"]'ao'= /+n>OAe="j#gӧ~1Xǜ`ɹ;80q6_D!9AOsoӁX n_my.i6_K߬5" *EcFYY|EH4J/="GMRM+{v 6+BF%ghqh(>><52iJDEb處(4K|F+`'OfFnK(Y:A;Dyݛ-tNUSE0.(. ,h,ie8˙ap12q#9- */Y ˆA$(%8w?7mdXD\0PJAP6ȶ! #[$.N0HA p͋.SFv!= I 9tX!ͻ#A:n \&cǁ)2H %&k?EK$9)j9՚ZԺ#diW|+>7933ٱWfŶd8x꺙b(kDeʿ )jPEblX0  `0y0g}v0hQS4}i -2)*WA18*EY\ y46/Bթű$e$MKL1tNu2sS8LrurqZ9pBw*Kw:MfD֊3K*+ʃ7R.:WпSE4í@j:Thё?bw6I J330UTՂ'$X%~,FŒ=ߡNkG$ ȑq(z10A';R8 R/6$3oT>3cc!td41n!p\a~dge`p0bS)"\D&(BN5A;|sH__/cDF/zV{M6=bIL$+|ض.1T1o2u m™//- 9 tݺZxɠp!U`I3HЊ]2gN7] G@lM.':r ʷsDK:ú iz}fDv `#~J _:IZ|u')/VD=ҝ38l=8s:9w  ,rܳ_㬉| Ձ[t2?']+yb'F(_MZ'N㪔=(GNG >#eF1M $Ђ[C?o}8N%HWBʞ#Y8pg$+JW&/%y_ʺ 7OYs[C߀ڐ>a!ȧg2w*a6<EBĤ d 52Odc_ DlNKA# +.0LA`HT0@(8"$`c/f _c?l6r&༵P \G6LaJ"će)#yRJ1 bMd :#yb6 5=W$x|4PB:Q;vV+k8Iv*[k*~Otxgp\X_@||n?D>*O̊@R| ;JyMP 9 =}\>.XmCѐu;<צ>> *~?luU/qǟ'>z)a&2UI@ZCN@'%] R.Lpƣ?6qe^ 7 ElTq(ZyUUB &w=9Obm4^2q-p,H'P5:in`& A^_A䞡R^< &*ADDW"m\{) ^t4!;al?xQLͮ&>qnK 0H!W m}e(`nb&GJbJ; /W"NOL Z~xlD/1oV=^cYsu6S|mHL~lmeͧ0Kqc3Mip'ࢧJv~_9rc|:rpt [ Yd|vBlâR,TqH)<;Kq Vu_|½5o}Wd^vt1z[L{y"ɡ_Tbl #WٳE}H16)|Att*1OC $-s-=?uY %{?>@*JåvHCP LLapve.-ΪBܙ”U 6DѾg#/f8)uU*;n]bS3!O̤ HBx(9s"1"\l>jNI*zdoH~?$"7 GҤTzO~#R{=U_+ceІկA -"#d(.WƟ?)|StnX\R̯0e!q Y^,Um_ `(*~TSz^00QBB1 @ACP x'@"Og4-{2g!;!AJ?0X?~f ?G840Q59W T%?y b4<6<Ha!kuxE1lܳЖyqoA=Ʀo/0`qBCT)7Wާ|Zޜ'7[qlVrޡ =JA#'ъBby#4 @y72j,1Ie Y G cʤUe}}YHTK8cT#2c (Ϸ5d"@Aتnj#Q48HTd(ZҪ J āaR:.٥DDDnr743E5 M6 eQ&ժ $3cf" geGv ̄L+hNX_džehF)BffY]&H4f8YU55V9AQ3"1ɨ̐Βcmxr !6((ʢg;tMmB *v"xP Ẏ=tYT͖~yF (J9tLsJta;)sYƁqMRc,2(抒"?~7*}0L )> '0afC\~,Ć٘ 띎Ҙ^5mL?Ш"KEiC(%b 1TИ4AKRwC"ڍVmad 1Dh:Pm%KAƒÈ0aD4pk T<)kkoIml/|֣Nu8Ɣ@lM'm+`儬ƺ ZD1."EqDžE"-$2n2f!34)XY]7ŸdijC+bQ(ήh`AhE T!2` `0044H0 0$M$Qp-Š.s 74iZ`KâJA! 4IJ@(2Iu?!ޡ9Z\POY֕I7!JX9̣M$ՃssHz[ֱF};ӣche~&4 :C&-19Sf+#rBM⍧I8 ďoܑ{CK|:뗥j`0hS,"%ܦFy!i_! 2TKpBt;+oO#LOSV2%ywn982jyf NL/aj$mt\3! ByQ9(JK<79Ć>Ιbm۔vW6퍙&JAr`hccك$7:=ӖRJ"=\rx PDPQe>0yשu6O -_~\DS?zL>/Ѥ3cdRdT!wD~2w*SGuN=餗"GUS;=u8]Y&`k ub-zHNmAӒ%zm$5f}+`{أ F'&0E8*/ =>Um ~lGH :b3 Pp' ~%OL06 Q hU֨3 Fz^{mb.sȌpҺj_ٱC2m\IÅHIС.ud+P`'4Q c2 6B1A@62rL!,LĆ փݕÍr9W:۹Bڰ@FuicIoF*$jk̲օ:-6'H{p$`LQ0?3IKv40ce*!:%rf}%va$ ;L"} L 3FKbLN/bt]ÈNF"‚FiٓsmvMAEDp=#V`ɲ=J91NS4SolsY}.]"|O@_QI92I롱եSO]~r<)Dҵ ?MK!DA yH#19Hh'~AfδsDQ'R\73D+؍i" κJ_*}ߝu\|]-+K8^=~xDS3K~EwyH/c-sA%ź }*{C}|SqOwo):JDG;}y؀pͳIV_NrpϛBmT[[ r곟utR.u~ӡS~u?s: ɖ?7u~7$|?k>6,rvr:J*^H!x4hE>/||=GwXz>_:??q+xIs?o>O*I9SL~k~-}uzz;yKrGu/O}:5BOq37wAZbdf7h|_%}=ȂKzux>X74~wn{\^ l~RٱW5Ο__ž%*gެ^l<|'q">u|) <~XgkmvWUذ~E*e[+T٦[~!n㿟*p :c P gV` m7؟\W=JU`°E3{GsλDRI}2ao Fhhn.%`9$Z[aZۗЧ=[v?6]_;1ñaE;[t?04ū\6qنCa%ܷ.z_.线K_O×.UŲL~Z"J3@}-}Y8Yc)k *lǵ`-+&F&B302`I<0erh A[q#xFhDBF K\dgJpR%7XNIN 6uӧ$) 'gl37>[3%*S==},~@s'R+\+%꾿γ(fd ,4_wnDzW]ãOZcsP?hN6$z=?e䒕/zb 3E#((5mq=w=*`%FsR;.@% 8a}' e?`{@\CX4lde۰p|Rq4d'-C6lMVE"qsVvtz50EBNH-i6`?j )M6B_k0媗a<4tXDQ ?vƘ\WlC) JL2*c[ Or.Ҋ/Q#=_>S/+Df^;52@th}FmO={NWiϦ1l'g 0q t+c d)$#: -- f ުe&*|^gD~jqosܸ5PE>!akmf2,e:v.[{o9 )IA|Vko;Ĵe*ip^Yz1|L|gG3LÐBRXiS6|R^*i)Tċij.Hj2hGi]\%&40A0njz05 ,@qV$<|I)F!PK5+ꦵƀ\R7rQ@0n&+f7Fd D>T5#z{5ia"kBL| dBT٦$la9[35(k!4^rw H 5 B@ +8{'BRx{hۆӋ`IVHMؠQS<<&Nӏd/X&ˆAWKWVhNDيü4#4g.2f- gzY2g̝58|~[X[qAT,Uc4Q7ah;G=@ċuC-=SlQc|j,ߊ/aYL 3_6%лt/&,q%~*A\\Xw<'q3ujժnwvu9Jv ]} j}/Nr~4Ή{JpŚ\Bt1O|C2qY ᝥi!*4XXVH H<Lc:Ou/wx>s槕3UZ5 M4VP )#'0s8ʼn ,gY&1c83R$-+sS' Ya`V \\ 8˽v^*vd#l392)槣>r;eH +=Q㈆s 3Aw.) rn"/4u>XиR_<,̿/Y]0=jCӹPA80,gp@Sa/h> | XuoF4_K!I%oP^!²q$!Cn9s|p47p!DEwuYżQje]G9{bbX6R{"0D xtimY[(`hF oPz5"+q'DRɣ?i10pkdK64^ v0RO?hrc*c!(|8"r;&d#x?&/ aRldr9L&EN~fxaA=9v'[}^KgY8=}ƓUrZct?w't D#9ۿ:yc"%JJ[4v6o)K#>5dsJ"#/+Mz'6!Uٜs -Bcڥ oU0*H@^ )-7B6N]ɸR*^umfQjm;D/@pQGYess'L31X`h.e̕fխaH0fqazrK?w:ٵ:{ Tnj=n<<'yIq̀TUvR6ˍ;`(3/* 3cHnX'N<IcXugnNpV8kD {_j N]dIV 4{'| 5!>=}MsAH֙2=ƧMr&#Dh}tEQfAVyj!;啍f`KI:ڔz#lzu Oh>&KY) Vl7ɳ^Xt;y}A9U#,fnLuërD#-KyV+=oVeb5/9#8dT&2dF aJ0e|ɴץ8ƢG"_G/=3gy1f½=TC#\D+}xDTEF .L9iC_Lp,H攨/#I8C{OMt=k8ɸ4X}IfB8j,0@ɑ& )A9rQHy.1ݴse&SaYШzb<55%c"|>b{L%q% >_be=" VG#8Z"nYApb[cn^/-y~(RWݘnw e'jZQ"uI5 ļml<"7KzV*]t%~~n?ia/ҽvm,% SmnЅ{.gJ`+([S;?9a ߫_ɟ.&۝VWw1So骜hFyWl(΢~-mũc+Poq|vY%ovM\FQ:6seUhs'\L[ih㛼9#[;[ی6?)UѱatlV tӇ+BX@~C zMJ2ۍуzcWt9[i:EMS̍eV8=6/!pQ󶼣Om=aWx֫B"Y\fHvµ,LS-q$o9JR5θȸަsxM̝zYEA牥׹Ǜߙٍc7܈s!yp)R#9.-~,hJȊ!p;̒pc|kpoP[]+;'mߖwB4|-weuL6;ׯVyF]"~Y|z율,!˷ sY׷g `8#=R 5+LLsdc'WS 몦'Z{,]oV^S`?^l.7v*mO>ptW\w,F^s?^O%k\1͈*.#I[Rn$VY7K;W=޹˳ 9ŲUAnS!{W+"nLoŌ8CzHlkG3ɉguWN9J{b|{&n?uJJ QL^tr])B]JK7-ȏ:߲O^.لͷm,^1,%mirE l#ߣR0*Μ3ps&ɯ4o^'#gSeM,.T{csBI8{/>KO+9ewCܰ>M"x,[GT1FF%h: x-О-8MN#QQʥe%gKvsG':>!ѷ_y+:gEr`U)<,jӪMn)3(= r%~p3$zxCF|zg)wo] mlfiǒx3AA:"7zH k)yH"2;f#J޷ൽ ࢩB/=&weHtazoZ}U3[kQ0%y2]}]{/ڗǥ6xu9|@|X@pPbPemk,#I gQ9",>vS+}/J5=mv"ncdAxe~BicTs]mz㶓Eۖ߱& 6og}(v|:8 9q^X۳8=89ښ;uTlW.N  Jl P&hKK{cji=ι~I$ܟ^B^A?rEWE4I3KF sȺ1v[*6>CJYZe(Bl'apmgQUjv5yRlPsyXGRvLAHmΫWù=;35 8#!󾔆gɢ{nXR,1QG3R|=5Mk =3ZɵX-tѧ o=57.M)#kt=Y^ ;yV^'|l1s2 &.UYUzxROe齑g/wL( l׆6/6UD藔rK$c~YDz my^3V$fcX9Q~7}K\#wKm:ly75#W0Be]"m5v[Sv{ZmV#$k+Bme&3VSS^Mu0I+vE1 ٧fX,2؞-_)].kgDH6Ƀf1ڿrOӕYq]<[ Y:oLE+e,:+&YvHp7v@ڌ8∝_X%$a^RʹΫL4& /A]):~S03\!(xTUoXCEo#k\J Rwjt=sCdJ Sv炧yJJ,NcưZۯ~Uvl7|ENļa#pE39XM!|qNJݜ },lFfߜ$py=S%(*=F݆K jK7xlG1|}^W/͝H Bь;}&dLmDDQJ{d/_o>쥛s:y"KάBzx'62R/ iYFz:pQ4Ӻjګ7uf%/]ӰzM'q5z+VpVwUA顋[ȕsV&C-)!g&GxxՇͩw)ܺbX Wb*HV[IK))wJ9)Aэ˰>9TSO$D] 8}.gIw6:ʰgM xlllQAlyVD4:xּ;Ex7Tܓy9!\eJ WOHF _8-Ocw$AzHa1Tn2 ) GG[ݒWV5'GDWf*o#(̅7ŮԞ+g!tORWlzОU:΢Q~CQUKAȥ%la 'eOHwB!p>Y=^#X{IJ\@Q?EZBNoRA |Ni:i~ oEPoRR'_ѶȂDD_Xܝ b;~>}C_3?!7dRѫsjxDr~^{k!=|P쬊`lbY[,@WT?Ʊ&gP/\ǟrF1?PҾx+qRbWz|[~qAK7RGHkw8zc`oDDu>αR~sdQ)t:@~H槥h+98,dKL iDj* {n"'d9J8fFixZ&-u1F}LxsP8hZ^w#6@Q4РH. -֊3"@՘n N>'{ Lݜ WܼY]MBOsz/($MہA-HkXk%왑vr N7 *'Q eA:PD*OߨCDوMid}ف<{b^O|!aK|ߴ[9ǹUz Fش`OD4[%15hot;zA1K?ܷ.:4:[I,`G{/KOWVɔ!LFKSRx{FoكtB_RNG;9!<&VTnպۿA{t;!H :?wiay" /y>4Z^"H!qx F.Ԇ>xz*PJrItx=B1 |jbxrL2+A,Ł_ôgߴ}!%Q#Yu(wjv?w܇UR`PǜVe:xcM[_f.÷G'~"o0c̄۷> wm < AVwgqDڢeOIR[7me`>l.|UNER8=y,M4,VYɷzQfER.K@ɱ|9z_$ǧTҹm7yPӜ'Nȯ\i㑲x?`x UTAbB16$yDe=;K4#;9ByQ7 ,z)A>x#dܫ3'g')PBt TTEQD%w(D,-[Ix{< BL *Nsp/fRݐ&$!bs'3έ6seSU$GDlm sPHޗu :39lbf94*I7iu=݈*TfFX583QhYrH\\֞P:ƌ"Eʻs(m;.,9T"D0qNG˕~2qc#Z~5RGQ46Jcܗ3G>q>pB}gctw<9N0\,lQ"9%2TcS[h\1d ;()$G'C92)E!0'훩+CMg/q}#n;DмeN1Rn4cYu6j:C[+a'\eyǬl9gDK{Ƕ4 ,ܴ9EwN[2)9XCwC ga~4I?Q/Ev:?^'.ޭP/>Kƽpӂ,q h$'ҭ7߬'rHvUt! C Up1\ol(t-U.Cʨ2E{t4MHX/q\Eb/P:f7志bLt8<ֺCRkzxRD۲;3ԻE8 PatQFE^覘ޡ^S\;bi}mo"l\ <*mIc+C`nr3-ݪJC{!9kx8(IG(=O:ӈCk}E@EXgCmQ/UC7}@?_~F j_tR%<CcxUq5Y1ϩ'JUKaGWim8ڦk\Tr5HP4@CR$" β1J;m0BFYh* 0@rH01c@`x\?_֛xG Fhp;/.;\]XhXB@$_ 2IOVFb'6۳㳳ˆ.c MˀO^P5+=FtHl?:,*9a X!X?[~CRiT1[f0Z9c ^ =V`.f' [ uOEh=/~lX<P@F(͘% BH-4r4J舚F[b)eiL>S%Oݩ*.c4'̯`GX\rwS(fQ5DC,fKVfQ"h2.8'cZWg@ BdA!H0 >\/yB5(i%i[Wǿ$'@9 3Pa7to[0:׾IF_~p Q? Q9)eTw#cX. !PScHf&~1B!"7b^ޯDda07O]mIxk&%4$[}^d3.DLRX/}x6]> Xu'`,:B7b{`E!L<~A&F`oȇS>Xp'?/ܜzpˀ|qt,#Ѐ'tbSlW"<\XCh `\ >}@gv*Gqg 䑮mu=G.{/'+ *oB|d v_B"*X <7Nk) Im|,}^'眽sLyw~"+0Cz: 5,Tub]p+ J7&U˫t"$5DJס}iHA`4]֊F 82qTPwa^^zn:ڗ#0@RN'RDnLb,񏼜hq Lxqq34jG ]/8_7 ֗޴gZwP3Z(Q82Ǚ$ҕc.;J0F=Ņ8١/OgtxvB 5yI-Ŭk+fz7^w1?58Wgu9iJnq0Sg'w6R߶8Tl3YLJ&z,C^?aۻ-6m\ZIvx=kN}ę_RzeL+F1\5x0wrLN%4#(ޒ6R:L9yФ~JD< CjX0uѶsCY2'a^M0S/_ p^p%gJ7ƣ Iy Ls:$2'V * :Du30L?>೿۫Cd< !;xPUM9K] _$a7x}}_]#p"}e?tԿlN@l!<^4<~$bĊꌢF2eߘR*$rke]c8سDӉlabR~mїspryjѫ+*j!hcGk٫^ym+ޔDBICST%<f :\x % "t*dؘ뮆f>qWa ?oa߂@|録G79͐a9"ö')=.kٴȢ=HxZ-kKse78 LH4d11e5@:P.0Lv4Vc =ʨTS䇜?Jnj_IHaӈ *ȸ= *_sy]NtT LHMJ(x}Rq@2(;JR"L$3-L~޲?5%-^~%',#+(](318؊( . 7={nuaJ<ڗȆѬ'7 IEhMZt.p~VQ' F'@ݴAH7;p&mITiKQ!ymc2I ko_{(B2h[yQy