#!/usr/bin/env python # Samba-specific bits for optparse # Copyright (C) Jelmer Vernooij 2007 # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 3 of the License, or # (at your option) any later version. # # 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, see . # """Support for parsing Samba-related command-line options.""" __docformat__ = "restructuredText" import optparse, os from samba.credentials import ( Credentials, DONT_USE_KERBEROS, MUST_USE_KERBEROS, ) from samba.hostconfig import Hostconfig import sys class SambaOptions(optparse.OptionGroup): """General Samba-related command line options.""" def __init__(self, parser): from samba.param import LoadParm optparse.OptionGroup.__init__(self, parser, "Samba Common Options") self.add_option("-s", "--configfile", action="callback", type=str, metavar="FILE", help="Configuration file", callback=self._load_configfile) self.add_option("-d", "--debuglevel", action="callback", type=int, metavar="DEBUGLEVEL", help="debug level", callback=self._set_debuglevel) self.add_option("--option", action="callback", type=str, metavar="OPTION", help="set smb.conf option from command line", callback=self._set_option) self.add_option("--realm", action="callback", type=str, metavar="REALM", help="set the realm name", callback=self._set_realm) self._configfile = None self._lp = LoadParm() def get_loadparm_path(self): """Return the path to the smb.conf file specified on the command line. """ return self._configfile def _load_configfile(self, option, opt_str, arg, parser): self._configfile = arg def _set_debuglevel(self, option, opt_str, arg, parser): self._lp.set('debug level', str(arg)) def _set_realm(self, option, opt_str, arg, parser): self._lp.set('realm', arg) def _set_option(self, option, opt_str, arg, parser): if arg.find('=') == -1: print("--option takes a 'a=b' argument") sys.exit(1) a = arg.split('=') self._lp.set(a[0], a[1]) def get_loadparm(self): """Return a loadparm object with data specified on the command line. """ if self._configfile is not None: self._lp.load(self._configfile) elif os.getenv("SMB_CONF_PATH") is not None: self._lp.load(os.getenv("SMB_CONF_PATH")) else: self._lp.load_default() return self._lp def get_hostconfig(self): return Hostconfig(self.get_loadparm()) class VersionOptions(optparse.OptionGroup): """Command line option for printing Samba version.""" def __init__(self, parser): optparse.OptionGroup.__init__(self, parser, "Version Options") self.add_option("--version", action="callback", callback=self._display_version, help="Display version number") def _display_version(self, option, opt_str, arg, parser): import samba print samba.version sys.exit(0) class CredentialsOptions(optparse.OptionGroup): """Command line options for specifying credentials.""" def __init__(self, parser): self.no_pass = True self.ipaddress = None optparse.OptionGroup.__init__(self, parser, "Credentials Options") self.add_option("--simple-bind-dn", metavar="DN", action="callback", callback=self._set_simple_bind_dn, type=str, help="DN to use for a simple bind") self.add_option("--password", metavar="PASSWORD", action="callback", help="Password", type=str, callback=self._set_password) self.add_option("-U", "--username", metavar="USERNAME", action="callback", type=str, help="Username", callback=self._parse_username) self.add_option("-W", "--workgroup", metavar="WORKGROUP", action="callback", type=str, help="Workgroup", callback=self._parse_workgroup) self.add_option("-N", "--no-pass", action="store_true", help="Don't ask for a password") self.add_option("-k", "--kerberos", metavar="KERBEROS", action="callback", type=str, help="Use Kerberos", callback=self._set_kerberos) self.add_option("", "--ipaddress", metavar="IPADDRESS", action="callback", type=str, help="IP address of server", callback=self._set_ipaddress) self.creds = Credentials() def _parse_username(self, option, opt_str, arg, parser): self.creds.parse_string(arg) def _parse_workgroup(self, option, opt_str, arg, parser): self.creds.set_domain(arg) def _set_password(self, option, opt_str, arg, parser): self.creds.set_password(arg) self.no_pass = False def _set_ipaddress(self, option, opt_str, arg, parser): self.ipaddress = arg def _set_kerberos(self, option, opt_str, arg, parser): if arg.lower() in ["yes", 'true', '1']: self.creds.set_kerberos_state(MUST_USE_KERBEROS) elif arg.lower() in ["no", 'false', '0']: self.creds.set_kerberos_state(DONT_USE_KERBEROS) else: raise optparse.BadOptionErr("invalid kerberos option: %s" % arg) def _set_simple_bind_dn(self, option, opt_str, arg, parser): self.creds.set_bind_dn(arg) def get_credentials(self, lp, fallback_machine=False): """Obtain the credentials set on the command-line. :param lp: Loadparm object to use. :return: Credentials object """ self.creds.guess(lp) if self.no_pass: self.creds.set_cmdline_callbacks() # possibly fallback to using the machine account, if we have # access to the secrets db if fallback_machine and not self.creds.authentication_requested(): try: self.creds.set_machine_account(lp) except Exception: pass return self.creds class CredentialsOptionsDouble(CredentialsOptions): """Command line options for specifying credentials of two servers.""" def __init__(self, parser): CredentialsOptions.__init__(self, parser) self.no_pass2 = True self.add_option("--simple-bind-dn2", metavar="DN2", action="callback", callback=self._set_simple_bind_dn2, type=str, help="DN to use for a simple bind") self.add_option("--password2", metavar="PASSWORD2", action="callback", help="Password", type=str, callback=self._set_password2) self.add_option("--username2", metavar="USERNAME2", action="callback", type=str, help="Username for second server", callback=self._parse_username2) self.add_option("--workgroup2", metavar="WORKGROUP2", action="callback", type=str, help="Workgroup for second server", callback=self._parse_workgroup2) self.add_option("--no-pass2", action="store_true", help="Don't ask for a password for the second server") self.add_option("--kerberos2", metavar="KERBEROS2", action="callback", type=str, help="Use Kerberos", callback=self._set_kerberos2) self.creds2 = Credentials() def _parse_username2(self, option, opt_str, arg, parser): self.creds2.parse_string(arg) def _parse_workgroup2(self, option, opt_str, arg, parser): self.creds2.set_domain(arg) def _set_password2(self, option, opt_str, arg, parser): self.creds2.set_password(arg) self.no_pass2 = False def _set_kerberos2(self, option, opt_str, arg, parser): if bool(arg) or arg.lower() == "yes": self.creds2.set_kerberos_state(MUST_USE_KERBEROS) else: self.creds2.set_kerberos_state(DONT_USE_KERBEROS) def _set_simple_bind_dn2(self, option, opt_str, arg, parser): self.creds2.set_bind_dn(arg) def get_credentials2(self, lp, guess=True): """Obtain the credentials set on the command-line. :param lp: Loadparm object to use. :param guess: Try guess Credentials from environment :return: Credentials object """ if guess: self.creds2.guess(lp) elif not self.creds2.get_username(): self.creds2.set_anonymous() if self.no_pass2: self.creds2.set_cmdline_callbacks() return self.creds2 hl)ZX˚ǔN$2 b ]tM'ؗBQŸjJ><&KXe(aW0\  Wb r!5f)6ndPwK oc?e^b|0saԏ&TO:Tc?k-v3w>^[Pw@0r c[ -M@!dI0p:DgF;Լ*5텉z%sW453%/sڡ|R kq܍8'" QG2 t|'Em1e8b}>Ed}%:]Odx!)%BHf/ksXn:ʫoɵJAv&v7#/zx֒k #;%MS*^3كp.DwȴdoÚ/d5G8[k dϠZF\YvАmaf|uܯ`D߇E!Nͽ.Qlq}Ӗ-[9N%h{tB3`pN1<nԙl?]H̍-yZf?w 5}c.u%c:ZP{)vwe3wATnU"oXL&{4XrA}R\z?6XCgg'F5cZ) eXD h@Wx?!^ ]IwrFkƳ(!U ǟp7wG"HGV8r73ph"},U \8UoQލ$WϽݯE:Rux ecGާt :Rɑ,c)(Z֗gĆ>fzKU#Ȋ)m>iþTE`#C:JƤԇt?D*JEiBB. g&sˡN}OQYsS ZbP/N6+EWzΑXQ/kG;N]j[2W%GIJF=746D|ŵsc]5t~/t2 H0k1xmÉB)RT;PTAx4-K$Voxi.6r2bD|MB_:SG:Wnֳb ʚG2JcqT"g<_Y!6vCi;gKp|i29D"Ƴ:jSq8 bfs|R8VU:R ;ݼdayo >[8 *8!Wu+txSĬ9'3 t:5TP4ԉQXGU p# dr,>p?$"Iy?nSfdr`HW_d NhGH aJoYTD65-h5R@Dha5U@ͮa\x}& $rBJT#^en6}%/h)znJb/Fϻ\[Y^Ufcpm-`K_R;MtXYyŒ) *0DkKyg2(3WW_T0")*FU[߈ugԌ;Q٭rǰVG }T|t[i%b)LRV$/Q)w[ XSh."=Պ\JJQyY3'z,cFG(0g>':0sx'I;~xЩi]#|PSwU$n" ɤI:+Qg* Yi?To@ȷ˕տIo͌ '޻x1;|xFj}`:L +j֤qUB̕\>@0?8iMAPTڡN UQ pfzvȟ/X"O0#oưI6"di-k) W,^1эf :m/:1zUWMLjԉJVm> F]n~y]}:4&/eKBX![}@p KMiJ,^ӖN'@`k]_km0c_OJ:]/_p'UP/Q%Kʧ@05YXjHr 6uJ:qDKp>C<12T/6;}R.Jp9`dmbQP8p gᚚ V6Зۘ]ݙ.W6#W-y\7ѩ{wǕ=A(t3>| KsJ3WаA^@+_ȓڰ 9gIek{ @U^ĐС{G՞oʓnY@@\U\tpW FSl~1'QauK)EKoj\\lrbD8rю^OS%n(-x= ׺oDkU0Ưږu"~6,ծ„tY˦hX +f.fG wG/sb48Qkw,U@9oId̂N5^o|tim5$REjʁƬGy] } 8㳇+;w﹘"Xsb:ͼ[?l ? R' U7oY,l^]PWjA5\S=?DǕ|좟wumr7S9+_;?U @ZgN`wzLvj'ziFR1*қ=g⒉ F:K*f}l8! T1[mws!^ܮ_ŹcGܭ]Y{^IJY/.~"L AG(MC󱕤F|@ZɷX5R0 6/ؚF d倁K5W1 ;Xx ~bN R_ TIO)̪+skfυBҔҤj?]P.dQ3yaǪ8r6&ai'Dh G,sROp1ʙJ\XeU \2*D/?pxJ&dOÍU#iNz{V\~m>xո<}N핚L#5B" ڜO"l7~Aq7#p IEY0J!w1?oI"aLRnۘ7۲Qv$ V0ll4Aj߫x GXf~3Nu6= -44*ka>R˹de}F o*򳋁 :{Y[r7w=dPCxH,wLT ܬXnsű`E7Wy:,^稣=:;s ɫ_lgvO}=8'q?=([}[i━36~v\Ny~j?(@Wq g] gMY5aВͮ8c:/Sk?n) 2S(TlQg l]$^ҎآPrµMjO) R.`E:?ǎ!`4 kf/ 9!\db.#&"eEuIw2 "hw\3V8Y5bR8&c0w"R))my2`Fr1ЍpQM@?P5qioeֻ}l Pq+}.Coc GXWY(3wg?m7 ?9#B.Oi驟*jKHF7>'.'r<hE~ [/a|~NٱzTĮ&"v`s%4~6Ϥ$ mXlT6䈱~oh6ߏ:@%yrApy{YN~L TxZg):F3beisYؐ6ǨDh9`##U(x/ :>qx蛙7^k}~ILi'3` iʥEb~2rO{[؝飱BwHhBRh~,=ΊN[\t1]@D_46tju28|W,ѽ{6#5E.u݋|?Rwj-i[3(D`!y@U瘵#ڼ]Yi=59&?XlGxbP@¾׭ϭ1n!ΘAv>wZLI>fm>v{hFjDg/8@*0n%#H8;CX 7\\8Du&b5ɅrMJe R8CCwH:JJCٔ9T#uܞ$Z>`Z-vh/ m!c]2:i[Ӕam5_eGA=סGxcnh:{Es2`s*o"sSuOЊz颾͕wZGbƣ5VʼPF<ğ@i:lROr D@`篠{(:,EJIYPx FAMo`'p'A*5?Bq X fG՘1d~8儨&L>iWJ3y0'?(Ebٙj:d]啟&!kq<>|_uCMUntX^+10K>X:_[9&a~8J|srXzs -m\"XZDn=y60R,]l%9el5Z*a74BMfݙO i< le)`%1e =.τg`ˢ/f8,*c|.캊taD9 Ҳ?>ܩb?Ya ' 6S4|Hr(Rw%m!ub/M1:/ D֡j{JXsk/agfGG07ր4CU1_l=y(l44/`XNĦWH78JtV.J{ȲYtM?'IpDL9[UG+ LLHXgbhޮ4JH[OgM[I<]-RLnV(n{\рO,S.ż*S{_ny?%k2`M@f9Ib9Q .ȥu!Syw;)Q7z:%T *oyìyuvs&Oܻ6&+b{tAܸy#NAaCt0UcCi:Fu%vf)ƛ@v2v~d0Tʇ0g̊J, 6]ЇgPP^Akz.r6^-9}J,ZFLC/ɋ1%b}[}.;-(<(.S "1gZ'V X.`s`;^5U&9MAJ#-*pV^{T(kw[.7` K&K-o~d[ZQA(><= 1ٜ7xd|a{WyWmPr\q5]''>I֦:a~꼦a6!U]=ΐmИ: .xk3mG|^C R (h j@m̶g;}$o^힊j`$m)uBhZ!7A ߀1=u#=O\>*jA~㣗DPIz+Ga:bп2E^\Y:H3'_),N$Sߢj|zyUSɉSM8 rai?䮾R¤i¡n2{tj}zɽISqg LZ~2@Dˢ-c-Ɲ5_h:G,Q_DVN6.&#!Vۛn҇@W 8S-P:sQZ.-Qd>߸WZ)o)Œ )+dMU^eX1,pp,'tdL|k,7| FP6]4}&0JV1@=c}& 3CDԍ҆y}ߔݰN.k}7|<*ʣ_-HU Ÿi]PDkH"ssO1ȣ`9nWsPCg 6Z>_E˨8)Oޜ?[̜V՝ q:W msiWHKESGP>j dKnmKP dLFC TIaHO9~)!hUtEpFh~@h,~ Z4#c扸$.=*'1d$W(@4[R NO[TBC5ƹ Ô]„mF3m1ӁEKMqetfU3Uf灲#',z5clikW KN՞ɂOV-PܦW;1<K7 !r!+iQq!? eCe!OX{``x ?6TBd9I=SJ6岹'9F9 |x{1{a5u A'pPjC)`|v68_ y6ZltWLK]P6#25ِ"p#$I< pjzZRGDoD*4*2{R|eoJOfgRiv_Ojf۞|˼` xFuSO,ǂjqŒ[q⇏z"EώlWHlv^Ɇ "> [`r*?LcjS}pΫ.>[_/9_SKTRđϭ*%Qrk!Fg 7La7:l(+S]'ThDʤ6lB"*|Sy#ZlLq~$ ibG^J[vWAR,/ƢB`)S,㔏 AoF- T΀q|idž縀fڮ 0P8?ʬk|,`nZnYz4ZUBw[{ , 9EX[ԨGrɩW%Ң1nIWYċc˧+-> 1pY_ί'7Bz_S:&@g9"&(`#`P>P"㞫 *EQRj$84,h`bHuI Ouart%M5pWv0g2UDeKX;d7}%KNmlզNdXX1Z^L EORT+q-Qiw[^ 4HZj(-+ ԎF<?)CJ[w\u藓c+^.*40[ʰc.-e 𲳇tbg;!.ʵ `z]`Y|Pw8oE\B-撕7J=!t, :$8[!zK3y$PH[tVܮ' y,&wv8Z }1.<{.v8p=g`Klz2Sop2,(_|S"H&Yڕn9rQ\LsyىVoj,l=DE!fze-O0L O95_ZjcMd{ / P.[PAqw^ڨ>{W`ˁB H7s؊2/qxZ]~ V9$a;u񃀬~?kc~wL%A'5Ѱ@]+)|ZfF8x1c=<md`néd:g5 }6|&RʿJٮ {34)#vG R~EHx nYȽ)?= #]r֙;rCO[ңNІ_^#§-4:} d gRSK J}\E^A%U&ڳ&;3q6Գݣ|23op38J@bGЍ`Sy@+NTo(x~"ڲc bm8Ya}ƁW5./Co}0 =|Su?)-;[Nild&(H6O;Z`|_fs6MmX'DQ5eޣ> y=JDCنzi ߂Kp?Vhm#śt`<Ϋ%К 6" jUT9vxf' fseo/71<稚Cl{h|0"Z{'SUX*$qT˒˂ڶ&ilni3iSatҵ4'][ C3Tn@'(!P.P1Qf};1T|xA2F_BN#Pn^rgC^Q 񰅋+G 8&gE}u`'9eacm ./?BpXj6Ϟ> \_y>jl n>L$DՆG~n4(!֚}9I|Bi | wT-e>ES^3U#[;*x<7X PgI}0ZVI(qHHk<+87Y` ;ٛ򙀦# Th`! ZbÂl4V9B!f>w mLUOcpP8gGnA:u+`bEA>~L@yqo{pP3aߙMy°]khѫ}}(3rJ{֏R=} WC^wV#zi8/76+|I̵rү$Yv@1tӉA`, o'G~Pdb.Q.=D%ȩhX^P?`{*U$FeF. ua 2𱐜[VG߂ #HzóՄI1cy,-+_|(.

p/O|m7X}Lwh$AT-C*/Kj/oXL3IwJ,~¬QFb!.!D=#KBxe(%Ufhrّ#g^ky;r=+#&!]ZVF@@«*۶f7Gfd!D )RQfx]<$ *?{'Fn5Uld0 ɠ1e=\].~HF[@ 1a+Q+jll 1j q6gO}ؼH +[cR wh=wZs>\dumg{gU[fHHF &ŹժuO|oxxjkIWH&lxgF 1]tq)>(^daX)W t,6BneiRڿlo  61r YyU+g|Ysy'"GlQś+[U Ul[.8V.¦]:s D0oo=Ⱦ)+zVW#G 5rPDm=nJtUl}ޟSvr 43vbx3oB%dcGHhilH.on*UV~dReR'o`jw<ȮF n݅{(f-rwJ'o`A ߹$yhkߕB[ <T.CU`dzĠ| 4!ыG3p2.E\{b2&$e+ g5H>{Bpɝ,gRDud'рU uw{qJ<#`\tEgk(IY'!(U`};Vt9STl>egVܰ @.▚W=7eZsm>zem{h:@y̬BOW1dl$dwIm!^q#IKJl3s_+E*К/R>8ﲉT峑}~;8I7.R Eco1HܵvK)Y^\|Q(HxO)x%h TQ{=c /O8x7a)L:-ꯪw̽7y1(> jV9[#k`_j :Nlh^``V~Qpx&ި2E>%nFEF#ī8v`;1;)П_BXr/*ʜN(Sl3MYA #SeͳU1*^gs|[+%ԕA'bwK:$o43 g2q}$ q.g?o*+SVϠoPgihLP# :N:AeɤCԮUe̲ >r(̠w:69/}drB2 rGyI SLԓ*~. IC0׵eef3I5rWX|u,]MZ57D{:xc| %k$7H_ ;H^5 p\0` S7*bۘcH"ȡRMxx+=žc3` 6WրֶECuG:$ j'RBtgkM-3tNXopY蛥GwA}iOܐi`(VQۘ`;tiu4zyáؼ)V~@X2E7bc ߚ 9/X *.Yg(;,~a*)"iy8s,Af JV@[DZ~TZzhmɁ{ʱ!B ~d t@+`K9FBca{sMsn*w{15Π |JEhA:wʳ& tYkΫ:(xVK)~!O<OpLfd?WS 3݀UuqWʇG?:tQ65 UYYA~Lϴbg뚆56دdӭKܺ]YH^h>zjX03?N3D Fb+3% &;W"D4/$g9fؼyKLR2Hrj8|/zЫۨ]St:8⒖&M(ݚ%cL.挳DFbMų߂l PuR$wMd1|Q˪d,d#?_Vby0Y٣bX 5+ >h;c˝He7Br;)}IKL3ٕRLjVۊf B1V:dΤz0 E!Z"7< ;Z jVUac'׉8 -9N'0]`("h8,I[UTVNc- ?R[I-fJ6]\cdxZNJYX3'}xT25N~ʎ`u?f1{ak2P|RY\sxnS|ܼ2M趼P) MktǴMaeUDw'nG2UD>cXbջC{UD][V%Hagɍs!Us/ hlLa^9ur]_T?sV:SBS _W>]l|cRTj@!i=YnD_2cʩI?B^]඘ܿlq))UXLzְ#ȿS@=n5a`]._w^Ʈ*(0!&Sv^2:ہ+2y;J ch;H=L!(<(e2~g{{Dܝf>-E +C䃊*+`|/ѣ NbmrUTz,lc1Ɏ`Lԃ3KQt쬮 HJWAR[ey֟0cq7,kW , yEpK<[Slp8W^Mr${6a<}/~m >ѥ}>%w)41?-ޯ #tY h}!7."*1L-)]KԱ]t:!pҶ|?{cCr)"2̱ l6#]em]}?<8^/$(䵥hi -nxi Վ>!L{=;NJN Tau 1/) Û5鋊/ow\xslgvNᔪZ'K0pfSa 3VZt=uƍl@V`W۠rIR 1*jMB6bޙ|' ?.lXQSB_JI wTx70)-1p=6OߌG%_p/]XkAQ[^ٹwԸZUu~ȷCӧwp߈rȸަqh(*;iҗS9< NQFiû3 "ޟ1w֔PV$[*v h$` A gn(Pݵ{r"~p83z#Virj`%J zvFN e \`Sd00MTr 6(rsLͽk%]C&Jq :z7{mMcve>mƋ~M85ƛz^>%$dr?UM0`aeuNMR mbNGvhKx*;y_(X2ѫ%6t$H@(dmd Hi舰(b㑟%5;3p0Zq?g43 S`jS;kr 닯Q \=H^C?X}Dx7=q깡 ׽{9WƫPpo$nk.(\rSVU8SDvIJZ5AW]^DNsaFs/gr =`Ӑӻf-Oze .̚Ë10/B]E#=.1ܟL ?7X B>|aPM7 p6s"}B9"Bٺ#e'N-073Cv_#_RB_z^ tOW Q~w1Aw:B?owB}/6D^jiIZ\FS`yW!b ΄%lf Og{VU>$ )>mVyGGʺv:S ,2cp-Zd3DH%X_+ Wh\n5@/ʏw^ثiqsiѳh_bsYԡl1))zom\H+#!<~?,`ѺL 碟+'e&{榧 8gxV2|gûk gaWwUfBĀGw܏{OꘉL0 h <0c|D OzOT@_KJ}I'RLP%fkLjx1I7S++2@~<7_,Hy-RӃ? 51:Fũ@#t4tz?hܳEYM\zMKeIǂbKͯ+a*mZ%}^G0s~LXɕ3JlwyJ8PuAdBGЀMI$0~yM_{;p8 cg}O2ӕ^&;".قR&Gd;0BKOQV7 9IMx4N.dgEbUg|j.Qjl<)"̘f`NaѷŢL~o(br5>]yQy-C1$$i류E{Mjp1}h!FdD׌)=us <͎Z;+VCWȅ(_ oCuUEȵ!H]y)LJL$y ~?х2hU OFKaf 1ƥng."@%`SڝjrBiD.Ǻ'rFu/E= 說_i|<8.wk JgaF$!9`FB#ݜ0⥔vZꀰ~2Y]ىNapC>%*m?B~5 e `㢛„ZsA㵹&&8ЖLY1_֮|@Ļ޹Y7S MoָZ*R9e p(2 <015̛ D[2*a=-xO7/\#ζ%& bN5;8)_8:Vta§ FHԉ:M-u1.\xVo 1=y!m,!㪤HֱCŮ҂J7;@TU2Wf8*Fm>L( pҳ]?%D lkR5R{tjVyvjGU*DVn 12&z2J !q_Pm`HHjKzGwJJ|c*_lAڵLB@IF!G87%Y H0.U7鄲0;CL^WR~Qt#wV+NįbṀ!cl$pP:, _]_ 7K{{]p❙ ^mXΖX/35"C-Ml5Tc t]_d*h>ZTQ-f*©.O\&FqQ)o1-s4 t:*𩷄s4oPS]e/%Jjㆱbt2ϔ^H:SQhٙDjH;[4iVXZ\־BB% n짂r^c**i~%`EfẼc7p(gy3{?kZhI.vݨ- 61c*A@I; t&]FTm6m/K/B)6WR )V zL1F鶼0Q\h-ެ'-x܇jm9)s/ '$'3UQjqs`W# '@ cDj ֶoIC;9MwC~|*UOY#bz1_`(uqm92mGi=A+S&TfOG&T9:DQtOQoFPϚ[ w* u~!5$[nh9' jG5ϞQ5@M-Ԗ~2a :f4<]U8cMMKedbchy9%c/r5/x5+˙-3L^ҷ2 F}ʓtYk\GNfZ&ɒf&/m16HID{x\XcV'&eF؇Tܫh[gT{ iRxnԎbɎh-xS'v(y;Gz~{ o4,խ28V< \rۼ% =ӫg(Jl,&ڵxB.!n]$6t f(\B+bOսfs1EԴ픶u٧5zO۲4"r531ca6x,sʮ_*k>|ָY`4. P0Rn "xb*tZhB=ԛXVr#vx2ʪZ1In%ڕ!e>PUhE :x^̦HxGy J C=;#x<-tc瓅'GP*zzD#&w-uBEAפ>גpY"b\ucR'J?c^֫_M+^пV |Y:ɂvK$)7Ixwj͍yt%n!laRtL;}yX>OC79X楠t2h| 4A:lBL0 ,P(K ?ȏ3vM.f]v)uyօ{-ڹFN7h)NIR4nOԔa .N3?X~:Qd 6LQ@zF![^Vx9!`3mg_F#| 共 9Pk'wKo;e^pDi)| O+^$%g*c8% zw ~8Ьp PCׁt:$+qv@&#o?oIyPgwyu4m /kR³FGJBJHtzctv%6^)_FgRX8T)lAOT(& ]Nxs’8G 2z ȠgI/_rT&7)Ť8 <$̵&bղ?_Xjee"_޲Ʒ.\FpqcǯgT, ه4W-tYX Hn߃9q:\8!Mr.Svcb)8|aSf/c Ɔc@}Lj$:{n@xjyLR=Efِ?'(}>:aMR6S4f7lҊ˅K*(^ 7* z[M@q Yxh.v*"%nb6"1OX<ߜ.f!k/H J_[ܶ!5Xc#@ْ]VE[! D7fE `BH3[z_(YzX7hwʼ$4ca,Ϗ[M?-`C 4F)9iO! ސFoJtz ˯_5V?i4ΰ!&~nw`#bll.=Ɵ36^sFe_d`rn`!OQ XTŊRK3t[7' y\-q 04?}]:OʶX|oK4*5X5^ 3'T;JV{mtK7UD`+:+QXiF)a8E(G37༶Z@7<ΦyT`qmّŔw{weF `G۴.  ECͳ;G@4J/-A?y:,1#G>OWSʼn6'IiZ䐄:]Ȱ` "\(w %ˮUmR9A:Nh)s_>VIi/T:349]MbHSE6#9+o@=>K<Yd魮꭪I3m~)9 ~06ma gblP0cD[ !($Vx&Z_խAZxqt \NM*W0i(pTgm U/*:x`u{Er$Y+GWˣfŠ8w̷̹W[=SfshoZY53~2z\ri:d_$bcSǣ[*%t^ԃJTUX-ZvM̼.kFBSUx{&-ܲ(ұ]~"# AZkhS\Q] CNR0VYTٮitG3ٖaD8vz+ +tB03!.FL 8$nLQV n%^CGOs.=_fKG6n@M.49B)*MRmDixVZ0YigEIk3uxd>0͒) M ЯvL!רbf >Q쁗La(fvm3u 92x4V@{xRp㲚S!>dRO[$K` EJ4KO#Pp:LklXdEyWU$c]BuxƐ?; }2"RbScv.B}1^#DSfAZT[/|7,|x&\c)~9Q*䤍4SU| ?8لbkh.{'޷xed{E+,c*H?x֘CW5{B*2žQBݕg5 RY H{D!/9 ^n](ɍ탲6gwµC8uMT ?]=c)k(y*<{nWj| {K%-#aD{2Psʟʢz!L6"`˻UONޯ:,$A5iN,3bUgl6= 0 Dڴ:ء .֩/T_q4 )ݰncpҨ dƛ!oƈxY2b7Ff!'q 0Z?s?X.vTlkG"ñ\28(A2ti/?\~ .'!&R6|ʹSZ#-JmX2MiOcXmMxt]0^jJcq:3 #}$m G0` y^,ay"ό&(NñDC2F쟴_[igHl8Ñ916Y%2uPE; *pP[6!pJ !R Guj2ìr(-8H}U L !s-m47^^L>~[H:Q3!ؑśt sSWQ_( /؏bN|d۠ ~l4ߪw;=` nuW[\ѓ9J6j&&x\V ۙ/SC+* 8  h^:|}HT\H9U]rI-O7Ф\K b (Wۦ824[ 32Va9/=8M1@+=ɿnm a.)d2w71*z53|;2_\#jf_pӞ2a79Joeh yS̳BkD+;v!;nV{;>&~ոʢSknJ xg|</]R}3xSWIF<'H:eBZ[q`oT'_7XtO=J_ ERƺKn\S;Wuq.D;`h[JP0:QpQ)p8oIUn%EC-K|FW,0s'.& ɼk0DaFj%EƏXb t&Οvk+NyOZ]|`倦@C s]-$H!E,aLª1?p]*G_ %[WwaR y],SrMVtbq[h7Ygh0a|ם{O1@aN qK/O*t2uVt,&m,%b9]09bː"R_R΀`1[(?5~bN & 7dXj`kWk0T*xCxM~%Q _IU%\~@}E+p+y+K{ mxT~XMEsYY;iYfrAnܣg. GBLʒq>}-F۰嗔nѶ`Hl5q2M7D{0[ Z$Pak Q@LlM:B L;+y D6?.T$)`=j)I(< vZqfM.Y8jSd}ܕ@_@+z|p ]]Ö5zVtߪ+k9]'2L, 1S ЕX pcOd#.p*[Y|&F7A٢4yxaRW;kD:m>~rJJ]<]8bښ\{^1Ó3QۇVQIhCr@"YkR c)r, K?Vez6-2-7:$o-·R s_vHi6U59g q:wu =) ɒuN2:ɞr {#d? L{VJTkF[,O +nd'bP x|绵mc,Nq>S9 [  $+IC85 f!TqUF`K1z[+֡35etT3%銜c^%r_@GU߸أ 1fZ鬯O]9ZjrmDGBviqQߜmp4t.k~fDZ8fyP^"!|r`_"f ],,JCغ8*=hLƾtyQjU|&ƪ2f!iIH=-e@\Zi}αC2:x$Cušcͬ= j\UvI w)8#?<=gvv3$xġ9ë[fn#r7q6aTےa~Z2Ku^K@7g`hKj@^0ecq ?TDqka\\'~qZK& ×eoIcwltfj?V[<|(~InɟM٫;qҕ֓XVOߟ3i'qH5HnC9rgڎA9ho:a߉;#)<,)~ľz\%RVDضyPNg> hJ,Ƀn6nC DeY/M'?o)!-#S5\Fljեs5ؼcGE#zRD+⻅%i0KvvF`m?BUts (R9 *NhlhI"OTP^\j}\r[M+r`n]*QMEPLI83c$CucXBI 'B?Xlelמ?+Xeuk:LT9Xۿtm<_Իp \!Uo^&ggwnSmhRfȾ &O7HY"quOУv7Lbh [w xe9O8?APmPjKK Il=ʲVA k'&U/eV(*+YVڟy2S*]wLOb("z/;p:KMVD @& ]ҕ,7UfAi@F:EXu<_mx~o -5H;E%XKO\1 "e*I>rSKѪ JuΙe-g17GDԥcĶm 4W't:%͜ 1xؽh7C[b$cRhaga5:@Fj|9< .LS"'j{MjÉnxv @i1#0[WYBh kAz=1gxi!WZclҍ`$b W"3l2TFu.ƨV}wڟP({j/32X3 qHS(o'%~ݮŹإvRWyۧ1 e9OmZoSҳFN4믑3 7S-tDywC69Z-g<+_ %ZpO]k #Pd F-@cH]Ġ9A R$Ou^dmWd/RtZc[]za/猧FF@;2z 9Y_R*vH@is'dptwVSj<h U^(PM~A2jDfwH(*U!U-GU]AVhKVUaD?^N5Ibp O%)QWSHE'J,|S{yvd;D"m+FJ qy/B)%pvGvx(JΪ@~%2hK(P[NNR'+/"j֤pjj+l)F/b29w^'=r#Z6[zLYD<ᮤrzA_Ӛw.ҹ%A:猆w-(YNrEjm_ Cca4eMV|A%a=Vn"fsKS@t~zw}Ы D: ĪjT#擷 )/Ǖq> H ]C{}p8]?MK('WVvd+AMojuҧ!O:[ƙ4-,t,-^a9Dl" HD'[jj8oCx]r9A0嚮+D4I7*oHkȦYwt4Jƒ:gGWaڃ%&rd,A?C끋\A!t)j5)]AR%>~"[#Qʡ R)"PpH'~ R-cF>7[ /wLeYO%27&nn 'V!.+6srܑ)}EɌ<)D&k!uw3i4sir ̍k H ᆲY&1bjH}>'vLbK-\pH/=%&wP"s  \/NxRJ[l#:#$ Ml_,M8P4qVئ4T`Ӣe'$7 |.lǢzzIܔ@L'H_Т\ضYVrj3V;EL !q35\n.15{aS}. k\?͊l4WADdGЉQDÀο/^ĕ!~ֵm96v7nU;o^9M@st X^ELH1x_ ީ7=n8 ʵ*}Er$˘Ddx ,wFǣ(:+QQs.E=@VdfT]h)$!}?[Qi^XX\ $89 Rl(2( <1XuG \bj"o#'[)IPi* z࣢+dfumnKoZ>{ꤜ5DkvNjh`IX} Hڌz_NI&ÐVjSƕYͩ*CkRK1Z%Gܽr"4h8t] WL3q!zi6ں%:0xʯ۷*_@ CW/jɸ˸Yaܣkƍ;;RLs>Śg5z@ iO>)$J|5\5 ajPX- T r$bNxz%hw|nw*͍p0Īn9f *IyT <]cxt+F61ySJ>40Ԃ='ymTriv=:\Pb|iiՍXssH"yYO" $M71u,`v8iM:ѕ rF$jcM&ŽJ$0=|VDe`7ӫ?5`-\ӫC 7Qrj< PX4菎xyN$x+W%d,H&{jN.8" ,DQl$)tls-L`l]3\3ҁU,$-#Ґx:Φ% pRY7#E X(nc1ROpa'7gӦ.i=y1qr(+DQN8D𲢏c^CzޝKJdʭCv{{|2oqI[c3 ~䅱OFuXU۱w,l(7gLm529NqA6g . ŹNv̎u7k}g0Teׄk+8^t="} MYm]͹~ un`WG=b4з Q\h֖`Q5Â1wDS}"zWpm׮a7z{s:U{MN/j$/?}d:e&7Py(iG~tÂ9`"W)hX+Yx_I|[XEĩGAU~siG[Nk ^XSb.1KeW//qՓa)e\>:oҼwAkZzKpܥZ >"<&%TQp3&I18nneVBr,,u;l_ ŐΟhnwiy`[gR0rZw{q7&!oB]BPgNa(~fÙ0Ӱ_h\FA ӵHɑ H=-u%,^`V㓝(G~c K1:2<)$kdK %-x5ƪm|`?jO #^r8_>SOA`̧Wg dxpMzhfjF`+ Zs>=CG0 R%qcz)g mt2p7, q pUc縌Z7{#((#vÁ t+Q.[οCXMF,f՘Zmp4ka]#NJ"42]"֮>9 !sԾ_ئ0ګZ'=,:P[,NL17rl|%L]q,΅S#%w_0]['TcOA^w`tmq&^"񇆮u<]pʊbȳ;r>Ǯ%9N~."!YO헳<5>cĈl#KWpGtgX$OӺʨz162CEܣykE.|D#Oi D#A( =ϭ&38%HM`Bܬ(X-V'C`6ax7l^;] \];Kȕq 3r21:%g }7 |85 L*#\ar oYI y 을Ӯ=Q.q,H(BR< Q~Fk4sZjsǰ -SvG&N[S{c'<:)$4,X,aLyϵPoC< wQ?h- 7*N}p:&3aiړșueſ`E$֍^e^[Rׁ^M.H-CV$ U<塌%Uгs=앚h;vU=r>\ n֢Tr{K$8gv-d'&MG= cE`oh8JBxHۉ}?r8iH;Q8Hܪ0N}rJ $,։?+4;9 ^)mj༥W{Ja2$,=% +;5 1\F4B2ۛV_ H/? cb,JfQ􋹳\fH.a!P_wh/i ȏN"V`jPYW a8DҖ_ƈ8|S{#geJ2J9_)/.,p_D73G^i/.aƨל^7[9FSk{>E@Xkh KWtÀ5_G2ՙX*bRp`B.P}eΎ! /l_I;"a^WMW8QUn&WU'JzjA fU{&2Aa[(ЙR+xIPҶӃ~t3oi+2H $B!m'l2[̉874g=`zX,iANk&./ tC$T{F?[-ݡ QtO&uZ \PbdxB_ف OrKB)cKJ)#Hv!)y *Ņp0|j ߲@® ]ogIm5 vOS)nm&d. =a:\ʒ r%9" ;6K>_o4//3YyE%i<)J$3 .E:MEg9n=%cS?OA3c8@|xj%<_7^5,YHC+L?SzzR![ (Ő+5@g@em$ ;^*G:=߭'a-[rlhX;$5iT"A9nA19o-\h J8}}263brc]! @v~G.3HOpi-fzBs/sپo V,>A j忄@d)eW꘹Lw%cdP VVṥ,$%H s6^(nOcHFS{ _tHfRŌƩ}Q>܉ِoӉjߵ^bG=Y+]ufb3c=k48ͧ) Zv\dm!:< ѽ6kd ֬ή'u3zB:OzGƦe2ӨP*e\ˊlx#bJY߫M#5]suWBi4`gʎֶ;Q9IuΪQodD6Wʾ+@EHT6ukiϦH`iI-Gyy-Ls[OsjaX'u1d7{<Ⱦ:kuEC}%n?Rg Jao1.K'A2|{Y`gˌVvPgG+F|( Gw0+Q G~$L$Fm_2FO ܨbfSO"(S(N.l]!tVv-+N9CWMʫʋ$ &Bے2$#ƏcΘKVSw^AHt_=̪CH؜ޅ|>msKɞz_o"YK2 x'oB@tSkAC/+|)vQwZۗŕL0NAV+[Sv# U".KzԄYTPrY'E*ᵸKY "݊0iLW1Q $p~VLUt=g[A,L7e^\I[ pRxtm]pVvqQZ9ȫs6I29}9Qݦ9B%LrCe#XkATZ:Q#S: &|U Rf)=&lDmqLy?t*5 =⵿M (lC[J/Bs&x|A`\Lb^Vӝ0NTlr@v{γ_,t٪a *>y3\^vXi r,%t4+zgZ[3Qʏ@>P)"sZ]B ئiXĖMO.1RQH9XfUrԍdmq w+{N\qJ;a3}"[< +Dl6b%,0:08]I)+zq4 F-J&qy ф6p [4؝ى?}!4..@2DM{P8ELÃe B:.A η=_iY 4i,mF$nynZ^M-6fWP-VWR[r :SO<čYvg8͆T;p8o,G+Rܕɿߣ4} ߞډ ߠ\6(;3(i#$tXmFo}nF& ~O28=ewR$xzב?P>9DnyZ8vLəOyl!b-[VOB) G7yV?T!DX]do2' >ܣ}[Ѭq$Y~Baj]hpE{ڿ|tgyڡ0>1}s8S~tZijS-J* #(f411$XLl,%VQcT t((w_ЏeZ&uE\}8 #ԷFI4?oL)N9Cdg^> f<̍90Z;!4%@JCxTAaCc+ص‘]&Ų /2wJUEwcD?Ĝlmgx'Kcвn6Va{G癪bj>RQl_T* R|AGyE!$IG ,ʏj ZE19#= T?x!OJ*ƆdluqZn)g/3S]b4{}p3w$.Ϗ~Z ]q-*Z\m~,dBSaNR 4@6+.fColSGMI/1G CeqGK>a²%ᴪD:Tˌ'"y{ ǃ.~Q(xJCNcMT|Mkoޑp7,"5asS3$Yw%;V#[.A3c7 Tn!=Oڑ^mc(l2E"Vfb9t`+HNisP (e'anW E8E͹\R45A}S}d&Gіa9rÙ%c0\x,rtNt2Ld")!U#7pG5WY|aP'R#6.';*ic&[eyz%Jm`6+Njl:[\z:O+Wur7:ؒ{Nϭs?°&N>њJ8zd?!|o6퐙Pg?o}Ik؎^Vr4n$sƿ{GML68ønͶw0aZœ63sP8; םF噔J.(LXQORQ%J#qVdԛw@#?qOHG9K5u.a\Wd GWN䎂ZonF~ x@@{O?}'cR 5:v"qI?_B{g)a{Ec􋌂X}¯Jgŧ~oϿLźiؾE&OyR{5aE>J+' ^Oy!g<,@?g\J.@ hr|O_XKܾ}c؝[A7Qxz=03PDwuEFN)(^b{$Sle+&ë@*nkWVW*Nm`_p>RD&{3z3gsA"!bRR/:fk*':1 X+:t\n2<گ!TgF=Vȃ6YgI T.@ q_VѢ ͷXj0VQL:q mJo׌5`‘ 3XKGAa?UTgq_y(Ha۳itc i)Ö`BX r\+ǡ^,[Rha#3M,Pۦ"+Shc\L[36< Va9Q+laoJ, jiH%F1bH͞w+]'GCOA0V߃dÏyP&su~J kョd+N19$&>(*4h 69Q(T\^DҒ)c z;X06rykS~%|IN,ƛe|^=n?xm/^ßj^5tFv-lkV,ЇS oZ`F[Ngb]Mi95sqJ:RDZExA(EbASHNq{[<61p;ӟh[87 Va pa #)ɀ'*f.<89mgIll/&[Tjg\ecdT ":)w=tVHlA6bi S?dm:ck_ysЯ='3;6r"gx~NVM} ىIK/1OB!wRw1GU[Frw('VBA_7 MJ,~z\.D[)uYb4?9s@ʩLdMݙ)/.x D\}շ|vr^u9fؘ^( ʄF7bG9eq:oN}Nl{+S%qs3)^+ wFK@W|`^ixd3."=4 T/=xߑ}Ez} ἇQmݏM"H u~51*`pYj, j+mmuFS?KvT|SfYp!F ^NGLvM2!3e1)<ՔFbY5d;+iŧ)չ.VIH>$Fr@K:V9 Nx%&ˤ wc6Uby1Zzp-}|+wVPքړBD9G˲` p&O\FwDZn.7h*ydž€C;rJ^;,Gˎ0 MagZ z5Q#_K/iks{cHkoCVjeI'7XS R.!CnJpH 4qI?{t䤦{3txU@Ew*!=lQwkv0囘,Nl7E՜|RL(