sponge-0.3.1/0000755000175000017500000000000011244504477012612 5ustar gabrielgabrielsponge-0.3.1/Sponge.egg-info/0000755000175000017500000000000011244504415015527 5ustar gabrielgabrielsponge-0.3.1/Sponge.egg-info/entry_points.txt0000644000175000017500000000005011244504415021020 0ustar gabrielgabriel[console_scripts] bob = sponge.bob:run sponge-0.3.1/Sponge.egg-info/dependency_links.txt0000644000175000017500000000000111244504415021575 0ustar gabrielgabriel sponge-0.3.1/Sponge.egg-info/SOURCES.txt0000644000175000017500000000067611244504415017424 0ustar gabrielgabrielsetup.py Sponge.egg-info/PKG-INFO Sponge.egg-info/SOURCES.txt Sponge.egg-info/dependency_links.txt Sponge.egg-info/entry_points.txt Sponge.egg-info/top_level.txt sponge/__init__.py sponge/controller.py sponge/template.py sponge/bob/__init__.py sponge/contrib/__init__.py sponge/contrib/controllers.py sponge/core/__init__.py sponge/core/io.py sponge/data/__init__.py sponge/helpers/__init__.py sponge/helpers/image.py sponge/helpers/pagination.pysponge-0.3.1/Sponge.egg-info/top_level.txt0000644000175000017500000000000711244504415020256 0ustar gabrielgabrielsponge sponge-0.3.1/Sponge.egg-info/PKG-INFO0000644000175000017500000000045111244504415016624 0ustar gabrielgabrielMetadata-Version: 1.0 Name: Sponge Version: 0.3.0 Summary: A web framework aiming to get things dry, built on top of CherryPy and Genshi Home-page: http://sponge.gabrielfalcao.com Author: Gabriel Falcão Author-email: gabriel@nacaolivre.org License: UNKNOWN Description: UNKNOWN Platform: UNKNOWN sponge-0.3.1/sponge/0000755000175000017500000000000011244504415014075 5ustar gabrielgabrielsponge-0.3.1/sponge/__init__.pyc0000644000175000017500000000044411244504415016353 0ustar gabrielgabriel }Jc@s0dZddklZlZddklZdS(s0.3.1i(t Controllertroute(t render_htmlN(t __version__tsponge.controllerRRtsponge.templateR(((ssponge/__init__.pysssponge-0.3.1/sponge/__init__.py0000644000175000017500000000167611244504415016220 0ustar gabrielgabriel#!/usr/bin/env python # -*- coding: utf-8 -*- # # Copyright (C) 2009 Gabriel Falcão # Copyright (C) 2009 Bernardo Heynemann # # 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 . __version__ = '0.3.1' from sponge.controller import Controller, route from sponge.template import render_html sponge-0.3.1/sponge/core/0000755000175000017500000000000011244504415015025 5ustar gabrielgabrielsponge-0.3.1/sponge/core/__init__.py0000644000175000017500000002135411244504415017143 0ustar gabrielgabriel#!/usr/bin/env python # -*- coding: utf-8 -*- # # Copyright (C) 2009 Gabriel Falcão # Copyright (C) 2009 Bernardo Heynemann # # 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 . import os import re import sys import cherrypy from sponge.core.io import FileSystem, ClassLoader class InvalidValueError(Exception): pass class RequiredOptionError(Exception): pass class ConfigValidator(object): class AnyValue(object): def __init__(self, vartype): if not isinstance(vartype, type): raise TypeError, 'ConfigValidator.AnyValue takes a ' \ 'type as parameter, got %s' % repr(vartype) self.vartype = vartype mandatory = [ 'run-as', 'host', 'port', 'autoreload', 'application', ] possible = { 'run-as': ['standalone', 'wsgi'], 'host': r'^\d{1,3}[.]\d{1,3}[.]\d{1,3}[.]\d{1,3}$', 'port': r'^\d+$', 'autoreload': AnyValue(bool), 'application': { r'^[a-zA-Z_-][\w_-]*$': r'^[/].*$' }, 'static': { r'^[a-zA-Z/_-][\w_-]*$': r'^[/].*$' }, 'databases': { r'^[\w_-]+$': '^.+$' }, 'extra': AnyValue(dict) } def __init__(self, cdict): if not isinstance(cdict, dict): raise TypeError, 'ConfigValidator takes a dict as parameter, got None.' self.cdict = cdict def validate(self): self.validate_mandatory() def raise_invalid(self, option, value): raise InvalidValueError, 'Invalid value in "%s" ' \ 'option: "%s". Read the Sponge documentation ' \ 'for more information.' % (option, value) def validate_mandatory(self): keys = self.cdict.keys() for option in self.possible: if option in self.mandatory and \ option not in keys: raise RequiredOptionError, \ 'You get to set "%s" option within settings.yml' % option if option not in self.cdict.keys(): continue validator = self.possible[option] raw_value = self.cdict[option] value = unicode(raw_value) if isinstance(validator, list): if value not in validator: self.raise_invalid(option, value) if isinstance(validator, basestring): if not re.match(validator, value): self.raise_invalid(option, value) if isinstance(validator, self.AnyValue): if not isinstance(raw_value, validator.vartype): self.raise_invalid(option, value) if isinstance(validator, dict): if not isinstance(raw_value, dict): self.raise_invalid(option, value) self.validate_dict(option, validator, raw_value) return True def validate_dict(self, option, validator, dict_to_validate): for key_regex, value_regex in validator.items(): for key, value in dict_to_validate.items(): if isinstance(value, dict): self.validate_dict(key, validator, value) elif isinstance(value, basestring): if not re.match(key_regex, key): self.raise_invalid(option, key) if not re.match(value_regex, value): self.raise_invalid(key, value) else: self.raise_invalid(key, value) class SpongeConfig(object): fs = FileSystem() def __init__(self, config_dict, validator): if not isinstance(config_dict, dict): raise TypeError, 'SpongeConfig parameter 1 must be a dict, ' \ 'got %s.' % repr(config_dict) if not isinstance(validator, ConfigValidator): raise TypeError, 'SpongeConfig parameter 2 must be a ' \ 'ConfigValidator, got %s.' % repr(validator) self.d = config_dict self.validator = validator def set_setting(self, key, value): self.d[key] = value def setup_all(self, current_full_path): if not isinstance(current_full_path, basestring): raise TypeError, 'SpongeConfig.setup_all takes a string, ' \ 'got %s.' % repr(current_full_path) if not os.path.isabs(current_full_path): raise TypeError, 'SpongeConfig.setup_all takes a absolute ' \ 'path, got %s.' % current_full_path self.set_setting('server.socket_port', int(self.validator.cdict['port'])) self.set_setting('server.socket_host', self.validator.cdict['host']) self.set_setting('tools.sessions.on', True) self.set_setting('tools.sessions.timeout', 60) self.set_setting('tools.encode.on', True) self.set_setting('tools.encode.encoding', 'utf-8') self.set_setting('tools.trailing_slash.on', True) self.set_setting('sponge', self.validator.cdict) self.set_setting('sponge.root', self.fs.abspath(current_full_path)) if 'extra' in self.validator.cdict: self.set_setting('sponge.extra', self.validator.cdict['extra']) application = self.validator.cdict['application'] if 'boot' in application and isinstance(application['boot'], dict): path = application['boot']['path'] call = application['boot']['callable'] cloader = ClassLoader(path) function = getattr(cloader.get_module(), call) apply(function) template_dir = application['template-dir'] template_path = self.fs.join(current_full_path, template_dir) self.set_setting('template.dir', template_path) image_dir = application['image-dir'] image_path = self.fs.join(current_full_path, image_dir) self.set_setting('image.dir', image_path) adir = application['path'] application_path = self.fs.join(current_full_path, adir) cloader = ClassLoader(application_path) meta_conf = {} static = application.get('static') or {} for media_url, media_dir in static.items(): media_path = self.fs.join(current_full_path, media_dir) meta_conf[media_url] = { 'tools.staticdir.on': True, 'tools.staticdir.dir': media_path } classes = application.get('classes') or {} conf = meta_conf.copy() routed = False for classname, mountpoint in classes.items(): try: cls = cloader.load(classname) except Exception, e: format_str = classname, application_path, unicode(e) sys.stderr.write('\nSponge could not find the class %s ' \ 'at %s, verify if your settings.yml ' \ 'is configured as well\n%s\n' % (format_str)) raise SystemExit(1) fallback = lambda: cherrypy.tree.mount(root=cls(), config=conf, script_name=mountpoint) msg = '\nWARNING: The class %s has no routes\n' % cls.__name__ if not hasattr(cls, '__routes__'): sys.stderr.write(msg) fallback() continue if not isinstance(cls.__routes__, list): fallback() continue routed = True dispatcher = cherrypy.dispatch.RoutesDispatcher() for k, v in cls.__routes__: if k is None: k = "%s.%s" % (cls.__name__, v['method']) part1 = mountpoint.rstrip('/') part2 = v['route'].lstrip('/') new_route = "/".join([part1, part2]) dispatcher.connect(name=k, route=new_route, controller=cls(), action=v['method']) conf[mountpoint] = {'request.dispatch': dispatcher} if routed: cherrypy.tree.mount(root=None, config=conf) sponge-0.3.1/sponge/core/io.py0000644000175000017500000001251011244504415016005 0ustar gabrielgabriel#!/usr/bin/env python # -*- coding: utf-8 -*- # # Copyright (C) 2009 Gabriel Falcão # Copyright (C) 2009 Bernardo Heynemann # # 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 . import os import sys import codecs import fnmatch import zipfile from glob import glob from os.path import abspath, join, dirname, curdir, exists class FileSystem(object): stack = [] def __init__(self): self.stack = [] @classmethod def pushd(cls, path): if not len(cls.stack): cls.stack.append(cls.current_dir()) cls.stack.append(path) os.chdir(path) @classmethod def popd(cls): if cls.stack: cls.stack.pop() if cls.stack: os.chdir(cls.stack[-1]) @classmethod def filename(cls, path, with_extension=True): fname = os.path.split(path)[1] if not with_extension: fname = os.path.splitext(fname)[0] return fname @classmethod def exists(cls, path): return exists(path) @classmethod def mkdir(cls, path): try: os.makedirs(path) except OSError, e: # ignore if path already exists if e.errno not in (17, ): raise e else: if not os.path.isdir(path): # but the path must be a dir to ignore its creation raise e @classmethod def current_dir(cls, path=""): '''Returns the absolute path for current dir, also join the current path with the given, if so.''' to_return = cls.abspath(curdir) if path: return cls.join(to_return, path) return to_return @classmethod def abspath(cls, path): '''Returns the absolute path for the given path.''' return abspath(path) @classmethod def join(cls, *args): '''Returns the concatenated path for the given arguments.''' return join(*args) @classmethod def dirname(cls, path): '''Returns the directory name for the given file.''' return dirname(path) @classmethod def walk(cls, path): '''Walks through filesystem''' return os.walk(path) @classmethod def locate(cls, path, match, recursive=True): root_path = cls.abspath(path) if recursive: return_files = [] for path, dirs, files in cls.walk(root_path): for filename in fnmatch.filter(files, match): return_files.append(cls.join(path, filename)) return return_files else: return glob(cls.join(root_path, match)) @classmethod def extract_zip(cls, filename, base_path='.', verbose=False): base_path = cls.abspath(base_path) output = lambda x: verbose and sys.stdout.write("%s\n" % x) cls.pushd(base_path) zfile = zipfile.ZipFile(filename) output("Extracting files to %s" % base_path) for file_name in zfile.namelist(): try: output(" -> Unpacking %s" % file_name) f = cls.open_raw(file_name, 'w') f.write(zfile.read(file_name)) f.close() except IOError: output("---> Creating directory %s" % file_name) cls.mkdir(file_name) cls.popd() @classmethod def open(cls, name, mode): path = name if not os.path.isabs(path): path = cls.current_dir(name) return codecs.open(path, mode, 'utf-8') @classmethod def open_raw(cls, name, mode): path = name if not os.path.isabs(path): path = cls.current_dir(name) return open(path, mode) class ClassLoader(object): def __init__(self, path): if not isinstance(path, basestring): raise TypeError, 'ClassLoader takes a string ' \ 'as path parameter, got %s.' % repr(path) if not os.path.isdir(path): dir_name, file_name = os.path.split(path) module_name = os.path.splitext(file_name)[0] else: dir_name, module_name = os.path.split(path.rstrip('/')) sys.path.append(dir_name) try: self.module = __import__(module_name) except ImportError, e: raise ImportError, \ 'There is no module %s at %s. \nThe reason is: %s' % (module_name, dir_name, unicode(e)) sys.path.pop() def get_module(self): return self.module def load(self, classname): return getattr(self.module, classname) sponge-0.3.1/sponge/controller.py0000644000175000017500000000316511244504415016637 0ustar gabrielgabriel#!/usr/bin/env python # -*- coding: utf-8 -*- # # Copyright (C) 2009 Gabriel Falcão # Copyright (C) 2009 Bernardo Heynemann # # 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 . import re import cherrypy def route(route, name=None): def dec(func): conf = ( name, { 'route': route, 'method': func.__name__ } ) return func, conf return dec class MetaController(type): def __init__(cls, name, bases, attrs): if name not in ('MetaController', 'Controller'): cls.__routes__ = [] for attr, value in attrs.items(): if isinstance(value, tuple) and len(value) is 2: method, conf = value setattr(cls, attr, method) cls.__routes__.append(conf) super(MetaController, cls).__init__(name, bases, attrs) class Controller(object): __metaclass__ = MetaController __routes__ = None sponge-0.3.1/sponge/contrib/0000755000175000017500000000000011244504415015535 5ustar gabrielgabrielsponge-0.3.1/sponge/contrib/controllers.py0000644000175000017500000000570711244504415020466 0ustar gabrielgabriel#!/usr/bin/env python # -*- coding: utf-8 -*- # # Copyright (C) 2009 Gabriel Falcão # Copyright (C) 2009 Bernardo Heynemann # # 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 . import re import cherrypy from cherrypy.lib import static from sponge.core.io import FileSystem from sponge.helpers.image import jpeg, picture class InvalidCachePath(IOError): pass class ImageHandler(object): exposed = True should_cache = False cache_path = None fs = FileSystem() def __init__(self, cache_at=None): if not isinstance(cache_at, (basestring, type(None))): raise TypeError, 'The path given to ImageHandler ' \ 'to cache must be a string, got %s' % repr(cache_at) if cache_at: self.should_cache =True self.cache_path = cache_at if not self.fs.exists(cache_at): raise InvalidCachePath, \ 'The given path (%s) does not exist, ' \ 'so that ImageHandler can not save ' \ 'cache files there.' % cache_at def get_cache_path(self, path): return self.fs.join(self.cache_path, path.lstrip('/')) def __call__(self, *args, **kw): if len(args) < 1: cherrypy.response.status = 404 return "not found" path = "/".join(args) image = jpeg(path=path) cache_full_path = None if self.should_cache: cache_full_path = self.get_cache_path(path) if self.fs.exists(cache_full_path): return static.serve_file(cache_full_path, 'image/jpeg') if len(args) >= 3 and args[0] == 'crop': proportion = re.match(r'(?P\d+)x(?P\d+)', args[1]) if proportion: width = int(proportion.group('width')) height = int(proportion.group('height')) image = picture(path="/".join(args[2:]), width=width, height=height) if self.should_cache: dir_path = self.fs.dirname(cache_full_path) self.fs.mkdir(dir_path) img_file = self.fs.open_raw(cache_full_path, 'w') img_file.write(image) img_file.close() return image sponge-0.3.1/sponge/contrib/__init__.py0000644000175000017500000000000011244504415017634 0ustar gabrielgabrielsponge-0.3.1/sponge/template.pyc0000644000175000017500000000360411244504415016430 0ustar gabrielgabriel `Jc@s8ddkZddklZdZdddZdS(iN(tTemplateLoadercCszt|tptd|n|ido|d}ntii}|ido|d }nd||fS(Ns9sponge.template.make_url takes a string as param, got %r.t/iis%s/%s(t isinstancet basestringt TypeErrort startswithtcherrypytrequesttbasetendswith(turlR((ssponge/template.pytmake_urls cCs^|djo h}nt|tptd|nt|ptdnt|tptd|nd|ijodt}t|n|djo7yt i d}Wqtj ot dqXn%t|tptd|nt|ds  sponge-0.3.1/sponge/controller.pyc0000644000175000017500000000262311244504415017000 0ustar gabrielgabriel `Jc@sTddkZddkZddZdefdYZdefdYZdS(iNcsfd}|S(Ncs+hd<|ids    sponge-0.3.1/sponge/data/0000755000175000017500000000000011244504415015006 5ustar gabrielgabrielsponge-0.3.1/sponge/data/__init__.py0000644000175000017500000000202011244504415017111 0ustar gabrielgabriel#!/usr/bin/env python # -*- coding: utf-8; -*- # # Copyright (C) 2009 Gabriel Falcão # # 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 2 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, write to the # Free Software Foundation, Inc., 59 Temple Place - Suite 330, # Boston, MA 02111-1307, USA. from sponge.core.io import FileSystem class SpongeData(object): fs = FileSystem() @classmethod def get_file(cls, name): this_path = cls.fs.dirname(__file__) return cls.fs.join(this_path, name) sponge-0.3.1/sponge/data/project.zip0000644000175000017500000040051611244504415017206 0ustar gabrielgabrielPK D;app/UT ZLJLJux PKD;ɂ1o!app/controllers.pyUT PLJZLJux SM0W .Fv=P um%&l)Ֆod)Hr!WwIzoi@6L%DP"`-BjȶT )*ȉ(tz^WR0F5՞Oq2?үx[8!0[\vn9v˥G"rWƧ%B3B)'_:t~L 0._ !+gf91yh,難 ?9ʉqse(3y_?j~lwY-%:v%7'Ĥ=MxN PvOQV&u`8bL W mڄ EF{Jj5U4TZon Tגi Eɽ pG}FX(7 ,C`+]3N cQPw핼BUz ֦}&u e05Q2y?0D-#VV+- XkHd?06[Kz=|rg >GGI#$ӥhŒ{]c-p[-q?PKD;4%papp/controllers.pycUT ZLJZLJux UQoE=ı۔NA?$+"DJ u_NW&|knH#;g曳/Hzgvfo&nx -?|ˏ͈ޣLX\GYƵREir]:뤦D~ /Y}?Y6MlAIkiN>+J/DDl*mq_vo:v\:/9sKw&w2]9=_dlh!tu{וΫ~g$Z8q7 YI$7ęgibNYuc􃝎ݹrPnB*(b_ ޲t\kNKN ћ]ԟydϵbv&!O<^ t9 \yt(dw5:]#S:E rk&]qσQLb =Ѥή|rt.\߸H,7R̜VoOG߿_.Ņ [H̺moϖ( pNMf/ú dGWϣ.bVgǥsm25qQI.6S3׽}Lۙ3ޱ1xM*'xv]T `2Zc*)EuI'D$g!:!|QklZH}?/tȒ`rmkh } J!h ï?L㭨ܮ $8ڦ)S^0c,R˗?e` ]ɵ]&, cbL |4Mu0F\Kϭb{}8D[{df %>p2>f-uhuZNjgVmH6@S*D8w86'"R`{7[*M8u/#en.)Moc~6la$UHp}S _ c ,­ Gt: M{l;_@>:K=O]@W"g 9XܐhWbEBꄣ$ݨB^$'LNg,jf5dQQѴb V)&5g /ex 2]6' Ӻ<'S|y U-$%`RthpӒ /*"AeBJLzJH4_B/=ӌIZGoٖ]~lvmKyuR 8O[ a׮Coin)Z"ԕ(0teiз ,.C"6p03KAuOq,D0dW၅,X@YJty ruTajS]K9ޥ˃xOղ"{z3v˥fIZhl˹1_#k8P6xȆj6S`ffT`SŒ@cIof 37ܱLS lS/ _zUS@7% 39޼4?)*>SrKe W } Of9poJj]VQū Nc9ڨy^N+ l] W8P.dgs`@gg.iuַHU@k mke '_mLW˸ޘ ymGȔ ?w]:w\U!\+kdB ؅Z&@C*pdZS 1i ]dS)9AMe9/G[6G&h#sъaLnjsKK(&mA]ЌV0`Viw:^YV.S]oϦrŗ,ۺKB ٔMi k2/LU*g=f;#JJ2^ZKs: &3;/Q-JGG%+<z¡NrdkmD pn i׶x4T+XEo:ҦH&S$j,|,}_ݶ f8Ds ]:5[p/%^`]t4i|jգGF[Bm~OCiWǘ?^(AЭs\* 'we'<6 D9 j<Hhv=M,2Rfz741n_{QbW=C@jL#%b,<>Uw~XM%&%!;~+&-#^/=hIAYD]$ YRi\3mfd xlf_)K eN, 厩*F˶r]$W6U/{Gl<dNlJfLœ:H:>"PD-)aĵM],3ofn{PfܲV1?E=jx1FEݐ*,)=4Vuw 8*f_z  rs]W/*Y{08wh!sd*wg_bR~*Y(@(fw 3j$"i >kr_SׯӯJns.~^٨34%ʪaV[_:O߿Z,^j;S@41$i%m/ ƀ!R|CPo?s96LvF${%GXB=OۘaQ5Ǎ Gt >""a'2yx֛69L͏@cA +L+!#u.=lBO-497&ccEǓ#E b`?I 'f;b9 xGO P$ͤԚCc+-ugѧ Jؽ ȵXE a,$cT5ٚbpK}H0m23uMއ̥ޭ. }W+3x`T܀֞j(~0cC T8ʨŗۍ5.~yY5RkFXOw$;pټh&>ќ0|4r'#hǨ݆$ӌF ]~΅#(8{H\rwaceU8L5aug"%) uk0A<Ϫ2i[xB!zIKyoTqfb$Zj6%j^ 1 f=F]KEjʎrf4i9Cwťr-zصEqR[ $an3&l+Y rd\Qi+?vl~a+Pl 1Սcvb@/Bl3?[je,NeZGi(׵YHH~<$srO# :n'8|ߨ~o~'":~ȍanLa{iҮaHw6fP =A1aHrkh7CrJ\L7\KbTzb4-l%$ߔtw3!;c ]L#}Y!ΑѢɩᾙ!6վBhU\&En=TQ Z)H'(3ZȱGӼ@RQAv_ԒEs߄=|37*֛Su;bcxhK\hx-za {sH?' jj{qN)M *x =̽-}pD4/4h D[{NdG$cKr( H5sCv*+ʊ`$'#4&םq|hx-sei3~ac!x+4phoQ%E$lF.a :l`ʙ$:-\x&b$|AЗ4hui2>m,7ke>{m%UK BMtB~']iP-vICkdSkz sb9Q 9QI$"??t(p7ThUOW4s6J\YD b(P3t#C?ڢ^Gw+(3z{JY?OHmԹ[>(hEu棳礉ډ%ϰTE/Zi]?X>]k]'$|j9aM Kߟ\<Ϣ{Ѓ7/-PLOI4}pt_P_07b \_iݠ`{&NdhՃnH#=)֧]aP,72:g`AL &yB=Š3JBB*3Y1 oC`P$+Յlu0 35`j?%q#1sS}>mmƮ ~~0BF^L9(3Q57tV'拊*LP8:!F\*ܮhkFKK0ҡ,ۅ|O3nezQ-ZdYK1 8 ۞LA.O*f!:*'꾳e4v}k_ s??ݚo!iU&Sk(ƗV__zZ(1i߁0sۡV*7 3ۯK)v J <^c6T:.6\C'599"p._OdΕh8dW?ˉkv p8 {B%U<~8i3 ʗgfyDlʗ2S.>#JŇ*c6 dC,~yht<+kcG$$HL,;qbqt, ,+, C05pdR¼tj0h'CI6?#N.*W;A'(OT/&\/ɯ/7SGEV2r4>?Sޠ|gB aڛB+;˦E6Cu5XPYԲnSdy-0aND/tc9A] b&?7??϶~cΘx}ГjK7z}ԬKyT*-~/ʮޓUQ7q#'SN/-,H ^ hl iO:۪%ı6X;l\czy|+"BcBoFF-n*怦O<[O,N'KeOYPVM3vS݀F}3PE#Y)n!0J/!0&Hh?oo^ a0d (L$4yRs=hcɩP l0qgͭ,ٌ׈L|=eUa1eZ p{1ӝ$R|D9[Him2I/q>Xc'暵X[0GS3.]LE /[n/J v.~[̒~6ƨy8/g8zZ9uID1r}-.+^ \ϱNDM0sI5;WIl//}Taf~em%oֿi3$YS'XZZ֏ι^%erQt7-Uƽx΂KL77kZXSV.èC D*Ҫ1Mp /~["}Vf6ԫrC|Po e5WOgĔI j7޿;|V~2+dk/x:p{:}k*uu:j7='*eϾ Chv&㤺?zjs=9ae:Ļh8{PLp&@ÂW@^DCg nya7JKDP.CXXZ+<s;HPM,g.$_ lxP "⓬aOEe;T-ҳq *2)ۆնJlsK_~x٥Mj>&u\%$3ӁkG;˕s#azH1+̖أū.&aȃխb(f$wfTH>ID,zEEoʈ`]R)5[]SV_&[u5Pjw/w>`0ZoƴdKSQYy& 4LN'uyx'W+|+jeK%ڔmwBmf!$ovVҚ6"Zh^aOف 7PKD;n-media/img/sponge.pngUT PLJPLJux 4xdM6db۞ض9mĶm۶m?9o_Iz7jժUkw<  "p`; *z (( xxApX"_'W WWW:sKG#;:[<8@@@2/$^$Ȯ @P6X[;.@"iiMZVX"-慭/cjI*ϛ²[߸GoZ{R`=b>>tq AM 2E%2ɩh`F{:xZD|\=[;6ԡV7>c_|_22AA{ow!"9{X|qMLPCskA;:t]~|%$߽>qeUM&Ш"|OS+Q wBG Ō#T1@[S5}12+ٍzˇ7LLJzJ_6ZhϦ{A\\|` w=-Jw"TbуE LMDۙ'lt_+6VDI,;7i$yOUHoZ7Ӟ]/ם#{TU ǻf2R"z,f =aRj=app>'P??;P[ bcöYN|yӢ+sf౽XPWlM2I-#'f5x Bg(ڲatcsKLYlj]^=PFx/Z|s}j#BW1&+1Lh׷2؍uz]J%nb?+s{>Wt{aee Jh<3/S"Ž;#%%##pYj! ,sF?kӮFn|B V*Z5%;3'rw.X=lokq^M5pӫe$m"mo?5?f<ՁF k=/=v,]416#GuؑX>5:D38(о9oV.^k |~ȹ{?0 t17n ?h/`OH/YFp&9K`ӪaQӪ+,?D=qOజ]r$\ jIa;[G7]`"`^ rŝ,0=p,zxghӌGn 5+Irב Wl՟NJM0㘩M |e×jJ}gY;&FG4%F*ۦ\s<5n!k1|n2v>8W: z:sEvnLX-TPJӹ VZ( 5C!6V*QMC" z@V7I5ol{؞䇊xoHedG6B-&f4A@nj (- 1Uc\sf4 uV/e`[2ډb ҌOtyrhaIFTacoq4]gdU 521ĕ4$e24S+]* G/j) ٽeR?PQ@y8⡭'zNh(S*) 1xڡyWaP}J 2-Ä1_$sD zj ^HN䗥(F}b "Ïy49"u!H89AU>1vUM"fnJ 8߃~֜I{ζm=x sG%ɹ.!C~5Շ}Rh {i~1cG%=D4x}^g!K,"!C=._SIh{b':I& m==xܺrؑezt WZ"z:+u|/e/Z𖯕?"*lY%8V9 J0mײ}:qV0B:7T/C\h݇@]Bծ>V<8;+TTWh@/08q?jn6/:L~/::4M)دy]\9G!*SXj#ߐso?a0˨G L nv!z@[xBZ=w%nH _1V B C}@`8@`^&qc'YKͬlS+SbHpf6dyg+nEd§l^z]|j :o8E&6 -+@V/5&;ld!LܑkfUum|٥z@3ȲZo`f x? z,W%!:vz 6*BLJsZ%,z?ŎOWG$^ȂpXNjxPъݎ/v=xܘ`09P?y?18аDe){,{}ſ<}LgW`RȪo%4%C'am*gpJXK@IwB\=V|joyv'Xa҂FF˪鱝rH77\xD:45s _(w  E$u.|(_KWpuJѪq%71,Q./i2c/r! +ˡ2+8!'X,Q|RW"e{31~$qC R%CE28T) zȳ n ZXwl-cDSA 1h%yz}7y XM57hS+   2E 8ҍWO]PܯFmm!ܠt,zH]nj2R+Qfm;ܮ 'U+ Ep_Ln FHC{\̈,'$)*V;rPVשOz. {^j /!p> ! S.o2Ujij) R_Hq|p< 1QH7ZaGRՊF˪mAC]#@C!xO܅y{p.|I΃td< iIXsp>X5kC bNR:<:L blwӟ)KE+'7o:bk p_ICղAdv+m]/Ez,H ZV MR]2`04 3n?%xvLAW,ԤE_K e[_U'W7M> J'A܄7!o4t|ud4;n&ݏl:=?RX검h5uV2g^†_\>|X)3m&OWgބdI\s ] )D>\$0F 4xrGz9l.lb |ؓWεP۞p'VG"(?Լ((jGZ|> uhH @Nlqx*uJ7g>{?:r#~պQb靖`$Z=M= QA23>+'|v$sv  ]넀$9b:҈ozXSŊ#duq@y Ö'8* 4˄]LӿCkq װߐHV6ڰA5jD!F˿IsE`U>!mv e!3AC q*B؅TJ(,E,@mjܞM=xhXͰ.|y2Vq:hZZ!;UՊ'~l6X3"WҒh!4V7"c9}j*g܏yYH+3b/0}r|I@ņ Ocfm|wF)x`H(hk4[ C~)itL 6rxQPBgfV1۱j#{zz~]QW2/ 4 4@j%T4֏JEF:.q${n@/1]܅hLhL-]1xB< UQ 005V6ozX]f4`h FU@q5@TI̫< ,?V_8(:r6̂_q1L)euljKH:{ 4@Lf(WOQH3ӛw?տaF ++% v7F[q0LQRbG`^#e~k`ףYc{7Z!/N.)Eٶ+=1')@h_Fês5LV)z&_"\OTtCv55ָNk @B|8^8, 11nzz'ѽFŪ$|StT[t#_dY@d35# ݉a-Idc4L0g4D\J=ÿW Po<,O`Ŵ)ߕߧ{䲦2ֵ(gGg\\9:;{?A.*&蝌bnH1MhzAwE#Gs-[] 521 o<ӞUT(5OUsOL+EA'_3R* %|Fh+TT&Y눙ُqC6|;ߤB8=Qkԓ ޕ0G*6 5VO` 4,9% t$"ΑщOšJ۟?*:E 7g qX؆[Ų<FdSuzr^ygX0~P Kc掶J?@fiף'#:3s~w[2d[b~F×tRLo:D2RCeƵ '=hb:A2F*Uְ%.6 )%W@;}鴮ߍv4_'\}(t+;ie~F)>K[>%+u|(qӅ?}а5Wjvv0u饉mũ^M.3NcIp${.|4ޞHW>>*ͮ-3:WxVő=YWXXTY9j5],l f3S"3B6rߏA'ȩhV07?0L42 n`{;ػ: VbO\YE24L 8n%ۍ4{ hE|--1xn?TDg~6q=yj) (#qo(uD=[.uh>ۚt%FU,5@c/TGF7psT^eBWMY$FċGӽe{s_jjnn\_XXi^^[JT7;:խC(P$20 oIT{@&4 eSIoXvu&z4:ntP.BA8!cbŰo/]䙹4 ED+̩ٺ_j@ J( 84Ct|g3G>Bć~;kuΥJze:_FL=^?[B@%S2(8[׼f ̈XCs sUI[1,7[ n:߬jlo"<待x\GVf[%ƆAt?4\N fo5'4 fs%{(crhfnwh'0/r@4%[i1 u#۫H;\kb]W/^6~;O ecD w$YV.NoT%EX:uM Zljb;P3pw”ԝ (/@WyC\A]bd-?nZ`'!}Z W288qvyj%A5i# =qɿݸrG O~ϼd#G16༝AKMK>ѷBEI{( eF;"Ma!B}k2IC&xݫmY"" BdJs2M#s}5[z@:DZ+K玮$1÷qq8*{@DN6hfk٣>2#bus&Q8JY}CK8],1H/QHe\A39FQ z+cpd2D;qiFik9Cg.>rݍ^ gS鞤M}w' K_G7w7z<@j'XH}_!CuEոD01 SQ4d{(ǖ{yH`0%zz傋5LaL&p6m`)ºAŸ)™V{]'RՁH# Fʑ3#edUz YOQ82IJzx=(>z%:M^ \`Sdc:*[aѠgW*|HH_nHC?Ɲ'iguQaZ5&bH`J4HY܂{>BrM Z@]5SMnD.S>]gA_\Qx(`j (%لVC"+z ~Oݼ]#f`mU])n56 gv4܏]N2| _wiuD:>K40IR'dyf+h`fJ[LIUXB晟e?DЗ ~h)ƛ!!VdbynH;B4E..5sbu\N\=^3 ǀ+0#oo%gB}6關Tԛc,/ۛm7Kp%,bW5>ؿ_vr=ADa0 SI?߃f{='KSCwӆ{ C'lі$؛|QM q>tFד%W}C>\Xx8j_iw5:ؒ0L1i(r$ -ĘNv ^ %3C8%~kD&ne/+B0Vj#/NqaHx(Φdl7$PS"@ kQxͬnd G,d*VIڋ9Nټ;YMʪ{"ˏJC[W~/~؄?zj AQ+fCDR~ߠ};xE() a"_M7` \eFϓ .؜Q1OVx=?9Uioq4[E,ʲ/}_H=Z%|#.$H`od?4 /:ht0,~R2AXn _=V}`~^޾i8x}`тIhNVo_UbQfޟ>ޒQ\Tm?Q)L2?l6LƏ-IL1?uH[ TU:Z ("u Qk~ s6%W.ȉwݡ}<b>[JXqJj<.{\sB(")? }yw:eKk I?dG-CcD  7T <ʺҕ$`~|i3#b+Cz'}mk2ԪC9$abG% /`m$u?^X|>S ɣQŮT+P@B$?2'o3011ŤPXZ™SoZ =!a-lP-Tuȧ zsPPL[MeƟ{&b>`}l8#jmvDfo钞yQB=6m֝YSkBoM om%~@߰'mH)Q Gq\[_6i>| Y7+eZ Nh|Zv&/e_r\MfxxؠF]6 pP@~o?ȡw0F[<*f[PH2q{6Gqf ,FWM5:x_,i(L0:I|pp>{ gӷAgN@fЊ]@Bߋ0*WBO5˨F+U&1mwB]t_KoVFBIoonbm7SQ h3ߐ`=0x~atSK&DCN_rZܔ  r"y&RACP-oZQx+&N u+YncF֣jwUtCQ:hB:,8RC372KjyXQ 75霳;!Hl7˹qxQ!mT޷Q^5|Q.V`,J=(ٲ&ߙ#(  $l,%EϿ|٫z"W5(p>ƃjU,==?JU&+uހidžphw/X ΃'MǑ2_jT_PCݫT`aX[. j~H:I54 GbO}z]z]2C? ܷ'̦|@xn&aG+M-F6Z :x8뼌Xh)u@$ç %HCn[TYBX @W|UU[^Ѽ96F&NLDxǔzgaWRyjAC=r_JeKIFod TeeeKd:EK㠮w|C~*_݅s_SRk{zA9tR`.#+Ta>gr$HJB,=WI lqt "32 Vpjm ^<h3t`em)١=_ipB,`%d=YvᲺE1wVOZ+j`\cHE$OA#t/}1~TЀЪVHۿ"$Pť&Y{1&~7JF[ q"-A5{N\Cu% [2 L6`sOi2{k`P%jki9R#@xiKOڟx48|Md_xl^E7U95!5}LH- IƭTa#P23{dx~dpD<47`2?!<R!KmtʄJ/KҶ<i_xmCr)H`4M BJt`g4]?/ Ə$P0ƫz ~F4"`fGc9A>Z+& 0ӃC~{-3[r/ywsuQBkhfz?>g"h0D9wK" qxmkk#^HNNKWLL/k;&F_^`Nx3v0 ka ݺxu~em\mqL y*mG2s8ڄ]z0 ](##?KW0= AsXzHJTO|A\KKM^W$(P@ʏV;g>'69L8b^oH4 ;]['fүNr]fd wxT h~!5* ڝ#D 56N'V'A޶!k{.߅?`Iyj" U \ZZ69t/EṰCg$czFF,}r贪Uv6%lRVu1|bOyH'tc<&U` c [Ipx@Pgq0a jPp5 ^FM%|K;^BUϩ)TU|'r(Sa<(BZmK$ ޻?0~c~ i( ;nnD4&sFzA [K)]l:Ģqq@Sͫg`+vv9Y솅@z޿inɾAL fbe_F%\ll RьBlJwMپQqhfaz!»qi'|*-KI܀Bݥ`'t>9:&UNQCtnP-a%p|,:DxӃ?Ԭ +~1InB A8rFr==^x/a/X2RJsגUup/pȠs#Ϥ~MR榵F_kk@%-=>'͞gUԋ FV8R (^N{%9ud*Da,s8z&:4hEǞ E#((_xVr+46`;  o-WOeI'gW9_XdL#2⋾;;I|_KA;!-}bpC:3S{d67jO ?k HW 55EYb-*+(.11@+9lẁ\Q}K;)ja~Eԯ x;5X, 4tSU;5'7m0h^KtNg9[iU+Agv{\\۝gz>Z)C΀/%jVۮ % ,얯*iE[ɕJ6Bꢌ *bQ*9u"2x1!8~׿}+浚}S _ 3[Ycxr2}7>y\\}1T \ғs`Ȧjd\j:ʍ| Q_~ '_d%R_Z,Pa|ZHv AEjbx8“jPѤiABƪ=O1qw7?i 7RlwH| tDK=Mx@ V1V\ܗx>mPiv\D*3W2X 1'z8zUbSPY+ 3,BߦP)43nKq궿*Zϻlh3 .岬mB|k JǩH˄9~BG *[=U{3')5b\έԜĊ.@2[L'bݘ>nL{5ۅE]&NXPW Sg]V7ř{SP32wVյ 3[,$ipNgi|.I⋃^ '?Ŝ@:]l[fmDrʢC.Q%(p<'j ^}H5I+!ruy\,/RT-VF6@qA31aPdEwbyM̆Ht6˨v9r0;}xt:Nx5;="OM\ObL;T[ ؘ @M_88݃%<Ąҕ\GwNNns $xRG`Ǽ/O矬uVQ%2qwvg)pXx?^ ~+]‹j?{w3%;ZUAWia)nvl'"k HV*;P#ONcśH̨gG/@s]7*)O6-Vtd!.? G";!m0 Fus> 3IE(pXZԈ t$(JomQ.IZkC`I֓E讎CW@28/qhI9fif:qj"phSspVK?O{3,^(.LF5r׹!,pPfiG^CL[/ó;}@91" #żB)HE+^4L5  {oݾ:#/uZOb>]y#l/B^peNϞ"ɧ@zbNpzݸ,NAQQY r,vEB7_U~"Q,#R tYF  )c?n-PM}^g!uG|>H6 4,SJ/Fg>*'\]8oGec@Jnj*;ŃΉZeY fecP jȜ@kt8 [UZ4M0< slռL2(Zw:i\FP2zG* zh#5Cr/r6| g#-s X r~2f%黶r@{܏!,aEuG=o#޳~M$katSdg>U | L-GYId"=[LTP5u>27UJR6:ncaF]yzG gBsF+C Om RW9{]zwZ"#Ajw3$JJk>K+M)C]60< '֜ljƃ'կ!OFUs~)j9@-c}f QL%ލوo:n"a@z> #wDK!{yêdn"A>{9Kd;fts u&pH$4=;U6j! E`% `` ւ 7|)OO]1J|9ƽP_x}etaMb&gpCwn]Y՘mAzΞAܸ5λ9V#+YC6ۙ+*ڄhMiAOUAc`yNTCWپA#Q&;1({6N&b3e[Y 5DML(#jk $y0 B/bN5|h+=,n9NrowԳHAm\C%Nswvo? uC!eBc`Cd q$C:TY[;l.4ж$1ӧq@j[yf]䗞!j<.F6itig2q4EQC iW&uIHpWZ_U߇}*m\ǵNlz:cS>vYP+Rix7\*΢ia+0 E*8H+A @6ki8%"ⶸ9x氿D] 4As:9+ԫ~EQ)^)Lg"neSH"=pO20!Vc$ B'#"qв\LE= q; Ψ+k B"[>- ` Z82I\K- L.xCKnaԂ$PPP833ߢ$-u>Y*psՁk: &=J>z=O=/5z"*AYv.uk׷z@>G=抄nj paWZfx40co鼋$O@?<9!JlpLvtuyz.K:l7[-w?E 9f}QjB!}xnF%N  YL򸬈 WDZExG,y^|X̋HA^!cB}H5_S~Ab\Ra %'ƿi$,qf1*^YzF篭 /7As!@*W8H" Ƃ%V w ^1,(,N؆z!Q/ A#T8ST!#r=ʓ嚱F\2)hSo.%jW8Q? B+pI+xR2ȖG=]樂 $syUkC!-R]":uKBp3i0,tFg\ D!hxC=Ӆ_G<]xwTP"e-v4?: x*YoGr? ykl0 |o|>u|>hB322F??~?r3$LDhp X Ȧ'?q4D$`$5 iG?=xja]a8_t/0wwA}7zG["1m~]J߫Lz?@ d1;Y{m6j] iZUHd^8FqψaV]h ꝝ1)BJfbLO6x5^T}rCL\4S 6ןʪ"JOSlPNiNBAe<-V\i39T쭲꧂D01cǫΕΩѤ0 Wfd ¡bq%/r`FMu;W|P.66N{̩v[۾|2Ouyk|}!.U_ Նᾓ[=T)i)W~ȇ_y0He4zm 1%Ķ-b-b;=53y==a?δRiq&(YmLR)vvQpvf֔ &w}ucD9m;g aE3q7똬+񹝴G=I>^VZXVG)tC|hüK% @~yPO/;Kߌ L&Ȃx~(x!ڻ43yY,?ܳV7 "/OHXmZQI/P%6yՄci2X̦ojUsȈƚH\eɔZR{%_6k\]IПv JA@ 2__>_l|J=s-ݫ?MvUMѾ(s&ߞ?ɫ{(ZRQG׆daz (WD<;\}&nKڶߒ˃0~ZH} wh3ˎ{BDjcBÂd*T"_!`= "UJexo" ` |ecظr :-G{- aa puħOXjFqw1@jS0n"FGwKg&cjM\Wg`}BM0_q`;mCσ '\<䵢X&gV֏zl5yGp]4n\w__p<}]|qͺ0τ a}wi)xR*| zaA?R% P V-![Šwwj =j>ԣWtyv{fM3K&,$$2[GRӇ%Iω__W ؏Z9Kް4cSҷ. KsڏI)5䩔Yl'բh+.p,ZYcrK=U tx-obһ1BR<`{q?~ զ<)?(A:%5(xb¢d(Lttn{GWs:JvjYB˛{B`8kDڀAEQx{zQy&͝s*"ŃVI3v{{,_WjͮQ7_ttuzKږ')WReJw^C{J5,U_ܞ˕<+Las-AEn%8pXP9<(ymxw/ar/B;yUMv®8씑3+cc)Ah[7hhA'VBv#(oƣ~# o>In~ZFZ8< +oCw~d\jtuhGH OI%,X2pi:rT翘Zw֤^݁9$łfCܯq]hd sv&{8Nkow'çpk>_&0"OԢͅ]Q-TY{XʗJ.Af(PYL_^UA|~$c/ ؝Z~ +&}I,V8}vb O9gMf׺M$KJHJ 8$Q߈ Iͧ/9~Ve| VYk'"/@-n_-I?b}`d$ʍlYgn:EMK`T$)jNnzF !@~w:KK6lj.c|+I5]t|H&)S6 -X38o?ʊ*S' %\?Z/Atf'D s|G\)Lq$ Jd~SetZߘͷ%$8jlNœz.pvIk:)lE_ӡJ Ul ?%L+zAGs^~fQ23dKEk0Y0),`%lr>Ie~zZU7e)[*g[&~-&6ڶT=veXB@W]BrW[ &$IŃLnf AuW2:ݼg^pYʡL>ᩐmPl4 :Cޛ>oMKIx\ dRd:-64LO^ڇ!cV%c,Tw¨ ScԢAr|ZIg2&&moN5_d B7&*` Ѽ.;(#=3lQ_|GO ϗӕ顧mdō%:_ tZZdR D{k:8l3>I~Y~v{l"3 :bu*iMZBX SWp/PJY GhE%Q:f{q+ dޓ9I{u2YQp1)M Qkuqj"I\0ѩ72%&uUv3 I,7"ݱ:suf{l\(s{ve밧!Z{Ht?w䖈T=y 퉛)mNZkU ΟJZO-ŵcݳ%t< 1 >pSV=;fL, &Uݕ^敁'LlFcx N&ZɏG ID7M-x뙪g[>oB2ɣ'_^3IT<l(ɏ/Pq# o6PGU MSh^ Ow{ll(r nuK4B|ذEad$h>Pjz&+1[F0X+{;1CJȄgg@ȵ-Miɾl,Oן|O~,=\Ѯ;}b=a{{K{iņEWts y ?vܟ:ȀvտKH[= e#_^]c釘ll.5z}Z[ja؛Wr ~m&.$&% ;S$ZS1K[OHNjK'hN;7-3ÃJ8:vm [@ m M`AAM hh%Ԏ79ݑ|W/R7 wb}IKm2pO*A3HG\vkѹ2m<_Kx3Vn}X n#Y"9c[SVl.\; gʻ5!Xذ="ʸ5GD%yK] #_\5FGj|'x]5TIgTUkhRsކR// -5F{D1[IecmU=>[j RRc|ݏn jyB2޷fdj[Փ< yU Z#4NՏό[+D"጗*jxXwJQq}P"]S%bԋ)µ%LSŻm~C`yF֖ܔ;_-r1̟HOvd3sԫԖ6 DzÞ}ye(M_v2`\ 邉:-:SaG ѺIb9LXcm)&=^|`MdH]ƌWWz^^_ZEk\Ud3?w Zæ鑨=?5xUTK ȏbs]g:bdDU̿A!I" @ B`J&h'wk9>}q4FaTDFҭw&bAz"7}];I/}e(x*(/31ơbZ =WvN*l$47>َҮ%?;ͪzO=9'!/~4Iĺ6tL7)<<ρ*H& rۨ5ڟJeIJ[B*^XO^&?`D L*FVpm2MEleŃjdzI\85Iuᑞ$84 P t=R7rXfBE̫Mͺup9{S5#)gүD˫|I,[]E-}g%D-#z)'Лz΢(SEYGj-|uUyy af*>#o@CUPp08}@%!Cfory"ħ %5iM48)j Pj#!WO(D:LTI7YSYΖ3QQIh#<%~w5*mgr`h&c'N}R;}PLRZ+VUSIA )z7XpJƌ_#)Ob"6ZtMlɱq}ټ죀R~dհ'%G|u}|#.RԙKU+OhH8p]\BEDcdy{i} ['svNl\XN+`oj).ْJkh);D*C#rEѝ62Fy;ޡi-^a{*_AAB:1:4eUjv:rN:JՀIo/gTFC]p#+<u+uZbK/@u| wKKn:~n3 cSHL\kI#wBlumkŧ885 lE=(m8^:il D3^GbWXȲ۔-yD]{^L' %7;E3A_i])gbnJPw&cXp*]lg@JrL( -!% }`}Ϡo,eYbS,h0hEdR9ɡ[}ĆB_"h?HblsrYc&~7?`ץdwWnMU81]Tk/̺%r22F@2@5+؀ U] ƨ q<1U3ڮ~r]M2q0[&%z7rgm'863uZݭR+a I ZFy-`JwSn- ;"4JN Xcuz%_x1#+ ;d #AŮwkQBB!*mɫl\Fjv\RK{ ;rw>;Jv"ep(X-ۤ%3,"!E|l MSZ(SzS!Azccgh +(,Sєh$fVĈhb,=Ek>0OۺWj )+3Bԡ\%:SQ{d\Q\}FťN@񵵦~SQ Eic@ 2AuEF:kKqՍ HErokFֱ|RfJCL\="OSnƹSj % H69HdjN{ w){.Fc+tG"Pxt[yl:( T&M3ywq?]F;lx& e*n.4l?7J{z.go~ߠQ킞QabZ 8­c7RODaua"vDS \Dbvi`i gpW۾p$YFOќ|7BKh7!{-W{́8I}n{Ѩ-EL}9op`~@1o3e겲kcz5#& c% ~oe)Tg'%)9— f>< -bz֑=Fʺw :φW|׳UY5sGN\r؅977=YRj aVx&pOkzϬ.:p2~koow9 HKJչEbmA ĝEKt lnm_?\j笽 9k*F06 xmqpT|dvQFr(js^6:qvqDn2N睫T* RXDŽ3yk EĹ!.V2Z%2 j|/52S69Whl0C2 ƂBjhE|*Zl]ƄAS8ʖ#!+<*\ Ts{=QQۓPP@jnՐ%'t@J\XSܝA;Wݝ5'Hy=ILxG!9 6/ 'OޖJy'7P!IycZGd>j#6B5X[Mo{f9'E.9QL &{2+pzt^Q26s%Lz016&QoK~qugqIv>@zp0j`Eb~nPT%s]稽'6rt}x+s>8c}(:#̓Аo+4oېb!@ pY%7jH={T3\b+%M!{[m1eoRrbǟXc+V#8lll%" 19 s5Q,k=46 v1_JO%{y>wor߮xȠuh?@H[xYZ/[7ʴiVl5nY]4m9e>%Qʎk Y^Sv|d.S7 )g_Gՠb ⮺YpfL3ZJ{Ct,\8sշV $$.2y6e=0a'@62#2 1)k=y4L!ⴢI .)}=5{:Y^=$7I3Qmz_U, [aaaoeG :c'l ~q dL9ñQDLjs9-hQ,?H +UUy9oLGfh} @ژTIɯO:t4HWJMMhp7 Pu戾t,cu<<4F")=g4u|4LԮvSK2  |7ҖE5 \]#)775rҚ+CgiPZiz_~[ @eB3wo)UrzGp^ms7{a2b '÷ӹΗRDͩ:Z ;BtON/࡛(qZ>oDb9SQ{-CIYQ8|r%i+ S%-A4H@((&A-&z-%ni[|6ixoSn6T O. &g9S~'r Y0fWr3@bN-fGsgg6^vG% =3Ќ?4%:ea<ӣ4~qUN.7ϣ4ч K>{uU]wD fjWxƒYE|a9,=Dbz4AARf,B;)由i_8Qitѐ;KSgmBbIf3uh6(Q"]z'\EJv>rB(tтi0TkH#޺<ɥ}P&Rd4* ?p|[˴ yYu:˶ӟ$-ʎ/O[}* 2C62;YmhݒS9#JOtf\tAa-2wѳaL E"}@~aq9 a+$5FCqVLn y'W؁O`"?Ƞ俾?D)O'.!CJ18FIb+r˞z 2j⿰i/T}鴼46Ww*YwevSХ99?m8#p5pM 4ym] 5 l'c:'i UD$zį,ޗa"Jnw~ n Wꚠf ǂ#ly _zN 2H&'_`r1@ 1Ya @^Wӝe..[ҒS:_OCdO:)W$'m 73<Ԁ_yٺ,&R䉑B-Z8#})H&;O/fD_zPnaiq˫G1!` ѫv$htQulO> 0WZޝGzwli[0z,!Ά=4[&f+ 3k()Yx]SX6rg; Y~IK/S-Z{qlwKK`=^b..?I9sup< 6KwNT]xF~3 J fak nG+C{)4zKVFS60}gX\W0<:[RA2@&:RϞֵ=x*E{J}2pϚA? y@U~o@ $2ªIKKBKV_0h[vg,LC 9bW‹B>Uh:d֭?: 4EwTeN\ ˒)+#сL j {w=^]*Ţ `urev+OIPH~J "d>Hi6kM,wKW X}VL*;<*!H\ HR?[]pLx#ev׽_DE {&붉[E~:˺JC1;me\i'-^?˜)ʆ9v2M fA> ̙. B9ٱ\<|!TQbf|I=эbL#Gߦ^ > 5ize DpM]BlWQǐakc8FjIUxx\]x#MZ<\Wx.]|gӢUondJԮD+Q Rs0!ϥR6%\INOжHMUaXFm L Y٭XMzoOU5!|.̙IAɂQZϕ:cEm [ 6֐}M],wU$_4w8vh1!k\i.h.I`k#i,C[.C70}|='hwsg`mԪ\i4]`xSM4*ˑCw>8_Y j<Ʉ7QWǫjySiIHHWptekLNKl],?@.:aM4k.:cU->Ey+xҬ##eů3 Oh%W{ f馵3sqŌ:k'&"I(IJ nHQ3ye&$&[f&ɹh 3>ne%^9HdD""^*'4$NU4dxS>ΔghqɊ $K. S~Pz_EFh9z||*t2P5m llP(F#u U~\X.p^s[J]vvZGG'-ݍBwVzvu72ӗ$I;"Cܼ J-Ȧ 8}Ob#$88ya/N_H2+ R2F<֦L#p/Ws:$k,-(ԧb%o}Ж9?qr|=!{š-'nc{w#8rxChx)S;,DE%kXo;{¿a HD;Eyj%H-@.~%8v&TYeKg7~4Ne~˗BX9KX}63ndL=CG43irQAߺTvhxk^A1EJbccϳlI?}>))iqH(P99[ ;l) Y\_s XQcfa٪2!F=W dgx+kh_>xyg o'  e.پ=iOo\\69.Ȧm†b\WSwS7>xi79  Te(Hb'#-]fzjzW1 SW.$7a(Yj)ؾ*ϵ;UM ~$%k[Gd%=(6ME*S;lΒDa:MYr@˦?qL 3A-qVMq_puӳ#ܹa*02dfm!ͅdY/=o.{oz22wx0~]6ժ )b~\X ilnSRs"Ofb'iQ??Wb {Y^ g0䤷${T䖐bg+i zMXnC< <<$!b~h)kH[233|x;~:eww{oxst>^FL,mm̤+OB}!}Ե%T;WCb@+)'@|箨dR3PLV2<gny}кs Žɗ`V˸#hljy kBf&̘=o˄QƷT%ݢ_Y5J6(X ;0z^g-YgILj$!Q6͂W`o'TK&X[cv&Vqd*fHsL*mWn;ڽTYyHʜWdYfKT T=s˸.$3h~[J,\ G6jw.M6.=WlK7>/I6YQmѫXwBxg~˥!#CfHnJ>)E.,nzVO4i*R<޶\iq5uK8;Igqy@C vw+/_NS h^:9ّdA(A,7V^=@34Xi.}UdRt5͒_OqgLF͗Y,/ Y*ezX q=k7S˦ǟg~,n☘FH882c7zeSL64.|^hn&ʻSsgQpur0Κq0ٙ~n:p鳖%~T] gvЁ[ƙy* ~c )it(A 9tn$3լ7^p6WƟjMxMp[g>b qjע˳-3dkgJB}AԬE} Q[7sE!޻{"$LLyP~ɠ~+x}@yNDDA1qlGr̈Dw񳸰RR%HREvvVL!3ysi$$ A,.Jг@ nL7Yvo4C&Ѽ>A ,iԸ̱|::]Vo/KxKxd%dS [ds}Tt.ަz$qaG﷥iX{Lcrcs?@fZoapB #nΌiȯߩswv5GXصGmã+ aּ9tq !!qbhJ{OWZu_ھX4w9?hBy~8 32#pf& 5$ȧS;Z\Z"R wC i+wȌ쯮~Wp$7U5k0iJ{6 剄đNJJxON'%%t^NZ)k 4L-`*UJ5y(OB$le&=c҄-^D}aZKk,=/zOB|*A`p7kƟ` .Af^XE Ovec [[+llhڅd r|i*5KpG?1;99T3z+kڪO4TMsrԪ5[ FxNf .jW҅KE}v3@df¯%j,} 0qK4lTaVҢ{kJ&ӤxEhب4 dD<Q{<ELt11Xb=e=Z͗5K<ڱK-y\݊2be<5$mJBQHpvbLne=:/iT&!Z'ΊE-"{S|b`lXkeZ4~ރU%z4ƍ롌3bk#Q%?{PTe⌠܌EvME(*#hyK ccM3^2ƼHN8f@9jRjiYI* maXT e!U`OEQs8{~3 2/Bh47o#/ 2\O/,wR^l4p6ЌFSϜh:\R\Gg`\XX[ y/KuQdO$m`-M{|k e|fD I/%2b/ױ) @A  nVaOJmD-xp4!0؛Ftu8}SeV% Ya>1NѪر ":(1 b P۟D4z&59⢖$D"nvLۗi]g_K4-*λۯŘI.zΆeZbD6c-|bh[G1=bE'=/%r'*e46QE*ۉ١^bԝ\aϮ _A]vARR2ob ^i\)QfLnLnLfLn̪Mt @y#AILE~ӿHMɦjMQ:p2o oN3PZdRmVJU3pKު}RW&p<  EB᷇?J8|"Yj*ܹHv<AS2=ģC - YLA϶۱= IDAT%g ̚Ny(Wk wly3 _@_\֋½{MpH%.maa]Olm-ޒة8}wj*+jAwU1,+7gd?~<n'%tnN|+擴u-Z}RI{e. ~)b颽h.&͇8.%\իk7l\\tMrƒd_E5H(*077Ƴ:*˅4z*E [;6ryN`g >b$_r$LM%,[@ԺvӚԔl%=ةO]fİEg8G[+)zݏ)0;Գ^/ RQUPS#JHz' anHn^LA`Ϯ BWF#"YZĄ7d9&=?=]]v͛+&M:-IENDB`PK D; media/css/UT PLJLJux PKD;/media/css/960.cssUT PLJPLJux Xn0 }t5*B*=u`=ښzU zTRONz>۵ ݵs"09GwPըP9glv[N6Q`(ũSlBi#-nc /;Twk}ٌ+!!88U,!I\BdHST, RN)! $8"$$r"E ƑmJ#PR1TDa™*6I.ǂ\C}֟xOteU@ĵ@=w{p$ Yw>2W{F]I4<'$]N'B3!elq˵@,ךw9NhJXI bOGR.NB RO'ZEr'%M%Q{ufsuحa:a su v`69{@B!B`%9-bR'J0;91)/-;;Yi81J`T v| &f)ay`0|<* }R<#<198 VBS@0l< D8y d/R`/Υޓj// &ϕm3_6S SR^U A>mg@ό`3[A@3lE gt!hJьH0~/@Ł#J"Bt[ d)>"CAM!Ɓ z2MlS&(ʦL`‚ D )iYy}[0?иs{entgn./y2cuK_mzU ]m;380$*dkp5g;c6PKD;slmedia/css/text.cssUT PLJPLJux UN0 Wā k x4qgK^S%ب4 rO]C[\PYxl߹hP|!kDu #5}pSäj>/x`ԅ܅1]q+R_+5'{<:AM|"5C_hv.TolʲHSVrsY87A2WNn6x({5n (U@5Pj&1"z1%'Կq gSoPKD;H?" media/css/main.cssUT PLJPLJux Ur +!#َ#SIS!hhv$\]`߾}f__R,(s mYVՔ]!F,)ZHZx΄ Y#9Z@u\|.B\uںz 8vql=DZ(vݦI}  'W_$El"Fa>ԁ)BU N|DgHGjp4vF9AS^b?1;ր\ Jlr+rQ&HQMźD\2Q @tN"r`ː #5Z0Jb6oh-2ms1DJ4:֬0mm|9#HLq)g*1ǿa3-9<+7 1|[<N85i{V%uZxj"sZ7v Ӷa 3&2}B5mBbt&vC ڣZi)muZ&/fYCԡ}b|_g'oئCF`nVwӲ>: x<ͽ1Hv}Ιb"IґlɮW 3AO[{zvi,rJ=W/a|؜F]?$c&f}0)c؎'i]zgtekƸIvf䧕7u59S*f ]1_%7xPK D; media/js/UT PLJLJux PKD;xΥtmedia/js/jquery.ui.jsUT PLJPLJux ЄG)&ӢcVmsç+xiQ,=N^E.Q*,}NaAga)acŸǫE'xIcS@mNG~n3Sc^EeiW_Di zY'r}{YH$Q>af/?8vwͥqf5rcܷYkThYƫI8k/xNb0 oei 43o։[ J~3u՗ rO/fC|/+3@omoLl4)y1OG߯.N٧;o{ ?}t$'g''w?Ot둓+r|t~@N/'g'^;?/~O~O6 E I4>>8m?/8R{{|O@<\}8 ?&6\+9Ė)seÁf}~< />t5;@;0e@iq14ñ,QNp! H9LlB-0,``{~h`.¼SCs; d.9%39#pHhpL+ꃚ,+IHU@ִ`cc9B Z6}XI`Gpˆp`:>oI}i0x  jĆ7+Jp7&*i @b# ??Ccp ^%3ؔ<E(? MLx[& 攁t/hRI Q < c2 c5-,pJޒTD$ TK;X8MGq`KGa m]]eeQ.Umd`I{[O>R{gmB7BN%L6CI62 KցWxDbvv|yvsHj1Jgs;[vavi 0܏( Š4) ϱ5ܙf ׍|=1H!?z]: lbo_rƭi8"ey e9aZ -R`eҹdܼgؖ)ir{sRht ݮM&pi8*}2|or1 PoI̙t.C[B70,ԇ"Bξ0rvfIq} CxWO0 ۰`oiX %@ I]*H-dB]jf=hXw7lZŒVUP1@:$b)R EH ; J;I‡Ȇ5--˾` @}E=r,MyZ|j@O%$n2s+6`ѣAaV-b/x{Wft_k(bXVjaPنIfjH`uC1h}*RzR_e0jks&'R-=NLZa.9 &)L&I*@2p)0OP*+jc>fNF1t5>́B9°d4hQmcLz s"tXUg5$z(W͹ 5GZ'hxy;f,:9@ ` -࢒07=3Be)bx-@Qx)dB*eܟ@D[qٖ&45ocibs6 xд}p4/~д9$:;o`qn68ØNkԂ(kAeJ,0똹U`񅁉ݵLXMCEe5*ۣS!UN,8,tnX< |Z,E<], u&lUww\Jgt5Iz^2g0^֢hnJ z"5[ŝjֱn+4՚7 IZF.ӊw Z p 41cF ՇQ%~ b-ݔW-D%l s%"#,WpPlV*!Y]gZʒy93z7ۢw]󠥰PM:߲pld!KM* 7I-Z]1M3BDR|hS.Z%oIs =xuQO?3"/_l(AUz5FYT H+9*9P$8&+Owz0 kH#}H·Ks,GUM xJIf-M4k:Yc@$n#ZeSbkmcdsCށv+N-àuī+ NXƄ 䀕 E"yܶeQ䉝- [6kdM ggMxC#HȈGAGR -bF].wͨ>v9ͮ/ a4;V9',]pUSnxTXI%gdL*חd{l4Ɠ>eb"ڂaM{=CcC)H5hK2 _ @i9EWe6.0\}]+!Z!^x}CZG{&iHQ'͍T~`8b-Kym2H=K=ioC^F}#5 %D~YxfK;QE$6(z5xͬ1MB\l^H*2YlCcjѢZSS@Г'uWƿ;fA198|@pLHn4xp#np^<6AǠߐu︵ x0yGF-Tko!Mԏnj6e# B׀Q UX. (Ѝq:̖(QZ@9 YM WKʪv@Seի [iwj"LPl`8"oA& H*ۘcW7M[G]Cܲq%6ea&_&bG{~o oo =8ce 75Kđ@Ե9J ̀Q IYB@>+ k`|ێr?A7 w"+5Rr $luV$2"Law ;f FoFiIת$IJA\k"agT;@55?v"˦Qqګ zZeUܴFme@iկe= 7̑>+zo;C0*-LlDkD2b~)_Ԝ"cnlRW=^ w/a.?E* 9d~f;철`k ӗ,V 6NΠ3AV :K(j@P ϡ\GsIp7ʳEB|.Bf9k:yU'ehWp #Mq?{ѽVKTpe4TU"W}rc2eooZl͍4pwAӿlwZ3J8l4;dBaiZIӿHEJZe+[W;٤.ZÞӖ_IcN`Hm7ų#*b];_˺ D` YmBK Wi )khR)HuVg!6I|>RG5+ XB{6Ǘ`M[lnA7\\4Qsq D1'Yw'{,]%ik@&CH'_260+u&{hCJWI2£4`emt 7")]I3ޫ!ՠ&o-uQ3jFM3-B_Q3I ll,93"q mxim.`D|B~JT*~zBzDn`-ehU25֎>_y)Ž6FCn/ubjܢT}"s4Z碵X!L%PXVu'_Qs LFv_rȆ# Gl.#7 ~H?1:/+(#lZIcǽ_`SﴡS~&^;W$gy ,≿YOsٌ:?^~ AfLZh =_ D2 xKQ(AuCn|}#?gP +ѐAֹ~'8e4.a(Yzt**…$v3vQ!J<#KCajhҸnB~f ȴdBiK.:xcz@WP@8~>,1ICᄴl pVku{ 6oK3:eTՎ*8nV5:X/gnU)pE Mec{ވ3J]u%lQ@㓱9NQgo|5#vdrJsf9eF|H7N:ZFJ;?d/!Qc6B6՞N[M#)rAP{TLkV:[ TxЖS/'jpԳ`j{nԬa+u$jڈ_s!¢MwKWwu1ʳ|W:< -ơƾcU]VnfIM'{ZVur6*/Ȳ8ll0KH(͑'ktu(_YNUWȼ"\"@&0=&fnW"N軙X}˭GmW&Qd>\ *f@ O~7;sUZs ^Q/Q8Orkx`ˆ-j6VٞVQzm㯸-yw:.-&xӨoyT,Y3vvę8FBN炿2?s%o8)C]'J> .Xy@)e,Eui$sHý P0Ԇt)ΝeˍO#z7JB\و]A'fq!zhyuw>R^Cpڱ7Pr䐽wx QZ?3JԻvBL"@Fa%fPגP~@{Xn W5sx}! >?KLPNYoQW\P }E AsLs^g]A۠uxX(Q)5Q[椤}ftrRSJHIPit⪊n8A;$KoVu6q = G[m6$S) ̳q0M8PFysŅi6k՛ jk,

-H,nG/N7-@Lq<0x ><~; x4!VXlӤ#A+q12 1>rG$+, 31#4',< VM͋=>Xf|jڙVk(4N-1﷑鹣GeTcGwfˠy++"AWD9;7]V?嬗1eVIJ7X< 3VeO%w!<†ML #U.!e 8@r]JڷNI. ~rgF.U_Pb!p!5PpR T S5|tUpaJ+KvIjhZ|Bχba?Ö=0BcƆi?ݾROP0[<?u'>0\.ڸֱ}~҃Yh[kdXQd zvv;3Y9`4ӈN}.p\׶b! p7|Ny*ou6d$-RӼap$KTE`ٔy LBrp-W"J&2Jċa8@ w&T!ac{DURD'sCҙ4@!T+#-ȫq=~,re[uij#Xjî!mha;\E$us<<{Ծ2pw2ku#\YM.$9I84zǻ.+xa8}9`9cHY<'4n t՜qi1l,>Lz pW܂Zc0Gr_gPw=hS1n/vȣAMHЍkuŅ9q8>=(دï:?Qi4n$NVjPYZO`]л2o`B.LD?"^+Nmv~R-mռZd/;cy߹G7D * I l20nv=O l/۵CЯ(=fnj I3ogH+mk\/Esq7K0>gm)N;F#sp?v!2iNԵ]<"sS508iy#crȊ?m8ĤXE}SLlW=dE] @(9!Ej`m#_x#L7}pT]NCoR&yb c30I>h>d"ISQρ&"t.##O;k/Q88,ۦ]~16z^;,,8zg8^_q!ې5&.ܻpRGr7жd㸴t\N*i%W8."n A隚x=h7*asn|D7+{]P.5iUv/%zPr9-:+\8:T7$Wkݑ)nTEQ7\~/ 6vȯb?}pݎcDu =wGc1N`˾3h) N)Jp4 qXp˃RP?F1 kMs1=#hf;ٲAx;UEypEj^K,.F_whD`n=3@f+n}5gbct!ZBZ0n,㩎"NT7kB8WQ8&ef9c)(˙/ g! =gӅ#/4*U mخzoS^ۤ4 i筄ѽ;41}apYS~ A&cT#qUT 0hVDJޤ.ĤM967%S :7aAPVqK( y:\HE].MtP,D*P,d) (l 2xEmZ;ux1s9 aZ.e ;n<L;Ͻqú;u)SLoZț-tf?Nyk7twvMpDyR* !cbov7o{QgBgN~yt\?L j>0RtVTD6rQ8!iv0K{)4{rPiM5dzef^oQ*ڜ&; Is1iSx%dMj _~BLi|$9m*l434\HJ4e76pݝ'iű0k*>Ê;fx}ZGd $8%2A2= ]׋(En8Kׂ OE/^tg%!R*̕)87_:3%̣<:s<dk%~D ~q`#sc6媍:˵'@мOU@V9C?]FP}Z#jGeIR +W-e"uؚ4u l=oۊCfx̎bfLA 'MF4 8|ʈK1WK0%H$<٥$VқCR&Mq󗦱ۭf)u-`=g#B7/Wv8\ԯ%=uᚠ _כ*Oà)VV- ǐi~ZPʥ2Bx}x2Å ܑS2>5ē]<\  9)0Gyo?nwtieei E0ώb{7:W5 *_]/+NO BrS>/"kLLLܗE_Zb/$^/-K˵xYT,<\82nV,\hTvxW8]w)2IF8*D "Ao}2oloVomeVʻ+ibΉzP(`"VR?Y$ԹL:[4{Ck?dVHOtdt 0tj& IҽZo\OsmCV#EAqf'.˒ͧ{>(B#$=hNG`<RCRYnuZ+2ƒ *ϴa@. ՁSMI7պ=ӫ^63-b(/ B6zojBl@/FCg 2CMqVBP]xz :fE_2o3Ra[١QR^X Ԯ5 vAyfRЛnZ-X$U_g{FZHIV>9hտIm4S@Ѣ ^P袈t!.egkZ2Twi*MB8K*:b]D+zw+OZ9K&$;k-L;Ͱ-o lY95IjkƂ㹷QX?TM5u1o, R 5:6gg v?w ~awt P`Us{=kR0z%"7TuѬm-b ݖQuվp_+G߆ ^.a[an X!]B$"`^STqp++{>߿߃t+2X;'. ȴ|qKltدf3^4 ʂ)maȈ鐋Jf)O"h,u9 \z8p.X=1.>p;!2ɏF1bMb[%4ؙܾ<9}mR v4E{DZh cA!Z5.fvIM!ȉ8`8N|AN?_#ik&,V|"& KEN*#{F} ;8e *_wb"+>{v'J:"YcAJ+aFF5lZ.up>#lgomm]k[h`fsT>1K+JVWr [jv $xb\= mC5P CCL8jXjTUaMM5n?HН;S%كD ys,6\ uW<}>$v+E:hx|u7Ow>r@pz ^x3uG"ͭCEG]07 r?DOݣel[ZniB*7rm,y>l_{g|Iې{'aGíUk ǥZ NhθVG,Xyp/3Z޻CXN prdg}=X]K{ cT&mв5@JwF2{y8+)D`7݁S#hE+:GNP.Y߉A*|;+f_"B1KajkP*c+5( Yld6 'Tht[)ќAQK@Wտabn佄.cKPSIn ;- Ok-~@ ~68ݶi#\7,ǹ<J֬m]aiCAymB@ XIkFYjK 48"Y7V8ozml:εAB()w*H_/pC7dyKq=ƞ[*9< ]ZU/.jܦzG!` +%8'B5NZ (%uw9rWT G)P3ȈΕZo2;]ժY0eWj衂BuCf4ҕ h܊[.,Z{|ռƔ;U^ >֐J18qTr{u]xuHR>r /*LnFcUwPbr.+w)@,!^I2)F4& CkQ'~>A'xR|)ZjɊQ S~2(>E}tϋa dتjuTAKF6*=[WaZ[ Ǒhzd'9q䠛7353+'ƕ& ڴxhmC MWcHHYGV]c /H1 Y)$ Cc`K~|/l,# 3^'1NJY+9!aJŒRzJ$ujBǟ/Zo#/<*s9h7m8LK\C76E:^F 7&<6d2'ċ~؟}y8Ѿ uo%wY((c% aWuc W޽hv8kYHC=PH+wPp[1VBaۄzBsq=Ӭ )yvX#7b@lm +jrBa귈wmpJw{kJ(Zb)k;jΥ<qw;01%&yVIcn~L!QI" V .K[fgp9y#A/baO ^o^/cGc43E;qvq䂃Aױ#fvlf&+0 WaFsz\l0 q,NVoryӉ]I$cM|b&R^쉥7C ϣEg/ 1]u&Li<4e=woJVb^^q09`R>K:D"'C=3Wo!Y9<T昇6 ۯ฾ҎM;F-‡n`c>Z/?݌ԡwhx,:` @ 1 ܝ:Dq;^I0*/g7"G [':B p&XbJgG0]J~=4d.E/vC>N̓.19@r4 ˱:#ml $- cj]Tuv@T cPgYT ʽDXr%;Gɱ;2#֎JUڤ}RfjR;p{Rt30 "f 齪FyPtXO]s\5o߯T4Ayw"M'ބ17/tG"0f\#/ ea0#v']+mp~]w k&AN>y0S,E>Q96GUY.Z4rnP<6yu|+H=S0BK{ ?Ot<EKaU_pW2S Gտھ:ۭt:yd<%]=d n~K=oYOsbtthne166S#r)xEm3X蒁y﯌u砂ݠ. >P?jU@o^,B4`{cKOH⌋w(6!3{IvV o]B]0{Km]gq޳(w,F)A6V'lmE.6?*rxf&!6pإQAF)ڄR3K[Pr#W!uXp*p|j`ݎ U$cm@Vc F Vҡu}P ;Y=L>|W[O~e"uEC^ B_֛啩|p4rJTkKz>;q^jmWߩj#!brU̓Eu5q)yF!\ӑq!-4A"W ncpNt1"U=1y(d B7HZ'X:ȣ*cUl4†agF.sx(4#Œ6SzqLi{ db QA훊]G^-'UW]:"54pfHFd#AFav:܅pn2̆.t02O]C^j-coSäN(a9-Z}8cI!;TKezڵ{p^mSQiV_]Z |8wP$"|ڠ%Qv`K $iԱve$'b;A;sȵBLj`֎HB<҅gZ5T+3\'Tjc㦉yјC^ Bfu v/Zѫ%q)آvFЊa=j;xҞ]][j0qzhc  âj 庡qJP0؂ %z067)kֻ?0]X%.o3 EoՁމ!HVzYY4b(cم "MHF9؛jKq[`n":- ȰRGnB׊[ZBlNHZRI5x1\ΆB~;`jLxn/$mtq VHjգ_ dv'xyc~wu'+uyjpq3`Z !xU5MH1u|BdZ. +@W Io+5tl4vȮ(#; Z`f DjА֤;v͖J pxRfVf޲Op#cJƒ #z]Ufzn5^JIi[dMc]?s @P ̢؃LltNŐ:1L  0 Z$-cx  rKOB%+&z?PP @Jlx_%||4K#l~9-!@G{Bf a&O܃,Cڐ|J#m,'49}֙c 9*J1M] "m Dܸaggg⃁fA&Iw9XhҘr1@{G#,&Yu2V{tO&öDI;ZyNߦ`6]mTb,4R]D"CIX帡 '&E#TS?1K3xy8~{B (>OY]ִg: u;,4  34 Nfb 46!b#%Uc~^ ' 7h{^ il%2D.\)$ͭ,^Vrn Bex-'v<e*&bYI~~mtٗ5MgUqHMEA (OhګSN6+1D|_*h7\Hu ڎ.}>Pxl_8^;{zw/:l~6\K49@%YC$!P9C~+F˽άR$Q4Elvdũc+vbKIKY[E!O1hk8f(i'8ziYvün{RtQ{,R"2vYHD]1>:AڈWQ rKݲSBhiD9-a', Nь&d㔮W==xT[ nYG0uwn\)aMJ~2:T"NTcf, J84R@Zvj v:cm8TD63!ٻ|:`OW ɖ"2ohڀ_@g`>)XzQOH[I6|=¤Dr:oG"|ࣥУ?k:VWrzr+k!#"=p|nPPt+U54PR9)I׭=Wʨţc7C.7R"a"H-뼫*O>;x̘6פD}|;~C"w5i11R o{1c:e#d?$k/fܗM6aDK:fGy۽/zec' rfGpxu92^P No%En*)9F#@Kj@>];-H8o~x>b䯾2 gJ§NmJflUNFQyAyc?G&.@xtan~{+qb0$`"Qы &}^Uwu=~2lRV6oVa":GK ;T򿻍FG:<};khj>Ko݉j:csoxHo9wVҭDMwЊD 1t h3+D:E_j-YP/j_sGQ\ph U)`|"9Lq\ '4{x1)_au\ Kz<՞$i ǬӪV:Ʋ7nVΝFA3Ҫ>+ygOMfLYw=J _C?Պ'L:Js2&Eg 59yhxTU>_:D{}x?] <(]>y<|U060ݪ01)IfLA;awUx _(],42`X=?3K^UxRdD׽S. MD- UseFi\uvd~:+zie8L8>m`<&ҢtK) :L":b=>c:N,덟_6w~e -PK}h<-<dRK_HZr$ ) S3TSF˜X+r2N;5:7DP~E62wֻi8q?]pZkCd(=n0Z<291 ]e|h4$y|R+nK;?uThIƺ+awd=XA/CL ]9%.8Yjќ0g9 ;mF8z7f8`@EmpH9-, KK=a)SSzw~Iv8~Ahw~)I&({:jpt*{oÏSݡ ܁`,ͥOo?mtOa%!md}]]r`1|=a$TT1=P'kI((%sm0I=3cR^Wؐ=۔ -_#ۤ>s|7I2}j6;$ yuW3Pϵv/[֢GFc+m%Wn*S,L?!$-<'D8ʝiFUIj/`é |: 5.bquU}&5bwnl!$w|3t<9&>Qpxxk7V7xqL_ҁc~-$Tp1j-uc-j5G7^H~t!4OSHlPʦ 1((64,)o@MojHU&?X>Dhꇼ(_POǣ5;{v{ x˚F9|GFj=s)UȹW*Н5Ulzȫ<Ec$~W0Nެ_=(`ZpAaۀ#a tՆM˛ަ6_8X)NfHB1žF2j;4n(\=,/y+As=H/ hC0O- 8ܢbJzMa)B&૊̡й$[? hж*2 vN㣍u7%:,(͊WKXiM3h`}Qvhreܣ5o+ WskΝ^\KZתɥv#g6C؉x ț+=;X0cx.:[*j=,1%{Mg|_[=enS p)( GPXylF$.n>[G:ݞ5~rVZ$=RA-fIX*'S\ s@?>*%<+2^UV! V{U^76 E .H9<^!XEM((WDq"n]%! 4.!Azg5UU΋tF5E9"3Q[D>p8͘wsy`k͒'挈M=$@3` c۟mS1gMĢsx+rez ħ_MisXQM}&æt.FZkOqu$3mdQj%>t*gB|!ݨ!!5311&܇bW twbS uiFƊ-DZl+e]naݑxa3>"J"wHU ( * LnK9 chu' w1OLsP+PA{vZiJoohCW@Ca'|L\B6C{H_v!93F 8< 70F1z׶>A*6hߎbz((P*{Eբq$Xc8JtOûRO< U4\%9 ǁTmȎ{1MIg Aa _ {H9E6*{7R? ٰ[ݴo~5j\.bςbƇa.A 60¬fO%4}U^f!j47\K) [_2!jVn(2o?U僚edծPhAJ1Qg\ȈO6af]R\qv=)4_s~|Cߐ0p\GPVEL%r8f[%`!cf:L419/ljK~u+~:Ec$۠zO>8My$ 4ַbNh1.+NcҩHحOԒbbiI?j>ܭfQX  *V=ѵNEa7uK.Gz~j^fJ!r?~h<[ϯWxWT -ꑾ±0 ?=34FP T]AհV:Xk`M5B\ht~AK(?Q4;W.bQ+|X6i0B1W =SY Hv7]/_9RD2_xjJͰ_8)S6`Q*2ϟ%Z3W kuh Qh *6wx܎fwØr\ 6d& bsv8'qs4+TZ89^k%`cǟHE>.o7 ۦ|uUb$PD$A\. %TV+'O uŦ"}݊,?Uۨ;!?imc" _ oVRQ[}"D-*ƾdW_~%di/QZ M] !i,46IuSZt茱hB=9x++jh% (}R70`U=a,41LBid؞iR1Lck$_xqmhZI]a?].>Q/љ$4NJr)$ ?֑|*RCk ֡Dt͠ e!,^aAUƼ{ %O貘OΝe~֫a[4tG/ل]¡P,AE]A:SxQ&GA]@|qIv He?AV! 9.e 2.$jt1_oxQ2GH I'=y@)Sgd/+0g՜ɀ;dV!djD:|oUh>cN<P^SK}bG93|iWѺˆ@˶(O{+.%|VG둱; ~xlO9-yQy,jXӅ[پor 'ԽϷ3)~LJ)me%zKa%}lJ:KcG{v D۲9jm!!6* ޞxi,~sە8@Pq,?T-tAqCv`zo5@01-7۞@qW}B38z1d?/&$Ly)qJx, 2#d]LQSN ~X6p=(p >h|PWL~ku&f?jt̜7 ÒŰ2 wB :#iDeA1|bvY:XKu/LDrS:ԅMvD{A @:?,@i=ګU(I7LK. \3"kv=]v 5/Xe+O WuŪ!d@>*)!-p"8= Hh 4;1HHN-}MGx,;鳺-?E\yШXkHyOTRcUɉ (1fX<-7-pyPқc r)bEu ~4yW+*yA[E:{,dѫl!~tuQ&BM/c% v[q,pipz`Bţ zkR"X_jOp3:Go1x#v\մW\w; 7髳,*)1f覎k;ܗ2Q(N7 qvf~>̤6Z7K܃>SO}rO/>tL.USyqyp<~: 8@3UJVzU ԭ?13R-\|\|\)GIiһ)c0ÆmZ5ZVHPE(h[:c.tH7b1 13{[q <%|nG)?|~pȿwÖl={b#x"uD};ɡ߄snۦ+Pxr_nHq*~paI_c}f(!Ҧp:N`b*\uvQ:;1Hê%DM!I2GnթL"Xz){CŃATR > ]Afí*ESN_C`nVz(U M&V~k=AIO0QeLykʕ@KwX0pSՑ&RoUdլ&U [!tkx1{Q`j1FQ7?-=:_}ka#Bw5cy%FYYũ)\n"nV([oSlE@CH%GNW/Ybl L!!ֈv{r6⨔]=2-bHoTĢvԹ4e+օK *DI/Ұ$Ja35mb[! НY@4 X@^$طrNr P|t>xMhrp*S/zFzGfuĦ^ -؋2XNOTߢ/v(%x3yoT@ >7#tVهs!\=am(J1&uh6AxHLZxNŭ.׸t:웜٧ГvUvll%`-#(:e [$0(i <yR7U)b\L4Db]Rol&Y,^rZueVz?o?HR-.__:D` K=.Q7*`2m{SQ m~1-}ZuB%vLMghs8+=&%PkpGE8TsHL?*\2jf䪵3Z(>ϖUfOs5]t{_  Ggv&q[L]btb6J\G#.~dTWI1 yߣ"T#mb4"\pv}tv8k@c؎4Ԝ4ܪWk|րveO\B,I\޼\V4OiAֺ$e苍-d5`ƭ(>NC"潸43HN E m %*0Qi|G]񵌺]CE݂~Κz\ t)xIHϘG,jF,:_мiY3jxq;0z݈HP}NrzߘFM̑Fwu1*BT:[.&vAP~kۺbY}}h;kbJw8C\_]tNDD(S;MjUZ^k P' Y(ݡf|cu >~.LjNJeP|0L/A,rwX($*x=QԂVv xUshlG#)2j3|95ɥmr "sKY~~ŷS>j#"߻Ϩ]Aؕ3IkΨ,]>IopMk2`4&j*/+RdXR-ERaZezU5yHن"b3 3ZjeHܯ]Z| +nLOp5vWAuHH6__#XN?OQ<ݖ6\64<*D]^|^o_vez2<߾W e?^\PA(I5UVsb~VM EH|JVۗ_|}eRK9a~Jl -E"chPj*H26Ym((ajԫVQxX5e%i.56կ&ԮvOk‘wC1r __O48k-KKx"'.#͞y^i+6n\-^OTZB ȥ.<>};ȗpZ RGPGAIDfWCW8PPs}:KKB\c(#]O}$A Tpf%Ig}ATC9"j*byGWv'v#v~b1ri?/"e.^)t*MwmDj|>|XWhC<Ծ,6;=O f’FI!N]l.H ];#wP8u (\_<,vjN8J 2*QB:os]k%e@8% U胗X_ &䯮'.ImPձcvd'Z.Ss*hdBsi$u\Ȩq=gD#ݤ.ՈPk(nWtWz{լWK~Y?G/oη/ۿ%IG\ˇzXhꢷ݂ɽDYTjqu{t#\ ֈ$@ʽ%Bp>f}m8d;>=/kD߻([J :Iѣn\Oӝs(?$btsj[ SM97>,ViCw ʤWpyfbm*an/BwWujp?ȎG 9^Pc(;ߜK;wA5G~>,i`ۭ^rZaY|H% 7EUMa,X^Ь#f:!EH|V o0q6֠=4 hV+#X|k|L&m#{D>cE^8dvnǾB|pz<3n5G.S xW^a/S⇬وZ(p0_O1m)ō4Qg-SbJwxTWe.F<8-~=hrE_fS,Oi%K8Nd1qV<-թ׫W.kvg~y9q L|F]3WBJoXJ6m; J$'`T ӞwycNpRvIϓ[t-P lT 탰xO=8j=µ _Qߴ! \^ CA(y|!㏳ jґ=W ?"/;!T <8N׺H C!vU(ks?#ߏ؁+m N[ʑ4|O *>v8"ܭ;- $/G0tħ5c'0H_ZX+AG5Mcq!/pU,7]""mOSPFOl[}G;NC[t? cWCU^$جRh| ƿ闆'u\*Zlx7S e'sn6XPe-iৰy%KESI862}GaZ͚d2!^}wp9SUԿe]ǎc h8_@N F~W-# zʬe{N$Vg5W l6G1F]`)G~lÎils[7/FY/;P Z7x)AEIMtJH|vp c?olrLftK0 Q굡 78v>4p|S ysU@)X|EMq7vJz?O[e>#|U@@ɮAx}}[jP\'L*U_WGvWj y$ƥ4! YGb7Ne>D+PPoYE@4p=a^T tyCZ_B424bcWv?-߂@i?q,üű&GqC{AuAbF?DW ? <l_iعױf}RG0#Cd)&ds% dv{*Fn4u jmU.`H'UG5:8 K%1 K@nY&1M?pt  ,~Sxlx,[])Jn(XrMQ,gg,*իy&79@ˌI$/cC[g~L.`>c&h&m&yS"Z >,f~l'C{9V_jOR|6ooظpq 9Fvtwf'J#%`5s l ;V|d|8M&D'U>΢3:)o iuPV92I? $!YH9o[-h4oN^ZDyϑՉ!^ Hz+BŃ=jXZ[ujFTc$'0o᪸ݴ8Uk+俚0jfGL#G ȍhh9_,`%.[5n2/w6F;6Ҟ ))[ՖΖ w]kv/\a.___O/9)Ŧϊe+ 7Z]āػNlӉԢx+ׂy}3ZCf Xư?1jJxUyRS4"Td&u"qq{ո0Qrl+lE2`ۆMlfJ`TL %:OvR84W-t٨ͤwJP2y?S[qu8d쒘~&q>Oɏd؀ʆ_,oQ$&'N^o~UcN%N7khP+7?wjyןIY{8 5N^~I_}+h +w'ԭ<0XauzǾ 2EoGk}?,D)|oZDӮ҇_a&9'TTjefOPf?9G ](oQVt"eEG:[b؁~*ԘcF Z lP;P?1j2+}vjwoCH=T`_d9U 7Qf9jdF.6GU9:>\ӱVχ3,o6ntHɌrY!y>mL1tIb0 ƥ:#˓P&ojM& .n3&|QQGg{de{,C_LJ9ߚlهPuR4=h8'Y4V@}gހbެ5CErwQٹUhQ%kPwbv%ȕ7PKtR=BK% ZoZR3QYԿ,mTbSr)WjXKèA w|-J x&5Ts'ܸ|DžGEZLjQ~x[?i6nv1*UI;/W| _]2~:VBKbN ܚjaQ-h\&޴5=լSR7mf쁝e%_xLTLDna=HirALbwToS`'YQ{ T.Ž7%.Z@dvJƇ ;BB , 1W[6{*\ԩ 0k'W3U'mAaxwx~6GioƗ-_JxPu|mn hI9.By(OсS5M{5.6& ~7 ѮS>l4e["! Uޅ&L sj#yAM-gśgP>,QRM[ a*2S5ٳ35槔Gu.抋x..(M*aZ-uѧx'و.ZAvouepJ* FKjڝtxGЧ6CsqmE3Ngi<РFb6GL~_-apPhsr^Gټ~Ӆ*5ۻ,bSf;ln&F5.fo*𧋔mr1/?YUWc0k!~mZs @#(#pwQbQYHѥL몑(Ko޾imLux*MxZHtoꂕ&T:H.[SܴR^rA1ΌPaݖ;KΌ&6gԃ\8jͱjͺ?zgm\`#fp]on$bi'_ 'G˵xJߪΓڵuyȌytWn{Qx]Nm®¶$bjG4Ujת.``V6vٍRU/j0_(m&n1@3t#8x"fdrܾtsq(PF*Q>[ Wק!r}[Ԉ:[?K$y?\|d 4=[L/ʲ0SPkɯhqg*S*w .,3jȝO/x񠘽U^*\8m?)9?c.2&}>j^r_%hIw fWV%,Ez|1؎XQ3o o-?$UE+u/gQG MzEMx bu35}%݈!$*sѢTU6}zФ'y$aԪWy/3eEٹ6&cNm\, 'ܧVhaq긴T2YhթAw<$Uk )s˜?@lq'07'pvN`^>TDG68w_ojт#)z̜l Ϫg  No wn=mXl# xsEvr}N;[쏳[FpQi5r+ۅUd1jF_~` b(MΟs8#'uZ wKq ڕ0n}"{c10ǣ~j1~ۭ]425z%Zp|с~/Gkpy^:CW5j~0ay0ruO/j"zK,/:g)#h*F5=4/\yFw8_Ga_̊ aPkln+ՔWʔWIu6KPI'mQxA.iՒCwtwS{tq@@S&0nˇ;c7~p][x uOS7]'ݤ$ڟD#;Wo ̯D~brr-4\t4Ky^*,)BfxӑU =&$ =+/]'K{]y|:2/z;g]t7/wm$p@t NH4' t݌VO1#)#r_7DWǫ7:@տ Z20dw}mq0*YhHUmTSOd?7N9(ZQQ54y&{$ tcǞ‘ Ze.vrc]1Pg"f9l_t>R#爫g(m qUcv=5\[.$a/. q6_'! wi9;cۗ7X2cOʻ;Qų=YW 8{>g+Jv{zkB xZ 26y0 1&@Swƍj9 _~z:AP/|la>rWͿ0} M3XnHn< nLZfY_gzUyߧ %xQxlX35pk>lV:fſNQ45i?+~ZkՆjthuُވ48lχ ;[*%4I TA/( :!%$Zq( s4/ƩefLmrLlBqLhPBF |dG>rF>|< x EɱlІqXPKD; Lmedia/js/jquery.jsUT PLJPLJux [mF޽1H8 Nre9D$11ߪ4w83R^>r 8)k;'݆1$c|u8sP;Z%7rZgkqc>_>U?6 U\C?k2s:QO9#][z`]2in]8bfvMu:mK 9ؚ+Z\q$Fc;?Y`ԯ3ϲaސZϰal. Z uw>4\DwXpuPn:<` yNlc<)J]LX36$AA}#+L<)aC^68WO4-f]ƒ|^<@mO {rkGP.A4[CI5V3=MEdM)JZKӑar<4 b90]4> />tȠEHA *5w_$҆^zi5 `4\o ,1hhpB})~I2iwAX{"`#erʦud76 sV|+ hl{.o5iGrOӸ } uN6#@^f,Ӑ6y+IuyםysgV$u^-2Α~G lzB# 5fS+[&]\`[MUղ "ͨ׏~.SPqMKbN5O!Dv#^^i+`L@]?X!(Ra-P~Э٦iZke$D+c-nK=}* •@SiddP i NǷ]IMdPrL1VNh/z'\lzN j NADο\n;7ÊkKF02 i:6`$cjeߗ}oCxxCN4>8k6LXߛLE]#?(0ЪK2ѮSu;3Y8Np̥Y!PfYL=1(N2ғvP60ɬ.00wa-\*գЋ!3GtlW ' 9>„aHUyYxֽñI~N2/J(jȾ78PsUVftG&,caݡ38irp%9ؔpZiM}q|1Spǡ]tQCv˭)$La`8냊׷%wٱ)h V 8dgbwR k7,o4鷩<$F^ €`L<7;sP GQ$ʶJ^yM"ăڜ8`n͝xl6H5K`!R=prR3 9ߍ}EG K侁`@N1' G` ۡB%p33!otv8/0-aۥ#I([ l ї;47D߃[96n6h6}2$b:`]sc06.TxuJvE.Z>^ݯP%usj*;㜀qw/cDt'm TU<a}WFs=@/†`<՗^{OJzEQ3*z[kFHV20=׋yQzi{Q|$bȼ5'σ#J6At>Ut92shc6αvu&1_SxɲM7%T=̯F);-2 w] sCߵt4t}; þܕ%%um_e ˳xIiO|w65~tX,D7 !h9B/w߹h><¢,c߱dJ kA"d[ؕllpjssPhr XiV>\q3G<$s1E3 P(޾ZD*QW%!݁F1uR֏F3iB|#j6dлawƾ2`nt08}nu8Ø &)9Q 7Heg>bbe_hCLj+4,5`탻{<.&0whJhW~H<:n?ю'*N' d\e8cBs ?k,fY)V0 /ñ@5!SPtyd]1qxM&~6j-aZvN)ۉ 9L\ԙ*g.֍~/q. ,> *۫ ~JπoyT}s6jtL0Q$ 𐬂/8, Հ"-ߜɪW,)l~_~MLzddpw]a9q9e1-R9m$^fTbQ)KNT}F:pOV[@Z)Q>25X'Ym=҈ڑ;.-r6Z>?SV@ zg4aފH A^Z\NȅqJ'zy;cp9pl44 wdicwO_wm-CA1n{*,5ܞİ/Uѓ1 -  ^7h3:xk={p9j DBBZw+C0_{ f2i0*%5FgwL" 5CAҿ#3ofSx 6y.'es9{u]n3#" JrBۘM(hUeм(?ttz0BXoȢ(e{>3Gy7JE:`eW;YcvEwƟt;%x]j1 UM=k[cip gWs5o0|)wePS29*V-/ؽ`}33C!eo&;C9 _x9O:vrLY 9?1)N{viY]5oZ07_qh0aU*ZI-)?} w;J}e?iNx&5\gf/׾ O 7ŋa!ŊDWCܑ%1)QF!&T9gy_Ƶ5t+znSͮŶB8H"R(D mRW1?ER(\Ap&*g+TBimX,Vh ·XS*ꐼYggTgsRo6v{3RvӋUL 5|H#IU Ceخ$R.WPF`\t7Xo 1r_()+uqbha|'aEDEx0j3ݲi%FI_nJeX1ܡ$.]PS5c7/ݍXu#bWTȊ{n.}#<@%\xbЀUoJa55QNaS9)0,Lv}\Ȩg (&p|˦2 L[UfX)gXD*x|`Qj,,vGm_SHT%T}[b7dΘޓfQtMSi$_n&qag+f9@܎ 5.?DB;8\B'T@ԷȦێO gŋ`>^ `yp1?ygV0puqQ›⿅1^x!4u۵ (EG" e^w\nb,y23}gʝ^2/kja:ӫ B,ƒ˹#5؂%숏~'"h(tL}"ENuWbeCr:zΎ|7qL.k-N-yjoT~\9x+O[·pYNk~ci_0  x.yޮV} Ħ<]&{xlx&w2%uKSdCfEi*yV+jůN}m2}XJjV~G9U++_dn4h!J X%#J҇ބd\ @^C^yS5=B{k$ { DR[i0@0ө5፬Uɝ.y?m4y`R6S>W_! zP-: ~;㝦#5/AHz5{H=KpM.%Yl-=pźHS]t k_sqEBK?4]v.,Ɣ b ΕCG]>l:/tI۲=)O/՜BtbU`q];1M`ͩjBLG+ΙP"s 8D^ntͰzpL: z1&ځ4 f;; S[K/#Tk)(DXҤtBnx#Mrc;JNb&QQm#7 )@9eZK:kw ?ۺ7p|Tc|U޻xj xw4ܿ(}+#hb#b/&',t%0C%/N+1=S _BeW+ғ`缚.^8k4aB>=ܮv[ &#VSOZGb4+A)ǒyXMeiH +3tG‡j V츹9ZI_(T1ֿ8J¥G8/4_#HA1Y[-ZG#:9N/ R@+tW)@_$wh$Ͽn#AwcF 31m߫QgRE>"\x/gj%!sRI/+ R"p8XNPbAh_ a_ sf#fF'O_!n˝cpH;_$4wLW+Z'A?2PBOj⫝̸,`05zso5ʅ #=+ 1в~Fu~RNJevNx'/f]2ˋv;_VW}//Lr_켓/Mn'38R`dݼX<~$1z@߼eB[[tr,\S[/-Z, RTdjl?m%" 綁fdm4:a!nylBn&΂D7h[&oED J.|ŠC$~OWڃ"](E n%D"舞t;3c2zL38|2bnA{tˁ*\*rm` w0R$HED Q.+[pknY5%Ja'sZ"H\uT`U;}䭊~5NӻTD;C3]e0?|jtV=~E7f#꫊ YL@TGj cL{/'xV~Ima3`XE vŹ9C'H$.5ۇVf.ܰ3Mli-MRiY{w\2[f&-kxCH4ւ7[Q3Msz]G]XvJn'v5< ҅0vi#Wh.+(ūd\LZI@X-qGZ@Y?yxտeukF%?x8I#Uk\x tkYK/Qdܷjb;pŽѭOI4))ls6JXNoآ׎`+ tծ7> w>R0{mN**):G7q1j#|l}b-D=rp;#亼'X7^`.d 1e3*>7hKFD"޶6u~yS>zYwhMCwIPnsGəuxFc$59.66+\63P$Qqyfr_-|V,ɍG(t+`q@}icڏ~GEtT\. =)i>TPQ4LSN77bJ'*ZqLFIMf&1nb|'JR'L?-߁;9xT0=-Cq-R|Zq[CM&  ,l#CVbQZYUU)Krq$ebck*F!nh;9`fvY!I4`nZĩ@Z5gx9'麖RVwkNDf},a [s:-3Qخb@t}j:[UEg3sfK`MKl׈6'=`6~^X܉wJ*ɍdNZXmV ?uw? dƎ&Le@oYyoiT%.`2 {M4[**+SFڅ=rc:Akxa7-|9 ;; m`/'2F/&wqupL8^\S19vqamqB!&=FkV&) _piӴ`'Rxa\$0;uG;ȓޑXq=3i{ŏ[v *g>P}p 1ishıt? U!CVh'G#d,xkmc0]S#ps,rkvE[fh&'/ǥ]qɫO@Ef2g.\a" 9ሲT(唰F_m;tS*v4 JU+~eJsp;4C`^⹨;м4~vAwxY{t5}\ʐe®Ы'7)#A¢P;VyA|y}66I<Qᤓ0hjЫ 7d.=Jv6V[5ۢtW'ZhC:wDs Jm 6wCѪ̜)=l2XrY,sX4㑏Ձm3]?vLNmD[6LNŌ,Wfy7<ȡ(70msF8nQ0m=E$I8XNdqOv ҹ? s)ӥZHdL޶Ն) r'I0q66l/e{DRA|h* GK1. .;2 IllYO WSYNDdZ|Md4Ekh6JdNe0q 8?.cgqu?z_ ,T\*kx<}?xu멭[@9'ҵ Gk7}r#tZ8XN]NjEH_`5_ +/M ̖X\* 媍p)Kkɰ{|uxPS:yo*C+o)۲Uj BΑNSy|J^W+$= 9@Tk;5%;"z r"i>$lVw&yf*EwY<.4|LuۛFOiWIм~ ˁ `d)Iסj\]6/ϵ|P|?q-v)BtWcP !唬DU&h4"WWr<( ,Xl\B "vRmFIRdr 3пH"QtInLZ U*\h.ظVSNDHŨfApn=۸|/)hEQ\#D%Ljqs\`X[Ս˦zHu &]4}ۤ0)_ +[ ȖGLA]7!LϴgsbX8Jr|q Ȼ;~J2etow,h3Rc8G8{OpL?ǶHY@ugW);@́yDM;u;qAtK/tEY->6elAKgBO7[Dh&i>ΰp*lY}ݭ-@Wn*?4ڳչΞ6x/gkS7*N:rdbsQaId[UWFfpkh@Fwl]ݱlN8guh3E^G ص7L D%5Cd Qkl<+g'Hamb1Ш4X:[ 6+Vl}uA39I6]<ZY]XmQ˝l/Wxd_-BM % /YniJ_eH6Y.|k0m D\׳f]cvnѾ:R$ڽ`O y #zf\ rцPÆc!!n] |mbCʁ3!,Kh)lwHLYyHt0i) ~9F~d/]gi"KmAJm쬓Mx,?=ar4}±|ɑV;=9N].OS4+Ҕ5He$ g\./ T(9e_xL!<$cXQ]Ьh~JiOK0]UCp˅$ߪСxptd@YՑ[zmS3S&d@I|rx// YИv`f`rO)?BЄu{ = -ec * zr&z 6HMW 1J7[eT5EڻN"3Ae 媸: o#]}s`ELmտ[WuoB9PIFE؃d!SPx ߨw2r S@!(!EŔas/&E5r} F$y涯勎=vo^SDh_&$}_+ۋ֯02 vTx4nk6B…m[ HlkXSa v"K7 ;Jq5M)ZpL:ʨfTe$@l>GP BE-b'rc6S%ʢ!/ FE @Ort3?%pշŦG\0W[E.(q!뙐g ]J1ڍ`ϒ涍'1:?2 e)ȃ,%{$!7}XĈ#$7*SXɘȪ ;OCC-aE 8pDK(ԑ{xuZw/DկV># 27 Yb\vjOWP9~~f. P6?j]fddI90$|KUuN/LӽPD-媤gj?Eyqoavb_:eAsXU̙z$ k.} k8ϢT8RfIKbX iل sA@nwl?~;J._;oj~JS˥ ^p^cҍ|"g?FmutcL][pgVhU>oNWea5W NObQ٫oZ /+0k҉0섐t~EcTDY-1D ?}uMjNa AufWt{EWh8 8)w4b~P6 >a`t=L32"0#dd{ Ҡ`WbѦmSdvFr&m$ދ[ԑ+e`y뵥<;ɬQDZ+j~|Qw$nzEnCa C=X C5pFJ؊rEgAqk1GXcN߿oȰ =*Qute-hMpp+_T7*Fć?w`&3NUfؓx_,vh;{nUsŹ9"f5Ek9c,< 7/ S} ]j8$y";"ÙL^RmTXPj7-.{\Wa/i8A"cAQa kD|BrQU d>%%FnYٝSbx+?`PR1E[^u}w#͏ wbHGj>]>^nJ2[s&Г"sg7VmDxI-{@+~3H}m!K] LĎ4Pljd+ h-hf|WH+?4r)id S1파[94&)%+LxT$ n#O.m(Y\(CP?SΫ'z*Z"fiT+6%V%w*px&ܷ,SixAqAՐ)\`W+_e{,wwWe >^UgWFqi6˵ʝdgSܞ48s, :i-DH佇W=A^QStW+-͉d i T"M(xNlMFBy'NfǮ!q6DZAS7O|D4cy0;=`}@ć1H:x(3x9_ZZd$'7PZ jKf:q QбIC*A ׫jͭh2R]శ|AH/V$^!keEOs ˵Q<=]%A J/P <SR(/dʼGAJ<˽#]j b1sq`Tv>ʰfJ>^ '^k + px]ʕP  o>Iy'Ì c9{uXО=5OyEK!v&vC3FAW%KI Q;nR=ZcYʐL^?3^4`]sh{|MR[cVw]CWk\ϮHr/5knM3&dβђUL93/,vĻP XH6CJր P&EC՗(uШq yEX;Y=!h] C-,F}M!/Y1V$x<9Z]B.ÆsavچE #qkv};C,Ƨ:(gPA\{a?_O83Y؛H8R+䠚^wb|$: 1QC>?[M/ʜ?X]P#mڋ=t!}8+X]'X|OC-9'2lwшWNaؙe|r!,u#j5X,XQ|0 ~nfr0Ms2 jAgZۊN#aX"b-&A`DKŁm0EePXC^pE`tu e KxJ^?dkUڣUKȠkx  7WmlD淘/V r67z-sezG^w>j`4-UhqBf|B7r-LnROQկ->$lvW,vKVQ!RP9$+;3J1`E1^#;R."ڨf^Csu`Yk5h%'QY+}HZbz1EVs} "U>gW P`0Yfc$,,zV>[j)t{n?:ރzyP\STqI a;9xq<x;J)؇Q;C>FGCRTs#*PE%2(y-c6`?LZ\Xҵ=}zн= }aŞt7ID22 |yDd+nXZ'Od.%}Bozo-hmdju.k4inKsu|)DƯpM@ δDOEI | g&"h14!/tT&S#V6]>$1PGfY#C&CFlfAoدMxvVxWfYͱ#K`ml4b*>K;Mhqcyٜ]MG#Ҝ1h:kAZce̠ s"jmV:`YfUd*]{6?+lhXRc}^ ɒIǓ7jc1MTp?㔯DE#V qkťº.܋,3# gҤ.<G6ZLᦩ"lKkݐZ3!\ƣ*;Վ٪"OpV Fz|QKX(T`QJ#8C'"z*T?xRe͘SV;J#$nʤBؽE.g^0gSJn8{v[$"BjBn(e bG'-nVxIBZ8sy8o75n*q3+u%miVaHbEPK D; templates/UT PLJLJux PKD;s8templates/custom.htmlUT PLJPLJux SN0}W\,Z+BHi`C 6q8i!}N"؎9:<-n/ "ο@ o&3bpƈg_l$(M+lh٨];LZkLT$M/JBIc5/`Ċsn(˂KJAģr|*,79ٌdS%Jbl-rz%5&⇓ћxT9FU ;&+l"]ɵxW+Ŵ㰟q]=ku̪Co{z]}G?ʤqSZN. 2ww]Ԩnd^er"}ۣ6\PT8kZ߁G)pW?\K/# templates/index.htmlUT PLJPLJux Vo6~_q`Af؀n :A:Kt$%)+GIvXYM}}_>Nח!e؈|Sŀޯ.8:Ǒ}ΝJ()KN0^(K~_*0iGG~Bh<\X~RWc\a!M 2:1oWZB;XL]KL9n9}%prUHB~L _"Qɓfgɵ,bˤƜ @c 5ނX(@v8ppV@|THM.Ŷ\RsAc?԰V;PRuRW=t {T^]} Kʒ?tLz#t@Cyn A?|ɴSX[ x79I47AN8Aܚ5I{s^]7PK D;tests/UT PLJZLJux PK D;tests/functional/UT ZLJLJux PKD;mtests/functional/__init__.pycUT ZLJZLJux ++ YD CHO$F TĤ}|bҼ̼̒xbVҜT; PK D;tests/functional/__init__.pyUT PLJZLJux PKD;5ZN%tests/functional/test_controllers.pycUT ZLJZLJux Tn@u4O(HSsJxT !T!ድ' " '}x^f4R^oS{NE"W b5Pu7@^ MP-[պ-Pm۠:w@` kolv!k𻦰=oAքu @ .>;dNZ!ۂ>Le<=ŔsSz]R~b 7NtV ]dRtڸ.ƥ.XX>9Z[t./vZ( ghm7b/sQcʂ)q>y_\R.eM(+.~ |ƾ(vb45-t.{HgB f* L/Ug ^`ވ.Z9šn4;!텵hkcUS(0 {Lb4<79+sD둣jdY[*oH t;,WI*6aMXݠ¹E"IxubeԽz#G)WE[I6FИQqIو'(L, U9k3q$gX4T5FjѻveSZf^%yb, KMrY&R)ic\˿GbO}a8 PKD;r$tests/functional/test_controllers.pyUT PLJZLJux mRn k:خR,K%D9œ[Id޽wO{hX~1|#l?PH0ޭM!L$@=PN\{Ab᛬_zdC>rC\)o}RpBȟ9W0CZ{(>ck!1I x]=SRuTU@XC!e안$9;Π<.HF%r=k:<">,]UAi6,8#1{|` z~G-AdG6jդS. ե9{˹׶"C~pgf c &&rY{FBu{zQ?PK D; tests/unit/UT ZLJLJux PKD;c3rftests/unit/__init__.pycUT ZLJZLJux ++ YD CHO$F TĤ}|bҼL WPYdRj2dPK D;tests/unit/__init__.pyUT PLJZLJux PKD;l/tests/unit/test_controllers.pycUT ZLJZLJux X[s5֮禎-6%%`8Kt040 PWWJI<W<p>k$t&Clk$];ggϺlWGSԄuXmwYa˶]`\blle֯ʶ4*=خ3,O8~u͖C]]ܷYjD}pNcOW&:q,R+]LpcBCj@,"N)AJt [2 1?#ˑ9LXTƁOV1M5mЏJuC.3`evX2bY{}K#᦮#1ƁjzMBӃXy`y4J%¶=N-Ii ZMZġ+=O͖|1#ݻ'}ZowG2\Q4:fzJ 76FN`BVj%]7]Ɔ[?]-B?\`ў-c>5^F"|"T_agWL(9|-nW ESsSrNәu\R@ ceK.v;UrZ 0eH^@L#htXSo)-*F0AWG2id8yc, 1Zß,g`[mr7SCqCķBE2953#9y¯mǶx9lQlbmA& 63m6 |w‾*u?M(,k%iWh)* /65WR#$bTu tveγ9w,;u4Fy˃r'Gq5 f{KkRtdgF*^WظJ#^`tk4N*ZFtx~@4+wIL4N5*8{^ͼ;z^ܦsսdx~f;Q--[[ N`B80q nᯡuz\^B扠˓0o \h/?eAZ:%LVTfqǧ9bd"!jyv| _NϤ~O(70+(D(_hASw0Lab\jx2zųvQ5xex&W A3},?&t{"MB %^{Pҁ.*E\H|p:$v<,B&T&{TTi>a߬;Eǂ6 Pom4vEM!is%w1D3ud"XRƊO ֨ yƬo1h:qPKD;+b/Ctests/unit/test_controllers.pyUT PLJZLJux Wk0~_!2>a=A Fī,yM(wTvm*BHݧ>oH6$ZƤ,|fFyQj$] c6f]Bv\9@ki%f0IlWSh)Q*ј|΄6 EF-\qNR&M?&YA!+d6mlp ?8|tOFP->U-չNɌPE),v=CS~iD~vcʨڪ,1_<.D+6pq# >}IB \J\hl4.E c0 whK BxH @Y?d*LgB{e8Bm{Lʂ.-~!$,\W k2#ADcB@z7=5i^&A q_:aiF9 ?U;ݞZA?6hH&&M^ǘd^04H /QO7+6@Kt6n\m`5دUM0-|'E8HJW:{C"y|vr;v1wIH`mejLQg<\)j(UzM.|]9 ۹aLtXy|OzW$iS0$Y3R瑒` }+-5R S%PK D;Aapp/UTZLJux PKD;ɂ1o!>app/controllers.pyUTPLJux PKD;4%papp/controllers.pycUTZLJux PKD;Ls0`app/__init__.pycUTZLJux PK D;app/__init__.pyUTPLJux PK D;Amedia/UTPLJux PK D; Amedia/img/UTPLJux PKD;''C*Umedia/img/loader.gifUTPLJux PKD;n-/media/img/sponge.pngUTPLJux PK D; AEmedia/css/UTPLJux PKD;/media/css/960.cssUTPLJux PKD;*?nuymedia/css/reset.cssUTPLJux PKD;slrmedia/css/text.cssUTPLJux PKD;H?" media/css/main.cssUTPLJux PK D; A3media/js/UTPLJux PKD;xΥtvmedia/js/jquery.ui.jsUTPLJux PKD; LFmedia/js/jquery.jsUTPLJux PK D; Aptemplates/UTPLJux PKD;s8templates/custom.htmlUTPLJux PKD;W># templates/index.htmlUTPLJux PK D;Antests/UTPLJux PK D;Atests/functional/UTZLJux PKD;mtests/functional/__init__.pycUTZLJux PK D;tests/functional/__init__.pyUTPLJux PKD;5ZN%tests/functional/test_controllers.pycUTZLJux PKD;r$2tests/functional/test_controllers.pyUTPLJux PK D; Atests/unit/UTZLJux PKD;c3rfGtests/unit/__init__.pycUTZLJux PK D;tests/unit/__init__.pyUTPLJux PKD;l/Ntests/unit/test_controllers.pycUTZLJux PKD;+b/CGtests/unit/test_controllers.pyUTPLJux PK {sponge-0.3.1/sponge/bob/0000755000175000017500000000000011244504415014637 5ustar gabrielgabrielsponge-0.3.1/sponge/bob/__init__.py0000755000175000017500000001324611244504415016761 0ustar gabrielgabriel#!/usr/bin/env python # -*- coding: utf-8 -*- # # Copyright (C) 2009 Gabriel Falcão # Copyright (C) 2009 Bernardo Heynemann # # 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 . import re import sys import yaml import cherrypy import optparse from sponge import __version__ as version from sponge.core import ConfigValidator, SpongeConfig from sponge.core.io import FileSystem from sponge.data import SpongeData basic_config = { 'run-as': 'wsgi', 'host': '0.0.0.0', 'port': 4000, 'autoreload': True, 'application': { 'classes': { 'HelloWorldController': '/', 'AjaxController': '/ajax', }, 'image-dir': None, 'path': None, 'template-dir': None, 'static': { '/media': None, }, }, } class Bob(object): """Sponge Bob is the responsible for managing the user's application and its modules.""" ACTIONS = [ ('create', ' - creates a new project, which means creating a new folder in current directory, named projectname'), ('go', 'start the cherrypy server using the configuration file settings.yml in current directory.'), ('start', ' executes both bob create and bob go'), ] def __init__(self, parser=None, fs=None): self.parser = parser if not self.parser: self.parser = optparse.OptionParser(usage=self.get_help(), description=__doc__, version=version) self.fs = fs if not self.fs: self.fs = FileSystem() def get_help(self): actions = "\n".join(["%s %s" % (k, v) for k, v in self.ACTIONS]) usage = "\n %s \n\nTo use type %%prog [options]" \ " or %%prog -h (--help) for help with" \ " the available options\n\nACTIONS:\n\n%s" % (self.__doc__, actions) return usage def exit(self, code=1): raise SystemExit(code) def run(self): accepted = [a[0] for a in self.ACTIONS] options, args = self.parser.parse_args() error_msg = '\nBob got a error when %s.\n %s\n' if not args: msg = '\nmissing argument, choose one in %s\n' sys.stderr.write(msg % ", ".join(accepted)) self.exit() if args[0] not in accepted: msg = '\n%s is an invalid argument, choose one in %s\n' sys.stderr.write(msg % (args[0], ", ".join(accepted))) self.exit() return getattr(self, args[0])(*args[1:]) def configure(self): current_full_path = self.fs.current_dir() full_path = self.fs.current_dir("settings.yml") raw_yaml = self.fs.open(full_path, 'r').read() orig_dict = yaml.load(raw_yaml) validator = ConfigValidator(orig_dict) config = SpongeConfig(cherrypy.config, validator) config.setup_all(current_full_path) def go(self): self.configure() cherrypy.quickstart() def create(self, project_name=None): if not project_name: error_msg = 'missing project name, try ' \ 'something like "bob create foobar"' sys.stderr.write("\n%s\n" % error_msg) self.exit() path = self.fs.current_dir(project_name) if self.fs.exists(path): error_msg = 'The path "%s" already exists. ' \ 'Maybe you could choose another ' \ 'name for your project ?' % path sys.stderr.write("\n%s\n" % error_msg) self.exit() self.fs.mkdir(path) cfg = self.fs.open(self.fs.join(path, 'settings.yml'), 'w') cdict = basic_config.copy() media_path = self.fs.join('media') cdict['application']['static']['/media'] = media_path controller_path = self.fs.join('app', 'controllers.py') cdict['application']['path'] = controller_path image_path = self.fs.join('media', 'img') cdict['application']['image-dir'] = image_path template_path = self.fs.join('templates') cdict['application']['template-dir'] = template_path yml_data = self.fix_yml(yaml.dump(cdict, indent=True)) cfg.write(yml_data) cfg.close() zip_file = SpongeData.get_file('project.zip') self.fs.extract_zip(zip_file, path) def fix_yml(self, yml): yml = re.sub('[ ]+{', '{', yml) pattern1 = r'(?P[ ]+)(?P

[^{]+)[{](?P[^}]+)[}]'
        replacement1 = r'\g\g
\n  \g\g'
        yml = re.sub(pattern1, replacement1, yml)
        pattern2 = r'(?P[ ]+)(?P
[^,]+)[,][ ]*'
        replacement2 = r'\g\g
\n  \g'
        yml = re.sub(pattern2, replacement2, yml)
        return yml

    def start(self, project_name=None):
        self.create(project_name)
        self.fs.pushd(project_name)
        self.go()

    def get_file_path(self):
        return __file__

def run(*args, **kw):
    bob = Bob(*args, **kw)
    sys.exit(bob.run())
sponge-0.3.1/sponge/template.py0000644000175000017500000000533711244504415016272 0ustar  gabrielgabriel#!/usr/bin/env python
# -*- coding: utf-8 -*-
# 
# Copyright (C) 2009 Gabriel Falcão 
# Copyright (C) 2009 Bernardo Heynemann 
#
# 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 .

import cherrypy
from genshi.template import TemplateLoader

def make_url(url):
    if not isinstance(url, basestring):
        raise TypeError('sponge.template.make_url ' \
                        'takes a string as param, got %r.' % url)
    if url.startswith('/'):
        url = url[1:]

    base = cherrypy.request.base
    if base.endswith('/'):
        base = base[:-1]

    return "%s/%s" % (base, url)

def render_html(filename, context=None, template_path=None):
    if context is None:
        context = {}

    if not isinstance(filename, basestring):
        raise TypeError('sponge.template.render_html ' \
                        'takes a string as filename param, got %r.' % filename)

    if not len(filename):
        raise TypeError('sponge.template.render_html ' \
                        'filename param can not be empty.')

    if not isinstance(context, dict):
        raise TypeError('sponge.template.render_html ' \
                        'takes a dict as context param, got %r.' % context)

    if 'make_url' in context.keys():
        msg = 'The key "make_url" is already in ' \
              'template context as: %r' % make_url
        raise KeyError(msg)

    if template_path is None:
        try:
            template_path = cherrypy.config['template.dir']
        except KeyError:
            raise LookupError('You must configure "template.dir" string in ' \
                              'CherryPy or pass template_path param to render_html')

    elif not isinstance(template_path, basestring):
        raise TypeError('sponge.template.render_html ' \
                        'takes a string as template_path param, got %r.' % template_path)

    context['make_url'] = make_url
    loader = TemplateLoader(template_path,
                            auto_reload=True)
    template = loader.load(filename)
    generator = template.generate(**context)
    return generator.render('html', doctype='html')

sponge-0.3.1/sponge/helpers/0000755000175000017500000000000011244504415015537 5ustar  gabrielgabrielsponge-0.3.1/sponge/helpers/image.py0000644000175000017500000000762011244504415017200 0ustar  gabrielgabriel#!/usr/bin/env python
# -*- coding: utf-8 -*-
# 
# Copyright (C) 2009 Gabriel Falcão 
# Copyright (C) 2009 Bernardo Heynemann 
#
# 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 .

import os
import Image
import ImageDraw
import cherrypy
import StringIO

def jpeg(path, base_path=None):
    if not isinstance(path, basestring):
        raise TypeError('jpeg() takes a string as parameter, got %r.' % path)

    if not base_path:
        base_path = cherrypy.config['image.dir']

    fullpath = os.path.join(base_path, path)

    try:
        img = Image.open(fullpath)
    except IOError, e:
        cherrypy.response.status = 404
        return unicode(e)


    sfile = StringIO.StringIO()
    img.save(sfile, "JPEG", quality=100)
    cherrypy.response.headers['Content-type'] = "image/jpeg"
    return sfile.getvalue()

# Based in the original, public license, version from Kevin Cazabon
# 

def crop_to_fit(img, output_size):
    live_area = (0, 0, img.size[0] - 1, img.size[1] - 1)
    live_size = (live_area[2] - live_area[0], live_area[3] - live_area[1])

    # calculate the aspect ratio of the live_area
    live_area_aspect_ratio = float(live_size[0])/float(live_size[1])

    # calculate the aspect ratio of the output image
    aspect_ratio = float(output_size[0])/float(output_size[1])

    # figure out if the sides or top/bottom will be cropped off
    if live_area_aspect_ratio >= aspect_ratio:
        # live_area is wider than what's needed, crop the sides
        crop_width = int((aspect_ratio * float(live_size[1])) + 0.5)
        crop_height = live_size[1]
    else:
        #live_area is taller than what's needed, crop the top and bottom
        crop_width = live_size[0]
        crop_height = int((float(live_size[0]) / aspect_ratio) + 0.5)

    # make the crop
    left_side = int(live_area[0] + (float(live_size[0] - crop_width) * 0.5))
    top_side = int(live_area[1] + (float(live_size[1] - crop_height) * 0.5))


    outputImage = img.crop((left_side, top_side, left_side + crop_width, top_side + crop_height))

    # resize the image and return it
    return outputImage.resize(output_size, 3)

def picture(path,
            width,
            height,
            crop=True,
            center=True,
            background=0xffffff,
            base_path=None):

    if not isinstance(path, basestring):
        raise TypeError('picture() takes a string as path parameter, got %r.' % path)

    if not isinstance(width, int):
        raise TypeError('picture() takes a integer as width parameter, got %r.' % width)

    if not isinstance(height, int):
        raise TypeError('picture() takes a integer as height parameter, got %r.' % height)

    if not base_path:
        base_path = cherrypy.config['image.dir']

    wished_size = width, height
    img = Image.open(os.path.join(base_path, path))

    if crop:
        img = crop_to_fit(img, (width, height))

    if center:
        old_img = img
        img = Image.new('RGBA', (width, height), background)
        ow, oh = old_img.size
        left = (width - ow) / 2
        top = (height - oh) / 2
        img.paste(old_img, (left, top))

    sfile = StringIO.StringIO()
    img.save(sfile, "JPEG", quality=100)
    cherrypy.response.headers['Content-type'] = "image/jpeg"
    return sfile.getvalue()
sponge-0.3.1/sponge/helpers/__init__.py0000644000175000017500000000151511244504415017652 0ustar  gabrielgabriel#!/usr/bin/env python
# -*- coding: utf-8 -*-
# 
# Copyright (C) 2009 Gabriel Falcão 
# Copyright (C) 2009 Bernardo Heynemann 
#
# 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 .
sponge-0.3.1/sponge/helpers/pagination.py0000644000175000017500000001121511244504415020242 0ustar  gabrielgabriel#!/usr/bin/env python
# -*- coding: utf-8 -*-
# 
# Copyright (C) 2009 Gabriel Falcão 
# Copyright (C) 2009 Bernardo Heynemann 
#
# 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 .
#
# took from django paginator (MIT License)

from math import ceil

class InvalidPage(Exception):
    pass

class PageNotAnInteger(InvalidPage):
    pass

class EmptyPage(InvalidPage):
    pass

class Paginator(object):
    def __init__(self, object_list, per_page, orphans=0, allow_empty_first_page=True):
        self.object_list = object_list
        self.per_page = per_page
        self.orphans = orphans
        self.allow_empty_first_page = allow_empty_first_page
        self._num_pages = self._count = None

    def validate_number(self, number):
        "Validates the given 1-based page number."
        try:
            number = int(number)
        except ValueError:
            raise PageNotAnInteger('That page number is not an integer')
        if number < 1:
            raise EmptyPage('That page number is less than 1')

        if number > self.num_pages:
            raise EmptyPage('That page contains no results')

        return number

    def page(self, number):
        "Returns a Page object for the given 1-based page number."
        number = self.validate_number(number)
        bottom = (number - 1) * self.per_page
        top = bottom + self.per_page
        if top + self.orphans >= self.count:
            top = self.count
        return Page(self.object_list[bottom:top], number, self)

    def _get_count(self):
        "Returns the total number of objects, across all pages."
        if self._count is None:
            try:
                self._count = self.object_list.count()
            except (AttributeError, TypeError):
                # AttributeError if object_list has no count() method.
                # TypeError if object_list.count() requires arguments
                # (i.e. is of type list).
                self._count = len(self.object_list)
        return self._count
    count = property(_get_count)

    def _get_num_pages(self):
        "Returns the total number of pages."
        if self._num_pages is None:
            if self.count == 0 and not self.allow_empty_first_page:
                self._num_pages = 0
            else:
                hits = max(1, self.count - self.orphans)
                self._num_pages = int(ceil(hits / float(self.per_page)))
        return self._num_pages
    num_pages = property(_get_num_pages)

    def _get_page_range(self):
        """
        Returns a 1-based range of pages for iterating through within
        a template for loop.
        """
        return range(1, self.num_pages + 1)
    page_range = property(_get_page_range)

class Page(object):
    def __init__(self, object_list, number, paginator):
        self.object_list = object_list
        self.number = number
        self.paginator = paginator

    def __repr__(self):
        return '' % (self.number, self.paginator.num_pages)

    def has_next(self):
        return self.number < self.paginator.num_pages

    def has_previous(self):
        return self.number > 1

    def has_other_pages(self):
        return self.has_previous() or self.has_next()

    def next_page_number(self):
        return self.number + 1

    def previous_page_number(self):
        return self.number - 1

    def start_index(self):
        """
        Returns the 1-based index of the first object on this page,
        relative to total objects in the paginator.
        """
        # Special case, return zero if no items.
        if self.paginator.count == 0:
            return 0
        return (self.paginator.per_page * (self.number - 1)) + 1

    def end_index(self):
        """
        Returns the 1-based index of the last object on this page,
        relative to total objects found (hits).
        """
        # Special case for the last page because there can be orphans.
        if self.number == self.paginator.num_pages:
            return self.paginator.count
        return self.number * self.paginator.per_page
sponge-0.3.1/Makefile0000644000175000017500000000300611244504415014241 0ustar  gabrielgabrielversion := `python -c 'import sponge; print sponge.__version__'`
package-name := sponge-${version}
debian-name := python-sponge_${version}
debian-tarball-name := ${debian-name}.orig.tar.gz

all: clean test

clean:
	@echo "Cleaning up all *.pyc files ..."
	@find . -name '*.pyc' -delete
	@echo "Cleaning up coverage metadata ..."
	@rm -f .coverage
	@echo "Cleaning up build files ..."
	@rm -rf build
test:
	@echo "Running all tests ..."
	@nosetests -sd --with-coverage --cover-package=sponge tests/unit tests/functional
	@echo "Done."

unit:
	@echo "Running unit tests ..."
	@nosetests -sd --with-coverage --cover-package=sponge tests/unit
	@echo "Done."

functional:
	@echo "Running functional tests ..."
	@nosetests -sd --with-coverage --cover-package=sponge tests/functional
	@echo "Done."

build: test
	@echo "Building sponge"
	@python setup.py build
	@echo "Done."

tarball: test
	@make clean
	@echo "Preparing tarball ..."
	@cp -drf . ../${package-name}
	@rm -rf ../${package-name}/.git
	@echo "Creating tarball ..."
	@tar czf ${package-name}.tar.gz ../${package-name}
	@rm -rf ../${package-name}
	@echo "Tarball created at at "${package-name}.tar.gz

deb-tarball: test
	@make clean
	@echo "Preparing tarball ..."
	@cp -drf . ../${package-name}
	@rm -rf ../${package-name}/.git
	@rm -rf ../${package-name}/debian
	@rm -rf ../${package-name}/docs/_build
	@echo "Creating tarball ..."
	@tar czf ../${debian-tarball-name} ../${package-name}
	@cp -drf debian ../${package-name}/debian
	@echo "Tarball created at at ../"${debian-tarball-name}sponge-0.3.1/settings.yml.example0000644000175000017500000000077411244504415016627 0ustar  gabrielgabrielrun-as: standalone # possible values: standalone, wsgi
host: 127.0.0.1
port: 8080
autoreload: true
application:
  path: /home/user/projects/web-app/module
  template-dir: /home/user/projects/web-app/html
  image-dir: /home/user/projects/web-app/images
  static:
    /media: /home/user/projects/web-app/static_media

  classes:
    SomeController: /

databases:
  media: mysql://root@localhost/webapp_media
  general: postgres://root:p4ssword@localhost/webapp_general
  metadata: sqlite:///webapp_metadata.db
sponge-0.3.1/tests/0000755000175000017500000000000011244504474013751 5ustar  gabrielgabrielsponge-0.3.1/tests/functional/0000755000175000017500000000000011244504474016113 5ustar  gabrielgabrielsponge-0.3.1/tests/functional/test_template.py0000644000175000017500000000631211244504474021341 0ustar  gabrielgabriel#!/usr/bin/env python
# -*- coding: utf-8; -*-
#
# Copyright (C) 2009 Gabriel Falcão 
#
# 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 2 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, write to the
# Free Software Foundation, Inc., 59 Temple Place - Suite 330,
# Boston, MA 02111-1307, USA.
import os
import cherrypy
from sponge import template
from utils import assert_raises

templates = os.path.abspath(os.path.join(os.path.dirname(__file__), 'templates'))

def test_render_html_param_filename_takes_string():
    assert_raises(TypeError, template.render_html, None, None,
                  exc_pattern=r'sponge.template.render_html ' \
                  'takes a string as filename param, got None.')
    assert_raises(TypeError, template.render_html, 5, None,
                  exc_pattern=r'sponge.template.render_html ' \
                  'takes a string as filename param, got 5.')

def test_render_html_param_filename_should_not_be_empty():
    assert_raises(TypeError, template.render_html, '', None,
                  exc_pattern=r'sponge.template.render_html ' \
                  'filename param can not be empty.')

def test_render_html_complains_cherrypy_not_configured_when_no_template_path_specified():
    assert_raises(LookupError, template.render_html, 'index.html', {},
                  exc_pattern=r'You must configure "template.dir" ' \
                  'string in CherryPy or pass template_path param ' \
                  'to render_html')

def test_render_html_param_template_path_takes_string():
    assert_raises(TypeError, template.render_html, 'index.html', {},
                  template_path=1,
                  exc_pattern=r'sponge.template.render_html ' \
                  'takes a string as template_path param, got 1.')
    assert_raises(TypeError, template.render_html, 'index.html', {},
                  template_path={},
                  exc_pattern=r'sponge.template.render_html ' \
                  'takes a string as template_path param, got {}.')

def test_render_html_param_template_path_takes_string():
    assert_raises(TypeError, template.render_html, 'index.html', {},
                  template_path=1,
                  exc_pattern=r'sponge.template.render_html ' \
                  'takes a string as template_path param, got 1.')
    assert_raises(TypeError, template.render_html, 'index.html', {},
                  template_path={},
                  exc_pattern=r'sponge.template.render_html ' \
                  'takes a string as template_path param, got {}.')

def test_render_html():
    got = template.render_html('test1.html', dict(title='foo', header='bar'), template_path=templates)
    assert 'My title: foo' in got
    assert '

My header: bar

' in got sponge-0.3.1/tests/functional/test_file_system.py0000644000175000017500000000573211244504474022056 0ustar gabrielgabriel#!/usr/bin/env python # -*- coding: utf-8; -*- # # Copyright (C) 2009 Gabriel Falcão # Copyright (C) 2009 Bernardo Heynemann # # 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 2 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, write to the # Free Software Foundation, Inc., 59 Temple Place - Suite 330, # Boston, MA 02111-1307, USA. from os.path import abspath, dirname, join, split from nose.tools import assert_equals from sponge.core.io import FileSystem def test_abspath(): fs = FileSystem() p = fs.abspath(".") p2 = abspath(".") assert p == p2 def test_current_dir_with_join(): fs = FileSystem() got = fs.current_dir("etc") expected = join(abspath("."), "etc") assert_equals(got, expected) def test_current_dir_without_join(): fs = FileSystem() got = fs.current_dir() expected = abspath(".") assert_equals(got, expected) def test_join(): fs = FileSystem() p = fs.join(fs.abspath("."), "test") p2 = join(abspath("."), "test") assert p == p2, "Expected:\n%r\nGot:\n%r" % (p2, p) def test_dirname(): fs = FileSystem() p = fs.dirname(fs.abspath(".")) p2 = dirname(abspath(".")) assert p == p2, "Expected:\n%r\nGot:\n%r" % (p2, p) def test_recursive_locate(): fs = FileSystem() files = fs.locate(path=abspath(join(dirname(__file__), "files_to_locate")), match="*.txt", recursive=True) assert files assert isinstance(files, list) assert len(files) == 2 assert split(files[0])[-1] == "test.txt" assert split(files[1])[-1] == "test2.txt" assert split(split(files[1])[0])[-1] == "sub" def test_non_recursive_locate(): fs = FileSystem() files = fs.locate(path=abspath(join(dirname(__file__), "files_to_locate")), match="*.txt", recursive=False) assert files assert isinstance(files, list) assert len(files) == 1 assert split(files[0])[-1] == "test.txt" def test_open_non_abspath(): fs = FileSystem() assert fs.open('tests/functional/data/some.txt', 'r').read() == 'some text here!\n' def test_open_abspath(): fs = FileSystem() assert fs.open(abspath('./tests/functional/data/some.txt'), 'r').read() == 'some text here!\n' def test_open_raw_non_abspath(): fs = FileSystem() assert fs.open_raw('tests/functional/data/some.txt', 'r').read() == 'some text here!\n' def test_open_raw_abspath(): fs = FileSystem() assert fs.open_raw(abspath('./tests/functional/data/some.txt'), 'r').read() == 'some text here!\n' sponge-0.3.1/tests/functional/utils.py0000644000175000017500000000612011244504474017624 0ustar gabrielgabriel#!/usr/bin/env python # -*- coding: utf-8; -*- # # Copyright (C) 2009 Gabriel Falcão # # 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 2 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, write to the # Free Software Foundation, Inc., 59 Temple Place - Suite 330, # Boston, MA 02111-1307, USA. import re import sys def assert_raises(exception, callable, *args, **kwargs): ''' Discussion assert_raises() adds two optional arguments: "exc_args" and "exc_pattern". "exc_args" is a tuple that is expected to match the .args attribute of the raised exception. "exc_pattern" is a compiled regular expression that the stringified raised exception is expected to match. Original url: http://code.activestate.com/recipes/307970/ Author: Trent Mick Usage: assert_raises(ExceptionType, method_to_execute, arguments_to_method, kwargs_to_method, exc_pattern=r'^.+$') Please note that exc_pattern is not required, but if passed matches the exception message. Fail Conditions Fails on exception not raised, wrong exception type or invalid exception message. ''' if "exc_args" in kwargs: exc_args = kwargs["exc_args"] del kwargs["exc_args"] else: exc_args = None if "exc_pattern" in kwargs: exc_pattern = kwargs["exc_pattern"] if isinstance(exc_pattern, basestring): exc_pattern = re.compile(exc_pattern) del kwargs["exc_pattern"] else: exc_pattern = None argv = [repr(a) for a in args]\ + ["%s=%r" % (k,v) for k,v in kwargs.items()] callsig = "%s(%s)" % (callable.__name__, ", ".join(argv)) try: callable(*args, **kwargs) except exception, exc: if exc_args is not None: assert exc.args != exc_args, \ "%s raised %s with unexpected args: "\ "expected=%r, actual=%r"\ % (callsig, exc.__class__, exc_args, exc.args) if exc_pattern is not None: assert exc_pattern.search(str(exc)), \ "%s raised %s, but the exception "\ "does not match '%s': %r"\ % (callsig, exc.__class__, exc_pattern.pattern, str(exc)) except Exception, e: assert False, "%s raised an unexpected exception type: "\ "expected=%s, actual=%r"\ % (callsig, exception, e) else: assert False, "%s did not raise %s" % (callsig, exception) sponge-0.3.1/tests/functional/__init__.py0000644000175000017500000000000011244504474020212 0ustar gabrielgabrielsponge-0.3.1/tests/functional/test_class_loader.py0000644000175000017500000000353611244504474022166 0ustar gabrielgabriel#!/usr/bin/env python # -*- coding: utf-8; -*- # # Copyright (C) 2009 Gabriel Falcão # # 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 2 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, write to the # Free Software Foundation, Inc., 59 Temple Place - Suite 330, # Boston, MA 02111-1307, USA. from os.path import split, join from nose.tools import assert_equals from sponge.core.io import ClassLoader, FileSystem def test_load_module(): this_path = split(__file__)[0] relative_path = join(this_path, 'module', 'to', 'load') module_path = FileSystem.current_dir(relative_path) ClassToLoad = ClassLoader(module_path).load('ClassInsideModule') assert_equals(ClassToLoad.__name__, 'ClassInsideModule') assert hasattr(ClassToLoad, 'param'), \ '%r should have the attribute "param"' % ClassToLoad assert_equals(ClassToLoad.param, 'ParamFromClass') def test_load_file(): this_path = split(__file__)[0] relative_path = join(this_path, 'module', 'to', 'load', 'some_file.py') module_path = FileSystem.current_dir(relative_path) ClassToLoad = ClassLoader(module_path).load('ClassInsideFile') assert_equals(ClassToLoad.__name__, 'ClassInsideFile') assert hasattr(ClassToLoad, 'param'), \ '%r should have the attribute "param"' % ClassToLoad assert_equals(ClassToLoad.param, 'ParamFromClass') sponge-0.3.1/tests/functional/data/0000755000175000017500000000000011244504474017024 5ustar gabrielgabrielsponge-0.3.1/tests/functional/data/2823371.jpg0000644000175000017500000100044611244504474020364 0ustar gabrielgabrielJFIF;CREATOR: gd-jpeg v1.0 (using IJG JPEG v62), quality = 95 C     C  " }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?{,oq#Bf;#,J:ECk$\p<{rݹ@:L %ԩ1߾{ݓ^j"%AwO?؆i؅D<I⻛s&v6`@ s9/kW7%La9"_S) K+wcOMbֿ|mu>Kk.WMAl([qs71R/]?]P{ox_Bѣa2-t!e ʒ8%zW%ni/|#<,7յ{Hr6#<  oS]GW㎟i$n~n2ɿi` H ##_o>>VӾjzh('3܌ bp,p0wEw+PA#\vLcy_fIK30~l{o« (񇈜6N&9DbgH}'EnM+Bt0jֺ4+KPfM0ňr@6wfƫ;_I#ZZk:N}XYmoʢ?*ke7ߡ߇|;6uԣUx *;Еu{ /sGf~o'{[@Dv 3p t:}Pm.mFbIJu/z{sm{*;N8' cnVƞ<{Iw߈Vh ?41<1ڛ̟?h;+{Ho|hҬ 2Z^idrKanS?f`în|6i1ͭ%dԑfS_Ӿhq5~$~WͼN|Mm&"xHIya W5O7/x +m:`WeGHly IO`|G<)pU[mQ> roa)#c1Ɍ7aA_/Qw>%6n kkټq-1!hhZ&s^EY:+iVi>%;Re ܩ-AR2=k 4о4{ҵO -Z`Ω \/" Q2w54Ѿ(\mzZ^OOĪj6w.,I*kWwt_) ZO.T-ӼO TdnxExiv RFG]zRbvL&9ξk\.6Yp<>$xZ[K{xb[$rBɴ7X㝪;u|-տg-#z9;di?"k;P~0j6|~>cx/Zխ&5Y@\"Q"I ?bSrjZ|k%bѩ:mڂRDP $+.|_VM 4D[ʊ5fF=Uc$+Ҽ5ƃ H \^<>h\¸Mw>*/^ݪ1Q@ L@ 8!s\*)` =2z6 x~޷/LW_VVZًJo.o67T=Gt ͂#km6~ػx.m[ֱv5Gl$$JN?2>x'Ks:\EāMi#PlcAsi:mŶ/&ь6V1 $Pdd1nw0 ~|+⯊tcKDwcHl20eHxkSѥhK>Ih FrF}f{R^l~ vo"=7O&)+aP(;z1 >t % Hď:򱰨mܐ@钬vt ˻eJ亍tQI(X,~Mrl0$@?-o)t8Ufx;wm,9`*S}b{]yd2nk#L.K+#Nky;ĭE NT39/%[2݅bCoq4"l~էi SR k/YA/氎#6.*88$u]Vy&YMiqjbBX$|?#ve;IC@8߇5),]VIo-<7utbScc  qs[;GT0+|Ag =.]o0V99ʃKS7gn T]2seJv`9xg~z/m43{>ܢ]dBT+T% 6NK`u#\p?$D[r*&k<1b׼a{Fx`dD O$`&9O jS谽ҵ)"KMi-w{}9U/"V ILοwn6~&Ηmx)m6sb~PƤL@swx2vInwTn@ ܁w1h^#-}Rx\$T9S @⤃gNYLyY_17r\&q[扩a.=Ya"ZEPdx:#u$1ltѮ$s% 7nVvXs|7l]_8jU''iԣFXMBFSmsZvAԎkI^Y/5-7VdV6j'-">rnM9Z P^q,F%{Z2嶲0 so --VA](GPvqN:2~=#R[Oosu!IeMDF:a`%Krd6@}[V{Jq %!Pg$ыMy)+"rHN\lrh"  1:u'o~K7ĚmY,3įedlڵ5>)|z%7RU2(ACql֏.|MTpͤ Tmı'ɇ;$NcúfrF昳,+$1b@ptrrrqNqdڶi13I}b7#1:ݬjcBm1H u(x!Vz8+oZach%1@tqc(uqȪq&,¨11y-0M#xgK<,I\, ە]pTt`[Ci-DHaBN2Gnk&4d*rV2|B_ y*H^:ݡeR2zO|Ele#,qH.ͭGEպCKb#*WyNn:G^QԤ-< [I 1-Bx1qp8Nk /x"h9{zciZ۬wB%ڪpN$.s@h9.}>)I#s2ڼp>PjQ=qZݖ$*c 9٭;qt}+L[Yż#1TuFO6p#̠7IÜq@6-Ɠ~Pȓ.JCBs srkhntm5@Zcƥp8*0z\ FMsPđ-gS]yce:VtnY;(Txӓh y=CJ}2] PYa8*S%KHXck|Co~֓siZ!hcY e]!sA߳y7UnSivҌT:c37<{^+5D2cIwk3pvF.ϫXh"MbRӒ7g'h'Xnǚ@53ltݝd I3!NI;fo.֎$I%~@@A:c2Iaƌ'…v`vzrj6{m+O 1Ln aћ 9y=El"T7m'=$\Vhi A9;OL?)/ﭞ;}! 3;w E -LJn ĎG\;~P~`iZ1̌NKG6bx9.K@{rnֳisx}{pʦ?$I 'hV)>٧vl Yzv7BE}|si-('# 0AlV/< i-C4zX(1qrLts TZi\K*d<0IrC[=vzֶ,(<c'qG: :M FpP x>ͤYKbtgrK* Dxq:VEg鳍Epry'*mVYl6;$O~cߒ(&l6@f+&A9!~J/-Z0U\gv5;!צXG*'s\{<H]di80G '6M 7ueg >Dr#A;UHf Zi 4h |ӌc5OAӮR,Xuu'ַ6<4\pSʃV̻!i- Q=4ldzGzRmk;)4yFU$Y8r\KuV(.m7ѷym$ n69diw1U4nO9'q$sϱ,O6LEp`8ӵ$K H>IT*ǯ9zݪ̌Όǐp@' ҳ5m*i.Y.S>$ z6&_3N>s-U#G~ f_I0xAllVd<tԷk+ hm,w$ Q'DAnd3'q$0_:Wеۻ3 ݸAk=̳23_|Civm[UYg𕜭 $WXH>"%Yv> N𯋿iڋǷVb.Ɠp v4F/,yw/_E,,txiB1'-C  5\7kaO]:YEAm#' W8#m#ᶩZ5~ipmU `)gU|%]Y=]Yx>8aV]7߼$ rNNݵM(|[O:uǢ=ݱYHvQmTq9c /MGd%փ_TѣDM\L(dRR((RpV_C~${4W/ 1J0v<__ro/j tom_m 6Hz4d =y>*k׈ofnBbۺ|V=f7<]t,t;So-*];PHUV5p30W?b?4x_ªj&[H0Qn8$S^*ɨLƇgAhtQ0mn*rJ[; _iM2W>1l[Pzs@/Þ/O;/ @nm-O,mBsmv<m#_H>(\ŨxTCZ 2$(ˆ=q'?h^.e΅(%$&)ā@H9#m|m{IKúnfey̟-"" zvXKc6<co|6WaaswjHmm4\'zy ΕxO.,u\$zK2_?g߀>L 1L-7 KOύ'ӵs&_:1aB ]#8" ey)< /IG`]'ۋK4IVݏu=3ǿ|N_n˫(gR1!>à}*QxB;6>(3ᶽ3N#jG1Hx 2:4 ?4i:f'$WO~by!Spe$4e1ebkOg @xl<1S@{ȭc%jbUW1bLiO)|o񭞷jzuxPhL&Ҥ!|_'k߁[{xKNo w6I 8\<?_f]^oxgX =mSYT`_jor[F]]хA w_\pw5+oʲc=u_5oA|m6]B85;-ut!Q1*~`oROFv'$!è<}x /Iy&~jʾWsH k;v_3YA#֤M3,*0$`c@R<3x;[\!nc`Cf'k|+u%ִK;06 pڸ y:o<5Gmjbë26,**! ^դf7riש$sd(RCMԭo̗6[qס3gl˵'V\ NičUvPdr$=@VLV[n/YKV İ8d;Ps뗺t#C%ӣW$r0s<;X˭]xM@U,:dM5α]6}.p$g3WAE/_:aauہhHK)rRXprp9ϵpZ_]Iom;nܣI 76N84oBM3Ec}qaY'R '' LMnou&-u=u-"!,C^Fx=WyOiowFG,l+$-PxgbgsgN<_ y6FDA-!UɃYM*0rx̱yyUݜ_u4[kO|:X*^sG&%h)~YUx*08MnՉ&mk+m3 70%eAJ-mM-0xΟs:^E@h ;H$~/ D/x/)ٶ)] c;60 WOЬLמkk"mZy9 6r0H%Yu:Lj<7<7,cs pBUTe r u+P2̽Ss@}[]:V h]#LF3iM/i0$qΞ}ă`2K r<9}&{G\̳4cQepy<INžKm) BxtzHư:׆.B$O NYUI$gq'1`m-c%Kș\:Kq8M/O6 ,"\_!6U-U^/EGs aDy;V#۵EKK ,̫+X2`sm#awF5[*S/* 8k7Wn4-݋Aʑh}Ċr8#n/uR!nrA'?{n?@Iidd *\ F3A^qx:﷏wq6y]/ I8<767*Zޟ1"h,VRqЎqҀ!ݽKj0YT[K&1NA]?V廷; $6GNX|ya۝5 ]ZCq40AL$vK.Q23N660XNDxՂy8+Eexr^SG߃qo9ʔ㌂wgqO<(H]eu8;x휚<-y*,o [>␑f!Y'֣ψ/e6*"edӎII⸐7?ht!q On9^ ssNyp2ǨtHEn}uNNsc2*㏦g07 .S섢V\vI|=ey9E{|[/чc>%ֺՏ%K2^.2q94 mRǺ&j>e6ւh#1cG=zӠS'%J)w@Q9-m_G,.GR3ŻuwKKh 6PYܴe]lH)#q>skm|P f$ONZ,v2Ǭ_%(  jVuIa$c*Xz񎕏^t+m,< +HSB:zg4g tbI2<{lrzx<{o\R[2[5{8GN3B2tkU<~5Wf[.""VBR>:ZՇ¤QdaG=jzsk<\J5xHAS0<^7~"&":Fci$>Nxb , O6mꠒH+rG|hkK%梩bnEf]O_S\7{*NN<ȬvIN:>"e ;[qC1$y`[g\'N6[t>O@o O}gMqn- ϴHÒ9HSéiֳC=`24^p02{l:udXMVGBϽs~3SAk64F;~`G#W5ޟ}%,FvaUprlW^$bAy-'쯜6k4mA[F,MX070<._D2277>gE>%(!W3$>չq">4ʒ 2~yB*mSibeJ̧8$=+y|?kv%M2 3@N>4 :xT@2Txad?.prGCj:Ks,8sڭ)?oIjrjs\Hʦ,>c|sf^x˘w+!Cc(im/m_ϻhn&C&B?;.|R%j:Dsxua9.HupZG=x ;:>"V&/qwo6O$k7[ǹԂ$&P3`O@O  ;/]&><>"+ˈoo /u"֪0Cd1 # p컢vSͦv}赻H) U)+me _7_><Kz\$}p$,1#5l!+xυ^kZnQoyVY@2M? a7ĿkO#UZ1`w2Z^. H`zo52_d6\&i-dye9@9hۗrA o#W<_Q?bOevPS΢{| Q6e^+[Ŗ|:A*j7^k24Nႏ#1ֿa"?|%,7#ȲfH(g~A$Ox7%yJjԬد];B>s8%ϩ? x'A<.[[m Yxf;/s$HQ]5Ev_ewu+MKhM\OQhVU'ݓqW㯀>=Xqj>u2d] %/+ϊ\ x?mq@LNw1péu|A*O|I_}9bͻiy"-0f!@!AE~u~Ϻ߆O>-oyͽzC pr[ֽ>Wlo٣Ft{6K$zS$X,r$|+GW|I\6 P Ʌ滇q.JmyiuX|7-hRM.I ,}2 Jm|r|x1 xx KoܧΪ ~C_uoٯ^h[ 2]N`][wQh~#T5";k)g "H2 ) B{G?a<Hg \GxjXt5gw[T>bQO^'h*N){tecv$A!=&;,5Z'"Vo9om ]C߼K9  Lfx\@.#hȌ ~ǻ? bp4`mXL]D3CJ:gCo:7YwZkF[.n3ra `u&,\vJ(k`|sy\ q ?,QN,c=3hLj ]:r$p]`mܥaz}}kEu[{AXth.w \~FZذӚE-!; Y2 {9m*}sv_=q|S&FT SWմ5WNs2 fdXo'A8Mww T[H vz]dV\Z `Y\lPF: jZ@bdd`}FmB\\.fm=Ƭ|HwT(9sRNҌڍEEṥR*mx<մ!ewd@NI} ՋIe I.LUZT 14vSxRKB]iKiUTi"F6*0r*е]~KkdXgvl2*JNvݷZkV&GoO4Oٮ3t1dts] !-GmQ%ܐŘ0$4lTMC~<[@ʅ>PyGUԗKbCH--%Hl 0 kjn5;sp8l5OD: WIߞ7 mm`l<^+#F` õ@'n o@4BުX.TǗXJdw85{EOS: |,Aq Ž-ǃraY[,G7?i2n=8- qY:C 1#G,:ry v H2F ?]NiF{=3oCŸboLo ,EJ F9Ry;9kȽԜ6 H6( E&=~mZ={ĺ,l-y*ݸ2ӮuV)VEQR@ qsc&[/z:7|e'H<2} vȠ x_V[[K)G6%L`,yבR\g%܎^XI(14<ޝj>7~,`hUFH!dG_r=k4ma<9d) H7Mm( aO5&san9uȬ_R2nR lCjz{yecq )Z c{?P]g$8w70u9s MgAl϶L1僢yKqqrV-esn3؄ÿZŲ$/br9P z(FPd65UIgVew*5sA$pxj;i'7Fxkx;PÓtRGqu ڂXUIe#suU:HiPۼ;Q0~xuO?SqZ~$M+mFix`or6bxZ>ZnĨQ4!;עpu #Mp mS`͐ ucc{4;%H @@V'¯ZhonZC5B9,&7n i@~~8,Y~s``2$zWGMaG+eZ?r.y*~lU.xJ+gI"g㎪Qt %ů6[Idun+{tNV 4W?\zl4<Č#E{dLHmbK,GskB?<6}\d\gzװ1Uڪ2Dp*6aשjKktI$t h|A%̈Y=BsXѤ 3yJ$vyr+:.ߘ+rq9gЯVݭ‰ sA]QR4{H`G9=~a2]oXma̡rJ9o`13ULwG|<.UfBA9ݎ֭t;ڿhB0p9T.5] VY~Ҁ2"o-T/dv<3FsjV*H\H`~ ]AlnJq*Thf6#'}=93si .YƬ{FR ڵ``,I'ZO a{*فg]DE[{ա ev8'@^ҭc!fb@` qW.7c7 ǭgxW^a)hį" 8*rG|w_k$lUS)4ӑ Is-C#(#*Tj+]6#wbJПs=y?#QZ+uM1nI݆^3\?V#TOWP kc=Hp(8_L_OO_[Zd_giQ-lfcj ?6O6-In."YagI_߳l>0eVtm0T,UvO%M|aaCbuH)oxzͲyoaw ͜|nV! ᆱzG\ߵ>?5 g^-uXDͥYjm yW)5_{Вw&4Vg 7pn*#!W@Ciվ~EO5}1O0Hv#꠿P $9?W?\оxşj{NĭlQ4{#KoM_zƃ-! [O=儩l\eڻRjo>,!>i~I n-b#;;c^)ۂCv~~¾/_Z+JŎp.mJ#IcKc"$bgobxSDWwxV+ v("3DαU x߷_s\Gմ+TIc*B)6Č\}nj/|MoڶoxT+=_Qus$qI(!9`o+QMğ3^$H[^ī7   Ş:>zvZ[8t}UmONL;ȹZtnHs@Q ~-_ZP㟆^q+&;i9A $xwѨ_^_KQUG]3 H\ -F${~ }A⏃&~w?>5\j^nҶ^ ɴ}bI#bKEYG­wzn֏qhs$]Z1\$<3FY d 3qGDE}4I4k<܋Oޮ\lS ~|q7x?SZ/|)s,i\ ]%O`f\ KW>+kV21-or3 1HTe<[ŧĭA];k]{J[˻UGE ,vYBGi`(<3?O֛6Ir?HClMBkqm Z' k b dc+@>1E/u[Lfú®m%BwI %²+SA4C xGqvbQϹVhnв"2υ3>'pjo;ɖAޒ6 RInMn|gM/Y>q%ݗѼCdol$#Ȍp xs¾4nx@c?&p x溵y#=!t *u<^˹x#y|9ny*ɥ|Y1쑳zYjq "\kGrgʇ,TddJdZ^0[|hnc`kRͩjڱQn.d!XFA[ F֡vRz]FC]Fb>PI5}k:.i4;tvIe7mb\P {sAYKWb&c gAT6Awckt##'xfݑcfm岅tۭ=Z{%EBnvLp Ķ\Qlֹs0C@+9$t{Y|3-J;}Hb98Cd`K(Ao4s$sI&@+ L@N?x#XNyR{r:ﴛ]#3泖=v8dqȠfk[۷J s2b{5 1,pH1PX}*wȲ*HIܓ[U./t+K[} ʂTq'u 7%TI$6NW(&~> L6 f !2I }7Nƛs{& \O7sǂ$>qCtVc.lJ?w%@TCcjRIgw6眘 ܣO~:&{;8VY&S˂ #s*̏ocJR\*%\z :+J;#Auʦ|Ѱf| yڇhSDv[[i0w 0F-axŖ\kiᐢܸr9' t-/Z5ݞՁʃ@W#٣w"9b0s  8T'<AY'g{diL'R_w`; ki5d09ɎKs+Hiurf(jp Gl^x5;E!Kr %$gN9"7GwohZ$98$9umz9-nuSmլŴ%y wzFm"mf;[KF6yI\ru]h OY"vpT0䟕:i]qߑoB:<fR'n!!bݫ\vߔNʄu8 O{dZ% Vz]U74X7+WtSʽ⑮4u8`(RǤ@vcuU*bU(x*?/=i mgAbi Rti""6J$7JK ]p[*4݁r2˕-גۻ䚳.-)8͝7y2rLζԮ!uA?"7s5oU\c!Q`T8 y5RIf9b m1p@J܆HfV^ŵT$Y9f#xv9b2Kl^(DsdS>a!ϩ#si&%5F]~{9SI\&;#ZY f){rߍg!-MDx$_$ww<t uxro\wUK蚮;(ypP'ۊ3hR\I!twt#n^h?jic(4$Ň$vxnR:Z3ZZ{`"T9<]sq0[u;-b퐬$rFA-Ch4V{)I0@TmlsIcG⫩Iu s6/1+*ǹޮMn5f26$rvyh\iwVVy̦M# 1מz K{rTip uyulVO ӹiDrVoB@$g285~-Լ=r~,"Dk wο,CPy#&)%(@|ˆGB@IO_:gxDKCC 4 )"83|a^|VkpW(mKu3ByWV$6I8|?Hωw?wM:e7f%y>Q@$pFp }'ga++84۹f[hp=9vS4ȚFoɂkvrs viRMrs ;I]oKG܈ `GZȻݞ%2a6jر$832 vI,FnC;fqԑJ&(Ŕqs: iUv3b.p~aGLyb%C'98Np{-Cn|\rWsҭˡ5vy7&,su'ȫ/r#ы }d1hFMX־{tj[S$ HQ`*([=uZiis{Y|VMe[]-&3=;w?6V(߃I⸐Z䲆1Mnʫ3q<?6> ck6~0e;5ډ@/ r N*W?;Ub~Y|eŒH͹@ʂ 'cC Ix^:Sim`yiK~~;a&[!,t@9]g*$R(e46>"[ fwR|i~xn{47V=R;~c R@#kZ3o5 =KHwPO\f]i>! z/k[Ce!65ڦZWy|wWmgBK<~S-,|_:ůZ)r`y'8CH9|NrK_ B|Ad tK?+c@6DZGg$`x1+ E,䵶nV$y8O# 6>=ߌgI/|a:L7| -alO^ 눬.Kw-$/w)!uPGˌwmgS+f+jv_lt-&Ԟ J3!˷i_|yߥjzU_k+[7>%Xd]l}r$sk"=7?VyL~8~G/9e47s:Ey@ͼ Mۇ~Hk:vU–-䷖2[i0bF\+יUDI8# ;Qp L&]#]/RG# 2^>=}JVa5kia=u7GKp6)w]>0K3y<- ]Ğ#5WIa)`[) e ec2}6gLK85Ԁ3@9=φa{x/ *y=`R}r@JێM7e^s8Wfm@lybV5|$VR1܌{9y])X9PBL Z~}$ 1X@\d1]'o]~#p|KdaAӥZVC fO-Î%g2;SyBЅK:FSccvpLAc kO2=E%P#ctO3ƛu7n9aCH` Y|1c4y+yAp˕Hu\aOU;E.Xvx-  v^guhh B`'I@k=" ڣkpCO(9-uD1mJ,X\$ *d#d۴=~y%rL0HyS`{(r1Ǡw AzʓJ94D盈Gq1IPх}8'qT,Z7~~fͅ\,0}GzVRBv]d?@(XY\٬i^CE7 - ,żwAF [`q9#ܴydrT-Iz70^ܻ:npVWrJAs}h*oI[91խN4kq$Q |W ߝGrz؈%#?<H+ۚtofK -$tތ2@9Fۏ4[ilWLcV*{(&]X {I{y@n+RݤRB?xҠ8Ɍ:E7rW^ ,HP?(ϯG &dK64=R3+:A)I)<8Sw@^IEXЈ. gx c$g=恮KBfm"\ #q 7al fԋ*aHQNsbeHOvD9rx uj|r*4`n;#4ɦO`ץ]XC0Jަ[1H򬲫g<}_kYy>\fM2@'O.͐{8ZmHӯMRUx͞2 **G̍Al20ON 綑$HJEq=zz_)i.s pʊ$qhOqf\C271h$EVeᔰAx:l,1=/YcbO99>%K۹~y?a#2B[tEK '1sJ0cٻWqX_۪nl!Xqϸǁb; 2LqV@k (m8,z@2%8@#qҪlH1g/Yi?/cb2qx 5^HQts|n]eVb1ێzN(fqc3ۥijDU$2=s~%-%C̕fp19;pud('J%[|>beb`$sڀ#txm4P% @!Xɺe5p#83Y<"`;1 rN;q@V yOn<`8GgEΡeCr3NH#~LRۢ S}*mTC ر`3[CHn>Sݿ>zQpAjO( >OKMB8R>XzWui0*T:|$Y6٣l-VkzHW<ʶ_~!(f\YD4qx|9ng~OuKi5ZeW!}ѷRJee > ,QO_dM9ə@"fIJImv#l97#?u=Gq_GWҥYx÷$v$fY{ 6矴 +G/Oifk-ڔz4 ^π6'T{_$:>TmI弹vWyKnc{!r#%?2S]4~(i:h.(qlV,$]OMƾQyc{ȥDJi͐ +7vV:[~O xpƮgK5$ F˨`u* s1RjZ'ufl~6YSsj[=w1AJbaT^>'j_ŏ+KxlDZv|4e0<>B0ÑM|i%S[t_DxcM8'tIPK`f?ZG?j17%y hƥ<`Lp~opdb$kٗXOI e+j=;IP߼dn'-j $ |fOoZ?Uq /F3"#X]ߖn2"QjtuowMgnᛔXJl]>b2Hozl|?&~(_ogYH[od1Y2GS8,H?,qor[gGPAs6p/QxqLU Yx!6/*aZEwMgn-1=McXH$VK(Ɲts9cyV9wt|RuO_hV+RP/FQ|'YjZGaCY#e;7$'~i_ 5 l?-f:>8̈B~hMFP>crxyt\j M1( Ѷ-~x;67~ ̤Q$V呢F6p@|'#Yn^E>eY b,YW~ǺՇ5xOGk(Q$, D|se1Zu 5vXk[ȥH qIaBDᔠ@0|fe:Ԓ]im(Nlh;ya@DV7ov enM,Ac r#+JkhR3͜V#T8g^i^2AշPϢ_E&Иx 2Pp!4ೲT8P7xmQ>LTK ~->4q4 9g]CM+>xܔ`q!`qS8޲MV Iy#m(B2w@thm,jҸs# XǒG>rꥴj7ȌC@e8v8$ .-,.m-J0VB\ JΫ1ͥb6O`mdm`Nry&34uu͟K`d Ht.pv `VC>tJ6?< p01X 67C;Wm'$E+H$##y:ZS+>s ΁9Y%$ʡ?6 TUty= wo+LtұHׇ m˞Mlvck$f vAazg[+ kG[mVbyrOn@UUln=N TRS1),vZc~аN:v5+(!Y ^䀣G`uP'.e35۳5Nȷ T),2=S ϹP3HI~`y8MM;P.yd#$c5zt~FPM\I Jpv@n{x5bNOs#jvvc8'n~$b)GOe ̶,2*d9ޭdڬ)-&8 d0?eQOOknIXëy.RNsUs׊ ;Pc,7Ar#:vh  i̎Jc'?=}3VYeHɓ '9<֥Λo"7'aEIL ojZ="X=Z\شjG=7qO_z¿X-dp1 ޜ}]w-}@V}ׇlݶ/$8b9{֯<;Ff_Ҍ0p}8:U1y^LɵLRŹXuԞ+b bll'l(W֩j:E$[c<E`\x_WCf2m}]|̂srqמ]+1ܽ2@{uD`XbvsB0}@KA >m9& 22A}hlbB-Iim0%7Uİ[[>&=ۘq8׸Z$76F9Z,>\d<E1hgB?`' Iހcyo;iP1I0 *~stv{l+9Y7R0y~uR;|wa$;p 1ӯ.llQ淒8p3ܤs4qwJg*y0Gi_Zp?9kF[}fc=do2!!8rTEe^,7f$!Vi>V0Apy>/H ^e)L숦I =qϥ(i`ʻp3Iu~M$ƲmXݛ)aJ isU &x'RXb_C䉣 PA?QxIL9i_ qilխ!6mw!ܑۊxUQp0Mqߜ:ȑ~Tn/ᅙw")u##8ڰaqqmڲ5Uw as-Еۧ'x96[K;KҮ7=ap:4?ok+so3gFE3J _Ƭ>qu;Wՠ!Xg]Ȋd.hL d\s4w[E8`,TDB%08 jug̫}c+-ʫ!NpW vVhwy*^4nLͽUp?cSjzlӤ-p qۯ@qQncb0`tPkIϖ6}!c?Ɵۛkr)#}y6ҁ$]T3n#gjr bˆ nN@#{ϵ-ު3)l1%IpxMzR6x `λ(pzuFS0`U+8ZD[mqbZbo)p-[qN{P'$ `geFUiqӜ} ߆5nfqv~zUwgjx8k-; 'eF6$W e?8Ԥ~i[ " q=F&9DV3]G>j3jڣM֎kdɐvt?e&Wo烵3i׷Ӣ îk::'+#͕O3[ k/j}-ZJJH@#;F9n5.@G>#Ӆֿ Mu4@䈦qʱf>qsxϤ2xe2[;xR9E?JR>^CzCO+ `2co.RXX~w/)_+qAf)O"n4oFFbv _,Wo89'=Qx-@M$2;#dϕ #cm9rX}m=x桬x^(<+Dx$׍e7U-6!ai?_P<=ao-e٥hbhko3dwԎ*k\g)3Fk7-2GM.EyKX<_[XO1^Jc*121n6oT{ZߩM$mqs_?/~7w_yHX*LD@jDW\|44M?\/]^lh͎qk{|Pnc,p$/ jz_ D^㽽XG*\6N6 $3b[{RgCz:_-K%XIrKR^MiC#`7;JW쫫 񾆾o!TX Y6AIˆ2ro=>QR?W[]ǚ]ƷT."ng \ %'|um#~|HR׾+iZ Μ$$wzuàs;\Orʲ.7ݨk.;4M'Qi!>ʺef| Gz23I6ۍL,m%U*Ex_j??#TR7~'W'&^ 瀄.Į~hWÞ>~ CQ%:D^H,A8|X˨l#goOﱖѵp.O0H`W^_~>U\_xFmYida^VM#g`@Z{QkvᢖRe$A+WIGqn%թ(0 t;NF:+?GI\MT:^ڿٮ܁Gs>6zݬAE0Nb -Z//־#ОamB(]~Hw !8\ -1/[h5->Aoy.˚K}0`rX7?7kS =+G˧oS@Mgj9vG+ŷ'[Кi̷Xht&NBH̟?׬xZ6mٵVtXibn"UTpF6Tx7$LJuGtbHݚD.<\Gvӿ @{[Cҵ *O)BI\ ;GnŎ»&پsjxv2"n>pC#`Js/=cY)Vl#hnD T*C@?O-Ћ+! =1Ӹ!?6gqH &;I}ޠnM$3Ъ϶iMR3v76e .g )fJN{$0)!}q|溋x/X,h73<5KmR.R5\P(}#14q'<᳜ϯ,:i1JPd-89aiCrC[s9ȭ8>H#O709r\p9uS[Li"BX'5X@u2'2=3~t$7{>pqYƩw0V8ZA01BzZ4)$-x'_ߴ{IbOG5#GؤI ~GtNK09Rc 5g:y7%w9K4K:ЫΡ!BG9>!E$hqnp1\i6F Nq,?hl܂N8'G'\ah|? Gbfӓ2X#ěɷ?Ō W7.^{#49f~x=yfFig. 1G RX#G?h)#%;vN36z􋙥-$3",*t0Rxfoo+AIU]:ЁܡC3 :PUxbum-] ː _*keڣ$pqkE}Ao<gNktycʝp2 XmlR>d`#錟4im mC@#^ji]4˓\纰2׎w8zT>|N ᱹPdisWhcEǸvZpw;Z,F~0=[Z(9; Qhž`V2P+av򣏿 #`ͧ4PKmyp{$8?`+ QTUR@J;ԴѓdpX'~:GӊJ֯n!w3yY #-qFrOoZ׹lyo\;VR[[}"hm7V7 N@^ q=]H +R: +o3y!#+rJe<}*g7Ke##$o`jUv(?RleU䎻nw89)j2ómG'RoK_][3\4C4ͨGl,Ydi#lqIs^"= IKi,8UY$RdGp(:qq@5gE˯-YЌI;Z 緸c#|@Pxga2G[y99YW~sKa"F RWFcPtS3CnRU99//'Ə|W6("Xr&wy`#r?b>,X/5?jpdP:89vq9ֿ8_ [\!7Vgyl&*cb=$ĸ&weWF]dKtr@Fw(93kHmo5GJhB7nju_='dYcO[X\?w]/q56B X` ,`ޣ*G=On(WZd)mO$Lݱ=+;-fHƘ:c=j[ńvozII8OzXmK^d#'"@gpH('$9.1}{ x_#䌪#\@oNʴ[o 6͛ #Np3ןS^ç떯-{@W<9u'iBaYrF(YH\IxoHR9qSl6GrQ@lۧSK5_ c Hv,7s=(lB܎|gK~*J(GZY8My[:ƙ| % k"b>9s?PzT:OWU&N[ #E_ 6x:މE]riQR\4 bDqRǭMEiO& m!7~$DCVeF|o0?wLp?ޭa_N-ˑ KVK!ڸRYx% ?k=S| kdHX3#až<8'BLQ:[ݟ! !$۾j>(h7M@mxIoo}y-9fYefIŐ($!:E2ן-d%/N>Z$mnX@_N[ _|qh Z[.I絸A*O2 .o?S"֢VuH42s+:a]r-e5[M?Z.<\2lGXa|߂ľ6ۛ+os·:"ۥ,c qϘr4x[[W hZ~fK9%P[*pv`濓ۋgc<'/,RxJ6/-< Bp-A<x 7e}_Ri7ہܾd\;#a»oq͗:t .X+;ke ߻uP͌ ߶g>xQehZ,c}5L%I.Wi}R?,k'T::L\_6dd 䴇sI ^&,f15,EDcslp??OE^ {\ȰaWӀ#pV]GzW|/iGxVӼ7ƙ:Iq&yH&i [E(̣!  Dž(ƞ!dtKK?qZx6HDbd_8$7~ž>_ kq 崶>,Ѭnn&Y5H2x*U L/4ट|=akxxP^[yl@Q XuG㗈)[gH}cQ̃Hm@ۛf9$:m=$ލ>$oW!WͿ |Wu_SH-n㷍Q`M:䱌*b]F%tl4]6SpC.Q 2 xw ɾD<"u>Y'R:܊@tG—VwW+6Kd%O?01]otދ{ʝ]J܅bv䑓:,H3xtl;uP֭D)4Cs0J>z7}sioK;+W'/7ڒ&u89?&FGק^H,5B"7Ge=@ 9:i1ȢF\ U Np@:|Af^|d@s\{^aq]M*.|,+C 39g sZo760C$tp7?xv/~{},Z.<$ q F 8uO[FKKf]F=3\OL Dk"ݷxI_kxV7qϯZמY"606v[ēF`K+6@؞ | 6[B#jI&^N1UI8ϥx 7>!Yū',#0%4ka8A" 94x/GBx[yZͭ֡8dyn"|15 K0(|C}*C'|E4~{[~C,Jw0a"P~íhPIe۴Ip[x[-׏zkγ^JKc30zar}1+;vaO<VV%ֹ" s\{ kyD\6qb׻|f&_kǀ]NQ^Q%Fx,1 T"{J f\(Y23N+vc|=)[KIJ^wY3sw"dz/Qo}y'>b]>(J+cr J}/_5k+:f #hqѨ>f#I%I}Kj>*}JIsn+`1`7ՖgO:~www$:qJ02ٮf>YIׅm5fʾd]ZY1 ʪFyrW?/|IGi/ݜ25nC,N2q.8,8;Qie_ڤ s2^{UXrsƟ|Eku|q( ڎx4B `up]X?0_؀DtEhZBm F$PStJ7nedj.NQбc{qv $q}f<׼iEoByc6\ z־`?-_O[SɊV)4<n$.9 r쀃^)xM<7 dkLLk+Pp몘fDvfRiWۜ 0E]E1Y*䜟Nr:F=ɬMafPv{zU5o$Sȕ^Mؙgڀ:kA[N[ },ڤQ9WgRGq/_BճfI[rʥ:g߭@5[S#:fVU0؀uu f QCo (d=2HC\w~`Y7@r\EQzqTżi䷷Tz0Uo"{gdr6 A#Jc8\׀*2ke"$|ׯ_zʶaTD1Au~\DcPAy4!1G"<-}=O=t?3Jק p3ZMvi-0U|g#4VУn r9 A*y^՝7o{=JRczVߖ&3+ەR{ {yTDSx#R>2l4 ip{pu@$bjAgu拶{~$ pG?VN6 P$<֒NX` ,|xʌȠ 5Kx MÈ0:K{঩}m(V.]ˑU#洭R;429̄#GZc`18 `yvm%G;G*2d͍8~M|SXbx]okfw{( QՕѰ n'0px 7_P6m-H![|g gE>k:7x $pxۂzw ?7|G"xiu7d6vkxd*6)ˎl]GivP+% @"fF9Pr?W%sF};XO&m}EP Ne r6lߚF] ڌ_}M[߁",K;>OH'&ʑ\lgG+ .n8[=0z }Nխ#m AC{G=|%a>çǎCǂp*Fl-w$&hPd`霃NΒ|rA`pW<[ I$d9A;#B-{7.:GS]!xȷtfDc3Ld`Y:ok|gp;~9)iz\R$ qڀ 8xDN=z3$l ރ ˓:Sg L+)45gF2|ߘ:s@Uag"^q,Gt&`2J{Cu m1^b4W)">ۃ*~-/|1߹z}alaV-h4 bbw#ÃR yhȀFGqƀ/$pi H3 򬟲aq#G e\NE2{+"3ܝ S Я>`ހ!XRKpz f1FWyaczPG1o81O«A}WF@Pw &AN=3Zv^<,gB-ݽI㚯gj g2 ~+zKQ4[ <D^/ nV3\+ V m0X7͔P8<ֽ aRj~2i:~xTC%hw 8rI.1܏>鶾+<ȥ r.s2tg# Zw-6ǫ|DQdya?i_ k|]_E`sĺHOjGc$co0$9ÿږi~|'_$-u?ͮm֞d\CG?~:zj:ڵ1X&T1̆N2fSowZ2$B㓍LWxŚ<~&\Ƌx#= "`ɴe 8}zwhxOGH,)_,-CV~g {,9U4eџ/9N+oImk['lu|eJ ֏+9 CGzΥoww7QA}XB.+d#+ :^=@bѹxZοVԦ`IT ˀefZ'a m mdžR0AkOs2;ހ0W9=&cLAsSⱵ?XV qm5̤+*#2˓Ȩ< UVZ k{jnmc!~Yn9a0H\w:2' >wKlFh֭@7J8 ml 3@?>0h2c.yj3\M`Qݓr a O8;M%;jj?h4 &*H)I"BC|{{7|]/+Zug Tؑ%ɗLS7Ll4^':e^6 / IXy%ʪ%H0ms@_Iߋ66ɨ&d״$E,ODLFQ"cE|"gl,|swcUU6snYIc _GO6ӵhi z3پ,Af97 { 9i51 ;YdDIHρesD.Z4b0^6?cfMJW|+=m7oǧ<{c7$w۔a ]g灆BIi-xQCh#Z>m,Rأ ,2[<>i$RuZĚ.! PX`p J_x CοjK7AV>se=ػn'Gj I}o[Weϋ iVeTm4meD!UN|tZg{k^"A@V9{ſ>Mƥ-K’ZhWWX;,"!a@~[\O j? Kş>#x@ -3M. {fӭg[8 M6H$ @x^׍WPz>EO~-Z諾(#*z}K7W;KX4MBǗa0cun $ 'zW"F]ozW 3P7S>٧]uqdfrAb8!?OC?>xKWm|k{^u-~miQ%iu+)*Y Hhך SE)u=~|=x.4Il$1:5K6`9?zҬu[_ A[#hZm%ï:!|Zk-VѶ%g YCIR*KZKum|+}-Myek yUOGauqjcyƿ|*|Oqxڦktˏ:Lᮭ.nűOΑ` /^y߆e'.~3o>!H#@l,xx7 oៈ:ï7~5״u/ h>93٧٢(To m};F|g?h;68An5DQp-"7Yݼ&pk'J>NS Rl|8I[Cq*ۼ\*ruӾxv-:˅>Md;ԠY弸߳'NPNVMC=[/Җ_5^/=&\$1'Ci s[Ŭj W_i̪"LFM~c|o<'K뒤VxSpVUn$P7H̭iױx /Ë{k^+fbP3i3IDg ,QWs0eMwIKT 2#)~d!0Gu= dj^9sgep? 뎠 {E~{xO ڧiυ$^ceOW8-kݼg+BYA nRAb0@ EJI3/D,Oqڦ}Q2Z& d s#^ 6)2 OPB#@3cxrWi~)#/xyU y9:VǶF;qwfpq9SKd!$ǭy]>bcӜs޶,|gKv%#1Zye;<\{{`n:-ͽպ+|z0A^3S4fK6hٙݳgGjᑕ Ha{cV mm@|Ly RnHfwca -ۿs@*麲L+l!0֔V4dpe_wvr[ocҮ$6[t,~qW`U[.4Ղ\ĆUQ s۽k40#})WRT̈ *p9SL` JK9= -v8tsOm1(@ =UmsRTuC;S=rltB\`:{tṂlN cu(u[oi|jhS7P}zUm(KUȕ$Ary|: x 0݋kw`89>4lᴵO$<Ҟ'1<<yAnGqes%;Ҥ-$԰ py c׾(ahSʑ]OPw<b lOQ*3ʨ-RQ_I~« T:Ǒ׸@QQ0;p?^ClN IbؼyL[zY[|y[~9( kL/7_`):n\Z3#K#!=jqq+OiGր?]xW*/Ws9%q;j[-%\c?N{Cg Y&.F'l55V%Ŝ~k33$v@'_$^XI: ڇϤznhiZ4PH mݑel 3"se~\\IV5|6B89A]j^wƒ<Ƨn[&B`U+אv4p\+][Rk8>GZn-jb #aD0b5]xoO|#- Ik.K,ie S ?.ӱAˍԬsu[W.|Cѵ+ȣم.8xʟd?_ M6-Z'Ѿ*j%c&$ $;Bz 0|*\CŤ_ypZ8F^Q)Hs@>+>0j ୚ 5_3)Y"Qɐ1;F#?^ m// xo@Exm-%mݧ2Pd&|Eco:k֚geXѥJk4FpI L~2ɃP4O^3Z[xᐾKQ J}[m~xGG_}>;4`yH-9OYA7MM/zZ[J<R;Ѯ]M5-9ItFl*9ZCVsuMZ-K\~hdٮq - ىpY64X~rGAo_m&Y<]H[H."6Im LۑȠ_)<(>|Pؖ$3v[>K 9!RcrI |'csi:ƥ,t%&LŴH<ߴ«? _2x_ėloI#gTuoVMpEz (:6;{Ȧ{u1(fN~bU@es?G?n7 []a/6[r KnmNIXk_Ot>K lBiaK)V`V$s_KFd>~߷k 97c8S K$#>0k:`Z7q0BV j?]kh۬V<8`ʮ __G-.tiA=<-Ys 2mW` wu,kK}CMH'hɌmvB}{Zykzsp}$R[v03^&H] @ (89۝[Jb3F>@XQߥyGkVy G,I#Kwo- |H-m$$`=olM,! ,heQUW9M.=G&"5H4suQ`It9W㑺xÓxx{GZ]%wi' p9@:>ѡ{GH^+4hAIAnwI3@[M eyry/!IO W,T 68<t,u]I{ulUV/< s^_ootNTҧ*>H\#< L5>0_qZj0EK]>FhɳT{:,j.qpes$i"0}F9<ݴ?/̞xNաPL0:2&޼/;B9NDKKL6ae*!eʆ# gi 1o{{E,TiZfooH)<$3@$owZ.,[}j *(+fDuԷ`K-Q+3k<_;xK:zΛq]—ז{>wXfr^H,>b%>/|%ƍ;YN^6Qmqcu[  '_mjA_K7s\ kV8ee۵_6A@18fφ?%Lui=+U)@XGЎ\%pzNkɾ0 ч+mbutjJUm\{I$;DĖP=ŗR|D5-oL.Ś718]%h-b#ρմ(k_׍|e7`σ~(hOixc\!;ZU4vjG@+|O|q[ey:y|4ӄ`pڻ7|nW6>-/O)9K}^+{R66܅E$[VW.+c Wư뼖mw70L(N$ďƗ5ϩ[܄!=;YR+lDQyQ]6¾x$Gkы{[M.U+c*uZtN[5[O7EJW^r(.OILOr>۔!Ul>bּ/Ǩ{7Z|.5ml# P_|B./_Bkigl$x%qōv_J^a&pA/| W_Js,6n6ˀ]d?( g| ay߅Zv^##%Kxc$ P@"x7@,>"]EI4iG=[<{(/3#y˂$ d&sz~x{<-:Y$/ۖcNxm򃜀@}?ރiibRF[8B" 8k|>7I x?s{6_yp1KyK̘^8 S Zkj?wuy Hr;'"mNĴDKi` ui#'p'}A΍kH.e<ڷnmU#!xɭP> h~*Ht BYi/aNDHw.dL<Ҡf3oUU@3ѹKGd P/,?/6e8A[_}E2[@rI(LBr NK_|9mmKMC 6gNd'2ct+x}hj6ڳZj7lu)=j5ŏ!`%CG+i-mʩEx.I#xQJ?,\Hɴs[Zx$ 3IudJwUנ4֬fحx4ۯ9>VUW!8Ϧxc =[iXu-RQfgVY5$4Qy3[qp\ĻF!coj#<.=m*{,cW>9 FkJd-s1 mH1+O#ᗊmd7Oo]cKl - @',h'Fer -=u^5(p.[ׁcӼ7D_| h)I,3ZyXEfB s , 麃[ѡY.WC m\iV湸IEǗ. q'ӐO#om/SxO 3 6n tcF#W-dp dCv$n=k4AIlX#ԱL8 LpAg?)o|TUE*b0h 1s},pFX ]Yh [kP&ۃ ck /ߴo!g}-/&1GE!@]’';7?^]i*3J|ӂrT 4W7Ҭ"& SLGۢ}/2FUw'׊nf,)XWHہ>临Ya.K  LiZ>W$G9z^]J- tO?~.l>y8/ Gij?cY$Rl8a ?jAg 9&a-w5(f2+AEK]K#!včǜQ&a­:tN@+*BD4dAݲnziXI ~ezss>3]aKBFС&&';GLg#kn0;RiW0<̶dAfp}yڀ-fH!YAPq?1ЁTvHj;mX(u,H8$8=kAfm>0{^-ъK֠#!`n5~D*\rINv3khP]1]7ȩ;Qrf6c3ON=|O" ,cl}vB[qms8,&l 50g;Q̱4BqV=:xD9ʀdg +s#A@?\xg/ß[ZZkF}jrf3\K ?*Fr+;Znm5dž..KQK` 88篠Wv↛^}M}B~ѥ){ ̖, >ܢ ׷? _^_jQI,  6[$8C]gSZ< gm"K%1.d;1;6$I< \GkaptqE#r0#=h | ֮,usRj[#(5[ [P!G~9Xj{=S-TW񙮡w .Ki "GY>G֙q{msӪ\5xfV:UTDMsO_V/e?xKT澖JdndɌ1e|piVo*:φ# ##%ďSX->Sxs퉢izU-][jWn(+hT~"i칲σ= 'w.  x.=j߱?2 k-B64 FIq,;B UQ?a^.5Ϛ$;>ai\W j)7 ~߳׏;y5i>4av!kUk&i\QɎE$k*}?KiYxú.%gr8PA$kw U+W.ᯅ^.{'D]>X1$ o\9CWW0@їC÷~%ҾkvIp47wtaX&teU1pc{9~:/|:5]/Sx7"Hd{躍Pcp-:&]lpP|Q' i^+[{s5Y6-ҮFҨj^=0?Z??i_][ijPe01#e1|@_U~֠OO?/: |=FL9 n icmAa>ti߱7uK6quCQW6OgQfX@i78VU@-7|B|Dюiol.kim2<{|\djAgJ%(m ]m,U gn"{o5 )Voʔ3Ћo>KGxr' ӌwGRomd7#K_w?kf?7ubt@};m~o;U??~%?o/W Gw:%"3KH!7_"|1֭dkk5ż,2mmiw[7]Hi7pґgYIbf8<+u|ewt[ǪCtQlgƽ㗁U~Zhb|Tf7º%r;JXhk$>[G(e# BRekq$Rj2ɱL9K{oJGn%=?Ǻ}6Blٴ&"Ȧe`xⶻO?7~+{V{ -<Ԁe2 w#aY>^Cfi|6hO|0[B>񟄣ri<}eGrY/^ ֧:u/&HH1Ȳ,auY3~xz+]=l 8^~z~Şট?ÝsP.iKiYpDa|ܭoHN1a\}ij6tdd9 D W|CE$Swg#ONV6"6!i7.P#ǽylhi AcO dS /@}emNgj)b"'(>RIf*@,k~0jDkɢqkSλ6$!d*\79+Z3A WTD 展+ s3##|=[ĦWMV76b(#d 33)_ #W{Yǜ0 UePZ4}fbs^.j>ԥ;Q|3E"ЌYdPpA۞@  藩O)tncvgF_|;>|NүԴZSQ ">=2 ;MZs[Ǖ41'1>EDlZ鴇c^(& nePn=U|!o k:&-࿱K{hϖ !pxuKTE$~$*D$Cv@6{3kvse4h\JnQA!x4#S.Fwng G1l~H_sБT7ěmGX~#:e=PcGRCH0=`S]f#q\Ek {b"ٷr0AyC@-Rs4M,9>񮣮17WRm>JX#$͍E3Fғq5 {ĩ} Y yypĒ`Ź3rykxkSYΑ=i3je ]3]_iB2-)|cQ6wBHI&]љйvcm,<c/ෂɞ; 5i\[vB_gK]R𽴯hJ2`\F9+Uc, qQ Mx#'V1qun&w~cQZr|!kw/&q mM6e{|]K+\6eeb,+0`$ThO|0jsoSiqH.-纴Wd;&V(ѺI p ~< $v[N`Mf^Qġ$ ک~~w* MվnL]B+Y1"+|Gv>ePؑ^[^x!`4>3iw KDf*dshqs yaHHWSwكZ|[̗Qx~Z2, 1Ut+ [}⏊z^ F5YүLw P`(ţH>XIe]vWZ=Z\F)5/ 귰 %Rlwx!BtEz_MMWT>= 0pTDGIf J85}?O}B3!ln߽Qn+F@+/O@t}3u«\j-moqp lYV2ۚ|$6K]}"F I,R-1XO4m "@>a<r)Zj6$^Ռ&XY9@i{YHt&0vRn~N1ou-BmGQyi&˼NK1nI'<)h+vRW Ԃ3~8H@ N՝Zi9&qx(<@rwP)? P(vSpqVwT-TmRR3FPyR g=' z~]2E c; Uri|r)<)aD˯{K,2R8 㻦83ҟ5p?ȃͧj~+i2o%w0nɛ![v^קZ~x;zIHt(*HtdDln &CgxO 7C,dd*t 'i [&?,P߆ ^i 8jsXAFc,,#kpNmL2 ؿ n>|c/+G]iÄ[hX bW}TtAoXo=c&_}LLŖo)JYr\fm'^mi1Ư (Ud|$ >`))qCI zÉ.5 &f{tɮ-~٤ Ź= hV/&TKo+'žōB_>2[x]mZ}:Dxad.ߓ~4C_jv~5y5/u 24eE#U+oM@7RkE].9sjm5yw 0rk࿋_ r' d}Kt6ܛv2itTz.':nVSۤ|T#I g(KUW-gyr,Q\f p1_~ ?meo`V-**=8&-~RfK`׶ۓLc`76~cA ɠmaWo5&Qqrht6y2)Cge,&#3s8ul~속f]N_x5ۼA'ඒF$vD>OH c~ȗ)ـTƄ*& @IOs Z%x1$-_ /yXe8r;[k} i."Fvc9N:k7%ĖN,˸(c'ۃPH\0Ed`vsuVR|LuGGZI4uge\NG4m!H瞹$e#B܌)zTWujŦ*zq{%ajn Ãpcx#ݩ, Vea8 6-~ʏ/8V7V *$fٸ>wkV>IoTE%$ep$suj2K}ܒ22 ;u r 6h9X`A1qKi98Y\+obXk6Im F^@ vkAxҭ>e(\ml294[nYFzOQx>ڳ<0n=0yUqqp6;lCItlv\TĐ\d“;'zol̑JbR#< t Hb3/̈ǨiexсkFy=2 #89fɺɌ%`> [E߿@LJEti$4k6a!O+^9Ti\$qip L|ű~[ݻ 3XϗBN6 ͡>&]&VIӆ,qg?:t?o[--% $)9V osgz\F2P8iQ|1Rqm 76A}gFE݃IeY\_\#7 e.0$<.&Me"d zgۥ{쉫KL7"9u")#wpr@0z_ UX\~w_)+*K w;s\ ]IMn'g%4p++8Xs[?Q^:@.b' qqN mJk~YvZĠ 22p[3@]LBK>xkX+[%ҥ) 2 p&d ~ƿW8Ju=S OHǔiv#'5c}njc_>(Ie}-p>@e^N~b6+:ic3<ڊZRm[.f(pG$+#I9Bj*|B&|&湤\;HPEqAt1~!1 )ĚycYƳI\,DV,S~y_)?&_SC=Ziٷ5?3u.H'o |{S!ksU.oOT4]UDjcH!00RG!ZN%k ]ҼY-R[XKo*pX/dŲ\ `uY!|p'hP;\ w[˫d~x+ 66 =5ەbtTt&/;,Ϳ3~pK΍t`0+ BaּR?n4skjY.yl$f[bUj"_@fA<'~2z[ءѼg[YQI#[%ۿ? 9%ѿ%S_ uycϚ7ŒWpv@j6j >&AeMO\ta3pdqݥ<KbDj?gS[O Q[{si<3 YEynM̒q2X]+|ϣ|7X/|MMngiM`{SmB%2 |9i>/ K%&p:#inB+[r+}=SozlvOd'PBY^!_q' (w+oo|*Yxo[/5Uh&\}OMF{fbfBT%r;Wzoc##ɭ7iA$[v-69Vf`9~k~|W1~>2%Xas\E :ڊ>ZL)d;Fr~rwV1F IfzӞ5S]m]f$&ޜ*[߄^x{EtJO򀌯Ô$LW7⟇ZFqiS6%lu6Ш0O[q$n^-%[[wxIsӿƷ%Fo-?-7`#r @ ?klNPcȋ X6w($W3[G|Ekwphnb2B 3:Wi?VrXjKcrl>aD#^X-tmiqiw||{IRUt V4Zկ|'$Gwox]`d!˰W  Zd^|fH&hvΤ&2B!RNx xYm--)LdUr| O9ՒGnwk:ťbVlRBXc< OYhki$*Iob@Gv󝥃g8*u-vrl3Ex3(6`hnA9~*t-GBņ-v1STr|OhqW5홠x'AG5 HuGsd"ƍi2As*&ITiG=V^8<DžA+}=H\@n\B{} O1é[iy e(|me  +)lb^^m[t^dH\nE [.;l6_ͼeTx koG[=hCE:UXk -F$c}8Ժr*䒘-cƭbU6pK~G%W|@IŃK'9e_~؞*I'";"-⺺q͆gp˻cr nPH/Y5M=$GE=؈|bՔK}WoI7u+v:+um,e8$! G4,P<; OCyYGT/vs?h"ԅ~kkix3G"E2*;Q+|#[_ ͝VKuYQfTp+-@[=mK?|7:ڋpQ̋ =®N> uH1\jVCmn74-k*pccR+|)j6~ҴD@_Ŭ̪*ZIw3^W9W?Bl {A5+fBX"XK?Hm7h6w] ᄾ$My\A)m9F~*k_fYXQl-~xOQu\Osoe|vѾՈقՉn l~2Κ#$SP6WV!8g}vC ?R~xhGS9u)QtIdFCm"Λ1| bXd1%7:-1:2rvz^A4I-4A(|~UMkoet(*(SZ\~Zo-Llj09d'o,5ZծksF( L7 YA'vp6Xkֳjc<6ie LR<_]?)Oۂ¾,e}iZF0Ns:8r;O+g t"Y$kemTা 泠|4`qH@8|>*h^P OK"b]X~;?Ti=o x/Tլ, qalUnV?+&dJs;=_˜haf,@x66/ǯ sI]?Őz]bo+ZGS_U߈=: 8}΍ays-Ί^ZFAk-.T9 ݟ[/9}xF/4hCYID)*#9c?ğ-"ҤL~s]hRjvR6O"gBl Cʬp=Bj>lxΝux;[J1utTA%eNkۯww_7ĭ?M_x >;y-m"ZR΅&>`~Ŭ~Ͽ |ikIqj? Monn3y ܝmf9x޻z6MYx'-+XE{9%XũvA@gş~)xOBxQ Vͬ64,7/[)-᳙dI\2ߨ~J/'=:ú݇<3~m.I it; Ka~PB@8׏%eguxLC%1| ׊h6 x+_9a`oEKaFOc9!FY|q&q6ym)k ZRp12]YO+!F Yya }W]iJPWAwg8?vH0`Jv05?߳t3/}BQ%ohN&ϚW{ Cܜqόx7M--C€[  mF_R?6H2kRa@1(>0xr-ծl,[BnIg,nL=7H>`zψK{361G!ǣs܌tZySvGݓe< 04E swpj`(3ĶiP%q+2_Q97j^ v*:8@ SSeDzo9Qt}Pf SMk##yd REё "iRͦxO091Y#O4 H^Isگh ηC46NQbOlu~:%u\$*;&H Dbˍg~,ֺ-3 SJB7e,֬<ɠfIE*Lb c`="?o,O&!l]J-5k7mux@U@֤2+!YxhB#5M-i/l-[Wvki+ &EAf]"L[wR~l |:V,.I<kgMSV=lg*GB8Js:$MȾlbԧuEĞS>GLɷ㶑e4],|Jy+MĊظ2jW?G}?l}4}{CӬfIgpDŽ1H=z:޽CSx#5imvH΃r|Nr2=2 ڻK#0[,[v>q@%2zcOz:$qjl#_~q=MYIA"mힹ{ J[6^DR"pGn]dڥO[Zg396–3~mCk̲ 瓓u*k*y 2}@x%? 172oy|ri)[s-d}r1p7sia.V'GI6p1skVg}S4C^426FC0yF0j=_^n &Uh"q>^0Aް|I5ޭ <hnKFG9RAjH"@HV!yF8'4xEAop%qkL</8~s.k5Y.-@1#ޣa^{xÒC=M<,8$2[i*ywp~9dҭ59]VHQXu(/Mα4Ev(.?r*Oj^j6 l.$~VE$~a_>?om>&OV^խM9` >Kv#VO Dn,5jkuTM`a3J B0>|mht-Dۧ\ Ͻ#xO(&{ GۛK4=+{`chcW{C;J?x9q [? $ƊZ~-}0g$DsHITh~H-|?6#=iVY\7%Zĭ[؇G##Dh?C9ǟו^yתh|AhR^:֡Fxo ,QGs'Mx^="\%9a/${}}Ӿ~NE~cxH^K ~n[,|L6wZS<\\#YDݸy ;q,5lz\:JE૝Oiin&G|c!S`1q3~=_φu+=k}Ic8''uc=xs?rE4s:*7S(`I$G|x[sX[Y-ӭLI $ ^KKYeޛs7/uY9sw3DIn7eXP ~} ~!>>1;X/t߉Y_Z9&7a[ Ŷrȯѯx-]Ň,iٳVmKybKK;['rVB|֯kh&żt#CɅ|!B73-k%o 4]|?%61Yf60 1_u?|7.k=eC˷x1 ~OC M Dԯu->sJ0 $Ip 66Wkx"ӧ0T6Ӵ0#|6kmNO~Y! "dsP|L~-REºƋumveG׋CnQoUe&>4xSoLv~aWk>ɉ WM3]#q@Dm\\~ߵx#|Y%|y|.^ԩf]&G'c:)OCCkAm ~ko AqiT-FXʺQ Ө֥YD_.?o/迴=gk:]oUfu7vDФ֬ŕ{UW&-#_|}|j޿/Vx/A/8!+"B/9`S6fš|l?3{^ f;hQ!a Q `ƿ4<_CZWvs_i']22T\!5V3+R,>63Vuς>>_,KX.}̱&8GP[~ƿR[_ڣG-ٸ/l#vSjIt$ @OA⏂3,'ҵURTtTMe{Y~'_<}'\>+մ֊! !%㉉)ȿzAq4Dmݱ\3b)IJ?b~.g4gVך.ΖMLD#,X3shku j6n$TQNho?g jp>`#Un lir>;l}.ȘvV9 7,.Ɨ cwkq!(PDݮ+~So}K:gĽ;Km~,/t}n C,#eQćRoMEomnefo"1ș f!X׎~?k;ţ+Ρ@yFw+}ʖ>0k:^ŵRDZ-6x>kwǻ*4bgW_<W>r10KbG,~Ys2*U 1?^aoimBOF; IZi1 t*2 />"MO=Aa=غ%U+DH7dΤu)#Ef᰾RH瀁Je&#2Ѯ430o$l P~6Q(kwO3æh$Au*`P|#Q|Fm6Km%`pw+Jk 5mgAu-/ZўQ$fwIvʚ_ߵ>(?9o4 As+\J;83[X5:qjSeiGvrI<:x:}oBẚH"i2B@㯙j>)}>}]gsp3T[Kt;"$rOG}(YrI(Њ HǨ?)gv.IcI&5$\H"f*PNx+>:~ߵG] 'ڏSD[(.@E}f-,{YHv@@O=~7W7Z濡hgen< C$71)ux@Ь##E@AӭX/Կ"D'z0ApGqQHdH@A2z gҊ>;4u@tO@ҽ>wK=qA"YQQA*[~zjU-$KQ`pcЙ<>a1r98@wS~;E7M"a.2!!-]o4-^=A'Nhə1 $7P6W^=tѺYB],]"&Sl8鞣?kuowxi5R`R DQT|s~io4"Fvl۞hxKĕ;:Cb5VV# ߨPEZoO^ÿr:b`);:Hbvq]E*3(cod 9̓?mnku h`e$?89;@9k#zim/3G| 3##>6[c Z4nb2:׎CLt^+V2Id],NAݜxψ2xY-? A[[^}ʷFč)h!7>iZ׶﮳ `.6( ˂3$ n,o5MRb.Vhh+Jr$,~+~1kxiGu%7m4MMvbr:w_"U ^Fxa%pLVLKy譔 *$k|_Zh>7&sCY,[إ1E.3άPzK~5s6mVH238.Np{o^ytB{;ɟTԚE b2pӶ>jmW-ߑk:4PGl-̼ýȘ+E 23*lZ ֕JyMxҵq಩/\_Is!y6Nwu2hַ:VO,OΩ^s@K߈O#t+廝9=Nh^ݵHm㑷'`dc7Ǹ/qna0׉=N{iA ޘC)Ż,cu֚^g{7MpTHK:VwиO>Lg$٧L2ۍCŞі餸YAgAa2n1_ªIlkvf7W igWDW'@Mu.]Ţ!?;Z*U^.{3TӵM/TxjsDbJ|H);KoԴkGƾGvI. l/D /-̡_HxdžjO%oCK߆6wDv\u?@~w+| it9|no{ڬ-[V}lq 荁~>om m_\Q3O'寸5?wMEzDžx_W}.B;MZ͈Rd&ƿ% 7*#Ӯ{u$`XQ+ Іn@gdXxVG{d0Y (@0 c/9땜,sEFn$e>ۧ5BA6n. DɰϴHFv{1'tKCݙzǡ8Ҁ מc.6^y3 |ۘg\?9F=>MXj.lg+PxL!`Dzd aAn66_:&Alܧ сu<כB\~m'ȜYLcwnK(2T̸hX% 5 ~8ց-`%m'du 2 '-dGI )7!I `ǿc^o/7PԚWeUBn'kq9+ |S]Mfַ dn L eGR[K/.XF;3w' tx>{ ޛ0s+o*y.F<[PѢrn-եT &ҹfm&vthőO :^a:9#tohP>rA#%Co~~Mwe>EԵH0gHI&*퍈S|vg".n5^,xᏇ7Yuu+)f%WkY'p_FG|C 㹮]cEI$s; )89ܪUĘ  4T̅[{IHBV[#>`&L[U[v#-%PH)FKc827-`&uB䵸*ch%(h zԚxmлGuhևpl(`   y dr^,B EW4v0*F`f$̠6ů\:esSl8l?*A>-. iI4*$#88'$[-P#UB:hjZjcMWCK @Cp+I<4z1l%kvm5otLnWv~lc ǖMkuln tܘWחGװMfy!eoMC:g?Zo9uI,5 Ba+|drC.Y [9{ ĺX# ,ѱ)aYs4ti@,W< L䀣$GOZZi3 RM2y7|xP5,LY(APHc=9k_' .K fٳ!&UweAg^ ֶt .0^d.cefHPR |gm?D<]2gC͆A<4m*3=pp@$-z U"8(G\?ZalgSj]k n.Xƫ߆uO.uK8,HHTqñ'-;ŏ xTfu9DZ֑*[ØE,oD6VڤkE_?4_cO Zú G6GK#I+kt>.3Ei}%},- AS3^v@,vFHګ|+~’3r[ZCp! )np+_?m;/ ~A+xg2!{(!)QN oY?i?_ /?fxFg}>YP$6 ?_nj}'T^^ͨxot;9̬д:[h$UM|A(|,GD񦏥x. kjq\yG`ֱ\=]y 8l'iz6Jmf'ɱ{>91"X(ڟV +ϊ߰w+tokeWh#"ݡ,a׹i__cC|3hARѵ/%JI`GLV 3Ҁ?Jn7|Oc6( ʷ>9?|]Gí]Yˋ+}ZԿt!UUa?P+E2lW \9'CPV)>x3d}$*8EpIq^E|-P(u>"׼ZkN+5IJ\ʑBhՂ6؟K=W%3%r7W1hS}cm`ػ[qmİ#$?x7ZNNB1$3,TYJv3 |-2+m&95)/&L(lI~@ԅ ^νsXMn) d=Eg\}C3ƨGQb \~4c@掜1׽J;x4JٛK.+Edy"[FDcG]#i$x(f ؜p3_N~f:uˢW6A|091܀rrڗy&YLIo'˵UL~{Z5K gEHΑ$%w`F⏎5Ic\^V{cצ>ZOǺẵ$8=<\+myn' p?ᘬmuu2i[xեi|as|ķ> i^`,0D(9 _c/a-NʭW cS${mOk K϶5>Rq%zgBWJ!i9af= W_kmumMNw(6.H`xn? nr1c:ZkoȮLEdyu 7[h4 d Fp:z gk\A@^zޭ Z]O͜F\ڟ&A)B(r1˶(i$ќ P@?J+A-WҘ.221Eiy׍)u{pb1A` gm,Wee_I*܁܎z€8oAoöi7[d?+|3W'זoh]Eynl7L!ƣFD4<)hՅ?Iui^ͺ=8Ȑ"I8<1﷨]F G‘ѫg;@$A6[OC@eI! C=8ZF<%bXIkR)%YO*G͜2zd\rɄw,8$U߈avqg2ɯ+uӮLv@H=>訵ϴK+R0%)qϿOC6N𝝝/R9:7! 610W \ oN{_P'jP5ׄZ<ʒ;qLc5Mȉml>5a,<rczeĖ6Z2,a#!s˖Yx'bςÛ5wwa7GXebI+,ҁJ nk"HYx^}j& K̐ĹTR74y;[F953E|yՐxKE5=ܴӣ# 2n’c*YR[G%w7MvBYc;dsd@Bm!J,̗w~Iv7pJ[ȟ I b8$x{{Pl,'KAu 四Y_).hITc.5M[mudr&uYE 7!R@#`[cJ-n//beڄCҐI1s sʭ7#ǯjx#?/euak ,U`Z}/ <0m"3O(ht\z98'4Rţ&[?uN> ƞbMW8śxҟR4mspa&86z道+! 3_Ӈٜ8ʌW~_>~|I~h_tx?{@:E#Hc(ʋzEm^ FSBt1%<̖k+6:,i e$yn-9xſOWS)Σ-:Fe򕤷hi]3c_ysK,ki+4g[e[ 6-&YHvo|Rпek>u/7|?|f$-srr΀K[__|\G%{FELJ&ggb.7DO 'S~?-"G"u|88~[?s-֨gw$+ZF+q3aد Xam1DX<(61lD^YK_zv@1ϸ;WZnaִHɽI&Ad$2qk\)GJЖј0lP<Zo.A0Cw$s%\xإE^IRU$Rr䐥`#e2 Z#7 9BG54SZ\nh\cNHaqX~Nx|.ZOGnɋZEE΃l@czXoE)8sP]NgFA5i'uܨ>]ռLXz ƕŷaWh̜`1GZKʺiIh@X)Ag5@ {{k@1F]$FV=#i*YZ@I~> ZGXVV(OGc `d~5|;ծWEӴ˓U:,#Hm  '_ ȶepc+ƫ_~X[k3󱕑rs1Ӹ@eYk:]~ xITN[by'e0BQ!N`Tx?f{KkO_W<I$5*vOK~kOSd~ "湏io^-Gk' B@[O9~xs)j]R+OiA`ђc,0ῄ |e<|-[xsjí5mHZ4 qǔ g kڽ}>))8XYUo36O|+99]Z1tY"}KolcyAc q¿x+uK/IKyuai騟;,\$M+FGT y+^+xJž)~ xg-Q_S>VrY[%8+3_˟5G\^iV:[^,f'?;,6M|G1|ma/KApFDř~B$;~P0J?wYR.A|'f6~>1>iX)UXaQɯ>KF5KT״+I]IKm%͓$#//o٧:N~ x k;:d&v-.Lnk)v$G_񝞇19.U%H$n{xAƦ ڵM6inlc#,$2dh_J~HkOx]>>~fI,|Gn̬:w`%>#xGRC3i?fpčD.60 Igx;Α 6NH»6 U,FUpsTD"I>>~7^IϫxFI5Io8,졑dҴk `b/QЛObh̹Vy rGz?|EOM/@k;hwq$E9<~ƚSc J-䎣ހ9R.>e4Lm+\$laLjM?Zډґ߷c';'8O5GM)|S׾)x_OKY 8@KȬG}=.|^';+=7I:NT[yiY՚9ȅvݜO>,uk kì\^$eQ8qԓu[gRXgӠI%S3"a2FK_ S7z7i7wj؉✉]ܨT-_ D>fL̹l}_}yym$9 Pd.1^{#~qKld+S `7u̶l} Mệ"3qk4V(WIV## Ww*Ӵ[.ˋXUES1PRŷ8|b~Qxsor6>tO]8Wc^Z/q_Y t^ln3{d}a|G~*3xD3 G˻ۋe#`%œSն^~ak>kY0GLrx/ XkqNYh 79~FСYo$v@;<(cA{y=(#6 ƑH$'; F^To?ey=2_Xè‘l@Xʨv;prq ,'o_&[q1LFm> Ԓ8 yihv#?n.!頖XTĪ&hȌr͹w>3} ؒMM#7ao3봂ۛs5MYq k1I"*<ןxbx4Gp}I@PG A Hq0ivO6#'rNO;F;s@ mPn\6- 8FU2It[Lt!k G|g98UAwbv8arqۮp(ݻrb {PNܰ7'z|q-*g( bBGa<EiQY!@׶YpU)_sht뫈Lf m$]Nٯ> h߳~=톗hl$V[IreF*5&ZxEouiQKw+Jtd4'ď_|W%qV+ xVBMѤ6f% ˒|vQ8$qkvJ]G$%W>j@)r  nU_=h??m^~-VA&ὸ$c_5b[_|Gk9V)mڰ^T0İSGIɨ^jZW4]=.[ @u]ǵӌxih<`54)5Y4اQ$=մ aE8 T}y;>(5 m/5(mMvErΒYb(ޥLd Fkɿf ; ώ: 7MzՕH~?%*~&>^w[yW3ÿ?d6t" m$WHl0u׳,D++(±=ykWz/ |1OYhsӵXz̅JF4f 6nM^8\vm '7 cqu8NWMV:\@}v# ?&/HͥM!I \bD8HTP^߁ߴjG5o.qu`f^',\im ukompBwKy%rsv@h sgڞ$q'9\How(*J:zy\Ȅ@~*~Hm5klKk8yB q<zXkp,"'-AX܌+Wq5j6k7fd7c*Q-gx@ mncm8FI< #kxIr2sGhr֒D*W?zS|nĿ}f魬2>$[-A?4}6Ϋ$]w)㣼Yuif2:^@ =yǮ[K?u@B;+Wm-͜r2lH?0y}}Mor V~a^$eS;Pd~D}F(r숦Pߛ^l~7"# ~"_WmgK xzIl%Hn.$'sYv=p?x^M=L%:9D 6dTP#ohx}NUkXήʐGam ڿ^|L;{Yɢx@v$+27ݹIv/> |?<-occhwӣ)&VĎL,As` jgx}W'&C֬#A6֎[iH>K'W#m+]diix0CH8\pJP<94YxJ]Fz8LGI.&8 k ͹lA(Wex  )E'uicX!;X '.9sx?DӼEC AsIcevJ[72EP8up k_>+]9 YfnRX@H0g:ՃxA *~ '<#9*2 5 k,cddF:I/Z4f@FHH>$|-t-SLk[YV\C Ў =XO#7Ee*C~|7zA[/[s#hiKO<1c Ri֗uf0HH$m1ψ~%OHm5{{ fi/).r&/e@'Aʓ1pG /__fW R;K#1g,A q'?f_~潬Sh]#HS6.Xv3E|:|,<;K+HERpveOđ^]@-$RR@I{ xwKG c8`s#WP_5U4ru fs p|Nl ; Hjp9J22V\ᕎ:/5/XKXL6wuaCNhᱯx;7Grf%E1Wܹ8~_<~֯Kifjb1۱rH 3z3|o4lkdžo$ҲH%ʯJ=ο__ݵwSD-`H$|Xr0q޽gyA-c6_)? גB}.>=4~>tOVݟ"u;"¬gj5f,<7R[jbM0yU 1a@_WOcҵykk(TI$|s̈́pA- |!kI 4ʼna1$9 `a*>%][e| ,.܂ِp@'V~ |mK/ hm v0 ǿ =5h-Z#9ې1Ao۟h{[NRnX 3±FLn"2 ^VN9c~?>]_o[;m[YsgyBhn~zI? FNuyM,ʶ>IcY2#0).GKŒIp{d Pd9x>p/xovS,e E)5V!Nsp [C~"Lwv>{;&b0+<8 澫9 |Ghm&V(v>[aer?U1Cw`dֈlfªͿpVf؍` >/fgxϕ mlTU*c'kzw:͊1HN#|`˜.>V8i>1tQuܩ,GiTijd#$O XD2/(G,*G=m]GQ lH=J߇[E#WÉO&*@;9V=\2EԳ%RHʜz}* e I (ql\̗I{L;"+o` n,JѸVjJ8^գ$QȄLP 6kup p@p35Oʰ8q9Kl}#b7`2.1A~k@%hPYA㿩mjPc/* `0Gou};MD&!Iunwq8k MGxw?C%WXuhٗFހǯMwEmcnI4Й0Qd85SVwjG'|6F sQ G[p(߉&oKfI$bnf'OspK.`Y$?B08ޗ8K{MYoqFY%A(,pzPq掝J!(ZZ۾C0p!_}k4=COQmy%'")Co$*8`p -26>fm6${ hĒDN;[#<{Xȇʒ_<;P5[ŧ9a3]Ǵۦ}j=3Ff 1#e.v3S f$#.s$㏧oMoZZ^j ^1i#um;H88N⽣ė}ޏ⋽Ze9zǴco$N<ɇUE0Fx^urY' -\pFFF߭yĝ'Suh;[&^ & vWU!^Y#RJ|1W;5ubAz|~˯$_ *|[` VSp`A'߀l/a|RB.ԣ};%RvQvF@ X3Zm[~WbpU'ֽ⷇'{ړw dwO9n ',\2:Qs^|myl$ynF %;7yl619-&@Z6`2=G~J٣DzWW՘X[sMu`0d9)\r@W]TzݝֿM.F6ږrwlQF^AEm/|OĶ..bk[nM%Fa)5mGD-bK%'xD%²`%l*vYP&<+UW 繖"H6q;C;r 4L(OOmZȊM> jiɟRk+Q${ߚdMj1c~>9pZgH! d,Dc,xM-R̐c 2}Ӛ1Q b3I[W]IiH?At<iѠF =3P{H-em[nsn?}W IëoڝZ<ûye֬C4 Թ!2A~X 8jǾծ4OII-&)%IXdz@3L-u_xm8xTY<7 ũAI-%$j@g?fG eny.BtA}k'-J3󯃟}.]GK-Lj'/hʀmʴf]X#:VΡff07S %$pAA!2@>Y~_uտִces4zr"% B񟈾|ϋ^yyxy.^Akm<$ 1N3$F{8I'G4VOCR7R,b!p,RNeX;H_bvO/xgSԬn^kY/}$Bi ?(]Q5 moA MCQ d9Gv )@ qrn/av5%nQ# W wug[#:MY"bv GGy^xkyu;4HUGU*0ʳ ~r2v@=PFXݶ2p>^*:]\NӲ.# A̽ׯa]4t3x,҈PیLr8,yˡUb@ Vκq3TxgxHmJ['~h]spn+O+ 6'>2#c@i!ˁqerICp{f.QI!CFttֿK+id]v~iWj`!c?+|shv\5w/I<:TWv'v`'>0vv82y9={,a2<shIN|-ym2Ѹ$VX}:+3G5?_=r*#R#( 0^2i6 HZh4χ5"NѺѕԆVA,"8S@ϧ֩_)kq`T;i rcԤUAv ncʎl<8s䜏OUy&a*T:̭20 zcJ۴'GrXKHX|ˊEvZZ&ew9:7q8+>N̊@L8 (O~Ht]4140U9=7St~o#n{s1h¾<-19tw۾ rI`>P[^RGڑ'domU7H!:꺕Ʋ8[icBgvF0|{x靬x_ҵ 2xDvseE2:|éj_m_ǾxlڣZ4lI@ʳI m4gU* }c%~-Hxςš%x[ּ)cgY:-=޷umtFD7s {&xH"eO5:n>Í4eNQeey#|~r5 s\J֭$Q%0J9foW$p`?Vſ;_5-cIhpM~rK"m<1_$6+F-}.XY``*Z<$HtU ymA/vX#`Iʀ~-x c~$? RkۭՀ4xqʒxֽk-Ɵoڳ\Ӽ/k?ccw)lprN0rpOE8"l~6g߂){Zn5Ŷr0ײi #{[y,X%H\zshd/9𵭘ATTʪ7WHѪ* )nr}>4Ay;d$dd)m(p{c-Ι5fw=鶘u=cvel`ր-Kp.f.ve: A3T^s<^ޕxO۶[hnjڈA 䟼W`oO7ծ5Xmu#HZjra`wMyiF0Pƣ'{aNkO_, />*jsw$|m}告lN>g(ǰc ~{{VkH>,kwkXŞur1_<Ȍc^5_>%Ծ ,ޥ˥K2}^iXj=pp W>xG,ZK"KUWV~U͸KfE#sʹTVmAkMC} + L #*v==K4{[η=O¶٣`2E~/t &ϲy80OUԖY" Q$P}fª)\H]ѮoFmFG;BN~K&mt@]uIZџȁ[=ȫ<%y qm8.˂\ey ~ # @5mV7\n $ypV' F?]~3w;\[(3CWR|Wk?_xA?+%ճY$_9XI+?gM[RYFng1$ڄh|MMÖS+]p w2l67L1s4"b$,`A1rpkF\]O%yP>QB0rNH/tKoGlڧ:P$t]/VwY"`#(Ir308E-?1r>:LZVKyxֽB1n@] 0ݴ v=x{xbqNGA~%G$w N1$kp+KǦ}~,wN{s,C,Ӎ~Q'?Nm n8"<Ѐy9R67pS qکHF\\ymf z{V+ nqX*Y>d9>e_E5hB*L7z jLВn]. (`N^wRi,ક\ZO9pFF '|WT?Pm.k!JN?g][O<^9?[gǦ$C^tkڗv6W##h9/~eo"o2HgWweK)#qeʈFc]'|uX EF#S D-00`_u_˭XI? -U8U#ܻT_{`e 4%|Yd{xU㏒E*pp͂k澇tSAF~}% 7qbN3^g_jVVU't%rz'ֻ[?-ލ*$ȬӌP=zoxq&&ċ̑gRq珩'lPF*\l ܌'Ebڏ"3H VoI{߱qVMb2~cZ~wr#`d q~>'m GWffQ!y?ZQNqfHdRr4ۛ&K&67pNssUlfGF2 28_iwۆA/=菎:mϏ?d}ŶУx[z,J7Ώta&8 dWȋlKC(pU~eҾgW^. ^"%f/o%N1S@sMl1K<~Wqoca}Pm+8V 0z(d]B.uO~4MZ{# o;>dlC2y# 8'ih%X;0nGSsǧzųV(p+motg<4p;F+e2 _J%DFڲ4Zk{t5>)M?Ŀ,$to,lՇN($% {ff}mwkk:~ oXIܶGƲY#\{o\V߳WKEPXu}.Km.%D;o 8$f^w$lQL13R19ע~4o[KԮmU/J0PsK*oh~.ϯYx?[Q]i?4!}6GH c .i~>=׆vGw[)ۖ$x|i !UBN3 @|7:7kutգi`H&dX)vB ^ /Zv53V2.|}UF OGf^-|A5wbOxq'+) ]_l>,ݾ5oL>˩,,~e D@R[)9N2i4P`QA3m`)2nOj(fo _/ 7t)6_ Zl}JM(+d-;.PYXu8@z]:]ް"3qsOl~uǹ7$d~GzmxS$33pF7e{1?h[XDb36v#u 3ek,71 :*YwL.s98`{ZѷJO@F YZiμQ19凮1Zy(3Ζ춻y7H;qyrfP\X6PhiMmv7Fa߯Q{**Ş-ӢOUV1H"g"krUAB~ğQx^u(.u/i^2ĐFKX#y7W<_mEe]pMCAe1FŹmyյ_tLk-svqq3Hl#eeP Y_7| :9|BkPW%.Zࢴ 2rŔo ?&j~Xm.x:lA"Lu;빟08m'a3۾-Zg1٣Im'BY K*[hmbdy4 jT5oO/"Suօ\xxT |mlaeS#kGR/Gny +><|{;~ ΕsՖ}*f_ dAf @gjúg!zQфCOeQk#4`)]?fO:з]kD]Uu{b-൚2Gf 0[kn 6k  υ]Re4->6塼kQ]Px$~xuEX^aEŵIor4 ܦN9|9Ѵ? MI,)GvHnb>fV?0Ui]H,,ⶊ]坺}#|?䃒E|/?鷯i.  Er5\4+r ɀ>L~_ϯM&xQH}Z\|rʣp*Wi/!|2L+}WO /B7q*6-0х}Smyrn FH$ 杤s.S??ay/l%T4Q#-d-H8OA_ _?h %σM־CQ>Ymdڙs b mo,x/ fI/5ӨF7RQT (/n 'Go?F˖NUU%i< n9}q_ᴱ<˘ԗlRQB(ĵhw>#=2(#;H[{ULK'p8$n¾Ӟ!-rs0x$sLm.aEtHFI (81+OLih!dEląvOPp~u:c)x ݐFA'ҳ_dhcr$zdp}뵰ЧKpĀ mm$n#v=-R,c8>Ex|Fxc4Q@DW?L]51i\ ǵjؔvPH+^C'ڑXB71i9w.7{}{B4R 7 rȟNr;sR'xQ4(*8ZUcN()Ud )?*qm,P0A#!P>r=Brs@ ۲&T O`N"I#4B3p W[&#t k3o"(`9^To-m.-b'Io`?3n]J+JU-,X H[\xrTd`S* Ȓcn\D7)G!8\9'4G,c}r7 @ؔA@zWJ{mMJ+Zp!TƏ,sٓh e[46K05p}XNGbp2kπ=T~%LW[6XD]I27U9 c]6_Yp><>Z܃;j(ާsО-6hچXodinmp*KBlK!;q^ oXx-V^2F-$>aq4`ۙ.o5 ;Oџz$UimR B&DmR$#9oI]?ֵ_m!iZV%b2~dX >Gm_iMI ;| TW6@kqnho/6%處X6©o)7?Vz_ĻC pưW܄gnsW~>_Gt?pX$JGIXY sFwaJ̿ O ɥ~VCym'xCi>Nr]MtX).r 6׸j_/9x=ƻnM͸ eIG?6GoWþ=߅fhdb#e-rpֻ}-u]BU J;2H>yזBXHr8AAxWS:~wh.! $Jr9ߐ0~8}gvd)Gb3qڋrJYS"򏗐 ;V<4ߊػIX;WWpGzs먙 H"s@_~Zi3sA8J*]Rn,AHA #`AaF܎kɼ_,mq`ɱLrϿzu!$0! m 98<][d9\+[Az+\ GhdR0s|gڹH%L2Sg$*S 5_v?v*}6IA<~wCҽ#~'11fUuPLS4{,=w6sjV-c`z+6ڼU S`A*qϮ}.<'k?7pcWE+R#۾i;B_ﴋCdl虜|Drqe.w> V)}n-Ȏ=XX9(H$c1J&77_oj4i>%< & D̰6cb4Jͣ?c_2MI;+/%A&}NS&J =y4|^w]sêh[}8^jrejI `<9o5JܘVw~Z|l45Ņՠץ[KcH^.@&v`G| 'KMѴEt=k^>-ţꥮ]H7 "nhWDe,<[ W7Ey]Ac8K @caeUZ?>Rbվ|@uKhny-щb~V6W$np?j]]#S. I7B>Pמs@ =KHM[Js=aH`;`ƵPJ{Zuw"b;KL}C Bmh. :@]G$7(o?2p:E1POˑ԰_^VK孤Q _/8Kʌ7d1x}eg;O %e"Jd$NQ5^0{{?;H-ѶgV 8l>%xoĐi ^^ -$s$ IS7Tьl+ ERiUvu*YS~W h?uIR կٚ23ƨ'Om }qZ3!Bq-wFY|[iDq˱f ̼PEp>&*,>,oy":WJAD>Bcω&?- YbDxQ:ar"ʪ6I'!v>^oNdX|^El8ETFWMŒm<|Fc"-kKih ;+dBi:*[Y i\F`ʍDq@$\IK:WpGϧ\wp\(;lH#P-y+þ0< =ş1g_|pK7iFH HBr#~6|.G߆OjwMH$(K&a*(s]ß9;߱ߎ!OU:2rKn 1 6w9!ho |.K{M6,oΰĮvo?QmSHӭiN[M2٥1j($(tkZn-%X] cT/rKzy`5cX4dD +x27P s=r3[aOÉ,hK8Y!@ zi~'ҮLx:َ-ԌAaֽ R -h, @;2;p-% lAJ}r@#o̢4 X+[A֍vq1"1Aq@وKw%I} ƶ-/Vk,l w=x[V,@Ozs6"2>@lt7gu1Hv!xʒzhIq܋rdsX g#k6H`\Ua-ѹgo+r rp0X$F6=VK#J nʜ?k"kmpǔnj%C#TdPߥM >m!s٤R2N9zK#39')g9U3⚤9%J *ʀ0#Oj `j[Zss@%~nvK^8lJ '^k? ^oŔ{6yeEB1@3V/4MkqD:3 w9]oOV|;oskas 9cj؄{ e-I]AގWMBTC>RE dXف*ϖېx^8I]ʼd3WoAMhYaKk0*9q9v}ڽzWod/o5,NzOWB9Lxrw `3۵w~9doFv 9գʼn% dev~$ңzs54rB!1x8{-H_~ ~ Lhwv R!#\Q/'8kngkWHrdсz@xF} %|xn=Hʹ˯Ck_rMBYm3֡Ӵ<\ʉ#:q>;S5(,0|K\:8֞a}_uxOZedHn!@;rq\>f7FFǕG}+]V(h {WY 4(vVFpg7lW%+9;ӧrhS~l1T;DEX8`syǰ!t;MM0)|ç!_5Z̪WV@T`z#9#+s=լ#.l]˹y qEW%.|Ci"7(a%)z7ď]n|A{5~#TeRvf(P7GrdS F6xfVV m VO0tF(nS䢬8,*H$ƻ a~͚ͻYjֿSjVlEƫ%RĒZ,i2M9J} o XZ[Ŭ^?$Z|嘦VĬ9# c㇄m.x%@yP mrRˆ~>῏SV/ߣëjZPy I$ %#_1wwv>Q|M-? Wn˵,+:DP#JZ| |9ȫXyqJ>Z4 ,92?ɹb8H71c M[Hg &#V{q]2bD&X1 !YDW2G?y{"Э&Y! 1vȀ@5'=>oi5 P} qm*<2K=0lgKȡxP/ďo6t[[*;)Vц_}257g[XGakzMͲ./Ti$ |\}kztHXd1Xx[T]\*$m/$nx?~c_ki#ilș}&Mɛt&NB嘷'BՒk:ͤ(lQVʁȄp5ooVnG͙1zxs+ICFPw 9 :Pψ߷%'7웩]°qg,ѺA'0k K3Ǒڅgz΄J|JB#? 2!fWA*'ݚ Ӯi-\i?e9%ʘ;V6X-Qź{b_~b2223_J<_H?fe=Yڝb4s".r7F{/ xλ$FʖK>B!X2qF+'J-Q5<c3@5ī=;`6x$0췊W1+K2#R9J[xAо?~Ы%[2I!U/H` D_*𖥪jxzV0 EufP>\:|'~iqxSݮ! Y6%Rw*LxucdSl~'&u]jUխl#(kHU6u4L7>-ԗωchWW ޙoYܫﴴ1Ɵ*J>ॉ-ga-ouߋúLrL/3H$5LXXs #~i-Rr"PYapwTR Aq񎒟+jz')ca$1$t @KX6Qį _Zݼ ^GZHaw, Čp$*_ggo OE&XnNgmbF+;>ԴFW֚d7r~Li/>ڀrLqEyt]+5{8m쫧]8U(+BpqNlZKOgź!>m\0s >nUNږ$Ir6jm8%LuAKYigwpȬ2 ]5m'K5y[YD0g^q@|D/X4cvg9EepF˻ +P@d(--Q EAsW]fSw2cCЦ_o ,~q {ր:}to i逰 P@:qY&hC4Vq\r=+v9R&3a.sd.-"x`#rn[ZԁۘmP6g[t2I\y_7lJX$qBI2_ǠRX wc{w@k±/zVUίrw>1j4,SB)9xx}b y$9>O7-ǖ68=뚿ow!XU +=-x(a%vU'[OtfG\F @6e G<n+VB*:f#BQ ?Jk+ڱXB8S±=P:pGo*Tyy115^ى*s?)c KNˀ>,[3=_r P6*/SP#Y*W@Yzfde=qߠ&8vY`/nֳl"/51<~8ڀ<ͅ;aV~6мwz_P/yVrKKEU&Sp,}~t"R!VWPoYMCGvWwI%ϛ,i,&l ƀ?205]c3-2\Ko(QWK1۴p_ 6Ԭ{%ڙ2?0 dxXnrܾX;N+SH|G_1혼ʠ,s8fݖ7/kG$Gѵo(.ڭLTԨG,ye>>R[Ig4] 3qj:"FO*6\ij5 ';)|&y' |!G.4yftiukkYѶ򴑺RbYx;_./x{KSF\2-#Ř0rWWkN{QOG ,7h8xo4+mFXj?A (;ypP`o@5ҼGᛩ=ajWZ9KF2C-PY(ːs1}f CZGage %Cb*OG藉 |Og zXe8m  b@uOkY k@"aЕec&U\PŶk8,~QeY0 -ȶ[AA#89u?Il.m289=>UƛxH{ciVѬ8aF plgW!'J7!` 75vX[?&t#[WGבN}GVFnl?9Ne v\f*[,Y9ip>`FNcq^JbZpddAW73ZkS؍esK`g?v]+;vYUqAׯ|uZrڹtG^WNԼ%xH@mo$* 6`_ӓ\>5{q%fC@H|P/-[2 otg57\ Ÿw\мT7-%?wIV{(~jw~)~js[QLR9OzW {Oz{O?NC RøOt+OܞŶmrc*Z5(zAvw^6bRqO\t ?k~K[~k/$(s^#0F:gZ_w6I }'-} "p2Q,|^jm2UW69*:&X=:Wji> l|BQ,FJrU7 ⇃^=«[6:O$nF=huxҮ[Q\2dJt+~Ҿ(?4Iosa"62U *@a8;x1N#w@1z)zQ^k7>$P,q6:u56h^'.qu*51Lf#)frx+`}s؊%1m< c~݀#}rLH |V~)ԡB͐*HPtT#9,01_DW:η^!E0x+wVn x-/%v#L)&Yn~~PVo}%yDW ِWF@HGMؓ9_P#X›kf1 ` j ̷eɥ@XII`L~Nk'xX15ص$X>b>UX8_iMBCl٣v9 zVo4,M,#!#G>[|+@OhRJ!Mtw* 0ڣC~L`q< 3Aj3JK*HvKw+,@O>̟h/WGi.$3HTr;)U$0Wǃ7 ඏyŚ˶H2\. j~kx/>1=Ο$!!X:6W|Hw٣J6Mm,VXu$e0OXna]k?!Xز]šsIf$ypn9ٷ&:|[d?c]'ÿѮJ$LA Q4RDF'V>uQI5hmV8?ƾp n 1c\/}Ok#7igoq B"Y%NNM&<6$B${%8Rd?;M"LM/PFWp 񥟈.O7 FXȼaWxtҾ"E!g+_=l5I>٥jVkq"HrtD){P9K6$pYIxoQTIY$Ӟ[@m5sxw+)?{|=j펕4G91v .Kr45DTW0[S?fUP@i\JtBʺ/ޚ{v+jKzɖ-B/K- ۰zϧz/t:cŒ(Ӟthg ѾMb 퐂Lʑo%Xav9 U˱ Epy]Fy,#Q9>@ 's4NU ͕h3/w>­c-عGrtRI}ϔH'6qvQ103:5 +w+3I2lg<x/0E嶋 0@R䓜zk'{|e2nGD Y#!A1LT@s ]\1#ޱ;tVԥWgg97)ug#N<ºSyZ=<"ُ10 J&4w/g3I4u4je|n'ֽ_kHAo,#^sz{M{ˋ!K1T+ @ > C.cs$$& 6ZͣM-ٌuEwɰ48#$r}y+KI&摤pcD T/ʤc$2Þ5GZ3}KmJ~{+O118g]7\ob̟ZI H82Ar˜@zvza +/-S x,2An q^&$yPEr~V$)p8<Wf̖ͧ0:A9ci|/cg K*MRdcM(c|NATz%Oo,j׷І2ݲG[?ÿKoΗ+$d[:<Ѿ.X7lnwt=+|Iy]4J$UuߔPJ69,P|;tdk Z"-d]OW`de<ૻۭST;.]YᐐaroSGg`G'|1=ݞNtR7A$Lg$vc}4cľy+x@%F1@= enU2LK8$x{kxr-oQŚhqǜ-_|<]WqiFM4$9cWӊQ"U2cϥk'ْFHE\W%kcX(mBV!O@9iET7kv1#{=;}4 .Ǔ!9^3@#+22L?QB^I߰)c=ׄc&imUc!ϙb',GQZ)"28<H@ БX֢׉[4~{.dh=W/o$6CvC~n9>88nV˴i_Ԏ4j841ov>OKduUU ? ƸK/T$׭iOtQs45ݥŹERр9e<2[$V.xrֆILY ?ŸɍMA?Ij XCקh"ϽfUTŒ'Y؋+dp{s::ŻF?tG@@B'%1)7Un>^{M|G2O4HUc"-*Nbq3<1#3q77|Oo΀#%H<*d3}AAu@Ls[o9aA#$}?djS\o)KrzpFz{P%ItI9Mș_~? uۋiⷿhfh%2*7/JW.O}A%)y$nrk.nl%,#b<nj6d<91tTCVѵ-/P++ 1.Wy;L|/oB.RtF.js)hUKꥎ:6xUӾ-k \X%@yW庤0 JOV>ŵ}Nr}Ff-3 PSeO7ZwxFGD4 8dNFX''fk H 0FIzk?_l͒v6/iB?U3yx/ ?/GGIyo WQNs\.x'-?~j&[]R&\XiB2Χc(;O:l0b d3,/Π.O` J !kdj Q`cn39h߄|!}gnR}(4MnHeFdwK0?{s|k[6ux緳Gm\#ber1 Jq6_?F=Pi5 웏$ F%uP02us6>o5w(9kH#$# UN[ڎIsy-x`Us@#զhY6!wm㧷ֲ忒=y죒S\#8\*}דA}""W>j"eՖW|j̢0 €6tmRq$lgA>eȑwF9nsح#DG(d2 HҖNq _.T|뜨3Pm&O3S#{XX^p;ugTEΓ%ZMdw sgie@dQwnё$.܂sxz5U4v ֖mXV1V\O>ݨ-طl8&GqΕx;YX228:DM'8RLJ+I Ht-!5u΢eJ N9j$P;,Od 9VǍƑx/Bax.dXD;Ge8M'7t-N͏(ch#ӨgOn-"$2d`PO|G> - )2Ŷp@=18:@Vpe szj6gCNgP/di}g~epL 1Sⶅ+O%-mu&%9x0rpUzy.~*~/a.- X$ C˼_%8P|wo jxBVL݇U)%v~\n!G^xC[uͤXNAzW~ϛw"S̽)rO=+ѿjoTuCk4 vGO`GH*~p0 &ºMyh:<֋E$˓?Nyg& 5uWd 2r rF,/ÿxuum1m4";IA*pZo|/M˔gRHd#s,[ɇ[+2{g߆~>6kK&K6,y/||[zuB343뽲0UV־֮luo+ Ry]sr 4{rPs_x6 eI'_~? {XB6!?UYs9_S#>13>)u}tiZ_eM¾ٳYl( n<~"}m SLЙ#u6So7vTR3_=M'|Y/^j~C-llC5H9 dتȤ򾇥޷E ςi|!cuXH=eT#R6J +0?xgLrs@E #e۴c9 VozNk!gd"yvs,s#*A>~=|F~x1mF3Eqm!y mYHQ>x}P{9cfY HV=ߌיᶟMngܲ&I!yJAuTӑJpfORnzۮx }n},1v"s!Y;JfaCz<ڭtFĄcڠr΁#ɠ ;Ʉ:A򅄨oua?Bڐ##t^)-ǎu ƛY b:~uybdktPHt@&9U59n/Q 2֪j5:^ݻDdm hmP>ILH /KNAjW2I>c¾B$%9H9 ;W<`qvV&IL9PG^A'+SR@GưdaW*Οa%AO)Y OVgKiRw>uq6ozƲnY^qh[6rDаUA+dn%wrX$&)j䴿}^gF v@ #o~:Z <Y:\e W"Rͻ Cҷ[YM mcc %3xsXe2fp̄} gIl([Qrr$ùPdusan\,Z^nR8 J¡FN;GYʰŘvn~HO}h0aN*ݰR3zUHY[-OϽ]EeUَ1ץX ēcvoqP+CԷy@u$@u[,0Qh"2Y ?e ͼPdV eϰSZ4]:ǽr1k8T+(?Z\mK Qd$2+/lI\`/3^'{m;B_0 +q<Ìt=4 aZxUI۹dA>b;D6R;Fx+ŭCSg5>Kk%U1Xm_ݎ$)ߕ+SM@.\-5xV[KI2WU|]vw{m.Drdm譀\ [Bm[% $S*n*#< m5 |٬wp ×_E@ܤ'6״;v:zq92ʩɑY>7;a  s~ğ ^(`Ե8?2 ֎007#+C5,a gvghOrH9_ѵFxWɶr0~e=?.~l"d5̷Onˈi"I moɣiڶhncaL*pSߌḞU!_1DJeP2[o^Ǯh8'ږ D2s02sD3 FmP>icYW{VsVq s>b[K%sx]ޙs5V>G=F~gy!N ؖbE|W?k !I[x]P]:xrȼ x sj|--v!i┣xS&rF=s<}ze[7vJ;X\lFy FcH]@*X@ i"4jZ Wb~,rc΀ẃcgm'RaG,!/|؆Nxڧ}{Gb0?27?{OGRngx"&$|l%,I,s H5sj7)K(VJ0s ySb? Z6~r#t-bK43 Uk=?FY-'cmud-R rZV1ͲE{irgm㉔+dP!v ?zeᯄ5VcZ)"Ybe/!O6Ix6[j%?.hY \ /ßUsF«uO x]anKiWJ|m~#x.I k=9ː2FA8$`u_[u =SdžD2$sF8&3( @5> ֣KƎ4J2@r 7yb^yÿ$\|'>b{S#B؎hRwe1sPXiqۯA@yq"ۛ-6M:'Ilc!>l|1_f|=ǿ մM/~xo}WNrEEُȍUH 6g6Q:nb#8wՆ{2}4{FW+~lt+C؞6iq%$PU)e<zxVIAsA`#3o`1^NhW#{I\f;W{6hCF ' 1X I"?']n<Y,{ݫ&57*"ٸ>C.~׾!i͠\k ǨEo-BEdtQ(7! H ߊ>0|>&qk{t-`O,eJH,0$?Η^gԴmD#xU)N6{7~~V|[{%$H<Ȯ+~EǺ^|3]֚k1s2Ż`` hŕ1;1|EWi[A {(iHPKwڱJȎ3/_M@%'%naOPAaHz3ܪl2p}jKME1#۟Y[5uv%U\q׭;͈ZN=:rc*H!*̤?6{Kgt9*zҳu8-QKx Zr^EpHzHsm6j͉x?犊IV۳| Hf'Ku`o~*KX]DJO\ z~qbsmbYLv=:qdž=xr+2S-݃H)l d:U(~X1)Q*nd=pC@9;/  g܊O$M깊M<}{u7]պ H2$!'JJmܺ[$ifbBg 5ţTQ5˝X8?uy?XYŕfXȈڼ:3`eGRxh777@R@K!gh6RW&Jyb¶Yɧ`OsxA*J1 /N9=ͧA,Dv2m,vH+aՍ/R&<>AV<̤6cy$ |t$_1̧a!v: Ѽ!=vW,tQrT`a# vOėIK .KvGʭw3njM3:tXR-f"hGgi_ bRa܈c"F0L$l7Q]ܿ4;To q!=pB}1Va ԥ6ې=+b=:i+9P>ֱ&.x_P 88<Z%~8UBFI{4vvI"~v#=$eVkJVl񤅑pQ4I#,C~zI FH# SƖ ΧUw^GZW+<O!]\9 txsWwp;w_1cdrukFkyV\%Lqc߭eZ3Ή 2[݄Q'=]k;e{*kT&24{ n_o.> "Z7z*F Rv9괷wR ^1N=sUgYbH0\d(q[TN3V~i,ʣP0zuǵ[Ys*y5~@ ?)ހ)9ZWwAfb~C׷=>zkd1d4ʸ) f( rt@=iYnzcُP q@ ii2&BU4 N Hp0zvҲ J'ӹ*"FBî@08> eB\[ld?7S[UEYQT'$p(%dH\ SGv.%em@ K=iX*GhD7WSٱ:U>iPwgJ ]rG:9ay#0Ӟ8T8`yry?Jf)Ln͖ۚ}J?*}Fiދac&R3q`~* FRb^NGQVDL ,` (xAR1S4k#(rG98TTpƖ7ioSҀvaBB[d*R>F:u?ќ2$g'Xko DȲ)YW* VRTgSO$2DŽo, znk>!igK; +$Np899z`t`H\rTqZ*AK,Ou鵺P:??௢.(6T2^imU)T 1>-XNFBƍ)cg '?\_#ִf74m'ٖOeqq7F8+5)*^iLSbWy\zPx=Ꮜ|IhI" 1,AfE F~%x^i3)xt>jjY PQTc\/~k74}#O M41YYD]ǟ1`@??=D[{±EY2Yc( 6~;\ZCp L@a F2̣Wi:eq1PH98= gX=5RO e{#vK>~Utugi)Hդ+q㿵ZjKc +xS$*scy#wla49ܞ[.\&IcԳcǧ94*D!}R S'nATLA:۫H7lF<9S`UYQ&\g(R#y8 9`Ac+qVޛCw.<<'^=eFF)< <*Fc2 @|AY(BOIR2FN:{pBnL /}r&ּ9orn6Ml(_^ܓfDn]t=0OzX^. \ac^1w(EkSi̒'͊PT#~<&ۢOU!gM9##~-\ $N۰iTpy9jr,FثLJ6Cm ϯ=FU!?EGSln?ߠ8mCNDIHR|@6&%{ Jsѻgd اï+OO#5t|߻*$ܻNBu$ lma|[qu=PF 7-!Pcd )'5߇c񧆢,#\?4sh!8RrsMzǿkhOxNOмyZx"m6{Y 7te)rC0迶WoC;-yz ̫D'a@'ހ/+m>}g@ԴK_o2B\1iYb+m~> R1v… b dU#ٯ>3;[R5_kvIĖQ K8TFv$2Gh%M:}{c]B PAx#;ph_ É{$ukGWNd ȹCe[ |I ~+ż0/et^6/F,,uYHYtrgG[+iIiVƯ{{Es?5tgPw,vӮRW lHPAj P΀0I8ϯjqxnA!zxDŽ6?z0MMO˶@5XʑmݷDhʇʰv|̘B 2`1jK%CK)!LJk_NU#b;c8/YFƓf̀"=]rCnpmp8qֶ}eV[`+%% 瑀GLtlu);][chݏqG8:U{8/>dH%xc#Q){ؙ];@$c MKR{%%)i6NFy9xEF"Xbu沮yH"| n8>إd;G'=s@/q$ @ z4u^Z!&'NM=Hgj˼tU-kv`2:d|c@W6R@ȫR;_I% lK0?5H`/,r_}ߝFL[j -y,v(F9 ԓw~ārcuU=ouY1/Xnw,׎C =R l%0{d{}9iu,gh0vr 9{PZƟTJY휄S=//5VWM\c=yW-t+$$"Dp7bm>(Cv;2c|3sC(|;\[,c ">{0rz,wey*.،ɧ$Qi*XULm}ռX?w񍿆{Pt&4;&v3QYmRPlU>g)ϩx]PTlmJroţy>c? ӐsS]]lȿ"U8MO>[Z+n%C#@݃ޤgbXXe6a@74}{3&GB@Ji m% n ܻ\DІMHNG^qN*Kf#[[˸ &9/Xcmu/$f0 ?*fF#,*پr1МȪw24Tev7nԩ[ɊS&.Td7p@k4IhNe h '@W k?iBn4x!ɸ,.*PJ!|En/4DJ6ՃRI8lWEm|8>+gy12U R Nq_O5/P˒ȮH"FIXT6739l V]&W7Pn#u>U\#܏~xH48fk׷Ŝjo`#IHdiII#bGr["LΑFFyf9sr Fڦk6m[*VϗȨF⭀}*xuEHI v|pWʸ?[ hdR3sUb07)?^Sl/\#IWmaSW[* '@Ȉ@'Cs g<A1vx:{nA{d`ʨT|ȑ@dcr+$-'M**|(9B6޸ A<-XNxb т~QVxYB 8' r'@o64иUvRdFI{^,ԚR;]T<`7TF*u.p/YwqH}@P-_O69`OБWAӄi0ހϵu^2oCE4!uu%'==9#kmjJ'i=€XyŁh޸:׷?48Ӽa·&w L uBUA76O B]߲_;?>{]kFEİ隢bx+`N> | Qi3IY,n1#m(N1r3f?z;Ao+Ԕ@i%O9;~Q+ t?|H4]WxmTnƍO(W(4h*rMxᮛމ= H6"P\ܱ kN/<>oDbtk`:`4Fcpa|,͡|F_]^ kZy\0“B\ʳaQ_9ɡbX_:4-)m܈IEpC(|h OMmye"$6g=ߑ!X$CTIR64 fx_8xjOhMƯ<rc2U <ၫj^ jZ hOsVἴXwHƲImRYWq¿?%hO GgΙ_}jGu42]Yݗ[q@RGjxj iI6u7&ghbY!BnԪN7о!|@|4:@t3F.'TiT 'nx<#nT?V[YC5宬٧$+mu#) 9U}\khږp "vn5_ +7u_ êi7ѫyR Pp1ZZxw/j6>i5[E8kx_^+E I2=TnDT17׭nk9B&.d0I ƞ`) &2-O<[]FXq5dk3Y`º)vHFW␪cܙ8_|%ܖ[B1O@K[D.|l8 t-JlQՔw?J]^;eB4y38$q9NoG",@= 0=yJud})PO dGlū1דw #[C\c+u-t"7sȭݕilp{qҥ.:FC*pKun< qR+hi)3(<$37o1& )= #Өidn  p#Ѧ.Ly ;:+;f;a=GZdY˨-OUJKt!EǖvzO늻4.d-Ep+aH Կe>cǜgk˝oZ}cOG@eVY==;V F289RIDa,OVǭjkiϜVFp:Mh kx,FF9u$NWjƓGOLZKwR[mFHϖ Is{}:< ˯QV%OXdSʸdvvιTv0*1֪i:z&` ǿ_HℽWa1D;:6Mo"E>rʬ~K/$z*ͭ͊!Iх$Ƞ ke"C2wddݹKr=G4\0!UQK?/B=w@#*Ebǿ~(8`{f3H?cd{+XʁvJ#9(` I93ŔL[_H:ӤXLorn0KVEv!$㊧mm>9Fpx#`&,0G8$^y1rF ze,3ma"?N(Oک5Y l,1ApGb9Q<΢ Ûqr@ `wx߄]:K{Ct,y˕nz׆?hꗲK BReI$Ui)*}PEaVVWZKZŕ%`;[y %Hڡx5MF؇wWHe#3 8 LchO g[ "V«„VGeZX+g;M%[;SO% DFFʻySxV[|9hƱKvm˨`9e\쵢P<>h/Fel|d?,!(9i ucH𗃴~:Mj ]5 ")YZu'; QfU7kF.[l8c$cp+OKP\^6FnG 3"er ~SJ~9_V%=ԵãG-R8=t>Q.tB m0܉}9;w_̶R)6 +qVMן軒6X~5av-uh׼ƫGV=-Fh2 ۡ'9?*ڶ^u.-JˀBT@1zX6w2[z@dR#<9VZb"F2댂>ﯧJaI"q㛋{+T7k=3j[79-$#Z>{in[Q(c6R޻95?(}L1KE͔¼oW7nAt⿁--jZH^o"fKw-!;]X 08Iu kW,+p}1(pv]}c6OxK^ن:>5JB#Y`c7A ÝK6 >= Z#(G Ilrш\~b:W>|/Xp̖ڍrHXX%΄ ᔊ/^mqMf;tէXx#E0>0? dؗ㧄g= Tu/u;{mnx`-x#ȖKܣ9?ދNjpmI`)4u.$hnR2߬߱7OhLbӠR)ViU܈<`c'vr0 =L&𧌏6vR(> lZuz\ kHC2\,d #lr@=yx7s-|}+F kq0Ya+*r1p}@a{ E{$i]!9%yFpy]Yײ֗vXIyeAn@Kn$|64]muWe×Xeq)"Wv {͎Iuy2Ƴ:݂@rsgy޷>) O#b ngn\A$(l5߅?`bKni$" 0y!f=3RM[[6%in!m[ c#24_?ĒvVk]!ecdA!g*2r6dmOC%922CofW T =GQSj',c(ዠPI3f< Ľ6]ίc/*̩Y@F[ `3 Oq|b.7WSYPlǹ,9ñ @]i / A=)nŰ[(u5,<H{Jmƶ2y(@csP1zP_ j y!9݁zTڌoDq=k_> =F U6n ( t鞼T<6ۘ$~"KbLp9X]7=c$mEiA-_ @MYm-,G,m $<|.zsV4Dւ#&Ф@s@x:Vv^Ke@zzz'ImBˆ}UcZϒ6 io5Pn@d㑎݈ȭTRQ@XrXc@t=BHa5ʰ|p# ^Ľ6o)eR ؖ[-mեvpр98zԚv=,~;q秧Rom2MBΒ8-ק==K+k;Tya. Rxss,L52kH xӮU LsNзmDPcO'*I2pA1wL{Sx=-$ LMvc4E4/r{ǿ`Isʪw\]۬Hzu/G-^2*d#v=P=>kun. aVX%c]kR#Y^ثҨ=J> K";eX̸${7S#sa 3DD c2|1ӼuMCMf"ۃH H }몦XӵԢi&0.VV呞A$ }YT|;syC,Vk2e2RX$T-k~TN>jK+GeG-FŰAoe G6 6*$rC(CK~Z>y=^D{eiu-,~SvnR477Z5#ZѢK}vE}ieRFWq`}`9|w_?g=Jï7Ze} V[ xH&]?MߍTgA]WBi~"FnQP1 /_:xڷZksҀ1^,0x)Ѵf\JuܻS`A/08.Vo`UA$.*!T2iфcGِy'8@_:YE柙_8J꯮^N՗ɺ1Lc"`\}2]b|c~~G܊ &>+x=0|_mS~_4neRV[=ޑ*mT,9$ ށMSzZ!GB~R2)27%H >]>-CeXuDr?xgw?gϧ. ޟ#^<2[F8$w\hu("ZTKFOFG9c OM?uƫ{lekw鷶9~EH$y!.I)|:׊"/_xV P5ќJInLBQ bs]G~h G"^Z݄=ɚhc+4JJO% |7k-3>$K:3XEH$"+@o?PBV/[_HYի+d`F9]ۻ_$xsiz~#~ Ů 3(h'%7$.N | x~%'ҭӴ^Ge}!|wN4Vq;iӪ#JU 1;qFSj2xJFlm$֥s1BT*Lp'$#^Ѡӂs2$ǏƫSi6r7EW`C.hVmD;5]jY#+g9@cs1cEw:%5Ak1y +qM^|3jf=*9QF#+)H*8( t@QQ$*+,~[o#9:@iS?x0uY:>{wywqwLm$ܼ@Ekerr(3Ѕ*ݖ kiTPLs+*ģEA y;\(91qcOzVc5I݊!\.`x:==XQ9+מ j\V u``ұumW_E> U\eco_qNlJʗ*2l|'IV4m};]A%Cyo1o G)ܣ$zѢ뺦h&!/7WC|aPc\5׉nWmBM -=Cʓ~rWV7M<U$ Ae#=sӮ:VM1) $ :֣ ҵDSڀ3dpܯ~=?LЬu k/4U4(*A?֤ NfT1!d<9b*W7#iaP&Q| G4\XYHaSԜg;u^}i^o|Y0c^=k.q3.=GuZ]w75`J=zUF%`2Zi۳%c@@5Ʋ$zP2l*@qѕS֧i BإJ(2Ro>g ?N$2W21L#R˳[mCֶn}![s 7s2.`d"3~(Ѧ0S ڱ @<㞸^⫽J)cA-[r%鎃^ sV/~ReϝEx׾?K%YnEBl0$2S; Dź{K:-i-J΄ާ NMDX_Z;cñ?ڭ%H|ø>1_u4owmJ "qps=q4U1^]O6v%lĮtXO[m*=;ឣưm?Zba|ﱐlUG7xBxmmɎ[{IYGyJ*3pNqR~~ȶ1i?8W?[w|y9" @@ C3||Xݶp;/L%Fy'8*'H;852 exyVE}WP =Bƣgq x 3~Ο'j:xο~e'E)TŌ2T P?x/&ewf`K3< wV?QYkk\´^յ 0HZd\{wřqbT#IIm @rӥYvmyq)<.8gy{+h2N8~)[M`Ui]6r~q@&%ʹm Irz3ckA#1-r3Ԍ}3^ +WHF O0p07 s܀yCZGuh&63^T֥d|`YaC=;Ӷ*ϊ9<%- vzrA`>TdW@Z\R^v$@+Qq榙x 1H[i*sub+"Xo\&2F[]N[=AjN0ېs@([>:͹{XT H[ڬO!.L95hֈNϷb$I;'= @Gp%'ߏ;H/4 J6\H>YW#x=A`6雯w`ԷR(pf .MR-Qp1W{'#i?w|hѮQ}2Gk/LJŇAT$eHAy;᧏>Ҿ rD]L*nITu<20ʕ / >'? Ϥ隭CQR_mDOVgi;ko\4$ܞI?/jčtX^I/Agؖ)g3;*d$~ .-.WK˕h)$aq~ 0vg1\XDi2&XdH3yGk35|q8d! hEn@ 'hڴ^D*K¿\8S s@0hHҴx%l{u=\a{m^I5yST"412aHAc' *]^(-;fՐ:P ~/X}A=\aFz7K[t{g>C4V᠙W=Ae֡}KMX[d8)#pG|t+rm7' ዷ˅LJ-"Xuɍ,3N5d2RN";mV፵1CS[V#= L*[]ض 2=G=,G,G ĝqVdVK HgRYЀjAHs\v>4ՖQ Fku . rqӷ<?ė-Y]\5۪$Ha0b1N;+]g-Eoc+;"+<cנX-޵"yf0IzvX^%"p6#rZL"'ƯFABkmu*BA #x,!}Fp5E LwgT9u H1NI>~B7dͺ(#A9e5 ̆Eq r99jZDƷV9qs9:n,Bh (d$,e~.R2ʓoI+K,Epm@׹(VNI/tɷ{`Y(߮GS\MWvxE;G3jдe]47_,qw#ŒhW2iK)]cyvsӎ0sVl]CD%z/\>YiWe,^u :s\zS5)ʹH坉be) }P҉Dk*sq܊Wɭզie_6/)ـ:ltҩ4Wf'X.T7/ku,4jS+e8&8 =hͦ_GChV"=JldGo=#ON$i-#t$I㓷=GtGڗ"v4ۃ5u/sU[g|E=ߍ]Ef 4y;f:_Eȯ,~fgܟҝE{퓉a$}AxKX.FP ^:d &Q[BRI=@&갃!q{';pK0 3# j6얐(I13J<0u8=x"[AmfL[Z:a`jwז\JId \=xjwu8Aln-@9vf.Qf/q0J1 2G Jぐqߡq庸Ѓ!N&2>LV q1M&wpzŘ!hL}(װ^ mEw$pzǽqw"mnMf+9P‡ \O^\֜$^j-O9$}Wr,fp\u `x8Xя ~՚P[]Z]#21ۮ1vu -XWPC?Sc{W8cL3} ?KA b|ϓ@w###Pk+GOU ȀHB@(ʞXʷrcWK$iHU @p=Ʋo|s) @94] 2H̙z r<\3Ls]}heNp3둃Ͽ\]Ηf\\, yʑ LY6埂Oq93G(O9cwW1A$BY']^r 8'sztx@[٦evHNTs̪@,iNC*~R JKqk#{ HYZ+Jab9ZHu $ux &qKytu1$¬(KR}T k]Ц«Sڴ<;YZyk<1ʌ(mMӢL]522Dyq fKMm楽Jdą$BJp,xӣ9/Jh̨v:dWaG:|ue'BKe%`\ǿ c8>jo]η;mt^BFv8;11; ߰?M핇a[˛nA~C[+dc:/OAӯ6mX m2DlğS> gBuf#]!(]^4;F\tx8p*WK|o؟Ρx;Q<^'k/\p"? 3@..!kV] bxQ_|2]⟍#|HM lz'=IlZ~ca'YwᕶB{ciQ23/'s8ؕ=7Mt.<=S4@0 rx޼sIƳE`Y뵂JfnGBzO&b\@b3wҾt đ^I>Ltt^^Q] W|N{[b|b%up~**6` @3YE,R!d3ulm,/9*Xuy˥v4'v,Pf'\UmlP&Bu;r#`wpHגT!yMOprIVbqQĨE2FB^Kz MW5Żu?kry7!=IrFAuU/&{5nîs>-5Z7RLqTq٘yR>Wv9㎼Pw/#GGgv2][ )e&4[Y :#P;WDMr9WB}F 'fk~"-{Az?tiDI-IrUٹyvexkQh&i }Ujf9Z)|Lѐu]pxB}B&*O K@:\DtJ#ӷ|_eXɚ՘oݏHϧYS·1-Ŷ P.rZ̥ Kxh}vN΍+ޠ$:-ڄqAJ^sD4Smh#3bI%K$ yZ3zOE,跕o#0B   ZK7pOJM[J9^?.GԴ|ϞEG/kaLF",J%r9I\_xFWh7 xv LxJ%w ZsC$#x,2ce>ZymiktrR5e±|8石~4h(RS6Ɖ'Lb]ܶi7ĝ'!HA~e }?f|i/cJG'ZvHH q@Ng27־(;y`Vl @O*VMyoe_OⷁMMI "|v FKުvZ[k{k Y mL/$iq`ج} zSP-/Gۤ$ ;Ͱl0|rÞ(zkKKawؘgI6!,c#XC# mt Mk>_nnbdЯ;W*?L_mmx7UMY!=\(`~#*ĎXwj\~qxZ棫I"YtL?gIJN3DPC9x/S[N*EZ>+dE(]cQr Nw{[xoO\۬+ ,$wmoZ7W*A0;PV`HA=7.]$YUP^Oj)qؖ#L1/S0s4y[}6G-Jr\t֫jڣCx`N"<;퓹\cnZ{bDPl+!@SzH5m#L &F*U8`H6Fr9<_[$?u*yP`ypOJZl)!@ztnXFN27pI6y]~"VRU\Ap~qA5驥C`w6˰\7B:rqҳ[{m4\"eb&YK(c$t#n2кF92a|Ƌ1$eAv'w-Q[wm=e\^MǎrNOUQb9̚K- fC{C޳mtcpkj #"B8=bPԒ3sm$JYLmUqճ@BqJ%%¤`d u>ZѕQ^]& A>D IY~=+O]O3,%;wҪq积U;2I acBۉ#n8ր"ԵKO Xsq Ksqrzpnsno@{|p O@'}ծmafc)p LZդ`*33_s׊4FӖG#8&Ynp2ztk{,¡; =1sYkyk5ZM#JCc߷ }ČGlA MOZtk&if_n\Vfsy=_C.8c+S&th`tĢXxG)zf}Qt 7,[*I1ҧDHƪbvC@=ddPzS!q?CMmPb瑚|RyC[@l!Xz-4a9Vbx}1ήE ( lD3Gj^x[E"'kAS@ yql5*6TOs:3k~Ef%=rG^;H29>> 2X!eXԝ:[h ܱuؚoE 5Apl{A$qUf0c˹MU 驧sHu)B@9yX$H~}>4z~$z)Q vE*PwmTshMb^KwKEa9#([}Ć  h |w~GԬ=])7koG|D+]fY2ce#v>b>P,6H|#+nX-iX,QEFW Mqwliv&MO˒QXɷjɓ*8ǚNtώD$1Yw>dų4-sE gY<݈#izWvD S Sv H $28 ^mzϔ+#|)I18}zu@ɽY * ڧ8jZ1l @zwkKRXIbpĂ`^GcTͥ O˄#=xZT]|nYGҨ i<)|(q<樘g!r6=N!NF1z+>rsƢ%W=TB7#C@/\ްĄZI9%G 0N3׏ʡno.wAI곬9Qo-Yrtl?KZĺrl pȀW~q@,Nއ#rF@@|L [NT`T,%-PH):R0̎Xj#$S ɠ zxwUWҮ)} Pkun|;e|-7#+˾THg` }د0J5fg5 sr"۞F@zPGٯ[].m&qᜩ?~)h-ld7/ uhU;D$;P+kkmG7k}W,@G89zpk;-hZ|.@$h1\ >y\5i:]qg\Ŕ< q zTidљxP28R˵w1RYX+Z77K0 lsTgO+iH.PuNr 9rO.zւX%1 *F3'J5ොetHbɴ||͓_6zv,H4wpgGuIȏDUF^F 'nrF:uBD26E!o^8YEҲ  ڸ}2I4˸)dI;o0mPё^qC [ŮkyFBg m9 x9 w[:ėyN2H% c:uEyZ)S/i8'B6Z sk#+pVv(f (dp1GPmݯaH?8 Gg`m;TwpY؄'rxduX5 UQ*+YmHzֲeJxAl=W"񍮩͢3kJӶ4]d1^RRA V#0}qZuM: _lIB ^=q\@^k?1 0*o"fG*A>ϡH#H.Mn'X!r#6Hk֭&};1^FJ r\Ir-3iwq.@Qۜ`Eսm0 7Dnm g*O^J-5}f &Q,GU7|x=ӭ;g[Ӥ\1*rBנ lXFrm zN2:ZmV=GBLx|U0wr0yjƗ>^l3L{WP!h"[d^269}{.^^Iuc(8E ڎX4[xԯ|arofqHg5xX'洇tgkBG#8 g:iTs}9oj0P|B0C d ЌVZV0o\}AHz̽IdEyR&\V۴sq@$hh#u2!Gb2qf0puQ8 ;GB^cl0#?H{KkInkon.m1" dTH99qIR=''3s߯Z|7/ܼjrc$2휟C\5K1鉔HŏXoi^!Z+ Yʏ)$r#A@ GWsD79^J",;ŠA 0)$<93] fg-|67 tf2{IjT{5I*ڹhO+t>kW1^rsbDwE8ڐJ9=ssv\N_g"$]7EVQFLp2Tu5yTd`c8qϨ.X- PFI3ӏj޵{$F19Qu1K{X6CjnlÑȬXX/խ#Ca<* r@itonQpRĺEnv׀@.5F$Űb라(?\|gzPť(BF 'Uh%ﮘL28O9&F konP%tDL>A{]S^,Q6^ky E$KpppE~0r>'W|%kj\ ۲Z4q]u-1{zUφ/Ypn nc`,۾mrulOŕIo;R;Hn2EK(m\t^,.n.Vwdy3tVH=STJц±*6oyIC7g^29uk-w[G;HW?20<3ZeB1A\)g&<9PKzPy O,$SjX0FsXtň<U- omniA@ FFsFr=(@W=o|_JjvYu[0UTŇD\|FUB_~V^ĺޛ]ڮ[Jc;o[ˌo_,*9Agk~%i>05}vyrDzt Z?IZUi6viCy],w11m*f  QMV]"U8WaĬ,_q1exۑpG9/|piPk@mc3|nFta|Uq Ħbwl``#4 2Iѩ{HY\|9qw4jַ:oH IZݬ^l6'N@aӒzUkUkveM.tzuحlÀWvFlg+ ᯂHXn-9$7d;=x01MڼBVeFTCq$'$=X[35[]7.pr89|H ȳ_Zۉ̩*zN v^uou<7&5d$ʤ;\9\}h#H}$1bcfe%wI*h7sYbv$3Y~}ť.xl -q9Ȯty# { 4aI9xx +&𸵹qFS0PR 6?{@=hiϺbvL6!Hr3Ѻ 50\D_'v8t8%ں+B ) Tg=:}GNoaI9 Ñ$7QSn"ђ%P# =EެF (yS`wu+x5XԖ"2)|/-HoLKDZɢNXR$1Y`'>ADSڔM]rA$V9O3Rx##*ޑjiS̪F'jsX t=(욝L~JH6d]q_+%.. F93[:LUӦ/(T#(ٍl Em;տ mVKgGW8B АyXe'ʳ1PAP<9 2X)iP"F@!}hѬ-t6`Mj8*2sFxe "'$* `qV[pbAGH"#NIGz`Uw*4Ue#k U1G(x4&{( @ '<>6D{ 'pP3St1}_R{v4I,8ǽ]!7["v0KF~RF3ڀ+5M,]<*nHgsTY.#Tc Z[·b|Avy6yb\ӎ-MĬ0=qZN'l|J@8#cG٨m,qp2~GYV7O''8i0$c+y,ydVL6Sq1u]nBAר_MCXӧkKWs|+.c w.8cMV\-]"vDc==+ɾ+NKM\8F rbzg?`]OO뚍zfyXr϶*";ܝO5FYtXvW$sG_>,|u:/+5u4r>BiYWz=?mcR)=/,:m$-!8і$GmZ[lϘ 8W9힕ai7V0^B24=q5I A=M%+ O>+Ya'3doPA~zypZNDdv`zW>@|3jI,i?fm>K{ m>[- bVee #+䯃ך>](U𭜖RDO6 ;Str2W'JM⋽J-&nn#p@ePs |5M{QRʒHmabVo*Ikr*$8#E|KM)فeݴHcg K eKM6 U4iKm^-8ﲆUm $rnk0Idb c._ n=^RyVM8˕eFd99%w#2>GM:4vf<cv(V8ڀXzr_j~O$sϵQiQ$U˷0sH-f*0Q'p'4r+y8$p:`9^]զvMm$kaV{v:Nkm5$(e1L3sÐ:q͊NqjV29[B̡ V#x9k;y (tKc<.K=_M$PlݽNA k4).]5F+p0mhZηv Ѩ0ꝳq۷S@0miVַN ws`*I_S߸PUTgC 9 Gl#[h63%ɜ௯Ϧs-*=t(n<끁:;OkOkrcpMO8aV 7 ˰ YK;펽`]*kMB%T3 @'93[\\ +t"xzz[;hn;T r8l2G kG%C5$uqO-AaԜmt%B9|pz~4sG~m"I'Tp6*I[V!:qLԴILhŞsg'AioM[ 4 mx s ޡsr-)6Y+Ҭ--r;fN 0A ~#iט3O$O2rC@,wn0p95o]mBhǚRBH<V)VM}=bYraQ0 V8$zTS$N7(@Uȷ6Mm&b7p6w8cdG )MHOiIy?r吣HX}vF::6үTE#4A%rs]}C,`">Hw9W<,f͆M2E!ޮ˅\dg¶Inf Sa.2zkHÖ)zOG6H3/&'-]G֓kjZueqŤє(7WqҖMĒ-kNTl[yH 7|)_Cu k:t:03]yG1i F@A;0ܻA1'L|EЍ>"_b am@mR H;@Mk@̀?|] ֢>,-pzA}yc^x Bc-ŽK=>\CZV+m:hmuM۾Y0Cm{um c+0G`s\ kX|j65a12O+HCH\uD{e8^TS ,>P *|FK@MRI}~09J_6@][̲@IW<"(a)&$f9'-`r9p32syZhW1=EơSUyB;B)f55=^fSmƯZK{(p#HMM <&<Uׇt][VHY^ȗiCЯ8$yW[eIYXex0Il`c^"e\$z:dܳBčŲI0׷?Aq %G*;OA9X^vλKrq8çW5hr";^,׃@XsPxnn\dOoJ#u< pGW9Rs sf, 8;,b1BFXҺU*VSʖM jX`9-w(=9Jd$cQg'@G\[3&<Pi"s}RrzE2쑆03@ sA8<}F{@@hA4PtGlўsڔv>֥7~:ĖpLdIL);# =Tמ񅏈49nHXA?Oth)%ow1yeH1ክ hsx~rU09R@$ kIb|Pƣ+1gX,p [zq?^ ]q h#}sD- e.aC;AnGBsӵV Զ7)#zcšȦ86r\.ٖ$^M/xN/ua [{Y dL!bv| rY]#/2Q[ ;TtQ-IHFxkBlnm(ŘQ7#`anb p#q#ק=:Qy̺p$ąI7 r;F9ޘE#̶_ vx<֮ VWSg#nN23jݳEnURŚhH(۰phdݣFv%L[;gqW`k;yg LG?$j;kKM8O.YC2U 0s: Qp "9(I 38#4Z-/$zrOo\*^h-˫`8Җk|Kq $>k#T(=E]Br`ԃPZv6:њwdWx`t]KJxFdjlqpj2\Z5ni3`aH8Iv95kXKbl331;͔QYkrKwی ݯtYm@88S{Ց캔QB<'e9$XYIqo%<'/#Dxw)O `-zצk6hrc*q5֭;֌ab:Lm"k%mwx u[w(2 2%]յbNp2xgOgf%ݐx$7cvZjb{]YGz5̫0֯[B\=W wP3pz㎴F%nЖK N'K6wo0KIe9瞙>\i/cAr +#: |ckH4,F0?_ˣ^=ֆL TPpG fuhgu" CxWj;r7ׯ5Yit@Fxc!T}zfX~(x:/'ԭcFr~䍧PvVذ0lq'+&Sv59,Z[mOݨL`8<[n[-|DGO(VԄ_2RV3 #|8dF 1 3$<jhso36`zs×rJwѤ J*rH"8b[[Goo!A-5^zQlq@ΧG&w& ^0KcQx l~Zą2$7^)9I?W.'T i29Oִ59>e|it똄qZVbO=ztXF<|:t%3R͗,Ӵˎ[e*Y$NG| mcW9cml'&Tsam˰1rCO,@7'Yq*=14(e|9Mkxđ6X2?LB"DF# ?˵A-۳8t]"8ϽSg$; /޴gW`6vINA'ͱ׶EcrwW?~# K$J :i?*/QO~!}ƉrKmP\gc_~.f!qF?# TSFUKsww1$R~~?D۵ ҖF/&Tl< #!HeV ƐzbIj#ޫE2;FAxVa'9x~)ş>~ڶrir Ca<`+YmČQ_p^*k BIQ%<xt*Ð}v֛J.SXU5T.B-I(.E{֧uqiV+/l9R4񒛙?^]*C֝,, /K#UKA?"sō/X^ 1a$PyH69>PN  lZ>I& ppFPplO]O&s_jBO)ʊ*]rApA+oU;Ɛ>˘7nQZLڢH_ KI 7{—?7Lmdgg5+h9AP8$l(/>k,|LYI9<;G[ u;[VsϮOdu(,L1y@(p\ee`qW2G˒VbA*3_eNSmg7
x8:u&Q(]mI瓻#7 jYMbաT.VY3iPy @<`6=ᇃ|ExjCldx 2R0ya|.o =Eom,õӴfU4x+1)ˌOׇ8[{$&)ʸfk>7y`3@~&4՟ܗi+ae,Hj$ &BPQBZHM֋DĈiZKFqb>Sg[0C[i xfsf_\]Xn5 ',R\}%V Gr9^5}{ylӳA&L",*Iփp,0J21R>1s̶wO]~4W"BIqm&KmÓ\^I$xU[k.A8<{W][X/;$\oj)&ї~ONAE27zeOwipq4mCsgi98;Hr%JCq 9 #v}2 "gjYgbWp:+ԑIK׸e2m.8Tʞy+㾺O&|Mdmyp#ZbK``Ԏ+LKr—`i9U\]fcH%PDm^X`HW*zgמy,De%يp =9ՙ1!98\b\78bNн/USv ͑۱4QV! ?\~5m[?V=€"ccNpIi4QފPh? :J(@(ӵӊ(# 1ҤP 9J W#<. K/ċFeg9$}>M2IGpM~$ϖ $ƧP8zv5j[S|-8n%6Z^C3+| k`=3_v=+^[|.a LP_jCTmΠګsdؗLU2HU"3ِr>SRjZk^BRVGqvKx9aʹn‘/iq +I’| ̤ ^m[nnf93# |ͻȸU tܿ׭έsjȍ˘tեgRʜ0ʃ ۱Oy RhBԞ}\&k[ZKHlVg"fSOrxKaXy+q5V! Qש 춒գZvvN1+@vcnRGZi41[Y^5feg*@yrxFEA6Pa'8jh^[Kig*ʅF?NԵhBC(19lzPc[s|M'F@QМߞjk Hj?ٶw1b ;ؐpF>Z-Vr͙Q7W9]iP~ nI>2Ye$U- uiHZy m"Yb w.O=zrk2ugOb\&mD'z5ڱ6 Qp:zP2H.f,Z9X#+/UK,m~N+:dx+kž?j}5l`Ip)_+.sG ӪI;mA-tƫr=1V[5Y'Qy#>>=Arb+D$}`3Zg˹L,NHqj'2prr)'; 'loۖ8#0yFo.I-";zg{QRE $RxPO=K)9m2< /3לDW6G̲F@T3;J0r] MNH'xGfCQ8'vzO9=E vr@۱{RG8gp$^lO'u>1X#*E #=?Q4ycbpWV =5YYƈA$>gl5:;mmw(>Z 4] ̇=Oz6*dz v99) gl-^2{$,88Y9e5+)3@ݾƄڙ$fL\~줝aC[O#F3UDs$ |ϗ1N1SۘI԰lpq?1vTTp7UjI$bh, ~^5Xp!o`>l:*di"Ac'Pi'62\NJ#e-fIV-*0'ǯ:֍֡$k DB!St*n !P,2#|9錎}T\C%% Ȓc1׊QMQwvo( ~V5躥qm$0L[{[+K FiÔFRCrW d{PxՇ,5&MHe[iU|.w>;oKھ\ouonݵH 60xbMlXFdϗ7:ɺKĤ  9_JH.a};xCXsqc덿 \oJ~U\ >bi''n26|u{}, "a.^I0Uqȯ ׾xJH~଱b6$lx' `bm.,g["~1 ;pEvZOKOhbXr 9 =߂;iͩFϖF.r~7xR;Fql&TXHF 6jt_㽜jc@ +ngMa[*08c<#}z@B(HK*>_ MbHh 9Hr*1vX+ր:)lOYТ~#:"EHoM~pds95|EVyxķimrݴ.Wp[g8GKHX&/xf D3f5 z2r`I|*oXiM[XΡ钡ÒslhK2vUҙg< +8*ù}^ݫ2`K$Jcv)P>Bd rS&fD[IM F0(.G T'{U;!2(),1{7=^]ۈe0AtVϽzǁ>5b70hdA6@ An? '届M^An dT# ziLz)iV%hoeuoj2l  q>7o Lkڛ^yau6#*)8 ǶOپ=Yg2Bwwz4zfc},HѤF_<]3p٥xP=>yۨҮ/yӯ+.vPplH n +ᥭLJ,Z Ln6=xⷋ5"VLw/.5K(0YGL-a}]e&bPˎIfJ<;mX ͗?g߂: tzu[%V+b T%?7:}4بɊ]fYbEܸNRm2Bl5=bTd2.߳D7i6UG!X"&761\1JB&04k:tou-BhD-Pa+D$O|ACx7> e<;{exb r_&+ɴlP7eKQnzm׊tf3N";3" J#h ҵK.ĐI2\H$WE ȓ~'u)[cqwu%0\]۔4YbVHe8PЯ/chn&3.&* COD$RZ*G,2K\קx@+xPʛc%RKpe-90o.8Ž[M꺘HZF7D 9HUDl_,p^6IgdS$RH0 31iVkZjufdh_J6(Wl*+.uZhQwdXg0!'1s^~2A>,."_Gf B*F9 v` kDY+p! lvto  $!)=}1>jekb+"H`A q3ZF߼U&@c׿ckۍdT#?\qQ]/#pc:[ko̓9e~UlOwgMhjhԬ3/=z=pu$}jV`}<$v˴'UeN x8y9 m9hjG@_:S $=h<Ҁ®iQ֗)3@ (vQNhoZ:0{Qjkz>\ps_ԟn+=;Z: @BerWrI?~_?gONǍu4L,]@< XT@@Ҟ4i%5~tvc1x['fiV6>"](Cym A@92#៽{ohVW֩t"U7"efpNJq\e捩h:5KY-'K4MChؕ]cªy)i<8t{sossy"hxdVfT*}'MmieT$sh2a #'5 S!՛A+!kD"h ,IaH+umyc$D3+`m ep0菭j:\xmhKmI#%lrⱵkQ<=kܲnbxu9ܞAۛW-n-$܉VpX p@jٻOD0V,]YƢC q mĦ##Ҁ4[-SD{[yAolg~70xl%Qjn.ɶ-XX/\M.<#ijZU$ASf|~^Zig(MW%cD\'Q;pxOOZPYxP(#=yV?"i#;b1?#Tl5߶M$8ݞ}O88#^F nM@m,b'xOF f}ӂylNL(< Ϩ`O2IcD#f8jUx\e 0'hiv֦9f8f0f(<T1Nx >=wbdv0@O\CZ`Uo@=Rd502mp>ҩj24luۤ-۹؃zȱKq=*``Eצ(X qx$ %bAGc@ībݴdt X6zޡ-r±ب`qzvݤǹWɐ>ǰ֩]rMc JyGŶؤA"#Ae$$ſas P,H>vފcvrF@98Iqhn% G5]x^7iub|nHt(?t{ۋ۝+ a19!@;[`'D#okSG[[)m,2;<,Bk\֗V\y0.Fx'>y?ZVm&$n Lo( c'P?أZOlϷӇ$j&dP]C#v@d~*(tNY, ؀-"62gAH~|D3k}sk=gʹn?6Cd1˻$085٧Eᛝ3MЦY{4i*U'Ñ>Pϯ5 ;gGQmyrhXdH<ʪfSWh60ZAp^lֺa?v]ۖ v[xK m_kQ][Ej&RU,YE}bNW3^y>?>kh]a`I)F;Im2ʐ0P_ͮ7ҢhD ؉Vqݒ,]6!<ѵ+I F"~H FPT}WgǪx{F,e\ܿ"< ZK'3գFr0XCY_@>E$l.VkZ8-^cI6Rpn5k1Qg.[y,o04Uػ[#n~ZEs$14w-s#FCp̾cX|sْZľ55qgy-(XEʖ%0#< H bOѢYbH8H d6 0uOٿ^/Դ gB@C1BM .8iHP^&>G?I] "]F.O`ٞLo$g?tyegizv*_j:|ۏi>7%ZMωlbLy|èsR{O{}CPEң,1ZD%'PX zv0`vCx-̯$@G`0m& Q_=xzYt/&Q,fyZ$vRv` ;/6O-.%f@b 1|~c7o|c-T[隤֧r~]td")^X rj iTvV۱ au,mn c;VWjyze7ob ,ȍ*^d l@c_`VkmtuԼO{/umeg?>Ak$ a\׀e _7)WRn[LUGw{H%70!DPm#>R-ƖQ+0ʤ| +/Oᯅ YHxl-TRFRǦpr NI&>g=:[6ͧ $ˈWuQn1 j?_ -vZ200ZNۄr%ܬ>n)IV/x÷n9aR=N#dP]}{lGܯy G9[ Fˡã)F&]  ;¿4=Qmf-Q"uUbsZ]vש0&-`9Vi .fôfA6!Pؕ>=/'t?1ԣyLK)u̩QmyK@Ͳ+ ;C yBa9Ιw5/I4ɶK-|ytlP]Y\r+ힿc{5 ] 3K6Vh Aܤ9zXt)xחI- 2ʞQeB™65. Imv2cYcE c泖>dc\*S藇IҥX o[v;y"0vg9*57/L%qO_4V֖Lz{B7 IJ \* knl;n/+ s2 [$r~)o>٧ܠPUT2F#yY*[ dlO~ޕxk+gذhCoc,><ɧZZ}|0|ӂv:c0gm նdܒ:VvƧ|Y #;prG?j\jo<[*μ OAI5 x.cUF $uq\[m6&0zv}sU }}?:׸Y ,mϠTb) C:##eMna =AsQHvӁ* la`9MYj@?0'Gv"|P((wގ:b}ъ=qEwg1ڀR}+a O0.ksguA1ѕ+;Xd1ʮ ?O"ߵO졥z'RВ8E1''{rA_EK{-6S34fk." !P6k7ٗ_{8u 6}. K"!K(՗<t+m2cqFmP%2[@ +<9r@u}W^Xk6}e1 (x(UT A,7GQz6"ht8Qe`Q@ B0ώ|C- ďaa}X&}kNdS;G#*n&l/'\.> J}f{IG&wO, 6\4t"\ҠU/ j:|=W0mTFW+_8 x̰Q{ rB$kMygu.%͔_s8H Ɩ&#_] x2oh ʽʌH?x:@细X9ߴ2kiSڎ& zb6w ʫqX p |/loe$GNkk"cwYت89ad4,KM]] {q| X6yC@i7deH2N0ۭKc,="V8w>'ֹkmN[_%[IMp_ <ޡ4q"H$Kb {(0p@Υ@eIÀ-@ ǭS"J62w09`Hn.qx$7Se;rݕ*) H=ݴTzZ.ldϓ7#bvv9䀠wjZ;4$ IRN>_$}@=ZԲiw#ΆY X㒛zx[4vHsXc:`{28ޟawl$Le+O\aIjkEsJbVmY*{dW1wpW$b- @c$՛pmwr\K5~{}ڡdq4%n-R6Kl6q NHx5vh#-f!ԀAcBN<o0A,pkYF tx:`IaasrA#J^+r4H[  g#Tyh @I!MY`|ԎZ^oY4 m.ܩWrvF8si%Mh 0U^3-Y Hձ)M 23݇V ZO:>v0 #'VF ǥ$7\!F\L$$suhTǪZ vQy+9nJI dtb|˹ț|n޽85rSɍt=9PDpG̡Hzj+H@*K9J%ыb@'}=mV)c3q62qK9LwB g}Z) K1A9 6*zX]юpc>եAa%́YeC jًͼC"HHc?~jOM2I^|"8ۜ}fyi-^[E,Ҫ7# ʲG"0Ad݅~x `NN/;iz}bXD27 d$0jd2nԲw'b;D؈6>R$*qeLL{n[$dzvSH,~)0F9Տ3N"# $9$: wg ૌzM23.sv/0ywN3IruXJgao~?RQw\2Rq>%%M @'+2uCۧJO鋥[k˲xK! ` =Oz>pf  ?ߎkթ\\M3ݑP.QYw w ~Z.–vQiy[8 >ZRv1}İ'ρ .oj65K'0bs*A9Qkxgf(2,1܀nO@3oC<+u_ p41Da;8h Y _G\dSDqsdt#^0k6In^LEw1ڛ-L#$dc寪٤"1Tqw5K m H-OKə')2g?++nׁՁ-uHD%O-"\&2)2]ݕ8yoAuvq{]~Z]IX급 # d|߳֏| Ѵj3K4GJLo+DX)*eRnZƩC5ӛK0ꛣ'| ZfkqM5je("dՁ!WMd$ _a7 c_ĺ բi{#Ge$mg5|<|cq"^xLӯuYZDZE#Gn6w0???/tK/|I|>184|NKxva2s+(?  HXRQWfbm2dZ{/#\ш'n I}!~NFE4{|ø.\6>Bdj->5x!]džkAkeoq)>w3fH Nzhσt߆2%jqȭy{-Fo8B˰m~7gԆ.Gp OymX)(1Um1%^P&nc%ȷb<)%ܱm0f3?P^MB,r361]_蒒ϧ{d&1HK3,ʻv|_[P'"֭퐹xŰ"khLcȓ݁ ?^o0LWVDJWƬ!$c^>EtqpWb\3HAܸW/xHGųI:k 9+>9)1%ے -{YttmUE9f - ۛt姰do#"(̟).ोۃd0jRc5vR5v#ɑ]Wd|F9-㡮; ^]h0$=q@aPYHYYxs`2p)uHѰ8g^;P 8:f=iv\cc;944NM_€ \Kړ@wr]+BNp:j~:ŭ@𮯫br,G$.[pݍr2 4Km}5=ҽ%q pL2I~k>)ƚ5 Fy&&/|IWtPK8}\T6HC1Wն?7-j(Kylg x0yor8mQp^'/=FyH}w wW%UP*.V8V_ Oqyiuhۡ/#Fb~o*_ H-2N[;)X$QPDF^8NB;{ ji- T!xTi;F wZbFg+ẙPI9/F zټ7w$0$W )lexfku |W npz 5 XkCv:imUTl=q Kpq.5F}>i%iczqIzo w]0%Ρn*i`͕Mx`I28o%Ӭ7B٥ZF;Td8c®O4gw,Ŝ\N>I„$ ɭt.s*fbocv۴$~جk xB^0XfSA<6O~]cOH2[zcB.$ڵ~vQ4R2p _ 0=VPjlM@Y Br̠=0*K G p[C 3·y_=Og/ߴw?㛟 TN+\ɰ.XK' @]`A.LrKH q]-ޡn < !黯Rz1|3|5xZmt"..|MslA!RB$?)9^|69'p?K2[CGQ^C;g' נh,>ssmnay<͜TqU4]J#fBwUM2 o],` csIh=ClI@"X)!2AZrIN- Bbw\.2''_!@Dd1kb$Rca 8loZq s~X*g8 A1yFrAKw{ [C{|I p=ztֲ[3)ڼc#9)[Ku}An6vzbD$PK˧v1&0\qo$^a"f*wc<VIg*<g#Ӛ_\_i!ȥ VUlڝ,7PD, :+)#;~}syU[Hl;Fi cn?5_T}6M/Our%X`T=Ol-d^`^B8.͜A9=fX4د-I^L囦rQq\5 UR.h ]4{ s4ȱ􉕰Pe+6FTjٻ~׏ߞkb@m'cX]i&K[U_'⺍N$Pa(r{}Gejb'jd$zVۻ$}*["c Cv'qR} =0Os@AjTK,xR^Kb<[ٕq:F""+!#i'j{5{ 3 2?/SZ[>C>y=3OƮHr2˖2TjvXс,Ҷ$ qkxSf-U8َW2}z !#Bq8FGm {EwQ[;;p9Պf,2s֛q[$8WmJ4b2w+sVnl)k|Gi$d' 9#bu#Ž+ovuCmFI2*͌77qp@{=(Msi-֔m"T(T :TlQc6zކ'c\[?n3݌s0hnuZX\Vi $FS"P1wY5>dXpI69pTeԅSA|A>xjXUU 򪓽wn1ëdWGM[Κų1d[T;XaT1ZH4N4rY#)"t&ĺ&E[$ r,S<&79`Fu^-3]f+%[+@|6X lms}(\Cuw͕Vc ~ t+=k9`Ԯpf+3 V`~Q\-eXH _Ć#M{{KBgx)%cm0 K{@:nv*89 `W6i$S+lv}g'U|gbltcAPH:l`V3 qFBty8: kknDh q3q`(oz<;E]MGww~%O8d*Īv7b4d-Mc]0iQK+-8ƟVܫ*(rɒ,}HzƧ/!x]o:LJэ^\_vh#ad|.$Pdy|zu6!<\\Z]NRb\Ϙjê\8gv>Ӿx:.K"#FIK[BP<rU-Wy5'hoIXaC#ۢ 动@.ZAv+6Mh#l2b$*2y q@IϪv$I7S(Y"*TŻ䮮8aЬ17FOR~A+}t ͤqn͇\%\ qv+2xڸ1dgIloوeU;I dguUmE$6H?\ckRN4R\!rw.y9'ČP"=Fp=j;fall g"уPT,:TVܛyIEp?I}1@S1LIpMY]0\qcӭ@_$ϜJƎ;{Ҷ7qޓ4QZs@/p:҂:2?|}h'V?y.ԑ8< h<I`FLr%1M~~Ŀ'|%Bkfl!–&O#_Z>+xvG-^] RR86p%UV|̫k$ۓy`O%Pw'9 ;h紆+-И(X 8wJ.c8PޯMO{-RCao.5$ܲ4m5/־KfPuӛ4xAb2!y¿x6xSLwSO$.Ѩ1 .,~E!~y/|WFþ$G,d[bt-W1 xn°-Əs6T [jLkS^u7!YHE[E+Pĕ3S|3t__L֯x4!Y<)xScܪHR3MeW:sAmi 4 4wK;XB=N2pP]kvl]´b!F\&-̖ĐI8)=r ’l %G'0O5zHмvO4VU*2F8!1?6L^=:}jL̀""L(e,G@Gh/ŧI a7 `p (2Ny * M;]UIM9n*w W&5m9W&s&7)i$zhzW;-, F@ɍ0l& K+;QDadl$AX?qZgtcg,x |9m;Ye] m%{:9]Z[6 3( >J=WW}kXYZE\m_cp=9I/{c,3ǽ #8@qߊ4;:,RI팭N7SLoSZH\l9V&`>^1}%`9$Ө>fO4xl{i[Xw* =: 4&YF7;\ՄIFؕ*NqJ 9'jD5܀S:;+}3r&,( c S%Ps_-F  P]q#ۯT j\3U[ *~_HH 0OmW$W,8!]:K\s8X[ 1p{;TҨQ>PsPDrC~#> ’\=u"teG ' 9=⷇+ Jt'(Ahӎh։"829JѳXAdr{omYy9R<͜ c@jUt8jג(x9l/|@,MֵY 9?i/)ڍB35ضVttGbU\l8} C\[_Z $Shp1okEsycJ$@`sn>pzWxk P Cƶ+,vlH*S3xºn >eu(1dq(gǙW#)=H#sx{c쎱.B N vJjTeFC,A+y5}i3#Hͱ-/&+&$2[yܚ!/m 䁖}8N3ٴbXK LyrL{g$:VK+,{rv6F8R74 7^^n*CBg$''{P|yEiOK7Y;w HeP-$>u[[MRKd27A,2G2R [5'4ԯXAO?hq!24y0.ef Te" xEnu7[ZI iLKI)]퀕P?>.x[\Ksos_y$te23 rnMy}kQաFIodr 1v+df􏋟5ߌcƲG,2Es߬ WaCOu4[kkh;c>b`|Nv;*A,Xsş4ݒ=l5K{dL#e>VcHY~Q(> sL]&D%A-կmgTvz;g+P5 />%:eyovnIk,eR@C*ǂF:Lb)/l>`<˅;3@?> "0\|̱P e_w8Ef>aɮcWo5𷎯|Ga ҅yG032۠+UHw6#=:ֲ'|'cyY${]I~FPuK(V=G~(iFkHfQqOZFCsĐ}O#X]G$W y;n#.i<vK? m̱9P֢5k{0=5b$tؼjm,uwBmxgq +5bi$)r^{]^)oj5x!KcdA(,<)"^_iB7g!ܣH\6@0 3 2R5hMq*M ҡ|Oumӕ%>j,n!$rONm};ʐE,^X(6K`On浶nX6 @䑒^OJzig@H#\$c qjB6mvQrWtá8-(.-ذf ԌR Μle@8 gtt;!'`ϨPorZ],;p9\8$zO罽-1fB'OLgߠ5Hki7HE%8N?AXYIcc sXO$@t{˘HǗ\֢$Uy"Ʈ#ܼu9p6f~ n$oX)P>V<kb+{C*.A93O\Ar)u{f4䇵26Ck&7jʋ7@y9zc5s$@h m#pں`yuHcTw-վԈ2ςTÃ$:AX#Rrrsujv-'ki4<KRx5+ EY ܦBO ƗL߳ߎh4]O.5Khn8N 8ڦ?H|3m\_Kdd8OZ4/vO1meڥ '8ҾDHK5X) r7rrds^{]|7Ҽ;VYg[ TQ6~nwدi$o.Wx^LM6}[Է'->mS~О'tH{h$y%%)G1l;9FM~RS⏅QÍFɖbVEW?_;px5>1(Tƺ#-ͣLȥRN\%w}yrHᯈwgIi~0UnYk.oKw2^Ipv,A|eg/?*n$9ҵ#YT,67; qSGiW`B%m #2/ێAQ@[>q5CA+ bP,#pϏ"+>&.m lm]q{09~)x:Nj5Ե).5DH:yQGˑrH`pNWn++k7xpY2&GϵנssF7⧆sPW'q|?ˋR[GMLm3+hvT6:(+iO_֐\M m#<_ \:Mce=\]cxRdm^- $1F&d#ʺ31n:`vۙMֻYAxU *%)O̿;sV%OHK6"pc @/R7'! `Fsѽt -4 F#C1"%*W'~74e(I.ۂ_Oz|<鍂}Mb١WW5m'uX.VPmk=dy 7݂O3 K=ϦGX"yaYQd/ {fY_XK g9E. &wUWf!)21 f^I>Q-n ۛ[ARl.wM `pDY$ Ȱv#,?Aު@Sodl/z w `p;6e"9'i@тBfsuS]vRp2ǯ# x={t@pC|2I5Dgmp cVX|ӵg1h D@r͂=q[VM[ #'?5r:v$6ywf'h]>N՗"Hi9@ʪ;>H|#n #=y@ #RN`)9с"€֌(#4 MZ24oJWT$ `P@ m W,Ԭn/`Ymq]aepw3'h _BG5#qd]-l, ꖾti4H?f eRv)``Xe_^h_7m7N p/f#&U 6FF*Jױ6ω_kRZ{=66U3F%c1("#dg_ƿ-l4HKG@H%O$+MekZ>OiΒBQP齜)_+_v7wjIs"2WZ6d26r?{OxƦ[xfu J0Uw 2WÝsHV70]CO1NIyu5 M,w9UZH2rMk¾w֖rIrC]](tX;N-}İLAPvFF7+W5L"}ZjC4̍VMy-(%]E.tVQ V^0mz6ֶv2,* cq/RqO +Y ־bǂMx_n+VͼM{tC؄PKq5@dwMab!IYQd/`zgl܀uVVM'Jv;|'GtVLqe:A6 ,Rabd w>$gGLxEG$`n=wsө BtZ|nbpy8lUyH~$+w<{1Q`35?3(m=N:HL67ƒLI Fy?F7Nn1 g'nG9㨫[E|Zog#y\{>M'aC$bA W> <>&؛UvN(O{="D Dy.;8K"+jkxwy-ZI r6J19 94-Į,c".UG!#Sֿ-.$+[ƪvGU3e:P=_V{=TeC"( rLbټ=:(a)/@Pcpb9滍U"(څsbX9bv#@+)wk{-3@H6ڄ쏹P$0`BpTPx|o|Ӯw lмs *mNݢ|)_5RK+z;:v۫஽Tom5u(3? HQΥTydHq?s D9_޴wax߸xK+ʕ iN uxXqh8FpMuGx4ڿO%/7fXV<4Fw`⼙ep.H<ҽҪ"1 p9}9ٚߏ$ ob(&|߼! ܒI5ᯊگgGq3i4$Fyb7Acq=6-/YU< rchfX⅋ct-6MυJ}<ͮ[ɦy)e7#Gh,F8 խ'A/ b0X r_I/!ǀk߆+ŻIIl=VEg0I,r I )MmH+nҽ'gy\<la9ol_t\|KdpZ(R(T??^*< x_> ,Ny $nG9%2ɿb#R4:Gw3E G.9Vav' G~m&OWK#Α@0FdH29''{ ѼC:ͤ;EvSF10Gl@}7oo0AĀUvXdp8ǡ$P]Ëc'k˵Z]cn}[b lToPsc$~/t:4{t 5ľc$sy3vpl<Ώ_*kZahȈLK9\,li+(+gei)Kxi]8%$S0An7y5yF#Ϙ[~0SlӈneL/=v_y@PTFaIohcgȕJ0iK`ci/ dkWU")H {z|K 8@9{V46ɾ=@ypW2qs Y93"$C~qڀ3$V\3Ny#pABx }9?އш'P!;$':{^mn"lڨD1 +A1XOU/. .Nq{ր3CT y|=S)eI8:ZDsG ~>MP{ ێq@ ~428ᛚ>; M@9?h6<T;qG=<$sƞS+6B;p~C|)%VHʗ1H,"0 ; ZH4n0 YA 8. ;pkXσټ@#El<6|s8-d^Uj΄R}IM!ՖW+__ !yxG 7@>nSִۡl|7-$) nHvy ۣ셎݁oH7l2: 71)Mm/<40@#.b(^_ 'qM/? h&VR/ux/(2Y|y\+7J:w;5 UbU@ m lhH»1 a-7vj<<02d(l0q6'}֍k0O5ܶ̓vb%ʌ"$@žDU'mo zlu!IA fhHc15DAHOiSCGqْ:BpwttBux%4 lѪGi4HrYmdMcoB^񞇢>ɨ] M&"{24 Ȏ7fAj_k xOHhd bѣJ<{p<-tގڇh^kO6iI?4:p+m}-O=伲,bueBC@S* 8=VmVRad"TpI($[%f6U]HۜͶP¡]v9(03:j!ӔIkN @v5s4 Ew&G@dFrAT {TEǨV9,w)%T=1봔.Yв\92[$aaqaC7hG KGJ x6pI,A_tmp4Kz#Wn8=~\u]N1*m7b1ޛ xk$[2W*60wܽpp~4So}gHP*\<Ϧ#ömRWjttQ.Ʀb^Qq|)Ua>Sӏgإ9ɮn%<5tdES'(FG `Оm24Iʑs`f<[5оb3#|1 >w3+?2݌wFm+@\1|яOY6BBsE9s vK4{7UuGN >1@_O˨iuUr[qq|aU:n)-6=i~9 P?|JAxt&8mZUmb29瑜xi||:^oM%yad-,lI`Ue@?+i%ߏ-|G꿲g->&ji QË% odb wDa/vZ߄/]v]L;9g{H0i^k+KkqXP[$cܫ"cT@|+ZoN|ai aCۥH2-K2,"fHV)?D>|vqn/v,ȸ>]9 ƺecvpyNxX66LmaA#;_꺷.>uiwqk:SQ1@Ьk~:q@-ȠʯjOB]hO [iRjIc!f1IPބw m{F| %MV 0#>b/gqPW) yQZ~?uk;bou?nܹVb37.co@%m3_E g,mo k HTYKdߴg.^*Rr({+Kn#6~mӾ7 t[ ?p:#<9Zix^ ؒYfqӞkw7CZM:DSjZuR,2Kn}&Fϗx-ż`x|U]$/Lqf L1<0v g[616vtYBFڋd@uGW‹qi\\[+`*BFނ >K=_CբoDkjѼGw4~ɨ0>5n"jLM>Y!}_ <5ͩFCKiHCe2"8.>Q^OC_ ^i+U#8299|a\i)oŸ5hcuղP3\[4ȌJF _-?Ư'Öu/F#]Rȱss:kO~ďQ2 _,:aF QxX?|m/9toZI&™c $@OI~p'hA. 4>;Y-%BTe jh8\׫GJY4Gr>Rz`y:wx[GN+hbmX"ː"װUQxo&|=W1K9Xbc9; `x@$j6WWwScZ,,˷l[NN_wtV5B qv~uu(büZAQ 2"Hc}3֟b/50 #Wl#<txg x[Փ/sTPXXܩ %s<0=;^%Ksm4j5JˆJ/Վ->>6zil2$afc%JW| .Noı.g!+ dqx7*ߺ,~:& QCkFX^H".UՉuBvvr>k/lgoicҢTHťg ΌJgbb֑Nj}^\C *b+^ִ;=GVA q\3r@*[Z|=S{I9DI]#4(eL2.A>!A忇8|!`$ UYUƼҖ>}sZ *EOj#K G}_ֽ_+MoQttַFU`q埗h] P ,-+ʹ@-VWqb…[s c嵛kX?qcb\DBG9,Dè\vיxHΨEĥǒ ?)8ۓG_iC[QA2'i40#;;agT\FH;#O$CgI%Hi#3&1 q({kv4&3$n\XlKsKir϶ZH  \`_>JXHO%-ٹn7!Rr s!#Oω#eYX#V;I8ր0/_Ld20 9Mrp-ɞ2 gxcH (g@qkY'|Y]d w@s-o8r@MCa #WyZ v@RyQ~j4zc+#.'Us(fFX3 pHɦi"9.,cy2: Y]JOXJ: F}2K(#gA82!N]-[X_h-& q0R +Kвeղ6scKH;fG.*o$pJ9<X8EYl5Bn^kϜfW OW'ykW./9 8FӤt,1n[͐1 ukoxJxo ͚-3ȩ2mC8\~ɢ;Ojdq+O%*[bnlp -~ş? ,1]Y-g1;7 tZ4`n#PF /CYuۻ'CHeG`C+] J(Tv0xRQ\mй+T>/u˽9LBȥpv C|T&D?92:;bSV7ߋ_hZqͷO iƥS(䁻k+d`@<> #_G準J^c yFH6Eo,FeBAVm=ݏN),m-rsqk+¥fԡ)( ﴟ]x{¾޳e;1\7LKsݏ,r@܊坑~wvKoxŶ:"[]K"<ӹul;Iudw?x_[f%xC.K(Mr˂읯N_GC{5o+7\on$hqѰLh:߈<9+g6p4;HNmmAT#v Wf$/orM!Ue+ Ik )4;]3jMO 4 |̥Wa>8xƾN𾔶wsKq;k 5)O G&ʅWϼIᾟfl<Vmna 3$"6Tf2o\NT4mǂ3kZG]ܭŴ!Κ8f89Y"?Ō:ͮf5OY=, /.l1w rmu]g:e." +ż݌|'=#Ieu+kI5E!")$7Y|t_>8>$m6Xq.5/:0p/|wffL4y$$4?4ǖ<V/M4ӻJ1Wcy52$&ԟO7¾SHPZ0s1d ek_<{[˿8<rKYL)ޑL[E9a@kڛjz᳴DDFX[")ApmO K]OPgPS7F²7n@p>CMע@Ӭg$+c y!V]lhI&W6u ~d/{Suu%ռ(ⱗnY]I .v\#w0XM4isA?b #t??31,.!i$[I *[y*TƤ8e9sS麅۶ l.f%-tď%m~~Wh$v+}#QV$p˼ }/~4}L^=kIKvWOT]+/XH0c(S_"R?nt*>)1G.CX垿`>0Ϟowh/r;3*f\v,d~Y~߱O{},noVP!`ahǠX"8߶ǂ/oO hk>4ke1Wcs Hh Sagڮoƚ~2Iq6kn$U#gMQ T {ƚiKcVpG>#O$2wIPrNFN8=?ÖĞ3ܝ:916`Q凭~~߷O߅?Kmw(˼IA*2o)'%XhcMiwz]~'W!nUeXp@g?)Qh>ŴM>kl<)r7Kojw^/“K noM^YDURX?l |6i y m?-֯~[x)4Hr@m3G_շSjs[3uPCLƀ3nz!^ wUZ8c{$"?1}^k:[{Fcn~Ub(o_^M,ϸe@s3G~g? |7Mx/읞e PENmC!饑W;d?-~Hdv|9*qzIn ?1'ϱwᖍ,$ri݁ Qƫ|B?_>;xmQ+DHH'[n2|W{s4I􈴩wUٕV_r9 _߆tc'mcfI#uP*\c_')<O.weHD@򕼞7 q#  D|Q+ᥗƟ h漚:=rE0ݥlvPw[ }HU#l_9-8=?i]T[Pol<>jҿwၯs!'/-m!mtmT?2.8;s@3"%L%BdU8xqޱ+_j]bymC)lcZ80VeXn~;\dg\`޺OibPYd'$2O/A ([V:NJ4fĐG@Dm%/^l<8wkKgcƒ癃HQv0FW;| P[uψ&xͧ_:EHf/.h^0-\'3⧏jbIckwhbxmfgP#h^Z,M3Þ Sm|x_^E0x0.q2]:6w2dぁ_5x#iw:Z@Iqd_93)Qh=Gw0>Vm6{Dt{MckO3h`Fe_0 2TǴ^Ɔ4fx>PIiRB/}<9iWdTZ颺&FF̅*2Hh=S>Tφ|E%幖H罹"&wo;mqLi#FgnJjc%>^.Pff!`d''V$ypY|Oڲp͕^@3Ok߇Y ۢyH*~BXmVvO$c9+Vw# 58-r8$'#IyoZ1iI x9< ;Y hT"ͽ8?P85s,؎F#GCPlsq^ڲ ɸ1RT)?7F4 eh2Fw1F1_T%ՌFIk]ዿ ~#Nʒ _9\ >8ѽ] XO}V=H,Ď@#TuN,$ |aT#HyΏ);;3A[$t3C V'jv9{FHLga!@k,aǐFGҾf??l?h0𕹾٣P[qp ?zWZ*9 ɹ?6OQ77'!Bv>X&ە|™ko?5(tRO:?4 ~x/&\$6@n ‘$:~@;x.M^\ђ[GyD+$1*3)v0*s%to!r|31N1PF8m^ִiȗ/RNVHA__*]e$,Q-kEt<GFpeW!,5_ &xq;F+m G885x> -K8PPD4(@[6bnjt4(s&%YJ%w7c`w@vQEfxC&uiB-¹RFrPp~Pǂ8݊ ?-qQF[Y弙[/dtFg,A!~GmdT=<Ֆ9X];;d2a$R:{ǚkF6c`Z%Bb[ H$~5ࡱ\WP 6П*݀q1S3mm٠Ƴ6*Z6z]]Kic'd7Y˖l>{nA3x^(5y`&%,Be3rc,jn>uQ$ܺWVZEb)痒HIR|Y034#/M/V4?V{k)mH| c#yodr&Ic+!_u6z͖6y[{GhRȚܲO+O!0W=o( C0#m[ã̐#Dm;ṙcqv`Ue~$|!o&sؤ $#62Bnao5jlKm8,L6m5y|#plovl$S?Ֆ%-,I| 4W)} 6{4s+F9V'{??6:}DŽ]BLX E *Dc7pcu#þ9 ím392D|ܥCd+'Ou1ZE47ZE,>S<5=qm[Imbjc))Rp{YV=qL5t]1 joO_[xvFHZZjkr fRFV5#hbC$'5Ng]eeyOPyZ,I4KyNh$@Hq&9alk)~_zo˩nfWP4Bۀw=9o @ƫqipPbirʀA%G@:^i+CǴJ0XRWmqv<7|_fitaӡsvD's(SNWjxhB:qϪagX\B|+F@9<K0\V1An%a% io19>js^ >67ςƭ5ݮl 0v]cY#{I!pAŖ ._y`3Iv$X"!Bб48V]-Ƒw~ R<Obg$ d5?Zm4++hgԼDgc>C4/A;h &al)Uv*IlĨt7ݬ1Yf x@jabIњm'N "}$k.Id\9o; N?"\J!{2q@Cwb8^m ᧄC/|yhi(y/!!0\d8nk7jn44Bs1# 9قv\r og[}A9iic#eCĞ-kqk5hl/.@ѣ"Im7ƿ~;աqwc ̌VIK vU|yOm5dum?n?_|?= pܖa9眃vm[ Ajֶ7A#js7+4?w bO9 Jh9Wʖ2+k]kZW/*ߎYZ}#c湅QNf6oHR&B5ݴ1][}%$B8V07rwKۙlmzڔ#lvP̅1p74}E5Il]Ĕab~bE~oK^.yu(tUm*%@ԣ< '7JxĞ𮹨]|"$`oU?(~u @?|^= E%ԡ22%K|x`p|KUj Qfn Y+̓*e , 8f/|ȥ[֕C& ||\?j^WյV/$GVi6,{Ujrw״@,սŜr "p>U o8LT7 _+x౵fڋ[γȻY R7wauZ9&X--ǘ&ŢUDG$TXMyNm%zh[ Gw))/GRFM}!h n5;UrGm,2cڑ$X m |>4 EtBY]V67nH'q;M;yl2.p O8F@~(Aq, #IQ!zqj%)4n%p а8 P=@PS;%Q*W8 992o,I) I%G`ry'V.Bb PɅNH0>*b HنՉÆ:`g"A qGnd]E NV6m1ԦH t'{`}}+KShg.YF}OojNn6φop;4̨=Č8#>BF.@<cҬHKX1JoO4#J2M.hA@gB{fEuMZ33ߧZ3lP|Rwf:=2E$s5yLC vdq5 gl|im a22  *rdL-qm32F :@P N$^?.'g-?1 $p:_?(/iZG7m82/02k4oاJJ,󢪜n+B-@~x 5Q[PEf ]\Tg/"͗tWĂ[x+(2 cܙW3(55Acuӡ,jK ﴕo (<Z!3˾LX@'p>S> < xcI6A~Tm&xIq_QhR!U$)#x߁CѤ[=}z ׫SJz'"e팎 (d*˒xG!@nI<8}*]` HbG.?f_ýK}]j6C +aCv#!r w O>.m,HNw}AV,^x`\o~ [ xD,Qz![FW2yN!v\G,ʠ%u/_gxַ8VKPw;"QU*n[jO)/xCFZ]FrB?D8*׊xWƖg}GXT6n,N pDZgM\ Ku'`@%VX`7vdc=CIYb [s @d.!UߔT X/<{)n[a6ö1t;?x^Y5K+ L5RrO\ɍk:]ƍG!r1eB3b2h Y ~6xWKjf52{t/rvq)u눶(k7آ[hC$qs+^_xQ7Pi\%.K;g'oI]{CO|CoksnSˀ,HA _lF ~)h<;x=j>Tml#B'|r#T@Ys9x_XYb˒GnxM=š.$ŔHၙCEG (Cr@H$uu-,7ѫ},!T)`D),wo]Ay8uM nb/$03䃅R1⿅~Ҽ=k"\$4>y$s?񖹌yz&lyXU>nxυNXcvK<s䴪e +FYIvaIjxպNVsK$aS)aT.˅;r>ÿh-I+T( W&1/7!ehw<=oុ%NLaqjF,fDbѣB)([~Mq"+;@2zcǗ ^HcKmf+i$Tj_7MߋtA:QV7Iq-ӽD9nWSSn$IP;8,?Ƶxo~#^YDvapf= 3+T|pjJיG4mյ|p9#zN 55Z1J&IsMe# IH7@|w|HĺgM⽊Ƞ[nyeX> ZjtYaH»I{6Е. ǜʽI▕qgc>2u #U!:<O>M7R\Z+9͑Dp6]B{.p=OZMOĺb>LHiBhق[X<s^sk# eDDg$63_ ׯp9J;nR$,KH>QʓN ^I7WZ;G7(!d`wG/` gx ojcqڪYZXgGyb9ߕR.(Ǟh ֡Ѵ 꺒R+jvsKNffx"cYPoEbH b5| ]iKgq~;W͒0IfY``TzWoZŎfw74Y0D1RBTȉ@Cp7g[%Esw# rr:|q]^⯅u)~!Qm gX̱-W?|IX㦧 t'*pFOjomF|#=v/$[ͻ1TFLlh8,pː(_0\ҭ/y-%._(Jr?Rv%O]ök7īiCEjK>,֮c32ݰ|W6Z6%-P5G4F~L:rncU=C'ɓTAV`XUq\ů1P/JKբđH)Tϸq@ ޶5׼Kq#OEhF% ?? F+>[|DO^xH f#8fUfdp:g˻ OVź޴FXʺ-Ow'Ŗռ9q[떏{c8 F[{d1}7()C3fx c:qcrs\6j[I{Q` [ TN7׋_|]ӭv՞kIXE2Ar;m:/-h`0"gc\P}_kkq/ʹG$λǖ\o$0&.nsUVu$x\fmspڝV67adk3r񱑦HF|-1Ϩx{T[),"lV;-ޗ"m9V60ܒH@ n jd*7g<yy{빍[O$4q|ב-<%![\\_,/PL0al8k-6MO=Y_+y?vp3pr9:$[KCJ;GEo$H2O.[z|-TC?ffV!h9rwH$0ΡkωkO4w3q-$%\wO-4}OڤݠfcOfh vƹ=┷Y’;j$:|1;~hѷHy+bOGoX{MA7Fw5ޭ$VKpͼd`*y@'?*~aa\(`BgPѦvuc!vvHxgmJUZ81IC ΍ N[aE#M Z q JwFirK@vZeGqIfްD}7}'!nrjG i"$,%CNyn6I{mV\E4QH,[w sS5 -'XL0RU`n|  ~)|Vc>1ѧO1dwSij M~_E ȠRa#`̶@@pw l[現D i&܏)@6r@=ue"X|*5xvg:7l<06499EzJ m#,CAg\"V,@8SĄy#Gj>Ͻ>6+!zPm`9df2'<P6{V#Ij3.2Ҁ9/ <g׾kX43[CH '#*Ŀ7 xNK|-IL/2XnH2Ry9=p+xU*{ Vѡ}îFA?߅_LjnKK6P@cl̓90>~7"]B;Dى$LK3 m O -ɢ욼Wxhe'1d(2@_'Zxn+p"@i2Icw1P=@|Ux7 8V!5˹VݢZjq4.'tNu,^(;0!u g6I+6?Zį%L_&-΀ 'jmu T"+I'k`74nߺid(6Q_A'ZGmuI--I٫[^,\׸gƒ)e,t*WK/Zf"Co}I]#<.THJrIƾ=񧀤G|Fũݥj'10P9X& g>s0 {tV#ڋa#c HTw K.Q\k +ƿeJdӟI7dY#2Ȥ*$5x7w?Kꚟl=$ɴE-lv0)ygn%z3 -^)kTwpJȞIR8o)v8{cZVϊ5mGHVDP(e(nN#c *EOm%>|2M0)ޭ ǰx/şxMKCEm\ĭl۶P6 _>)c#Y3o3\m_0Seu#6A{Iܓ<.H J$e C0*C(#wه㟌u-7@MH簁>(,~fh26=G߲oKMz-CP;"ې7B0rv1 2 [?3w)՗P;I.'FEg>Kx* qࠞ+o4?x7\O2Qe\$>0<ſOC0MI-ķOpAxۀt5/״Xm4d$[nT1Ìw1nMYk; 31*csUsNWW?rx"{]3_ ̓C%KA]̠ZzEjhVNWB0 1f@/ycRp k}Nҹ Tk(ABt&L$ 2e8A=oUKmnEúR˻$ .җڼOkx|UOǍr8 y6f1d7M3OOZ}F!Fm30Jr2YwB9#<|EKSu5ܱ8L]ڥpO-pupAeBs߮:v}nހ=;@ȆZF|~ 6Xgf/}3ώIhFM7>FdhXfW<'ǏhHkRѳDUf+L I }* +`M^sj7&ܥ IK.|LnK2]*qZV.wt2ƧnwK{iȊYX_,͔82׏M;uMK\Dg!ܣi) ʃ~.xW2gQ݁>eDMkv**Hg¾h!M7PI qz_EL 䚻5^DvhHs#F'/E}x)<_wg8%(>q_N(1*lXoMs13s*؍s}p1ܒ~Gu,Xg*^7OiWvvȶ6#IҬ,˟^F:efXU۪Ͷ] eTn.nEǠ]xXok[{H#G%csKsѰB<ɣ{ֿwI KQ(hem eϼ\I-} DN}",gI0]I]*tKu&.D-n@9B~h^t(."Պ%+rUfg$ ם>mCWZjèW+i0"rCȯL#/5(oZ^H!G8`OP[e tZH +FwvA=+3ڤI'ta80P,H vRxu* 3Fr1}B.dWѭDQl%Ekc)8828MT KK5 (gbo&Y 0 H'wrou_pO-PH<ܮB7*iMjZOhRfp)u2.5*9G-FPT9wx4!"A8ESфS݈i&&O=P[a8-rN>t%HG8FFZ?,ȼcEk@6܂3M'уs?~TQ@k d|1#@>z(,FIBSBGJ(b{k1Q@yqQh#%ޢRKE_k >ݝ=*?6Kψ _~K-j."B.힠PTP߃eC+]-6TiE{X窞O<`c˼^Lծ-4el)Zym+8(`nh<#է|; ƞ&;[G8;pdq[M7aV dEsR\4;ILs:V;]P)=H E^>$Ea'?E [\&`U$ Aſ -.4Ajndűw({o4^Xuڜi:fu+H/x.dԣ%kc$B{ {L-6r=#w˜5ω4]~B[elIAmQEuF\ij&h}r~ѸP@C9ǎӉ%,v?q>9ygCTy-g3ʫ"6䜍8(>Ӽ1& #=ae+wM"c9Q僌4CJeC!e 7uez炊f6ac@d?wOkR=Ui!,%gzI)w;Yi!@K- gM  xl(۪vIw?}ֹa7]`TtP5a=~V~ڰsŭ kMėx;ިH,{+öǂ4Վ;IO;\H<ޫ$7Ak83ʒI%. [uT")&G]I&t1pȕjL(s%=Kq'WAUsG1vcէIܭ*13xߨ 24!%6L;- $#UJƱ:wX%ui )ɨ,{9-R='Ƴ zgTm,wnIq;Xoo mu}G9r1q2Pf~ӏU3{Sؘ̞kntu*/Nlk2KÏ=kf۱t~OMݘ fSzN_L+⹘6mq~Uw7uz?$/Es2+*/edlkmu{7QαvǻsKW[L5k-_LGIO;iiY=KӜ:];P4[LzAA{scӺ󎫛>ם; sٶk{lw7 %?Cdo'GҲq+a7 )u{! YUr#^DŽN)$Y[#u~Eޭ7=!RVt8h?)(`iZ5%%&uߓi.Z8Z˭k7qn % noP-H;gwv Vsuu[=Tnɽ̡'4INY-pm>;vOalI<|~rpۙ~C\X]X;@5{Sճ.ˈmBJ}+iO\겱Zp漰?kn6Q-zHDhg^)wpm}D7@8ο}%EtLAFu@UCYID򭾭4U#INvP>|jNVCI  ^D/A؍q`R0)IL\Nkk 'PЭJ"~)) jX @*`Rjpoh{%?%^)Sw8]smnXs;{Zޣ ~活vv?As]+` l4Ho:LxO$+Amx#ᵺrq2ϯ&˲}]{Ēgp./. NtIOtFe4!= I΢ 5 ՟Q{;X))5C?ywpϝ]$GJoF q.~ IOLlaTp>^K1-E7 f$I1 )cNj?rYN}$xý]9.ip\Gָ Ceֿ۳S󐔦1))=g3rJJ`V ’ArLɇ?/ZiRS0DǏp2Kݦy25\P"'JzI GzqXvp%ua%DW!ՆZhOxҒ¬G|WE=Ҳi>Džb^1}R򒝞zNqvUH'Iq?9T?XpYX#sZ}l}gBo_XssAkdlCJMu C0ccSZ>A-D"Ii 6Tz ;u~ocS'۷љۻqenXlCkk [ݳ9%=na ;uiw\7֜쇱{ǀ ?.Y['}p=RmˈwSPRRenwS'%#c F8vS4%-Pu*Z';F )W`*l4\ZbupAXNal|kIO]HēP:.RX-:YyM۟ϏJkY$Տe0N*V]I Ãtޭ`\ks|fV9fn-%:`]G.fd[Le=}oX?u?Η]hpɵT̏O}ջکU4aGRf7nGVw{Y=a Ӭ4s^_mSѰ} KA h kNC+?{¿^^V=Z?F*.hW{'YKƨh][I-.S {D8n׌m8ʫk hQ6sz!nTung޺u"ZXvJl,o t㵵"wᩫ>!Zn8<7+VM͝D y 6X0 ?G-]ɐksu Z7g+/pi{wh>}`#h-ۤIֻC'f-n0m)#\v̴dip55WoNGLxu⌊jFn%?2U׮c<rIO}bdN??ꖨ.Cq^NJ}iZ$;$n#cp$@cecIM܊Si I)# dRơX(VI%7_ltySd4#nc'gk{m\Z#N9vMNv5I$]?'w*{|FYn5lrI%?Photoshop 3.08BIM+Kx 8BIM%ɨ^OmpYψ;:8BIM/JXXg`g`{'.JPG8BIMHH8BIM&?8BIM 8BIM8BIM 8BIM 8BIM' 8BIMH/fflff/ff2Z5-8BIMp8BIM@@8BIM8BIMG3 DSC01546_3nullboundsObjcRct1Top longLeftlongBtomlong3RghtlongslicesVlLsObjcslicesliceIDlonggroupIDlongoriginenum ESliceOrigin autoGeneratedTypeenum ESliceTypeImg boundsObjcRct1Top longLeftlongBtomlong3RghtlongurlTEXTnullTEXTMsgeTEXTaltTagTEXTcellTextIsHTMLboolcellTextTEXT horzAlignenumESliceHorzAligndefault vertAlignenumESliceVertAligndefault bgColorTypeenumESliceBGColorTypeNone topOutsetlong leftOutsetlong bottomOutsetlong rightOutsetlong8BIM( ?8BIM8BIM xdJFIFHH Adobe_CMAdobed            x" ?   3!1AQa"q2B#$Rb34rC%Scs5&DTdE£t6UeuF'Vfv7GWgw5!1AQaq"2B#R3$brCScs4%&5DTdEU6teuFVfv'7GWgw ?X܆X$v R$JPSk8 0je%:]?]$ev%kI"ݭdsh}_._SaGyR-#աEw4Ǒ r1Jծxǻ?IM i3R9UYā=k8Ul nns֙q:n3{+$o;Gޒ95cg@'I_߳Wro:G͵əF>f6ac@d?wOkR=Ui!,%gzI)w;Yi!@K- gM  xl(۪vIw?}ֹa7]`TtP5a=~V~ڰsŭ kMėx;ިH,{+öǂ4Վ;IO;\H<ޫ$7Ak83ʒI%. [uT")&G]I&t1pȕjL(s%=Kq'WAUsG1vcէIܭ*13xߨ 24!%6L;- $#UJƱ:wX%ui )ɨ,{9-R='Ƴ zgTm,wnIq;Xoo mu}G9r1q2Pf~ӏU3{Sؘ̞kntu*/Nlk2KÏ=kf۱t~OMݘ fSzN_L+⹘6mq~Uw7uz?$/Es2+*/edlkmu{7QαvǻsKW[L5k-_LGIO;iiY=KӜ:];P4[LzAA{scӺ󎫛>ם; sٶk{lw7 %?Cdo'GҲq+a7 )u{! YUr#^DŽN)$Y[#u~Eޭ7=!RVt8h?)(`iZ5%%&uߓi.Z8Z˭k7qn % noP-H;gwv Vsuu[=Tnɽ̡'4INY-pm>;vOalI<|~rpۙ~C\X]X;@5{Sճ.ˈmBJ}+iO\겱Zp漰?kn6Q-zHDhg^)wpm}D7@8ο}%EtLAFu@UCYID򭾭4U#INvP>|jNVCI  ^D/A؍q`R0)IL\Nkk 'PЭJ"~)) jX @*`Rjpoh{%?%^)Sw8]smnXs;{Zޣ ~活vv?As]+` l4Ho:LxO$+Amx#ᵺrq2ϯ&˲}]{Ēgp./. NtIOtFe4!= I΢ 5 ՟Q{;X))5C?ywpϝ]$GJoF q.~ IOLlaTp>^K1-E7 f$I1 )cNj?rYN}$xý]9.ip\Gָ Ceֿ۳S󐔦1))=g3rJJ`V ’ArLɇ?/ZiRS0DǏp2Kݦy25\P"'JzI GzqXvp%ua%DW!ՆZhOxҒ¬G|WE=Ҳi>Džb^1}R򒝞zNqvUH'Iq?9T?XpYX#sZ}l}gBo_XssAkdlCJMu C0ccSZ>A-D"Ii 6Tz ;u~ocS'۷љۻqenXlCkk [ݳ9%=na ;uiw\7֜쇱{ǀ ?.Y['}p=RmˈwSPRRenwS'%#c F8vS4%-Pu*Z';F )W`*l4\ZbupAXNal|kIO]HēP:.RX-:YyM۟ϏJkY$Տe0N*V]I Ãtޭ`\ks|fV9fn-%:`]G.fd[Le=}oX?u?Η]hpɵT̏O}ջکU4aGRf7nGVw{Y=a Ӭ4s^_mSѰ} KA h kNC+?{¿^^V=Z?F*.hW{'YKƨh][I-.S {D8n׌m8ʫk hQ6sz!nTung޺u"ZXvJl,o t㵵"wᩫ>!Zn8<7+VM͝D y 6X0 ?G-]ɐksu Z7g+/pi{wh>}`#h-ۤIֻC'f-n0m)#\v̴dip55WoNGLxu⌊jFn%?2U׮c<rIO}bdN??ꖨ.Cq^NJ}iZ$;$n#cp$@cecIM܊Si I)# dRơX(VI%7_ltySd4#nc'gk{m\Z#N9vMNv5I$]?'w*{|FYn5lrI%?8BIM!UAdobe PhotoshopAdobe Photoshop CS38BIM]http://ns.adobe.com/xap/1.0/ 64 XICC_PROFILE HLinomntrRGB XYZ  1acspMSFTIEC sRGB-HP cprtP3desclwtptbkptrXYZgXYZ,bXYZ@dmndTpdmddvuedLview$lumimeas $tech0 rTRC< gTRC< bTRC< textCopyright (c) 1998 Hewlett-Packard CompanydescsRGB IEC61966-2.1sRGB IEC61966-2.1XYZ QXYZ XYZ o8XYZ bXYZ $descIEC http://www.iec.chIEC http://www.iec.chdesc.IEC 61966-2.1 Default RGB colour space - sRGB.IEC 61966-2.1 Default RGB colour space - sRGBdesc,Reference Viewing Condition in IEC61966-2.1,Reference Viewing Condition in IEC61966-2.1view_. \XYZ L VPWmeassig CRT curv #(-27;@EJOTY^chmrw| %+28>ELRY`gnu| &/8AKT]gqz !-8COZfr~ -;HUcq~ +:IXgw'7HYj{+=Oat 2FZn  % : O d y  ' = T j " 9 Q i  * C \ u & @ Z t .Id %A^z &Ca~1Om&Ed#Cc'Ij4Vx&IlAe@e Ek*Qw;c*R{Gp@j>i  A l !!H!u!!!"'"U"""# #8#f###$$M$|$$% %8%h%%%&'&W&&&''I'z''( (?(q(())8)k))**5*h**++6+i++,,9,n,,- -A-v--..L.../$/Z///050l0011J1112*2c223 3F3334+4e4455M555676r667$7`7788P8899B999:6:t::;-;k;;<' >`>>?!?a??@#@d@@A)AjAAB0BrBBC:C}CDDGDDEEUEEF"FgFFG5G{GHHKHHIIcIIJ7J}JK KSKKL*LrLMMJMMN%NnNOOIOOP'PqPQQPQQR1R|RSS_SSTBTTU(UuUVV\VVWDWWX/X}XYYiYZZVZZ[E[[\5\\]']x]^^l^__a_``W``aOaabIbbcCccd@dde=eef=ffg=ggh?hhiCiijHjjkOkklWlmm`mnnknooxop+ppq:qqrKrss]sttptu(uuv>vvwVwxxnxy*yyzFz{{c{|!||}A}~~b~#G k͂0WGrׇ;iΉ3dʋ0cʍ1fΏ6n֑?zM _ɖ4 uL$h՛BdҞ@iءG&vVǥ8nRĩ7u\ЭD-u`ֲK³8%yhYѹJº;.! zpg_XQKFAǿ=ȼ:ɹ8ʷ6˶5̵5͵6ζ7ϸ9к<Ѿ?DINU\dlvۀ܊ݖޢ)߯6DScs 2F[p(@Xr4Pm8Ww)KmAdobed@3^     u!"1A2# QBa$3Rqb%C&4r 5'S6DTsEF7Gc(UVWdte)8fu*9:HIJXYZghijvwxyzm!1"AQ2aqB#Rb3 $Cr4%ScD&5T6Ed' sFtUeuV7)(GWf8vgwHXhx9IYiy*:JZjz ?}YdI!i ^O H:`~4I 'eh]6?׺rFFI5_>А@{^8U$^?Uz 5X,Guʞ8o~x)ca?a{#G=u~wǿucmߺ^O~u{{^׺u{{c~r-qߺ\Fvj&ߓa׏ԏUQ#~l}=uȆTVMp׺rQ"ygy/`OP~96Y!fJ2DFn/-pO>׺U׺4{Kj)W"m8پɁP9 sSX˕% }U4JڊE$S4z2K8U7,ߺCQǺ6NǪu! "T׉pɢ:UIl< T{uc}Q/[2TьT]V^jzz_y'F,AG>Chȱ2H=׺sͽΚ8y$F/K30ycHSaX^vۘ S6N,NPѮ%%iV-vj!:Y~ xZhi*ᧅZd<IR ~y>׺Rccx+} Y5m$dÃ"fE}׺` ]EZ-kѴ:V6GPH&zzkk+>׺9 :M- KKMUWVrtsU$tzs^,uq?ߺN(4cC5vJ ˏD-5V&D 4QZ|ar׺VmGWYO@(AJjX\ycv۟~yii Ej6UY9""c5=JVsp}u2LU "hOUu؊qª1` uiVeRO,ipH&9}t5})jz]QՂUN@d-,G ,Ǟ=t厭ZgrґO*ZAp2}uxZf]SRLWҀҫ7=uj׺O䦅ԵtMlP"'Z!Wg!!D{f )BӶ`t?wFX+*&AӍ=i|M3|e4R,qUSTfGSYhedV6*{9>H!zZF)3RZ9KE #%Uʤ=tSLLUuFVjҭ+TBBUX 7*.{^$j|Gᘽ%4K]2F"V@Hߴ#@Guqq[GEU+S#ANE$Ь<4tUYijZ(ψyf<[DSUWF +QQ|w$8&JsW=]YFY(j38.WߺIӶe 'jIK,꤅Vo@FJg5Nl{绺'sxvόb󏎡lce4R+TTfttߺA7myW/ǙJfR%B1sG& >Zh2,8 HKr`b?VZ(3EU"?Q4u9<1MUN7_|m,ț|YFQ ~ۋlSUKOY -Bi%3:Q%e%0dvb:HX{tGDe&S)AQ%=E5lQYWI^\|RCވﱹlMuEiϷ-Od3IRDr`EE;)^']Wpo[?BuZ=u5Z?aI $r监ԅGDE!P,${ k튚)ʻF%eVeXԋ3>׺iX䘖x'@UH@_M8iQ HE CjROC{ 6yRF/MG9a{ъlB1PL;=.WXus>׺b 1XͥhDBYV׺Go'薚`c7Q1_G6<^)~I#o׿u~~~ߺYcG?EʏGߺ]:#'~vl=u }-kEc{^돿u?^=u׿u{{^׺u{A^׺}}u[ARGo^RMY/fCXƥ?Q~epT8ho$#ߺX^%Ӥu~8~?Y*gy]JX^wcvv'r_u1LbtRS#CX\~uݡ2T>C]LQ04:]cWa1~ͥ(q) #%21ɎJ`[G-Ie< `=t4% YreUrO4dGU*Ƙ$:@ 0{ECKS4IT-E]bʲ[{3{dEnV,|tP5 #R%J,3dV*xC w#5ԫ]t!F**+wP*Rc*cC%,-:J-1Gf=7-nn!Y {[2-׺r_/I IQR@V2U:8tI-9.o~HG->b/`OWDRr1>Žu=TCMtJ+S aa׺uU (W`E[b{j#)bT$ f4V~'FM(}OU0%v2JC~>hF%JVlt*4TDAue t֔eD\ȒZ&~27_~d+,U/DY\G, BO<^/ %BtUP,-,u)" ,@PTUҭ4K315TTP:+F\I^UHix2KKMH Ե.VjH ,B?uȆFQ6F]18zZ}P]"^/OSx.R%bt6kiUA9 UVj TCK`O#ߺHF8ؒRARY:z XLZgNfU iQZ׾]3ōG%DP)ST zM5VQ<(fWUL1hدf:u{=G}TfW5cp+R JXU07A =td;q;ucTQM.F<鏚YbF4Ht*I>-Lۊ|&r%zZmqTM tSIRVl,x^_{H\=)UWzES[M3oE2;^=3`T(q5MŌ\Mm< 4s oz:P޻61&XVRSU4y dbm$CS2Pm^^]m3e$ŌL5~_ k5U"Ƒ..1sa՘q{jÑZܡQMK`󸺘}JҢ6UK]YG^I\z}-E^v-Spٺ<5fycGKSu*FzWj*(+EyruEHِ)ǹuPPS_MIQ7M5 _ּJZXRҿmkdR~ AYQGUq-M` )j+ P{tN#MZCzZʪm&x)x✺yWP]'ߺE~m -ؘɣig&R꩖*zH1$c{\vGehpu -.LMl@]XI6W6FG93+,>Pk_@'o{57~ {)#Fn׵~;Шd'R"\-ŸAuPѥN>*Uy;iy<_${^Zy AD7 KIKţo{mn ==m!MCG$) zAs9s#B[=t o=e!ttNG2 :megB?^#Q*iLSK +#Ӄhʥ#hGHuy8 <D򐑝"3.P>׺D̪ "5,Ӫ䮛ױ׺{DO?ׁ NG?cߺYI%x8aǿui%.䟭u6_H7'ky?S{׺u{{^׺u{{^׺u{׺1>׺_H?ߺ\A崃 q{^돿u*^Z/{>oMmn6 h}t=-WIO,5E2K2}%5FP2!{f5%hSVC4x)EWDA!yu .ڠJ*dDD@"E-ERDViRHߺJݷ1USO|׺6d3Ę- ]/SB#1DڕLu 5oԺ7ߺFw6&թÞrT T(jѴkT̳FeTxA#OߺFkimCA+.RQa254De᪼tӖ.$>^a&. oq *i*"N{&6tu+QTA#g$OѿnX8ثhqx1VczaF]T(02u}5x*/\L8EEiFDP{{%L8lJh(Zj*r8jG`*2tAz cǿuuL[544qkXU"7X)`uE錂ߺPcw5DU--$"!42ӼI-3NSG Gu#ߺIY=39JZgAU꥟9Ks{slg#b}˴0ekɵ6f1U 5TV{D+uB^;jgQf1e K[s"1RICWHYVXjim?樣Fů 'ߺPһ! GEU=YS41xٴd%l~ߺNlTMLk&"j$w*TxO@?@O,:QKI MP48SJtQ}u(1TI$fZX c6nݗ3y6Wnc~mOLmjjlīZiu 1|3׏t`o&X nB+JW󻎺wz|nܝj8Ύ$ C7UN݇A6G5O[K{SZYIkbqINXqSiR O*+"Z|e,cʭ<,IgEUy#"=zXl=ppGyjĞe=b⼌You%03V!-}cFE bU2C4z()*L^{kމY-d]>"R*ؔ)5LU+!1U@{ % Ϗz֝hjp=\ _4 ,Sȥ"{tA;j[nev+dk'+PS~Сdmq@ 7ֽ=-(1K䥬dT I'TbH o~,(^V~`{^F~ny^\+$Fnou?^UZ<1MO,'z%!c%${ {^ry*dߺG4CQy }.Fj_ᘪ9>c&DwQ 1 o{5a̸j9yrf.%"*R9 q{^`fj|=g(iW1kǿuHnȢn \Y}u$;ZH 9.$e;5p>P=tc*]^vI.U?}6ߺIlODFOJ~^۟~su5km{M`G<܀NM#ߺYW ~A2%i ߺXu~{ߺ^׽u~{ߺ^׽u~{ߺ]Oߺ]b@׺ΔuȌV^+}=uȟ<׺ېLHf-c{ӭ.  F1 xP7׺W4R$+j_8{} <4ʳBI C<70Qf^[P㠡9`%yo wu&{k a=4k]bVujbv\kߺKJ,4+ ֚JhD$,)׭"*Ⱥߏ~- lbH ttHTyj<"WH\KFaU\{^Yٙ}IY0S㫓Dԓ%@O%jfI䉥V096o~:z:f3f)iQJ %$`JֶҬ iumi 6^CY%-tuԕ83@g,=׺1K?)0{s3LV +bE1d<]MLe:llߺB\nget%VX^uX $=uvvS`)j(ScjFە3A+S; )o?#UkE]-dRۃS|m]T)QS՞ JYXLyfX^OS_{vsn:9jE}")bxji|_MBƣl/^/EC zzJj rHax"x"\2hߺK OIEMj4u'#>AM-y"!X*?7NPQԵ/4P@tDL5bԮ%;R>׺eoOUfk"LehJEN*jU$j"*y4o~(p]W)`/It+B1%CǛWi!P*2-32TU^(\M 0P0Y!Lem$h1CY4"|rGum9gQ>:h)1KT~P8xҋjd2ubHm")5"ttMn}t+㥓- UML_,5Ң<3G$lдX@0?O~9v)/4V"VWWrß~-)Z\tLJ3W21TAc>׺Q=Z8I(3y.. 4xOuꩩN^)"TBd+2򒂡D3f{^ N^,T,+U==kZhe׺IdLMCP"gI*H<u!c>׺RA * ~_tH#t?W~=..E8~چ9@ P32U).?ߺX+hi`FjեJ'E[4srZ{NQL$o *Rl)! MxI1 5 ;MZ b-PX5"_~EO8"%[t¡gEEtTQRpib1 @Uثs[.yud j*Vj]sg/&G[~%\LRV5,do -HC`qq׺Dn%uE==U Y橚əX Cj3X&V3 {bC(kU *zxYIJL<+ۛ{^V69O^="t=؛֓5\QrsuIMTW1j6Oև:N/c͍ɂٸJz0kG!? [Itn*dZ)"gi=>~c9|z%PcWK۲es[ݧwri1eJY$O^W;_#i+MݔtA{`wV3QO7?iyutp/9'V`5Xcwg`vSTŁD\WES]OS@̯WP(|*:IMٰaѽh k׺=cDD ݾF q~~2U1xhdjHC>׺Bkg&8e?G?H#ŽtZ_b4r8tuq7u %Q W[MUWCD8Q}MP1hCHWu=ySF MU\8R4 L8#Ϡ tgck#Giƈ"Z"jX:ȝ!FYk~ C-[SXSՈmO.cOR=tevf:d3QbchfW$ ZTbBIQ+xܲ+F}J ^oZ ~[ut+bcE4JxDlQSF^``aj۔u2dp] )*A . #ߺLOQ' <WSVULWc* EeVOk*mso~/چ:7UUEM|!&I*PK*ުur{^EG (\UšH(壨+dg65c˵Xu)L4Sкbj! -c FԄ]uZh%GiڪO4D  OߺR19 \qTW=5$fTT:F)YT j@Œ%Z`NS7 utόY Ub+R㎤Z(_LnRFbA^m&b R$G$"I*WkbGuUESX PMizq42F=jL_Hh[C=u&Cxg(*:P-  tl=tHh SLK+2i$I 7XF\{V"ftI6{1ǿu#NК TpLnBm{T,"Sj+`S.~׺O +wOYfKy'$)7~`Jxe0Ls$NŞ:I{0c{cdĚ(U1R <@iTr $>׺ahjtUC%6̂QM1Ej)6q~rʨ#f@n*e2 %Զߺ\)ݖE2I.Rgh@lEש,Th thK-EnAH櫍ͤ&*\yMo]y%^h0VlFXϖWR$7XAo{?g^s{wn|?{367zC*[5AjJ P9gF~cl7=ǼqwO39J,\չ,٭9zAEع6l Lr+JR2k'ZkLtcݫm}-AJ5ܛFy:j2 4 G?Hԡ:dl;i/]obۓd,ݝ%UnuLOU.G%R!F$TW&/{W%zxNt40-5,U;imͱOMU\@ZU>}{9Wj$NY_<.{#MKη'*( Ŧiq#buf|~؝d5unSC;zfI]wwgL?kcᎸ}=gU&=bXqUI_AGCYUjE$d"*:4A#p9mx\1EFh!|=}=8Y)! Vcj8ߺ:.U;HRTcv4дCG$,P$SE $:z7kx+2]->(撎wOO ;%@_~f#IMhf8z91A_ɭuZ&*󴲳X{_zc3x)bR5ºj*tO4~85̌نuwx]sx[ZbEyeX(KeU&׺?GL,2I]`y*־ZS$ A׺# ΅< > Q`u#ɮ |Tq{-`o{nHV H+TFRn5-Hõg1gJl<E Z#FjԁÕ>׺ޙRPI9^ycֶ$jhiwkEu~~]s[c6׺29aǿuX=u׿u>׺u{{^׺u{ȣ Z?IߺRٔZߋA}-ȷu(u0>=L~=tSNN'51X~\5G{^C  x a`Y7<{ɪBKt ĝ%S"Է=t)i#nEIPLӌe$H,i.Ru%orOy׺sJVeґ$ܻ1؛ЁbjWSHQo{#*h7g'6?_~ ]%% ,߿,q dC Qe:bHԃl42 ;eVCib"8ic{t2POSJsQQ5.j_EO) ]N6\y`k)j$t<P~Cfbh׬T<# lQSuzH͗R؁mBߺJ\%@H'F=\^ *V#\)o{G[UU\~>Jxc%:U4!B]!{3֦B\tfL&Z@y_Y]_P{ԕlGU1SCQ\ڝeTVyE/qǿuE_,iTiRUB,\KߺB KSURFGhW5D.\ϿuV8)$Q #xEOu&b:~_~N)\)dfUT f(frnJ-{!U$#I)-59{^(m&Ŗ&{Ӡt5b.>_~3Xf/*TT@\y}&`>~aj]+6TiX7)#uNI#7v#=CLf%YC^9u ]7vi*х`4lXA_{GBT?Iˡ]N#~#塅xWEȨn"Fn9{pq.:**f 6PiIǿut] $|;ĖG0!3Xx_~zo.˩WeeKUWUU>JFHS3M PDr?6=z Bb08^*\}c1e(+ U=:!6%0\:߈+׽+#1vRt.bL48v[9A Z%.f7hM02pO`֎OD;#seo-ܻ- ј{XKgR^DcT #DpڼjP:J>k3>??wm]nMOtN&덥]ÔߜnꚊxw.gQThhਙ稔$w: A~DL6[mcmJ1xꤊjVdx34<{^閮&K>Sc~N͕ ,D,M]Y,Ź.d4!Jr~-ktFIܩ$X׺I{\poxa{`DC@ 9ߟ~c-q"^Hz kO?[ߺXmߟ~u{{^׺u{{^׺u?G~?"[a{I ďuY\*!UQ?҂XT.@3knoԷOW} GQfs{^딱J$<[J4S`Eƣ`G׺EXݕfe NO)ky'}tKBFH yX6ߺNy$o4sI#ؒ%@ҙ2苬_*DH#3KZ5R}tϐU%CJqQBuײH tpE.,hOѯ۴,"=L"O:Ȇ$jy3<&}t2b)jᎪJOBeH"Ei QvUV/M *I12ⲂIRYieR53B4TVF]*>׺v4[ɽ%: 樯v_I=bImA7QйLvU34a<2EM7x%<3$<9Yflo{ldZfGMF41O(+t^B:,dF# (Nlcw,(ܲմ- 2_pjJ6`BOuQUb~c$H3ɖZy:/l,C.pȫ0PV,tY'zfHgMZߏu6Ѹ&!] du*DjuZ Z* zD0zB^x8SD|zBGI0SQpdhgMD*H <^ ,X4. i%_ aW_M׺{*uOdxިdV$QQ!Ԟ)قAߟ~4 &ǕEhXjHPWߺO]?Q-Tu O /YDc&8V+i$)~.>׺CYFj٫uojX+qvbuj?%T2Evđ1RƬD-sަn ZY&TrM!By4-mBe`7_~9dzyioᱤRUgR"p^[t&aŦ*hJ%yY ∵_uࢳˠTƈ$mE)ߺJMx7 ]VÍ ^O_R9T5"՟" o{Sh"-6߂~u y(!!d' 0' /aQTdӤ0zp~buQ UB#HQ /f+"׺ $$,1XM@~^T*#$-RBP#(Jꐲ/ (phMQ0,dr.0 @{^%kbXK]!.lEz6k3)_ _LUek: :2H)#IQzG{wUQd&#^VJ#jNzO 뉖2H U S:z:3hvFi8[Z}&*eQT2fjD',C{(z5E?Uz(5S;G*鱘˜.TPdJQe)VoRRӟ8,dPu_0AtۀD?+{C-5 W.6('xF.NLVud:u=on*MӀ8\v.|aM)禪#Q<n!(8eQSk֘[5՜l _Zn}W+C[(R3ɋ2tIzC3x9@"mep_M lC=v$UoP9%I`S~@gҸz~snupǛ{pf< +3Y2{zv +uh11g[$4ѢxW}wꝾu[>^)S4=[[N nՃ|%5fB? X S׫ƃ p0v.}-K5T M_[*+ve4;znTۆI+"8E)jQzQOΆ;wGEUGU=]VCsY̾wqr.wswMjB:oĩM A{}Wը屽yskf; {Bv8dcUzãô67iؠm޺d7l(ֺqg&'4z9"!R8yX{^pv1m]]} ֪(WF13iqgVԊ|kbW`t?g^+Vⱳ6- .԰Fuj>ߺ^`om6?׺ߺ^׽u~{ߺ\Z~MuX~o?׺Έʤxܑck~ucXْ p6^✻Xo$E~?I+Gp 0@:yuZ&Pbtplmv>׺n*#bB_Fa8?>׺F:UVD%!C)Qu bm3R1 ͥ[1/b=tۛwL*ԒD%vU xa%OߺCF Ni 4R(u#PI!a/ХcF**j(b-1H$4Ekk{"k#=t;b*⺗&QNi%ʏ*8bfLw?'{ CCZb}t1AEJTՕիGTk &0JtJU0<5Ee{j] T -O}tbv.Vˎq0;I䚚+QE)榐.n.Gu QWvxjS:14SUAJR#pu0Gu*#{ GG_st{+IE%() o{Gut\^FP eO$f+2J׺W=AG 4X4дD&CeV~WVCW?\L?G,$rDŖA&׺IW#XU42ITʧA)$^ԴVdEIMLUcpTKȡ&-*{:$0T)t4qOUdrȕm!"i 8B_!aON4cBU-H6:9b&NW\=oR8A~4d15sSck y%ZE1Vo ѹbĀy^AIl= e=DIZd,+0 &g6׺MtT*<6o'܃ ~*ꣂw>θi,-{z)*#ɦeu􅑔)ߺJ*tRnͣcى%NIu*"B~9׺3p*r8X\^< *fdfY56I>c{uJ(k &b@7>׺O<ZXs+"W{f{rN&:nbLa#Aro{V15kBkܹ1A' #M9&i#$߀=u_}wNs [7{am\s KXDԴX::Ez:ex(!7Stb_Ynۻ6 +{O|o-ѹ^aG&km5 &GMZiPZV'qTaiNy^?1TuWW3ͷq7M\S9A=J8j<qZ=:+%3޼>k~nޮ3rWɴ;-ePWb8ݭ-* }:hoBNg;p/k6|9GyNh㡠nM(jh 쪱jzqPxdu36ͣSbjU#6~)%ynSdxZ_97y j폖5mf6rQ{;v~Fb6~S썕av6X*8v%_Zkv+SSB9f\fJHJZʨ3V5٪9@ V m7es[h?^z:J*m߿rO>/K3'3O˨4T4;Enj*J=pXpWE`(PcvRE$UPM$ye (^3^<&ؒ}5Lm wVVd255ܵo$o\6"Xi4{8^Z*vko0U 6N8a q/SzvpPB^$3id0p ;`J$u2tpRSCM]Q03mv׿>wQr5ODkA*)pₖCQTf3`W^ DA5ETtNTqL`558ܮ*ˌTdV ~M+5BHRW֨cjnԑT3VTUG ?[NYfzjy*)'d`ZhC: t׺^ 8} VyLWXNxuh} Bܑ1n}*2< 56Q=MUD5HۙD- EuA>V8gMcL݂Ul}ul6&׺m H7 _UVa{CߺY,k9_aW'Iw?Gߺ]q?~r s`y^??/ֽuF]Cb~dX]ۃoԸ-@w?׵OǿubYӨJOǿu`Բ3ipI$~{^:F4A*Yؐ%`ǿudG. rKdF%)؉__{U="SI4r/*,~GhuJi- {^qE%5JSSư WBIHO,HX^ZGY%-FA1f! IXU\AM/_KU,OIGHΧH?[{t,m|~. oIC$0SϒrfVZ:pE`c=׺2هawlMBۚ?QTYANjV\KH*K## {tlvf++x;)I'Zj/-.ߺCNb:ltAkifieGd`a{thvfȏtzFV}#ȋ PIyaBNZ׺R ^j*ec'F1jMGQA*M$=׺RG$c)WT5\HLiЛ{^[pt⚦fzU` jB*NLH5A=u.jrSQF'l}fIc,L# O~e>㨒,VF JZ\"T$*@r,}tUSQ- + HLXSQ4iJNߵjW@}8ҌCUG@_$!#^I"Ze, 4Mf׺}ZjTA-*WP;K>`F`Q~f-*>8}$Tf+EpDC@ 'ߺ^ C,*Rs(bLfb [{^ nASD Cc#J.E~}uDQWKYӧٖ Hyθu{uPb!0̌qGS'b,Omz] P tV:UҬZi䠶k#Me~,"fghZCEiėaouXC%:buLV"6B<?׺%wЭ07 d[(?u;,0+ANJM{2İ9%1ߺX$e4ἠ? `ru2Rƙ]~?׿u=*Fi㍄G0dF'/o >Fb*29}3S_SFR$IS*q!cplޟ~G^j\!>`6v⢤e6e6Ҏ`J:JNs) 5bgu˪ﯝ{3ݙڹ|ї;ٽ Wgh1jܔ09IꖒUYME|_z; |ee粔g}ٛ ~B*$R4H;pAWzחzBi0נ ,ٌ[08|䚪4P>sǯ~]/#;þEVme[2v<(2mUd$I;;oe2 ꠧ~"^'=_fn]S ͝pR 4y Ui6U}lim#_0E:c_Vz^}:m>3 WS752ge}S#1LkO*^_UzV6>: GMIܑ cKM4:Zcf*z&%ΏNzs? bO_5E <}R#DNM%2;5p<ϸ;ZQT稑2u3Cx9 DYDtzn)96ENVZ}AS%$nZT%#<UDMR" ASoyc{„WEck͏ZJ*2Pյ-?T5iST  q:rxSЭdwfS+[CSNQhxTUּIU>gZy)a*~]z$p=-8 ㈡ż~R*l05} d%\na()$IQBPJSSϥ 5T԰Pc!f:iQ)cIQQQTOEU_(j[( WOGJ\n϶ycA55 WPJVSIKL]d zkǡnQI-~a 1(H)<4EddD, B_uږ#N9ak0dƫ%ǨJcOuMZ̥.>b&J II&YczȐԟ ]zu-˃zgp.O!=):YLtYZt)9DAV^ ޵OQbRZL~F+^%h4KZb⺒*4FfL`RZL6>hc1ShꚝUM>Y<2Wul6U]UFP% ( f{;/[ic4u4=C5M=fJ 2iG*9X3z~j)Q|e py1I8 ޒZA!PePMPEEwiH yBH=ҍ+FLFF%b2r, L5qQ i餖@G*3#qp}ug_2x͉+7dݩIC| 2pQ2,4X3C$^xύ[o? 0'9>[6;?Y5fF\b*jEsyVf$׺ŶJXUMK~DO7oA9=u&ebRAM)\yf-kH?^֢dP5,Q$n*ԢFam% ߺXj`|Z$5ucpQbo~!P+Dlip@u6&-7$ݓuؚ}L#ϖnO9X,-{1 H{^.X!?RXx׺䟥u׿ue1Sߺ\7?׺Ac}< ߿uc'oo~q׽u6}>׺~rn=uJt_Vcc{/ Eoǫ/ߺR2[P{{^6߂ ׺x@bT6PEԱ׺R^_ ;i3rdI 7ߺJ*:EX0k #XC\q))ٙ%Ո%Hk[ߺS< ޖ?PB,e@P-ҧDUIYzVĔ*@ p,@$}}׺^&bDԫ qR\<"'=DQT/׺A&,CS$K%u!ew06o!T@B?Ou=AkhZ<%`i(ܸi:Y`Td77{^`ҶoKG#.,nKQYe8bgWxhRGFy BD*Y)AN>oYLw{+GUa5CBXzJz*t(bI0}Cs|,=㊦|-Q$oYk֢EATjGb_~UcbcC.QӖZZ&2XY`"_KљY+.7%Hn%<kk 7@Q 2}C{ Wj'44XkdzjEVaom)b -o~;Oqf7Vvj],6L x5IK1J嵔*n~ h'<\ ʌ>׺X\"8Nc| 5^ _\5rS*D_uƚ(b%ٙXF#bE"~/thYATH%VIJ)Ѵr{$G\s^& X[~:g!Bm* z|}}u J s fK՝[yFB1׿u2F4bdBMC>׺U<#<ҮMI{(%=uJu**Մb̄1&I\EEV3h -MJ@.I-c{|3UDgDTZUQ!y|*ٯOwvDu]uUx0Y(i:*=^NYAU$#FpO~ ?Տ~}{j qnueyqقZ(c RMfs; :cAWՉyiɈ:Ւ3=F;Q9ږ3Y)cX؉"uR5A,c@K^!T2RWUXڥ+ZV J8f׺(J|tezGd(72\1J<5r#cR?JJ.׺7x/1CS#J₃=OQW42 3+)^\Irx&R:5-9 *ki٩"ixQhrG  }ul?cSvfn6cd[Z8 džWB"10!fKu+zp>&팶naq0n*^&dqR;I%+e bM׺|^;q?cn՛ISbh= 8{e(j0 hrPePP [H(} {^ȤSPd515E .9,{^uqb)iJP\5]; Y yߺA[ϑ֍eޮIWKԥ)B}t'lcIVu{WWurxd^Z!zh6 IPG{0m[ߺ^׽u~{ߺ^׽u~{ߺ^׽u~{ߺ^r=u&'*ɿ{D:P{#+)Z\E#s{E rS{UѰ0dX[_U^MDcJTIR5aU {:!#w]L҉٢`,;pEu%SDϦ92:%UwP.+ߺJ V++bd]Vdu $ۏuq:ybyɩ5$KߺJ|5ⱤyRX$C9ĤG$@#Dco~H\L=uoC6ZzS\F ̡*}t Žu*5 MN@ ]ژCuSEAWL,4 dXkx*zCFc{Y(Hc<|H*Ry#{qoMu#:Q))#0%ʮ*nYuy#:T-&q%/$GJKnJ76"׺W*b#ȓ0$@ k'udTjqD2!bF齾OtRz!N!Hey5˥I]~]iiqdD ҀTvi E3yBWynm~7ܐ35I_Jj)4SDQ!+ }?. 'g]mMM[jsJA%UdCQ%68/ĭt yuLTDwn"nƉ^)JD_(0FeҦCPFw'<=FCgwL3G euL wǍiUx{,9ֳC; Cum +6~t-Isx}l EFS/۬c?uc7)jΫf3`X* H֗7_x")E0*BƊU@+;.fmW{9!OZQ5I/!A\&gQF|!ԏ~h1"4GU;!!TY~k#(*j)12U'W+u^gc⿆͘.ijzƨ"X~/X4Cu_r8ȼ4xYV$j꫞E᪦ЪaϪ0._.}⺱}~$wV٠,ꩪ{w`i[jo\Tf~ \tJ[YCM$Pcǁ:OrN]0#IwcԳR&jY(⧞XTEG5("h*a*wE,a9,t[-N骒扜ESN$Ur5THWdjfJ#ض>&V$/19jir474hco~09ϛCMQD0cI 'Z6g &45{^(ɢL*92KMKMD(ֆj2jxK%ܢ\~;֪;\RKQ]$u *5:dDԀSDA>׺.֊!lN:x˓ꥍ(kO,JZ8*ztL>Du[)9dA4 U$gMN9\Z3(W#[jkƠOZ|.b7U×OKC*Z2잗E>_ߺAR鎋9VyyRj'4I-8 ,ߺF߻KV&#[3.ra9\lV:*ft {>8WRH1<fll~CR*X 6p՚Kfjbj^;md%M"a)jlLѫje9C s4莲?'UYC{qPI'xqK~3O*'Dk'(ExZZXɸ!~qnjK#Jqa*X#ߺM[SLg$GX`fPʿ굖^#5SI9UH]B6:QߺQqF,357}uo׺ߺRc0 >{׺u{{^׺u{{^׺{uQ7l?/{c#@#~KV%%;6{..ZI tIx'{|RpU4o(p$yoUƞ~LxpjRȬNcm:X7^׺4O"LS,Qyt%v XXX{^B*$Sb J\(k}=׺xI|jFdriUtH. ߺBEt&I$*:L=B,:$Ycv)^暢;V ߺC%MN۪urVA/<%UT؞5V吆x6{.*zgܡsT@RF4xGH jAROu' zun&H!Z}U*,TOGC^ 5Ze~jkd*q&'R# լ7#{!Z,.qqI,0K%Jy "JO~ ]mJTj+)Z-_KM#JUԂ=V,FkS1z:H+jr19F$ $4fOb #q^Uْ)4Ĵs} UO rXEav&^P@tƎ%e:V\հ2XR v68tpCU42-#SM#M*tC ݚT"[z-{;2"Ag٢ʕUuTˤ0P=g˪Γ3%:f#QmMki䣏qPW8,L"4L)%U ԧ?}xR=^ur|}Q;tJmKS}fuM[/GY$a,EI?Wϯ շ7D˸73)zaYpW_ǤY;XLt{Tˠ7ox]h;a\^ɥoqe(GA(tE>yޤaen,'Fe.**aeQvw$cSK:If_MYH*fa{.#ʐl}׺.ٽ՟鏫ssղn8Cg$k!VF:\L8 VQ|M$x9Wz2< wDgm%=%EzLT9m\X,7aRTJ=B \u_} pe?۟_C+tltbѵ+8))r+jjAYt)xq6nM)_LM^ jXDYx+),)G/lq:5kQu^Zyyd(EqXq0`7wuE[El᪗ ZRLf毃kIT|%>3n5k[t=Pz?W~hvzlU׺u{{^׺u{{^׺Z=u\ ͯkN=u0nO6n=tM".Mujh~)1"hebLM$K EѸ`6 ߺJPʾXj@EȠ$*<ϿuR!:>8+>;re )JI}6}u27fJ$|- d,׺Wa=XhjjPr5*cfǚ!SO$1GG׺ZaB mʉc↦ZdG+c6SNl^Hٚo~=tݔVASȢOT \z7aj"+< RHD$IaC&XJEƞu<iQO5B5dKD CE+4DRD,E׺T`,U JK>S~׺bFZYļ%2@x{^馟.h]BbIetǿug#Άx KP@fQ~<ɹxeӸT%\<{^_1[$O}`+Kqb/k_ߺIůb$**)⎫t5UH }HG`u R$ǿuv2{ZU4}/ֆ%>Czu^R)Ԕ[GxΟ{θ>z۸mԟEs-j=ջ@!, [|&=Am*sw mq4omc UsRy%ZȌjEGTĚuJtփ v36z uu5tom0 hPM#I v9+S4T\ԋ)x\NsWתy3yipgiR2%gYǟ[4>w$yp$3Ɛ%t;=7*/it5 ZW5CZ(Ѽ+KydC<4)V]:Tծ n1;ei^|T-]k!t&F:lޑoASת:w="4fpVI]]U JC:҇ 0c0}9WNO!HFT42TjQ#΅PE$,P+dKZgt<}h]’Ia{tGGYLC +jBdJHTMpMǯu}>VfK.- Of|ÛYΉUVբٝ=Eq^iqh[O^ǁz{`3tΧ1yn49 22װi$tji$UEy|a}}3Tn^EXMW moMω@iqt;,aIJ#_+/;•W֫7 tnz݅M]2Rۙ.04[.tGj@Y(jMASKULv&j QUBjeUQO|Rg&Gue|,e41[tY~ߎ8ʁ׺q{Iqu׺LKj*RHc6@$,'ǿut:Jn$E@&Jf,bߺPcoBj:ja+YGŁ}u6XV [kJ&@~?u9 jUl}}%}tވjP\~(~F X{׺u{{^׺u{{^׺u-ߺ^$?^z\y\^dKp4؞m{wfҪG.VX/{f:N.`"T!to@UԻ5V{93=6hvWDL'[r}t4"GDr̪S*©+@Ƒao{-ʁeoJf10R*)hPegnZt^iG[¯RMلM%% & i!uP4h̏%Gȑjvph^a#Jbkk)p-tET垢S<>Vy("K8Ւ[Dыu,=t!ҬwLdJ (*'%&cNYfd*޳y5n@Е#+E_=-T掎:D\I~3G 7{t$Q,G1M s4]CTSH顒Jh8IDD@6uWTVk$Zg&MfRTb2dJůՁm\lU&C F|-?*NHoՐE#G*FCX^^X*ǧ9:X)k"ƓKTJIIfDgPImr=׺e]B1S%~9 ͎er53&<^uC=&*@n4jD3SΤ:GY{^CW^ K Y&zm+$$ 9d?{22CD#LoxB)PT"׺4,/IHIbҴzvRD Eޞ8>׺T֊mzRig]A)4+0ը22yߺNȲ؊iՒQ<%2/rS}o{R-L{`}zH_ߺM%55DFFJ*idt"Xm$q7{DkTQ#CQKXAPRRMͫ8`=t.X8%_Yҋ+H0O~&bMRS6# uŃ"?"?Cn}th^a:0B *Ē'>u׺QM} E>'dA0Rl)!xaߺ\2:n VC$J#E+HVËo>׺'}Ѹ2X 8h93Jd2jn !iQi?K0'u g s- ^ښ*,i\H#W$G_W2 B^{:p[!A.G{M͈ܹoxUUk PSe"(!R`JtP&m=cъ^QS[D?+ ~cK")Ţpcu׆8L{ouad}{Mrca Q-V7=_2SƪHfD^q YlNn'b1ܤ5%.I1w8&X)m$Ҽѽxח};hYda\-&SsЦFzfy!|p?̰Vj)<:k_DK<^ǏM[MӅ&+Hdh%Gk,Z׵uj˻s^;'+Jܮ[흳k+g6ucδXq$JH>^L>1}Qߊ+k֮LDUɝ9 &߫LzQIM94G[ySHe{etٓ RS7R SZM,IK#u?GPq՝RUulz퍵9o1: [MSK]QdsۃlS;$qQ.}>jQ7f\N؛ޣfn.Mdo}?owJ[IQD$MPV3 ϭ?!G?g)TŖ!e10Pn6bQIKy#g&1Jdqb=Zyk+ 񖚃f.'+=TRiTQSdꤊ\En:$ؔjo,5-7\qFzͫjҌ\&ajڄz 6"X&`8DUSi ӯV9㩣֚Ѫ[LTf*V m N<*cRJGqQ@>FZ%urQH41=MET[Q F t^ש!h+R:XI"fjs竞DhF =8^Ud)tMJ⣂j$2G1TåcX1&)frAQOx+jh BWhWHxr2sgR@׺@̹ r \-Y3Uc2UKqO hϕMu"'IȨzz!>8E )hhHvp=׺ w.ߓ3E.K UC\gս5;x&`+kY 5{=S G=?UQc+-$%t 2ɤ [)W^NMOSO+vz*><6-N^S@p5{u^1}x2-DYqEbCME d_nNab*#bCp^^l'!Va*HY$zE_di'$5jEkuhn9Y:,OSn-n;Qhڂ5M0Tș=Sdiv?R=׺-]ͱѕ[?NτnUTt+GZM2KO sѺ3횭_p1E U;QjoKMZjf$qQq׺ַ?[Zי$6_Zޕ6:Gu5 ZmR[}u ܱ҈??/ԚJ;w,Ԓӥm<4I%91LzY: r?6>׺o*`K/:GuR4QQEnHcٍ^#(դ$nx ~=t -y:rH*eͤ׺@Hj&@[,^/u{{^׺u{{^׺u{{^NGur=}/ߐ}u5tny ׺p(U;ECu?{^DxdE妁YO>TI_O< {^^)J}h!$Uy96 q{9WU\5=~<ƱZԫI9T*B<^})LB%yX D hbVLS˫PE}t0VPIi(͌)3 F8j%yj)lt. бCdt>9%xJgh/U ҥ6@uL4ec>:*V9 hy+DБ\ i׺HT䱦JV6FpUbVE YfR}@^Bl&b<\s=>->^2i!!MnHRyqirs ihk&cHZԜUK:EfB\txѢnCs-6:ijqӷG-DJ=N؟U{^Vv Vob" pdkyQP4qO t }'K-MSAuVF<* jHRY!Շ{,EH-h?I׺4u+EQoRELzTu]ZSxU4]ArG_ro{؟ap KFȐWV̲"đ<ߺT;OiZ|V{s IvF5o%5VPdO'vTm_ת :XDLm:lt|(d|34dq07`ƿ>k';q. j.}KUY M%I8jvFjpڝgR 6﷭RT؝%V2rgC ,Qbo*dV4GX{<[E#6bx=>ނhTx eD2U*2&?{Hf,@j׸C/LrTWUTG{GYU;jC(cQ^>N8;ܶGsmL[}njyG OVZ9 D ) ˁ!ӯ t.tOG%*QK&Oz"VQOpA.SF:S|̪#;?%M[ShK +(ȼ)QGO4S;1u˃zAO:4.^->j{levO)𸭝[Oݮ8 6olͯ٭6^w21rcI#.c|*z?1/yuw_?!+vt]1Spm|+j ŚP)i28r5yjd#YЋu ?o_oί:q~ٌP hxC1e3-Df@AK<mP0g<&]ϧϿkpΧϡ7adS t:5)Zgv ᭨~Be g3'c1&|,UeI*XI4Eށ=oʇ_`^(XU>ʭmMs{g7%V#mp[R(rYsS䩣PJc9(+}[m6l ~;fI#+{99}oQd.TMp4|^?B9}K?[+n6N.o-_f;zunZ 7_*s8O>ZGU#_˭_ݝutۛj@ݵ+Z3=|VOQd2}R=C0VAsyj*WORTU5[YN[R˭ʾ]wNfx|Q,R$EEDL"{zՐc28Iicg!FTPu\y(`dY^ST_T+# jdk pQ4y*ʚ::()qjeZjں$4EzoZVǥE]uxZ,+<2z駫XYϦ9%+%>:Lg(KJ8)B]FYU9ls(+%:~EI=K<1S!G$A %Cr&UҎY_{<~+Eˏ B?S Qq }Q#T/^)EEA*kJSfiDi;gA`@j^6ʓ-[3'W4hQETDYCpt]=tAsfw__z6ˉSRHI,yqP8ү3ֵ]Ámǟo硐>:Jj=°TRZ (sR 4n yt׺?/:ëz9t9Yܻ0ŕ; v!]VQC `}uoWx| u&b01TYQGb*#d`=׺%6<{n$y1Vb h館YDŠY‚t:}uhSk/Ut^iYZژgk-iPTTSC,ވ%Jzaa/c{#9iRƷX\PR$  ~}t%9*9*)(cR:86 J9jZxh A` \FZޢ=uD15Rc[ Kʳ9IcߺN(uUZ | 4̦i'q`b`ʅ'~5/=5 $R7Q٤Q.`~uL5*Fff%y.OGui7 >u^׺u{׽u~w#^׺6>׺ߺR!:?@t{k^$ᴆ$Ģ6}HxA=u$rzorP0Ѐ=tK(Wj^_~+h)2ZFTy$&:&r *77ߺJ\jbBYsCBFGߺSY`:WdbUFbtjkpB)f }L$̳nt[\!UГךY( 'R[>J&\} {+!:xڮȒ,ZtzUSSⅩ(i#"I tuXVeL~H=ZrUUTV'l> WH LV1C#UH8=%^D4u_WYOSW,-SՔXR:/%(_{]f7#$1tEQPMKMM:l=)#̊S*=ubg|Nj#hba$Ȉ3MSG,KH>+ M JSP:sP3$Kvc 3cu*=׺[ۏ# +-EO,&dT%e0Hig&Уh檕jHo4UR dZ2>؋{^cv>ō%<$s",`K$^f6i pxzX|!]+&Z_m{~;oIQ)'b~ڞrA&%$'׺Ybgjl8R ֺZ:ڜ!ZRX TyYA sэ$׺I5`:zcȀQS C O5;)=rpK:ؖn-{H+(`H>I,J$ Kc=t̵M ΉJ,^Q:Bڽ"׺JScج,E#=DL*XBPu"TAGM,qs%f u5Sҭ,q*?T rO/ǿu9ڒܴ+TkƏk k͏uwKChMNU 'ߺM5uFP,sSUEbqj$t ?P/vs_=Gi'x*P꡼@St{l~#fmNjٖ4q|NP>~{۝=TŃ*hZ::hjkibjt)$DJh%գê;wcev4[nÅY|lyjfsXjLiuh^@'xnf 1I&#!U[]$ӷ7 FHbxD2|רZ]2 QQey_IRf7k[u#y_xZʝM=|5O dD58vujW=_O~zIl"I 6U6,C>]{>׻qXEl;ȼfdm*5_zZyBZJUPKN^_W=cwջorobvܩo,En T4*ajex7_c#U: Ƕ1L q;l>A5 \h:;**j2j*M.LlcX[ku?nuA; rn[+hmǒCpZX^9KECSQ.(fEu=Fz>IɯVhR}E0 /ʞ5{o3K7]Ot1UigݵS)qZdFTrdǰH^f??>n;MgrK]$t=;#DwYbePeIM~W_}~s}[қp׺r4T+QL](qiHcYUc<BZDXtg%&&Za=]\0c*TroA5 C:M#{?5o5Lhe|~^::T)EJx̌Beb#֡c;z5acWCEQIBLSR2?g .j1 Xsp  Juzl"C&ZeBʺp{^&rB \^Zu'39ur}tQ飊%],{4&x7{^Rm*詚fY#=C,ёpoa{b Z3%dy1Y\|QVTTX7UZr5~t^OQռ *\uΩEG&R1J`ĐMIG;U;L0uYlE0_S#bd5Ƴ@3n=׺:}eI25uԹLv3OM$Q dUji%hfy㓆' Mf*j:P ji肥 [,{^qYL6B Om`O 52POI5 4l]-ǺFSjfE# DbUhD P8"5{B P),Z֑%&g&XE:z~{aSi *qVWRKrŸ7^qh)hG3K7&f*$ˎ9>׺r&8Yiawi:!^$4P\ [{5&WL^I[koFJQ@]*[^x^Q%E3Yѹ$mKaoO >׺YRLaGVBoUɷC;OMdi"LlmE)l[8 ^}t>(^a4ϦbeZYC6FW^=tӥzjt eqѣ-H6 {^_THVFA(1&f$DbA`Ou :ID"}D{ic'>׺ m>K-Rg-YU$!~Fc&Qw# $EFs\G~u܆KERإ\Yeq/ٛ2-s~=u^=ok2;SKQ h0VRBmnG׺*#s5T2EY1d|AOM,U-¬&8ss5Wj`STI'W@SQː3TIdU$?9xtdMLzxk娩UTQGXO VYi Ce2yT5M]]]% DjY)iJp5cAOЩ${uo˥%/]nJi鱴XuZjLx۳WʴP)kYơ[#&:M5LQv =['xuGYR_s`?lņ gb>EťAD\u50֕WĘ*ژZYj)6ByW< 9<0E~i< ?kk%s3v^n`жUbゖyih6O-XF$Jǿg5y5W}3_i>3(|ۋ#1ٲ헆qG d!+_PY"˯!\)@ cw~]݃6᱘Ln`)PA4ᮭu?#::vuMPveޛLmtuy&[;tnLVۛpTg?aŀ㥨'd)MiRTQt}˚%?цJlA{`?sck=E=4٬ =Cx3Q!,Qc?V8M![nPuuHU{Wu{;vǸNowJvU;m;TK52'˯:/) N/tST| f[,40lyjTȬ,EED,qXu+cRmڍ<hid`։ꡒztdH NeNpSQbJtvWW!uPqaɌ0D7ڊ(~G)GiŬ`PUM]=z֦m tMS=-%)5"hRRיtc8 <}qZ$6GuJY?6)k"jRءGLHӣIk!XcTYvgQ ('M$4?$5dq,!(A}׺(ݍjh4Tkjz9ǎJ&&FYڮR<IMHQ۴I;OIIe66WT5\[WYRZ0quDHMDgi,xʑ~r=ujxYؿĭ""Rfpb$_ƔC$hJh [{2 QDS4(k$f~89e)ʣMi)m7/ 6?B׺f4Sr +Hj7<|zjILINlKG{LXO{^=U_ޢJ+R!9v/.#Dj~'~4=.#AML kDQr}m%~!㪋jr5~֙ZkY]ʶߺIBOQSTBԴJ(;_}tMu*)$cm ry%~FvA%Q>ߺPJM.oÂ?ߺQ'O׺{^돿u{{^׺uE_ߺ]Gu=J*_͟7?=uߺ\ه|{^z6 \AӔv:X[_ߺSTVg>ΐ}l ~LWWIL+h u7so_ϿuO?C+rHGPFߺK :bnUeTRFBciKu4sWY⅌p0@+\H7ߺK}R# i䞤qO(2$)~882$LuUs[V|pj=\y)QW<0SD2!CSuݽUGOG+iU)d4RdYdVY&>Jn@{ˣ Gr lXLZ4)TՑ}1F0 5(Լ=taq OjvF$QOS(iS%"HmkXdsPU"͋4 Jܝ3$xX$4FХ7,=t؛fi5䫥#Ff,d&`*QQOUSW$ FR%z^9"2DYm^}J迏~xVܹ:x*r0x3QOK5:ߑzRbA|a/=MY 7Now^ݒ|E73m<9wJ<28<3~}TfC}߸)w3;Yp-TRI?nm\4ݽQ6*(2qYv8Xz֤ퟋzck3G_rtxۥ~|mRcZyL^H+ï qW:0;BLNfZ=?lnTUQn^{ =W]dgem^U޾ޚ\TzuL_v#jd6je2%A;;l-qL+}/2PQeK7^b0I-)>Nw_3y|GWѴsnΗnK[|n 7ugvg9I屍/gYfϯVOzttWPt_ff6U=X&t kþ:?,DTb![׌b$m }8S C[fzL].V3랥LW9E1Q*SRI HN i urdRW~߻seyk(V4/~O}{&=jث)娃D:id8Icp(ʟ!d:CߺM)ZZ}=]ÍSR$T}ZFDYT>uutKIF X2OWT"2K&2~%镕2ȡLwY')'9<1^oU@YP~"R˔H1BJkȓO84-Tq'\fE,6Vb׺qO1mUEW.ߖiX:| KS̳YSF!{t;׺Ҏf\?$pKΦUFok9uU#'kX@-Ji珧{I$ECK W=j\,d3duSD9p^x{kpXq{C-=&9:JȖaDbCb!om`=t;T܋(S#g(1 =u#ї(䑝hR K5/_F"׺ yjjZ6^Nt [>׺Ǔ ^DUBH-sdHbmfHz}u<"U$F{R\u-#ߺM,nX~~a'ߺ]{^׺}׺u{C~G_~x~?ڇ[ߺ\hf*nT?.?ߺ\u$UQkeaAH-~uD +ʶpߺS`,l[e0׺JO 6&[_?^9> $df N5H׺'yQ4o# J2M/{:btr.U$fR*0^Һ7UXLLFHMK$1VCؒ SUVH%j٘y*#m) }Z͐\{tfRz|q$4")PAA+2}Ӵ͕( C>kf$X:zlƵpR@rC9Leu+ib6z8ɲ1ǐTmMH`h!Y1ĶR%{׫Jtz_>)k !DukAJ&NV)`!H { ˙1>#bb򾺚wdwvX xy+cT5X5qZ>]Z?FU+ghhSSV7ҿ,ӢZV|pڞ'yfΊYBQ)2׎:PGa⨲e衊*VއCS*0J!ٙ衚hhᔞuEBǫT(F_߇^C&Tn-3;GSR>N`1*,$*bXՅ*{{s}r59 YQ5 c=͆2ae UJ㧩}bwp=u21KT7QRX15м ®oIkJG"FZ"]FcsGQ UV+iUC >&ONLJF)?Q%m,׺ 6bi$Bq4CUzZʱ$^19"62/$+k<[ߺLzvbq :#][p#){ID'RIOyVa%[KLr#ycq5$HK-~\ߺGkm%];wfc-v"}ߺC?gYM3HҕwHR\Y7^wϦXI?,}TǟϿu`tQTLaP -9QߺH}R-Z@FaydfbYBZ2#Rx׺7ݐB-4#W4yjZJ.[e0ybՅ핬Wa `WiV%VW)Gܒφ M%N=X'lZz|xlN2\%l4ѼQU{@L29SwC䡕UtM}U`4@'tijIOQC<:TcΝ{c^] {Kv%v7uAQ.Knp,>5c+2TSgn`(vvC>eM:" ifCi?^SZ=^]ZP#r"Kb̄3a<62 Udb/ TQ8Ti nWҪedq蹏Ʃd0ظdH>c%4t|;c&{ -QZ ;33TEIJ=UUf+CM*qkk=qcw]ϋ)K-Kd\DžȚaD S stV:9I [GimF榧цtTQ Uٹk)WY SXïq'Cpnl4g+>;!zz5ENxTbZ,h:& {k׫*ƲY5D 4D>bI^#Q.f-~t5$ѽ5@eIrH*eVR2 C}Z_K, (&ZL,OVoޮq攽;)ߟ^pI"XQ$tE/r"t!UUds$1\EO4: 5,#\tF kf@,GR1iS][$2MU8fV)R^V.ZI{J-{Y**䞾(lb ThEqpS  o}׺c˭uQobڬ}}'=tHWu1@E~:7=upU~~l/d^a'XDYh%6_k1>׺[c 'jx)k^*b# j-$o~.h?ڪ"k$8iZ&V\n+ 'Ҭ~X56[%OKG>3Wd⦅Rw$ˬz ot?{l`h3UE!EfF#OH*'E 81ơڔuo?&lN((cJ'jE=D M<0L-SST5[ߺЯIMܹITgj7T\4qcj78Mh*ޓH2SQ3=Xc !CxR+^׏tOw|Up`tTbU iqC<5ڬ9vM$kjMH:ڡ(2qT=ARB!Xl=Nz?G7IIe62KCD`ҼCf@D-=ZGr|/52yluU:mZIDsSA6jfs( ~[5AHivWlSIq*ݸ7ǚ7zy*4;}{/:|b[m,|5i҉ܨ FVh`dA43<F_U:v3_#+A5X覠X;ASQC1`H,j^Ye_ W"jJTt"+ʲBx{t%e>}1שּׂjgLom)jl]:IO1f'вSC"#G%sR|a'ڶ+ 8JYA n }(u*jEd?VId*^1-4PY-k {upUOU*լQ i`JIv0"j'ߺVy:/ gJYH܏6IKG?^4eD Z82s~ny^,<Й zS żd$~%sX21*wm ]Yae uMхyQaY/ihU[ߺEh޾,ֱȳp•NDaԿ{1ToJud3y#)Fg2Q؂IQv%i(ܩ* [Q'Q*SX߇ײ8tV_UT;7 frۣFJ̽4,2۵Q\[BRx 2u™5W׿,ےك8&۵QSh bcXjf\-Tq We&cϮ]iMKVyfeir|u}>V v2Jle|u*JҾP}˭T/u> źXATbZ*׀ieY1eԬ6?*ׯ *)iD6x(ZK$gI56IKר`~^ Sn a_Y:-~Wpd7Nik(bQRUjZl9k,0>'D_^TFKAbq918)ֆ*MR0]Zطcd.Mlи#'¾GpCX]ntSmZEKMUn2G8et*E70oz^홰2&jLd*rOX߳Ic2x|2!551#*}yt>c'7VH˒=2-=]mfV(裥hҤcc] wvFֆz:uu$FbUM)XI]UA}ֺXbަQjApVY:ԥV`kE "&: XfֱT4~EI[/p=uh2!-%BS!+ IZ7+h.mo~#0+1d,SLTTڞDE7ߺN,USI?Z+N8'e/$LbRmA{G%-tpfi t%jqO/cS=to,Yc0ӁJ8Rh٩rc*XԡV^!8 3Udh晄qӹy$i R"+^{^2Pj|Sj+!%WA* 06^=M.BaGE,kYUm`XΧ@~z:lYJxqG?kA'Xbyeu(Mp i,leXi%ӎxOK6m()/h++o%8x}܂ߺD?udh(e"ehh \S(qfZ3 i`/{s~_bW2:ڊ,0iV-=5ӀŅ>׺:5jJ!HHXAp}vɹ׺IXfe7M:sWӡf?@Osk^'(I`aXb׺v ,\9GߺR*gMM 7/kzut"?_#~.}u0DgKnM-{`4O~8_Sit#I(n\\On/J^UV^H"hLO7e}WZߺY)2 yF$Bwfѥül>Jr~*(iGc4x3[ ~^Oc36B6QK+A;uVPP ß~{I|?ܚꚤEMIS[K -\*PQB :OYg7$~>$ܱӻ;>24kiՑt׷yu6Qc+飭E-\H&gM ڔ^ě^׾umnzMJʪx0"`Dx͛˯Wөnܲ(+7E=GF&5~y|K[`2 k 3 "U12I ^Su w5KT5E$k5=F>;C7߾޽. T(E!DHԵA߳׸t]C*ۊ991TEMLB *ÂWI^:zLny1G5x措:$l$I2 [s~nʚȦTGFT:Wi2rVƖzك @H <qէJSrl<M35Qdlߣe$%dNdZ^Kx.sb-zmGpzYmU|P"TGKx(0^,4Uٱ.iZJi!G&jco+)URA)%"Ly1joWi\J+@ˈ *֞H+ #ؓ ֨(ߺJ?pk93WSG,),iEL1=ẒYauV Lj6xa:<&,R(0k{۟~[NoxjXV2Vb!d/g"hQ$:I!ÓM$8̑*h_٨ԗuftuyʯ/dGUZ?>׺^FkŁ`FP mɿuy*M01u)VUnll??~[QQJ,~PWi5hj'#}tT; #Af7Yh6·k6[n(r\]DCJD@]sF|jf@A߿׺8 rr*yjJW(iT5F,%S-0uCq H OH"E e ZgϽu﷣z8^9bJc)MR-EKV4z:.~"=Ӳ%hl"8 *f:q$}l٦ps*zp![/A6]]~E骪M <9j d@R )+񷌴`>N+½V񮆪`ۯ_WGrjhZ9+᧊cL5[Q1fA7o+-U^/_4kE4+H,-^|8ɨW'\PE+k+oU74S}(d>IddcWXÇϫR>+q+pc|8fVc3b6f9+Oы;K;:ĴUohs퍢3Դ?w$SN*!f8㭜UTf)b㣥n|V7p%P˜=Iޭ4 mYBf^^.퐢'㨥IZPmOEI%OY B{8SBEn09aQXfmPS=M,&R'L|Fa=Z\TA mhڵ4Di2-Y]*-Ӎ&G<1iax2jYJ!hCP[S334Qŏe;A(rU)Q]L&$3RXYJD#;Ͽu4,>. x᫑SW723Ri3d ~acfyh+)*$i vjơTy:]THȜCU)$gsSC&FeqLS /?O~@i鱲fިS v$֮!aMS;V+JO54=>suXVFb%'=t^G$H0Uj^7!'xAw\}LJĀ {|.55 HV:JezqWMLƟYm:|Wu|z2Yq.SQ[<,"5ĒD$[ۖwV6 r1l2?4nWWIS42̜?Ouj|eF GIU<5xM&F$JJyV˪c-{{7>:#C z+g2Ttƙ[PgCT a{zdz3R@rҒ䡆A"'ʤF5V(IQOʿd evW"$s44lʋU V*E~Va1"WdO&T@V:oZ:WFKVTEsL.]!sa%%G!ITJco];R~`qQG] ,^,?t_914a*uD,,Eqq׺e<mɼǫߺNFCj*S>FbL }Lq׺{<I*х1SHW䕿m'7u1xajVzh/āF?ߏ~Iࠖ#RTcR;I,`~n׺w}RGT.R,=t#3._JL|1#hDqkܛ@s?~u{{^׺]Ոߺ] Hp{6Rnob/~{ߺ^׽u:^2kң\X?^J 7P@?}tt6u {^:O 2!`@׺9QUwZyjB5sp?>^6ɐrH2gYi'ß~j$xA gcIoJBOuG׫=ahD` PDLH>׺*s46h0JI7z_Ī#\B_W{UYx2ln?7Ϧ子]dpEA7"m~;Tc2) ,WebMn**t!Ȟ$XuB٤u/޸G=[BLN<XIp9˯tܹ,AG *F5)x~O~?q Hk*p.a@\I_uzt$QAXKK=$ŦS!ՠU^ڭw~OW|1SbLlE(B++Pv Ś^ߺO4rLi>m+ q<ѵ8m*ee~ߺz'ce^㬮oRʒ7"4{gTߺMBQJUA %ϩ^?M4RYvgxhB21:t ׺vgKxꉚ9T$)2r#ߺG;cJiPuǭXi dK1gp>,idtZţԓ ;0R1y6,gd 5F z5W&vZj0/1ʤA{^Ӷo},l#]" /R ߺC| ?4g6V}t٘$¨o!KfotaaE.Bb|zIk0u$?~:SΞDy8%)(,dIag YN}׺+cږWUDmK$3h<|6xU*IHSGK ާ;OQY2YS bOufeaSDLY&RO9u)5}׺ *Y$qM,*ǒUjqU,uk G~}{rfZ'=%*M4^j(+8sg0BU^ p:MJ7\jgh⯗ %GMU9 SJ3^qvozjlbr9Z55W ((0#Ib:)^ tcv4 TBOGIT&FSerlSiqȿzWӈ/88ݣ_9*]M{W49㧞JwDT!ߗ׀,V"k_eLT:|8Q+/Լ4T4|"׼}(iFBYuKN2 $V0me`ut%LscUeej Q:Z*IZ䙄TӹyyU/I(/=>2*ʯj!SXj%&YJ!btJGA⊍j1T2hrMQdG?6_@ *A 1+vU ~{=ch #Ck$X*ydƬ#[Ҷf|dT;c͚Yc|ME:bCwSFs,3_ߺTt[&҆iqoE>g*LRKO\ºJ{VUThOe#_#'#>HӨ/ZuH[2p!I|ߐѾݶ>Ko~ A#jp`$M زu?Q׺@hJ5ET?_U;Ja~/{?C$07E$0~loǿuUb i{,T 7B}FJ>IϿuÍtlreuj@HXXuݻ ڮmGj# j_ Z׺}}>@S]RϧJF\Z57ltV(otFg"ߺLx *zEwhdԼs1gcSǿu462bCDVG3~!$^!s>iVdhQ]@׺/[:j4G!M>׺ߺ\}u~{ߺY#:K5B-)>׺}uw[>׺{{^׺uF[/^ӒP7Ob.XX_FuusfrA-~9u1 l4H }g#uRDb nu\uar9uRv n `ተߺNK ҙCiI ArNaߺJ84M2d%Iu/:7Fey" POߺ\.:JXQIn"Y*块W߼\Q" KaߒLu(`  G[܃}px"Ҳ(}Mo>׺ȑĂ ]ؐ@_u I] bR ?}u:nջHA]o"JM^{G:j$8 q5/_߽zNP\$Rոj~$YN9<sϿ}{-O+M)fW0\?K߿>Ҏ*m,Uu<  J5/ $\uSe*E+׸櫚R d+3(-!TauO׺Mh) O A<܏~?L XR7u 꿤q{ ~GuWvqEOV,x*Q]C,rPu ߺz(jlqLb@'E@A \.I=EDKKX%2d~Q*aȕF)Ayv½)L% Se zW1#x W/#Cv6tv!MXƊFD$3X}l?{^[S *k6XW?m{߀=t3wUo7P' _o~=rJ&(Re1HTh)ߺ@K$ToO. P wGD|vntc{9R3qUm4OH˦UXȾԫSL wv` {^ʃ"ޅfR"zxQ P,$,., {n5T#M]"XH1iݡ ϿuZc85<4Fd9 SdArhT5{:{fjbJjJMME^YcY1DXi-\nҺ,2Uk*(z:4G<$JTD!O׼zELOUI j,Z$T<砉'J'ߩ*S}%jOKARI R1мZ\:Xuui> YletMƖ&µe#Ocq{Ӥ[qCK=ya"Wv4QhG)e~ =U㞔T8p1 * Yk*%Sj7_%VB-a[x >=:R2idX`TV/,tGQ,4Y bT),}^?\1 \TxGI25 uzuQ*O9X?K5`ܘnG!M45 M%].88PO,*WZ}5^/<]ToVԴ4ךFE=LGK4#%A^EK~)+%i&Ih<THBjޞ&f04jk3)eo[Cabx^Ul1SKU5 yTY$h &xÂUȱuS,DbSLRTS3L9X_]1p$%-{|:Bdy$2kh)ұE}2!b>M׺$=QIW:̍VFQ6^IU)e4RAt>Rw|옾殧|Ji%G_J Uh’WK%R-N {uKULUK!RJ#;~4{^ʩ*K7)SOKP?#oǿu2MSP:,sV =E#~pfL$L(*c3:"{^jcbZY ܟ?OuM׬6FP)OѧRߺR]/CJK0aS :Bll??{FQK3)YXsT$i0҄E৒h>Ѓv{--+TVZ8E(J-9~9C-"=׺uXɵÞ}ul9sߺ]{^$m~o~pabA{X?=u׿u{{^ښ9$F 88Id?=u> %ԫ),}A }C>^ Ė2/pÒ}t++e7iUB[{F$̍SuMZFL  Ӛoj#bG %*o`eN{~=u"tNXfFND +?#*~K\;0,9|u: 珧߿>t?Dk\\,FIEHH>:KlFe#:ZxV !H!(dh5j$~KG9F44PHxHH[5ߟ~ߗSq:L0"ƓZYCHpZ~ϩfb(Q:&Eh`!aIԲ RY/ߠ4cHFNvs꾓޾^}kϠ!OEQì6'B"~$vrc$@HU1-}M{{^3s 5l(-m [E/{v̈́ӠY])iZVtw!ZdM~)U<2ȔYS5?xm0CQCپđ{Ξ};Ǯ+A!X [O߫׺+`TWY uuQ/կpKrH6~׺U`33Gd]kHZ>׺=Oz^(Xj1ڊI#{[~+vW짅 SO띢pEMo&bUNֺkFwP*JIU=ZTjW^}ue[pU*±DXmθ$E 8 s{?Y)Q*wB)plGߺ]f dV=/k1?׺.})UHYFrG{^ -9Hk"PB^X^Y}7`.ß~1OS$K2zYVX?f<(m@$m{^#cjUBO-A񤐿PͯP_]{LKY$UbEh$1jxuuQ,R "থFKͭ#$ku N0"%y"ĭPZrxo~DEEgaIPBgDM3׺XR"y唋 Y[!V%* F ~ާ^c41:!1ϒfpS"!F-:TIG*VvJXJYU4ʙܢMja >׫y!jfXu''QR~h挪4o#( ={pjSHVWXQclֺd3Z ^"5Ax<+3-c *LЬEk=u-R*V>O< "5M ahBTV`X^cyuY:4e:#BxSrU*\ {;zZZz%)<5pLP1*Ch?}t" Mtc4MM0GNggd_LRIv<{窩 b8p(6#" FBtXuԨi(kc0SY;UIUy'=QRĝv{^Mp 3Q v%uW2V|GPCZߺI,%zѴ5R̞YdOx \$5rT^4+EM%G*-$Qۑ{ ȣq,iV*tTBL3ƀ#ߺHCLsUB&j+$i4ȡ" /Σa{M$&N w jSNCdMM# k^x`cir2SUVREVZXT  j uX=tW%@'ZSU}RћTB8DKN[ T[L ?$֓lʥ/mnOAۘ$J|kZ,j jUxE$-"2qk/H]_bjRJ YiG+*K %D} c 7e[PWdrs'MJΘ3%d0"cv;G&"z|**;p;1 H%i(#eXfЏ#)o~Ssm8UA&:/-E]L0غulTsRi#5G+ǿu՘ir: jP?sj>ޠ0M ׺,Sc \$KPLMR'Bb9<_qʠ2r/{U%fq$M^B `2<=u8Uev"i݉Mƕ${^3;:/i~3$` b'vlpEcf{R8C.]oWӏ~Gjʀ%$M2+Fn<{^5tKSd+-5׺{8E_ߺXu~{ߺ^׽uHc~9׺[tRtۏ~aHW^׺u{0HU?Rm~8!IC?KI%^lx(wk_I ]^hPS;0rWդ6ߺYhye ,U#:۟tOO4/z1O{bCtnb$BY3]܄23*r=tlm%dQuC+aGl0:={ϣ 62N3FP!*8;L%dZ,? y#߆z+t/ár(&O"JX]b:yC [ߺν3n<2 USH+jɩH+\k{nɡ2EB¹ڞdxHD7S($.r9~g^uJE.58>04>I޿._W[5[rB53X r/}{~׺u{J_Iqx"׺-+(-cs%|ihzzߙVsf6_US}UK+:$Uv⯬ >{v*gP0qkf|qY^] 2FM4IU.ņ)={=7b[#xeWg 2;^*ÌعVZZsU*UO"$ :ǡN][nƟEVnKXY$Tm5>BlV//AOL$E,0Qy]#Z6o~].M!ih%[V B(IcS%T3B6@R^fJU%FԄv 1[{C,l#x8F6)R([{׺j1Qh jjS`X{cbjj)YfAupFbN!UX{^۾:wüo IOLiWyBXAդ^7m/0L1zD⎡4 蚭@͢1_{u xgJ 1߃<~QMEEM(C1I}ie.mEs?O~*QHe2:xkO_{;{U4$,_C4!>zu6w5<q6A(d B@<\{}Mh3Q,*2:,q .ұ?ܵN,}uj8 j ST*:RU׺\ńH2 %ᤩC<%[يG2H{JJzZi7iޞI%!=,f҇U~{+%HBiB.`K+HROX{^COP*ȱʱHv5Yn,$TX \{^,r)SYI#"%e*toRݴGu ,K=[WwVHՐ6^鞧IHMy4% P>!Ax'PLuFDGyh)RX&G|& olOukSC[ A-E2I9huL +)!p=uzZ i4z6jx7*AԺE׺B!ԩU5/yg#=FD6+Q#q׺ j)#]Qe,RƢP+P_1@R"6b5uIP))mDfĺ ţ9LT׺#ar;ʔ@<)DQGi̋n@!pxߺK<~; J)<5+'$Y#RXw>ߺЃC-m[ӴM7+K:iI p^zBÉwGV/$4 Ҡ2Eoh[o~DA]jJIecf}E姣EԲId)=ꟷ~YNK.O!f7Vs*(Jkqow-^-5>1@(/P,J'Mv?~{ߺG/>m~P-Ҕ[b|nL{o(;;-&}%11oVfԾ[)}WEM|M3v^&em_^3 Uୂ)|:]UIA#ϭ5X_ɶg2=+rtq->&LlLcI"oNC[x>}e: "jJk|0 ۻGxwoajuȭ[ zqm.SlNAO6B(r'Ɯ+ց.KOB0Uu5T)Ҧd,r)ڠ M۟~} #7\p$98#"׺+y:#c_'VI WK,-~=tfVGD2jw㘰`>I׺xyrt DX KLhPѬ8UB4A1l~9NtT {tƢFZ:*EEA}!EUPPON4r{nJiTTnZ9i+PA eZ8n#U9${t EqeɱU4&fz9#q:nhfu{zik+cvi-z 4\1~T7z͉5tL68l|G:c}J͐2SRcЅ$-wT/fq [=PpR2+PztuJ$ $>VK!᫗)=EG$rUΆ>"wߨ~UTQM? {^@`33 :Zޯ[~H31Pl~S׺vbCX]L[Q,P {/{j`_H  f%Hm{Ni*H)nݴ $94* O J4@dw$P.~LYVbĒT(,8&~pG&7YR4xs"^ ׺$}u~{ߺ^׿}}u~{ߺN4 %okrn{e(#utIpn~~w׺$2iT7b38hUuI$),{ ^_~EǽbI$qJG'2 9/w ={zJ*U^7E )҇ʑkz׺vcMyXP"mPcE;j'k׺\c&:I(E3:!zKƉ(R˨ߺJEijV^eȫ\+E32JHԠbl>{QURA~ƶ9t(Q$!{FH?Ks{L 2 FX='Qa 02d 󬬾ɿ8,e^P"=D2 oR* +j ^ EKSBcaxQ!VYIf7~4a2TK- $ xu[y%$Y@n?~2KMO,Sć@F Bu7Ѧp=t5ՕRi%Gɷu% ؕ';DU#( MW{ihf$UDJ7I>^$YoRĊǂ{^7H ]g&ErȮix pOuK ,tXVu?UR& !HC ~BzJ*A81S >X#ǿuyD"f:BOP?j2Od$(tq{4,KA5JdQG$94uM"Y"!#[{6j) B)RH詤B6*g(/0{tWQitJjx$M4Tt}}LP,(O׺Br)+ 9ChQM3骢AGQL׏̡u{p5UR6Efi#ה<^z?aLt)=ZjY VݣQA+(Kβ;i!tOWFH$f8$XQFh5ESKfdiȧZDRRC/TXVk ~:kWVc`s4VD)r(y)1K鍌("'{TaP%2Qj+"..Hkx(eHkAߺ_eu"xH6217J>׺lGZCqMY,x׺̒ku9?K}^C,uy ׺g3܃BI,5>HT~}toz\zxPE rK'yu;GT0#Hd>Ԟ5_?~#rH%b rl?a[ߺLт JU`ߺK,%2P !D?Z ׺EᥩuLdP@6~7f7kma=u׿u{{^O~{ߺ^׽u~eH~O_ߺJ"@4`X0`I#HAӕu؊Zu G#Lҙ'UJީk^ޕ ^:ՒUE#v)"/Qk36+~׺H,tB$P ~.G}tUg` 3Qvb~6;n81qx RGO +$=xgzL+d2J:*f5MB!zzXTw>81H[{=m!lMՙqFőuA_i;hƋ7~a0}j.7#W:=΃LYNO1wwgwݔ[ciTn~PTMGukoek3|DHiZp^IՏzgO?#a{?fm -_w6ڥ; 6)0݋cM#MQ9qSRSlýHn]F*-q~XV"i&m jc~ۆՓ5TeY(NJ{^~ԩhj3#:]!%,t<^1nON'#<*6 #iu,A1k7׺{nl?E9j`Vi Pd\CV;)bگaߺ[u>V*UX[d]V>?}t<5T❼~Y׺%׺,)S>C,sL28Y'~/{| 5<$?o2jW8&Ӟ=u9觟׺XdXJ~XeF0qHk4Jm>׺$ fdYJH.PcBo?A{RVy^E! 4TxĆ]]^?U'H)8bgp9c,Q؀ m}t4T8gW>mbŕ,rL}ڏ1jj%wY)'Fq= aKG{hr`;X=u<c-&$0 >F_Y'p8>׺׺;r}ZA S?=u=;(V`Yn_HS׺$k$l.=J:X~[TQ1F3% J I"ğ{H?K *`Iu%nYIߺAFF˕ tR'W׺NIO%4fDV ׺/-90I$B*I A ߺ]23ͨ5j׺kߺO241 B[O>׺u0#ZP6X>׺ta"HϿuҙbPҟ/9`{դ1rZQF?GuqQ 8.ŤL[ԦY؝??~0﷊zcKk m#FbILY;ɶ| Vwhao׿Ͽu)`|t3b:Y_C<o6{^fػcLIPht ek'׿>srؽ̳7V45R-[Ƶ5ҥ4mRO,j'&" f0)ӣzosp0֏4ƛ1GRRZØWת}٦ ,%ލ)֪:.e6Vou`art gpѤB]WROPӇ^4A]|&yǠlj8*2CHQWR8$YTcׯyhIPW7Z:şmP7[=+hv֦|G3= +j}-oTRJuO_;F[g;[wK;z(dln͍mzabr;_U1],T 'z*)q:w&ο LoNãIOb_`mr529=5яq:c?Wͺ;>>"76 ̓xmJLlٳ:+aPk #Rֆj3{% &;wݟnz܂"gUQ|DSeP{>d=w)񽓞]1 Pc{eW6+7 ep1MOU&VIuL{:: MS&apq_b܃[stӦg 5LŁpAW4귨UיBo~h:M1Ͷ#.#!QU}9[|ԋ-2HST㞵A)?Or Yx\5 va4R '|lM,~9O׺-CgrB}XC IP$\D-C#*ďP{^ SVk^A䭣 SORqM8SY \h[3{& #XqIU }1*+diG򵦉7_ߺJHmh)U:quSQ~6,M-P`Yg_׺UTj%ҮHXH7F^3ec{uTgHfVRRfb }=uS4t xY'v[58t˨ bJ~{^,=T)#^h3J2(ҨĨA/NQHREKJtB J֥ߺMU53H2 &EEXXs][{eDyh?CYZ B̍p__ߺL`ZzXi# K1,4;Pj$[uNcE hRV(Mqr?2m[R{<ԲU9`J|VGD\43IQT!]a)I q{6˓..q1SQ7j)èy,Q6mLD;bch䫮 ?m;I$u'Tn6^7j4Q&(PN*ZWyK^'Y9+M+1钚`jx#^T/2h i\@M5>BjILTrM_Q#41AN21 6Oek_=Zx`T0ɐr׺q* F~a:l"@G" }tϠڴ͔\wLKUU$NZ:*j|Ue8ݙ"D0 DJuzfsda6^V\A%#+fO/T|jML ,-!gr]jAw8ANMg+i0զjM5u8ef C_Fc۽ٛ#m8=>~B1#Gz9&Ivn8SW}7 1[KlmmJ}[K+۸uymSaڦGAqtݹO`˽So]x~׺?Op^9"*j)D! 9>׺{621کQ܉*-׺`Թ$2?'[2 2@Ñ~,1MFfq Na$q0TֿߺR+$o&K\1&+(@-kH:sGSC4V2QS5 :ʶ  9uv#+VUVJ㫎6x&喞MK[@׺5Q"(GQH8I?܈CvN7>׺PSFVVa#ԴүYUy84b@q{5TzEgH/pfI׺.S*4'Uv Hxmm;굴zcW@oM)mGdc׺X(yDBL֝dYkHR{ߺXjI_cu w1m*usj+ o"]ՙ0c?N}tg)U) $($OLtUAQQ[,CU7gq5$_$$rE,Ji$ nߺ@>(:UȤVb4+Y$iR#M85-*SQM3_[O-.>}T8Z)YbfumZI@Łj GBV$$*-:P *f2Xq]\Y*n5³ M SbZ}VF"I< U I^o*r8OJIչe(QwYIjHEYv"0o~Twa[pf1oն+rt5sP=zDYtcY x2>~=׺*qgk2S=oaջh B}tj4̘ʮPA^l׷u K cbHQk~O~qbGn,rO{^ځСn9*zy'=u#h 4Zȧ6A O~G?I,ctEq{:EA`DaOCnVߧ{^$ 5S ~:{_~pG J*U's{rӲ3Ge,v 7ߺ\Hޙ`1# 5ŀHa+\yY>*WAWHRyM/$~>׺sxYTEvMvۻ1Vrxs~!0m`Y^2}C~Dƥ5;P'8 V2n?uL6y>_׺ߺ^d[{ ~GSߺ^^[׭?{^lՍS{ tנWh>ד{DKi!h+;7QV[{#9"_/]1ƫ`UKnn50{^yHE\+GQeeBcK,7i^Pk* [h(o"Zsu'ŊIhdiN (øy%M`+hȽ׺KL)%^-eO12 #܀@cf*;cIܐߺBӬH: DKQL@fH]{ӡj_Ls@4љHRZ2E iuPTjHbFϯtTpdTxAMi#\LIAptZ-xYC^#Kz2rK3PXmv.l2C DEW@W]k9~u*=ɶ <)./pJ1t`kSSԲJ[[Y80i׏Go`ޤ翼FZ\M}],Q&i^LU`1L,F'm 4_?.\?|%um뽩tv_Htlyjĺbu׸u%ۻzI *زx)iIeʤ$I=VWňyd:w^КU-+ip =SA|{gjTdJ)qPFjyC{׳JWX#Ju}=T{ 6S+dXkxQlTTa0Y[/J*jl f0K5[OMIχatxd̯)﷏^>RUOEJꌕ%& R&jv-G’ɍgӐ*[{[SnjU1UQ+^Y`ޚ,pRQ%moϿuR9^GU!PQ 7cX?J7׺32E:Av3G(ݜtM~xR!G+#'ߺN4,5(L&,٣i5a)+Ar/^t~פ+Un\ *a-k>׺٣ȹ.'zhzƊBXF3Ib}ud)rj"!Y ͚ĠߺV#`Z_YT-P]I=u;%U8"rb ڗʂ[ߺE1g()#XHXFtI7[~%PT]DJ"O\I#]*fo G~56Wde|ȳ3d4( C= &׺{yj`q5. M*U&RA<}< {^#Kk ĉVRN7ߺS+4kiHudsC\AߺNQ&jKU2EEifEeҪn׺%DR4TEQFc&pu"ld{8fW5eHD.V3>ߺB*H厕Z" 7fS3 9-/{5׺񕐼Q4Ě\k[G?_~) fUUL.B r u_{37#T#4NdtRDNmi>׺@ `q@҂&ߺP窨2"YLl1df_F[{K!$s)3Q >7{^jF)Vi(TdV1ay,uyc49^mN"|q-Mt%gSH+y楤P1VHE4*rY}tI5SjU,IB WBa" \}t!jLy*I+dVha!n>׺=$UUڒv'$i)$V u*W>Fi*#z1r)ܙLMLcxe/!eQ}=tώFRA%+j_VT!VE[!~ةD/M$FWJT<:H)!>Il{pM*,y o8**ڵ^:Le<(iDG.{[5_>8R"&:I<1㹑ˆ*UI!SߺHύ\4'_!44D;$%)e.FNoEC$6*c㦞)^3IdkT_,mJ1yjҳ ]o{ Sܛõqefn:x[G?YW&6Vujqynѣi83+rFG]4Lgoʉ0q{ zxA(dP,=׺'f|a")~_GQ;RZ<> Rj\1?_96PJ- KrXד{Aw(8#8'W^#_leԞovsϿuvr]jn.>sϿuJW]!NKnI_{^뎫f[FX/ 1_ߺ]eGҦe7 ܩ_׺ŵ޲ί܆7m$\O{R,/~}%J\fߺXeq;<1 RK/,GuCD4spLOIңuKkSژUX܆*H^׬4nJua[~3K!RJCAmk^9 ]x/{`Xt/ lQĄX؟ QsRTN׺ 39SNX_^1_?Ǐ~v;O~p׽u~JiVN{^EU+R~ܑܠM6 ?u_a>׺{{^3Yv OX ׺ZReT+=lu>uEG,aeQ>uꏒ4Zҷ dJKdR Q$jY6׺RIlUI*BOKvUFʐl ä~ \ymOܒ"ꣅ+v׺c"^-@,,)%c%t+0@}$J9hG<SnB~ߩ:z2[ $e)XEUPRo{/s;h^vQzxHRHUPs]kUK:*(%dHJ#Luq'\s}=Ao㧂ŅHjH9) "4ծ2"F.OZt%isϕUW( H IHH[,Q0^~|zr-EO7CY 5[+bTsQ =:.l `޸Ҽzћ뺜E>s%[QqU%Pw$Zb>z]3iT&CaAtlвʵlZ8#۵f+ b J)TFW(,߫Q<1gpù2 m&^9 X AcDb2M(QoJut:\2Vݤ|Kǃ˭dUV3OMUU,NT֢#'|$u~ݣe2\gbDžGVWF:̕iRg}ssx\6R, Cf+\T'z̕&bR3=->0=U "eYhdbRZ,Z!U䡍qUu4cGBaz ֜P`䍳 cf#-|.̾cI 8#?iP_%-]=$HRVtn"=_#׼BnnFgJ|IGK83@6ӆ.Xk6xt\mUKj BBcˡXF׺+ASDROX](xbxa͇uFA9%Xo:CO'>^TG3j U֠Mʟ?}tȄѬ0TB TվS IZbM,%.U׺rjqkWWőExTrUi`f I{jQe䔽H-un׺5d䩙 ʡUbN@HuO9Xαdi$iR8 dU(6=u2dgocBdi׺fWGt 檪UgdwZifJ,QaPu"/#OQT% CSRTJP1@>vߺI<@TO&:I*cXƊtWXr=t$#4rGMZ~ڳuYl=׺C芎jX")MC,ՙ&gxTTc>.׺Etu2 4pԲԱ:o-_GV߷}Y$}׺ ZԠjPruVS?JuxQ#G#~ZX%eG!UPV$$TtT1S,xdWb _~%+F<=nctX4I#c>bh"ݑʋ^5 5FR*)g|xȲE D}SdqSdb u\~m*ڬTJOU.=kSSN(j LlȲcuFfhܽ^KZ qT-TYgi! ltS ;pc01{u^q9-k srϑ,t}CV&ZMٷ[]DeU (pS{^>C<&WME>͐M߃+Օc)׌iTS/׺']AU>HTA%=^.(A$.6HYCA^*ٝ *,M"{^) ǫk>DjŔٛlÂ{p`ce#5?^|R=-o{ H % A$Y}m=uV}L X5tPP{^ l5 ˢ6a{rB\rY~K1ԇe~p,fM\$i`7?ߺ]`H0T6 Imr^B:iCarE~Hm<9$*P7,ZLzlAk9>׺pF hdYnKZn/A{ Ԥc,Q!}t3r4o{ˉ1HBFmoϿum^2B$iqw$O<^1uf:@$@.{^::to'ߺ],"Bҳp7Ӳ̉]NԲbAqp~e,n>@Zpt(ZI% ,LSk?&ADvW#]Hkۏ~0J`VG{~׺uE#E"ȿU7a#ЉIgX+seC]<}Oup$Ll%XgoN_C(~ߺKs--[҄ĦTcZ8 -(]F~E+L<(4~x$YV4;3]GcD@Si7ߺRZ.#)IvA)C#E. ⾥˯tHFQi3 x{ N^׫qPy%@uQ1$C=O#{TX1~#zx|1~׿.%CFLDhUʸu& ޑW~:K\<{UAM;72Ia:)PE~\׾]؜%}CR,1WiXx6 u>-^0G<1Sy*SM$QSP%A!"W/vCW[G*6 OMS P˹M)I4 (zeO/ $z.ń~WײpFadT\JW6/)N*jʶYBِ?sKc*Sds(#Q)4QZ_%X)ުV_(@Yx 0mC6c5$MI-\Eъk&Y#;Q 0uE<1STɤ쓏^5[oh=T:]VsIs{णIW,:gD3zF׼с[Xd69Sa9V+nIm׉%P2OK</}z.$4;*}͹jU9])ZHTtB&~:uY#nUSO^SRS j9CUU$k7 YRXˢ MOv}}NBnjC6P5{G9UkӤM=LF :ثK?O\7>3lULhZx/8MV ~~VQ%$gU%A ӤIU=ZJSD|Hj[ߺC% ꊉ`2A EJ-(bHl ]6^IM ei*V63t6 \~1TE|sD1b!Iij@G: }}uR ANB=-]cuAB:a(`7hMsM$ZuTEMUԩLUk#{ԛ,}5lTO_WN$4xbjGxɿ"E׺A M$p=TMS &o}/{;19`z xLBѴ  b}uFIruuL&bc5$0&ȌO'ud¹(. ZjzOUuvidP ԬV n,Ou#(SBʌT=4L`9ը^9DW5 ZȦ<+ ejZF5F}/6u*dz*2u rg}ѭ6=hLoᚷµ:3)V (=׺A]H9ܬux|tV!SKzZJWVy !u7x.>L}2bqY*z-U-sG< $ֶ^gwœ@Ѯ"24x()U׺Z^rXI_G}O׺@/eu b _ߺ^AR[A'Bm ~dG+i䒡[I[ߺ]#\:r4q³Ԁ-{ EP)kt~7!~_~u2]ՖMw %PXWߺ]XzupXOߺ\P{nYIF`Gu3/cl[Ř aS/Y?-u.+ UR@`Z> ^Tj Dqr/H j{J@V2px٘jyi1AX _{6RC- ԁ׺MY3"C2 Ki.d#ߺSkO#KNH֛$eitO~=uZ(C'*X XI{.?S{LT▣9QhDePf<oɿ7V:H Qkk` LbYϫi?B efgNt܋H{L<ǁ~ߺQu~{ߺJ \q;1~`Ğ .nMt#c`@`HgpD,HݢV&[ߺK,Bq4L* 1SVyQkŽt9)c?Mzx <4 tԼyy ̯%?ߩƣ~YC`I>bĄ<1Њ2hcA4 N"_~$QP%Z{^5iBӳJSp|JRnT9>׺0xJ#x:4RdT(NJKJ0>?ϯ~}]O@JIL*׬:y1ԥI[Kij]DU&2oU1OWUBP(h(4IEK{~]x`6IiɔP_b*LI&4P?E7Q!}>yL`MZѮZ EMv*JӴ*ri$T=JP; 㢯4F '&g2SÈv+dٻvQqu۫vLSh*30϶2F6(&F)6@ˡ[ka29k#o<9$5-fgÍ3OWׇ ;sl[=MSUKKrh1RKz!)VP4K߿ׅ>+CNՙ\*Rf$HΩH$Tq ZV媫U9fXTrb榞R8**e HŽ^׿>-{GX؝RX*F8YAe P!6>׺,PTc7LLcĔkFdH܁=XKڼ H#YfP[EL$rBJC!7,ok}-ӌV;B0EQL5.]L*qbquRO5lLBiaXU)H&0 9b`Nԭ'~*#A M FšO"`#j$rd0>)k zjiI3IT~PjBJE=tn1%-6>)4#Y+5R/nBR=uΗ6GKHG1 XB+AGcbUE=t>`^Z<@*%c9% z Q $^+{_u5EPSc(]izCNWZz]~(qT45dj25ks4eS2I*.cn=u@վD٬" M_9鄱gYew*o0}t|'*$ZI:Ԗ-sEHBS-ߺB#vڨUM3d&Ij1u5$ʷ8=:0"׺~J%=4P, WQkzwXT`dPyu?ēH(S!cު:JI1a4t&R X~c?aQ5UZזxrSI=J;XS+i-ߺJxY lUs[LFhq=%4 {_ߺXfwщYy|iWH"R(!y%EX~h%K)p]9x$W$SI_+ǎ9UtTjl-wzO:\7 U_c >FX22ԮU4Tt4DY0)o~Xi_S$UyGsq<OAJKH%9IT.,<]ͼI1c!G[c7dUQǏOWv2Vvr/ѽ׺y·)+]X,~_1aQ۸JYfVEjO9c-=-K QY1{;;AGv Lɔ榇5tox# luJ٧m.d5s/ET"&UZj J7=׺LCߛ#qa їJQSЯ:Q+ Tew,Ϻ_ 582[A Si~Mujfvѧ,IDߋ~dஙZڏ(>׺Ap PzeWFߺYk1RĂX$ >׺8 @A"E׺#?!B`ʠ^3!U48 t$G[ߺ^)]M!?׺-16~c{LEH([O>׺[YtX:o/m9$by [:/{,LzŭdP7Jtu& J"){iKVEA `@e_t9NZk:ChM=<.=LZnM׺vZh!Y 1IbdRڍYZ$iWDDG?׺GM",a΢ͣI<9׺kaDӰ+IQ<9_-A6H,sԨ ZXQro{ԣZzbiH$ #^6U0ƢIJ٘q{^;KrA׺P }uߺ^8ݣtm]n.5)6=t$jC2i#Y9uoU%t(իdiDB4eT>U${^BWZWxb#$D" ]2Ho>;iTKM4U'ad0 S6iYL_{]HX<=T,E9dT׺Bg0-8THv$-2]i˳U+3~҆XE׺A4ԭ*$qkB N%FJZw@j%Z߱׺{8㩝`1"%eD0몀DFBoDWU"߸u=My:ԈKKiвL)F:GFVQ$t#R)X$Si䨫IԼxqtkd}z v9)kCOPhT/R=?#<Ǥ^><,!xi֬5QQQ[44SBy6Ӊ⪨ȉ!ZuGFnebj+ւkWqE]Mo 3O:K:i2"^tYU] ڸA+1ec ')4iAQ EGV::XR"%O7)5 ^1ht3AW_Qm1ܲW۞c˞VT"IE I DxtyqY,F.ddojmtɍoVo ,tix@F}J}{S;\I)$y=l4E0@'VҬ5s S,aDz.̼ *ll&!RGIzpXȍDD) /r4JLbҙq?W39Cy`:ׇIlc6ĩSCOU,x:G$POAZlPд4#1J >oKt)#yie^J"vD01XUFb!ˬd{tBwZ' YKTkSP=IE~*Fv' P,tR3R:u`&S$~CT$kߺH$2(Y_҈0CŤݙ$'Ćo6o%*?`KqmD{^;#锈;ŶC-"׺6U<&1"1S#ʠ *)un {bff+,=51,ijQЍ;H24Ǻ[p|.4غ)`ҞZ`&jWDhY-uy[2HEODro#(s #r}׺4L]Fu[UZtU/Rҵ<16bdW;MbOPS_K tDw2d j%i ++hO"Iw!t>mo~7*ӪOY 0$qQ5TIZ+uZߺB5^1JD#/'j=\AߺA- qGT*$a BZ'R:iErUQGF$X2?nTEPY-׺na)i3q}_%sF|1$L,.@CH u۳)V u`z^wsNZhjD0Hm&V?H[xc1&1IW:):ܓKEL"3f ǺA^ICLy}ɂj^Ic& WAi h7RPڣ "H5uUX8:hc0Pj7V8hѵĖ{j|R⫥Qa"I U2CA`|z /^׺ݕ.C54QJZygh!z_{+YYZ7zoрdY!w7رzcUdYe}E/Qdc{e.Tpbg KlNxhU($ij+R{^Q>D?1GZ)ƲI%dXX FtK89 Y@j=-S4ReV "=u U81U&+%evzu KM $Ck^閼֙$*URk @R(zzJsW%<T"Ƭډ^BiaSj XgHH^&xh0YmӼ})քJSBD-Urku+P~PkZx{ P5"kUŁ#~e 1#fqv^{^lс` h7ߺ^P!_:Es?׺vkh[J +zy7-Xa}}uiPIg6GP<ϿuBi@qv r}Gu22"1 lO a~xW[ )k]<&G_ !G-[ߺ\KT]*5{XYM* d -ro׺*yUec7^Ge J rpߺX$R@cxO׺&GN"ֻM~c&P9@e(TLֱE?m{x%7}soߺQBʨanKZ^PFKYt"MͿ{^麶{bI ]IUh"$-lQxD@=-ۑ{ס3h'fC [5 4Ҵqt=r^sLgߺμB&\i>C;2D^ghi95Y_ޝxi:ޏEWU$u Lp,_ ƥeU;b xDzvj % <}^~F%ʘ sOP4$xHQTeJ\rl$9 Eׯ`qud-G0g-7ĔI]ǍZ*<3":RHS#\:>}EuZ|_pdgiS/r͎;dbQW+L_ݸ\S M]UVl󛚷]Oag*N[)i)B]a'^׏ӂlqkE+S;⫱j:m^;AO;4fxdjj2O E ;jxw<8vb#6ٙ 2uw1GNȺabߺU0H[w)+SMlUDYc!dWE,Ӫcb[{(uBM<,S)(ڶpc@{\!$}tE<V/(y#b$*B_?Co~&2I3\bѨr7<{^3SLBnYVFsI*$Y%0,?`}7'{љ1 xYĴJtS'ϿuP_{nS4RM (HBRC ȍۂ׺ڣmN禂&*ʺHFP҇RK`J4^ڭ`Jhu?s5%Ib }?>׺Fg#qQ% &~ߺD}m%#FKFFa*ZV+zG@{)Zԉ8q"3c Ԁ(I>G[gZ㌅9-+*X(Sk}uVd1:TU"CdR#ki mo~1SX!j9Hh)hΐW-{EVK/V]S!@P2ER"cHo j݀׺XbTWGO-$ӷYDBJm`C'&{^)2t \s%RԼsHGe cU/{ĬspUyXfVFLu Y UDlBy#{u6|:v@KMM%\, /ONк酂i\^n {1 .V1u$4T4}tulD4z8i4'ߺK3~2j`{G5F=YhE7˙XT|יKFH-ɳd#zyi"TSjEbY tcEj?xigOڊ4ҷT4GuM,hLMW=VGz cL~05.&O(j8d [ߺFlv}lxjtfᠮY!jhr0 8]KQIK@>(26Y>7"¡l0 QVE(+"M׺zb/zԥ@i*X<3{R4XmJC~)rPTQQ@ٚ**A*JiFإeTtKǫN~1PgJyO VTS(hO#{d_.*z̜xM%M3Q~M灠 #HԔ&a#xapߺXv6*%%SYS׺ ZA͙kH {E$ 8k u#zMs{?[{k:KF$8?S>׺ˠeXR?Iߺ\\ $6q{b:V%{ ^4WKT@Hw}-k3~I }>׺4bhT<.}u&bFuϩ6cuewbL sm@8u/\,IdQ{h՗o>׺ҝ_޵T y7'u;y[T z\6~tMz/S*ߺXYdk+:q[zuߺX-Y`.ǂA!XF^ $wH\-ž{O&Ҿ"X\5 oׁ 7WXV{#%Z׺ [V>ZGuT TV_U^骣ȪG$2T/ &uy3ŚF_ߺMučk`lrO{^!3,qc Ϳ^׺nk^[ߺ\=u~{ߺBɊب<'cཇ ׺)OTm,s+rHd0KD H'9^QKD/%4N $ VC_;;g,=%Qe`u͖ziJGH)U55]Yzx Y2L{XQ&FES=$ !YOߺq҆ 3U\|MSSGa*!D(#R)))*$(I)5 1E%t5dƥi,ӭIkFYJ׫_b**i28+h6;K r]r#GKMe\u]zf+dȐqRqK)Ƶ2W~:ϣ;qM%DzpARh1+1V*%_Ij a弲mZ)୯G WPyJ )5>zzcAA,TTy)C82t?Cvᭂ@2T{5?dל1y2;Coⵔ,,׺#ۿh@62uOH\lHe"zj:9O}ܔQdPHG1"iVsDmIo*1 ?O>׺nOVEHʯ:kt_xЉ4ej=$gPd[TFFFdFEPjDUԒKH :MuŽI(j(Dzf%)A7#ߺVUNVP 4T9$oo~:I4`(o{^!{>*GH|0:3Dr׺weju!djy#p,uMtƔG ,JUFK3W0Ŗ^+ݛFJSi L^J*VPmKnHC{<#,T)_>LҖS("~?u jbi,6 LPd=tD: ԰i`MbH{^o_I10(2UY%bHT"h _ߺEr,nZz ~a5Uyʬ,/)T_$%icuTf ltsŎ/i֮YI,1RRn=tydc(L9\MUrI59\jY?K5R`;Ci#䤏#[S{ɏ^EYϑ́52׺GSo2 |Oc㢥5x2,l *K1E{terX>F )e92WIYMMB&TRT,)^ʶzjLKQVˉ-4&Jk$yM#KF]QCj,3 Y KUGѵ4JQ%@mj?N 3ӼV*L8 :=S չu0®{tZ|=~6DL,ܲ:핖16;)u~)1 LXʺeJh_-_#S56T DZ^ڙڴOCK*SridH4T U߻lC붶[#u59MÕn8B`03q=M=Y 5׺*Ϲwb`SSGpKTIEAO- f z*x}Bx}q' ䷺USŝыzdUщx㫃pϷȱO)w%#JX?-n׺}6o֬ jqbCIf}uL:=ÀU}HV{c[\#H'>׺GHwseb?Ou], ikU؂Xpx< JA }{^/?ok_~x׺ *"?uUUtG~~yYI/ESs6uH$]> aHnC lxlt]'@פU֬PdoKO{^ʺUvWX QX=t_E&PkߒnmΟߺHd$m#_.>O}tIYܱnI$o~.?}uIr[/?ߺP'Q׺}'{>׺u{_UNc.ܘΡH$Iǿu%RRu/ObD 1Bv<*Uu ye)9k$H'41O $4JJ=N@{^U۹~ &DK_|35QrI%L$pK,hC=׺;)6+)) KOF(VY4SKMP*ƕS.V(Tuzu\U+bdoTT0S tUK E0DR ,J>9PᩢA$%AJ!1VW-TVE $Ŭ/ZbJ<Szj2")xicZir+$V_ujz<5cNQ5v> U Ni+qKf[˥׺rq Zarn1Bkv3c#e3, 6!ZyzfZlx\rczJ*x+Kc*& 5 Ѯ f18q[1Tǹ~iڞzZ"vj'iy%F#aҺ}qg'L<54Y(OT9pF T0RR$DLY׺Xͼv⡮$uJ ,54 OZ R)+eQ‚ I'U P=׺rN,N1Bo~CF g}Et~O^Pt!jBcyR@,{jNHߺCEWj01衪sO$." 4?uTT B$T vs2^Iedi/)%q5%"R8CXSGjMr}PU:HɿuON+i喞IkjbVYE!B} Z刹~;iSVCM)!BZ;jjP UؒuޣYJMvӯ?pQCVjd'S.J'M P ]T~0e mIR jgDz4׺ZUOZ95MZiumM =tIG@%}EiF U.e:}txܽlUM A>׺-$'>*|qW9`J-BZ*چbeY%t{Qڽwđ_fy*dQ3~"S&hQ)9^nvC OG룪f OJ,I.f-qe,J^%-J,tl^U)uj,4 h,*uv1G䷆-`LE^(Do5U)d^2&1!K>63)(h"}Zh,jj 4T9-F&u ܼXqt}3u5RFH$5SKΤ2*=taqYJk[©OEHhciY%ApXtbv{#UQ)#jZԦ8JYޠ{^@'o(yr$OѢWHLR㤎ANBf^GjlUdbc1[CAS.n }LRlLRX# >HM%}F&\N1Y ԋ-JI36E|nB%xji&9#hِ*}׺Rf:wQUң᮫Ds5% jŤwCj0}׺+|6swmc0IlD8*lD+rO[Uҭ\NjMG0Ԏ^b|#h;cx୓Э#G&2JgYeuY];\lY`yO;nc6j KK]"hjK5e\بw{Z6ӨXSbxm׺,L` kpǿu 9lF.nCq+qߺXb?ZC\[M@{~~t ΢5b6׺׺N! y$i&O#u$\"o{H<)ܩ~s{X?"~``/ǐI?~{ߺ^`؃?폿uݻ4<* (P vvtEhi![~׺6N)$)!AQ2.hvWXFok{t+CXJNF_BhiUX1VKRP;֥40 w{t`6AME1fr)=U/ԢUP`h6EdC~#2xڊmve[do?_O~ʥ!$_Bj׺+hPSb1lj KGKg)ӈft+w68jQ.w-ZPIMSvL+>㒡#U1HB^B~F Vc&ERmi|M]6i#SM5xٌ֩TAEDj~/1O²C]A.W.&M02O,5Ҳƴ4d׺oUIO1)x9qdkQP#T1g߻yѹ=,aI~ kwTj,U5^ ]}4QbkA fuY^bfWQrE׺"5QM+)15DS$dlP"GPOue r*,E5ܡJ`ijGA3d}-׺&5L{ik,5x|%% ueLBȟwQQN)U/;M~W'cmIȥ.^Day(ked3VF'x)|K4MTIbc&ߴjM)Wi GU~*iki` @LoX]-, دuK]#U^LQ!AO(bU5i؋ࣥE4{3-{׺ 0TKQR`5!Jjx(rұ)S_~x5EhJu"ͤ;L)K(>׺w/TXl+RѢҼβQHҋG|U~ˡϰf\Vbۧ%ʹq{^3X}?9#ߺ\/<M6^?O~b"M{^뇿u{{^u>7$G-NtB>X{ i$y8F8C, Oum]NM~I&H2N-aTP]TUo{YMK'OAQI oK , T ?b֚aahUOu\-ҌPOSNԒW92" :JJ#>y\G X|̙ J'Z6zzjlC6/!+rYr$tRDMKCtG0؜n.%&O ZMWZY)jdAtYHgastXX#sCl:hivViż?އu-<N>jebo &k(3mʥCSBYdBeyĞ {tɵjB⥢U=]NsbKB+-e#)UE-JcS]ᓅMDks{udQQ6dk|IidYXco *׺+j18h"J5׺ :BGNTC;+ȰP{M{-KSE0yDtbUKA$, ='-{$x+6jYѾjiEPco~rzS<Ʀ4K7%?Q{eEڋh`XqC^aRYUBуm ~;%S38. ZxifhQTƣIrE> >W&2j̻,XFP5hu.GoKrdI=dlSˎlĴEVffU肎PH _u9cT#|Rr0TǷJVחI-O5]^rJjLF|a垾1RW0d*̓ K$ҥ5^r=I[*){c|ZljcneT S }E1Q]iшZȷ^v,^1ym也TRCUvSs,s8j0oc]V^nʾ8jhsXA4,}n/&TQqx稡%E\<;R(^yvF/l1gYF%FөhUQE[)Y$Sz߽=x&ƈ18ڕsdhj2Sbꡩ5d*h#ǤlYH{tƎqGĸV1XMFrsGq"򠼴:-Z E׺,nL6Sqչ}̌E6. +0qA$tۦZ1OKͱ;%7 {ǝMۜBS O mIҤNc }ub Pj=@j'[M9b,RT4BDT$"B^=IAե̱#5<=TRʉ===UtD#pUߺNMX)➚zM1Y*CV<Í 4/x&~׺33YƒoǐU=lD{u0, 5?ilZ|lQɵ7Ҵ8y&)+"'Uۯ-vOLv䊶;/ W44Z7,T!Ïu5&SMUQO]*$Iir&y@zJJM-ƥk{^}KEq-6D*OUxf-T(VX5ƞ=uҿYvRځ+\J܏~׺deE`8B:i<{ (`H15 n8uoc ߺYg[Q}y&^=\VVU ?O׃ҾC׺恈P׸"S׿uQԬ?F-{qu #J7"TO<~yWZ*BՏ{g*"BnŘr.>׺W#&x?K}.8~t]9n#X xCT ,y~>}u J}[>??XBR7 A-ڽĞ,96}u~o{?Ԑ}uH\nO#=uڍ^E~}^~la{\{^ַ7's{Dm ~q׽uڒ22A `}t12RT@I$H dety]oo~ $ICOTG*%;G%@ YL3g#JFnmÒd!k'%MoDO4a%D{ia/]U6B:(Y %&xGJ͋ǵLc%8`jD4PұOujʔUZu5^J+4dxSɆ, iᚂOx*c׺0y* u*bM@1[-F Zkbѷã*JaYV6n^/ptjdpnǍ<=*峙h٫bjXh 4f+'MWASsrqRa,FQi %N2m(HiY띒6"uMmw],149z6ڴ9J*n3I-W :UNRXƩ{oϷU۫)rcd6qE[-ZuxY(´EDz*x]uhcrJ~q[r8zM6b:`:Z\Uq'xWߺFiE3-m KSԯ5t ($i egrƆet(,|=v&I6S`r9.TGAaIiAē3"+u)ۂ :j+*l5T5D4܎9M($G(0{EFߛfTTGWA\2cViI$jgV Z4AP{u&q8ǦJXRrURM / _Iu`\fd'OW>*jM-U3;ʬV@*u7ͳY..$TX4FDBŤ}*h]"XDo)ޚ܃f+`lUN%7W ȭRd6b@{uP^kkj$5i,Qi5ztŤ]llOu|5$$̏&"!`Ţub4z{!Lq$CV$HjF-H{^S,4fZyHn{Xs_GLnJ-FkGj&2U4 DEʃ{1R?>ZO]A=-xQO B* ^U˪đc{wmMtm d1'G%%B~d0-ALvgcqY۵Y% sRRs1y;I_d28ha CyLN_|Woصŷ19m00Q+%i+p541Ib~J.n.clmʭnTU #oAQ kd|fRQTJ*=t[ZZ5v~QVlʘ,-&niy z&_ dM(W{߷gS\jں+c+\f]ڽEn:VO uqݑU0\S5zJQ5}BfX $r &o"o~Zi禩WVW`Yqtk)槗 B墧Y5,q^u8]LgjGY(2sJC^A*K覘FUuGK =.?-BZT,xi ɎMtU5^A@k~{_ 9AK.5V81l<,FHƱ%1fERp`;G2u 콓UФS$9 Hvd慒:a!ŇT/{p v2.gmiʚj-nK'/ZzLHh){tGpV`E'Sg1bvZ ܖO[mWcM6ܕU -Nn%0M4PGDѱ{[K>f*&4~y~IN%Xrxߺ\ɳA 66Iߺ]mlYkЛ}ump%#:N>׺Ǡ__^g-pyߟ~t$M@YF._}u8bT1,I GOO~b:q(`' '-o~x+ X *B\(MF=uԤYFe<,@:G^뀑uHBV!Ƚnm~@צTؒ5(Qv[C~Hm/hYTa>{imJ8'ߺMuYt :t2׺GR j4~2IyIrG#ߺX6Z}Dܭm{#PcHjca7{L,qk~beAߒ.IZ]{{^sr ?~DeG}uXZ{^,х XےߺQobjG q#ȾG~=u~ {vy\\&$~u{{^4Uy{~ږ?^oӶFǕ1Ϣ l.Eq$~VI!T[XCշ34Td#4%0ZRZ,1UeNG׺VIUx)j*(#,2屔@q,E{0'+YHL@>ZQ(H<56ou=^quT}孖uf ;QR%̈'ZVEC-+еsIga+1Hjc7^RFi<{R9obN{t$fsXl]fV u\IhjgϦJU%ccE lgzۆ=׺yGʼnJO7QT5RsD׺jbl3ume2w']G%O4)UѯK9ؖjx ڬa"ȓT)]WF5$!. [sr"44ty܊blUdřzP^xj 3T$TH!t6b"[ҳ"mn=5FY4ULqSg%PyHd$iFfGBҖ\F^%EJUUb4SJ1 H2_ꊈ4_u7VWQ˷DY黶M%~w`)^(rx|qGF9j4"-EZ-uCzd1|iC(05alHSi3RTkj,@fg9 jud2M{C565̢LFTr#:E_~)|Bf[&5T,wMBKn׾~FjY$XX2Y~o{[]O,>vyi$`JTeۓ{+|e5=J[KQ4ʅ#<"j2{ub̛n"y*5TgtD jbH (׺zzzJG(V&Jc{Etn0URILTY!^<rY]Uy*x M?{8D'QAǿuydP({#U_~[&3"y$d})!] ME^lTTU3mdDJ Z(ߺU]f2"KCSEK%dJ$P/ ^;8G%x/JbՕjb#COyH+IvXĖ{cվs MQL5)fB4c*i~)ꪢ`97 }tlGrv^b/,z=-uSGTEu][f)#MQrQ^d65QMS|LѼnZz\ wL.;JR&ZYjTHCv[-͑RQW6_j E@5;b쾽ݹ6x-<5iG{.mK[Gnv{'U1E>GmmG`.\TqAlH^r Mo/0`r۲P`ϵ1z "ې!)+FԱO,RF uު}} Q[i{mA6mU^Mr2o 5}=4?x{c}. V IxS[WB0|69!TKBS22}+reN;{_;8hv]W#>m|魢NnH1ou]'7f2~CUwĚIݐ6`;j[ATyJZz%=DBF=׺M>[3ue6>uX[r4SKr"}[63Vb0l̈Y$K1#r{b|LYݝ1Y(nZb(DzT`O&O 5%-*jYgߺEGnGfٰSm {mMYd+Y=,&:ZNln-ii)y#׺'f)SN2hKʵuVR3%I eM}7n\(^Gj Y5/p}Ou҉K-~׺]H(4i]'[7{E$7j܅@ډdSpB%{̌ jq'P[I ->׺H%q$}]'bEŀ *2$6BX&6-_[?ߺ^#*$knk?o~2drN>9/c[[׺96FhVoFa3S;7k;D,x#ߺCVZkCgj l襠iT1g*bbx^_nhpm&:#_da4U/c!TIYSS? :ɱ˽[5e,nz\Ip"ALp#N,lǺF jfJ`-GN+2TIO04XɈjQZ oRisJUX 9ы5ArHBiğncR|Q^N$wWG_kwxdi i6Y FAjjg||e:ǡ {u}霾f;U WZٜ/d,{^ymyw qGYQOWY]MSkk+ܻryrr$,~PЗw6G1jy08^ MGT4SZ 4LYLCu[R5QYQgkMx(٣>1O$xb9&D!M״+]x-$x u`\-Mf(>Z)):\%1Wg5T Ei^Z+0aTݧch))Y4MQRJu6r5u:amxiSTaMYSw sɘIPRIQQOu_L&Vn~4 peM$5IUW L&FVEh\{tVrsA*rRA@Ա"ya ӤJ6tdxw75LrQf1Z9疡Ýͮs1սe>C(t SWc  :y^{^##M4 Cj3E W A }tOQJ>B j%UMEJ-{:Rd9eDw%q}q~=VUeyVxd`=*:#?>׺z7:&Z2$Lu TR$ rB{ՍF|@I" ,6+}WR=uf5bYZQ⚲dE.:~U[{ZXzdiE<ʦVx9UHzdvycNy׺4[_5_x$"f@GE\ ׺vY',w1ʊzGo~ 1o jUu/$V+#_UkӦW#R>eeD+ *Z~6E-k#-, 7/E>׺!-ETVє%E,C먴24dX[9ּ&>Ga K vUfxJf rR{^{Ϸr92*[/Z1EI}c2XՌJ}FI Z6}vV/JȚ|UcLTO5]Yf_݊dDS3k!c{?xcNOz<;jh!I^ <Uizz،uqu;vlXH[?J=ǐ95rS<#`?V>7YFQ`B)?7UNn;]ۘmECI2n:N?nnTzӎ(&yQ咜{tdnVUU1z ;۲ -^G!&25zߺV7.k+0}״0TLؖ; Q MWU?z3g n=׺5?fvm>n:Yi"ͩrXc ڽJ}׺=f1PMM[SVJZj,L4'{kq{o}px}+oZ|HLc$ N"ID,T;fbM٘&roՁL_m ~NֵN/GWSn5ZNSH훛&ƾ5˱cڔbpJ(5\z_3OR*\]]YQ ^(vbp4UU۰9٬^71ʬלǷw>?p>C9ҺVd=׺{+YwAO *%\M]\UCVhe0YŔk>˒寧゛HFvhI)g=t̢T]$1јӬI+D]?ߺ_wX )&G^?d[[Ju؀n_"7'[~{AUUnuYu2lu7u*)*r_ͯv'Q~b@ıIi}uw[eӠ6-^5C]eVV*muo[H>S6q{ -؝Bʥ_HE~~׺fP1! W {ȧ{^iVC/<kߺ\XBTs]vFߺI@@* 6W Te x{n?,-i׺br :6f{^rIP~ۑu 7$7RU(ok:ypuSU` \~?{^뢗bFy熿aq{.SkX3\\ubMְ ߺQ M&ċ}u 7AZ'oMcqߺQ"uXzum',y{6bEiM_O ߺ]S'{^ 'EHߺQ O?^O>׺{{^][γ EHn.-׺6[W)]bFH]G,LjZB>{{ ,l)iLGȠd1HGN .KϺB>&j<'YN YaDkL1, ey =׺pbt|SGG,ԵRUJ=%E+-L =,F'Yx䑁>׺`B,#ViGW _2gijb? *!Dr;gs㰹LvJ<3K\j%^g7YW,Oa]r#{P#nZ18aI]%\bSK -\0)r܌zGP9i堨S złs}L/Zj4Otgp;h(%|⧡B|T*j >"du%[PD#S}=׺\m Da)O%vQ'Rجa`QuyTD_TFǶ* E\l9l-&zcIY|4!WXʨkt9v}VrUjZ6f6 NgjX('{> "ǼɗEҘu3ސ{t M:5[j1Tu yUQ襎-Aiz y{A^RQeu2av*: c!\Ē+*<řߺDhըs:iW (F\ytPJOMc !u߷U%0F뫧ĵJ4TTMfߺU؊;jEHǑ|H}W>׺Jlʔ0a-=Dhnt#,-/9~3v?sTJy{^)=d5 2ݾ7KGF-{Z}t(GR =o0)4?,ʬ nFU*I6-+)`Ҡ?*k-KxB"9u[N#KSUM4 DV+K h{HB ${M6FgZL&X2$C xŁwߺGoSKE2f)O)S M KGߺB>$kQ Y, C<`2E{#mTI)L,4u!TM&׵׺T.[й1)er}D]Ă-ok^!G k(Q$oւR24$2Y<.@RuQXmJ<<=*U US*r;h-^_ CLRec\IHYuIOU%}׺3{Gjõٞ@zzZ{jSdjLk@Ou\CVC( mӷYZz&ۙ6,7[Mjv4US{%fw'6#Vǡ`P 8|=Lڠە _eM"Hztql>Hd)IO2R4!M_<rXsP=t=0<&M_ۚI|QGIV!>iU9{t%BzZ9(b\GKGfY{ Q"Poλc^8)حM$c*^ۇᪿciSC/Y0I4e6 Z%eL2*x׷?m!.fwjqU֍f&%IPOJI׺0[#'ڛ`fnII_-Lxœ=m 6ɼmeq| qtbvZݳrpn~ޛ?v&m>: =e>30ho$mVԵYiـ(Nuɾ6\v/ga*N{dYͅ9|m7t4J,tyhtY-\$jJ}׺,t7+6pnM[002Q5n XͣIc $Pkvu]߹mA_|e$oEceh7.V-ӍRzQ",N7S>3I=׺'׹-F=}y]wLgv69Kiv$cӴx}MYJ{[q;{{bU%N;bRfuLMg񨒇9Zڪ7HQStG;L&*Znnx)3uҴUiWAT{'S2TdVev^R mI_=M(ÐФKQ87:Y ߺE&)%< 5?UQ AO C$"IuVk<^:L󶚗\Pi'"RH{v56t•km7){^"`V/m\9_ɸso~gQ_%%įs}GuhV[@Rui{G'ߺY"e%6AQ7 ~}}uWIbM<{dW`ly*.I? {^׺ P[8>ȵ{^难*ѧOO7Fܛu{ZoY^떇PFs<~m{'mUz'u*ޠm_Xq^'ہd]JM"׹{) TΧ%7M?޽uJp-t)[[^S8uxnMSn/׺" o_#I7$I!(x܅<[nOߺQ:eă{^sqrmqu<-x(>o{rDEEױ<{^G6oU{^F#?$ܟ"/eX`??~BruA{l6qkZ{^׺WmĴ}h#F>髋}9~{;JJ@%=֐V'b[^[ﵛ#B[* rjf\^,OA%Cb%Qv:=׺tʮ7!,mUyPBTy㫬y)gyLF8jcՆޛK.,[UO5M-wzC`i+13e'cbBGu}vKIFzUCTzQ%H|`;f rAI<´.7FC6/3M|TSb)%XLruKpHJ<9CqUꉪ V14yP,UNS L'{J<$j[U=C6D媪#J:FD"*O{^Gڟq¾"Z(uˎ31:X`,WI*Xth}u,YdZ|W裗 U-3Q]d5 V2Y>Nh၎X#fb#N=׺scvDjeŶ8p$uyiX|}G6b] *u|nXZ_Cf(W*zGh*y.`}Ԍ]ᣢZZHx7CTEh $3DxY3%h}a#['P^oݹ"*3TOBhj/,u4P}TQ4br>Vm`1憹l^2?Z% S$UC 2}q-Zt >׺]E&VI1(2Xdm(8d^]< ^cSiޙk"̑[S4BFX=W{^jTphޞie`%,9h!ArB{U]UBb 2XduZߺNt'tƉ@ԯLbCKԳhq\Л\U?xLqn!h'Մ'}AMʯAG"% E2eXr un;63-%-m~N8dzIKxby1 Zy đD'iI,p=xsUc]-+RS*q.*y$qqѯ9)aMF#!oIssour*hx)C)S$Α!S酭ICAkjN/{ ݱX&4Sr`\Å ^׺;Xy`%Ne}+Ca𯈧L솭ZڱOEL*{Dg~6rTI V,u8ܳc*Y>I-eGJѨE"ߺEmVr<UR9<|fXc Ǒ4R{ piܪe(O&>tu\2]u #eA=TZoD- [kdy۵rq)S)q$25ԲD I$j׺[7'%LS`*Fc~Wd>/^{&%\Ԇ *Nz^vl\;xnPp+c$R3?Qf\IZj_PO,@{=u5SQU-dI9GBYw]"hY{^k讁]ս18o#_]Y )V_ Ե-&fD{^d޳X/lᱹJxmW%LT|.#n]7ӬRRD^꺾L-&&z,jak28w<7-5MUYJ'4z]@7Oc`'ghms+(T.EHqpUEJLTIkrSOuFouOZYxGm )ۥdvLVRڝ( nyz}׺ؿp^wӽeU{Z645訨h)r0ؚ<0CB{ F LG>h =9sX=f"ڥ:VIb{6s;S 4)$u[7]:ɷ|ڼ.͔D" 8;b(BSOُDGjWv&b%lju ;z*wHryϿum1}-t =u {,2ަ+>׺4ߐ uK]PrlIuu329,RD~H7[}>׺ugk:+PUŁq{i$vSu6f)$^T܁ǿuFy MŃ׺, bSX}?^馲6䡹SýO[=t Ag$ܰX['g}u,F\ioHV?_J_IߺY<HX!n OߺXFDd=`G _oߺ\5 k1b܋?K{- 41uz.}7_ǿu k9(5^ޑ{a~Eص$>\׺l el,>׺_.F׺4LrKjGpllO{ָ$~ yߺPdU ԏ~F,X(tTI׺Cg$^t"l-Fc&$E`.nCf}t&dhu!cXa"?C~}teihFBAIP$"jղ Ԃ6P{7oK5Jv,1o[ncHnI EoIпȔR>b%DFUP׋K LSq~ k?.ᤨQpn!rU5-<3xi+F144TqlI_um bZ*UMSӉ駒: \q8bG:4׺6XՆֵNNEll\DASCOK^)X|KzxXC{|ne-IεDxl<5qbk1GjJic*BH. tY*ɳI;ٌ-jz,N2lt1VbY쌏OMfIc%Eo ^{S.*!]ٺj<Աc&XSAT%tdsRut*7{gk2W2{hf5UOKnH9,vv o{X^(A]K>jHnsUgfzş3Z Y%$Q* ^fRb}ÑXij#^RQմ8lcE,mcIy!3Mu&N玿0: S[<<3ꖜG$DF4[{+Y`b*wE=5}`їҔM%e4nEtJJ!WWQY-pzH灦jS-2D_ ,lcMLA'ߺDq9'xX47X -{Ϻ1+:hNx<* 9ߺIy*!34*Ĭ|XI䭭иrT zdKUGvs5jQcj&*W\=,3 jzu,/9*Gv ~N)'QKRTx%13\Z9`I_M>ZwQ=NZ䒛GLҼ83A%"%짂=t/~iTȕ2$SA!"j@Q#w(@.k=tߘhkpoIkH5"U3M'$^1b#~˶e4U [IC%IjiKִY<˯[z}uM[ϱ3nŖit©dVv!mJ׺,_UfehUTzztKLup56~"1UL5 Iu4U߈cfЮH#{,x3 jyic[Atqpu6m-N&Mչ> kY]t}$~6562(r(h(sTK#YCT"우LUvNVI" .{kwcZy2I۪#-lSRKIٹZ7Vjf}?R-7:@[Ѩ)]say = 5|*2#UxriY2F y>ջk~f0-MYC]3ݵNPM62;YD{ѿ~e-Ʌeh/<{Vl,J1)WPߺGg1bMtb L:ظ3HqX+MXH׺/vlήؘzZ[ZhVLP\s !S[u:p>5Js,JH'ɬ@ߺFgue4g "穯ͤXRͶ˩Hg :eb5;8^6籯jc*2R=6ji˙2>׺,΅Q~*E.x:^(䰕S~E-)Rњ)cTij41[dO}uWPfĠmGbOo~rFͩrlNsv׿ߺ\YF:t,(-_u y=@(TaXMu$ b*0K ݏߺXKhUK}<_^Zmk{^05'^2XRMrߺ\.55E: $:OǿuQAu~UPXpB{۔NZI[~6V/cqasp ~.?׺b`?Qq4^LqeB"k$~}u6(J0ܛk׺<̊ ގ rmkp@?~׺ 30G+(M?_ԤA-F /yU$ߺYքԡ~'$ܖb6^%= BSû&H<4O~u4:I`_RU?^v GHGʟ~fvFi,5 ,9x׺-3Xjx MB>׺-&1r>0nE{MHKd%mv![Tž׺ǩBxir \Gugu@6A /~B0nQr׽@o~EhA~H# ?$o~6FJV"u谰seukBxuؐ Gx+z5Q ȷ>,*w]:}Dž9huOYs8LNF%\V{w*Jjq,^naOWaZ;K 6b3O=ZEe%q)" R&B#Ym%P{Kfu,7\8^ڙ~jjQE3J]fre] )eCc{S}M`..#aɶRY#xZ7CrOh"Ou~m2fU}vUH,Sih$e7c Hvi~a\}FFj,DR_Ǫӊ ) E#^@"׺ܝ#e"׺_}K('UCMY{#qlh7<}_nc[IB:L4tNӄi_Wzsdw)T)2qmp 0ٜ6Wj׾]WɜGIoO ^sy'ջq3I!,/ǟɩ$iP(w_׺vwu~bW%m_?& pnQTSP;Q ^IJaеs};6jAu݁Rdކ9"S팝[.f*pA;JzjX/[ -F;j5!&tsu=6ErLShE=uG?#7XMDžMwevC{ MGLUwQlzy(%JWw"ÂɇOWK/F{G{omc[SywE]Won-u$͸7~x8$IEO|^TcWqoxxJ,}KbWQ=v棫6"4J,M$㽏Hñj :<^ +ۣ͸vy |k,rT,3~ :D_ߺ@k>!g[$i_)j9IcG1YuM5;y"d).mhle'{]^~yn"riTc{Y.?UEbno{QҖ%Ld@VҐߦ׺H\amrVq{~r20BPn`cGǟ~q3#iEݸ,9u$,Q hбH1 >u+hEI$ā^5MGkuou#Hry͹׺zMe׺lzt\jZ<\]>׺,B`o`mԟY![ $p#I6>u(XsߺQ5 ryO{Ŭm{a?7OuE"nC \2*OP:1<Ԕ`0TGQZZĤ&e啽'ߺ\b(zH  ̕MOJ#CRЪEAVK_ߺE?2L%rਇ{EhS"#GU,y ߺEp"hj(&@#!"կFޠ@^% n}tnZ9*jf3#䨼ԥbyMN\#~׺le#𖔰,uNܔIMSGQsc u%DP:ԕfBWoǙ\ڹ=MD>%GPb$.1B8Ҫ6\W< jwnrV$RUf#t_:^ CG T;\ٱT|IWeTT-1dd 7>$:`eiֽCGXcv v䱒Tm~K(ڮ"V7AxPOu>vK:oNM\7 MTŨQc[MLDIKEOF$hiu{jw1'oQbxKl,A$ e *SBzZ(s2+Uy*Y(fTJu@r΀{=VwNgFK9}SMur5K[wݙKdmey:yD3=E<կt_]T{=WU=Txx2#Kcz)~ZXUGvӯ{#xNߣom=Ike\..=SˇihqH뱒Zy!5A,mN=׺j{r}kwwf"9>=VoFKaWd^<^$~sM J*E.Q}=:/l>frywjj칙)6h7L%u Bz2E~]jYӴk0Mq[:vlǬܖ: Yk1=UH?ͶT،ҭ^F]ET:2{^^;{.J,D}ߑn ; Eu~0rSd2tuL559GCH˯=^N={Agfm~A{OudU;)epxee3Q ޽{:$&>R p8QmJEc6xñY\uUM} Tc֖k#&^7yaw^M]{2thࡢ/yz +I {Ty19XjeߺQ6\2ۂ#K[Ondb/c1,𜷎6s 1T[EC[ߺNݗ:<#m3O=\ۘ4;_*U|XՒwV a|tAwtUmZSǚhޮqH׻$9D29m@YLtQM0E ZayL:醥nHn-{#:sd:W;+Aۘ9I)_vbp$˕&f?O~Nim\l/u..ORyԁkG I-PO\=unޛٍod3 :l 7v^#ߺ]@Hثon435$ߺ^,MVm$I^Wuu!#Q6Q0~bAQOXj ra{~6JځC6SaQ?׺@cA]W[j{"谑m[qo~8$QHVr&k>׺rUխ?Hۇm$è-{;(#p8Qf6H/-gPR{^Yƾ5$WI~?umyH:F(&Ź{^3t(f 侫0"Ëu2:Yf x4~Ii@q/ ֽih/+i֥,o;_PcN=u("M@Һx4{u8̊B1ΐ@ԗ!O77}ub1xKe20rl/{eV& 7VIKߺL~Z;18[{^KaŸ0  $\~/qDRibP.t\ qo{jB,9U!j%Vĕ}t5!Ҥ6?Ie~Mǿugf \r~ޭC{ŸKq`>{GVۑ7${^bmq{q>׺fR  7uIX ߺX^}G?~>a4 G<Ѝ#%oH7ߺKZ%kH`I`Bd`mPaPP%5b8e P*%~LUxrUo $BEM )F,[ѩLu{^[ٵUm%#fhJ$(KT>V&'{:;T2scSux5cgJsh'x^^,I'ߺEcz4R=B OڳgTh|G92L׺/;gYK*תy!I04y({nJz\:"fD_hGaSdv㒢DVijI衈JI (qkxmZY41O$xщ$#`,}t3VO +vrxiJR !(iZhkQOK95׺U 136J,Z*ŏ"UEKЊH1 0ָ^闧:C?nȯy܍C:+RPCwT-Vn+GW)8ߺWן/zieknI>EwXq{suͩ iT9|0j/3s%5'aCr>z*9V::DyH*&С0"7Dte~򦪢YTQJ[SbP"AE {^O7@JMŌ'!PˈޓrU;y(QT;kUu^?M]qWUM`N|5~E6*k\1hꌋQ(]#L6km\z}õePCӻ?vK0S:;zmO-$g8%wݚxhou"v&nYKڔ-Sͷq (8XM68PEA)L9-.rQj}KhI#d&R~7S]15" "^B|rtњ9b涎R=MHqt\T喔TC;R6_u ͼ핟lGux;+ucq-fN3vJבeEKS[ O~}xL~ٝs44ۿiSESX 5'7^ߗ3Y 筈kVb$Aϳת=:ߔ\b՝Sb){f-ޯEn˘RpDY9$nݴ}CmW`w6Z* ;!McjZ90Lw4zLu-\ͱiw=ٲ J:MZc_Q*}~}4}k؃{6~d`%l(Tlm0E~pu ~dBuR\?{^&Aa-6{^V7RUJS{ uFf?#&ĐtE{Z[ ׺dȤm{O!mc$` 6=uڀ j}$?ub1 ap=A[UtC!kIYNIBܟ~LJ8(ii) `A*@{$:u 8?R߅R ?=t4""mA="n?^pJ]Hb-o^,KeQk!f:H7}oFZ5o&'d}=t*DUYy%:NGߺOC1úiFUS$I^Lj*, /ӟ~y!e>P[S(E)Bo7{^ L"h`Y*6׺jhn*$[7^}t=D-׺i=LV$`5}{^鎦>!"倿ߺL#nA[~pߺQ@cf7QkmߺM!m~xb){-鰶<~?~E67Ao~aRT ف[aߺK,.L(`̬V;X k l~/ IHr45Hh;{]Ԁn}tGW;k #->Nf  ǿu^힚ExZYN)fxёaei5u=t&TQ5lP=lTMV++2TeD׽EB!Uʊ,c!?)Һ_{~xjMnOLD&zJ#PTTSsPdGFDI[ߺJ*y;PGd*뢁jG%ZAxzgBDS:Ƭ {^52+zڜ>;Y-bPbczqj S:/!HaPSߺH[ߺI=׺S#*xwW>+pT{s>׺|8/'|Ҿ\ыR=tWDGGf%Uj)/%܋^?+#yؼ񂥉A-=tWtxʑ3JʐJNK۟~}qsw-Y3箵vfhJS®y9'A>׺ꝇmWۛlF)([?j*)(EKts{o.pؚ^7{BώREgiw6^%#Q#f+4z5>{^:v;C6Wc IVyi%i1S_?x55.5uϒ>7g}(G_My?qY I>r]c66'{fŹ2t۪r=oWդʙ% L 4d!^;WgKUJ돃TUn?zaP*G Gogy1Ζg z3ZqG63@*W>o`^sKU~7m&K4Mxǘz14WV՛eo]ݟ#{c~ ڝsN*~{'5O7'yIۛs(Xm^֒Q/u~ކ]}ǙѝWݿ,8-O 7aInTE[ 5ZPⲱpR!eez 87~>궎~dmU5,&fxfR邇f!b4uϦM#6N\G%'ܯi-i!U3$S-Izl ݘeNޢ |m4 XHhkhqh>|BJmD9N3SY_,Dr Rb3NˡQu=} n3;1%ecknY.u*co SO뼵חV)2X*o}!n}S 9ev7p`vm\Qvowm2XʼB0|u 1RThX(p]B6.*um6Mx}Fѧܔ5L[ý6%fi*h\dpusMOQ%=oU~ wn\BzͽMbw,{K?:IW5p[ߺzüvS)r86\_KpNC=f}u^頓!Z (eyZ_BTx_~^gIH bjϹ6+d4RGGKI)Xڜ#m⢂XIHUu/zL_bm(8mQyYe+ZUկAE F%)s^wR*}YIE*%X 4u٦F)C,#qO@V >jڛm_+,bxq0VE5td謚dXy>׺jI-ܴ"e;#3xYL[bS`vf̊rkj,ttq'u򈋏|_Uk:opQ?%A3qrH M[XBG׺ꢂauo2AΠi>׺QFUhW[ݢ .xpPq~E{=%CZji|JY)i ЋgjCu.Gm`s 18.Jꚼp9jz+' {\_nH7"L< hEOhMGHդFDR{>#P,^3-SY[?^ҬyJ TӤ"j윚a"p$.=׺UI㱸'z.3Cbq>O5Th&2VO#5t.CkibX$ZF?63EIV%+׺dZiE qp۔gi;' @&Q|Q ųeO6G/E4ن>JԧDo~[:3oncWڊN {>MIqy}ŶdVӊ~ܯ婨}STPޣGZz7?hrX؍&S,{l h`NB( \ #$7NYj˜Ȋ`h1c'.:zL#-Fn,SK頖jZ0;|:{ՑP|kn.?|AxzO'I!5]K$UiYl1UM:W.'nih$}Fer5 (ZT"Ju(J/,{^Q7>z ]Թ/(VȾ7)S_>I6\qdA+p.5\[M9Jk-f-RZaƪ@H,$~Voͮ)ݛnRg3PgMfo|*<&Wȣb6#iv$ۃ- ^ Jz2x"ױ|n~=ό~װnnst+S7=W TPԩu+ź=Vt`loonLH9VVqUEMLjT_1TVv/j[1j:D37Ⱦo!&E.kx)005%Q{`&/cv6jystu[' <O8ME-^۩YvThgo|#;kWQme/OIٟ&_UP9h璶y~**T'2UϺ0U&9桮0ޤ-e4m@YCRC~8\vN ŅRA#pb2KQJZ?6V \%OT@R}^׺R -ܟfb6u+IZmڱ;MqϏ1®\DTIOS$IgC{=o7E`tؑPYnap͋]"}u~,-㏯ߺYr!"ĐE>׺k" *I@ӏ׺񌂵6!Qz@<{^I5!&o'ROnm~s+7 `AGsu{^,4Ԗ:Xb4Xq{b%lCo[.=tYVPB}@~8QӫxŖ?G6*,s׺6>Hf.yan@~8R;w__JZ>.Ou!5$()SMK^B!)!ei# z U7{ O̪>6AbSd [}u-iDQp T }=u7Hy<x#H^뺗zrp> Gm#PsVߺPѼ4EEf"_T4([/{JwW2j6 F{^뗕ZI,m`+}!O~M ww\2NHX^K{^$)T7rH aŀ'ǿu~ʦr׺aTYZ̮BYϧQ@O~'i41x,<׺vRC >/}\׺ni1|GnImߺLJB=Bj"[2(}t=9GduRt ՖF#Ou&P<-}t,SGB)E` XqV_rl߿u:L[JM͇6^ 4&{^4}#~?S{2A"PxY#\p >׺TT]<ZjQ`ڗP:Hc۞/{V;!*,T*^I&bJT^140Bs{je5 J4XIRa-fP% *R5顇D_Zߏu5}]TDR/ g muUUҤ^BܕuI>;-efM$ ^Rh&tR^X`zuYes =׺'94SNzSVd} EGKNB؄AЗHKQGS%= ZDҰ4d!z Q 1Va{8b ثh2GQUKȯڑ58],QD?W{|Ԙ֘Uetq`j*H,uI=b' No}׺Xn,=Fx$ԑ*L4Dȴh5T*ce;M.Bku\I%%vMkS3}OQG0 +=۶,̵2)Ij eRRO)3G$~1mUe|FđGmR*rLвu{(>FO#UW+#H+fEc/ǿu׺o?Ko܍}n?> *mO}חh⫏Jd5-OWϑG^wO_>.ӫ6o5M7gtC:f!*%Z{{)`[M$f[!RCO4OO ' Qg{?G;ӮKF{Fxo>,ü3cvەwM/_峂O:$fVqMRU}׺mbq6!\o B2L2OReI*.Efq`}tbWWnՋMC`MfWGudSmmG>J-bjcשN뾪m{{#(?"~j>ERU~}2l+"ܛ*"c0uKYj_~ONF+N[u>@w?6o&fwa DYj"n..8 ~eqVPd*A!fC4<)=ۋq+8b&31~p͵pcH3m[aT"UJ3)=nus}qe1Y\bn]QUg7 ,.'p3*51UKbdu;nJPTmxL%nPnYEA<\9J4UWIlG䈩Aӯpiw4|;ڵ\U^'y$Ҝ܊iW`=5k xdTEdm|=XfF6(eRM,#D$aA}xsU9\FKj\nYըj㮦%%U&VdВQdu')$2@o~zD;"={k<׏)U3\)5ʴn#6 Gu;-ͱG:uT}RfifAjTE-0GiíNMG뺓}ɴaݸi~6ڠSvf榫xfUbQE*MK 18O~iígen]{h6V!Iu n^vC!@Ѷ>tlRNz7ݛ)UOKL^V8s~9]>JQf|lQ u(Lx0-EM3 %zLz=(m0V8s쬝T\, W_ybdbHhd^SWU1>&$+Y>#-'OdqQlj%hb=t[Y< HTSIǩZ9eE$=tm>*|O54ԸFԸX2;Iig&*|b8;'H{˭i1jM"M%O>J:nևphi(`شlj}v>n5"s}y{^0 -?~׺ !*e AMŸԄ~U4$8{^``|C'TW l@f9Gux LI ~ߺR!َhb~~N6b fbYX*ԇ/n=t%3FTui?KiT~-ߺXLTqc`~[HOuK=i0 #ܨ[5,-^<c yAx48bfco~9K2SFeZ,lU^}u. ӈLM>:#ǿubpc f#23i[V?~׺3+BUʆ:D(eҶ{tz2Q Э$k@Wry{*iR(ѵ"ZX݁*ȭ??~FJ㌁!D,d1+'^.u22K]ca" 2Mb,uj1lU1{:m?K\}u"bYd>4s)7'W`{k\_{`dX[2HCMԞ~{j#QC^E4LovԚzchM?Cs䌲,/}ǿuTFC*$.ӛ\un/}o{㩍T4QYc\" k"ҤG,F#{v<'Ce38ao!ա7k{F3; zuj3~H>ߺM*u+^)QJHe~׺bU'PZ" M8N{^럈ºY:y>9Hry׺c4b$ X&M'{^鑡b5i[e!YoMT+#HPx{cN- ^l9׺nڗS/c`X}x#uCRzU$PA??^<^μ aO׺xK~N1Im!P(O}tl5a,7y%ҿU iEAMeIʳ3+eE%{~ $# f.rX|pSƬƒK3iEXҪt=t-a35uEh*SŒ^YW+K&FYGB‰`@^@)]-<_nnM2%U%t[5F-==.fWb=׺\*dNJ*J!ϏJS 'dRE|=i"IiY TujLcru,Wj(R9!C.*iTL<(MϿuAMos'ŤQD2~mJI)QD{^빲XXᏬe9m7E ITEMTNҳi J=zH^7aff_ JIJZYPO Jz3']~Y=tN9>΋+]m(<3a&IUe ߺDud5W)bzTVWPfHՍI>׺nejDz-#cEAm ZF ^3Ͽu%UcT1VBMGG>׺&2ʑLQ+:O{ߺ^wb%#UmBܛ~(FG䦘TR *L% 8*?ߺJ|lhM4m$RAT6C,+"S=7~O~+ۺ QCeeUnPƬm\>׺f]aY(1U]f)SJa6ٟsOamVl,q2&[II&&ZyoNT8^ ՟0{~lLY\=SSÎ@`P1TC `RVߺ[jMw.:Vn]SnbJ1A#%mtյtm񏡶t2P=[+a%Jg1z+$2,ōue͍K6@D(tLaGZubVR}+e6l _VFqIFM R4Ts%ĨrwPNQ(i|o$h[{^VpT+$~4QɷZ^%;wgsXJ f.ehsj1Qtn JZb}=g{g~u<~דY(޿ \.wyZl+rtT\?]R3F녤u׽GZvScMl c#suxmݽ}AkXn}EF#lڍl>֪nX22#^x~ gIm}&_<uW.n=7fdwFg=c6B⤦EST)9d]⠞P>JS&<^l]{z,T5Lf7MWg*r]3Qc71ASW! ՖpGxӪ玘s'~iQgr;Ɠ KK Q ?2,tq?W׭WV3UxJL\-yd7[mWICYR+jC"-k,r:ž}zkFgo-Ϸ7w;|KȻAOB۹iODa+!^ uuyyk?3jҦڹ Ngj[WkbRfsw"}٘ɒj]ɀL\U4@lӯףխ$-uczbbw}/ UI&@nuשޛje6ɠڏ~buC)jo}z}ɝȢ!iU- y^&ħߛ qY]̻jRo}g1Csm &˝^U%M^"^˪vg+mTӹf8ZGYO.j|[ݛm;̎ hJ\1֩tV{˺/Y:4 u}1.uS}N4>k3mEh誱Uj_u/.onl/Vf*m7=d{ YjAY*3 W#lzy_hp;{WE,sFkK\f\zռxCGUhU K}kI}5nrxɥɓ=qgz{~q۞hD4А.~^nXf6f6wJZMCpxh"4$:B.I{t[R)y&Zt),t"Q:.(Ѭ{~Yݽ{;lc]^t7iYwg}͵$uԯeuf5z}٭x6CESܹ=s0bL.Κ\V [ @R˯77 ~׺ޡ{i?]#suDYT16="}t䈰]zߺN*i}!ucQ{z6ߺR4YCz/r/&@G~;*M54էӥ^׺Ud%_k ܴzFp~H^9OUrOӜu.Sud%tJ^] Nu$HnRx~?jTE 0TQ.ȳMeX7#~}u i`X\$d SoJyMu&H#(gvQK"`X$Q{UQCgd2 7D ^ zk垔3#"68][(Uߺ\ƥ%X2 Llʪ`" ǍV}}t Dy$P4P7{&*`DcRG er[ǿuK A 4:+ei!Fn{VG<00ҢY$ * 2<uP1EBԒ,& ~TK'A+qf5>׺g_J#"hopē }oo׺nI Et ,AKujޞHqTm\@ѡ~?c{zU귟]ms-{#^鮠U@DIs!.[kj,~5Te{?[ߺMkUJyrH?LȋCyho\}uH,i,>׺n$`O?À^骢MK ~Et2YLTj?ZFߺBn+Nj٨jj"i$Hk%VW:S_/0)#F7 R׺Ļ3aRKH&[^׺'"CZKsߺ].w/`Rkrqk)?o訌F9f4nE`Mcž}ɽ$DaE?EKPA^b5e(qвM)xZIQ1I#{3~۸j,lYio\rLPy{^|8}{X`zC'(!VOi_{S=[,`:RP+YK7~GAQNCA%K+;G={2x+|Jå{&ѷsYֻ s`~w -;z1S.kTմ2ecT"׽@^ cvf:M$SC-Uun ۙE;;?^}וT=i+UC'~ٽ76;Sva+:wFlS6[Ar߻$Q58z'׭Tp;{|;3ͯ{CkJ8-ِJ*reZ[ LI50i^=Z:5=)k*\7 /'majܐQO].6B2t eIb!q־Ξwd)[+m沴v㯞P{զ12/O.W quI9X{x"7nT;2˱񻲲w1/콥MAF,jPn̞Tޱ'D5Sa}ZaV hE[S>G/o˸h*:8K8:Tu4gqnC(B+螚TW7jK+ k`|O%5Z]t5< lHh*k6>6tҊIPalgUYÃױ~NT>;w>RPQ/C%4%.y8fB 9tXz%jT`vHfv r:{ऒOڹ^ލ-v/=Hodq풏m-ȉI+O:q궾r|qtuo(i0Q5Pn|jsؙhrJ )jY}՟N#W\:MX̔k=\v75MYFJ:cA[9$x* _ǯ}ɶvcu6ޫJyrVb?&I髣־(\;(R=׺+qk7OCX#ܦ7~v)2A5LsRy摠v+ϯytT2'\U)\I.:M:_-@ \^?%#ψDT5TKXR0^ Q ^u=:yJp/!\&gv0ol]>',餢ڭj|#U$Cu~` ..ۘ1vob>zj&ք`&{fUQER]{ў9="ֺxSkx?ԘAXVj^*vrCSc{YË~)iH䳶J݇t{^<)HR0zS>׺ 8M.A_"O%go@$<O~JFTLC$\6~4&xhtH ]b}uL "26*6?o~KijtUcP,9-$o{^jdԇ+˨\2[ F1/ap-{^L=t^:T3ľO!S#N^ocuRMg/lo{Ts/nWбK=uԙ\M5dBpIUӽ6Fi󦄱񪅈пy`IuTcj$/IPdi}u2 2XehoҜEu nnŁ1CX2[R>׺URJ!wU)Hϥ}/ZD,QB&CZ6ӟ~&:9)֜UdRBd? XJA#uiVXdHc#Cy=:X;+. D_u}^EYj)`B$* ҭ׺jεUBּ.*xk ?p]1yFbÖV8 M, HEب[F׺c PA p.YI{^颼Sj$R{RK qo~p i,GcϿu܉QJ@ G׺,e.JCb@ȹ׺ld plN,~_ߺP3*nTG6m{RAb ITRu;,^5Gr%?>׺"cA-k\JwB9Cc^HԌMŬǿu-+ 'uT H#;2|^B8YSxaPn^7{tV2L=hn m-QQ-<T؞-ϺK='MT䨒jj,=R#UUUЭ+SRb%yeP)^j22k+*TF s>׺1 +ihh+ M Q;]SW -(hb$r/{t#S|=Je+(_r5ɓ5v2&F*UT>cȤO]fՙk~:jթo"i}V" B{ Ky'ejDH18v8~{ݹ(nE^) K>YHB"fd05 $ޒ>ߺ@ƉDuM*%u0eL{ \0O!*`k^?$c)1RXr*.TS~3VߺMk)%-UPNK[2Gw_ӨX\7t5`:Y颡Ye_J)yQqˇoE61VCP7::3hGh2ׇB>{ݠwmơ6iVJ..~+"HH[ J+~+dS(jh, $23S0hd*ډ!E_H7ciôqpRQdNF7TJJ3=[~ {cf: XLjf@T=*"xMTzG'}׾]=3fu]E sET_6>-*hqOOPz}LrV o3H{=hj=nƇ |Q9H.X:]-09w~Zj*rQZ^U Cɛ iapT۶Z*}4{k'uZᯨm\V^UekQh:)sn޹4gAxTwV*Wn_!,be,͍9,.TO!׿>nU! V1Ra Rտޘ6tbK5 "ҴqPχV8t{j&- {NpeGjU9Q@e<ćS SXIּtuOknqlb ^̀SI]߸,tQVlmPnnkF"CQS҉jEmïz {75:j ֻkg||f.IUGU)*l>VR9|~NKC^8'I7>'A{c9x+w\qoz<^Zm30b9#B1+` tL"$*N&9̫IP!y {օ1$5YHq 1d慥e Bj)jhDeV SE_NjX~tTtۋ!rݫv&VeˎdLLmflv \z瞪mNo#Aۘ޽a[o.QKlTˎd@b1Yofe}k}{wۊ: &9\^;',w>-b&ES(qF}Q]IY 2Q˯qz!"6LvZݻUCtiqL}ǘmd*ɍI#MI$-tR"ϥu.5կSWzGUsSŏadQS ?_{Ǭ۸vlEɾ1Qd+SPd24cdEZ%md2)U%%}o@fjZG4ARxjKKO0bx0ߺJ-MDžݣ%&өiMtZ# CCBX_޺[j&ma8<>GfvJJ=>Wj4m4Y> ^9rF{^}\\F7bVc{ Og gkOP) !~5&7R4-UM?Қo|<16' \nuqR5I%Ƥ} u)$T59>'[x˒P[Y{^mTѩ̮GY$tn tS` Kz/Hi _vief*< 41-=tוʳr& B"jI"(:ْ~%1$>(#YvFxVk^馜QDꌁ4jb,ĸXپ>׺h_4Ia:U-E6W׺bx fԿV>׺ RH9"-K҃O?׺o@da2֪J,ߺL!o dHWp8p@ԇ{^bH@# /:xl/uj`F4Ɗ3c{V[_B_ߺLU┡`.5+r4s׺iX}Vp}+X;CSpR׿uHʢX#sߺM µd}ϿuIL'6?co?{^HU-u S@_{^z`um@'Mh&)$Tk {^zA5ȸ׺rB8Mlh _R/{ c pߺB,p"H=g$e#V2!$nKҤՇ+0V V"z*OIMAv,jlBk^PejV"S|$VAPsGVzwg!PЫ5qrZӜ):Y*,U.V+Y1%[8(b h׺v.\7M4I WU΃GAQ>Hby ZmnQIO~5fK5q࣫Oۘjrʥl;(4=AzɿEpijji#&9*SQfD[:putrTSQI9aE Lj^ [?ߺJM7 v7GruNi80UZY2hYUߺ^l[XAI=d*y-FEƋ-J5?u5 BqL:|kUZeM dR=t˲&R% VUJ*d3xc=hU Y9umSV>:Lu,U YOtaqʍFJyVuWJR)țFsjOus{GNiNplӣhDR"Xya{F.i@gjV$2In^]R٦FPF7a24Rs!ITmR*[Xۏux\s>%g305?-RJ0"K[ߺKIo4L%}~*Ӳ=sJԲj3Q$|Tmn{zlU .AܲQ߽u6pRN3f|^۫\ UCU k:DdOc˭cֽZ&C=GOZzrhSnd1;1wT4Y 2HQ:厉t|kn;`WvGmŽwu[vbn{3fQSe\oϯꚻya'%wt7jvN#)b B89U>‚2O,8Eщ)QBi׸PS_qyÍ{o?{u`(0R*W]eo㲔UtܕnRjᬋ#"h׿,c-Sc2P+" *iJ4jz*YJmƾ]{'93~핗#-DEQZ`dm$Yr';lfflvwfu^'qB)2xɩ+.m#}xcxC-TjZhUX$1T:k7JNZ4Y~~΋~캎ٽ߷:xS`st{=?z\ۃ'#crϩj$N>J?~g xbvKWjTS:3?UOrd篃gg3ʊSHO1V>}{ʣIV~I5뜮ns}}CYӏhJp}Y]טӸ6I[:\l5E,qu:փ{ȍ帳[;sewx~l,sEvN飪o*UQh.6SwQ{;;6VĜNFN¡ }P{kE&C/zMϷTwW.\z,׹LuB7>9+0J"m߷08ⅱҴW6N^#es2ŝy)Xj᭩JE=Ut D*[,$cut6ާ+!45KM8#GJjJhqy##[*W>y.OT*7|Y&C#|-[USܵ4NrFabLC-{Pۛӝ[-e͸_N߹ jz)(2W5$EwZ8$׾ޮ>}PMfzY -grTrR99"G6ǧ^_%D(HwEp.?^GKF$5Q@j6J+0 7tC u>/(Z? du#@Īk^{^a=ѣI#M#x٦ku y 5X>׺pJS J1S4QU+R ?zK:Q{^=2jy2jf(YI ʱȳVs{˃VVפZ XG1-D0{^HC[+ǀ8T"U0<^>7hE3S0Բ, dEh]MY${pOW+0Jx :]dZVKJXuii>I3yDB=uoVWDȅ L Q E ߺ]Sz覫 ҉&Gi{$^*}CR0?O~Dt5qe\4n04Ke 甇Rr@'׺6KQXU(QdR8RJ6C`=t!G-QLWPof NŸ*̏DQi%SkHzO7"_~ck%D&]6 ( 9Ԫ+ʰ8K椀 FQItrV׺}5+RYpe sU{XS"DWc0 BKkuХk(!gjtI_JJ}ߺJ~O*,D*@%@Q'>׺7:USL!ӥ$$Ȗ #TI?ǿu4ƚ40&oy|(C$qvJV ܞ=tQ,d'?p"ifiD1v I}C{^V.,E>"2,X%_{^!L#+%;e)$E3!VT?ujY%ğ bıOZ׺ǡ*cƚh K=t` ,}T{,.]faPo`X\O~@P2X(qߺP>[׺oqEͽ$0%E^~ـW7Hֿ7}tI;BіD !Xe(utbq~;SVK AD2.,7E׺Qi%K$@h"d뢂9aMFwv%GtU(r{t]pMR9Z٩c$eW)*D֟R^oכ]Q%hjibjFVb)5kB##t*h1 -N8hiSQ%DyJiw)¬w`t1> flan2)s璭e:ee3$5RIo~'N"luUmލD;MŎ?8,-.*nձɵzdb)Fc[J32:?wvvo55i_/আ*H$'\;nRcҝZ&> z5AC$ Vѫָ=뎔]ClPɼx#;ŲkETOeO>fL}F2ԍ&3!%KHQuOI>[dOxtObuu%V6~`ۭ%K-u+* YOX=AןӤʭ冨oAɦ؈j+i+ED{SֲՐH,)׫wtcb籲 ߍucalAͧQ\ܴ{KZsz,T U4yc{ SSˢ;jv=K%8Wd6I4sc2TtuYZYc* C!Wm#]hN姂s,QTR<9VEX\TU1%o}o%ͻI-NpV02)U7m1]=kCn=We=ٔP.gj6ᤋme8dvG MǑBƤqa'ߺX GMWQaRVZ*Bغ%n[q{RՔJ4Ew>8 4<׺บ*|mM3UUUTR$pB$%UjlXǯY6׺px[YOԜT*ҺTN6?=Go~I"V5(d,j!X&YMr>׺cL(pI0eP゚:d]:޺[+*cscz62 L `jYgUN]E*FE!B?ߺX+pG-CAKULе,)J,I-#ieRH»\^몼=~>\&MQ54t%XL)nA${tKF!20rQcRT\W~3beIIJ0ʡRZF>B?Z׺O2ԔFt2NhidG"Mԫm{ WI 4!1NcHiQ?s{) M{7uI;)"}JsZf!$^9ZJj5Z`CrZI#8tXEL| OHby3$)R 3Pn}tzHQ|vl[ߺIK.x"eSi!U6~AC_׺:"G׏B,Q$Y&tD}Q|   ,;O!@G# Ͽu¢QTr˨ 6EK%FRf"ߺI@G G{^鞥W^mh 7,>_=t(]rl/p..4u$BCs7$཮M/{gR$&I Z_{m?Csi<{Yt%XPQ$rnC[{P6>׺=2>H,TIRnT7ߺXʘ:WY7ߺNTEFdW1)iyӧiJ* KiMerMo~)*1Bo+Buy@8_[{nqK2z))WSGRӶzHx8V;`onO#ߺFjnJr)ZdzXEI&8Yb,y *$u=׶jsX\F]K=%ފeYsO- %DU6L Tf@u;*@Y,~2lc"j8qQs+J.>杙 jd^s="hKeTfT0XG$>׺I大q"4m:eqYA Gob\tAeM\{)4^dz8'hYZZ}(97ܻcj4xa<؅UW1Ef"$:fG+(%٘dT9,}1)liٙK'*}׿ңSd1SencJRWd5LsVz#1 ` 2ޙ &MˉmEQ_G6HPgbyideGrd_um0Crn\zL6_)Sj*a5􈲧I5]7[:6K* #^&7 cf%OʚMxlƞ1!:Q6;ë [?7$[Δ=㷩sثswNŋyasɒ/O#פS*{ׯ^z5}Ijja8g vٴۼ]]Oۿ9oN.'zvwao kE%feV`6:|yוMO7po[j2to7]C۝cxzgSn8fozl8eRh56ϯ^4ǯ҃/v>ckld02 Tك17uN"IaÚ'SQG5D&% ׍h1}[ٻ|l݇ϚlDXi+vouE]> [6y^?qWm";>ϯyS˪_ٵ;U%v"/glMɹ89Mׂ՛3tQ%XĆ8%?E/Rg^NWHt|ٛ>=f՝ϲzfamύ;p3{Q4}5f4UK6A׽1= VM)ֿOf<eu9 XChj K [;+Bw=z"AAM˵p{6RJ;_WG6>8&J%c^GDW'ZDU ʉ炦Ff*)a4eeq`X{=l`SB+0JJg`sT0VcwߴJyUºJ:2gu-6JZ 71Na8zIjRMA+h+% N VDVRWޱ׺on=#ؑ񛊗$7mQ}ɑJ-ޫ8MH%Jhi^s [ *󱷆ݣٴ5{Q`T2ۦ8xqHq#=r*9=ϯS7݁߱v4ɳ؝ڱԴxjy CcbO'ņ~mc* ⣏I3Pgi& y|4? >׺Z㞰U5Ub(bR\Ϥ6t,Z{hA8qO*zvidER,MKl<{tCC;UI<Ȟ9ҪBT @6 >׺[(1ii ZjV h•F"xASpMOoO^wZxDruIWY )$ǥȹTߺY4x9+q8ɩX5KS"x 3uAcbl=׺p1Y:GI+|R%]|@AΩDk6|*/|O>׺-tί['zSUYT-t'8crua>׺qr3ȱVg C+4䬩6(i9}6_~AzӮdrN %)aM2Iҟ2Xgxk*21=m+$ީC-'2?]GuUnJJʺ,}}5$JkZ*֞#QSZ)TX$G>׺8|V˦Q< kVTVȲI;)B OM<ċV^|vG*¥wj!Oer+"2r^)䨆&29E ŸOul,y;We2:biôQHm TP ~EuoQA+dְYUE5 H!+!4nK}}um[Sxd)[$-O0:ԙ&! }o%ߺM9MY 4-LfjXWp2M'{&q%6 f M9mεe8UUZÁǿur;soje]9XV$rd/Vy^B]&5te144uQ5 "WU,r}ty@' X}ϊ9n*İbIm Lk [{hz<}|iILj*XJJ)A qE4$s:́$oI~FSTz]vSVuٕ :|>w_LͶ3t o+ĦO Æ:Eްn]_14IᲛ_IE㳔4 O }- #)e+Jy㨊O&׾uҕ!_wde+gSŒ4%J!=$׫~ޝõuYN_ a"o".BI ce ybRU_ϯSn[3YIEWPAL}3f/T~@({eW go"2tdrnl| J~ֽ6].r}_lWY,҄hj>_=xqth6y-pdz#p&=մ7,Q|Fgjc1zlNGmf"uN&POCK%hʷ^zgOܛHq;S}lߑfAGڽ3GeOg,X*.wCUFV>.<#~Hw}&*/Ux8 Jܻ;C-v۹%:[\R|zz9[m_v[gv?nN޻'c0}TI[SY?4CχׇI~/a66{ڦT%=/nTyV\rEO*(2("id0qǭ8=Wn/¢pn6ڻn ذn>T,I\ԚX$cXeYC;ZW]SqU|Ijzwvgv.. O0OnrTovEUn'/[í2twtj` Qem_;]On]G6"7f:=0=[-33}NXUlKC[P#ǿ5{6ok J&8\,j\;wS7 j7$Ɲ11->B$XǼq)<*(i\tvW;0vEE~S%SS--KRqUdCՇ|{=QhiYtx+}Z}/rBnc*yjWz%gLB5$DXh+?Zk^82:Z "ZHwU)d:ϥo:<dqlgho[OMqڜt~CHxǿubՄib0R3uV5ŵ?>׺Xai4HEj1dr|1=Q2X{*xffT#E2O*a *dfZܒuu5'XrSNQELtTR$%PSVRװkn#ߺO[nRbyLd׺tQdyJDH4CeDRBo< sX{uSW%nR wji*# 2‘ 6,ߺJ35GU&&Fch޶Khf ,And,{U䥣brc).Q,M,UF[UuM5B +EH,ս2Q4[u9Z@JF̎dn=u ɀ#F٨zaeC9R01T}}u2.:֊l]4U|#G$ZʪtHa:Ƞuc !UAI둏%pc#1>'6V*(থbtk0)#MV#9i#{^S5pUIMdqT2ƴM5H)笫 )Ъu>׺4~s⥦4h+OIjhdЈɩF/y\X|XYE>C5FhʔO e, _P=tzIpYH^ SGK"E#MsKV6yȠX {^ܵ}1bT4-S2Չ]YC62}ByߺLqVN21C,Uby Ӭ5s%,T0Ftq~63V*Z3$Q D%I>׺x&VWrZ65IJЅZh[$Rү,uB,Y9`z%U"jʝ,S*bpxn!)&'H`h_jiU,-{YEo*5k=;NG ,QadoO~"nWyfzw2I?ju,X1Am:Ruu^8ZEa,ɨ+ekߺN1edtb5ԅ?4 ,y[_~I-;(Q.6[AUC^OߺMKFv %5c^M{iE1-`د096^넬Sy<롥Fo]7o'ߺM9_Le`ŵ%h#k {^Xݚtc$nP)m$+,d^G{^m$-O$DGIjè pɵtΜUou9=sq}8n=uN .)1o}u^#[$~}uԮd ^n/~7Ȗ!VXu;Ȭu0Us_ߺMg@ڇ af7m{,⦕j ahh'OdR/{l%&!|Aʡ D~=uCabAT&Uٍΰm-yΰUU V*@PЀ-=tY"Hd$p_R &?ߺN4r)nIV:\?It3Qs17v?z,Y ߺBjJJMBLU֘ȺX[ߺJ%ϰTCJWAPS[(LյGSs-aǺPeja !zt8B5qV6i:ilTu? n&4)%!e+1q%VB5**ulT{t4mWr[s%-VUWWXr֥/NjZUVhJ׺֛xe*H1Jzh|h#ZbSRVәc,}Áp[{ORB_,8jbۃ1GO5#eQ]c*HT=ױra*/]QƑ:F`xu剽˯tej!!v*eXcMmDje*桚fi奈.VW跿|.&bϐ#KUJfx%0КU%wh.P:ױu%*F {}2Tc0tE\% u=}]X!xO!׺v;~sWG T- iX8VN#_HuCLb.[߽zH׶txj)dUPq8:,2[ Z EUʊf#׳\ LT3aɼXcTKt@I$ʕ{2P05rH,~ץީ:;mڏ\zM-RZJ* TO5j&TuCkL;5%N4N I~?E,l`U?q,%X&zXKnxta)Y].qO[S,RLVGQO\*HO\[9Nc# 1eݕҾqٺGy\ԭ4r|׳],z>㠥a!bijb&)Gi1PIB$hٮ>}z]ݳjxa"/jrjY;% u!f"p=ppGfmf⭏=ػ;R*ͽ3E62 Ò|*STA/dJq:מN[?):'%6_Rn퍻=)X]=K~cz,]Sź$xM\xũh8LCWW)fo]jw|{05m>!GURk*ZL$dS\zM8tc_ۓUn:!-~gUfge’㪋@"oU$66=›zioK7ᚓlgzvEyir[g q-%\4jϪ(إ )NN˪;k17w u5N:b%z_u`Ew:5T@URBC^kO/}C=#?M{rbB*)I*stU%5J}(gPW9)ژޘIz1==q:r &F54M+1j~޲5SMTnKTd u㏳Bꬖ-< _*ME[<);NZ13f\: dUcn}^]'`>7%1C1M\xMVӂ#1EWDAYM:s| aٲš4%]-;*0l$ITT5~]%54BSS*hㆡ5C=4.[Q>P +ruK;^,/_eَ߻֯K\V?+?o n x:t@\:z{vo,Ψonޙo ڗbo=vj\NaS U9@}>[ѹmw4 qcl%&n\\7ݩBw T.iozB=8Ǹh+ɬrJ/L m`s~16)c$44FSDd>p46u Z'WJO4-QOYd3$P"qߺJ=,%f\\MQ5`ަ>'\~*7 fd\UG3$qU ZKKSISKxaGE&QoEG<%Ei"U1!wE!bXu+#JL(VV)ҜEIxκcQ?\^D10kO5 Lu١CW1,%1i cK{2SMB1b;YҒJ6VhVDml.m{%IGG" q QSɸV`xMmM-'1rQVGh1#<`xx159fc=2#%rCKQQJiTä0mDk*u՘9ŏ K&K d_#WoіbVXNZhrfSFĭ׏~E4*Mٹ:Ao׸uMË_ߺM."k Zl?#ߺM!v$/#)zO {^6Y=MH[׺(8.uji*ߎx~dٮB;Ƚ?_~9|~f!3`/$o~?әfY "CJTnH?K48bޢ+H} ('ߺK\BeI-H0 ZB.^,n!p}׺Q>#,d$XID &)1afZ :vJx*S[3aa'J+.[o~ {+sQKP؉ S6,Θ̌r\z&Ul-ߺBC'(]jHe?.!x*T#)@A{,,urʒTL†Zգ2$@LjVcmL]vPdjT2Q 3# y**2,JJ׺!),1jKW9h¬TaVxRI Py'{g%jS5TUF&RF"ŖHOh{c-JciZGj dVVg3ϤCuIO2Ue"WãK$4.I0׺t-SFtY8ѴȳՀYh rl->ӥƶY,zFdcᏒB- Ҏ=XڂZgIDl[]UlckyKl}Q˚iI_rE?`RڂU'߼׾](rRnY䠖*-S%)b*KW3fܵߏ:ˤC(fs#E.,<T<jtwp5 ~޵z=22"X-Q^!)>R~@e͖TIaN4GG%cgQ!3Fܸ~^GIgO +$K,"J UQ3hH誢5$CCI;,_פM>jM]MQ*< eFJoM;U)g]zosN QUSɅCS;Uejqղ,.5]M ̽$wMC,~TBO~U0<_I%fJLvvUTTji Tn~E1TPfqC<.AUJ~xu=ϴgvueA[XvNUUY ]GzLK*&$;^qՋm.Y^m|wbn=CYN'*< _#v'Mno\Púp0CJ,k茲x׾Η;%VH+39v;O ̶ܟ^4fsMњMyharԑ,\WS>V|mm|=UTnblb}lNw)S}qh 1(5RuE* W"SGU_"-76SԎu*ϼϤvjQQ,R,dH`^Cꈨߺ˨T1KQAB1\JCkS hnl}ushkfSI&3#6b#$9i/mU6S%d%V膚hI!RHB.muTtmݷpziq`vاCZ&BT+&; pHenn׺Bc*vwon)l؂.f]vaPGMXFͼs4,j$}׺V9)4`ajH+thZ;(\ƥ^ZG ׺tT9j1 ,YJv/3 j,k#;BT#H*ߺKtsOEC-Vmi8ܦ3W_9 jZ!,ctXȲ{^K1b L N!XHoM?8gihZgux,ETtUdejr53CҶs!h%8D0&zG(}tێ|VWYzj,,6Qe*Tkg8{^sQQgn)\1L hcji@*"$uv`d,J i3u4MGznZLv(qSŸ)AlL$$5{^*LD2IUoi); OѵUj#w.Ztrmoty-Ù5zlf4 -n>BM#EU* {tGu[ a1Jߦ=F1^Mo`!Xg {urm f`:V*|VE*e$4#DˣUǿutSOYLԴaQVkt}vX-lqb_ 2{ߪCSh2T5Ԭhxhk XzTOje%nA7bmW[GQYJb&U-H"8I#uqQf)Ęz̵ gNH`AI iH^RI{ߺMpekL^ZjjX#&CIٮ&AuVP1q(qIMYKO^ *M4RB!zTg!V:ߺI!uq5Q T-!wYTRH,Ե^&2UnctrU!OEE]K<^!;FtꚚEMLUO91whx7rɵ2{/"otaܘbyթ֧"!@ R\qǺAX\VH[;DbPH$$"[ܩ {^TR4m.05-mA.1+I)R[?׺YKCn6ch;<}̯Z8$krti"42?Ȉ$ AZX >׺Hg2@ѪY,~EuSX&A,u*)EJJ^SLVO$q>׺e55J ,PP MiJ~}uſzo+) #ĕ}Q() c d\(ks{rGuх: uα:2 {6u">_~3Ȓ)!YAI$؀ujD_S1SKa\ԨV4C~GEyv 5H$6{^2'#X+-6׺^6 oInH׺&`EN#齹>׺=:갵$H'C~3_]Xz,JߺM3kV_'ߺPdVrA ?׺ѵ /k~}uHHI^8}>O~w XJRp.=K*X-{/wTSUG&^x5Q!W' F#Ii*VZPA=.F'ڤdEea#af"џc{DǞPjj)+i6*wW] ;HĐ{>ngW&N@B 3 %Ӄ:w8 ׺ kcZ䂭\ 6 TƺɦDDKH  >k rG,2L^%T3},1)h`z1n9uucF-PRhBTu(@Ф7:[ߺH֠T ,/PTEYR@,=W_~EgFfGd Bef y{^M3IN)*e9l8NBM:LJ,9^=c-Po]lM"H }@ߺO4 BJ,NRI\jϤLoo5iױ{6O Qn.MLeF9XR:Uj8U:)C[ltN&Qܮ̌NS",upVPn\\xo {וN:ǫF|l%~-jDgfv/USn㻯q;:9gz6׏el\6/+i8_ziZϭjRnLjWEn SfrY1N~mOd;V LB]IVU=iױ>OwwbdWWo7[WyWk3[ zMI][j1 0d_[K_|+A^ NZl*t7ϓY‚oFڃc)¬ٯ{Sm_IPhM4,S\_?c[raolj;NݻS+g+v.c6}FWOL"IKTQ[S^qֹ=y9yVy/vrj|Ysb6я<)/3itQ,L<1K:ԠF{iTfvW.ۓ>ǧᶿUt&Y>g T3GE*c? FP5&yUsgfěj>y{wQ]n,lT3r8|Xhzb$R:un9}vYiYx?C폞 փpX\NPSE~k''df0U2Ơ=dS7iMqK^,i] 5T9VX `Y͠0`}oW6>k}Z؝msbv6ARu]T41_gRm>3 048}yzZ8iq{nRcUY|J*<}H8usմ Sh 7颚d2GI׺Isx1RK!UA,m4ƕ إB;=D~+qty1kMVZn9vjjSin;~4ⱓpL8j:ɿ&g#O-CLTu^OdD'F{uFV|w~& 񸬄5L8ly*[m~1mtuRCSL)c⪊aHGHONX ׺'4&n;>Z 0)fx#6#RSZD-+ <Gf**iTYG,z 妯`C`;w&סkX:uWQA0c)l#fCO(1"GOuC܍Q8oOMEjLZRCq{'2ոt]׸z\ܦm`fRoZi+[nE邤)(HP׺ 궽].cpW"c:ݻ䦡\>>wd5qΖcou= fu9ltx>%+ $C垦sdRbͶ%%4jry($ӭbƋ??4{^)]ܛ>JOTWSpY*q;FUGQ{Aek}KsﬦL"NHw+#v=tQ&'-ӸTI:((II*ʚBtd'f hE.FjXfKj nnZ"hrT*ڼZ Ȥӈ卲$u r>!dٴ \;-SǢdqh': tgԮnlEtSvoªj S YZJxg妕eVYIҊ7$^ZJ*jV\sG%['W>͵2TW3KCF薞:ʲGmOx6S!\M4jG'4d@"(U^)6; NC! `]Y U9 rA-}vj.[! S xuыHhIȺA^?׺7jge o~"-HWX_Uocoǿu!%E#Dڀ TٕOu#sR"QYl>׺$.Y_1K=Z׺׺$l-k?_~cPy^벡nl9H}oH\+] {㛷ӕ5Y` I!_yߺOT"Ped!\!s O׺y|<#y/h}%!QT\ >׺{gŭ\4Zŏ暗'UOYWT_$) :p}׺;?Ӯc)۸ ji 뙮M[EL_'E 5RhI:2.Bomuܜ6e0Ʀbo~.%V*c#hEUHR 5y ]rOE}-DWUIGQO9Mbˬ3\=8f rXVJ#+jb O@ 5+yˢ֭{^- CHGx1T@U[=%,RX+\ީ" A;SOUs)㈵- Lu{}q׼j!F;VN))PUiI>:MR .O;]'d ]EM$5i!QU6{yeX zz]C8Hh<9GLQHh0$E*2oauﳦy yc` YDRfƒ8 {=}xuQZR*$) 55Qư,bGS˯tB#þBVYjDqyZdZuS O?326,>zUᨖEN OM$ NL,>\kՍ|sxՁgDkjtUQBqUTnnmj|Ed Z;}cQН F.X,nb)p흳zFޝ`+="GK5IMz>=6?KY݋]1Ղk18y *T繁 t##^T'_]xRyӤ.o_ F#6%7|^>/y)5;r~ I{4֨jzxs{q}q isX6vHݰ[[*z\KJFAB*aU*"=nueGWl۱=f9nte^xzklQ6OO6h&'!N-"x u:#ڧ]׸}KП6-ɼi)lo]_SLӏJvjHQPxgب:aѕCv~U1H*]nڛ+i>`J,ݕx楼)**<+\jrza cmm0[׹ңnl޶6:^5>x]bHGU U VUcr׃I7[ ܪ*sAKmʹu5KQNcgDwо` Yucl52gKm%c6֜腽qplcbi*}B6ֱ,ԁ([ۏu46m >5Wb1>*BHgubT7%}t:Jڂy @Np0H(AGu#uHh:zˋF!Rk% WR0̯![ ^KH˦ 3,R)5K^HXb3R,X< 7*5UB2RY܋uMSgɢu,C=Qh$t";=tݳ9k^1MO+1/q$Txk<'msnkY:-%3RO4i񵓤jx/#X*9^m67#mML">m6)ᒚN2)h4:B!~ Ua{ujNbtvC ܘ ~ %JJg4NH♖Wdvb/ouɏ'-e^xZ!J++2t9eJJVeTh%!-G6$vk{tU*16D|Fςȼ&IZ t?PuY6C_ 5j ߼`S4/+rt(fJ:r3ql*6ve1lOAU'=R䤃ߺ@/\ &mVϬ`Td5>kdM<#*Dڌqt`0w?0x&TyV~H?0O㥤x!gYuAU*^ge)3ص1J-Ѣf*[(SS׺ TGZ*2UU!dLAYhVe*> tQtkU=?EKQ'Y`!!PrIMqu3cj3PUh2QLh!Z`Oε{^4Q*K* =W$SA4fY]1p2 ة7>7f4RQT+-;VCQ ~M{'FN֚h\u1CTjjE@.@$^l=Mo'OP)?EH#ߺAV&'wtɡ?}#K)LB*p8$}}u,2DCx[HYoq>׺q]2Ơb5#ib?׺&B<  m{UK>JC?H\bIVCo5.=u, <,mbE؏~fMJAMO~H2)by{ud#@u cG_{kՓOI ?׺n0Yup+~A6?[ߺM3os6{^DϿuK\ݵso-}=u ԃ}͇x#ߺ]~l@o{c~A.m{)G{,dC8H&m{4X:o@OԸcab:@ߺJ :H_!t29ߺKQ++|+ -KMGI 6)GMKns)ieI{Y)1I>U\o(Yj52ƬZߺJJ\řC㨦4OMR;b 50_"޽K29<Ԕ5fr^ *! %EbN^}  >׺rah$AH2A=LD^_%JLUzک?@k{ycU,Z^PK  h(w`5I{^E->>2O=DZ8k)XR"*' zˤ.gc\yY:H'SZ)(ı'4GLC6'Lyq5f:'I0T࢞H%TZRZpXY8=pݿ0Ţicp.j -=>NX IN&HƤϟ^_t{1#UϘovnOIk9,٪bf/%^?q[P&_RW>| >7$8{]1}Ņ5;[yrAZ6%4Y%tdCΥklpyϥeY?-Ƕ7~Pv=頫l TQKY SQ/cCWL|r׈?˭ӣ?[n-fɮ`v{[sn ^4a2*.9y򛢝PJY&A.bx3[yJxUdv`7|3 گ=LhT5ؓ> 58܅^ +øi d5c9I}>7 lt)X\$ucߺAEl9|vK!o KM &Ko$X.&`JbT,򑤈׺T;j})-5A۹^Hqr;V%%SUim4 ׀x0xs䨩ij0{!H"<ѬX׎UsF,GMW_X,5$Y \մ~Ji* |( M)@FHf?S{[vrAO&fZ7M.1YlVI);Ce+2Ѳ\"]Wu=*5QEQ%N&;6O"gwAbF#OJI+~[3ƼjUf'1@NJKPm;_ǿu<ZyY HUVspG~$eIc(TeS߆zߺ\ 8- Nt'8ߺN^d_\~'PkO?@'VkP{^鮡_P0l> \"^Ԥ`Fc[{^*KV+Đ-:}u0>` {]W?ao9#Sxے o7$^W Ldu؞4G^՞E$2tyRxuKr4if<rlO^@6RZ{{!@}u EPYx/~D#AA{߃n-ɷ"ǿuڀ<^M{!vq! y}upcQ[ٜp|jmr=u&:nP*O~NZK`^-T :c2*HJ]kͭ~)k3oua+GX FY$Э+"XZ&jM-}MbZA3b[ D0Fժ^!&E5=dEzK9_-Q25\\{˯}seiaaND$`W ea2y%qac|YMqRbR<==VLM4`Mr4D.=%@zVc"5IK#@*cʹӤMR"E27rxYv)UsƲ,rU{LRW3sG=z )ZjlcH pHkPVtun}{7%n>z SPӵElT1UIM„a%RT*bӯS:L.̧#ɴ ^#|EmmTmRztGOWgt!Ti,-׭WTTR-}:c>hi Jk1HȰUX) X'% BMqMYRV^9QjV}dYK 95:}:[n1YNc`u3PPˉXa5ci)*HY~SápXL6Jk0;:ꪶk0t[89H'uGPf5Ƃ*l\ɥԨ=Y+Y(vYyv0j6L/-W6Bi+Z*/~]{?M׻{Ku3^o8*6*s#>^drwfɆ1-X򙼬RM)'=nژl'+2=!PwdIWA<8]fG J)>6;udq^+[06-%kqtmGI_ ȫ͋:)\DOSϭ]" jzݯ:%i1A#OVk?6O)y0?ש[{,Wڞ!^d?TxOYA([6\|Êmk+<ݽ42 jw]\5r]8UjcjGIlco\^+gWޕX&C#ܙ:u׳F3SAJ[WD?uC: ?.^-ĉj+JO/#suDUK% XcuQ^bghg\f7N_(c KTSb8 EUP,Af#ʝhCc*ic V=Ul4,>^O6 y+]c#Iwuzf겐hzH)9T٩UGR9Z6A3 1Ÿzn:ؙuD9LVYwn>pE2nݱT#?wd]N~>G^A$I_UG*mQJIj_gI0/Ʊ`K{={6!QKI `IS/IVK~\24S)hp=ti4a&JO#ZfC]OQU-XU.FremKS<ӸԨ{z: z_gaMe Ez-u7ۻ.zF ~UlvZ"^zr\uB,4eT+"fّVZjꜴX*wJQHtgHCo~!7Fַ1QS%$Bz ,54,+5BK4CL3h ..Mucwc~p>U&}Vªr*>M˕)k&  !OR}ԦmNaE 0[ߺK $8jfHxV䂪i*RdW,_nO, /{8iRS j*Zs▖֐-9GpP؏~+b(ks2=^:SIYG DԲK XR":#M{#G<5ZS,MLu#[LF{dg6Tz}υV7'&Q*x**-e%{SmWESpC*\O5Z ^2ZYc/Ŋz9‘TT+hR=tlme>r$U OCqS kb iѧق+hzA5>hRǚU"P;ef(e^EKEq9JghɇA~LASd&GfФ{tToθڸg+%8i{}hjc3۔TU;@kȁ&S-5un*caYAQY %EL)** ɮ6t(bRmj!YdmŘ&8k<1Mi$@Xƺߺ\*N)sytz#_WI"ceT)NGeTSҙJ`xtoPAW۬y*j8Hc4I|~D¼LB =t%Pr]_Y+s{ ~PQ)!2,ȭVƯ0h|׺Adܴd. -{ώ%3,!v3TfkmOo\#avmQl.J\k#Eۘƅ$E `(b,UJHB{nۘ-+94>?%1YZI=TuhƭĠ+{t#`ɵ1UQj%Hhuh֦hdRX{^!Qa*kpKǬ11J=.C5QVWL#mӮڙqkƮ6I>jȞt0kWY|d}tXkg4Ih殥lN CTG$-Il|ܖBG/vԬ"~5[rsgH FOi)eIi*^9KɌ q<4qMU#c.l;+R$H BOP``eib8r[k! C6o%* ~a}Ff'MCrn0$TPPdT^MC!zXQd,׺Kd6m<& F_Vz**12ә%&: 2Qcf)+EO %v_e O:ZdGoyi0ĺM;["$s-2e%UNSuġFv`u+[r8{^%=CAr&Ӄ<_uR\Ԗasqnx_~c+eekP_{^馭#;)7ЅPa{F[Yy7Q^,3ei5[q9Sum"X7kݏߺ^ ]H@ !GOuN}׺:Vp/s 9q{^3Z6/{r(?@oq{kno׺E?=uɤ[~Gң 7m{k)A{^k_|/o6wn ˺0 cEEZxO,ib::qMմ{Fُq<{.$\G7DZb-6rXY  L={z\6PSӌ=9jcCiRP]~E[Xz>¾G~)*8ˑ%;9|B |}Q%]}M<h ,:1gZT>ik!m᰸ ,t4,c ognm_SS̚|h)q/.ŕܛÉE =;*(Tf8%I ȈyR=l*jGQQ[VC=4seRzlE3tiINQ/\Z4ǹ(*uQTT1CZu?RLY@_.$a]*Z ,Ҝ}M4qQ /!T,4޸רB"ycU$Fj*- ߳ǮE}R}V.I}t|#on =*ap; q8|mfjrH|ڐS̖f߈׼;X\\Gڝ^hh<TU8AH"2ΫL}ctU9/&ޣ%>e\n*D4q6:M1<[/{ˏ@s{4Rf;+ei1Ja9'2պ#M]moϿu9T7^S4JƔ+I]IVJuM)J)bT]mNRNzk班uzE<(D8H2I`lCXҲ~QTJz`IPfibW@$lB`A>׺zRr2SSO+OtG4Ҥ,Fٯёuml\g`NcJx9j(Y;(PboK,%'8(3uTGIMtY!i+)BIN~*j+24)-6kd34rylv/WAOXkaCN#-$U $MF׺0SOE*5U=FR UO^IR*gIVt eWߺCNX?%%^R4T&K URj$ij$,yke3*ަwE_6uj!2Pn #j*i/* !{2jV/솺sm<瞞Bc'0${fx/bk#QiRfkj/ZWT\"HPx^j [OjJ[;rˋm_5u$tXx |9ڡ 2CQ4Ы{^+Ma-[{qd)hgեU vz&|u],x^GRI"ftunOPcmϢzdȨ(h7F=XڹdR2i&#jZE'{M66W>>ꭓ&B:V7bSUIf {^L>ϥ\e?&cqyieLu*j<]eG@A^i_>'AA}h:G=EdSˁZUXƏ<{^6K%[."5GL*VAP*Q#JuVpH,ďu`Z_;OZ-9/þBrП.E(VߺHӇ;@"%%&hR$1ϷccZd9 %HfYZ!$u"=TP:*^dp捖(릝Q_J*Ӏ[-׺Nd)X㤮5UװIʵN(gUȹ^'"rV%"Ԍ}=i  LZ*u~;nA^nUG8YV{<#Y,YNo~Y,dA= C,mRޥ~Y~u 8*4Cڈ~ ([x~y>♼6" j:'y_ߺAUƞ?{YN67H$ͥQTjҶ?{^tuwؒdqr-{~ߺMGs h?o׺(T!uFS'6yԺyNj)*IО<~tFppơbx=uA!Dap@%Z{೨fm}~`d7H6O7{^[}ȸ%{&$'T>׺_?m{'#7?׺Ƥ "}}u}n `Oux!ssX/Žu&ꬃu?A7ߺ\ZY p|%u#`m0'Q[ ~^ցI>.OJ8?{wFcԩjx,*Q'Ӆ@jfyZq "ZP~HAmo~غjiC+CZXbURROu}Jii~Eij!95%22eR<ԟ`$O Ps.0I]lURmMh89iӺ,`E4 oX`}xrG]ύI㎎w/NC9P ue7."MQ4e|n>*CU M7Hf.S={FܧNb7&ڔ[2ؼqb68ܓx6݂w-24ƭ {={9R12$TZ\W4U TjbHjie"2@3U;{V]%49.oجb55sĬ޽,퀬aqKGhUjZ )蚝 b9Kdziǥ<S:ͽݘvSe!se &G 뤤N/6-8Lv-T&y4׳Zo7;ۻ Rd*dݻ_VV\51J)4K 'ƃϯdiƽ6Srӌ}$֞mEW#ԛ%ڴI'S$Jx4#gKλmfeqzE榎I\U5yU9y߁`MÛWmwso^(#nl(s8٣b0uYXRү0Y|[Es-=DUUlY&U% BϑJ% SzF?sX u-_pdUY⛀>jWs{~m$SECBY b򆑇uy7Q&ϤC[z\n37mUՍR QI:^#>F{pf~F *[uJRZZ qBc&G)[N"J>u0?Dj:>tT4I%Lj(rM- ,RS& ԼXg]7S{%3PPc' 1 q_j9"ov}j̬>{0q8j4ts϶ Y&@m*BZ;cJ5Ӡ)Jccl$uм~{T^JWWfR-$ Ska6?uCP)9$귧0̭ _XPH#UǿuJJ @5jYZFQUuXL `W pUUu<IߺK* ܪ"E4*ơ)J]*b:fOs{;KQU,an0~ l>u﫛TUt%T{Z׺.pɬJl,тrD/nߺ\Ʌ)c3YAB>#׺"*ug23ߤ(.k^U$zUc%P@1ZB~o~M1J51,4976[k~,q5,GOQ4U)e0Mַupv^&d'jVdtj\Lp"k`}׺Q71C\7NHUf&O*SGjfqM)/&%V dfUJ[ܹ{͎dpr1m^ZE$Hr4?5Y'J܃uᮩ\*sSV=RyZ%EXU@^4"2d>`LBE7 >ƴ;綬Q-5vܒWT:?C{z]ˑ%Lx;)i3X*vW9d.1fBc$0GX['v)hxhjfW#R 7CWHJ̎2%ThZujN8ǺH]ݴ*2n:s:JjYQ4X秞>tUyi[ ukT zTurIR>23KnY#ȨKj%Kg)iqU9$%&-yIQ (<Q^=׺;[7[AS.FUw''Zz+")YT{tfe1X,N2m]m۶ӻ6BFQ8T(GI遣 }t;ɱ]TZidX*d7lUsbݦIT62YT{u'qܮJ'I yZrTcrx`ijO]}c;n]3/u[QmpT8xK`zC=[)*6HDA?.t-{O.K-jDXvî;SddEƱA:]\^VjqtGv dEE!+,,K?>-j3ɼ2ۢU^bT4JC'1Ӧ4xl%d^,NjxRٽD5T\vB[Z \_ߺHj1{woqnZ\zHN1$͎cDY**j>@rߺ@jُK5&=2׭9]jZ*= bp[ߺA.5P!YZ,T0SeC i4kT:0f7>׺ tOD#NXz)+ZMBٵLGЖ׺J=,X%U]u_j =2`Yhyx#F(uQĶ:rE;;Sȵ@KzcɐSVBJdkfx?I7u,ܪZa-+PI䞘FKkQ%,č$s71FUͬj#{^&L+GW'Ԣ-~}tt6%GߺPxLuU{+"z-7.}}uP/o?{^눎I&)?ƒs׺)*gJbGZ߃ߺRE:x%XU$8#14F-`A'ߺ\~N] 4*Ef#O>׺sHUԒE"Sċ"OuM&_#GInZ+}f cMzQS詩{=.?ed;xd7$xv%)vSvq_i`bH8K OJ74pŃxSKCY])겵ԂD`GuJW ;E3*jAGUJIAHiE42{Yو)%4Q5|1-c+/83)k?^>{lK!qTDkXxYšU u,efBB-Pt$<3y8%e}H>zYeed$5s-}RS5"E<ȴa:u^N5ïWmY=VF#z5ղ<444t:8IcHT)RiMKnNBEjj\%Q0AJعyq@ 𹪠VD}GVG>:8jn⫫jl>'zeZZaLILMfs!N\j5ױC^Nd1[[C$.J*<:sZWnZ* 4s˟H[jpvۛ3SIľ-1UTȹ)k&'U#Bu+KS2]: }={\t.Z 6j[MPE\A2aY #H&EFk>ϯ׮;\⦯CLbc>BAu"jfz)cO)}QLeCQֽ_'#RӖ~ߺTMbGQ@HޟTコVh `D!gLl[WY(jV(c Gb2T9}?V~k%Á fajwSJJ15A$¢s4ڙ@.std7|I!pjlti"EΔay!ưH!V>ON ׺i2B6zL 4O'=4%3v@~,Oub}TPk=CUI)&T"WW =^\r* 15*S=(fZȅZ}3Ci%lOPՒyV)8I#imPbM~JjgI (C$2+,M[ }EC9%"F} IT&PL,_Ou,5E$O Ǣ( d$-TuꌐKCK'GB2IdY@!6.rֻU m\0BA`` ,[׺qٻz2Ѽmji&{S}%ސ?B/q_h&~GSLcGU:uQktA*p2Vnr "KO)Ko#$:jzvF#o{i$Uȿ,JXsߺS#De+{^p?TH$uUP0*"JH~OI#9ElN^=t OȲhP ќ! YR'ϿuܕȇTFc"4@62rA}t5tRC0N=CoG{^L:sO!d-QHu^ӣ$cjŒyj(q F /.z  ɳT`N7mAľBcmύJU-ƐHјFB HZVS9&b)s LcFa$Nc7T{t<-osS磦j9QKY"y-S d+AjBHT˭׺M1ؼ]%XG_dp(9+Q5dLiQ$sҒƒ_^HNJvahfjԤy#Jp >xB2tI1- 5ԅ"nsPU&.M03C1ҤSԱItڙLf&u[krqY01DP3 kɤ$>;0Eo,{,%^HdwF~}ٜ =ԴсYDbWg$\tCY8~ە5kbcꪱyOM镞J㴓YP0׺Fn2Z\~J YI=Mp*s1gF5Xibā]Qa+tLup;V~J8Hȴޕv>Jtl]&o&"j|5 )2d7B,6@VX22>6OqTQc76)H #-F:LQDr`#Ÿulj,~6eQD-FbV;j suQG,p± ׺g`cvCaf=*ʙ?]P~WP/2!xˤ31^1)r{wnj*'Z]*#p(tfJys])i'6 h꠪o(|8<6Y%H5g[>׺̼,:ʍ˵?׺X)bYc:H1 iD#jL]RH XMt<Ew[&jyŝ ݀S[{H'LԋAW< $#Ub@Ƞ\8!qumfKJ8`#EO _XkOבo~l\R9\Uu#=tnDSA S3,HZ5Vňt dqf &a&6ԮnO =tQ\(~ܗ M+Rk-vB\ň@O~`=u<~?K?~bpx&Ï{^3_'{R, u #3K*k~M{!.*̷׺QQkIf.ěěp/A~-{)P/qKҾcYbI3>FS-bXA<{&Ϸg)GzFz#:c*4L!&7MB®Ԭ~L[cNƚZ \/.)}`&*Yƫo~oJ=$yz}Lce,>WI%hc [w${={龟2)´kUMHD }Wc.A{j*60/ t55QF`4 M4ijVX7<\ckjCQ#}-YMAem) %0Y*IH,=aϿuC5e3 YZvQS $uԐk-!Gu`뫇#C$"JȑJuBĶh[ߺR!zE8Z9WQ:Ţ`UY.ߺJh+R N\Z*l *ƍ i7_=%Ҏ<:9PJđԬNhJkzWuZ׺ҳޤ%P?GU<4`rH X{^8VZ(bH-{I@$DAY]Uu% ) kl ߺ]%DOؕե]OQWE^鐬~`P (ԈtĒ=t:+y:X=. _~`t_#kֲ Ko~b3;d [.-6 G{^K\1&FDQ1"mnQߺBVzӺ@Yh;m.@/{ln(@,qTWPR&EKn4IS/4dfgXd CGN+ۛoË꼶3 *lx{wQʲ+k+QSqDS[ߺK=`ݯ63)9+BI]5S}"jL>EE׶6y ( "Ë}?{^<2#Fn sk>~~b{)~[nEo~zRH!`lܟ~De!okrxߺQ$- ~DepAC{N}n9#nG߿u1n.o{ O~p+s{,?Cu꺢 ݯpO6ߺ^?[au[&[ǿuq<~>׺Eu3H̡IM?>׺wDAy"LroMIƪďQŋ~HJK1Wj51BP [ߺQUcWԢI_vbA׺_$`A$fFu*UYbte/ߺS*E^D|k RK6uX,-=9tIQ(uR&^6e&zgREV+&=gC"USAG>HHp,E4fdP#*Gah)3AOI%Kj/%deEMbk{zBJzhVoo %}搤AHlE׺]D\aӘ)fԋeFwV2Be n_m~dkrH`Y >Ta€TZM'ߏ^㞓ed*Φ^e6ؔjF$6?Q{OfE CzAt?]$$~Ht8i $HߺQihC!Rlfoo?A{:*ZAoY= Hňk6{^MjM!I(fhB׵>HΥ5x^u2"XS<ϒ -'RV ]\QVa{t7pO=BS;<5FlNfYRrR~-b+')K"P2zgYeq4˜X_ߺOwfNSPcSO[rMA40ci/bAߺK'| ׺s^ޑMIUb$W|4ͪ3fi/͉}tHv3wK:ՠX*| h "׺Q(&9QZ$T/D` WQiF/~Goi|8T͢8A- f5-=+v ,M7Fvj&HctIH9?O^#n!EE0iccq2b8cԭb/o_WݯCWߛ{^M^]Y?rK}-zo_{^=t跜[ǣ s+{ImMb?7E__ԑג{}?QO}5jߺM՟&k4n~׺f0ڴo_~'!?Oѯ^WE =:m :{?my,9oς[цo7Ga򦯶78я~//OQx 7gw}5iE:-j'+O׺7}O+ϣ4_K-m{^O<ϛ*?ka>[:ݽtv/ĿU쿍~ׇ_ף{m|h`/_~oi?k}]u{3?}f5x-_z^τr| N)2Mk?7Oy=~=Zw_u?Kͫ:=Wr׺JnQoφhSx kx|ߺJ8wy~~/+~Uu7!?^x~>˯x~?oǯO6ctcoO+d[-_i<:> _^׺w͛ya__7}Ϳ{_:t~te]3^\"~_F_uM?~0ˣZkCy:k~է{^uŶV}.KZdz>׺AgG}vӆT[W}^׺ O=Zt>{^Ӑ[ᶔyu{^%п_3}>{/P7kɪ_=t~-n~O7ӍZy?E׺'o4~_{^7~׺?ַuiO~_ſ^:'{^_~~@6^_ſuaoǿuH}uߺ^mߺXߏ~Fo蟯 ~=uC&?}uǿu?Ͽu^o{QoI?ߺY _}6[ߺNV=j^O~4^ko{7:~-{_1{}3Oӯߏի鿿zu_[?}?Iu.˒ŗ%g]IMuot~ѣ:{C9tIFӧG-WyeZ ?~~'_yj߽:Y>N?aQ>sO߼Ik_ﭿi+thumBқN_on+xίs}׿u~]^Gj׺ou~?'6?[kߺ]6iO6_{^I]2hy-o{kjNoλ=æz_M}Z^aL?y}3yKg?o~åVӷ;:OO徯|hф,G/+|o_u.>~_'ͽu^pkDo{%AK}[{~G&gSܿ/~ k7o=^׺q[e?tko&W(O@W X}_oiЉYKS#[oS1?_uƟůWֿ}<ߺ\2?s;:*j}路ߺ\rovyf O?8u~m ^I}>W'_tܥ]?Xy=M_~sponge-0.3.1/tests/functional/data/some.txt0000644000175000017500000000002011244504474020520 0ustar gabrielgabrielsome text here! sponge-0.3.1/tests/functional/module/0000755000175000017500000000000011244504474017400 5ustar gabrielgabrielsponge-0.3.1/tests/functional/module/to/0000755000175000017500000000000011244504474020022 5ustar gabrielgabrielsponge-0.3.1/tests/functional/module/to/.coverage0000644000175000017500000036607311244504474021635 0ustar gabrielgabriel{s0/home/gabriel/Projetos/sponge/sponge/template.py{iiiiiiiiiiiiiiiiiii ii!ii#ii%ii&ii'ii(ii*ii+ii.ii/ii0ii2ii3ii4ii5ii7ii8ii9ii:ii;ii?ii@iiAiiCiiDiiEiiFiiGiiHi0s@/usr/share/python-support/python-cherrypy3/cherrypy/_cpserver.py{iiiiiiiii ii iiiiiiiiiiiiii#ii+ii-ii.ii/ii0ii1ii2ii3ii4ii5ii6ii7ii8ii9ii:ii<ii=ii?iiEiiVii[ii]i0s!/usr/share/pyshared/yaml/error.py{iiiii%iiii-ii.ii0ii2ii3iiii:i0s"/usr/share/pyshared/yaml/loader.py{i!iiiiiiiiiiiiii ii ii iiiiiii0s,/home/gabriel/usr/python-libs/nose/loader.py{iKiiMiiNiiOiiPiiQiiRiiUiiViiWiiXiiYiiZii[ii\ii|ii}ii~iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii iiiiiiiiiiiiiiiiiiiiiiiiiiiiii ii%ii&ii'ii(ii)ii+ii-ii0ii:ii<ii?ii@iiCiiDii\ii]ii^iiaiibiihiiiiijiiliimiiniipiiqiiriisiiviiwiixiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii0sC/home/gabriel/Projetos/sponge/DynamicallyCompiledCheetahTemplate.py{iii ii ii ii ii iiiiiiiiiiiiiiiiiiiiiiiiiiii ii!ii"ii#ii$ii%ii&ii'ii(ii*ii3ii9ii;ii<iiDiiIiiJiiKiiLiiMiiOiiPiiQiiVii[iiaiiciieiigiiiiikiimiioiisiitiiuii~i0s"/usr/share/pyshared/yaml/events.py{iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii ii$ii%ii&ii'ii(ii*ii+ii-ii.ii/ii0ii1ii2ii3ii4ii6ii7ii8ii9ii:ii;ii=ii>ii@iiBiiCiiDiiEiiFiiGiiHiiIiiKiiLiiNiiOiiQiiRiiTiiUi0s-/home/gabriel/Projetos/sponge/sponge/image.py{iiiiiiiiiiiiiiiiiiiii!ii#ii$ii%ii&ii'ii*ii+ii,ii-ii2ii3ii4ii7ii:ii=ii?ii@iiCiiDiiGiiHiiKiiNiiSiiTiiUiiViiXiiYii[ii\ii^ii_iiaiibiidiieiigiihiijiikiiliimiiniioiipiiriisiitiiui0s%/usr/share/pyshared/PIL/ImageColor.py{iiiiiiiiiii&iibiioiisiitiiuiiviiwiixiiyiizii{ii|ii}ii~iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii0s(/usr/lib/python2.5/compiler/pycodegen.py{iiiiiiiiiiiiiiiiiiiiiiiiiiiii'ii(ii)ii*ii+ii,ii-ii0ii1ii3ii5ii6ii7ii8iiiiiiEiiFiiiiiiKiiiiiiiiiiiiiiiiiiiiiiiiqiiiiciidiieiifiiiigiiiiiiiipiiiiiiiieiiiiiiiii0s/usr/lib/python2.5/linecache.py{iiiiiiiiiiiiiiiiiiiii%ii&ii(ii/ii2ii3ii5ii7ii8ii9ii;ii<ii@iiIiiKiiNiiOiiPi0s?/usr/share/python-support/python-cherrypy3/cherrypy/_cptools.py{iiiiiiiii ii"ii#ii&ii*ii,ii.ii/ii0ii1ii2ii3ii4ii6ii8ii9ii:iiIiiYiiqiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii)iiGiiLiiNiidiigiiwiiyiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii0s2/home/gabriel/Projetos/sponge/sponge/controller.py{iiiiiiiiiiiiiiiii ii!ii"ii$ii&ii'ii(ii)ii*ii,ii-ii.ii0ii2ii3ii5ii6ii8ii9ii;ii<ii=ii>ii?ii@iiAiiCiiEiiFiiIiiKiiLiiOiiPiiRiiTiiUiiViiWiiXiiYii[ii]ii^ii_ii`iidiieiifiihiijiikiiliiniioiipiiqiisiixiiyii{ii|ii}ii~iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii0s5/home/gabriel/Projetos/sponge/sponge/core/__init__.py{iiiiiiiiiiiiiiiii ii!ii"ii#ii%ii&ii'ii(ii)ii*ii+ii-ii.ii1ii2ii3ii4ii6ii7ii8ii:ii;ii=ii?ii@iiAiiBiiCiiDiiEiiFiiGiiHiiIiiJiiLiiMiiNiiPiiQiiRiiTiiUiiViiWiiYii[ii^ii_ii`iiaiibiidiieiifiigiihiiki0s/usr/lib/python2.5/posixpath.py{iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii)iiiiiiiiiiii1iiii:ii;ii<ii=ii>ii?iiAiiiiiiiiiiiiwiiMiiNiiOiiPiiQiiiiiiBiiii\ii]ii^ii`iiiiiipiiwiiyii|ii}iii0s!/usr/share/pyshared/yaml/cyaml.py{iiiiiiiii ii ii iiiiiiiiiiiiii#ii&ii'ii(ii)ii*ii4ii7ii8ii9ii:ii;iiEiiHiiIiiJiiKiiLi0s$/usr/share/pyshared/PIL/ImageDraw.py{iiiiiii!ii"ii#ii$iiii)ii*ii.iiii6ii:iiiiiiiiRiiii\iiiiiiliiiixiiiii0s*/home/gabriel/usr/python-libs/nose/util.py{iiiiiiiii@iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii9ii:ii;ii<iiii>iiiiiiiiiiiiiiEiiiiGiiHiiIiiJiiiiFiiiiXiiYiiZii[ii]ii^iiiiiiiiiiiiiiii=iiiiiiiiiiii?i0sG/usr/share/python-support/python-cheetah/Cheetah/Utils/WebInputMixin.py{i&ii iiiiiiiiiiiiiii0s/usr/lib/python2.5/pydoc.py{iiiiiiiiiiiiiii ii ii ii ii iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii ii!ii"ii#ii$ii%ii&ii'ii(ii)ii*ii+ii,ii-ii.ii/ii0ii1ii2ii3ii4ii5ii6ii7ii8ii9ii:ii;ii<ii=ii>ii?ii@iiAiiBiiCiiDiiEiiFiiGiiHiiIiiJiiKiiLiiMiiNiiOiiPiiQiiRiiUiiViiWiiXiiYiiZii[ii\ii]ii^ii_ii`iiaiibiiciidiieiigiikiimiiriiiiiiiizii{ii}iiiiiiiiiiiiiiiiiiiiiiiitiiiiiiiiiiiiiiiiiiii#iiiizii%ii&iiiiiiiiiiii(iiiiiiiiiiiiii^ii-iiiiiiiiiiii/iiiiii iiii.ii/ii1ii5ii9ii:iiiiBiixiiIii7iiLiiMiiNii8iiRiiTii9iiZiiii:iiii;iiiigiiiiriisiitiiuiiviiwiixiiiizii}iiiiiiiiBiiiiiiiiiiiiDiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii9iiiiiiiiiiiiiiiiiiiiiiiiiiMiiiiiiiiiiiiNiiiiiiiiPiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiUi0sC/home/gabriel/Projetos/sponge/tests/functional/templates/test1.html{iiii0s/usr/lib/python2.5/StringIO.py{iiiiiiiiiiiiiii iiiiiiii'ii8ii:ii;ii<ii=ii>ii?iiiiiiiiiiiiiiiiiiiii0s?/usr/share/python-support/python-cheetah/Cheetah/CacheRegion.py{iiiiiiiiiii ii"ii(ii*ii0ii3ii6ii9ii=ii@iiDiiHiiLiiMiiQiiTiiWiiZiiciidiifiiqiitii{i0sC/usr/share/python-support/python-cheetah/Cheetah/Macros/__init__.py{ii0s3/home/gabriel/usr/python-libs/nose/plugins/cover.py{iiiiiiiiii0s,/home/gabriel/usr/python-libs/nose/result.py{iiiiiiiii"ii#ii$ii%ii'ii(ii/ii0ii1ii2ii6ii7iiDiiEiiFiiHiiIiiNiiOiiPiiQiiTiiUi0s?/usr/share/python-support/python-cheetah/Cheetah/Macros/I18n.py{iiiiiiiiiii&ii!ii"ii#iiiiiiii$iiiiiiiiii%i0s#/usr/share/pyshared/yaml/emitter.py{i ii ii iiiiiiiiiiiiiiiiiiiiiiiiiiii!ii"ii#ii&ii'ii*ii-ii1ii2ii5ii6ii9ii:ii=ii@iiAiiBiiCiiJiiKiiLiiMiiPiiSiiTiiUiiViiXiiYii[ii\ii`iiciidiigiihiijiikiiliimiiniioiisiitiiuiiviiwiixiiyii{ii|ii~iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii ii iiiiii ii2ii3ii4ii5ii6ii8ii9ii?iiAiiBiiCiiIiiJiiKiiLiiMiiPiiQii^ii_ii`iiaiiciiliiqiitiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii ii iiiiiiiiiiiiii*iiAiiBiiDiiFiiGiiHiiIiiJiiKiiLiiMiiNiiOiiPiiQiiTii\ii]ii^ii_ii`iidiiniiqiixiiyiizii{ii~iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii ii ii iiiiiiiiiiiiiiiiiiiiii ii!ii"ii#ii$ii%ii&ii'ii)ii*ii+ii,ii-ii.ii/ii0ii1ii2ii3ii4ii6ii7ii8ii9ii:ii;ii<ii=ii>ii?iiAiiHiiQiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii2ii3ii5ii7ii8ii9ii:ii;ii<ii=ii>ii?ii@iiAiiBiiCiiDiiEiiFiiSiiaiibiiciidiieiifiigiihiiiiijiiki0s/usr/lib/python2.5/mimetypes.py{iii'ii(ii)ii*ii+ii,ii-ii.ii/ii0ii1ii2ii3ii4ii5ii:ii<ii=ii>ii?ii@iiAiiBiiCiiDiiiiiiiiiiSiiTiiiiViiiiiiiiiiiiiiiiiiUi0s?/usr/share/python-support/python-genshi/genshi/template/base.py{iiiiiiiiiiiii iiiiiiiiniiiiiiiiiiiiii ii!iiii#iiii'ii(iiriiiiii ii9ii:iiiiiiiiiiii7iiiiPiiii1iimiiiiiiiiiiiiiiiiiiiiiiiioiiiiqiiiitiipiiwiixiiyi0s*/home/gabriel/usr/python-libs/nose/case.py{iiiiiiiiiiiiiiiii iiii ii iiiiiiiiiiiiiiiiiiiiiiii ii!iiii#ii$ii%ii&ii'ii(iiiiii+ii.ii/iiHiiii9ii:iiiiiiii>iiiiiiBiiCiiDiiEiiFiiGiiHiiIiiJiiKiiiiDiiiiiiii1iiiiiiiibiiciidiieiifiiaiiiiCiikii!iiniiiiiiiiiiiiii~iii0s/usr/lib/python2.5/glob.py{i ii#ii$ii%ii(ii)iiJii7iiii1ii3ii4iiii8ii9iiiiii*i0s'/usr/share/pyshared/yaml/constructor.py{iiiiiiiiiii ii ii iiiiiiiiiiiiiiiiiiiiii ii#ii(ii/ii0ii<ii>iiiiGiijiimiiniioiiiiqiiriisiiuiiviiwiiyiizii{ii}ii~iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiuiiiiiiiiiiiiiiiiiiiiiiiiii}iiiiniiiiiiiiii ii!ii)ii3ii5iiSiiiiiiiii~iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii0s+/home/gabriel/usr/python-libs/nose/suite.py{iiiiiii)ii8ii;ii<ii=ii>ii?iiJiiKiiLiiMiiNiiSiiTiiUiiWii]ii^iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii ii ii ii iiiiiiiiiiiiiiiiiiii#ii$ii%ii&ii'ii(ii+ii,ii-ii.ii/ii0ii1ii6ii7ii8ii:ii;ii<ii>ii?ii@iiAiiBiiFiiGiiHiiJiiKiiLii\ii^ii_iiciidiieiifiigiihiiiiitiiuiiviiwiixiiyiizii{ii|ii}iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii0s)/usr/share/pyshared/PIL/PngImagePlugin.py{iiiiiiiiiiiiiiiiiiiii iiii iiiiiiiiiiiiiiiiUiiiiii iiii"iiiiii%ii'ii)ii*ii,ii-ii.ii0ii2ii3ii4iiii6ii7ii8ii9ii:ii;ii<ii=ii>ii?ii@iiii iiGiiiiIiiMiiiiQiiiiiiziiii5iiiiciifiiiiii?iijiiii}iipiiqiiiiiiziiii*iii0sB/usr/share/python-support/python-cherrypy3/cherrypy/lib/caching.py{iiiii"iiCii%iiii ii ii ii iiiiiiiiTiiiiiiXii9iiiii0s)/usr/share/pyshared/PIL/PpmImagePlugin.py{iiiiiiiiiiiiiiiiiiiii!ii#ii$ii%ii(ii.ii0ii1ii3ii;iihii~iii0s"/usr/lib/python2.5/lib-tk/FixTk.py{iii iii0s7/usr/share/python-support/python-genshi/genshi/input.py{iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiuiiiiiiliimiipiiqiiriisiiiiiiviiwiixiiyiizii{ii|ii}ii~iii0sC/usr/share/python-support/python-cheetah/Cheetah/SettingsManager.py{iii ii ii iiiiiiiiiiiiiiiiiiiiiiiiiiii!ii"ii#ii$ii,ii1ii2ii6ii7ii9ii:ii;ii@iiHiiJiiMiiNii iiSiiTiiVii[iieiihiitiiuiiviiwiixiiziiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii iiii2iiGiiVii]iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii0s+/home/gabriel/usr/python-libs/nose/proxy.py{iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii+ii-ii.ii/ii9ii:ii;ii<ii>ii@iiNiiPiiQiiRiiSii\ii]ii^iidiieiifiijiikiiliipiiqiiriisiiuiiviiwiixiiyiizii~iii0s/usr/lib/python2.5/rfc822.py{iiiiiiiiiiiiii0s:/home/gabriel/Projetos/sponge/tests/functional/__init__.py{ii0s/usr/lib/python2.5/locale.py{i*ii+ii.ii/ii0ii2ii3ii6ii7ii8ii9ii:ii?ii@iiBiiCiiEiiFiiGiiIiiKiiLiiNiiOiiQiiSiiTiiVi0s/usr/share/pyshared/coverage.py{iiiiiiii0sB/usr/share/python-support/python-cherrypy3/cherrypy/_cpdispatch.py{i ii iiiiiiiiiiiiiiiiiiiiiiiiiiii.iiii7iiii9iiiiiiiiiiUiiViiXiifiijiimiiui0s</usr/share/python-support/python-cheetah/Cheetah/Compiler.py{iiiiiiiiiiiiiiiiiiiiiiiiiiiii ii!ii"ii#ii$ii%ii)ii*ii+ii,ii-ii/ii1ii3ii4ii9ii:ii;ii=ii>ii?ii@iiCiiDiiGiiHiiJiiKiiLiiMiiNiiOiiPiiQiiRiiSiiTiiUiiXiiYiibiiciieiifiigiihiiiiiliiqiitiixiiyiizii{ii|ii}ii~iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiDiiFiiGiiHiiIiiJiiKiiLiiMiiNiiPiiQiiSiiTiiUiiViiWiiXiiYiiZii\ii]ii^ii_iiaiiciidiigiijiiliimiioiitiiuiiwiixiizii{ii|iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii iiiiiiiiiiiiii"ii;ii>iiAii^iidiigiijiioiiwiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiDiiRiiUiiiiisii|iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii ii ii ii ii iiiiiiiiiiiiiiiiii ii!ii"ii#ii%ii&ii'ii)ii*ii,ii.ii/ii1ii2ii3ii4ii5ii7ii8ii9ii=ii>ii?ii@iiAiiCiiFiiGiiHiiIiiJiiKiiLiiNiiOiiPiiQiiRiiTiiUiiViiXiiYii[ii\ii^ii_ii`iiaiibiiciidiieiigiihiijiiliimiizii|ii}ii~iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii ii#ii$ii&ii'ii(ii)ii+ii,ii.ii5ii6ii8ii@iiCiiFiiIiiNiiPii_iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii ii ii iiiiiiiiiiiiii!ii(ii,ii-ii9ii<ii=ii?iiGiiIiiKiiLiiPiiQiiSiiTiiUiiViiWiiXiiYiiZii[ii\ii]ii_ii`iiaiibiiciidiieiifiigiihiiiiijiikiiliimiipiiqiiriisiitiiuiiviiwiixiiyiizii~iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii ii iiiiiiiiii!ii#ii&ii'ii)ii2ii5iiViiWiiYii\ii^ii`iiaiibiiciidiieiifiigiiliimiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii0sC/usr/share/python-support/python-cherrypy3/cherrypy/lib/encoding.py{i`iiiiiiDiiiiii"iiiiRiiii5iii0s&/usr/lib/python2.5/compiler/symbols.py{iiiiiiiiiiiiiiiiiiiiiiiiiii(ii)iiii0iiii=ii@iiiiii[ii]iiii_iiaiidiigi0sG/usr/share/python-support/python-cherrypy3/cherrypy/process/__init__.py{i ii iii0s9/home/gabriel/Projetos/sponge/tests/unit/test_template.py{iiiiiiiiiiiiiiiiiii ii"ii#ii%ii'ii(ii)ii+ii,ii-ii/ii0ii1ii3ii4ii5ii7ii8ii9ii;ii<ii=ii?ii@iiAiiCiiDiiEiiGiiHiiIiiKiiLiiMiiNiiOiiPiiRiiSiiTiiUiiViiYiiZii[ii\ii]ii^iiaiibiiciidiieiifiihiiiiijiikiiliioiipiiqiiriisiitiiui0s*/home/gabriel/usr/python-libs/nose/core.py{iiiiiii"ii#ii$ii%ii&ii'ii(ii*ii+ii,ii-ii3ii4ii8ii9ii<ii=ii>ii?ii@ii#ii%ii&ii*i0sA/usr/share/python-support/python-cherrypy3/cherrypy/lib/xmlrpc.py{iiiii%iiii-iiiii0s+/home/gabriel/Projetos/sponge/sponge/bob.py{iiiiiiiiiiiiiii ii"ii$ii%ii&ii'ii(ii*ii+ii,ii-ii/ii0ii1ii2ii4ii5ii7ii8ii9ii;ii=ii>ii?ii@iiBiiCiiEiiFiiHiiIiiJiiKiiMiiPi0s?/usr/share/python-support/python-genshi/genshi/template/eval.py{i3iiiiii\iiiiii!ii"iiii$ii%ii&ii'ii(iiiiiiiiii-ii.ii/iiiiiiiiiiiiiiiiii#ii`iiiiiiiiiiiiiiOiiPiiQii#ii$iiii[iiii]ii^iiiiiiaiibiiiiiiiiiiiiiiiiiiiiii%iii0s./home/gabriel/usr/python-libs/nose/importer.py{iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii ii!ii"ii$ii%ii'ii-ii.ii3ii6ii7ii9ii:ii;ii<ii>ii?ii@iiBiiCiiDiiEiiFiiGiiHiiIiiMiiNiiOiiTiiViiWiiXiiYiiZii[ii\ii]ii^iiaiibiiciidiieiifiioiipiiqiiriisiitiiui0s</home/gabriel/Projetos/sponge/tests/functional/test_image.py{iiiiiiiiiiiiiiii0s4/home/gabriel/Projetos/sponge/tests/unit/__init__.py{ii0s'/usr/share/pyshared/yaml/representer.py{iiiiiiiiiii ii iiiiiiiiiiiiiiiiiiiiiiiiii ii!ii"ii#ii$ii%ii'ii-ii.ii/ii1ii2ii3ii9ii:ii;ii=ii>iiMiiOiiPiiQiiRiiSiiUiiViiWiiXiiYii[ii\ii]ii^ii_iiaiiciiuiiviiwiixiiyiizii{ii|ii}ii~iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii ii ii iiiiiiiiiiiiiiiiiiiiiiiiii ii"ii#ii%ii&ii(ii*ii+ii,ii-ii.ii/ii8ii:iiCiiIiiTiiWii[ii_iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii0s>/usr/share/python-support/python-cheetah/Cheetah/Utils/Misc.py{i@ii%ii ii iiiiiiiiii5iiiii0s7/home/gabriel/Projetos/sponge/tests/functional/utils.py{iAiiBiiCiiDiiiiIiiJii/ii3ii4ii5ii6ii7iiii9ii?ii=ii>iii0sA/usr/share/python-support/python-genshi/genshi/template/markup.py{ikiiQiiiiiiiiiiiiiiiiiiiiiiii[iiiiiiuii@iiBiiCiiDiiEiiFiiIiiJiiKiiLiiMiiNiiPiiiiRiiiiTiiUiiiiWiiYiiZiiii\ii]iiii_ii`iiaiibiiciiiieiiiigiihiiiiiiiiiiiiiviiiiiii0s>/usr/share/python-support/python-cheetah/Cheetah/CacheStore.py{iiiiiiiiiiiiiiiii ii#ii&ii)ii*ii-ii0ii5ii:ii=iiEiiHiiIiiJiiPiiSiiYii_iidiiki0s?/usr/share/python-support/python-cherrypy3/cherrypy/_cperror.py{iiiiiiiiiiiii ii ii iiiiiiiiiiiiiiiiii/iiii6iiiiiiiiii ii>ii?ii@iiAiiEii8iiZiiii]iiiiiiiifiiiiiiiii0s/usr/lib/python2.5/fnmatch.py{i*ii+ii,ii-ii.ii/ii0ii1ii3ii4ii5ii:iiNiiOiiPiiQiiRiiSiiTiiUiiWiijiiki0s>/usr/share/python-support/python-cheetah/Cheetah/NameMapper.py{iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii ii#iiiiii*ii+ii,ii/iiii5iiiiiiii^iiiiiiiiiiiiiii0s(/usr/lib/python2.5/encodings/__init__.py{iDii?i0sE/usr/share/python-support/python-cherrypy3/cherrypy/process/wspbus.py{iiiii$iiFiiii\ii,iiiisii=ii?ii@iiAiiBiiEiiFiiGiiiiIiiMiiNiiOiiPiiSiiTiiUiiViiWiiXiiYiiZii[iiii_iiii{iigiiiiijiikiimiiniioiipiiqiiriiiiuiiwiiHiiyii?ii|ii}iiiii0s8/home/gabriel/usr/python-libs/nose/plugins/logcapture.py{iiiiiiiiiiiii-iiiiiiuiiviiiiiiiiiii0s;/usr/share/python-support/python-cheetah/Cheetah/Servlet.py{i ii iiiiiiiiiiiiiiiiiiiiiiii ii!ii#ii$ii&ii)ii,ii2ii9ii;ii<ii=ii>ii@iiAiiDiiHii^iidiiliioiipiiqi0s>/usr/share/python-support/python-cherrypy3/cherrypy/_cptree.py{iiiiiiiiiiiii iiiiiiiiiiiiiiiiiiiiiiii ii"ii#ii%ii&ii(ii)ii+ii,ii.ii0iiii>iiiiiiQiiRiiWii[ii\ii^iieiitiii0sB/usr/share/python-support/python-cheetah/Cheetah/Utils/memcache.py{iiiiiWiiii-iiiiiiiiiiiiii iiii&ii)iiii+ii-ii.ii/ii0ii1ii2ii6ii7ii8ii9ii;ii<iiii>iiiiiiiiHiiiiRiiiiUiiViiiiYiiii[iiiiaiiiiTiigiiiiiiiitiiiiiiiii0s#/usr/lib/python2.5/compiler/misc.py{i!ii"ii iiiiiiiiiii0sC/usr/share/python-support/python-cherrypy3/cherrypy/lib/sessions.py{iiiiiii ii ii ii iiiiiiiiiiiiiiiiiiiiiiiiiiii!ii"ii#ii%ii&ii(ii,ii.ii/ii1ii4ii6ii9ii;ii<ii=ii>ii?iiAiiCiiDiiGiiHiiRiieiiiiijiiiiqiiuiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii&iiiiiiiiiiiiiiiiiiii iiiiiiiiiiiiii"ii8ii:ii@iiDiiPiiWii]ii;iiliisiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii0s?/home/gabriel/Projetos/sponge/tests/functional/test_template.py{iiiiiiiiiiiiiiiiiii ii#ii$ii%ii(ii)ii*ii-ii.ii/ii3ii=ii>ii?ii@iiBiiCiiDiiGiiHiiIiiJi0sB/usr/share/python-support/python-cheetah/Cheetah/Utils/Indenter.py{iiiiiiiiiiiiiiiiiii ii!ii"ii#ii$ii%ii'ii(ii*ii+ii-ii.ii0ii1ii3ii[ii^ii_ii`iiaiibiiciidiifiihiijiioiiqiixiii0sD/usr/share/python-support/python-cheetah/Cheetah/Utils/VerifyType.py{iiiDiiFii(ii ii iiii8ii3iii0s:/usr/share/python-support/python-cheetah/Cheetah/Parser.py{iiiiiiiiiiiiiiiiiiiiiiiiiiiii ii!ii"ii#ii&ii'ii(ii)ii*ii-ii0ii1ii3ii4ii5ii6ii7ii<ii=ii>ii@iiAiiBiiHiiJiiMiiNiiOiiPiiQiiRiiSiiTiiUiiWiiXii[ii]ii^iiaiibiiciidiieiifiiiiijiiliimiiniioiipiiriisiitiiuiiviiwiixiiyiizii}ii~iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii8 ii9ii:ii;ii=ii>ii?ii iiEiiGiiHiiJiiOiiSiiU iiVii\iidiigiikiimiioiipiiriisiitiiviixiiy ii{ii~iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii iiiiiiii iiiiiiiiiiiiiiiiiiiiiiiiiiiiii iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiUiiiiii iiiiiiiiii ii ii ii iiiiii ii iiii!ii[ii& ii*ii2ii3ii4ii6ii<ii=ii?iiEiiFiiaiiHiiNiiQiiWiimiipiivii|iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii(ii2ii6iiiiriisiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii!ii$ii%ii(ii*ii+ii,ii.ii/ii0ii1ii2ii4ii6ii7ii:ii<ii>ii?ii@iiiiBiiCiiDiiFiiGiiHiiJiiLiiMiiNiiPiiRiiSiiTiiUiiViiWiiXiiYii[ii`iiaiidiieiifiigiihiiiiikiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiisiiiiiiiiiiiiiiiiiiiiii=iiRiiwiiiiiiiiiiiiii&iiIii\iiniirii{iiiiiiiiiii0s$/usr/share/pyshared/yaml/__init__.py{iiiiiiiiiiiiiii ii ii iiiiiiiiiiiiiiii iiiiiiiiiiiiiiiiiiiiiiiiiiii#iiiiiiiiiiiiii+iiiiii4ii iiiiiiiiiiiiiiiiiiEii iiViiiiMii iiiiiiiiUiiiiWiiiiiiiiiihii<iijiikiiliiiiiiiiiiiiiiii0s"/usr/lib/python2.5/compiler/ast.py{iiiii ii ii iiiiiiiiiiiiiiiiii*ii+ii,ii-ii/ii1iifiigiimii*iii0s?/usr/share/python-support/python-cherrypy3/cherrypy/_cpcgifs.py{iiiiiiiiiiiii8i0s)/home/gabriel/Projetos/sponge/__init__.py{iiii0s//home/gabriel/Projetos/sponge/sponge/core/io.py{iiiiiiiiiiiiiiiii ii!ii"ii$ii&ii(ii)ii*ii+ii,ii.ii0ii2ii3ii5ii6ii7ii8ii9ii:ii;ii<ii=ii>ii?ii@iiAiiBiiCiiDiiEiiFiiGiiHiiIiiJiiKiiLiiMiiNiiOiiPiiQiiRiiSiiUiiVi0sD/usr/share/python-support/python-cherrypy3/cherrypy/process/win32.py{iiiiiiii0s/usr/lib/python2.5/inspect.py{iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii<i0sA/usr/share/python-support/python-cherrypy3/cherrypy/lib/static.py{iiiiiiiiiiiiiiiii ii iiii ii iiiiiii0s5/home/gabriel/usr/python-libs/nose/plugins/manager.py{ikiiiiiiiiiiiiiiiiGiiHiijiiLiiMiiNiiOiiRiiXiiYiiZii^iiiiaiieiiiigiihiiiiiiiiliioiiiiuiixiiyiizii{ii|ii}ii~iii0s4/home/gabriel/Projetos/sponge/tests/unit/test_bob.py{iiiiiiiiiiiiiiiiiiiii ii!ii"ii#ii$ii%ii&ii'ii(ii)ii*ii+ii,ii-ii.ii/ii0ii1ii2ii3ii4ii5ii6ii7ii8ii9ii:ii;ii<ii=ii>ii?ii@iiAiiBiiCiiDiiEiiFiiHiiIiiJiiKiiLiiMiiNiiOiiPiiQiiRiiSiiTiiUiiViiWiiXiiYiiZii[ii\ii]ii^ii_ii`iiaiibiiciidiieiifiigiihiiiiijiikiiliimiiniioiipiiqiiriisiitiiuiiviiwiixiiyiizii{ii|ii}ii~iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii0s/usr/lib/python2.5/gettext.py{iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii6iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii0s/usr/lib/python2.5/UserDict.py{i,iiiiiiiiii:ii;ii<i0s>/usr/share/python-support/python-cherrypy3/cherrypy/_cpwsgi.py{iiiiiiiiiiiii iiiiiiiiiiii iiii'ii)ii+ii/ii0iiiiii;ii?iiAiiBiiDiiLiiiiiiiiriiiiiiiiiiiii0s$/usr/share/pyshared/yaml/resolver.py{iiiiiiiii ii iiii iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii iiii"iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiViiiiXiiYiiZiiiiiiiiiiiiiiiiiioiipiiqiiiiiiuiii0s6/usr/share/python-support/python-genshi/genshi/util.py{iiiiiiiiiiiiiCiiDiiEiiJiiKiiLiiMii\iiaiibiiciidiieiioiipiiqiitiiuiiviiyi0s)/usr/share/pyshared/PIL/GifImagePlugin.py{iiiiiiiiiiiii%ii(ii-ii/ii0ii6ii8ii9ii;ii=iiAiiCiiiiiiiiiiiiiiiiiiiiiiciiei0s&/usr/lib/python2.5/compiler/visitor.py{i#ii$iifiigii(iijii+ii,ii-ii.ii/ii0ii1iikii>ii9iihii=ii'ii?i0sH/usr/share/python-support/python-genshi/genshi/template/interpolation.py{iiiiiiiiiiiiiiiiiiiiiiiii@iiBiiCiiDiiEiiFiiGiiHiiIiiJiiKiiLiiMiiNiiSiiTiiUiiWiiXiiYiiZii\ii_ii`iiaiiciidiihiiiiijiikiimi0s#/usr/share/pyshared/yaml/scanner.py{iiiiiiiii ii!ii"ii#ii&ii.ii0iiJiiXiiYiidiigiioiiqiitiizii}iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii!iiiiiiiiii}iiiiiiiiiiii$ii&iiii*ii9ii;iiFiiNiiOiiii\ii^iifiiiihiiiiiiipiitiiziiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii0s6/usr/share/python-support/python-genshi/genshi/core.py{iiiii ii iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiNiiOiiRiiiiiiiiiiuii{ii}i0s,/home/gabriel/Projetos/sponge/file_system.py{iiiiiiiiiiiii!ii"ii#ii%ii'ii)ii+ii-ii/ii1ii3ii4ii6ii7ii8ii9ii:ii;ii=i0s</usr/share/python-support/python-cheetah/Cheetah/Template.py{iiiiiiiiiiiiiiiiiiiiiiiiiiiiiii ii!ii"ii#ii$ii'ii(ii)ii-ii.ii4ii5ii7ii9ii:ii;ii<ii=ii>ii?ii@iiBiiCiiDiiEiiGiiIiiJiiLiiViieiihiiiiiniiriiuiiviiwiiyiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii ii ii ii iiiiiiiiiiiiiiiiiiiiiiiiiiii%ii&ii'ii(ii)ii*ii+ii,ii-ii/ii0ii1ii2ii3ii6ii7ii8ii9ii;ii<ii>ii?ii@iiBiiCiiDiiFiiGiiIiiJiiKiiLiiMiiNiiOiiPiiQiiRiiSiiTiiViiJiiKiiLiiMiiNiiOiiPiiRiiSiiUiiViiXiiYii[ii]ii^ii_ii`iibiiciidiifiigiihiijiiliiniioiipiiqiisiitiiuiiviizii|ii}ii~iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii#ii$ii&ii'ii)ii6ii8iiEiiGiidiifiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiifiigiihiiiiijiikiiliimiiniioiipiiqiiriisiitiiuiiviiwiixiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii iiii#ii'ii(ii*ii+ii,ii-ii.iiGiiSiiaiibiiciidiieiifiigiiriisiiuiiyii|ii}iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii ii iiiii0sO/usr/share/python-support/python-cheetah/Cheetah/convertTmplPathToModuleName.py{iiiiiiiiiiiiiii ii ii i0s?/usr/share/python-support/python-cheetah/Cheetah/Unspecified.py{iiiiiiiiiiiii i0sB/home/gabriel/Projetos/sponge/tests/functional/test_file_system.py{iiiiiiiiiiiiiiiii!ii"ii#ii$ii&ii(ii)ii*ii+ii-ii/ii0ii1ii2ii3ii4ii5ii6ii7ii8ii9ii:ii;ii<ii=ii>ii?ii@iiAiiBiiCiiDiiEiiFiiHiiIiiJiiLiiMiiNiiOi0s3/home/gabriel/Projetos/sponge/sponge/file_system.py{iiiiiiiiiiiiiiiiiiiii ii!ii"ii#ii$ii%ii&ii'ii(ii)ii*ii+ii,ii-ii.ii/ii0ii1ii2ii3ii4ii6ii7ii8ii9ii:ii;ii=i0s./home/gabriel/usr/python-libs/nose/selector.py{i#ii%ii(ii)ii*ii+ii,ii-ii5ii6ii9iiDiiEiiHiiIiiJiiLiiMiiPiiQiiYiiZii`iiaiibiiciidiihiiiiitiiuiiviiwiixiiyiizii{ii~iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii0s!/usr/share/pyshared/yaml/nodes.py{iiiiiiiiiiiiiiiiiii ii!ii#ii%ii&ii'ii(ii)ii*ii,ii-ii/ii0i0s/usr/lib/python2.5/threading.py{i(ii)ii*ii-iiiiFiiMiiRiiSiiTiiUiiii_ii`iieiifiigiihiijiiniisiiuiiviiwiixiizi0s@/usr/share/python-support/python-cherrypy3/cherrypy/_cpconfig.py{iiiiiiiiiiiiiiiiiliiiiiiiiiiniiiiuiiiiii}iiii iiii"ii%iiqii!iiiiiiiiiitiiiiiiiiiiiiiiiiviiFiiiiiiIiiMiiPiiziiSiiUiiXiiiiii^iiii`iiaiibii{iiiieiifiigiiiijiikiiiimiiiioiiiiiiriisiiiiiiiiiixiiziiii|iiii~iii0sB/usr/share/python-support/python-cheetah/Cheetah/Utils/__init__.py{ii0sB/usr/share/python-support/python-cherrypy3/cherrypy/lib/cptools.py{iiiiiiiiiiiiiii iiiiiiEii$iiii(iiii,iiii1iiiiiiDiiiiiiiiKiiii iiiiiiiiii\ii%iibiiciiniiiii0s*/usr/share/pyshared/PIL/JpegImagePlugin.py{i ii"ii#ii%ii&ii(ii.ii/ii0ii2ii7ii8ii:ii<ii=ii?iiAiiBiiDiiEiiFiiJiiLiiMii^iibiiciieiifiihiipiiqiiriitiiuiixiiyii{ii|iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii ii ii iiiiiiiiiiiiiiiiii7iiJiiwiixiiyiizii{ii|ii}ii~iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii0s&/usr/lib/python2.5/logging/__init__.py{iiiiimiiiiiiiiiiiiiiiiiiiiiiiiii"iiiiiiii)ii+iiiiiiiiiiiiiiiiiiiiiiiiBiiCiiDiiiiFiiGiiiiIiiiiKiiLiiHiiiiiiSiiiiii]ii^ii_ii`iiaiibiifiigiijiiliiRiiniioiiiiqiiriiiiyiizii{ii|ii}ii~iii0s/usr/share/pyshared/mox.py{i iiiiiiiiiiiiiiiifiiii!ii"ii#ii$ii&ii,ii1ii2ii3ii4ii5ii6ii8ii9ii:ii;ii<ii=ii>ii?ii@iiAiiCiiDiiFiiaiiIiiiiKiiMii iiPiiQiiciiTiiiiiiYii[ii\ii^ii_ii`iiaiibiiiidiieiifiiiiiiigiimiipiiriiiiviiwiixiiyii{ii|ii}ii~iiiiiiiiiiiiiiiiiiikiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii[iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii!iiiiwiiiiiiiixiiii#iiiiyiiiiiiiiiiiiiiii{iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii;ii ii iiiiii;iiiiiiii+iiiiiiii<ii!iiii)ii_ii+ii/ii^iiii7ii8ii9ii;iiOii4ii>ii@iiiiiiCiiDiiEiiGii`iiJii7iiLiiiiOiiiiQiiRiiUiiWiiXiiiiZii[ii\ii]ii^ii_iiaiiciieiigiiiiijiikii}iimiiniiaiipiiriixiiii|iiiiiiiiiiiiiiiiAiiii9iiYiiiiiiiiiiCiiiiiiiiDiiiiiiEiiiiiiiiiiiiiiiiiiiiiiiiiiii9iiiiIiiIiiiiiiiiiiiiiiLiiiiiiiiiiiiiiiiiiiiOiiiiiiiiiiiiiiiiiiiiiiiiSiiiiiiiiiiiiiii0sA/usr/share/python-support/python-cherrypy3/cherrypy/_cpchecker.py{iiiiiiiiiiiiiiiiiiiiiiiiiiiiiii*ii/ii1iiii@iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiisiitiiuiiviiwiixiiyiizii{ii|ii}i0s</usr/share/python-support/python-cheetah/Cheetah/__init__.py{iiiiiiii0s/usr/lib/python2.5/sre_parse.py{iJiiKiiLiiMiiOiiPiiQiiRiiSiiViiWiiXiiZiiaiibiiciidiieiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii ii ii ii ii iiiiiiiiiiiiii-ii.ii6ii7ii8ii9ii:ii;ii<ii=ii>ii?ii@iiDiiEiiGiiHiiKiiLiiMiiNiiOiiPiiQiiRiiSiiWiiXiiYiiZii[ii^ii_ii`iidiieiifiigiihiiiiikiiliiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii ii ii iiiiiiiiiiiiiiiiiiiiiiiiiiii ii"ii#ii$ii%ii&ii>ii@iiAiiJiiLiiMiiNiiOiiQiiRiiSiiTiiViiWiiYiiZiiuiiwiiyii{ii|iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii ii ii iiiiiiiiiiiiiiiiiiiii0s4/home/gabriel/Projetos/sponge/sponge/bob/__init__.py{iiiiiiiiiiiiiiiiiiiii ii!ii"ii#ii$ii%ii&ii'ii(ii)ii*ii+ii,ii-ii.ii/ii0ii1ii2ii3ii4ii5ii6ii7ii8ii9ii:ii;ii<ii=ii>ii?ii@iiAiiBiiCiiDiiEiiFiiGiiHiiIiiJiiKiiLiiMiiNiiOiiPiiQiiRiiSiiTiiUiiViiWiiXiiYiiZii[ii\ii^ii_iiai0s/usr/lib/python2.5/os.py{iiiiiii$ii%ii&ii'ii)ii+ii,ii-ii.ii/ii0ii1ii2iiiiiiiiiiiiiii0sB/usr/share/python-support/python-cherrypy3/cherrypy/lib/wsgiapp.py{iiiiiiiii iiii4i0s;/home/gabriel/Projetos/sponge/tests/unit/test_controller.py{iiiiiiiiiiiiiiiiiii ii"ii$ii%ii&ii'ii(ii)ii*ii,ii-ii/ii0ii1ii3ii4ii5ii7ii8ii:ii;ii=ii>ii?iiAiiBiiCiiEiiFiiHiiIiiKiiLiiMiiOiiPiiQiiSiiTiiViiWiiYiiZii[ii]ii^ii_iiaiibiidiieiigiihiijiiliimiiniipiiqiiriitiiuiiwiixii}ii~iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii ii ii ii iiiiiiiiiiiiiiiiiiiiiiiiiiii ii!ii"ii$ii%ii&ii(ii)ii*ii,ii-ii.ii0ii1ii2ii4ii5ii6ii8ii9ii:ii<ii=ii>ii@iiAiiBiiDiiEiiFiiHiiIiiJiiLiiMiiNiiPiiQiiRiiTiiUiiViiXiiYiiZii\ii]ii^ii`iibiiciieiifiihiiiiijiiliiniioiiqiiri0s/usr/lib/python2.5/optparse.py{iiiii%ii&ii'ii(ii+ii2ii3ii9ii:ii<ii?ii@iiDiiEiiJiiiiLiiiiQiiTiiUiiViiWiiYiiZii\ii]iihiijiiiioiiiiiiniiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiidiieiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii0sA/usr/share/python-support/python-cheetah/Cheetah/ErrorCatchers.py{i ii ii iiiiiiiiiiiiiiiiiiii ii"ii#ii&ii'ii*ii+ii,ii.ii2ii:i0sF/usr/share/python-support/python-cherrypy3/cherrypy/process/plugins.py{iiiiiiiiiii ii ii ii iiiiiiiiiiiiiiiiiiiiii'ii0ii3ii4ii5ii6ii7ii9ii:ii<ii=ii>iiAii iiJii^iiiiziiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii iiLiiOiiPiiRiiWii_iiaiikiiliiniivii|ii~iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiCiiiiiiiiiiiiiii0s/usr/lib/python2.5/sha.py{i ii ii iiiii0sA/usr/share/python-support/python-cherrypy3/cherrypy/_cprequest.py{iiiiiiiiiiiii ii ii iiiiiiiiiiiiiiiiii!ii#ii&iiii(ii5ii8ii;ii<iiEiiFiiHiiIiiJiiKiiLiiNiiOiiQiiUiiniiriiiiuiiwiixiiyii~iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii%iiiiiiiiii'iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii iiiiiiiiiiiiiiiiiiiiiiiiii%ii'ii(ii*ii+ii-ii.ii/ii0ii1ii2ii3ii6ii8ii9ii;ii<ii=ii>ii?iiAiiDiiEiiFiiGiiIiiJiiKiiLiiPiiQiiTiiViiXii_iiaiidiifii<iiniipii>iiviiwiixiiiiiiiiiiDiiiiiiFiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii0s-/home/gabriel/usr/python-libs/nose/failure.py{iiiiiiiiiiiiiiiiii0s/usr/lib/python2.5/repr.py{i ii ii iiiiiiiiiiiiiiiii0s@/usr/share/python-support/python-cheetah/Cheetah/SourceReader.py{i ii iiiiiiiiiiiiiiiiiiiiii5ii6ii8ii9ii:ii=ii>ii?iiBiiCiiDiiEiiFiiGiiIiiJiiKiiLiiNiiOiiQiiTiiUiiWii[ii_iidiiliisiiyiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii$ii'i0sC/usr/share/python-support/python-cherrypy3/cherrypy/lib/httpauth.py{iiiiiAiiiiiiiiiiiiiiiiiiii.iiIii;ii>ii?ii@iiAiiCiiDiiEiiFiiHiiIiiJiiKiiNiiOiiPiiTiiNiiiiciiiipiiiivii7i0s8/home/gabriel/usr/python-libs/nose/plugins/errorclass.py{iiiiiiiiiiiiiiiiiiii0s>/home/gabriel/Projetos/sponge/tests/unit/test_config_parser.py{iiiiiiiiiiiiiiiiiiiii ii!ii"ii#ii$ii%ii&ii*ii+ii-ii0ii1ii2ii5ii6ii7ii9ii:ii;ii=ii>ii?iiAiiCiiEiiGiiIiiJiiKiiLiiMiiPiiQiiSiiViiWiiYii\ii]ii_iibiiciidiieiifiihiiiiikiiliimiioiipiiriiuiiviiwiixiizii{ii|ii}ii~iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii ii ii ii iiiiiiiiiiiiiiiiiiiiiiii ii!ii"ii#ii&ii'ii(ii*ii+ii,ii-ii0ii1ii2ii4ii5ii6ii7ii:ii;ii<ii>ii?ii@iiAiiBiiCiiDiiEiiFiiGiiJiiKiiMiiNiiOiiPiiRiiSiiTiiViiWiiXiiYiiZii\ii]ii^ii_ii`iiaiiciidiieiifiigiihiijiikiiliimiipiiqiiri0s"/usr/share/pyshared/yaml/reader.py{iii;iiDiiiiiiiiiiiiPiiiiiiiiiiiiziiiiii=ii^iii0s'/usr/share/pyshared/PIL/ImagePalette.py{i%iigiijiiKii,iioiiii4iiuiixiiiiiiii]iii0s"/usr/share/pyshared/yaml/tokens.py{iiiiiiiiiiiiiiiiiiiiiii ii!ii"ii'ii(ii*ii+ii-ii.ii0ii1ii3ii4ii6ii7ii9ii:ii<ii=ii?ii@iiBiiCiiEiiFiiHiiIiiKiiLiiMiiRiiSiiTiiYiiZii[ii`iiaiibi0s/usr/lib/python2.5/stat.py{i.ii=iiii7i0s^/home/gabriel/Projetos/sponge/tests/functional/module/to/DynamicallyCompiledCheetahTemplate.py{iii ii ii ii ii iiiiiiiiiiiiiiiiiiiiiiiiiiii ii!ii"ii#ii$ii%ii&ii'ii(ii*ii3ii9ii;ii<iiDiiIiiJiiKiiLiiMiiOiiPiiQiiVii[iiaiiciieiigiiiiikiimiioiisiitiiuii~i0s$/usr/share/pyshared/yaml/composer.py{iiiciiiiiiiiii ii ii iiiiXii2iiuiiiiii?i0s*/usr/lib/python2.5/compiler/transformer.py{iiikiiiiiiiiiisiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiZii&ii'ii(ii)iiiiii3ii5ii6ii7iiiiiiiiiiiiiiiiiiiiEiiiiGiiHiiiiiiOiiSiiUiiiiii^ii_iiaiieiifiigiijiiiiliimiiniioiipiiqiiriiiitiiuiiwii{ii|ii}i0s/usr/lib/python2.5/string.py{iii<ii"iitiii0sC/home/gabriel/Projetos/sponge/tests/functional/test_class_loader.py{iiiiiiiiiiiiiiiiiiiiiii ii!ii%ii&ii'ii(ii,ii-ii.ii/ii3ii4ii5ii6ii:ii;ii<iiEiiFiiGi0s$/usr/lib/python2.5/BaseHTTPServer.py{iiiiiiiiiii ii ii ii iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii ii!ii#ii%ii&iiii*ii+ii_iiiiii8ii_iiJii@iiAiiiiEiiGiiIiiiiKiiLiiiiiiMiiiiii#iiiiiiZiiii\iiiiaiiiiciiaiiiiiikiiiiiiiiiiiiiiiiuiiiiiiiiiiiiiii0s)/usr/share/pyshared/PIL/BmpImagePlugin.py{iiiiiiiiiiiii&iiii)iiiiii-ii/ii0ii1ii2ii3ii4iiii7ii8iiiiiiiiiiii?ii@iiBii=iiiiiiiii0s6/home/gabriel/Projetos/sponge/tests/unit/test_image.py{iiiiiiiiiiiiiiiiiii ii"ii#ii%ii&ii(ii)ii+ii-ii.ii0ii1ii2ii4ii6ii7ii9ii;ii=ii?ii@iiAiiBiiDiiFiiHiiIiiJiiKiiMiiOiiQiiRiiTiiUiiWiiYiiZii[ii\ii^ii_ii`iiaiiciidiifiigiiiiijiiliimiioiipiiqiisiiuiiviiwiiyiizii|ii}iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii0s?/usr/share/python-support/python-cherrypy3/cherrypy/__init__.py{i*ii-ii/ii0ii1ii:ii<ii>iiAiiBiiFiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii ii iiiiiiiiiiiiiiii!ii$ii&ii(ii)ii+ii,ii-ii/ii0ii1ii3ii4ii6ii:ii;ii<ii=ii>ii?iiAiiEiiIiiMiiQiiUii]ii^iiaiibiiciijiipiiqiiriisiixiizii|iiiiiiiiiiiiiiiiiii0s"/usr/share/pyshared/yaml/dumper.py{iiiiiiiiiii ii ii iiiiiiiiiiiiii ii!ii"ii-ii0ii1ii2ii3ii4ii5ii6ii7ii8ii9ii:ii;ii<ii=i0s1/home/gabriel/Projetos/sponge/tests/unit/utils.py{iAiiBiiCiiDii6iiIiiJii?ii/ii3ii4ii5iiii7iiii9ii;ii=ii>iii0s&/usr/lib/python2.5/compiler/pyassem.py{iiiVii ii ii ii iiiiiiiiiiYiiiiZii[ii4ii5ii6ii7ii8ii9ii;ii<ii?ii@iiAiiFiiHiiIiiJiiLiiNiiOiiPiiSiiTiiUiiViiWiiXiiYiiZii[ii\ii^iiaiiciidiieiigiiXiiiiijiiiiiihiitiiuiiviixiiyiizii{ii|iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiziiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiyiiiiiiiiii iiii=ii>ii?ii@iiiiBiiCiiDiiWiiGiiHiiIiiLiiiiRiiiiTiiXiiiiiiniioiipiiqiiriiiitiiuiiviiAiisiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiFiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiMiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiSiiiiiiiiiiiiiiiii0s:/home/gabriel/Projetos/sponge/tests/functional/test_bob.py{ii0sF/usr/share/python-support/python-cherrypy3/cherrypy/process/servers.py{iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii#iiiiii?iiAiiiiiiii[iigiiiisiiuii{ii|iiii~i0s /usr/share/pyshared/PIL/Image.py{iiiii ii iiiiiiiiiiii!iizii#ii&ii,ii.ii/ii0iimii5ii6ii7ii_ii=iiii`iiDiiEiiGiiJiiLiiMiiNiiRiiSiiWiiXii[ii\iiiiaiibiiciihiikiimiioiipiiqiisiitiiuiiviixiiyiizii{ii|iijii~iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiZiiiiiiii iiiiiiiiiiiiiiiiiiiiiiiiiiiiyiiiiiiziiiiiiiiiiiiii|iiiiii}iijiiiiiiiiiiLiiiiii ii iiii-iiiiiiiiiiiiiiii ii!ii$ii%ii(ii)iiii,ii-iiii0ii1ii9iiii;ii?ii6iiviiQiiiiTiiWiiXiiZii[ii]ii^ii_ii`iiiibiiiidiieiifiigiiiiijiikiiiimiiniioiipiiqiiriiiitiiviiiiiizii{ii}ii~iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiDiiaiiiiaiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiili0s/usr/lib/python2.5/Cookie.py{iViiSiiTiiUii6iiXi0sA/usr/share/python-support/python-genshi/genshi/template/loader.py{iiiiiiiiiiiiiiiii iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiioiiiiqiiriitiiuiiwii{ii|ii}ii~iii0s0/home/gabriel/Projetos/sponge/sponge/__init__.py{ii0s8/usr/share/python-support/python-genshi/genshi/output.py{iiiiiiiiiiiiiiiii4ii5ii6ii7ii8ii9ii:ii;ii<ii>ii?ii@iiAiiBiiDiiEiiFiiGiiIiiLiiMiiNiiOiiPiiQiiRiiSiiUiiViiWiiXiiYiiZii`iiaiioiipiiriisiitiiuiiviiwiiyii{ii|ii}ii~iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii#ii$ii%ii'ii(ii)ii*ii+ii,iiii;iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiNiiiiiiiiPiiiiiii0s/usr/lib/python2.5/re.py{iiiiiiiii iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii0s"/usr/share/pyshared/yaml/parser.py{iiiii ii iiBiiiiiiiiiiFiiii4ii iiii>iixii@iiAiiBiiCiiEiiFiiHiiiiLiiMiiNiiiiQiiiiiiiiYiiiifiimiiiisiiiiziii0s$/usr/share/pyshared/PIL/ImageMode.py{iiiii$iiiii0s/usr/lib/python2.5/traceback.py{i+iiiiiiiiiiii%ii&ii'ii(ii)ii*iiiiiiiiiiiiiiLiiiiiiiiiiiiiiYiiZii\ii]ii^ii_ii`iiaiibiiciidiieiifiihiiiiijiiki0sA/usr/share/python-support/python-cherrypy3/cherrypy/_cplogging.py{iiiiiiiiiiiiiiiii ii iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii!ii"iiiiii%iiiiiiiiiiiiii/iiiiiiiiiiiiiiiiiiiiiiiiiiiiAiiii iiiiiiiiiiii#iiiiii9iiiiziiiiiiii iiiikiiiiriisiitiiuiiii{ii|ii}ii~iii0s;/usr/share/python-support/python-cheetah/Cheetah/Filters.py{iiiii ii ii iiiiiiiiiiiiiiiiiiii"ii&ii'iiii6ii;ii=ii>iiRiiSii[ii]ii^iiiiri0s&/usr/share/pyshared/yaml/serializer.py{iiiiiiiiiii ii ii iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii$ii%ii'ii(ii)ii.ii/ii1ii3ii4ii5ii6ii7ii8ii9ii:ii<ii=iiAiiBiiEiiFiiGiiHiiJiiNiiOiiPiiSiiTiiUiiViiWiiXiiYiiZii[iieiifiigiihiiiiijiikiiliimiini0s$/usr/share/pyshared/PIL/ImageFile.py{iiiiiii!ii#ii%ii&ii'ii(ii)ii*ii1ii<ii=ii?ii@iiBiiCiiEiiFiiHiiNiiOiiQiiRiidiigiiliisiiviixiizii{ii}iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii iiiiiiiiii ii)ii2iiBiiDiiEiiFiiGiiHiiOiiXiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii0s?/usr/share/python-support/python-cherrypy3/cherrypy/lib/http.py{iiiiiiiiiiiiigii ii iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii%ii'ii)ii+ii,ii.ii/ii1iiii4iiii:ii=iiiiAiiiiFiiHii7iiiiPiiTiiii+ii[iiii]ii^ii_iiaiieiiiiiikiiniiiiiiiiiiii~i0s=/home/gabriel/Projetos/sponge/tests/unit/test_class_loader.py{iiiiiiiiiiiiiiiiiiiiiii ii!ii"ii#ii%ii&ii'ii(ii)ii*ii+ii,ii-ii.ii/ii0ii1ii2ii3ii4ii5ii7ii8ii:ii<ii=ii>ii?iiAiiCiiDiiEiiFiiHiiJiiKiiMiiNiiOiiQiiRiiSiiUiiViiWiiYii[ii]ii_ii`iiaiibiidiifiigiihiiiiiki0sD/usr/share/python-support/python-cheetah/Cheetah/DummyTransaction.py{i iiiiiiiiiiiiiiiiiiiiii ii"ii%ii&ii(ii,ii4ii6ii7ii8ii9i0sC/usr/share/python-support/python-cherrypy3/cherrypy/lib/__init__.py{iiiiiDiieiiiiAiiiiKiimiiNiipiiiiiisiiiii0ii6ii)ii'iiwii>i0s?/usr/share/python-support/python-cherrypy3/cherrypy/lib/tidy.py{iiiiiiiiiiiii ii iiviizii~iii0s!/usr/lib/python2.5/sre_compile.py{iii ii ii ii iiiiiiiiiiii(ii)ii*ii+ii,ii-ii.ii/ii0ii1ii2ii4ii5ii6ii7ii8ii9ii:ii<ii=ii>ii?ii@iiAiiBiiCiiEiiFiiGiiPiiQiiRiiTiiUiiViiWiiXiiYiiZii\ii]ii^ii_ii`iiaiibiiciifiigiihiiiiikiiliimiiniioiiqiiriisiitiiuiiwiixiizii{ii|ii}ii~iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii ii ii iiiiiiiiiiiiiiiiiiiiii4ii5ii8ii9ii:ii;ii<ii=ii>ii?ii@iiAiiBiiIiiJiiLiijiikiimiisiitiiuiiwiixiiyiizii{ii|ii~iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii0s/usr/lib/python2.5/unittest.py{i5ii6iigiijiikiiliimiiniiriiviizii{ii|ii}ii~iiiiiiiiiiiiiiiimiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiniiiiiiiiiiiiiiiiiiiiiiiiiiii ii ii iiiiiiiiii&ii'iiii)iiLiiMiiNiiiiiiiiiiiiiiiii0s/usr/share/pyshared/stubout.py{iiiiiiiiiiiiiiiii ii!ii"ii#ii%ii&ii'ii)ii_iieiigiijiiliiviixiiyiizii|iii0s/usr/lib/python2.5/copy.py{iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii0s?/usr/share/python-support/python-cherrypy3/cherrypy/lib/auth.py{iiiii>iiii.i0s;/usr/share/python-support/python-cheetah/Cheetah/Version.py{iiiiiiiii!iii0s/usr/lib/python2.5/md5.py{i ii iiiii0s</home/gabriel/Projetos/sponge/tests/unit/test_file_system.py{i ii!ii"iiiiiiiiiiiiiiiii00sponge-0.3.1/tests/functional/module/to/load/0000755000175000017500000000000011244504474020741 5ustar gabrielgabrielsponge-0.3.1/tests/functional/module/to/load/__init__.py0000644000175000017500000000006611244504474023054 0ustar gabrielgabrielclass ClassInsideModule: param = 'ParamFromClass' sponge-0.3.1/tests/functional/module/to/load/some_file.py0000644000175000017500000000006411244504474023255 0ustar gabrielgabrielclass ClassInsideFile: param = 'ParamFromClass' sponge-0.3.1/tests/functional/test_bob.py0000644000175000017500000000210711244504474020266 0ustar gabrielgabriel#!/usr/bin/env python # -*- coding: utf-8; -*- # # Copyright (C) 2009 Gabriel Falcão # Copyright (C) 2009 Bernardo Heynemann # # 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 2 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, write to the # Free Software Foundation, Inc., 59 Temple Place - Suite 330, # Boston, MA 02111-1307, USA. from sponge.bob import Bob def test_get_file_path(): b = Bob() path = b.get_file_path() # ignoring the "c" of "pyc", if any path = path.rstrip("c") assert path.endswith('sponge/bob/__init__.py') sponge-0.3.1/tests/functional/test_image.py0000644000175000017500000000214111244504474020604 0ustar gabrielgabriel#!/usr/bin/env python # -*- coding: utf-8; -*- # # Copyright (C) 2009 Gabriel Falcão # # 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 2 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, write to the # Free Software Foundation, Inc., 59 Temple Place - Suite 330, # Boston, MA 02111-1307, USA. import os import cherrypy from sponge.helpers import image images = os.path.abspath(os.path.join(os.path.dirname(__file__), 'data')) def test_jpeg(): cherrypy.config['image.dir'] = images got = image.jpeg('2823371.jpg') assert isinstance(got, basestring), 'Expected a string, got %r' % got sponge-0.3.1/tests/functional/files_to_locate/0000755000175000017500000000000011244504474021246 5ustar gabrielgabrielsponge-0.3.1/tests/functional/files_to_locate/test.txt0000644000175000017500000000000011244504474022754 0ustar gabrielgabrielsponge-0.3.1/tests/functional/files_to_locate/sub/0000755000175000017500000000000011244504474022037 5ustar gabrielgabrielsponge-0.3.1/tests/functional/files_to_locate/sub/test2.txt0000644000175000017500000000000011244504474023627 0ustar gabrielgabrielsponge-0.3.1/tests/functional/files_to_locate/not_to_be_found.ign0000644000175000017500000000000011244504474025076 0ustar gabrielgabrielsponge-0.3.1/tests/functional/templates/0000755000175000017500000000000011244504474020111 5ustar gabrielgabrielsponge-0.3.1/tests/functional/templates/test1.html0000644000175000017500000000056211244504474022042 0ustar gabrielgabriel My title: $title

My header: $header

sponge-0.3.1/tests/unit/0000755000175000017500000000000011244504474014730 5ustar gabrielgabrielsponge-0.3.1/tests/unit/test_template.py0000644000175000017500000001115411244504474020156 0ustar gabrielgabriel#!/usr/bin/env python # -*- coding: utf-8; -*- # # Copyright (C) 2009 Gabriel Falcão # # 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 2 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, write to the # Free Software Foundation, Inc., 59 Temple Place - Suite 330, # Boston, MA 02111-1307, USA. import re import Image import cherrypy from mox import Mox from utils import assert_raises from os.path import join from sponge import template def test_template_has_make_url_function(): assert hasattr(template, 'make_url'), 'sponge.template should have the function make_url' assert callable(template.make_url), 'sponge.template.make_url should be callable' def test_make_url_takes_string_as_param(): expected = r'sponge.template.make_url ' \ 'takes a string as param, got None.' assert_raises(TypeError, template.make_url, None, exc_pattern=expected) def test_make_url_without_trailling_slash(): base_url = 'http://my.unit.test/for/ma-cherie' cherrypy.request.base = base_url expected_url = 'http://my.unit.test/for/ma-cherie/index' got_url = template.make_url('index') assert got_url == expected_url, 'Expected %s, got %s' % (expected_url, got_url) def test_make_url_with_trailling_slash_on_base_url(): base_url = 'http://my.unit.test/for/ma-cherie/' cherrypy.request.base = base_url expected_url = 'http://my.unit.test/for/ma-cherie/index' got_url = template.make_url('index') assert got_url == expected_url, 'Expected %s, got %s' % (expected_url, got_url) def test_make_url_with_trailling_slash_on_url_part(): base_url = 'http://my.unit.test/for/ma-cherie' cherrypy.request.base = base_url expected_url = 'http://my.unit.test/for/ma-cherie/index' got_url = template.make_url('/index') assert got_url == expected_url, 'Expected %s, got %s' % (expected_url, got_url) def test_make_url_with_trailling_slash_on_both(): base_url = 'http://my.unit.test/for/ma-cherie/' cherrypy.request.base = base_url expected_url = 'http://my.unit.test/for/ma-cherie/index' got_url = template.make_url('/index') assert got_url == expected_url, 'Expected %s, got %s' % (expected_url, got_url) def test_template_has_function_render_html(): assert hasattr(template, 'render_html'), 'sponge.template should have the function render_html' assert callable(template.render_html), 'sponge.template.render_html should be callable' def test_templates_render_html_raises_filename_nonstring(): assert_raises(TypeError, template.render_html, None, {}, exc_pattern=r'sponge.template.render_html ' \ 'takes a string as filename param, got None.') assert_raises(TypeError, template.render_html, 5, {}, exc_pattern=r'sponge.template.render_html ' \ 'takes a string as filename param, got 5.') def test_templates_render_html_raises_filename_empty(): assert_raises(TypeError, template.render_html, '', {}, exc_pattern=r'sponge.template.render_html ' \ 'filename param can not be empty.') def test_templates_render_html_raises_context_nondict(): assert_raises(TypeError, template.render_html, 'index.html', 'a string', exc_pattern=r'sponge.template.render_html ' \ 'takes a dict as context param, got \'a string\'.') assert_raises(TypeError, template.render_html, 'index.html', 5, exc_pattern=r'sponge.template.render_html ' \ 'takes a dict as context param, got 5.') def test_templates_render_html_raises_context_already_have_make_url(): assert_raises(KeyError, template.render_html, 'index.html', {'make_url': "ss"}, exc_pattern=r'The key "make_url" is already in ' \ 'template context as[:] %s' % re.escape(repr(template.make_url))) sponge-0.3.1/tests/unit/test_file_system.py0000644000175000017500000002435111244504474020671 0ustar gabrielgabriel# -*- coding: utf-8 -*- import sys from StringIO import StringIO from mox import Mox from nose.tools import assert_equals from utils import assert_raises from sponge.core import io def test_has_a_stack_list(): assert hasattr(io.FileSystem, 'stack'), \ 'FileSystem should have a stack' assert isinstance(io.FileSystem.stack, list), \ 'FileSystem.stack should be a list' def test_instance_stack_is_not_the_same_as_class_level(): class MyFs(io.FileSystem): pass MyFs.stack.append('foo') MyFs.stack.append('bar') assert_equals(MyFs().stack, []) def test_pushd_appends_current_dir_to_stack_if_empty(): mox = Mox() old_os = io.os io.os = mox.CreateMockAnything() class MyFs(io.FileSystem): stack = [] @classmethod def current_dir(cls): return 'should be current dir' io.os.chdir('somewhere') mox.ReplayAll() try: assert len(MyFs.stack) is 0 MyFs.pushd('somewhere') assert len(MyFs.stack) is 2 assert_equals(MyFs.stack, ['should be current dir', 'somewhere']) mox.VerifyAll() finally: io.os = old_os def test_pushd(): mox = Mox() old_os = io.os io.os = mox.CreateMockAnything() class MyFs(io.FileSystem): stack = ['first'] io.os.chdir('second') mox.ReplayAll() try: assert len(MyFs.stack) is 1 MyFs.pushd('second') assert len(MyFs.stack) is 2 assert_equals(MyFs.stack, ['first', 'second']) mox.VerifyAll() finally: io.os = old_os def test_pop_with_more_than_1_item(): mox = Mox() old_os = io.os io.os = mox.CreateMockAnything() class MyFs(io.FileSystem): stack = ['one', 'two'] io.os.chdir('one') mox.ReplayAll() try: assert len(MyFs.stack) is 2 MyFs.popd() assert len(MyFs.stack) is 1 assert_equals(MyFs.stack, ['one']) mox.VerifyAll() finally: io.os = old_os def test_pop_with_1_item(): mox = Mox() old_os = io.os io.os = mox.CreateMockAnything() class MyFs(io.FileSystem): stack = ['one'] mox.ReplayAll() try: assert len(MyFs.stack) is 1 MyFs.popd() assert len(MyFs.stack) is 0 assert_equals(MyFs.stack, []) mox.VerifyAll() finally: io.os = old_os def test_pop_with_no_item(): mox = Mox() old_os = io.os io.os = mox.CreateMockAnything() class MyFs(io.FileSystem): stack = [] mox.ReplayAll() try: assert len(MyFs.stack) is 0 MyFs.popd() assert len(MyFs.stack) is 0 assert_equals(MyFs.stack, []) mox.VerifyAll() finally: io.os = old_os def test_filename_with_extension(): got = io.FileSystem.filename('/path/to/filename.jpg') assert_equals(got, 'filename.jpg') def test_filename_without_extension(): got = io.FileSystem.filename('/path/to/filename.jpg', False) assert_equals(got, 'filename') def test_dirname(): got = io.FileSystem.dirname('/path/to/filename.jpg') assert_equals(got, '/path/to') def test_exists(): mox = Mox() old_exists = io.exists io.exists = mox.CreateMockAnything() io.exists('some path').AndReturn('should be bool') mox.ReplayAll() try: got = io.FileSystem.exists('some path') assert_equals(got, 'should be bool') mox.VerifyAll() finally: io.exists = old_exists def test_extract_zip_non_verbose(): mox = Mox() class MyFs(io.FileSystem): stack = [] abspath = mox.CreateMockAnything() pushd = mox.CreateMockAnything() popd = mox.CreateMockAnything() open_raw = mox.CreateMockAnything() mkdir = mox.CreateMockAnything() mox.StubOutWithMock(io, 'zipfile') filename = 'modafoca.zip' base_path = '../to/project' full_path = '/full/path/to/project' MyFs.abspath(base_path).AndReturn(full_path) MyFs.pushd(full_path) zip_mock = mox.CreateMockAnything() io.zipfile.ZipFile(filename).AndReturn(zip_mock) file_list = [ 'settings.yml', 'app', 'app/controllers.py' ] zip_mock.namelist().AndReturn(file_list) zip_mock.read('settings.yml').AndReturn('settings.yml content') zip_mock.read('app/controllers.py').AndReturn('controllers.py content') file_mock1 = mox.CreateMockAnything() MyFs.open_raw('settings.yml', 'w').AndReturn(file_mock1) file_mock1.write('settings.yml content') file_mock1.close() MyFs.open_raw('app', 'w').AndRaise(IOError('it is a directory, dumb ass!')) MyFs.mkdir('app') file_mock2 = mox.CreateMockAnything() MyFs.open_raw('app/controllers.py', 'w').AndReturn(file_mock2) file_mock2.write('controllers.py content') file_mock2.close() MyFs.popd() mox.ReplayAll() try: MyFs.extract_zip('modafoca.zip', base_path) mox.VerifyAll() finally: mox.UnsetStubs() def test_extract_zip_verbose(): mox = Mox() sys.stdout = StringIO() class MyFs(io.FileSystem): stack = [] abspath = mox.CreateMockAnything() pushd = mox.CreateMockAnything() popd = mox.CreateMockAnything() open_raw = mox.CreateMockAnything() mkdir = mox.CreateMockAnything() mox.StubOutWithMock(io, 'zipfile') filename = 'modafoca.zip' base_path = '../to/project' full_path = '/full/path/to/project' MyFs.abspath(base_path).AndReturn(full_path) MyFs.pushd(full_path) zip_mock = mox.CreateMockAnything() io.zipfile.ZipFile(filename).AndReturn(zip_mock) file_list = [ 'settings.yml', 'app', 'app/controllers.py' ] zip_mock.namelist().AndReturn(file_list) zip_mock.read('settings.yml').AndReturn('settings.yml content') zip_mock.read('app/controllers.py').AndReturn('controllers.py content') file_mock1 = mox.CreateMockAnything() MyFs.open_raw('settings.yml', 'w').AndReturn(file_mock1) file_mock1.write('settings.yml content') file_mock1.close() MyFs.open_raw('app', 'w').AndRaise(IOError('it is a directory, dumb ass!')) MyFs.mkdir('app') file_mock2 = mox.CreateMockAnything() MyFs.open_raw('app/controllers.py', 'w').AndReturn(file_mock2) file_mock2.write('controllers.py content') file_mock2.close() MyFs.popd() mox.ReplayAll() try: MyFs.extract_zip('modafoca.zip', base_path, verbose=True) assert_equals(sys.stdout.getvalue(), 'Extracting files to /full/path/to/project\n ' \ '-> Unpacking settings.yml\n -> Unpacking app' \ '\n---> Creating directory app\n -> Unpacking' \ ' app/controllers.py\n') mox.VerifyAll() finally: mox.UnsetStubs() sys.stdout = sys.__stdout__ def test_locate_non_recursive(): mox = Mox() old_glob = io.glob io.glob = mox.CreateMockAnything() base_path = '../to/project' full_path = '/full/path/to/project' class MyFs(io.FileSystem): stack = [] abspath = mox.CreateMockAnything() io.glob('%s/*match*.py' % full_path) MyFs.abspath(base_path).AndReturn(full_path) mox.ReplayAll() try: MyFs.locate(base_path, '*match*.py', recursive=False) mox.VerifyAll() finally: mox.UnsetStubs() io.glob = old_glob def test_locate_recursive(): mox = Mox() base_path = '../to/project' full_path = '/full/path/to/project' class MyFs(io.FileSystem): stack = [] abspath = mox.CreateMockAnything() walk = mox.CreateMockAnything() io.glob('%s/*match*.py' % full_path) MyFs.abspath(base_path).AndReturn(full_path) walk_list = [ (None, None, ['file1.py', 'file2.jpg']), (None, None, ['path1/file3.png', 'path1/file4.html']) ] MyFs.walk(full_path).AndReturn(walk_list) mox.ReplayAll() try: MyFs.locate(base_path, '*match*.py', recursive=True) mox.VerifyAll() finally: mox.UnsetStubs() def test_mkdir_success(): mox = Mox() mox.StubOutWithMock(io, 'os') class MyFs(io.FileSystem): pass io.os.makedirs('/make/all/those/subdirs') mox.ReplayAll() try: MyFs.mkdir('/make/all/those/subdirs') mox.VerifyAll() finally: mox.UnsetStubs() def test_mkdir_ignore_dirs_already_exists(): mox = Mox() mox.StubOutWithMock(io, 'os') mox.StubOutWithMock(io.os, 'path') class MyFs(io.FileSystem): pass oserror = OSError() oserror.errno = 17 io.os.makedirs('/make/all/those/subdirs').AndRaise(oserror) io.os.path.isdir('/make/all/those/subdirs').AndReturn(True) mox.ReplayAll() try: MyFs.mkdir('/make/all/those/subdirs') mox.VerifyAll() finally: mox.UnsetStubs() def test_mkdir_raises_on_oserror_errno_not_17(): mox = Mox() mox.StubOutWithMock(io, 'os') mox.StubOutWithMock(io.os, 'path') class MyFs(io.FileSystem): pass oserror = OSError() oserror.errno = 0 io.os.makedirs('/make/all/those/subdirs').AndRaise(oserror) mox.ReplayAll() try: assert_raises(OSError, MyFs.mkdir, '/make/all/those/subdirs') mox.VerifyAll() finally: mox.UnsetStubs() def tes_mkdir_raises_on_oserror_errno_not_17(): mox = Mox() mox.StubOutWithMock(io, 'os') mox.StubOutWithMock(io.os, 'path') class MyFs(io.FileSystem): pass oserror = OSError() oserror.errno = 0 io.os.makedirs('/make/all/those/subdirs').AndRaise(oserror) mox.ReplayAll() try: assert_raises(OSError, MyFs.mkdir, '/make/all/those/subdirs') mox.VerifyAll() finally: mox.UnsetStubs() def tes_mkdir_raises_when_path_is_not_a_dir(): mox = Mox() mox.StubOutWithMock(io, 'os') mox.StubOutWithMock(io.os, 'path') class MyFs(io.FileSystem): pass oserror = OSError() oserror.errno = 17 io.os.makedirs('/make/all/those/subdirs').AndRaise(oserror) io.os.isdir('/make/all/those/subdirs').AndReturn(False) mox.ReplayAll() try: assert_raises(OSError, MyFs.mkdir, '/make/all/those/subdirs') mox.VerifyAll() finally: mox.UnsetStubs() sponge-0.3.1/tests/unit/utils.py0000644000175000017500000000624311244504474016447 0ustar gabrielgabriel#!/usr/bin/env python # -*- coding: utf-8; -*- # # Copyright (C) 2009 Gabriel Falcão # # 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 2 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, write to the # Free Software Foundation, Inc., 59 Temple Place - Suite 330, # Boston, MA 02111-1307, USA. import re import sys def assert_raises(exception, callable, *args, **kwargs): ''' Discussion assert_raises() adds two optional arguments: "exc_args" and "exc_pattern". "exc_args" is a tuple that is expected to match the .args attribute of the raised exception. "exc_pattern" is a compiled regular expression that the stringified raised exception is expected to match. Original url: http://code.activestate.com/recipes/307970/ Author: Trent Mick Usage: assert_raises(ExceptionType, method_to_execute, arguments_to_method, kwargs_to_method, exc_pattern=r'^.+$') Please note that exc_pattern is not required, but if passed matches the exception message. Fail Conditions Fails on exception not raised, wrong exception type or invalid exception message. ''' if "exc_args" in kwargs: exc_args = kwargs["exc_args"] del kwargs["exc_args"] else: exc_args = None if "exc_pattern" in kwargs: exc_pattern = kwargs["exc_pattern"] if isinstance(exc_pattern, basestring): exc_pattern = re.compile(exc_pattern) del kwargs["exc_pattern"] else: exc_pattern = None argv = [repr(a) for a in args]\ + ["%s=%r" % (k,v) for k,v in kwargs.items()] callsig = "%s(%s)" % (callable.__name__, ", ".join(argv)) try: callable(*args, **kwargs) except exception, exc: if exc_args is not None: assert exc.args != exc_args, \ "%s raised %s with unexpected args: "\ "expected=%r, actual=%r"\ % (callsig, exc.__class__, exc_args, exc.args) if exc_pattern is not None: assert exc_pattern.search(str(exc)), \ "%s raised %s, but the exception "\ "does not match '%s': %r"\ % (callsig, exc.__class__, exc_pattern.pattern, str(exc)) except Exception, e: exc_info = sys.exc_info() print exc_info assert False, "%s raised an unexpected exception type: "\ "expected=%s, actual=%s (%s)"\ % (callsig, exception, exc_info[0], unicode(e)) else: assert False, "%s did not raise %s" % (callsig, exception) sponge-0.3.1/tests/unit/test_contrib.py0000644000175000017500000001722211244504474020005 0ustar gabrielgabriel#!/usr/bin/env python # -*- coding: utf-8; -*- # # Copyright (C) 2009 Gabriel Falcão # # 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 2 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, write to the # Free Software Foundation, Inc., 59 Temple Place - Suite 330, # Boston, MA 02111-1307, USA. import cherrypy from mox import Mox from nose.tools import assert_equal from utils import assert_raises from sponge.contrib import controllers class TestImageHandler: def __init__(self): self.handler = controllers.ImageHandler() def test_is_exposed(self): message = 'The ImageHandler should be exposed, ' \ 'so that CherryPy can see it' assert self.handler.exposed is True, message def test_return_not_found_with_no_args(self): got = self.handler() msg1 = 'the response should be "not found", got %s' % repr(got) msg2 = 'The response status code should be 404, got %r' % \ cherrypy.response.status assert got == 'not found', msg1 assert cherrypy.response.status == 404, msg2 def test_calls_jpeg_when_args_length_less_than_3(self): mox = Mox() mox.StubOutWithMock(controllers, 'jpeg') ret = 'should_be_a_pil_img' controllers.jpeg(path='arg1/arg2').AndReturn(ret) mox.ReplayAll() got = self.handler('arg1', 'arg2') mox.VerifyAll() msg = 'Expected "%s", got %r' % (ret, got) assert got == ret, msg def test_calls_jpeg_when_args_length_equals_3(self): mox = Mox() mox.StubOutWithMock(controllers, 'jpeg') ret = 'should_be_a_pil_img' controllers.jpeg(path='arg1/arg2/arg3').AndReturn(ret) mox.ReplayAll() got = self.handler('arg1', 'arg2', 'arg3') mox.VerifyAll() msg = 'Expected "%s", got %r' % (ret, got) assert got == ret, msg def test_calls_jpeg_when_args_length_bigger_than_3_no_crop(self): mox = Mox() mox.StubOutWithMock(controllers, 'jpeg') ret = 'should_be_a_pil_img' controllers.jpeg(path='arg1/arg2/arg3/arg4').AndReturn(ret) mox.ReplayAll() got = self.handler('arg1', 'arg2', 'arg3', 'arg4') mox.VerifyAll() msg = 'Expected "%s", got %r' % (ret, got) assert got == ret, msg def test_calls_jpeg_when_args_length_bigger_than_3_crop_no_proportion(self): mox = Mox() mox.StubOutWithMock(controllers, 'jpeg') ret = 'should_be_a_pil_img' controllers.jpeg(path='crop/arg2/arg3/arg4').AndReturn(ret) mox.ReplayAll() got = self.handler('crop', 'arg2', 'arg3', 'arg4') mox.VerifyAll() msg = 'Expected "%s", got %r' % (ret, got) assert got == ret, msg def test_calls_jpeg_when_args_length_equals_3_and_crop(self): mox = Mox() mox.StubOutWithMock(controllers, 'jpeg') mox.StubOutWithMock(controllers, 'picture') ret = 'should_be_a_pil_img' controllers.jpeg(path='crop/200x100/image.jpg') controllers.picture(path='image.jpg', width=200, height=100). \ AndReturn(ret) mox.ReplayAll() got = self.handler('crop', '200x100', 'image.jpg') mox.VerifyAll() msg = 'Expected "%s", got %r' % (ret, got) assert got == ret, msg def test_creation_takes_optional_cache_path_string(self): assert_raises(TypeError, controllers.ImageHandler, 5, exc_pattern=r'The path given to ImageHandler ' \ 'to cache must be a string, got 5') def test_caching_fails_if_cache_path_does_not_exist(self): mox = Mox() class ImageHandlerStub(controllers.ImageHandler): fs = mox.CreateMockAnything() ImageHandlerStub.fs.exists('/full/path/to/cache').AndReturn(False) mox.ReplayAll() assert_raises(controllers.InvalidCachePath, ImageHandlerStub, '/full/path/to/cache', exc_pattern=r'The given path \(/full/path/to/cache\) ' \ 'does not exist, so that ImageHandler can not save ' \ 'cache files there.') mox.VerifyAll() def test_caching_return_if_already_exists(self): mox = Mox() old_jpeg = controllers.jpeg old_picture = controllers.picture old_static = controllers.static mox.StubOutWithMock(controllers, 'static') controllers.jpeg = mox.CreateMockAnything() controllers.picture = mox.CreateMockAnything() cache_at = '/full/path/to/cache' class ImageHandlerStub(controllers.ImageHandler): fs = mox.CreateMockAnything() ImageHandlerStub.fs.exists(cache_at).AndReturn(True) controllers.jpeg(path='imgs/image.jpg') ImageHandlerStub.fs.join(cache_at, 'imgs/image.jpg'). \ AndReturn('/should/be/cache/full/path.jpg') ImageHandlerStub.fs.exists('/should/be/cache/full/path.jpg'). \ AndReturn(True) controllers.static.serve_file('/should/be/cache/full/path.jpg', 'image/jpeg'). \ AndReturn('should-be-image-data') mox.ReplayAll() try: img = ImageHandlerStub(cache_at) assert img.should_cache assert_equal(img.cache_path, cache_at) got = img('imgs', 'image.jpg') assert_equal(got, 'should-be-image-data') mox.VerifyAll() finally: controllers.jpeg = old_jpeg controllers.picture = old_picture mox.UnsetStubs() def test_caching_opens_if_does_not_exist(self): mox = Mox() old_jpeg = controllers.jpeg old_picture = controllers.picture controllers.jpeg = mox.CreateMockAnything() controllers.picture = mox.CreateMockAnything() cache_at = '/full/path/to/cache' class ImageHandlerStub(controllers.ImageHandler): fs = mox.CreateMockAnything() ImageHandlerStub.fs.exists(cache_at).AndReturn(True) controllers.jpeg(path='imgs/image.jpg').AndReturn('fake-img') ImageHandlerStub.fs.join(cache_at, 'imgs/image.jpg'). \ AndReturn('/should/be/cache/full/path.jpg') ImageHandlerStub.fs.exists('/should/be/cache/full/path.jpg'). \ AndReturn(False) ImageHandlerStub.fs.dirname('/should/be/cache/full/path.jpg'). \ AndReturn('dir-name') ImageHandlerStub.fs.mkdir('dir-name') file_mock = mox.CreateMockAnything() ImageHandlerStub.fs.open_raw('/should/be/cache/full/path.jpg', 'w'). \ AndReturn(file_mock) file_mock.write('fake-img') file_mock.close() mox.ReplayAll() try: img = ImageHandlerStub(cache_at) assert img.should_cache assert_equal(img.cache_path, cache_at) got = img('imgs', 'image.jpg') assert_equal(got, 'fake-img') mox.VerifyAll() finally: controllers.jpeg = old_jpeg controllers.picture = old_picture sponge-0.3.1/tests/unit/__init__.py0000644000175000017500000000000011244504474017027 0ustar gabrielgabrielsponge-0.3.1/tests/unit/test_helpers.py0000644000175000017500000002763311244504474020016 0ustar gabrielgabriel#!/usr/bin/env python # -*- coding: utf-8; -*- # # Copyright (C) 2009 Gabriel Falcão # # 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 2 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, write to the # Free Software Foundation, Inc., 59 Temple Place - Suite 330, # Boston, MA 02111-1307, USA. import cherrypy from mox import Mox from nose.tools import assert_equal from utils import assert_raises from sponge.helpers import pagination class TestPaginator: def check_paginator(self, params, output): """ Helper method that instantiates a pagination.Paginator object from the passed params and then checks that its attributes match the passed output. """ count, num_pages, page_range = output paginator = pagination.Paginator(*params) self.check_attribute('count', paginator, count, params) self.check_attribute('num_pages', paginator, num_pages, params) self.check_attribute('page_range', paginator, page_range, params) def check_attribute(self, name, paginator, expected, params): """ Helper method that checks a single attribute and gives a nice error message upon test failure. """ got = getattr(paginator, name) assert_equal(expected, got, "For '%s', expected %s but got %s. pagination.Paginator parameters were: %s" % (name, expected, got, params)) def test_paginator(self): """ Tests the paginator attributes using varying inputs. """ nine = [1, 2, 3, 4, 5, 6, 7, 8, 9] ten = nine + [10] eleven = ten + [11] tests = ( # Each item is two tuples: # First tuple is pagination.Paginator parameters - object_list, per_page, # orphans, and allow_empty_first_page. # Second tuple is resulting pagination.Paginator attributes - count, # num_pages, and page_range. # Ten items, varying orphans, no empty first page. ((ten, 4, 0, False), (10, 3, [1, 2, 3])), ((ten, 4, 1, False), (10, 3, [1, 2, 3])), ((ten, 4, 2, False), (10, 2, [1, 2])), ((ten, 4, 5, False), (10, 2, [1, 2])), ((ten, 4, 6, False), (10, 1, [1])), # Ten items, varying orphans, allow empty first page. ((ten, 4, 0, True), (10, 3, [1, 2, 3])), ((ten, 4, 1, True), (10, 3, [1, 2, 3])), ((ten, 4, 2, True), (10, 2, [1, 2])), ((ten, 4, 5, True), (10, 2, [1, 2])), ((ten, 4, 6, True), (10, 1, [1])), # One item, varying orphans, no empty first page. (([1], 4, 0, False), (1, 1, [1])), (([1], 4, 1, False), (1, 1, [1])), (([1], 4, 2, False), (1, 1, [1])), # One item, varying orphans, allow empty first page. (([1], 4, 0, True), (1, 1, [1])), (([1], 4, 1, True), (1, 1, [1])), (([1], 4, 2, True), (1, 1, [1])), # Zero items, varying orphans, no empty first page. (([], 4, 0, False), (0, 0, [])), (([], 4, 1, False), (0, 0, [])), (([], 4, 2, False), (0, 0, [])), # Zero items, varying orphans, allow empty first page. (([], 4, 0, True), (0, 1, [1])), (([], 4, 1, True), (0, 1, [1])), (([], 4, 2, True), (0, 1, [1])), # Number if items one less than per_page. (([], 1, 0, True), (0, 1, [1])), (([], 1, 0, False), (0, 0, [])), (([1], 2, 0, True), (1, 1, [1])), ((nine, 10, 0, True), (9, 1, [1])), # Number if items equal to per_page. (([1], 1, 0, True), (1, 1, [1])), (([1, 2], 2, 0, True), (2, 1, [1])), ((ten, 10, 0, True), (10, 1, [1])), # Number if items one more than per_page. (([1, 2], 1, 0, True), (2, 2, [1, 2])), (([1, 2, 3], 2, 0, True), (3, 2, [1, 2])), ((eleven, 10, 0, True), (11, 2, [1, 2])), # Number if items one more than per_page with one orphan. (([1, 2], 1, 1, True), (2, 1, [1])), (([1, 2, 3], 2, 1, True), (3, 1, [1])), ((eleven, 10, 1, True), (11, 1, [1])), ) for params, output in tests: self.check_paginator(params, output) def check_indexes(self, params, page_num, indexes): """ Helper method that instantiates a pagination.Paginator object from the passed params and then checks that the start and end indexes of the passed page_num match those given as a 2-tuple in indexes. """ paginator = pagination.Paginator(*params) if page_num == 'first': page_num = 1 elif page_num == 'last': page_num = paginator.num_pages page = paginator.page(page_num) start, end = indexes msg = ("For %s of page %s, expected %s but got %s." " pagination.Paginator parameters were: %s") assert_equal(start, page.start_index(), msg % ('start index', page_num, start, page.start_index(), params)) assert_equal(end, page.end_index(), msg % ('end index', page_num, end, page.end_index(), params)) def test_page_indexes(self): """ Tests that paginator pages have the correct start and end indexes. """ ten = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] tests = ( # Each item is three tuples: # First tuple is pagination.Paginator parameters - object_list, per_page, # orphans, and allow_empty_first_page. # Second tuple is the start and end indexes of the first page. # Third tuple is the start and end indexes of the last page. # Ten items, varying per_page, no orphans. ((ten, 1, 0, True), (1, 1), (10, 10)), ((ten, 2, 0, True), (1, 2), (9, 10)), ((ten, 3, 0, True), (1, 3), (10, 10)), ((ten, 5, 0, True), (1, 5), (6, 10)), # Ten items, varying per_page, with orphans. ((ten, 1, 1, True), (1, 1), (9, 10)), ((ten, 1, 2, True), (1, 1), (8, 10)), ((ten, 3, 1, True), (1, 3), (7, 10)), ((ten, 3, 2, True), (1, 3), (7, 10)), ((ten, 3, 4, True), (1, 3), (4, 10)), ((ten, 5, 1, True), (1, 5), (6, 10)), ((ten, 5, 2, True), (1, 5), (6, 10)), ((ten, 5, 5, True), (1, 10), (1, 10)), # One item, varying orphans, no empty first page. (([1], 4, 0, False), (1, 1), (1, 1)), (([1], 4, 1, False), (1, 1), (1, 1)), (([1], 4, 2, False), (1, 1), (1, 1)), # One item, varying orphans, allow empty first page. (([1], 4, 0, True), (1, 1), (1, 1)), (([1], 4, 1, True), (1, 1), (1, 1)), (([1], 4, 2, True), (1, 1), (1, 1)), # Zero items, varying orphans, allow empty first page. (([], 4, 0, True), (0, 0), (0, 0)), (([], 4, 1, True), (0, 0), (0, 0)), (([], 4, 2, True), (0, 0), (0, 0)), ) for params, first, last in tests: self.check_indexes(params, 'first', first) self.check_indexes(params, 'last', last) # When no items and no empty first page, we should get pagination.EmptyPage error. assert_raises(pagination.EmptyPage, self.check_indexes, ([], 4, 0, False), 1, None) assert_raises(pagination.EmptyPage, self.check_indexes, ([], 4, 1, False), 1, None) assert_raises(pagination.EmptyPage, self.check_indexes, ([], 4, 2, False), 1, None) def test_representation(self): class PaginatorStub: num_pages = 10 page = pagination.Page([], 2, PaginatorStub) assert_equal('', repr(page)) def test_has_next_true(self): class PaginatorStub: num_pages = 10 page = pagination.Page([], 2, PaginatorStub) message = '%s should have next page, since is the page 2 of 10' % page assert page.has_next(), message def test_has_next_false(self): class PaginatorStub: num_pages = 2 page = pagination.Page([], 2, PaginatorStub) message = '%s should not have next page, since is the page 2 of 2' % page assert not page.has_next(), message def test_has_previous_true(self): class PaginatorStub: num_pages = 10 page = pagination.Page([], 2, PaginatorStub) message = '%s should have previous page, since is the page 2' % page assert page.has_previous(), message def test_has_previous_false(self): class PaginatorStub: num_pages = 2 page = pagination.Page([], 1, PaginatorStub) message = '%s should not have previous page, since is the page 1' % page assert not page.has_previous(), message def test_has_other_pages_true_1of2(self): class PaginatorStub: num_pages = 2 page = pagination.Page([], 1, PaginatorStub) message = '%s should have other pages' % page assert page.has_other_pages(), message def test_has_other_pages_true_2of2(self): class PaginatorStub: num_pages = 2 page = pagination.Page([], 2, PaginatorStub) message = '%s should have other pages' % page assert page.has_other_pages(), message def test_has_other_pages_true_2of3(self): class PaginatorStub: num_pages = 3 page = pagination.Page([], 2, PaginatorStub) message = '%s should have other pages' % page assert page.has_other_pages(), message def test_has_other_pages_true_3of3(self): class PaginatorStub: num_pages = 3 page = pagination.Page([], 3, PaginatorStub) message = '%s should have other pages' % page assert page.has_other_pages(), message def test_has_other_pages_false(self): class PaginatorStub: num_pages = 1 page = pagination.Page([], 1, PaginatorStub) message = '%s should not have other pages' % page assert not page.has_other_pages(), message def test_next_page_number(self): class PaginatorStub: num_pages = 2 page = pagination.Page([], 1, PaginatorStub) got = page.next_page_number() expected = 2 message = "%s's next page number should be 2, got %r" % (page, got) assert got == expected, message def test_previous_page_number(self): class PaginatorStub: num_pages = 2 page = pagination.Page([], 2, PaginatorStub) got = page.previous_page_number() expected = 1 message = "%s's previous page number should be 1, got %r" % (page, got) assert got == expected, message def test_page_validate_number_not_integer(self): p = pagination.Paginator(range(5), 2) assert_raises(pagination.PageNotAnInteger, p.validate_number, '1sda0') def test_page_validate_number_less_than_1(self): p = pagination.Paginator(range(5), 2) assert_raises(pagination.EmptyPage, p.validate_number, -1) def test_page_validate_number_when_not_allowing_1st_empty_page(self): p = pagination.Paginator([], 2, allow_empty_first_page=False) assert_raises(pagination.EmptyPage, p.validate_number, 1) sponge-0.3.1/tests/unit/test_sponge_config.py0000644000175000017500000002716211244504474021171 0ustar gabrielgabriel# -*- coding: utf-8 -*- import sys from StringIO import StringIO from mox import Mox from nose.tools import assert_equals from utils import assert_raises from sponge import core from sponge.core import SpongeConfig, ConfigValidator config_dict = { 'run-as': 'wsgi', 'host': '0.0.0.0', 'port': 80, 'autoreload': False, 'application': { 'path': 'path/to/project', 'template-dir': '/path/to/project/templates', 'image-dir': '/path/to/project/images', 'static': { '/media': 'my/media' }, 'classes': { 'SomeController': '/' } }, 'extra': { 'something': '/bla/foo/bar' } } def test_takes_dict_on_creation(): cf = ConfigValidator({}) assert_raises(TypeError, SpongeConfig, None, cf, exc_pattern=r'SpongeConfig parameter 1 ' \ 'must be a dict, got None.') assert_raises(TypeError, SpongeConfig, 5, cf, exc_pattern=r'SpongeConfig parameter 1 ' \ 'must be a dict, got 5.') def test_can_set_setting(): d = {} cf = ConfigValidator({}) sp = SpongeConfig(d, cf) sp.set_setting('my-setting', 'my-value') assert_equals(d['my-setting'], 'my-value') def test_setup_all_takes_string_path(): d = {} cf = ConfigValidator({}) sp = SpongeConfig(d, cf) assert_raises(TypeError, sp.setup_all, tuple(), exc_pattern=r'SpongeConfig.setup_all takes a ' \ 'string, got ().') assert_raises(TypeError, sp.setup_all, None, exc_pattern=r'SpongeConfig.setup_all takes a ' \ 'string, got None.') assert_raises(TypeError, sp.setup_all, 10, exc_pattern=r'SpongeConfig.setup_all takes a ' \ 'string, got 10.') def test_setup_all_path_must_be_absolute(): d = {} cf = ConfigValidator({}) sp = SpongeConfig(d, cf) assert_raises(TypeError, sp.setup_all, 'relative/path/', exc_pattern=r'SpongeConfig.setup_all takes a ' \ 'absolute path, got relative/path/.') def test_can_setup_all_without_routes_attr(): mox = Mox() d = {} class_loader = core.ClassLoader cherrypy = core.cherrypy core.ClassLoader = mox.CreateMockAnything() core.cherrypy = mox.CreateMockAnything() core.cherrypy.tree = mox.CreateMockAnything() cloader_mock = mox.CreateMockAnything() core.ClassLoader('/absolute/path/path/to/project').AndReturn(cloader_mock) class_mock = lambda: 'should_be_some_controller_instance' class_mock.__name__ = 'class_mock_lambda' cloader_mock.load('SomeController').AndReturn(class_mock) core.cherrypy.tree.mount(root='should_be_some_controller_instance', script_name='/', config={ '/media': { 'tools.staticdir.dir': '/absolute/path/my/media', 'tools.staticdir.on': True } }) cf = core.ConfigValidator(config_dict) sp = core.SpongeConfig(d, cf) sp.set_setting = mox.CreateMockAnything() sp.set_setting('server.socket_port', 80) sp.set_setting('server.socket_host', '0.0.0.0') sp.set_setting('tools.sessions.on', True) sp.set_setting('tools.sessions.timeout', 60) sp.set_setting('tools.encode.on', True) sp.set_setting('tools.encode.encoding', 'utf-8') sp.set_setting('tools.trailing_slash.on', True) sp.set_setting('sponge', config_dict) sp.set_setting('sponge.root', '/absolute/path') sp.set_setting('sponge.extra', config_dict['extra']) sp.set_setting('template.dir', '/path/to/project/templates') sp.set_setting('image.dir', '/path/to/project/images') mox.ReplayAll() sys.stderr = StringIO() try: sp.setup_all('/absolute/path/') assert_equals(sys.stderr.getvalue(), '\nWARNING: The class %s has no routes\n' % class_mock.__name__) mox.VerifyAll() finally: core.ClassLoader = class_loader core.cherrypy = cherrypy sys.stderr = sys.__stderr__ def test_can_setup_all_without_routes_dict(): mox = Mox() d = {} class_loader = core.ClassLoader cherrypy = core.cherrypy core.ClassLoader = mox.CreateMockAnything() core.cherrypy = mox.CreateMockAnything() core.cherrypy.tree = mox.CreateMockAnything() cloader_mock = mox.CreateMockAnything() core.ClassLoader('/absolute/path/path/to/project').AndReturn(cloader_mock) class_mock = mox.CreateMockAnything() class_mock.__routes__ = 'blabla' cloader_mock.load('SomeController').AndReturn(class_mock) class_mock().AndReturn('should_be_some_controller_instance') core.cherrypy.tree.mount(root='should_be_some_controller_instance', script_name='/', config={ '/media': { 'tools.staticdir.dir': '/absolute/path/my/media', 'tools.staticdir.on': True } }) cf = core.ConfigValidator(config_dict) sp = core.SpongeConfig(d, cf) sp.set_setting = mox.CreateMockAnything() sp.set_setting('server.socket_port', 80) sp.set_setting('server.socket_host', '0.0.0.0') sp.set_setting('tools.sessions.on', True) sp.set_setting('tools.sessions.timeout', 60) sp.set_setting('tools.encode.on', True) sp.set_setting('tools.encode.encoding', 'utf-8') sp.set_setting('tools.trailing_slash.on', True) sp.set_setting('sponge', config_dict) sp.set_setting('sponge.root', '/absolute/path') sp.set_setting('sponge.extra', config_dict['extra']) sp.set_setting('template.dir', '/path/to/project/templates') sp.set_setting('image.dir', '/path/to/project/images') mox.ReplayAll() sys.stderr = StringIO() try: sp.setup_all('/absolute/path/') assert_equals(sys.stderr.getvalue(), '') mox.VerifyAll() finally: core.ClassLoader = class_loader core.cherrypy = cherrypy sys.stderr = sys.__stderr__ def test_setup_all_fails_on_import(): mox = Mox() d = {} class_loader = core.ClassLoader cherrypy = core.cherrypy core.ClassLoader = mox.CreateMockAnything() core.cherrypy = mox.CreateMockAnything() core.cherrypy.tree = mox.CreateMockAnything() cloader_mock = mox.CreateMockAnything() core.ClassLoader('/absolute/path/path/to/project').AndReturn(cloader_mock) class_mock = mox.CreateMockAnything() cloader_mock.load('SomeController').AndRaise(Exception('foo error')) cf = core.ConfigValidator(config_dict) sp = core.SpongeConfig(d, cf) mox.ReplayAll() try: sys.stderr = StringIO() assert_raises(SystemExit, sp.setup_all, '/absolute/path/') got = sys.stderr.getvalue() sys.stderr = sys.__stderr__ format_args = 'SomeController', \ '/absolute/path/path/to/project', \ 'foo error' assert_equals(got, '\nSponge could not find the class %s ' \ 'at %s, verify if your settings.yml ' \ 'is configured as well\n%s\n' % format_args) mox.VerifyAll() finally: core.ClassLoader = class_loader core.cherrypy = cherrypy def test_can_setup_all_with_routes(): mox = Mox() d = {} class_loader = core.ClassLoader cherrypy = core.cherrypy core.ClassLoader = mox.CreateMockAnything() core.cherrypy = mox.CreateMockAnything() core.cherrypy.tree = mox.CreateMockAnything() core.cherrypy.dispatch = mox.CreateMockAnything() cloader_mock = mox.CreateMockAnything() core.ClassLoader('/absolute/path/path/to/project').AndReturn(cloader_mock) class_mock = mox.CreateMockAnything() class_mock.__name__ = "MyPhotoController" class_mock.__routes__ = [ ('show_photos', { 'route': '/photos', 'method': 'list_photos', }), (None, { 'route': '/photo/:id/edit', 'method': 'edit', }) ] controller_mock = mox.CreateMockAnything() cloader_mock.load('SomeController').AndReturn(class_mock) class_mock().AndReturn(controller_mock) class_mock().AndReturn(controller_mock) routes_mock = mox.CreateMockAnything() core.cherrypy.dispatch.RoutesDispatcher().AndReturn(routes_mock) routes_mock.connect(name='show_photos', controller=controller_mock, route='/photos', action='list_photos') routes_mock.connect(name='MyPhotoController.edit', controller=controller_mock, route='/photo/:id/edit', action='edit') core.cherrypy.tree.mount(root=None, config={ '/': { 'request.dispatch': routes_mock }, '/media': { 'tools.staticdir.dir': '/absolute/path/my/media', 'tools.staticdir.on': True } }) cf = core.ConfigValidator(config_dict) sp = core.SpongeConfig(d, cf) mox.ReplayAll() try: sp.setup_all('/absolute/path/') mox.VerifyAll() finally: core.ClassLoader = class_loader core.cherrypy = cherrypy def test_boot(): mox = Mox() d = {} class_loader = core.ClassLoader cherrypy = core.cherrypy core.ClassLoader = mox.CreateMockAnything() core.cherrypy = mox.CreateMockAnything() core.cherrypy.tree = mox.CreateMockAnything() module_mock0 = mox.CreateMockAnything() module_mock0.my_function() cloader_mock0 = mox.CreateMockAnything() cloader_mock0.get_module().AndReturn(module_mock0) core.ClassLoader('/path/to/boot/file.py').AndReturn(cloader_mock0) cloader_mock = mox.CreateMockAnything() core.ClassLoader('/absolute/path/path/to/project').AndReturn(cloader_mock) class_mock = mox.CreateMockAnything() class_mock.__routes__ = 'blabla' cloader_mock.load('SomeController').AndReturn(class_mock) class_mock().AndReturn('should_be_some_controller_instance') core.cherrypy.tree.mount(root='should_be_some_controller_instance', script_name='/', config={ '/media': { 'tools.staticdir.dir': '/absolute/path/my/media', 'tools.staticdir.on': True } }) my_config = config_dict.copy() my_config['application']['boot'] = { 'path': '/path/to/boot/file.py', 'callable': 'my_function' } cf = core.ConfigValidator(my_config) sp = core.SpongeConfig(d, cf) sp.set_setting = mox.CreateMockAnything() sp.set_setting('server.socket_port', 80) sp.set_setting('server.socket_host', '0.0.0.0') sp.set_setting('tools.sessions.on', True) sp.set_setting('tools.sessions.timeout', 60) sp.set_setting('tools.encode.on', True) sp.set_setting('tools.encode.encoding', 'utf-8') sp.set_setting('tools.trailing_slash.on', True) sp.set_setting('sponge', config_dict) sp.set_setting('sponge.root', '/absolute/path') sp.set_setting('sponge.extra', config_dict['extra']) sp.set_setting('template.dir', '/path/to/project/templates') sp.set_setting('image.dir', '/path/to/project/images') mox.ReplayAll() sys.stderr = StringIO() try: sp.setup_all('/absolute/path/') assert_equals(sys.stderr.getvalue(), '') mox.VerifyAll() finally: core.ClassLoader = class_loader core.cherrypy = cherrypy sys.stderr = sys.__stderr__ sponge-0.3.1/tests/unit/test_sponge_data.py0000644000175000017500000000210611244504474020624 0ustar gabrielgabriel#!/usr/bin/env python # -*- coding: utf-8; -*- # # Copyright (C) 2009 Gabriel Falcão # # 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 2 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, write to the # Free Software Foundation, Inc., 59 Temple Place - Suite 330, # Boston, MA 02111-1307, USA. from nose.tools import assert_equals from sponge import data def test_get_file(): old_file = data.__file__ data.__file__ = '/path/to/file.py' got = data.SpongeData.get_file('blabla.jpg') assert_equals(got, '/path/to/blabla.jpg') data.__file__ = old_file sponge-0.3.1/tests/unit/test_class_loader.py0000644000175000017500000001023011244504474020770 0ustar gabrielgabriel#!/usr/bin/env python # -*- coding: utf-8; -*- # # Copyright (C) 2009 Gabriel Falcão # # 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 2 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, write to the # Free Software Foundation, Inc., 59 Temple Place - Suite 330, # Boston, MA 02111-1307, USA. from mox import Mox from nose.tools import assert_equals from utils import assert_raises from sponge.core import io def test_class_loader_takes_a_string_path_raises_with_number(): assert_raises(TypeError, io.ClassLoader, 5, exc_pattern=r'ClassLoader takes a string ' \ 'as path parameter, got 5.') def test_class_loader_takes_a_string_path_raises_with_none(): assert_raises(TypeError, io.ClassLoader, None, exc_pattern=r'ClassLoader takes a string ' \ 'as path parameter, got None.') def test_class_loader_loads_from_file(): mox = Mox() mox.StubOutWithMock(io, 'os') mox.StubOutWithMock(io.sys, 'path') io.os.path = mox.CreateMockAnything() io.__import__ = mox.CreateMockAnything() class_dir = '/full/path/to/module/or' class_file = 'file.py' class_path = '%s/%s' % (class_dir, class_file) io.os.path.isdir(class_path).AndReturn(False) io.os.path.split(class_path).AndReturn((class_dir, class_file)) io.os.path.splitext(class_file).AndReturn(('file', '.py')) io.sys.path.append(class_dir) io.sys.path.pop() module_mock = mox.CreateMockAnything() module_mock.ClassIWantToLoad = 'should_be_expected_class' io.__import__('file').AndReturn(module_mock) mox.ReplayAll() try: cl = io.ClassLoader(class_path) assert_equals(cl.load('ClassIWantToLoad'), 'should_be_expected_class') mox.VerifyAll() finally: io.__import__ = __import__ mox.UnsetStubs() def test_class_loader_loads_from_module(): mox = Mox() mox.StubOutWithMock(io, 'os') mox.StubOutWithMock(io.sys, 'path') io.os.path = mox.CreateMockAnything() io.__import__ = mox.CreateMockAnything() class_path = '/full/path/to/module/' module_name = 'module' module_dir = '/full/path/to/' io.os.path = mox.CreateMockAnything() io.os.path.isdir(class_path).AndReturn(True) io.os.path.split(class_path.rstrip('/')).AndReturn((module_dir, module_name)) io.sys.path.append(module_dir) io.sys.path.pop() module_mock = mox.CreateMockAnything() module_mock.ClassIWantToLoad = 'should_be_expected_class' io.__import__('module').AndReturn(module_mock) mox.ReplayAll() try: cl = io.ClassLoader(class_path) assert_equals(cl.load('ClassIWantToLoad'), 'should_be_expected_class') mox.VerifyAll() finally: io.__import__ = __import__ mox.UnsetStubs() def test_get_module(): mox = Mox() mox.StubOutWithMock(io, 'os') mox.StubOutWithMock(io.sys, 'path') io.os.path = mox.CreateMockAnything() io.__import__ = mox.CreateMockAnything() class_path = '/full/path/to/module/' module_name = 'module' module_dir = '/full/path/to/' io.os.path = mox.CreateMockAnything() io.os.path.isdir(class_path).AndReturn(True) io.os.path.split(class_path.rstrip('/')).AndReturn((module_dir, module_name)) io.sys.path.append(module_dir) io.sys.path.pop() module_mock = mox.CreateMockAnything() module_mock.ClassIWantToLoad = 'should_be_expected_class' io.__import__('module').AndReturn(module_mock) mox.ReplayAll() try: cl = io.ClassLoader(class_path) assert_equals(cl.get_module(), module_mock) mox.VerifyAll() finally: io.__import__ = __import__ mox.UnsetStubs() sponge-0.3.1/tests/unit/test_bob.py0000644000175000017500000002261211244504474017106 0ustar gabrielgabriel#!/usr/bin/env python # -*- coding: utf-8; -*- # # Copyright (C) 2009 Gabriel Falcão # Copyright (C) 2009 Bernardo Heynemann # # 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 2 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, write to the # Free Software Foundation, Inc., 59 Temple Place - Suite 330, # Boston, MA 02111-1307, USA. import sys import yaml import cherrypy import optparse from os.path import abspath, join, dirname from mox import Mox from nose.tools import assert_equals from utils import assert_raises from sponge import bob from StringIO import StringIO basic_config = { 'run-as': 'wsgi', 'host': '0.0.0.0', 'port': 4000, 'autoreload': True, 'application': { 'classes': { 'HelloWorldController': '/', 'AjaxController': '/ajax', }, 'image-dir': None, 'path': None, 'template-dir': None, 'static': { '/media': None, }, }, } def test_can_create_bob(): b = bob.Bob() assert b assert isinstance(b, bob.Bob) def test_run_fails_with_unknown_args(): mox = Mox() mock_parser = mox.CreateMockAnything() mock_parser.parse_args().AndReturn(("options", ["args"])) mox.ReplayAll() b = bob.Bob(parser=mock_parser) sys.stderr = StringIO() assert_raises(SystemExit, b.run) assert_equals(sys.stderr.getvalue(), '\nargs is an invalid argument, choose one ' \ 'in create, go, start\n') sys.stderr = sys.__stderr__ mox.VerifyAll() def test_run_fails_without_args(): mox = Mox() mock_parser = mox.CreateMockAnything() mock_parser.parse_args().AndReturn(("options", [])) mox.ReplayAll() b = bob.Bob(parser=mock_parser) sys.stderr = StringIO() assert_raises(SystemExit, b.run) assert_equals(sys.stderr.getvalue(), '\nmissing argument, choose one ' \ 'in create, go, start\n') sys.stderr = sys.__stderr__ mox.VerifyAll() def test_run_calls_create_with_second_argument(): mox = Mox() mock_parser = mox.CreateMockAnything() mock_parser.parse_args().AndReturn(("options", ['create', 'some'])) b = bob.Bob(parser=mock_parser) b.create = mox.CreateMockAnything() b.create('some') mox.ReplayAll() b.run() mox.VerifyAll() def test_run_calls_go(): mox = Mox() mock_parser = mox.CreateMockAnything() mock_parser.parse_args().AndReturn(("options", ['go'])) b = bob.Bob(parser=mock_parser) b.go = mox.CreateMockAnything() b.go() mox.ReplayAll() b.run() mox.VerifyAll() def test_run_calls_start_with_second_argument(): mox = Mox() mock_parser = mox.CreateMockAnything() mock_parser.parse_args().AndReturn(("options", ['start', 'some'])) b = bob.Bob(parser=mock_parser) b.start = mox.CreateMockAnything() b.start('some') mox.ReplayAll() b.run() mox.VerifyAll() def test_go_through_main_run(): mox = Mox() bobby = bob.Bob old_sys = bob.sys mock_parser = mox.CreateMockAnything() file_system = mox.CreateMockAnything() bob.sys = mox.CreateMockAnything() bob_mock = mox.CreateMockAnything() bob_instance_mock = mox.CreateMockAnything() bob_instance_mock.run = mox.CreateMockAnything() bob_instance_mock.run().AndReturn(0) bob_mock.__call__(parser=mock_parser, fs=file_system).AndReturn(bob_instance_mock) bob.sys.exit(0) bob.Bob = bob_mock mox.ReplayAll() try: got = bob.run(parser=mock_parser, fs=file_system) mox.VerifyAll() finally: mox.UnsetStubs() bob.Bob = bobby bob.sys = old_sys def test_exit_without_args(): mox = Mox() mock_parser = mox.CreateMockAnything() b = bob.Bob(parser=mock_parser) assert_raises(SystemExit, b.exit, exc_pattern=r'1') def test_exit_with_specific_exit_code(): mox = Mox() mock_parser = mox.CreateMockAnything() b = bob.Bob(parser=mock_parser) assert_raises(SystemExit, b.exit, 100, exc_pattern=r'100') def test_configure(): mox = Mox() mock_parser = mox.CreateMockAnything() mox.StubOutWithMock(bob, 'yaml') config_validator = bob.ConfigValidator sponge_config = bob.SpongeConfig bob.ConfigValidator = mox.CreateMockAnything() bob.SpongeConfig = mox.CreateMockAnything() b = bob.Bob(parser=mock_parser) b.fs = mox.CreateMockAnything() b.fs.current_dir().AndReturn('should_be_current_dir') b.fs.current_dir('settings.yml'). \ AndReturn('/current/path/settings-yaml') file_mock = mox.CreateMockAnything() b.fs.open('/current/path/settings-yaml', 'r'). \ AndReturn(file_mock) file_mock.read().AndReturn('should-be-raw-yaml-text') bob.yaml.load('should-be-raw-yaml-text'). \ AndReturn('should-be-config-dict') bob.ConfigValidator('should-be-config-dict'). \ AndReturn('should-be-validator') config_mock = mox.CreateMockAnything() bob.SpongeConfig(cherrypy.config, 'should-be-validator'). \ AndReturn(config_mock) config_mock.setup_all('should_be_current_dir') mox.ReplayAll() try: b.configure() mox.VerifyAll() finally: mox.UnsetStubs() bob.ConfigValidator = config_validator bob.SpongeConfig = sponge_config def test_go(): mox = Mox() mox.StubOutWithMock(bob, 'cherrypy') b = bob.Bob() b.configure = mox.CreateMockAnything() b.configure() bob.cherrypy.quickstart() mox.ReplayAll() try: b.go() mox.VerifyAll() finally: mox.UnsetStubs() def test_create_fails_without_argument(): b = bob.Bob() sys.stderr = StringIO() assert_raises(SystemExit, b.create, None) assert_equals(sys.stderr.getvalue(), '\nmissing project name, try something like ' \ '"bob create foobar"\n') sys.stderr = sys.__stderr__ def test_create_fails_if_path_already_exists(): mox = Mox() b = bob.Bob() b.fs = mox.CreateMockAnything() b.fs.current_dir('my-project'). \ AndReturn('/full/path/to/my-project') b.fs.exists('/full/path/to/my-project'). \ AndReturn(True) mox.ReplayAll() try: sys.stderr = StringIO() assert_raises(SystemExit, b.create, 'my-project') assert_equals(sys.stderr.getvalue(), '\nThe path "/full/path/to/my-project" ' \ 'already exists. Maybe you could choose ' \ 'another name for your project ?\n') finally: sys.stderr = sys.__stderr__ def test_create_success(): mox = Mox() b = bob.Bob() b.fs = mox.CreateMockAnything() b.fs.join = join mox.StubOutWithMock(bob, 'SpongeData') mox.StubOutWithMock(bob, 'yaml') full_path = '/full/path/to/my-project' b.fs.current_dir('my-project'). \ AndReturn(full_path) b.fs.exists(full_path). \ AndReturn(False) b.fs.mkdir(full_path) file_mock = mox.CreateMockAnything() b.fs.open(join(full_path, 'settings.yml'), 'w'). \ AndReturn(file_mock) expected_dict = basic_config.copy() expected_dict['application'].update({ 'static': { '/media': join('media') }, 'path': join('app', 'controllers.py'), 'image-dir': join('media', 'img'), 'template-dir': join('templates'), }) bob.yaml.dump(expected_dict, indent=True).AndReturn('should-be-a-yaml') file_mock.write('should-be-a-yaml') file_mock.close() bob.SpongeData.get_file('project.zip'). \ AndReturn('should-be-path-to-zip-file') b.fs.extract_zip('should-be-path-to-zip-file', full_path) mox.ReplayAll() b.create('my-project') mox.VerifyAll() def test_start(): mox = Mox() b = bob.Bob() b.fs = mox.CreateMockAnything() b.create = mox.CreateMockAnything() b.go = mox.CreateMockAnything() b.create('foo-bar') b.fs.pushd('foo-bar') b.go() mox.ReplayAll() b.start('foo-bar') mox.VerifyAll() def test_fix_yml(): expected = """ test: with: Items: here And: Here """ wrong = """ test: with: {Items: here, And: Here} """ b = bob.Bob() got = b.fix_yml(wrong) assert_equals(got, expected) def test_bob_help(): b = bob.Bob() assert_equals(b.get_help(), "\n Sponge Bob is the responsible for " \ "managing\n the user's application and its modules. " \ "\n\nTo use type %prog [options] or %prog -h (--help) " \ "for help with the available options\n\nACTIONS:\n\ncreate " \ " - creates a new project, which means " \ "creating a new folder in current directory, named " \ "projectname\ngo start the cherrypy server using the " \ "configuration file settings.yml in current directory." \ "\nstart executes both bob create and bob go") sponge-0.3.1/tests/unit/test_image.py0000644000175000017500000001364011244504474017427 0ustar gabrielgabriel#!/usr/bin/env python # -*- coding: utf-8; -*- # # Copyright (C) 2009 Gabriel Falcão # # 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 2 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, write to the # Free Software Foundation, Inc., 59 Temple Place - Suite 330, # Boston, MA 02111-1307, USA. import re import Image import cherrypy from mox import Mox from utils import assert_raises from os.path import join from sponge.helpers import image def test_image_has_function_jpeg(): assert hasattr(image, 'jpeg'), 'sponge.image should have the function jpeg' assert callable(image.jpeg), 'sponge.image.jpeg should be callable' def test_jpeg_takes_path_as_param(): assert_raises(TypeError, image.jpeg, exc_pattern=r'jpeg.. takes at least 1 argument .0 given.') def test_jpeg_param_should_be_string(): assert_raises(TypeError, image.jpeg, None, exc_pattern=r'jpeg.. takes a string as parameter, got None.') def test_jpeg_success(): mox = Mox() path = '/path/to/mocked/img.jpg' mox.StubOutWithMock(image, 'Image') mox.StubOutWithMock(image, 'StringIO') stringio_mock = mox.CreateMockAnything() return_mock = mox.CreateMockAnything() img_mock = mox.CreateMockAnything() stringio_mock.getvalue().AndReturn(return_mock) image.StringIO.StringIO().AndReturn(stringio_mock) image.Image.open(path).AndReturn(img_mock) img_mock.save(stringio_mock, "JPEG", quality=100) cherrypy.config['image.dir'] = path mox.ReplayAll() return_got = image.jpeg(path) assert return_got == return_mock, 'The return of image.jpeg() should be %r, got %r' % (return_mock, return_got) mime = cherrypy.response.headers['Content-type'] assert mime == 'image/jpeg', 'The response header "Content-type" should be image/jpeg, but got %r' % mime mox.VerifyAll() del cherrypy.config['image.dir'] def test_jpeg_return_string_when_file_not_found(): filename = 'foo-file.jpg' path = join('bazbar', filename) mox = Mox() mox.StubOutWithMock(image, 'Image') image.Image.open(path).AndRaise(IOError('File not found: foo-file.jpg')) mox.ReplayAll() ret = image.jpeg(filename, base_path='bazbar') assert isinstance(ret, unicode), 'The return value should be unicode, but is %r' % type(ret) assert ret == 'File not found: foo-file.jpg', 'Wrong error description: %r' % ret mox.VerifyAll() def test_crop_to_fit_bigger(): img = Image.new('RGBA', (653, 342)) ret = image.crop_to_fit(img, (320, 240)) assert ret.size == (320, 240), 'Got expected size 320x240, got %rx%r.' % ret.size def test_crop_to_fit_lower(): img = Image.new('RGBA', (500, 750)) ret = image.crop_to_fit(img, (320, 240)) assert ret.size == (320, 240), 'Got expected size 320x240, got %rx%r.' % ret.size def test_picture_takes_3_parameters(): assert_raises(TypeError, image.picture, exc_pattern=r'picture.. takes at least 3 arguments .0 given.') def test_picture_first_param_should_be_string(): assert_raises(TypeError, image.picture, None, None, None, exc_pattern=r'picture.. takes a string as path parameter, got None.') def test_picture_second_param_should_be_int(): assert_raises(TypeError, image.picture, '', None, None, exc_pattern=r'picture.. takes a integer as width parameter, got None.') def test_picture_third_param_should_be_int(): assert_raises(TypeError, image.picture, '', 1, None, exc_pattern=r'picture.. takes a integer as height parameter, got None.') def test_picture_with_crop_true_will_crop_to_fit(): base_path = '/basepath/for/test_picture_success' path = 'my_picture.jpg' mox = Mox() mox.StubOutWithMock(image, 'Image') mox.StubOutWithMock(image, 'StringIO') mox.StubOutWithMock(image, 'crop_to_fit') img_mock = mox.CreateMockAnything() img_mock.size = 300, 300 stringio_mock = mox.CreateMockAnything() return_mock = mox.CreateMockAnything() stringio_mock.getvalue().AndReturn(return_mock) image.StringIO.StringIO().AndReturn(stringio_mock) cherrypy.config['image.dir'] = base_path image.Image.open(join(base_path, path)).AndReturn(img_mock) img_mock.save(stringio_mock, 'JPEG', quality=100) image.crop_to_fit(img_mock, (100, 100)).AndReturn(img_mock) mox.ReplayAll() ret = image.picture(path, 100, 100, crop=True, center=False) assert ret == return_mock, "Expected %r. Got %r." % (return_mock, ret) mox.VerifyAll() del cherrypy.config['image.dir'] def test_picture_with_center_true_will_create_new_image_and_paste(): base_path = '/base/path' path = 'image.jpg' mox = Mox() mox.StubOutWithMock(image, 'Image') mox.StubOutWithMock(image, 'StringIO') img_mock = mox.CreateMockAnything() img_mock.size = 300, 300 stringio_mock = mox.CreateMockAnything() return_mock = mox.CreateMockAnything() stringio_mock.getvalue().AndReturn(return_mock) image.StringIO.StringIO().AndReturn(stringio_mock) cherrypy.config['image.dir'] = base_path new_img_mock = mox.CreateMockAnything() new_img_mock.paste(img_mock, (-100, -100)) new_img_mock.save(stringio_mock, 'JPEG', quality=100) image.Image.open(join(base_path, path)).AndReturn(img_mock) image.Image.new('RGBA', (100, 100), 0xffffff).AndReturn(new_img_mock) mox.ReplayAll() ret = image.picture(path, 100, 100, crop=False, center=True) assert ret == return_mock, "Expected %r. Got %r." % (return_mock, ret) mox.VerifyAll() del cherrypy.config['image.dir'] sponge-0.3.1/tests/unit/test_controller.py0000644000175000017500000000451611244504474020532 0ustar gabrielgabriel#!/usr/bin/env python # -*- coding: utf-8; -*- # # Copyright (C) 2009 Gabriel Falcão # # 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 2 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, write to the # Free Software Foundation, Inc., 59 Temple Place - Suite 330, # Boston, MA 02111-1307, USA. import cherrypy from mox import Mox from nose.tools import assert_equal from utils import assert_raises from sponge import controller def test_route_return_tuple(): @controller.route('route_name', 'route/:foo/other/:bar') def my_func(): return 'it is my func' assert isinstance(my_func, tuple), 'A function decorated with ' \ 'route should be a tuple' assert len(my_func) == 2, 'the tuple should have two items' assert callable(my_func[0]), 'first item of tuple should be the actual callable' assert isinstance(my_func[1], tuple) def test_controller_with_route_named(): class MyController(controller.Controller): @controller.route('/path/:to/:route/:param3', name='my_route_name') def some_method(self, to, route, param3): return 'something' assert hasattr(MyController, '__routes__'), 'MyController should have __routes__' assert_equal(MyController.__routes__, [ ('my_route_name', { 'route': '/path/:to/:route/:param3', 'method': 'some_method' }), ]) def test_controller_with_route_without_name(): class MyController(controller.Controller): @controller.route('/path/:to/:route/:param3') def some_method(self, to, route, param3): return 'something' assert hasattr(MyController, '__routes__'), 'MyController should have __routes__' assert_equal(MyController.__routes__, [ (None, { 'route': '/path/:to/:route/:param3', 'method': 'some_method' }), ]) sponge-0.3.1/tests/unit/test_config_parser.py0000644000175000017500000003156111244504474021170 0ustar gabrielgabriel#!/usr/bin/env python # -*- coding: utf-8; -*- # # Copyright (C) 2009 Gabriel Falcão # # 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 2 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, write to the # Free Software Foundation, Inc., 59 Temple Place - Suite 330, # Boston, MA 02111-1307, USA. from re import escape from mox import Mox from nose.tools import assert_equals from utils import assert_raises from sponge.core import ConfigValidator, RequiredOptionError from sponge.core import InvalidValueError FULL_CONFIG_BASE = { 'run-as': 'wsgi', 'host': '0.0.0.0', 'port': 80, 'autoreload': False, 'application': { 'classes': { 'SomeController': '/' }, 'image-dir': '/home/user/projects/web-app/images', 'path': '/home/user/projects/web-app/module', 'template-dir': '/home/user/projects/web-app/html' }, 'static': { '/media': '/home/user/projects/web-app/static', }, 'databases': { 'general': 'mysql://root@localhost/general' } } def test_assert_has_inner_class_anyvalue(): assert hasattr(ConfigValidator, 'AnyValue'), \ 'ConfigValidator should have attribute AnyValue' assert isinstance(ConfigValidator.AnyValue, type), \ 'ConfigValidator.AnyValue should be a class' def test_assert_any_value_takes_type(): assert_raises(TypeError, ConfigValidator.AnyValue, '', exc_pattern=r'ConfigValidator.AnyValue takes a ' \ 'type as parameter, got \'\'') def test_any_value_stashes_vartype(): av = ConfigValidator.AnyValue(bool) assert_equals(av.vartype, bool) def assert_required_option(option, method, *args, **kw): p = r'You get to set "%s" option within settings.yml' % escape(option) assert_raises(RequiredOptionError, method, exc_pattern=p, *args, **kw) def assert_invalid_option(option, value, method, *args, **kw): if isinstance(value, basestring): value = escape(value) else: value = repr(value) p = r'Invalid value in "%s" option: "%s". ' \ 'Read the Sponge documentation for more ' \ 'information.' % (escape(option), value) assert_raises(InvalidValueError, method, exc_pattern=p, *args, **kw) def test_config_validator_takes_dict(): assert_raises(TypeError, ConfigValidator, None, exc_pattern=r'ConfigValidator takes a dict as ' \ 'parameter, got None.') def test_config_validator_has_method_validate(): assert hasattr(ConfigValidator, 'validate'), \ 'ConfigValidator should have the method validate' assert callable(ConfigValidator.validate), \ 'ConfigValidator.validate should be callable' def test_config_validator_has_method_validate_mandatory(): assert hasattr(ConfigValidator, 'validate_mandatory'), \ 'ConfigValidator should have the method validate_mandatory' assert callable(ConfigValidator.validate_mandatory), \ 'ConfigValidator.validate_mandatory should be callable' def test_config_validator_validate_calls_validation_methods(): mocker = Mox() cp = ConfigValidator({}) cp.validate_mandatory = mocker.CreateMockAnything() cp.validate_optional = mocker.CreateMockAnything() cp.validate_mandatory() mocker.ReplayAll() cp.validate() mocker.VerifyAll() def test_has_method_raise_invalid(): assert hasattr(ConfigValidator, 'raise_invalid'), \ 'ConfigValidator should have the method raise_invalid' assert callable(ConfigValidator.raise_invalid), \ 'ConfigValidator.raise_invalid should be callable' def test_raise_invalid_raises(): cp = ConfigValidator({}) assert_invalid_option('foo-bar', 'john-doe', cp.raise_invalid, 'foo-bar', 'john-doe') def test_validate_mandatory_requires_option_run_as(): d = FULL_CONFIG_BASE.copy() del d['run-as'] cp = ConfigValidator(d) assert_required_option('run-as', cp.validate_mandatory) def test_invalid_mandatory_option_run_as(): d = FULL_CONFIG_BASE.copy() d['run-as'] = 'blabla' cp = ConfigValidator(d) assert_invalid_option('run-as', 'blabla', cp.validate_mandatory) def test_validate_mandatory_option_run_as_wsgi(): d = FULL_CONFIG_BASE.copy() d['run-as'] = 'wsgi' cp = ConfigValidator(d) assert cp.validate_mandatory() def test_validate_mandatory_option_run_as_standalone(): d = FULL_CONFIG_BASE.copy() d['run-as'] = 'standalone' cp = ConfigValidator(d) assert cp.validate_mandatory() def test_validate_mandatory_requires_option_host(): d = FULL_CONFIG_BASE.copy() del d['host'] cp = ConfigValidator(d) assert_required_option('host', cp.validate_mandatory) def test_invalid_mandatory_option_host(): d = FULL_CONFIG_BASE.copy() d['host'] = 'invalid_host_string' cp = ConfigValidator(d) assert_invalid_option('host', 'invalid_host_string', cp.validate_mandatory) def test_validate_option_host(): d = FULL_CONFIG_BASE.copy() d['host'] = '127.0.0.1' cp = ConfigValidator(d) assert cp.validate_mandatory() def test_validate_mandatory_requires_option_port(): d = FULL_CONFIG_BASE.copy() del d['port'] cp = ConfigValidator(d) assert_required_option('port', cp.validate_mandatory) def test_invalid_mandatory_option_port_float(): d = FULL_CONFIG_BASE.copy() d['port'] = 90.2 cp = ConfigValidator(d) assert_invalid_option('port', '90.2', cp.validate_mandatory) def test_invalid_mandatory_option_port_string(): d = FULL_CONFIG_BASE.copy() d['port'] = 'invalid_port' cp = ConfigValidator(d) assert_invalid_option('port', 'invalid_port', cp.validate_mandatory) def test_validate_option_port(): d = FULL_CONFIG_BASE.copy() d['port'] = '8080' cp = ConfigValidator(d) assert cp.validate_mandatory() def test_validate_mandatory_requires_option_autoreload(): d = FULL_CONFIG_BASE.copy() del d['autoreload'] cp = ConfigValidator(d) assert_required_option('autoreload', cp.validate_mandatory) def test_invalid_mandatory_option_autoreload_string(): d = FULL_CONFIG_BASE.copy() d['autoreload'] = 'should_be_bool' cp = ConfigValidator(d) assert_invalid_option('autoreload', 'should_be_bool', cp.validate_mandatory) def test_validate_option_autoreload(): d = FULL_CONFIG_BASE.copy() d['autoreload'] = True cp = ConfigValidator(d) assert cp.validate_mandatory() def test_validate_mandatory_requires_option_application(): d = FULL_CONFIG_BASE.copy() del d['application'] cp = ConfigValidator(d) assert_required_option('application', cp.validate_mandatory) def test_invalid_mandatory_option_application_string(): d = FULL_CONFIG_BASE.copy() d['application'] = 'should_be_dict' cp = ConfigValidator(d) assert_invalid_option('application', 'should_be_dict', cp.validate_mandatory) def test_invalid_mandatory_option_application_none(): d = FULL_CONFIG_BASE.copy() d['application'] = None cp = ConfigValidator(d) assert_invalid_option('application', None, cp.validate_mandatory) def test_application_invalid_controller_name_numeral(): d = FULL_CONFIG_BASE.copy() d['application'] = { 'classes':{ '5NumeralController': '/', } } cp = ConfigValidator(d) assert_invalid_option('classes', '5NumeralController', cp.validate_mandatory) def test_application_invalid_controller_name_bad_characters(): d = FULL_CONFIG_BASE.copy() d['application'] = { 'classes':{ '-040%$WeirdNameController': '/', } } cp = ConfigValidator(d) assert_invalid_option('classes', '-040%$WeirdNameController', cp.validate_mandatory) def test_application_invalid_controller_name_spaces(): d = FULL_CONFIG_BASE.copy() d['application'] = { 'classes':{ 'Controller With Spaces': '/', } } cp = ConfigValidator(d) assert_invalid_option('classes', 'Controller With Spaces', cp.validate_mandatory) def test_controller_url_should_start_with_slash(): d = FULL_CONFIG_BASE.copy() d['application'] = { 'classes':{ 'Controller With Spaces': 'wee/', } } cp = ConfigValidator(d) assert_invalid_option('classes', 'Controller With Spaces', cp.validate_mandatory) def test_application_invalid_names_with_spaces(): d = FULL_CONFIG_BASE.copy() d['application'] = { 'path with spaces': '/', } cp = ConfigValidator(d) assert_invalid_option('application', 'path with spaces', cp.validate_mandatory) def test_application_invalid_names_with_bad_characters(): d = FULL_CONFIG_BASE.copy() d['application'] = { 'fjkdas#@$%*kdfhagf': '/', } cp = ConfigValidator(d) assert_invalid_option('application', 'fjkdas#@$%*kdfhagf', cp.validate_mandatory) def test_application_invalid_names_starting_with_number(): d = FULL_CONFIG_BASE.copy() d['application'] = { '3kdjfbsff': '/', } cp = ConfigValidator(d) assert_invalid_option('application', '3kdjfbsff', cp.validate_mandatory) def test_application_invalid_values_without_bar_at_start(): d = FULL_CONFIG_BASE.copy() d['application'] = { 'something': 'asd/', } cp = ConfigValidator(d) assert_invalid_option('something', 'asd/', cp.validate_mandatory) def test_validate_option_application(): d = FULL_CONFIG_BASE.copy() d['application'] = { 'image-dir': '/home/user/projects/web-app/images', 'path': '/home/user/projects/web-app/module', 'template-dir': '/home/user/projects/web-app/html', 'classes':{ 'RootController': '/', 'WikiController': '/wiki', 'MediaController': '/media', } } cp = ConfigValidator(d) assert cp.validate_mandatory() def test_validate_sub_options_should_be_dict(): d = FULL_CONFIG_BASE.copy() d['databases'] = { 'classes': 213 } cp = ConfigValidator(d) assert_invalid_option('classes', '213', cp.validate_mandatory) def test_validate_mandatory_does_not_require_option_databases(): d = FULL_CONFIG_BASE.copy() del d['databases'] cp = ConfigValidator(d) cp.validate_mandatory() def test_invalid_mandatory_option_databases_string(): d = FULL_CONFIG_BASE.copy() d['databases'] = 'should_be_dict' cp = ConfigValidator(d) assert_invalid_option('databases', 'should_be_dict', cp.validate_mandatory) def test_invalid_mandatory_option_databases_none(): d = FULL_CONFIG_BASE.copy() d['databases'] = None cp = ConfigValidator(d) assert_invalid_option('databases', None, cp.validate_mandatory) def test_databases_invalid_controller_name_weird_charactes(): d = FULL_CONFIG_BASE.copy() d['databases'] = { '%$*': 'sqlite://asdasd', } cp = ConfigValidator(d) assert_invalid_option('databases', '%$*', cp.validate_mandatory) def test_validate_mandatory_does_not_requires_option_static(): d = FULL_CONFIG_BASE.copy() del d['static'] cp = ConfigValidator(d) cp.validate_mandatory() def test_invalid_mandatory_option_static_int(): d = FULL_CONFIG_BASE.copy() d['static'] = 10 cp = ConfigValidator(d) assert_invalid_option('static', '10', cp.validate_mandatory) def test_invalid_mandatory_option_static_none(): d = FULL_CONFIG_BASE.copy() d['static'] = None cp = ConfigValidator(d) assert_invalid_option('static', 'None', cp.validate_mandatory) def test_invalid_mandatory_option_static_string(): d = FULL_CONFIG_BASE.copy() d['static'] = 'should_be_dict' cp = ConfigValidator(d) assert_invalid_option('static', 'should_be_dict', cp.validate_mandatory) def test_static_invalid_controller_name_weird_charactes(): d = FULL_CONFIG_BASE.copy() d['static'] = { '%$*': 'sqlite://asdasd', } cp = ConfigValidator(d) assert_invalid_option('static', '%$*', cp.validate_mandatory) sponge-0.3.1/README.rst0000644000175000017500000000173111244504474014300 0ustar gabrielgabrielSponge - Web Framework ====================== Sponge is a tiny web framework build on top of CherryPy_. Its name came from the idea of getting things dry. Goals ===== Be very well documented, often released, and 100% tested, as well. Dependencies ============ * CherryPy_ >= 3.1.1 * Genshi_ >= 0.5.1 * nose_ >= 0.11.0 * mox_ >= 0.5.1 Contributing ============ With new features ^^^^^^^^^^^^^^^^^ 1. Create both unit and functional tests for your new feature 2. Do not let the coverage go down, 100% is the minimum. 3. Write properly documentation 4. Send-me a patch with: ``git format-patch`` Fixing bugs ^^^^^^^^^^^ 1. Create unit and/or functional tests to proof the bug you are fixing 2. Do not let the coverage go down, 100% is the minimum. 3. Send-me a patch with: ``git format-patch`` .. _CherryPy: http://www.cherrypy.org/ .. _Genshi: http://genshi.edgewall.org/ .. _nose: http://code.google.com/p/python-nose/ .. _mox: http://code.google.com/p/pymox/test sponge-0.3.1/setup.py0000644000175000017500000000260211244504474014321 0ustar gabrielgabriel#!/usr/bin/env python # -*- coding: utf-8; -*- # # Copyright (C) 2009 Gabriel Falcão # # 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 2 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, write to the # Free Software Foundation, Inc., 59 Temple Place - Suite 330, # Boston, MA 02111-1307, USA. from setuptools import setup, find_packages from sponge import __version__ setup(name='Sponge', version=__version__, description='A web framework aiming to get things dry, ' \ 'built on top of CherryPy and Genshi', author='Gabriel Falcao', author_email='gabriel@nacaolivre.org', url='http://gnu.gabrielfalcao.com/sponge', entry_points={ 'console_scripts': [ 'bob = sponge.bob:run', ] }, packages=find_packages(), include_package_data = True, package_data = { 'sponge': ['data/project.zip'], }, ) sponge-0.3.1/dist/0000755000175000017500000000000011244504474013552 5ustar gabrielgabrielsponge-0.3.1/dist/Sponge-0.2.0-py2.5.egg0000644000175000017500000045203411244504474017007 0ustar gabrielgabrielPK:/rsponge/image.pyWmo6_qKPXnNZlmbn$A|ʢFRvݿ?#7'ζb0!$^IΔlOydF/D؇O OfO['"H>_hNZp鼄s6c8cq^ Jb /TdKH"^3ǰ,3L#p ,$%ъ6f)Kf(A/4ʥُk8%*<  tQ[rK+} BD|~`ePƹPy > x%_2ėsҲ %jYbJ񾴾fIKJO@ә"UPg2i̡DS]Lŋ,@Q!{VЇ_N|=c1כ^qy,ѼRhLd5؞ ]dlQcgms+gH LuRq!hžj!X*FV$~)ljv{^[,.n߸ H'ZL"=rF]LOZT(vP1r@6@$q۹vU)UXs׾7wyy6(Ljjbj۴'Nvd{łi$GZkdׅ l~NLWkF2iM#ϨijBkJyqv$T0"~7-rUGLwݩKgq3ڪUiꈴ -ODm3/Z e@Umo,1E0Eo7zY$ktUZn<$ -gGik^3<{ce(wlLYy.C;~{)6ˤs<\*1y&?w+^}Fqtko/H9SoIio^]ۖj/aw^sx| bM{s/w40'+67c|b{LijqO '+_PK:rd [sponge/__init__.pycM2+ D Cdd` =#=? n _ZT2A̜̼ L3 3tT̼̒xbҜT; sPK.:P1sponge/__init__.pyuRˎ0Gb13TSڪ ( B&!9(3 P)pO]$&z˺߆ͨn12Em>wx=Ϙ0*ac"Fɣ%3>ešgfP̝!jS!RY:+w#H2U:% C Sdª)`.%ALP42 4 L '$[ɖ|F &2v`,kd[=JR`79T ;BURV3.gr#Xla7Cu[:҅I %=Y]ҙm^xӨ80Y x6ZσuZFc%w͘`8xp%+S)rq$5!yd]WQ12zvȻqG̵{}v0ӉgVJ$.! &Sf-z: VkV'|PK:òsponge/controller.pyXn8?O18n:w it qvQt i]YԑT I}Z tj,Ê=rLk#_fwΪKd"m3 HÓ#}nvi?„cx8&,p 9 xj@AIjC?ar8_ чqQʠ-˗6fo|1AbG>];5C !\$oHb 7uJ!/h^0GCnQapR)=_4%) {%pgOş31}#O.Әwl-/ӌ|L< NE*th,QyMs Z)0yPP!1ͩRtl2XN?Bh>&h5j)lȆЃܯdu U%BM|{qpC^Fi=VE0l4BVkǣ@ğJg=X \rmUZ=]5F BJxƦㄗ%ƮG =VўփY4hձE %/ z'0l)uXt6aoiY?djOMx'< h-0l&SknHQyvS+x0xXm5Hپ1-# ڑ k"ORzJ;ӽH ƥkV ̓.CMUGF ׏O0!zMPC#l*P_ܬ4^<RުDKDj.Z*#*LBh><~_kubg*s Ѕ_SނJ3P5ZZ/-PjizSqkP[\> ۛ8H3NS×;/יX_"eF]ݭOsdsb 8%iI3@icIFvclۚ0 }$+fcKN2Ss"^h2O|m?MNcfk103.^/n~s3kcK6͊p[/wk|N a,jks+u рG^G/>`l>;v3 g˾s'L7<)+VѵvJ* YC&pGoBwSpm ̤1x_30f+ I="+5d`'ZmX|tV""}+6MB2-W-4xScA-[\:*X&lm\65mO4c^:&5\o+fQGbJ%- OMRD~$"׌mmWŝ>=3;\MP ;Pp(輁#IvoATrM9|k% s0 9nvX$ +AS).ץ6UsF'ԓ_E,elKũL1GyL3N˕ki)"쟖>2:yYEx+现y0~j)r7l}0+f8M߼px6۷}Lカ; ^s:5 ؽ)ju.yMqB[C9 0;I&;u ;H&/[uTP22a [JZeQl㵽edrHP3 {kۭ߃*}6}c|1yj}+r,V]59Qv؂96laj["ZNVuscknߌG8 e;ޕ/QNPK:yLM sponge/image.pycUknF%%˶$6Тi}A -#e%VR7=zhgfIR$(.wvgfgwo~ozM˾CQ-8ʾ vwСN`sԯB`stRY`f+5?Tq9/GvI-6 Vq.  r:N٠Z0 9[g[.6|GpB.p@` 6 8XT GU+5lA0VkΫu84pK-lb9kX}Dc?O$ݔԉ?JGO?53T@{DڢӌB-C}GrpNRGg~*M{$J4h*,>tA(R$;G R<Ÿ4EDqa:KY' ( $p0?1~ 5pSIFG#:d!8X`&%Ac5?7GdY,Pޝ0厺=9Qx&,AU֦e Zbn-1SicସCv 2!"X1"u7xyj!X,l"i@\8m1x )]M="ՕfiU" s.֪ZR {yVˆy*lScӅ KPޛ:ݿP9 D_ >Ƴ7QŌY0j B-2^8C' ԩ/$ۺ<7X04Xu8WYS&Sm1-ZI."d|s/p:} >wi[;bvŎ}Cܰ߷ÈuJxN:j%^б^бi21T 18DL @E&3 U@"zh2J3b@4OpIZԥ"~y~&+E\H7oRB~!@LXNWmyVXk @A y\B0Aj0O*jDӗaVȉLȐ2˻4@~%qyS#yɯEzRgCf}Q8k%xwB9\b?[#ujzgKF"eU/ڭ0b2)xtN?:..gjJ"^(VvJA)9|G `u CL1/R_]݀5 mMS N h}頁Oܷʤ35eeP&H:ou:F˯xٷCO9w[ߍnCɵHt|N?GNp~8WꙵƲwo{Ε*M|un*Y}@ {LTONy&:>lTd?d"SDO4Dn6˛K RA1(L=ַtJcrxϫ^| ׷B:jS4 #hC.-ˠ `At |Z`˷!n(?"FV;tUF<{$wwH1Zn;yEp݃jӊ&=ngnPv2:B'*F ANNThz$j|z)Izo1nW3lB#>*sSYy EB8bfA&yRг*ytTQO}!btmw#n[nWlU겋PZMvk }cO2qg7ph+ !!UBBW^y;3vV˶4)ٙ;ws?G?QMkusE];uܡeID ԭ2QXn^WNa ;ϭUMS3 ԯ^zڢ~o^օ VѺB|uW֕u 2"oðJNho/m+󡧃p9I>8y9>=3NY{? o~7{ >hNwh?Ԟ'ø?*vA h|Bʫl`+@o$qdstV0^VU [G}SvYة9:J9(*O€QeuNcxo[;Œ& ;SЙC R/k*7?q(R&*1gP^LFsÔ1}SWnȇ=b״Mܞ=x}8NM{Wvj lbӾA2TF|q}nN=?>@g/BU'zC.H(5~r!gNFZNH3l$q"͉%6^:aߓU{=Qo.YQ`<9 rE)UU΂;KJN:1*}?Ltk2/-KU%X/K.һ/ӻ hَ͛ѽ2Zm~'3!>XA*=d[D(rI\XBB'tb9׉B8*J4 BZV3iFnSzJfX(GNN00NJ3L^uct xw_2d# 6`A8 }lfp3D΋ƇҔ iz=fu#bYh˽k8{oͺ b"$>,MKTRߠx'\(RQ'K\DdwYQ` ՝<ª(}*bّ)x+39 P6m3ʻXg=Lj^}Y=|~\w`n\ǡI\߇f.9.Y%7J^AYi_blav6}!uAg 1UԒZT\e5ilifYwTD,B*QbBV$nK RUyD9+eR_ռg6mӔR9!K~\Y-Q%'BRNؘPga!S [Ed ġk%u@yg9˘/l"Wg9ErGu?ZQ~ee`jbyv{ͶϚ PN7-}NC.Ђ,x2lwlr} "*t+ 2)Xas?Z\=6ĵ >()ة'yG a^!$ ɋ}am;da6)1}2㴕=y)_W:絽B\?aE V/:1'Xm{+.C~dTUkުM^oս.쯐Ҍ>sJLR3cm@ D앳x*6[Pg$_`*jݙ"Pp?8ppUyE!gr`aN_϶R-7RNa]bPD}!B+4q^grh_^]̮Q8#lSqU5lP!eZʬEm9ǁ8? W !ni+㟿uWbPrZGXX mكިؙ L\W^]Æ#9=2B;1`^9:0f1F&/#VdbG1 b)\T.c845~b<_)gꊪ="^~ 1‹yBY2,K'ᕭv")v:zl8pb?% 3BW"[s b kA<1 |&@aQ|n`('D+R&T`UA-\@bgp}iH^c  ]o8 RAK[Lmq!ft_ͼM0. *kR6kx !fq>ͼ7Lt^{wK#+nDIs&'|q"gW3βy%\,` ›^M0]o.V06$Dc]|G,`6HeoJkj ,"*2$VS!i85Umުgfw;AG2''GVRq Gǣh0:9˩鐬R-TP"殱[' 0}L=;w2 j.aGkÊi!>qS! ZsVEAi%nF ݭUy^9E2Q6] [a;e; c]u}ۛTnVwg,3QEx*nhuRڟvNQqi 4"U;KR"EJuM첱E5NvH[:b]Qcv%5PDϢh!@ oP@韢Ѿ@{ΙRhgΜ͹W%iiů xUlnmزn DUتBTp vqX~ p 4՜Z+u l0u@PϩڤevfpcaU7‡Jߏ|~Ayl?#|G~&iqxI !Q݇1b?<^`apz@*ݍd<d]?PUF7ߘgr|GBWO:Lo;D;7TdBM[crR=~J,P ]yxni'9yѱ' ^\8WtO(͕ eQaVm?DӅngGIlDzR}+OvGR[UU{kUΞ2qe_>q rFݏxb.M}‡i鲰8+F?Rf-LIyPxL9[;o;:n +'Hz0|]T>cu]sfZd:=Cj%_^$4uK"X.5UL Ws^*6=pڂ"iQۆ5H^AX$çS㝨L&#)WL'ϋ,WN쌍BvJـ&]rGUM3-)yOUASg< gd QJbtTGYn>Դai6f wS Dv4:P;:qJEq_u|n!ؐ< 18f뭔܉w+.(9ن%A86ABΥ:H*bȈEp؁tw,OQخ&[T|cvt0uw+$Jbsn̝-fŲZXo2 X.pFڢf5l&xqVͽb\2-7[^Xc,-s%6#wdKqb01 o"| [\lWAP+#zh@tV&jIլp~6ZYt$6ar)pWAM*<€p~&hN1^#amY6=AHA߶Xa-_yb wIu k^C-V&ma>u9Q+jNdw4d6ITSSPR&L1JY#4b6ty=fn:@}s95gf^ltջ_=Ҡb|A0d]-kHD{)&t4"u4ͪ2e}q4"@n7[7&6Sq!Ϗn\JƔ~(hX_B1y0hT7LRAS=ﯖ:k9"(Tj7^ϔSʹM8 ZEդx n3:lYB,ނ9dNsn$co疟}j4Aiq`5G$ `4m|֏g559+Gb'`c6*Y,nofRy98 5y6Pb0jV/f6p 6 YQ\D#Ȇ0L$X\@D 0sp]<+[.u8(*FuG%Phgx%0 o.s(wKQnSMb"(%=ԻkwL<}OE&;S4 tZ B7E]b5?rЖ!`=z7 &eudNە e$K;r9NDHX/_fVɐv꘹t Lf=Ee;"u0W2Z% Cq@4a&0cC @LZcPV+VXnN^K!bHq`RpueDu#6IRhbF6RS7oYa5]$]4ؓZdⷳI8=p<}re̅{t:[_w?M_g }&LC/ȿz"Q[͢N-qQ2'VVk#)|_גтUr "$(b0-BXb1m%읓I-lGnpVD~-}$FBb28:S00\΍gY'yi}nCdaQ\Xlc//vcBS,zUMyY3Mڼt@hxF4:F3K{j7-50#Q-}eZYWTVF6Y-u5;: vNv0 (*ѳa*alR4N@B32E檅BEl vp7ԂwpWQ2T"V [|P:9cGKtuhfir#fnף96;w{}Ub|),&ugP{"۰-r(~ZjsJդ p;m [Wx[SSF4~zlȪauG-$Bi2t- ;Y<"w ٫ 9p} 3S͑RC{2SVy`t,q͆вwsHu LI`Z9a˯,ڣ,oƹ Whyl ώq\QMpE]en>-Ӗulfb!4BzrԞ+CqܔRc#C{4>&̢dиڳ|ML2/+3}zTց$|PD#Ұ :x5ҨًuW_s~ͺqMa k/PK:  Tsponge/core/io.pycX[sG>=3{e%)1R .S'T Tl5v{Wcfӽ^bo@#cyszzvWPEg39Um|G_C'_m;wlۅk=n;p\p\$M7!iAImH<0sO+0F5J6IvحQP>'Y0.D:ܔgJƉ?WZT! ?#@Cd U =X$6uۭSW6H/4yg[6w붻]޴ۗyepm]#N__;wp^8<΃ 5){M/3T?FȾφ: T9S3)W~m|Nd{8$N'g;;wx,AV8Lq0I Nf/._a:ã.NTb5ۙE$L=(sB:$"^2Z$A>6t>QGv5qvUm$J0CW{_]bIt,ViC,`2 % !mT "nx5b9k#bwش$]txMH.D,Ţev<56֪U4G!TYG*`jM@SgKf-Xdcl) ~\IrB~zf9AEʰ=H?Iw@ }I6WƁf>LqƑ֭Vz$:ϜEVȢHŊ01"3c.m_e}b]!( GH z:h,jѡ0#81fROTHxfDKe_",mQ2dZ?P1qLx䫬gľQI\]^YX0;  Dx빿D㡞j}\ŋ;37n_b}b?*Ɠ4*epd`d%j99 z@Ǔ>%!w{78H)(c0dೈh:+2`o[5. ={nO^(ֵ.&o`sZ ȁ9d-dH3G#`& ZM59ќQ4? f4 cex_i#ɂ29쌃zn@Mǧ[%,lE̥ HF pFn<8S(Yp6 %4l *%b]@l5Z^8!Jњ DDCf$KB?|y;|]_.wGH[sIb&MI@(g}w?8kUz?=]ipyY5W1L$&iY2{֘G0U>(9u"m#ʆ&U>6B_QGpJX̡ 7 x怜QK_zp{nozQnUڂ2_fQk"ƳH'"D9L5CD)C+ g,dsL8wȴZqŒ3~05cyp -=v8 O&gT0`ؠ:9tAqMb"Hk/_y4ɉFͥAǫn$vk`<#x b:E5,h dÇm)#K!ј }DF>zsYֲ7%!m.:359s|5׋(H^r{$yɱzĜqJ瘧iwAL%u4tKhƋH#T.B΃Cl+d{_:>E$){6KکC;ό(: k (@,cpSn]DCL%44^V\s-Q89Lq~`;D*jA/;*e'zN#A)'ZՔ[T"hTꎖ, /3axl+"$ @;cDL%W? $1\O[B= ůvDuHJK#_Z);tNYN*E4ؐ| oɼur2'J O!|Dxkhdy 74: vQq :ʩ :ZcԴNviVovTS#fs܎!m#e1IL=%Jl 7!6<+k6?\H43’G ~|TonZ+p69}ϐ Eb p*#rJ6 Ϻb{)n@{ڮQRܡEu[I8Z=zTw+^qX`4-2O|U19'rp|9 FFݿSNsPY{lzL#$2^==tŀ|,Rޮi[(g6|kI)7'nA |< 6>ˇV'pgR@W5~ӉEpoKә94#0wfbŎ -Yv4۝ɧA`#ewF'#5 T>7[7<:7]+Ia"TkJT%Bc?Z~5[+ gnL_1jS!2鼕Xl+R3;'[8͖#MV(̫)dJce-a801+4z ܷؓu|,rPXtol[uk %wnLX{JaCc6gpy!{ytLe؉=ZS{%};;f ޶226+xsGaӰ/H!̕H }U#pv6lB67h 0rk Q4MzLv Hpq)/J}"x嫖Uo2k ؒ_ EA4qK\aLY+pԝwA9 PK;.:Gbsponge/data/project.ziphͶm:۶m۶qm۶m۶mݯoZIeRfZɔ6J 5{{:eH`8kIi$kI7h@3^C5?s!Q"3#щ_b8p⑑ G>E)AW &Cnf4` l{vۅ^ZŢG3uqY `,C0hȁg8LyD1;>LG% ZuW;P *lnD14o-z/%vā9#=E" n翇V/%;H2j)tND=TF&xYo]Zid;o_J~}zں}"B\m/8_J~R [a آ_'}+6˓rjev<ңaWoS:LJd)'m/pT B%' 5F-u rdDנ`%-(R5FV5KJ<*to/@k}ޕA9H:S%}.&cå]c܎mقHm)ں//-#)**>h~4SkM.JѹiU}ϝv9Fȴ\?RgakᬧWxje2(U: `X0P0I(wזPQwUwӗPTT›[w!\eWB2W\0ӿ?+B_fdcbla>%$1I-la-ـ'}r399%cX8ҚYV`-o 3y%B=$2H?P@hGqgAxX;( 0*E!xtD ܷ7ތfL+1#:V#}^^S]]]###99933XѬ<<<\\mmZZ[[]狥z777/_oVVVMǓ"""那Sr[ ɝ|-{\uAu@mb5Bab'=y'鷥t8ok~$F~3xMz^e3 f]eҹI>WܮiT $,J~$Y 8>ʽh1汝؜\MQATBĊxu*fosۿrD`D8gA^k(S=Ԥlyd}:y_b`a]g_" ؛.]K#[z4! 3sAQ$\cX Fnt~S.pÎx)aYNcZhb%Il)< 43[QKZpx(nn"n8Z<ș2ch܅A] ot!Z,?3=# 0ᚴ>\q};-GTt$`H-6P{NUMjDZ<9l)YLfla!J̱ߝ;{oY>25q|"fptB9@ÎK#حyX~Fiz;>8*-ik˫.٠M@8k%0k3"3⻾g % GH qŽ-'o;[V oroFqOokV=<#XjllC1iN!ϯwP.J-+GLs9Pi.g"}(}8s[5C΋B2A]t(YYwF|K4S 75C\S!ehU?;d,ft W&nP:[PoJH  ^]A*4$Ι! 0t9D5&mIztm]anؿ&w. Wk-lh-%?R;X̵BwS u~7nÁ3I= G94R 57lPkg=H68ܸC;v*OY*&KqM-7!xbx2,.44_?lOfx#FbCkzb-q Y `xU75U>P_13>Z ؞W4 &rI =,nJFU}1xmoai5peU) TPoσǷF*xE.Wg$=ڻl#S.r;6](-pDžx$BZ#*/k07/c |HYZ)MKO GoI9tIu[6H*GÆQj˗G`1_SK֣Iaf;۪V*VBI{XTQg# abk^J9ΫS=6(et:{Z ]H gao'yk Q8x} 0\ ! aQ+N>> ;|`^~ܿ.Okn [ΏjfFk+^]wo cceIte#Ѳ6ٖ~~wSds)v9 [節YDبKU a`(I,D okDnUct1C@d~~NL5_̜xi>B:4HjD<; mF@b.J>UJ5՟S7ICV4Gpqo85ymP(U0z=Ivrъ1{kR /AUYaBuNUIl3Zԁ#-˯oe#it"yMRGl̶% ,㹾~8Y7Mrwhfw6nbR QBrg~Z!!\?!o[о17& Ӥ6 l{V%1(jhx)jK9+;K ښp7<髪o?6m=ݬu~i;2ǃ &ݓs1+jQ _Y2EfLbX_&>#c@|mK5m?!D7J6g}±;m(QwQw6"vඔncٶzK?[^1zD) f}hpc(LM9.1ߊڳ0o/no# p`l QG Y&KEMQFDy'Փ8**y|Wr= | JӧV/_WD؂{0s('ȫ5-c Q ݧ@b!|WEOyT^(xL%%O!Rt5 9#ar^wnf*zh3%pĦIj=eӌsla Pla,>/W[>^K+Ep9JcɔI-1SnqCsN[P 1+ L;O?P!bftp8WXVWjHust+Ϙ7-ʷO,/ ŞDm| _BFB,f6Gӊ@Kft)K0g'(K`Qc]s0MȹY9 -OQȜQO1*,z?#!13"_fy)aogXwt"HWgvRs󂫸4%Nܨ'ʀr}FRu&ԓ>ĚHTk Ç``j(Z&k3CGZF<6!7,]&1E\F =)?z\,lq"TkgEU-1FFy|2m _>⽏!JoMo066쇟 :!SFjgj#֚xbՀ毊p'czz6)%ׂ҄]}DI9[ŵ&i3}~Tԃ p|cpiQ$T.oKcғ՜0 ɸ2 L/P1'.tY#3"2).2% =:QOqbr}V։Gw)-y? @C+_3'(W-x7CI.r+2Bid҂t&c+34v }ď0XK.G #fy#Y0)(ip! zfB.ht23/&yKaJ&+tdt,exY ࢑@"d&9!1` -` Hs[>YHbQh"1,e=_UqA>yi!W0O'dGW}YTvbG)(_"ҎƧ?5.V9)ٱu Zn-x~O~ՑRHvʍ%@$H}x-q{g[~0 P<{:RH"H1m@[B H3]%4hke"sr)ţLbV"\3' ~ϔ #y]+N}2Я,Ŧb45Uy`]Km(%Ȑf=BGRXl$iKnq3ݴ֔W.lz81>8$ *̘0_AZP$GL7dTS) T|k| >6Oq"Z36jY. S6ʚtFkUYP6wa%j%s8]:7 pؒ?u{}n~7gr"EJxZ,Ơ'ܳ7`BBCw 0;TZw 9JjKeiK*{2dX|“ΐ<&92rH{kėf-_W MO\!h()훺MLz<:P0ڏh+esl5#Go^^`V&sNVݐobh}a(t5@v_vMCKd黜ĵ*-ÞdK~2tKXB<'"R5fX Gli=:za 쫙ˆ]I;pFZSI*8PjWљ+e a !U{vMйrF d *i D[N.ymu5RiHxXT$;lGVJjIG&k !VϲibyHp+]1(il2.;uSXhj,>,e^<+@Bo1'ꬰl<$E\%\mY <llam8SJ33˜L uPMkF5Kj?luOU2: /Kb%Áj-ؽ#JXg%:Y ZlPc1p#)GƂJ HP8qxT;oaaW$/pdkمM^n4N&Lk>F[ngTEv "$h'Q}0 'u$4n8d$^ (Ms]Y.Gσ6ԯxlV&Y-eCXi6%mK*y}QRP}2΂>Y:o(4%~ < 9f>_!A9%HJv)ٔU^p 6҆Xw$k4! ){.Ӝ7 p33&6?u8Q5/Uwd~19XZ3k./Z*U&A2g1D qδ2 YVK$>b #զܪyL0=^Gkk]Ώ {`5T<4FBxM.@xb jȇn𥕋n~1=!DGȥ$Oi4iBeCϪmסaGaB6:`E1I a񶱱Ot_էJ:tYۙS)g/$AkwtQ+2'4vgmyQC& G3΢8\]1rL8;qZ_qdUn_w{kȄi(Ϫ;R(n>v^<ȉ8!6Tyޜ|TF\%l80,8G&bе F=hclZtsgnԦ*+%#1Pi .IC A\h꺶M*j!zޣ/cŷfہ.I g3K sr!V>bY lʯ'5EEtqe:ӋTmZ$:@6jKբVFǶZ^%ߝ:I$I4D8hplYA*ƯGVfbV@uy[%cDB^VY*o;g #(8#02A6@!W47יּULxV6|o𰥪xu8eJD hymdbr"ҶS:}N](dkh XtP͊lҡz\DVu4.kkC#Bw/*"TA#|)Դ ے*ʣJ9r9_Y_l ye&Jשx~qLg@p"/{Jlo%A2oqNuQ ?3/ύ )rH+2xB.KacZfN7֣WäzygVL*U  L4C 3[=1~kg0Hr;9/qk-fl$bxO2w*յʎiu0ҥE l{O!$aҾULiM%LװazjrDHŶ&08z6=aR`}j. ;IT4 qI[/^5nzwU*qgjQpT"{ ~me/}zѥv4J|AΖC3wka/!2P z)S])>lK#D<}7:``榶 GYz.Stg=:D 6^_Vde H xU{|^5hzC'[M89dj("шSJ"Q^=Ȟi/%G19sl=WHuOanW"BBnà^,qCNԠ&m/1pIocB"i~['q:e]sA2*dD_VcPDo*nhU3fQXmXn .r WmCCtPD3gXG9rԊXjz;n43흅E9prľ2rZz@1c.ucl4YSoNr^"hͬjDeW݅wt%a`TN{uǽfŕQM%~ b,wDFhX ] 3uj~Y#PfYN=gP9SKt!=`0O<!/SCC9 4ISC^x9pdԔh%o'm6R*[﬑^C!#c'SoRk+a$jSzWty<~Y'֒sŋO*)nwYowư Y\Y,ѧW^R)UB^pO H6$p2w)62Uz4n|'үdh ]?8WgHR~K +fbI&ylu>ԫk%͊k>br|`H3l0Тf/g/u/[U~ޠ;\@q]ZmQAі~ bN<j61jr h ;ђ O,\AoWWe%v9A=,| v1Ö+ ʐa`˅ƤlW{bA@$^}ڊu9 2M@e)˴[c2FO􋆵Щq&O ցhΑ[]Ke_ŷ7n%sNV D%ǽtygjkK Ztc[$iHIѐmsaa-_U'o lXu?d9:`~ c:ʛ,CFv!-&&L,8q=<^xsIO)-ӢO K"<gbY.fL:N)ox+@CCv&H-tޓ13⥭5&QHw@wRxŹʼo3}>MfNyt|L?MRdtw:C҆bMC$>w?>${/d46Nh{kj綂>uB#ݒvz U4rj53R`MpYRs4ѵJj{mAW~Ҥ=dަ%#Ǝ;iy@|xjg/3'X ZZ:cu:g0|X;a\Gjn4W5ONGXg F}3C(\P՝m.A5y5~x-Ƭ]#j ~b놁BbE,5p\^]VHn0BNc#A;X3H#qŻ~M7o7}X=/HC2^_qOq Hp<҇q-`YF{ D\(P+.ON?[qKK)Jѣa!]躹 ݰ(5<_~nfQyb߫@G0)8_,)Tj ˹߯m 2Wׇi2^&X-f)\d@b)%'ڠ N,׶5wV ^XY;@+:ʮsoxC9a_G=B8DJWgO(7I&/wfnivQ`>~̲6uv7BR+T Ģ AEy|uo]HonՏ[{B<Fǣىg' %471 EZŸt]R~@1ahw;2\#n}LDgi1o.D%:cV8TK c/(,90T@|}t70#a0`%0|0ᇿu2c(UQPBĜѭX=~^6Q[WǛrc?<ȯnA oi0@@~WB-ɐ67f ]"HS2RGx!\p`I+.{ZM!g} }@2AB(!WeGVjfl7 /h%9~Js{mItHȇz944׻ B3§!hItGy L׌PzPycqV/?"RN:#ݳSʆgk|q-~}ycmU ,@sth~#ū$N1c.69eӺuvPKu2 ]rfۿmW^M"g]P;yd|;_'LkWuJ9lH.Tt~ݡĖݟ.Sw} 3靓UϔoZ;N3BC6B['0\ Xh!R:k"n@q$_d/r,4m3vԁ_·ցU_.-0_7 \-ubU$W=Y9qHG 44-(Al!o~}@v Џz]$2"`Ƈ7r Q*/%*CR_{%gSVcwx6*cҚٻ k]YiXCN;798LjXj*~U!2p.:AQSB҃Jeۧ@hM}Ӗ35, 5RdBο}ҒNAew|rS!]?!?r5!1?~jbm$ [cI@nU[18)Qt1;x@{}{r˷28 j/rJ[j M$xnR{{&r{K#ά*UؑN3 f =ؠRF#GWH/IK k`Ii?vԣt…!q˓+mTv t#CdcV`3r#ͣښ_ܯ`ze'!O;PRRV%,0db(yG~"Ys{U$IgdWGv?1 i I j]Jd$ܭ4$YPgNS.6z`MY{  %rTӔu&׫S.qxU ,zccI8vz>|QL!> Nr𕶹tNt~aY΂ʱ2G_~N[fOS!' ܱ,;u=5z3"OMhoI]]{lo~~c!vέכ˦~3f|57Qʨ&gdv`GP@h`_P=$`^vqoDH~<`l".6q‘oNXBsǩIIN8rD/e(Qq=.i9Qy\2jӌLڍ[ť Sv~ylQ,qV'L+mjQaȁT DmJkaE++9g{顥SaԿ!$~)UWTWw~A'@W2ULYm ]BF(클rL,ppJÄZϹr.3av|C$kd!JIZ}o\K3';"]S+^!BEfɹfhRc;R5'!4 `7dlF.TiZeCSu@/JQ1%hN`ɖRQk쐉V¬ 2먌ox5/Ab$@Va󯳗Kz/B13>׉m-vux9D5boEZyc*F96@H.^6Z3>Gvz2F5>ܝ7c a'@0?¼i}?$0eenCHbhKִ0mX5^kjٽ3 AM9bD7|K]bA^ͼi0Oh).08=-~֡n._XOWlf|> aӃrt^Z4™JBBH 6 k 0t{{6G؀Mz:З =ƎpĐ%孃ϭp^bת&MZ ^P/Qgy | ;hNЉч@qMiR 3tͥ4yI@5oydx@aB>b>>}yAҟ:#}< ;yY!i C"Ƈ0\E\KJ]@VW Nż6wq8 ~JOq{L!c/*=g> ґF>\,qX=?9]ۍWbݨ`lH&EpiMԏP -%{iB˴:/(R@"մP,IH"Aoc+sn^<]JX?iIv1Akͪ@`Ai B>RGd# E!S~sm1'3E*_9ƹ 䫵v@H6 I/A|y-w6? R~Zn4S!##OmsքbRhS/H|??@A@p~S븸^W[L=AymH8ؙZ͙R.8(V.'ށl8_sLa1TG3ę&_A W>3"WҒh!4V7"c9}j*g܏yYH+3b/0}r|I@ņ Ocfm|wF)x`H(hk4[ C~)itL 6rxQPBgfV1۱j#{zz~]QW2/ 4 4@j%T4֏JEF:.q${n@/1]܅hLhL-]1xB< UQ 005V6ozX]f4`h FU@q5@TI̫< ,?V_8(:r6̂_q1L)euljKH:{ 4@Lf(WOQH3ӛw?տaF ++% v7F[q0LQRbG`^#e~k`ףYc{7Z!/N.)Eٶ+=1')@h_Fês5LV)z&_"\OTtCv55ָNk @B|8^8, 11nzz'ѽFŪ$|StT[t#_dY@d35# ݉a-Idc4L0g4D\J=ÿW Po<,O`Ŵ)ߕߧ{䲦2ֵ(gGg\\9:;{?A.*&蝌bnH1MhzAwE#Gs-[] 521 o<ӞUT(5OUsOL+EA'_3R* %|Fh+TT&Y눙ُqC6|;ߤB8=Qkԓ ޕ0G*6 5VO` 4,9% t$"ΑщOšJ۟?*:E 7g qX؆[Ų<FdSuzr^ygX0~P Kc掶J?@fiף'#:3s~w[2d[b~F×tRLo:D2RCeƵ '=hb:A2F*Uְ%.6 )%W@;}鴮ߍv4_'\}(t+;ie~F)>K[>%+u|(qӅ?}а5Wjvv0u饉mũ^M.3NcIp${.|4ޞHW>>*ͮ-3:WxVő=YWXXTY9j5],l f3S"3B6rߏA'ȩhV07?0L42 n`{;ػ: VbO\YE24L 8n%ۍ4{ hE|--1xn?TDg~6q=yj) (#qo(uD=[.uh>ۚt%FU,5@c/TGF7psT^eBWMY$FċGӽe{s_jjnn\_XXi^^[JT7;:խC(P$20 oIT{@&4 eSIoXvu&z4:ntP.BA8!cbŰo/]䙹4 ED+̩ٺ_j@ J( 84Ct|g3G>Bć~;kuΥJze:_FL=^?[B@%S2(8[׼f ̈XCs sUI[1,7[ n:߬jlo"<待x\GVf[%ƆAt?4\N fo5'4 fs%{(crhfnwh'0/r@4%[i1 u#۫H;\kb]W/^6~;O ecD w$YV.NoT%EX:uM Zljb;P3pw”ԝ (/@WyC\A]bd-?nZ`'!}Z W288qvyj%A5i# =qɿݸrG O~ϼd#G16༝AKMK>ѷBEI{( eF;"Ma!B}k2IC&xݫmY"" BdJs2M#s}5[z@:DZ+K玮$1÷qq8*{@DN6hfk٣>2#bus&Q8JY}CK8],1H/QHe\A39FQ z+cpd2D;qiFik9Cg.>rݍ^ gS鞤M}w' K_G7w7z<@j'XH}_!CuEոD01 SQ4d{(ǖ{yH`0%zz傋5LaL&p6m`)ºAŸ)™V{]'RՁH# Fʑ3#edUz YOQ82IJzx=(>z%:M^ \`Sdc:*[aѠgW*|HH_nHC?Ɲ'iguQaZ5&bH`J4HY܂{>BrM Z@]5SMnD.S>]gA_\Qx(`j (%لVC"+z ~Oݼ]#f`mU])n56 gv4܏]N2| _wiuD:>K40IR'dyf+h`fJ[LIUXB晟e?DЗ ~h)ƛ!!VdbynH;B4E..5sbu\N\=^3 ǀ+0#oo%gB}6關Tԛc,/ۛm7Kp%,bW5>ؿ_vr=ADa0 SI?߃f{='KSCwӆ{ C'lі$؛|QM q>tFד%W}C>\Xx8j_iw5:ؒ0L1i(r$ -ĘNv ^ %3C8%~kD&ne/+B0Vj#/NqaHx(Φdl7$PS"@ kQxͬnd G,d*VIڋ9Nټ;YMʪ{"ˏJC[W~/~؄?zj AQ+fCDR~ߠ};xE() a"_M7` \eFϓ .؜Q1OVx=?9Uioq4[E,ʲ/}_H=Z%|#.$H`od?4 /:ht0,~R2AXn _=V}`~^޾i8x}`тIhNVo_UbQfޟ>ޒQ\Tm?Q)L2?l6LƏ-IL1?uH[ TU:Z ("u Qk~ s6%W.ȉwݡ}<b>[JXqJj<.{\sB(")? }yw:eKk I?dG-CcD  7T <ʺҕ$`~|i3#b+Cz'}mk2ԪC9$abG% /`m$u?^X|>S ɣQŮT+P@B$?2'o3011ŤPXZ™SoZ =!a-lP-Tuȧ zsPPL[MeƟ{&b>`}l8#jmvDfo钞yQB=6m֝YSkBoM om%~@߰'mH)Q Gq\[_6i>| Y7+eZ Nh|Zv&/e_r\MfxxؠF]6 pP@~o?ȡw0F[<*f[PH2q{6Gqf ,FWM5:x_,i(L0:I|pp>{ gӷAgN@fЊ]@Bߋ0*WBO5˨F+U&1mwB]t_KoVFBIoonbm7SQ h3ߐ`=0x~atSK&DCN_rZܔ  r"y&RACP-oZQx+&N u+YncF֣jwUtCQ:hB:,8RC372KjyXQ 75霳;!Hl7˹qxQ!mT޷Q^5|Q.V`,J=(ٲ&ߙ#(  $l,%EϿ|٫z"W5(p>ƃjU,==?JU&+uހidžphw/X ΃'MǑ2_jT_PCݫT`aX[. j~H:I54 GbO}z]z]2C? ܷ'̦|@xn&aG+M-F6Z :x8뼌Xh)u@$ç %HCn[TYBX @W|UU[^Ѽ96F&NLDxǔzgaWRyjAC=r_JeKIFod TeeeKd:EK㠮w|C~*_݅s_SRk{zA9tR`.#+Ta>gr$HJB,=WI lqt "32 Vpjm ^<h3t`em)١=_ipB,`%d=YvᲺE1wVOZ+j`\cHE$OA#t/}1~TЀЪVHۿ"$Pť&Y{1&~7JF[ q"-A5{N\Cu% [2 L6`sOi2{k`P%jki9R#@xiKOڟx48|Md_xl^E7U95!5}LH- IƭTa#P23{dx~dpD<47`2?!<R!KmtʄJ/KҶ<i_xmCr)H`4M BJt`g4]?/ Ə$P0ƫz ~F4"`fGc9A>Z+& 0ӃC~{-3[r/ywsuQBkhfz?>g"h0D9wK" qxmkk#^HNNKWLL/k;&F_^`Nx3v0 ka ݺxu~em\mqL y*mG2s8ڄ]z0 ](##?KW0= AsXzHJTO|A\KKM^W$(P@ʏV;g>'69L8b^oH4 ;]['fүNr]fd wxT h~!5* ڝ#D 56N'V'A޶!k{.߅?`Iyj" U \ZZ69t/EṰCg$czFF,}r贪Uv6%lRVu1|bOyH'tc<&U` c [Ipx@Pgq0a jPp5 ^FM%|K;^BUϩ)TU|'r(Sa<(BZmK$ ޻?0~c~ i( ;nnD4&sFzA [K)]l:Ģqq@Sͫg`+vv9Y솅@z޿inɾAL fbe_F%\ll RьBlJwMپQqhfaz!»qi'|*-KI܀Bݥ`'t>9:&UNQCtnP-a%p|,:DxӃ?Ԭ +~1InB A8rFr==^x/a/X2RJsגUup/pȠs#Ϥ~MR榵F_kk@%-=>'͞gUԋ FV8R (^N{%9ud*Da,s8z&:4hEǞ E#((_xVr+46`;  o-WOeI'gW9_XdL#2⋾;;I|_KA;!-}bpC:3S{d67jO ?k HW 55EYb-*+(.11@+9lẁ\Q}K;)ja~Eԯ x;5X, 4tSU;5'7m0h^KtNg9[iU+Agv{\\۝gz>Z)C΀/%jVۮ % ,얯*iE[ɕJ6Bꢌ *bQ*9u"2x1!8~׿}+浚}S _ 3[Ycxr2}7>y\\}1T \ғs`Ȧjd\j:ʍ| Q_~ '_d%R_Z,Pa|ZHv AEjbx8“jPѤiABƪ=O1qw7?i 7RlwH| tDK=Mx@ V1V\ܗx>mPiv\D*3W2X 1'z8zUbSPY+ 3,BߦP)43nKq궿*Zϻlh3 .岬mB|k JǩH˄9~BG *[=U{3')5b\έԜĊ.@2[L'bݘ>nL{5ۅE]&NXPW Sg]V7ř{SP32wVյ 3[,$ipNgi|.I⋃^ '?Ŝ@:]l[fmDrʢC.Q%(p<'j ^}H5I+!ruy\,/RT-VF6@qA31aPdEwbyM̆Ht6˨v9r0;}xt:Nx5;="OM\ObL;T[ ؘ @M_88݃%<Ąҕ\GwNNns $xRG`Ǽ/O矬uVQ%2qwvg)pXx?^ ~+]‹j?{w3%;ZUAWia)nvl'"k HV*;P#ONcśH̨gG/@s]7*)O6-Vtd!.? G";!m0 Fus> 3IE(pXZԈ t$(JomQ.IZkC`I֓E讎CW@28/qhI9fif:qj"phSspVK?O{3,^(.LF5r׹!,pPfiG^CL[/ó;}@91" #żB)HE+^4L5  {oݾ:#/uZOb>]y#l/B^peNϞ"ɧ@zbNpzݸ,NAQQY r,vEB7_U~"Q,#R tYF  )c?n-PM}^g!uG|>H6 4,SJ/Fg>*'\]8oGec@Jnj*;ŃΉZeY fecP jȜ@kt8 [UZ4M0< slռL2(Zw:i\FP2zG* zh#5Cr/r6| g#-s X r~2f%黶r@{܏!,aEuG=o#޳~M$katSdg>U | L-GYId"=[LTP5u>27UJR6:ncaF]yzG gBsF+C Om RW9{]zwZ"#Ajw3$JJk>K+M)C]60< '֜ljƃ'կ!OFUs~)j9@-c}f QL%ލوo:n"a@z> #wDK!{yêdn"A>{9Kd;fts u&pH$4=;U6j! E`% `` ւ 7|)OO]1J|9ƽP_x}etaMb&gpCwn]Y՘mAzΞAܸ5λ9V#+YC6ۙ+*ڄhMiAOUAc`yNTCWپA#Q&;1({6N&b3e[Y 5DML(#jk $y0 B/bN5|h+=,n9NrowԳHAm\C%Nswvo? uC!eBc`Cd q$C:TY[;l.4ж$1ӧq@j[yf]䗞!j<.F6itig2q4EQC iW&uIHpWZ_U߇}*m\ǵNlz:cS>vYP+Rix7\*΢ia+0 E*8H+A @6ki8%"ⶸ9x氿D] 4As:9+ԫ~EQ)^)Lg"neSH"=pO20!Vc$ B'#"qв\LE= q; Ψ+k B"[>- ` Z82I\K- L.xCKnaԂ$PPP833ߢ$-u>Y*psՁk: &=J>z=O=/5z"*AYv.uk׷z@>G=抄nj paWZfx40co鼋$O@?<9!JlpLvtuyz.K:l7[-w?E 9f}QjB!}xnF%N  YL򸬈 WDZExG,y^|X̋HA^!cB}H5_S~Ab\Ra %'ƿi$,qf1*^YzF篭 /7As!@*W8H" Ƃ%V w ^1,(,N؆z!Q/ A#T8ST!#r=ʓ嚱F\2)hSo.%jW8Q? B+pI+xR2ȖG=]樂 $syUkC!-R]":uKBp3i0,tFg\ D!hxC=Ӆ_G<]xwTP"e-v4?: x*YoGr? ykl0 |o|>u|>hB322F??~?r3$LDhp 9@ƿ X Ȧ'?q4D$`$5 iG?=xja]a8_t/0wwA}7zG["1m~]J߫Lz?@ d1;Y{m6j] iZUHd^8FqψaV]h ꝝ1)BJfbLO6x5^T}rCL\4S 6ןʪ"JOSlPNiNBAe<-V\i39T쭲꧂D01cǫΕΩѤ0 Wfd ¡bq%/r`FMu;W|P.66N{̩v[۾|2Ouyk|}!.U_ Նᾓ[=T)i)W~ȇ_y0He4zm 1%Ķ-b-b;=53y==a?δRiq&(YmLR)vvQpvf֔ &w}ucD9m;g aE3q7똬+񹝴G=I>^VZXVG)tC|hüK% @~yPO/;Kߌ L&Ȃx~(x!ڻ43yY,?ܳV7 "/OHXmZQI/P%6yՄci2X̦ojUsȈƚH\eɔZR{%_6k\]IПv JA@ 2__>_l|J=s-ݫ?MvUMѾ(s&ߞ?ɫ{(ZRQG׆daz (WD<;\}&nKڶߒ˃0~ZH} wh3ˎ{BDjcBÂd*T"_!`= "UJexo" ` |ecظr :-G{- aa puħOXjFqw1@jS0n"FGwKg&cjM\Wg`}BM0_q`;mCσ '\<䵢X&gV֏zl5yGp]4n\w__p<}]|qͺ0τ a}wi)xR*| zaA?R% P V-![Šwwj =j>ԣWtyv{fM3K&,$$2[GRӇ%Iω__W ؏Z9Kް4cSҷ. KsڏI)5䩔Yl'բh+.p,ZYcrK=U tx-obһ1BR<`{q?~ զ<)?(A:%5(xb¢d(Lttn{GWs:JvjYB˛{B`8kDڀAEQx{zQy&͝s*"ŃVI3v{{,_WjͮQ7_ttuzKږ')WReJw^C{J5,U_ܞ˕<+Las-AEn%8pXP9<(ymxw/ar/B;yUMv®8씑3+cc)Ah[7hhA'VBv#(oƣ~# o>In~ZFZ8< +oCw~d\jtuhGH OI%,X2pi:rT翘Zw֤^݁9$łfCܯq]hd sv&{8Nkow'çpk>_&0"OԢͅ]Q-TY{XʗJ.Af(PYL_^UA|~$c/ ؝Z~ +&}I,V8}vb O9gMf׺M$KJHJ 8$Q߈ Iͧ/9~Ve| VYk'"/@-n_-I?b}`d$ʍlYgn:EMK`T$)jNnzF !@~w:KK6lj.c|+I5]t|H&)S6 -X38o?ʊ*S' %\?Z/Atf'D s|G\)Lq$ Jd~SetZߘͷ%$8jlNœz.pvIk:)lE_ӡJ Ul ?%L+zAGs^~fQ23dKEk0Y0),`%lr>Ie~zZU7e)[*g[&~-&6ڶT=veXB@W]BrW[ &$IŃLnf AuW2:ݼg^pYʡL>ᩐmPl4 :Cޛ>oMKIx\ dRd:-64LO^ڇ!cV%c,Tw¨ ScԢAr|ZIg2&&moN5_d B7&*` Ѽ.;(#=3lQ_|GO ϗӕ顧mdō%:_ tZZdR D{k:8l3>I~Y~v{l"3 :bu*iMZBX SWp/PJY GhE%Q:f{q+ dޓ9I{u2YQp1)M Qkuqj"I\0ѩ72%&uUv3 I,7"ݱ:suf{l\(s{ve밧!Z{Ht?w䖈T=y 퉛)mNZkU ΟJZO-ŵcݳ%t< 1 >pSV=;fL, &Uݕ^敁'LlFcx N&ZɏG ID7M-x뙪g[>oB2ɣ'_^3IT<l(ɏ/Pq# o6PGU MSh^ Ow{ll(r nuK4B|ذEad$h>Pjz&+1[F0X+{;1CJȄgg@ȵ-Miɾl,Oן|O~,=\Ѯ;}b=a{{K{iņEWts y ?vܟ:ȀvտKH[= e#_^]c釘ll.5z}Z[ja؛Wr ~m&.$&% ;S$ZS1K[OHNjK'hN;7-3ÃJ8:vm [@ m M`AAM hh%Ԏ79ݑ|W/R7 wb}IKm2pO*A3HG\vkѹ2m<_Kx3Vn}X n#Y"9c[SVl.\; gʻ5!Xذ="ʸ5GD%yK] #_\5FGj|'x]5TIgTUkhRsކR// -5F{D1[IecmU=>[j RRc|ݏn jyB2޷fdj[Փ< yU Z#4NՏό[+D"጗*jxXwJQq}P"]S%bԋ)µ%LSŻm~C`yF֖ܔ;_-r1̟HOvd3sԫԖ6 DzÞ}ye(M_v2`\ 邉:-:SaG ѺIb9LXcm)&=^|`MdH]ƌWWz^^_ZEk\Ud3?w Zæ鑨=?5xUTK ȏbs]g:bdDU̿A!I" @ B`J&h'wk9>}q4FaTDFҭw&bAz"7}];I/}e(x*(/31ơbZ =WvN*l$47>َҮ%?;ͪzO=9'!/~4Iĺ6tL7)<<ρ*H& rۨ5ڟJeIJ[B*^XO^&?`D L*FVpm2MEleŃjdzI\85Iuᑞ$84 P t=R7rXfBE̫Mͺup9{S5#)gүD˫|I,[]E-}g%D-#z)'Лz΢(SEYGj-|uUyy af*>#o@CUPp08}@%!Cfory"ħ %5iM48)j Pj#!WO(D:LTI7YSYΖ3QQIh#<%~w5*mgr`h&c'N}R;}PLRZ+VUSIA )z7XpJƌ_#)Ob"6ZtMlɱq}ټ죀R~dհ'%G|u}|#.RԙKU+OhH8p]\BEDcdy{i} ['svNl\XN+`oj).ْJkh);D*C#rEѝ62Fy;ޡi-^a{*_AAB:1:4eUjv:rN:JՀIo/gTFC]p#+<u+uZbK/@u| wKKn:~n3 cSHL\kI#wBlumkŧ885 lE=(m8^:il D3^GbWXȲ۔-yD]{^L' %7;E3A_i])gbnJPw&cXp*]lg@JrL( -!% }`}Ϡo,eYbS,h0hEdR9ɡ[}ĆB_"h?HblsrYc&~7?`ץdwWnMU81]Tk/̺%r22F@2@5+؀ U] ƨ q<1U3ڮ~r]M2q0[&%z7rgm'863uZݭR+a I ZFy-`JwSn- ;"4JN Xcuz%_x1#+ ;d #AŮwkQBB!*mɫl\Fjv\RK{ ;rw>;Jv"ep(X-ۤ%3,"!E|l MSZ(SzS!Azccgh +(,Sєh$fVĈhb,=Ek>0OۺWj )+3Bԡ\%:SQ{d\Q\}FťN@񵵦~SQ Eic@ 2AuEF:kKqՍ HErokFֱ|RfJCL\="OSnƹSj % H69HdjN{ w){.Fc+tG"Pxt[yl:( T&M3ywq?]F;lx& e*n.4l?7J{z.go~ߠQ킞QabZ 8­c7RODaua"vDS \Dbvi`i gpW۾p$YFOќ|7BKh7!{-W{́8I}n{Ѩ-EL}9op`~@1o3e겲kcz5#& c% ~oe)Tg'%)9— f>< -bz֑=Fʺw :φW|׳UY5sGN\r؅977=YRj aVx&pOkzϬ.:p2~koow9 HKJչEbmA ĝEKt lnm_?\j笽 9k*F06 xmqpT|dvQFr(js^6:qvqDn2N睫T* RXDŽ3yk EĹ!.V2Z%2 j|/52S69Whl0C2 ƂBjhE|*Zl]ƄAS8ʖ#!+<*\ Ts{=QQۓPP@jnՐ%'t@J\XSܝA;Wݝ5'Hy=ILxG!9 6/ 'OޖJy'7P!IycZGd>j#6B5X[Mo{f9'E.9QL &{2+pzt^Q26s%Lz016&QoK~qugqIv>@zp0j`Eb~nPT%s]稽'6rt}x+s>8c}(:#̓Аo+4oېb!@ pY%7jH={T3\b+%M!{[m1eoRrbǟXc+V#8lll%" 19 s5Q,k=46 v1_JO%{y>wor߮xȠuh?@H[xYZ/[7ʴiVl5nY]4m9e>%Qʎk Y^Sv|d.S7 )g_Gՠb ⮺YpfL3ZJ{Ct,\8sշV $$.2y6e=0a'@62#2 1)k=y4L!ⴢI .)}=5{:Y^=$7I3Qmz_U, [aaaoeG :c'l ~q dL9ñQDLjs9-hQ,?H +UUy9oLGfh} @ژTIɯO:t4HWJMMhp7 Pu戾t,cu<<4F")=g4u|4LԮvSK2  |7ҖE5 \]#)775rҚ+CgiPZiz_~[ @eB3wo)UrzGp^ms7{a2b '÷ӹΗRDͩ:Z ;BtON/࡛(qZ>oDb9SQ{-CIYQ8|r%i+ S%-A4H@((&A-&z-%ni[|6ixoSn6T O. &g9S~'r Y0fWr3@bN-fGsgg6^vG% =3Ќ?4%:ea<ӣ4~qUN.7ϣ4ч K>{uU]wD fjWxƒYE|a9,=Dbz4AARf,B;)由i_8Qitѐ;KSgmBbIf3uh6(Q"]z'\EJv>rB(tтi0TkH#޺<ɥ}P&Rd4* ?p|[˴ yYu:˶ӟ$-ʎ/O[}* 2C62;YmhݒS9#JOtf\tAa-2wѳaL E"}@~aq9 a+$5FCqVLn y'W؁O`"?Ƞ俾?D)O'.!CJ18FIb+r˞z 2j⿰i/T}鴼46Ww*YwevSХ99?m8#p5pM 4ym] 5 l'c:'i UD$zį,ޗa"Jnw~ n Wꚠf ǂ#ly _zN 2H&'_`r1@ 1Ya @^Wӝe..[ҒS:_OCdO:)W$'m 73<Ԁ_yٺ,&R䉑B-Z8#})H&;O/fD_zPnaiq˫G1!` ѫv$htQulO> 0WZޝGzwli[0z,!Ά=4[&f+ 3k()Yx]SX6rg; Y~IK/S-Z{qlwKK`=^b..?I9sup< 6KwNT]xF~3 J fak nG+C{)4zKVFS60}gX\W0<:[RA2@&:RϞֵ=x*E{J}2pϚA? y@U~o@ $2ªIKKBKV_0h[vg,LC 9bW‹B>Uh:d֭?: 4EwTeN\ ˒)+#сL j {w=^]*Ţ `urev+OIPH~J "d>Hi6kM,wKW X}VL*;<*!H\ HR?[]pLx#ev׽_DE {&붉[E~:˺JC1;me\i'-^?˜)ʆ9v2M fA> ̙. B9ٱ\<|!TQbf|I=эbL#Gߦ^ > 5ize DpM]BlWQǐakc8FjIUxx\]x#MZ<\Wx.]|gӢUondJԮD+Q Rs0!ϥR6%\INOжHMUaXFm L Y٭XMzoOU5!|.̙IAɂQZϕ:cEm [ 6֐}M],wU$_4w8vh1!k\i.h.I`k#i,C[.C70}|='hwsg`mԪ\i4]`xSM4*ˑCw>8_Y j<Ʉ7QWǫjySiIHHWptekLNKl],?@.:aM4k.:cU->Ey+xҬ##eů3 Oh%W{ f馵3sqŌ:k'&"I(IJ nHQ3ye&$&[f&ɹh 3>ne%^9HdD""^*'4$NU4dxS>ΔghqɊ $K. S~Pz_EFh9z||*t2P5m llP(F#u U~\X.p^s[J]vvZGG'-ݍBwVzvu72ӗ$I;"Cܼ J-Ȧ 8}Ob#$88ya/N_H2+ R2F<֦L#p/Ws:$k,-(ԧb%o}Ж9?qr|=!{š-'nc{w#8rxChx)S;,DE%kXo;{¿a HD;Eyj%H-@.~%8v&TYeKg7~4Ne~˗BX9KX}63ndL=CG43irQAߺTvhxk^A1EJbccϳlI?}>))iqH(P99[ ;l) Y\_s XQcfa٪2!F=W dgx+kh_>xyg o'  e.پ=iOo\\69.Ȧm†b\WSwS7>xi79  Te(Hb'#-]fzjzW1 SW.$7a(Yj)ؾ*ϵ;UM ~$%k[Gd%=(6ME*S;lΒDa:MYr@˦?qL 3A-qVMq_puӳ#ܹa*02dfm!ͅdY/=o.{oz22wx0~]6ժ )b~\X ilnSRs"Ofb'iQ??Wb {Y^ g0䤷${T䖐bg+i zMXnC< <<$!b~h)kH[233|x;~:eww{oxst>^FL,mm̤+OB}!}Ե%T;WCb@+)'@|箨dR3PLV2<gny}кs Žɗ`V˸#hljy kBf&̘=o˄QƷT%ݢ_Y5J6(X ;0z^g-YgILj$!Q6͂W`o'TK&X[cv&Vqd*fHsL*mWn;ڽTYyHʜWdYfKT T=s˸.$3h~[J,\ G6jw.M6.=WlK7>/I6YQmѫXwBxg~˥!#CfHnJ>)E.,nzVO4i*R<޶\iq5uK8;Igqy@C vw+/_NS h^:9ّdA(A,7V^=@34Xi.}+N涘⢢Po1~Oz,'(;\gL2UvӄxMTDbVuÓLt>*8c6;e/#u{ ؂M' .1%MiZ *1ϢzH{8D!LeY_~&.DٴzLʕ %0znY83!>:kڮ:r }}o/Z*ZgEJWW4b3洞#-E^?2+ܳ!Ύw4hD$66_t0!,Xaْ{+nC+ 6fD$~v1SjYT{E5؈ҥ{'&X0/d|)n`UI{w]؁*!:e0.#%Y"yZmxBJ| S3|F1SrĢaZȕT5܌Py }o 8<u zr-olSP ^SuqQzetw|0'" 􍘥jyȚkfUpEEbL$iʺxxGmܸ6_j뙪 < =V۠tkwMa_%(6@htݕT;x')9!)$m-6WĨ2\u0q+5ȼ]n:@#ܱ2L-ut]v`U+:Yk^,1PWp؝R Co $794oZt&mK77S@oJ?Xih'P98&ci)w$2? !P`m|m:SN-4 *o+JL:X(,ν_:"%0PQa+I,H-B\]-bZ_M oXYO $\E='=sƇq56v/DC=mrf'P/@[̭-"z},a(m*T,C~Vltr,-+BSp].\lyY3˴iaVݴfx6{mK{ѷ,u!ԕtP8-1-jyLkb8D1`t4`(,eJu5,Xf5[>ZfHŅSoomlk$ۋ7łmc n]WӛL ܵz{2zK\! -$)D~B6.SSRྛko覓wߺ(ipAÒߛLy]3ih4ia3!/~R5 Y& @>F :4Eg#ڸr:$t"S,/3\ȷS OnT,ekU@7k V( (lm}24t "k˛KDKJ%pBzq &5=:0?yW\*Xry/'?>$xRLz bjZZ#.aVQ.'hiI05ٯZ;g$I筷b,| vK!Y,r~enN{[AhĎ f~o,@~kzEEVKWbP o!5zjl3`f})w6DbMq!~B"S:z2UKk@wwFhJGИA?EغkZ+ݞQvb41ڲV͍C;; gklύ!XgʀST@H }F>\[6E98cN'62^'MԹ q`➃ƿ@4x>I)fw4$ӡlH4}Zg˕`VZ'ZN# GFu(a h3'bdtp#uʿB8J3%&9$]fZgx ɠHԁXJJocge1c) %!j< oe4DhR__yoq.5FWgDƵB*4ʟ()Jy""ۼ6,HqtUButV_T8vL^qmm̄X*_@sj7C\XFF@/@N?|k@`X::*+AՀZIx[I8A>0_}Bo,t4 JB@%]TA{'g81SSpM hL\]t5.nN䰽&:.wz)|PfTtUwG{Cby-!2up:Gqa fe dg z)Ay() {do6W@n7;_Wӱ'n˵.^.MoTYhʰE&G%_` 7ݎ("XM RB@rVl(~[zGQ!)Sui  )Ɲ)QA+ܣA9[K&\ȥ(LnPH` (:z^ɭqǑ]pZ6VjFuE,#yQ_raQE{Fg:%%Җ'(dDoXle=8\G | )3k&&c [%@#* [ZN!@L,y@|Ӟޝ.%p3>d 9dZC$byrE%ݳm<0jC  n ?R_8QX|N|^bX4T /madx <| g\]ﳋn끋[풋 .~|쑝mFEK a }/A= шo$BCLNEkSS)Fkm1l5s⏂җr4?iK!lf~0 ?cœh`S'| (1:xڳhakU=>?_ku7 Y*tf'yDP8@o`h xM:haYũL  s𔥱y~AW N'DI*~Of9P2q#"9>_1o1o@V57t'#xq0GԱGއ;~n3wd,_(U/EKErL'>U%tz G-e_%EdMw H* hpX.$+@&*O2!tI-;"$-(,J<>O8۷&ȑ uj#0^s{n@ ]̪,5ݍXQvxܽ5c{3RSx6=mf.Lmvvhhݟ %u=ҕRs8_R(6>,M383S Xׯ{KeeD~A:h=!H(N6<-&{SIE⛵&"*uv eAͮ|-uup+AA95AK)"$Hfo;Ō .Z63 m,JQ]JcR,.~LiԤ /\!] .%≆] ŔA8uV oUY72Oi=2@e>f9&0 Xx`zk~\z3aҥޚg{SCC=/?rB!Zuh~MH4f 5|W e*M~ +u->͟O$<R·twSiJ: /kֹjHSǷINsyun\n ,ﮇwP~d`ӯÁܛJ aR7*jEqk4Q"+Sų_Lacp]!s@^uRoϬ56"V#}BZ do)?]u ܼN˝4%3PJ$6KZpp7#()k&hC&zە(5h NԆv2diL?XA/!F>.0DWґ@3"vA6 qE 3PYEu#B3ͶӡA#)nnK:!wi6֕ g[k\pu&r<Y>;&ǩ]G_a}h&۱/*eFq:+Yi%|@<)hG;qS?6x9ӷK'F5(<]0-W;a f|NϞXѶPc$ d/c7Qёeʊ!||d/orz-/Bdzw|9<θ:\'Ǝ~-%R9t}{9`}f[֫ ƛ;K { #ۃ #˒z~$ 5)Δ hR9{[K [u}y8(׉}  Ozq˂⇾VCTq>B^h 2m}׸{5 GuÃHjww$f`'EwAE).[x=XWTPghȞ/p$W/9g7bPc v(nNrg:1Hy׈T&h:FBi^veO s3+fh}C\Ƹu /@ˋ'ݲ/֢Y@yuDk #qox eB]Bd'0$4F8t.ɩ6-=#j'rC ~MO'h>^o2vq]\7U0uz5OjAH|P(bWX(FYz-L2@\CNY4T?*8 QǶ*1n!Q38_ N%8BcB'{"g$f=|{C:vhh+ZFt@ z$&BXc(>Daы/_VI8{ݣ1v=JT5qҵ$yC 6PScQ%v"nb/})6L Qa G7pq]k|@WgkGJ@>-+^CþCB~Z6r!JR,~AQ0Pdd,l n(UrJ褆l\WDA [1,GZZk~WiHQ 8S 9D WB';qH (;AzÑ `P?yb as♡llj?! 2G.; *U͵85)P B#={|md 7qfH6@}ظ(?uM5uATebio 㪤hS,E9պHDv V jF$S王O:Vj$ ESR#slOCeuf3K"d E )+տڦG hqy3}ڙyur#( vVF=?I_OҌB( ^Xf~4O uӎiPn]/p?`UMV dhG̿"JiHpM@Kb)س厉*H(Kez]=~Ү61_,} ?fBqB%:r~҂_JE?G!J`$oMϖRKCNo6P-o~8ϓ l 4ҏ6 ,ì} QVw\(eq*K(KN es.Gc ܷZBak巗oΖ³˷.MjU3 aE? Ӄ^4Xd%FD^%p ̚f=qVLE”Kۈʆ Yg5C<8=VK(F϶Qh(#45E2; '= SfgQ^Yt9Wf124.D׹d:L725Ώr;$ ?|A< Si;6NqMB_9. wa~dLJERa'}]ҶSVYr %^Y_x0вIy@mBm[,|_(, N0 jV Uz *+-[> :%0EJ 3>B6z#fA 9+1b7w` s5dkVmCg={ݠ]zM݊>$#:iqDqߐT  dף8 yO?ub|:M4@Ͳ "u!"v^>2$aqg#?1mOrK߼+ yM`k(_zW}GIٌjh1ß-p٨ ubuy7LVZǫ}'Nߟhc@Pt!&4r?N:*#j;Ӯȳ:$YM`P[dL4oɇzX?ֶQNqP-ٺg)5ĞQ0 c!DǏ ʜ2:ޝav7w j_J` E/\_/R} 絔89^m'5 vC?-b`:7r V-D\5d#LOFwȞzaJDki7򷐶dه5z;(t|V "-ooO8utwAՃk2H,un H Gl}&Tb̎Mc-zDAL2;%7 l#xW'B45onKvJ?ȫi_x O!B;J9.&hl9/U#'g.<)*z1usH<\TP(Kk3w:(\`9$씴Uwfi\ʼn)m}~a)_ RL&9jc-98SjbYc_myL%1B vq7&ˠzKݩt3;sra%/P>QiyU֣5Sץp)SNѨU*SPm۹w #P:7Īv׸*HFYҤ FDj7dp^ǃL}+Oc+J+F}' k@8  {Éƴ63gպXnG>G%zq_'&$kaЈ2y¬/i`B*/R6%'pKX23_G,.ϥg TKgB2Ou)@z"v,@ P&{nh}pyף:vvv1u?L 608-{NY9@o9VT-_^[sx/r54ծ ~?Ws$˛>1؄%˨Xʅs}/@7;| 'EC)en|;2hװ~X}*q\rZzՈ#4-n5jNߝ~~́!UV!j?s`!/V{{c0;Uj?K$#4YtZƅ'XtYiӧ7}_7ϒ$wFu' 0%~(N>o||j^%:g$}QbQ2}|' {'ϣqs>f*ϖ ,,^~ =1Jeux ;59!aV}]gP/`ØLKR`kwc"ek_FDr`{<8eS癜h ߔlpH~*+3/ kW6D*7[(ܳ=K'H#1tme»*|:OHAbyvzmlm%.5Ai i@/bܰ5 +,޷^Ԣ*wgLCy6$ l; &q̪pg@Ý=5YjԾ*ښ%pTdc;0/w'l0DٺvhhlC]s)ʫa]0C s4GtaȫMg1SHvA Gi\s\QŽڅ$.S )P62=VjdBۇ $u1kxxC绐~j䐊-#ՔyBGw`'3.d V+\˥Qa[SחLi=Ŝ9WjA4fM'XA ^IyFFsٌ[7ȯ2kg7>x#b0g6pMym -HcG6zj;5G/ev|jMCReFq0\A|5eO -0LS=@KXA;]vhsL_1-x!l }~@ V d ^t fu3d`LAo#H5e麴#=b9;7a z60\{ d kpي^|mM#7#IeC|w43N*,2~YF˔My9XE߀ -%VKGpivVbEsQ֭utP}}OrI+aw1am|W9*!:g9*#v_PM2iHGa1 Ng8z3p }h]fOG)) KgrE)[y ܱ̃ꉩY'YqKCV'WdiL;'" tHC_.; AE K @N~yt\?L j>0RtVTD6rQ8!iv0K{)4{rPiM5dzef^oQ*ڜ&; Is1iSx%dMj _~BLi|$9m*l434\HJ4e76pݝ'iű0k*>Ê;fx}ZGd $8%2A2= ]׋(En8Kׂ OE/^tg%!R*̕)87_:3%̣<:s<dk%~D ~q`#sc6媍:˵'@мOU@V9C?]FP}Z#jGeIR +W-e"uؚ4u l=oۊCfx̎bfLA 'MF4 8|ʈK1WK0%H$<٥$VқCR&Mq󗦱ۭf)u-`=g#B7/Wv8\ԯ%=uᚠ _כ*Oà)VV- ǐi~ZPʥ2Bx}x2Å ܑS2>5ē]<\  9)0Gyo?nwtieei E0ώb{7:W5 *_]/+NO BrS>/"kLLLܗE_Zb/$^/-K˵xYT,<\82nV,\hTvxW8]w)2IF8*D "Ao}2oloVomeVʻ+ibΉzP(`"VR?Y$ԹL:[4{Ck?dVHOtdt 0tj& IҽZo\OsmCV#EAqf'.˒ͧ{>(B#$=hNG`<RCRYnuZ+2ƒ *ϴa@. ՁSMI7պ=ӫ^63-b(/ B6zojBl@/FCg 2CMqVBP]xz :fE_2o3Ra[١QR^X Ԯ5 vAyfRЛnZ-X$U_g{FZHIV>9hտIm4S@Ѣ ^P袈t!.egkZ2Twi*MB8K*:b]D+zw+OZ9K&$;k-L;Ͱ-o lY95IjkƂ㹷QX?TM5u1o, R 5:6gg v?w ~awt P`Us{=kR0z%"7TuѬm-b ݖQuվp_+G߆ ^.a[an X!]B$"`^STqp++{>߿߃t+2X;'. ȴ|qKltدf3^4 ʂ)maȈ鐋Jf)O"h,u9 \z8p.X=1.>p;!2ɏF1bMb[%4ؙܾ<9}mR v4E{DZh cA!Z5.fvIM!ȉ8`8N|AN?_#ik&,V|"& KEN*#{F} ;8e *_wb"+>{v'J:"YcAJ+aFF5lZ.up>#lgomm]k[h`fsT>1K+JVWr [jv $xb\= mC5P CCL8jXjTUaMM5n?HН;S%كD ys,6\ uW<}>$v+E:hx|u7Ow>r@pz ^x3uG"ͭCEG]07 r?DOݣel[ZniB*7rm,y>l_{g|Iې{'aGíUk ǥZ NhθVG,Xyp/3Z޻CXN prdg}=X]K{ cT&mв5@JwF2{y8+)D`7݁S#hE+:GNP.Y߉A*|;+f_"B1KajkP*c+5( Yld6 'Tht[)ќAQK@Wտabn佄.cKPSIn ;- Ok-~@ ~68ݶi#\7,ǹ<J֬m]aiCAymB@ XIkFYjK 48"Y7V8ozml:εAB()w*H_/pC7dyKq=ƞ[*9< ]ZU/.jܦzG!` +%8'B5NZ (%uw9rWT G)P3ȈΕZo2;]ժY0eWj衂BuCf4ҕ h܊[.,Z{|ռƔ;U^ >֐J18qTr{u]xuHR>r /*LnFcUwPbr.+w)@,!^I2)F4& CkQ'~>A'xR|)ZjɊQ S~2(>E}tϋa dتjuTAKF6*=[WaZ[ Ǒhzd'9q䠛7353
+'ƕ& ڴxhmC MWcHHYGV]c /H1 Y)$ Cc`K~|/l,# 3^'1NJY+9!aJŒRzJ$ujBǟ/Zo#/<*s9h7m8LK\C76E:^F 7&<6d2'ċ~؟}y8Ѿ uo%wY((c% aWuc W޽hv8kYHC=PH+wPp[1VBaۄzBsq=Ӭ )yvX#7b@lm +jrBa귈wmpJw{kJ(Zb)k;jΥ<qw;01%&yVIcn~L!QI" V .K[fgp9y#A/baO ^o^/cGc43E;qvq䂃Aױ#fvlf&+0 WaFsz\l0 q,NVoryӉ]I$cM|b&R^쉥7C ϣEg/ 1]u&Li<4e=woJVb^^q09`R>K:D"'C=3Wo!Y9<T昇6 ۯ฾ҎM;F-‡n`c>Z/?݌ԡwhx,:` @ 1 ܝ:Dq;^I0*/g7"G [':B p&XbJgG0]J~=4d.E/vC>N̓.19@r4 ˱:#ml $- cj]Tuv@T cPgYT ʽDXr%;Gɱ;2#֎JUڤ}RfjR;p{Rt30 "f 齪FyPtXO]s\5o߯T4Ayw"M'ބ17/tG"0f\#/ ea0#v']+mp~]w k&AN>y0S,E>Q96GUY.Z4rnP<6yu|+H=S0BK{ ?Ot<EKaU_pW2S Gտھ:ۭt:yd<%]=d n~K=oYOsbtthne166S#r)xEm3X蒁y﯌u砂ݠ. >P?jU@o^,B4`{cKOH⌋w(6!3{IvV o]B]0{Km]gq޳(w,F)A6V'lmE.6?*rxf&!6pإQAF)ڄR3K[Pr#W!uXp*p|j`ݎ U$cm@Vc F Vҡu}P ;Y=L>|W[O~e"uEC^ B_֛啩|p4rJTkKz>;q^jmWߩj#!brU̓Eu5q)yF!\ӑq!-4A"W ncpNt1"U=1y(d B7HZ'X:ȣ*cUl4†agF.sx(4#Œ6SzqLi{ db QA훊]G^-'UW]:"54pfHFd#AFav:܅pn2̆.t02O]C^j-coSäN(a9-Z}8cI!;TKezڵ{p^mSQiV_]Z |8wP$"|ڠ%Qv`K $iԱve$'b;A;sȵBLj`֎HB<҅gZ5T+3\'Tjc㦉yјC^ Bfu v/Zѫ%q)آvFЊa=j;xҞ]][j0qzhc  âj 庡qJP0؂ %z067)kֻ?0]X%.o3 EoՁމ!HVzYY4b(cم "MHF9؛jKq[`n":- ȰRGnB׊[ZBlNHZRI5x1\ΆB~;`jLxn/$mtq VHjգ_ dv'xyc~wu'+uyjpq3`Z !xU5MH1u|BdZ. +@W Io+5tl4vȮ(#; Z`f DjА֤;v͖J pxRfVf޲Op#cJƒ #z]Ufzn5^JIi[dMc]?s @P ̢؃LltNŐ:1L  0 Z$-cx  rKOB%+&z?PP @Jlx_%||4K#l~9-!@G{Bf a&O܃,Cڐ|J#m,'49}֙c 9*J1M] "m Dܸaggg⃁fA&Iw9XhҘr1@{G#,&Yu2V{tO&öDI;ZyNߦ`6]mTb,4R]D"CIX帡 '&E#TS?1K3xy8~{B (>OY]ִg: u;,4  34 Nfb 46!b#%Uc~^ ' 7h{^ il%2D.\)$ͭ,^Vrn Bex-'v<e*&bYI~~mtٗ5MgUqHMEA (OhګSN6+1D|_*h7\Hu ڎ.}>Pxl_8^;{zw/:l~6\K49@%YC$!P9C~+F˽άR$Q4Elvdũc+vbKIKY[E!O1hk8f(i'8ziYvün{RtQ{,R"2vYHD]1>:AڈWQ rKݲSBhiD9-a', Nь&d㔮W==xT[ nYG0uwn\)aMJ~2:T"NTcf, J84R@Zvj v:cm8TD63!ٻ|:`OW ɖ"2ohڀ_@g`>)XzQOH[I6|=¤Dr:oG"|ࣥУ?k:VWrzr+k!#"=p|nPPt+U54PR9)I׭=Wʨţc7C.7R"a"H-뼫*O>;x̘6פD}|;~C"w5i11R o{1c:e#d?$k/fܗM6aDK:fGy۽/zec' rfGpxu92^P No%En*)9F#@Kj@>];-H8o~x>b䯾2 gJ§NmJflUNFQyAyc?G&.@xtan~{+qb0$`"Qы &}^Uwu=~2lRV6oVa":GK ;T򿻍FG:<};khj>Ko݉j:csoxHo9wVҭDMwЊD 1t h3+D:E_j-YP/j_sGQ\ph U)`|"9Lq\ '4{x1)_au\ Kz<՞$i ǬӪV:Ʋ7nVΝFA3Ҫ>+ygOMfLYw=J _C?Պ'L:Js2&Eg 59yhxTU>_:D{}x?] <(]>y<|U060ݪ01)IfLA;awUx _(],42`X=?3K^UxRdD׽S. MD- UseFi\uvd~:+zie8L8>m`<&ҢtK) :L":b=>c:N,덟_6w~e -PK}h<-<dRK_HZr$ ) S3TSF˜X+r2N;5:7DP~E62wֻi8q?]pZkCd(=n0Z<291 ]e|h4$y|R+nK;?uThIƺ+awd=XA/CL ]9%.8Yjќ0g9 ;mF8z7f8`@EmpH9-, KK=a)SSzw~Iv8~Ahw~)I&({:jpt*{oÏSݡ ܁`,ͥOo?mtOa%!md}]]r`1|=a$TT1=P'kI((%sm0I=3cR^Wؐ=۔ -_#ۤ>s|7I2}j6;$ yuW3Pϵv/[֢GFc+m%Wn*S,L?!$-<'D8ʝiFUIj/`é |: 5.bquU}&5bwnl!$w|3t<9&>Qpxxk7V7xqL_ҁc~-$Tp1j-uc-j5G7^H~t!4OSHlPʦ 1((64,)o@MojHU&?X>Dhꇼ(_POǣ5;{v{ x˚F9|GFj=s)UȹW*Н5Ulzȫ<Ec$~W0Nެ_=(`ZpAaۀ#a tՆM˛ަ6_8X)NfHB1žF2j;4n(\=,/y+As=H/ hC0O- 8ܢbJzMa)B&૊̡й$[? hж*2 vN㣍u7%:,(͊WKXiM3h`}Qvhreܣ5o+ WskΝ^\KZתɥv#g6C؉x ț+=;X0cx.:[*j=,1%{Mg|_[=enS p)( GPXylF$.n>[G:ݞ5~rVZ$=RA-fIX*'S\ s@?>*%<+2^UV! V{U^76 E .H9<^!XEM((WDq"n]%! 4.!Azg5UU΋tF5E9"3Q[D>p8͘wsy`k͒'挈M=$@3` c۟mS1gMĢsx+rez ħ_MisXQM}&æt.FZkOqu$3mdQj%>t*gB|!ݨ!!5311&܇bW twbS uiFƊ-DZl+e]naݑxa3>"J"wHU ( * LnK9 chu' w1OLsP+PA{vZiJoohCW@Ca'|L\B6C{H_v!93F 8< 70F1z׶>A*6hߎbz((P*{Eբq$Xc8JtOûRO< U4\%9 ǁTmȎ{1MIg Aa _ {H9E6*{7R? ٰ[ݴo~5j\.bςbƇa.A 60¬fO%4}U^f!j47\K) [_2!jVn(2o?U僚edծPhAJ1Qg\ȈO6af]R\qv=)4_s~|Cߐ0p\GPVEL%r8f[%`!cf:L419/ljK~u+~:Ec$۠zO>8My$ 4ַbNh1.+NcҩHحOԒbbiI?j>ܭfQX  *V=ѵNEa7uK.Gz~j^fJ!r?~h<[ϯWxWT -ꑾ±0 ?=34FP T]AհV:Xk`M5B\ht~AK(?Q4;W.bQ+|X6i0B1W =SY Hv7]/_9RD2_xjJͰ_8)S6`Q*2ϟ%Z3W kuh Qh *6wx܎fwØr\ 6d& bsv8'qs4+TZ89^k%`cǟHE>.o7 ۦ|uUb$PD$A\. %TV+'O uŦ"}݊,?Uۨ;!?imc" _ oVRQ[}"D-*ƾdW_~%di/QZ M] !i,46IuSZt茱hB=9x++jh% (}R70`U=a,41LBid؞iR1Lck$_xqmhZI]a?].>Q/љ$4NJr)$ ?֑|*RCk ֡Dt͠ e!,^aAUƼ{ %O貘OΝe~֫a[4tG/ل]¡P,AE]A:SxQ&GA]@|qIv He?AV! 9.e 2.$jt1_oxQ2GH I'=y@)Sgd/+0g՜ɀ;dV!djD:|oUh>cN<P^SK}bG93|iWѺˆ@˶(O{+.%|VG둱; ~xlO9-yQy,jXӅ[پor 'ԽϷ3)~LJ)me%zKa%}lJ:KcG{v D۲9jm!!6* ޞxi,~sە8@Pq,?T-tAqCv`zo5@01-7۞@qW}B38z1d?/&$Ly)qJx, 2#d]LQSN ~X6p=(p >h|PWL~ku&f?jt̜7 ÒŰ2 wB :#iDeA1|bvY:XKu/LDrS:ԅMvD{A @:?,@i=ګU(I7LK. \3"kv=]v 5/Xe+O WuŪ!d@>*)!-p"8= Hh 4;1HHN-}MGx,;鳺-?E\yШXkHyOTRcUɉ (1fX<-7-pyPқc r)bEu ~4yW+*yA[E:{,dѫl!~tuQ&BM/c% v[q,pipz`Bţ zkR"X_jOp3:Go1x#v\մW\w; 7髳,*)1f覎k;ܗ2Q(N7 qvf~>̤6Z7K܃>SO}rO/>tL.USyqyp<~: 8@3UJVzU ԭ?13R-\|\|\)GIiһ)c0ÆmZ5ZVHPE(h[:c.tH7b1 13{[q <%|nG)?|~pȿwÖl={b#x"uD};ɡ߄snۦ+Pxr_nHq*~paI_c}f(!Ҧp:N`b*\uvQ:;1Hê%DM!I2GnթL"Xz){CŃATR > ]Afí*ESN_C`nVz(U M&V~k=AIO0QeLykʕ@KwX0pSՑ&RoUdլ&U [!tkx1{Q`j1FQ7?-=:_}ka#Bw5cy%FYYũ)\n"nV([oSlE@CH%GNW/Ybl L!!ֈv{r6⨔]=2-bHoTĢvԹ4e+օK *DI/Ұ$Ja35mb[! НY@4 X@^$طrNr P|t>xMhrp*S/zFzGfuĦ^ -؋2XNOTߢ/v(%x3yoT@ >7#tVهs!\=am(J1&uh6AxHLZxNŭ.׸t:웜٧ГvUvll%`-#(:e [$0(i <yR7U)b\L4Db]Rol&Y,^rZueVz?o?HR-.__:D` K=.Q7*`2m{SQ m~1-}ZuB%vLMghs8+=&%PkpGE8TsHL?*\2jf䪵3Z(>ϖUfOs5]t{_  Ggv&q[L]btb6J\G#.~dTWI1 yߣ"T#mb4"\pv}tv8k@c؎4Ԝ4ܪWk|րveO\B,I\޼\V4OiAֺ$e苍-d5`ƭ(>NC"潸43HN E m %*0Qi|G]񵌺]CE݂~Κz\ t)xIHϘG,jF,:_мiY3jxq;0z݈HP}NrzߘFM̑Fwu1*BT:[.&vAP~kۺbY}}h;kbJw8C\_]tNDD(S;MjUZ^k P' Y(ݡf|cu >~.LjNJeP|0L/A,rwX($*x=QԂVv xUshlG#)2j3|95ɥmr "sKY~~ŷS>j#"߻Ϩ]Aؕ3IkΨ,]>IopMk2`4&j*/+RdXR-ERaZezU5yHن"b3 3ZjeHܯ]Z| +nLOp5vWAuHH6__#XN?OQ<ݖ6\64<*D]^|^o_vez2<߾W e?^\PA(I5UVsb~VM EH|JVۗ_|}eRK9a~Jl -E"chPj*H26Ym((ajԫVQxX5e%i.56կ&ԮvOk‘wC1r __O48k-KKx"'.#͞y^i+6n\-^OTZB ȥ.<>};ȗpZ RGPGAIDfWCW8PPs}:KKB\c(#]O}$A Tpf%Ig}ATC9"j*byGWv'v#v~b1ri?/"e.^)t*MwmDj|>|XWhC<Ծ,6;=O f’FI!N]l.H ];#wP8u (\_<,vjN8J 2*QB:os]k%e@8% U胗X_ &䯮'.ImPձcvd'Z.Ss*hdBsi$u\Ȩq=gD#ݤ.ՈPk(nWtWz{լWK~Y?G/oη/ۿ%IG\ˇzXhꢷ݂ɽDYTjqu{t#\ ֈ$@ʽ%Bp>f}m8d;>=/kD߻([J :Iѣn\Oӝs(?$btsj[ SM97>,ViCw ʤWpyfbm*an/BwWujp?ȎG 9^Pc(;ߜK;wA5G~>,i`ۭ^rZaY|H% 7EUMa,X^Ь#f:!EH|V o0q6֠=4 hV+#X|k|L&m#{D>cE^8dvnǾB|pz<3n5G.S xW^a/S⇬وZ(p0_O1m)ō4Qg-SbJwxTWe.F<8-~=hrE_fS,Oi%K8Nd1qV<-թ׫W.kvg~y9q L|F]3WBJoXJ6m; J$'`T ӞwycNpRvIϓ[t-P lT 탰xO=8j=µ _Qߴ! \^ CA(y|!㏳ jґ=W ?"/;!T <8N׺H C!vU(ks?#ߏ؁+m N[ʑ4|O *>v8"ܭ;- $/G0tħ5c'0H_ZX+AG5Mcq!/pU,7]""mOSPFOl[}G;NC[t? cWCU^$جRh| ƿ闆'u\*Zlx7S e'sn6XPe-iৰy%KESI862}GaZ͚d2!^}wp9SUԿe]ǎc h8_@N F~W-# zʬe{N$Vg5W l6G1F]`)G~lÎils[7/FY/;P Z7x)AEIMtJH|vp c?olrLftK0 Q굡 78v>4p|S ysU@)X|EMq7vJz?O[e>#|U@@ɮAx}}[jP\'L*U_WGvWj y$ƥ4! YGb7Ne>D+PPoYE@4p=a^T tyCZ_B424bcWv?-߂@i?q,üű&GqC{AuAbF?DW ? <l_iعױf}RG0#Cd)&ds% dv{*Fn4u jmU.`H'UG5:8 K%1 K@nY&1M?pt  ,~Sxlx,[])Jn(XrMQ,gg,*իy&79@ˌI$/cC[g~L.`>c&h&m&yS"Z >,f~l'C{9V_jOR|6ooظpq 9Fvtwf'J#%`5s l ;V|d|8M&D'U>΢3:)o iuPV92I? $!YH9o[-h4oN^ZDyϑՉ!^ Hz+BŃ=jXZ[ujFTc$'0o᪸ݴ8Uk+俚0jfGL#G ȍhh9_,`%.[5n2/w6F;6Ҟ ))[ՖΖ w]kv/\a.___O/9)Ŧϊe+ 7Z]āػNlӉԢx+ׂy}3ZCf Xư?1jJxUyRS4"Td&u"qq{ո0Qrl+lE2`ۆMlfJ`TL %:OvR84W-t٨ͤwJP2y?S[qu8d쒘~&q>Oɏd؀ʆ_,oQ$&'N^o~UcN%N7khP+7?wjyןIY{8 5N^~I_}+h +w'ԭ<0XauzǾ 2EoGk}?,D)|oZDӮ҇_a&9'TTjefOPf?9G ](oQVt"eEG:[b؁~*ԘcF Z lP;P?1j2+}vjwoCH=T`_d9U 7Qf9jdF.6GU9:>\ӱVχ3,o6ntHɌrY!y>mL1tIb0 ƥ:#˓P&ojM& .n3&|QQGg{de{,C_LJ9ߚlهPuR4=h8'Y4V@}gހbެ5CErwQٹUhQ%kPwbv%ȕ7PKtR=BK% ZoZR3QYԿ,mTbSr)WjXKèA w|-J x&5Ts'ܸ|DžGEZLjQ~x[?i6nv1*UI;/W| _]2~:VBKbN ܚjaQ-h\&޴5=լSR7mf쁝e%_xLTLDna=HirALbwToS`'YQ{ T.Ž7%.Z@dvJƇ ;BB , 1W[6{*\ԩ 0k'W3U'mAaxwx~6GioƗ-_JxPu|mn hI9.By(OсS5M{5.6& ~7 ѮS>l4e["! Uޅ&L sj#yAM-gśgP>,QRM[ a*2S5ٳ35槔Gu.抋x..(M*aZ-uѧx'و.ZAvouepJ* FKjڝtxGЧ6CsqmE3Ngi<РFb6GL~_-apPhsr^Gټ~Ӆ*5ۻ,bSf;ln&F5.fo*𧋔mr1/?YUWc0k!~mZs @#(#pwQbQYHѥL몑(Ko޾imLux*MxZHtoꂕ&T:H.[SܴR^rA1ΌPaݖ;KΌ&6gԃ\8jͱjͺ?zgm\`#fp]on$bi'_ 'G˵xJߪΓڵuyȌytWn{Qx]Nm®¶$bjG4Ujת.``V6vٍRU/j0_(m&n1@3t#8x"fdrܾtsq(PF*Q>[ Wק!r}[Ԉ:[?K$y?\|d 4=[L/ʲ0SPkɯhqg*S*w .,3jȝO/x񠘽U^*\8m?)9?c.2&}>j^r_%hIw fWV%,Ez|1؎XQ3o o-?$UE+u/gQG MzEMx bu35}%݈!$*sѢTU6}zФ'y$aԪWy/3eEٹ6&cNm\, 'ܧVhaq긴T2YhթAw<$Uk )s˜?@lq'07'pvN`^>TDG68w_o @jт#)z̜l Ϫg  No wn=mXl# xsEvr}N;[쏳[FpQi5r+ۅUd1jF_~` b(MΟs8#'uZ wKq ڕ0n}"{c10ǣ~j1~ۭ]425z%Zp|с~/Gkpy^:CW5j~0ay0ruO/j"zK,/:g)#h*F5=4/\yFw8_Ga_̊ aPkln+ՔWʔWIu6KPI'mQxA.iՒCwtwS{tq@@S&0nˇ;c7~p][x uOS7]'ݤ$ڟD#;Wo ̯D~brr-4\t4Ky^*,)BfxӑU =&$ =+/]'K{]y|:2/z;g]t7/wm$p@t NH4' t݌VO1#)#r_7DWǫ7:@տ Z20dw}mq0*YhHUmTSOd?7N9(ZQQ54y&{$ tcǞ‘ Ze.vrc]1Pg"f9l_t>R#爫g(m qUcv=5\[.$a/. q6_'! wi9;cۗ7X2cOʻ;Qų=YW 8{>g+Jv{zkB xZ 26y0 1&@Swƍj9 _~z:AP/|la>rWͿ0} M3XnHn< nLZfY_gzUyߧ %xQxlX35pk>lV:fſNQ45i?+~ZkՆjthuُވ48lχ ;[*%4I TA/( :!%$Zq( s4/ƩefLmrLlBqLhPBF |dG>rF>|< x EɱlІqXPK!: Lmedia/js/jquery.jsUT &lJclJux [mF޽1H8 Nre9D$11ߪ4w83R^>r 8)k;'݆1$c|u8sP;Z%7rZgkqc>_>U?6 U\C?k2s:QO9#][z`]2in]8bfvMu:mK 9ؚ+Z\q$Fc;?Y`ԯ3ϲaސZϰal. Z uw>4\DwXpuPn:<` yNlc<)J]LX36$AA}#+L<)aC^68WO4-f]ƒ|^<@mO {rkGP.A4[CI5V3=MEdM)JZKӑar<4 b90]4> />tȠEHA *5w_$҆^zi5 `4\o ,1hhpB})~I2iwAX{"`#erʦud76 sV|+ hl{.o5iGrOӸ } uN6#@^f,Ӑ6y+IuyםysgV$u^-2Α~G lzB# 5fS+[&]\`[MUղ "ͨ׏~.SPqMKbN5O!Dv#^^i+`L@]?X!(Ra-P~Э٦iZke$D+c-nK=}* •@SiddP i NǷ]IMdPrL1VNh/z'\lzN j NADο\n;7ÊkKF02 i:6`$cjeߗ}oCxxCN4>8k6LXߛLE]#?(0ЪK2ѮSu;3Y8Np̥Y!PfYL=1(N2ғvP60ɬ.00wa-\*գЋ!3GtlW ' 9>„aHUyYxֽñI~N2/J(jȾ78PsUVftG&,caݡ38irp%9ؔpZiM}q|1Spǡ]tQCv˭)$La`8냊׷%wٱ)h V 8dgbwR k7,o4鷩<$F^ €`L<7;sP GQ$ʶJ^yM"ăڜ8`n͝xl6H5K`!R=prR3 9ߍ}EG K侁`@N1' G` ۡB%p33!otv8/0-aۥ#I([ l ї;47D߃[96n6h6}2$b:`]sc06.TxuJvE.Z>^ݯP%usj*;㜀qw/cDt'm TU<a}WFs=@/†`<՗^{OJzEQ3*z[kFHV20=׋yQzi{Q|$bȼ5'σ#J6At>Ut92shc6αvu&1_SxɲM7%T=̯F);-2 w] sCߵt4t}; þܕ%%um_e ˳xIiO|w65~tX,D7 !h9B/w߹h><¢,c߱dJ kA"d[ؕllpjssPhr XiV>\q3G<$s1E3 P(޾ZD*QW%!݁F1uR֏F3iB|#j6dлawƾ2`nt08}nu8Ø &)9Q 7Heg>bbe_hCLj+4,5`탻{<.&0whJhW~H<:n?ю'*N' d\e8cBs ?k,fY)V0 /ñ@5!SPtyd]1qxM&~6j-aZvN)ۉ 9L\ԙ*g.֍~/q. ,> *۫ ~JπoyT}s6jtL0Q$ 𐬂/8, Հ"-ߜɪW,)l~_~MLzddpw]a9q9e1-R9m$^fTbQ)KNT}F:pOV[@Z)Q>25X'Ym=҈ڑ;.-r6Z>?SV@ zg4aފH A^Z\NȅqJ'zy;cp9pl44 wdicwO_wm-CA1n{*,5ܞİ/Uѓ1 -  ^7h3:xk={p9j DBBZw+C0_{ f2i0*%5FgwL" 5CAҿ#3ofSx 6y.'es9{u]n3#" JrBۘM(hUeм(?ttz0BXoȢ(e{>3Gy7JE:`eW;YcvEwƟt;%x]j1 UM=k[cip gWs5o0|)wePS29*V-/ؽ`}33C!eo&;C9 _x9O:vrLY 9?1)N{viY]5oZ07_qh0aU*ZI-)?} w;J}e?iNx&5\gf/׾ O 7ŋa!ŊDWCܑ%1)QF!&T9gy_Ƶ5t+znSͮŶB8H"R(D mRW1?ER(\Ap&*g+TBimX,Vh ·XS*ꐼYggTgsRo6v{3RvӋUL 5|H#IU Ceخ$R.WPF`\t7Xo 1r_()+uqbha|'aEDEx0j3ݲi%FI_nJeX1ܡ$.]PS5c7/ݍXu#bWTȊ{n.}#<@%\xbЀUoJa55QNaS9)0,Lv}\Ȩg (&p|˦2 L[UfX)gXD*x|`Qj,,vGm_SHT%T}[b7dΘޓfQtMSi$_n&qag+f9@܎ 5.?DB;8\B'T@ԷȦێO gŋ`>^ `yp1?ygV0puqQ›⿅1^x!4u۵ (EG" e^w\nb,y23}gʝ^2/kja:ӫ B,ƒ˹#5؂%숏~'"h(tL}"ENuWbeCr:zΎ|7qL.k-N-yjoT~\9x+O[·pYNk~ci_0  x.yޮV} Ħ<]&{xlx&w2%uKSdCfEi*yV+jůN}m2}XJjV~G9U++_dn4h!J X%#J҇ބd\ @^C^yS5=B{k$ { DR[i0@0ө5፬Uɝ.y?m4y`R6S>W_! zP-: ~;㝦#5/AHz5{H=KpM.%Yl-=pźHS]t k_sqEBK?4]v.,Ɣ b ΕCG]>l:/tI۲=)O/՜BtbU`q];1M`ͩjBLG+ΙP"s 8D^ntͰzpL: z1&ځ4 f;; S[K/#Tk)(DXҤtBnx#Mrc;JNb&QQm#7 )@9eZK:kw ?ۺ7p|Tc|U޻xj xw4ܿ(}+#hb#b/&',t%0C%/N+1=S _BeW+ғ`缚.^8k4aB>=ܮv[ &#VSOZGb4+A)ǒyXMeiH +3tG‡j V츹9ZI_(T1ֿ8J¥G8/4_#HA1Y[-ZG#:9N/ R@+tW)@_$wh$Ͽn#AwcF 31m߫QgRE>"\x/gj%!sRI/+ R"p8XNPbAh_ a_ sf#fF'O_!n˝cpH;_$4wLW+Z'A?2PBOj⫝̸,`05zso5ʅ #=+ 1в~Fu~RNJevNx'/f]2ˋv;_VW}//Lr_켓/Mn'38R`dݼX<~$1z@߼eB[[tr,\S[/-Z, RTdjl?m%" 綁fdm4:a!nylBn&΂D7h[&oED J.|ŠC$~OWڃ"](E n%D"舞t;3c2zL38|2bnA{tˁ*\*rm` w0R$HED Q.+[pknY5%Ja'sZ"H\uT`U;}䭊~5NӻTD;C3]e0?|jtV=~E7f#꫊ YL@TGj cL{/'xV~Ima3`XE vŹ9C'H$.5ۇVf.ܰ3Mli-MRiY{w\2[f&-kxCH4ւ7[Q3Msz]G]XvJn'v5< ҅0vi#Wh.+(ūd\LZI@X-qGZ@Y?yxտeukF%?x8I#Uk\x tkYK/Qdܷjb;pŽѭOI4))ls6JXNoآ׎`+ tծ7> w>R0{mN**):G7q1j#|l}b-D=rp;#亼'X7^`.d 1e3*>7hKFD"޶6u~yS>zYwhMCwIPnsGəuxFc$59.66+\63P$Qqyfr_-|V,ɍG(t+`q@}icڏ~GEtT\. =)i>TPQ4LSN77bJ'*ZqLFIMf&1nb|'JR'L?-߁;9xT0=-Cq-R|Zq[CM&  ,l#CVbQZYUU)Krq$ebck*F!nh;9`fvY!I4`nZĩ@Z5gx9'麖RVwkNDf},a [s:-3Qخb@t}j:[UEg3sfK`MKl׈6'=`6~^X܉wJ*ɍdNZXmV ?uw? dƎ&Le@oYyoiT%.`2 {M4[**+SFڅ=rc:Akxa7-|9 ;; m`/'2F/&wqupL8^\S19vqamqB!&=FkV&) _piӴ`'Rxa\$0;uG;ȓޑXq=3i{ŏ[v *g>P}p 1ishıt? U!CVh'G#d,xkmc0]S#ps,rkvE[fh&'/ǥ]qɫO@Ef2g.\a" 9ሲT(唰F_m;tS*v4 JU+~eJsp;4C`^⹨;м4~vAwxY{t5}\ʐe®Ы'7)#A¢P;VyA|y}66I<Qᤓ0hjЫ 7d.=Jv6V[5ۢtW'ZhC:wDs Jm 6wCѪ̜)=l2XrY,sX4㑏Ձm3]?vLNmD[6LNŌ,Wfy7<ȡ(70msF8nQ0m=E$I8XNdqOv ҹ? s)ӥZHdL޶Ն) r'I0q66l/e{DRA|h* GK1. .;2 IllYO WSYNDdZ|Md4Ekh6JdNe0q 8?.cgqu?z_ ,T\*kx<}?xu멭[@9'ҵ Gk7}r#tZ8XN]NjEH_`5_ +/M ̖X\* 媍p)Kkɰ{|uxPS:yo*C+o)۲Uj BΑNSy|J^W+$= 9@Tk;5%;"z r"i>$lVw&yf*EwY<.4|LuۛFOiWIм~ ˁ `d)Iסj\]6/ϵ|P|?q-v)BtWcP !唬DU&h4"WWr<( ,Xl\B "vRmFIRdr 3пH"QtInLZ U*\h.ظVSNDHŨfApn=۸|/)hEQ\#D%Ljqs\`X[Ս˦zHu &]4}ۤ0)_ +[ ȖGLA]7!LϴgsbX8Jr|q Ȼ;~J2etow,h3Rc8G8{OpL?ǶHY@ugW);@́yDM;u;qAtK/tEY->6elAKgBO7[Dh&i>ΰp*lY}ݭ-@Wn*?4ڳչΞ6x/gkS7*N:rdbsQaId[UWFfpkh@Fwl]ݱlN8guh3E^G ص7L D%5Cd Qkl<+g'Hamb1Ш4X:[ 6+Vl}uA39I6]<ZY]XmQ˝l/Wxd_-BM % /YniJ_eH6Y.|k0m D\׳f]cvnѾ:R$ڽ`O y #zf\ rцPÆc!!n] |mbCʁ3!,Kh)lwHLYyHt0i) ~9F~d/]gi"KmAJm쬓Mx,?=ar4}±|ɑV;=9N].OS4+Ҕ5He$ g\./ T(9e_xL!<$cXQ]Ьh~JiOK0]UCp˅$ߪСxptd@YՑ[uX[Ƈ.D;P#kWwY p~c)'啺C9^`g]b^D;vzttҵU\`NõoRu'?scۖV¢3I@fiSf^o ƪL'f.]0*nLHG! k*rޕ* nNJӬTu(y#]N\^xazn0bkd,J!>cb9*QQcl\"= ra{,"nu[Q/oH^,͔+49U*tԽ]"]M~fc:$FNXBe~xbtVQl8p4wnyZc>0sP9$)*%@- ,w'ϔ˲ Ptz„m$)'bW/Þy:ADkU0@e.WMo?mtKY8OV^fbOPk+szΞ9rV般7f+lcsH9->sԭHmcdqgؒʕN2 Re`yyXO*儮时sM6lO0Jҧӗ_.q2ԔSKS}I-b,>d++,KF;LcFK}],Vƻw$_r٘{H4&4([DX҉_ 94< MlO٪ xwd@ *#M{+Gvޤ9F4!JFT j2llT~v<\QUDWM@<#BtgyX:BbV FªިOD0 !n.VCu 8具\:zd իbNlcS<[8c HAX?Ӎr\dI12a@?DBjhA8<6[WU<4y TY1@~oE v9ӷq@s*9"(+G XWčzȕ0Xz%_Ic~)29tt=w]xZPEG ,D6NdFb6^dktR ΂xT,z}WFЂi"^a9PC-TxdN|ThK UW2'L+uHO0K .9sFql|חiզ\9P!_HX+{,}ܭ0W b1`7.`zI݈7*Ј_wJ*ܽNRV8 2go(_Sջd0d 6jݒ[D y?za# o8KF,b>ѹ8JqS@ket[ B]''/ hXHP1 s^2^DykF#kMxb7l*;O].nB=h#3żKJ.{#KFiHD=o4/7<- 3;_3zfZxz*Fiy:>jl|0r?Pq "bW3c |lFꉫi9:`&ڏ$LʟM\aF57C.ڑ`$ vr5kZɂr|GK)޺ ?5YT/jfۊkz;rieё+-<{8ݕ жGl@ ]h%iw* VUvs84{- 7`[^mM5!f#,Wi^6/b~=5ŒV@oeVjggZ-u12H(1UXIoHr@/ϵ.vڀF†!z=}NA=2O\)HmҚn SK}dFhԂXPNRAׯv4jIqLAIV>:tz&5Mi |f (LRd (9Z,L&C)<.'(xUEYrݶ7}=A^!@'fyCJ4d*#d>o?$Qƹ].WЖ* U67 L|UyiN2 l\*_|=_z*,}Pui%a[_*P96[UyP;u O;RTiFB7p {G̮"+")\3d,E_qI2:6(Uh QuhxT@ҏ-Hvy³|V#6A޵g\<]kʞ`j14WO̹]8^jtjD^0>PiK`'Vq"l+"|mlΔIA;eZ@ATƢvjIX}mJ<Vm@aT_W7p-h> 'rܨ  [IC-ǢܭYH[zH: s ;q t*qFםy냇*捛$ xu )t @,P4SCr0Oamx(q# 8F z^hU&n5ʪK!B7,&9"@`T__+Y“)͘An= o 0!ޯa*74LmW 8: R_}@'ポ.좴5佶;fWyVK@ٷm#'K摧Awr]zYlhuFBؼ!H4oӠu\=IGQ8.gzx4V[|rմVIy[iګj1tL.!2zI5kFc`o=:i𾐘 X|Q}m)vJk vl:*lx)1*e%6Y!r|#K*`Pn*={ؖ>[Ii=ByIi0LP-4RJYs"'.sHE8h'F𦦧pSkSs8;ʡOH蔇_7Lń!@}pP:16ӥI0Eewg<ǖ f s왔qX+Sd gb=IAE޲[Ǜ Z[*N6njHfe >*w nY+ Kqql3t*jj/B\W.5o;=zɯ9\Ҳ,%Cڟ}cT€˭O 3kC#WzSG+?hp2m[?J! 9}ZX ̡Υ X֤Z(>M'0\nŃQIit`Ǩ5ۓP79X&U0ifrigdǫS Pλ3a|.jG_ק۴$s%JC1YS*ty"ΊG 5j Jhy?/DKRfj5tZL>tne'r~eH͟ǺB"pc.'٭*3 U*y1pֽTx&D$ *W d6_"y 5WcG> /=;fXJVFb5w7_qOxq0Tsl΍g,]&#z ^ZtnǨÂTP g VLH;{,M.#:JCS̚-`$lT4^_sW;~:=9wa] >~T8 αq `4a:Tze HW)<݌B,~ s !HtA!% WyLOQ4CqzB5^>&ybnOT欔NgF?FoHkRNќĸu T^"%>.._u1 2n@VP6 )A ͏Daț%0p*Щvo?xX[ v缐ߤ$A`bJϚ/Q.x\=-"(~l_$p;y`s "=7*HK3(baaޏg]*T-*[{Rs1 0gjI&ʃsmO'FMQb'Rb $1?e]eUdU|IPl>hc+NzMQ9pLy?n7ћ_QBmVƹ(mWl/)fp)K,(;vبH6os ?Ɠܝ1S,*A+oo@ 3t#V4&((=gl=w'}N'{L nlU1&|iB;^0tIQ۠{De'MbNH[A=+A]&OfMUR/>0&7f 1T7ՕodaA !{Hנ3k$*J[#~tWS ]s6!Iu11^\s8U"Íto+)t4MS7$'^N0 k /@.nF 16;>G a+-)JPcq$;3l8Z`b&Dφح-"icuuB7$DY4KVk\V(ӈ jvLz+?89:vN.*1NG7r8|rȞ }zhXT"}!bF;v}]rJJ:7R}EH?ҼFnRӖs07 Ra?u}MOJgTUFMUwY#do%$(>؏D8т?dW=[ۇ{ ď[/ HIhQߊ@-~y!m'32 q࿙7qÑ ~ ;AE"(OTm_ߡC!Zo_oFEYXd-`YAV}kNZ @[,m M̌K%ߒ^sX_ei%g<&;XZ|'Ӝh@D; GlCwJ?~FF 3ꁔ Xz v4rtd~x?ܴ\+=3?,5s3߇ߺA?MS1?{;}CChQ +S G[7~=nO3-_99֯Ǭ?X?5j ~4j%ܦyX8~m<_>?iO #(_@hf_fQ_>?O5^QR\>VigȿV^Z>fODžu~xa? `1 qF?PK:Asponge/bob/__init__.pycXmozhٲI{a}FEb9iѴ^ :E)Q`(/ CvfKΡrvvvg?k*>?G:)s _+wA߳r 5+ס_r ]8kB8̇l658[l_dgPKM8+(HQXEAlFXw M;`o V*'p)oSG;؆S]x pߥtc縋M$. vyON8iBqdO¼1}l>8+-Ƌ1XǺs5B1J5Q|_~?ʕe7J<ÕEǩ&ˇz_,Y"2Qh2dhY(բ-8Hea zh45a"&Q2i&*q6|kh^; ABB$&X^a+Bx%UTt'*#BᘒLyI<)̔(`iGAAt`hmwѾ̛8\l0ŴX_A9J*nȇ6n˱Q=8l]I#@2YL*jZm |ةPI!è̅. i\bQI5-ItBm@T"; »lKLf J29:C1*>A>8"9:z9b?$3$\8 g{r(!ÇMNh>+h>D>^JgN_ "g7䩸Ȑ@۟ Ohi ~ݺoP} ¥.esG:\KJS!.j+B&a$:%N1 MVnZ(U _g R uqm9%0A@ОW>C/)c u놥 >$ czXL 9K>$c>GQ phRG)n.v:˲c^fG& 9Dͽ 6(U9=+dgOn9¶l3stT Eد[̻8M,ޖ{+&No-gݎfbҺn*}1l:SYpQ f}gB5߼ 7dSS+1=ߡ*/2c>(ܶ >Ʋ._z.m=M$ꩳZ[V]j|>#^0: |g9edPQ9KTPm\ ;;dCn'ݎӽkWɕ%4J= 2y̘jX֯ɜ*g`mWb&Bu&`=|[GyGkOw-Q_wpk j~kZyPK@X:x; 3 sponge/bob/__init__.pyWn*0H-'-[Ɖ1,AĊZR{BKlq̒Hv4`-w3 _n4z!>k(*Rr Ư!6鈶Lʂ67O-,ϒLebytz8;%Ky%yΤU9͙XN|% ZDsF%i~*!f4_ cXr_iѩR.` Ľ|\r2*ᓈ4A_¢r deV(y\ๆ5M4P|fl ZA3|KҙRzB߽2Xp( O,@ H _/az NoGH|kI"/2'ͤtG䘾t1F֟_/fpp5_|^՗`yYDl+ [pS ӠeVlZc.h,lc`i!<T6{-0Ij Ba *c11J턂NKğ0yspp0>x;c7i8`XL2fY.{ /wWNڛ&dMbKܟ뒷frnj] Θ16Ge=Zed¾59Kx)RI9*]=ܵ=Xߏu0p.a.|vta~:"蠚ќnɈE,EwD="2&DG &Fox2T8k!1nC5 @֕٥94rdS3p|||+o\`+=t^êmOH  xųbB+O3S!Q$eCثw-crUܳ&‰;i 4`q74=1Xb8᏶.l4{'4L}<(:\AL'Qn[I5/>=J"3lxY:0ƚcU{xXR~6sa 9؛Bp^l+]I (!᝸zq'wPTr?a/ [Bk.4anҪ:_]'>TjHq5Em2%&l»_"n-ް <:i~Q('aȚ%mh.'Njm_j5U-xo^'!}t2ߍ}Pυ;B޻XfCq[كn73sJQ:- E# EGG-INFO/top_level.txt+.KOPK:GdY)EGG-INFO/PKG-INFOEAN0E>K@*UzLl M&T9GbXr_OD=*V$Sl^Y8?7P [8Q 0(#嘠 9D΅zY `aGyW0D MƲCfqf",y~kMQ/:PK:/rsponge/image.pyPK:rd [sponge/__init__.pycPK.:P1sponge/__init__.pyPK:òsponge/controller.pyPK:yLM sponge/image.pycPK:nlųVsponge/template.pycPK:W6 < :sponge/controller.pycPK{&:@ 0'sponge/template.pyPK:֔ I+sponge/core/__init__.pycPK:0*]6sponge/core/__init__.pyPK:  T>sponge/core/io.pycPK:u/Hsponge/core/io.pyPK:5tOsponge/data/__init__.pycPKj:AxhPsponge/data/__init__.pyPK;.:GbYSsponge/data/project.zipPK:A:sponge/bob/__init__.pycPK@X:x; 3 Csponge/bob/__init__.pyPK:20KEGG-INFO/not-zip-safePK:u-((fKEGG-INFO/entry_points.txtPK:2KEGG-INFO/dependency_links.txtPK: ELEGG-INFO/SOURCES.txtPK:Ӓ> LEGG-INFO/top_level.txtPK:GdY)MEGG-INFO/PKG-INFOPKNsponge-0.3.1/docs/0000755000175000017500000000000011244504477013542 5ustar gabrielgabrielsponge-0.3.1/docs/dependencies.rst0000644000175000017500000000112211244504474016713 0ustar gabrielgabriel.. _dependencies: =================== Sponge Dependencies =================== Infra-structure ============== * CherryPy: `Lightweight HTTP server `_ * Genshi: `XML-based template engine `_ * PyYAML: `YAML implementation `_ For testing =========== * nose: `Test runner and pythonic test helpers `_ * mox: `Powerful mocking tool `_ For contrib =========== * PIL: `Python Imaging Library, needed for Sponge's ImageHandler `_ sponge-0.3.1/docs/conf.py0000644000175000017500000001461311244504474015043 0ustar gabrielgabriel# -*- coding: utf-8 -*- # # Sponge documentation build configuration file, created by # sphinx-quickstart on Sat Jul 4 22:30:30 2009. # # This file is execfile()d with the current directory set to its containing dir. # # Note that not all possible configuration values are present in this # autogenerated file. # # All configuration values have a default; values that are commented out # serve to show the default. import sys, os # If extensions (or modules to document with autodoc) are in another directory, # add these directories to sys.path here. If the directory is relative to the # documentation root, use os.path.abspath to make it absolute, like shown here. #sys.path.append(os.path.abspath('.')) # -- General configuration ----------------------------------------------------- # Add any Sphinx extension module names here, as strings. They can be extensions # coming with Sphinx (named 'sphinx.ext.*') or your custom ones. extensions = ['sphinx.ext.autodoc', 'sphinx.ext.doctest', 'sphinx.ext.intersphinx', 'sphinx.ext.todo', 'sphinx.ext.coverage'] # Add any paths that contain templates here, relative to this directory. templates_path = ['_templates'] # The suffix of source filenames. source_suffix = '.rst' # The encoding of source files. #source_encoding = 'utf-8' # The master toctree document. master_doc = 'index' # General information about the project. project = u'Sponge' copyright = u'2009, Gabriel Falcão' # The version info for the project you're documenting, acts as replacement for # |version| and |release|, also used in various other places throughout the # built documents. # # The short X.Y version. version = '0.1' # The full version, including alpha/beta/rc tags. release = '0.1' # The language for content autogenerated by Sphinx. Refer to documentation # for a list of supported languages. #language = None # There are two options for replacing |today|: either, you set today to some # non-false value, then it is used: #today = '' # Else, today_fmt is used as the format for a strftime call. #today_fmt = '%B %d, %Y' # List of documents that shouldn't be included in the build. #unused_docs = [] # List of directories, relative to source directory, that shouldn't be searched # for source files. exclude_trees = ['_build'] # The reST default role (used for this markup: `text`) to use for all documents. #default_role = None # If true, '()' will be appended to :func: etc. cross-reference text. #add_function_parentheses = True # If true, the current module name will be prepended to all description # unit titles (such as .. function::). #add_module_names = True # If true, sectionauthor and moduleauthor directives will be shown in the # output. They are ignored by default. #show_authors = False # The name of the Pygments (syntax highlighting) style to use. pygments_style = 'sphinx' # A list of ignored prefixes for module index sorting. #modindex_common_prefix = [] # -- Options for HTML output --------------------------------------------------- # The theme to use for HTML and HTML Help pages. Major themes that come with # Sphinx are currently 'default' and 'sphinxdoc'. html_theme = 'default' # Theme options are theme-specific and customize the look and feel of a theme # further. For a list of options available for each theme, see the # documentation. #html_theme_options = {} # Add any paths that contain custom themes here, relative to this directory. #html_theme_path = [] # The name for this set of Sphinx documents. If None, it defaults to # " v documentation". #html_title = None # A shorter title for the navigation bar. Default is the same as html_title. #html_short_title = None # The name of an image file (relative to this directory) to place at the top # of the sidebar. #html_logo = None # The name of an image file (within the static path) to use as favicon of the # docs. This file should be a Windows icon file (.ico) being 16x16 or 32x32 # pixels large. #html_favicon = None # Add any paths that contain custom static files (such as style sheets) here, # relative to this directory. They are copied after the builtin static files, # so a file named "default.css" will overwrite the builtin "default.css". html_static_path = ['_static'] # If not '', a 'Last updated on:' timestamp is inserted at every page bottom, # using the given strftime format. #html_last_updated_fmt = '%b %d, %Y' # If true, SmartyPants will be used to convert quotes and dashes to # typographically correct entities. #html_use_smartypants = True # Custom sidebar templates, maps document names to template names. #html_sidebars = {} # Additional templates that should be rendered to pages, maps page names to # template names. #html_additional_pages = {} # If false, no module index is generated. #html_use_modindex = True # If false, no index is generated. #html_use_index = True # If true, the index is split into individual pages for each letter. #html_split_index = False # If true, links to the reST sources are added to the pages. #html_show_sourcelink = True # If true, an OpenSearch description file will be output, and all pages will # contain a tag referring to it. The value of this option must be the # base URL from which the finished HTML is served. #html_use_opensearch = '' # If nonempty, this is the file name suffix for HTML files (e.g. ".xhtml"). #html_file_suffix = '' # Output file base name for HTML help builder. htmlhelp_basename = 'Spongedoc' # -- Options for LaTeX output -------------------------------------------------- # The paper size ('letter' or 'a4'). #latex_paper_size = 'letter' # The font size ('10pt', '11pt' or '12pt'). #latex_font_size = '10pt' # Grouping the document tree into LaTeX files. List of tuples # (source start file, target name, title, author, documentclass [howto/manual]). latex_documents = [ ('index', 'Sponge.tex', u'Sponge Documentation', u'Gabriel Falcão', 'manual'), ] # The name of an image file (relative to this directory) to place at the top of # the title page. #latex_logo = None # For "manual" documents, if this is true, then toplevel headings are parts, # not chapters. #latex_use_parts = False # Additional stuff for the LaTeX preamble. #latex_preamble = '' # Documents to append as an appendix to all manuals. #latex_appendices = [] # If false, no module index is generated. #latex_use_modindex = True # Example configuration for intersphinx: refer to the Python standard library. intersphinx_mapping = {'http://docs.python.org/': None} sponge-0.3.1/docs/contrib.rst0000644000175000017500000000367711244504474015746 0ustar gabrielgabriel.. _contrib: ============== Sponge contrib ============== Controllers =========== Sponge has contrib controllers, which you can just use inside your own controllers. Image Handler ------------- Sponge has the ``ImageHandler`` class, which is a CherryPy controller that handles dinamically resized and cropped images. It is made through the :ref:`view' ``picture``. Example:: >>> import cherrypy >>> from sponge.contrib.controllers import ImageHandler >>> >>> class MyController: ... exposed = True ... images = ImageHandler() ... def index(self): ... return 'try out going to /images/crop/200x200/logo.jpg' Possible routes ^^^^^^^^^^^^^^^ Considering that: * You have configured the cherrypy.config['image.dir'] to '/home/user/images' * You are using the example above Then * /images/path/to/cat.jpg - would serve the file ``"/home/user/images/path/to/cat.jpg"`` as is. * /images/dog.jpg - would serve the file ``"/home/user/images/dog.jpg"`` as is. * /images/crop/200x200/dog.jpg - would serve the file ``"/home/user/images/dog.jpg"`` cropped and resized to 200 x 200 pixels. * /images/crop/90x80/another/path/image.jpg - would serve the file ``"/home/user/images/another/path/image.jpg"`` cropped and resized to 90 x 80 pixels. Caching ^^^^^^^ ImageHandler support caching of generated images, all you need is to set the cache path on its instantiation, and the path must exist. Example:: >>> import cherrypy >>> from sponge.contrib.controllers import ImageHandler >>> >>> class MyController: ... exposed = True ... images = ImageHandler(cache_at='/srv/images/content') ... def index(self): ... return 'try out going to /images/crop/200x200/logo.jpg' Sponge's ImageHandler will lookup in the given directory if the image exists, then it serves statically directly from disk. If the file is not cached, ImageHandler will generate the image, save on disk and serve.sponge-0.3.1/docs/make.bat0000644000175000017500000000561711244504474015155 0ustar gabrielgabriel@ECHO OFF REM Command file for Sphinx documentation set SPHINXBUILD=sphinx-build set ALLSPHINXOPTS=-d _build/doctrees %SPHINXOPTS% . if NOT "%PAPER%" == "" ( set ALLSPHINXOPTS=-D latex_paper_size=%PAPER% %ALLSPHINXOPTS% ) if "%1" == "" goto help if "%1" == "help" ( :help echo.Please use `make ^` where ^ is one of echo. html to make standalone HTML files echo. dirhtml to make HTML files named index.html in directories echo. pickle to make pickle files echo. json to make JSON files echo. htmlhelp to make HTML files and a HTML help project echo. qthelp to make HTML files and a qthelp project echo. latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter echo. changes to make an overview over all changed/added/deprecated items echo. linkcheck to check all external links for integrity echo. doctest to run all doctests embedded in the documentation if enabled goto end ) if "%1" == "clean" ( for /d %%i in (_build\*) do rmdir /q /s %%i del /q /s _build\* goto end ) if "%1" == "html" ( %SPHINXBUILD% -b html %ALLSPHINXOPTS% _build/html echo. echo.Build finished. The HTML pages are in _build/html. goto end ) if "%1" == "dirhtml" ( %SPHINXBUILD% -b dirhtml %ALLSPHINXOPTS% _build/dirhtml echo. echo.Build finished. The HTML pages are in _build/dirhtml. goto end ) if "%1" == "pickle" ( %SPHINXBUILD% -b pickle %ALLSPHINXOPTS% _build/pickle echo. echo.Build finished; now you can process the pickle files. goto end ) if "%1" == "json" ( %SPHINXBUILD% -b json %ALLSPHINXOPTS% _build/json echo. echo.Build finished; now you can process the JSON files. goto end ) if "%1" == "htmlhelp" ( %SPHINXBUILD% -b htmlhelp %ALLSPHINXOPTS% _build/htmlhelp echo. echo.Build finished; now you can run HTML Help Workshop with the ^ .hhp project file in _build/htmlhelp. goto end ) if "%1" == "qthelp" ( %SPHINXBUILD% -b qthelp %ALLSPHINXOPTS% _build/qthelp echo. echo.Build finished; now you can run "qcollectiongenerator" with the ^ .qhcp project file in _build/qthelp, like this: echo.^> qcollectiongenerator _build\qthelp\Sponge.qhcp echo.To view the help file: echo.^> assistant -collectionFile _build\qthelp\Sponge.ghc goto end ) if "%1" == "latex" ( %SPHINXBUILD% -b latex %ALLSPHINXOPTS% _build/latex echo. echo.Build finished; the LaTeX files are in _build/latex. goto end ) if "%1" == "changes" ( %SPHINXBUILD% -b changes %ALLSPHINXOPTS% _build/changes echo. echo.The overview file is in _build/changes. goto end ) if "%1" == "linkcheck" ( %SPHINXBUILD% -b linkcheck %ALLSPHINXOPTS% _build/linkcheck echo. echo.Link check complete; look for any errors in the above output ^ or in _build/linkcheck/output.txt. goto end ) if "%1" == "doctest" ( %SPHINXBUILD% -b doctest %ALLSPHINXOPTS% _build/doctest echo. echo.Testing of doctests in the sources finished, look at the ^ results in _build/doctest/output.txt. goto end ) :end sponge-0.3.1/docs/template.rst0000644000175000017500000000307211244504474016106 0ustar gabrielgabriel.. _template: ======================= sponge template helpers ======================= Sponge uses `Genshi `_ as template language. To renderize your html files, use the ``render_html(filename, context)`` function:: >>> import cherrypy >>> from sponge.template import render_html >>> >>> class MyController: ... @cherrypy.expose ... def index(self): ... return render_html('index.html', {'variable1': range(10), ... 'variable2': 'Hello World'}) Arguments: * filename: the template file name * context: a dictionary with the variables to send to template Optional Arguments: * template_path: the path containing the given template name, defaults to 'template.dir' at :ref:`configuration`. A minor, but actual issue when building websites with `CherryPy `_ is to build fullpath urls within your templates, it can be done with the ``make_url(url)`` function:: >>> from sponge.template import make_url >>> >>> make_url('/media/css/base.css') 'http://localhost:8080/media/css/base.css' make_url also add slash when is nedded:: >>> from sponge.template import make_url >>> >>> make_url('media/js/jquery.js') 'http://localhost:8080/media/js/jquery.js' The examples above mocks the `CherryPy `_ server, as it would be running on localhost, port 8080, but whenever you run `CherryPy `_, make_url works as expected. Arguments: * url: the url to join with server addresssponge-0.3.1/docs/Makefile0000644000175000017500000000566111244504474015207 0ustar gabrielgabriel# Makefile for Sphinx documentation # # You can set these variables from the command line. SPHINXOPTS = SPHINXBUILD = sphinx-build PAPER = # Internal variables. PAPEROPT_a4 = -D latex_paper_size=a4 PAPEROPT_letter = -D latex_paper_size=letter ALLSPHINXOPTS = -d _build/doctrees $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) . .PHONY: help clean html dirhtml pickle json htmlhelp qthelp latex changes linkcheck doctest help: @echo "Please use \`make ' where is one of" @echo " html to make standalone HTML files" @echo " dirhtml to make HTML files named index.html in directories" @echo " pickle to make pickle files" @echo " json to make JSON files" @echo " htmlhelp to make HTML files and a HTML help project" @echo " qthelp to make HTML files and a qthelp project" @echo " latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter" @echo " changes to make an overview of all changed/added/deprecated items" @echo " linkcheck to check all external links for integrity" @echo " doctest to run all doctests embedded in the documentation (if enabled)" clean: -rm -rf _build/* html: $(SPHINXBUILD) -b html $(ALLSPHINXOPTS) _build/html @echo @echo "Build finished. The HTML pages are in _build/html." dirhtml: $(SPHINXBUILD) -b dirhtml $(ALLSPHINXOPTS) _build/dirhtml @echo @echo "Build finished. The HTML pages are in _build/dirhtml." pickle: $(SPHINXBUILD) -b pickle $(ALLSPHINXOPTS) _build/pickle @echo @echo "Build finished; now you can process the pickle files." json: $(SPHINXBUILD) -b json $(ALLSPHINXOPTS) _build/json @echo @echo "Build finished; now you can process the JSON files." htmlhelp: $(SPHINXBUILD) -b htmlhelp $(ALLSPHINXOPTS) _build/htmlhelp @echo @echo "Build finished; now you can run HTML Help Workshop with the" \ ".hhp project file in _build/htmlhelp." qthelp: $(SPHINXBUILD) -b qthelp $(ALLSPHINXOPTS) _build/qthelp @echo @echo "Build finished; now you can run "qcollectiongenerator" with the" \ ".qhcp project file in _build/qthelp, like this:" @echo "# qcollectiongenerator _build/qthelp/Sponge.qhcp" @echo "To view the help file:" @echo "# assistant -collectionFile _build/qthelp/Sponge.qhc" latex: $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) _build/latex @echo @echo "Build finished; the LaTeX files are in _build/latex." @echo "Run \`make all-pdf' or \`make all-ps' in that directory to" \ "run these through (pdf)latex." changes: $(SPHINXBUILD) -b changes $(ALLSPHINXOPTS) _build/changes @echo @echo "The overview file is in _build/changes." linkcheck: $(SPHINXBUILD) -b linkcheck $(ALLSPHINXOPTS) _build/linkcheck @echo @echo "Link check complete; look for any errors in the above output " \ "or in _build/linkcheck/output.txt." doctest: $(SPHINXBUILD) -b doctest $(ALLSPHINXOPTS) _build/doctest @echo "Testing of doctests in the sources finished, look at the " \ "results in _build/doctest/output.txt." sponge-0.3.1/docs/configuration.rst0000644000175000017500000000762711244504474017154 0ustar gabrielgabriel.. _configuration: ==================== sponge configuration ==================== Sponge's configuration relies in the settings.yml file, which uses `YAML `_ as format. The settings.yml file must be in the path you are running Sponge Bob command line tool. There are a few options to set in settings.yml dictionary to Sponge work properly: run-as ------ Default: ``standalone`` A string that determines in which mode the server will run on. Possible values ::::::::::::::: standalone ^^^^^^^^^^ The server will be running by itself, useful in local development environment. Example:: run-as: standalone wsgi ^^^^ The server will be running as WSGI. Useful for production deployment. Example:: run-as: wsgi full example ============ This is a full example for a Sponge's possible configuration:: run-as: standalone # possible values: standalone, wsgi host: 127.0.0.1 port: 8080 autoreload: true application: path: /home/user/projects/web-app/module template-dir: /home/user/projects/web-app/html image-dir: /home/user/projects/web-app/images classes: SomeController: / databases: media: mysql://root@localhost/webapp_media general: postgres://root:p4ssword@localhost/webapp_general metadata: sqlite:///webapp_metadata.db extra ----- You can also provide extra configuration, so that you can use that extra data from within your application. In order to do that, just provide a key named "extra" on the body of your config file. example ::::::: Simple usage of "extra" configuration:: run-as: standalone host: 127.0.0.1 port: 8080 autoreload: true application: path: /home/user/projects/web-app/module template-dir: /home/user/projects/web-app/html image-dir: /home/user/projects/web-app/images classes: SomeController: / extra: packages-dir: /home/user/packages hardcoded-links: Support: http://my-homepage.com/support Documentation: http://my-homepage.com/docs And to use it within the application:: >>> from cherrypy import config >>> links = config['sponge.extra']['hardcoded-links'] >>> packages_at = config['sponge.extra']['packages-dir'] application ----------- All your application-related configuration relies under the application configuration key Parameters: ::::::::::: path ^^^^ The path to python module or file which contains all the controller classes to be routed. template-dir ^^^^^^^^^^^^ The path in which sponge will look for genshi templates. image-dir ^^^^^^^^^ The path in which sponge will look for, and save images. In a nutshell, `sponge.contrib.controllers.ImageHandler` will use it. classes ^^^^^^^ A key/value pair configuration in which the "key" is the name of the class to load, and the "value" is the base path to mount the controller at. Example:: application: path: /home/user/projects/web-app/controllers.py classes: MainController: / AjaxController: /ajax AdminController: /admin boot ^^^^ Configuration for a "boot" callable. It is specially useful for subscribing `cherrypy's plugins `_. Takes two parameters: `path` and `callable`. Sponge will import the module at path, and call callable. Example: Supposing that you have the following code at `/home/user/project/core.py:: >>> import cherrypy >>> def prepare_my_app(): ... if 'database' not in cherrypy.config: ... print "FATAL: You did not configure the database!" ... raise SystemExit(1) Then, you could configure at your project settings.yml:: application: path: /home/user/projects/web-app/controllers.py classes: MainController: / boot: path: /home/user/project/core.py callable: prepare_my_app So, when you just run `bob go`, the function prepare_my_app() will be called.sponge-0.3.1/docs/helpers.rst0000644000175000017500000001376111244504475015744 0ustar gabrielgabriel.. _helpers: ==================== sponge image helpers ==================== If you want to build a application that handles images, you can use ``jpeg(path)`` function to render them:: >>> import cherrypy >>> from sponge.helpers.image import jpeg >>> >>> class MyController: ... @cherrypy.expose ... def image_jpg(self): ... return jpeg('images/logo.jpg') Arguments: * path: the image relative path to `'image.dir' configuration variable `_. Optional Arguments: * base_path: the path containing the given image path, defaults to 'image.dir' configuration at :ref:`configuration` `CherryPy `_'s config.' Nevertheless just serving a image won't actually make your website doing something dinamic, for instance, you may need to dinamically crop and/or resize a given image, it can be done throught the function ``picture('logo.png', 320, 240)`` >>> import cherrypy >>> from sponge.helpers.image import picture >>> >>> class MyController: ... @cherrypy.expose ... def logo_jpg(self): ... return picture('images/logo.jpg', 120, 90) Arguments: * path: the image relative path to 'image.dir' configuration variable at :ref:`configuration`. * width: the width to resize image to. * height: the height to resize image to. Optional Arguments: * crop: a boolean to set if the image should be cropped to fit. Defaults to ``True``. * center: a boolean to set if the image should be centered when cropped. Defaults to ``True``. * mask: a PIL Image object to use as mask. Defaults to ``None``. * background: a hexadecimal number with RGB color to use as background. Defaults to ``0xffffff``. `` ========================= Sponge pagination helpers ========================= Paginator --------- Sponge took `Django's `_ `paginator `_, but added a few more unit tests to keep our 100% code coverage policy. The classes below are located at `sponge.helpers.pagination`. The :class:`Paginator` class has this constructor: .. class:: Paginator(object_list, per_page, orphans=0, allow_empty_first_page=True) Required arguments ------------------ ``object_list`` A list, tuple or other sliceable object with a ``count()`` or ``__len__()`` method. ``per_page`` The maximum number of items to include on a page, not including orphans (see the ``orphans`` optional argument below). Optional arguments ------------------ ``orphans`` The minimum number of items allowed on the last page, defaults to zero. Use this when you don't want to have a last page with very few items. If the last page would normally have a number of items less than or equal to ``orphans``, then those items will be added to the previous page (which becomes the last page) instead of leaving the items on a page by themselves. For example, with 23 items, ``per_page=10``, and ``orphans=3``, there will be two pages; the first page with 10 items and the second (and last) page with 13 items. ``allow_empty_first_page`` Whether or not the first page is allowed to be empty. If ``False`` and ``object_list`` is empty, then an ``EmptyPage`` error will be raised. Methods ------- .. method:: Paginator.page(number) Returns a :class:`Page` object with the given 1-based index. Raises :exc:`InvalidPage` if the given page number doesn't exist. Attributes ---------- .. attribute:: Paginator.count The total number of objects, across all pages. .. attribute:: Paginator.num_pages The total number of pages. .. attribute:: Paginator.page_range A 1-based range of page numbers, e.g., ``[1, 2, 3, 4]``. ``InvalidPage`` exceptions -------------------------- The ``page()`` method raises ``InvalidPage`` if the requested page is invalid (i.e., not an integer) or contains no objects. Generally, it's enough to trap the ``InvalidPage`` exception, but if you'd like more granularity, you can trap either of the following exceptions: ``PageNotAnInteger`` Raised when ``page()`` is given a value that isn't an integer. ``EmptyPage`` Raised when ``page()`` is given a valid value but no objects exist on that page. Both of the exceptions are subclasses of ``InvalidPage``, so you can handle them both with a simple ``except InvalidPage``. ``Page`` objects ---------------- .. class:: Page(object_list, number, paginator): You usually won't construct :class:`Pages ` by hand -- you'll get them using :meth:`Paginator.page`. Methods ------- .. method:: Page.has_next() Returns ``True`` if there's a next page. .. method:: Page.has_previous() Returns ``True`` if there's a previous page. .. method:: Page.has_other_pages() Returns ``True`` if there's a next *or* previous page. .. method:: Page.next_page_number() Returns the next page number. Note that this is "dumb" and will return the next page number regardless of whether a subsequent page exists. .. method:: Page.previous_page_number() Returns the previous page number. Note that this is "dumb" and will return the previous page number regardless of whether a previous page exists. .. method:: Page.start_index() Returns the 1-based index of the first object on the page, relative to all of the objects in the paginator's list. For example, when paginating a list of 5 objects with 2 objects per page, the second page's :meth:`~Page.start_index` would return ``3``. .. method:: Page.end_index() Returns the 1-based index of the last object on the page, relative to all of the objects in the paginator's list. For example, when paginating a list of 5 objects with 2 objects per page, the second page's :meth:`~Page.end_index` would return ``4``. Attributes ---------- .. attribute:: Page.object_list The list of objects on this page. .. attribute:: Page.number The 1-based page number for this page. .. attribute:: Page.paginator The associated :class:`Paginator` object. sponge-0.3.1/docs/index.rst0000644000175000017500000000173211244504475015404 0ustar gabrielgabriel.. toctree:: :maxdepth: 2 Dependencies Sponge basic setup Sponge template helpers