# In order to support a deterministic set of 'dynamic' users/groups, # we need a function to reformat the params based on a static file def update_useradd_static_config(d): import itertools import re import errno import oe.useradd def list_extend(iterable, length, obj = None): """Ensure that iterable is the specified length by extending with obj and return it as a list""" return list(itertools.islice(itertools.chain(iterable, itertools.repeat(obj)), length)) def merge_files(file_list, exp_fields): """Read each passwd/group file in file_list, split each line and create a dictionary with the user/group names as keys and the split lines as values. If the user/group name already exists in the dictionary, then update any fields in the list with the values from the new list (if they are set).""" id_table = dict() for conf in file_list.split(): try: with open(conf, "r") as f: for line in f: if line.startswith('#'): continue # Make sure there always are at least exp_fields # elements in the field list. This allows for leaving # out trailing colons in the files. fields = list_extend(line.rstrip().split(":"), exp_fields) if fields[0] not in id_table: id_table[fields[0]] = fields else: id_table[fields[0]] = list(map(lambda x, y: x or y, fields, id_table[fields[0]])) except IOError as e: if e.errno == errno.ENOENT: pass return id_table def handle_missing_id(id, type, pkg, files, var, value): # For backwards compatibility we accept "1" in addition to "error" error_dynamic = d.getVar('USERADD_ERROR_DYNAMIC') msg = "%s - %s: %sname %s does not have a static ID defined." % (d.getVar('PN'), pkg, type, id) if files: msg += " Add %s to one of these files: %s" % (id, files) else: msg += " %s file(s) not found in BBPATH: %s" % (var, value) if error_dynamic == 'error' or error_dynamic == '1': raise NotImplementedError(msg) elif error_dynamic == 'warn': bb.warn(msg) elif error_dynamic == 'skip': raise bb.parse.SkipRecipe(msg) # Return a list of configuration files based on either the default # files/group or the contents of USERADD_GID_TABLES, resp. # files/passwd for USERADD_UID_TABLES. # Paths are resolved via BBPATH. def get_table_list(d, var, default): files = [] bbpath = d.getVar('BBPATH', True) tables = d.getVar(var, True) if not tables: tables = default for conf_file in tables.split(): files.append(bb.utils.which(bbpath, conf_file)) return (' '.join(files), var, default) # We parse and rewrite the useradd components def rewrite_useradd(params, is_pkg): parser = oe.useradd.build_useradd_parser() newparams = [] users = None for param in oe.useradd.split_commands(params): try: uaargs = parser.parse_args(oe.useradd.split_args(param)) except: bb.fatal("%s: Unable to parse arguments for USERADD_PARAM_%s: '%s'" % (d.getVar('PN'), pkg, param)) # Read all passwd files specified in USERADD_UID_TABLES or files/passwd # Use the standard passwd layout: # username:password:user_id:group_id:comment:home_directory:login_shell # # If a field is left blank, the original value will be used. The 'username' # field is required. # # Note: we ignore the password field, as including even the hashed password # in the useradd command may introduce a security hole. It's assumed that # all new users get the default ('*' which prevents login) until the user is # specifically configured by the system admin. if not users: files, table_var, table_value = get_table_list(d, 'USERADD_UID_TABLES', 'files/passwd') users = merge_files(files, 7) type = 'system user' if uaargs.system else 'normal user' if uaargs.LOGIN not in users: handle_missing_id(uaargs.LOGIN, type, pkg, files, table_var, table_value) newparams.append(param) continue field = users[uaargs.LOGIN] if uaargs.uid and field[2] and (uaargs.uid != field[2]): bb.warn("%s: Changing username %s's uid from (%s) to (%s), verify configuration files!" % (d.getVar('PN'), uaargs.LOGIN, uaargs.uid, field[2])) uaargs.uid = field[2] or uaargs.uid # Determine the possible groupname # Unless the group name (or gid) is specified, we assume that the LOGIN is the groupname # # By default the system has creation of the matching groups enabled # So if the implicit username-group creation is on, then the implicit groupname (LOGIN) # is used, and we disable the user_group option. # if uaargs.gid: uaargs.groupname = uaargs.gid elif uaargs.user_group is not False: uaargs.groupname = uaargs.LOGIN else: uaargs.groupname = 'users' uaargs.groupid = field[3] or uaargs.groupname if uaargs.groupid and uaargs.gid != uaargs.groupid: newgroup = None if not uaargs.groupid.isdigit(): # We don't have a group number, so we have to add a name bb.debug(1, "Adding group %s!" % uaargs.groupid) newgroup = "%s %s" % (' --system' if uaargs.system else '', uaargs.groupid) elif uaargs.groupname and not uaargs.groupname.isdigit(): # We have a group name and a group number to assign it to bb.debug(1, "Adding group %s (gid %s)!" % (uaargs.groupname, uaargs.groupid)) newgroup = "-g %s %s" % (uaargs.groupid, uaargs.groupname) else: # We want to add a group, but we don't know it's name... so we can't add the group... # We have to assume the group has previously been added or we'll fail on the adduser... # Note: specifying the actual gid is very rare in OE, usually the group name is specified. bb.warn("%s: Changing gid for login %s to %s, verify configuration files!" % (d.getVar('PN'), uaargs.LOGIN, uaargs.groupid)) uaargs.gid = uaargs.groupid uaargs.user_group = None if newgroup and is_pkg: groupadd = d.getVar("GROUPADD_PARAM_%s" % pkg) if groupadd: # Only add the group if not already specified if not uaargs.groupname in groupadd: d.setVar("GROUPADD_PARAM_%s" % pkg, "%s; %s" % (groupadd, newgroup)) else: d.setVar("GROUPADD_PARAM_%s" % pkg, newgroup) uaargs.comment = "'%s'" % field[4] if field[4] else uaargs.comment uaargs.home_dir = field[5] or uaargs.home_dir uaargs.shell = field[6] or uaargs.shell # Should be an error if a specific option is set... if not uaargs.uid or not uaargs.uid.isdigit() or not uaargs.gid: handle_missing_id(uaargs.LOGIN, type, pkg, files, table_var, table_value) # Reconstruct the args... newparam = ['', ' --defaults'][uaargs.defaults] newparam += ['', ' --base-dir %s' % uaargs.base_dir][uaargs.base_dir != None] newparam += ['', ' --comment %s' % uaargs.comment][uaargs.comment != None] newparam += ['', ' --home-dir %s' % uaargs.home_dir][uaargs.home_dir != None] newparam += ['', ' --expiredate %s' % uaargs.expiredate][uaargs.expiredate != None] newparam += ['', ' --inactive %s' % uaargs.inactive][uaargs.inactive != None] newparam += ['', ' --gid %s' % uaargs.gid][uaargs.gid != None] newparam += ['', ' --groups %s' % uaargs.groups][uaargs.groups != None] newparam += ['', ' --skel %s' % uaargs.skel][uaargs.skel != None] newparam += ['', ' --key %s' % uaargs.key][uaargs.key != None] newparam += ['', ' --no-log-init'][uaargs.no_log_init] newparam += ['', ' --create-home'][uaargs.create_home is True] newparam += ['', ' --no-create-home'][uaargs.create_home is False] newparam += ['', ' --no-user-group'][uaargs.user_group is False] newparam += ['', ' --non-unique'][uaargs.non_unique] if uaargs.password != None: newparam += ['', ' --password %s' % uaargs.password][uaargs.password != None] elif uaargs.clear_password: newparam += ['', ' --clear-password %s' % uaargs.clear_password][uaargs.clear_password != None] newparam += ['', ' --root %s' % uaargs.root][uaargs.root != None] newparam += ['', ' --system'][uaargs.system] newparam += ['', ' --shell %s' % uaargs.shell][uaargs.shell != None] newparam += ['', ' --uid %s' % uaargs.uid][uaargs.uid != None] newparam += ['', ' --user-group'][uaargs.user_group is True] newparam += ' %s' % uaargs.LOGIN newparams.append(newparam) return ";".join(newparams).strip() # We parse and rewrite the groupadd components def rewrite_groupadd(params, is_pkg): parser = oe.useradd.build_groupadd_parser() newparams = [] groups = None for param in oe.useradd.split_commands(params): try: # If we're processing multiple lines, we could have left over values here... gaargs = parser.parse_args(oe.useradd.split_args(param)) except: bb.fatal("%s: Unable to parse arguments for GROUPADD_PARAM_%s: '%s'" % (d.getVar('PN'), pkg, param)) # Read all group files specified in USERADD_GID_TABLES or files/group # Use the standard group layout: # groupname:password:group_id:group_members # # If a field is left blank, the original value will be used. The 'groupname' field # is required. # # Note: similar to the passwd file, the 'password' filed is ignored # Note: group_members is ignored, group members must be configured with the GROUPMEMS_PARAM if not groups: files, table_var, table_value = get_table_list(d, 'USERADD_GID_TABLES', 'files/group') groups = merge_files(files, 4) type = 'system group' if gaargs.system else 'normal group' if gaargs.GROUP not in groups: handle_missing_id(gaargs.GROUP, type, pkg, files, table_var, table_value) newparams.append(param) continue field = groups[gaargs.GROUP] if field[2]: if gaargs.gid and (gaargs.gid != field[2]): bb.warn("%s: Changing groupname %s's gid from (%s) to (%s), verify configuration files!" % (d.getVar('PN'), gaargs.GROUP, gaargs.gid, field[2])) gaargs.gid = field[2] if not gaargs.gid or not gaargs.gid.isdigit(): handle_missing_id(gaargs.GROUP, type, pkg, files, table_var, table_value) # Reconstruct the args... newparam = ['', ' --force'][gaargs.force] newparam += ['', ' --gid %s' % gaargs.gid][gaargs.gid != None] newparam += ['', ' --key %s' % gaargs.key][gaargs.key != None] newparam += ['', ' --non-unique'][gaargs.non_unique] if gaargs.password != None: newparam += ['', ' --password %s' % gaargs.password][gaargs.password != None] elif gaargs.clear_password: newparam += ['', ' --clear-password %s' % gaargs.clear_password][gaargs.clear_password != None] newparam += ['', ' --root %s' % gaargs.root][gaargs.root != None] newparam += ['', ' --system'][gaargs.system] newparam += ' %s' % gaargs.GROUP newparams.append(newparam) return ";".join(newparams).strip() # The parsing of the current recipe depends on the content of # the files listed in USERADD_UID/GID_TABLES. We need to tell bitbake # about that explicitly to trigger re-parsing and thus re-execution of # this code when the files change. bbpath = d.getVar('BBPATH') for varname, default in (('USERADD_UID_TABLES', 'files/passwd'), ('USERADD_GID_TABLES', 'files/group')): tables = d.getVar(varname) if not tables: tables = default for conf_file in tables.split(): bb.parse.mark_dependency(d, bb.utils.which(bbpath, conf_file)) # Load and process the users and groups, rewriting the adduser/addgroup params useradd_packages = d.getVar('USERADD_PACKAGES') or "" for pkg in useradd_packages.split(): # Groupmems doesn't have anything we might want to change, so simply validating # is a bit of a waste -- only process useradd/groupadd useradd_param = d.getVar('USERADD_PARAM_%s' % pkg) if useradd_param: #bb.warn("Before: 'USERADD_PARAM_%s' - '%s'" % (pkg, useradd_param)) d.setVar('USERADD_PARAM_%s' % pkg, rewrite_useradd(useradd_param, True)) #bb.warn("After: 'USERADD_PARAM_%s' - '%s'" % (pkg, d.getVar('USERADD_PARAM_%s' % pkg))) groupadd_param = d.getVar('GROUPADD_PARAM_%s' % pkg) if groupadd_param: #bb.warn("Before: 'GROUPADD_PARAM_%s' - '%s'" % (pkg, groupadd_param)) d.setVar('GROUPADD_PARAM_%s' % pkg, rewrite_groupadd(groupadd_param, True)) #bb.warn("After: 'GROUPADD_PARAM_%s' - '%s'" % (pkg, d.getVar('GROUPADD_PARAM_%s' % pkg))) # Load and process extra users and groups, rewriting only adduser/addgroup params pkg = d.getVar('PN') extrausers = d.getVar('EXTRA_USERS_PARAMS') or "" #bb.warn("Before: 'EXTRA_USERS_PARAMS' - '%s'" % (d.getVar('EXTRA_USERS_PARAMS'))) new_extrausers = [] for cmd in oe.useradd.split_commands(extrausers): if re.match('''useradd (.*)''', cmd): useradd_param = re.match('''useradd (.*)''', cmd).group(1) useradd_param = rewrite_useradd(useradd_param, False) cmd = 'useradd %s' % useradd_param elif re.match('''groupadd (.*)''', cmd): groupadd_param = re.match('''groupadd (.*)''', cmd).group(1) groupadd_param = rewrite_groupadd(groupadd_param, False) cmd = 'groupadd %s' % groupadd_param new_extrausers.append(cmd) new_extrausers.append('') d.setVar('EXTRA_USERS_PARAMS', ';'.join(new_extrausers)) #bb.warn("After: 'EXTRA_USERS_PARAMS' - '%s'" % (d.getVar('EXTRA_USERS_PARAMS'))) python __anonymous() { if not bb.data.inherits_class('nativesdk', d) \ and not bb.data.inherits_class('native', d): try: update_useradd_static_config(d) except NotImplementedError as f: bb.debug(1, "Skipping recipe %s: %s" % (d.getVar('PN'), f)) raise bb.parse.SkipRecipe(f) } Au2%B$m*ޛ"8< K3;"`fX5f Fm-Zh D(A3I:Ɣ jJ ^! {li!s 7T0}w"-Q|OROhSsB |?]@jD;sVA͖Co33]!Ɣd???_:P,xEG>Vi򮠏Ă` *ɇcuzx3R8&ѧ(ŀj}?r\q&bRRفmT>l&򾍘/ 2b␴L2~ص32.$@=L*Q<KFV˯45}O}aeb\,l 1eoTy<8_Xm%N;}üm+>enSUu^ ʘd+o8 [tcKk| zan.>#t|ub!M 9Є%()8]6skbM wSOK8֌)YxN&tޚɎR)!0/KHOKQMov1ESN҉< s6ݓadJe#r}'a`,6 K 3} Jn#+DV% XiTtM(\Ά ya80fer%ioi7x_ Xޅ[/FEaZ So:Iri'J"`Yp>o26[Iܷ +ekβXͤ`Kʵ$AUIfaRy]ڸ,in8lkR][G<ەKv!%$<0|(n/RCXRoio)ϦoY]M.hrbk 4=#ϽF(nr 2V6=?}g]aߟ""y ow'~JF+`^zϴ ֖]M=K}O[evQ J GC2OK;yޚt~@f,7xebn!(a?ўMs1'jw_6?.s!}g|[d >h\ZuZccȸڟ X>RT $^f@vTSO7[|w~eE$$ R)@Lti戮uy/asװGͅ#1h;e{!.2Icu$^uT>0QcKy G KޱUG0;TPr.ֈ.hl|xXo,i8-Y/ B8ZҫFm_Or:W5(K75cF?Kcƛ!@ۃ@b%9y;笑O%p-TDRWaQ1>38D ?B0qiD:ElIhoyiiZ 2 |6 FĦ.ܣ4yi&܃ZqykSWIn (?~pl fὉC}pjxF}<~84*Gow oxx|@6XEɐek~n|J UV8|HgMZ*IVg "EgEY|e_)z&ɳ-XFڢ7蒴#1BMϓO%%h9iG3;kYDm1jZ#AAHB1OnXfh2KERS=HT汱M:%APbSgRԕfqm_fu皀 >x`hZs贀@`{P6v.7|Oa]sY7E j R{}ݓϾd\/ R_U>=_W:fkXPΣy!BB7Fv/8S!Hѡ|{H)MuR\]un5ӈWtƃRrvζ;^ͥlYmMJd,-q-P};e䖒r̾>H*'i䠣=̀$SwUթazsgf]*C g(C{/ fmppR0=FaqQۜk}ϳmTШYUH?[i5ҘQ猪ra^w|truxڏ&e!3zBw륱H$` . DDbȀ\zn_IUW꓂~:dhrgaR'}(_jOeID QJq`Mb%7/iKi[LABCXDQ['?jwHjB Qy_4䙩}W$pIm.)ld)VŀxgIES(5C&Oe t[OjJd7ug]XxϾqm:d%K1w⊡@XThcep\b\V:;T;T#J}-^+oiko1l7˾=O _6AG'b`?u_22/a-M*{^arxRwSXթpZB>8fyߙ ޳,F+.HPrOR"#,ɞc=N&nhP@0#'wnOs\f{ReGƿМPk  t4 qqTq庂.%q!&fLvůx.6I6L1Q)M]fURxPspg #_L±x`: SmWj +Wr,BErkb`$T9Vk6͇ #]VvUODWR^!']4;D8;IkֹG›OȘ+E{1t>v6 B߇^T Y@ݨQjcxچl?rɹm \J:,rӓ|66yi12 < -g" ]*D}m_&W֔]fE ؈rPh󍚲15$=8U#ZAhTxngUg)Tdm:1H8 Ҿv"Hg26kNRNډq( _Gk'NޢV", ׳*rWU(#fSr/&ho=L*ү)OHqIk]}yF]D!"XdS1.))TY;}+4Wy]4fe_H#I' p؎]#$aH)VM]Y|R"ڴk.}3`d4A!`aHՄA"JH$(̧F_Q28F U!S 򚁆|p^7_y~e h˴b ~m/{S$Uq=; 2!~Y܏oEYCѰf#2# $ =yZ(Q%Z&~Ա1(YKZI^?QW'q5"pΤy| y$AHB h F3+p {{_A;ݿ "Hgkƾ{BM&xPZVCq`~׷&3r&浘Yn9'?|IB SP3Uw̶9(2qN moshR^(pu3"cO]֣W2Hn=oTM6YL6~RIs9ls+ϲsz(" y:ya̲]SlB?<,$/„';㘰{.KvWJJ\O,뙌Ho*l*1u}g>=ޏxtv 6TXoñVՓsʟ!>?bj>|\ AtZ)f2yS.S2:ET9Fs܂#ރdeNM [|a`cHc P'=T3ZkrxзcճUH>%+~טf&iY?vv[fCVYQv:( j\~5$)āFBX$1J @\Uc ΆE4,2̍Cpytw$HrRzeOz| ]P. 8jU: _s&f$_JS{X}8vX(B~[<seuH9&v^5Rŗ"%Ăӎ)FD\@gW\&?Tx*n32V:v=QGjQL\ƙcQ=J)` !U`:T٣# uR" rյ9ϕnV:^sJ"z{ ϮNH|9sl´O.hI؋s8><9OjNꃷ̎gFGϠ ot>IpG-}-Nhap 8{mqgd}Dޟ?*G:|4djo"Reлԝ nR-HCQf*d$CP/4&N3~yWq 31DM_^#'T %5=T\tP(!:q.ox9aN !OgS6TRKȹEnRd[E vQǻH'ob:ݦ,OJ|B'5&ev@,&Z/eF-CC7Kp4zs jFJ)B6G8)0I N[ByxOAA|dq8aAl(K 'ӫlpW'\?l*#φ=KS ==ԄyALmB3B?gF}E#=i>!#$te߃sMqR\5[s%e(>ߵ?IΎŽ^'Dj+J$0%~xG:,/el~C5T{wL} Rn~ oH,"J>"Z͟)gR\*ac{qv ܞGm,Q %QR?w$u̶80Թ!,ޫ#gpg/Ee@5( a|C R@61b(<Vy:(xCj(Q lJ0)BؐX@޼0> '((1~ ,&)QWT5FEPC_Ǣw0 0Q/X9#UAF(%R%&dsHC"Fjto1. ZlV29 ͠0" #݄w7j(o9e-k%ILx(%8š+?c1U&:lۄyqa~*EV$(YH0V\[;/IL8J#A[TW{mƷ \1PDJOƉ={莥Da@ ȋp-f2qE: HFJ!fxmQ nl_5k7  .Z![bp&,;r3Z" . +gjl; u27]]~ U\A~A&͟wQk u ÌdP8ohKSDr 76D)zlר_!xyB>nt94iHp5HPtTGH9*bbbn QdŢc,r,SǎΞIJ<,/bHG} ,] xf) G|QE7,?0M>?H!=a^^H뤛hD63>$S dĚu * ^s^1i^.{FiǵV̴>zVkO<?]x KU;j)s}WSu'0-yi}Ӑy.Elo`2Q|*KqUEyʍ<ĩ0bl ͪ+7auZX,Ei|ͭүMKSYCMʤ(s G{8a|o$G)[FZ4>6|Xx|b#g<-3ey2o+^_n):عc-FI  lG6!"kV$sYsı+bJrRߪDR~X~AN{IHY_sC67~6qeUt>:\\I"}N%ĉ+J+(aʠgX<2C"DF)iLI3 ak&}oiІ3 ~/l4LOAQTEUHdA"VQDAV,UA F&SY $HqԉlP*g'8%^b~e!Uvi2]rf8>gZIgSHS UAXxm+ 0O$ik#:SC.R(,12w, \ӈBsOC|Sч 4[z%Bj T$PH;2n+gT(3!($ ?K~ ] 1>/ ]!2xFP@hDŅ+P"ThU &N%3w[c#1yGs|ԄR^ n2PӺN0 T%3T*D~߫:C(jt G;|Jiz&=3 pz]Xsj#,y&! lF ̿svӉm҉5W%OUncH4NY=2I"t " 彸Mؒ#pw$@ꝳ‚HK檔 H\aYf91Y'GHT bj=Y-|AQY賸YT vs{!5y96ϏY/%|@CXb&9fR_]*_xC)34 2swvBVE͝m;f'9C\N3@+Ec !ا?ic25:[&(/34!pV.tvw&j4v m@% i  zE+sh}swTVr)a͝9r>qi4~,Ajl$4H& ?Ien2@"[7doz[O'18XkO*>dR6%5!W0ȣDBA%5['2B. }.H~*SR=/w4oH`""*0HB#o8!,c3}{ٌ9SBhv 8&00~AhHXq LY/=XNCQ>^z>}mwue|ˬLf)z.@<M8hwk*~ecRhg| /A sm\8~/[!ԘC?22,&HN) ):7a'5ad b˗['_/ldM$*J`O\O\@|B6ʵ[;D8-e~F じ棈*LR%xp#>v+7㿵c uk![ƒDAh\Gz")b7ϨO.!KU.! }/r ֊ES(T "Orsn9 CcHP@ƻ~gў?٬Ƅ[ Gԟ1/k48E}VT:.,ҁDt$O,)flhCݜm)Q1xK؆ڶctϙi\c_+67!=#*=a~;e_ ߍWӚ d=] VJ&(R;m!g(Di()@A͖睋T"ݗ4蹨VyD;1,DD)a(HR*(*'X'qy`o=<~^rA\ !n $N| rSL zK?x~߳?W<)$Pz'˓AXɁ+biv΅H~'}8Gqx)·1QΣp&!`O!#/_}(Ggr_ >f*~xM3tt;:۵˒ q >:^x?ثD|{~a7RIJ G)8R)Xv~J Ge^gq+rPd"s6C༹M+fqڻ:֍'V߭ %ήiBcch+&gb+C6P!l*Do86f ØHD5P *A`ehÃ_I.ŽS-w_PpZJVE7dY]@VQj82.Rk-ž]=I}O|\zf2r8<|9H@ѿdBN@dnw"ijHV@B/"~^OqWJ=jJlj_<5Rke!1M'[o& uV~2;9zifBTѝ-[l\R{D{ *- kiEvXq/0ҧDU&5좾 bkу*5дGZ^j#=;ku-ep(VzUo#c2LAQҐgTuW&0Lq =ſܮ[o;'ɼֽ_]Yc>̉)'23p|c׳ێ8_!F]-=ȯ~ b[nݺs0LhŻZ \-|'F 0tHF[i Kt6P-sJͤ׏cƶz_='>?to?7]^y/r\21> NsCzd2'`]< dw7tIOeR:j9 i%Vķ`|KԻb~݊8l1xg7Xl)T*cQo&l1=ڴ\e.顡N1} d{<6=^%$_}h4&MpVO ȗV'f%u %hH aHD%qtRV_Z[aRSwlJ pM ư?~/sG$?Ri?k׆ABZ >Է7?X$P5q+1FQxc< 0IQ-JГCzqg;,8?Eձ3zJAKn?\?#wainE#8H4f c/>;ncys- 90sU7l{Wg#+{Oi;a[D̤bC(h/ɹdԼ~\!)w4 22 OT!3u{Sc⥓M`niØ!0q'k<|?ӘЊ!ׂEz3V3z C1.UVuˈ6h[Z%I\.p׿n0o4֜ v(8'Ƽλe /E1,TX[@I~w$k|t?R>|lZ _ꃠIcI ! ^bRsSD(J>-uskLTs+;'5beJ%s׽ [*TDamY꼻!j(JR )ē4ŻI ,|~Ga%a>R xUZː>+|ỌFװrdϛӒZy$DS{ڟУbܨQ@u_S0ar .avX-RZsݸO|g0\BL:hPN lӰ7ׄukoAk8~ZF~Qvc&CNugW)eaKh)L Df1Rլa5ҠǢiu=CCJ9RdR[@<  VT`:h]UGؚbBF@ }w2#&:&ݨqoq6كyH`yJoAKj2ڽc4Es(;L 3ތi;؊QBy~sHG&dtK)71?mL8d/JwL cP{*7?sloa~[UyRb)@N%P:)[1;- N&f2N~Gosm_=b>Zަ73ⷹʄF('yG.s~ )-o?9nϟ9בܵ$og9:). 8)L`_ZQ7/Zb"3Όel3|}ǸwޅED0y,V * Q2PFS"OsvMbۊ9KiߪlZ^nٵ0sm`n豥 CV;_G2[+.|z+8^lFѼΝoim>%#,O{+LEY¸b0E?PBQ^VݵB1zL]q'lEYT[b2wBؕ*r+z:?5nxn~N?滼YmlāMcm(C2wgeϚ7L[day()&LBJ875p~:߾\K(G#)8LRrGf\snd/z_CQ-S%^Fsl}}ҿkrO}l 5c͎ԥ$&\릞ݲ}+s_d]_ ɭWQVLv/kS`xxmlmK }1k+B6S}iipv>x8 DgZ@+T61s @dޛ4ٲ"dVxT zO/aN3B<##p|W?upZf02BFv)7u8!݀S!B5UΥts0۾xbQߞW2:×0hL m̃"#AA7 ˝Y4i).@n&9[sxϣ'8 y)B dR\~Wy! "xS,fh0-lCu}pƻ>_Om6ɎyܠX7G3o5F&Gn14Kqu )Lq ,!(RR숍)@./LW)76# ![+!ɒTKſ|f֥ ~glV t> \Eiݑ`ầfZa9~=y?,[|Yn>>Цj+2}-+XxNQP@$7_ە|S{:><'XŦCQO+ Ø&8mkLD@#)gqhUa@7-GXp+%z&O;qp=k 8V>kχUL6OzU iݯYmB帄ĹBv0<%Wzz WCg=WGqLN!f(ehu8!Nm ~Em ⃅ي{XUi ]:z/?[~-m4|!:><UT}ՕfloUbбa~>ǥ܍#=x;xֵ>ܯ[Ճ8]ut "_j;ʎu0a` bJ^.aqrjx ^L'l8ܔ]1m8А.wc\^Um=UMh\p6Y .; H}^&Y̅`+ÏKMŹ7w81ciJ5 w(a+H BY;sh#/W,/ b~?qOcwk/']}ucr0VEU=QG4X/߼ S% _T .שvem;&- m%m\vn;4PՓEHձ&s`;+ӫv1_Z_gl~{H,$ߛϺd[4YQr16O6nd@AiJK(P):զ9:\?[$P}'+o27HDSx H_ikm^!(M:+3}\{(l2x8% [hˋlΚ9 :}+ByLhԱOnd]ˮfWdu<͏_Ǭ^% nws8ݫ~Bur8i%9\K6KWhSbݳ|>U-TfOxһ;RKT8cN50DQz(y '4桅}%Z ;MfT8/GN:ޯ"YcKbeiNȘ^;4 ǁLkNBys+B|mJ S ] l;L-eܙ#lej8M8a{; ʷU]F2WY5p1 (”eNsEq=2j(~*Wv. 2|)L]-0|[ 0`'suv3{(?`Cm=E`oSm$w P3Z:M ?eLN:H 3ȬG^qxP^sQ0=nwVac\*gM39:CkOb:f_fF5Ni_(6zKTpw b}0rVӋ Ɨ7E]Qa x1 ce+Ruʎry "}Hd:o,3QXmKٕ1%C` 2܂V.Ͷ5WK`x.W\M GZ[&S=氡22m[' )sW;衞7שD,rv ޟ;H{VH?#c>]6xof#/ɕ^/ML]Cs&ЇW`?]v%$.c ef ABA`10A2D@`1"@Pd`1bHEXAD DR0Tb@`1EH@"$( 6@^HDbP@܄)@{.%+}})S.Wp*2~ s1&ϖ߯A/_z8 [lⰻUg^-1d*G# "{.iԊ~}N{%ºuWp*Y8 aLL˪bAt_V-+tAzuD [5-J_i+|i)dsee .Ps1]O,Os3 E`Tx0׭R$ptynIYg)]6z $2ZZtVYk]( ˴"_۪j V}4e@0QrZ+͑KNM?'2`?85aZ4r65ywOlAOAy(p eS_@8~g-7K03|Hrm_g1TX=QQPWWgy?,zQWEEGLA(&'(f(Z -~D!EUK@j*zpVБV=xP@C֑ h"`,!t Dsރbϯ o3@(}7(R oćX7 GM,k>9ZI }x"b*( ? ?H@}pP(cP@,TClP@wȒ **o)〠2̪B"^wIEiC|\"*݊dn@ "ȃو@UdDC? qM~T@\NR(pEo5 "N A> 2<~( T==4 PAdJdFmq'6z|(kk8N:{(ܥ$y7I ۲Y)q! vb#*VDD=C\X6$Hv6|ru4A -CLAGxNm}<8sC:JaߵL;PbAj@fUN+!8?Ҵw0'@M:2DgPFw@{!AdSsgn@3$ e-)e?8][ ,H$35/66%_{u/u v?PRuO@vm>^Ai_{Shpnyx^/'62 <>3S nm-Ny, yg=:egCM7>ҁPef9XBZR3L=FCa@=DAgTF <עI[QT:&ZCN8<IaPO Qɦ팟k7:}ӫƂ<~?S%ErpK3? \&wX3Jr|]} oQA`,D` @H,0E ,QV D@F H #"+d'c׽j?sWo<4{alG_=C LŘ{RG=lO$tZrI7S))*H  պDvr;bV2i:5FDe{LIH޻=&F@}>q\&?\&8͌hɂsu)jOYZI;wwk 1xMWf_UΣ+&/n*$|IΣ7=O"\Ɣ.\ }mJqNƄD!X29 v7ݽؒa!I\W*0VAah:٥*BJ B;rM@(d|垿xԪE-tG@߈.v@JeQBB³Gsг)<@]68k+-BP3ffSD l}ּ_CZgѕ /n{@z酖{P0Cl`a(M!j+Iߚx  ßc)w<0l B BKǽ>PfޒC T#  9ƤZ|dX?<eLCF ,:uvYؙa:x"A6m Ȣ}F^v?&-Xr!| .jIK Iu>7z"n'ނzUE%y^FgYDuQ"a M%N 5Lņq&7?$I㈉yqšjaXŽ{Ǡ&􀞌7QۯL+K)pv"nZLIB~4GA6(ΰ`4= uK%Br+] F@OPȓ=\*48t?b"DrxP5 ]kDPqy&QE`*OAe ~ $F=DPt)>Q,U r!Pd_?J Dɟ]X׫ѓȀqMhCVT=($zZGpP.;I@,bYfAXK|`Ĭ6b^OBB" 裝 2t# pՎlͬaZ3ΠӸi0#`舧22l[%D kFI@?VO}}{xmϟf}ί/JLo|8|^` 2bI@~Q^6@H1֠)ONw}5 ^syXm©f9>FQ CN&q,|IyX=aGv)R6n2 ) g~޴Fe, ;g_\~vͷ3zUR$c;8eQ~wG86y,X$S8i{&9fdEONƫ=L}L~Fߕ6e_Q$(a"I ԂO5-fl-%V\ww4t8vYEaFBAD՟9taSz_ZU*9,1\F"ʏԺN{]ydP"x`aҗ(8@:|%.)'͛,$E`l$KCeǂ{P/UU J3ACρ,5]XVKT 8l: fgy8$)RIR$* 240aޔi?Ө3Sp\V@<\('A8jw{>}=3m} h:[O6ӳ):oxE>3E~AD?04O C]{C>A蟏@Wo;}I:ݞ*HTWz2P-Ò\jQ'ʙkɶ*LO6UdgiF+l;h;u+'gc{ b(iƾL`lقC,لS3In#W!i70L'&&4.& q_`xҵ^RG:cG5}y,fٻj5x[H<קc8'?秠Gǧ4p銱 ^?/?9`;hGyKPmE!)w fg>xogf IZD ⡕պp_^/,T %del A`l(cݳ}MPv, XΫb+ ZMe6ot>ѥt{J80&q, ƛI$Qq>4r%%aQ/V g11$I־Ubt<$\n=8 >X<޹2p0K`DKaciMLNYh1NB:A"k{l3uX0R/p&w,ր^o7zw\RFLa}YߐplzR k xw5kwLgTIkҬc%]R44!ad2%ZJꔚUieRuYqS=V a!jwbq p>*cSGK@xRң( wjx 3hI JbS6NXHj+H 3- K%7dK`/x#6I YB$*kB>a'uDyE~m=UR`z>立C/ eѐ{27lwmh1#%a<3u:C{u2kKr $tIHG|b/L9T0J{H\M`lXRZuYMjZ *SĿZ9P r/B9јB${<5 .!vԊD C3_CP{)b"| ʼZ0^1;dI*g[K-wRb[J@5b@r$YdMdi4m?ycPncS _WY ;=N?MgSGAcds?{;+OHcL:GGs÷V^g:.ba8‹'W(6Oz5N>`JBtɺ\Azk|3 e?BGܘ>.rQ3pdMX *:i']1b"<xaGS(M՛M''!T+{V}F 2X?Z0( p(B@Qج\ʈQOy"0yx`o; <['p=8_2Vli6aW'n !+] %P@k5 Yi%L?2c{V }a=2|k볼gY0 ?xxr(BBx4M>3<5sAAԉ> tP4H! d ! #$,2ptrZ(Mh'O ^|8J$N.{}S]_T򡎝L"n3VwϋYS# H6> Ru8>ӣgsqUC yl8'j<:?asJ|W<]""m)쇷m%Z΃|@`OzNukq!%#k1{Y4_-9$9lsN0[3j%"4!ހ"t@@qr-Jc$Xw<-7{}=7j d)!J_ Am1Odpfg [I@|C2/%!=U(|xA/a?0 t(KWs tڳJ亁iLk.]gUKk( Szĩl!:kMA #4R1n8^)rڸ5Q[ ( {;omd ӑW_8~p7U_oHP K7Mzu0uc n +Q #%9vuv.t\(z@ ",[LxH$pVuP.${Hwx$ |〷 z;]Y i$MzסJFYЂ5`yE 8& Uk " ~ }[]vQMC-+YBnySwd1P2᳐T^ȡ{hD >^Jq PG0|pTP|ҏhy'9`37 b`OS{^ tcyِyS{D 1?G}{KŁrtPA+*R(Tv~;46V[jT;YR%1 CQJ:B 4y*bVT4{ :=o|4_~gd2z 0A,2"ődo)v!U]7 Q5n  QBzffP xw6÷!OEp8" }=@J{x!|cGpZlT/J =x4wn~l Ԩ|6~Нd4yMMoFEd7pifd=oß5+ԜPw(0l8A0@d]Hǿ:ljp͸-&̷2ɾJHݒ HBfJ z$}sou[owǏx`Dz>Xљ$18j*ʫ5Եb猄zT\JQYT 7wdX41bvq+;ocY6s}yZsG+~ 7'f cW03:p^X5 ҒU\D{fDQb+]όB8*3;+hG"k 뎪y%a ^!֩j@*C;Jn 0JG#`C5KM푽56?@ G慎od o%J/d}O\&n]38b-A1=ې`hBV0j^nⲱpPy{CFq6L P5#. ⼋8msfWyLH8ę?VWmNb^Cɀ¡K ?Dk]}QZBT.$yWzVUQ,Z|,Ȟe:m-u0B ukUJP2$J%Z0ӗqS7Jc f)hr9R3T%vTMa M|*Hi>fR#^cĥg'nBq 8y l]5Jql|ъ7#렚*<梁vo9dUuѸ{{" q9{UG9]yU0ӏ;PԃP@*o#=A{)R޲$0åSePbsjߠG۞=.flʊy8uI0n_Khҋ2\e }9]f$^쇣%4nq$ԀYGwpX Z[ʡ e$ǗIG]f$S( +8AGqᔐ^,riC=Z]FkǕ'  EHLYQ{mt|Fs4fIsTr ]ry=v JFa!REB*_bHLكC-3"`mtДP[S9 ZV^Lex P{M(}# 'cmÖHت #r(Uwz?`~7}ϟt>{DIf?Kn0 q@1@1⦐8q^|$br݀XimU =Iњz )R--@bP&4!RJՑBV=@Y1)0t10D bY@( M 6|S71Z2ۖs \DVYC1 ju]6 [u?Z[b!S{_O'eʚi )w"EJӬ,+%v)ֵ1wi\nlLY]9f Ze&hӚG=M҉*c$e(UrX#jȦ,jaUWMfe2z4fa dF?c~S0Y!)=/o"BE4=]:&n'Um;4.[<`U^)ԬO}W|־ _Lf3јjM wj EAM}~([h˗#Q7} 1P{\,|ju,U6~FHV$' ziq9@82:a|.BYdvSU{>TneA9&-ㅳ|aT*0XL\u:Y/3s(z]?&H4카.FS+Ighz Ok sR* Y \0{aor(DyשUN8 [X+A\n4Ӛ ϩoSԴ3 N` 54&o7b[Se?e@Y ɉ)N,\{~㫦(2>#~ ]R]ʚ$P0puL$0/?Ϩ_8je$ 0gLH ҈UE$z\a&{yKv`=cz#BwB7ߓb,n{d+&ô`RF`5q[c_멲}돮7`VIQ)>L'L>oXrVb^5YiW5fȗҘ27aHUs?rgw[*Tb|+7. n5ũ5lk\j:FedC2\$0)٬ÉqSn9P9殃9n!EUkڷhQI%[B.ɣϼs\euA~<PF@$$RR]]hDUޖU.1NF`hQչ~mlWE[~_rL1su}uS\(Y4Y}jһpgMێۯ۰~v{5 w (N߻0f:2LHJ"EVu!+ ]~a G{&@/3M2!Cb @WYcʽn5lo>(SJ+ز=NԦ 9補~gP4q_ϊȥ\%ɒ<0+%HO骷dze*\(DO@aM>ʫA0`j>IO$.gkKe1͔rQgwu&U~(I?נl /GczV nX y~=\8_FOYUl֋kD"J"!-k֜үheWN^e+Bb7Ɉ[~egaN HPZKi&'GaaQpi@lO5~j6<gG¢98n dVV9k{L%֊E28GV/%$>Vw|JCqO4*|oCbBf5Bx^\X:IYr8&W)}d0~-' fO\ Q>MFr tegױ0DYn`jgpwiX I kh Vo8rOLGtFE6QE+D޳HtN*Vd/؉`4uaqRڎ8aϙ^%Ƙ@k2i֛ `N%GeT<A,!k ye֍w V}ST|;󊍒wer9t ǔ:5$1ŝyL~+a= l&QK!өt |GJiWЮH*Z/)}Sjowu(\b]wHZCa;4;}sTƷaHn U9ɺmY'e%'kƊd9==.+1ݠ tZo8a/wY/9F3i;XϧW n= @#(}O !a(7ϰ#k~T|Խ4baJtP5ݧGy{$ʶns:!")v2:K' T.~9!@PeaA"-a}([m0Z,d K*B)"S) v*F7mR4-r߶Yy>ETǍCk'%eYfy{Rk^PUu#2=򘏈QfCa{ru u?80dK5j>oo/ əJHf؍!C3vHfY6BhKu2^XHۭvc)4m+8ZJAчTM]dp$ 6mGB7/ILr] !p ( V@X/1,ߏHk"->1zT\ޔēڄSZ!ޙīG)k>pF^Ha{8}775dXN7#E\dc𳄽#! 25kXջU<]B[O{*VL \J)_q4AwmWwJߟ1tCfKˀ"OR yEے`r>Rau`׹,|cNEBԣXP9QK'4 E,]w_,aJOu,R:،Ɗ#]z  ʚ재FK\V*x |䪤G("9K)6_3W2/se#ptW 0|,3CsF_  pKyD`OgАLk_QHu_gL-Dqgq?Njo aE# Fc*@:GRti(r#ƛKN?w|{fmsTF 5/-ʿ_)4;JUDȠLpdd$Zɵb %*~%$o(=kskW*Ekn[I<'uTjg3XS@e)F/0|q!pg@T¡1 ?\Jֱ Q! e2 77°^zEswMߕØ!qEii(Fx3q-*:Y>\aQM˕G!ND):#TGlt|ȯZND|-sq/J0•""=#ӳf\49ı# W/IM]ЍC7iI4'9Vjjm2YU¹IifVgI` Ce0?ZQ W=%f)BmYR!Ul9{{ l;/5"LHL,V@9*)GcIH,>?QISsRCLw~NJ"x1vaa8voRP=j54IyYtG5] HPY9%V@)5<$<&OzlFkz`ZaѧB 湾^ S> =yȵуQ); 2(ȥf{zMGx7҂\duۇYc?\=ӚJ&&=Co"DiUQ$pr* ie`H Z ˣ Y ݮ574Dnhn{B!dA:bz)紩8;nH:s[ŷ_Q јaD/ ;wM`10 X-"Y&`m*Hy}ٱ˜>04 j]ꤺ%N׭̧KG2Ċ}cirI ֗gw,լ3º%^'WaxetlеޯPs*j써b0GUq\UDyU mF ?>2%+ >DXd8Jyb2 ;2@Ȣb6ćyPE{w⎘Teq|Ƶav{J: T]G3欴XqLܰ`zgH%  Ж ZW+38MdW#;?o5*'P/*x ΃փ6;nK]Fİ-٣v \c513agYZJ:_X6ͩ2`TƉΗ4['VXygfγ=iYECQ0{H>P2M@rgrY\x~TxT6K (cLf6^RN{tn03YHHX;rf585n-ѓrG@:aG B>[ 7 m89Z\Tx5T",U +̳5cg zd۞_{0)'yje봙q i(#^y){JDbc'I{l5L$˜I3 qX+T;+* rWby O:$K+I • gt6r&~cAۖ`= >jXqר6a o@r("v n$dٌ{%Q!oC{cVm HHCM4`tWHw.P({h2IǙΌQby2,lHZH$˞|D;\r иγ (o~$LQ2!fi ;j.$h2pk@*BI!c` :d367L3IöKw0֚ '-w@ P8uN~<&_ g9T0̕=J겎+ɷR`]EҥE#ڕ$<\lʪU3je*Ih~WiLP-}<ˊC+(ҘVF򴢰 '!lF^>jM8gd\eAp4$7y\TȌ.&*(I rufpI;m2x 9?f8sK<"g$QX0YuaB@o{JosǪRx*yq%Kyޫ@gq@KV#|8DV: -GxQ` 6-vo2ðRvCqPRDeګa-B3ٴ7Jg6аpYVPjawjH)&sLY/ K8#8Y^DE>Q0$zpD)VN :t.߫e~'GŞ_W ʹ;APoQAeic6gϢ>~:ퟱw!IS"@=7U⣕1T  $ }ΊQd8'o/膳0% L.s) 26LE+ƴ*?,`AB=p[sv ̥@E)/T<6Q\Cm~@&EEWFO4 Jk`K*H (X֛T{%)u$i'uUr0q.Ѳڕ@~ 'j+ $ IX%!dk#5Ǎxo8##^ E-;5\dφj P-/ KCōScک.7$gUڋa> #r\;!eKPtd[S.SX_JaѺkt=(XϿ4b%~C!r>Ij)I\F'Y68(By/濙PSr!@ĞKQ6NbQ lÈ>ɘ1-]p+>"NmZr\l<Κ\%qv&uz0n5RhFo.cFO5P̟Xy'|}Ӧ;9^ȭ8]JA#}NN;gbo\" Beo`,% X!T N,u̹(L>OXNKZ\6 D2Bw[vă;\[Tڠ"0yX+\37|<"|= /_y.N"]*T}H Zf!H!ntpʎמSڝZ5qہ8nTU6 >,!!ЙoM "~Z/xL_ S>-pf=kG:'VS]`7bY¥|u퐷{*QUXRn2Z.P'|˶4㝷HBT#[QfIzI]5mh.k<(*M4-P`q!ړn|E[ A,%3,fw@2f^H-=q' zuWF>sgRj>G\A! ºV.ɜ__H^Ͽ"/.䂒f $j#4xS23&%#(4-JGt_~3bksw2 _3FR>ժШ$B,hqb[F2J]& o\PEr["_tS91I6KK'԰2Q>Cr QO{b:UmG޾2g>N9~eOM\_a[#M= !C{?uV5>+цGԝ,zn]FYtJh˔I2HH}t.I"sFzhOH7.XE) !b\q,=l6a9ѯD[F<4`a=XEPk'yw{iA A@+n}G!TQϖcpy5oNZ#(b;TgY&#ߧ;P-|EE%{Y~9`!b AQY@o7:IsIvtm.Ҭ='TjypŚBtHm} LWT0FmTɡB >QJqӷȓ}sswOb_{rE\C:a P:k%$1`>2 N֍( $ 81վվ9S $3q:i@Rt?9$- מGx{Y| =TC rPDudP5Zo WY3Pj7 RlYRaMP|ON2\qm=}yO9*}> 3#+>%ۗcӬ_a⊶U{|șeeV$-ѵ_M~M%.B QmoÌ4 Hi}L.["8A>q纆#J/z h 1jʜA2&5PBU@b BC[lOh_jɚ9$wjFC!@p G!IeTneʃJ嶌B,7nw z'ojy5aw-˚(uEQa)0YFx h(GwƑ E0[NJ񼃖 S7-ZMP֋c.F8v@II  ' Ϙ2:hK33ߟV<oq]`2%z<7VK[Xo]C0L, Ays(K|so݆@Copz${Xg2Zcg˶WNk37X獴a2!-(;ML~xy:޳iKH`ɈW1i*&lYGL-Ws[6ˆ$Uc A0FAhJ:`A}boi}aIԝs@ Ia y/j*G4o$,58^<"aGhN[qɼsFyqu3d3B*V4mBu۽E*Wv£ά5FĮ}^(O mb4'A4&j,CQg?Ak|g<rG>:a kWeisYxi&4y#7!/p>*sѻsm НhF T>5 rЙ~fZ9yp.  ΋~}YҫDO_33ϻ˼c%N3}J$!Nos_]78~o[ÝJ֚2ZO^IQuBAB!$x"1\ugΧ4~[ UR>=l4 t0WPpQ1<gYW%y||'QbrD̈:/4"&2kALMZe2qR#|V2_q:RC)K]wjDջXR=Wk'6ך A*~ɂ(USCLnT2o;qdf_]Z:WLSvig z0l_7ĸ02ኟsw€X(ѯU?8ʺ=N8lTRlLj_)zH2 Pv}'* 4J^ !]>ZؠDt)5džܐLvYy$8 Qjߚ;(HIb=գga̓V9՞q ĤT!)ݠIsoMХX唯 -ɪ3\!4fRyuCS$w9HRC*QPMժD>cOE,Gg~rD؂\` ,CKbaq{M B.GiK!DUxOV#7+m_e3GsmI f!^+H`jE¢g}j|8>o^Z‘Bg ` b8r0NJVqb2"pYfB7d}y&ZvZR`mR'DLw 3aA>M!6Hm)1n(U])=ccS`i[U -ql {3 6*+ -C:~^RzpQ=SH精k=a"FC4(KK$&V 4B$0'ixBdb$KB~VU; `Wv#د aQPª "·:uPh[%OP C a')n\9=~G.ew\>wJ7g5˯Jɍń P^K3""F$Q*TWP󚜮Q}7FqҬ DM?OAGu ˂Kſz" H;؜gD=2[:Tfsab<d*|c'>;E @G_*e * W$~>𠍅TYCB'k22IxAPnm>c>WퟶwAys pVW\ ('Eza9 @H䒬 ]5k|`}#i("TLA'e?.Xjt q^_Pl%R*!lϠ ZwRhkIct?05tt\fSr՟RK$ e9Ih6U|Z`j[nk8i$ $ DJ t$gېYhЍ q?Ij.>TƆ6v8v9L J!ux{g ڰ"aR_^؋n0ѥ~4!") Q:0New3:F?9y !" #)z ~K&_PT % G;^}]@Ergv~2*8ƯN bAt0LoW𥃢8Y[h R|@4] y2jpB^AHm4:aՃ)UQ[nȣ`e`QDv.oY!*FF"Mq|ԒENr@GNLB~J>v7"m9ĥxeq)RIZWF5Ln!XWy9gqR,=}>ioВk:K-%zðṬj0Fd^#Ό c!2v0 vQ˳IwmB~Z=f.A:)Z\Uc٣lhn=7whϏ>Xھ+h&͖x+ט)bCu鵎|͞]Gjm3*aG/ZC0(Gpm'bZb+5KW+ƔA,$,OÉ[^r Md@@V)A:b 4QiC